From fa9b89139f34809b7bf01ca2052fbaa3d1ea64e6 Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期二, 28 七月 2026 10:58:29 +0800
Subject: [PATCH] add pdfjs and traderecord

---
 build/cool/eps.d.ts                                                   |  333 
 public/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap                  |    0 
 public/pdfjs/web/images/pages_selected.svg                            |    7 
 public/pdfjs/web/cmaps/CNS-EUC-V.bcmap                                |    0 
 public/pdfjs/web/locale/hr/viewer.ftl                                 |  723 
 public/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap                       |    0 
 public/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb              |    0 
 public/pdfjs/web/locale/cak/viewer.ftl                                |  264 
 public/pdfjs/web/locale/fr/viewer.ftl                                 |  743 
 public/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap                              |    0 
 public/pdfjs/web/cmaps/HKm471-B5-H.bcmap                              |    0 
 public/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap                            |    0 
 public/pdfjs/web/images/secondaryToolbarButton-lastPage.svg           |    3 
 public/pdfjs/web/locale/mr/viewer.ftl                                 |  210 
 public/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap                             |    0 
 public/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap                           |    0 
 public/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap                              |    0 
 public/pdfjs/web/locale/en-GB/viewer.ftl                              |  747 
 public/pdfjs/web/locale/tr/viewer.ftl                                 |  747 
 public/pdfjs/web/locale/uk/viewer.ftl                                 |  727 
 public/pdfjs/web/locale/sr/viewer.ftl                                 |  755 
 public/pdfjs/web/locale/ur/viewer.ftl                                 |  222 
 public/pdfjs/web/locale/ff/viewer.ftl                                 |  222 
 public/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap                      |    0 
 public/pdfjs/web/locale/af/viewer.ftl                                 |  179 
 public/pdfjs/web/locale/sk/viewer.ftl                                 |  763 
 public/pdfjs/web/cmaps/Adobe-GB1-1.bcmap                              |    0 
 public/pdfjs/web/locale/zh-CN/viewer.ftl                              |  715 
 public/pdfjs/web/locale/mk/viewer.ftl                                 |  747 
 public/pdfjs/web/cmaps/EUC-V.bcmap                                    |    0 
 public/pdfjs/web/images/annotation-pushpin.svg                        |    7 
 public/pdfjs/web/locale/pt-PT/viewer.ftl                              |  747 
 public/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb                  |    0 
 public/pdfjs/web/cmaps/GB-EUC-V.bcmap                                 |    0 
 public/pdfjs/web/cmaps/78-EUC-V.bcmap                                 |    0 
 public/pdfjs/web/debugger.mjs                                         |  841 
 public/pdfjs/web/locale/lij/viewer.ftl                                |  222 
 public/pdfjs/web/standard_fonts/FoxitFixed.pfb                        |    0 
 public/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg      |    3 
 public/pdfjs/web/images/toolbarButton-zoomOut.svg                     |    3 
 public/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap                           |    0 
 public/pdfjs/web/standard_fonts/FoxitSerif.pfb                        |    0 
 public/pdfjs/web/images/toolbarButton-presentationMode.svg            |    3 
 public/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap                             |    0 
 src/modules/report/locales/zh-cn.json                                 |   16 
 public/pdfjs/web/images/messageBar_info.svg                           |    3 
 public/pdfjs/web/images/comment-popup-editButton.svg                  |    5 
 public/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf             |    0 
 src/modules/operation/locales/zh-tw.json                              |   18 
 public/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap                             |    0 
 public/pdfjs/web/locale/nb-NO/viewer.ftl                              |  747 
 public/pdfjs/web/locale/ar/viewer.ftl                                 |  779 
 public/pdfjs/web/locale/br/viewer.ftl                                 |  323 
 public/pdfjs/web/cmaps/GBK-EUC-H.bcmap                                |    0 
 public/pdfjs/web/cmaps/HKgccs-B5-H.bcmap                              |    0 
 public/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap                            |    0 
 public/pdfjs/web/locale/hye/viewer.ftl                                |  242 
 public/pdfjs/web/locale/da/viewer.ftl                                 |  739 
 public/pdfjs/web/locale/ga-IE/viewer.ftl                              |  180 
 public/pdfjs/web/locale/fa/viewer.ftl                                 |  322 
 public/pdfjs/web/locale/km/viewer.ftl                                 |  242 
 public/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap                           |    0 
 public/pdfjs/web/images/loading-icon.gif                              |    0 
 public/pdfjs/web/standard_fonts/FoxitSymbol.pfb                       |    0 
 public/pdfjs/build/pdf.sandbox.mjs.map                                |    1 
 public/pdfjs/web/cmaps/GBT-EUC-H.bcmap                                |    0 
 public/pdfjs/web/cmaps/CNS1-H.bcmap                                   |    0 
 public/pdfjs/web/cmaps/ETenms-B5-H.bcmap                              |    3 
 public/pdfjs/web/locale/et/viewer.ftl                                 |  246 
 public/pdfjs/web/images/toolbarButton-menuArrow.svg                   |    3 
 public/pdfjs/web/locale/ast/viewer.ftl                                |  172 
 public/pdfjs/web/cmaps/GBpc-EUC-H.bcmap                               |    0 
 public/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap                        |    0 
 public/pdfjs/web/images/editor-toolbar-delete.svg                     |    5 
 public/pdfjs/web/locale/it/viewer.ftl                                 |  747 
 public/pdfjs/web/cmaps/GBT-EUC-V.bcmap                                |    0 
 public/pdfjs/web/images/annotation-comment.svg                        |   16 
 public/pdfjs/web/cmaps/ETenms-B5-V.bcmap                              |    0 
 public/pdfjs/web/images/annotation-paragraph.svg                      |   16 
 public/pdfjs/web/images/toolbarButton-pageDown.svg                    |    3 
 public/pdfjs/web/images/toolbarButton-search.svg                      |    3 
 public/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap                              |    0 
 public/pdfjs/web/images/checkmark.svg                                 |    5 
 public/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap                            |    0 
 public/pdfjs/web/images/annotation-help.svg                           |   26 
 public/pdfjs/web/locale/hy-AM/viewer.ftl                              |  637 
 public/pdfjs/web/locale/skr/viewer.ftl                                |  465 
 public/pdfjs/web/locale/si/viewer.ftl                                 |  228 
 public/pdfjs/web/locale/kk/viewer.ftl                                 |  747 
 public/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap                            |    0 
 public/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap                           |    0 
 public/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap                              |    0 
 public/pdfjs/web/images/altText_warning.svg                           |    3 
 public/pdfjs/web/cmaps/Ext-V.bcmap                                    |    0 
 public/pdfjs/web/cmaps/KSC-Johab-V.bcmap                              |    0 
 public/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap                       |    0 
 public/pdfjs/web/locale/ru/viewer.ftl                                 |  755 
 public/pdfjs/web/images/altText_spinner.svg                           |   30 
 public/pdfjs/web/cmaps/CNS1-V.bcmap                                   |    0 
 public/pdfjs/web/locale/zh-TW/viewer.ftl                              |  715 
 src/modules/operation/views/traderecord.vue                           |  334 
 public/pdfjs/web/cmaps/B5pc-H.bcmap                                   |    0 
 public/pdfjs/web/images/toolbarButton-editorStamp.svg                 |    8 
 public/pdfjs/web/cmaps/CNS-EUC-H.bcmap                                |    0 
 public/pdfjs/web/standard_fonts/FoxitSerifBold.pfb                    |    0 
 public/pdfjs/web/locale/son/viewer.ftl                                |  173 
 public/pdfjs/web/cmaps/Katakana.bcmap                                 |    0 
 public/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap                              |    0 
 public/pdfjs/web/cmaps/Adobe-GB1-4.bcmap                              |    0 
 public/pdfjs/web/cmaps/NWP-H.bcmap                                    |    0 
 public/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap                           |    0 
 public/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap                             |    0 
 public/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap                       |    0 
 public/pdfjs/web/images/altText_done.svg                              |    3 
 src/modules/report/views/dailyvehicle.vue                             |  281 
 public/pdfjs/web/locale/kab/viewer.ftl                                |  626 
 public/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap                              |    0 
 public/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap                          |    0 
 public/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap                           |    0 
 public/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap                             |    0 
 public/pdfjs/web/images/toolbarButton-currentOutlineItem.svg          |    3 
 public/pdfjs/web/cmaps/B5-V.bcmap                                     |    0 
 public/pdfjs/web/locale/sat/viewer.ftl                                |  278 
 public/pdfjs/web/images/comment-editButton.svg                        |    8 
 public/pdfjs/web/images/messageBar_closingButton.svg                  |    3 
 public/pdfjs/web/locale/ltg/viewer.ftl                                |  221 
 public/pdfjs/web/locale/eu/viewer.ftl                                 |  751 
 public/pdfjs/web/viewer.mjs.map                                       |    1 
 public/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap                           |    0 
 public/pdfjs/web/wasm/quickjs-eval.wasm                               |    0 
 public/pdfjs/web/locale/bqi/viewer.ftl                                |   67 
 public/pdfjs/web/cmaps/HKscs-B5-V.bcmap                               |    0 
 public/pdfjs/web/images/toolbarButton-zoomIn.svg                      |    3 
 public/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap                           |    0 
 public/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap                              |    0 
 public/pdfjs/web/cmaps/CNS2-V.bcmap                                   |    3 
 public/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb                  |    0 
 public/pdfjs/web/images/toolbarButton-pageUp.svg                      |    3 
 public/pdfjs/web/images/toolbarButton-viewOutline.svg                 |    3 
 public/pdfjs/web/images/toolbarButton-editorInk.svg                   |    4 
 public/pdfjs/web/images/toolbarButton-viewThumbnail.svg               |    3 
 public/pdfjs/web/images/toolbarButton-viewLayers.svg                  |    3 
 public/pdfjs/web/locale/wo/viewer.ftl                                 |  100 
 public/pdfjs/web/images/cursor-editorFreeHighlight.svg                |    6 
 public/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap                           |    0 
 public/pdfjs/web/cmaps/Adobe-GB1-5.bcmap                              |    0 
 public/pdfjs/web/locale/lo/viewer.ftl                                 |  266 
 public/pdfjs/web/images/editor-toolbar-edit.svg                       |    3 
 public/pdfjs/web/cmaps/Roman.bcmap                                    |    0 
 public/pdfjs/web/locale/ko/viewer.ftl                                 |  715 
 public/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap                            |    0 
 public/pdfjs/web/cmaps/78-H.bcmap                                     |    0 
 public/pdfjs/web/locale/ja/viewer.ftl                                 |  715 
 public/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap                  |    0 
 public/pdfjs/web/locale/ka/viewer.ftl                                 |  747 
 public/pdfjs/web/cmaps/HKgccs-B5-V.bcmap                              |    0 
 src/modules/report/locales/en.json                                    |   16 
 public/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap                              |    0 
 public/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap                           |    0 
 public/pdfjs/web/locale/gd/viewer.ftl                                 |  266 
 public/pdfjs/web/locale/rm/viewer.ftl                                 |  639 
 public/pdfjs/web/images/annotation-newparagraph.svg                   |   11 
 public/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg          |    3 
 public/pdfjs/web/locale/gu-IN/viewer.ftl                              |  222 
 public/pdfjs/web/locale/ca/viewer.ftl                                 |  274 
 public/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap                               |    0 
 public/pdfjs/web/locale/szl/viewer.ftl                                |  228 
 public/pdfjs/web/locale/hsb/viewer.ftl                                |  763 
 public/pdfjs/web/cmaps/Adobe-GB1-0.bcmap                              |    0 
 public/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap                         |    0 
 public/pdfjs/web/cmaps/RKSJ-V.bcmap                                   |    0 
 public/pdfjs/web/wasm/qcms_bg.wasm                                    |    0 
 public/pdfjs/web/cmaps/H.bcmap                                        |    0 
 public/pdfjs/web/locale/pt-BR/viewer.ftl                              |  747 
 public/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap                            |    0 
 public/pdfjs/web/images/cursor-editorTextHighlight.svg                |    8 
 public/pdfjs/web/cmaps/KSCms-UHC-V.bcmap                              |    0 
 public/pdfjs/web/standard_fonts/FoxitFixedBold.pfb                    |    0 
 public/pdfjs/web/cmaps/GB-H.bcmap                                     |    4 
 public/pdfjs/web/locale/fy-NL/viewer.ftl                              |  747 
 public/pdfjs/web/cmaps/LICENSE                                        |   36 
 public/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap                             |    0 
 public/pdfjs/web/cmaps/HKdla-B5-H.bcmap                               |    0 
 public/pdfjs/web/locale/an/viewer.ftl                                 |  228 
 public/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap                              |    0 
 public/pdfjs/web/cmaps/KSC-H.bcmap                                    |    0 
 public/pdfjs/web/images/toolbarButton-download.svg                    |    4 
 public/pdfjs/build/pdf.mjs.map                                        |    1 
 public/pdfjs/web/cmaps/ETen-B5-V.bcmap                                |    0 
 public/pdfjs/web/images/secondaryToolbarButton-firstPage.svg          |    3 
 public/pdfjs/web/images/toolbarButton-bookmark.svg                    |    3 
 public/pdfjs/web/locale/sco/viewer.ftl                                |  238 
 public/pdfjs/web/locale/vi/viewer.ftl                                 |  715 
 public/pdfjs/web/images/annotation-paperclip.svg                      |    6 
 public/pdfjs/web/cmaps/78-RKSJ-V.bcmap                                |    0 
 public/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap                         |    0 
 public/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap                             |    0 
 src/modules/operation/locales/zh-cn.json                              |   18 
 public/pdfjs/web/images/toolbarButton-editorHighlight.svg             |    6 
 public/pdfjs/web/cmaps/78-EUC-H.bcmap                                 |    0 
 public/pdfjs/web/cmaps/Adobe-GB1-3.bcmap                              |    0 
 public/pdfjs/web/locale/my/viewer.ftl                                 |  173 
 public/pdfjs/web/images/altText_add.svg                               |    3 
 public/pdfjs/web/images/comment-actionsButton.svg                     |    3 
 public/pdfjs/web/locale/fi/viewer.ftl                                 |  747 
 public/pdfjs/web/locale/lv/viewer.ftl                                 |  222 
 public/pdfjs/web/cmaps/GBK2K-V.bcmap                                  |    0 
 public/pdfjs/web/locale/es-MX/viewer.ftl                              |  747 
 public/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap                             |    0 
 public/pdfjs/web/images/toolbarButton-editorSignature.svg             |    6 
 public/pdfjs/web/locale/tg/viewer.ftl                                 |  741 
 public/pdfjs/web/locale/fur/viewer.ftl                                |  648 
 public/pdfjs/web/cmaps/Adobe-GB1-2.bcmap                              |    0 
 public/pdfjs/web/cmaps/WP-Symbol.bcmap                                |    0 
 public/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap                             |    0 
 public/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc                     |    0 
 public/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap                             |    0 
 public/pdfjs/build/pdf.worker.mjs.map                                 |    1 
 public/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf            |    0 
 public/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap                           |    0 
 public/pdfjs/web/locale/el/viewer.ftl                                 |  747 
 public/pdfjs/web/cmaps/78-V.bcmap                                     |    0 
 public/pdfjs/web/cmaps/B5-H.bcmap                                     |    0 
 public/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap                            |    0 
 public/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap                            |    0 
 public/pdfjs/web/cmaps/ETHK-B5-H.bcmap                                |    0 
 public/pdfjs/web/images/findbarButton-previous.svg                    |    3 
 public/pdfjs/web/locale/nl/viewer.ftl                                 |  747 
 public/pdfjs/web/locale/ml/viewer.ftl                                 |  509 
 public/pdfjs/web/locale/pl/viewer.ftl                                 |  754 
 public/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap                             |    0 
 public/pdfjs/web/locale/gl/viewer.ftl                                 |  591 
 src/modules/report/locales/zh-tw.json                                 |   16 
 public/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap                             |    0 
 public/pdfjs/web/images/annotation-check.svg                          |   11 
 public/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg         |    3 
 public/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap                            |    0 
 public/pdfjs/web/wasm/jbig2_nowasm_fallback.js                        |   15 
 public/pdfjs/web/compressed.tracemonkey-pldi-09.pdf                   |    0 
 public/pdfjs/web/locale/he/viewer.ftl                                 |  747 
 public/pdfjs/web/cmaps/KSC-EUC-V.bcmap                                |    0 
 public/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap                         |    0 
 public/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap                           |    0 
 public/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap                           |    0 
 public/pdfjs/web/cmaps/Ext-H.bcmap                                    |    0 
 public/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap                             |    0 
 public/pdfjs/web/locale/sq/viewer.ftl                                 |  735 
 public/pdfjs/web/locale/de/viewer.ftl                                 |  747 
 public/pdfjs/web/locale/bs/viewer.ftl                                 |  588 
 public/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap                             |    0 
 public/pdfjs/web/locale/cs/viewer.ftl                                 |  763 
 public/pdfjs/web/locale/tl/viewer.ftl                                 |  228 
 public/pdfjs/web/wasm/LICENSE_OPENJPEG                                |   39 
 public/pdfjs/web/images/findbarButton-next.svg                        |    3 
 public/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap                            |    0 
 public/pdfjs/web/locale/be/viewer.ftl                                 |  755 
 public/pdfjs/web/cmaps/Add-H.bcmap                                    |    0 
 public/pdfjs/web/wasm/openjpeg.wasm                                   |    0 
 public/pdfjs/web/locale/sl/viewer.ftl                                 |  763 
 public/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap                           |    0 
 public/pdfjs/web/images/messageBar_warning.svg                        |    3 
 public/pdfjs/web/cmaps/GBT-V.bcmap                                    |    0 
 public/pdfjs/web/locale/brx/viewer.ftl                                |  189 
 public/pdfjs/web/cmaps/Add-RKSJ-H.bcmap                               |    0 
 public/pdfjs/web/images/annotation-key.svg                            |   11 
 public/pdfjs/web/images/toolbarButton-viewAttachments.svg             |    3 
 public/pdfjs/web/cmaps/NWP-V.bcmap                                    |    0 
 src/plugins/excel/components/import-btn.vue                           |   92 
 public/pdfjs/web/images/treeitem-expanded.svg                         |    1 
 public/pdfjs/web/cmaps/Hiragana.bcmap                                 |    0 
 public/pdfjs/web/cmaps/GBKp-EUC-H.bcmap                               |    0 
 public/pdfjs/web/cmaps/GBKp-EUC-V.bcmap                               |    0 
 public/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg     |    3 
 public/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap                      |    0 
 public/pdfjs/web/wasm/jbig2.wasm                                      |    0 
 public/pdfjs/web/cmaps/GBpc-EUC-V.bcmap                               |    0 
 public/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap                        |    0 
 public/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap                         |    0 
 public/pdfjs/web/cmaps/HKdlb-B5-H.bcmap                               |    0 
 public/pdfjs/web/cmaps/B5pc-V.bcmap                                   |    0 
 public/pdfjs/build/pdf.worker.mjs                                     | 64390 +++++++++++++++++++++
 public/pdfjs/web/cmaps/GBT-H.bcmap                                    |    0 
 public/pdfjs/web/images/loading.svg                                   |    1 
 public/pdfjs/web/locale/bn/viewer.ftl                                 |  218 
 public/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap                           |    0 
 public/pdfjs/web/cmaps/Hankaku.bcmap                                  |    0 
 public/pdfjs/web/standard_fonts/FoxitDingbats.pfb                     |    0 
 public/pdfjs/web/wasm/LICENSE_QCMS                                    |   21 
 public/pdfjs/web/standard_fonts/LICENSE_LIBERATION                    |  102 
 public/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap                            |    0 
 public/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap                      |    0 
 public/pdfjs/web/cmaps/HKm314-B5-H.bcmap                              |    0 
 public/pdfjs/web/locale/en-CA/viewer.ftl                              |  747 
 public/pdfjs/web/images/annotation-insert.svg                         |   10 
 public/pdfjs/web/images/pages_closeButton.svg                         |    3 
 public/pdfjs/web/locale/sc/viewer.ftl                                 |  342 
 public/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap                       |    0 
 public/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap                           |    0 
 public/pdfjs/web/locale/pa-IN/viewer.ftl                              |  747 
 public/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg         |    3 
 public/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap                        |    0 
 public/pdfjs/web/images/toolbarButton-editorFreeText.svg              |    5 
 public/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2                             |   13 
 public/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap                           |    0 
 public/pdfjs/web/cmaps/KSC-EUC-H.bcmap                                |    0 
 public/pdfjs/web/cmaps/HKm314-B5-V.bcmap                              |    0 
 public/pdfjs/web/images/secondaryToolbarButton-selectTool.svg         |    3 
 public/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG                          |   22 
 public/pdfjs/web/locale/es-CL/viewer.ftl                              |  747 
 public/pdfjs/web/cmaps/ETHK-B5-V.bcmap                                |    0 
 public/pdfjs/web/images/annotation-noicon.svg                         |    7 
 public/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap                           |    0 
 public/pdfjs/web/cmaps/KSC-Johab-H.bcmap                              |    0 
 public/pdfjs/web/wasm/openjpeg_nowasm_fallback.js                     |   17 
 public/pdfjs/web/cmaps/HKdlb-B5-V.bcmap                               |    0 
 public/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf               |    0 
 public/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap                           |    0 
 public/pdfjs/web/locale/az/viewer.ftl                                 |  228 
 public/pdfjs/web/locale/hu/viewer.ftl                                 |  747 
 public/pdfjs/web/images/cursor-editorFreeText.svg                     |    3 
 public/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap                            |    0 
 public/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg   |    3 
 public/pdfjs/web/cmaps/EUC-H.bcmap                                    |    0 
 public/pdfjs/web/images/treeitem-collapsed.svg                        |    1 
 public/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap                             |    0 
 public/pdfjs/web/cmaps/HKm471-B5-V.bcmap                              |    0 
 public/pdfjs/web/images/altText_disclaimer.svg                        |    3 
 public/pdfjs/web/locale/bo/viewer.ftl                                 |  222 
 public/pdfjs/web/wasm/LICENSE_PDFJS_QCMS                              |   22 
 public/pdfjs/web/locale/scn/viewer.ftl                                |   32 
 public/pdfjs/web/viewer.mjs                                           | 20751 ++++++
 public/pdfjs/web/locale/eo/viewer.ftl                                 |  747 
 public/pdfjs/web/locale/es-AR/viewer.ftl                              |  747 
 public/pdfjs/web/locale/th/viewer.ftl                                 |  715 
 public/pdfjs/web/standard_fonts/LICENSE_FOXIT                         |   27 
 public/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap                           |    0 
 public/pdfjs/web/locale/trs/viewer.ftl                                |  163 
 public/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg           |    3 
 public/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg |    3 
 public/pdfjs/web/locale/xh/viewer.ftl                                 |  179 
 src/plugins/upload/components/upload-item/viewer.vue                  |   37 
 public/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap                            |    0 
 public/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap                            |    0 
 public/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap                             |    0 
 public/pdfjs/web/locale/oc/viewer.ftl                                 |  396 
 public/pdfjs/web/cmaps/Add-RKSJ-V.bcmap                               |    0 
 public/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap                        |    0 
 public/pdfjs/web/locale/gn/viewer.ftl                                 |  746 
 public/pdfjs/web/locale/uz/viewer.ftl                                 |  154 
 public/pdfjs/build/pdf.mjs                                            | 27924 +++++++++
 public/pdfjs/web/locale/ckb/viewer.ftl                                |  213 
 public/pdfjs/web/locale/kn/viewer.ftl                                 |  180 
 public/pdfjs/build/pdf.sandbox.mjs                                    |  222 
 public/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap                             |    0 
 public/pdfjs/web/images/annotation-note.svg                           |   42 
 build/cool/eps.json                                                   |    2 
 public/pdfjs/web/locale/ro/viewer.ftl                                 |  754 
 public/pdfjs/web/locale/hi-IN/viewer.ftl                              |  221 
 public/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap                            |    0 
 src/modules/operation/locales/en.json                                 |   18 
 public/pdfjs/web/locale/es-ES/viewer.ftl                              |  747 
 public/pdfjs/web/locale/locale.json                                   |    1 
 public/pdfjs/web/locale/ia/viewer.ftl                                 |  747 
 public/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap                               |    0 
 public/pdfjs/web/viewer.css                                           | 7827 ++
 public/pdfjs/web/locale/dsb/viewer.ftl                                |  763 
 public/pdfjs/web/locale/meh/viewer.ftl                                |   48 
 public/pdfjs/web/locale/nn-NO/viewer.ftl                              |  747 
 public/pdfjs/web/locale/id/viewer.ftl                                 |  589 
 public/pdfjs/web/cmaps/KSC-V.bcmap                                    |    0 
 public/pdfjs/web/wasm/LICENSE_JBIG2                                   |  196 
 public/pdfjs/web/cmaps/ETen-B5-H.bcmap                                |    0 
 public/pdfjs/web/locale/ach/viewer.ftl                                |  200 
 public/pdfjs/web/images/pages_viewButton.svg                          |    3 
 public/pdfjs/web/cmaps/KSCms-UHC-H.bcmap                              |    0 
 public/pdfjs/web/locale/ne-NP/viewer.ftl                              |  201 
 public/pdfjs/web/images/pages_viewArrow.svg                           |    3 
 public/pdfjs/web/cmaps/GBK-EUC-V.bcmap                                |    0 
 public/pdfjs/web/locale/is/viewer.ftl                                 |  572 
 public/pdfjs/web/locale/ta/viewer.ftl                                 |  198 
 public/pdfjs/web/iccs/LICENSE                                         |  116 
 public/pdfjs/web/cmaps/GB-V.bcmap                                     |    0 
 public/pdfjs/web/images/gv-toolbarButton-download.svg                 |    3 
 public/pdfjs/web/locale/sv-SE/viewer.ftl                              |  747 
 public/pdfjs/web/images/secondaryToolbarButton-handTool.svg           |    3 
 public/pdfjs/web/locale/en-US/viewer.ftl                              |  787 
 public/pdfjs/web/cmaps/RKSJ-H.bcmap                                   |    0 
 public/pdfjs/web/cmaps/V.bcmap                                        |    0 
 public/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg         |    3 
 public/pdfjs/web/cmaps/Add-V.bcmap                                    |    0 
 public/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg          |    3 
 public/pdfjs/web/locale/bg/viewer.ftl                                 |  392 
 public/pdfjs/web/locale/lt/viewer.ftl                                 |  242 
 public/pdfjs/web/locale/ms/viewer.ftl                                 |  222 
 public/pdfjs/web/cmaps/78-RKSJ-H.bcmap                                |    0 
 public/pdfjs/web/locale/cy/viewer.ftl                                 |  779 
 public/pdfjs/web/debugger.css                                         |  145 
 public/pdfjs/web/images/toolbarButton-openFile.svg                    |    3 
 public/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap                           |    0 
 public/pdfjs/web/images/cursor-editorInk.svg                          |    4 
 public/pdfjs/web/cmaps/GB-EUC-H.bcmap                                 |    0 
 public/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap                              |    0 
 public/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf         |    0 
 public/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg          |    3 
 public/pdfjs/web/viewer.html                                          | 1213 
 public/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg      |    3 
 public/pdfjs/web/cmaps/CNS2-H.bcmap                                   |    0 
 public/pdfjs/web/cmaps/HKscs-B5-H.bcmap                               |    0 
 public/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap                            |    0 
 public/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb              |    0 
 public/pdfjs/web/cmaps/GBK2K-H.bcmap                                  |    0 
 public/pdfjs/web/images/toolbarButton-print.svg                       |    3 
 public/pdfjs/web/cmaps/HKdla-B5-V.bcmap                               |    0 
 public/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap                              |    0 
 public/pdfjs/web/locale/te/viewer.ftl                                 |  213 
 public/pdfjs/web/wasm/quickjs-eval.js                                 |   16 
 public/pdfjs/web/images/comment-closeButton.svg                       |    3 
 417 files changed, 181,797 insertions(+), 100 deletions(-)

diff --git a/build/cool/eps.d.ts b/build/cool/eps.d.ts
index 515ac13..842e5d7 100644
--- a/build/cool/eps.d.ts
+++ b/build/cool/eps.d.ts
@@ -1071,6 +1071,98 @@
 		[key: string]: any;
 	}
 
+	interface OperationTradeRecordEntity {
+		/**
+		 * ID
+		 */
+		id?: number;
+
+		/**
+		 * 浜ゆ槗鏃堕棿
+		 */
+		transactionTime?: Date;
+
+		/**
+		 * 浜ゆ槗绫诲瀷
+		 */
+		transactionType?: string;
+
+		/**
+		 * 浜ゆ槗瀵规柟
+		 */
+		opponent?: string;
+
+		/**
+		 * 鍟嗗搧鍚嶇О
+		 */
+		goodsName?: string;
+
+		/**
+		 * 鏀舵敮绫诲瀷
+		 */
+		incomeType?: string;
+
+		/**
+		 * 閲戦
+		 */
+		amount?: number;
+
+		/**
+		 * 鏀粯鏂瑰紡
+		 */
+		payMethod?: string;
+
+		/**
+		 * 褰撳墠鐘舵��
+		 */
+		status?: string;
+
+		/**
+		 * 浜ゆ槗鍗曞彿
+		 */
+		transactionNo?: string;
+
+		/**
+		 * 鍟嗘埛鍗曞彿
+		 */
+		merchantNo?: string;
+
+		/**
+		 * 澶囨敞
+		 */
+		remark?: string;
+
+		/**
+		 * 鎵�灞為儴闂�
+		 */
+		departmentId?: number;
+
+		/**
+		 * 鍘熷鏂囦欢璺緞
+		 */
+		filepath?: string;
+
+		/**
+		 * 鍒涘缓鏃堕棿
+		 */
+		createTime?: string;
+
+		/**
+		 * 鏇存柊鏃堕棿
+		 */
+		updateTime?: string;
+
+		/**
+		 * 閮ㄩ棬鍚嶇О
+		 */
+		departmentName?: string;
+
+		/**
+		 * 浠绘剰閿��
+		 */
+		[key: string]: any;
+	}
+
 	interface OperationWastesaleEntity {
 		/**
 		 * ID
@@ -2385,6 +2477,108 @@
 		[key: string]: any;
 	}
 
+	interface ReportDailyVehicleEntity {
+		/**
+		 * ID
+		 */
+		id?: number;
+
+		/**
+		 * 鏃ユ湡
+		 */
+		date?: Date;
+
+		/**
+		 * 杞︾墝鍙�
+		 */
+		vehicleNo?: string;
+
+		/**
+		 * 鎵�灞為儴闂�/瀛︽牎/鍚庡嫟缁処D
+		 */
+		departmentId?: number;
+
+		/**
+		 * 褰撴棩琛岄┒閲岀▼(km)
+		 */
+		totalKm?: number;
+
+		/**
+		 * 鏈惎鍔ㄦ椂闂�(鍒嗛挓)
+		 */
+		minutesOffline?: number;
+
+		/**
+		 * 绾椹舵椂闀�(鍒嗛挓)
+		 */
+		minutesMoving?: number;
+
+		/**
+		 * 鍋滆溅鏃堕暱(鍒嗛挓)
+		 */
+		minutesParked?: number;
+
+		/**
+		 * 寮傚父鎬犻�熸椂闀�(鍒嗛挓)
+		 */
+		minutesAbnormalIdle?: number;
+
+		/**
+		 * 骞冲潎琛岄┒杞﹂��(km/h)
+		 */
+		avgSpeed?: number;
+
+		/**
+		 * 瓒呴�熷憡璀︽鏁�
+		 */
+		overspeedCount?: number;
+
+		/**
+		 * 瓒呴�熺疮璁℃椂闀�(绉�)
+		 */
+		overspeedDurationSec?: number;
+
+		/**
+		 * 鎬ュ埞杞︽鏁�
+		 */
+		harshBrakeCount?: number;
+
+		/**
+		 * 鎬ュ姞閫熸鏁�
+		 */
+		harshAccelCount?: number;
+
+		/**
+		 * 鎬ヨ浆寮鏁�
+		 */
+		harshTurnCount?: number;
+
+		/**
+		 * 闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�
+		 */
+		offHoursMoveCount?: number;
+
+		/**
+		 * 鍒涘缓鏃堕棿
+		 */
+		createTime?: string;
+
+		/**
+		 * 鏇存柊鏃堕棿
+		 */
+		updateTime?: string;
+
+		/**
+		 * 閮ㄩ棬鍚嶇О
+		 */
+		departmentName?: string;
+
+		/**
+		 * 浠绘剰閿��
+		 */
+		[key: string]: any;
+	}
+
 	interface ReportJoblogEntity {
 		/**
 		 * ID
@@ -2779,9 +2973,6 @@
 
 	type json = any;
 
-	type DictKey =
-		"ratedpayload" | "iottype" | "sitetype" | "datachanel" | "vehicletype" | "businesstype";
-
 	interface PagePagination {
 		size: number;
 		page: number;
@@ -2870,6 +3061,11 @@
 		list: DictTypeEntity[];
 	}
 
+	interface OperationTraderecordPageResponse {
+		pagination: PagePagination;
+		list: OperationTradeRecordEntity[];
+	}
+
 	interface OperationWastesalePageResponse {
 		pagination: PagePagination;
 		list: OperationWastesaleEntity[];
@@ -2928,6 +3124,11 @@
 	interface ReportDailysitePageResponse {
 		pagination: PagePagination;
 		list: ReportDailysiteEntity[];
+	}
+
+	interface ReportDailyvehiclePageResponse {
+		pagination: PagePagination;
+		list: ReportDailyVehicleEntity[];
 	}
 
 	interface ReportJoblogPageResponse {
@@ -4095,6 +4296,71 @@
 		request: Request;
 	}
 
+	interface OperationTraderecord {
+		/**
+		 * 瀵煎叆璐﹀崟
+		 */
+		import(data?: any): Promise<any>;
+
+		/**
+		 * 鍒犻櫎
+		 */
+		delete(data?: any): Promise<any>;
+
+		/**
+		 * 淇敼
+		 */
+		update(data?: any): Promise<any>;
+
+		/**
+		 * 鍗曚釜淇℃伅
+		 */
+		info(data?: any): Promise<OperationTradeRecordEntity>;
+
+		/**
+		 * 鍒楄〃鏌ヨ
+		 */
+		list(data?: any): Promise<OperationTradeRecordEntity[]>;
+
+		/**
+		 * 鍒嗛〉鏌ヨ
+		 */
+		page(data?: any): Promise<OperationTraderecordPageResponse>;
+
+		/**
+		 * 鏂板
+		 */
+		add(data?: any): Promise<any>;
+
+		/**
+		 * 鏉冮檺鏍囪瘑
+		 */
+		permission: {
+			import: string;
+			delete: string;
+			update: string;
+			info: string;
+			list: string;
+			page: string;
+			add: string;
+		};
+
+		/**
+		 * 鏉冮檺鐘舵��
+		 */
+		_permission: {
+			import: boolean;
+			delete: boolean;
+			update: boolean;
+			info: boolean;
+			list: boolean;
+			page: boolean;
+			add: boolean;
+		};
+
+		request: Request;
+	}
+
 	interface OperationWastesale {
 		/**
 		 * 鍒犻櫎
@@ -4769,6 +5035,64 @@
 		request: Request;
 	}
 
+	interface ReportDailyvehicle {
+		/**
+		 * 鍒犻櫎
+		 */
+		delete(data?: any): Promise<any>;
+
+		/**
+		 * 淇敼
+		 */
+		update(data?: any): Promise<any>;
+
+		/**
+		 * 鍗曚釜淇℃伅
+		 */
+		info(data?: any): Promise<ReportDailyVehicleEntity>;
+
+		/**
+		 * 鍒楄〃鏌ヨ
+		 */
+		list(data?: any): Promise<ReportDailyVehicleEntity[]>;
+
+		/**
+		 * 鍒嗛〉鏌ヨ
+		 */
+		page(data?: any): Promise<ReportDailyvehiclePageResponse>;
+
+		/**
+		 * 鏂板
+		 */
+		add(data?: any): Promise<any>;
+
+		/**
+		 * 鏉冮檺鏍囪瘑
+		 */
+		permission: {
+			delete: string;
+			update: string;
+			info: string;
+			list: string;
+			page: string;
+			add: string;
+		};
+
+		/**
+		 * 鏉冮檺鐘舵��
+		 */
+		_permission: {
+			delete: boolean;
+			update: boolean;
+			info: boolean;
+			list: boolean;
+			page: boolean;
+			add: boolean;
+		};
+
+		request: Request;
+	}
+
 	interface ReportJoblog {
 		/**
 		 * 鍒犻櫎
@@ -5178,7 +5502,7 @@
 		demo: { goods: DemoGoods; tenant: DemoTenant };
 		dict: { info: DictInfo; type: DictType };
 		monitor: { ys7: MonitorYs7 };
-		operation: { wastesale: OperationWastesale };
+		operation: { traderecord: OperationTraderecord; wastesale: OperationWastesale };
 		plugin: { info: PluginInfo };
 		push: {
 			auditlog: PushAuditlog;
@@ -5193,6 +5517,7 @@
 		report: {
 			dailydepartment: ReportDailydepartment;
 			dailysite: ReportDailysite;
+			dailyvehicle: ReportDailyvehicle;
 			joblog: ReportJoblog;
 		};
 		space: { info: SpaceInfo; type: SpaceType };
diff --git a/build/cool/eps.json b/build/cool/eps.json
index b7d6d4d..4303a36 100644
--- a/build/cool/eps.json
+++ b/build/cool/eps.json
@@ -1 +1 @@
-[{"prefix":"/admin/base/coding","name":"","api":[{"method":"get","path":"/getModuleTree"},{"method":"post","path":"/createCode"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/comm","name":"","api":[{"method":"post","path":"/personUpdate"},{"method":"get","path":"/uploadMode"},{"method":"get","path":"/permmenu"},{"method":"get","path":"/program"},{"method":"get","path":"/person"},{"method":"post","path":"/upload"},{"method":"post","path":"/logout"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/open","name":"","api":[{"method":"get","path":"/refreshToken"},{"method":"get","path":"/captcha"},{"method":"post","path":"/login"},{"method":"get","path":"/html"},{"method":"get","path":"/eps"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/department","name":"BaseSysDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/order"},{"method":"post","path":"/list"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/log","name":"BaseSysLogEntity","api":[{"method":"post","path":"/setKeep"},{"method":"get","path":"/getKeep"},{"method":"post","path":"/clear"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"b.name"},{"propertyName":"action","type":"string","length":"","comment":"琛屼负","nullable":false,"source":"a.action"},{"propertyName":"ip","type":"string","length":"","comment":"ip","nullable":true,"source":"a.ip"}]}},{"prefix":"/admin/base/sys/menu","name":"BaseSysMenuEntity","api":[{"method":"post","path":"/create"},{"method":"post","path":"/export"},{"method":"post","path":"/import"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/parse"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/param","name":"BaseSysParamEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/html"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataType","type":"number","length":"","comment":"鏁版嵁绫诲瀷 0-瀛楃涓� 1-瀵屾枃鏈� 2-鏂囦欢 ","nullable":false,"defaultValue":0,"source":"a.dataType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"keyName","type":"string","length":"","comment":"閿�","nullable":false,"source":"a.keyName"}]}},{"prefix":"/admin/base/sys/role","name":"BaseSysRoleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"label","type":"string","length":"50","comment":"瑙掕壊鏍囩","nullable":true,"source":"a.label"}]}},{"prefix":"/admin/base/sys/user","name":"BaseSysUserEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/move"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/buyer","name":"BasicdataBuyerEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"閮ㄩ棬ID","nullable":true,"source":"a.departmentId"},{"propertyName":"name","type":"string","length":"200","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"contact","type":"string","length":"50","comment":"鑱旂郴浜�","nullable":true,"source":"a.contact"}],"fieldLike":[{"propertyName":"name","type":"string","length":"200","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"address","type":"string","length":"255","comment":"鍦板潃","nullable":true,"source":"a.address"}],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/driver","name":"BasicdataDriverEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["婵�娲�","绂佺敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessId","type":"string","length":"64","comment":"韬唤璇佸彿","nullable":false,"source":"a.businessId"},{"propertyName":"phone","type":"string","length":"32","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"},{"propertyName":"licenseNo","type":"string","length":"64","comment":"椹鹃┒璇佸彿","nullable":true,"source":"a.licenseNo"}]}},{"prefix":"/admin/basicdata/iot","name":"BasicdataIotEntity","api":[{"method":"post","path":"/getYsDevices"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"iotTypeCode","type":"string","length":"","comment":"缁堢绫诲瀷","nullable":false,"source":"a.iotTypeCode"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"iotName","type":"string","length":"","comment":"缁堢鍚嶇О","nullable":false,"source":"a.iotName"},{"propertyName":"iotCode","type":"string","length":"","comment":"缁堢缂栫爜","nullable":false,"source":"a.iotCode"}]}},{"prefix":"/admin/basicdata/site","name":"BasicdataSiteEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"褰掑睘鍗曚綅","nullable":false,"source":"a.departmentId"},{"propertyName":"siteType","type":"string","length":"","comment":"绔欑偣绫诲瀷","nullable":false,"defaultValue":"鏀堕泦鐐�","dict":"sitetype","source":"a.siteType"},{"propertyName":"status","type":"number","length":"","comment":"鏄惁鍚敤","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"address","type":"string","length":"","comment":"鍦板潃","nullable":false,"source":"a.address"},{"propertyName":"leader","type":"string","length":"","comment":"璐熻矗浜�","nullable":false,"source":"a.leader"}]}},{"prefix":"/admin/basicdata/sorter","name":"BasicdataSorterEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍦ㄨ亴","绂昏亴","绂佺敤"],"source":"a.status"},{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessName","type":"string","length":"64","comment":"濮撳悕","nullable":false,"source":"a.businessName"},{"propertyName":"businessId","type":"string","length":"32","comment":"韬唤璇佸彿","nullable":true,"source":"a.businessId"},{"propertyName":"phone","type":"string","length":"32","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"}]}},{"prefix":"/admin/basicdata/vehicle","name":"BasicdataVehicleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"vehicleType","type":"string","length":"","comment":"杞﹀瀷","nullable":false,"defaultValue":"鍘㈠紡璐ц溅","dict":"vehicletype","source":"a.vehicleType"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍚敤","绂佺敤"],"source":"a.status"},{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessId","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.businessId"},{"propertyName":"defaultDriver","type":"bigint","length":"","comment":"榛樿鍙告満","nullable":true,"source":"a.defaultDriver"}]}},{"prefix":"/admin/basicdata/wastetype","name":"BasicdataWastetypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"isRecyclable","type":"number","length":"","comment":"鏄惁鍙洖鏀�","nullable":false,"defaultValue":0,"dict":["鍚�","鏄�"],"source":"a.isRecyclable"},{"propertyName":"status","type":"number","length":"","comment":"鏄惁鍚敤","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"code","type":"string","length":"","comment":"浠g爜","nullable":false,"source":"a.code"}]}},{"prefix":"/admin/demo/goods","name":"DemoGoodsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[{"propertyName":"title","type":"string","length":"50","comment":"鏍囬","nullable":false,"source":"a.title"}],"keyWordLikeFields":[{"propertyName":"description","type":"string","length":"","comment":"鎻忚堪","nullable":true,"source":"a.description"}]}},{"prefix":"/admin/demo/tenant","name":"DemoGoodsEntity","api":[{"method":"post","path":"/noTenant"},{"method":"post","path":"/noUse"},{"method":"post","path":"/use"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/info","name":"DictInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/types"},{"method":"post","path":"/data"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/type","name":"DictTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/monitor/ys7","name":"","api":[{"method":"post","path":"/getToken"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/operation/wastesale","name":"OperationWastesaleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"閮ㄩ棬ID","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/plugin/info","name":"PluginInfoEntity","api":[{"method":"post","path":"/install"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/auditlog","name":"PushAuditlogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"瀹㈡埛绔疘D","nullable":false,"source":"a.deviceNo"},{"propertyName":"pushType","type":"string","length":"","comment":"鎺ㄩ�佺被鍨�","nullable":false,"defaultValue":"weight","dict":["weight","health_gps","vehicle_gps","driver_anomaly","others"],"source":"a.pushType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"errorMessage","type":"text","length":"","comment":"閿欒杩斿洖淇℃伅","nullable":true,"source":"a.errorMessage"}]}},{"prefix":"/admin/push/cameragps","name":"PushCameraGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"瀹氫綅绮惧害","nullable":false,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"sn","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.sn"}]}},{"prefix":"/admin/push/devicealarm","name":"PushDevicealarmEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"devSerial","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.devSerial"},{"propertyName":"departmentName","type":"string","length":"","comment":"閮ㄩ棬鍚嶇О","nullable":false,"source":"c.name"}]}},{"prefix":"/admin/push/deviceonoff","name":"PushDeviceOnoffEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"deviceId","type":"string","length":"","comment":"璁惧ID","nullable":false,"source":"a.deviceId"},{"propertyName":"subSerial","type":"string","length":"","comment":"瀛愬簭鍒楀彿","nullable":true,"source":"a.subSerial"},{"propertyName":"deviceName","type":"string","length":"","comment":"璁惧鍚嶇О","nullable":true,"source":"a.deviceName"}]}},{"prefix":"/admin/push/siteweight","name":"PushSiteweightEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"},{"propertyName":"siteType","type":"string","length":"","comment":"绔欑偣绫诲瀷","nullable":false,"defaultValue":"鏀堕泦鐐�","dict":"sitetype","source":"d.siteType"}],"fieldLike":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"}],"keyWordLikeFields":[]}},{"prefix":"/admin/push/vehiclegps","name":"PushVehicleGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"瀹氫綅绮惧害","nullable":false,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"sn","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.sn"},{"propertyName":"vehicleNo","type":"string","length":"","comment":"杞︾墝鍙�","nullable":true,"source":"a.vehicleNo"}]}},{"prefix":"/admin/push/weight","name":"PushWeightEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"},{"propertyName":"garbageType","type":"string","length":"","comment":"鍨冨溇绫诲瀷","nullable":false,"source":"a.garbageType"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/recycle/data","name":"RecycleDataEntity","api":[{"method":"post","path":"/restore"},{"method":"get","path":"/info"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"userName","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"b.name"},{"propertyName":"url","type":"string","length":"","comment":"璇锋眰鐨勬帴鍙�","nullable":true,"source":"a.url"}]}},{"prefix":"/admin/report/dailydepartment","name":"ReportDailyDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"departmentId","type":"number","length":"","comment":"閮ㄩ棬ID","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"departmentName","type":"string","length":"","comment":"閮ㄩ棬鍚嶇О","nullable":false,"source":"a.departmentName"}]}},{"prefix":"/admin/report/dailysite","name":"ReportDailysiteEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"siteId","type":"number","length":"","comment":"绔欑偣ID","nullable":false,"source":"a.siteId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"siteName","type":"string","length":"","comment":"绔欑偣鍚嶇О","nullable":false,"source":"a.siteName"}]}},{"prefix":"/admin/report/joblog","name":"ReportJoblogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataDate","type":"date","length":"","comment":"鏁版嵁鐩爣鏃ユ湡","nullable":false,"source":"a.dataDate"},{"propertyName":"status","type":"enum","length":"","comment":"鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触","nullable":false,"defaultValue":"INIT","source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"jobName","type":"string","length":"","comment":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)","nullable":false,"source":"a.jobName"}]}},{"prefix":"/admin/space/info","name":"SpaceInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"type","type":"string","length":"","comment":"绫诲瀷","nullable":false,"source":"a.type"},{"propertyName":"classifyId","type":"number","length":"","comment":"鍒嗙被ID","nullable":true,"source":"a.classifyId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/space/type","name":"SpaceTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/task/info","name":"TaskInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/start"},{"method":"post","path":"/once"},{"method":"post","path":"/stop"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"get","path":"/log"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鍋滄 1-杩愯","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"鐘舵�� 0-绯荤粺 1-鐢ㄦ埛","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/address","name":"UserAddressEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/info","name":"UserInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","姝e父","宸叉敞閿�"],"source":"a.status"},{"propertyName":"gender","type":"number","length":"","comment":"鎬у埆","nullable":false,"defaultValue":0,"dict":["鏈煡","鐢�","濂�"],"source":"a.gender"},{"propertyName":"loginType","type":"number","length":"","comment":"鐧诲綍鏂瑰紡","nullable":false,"defaultValue":0,"dict":["灏忕▼搴�","鍏紬鍙�","H5"],"source":"a.loginType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"a.nickName"},{"propertyName":"phone","type":"string","length":"","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"}]}}]
\ No newline at end of file
+[{"prefix":"/admin/base/coding","name":"","api":[{"method":"get","path":"/getModuleTree"},{"method":"post","path":"/createCode"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/comm","name":"","api":[{"method":"post","path":"/personUpdate"},{"method":"get","path":"/uploadMode"},{"method":"get","path":"/permmenu"},{"method":"get","path":"/program"},{"method":"get","path":"/person"},{"method":"post","path":"/upload"},{"method":"post","path":"/logout"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/open","name":"","api":[{"method":"get","path":"/refreshToken"},{"method":"get","path":"/captcha"},{"method":"post","path":"/login"},{"method":"get","path":"/html"},{"method":"get","path":"/eps"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/department","name":"BaseSysDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/order"},{"method":"post","path":"/list"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/log","name":"BaseSysLogEntity","api":[{"method":"post","path":"/setKeep"},{"method":"get","path":"/getKeep"},{"method":"post","path":"/clear"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"b.name"},{"propertyName":"action","type":"string","length":"","comment":"琛屼负","nullable":false,"source":"a.action"},{"propertyName":"ip","type":"string","length":"","comment":"ip","nullable":true,"source":"a.ip"}]}},{"prefix":"/admin/base/sys/menu","name":"BaseSysMenuEntity","api":[{"method":"post","path":"/create"},{"method":"post","path":"/export"},{"method":"post","path":"/import"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/parse"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/param","name":"BaseSysParamEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/html"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataType","type":"number","length":"","comment":"鏁版嵁绫诲瀷 0-瀛楃涓� 1-瀵屾枃鏈� 2-鏂囦欢 ","nullable":false,"defaultValue":0,"source":"a.dataType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"keyName","type":"string","length":"","comment":"閿�","nullable":false,"source":"a.keyName"}]}},{"prefix":"/admin/base/sys/role","name":"BaseSysRoleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"label","type":"string","length":"50","comment":"瑙掕壊鏍囩","nullable":true,"source":"a.label"}]}},{"prefix":"/admin/base/sys/user","name":"BaseSysUserEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/move"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/buyer","name":"BasicdataBuyerEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"閮ㄩ棬ID","nullable":true,"source":"a.departmentId"},{"propertyName":"name","type":"string","length":"200","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"contact","type":"string","length":"50","comment":"鑱旂郴浜�","nullable":true,"source":"a.contact"}],"fieldLike":[{"propertyName":"name","type":"string","length":"200","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"address","type":"string","length":"255","comment":"鍦板潃","nullable":true,"source":"a.address"}],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/driver","name":"BasicdataDriverEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["婵�娲�","绂佺敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessId","type":"string","length":"64","comment":"韬唤璇佸彿","nullable":false,"source":"a.businessId"},{"propertyName":"phone","type":"string","length":"32","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"},{"propertyName":"licenseNo","type":"string","length":"64","comment":"椹鹃┒璇佸彿","nullable":true,"source":"a.licenseNo"}]}},{"prefix":"/admin/basicdata/iot","name":"BasicdataIotEntity","api":[{"method":"post","path":"/getYsDevices"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"iotTypeCode","type":"string","length":"","comment":"缁堢绫诲瀷","nullable":false,"source":"a.iotTypeCode"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"iotName","type":"string","length":"","comment":"缁堢鍚嶇О","nullable":false,"source":"a.iotName"},{"propertyName":"iotCode","type":"string","length":"","comment":"缁堢缂栫爜","nullable":false,"source":"a.iotCode"}]}},{"prefix":"/admin/basicdata/site","name":"BasicdataSiteEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"褰掑睘鍗曚綅","nullable":false,"source":"a.departmentId"},{"propertyName":"siteType","type":"string","length":"","comment":"绔欑偣绫诲瀷","nullable":false,"defaultValue":"鏀堕泦鐐�","dict":"sitetype","source":"a.siteType"},{"propertyName":"status","type":"number","length":"","comment":"鏄惁鍚敤","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"address","type":"string","length":"","comment":"鍦板潃","nullable":false,"source":"a.address"},{"propertyName":"leader","type":"string","length":"","comment":"璐熻矗浜�","nullable":false,"source":"a.leader"}]}},{"prefix":"/admin/basicdata/sorter","name":"BasicdataSorterEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍦ㄨ亴","绂昏亴","绂佺敤"],"source":"a.status"},{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessName","type":"string","length":"64","comment":"濮撳悕","nullable":false,"source":"a.businessName"},{"propertyName":"businessId","type":"string","length":"32","comment":"韬唤璇佸彿","nullable":true,"source":"a.businessId"},{"propertyName":"phone","type":"string","length":"32","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"}]}},{"prefix":"/admin/basicdata/vehicle","name":"BasicdataVehicleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"vehicleType","type":"string","length":"","comment":"杞﹀瀷","nullable":false,"defaultValue":"鍘㈠紡璐ц溅","dict":"vehicletype","source":"a.vehicleType"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍚敤","绂佺敤"],"source":"a.status"},{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessId","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.businessId"},{"propertyName":"defaultDriver","type":"bigint","length":"","comment":"榛樿鍙告満","nullable":true,"source":"a.defaultDriver"}]}},{"prefix":"/admin/basicdata/wastetype","name":"BasicdataWastetypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"isRecyclable","type":"number","length":"","comment":"鏄惁鍙洖鏀�","nullable":false,"defaultValue":0,"dict":["鍚�","鏄�"],"source":"a.isRecyclable"},{"propertyName":"status","type":"number","length":"","comment":"鏄惁鍚敤","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"code","type":"string","length":"","comment":"浠g爜","nullable":false,"source":"a.code"}]}},{"prefix":"/admin/demo/goods","name":"DemoGoodsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[{"propertyName":"title","type":"string","length":"50","comment":"鏍囬","nullable":false,"source":"a.title"}],"keyWordLikeFields":[{"propertyName":"description","type":"string","length":"","comment":"鎻忚堪","nullable":true,"source":"a.description"}]}},{"prefix":"/admin/demo/tenant","name":"DemoGoodsEntity","api":[{"method":"post","path":"/noTenant"},{"method":"post","path":"/noUse"},{"method":"post","path":"/use"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/info","name":"DictInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/types"},{"method":"post","path":"/data"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/type","name":"DictTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/monitor/ys7","name":"","api":[{"method":"post","path":"/getToken"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/operation/traderecord","name":"OperationTradeRecordEntity","api":[{"method":"post","path":"/import"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"transactionType","type":"string","length":"","comment":"浜ゆ槗绫诲瀷","nullable":true,"source":"a.transactionType"},{"propertyName":"incomeType","type":"string","length":"","comment":"鏀舵敮绫诲瀷","nullable":false,"defaultValue":"鏀跺叆","dict":["鏀跺叆","鏀嚭","鍏朵粬"],"source":"a.incomeType"},{"propertyName":"payMethod","type":"string","length":"","comment":"鏀粯鏂瑰紡","nullable":true,"source":"a.payMethod"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"goodsName","type":"string","length":"","comment":"鍟嗗搧鍚嶇О","nullable":true,"source":"a.goodsName"},{"propertyName":"opponent","type":"string","length":"","comment":"浜ゆ槗瀵规柟","nullable":true,"source":"a.opponent"}]}},{"prefix":"/admin/operation/wastesale","name":"OperationWastesaleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"閮ㄩ棬ID","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/plugin/info","name":"PluginInfoEntity","api":[{"method":"post","path":"/install"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/auditlog","name":"PushAuditlogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"瀹㈡埛绔疘D","nullable":false,"source":"a.deviceNo"},{"propertyName":"pushType","type":"string","length":"","comment":"鎺ㄩ�佺被鍨�","nullable":false,"defaultValue":"weight","dict":["weight","health_gps","vehicle_gps","driver_anomaly","others"],"source":"a.pushType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"errorMessage","type":"text","length":"","comment":"閿欒杩斿洖淇℃伅","nullable":true,"source":"a.errorMessage"}]}},{"prefix":"/admin/push/cameragps","name":"PushCameraGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"瀹氫綅绮惧害","nullable":false,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"sn","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.sn"}]}},{"prefix":"/admin/push/devicealarm","name":"PushDevicealarmEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"devSerial","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.devSerial"},{"propertyName":"departmentName","type":"string","length":"","comment":"閮ㄩ棬鍚嶇О","nullable":false,"source":"c.name"}]}},{"prefix":"/admin/push/deviceonoff","name":"PushDeviceOnoffEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"deviceId","type":"string","length":"","comment":"璁惧ID","nullable":false,"source":"a.deviceId"},{"propertyName":"subSerial","type":"string","length":"","comment":"瀛愬簭鍒楀彿","nullable":true,"source":"a.subSerial"},{"propertyName":"deviceName","type":"string","length":"","comment":"璁惧鍚嶇О","nullable":true,"source":"a.deviceName"}]}},{"prefix":"/admin/push/siteweight","name":"PushSiteweightEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"},{"propertyName":"siteType","type":"string","length":"","comment":"绔欑偣绫诲瀷","nullable":false,"defaultValue":"鏀堕泦鐐�","dict":"sitetype","source":"d.siteType"}],"fieldLike":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"}],"keyWordLikeFields":[]}},{"prefix":"/admin/push/vehiclegps","name":"PushVehicleGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"瀹氫綅绮惧害","nullable":false,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"sn","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.sn"},{"propertyName":"vehicleNo","type":"string","length":"","comment":"杞︾墝鍙�","nullable":true,"source":"a.vehicleNo"}]}},{"prefix":"/admin/push/weight","name":"PushWeightEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"},{"propertyName":"garbageType","type":"string","length":"","comment":"鍨冨溇绫诲瀷","nullable":false,"source":"a.garbageType"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/recycle/data","name":"RecycleDataEntity","api":[{"method":"post","path":"/restore"},{"method":"get","path":"/info"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"userName","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"b.name"},{"propertyName":"url","type":"string","length":"","comment":"璇锋眰鐨勬帴鍙�","nullable":true,"source":"a.url"}]}},{"prefix":"/admin/report/dailydepartment","name":"ReportDailyDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"departmentId","type":"number","length":"","comment":"閮ㄩ棬ID","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"departmentName","type":"string","length":"","comment":"閮ㄩ棬鍚嶇О","nullable":false,"source":"a.departmentName"}]}},{"prefix":"/admin/report/dailysite","name":"ReportDailysiteEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"siteId","type":"number","length":"","comment":"绔欑偣ID","nullable":false,"source":"a.siteId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"siteName","type":"string","length":"","comment":"绔欑偣鍚嶇О","nullable":false,"source":"a.siteName"}]}},{"prefix":"/admin/report/dailyvehicle","name":"ReportDailyVehicleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"vehicleNo","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.vehicleNo"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"vehicleNo","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.vehicleNo"}]}},{"prefix":"/admin/report/joblog","name":"ReportJoblogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataDate","type":"date","length":"","comment":"鏁版嵁鐩爣鏃ユ湡","nullable":false,"source":"a.dataDate"},{"propertyName":"status","type":"enum","length":"","comment":"鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触","nullable":false,"defaultValue":"INIT","source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"jobName","type":"string","length":"","comment":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)","nullable":false,"source":"a.jobName"}]}},{"prefix":"/admin/space/info","name":"SpaceInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"type","type":"string","length":"","comment":"绫诲瀷","nullable":false,"source":"a.type"},{"propertyName":"classifyId","type":"number","length":"","comment":"鍒嗙被ID","nullable":true,"source":"a.classifyId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/space/type","name":"SpaceTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/task/info","name":"TaskInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/start"},{"method":"post","path":"/once"},{"method":"post","path":"/stop"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"get","path":"/log"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鍋滄 1-杩愯","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"鐘舵�� 0-绯荤粺 1-鐢ㄦ埛","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/address","name":"UserAddressEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/info","name":"UserInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","姝e父","宸叉敞閿�"],"source":"a.status"},{"propertyName":"gender","type":"number","length":"","comment":"鎬у埆","nullable":false,"defaultValue":0,"dict":["鏈煡","鐢�","濂�"],"source":"a.gender"},{"propertyName":"loginType","type":"number","length":"","comment":"鐧诲綍鏂瑰紡","nullable":false,"defaultValue":0,"dict":["灏忕▼搴�","鍏紬鍙�","H5"],"source":"a.loginType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"a.nickName"},{"propertyName":"phone","type":"string","length":"","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"}]}}]
\ No newline at end of file
diff --git a/public/pdfjs/build/pdf.mjs b/public/pdfjs/build/pdf.mjs
new file mode 100644
index 0000000..f9bce50
--- /dev/null
+++ b/public/pdfjs/build/pdf.mjs
@@ -0,0 +1,27924 @@
+/**
+ * @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 = 6.1.200
+ * pdfjsBuild = 6353acefe
+ */
+
+;// ./src/shared/util.js
+const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser");
+const BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity];
+const F32_BBOX_INIT = new Float32Array(BBOX_INIT);
+const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+const LINE_FACTOR = 1.35;
+const LINE_DESCENT_FACTOR = 0.35;
+const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;
+const SVG_NS = "http://www.w3.org/2000/svg";
+const RenderingIntentFlag = {
+  ANY: 0x01,
+  DISPLAY: 0x02,
+  PRINT: 0x04,
+  SAVE: 0x08,
+  ANNOTATIONS_FORMS: 0x10,
+  ANNOTATIONS_STORAGE: 0x20,
+  ANNOTATIONS_DISABLE: 0x40,
+  IS_EDITING: 0x80,
+  OPLIST: 0x100
+};
+const AnnotationMode = {
+  DISABLE: 0,
+  ENABLE: 1,
+  ENABLE_FORMS: 2,
+  ENABLE_STORAGE: 3
+};
+const AnnotationPrefix = "pdfjs_internal_id_";
+const AnnotationEditorPrefix = "pdfjs_internal_editor_";
+const AnnotationEditorType = {
+  DISABLE: -1,
+  NONE: 0,
+  FREETEXT: 3,
+  HIGHLIGHT: 9,
+  STAMP: 13,
+  INK: 15,
+  POPUP: 16,
+  SIGNATURE: 101,
+  COMMENT: 102
+};
+const AnnotationEditorParamsType = {
+  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
+};
+const PermissionFlag = {
+  PRINT: 0x04,
+  MODIFY_CONTENTS: 0x08,
+  COPY: 0x10,
+  MODIFY_ANNOTATIONS: 0x20,
+  FILL_INTERACTIVE_FORMS: 0x100,
+  COPY_FOR_ACCESSIBILITY: 0x200,
+  ASSEMBLE: 0x400,
+  PRINT_HIGH_QUALITY: 0x800
+};
+const MeshFigureType = (/* unused pure expression or super */ null && ({
+  TRIANGLES: 1,
+  LATTICE: 2,
+  PATCH: 3
+}));
+const TextRenderingMode = {
+  FILL: 0,
+  STROKE: 1,
+  FILL_STROKE: 2,
+  INVISIBLE: 3,
+  FILL_ADD_TO_PATH: 4,
+  STROKE_ADD_TO_PATH: 5,
+  FILL_STROKE_ADD_TO_PATH: 6,
+  ADD_TO_PATH: 7,
+  FILL_STROKE_MASK: 3,
+  ADD_TO_PATH_FLAG: 4
+};
+const ImageKind = {
+  GRAYSCALE_1BPP: 1,
+  RGB_24BPP: 2,
+  RGBA_32BPP: 3
+};
+const AnnotationType = {
+  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,
+  RICHMEDIA: 27
+};
+const AnnotationReplyType = (/* unused pure expression or super */ null && ({
+  GROUP: "Group",
+  REPLY: "R"
+}));
+const AnnotationRenditionOperation = (/* unused pure expression or super */ null && ({
+  PLAY_OR_RESUME: 0,
+  STOP: 1,
+  PAUSE: 2,
+  RESUME: 3,
+  PLAY: 4
+}));
+const AnnotationFlag = (/* unused pure expression or super */ null && ({
+  INVISIBLE: 0x01,
+  HIDDEN: 0x02,
+  PRINT: 0x04,
+  NOZOOM: 0x08,
+  NOROTATE: 0x10,
+  NOVIEW: 0x20,
+  READONLY: 0x40,
+  LOCKED: 0x80,
+  TOGGLENOVIEW: 0x100,
+  LOCKEDCONTENTS: 0x200
+}));
+const AnnotationFieldFlag = (/* unused pure expression or super */ null && ({
+  READONLY: 0x0000001,
+  REQUIRED: 0x0000002,
+  NOEXPORT: 0x0000004,
+  MULTILINE: 0x0001000,
+  PASSWORD: 0x0002000,
+  NOTOGGLETOOFF: 0x0004000,
+  RADIO: 0x0008000,
+  PUSHBUTTON: 0x0010000,
+  COMBO: 0x0020000,
+  EDIT: 0x0040000,
+  SORT: 0x0080000,
+  FILESELECT: 0x0100000,
+  MULTISELECT: 0x0200000,
+  DONOTSPELLCHECK: 0x0400000,
+  DONOTSCROLL: 0x0800000,
+  COMB: 0x1000000,
+  RICHTEXT: 0x2000000,
+  RADIOSINUNISON: 0x2000000,
+  COMMITONSELCHANGE: 0x4000000
+}));
+const AnnotationBorderStyleType = {
+  SOLID: 1,
+  DASHED: 2,
+  BEVELED: 3,
+  INSET: 4,
+  UNDERLINE: 5
+};
+const AnnotationActionEventType = (/* unused pure expression or super */ null && ({
+  E: "Mouse Enter",
+  X: "Mouse Exit",
+  D: "Mouse Down",
+  U: "Mouse Up",
+  Fo: "Focus",
+  Bl: "Blur",
+  PO: "PageOpen",
+  PC: "PageClose",
+  PV: "PageVisible",
+  PI: "PageInvisible",
+  K: "Keystroke",
+  F: "Format",
+  V: "Validate",
+  C: "Calculate"
+}));
+const DocumentActionEventType = (/* unused pure expression or super */ null && ({
+  WC: "WillClose",
+  WS: "WillSave",
+  DS: "DidSave",
+  WP: "WillPrint",
+  DP: "DidPrint"
+}));
+const PageActionEventType = (/* unused pure expression or super */ null && ({
+  O: "PageOpen",
+  C: "PageClose"
+}));
+const VerbosityLevel = {
+  ERRORS: 0,
+  WARNINGS: 1,
+  INFOS: 5
+};
+const OPS = {
+  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
+};
+const DrawOPS = {
+  moveTo: 0,
+  lineTo: 1,
+  curveTo: 2,
+  quadraticCurveTo: 3,
+  closePath: 4
+};
+const PasswordResponses = {
+  NEED_PASSWORD: 1,
+  INCORRECT_PASSWORD: 2
+};
+let verbosity = VerbosityLevel.WARNINGS;
+function setVerbosityLevel(level) {
+  if (Number.isInteger(level)) {
+    verbosity = level;
+  }
+}
+function getVerbosityLevel() {
+  return verbosity;
+}
+function info(msg) {
+  if (verbosity >= VerbosityLevel.INFOS) {
+    console.info(`Info: ${msg}`);
+  }
+}
+function warn(msg) {
+  if (verbosity >= VerbosityLevel.WARNINGS) {
+    console.warn(`Warning: ${msg}`);
+  }
+}
+function unreachable(msg) {
+  throw new Error(msg);
+}
+function assert(cond, msg) {
+  if (!cond) {
+    unreachable(msg);
+  }
+}
+function _isValidProtocol(url) {
+  switch (url?.protocol) {
+    case "http:":
+    case "https:":
+    case "ftp:":
+    case "mailto:":
+    case "tel:":
+      return true;
+    default:
+      return false;
+  }
+}
+function createValidAbsoluteUrl(url, baseUrl = null, options = null) {
+  if (!url) {
+    return null;
+  }
+  if (options && typeof url === "string") {
+    if (options.addDefaultProtocol && url.startsWith("www.")) {
+      const dots = url.match(/\./g);
+      if (dots?.length >= 2) {
+        url = `http://${url}`;
+      }
+    }
+    if (options.tryConvertEncoding) {
+      try {
+        url = stringToUTF8String(url);
+      } catch {}
+    }
+  }
+  const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);
+  return _isValidProtocol(absoluteUrl) ? absoluteUrl : null;
+}
+function updateUrlHash(url, hash, allowRel = false) {
+  const res = URL.parse(url);
+  if (res) {
+    res.hash = hash;
+    return res.href;
+  }
+  if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) {
+    return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`;
+  }
+  return "";
+}
+function stripPath(str) {
+  return str.substring(str.lastIndexOf("/") + 1);
+}
+function shadow(obj, prop, value, nonSerializable = false) {
+  Object.defineProperty(obj, prop, {
+    value,
+    enumerable: !nonSerializable,
+    configurable: true,
+    writable: false
+  });
+  return value;
+}
+const BaseException = function BaseExceptionClosure() {
+  function BaseException(message, name) {
+    this.message = message;
+    this.name = name;
+  }
+  BaseException.prototype = new Error();
+  BaseException.constructor = BaseException;
+  return BaseException;
+}();
+class PasswordException extends BaseException {
+  constructor(msg, code) {
+    super(msg, "PasswordException");
+    this.code = code;
+  }
+}
+class UnknownErrorException extends BaseException {
+  constructor(msg, details) {
+    super(msg, "UnknownErrorException");
+    this.details = details;
+  }
+}
+class InvalidPDFException extends BaseException {
+  constructor(msg) {
+    super(msg, "InvalidPDFException");
+  }
+}
+class ResponseException extends BaseException {
+  constructor(msg, status, missing) {
+    super(msg, "ResponseException");
+    this.status = status;
+    this.missing = missing;
+  }
+}
+class FormatError extends BaseException {
+  constructor(msg) {
+    super(msg, "FormatError");
+  }
+}
+class AbortException extends BaseException {
+  constructor(msg) {
+    super(msg, "AbortException");
+  }
+}
+function bytesToString(bytes) {
+  if (typeof bytes !== "object" || bytes?.length === undefined) {
+    unreachable("Invalid argument for bytesToString");
+  }
+  const length = bytes.length;
+  const MAX_ARGUMENT_COUNT = 8192;
+  if (length < MAX_ARGUMENT_COUNT) {
+    return String.fromCharCode.apply(null, bytes);
+  }
+  const strBuf = [];
+  for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
+    const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
+    const chunk = bytes.subarray(i, chunkEnd);
+    strBuf.push(String.fromCharCode.apply(null, chunk));
+  }
+  return strBuf.join("");
+}
+function stringToBytes(str) {
+  if (typeof str !== "string") {
+    unreachable("Invalid argument for stringToBytes");
+  }
+  const length = str.length;
+  const bytes = new Uint8Array(length);
+  for (let i = 0; i < length; ++i) {
+    bytes[i] = str.charCodeAt(i) & 0xff;
+  }
+  return bytes;
+}
+function objectSize(obj) {
+  return Object.keys(obj).length;
+}
+class FeatureTest {
+  static get isLittleEndian() {
+    const buffer8 = new Uint8Array(4);
+    buffer8[0] = 1;
+    const view32 = new Uint32Array(buffer8.buffer, 0, 1);
+    return shadow(this, "isLittleEndian", view32[0] === 1);
+  }
+  static get isOffscreenCanvasSupported() {
+    return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined");
+  }
+  static get isImageDecoderSupported() {
+    return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined");
+  }
+  static get isFloat16ArraySupported() {
+    return shadow(this, "isFloat16ArraySupported", typeof Float16Array !== "undefined");
+  }
+  static get isSanitizerSupported() {
+    return shadow(this, "isSanitizerSupported", typeof Sanitizer !== "undefined");
+  }
+  static get platform() {
+    const {
+      platform,
+      userAgent
+    } = navigator;
+    return shadow(this, "platform", {
+      isAndroid: userAgent.includes("Android"),
+      isLinux: platform.includes("Linux"),
+      isMac: platform.includes("Mac"),
+      isWindows: platform.includes("Win"),
+      isFirefox: userAgent.includes("Firefox")
+    });
+  }
+  static get isCanvasFilterSupported() {
+    let ctx;
+    if (this.isOffscreenCanvasSupported) {
+      ctx = new OffscreenCanvas(1, 1).getContext("2d");
+    } else if (typeof document !== "undefined") {
+      ctx = document.createElement("canvas").getContext("2d");
+    }
+    return shadow(this, "isCanvasFilterSupported", ctx?.filter !== undefined);
+  }
+  static get isAlphaColorInputSupported() {
+    if (typeof document === "undefined") {
+      return shadow(this, "isAlphaColorInputSupported", false);
+    }
+    const input = document.createElement("input");
+    input.type = "color";
+    input.setAttribute("alpha", "");
+    input.value = "#ff000080";
+    return shadow(this, "isAlphaColorInputSupported", input.value !== "#ff0000");
+  }
+  static get isBackdropFilterSupported() {
+    return shadow(this, "isBackdropFilterSupported", typeof CSS !== "undefined" && CSS.supports("backdrop-filter", "blur(1px)"));
+  }
+}
+class Util {
+  static get hexNums() {
+    return shadow(this, "hexNums", Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")));
+  }
+  static makeHexColor(r, g, b) {
+    return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`;
+  }
+  static transform(m1, m2) {
+    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];
+  }
+  static multiplyByDOMMatrix(m, md) {
+    return [m[0] * md.a + m[2] * md.b, m[1] * md.a + m[3] * md.b, m[0] * md.c + m[2] * md.d, m[1] * md.c + m[3] * md.d, m[0] * md.e + m[2] * md.f + m[4], m[1] * md.e + m[3] * md.f + m[5]];
+  }
+  static applyTransform(p, m, pos = 0) {
+    const p0 = p[pos];
+    const p1 = p[pos + 1];
+    p[pos] = p0 * m[0] + p1 * m[2] + m[4];
+    p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5];
+  }
+  static applyTransformToBezier(p, transform, pos = 0) {
+    const m0 = transform[0];
+    const m1 = transform[1];
+    const m2 = transform[2];
+    const m3 = transform[3];
+    const m4 = transform[4];
+    const m5 = transform[5];
+    for (let i = 0; i < 6; i += 2) {
+      const pI = p[pos + i];
+      const pI1 = p[pos + i + 1];
+      p[pos + i] = pI * m0 + pI1 * m2 + m4;
+      p[pos + i + 1] = pI * m1 + pI1 * m3 + m5;
+    }
+  }
+  static applyInverseTransform(p, m) {
+    const p0 = p[0];
+    const p1 = p[1];
+    const d = m[0] * m[3] - m[1] * m[2];
+    p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+    p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+  }
+  static axialAlignedBoundingBox(rect, transform, output) {
+    const m0 = transform[0];
+    const m1 = transform[1];
+    const m2 = transform[2];
+    const m3 = transform[3];
+    const m4 = transform[4];
+    const m5 = transform[5];
+    const r0 = rect[0];
+    const r1 = rect[1];
+    const r2 = rect[2];
+    const r3 = rect[3];
+    let a0 = m0 * r0 + m4;
+    let a2 = a0;
+    let a1 = m0 * r2 + m4;
+    let a3 = a1;
+    let b0 = m3 * r1 + m5;
+    let b2 = b0;
+    let b1 = m3 * r3 + m5;
+    let b3 = b1;
+    if (m1 !== 0 || m2 !== 0) {
+      const m1r0 = m1 * r0;
+      const m1r2 = m1 * r2;
+      const m2r1 = m2 * r1;
+      const m2r3 = m2 * r3;
+      a0 += m2r1;
+      a3 += m2r1;
+      a1 += m2r3;
+      a2 += m2r3;
+      b0 += m1r0;
+      b3 += m1r0;
+      b1 += m1r2;
+      b2 += m1r2;
+    }
+    output[0] = Math.min(output[0], a0, a1, a2, a3);
+    output[1] = Math.min(output[1], b0, b1, b2, b3);
+    output[2] = Math.max(output[2], a0, a1, a2, a3);
+    output[3] = Math.max(output[3], b0, b1, b2, b3);
+  }
+  static inverseTransform(m) {
+    const d = m[0] * m[3] - m[1] * m[2];
+    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+  }
+  static singularValueDecompose2dScale(matrix, output) {
+    const m0 = matrix[0];
+    const m1 = matrix[1];
+    const m2 = matrix[2];
+    const m3 = matrix[3];
+    const a = m0 ** 2 + m1 ** 2;
+    const b = m0 * m2 + m1 * m3;
+    const c = m2 ** 2 + m3 ** 2;
+    const first = (a + c) / 2;
+    const second = Math.sqrt(first ** 2 - (a * c - b ** 2));
+    output[0] = Math.sqrt(first + second || 1);
+    output[1] = Math.sqrt(first - second || 1);
+  }
+  static normalizeRect(rect) {
+    const r = rect.slice(0);
+    if (rect[0] > rect[2]) {
+      r[0] = rect[2];
+      r[2] = rect[0];
+    }
+    if (rect[1] > rect[3]) {
+      r[1] = rect[3];
+      r[3] = rect[1];
+    }
+    return r;
+  }
+  static intersect(rect1, rect2) {
+    const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2]));
+    const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2]));
+    if (xLow > xHigh) {
+      return null;
+    }
+    const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3]));
+    const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3]));
+    if (yLow > yHigh) {
+      return null;
+    }
+    return [xLow, yLow, xHigh, yHigh];
+  }
+  static pointBoundingBox(x, y, minMax) {
+    minMax[0] = Math.min(minMax[0], x);
+    minMax[1] = Math.min(minMax[1], y);
+    minMax[2] = Math.max(minMax[2], x);
+    minMax[3] = Math.max(minMax[3], y);
+  }
+  static rectBoundingBox(x0, y0, x1, y1, minMax) {
+    minMax[0] = Math.min(minMax[0], x0, x1);
+    minMax[1] = Math.min(minMax[1], y0, y1);
+    minMax[2] = Math.max(minMax[2], x0, x1);
+    minMax[3] = Math.max(minMax[3], y0, y1);
+  }
+  static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {
+    if (t <= 0 || t >= 1) {
+      return;
+    }
+    const mt = 1 - t;
+    const tt = t * t;
+    const ttt = tt * t;
+    const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;
+    const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;
+    minMax[0] = Math.min(minMax[0], x);
+    minMax[1] = Math.min(minMax[1], y);
+    minMax[2] = Math.max(minMax[2], x);
+    minMax[3] = Math.max(minMax[3], y);
+  }
+  static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {
+    if (Math.abs(a) < 1e-12) {
+      if (Math.abs(b) >= 1e-12) {
+        this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax);
+      }
+      return;
+    }
+    const delta = b ** 2 - 4 * c * a;
+    if (delta < 0) {
+      return;
+    }
+    const sqrtDelta = Math.sqrt(delta);
+    const a2 = 2 * a;
+    this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax);
+    this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax);
+  }
+  static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {
+    minMax[0] = Math.min(minMax[0], x0, x3);
+    minMax[1] = Math.min(minMax[1], y0, y3);
+    minMax[2] = Math.max(minMax[2], x0, x3);
+    minMax[3] = Math.max(minMax[3], y0, y3);
+    this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax);
+    this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax);
+  }
+}
+function stringToUTF8String(str) {
+  return decodeURIComponent(escape(str));
+}
+function utf8StringToString(str) {
+  return unescape(encodeURIComponent(str));
+}
+function isArrayEqual(arr1, arr2) {
+  if (arr1.length !== arr2.length) {
+    return false;
+  }
+  for (let i = 0, ii = arr1.length; i < ii; i++) {
+    if (arr1[i] !== arr2[i]) {
+      return false;
+    }
+  }
+  return true;
+}
+let NormalizeRegex = null;
+let NormalizationMap = null;
+function normalizeUnicode(str) {
+  if (!NormalizeRegex) {
+    NormalizeRegex = /([\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;
+    NormalizationMap = new Map([["铿�", "趴t"]]);
+  }
+  return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2));
+}
+function getUuid() {
+  if (typeof crypto.randomUUID === "function") {
+    return crypto.randomUUID();
+  }
+  const buf = new Uint8Array(32);
+  crypto.getRandomValues(buf);
+  return bytesToString(buf);
+}
+function _isValidExplicitDest(validRef, validName, dest) {
+  if (!Array.isArray(dest) || dest.length < 2) {
+    return false;
+  }
+  const [page, zoom, ...args] = dest;
+  if (!validRef(page) && !Number.isInteger(page)) {
+    return false;
+  }
+  if (!validName(zoom)) {
+    return false;
+  }
+  const argsLen = args.length;
+  let allowNull = true;
+  switch (zoom.name) {
+    case "XYZ":
+      if (argsLen < 2 || argsLen > 3) {
+        return false;
+      }
+      break;
+    case "Fit":
+    case "FitB":
+      return argsLen === 0;
+    case "FitH":
+    case "FitBH":
+    case "FitV":
+    case "FitBV":
+      if (argsLen > 1) {
+        return false;
+      }
+      break;
+    case "FitR":
+      if (argsLen !== 4) {
+        return false;
+      }
+      allowNull = false;
+      break;
+    default:
+      return false;
+  }
+  for (const arg of args) {
+    if (typeof arg === "number" || allowNull && arg === null) {
+      continue;
+    }
+    return false;
+  }
+  return true;
+}
+const makeArr = () => [];
+const makeMap = () => new Map();
+const makeObj = () => Object.create(null);
+
+;// ./src/shared/math_clamp.js
+function MathClamp(v, min, max) {
+  return Math.min(Math.max(v, min), max);
+}
+
+;// ./src/display/page_viewport.js
+
+class PageViewport {
+  constructor({
+    viewBox,
+    userUnit,
+    scale,
+    rotation,
+    offsetX = 0,
+    offsetY = 0,
+    dontFlip = false
+  }) {
+    this.viewBox = viewBox;
+    this.userUnit = userUnit;
+    this.scale = scale;
+    this.rotation = rotation;
+    this.offsetX = offsetX;
+    this.offsetY = offsetY;
+    scale *= userUnit;
+    const centerX = (viewBox[2] + viewBox[0]) / 2;
+    const centerY = (viewBox[3] + viewBox[1]) / 2;
+    let rotateA, rotateB, rotateC, rotateD;
+    rotation %= 360;
+    if (rotation < 0) {
+      rotation += 360;
+    }
+    switch (rotation) {
+      case 180:
+        rotateA = -1;
+        rotateB = 0;
+        rotateC = 0;
+        rotateD = 1;
+        break;
+      case 90:
+        rotateA = 0;
+        rotateB = 1;
+        rotateC = 1;
+        rotateD = 0;
+        break;
+      case 270:
+        rotateA = 0;
+        rotateB = -1;
+        rotateC = -1;
+        rotateD = 0;
+        break;
+      case 0:
+        rotateA = 1;
+        rotateB = 0;
+        rotateC = 0;
+        rotateD = -1;
+        break;
+      default:
+        throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.");
+    }
+    if (dontFlip) {
+      rotateC = -rotateC;
+      rotateD = -rotateD;
+    }
+    let offsetCanvasX, offsetCanvasY;
+    let width, height;
+    if (rotateA === 0) {
+      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
+      width = (viewBox[3] - viewBox[1]) * scale;
+      height = (viewBox[2] - viewBox[0]) * scale;
+    } else {
+      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
+      width = (viewBox[2] - viewBox[0]) * scale;
+      height = (viewBox[3] - viewBox[1]) * scale;
+    }
+    this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];
+    this.width = width;
+    this.height = height;
+  }
+  get rawDims() {
+    const dims = this.viewBox;
+    return shadow(this, "rawDims", {
+      pageWidth: dims[2] - dims[0],
+      pageHeight: dims[3] - dims[1],
+      pageX: dims[0],
+      pageY: dims[1]
+    });
+  }
+  clone({
+    scale = this.scale,
+    rotation = this.rotation,
+    offsetX = this.offsetX,
+    offsetY = this.offsetY,
+    dontFlip = false
+  } = {}) {
+    return new PageViewport({
+      viewBox: this.viewBox.slice(),
+      userUnit: this.userUnit,
+      scale,
+      rotation,
+      offsetX,
+      offsetY,
+      dontFlip
+    });
+  }
+  convertToViewportPoint(x, y) {
+    const p = [x, y];
+    Util.applyTransform(p, this.transform);
+    return p;
+  }
+  convertToPdfPoint(x, y) {
+    const p = [x, y];
+    Util.applyInverseTransform(p, this.transform);
+    return p;
+  }
+}
+
+;// ./src/display/xfa_text.js
+class XfaText {
+  static textContent(xfa) {
+    const items = [];
+    const output = {
+      items,
+      styles: Object.create(null)
+    };
+    function walk(node) {
+      if (!node) {
+        return;
+      }
+      let str = null;
+      const name = node.name;
+      if (name === "#text") {
+        str = node.value;
+      } else if (!XfaText.shouldBuildText(name)) {
+        return;
+      } else if (node?.attributes?.textContent) {
+        str = node.attributes.textContent;
+      } else if (node.value) {
+        str = node.value;
+      }
+      if (str !== null) {
+        items.push({
+          str
+        });
+      }
+      if (!node.children) {
+        return;
+      }
+      for (const child of node.children) {
+        walk(child);
+      }
+    }
+    walk(xfa);
+    return output;
+  }
+  static shouldBuildText(name) {
+    return !(name === "textarea" || name === "input" || name === "option" || name === "select");
+  }
+}
+
+;// ./src/display/xfa_layer.js
+
+
+class XfaLayer {
+  static setupStorage(html, id, element, storage, intent) {
+    const storedData = storage.getValue(id, {
+      value: null
+    });
+    switch (element.name) {
+      case "textarea":
+        if (storedData.value !== null) {
+          html.textContent = storedData.value;
+        }
+        if (intent === "print") {
+          break;
+        }
+        html.addEventListener("input", event => {
+          storage.setValue(id, {
+            value: event.target.value
+          });
+        });
+        break;
+      case "input":
+        if (element.attributes.type === "radio" || element.attributes.type === "checkbox") {
+          if (storedData.value === element.attributes.xfaOn) {
+            html.setAttribute("checked", true);
+          } else if (storedData.value === element.attributes.xfaOff) {
+            html.removeAttribute("checked");
+          }
+          if (intent === "print") {
+            break;
+          }
+          html.addEventListener("change", event => {
+            storage.setValue(id, {
+              value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff")
+            });
+          });
+        } else {
+          if (storedData.value !== null) {
+            html.setAttribute("value", storedData.value);
+          }
+          if (intent === "print") {
+            break;
+          }
+          html.addEventListener("input", event => {
+            storage.setValue(id, {
+              value: event.target.value
+            });
+          });
+        }
+        break;
+      case "select":
+        if (storedData.value !== null) {
+          html.setAttribute("value", storedData.value);
+          for (const option of element.children) {
+            if (option.attributes.value === storedData.value) {
+              option.attributes.selected = true;
+            } else if (Object.hasOwn(option.attributes, "selected")) {
+              delete option.attributes.selected;
+            }
+          }
+        }
+        html.addEventListener("input", event => {
+          const options = event.target.options;
+          const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value;
+          storage.setValue(id, {
+            value
+          });
+        });
+        break;
+    }
+  }
+  static setAttributes({
+    html,
+    element,
+    storage = null,
+    intent,
+    linkService
+  }) {
+    const {
+      attributes
+    } = element;
+    const isHTMLAnchorElement = html instanceof HTMLAnchorElement;
+    if (attributes.type === "radio") {
+      attributes.name = `${attributes.name}-${intent}`;
+    }
+    for (const [key, value] of Object.entries(attributes)) {
+      if (value === null || value === undefined) {
+        continue;
+      }
+      switch (key) {
+        case "class":
+          if (value.length) {
+            html.setAttribute(key, value.join(" "));
+          }
+          break;
+        case "dataId":
+          break;
+        case "id":
+          html.setAttribute("data-element-id", value);
+          break;
+        case "style":
+          Object.assign(html.style, value);
+          break;
+        case "textContent":
+          html.textContent = value;
+          break;
+        default:
+          if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") {
+            html.setAttribute(key, value);
+          }
+      }
+    }
+    if (isHTMLAnchorElement) {
+      linkService.addLinkAttributes(html, attributes.href, attributes.newWindow);
+    }
+    if (storage && attributes.dataId) {
+      this.setupStorage(html, attributes.dataId, element, storage);
+    }
+  }
+  static render(parameters) {
+    const storage = parameters.annotationStorage;
+    const linkService = parameters.linkService;
+    const root = parameters.xfaHtml;
+    const intent = parameters.intent || "display";
+    const rootHtml = document.createElement(root.name);
+    if (root.attributes) {
+      this.setAttributes({
+        html: rootHtml,
+        element: root,
+        intent,
+        linkService
+      });
+    }
+    const isNotForRichText = intent !== "richText";
+    const rootDiv = parameters.div;
+    rootDiv.append(rootHtml);
+    if (parameters.viewport) {
+      const transform = `matrix(${parameters.viewport.transform.join(",")})`;
+      rootDiv.style.transform = transform;
+    }
+    if (isNotForRichText) {
+      rootDiv.setAttribute("class", "xfaLayer xfaFont");
+    }
+    const textDivs = [];
+    if (root.children.length === 0) {
+      if (root.value) {
+        const node = document.createTextNode(root.value);
+        rootHtml.append(node);
+        if (isNotForRichText && XfaText.shouldBuildText(root.name)) {
+          textDivs.push(node);
+        }
+      }
+      return {
+        textDivs
+      };
+    }
+    const stack = [[root, -1, rootHtml]];
+    while (stack.length > 0) {
+      const [parent, i, html] = stack.at(-1);
+      if (i + 1 === parent.children.length) {
+        stack.pop();
+        continue;
+      }
+      const child = parent.children[++stack.at(-1)[1]];
+      if (child === null) {
+        continue;
+      }
+      const {
+        name
+      } = child;
+      if (name === "#text") {
+        const node = document.createTextNode(child.value);
+        textDivs.push(node);
+        html.append(node);
+        continue;
+      }
+      const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name);
+      html.append(childHtml);
+      if (child.attributes) {
+        this.setAttributes({
+          html: childHtml,
+          element: child,
+          storage,
+          intent,
+          linkService
+        });
+      }
+      if (child.children?.length > 0) {
+        stack.push([child, -1, childHtml]);
+      } else if (child.value) {
+        const node = document.createTextNode(child.value);
+        if (isNotForRichText && XfaText.shouldBuildText(name)) {
+          textDivs.push(node);
+        }
+        childHtml.append(node);
+      }
+    }
+    for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) {
+      el.setAttribute("readOnly", true);
+    }
+    return {
+      textDivs
+    };
+  }
+  static update(parameters) {
+    const transform = `matrix(${parameters.viewport.transform.join(",")})`;
+    parameters.div.style.transform = transform;
+    parameters.div.hidden = false;
+  }
+  static getPageViewport(xfaPage, {
+    scale = 1,
+    rotation = 0
+  }) {
+    const {
+      width,
+      height
+    } = xfaPage.attributes.style;
+    return new PageViewport({
+      viewBox: [0, 0, parseInt(width, 10), parseInt(height, 10)],
+      userUnit: 1,
+      scale,
+      rotation
+    });
+  }
+}
+
+;// ./src/display/display_utils.js
+
+
+
+
+class PixelsPerInch {
+  static CSS = 96.0;
+  static PDF = 72.0;
+  static PDF_TO_CSS_UNITS = this.CSS / this.PDF;
+}
+async function fetchData(url, type = "text") {
+  if (isValidFetchUrl(url, document.baseURI)) {
+    const response = await fetch(url);
+    if (!response.ok) {
+      throw new Error(response.statusText);
+    }
+    switch (type) {
+      case "blob":
+        return response.blob();
+      case "bytes":
+        return response.bytes();
+      case "json":
+        return response.json();
+    }
+    return response.text();
+  }
+  return new Promise((resolve, reject) => {
+    const request = new XMLHttpRequest();
+    request.open("GET", url, true);
+    request.responseType = type === "bytes" ? "arraybuffer" : type;
+    request.onreadystatechange = () => {
+      if (request.readyState !== XMLHttpRequest.DONE) {
+        return;
+      }
+      if (request.status === 200 || request.status === 0) {
+        switch (type) {
+          case "bytes":
+            resolve(new Uint8Array(request.response));
+            return;
+          case "blob":
+          case "json":
+            resolve(request.response);
+            return;
+        }
+        resolve(request.responseText);
+        return;
+      }
+      reject(new Error(request.statusText));
+    };
+    request.send(null);
+  });
+}
+class RenderingCancelledException extends BaseException {
+  constructor(msg, extraDelay = 0) {
+    super(msg, "RenderingCancelledException");
+    this.extraDelay = extraDelay;
+  }
+}
+function isDataScheme(url) {
+  const ii = url.length;
+  let i = 0;
+  while (i < ii && url[i].trim() === "") {
+    i++;
+  }
+  return url.substring(i, i + 5).toLowerCase() === "data:";
+}
+function isPdfFile(filename) {
+  return typeof filename === "string" && /\.pdf$/i.test(filename);
+}
+function getFilenameFromUrl(url) {
+  [url] = url.split(/[#?]/, 1);
+  return stripPath(url);
+}
+function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") {
+  if (typeof url !== "string") {
+    return defaultFilename;
+  }
+  if (isDataScheme(url)) {
+    warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.');
+    return defaultFilename;
+  }
+  const getURL = urlString => {
+    try {
+      return new URL(urlString);
+    } catch {}
+    try {
+      return new URL(decodeURIComponent(urlString));
+    } catch {}
+    try {
+      return new URL(urlString, "https://foo.bar");
+    } catch {}
+    try {
+      return new URL(decodeURIComponent(urlString), "https://foo.bar");
+    } catch {}
+    return null;
+  };
+  const newURL = getURL(url);
+  if (!newURL) {
+    return defaultFilename;
+  }
+  const decode = name => {
+    try {
+      let decoded = decodeURIComponent(name);
+      if (decoded.includes("/")) {
+        decoded = stripPath(decoded);
+        if (decoded.length === 4 && pdfRegex.test(decoded)) {
+          return name;
+        }
+      }
+      return decoded;
+    } catch {
+      return name;
+    }
+  };
+  const pdfRegex = /\.pdf$/i;
+  const filename = stripPath(newURL.pathname);
+  if (pdfRegex.test(filename)) {
+    return decode(filename);
+  }
+  if (newURL.searchParams.size > 0) {
+    const getLast = iterator => [...iterator].findLast(v => pdfRegex.test(v));
+    const name = getLast(newURL.searchParams.values()) ?? getLast(newURL.searchParams.keys());
+    if (name) {
+      return decode(name);
+    }
+  }
+  if (newURL.hash) {
+    const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
+    const hashFilename = reFilename.exec(newURL.hash);
+    if (hashFilename) {
+      return decode(hashFilename[0]);
+    }
+  }
+  return defaultFilename;
+}
+class StatTimer {
+  #started = new Map();
+  times = [];
+  time(name) {
+    if (this.#started.has(name)) {
+      warn(`Timer is already running for ${name}`);
+    }
+    this.#started.set(name, Date.now());
+  }
+  timeEnd(name) {
+    if (!this.#started.has(name)) {
+      warn(`Timer has not been started for ${name}`);
+    }
+    this.times.push({
+      name,
+      start: this.#started.get(name),
+      end: Date.now()
+    });
+    this.#started.delete(name);
+  }
+  toString() {
+    const longest = Math.max(...this.times.map(t => t.name.length));
+    return this.times.map(t => `${t.name.padEnd(longest)} ${t.end - t.start}ms\n`).join("");
+  }
+}
+function isValidFetchUrl(url, baseUrl) {
+  const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);
+  return /https?:/.test(res?.protocol ?? "");
+}
+function noContextMenu(e) {
+  e.preventDefault();
+}
+function stopEvent(e) {
+  e.preventDefault();
+  e.stopPropagation();
+}
+function deprecated(details) {
+  console.log("Deprecated API usage: " + details);
+}
+class PDFDateString {
+  static #regex;
+  static toDateObject(input) {
+    if (input instanceof Date) {
+      return input;
+    }
+    if (!input || typeof input !== "string") {
+      return null;
+    }
+    this.#regex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+\\-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?");
+    const matches = this.#regex.exec(input);
+    if (!matches) {
+      return null;
+    }
+    const year = parseInt(matches[1], 10);
+    let month = parseInt(matches[2], 10);
+    month = month >= 1 && month <= 12 ? month - 1 : 0;
+    let day = parseInt(matches[3], 10);
+    day = day >= 1 && day <= 31 ? day : 1;
+    let hour = parseInt(matches[4], 10);
+    hour = hour >= 0 && hour <= 23 ? hour : 0;
+    let minute = parseInt(matches[5], 10);
+    minute = minute >= 0 && minute <= 59 ? minute : 0;
+    let second = parseInt(matches[6], 10);
+    second = second >= 0 && second <= 59 ? second : 0;
+    const universalTimeRelation = matches[7] || "Z";
+    let offsetHour = parseInt(matches[8], 10);
+    offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;
+    let offsetMinute = parseInt(matches[9], 10) || 0;
+    offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;
+    if (universalTimeRelation === "-") {
+      hour += offsetHour;
+      minute += offsetMinute;
+    } else if (universalTimeRelation === "+") {
+      hour -= offsetHour;
+      minute -= offsetMinute;
+    }
+    return new Date(Date.UTC(year, month, day, hour, minute, second));
+  }
+}
+function getRGBA(color) {
+  if (color.startsWith("#")) {
+    const hex = color.slice(1);
+    return [parseInt(hex.slice(0, 2), 16), parseInt(hex.slice(2, 4), 16), parseInt(hex.slice(4, 6), 16), hex.length >= 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1];
+  }
+  if (color.startsWith("rgb(")) {
+    const [r, g, b] = color.slice(4, -1).split(",").map(x => parseInt(x, 10));
+    return [r, g, b, 1];
+  }
+  if (color.startsWith("rgba(")) {
+    const parts = color.slice(5, -1).split(",");
+    return [parseInt(parts[0], 10), parseInt(parts[1], 10), parseInt(parts[2], 10), parseFloat(parts[3])];
+  }
+  const m = color.match(/^color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*([\d.]+|none))?\)$/);
+  if (m) {
+    return [Math.round(parseFloat(m[1]) * 255), Math.round(parseFloat(m[2]) * 255), Math.round(parseFloat(m[3]) * 255), m[4] !== undefined && m[4] !== "none" ? parseFloat(m[4]) : 1];
+  }
+  return null;
+}
+function getRGB(color) {
+  const rgba = getRGBA(color);
+  if (!rgba) {
+    warn(`Not a valid color format: "${color}"`);
+    return [0, 0, 0];
+  }
+  return rgba.slice(0, 3);
+}
+function getColorValues(colors) {
+  const span = document.createElement("span");
+  span.style.visibility = "hidden";
+  span.style.colorScheme = "only light";
+  document.body.append(span);
+  for (const name of colors.keys()) {
+    span.style.color = name;
+    const computedColor = window.getComputedStyle(span).color;
+    colors.set(name, getRGB(computedColor));
+  }
+  span.remove();
+}
+function getCurrentTransform(ctx) {
+  const {
+    a,
+    b,
+    c,
+    d,
+    e,
+    f
+  } = ctx.getTransform();
+  return [a, b, c, d, e, f];
+}
+function getCurrentTransformInverse(ctx) {
+  const {
+    a,
+    b,
+    c,
+    d,
+    e,
+    f
+  } = ctx.getTransform().invertSelf();
+  return [a, b, c, d, e, f];
+}
+function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) {
+  if (viewport instanceof PageViewport) {
+    const {
+      pageWidth,
+      pageHeight
+    } = viewport.rawDims;
+    const {
+      style
+    } = div;
+    const widthStr = `round(down, var(--total-scale-factor) * ${pageWidth}px, var(--scale-round-x))`,
+      heightStr = `round(down, var(--total-scale-factor) * ${pageHeight}px, var(--scale-round-y))`;
+    if (!mustFlip || viewport.rotation % 180 === 0) {
+      style.width = widthStr;
+      style.height = heightStr;
+    } else {
+      style.width = heightStr;
+      style.height = widthStr;
+    }
+  }
+  if (mustRotate) {
+    div.setAttribute("data-main-rotation", viewport.rotation);
+  }
+}
+class OutputScale {
+  constructor() {
+    const {
+      pixelRatio
+    } = OutputScale;
+    this.sx = pixelRatio;
+    this.sy = pixelRatio;
+  }
+  get scaled() {
+    return this.sx !== 1 || this.sy !== 1;
+  }
+  get symmetric() {
+    return this.sx === this.sy;
+  }
+  limitCanvas(width, height, maxPixels, maxDim, capAreaFactor = -1) {
+    let maxAreaScale = Infinity,
+      maxWidthScale = Infinity,
+      maxHeightScale = Infinity;
+    maxPixels = OutputScale.capPixels(maxPixels, capAreaFactor);
+    if (maxPixels > 0) {
+      maxAreaScale = Math.sqrt(maxPixels / (width * height));
+    }
+    if (maxDim !== -1) {
+      maxWidthScale = maxDim / width;
+      maxHeightScale = maxDim / height;
+    }
+    const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale);
+    if (this.sx > maxScale || this.sy > maxScale) {
+      this.sx = maxScale;
+      this.sy = maxScale;
+      return true;
+    }
+    return false;
+  }
+  static get pixelRatio() {
+    return globalThis.devicePixelRatio || 1;
+  }
+  static capPixels(maxPixels, capAreaFactor) {
+    if (capAreaFactor >= 0) {
+      const winPixels = Math.ceil(window.screen.availWidth * window.screen.availHeight * this.pixelRatio ** 2 * (1 + capAreaFactor / 100));
+      return maxPixels > 0 ? Math.min(maxPixels, winPixels) : winPixels;
+    }
+    return maxPixels;
+  }
+}
+const SupportedImageMimeTypes = ["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 element = document.createElement("span");
+    element.classList.add("comment", "sidebar");
+    const {
+      style
+    } = element;
+    style.width = style.height = "0";
+    style.display = "none";
+    style.color = "var(--comment-fg-color)";
+    document.body.append(element);
+    const {
+      color
+    } = window.getComputedStyle(element);
+    element.remove();
+    return shadow(this, "commentForegroundColor", getRGB(color));
+  }
+}
+function applyOpacity(color, opacity) {
+  opacity = MathClamp(opacity ?? 1, 0, 1);
+  const white = 255 * (1 - opacity);
+  return color.map(c => Math.round(c * opacity + white));
+}
+function RGBToHSL(rgb, output) {
+  const r = rgb[0] / 255;
+  const g = rgb[1] / 255;
+  const b = rgb[2] / 255;
+  const max = Math.max(r, g, b);
+  const min = Math.min(r, g, b);
+  const l = (max + min) / 2;
+  if (max === min) {
+    output[0] = output[1] = 0;
+  } else {
+    const d = max - min;
+    output[1] = l < 0.5 ? d / (max + min) : d / (2 - max - min);
+    switch (max) {
+      case r:
+        output[0] = ((g - b) / d + (g < b ? 6 : 0)) * 60;
+        break;
+      case g:
+        output[0] = ((b - r) / d + 2) * 60;
+        break;
+      case b:
+        output[0] = ((r - g) / d + 4) * 60;
+        break;
+    }
+  }
+  output[2] = l;
+}
+function HSLToRGB(hsl, output) {
+  const h = hsl[0];
+  const s = hsl[1];
+  const l = hsl[2];
+  const c = (1 - Math.abs(2 * l - 1)) * s;
+  const x = c * (1 - Math.abs(h / 60 % 2 - 1));
+  const m = l - c / 2;
+  switch (Math.floor(h / 60)) {
+    case 0:
+      output[0] = c + m;
+      output[1] = x + m;
+      output[2] = m;
+      break;
+    case 1:
+      output[0] = x + m;
+      output[1] = c + m;
+      output[2] = m;
+      break;
+    case 2:
+      output[0] = m;
+      output[1] = c + m;
+      output[2] = x + m;
+      break;
+    case 3:
+      output[0] = m;
+      output[1] = x + m;
+      output[2] = c + m;
+      break;
+    case 4:
+      output[0] = x + m;
+      output[1] = m;
+      output[2] = c + m;
+      break;
+    case 5:
+    case 6:
+      output[0] = c + m;
+      output[1] = m;
+      output[2] = x + m;
+      break;
+  }
+}
+function computeLuminance(x) {
+  return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;
+}
+function contrastRatio(hsl1, hsl2, output) {
+  HSLToRGB(hsl1, output);
+  output.map(computeLuminance);
+  const lum1 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2];
+  HSLToRGB(hsl2, output);
+  output.map(computeLuminance);
+  const lum2 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2];
+  return lum1 > lum2 ? (lum1 + 0.05) / (lum2 + 0.05) : (lum2 + 0.05) / (lum1 + 0.05);
+}
+const contrastCache = new Map();
+function findContrastColor(baseColor, fixedColor) {
+  const key = baseColor[0] + baseColor[1] * 0x100 + baseColor[2] * 0x10000 + fixedColor[0] * 0x1000000 + fixedColor[1] * 0x100000000 + fixedColor[2] * 0x10000000000;
+  let cachedValue = contrastCache.get(key);
+  if (cachedValue) {
+    return cachedValue;
+  }
+  const array = new Float32Array(9);
+  const output = array.subarray(0, 3);
+  const baseHSL = array.subarray(3, 6);
+  RGBToHSL(baseColor, baseHSL);
+  const fixedHSL = array.subarray(6, 9);
+  RGBToHSL(fixedColor, fixedHSL);
+  const isFixedColorDark = fixedHSL[2] < 0.5;
+  const minContrast = isFixedColorDark ? 12 : 4.5;
+  baseHSL[2] = isFixedColorDark ? Math.sqrt(baseHSL[2]) : 1 - Math.sqrt(1 - baseHSL[2]);
+  if (contrastRatio(baseHSL, fixedHSL, output) < minContrast) {
+    let start, end;
+    if (isFixedColorDark) {
+      start = baseHSL[2];
+      end = 1;
+    } else {
+      start = 0;
+      end = baseHSL[2];
+    }
+    const PRECISION = 0.005;
+    while (end - start > PRECISION) {
+      const mid = baseHSL[2] = (start + end) / 2;
+      if (isFixedColorDark === contrastRatio(baseHSL, fixedHSL, output) < minContrast) {
+        start = mid;
+      } else {
+        end = mid;
+      }
+    }
+    baseHSL[2] = isFixedColorDark ? end : start;
+  }
+  HSLToRGB(baseHSL, output);
+  cachedValue = Util.makeHexColor(Math.round(output[0] * 255), Math.round(output[1] * 255), Math.round(output[2] * 255));
+  contrastCache.set(key, cachedValue);
+  return cachedValue;
+}
+function renderRichText({
+  html,
+  dir,
+  className
+}, container) {
+  const fragment = document.createDocumentFragment();
+  if (typeof html === "string") {
+    const p = document.createElement("p");
+    p.dir = dir || "auto";
+    const lines = html.split(/\r\n?|\n/);
+    for (let i = 0, ii = lines.length; i < ii; ++i) {
+      const line = lines[i];
+      p.append(document.createTextNode(line));
+      if (i < ii - 1) {
+        p.append(document.createElement("br"));
+      }
+    }
+    fragment.append(p);
+  } else {
+    XfaLayer.render({
+      xfaHtml: html,
+      div: fragment,
+      intent: "richText"
+    });
+  }
+  fragment.firstElementChild.classList.add("richText", className);
+  container.append(fragment);
+}
+function makePathFromDrawOPS(data) {
+  const path = new Path2D();
+  if (!data) {
+    return path;
+  }
+  for (let i = 0, ii = data.length; i < ii;) {
+    switch (data[i++]) {
+      case DrawOPS.moveTo:
+        path.moveTo(data[i++], data[i++]);
+        break;
+      case DrawOPS.lineTo:
+        path.lineTo(data[i++], data[i++]);
+        break;
+      case DrawOPS.curveTo:
+        path.bezierCurveTo(data[i++], data[i++], data[i++], data[i++], data[i++], data[i++]);
+        break;
+      case DrawOPS.quadraticCurveTo:
+        path.quadraticCurveTo(data[i++], data[i++], data[i++], data[i++]);
+        break;
+      case DrawOPS.closePath:
+        path.closePath();
+        break;
+      default:
+        warn(`Unrecognized drawing path operator: ${data[i - 1]}`);
+        break;
+    }
+  }
+  return path;
+}
+
+;// ./src/display/editor/toolbar.js
+
+class EditorToolbar {
+  #toolbar = null;
+  #colorPicker = null;
+  #editor;
+  #buttons = null;
+  #altText = null;
+  #comment = null;
+  #commentButtonDivider = null;
+  #signatureDescriptionButton = null;
+  static #l10nRemove = null;
+  constructor(editor) {
+    this.#editor = editor;
+    EditorToolbar.#l10nRemove ||= Object.freeze({
+      freetext: "pdfjs-editor-remove-freetext-button",
+      highlight: "pdfjs-editor-remove-highlight-button",
+      ink: "pdfjs-editor-remove-ink-button",
+      stamp: "pdfjs-editor-remove-stamp-button",
+      signature: "pdfjs-editor-remove-signature-button"
+    });
+  }
+  render() {
+    const editToolbar = this.#toolbar = document.createElement("div");
+    editToolbar.classList.add("editToolbar", "hidden");
+    editToolbar.setAttribute("role", "toolbar");
+    const signal = this.#editor._uiManager._signal;
+    if (signal instanceof AbortSignal && !signal.aborted) {
+      editToolbar.addEventListener("contextmenu", noContextMenu, {
+        signal
+      });
+      editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, {
+        signal
+      });
+    }
+    const buttons = this.#buttons = document.createElement("div");
+    buttons.className = "buttons";
+    editToolbar.append(buttons);
+    const position = this.#editor.toolbarPosition;
+    if (position) {
+      const {
+        style
+      } = editToolbar;
+      const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0];
+      style.insetInlineEnd = `${100 * x}%`;
+      style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`;
+    }
+    return editToolbar;
+  }
+  get div() {
+    return this.#toolbar;
+  }
+  static #pointerDown(e) {
+    e.stopPropagation();
+  }
+  #focusIn(e) {
+    this.#editor._focusEventsAllowed = false;
+    stopEvent(e);
+  }
+  #focusOut(e) {
+    this.#editor._focusEventsAllowed = true;
+    stopEvent(e);
+  }
+  #addListenersToElement(element) {
+    const signal = this.#editor._uiManager._signal;
+    if (!(signal instanceof AbortSignal) || signal.aborted) {
+      return false;
+    }
+    element.addEventListener("focusin", this.#focusIn.bind(this), {
+      capture: true,
+      signal
+    });
+    element.addEventListener("focusout", this.#focusOut.bind(this), {
+      capture: true,
+      signal
+    });
+    element.addEventListener("contextmenu", noContextMenu, {
+      signal
+    });
+    return true;
+  }
+  hide() {
+    this.#toolbar.classList.add("hidden");
+    this.#colorPicker?.hideDropdown();
+  }
+  show() {
+    this.#toolbar.classList.remove("hidden");
+    this.#altText?.shown();
+    this.#comment?.shown();
+  }
+  addDeleteButton() {
+    const {
+      editorType,
+      _uiManager
+    } = this.#editor;
+    const button = document.createElement("button");
+    button.classList.add("basic", "deleteButton");
+    button.tabIndex = 0;
+    button.setAttribute("data-l10n-id", EditorToolbar.#l10nRemove[editorType]);
+    if (this.#addListenersToElement(button)) {
+      button.addEventListener("click", e => {
+        _uiManager.delete();
+      }, {
+        signal: _uiManager._signal
+      });
+    }
+    this.#buttons.append(button);
+  }
+  get #divider() {
+    const divider = document.createElement("div");
+    divider.className = "divider";
+    return divider;
+  }
+  async addAltText(altText) {
+    const button = await altText.render();
+    this.#addListenersToElement(button);
+    this.#buttons.append(button, this.#divider);
+    this.#altText = altText;
+  }
+  addComment(comment, beforeElement = null) {
+    if (this.#comment) {
+      return;
+    }
+    const button = comment.renderForToolbar();
+    if (!button) {
+      return;
+    }
+    this.#addListenersToElement(button);
+    const divider = this.#commentButtonDivider = this.#divider;
+    if (!beforeElement) {
+      this.#buttons.append(button, divider);
+    } else {
+      this.#buttons.insertBefore(button, beforeElement);
+      this.#buttons.insertBefore(divider, beforeElement);
+    }
+    this.#comment = comment;
+    comment.toolbar = this;
+  }
+  addColorPicker(colorPicker) {
+    if (this.#colorPicker) {
+      return;
+    }
+    this.#colorPicker = colorPicker;
+    const button = colorPicker.renderButton();
+    this.#addListenersToElement(button);
+    this.#buttons.append(button, this.#divider);
+  }
+  async addEditSignatureButton(signatureManager) {
+    const button = this.#signatureDescriptionButton = await signatureManager.renderEditButton(this.#editor);
+    this.#addListenersToElement(button);
+    this.#buttons.append(button, this.#divider);
+  }
+  removeButton(name) {
+    switch (name) {
+      case "comment":
+        this.#comment?.removeToolbarCommentButton();
+        this.#comment = null;
+        this.#commentButtonDivider?.remove();
+        this.#commentButtonDivider = null;
+        break;
+    }
+  }
+  async addButton(name, tool) {
+    switch (name) {
+      case "colorPicker":
+        if (tool) {
+          this.addColorPicker(tool);
+        }
+        break;
+      case "altText":
+        if (tool) {
+          await this.addAltText(tool);
+        }
+        break;
+      case "editSignature":
+        if (tool) {
+          await this.addEditSignatureButton(tool);
+        }
+        break;
+      case "delete":
+        this.addDeleteButton();
+        break;
+      case "comment":
+        if (tool) {
+          this.addComment(tool);
+        }
+        break;
+    }
+  }
+  async addButtonBefore(name, tool, beforeSelector) {
+    if (!tool && name === "comment") {
+      return;
+    }
+    const beforeElement = this.#buttons.querySelector(beforeSelector);
+    if (!beforeElement) {
+      return;
+    }
+    if (name === "comment") {
+      this.addComment(tool, beforeElement);
+    }
+  }
+  updateEditSignatureButton(description) {
+    if (this.#signatureDescriptionButton) {
+      this.#signatureDescriptionButton.title = description;
+    }
+  }
+  remove() {
+    this.#toolbar.remove();
+    this.#colorPicker?.destroy();
+    this.#colorPicker = null;
+  }
+}
+class FloatingToolbar {
+  #buttons = null;
+  #toolbar = null;
+  #uiManager;
+  constructor(uiManager) {
+    this.#uiManager = uiManager;
+  }
+  #render() {
+    const editToolbar = this.#toolbar = document.createElement("div");
+    editToolbar.className = "editToolbar";
+    editToolbar.setAttribute("role", "toolbar");
+    const signal = this.#uiManager._signal;
+    if (signal instanceof AbortSignal && !signal.aborted) {
+      editToolbar.addEventListener("contextmenu", noContextMenu, {
+        signal
+      });
+    }
+    const buttons = this.#buttons = document.createElement("div");
+    buttons.className = "buttons";
+    editToolbar.append(buttons);
+    if (this.#uiManager.hasCommentManager()) {
+      this.#makeButton("commentButton", `pdfjs-comment-floating-button`, "pdfjs-comment-floating-button-label", () => {
+        this.#uiManager.commentSelection("floating_button");
+      });
+    }
+    this.#makeButton("highlightButton", `pdfjs-highlight-floating-button1`, "pdfjs-highlight-floating-button-label", () => {
+      this.#uiManager.highlightSelection("floating_button");
+    });
+    return editToolbar;
+  }
+  #getLastPoint(boxes, isLTR) {
+    let lastY = 0;
+    let lastX = 0;
+    for (const box of boxes) {
+      const y = box.y + box.height;
+      if (y < lastY) {
+        continue;
+      }
+      const x = box.x + (isLTR ? box.width : 0);
+      if (y > lastY) {
+        lastX = x;
+        lastY = y;
+        continue;
+      }
+      if (isLTR) {
+        if (x > lastX) {
+          lastX = x;
+        }
+      } else if (x < lastX) {
+        lastX = x;
+      }
+    }
+    return [isLTR ? 1 - lastX : lastX, lastY];
+  }
+  show(parent, boxes, isLTR) {
+    const [x, y] = this.#getLastPoint(boxes, isLTR);
+    const {
+      style
+    } = this.#toolbar ||= this.#render();
+    parent.append(this.#toolbar);
+    style.insetInlineEnd = `${100 * x}%`;
+    style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`;
+  }
+  hide() {
+    this.#toolbar.remove();
+  }
+  #makeButton(buttonClass, l10nId, labelL10nId, clickHandler) {
+    const button = document.createElement("button");
+    button.classList.add("basic", buttonClass);
+    button.tabIndex = 0;
+    button.setAttribute("data-l10n-id", l10nId);
+    const span = document.createElement("span");
+    button.append(span);
+    span.className = "visuallyHidden";
+    span.setAttribute("data-l10n-id", labelL10nId);
+    const signal = this.#uiManager._signal;
+    if (signal instanceof AbortSignal && !signal.aborted) {
+      button.addEventListener("contextmenu", noContextMenu, {
+        signal
+      });
+      button.addEventListener("click", clickHandler, {
+        signal
+      });
+    }
+    this.#buttons.append(button);
+  }
+}
+
+;// ./src/shared/internal_evt.js
+const INTERNAL_EVT = "d3d019bf-c73b-49f4-94f3-e62eb099fd62";
+const internalOpt = Object.freeze({
+  internal: INTERNAL_EVT
+});
+
+;// ./src/display/editor/tools.js
+
+
+
+
+function bindEvents(obj, element, names) {
+  for (const name of names) {
+    element.addEventListener(name, obj[name].bind(obj));
+  }
+}
+class CurrentPointers {
+  static #pointerId = NaN;
+  static #pointerIds = null;
+  static #moveTimestamp = NaN;
+  static #pointerType = null;
+  static initializeAndAddPointerId(pointerId) {
+    (CurrentPointers.#pointerIds ||= new Set()).add(pointerId);
+  }
+  static setPointer(pointerType, pointerId) {
+    CurrentPointers.#pointerId ||= pointerId;
+    CurrentPointers.#pointerType ??= pointerType;
+  }
+  static setTimeStamp(timeStamp) {
+    CurrentPointers.#moveTimestamp = timeStamp;
+  }
+  static isSamePointerId(pointerId) {
+    return CurrentPointers.#pointerId === pointerId;
+  }
+  static isSamePointerIdOrRemove(pointerId) {
+    if (CurrentPointers.#pointerId === pointerId) {
+      return true;
+    }
+    CurrentPointers.#pointerIds?.delete(pointerId);
+    return false;
+  }
+  static isSamePointerType(pointerType) {
+    return CurrentPointers.#pointerType === pointerType;
+  }
+  static isInitializedAndDifferentPointerType(pointerType) {
+    return CurrentPointers.#pointerType !== null && !CurrentPointers.isSamePointerType(pointerType);
+  }
+  static isSameTimeStamp(timeStamp) {
+    return CurrentPointers.#moveTimestamp === timeStamp;
+  }
+  static isUsingMultiplePointers() {
+    return CurrentPointers.#pointerIds?.size >= 1;
+  }
+  static clearPointerType() {
+    CurrentPointers.#pointerType = null;
+  }
+  static clearPointerIds() {
+    CurrentPointers.#pointerId = NaN;
+    CurrentPointers.#pointerIds = null;
+  }
+  static clearTimeStamp() {
+    CurrentPointers.#moveTimestamp = NaN;
+  }
+}
+class IdManager {
+  #id = 0;
+  get id() {
+    return `${AnnotationEditorPrefix}${this.#id++}`;
+  }
+}
+class ImageManager {
+  #baseId = getUuid();
+  #id = 0;
+  #cache = null;
+  static get _isSVGFittingCanvas() {
+    const svg = `data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 1 1" width="1" height="1" xmlns="${SVG_NS}"><rect width="1" height="1" style="fill:red;"/></svg>`;
+    const canvas = new OffscreenCanvas(1, 3);
+    const ctx = canvas.getContext("2d", {
+      willReadFrequently: true
+    });
+    const image = new Image();
+    image.src = svg;
+    const promise = image.decode().then(() => {
+      ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);
+      return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;
+    });
+    return shadow(this, "_isSVGFittingCanvas", promise);
+  }
+  async #get(key, rawData) {
+    this.#cache ||= new Map();
+    let data = this.#cache.get(key);
+    if (data === null) {
+      return null;
+    }
+    if (data?.bitmap) {
+      data.refCounter += 1;
+      return data;
+    }
+    try {
+      data ||= {
+        bitmap: null,
+        id: `image_${this.#baseId}_${this.#id++}`,
+        refCounter: 0,
+        isSvg: false
+      };
+      let image;
+      if (typeof rawData === "string") {
+        data.url = rawData;
+        image = await fetchData(rawData, "blob");
+      } else if (rawData instanceof File) {
+        image = data.file = rawData;
+      } else if (rawData instanceof Blob) {
+        image = rawData;
+      }
+      if (image.type === "image/svg+xml") {
+        const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas;
+        const fileReader = new FileReader();
+        const imageElement = new Image();
+        const imagePromise = new Promise((resolve, reject) => {
+          imageElement.onload = () => {
+            data.bitmap = imageElement;
+            data.isSvg = true;
+            resolve();
+          };
+          fileReader.onload = async () => {
+            const url = data.svgUrl = fileReader.result;
+            imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url;
+          };
+          imageElement.onerror = fileReader.onerror = reject;
+        });
+        fileReader.readAsDataURL(image);
+        await imagePromise;
+      } else {
+        data.bitmap = await createImageBitmap(image);
+      }
+      data.refCounter = 1;
+    } catch (e) {
+      warn(e);
+      data = null;
+    }
+    this.#cache.set(key, data);
+    if (data) {
+      this.#cache.set(data.id, data);
+    }
+    return data;
+  }
+  async getFromFile(file) {
+    const {
+      lastModified,
+      name,
+      size,
+      type
+    } = file;
+    return this.#get(`${lastModified}_${name}_${size}_${type}`, file);
+  }
+  async getFromUrl(url) {
+    return this.#get(url, url);
+  }
+  async getFromBlob(id, blobPromise) {
+    const blob = await blobPromise;
+    return this.#get(id, blob);
+  }
+  async getFromId(id) {
+    this.#cache ||= new Map();
+    const data = this.#cache.get(id);
+    if (!data) {
+      return null;
+    }
+    if (data.bitmap) {
+      data.refCounter += 1;
+      return data;
+    }
+    if (data.file) {
+      return this.getFromFile(data.file);
+    }
+    if (data.blobPromise) {
+      const {
+        blobPromise
+      } = data;
+      delete data.blobPromise;
+      return this.getFromBlob(data.id, blobPromise);
+    }
+    return this.getFromUrl(data.url);
+  }
+  getFromCanvas(id, canvas) {
+    this.#cache ||= new Map();
+    let data = this.#cache.get(id);
+    if (data?.bitmap) {
+      data.refCounter += 1;
+      return data;
+    }
+    const offscreen = new OffscreenCanvas(canvas.width, canvas.height);
+    const ctx = offscreen.getContext("2d");
+    ctx.drawImage(canvas, 0, 0);
+    data = {
+      bitmap: offscreen.transferToImageBitmap(),
+      id: `image_${this.#baseId}_${this.#id++}`,
+      refCounter: 1,
+      isSvg: false
+    };
+    this.#cache.set(id, data);
+    this.#cache.set(data.id, data);
+    return data;
+  }
+  getSvgUrl(id) {
+    const data = this.#cache.get(id);
+    if (!data?.isSvg) {
+      return null;
+    }
+    return data.svgUrl;
+  }
+  deleteId(id) {
+    this.#cache ||= new Map();
+    const data = this.#cache.get(id);
+    if (!data) {
+      return;
+    }
+    data.refCounter -= 1;
+    if (data.refCounter !== 0) {
+      return;
+    }
+    const {
+      bitmap
+    } = data;
+    if (!data.url && !data.file) {
+      const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);
+      const ctx = canvas.getContext("bitmaprenderer");
+      ctx.transferFromImageBitmap(bitmap);
+      data.blobPromise = canvas.convertToBlob();
+    }
+    bitmap.close?.();
+    data.bitmap = null;
+  }
+  isValidId(id) {
+    return id.startsWith(`image_${this.#baseId}_`);
+  }
+}
+class CommandManager {
+  #commands = [];
+  #locked = false;
+  #maxSize;
+  #position = -1;
+  constructor(maxSize = 128) {
+    this.#maxSize = maxSize;
+  }
+  add({
+    cmd,
+    undo,
+    post,
+    mustExec,
+    type = NaN,
+    overwriteIfSameType = false,
+    keepUndo = false
+  }) {
+    if (mustExec) {
+      cmd();
+    }
+    if (this.#locked) {
+      return;
+    }
+    const save = {
+      cmd,
+      undo,
+      post,
+      type
+    };
+    if (this.#position === -1) {
+      if (this.#commands.length > 0) {
+        this.#commands.length = 0;
+      }
+      this.#position = 0;
+      this.#commands.push(save);
+      return;
+    }
+    if (overwriteIfSameType && this.#commands[this.#position].type === type) {
+      if (keepUndo) {
+        save.undo = this.#commands[this.#position].undo;
+      }
+      this.#commands[this.#position] = save;
+      return;
+    }
+    const next = this.#position + 1;
+    if (next === this.#maxSize) {
+      this.#commands.splice(0, 1);
+    } else {
+      this.#position = next;
+      if (next < this.#commands.length) {
+        this.#commands.splice(next);
+      }
+    }
+    this.#commands.push(save);
+  }
+  undo() {
+    if (this.#position === -1) {
+      return;
+    }
+    this.#locked = true;
+    const {
+      undo,
+      post
+    } = this.#commands[this.#position];
+    undo();
+    post?.();
+    this.#locked = false;
+    this.#position -= 1;
+  }
+  redo() {
+    if (this.#position < this.#commands.length - 1) {
+      this.#position += 1;
+      this.#locked = true;
+      const {
+        cmd,
+        post
+      } = this.#commands[this.#position];
+      cmd();
+      post?.();
+      this.#locked = false;
+    }
+  }
+  hasSomethingToUndo() {
+    return this.#position !== -1;
+  }
+  hasSomethingToRedo() {
+    return this.#position < this.#commands.length - 1;
+  }
+  cleanType(type) {
+    if (this.#position === -1) {
+      return;
+    }
+    for (let i = this.#position; i >= 0; i--) {
+      if (this.#commands[i].type !== type) {
+        this.#commands.splice(i + 1, this.#position - i);
+        this.#position = i;
+        return;
+      }
+    }
+    this.#commands.length = 0;
+    this.#position = -1;
+  }
+  destroy() {
+    this.#commands = null;
+  }
+}
+class KeyboardManager {
+  static ALT = 0x1;
+  static CTRL = 0x2;
+  static META = 0x4;
+  static SHIFT = 0x8;
+  constructor(callbacks) {
+    this.callbacks = new Map();
+    const {
+      isMac
+    } = FeatureTest.platform;
+    for (const [keys, callback, options = {}] of callbacks) {
+      const hasMacOverride = keys.some(k => k.startsWith("mac+"));
+      for (const key of keys) {
+        let shortcut = key;
+        if (hasMacOverride) {
+          const isMacKey = key.startsWith("mac+");
+          if (isMac !== isMacKey) {
+            continue;
+          }
+          if (isMacKey) {
+            shortcut = key.slice(4);
+          }
+        }
+        const [keyName, modifiers] = KeyboardManager.#parseShortcut(shortcut);
+        if (keyName === null) {
+          continue;
+        }
+        this.callbacks.getOrInsertComputed(keyName, makeArr).push({
+          callback,
+          options,
+          modifiers
+        });
+      }
+    }
+  }
+  static #parseShortcut(value) {
+    let keyPart = null;
+    let modifiers = 0;
+    for (let part of value.split("+")) {
+      part = part.trim();
+      if (!part) {
+        continue;
+      }
+      const upper = part.toUpperCase();
+      const modifier = KeyboardManager[upper];
+      if (modifier) {
+        modifiers |= modifier;
+        continue;
+      }
+      if (keyPart !== null) {
+        warn(`KeyboardManager: multiple keys in shortcut "${value}"`);
+        break;
+      }
+      keyPart = upper === "SPACE" ? " " : part;
+    }
+    if (keyPart === null) {
+      warn(`KeyboardManager: no key found in shortcut "${value}"`);
+    }
+    return [keyPart, modifiers];
+  }
+  static #codeToKey(code) {
+    const match = /^(?:Key([A-Z])|(?:Digit|Numpad)(\d))$/.exec(code);
+    if (!match) {
+      return null;
+    }
+    return match[1]?.toLowerCase() ?? match[2];
+  }
+  exec(self, event) {
+    let shortcuts = this.callbacks.get(event.key);
+    if (!shortcuts) {
+      if (/^[a-z]$/i.test(event.key)) {
+        return;
+      }
+      const fallback = KeyboardManager.#codeToKey(event.code);
+      if (fallback === null || fallback === event.key) {
+        return;
+      }
+      shortcuts = this.callbacks.get(fallback);
+      if (!shortcuts) {
+        return;
+      }
+    }
+    const eventModifiers = (event.altKey ? KeyboardManager.ALT : 0) | (event.ctrlKey ? KeyboardManager.CTRL : 0) | (event.metaKey ? KeyboardManager.META : 0) | (event.shiftKey ? KeyboardManager.SHIFT : 0);
+    const info = shortcuts.find(shortcut => shortcut.modifiers === eventModifiers);
+    if (!info) {
+      return;
+    }
+    const {
+      callback,
+      options: {
+        bubbles = false,
+        args = [],
+        checker = null
+      }
+    } = info;
+    if (checker && !checker(self, event)) {
+      return;
+    }
+    callback.bind(self, ...args, event)();
+    if (!bubbles) {
+      stopEvent(event);
+    }
+  }
+}
+class ColorManager {
+  static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]);
+  get _colors() {
+    const colors = new Map([["CanvasText", null], ["Canvas", null]]);
+    getColorValues(colors);
+    return shadow(this, "_colors", colors);
+  }
+  convert(color) {
+    const rgb = getRGB(color);
+    if (!window.matchMedia("(forced-colors: active)").matches) {
+      return rgb;
+    }
+    for (const [name, RGB] of this._colors) {
+      if (RGB.every((x, i) => x === rgb[i])) {
+        return ColorManager._colorsMapping.get(name);
+      }
+    }
+    return rgb;
+  }
+  getHexCode(name) {
+    const rgb = this._colors.get(name);
+    if (!rgb) {
+      return name;
+    }
+    return Util.makeHexColor(...rgb);
+  }
+}
+class AnnotationEditorUIManager {
+  #abortController = new AbortController();
+  #activeEditor = null;
+  #allEditableAnnotations = null;
+  #allEditors = new Map();
+  #allLayers = new Map();
+  #savedAllLayers = null;
+  #altTextManager = null;
+  #annotationStorage = null;
+  #changedExistingAnnotations = null;
+  #commandManager = new CommandManager();
+  #commentManager = null;
+  #copyPasteAC = null;
+  #currentDrawingSession = null;
+  #currentPageIndex = 0;
+  #deletedAnnotationsElementIds = new Set();
+  #draggingEditors = null;
+  #editorTypes = null;
+  #editorsToRescale = new Set();
+  _editorUndoBar = null;
+  #enableHighlightFloatingButton = false;
+  #enableUpdatedAddImage = false;
+  #enableNewAltTextWhenAddingImage = false;
+  #filterFactory = null;
+  #focusMainContainerTimeoutId = null;
+  #focusManagerAC = null;
+  #highlightColors = null;
+  #highlightWhenShiftUp = false;
+  #floatingToolbar = null;
+  #idManager = new IdManager();
+  #isEnabled = false;
+  #isPointerDown = false;
+  #isWaiting = false;
+  #keyboardManagerAC = null;
+  #lastActiveElement = null;
+  #mainHighlightColorPicker = null;
+  #missingCanvases = null;
+  #mlManager = null;
+  #mode = AnnotationEditorType.NONE;
+  #selectedEditors = new Set();
+  #selectedTextNode = null;
+  #signatureManager = null;
+  #pageColors = null;
+  #showAllStates = null;
+  #pdfDocument = null;
+  #previousStates = {
+    isEditing: false,
+    isEmpty: true,
+    hasSomethingToUndo: false,
+    hasSomethingToRedo: false,
+    hasSelectedEditor: false,
+    hasSelectedText: false
+  };
+  #translation = [0, 0];
+  #translationTimeoutId = null;
+  #container = null;
+  #viewer = null;
+  #viewerAlert = null;
+  #updateModeCapability = null;
+  static TRANSLATE_SMALL = 1;
+  static TRANSLATE_BIG = 10;
+  static get _keyboardManager() {
+    const proto = AnnotationEditorUIManager.prototype;
+    const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl();
+    const textInputChecker = (_self, {
+      target: el
+    }) => {
+      if (el instanceof HTMLInputElement) {
+        const {
+          type
+        } = el;
+        return type !== "text" && type !== "number";
+      }
+      return true;
+    };
+    const small = this.TRANSLATE_SMALL;
+    const big = this.TRANSLATE_BIG;
+    return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, {
+      checker: textInputChecker
+    }], [["ctrl+z", "mac+meta+z"], proto.undo, {
+      checker: textInputChecker
+    }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.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"], proto.delete, {
+      checker: textInputChecker
+    }], [["Enter"], proto.addNewEditorFromKeyboard, {
+      checker: (self, {
+        target: el
+      }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled
+    }], [["Space"], proto.addNewEditorFromKeyboard, {
+      checker: (self, {
+        target: el
+      }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement)
+    }], [["Escape"], proto.unselectAll], [["ArrowLeft"], proto.translateSelectedEditors, {
+      args: [-small, 0],
+      checker: arrowChecker
+    }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, {
+      args: [-big, 0],
+      checker: arrowChecker
+    }], [["ArrowRight"], proto.translateSelectedEditors, {
+      args: [small, 0],
+      checker: arrowChecker
+    }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, {
+      args: [big, 0],
+      checker: arrowChecker
+    }], [["ArrowUp"], proto.translateSelectedEditors, {
+      args: [0, -small],
+      checker: arrowChecker
+    }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, {
+      args: [0, -big],
+      checker: arrowChecker
+    }], [["ArrowDown"], proto.translateSelectedEditors, {
+      args: [0, small],
+      checker: arrowChecker
+    }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, {
+      args: [0, big],
+      checker: arrowChecker
+    }]]));
+  }
+  constructor(container, viewer, viewerAlert, altTextManager, commentManager, signatureManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager, editorUndoBar, supportsPinchToZoom) {
+    const signal = this._signal = this.#abortController.signal;
+    this.#container = container;
+    this.#viewer = viewer;
+    this.#viewerAlert = viewerAlert;
+    this.#altTextManager = altTextManager;
+    this.#commentManager = commentManager;
+    this.#signatureManager = signatureManager;
+    this.#pdfDocument = pdfDocument;
+    this._eventBus = eventBus;
+    const evtOpts = {
+      signal,
+      ...internalOpt
+    };
+    eventBus.on("editingaction", this.onEditingAction.bind(this), evtOpts);
+    eventBus.on("pagechanging", this.onPageChanging.bind(this), evtOpts);
+    eventBus.on("scalechanging", this.onScaleChanging.bind(this), evtOpts);
+    eventBus.on("rotationchanging", this.onRotationChanging.bind(this), evtOpts);
+    eventBus.on("setpreference", this.onSetPreference.bind(this), evtOpts);
+    eventBus.on("switchannotationeditorparams", evt => this.updateParams(evt.type, evt.value), evtOpts);
+    window.addEventListener("pointerdown", () => {
+      this.#isPointerDown = true;
+    }, {
+      capture: true,
+      signal
+    });
+    window.addEventListener("pointerup", () => {
+      this.#isPointerDown = false;
+    }, {
+      capture: true,
+      signal
+    });
+    window.addEventListener("beforeunload", this.#beforeUnload.bind(this), {
+      capture: true,
+      signal
+    });
+    this.#addSelectionListener();
+    this.#addDragAndDropListeners();
+    this.#addKeyboardManager();
+    this.#annotationStorage = pdfDocument.annotationStorage;
+    this.#filterFactory = pdfDocument.filterFactory;
+    this.#pageColors = pageColors;
+    this.#highlightColors = highlightColors || null;
+    this.#enableHighlightFloatingButton = enableHighlightFloatingButton;
+    this.#enableUpdatedAddImage = enableUpdatedAddImage;
+    this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage;
+    this.#mlManager = mlManager || null;
+    this.viewParameters = {
+      realScale: PixelsPerInch.PDF_TO_CSS_UNITS,
+      rotation: 0
+    };
+    this.isShiftKeyDown = false;
+    this._editorUndoBar = editorUndoBar || null;
+    this._supportsPinchToZoom = supportsPinchToZoom !== false;
+    commentManager?.setSidebarUiManager(this);
+  }
+  destroy() {
+    this.#updateModeCapability?.resolve();
+    this.#updateModeCapability = null;
+    this.#abortController?.abort();
+    this.#abortController = null;
+    this._signal = null;
+    for (const layer of this.#allLayers.values()) {
+      layer.destroy();
+    }
+    this.#allLayers.clear();
+    this.#allEditors.clear();
+    this.#editorsToRescale.clear();
+    this.#missingCanvases?.clear();
+    this.#activeEditor = null;
+    this.#selectedEditors.clear();
+    this.#commandManager.destroy();
+    this.#altTextManager?.destroy();
+    this.#commentManager?.destroy();
+    this.#signatureManager?.destroy();
+    this.#floatingToolbar?.hide();
+    this.#floatingToolbar = null;
+    this.#mainHighlightColorPicker?.destroy();
+    this.#mainHighlightColorPicker = null;
+    this.#allEditableAnnotations = null;
+    if (this.#focusMainContainerTimeoutId) {
+      clearTimeout(this.#focusMainContainerTimeoutId);
+      this.#focusMainContainerTimeoutId = null;
+    }
+    if (this.#translationTimeoutId) {
+      clearTimeout(this.#translationTimeoutId);
+      this.#translationTimeoutId = null;
+    }
+    this._editorUndoBar?.destroy();
+    this.#pdfDocument = null;
+  }
+  combinedSignal(ac) {
+    return AbortSignal.any([this._signal, ac.signal]);
+  }
+  get mlManager() {
+    return this.#mlManager;
+  }
+  get useNewAltTextFlow() {
+    return this.#enableUpdatedAddImage;
+  }
+  get useNewAltTextWhenAddingImage() {
+    return this.#enableNewAltTextWhenAddingImage;
+  }
+  get hcmFilter() {
+    return shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none");
+  }
+  get direction() {
+    return shadow(this, "direction", getComputedStyle(this.#container).direction);
+  }
+  get _highlightColors() {
+    return shadow(this, "_highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => {
+      pair = pair.split("=").map(x => x.trim());
+      pair[1] = pair[1].toUpperCase();
+      return pair;
+    })) : null);
+  }
+  get highlightColors() {
+    const {
+      _highlightColors
+    } = this;
+    if (!_highlightColors) {
+      return shadow(this, "highlightColors", null);
+    }
+    const map = new Map();
+    const hasHCM = !!this.#pageColors;
+    for (const [name, color] of _highlightColors) {
+      const isNameForHCM = name.endsWith("_HCM");
+      if (hasHCM && isNameForHCM) {
+        map.set(name.replace("_HCM", ""), color);
+        continue;
+      }
+      if (!hasHCM && !isNameForHCM) {
+        map.set(name, color);
+      }
+    }
+    return shadow(this, "highlightColors", map);
+  }
+  get highlightColorNames() {
+    return shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null);
+  }
+  getNonHCMColor(color) {
+    if (!this._highlightColors) {
+      return color;
+    }
+    const colorName = this.highlightColorNames.get(color);
+    return this._highlightColors.get(colorName) || color;
+  }
+  getNonHCMColorName(color) {
+    return this.highlightColorNames.get(color) || color;
+  }
+  setCurrentDrawingSession(layer) {
+    if (layer) {
+      this.unselectAll();
+      this.disableUserSelect(true);
+    } else {
+      this.disableUserSelect(false);
+    }
+    this.#currentDrawingSession = layer;
+  }
+  setMainHighlightColorPicker(colorPicker) {
+    this.#mainHighlightColorPicker = colorPicker;
+  }
+  editAltText(editor, firstTime = false) {
+    this.#altTextManager?.editAltText(this, editor, firstTime);
+  }
+  hasCommentManager() {
+    return !!this.#commentManager;
+  }
+  editComment(editor, posX, posY, options) {
+    this.#commentManager?.showDialog(this, editor, posX, posY, options);
+  }
+  selectComment(pageIndex, uid) {
+    const layer = this.#allLayers.get(pageIndex);
+    const editor = layer?.getEditorByUID(uid);
+    editor?.toggleComment(true, true);
+  }
+  updateComment(editor) {
+    this.#commentManager?.updateComment(editor.getData());
+  }
+  updatePopupColor(editor) {
+    this.#commentManager?.updatePopupColor(editor);
+  }
+  removeComment(editor) {
+    this.#commentManager?.removeComments([editor.uid]);
+  }
+  deleteComment(editor, savedData) {
+    const undo = () => {
+      editor.comment = savedData;
+    };
+    const cmd = () => {
+      this._editorUndoBar?.show(undo, "comment");
+      this.toggleComment(null);
+      editor.comment = null;
+    };
+    this.addCommands({
+      cmd,
+      undo,
+      mustExec: true
+    });
+  }
+  toggleComment(editor, isSelected, visibility = undefined) {
+    this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility);
+  }
+  makeCommentColor(color, opacity) {
+    return color && this.#commentManager?.makeCommentColor(color, opacity) || null;
+  }
+  getCommentDialogElement() {
+    return this.#commentManager?.dialogElement || null;
+  }
+  async waitForEditorsRendered(pageNumber) {
+    if (this.#allLayers.has(pageNumber - 1)) {
+      return;
+    }
+    const {
+      resolve,
+      promise
+    } = Promise.withResolvers();
+    const onEditorsRendered = evt => {
+      if (evt.pageNumber === pageNumber) {
+        this._eventBus.off("editorsrendered", onEditorsRendered);
+        resolve();
+      }
+    };
+    this._eventBus.on("editorsrendered", onEditorsRendered, internalOpt);
+    await promise;
+  }
+  getSignature(editor) {
+    this.#signatureManager?.getSignature({
+      uiManager: this,
+      editor
+    });
+  }
+  get signatureManager() {
+    return this.#signatureManager;
+  }
+  switchToMode(mode, callback) {
+    this._eventBus.on("annotationeditormodechanged", callback, {
+      once: true,
+      signal: this._signal,
+      ...internalOpt
+    });
+    this._eventBus.dispatch("showannotationeditorui", {
+      source: this,
+      mode
+    });
+  }
+  setPreference(name, value) {
+    this._eventBus.dispatch("setpreference", {
+      source: this,
+      name,
+      value
+    });
+  }
+  onSetPreference({
+    name,
+    value
+  }) {
+    switch (name) {
+      case "enableNewAltTextWhenAddingImage":
+        this.#enableNewAltTextWhenAddingImage = value;
+        break;
+    }
+  }
+  onPageChanging({
+    pageNumber
+  }) {
+    this.#currentPageIndex = pageNumber - 1;
+  }
+  deletePage(id) {
+    for (const editor of this.getEditors(id)) {
+      editor.remove();
+    }
+    this.#allLayers.delete(id);
+    if (this.#currentPageIndex === id) {
+      this.#currentPageIndex = 0;
+    }
+  }
+  focusMainContainer() {
+    this.#container.focus();
+  }
+  findParent(x, y) {
+    for (const layer of this.#allLayers.values()) {
+      const {
+        x: layerX,
+        y: layerY,
+        width,
+        height
+      } = layer.div.getBoundingClientRect();
+      if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) {
+        return layer;
+      }
+    }
+    return null;
+  }
+  disableUserSelect(value = false) {
+    this.#viewer.classList.toggle("noUserSelect", value);
+  }
+  addShouldRescale(editor) {
+    this.#editorsToRescale.add(editor);
+  }
+  removeShouldRescale(editor) {
+    this.#editorsToRescale.delete(editor);
+  }
+  onScaleChanging({
+    scale
+  }) {
+    this.commitOrRemove();
+    this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS;
+    for (const editor of this.#editorsToRescale) {
+      editor.onScaleChanging();
+    }
+    this.#currentDrawingSession?.onScaleChanging();
+  }
+  onRotationChanging({
+    pagesRotation
+  }) {
+    this.commitOrRemove();
+    this.viewParameters.rotation = pagesRotation;
+  }
+  #getAnchorElementForSelection({
+    anchorNode
+  }) {
+    return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode;
+  }
+  #getLayerForTextLayer(textLayer) {
+    const {
+      currentLayer
+    } = this;
+    if (currentLayer.hasTextLayer(textLayer)) {
+      return currentLayer;
+    }
+    for (const layer of this.#allLayers.values()) {
+      if (layer.hasTextLayer(textLayer)) {
+        return layer;
+      }
+    }
+    return null;
+  }
+  highlightSelection(methodOfCreation = "", comment = false) {
+    const selection = document.getSelection();
+    if (!selection || selection.isCollapsed) {
+      return;
+    }
+    const {
+      anchorNode,
+      anchorOffset,
+      focusNode,
+      focusOffset
+    } = selection;
+    const text = selection.toString();
+    const anchorElement = this.#getAnchorElementForSelection(selection);
+    const textLayer = anchorElement.closest(".textLayer");
+    const boxes = this.getSelectionBoxes(textLayer);
+    if (!boxes) {
+      return;
+    }
+    selection.empty();
+    const layer = this.#getLayerForTextLayer(textLayer);
+    const isNoneMode = this.#mode === AnnotationEditorType.NONE;
+    const callback = () => {
+      const editor = layer?.createAndAddNewEditor({
+        x: 0,
+        y: 0
+      }, false, {
+        methodOfCreation,
+        boxes,
+        anchorNode,
+        anchorOffset,
+        focusNode,
+        focusOffset,
+        text
+      });
+      if (isNoneMode) {
+        this.showAllEditors("highlight", true, true);
+      }
+      if (comment) {
+        editor?.editComment();
+      }
+    };
+    if (isNoneMode) {
+      this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback);
+      return;
+    }
+    callback();
+  }
+  commentSelection(methodOfCreation = "") {
+    this.highlightSelection(methodOfCreation, true);
+  }
+  #beforeUnload(e) {
+    this.commitOrRemove();
+    this.currentLayer?.endDrawingSession(false);
+  }
+  #displayFloatingToolbar() {
+    const selection = document.getSelection();
+    if (!selection || selection.isCollapsed) {
+      return;
+    }
+    const anchorElement = this.#getAnchorElementForSelection(selection);
+    const textLayer = anchorElement.closest(".textLayer");
+    const boxes = this.getSelectionBoxes(textLayer);
+    if (!boxes) {
+      return;
+    }
+    this.#floatingToolbar ||= new FloatingToolbar(this);
+    this.#floatingToolbar.show(textLayer, boxes, this.direction === "ltr");
+  }
+  getAndRemoveDataFromAnnotationStorage(annotationId) {
+    if (!this.#annotationStorage) {
+      return null;
+    }
+    const key = `${AnnotationEditorPrefix}${annotationId}`;
+    const storedValue = this.#annotationStorage.getRawValue(key);
+    if (storedValue) {
+      this.#annotationStorage.remove(key);
+    }
+    return storedValue;
+  }
+  addToAnnotationStorage(editor) {
+    if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) {
+      this.#annotationStorage.setValue(editor.id, editor);
+    }
+  }
+  a11yAlert(messageId, args = null) {
+    const viewerAlert = this.#viewerAlert;
+    if (!viewerAlert) {
+      return;
+    }
+    viewerAlert.setAttribute("data-l10n-id", messageId);
+    if (args) {
+      viewerAlert.setAttribute("data-l10n-args", JSON.stringify(args));
+    } else {
+      viewerAlert.removeAttribute("data-l10n-args");
+    }
+  }
+  #selectionChange() {
+    const selection = document.getSelection();
+    if (!selection || selection.isCollapsed) {
+      if (this.#selectedTextNode) {
+        this.#floatingToolbar?.hide();
+        this.#selectedTextNode = null;
+        this.#dispatchUpdateStates({
+          hasSelectedText: false
+        });
+      }
+      return;
+    }
+    const {
+      anchorNode
+    } = selection;
+    if (anchorNode === this.#selectedTextNode) {
+      return;
+    }
+    const anchorElement = this.#getAnchorElementForSelection(selection);
+    const textLayer = anchorElement.closest(".textLayer");
+    if (!textLayer) {
+      if (this.#selectedTextNode) {
+        this.#floatingToolbar?.hide();
+        this.#selectedTextNode = null;
+        this.#dispatchUpdateStates({
+          hasSelectedText: false
+        });
+      }
+      return;
+    }
+    this.#floatingToolbar?.hide();
+    this.#selectedTextNode = anchorNode;
+    this.#dispatchUpdateStates({
+      hasSelectedText: true
+    });
+    if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) {
+      return;
+    }
+    if (this.#mode === AnnotationEditorType.HIGHLIGHT) {
+      this.showAllEditors("highlight", true, true);
+    }
+    this.#highlightWhenShiftUp = this.isShiftKeyDown;
+    if (!this.isShiftKeyDown) {
+      const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null;
+      activeLayer?.toggleDrawing();
+      if (this.#isPointerDown) {
+        const ac = new AbortController();
+        const signal = this.combinedSignal(ac);
+        const pointerup = e => {
+          if (e.type === "pointerup" && e.button !== 0) {
+            return;
+          }
+          ac.abort();
+          activeLayer?.toggleDrawing(true);
+          if (e.type === "pointerup") {
+            this.#onSelectEnd("main_toolbar");
+          }
+        };
+        window.addEventListener("pointerup", pointerup, {
+          signal
+        });
+        window.addEventListener("blur", pointerup, {
+          signal
+        });
+      } else {
+        activeLayer?.toggleDrawing(true);
+        this.#onSelectEnd("main_toolbar");
+      }
+    }
+  }
+  #onSelectEnd(methodOfCreation = "") {
+    if (this.#mode === AnnotationEditorType.HIGHLIGHT) {
+      this.highlightSelection(methodOfCreation);
+    } else if (this.#enableHighlightFloatingButton) {
+      this.#displayFloatingToolbar();
+    }
+  }
+  #addSelectionListener() {
+    document.addEventListener("selectionchange", this.#selectionChange.bind(this), {
+      signal: this._signal
+    });
+  }
+  #addFocusManager() {
+    if (this.#focusManagerAC) {
+      return;
+    }
+    this.#focusManagerAC = new AbortController();
+    const signal = this.combinedSignal(this.#focusManagerAC);
+    window.addEventListener("focus", this.focus.bind(this), {
+      signal
+    });
+    window.addEventListener("blur", this.blur.bind(this), {
+      signal
+    });
+  }
+  #removeFocusManager() {
+    this.#focusManagerAC?.abort();
+    this.#focusManagerAC = null;
+  }
+  blur() {
+    this.isShiftKeyDown = false;
+    if (this.#highlightWhenShiftUp) {
+      this.#highlightWhenShiftUp = false;
+      this.#onSelectEnd("main_toolbar");
+    }
+    if (!this.hasSelection) {
+      return;
+    }
+    const {
+      activeElement
+    } = document;
+    for (const editor of this.#selectedEditors) {
+      if (editor.div.contains(activeElement)) {
+        this.#lastActiveElement = [editor, activeElement];
+        editor._focusEventsAllowed = false;
+        break;
+      }
+    }
+  }
+  focus() {
+    if (!this.#lastActiveElement) {
+      return;
+    }
+    const [lastEditor, lastActiveElement] = this.#lastActiveElement;
+    this.#lastActiveElement = null;
+    lastActiveElement.addEventListener("focusin", () => {
+      lastEditor._focusEventsAllowed = true;
+    }, {
+      once: true,
+      signal: this._signal
+    });
+    lastActiveElement.focus();
+  }
+  #addKeyboardManager() {
+    if (this.#keyboardManagerAC) {
+      return;
+    }
+    this.#keyboardManagerAC = new AbortController();
+    const signal = this.combinedSignal(this.#keyboardManagerAC);
+    window.addEventListener("keydown", this.keydown.bind(this), {
+      signal
+    });
+    window.addEventListener("keyup", this.keyup.bind(this), {
+      signal
+    });
+  }
+  #removeKeyboardManager() {
+    this.#keyboardManagerAC?.abort();
+    this.#keyboardManagerAC = null;
+  }
+  #addCopyPasteListeners() {
+    if (this.#copyPasteAC) {
+      return;
+    }
+    this.#copyPasteAC = new AbortController();
+    const signal = this.combinedSignal(this.#copyPasteAC);
+    document.addEventListener("copy", this.copy.bind(this), {
+      signal
+    });
+    document.addEventListener("cut", this.cut.bind(this), {
+      signal
+    });
+    document.addEventListener("paste", this.paste.bind(this), {
+      signal
+    });
+  }
+  #removeCopyPasteListeners() {
+    this.#copyPasteAC?.abort();
+    this.#copyPasteAC = null;
+  }
+  #addDragAndDropListeners() {
+    const signal = this._signal;
+    document.addEventListener("dragover", this.dragOver.bind(this), {
+      signal
+    });
+    document.addEventListener("drop", this.drop.bind(this), {
+      signal
+    });
+  }
+  addEditListeners() {
+    this.#addKeyboardManager();
+    this.setEditingState(true);
+  }
+  removeEditListeners() {
+    this.#removeKeyboardManager();
+    this.setEditingState(false);
+  }
+  dragOver(event) {
+    for (const {
+      type
+    } of event.dataTransfer.items) {
+      for (const editorType of this.#editorTypes) {
+        if (editorType.isHandlingMimeForPasting(type)) {
+          event.dataTransfer.dropEffect = "copy";
+          event.preventDefault();
+          return;
+        }
+      }
+    }
+  }
+  drop(event) {
+    for (const item of event.dataTransfer.items) {
+      for (const editorType of this.#editorTypes) {
+        if (editorType.isHandlingMimeForPasting(item.type)) {
+          editorType.paste(item, this.currentLayer);
+          event.preventDefault();
+          return;
+        }
+      }
+    }
+  }
+  copy(event) {
+    event.preventDefault();
+    this.#activeEditor?.commitOrRemove();
+    if (!this.hasSelection) {
+      return;
+    }
+    const editors = [];
+    for (const editor of this.#selectedEditors) {
+      const serialized = editor.serialize(true);
+      if (serialized) {
+        editors.push(serialized);
+      }
+    }
+    if (editors.length === 0) {
+      return;
+    }
+    event.clipboardData.setData("application/pdfjs", JSON.stringify(editors));
+  }
+  cut(event) {
+    this.copy(event);
+    this.delete();
+  }
+  async paste(event) {
+    event.preventDefault();
+    const {
+      clipboardData
+    } = event;
+    for (const item of clipboardData.items) {
+      for (const editorType of this.#editorTypes) {
+        if (editorType.isHandlingMimeForPasting(item.type)) {
+          editorType.paste(item, this.currentLayer);
+          return;
+        }
+      }
+    }
+    let data = clipboardData.getData("application/pdfjs");
+    if (!data) {
+      return;
+    }
+    try {
+      data = JSON.parse(data);
+    } catch (ex) {
+      warn(`paste: "${ex.message}".`);
+      return;
+    }
+    if (!Array.isArray(data)) {
+      return;
+    }
+    this.unselectAll();
+    const layer = this.currentLayer;
+    try {
+      const newEditors = [];
+      for (const editor of data) {
+        const deserializedEditor = await layer.deserialize(editor);
+        if (!deserializedEditor) {
+          return;
+        }
+        newEditors.push(deserializedEditor);
+      }
+      const cmd = () => {
+        for (const editor of newEditors) {
+          this.#addEditorToLayer(editor);
+        }
+        this.#selectEditors(newEditors);
+      };
+      const undo = () => {
+        for (const editor of newEditors) {
+          editor.remove();
+        }
+      };
+      this.addCommands({
+        cmd,
+        undo,
+        mustExec: true
+      });
+    } catch (ex) {
+      warn(`paste: "${ex.message}".`);
+    }
+  }
+  keydown(event) {
+    if (!this.isShiftKeyDown && event.key === "Shift") {
+      this.isShiftKeyDown = true;
+    }
+    if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) {
+      AnnotationEditorUIManager._keyboardManager.exec(this, event);
+    }
+  }
+  keyup(event) {
+    if (this.isShiftKeyDown && event.key === "Shift") {
+      this.isShiftKeyDown = false;
+      if (this.#highlightWhenShiftUp) {
+        this.#highlightWhenShiftUp = false;
+        this.#onSelectEnd("main_toolbar");
+      }
+    }
+  }
+  onEditingAction({
+    name
+  }) {
+    switch (name) {
+      case "undo":
+      case "redo":
+      case "delete":
+      case "selectAll":
+        this[name]();
+        break;
+      case "highlightSelection":
+        this.highlightSelection("context_menu");
+        break;
+      case "commentSelection":
+        this.commentSelection("context_menu");
+        break;
+    }
+  }
+  updatePageIndex(oldPageIndex, newPageIndex) {
+    for (const editor of this.getEditors(oldPageIndex)) {
+      editor.pageIndex = newPageIndex;
+    }
+    const layer = this.#savedAllLayers.get(oldPageIndex);
+    if (layer) {
+      layer.pageIndex = newPageIndex;
+      this.#allLayers.set(newPageIndex, layer);
+      if (this.#isEnabled) {
+        layer.enable();
+      } else {
+        layer.disable();
+      }
+    }
+  }
+  startUpdatePages() {
+    this.#savedAllLayers = new Map(this.#allLayers);
+    this.#allLayers.clear();
+  }
+  endUpdatePages() {
+    this.#savedAllLayers = null;
+  }
+  clonePage(pageIndex, newPageIndex) {
+    for (const editor of this.getEditors(pageIndex)) {
+      const serialized = editor.serialize(editor.mode !== AnnotationEditorType.HIGHLIGHT);
+      if (!serialized) {
+        continue;
+      }
+      serialized.pageIndex = newPageIndex;
+      serialized.id = this.getId();
+      serialized.isClone = true;
+      delete serialized.popupRef;
+      this.#annotationStorage.setValue(serialized.id, serialized);
+    }
+  }
+  findClonesForPage(layer) {
+    const promises = [];
+    const {
+      pageIndex
+    } = layer;
+    for (const [id, editor] of this.#annotationStorage) {
+      if (editor.pageIndex === pageIndex && editor.isClone) {
+        this.#annotationStorage.remove(id);
+        promises.push(layer.deserialize(editor).then(deserializedEditor => {
+          if (deserializedEditor) {
+            deserializedEditor.isClone = true;
+            layer.addOrRebuild(deserializedEditor);
+          }
+        }));
+      }
+    }
+    return Promise.all(promises);
+  }
+  #dispatchUpdateStates(details) {
+    const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value);
+    if (hasChanged) {
+      this._eventBus.dispatch("editingstateschanged", {
+        source: this,
+        details: Object.assign(this.#previousStates, details)
+      });
+      if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) {
+        this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]);
+      }
+    }
+  }
+  #dispatchUpdateUI(details) {
+    this._eventBus.dispatch("annotationeditorparamschanged", {
+      source: this,
+      details
+    });
+  }
+  setEditingState(isEditing) {
+    if (isEditing) {
+      this.#addFocusManager();
+      this.#addCopyPasteListeners();
+      this.#dispatchUpdateStates({
+        isEditing: this.#mode !== AnnotationEditorType.NONE,
+        isEmpty: this.#isEmpty(),
+        hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),
+        hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),
+        hasSelectedEditor: false
+      });
+    } else {
+      this.#removeFocusManager();
+      this.#removeCopyPasteListeners();
+      this.#dispatchUpdateStates({
+        isEditing: false
+      });
+      this.disableUserSelect(false);
+    }
+  }
+  registerEditorTypes(types) {
+    if (this.#editorTypes) {
+      return;
+    }
+    this.#editorTypes = types;
+    for (const editorType of this.#editorTypes) {
+      this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);
+    }
+  }
+  getId() {
+    return this.#idManager.id;
+  }
+  get currentLayer() {
+    return this.#allLayers.get(this.#currentPageIndex);
+  }
+  getLayer(pageIndex) {
+    return this.#allLayers.get(pageIndex);
+  }
+  get currentPageIndex() {
+    return this.#currentPageIndex;
+  }
+  addLayer(layer) {
+    this.#allLayers.set(layer.pageIndex, layer);
+    if (this.#isEnabled) {
+      layer.enable();
+    } else {
+      layer.disable();
+    }
+  }
+  removeLayer(layer) {
+    this.#allLayers.delete(layer.pageIndex);
+  }
+  async updateMode(mode, editId = null, isFromUser = false, isFromKeyboard = false, mustEnterInEditMode = false, editComment = false) {
+    if (this.#mode === mode) {
+      return;
+    }
+    if (this.#updateModeCapability) {
+      await this.#updateModeCapability.promise;
+      if (!this.#updateModeCapability) {
+        return;
+      }
+    }
+    this.#updateModeCapability = Promise.withResolvers();
+    this.#currentDrawingSession?.commitOrRemove();
+    if (this.#mode === AnnotationEditorType.POPUP) {
+      this.#commentManager?.hideSidebar();
+    }
+    this.#commentManager?.destroyPopup();
+    this.#mode = mode;
+    if (mode === AnnotationEditorType.NONE) {
+      this.setEditingState(false);
+      this.#disableAll();
+      for (const editor of this.#allEditors.values()) {
+        editor.hideStandaloneCommentButton();
+      }
+      this._editorUndoBar?.hide();
+      this.toggleComment(null);
+      this.#updateModeCapability.resolve();
+      return;
+    }
+    for (const editor of this.#allEditors.values()) {
+      editor.addStandaloneCommentButton();
+    }
+    if (mode === AnnotationEditorType.SIGNATURE) {
+      await this.#signatureManager?.loadSignatures();
+    }
+    if (isFromUser) {
+      CurrentPointers.clearPointerType();
+    }
+    this.setEditingState(true);
+    await this.#enableAll();
+    this.unselectAll();
+    for (const layer of this.#allLayers.values()) {
+      layer.updateMode(mode);
+    }
+    if (mode === AnnotationEditorType.POPUP) {
+      this.#allEditableAnnotations ||= await this.#pdfDocument.getAnnotationsByType(new Set(this.#editorTypes.map(editorClass => editorClass._editorType)));
+      const elementIds = new Set();
+      const allComments = [];
+      for (const editor of this.#allEditors.values()) {
+        const {
+          annotationElementId,
+          hasComment,
+          deleted
+        } = editor;
+        if (annotationElementId) {
+          elementIds.add(annotationElementId);
+        }
+        if (hasComment && !deleted) {
+          allComments.push(editor.getData());
+        }
+      }
+      for (const annotation of this.#allEditableAnnotations) {
+        const {
+          id,
+          popupRef,
+          contentsObj
+        } = annotation;
+        if (popupRef && contentsObj?.str && !elementIds.has(id) && !this.#deletedAnnotationsElementIds.has(id)) {
+          allComments.push(annotation);
+        }
+      }
+      this.#commentManager?.showSidebar(allComments);
+    }
+    if (!editId) {
+      if (isFromKeyboard) {
+        this.addNewEditorFromKeyboard();
+      }
+      this.#updateModeCapability.resolve();
+      return;
+    }
+    for (const editor of this.#allEditors.values()) {
+      if (editor.uid === editId) {
+        this.setSelected(editor);
+        if (editComment) {
+          editor.editComment();
+        } else if (mustEnterInEditMode) {
+          editor.enterInEditMode();
+        } else {
+          editor.focus();
+        }
+      } else {
+        editor.unselect();
+      }
+    }
+    this.#updateModeCapability.resolve();
+  }
+  addNewEditorFromKeyboard() {
+    if (this.currentLayer.canCreateNewEmptyEditor()) {
+      this.currentLayer.addNewEditor();
+    }
+  }
+  updateToolbar(options) {
+    if (options.mode === this.#mode) {
+      return;
+    }
+    this._eventBus.dispatch("switchannotationeditormode", {
+      source: this,
+      ...options
+    });
+  }
+  updateParams(type, value) {
+    if (!this.#editorTypes) {
+      return;
+    }
+    switch (type) {
+      case AnnotationEditorParamsType.CREATE:
+        this.currentLayer.addNewEditor(value);
+        return;
+      case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:
+        this._eventBus.dispatch("reporttelemetry", {
+          source: this,
+          details: {
+            type: "editing",
+            data: {
+              type: "highlight",
+              action: "toggle_visibility"
+            }
+          }
+        });
+        (this.#showAllStates ||= new Map()).set(type, value);
+        this.showAllEditors("highlight", value);
+        break;
+    }
+    if (this.hasSelection) {
+      for (const editor of this.#selectedEditors) {
+        editor.updateParams(type, value);
+      }
+    } else {
+      for (const editorType of this.#editorTypes) {
+        editorType.updateDefaultParams(type, value);
+      }
+    }
+  }
+  showAllEditors(type, visible, updateButton = false) {
+    for (const editor of this.#allEditors.values()) {
+      if (editor.editorType === type) {
+        editor.show(visible);
+      }
+    }
+    const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true;
+    if (state !== visible) {
+      this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]);
+    }
+  }
+  enableWaiting(mustWait = false) {
+    if (this.#isWaiting === mustWait) {
+      return;
+    }
+    this.#isWaiting = mustWait;
+    for (const layer of this.#allLayers.values()) {
+      if (mustWait) {
+        layer.disableClick();
+      } else {
+        layer.enableClick();
+      }
+      layer.div.classList.toggle("waiting", mustWait);
+    }
+  }
+  async #enableAll() {
+    if (!this.#isEnabled) {
+      this.#isEnabled = true;
+      const promises = [];
+      for (const layer of this.#allLayers.values()) {
+        promises.push(layer.enable());
+      }
+      await Promise.all(promises);
+      for (const editor of this.#allEditors.values()) {
+        editor.enable();
+      }
+    }
+  }
+  #disableAll() {
+    this.unselectAll();
+    if (this.#isEnabled) {
+      this.#isEnabled = false;
+      for (const layer of this.#allLayers.values()) {
+        layer.disable();
+      }
+      for (const editor of this.#allEditors.values()) {
+        editor.disable();
+      }
+    }
+  }
+  *getEditors(pageIndex) {
+    for (const editor of this.#allEditors.values()) {
+      if (editor.pageIndex === pageIndex) {
+        yield editor;
+      }
+    }
+  }
+  getEditor(id) {
+    return this.#allEditors.get(id);
+  }
+  addEditor(editor) {
+    this.#allEditors.set(editor.id, editor);
+  }
+  removeEditor(editor) {
+    if (editor.div.contains(document.activeElement)) {
+      if (this.#focusMainContainerTimeoutId) {
+        clearTimeout(this.#focusMainContainerTimeoutId);
+      }
+      this.#focusMainContainerTimeoutId = setTimeout(() => {
+        this.focusMainContainer();
+        this.#focusMainContainerTimeoutId = null;
+      }, 0);
+    }
+    this.#allEditors.delete(editor.id);
+    if (editor.annotationElementId) {
+      this.#missingCanvases?.delete(editor.annotationElementId);
+    }
+    this.unselect(editor);
+    if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) {
+      this.#annotationStorage?.remove(editor.id);
+    }
+  }
+  addDeletedAnnotationElement(editor) {
+    this.#deletedAnnotationsElementIds.add(editor.annotationElementId);
+    this.addChangedExistingAnnotation(editor);
+    editor.deleted = true;
+  }
+  isDeletedAnnotationElement(annotationElementId) {
+    return this.#deletedAnnotationsElementIds.has(annotationElementId);
+  }
+  removeDeletedAnnotationElement(editor) {
+    this.#deletedAnnotationsElementIds.delete(editor.annotationElementId);
+    this.removeChangedExistingAnnotation(editor);
+    editor.deleted = false;
+  }
+  #addEditorToLayer(editor) {
+    const layer = this.#allLayers.get(editor.pageIndex);
+    if (layer) {
+      layer.addOrRebuild(editor);
+    } else {
+      this.addEditor(editor);
+      this.addToAnnotationStorage(editor);
+    }
+  }
+  setActiveEditor(editor) {
+    if (this.#activeEditor === editor) {
+      return;
+    }
+    this.#activeEditor = editor;
+    if (editor) {
+      this.#dispatchUpdateUI(editor.propertiesToUpdate);
+    }
+  }
+  get #lastSelectedEditor() {
+    let ed = null;
+    for (ed of this.#selectedEditors) {}
+    return ed;
+  }
+  updateUI(editor) {
+    if (this.#lastSelectedEditor === editor) {
+      this.#dispatchUpdateUI(editor.propertiesToUpdate);
+    }
+  }
+  updateUIForDefaultProperties(editorType) {
+    this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);
+  }
+  toggleSelected(editor) {
+    if (this.#selectedEditors.has(editor)) {
+      this.#selectedEditors.delete(editor);
+      editor.unselect();
+      this.#dispatchUpdateStates({
+        hasSelectedEditor: this.hasSelection
+      });
+      return;
+    }
+    this.#selectedEditors.add(editor);
+    editor.select();
+    this.#dispatchUpdateUI(editor.propertiesToUpdate);
+    this.#dispatchUpdateStates({
+      hasSelectedEditor: true
+    });
+  }
+  setSelected(editor) {
+    this.updateToolbar({
+      mode: editor.mode,
+      editId: editor.uid
+    });
+    this.#currentDrawingSession?.commitOrRemove();
+    for (const ed of this.#selectedEditors) {
+      if (ed !== editor) {
+        ed.unselect();
+      }
+    }
+    this.#commentManager?.destroyPopup();
+    this.#selectedEditors.clear();
+    this.#selectedEditors.add(editor);
+    editor.select();
+    this.#dispatchUpdateUI(editor.propertiesToUpdate);
+    this.#dispatchUpdateStates({
+      hasSelectedEditor: true
+    });
+  }
+  get firstSelectedEditor() {
+    return this.#selectedEditors.values().next().value;
+  }
+  unselect(editor) {
+    editor.unselect();
+    this.#selectedEditors.delete(editor);
+    this.#dispatchUpdateStates({
+      hasSelectedEditor: this.hasSelection
+    });
+  }
+  get hasSelection() {
+    return this.#selectedEditors.size !== 0;
+  }
+  get isEnterHandled() {
+    return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled;
+  }
+  undo() {
+    this.#commandManager.undo();
+    this.#dispatchUpdateStates({
+      hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),
+      hasSomethingToRedo: true,
+      isEmpty: this.#isEmpty()
+    });
+    this._editorUndoBar?.hide();
+  }
+  redo() {
+    this.#commandManager.redo();
+    this.#dispatchUpdateStates({
+      hasSomethingToUndo: true,
+      hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),
+      isEmpty: this.#isEmpty()
+    });
+  }
+  addCommands(params) {
+    this.#commandManager.add(params);
+    this.#dispatchUpdateStates({
+      hasSomethingToUndo: true,
+      hasSomethingToRedo: false,
+      isEmpty: this.#isEmpty()
+    });
+  }
+  cleanUndoStack(type) {
+    this.#commandManager.cleanType(type);
+  }
+  #isEmpty() {
+    if (this.#allEditors.size === 0) {
+      return true;
+    }
+    if (this.#allEditors.size === 1) {
+      for (const editor of this.#allEditors.values()) {
+        return editor.isEmpty();
+      }
+    }
+    return false;
+  }
+  delete() {
+    this.commitOrRemove();
+    const drawingEditor = this.currentLayer?.endDrawingSession(true);
+    if (!this.hasSelection && !drawingEditor) {
+      return;
+    }
+    const editors = drawingEditor ? [drawingEditor] : [...this.#selectedEditors];
+    const cmd = () => {
+      this._editorUndoBar?.show(undo, editors.length === 1 ? editors[0].editorType : editors.length);
+      for (const editor of editors) {
+        editor.remove();
+      }
+    };
+    const undo = () => {
+      for (const editor of editors) {
+        this.#addEditorToLayer(editor);
+      }
+    };
+    this.addCommands({
+      cmd,
+      undo,
+      mustExec: true
+    });
+  }
+  commitOrRemove() {
+    this.#activeEditor?.commitOrRemove();
+  }
+  hasSomethingToControl() {
+    return this.#activeEditor || this.hasSelection;
+  }
+  #selectEditors(editors) {
+    for (const editor of this.#selectedEditors) {
+      editor.unselect();
+    }
+    this.#selectedEditors.clear();
+    for (const editor of editors) {
+      if (editor.isEmpty()) {
+        continue;
+      }
+      this.#selectedEditors.add(editor);
+      editor.select();
+    }
+    this.#dispatchUpdateStates({
+      hasSelectedEditor: this.hasSelection
+    });
+  }
+  selectAll() {
+    for (const editor of this.#selectedEditors) {
+      editor.commit();
+    }
+    this.#selectEditors(this.#allEditors.values());
+  }
+  unselectAll() {
+    if (this.#activeEditor) {
+      this.#activeEditor.commitOrRemove();
+      if (this.#mode !== AnnotationEditorType.NONE) {
+        return;
+      }
+    }
+    if (this.#currentDrawingSession?.commitOrRemove()) {
+      return;
+    }
+    this.#commentManager?.destroyPopup();
+    if (!this.hasSelection) {
+      return;
+    }
+    for (const editor of this.#selectedEditors) {
+      editor.unselect();
+    }
+    this.#selectedEditors.clear();
+    this.#dispatchUpdateStates({
+      hasSelectedEditor: false
+    });
+  }
+  translateSelectedEditors(x, y, noCommit = false) {
+    if (!noCommit) {
+      this.commitOrRemove();
+    }
+    if (!this.hasSelection) {
+      return;
+    }
+    this.#translation[0] += x;
+    this.#translation[1] += y;
+    const [totalX, totalY] = this.#translation;
+    const editors = [...this.#selectedEditors];
+    const TIME_TO_WAIT = 1000;
+    if (this.#translationTimeoutId) {
+      clearTimeout(this.#translationTimeoutId);
+    }
+    this.#translationTimeoutId = setTimeout(() => {
+      this.#translationTimeoutId = null;
+      this.#translation[0] = this.#translation[1] = 0;
+      this.addCommands({
+        cmd: () => {
+          for (const editor of editors) {
+            if (this.#allEditors.has(editor.id)) {
+              editor.translateInPage(totalX, totalY);
+              editor.translationDone();
+            }
+          }
+        },
+        undo: () => {
+          for (const editor of editors) {
+            if (this.#allEditors.has(editor.id)) {
+              editor.translateInPage(-totalX, -totalY);
+              editor.translationDone();
+            }
+          }
+        },
+        mustExec: false
+      });
+    }, TIME_TO_WAIT);
+    for (const editor of editors) {
+      editor.translateInPage(x, y);
+      editor.translationDone();
+    }
+  }
+  setUpDragSession() {
+    if (!this.hasSelection) {
+      return;
+    }
+    this.disableUserSelect(true);
+    this.#draggingEditors = new Map();
+    for (const editor of this.#selectedEditors) {
+      this.#draggingEditors.set(editor, {
+        savedX: editor.x,
+        savedY: editor.y,
+        savedPageIndex: editor.pageIndex,
+        newX: 0,
+        newY: 0,
+        newPageIndex: -1
+      });
+    }
+  }
+  endDragSession() {
+    if (!this.#draggingEditors) {
+      return false;
+    }
+    this.disableUserSelect(false);
+    const map = this.#draggingEditors;
+    this.#draggingEditors = null;
+    let mustBeAddedInUndoStack = false;
+    for (const [{
+      x,
+      y,
+      pageIndex
+    }, value] of map) {
+      value.newX = x;
+      value.newY = y;
+      value.newPageIndex = pageIndex;
+      mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex;
+    }
+    if (!mustBeAddedInUndoStack) {
+      return false;
+    }
+    const move = (editor, x, y, pageIndex) => {
+      if (this.#allEditors.has(editor.id)) {
+        const parent = this.#allLayers.get(pageIndex);
+        if (parent) {
+          editor._setParentAndPosition(parent, x, y);
+        } else {
+          editor.pageIndex = pageIndex;
+          editor.x = x;
+          editor.y = y;
+        }
+      }
+    };
+    this.addCommands({
+      cmd: () => {
+        for (const [editor, {
+          newX,
+          newY,
+          newPageIndex
+        }] of map) {
+          move(editor, newX, newY, newPageIndex);
+        }
+      },
+      undo: () => {
+        for (const [editor, {
+          savedX,
+          savedY,
+          savedPageIndex
+        }] of map) {
+          move(editor, savedX, savedY, savedPageIndex);
+        }
+      },
+      mustExec: true
+    });
+    return true;
+  }
+  dragSelectedEditors(tx, ty) {
+    if (!this.#draggingEditors) {
+      return;
+    }
+    for (const editor of this.#draggingEditors.keys()) {
+      editor.drag(tx, ty);
+    }
+  }
+  rebuild(editor) {
+    if (editor.parent === null) {
+      const parent = this.getLayer(editor.pageIndex);
+      if (parent) {
+        parent.changeParent(editor);
+        parent.addOrRebuild(editor);
+      } else {
+        this.addEditor(editor);
+        this.addToAnnotationStorage(editor);
+        editor.rebuild();
+      }
+    } else {
+      editor.parent.addOrRebuild(editor);
+    }
+  }
+  get isEditorHandlingKeyboard() {
+    return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents();
+  }
+  isActive(editor) {
+    return this.#activeEditor === editor;
+  }
+  getActive() {
+    return this.#activeEditor;
+  }
+  getMode() {
+    return this.#mode;
+  }
+  isEditingMode() {
+    return this.#mode !== AnnotationEditorType.NONE;
+  }
+  get imageManager() {
+    return shadow(this, "imageManager", new ImageManager());
+  }
+  getSelectionBoxes(textLayer) {
+    if (!textLayer) {
+      return null;
+    }
+    const selection = document.getSelection();
+    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {
+      if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) {
+        return null;
+      }
+    }
+    const {
+      x: layerX,
+      y: layerY,
+      width: parentWidth,
+      height: parentHeight
+    } = textLayer.getBoundingClientRect();
+    let rotator;
+    switch (textLayer.getAttribute("data-main-rotation")) {
+      case "90":
+        rotator = (x, y, w, h) => ({
+          x: (y - layerY) / parentHeight,
+          y: 1 - (x + w - layerX) / parentWidth,
+          width: h / parentHeight,
+          height: w / parentWidth
+        });
+        break;
+      case "180":
+        rotator = (x, y, w, h) => ({
+          x: 1 - (x + w - layerX) / parentWidth,
+          y: 1 - (y + h - layerY) / parentHeight,
+          width: w / parentWidth,
+          height: h / parentHeight
+        });
+        break;
+      case "270":
+        rotator = (x, y, w, h) => ({
+          x: 1 - (y + h - layerY) / parentHeight,
+          y: (x - layerX) / parentWidth,
+          width: h / parentHeight,
+          height: w / parentWidth
+        });
+        break;
+      default:
+        rotator = (x, y, w, h) => ({
+          x: (x - layerX) / parentWidth,
+          y: (y - layerY) / parentHeight,
+          width: w / parentWidth,
+          height: h / parentHeight
+        });
+        break;
+    }
+    const boxes = [];
+    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {
+      const range = selection.getRangeAt(i);
+      if (range.collapsed) {
+        continue;
+      }
+      for (const {
+        x,
+        y,
+        width,
+        height
+      } of range.getClientRects()) {
+        if (width === 0 || height === 0) {
+          continue;
+        }
+        boxes.push(rotator(x, y, width, height));
+      }
+    }
+    return boxes.length === 0 ? null : boxes;
+  }
+  addChangedExistingAnnotation({
+    annotationElementId,
+    id
+  }) {
+    (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id);
+  }
+  removeChangedExistingAnnotation({
+    annotationElementId
+  }) {
+    this.#changedExistingAnnotations?.delete(annotationElementId);
+  }
+  renderAnnotationElement(annotation) {
+    const editorId = this.#changedExistingAnnotations?.get(annotation.data.id);
+    if (!editorId) {
+      return;
+    }
+    const editor = this.#annotationStorage.getRawValue(editorId);
+    if (!editor) {
+      return;
+    }
+    if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) {
+      return;
+    }
+    editor.renderAnnotationElement(annotation);
+  }
+  setMissingCanvas(annotationId, annotationElementId, canvas) {
+    const editor = this.#missingCanvases?.get(annotationId);
+    if (!editor) {
+      return;
+    }
+    editor.setCanvas(annotationElementId, canvas);
+    this.#missingCanvases.delete(annotationId);
+  }
+  addMissingCanvas(annotationId, editor) {
+    (this.#missingCanvases ||= new Map()).set(annotationId, editor);
+  }
+}
+
+;// ./src/display/editor/alt_text.js
+
+class AltText {
+  #altText = null;
+  #altTextDecorative = false;
+  #altTextButton = null;
+  #altTextButtonLabel = null;
+  #altTextTooltip = null;
+  #altTextTooltipTimeout = null;
+  #altTextWasFromKeyBoard = false;
+  #badge = null;
+  #editor = null;
+  #guessedText = null;
+  #textWithDisclaimer = null;
+  #useNewAltTextFlow = false;
+  static #l10nNewButton = null;
+  static _l10n = null;
+  constructor(editor) {
+    this.#editor = editor;
+    this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow;
+    AltText.#l10nNewButton ||= Object.freeze({
+      added: "pdfjs-editor-new-alt-text-added-button",
+      "added-label": "pdfjs-editor-new-alt-text-added-button-label",
+      missing: "pdfjs-editor-new-alt-text-missing-button",
+      "missing-label": "pdfjs-editor-new-alt-text-missing-button-label",
+      review: "pdfjs-editor-new-alt-text-to-review-button",
+      "review-label": "pdfjs-editor-new-alt-text-to-review-button-label"
+    });
+  }
+  static initialize(l10n) {
+    AltText._l10n ??= l10n;
+  }
+  async render() {
+    const altText = this.#altTextButton = document.createElement("button");
+    altText.className = "altText";
+    altText.tabIndex = "0";
+    const label = this.#altTextButtonLabel = document.createElement("span");
+    altText.append(label);
+    if (this.#useNewAltTextFlow) {
+      altText.classList.add("new");
+      altText.setAttribute("data-l10n-id", AltText.#l10nNewButton.missing);
+      label.setAttribute("data-l10n-id", AltText.#l10nNewButton["missing-label"]);
+    } else {
+      altText.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button");
+      label.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label");
+    }
+    const signal = this.#editor._uiManager._signal;
+    altText.addEventListener("contextmenu", noContextMenu, {
+      signal
+    });
+    altText.addEventListener("pointerdown", event => event.stopPropagation(), {
+      signal
+    });
+    const onClick = event => {
+      event.preventDefault();
+      this.#editor._uiManager.editAltText(this.#editor);
+      if (this.#useNewAltTextFlow) {
+        this.#editor._reportTelemetry({
+          action: "pdfjs.image.alt_text.image_status_label_clicked",
+          data: {
+            label: this.#label
+          }
+        });
+      }
+    };
+    altText.addEventListener("click", onClick, {
+      capture: true,
+      signal
+    });
+    altText.addEventListener("keydown", event => {
+      if (event.target === altText && event.key === "Enter") {
+        this.#altTextWasFromKeyBoard = true;
+        onClick(event);
+      }
+    }, {
+      signal
+    });
+    await this.#setState();
+    return altText;
+  }
+  get #label() {
+    return this.#altText && "added" || this.#altText === null && this.guessedText && "review" || "missing";
+  }
+  finish() {
+    if (!this.#altTextButton) {
+      return;
+    }
+    this.#altTextButton.focus({
+      focusVisible: this.#altTextWasFromKeyBoard
+    });
+    this.#altTextWasFromKeyBoard = false;
+  }
+  isEmpty() {
+    if (this.#useNewAltTextFlow) {
+      return this.#altText === null;
+    }
+    return !this.#altText && !this.#altTextDecorative;
+  }
+  hasData() {
+    if (this.#useNewAltTextFlow) {
+      return this.#altText !== null || !!this.#guessedText;
+    }
+    return this.isEmpty();
+  }
+  get guessedText() {
+    return this.#guessedText;
+  }
+  async setGuessedText(guessedText) {
+    if (this.#altText !== null) {
+      return;
+    }
+    this.#guessedText = guessedText;
+    this.#textWithDisclaimer = await AltText._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", {
+      generatedAltText: guessedText
+    });
+    this.#setState();
+  }
+  toggleAltTextBadge(visibility = false) {
+    if (!this.#useNewAltTextFlow || this.#altText) {
+      this.#badge?.remove();
+      this.#badge = null;
+      return;
+    }
+    if (!this.#badge) {
+      const badge = this.#badge = document.createElement("div");
+      badge.className = "noAltTextBadge";
+      this.#editor.div.append(badge);
+    }
+    this.#badge.classList.toggle("hidden", !visibility);
+  }
+  serialize(isForCopying) {
+    let altText = this.#altText;
+    if (!isForCopying && this.#guessedText === altText) {
+      altText = this.#textWithDisclaimer;
+    }
+    return {
+      altText,
+      decorative: this.#altTextDecorative,
+      guessedText: this.#guessedText,
+      textWithDisclaimer: this.#textWithDisclaimer
+    };
+  }
+  get data() {
+    return {
+      altText: this.#altText,
+      decorative: this.#altTextDecorative
+    };
+  }
+  set data({
+    altText,
+    decorative,
+    guessedText,
+    textWithDisclaimer,
+    cancel = false
+  }) {
+    if (guessedText) {
+      this.#guessedText = guessedText;
+      this.#textWithDisclaimer = textWithDisclaimer;
+    }
+    if (this.#altText === altText && this.#altTextDecorative === decorative) {
+      return;
+    }
+    if (!cancel) {
+      this.#altText = altText;
+      this.#altTextDecorative = decorative;
+    }
+    this.#setState();
+  }
+  toggle(enabled = false) {
+    if (!this.#altTextButton) {
+      return;
+    }
+    if (!enabled && this.#altTextTooltipTimeout) {
+      clearTimeout(this.#altTextTooltipTimeout);
+      this.#altTextTooltipTimeout = null;
+    }
+    this.#altTextButton.disabled = !enabled;
+  }
+  shown() {
+    this.#editor._reportTelemetry({
+      action: "pdfjs.image.alt_text.image_status_label_displayed",
+      data: {
+        label: this.#label
+      }
+    });
+  }
+  destroy() {
+    this.#altTextButton?.remove();
+    this.#altTextButton = null;
+    this.#altTextButtonLabel = null;
+    this.#altTextTooltip = null;
+    this.#badge?.remove();
+    this.#badge = null;
+  }
+  async #setState() {
+    const button = this.#altTextButton;
+    if (!button) {
+      return;
+    }
+    if (this.#useNewAltTextFlow) {
+      button.classList.toggle("done", !!this.#altText);
+      button.setAttribute("data-l10n-id", AltText.#l10nNewButton[this.#label]);
+      this.#altTextButtonLabel?.setAttribute("data-l10n-id", AltText.#l10nNewButton[`${this.#label}-label`]);
+      if (!this.#altText) {
+        this.#altTextTooltip?.remove();
+        return;
+      }
+    } else {
+      if (!this.#altText && !this.#altTextDecorative) {
+        button.classList.remove("done");
+        this.#altTextTooltip?.remove();
+        return;
+      }
+      button.classList.add("done");
+      button.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button");
+    }
+    let tooltip = this.#altTextTooltip;
+    if (!tooltip) {
+      this.#altTextTooltip = tooltip = document.createElement("span");
+      tooltip.className = "tooltip";
+      tooltip.setAttribute("role", "tooltip");
+      tooltip.id = `alt-text-tooltip-${this.#editor.id}`;
+      const DELAY_TO_SHOW_TOOLTIP = 100;
+      const signal = this.#editor._uiManager._signal;
+      signal.addEventListener("abort", () => {
+        clearTimeout(this.#altTextTooltipTimeout);
+        this.#altTextTooltipTimeout = null;
+      }, {
+        once: true
+      });
+      button.addEventListener("mouseenter", () => {
+        this.#altTextTooltipTimeout = setTimeout(() => {
+          this.#altTextTooltipTimeout = null;
+          this.#altTextTooltip.classList.add("show");
+          this.#editor._reportTelemetry({
+            action: "alt_text_tooltip"
+          });
+        }, DELAY_TO_SHOW_TOOLTIP);
+      }, {
+        signal
+      });
+      button.addEventListener("mouseleave", () => {
+        if (this.#altTextTooltipTimeout) {
+          clearTimeout(this.#altTextTooltipTimeout);
+          this.#altTextTooltipTimeout = null;
+        }
+        this.#altTextTooltip?.classList.remove("show");
+      }, {
+        signal
+      });
+    }
+    if (this.#altTextDecorative) {
+      tooltip.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip");
+    } else {
+      tooltip.removeAttribute("data-l10n-id");
+      tooltip.textContent = this.#altText;
+    }
+    if (!tooltip.parentNode) {
+      button.append(tooltip);
+    }
+    const element = this.#editor.getElementForAltText();
+    element?.setAttribute("aria-describedby", tooltip.id);
+  }
+}
+
+;// ./src/display/editor/comment.js
+
+class Comment {
+  #commentStandaloneButton = null;
+  #commentToolbarButton = null;
+  #commentWasFromKeyBoard = false;
+  #editor = null;
+  #initialText = null;
+  #richText = null;
+  #text = null;
+  #date = null;
+  #deleted = false;
+  #popupPosition = null;
+  constructor(editor) {
+    this.#editor = editor;
+  }
+  renderForToolbar() {
+    const button = this.#commentToolbarButton = document.createElement("button");
+    button.className = "comment";
+    return this.#render(button, false);
+  }
+  renderForStandalone() {
+    const button = this.#commentStandaloneButton = document.createElement("button");
+    button.className = "annotationCommentButton";
+    const position = this.#editor.commentButtonPosition;
+    if (position) {
+      const {
+        style
+      } = button;
+      style.insetInlineEnd = `calc(${100 * (this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0])}% - var(--comment-button-dim))`;
+      style.top = `calc(${100 * position[1]}% - var(--comment-button-dim))`;
+      const color = this.#editor.commentButtonColor;
+      if (color) {
+        style.backgroundColor = color;
+      }
+    }
+    return this.#render(button, true);
+  }
+  focusButton() {
+    setTimeout(() => {
+      (this.#commentStandaloneButton ?? this.#commentToolbarButton)?.focus();
+    }, 0);
+  }
+  onUpdatedColor() {
+    if (!this.#commentStandaloneButton) {
+      return;
+    }
+    const color = this.#editor.commentButtonColor;
+    if (color) {
+      this.#commentStandaloneButton.style.backgroundColor = color;
+    }
+    this.#editor._uiManager.updatePopupColor(this.#editor);
+  }
+  get commentButtonWidth() {
+    return (this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) / this.#editor.parent.boundingClientRect.width;
+  }
+  get commentPopupPositionInLayer() {
+    if (this.#popupPosition) {
+      return this.#popupPosition;
+    }
+    if (!this.#commentStandaloneButton) {
+      return null;
+    }
+    const {
+      x,
+      y,
+      height
+    } = this.#commentStandaloneButton.getBoundingClientRect();
+    const {
+      x: parentX,
+      y: parentY,
+      width: parentWidth,
+      height: parentHeight
+    } = this.#editor.parent.boundingClientRect;
+    return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight];
+  }
+  set commentPopupPositionInLayer(pos) {
+    this.#popupPosition = pos;
+  }
+  hasDefaultPopupPosition() {
+    return this.#popupPosition === null;
+  }
+  removeStandaloneCommentButton() {
+    this.#commentStandaloneButton?.remove();
+    this.#commentStandaloneButton = null;
+  }
+  removeToolbarCommentButton() {
+    this.#commentToolbarButton?.remove();
+    this.#commentToolbarButton = null;
+  }
+  setCommentButtonStates({
+    selected,
+    hasPopup
+  }) {
+    if (!this.#commentStandaloneButton) {
+      return;
+    }
+    this.#commentStandaloneButton.classList.toggle("selected", selected);
+    this.#commentStandaloneButton.ariaExpanded = hasPopup;
+  }
+  #render(comment, isStandalone) {
+    if (!this.#editor._uiManager.hasCommentManager()) {
+      return null;
+    }
+    comment.tabIndex = "0";
+    comment.ariaHasPopup = "dialog";
+    if (isStandalone) {
+      comment.ariaControls = "commentPopup";
+      comment.setAttribute("data-l10n-id", "pdfjs-show-comment-button");
+    } else {
+      comment.ariaControlsElements = [this.#editor._uiManager.getCommentDialogElement()];
+      comment.setAttribute("data-l10n-id", "pdfjs-editor-add-comment-button");
+    }
+    const signal = this.#editor._uiManager._signal;
+    if (!(signal instanceof AbortSignal) || signal.aborted) {
+      return comment;
+    }
+    comment.addEventListener("contextmenu", noContextMenu, {
+      signal
+    });
+    if (isStandalone) {
+      comment.addEventListener("focusin", e => {
+        this.#editor._focusEventsAllowed = false;
+        stopEvent(e);
+      }, {
+        capture: true,
+        signal
+      });
+      comment.addEventListener("focusout", e => {
+        this.#editor._focusEventsAllowed = true;
+        stopEvent(e);
+      }, {
+        capture: true,
+        signal
+      });
+    }
+    comment.addEventListener("pointerdown", event => event.stopPropagation(), {
+      signal
+    });
+    const onClick = event => {
+      event.preventDefault();
+      if (comment === this.#commentToolbarButton) {
+        this.edit();
+      } else {
+        this.#editor.toggleComment(true);
+      }
+    };
+    comment.addEventListener("click", onClick, {
+      capture: true,
+      signal
+    });
+    comment.addEventListener("keydown", event => {
+      if (event.target === comment && event.key === "Enter") {
+        this.#commentWasFromKeyBoard = true;
+        onClick(event);
+      }
+    }, {
+      signal
+    });
+    comment.addEventListener("pointerenter", () => {
+      this.#editor.toggleComment(false, true);
+    }, {
+      signal
+    });
+    comment.addEventListener("pointerleave", () => {
+      this.#editor.toggleComment(false, false);
+    }, {
+      signal
+    });
+    return comment;
+  }
+  edit(options) {
+    const position = this.commentPopupPositionInLayer;
+    let posX, posY;
+    if (position) {
+      [posX, posY] = position;
+    } else {
+      [posX, posY] = this.#editor.commentButtonPosition;
+      const {
+        width,
+        height,
+        x,
+        y
+      } = this.#editor;
+      posX = x + posX * width;
+      posY = y + posY * height;
+    }
+    const parentDimensions = this.#editor.parent.boundingClientRect;
+    const {
+      x: parentX,
+      y: parentY,
+      width: parentWidth,
+      height: parentHeight
+    } = parentDimensions;
+    this.#editor._uiManager.editComment(this.#editor, parentX + posX * parentWidth, parentY + posY * parentHeight, {
+      ...options,
+      parentDimensions
+    });
+  }
+  finish() {
+    if (!this.#commentToolbarButton) {
+      return;
+    }
+    this.#commentToolbarButton.focus({
+      focusVisible: this.#commentWasFromKeyBoard
+    });
+    this.#commentWasFromKeyBoard = false;
+  }
+  isDeleted() {
+    return this.#deleted || this.#text === "";
+  }
+  isEmpty() {
+    return this.#text === null;
+  }
+  hasBeenEdited() {
+    return this.isDeleted() || this.#text !== this.#initialText;
+  }
+  serialize() {
+    return this.data;
+  }
+  get data() {
+    return {
+      text: this.#text,
+      richText: this.#richText,
+      date: this.#date,
+      deleted: this.isDeleted()
+    };
+  }
+  set data(text) {
+    if (text !== this.#text) {
+      this.#richText = null;
+    }
+    if (text === null) {
+      this.#text = "";
+      this.#deleted = true;
+      return;
+    }
+    this.#text = text;
+    this.#date = new Date();
+    this.#deleted = false;
+  }
+  restoreData({
+    text,
+    richText,
+    date
+  }) {
+    this.#text = text;
+    this.#richText = richText;
+    this.#date = date;
+    this.#deleted = false;
+  }
+  setInitialText(text, richText = null) {
+    this.#initialText = text;
+    this.data = text;
+    this.#date = null;
+    this.#richText = richText;
+  }
+  shown() {}
+  destroy() {
+    this.#commentToolbarButton?.remove();
+    this.#commentToolbarButton = null;
+    this.#commentStandaloneButton?.remove();
+    this.#commentStandaloneButton = null;
+    this.#text = "";
+    this.#richText = null;
+    this.#date = null;
+    this.#editor = null;
+    this.#commentWasFromKeyBoard = false;
+    this.#deleted = false;
+  }
+}
+
+;// ./src/display/touch_manager.js
+
+class TouchManager {
+  #container;
+  #isPinching = false;
+  #isPinchingStopped = null;
+  #isPinchingDisabled;
+  #onPinchStart;
+  #onPinching;
+  #onPinchEnd;
+  #pointerDownAC = null;
+  #signal;
+  #touchInfo = null;
+  #touchManagerAC;
+  #touchMoveAC = null;
+  constructor({
+    container,
+    isPinchingDisabled = null,
+    isPinchingStopped = null,
+    onPinchStart = null,
+    onPinching = null,
+    onPinchEnd = null,
+    signal
+  }) {
+    this.#container = container;
+    this.#isPinchingStopped = isPinchingStopped;
+    this.#isPinchingDisabled = isPinchingDisabled;
+    this.#onPinchStart = onPinchStart;
+    this.#onPinching = onPinching;
+    this.#onPinchEnd = onPinchEnd;
+    this.#touchManagerAC = new AbortController();
+    this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]);
+    container.addEventListener("touchstart", this.#onTouchStart.bind(this), {
+      passive: false,
+      signal: this.#signal
+    });
+  }
+  get MIN_TOUCH_DISTANCE_TO_PINCH() {
+    return 35 / OutputScale.pixelRatio;
+  }
+  #onTouchStart(evt) {
+    if (this.#isPinchingDisabled?.()) {
+      return;
+    }
+    if (evt.touches.length === 1) {
+      if (this.#pointerDownAC) {
+        return;
+      }
+      const pointerDownAC = this.#pointerDownAC = new AbortController();
+      const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]);
+      const container = this.#container;
+      const opts = {
+        capture: true,
+        signal,
+        passive: false
+      };
+      const cancelPointerDown = e => {
+        if (e.pointerType === "touch") {
+          this.#pointerDownAC?.abort();
+          this.#pointerDownAC = null;
+        }
+      };
+      container.addEventListener("pointerdown", e => {
+        if (e.pointerType === "touch") {
+          stopEvent(e);
+          cancelPointerDown(e);
+        }
+      }, opts);
+      container.addEventListener("pointerup", cancelPointerDown, opts);
+      container.addEventListener("pointercancel", cancelPointerDown, opts);
+      return;
+    }
+    if (!this.#touchMoveAC) {
+      this.#touchMoveAC = new AbortController();
+      const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]);
+      const container = this.#container;
+      const opt = {
+        signal,
+        capture: false,
+        passive: false
+      };
+      container.addEventListener("touchmove", this.#onTouchMove.bind(this), opt);
+      const onTouchEnd = this.#onTouchEnd.bind(this);
+      container.addEventListener("touchend", onTouchEnd, opt);
+      container.addEventListener("touchcancel", onTouchEnd, opt);
+      opt.capture = true;
+      container.addEventListener("pointerdown", stopEvent, opt);
+      container.addEventListener("pointermove", stopEvent, opt);
+      container.addEventListener("pointercancel", stopEvent, opt);
+      container.addEventListener("pointerup", stopEvent, opt);
+      this.#onPinchStart?.();
+    }
+    stopEvent(evt);
+    if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) {
+      this.#touchInfo = null;
+      return;
+    }
+    let [touch0, touch1] = evt.touches;
+    if (touch0.identifier > touch1.identifier) {
+      [touch0, touch1] = [touch1, touch0];
+    }
+    this.#touchInfo = {
+      touch0X: touch0.screenX,
+      touch0Y: touch0.screenY,
+      touch1X: touch1.screenX,
+      touch1Y: touch1.screenY
+    };
+  }
+  #onTouchMove(evt) {
+    if (!this.#touchInfo || evt.touches.length !== 2) {
+      return;
+    }
+    stopEvent(evt);
+    let [touch0, touch1] = evt.touches;
+    if (touch0.identifier > touch1.identifier) {
+      [touch0, touch1] = [touch1, touch0];
+    }
+    const {
+      screenX: screen0X,
+      screenY: screen0Y
+    } = touch0;
+    const {
+      screenX: screen1X,
+      screenY: screen1Y
+    } = touch1;
+    const touchInfo = this.#touchInfo;
+    const {
+      touch0X: pTouch0X,
+      touch0Y: pTouch0Y,
+      touch1X: pTouch1X,
+      touch1Y: pTouch1Y
+    } = touchInfo;
+    const prevGapX = pTouch1X - pTouch0X;
+    const prevGapY = pTouch1Y - pTouch0Y;
+    const currGapX = screen1X - screen0X;
+    const currGapY = screen1Y - screen0Y;
+    const distance = Math.hypot(currGapX, currGapY) || 1;
+    const pDistance = Math.hypot(prevGapX, prevGapY) || 1;
+    if (!this.#isPinching && Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH) {
+      return;
+    }
+    touchInfo.touch0X = screen0X;
+    touchInfo.touch0Y = screen0Y;
+    touchInfo.touch1X = screen1X;
+    touchInfo.touch1Y = screen1Y;
+    if (!this.#isPinching) {
+      this.#isPinching = true;
+      return;
+    }
+    const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2];
+    this.#onPinching?.(origin, pDistance, distance);
+  }
+  #onTouchEnd(evt) {
+    if (evt.touches.length >= 2) {
+      return;
+    }
+    if (this.#touchMoveAC) {
+      this.#touchMoveAC.abort();
+      this.#touchMoveAC = null;
+      this.#onPinchEnd?.();
+    }
+    if (!this.#touchInfo) {
+      return;
+    }
+    stopEvent(evt);
+    this.#touchInfo = null;
+    this.#isPinching = false;
+  }
+  destroy() {
+    this.#touchManagerAC?.abort();
+    this.#touchManagerAC = null;
+    this.#pointerDownAC?.abort();
+    this.#pointerDownAC = null;
+  }
+}
+
+;// ./src/display/editor/editor.js
+
+
+
+
+
+
+
+
+class AnnotationEditor {
+  #accessibilityData = null;
+  #allResizerDivs = null;
+  #altText = null;
+  #comment = null;
+  #commentStandaloneButton = null;
+  #disabled = false;
+  #dragPointerId = null;
+  #dragPointerType = "";
+  #resizersDiv = null;
+  #lastPointerCoords = null;
+  #savedDimensions = null;
+  #fakeAnnotation = null;
+  #focusAC = null;
+  #focusedResizerName = "";
+  #hasBeenClicked = false;
+  #initialRect = null;
+  #isEditing = false;
+  #isInEditMode = false;
+  #isResizerEnabledForKeyboard = false;
+  #moveInDOMTimeout = null;
+  #prevDragX = 0;
+  #prevDragY = 0;
+  #telemetryTimeouts = null;
+  #touchManager = null;
+  isSelected = false;
+  _isCopy = false;
+  _editToolbar = null;
+  _initialOptions = Object.create(null);
+  _initialData = null;
+  _isVisible = true;
+  _uiManager = null;
+  _focusEventsAllowed = true;
+  static _l10n = null;
+  static _l10nAlert = null;
+  static _l10nResizer = null;
+  #isDraggable = false;
+  #zIndex = AnnotationEditor._zIndex++;
+  static _borderLineWidth = -1;
+  static _colorManager = new ColorManager();
+  static _zIndex = 1;
+  static _telemetryTimeout = 1000;
+  static get _resizerKeyboardManager() {
+    const resize = AnnotationEditor.prototype._resizeWithKeyboard;
+    const small = AnnotationEditorUIManager.TRANSLATE_SMALL;
+    const big = AnnotationEditorUIManager.TRANSLATE_BIG;
+    return shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft"], resize, {
+      args: [-small, 0]
+    }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, {
+      args: [-big, 0]
+    }], [["ArrowRight"], resize, {
+      args: [small, 0]
+    }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, {
+      args: [big, 0]
+    }], [["ArrowUp"], resize, {
+      args: [0, -small]
+    }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, {
+      args: [0, -big]
+    }], [["ArrowDown"], resize, {
+      args: [0, small]
+    }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, {
+      args: [0, big]
+    }], [["Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]]));
+  }
+  constructor(parameters) {
+    this.parent = parameters.parent;
+    this.id = parameters.id;
+    this.width = this.height = null;
+    this.pageIndex = parameters.parent.pageIndex;
+    this.name = parameters.name;
+    this.div = null;
+    this._uiManager = parameters.uiManager;
+    this.annotationElementId = null;
+    this._willKeepAspectRatio = false;
+    this._initialOptions.isCentered = parameters.isCentered;
+    this._structTreeParentId = null;
+    this.annotationElementId = parameters.annotationElementId || null;
+    this.creationDate = parameters.creationDate || new Date();
+    this.modificationDate = parameters.modificationDate || null;
+    this.canAddComment = true;
+    const {
+      rotation,
+      rawDims: {
+        pageWidth,
+        pageHeight,
+        pageX,
+        pageY
+      }
+    } = this.parent.viewport;
+    this.rotation = rotation;
+    this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360;
+    this.pageDimensions = [pageWidth, pageHeight];
+    this.pageTranslation = [pageX, pageY];
+    const [width, height] = this.parentDimensions;
+    this.x = parameters.x / width;
+    this.y = parameters.y / height;
+    this.isAttachedToDOM = false;
+    this.deleted = false;
+  }
+  updatePageIndex(newPageIndex) {
+    this.pageIndex = newPageIndex;
+  }
+  get editorType() {
+    return Object.getPrototypeOf(this).constructor._type;
+  }
+  get mode() {
+    return Object.getPrototypeOf(this).constructor._editorType;
+  }
+  static get isDrawer() {
+    return false;
+  }
+  static get _defaultLineColor() {
+    return shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText"));
+  }
+  static deleteAnnotationElement(editor) {
+    const fakeEditor = new FakeEditor({
+      id: editor._uiManager.getId(),
+      parent: editor.parent,
+      uiManager: editor._uiManager
+    });
+    fakeEditor.annotationElementId = editor.annotationElementId;
+    fakeEditor.deleted = true;
+    fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);
+  }
+  static initialize(l10n, _uiManager) {
+    AnnotationEditor._l10n ??= l10n;
+    AnnotationEditor._l10nAlert ??= Object.freeze({
+      highlight: "pdfjs-editor-highlight-added-alert",
+      freetext: "pdfjs-editor-freetext-added-alert",
+      ink: "pdfjs-editor-ink-added-alert",
+      stamp: "pdfjs-editor-stamp-added-alert",
+      signature: "pdfjs-editor-signature-added-alert"
+    });
+    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 (AnnotationEditor._borderLineWidth !== -1) {
+      return;
+    }
+    const style = getComputedStyle(document.documentElement);
+    AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0;
+  }
+  static updateDefaultParams(_type, _value) {}
+  static get defaultPropertiesToUpdate() {
+    return [];
+  }
+  static isHandlingMimeForPasting(mime) {
+    return false;
+  }
+  static paste(item, parent) {
+    unreachable("Not implemented");
+  }
+  get propertiesToUpdate() {
+    return [];
+  }
+  get _isDraggable() {
+    return this.#isDraggable;
+  }
+  set _isDraggable(value) {
+    this.#isDraggable = value;
+    this.div?.classList.toggle("draggable", value);
+  }
+  get uid() {
+    return this.annotationElementId || this.id;
+  }
+  get isEnterHandled() {
+    return true;
+  }
+  center() {
+    const [pageWidth, pageHeight] = this.pageDimensions;
+    switch (this.parentRotation) {
+      case 90:
+        this.x -= this.height * pageHeight / (pageWidth * 2);
+        this.y += this.width * pageWidth / (pageHeight * 2);
+        break;
+      case 180:
+        this.x += this.width / 2;
+        this.y += this.height / 2;
+        break;
+      case 270:
+        this.x += this.height * pageHeight / (pageWidth * 2);
+        this.y -= this.width * pageWidth / (pageHeight * 2);
+        break;
+      default:
+        this.x -= this.width / 2;
+        this.y -= this.height / 2;
+        break;
+    }
+    this.fixAndSetPosition();
+  }
+  addCommands(params) {
+    this._uiManager.addCommands(params);
+  }
+  get currentLayer() {
+    return this._uiManager.currentLayer;
+  }
+  setInBackground() {
+    this.div.style.zIndex = 0;
+  }
+  setInForeground() {
+    this.div.style.zIndex = this.#zIndex;
+  }
+  setParent(parent) {
+    if (parent !== null) {
+      this.pageIndex = parent.pageIndex;
+      this.pageDimensions = parent.pageDimensions;
+    } else {
+      this.#stopResizing();
+      this.#fakeAnnotation?.remove();
+      this.#fakeAnnotation = null;
+    }
+    this.parent = parent;
+  }
+  focusin(event) {
+    if (!this._focusEventsAllowed) {
+      return;
+    }
+    if (!this.#hasBeenClicked) {
+      this.parent.setSelected(this);
+    } else {
+      this.#hasBeenClicked = false;
+    }
+  }
+  focusout(event) {
+    if (!this._focusEventsAllowed) {
+      return;
+    }
+    if (!this.isAttachedToDOM) {
+      return;
+    }
+    const target = event.relatedTarget;
+    if (target?.closest(`#${this.id}`)) {
+      return;
+    }
+    event.preventDefault();
+    if (!this.parent?.isMultipleSelection) {
+      this.commitOrRemove();
+    }
+  }
+  commitOrRemove() {
+    if (this.isEmpty()) {
+      this.remove();
+    } else {
+      this.commit();
+    }
+  }
+  commit() {
+    if (!this.isInEditMode()) {
+      return;
+    }
+    this.addToAnnotationStorage();
+  }
+  addToAnnotationStorage() {
+    this._uiManager.addToAnnotationStorage(this);
+  }
+  setAt(x, y, tx, ty) {
+    const [width, height] = this.parentDimensions;
+    [tx, ty] = this.screenToPageTranslation(tx, ty);
+    this.x = (x + tx) / width;
+    this.y = (y + ty) / height;
+    this.fixAndSetPosition();
+  }
+  _moveAfterPaste(baseX, baseY) {
+    if (this.isClone) {
+      delete this.isClone;
+      return;
+    }
+    const [parentWidth, parentHeight] = this.parentDimensions;
+    this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight);
+    this._onTranslated();
+  }
+  #translate([width, height], x, y) {
+    [x, y] = this.screenToPageTranslation(x, y);
+    this.x += x / width;
+    this.y += y / height;
+    this._onTranslating(this.x, this.y);
+    this.fixAndSetPosition();
+  }
+  translate(x, y) {
+    this.#translate(this.parentDimensions, x, y);
+  }
+  translateInPage(x, y) {
+    this.#initialRect ||= [this.x, this.y, this.width, this.height];
+    this.#translate(this.pageDimensions, x, y);
+    this.div.scrollIntoView({
+      block: "nearest"
+    });
+  }
+  translationDone() {
+    this._onTranslated(this.x, this.y);
+  }
+  drag(tx, ty) {
+    this.#initialRect ||= [this.x, this.y, this.width, this.height];
+    const {
+      div,
+      parentDimensions: [parentWidth, parentHeight]
+    } = this;
+    this.x += tx / parentWidth;
+    this.y += ty / parentHeight;
+    if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {
+      const {
+        x,
+        y
+      } = this.div.getBoundingClientRect();
+      if (this.parent.findNewParent(this, x, y)) {
+        this.x -= Math.floor(this.x);
+        this.y -= Math.floor(this.y);
+      }
+    }
+    let {
+      x,
+      y
+    } = this;
+    const [bx, by] = this.getBaseTranslation();
+    x += bx;
+    y += by;
+    const {
+      style
+    } = div;
+    style.left = `${(100 * x).toFixed(2)}%`;
+    style.top = `${(100 * y).toFixed(2)}%`;
+    this._onTranslating(x, y);
+    div.scrollIntoView({
+      block: "nearest"
+    });
+  }
+  _onTranslating(x, y) {}
+  _onTranslated(x, y) {}
+  get _hasBeenMoved() {
+    return !!this.#initialRect && (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y);
+  }
+  get _hasBeenResized() {
+    return !!this.#initialRect && (this.#initialRect[2] !== this.width || this.#initialRect[3] !== this.height);
+  }
+  getBaseTranslation() {
+    const [parentWidth, parentHeight] = this.parentDimensions;
+    const {
+      _borderLineWidth
+    } = AnnotationEditor;
+    const x = _borderLineWidth / parentWidth;
+    const y = _borderLineWidth / parentHeight;
+    switch (this.rotation) {
+      case 90:
+        return [-x, y];
+      case 180:
+        return [x, y];
+      case 270:
+        return [x, -y];
+      default:
+        return [-x, -y];
+    }
+  }
+  get _mustFixPosition() {
+    return true;
+  }
+  fixAndSetPosition(rotation = this.rotation) {
+    const {
+      div: {
+        style
+      },
+      pageDimensions: [pageWidth, pageHeight]
+    } = this;
+    let {
+      x,
+      y,
+      width,
+      height
+    } = this;
+    width *= pageWidth;
+    height *= pageHeight;
+    x *= pageWidth;
+    y *= pageHeight;
+    if (this._mustFixPosition) {
+      switch (rotation) {
+        case 0:
+          x = MathClamp(x, 0, pageWidth - width);
+          y = MathClamp(y, 0, pageHeight - height);
+          break;
+        case 90:
+          x = MathClamp(x, 0, pageWidth - height);
+          y = MathClamp(y, width, pageHeight);
+          break;
+        case 180:
+          x = MathClamp(x, width, pageWidth);
+          y = MathClamp(y, height, pageHeight);
+          break;
+        case 270:
+          x = MathClamp(x, height, pageWidth);
+          y = MathClamp(y, 0, pageHeight - width);
+          break;
+      }
+    }
+    this.x = x /= pageWidth;
+    this.y = y /= pageHeight;
+    const [bx, by] = this.getBaseTranslation();
+    x += bx;
+    y += by;
+    style.left = `${(100 * x).toFixed(2)}%`;
+    style.top = `${(100 * y).toFixed(2)}%`;
+    this.moveInDOM();
+  }
+  static #rotatePoint(x, y, angle) {
+    switch (angle) {
+      case 90:
+        return [y, -x];
+      case 180:
+        return [-x, -y];
+      case 270:
+        return [-y, x];
+      default:
+        return [x, y];
+    }
+  }
+  screenToPageTranslation(x, y) {
+    return AnnotationEditor.#rotatePoint(x, y, this.parentRotation);
+  }
+  pageTranslationToScreen(x, y) {
+    return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation);
+  }
+  #getRotationMatrix(rotation) {
+    switch (rotation) {
+      case 90:
+        {
+          const [pageWidth, pageHeight] = this.pageDimensions;
+          return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];
+        }
+      case 180:
+        return [-1, 0, 0, -1];
+      case 270:
+        {
+          const [pageWidth, pageHeight] = this.pageDimensions;
+          return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 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,
+      pageDimensions: [pageWidth, pageHeight]
+    } = this;
+    return [pageWidth * parentScale, pageHeight * parentScale];
+  }
+  setDims() {
+    const {
+      div: {
+        style
+      },
+      width,
+      height
+    } = this;
+    style.width = `${(100 * width).toFixed(2)}%`;
+    style.height = `${(100 * height).toFixed(2)}%`;
+  }
+  getInitialTranslation() {
+    return [0, 0];
+  }
+  #createResizers() {
+    if (this.#resizersDiv) {
+      return;
+    }
+    this.#resizersDiv = document.createElement("div");
+    this.#resizersDiv.classList.add("resizers");
+    const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"];
+    const signal = this._uiManager._signal;
+    for (const name of classes) {
+      const div = document.createElement("div");
+      this.#resizersDiv.append(div);
+      div.classList.add("resizer", name);
+      div.setAttribute("data-resizer-name", name);
+      div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), {
+        signal
+      });
+      div.addEventListener("contextmenu", noContextMenu, {
+        signal
+      });
+      div.tabIndex = -1;
+    }
+    this.div.prepend(this.#resizersDiv);
+  }
+  #resizerPointerdown(name, event) {
+    event.preventDefault();
+    const {
+      isMac
+    } = FeatureTest.platform;
+    if (event.button !== 0 || event.ctrlKey && isMac) {
+      return;
+    }
+    this.#altText?.toggle(false);
+    const savedDraggable = this._isDraggable;
+    this._isDraggable = false;
+    this.#lastPointerCoords = [event.screenX, event.screenY];
+    const ac = new AbortController();
+    const signal = this._uiManager.combinedSignal(ac);
+    this.parent.togglePointerEvents(false);
+    window.addEventListener("pointermove", this.#resizerPointermove.bind(this, name), {
+      passive: true,
+      capture: true,
+      signal
+    });
+    window.addEventListener("touchmove", stopEvent, {
+      passive: false,
+      signal
+    });
+    window.addEventListener("contextmenu", noContextMenu, {
+      signal
+    });
+    this.#savedDimensions = {
+      savedX: this.x,
+      savedY: this.y,
+      savedWidth: this.width,
+      savedHeight: this.height
+    };
+    const savedParentCursor = this.parent.div.style.cursor;
+    const savedCursor = this.div.style.cursor;
+    this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor;
+    const pointerUpCallback = () => {
+      ac.abort();
+      this.parent.togglePointerEvents(true);
+      this.#altText?.toggle(true);
+      this._isDraggable = savedDraggable;
+      this.parent.div.style.cursor = savedParentCursor;
+      this.div.style.cursor = savedCursor;
+      this.#addResizeToUndoStack();
+    };
+    window.addEventListener("pointerup", pointerUpCallback, {
+      signal
+    });
+    window.addEventListener("blur", pointerUpCallback, {
+      signal
+    });
+  }
+  #resize(x, y, width, height) {
+    this.width = width;
+    this.height = height;
+    this.x = x;
+    this.y = y;
+    this.setDims();
+    this.fixAndSetPosition();
+    this._onResized();
+  }
+  _onResized() {}
+  #addResizeToUndoStack() {
+    if (!this.#savedDimensions) {
+      return;
+    }
+    const {
+      savedX,
+      savedY,
+      savedWidth,
+      savedHeight
+    } = this.#savedDimensions;
+    this.#savedDimensions = null;
+    const newX = this.x;
+    const newY = this.y;
+    const newWidth = this.width;
+    const newHeight = this.height;
+    if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) {
+      return;
+    }
+    this.addCommands({
+      cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight),
+      undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight),
+      mustExec: true
+    });
+  }
+  static _round(x) {
+    return Math.round(x * 10000) / 10000;
+  }
+  #resizerPointermove(name, event) {
+    const [parentWidth, parentHeight] = this.parentDimensions;
+    const savedX = this.x;
+    const savedY = this.y;
+    const savedWidth = this.width;
+    const savedHeight = this.height;
+    const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;
+    const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;
+    const rotationMatrix = this.#getRotationMatrix(this.rotation);
+    const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y];
+    const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation);
+    const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y];
+    let getPoint;
+    let getOpposite;
+    let isDiagonal = false;
+    let isHorizontal = false;
+    switch (name) {
+      case "topLeft":
+        isDiagonal = true;
+        getPoint = (w, h) => [0, 0];
+        getOpposite = (w, h) => [w, h];
+        break;
+      case "topMiddle":
+        getPoint = (w, h) => [w / 2, 0];
+        getOpposite = (w, h) => [w / 2, h];
+        break;
+      case "topRight":
+        isDiagonal = true;
+        getPoint = (w, h) => [w, 0];
+        getOpposite = (w, h) => [0, h];
+        break;
+      case "middleRight":
+        isHorizontal = true;
+        getPoint = (w, h) => [w, h / 2];
+        getOpposite = (w, h) => [0, h / 2];
+        break;
+      case "bottomRight":
+        isDiagonal = true;
+        getPoint = (w, h) => [w, h];
+        getOpposite = (w, h) => [0, 0];
+        break;
+      case "bottomMiddle":
+        getPoint = (w, h) => [w / 2, h];
+        getOpposite = (w, h) => [w / 2, 0];
+        break;
+      case "bottomLeft":
+        isDiagonal = true;
+        getPoint = (w, h) => [0, h];
+        getOpposite = (w, h) => [w, 0];
+        break;
+      case "middleLeft":
+        isHorizontal = true;
+        getPoint = (w, h) => [0, h / 2];
+        getOpposite = (w, h) => [w, h / 2];
+        break;
+    }
+    const point = getPoint(savedWidth, savedHeight);
+    const oppositePoint = getOpposite(savedWidth, savedHeight);
+    let transfOppositePoint = transf(...oppositePoint);
+    const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]);
+    const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]);
+    let ratioX = 1;
+    let ratioY = 1;
+    let deltaX, deltaY;
+    if (!event.fromKeyboard) {
+      const {
+        screenX,
+        screenY
+      } = event;
+      const [lastScreenX, lastScreenY] = this.#lastPointerCoords;
+      [deltaX, deltaY] = this.screenToPageTranslation(screenX - lastScreenX, screenY - lastScreenY);
+      this.#lastPointerCoords[0] = screenX;
+      this.#lastPointerCoords[1] = screenY;
+    } else {
+      ({
+        deltaX,
+        deltaY
+      } = event);
+    }
+    [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);
+    if (isDiagonal) {
+      const oldDiag = Math.hypot(savedWidth, savedHeight);
+      ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight);
+    } else if (isHorizontal) {
+      ratioX = MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) / savedWidth;
+    } else {
+      ratioY = MathClamp(Math.abs(oppositePoint[1] - point[1] - deltaY), minHeight, 1) / savedHeight;
+    }
+    const newWidth = AnnotationEditor._round(savedWidth * ratioX);
+    const newHeight = AnnotationEditor._round(savedHeight * ratioY);
+    transfOppositePoint = transf(...getOpposite(newWidth, newHeight));
+    const newX = oppositeX - transfOppositePoint[0];
+    const newY = oppositeY - transfOppositePoint[1];
+    this.#initialRect ||= [this.x, this.y, this.width, this.height];
+    this.width = newWidth;
+    this.height = newHeight;
+    this.x = newX;
+    this.y = newY;
+    this.setDims();
+    this.fixAndSetPosition();
+    this._onResizing();
+  }
+  _onResizing() {}
+  altTextFinish() {
+    this.#altText?.finish();
+  }
+  get toolbarButtons() {
+    return null;
+  }
+  async addEditToolbar() {
+    if (this._editToolbar || this.#isInEditMode) {
+      return this._editToolbar;
+    }
+    this._editToolbar = new EditorToolbar(this);
+    this.div.append(this._editToolbar.render());
+    const {
+      toolbarButtons
+    } = this;
+    if (toolbarButtons) {
+      for (const [name, tool] of toolbarButtons) {
+        await this._editToolbar.addButton(name, tool);
+      }
+    }
+    if (!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.#altText?.destroy();
+  }
+  addContainer(container) {
+    const editToolbarDiv = this._editToolbar?.div;
+    if (editToolbarDiv) {
+      editToolbarDiv.before(container);
+    } else {
+      this.div.append(container);
+    }
+  }
+  getClientDimensions() {
+    return this.div.getBoundingClientRect();
+  }
+  createAltText() {
+    if (!this.#altText) {
+      AltText.initialize(AnnotationEditor._l10n);
+      this.#altText = new AltText(this);
+      if (this.#accessibilityData) {
+        this.#altText.data = this.#accessibilityData;
+        this.#accessibilityData = null;
+      }
+    }
+    return this.#altText;
+  }
+  get altTextData() {
+    return this.#altText?.data;
+  }
+  set altTextData(data) {
+    if (!this.#altText) {
+      return;
+    }
+    this.#altText.data = data;
+  }
+  get guessedAltText() {
+    return this.#altText?.guessedText;
+  }
+  async setGuessedAltText(text) {
+    await this.#altText?.setGuessedText(text);
+  }
+  serializeAltText(isForCopying) {
+    return this.#altText?.serialize(isForCopying);
+  }
+  hasAltText() {
+    return !!this.#altText && !this.#altText.isEmpty();
+  }
+  hasAltTextData() {
+    return this.#altText?.hasData() ?? false;
+  }
+  focusCommentButton() {
+    this.#comment?.focusButton();
+  }
+  addCommentButton() {
+    return this.canAddComment ? this.#comment ||= new Comment(this) : null;
+  }
+  addStandaloneCommentButton() {
+    if (!this._uiManager.hasCommentManager()) {
+      return;
+    }
+    if (this.#commentStandaloneButton) {
+      if (this._uiManager.isEditingMode()) {
+        this.#commentStandaloneButton.classList.remove("hidden");
+      }
+      return;
+    }
+    if (!this.hasComment) {
+      return;
+    }
+    this.#commentStandaloneButton = this.#comment.renderForStandalone();
+    this.div.append(this.#commentStandaloneButton);
+  }
+  removeStandaloneCommentButton() {
+    this.#comment.removeStandaloneCommentButton();
+    this.#commentStandaloneButton = null;
+  }
+  hideStandaloneCommentButton() {
+    this.#commentStandaloneButton?.classList.add("hidden");
+  }
+  get comment() {
+    if (!this.#comment) {
+      return null;
+    }
+    const {
+      data: {
+        richText,
+        text,
+        date,
+        deleted
+      }
+    } = this.#comment;
+    return {
+      text,
+      richText,
+      date,
+      deleted,
+      color: this.getNonHCMColor(),
+      opacity: this.opacity ?? 1
+    };
+  }
+  set comment(value) {
+    this.#comment ||= new Comment(this);
+    if (typeof value === "object" && value !== null) {
+      this.#comment.restoreData(value);
+    } else {
+      this.#comment.data = value;
+    }
+    if (this.hasComment) {
+      this.removeCommentButtonFromToolbar();
+      this.addStandaloneCommentButton();
+      this._uiManager.updateComment(this);
+    } else {
+      this.addCommentButtonInToolbar();
+      this.removeStandaloneCommentButton();
+      this._uiManager.removeComment(this);
+    }
+  }
+  setCommentData({
+    comment,
+    popupRef,
+    richText
+  }) {
+    if (!popupRef) {
+      return;
+    }
+    this.#comment ||= new Comment(this);
+    this.#comment.setInitialText(comment, richText);
+    if (!this.annotationElementId) {
+      return;
+    }
+    const storedData = this._uiManager.getAndRemoveDataFromAnnotationStorage(this.annotationElementId);
+    if (storedData) {
+      this.updateFromAnnotationLayer(storedData);
+    }
+  }
+  get hasEditedComment() {
+    return this.#comment?.hasBeenEdited();
+  }
+  get hasDeletedComment() {
+    return this.#comment?.isDeleted();
+  }
+  get hasComment() {
+    return !!this.#comment && !this.#comment.isEmpty() && !this.#comment.isDeleted();
+  }
+  async editComment(options) {
+    this.#comment ||= new Comment(this);
+    this.#comment.edit(options);
+  }
+  toggleComment(isSelected, visibility = undefined) {
+    if (this.hasComment) {
+      this._uiManager.toggleComment(this, isSelected, visibility);
+    }
+  }
+  setSelectedCommentButton(selected) {
+    this.#comment.setSelectedButton(selected);
+  }
+  addComment(serialized) {
+    if (this.hasEditedComment) {
+      const DEFAULT_POPUP_WIDTH = 180;
+      const DEFAULT_POPUP_HEIGHT = 100;
+      const [,,, trY] = serialized.rect;
+      const [pageWidth] = this.pageDimensions;
+      const [pageX] = this.pageTranslation;
+      const blX = pageX + pageWidth + 1;
+      const blY = trY - DEFAULT_POPUP_HEIGHT;
+      const trX = blX + DEFAULT_POPUP_WIDTH;
+      serialized.popup = {
+        contents: this.comment.text,
+        deleted: this.comment.deleted,
+        rect: [blX, blY, trX, trY]
+      };
+    }
+  }
+  updateFromAnnotationLayer({
+    popup: {
+      contents,
+      deleted
+    }
+  }) {
+    this.#comment.data = deleted ? null : contents;
+  }
+  get parentBoundingClientRect() {
+    return this.parent.boundingClientRect;
+  }
+  render() {
+    const div = this.div = document.createElement("div");
+    div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360);
+    div.className = this.name;
+    div.setAttribute("id", this.id);
+    div.tabIndex = this.#disabled ? -1 : 0;
+    div.setAttribute("role", "application");
+    if (this.defaultL10nId) {
+      div.setAttribute("data-l10n-id", this.defaultL10nId);
+    }
+    if (!this._isVisible) {
+      div.classList.add("hidden");
+    }
+    this.setInForeground();
+    this.#addFocusListeners();
+    const [parentWidth, parentHeight] = this.parentDimensions;
+    if (this.parentRotation % 180 !== 0) {
+      div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`;
+      div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`;
+    }
+    const [tx, ty] = this.getInitialTranslation();
+    this.translate(tx, ty);
+    bindEvents(this, div, ["keydown", "pointerdown", "dblclick"]);
+    if (this.isResizable && this._uiManager._supportsPinchToZoom) {
+      this.#touchManager ||= new TouchManager({
+        container: div,
+        isPinchingDisabled: () => !this.isSelected,
+        onPinchStart: this.#touchPinchStartCallback.bind(this),
+        onPinching: this.#touchPinchCallback.bind(this),
+        onPinchEnd: this.#touchPinchEndCallback.bind(this),
+        signal: this._uiManager._signal
+      });
+    }
+    this.addStandaloneCommentButton();
+    this._uiManager._editorUndoBar?.hide();
+    return div;
+  }
+  #touchPinchStartCallback() {
+    this.#savedDimensions = {
+      savedX: this.x,
+      savedY: this.y,
+      savedWidth: this.width,
+      savedHeight: this.height
+    };
+    this.#altText?.toggle(false);
+    this.parent.togglePointerEvents(false);
+  }
+  #touchPinchCallback(_origin, prevDistance, distance) {
+    const slowDownFactor = 0.7;
+    let factor = slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor;
+    if (factor === 1) {
+      return;
+    }
+    const rotationMatrix = this.#getRotationMatrix(this.rotation);
+    const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y];
+    const [parentWidth, parentHeight] = this.parentDimensions;
+    const savedX = this.x;
+    const savedY = this.y;
+    const savedWidth = this.width;
+    const savedHeight = this.height;
+    const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;
+    const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;
+    factor = Math.max(Math.min(factor, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight);
+    const newWidth = AnnotationEditor._round(savedWidth * factor);
+    const newHeight = AnnotationEditor._round(savedHeight * factor);
+    if (newWidth === savedWidth && newHeight === savedHeight) {
+      return;
+    }
+    this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight];
+    const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2);
+    const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]);
+    const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]);
+    const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2);
+    this.x = centerX - newTransfCenterPoint[0];
+    this.y = centerY - newTransfCenterPoint[1];
+    this.width = newWidth;
+    this.height = newHeight;
+    this.setDims();
+    this.fixAndSetPosition();
+    this._onResizing();
+  }
+  #touchPinchEndCallback() {
+    this.#altText?.toggle(true);
+    this.parent.togglePointerEvents(true);
+    this.#addResizeToUndoStack();
+  }
+  pointerdown(event) {
+    const {
+      isMac
+    } = FeatureTest.platform;
+    if (event.button !== 0 || event.ctrlKey && isMac) {
+      event.preventDefault();
+      return;
+    }
+    this.#hasBeenClicked = true;
+    if (this._isDraggable) {
+      this.#setUpDragSession(event);
+      return;
+    }
+    this.#selectOnPointerEvent(event);
+  }
+  #selectOnPointerEvent(event) {
+    const {
+      isMac
+    } = FeatureTest.platform;
+    if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) {
+      this.parent.toggleSelected(this);
+    } else {
+      this.parent.setSelected(this);
+    }
+  }
+  #setUpDragSession(event) {
+    const {
+      isSelected
+    } = this;
+    this._uiManager.setUpDragSession();
+    let hasDraggingStarted = false;
+    const ac = new AbortController();
+    const signal = this._uiManager.combinedSignal(ac);
+    const opts = {
+      capture: true,
+      passive: false,
+      signal
+    };
+    const cancelDrag = e => {
+      ac.abort();
+      this.#dragPointerId = null;
+      this.#hasBeenClicked = false;
+      if (!this._uiManager.endDragSession()) {
+        this.#selectOnPointerEvent(e);
+      }
+      if (hasDraggingStarted) {
+        this._onStopDragging();
+      }
+    };
+    if (isSelected) {
+      this.#prevDragX = event.clientX;
+      this.#prevDragY = event.clientY;
+      this.#dragPointerId = event.pointerId;
+      this.#dragPointerType = event.pointerType;
+      window.addEventListener("pointermove", e => {
+        if (!hasDraggingStarted) {
+          hasDraggingStarted = true;
+          this._uiManager.toggleComment(this, true, false);
+          this._onStartDragging();
+        }
+        const {
+          clientX: x,
+          clientY: y,
+          pointerId
+        } = e;
+        if (pointerId !== this.#dragPointerId) {
+          stopEvent(e);
+          return;
+        }
+        const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY);
+        this.#prevDragX = x;
+        this.#prevDragY = y;
+        this._uiManager.dragSelectedEditors(tx, ty);
+      }, opts);
+      window.addEventListener("touchmove", stopEvent, opts);
+      window.addEventListener("pointerdown", e => {
+        if (e.pointerType === this.#dragPointerType) {
+          if (this.#touchManager || e.isPrimary) {
+            cancelDrag(e);
+          }
+        }
+        stopEvent(e);
+      }, opts);
+    }
+    const pointerUpCallback = e => {
+      if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) {
+        cancelDrag(e);
+        return;
+      }
+      stopEvent(e);
+    };
+    window.addEventListener("pointerup", pointerUpCallback, {
+      signal
+    });
+    window.addEventListener("blur", pointerUpCallback, {
+      signal
+    });
+  }
+  _onStartDragging() {}
+  _onStopDragging() {}
+  moveInDOM() {
+    if (this.#moveInDOMTimeout) {
+      clearTimeout(this.#moveInDOMTimeout);
+    }
+    this.#moveInDOMTimeout = setTimeout(() => {
+      this.#moveInDOMTimeout = null;
+      this.parent?.moveEditorInDOM(this);
+    }, 0);
+  }
+  _setParentAndPosition(parent, x, y) {
+    parent.changeParent(this);
+    this.x = x;
+    this.y = y;
+    this.fixAndSetPosition();
+    this._onTranslated();
+  }
+  getRect(tx, ty, rotation = this.rotation) {
+    const scale = this.parentScale;
+    const [pageWidth, pageHeight] = this.pageDimensions;
+    const [pageX, pageY] = this.pageTranslation;
+    const shiftX = tx / scale;
+    const shiftY = ty / scale;
+    const x = this.x * pageWidth;
+    const y = this.y * pageHeight;
+    const width = this.width * pageWidth;
+    const height = this.height * pageHeight;
+    switch (rotation) {
+      case 0:
+        return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY];
+      case 90:
+        return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY];
+      case 180:
+        return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY];
+      case 270:
+        return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY];
+      default:
+        throw new Error("Invalid rotation");
+    }
+  }
+  getRectInCurrentCoords(rect, pageHeight) {
+    const [x1, y1, x2, y2] = rect;
+    const width = x2 - x1;
+    const height = y2 - y1;
+    switch (this.rotation) {
+      case 0:
+        return [x1, pageHeight - y2, width, height];
+      case 90:
+        return [x1, pageHeight - y1, height, width];
+      case 180:
+        return [x2, pageHeight - y1, width, height];
+      case 270:
+        return [x2, pageHeight - y2, height, width];
+      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.#comment?.onUpdatedColor();
+  }
+  getData() {
+    const {
+      comment: {
+        text: str,
+        color,
+        date,
+        opacity,
+        deleted,
+        richText
+      },
+      uid: id,
+      pageIndex,
+      creationDate,
+      modificationDate
+    } = this;
+    return {
+      id,
+      pageIndex,
+      rect: this.getPDFRect(),
+      richText,
+      contentsObj: {
+        str
+      },
+      creationDate,
+      modificationDate: date || modificationDate,
+      popupRef: !deleted,
+      color,
+      opacity
+    };
+  }
+  onceAdded(focus) {}
+  isEmpty() {
+    return false;
+  }
+  enableEditMode() {
+    if (this.isInEditMode()) {
+      return false;
+    }
+    this.parent.setEditingState(false);
+    this.#isInEditMode = true;
+    return true;
+  }
+  disableEditMode() {
+    if (!this.isInEditMode()) {
+      return false;
+    }
+    this.parent.setEditingState(true);
+    this.#isInEditMode = false;
+    return true;
+  }
+  isInEditMode() {
+    return this.#isInEditMode;
+  }
+  shouldGetKeyboardEvents() {
+    return this.#isResizerEnabledForKeyboard;
+  }
+  needsToBeRebuilt() {
+    return this.div && !this.isAttachedToDOM;
+  }
+  get isOnScreen() {
+    const {
+      top,
+      left,
+      bottom,
+      right
+    } = this.getClientDimensions();
+    const {
+      innerHeight,
+      innerWidth
+    } = window;
+    return left < innerWidth && right > 0 && top < innerHeight && bottom > 0;
+  }
+  #addFocusListeners() {
+    if (this.#focusAC || !this.div) {
+      return;
+    }
+    this.#focusAC = new AbortController();
+    const signal = this._uiManager.combinedSignal(this.#focusAC);
+    this.div.addEventListener("focusin", this.focusin.bind(this), {
+      signal
+    });
+    this.div.addEventListener("focusout", this.focusout.bind(this), {
+      signal
+    });
+  }
+  rebuild() {
+    this.#addFocusListeners();
+  }
+  rotate(_angle) {}
+  resize() {}
+  serializeDeleted() {
+    return {
+      id: this.annotationElementId,
+      deleted: true,
+      pageIndex: this.pageIndex,
+      popupRef: this._initialData?.popupRef || ""
+    };
+  }
+  serialize(isForCopying = false, context = null) {
+    return {
+      annotationType: this.mode,
+      pageIndex: this.pageIndex,
+      rect: this.getPDFRect(),
+      rotation: this.rotation,
+      structTreeParentId: this._structTreeParentId,
+      popupRef: this._initialData?.popupRef || ""
+    };
+  }
+  static async deserialize(data, parent, uiManager) {
+    const editor = new this.prototype.constructor({
+      parent,
+      id: uiManager.getId(),
+      uiManager,
+      annotationElementId: data.annotationElementId,
+      creationDate: data.creationDate,
+      modificationDate: data.modificationDate
+    });
+    editor.rotation = data.rotation;
+    editor.#accessibilityData = data.accessibilityData;
+    editor._isCopy = data.isCopy || false;
+    const [pageWidth, pageHeight] = editor.pageDimensions;
+    const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight);
+    editor.x = x / pageWidth;
+    editor.y = y / pageHeight;
+    editor.width = width / pageWidth;
+    editor.height = height / pageHeight;
+    return editor;
+  }
+  get hasBeenModified() {
+    return !!this.annotationElementId && (this.deleted || this.serialize() !== null);
+  }
+  remove() {
+    this.#focusAC?.abort();
+    this.#focusAC = null;
+    if (!this.isEmpty()) {
+      this.commit();
+    }
+    if (this.parent) {
+      this.parent.remove(this);
+    } else {
+      this._uiManager.removeEditor(this);
+    }
+    this.hideCommentPopup();
+    if (this.#moveInDOMTimeout) {
+      clearTimeout(this.#moveInDOMTimeout);
+      this.#moveInDOMTimeout = null;
+    }
+    this.#stopResizing();
+    this.removeEditToolbar();
+    if (this.#telemetryTimeouts) {
+      for (const timeout of this.#telemetryTimeouts.values()) {
+        clearTimeout(timeout);
+      }
+      this.#telemetryTimeouts = null;
+    }
+    this.parent = null;
+    this.#touchManager?.destroy();
+    this.#touchManager = null;
+    this.#fakeAnnotation?.remove();
+    this.#fakeAnnotation = null;
+  }
+  get isResizable() {
+    return false;
+  }
+  makeResizable() {
+    if (this.isResizable) {
+      this.#createResizers();
+      this.#resizersDiv.classList.remove("hidden");
+    }
+  }
+  get toolbarPosition() {
+    return null;
+  }
+  get commentButtonPosition() {
+    return this._uiManager.direction === "ltr" ? [1, 0] : [0, 0];
+  }
+  get commentButtonPositionInPage() {
+    const {
+      commentButtonPosition: [posX, posY]
+    } = this;
+    const [blX, blY, trX, trY] = this.getPDFRect();
+    return [AnnotationEditor._round(blX + (trX - blX) * posX), AnnotationEditor._round(blY + (trY - blY) * (1 - posY))];
+  }
+  get commentButtonColor() {
+    return this._uiManager.makeCommentColor(this.getNonHCMColor(), this.opacity);
+  }
+  get commentPopupPosition() {
+    return this.#comment.commentPopupPositionInLayer;
+  }
+  set commentPopupPosition(pos) {
+    this.#comment.commentPopupPositionInLayer = pos;
+  }
+  hasDefaultPopupPosition() {
+    return this.#comment.hasDefaultPopupPosition();
+  }
+  get commentButtonWidth() {
+    return this.#comment.commentButtonWidth;
+  }
+  get elementBeforePopup() {
+    return this.div;
+  }
+  setCommentButtonStates(options) {
+    this.#comment?.setCommentButtonStates(options);
+  }
+  keydown(event) {
+    if (!this.isResizable || event.target !== this.div || event.key !== "Enter") {
+      return;
+    }
+    this._uiManager.setSelected(this);
+    this.#savedDimensions = {
+      savedX: this.x,
+      savedY: this.y,
+      savedWidth: this.width,
+      savedHeight: this.height
+    };
+    const children = this.#resizersDiv.children;
+    if (!this.#allResizerDivs) {
+      this.#allResizerDivs = Array.from(children);
+      const boundResizerKeydown = this.#resizerKeydown.bind(this);
+      const boundResizerBlur = this.#resizerBlur.bind(this);
+      const signal = this._uiManager._signal;
+      for (const div of this.#allResizerDivs) {
+        const name = div.getAttribute("data-resizer-name");
+        div.setAttribute("role", "spinbutton");
+        div.addEventListener("keydown", boundResizerKeydown, {
+          signal
+        });
+        div.addEventListener("blur", boundResizerBlur, {
+          signal
+        });
+        div.addEventListener("focus", this.#resizerFocus.bind(this, name), {
+          signal
+        });
+        div.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]);
+      }
+    }
+    const first = this.#allResizerDivs[0];
+    let firstPosition = 0;
+    for (const div of children) {
+      if (div === first) {
+        break;
+      }
+      firstPosition++;
+    }
+    const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4);
+    if (nextFirstPosition !== firstPosition) {
+      if (nextFirstPosition < firstPosition) {
+        for (let i = 0; i < firstPosition - nextFirstPosition; i++) {
+          this.#resizersDiv.append(this.#resizersDiv.firstElementChild);
+        }
+      } else if (nextFirstPosition > firstPosition) {
+        for (let i = 0; i < nextFirstPosition - firstPosition; i++) {
+          this.#resizersDiv.firstElementChild.before(this.#resizersDiv.lastElementChild);
+        }
+      }
+      let i = 0;
+      for (const child of children) {
+        const div = this.#allResizerDivs[i++];
+        const name = div.getAttribute("data-resizer-name");
+        child.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]);
+      }
+    }
+    this.#setResizerTabIndex(0);
+    this.#isResizerEnabledForKeyboard = true;
+    this.#resizersDiv.firstElementChild.focus({
+      focusVisible: true
+    });
+    event.preventDefault();
+    event.stopImmediatePropagation();
+  }
+  #resizerKeydown(event) {
+    AnnotationEditor._resizerKeyboardManager.exec(this, event);
+  }
+  #resizerBlur(event) {
+    if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) {
+      this.#stopResizing();
+    }
+  }
+  #resizerFocus(name) {
+    this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : "";
+  }
+  #setResizerTabIndex(value) {
+    if (!this.#allResizerDivs) {
+      return;
+    }
+    for (const div of this.#allResizerDivs) {
+      div.tabIndex = value;
+    }
+  }
+  _resizeWithKeyboard(x, y) {
+    if (!this.#isResizerEnabledForKeyboard) {
+      return;
+    }
+    this.#resizerPointermove(this.#focusedResizerName, {
+      deltaX: x,
+      deltaY: y,
+      fromKeyboard: true
+    });
+  }
+  #stopResizing() {
+    this.#isResizerEnabledForKeyboard = false;
+    this.#setResizerTabIndex(-1);
+    this.#addResizeToUndoStack();
+  }
+  _stopResizingWithKeyboard() {
+    this.#stopResizing();
+    this.div.focus();
+  }
+  select() {
+    if (this.isSelected && this._editToolbar) {
+      this._editToolbar.show();
+      return;
+    }
+    this.isSelected = true;
+    this.makeResizable();
+    this.div?.classList.add("selectedEditor");
+    if (!this._editToolbar) {
+      this.addEditToolbar().then(() => {
+        if (this.div?.classList.contains("selectedEditor")) {
+          this._editToolbar?.show();
+        }
+      });
+      return;
+    }
+    this._editToolbar?.show();
+    this.#altText?.toggleAltTextBadge(false);
+  }
+  focus() {
+    if (this.div && !this.div.contains(document.activeElement)) {
+      setTimeout(() => this.div?.focus({
+        preventScroll: true
+      }), 0);
+    }
+  }
+  unselect() {
+    if (!this.isSelected) {
+      return;
+    }
+    this.isSelected = false;
+    this.#resizersDiv?.classList.add("hidden");
+    this.div?.classList.remove("selectedEditor");
+    if (this.div?.contains(document.activeElement)) {
+      this._uiManager.currentLayer.div.focus({
+        preventScroll: true
+      });
+    }
+    this._editToolbar?.hide();
+    this.#altText?.toggleAltTextBadge(true);
+    this.hideCommentPopup();
+  }
+  hideCommentPopup() {
+    if (this.hasComment) {
+      this._uiManager.toggleComment(null);
+    }
+  }
+  updateParams(type, value) {}
+  disableEditing() {}
+  enableEditing() {}
+  get canChangeContent() {
+    return false;
+  }
+  enterInEditMode() {
+    if (!this.canChangeContent) {
+      return;
+    }
+    this.enableEditMode();
+    this.div.focus();
+  }
+  dblclick(event) {
+    if (event.target.nodeName === "BUTTON") {
+      return;
+    }
+    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.#isEditing;
+  }
+  set isEditing(value) {
+    this.#isEditing = value;
+    if (!this.parent) {
+      return;
+    }
+    if (value) {
+      this.parent.setSelected(this);
+      this.parent.setActiveEditor(this);
+    } else {
+      this.parent.setActiveEditor(null);
+    }
+  }
+  static get MIN_SIZE() {
+    return 16;
+  }
+  static canCreateNewEmptyEditor() {
+    return true;
+  }
+  get telemetryInitialData() {
+    return {
+      action: "added"
+    };
+  }
+  get telemetryFinalData() {
+    return null;
+  }
+  _reportTelemetry(data, mustWait = false) {
+    if (mustWait) {
+      this.#telemetryTimeouts ||= new Map();
+      const {
+        action
+      } = data;
+      let timeout = this.#telemetryTimeouts.get(action);
+      if (timeout) {
+        clearTimeout(timeout);
+      }
+      timeout = setTimeout(() => {
+        this._reportTelemetry(data);
+        this.#telemetryTimeouts.delete(action);
+        if (this.#telemetryTimeouts.size === 0) {
+          this.#telemetryTimeouts = null;
+        }
+      }, AnnotationEditor._telemetryTimeout);
+      this.#telemetryTimeouts.set(action, timeout);
+      return;
+    }
+    data.type ||= this.editorType;
+    this._uiManager._eventBus.dispatch("reporttelemetry", {
+      source: this,
+      details: {
+        type: "editing",
+        data
+      }
+    });
+  }
+  show(visible = this._isVisible) {
+    this.div.classList.toggle("hidden", !visible);
+    this._isVisible = visible;
+  }
+  enable() {
+    if (this.div) {
+      this.div.tabIndex = 0;
+    }
+    this.#disabled = false;
+  }
+  disable() {
+    if (this.div) {
+      this.div.tabIndex = -1;
+    }
+    this.#disabled = true;
+  }
+  updateFakeAnnotationElement(annotationLayer) {
+    if (!this.#fakeAnnotation && !this.deleted) {
+      this.#fakeAnnotation = annotationLayer.addFakeAnnotation(this);
+      return;
+    }
+    if (this.deleted) {
+      this.#fakeAnnotation.remove();
+      this.#fakeAnnotation = null;
+      return;
+    }
+    if (this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized) {
+      this.#fakeAnnotation.updateEdited({
+        rect: this.getPDFRect(),
+        popup: this.comment
+      });
+    }
+  }
+  renderAnnotationElement(annotation) {
+    if (this.deleted) {
+      annotation.hide();
+      return null;
+    }
+    let content = annotation.container.querySelector(".annotationContent");
+    if (!content) {
+      content = document.createElement("div");
+      content.classList.add("annotationContent", this.editorType);
+      annotation.container.prepend(content);
+    } else if (content.nodeName === "CANVAS") {
+      const canvas = content;
+      content = document.createElement("div");
+      content.classList.add("annotationContent", this.editorType);
+      canvas.before(content);
+    }
+    return content;
+  }
+  resetAnnotationElement(annotation) {
+    const {
+      firstElementChild
+    } = annotation.container;
+    if (firstElementChild?.nodeName === "DIV" && firstElementChild.classList.contains("annotationContent")) {
+      firstElementChild.remove();
+    }
+  }
+}
+class FakeEditor extends AnnotationEditor {
+  constructor(params) {
+    super(params);
+    this.annotationElementId = params.annotationElementId;
+    this.deleted = true;
+  }
+  serialize() {
+    return this.serializeDeleted();
+  }
+}
+
+;// ./src/shared/murmurhash3.js
+const SEED = 0xc3d2e1f0;
+const MASK_HIGH = 0xffff0000;
+const MASK_LOW = 0xffff;
+class MurmurHash3_64 {
+  constructor(seed) {
+    this.h1 = seed ? seed & 0xffffffff : SEED;
+    this.h2 = seed ? seed & 0xffffffff : SEED;
+  }
+  update(input) {
+    let data, length;
+    if (typeof input === "string") {
+      data = new Uint8Array(input.length * 2);
+      length = 0;
+      for (let i = 0, ii = input.length; i < ii; i++) {
+        const code = input.charCodeAt(i);
+        if (code <= 0xff) {
+          data[length++] = code;
+        } else {
+          data[length++] = code >>> 8;
+          data[length++] = code & 0xff;
+        }
+      }
+    } else if (ArrayBuffer.isView(input)) {
+      data = input.slice();
+      length = data.byteLength;
+    } else {
+      throw new Error("Invalid data format, must be a string or TypedArray.");
+    }
+    const blockCounts = length >> 2;
+    const tailLength = length - blockCounts * 4;
+    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
+    let k1 = 0,
+      k2 = 0;
+    let h1 = this.h1,
+      h2 = this.h2;
+    const C1 = 0xcc9e2d51,
+      C2 = 0x1b873593;
+    const C1_LOW = C1 & MASK_LOW,
+      C2_LOW = C2 & MASK_LOW;
+    for (let i = 0; i < blockCounts; i++) {
+      if (i & 1) {
+        k1 = dataUint32[i];
+        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
+        k1 = k1 << 15 | k1 >>> 17;
+        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+        h1 ^= k1;
+        h1 = h1 << 13 | h1 >>> 19;
+        h1 = h1 * 5 + 0xe6546b64;
+      } else {
+        k2 = dataUint32[i];
+        k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
+        k2 = k2 << 15 | k2 >>> 17;
+        k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
+        h2 ^= k2;
+        h2 = h2 << 13 | h2 >>> 19;
+        h2 = h2 * 5 + 0xe6546b64;
+      }
+    }
+    k1 = 0;
+    switch (tailLength) {
+      case 3:
+        k1 ^= data[blockCounts * 4 + 2] << 16;
+      case 2:
+        k1 ^= data[blockCounts * 4 + 1] << 8;
+      case 1:
+        k1 ^= data[blockCounts * 4];
+        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
+        k1 = k1 << 15 | k1 >>> 17;
+        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+        if (blockCounts & 1) {
+          h1 ^= k1;
+        } else {
+          h2 ^= k1;
+        }
+    }
+    this.h1 = h1;
+    this.h2 = h2;
+  }
+  hexdigest() {
+    let h1 = this.h1,
+      h2 = this.h2;
+    h1 ^= h2 >>> 1;
+    h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;
+    h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;
+    h1 ^= h2 >>> 1;
+    h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;
+    h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;
+    h1 ^= h2 >>> 1;
+    return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0");
+  }
+}
+
+;// ./src/display/annotation_storage.js
+
+
+
+const SerializableEmpty = Object.freeze({
+  map: null,
+  hash: "",
+  transfer: undefined
+});
+class AnnotationStorage {
+  #modified = false;
+  #modifiedIds = null;
+  #editorsMap = null;
+  #storage = new Map();
+  onSetModified = null;
+  onResetModified = null;
+  onAnnotationEditor = null;
+  getValue(key, defaultValue) {
+    const value = this.#storage.get(key);
+    if (value === undefined) {
+      return defaultValue;
+    }
+    return Object.assign(defaultValue, value);
+  }
+  getRawValue(key) {
+    return this.#storage.get(key);
+  }
+  remove(key) {
+    const storedValue = this.#storage.get(key);
+    if (storedValue === undefined) {
+      return;
+    }
+    if (storedValue instanceof AnnotationEditor) {
+      this.#editorsMap.delete(storedValue.annotationElementId);
+    }
+    this.#storage.delete(key);
+    if (this.#storage.size === 0) {
+      this.resetModified();
+    }
+    if (this.#storage.values().some(v => v instanceof AnnotationEditor)) {
+      return;
+    }
+    this.onAnnotationEditor?.(null);
+  }
+  setValue(key, value) {
+    const obj = this.#storage.get(key);
+    let modified = false;
+    if (obj !== undefined) {
+      for (const [entry, val] of Object.entries(value)) {
+        if (obj[entry] !== val) {
+          modified = true;
+          obj[entry] = val;
+        }
+      }
+    } else {
+      modified = true;
+      this.#storage.set(key, value);
+    }
+    if (modified) {
+      this.#setModified();
+    }
+    if (value instanceof AnnotationEditor) {
+      (this.#editorsMap ||= new Map()).set(value.annotationElementId, value);
+      this.onAnnotationEditor?.(value.constructor._type);
+    }
+  }
+  has(key) {
+    return this.#storage.has(key);
+  }
+  get size() {
+    return this.#storage.size;
+  }
+  #setModified() {
+    if (!this.#modified) {
+      this.#modified = true;
+      this.onSetModified?.();
+    }
+  }
+  resetModified() {
+    if (this.#modified) {
+      this.#modified = false;
+      this.onResetModified?.();
+    }
+  }
+  get print() {
+    return new PrintAnnotationStorage(this);
+  }
+  get serializable() {
+    if (this.#storage.size === 0) {
+      return SerializableEmpty;
+    }
+    const map = new Map(),
+      hash = new MurmurHash3_64(),
+      transfer = [];
+    const context = Object.create(null);
+    let hasBitmap = false;
+    for (const [key, val] of this.#storage) {
+      const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val;
+      if (val.page) {
+        val.pageIndex = val.page._pageIndex;
+        delete val.page;
+      }
+      if (serialized) {
+        map.set(key, serialized);
+        hash.update(`${key}:${JSON.stringify(serialized)}`);
+        hasBitmap ||= !!serialized.bitmap;
+      }
+    }
+    if (hasBitmap) {
+      for (const value of map.values()) {
+        if (value.bitmap) {
+          transfer.push(value.bitmap);
+        }
+      }
+    }
+    return map.size > 0 ? {
+      map,
+      hash: hash.hexdigest(),
+      transfer
+    } : SerializableEmpty;
+  }
+  get editorStats() {
+    let stats = null;
+    const typeToEditor = new Map();
+    let numberOfEditedComments = 0;
+    let numberOfDeletedComments = 0;
+    for (const value of this.#storage.values()) {
+      if (!(value instanceof AnnotationEditor)) {
+        if (value.popup) {
+          if (value.popup.deleted) {
+            numberOfDeletedComments += 1;
+          } else {
+            numberOfEditedComments += 1;
+          }
+        }
+        continue;
+      }
+      if (value.isCommentDeleted) {
+        numberOfDeletedComments += 1;
+      } else if (value.hasEditedComment) {
+        numberOfEditedComments += 1;
+      }
+      const editorStats = value.telemetryFinalData;
+      if (!editorStats) {
+        continue;
+      }
+      const {
+        type
+      } = editorStats;
+      typeToEditor.getOrInsertComputed(type, () => Object.getPrototypeOf(value).constructor);
+      stats ||= Object.create(null);
+      const map = stats[type] ||= new Map();
+      for (const [key, val] of Object.entries(editorStats)) {
+        if (key === "type") {
+          continue;
+        }
+        const counters = map.getOrInsertComputed(key, makeMap);
+        counters.set(val, (counters.get(val) ?? 0) + 1);
+      }
+    }
+    if (numberOfDeletedComments > 0 || numberOfEditedComments > 0) {
+      stats ||= Object.create(null);
+      stats.comments = {
+        deleted: numberOfDeletedComments,
+        edited: numberOfEditedComments
+      };
+    }
+    if (!stats) {
+      return null;
+    }
+    for (const [type, editor] of typeToEditor) {
+      stats[type] = editor.computeTelemetryFinalData(stats[type]);
+    }
+    return stats;
+  }
+  resetModifiedIds() {
+    this.#modifiedIds = null;
+  }
+  updateEditor(annotationId, data) {
+    const value = this.#editorsMap?.get(annotationId);
+    if (value) {
+      value.updateFromAnnotationLayer(data);
+      return true;
+    }
+    return false;
+  }
+  getEditor(annotationId) {
+    return this.#editorsMap?.get(annotationId) || null;
+  }
+  get modifiedIds() {
+    if (this.#modifiedIds) {
+      return this.#modifiedIds;
+    }
+    const ids = [];
+    if (this.#editorsMap) {
+      for (const value of this.#editorsMap.values()) {
+        if (!value.serialize()) {
+          continue;
+        }
+        ids.push(value.annotationElementId);
+      }
+    }
+    let hash = "";
+    if (ids.length) {
+      const h = new MurmurHash3_64();
+      h.update(ids.join(","));
+      hash = h.hexdigest();
+    }
+    return this.#modifiedIds = {
+      ids: new Set(ids),
+      hash
+    };
+  }
+  [Symbol.iterator]() {
+    return this.#storage.entries();
+  }
+}
+class PrintAnnotationStorage extends AnnotationStorage {
+  #serializable = SerializableEmpty;
+  constructor(parent) {
+    super();
+    const {
+      serializable
+    } = parent;
+    if (serializable === SerializableEmpty) {
+      return;
+    }
+    const {
+      map,
+      hash,
+      transfer
+    } = serializable;
+    const clone = structuredClone(map, transfer ? {
+      transfer
+    } : null);
+    this.#serializable = {
+      map: clone,
+      hash,
+      transfer: []
+    };
+  }
+  get print() {
+    unreachable("Should not call PrintAnnotationStorage.print");
+  }
+  get serializable() {
+    return this.#serializable;
+  }
+  get modifiedIds() {
+    return shadow(this, "modifiedIds", {
+      ids: new Set(),
+      hash: ""
+    });
+  }
+}
+
+;// ./src/display/canvas_dependency_tracker.js
+
+
+
+const FORCED_DEPENDENCY_LABEL = "__forcedDependency";
+const {
+  floor,
+  ceil
+} = Math;
+function expandBBox(array, index, minX, minY, maxX, maxY) {
+  array[index * 4 + 0] = Math.min(array[index * 4 + 0], minX);
+  array[index * 4 + 1] = Math.min(array[index * 4 + 1], minY);
+  array[index * 4 + 2] = Math.max(array[index * 4 + 2], maxX);
+  array[index * 4 + 3] = Math.max(array[index * 4 + 3], maxY);
+}
+function scaleCharBBox(scaleX, scaleY, x, y, bbox) {
+  let temp;
+  if (scaleX) {
+    if (scaleX < 0) {
+      temp = bbox[0];
+      bbox[0] = bbox[2];
+      bbox[2] = temp;
+    }
+    bbox[0] *= scaleX;
+    bbox[2] *= scaleX;
+    if (scaleY < 0) {
+      temp = bbox[1];
+      bbox[1] = bbox[3];
+      bbox[3] = temp;
+    }
+    bbox[1] *= scaleY;
+    bbox[3] *= scaleY;
+  } else {
+    bbox.fill(0);
+  }
+  bbox[0] += x;
+  bbox[1] += y;
+  bbox[2] += x;
+  bbox[3] += y;
+}
+const EMPTY_BBOX = new Uint32Array(new Uint8Array([255, 255, 0, 0]).buffer)[0];
+class BBoxReader {
+  #bboxes;
+  #coords;
+  constructor(bboxes, coords) {
+    this.#bboxes = bboxes;
+    this.#coords = coords;
+  }
+  get length() {
+    return this.#bboxes.length;
+  }
+  isEmpty(i) {
+    return this.#bboxes[i] === EMPTY_BBOX;
+  }
+  minX(i) {
+    return this.#coords[i * 4 + 0] / 256;
+  }
+  minY(i) {
+    return this.#coords[i * 4 + 1] / 256;
+  }
+  maxX(i) {
+    return (this.#coords[i * 4 + 2] + 1) / 256;
+  }
+  maxY(i) {
+    return (this.#coords[i * 4 + 3] + 1) / 256;
+  }
+}
+const ensureDebugMetadata = (map, key) => map?.getOrInsertComputed(key, () => ({
+  dependencies: new Set(),
+  isRenderingOperation: false
+}));
+class CanvasBBoxTracker {
+  #baseTransformStack = [[1, 0, 0, 1, 0, 0]];
+  #clipBox = [-Infinity, -Infinity, Infinity, Infinity];
+  #pendingBBox = new Float64Array(BBOX_INIT);
+  _pendingBBoxIdx = -1;
+  #canvasWidth;
+  #canvasHeight;
+  #bboxesCoords;
+  #bboxes;
+  _savesStack = [];
+  _markedContentStack = [];
+  constructor(canvas, operationsCount) {
+    this.#canvasWidth = canvas.width;
+    this.#canvasHeight = canvas.height;
+    this.#initializeBBoxes(operationsCount);
+  }
+  growOperationsCount(operationsCount) {
+    if (operationsCount >= this.#bboxes.length) {
+      this.#initializeBBoxes(operationsCount, this.#bboxes);
+    }
+  }
+  #initializeBBoxes(operationsCount, oldBBoxes) {
+    const buffer = new ArrayBuffer(operationsCount * 4);
+    this.#bboxesCoords = new Uint8ClampedArray(buffer);
+    this.#bboxes = new Uint32Array(buffer);
+    if (oldBBoxes && oldBBoxes.length > 0) {
+      this.#bboxes.set(oldBBoxes);
+      this.#bboxes.fill(EMPTY_BBOX, oldBBoxes.length);
+    } else {
+      this.#bboxes.fill(EMPTY_BBOX);
+    }
+  }
+  get clipBox() {
+    return this.#clipBox;
+  }
+  save(opIdx) {
+    this.#clipBox = {
+      __proto__: this.#clipBox
+    };
+    this._savesStack.push(opIdx);
+    return this;
+  }
+  restore(opIdx, onSavePopped) {
+    const previous = Object.getPrototypeOf(this.#clipBox);
+    if (previous === null) {
+      return this;
+    }
+    this.#clipBox = previous;
+    const lastSave = this._savesStack.pop();
+    if (lastSave !== undefined) {
+      onSavePopped?.(lastSave, opIdx);
+      this.#bboxes[opIdx] = this.#bboxes[lastSave];
+    }
+    return this;
+  }
+  recordOpenMarker(idx) {
+    this._savesStack.push(idx);
+    return this;
+  }
+  getOpenMarker() {
+    if (this._savesStack.length === 0) {
+      return null;
+    }
+    return this._savesStack.at(-1);
+  }
+  recordCloseMarker(opIdx, onSavePopped) {
+    const lastSave = this._savesStack.pop();
+    if (lastSave !== undefined) {
+      onSavePopped?.(lastSave, opIdx);
+      this.#bboxes[opIdx] = this.#bboxes[lastSave];
+    }
+    return this;
+  }
+  beginMarkedContent(opIdx) {
+    this._markedContentStack.push(opIdx);
+    return this;
+  }
+  endMarkedContent(opIdx, onSavePopped) {
+    const lastSave = this._markedContentStack.pop();
+    if (lastSave !== undefined) {
+      onSavePopped?.(lastSave, opIdx);
+      this.#bboxes[opIdx] = this.#bboxes[lastSave];
+    }
+    return this;
+  }
+  pushBaseTransform(ctx) {
+    this.#baseTransformStack.push(Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform()));
+    return this;
+  }
+  popBaseTransform() {
+    if (this.#baseTransformStack.length > 1) {
+      this.#baseTransformStack.pop();
+    }
+    return this;
+  }
+  resetBBox(idx) {
+    if (this._pendingBBoxIdx !== idx) {
+      this._pendingBBoxIdx = idx;
+      this.#pendingBBox.set(BBOX_INIT, 0);
+    }
+    return this;
+  }
+  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {
+    const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform());
+    const clipBox = BBOX_INIT.slice();
+    Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, clipBox);
+    const intersection = Util.intersect(this.#clipBox, clipBox);
+    if (intersection) {
+      this.#clipBox[0] = intersection[0];
+      this.#clipBox[1] = intersection[1];
+      this.#clipBox[2] = intersection[2];
+      this.#clipBox[3] = intersection[3];
+    } else {
+      this.#clipBox[0] = this.#clipBox[1] = Infinity;
+      this.#clipBox[2] = this.#clipBox[3] = -Infinity;
+    }
+    return this;
+  }
+  recordBBox(idx, ctx, minX, maxX, minY, maxY) {
+    const clipBox = this.#clipBox;
+    if (clipBox[0] === Infinity) {
+      return this;
+    }
+    const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform());
+    if (clipBox[0] === -Infinity) {
+      Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, this.#pendingBBox);
+      return this;
+    }
+    const bbox = BBOX_INIT.slice();
+    Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, bbox);
+    this.#pendingBBox[0] = MathClamp(bbox[0], clipBox[0], this.#pendingBBox[0]);
+    this.#pendingBBox[1] = MathClamp(bbox[1], clipBox[1], this.#pendingBBox[1]);
+    this.#pendingBBox[2] = MathClamp(bbox[2], this.#pendingBBox[2], clipBox[2]);
+    this.#pendingBBox[3] = MathClamp(bbox[3], this.#pendingBBox[3], clipBox[3]);
+    return this;
+  }
+  recordFullPageBBox(idx) {
+    this.#pendingBBox[0] = Math.max(0, this.#clipBox[0]);
+    this.#pendingBBox[1] = Math.max(0, this.#clipBox[1]);
+    this.#pendingBBox[2] = Math.min(this.#canvasWidth, this.#clipBox[2]);
+    this.#pendingBBox[3] = Math.min(this.#canvasHeight, this.#clipBox[3]);
+    return this;
+  }
+  recordOperation(idx, preserve = false, dependencyLists) {
+    if (this._pendingBBoxIdx !== idx) {
+      return this;
+    }
+    const minX = floor(this.#pendingBBox[0] * 256 / this.#canvasWidth);
+    const minY = floor(this.#pendingBBox[1] * 256 / this.#canvasHeight);
+    const maxX = ceil(this.#pendingBBox[2] * 256 / this.#canvasWidth);
+    const maxY = ceil(this.#pendingBBox[3] * 256 / this.#canvasHeight);
+    expandBBox(this.#bboxesCoords, idx, minX, minY, maxX, maxY);
+    if (dependencyLists) {
+      for (const dependencies of dependencyLists) {
+        for (const depIdx of dependencies) {
+          if (depIdx !== idx) {
+            expandBBox(this.#bboxesCoords, depIdx, minX, minY, maxX, maxY);
+          }
+        }
+      }
+    }
+    if (!preserve) {
+      this._pendingBBoxIdx = -1;
+    }
+    return this;
+  }
+  bboxToClipBoxDropOperation(idx) {
+    if (this._pendingBBoxIdx === idx) {
+      this._pendingBBoxIdx = -1;
+      this.#clipBox[0] = Math.max(this.#clipBox[0], this.#pendingBBox[0]);
+      this.#clipBox[1] = Math.max(this.#clipBox[1], this.#pendingBBox[1]);
+      this.#clipBox[2] = Math.min(this.#clipBox[2], this.#pendingBBox[2]);
+      this.#clipBox[3] = Math.min(this.#clipBox[3], this.#pendingBBox[3]);
+    }
+    return this;
+  }
+  take() {
+    return new BBoxReader(this.#bboxes, this.#bboxesCoords);
+  }
+  takeDebugMetadata() {
+    throw new Error("Unreachable");
+  }
+  recordSimpleData(name, idx) {
+    return this;
+  }
+  recordIncrementalData(name, idx) {
+    return this;
+  }
+  resetIncrementalData(name, idx) {
+    return this;
+  }
+  recordNamedData(name, idx) {
+    return this;
+  }
+  recordSimpleDataFromNamed(name, depName, fallbackIdx) {
+    return this;
+  }
+  recordFutureForcedDependency(name, idx) {
+    return this;
+  }
+  inheritSimpleDataAsFutureForcedDependencies(names) {
+    return this;
+  }
+  inheritPendingDependenciesAsFutureForcedDependencies() {
+    return this;
+  }
+  recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) {
+    return this;
+  }
+  getSimpleIndex(dependencyName) {
+    return undefined;
+  }
+  recordDependencies(idx, dependencyNames) {
+    return this;
+  }
+  recordNamedDependency(idx, name) {
+    return this;
+  }
+  recordShowTextOperation(idx, preserve = false) {
+    return this;
+  }
+}
+class CanvasDependencyTracker {
+  #simple = {
+    __proto__: null
+  };
+  #incremental = {
+    __proto__: null,
+    transform: [],
+    moveText: [],
+    sameLineText: [],
+    [FORCED_DEPENDENCY_LABEL]: []
+  };
+  #namedDependencies = new Map();
+  #pendingDependencies = new Set();
+  #fontBBoxTrustworthy = new Map();
+  #debugMetadata;
+  #recordDebugMetadataDepenencyAfterRestore;
+  #bboxTracker;
+  constructor(bboxTracker, recordDebugMetadata = false) {
+    this.#bboxTracker = bboxTracker;
+    if (recordDebugMetadata) {
+      this.#debugMetadata = new Map();
+      this.#recordDebugMetadataDepenencyAfterRestore = (lastSave, opIdx) => {
+        ensureDebugMetadata(this.#debugMetadata, opIdx).dependencies.add(lastSave);
+      };
+    }
+  }
+  get clipBox() {
+    return this.#bboxTracker.clipBox;
+  }
+  growOperationsCount(operationsCount) {
+    this.#bboxTracker.growOperationsCount(operationsCount);
+  }
+  save(opIdx) {
+    this.#simple = {
+      __proto__: this.#simple
+    };
+    this.#incremental = {
+      __proto__: this.#incremental,
+      transform: {
+        __proto__: this.#incremental.transform
+      },
+      moveText: {
+        __proto__: this.#incremental.moveText
+      },
+      sameLineText: {
+        __proto__: this.#incremental.sameLineText
+      },
+      [FORCED_DEPENDENCY_LABEL]: {
+        __proto__: this.#incremental[FORCED_DEPENDENCY_LABEL]
+      }
+    };
+    this.#bboxTracker.save(opIdx);
+    return this;
+  }
+  restore(opIdx) {
+    this.#bboxTracker.restore(opIdx, this.#recordDebugMetadataDepenencyAfterRestore);
+    const previous = Object.getPrototypeOf(this.#simple);
+    if (previous === null) {
+      return this;
+    }
+    this.#simple = previous;
+    this.#incremental = Object.getPrototypeOf(this.#incremental);
+    return this;
+  }
+  recordOpenMarker(opIdx) {
+    this.#bboxTracker.recordOpenMarker(opIdx, this.#recordDebugMetadataDepenencyAfterRestore);
+    return this;
+  }
+  getOpenMarker() {
+    return this.#bboxTracker.getOpenMarker();
+  }
+  recordCloseMarker(opIdx) {
+    this.#bboxTracker.recordCloseMarker(opIdx, this.#recordDebugMetadataDepenencyAfterRestore);
+    return this;
+  }
+  beginMarkedContent(opIdx) {
+    this.#bboxTracker.beginMarkedContent(opIdx);
+    return this;
+  }
+  endMarkedContent(opIdx) {
+    this.#bboxTracker.endMarkedContent(opIdx, this.#recordDebugMetadataDepenencyAfterRestore);
+    return this;
+  }
+  pushBaseTransform(ctx) {
+    this.#bboxTracker.pushBaseTransform(ctx);
+    return this;
+  }
+  popBaseTransform() {
+    this.#bboxTracker.popBaseTransform();
+    return this;
+  }
+  recordSimpleData(name, idx) {
+    this.#simple[name] = idx;
+    return this;
+  }
+  recordIncrementalData(name, idx) {
+    this.#incremental[name].push(idx);
+    return this;
+  }
+  resetIncrementalData(name, idx) {
+    this.#incremental[name].length = 0;
+    return this;
+  }
+  recordNamedData(name, idx) {
+    this.#namedDependencies.set(name, idx);
+    return this;
+  }
+  recordSimpleDataFromNamed(name, depName, fallbackIdx) {
+    this.#simple[name] = this.#namedDependencies.get(depName) ?? fallbackIdx;
+  }
+  recordFutureForcedDependency(name, idx) {
+    this.recordIncrementalData(FORCED_DEPENDENCY_LABEL, idx);
+    return this;
+  }
+  inheritSimpleDataAsFutureForcedDependencies(names) {
+    for (const name of names) {
+      if (name in this.#simple) {
+        this.recordFutureForcedDependency(name, this.#simple[name]);
+      }
+    }
+    return this;
+  }
+  inheritPendingDependenciesAsFutureForcedDependencies() {
+    for (const dep of this.#pendingDependencies) {
+      this.recordFutureForcedDependency(FORCED_DEPENDENCY_LABEL, dep);
+    }
+    return this;
+  }
+  resetBBox(idx) {
+    this.#bboxTracker.resetBBox(idx);
+    return this;
+  }
+  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {
+    this.#bboxTracker.recordClipBox(idx, ctx, minX, maxX, minY, maxY);
+    return this;
+  }
+  recordBBox(idx, ctx, minX, maxX, minY, maxY) {
+    this.#bboxTracker.recordBBox(idx, ctx, minX, maxX, minY, maxY);
+    return this;
+  }
+  recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) {
+    const fontBBox = font.bbox;
+    let isBBoxTrustworthy;
+    let computedBBox;
+    if (fontBBox) {
+      isBBoxTrustworthy = fontBBox[2] !== fontBBox[0] && fontBBox[3] !== fontBBox[1] && this.#fontBBoxTrustworthy.get(font);
+      if (isBBoxTrustworthy !== false) {
+        computedBBox = [0, 0, 0, 0];
+        Util.axialAlignedBoundingBox(fontBBox, font.fontMatrix, computedBBox);
+        if (scale !== 1 || x !== 0 || y !== 0) {
+          scaleCharBBox(scale, -scale, x, y, computedBBox);
+        }
+        if (isBBoxTrustworthy) {
+          return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]);
+        }
+      }
+    }
+    if (!getMeasure) {
+      return this.recordFullPageBBox(idx);
+    }
+    const measure = getMeasure();
+    if (fontBBox && computedBBox && isBBoxTrustworthy === undefined) {
+      isBBoxTrustworthy = computedBBox[0] <= x - measure.actualBoundingBoxLeft && computedBBox[2] >= x + measure.actualBoundingBoxRight && computedBBox[1] <= y - measure.actualBoundingBoxAscent && computedBBox[3] >= y + measure.actualBoundingBoxDescent;
+      this.#fontBBoxTrustworthy.set(font, isBBoxTrustworthy);
+      if (isBBoxTrustworthy) {
+        return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]);
+      }
+    }
+    return this.recordBBox(idx, ctx, x - measure.actualBoundingBoxLeft, x + measure.actualBoundingBoxRight, y - measure.actualBoundingBoxAscent, y + measure.actualBoundingBoxDescent);
+  }
+  recordFullPageBBox(idx) {
+    this.#bboxTracker.recordFullPageBBox(idx);
+    return this;
+  }
+  getSimpleIndex(dependencyName) {
+    return this.#simple[dependencyName];
+  }
+  recordDependencies(idx, dependencyNames) {
+    const pendingDependencies = this.#pendingDependencies;
+    const simple = this.#simple;
+    const incremental = this.#incremental;
+    for (const name of dependencyNames) {
+      if (name in this.#simple) {
+        pendingDependencies.add(simple[name]);
+      } else if (name in incremental) {
+        incremental[name].forEach(pendingDependencies.add, pendingDependencies);
+      }
+    }
+    return this;
+  }
+  recordNamedDependency(idx, name) {
+    if (this.#namedDependencies.has(name)) {
+      this.#pendingDependencies.add(this.#namedDependencies.get(name));
+    }
+    return this;
+  }
+  recordOperation(idx, preserve = false) {
+    this.recordDependencies(idx, [FORCED_DEPENDENCY_LABEL]);
+    if (this.#debugMetadata) {
+      const metadata = ensureDebugMetadata(this.#debugMetadata, idx);
+      const {
+        dependencies
+      } = metadata;
+      this.#pendingDependencies.forEach(dependencies.add, dependencies);
+      this.#bboxTracker._savesStack.forEach(dependencies.add, dependencies);
+      this.#bboxTracker._markedContentStack.forEach(dependencies.add, dependencies);
+      dependencies.delete(idx);
+      metadata.isRenderingOperation = true;
+    }
+    const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx;
+    this.#bboxTracker.recordOperation(idx, preserve, [this.#pendingDependencies, this.#bboxTracker._savesStack, this.#bboxTracker._markedContentStack]);
+    if (needsCleanup) {
+      this.#pendingDependencies.clear();
+    }
+    return this;
+  }
+  recordShowTextOperation(idx, preserve = false) {
+    const deps = Array.from(this.#pendingDependencies);
+    this.recordOperation(idx, preserve);
+    this.recordIncrementalData("sameLineText", idx);
+    for (const dep of deps) {
+      this.recordIncrementalData("sameLineText", dep);
+    }
+    return this;
+  }
+  bboxToClipBoxDropOperation(idx, preserve = false) {
+    const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx;
+    this.#bboxTracker.bboxToClipBoxDropOperation(idx);
+    if (needsCleanup) {
+      this.#pendingDependencies.clear();
+    }
+    return this;
+  }
+  take() {
+    this.#fontBBoxTrustworthy.clear();
+    return this.#bboxTracker.take();
+  }
+  takeDebugMetadata() {
+    return this.#debugMetadata;
+  }
+}
+class CanvasNestedDependencyTracker {
+  #dependencyTracker;
+  #opIdx;
+  #ignoreBBoxes;
+  #nestingLevel = 0;
+  #savesLevel = 0;
+  constructor(dependencyTracker, opIdx, ignoreBBoxes) {
+    if (dependencyTracker instanceof CanvasNestedDependencyTracker && dependencyTracker.#ignoreBBoxes === !!ignoreBBoxes) {
+      return dependencyTracker;
+    }
+    this.#dependencyTracker = dependencyTracker;
+    this.#opIdx = opIdx;
+    this.#ignoreBBoxes = !!ignoreBBoxes;
+  }
+  get clipBox() {
+    return this.#dependencyTracker.clipBox;
+  }
+  growOperationsCount() {
+    throw new Error("Unreachable");
+  }
+  save(opIdx) {
+    this.#savesLevel++;
+    this.#dependencyTracker.save(this.#opIdx);
+    return this;
+  }
+  restore(opIdx) {
+    if (this.#savesLevel > 0) {
+      this.#dependencyTracker.restore(this.#opIdx);
+      this.#savesLevel--;
+    }
+    return this;
+  }
+  recordOpenMarker(idx) {
+    this.#nestingLevel++;
+    return this;
+  }
+  getOpenMarker() {
+    return this.#nestingLevel > 0 ? this.#opIdx : this.#dependencyTracker.getOpenMarker();
+  }
+  recordCloseMarker(idx) {
+    this.#nestingLevel--;
+    return this;
+  }
+  beginMarkedContent(opIdx) {
+    return this;
+  }
+  endMarkedContent(opIdx) {
+    return this;
+  }
+  pushBaseTransform(ctx) {
+    this.#dependencyTracker.pushBaseTransform(ctx);
+    return this;
+  }
+  popBaseTransform() {
+    this.#dependencyTracker.popBaseTransform();
+    return this;
+  }
+  recordSimpleData(name, idx) {
+    this.#dependencyTracker.recordSimpleData(name, this.#opIdx);
+    return this;
+  }
+  recordIncrementalData(name, idx) {
+    this.#dependencyTracker.recordIncrementalData(name, this.#opIdx);
+    return this;
+  }
+  resetIncrementalData(name, idx) {
+    this.#dependencyTracker.resetIncrementalData(name, this.#opIdx);
+    return this;
+  }
+  recordNamedData(name, idx) {
+    return this;
+  }
+  recordSimpleDataFromNamed(name, depName, fallbackIdx) {
+    this.#dependencyTracker.recordSimpleDataFromNamed(name, depName, this.#opIdx);
+    return this;
+  }
+  recordFutureForcedDependency(name, idx) {
+    this.#dependencyTracker.recordFutureForcedDependency(name, this.#opIdx);
+    return this;
+  }
+  inheritSimpleDataAsFutureForcedDependencies(names) {
+    this.#dependencyTracker.inheritSimpleDataAsFutureForcedDependencies(names);
+    return this;
+  }
+  inheritPendingDependenciesAsFutureForcedDependencies() {
+    this.#dependencyTracker.inheritPendingDependenciesAsFutureForcedDependencies();
+    return this;
+  }
+  resetBBox(idx) {
+    if (!this.#ignoreBBoxes) {
+      this.#dependencyTracker.resetBBox(this.#opIdx);
+    }
+    return this;
+  }
+  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {
+    if (!this.#ignoreBBoxes) {
+      this.#dependencyTracker.recordClipBox(this.#opIdx, ctx, minX, maxX, minY, maxY);
+    }
+    return this;
+  }
+  recordBBox(idx, ctx, minX, maxX, minY, maxY) {
+    if (!this.#ignoreBBoxes) {
+      this.#dependencyTracker.recordBBox(this.#opIdx, ctx, minX, maxX, minY, maxY);
+    }
+    return this;
+  }
+  recordCharacterBBox(idx, ctx, font, scale, x, y, getMeasure) {
+    if (!this.#ignoreBBoxes) {
+      this.#dependencyTracker.recordCharacterBBox(this.#opIdx, ctx, font, scale, x, y, getMeasure);
+    }
+    return this;
+  }
+  recordFullPageBBox(idx) {
+    if (!this.#ignoreBBoxes) {
+      this.#dependencyTracker.recordFullPageBBox(this.#opIdx);
+    }
+    return this;
+  }
+  getSimpleIndex(dependencyName) {
+    return this.#dependencyTracker.getSimpleIndex(dependencyName);
+  }
+  recordDependencies(idx, dependencyNames) {
+    this.#dependencyTracker.recordDependencies(this.#opIdx, dependencyNames);
+    return this;
+  }
+  recordNamedDependency(idx, name) {
+    this.#dependencyTracker.recordNamedDependency(this.#opIdx, name);
+    return this;
+  }
+  recordOperation(idx) {
+    this.#dependencyTracker.recordOperation(this.#opIdx, true);
+    return this;
+  }
+  recordShowTextOperation(idx) {
+    this.#dependencyTracker.recordShowTextOperation(this.#opIdx, true);
+    return this;
+  }
+  bboxToClipBoxDropOperation(idx) {
+    if (!this.#ignoreBBoxes) {
+      this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx, true);
+    }
+    return this;
+  }
+  take() {
+    throw new Error("Unreachable");
+  }
+  takeDebugMetadata() {
+    throw new Error("Unreachable");
+  }
+}
+const Dependencies = {
+  stroke: ["path", "transform", "filter", "strokeColor", "strokeAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "dash"],
+  fill: ["path", "transform", "filter", "fillColor", "fillAlpha", "globalCompositeOperation", "SMask"],
+  imageXObject: ["transform", "SMask", "filter", "fillAlpha", "strokeAlpha", "globalCompositeOperation"],
+  rawFillPath: ["filter", "fillColor", "fillAlpha"],
+  showText: ["transform", "leading", "charSpacing", "wordSpacing", "hScale", "textRise", "moveText", "textMatrix", "font", "fontObj", "filter", "fillColor", "textRenderingMode", "SMask", "fillAlpha", "strokeAlpha", "globalCompositeOperation", "sameLineText"],
+  transform: ["transform"],
+  transformAndFill: ["transform", "fillColor"]
+};
+class CanvasImagesTracker {
+  #canvasWidth;
+  #canvasHeight;
+  #capacity = 4;
+  #count = 0;
+  #coords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6);
+  static #CoordsArray = FeatureTest.isFloat16ArraySupported ? Float16Array : Float32Array;
+  constructor(canvas) {
+    this.#canvasWidth = canvas.width;
+    this.#canvasHeight = canvas.height;
+  }
+  record(ctx, width, height, clipBox) {
+    if (this.#count === this.#capacity) {
+      this.#capacity *= 2;
+      const newCoords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6);
+      newCoords.set(this.#coords);
+      this.#coords = newCoords;
+    }
+    const transform = getCurrentTransform(ctx);
+    let coords;
+    if (clipBox[0] !== Infinity) {
+      const bbox = BBOX_INIT.slice();
+      Util.axialAlignedBoundingBox([0, -height, width, 0], transform, bbox);
+      const finalBBox = Util.intersect(clipBox, bbox);
+      if (!finalBBox) {
+        return;
+      }
+      const [minX, minY, maxX, maxY] = finalBBox;
+      if (minX !== bbox[0] || minY !== bbox[1] || maxX !== bbox[2] || maxY !== bbox[3]) {
+        const rotationAngle = Math.atan2(transform[1], transform[0]);
+        const sin = Math.abs(Math.sin(rotationAngle));
+        const cos = Math.abs(Math.cos(rotationAngle));
+        if (sin < 1e-6 || cos < 1e-6 || Math.abs(sin - cos) < 1e-6) {
+          coords = [minX, minY, minX, maxY, maxX, minY];
+        } else {
+          const finalBBoxWidth = maxX - minX;
+          const finalBBoxHeight = maxY - minY;
+          const sin2 = sin * sin;
+          const cos2 = cos * cos;
+          const cosSin = cos * sin;
+          const denom = cos2 - sin2;
+          const a = (finalBBoxHeight * cos2 - finalBBoxWidth * cosSin) / denom;
+          const b = (finalBBoxHeight * cosSin - finalBBoxWidth * sin2) / denom;
+          coords = [minX + b, minY, minX, minY + a, maxX, maxY - a];
+        }
+      }
+    }
+    if (!coords) {
+      coords = [0, -height, 0, 0, width, -height];
+      Util.applyTransform(coords, transform, 0);
+      Util.applyTransform(coords, transform, 2);
+      Util.applyTransform(coords, transform, 4);
+    }
+    coords[0] /= this.#canvasWidth;
+    coords[1] /= this.#canvasHeight;
+    coords[2] /= this.#canvasWidth;
+    coords[3] /= this.#canvasHeight;
+    coords[4] /= this.#canvasWidth;
+    coords[5] /= this.#canvasHeight;
+    this.#coords.set(coords, this.#count * 6);
+    this.#count++;
+  }
+  take() {
+    return this.#coords.subarray(0, this.#count * 6);
+  }
+}
+
+;// ./src/display/font_loader.js
+
+
+class FontLoader {
+  #systemFonts = new Set();
+  #styleSheet = null;
+  constructor({
+    ownerDocument = globalThis.document,
+    styleElement = null
+  }) {
+    this._document = ownerDocument;
+    this.nativeFontFaces = new Set();
+    this.styleElement = null;
+    this.loadingRequests = [];
+    this.loadTestFontId = 0;
+  }
+  addNativeFontFace(nativeFontFace) {
+    this.nativeFontFaces.add(nativeFontFace);
+    this._document.fonts.add(nativeFontFace);
+  }
+  removeNativeFontFace(nativeFontFace) {
+    this.nativeFontFaces.delete(nativeFontFace);
+    this._document.fonts.delete(nativeFontFace);
+  }
+  insertRule(rule) {
+    const styleSheet = this.#getStyleSheet();
+    styleSheet.insertRule(rule, styleSheet.cssRules.length);
+  }
+  #getStyleSheet() {
+    if (this.#styleSheet) {
+      return this.#styleSheet;
+    }
+    const StyleSheet = this._document.defaultView?.CSSStyleSheet || globalThis.CSSStyleSheet;
+    if (!this.styleElement && StyleSheet) {
+      const {
+        adoptedStyleSheets
+      } = this._document;
+      if (adoptedStyleSheets) {
+        const styleSheet = new StyleSheet();
+        adoptedStyleSheets.push(styleSheet);
+        return this.#styleSheet = styleSheet;
+      }
+    }
+    if (!this.styleElement) {
+      this.styleElement = this._document.createElement("style");
+      this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement);
+    }
+    return this.#styleSheet = this.styleElement.sheet;
+  }
+  clear() {
+    for (const nativeFontFace of this.nativeFontFaces) {
+      this._document.fonts.delete(nativeFontFace);
+    }
+    this.nativeFontFaces.clear();
+    this.#systemFonts.clear();
+    if (this.#styleSheet) {
+      const {
+        adoptedStyleSheets
+      } = this._document;
+      if (adoptedStyleSheets?.includes(this.#styleSheet)) {
+        this._document.adoptedStyleSheets = adoptedStyleSheets.filter(styleSheet => styleSheet !== this.#styleSheet);
+      }
+      this.#styleSheet = null;
+    }
+    if (this.styleElement) {
+      this.styleElement.remove();
+      this.styleElement = null;
+    }
+  }
+  async loadSystemFont({
+    systemFontInfo: info,
+    disableFontFace,
+    _inspectFont
+  }) {
+    if (!info || this.#systemFonts.has(info.loadedName)) {
+      return;
+    }
+    assert(!disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set.");
+    if (this.isFontLoadingAPISupported) {
+      const {
+        loadedName,
+        src,
+        style
+      } = info;
+      const fontFace = new FontFace(loadedName, src, style);
+      this.addNativeFontFace(fontFace);
+      try {
+        await fontFace.load();
+        this.#systemFonts.add(loadedName);
+        _inspectFont?.(info);
+      } catch {
+        warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`);
+        this.removeNativeFontFace(fontFace);
+      }
+      return;
+    }
+    unreachable("Not implemented: loadSystemFont without the Font Loading API.");
+  }
+  async bind(font) {
+    if (font.attached || font.missingFile && !font.systemFontInfo) {
+      return;
+    }
+    font.attached = true;
+    if (font.systemFontInfo) {
+      await this.loadSystemFont(font);
+      return;
+    }
+    if (this.isFontLoadingAPISupported) {
+      const nativeFontFace = font.createNativeFontFace();
+      if (nativeFontFace) {
+        this.addNativeFontFace(nativeFontFace);
+        try {
+          await nativeFontFace.loaded;
+        } catch (ex) {
+          warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);
+          font.disableFontFace = true;
+          throw ex;
+        }
+      }
+      return;
+    }
+    const rule = font.createFontFaceRule();
+    if (rule) {
+      this.insertRule(rule);
+      if (this.isSyncFontLoadingSupported) {
+        return;
+      }
+      await new Promise(resolve => {
+        const request = this._queueLoadingCallback(resolve);
+        this._prepareFontLoadEvent(font, request);
+      });
+    }
+  }
+  get isFontLoadingAPISupported() {
+    const hasFonts = !!this._document?.fonts;
+    return shadow(this, "isFontLoadingAPISupported", hasFonts);
+  }
+  get isSyncFontLoadingSupported() {
+    return shadow(this, "isSyncFontLoadingSupported", isNodeJS || FeatureTest.platform.isFirefox);
+  }
+  _queueLoadingCallback(callback) {
+    function completeRequest() {
+      assert(!request.done, "completeRequest() cannot be called twice.");
+      request.done = true;
+      while (loadingRequests.length > 0 && loadingRequests[0].done) {
+        const otherRequest = loadingRequests.shift();
+        setTimeout(otherRequest.callback, 0);
+      }
+    }
+    const {
+      loadingRequests
+    } = this;
+    const request = {
+      done: false,
+      complete: completeRequest,
+      callback
+    };
+    loadingRequests.push(request);
+    return request;
+  }
+  get _loadTestFont() {
+    const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==");
+    return shadow(this, "_loadTestFont", testFont);
+  }
+  _prepareFontLoadEvent(font, request) {
+    function int32(data, offset) {
+      return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff;
+    }
+    function string32(value) {
+      return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
+    }
+    function spliceString(s, offset, remove, insert) {
+      const chunk1 = s.substring(0, offset);
+      const chunk2 = s.substring(offset + remove);
+      return chunk1 + insert + chunk2;
+    }
+    let i, ii;
+    const canvas = this._document.createElement("canvas");
+    canvas.width = 1;
+    canvas.height = 1;
+    const ctx = canvas.getContext("2d");
+    let called = 0;
+    function isFontReady(name, callback) {
+      if (++called > 30) {
+        warn("Load test font never loaded.");
+        callback();
+        return;
+      }
+      ctx.font = "30px " + name;
+      ctx.fillText(".", 0, 20);
+      const imageData = ctx.getImageData(0, 0, 1, 1);
+      if (imageData.data[3] > 0) {
+        callback();
+        return;
+      }
+      setTimeout(isFontReady.bind(null, name, callback));
+    }
+    const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;
+    let data = this._loadTestFont;
+    const COMMENT_OFFSET = 976;
+    data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);
+    const CFF_CHECKSUM_OFFSET = 16;
+    const XXXX_VALUE = 0x58585858;
+    let checksum = int32(data, CFF_CHECKSUM_OFFSET);
+    for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {
+      checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;
+    }
+    if (i < loadTestFontId.length) {
+      checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0;
+    }
+    data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));
+    const url = `url(data:font/opentype;base64,${btoa(data)});`;
+    const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`;
+    this.insertRule(rule);
+    const div = this._document.createElement("div");
+    div.style.visibility = "hidden";
+    div.style.width = div.style.height = "10px";
+    div.style.position = "absolute";
+    div.style.top = div.style.left = "0px";
+    for (const name of [font.loadedName, loadTestFontId]) {
+      const span = this._document.createElement("span");
+      span.textContent = "Hi";
+      span.style.fontFamily = name;
+      div.append(span);
+    }
+    this._document.body.append(div);
+    isFontReady(loadTestFontId, () => {
+      div.remove();
+      request.complete();
+    });
+  }
+}
+class FontFaceObject {
+  compiledGlyphs = Object.create(null);
+  #fontData;
+  constructor(translatedData, inspectFont = null, charProcOperatorList, extra) {
+    this.#fontData = translatedData;
+    this._inspectFont = inspectFont;
+    if (charProcOperatorList) {
+      this.charProcOperatorList = charProcOperatorList;
+    }
+    if (extra) {
+      Object.assign(this, extra);
+    }
+  }
+  createNativeFontFace() {
+    if (!this.data || this.disableFontFace) {
+      return null;
+    }
+    let nativeFontFace;
+    if (!this.cssFontInfo) {
+      nativeFontFace = new FontFace(this.loadedName, this.data, {});
+    } else {
+      const css = {
+        weight: this.cssFontInfo.fontWeight
+      };
+      if (this.cssFontInfo.italicAngle) {
+        css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;
+      }
+      nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css);
+    }
+    this._inspectFont?.(this);
+    return nativeFontFace;
+  }
+  createFontFaceRule() {
+    if (!this.data || this.disableFontFace) {
+      return null;
+    }
+    const url = `url(data:${this.mimetype};base64,${this.data.toBase64()});`;
+    let rule;
+    if (!this.cssFontInfo) {
+      rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`;
+    } else {
+      let css = `font-weight: ${this.cssFontInfo.fontWeight};`;
+      if (this.cssFontInfo.italicAngle) {
+        css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;
+      }
+      rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`;
+    }
+    this._inspectFont?.(this, url);
+    return rule;
+  }
+  getPathGenerator(objs, character) {
+    if (this.compiledGlyphs[character] !== undefined) {
+      return this.compiledGlyphs[character];
+    }
+    const objId = this.loadedName + "_path_" + character;
+    let cmds;
+    try {
+      cmds = objs.get(objId);
+    } catch (ex) {
+      warn(`getPathGenerator - ignoring character: "${ex}".`);
+    }
+    const path = makePathFromDrawOPS(cmds?.path);
+    if (!this.fontExtraProperties) {
+      objs.delete(objId);
+    }
+    return this.compiledGlyphs[character] = path;
+  }
+  get black() {
+    return this.#fontData.black;
+  }
+  get bold() {
+    return this.#fontData.bold;
+  }
+  get disableFontFace() {
+    return this.#fontData.disableFontFace;
+  }
+  set disableFontFace(value) {
+    shadow(this, "disableFontFace", !!value);
+  }
+  get fontExtraProperties() {
+    return this.#fontData.fontExtraProperties;
+  }
+  get isInvalidPDFjsFont() {
+    return this.#fontData.isInvalidPDFjsFont;
+  }
+  get isType3Font() {
+    return this.#fontData.isType3Font;
+  }
+  get italic() {
+    return this.#fontData.italic;
+  }
+  get missingFile() {
+    return this.#fontData.missingFile;
+  }
+  get remeasure() {
+    return this.#fontData.remeasure;
+  }
+  get vertical() {
+    return this.#fontData.vertical;
+  }
+  get ascent() {
+    return this.#fontData.ascent;
+  }
+  get defaultWidth() {
+    return this.#fontData.defaultWidth;
+  }
+  get descent() {
+    return this.#fontData.descent;
+  }
+  get bbox() {
+    return this.#fontData.bbox;
+  }
+  get fontMatrix() {
+    return this.#fontData.fontMatrix;
+  }
+  get fallbackName() {
+    return this.#fontData.fallbackName;
+  }
+  get loadedName() {
+    return this.#fontData.loadedName;
+  }
+  get mimetype() {
+    return this.#fontData.mimetype;
+  }
+  get name() {
+    return this.#fontData.name;
+  }
+  get data() {
+    return this.#fontData.data;
+  }
+  clearData() {
+    this.#fontData.clearData();
+  }
+  get cssFontInfo() {
+    return this.#fontData.cssFontInfo;
+  }
+  get systemFontInfo() {
+    return this.#fontData.systemFontInfo;
+  }
+  get defaultVMetrics() {
+    return this.#fontData.defaultVMetrics;
+  }
+}
+
+;// ./src/shared/obj_bin_transform_utils.js
+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(this.bools.length * 2 / 8);
+  static OFFSET_BBOX = this.OFFSET_NUMBERS + this.numbers.length * 8;
+  static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4;
+  static OFFSET_DEFAULT_VMETRICS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6;
+  static OFFSET_STRINGS = this.OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3;
+}
+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;
+}
+
+;// ./src/display/obj_bin_transform_display.js
+
+
+class CssFontInfo {
+  #buffer;
+  #decoder = new TextDecoder();
+  #view;
+  constructor(buffer) {
+    this.#buffer = buffer;
+    this.#view = new DataView(buffer);
+  }
+  #readString(index) {
+    assert(index < CSS_FONT_INFO.strings.length, "Invalid string index");
+    let offset = 0;
+    for (let i = 0; i < index; i++) {
+      offset += this.#view.getUint32(offset) + 4;
+    }
+    const length = this.#view.getUint32(offset);
+    return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length));
+  }
+  get fontFamily() {
+    return this.#readString(0);
+  }
+  get fontWeight() {
+    return this.#readString(1);
+  }
+  get italicAngle() {
+    return this.#readString(2);
+  }
+}
+class SystemFontInfo {
+  #buffer;
+  #decoder = new TextDecoder();
+  #view;
+  constructor(buffer) {
+    this.#buffer = buffer;
+    this.#view = new DataView(buffer);
+  }
+  get guessFallback() {
+    return this.#view.getUint8(0) !== 0;
+  }
+  #readString(index) {
+    assert(index < SYSTEM_FONT_INFO.strings.length, "Invalid string index");
+    let offset = 5;
+    for (let i = 0; i < index; i++) {
+      offset += this.#view.getUint32(offset) + 4;
+    }
+    const length = this.#view.getUint32(offset);
+    return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length));
+  }
+  get css() {
+    return this.#readString(0);
+  }
+  get loadedName() {
+    return this.#readString(1);
+  }
+  get baseFontName() {
+    return this.#readString(2);
+  }
+  get src() {
+    return this.#readString(3);
+  }
+  get style() {
+    let offset = 1;
+    offset += 4 + this.#view.getUint32(offset);
+    const styleLength = this.#view.getUint32(offset);
+    const style = this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, styleLength));
+    offset += 4 + styleLength;
+    const weightLength = this.#view.getUint32(offset);
+    const weight = this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, weightLength));
+    return {
+      style,
+      weight
+    };
+  }
+}
+class FontInfo {
+  #buffer;
+  #decoder = new TextDecoder();
+  #view;
+  constructor({
+    buffer,
+    extra
+  }) {
+    this.#buffer = buffer;
+    this.#view = new DataView(buffer);
+    if (extra) {
+      Object.assign(this, extra);
+    }
+  }
+  #readBoolean(index) {
+    assert(index < FONT_INFO.bools.length, "Invalid boolean index");
+    const byteOffset = Math.floor(index / 4);
+    const bitOffset = index * 2 % 8;
+    const value = this.#view.getUint8(byteOffset) >> bitOffset & 0x03;
+    return value === 0x00 ? undefined : value === 0x02;
+  }
+  get black() {
+    return this.#readBoolean(0);
+  }
+  get bold() {
+    return this.#readBoolean(1);
+  }
+  get disableFontFace() {
+    return this.#readBoolean(2);
+  }
+  get fontExtraProperties() {
+    return this.#readBoolean(3);
+  }
+  get isInvalidPDFjsFont() {
+    return this.#readBoolean(4);
+  }
+  get isType3Font() {
+    return this.#readBoolean(5);
+  }
+  get italic() {
+    return this.#readBoolean(6);
+  }
+  get missingFile() {
+    return this.#readBoolean(7);
+  }
+  get remeasure() {
+    return this.#readBoolean(8);
+  }
+  get vertical() {
+    return this.#readBoolean(9);
+  }
+  #readNumber(index) {
+    assert(index < FONT_INFO.numbers.length, "Invalid number index");
+    return this.#view.getFloat64(FONT_INFO.OFFSET_NUMBERS + index * 8);
+  }
+  get ascent() {
+    return this.#readNumber(0);
+  }
+  get defaultWidth() {
+    return this.#readNumber(1);
+  }
+  get descent() {
+    return this.#readNumber(2);
+  }
+  #readArray(offset, arrLen, lookupName, increment) {
+    const len = this.#view.getUint8(offset);
+    if (len === 0) {
+      return undefined;
+    }
+    assert(len === arrLen, "Invalid array length.");
+    offset += 1;
+    const arr = new Array(len);
+    for (let i = 0; i < len; i++) {
+      arr[i] = this.#view[lookupName](offset, true);
+      offset += increment;
+    }
+    return arr;
+  }
+  get bbox() {
+    return this.#readArray(FONT_INFO.OFFSET_BBOX, 4, "getInt16", 2);
+  }
+  get fontMatrix() {
+    return this.#readArray(FONT_INFO.OFFSET_FONT_MATRIX, 6, "getFloat64", 8);
+  }
+  get defaultVMetrics() {
+    return this.#readArray(FONT_INFO.OFFSET_DEFAULT_VMETRICS, 3, "getInt16", 2);
+  }
+  #readString(index) {
+    assert(index < FONT_INFO.strings.length, "Invalid string index");
+    let offset = FONT_INFO.OFFSET_STRINGS + 4;
+    for (let i = 0; i < index; i++) {
+      offset += this.#view.getUint32(offset) + 4;
+    }
+    const length = this.#view.getUint32(offset);
+    return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length));
+  }
+  get fallbackName() {
+    return this.#readString(0);
+  }
+  get loadedName() {
+    return this.#readString(1);
+  }
+  get mimetype() {
+    return this.#readString(2);
+  }
+  get name() {
+    return this.#readString(3);
+  }
+  #getDataOffsets() {
+    let offset = FONT_INFO.OFFSET_STRINGS;
+    const stringsLength = this.#view.getUint32(offset);
+    offset += 4 + stringsLength;
+    const systemFontInfoLength = this.#view.getUint32(offset);
+    offset += 4 + systemFontInfoLength;
+    const cssFontInfoLength = this.#view.getUint32(offset);
+    offset += 4 + cssFontInfoLength;
+    const length = this.#view.getUint32(offset);
+    return {
+      offset,
+      length
+    };
+  }
+  get data() {
+    const {
+      offset,
+      length
+    } = this.#getDataOffsets();
+    return length === 0 ? undefined : new Uint8Array(this.#buffer, offset + 4, length);
+  }
+  clearData() {
+    const {
+      offset,
+      length
+    } = this.#getDataOffsets();
+    if (length === 0) {
+      return;
+    }
+    this.#view.setUint32(offset, 0);
+    this.#buffer = new Uint8Array(this.#buffer, 0, offset + 4).slice().buffer;
+    this.#view = new DataView(this.#buffer);
+  }
+  get cssFontInfo() {
+    let offset = FONT_INFO.OFFSET_STRINGS;
+    const stringsLength = this.#view.getUint32(offset);
+    offset += 4 + stringsLength;
+    const systemFontInfoLength = this.#view.getUint32(offset);
+    offset += 4 + systemFontInfoLength;
+    const cssFontInfoLength = this.#view.getUint32(offset);
+    if (cssFontInfoLength === 0) {
+      return null;
+    }
+    const cssFontInfoData = new Uint8Array(cssFontInfoLength);
+    cssFontInfoData.set(new Uint8Array(this.#buffer, offset + 4, cssFontInfoLength));
+    return new CssFontInfo(cssFontInfoData.buffer);
+  }
+  get systemFontInfo() {
+    let offset = FONT_INFO.OFFSET_STRINGS;
+    const stringsLength = this.#view.getUint32(offset);
+    offset += 4 + stringsLength;
+    const systemFontInfoLength = this.#view.getUint32(offset);
+    if (systemFontInfoLength === 0) {
+      return null;
+    }
+    const systemFontInfoData = new Uint8Array(systemFontInfoLength);
+    systemFontInfoData.set(new Uint8Array(this.#buffer, offset + 4, systemFontInfoLength));
+    return new SystemFontInfo(systemFontInfoData.buffer);
+  }
+}
+class PatternInfo {
+  constructor(buffer) {
+    this.buffer = buffer;
+    this.view = new DataView(buffer);
+    this.data = new Uint8Array(buffer);
+  }
+  getIR() {
+    const dataView = this.view;
+    const kind = this.data[PATTERN_INFO.KIND];
+    const hasBBox = !!this.data[PATTERN_INFO.HAS_BBOX];
+    const hasBackground = !!this.data[PATTERN_INFO.HAS_BACKGROUND];
+    const nCoord = dataView.getUint32(PATTERN_INFO.N_COORD, true);
+    const nColor = dataView.getUint32(PATTERN_INFO.N_COLOR, true);
+    const nStop = dataView.getUint32(PATTERN_INFO.N_STOP, true);
+    let offset = 20;
+    const coords = new Float32Array(this.buffer, offset, nCoord * 2);
+    offset += nCoord * 8;
+    const colors = new Uint8Array(this.buffer, offset, nColor * 4);
+    offset += nColor * 4;
+    const stops = [];
+    for (let i = 0; i < nStop; ++i) {
+      const p = dataView.getFloat32(offset, true);
+      offset += 4;
+      const rgb = dataView.getUint32(offset, true);
+      offset += 4;
+      stops.push([p, `#${rgb.toString(16).padStart(6, "0")}`]);
+    }
+    let bbox = null;
+    if (hasBBox) {
+      bbox = [];
+      for (let i = 0; i < 4; ++i) {
+        bbox.push(dataView.getFloat32(offset, true));
+        offset += 4;
+      }
+    }
+    let background = null;
+    if (hasBackground) {
+      background = new Uint8Array(this.buffer, offset, 3);
+      offset += 3;
+    }
+    if (kind === 1) {
+      return ["RadialAxial", "axial", bbox, stops, Array.from(coords.slice(0, 2)), Array.from(coords.slice(2, 4)), null, null];
+    }
+    if (kind === 2) {
+      return ["RadialAxial", "radial", bbox, stops, [coords[0], coords[1]], [coords[3], coords[4]], coords[2], coords[5]];
+    }
+    if (kind === 3) {
+      const shadingType = this.data[PATTERN_INFO.SHADING_TYPE];
+      let bounds = null;
+      if (coords.length > 0) {
+        bounds = BBOX_INIT.slice();
+        for (let i = 0, ii = coords.length; i < ii; i += 2) {
+          Util.pointBoundingBox(coords[i], coords[i + 1], bounds);
+        }
+      }
+      return ["Mesh", shadingType, coords, colors, nCoord, bounds, bbox, background];
+    }
+    throw new Error(`Unsupported pattern kind: ${kind}`);
+  }
+}
+class FontPathInfo {
+  #buffer;
+  constructor(buffer) {
+    this.#buffer = buffer;
+  }
+  get path() {
+    if (FeatureTest.isFloat16ArraySupported) {
+      return new Float16Array(this.#buffer);
+    }
+    return new Float32Array(this.#buffer);
+  }
+}
+
+;// ./src/display/api_utils.js
+
+function getUrlProp(val) {
+  if (val instanceof URL) {
+    return val;
+  }
+  if (typeof val === "string") {
+    if (isNodeJS) {
+      if (/^[a-z][a-z0-9\-+.]+:/i.test(val)) {
+        return new URL(val);
+      }
+      const url = process.getBuiltinModule("url");
+      return new URL(url.pathToFileURL(val));
+    }
+    const url = URL.parse(val, window.location);
+    if (url) {
+      return url;
+    }
+  }
+  throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property.");
+}
+function getDataProp(val) {
+  if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) {
+    throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`.");
+  }
+  if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {
+    return val;
+  }
+  if (typeof val === "string") {
+    return stringToBytes(val);
+  }
+  if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) {
+    return new Uint8Array(val);
+  }
+  throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property.");
+}
+function getFactoryUrlProp(val) {
+  if (typeof val !== "string") {
+    return null;
+  }
+  if (val.endsWith("/")) {
+    return val;
+  }
+  throw new Error(`Invalid factory url: "${val}" must include trailing slash.`);
+}
+const isRefProxy = v => typeof v === "object" && Number.isInteger(v?.num) && v.num >= 0 && Number.isInteger(v?.gen) && v.gen >= 0;
+const isNameProxy = v => typeof v === "object" && typeof v?.name === "string";
+const isValidExplicitDest = _isValidExplicitDest.bind(null, isRefProxy, isNameProxy);
+class LoopbackPort {
+  #listeners = new Map();
+  #deferred = Promise.resolve();
+  postMessage(obj, transfer) {
+    const event = {
+      data: structuredClone(obj, transfer ? {
+        transfer
+      } : null)
+    };
+    this.#deferred.then(() => {
+      for (const [listener] of this.#listeners) {
+        listener.call(this, event);
+      }
+    });
+  }
+  addEventListener(name, listener, options = null) {
+    let rmAbort = null;
+    if (options?.signal instanceof AbortSignal) {
+      const {
+        signal
+      } = options;
+      if (signal.aborted) {
+        warn("LoopbackPort - cannot use an `aborted` signal.");
+        return;
+      }
+      const onAbort = () => this.removeEventListener(name, listener);
+      rmAbort = () => signal.removeEventListener("abort", onAbort);
+      signal.addEventListener("abort", onAbort);
+    }
+    this.#listeners.set(listener, rmAbort);
+  }
+  removeEventListener(name, listener) {
+    const rmAbort = this.#listeners.get(listener);
+    rmAbort?.();
+    this.#listeners.delete(listener);
+  }
+  terminate() {
+    for (const [, rmAbort] of this.#listeners) {
+      rmAbort?.();
+    }
+    this.#listeners.clear();
+  }
+}
+
+;// ./src/shared/message_handler.js
+
+const CallbackKind = {
+  DATA: 1,
+  ERROR: 2
+};
+const StreamKind = {
+  CANCEL: 1,
+  CANCEL_COMPLETE: 2,
+  CLOSE: 3,
+  ENQUEUE: 4,
+  ERROR: 5,
+  PULL: 6,
+  PULL_COMPLETE: 7,
+  START_COMPLETE: 8
+};
+function onFn() {}
+function wrapReason(ex) {
+  if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) {
+    return ex;
+  }
+  if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) {
+    unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');
+  }
+  switch (ex.name) {
+    case "AbortException":
+      return new AbortException(ex.message);
+    case "InvalidPDFException":
+      return new InvalidPDFException(ex.message);
+    case "PasswordException":
+      return new PasswordException(ex.message, ex.code);
+    case "ResponseException":
+      return new ResponseException(ex.message, ex.status, ex.missing);
+    case "UnknownErrorException":
+      return new UnknownErrorException(ex.message, ex.details);
+  }
+  return new UnknownErrorException(ex.message, ex.toString());
+}
+class MessageHandler {
+  #messageAC = new AbortController();
+  constructor(sourceName, targetName, comObj) {
+    this.sourceName = sourceName;
+    this.targetName = targetName;
+    this.comObj = comObj;
+    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);
+    comObj.addEventListener("message", this.#onMessage.bind(this), {
+      signal: this.#messageAC.signal
+    });
+  }
+  #onMessage({
+    data
+  }) {
+    if (data.targetName !== this.sourceName) {
+      return;
+    }
+    if (data.stream) {
+      this.#processStreamMessage(data);
+      return;
+    }
+    if (data.callback) {
+      const callbackId = data.callbackId;
+      const capability = this.callbackCapabilities[callbackId];
+      if (!capability) {
+        throw new Error(`Cannot resolve callback ${callbackId}`);
+      }
+      delete this.callbackCapabilities[callbackId];
+      if (data.callback === CallbackKind.DATA) {
+        capability.resolve(data.data);
+      } else if (data.callback === CallbackKind.ERROR) {
+        capability.reject(wrapReason(data.reason));
+      } else {
+        throw new Error("Unexpected callback case");
+      }
+      return;
+    }
+    const action = this.actionHandler[data.action];
+    if (!action) {
+      throw new Error(`Unknown action from worker: ${data.action}`);
+    }
+    if (data.callbackId) {
+      const sourceName = this.sourceName,
+        targetName = data.sourceName,
+        comObj = this.comObj;
+      Promise.try(action, data.data).then(function (result) {
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          callback: CallbackKind.DATA,
+          callbackId: data.callbackId,
+          data: result
+        });
+      }, function (reason) {
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          callback: CallbackKind.ERROR,
+          callbackId: data.callbackId,
+          reason: wrapReason(reason)
+        });
+      });
+      return;
+    }
+    if (data.streamId) {
+      this.#createStreamSink(data);
+      return;
+    }
+    action(data.data);
+  }
+  on(actionName, handler) {
+    const ah = this.actionHandler;
+    if (ah[actionName]) {
+      throw new Error(`There is already an actionName called "${actionName}"`);
+    }
+    ah[actionName] = handler;
+  }
+  send(actionName, data, transfers) {
+    this.comObj.postMessage({
+      sourceName: this.sourceName,
+      targetName: this.targetName,
+      action: actionName,
+      data
+    }, transfers);
+  }
+  sendWithPromise(actionName, data, transfers) {
+    const callbackId = this.callbackId++;
+    const capability = Promise.withResolvers();
+    this.callbackCapabilities[callbackId] = capability;
+    try {
+      this.comObj.postMessage({
+        sourceName: this.sourceName,
+        targetName: this.targetName,
+        action: actionName,
+        callbackId,
+        data
+      }, transfers);
+    } catch (ex) {
+      capability.reject(ex);
+    }
+    return capability.promise;
+  }
+  sendWithStream(actionName, data, queueingStrategy, transfers) {
+    const streamId = this.streamId++,
+      sourceName = this.sourceName,
+      targetName = this.targetName,
+      comObj = this.comObj;
+    return new ReadableStream({
+      start: controller => {
+        const startCapability = Promise.withResolvers();
+        this.streamControllers[streamId] = {
+          controller,
+          startCall: startCapability,
+          pullCall: null,
+          cancelCall: null,
+          isClosed: false
+        };
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          action: actionName,
+          streamId,
+          data,
+          desiredSize: controller.desiredSize
+        }, transfers);
+        return startCapability.promise;
+      },
+      pull: controller => {
+        const pullCapability = Promise.withResolvers();
+        this.streamControllers[streamId].pullCall = pullCapability;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.PULL,
+          streamId,
+          desiredSize: controller.desiredSize
+        });
+        return pullCapability.promise;
+      },
+      cancel: reason => {
+        assert(reason instanceof Error, "cancel must have a valid reason");
+        const cancelCapability = Promise.withResolvers();
+        this.streamControllers[streamId].cancelCall = cancelCapability;
+        this.streamControllers[streamId].isClosed = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.CANCEL,
+          streamId,
+          reason: wrapReason(reason)
+        });
+        return cancelCapability.promise;
+      }
+    }, queueingStrategy);
+  }
+  #createStreamSink(data) {
+    const streamId = data.streamId,
+      sourceName = this.sourceName,
+      targetName = data.sourceName,
+      comObj = this.comObj;
+    const self = this,
+      action = this.actionHandler[data.action];
+    const streamSink = {
+      enqueue(chunk, size = 1, transfers) {
+        if (this.isCancelled) {
+          return;
+        }
+        const lastDesiredSize = this.desiredSize;
+        this.desiredSize -= size;
+        if (lastDesiredSize > 0 && this.desiredSize <= 0) {
+          this.sinkCapability = Promise.withResolvers();
+          this.ready = this.sinkCapability.promise;
+        }
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.ENQUEUE,
+          streamId,
+          chunk
+        }, transfers);
+      },
+      close() {
+        if (this.isCancelled) {
+          return;
+        }
+        this.isCancelled = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.CLOSE,
+          streamId
+        });
+        delete self.streamSinks[streamId];
+      },
+      error(reason) {
+        assert(reason instanceof Error, "error must have a valid reason");
+        if (this.isCancelled) {
+          return;
+        }
+        this.isCancelled = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.ERROR,
+          streamId,
+          reason: wrapReason(reason)
+        });
+      },
+      sinkCapability: Promise.withResolvers(),
+      onPull: null,
+      onCancel: null,
+      isCancelled: false,
+      desiredSize: data.desiredSize,
+      ready: null
+    };
+    streamSink.sinkCapability.resolve();
+    streamSink.ready = streamSink.sinkCapability.promise;
+    this.streamSinks[streamId] = streamSink;
+    Promise.try(action, data.data, streamSink).then(function () {
+      comObj.postMessage({
+        sourceName,
+        targetName,
+        stream: StreamKind.START_COMPLETE,
+        streamId,
+        success: true
+      });
+    }, function (reason) {
+      comObj.postMessage({
+        sourceName,
+        targetName,
+        stream: StreamKind.START_COMPLETE,
+        streamId,
+        reason: wrapReason(reason)
+      });
+    });
+  }
+  #processStreamMessage(data) {
+    const streamId = data.streamId,
+      sourceName = this.sourceName,
+      targetName = data.sourceName,
+      comObj = this.comObj;
+    const streamController = this.streamControllers[streamId],
+      streamSink = this.streamSinks[streamId];
+    switch (data.stream) {
+      case StreamKind.START_COMPLETE:
+        if (data.success) {
+          streamController.startCall.resolve();
+        } else {
+          streamController.startCall.reject(wrapReason(data.reason));
+        }
+        break;
+      case StreamKind.PULL_COMPLETE:
+        if (data.success) {
+          streamController.pullCall.resolve();
+        } else {
+          streamController.pullCall.reject(wrapReason(data.reason));
+        }
+        break;
+      case StreamKind.PULL:
+        if (!streamSink) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            success: true
+          });
+          break;
+        }
+        if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {
+          streamSink.sinkCapability.resolve();
+        }
+        streamSink.desiredSize = data.desiredSize;
+        Promise.try(streamSink.onPull || onFn).then(function () {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            success: true
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            reason: wrapReason(reason)
+          });
+        });
+        break;
+      case StreamKind.ENQUEUE:
+        assert(streamController, "enqueue should have stream controller");
+        if (streamController.isClosed) {
+          break;
+        }
+        streamController.controller.enqueue(data.chunk);
+        break;
+      case StreamKind.CLOSE:
+        assert(streamController, "close should have stream controller");
+        if (streamController.isClosed) {
+          break;
+        }
+        streamController.isClosed = true;
+        streamController.controller.close();
+        this.#deleteStreamController(streamController, streamId);
+        break;
+      case StreamKind.ERROR:
+        assert(streamController, "error should have stream controller");
+        streamController.controller.error(wrapReason(data.reason));
+        this.#deleteStreamController(streamController, streamId);
+        break;
+      case StreamKind.CANCEL_COMPLETE:
+        if (data.success) {
+          streamController.cancelCall.resolve();
+        } else {
+          streamController.cancelCall.reject(wrapReason(data.reason));
+        }
+        this.#deleteStreamController(streamController, streamId);
+        break;
+      case StreamKind.CANCEL:
+        if (!streamSink) {
+          break;
+        }
+        const dataReason = wrapReason(data.reason);
+        Promise.try(streamSink.onCancel || onFn, dataReason).then(function () {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.CANCEL_COMPLETE,
+            streamId,
+            success: true
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.CANCEL_COMPLETE,
+            streamId,
+            reason: wrapReason(reason)
+          });
+        });
+        streamSink.sinkCapability.reject(dataReason);
+        streamSink.isCancelled = true;
+        delete this.streamSinks[streamId];
+        break;
+      default:
+        throw new Error("Unexpected stream case");
+    }
+  }
+  async #deleteStreamController(streamController, streamId) {
+    await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]);
+    delete this.streamControllers[streamId];
+  }
+  destroy() {
+    this.#messageAC?.abort();
+    this.#messageAC = null;
+  }
+}
+
+;// ./src/display/binary_data_factory.js
+
+
+class BaseBinaryDataFactory {
+  #errorStr = Object.freeze({
+    cMapUrl: "CMap",
+    standardFontDataUrl: "font",
+    wasmUrl: "wasm"
+  });
+  constructor({
+    cMapUrl = null,
+    standardFontDataUrl = null,
+    wasmUrl = null
+  }) {
+    this.cMapUrl = cMapUrl;
+    this.standardFontDataUrl = standardFontDataUrl;
+    this.wasmUrl = wasmUrl;
+  }
+  async fetch({
+    kind,
+    filename
+  }) {
+    switch (kind) {
+      case "cMapUrl":
+      case "standardFontDataUrl":
+      case "wasmUrl":
+        break;
+      default:
+        unreachable(`Not implemented: ${kind}`);
+    }
+    const baseUrl = this[kind];
+    if (!baseUrl) {
+      throw new Error(`Ensure that the \`${kind}\` API parameter is provided.`);
+    }
+    const url = `${baseUrl}${filename}`;
+    return this._fetch(url, kind).catch(reason => {
+      throw new Error(`Unable to load ${this.#errorStr[kind]} data at: ${url}`);
+    });
+  }
+  async _fetch(url, kind) {
+    unreachable("Abstract method `_fetch` called.");
+  }
+}
+class DOMBinaryDataFactory extends BaseBinaryDataFactory {
+  async _fetch(url, kind) {
+    const type = kind === "cMapUrl" && !url.endsWith(".bcmap") ? "text" : "bytes";
+    const data = await fetchData(url, type);
+    return data instanceof Uint8Array ? data : stringToBytes(data);
+  }
+}
+
+;// ./src/display/canvas_factory.js
+
+class BaseCanvasFactory {
+  #enableHWA = false;
+  constructor({
+    enableHWA = false
+  }) {
+    this.#enableHWA = enableHWA;
+  }
+  create(width, height) {
+    if (width <= 0 || height <= 0) {
+      throw new Error("Invalid canvas size");
+    }
+    const canvas = this._createCanvas(width, height);
+    return {
+      canvas,
+      context: canvas.getContext("2d", {
+        willReadFrequently: !this.#enableHWA
+      })
+    };
+  }
+  reset({
+    canvas
+  }, width, height) {
+    if (!canvas) {
+      throw new Error("Canvas is not specified");
+    }
+    if (width <= 0 || height <= 0) {
+      throw new Error("Invalid canvas size");
+    }
+    canvas.width = width;
+    canvas.height = height;
+  }
+  destroy(canvasAndContext) {
+    const {
+      canvas
+    } = canvasAndContext;
+    if (!canvas) {
+      throw new Error("Canvas is not specified");
+    }
+    canvas.width = canvas.height = 0;
+    canvasAndContext.canvas = null;
+    canvasAndContext.context = null;
+  }
+  _createCanvas(width, height) {
+    unreachable("Abstract method `_createCanvas` called.");
+  }
+}
+class DOMCanvasFactory extends BaseCanvasFactory {
+  constructor({
+    ownerDocument = globalThis.document,
+    enableHWA = false
+  }) {
+    super({
+      enableHWA
+    });
+    this._document = ownerDocument;
+  }
+  _createCanvas(width, height) {
+    const canvas = this._document.createElement("canvas");
+    canvas.width = width;
+    canvas.height = height;
+    return canvas;
+  }
+}
+
+;// ./src/display/filter_factory.js
+
+
+class BaseFilterFactory {
+  addFilter(maps) {
+    return "none";
+  }
+  addHCMFilter(fgColor, bgColor) {
+    return "none";
+  }
+  addAlphaFilter(map) {
+    return "none";
+  }
+  addLuminosityFilter(map) {
+    return "none";
+  }
+  addKnockoutFilter(alpha = 0) {
+    return "none";
+  }
+  addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {
+    return "none";
+  }
+  addSelectionHCMFilter(fgColor, bgColor) {
+    return "none";
+  }
+  addSelectionFilter() {
+    return "none";
+  }
+  createSelectionStyle(pageColors = null) {
+    return null;
+  }
+  destroy(keepHCM = false) {}
+}
+class DOMFilterFactory extends BaseFilterFactory {
+  #baseUrl;
+  #_cache;
+  #_defs;
+  #docId;
+  #document;
+  #_hcmCache;
+  #id = 0;
+  constructor({
+    docId,
+    ownerDocument = globalThis.document
+  }) {
+    super();
+    this.#docId = docId;
+    this.#document = ownerDocument;
+  }
+  get #cache() {
+    return this.#_cache ||= new Map();
+  }
+  get #hcmCache() {
+    return this.#_hcmCache ||= new Map();
+  }
+  get #defs() {
+    if (!this.#_defs) {
+      const div = this.#document.createElement("div");
+      const {
+        style
+      } = div;
+      style.colorScheme = "only light";
+      style.visibility = "hidden";
+      style.contain = "strict";
+      style.width = style.height = 0;
+      style.position = "absolute";
+      style.top = style.left = 0;
+      style.zIndex = -1;
+      const svg = this.#document.createElementNS(SVG_NS, "svg");
+      svg.setAttribute("width", 0);
+      svg.setAttribute("height", 0);
+      this.#_defs = this.#document.createElementNS(SVG_NS, "defs");
+      div.append(svg);
+      svg.append(this.#_defs);
+      this.#document.body.append(div);
+    }
+    return this.#_defs;
+  }
+  #createTables(maps) {
+    if (maps.length === 1) {
+      const mapR = maps[0];
+      const buffer = new Array(256);
+      for (let i = 0; i < 256; i++) {
+        buffer[i] = mapR[i] / 255;
+      }
+      const table = buffer.join(",");
+      return [table, table, table];
+    }
+    const [mapR, mapG, mapB] = maps;
+    const bufferR = new Array(256);
+    const bufferG = new Array(256);
+    const bufferB = new Array(256);
+    for (let i = 0; i < 256; i++) {
+      bufferR[i] = mapR[i] / 255;
+      bufferG[i] = mapG[i] / 255;
+      bufferB[i] = mapB[i] / 255;
+    }
+    return [bufferR.join(","), bufferG.join(","), bufferB.join(",")];
+  }
+  #createUrl(id) {
+    if (this.#baseUrl === undefined) {
+      this.#baseUrl = "";
+      const url = this.#document.URL;
+      if (url !== this.#document.baseURI) {
+        if (isDataScheme(url)) {
+          warn('#createUrl: ignore "data:"-URL for performance reasons.');
+        } else {
+          this.#baseUrl = updateUrlHash(url, "");
+        }
+      }
+    }
+    return `url(${this.#baseUrl}#${id})`;
+  }
+  addFilter(maps) {
+    if (!maps) {
+      return "none";
+    }
+    let value = this.#cache.get(maps);
+    if (value) {
+      return value;
+    }
+    const [tableR, tableG, tableB] = this.#createTables(maps);
+    const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`;
+    value = this.#cache.get(key);
+    if (value) {
+      this.#cache.set(maps, value);
+      return value;
+    }
+    const id = `g_${this.#docId}_transfer_map_${this.#id++}`;
+    const url = this.#createUrl(id);
+    this.#cache.set(maps, url);
+    this.#cache.set(key, url);
+    const filter = this.#createFilter(id);
+    this.#addTransferMapConversion(tableR, tableG, tableB, filter);
+    return url;
+  }
+  addHCMFilter(fgColor, bgColor) {
+    const key = `${fgColor}-${bgColor}`;
+    const filterName = "base";
+    let info = this.#hcmCache.get(filterName);
+    if (info?.key === key) {
+      return info.url;
+    }
+    if (info) {
+      info.filter?.remove();
+      info.key = key;
+      info.url = "none";
+      info.filter = null;
+    } else {
+      info = {
+        key,
+        url: "none",
+        filter: null
+      };
+      this.#hcmCache.set(filterName, info);
+    }
+    if (!fgColor || !bgColor) {
+      return info.url;
+    }
+    const fgRGB = this.#getRGB(fgColor);
+    fgColor = Util.makeHexColor(...fgRGB);
+    const bgRGB = this.#getRGB(bgColor);
+    bgColor = Util.makeHexColor(...bgRGB);
+    this.#defs.style.color = "";
+    if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) {
+      return info.url;
+    }
+    const map = new Array(256);
+    for (let i = 0; i <= 255; i++) {
+      const x = i / 255;
+      map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;
+    }
+    const table = map.join(",");
+    const id = `g_${this.#docId}_hcm_filter`;
+    const filter = info.filter = this.#createFilter(id);
+    this.#addTransferMapConversion(table, table, table, filter);
+    this.#addGrayConversion(filter);
+    const getSteps = (c, n) => {
+      const start = fgRGB[c] / 255;
+      const end = bgRGB[c] / 255;
+      const arr = new Array(n + 1);
+      for (let i = 0; i <= n; i++) {
+        arr[i] = start + i / n * (end - start);
+      }
+      return arr.join(",");
+    };
+    this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter);
+    info.url = this.#createUrl(id);
+    return info.url;
+  }
+  addSelectionHCMFilter(fgColor, bgColor) {
+    return this.addHighlightHCMFilter("selection", fgColor, bgColor, "HighlightText", "Highlight");
+  }
+  addSelectionFilter() {
+    return this.addHighlightHCMFilter("selection_default", "black", "white", "HighlightText", "Highlight");
+  }
+  createSelectionStyle(pageColors = null) {
+    const filter = pageColors ? this.addSelectionHCMFilter(pageColors.foreground, pageColors.background) : this.addSelectionFilter();
+    if (filter === "none" || !FeatureTest.platform.isFirefox) {
+      return null;
+    }
+    return {
+      "backdrop-filter": filter,
+      "background-color": "transparent"
+    };
+  }
+  addAlphaFilter(map) {
+    let value = this.#cache.get(map);
+    if (value) {
+      return value;
+    }
+    const [tableA] = this.#createTables([map]);
+    const key = `alpha_${tableA}`;
+    value = this.#cache.get(key);
+    if (value) {
+      this.#cache.set(map, value);
+      return value;
+    }
+    const id = `g_${this.#docId}_alpha_map_${this.#id++}`;
+    const url = this.#createUrl(id);
+    this.#cache.set(map, url);
+    this.#cache.set(key, url);
+    const filter = this.#createFilter(id);
+    this.#addTransferMapAlphaConversion(tableA, filter);
+    return url;
+  }
+  addLuminosityFilter(map) {
+    let value = this.#cache.get(map || "luminosity");
+    if (value) {
+      return value;
+    }
+    let tableA, key;
+    if (map) {
+      [tableA] = this.#createTables([map]);
+      key = `luminosity_${tableA}`;
+    } else {
+      key = "luminosity";
+    }
+    value = this.#cache.get(key);
+    if (value) {
+      this.#cache.set(map, value);
+      return value;
+    }
+    const id = `g_${this.#docId}_luminosity_map_${this.#id++}`;
+    const url = this.#createUrl(id);
+    this.#cache.set(map, url);
+    this.#cache.set(key, url);
+    const filter = this.#createFilter(id);
+    this.#addLuminosityConversion(filter);
+    if (map) {
+      this.#addTransferMapAlphaConversion(tableA, filter);
+    }
+    return url;
+  }
+  addKnockoutFilter(alpha = 0) {
+    const slope = alpha > 0 ? Math.min(1 / alpha, 1e6) : 1e6;
+    const key = `knockout_${slope}`;
+    const value = this.#cache.get(key);
+    if (value) {
+      return value;
+    }
+    const id = `g_${this.#docId}_knockout_filter_${this.#id++}`;
+    const url = this.#createUrl(id);
+    this.#cache.set(key, url);
+    const filter = this.#createFilter(id);
+    const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer");
+    filter.append(feComponentTransfer);
+    const feFuncA = this.#document.createElementNS(SVG_NS, "feFuncA");
+    feFuncA.setAttribute("type", "linear");
+    feFuncA.setAttribute("slope", `${slope}`);
+    feFuncA.setAttribute("intercept", "0");
+    feComponentTransfer.append(feFuncA);
+    return url;
+  }
+  addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {
+    const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;
+    let info = this.#hcmCache.get(filterName);
+    if (info?.key === key) {
+      return info.url;
+    }
+    if (info) {
+      info.filter?.remove();
+      info.key = key;
+      info.url = "none";
+      info.filter = null;
+    } else {
+      info = {
+        key,
+        url: "none",
+        filter: null
+      };
+      this.#hcmCache.set(filterName, info);
+    }
+    if (!fgColor || !bgColor) {
+      return info.url;
+    }
+    const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));
+    let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]);
+    let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]);
+    let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getOpaqueTextColor.bind(this));
+    if (bgGray < fgGray) {
+      [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB];
+    }
+    this.#defs.style.color = "";
+    const getSteps = (fg, bg, n) => {
+      const arr = new Array(256);
+      const step = (bgGray - fgGray) / n;
+      const newStart = fg / 255;
+      const newStep = (bg - fg) / (255 * n);
+      let prev = 0;
+      for (let i = 0; i <= n; i++) {
+        const k = Math.round(fgGray + i * step);
+        const value = newStart + i * newStep;
+        for (let j = prev; j <= k; j++) {
+          arr[j] = value;
+        }
+        prev = k + 1;
+      }
+      for (let i = prev; i < 256; i++) {
+        arr[i] = arr[prev - 1];
+      }
+      return arr.join(",");
+    };
+    const id = `g_${this.#docId}_hcm_${filterName}_filter`;
+    const filter = info.filter = this.#createFilter(id);
+    this.#addGrayConversion(filter);
+    this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter);
+    info.url = this.#createUrl(id);
+    return info.url;
+  }
+  destroy(keepHCM = false) {
+    if (keepHCM && this.#_hcmCache?.size) {
+      return;
+    }
+    this.#_defs?.parentNode.parentNode.remove();
+    this.#_defs = null;
+    this.#_cache?.clear();
+    this.#_cache = null;
+    this.#_hcmCache?.clear();
+    this.#_hcmCache = null;
+    this.#id = 0;
+  }
+  #addLuminosityConversion(filter) {
+    const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix");
+    feColorMatrix.setAttribute("type", "matrix");
+    feColorMatrix.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");
+    filter.append(feColorMatrix);
+  }
+  #addGrayConversion(filter) {
+    const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix");
+    feColorMatrix.setAttribute("type", "matrix");
+    feColorMatrix.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");
+    filter.append(feColorMatrix);
+  }
+  #createFilter(id) {
+    const filter = this.#document.createElementNS(SVG_NS, "filter");
+    filter.setAttribute("color-interpolation-filters", "sRGB");
+    filter.setAttribute("id", id);
+    this.#defs.append(filter);
+    return filter;
+  }
+  #appendFeFunc(feComponentTransfer, func, table) {
+    const feFunc = this.#document.createElementNS(SVG_NS, func);
+    feFunc.setAttribute("type", "discrete");
+    feFunc.setAttribute("tableValues", table);
+    feComponentTransfer.append(feFunc);
+  }
+  #addTransferMapConversion(rTable, gTable, bTable, filter) {
+    const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer");
+    filter.append(feComponentTransfer);
+    this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable);
+    this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable);
+    this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable);
+  }
+  #addTransferMapAlphaConversion(aTable, filter) {
+    const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer");
+    filter.append(feComponentTransfer);
+    this.#appendFeFunc(feComponentTransfer, "feFuncA", aTable);
+  }
+  #getRGB(color) {
+    this.#defs.style.color = color;
+    return getRGB(getComputedStyle(this.#defs).getPropertyValue("color"));
+  }
+  #getRGBA(color) {
+    this.#defs.style.color = color;
+    return getRGBA(getComputedStyle(this.#defs).getPropertyValue("color"));
+  }
+  #getOpaqueTextColor(color) {
+    const [r, g, b, alpha] = this.#getRGBA(color);
+    if (alpha === 1) {
+      return [r, g, b];
+    }
+    const [canvasR, canvasG, canvasB] = this.#getRGB("Canvas");
+    return [blend(r, canvasR, alpha), blend(g, canvasG, alpha), blend(b, canvasB, alpha)];
+  }
+}
+function blend(fg, bg, alpha) {
+  return Math.round(alpha * fg + (1 - alpha) * bg);
+}
+
+;// ./src/display/node_utils.js
+
+
+
+
+if (isNodeJS) {
+  warn("Please use the `legacy` build in Node.js environments.");
+}
+async function node_utils_fetchData(url) {
+  const fs = process.getBuiltinModule("fs/promises");
+  const data = await fs.readFile(url);
+  return new Uint8Array(data);
+}
+class NodeFilterFactory extends BaseFilterFactory {}
+class NodeCanvasFactory extends BaseCanvasFactory {
+  _createCanvas(width, height) {
+    const require = process.getBuiltinModule("module").createRequire(import.meta.url);
+    const canvas = require("@napi-rs/canvas");
+    return canvas.createCanvas(width, height);
+  }
+}
+class NodeBinaryDataFactory extends BaseBinaryDataFactory {
+  async _fetch(url, kind) {
+    return node_utils_fetchData(url);
+  }
+}
+
+;// ./src/shared/image_utils.js
+/* unused harmony import specifier */ var image_utils_ImageKind;
+/* unused harmony import specifier */ var image_utils_FeatureTest;
+
+function convertToRGBA(params) {
+  switch (params.kind) {
+    case image_utils_ImageKind.GRAYSCALE_1BPP:
+      return convertBlackAndWhiteToRGBA(params);
+    case image_utils_ImageKind.RGB_24BPP:
+      return convertRGBToRGBA(params);
+  }
+  return null;
+}
+function convertBlackAndWhiteToRGBA({
+  src,
+  srcPos = 0,
+  dest,
+  width,
+  height,
+  nonBlackColor = 0xffffffff,
+  inverseDecode = false
+}) {
+  const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;
+  const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor];
+  const widthInSource = width >> 3;
+  const widthRemainder = width & 7;
+  const xorMask = zeroMapping ^ oneMapping;
+  const srcLength = src.length;
+  dest = new Uint32Array(dest.buffer);
+  let destPos = 0;
+  for (let i = 0; i < height; ++i) {
+    for (const max = srcPos + widthInSource; srcPos < max; ++srcPos, destPos += 8) {
+      const elem = src[srcPos];
+      dest[destPos] = zeroMapping ^ -(elem >> 7 & 1) & xorMask;
+      dest[destPos + 1] = zeroMapping ^ -(elem >> 6 & 1) & xorMask;
+      dest[destPos + 2] = zeroMapping ^ -(elem >> 5 & 1) & xorMask;
+      dest[destPos + 3] = zeroMapping ^ -(elem >> 4 & 1) & xorMask;
+      dest[destPos + 4] = zeroMapping ^ -(elem >> 3 & 1) & xorMask;
+      dest[destPos + 5] = zeroMapping ^ -(elem >> 2 & 1) & xorMask;
+      dest[destPos + 6] = zeroMapping ^ -(elem >> 1 & 1) & xorMask;
+      dest[destPos + 7] = zeroMapping ^ -(elem & 1) & xorMask;
+    }
+    if (widthRemainder === 0) {
+      continue;
+    }
+    const elem = srcPos < srcLength ? src[srcPos++] : 255;
+    for (let j = 0; j < widthRemainder; ++j, ++destPos) {
+      dest[destPos] = zeroMapping ^ -(elem >> 7 - j & 1) & xorMask;
+    }
+  }
+  return {
+    srcPos,
+    destPos
+  };
+}
+function convertRGBToRGBA({
+  src,
+  srcPos = 0,
+  dest,
+  destPos = 0,
+  width,
+  height
+}) {
+  let i = 0;
+  const len = width * height * 3;
+  const len32 = len >> 2;
+  const src32 = new Uint32Array(src.buffer, srcPos, len32);
+  const alphaMask = FeatureTest.isLittleEndian ? 0xff000000 : 0xff;
+  if (FeatureTest.isLittleEndian) {
+    for (; i < len32 - 2; i += 3, destPos += 4) {
+      const s1 = src32[i],
+        s2 = src32[i + 1],
+        s3 = src32[i + 2];
+      dest[destPos] = s1 | alphaMask;
+      dest[destPos + 1] = s1 >>> 24 | s2 << 8 | alphaMask;
+      dest[destPos + 2] = s2 >>> 16 | s3 << 16 | alphaMask;
+      dest[destPos + 3] = s3 >>> 8 | alphaMask;
+    }
+    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {
+      dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | alphaMask;
+    }
+  } else {
+    for (; i < len32 - 2; i += 3, destPos += 4) {
+      const s1 = src32[i],
+        s2 = src32[i + 1],
+        s3 = src32[i + 2];
+      dest[destPos] = s1 | alphaMask;
+      dest[destPos + 1] = s1 << 24 | s2 >>> 8 | alphaMask;
+      dest[destPos + 2] = s2 << 16 | s3 >>> 16 | alphaMask;
+      dest[destPos + 3] = s3 << 8 | alphaMask;
+    }
+    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {
+      dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | alphaMask;
+    }
+  }
+  return {
+    srcPos: srcPos + len,
+    destPos
+  };
+}
+function grayToRGBA(src, dest) {
+  if (image_utils_FeatureTest.isLittleEndian) {
+    for (let i = 0, ii = src.length; i < ii; i++) {
+      dest[i] = src[i] * 0x10101 | 0xff000000;
+    }
+  } else {
+    for (let i = 0, ii = src.length; i < ii; i++) {
+      dest[i] = src[i] * 0x1010100 | 0x000000ff;
+    }
+  }
+}
+
+;// ./src/display/webgpu.js
+const MESH_WGSL = `
+struct Uniforms {
+  offsetX      : f32,
+  offsetY      : f32,
+  scaleX       : f32,
+  scaleY       : f32,
+  paddedWidth  : f32,
+  paddedHeight : f32,
+  borderSize   : f32,
+  _pad         : f32,
+};
+
+@group(0) @binding(0) var<uniform> u : Uniforms;
+
+struct VertexInput {
+  @location(0) position : vec2<f32>,
+  @location(1) color    : vec4<f32>,
+};
+
+struct VertexOutput {
+  @builtin(position) position : vec4<f32>,
+  @location(0)       color    : vec3<f32>,
+};
+
+@vertex
+fn vs_main(in : VertexInput) -> VertexOutput {
+  var out : VertexOutput;
+  let cx = (in.position.x + u.offsetX) * u.scaleX;
+  let cy = (in.position.y + u.offsetY) * u.scaleY;
+  out.position = vec4<f32>(
+    ((cx + u.borderSize) / u.paddedWidth) * 2.0 - 1.0,
+    1.0 - ((cy + u.borderSize) / u.paddedHeight) * 2.0,
+    0.0,
+    1.0
+  );
+  out.color = in.color.rgb;
+  return out;
+}
+
+@fragment
+fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
+  return vec4<f32>(in.color, 1.0);
+}
+`;
+class WebGPU {
+  #initPromise = null;
+  #device = null;
+  #meshPipeline = null;
+  #preferredFormat = null;
+  async #initGPU() {
+    if (!globalThis.navigator?.gpu) {
+      return false;
+    }
+    try {
+      const adapter = await navigator.gpu.requestAdapter();
+      if (!adapter) {
+        return false;
+      }
+      this.#preferredFormat = navigator.gpu.getPreferredCanvasFormat();
+      this.#device = await adapter.requestDevice();
+      return true;
+    } catch {
+      return false;
+    }
+  }
+  init() {
+    return this.#initPromise ||= this.#initGPU();
+  }
+  get isReady() {
+    return this.#device !== null;
+  }
+  loadMeshShader() {
+    if (!this.#device || this.#meshPipeline) {
+      return;
+    }
+    const shaderModule = this.#device.createShaderModule({
+      code: MESH_WGSL
+    });
+    this.#meshPipeline = this.#device.createRenderPipeline({
+      layout: "auto",
+      vertex: {
+        module: shaderModule,
+        entryPoint: "vs_main",
+        buffers: [{
+          arrayStride: 2 * 4,
+          attributes: [{
+            shaderLocation: 0,
+            offset: 0,
+            format: "float32x2"
+          }]
+        }, {
+          arrayStride: 4,
+          attributes: [{
+            shaderLocation: 1,
+            offset: 0,
+            format: "unorm8x4"
+          }]
+        }]
+      },
+      fragment: {
+        module: shaderModule,
+        entryPoint: "fs_main",
+        targets: [{
+          format: this.#preferredFormat
+        }]
+      },
+      primitive: {
+        topology: "triangle-list"
+      }
+    });
+  }
+  draw(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize) {
+    this.loadMeshShader();
+    const device = this.#device;
+    const {
+      offsetX,
+      offsetY,
+      scaleX,
+      scaleY
+    } = context;
+    const posBuffer = device.createBuffer({
+      size: Math.max(posData.byteLength, 4),
+      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST
+    });
+    if (posData.byteLength > 0) {
+      device.queue.writeBuffer(posBuffer, 0, posData);
+    }
+    const colBuffer = device.createBuffer({
+      size: Math.max(colData.byteLength, 4),
+      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST
+    });
+    if (colData.byteLength > 0) {
+      device.queue.writeBuffer(colBuffer, 0, colData);
+    }
+    const uniformBuffer = device.createBuffer({
+      size: 8 * 4,
+      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
+    });
+    device.queue.writeBuffer(uniformBuffer, 0, new Float32Array([offsetX, offsetY, scaleX, scaleY, paddedWidth, paddedHeight, borderSize, 0]));
+    const bindGroup = device.createBindGroup({
+      layout: this.#meshPipeline.getBindGroupLayout(0),
+      entries: [{
+        binding: 0,
+        resource: {
+          buffer: uniformBuffer
+        }
+      }]
+    });
+    const offscreen = new OffscreenCanvas(paddedWidth, paddedHeight);
+    const gpuCtx = offscreen.getContext("webgpu");
+    gpuCtx.configure({
+      device,
+      format: this.#preferredFormat,
+      alphaMode: backgroundColor ? "opaque" : "premultiplied"
+    });
+    const clearValue = backgroundColor ? {
+      r: backgroundColor[0] / 255,
+      g: backgroundColor[1] / 255,
+      b: backgroundColor[2] / 255,
+      a: 1
+    } : {
+      r: 0,
+      g: 0,
+      b: 0,
+      a: 0
+    };
+    const commandEncoder = device.createCommandEncoder();
+    const renderPass = commandEncoder.beginRenderPass({
+      colorAttachments: [{
+        view: gpuCtx.getCurrentTexture().createView(),
+        clearValue,
+        loadOp: "clear",
+        storeOp: "store"
+      }]
+    });
+    if (vertexCount > 0) {
+      renderPass.setPipeline(this.#meshPipeline);
+      renderPass.setBindGroup(0, bindGroup);
+      renderPass.setVertexBuffer(0, posBuffer);
+      renderPass.setVertexBuffer(1, colBuffer);
+      renderPass.draw(vertexCount);
+    }
+    renderPass.end();
+    device.queue.submit([commandEncoder.finish()]);
+    posBuffer.destroy();
+    colBuffer.destroy();
+    uniformBuffer.destroy();
+    return offscreen.transferToImageBitmap();
+  }
+}
+const _webGPU = new WebGPU();
+function initGPU() {
+  return _webGPU.init();
+}
+function isGPUReady() {
+  return _webGPU.isReady;
+}
+function loadMeshShader() {
+  _webGPU.loadMeshShader();
+}
+function drawMeshWithGPU(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize) {
+  return _webGPU.draw(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize);
+}
+
+;// ./src/display/pattern_helper.js
+
+
+
+
+const PathType = {
+  FILL: "Fill",
+  STROKE: "Stroke",
+  SHADING: "Shading"
+};
+function applyBoundingBox(ctx, bbox) {
+  if (!bbox) {
+    return;
+  }
+  const width = bbox[2] - bbox[0];
+  const height = bbox[3] - bbox[1];
+  const region = new Path2D();
+  region.rect(bbox[0], bbox[1], width, height);
+  ctx.clip(region);
+}
+class BaseShadingPattern {
+  isModifyingCurrentTransform() {
+    return false;
+  }
+  getPattern() {
+    unreachable("Abstract method `getPattern` called.");
+  }
+}
+class RadialAxialShadingPattern extends BaseShadingPattern {
+  constructor(IR) {
+    super();
+    this._type = IR[1];
+    this._bbox = IR[2];
+    this._colorStops = IR[3];
+    this._p0 = IR[4];
+    this._p1 = IR[5];
+    this._r0 = IR[6];
+    this._r1 = IR[7];
+    this.matrix = null;
+  }
+  isOriginBased() {
+    return this._p0[0] === 0 && this._p0[1] === 0 && (!this.isRadial() || this._p1[0] === 0 && this._p1[1] === 0);
+  }
+  isRadial() {
+    return this._type === "radial";
+  }
+  areConic() {
+    if (!this.isRadial()) {
+      return false;
+    }
+    const dist = Math.hypot(this._p0[0] - this._p1[0], this._p0[1] - this._p1[1]);
+    return dist + this._r1 > this._r0 && dist + this._r0 > this._r1;
+  }
+  _createGradient(ctx, transform = null) {
+    let grad;
+    let firstPoint = this._p0;
+    let secondPoint = this._p1;
+    if (transform) {
+      firstPoint = firstPoint.slice();
+      secondPoint = secondPoint.slice();
+      Util.applyTransform(firstPoint, transform);
+      Util.applyTransform(secondPoint, transform);
+    }
+    if (this._type === "axial") {
+      grad = ctx.createLinearGradient(firstPoint[0], firstPoint[1], secondPoint[0], secondPoint[1]);
+    } else if (this._type === "radial") {
+      let r0 = this._r0;
+      let r1 = this._r1;
+      if (transform) {
+        const scale = new Float32Array(2);
+        Util.singularValueDecompose2dScale(transform, scale);
+        r0 *= scale[0];
+        r1 *= scale[0];
+      }
+      grad = ctx.createRadialGradient(firstPoint[0], firstPoint[1], r0, secondPoint[0], secondPoint[1], r1);
+    }
+    for (const colorStop of this._colorStops) {
+      grad.addColorStop(colorStop[0], colorStop[1]);
+    }
+    return grad;
+  }
+  _createReversedGradient(ctx, transform = null) {
+    let firstPoint = this._p1;
+    let secondPoint = this._p0;
+    if (transform) {
+      firstPoint = firstPoint.slice();
+      secondPoint = secondPoint.slice();
+      Util.applyTransform(firstPoint, transform);
+      Util.applyTransform(secondPoint, transform);
+    }
+    let r0 = this._r1;
+    let r1 = this._r0;
+    if (transform) {
+      const scale = new Float32Array(2);
+      Util.singularValueDecompose2dScale(transform, scale);
+      r0 *= scale[0];
+      r1 *= scale[0];
+    }
+    const grad = ctx.createRadialGradient(firstPoint[0], firstPoint[1], r0, secondPoint[0], secondPoint[1], r1);
+    const reversedStops = this._colorStops.map(([t, c]) => [1 - t, c]).reverse();
+    for (const [t, c] of reversedStops) {
+      grad.addColorStop(t, c);
+    }
+    return grad;
+  }
+  getPattern(ctx, owner, inverse, pathType) {
+    let pattern;
+    if (pathType === PathType.STROKE || pathType === PathType.FILL) {
+      if (this.isOriginBased()) {
+        let transf = Util.transform(inverse, owner.baseTransform);
+        if (this.matrix) {
+          transf = Util.transform(transf, this.matrix);
+        }
+        const precision = 1e-3;
+        const n1 = Math.hypot(transf[0], transf[1]);
+        const n2 = Math.hypot(transf[2], transf[3]);
+        const ps = (transf[0] * transf[2] + transf[1] * transf[3]) / (n1 * n2);
+        if (Math.abs(ps) < precision) {
+          if (this.isRadial()) {
+            if (Math.abs(n1 - n2) < precision) {
+              return this._createGradient(ctx, transf);
+            }
+          } else {
+            return this._createGradient(ctx, transf);
+          }
+        }
+      }
+      const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0];
+      const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;
+      const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;
+      const tmpCanvas = owner.canvasFactory.create(width, height);
+      const tmpCtx = tmpCanvas.context;
+      tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);
+      tmpCtx.beginPath();
+      tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);
+      tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);
+      inverse = Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]);
+      tmpCtx.transform(...owner.baseTransform);
+      if (this.matrix) {
+        tmpCtx.transform(...this.matrix);
+      }
+      applyBoundingBox(tmpCtx, this._bbox);
+      if (this.areConic()) {
+        tmpCtx.fillStyle = this._createReversedGradient(tmpCtx);
+        tmpCtx.fill();
+      }
+      tmpCtx.fillStyle = this._createGradient(tmpCtx);
+      tmpCtx.fill();
+      pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat");
+      owner.canvasFactory.destroy(tmpCanvas);
+      const domMatrix = new DOMMatrix(inverse);
+      pattern.setTransform(domMatrix);
+    } else {
+      if (this.areConic()) {
+        ctx.save();
+        applyBoundingBox(ctx, this._bbox);
+        ctx.fillStyle = this._createReversedGradient(ctx);
+        ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+        ctx.restore();
+      }
+      applyBoundingBox(ctx, this._bbox);
+      pattern = this._createGradient(ctx);
+    }
+    return pattern;
+  }
+}
+function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
+  const coords = context.coords,
+    colors = context.colors;
+  const bytes = data.data,
+    rowSize = data.width * 4;
+  let tmp;
+  if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) {
+    tmp = p1;
+    p1 = p2;
+    p2 = tmp;
+    tmp = c1;
+    c1 = c2;
+    c2 = tmp;
+  }
+  if (coords[p2 * 2 + 1] > coords[p3 * 2 + 1]) {
+    tmp = p2;
+    p2 = p3;
+    p3 = tmp;
+    tmp = c2;
+    c2 = c3;
+    c3 = tmp;
+  }
+  if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) {
+    tmp = p1;
+    p1 = p2;
+    p2 = tmp;
+    tmp = c1;
+    c1 = c2;
+    c2 = tmp;
+  }
+  const x1 = (coords[p1 * 2] + context.offsetX) * context.scaleX;
+  const y1 = (coords[p1 * 2 + 1] + context.offsetY) * context.scaleY;
+  const x2 = (coords[p2 * 2] + context.offsetX) * context.scaleX;
+  const y2 = (coords[p2 * 2 + 1] + context.offsetY) * context.scaleY;
+  const x3 = (coords[p3 * 2] + context.offsetX) * context.scaleX;
+  const y3 = (coords[p3 * 2 + 1] + context.offsetY) * context.scaleY;
+  if (y1 >= y3) {
+    return;
+  }
+  const c1r = colors[c1 * 4],
+    c1g = colors[c1 * 4 + 1],
+    c1b = colors[c1 * 4 + 2];
+  const c2r = colors[c2 * 4],
+    c2g = colors[c2 * 4 + 1],
+    c2b = colors[c2 * 4 + 2];
+  const c3r = colors[c3 * 4],
+    c3g = colors[c3 * 4 + 1],
+    c3b = colors[c3 * 4 + 2];
+  const minY = Math.round(y1),
+    maxY = Math.round(y3);
+  let xa, car, cag, cab;
+  let xb, cbr, cbg, cbb;
+  for (let y = minY; y <= maxY; y++) {
+    if (y < y2) {
+      const k = y < y1 ? 0 : (y1 - y) / (y1 - y2);
+      xa = x1 - (x1 - x2) * k;
+      car = c1r - (c1r - c2r) * k;
+      cag = c1g - (c1g - c2g) * k;
+      cab = c1b - (c1b - c2b) * k;
+    } else {
+      let k;
+      if (y > y3) {
+        k = 1;
+      } else if (y2 === y3) {
+        k = 0;
+      } else {
+        k = (y2 - y) / (y2 - y3);
+      }
+      xa = x2 - (x2 - x3) * k;
+      car = c2r - (c2r - c3r) * k;
+      cag = c2g - (c2g - c3g) * k;
+      cab = c2b - (c2b - c3b) * k;
+    }
+    let k;
+    if (y < y1) {
+      k = 0;
+    } else if (y > y3) {
+      k = 1;
+    } else {
+      k = (y1 - y) / (y1 - y3);
+    }
+    xb = x1 - (x1 - x3) * k;
+    cbr = c1r - (c1r - c3r) * k;
+    cbg = c1g - (c1g - c3g) * k;
+    cbb = c1b - (c1b - c3b) * k;
+    const x1_ = Math.round(Math.min(xa, xb));
+    const x2_ = Math.round(Math.max(xa, xb));
+    let j = rowSize * y + x1_ * 4;
+    for (let x = x1_; x <= x2_; x++) {
+      k = (xa - x) / (xa - xb);
+      if (k < 0) {
+        k = 0;
+      } else if (k > 1) {
+        k = 1;
+      }
+      bytes[j++] = car - (car - cbr) * k | 0;
+      bytes[j++] = cag - (cag - cbg) * k | 0;
+      bytes[j++] = cab - (cab - cbb) * k | 0;
+      bytes[j++] = 255;
+    }
+  }
+}
+class MeshShadingPattern extends BaseShadingPattern {
+  constructor(IR) {
+    super();
+    this._posData = IR[2];
+    this._colData = IR[3];
+    this._vertexCount = IR[4];
+    this._bounds = IR[5];
+    this._bbox = IR[6];
+    this._background = IR[7];
+    this.matrix = null;
+    loadMeshShader();
+  }
+  _createMeshCanvas(combinedScale, backgroundColor, canvasFactory) {
+    const EXPECTED_SCALE = 1.1;
+    const MAX_PATTERN_SIZE = 3000;
+    const BORDER_SIZE = 2;
+    const offsetX = Math.floor(this._bounds[0]);
+    const offsetY = Math.floor(this._bounds[1]);
+    const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;
+    const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;
+    const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE) || 1;
+    const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE) || 1;
+    const scaleX = boundsWidth ? boundsWidth / width : 1;
+    const scaleY = boundsHeight ? boundsHeight / height : 1;
+    const context = {
+      coords: this._posData,
+      colors: this._colData,
+      offsetX: -offsetX,
+      offsetY: -offsetY,
+      scaleX: 1 / scaleX,
+      scaleY: 1 / scaleY
+    };
+    const paddedWidth = width + BORDER_SIZE * 2;
+    const paddedHeight = height + BORDER_SIZE * 2;
+    const tmpCanvas = canvasFactory.create(paddedWidth, paddedHeight);
+    if (isGPUReady() && this._vertexCount > 48) {
+      tmpCanvas.context.drawImage(drawMeshWithGPU(this._posData, this._colData, this._vertexCount, context, backgroundColor, paddedWidth, paddedHeight, BORDER_SIZE), 0, 0);
+    } else {
+      const data = tmpCanvas.context.createImageData(width, height);
+      if (backgroundColor) {
+        const bytes = data.data;
+        for (let i = 0, ii = bytes.length; i < ii; i += 4) {
+          bytes[i] = backgroundColor[0];
+          bytes[i + 1] = backgroundColor[1];
+          bytes[i + 2] = backgroundColor[2];
+          bytes[i + 3] = 255;
+        }
+      }
+      for (let i = 0, ii = this._vertexCount; i < ii; i += 3) {
+        drawTriangle(data, context, i, i + 1, i + 2, i, i + 1, i + 2);
+      }
+      tmpCanvas.context.putImageData(data, BORDER_SIZE, BORDER_SIZE);
+    }
+    return {
+      canvas: tmpCanvas.canvas,
+      offsetX: offsetX - BORDER_SIZE * scaleX,
+      offsetY: offsetY - BORDER_SIZE * scaleY,
+      scaleX,
+      scaleY
+    };
+  }
+  isModifyingCurrentTransform() {
+    return true;
+  }
+  getPattern(ctx, owner, inverse, pathType) {
+    applyBoundingBox(ctx, this._bbox);
+    const scale = new Float32Array(2);
+    if (pathType === PathType.SHADING) {
+      Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale);
+    } else if (this.matrix) {
+      Util.singularValueDecompose2dScale(this.matrix, scale);
+      const [matrixScaleX, matrixScaleY] = scale;
+      Util.singularValueDecompose2dScale(owner.baseTransform, scale);
+      scale[0] *= matrixScaleX;
+      scale[1] *= matrixScaleY;
+    } else {
+      Util.singularValueDecompose2dScale(owner.baseTransform, scale);
+    }
+    const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.canvasFactory);
+    if (pathType !== PathType.SHADING) {
+      ctx.setTransform(...owner.baseTransform);
+      if (this.matrix) {
+        ctx.transform(...this.matrix);
+      }
+    }
+    ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);
+    ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);
+    const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat");
+    owner.canvasFactory.destroy(temporaryPatternCanvas);
+    return pattern;
+  }
+}
+class DummyShadingPattern extends BaseShadingPattern {
+  getPattern() {
+    return "hotpink";
+  }
+}
+function getShadingPattern(IR) {
+  switch (IR[0]) {
+    case "RadialAxial":
+      return new RadialAxialShadingPattern(IR);
+    case "Mesh":
+      return new MeshShadingPattern(IR);
+    case "Dummy":
+      return new DummyShadingPattern();
+  }
+  throw new Error(`Unknown IR type: ${IR[0]}`);
+}
+const PaintType = {
+  COLORED: 1,
+  UNCOLORED: 2
+};
+class TilingPattern {
+  static MAX_PATTERN_SIZE = 3000;
+  constructor(IR, ctx, canvasGraphicsFactory, baseTransform) {
+    this.color = IR[1];
+    this.operatorList = IR[2];
+    this.matrix = IR[3];
+    this.bbox = IR[4];
+    this.xstep = IR[5];
+    this.ystep = IR[6];
+    this.paintType = IR[7];
+    this.tilingType = IR[8];
+    this.needsIsolation = IR[9] ?? true;
+    this.ctx = ctx;
+    this.canvasGraphicsFactory = canvasGraphicsFactory;
+    this.baseTransform = baseTransform;
+    this.patternBaseMatrix = this.matrix ? Util.transform(baseTransform, this.matrix) : baseTransform;
+  }
+  canSkipPatternCanvas([width, height, offsetX, offsetY]) {
+    const [x0, y0, x1, y1] = this.bbox;
+    const absXStep = Math.abs(this.xstep);
+    const absYStep = Math.abs(this.ystep);
+    if (width > absXStep + 1e-6 || height > absYStep + 1e-6) {
+      return null;
+    }
+    const nXFirst = Math.floor((offsetX - x1) / absXStep) + 1;
+    const nXLast = Math.ceil((offsetX + width - x0) / absXStep) - 1;
+    const nYFirst = Math.floor((offsetY - y1) / absYStep) + 1;
+    const nYLast = Math.ceil((offsetY + height - y0) / absYStep) - 1;
+    return nXLast <= nXFirst && nYLast <= nYFirst ? [nXFirst, nYFirst] : null;
+  }
+  updatePatternDims(clippedBBox, dims) {
+    const inv = Util.inverseTransform(this.patternBaseMatrix);
+    const c1 = [clippedBBox[0], clippedBBox[1]];
+    const c2 = [clippedBBox[2], clippedBBox[3]];
+    Util.applyTransform(c1, inv);
+    Util.applyTransform(c2, inv);
+    dims[0] = Math.abs(c2[0] - c1[0]);
+    dims[1] = Math.abs(c2[1] - c1[1]);
+    dims[2] = Math.min(c1[0], c2[0]);
+    dims[3] = Math.min(c1[1], c2[1]);
+  }
+  _renderTileCanvas(owner, opIdx, dimx, dimy) {
+    const [x0, y0, x1, y1] = this.bbox;
+    const tmpCanvas = owner.canvasFactory.create(dimx.size, dimy.size);
+    const tmpCtx = tmpCanvas.context;
+    const graphics = this.canvasGraphicsFactory.createCanvasGraphics(tmpCtx, opIdx);
+    graphics.groupLevel = owner.groupLevel;
+    this.setFillAndStrokeStyleToContext(graphics, this.paintType, this.color);
+    tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0);
+    graphics.transform(0, dimx.scale, 0, 0, dimy.scale, 0, 0);
+    tmpCtx.save();
+    graphics.dependencyTracker?.save();
+    this.clipBbox(graphics, x0, y0, x1, y1);
+    graphics.baseTransform = getCurrentTransform(graphics.ctx);
+    graphics.executeOperatorList(this.operatorList);
+    graphics.endDrawing();
+    graphics.dependencyTracker?.restore();
+    tmpCtx.restore();
+    return tmpCanvas;
+  }
+  _getCombinedScales() {
+    const scale = new Float32Array(2);
+    Util.singularValueDecompose2dScale(this.matrix, scale);
+    const [matrixScaleX, matrixScaleY] = scale;
+    Util.singularValueDecompose2dScale(this.baseTransform, scale);
+    return [matrixScaleX * scale[0], matrixScaleY * scale[1]];
+  }
+  drawPattern(owner, path, useEOFill = false, [n, m], opIdx) {
+    const [x0, y0, x1, y1] = this.bbox;
+    const dependencyTracker = owner.dependencyTracker;
+    if (dependencyTracker) {
+      owner.dependencyTracker = new CanvasNestedDependencyTracker(dependencyTracker, opIdx);
+    }
+    owner.save();
+    if (useEOFill) {
+      owner.ctx.clip(path, "evenodd");
+    } else {
+      owner.ctx.clip(path);
+    }
+    owner.ctx.setTransform(...this.patternBaseMatrix);
+    owner.ctx.translate(n * this.xstep, m * this.ystep);
+    if (this.needsIsolation || owner.ctx.globalAlpha !== 1 || owner.ctx.globalCompositeOperation !== "source-over" || owner.inSMaskMode) {
+      const bboxWidth = x1 - x0;
+      const bboxHeight = y1 - y0;
+      const [combinedScaleX, combinedScaleY] = this._getCombinedScales();
+      const dimx = this.getSizeAndScale(bboxWidth, this.ctx.canvas.width, combinedScaleX);
+      const dimy = this.getSizeAndScale(bboxHeight, this.ctx.canvas.height, combinedScaleY);
+      const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy);
+      owner.ctx.drawImage(tmpCanvas.canvas, x0, y0, bboxWidth, bboxHeight);
+      owner.canvasFactory.destroy(tmpCanvas);
+    } else {
+      this.setFillAndStrokeStyleToContext(owner, this.paintType, this.color);
+      this.clipBbox(owner, x0, y0, x1, y1);
+      owner.baseTransformStack.push(owner.baseTransform);
+      owner.baseTransform = getCurrentTransform(owner.ctx);
+      owner.executeOperatorList(this.operatorList);
+      owner.baseTransform = owner.baseTransformStack.pop();
+    }
+    owner.restore();
+    if (dependencyTracker) {
+      owner.dependencyTracker = dependencyTracker;
+    }
+  }
+  createPatternCanvas(owner, opIdx) {
+    const [x0, y0, x1, y1] = this.bbox;
+    const width = x1 - x0;
+    const height = y1 - y0;
+    let {
+      xstep,
+      ystep
+    } = this;
+    xstep = Math.abs(xstep);
+    ystep = Math.abs(ystep);
+    info("TilingType: " + this.tilingType);
+    const [combinedScaleX, combinedScaleY] = this._getCombinedScales();
+    let canvasWidth = width,
+      canvasHeight = height,
+      redrawHorizontally = false,
+      redrawVertically = false;
+    if (Math.ceil(xstep * combinedScaleX) >= Math.ceil(width * combinedScaleX)) {
+      canvasWidth = xstep;
+    } else {
+      redrawHorizontally = true;
+    }
+    if (Math.ceil(ystep * combinedScaleY) >= Math.ceil(height * combinedScaleY)) {
+      canvasHeight = ystep;
+    } else {
+      redrawVertically = true;
+    }
+    const dimx = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX);
+    const dimy = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY);
+    const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy);
+    if (redrawHorizontally || redrawVertically) {
+      const image = tmpCanvas.canvas;
+      if (redrawHorizontally) {
+        canvasWidth = xstep;
+      }
+      if (redrawVertically) {
+        canvasHeight = ystep;
+      }
+      const dimx2 = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX);
+      const dimy2 = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY);
+      const xSize = dimx2.size;
+      const ySize = dimy2.size;
+      const tmpCanvas2 = owner.canvasFactory.create(xSize, ySize);
+      const tmpCtx2 = tmpCanvas2.context;
+      const ii = redrawHorizontally ? Math.floor(width / xstep) : 0;
+      const jj = redrawVertically ? Math.floor(height / ystep) : 0;
+      for (let i = 0; i <= ii; i++) {
+        for (let j = 0; j <= jj; j++) {
+          tmpCtx2.drawImage(image, xSize * i, ySize * j, xSize, ySize, 0, 0, xSize, ySize);
+        }
+      }
+      owner.canvasFactory.destroy(tmpCanvas);
+      return {
+        canvas: tmpCanvas2.canvas,
+        canvasEntry: tmpCanvas2,
+        scaleX: dimx2.scale,
+        scaleY: dimy2.scale,
+        offsetX: x0,
+        offsetY: y0
+      };
+    }
+    return {
+      canvas: tmpCanvas.canvas,
+      canvasEntry: tmpCanvas,
+      scaleX: dimx.scale,
+      scaleY: dimy.scale,
+      offsetX: x0,
+      offsetY: y0
+    };
+  }
+  getSizeAndScale(step, realOutputSize, scale) {
+    const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);
+    let size = Math.ceil(step * scale);
+    if (size >= maxSize) {
+      size = maxSize;
+    } else {
+      scale = size / step;
+    }
+    return {
+      scale,
+      size
+    };
+  }
+  clipBbox(graphics, x0, y0, x1, y1) {
+    const bboxWidth = x1 - x0;
+    const bboxHeight = y1 - y0;
+    const clip = new Path2D();
+    clip.rect(x0, y0, bboxWidth, bboxHeight);
+    Util.axialAlignedBoundingBox([x0, y0, x1, y1], getCurrentTransform(graphics.ctx), graphics.current.minMax);
+    graphics.ctx.clip(clip);
+    graphics.current.updateClipFromPath();
+  }
+  setFillAndStrokeStyleToContext(graphics, paintType, color) {
+    const context = graphics.ctx,
+      current = graphics.current;
+    current.patternFill = current.patternStroke = false;
+    switch (paintType) {
+      case PaintType.COLORED:
+        const {
+          fillStyle,
+          strokeStyle
+        } = this.ctx;
+        context.fillStyle = current.fillColor = fillStyle;
+        context.strokeStyle = current.strokeColor = strokeStyle;
+        break;
+      case PaintType.UNCOLORED:
+        context.fillStyle = context.strokeStyle = color;
+        current.fillColor = current.strokeColor = color;
+        break;
+      default:
+        throw new FormatError(`Unsupported paint type: ${paintType}`);
+    }
+  }
+  isModifyingCurrentTransform() {
+    return false;
+  }
+  getPattern(ctx, owner, inverse, pathType, opIdx) {
+    const matrix = pathType !== PathType.SHADING ? Util.transform(inverse, this.patternBaseMatrix) : inverse;
+    const temporaryPatternCanvas = this.createPatternCanvas(owner, opIdx);
+    let domMatrix = new DOMMatrix(matrix);
+    domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);
+    domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY);
+    const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat");
+    owner.canvasFactory.destroy(temporaryPatternCanvas.canvasEntry);
+    pattern.setTransform(domMatrix);
+    return pattern;
+  }
+}
+
+;// ./src/display/canvas.js
+
+
+
+
+
+
+const MIN_FONT_SIZE = 16;
+const MAX_FONT_SIZE = 100;
+const EXECUTION_TIME = 15;
+const EXECUTION_STEPS = 10;
+const FULL_CHUNK_HEIGHT = 16;
+const SCALE_MATRIX = new DOMMatrix();
+const XY = new Float32Array(2);
+function mirrorContextOperations(ctx, destCtx) {
+  if (ctx._removeMirroring) {
+    throw new Error("Context is already forwarding operations.");
+  }
+  const originalMethods = new Map();
+  for (const name of ["save", "restore", "rotate", "scale", "translate", "transform", "setTransform", "resetTransform", "clip", "moveTo", "lineTo", "bezierCurveTo", "quadraticCurveTo", "arc", "arcTo", "ellipse", "rect", "roundRect", "closePath", "beginPath"]) {
+    const original = ctx[name];
+    if (typeof original !== "function" || typeof destCtx[name] !== "function") {
+      continue;
+    }
+    originalMethods.set(name, original);
+    ctx[name] = function (...args) {
+      destCtx[name](...args);
+      return original.apply(this, args);
+    };
+  }
+  ctx._removeMirroring = () => {
+    for (const [name, original] of originalMethods) {
+      ctx[name] = original;
+    }
+    delete ctx._removeMirroring;
+  };
+}
+function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) {
+  const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);
+  if (b === 0 && c === 0) {
+    const tlX = destX * a + tx;
+    const rTlX = Math.round(tlX);
+    const tlY = destY * d + ty;
+    const rTlY = Math.round(tlY);
+    const brX = (destX + destW) * a + tx;
+    const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;
+    const brY = (destY + destH) * d + ty;
+    const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;
+    ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);
+    ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);
+    ctx.setTransform(a, b, c, d, tx, ty);
+    return [rWidth, rHeight];
+  }
+  if (a === 0 && d === 0) {
+    const tlX = destY * c + tx;
+    const rTlX = Math.round(tlX);
+    const tlY = destX * b + ty;
+    const rTlY = Math.round(tlY);
+    const brX = (destY + destH) * c + tx;
+    const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;
+    const brY = (destX + destW) * b + ty;
+    const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;
+    ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);
+    ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);
+    ctx.setTransform(a, b, c, d, tx, ty);
+    return [rHeight, rWidth];
+  }
+  ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);
+  const scaleX = Math.hypot(a, b);
+  const scaleY = Math.hypot(c, d);
+  return [scaleX * destW, scaleY * destH];
+}
+class CanvasExtraState {
+  alphaIsShape = false;
+  fontSize = 0;
+  fontSizeScale = 1;
+  textMatrix = null;
+  textMatrixScale = 1;
+  fontMatrix = FONT_IDENTITY_MATRIX;
+  leading = 0;
+  x = 0;
+  y = 0;
+  lineX = 0;
+  lineY = 0;
+  charSpacing = 0;
+  wordSpacing = 0;
+  textHScale = 1;
+  textRenderingMode = TextRenderingMode.FILL;
+  textRise = 0;
+  fillColor = "#000000";
+  strokeColor = "#000000";
+  tilingPatternDims = null;
+  patternFill = false;
+  patternStroke = false;
+  fillAlpha = 1;
+  strokeAlpha = 1;
+  lineWidth = 1;
+  activeSMask = null;
+  transferMaps = "none";
+  minMax = F32_BBOX_INIT.slice();
+  constructor(width, height) {
+    this.clipBox = new Float32Array([0, 0, width, height]);
+  }
+  clone() {
+    const clone = Object.create(this);
+    clone.clipBox = this.clipBox.slice();
+    clone.minMax = this.minMax.slice();
+    clone.tilingPatternDims = this.tilingPatternDims?.slice();
+    return clone;
+  }
+  getPathBoundingBox(pathType = PathType.FILL, transform = null) {
+    const box = this.minMax.slice();
+    if (pathType === PathType.STROKE) {
+      if (!transform) {
+        unreachable("Stroke bounding box must include transform.");
+      }
+      Util.singularValueDecompose2dScale(transform, XY);
+      const xStrokePad = XY[0] * this.lineWidth / 2;
+      const yStrokePad = XY[1] * this.lineWidth / 2;
+      box[0] -= xStrokePad;
+      box[1] -= yStrokePad;
+      box[2] += xStrokePad;
+      box[3] += yStrokePad;
+    }
+    return box;
+  }
+  updateClipFromPath() {
+    const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox());
+    this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);
+  }
+  isEmptyClip() {
+    return this.minMax[0] === Infinity;
+  }
+  startNewPathAndClipBox(box) {
+    this.clipBox.set(box, 0);
+    this.minMax.set(F32_BBOX_INIT, 0);
+  }
+  getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) {
+    return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform));
+  }
+}
+function putBinaryImageData(ctx, imgData) {
+  const {
+    width,
+    height,
+    kind
+  } = imgData;
+  const partialChunkHeight = height % FULL_CHUNK_HEIGHT;
+  const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
+  const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
+  const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
+  let srcPos = 0;
+  const src = imgData.data;
+  const dest = chunkImgData.data;
+  let i;
+  if (kind === ImageKind.GRAYSCALE_1BPP) {
+    for (i = 0; i < totalChunks; i++) {
+      ({
+        srcPos
+      } = convertBlackAndWhiteToRGBA({
+        src,
+        srcPos,
+        dest,
+        width,
+        height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight
+      }));
+      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
+    }
+  } else if (kind === ImageKind.RGBA_32BPP) {
+    let j = 0;
+    let elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;
+    for (i = 0; i < fullChunks; i++) {
+      dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
+      srcPos += elemsInThisChunk;
+      ctx.putImageData(chunkImgData, 0, j);
+      j += FULL_CHUNK_HEIGHT;
+    }
+    if (i < totalChunks) {
+      elemsInThisChunk = width * partialChunkHeight * 4;
+      dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
+      ctx.putImageData(chunkImgData, 0, j);
+    }
+  } else if (kind === ImageKind.RGB_24BPP) {
+    for (i = 0; i < totalChunks; i++) {
+      ({
+        srcPos
+      } = convertRGBToRGBA({
+        src,
+        srcPos,
+        dest: new Uint32Array(dest.buffer),
+        width,
+        height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight
+      }));
+      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
+    }
+  } else {
+    throw new Error(`bad image kind: ${kind}`);
+  }
+}
+function putBinaryImageMask(ctx, imgData) {
+  if (imgData.bitmap) {
+    ctx.drawImage(imgData.bitmap, 0, 0);
+    return;
+  }
+  const {
+    width,
+    height
+  } = imgData;
+  const partialChunkHeight = height % FULL_CHUNK_HEIGHT;
+  const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
+  const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
+  const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
+  let srcPos = 0;
+  const src = imgData.data;
+  const dest = chunkImgData.data;
+  for (let i = 0; i < totalChunks; i++) {
+    ({
+      srcPos
+    } = convertBlackAndWhiteToRGBA({
+      src,
+      srcPos,
+      dest,
+      width,
+      height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight,
+      nonBlackColor: 0
+    }));
+    ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
+  }
+}
+function copyCtxState(sourceCtx, destCtx) {
+  const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"];
+  for (const property of properties) {
+    if (sourceCtx[property] !== undefined) {
+      destCtx[property] = sourceCtx[property];
+    }
+  }
+  if (sourceCtx.setLineDash !== undefined) {
+    destCtx.setLineDash(sourceCtx.getLineDash());
+    destCtx.lineDashOffset = sourceCtx.lineDashOffset;
+  }
+}
+function resetCtxToDefault(ctx) {
+  ctx.strokeStyle = ctx.fillStyle = "#000000";
+  ctx.fillRule = "nonzero";
+  ctx.globalAlpha = 1;
+  ctx.lineWidth = 1;
+  ctx.lineCap = "butt";
+  ctx.lineJoin = "miter";
+  ctx.miterLimit = 10;
+  ctx.globalCompositeOperation = "source-over";
+  ctx.font = "10px sans-serif";
+  if (ctx.setLineDash !== undefined) {
+    ctx.setLineDash([]);
+    ctx.lineDashOffset = 0;
+  }
+  const {
+    filter
+  } = ctx;
+  if (filter !== "none" && filter !== "") {
+    ctx.filter = "none";
+  }
+}
+function getImageSmoothingEnabled(transform, interpolate) {
+  if (interpolate) {
+    return true;
+  }
+  Util.singularValueDecompose2dScale(transform, XY);
+  const actualScale = Math.fround(OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS);
+  return XY[0] <= actualScale && XY[1] <= actualScale;
+}
+const LINE_CAP_STYLES = ["butt", "round", "square"];
+const LINE_JOIN_STYLES = ["miter", "round", "bevel"];
+const NORMAL_CLIP = {};
+const EO_CLIP = {};
+class CanvasGraphics {
+  #knockoutGroupLevel = 0;
+  #knockoutElementDepth = 0;
+  #knockoutTempCanvasEntry = null;
+  #knockoutSavedCtx = null;
+  #knockoutSavedSMaskCtx = null;
+  #knockoutSavedGCO = null;
+  #knockoutElementAlpha = 1;
+  #knockoutFilterCache;
+  #knockoutElementGroupMeta = null;
+  #groupStackMeta = [];
+  constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, {
+    optionalContentConfig,
+    markedContentStack = null
+  }, annotationCanvasMap, pageColors, dependencyTracker, imagesTracker) {
+    this.ctx = canvasCtx;
+    this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height);
+    this.stateStack = [];
+    this.pendingClip = null;
+    this.pendingEOFill = false;
+    this.commonObjs = commonObjs;
+    this.objs = objs;
+    this.canvasFactory = canvasFactory;
+    this.filterFactory = filterFactory;
+    this.groupStack = [];
+    this.baseTransform = null;
+    this.baseTransformStack = [];
+    this.groupLevel = 0;
+    this.smaskStack = [];
+    this.tempSMask = null;
+    this.smaskGroupCanvases = [];
+    this.smaskPreparedEntry = null;
+    this.smaskPreparedFor = null;
+    this.smaskPreparedOffsetX = 0;
+    this.smaskPreparedOffsetY = 0;
+    this.smaskPreparedOOBAlpha = null;
+    this.suspendedCtx = null;
+    this.contentVisible = true;
+    this.markedContentStack = markedContentStack || [];
+    this.optionalContentConfig = optionalContentConfig;
+    this.cachedPatterns = new Map();
+    this.annotationCanvasMap = annotationCanvasMap;
+    this.viewportScale = 1;
+    this.outputScaleX = 1;
+    this.outputScaleY = 1;
+    this.pageColors = pageColors;
+    this._cachedScaleForStroking = [-1, 0];
+    this._cachedGetSinglePixelWidth = null;
+    this._cachedBitmapsMap = new Map();
+    this.dependencyTracker = dependencyTracker ?? null;
+    this.imagesTracker = imagesTracker ?? null;
+  }
+  getObject(opIdx, data, fallback = null) {
+    if (typeof data === "string") {
+      this.dependencyTracker?.recordNamedDependency(opIdx, data);
+      return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data);
+    }
+    return fallback;
+  }
+  beginDrawing({
+    transform,
+    viewport,
+    transparency = false,
+    background = null
+  }) {
+    const width = this.ctx.canvas.width;
+    const height = this.ctx.canvas.height;
+    const savedFillStyle = this.ctx.fillStyle;
+    this.ctx.fillStyle = background || "#ffffff";
+    this.ctx.fillRect(0, 0, width, height);
+    this.ctx.fillStyle = savedFillStyle;
+    if (transparency) {
+      const transparentCanvas = this.transparentCanvasEntry = this.canvasFactory.create(width, height);
+      this.compositeCtx = this.ctx;
+      ({
+        canvas: this.transparentCanvas,
+        context: this.ctx
+      } = transparentCanvas);
+      this.ctx.save();
+      this.ctx.transform(...getCurrentTransform(this.compositeCtx));
+    }
+    this.ctx.save();
+    resetCtxToDefault(this.ctx);
+    if (transform) {
+      this.ctx.transform(...transform);
+      this.outputScaleX = transform[0];
+      this.outputScaleY = transform[3];
+    }
+    this.ctx.transform(...viewport.transform);
+    this.viewportScale = viewport.scale;
+    this.baseTransform = getCurrentTransform(this.ctx);
+  }
+  executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper, operationsFilter) {
+    const argsArray = operatorList.argsArray;
+    const fnArray = operatorList.fnArray;
+    let i = executionStartIdx || 0;
+    const argsArrayLen = argsArray.length;
+    if (argsArrayLen === i) {
+      return i;
+    }
+    const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function";
+    const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
+    let steps = 0;
+    const commonObjs = this.commonObjs;
+    const objs = this.objs;
+    let fnId, fnArgs;
+    while (true) {
+      if (stepper !== undefined) {
+        if (i === stepper.nextBreakPoint) {
+          stepper.breakIt(i, continueCallback);
+          return i;
+        }
+        if (stepper.shouldSkip(i)) {
+          if (++i === argsArrayLen) {
+            return i;
+          }
+          continue;
+        }
+      }
+      if (!operationsFilter || operationsFilter(i)) {
+        fnId = fnArray[i];
+        fnArgs = argsArray[i] ?? null;
+        if (fnId !== OPS.dependency) {
+          if (fnArgs === null) {
+            this[fnId](i);
+          } else {
+            this[fnId](i, ...fnArgs);
+          }
+        } else {
+          for (const depObjId of fnArgs) {
+            this.dependencyTracker?.recordNamedData(depObjId, i);
+            const objsPool = depObjId.startsWith("g_") ? commonObjs : objs;
+            if (!objsPool.has(depObjId)) {
+              objsPool.get(depObjId, continueCallback);
+              return i;
+            }
+          }
+        }
+      }
+      i++;
+      if (i === argsArrayLen) {
+        return i;
+      }
+      if (chunkOperations && ++steps > EXECUTION_STEPS) {
+        if (Date.now() > endTime) {
+          continueCallback();
+          return i;
+        }
+        steps = 0;
+      }
+    }
+  }
+  #restoreInitialState() {
+    while (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.#restoreInitialState();
+    for (const canvas of this.smaskGroupCanvases) {
+      this.canvasFactory.destroy(canvas);
+    }
+    this.smaskGroupCanvases.length = 0;
+    this._clearPreparedSMask();
+    this.tempSMask = null;
+    this.smaskStack.length = 0;
+    for (const meta of this.#groupStackMeta) {
+      this.#destroyKnockoutPools(meta);
+    }
+    this.#groupStackMeta.length = 0;
+    this.#knockoutTempCanvasEntry = null;
+    this.#knockoutSavedCtx = null;
+    this.#knockoutSavedSMaskCtx = null;
+    this.#knockoutSavedGCO = null;
+    this.#knockoutElementAlpha = 1;
+    this.#knockoutElementGroupMeta = null;
+    this.#knockoutElementDepth = 0;
+    this.#knockoutGroupLevel = 0;
+    this.cachedPatterns.clear();
+    for (const cache of this._cachedBitmapsMap.values()) {
+      for (const canvas of cache.values()) {
+        if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) {
+          canvas.width = canvas.height = 0;
+        }
+      }
+      cache.clear();
+    }
+    this._cachedBitmapsMap.clear();
+    this.#drawFilter();
+  }
+  #drawFilter() {
+    if (this.pageColors) {
+      const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background);
+      if (hcmFilterId !== "none") {
+        const savedFilter = this.ctx.filter;
+        this.ctx.filter = hcmFilterId;
+        this.ctx.drawImage(this.ctx.canvas, 0, 0);
+        this.ctx.filter = savedFilter;
+      }
+    }
+  }
+  _scaleImage(img, inverseTransform) {
+    const width = img.width ?? img.displayWidth;
+    const height = img.height ?? img.displayHeight;
+    const widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1);
+    const heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1);
+    const scaleSteps = [];
+    let ws = widthScale,
+      hs = heightScale,
+      pw = width,
+      ph = height;
+    while (ws > 2 && pw > 1 || hs > 2 && ph > 1) {
+      let nw = pw,
+        nh = ph;
+      if (ws > 2 && pw > 1) {
+        nw = Math.ceil(pw / 2);
+        ws /= pw / nw;
+      }
+      if (hs > 2 && ph > 1) {
+        nh = Math.ceil(ph / 2);
+        hs /= ph / nh;
+      }
+      scaleSteps.push({
+        newWidth: nw,
+        newHeight: nh
+      });
+      pw = nw;
+      ph = nh;
+    }
+    if (scaleSteps.length === 0) {
+      return {
+        img,
+        paintWidth: width,
+        paintHeight: height,
+        tmpCanvas: null
+      };
+    }
+    if (scaleSteps.length === 1) {
+      const {
+        newWidth,
+        newHeight
+      } = scaleSteps[0];
+      const tmpCanvas = this.canvasFactory.create(newWidth, newHeight);
+      tmpCanvas.context.drawImage(img, 0, 0, width, height, 0, 0, newWidth, newHeight);
+      return {
+        img: tmpCanvas.canvas,
+        paintWidth: newWidth,
+        paintHeight: newHeight,
+        tmpCanvas
+      };
+    }
+    let readEntry = this.canvasFactory.create(1, 1);
+    let writeEntry = this.canvasFactory.create(1, 1);
+    let paintWidth = width,
+      paintHeight = height;
+    let source = img;
+    for (const {
+      newWidth,
+      newHeight
+    } of scaleSteps) {
+      this.canvasFactory.reset(writeEntry, newWidth, newHeight);
+      writeEntry.context.drawImage(source, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);
+      [readEntry, writeEntry] = [writeEntry, readEntry];
+      source = readEntry.canvas;
+      paintWidth = newWidth;
+      paintHeight = newHeight;
+    }
+    this.canvasFactory.destroy(writeEntry);
+    return {
+      img: readEntry.canvas,
+      paintWidth,
+      paintHeight,
+      tmpCanvas: readEntry
+    };
+  }
+  _createMaskCanvas(opIdx, img) {
+    const ctx = this.ctx;
+    const {
+      width,
+      height
+    } = img;
+    const fillColor = this.current.fillColor;
+    const isPatternFill = this.current.patternFill;
+    const currentTransform = getCurrentTransform(ctx);
+    let cache, cacheKey, scaled, maskCanvas;
+    if ((img.bitmap || img.data) && img.count > 1) {
+      const mainKey = img.bitmap || img.data.buffer;
+      cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]);
+      cache = this._cachedBitmapsMap.getOrInsertComputed(mainKey, makeMap);
+      const cachedImage = cache.get(cacheKey);
+      if (cachedImage && !isPatternFill) {
+        const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]);
+        const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]);
+        this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill);
+        return {
+          canvas: cachedImage,
+          offsetX,
+          offsetY
+        };
+      }
+      scaled = cachedImage;
+    }
+    if (!scaled) {
+      maskCanvas = this.canvasFactory.create(width, height);
+      putBinaryImageMask(maskCanvas.context, img);
+    }
+    let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]);
+    maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);
+    const minMax = F32_BBOX_INIT.slice();
+    Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax);
+    const [minX, minY, maxX, maxY] = minMax;
+    const drawnWidth = Math.round(maxX - minX) || 1;
+    const drawnHeight = Math.round(maxY - minY) || 1;
+    const fillCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);
+    const fillCtx = fillCanvas.context;
+    const offsetX = minX;
+    const offsetY = minY;
+    fillCtx.translate(-offsetX, -offsetY);
+    fillCtx.transform(...maskToCanvas);
+    let scaledEntry = null;
+    if (!scaled) {
+      const scaleResult = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx));
+      scaled = scaleResult.img;
+      scaledEntry = scaleResult.tmpCanvas;
+      if (scaled !== maskCanvas.canvas) {
+        this.canvasFactory.destroy(maskCanvas);
+        maskCanvas = null;
+      }
+      if (cache && isPatternFill) {
+        cache.set(cacheKey, scaled);
+        scaledEntry = null;
+        maskCanvas = null;
+      }
+    }
+    fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate);
+    drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height);
+    if (scaledEntry) {
+      this.canvasFactory.destroy(scaledEntry);
+    }
+    if (maskCanvas) {
+      this.canvasFactory.destroy(maskCanvas);
+    }
+    fillCtx.globalCompositeOperation = "source-in";
+    const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]);
+    fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL, opIdx) : fillColor;
+    fillCtx.fillRect(0, 0, width, height);
+    if (cache && !isPatternFill) {
+      cache.set(cacheKey, fillCanvas.canvas);
+    }
+    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill);
+    return {
+      canvas: fillCanvas.canvas,
+      canvasEntry: cache && !isPatternFill ? null : fillCanvas,
+      offsetX: Math.round(offsetX),
+      offsetY: Math.round(offsetY)
+    };
+  }
+  setLineWidth(opIdx, width) {
+    this.dependencyTracker?.recordSimpleData("lineWidth", opIdx);
+    if (width !== this.current.lineWidth) {
+      this._cachedScaleForStroking[0] = -1;
+    }
+    this.current.lineWidth = width;
+    this.ctx.lineWidth = width;
+  }
+  setLineCap(opIdx, style) {
+    this.dependencyTracker?.recordSimpleData("lineCap", opIdx);
+    this.ctx.lineCap = LINE_CAP_STYLES[style];
+  }
+  setLineJoin(opIdx, style) {
+    this.dependencyTracker?.recordSimpleData("lineJoin", opIdx);
+    this.ctx.lineJoin = LINE_JOIN_STYLES[style];
+  }
+  setMiterLimit(opIdx, limit) {
+    this.dependencyTracker?.recordSimpleData("miterLimit", opIdx);
+    this.ctx.miterLimit = limit;
+  }
+  setDash(opIdx, dashArray, dashPhase) {
+    this.dependencyTracker?.recordSimpleData("dash", opIdx);
+    const ctx = this.ctx;
+    if (ctx.setLineDash !== undefined) {
+      ctx.setLineDash(dashArray);
+      ctx.lineDashOffset = dashPhase;
+    }
+  }
+  setRenderingIntent(opIdx, intent) {}
+  setFlatness(opIdx, flatness) {}
+  setGState(opIdx, states) {
+    for (const [key, value] of states) {
+      switch (key) {
+        case "LW":
+          this.setLineWidth(opIdx, value);
+          break;
+        case "LC":
+          this.setLineCap(opIdx, value);
+          break;
+        case "LJ":
+          this.setLineJoin(opIdx, value);
+          break;
+        case "ML":
+          this.setMiterLimit(opIdx, value);
+          break;
+        case "D":
+          this.setDash(opIdx, value[0], value[1]);
+          break;
+        case "RI":
+          this.setRenderingIntent(opIdx, value);
+          break;
+        case "FL":
+          this.setFlatness(opIdx, value);
+          break;
+        case "Font":
+          this.setFont(opIdx, value[0], value[1]);
+          break;
+        case "CA":
+          this.dependencyTracker?.recordSimpleData("strokeAlpha", opIdx);
+          this.current.strokeAlpha = value;
+          break;
+        case "ca":
+          this.dependencyTracker?.recordSimpleData("fillAlpha", opIdx);
+          this.ctx.globalAlpha = this.current.fillAlpha = value;
+          break;
+        case "BM":
+          this.dependencyTracker?.recordSimpleData("globalCompositeOperation", opIdx);
+          this.ctx.globalCompositeOperation = value;
+          break;
+        case "SMask":
+          this.dependencyTracker?.recordSimpleData("SMask", opIdx);
+          this.current.activeSMask = value ? this.tempSMask : null;
+          if (this.current.activeSMask) {
+            this.current.activeSMask.blendMode = this.ctx.globalCompositeOperation;
+          }
+          this.tempSMask = null;
+          this.checkSMaskState(opIdx);
+          break;
+        case "TR":
+          this.dependencyTracker?.recordSimpleData("filter", opIdx);
+          this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value);
+          break;
+      }
+    }
+  }
+  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;
+    this.smaskPreparedOOBAlpha = null;
+  }
+  _ensurePreparedSMask(smask) {
+    if (smask === this.smaskPreparedFor) {
+      return;
+    }
+    this._clearPreparedSMask();
+    this._prepareSMaskCanvas(smask);
+  }
+  checkSMaskState(opIdx) {
+    const inSMaskMode = this.inSMaskMode;
+    if (this.current.activeSMask && !inSMaskMode) {
+      this.beginSMaskMode(opIdx);
+    } else if (!this.current.activeSMask && inSMaskMode) {
+      this.endSMaskMode();
+    } else if (this.current.activeSMask && inSMaskMode) {
+      this._ensurePreparedSMask(this.current.activeSMask);
+    }
+  }
+  _prepareSMaskCanvas(smask) {
+    const {
+      canvas: maskCanvas,
+      subtype,
+      backdrop,
+      transferMap
+    } = smask;
+    const hasFilter = subtype === "Luminosity" || subtype === "Alpha" && transferMap;
+    if (!hasFilter && !(subtype === "Luminosity" && backdrop)) {
+      this.smaskPreparedFor = smask;
+      return;
+    }
+    let filteredOOBAlpha;
+    if (subtype === "Luminosity" && backdrop) {
+      const [r, g, b] = getRGBA(backdrop);
+      const inputAlpha = Math.round(0.3 * r + 0.59 * g + 0.11 * b);
+      filteredOOBAlpha = transferMap?.[inputAlpha] ?? inputAlpha;
+    } else {
+      filteredOOBAlpha = transferMap?.[0] ?? 0;
+    }
+    const SMASK_LAYER_TO_MASK_AREA_RATIO = 4;
+    const {
+      width: layerW,
+      height: layerH
+    } = this.ctx.canvas;
+    const maskArea = maskCanvas.width * maskCanvas.height;
+    const useLayerSize = layerW * layerH < SMASK_LAYER_TO_MASK_AREA_RATIO * maskArea;
+    const filterSpec = hasFilter ? {
+      url: subtype === "Alpha" ? this.filterFactory.addAlphaFilter(transferMap) : this.filterFactory.addLuminosityFilter(transferMap),
+      subtype,
+      transferMap
+    } : null;
+    const bakedBackdrop = subtype === "Luminosity" ? backdrop : null;
+    let preparedEntry, offsetX, offsetY;
+    if (useLayerSize) {
+      preparedEntry = this._bakeSMaskCanvas(maskCanvas, smask.offsetX, smask.offsetY, layerW, layerH, bakedBackdrop, filterSpec);
+      offsetX = 0;
+      offsetY = 0;
+    } else {
+      preparedEntry = this._bakeSMaskCanvas(maskCanvas, 0, 0, maskCanvas.width, maskCanvas.height, bakedBackdrop, filterSpec);
+      offsetX = smask.offsetX;
+      offsetY = smask.offsetY;
+    }
+    this.smaskPreparedEntry = preparedEntry;
+    this.smaskPreparedFor = smask;
+    this.smaskPreparedOffsetX = offsetX;
+    this.smaskPreparedOffsetY = offsetY;
+    this.smaskPreparedOOBAlpha = !useLayerSize && filteredOOBAlpha !== 0 ? filteredOOBAlpha : null;
+  }
+  _bakeSMaskCanvas(maskCanvas, drawX, drawY, w, h, backdrop, filterSpec) {
+    if (!backdrop && !filterSpec) {
+      unreachable("_bakeSMaskCanvas with neither backdrop nor filter");
+    }
+    const srcEntry = this.canvasFactory.create(w, h);
+    const sCtx = srcEntry.context;
+    sCtx.drawImage(maskCanvas, drawX, drawY);
+    if (backdrop) {
+      sCtx.globalCompositeOperation = "destination-atop";
+      sCtx.fillStyle = backdrop;
+      sCtx.fillRect(0, 0, w, h);
+    }
+    if (!filterSpec) {
+      return srcEntry;
+    }
+    const preparedEntry = this.canvasFactory.create(w, h);
+    const pCtx = preparedEntry.context;
+    pCtx.filter = filterSpec.url;
+    const filterApplied = FeatureTest.isCanvasFilterSupported && pCtx.filter !== "none" && pCtx.filter !== "";
+    pCtx.drawImage(srcEntry.canvas, 0, 0);
+    if (FeatureTest.isCanvasFilterSupported) {
+      pCtx.filter = "none";
+    }
+    if (!filterApplied) {
+      const img = pCtx.getImageData(0, 0, w, h);
+      const {
+        data
+      } = img;
+      const {
+        transferMap
+      } = filterSpec;
+      if (filterSpec.subtype === "Luminosity") {
+        for (let i = 0, ii = data.length; i < ii; i += 4) {
+          const a = 0.3 * data[i] + 0.59 * data[i + 1] + 0.11 * data[i + 2] + 0.5 | 0;
+          data[i] = data[i + 1] = data[i + 2] = 0;
+          data[i + 3] = transferMap?.[a] ?? a;
+        }
+      } else {
+        for (let i = 3, ii = data.length; i < ii; i += 4) {
+          data[i] = transferMap[data[i]];
+        }
+      }
+      pCtx.putImageData(img, 0, 0);
+    }
+    this.canvasFactory.destroy(srcEntry);
+    return preparedEntry;
+  }
+  beginSMaskMode(opIdx) {
+    if (this.inSMaskMode) {
+      throw new Error("beginSMaskMode called while already in smask mode");
+    }
+    const {
+      width: drawnWidth,
+      height: drawnHeight
+    } = this.ctx.canvas;
+    const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);
+    this.smaskScratchCanvas = scratchCanvas;
+    this.suspendedCtx = this.ctx;
+    const ctx = this.ctx = scratchCanvas.context;
+    ctx.setTransform(this.suspendedCtx.getTransform());
+    copyCtxState(this.suspendedCtx, ctx);
+    mirrorContextOperations(ctx, this.suspendedCtx);
+    this._ensurePreparedSMask(this.current.activeSMask);
+    this.setGState(opIdx, [["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();
+  }
+  #createKnockoutMaskCanvas(sourceCanvas, reuseEntry = null, alpha = 1) {
+    const {
+      width,
+      height
+    } = sourceCanvas;
+    const maskEntry = reuseEntry ?? this.canvasFactory.create(width, height);
+    const maskCtx = maskEntry.context;
+    alpha = Math.round(alpha * 255) / 255;
+    const needsAlphaScaling = alpha < 1;
+    if (needsAlphaScaling && this.#knockoutFilterCache === undefined) {
+      this.#knockoutFilterCache = FeatureTest.isCanvasFilterSupported ? new Map() : "none";
+    }
+    let knockoutFilter = "none";
+    if (needsAlphaScaling && this.#knockoutFilterCache instanceof Map) {
+      knockoutFilter = this.#knockoutFilterCache.getOrInsertComputed(alpha, () => this.filterFactory.addKnockoutFilter(alpha));
+    }
+    if (!needsAlphaScaling || knockoutFilter !== "none") {
+      if (reuseEntry) {
+        maskCtx.save();
+        maskCtx.setTransform(1, 0, 0, 1, 0, 0);
+        maskCtx.clearRect(0, 0, width, height);
+        maskCtx.restore();
+      }
+      maskCtx.filter = knockoutFilter;
+      maskCtx.drawImage(sourceCanvas, 0, 0);
+      maskCtx.filter = "none";
+      return maskEntry;
+    }
+    const sourceData = sourceCanvas.getContext("2d", {
+      willReadFrequently: true
+    }).getImageData(0, 0, width, height);
+    const maskData = maskCtx.createImageData(width, height);
+    const sourcePixels = sourceData.data,
+      maskPixels = maskData.data;
+    const alphaScale = alpha > 0 ? 1 / alpha : 1e6;
+    for (let i = 3, ii = sourcePixels.length; i < ii; i += 4) {
+      maskPixels[i] = Math.min(Math.round(sourcePixels[i] * alphaScale), 255);
+    }
+    maskCtx.putImageData(maskData, 0, 0);
+    return maskEntry;
+  }
+  #getOrCreatePooledEntry(meta, key, width, height) {
+    let entry = meta?.[key] ?? null;
+    if (entry && (entry.canvas.width !== width || entry.canvas.height !== height)) {
+      this.canvasFactory.destroy(entry);
+      entry = null;
+    }
+    if (!entry) {
+      entry = this.canvasFactory.create(width, height);
+      if (meta) {
+        meta[key] = entry;
+      }
+      return entry;
+    }
+    const ctx = entry.context;
+    ctx.save();
+    ctx.setTransform(1, 0, 0, 1, 0, 0);
+    ctx.clearRect(0, 0, width, height);
+    ctx.restore();
+    return entry;
+  }
+  #compositeKnockoutSurface(destCtx, surfaceCanvas, options = {}) {
+    const {
+      backdropCanvas = null,
+      destTransform = [1, 0, 0, 1, 0, 0],
+      backdropOffset = [0, 0],
+      reuseMaskEntry = null,
+      poolMeta = null,
+      sourceAlpha = 1,
+      sourceFilter = "none",
+      knockoutAlpha = 1
+    } = options;
+    const {
+      width,
+      height
+    } = surfaceCanvas;
+    const knockoutMaskEntry = this.#createKnockoutMaskCanvas(surfaceCanvas, reuseMaskEntry, knockoutAlpha);
+    const sourceCompositeOperation = destCtx.globalCompositeOperation;
+    destCtx.save();
+    destCtx.setTransform(...destTransform);
+    destCtx.globalAlpha = 1;
+    if (FeatureTest.isCanvasFilterSupported) {
+      destCtx.filter = "none";
+    }
+    destCtx.globalCompositeOperation = "destination-out";
+    destCtx.drawImage(knockoutMaskEntry.canvas, 0, 0);
+    if (backdropCanvas) {
+      const [bx, by] = backdropOffset;
+      const backdropEntry = this.#getOrCreatePooledEntry(poolMeta, "knockoutBackdropEntry", width, height);
+      const backdropCtx = backdropEntry.context;
+      backdropCtx.drawImage(backdropCanvas, bx, by, width, height, 0, 0, width, height);
+      backdropCtx.globalCompositeOperation = "destination-in";
+      backdropCtx.drawImage(knockoutMaskEntry.canvas, 0, 0);
+      backdropCtx.globalCompositeOperation = "source-over";
+      destCtx.globalCompositeOperation = "destination-over";
+      destCtx.drawImage(backdropEntry.canvas, 0, 0);
+      if (!poolMeta) {
+        this.canvasFactory.destroy(backdropEntry);
+      }
+    }
+    destCtx.globalCompositeOperation = sourceCompositeOperation;
+    destCtx.globalAlpha = sourceAlpha;
+    if (FeatureTest.isCanvasFilterSupported) {
+      destCtx.filter = sourceFilter ?? "none";
+    }
+    destCtx.drawImage(surfaceCanvas, 0, 0);
+    destCtx.restore();
+    if (!reuseMaskEntry) {
+      this.canvasFactory.destroy(knockoutMaskEntry);
+    }
+  }
+  #beginKnockoutElement(alpha = 1) {
+    if (this.#knockoutGroupLevel === 0 || this.#knockoutElementDepth > 0 || !this.contentVisible) {
+      return false;
+    }
+    this.#knockoutElementDepth++;
+    this.#knockoutElementAlpha = alpha;
+    const groupMeta = this.#groupStackMeta.at(-1);
+    const {
+      canvas
+    } = this.ctx;
+    const tempEntry = this.#getOrCreatePooledEntry(groupMeta, "knockoutTempEntry", canvas.width, canvas.height);
+    this.#knockoutTempCanvasEntry = tempEntry;
+    const tempCtx = tempEntry.context;
+    tempCtx.save();
+    tempCtx.setTransform(this.ctx.getTransform());
+    copyCtxState(this.ctx, tempCtx);
+    this.#knockoutSavedGCO = tempCtx.globalCompositeOperation;
+    tempCtx.globalCompositeOperation = "source-over";
+    mirrorContextOperations(tempCtx, this.ctx);
+    this.#knockoutElementGroupMeta = groupMeta;
+    this.#knockoutSavedCtx = this.ctx;
+    this.#knockoutSavedSMaskCtx = this.suspendedCtx;
+    this.ctx = tempCtx;
+    if (this.inSMaskMode) {
+      this.suspendedCtx = tempCtx;
+    }
+    return true;
+  }
+  #endKnockoutElement(started) {
+    if (!started) {
+      return;
+    }
+    const tempEntry = this.#knockoutTempCanvasEntry;
+    const savedCtx = this.#knockoutSavedCtx;
+    const savedSMaskCtx = this.#knockoutSavedSMaskCtx;
+    const tempCtx = tempEntry.context;
+    this.#knockoutTempCanvasEntry = null;
+    this.#knockoutSavedCtx = null;
+    this.#knockoutSavedSMaskCtx = null;
+    if (this.inSMaskMode && this.suspendedCtx === tempCtx && this.ctx !== tempCtx) {
+      this.endSMaskMode();
+    }
+    if (this.inSMaskMode) {
+      this.suspendedCtx = savedSMaskCtx;
+    }
+    this.ctx._removeMirroring();
+    this.ctx.globalCompositeOperation = this.#knockoutSavedGCO;
+    this.#knockoutSavedGCO = null;
+    copyCtxState(this.ctx, savedCtx);
+    this.ctx = savedCtx;
+    const groupMeta = this.#knockoutElementGroupMeta;
+    this.#knockoutElementGroupMeta = null;
+    const knockoutAlpha = this.#knockoutElementAlpha;
+    this.#knockoutElementAlpha = 1;
+    try {
+      this.#compositeKnockoutSurface(savedSMaskCtx ?? savedCtx, tempEntry.canvas, {
+        backdropCanvas: groupMeta?.backdropCtx?.canvas ?? null,
+        backdropOffset: groupMeta?.backdropCtx ? [groupMeta.offsetX, groupMeta.offsetY] : [0, 0],
+        reuseMaskEntry: groupMeta?.knockoutMaskEntry ?? null,
+        poolMeta: groupMeta,
+        knockoutAlpha
+      });
+    } finally {
+      tempCtx.restore();
+      this.#knockoutElementDepth--;
+      if (!groupMeta) {
+        this.canvasFactory.destroy(tempEntry);
+      }
+    }
+  }
+  compose(dirtyBox) {
+    if (!this.current.activeSMask) {
+      return;
+    }
+    dirtyBox = dirtyBox ? [Math.floor(dirtyBox[0]), Math.floor(dirtyBox[1]), Math.ceil(dirtyBox[2]), Math.ceil(dirtyBox[3])] : [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];
+    const smask = this.current.activeSMask;
+    const suspendedCtx = this.suspendedCtx;
+    const applySMaskInPlace = this.#knockoutElementDepth > 0 && suspendedCtx === this.ctx;
+    this.composeSMask(applySMaskInPlace ? null : suspendedCtx, smask, this.ctx, dirtyBox);
+    if (applySMaskInPlace) {
+      return;
+    }
+    this.ctx.save();
+    this.ctx.setTransform(1, 0, 0, 1, 0, 0);
+    this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
+    this.ctx.restore();
+  }
+  composeSMask(ctx, smask, layerCtx, layerBox) {
+    const layerOffsetX = layerBox[0];
+    const layerOffsetY = layerBox[1];
+    const layerWidth = layerBox[2] - layerOffsetX;
+    const layerHeight = layerBox[3] - layerOffsetY;
+    if (layerWidth === 0 || layerHeight === 0) {
+      return;
+    }
+    const preparedEntry = this.smaskPreparedEntry;
+    if (preparedEntry) {
+      let clipX = layerOffsetX;
+      let clipY = layerOffsetY;
+      let clipW = layerWidth;
+      let clipH = layerHeight;
+      const oobAlpha = this.smaskPreparedOOBAlpha;
+      const hasOOBAlpha = oobAlpha !== null;
+      if (hasOOBAlpha) {
+        clipX = Math.max(layerOffsetX, smask.offsetX);
+        clipY = Math.max(layerOffsetY, smask.offsetY);
+        const x1 = Math.min(layerOffsetX + layerWidth, smask.offsetX + smask.canvas.width);
+        const y1 = Math.min(layerOffsetY + layerHeight, smask.offsetY + smask.canvas.height);
+        clipW = x1 - clipX;
+        clipH = y1 - clipY;
+      }
+      if (clipW > 0 && clipH > 0) {
+        const srcX = clipX - this.smaskPreparedOffsetX;
+        const srcY = clipY - this.smaskPreparedOffsetY;
+        layerCtx.save();
+        layerCtx.globalAlpha = 1;
+        layerCtx.setTransform(1, 0, 0, 1, 0, 0);
+        const clip = new Path2D();
+        clip.rect(clipX, clipY, clipW, clipH);
+        layerCtx.clip(clip);
+        layerCtx.globalCompositeOperation = "destination-in";
+        layerCtx.drawImage(preparedEntry.canvas, srcX, srcY, clipW, clipH, clipX, clipY, clipW, clipH);
+        layerCtx.restore();
+      }
+      if (hasOOBAlpha && oobAlpha < 255) {
+        this._applySMaskOOBAlpha(layerCtx, layerOffsetX, layerOffsetY, layerWidth, layerHeight, clipX, clipY, clipX + clipW, clipY + clipH, oobAlpha);
+      }
+    } else {
+      this.genericComposeSMask(smask, layerCtx, layerWidth, layerHeight, layerOffsetX, layerOffsetY);
+    }
+    if (!ctx) {
+      return;
+    }
+    ctx.save();
+    ctx.globalAlpha = 1;
+    ctx.globalCompositeOperation = smask.blendMode || "source-over";
+    ctx.setTransform(1, 0, 0, 1, 0, 0);
+    ctx.drawImage(layerCtx.canvas, layerOffsetX, layerOffsetY, layerWidth, layerHeight, layerOffsetX, layerOffsetY, layerWidth, layerHeight);
+    ctx.restore();
+  }
+  _applySMaskOOBAlpha(layerCtx, layerOffsetX, layerOffsetY, layerWidth, layerHeight, maskX0, maskY0, maskX1, maskY1, alpha) {
+    const hasInnerCutout = maskX0 < maskX1 && maskY0 < maskY1;
+    if (hasInnerCutout && maskX0 === layerOffsetX && maskY0 === layerOffsetY && maskX1 === layerOffsetX + layerWidth && maskY1 === layerOffsetY + layerHeight) {
+      return;
+    }
+    const path = new Path2D();
+    path.rect(layerOffsetX, layerOffsetY, layerWidth, layerHeight);
+    if (hasInnerCutout) {
+      path.rect(maskX0, maskY0, maskX1 - maskX0, maskY1 - maskY0);
+    }
+    layerCtx.save();
+    layerCtx.globalAlpha = alpha / 255;
+    layerCtx.setTransform(1, 0, 0, 1, 0, 0);
+    layerCtx.clip(path, "evenodd");
+    layerCtx.globalCompositeOperation = "destination-in";
+    layerCtx.fillStyle = "#000000";
+    layerCtx.fillRect(layerOffsetX, layerOffsetY, layerWidth, layerHeight);
+    layerCtx.restore();
+  }
+  genericComposeSMask(smask, layerCtx, width, height, layerOffsetX, layerOffsetY) {
+    const {
+      context: maskCtx,
+      offsetX: maskOffsetX,
+      offsetY: maskOffsetY
+    } = smask;
+    layerCtx.save();
+    layerCtx.globalAlpha = 1;
+    layerCtx.setTransform(1, 0, 0, 1, 0, 0);
+    const clip = new Path2D();
+    clip.rect(layerOffsetX, layerOffsetY, width, height);
+    layerCtx.clip(clip);
+    layerCtx.globalCompositeOperation = "destination-in";
+    layerCtx.drawImage(maskCtx.canvas, layerOffsetX - maskOffsetX, layerOffsetY - maskOffsetY, width, height, layerOffsetX, layerOffsetY, width, height);
+    layerCtx.restore();
+  }
+  save(opIdx) {
+    if (this.inSMaskMode) {
+      copyCtxState(this.ctx, this.suspendedCtx);
+    }
+    this.ctx.save();
+    const old = this.current;
+    this.stateStack.push(old);
+    this.current = old.clone();
+    this.dependencyTracker?.save(opIdx);
+  }
+  restore(opIdx) {
+    this.dependencyTracker?.restore(opIdx);
+    if (this.stateStack.length === 0) {
+      if (this.inSMaskMode) {
+        this.endSMaskMode();
+      }
+      return;
+    }
+    this.current = this.stateStack.pop();
+    this.ctx.restore();
+    if (this.inSMaskMode) {
+      copyCtxState(this.suspendedCtx, this.ctx);
+      this.ctx.setTransform(this.suspendedCtx.getTransform());
+    }
+    this.checkSMaskState(opIdx);
+    this.pendingClip = null;
+    this._cachedScaleForStroking[0] = -1;
+    this._cachedGetSinglePixelWidth = null;
+  }
+  transform(opIdx, a, b, c, d, e, f) {
+    this.dependencyTracker?.recordIncrementalData("transform", opIdx);
+    this.ctx.transform(a, b, c, d, e, f);
+    this._cachedScaleForStroking[0] = -1;
+    this._cachedGetSinglePixelWidth = null;
+  }
+  constructPath(opIdx, op, data, minMax) {
+    let [path] = data;
+    if (!minMax) {
+      path ||= data[0] = new Path2D();
+      if (op !== OPS.stroke && op !== OPS.closeStroke) {
+        this.current.tilingPatternDims = null;
+      }
+      this[op](opIdx, path);
+      return;
+    }
+    if (this.dependencyTracker !== null) {
+      const outerExtraSize = op === OPS.stroke ? this.current.lineWidth / 2 : 0;
+      this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, this.ctx, minMax[0] - outerExtraSize, minMax[2] + outerExtraSize, minMax[1] - outerExtraSize, minMax[3] + outerExtraSize).recordDependencies(opIdx, ["transform"]);
+    }
+    if (!(path instanceof Path2D)) {
+      path = data[0] = makePathFromDrawOPS(path);
+    }
+    Util.axialAlignedBoundingBox(minMax, getCurrentTransform(this.ctx), this.current.minMax);
+    const tilingDims = this.current.tilingPatternDims;
+    if (tilingDims && op !== OPS.stroke && op !== OPS.closeStroke && this.current.fillColor instanceof TilingPattern) {
+      const clippedBBox = Util.intersect(this.current.clipBox, this.current.minMax);
+      if (!clippedBBox) {
+        this.current.tilingPatternDims = null;
+      } else {
+        this.current.fillColor.updatePatternDims(clippedBBox, tilingDims);
+      }
+    }
+    this[op](opIdx, path);
+    this._pathStartIdx = opIdx;
+  }
+  closePath(opIdx) {
+    this.ctx.closePath();
+  }
+  stroke(opIdx, path, consumePath = true) {
+    const started = consumePath && this.#beginKnockoutElement(this.current.strokeAlpha);
+    const ctx = this.ctx;
+    const strokeColor = this.current.strokeColor;
+    ctx.globalAlpha = this.current.strokeAlpha;
+    if (this.contentVisible) {
+      if (typeof strokeColor === "object" && strokeColor?.getPattern) {
+        const baseTransform = strokeColor.isModifyingCurrentTransform() ? ctx.getTransform() : null;
+        ctx.save();
+        ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx);
+        if (baseTransform) {
+          const newPath = new Path2D();
+          newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform));
+          path = newPath;
+        }
+        this.rescaleAndStroke(path, false);
+        ctx.restore();
+      } else {
+        this.rescaleAndStroke(path, true);
+      }
+    }
+    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.stroke);
+    if (consumePath) {
+      this.consumePath(opIdx, path, this.current.getClippedPathBoundingBox(PathType.STROKE, getCurrentTransform(this.ctx)));
+    }
+    ctx.globalAlpha = this.current.fillAlpha;
+    this.#endKnockoutElement(started);
+  }
+  closeStroke(opIdx, path) {
+    this.stroke(opIdx, path);
+  }
+  fill(opIdx, path, consumePath = true) {
+    const started = consumePath && this.#beginKnockoutElement(this.current.fillAlpha);
+    const ctx = this.ctx;
+    const fillColor = this.current.fillColor;
+    const isPatternFill = this.current.patternFill;
+    let needRestore = false;
+    const intersect = this.current.getClippedPathBoundingBox();
+    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.fill);
+    if (isPatternFill) {
+      const dims = this.current.tilingPatternDims;
+      const tileIdx = dims && fillColor.canSkipPatternCanvas(dims);
+      if (tileIdx) {
+        fillColor.drawPattern(this, path, this.pendingEOFill, tileIdx, opIdx);
+        this.pendingEOFill = false;
+        if (consumePath) {
+          this.consumePath(opIdx, path, intersect);
+        }
+        this.current.tilingPatternDims = null;
+        this.#endKnockoutElement(started);
+        return;
+      }
+      const baseTransform = fillColor.isModifyingCurrentTransform() ? ctx.getTransform() : null;
+      this.dependencyTracker?.save(opIdx);
+      ctx.save();
+      ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx);
+      if (baseTransform) {
+        const newPath = new Path2D();
+        newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform));
+        path = newPath;
+      }
+      needRestore = true;
+    }
+    if (this.contentVisible && intersect !== null) {
+      if (this.pendingEOFill) {
+        ctx.fill(path, "evenodd");
+        this.pendingEOFill = false;
+      } else {
+        ctx.fill(path);
+      }
+    }
+    if (needRestore) {
+      ctx.restore();
+      this.dependencyTracker?.restore(opIdx);
+    }
+    if (consumePath) {
+      this.consumePath(opIdx, path, intersect);
+    }
+    this.#endKnockoutElement(started);
+  }
+  eoFill(opIdx, path) {
+    this.pendingEOFill = true;
+    this.fill(opIdx, path);
+  }
+  fillStroke(opIdx, path) {
+    const started = this.#beginKnockoutElement(Math.min(this.current.fillAlpha, this.current.strokeAlpha));
+    this.fill(opIdx, path, false);
+    this.stroke(opIdx, path, false);
+    this.consumePath(opIdx, path);
+    this.#endKnockoutElement(started);
+  }
+  eoFillStroke(opIdx, path) {
+    this.pendingEOFill = true;
+    this.fillStroke(opIdx, path);
+  }
+  closeFillStroke(opIdx, path) {
+    this.fillStroke(opIdx, path);
+  }
+  closeEOFillStroke(opIdx, path) {
+    this.pendingEOFill = true;
+    this.fillStroke(opIdx, path);
+  }
+  endPath(opIdx, path) {
+    this.consumePath(opIdx, path);
+  }
+  rawFillPath(opIdx, path) {
+    const started = this.#beginKnockoutElement(this.current.fillAlpha);
+    this.ctx.fill(path);
+    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.rawFillPath).recordOperation(opIdx);
+    this.#endKnockoutElement(started);
+  }
+  clip(opIdx) {
+    this.dependencyTracker?.recordFutureForcedDependency("clipMode", opIdx);
+    this.pendingClip = NORMAL_CLIP;
+  }
+  eoClip(opIdx) {
+    this.dependencyTracker?.recordFutureForcedDependency("clipMode", opIdx);
+    this.pendingClip = EO_CLIP;
+  }
+  beginText(opIdx) {
+    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(opIdx).resetIncrementalData("sameLineText").resetIncrementalData("moveText", opIdx);
+  }
+  endText(opIdx) {
+    const paths = this.pendingTextPaths;
+    const ctx = this.ctx;
+    if (this.dependencyTracker) {
+      const {
+        dependencyTracker
+      } = this;
+      if (paths !== undefined) {
+        dependencyTracker.recordFutureForcedDependency("textClip", dependencyTracker.getOpenMarker()).recordFutureForcedDependency("textClip", opIdx);
+      }
+      dependencyTracker.recordCloseMarker(opIdx);
+    }
+    if (paths !== undefined) {
+      const newPath = new Path2D();
+      const invTransf = ctx.getTransform().invertSelf();
+      for (const {
+        transform,
+        x,
+        y,
+        fontSize,
+        path
+      } of paths) {
+        if (!path) {
+          continue;
+        }
+        newPath.addPath(path, new DOMMatrix(transform).preMultiplySelf(invTransf).translate(x, y).scale(fontSize, -fontSize));
+      }
+      ctx.clip(newPath);
+    }
+    delete this.pendingTextPaths;
+  }
+  setCharSpacing(opIdx, spacing) {
+    this.dependencyTracker?.recordSimpleData("charSpacing", opIdx);
+    this.current.charSpacing = spacing;
+  }
+  setWordSpacing(opIdx, spacing) {
+    this.dependencyTracker?.recordSimpleData("wordSpacing", opIdx);
+    this.current.wordSpacing = spacing;
+  }
+  setHScale(opIdx, scale) {
+    this.dependencyTracker?.recordSimpleData("hScale", opIdx);
+    this.current.textHScale = scale / 100;
+  }
+  setLeading(opIdx, leading) {
+    this.dependencyTracker?.recordSimpleData("leading", opIdx);
+    this.current.leading = -leading;
+  }
+  setFont(opIdx, fontRefName, size) {
+    this.dependencyTracker?.recordSimpleData("font", opIdx).recordSimpleDataFromNamed("fontObj", fontRefName, opIdx);
+    const fontObj = this.commonObjs.get(fontRefName);
+    const current = this.current;
+    if (!fontObj) {
+      throw new Error(`Can't find font for ${fontRefName}`);
+    }
+    current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX;
+    if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {
+      warn("Invalid font matrix for font " + fontRefName);
+    }
+    if (size < 0) {
+      size = -size;
+      current.fontDirection = -1;
+    } else {
+      current.fontDirection = 1;
+    }
+    this.current.font = fontObj;
+    this.current.fontSize = size;
+    if (fontObj.isType3Font) {
+      return;
+    }
+    const name = fontObj.loadedName || "sans-serif";
+    const typeface = fontObj.systemFontInfo?.css || `"${name}", ${fontObj.fallbackName}`;
+    let bold = "normal";
+    if (fontObj.black) {
+      bold = "900";
+    } else if (fontObj.bold) {
+      bold = "bold";
+    }
+    const italic = fontObj.italic ? "italic" : "normal";
+    const browserFontSize = MathClamp(size, MIN_FONT_SIZE, MAX_FONT_SIZE);
+    this.current.fontSizeScale = size / browserFontSize;
+    this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;
+  }
+  setTextRenderingMode(opIdx, mode) {
+    this.dependencyTracker?.recordSimpleData("textRenderingMode", opIdx);
+    this.current.textRenderingMode = mode;
+  }
+  setTextRise(opIdx, rise) {
+    this.dependencyTracker?.recordSimpleData("textRise", opIdx);
+    this.current.textRise = rise;
+  }
+  moveText(opIdx, x, y) {
+    this.dependencyTracker?.resetIncrementalData("sameLineText").recordIncrementalData("moveText", opIdx);
+    this.current.x = this.current.lineX += x;
+    this.current.y = this.current.lineY += y;
+  }
+  setLeadingMoveText(opIdx, x, y) {
+    this.setLeading(opIdx, -y);
+    this.moveText(opIdx, x, y);
+  }
+  setTextMatrix(opIdx, matrix) {
+    this.dependencyTracker?.resetIncrementalData("sameLineText").recordSimpleData("textMatrix", opIdx);
+    const {
+      current
+    } = this;
+    current.textMatrix = matrix;
+    current.textMatrixScale = Math.hypot(matrix[0], matrix[1]);
+    current.x = current.lineX = 0;
+    current.y = current.lineY = 0;
+  }
+  nextLine(opIdx) {
+    this.moveText(opIdx, 0, this.current.leading);
+    this.dependencyTracker?.recordIncrementalData("moveText", this.dependencyTracker.getSimpleIndex("leading") ?? opIdx);
+  }
+  #getScaledPath(path, currentTransform, transform) {
+    const newPath = new Path2D();
+    newPath.addPath(path, new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform));
+    return newPath;
+  }
+  paintChar(opIdx, character, x, y, patternFillTransform, patternStrokeTransform) {
+    const ctx = this.ctx;
+    const current = this.current;
+    const font = current.font;
+    const textRenderingMode = current.textRenderingMode;
+    const fontSize = current.fontSize / current.fontSizeScale;
+    const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;
+    const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG);
+    const patternFill = current.patternFill && !font.missingFile;
+    const patternStroke = current.patternStroke && !font.missingFile;
+    let path;
+    if ((font.disableFontFace || isAddToPathSet || patternFill || patternStroke) && !font.missingFile) {
+      path = font.getPathGenerator(this.commonObjs, character);
+    }
+    if (path && (font.disableFontFace || patternFill || patternStroke)) {
+      ctx.save();
+      ctx.translate(x, y);
+      ctx.scale(fontSize, -fontSize);
+      this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font);
+      let currentTransform;
+      if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+        if (patternFillTransform) {
+          currentTransform = ctx.getTransform();
+          ctx.setTransform(...patternFillTransform);
+          const scaledPath = this.#getScaledPath(path, currentTransform, patternFillTransform);
+          ctx.fill(scaledPath);
+        } else {
+          ctx.fill(path);
+        }
+      }
+      if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+        if (patternStrokeTransform) {
+          currentTransform ||= ctx.getTransform();
+          ctx.setTransform(...patternStrokeTransform);
+          const {
+            a,
+            b,
+            c,
+            d
+          } = currentTransform;
+          const invPatternTransform = Util.inverseTransform(patternStrokeTransform);
+          const transf = Util.transform([a, b, c, d, 0, 0], invPatternTransform);
+          Util.singularValueDecompose2dScale(transf, XY);
+          ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize;
+          ctx.stroke(this.#getScaledPath(path, currentTransform, patternStrokeTransform));
+        } else {
+          ctx.lineWidth /= fontSize;
+          ctx.stroke(path);
+        }
+      }
+      ctx.restore();
+    } else {
+      if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+        ctx.fillText(character, x, y);
+        this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character));
+      }
+      if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+        if (this.dependencyTracker) {
+          this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character)).recordDependencies(opIdx, Dependencies.stroke);
+        }
+        ctx.strokeText(character, x, y);
+      }
+    }
+    if (isAddToPathSet) {
+      const paths = this.pendingTextPaths ||= [];
+      paths.push({
+        transform: getCurrentTransform(ctx),
+        x,
+        y,
+        fontSize,
+        path
+      });
+      this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y);
+    }
+  }
+  get isFontSubpixelAAEnabled() {
+    const tmpCanvas = this.canvasFactory.create(10, 10);
+    const ctx = tmpCanvas.context;
+    ctx.scale(1.5, 1);
+    ctx.fillText("I", 0, 10);
+    const data = ctx.getImageData(0, 0, 10, 10).data;
+    this.canvasFactory.destroy(tmpCanvas);
+    let enabled = false;
+    for (let i = 3; i < data.length; i += 4) {
+      if (data[i] > 0 && data[i] < 255) {
+        enabled = true;
+        break;
+      }
+    }
+    return shadow(this, "isFontSubpixelAAEnabled", enabled);
+  }
+  showText(opIdx, glyphs) {
+    if (this.dependencyTracker) {
+      this.dependencyTracker.recordDependencies(opIdx, Dependencies.showText).resetBBox(opIdx);
+      if (this.current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) {
+        this.dependencyTracker.recordFutureForcedDependency("textClip", opIdx).inheritPendingDependenciesAsFutureForcedDependencies();
+      }
+    }
+    const current = this.current;
+    const font = current.font;
+    if (font.isType3Font) {
+      const started = this.#beginKnockoutElement(current.fillAlpha);
+      this.showType3Text(opIdx, glyphs);
+      this.dependencyTracker?.recordShowTextOperation(opIdx);
+      this.#endKnockoutElement(started);
+      return;
+    }
+    const fontSize = current.fontSize;
+    if (fontSize === 0) {
+      this.dependencyTracker?.recordOperation(opIdx);
+      return;
+    }
+    const started = this.#beginKnockoutElement(current.fillAlpha);
+    const ctx = this.ctx;
+    const fontSizeScale = current.fontSizeScale;
+    const charSpacing = current.charSpacing;
+    const wordSpacing = current.wordSpacing;
+    const fontDirection = current.fontDirection;
+    const textHScale = current.textHScale * fontDirection;
+    const glyphsLength = glyphs.length;
+    const vertical = font.vertical;
+    const spacingDir = vertical ? 1 : -1;
+    const defaultVMetrics = font.defaultVMetrics;
+    const widthAdvanceScale = fontSize * current.fontMatrix[0];
+    const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill;
+    ctx.save();
+    if (current.textMatrix) {
+      ctx.transform(...current.textMatrix);
+    }
+    ctx.translate(current.x, current.y + current.textRise);
+    if (fontDirection > 0) {
+      ctx.scale(textHScale, -1);
+    } else {
+      ctx.scale(textHScale, 1);
+    }
+    let patternFillTransform, patternStrokeTransform;
+    const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;
+    const needsFill = fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE;
+    const needsStroke = fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE;
+    let lineWidth = current.lineWidth;
+    const scale = current.textMatrixScale;
+    if (scale === 0 || lineWidth === 0) {
+      if (needsStroke) {
+        lineWidth = this.getSinglePixelWidth();
+      }
+    } else {
+      lineWidth /= scale;
+    }
+    if (fontSizeScale !== 1.0) {
+      ctx.scale(fontSizeScale, fontSizeScale);
+      lineWidth /= fontSizeScale;
+    }
+    ctx.lineWidth = lineWidth;
+    if (needsFill && current.patternFill) {
+      ctx.save();
+      const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx);
+      patternFillTransform = getCurrentTransform(ctx);
+      ctx.restore();
+      ctx.fillStyle = pattern;
+    }
+    if (needsStroke && current.patternStroke) {
+      ctx.save();
+      const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx);
+      patternStrokeTransform = getCurrentTransform(ctx);
+      ctx.restore();
+      ctx.strokeStyle = pattern;
+    }
+    if (font.isInvalidPDFjsFont) {
+      const chars = [];
+      let width = 0;
+      for (const glyph of glyphs) {
+        chars.push(glyph.unicode);
+        width += glyph.width;
+      }
+      const joinedChars = chars.join("");
+      ctx.fillText(joinedChars, 0, 0);
+      if (this.dependencyTracker !== null) {
+        const measure = ctx.measureText(joinedChars);
+        this.dependencyTracker.recordBBox(opIdx, this.ctx, -measure.actualBoundingBoxLeft, measure.actualBoundingBoxRight, -measure.actualBoundingBoxAscent, measure.actualBoundingBoxDescent).recordShowTextOperation(opIdx);
+      }
+      current.x += width * widthAdvanceScale * textHScale;
+      ctx.restore();
+      this.compose();
+      this.#endKnockoutElement(started);
+      return;
+    }
+    let x = 0,
+      i;
+    for (i = 0; i < glyphsLength; ++i) {
+      const glyph = glyphs[i];
+      if (typeof glyph === "number") {
+        x += spacingDir * glyph * fontSize / 1000;
+        continue;
+      }
+      let restoreNeeded = false;
+      const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
+      const character = glyph.fontChar;
+      const accent = glyph.accent;
+      let scaledX, scaledY;
+      let width = glyph.width;
+      if (vertical) {
+        const vmetric = glyph.vmetric || defaultVMetrics;
+        const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;
+        const vy = vmetric[2] * widthAdvanceScale;
+        width = vmetric ? -vmetric[0] : width;
+        scaledX = vx / fontSizeScale;
+        scaledY = (x + vy) / fontSizeScale;
+      } else {
+        scaledX = x / fontSizeScale;
+        scaledY = 0;
+      }
+      let measure;
+      if (font.remeasure && width > 0) {
+        measure = ctx.measureText(character);
+        const measuredWidth = measure.width * 1000 / fontSize * fontSizeScale;
+        if (width < measuredWidth && this.isFontSubpixelAAEnabled) {
+          const characterScaleX = width / measuredWidth;
+          restoreNeeded = true;
+          ctx.save();
+          ctx.scale(characterScaleX, 1);
+          scaledX /= characterScaleX;
+        } else if (width !== measuredWidth) {
+          scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;
+        }
+      }
+      if (this.contentVisible && (glyph.isInFont || font.missingFile)) {
+        if (simpleFillText && !accent) {
+          ctx.fillText(character, scaledX, scaledY);
+          this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, measure ? {
+            bbox: null
+          } : font, fontSize / fontSizeScale, scaledX, scaledY, () => measure ?? ctx.measureText(character));
+        } else {
+          this.paintChar(opIdx, character, scaledX, scaledY, patternFillTransform, patternStrokeTransform);
+          if (accent) {
+            const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale;
+            const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale;
+            this.paintChar(opIdx, accent.fontChar, scaledAccentX, scaledAccentY, patternFillTransform, patternStrokeTransform);
+          }
+        }
+      }
+      const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection;
+      x += charWidth;
+      if (restoreNeeded) {
+        ctx.restore();
+      }
+    }
+    if (vertical) {
+      current.y -= x;
+    } else {
+      current.x += x * textHScale;
+    }
+    ctx.restore();
+    this.compose();
+    this.dependencyTracker?.recordShowTextOperation(opIdx);
+    this.#endKnockoutElement(started);
+  }
+  showType3Text(opIdx, glyphs) {
+    const ctx = this.ctx;
+    const current = this.current;
+    const font = current.font;
+    const fontSize = current.fontSize;
+    const fontDirection = current.fontDirection;
+    const spacingDir = font.vertical ? 1 : -1;
+    const charSpacing = current.charSpacing;
+    const wordSpacing = current.wordSpacing;
+    const textHScale = current.textHScale * fontDirection;
+    const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
+    const glyphsLength = glyphs.length;
+    const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE;
+    let i, glyph, width, spacingLength;
+    if (isTextInvisible || fontSize === 0) {
+      return;
+    }
+    this._cachedScaleForStroking[0] = -1;
+    this._cachedGetSinglePixelWidth = null;
+    ctx.save();
+    if (current.textMatrix) {
+      ctx.transform(...current.textMatrix);
+    }
+    ctx.translate(current.x, current.y + current.textRise);
+    ctx.scale(textHScale, fontDirection);
+    const dependencyTracker = this.dependencyTracker;
+    this.dependencyTracker = dependencyTracker ? new CanvasNestedDependencyTracker(dependencyTracker, opIdx) : null;
+    for (i = 0; i < glyphsLength; ++i) {
+      glyph = glyphs[i];
+      if (typeof glyph === "number") {
+        spacingLength = spacingDir * glyph * fontSize / 1000;
+        this.ctx.translate(spacingLength, 0);
+        current.x += spacingLength * textHScale;
+        continue;
+      }
+      const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
+      const operatorList = font.charProcOperatorList[glyph.operatorListId];
+      if (!operatorList) {
+        warn(`Type3 character "${glyph.operatorListId}" is not available.`);
+      } else if (this.contentVisible) {
+        this.save();
+        if (operatorList.fnArray[0] === OPS.setCharWidth) {
+          current.fillAlpha = current.strokeAlpha = 1;
+          ctx.globalAlpha = 1;
+        }
+        ctx.scale(fontSize, fontSize);
+        ctx.transform(...fontMatrix);
+        this.executeOperatorList(operatorList);
+        this.restore();
+      }
+      const p = [glyph.width, 0];
+      Util.applyTransform(p, fontMatrix);
+      width = p[0] * fontSize + spacing;
+      ctx.translate(width, 0);
+      current.x += width * textHScale;
+    }
+    ctx.restore();
+    if (dependencyTracker) {
+      this.dependencyTracker = dependencyTracker;
+    }
+  }
+  setCharWidth(opIdx, xWidth, yWidth) {}
+  setCharWidthAndBounds(opIdx, xWidth, yWidth, llx, lly, urx, ury) {
+    const clip = new Path2D();
+    clip.rect(llx, lly, urx - llx, ury - lly);
+    this.ctx.clip(clip);
+    this.dependencyTracker?.recordBBox(opIdx, this.ctx, llx, urx, lly, ury).recordClipBox(opIdx, this.ctx, llx, urx, lly, ury);
+    this.endPath(opIdx);
+  }
+  getColorN_Pattern(opIdx, IR) {
+    let pattern;
+    if (IR[0] === "TilingPattern") {
+      const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);
+      const canvasGraphicsFactory = {
+        createCanvasGraphics: (ctx, renderingOpIdx) => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
+          optionalContentConfig: this.optionalContentConfig,
+          markedContentStack: this.markedContentStack
+        }, undefined, undefined, this.dependencyTracker ? new CanvasNestedDependencyTracker(this.dependencyTracker, renderingOpIdx, true) : null)
+      };
+      pattern = new TilingPattern(IR, this.ctx, canvasGraphicsFactory, baseTransform);
+    } else {
+      pattern = this._getPattern(opIdx, IR[1], IR[2]);
+    }
+    return pattern;
+  }
+  setStrokeColorN(opIdx, ...args) {
+    this.dependencyTracker?.recordSimpleData("strokeColor", opIdx);
+    this.current.strokeColor = this.getColorN_Pattern(opIdx, args);
+    this.current.patternStroke = true;
+  }
+  setFillColorN(opIdx, ...args) {
+    this.dependencyTracker?.recordSimpleData("fillColor", opIdx);
+    const pattern = this.current.fillColor = this.getColorN_Pattern(opIdx, args);
+    this.current.patternFill = true;
+    this.current.tilingPatternDims = pattern instanceof TilingPattern ? [0, 0, 0, 0] : null;
+  }
+  setStrokeRGBColor(opIdx, color) {
+    this.dependencyTracker?.recordSimpleData("strokeColor", opIdx);
+    this.ctx.strokeStyle = this.current.strokeColor = color;
+    this.current.patternStroke = false;
+  }
+  setStrokeTransparent(opIdx) {
+    this.dependencyTracker?.recordSimpleData("strokeColor", opIdx);
+    this.ctx.strokeStyle = this.current.strokeColor = "transparent";
+    this.current.patternStroke = false;
+  }
+  setFillRGBColor(opIdx, color) {
+    this.dependencyTracker?.recordSimpleData("fillColor", opIdx);
+    this.ctx.fillStyle = this.current.fillColor = color;
+    this.current.patternFill = false;
+    this.current.tilingPatternDims = null;
+  }
+  setFillTransparent(opIdx) {
+    this.dependencyTracker?.recordSimpleData("fillColor", opIdx);
+    this.ctx.fillStyle = this.current.fillColor = "transparent";
+    this.current.patternFill = false;
+    this.current.tilingPatternDims = null;
+  }
+  _getPattern(opIdx, objId, matrix = null) {
+    let pattern;
+    if (this.cachedPatterns.has(objId)) {
+      pattern = this.cachedPatterns.get(objId);
+    } else {
+      pattern = getShadingPattern(this.getObject(opIdx, objId));
+      this.cachedPatterns.set(objId, pattern);
+    }
+    if (matrix) {
+      pattern.matrix = matrix;
+    }
+    return pattern;
+  }
+  shadingFill(opIdx, objId) {
+    if (!this.contentVisible) {
+      return;
+    }
+    const started = this.#beginKnockoutElement(this.current.fillAlpha);
+    const ctx = this.ctx;
+    this.save(opIdx);
+    const pattern = this._getPattern(opIdx, objId);
+    ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING, opIdx);
+    const inv = getCurrentTransformInverse(ctx);
+    if (inv) {
+      const {
+        width,
+        height
+      } = ctx.canvas;
+      const minMax = F32_BBOX_INIT.slice();
+      Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax);
+      const [x0, y0, x1, y1] = minMax;
+      this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+    } else {
+      this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+    }
+    this.dependencyTracker?.resetBBox(opIdx).recordFullPageBBox(opIdx).recordDependencies(opIdx, Dependencies.transform).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx);
+    this.compose(this.current.getClippedPathBoundingBox());
+    this.restore(opIdx);
+    this.#endKnockoutElement(started);
+  }
+  beginInlineImage() {
+    unreachable("Should not call beginInlineImage");
+  }
+  beginImageData() {
+    unreachable("Should not call beginImageData");
+  }
+  paintFormXObjectBegin(opIdx, matrix, bbox) {
+    if (!this.contentVisible) {
+      return;
+    }
+    this.save(opIdx);
+    this.baseTransformStack.push(this.baseTransform);
+    if (matrix) {
+      this.transform(opIdx, ...matrix);
+    }
+    this.baseTransform = getCurrentTransform(this.ctx);
+    if (bbox) {
+      Util.axialAlignedBoundingBox(bbox, this.baseTransform, this.current.minMax);
+      const [x0, y0, x1, y1] = bbox;
+      const clip = new Path2D();
+      clip.rect(x0, y0, x1 - x0, y1 - y0);
+      this.ctx.clip(clip);
+      this.dependencyTracker?.recordClipBox(opIdx, this.ctx, x0, x1, y0, y1);
+      this.endPath(opIdx);
+    }
+  }
+  paintFormXObjectEnd(opIdx) {
+    if (!this.contentVisible) {
+      return;
+    }
+    this.restore(opIdx);
+    this.baseTransform = this.baseTransformStack.pop();
+  }
+  beginGroup(opIdx, group) {
+    if (!this.contentVisible) {
+      return;
+    }
+    this.save(opIdx);
+    const {
+      inSMaskMode
+    } = this;
+    if (inSMaskMode) {
+      this.endSMaskMode();
+      this.current.activeSMask = null;
+    }
+    const currentCtx = this.ctx;
+    if ((!group.needsIsolation || !group.isolated && !group.hasSoftMask) && !group.knockout && !group.isGray && this.#knockoutGroupLevel === 0 && currentCtx.globalAlpha === 1 && currentCtx.globalCompositeOperation === "source-over" && !inSMaskMode) {
+      if (group.bbox) {
+        let clip = new Path2D();
+        const [x0, y0, x1, y1] = group.bbox;
+        clip.rect(x0, y0, x1 - x0, y1 - y0);
+        if (group.matrix) {
+          const path = new Path2D();
+          path.addPath(clip, new DOMMatrix(group.matrix));
+          clip = path;
+        }
+        currentCtx.clip(clip);
+      }
+      this.groupStack.push(null);
+      this.#groupStackMeta.push(null);
+      this.groupLevel++;
+      return;
+    }
+    if (!group.isolated && !group.knockout && this.#knockoutGroupLevel === 0) {
+      info("TODO: Fully support non-isolated non-knockout groups.");
+    }
+    const currentTransform = getCurrentTransform(currentCtx);
+    if (group.matrix) {
+      currentCtx.transform(...group.matrix);
+    }
+    const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];
+    let bounds;
+    if (group.bbox) {
+      bounds = F32_BBOX_INIT.slice();
+      Util.axialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx), bounds);
+      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
+    } else {
+      bounds = canvasBounds;
+    }
+    const offsetX = Math.floor(bounds[0]);
+    const offsetY = Math.floor(bounds[1]);
+    const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
+    const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
+    this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);
+    const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);
+    if (group.smask) {
+      this.smaskGroupCanvases.push(scratchCanvas);
+    }
+    const groupCtx = scratchCanvas.context;
+    const backdropCtx = group.knockout && !group.isolated ? currentCtx : null;
+    const hasInnerBackdrop = !group.isolated && !group.knockout && !group.smask && group.needsIsolation && this.#knockoutGroupLevel > 0;
+    const knockoutMaskEntry = group.knockout ? this.canvasFactory.create(drawnWidth, drawnHeight) : null;
+    const savedKnockoutLevel = this.#knockoutGroupLevel;
+    if (group.knockout) {
+      this.#knockoutGroupLevel++;
+    } else {
+      this.#knockoutGroupLevel = 0;
+    }
+    groupCtx.translate(-offsetX, -offsetY);
+    groupCtx.transform(...currentTransform);
+    if (!group.isolated && !group.smask && inSMaskMode && group.needsIsolation) {
+      groupCtx.save();
+      groupCtx.setTransform(1, 0, 0, 1, 0, 0);
+      groupCtx.drawImage(currentCtx.canvas, -offsetX, -offsetY);
+      groupCtx.restore();
+    }
+    if (group.bbox) {
+      let clip = new Path2D();
+      const [x0, y0, x1, y1] = group.bbox;
+      clip.rect(x0, y0, x1 - x0, y1 - y0);
+      if (group.matrix) {
+        const path = new Path2D();
+        path.addPath(clip, new DOMMatrix(group.matrix));
+        clip = path;
+      }
+      groupCtx.clip(clip);
+    }
+    if (group.smask) {
+      this.smaskStack.push({
+        canvas: scratchCanvas.canvas,
+        context: groupCtx,
+        offsetX,
+        offsetY,
+        subtype: group.smask.subtype,
+        backdrop: group.smask.backdrop,
+        transferMap: group.smask.transferMap || null
+      });
+    }
+    if (!group.smask || this.dependencyTracker) {
+      currentCtx.setTransform(1, 0, 0, 1, 0, 0);
+      currentCtx.translate(offsetX, offsetY);
+      currentCtx.save();
+    }
+    copyCtxState(currentCtx, groupCtx);
+    this.ctx = groupCtx;
+    this.dependencyTracker?.inheritSimpleDataAsFutureForcedDependencies(["fillAlpha", "strokeAlpha", "globalCompositeOperation"]).pushBaseTransform(currentCtx);
+    this.setGState(opIdx, [["BM", "source-over"], ["ca", 1], ["CA", 1], ["TR", null]]);
+    this.groupStack.push(currentCtx);
+    this.#groupStackMeta.push({
+      backdropCtx,
+      savedKnockoutLevel,
+      offsetX,
+      offsetY,
+      hasInnerBackdrop,
+      knockoutMaskEntry,
+      knockoutTempEntry: null,
+      knockoutBackdropEntry: null
+    });
+    this.groupLevel++;
+  }
+  endGroup(opIdx, group) {
+    if (!this.contentVisible) {
+      return;
+    }
+    this.groupLevel--;
+    const groupCtx = this.ctx;
+    const ctx = this.groupStack.pop();
+    const groupMeta = this.#groupStackMeta.pop();
+    if (groupMeta) {
+      this.#knockoutGroupLevel = groupMeta.savedKnockoutLevel;
+    }
+    if (ctx === null) {
+      this.restore(opIdx);
+      return;
+    }
+    if (group.isGray) {
+      this.#convertGroupToGray(groupCtx);
+    }
+    this.ctx = ctx;
+    this.ctx.imageSmoothingEnabled = false;
+    this.dependencyTracker?.popBaseTransform();
+    if (group.smask) {
+      this.tempSMask = this.smaskStack.pop();
+      this.restore(opIdx);
+      if (this.dependencyTracker) {
+        this.ctx.restore();
+        if (this.inSMaskMode) {
+          this.ctx.setTransform(this.suspendedCtx.getTransform());
+        }
+      }
+      this.#destroyKnockoutPools(groupMeta);
+    } else {
+      this.ctx.restore();
+      const currentMtx = getCurrentTransform(this.ctx);
+      this.restore(opIdx);
+      this.ctx.save();
+      this.ctx.setTransform(...currentMtx);
+      const dirtyBox = F32_BBOX_INIT.slice();
+      Util.axialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx, dirtyBox);
+      const parentGroupMeta = this.#groupStackMeta.at(-1);
+      if (this.#knockoutGroupLevel > 0) {
+        if (groupMeta.hasInnerBackdrop) {
+          const {
+            width,
+            height
+          } = groupCtx.canvas;
+          const colorEntry = this.canvasFactory.create(width, height);
+          const colorCtx = colorEntry.context;
+          colorCtx.drawImage(ctx.canvas, groupMeta.offsetX, groupMeta.offsetY, width, height, 0, 0, width, height);
+          colorCtx.globalCompositeOperation = "source-over";
+          colorCtx.drawImage(groupCtx.canvas, 0, 0);
+          const shapeMaskEntry = this.#createKnockoutMaskCanvas(groupCtx.canvas);
+          colorCtx.globalCompositeOperation = "destination-in";
+          colorCtx.drawImage(shapeMaskEntry.canvas, 0, 0);
+          const sourceCompositeOperation = this.ctx.globalCompositeOperation;
+          const sourceAlpha = this.ctx.globalAlpha;
+          const sourceFilter = this.ctx.filter;
+          this.ctx.save();
+          this.ctx.setTransform(...currentMtx);
+          this.ctx.globalAlpha = 1;
+          if (FeatureTest.isCanvasFilterSupported) {
+            this.ctx.filter = "none";
+          }
+          this.ctx.globalCompositeOperation = "destination-out";
+          this.ctx.drawImage(shapeMaskEntry.canvas, 0, 0);
+          this.ctx.globalCompositeOperation = sourceCompositeOperation;
+          this.ctx.globalAlpha = sourceAlpha;
+          if (FeatureTest.isCanvasFilterSupported) {
+            this.ctx.filter = sourceFilter ?? "none";
+          }
+          this.ctx.drawImage(colorEntry.canvas, 0, 0);
+          this.ctx.restore();
+          this.canvasFactory.destroy(shapeMaskEntry);
+          this.canvasFactory.destroy(colorEntry);
+        } else {
+          const backdropCtx = parentGroupMeta?.backdropCtx ?? null;
+          this.#compositeKnockoutSurface(this.ctx, groupCtx.canvas, {
+            backdropCanvas: backdropCtx?.canvas ?? null,
+            destTransform: currentMtx,
+            backdropOffset: backdropCtx ? [parentGroupMeta.offsetX + groupMeta.offsetX, parentGroupMeta.offsetY + groupMeta.offsetY] : [0, 0],
+            sourceAlpha: this.ctx.globalAlpha,
+            sourceFilter: this.ctx.filter
+          });
+        }
+      } else {
+        this.ctx.drawImage(groupCtx.canvas, 0, 0);
+      }
+      this.ctx.restore();
+      this.canvasFactory.destroy({
+        canvas: groupCtx.canvas,
+        context: groupCtx
+      });
+      this.#destroyKnockoutPools(groupMeta);
+      this.compose(dirtyBox);
+    }
+  }
+  #convertGroupToGray(groupCtx) {
+    const {
+      canvas
+    } = groupCtx;
+    const {
+      width,
+      height
+    } = canvas;
+    if (FeatureTest.isCanvasFilterSupported) {
+      groupCtx.save();
+      groupCtx.setTransform(1, 0, 0, 1, 0, 0);
+      groupCtx.filter = "grayscale(1)";
+      groupCtx.globalAlpha = 1;
+      groupCtx.globalCompositeOperation = "copy";
+      groupCtx.drawImage(canvas, 0, 0);
+      groupCtx.restore();
+      return;
+    }
+    const imageData = groupCtx.getImageData(0, 0, width, height);
+    const {
+      data
+    } = imageData;
+    for (let i = 0, ii = data.length; i < ii; i += 4) {
+      const gray = data[i] * 0.2126 + data[i + 1] * 0.7152 + data[i + 2] * 0.0722 + 0.5 | 0;
+      data[i] = data[i + 1] = data[i + 2] = gray;
+    }
+    groupCtx.putImageData(imageData, 0, 0);
+  }
+  #destroyKnockoutPools(groupMeta) {
+    if (!groupMeta) {
+      return;
+    }
+    if (groupMeta.knockoutMaskEntry) {
+      this.canvasFactory.destroy(groupMeta.knockoutMaskEntry);
+      groupMeta.knockoutMaskEntry = null;
+    }
+    if (groupMeta.knockoutTempEntry) {
+      this.canvasFactory.destroy(groupMeta.knockoutTempEntry);
+      groupMeta.knockoutTempEntry = null;
+    }
+    if (groupMeta.knockoutBackdropEntry) {
+      this.canvasFactory.destroy(groupMeta.knockoutBackdropEntry);
+      groupMeta.knockoutBackdropEntry = null;
+    }
+  }
+  beginAnnotation(opIdx, id, rect, transform, matrix, hasOwnCanvas, canvasName) {
+    this.#restoreInitialState();
+    resetCtxToDefault(this.ctx);
+    this.ctx.save();
+    this.save(opIdx);
+    if (this.baseTransform) {
+      this.ctx.setTransform(...this.baseTransform);
+    }
+    if (rect) {
+      const width = rect[2] - rect[0];
+      const height = rect[3] - rect[1];
+      if (hasOwnCanvas && this.annotationCanvasMap) {
+        transform = transform.slice();
+        transform[4] -= rect[0];
+        transform[5] -= rect[1];
+        rect = rect.slice();
+        rect[0] = rect[1] = 0;
+        rect[2] = width;
+        rect[3] = height;
+        Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY);
+        const {
+          viewportScale
+        } = this;
+        const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale);
+        const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale);
+        this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight);
+        const {
+          canvas,
+          context
+        } = this.annotationCanvas;
+        if (canvasName) {
+          const canvases = this.annotationCanvasMap.getOrInsertComputed(id, makeArr);
+          canvas.setAttribute("data-canvas-name", canvasName);
+          const index = canvases.findIndex(c => c.getAttribute("data-canvas-name") === canvasName);
+          if (index === -1) {
+            canvases.push(canvas);
+          } else {
+            canvases[index] = canvas;
+          }
+        } else {
+          this.annotationCanvasMap.set(id, canvas);
+        }
+        this.annotationCanvas.savedCtx = this.ctx;
+        this.ctx = context;
+        this.ctx.save();
+        this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]);
+        resetCtxToDefault(this.ctx);
+      } else {
+        resetCtxToDefault(this.ctx);
+        this.endPath(opIdx);
+        const clip = new Path2D();
+        clip.rect(rect[0], rect[1], width, height);
+        this.ctx.clip(clip);
+      }
+    }
+    this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height);
+    this.baseTransformStack.push(this.baseTransform);
+    this.transform(opIdx, ...transform);
+    this.transform(opIdx, ...matrix);
+    this.baseTransform = getCurrentTransform(this.ctx);
+  }
+  endAnnotation(opIdx) {
+    if (this.annotationCanvas) {
+      this.ctx.restore();
+      this.#drawFilter();
+      this.ctx = this.annotationCanvas.savedCtx;
+      delete this.annotationCanvas.savedCtx;
+      delete this.annotationCanvas;
+    }
+    this.baseTransform = this.baseTransformStack.pop();
+  }
+  paintImageMaskXObject(opIdx, img) {
+    if (!this.contentVisible) {
+      return;
+    }
+    const count = img.count;
+    img = this.getObject(opIdx, img.data, img);
+    img.count = count;
+    const started = this.#beginKnockoutElement(this.current.fillAlpha);
+    const ctx = this.ctx;
+    const mask = this._createMaskCanvas(opIdx, img);
+    const maskCanvas = mask.canvas;
+    ctx.save();
+    ctx.setTransform(1, 0, 0, 1, 0, 0);
+    ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);
+    this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, mask.offsetX, mask.offsetX + maskCanvas.width, mask.offsetY, mask.offsetY + maskCanvas.height).recordOperation(opIdx);
+    ctx.restore();
+    if (mask.canvasEntry) {
+      this.canvasFactory.destroy(mask.canvasEntry);
+    }
+    this.compose();
+    this.#endKnockoutElement(started);
+  }
+  paintImageMaskXObjectRepeat(opIdx, img, scaleX, skewX = 0, skewY = 0, scaleY, positions) {
+    if (!this.contentVisible) {
+      return;
+    }
+    img = this.getObject(opIdx, img.data, img);
+    const started = this.#beginKnockoutElement(this.current.fillAlpha);
+    const ctx = this.ctx;
+    ctx.save();
+    const currentTransform = getCurrentTransform(ctx);
+    ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);
+    const mask = this._createMaskCanvas(opIdx, img);
+    ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]);
+    this.dependencyTracker?.resetBBox(opIdx);
+    for (let i = 0, ii = positions.length; i < ii; i += 2) {
+      const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]);
+      ctx.drawImage(mask.canvas, trans[4], trans[5]);
+      this.dependencyTracker?.recordBBox(opIdx, this.ctx, trans[4], trans[4] + mask.canvas.width, trans[5], trans[5] + mask.canvas.height);
+    }
+    ctx.restore();
+    if (mask.canvasEntry) {
+      this.canvasFactory.destroy(mask.canvasEntry);
+    }
+    this.compose();
+    this.dependencyTracker?.recordOperation(opIdx);
+    this.#endKnockoutElement(started);
+  }
+  paintImageMaskXObjectGroup(opIdx, images) {
+    if (!this.contentVisible) {
+      return;
+    }
+    const started = this.#beginKnockoutElement(this.current.fillAlpha);
+    const ctx = this.ctx;
+    const fillColor = this.current.fillColor;
+    const isPatternFill = this.current.patternFill;
+    this.dependencyTracker?.resetBBox(opIdx).recordDependencies(opIdx, Dependencies.transformAndFill);
+    for (const image of images) {
+      const {
+        data,
+        width,
+        height,
+        transform
+      } = image;
+      const maskCanvas = this.canvasFactory.create(width, height);
+      const maskCtx = maskCanvas.context;
+      maskCtx.save();
+      const img = this.getObject(opIdx, data, image);
+      putBinaryImageMask(maskCtx, img);
+      maskCtx.globalCompositeOperation = "source-in";
+      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx) : fillColor;
+      maskCtx.fillRect(0, 0, width, height);
+      maskCtx.restore();
+      ctx.save();
+      ctx.transform(...transform);
+      ctx.scale(1, -1);
+      drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);
+      this.canvasFactory.destroy(maskCanvas);
+      this.dependencyTracker?.recordBBox(opIdx, ctx, 0, width, 0, height);
+      ctx.restore();
+    }
+    this.compose();
+    this.dependencyTracker?.recordOperation(opIdx);
+    this.#endKnockoutElement(started);
+  }
+  paintImageXObject(opIdx, objId) {
+    if (!this.contentVisible) {
+      return;
+    }
+    const imgData = this.getObject(opIdx, objId);
+    if (!imgData) {
+      warn("Dependent image isn't ready yet");
+      return;
+    }
+    this.paintInlineImageXObject(opIdx, imgData);
+  }
+  paintImageXObjectRepeat(opIdx, objId, scaleX, scaleY, positions) {
+    if (!this.contentVisible) {
+      return;
+    }
+    const imgData = this.getObject(opIdx, objId);
+    if (!imgData) {
+      warn("Dependent image isn't ready yet");
+      return;
+    }
+    const width = imgData.width;
+    const height = imgData.height;
+    const map = [];
+    for (let i = 0, ii = positions.length; i < ii; i += 2) {
+      map.push({
+        transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],
+        x: 0,
+        y: 0,
+        w: width,
+        h: height
+      });
+    }
+    this.paintInlineImageXObjectGroup(opIdx, imgData, map);
+  }
+  applyTransferMapsToCanvas(ctx) {
+    if (this.current.transferMaps !== "none") {
+      ctx.filter = this.current.transferMaps;
+      ctx.drawImage(ctx.canvas, 0, 0);
+      ctx.filter = "none";
+    }
+    return ctx.canvas;
+  }
+  applyTransferMapsToBitmap(imgData) {
+    if (this.current.transferMaps === "none") {
+      return {
+        img: imgData.bitmap,
+        canvasEntry: null
+      };
+    }
+    const {
+      bitmap,
+      width,
+      height
+    } = imgData;
+    const tmpCanvas = this.canvasFactory.create(width, height);
+    const tmpCtx = tmpCanvas.context;
+    tmpCtx.filter = this.current.transferMaps;
+    tmpCtx.drawImage(bitmap, 0, 0);
+    tmpCtx.filter = "none";
+    return {
+      img: tmpCanvas.canvas,
+      canvasEntry: tmpCanvas
+    };
+  }
+  paintInlineImageXObject(opIdx, imgData) {
+    if (!this.contentVisible) {
+      return;
+    }
+    const width = imgData.width;
+    const height = imgData.height;
+    const started = this.#beginKnockoutElement(this.current.fillAlpha);
+    const ctx = this.ctx;
+    this.save(opIdx);
+    const {
+      filter
+    } = ctx;
+    if (filter !== "none" && filter !== "") {
+      ctx.filter = "none";
+    }
+    ctx.scale(1 / width, -1 / height);
+    let imgToPaint;
+    let inlineImgCanvas = null;
+    if (imgData.bitmap) {
+      const result = this.applyTransferMapsToBitmap(imgData);
+      imgToPaint = result.img;
+      inlineImgCanvas = result.canvasEntry;
+    } else {
+      const tmpCanvas = this.canvasFactory.create(width, height);
+      putBinaryImageData(tmpCanvas.context, imgData);
+      imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context);
+      inlineImgCanvas = tmpCanvas;
+    }
+    const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx));
+    ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate);
+    if (this.dependencyTracker) {
+      this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, ctx, 0, width, -height, 0).recordDependencies(opIdx, Dependencies.imageXObject).recordOperation(opIdx);
+      this.imagesTracker?.record(ctx, width, height, this.dependencyTracker.clipBox);
+    }
+    drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height);
+    if (scaled.tmpCanvas) {
+      this.canvasFactory.destroy(scaled.tmpCanvas);
+    }
+    if (inlineImgCanvas) {
+      this.canvasFactory.destroy(inlineImgCanvas);
+    }
+    this.compose();
+    this.restore(opIdx);
+    this.#endKnockoutElement(started);
+  }
+  paintInlineImageXObjectGroup(opIdx, imgData, map) {
+    if (!this.contentVisible) {
+      return;
+    }
+    const started = this.#beginKnockoutElement(this.current.fillAlpha);
+    const ctx = this.ctx;
+    let imgToPaint;
+    let inlineImgCanvas = null;
+    if (imgData.bitmap) {
+      imgToPaint = imgData.bitmap;
+    } else {
+      const w = imgData.width;
+      const h = imgData.height;
+      const tmpCanvas = this.canvasFactory.create(w, h);
+      putBinaryImageData(tmpCanvas.context, imgData);
+      imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context);
+      inlineImgCanvas = tmpCanvas;
+    }
+    this.dependencyTracker?.resetBBox(opIdx);
+    for (const entry of map) {
+      ctx.save();
+      ctx.transform(...entry.transform);
+      ctx.scale(1, -1);
+      drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);
+      this.dependencyTracker?.recordBBox(opIdx, ctx, 0, 1, -1, 0);
+      ctx.restore();
+    }
+    if (inlineImgCanvas) {
+      this.canvasFactory.destroy(inlineImgCanvas);
+    }
+    this.dependencyTracker?.recordOperation(opIdx);
+    this.compose();
+    this.#endKnockoutElement(started);
+  }
+  paintSolidColorImageMask(opIdx) {
+    if (!this.contentVisible) {
+      return;
+    }
+    const started = this.#beginKnockoutElement(this.current.fillAlpha);
+    this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, 0, 1, 0, 1).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx);
+    this.ctx.fillRect(0, 0, 1, 1);
+    this.compose();
+    this.#endKnockoutElement(started);
+  }
+  markPoint(opIdx, tag) {}
+  markPointProps(opIdx, tag, properties) {}
+  beginMarkedContent(opIdx, tag) {
+    this.dependencyTracker?.beginMarkedContent(opIdx);
+    this.markedContentStack.push({
+      visible: true
+    });
+  }
+  beginMarkedContentProps(opIdx, tag, properties) {
+    this.dependencyTracker?.beginMarkedContent(opIdx);
+    if (tag === "OC") {
+      this.markedContentStack.push({
+        visible: this.optionalContentConfig.isVisible(properties)
+      });
+    } else {
+      this.markedContentStack.push({
+        visible: true
+      });
+    }
+    this.contentVisible = this.isContentVisible();
+  }
+  endMarkedContent(opIdx) {
+    this.dependencyTracker?.endMarkedContent(opIdx);
+    this.markedContentStack.pop();
+    this.contentVisible = this.isContentVisible();
+  }
+  beginCompat(opIdx) {}
+  endCompat(opIdx) {}
+  consumePath(opIdx, path, clipBox) {
+    const isEmpty = this.current.isEmptyClip();
+    if (this.pendingClip) {
+      this.current.updateClipFromPath();
+    }
+    if (!this.pendingClip) {
+      this.compose(clipBox);
+    }
+    const ctx = this.ctx;
+    if (this.pendingClip) {
+      if (!isEmpty) {
+        if (this.pendingClip === EO_CLIP) {
+          ctx.clip(path, "evenodd");
+        } else {
+          ctx.clip(path);
+        }
+      }
+      this.pendingClip = null;
+      this.dependencyTracker?.bboxToClipBoxDropOperation(opIdx).recordFutureForcedDependency("clipPath", opIdx);
+    } else {
+      this.dependencyTracker?.recordOperation(opIdx);
+    }
+    this.current.startNewPathAndClipBox(this.current.clipBox);
+  }
+  getSinglePixelWidth() {
+    if (!this._cachedGetSinglePixelWidth) {
+      const m = getCurrentTransform(this.ctx);
+      if (m[1] === 0 && m[2] === 0) {
+        this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));
+      } else {
+        const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);
+        const normX = Math.hypot(m[0], m[2]);
+        const normY = Math.hypot(m[1], m[3]);
+        this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;
+      }
+    }
+    return this._cachedGetSinglePixelWidth;
+  }
+  getScaleForStroking() {
+    if (this._cachedScaleForStroking[0] === -1) {
+      const {
+        lineWidth
+      } = this.current;
+      const {
+        a,
+        b,
+        c,
+        d
+      } = this.ctx.getTransform();
+      let scaleX, scaleY;
+      if (b === 0 && c === 0) {
+        const normX = Math.abs(a);
+        const normY = Math.abs(d);
+        if (normX === normY) {
+          if (lineWidth === 0) {
+            scaleX = scaleY = 1 / normX;
+          } else {
+            const scaledLineWidth = normX * lineWidth;
+            scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;
+          }
+        } else if (lineWidth === 0) {
+          scaleX = 1 / normX;
+          scaleY = 1 / normY;
+        } else {
+          const scaledXLineWidth = normX * lineWidth;
+          const scaledYLineWidth = normY * lineWidth;
+          scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;
+          scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;
+        }
+      } else {
+        const absDet = Math.abs(a * d - b * c);
+        const normX = Math.hypot(a, b);
+        const normY = Math.hypot(c, d);
+        if (lineWidth === 0) {
+          scaleX = normY / absDet;
+          scaleY = normX / absDet;
+        } else {
+          const baseArea = lineWidth * absDet;
+          scaleX = normY > baseArea ? normY / baseArea : 1;
+          scaleY = normX > baseArea ? normX / baseArea : 1;
+        }
+      }
+      this._cachedScaleForStroking[0] = scaleX;
+      this._cachedScaleForStroking[1] = scaleY;
+    }
+    return this._cachedScaleForStroking;
+  }
+  rescaleAndStroke(path, saveRestore) {
+    const {
+      ctx,
+      current: {
+        lineWidth
+      }
+    } = this;
+    const [scaleX, scaleY] = this.getScaleForStroking();
+    if (scaleX === scaleY) {
+      ctx.lineWidth = (lineWidth || 1) * scaleX;
+      ctx.stroke(path);
+      return;
+    }
+    const dashes = ctx.getLineDash();
+    if (saveRestore) {
+      ctx.save();
+    }
+    ctx.scale(scaleX, scaleY);
+    SCALE_MATRIX.a = 1 / scaleX;
+    SCALE_MATRIX.d = 1 / scaleY;
+    const newPath = new Path2D();
+    newPath.addPath(path, SCALE_MATRIX);
+    if (dashes.length > 0) {
+      const scale = Math.max(scaleX, scaleY);
+      ctx.setLineDash(dashes.map(x => x / scale));
+      ctx.lineDashOffset /= scale;
+    }
+    ctx.lineWidth = lineWidth || 1;
+    ctx.stroke(newPath);
+    if (saveRestore) {
+      ctx.restore();
+    }
+  }
+  isContentVisible() {
+    for (let i = this.markedContentStack.length - 1; i >= 0; i--) {
+      if (!this.markedContentStack[i].visible) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+for (const op in OPS) {
+  if (CanvasGraphics.prototype[op] !== undefined) {
+    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];
+  }
+}
+
+;// ./src/shared/base_pdf_stream.js
+
+class BasePDFStream {
+  #PDFStreamReader = null;
+  #PDFStreamRangeReader = null;
+  _fullReader = null;
+  _rangeReaders = new Set();
+  _source = null;
+  constructor(source, PDFStreamReader, PDFStreamRangeReader) {
+    this._source = source;
+    this.#PDFStreamReader = PDFStreamReader;
+    this.#PDFStreamRangeReader = PDFStreamRangeReader;
+  }
+  get _progressiveDataLength() {
+    return this._fullReader?._loaded ?? 0;
+  }
+  getFullReader() {
+    assert(!this._fullReader, "BasePDFStream.getFullReader can only be called once.");
+    return this._fullReader = new this.#PDFStreamReader(this);
+  }
+  getRangeReader(begin, end) {
+    if (end <= this._progressiveDataLength) {
+      return null;
+    }
+    const reader = new this.#PDFStreamRangeReader(this, begin, end);
+    this._rangeReaders.add(reader);
+    return reader;
+  }
+  cancelAllRequests(reason) {
+    this._fullReader?.cancel(reason);
+    for (const reader of new Set(this._rangeReaders)) {
+      reader.cancel(reason);
+    }
+  }
+}
+class BasePDFStreamReader {
+  onProgress = null;
+  _contentLength = 0;
+  _filename = null;
+  _headersCapability = Promise.withResolvers();
+  _isRangeSupported = false;
+  _isStreamingSupported = false;
+  _loaded = 0;
+  _stream = null;
+  constructor(stream) {
+    this._stream = stream;
+  }
+  _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(reason) {
+    unreachable("Abstract method `cancel` called");
+  }
+}
+class BasePDFStreamRangeReader {
+  _stream = null;
+  constructor(stream, begin, end) {
+    this._stream = stream;
+  }
+  async read() {
+    unreachable("Abstract method `read` called");
+  }
+  cancel(reason) {
+    unreachable("Abstract method `cancel` called");
+  }
+}
+
+;// ./src/display/content_disposition.js
+
+function getFilenameFromContentDispositionHeader(contentDisposition) {
+  let needsEncodingFixup = true;
+  let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition);
+  if (tmp) {
+    tmp = tmp[1];
+    let filename = rfc2616unquote(tmp);
+    filename = unescape(filename);
+    filename = rfc5987decode(filename);
+    filename = rfc2047decode(filename);
+    return fixupEncoding(filename);
+  }
+  tmp = rfc2231getparam(contentDisposition);
+  if (tmp) {
+    const filename = rfc2047decode(tmp);
+    return fixupEncoding(filename);
+  }
+  tmp = toParamRegExp("filename", "i").exec(contentDisposition);
+  if (tmp) {
+    tmp = tmp[1];
+    let filename = rfc2616unquote(tmp);
+    filename = rfc2047decode(filename);
+    return fixupEncoding(filename);
+  }
+  function toParamRegExp(attributePattern, flags) {
+    return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags);
+  }
+  function textdecode(encoding, value) {
+    if (encoding) {
+      if (!/^[\x00-\xFF]+$/.test(value)) {
+        return value;
+      }
+      try {
+        const decoder = new TextDecoder(encoding, {
+          fatal: true
+        });
+        const buffer = stringToBytes(value);
+        value = decoder.decode(buffer);
+        needsEncodingFixup = false;
+      } catch {}
+    }
+    return value;
+  }
+  function fixupEncoding(value) {
+    if (needsEncodingFixup && /[\x80-\xff]/.test(value)) {
+      value = textdecode("utf-8", value);
+      if (needsEncodingFixup) {
+        value = textdecode("iso-8859-1", value);
+      }
+    }
+    return value;
+  }
+  function rfc2231getparam(contentDispositionStr) {
+    const matches = [];
+    let match;
+    const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig");
+    while ((match = iter.exec(contentDispositionStr)) !== null) {
+      let [, n, quot, part] = match;
+      n = parseInt(n, 10);
+      if (n in matches) {
+        if (n === 0) {
+          break;
+        }
+        continue;
+      }
+      matches[n] = [quot, part];
+    }
+    const parts = [];
+    for (let n = 0; n < matches.length; ++n) {
+      if (!(n in matches)) {
+        break;
+      }
+      let [quot, part] = matches[n];
+      part = rfc2616unquote(part);
+      if (quot) {
+        part = unescape(part);
+        if (n === 0) {
+          part = rfc5987decode(part);
+        }
+      }
+      parts.push(part);
+    }
+    return parts.join("");
+  }
+  function rfc2616unquote(value) {
+    if (value.startsWith('"')) {
+      const parts = value.slice(1).split('\\"');
+      for (let i = 0; i < parts.length; ++i) {
+        const quotindex = parts[i].indexOf('"');
+        if (quotindex !== -1) {
+          parts[i] = parts[i].slice(0, quotindex);
+          parts.length = i + 1;
+        }
+        parts[i] = parts[i].replaceAll(/\\(.)/g, "$1");
+      }
+      value = parts.join('"');
+    }
+    return value;
+  }
+  function rfc5987decode(extvalue) {
+    const encodingend = extvalue.indexOf("'");
+    if (encodingend === -1) {
+      return extvalue;
+    }
+    const encoding = extvalue.slice(0, encodingend);
+    const langvalue = extvalue.slice(encodingend + 1);
+    const value = langvalue.replace(/^[^']*'/, "");
+    return textdecode(encoding, value);
+  }
+  function rfc2047decode(value) {
+    if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) {
+      return value;
+    }
+    return value.replaceAll(/=\?([\w-]*)\?([QB])\?((?:[^?]|\?(?!=))*)\?=/gi, function (matches, charset, encoding, text) {
+      if (encoding === "q" || encoding === "Q") {
+        text = text.replaceAll("_", " ");
+        text = text.replaceAll(/=([0-9a-f]{2})/gi, function (match, hex) {
+          return String.fromCharCode(parseInt(hex, 16));
+        });
+        return textdecode(charset, text);
+      }
+      try {
+        text = atob(text);
+      } catch {}
+      return textdecode(charset, text);
+    });
+  }
+  return "";
+}
+
+;// ./src/display/network_utils.js
+
+
+
+function createHeaders(isHttp, httpHeaders) {
+  const headers = new Headers();
+  if (!isHttp || !httpHeaders || typeof httpHeaders !== "object") {
+    return headers;
+  }
+  for (const key in httpHeaders) {
+    const val = httpHeaders[key];
+    if (val !== undefined) {
+      headers.append(key, val);
+    }
+  }
+  return headers;
+}
+function getResponseOrigin(url) {
+  return URL.parse(url)?.origin ?? null;
+}
+function validateRangeRequestCapabilities({
+  responseHeaders,
+  isHttp,
+  rangeChunkSize,
+  disableRange
+}) {
+  const rv = {
+    contentLength: 0,
+    isRangeSupported: false
+  };
+  const length = parseInt(responseHeaders.get("Content-Length"), 10);
+  if (!Number.isInteger(length)) {
+    return rv;
+  }
+  rv.contentLength = length;
+  if (length <= 2 * rangeChunkSize) {
+    return rv;
+  }
+  if (disableRange || !isHttp) {
+    return rv;
+  }
+  if (responseHeaders.get("Accept-Ranges") !== "bytes") {
+    return rv;
+  }
+  const contentEncoding = responseHeaders.get("Content-Encoding") || "identity";
+  if (contentEncoding === "identity") {
+    rv.isRangeSupported = true;
+  }
+  return rv;
+}
+function extractFilenameFromHeader(responseHeaders) {
+  const contentDisposition = responseHeaders.get("Content-Disposition");
+  if (contentDisposition) {
+    let filename = getFilenameFromContentDispositionHeader(contentDisposition);
+    if (filename.includes("%")) {
+      try {
+        filename = decodeURIComponent(filename);
+      } catch {}
+    }
+    if (isPdfFile(filename)) {
+      return filename;
+    }
+  }
+  return null;
+}
+function createResponseError(status, url) {
+  return new ResponseException(`Unexpected server response (${status}) while retrieving PDF "${url.href}".`, status, status === 404 || status === 0 && url.protocol === "file:");
+}
+function ensureResponseOrigin(rangeOrigin, origin) {
+  if (rangeOrigin !== origin) {
+    throw new Error(`Expected range response-origin "${rangeOrigin}" to match "${origin}".`);
+  }
+}
+
+;// ./src/display/fetch_stream.js
+
+
+
+function fetchUrl(url, headers, withCredentials, abortController) {
+  return fetch(url, {
+    method: "GET",
+    headers,
+    signal: abortController.signal,
+    mode: "cors",
+    credentials: withCredentials ? "include" : "same-origin",
+    redirect: "follow"
+  });
+}
+function ensureResponseStatus(status, url) {
+  if (status !== 200 && status !== 206) {
+    throw createResponseError(status, url);
+  }
+}
+function getArrayBuffer(val) {
+  if (val instanceof Uint8Array) {
+    return val.buffer;
+  }
+  if (val instanceof ArrayBuffer) {
+    return val;
+  }
+  throw new Error(`getArrayBuffer - unexpected data: ${val}`);
+}
+class PDFFetchStream extends BasePDFStream {
+  _responseOrigin = null;
+  constructor(source) {
+    super(source, PDFFetchStreamReader, PDFFetchStreamRangeReader);
+    const {
+      httpHeaders,
+      url
+    } = source;
+    assert(/https?:/.test(url.protocol), "PDFFetchStream only supports http(s):// URLs.");
+    this.headers = createHeaders(true, httpHeaders);
+  }
+}
+class PDFFetchStreamReader extends BasePDFStreamReader {
+  _abortController = new AbortController();
+  _reader = null;
+  constructor(stream) {
+    super(stream);
+    const {
+      disableRange,
+      disableStream,
+      rangeChunkSize,
+      url,
+      withCredentials
+    } = stream._source;
+    this._isStreamingSupported = !disableStream;
+    const headers = new Headers(stream.headers);
+    fetchUrl(url, headers, withCredentials, this._abortController).then(response => {
+      stream._responseOrigin = getResponseOrigin(response.url);
+      ensureResponseStatus(response.status, url);
+      this._reader = response.body.getReader();
+      const responseHeaders = response.headers;
+      const {
+        contentLength,
+        isRangeSupported
+      } = validateRangeRequestCapabilities({
+        responseHeaders,
+        isHttp: true,
+        rangeChunkSize,
+        disableRange
+      });
+      this._contentLength = contentLength;
+      this._isRangeSupported = isRangeSupported;
+      this._filename = extractFilenameFromHeader(responseHeaders);
+      if (!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,
+      done
+    } = await this._reader.read();
+    if (done) {
+      return {
+        value,
+        done
+      };
+    }
+    this._loaded += value.byteLength;
+    this._callOnProgress();
+    return {
+      value: getArrayBuffer(value),
+      done: false
+    };
+  }
+  cancel(reason) {
+    this._reader?.cancel(reason);
+    this._abortController.abort();
+  }
+}
+class PDFFetchStreamRangeReader extends BasePDFStreamRangeReader {
+  _abortController = new AbortController();
+  _readCapability = Promise.withResolvers();
+  _reader = null;
+  constructor(stream, begin, end) {
+    super(stream, begin, end);
+    const {
+      url,
+      withCredentials
+    } = stream._source;
+    const headers = new Headers(stream.headers);
+    headers.append("Range", `bytes=${begin}-${end - 1}`);
+    fetchUrl(url, headers, withCredentials, this._abortController).then(response => {
+      const responseOrigin = getResponseOrigin(response.url);
+      ensureResponseOrigin(responseOrigin, stream._responseOrigin);
+      ensureResponseStatus(response.status, url);
+      this._reader = response.body.getReader();
+      this._readCapability.resolve();
+    }).catch(this._readCapability.reject);
+  }
+  async read() {
+    await this._readCapability.promise;
+    const {
+      value,
+      done
+    } = await this._reader.read();
+    if (done) {
+      return {
+        value,
+        done
+      };
+    }
+    return {
+      value: getArrayBuffer(value),
+      done: false
+    };
+  }
+  cancel(reason) {
+    this._reader?.cancel(reason);
+    this._abortController.abort();
+  }
+}
+
+;// ./src/display/transport_stream.js
+
+
+
+function transport_stream_getArrayBuffer(val) {
+  return val instanceof Uint8Array && val.byteLength === val.buffer.byteLength ? val.buffer : new Uint8Array(val).buffer;
+}
+function endRequests() {
+  for (const capability of this._requests) {
+    capability.resolve({
+      value: undefined,
+      done: true
+    });
+  }
+  this._requests.length = 0;
+}
+class PDFDataTransportStream extends BasePDFStream {
+  _progressiveDone = false;
+  _queuedChunks = [];
+  constructor(source) {
+    super(source, PDFDataTransportStreamReader, PDFDataTransportStreamRangeReader);
+    const {
+      pdfDataRangeTransport
+    } = source;
+    const {
+      initialData,
+      progressiveDone
+    } = pdfDataRangeTransport;
+    if (initialData?.length > 0) {
+      const buffer = transport_stream_getArrayBuffer(initialData);
+      this._queuedChunks.push(buffer);
+    }
+    this._progressiveDone = progressiveDone;
+    const listener = args => {
+      switch (args.type) {
+        case "range":
+        case "progressiveRead":
+          this.#onReceiveData(args.begin, args.chunk);
+          break;
+        case "progressiveDone":
+          this._fullReader?.progressiveDone();
+          this._progressiveDone = true;
+          break;
+      }
+    };
+    pdfDataRangeTransport.transportReady(listener);
+  }
+  #onReceiveData(begin, chunk) {
+    const buffer = transport_stream_getArrayBuffer(chunk);
+    if (begin === undefined) {
+      if (this._fullReader) {
+        this._fullReader._enqueue(buffer);
+      } else {
+        this._queuedChunks.push(buffer);
+      }
+    } else {
+      const rangeReader = this._rangeReaders.keys().find(r => r._begin === begin);
+      assert(rangeReader, "#onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.");
+      rangeReader._enqueue(buffer);
+    }
+  }
+  getFullReader() {
+    const reader = super.getFullReader();
+    this._queuedChunks = null;
+    return reader;
+  }
+  getRangeReader(begin, end) {
+    const reader = super.getRangeReader(begin, end);
+    if (reader) {
+      reader.onDone = () => this._rangeReaders.delete(reader);
+      this._source.pdfDataRangeTransport.requestDataRange(begin, end);
+    }
+    return reader;
+  }
+  cancelAllRequests(reason) {
+    super.cancelAllRequests(reason);
+    this._source.pdfDataRangeTransport.abort();
+  }
+}
+class PDFDataTransportStreamReader extends BasePDFStreamReader {
+  #endRequests = endRequests.bind(this);
+  _done = false;
+  _queuedChunks = null;
+  _requests = [];
+  constructor(stream) {
+    super(stream);
+    const {
+      pdfDataRangeTransport,
+      disableRange,
+      disableStream
+    } = stream._source;
+    const {
+      length,
+      contentDispositionFilename
+    } = pdfDataRangeTransport;
+    this._queuedChunks = stream._queuedChunks || [];
+    for (const chunk of this._queuedChunks) {
+      this._loaded += chunk.byteLength;
+    }
+    this._done = stream._progressiveDone;
+    this._contentLength = length;
+    this._isStreamingSupported = !disableStream;
+    this._isRangeSupported = !disableRange;
+    if (isPdfFile(contentDispositionFilename)) {
+      this._filename = contentDispositionFilename;
+    }
+    this._headersCapability.resolve();
+    const loaded = this._loaded;
+    Promise.resolve().then(() => {
+      if (loaded > 0 && this._loaded === loaded) {
+        this._callOnProgress();
+      }
+    });
+  }
+  _enqueue(chunk) {
+    if (this._done) {
+      return;
+    }
+    if (this._requests.length > 0) {
+      const capability = this._requests.shift();
+      capability.resolve({
+        value: chunk,
+        done: false
+      });
+    } else {
+      this._queuedChunks.push(chunk);
+    }
+    this._loaded += chunk.byteLength;
+    this._callOnProgress();
+  }
+  async read() {
+    if (this._queuedChunks.length > 0) {
+      const chunk = this._queuedChunks.shift();
+      return {
+        value: chunk,
+        done: false
+      };
+    }
+    if (this._done) {
+      return {
+        value: undefined,
+        done: true
+      };
+    }
+    const capability = Promise.withResolvers();
+    this._requests.push(capability);
+    return capability.promise;
+  }
+  cancel(reason) {
+    this._done = true;
+    this.#endRequests();
+  }
+  progressiveDone() {
+    this._done ||= true;
+    if (this._queuedChunks.length === 0) {
+      this.#endRequests();
+    }
+  }
+}
+class PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader {
+  #endRequests = endRequests.bind(this);
+  onDone = null;
+  _begin = -1;
+  _done = false;
+  _queuedChunk = null;
+  _requests = [];
+  constructor(stream, begin, end) {
+    super(stream, begin, end);
+    this._begin = begin;
+  }
+  _enqueue(chunk) {
+    if (this._done) {
+      return;
+    }
+    if (this._requests.length === 0) {
+      this._queuedChunk = chunk;
+    } else {
+      const capability = this._requests.shift();
+      capability.resolve({
+        value: chunk,
+        done: false
+      });
+      this.#endRequests();
+    }
+    this._done = true;
+    this.onDone?.();
+  }
+  async read() {
+    if (this._queuedChunk) {
+      const chunk = this._queuedChunk;
+      this._queuedChunk = null;
+      return {
+        value: chunk,
+        done: false
+      };
+    }
+    if (this._done) {
+      return {
+        value: undefined,
+        done: true
+      };
+    }
+    const capability = Promise.withResolvers();
+    this._requests.push(capability);
+    return capability.promise;
+  }
+  cancel(reason) {
+    this._done = true;
+    this.#endRequests();
+    this.onDone?.();
+  }
+}
+
+;// ./src/display/network.js
+
+
+
+
+const OK_RESPONSE = 200;
+const PARTIAL_CONTENT_RESPONSE = 206;
+function network_getArrayBuffer(val) {
+  return typeof val !== "string" ? val : stringToBytes(val).buffer;
+}
+class PDFNetworkStream extends BasePDFStream {
+  #pendingRequests = new WeakMap();
+  _responseOrigin = null;
+  constructor(source) {
+    super(source, PDFNetworkStreamReader, PDFNetworkStreamRangeReader);
+    const {
+      httpHeaders,
+      url
+    } = source;
+    this.url = url;
+    this.isHttp = /https?:/.test(url.protocol);
+    this.headers = createHeaders(this.isHttp, httpHeaders);
+  }
+  _request(args) {
+    const xhr = new XMLHttpRequest();
+    const pendingRequest = {
+      validateStatus: null,
+      onHeadersReceived: args.onHeadersReceived,
+      onDone: args.onDone,
+      onError: args.onError,
+      onProgress: args.onProgress
+    };
+    this.#pendingRequests.set(xhr, pendingRequest);
+    xhr.open("GET", this.url);
+    xhr.withCredentials = this._source.withCredentials;
+    for (const [key, val] of this.headers) {
+      xhr.setRequestHeader(key, val);
+    }
+    if (this.isHttp && "begin" in args && "end" in args) {
+      xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`);
+      pendingRequest.validateStatus = status => status === PARTIAL_CONTENT_RESPONSE || status === OK_RESPONSE;
+    } else {
+      pendingRequest.validateStatus = status => status === OK_RESPONSE;
+    }
+    xhr.responseType = "arraybuffer";
+    assert(args.onError, "Expected `onError` callback to be provided.");
+    xhr.onerror = () => args.onError(xhr.status);
+    xhr.onreadystatechange = this.#onStateChange.bind(this, xhr);
+    xhr.onprogress = this.#onProgress.bind(this, xhr);
+    xhr.send(null);
+    return xhr;
+  }
+  #onProgress(xhr, evt) {
+    const pendingRequest = this.#pendingRequests.get(xhr);
+    pendingRequest?.onProgress?.(evt);
+  }
+  #onStateChange(xhr, evt) {
+    const pendingRequest = this.#pendingRequests.get(xhr);
+    if (!pendingRequest) {
+      return;
+    }
+    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
+      pendingRequest.onHeadersReceived();
+      delete pendingRequest.onHeadersReceived;
+    }
+    if (xhr.readyState !== 4) {
+      return;
+    }
+    if (!this.#pendingRequests.has(xhr)) {
+      return;
+    }
+    this.#pendingRequests.delete(xhr);
+    if (xhr.status === 0 && this.isHttp) {
+      pendingRequest.onError(xhr.status);
+      return;
+    }
+    const xhrStatus = xhr.status || OK_RESPONSE;
+    if (!pendingRequest.validateStatus(xhrStatus)) {
+      pendingRequest.onError(xhr.status);
+      return;
+    }
+    const chunk = network_getArrayBuffer(xhr.response);
+    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
+      const rangeHeader = xhr.getResponseHeader("Content-Range");
+      if (/bytes \d+-\d+\/\d+/.test(rangeHeader)) {
+        pendingRequest.onDone(chunk);
+      } else {
+        warn(`Missing or invalid "Content-Range" header.`);
+        pendingRequest.onError(0);
+      }
+    } else if (chunk) {
+      pendingRequest.onDone(chunk);
+    } else {
+      pendingRequest.onError(xhr.status);
+    }
+  }
+  _abortRequest(xhr) {
+    if (this.#pendingRequests.has(xhr)) {
+      this.#pendingRequests.delete(xhr);
+      xhr.abort();
+    }
+  }
+  getRangeReader(begin, end) {
+    const reader = super.getRangeReader(begin, end);
+    if (reader) {
+      reader.onClosed = () => this._rangeReaders.delete(reader);
+    }
+    return reader;
+  }
+}
+class PDFNetworkStreamReader extends BasePDFStreamReader {
+  #endRequests = endRequests.bind(this);
+  _cachedChunks = [];
+  _done = false;
+  _requests = [];
+  _storedError = null;
+  constructor(stream) {
+    super(stream);
+    this._fullRequestXhr = stream._request({
+      onHeadersReceived: this.#onHeadersReceived.bind(this),
+      onDone: this.#onDone.bind(this),
+      onError: this.#onError.bind(this),
+      onProgress: this.#onProgress.bind(this)
+    });
+  }
+  #onHeadersReceived() {
+    const stream = this._stream;
+    const {
+      disableRange,
+      rangeChunkSize
+    } = stream._source;
+    const fullRequestXhr = this._fullRequestXhr;
+    stream._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL);
+    const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders();
+    const responseHeaders = new Headers(rawResponseHeaders ? rawResponseHeaders.trimStart().replace(/[^\S ]+$/, "").split(/[\r\n]+/).map(x => {
+      const [key, ...val] = x.split(": ");
+      return [key, val.join(": ")];
+    }) : []);
+    const {
+      contentLength,
+      isRangeSupported
+    } = validateRangeRequestCapabilities({
+      responseHeaders,
+      isHttp: stream.isHttp,
+      rangeChunkSize,
+      disableRange
+    });
+    this._contentLength = contentLength;
+    this._isRangeSupported = isRangeSupported;
+    this._filename = extractFilenameFromHeader(responseHeaders);
+    if (this._isRangeSupported) {
+      stream._abortRequest(fullRequestXhr);
+    }
+    this._headersCapability.resolve();
+  }
+  #onDone(chunk) {
+    if (this._requests.length > 0) {
+      const capability = this._requests.shift();
+      capability.resolve({
+        value: chunk,
+        done: false
+      });
+    } else {
+      this._cachedChunks.push(chunk);
+    }
+    this._done = true;
+    if (this._cachedChunks.length === 0) {
+      this.#endRequests();
+    }
+  }
+  #onError(status) {
+    this._storedError = createResponseError(status, this._stream.url);
+    this._headersCapability.reject(this._storedError);
+    for (const capability of this._requests) {
+      capability.reject(this._storedError);
+    }
+    this._requests.length = 0;
+    this._cachedChunks.length = 0;
+  }
+  #onProgress(evt) {
+    this.onProgress?.({
+      loaded: evt.loaded,
+      total: evt.lengthComputable ? evt.total : this._contentLength
+    });
+  }
+  async read() {
+    await this._headersCapability.promise;
+    if (this._storedError) {
+      throw this._storedError;
+    }
+    if (this._cachedChunks.length > 0) {
+      const chunk = this._cachedChunks.shift();
+      return {
+        value: chunk,
+        done: false
+      };
+    }
+    if (this._done) {
+      return {
+        value: undefined,
+        done: true
+      };
+    }
+    const capability = Promise.withResolvers();
+    this._requests.push(capability);
+    return capability.promise;
+  }
+  cancel(reason) {
+    this._done = true;
+    this._headersCapability.reject(reason);
+    this.#endRequests();
+    this._stream._abortRequest(this._fullRequestXhr);
+    this._fullRequestXhr = null;
+  }
+}
+class PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader {
+  #endRequests = endRequests.bind(this);
+  onClosed = null;
+  _done = false;
+  _queuedChunk = null;
+  _requests = [];
+  _storedError = null;
+  constructor(stream, begin, end) {
+    super(stream, begin, end);
+    this._requestXhr = stream._request({
+      begin,
+      end,
+      onHeadersReceived: this.#onHeadersReceived.bind(this),
+      onDone: this.#onDone.bind(this),
+      onError: this.#onError.bind(this),
+      onProgress: null
+    });
+  }
+  #onHeadersReceived() {
+    const responseOrigin = getResponseOrigin(this._requestXhr?.responseURL);
+    try {
+      ensureResponseOrigin(responseOrigin, this._stream._responseOrigin);
+    } catch (ex) {
+      this._storedError = ex;
+      this.#onError(0);
+    }
+  }
+  #onDone(chunk) {
+    if (this._requests.length > 0) {
+      const capability = this._requests.shift();
+      capability.resolve({
+        value: chunk,
+        done: false
+      });
+    } else {
+      this._queuedChunk = chunk;
+    }
+    this._done = true;
+    this.#endRequests();
+    this.onClosed?.();
+  }
+  #onError(status) {
+    this._storedError ??= createResponseError(status, this._stream.url);
+    for (const capability of this._requests) {
+      capability.reject(this._storedError);
+    }
+    this._requests.length = 0;
+    this._queuedChunk = null;
+  }
+  async read() {
+    if (this._storedError) {
+      throw this._storedError;
+    }
+    if (this._queuedChunk !== null) {
+      const chunk = this._queuedChunk;
+      this._queuedChunk = null;
+      return {
+        value: chunk,
+        done: false
+      };
+    }
+    if (this._done) {
+      return {
+        value: undefined,
+        done: true
+      };
+    }
+    const capability = Promise.withResolvers();
+    this._requests.push(capability);
+    return capability.promise;
+  }
+  cancel(reason) {
+    this._done = true;
+    this.#endRequests();
+    this._stream._abortRequest(this._requestXhr);
+    this.onClosed?.();
+  }
+}
+
+;// ./src/display/node_stream.js
+
+
+
+
+function getReadableStream(url, opts = null) {
+  const fs = process.getBuiltinModule("fs");
+  const {
+    Readable
+  } = process.getBuiltinModule("stream");
+  const readStream = fs.createReadStream(url, opts);
+  return Readable.toWeb(readStream);
+}
+class PDFNodeStream extends BasePDFStream {
+  constructor(source) {
+    super(source, PDFNodeStreamReader, PDFNodeStreamRangeReader);
+    const {
+      url
+    } = source;
+    assert(url.protocol === "file:", "PDFNodeStream only supports file:// URLs.");
+  }
+}
+class PDFNodeStreamReader extends BasePDFStreamReader {
+  _reader = null;
+  constructor(stream) {
+    super(stream);
+    const {
+      disableRange,
+      disableStream,
+      rangeChunkSize,
+      url
+    } = stream._source;
+    this._isStreamingSupported = !disableStream;
+    const fs = process.getBuiltinModule("fs/promises");
+    fs.lstat(url).then(stat => {
+      const readableStream = getReadableStream(url);
+      this._reader = readableStream.getReader();
+      const {
+        size
+      } = stat;
+      this._contentLength = size;
+      this._isRangeSupported = !disableRange && size > 2 * rangeChunkSize;
+      if (!this._isStreamingSupported && this._isRangeSupported) {
+        this.cancel(new AbortException("Streaming is disabled."));
+      }
+      this._headersCapability.resolve();
+    }).catch(error => {
+      if (error.code === "ENOENT") {
+        error = createResponseError(0, url);
+      }
+      this._headersCapability.reject(error);
+    });
+  }
+  async read() {
+    await this._headersCapability.promise;
+    const {
+      value,
+      done
+    } = await this._reader.read();
+    if (done) {
+      return {
+        value,
+        done
+      };
+    }
+    this._loaded += value.byteLength;
+    this._callOnProgress();
+    return {
+      value: getArrayBuffer(value),
+      done: false
+    };
+  }
+  cancel(reason) {
+    this._reader?.cancel(reason);
+  }
+}
+class PDFNodeStreamRangeReader extends BasePDFStreamRangeReader {
+  _readCapability = Promise.withResolvers();
+  _reader = null;
+  constructor(stream, begin, end) {
+    super(stream, begin, end);
+    const {
+      url
+    } = stream._source;
+    try {
+      const readableStream = getReadableStream(url, {
+        start: begin,
+        end: end - 1
+      });
+      this._reader = readableStream.getReader();
+      this._readCapability.resolve();
+    } catch (error) {
+      this._readCapability.reject(error);
+    }
+  }
+  async read() {
+    await this._readCapability.promise;
+    const {
+      value,
+      done
+    } = await this._reader.read();
+    if (done) {
+      return {
+        value,
+        done
+      };
+    }
+    return {
+      value: getArrayBuffer(value),
+      done: false
+    };
+  }
+  cancel(reason) {
+    this._reader?.cancel(reason);
+  }
+}
+
+;// ./src/display/network_stream.js
+
+
+
+
+
+function getNetworkStream(url) {
+  return isValidFetchUrl(url) ? PDFFetchStream : isNodeJS ? PDFNodeStream : PDFNetworkStream;
+}
+
+;// ./src/display/worker_options.js
+class GlobalWorkerOptions {
+  static #port = null;
+  static #src = "";
+  static get workerPort() {
+    return this.#port;
+  }
+  static set workerPort(val) {
+    if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) {
+      throw new Error("Invalid `workerPort` type.");
+    }
+    this.#port = val;
+  }
+  static get workerSrc() {
+    return this.#src;
+  }
+  static set workerSrc(val) {
+    if (typeof val !== "string") {
+      throw new Error("Invalid `workerSrc` type.");
+    }
+    this.#src = val;
+  }
+}
+
+;// ./src/display/metadata.js
+class Metadata {
+  #map;
+  #data;
+  constructor({
+    parsedData,
+    rawData
+  }) {
+    this.#map = parsedData;
+    this.#data = rawData;
+  }
+  getRaw() {
+    return this.#data;
+  }
+  get(name) {
+    return this.#map.get(name) ?? null;
+  }
+  [Symbol.iterator]() {
+    return this.#map.entries();
+  }
+}
+
+;// ./src/display/optional_content_config.js
+
+
+const INTERNAL = Symbol("INTERNAL");
+class OptionalContentGroup {
+  #isDisplay = false;
+  #isPrint = false;
+  #userSet = false;
+  #visible = true;
+  constructor(renderingIntent, {
+    name,
+    intent,
+    usage,
+    rbGroups
+  }) {
+    this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY);
+    this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);
+    this.name = name;
+    this.intent = intent;
+    this.usage = usage;
+    this.rbGroups = rbGroups;
+  }
+  get visible() {
+    if (this.#userSet) {
+      return this.#visible;
+    }
+    if (!this.#visible) {
+      return false;
+    }
+    const {
+      print,
+      view
+    } = this.usage;
+    if (this.#isDisplay) {
+      return view?.viewState !== "OFF";
+    } else if (this.#isPrint) {
+      return print?.printState !== "OFF";
+    }
+    return true;
+  }
+  _setVisible(internal, visible, userSet = false) {
+    if (internal !== INTERNAL) {
+      unreachable("Internal method `_setVisible` called.");
+    }
+    this.#userSet = userSet;
+    this.#visible = visible;
+  }
+  get serializable() {
+    return {
+      userSet: this.#userSet,
+      visible: this.#visible
+    };
+  }
+}
+class OptionalContentConfig {
+  #cachedGetHash = null;
+  #groups = new Map();
+  #initialHash = null;
+  #order = null;
+  #rawData;
+  creator = null;
+  name = null;
+  constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY, groupState = null) {
+    this.#rawData = data;
+    this.renderingIntent = renderingIntent;
+    if (data === null) {
+      return;
+    }
+    this.name = data.name;
+    this.creator = data.creator;
+    this.#order = data.order;
+    for (const group of data.groups) {
+      this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group));
+    }
+    if (groupState) {
+      if (groupState.size !== this.#groups.size) {
+        unreachable("Incorrect serialized groupState.");
+      }
+      for (const [id, group] of groupState) {
+        this.#groups.get(id)._setVisible(INTERNAL, group.visible, group.userSet);
+      }
+    } else {
+      if (data.baseState === "OFF") {
+        for (const group of this.#groups.values()) {
+          group._setVisible(INTERNAL, false);
+        }
+      }
+      for (const on of data.on) {
+        this.#groups.get(on)._setVisible(INTERNAL, true);
+      }
+      for (const off of data.off) {
+        this.#groups.get(off)._setVisible(INTERNAL, false);
+      }
+    }
+    this.#initialHash = this.getHash();
+  }
+  #evaluateVisibilityExpression(array) {
+    const length = array.length;
+    if (length < 2) {
+      return true;
+    }
+    const operator = array[0];
+    for (let i = 1; i < length; i++) {
+      const element = array[i];
+      let state;
+      if (Array.isArray(element)) {
+        state = this.#evaluateVisibilityExpression(element);
+      } else if (this.#groups.has(element)) {
+        state = this.#groups.get(element).visible;
+      } else {
+        warn(`Optional content group not found: ${element}`);
+        return true;
+      }
+      switch (operator) {
+        case "And":
+          if (!state) {
+            return false;
+          }
+          break;
+        case "Or":
+          if (state) {
+            return true;
+          }
+          break;
+        case "Not":
+          return !state;
+        default:
+          return true;
+      }
+    }
+    return operator === "And";
+  }
+  isVisible(group) {
+    if (this.#groups.size === 0) {
+      return true;
+    }
+    if (!group) {
+      info("Optional content group not defined.");
+      return true;
+    }
+    if (group.type === "OCG") {
+      if (!this.#groups.has(group.id)) {
+        warn(`Optional content group not found: ${group.id}`);
+        return true;
+      }
+      return this.#groups.get(group.id).visible;
+    } else if (group.type === "OCMD") {
+      if (group.expression) {
+        return this.#evaluateVisibilityExpression(group.expression);
+      }
+      if (!group.policy || group.policy === "AnyOn") {
+        for (const id of group.ids) {
+          if (!this.#groups.has(id)) {
+            warn(`Optional content group not found: ${id}`);
+            return true;
+          }
+          if (this.#groups.get(id).visible) {
+            return true;
+          }
+        }
+        return false;
+      } else if (group.policy === "AllOn") {
+        for (const id of group.ids) {
+          if (!this.#groups.has(id)) {
+            warn(`Optional content group not found: ${id}`);
+            return true;
+          }
+          if (!this.#groups.get(id).visible) {
+            return false;
+          }
+        }
+        return true;
+      } else if (group.policy === "AnyOff") {
+        for (const id of group.ids) {
+          if (!this.#groups.has(id)) {
+            warn(`Optional content group not found: ${id}`);
+            return true;
+          }
+          if (!this.#groups.get(id).visible) {
+            return true;
+          }
+        }
+        return false;
+      } else if (group.policy === "AllOff") {
+        for (const id of group.ids) {
+          if (!this.#groups.has(id)) {
+            warn(`Optional content group not found: ${id}`);
+            return true;
+          }
+          if (this.#groups.get(id).visible) {
+            return false;
+          }
+        }
+        return true;
+      }
+      warn(`Unknown optional content policy ${group.policy}.`);
+      return true;
+    }
+    warn(`Unknown group type ${group.type}.`);
+    return true;
+  }
+  setVisibility(id, visible = true, preserveRB = true) {
+    const group = this.#groups.get(id);
+    if (!group) {
+      warn(`Optional content group not found: ${id}`);
+      return;
+    }
+    if (preserveRB && visible && group.rbGroups.length) {
+      for (const rbGroup of group.rbGroups) {
+        for (const otherId of rbGroup) {
+          if (otherId !== id) {
+            this.#groups.get(otherId)?._setVisible(INTERNAL, false, true);
+          }
+        }
+      }
+    }
+    group._setVisible(INTERNAL, !!visible, true);
+    this.#cachedGetHash = null;
+  }
+  setOCGState({
+    state,
+    preserveRB
+  }) {
+    let operator;
+    for (const elem of state) {
+      switch (elem) {
+        case "ON":
+        case "OFF":
+        case "Toggle":
+          operator = elem;
+          continue;
+      }
+      const group = this.#groups.get(elem);
+      if (!group) {
+        continue;
+      }
+      switch (operator) {
+        case "ON":
+          this.setVisibility(elem, true, preserveRB);
+          break;
+        case "OFF":
+          this.setVisibility(elem, false, preserveRB);
+          break;
+        case "Toggle":
+          this.setVisibility(elem, !group.visible, preserveRB);
+          break;
+      }
+    }
+    this.#cachedGetHash = null;
+  }
+  get hasInitialVisibility() {
+    return this.#initialHash === null || this.getHash() === this.#initialHash;
+  }
+  getOrder() {
+    if (!this.#groups.size) {
+      return null;
+    }
+    if (this.#order) {
+      return this.#order.slice();
+    }
+    return [...this.#groups.keys()];
+  }
+  getGroup(id) {
+    return this.#groups.get(id) || null;
+  }
+  getHash() {
+    if (this.#cachedGetHash !== null) {
+      return this.#cachedGetHash;
+    }
+    const hash = new MurmurHash3_64();
+    for (const [id, group] of this.#groups) {
+      hash.update(`${id}:${group.visible}`);
+    }
+    return this.#cachedGetHash = hash.hexdigest();
+  }
+  [Symbol.iterator]() {
+    return this.#groups.entries();
+  }
+  get serializable() {
+    const groupState = new Map();
+    for (const [id, group] of this.#groups) {
+      groupState.set(id, group.serializable);
+    }
+    return {
+      data: this.#rawData,
+      renderingIntent: this.renderingIntent,
+      groupState
+    };
+  }
+  static fromSerializable({
+    data,
+    renderingIntent,
+    groupState
+  }) {
+    return new OptionalContentConfig(data, renderingIntent, groupState);
+  }
+}
+
+;// ./src/display/pages_mapper.js
+
+
+class PagesMapper {
+  #pageNumberToId = null;
+  #prevPageNumbers = null;
+  #pagesNumber = 0;
+  #clipboard = null;
+  #savedData = null;
+  get pagesNumber() {
+    return this.#pagesNumber;
+  }
+  set pagesNumber(n) {
+    if (this.#pagesNumber === n) {
+      return;
+    }
+    this.#pagesNumber = n;
+    this.#pageNumberToId = null;
+    this.#prevPageNumbers = null;
+  }
+  #ensureInit() {
+    if (this.#pageNumberToId) {
+      return;
+    }
+    const n = this.#pagesNumber;
+    const pageNumberToId = this.#pageNumberToId = new Uint32Array(n);
+    for (let i = 0; i < n; i++) {
+      pageNumberToId[i] = i + 1;
+    }
+    this.#prevPageNumbers = new Int32Array(pageNumberToId);
+  }
+  #buildIdToPageNumber() {
+    const idToPageNumber = new Map();
+    const pageNumberToId = this.#pageNumberToId;
+    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {
+      const id = pageNumberToId[i];
+      const pageNumbers = idToPageNumber.get(id);
+      if (pageNumbers) {
+        pageNumbers.push(i + 1);
+      } else {
+        idToPageNumber.set(id, [i + 1]);
+      }
+    }
+    return idToPageNumber;
+  }
+  movePages(selectedPages, pagesToMove, index) {
+    this.#ensureInit();
+    const pageNumberToId = this.#pageNumberToId;
+    const prevIdToPageNumber = this.#buildIdToPageNumber();
+    const movedCount = pagesToMove.length;
+    const mappedPagesToMove = new Uint32Array(movedCount);
+    let removedBeforeTarget = 0;
+    for (let i = 0; i < movedCount; i++) {
+      const pageIndex = pagesToMove[i] - 1;
+      mappedPagesToMove[i] = pageNumberToId[pageIndex];
+      if (pageIndex < index) {
+        removedBeforeTarget++;
+      }
+    }
+    const pagesNumber = this.#pagesNumber;
+    const remainingLen = pagesNumber - movedCount;
+    const adjustedTarget = MathClamp(index - removedBeforeTarget, 0, remainingLen);
+    for (let i = 0, r = 0; i < pagesNumber; i++) {
+      if (!selectedPages.has(i + 1)) {
+        pageNumberToId[r++] = pageNumberToId[i];
+      }
+    }
+    pageNumberToId.copyWithin(adjustedTarget + movedCount, adjustedTarget, remainingLen);
+    pageNumberToId.set(mappedPagesToMove, adjustedTarget);
+    this.#updatePrevPageNumbers(prevIdToPageNumber);
+    if (pageNumberToId.every((id, i) => id === i + 1)) {
+      this.#pageNumberToId = null;
+    }
+  }
+  deletePages(pagesToDelete) {
+    this.#ensureInit();
+    const pageNumberToId = this.#pageNumberToId;
+    const prevIdToPageNumber = this.#buildIdToPageNumber();
+    this.#savedData = {
+      pageNumberToId: pageNumberToId.slice(),
+      pagesNumber: this.#pagesNumber,
+      prevPageNumbers: this.#prevPageNumbers.slice()
+    };
+    const newN = this.#pagesNumber - pagesToDelete.length;
+    this.#pagesNumber = newN;
+    const newPageNumberToId = this.#pageNumberToId = new Uint32Array(newN);
+    this.#prevPageNumbers = new Int32Array(newN);
+    let sourceIndex = 0;
+    let destIndex = 0;
+    for (const pageNumber of pagesToDelete) {
+      const pageIndex = pageNumber - 1;
+      if (pageIndex !== sourceIndex) {
+        newPageNumberToId.set(pageNumberToId.subarray(sourceIndex, pageIndex), destIndex);
+        destIndex += pageIndex - sourceIndex;
+      }
+      sourceIndex = pageIndex + 1;
+    }
+    if (sourceIndex < pageNumberToId.length) {
+      newPageNumberToId.set(pageNumberToId.subarray(sourceIndex), destIndex);
+    }
+    this.#updatePrevPageNumbers(prevIdToPageNumber, new Set(pagesToDelete));
+  }
+  cancelDelete() {
+    if (this.#savedData) {
+      this.#pageNumberToId = this.#savedData.pageNumberToId;
+      this.#pagesNumber = this.#savedData.pagesNumber;
+      this.#prevPageNumbers = this.#savedData.prevPageNumbers;
+      this.#savedData = null;
+    }
+  }
+  cleanSavedData() {
+    this.#savedData = null;
+  }
+  copyPages(pagesToCopy) {
+    this.#ensureInit();
+    this.#clipboard = {
+      pageNumbers: pagesToCopy,
+      pageIds: pagesToCopy.map(n => this.#pageNumberToId[n - 1])
+    };
+  }
+  cancelCopy() {
+    this.#clipboard = null;
+  }
+  pastePages(index) {
+    this.#ensureInit();
+    const pageNumberToId = this.#pageNumberToId;
+    const prevIdToPageNumber = this.#buildIdToPageNumber();
+    const {
+      pageNumbers: copiedPageNumbers,
+      pageIds: copiedPageIds
+    } = this.#clipboard;
+    const newN = this.#pagesNumber + copiedPageNumbers.length;
+    this.#pagesNumber = newN;
+    const newPageNumberToId = this.#pageNumberToId = new Uint32Array(newN);
+    this.#prevPageNumbers = new Int32Array(newN);
+    newPageNumberToId.set(pageNumberToId.subarray(0, index), 0);
+    newPageNumberToId.set(copiedPageIds, index);
+    newPageNumberToId.set(pageNumberToId.subarray(index), index + copiedPageNumbers.length);
+    this.#updatePrevPageNumbers(prevIdToPageNumber, null, index, copiedPageNumbers);
+    this.#clipboard = null;
+  }
+  #updatePrevPageNumbers(prevIdToPageNumber, deletedPageNumbers = null, pasteIndex = -1, copiedPageNumbers = null) {
+    const prevPageNumbers = this.#prevPageNumbers;
+    const newPageNumberToId = this.#pageNumberToId;
+    const pasteEnd = pasteIndex + (copiedPageNumbers?.length ?? 0);
+    const idsIndices = new Map();
+    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {
+      if (i >= pasteIndex && i < pasteEnd) {
+        prevPageNumbers[i] = -copiedPageNumbers[i - pasteIndex];
+        continue;
+      }
+      const id = newPageNumberToId[i];
+      const oldPositions = prevIdToPageNumber.get(id);
+      let j = idsIndices.get(id) || 0;
+      if (deletedPageNumbers && oldPositions) {
+        while (j < oldPositions.length && deletedPageNumbers.has(oldPositions[j])) {
+          j++;
+        }
+      }
+      prevPageNumbers[i] = oldPositions?.[j];
+      idsIndices.set(id, j + 1);
+    }
+  }
+  hasBeenAltered() {
+    return this.#pageNumberToId !== null;
+  }
+  getPageMappingForSaving(idToPageNumber = null) {
+    idToPageNumber ??= this.#buildIdToPageNumber();
+    let nCopy = 0;
+    for (const pageNumbers of idToPageNumber.values()) {
+      nCopy = Math.max(nCopy, pageNumbers.length);
+    }
+    const extractParams = new Array(nCopy);
+    for (let i = 0; i < nCopy; i++) {
+      extractParams[i] = {
+        document: null,
+        pageIndices: [],
+        includePages: []
+      };
+    }
+    for (const [id, pageNumbers] of idToPageNumber) {
+      for (let i = 0, ii = pageNumbers.length; i < ii; i++) {
+        extractParams[i].includePages.push([id - 1, pageNumbers[i] - 1]);
+      }
+    }
+    for (const {
+      includePages,
+      pageIndices
+    } of extractParams) {
+      includePages.sort((a, b) => a[0] - b[0]);
+      for (let i = 0, ii = includePages.length; i < ii; i++) {
+        pageIndices.push(includePages[i][1]);
+        includePages[i] = includePages[i][0];
+      }
+    }
+    return extractParams;
+  }
+  extractPages(extractedPageNumbers) {
+    extractedPageNumbers = Array.from(extractedPageNumbers).sort((a, b) => a - b);
+    const usedIds = new Map();
+    for (let i = 0, ii = extractedPageNumbers.length; i < ii; i++) {
+      const id = this.getPageId(extractedPageNumbers[i]);
+      const usedPageNumbers = usedIds.getOrInsertComputed(id, makeArr);
+      usedPageNumbers.push(i + 1);
+    }
+    return this.getPageMappingForSaving(usedIds);
+  }
+  getPrevPageNumber(pageNumber) {
+    return this.#prevPageNumbers?.[pageNumber - 1] ?? 0;
+  }
+  getPageNumber(id) {
+    if (!this.#pageNumberToId) {
+      return id;
+    }
+    const pageNumberToId = this.#pageNumberToId;
+    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {
+      if (pageNumberToId[i] === id) {
+        return i + 1;
+      }
+    }
+    return 0;
+  }
+  getPageId(pageNumber) {
+    return this.#pageNumberToId?.[pageNumber - 1] ?? pageNumber;
+  }
+  getMapping() {
+    return this.#pageNumberToId?.subarray(0, this.pagesNumber);
+  }
+}
+
+;// ./src/display/pdf_objects.js
+const INITIAL_DATA = Symbol("INITIAL_DATA");
+const dataObj = () => ({
+  ...Promise.withResolvers(),
+  data: INITIAL_DATA
+});
+class PDFObjects {
+  #objs = new Map();
+  get(objId, callback = null) {
+    if (callback) {
+      const obj = this.#objs.getOrInsertComputed(objId, dataObj);
+      obj.promise.then(() => callback(obj.data));
+      return null;
+    }
+    const obj = this.#objs.get(objId);
+    if (!obj || obj.data === INITIAL_DATA) {
+      throw new Error(`Requesting object that isn't resolved yet ${objId}.`);
+    }
+    return obj.data;
+  }
+  has(objId) {
+    const obj = this.#objs.get(objId);
+    return !!obj && obj.data !== INITIAL_DATA;
+  }
+  delete(objId) {
+    const obj = this.#objs.get(objId);
+    if (!obj || obj.data === INITIAL_DATA) {
+      return false;
+    }
+    this.#objs.delete(objId);
+    return true;
+  }
+  resolve(objId, data = null) {
+    const obj = this.#objs.getOrInsertComputed(objId, dataObj);
+    if (obj.data !== INITIAL_DATA) {
+      throw new Error(`Object already resolved ${objId}.`);
+    }
+    obj.data = data;
+    obj.resolve();
+  }
+  clear() {
+    for (const {
+      data
+    } of this.#objs.values()) {
+      data?.bitmap?.close();
+    }
+    this.#objs.clear();
+  }
+  *[Symbol.iterator]() {
+    for (const [objId, {
+      data
+    }] of this.#objs) {
+      if (data !== INITIAL_DATA) {
+        yield [objId, data];
+      }
+    }
+  }
+}
+
+;// ./src/display/text_layer.js
+
+
+const MAX_TEXT_DIVS_TO_RENDER = 100000;
+const DEFAULT_FONT_SIZE = 30;
+class TextLayer {
+  #capability = Promise.withResolvers();
+  #container = null;
+  #disableProcessItems = false;
+  #fontInspectorEnabled = !!globalThis.FontInspector?.enabled;
+  #imagesHandler = null;
+  #lang = null;
+  #layoutTextParams = null;
+  #pageHeight = 0;
+  #pageWidth = 0;
+  #reader = null;
+  #rootContainer = null;
+  #rotation = 0;
+  #scale = 0;
+  #styleCache = Object.create(null);
+  #textContentItemsStr = [];
+  #textContentSource = null;
+  #textDivs = [];
+  #textDivProperties = new WeakMap();
+  #transform = null;
+  static #ascentCache = new Map();
+  static #canvasContexts = new Map();
+  static #canvasCtxFonts = new WeakMap();
+  static #minFontSize = null;
+  static #pendingTextLayers = new Set();
+  constructor({
+    textContentSource,
+    images,
+    container,
+    viewport
+  }) {
+    if (textContentSource instanceof ReadableStream) {
+      this.#textContentSource = textContentSource;
+    } else if (typeof textContentSource === "object") {
+      this.#textContentSource = new ReadableStream({
+        start(controller) {
+          controller.enqueue(textContentSource);
+          controller.close();
+        }
+      });
+    } else {
+      throw new Error('No "textContentSource" parameter specified.');
+    }
+    this.#container = this.#rootContainer = container;
+    this.#imagesHandler = images;
+    this.#scale = viewport.scale * OutputScale.pixelRatio;
+    this.#rotation = viewport.rotation;
+    this.#layoutTextParams = {
+      div: null,
+      properties: null,
+      ctx: null
+    };
+    const {
+      pageWidth,
+      pageHeight,
+      pageX,
+      pageY
+    } = viewport.rawDims;
+    this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight];
+    this.#pageWidth = pageWidth;
+    this.#pageHeight = pageHeight;
+    TextLayer.#ensureMinFontSizeComputed();
+    container.style.setProperty("--min-font-size", TextLayer.#minFontSize);
+    setLayerDimensions(container, viewport);
+    this.#capability.promise.finally(() => {
+      TextLayer.#pendingTextLayers.delete(this);
+      this.#layoutTextParams = null;
+      this.#styleCache = null;
+    }).catch(() => {});
+  }
+  static get fontFamilyMap() {
+    const {
+      isWindows,
+      isFirefox
+    } = FeatureTest.platform;
+    return shadow(this, "fontFamilyMap", new Map([["sans-serif", `${isWindows && isFirefox ? "Calibri, " : ""}sans-serif`], ["monospace", `${isWindows && isFirefox ? "Lucida Console, " : ""}monospace`]]));
+  }
+  render() {
+    if (this.#imagesHandler) {
+      this.#container.append(this.#imagesHandler.render());
+    }
+    const pump = () => {
+      this.#reader.read().then(({
+        value,
+        done
+      }) => {
+        if (done) {
+          this.#capability.resolve();
+          return;
+        }
+        this.#lang ??= value.lang;
+        Object.assign(this.#styleCache, value.styles);
+        this.#processItems(value.items);
+        pump();
+      }, this.#capability.reject);
+    };
+    this.#reader = this.#textContentSource.getReader();
+    TextLayer.#pendingTextLayers.add(this);
+    pump();
+    return this.#capability.promise;
+  }
+  update({
+    viewport,
+    onBefore = null
+  }) {
+    const scale = viewport.scale * OutputScale.pixelRatio;
+    const rotation = viewport.rotation;
+    if (rotation !== this.#rotation) {
+      onBefore?.();
+      this.#rotation = rotation;
+      setLayerDimensions(this.#rootContainer, {
+        rotation
+      });
+    }
+    if (scale !== this.#scale) {
+      onBefore?.();
+      this.#scale = scale;
+      const params = {
+        div: null,
+        properties: null,
+        ctx: TextLayer.#getCtx(this.#lang)
+      };
+      for (const div of this.#textDivs) {
+        params.properties = this.#textDivProperties.get(div);
+        params.div = div;
+        this.#layout(params);
+      }
+    }
+  }
+  cancel() {
+    const abortEx = new AbortException("TextLayer task cancelled.");
+    this.#reader?.cancel(abortEx).catch(() => {});
+    this.#reader = null;
+    this.#capability.reject(abortEx);
+  }
+  get textDivs() {
+    return this.#textDivs;
+  }
+  get textContentItemsStr() {
+    return this.#textContentItemsStr;
+  }
+  #processItems(items) {
+    if (this.#disableProcessItems) {
+      return;
+    }
+    this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang);
+    const textDivs = this.#textDivs,
+      textContentItemsStr = this.#textContentItemsStr;
+    for (const item of items) {
+      if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {
+        warn("Ignoring additional textDivs for performance reasons.");
+        this.#disableProcessItems = true;
+        return;
+      }
+      if (item.str === undefined) {
+        if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") {
+          const parent = this.#container;
+          this.#container = document.createElement("span");
+          this.#container.classList.add("markedContent");
+          if (item.id) {
+            this.#container.setAttribute("id", `${item.id}`);
+          }
+          if (item.tag === "Artifact") {
+            this.#container.ariaHidden = true;
+          }
+          parent.append(this.#container);
+        } else if (item.type === "endMarkedContent") {
+          this.#container = this.#container.parentNode;
+        }
+        continue;
+      }
+      textContentItemsStr.push(item.str);
+      this.#appendText(item);
+    }
+  }
+  #appendText(geom) {
+    const textDiv = document.createElement("span");
+    const textDivProperties = {
+      angle: 0,
+      canvasWidth: 0,
+      hasText: geom.str !== "",
+      hasEOL: geom.hasEOL,
+      fontSize: 0
+    };
+    this.#textDivs.push(textDiv);
+    const tx = Util.transform(this.#transform, geom.transform);
+    let angle = Math.atan2(tx[1], tx[0]);
+    const style = this.#styleCache[geom.fontName];
+    if (style.vertical) {
+      angle += Math.PI / 2;
+    }
+    let fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily;
+    fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily;
+    const fontHeight = Math.hypot(tx[2], tx[3]);
+    const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang);
+    let left, top;
+    if (angle === 0) {
+      left = tx[4];
+      top = tx[5] - fontAscent;
+    } else {
+      left = tx[4] + fontAscent * Math.sin(angle);
+      top = tx[5] - fontAscent * Math.cos(angle);
+    }
+    const divStyle = textDiv.style;
+    divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`;
+    divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`;
+    divStyle.setProperty("--font-height", `${fontHeight.toFixed(2)}px`);
+    divStyle.fontFamily = fontFamily;
+    textDivProperties.fontSize = fontHeight;
+    textDiv.setAttribute("role", "presentation");
+    textDiv.textContent = geom.str;
+    textDiv.dir = geom.dir;
+    if (this.#fontInspectorEnabled) {
+      textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName;
+    }
+    if (angle !== 0) {
+      textDivProperties.angle = angle * (180 / Math.PI);
+    }
+    let shouldScaleText = false;
+    if (geom.str.length > 1) {
+      shouldScaleText = true;
+    } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) {
+      const absScaleX = Math.abs(geom.transform[0]),
+        absScaleY = Math.abs(geom.transform[3]);
+      if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) {
+        shouldScaleText = true;
+      }
+    }
+    if (shouldScaleText) {
+      textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;
+    }
+    this.#textDivProperties.set(textDiv, textDivProperties);
+    this.#layoutTextParams.div = textDiv;
+    this.#layoutTextParams.properties = textDivProperties;
+    this.#layout(this.#layoutTextParams);
+    if (textDivProperties.hasText) {
+      this.#container.append(textDiv);
+    }
+    if (textDivProperties.hasEOL) {
+      const br = document.createElement("br");
+      br.setAttribute("role", "presentation");
+      this.#container.append(br);
+    }
+  }
+  #layout(params) {
+    const {
+      div,
+      properties,
+      ctx
+    } = params;
+    const {
+      style
+    } = div;
+    if (properties.canvasWidth !== 0 && properties.hasText) {
+      const {
+        fontFamily
+      } = style;
+      const {
+        canvasWidth,
+        fontSize
+      } = properties;
+      TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily);
+      const {
+        width
+      } = ctx.measureText(div.textContent);
+      if (width > 0) {
+        style.setProperty("--scale-x", canvasWidth * this.#scale / width);
+      }
+    }
+    if (properties.angle !== 0) {
+      style.setProperty("--rotate", `${properties.angle}deg`);
+    }
+  }
+  static cleanup() {
+    if (this.#pendingTextLayers.size > 0) {
+      return;
+    }
+    this.#ascentCache.clear();
+    for (const {
+      canvas
+    } of this.#canvasContexts.values()) {
+      canvas.remove();
+    }
+    this.#canvasContexts.clear();
+  }
+  static #getCtx(lang = null) {
+    let ctx = this.#canvasContexts.get(lang ||= "");
+    if (!ctx) {
+      const canvas = document.createElement("canvas");
+      canvas.style.cssText = "position:absolute;top:0;left:0;width:0;height:0;display:none;" + "letter-spacing:normal;word-spacing:normal";
+      canvas.lang = lang;
+      document.body.append(canvas);
+      ctx = canvas.getContext("2d", {
+        alpha: false,
+        willReadFrequently: true
+      });
+      this.#canvasContexts.set(lang, ctx);
+      this.#canvasCtxFonts.set(ctx, {
+        size: 0,
+        family: ""
+      });
+    }
+    return ctx;
+  }
+  static #ensureCtxFont(ctx, size, family) {
+    const cached = this.#canvasCtxFonts.get(ctx);
+    if (size === cached.size && family === cached.family) {
+      return;
+    }
+    ctx.font = `${size}px ${family}`;
+    cached.size = size;
+    cached.family = family;
+  }
+  static #ensureMinFontSizeComputed() {
+    if (this.#minFontSize !== null) {
+      return;
+    }
+    const div = document.createElement("div");
+    div.style.opacity = 0;
+    div.style.lineHeight = 1;
+    div.style.fontSize = "1px";
+    div.style.position = "absolute";
+    div.textContent = "X";
+    document.body.append(div);
+    this.#minFontSize = div.getBoundingClientRect().height;
+    div.remove();
+  }
+  static #getAscent(fontFamily, style, lang) {
+    const cachedAscent = this.#ascentCache.get(fontFamily);
+    if (cachedAscent) {
+      return cachedAscent;
+    }
+    const ctx = this.#getCtx(lang);
+    ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE;
+    this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily);
+    const metrics = ctx.measureText("");
+    const ascent = metrics.fontBoundingBoxAscent;
+    const descent = Math.abs(metrics.fontBoundingBoxDescent);
+    ctx.canvas.width = ctx.canvas.height = 0;
+    let ratio = 0.8;
+    if (ascent) {
+      ratio = ascent / (ascent + descent);
+    } else {
+      if (FeatureTest.platform.isFirefox) {
+        warn("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference " + "in `about:config` to improve TextLayer rendering.");
+      }
+      if (style.ascent) {
+        ratio = style.ascent;
+      } else if (style.descent) {
+        ratio = 1 + style.descent;
+      }
+    }
+    this.#ascentCache.set(fontFamily, ratio);
+    return ratio;
+  }
+}
+
+;// ./src/display/api.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const RENDERING_CANCELLED_TIMEOUT = 100;
+function getDocument(src = {}) {
+  const task = new PDFDocumentLoadingTask();
+  const {
+    docId
+  } = task;
+  const url = src.url ? getUrlProp(src.url) : null;
+  const data = src.data ? getDataProp(src.data) : null;
+  const httpHeaders = src.httpHeaders || null;
+  const withCredentials = src.withCredentials === true;
+  const password = src.password ?? null;
+  const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null;
+  const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : 2 ** 16;
+  let worker = src.worker instanceof PDFWorker ? src.worker : null;
+  const verbosity = src.verbosity;
+  const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null;
+  const cMapUrl = getFactoryUrlProp(src.cMapUrl);
+  const cMapPacked = src.cMapPacked !== false;
+  const iccUrl = getFactoryUrlProp(src.iccUrl);
+  const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl);
+  const wasmUrl = getFactoryUrlProp(src.wasmUrl);
+  const ignoreErrors = src.stopAtErrors !== true;
+  const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1;
+  const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS;
+  const isImageDecoderSupported = typeof src.isImageDecoderSupported === "boolean" ? src.isImageDecoderSupported : !isNodeJS;
+  const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1;
+  const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS;
+  const fontExtraProperties = src.fontExtraProperties === true;
+  const enableXfa = src.enableXfa === true;
+  const ownerDocument = src.ownerDocument || globalThis.document;
+  const disableRange = src.disableRange === true;
+  const disableStream = src.disableStream === true;
+  const disableAutoFetch = src.disableAutoFetch === true;
+  const pdfBug = src.pdfBug === true;
+  const CanvasFactory = src.CanvasFactory || (isNodeJS ? NodeCanvasFactory : DOMCanvasFactory);
+  const FilterFactory = src.FilterFactory || (isNodeJS ? NodeFilterFactory : DOMFilterFactory);
+  const BinaryDataFactory = src.BinaryDataFactory || (isNodeJS ? NodeBinaryDataFactory : DOMBinaryDataFactory);
+  const enableHWA = src.enableHWA === true;
+  const enableWebGPU = src.enableWebGPU === true;
+  const gpuPromise = enableWebGPU ? initGPU() : Promise.resolve(false);
+  const useWasm = src.useWasm !== false;
+  const pagesMapper = src.pagesMapper || new PagesMapper();
+  const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace;
+  const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : !!(BinaryDataFactory === DOMBinaryDataFactory && cMapUrl && cMapPacked && standardFontDataUrl && wasmUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI) && isValidFetchUrl(wasmUrl, document.baseURI));
+  const styleElement = null;
+  setVerbosityLevel(verbosity);
+  const transportFactory = {
+    canvasFactory: new CanvasFactory({
+      ownerDocument,
+      enableHWA
+    }),
+    filterFactory: new FilterFactory({
+      docId,
+      ownerDocument
+    }),
+    binaryDataFactory: useWorkerFetch ? null : new BinaryDataFactory({
+      cMapUrl,
+      standardFontDataUrl,
+      wasmUrl
+    })
+  };
+  if (!worker) {
+    worker = PDFWorker.create({
+      verbosity,
+      port: GlobalWorkerOptions.workerPort
+    });
+    task._worker = worker;
+  }
+  const docParams = {
+    docId,
+    apiVersion: "6.1.200",
+    data,
+    password,
+    disableAutoFetch,
+    rangeChunkSize,
+    docBaseUrl,
+    enableXfa,
+    evaluatorOptions: {
+      maxImageSize,
+      disableFontFace,
+      ignoreErrors,
+      isOffscreenCanvasSupported,
+      isImageDecoderSupported,
+      canvasMaxAreaInBytes,
+      fontExtraProperties,
+      useSystemFonts,
+      useWasm,
+      useWorkerFetch,
+      cMapUrl,
+      cMapPacked,
+      iccUrl,
+      standardFontDataUrl,
+      wasmUrl,
+      hasGPU: false
+    }
+  };
+  const transportParams = {
+    ownerDocument,
+    pdfBug,
+    styleElement,
+    enableHWA,
+    loadingParams: {
+      disableAutoFetch,
+      enableXfa
+    }
+  };
+  Promise.all([worker.promise, gpuPromise]).then(function ([, hasGPU]) {
+    if (worker.destroyed) {
+      throw new Error("Worker was destroyed");
+    }
+    docParams.evaluatorOptions.hasGPU = hasGPU;
+    const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null);
+    let networkStream;
+    if (data) {} else if (rangeTransport) {
+      networkStream = new PDFDataTransportStream({
+        pdfDataRangeTransport: rangeTransport,
+        disableRange,
+        disableStream
+      });
+    } else if (url) {
+      const NetworkStream = getNetworkStream(url);
+      networkStream = new NetworkStream({
+        url,
+        httpHeaders,
+        withCredentials,
+        rangeChunkSize,
+        disableRange,
+        disableStream
+      });
+    } else {
+      throw new Error("getDocument - expected either `data`, `range`, or `url` parameter.");
+    }
+    return workerIdPromise.then(workerId => {
+      if (worker.destroyed) {
+        throw new Error("Worker was destroyed");
+      }
+      const messageHandler = new MessageHandler(docId, workerId, worker.port);
+      const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory, pagesMapper);
+      task._transport = transport;
+      if (task.destroyed) {
+        throw new Error("Loading aborted");
+      }
+      messageHandler.send("Ready", null);
+    });
+  }).catch(task._capability.reject).finally(task._setupCapability.resolve);
+  return task;
+}
+class PDFDocumentLoadingTask {
+  static #docId = 0;
+  _capability = Promise.withResolvers();
+  _setupCapability = Promise.withResolvers();
+  _transport = null;
+  _worker = null;
+  docId = `d${PDFDocumentLoadingTask.#docId++}`;
+  destroyed = false;
+  onPassword = null;
+  onProgress = null;
+  get promise() {
+    return this._capability.promise;
+  }
+  async destroy() {
+    this.destroyed = true;
+    this._capability.promise.catch(() => {});
+    try {
+      if (this._worker?.port) {
+        this._worker._pendingDestroy = true;
+      }
+      await this._setupCapability.promise;
+      await this._transport?.destroy();
+    } catch (ex) {
+      if (this._worker?.port) {
+        delete this._worker._pendingDestroy;
+      }
+      throw ex;
+    }
+    this._transport = null;
+    this._worker?.destroy();
+    this._worker = null;
+  }
+  async getData() {
+    return this._transport.getData();
+  }
+}
+class PDFDataRangeTransport {
+  #capability = Promise.withResolvers();
+  #listener = null;
+  constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) {
+    this.length = length;
+    this.initialData = initialData;
+    this.progressiveDone = progressiveDone;
+    this.contentDispositionFilename = contentDispositionFilename;
+  }
+  onDataRange(begin, chunk) {
+    this.#listener({
+      type: "range",
+      begin,
+      chunk
+    });
+  }
+  onDataProgressiveRead(chunk) {
+    this.#capability.promise.then(() => {
+      this.#listener({
+        type: "progressiveRead",
+        chunk
+      });
+    });
+  }
+  onDataProgressiveDone() {
+    this.#capability.promise.then(() => {
+      this.#listener({
+        type: "progressiveDone"
+      });
+    });
+  }
+  transportReady(listener) {
+    this.#listener = listener;
+    this.#capability.resolve();
+  }
+  requestDataRange(begin, end) {
+    unreachable("Abstract method PDFDataRangeTransport.requestDataRange");
+  }
+  abort() {}
+}
+class PDFDocumentProxy {
+  constructor(pdfInfo, transport) {
+    this._pdfInfo = pdfInfo;
+    this._transport = transport;
+  }
+  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(pageNumber) {
+    return this._transport.getPage(pageNumber);
+  }
+  getPageIndex(ref) {
+    return this._transport.getPageIndex(ref);
+  }
+  getDestinations() {
+    return this._transport.getDestinations();
+  }
+  getDestination(id) {
+    return this._transport.getDestination(id);
+  }
+  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();
+  }
+  getAttachmentContent(id) {
+    return this._transport.getAttachmentContent(id);
+  }
+  getAnnotationsByType(types, pageIndexesToSkip) {
+    return this._transport.getAnnotationsByType(types, pageIndexesToSkip);
+  }
+  getJSActions() {
+    return this._transport.getDocJSActions();
+  }
+  getOutline() {
+    return this._transport.getOutline();
+  }
+  getOptionalContentConfig({
+    intent = "display"
+  } = {}) {
+    const {
+      renderingIntent
+    } = this._transport.getRenderingIntent(intent);
+    return this._transport.getOptionalContentConfig(renderingIntent);
+  }
+  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(pageInfos) {
+    return this._transport.extractPages(pageInfos);
+  }
+  getDownloadInfo() {
+    return this._transport.downloadInfoCapability.promise;
+  }
+  getRawData(data) {
+    return this._transport.getRawData(data);
+  }
+  cleanup(keepLoadedFonts = false) {
+    return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);
+  }
+  cachedPageNumber(ref) {
+    return this._transport.cachedPageNumber(ref);
+  }
+  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 {
+  #pendingCleanup = false;
+  #pagesMapper = null;
+  constructor(pageIndex, pageInfo, transport, pagesMapper, pdfBug = false) {
+    this._pageIndex = pageIndex;
+    this._pageInfo = pageInfo;
+    this._transport = transport;
+    this._stats = pdfBug ? new StatTimer() : null;
+    this._pdfBug = pdfBug;
+    this.commonObjs = transport.commonObjs;
+    this.objs = new PDFObjects();
+    this._intentStates = new Map();
+    this.destroyed = false;
+    this.recordedBBoxes = null;
+    this.#pagesMapper = pagesMapper;
+    this.imageCoordinates = null;
+  }
+  clone(id) {
+    const clone = new PDFPageProxy(id, this._pageInfo, this._transport, this.#pagesMapper, this._pdfBug);
+    clone.clonedFromIndex = this.clonedFromIndex ?? this._pageIndex;
+    this._transport.updatePage(clone);
+    return clone;
+  }
+  get pageNumber() {
+    return this._pageIndex + 1;
+  }
+  set pageNumber(value) {
+    this._pageIndex = value - 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,
+    rotation = this.rotate,
+    offsetX = 0,
+    offsetY = 0,
+    dontFlip = false
+  } = {}) {
+    return new PageViewport({
+      viewBox: this.view,
+      userUnit: this.userUnit,
+      scale,
+      rotation,
+      offsetX,
+      offsetY,
+      dontFlip
+    });
+  }
+  getAnnotations({
+    intent = "display"
+  } = {}) {
+    const {
+      renderingIntent
+    } = this._transport.getRenderingIntent(intent);
+    return this._transport.getAnnotations(this._pageIndex, renderingIntent);
+  }
+  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,
+    canvas = canvasContext.canvas,
+    viewport,
+    intent = "display",
+    annotationMode = AnnotationMode.ENABLE,
+    transform = null,
+    background = null,
+    optionalContentConfigPromise = null,
+    annotationCanvasMap = null,
+    pageColors = null,
+    printAnnotationStorage = null,
+    isEditing = false,
+    recordImages = false,
+    recordOperations = false,
+    operationsFilter = null
+  }) {
+    this._stats?.time("Overall");
+    const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing);
+    const {
+      renderingIntent,
+      cacheKey
+    } = intentArgs;
+    this.#pendingCleanup = false;
+    optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent);
+    const intentState = this._intentStates.getOrInsertComputed(cacheKey, makeObj);
+    if (intentState.streamReaderCancelTimeout) {
+      clearTimeout(intentState.streamReaderCancelTimeout);
+      intentState.streamReaderCancelTimeout = null;
+    }
+    const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);
+    if (!intentState.displayReadyCapability) {
+      intentState.displayReadyCapability = Promise.withResolvers();
+      intentState.operatorList = {
+        fnArray: [],
+        argsArray: [],
+        lastChunk: false,
+        separateAnnots: null
+      };
+      this._stats?.time("Page Request");
+      this._pumpOperatorList(intentArgs);
+    }
+    const recordForDebugger = !!(this._pdfBug && globalThis.StepperManager?.enabled);
+    const shouldRecordOperations = !!canvas && !this.recordedBBoxes && (recordOperations || recordForDebugger);
+    const shouldRecordImages = !!canvas && !this.imageCoordinates && recordImages;
+    const complete = error => {
+      intentState.renderTasks.delete(internalRenderTask);
+      if (shouldRecordOperations) {
+        const recordedBBoxes = internalRenderTask.gfx?.dependencyTracker.take();
+        if (recordedBBoxes) {
+          internalRenderTask.stepper?.setOperatorBBoxes(recordedBBoxes, internalRenderTask.gfx.dependencyTracker.takeDebugMetadata());
+          if (recordOperations) {
+            this.recordedBBoxes = recordedBBoxes;
+          }
+        }
+      }
+      if (shouldRecordImages && !error) {
+        this.imageCoordinates = internalRenderTask.gfx?.imagesTracker.take();
+      }
+      if (intentPrint) {
+        this.#pendingCleanup = true;
+      }
+      this.#tryCleanup();
+      if (error) {
+        internalRenderTask.capability.reject(error);
+        this._abortOperatorList({
+          intentState,
+          reason: error instanceof Error ? error : new Error(error)
+        });
+      } else {
+        internalRenderTask.capability.resolve();
+      }
+      if (this._stats) {
+        this._stats.timeEnd("Rendering");
+        this._stats.timeEnd("Overall");
+        if (globalThis.Stats?.enabled) {
+          globalThis.Stats.add(this.pageNumber, this._stats);
+        }
+      }
+    };
+    let dependencyTracker = null;
+    let bboxTracker = null;
+    if (shouldRecordOperations || shouldRecordImages) {
+      bboxTracker = new CanvasBBoxTracker(canvas, intentState.operatorList.length);
+    }
+    if (shouldRecordOperations) {
+      dependencyTracker = new CanvasDependencyTracker(bboxTracker, recordForDebugger);
+    }
+    const internalRenderTask = new InternalRenderTask({
+      callback: complete,
+      params: {
+        canvas,
+        canvasContext,
+        dependencyTracker: dependencyTracker ?? bboxTracker,
+        imagesTracker: shouldRecordImages ? new CanvasImagesTracker(canvas) : null,
+        viewport,
+        transform,
+        background
+      },
+      objs: this.objs,
+      commonObjs: this.commonObjs,
+      annotationCanvasMap,
+      operatorList: intentState.operatorList,
+      pageIndex: this._pageIndex,
+      canvasFactory: this._transport.canvasFactory,
+      filterFactory: this._transport.filterFactory,
+      useRequestAnimationFrame: !intentPrint,
+      pdfBug: this._pdfBug,
+      pageColors,
+      enableHWA: this._transport.enableHWA,
+      operationsFilter
+    });
+    (intentState.renderTasks ||= new Set()).add(internalRenderTask);
+    const renderTask = internalRenderTask.task;
+    Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => {
+      if (this.destroyed) {
+        complete();
+        return;
+      }
+      this._stats?.time("Rendering");
+      if (!(optionalContentConfig.renderingIntent & renderingIntent)) {
+        throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods.");
+      }
+      internalRenderTask.initializeGraphics({
+        transparency,
+        optionalContentConfig
+      });
+      internalRenderTask.operatorListChanged();
+    }).catch(complete);
+    return renderTask;
+  }
+  getOperatorList({
+    intent = "display",
+    annotationMode = AnnotationMode.ENABLE,
+    printAnnotationStorage = null,
+    isEditing = false
+  } = {}) {
+    function operatorListChanged() {
+      if (intentState.operatorList.lastChunk) {
+        intentState.opListReadCapability.resolve(intentState.operatorList);
+        intentState.renderTasks.delete(opListTask);
+      }
+    }
+    const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true);
+    const intentState = this._intentStates.getOrInsertComputed(intentArgs.cacheKey, makeObj);
+    let opListTask;
+    if (!intentState.opListReadCapability) {
+      opListTask = Object.create(null);
+      opListTask.operatorListChanged = operatorListChanged;
+      intentState.opListReadCapability = Promise.withResolvers();
+      (intentState.renderTasks ||= new Set()).add(opListTask);
+      intentState.operatorList = {
+        fnArray: [],
+        argsArray: [],
+        lastChunk: false,
+        separateAnnots: null
+      };
+      this._stats?.time("Page Request");
+      this._pumpOperatorList(intentArgs);
+    }
+    return intentState.opListReadCapability.promise;
+  }
+  streamTextContent({
+    includeMarkedContent = false,
+    disableNormalization = false
+  } = {}) {
+    const TEXT_CONTENT_CHUNK_SIZE = 100;
+    return this._transport.messageHandler.sendWithStream("GetTextContent", {
+      pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1,
+      pageIndex: this._pageIndex,
+      includeMarkedContent: includeMarkedContent === true,
+      disableNormalization: disableNormalization === true
+    }, {
+      highWaterMark: TEXT_CONTENT_CHUNK_SIZE,
+      size(textContent) {
+        return textContent.items.length;
+      }
+    });
+  }
+  async getTextContent(params = {}) {
+    if (this._transport._htmlForXfa) {
+      return this.getXfa().then(xfa => XfaText.textContent(xfa));
+    }
+    const readableStream = this.streamTextContent(params);
+    const textContent = {
+      items: [],
+      styles: Object.create(null),
+      lang: null
+    };
+    for await (const value of readableStream) {
+      textContent.lang ??= value.lang;
+      Object.assign(textContent.styles, value.styles);
+      textContent.items.push(...value.items);
+    }
+    return textContent;
+  }
+  getStructTree() {
+    return this._transport.getStructTree(this._pageIndex);
+  }
+  _destroy() {
+    this.destroyed = true;
+    const waitOn = [];
+    for (const intentState of this._intentStates.values()) {
+      this._abortOperatorList({
+        intentState,
+        reason: new Error("Page was destroyed."),
+        force: true
+      });
+      if (intentState.opListReadCapability) {
+        continue;
+      }
+      for (const internalRenderTask of intentState.renderTasks) {
+        waitOn.push(internalRenderTask.completed);
+        internalRenderTask.cancel();
+      }
+    }
+    this.objs.clear();
+    this.#pendingCleanup = false;
+    return Promise.all(waitOn);
+  }
+  cleanup(resetStats = false) {
+    this.#pendingCleanup = true;
+    const success = this.#tryCleanup();
+    if (resetStats && success) {
+      this._stats &&= new StatTimer();
+    }
+    return success;
+  }
+  #tryCleanup() {
+    if (!this.#pendingCleanup || this.destroyed) {
+      return false;
+    }
+    for (const {
+      renderTasks,
+      operatorList
+    } of this._intentStates.values()) {
+      if (renderTasks.size > 0 || !operatorList.lastChunk) {
+        return false;
+      }
+    }
+    this._intentStates.clear();
+    this.objs.clear();
+    this.#pendingCleanup = false;
+    return true;
+  }
+  _startRenderPage(transparency, cacheKey) {
+    const intentState = this._intentStates.get(cacheKey);
+    if (!intentState) {
+      return;
+    }
+    this._stats?.timeEnd("Page Request");
+    intentState.displayReadyCapability?.resolve(transparency);
+  }
+  _renderPageChunk(operatorListChunk, intentState) {
+    for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {
+      intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
+      intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);
+    }
+    intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
+    intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;
+    for (const internalRenderTask of intentState.renderTasks) {
+      internalRenderTask.operatorListChanged();
+    }
+    if (operatorListChunk.lastChunk) {
+      this.#tryCleanup();
+    }
+  }
+  _pumpOperatorList({
+    renderingIntent,
+    cacheKey,
+    annotationStorageSerializable,
+    modifiedIds
+  }) {
+    const {
+      map,
+      transfer
+    } = annotationStorageSerializable;
+    const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", {
+      pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1,
+      pageIndex: this._pageIndex,
+      intent: renderingIntent,
+      cacheKey,
+      annotationStorage: map,
+      modifiedIds
+    }, undefined, transfer);
+    const reader = readableStream.getReader();
+    const intentState = this._intentStates.get(cacheKey);
+    intentState.streamReader = reader;
+    const pump = () => {
+      reader.read().then(({
+        value,
+        done
+      }) => {
+        if (done) {
+          intentState.streamReader = null;
+          return;
+        }
+        if (this._transport.destroyed) {
+          return;
+        }
+        this._renderPageChunk(value, intentState);
+        pump();
+      }, reason => {
+        intentState.streamReader = null;
+        if (this._transport.destroyed) {
+          return;
+        }
+        if (intentState.operatorList) {
+          intentState.operatorList.lastChunk = true;
+          for (const internalRenderTask of intentState.renderTasks) {
+            internalRenderTask.operatorListChanged();
+          }
+          this.#tryCleanup();
+        }
+        if (intentState.displayReadyCapability) {
+          intentState.displayReadyCapability.reject(reason);
+        } else if (intentState.opListReadCapability) {
+          intentState.opListReadCapability.reject(reason);
+        } else {
+          throw reason;
+        }
+      });
+    };
+    pump();
+  }
+  _abortOperatorList({
+    intentState,
+    reason,
+    force = false
+  }) {
+    if (!intentState.streamReader) {
+      return;
+    }
+    if (intentState.streamReaderCancelTimeout) {
+      clearTimeout(intentState.streamReaderCancelTimeout);
+      intentState.streamReaderCancelTimeout = null;
+    }
+    if (!force) {
+      if (intentState.renderTasks.size > 0) {
+        return;
+      }
+      if (reason instanceof RenderingCancelledException) {
+        let delay = RENDERING_CANCELLED_TIMEOUT;
+        if (reason.extraDelay > 0 && reason.extraDelay < 1000) {
+          delay += reason.extraDelay;
+        }
+        intentState.streamReaderCancelTimeout = setTimeout(() => {
+          intentState.streamReaderCancelTimeout = null;
+          this._abortOperatorList({
+            intentState,
+            reason,
+            force: true
+          });
+        }, delay);
+        return;
+      }
+    }
+    intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {});
+    intentState.streamReader = null;
+    if (this._transport.destroyed) {
+      return;
+    }
+    for (const [curCacheKey, curIntentState] of this._intentStates) {
+      if (curIntentState === intentState) {
+        this._intentStates.delete(curCacheKey);
+        break;
+      }
+    }
+    this.cleanup();
+  }
+  get stats() {
+    return this._stats;
+  }
+}
+class PDFWorker {
+  #capability = Promise.withResolvers();
+  #messageHandler = null;
+  #port = null;
+  #webWorker = null;
+  static #fakeWorkerId = 0;
+  static #isWorkerDisabled = false;
+  static #workerPorts = new WeakMap();
+  static {
+    if (isNodeJS) {
+      this.#isWorkerDisabled = true;
+      GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs";
+    }
+    this._isSameOrigin = (baseUrl, otherUrl) => {
+      const base = URL.parse(baseUrl);
+      if (!base?.origin || base.origin === "null") {
+        return false;
+      }
+      const other = new URL(otherUrl, base);
+      return base.origin === other.origin;
+    };
+    this._createCDNWrapper = url => {
+      const wrapper = `await import("${url}");`;
+      return URL.createObjectURL(new Blob([wrapper], {
+        type: "text/javascript"
+      }));
+    };
+  }
+  constructor({
+    name = null,
+    port = null,
+    verbosity = getVerbosityLevel()
+  } = {}) {
+    this.name = name;
+    this.destroyed = false;
+    this.verbosity = verbosity;
+    if (port) {
+      if (PDFWorker.#workerPorts.has(port)) {
+        throw new Error("Cannot use more than one PDFWorker per port.");
+      }
+      PDFWorker.#workerPorts.set(port, this);
+      this.#initializeFromPort(port);
+    } else {
+      this.#initialize();
+    }
+  }
+  get promise() {
+    return this.#capability.promise;
+  }
+  #resolve() {
+    this.#capability.resolve();
+    this.#messageHandler.send("configure", {
+      verbosity: this.verbosity
+    });
+  }
+  get port() {
+    return this.#port;
+  }
+  get messageHandler() {
+    return this.#messageHandler;
+  }
+  #initializeFromPort(port) {
+    this.#port = port;
+    this.#messageHandler = new MessageHandler("main", "worker", port);
+    this.#messageHandler.on("ready", () => {});
+    this.#resolve();
+  }
+  #initialize() {
+    if (PDFWorker.#isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) {
+      this.#setupFakeWorker();
+      return;
+    }
+    let {
+      workerSrc
+    } = PDFWorker;
+    try {
+      if (!PDFWorker._isSameOrigin(window.location, workerSrc)) {
+        workerSrc = PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href);
+      }
+      const worker = new Worker(workerSrc, {
+        type: "module"
+      });
+      const messageHandler = new MessageHandler("main", "worker", worker);
+      const terminateEarly = () => {
+        ac.abort();
+        messageHandler.destroy();
+        worker.terminate();
+        if (this.destroyed) {
+          this.#capability.reject(new Error("Worker was destroyed"));
+        } else {
+          this.#setupFakeWorker();
+        }
+      };
+      const ac = new AbortController();
+      worker.addEventListener("error", () => {
+        if (!this.#webWorker) {
+          terminateEarly();
+        }
+      }, {
+        signal: ac.signal
+      });
+      messageHandler.on("test", data => {
+        ac.abort();
+        if (this.destroyed || !data) {
+          terminateEarly();
+          return;
+        }
+        this.#messageHandler = messageHandler;
+        this.#port = worker;
+        this.#webWorker = worker;
+        this.#resolve();
+      });
+      messageHandler.on("ready", data => {
+        ac.abort();
+        if (this.destroyed) {
+          terminateEarly();
+          return;
+        }
+        try {
+          sendTest();
+        } catch {
+          this.#setupFakeWorker();
+        }
+      });
+      const sendTest = () => {
+        const testObj = new Uint8Array();
+        messageHandler.send("test", testObj, [testObj.buffer]);
+      };
+      sendTest();
+      return;
+    } catch {
+      info("The worker has been disabled.");
+    }
+    this.#setupFakeWorker();
+  }
+  #setupFakeWorker() {
+    if (!PDFWorker.#isWorkerDisabled) {
+      warn("Setting up fake worker.");
+      PDFWorker.#isWorkerDisabled = true;
+    }
+    PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => {
+      if (this.destroyed) {
+        this.#capability.reject(new Error("Worker was destroyed"));
+        return;
+      }
+      const port = new LoopbackPort();
+      this.#port = port;
+      const id = `fake${PDFWorker.#fakeWorkerId++}`;
+      const workerHandler = new MessageHandler(id + "_worker", id, port);
+      WorkerMessageHandler.setup(workerHandler, port);
+      this.#messageHandler = new MessageHandler(id, id + "_worker", port);
+      this.#resolve();
+    }).catch(reason => {
+      this.#capability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`));
+    });
+  }
+  destroy() {
+    this.destroyed = true;
+    this.#webWorker?.terminate();
+    this.#webWorker = null;
+    PDFWorker.#workerPorts.delete(this.#port);
+    this.#port = null;
+    this.#messageHandler?.destroy();
+    this.#messageHandler = null;
+  }
+  static create(params) {
+    const cachedPort = this.#workerPorts.get(params?.port);
+    if (cachedPort) {
+      if (cachedPort._pendingDestroy) {
+        throw new Error("PDFWorker.create - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls.");
+      }
+      return cachedPort;
+    }
+    return new PDFWorker(params);
+  }
+  static get workerSrc() {
+    if (GlobalWorkerOptions.workerSrc) {
+      return GlobalWorkerOptions.workerSrc;
+    }
+    throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
+  }
+  static get #mainThreadWorkerMessageHandler() {
+    try {
+      return globalThis.pdfjsWorker?.WorkerMessageHandler || null;
+    } catch {
+      return null;
+    }
+  }
+  static get _setupFakeWorkerGlobal() {
+    const loader = async () => {
+      if (this.#mainThreadWorkerMessageHandler) {
+        return this.#mainThreadWorkerMessageHandler;
+      }
+      const worker = await import(
+      /*webpackIgnore: true*/
+      /*@vite-ignore*/
+      this.workerSrc);
+      return worker.WorkerMessageHandler;
+    };
+    return shadow(this, "_setupFakeWorkerGlobal", loader());
+  }
+}
+class WorkerTransport {
+  downloadInfoCapability = Promise.withResolvers();
+  #fullReader = null;
+  #methodPromises = new Map();
+  #networkStream = null;
+  #pageCache = new Map();
+  #pagePromises = new Map();
+  #pageRefCache = new Map();
+  #passwordCapability = null;
+  constructor(messageHandler, loadingTask, networkStream, params, factory, pagesMapper) {
+    this.messageHandler = messageHandler;
+    this.loadingTask = loadingTask;
+    this.#networkStream = networkStream;
+    this.commonObjs = new PDFObjects();
+    this.fontLoader = new FontLoader({
+      ownerDocument: params.ownerDocument,
+      styleElement: params.styleElement
+    });
+    this.enableHWA = params.enableHWA;
+    this.loadingParams = params.loadingParams;
+    this._params = params;
+    this.canvasFactory = factory.canvasFactory;
+    this.filterFactory = factory.filterFactory;
+    this.binaryDataFactory = factory.binaryDataFactory;
+    this.pagesMapper = pagesMapper;
+    this.destroyed = false;
+    this.destroyCapability = null;
+    this.setupMessageHandler();
+  }
+  updatePage(page) {
+    const {
+      _pageIndex
+    } = page;
+    this.#pageCache.set(_pageIndex, page);
+    this.#pagePromises.set(_pageIndex, Promise.resolve(page));
+  }
+  #cacheSimpleMethod(name, data = null) {
+    return this.#methodPromises.getOrInsertComputed(name, () => this.messageHandler.sendWithPromise(name, data));
+  }
+  #onProgress({
+    loaded,
+    total
+  }) {
+    this.loadingTask.onProgress?.({
+      loaded,
+      total,
+      percent: total ? MathClamp(Math.round(loaded / total * 100), 0, 100) : NaN
+    });
+  }
+  get annotationStorage() {
+    return shadow(this, "annotationStorage", new AnnotationStorage());
+  }
+  getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) {
+    let renderingIntent = RenderingIntentFlag.DISPLAY;
+    let annotationStorageSerializable = SerializableEmpty;
+    switch (intent) {
+      case "any":
+        renderingIntent = RenderingIntentFlag.ANY;
+        break;
+      case "display":
+        break;
+      case "print":
+        renderingIntent = RenderingIntentFlag.PRINT;
+        break;
+      default:
+        warn(`getRenderingIntent - invalid intent: ${intent}`);
+    }
+    const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage;
+    switch (annotationMode) {
+      case AnnotationMode.DISABLE:
+        renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE;
+        break;
+      case AnnotationMode.ENABLE:
+        break;
+      case AnnotationMode.ENABLE_FORMS:
+        renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS;
+        break;
+      case AnnotationMode.ENABLE_STORAGE:
+        renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE;
+        annotationStorageSerializable = annotationStorage.serializable;
+        break;
+      default:
+        warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`);
+    }
+    if (isEditing) {
+      renderingIntent += RenderingIntentFlag.IS_EDITING;
+    }
+    if (isOpList) {
+      renderingIntent += RenderingIntentFlag.OPLIST;
+    }
+    const {
+      ids: modifiedIds,
+      hash: modifiedIdsHash
+    } = annotationStorage.modifiedIds;
+    const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash];
+    return {
+      renderingIntent,
+      cacheKey: cacheKeyBuf.join("_"),
+      annotationStorageSerializable,
+      modifiedIds
+    };
+  }
+  destroy() {
+    if (this.destroyCapability) {
+      return this.destroyCapability.promise;
+    }
+    this.destroyed = true;
+    this.destroyCapability = Promise.withResolvers();
+    this.#passwordCapability?.reject(new Error("Worker was destroyed during onPassword callback"));
+    const waitOn = [];
+    for (const page of this.#pageCache.values()) {
+      waitOn.push(page._destroy());
+    }
+    this.#pageCache.clear();
+    this.#pagePromises.clear();
+    this.#pageRefCache.clear();
+    if (Object.hasOwn(this, "annotationStorage")) {
+      this.annotationStorage.resetModified();
+    }
+    const terminated = this.messageHandler.sendWithPromise("Terminate", null);
+    waitOn.push(terminated);
+    Promise.all(waitOn).then(() => {
+      this.commonObjs.clear();
+      this.fontLoader.clear();
+      this.#methodPromises.clear();
+      this.filterFactory.destroy();
+      TextLayer.cleanup();
+      this.#networkStream?.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,
+      loadingTask
+    } = this;
+    messageHandler.on("GetReader", (data, sink) => {
+      assert(this.#networkStream, "GetReader - no `BasePDFStream` instance available.");
+      this.#fullReader = this.#networkStream.getFullReader();
+      this.#fullReader.onProgress = evt => this.#onProgress(evt);
+      sink.onPull = () => {
+        this.#fullReader.read().then(function ({
+          value,
+          done
+        }) {
+          if (done) {
+            sink.close();
+            return;
+          }
+          assert(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer.");
+          sink.enqueue(new Uint8Array(value), 1, [value]);
+        }).catch(reason => {
+          sink.error(reason);
+        });
+      };
+      sink.onCancel = reason => {
+        this.#fullReader.cancel(reason);
+        sink.ready.catch(readyReason => {
+          if (this.destroyed) {
+            return;
+          }
+          throw readyReason;
+        });
+      };
+    });
+    messageHandler.on("ReaderHeadersReady", async data => {
+      await this.#fullReader.headersReady;
+      const {
+        isStreamingSupported,
+        isRangeSupported,
+        contentLength
+      } = this.#fullReader;
+      if (isStreamingSupported && isRangeSupported) {
+        this.#fullReader.onProgress = null;
+      }
+      return {
+        isStreamingSupported,
+        isRangeSupported,
+        contentLength
+      };
+    });
+    messageHandler.on("GetRangeReader", (data, sink) => {
+      assert(this.#networkStream, "GetRangeReader - no `BasePDFStream` instance available.");
+      const rangeReader = this.#networkStream.getRangeReader(data.begin, data.end);
+      if (!rangeReader) {
+        sink.close();
+        return;
+      }
+      sink.onPull = () => {
+        rangeReader.read().then(function ({
+          value,
+          done
+        }) {
+          if (done) {
+            sink.close();
+            return;
+          }
+          assert(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer.");
+          sink.enqueue(new Uint8Array(value), 1, [value]);
+        }).catch(reason => {
+          sink.error(reason);
+        });
+      };
+      sink.onCancel = reason => {
+        rangeReader.cancel(reason);
+        sink.ready.catch(readyReason => {
+          if (this.destroyed) {
+            return;
+          }
+          throw readyReason;
+        });
+      };
+    });
+    messageHandler.on("GetDoc", ({
+      pdfInfo
+    }) => {
+      this.pagesMapper.pagesNumber = pdfInfo.numPages;
+      this._numPages = pdfInfo.numPages;
+      this._htmlForXfa = pdfInfo.htmlForXfa;
+      delete pdfInfo.htmlForXfa;
+      loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));
+    });
+    messageHandler.on("DocException", ex => {
+      loadingTask._capability.reject(wrapReason(ex));
+    });
+    messageHandler.on("PasswordRequest", ex => {
+      this.#passwordCapability = Promise.withResolvers();
+      try {
+        if (!loadingTask.onPassword) {
+          throw wrapReason(ex);
+        }
+        const updatePassword = password => {
+          if (password instanceof Error) {
+            this.#passwordCapability.reject(password);
+          } else {
+            this.#passwordCapability.resolve({
+              password
+            });
+          }
+        };
+        loadingTask.onPassword(updatePassword, ex.code);
+      } catch (err) {
+        this.#passwordCapability.reject(err);
+      }
+      return this.#passwordCapability.promise;
+    });
+    messageHandler.on("DataLoaded", data => {
+      this.#onProgress({
+        loaded: data.length,
+        total: data.length
+      });
+      this.downloadInfoCapability.resolve(data);
+    });
+    messageHandler.on("StartRenderPage", data => {
+      if (this.destroyed) {
+        return;
+      }
+      const page = this.#pageCache.get(data.pageIndex);
+      page._startRenderPage(data.transparency, data.cacheKey);
+    });
+    messageHandler.on("commonobj", ([id, type, exportedData]) => {
+      if (this.destroyed) {
+        return null;
+      }
+      if (this.commonObjs.has(id)) {
+        return null;
+      }
+      switch (type) {
+        case "Font":
+          if ("error" in exportedData) {
+            const exportedError = exportedData.error;
+            warn(`Error during font loading: ${exportedError}`);
+            this.commonObjs.resolve(id, exportedError);
+            break;
+          }
+          const fontData = new FontInfo(exportedData);
+          const inspectFont = this._params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null;
+          const font = new FontFaceObject(fontData, inspectFont, exportedData.charProcOperatorList, exportedData.extra);
+          this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", {
+            id
+          })).finally(() => {
+            if (!font.fontExtraProperties) {
+              font.clearData();
+            }
+            this.commonObjs.resolve(id, font);
+          });
+          break;
+        case "CopyLocalImage":
+          const {
+            imageRef
+          } = exportedData;
+          assert(imageRef, "The imageRef must be defined.");
+          for (const pageProxy of this.#pageCache.values()) {
+            for (const [, data] of pageProxy.objs) {
+              if (data?.ref !== imageRef) {
+                continue;
+              }
+              if (!data.dataLen) {
+                return null;
+              }
+              const copy = structuredClone(data);
+              this.commonObjs.resolve(id, copy);
+              return data.dataLen;
+            }
+          }
+          break;
+        case "FontPath":
+          this.commonObjs.resolve(id, new FontPathInfo(exportedData));
+          break;
+        case "Image":
+          this.commonObjs.resolve(id, exportedData);
+          break;
+        case "Pattern":
+          const pattern = new PatternInfo(exportedData);
+          this.commonObjs.resolve(id, pattern.getIR());
+          break;
+        default:
+          throw new Error(`Got unknown common object type ${type}`);
+      }
+      return null;
+    });
+    messageHandler.on("obj", ([id, pageIndex, type, imageData]) => {
+      if (this.destroyed) {
+        return;
+      }
+      const pageProxy = this.#pageCache.get(pageIndex);
+      if (pageProxy.objs.has(id)) {
+        return;
+      }
+      if (pageProxy._intentStates.size === 0) {
+        imageData?.bitmap?.close();
+        return;
+      }
+      switch (type) {
+        case "Image":
+        case "Pattern":
+          pageProxy.objs.resolve(id, imageData);
+          break;
+        default:
+          throw new Error(`Got unknown object type ${type}`);
+      }
+    });
+    messageHandler.on("DocProgress", data => {
+      if (this.destroyed) {
+        return;
+      }
+      this.#onProgress(data);
+    });
+    messageHandler.on("FetchBinaryData", async data => {
+      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(data);
+    });
+  }
+  getData() {
+    return this.messageHandler.sendWithPromise("GetData", null);
+  }
+  saveDocument() {
+    if (this.annotationStorage.size <= 0) {
+      warn("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead.");
+    }
+    const {
+      map,
+      transfer
+    } = this.annotationStorage.serializable;
+    return this.messageHandler.sendWithPromise("SaveDocument", {
+      isPureXfa: !!this._htmlForXfa,
+      numPages: this._numPages,
+      annotationStorage: map,
+      filename: this.#fullReader?.filename ?? null
+    }, transfer).finally(() => {
+      this.annotationStorage.resetModified();
+    });
+  }
+  extractPages(pageInfos) {
+    const params = {
+      pageInfos
+    };
+    let transfer;
+    const ImageBitmapCtor = globalThis.ImageBitmap;
+    if (typeof ImageBitmapCtor === "function") {
+      const infos = Array.isArray(pageInfos) ? pageInfos : [pageInfos];
+      for (const pageInfo of infos) {
+        if (pageInfo?.image instanceof ImageBitmapCtor) {
+          (transfer ||= []).push(pageInfo.image);
+        }
+      }
+    }
+    if (this.annotationStorage.size > 0) {
+      const serialized = this.annotationStorage.serializable;
+      let {
+        map
+      } = serialized;
+      if (serialized.transfer?.length) {
+        if (transfer) {
+          transfer.push(...serialized.transfer);
+        } else {
+          transfer = serialized.transfer;
+        }
+      }
+      const mapping = this.pagesMapper.getMapping();
+      if (mapping) {
+        const remapped = new Map();
+        for (const [k, v] of map) {
+          if (v?.pageIndex !== undefined && v.pageIndex >= 0 && v.pageIndex < mapping.length) {
+            const sourceIdx = mapping[v.pageIndex] - 1;
+            if (sourceIdx !== v.pageIndex) {
+              remapped.set(k, {
+                ...v,
+                pageIndex: sourceIdx
+              });
+              continue;
+            }
+          }
+          remapped.set(k, v);
+        }
+        map = remapped;
+      }
+      params.annotationStorage = map;
+    }
+    return this.messageHandler.sendWithPromise("ExtractPages", params, transfer).finally(() => {
+      this.annotationStorage.resetModified();
+    });
+  }
+  getPage(pageNumber) {
+    if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this.pagesMapper.pagesNumber) {
+      return Promise.reject(new Error("Invalid page request."));
+    }
+    const pageIndex = pageNumber - 1;
+    const newPageIndex = this.pagesMapper.getPageId(pageNumber) - 1;
+    const cachedPromise = this.#pagePromises.get(pageIndex);
+    if (cachedPromise) {
+      return cachedPromise;
+    }
+    const promise = this.messageHandler.sendWithPromise("GetPage", {
+      pageIndex: newPageIndex
+    }).then(pageInfo => {
+      if (this.destroyed) {
+        throw new Error("Transport destroyed");
+      }
+      if (pageInfo.refStr) {
+        this.#pageRefCache.set(pageInfo.refStr, newPageIndex);
+      }
+      const page = new PDFPageProxy(pageIndex, pageInfo, this, this.pagesMapper, this._params.pdfBug);
+      this.#pageCache.set(pageIndex, page);
+      return page;
+    });
+    this.#pagePromises.set(pageIndex, promise);
+    return promise;
+  }
+  async getPageIndex(ref) {
+    if (!isRefProxy(ref)) {
+      throw new Error("Invalid pageIndex request.");
+    }
+    const index = await this.messageHandler.sendWithPromise("GetPageIndex", {
+      num: ref.num,
+      gen: ref.gen
+    });
+    const pageNumber = this.pagesMapper.getPageNumber(index + 1);
+    if (pageNumber === 0) {
+      throw new Error("GetPageIndex: page has been removed.");
+    }
+    return pageNumber - 1;
+  }
+  getAnnotations(pageIndex, intent) {
+    return this.messageHandler.sendWithPromise("GetAnnotations", {
+      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1,
+      intent
+    });
+  }
+  getFieldObjects() {
+    return this.#cacheSimpleMethod("GetFieldObjects");
+  }
+  hasJSActions() {
+    return this.#cacheSimpleMethod("HasJSActions");
+  }
+  getCalculationOrderIds() {
+    return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null);
+  }
+  getDestinations() {
+    return this.messageHandler.sendWithPromise("GetDestinations", null);
+  }
+  getDestination(id) {
+    if (typeof id !== "string") {
+      return Promise.reject(new Error("Invalid destination request."));
+    }
+    return this.messageHandler.sendWithPromise("GetDestination", {
+      id
+    });
+  }
+  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);
+  }
+  getAttachmentContent(id) {
+    return this.messageHandler.sendWithPromise("GetAttachmentContent", id);
+  }
+  getAnnotationsByType(types, pageIndexesToSkip) {
+    return this.messageHandler.sendWithPromise("GetAnnotationsByType", {
+      types,
+      pageIndexesToSkip
+    });
+  }
+  getDocJSActions() {
+    return this.#cacheSimpleMethod("GetDocJSActions");
+  }
+  getPageJSActions(pageIndex) {
+    return this.messageHandler.sendWithPromise("GetPageJSActions", {
+      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1
+    });
+  }
+  getStructTree(pageIndex) {
+    return this.messageHandler.sendWithPromise("GetStructTree", {
+      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1
+    });
+  }
+  getOutline() {
+    return this.messageHandler.sendWithPromise("GetOutline", null);
+  }
+  getOptionalContentConfig(renderingIntent) {
+    return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new OptionalContentConfig(data, renderingIntent));
+  }
+  getPermissions() {
+    return this.messageHandler.sendWithPromise("GetPermissions", null);
+  }
+  getMetadata() {
+    const name = "GetMetadata";
+    return this.#methodPromises.getOrInsertComputed(name, () => this.messageHandler.sendWithPromise(name, null).then(results => ({
+      info: results[0],
+      metadata: results[1] ? new Metadata(results[1]) : null,
+      contentDispositionFilename: this.#fullReader?.filename ?? null,
+      contentLength: this.#fullReader?.contentLength ?? null,
+      hasStructTree: results[2]
+    })));
+  }
+  getMarkInfo() {
+    return this.messageHandler.sendWithPromise("GetMarkInfo", null);
+  }
+  getRawData(data) {
+    return this.messageHandler.sendWithPromise("GetRawData", data);
+  }
+  async startCleanup(keepLoadedFonts = false) {
+    if (this.destroyed) {
+      return;
+    }
+    await this.messageHandler.sendWithPromise("Cleanup", null);
+    for (const page of this.#pageCache.values()) {
+      const cleanupSuccessful = page.cleanup();
+      if (!cleanupSuccessful) {
+        throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`);
+      }
+    }
+    this.commonObjs.clear();
+    if (!keepLoadedFonts) {
+      this.fontLoader.clear();
+    }
+    this.#methodPromises.clear();
+    this.filterFactory.destroy(true);
+    TextLayer.cleanup();
+  }
+  cachedPageNumber(ref) {
+    if (!isRefProxy(ref)) {
+      return null;
+    }
+    const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`;
+    const pageIndex = this.#pageRefCache.get(refStr);
+    if (pageIndex >= 0) {
+      const pageNumber = this.pagesMapper.getPageNumber(pageIndex + 1);
+      if (pageNumber !== 0) {
+        return pageNumber;
+      }
+    }
+    return null;
+  }
+}
+class RenderTask {
+  _internalRenderTask = null;
+  onContinue = null;
+  onError = null;
+  constructor(internalRenderTask) {
+    this._internalRenderTask = internalRenderTask;
+  }
+  get promise() {
+    return this._internalRenderTask.capability.promise;
+  }
+  cancel(extraDelay = 0) {
+    this._internalRenderTask.cancel(null, extraDelay);
+  }
+  get separateAnnots() {
+    const {
+      separateAnnots
+    } = this._internalRenderTask.operatorList;
+    if (!separateAnnots) {
+      return false;
+    }
+    const {
+      annotationCanvasMap
+    } = this._internalRenderTask;
+    return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0;
+  }
+  get imageCoordinates() {
+    return this._internalRenderTask.imageCoordinates || null;
+  }
+}
+class InternalRenderTask {
+  #rAF = null;
+  static #canvasInUse = new WeakSet();
+  constructor({
+    callback,
+    params,
+    objs,
+    commonObjs,
+    annotationCanvasMap,
+    operatorList,
+    pageIndex,
+    canvasFactory,
+    filterFactory,
+    useRequestAnimationFrame = false,
+    pdfBug = false,
+    pageColors = null,
+    enableHWA = false,
+    operationsFilter = null
+  }) {
+    this.callback = callback;
+    this.params = params;
+    this.objs = objs;
+    this.commonObjs = commonObjs;
+    this.annotationCanvasMap = annotationCanvasMap;
+    this.operatorListIdx = null;
+    this.operatorList = operatorList;
+    this._pageIndex = pageIndex;
+    this.canvasFactory = canvasFactory;
+    this.filterFactory = filterFactory;
+    this._pdfBug = pdfBug;
+    this.pageColors = pageColors;
+    this.running = false;
+    this.graphicsReadyCallback = null;
+    this.graphicsReady = false;
+    this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined";
+    this.cancelled = false;
+    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 = params.canvas;
+    this._canvasContext = params.canvas ? null : params.canvasContext;
+    this._enableHWA = enableHWA;
+    this._dependencyTracker = params.dependencyTracker;
+    this._imagesTracker = params.imagesTracker;
+    this._operationsFilter = operationsFilter;
+  }
+  get completed() {
+    return this.capability.promise.catch(function () {});
+  }
+  initializeGraphics({
+    transparency = false,
+    optionalContentConfig
+  }) {
+    if (this.cancelled) {
+      return;
+    }
+    if (this._canvas) {
+      if (InternalRenderTask.#canvasInUse.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.#canvasInUse.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,
+      transform,
+      background,
+      dependencyTracker,
+      imagesTracker
+    } = this.params;
+    const canvasContext = this._canvasContext || this._canvas.getContext("2d", {
+      alpha: false,
+      willReadFrequently: !this._enableHWA
+    });
+    this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
+      optionalContentConfig
+    }, this.annotationCanvasMap, this.pageColors, dependencyTracker, imagesTracker);
+    this.gfx.beginDrawing({
+      transform,
+      viewport,
+      transparency,
+      background
+    });
+    this.operatorListIdx = 0;
+    this.graphicsReady = true;
+    this.graphicsReadyCallback?.();
+  }
+  cancel(error = null, extraDelay = 0) {
+    this.running = false;
+    this.cancelled = true;
+    this.gfx?.endDrawing();
+    if (this.#rAF) {
+      window.cancelAnimationFrame(this.#rAF);
+      this.#rAF = null;
+    }
+    InternalRenderTask.#canvasInUse.delete(this._canvas);
+    error ||= new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay);
+    this.callback(error);
+    this.task.onError?.(error);
+  }
+  operatorListChanged() {
+    if (!this.graphicsReady) {
+      this.graphicsReadyCallback ||= this._continueBound;
+      return;
+    }
+    this.gfx.dependencyTracker?.growOperationsCount(this.operatorList.fnArray.length);
+    this.stepper?.updateOperatorList(this.operatorList);
+    if (this.running) {
+      return;
+    }
+    this._continue();
+  }
+  _continue() {
+    this.running = true;
+    if (this.cancelled) {
+      return;
+    }
+    if (this.task.onContinue) {
+      this.task.onContinue(this._scheduleNextBound);
+    } else {
+      this._scheduleNext();
+    }
+  }
+  _scheduleNext() {
+    if (this._useRequestAnimationFrame) {
+      this.#rAF = window.requestAnimationFrame(() => {
+        this.#rAF = null;
+        this._nextBound().catch(this._cancelBound);
+      });
+    } else {
+      Promise.resolve().then(this._nextBound).catch(this._cancelBound);
+    }
+  }
+  async _next() {
+    if (this.cancelled) {
+      return;
+    }
+    this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper, this._operationsFilter);
+    if (this.operatorListIdx === this.operatorList.argsArray.length) {
+      this.running = false;
+      if (this.operatorList.lastChunk) {
+        this.gfx.endDrawing();
+        InternalRenderTask.#canvasInUse.delete(this._canvas);
+        this.callback();
+      }
+    }
+  }
+}
+const version = "6.1.200";
+const build = "6353acefe";
+
+;// ./src/display/editor/color_picker.js
+
+
+
+class ColorPicker {
+  #button = null;
+  #buttonSwatch = null;
+  #defaultColor;
+  #dropdown = null;
+  #dropdownWasFromKeyboard = false;
+  #isMainColorPicker = false;
+  #editor = null;
+  #eventBus;
+  #openDropdownAC = null;
+  #uiManager = null;
+  static #l10nColor = null;
+  static get _keyboardManager() {
+    return shadow(this, "_keyboardManager", new KeyboardManager([[["Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [["Space"], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home"], ColorPicker.prototype._moveToBeginning], [["End"], ColorPicker.prototype._moveToEnd]]));
+  }
+  constructor({
+    editor = null,
+    uiManager = null
+  }) {
+    if (editor) {
+      this.#isMainColorPicker = false;
+      this.#editor = editor;
+    } else {
+      this.#isMainColorPicker = true;
+    }
+    this.#uiManager = editor?._uiManager || uiManager;
+    this.#eventBus = this.#uiManager._eventBus;
+    this.#defaultColor = editor?.color?.toUpperCase() || this.#uiManager?.highlightColors.values().next().value || "#FFFF98";
+    ColorPicker.#l10nColor ||= 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 button = this.#button = document.createElement("button");
+    button.className = "colorPicker";
+    button.tabIndex = "0";
+    button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button");
+    button.ariaHasPopup = "true";
+    if (this.#editor) {
+      button.ariaControls = `${this.#editor.id}_colorpicker_dropdown`;
+    }
+    const signal = this.#uiManager._signal;
+    button.addEventListener("click", this.#openDropdown.bind(this), {
+      signal
+    });
+    button.addEventListener("keydown", this.#keyDown.bind(this), {
+      signal
+    });
+    const swatch = this.#buttonSwatch = document.createElement("span");
+    swatch.className = "swatch";
+    swatch.ariaHidden = "true";
+    swatch.style.backgroundColor = this.#defaultColor;
+    button.append(swatch);
+    return button;
+  }
+  renderMainDropdown() {
+    const dropdown = this.#dropdown = this.#getDropdownRoot();
+    dropdown.ariaOrientation = "horizontal";
+    dropdown.ariaLabelledBy = "highlightColorPickerLabel";
+    return dropdown;
+  }
+  #getDropdownRoot() {
+    const div = document.createElement("div");
+    const signal = this.#uiManager._signal;
+    div.addEventListener("contextmenu", noContextMenu, {
+      signal
+    });
+    div.className = "dropdown";
+    div.role = "listbox";
+    div.ariaMultiSelectable = "false";
+    div.ariaOrientation = "vertical";
+    div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown");
+    if (this.#editor) {
+      div.id = `${this.#editor.id}_colorpicker_dropdown`;
+    }
+    for (const [name, color] of this.#uiManager.highlightColors) {
+      const button = document.createElement("button");
+      button.tabIndex = "0";
+      button.role = "option";
+      button.setAttribute("data-color", color);
+      button.title = name;
+      button.setAttribute("data-l10n-id", ColorPicker.#l10nColor[name]);
+      const swatch = document.createElement("span");
+      button.append(swatch);
+      swatch.className = "swatch";
+      swatch.style.backgroundColor = color;
+      button.ariaSelected = color === this.#defaultColor;
+      button.addEventListener("click", this.#colorSelect.bind(this, color), {
+        signal
+      });
+      div.append(button);
+    }
+    div.addEventListener("keydown", this.#keyDown.bind(this), {
+      signal
+    });
+    return div;
+  }
+  #colorSelect(color, event) {
+    event.stopPropagation();
+    this.#eventBus.dispatch("switchannotationeditorparams", {
+      source: this,
+      type: AnnotationEditorParamsType.HIGHLIGHT_COLOR,
+      value: color
+    });
+    this.updateColor(color);
+  }
+  _colorSelectFromKeyboard(event) {
+    if (event.target === this.#button) {
+      this.#openDropdown(event);
+      return;
+    }
+    const color = event.target.getAttribute("data-color");
+    if (!color) {
+      return;
+    }
+    this.#colorSelect(color, event);
+  }
+  _moveToNext(event) {
+    if (!this.#isDropdownVisible) {
+      this.#openDropdown(event);
+      return;
+    }
+    if (event.target === this.#button) {
+      this.#dropdown.firstElementChild?.focus();
+      return;
+    }
+    event.target.nextSibling?.focus();
+  }
+  _moveToPrevious(event) {
+    if (event.target === this.#dropdown?.firstElementChild || event.target === this.#button) {
+      if (this.#isDropdownVisible) {
+        this._hideDropdownFromKeyboard();
+      }
+      return;
+    }
+    if (!this.#isDropdownVisible) {
+      this.#openDropdown(event);
+    }
+    event.target.previousSibling?.focus();
+  }
+  _moveToBeginning(event) {
+    if (!this.#isDropdownVisible) {
+      this.#openDropdown(event);
+      return;
+    }
+    this.#dropdown.firstElementChild?.focus();
+  }
+  _moveToEnd(event) {
+    if (!this.#isDropdownVisible) {
+      this.#openDropdown(event);
+      return;
+    }
+    this.#dropdown.lastElementChild?.focus();
+  }
+  #keyDown(event) {
+    ColorPicker._keyboardManager.exec(this, event);
+  }
+  #openDropdown(event) {
+    if (this.#isDropdownVisible) {
+      this.hideDropdown();
+      return;
+    }
+    this.#dropdownWasFromKeyboard = event.detail === 0;
+    if (!this.#openDropdownAC) {
+      this.#openDropdownAC = new AbortController();
+      window.addEventListener("pointerdown", this.#pointerDown.bind(this), {
+        signal: this.#uiManager.combinedSignal(this.#openDropdownAC)
+      });
+    }
+    this.#button.ariaExpanded = "true";
+    if (this.#dropdown) {
+      this.#dropdown.classList.remove("hidden");
+      return;
+    }
+    const root = this.#dropdown = this.#getDropdownRoot();
+    this.#button.append(root);
+  }
+  #pointerDown(event) {
+    if (this.#dropdown?.contains(event.target)) {
+      return;
+    }
+    this.hideDropdown();
+  }
+  hideDropdown() {
+    this.#dropdown?.classList.add("hidden");
+    this.#button.ariaExpanded = "false";
+    this.#openDropdownAC?.abort();
+    this.#openDropdownAC = null;
+  }
+  get #isDropdownVisible() {
+    return this.#dropdown && !this.#dropdown.classList.contains("hidden");
+  }
+  _hideDropdownFromKeyboard() {
+    if (this.#isMainColorPicker) {
+      return;
+    }
+    if (!this.#isDropdownVisible) {
+      this.#editor?.unselect();
+      return;
+    }
+    this.hideDropdown();
+    this.#button.focus({
+      preventScroll: true,
+      focusVisible: this.#dropdownWasFromKeyboard
+    });
+  }
+  updateColor(color) {
+    if (this.#buttonSwatch) {
+      this.#buttonSwatch.style.backgroundColor = color;
+    }
+    if (!this.#dropdown) {
+      return;
+    }
+    const i = this.#uiManager.highlightColors.values();
+    for (const child of this.#dropdown.children) {
+      child.ariaSelected = i.next().value === color.toUpperCase();
+    }
+  }
+  destroy() {
+    this.#button?.remove();
+    this.#button = null;
+    this.#buttonSwatch = null;
+    this.#dropdown?.remove();
+    this.#dropdown = null;
+  }
+}
+class BasicColorPicker {
+  #input = null;
+  #hasAlpha = false;
+  #editor = null;
+  #uiManager = null;
+  static #l10nColor = null;
+  constructor(editor) {
+    this.#editor = editor;
+    this.#uiManager = editor._uiManager;
+    BasicColorPicker.#l10nColor ||= Object.freeze({
+      freetext: "pdfjs-editor-color-picker-free-text-input",
+      ink: "pdfjs-editor-color-picker-ink-input"
+    });
+  }
+  renderButton() {
+    if (this.#input) {
+      return this.#input;
+    }
+    const {
+      editorType,
+      colorType,
+      colorAndOpacityType,
+      opacityType,
+      color,
+      opacity
+    } = this.#editor;
+    const hasAlpha = this.#hasAlpha = FeatureTest.isAlphaColorInputSupported && opacityType !== undefined;
+    const input = this.#input = document.createElement("input");
+    input.type = "color";
+    if (hasAlpha) {
+      input.setAttribute("alpha", "");
+      const alphaHex = Util.hexNums[Math.round((opacity ?? 1) * 255)];
+      input.value = (color || "#000000") + alphaHex;
+    } else {
+      input.value = color || "#000000";
+    }
+    input.className = "basicColorPicker";
+    input.tabIndex = 0;
+    input.setAttribute("data-l10n-id", BasicColorPicker.#l10nColor[editorType]);
+    input.addEventListener("input", () => {
+      if (hasAlpha) {
+        const rgba = getRGBA(input.value);
+        if (!rgba) {
+          return;
+        }
+        const [r, g, b, op] = rgba;
+        const hex = Util.makeHexColor(r, g, b);
+        if (colorAndOpacityType !== undefined) {
+          this.#uiManager.updateParams(colorAndOpacityType, {
+            color: hex,
+            opacity: op
+          });
+        } else {
+          this.#uiManager.updateParams(colorType, hex);
+          this.#uiManager.updateParams(opacityType, op);
+        }
+      } else {
+        this.#uiManager.updateParams(colorType, input.value);
+      }
+    }, {
+      signal: this.#uiManager._signal
+    });
+    return input;
+  }
+  update(value) {
+    if (!this.#input) {
+      return;
+    }
+    if (this.#hasAlpha) {
+      const alphaHex = Util.hexNums[Math.round(this.#editor.opacity * 255)];
+      this.#input.value = value + alphaHex;
+    } else {
+      this.#input.value = value;
+    }
+  }
+  updateOpacity(value) {
+    if (!this.#input || !this.#hasAlpha) {
+      return;
+    }
+    const alphaHex = Util.hexNums[Math.round(value * 255)];
+    this.#input.value = this.#editor.color + alphaHex;
+  }
+  destroy() {
+    this.#input?.remove();
+    this.#input = null;
+  }
+  hideDropdown() {}
+}
+
+;// ./src/shared/scripting_utils.js
+
+function makeColorComp(n) {
+  return Math.floor(MathClamp(n, 0, 1) * 255).toString(16).padStart(2, "0");
+}
+function scaleAndClamp(x) {
+  return MathClamp(x, 0, 1) * 255;
+}
+class ColorConverters {
+  static CMYK_G([c, y, m, k]) {
+    return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];
+  }
+  static G_CMYK([g]) {
+    return ["CMYK", 0, 0, 0, 1 - g];
+  }
+  static G_RGB([g]) {
+    return ["RGB", g, g, g];
+  }
+  static G_rgb([g]) {
+    g = scaleAndClamp(g);
+    return [g, g, g];
+  }
+  static G_HTML([g]) {
+    const G = makeColorComp(g);
+    return `#${G}${G}${G}`;
+  }
+  static RGB_G([r, g, b]) {
+    return ["G", 0.3 * r + 0.59 * g + 0.11 * b];
+  }
+  static RGB_rgb(color) {
+    return color.map(scaleAndClamp);
+  }
+  static RGB_HTML(color) {
+    return `#${color.map(makeColorComp).join("")}`;
+  }
+  static T_HTML() {
+    return "#00000000";
+  }
+  static T_rgb() {
+    return [null];
+  }
+  static CMYK_RGB([c, y, m, k]) {
+    return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];
+  }
+  static CMYK_rgb([c, y, m, k]) {
+    return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];
+  }
+  static CMYK_HTML(components) {
+    const rgb = this.CMYK_RGB(components).slice(1);
+    return this.RGB_HTML(rgb);
+  }
+  static RGB_CMYK([r, g, b]) {
+    const c = 1 - r;
+    const m = 1 - g;
+    const y = 1 - b;
+    const k = Math.min(c, m, y);
+    return ["CMYK", c, m, y, k];
+  }
+}
+const DateFormats = (/* unused pure expression or super */ null && (["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"]));
+const TimeFormats = (/* unused pure expression or super */ null && (["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"]));
+
+;// ./src/display/svg_factory.js
+
+class BaseSVGFactory {
+  create(width, height, skipDimensions = false) {
+    if (width <= 0 || height <= 0) {
+      throw new Error("Invalid SVG dimensions");
+    }
+    const svg = this._createSVG("svg:svg");
+    svg.setAttribute("version", "1.1");
+    if (!skipDimensions) {
+      svg.setAttribute("width", `${width}px`);
+      svg.setAttribute("height", `${height}px`);
+    }
+    svg.setAttribute("preserveAspectRatio", "none");
+    svg.setAttribute("viewBox", `0 0 ${width} ${height}`);
+    return svg;
+  }
+  createElement(type) {
+    if (typeof type !== "string") {
+      throw new Error("Invalid SVG element type");
+    }
+    return this._createSVG(type);
+  }
+  _createSVG(type) {
+    unreachable("Abstract method `_createSVG` called.");
+  }
+}
+class DOMSVGFactory extends BaseSVGFactory {
+  _createSVG(type) {
+    return document.createElementNS(SVG_NS, type);
+  }
+}
+
+;// ./src/display/annotation_layer.js
+
+
+
+
+
+const annotation_layer_DEFAULT_FONT_SIZE = 9;
+const GetElementsByNameSet = new WeakSet();
+const TIMEZONE_OFFSET = new Date().getTimezoneOffset() * 60 * 1000;
+class AnnotationElementFactory {
+  static create(parameters) {
+    const subtype = parameters.data.annotationType;
+    switch (subtype) {
+      case AnnotationType.LINK:
+        return new LinkAnnotationElement(parameters);
+      case AnnotationType.TEXT:
+        return new TextAnnotationElement(parameters);
+      case AnnotationType.WIDGET:
+        const fieldType = parameters.data.fieldType;
+        switch (fieldType) {
+          case "Tx":
+            return new TextWidgetAnnotationElement(parameters);
+          case "Btn":
+            if (parameters.data.radioButton) {
+              return new RadioButtonWidgetAnnotationElement(parameters);
+            } else if (parameters.data.checkBox) {
+              return new CheckboxWidgetAnnotationElement(parameters);
+            }
+            return new PushButtonWidgetAnnotationElement(parameters);
+          case "Ch":
+            return new ChoiceWidgetAnnotationElement(parameters);
+          case "Sig":
+            return new SignatureWidgetAnnotationElement(parameters);
+        }
+        return new WidgetAnnotationElement(parameters);
+      case AnnotationType.POPUP:
+        return new PopupAnnotationElement(parameters);
+      case AnnotationType.FREETEXT:
+        return new FreeTextAnnotationElement(parameters);
+      case AnnotationType.LINE:
+        return new LineAnnotationElement(parameters);
+      case AnnotationType.SQUARE:
+        return new SquareAnnotationElement(parameters);
+      case AnnotationType.CIRCLE:
+        return new CircleAnnotationElement(parameters);
+      case AnnotationType.POLYLINE:
+        return new PolylineAnnotationElement(parameters);
+      case AnnotationType.CARET:
+        return new CaretAnnotationElement(parameters);
+      case AnnotationType.INK:
+        return new InkAnnotationElement(parameters);
+      case AnnotationType.POLYGON:
+        return new PolygonAnnotationElement(parameters);
+      case AnnotationType.HIGHLIGHT:
+        return new HighlightAnnotationElement(parameters);
+      case AnnotationType.UNDERLINE:
+        return new UnderlineAnnotationElement(parameters);
+      case AnnotationType.SQUIGGLY:
+        return new SquigglyAnnotationElement(parameters);
+      case AnnotationType.STRIKEOUT:
+        return new StrikeOutAnnotationElement(parameters);
+      case AnnotationType.STAMP:
+        return new StampAnnotationElement(parameters);
+      case AnnotationType.FILEATTACHMENT:
+        return new FileAttachmentAnnotationElement(parameters);
+      case AnnotationType.RICHMEDIA:
+      case AnnotationType.SCREEN:
+        return new MediaAnnotationElement(parameters);
+      default:
+        return new AnnotationElement(parameters);
+    }
+  }
+}
+class AnnotationElement {
+  #updates = null;
+  #hasBorder = false;
+  #popupElement = null;
+  constructor(parameters, {
+    isRenderable = false,
+    ignoreBorder = false,
+    createQuadrilaterals = false
+  } = {}) {
+    this.isRenderable = isRenderable;
+    this.data = parameters.data;
+    this.layer = parameters.layer;
+    this.linkService = parameters.linkService;
+    this.downloadManager = parameters.downloadManager;
+    this.imageResourcesPath = parameters.imageResourcesPath;
+    this.renderForms = parameters.renderForms;
+    this.svgFactory = parameters.svgFactory;
+    this.annotationStorage = parameters.annotationStorage;
+    this.enableComment = parameters.enableComment;
+    this.enableScripting = parameters.enableScripting;
+    this.hasJSActions = parameters.hasJSActions;
+    this._fieldObjects = parameters.fieldObjects;
+    this.parent = parameters.parent;
+    this.hasOwnCommentButton = false;
+    if (isRenderable) {
+      this.contentElement = this.container = this._createContainer(ignoreBorder);
+    }
+    if (createQuadrilaterals) {
+      this._createQuadrilaterals();
+    }
+  }
+  static _hasPopupData({
+    contentsObj,
+    richText
+  }) {
+    return !!(contentsObj?.str || richText?.str);
+  }
+  get _isEditable() {
+    return this.data.isEditable;
+  }
+  get hasPopupData() {
+    return AnnotationElement._hasPopupData(this.data) || this.enableComment && !!this.commentText;
+  }
+  get commentData() {
+    const {
+      data
+    } = this;
+    const editor = this.annotationStorage?.getEditor(data.id);
+    if (editor) {
+      return editor.getData();
+    }
+    return data;
+  }
+  get hasCommentButton() {
+    return this.enableComment && this.hasPopupElement;
+  }
+  get commentButtonPosition() {
+    const editor = this.annotationStorage?.getEditor(this.data.id);
+    if (editor) {
+      return editor.commentButtonPositionInPage;
+    }
+    const {
+      quadPoints,
+      inkLists,
+      rect
+    } = this.data;
+    let maxX = -Infinity;
+    let maxY = -Infinity;
+    if (quadPoints?.length >= 8) {
+      for (let i = 0; i < quadPoints.length; i += 8) {
+        if (quadPoints[i + 1] > maxY) {
+          maxY = quadPoints[i + 1];
+          maxX = quadPoints[i + 2];
+        } else if (quadPoints[i + 1] === maxY) {
+          maxX = Math.max(maxX, quadPoints[i + 2]);
+        }
+      }
+      return [maxX, maxY];
+    }
+    if (inkLists?.length >= 1) {
+      for (const inkList of inkLists) {
+        for (let i = 0, ii = inkList.length; i < ii; i += 2) {
+          if (inkList[i + 1] > maxY) {
+            maxY = inkList[i + 1];
+            maxX = inkList[i];
+          } else if (inkList[i + 1] === maxY) {
+            maxX = Math.max(maxX, inkList[i]);
+          }
+        }
+      }
+      if (maxX !== Infinity) {
+        return [maxX, maxY];
+      }
+    }
+    if (rect) {
+      return [rect[2], rect[3]];
+    }
+    return null;
+  }
+  _normalizePoint(point) {
+    const {
+      page: {
+        view
+      },
+      viewport: {
+        rawDims: {
+          pageWidth,
+          pageHeight,
+          pageX,
+          pageY
+        }
+      }
+    } = this.parent;
+    point[1] = view[3] - point[1] + view[1];
+    point[0] = 100 * (point[0] - pageX) / pageWidth;
+    point[1] = 100 * (point[1] - pageY) / pageHeight;
+    return point;
+  }
+  get commentText() {
+    const {
+      data
+    } = this;
+    return this.annotationStorage.getRawValue(`${AnnotationEditorPrefix}${data.id}`)?.popup?.contents || data.contentsObj?.str || "";
+  }
+  set commentText(text) {
+    const {
+      data
+    } = this;
+    const popup = {
+      deleted: !text,
+      contents: text || ""
+    };
+    if (!this.annotationStorage.updateEditor(data.id, {
+      popup
+    })) {
+      this.annotationStorage.setValue(`${AnnotationEditorPrefix}${data.id}`, {
+        id: data.id,
+        annotationType: data.annotationType,
+        page: this.parent.page,
+        popup,
+        popupRef: data.popupRef,
+        modificationDate: new Date()
+      });
+    }
+    if (!text) {
+      this.removePopup();
+    }
+  }
+  removePopup() {
+    (this.#popupElement?.popup || this.popup)?.remove();
+    this.#popupElement = this.popup = null;
+  }
+  updateEdited(params) {
+    if (!this.container) {
+      return;
+    }
+    if (params.rect) {
+      this.#updates ||= {
+        rect: this.data.rect.slice(0)
+      };
+    }
+    const {
+      rect,
+      popup: newPopup
+    } = params;
+    if (rect) {
+      this.#setRectEdited(rect);
+    }
+    let popup = this.#popupElement?.popup || this.popup;
+    if (!popup && newPopup?.text) {
+      this._createPopup(newPopup);
+      popup = this.#popupElement.popup;
+    }
+    if (!popup) {
+      return;
+    }
+    popup.updateEdited(params);
+    if (newPopup?.deleted) {
+      popup.remove();
+      this.#popupElement = null;
+      this.popup = null;
+    }
+  }
+  resetEdited() {
+    if (!this.#updates) {
+      return;
+    }
+    this.#setRectEdited(this.#updates.rect);
+    this.#popupElement?.popup.resetEdited();
+    this.#updates = null;
+  }
+  #setRectEdited(rect) {
+    const {
+      container: {
+        style
+      },
+      data: {
+        rect: currentRect,
+        rotation
+      },
+      parent: {
+        viewport: {
+          rawDims: {
+            pageWidth,
+            pageHeight,
+            pageX,
+            pageY
+          }
+        }
+      }
+    } = this;
+    currentRect?.splice(0, 4, ...rect);
+    style.left = `${100 * (rect[0] - pageX) / pageWidth}%`;
+    style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`;
+    if (rotation === 0) {
+      style.width = `${100 * (rect[2] - rect[0]) / pageWidth}%`;
+      style.height = `${100 * (rect[3] - rect[1]) / pageHeight}%`;
+    } else {
+      this.setRotation(rotation);
+    }
+  }
+  _createContainer(ignoreBorder) {
+    const {
+      data,
+      parent: {
+        page,
+        viewport
+      }
+    } = this;
+    const container = document.createElement("section");
+    container.setAttribute("data-annotation-id", data.id);
+    if (!(this instanceof WidgetAnnotationElement) && !(this instanceof LinkAnnotationElement) && !(this instanceof MediaAnnotationElement)) {
+      container.tabIndex = 0;
+    }
+    const {
+      style
+    } = container;
+    style.zIndex = this.parent.zIndex;
+    this.parent.zIndex += 2;
+    if (data.alternativeText) {
+      container.title = data.alternativeText;
+    }
+    if (data.noRotate) {
+      container.classList.add("norotate");
+    }
+    if (!data.rect || this instanceof PopupAnnotationElement) {
+      const {
+        rotation
+      } = data;
+      if (!data.hasOwnCanvas && rotation !== 0) {
+        this.setRotation(rotation, container);
+      }
+      return container;
+    }
+    const {
+      width,
+      height
+    } = this;
+    if (!ignoreBorder && data.borderStyle.width > 0) {
+      style.borderWidth = `${data.borderStyle.width}px`;
+      const horizontalRadius = data.borderStyle.horizontalCornerRadius;
+      const verticalRadius = data.borderStyle.verticalCornerRadius;
+      if (horizontalRadius > 0 || verticalRadius > 0) {
+        const radius = `calc(${horizontalRadius}px * var(--total-scale-factor)) / calc(${verticalRadius}px * var(--total-scale-factor))`;
+        style.borderRadius = radius;
+      }
+      switch (data.borderStyle.style) {
+        case AnnotationBorderStyleType.SOLID:
+          style.borderStyle = "solid";
+          break;
+        case AnnotationBorderStyleType.DASHED:
+          style.borderStyle = "dashed";
+          break;
+        case AnnotationBorderStyleType.BEVELED:
+          warn("Unimplemented border style: beveled");
+          break;
+        case AnnotationBorderStyleType.INSET:
+          warn("Unimplemented border style: inset");
+          break;
+        case AnnotationBorderStyleType.UNDERLINE:
+          style.borderBottomStyle = "solid";
+          break;
+        default:
+          break;
+      }
+      const borderColor = data.borderColor || null;
+      if (borderColor) {
+        this.#hasBorder = true;
+        style.borderColor = Util.makeHexColor(...borderColor);
+      } else {
+        style.borderWidth = 0;
+      }
+    }
+    const rect = Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);
+    const {
+      pageWidth,
+      pageHeight,
+      pageX,
+      pageY
+    } = viewport.rawDims;
+    style.left = `${100 * (rect[0] - pageX) / pageWidth}%`;
+    style.top = `${100 * (rect[1] - pageY) / pageHeight}%`;
+    const {
+      rotation
+    } = data;
+    if (data.hasOwnCanvas || rotation === 0) {
+      style.width = `${100 * width / pageWidth}%`;
+      style.height = `${100 * height / pageHeight}%`;
+    } else {
+      this.setRotation(rotation, container);
+    }
+    return container;
+  }
+  setRotation(angle, container = this.container) {
+    if (!this.data.rect) {
+      return;
+    }
+    const {
+      pageWidth,
+      pageHeight
+    } = this.parent.viewport.rawDims;
+    let {
+      width,
+      height
+    } = this;
+    if (angle % 180 !== 0) {
+      [width, height] = [height, width];
+    }
+    container.style.width = `${100 * width / pageWidth}%`;
+    container.style.height = `${100 * height / pageHeight}%`;
+    container.setAttribute("data-main-rotation", (360 - angle) % 360);
+  }
+  get _commonActions() {
+    const setColor = (jsName, styleName, event) => {
+      const color = event.detail[jsName];
+      const colorType = color[0];
+      const colorArray = color.slice(1);
+      event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray);
+      this.annotationStorage.setValue(this.data.id, {
+        [styleName]: ColorConverters[`${colorType}_rgb`](colorArray)
+      });
+    };
+    return shadow(this, "_commonActions", {
+      display: event => {
+        const {
+          display
+        } = event.detail;
+        const hidden = display % 2 === 1;
+        this.container.style.visibility = hidden ? "hidden" : "visible";
+        this.annotationStorage.setValue(this.data.id, {
+          noView: hidden,
+          noPrint: display === 1 || display === 2
+        });
+      },
+      print: event => {
+        this.annotationStorage.setValue(this.data.id, {
+          noPrint: !event.detail.print
+        });
+      },
+      hidden: event => {
+        const {
+          hidden
+        } = event.detail;
+        this.container.style.visibility = hidden ? "hidden" : "visible";
+        this.annotationStorage.setValue(this.data.id, {
+          noPrint: hidden,
+          noView: hidden
+        });
+      },
+      focus: event => {
+        setTimeout(() => event.target.focus({
+          preventScroll: false
+        }), 0);
+      },
+      userName: event => {
+        event.target.title = event.detail.userName;
+      },
+      readonly: event => {
+        event.target.disabled = event.detail.readonly;
+      },
+      required: event => {
+        this._setRequired(event.target, event.detail.required);
+      },
+      bgColor: event => {
+        setColor("bgColor", "backgroundColor", event);
+      },
+      fillColor: event => {
+        setColor("fillColor", "backgroundColor", event);
+      },
+      fgColor: event => {
+        setColor("fgColor", "color", event);
+      },
+      textColor: event => {
+        setColor("textColor", "color", event);
+      },
+      borderColor: event => {
+        setColor("borderColor", "borderColor", event);
+      },
+      strokeColor: event => {
+        setColor("strokeColor", "borderColor", event);
+      },
+      rotation: event => {
+        const angle = event.detail.rotation;
+        this.setRotation(angle);
+        this.annotationStorage.setValue(this.data.id, {
+          rotation: angle
+        });
+      }
+    });
+  }
+  _dispatchEventFromSandbox(actions, jsEvent) {
+    const commonActions = this._commonActions;
+    for (const name of Object.keys(jsEvent.detail)) {
+      const action = actions[name] || commonActions[name];
+      action?.(jsEvent);
+    }
+  }
+  _setDefaultPropertiesFromJS(element) {
+    if (!this.enableScripting) {
+      return;
+    }
+    const storedData = this.annotationStorage.getRawValue(this.data.id);
+    if (!storedData) {
+      return;
+    }
+    const commonActions = this._commonActions;
+    for (const [actionName, detail] of Object.entries(storedData)) {
+      const action = commonActions[actionName];
+      if (action) {
+        const eventProxy = {
+          detail: {
+            [actionName]: detail
+          },
+          target: element
+        };
+        action(eventProxy);
+        delete storedData[actionName];
+      }
+    }
+  }
+  _createQuadrilaterals() {
+    if (!this.container) {
+      return;
+    }
+    const {
+      quadPoints
+    } = this.data;
+    if (!quadPoints) {
+      return;
+    }
+    const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x));
+    if (quadPoints.length === 8) {
+      const [trX, trY, blX, blY] = quadPoints.subarray(2, 6);
+      if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) {
+        return;
+      }
+    }
+    const {
+      style
+    } = this.container;
+    let svgBuffer;
+    if (this.#hasBorder) {
+      const {
+        borderColor,
+        borderWidth
+      } = style;
+      style.borderWidth = 0;
+      svgBuffer = ["url('data:image/svg+xml;utf8,", `<svg xmlns="${SVG_NS}" preserveAspectRatio="none" viewBox="0 0 1 1">`, `<g fill="transparent" stroke="${borderColor}" stroke-width="${borderWidth}">`];
+      this.container.classList.add("hasBorder");
+    }
+    const width = rectTrX - rectBlX;
+    const height = rectTrY - rectBlY;
+    const {
+      svgFactory
+    } = this;
+    const svg = svgFactory.createElement("svg");
+    svg.classList.add("quadrilateralsContainer");
+    svg.setAttribute("width", 0);
+    svg.setAttribute("height", 0);
+    svg.role = "none";
+    const defs = svgFactory.createElement("defs");
+    svg.append(defs);
+    const clipPath = svgFactory.createElement("clipPath");
+    const id = `clippath_${this.data.id}`;
+    clipPath.setAttribute("id", id);
+    clipPath.setAttribute("clipPathUnits", "objectBoundingBox");
+    defs.append(clipPath);
+    for (let i = 2, ii = quadPoints.length; i < ii; i += 8) {
+      const trX = quadPoints[i];
+      const trY = quadPoints[i + 1];
+      const blX = quadPoints[i + 2];
+      const blY = quadPoints[i + 3];
+      const rect = svgFactory.createElement("rect");
+      const x = (blX - rectBlX) / width;
+      const y = (rectTrY - trY) / height;
+      const rectWidth = (trX - blX) / width;
+      const rectHeight = (trY - blY) / height;
+      rect.setAttribute("x", x);
+      rect.setAttribute("y", y);
+      rect.setAttribute("width", rectWidth);
+      rect.setAttribute("height", rectHeight);
+      clipPath.append(rect);
+      svgBuffer?.push(`<rect vector-effect="non-scaling-stroke" x="${x}" y="${y}" width="${rectWidth}" height="${rectHeight}"/>`);
+    }
+    if (this.#hasBorder) {
+      svgBuffer.push(`</g></svg>')`);
+      style.backgroundImage = svgBuffer.join("");
+    }
+    this.container.append(svg);
+    this.container.style.clipPath = `url(#${id})`;
+  }
+  _createPopup(popupData = null) {
+    const {
+      data
+    } = this;
+    let contentsObj, modificationDate;
+    if (popupData) {
+      contentsObj = {
+        str: popupData.text
+      };
+      modificationDate = popupData.date;
+    } else {
+      contentsObj = data.contentsObj;
+      modificationDate = data.modificationDate;
+    }
+    this.#popupElement = new PopupAnnotationElement({
+      data: {
+        color: data.color,
+        titleObj: data.titleObj,
+        modificationDate,
+        contentsObj,
+        richText: data.richText,
+        parentRect: data.rect,
+        borderStyle: 0,
+        id: `popup_${data.id}`,
+        rotation: data.rotation,
+        noRotate: true
+      },
+      linkService: this.linkService,
+      parent: this.parent,
+      elements: [this]
+    });
+  }
+  get hasPopupElement() {
+    return !!(this.#popupElement || this.popup || this.data.popupRef);
+  }
+  get extraPopupElement() {
+    return this.#popupElement;
+  }
+  render() {
+    unreachable("Abstract method `AnnotationElement.render` called");
+  }
+  _getElementsByName(name, skipId = null) {
+    const fields = [];
+    if (this._fieldObjects) {
+      const fieldObj = this._fieldObjects[name];
+      if (fieldObj) {
+        for (const {
+          page,
+          id,
+          exportValues
+        } of fieldObj) {
+          if (page === -1) {
+            continue;
+          }
+          if (id === skipId) {
+            continue;
+          }
+          const exportValue = typeof exportValues === "string" ? exportValues : null;
+          const domElement = document.querySelector(`[data-element-id="${id}"]`);
+          if (domElement && !GetElementsByNameSet.has(domElement)) {
+            warn(`_getElementsByName - element not allowed: ${id}`);
+            continue;
+          }
+          fields.push({
+            id,
+            exportValue,
+            domElement
+          });
+        }
+      }
+      return fields;
+    }
+    for (const domElement of document.getElementsByName(name)) {
+      const {
+        exportValue
+      } = domElement;
+      const id = domElement.getAttribute("data-element-id");
+      if (id === skipId) {
+        continue;
+      }
+      if (!GetElementsByNameSet.has(domElement)) {
+        continue;
+      }
+      fields.push({
+        id,
+        exportValue,
+        domElement
+      });
+    }
+    return fields;
+  }
+  show() {
+    if (this.container) {
+      this.container.hidden = false;
+    }
+    this.popup?.maybeShow();
+  }
+  hide() {
+    if (this.container) {
+      this.container.hidden = true;
+    }
+    this.popup?.forceHide();
+  }
+  getElementsToTriggerPopup() {
+    return this.container;
+  }
+  addHighlightArea() {
+    const triggers = this.getElementsToTriggerPopup();
+    if (Array.isArray(triggers)) {
+      for (const element of triggers) {
+        element.classList.add("highlightArea");
+      }
+    } else {
+      triggers.classList.add("highlightArea");
+    }
+  }
+  _editOnDoubleClick() {
+    if (!this._isEditable) {
+      return;
+    }
+    const {
+      annotationEditorType: mode,
+      data: {
+        id: editId
+      }
+    } = this;
+    this.container.addEventListener("dblclick", () => {
+      this.linkService.eventBus?.dispatch("switchannotationeditormode", {
+        source: this,
+        mode,
+        editId,
+        mustEnterInEditMode: true
+      });
+    });
+  }
+  updateOC(optionalContentConfig) {
+    if (!this.data.oc || !optionalContentConfig) {
+      return;
+    }
+    const isVisible = optionalContentConfig.isVisible(this.data.oc);
+    if (isVisible) {
+      this.show();
+    } else {
+      this.hide();
+    }
+  }
+  get width() {
+    return this.data.rect[2] - this.data.rect[0];
+  }
+  get height() {
+    return this.data.rect[3] - this.data.rect[1];
+  }
+  _setBackgroundColor(element) {
+    const color = this.data.backgroundColor || null;
+    element.style.backgroundColor = color === null ? "transparent" : Util.makeHexColor(...color);
+  }
+}
+class EditorAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+    this.editor = parameters.editor;
+  }
+  render() {
+    this.container.className = "editorAnnotation";
+    return this.container;
+  }
+  createOrUpdatePopup() {
+    const {
+      editor
+    } = this;
+    if (!editor.hasComment) {
+      return;
+    }
+    this._createPopup(editor.comment);
+  }
+  get hasCommentButton() {
+    return this.enableComment && this.editor.hasComment;
+  }
+  get commentButtonPosition() {
+    return this.editor.commentButtonPositionInPage;
+  }
+  get commentText() {
+    return this.editor.comment.text;
+  }
+  set commentText(text) {
+    this.editor.comment = text;
+    if (!text) {
+      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(parameters, options = null) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: !!options?.ignoreBorder,
+      createQuadrilaterals: true
+    });
+    this.isTooltipOnly = parameters.data.isTooltipOnly;
+  }
+  render() {
+    const {
+      data,
+      linkService
+    } = this;
+    const link = document.createElement("a");
+    link.setAttribute("data-element-id", data.id);
+    let isBound = false;
+    if (data.url) {
+      linkService.addLinkAttributes(link, data.url, data.newWindow);
+      isBound = true;
+    } else if (data.action) {
+      this._bindNamedAction(link, data.action, data.overlaidText);
+      isBound = true;
+    } else if (data.attachment) {
+      this.#bindAttachment(link, data.attachmentId, data.attachment, data.overlaidText, data.attachmentDest);
+      isBound = true;
+    } else if (data.setOCGState) {
+      this.#bindSetOCGState(link, data.setOCGState, data.overlaidText);
+      isBound = true;
+    } else if (data.dest) {
+      this._bindLink(link, data.dest, data.overlaidText);
+      isBound = true;
+    } else {
+      if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) {
+        this._bindJSAction(link, data);
+        isBound = true;
+      }
+      if (data.resetForm) {
+        this._bindResetFormAction(link, data.resetForm);
+        isBound = true;
+      } else if (this.isTooltipOnly && !isBound) {
+        this._bindLink(link, "");
+        isBound = true;
+      }
+    }
+    this.container.classList.add("linkAnnotation");
+    if (isBound) {
+      this.contentElement = link;
+      this.container.append(link);
+    }
+    return this.container;
+  }
+  #setInternalLink() {
+    this.container.setAttribute("data-internal-link", "");
+  }
+  _bindLink(link, destination, overlaidText = "") {
+    link.href = this.linkService.getDestinationHash(destination);
+    link.onclick = () => {
+      if (destination) {
+        this.linkService.goToDestination(destination);
+      }
+      return false;
+    };
+    if (destination || destination === "") {
+      this.#setInternalLink();
+    }
+    if (overlaidText) {
+      link.title = overlaidText;
+    }
+  }
+  _bindNamedAction(link, action, overlaidText = "") {
+    link.href = this.linkService.getAnchorUrl("");
+    link.onclick = () => {
+      this.linkService.executeNamedAction(action);
+      return false;
+    };
+    if (overlaidText) {
+      link.title = overlaidText;
+    }
+    this.#setInternalLink();
+  }
+  #bindAttachment(link, attachmentId, attachment, overlaidText = "", dest = null) {
+    link.href = this.linkService.getAnchorUrl("");
+    if (attachment.description) {
+      link.title = attachment.description;
+    } else if (overlaidText) {
+      link.title = overlaidText;
+    }
+    const openAttachment = async () => {
+      const content = await this.linkService.getAttachmentContent(attachmentId);
+      if (content) {
+        this.downloadManager?.openOrDownloadData(content, attachment.filename, dest);
+      }
+    };
+    link.onclick = () => {
+      openAttachment();
+      return false;
+    };
+    this.#setInternalLink();
+  }
+  #bindSetOCGState(link, action, overlaidText = "") {
+    link.href = this.linkService.getAnchorUrl("");
+    link.onclick = () => {
+      this.linkService.executeSetOCGState(action);
+      return false;
+    };
+    if (overlaidText) {
+      link.title = overlaidText;
+    }
+    this.#setInternalLink();
+  }
+  _bindJSAction(link, data) {
+    link.href = this.linkService.getAnchorUrl("");
+    const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]);
+    for (const name of Object.keys(data.actions)) {
+      const jsName = map.get(name);
+      if (!jsName) {
+        continue;
+      }
+      link[jsName] = () => {
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id: data.id,
+            name
+          }
+        });
+        return false;
+      };
+    }
+    if (data.overlaidText) {
+      link.title = data.overlaidText;
+    }
+    if (!link.onclick) {
+      link.onclick = () => false;
+    }
+    this.#setInternalLink();
+  }
+  _bindResetFormAction(link, resetForm) {
+    const otherClickAction = link.onclick;
+    if (!otherClickAction) {
+      link.href = this.linkService.getAnchorUrl("");
+    }
+    this.#setInternalLink();
+    if (!this._fieldObjects) {
+      warn(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided.");
+      if (!otherClickAction) {
+        link.onclick = () => false;
+      }
+      return;
+    }
+    link.onclick = () => {
+      otherClickAction?.();
+      const {
+        fields: resetFormFields,
+        refs: resetFormRefs,
+        include
+      } = resetForm;
+      const allFields = [];
+      if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) {
+        const fieldIds = new Set(resetFormRefs);
+        for (const fieldName of resetFormFields) {
+          const fields = this._fieldObjects[fieldName] || [];
+          for (const {
+            id
+          } of fields) {
+            fieldIds.add(id);
+          }
+        }
+        for (const fields of Object.values(this._fieldObjects)) {
+          for (const field of fields) {
+            if (fieldIds.has(field.id) === include) {
+              allFields.push(field);
+            }
+          }
+        }
+      } else {
+        for (const fields of Object.values(this._fieldObjects)) {
+          allFields.push(...fields);
+        }
+      }
+      const storage = this.annotationStorage;
+      const allIds = [];
+      for (const field of allFields) {
+        const {
+          id
+        } = field;
+        allIds.push(id);
+        switch (field.type) {
+          case "text":
+            {
+              const value = field.defaultValue || "";
+              storage.setValue(id, {
+                value
+              });
+              break;
+            }
+          case "checkbox":
+          case "radiobutton":
+            {
+              const value = field.defaultValue === field.exportValues;
+              storage.setValue(id, {
+                value
+              });
+              break;
+            }
+          case "combobox":
+          case "listbox":
+            {
+              const value = field.defaultValue || "";
+              storage.setValue(id, {
+                value
+              });
+              break;
+            }
+          default:
+            continue;
+        }
+        const domElement = document.querySelector(`[data-element-id="${id}"]`);
+        if (!domElement) {
+          continue;
+        } else if (!GetElementsByNameSet.has(domElement)) {
+          warn(`_bindResetFormAction - element not allowed: ${id}`);
+          continue;
+        }
+        domElement.dispatchEvent(new Event("resetform"));
+      }
+      if (this.enableScripting) {
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id: "app",
+            ids: allIds,
+            name: "ResetForm"
+          }
+        });
+      }
+      return false;
+    };
+  }
+}
+class TextAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true
+    });
+  }
+  render() {
+    this.container.classList.add("textAnnotation");
+    const image = document.createElement("img");
+    image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg";
+    image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type");
+    image.setAttribute("data-l10n-args", JSON.stringify({
+      type: this.data.name
+    }));
+    if (!this.data.popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    this.container.append(image);
+    return this.container;
+  }
+}
+class WidgetAnnotationElement extends AnnotationElement {
+  render() {
+    return this.container;
+  }
+  _getKeyModifier(event) {
+    return FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey;
+  }
+  _setEventListener(element, elementData, baseName, eventName, valueGetter) {
+    if (baseName.includes("mouse")) {
+      element.addEventListener(baseName, event => {
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id: this.data.id,
+            name: eventName,
+            value: valueGetter(event),
+            shift: event.shiftKey,
+            modifier: this._getKeyModifier(event)
+          }
+        });
+      });
+    } else {
+      element.addEventListener(baseName, event => {
+        if (baseName === "blur") {
+          if (!elementData.focused || !event.relatedTarget) {
+            return;
+          }
+          elementData.focused = false;
+        } else if (baseName === "focus") {
+          if (elementData.focused) {
+            return;
+          }
+          elementData.focused = true;
+        }
+        if (!valueGetter) {
+          return;
+        }
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id: this.data.id,
+            name: eventName,
+            value: valueGetter(event)
+          }
+        });
+      });
+    }
+  }
+  _setEventListeners(element, elementData, names, getter) {
+    for (const [baseName, eventName] of names) {
+      if (eventName === "Action" || this.data.actions?.[eventName]) {
+        if (eventName === "Focus" || eventName === "Blur") {
+          elementData ||= {
+            focused: false
+          };
+        }
+        this._setEventListener(element, elementData, baseName, eventName, getter);
+        if (eventName === "Focus" && !this.data.actions?.Blur) {
+          this._setEventListener(element, elementData, "blur", "Blur", null);
+        } else if (eventName === "Blur" && !this.data.actions?.Focus) {
+          this._setEventListener(element, elementData, "focus", "Focus", null);
+        }
+      }
+    }
+  }
+  _setTextStyle(element) {
+    const TEXT_ALIGNMENT = ["left", "center", "right"];
+    const {
+      fontColor
+    } = this.data.defaultAppearanceData;
+    const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE;
+    const style = element.style;
+    let computedFontSize;
+    const BORDER_SIZE = 2;
+    const roundToOneDecimal = x => Math.round(10 * x) / 10;
+    if (this.data.multiLine) {
+      const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE);
+      const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1;
+      const lineHeight = height / numberOfLines;
+      computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR));
+    } else {
+      const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE);
+      computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR));
+    }
+    style.fontSize = `calc(${computedFontSize}px * var(--total-scale-factor))`;
+    style.color = Util.makeHexColor(...fontColor);
+    if (this.data.textAlignment !== null && !this.data.comb) {
+      style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];
+    }
+  }
+  _setRequired(element, isRequired) {
+    if (isRequired) {
+      element.setAttribute("required", true);
+    } else {
+      element.removeAttribute("required");
+    }
+    element.setAttribute("aria-required", isRequired);
+  }
+}
+class TextWidgetAnnotationElement extends WidgetAnnotationElement {
+  constructor(parameters) {
+    const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue;
+    super(parameters, {
+      isRenderable
+    });
+  }
+  setPropertyOnSiblings(base, key, value, keyInStorage) {
+    const storage = this.annotationStorage;
+    for (const element of this._getElementsByName(base.name, base.id)) {
+      if (element.domElement) {
+        element.domElement[key] = value;
+      }
+      storage.setValue(element.id, {
+        [keyInStorage]: value
+      });
+    }
+  }
+  render() {
+    const storage = this.annotationStorage;
+    const id = this.data.id;
+    this.container.classList.add("textWidgetAnnotation");
+    let element = null;
+    if (this.renderForms) {
+      const storedData = storage.getValue(id, {
+        value: this.data.fieldValue
+      });
+      let textContent = storedData.value || "";
+      const maxLen = storage.getValue(id, {
+        charLimit: this.data.maxLen
+      }).charLimit;
+      if (maxLen && textContent.length > maxLen) {
+        textContent = textContent.slice(0, maxLen);
+      }
+      let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null;
+      if (fieldFormattedValues && this.data.comb) {
+        fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, "");
+      }
+      const elementData = {
+        userValue: textContent,
+        formattedValue: fieldFormattedValues,
+        lastCommittedValue: null,
+        commitKey: 1,
+        focused: false
+      };
+      if (this.data.multiLine) {
+        element = document.createElement("textarea");
+        element.textContent = fieldFormattedValues ?? textContent;
+        if (this.data.doNotScroll) {
+          element.style.overflowY = "hidden";
+        }
+      } else {
+        element = document.createElement("input");
+        element.type = this.data.password ? "password" : "text";
+        element.setAttribute("value", fieldFormattedValues ?? textContent);
+        if (this.data.doNotScroll) {
+          element.style.overflowX = "hidden";
+        }
+      }
+      if (this.data.hasOwnCanvas) {
+        this.container.classList.add("hasOwnCanvas");
+        if (storage.has(id)) {
+          this.container.classList.add("sandboxModified");
+        }
+      }
+      GetElementsByNameSet.add(element);
+      this.contentElement = element;
+      element.setAttribute("data-element-id", id);
+      element.disabled = this.data.readOnly;
+      element.name = this.data.fieldName;
+      element.tabIndex = 0;
+      const {
+        datetimeFormat,
+        datetimeType,
+        timeStep
+      } = this.data;
+      const hasDateOrTime = !!datetimeType && this.enableScripting;
+      if (datetimeFormat) {
+        element.title = datetimeFormat;
+      }
+      this._setRequired(element, this.data.required);
+      if (maxLen) {
+        element.maxLength = maxLen;
+      }
+      element.addEventListener("input", event => {
+        storage.setValue(id, {
+          value: event.target.value
+        });
+        this.setPropertyOnSiblings(element, "value", event.target.value, "value");
+        elementData.formattedValue = null;
+      });
+      element.addEventListener("resetform", event => {
+        const defaultValue = this.data.defaultFieldValue ?? "";
+        element.value = elementData.userValue = defaultValue;
+        elementData.formattedValue = null;
+      });
+      let blurListener = event => {
+        const {
+          formattedValue
+        } = elementData;
+        if (formattedValue !== null && formattedValue !== undefined) {
+          event.target.value = formattedValue;
+        }
+        event.target.scrollLeft = 0;
+      };
+      if (this.enableScripting && this.hasJSActions) {
+        element.addEventListener("focus", event => {
+          if (elementData.focused) {
+            return;
+          }
+          const {
+            target
+          } = event;
+          if (hasDateOrTime) {
+            target.type = datetimeType;
+            if (timeStep) {
+              target.step = timeStep;
+            }
+          }
+          if (elementData.userValue) {
+            const value = elementData.userValue;
+            if (hasDateOrTime) {
+              if (datetimeType === "time") {
+                const date = new Date(value);
+                const parts = [date.getHours(), date.getMinutes(), date.getSeconds()];
+                target.value = parts.map(v => v.toString().padStart(2, "0")).join(":");
+              } else {
+                target.value = new Date(value - TIMEZONE_OFFSET).toISOString().split(datetimeType === "date" ? "T" : ".", 1)[0];
+              }
+            } else {
+              target.value = value;
+            }
+          }
+          elementData.lastCommittedValue = target.value;
+          elementData.commitKey = 1;
+          if (!this.data.actions?.Focus) {
+            elementData.focused = true;
+          }
+        });
+        element.addEventListener("updatefromsandbox", jsEvent => {
+          this.container.classList.add("sandboxModified");
+          const actions = {
+            value(event) {
+              elementData.userValue = event.detail.value ?? "";
+              if (!hasDateOrTime) {
+                storage.setValue(id, {
+                  value: elementData.userValue.toString()
+                });
+              }
+              event.target.value = elementData.userValue;
+            },
+            formattedValue(event) {
+              const {
+                formattedValue
+              } = event.detail;
+              elementData.formattedValue = formattedValue;
+              if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) {
+                event.target.value = formattedValue;
+              }
+              const data = {
+                formattedValue
+              };
+              if (hasDateOrTime) {
+                data.value = formattedValue;
+              }
+              storage.setValue(id, data);
+            },
+            selRange(event) {
+              event.target.setSelectionRange(...event.detail.selRange);
+            },
+            charLimit: event => {
+              const {
+                charLimit
+              } = event.detail;
+              const {
+                target
+              } = event;
+              if (charLimit === 0) {
+                target.removeAttribute("maxLength");
+                return;
+              }
+              target.setAttribute("maxLength", charLimit);
+              let value = elementData.userValue;
+              if (!value || value.length <= charLimit) {
+                return;
+              }
+              value = value.slice(0, charLimit);
+              target.value = elementData.userValue = value;
+              storage.setValue(id, {
+                value
+              });
+              this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+                source: this,
+                detail: {
+                  id,
+                  name: "Keystroke",
+                  value,
+                  willCommit: true,
+                  commitKey: 1,
+                  selStart: target.selectionStart,
+                  selEnd: target.selectionEnd
+                }
+              });
+            }
+          };
+          this._dispatchEventFromSandbox(actions, jsEvent);
+        });
+        element.addEventListener("keydown", event => {
+          elementData.commitKey = 1;
+          let commitKey = -1;
+          if (event.key === "Escape") {
+            commitKey = 0;
+          } else if (event.key === "Enter" && !this.data.multiLine) {
+            commitKey = 2;
+          } else if (event.key === "Tab") {
+            elementData.commitKey = 3;
+          }
+          if (commitKey === -1) {
+            return;
+          }
+          const {
+            value
+          } = event.target;
+          if (elementData.lastCommittedValue === value) {
+            return;
+          }
+          elementData.lastCommittedValue = value;
+          elementData.userValue = value;
+          this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+            source: this,
+            detail: {
+              id,
+              name: "Keystroke",
+              value,
+              willCommit: true,
+              commitKey,
+              selStart: event.target.selectionStart,
+              selEnd: event.target.selectionEnd
+            }
+          });
+        });
+        const _blurListener = blurListener;
+        blurListener = null;
+        element.addEventListener("blur", event => {
+          if (!elementData.focused || !event.relatedTarget) {
+            return;
+          }
+          if (!this.data.actions?.Blur) {
+            elementData.focused = false;
+          }
+          const {
+            target
+          } = event;
+          let {
+            value
+          } = target;
+          if (hasDateOrTime) {
+            if (value && datetimeType === "time") {
+              const parts = value.split(":").map(v => parseInt(v, 10));
+              value = new Date(2000, 0, 1, parts[0], parts[1], parts[2] || 0).valueOf();
+              target.step = "";
+            } else {
+              if (!value.includes("T")) {
+                value = `${value}T00:00`;
+              }
+              value = new Date(value).valueOf();
+            }
+            target.type = "text";
+          }
+          elementData.userValue = value;
+          if (elementData.lastCommittedValue !== value) {
+            this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+              source: this,
+              detail: {
+                id,
+                name: "Keystroke",
+                value,
+                willCommit: true,
+                commitKey: elementData.commitKey,
+                selStart: event.target.selectionStart,
+                selEnd: event.target.selectionEnd
+              }
+            });
+          }
+          _blurListener(event);
+        });
+        if (this.data.actions?.Keystroke) {
+          element.addEventListener("beforeinput", event => {
+            elementData.lastCommittedValue = null;
+            const {
+              data,
+              target
+            } = event;
+            const {
+              value,
+              selectionStart,
+              selectionEnd
+            } = target;
+            let selStart = selectionStart,
+              selEnd = selectionEnd;
+            switch (event.inputType) {
+              case "deleteWordBackward":
+                {
+                  const match = value.substring(0, selectionStart).match(/\w*\W*$/);
+                  if (match) {
+                    selStart -= match[0].length;
+                  }
+                  break;
+                }
+              case "deleteWordForward":
+                {
+                  const match = value.substring(selectionStart).match(/^\W*\w*/);
+                  if (match) {
+                    selEnd += match[0].length;
+                  }
+                  break;
+                }
+              case "deleteContentBackward":
+                if (selectionStart === selectionEnd) {
+                  selStart -= 1;
+                }
+                break;
+              case "deleteContentForward":
+                if (selectionStart === selectionEnd) {
+                  selEnd += 1;
+                }
+                break;
+            }
+            event.preventDefault();
+            this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+              source: this,
+              detail: {
+                id,
+                name: "Keystroke",
+                value,
+                change: data || "",
+                willCommit: false,
+                selStart,
+                selEnd
+              }
+            });
+          });
+        }
+        this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value);
+      }
+      if (blurListener) {
+        element.addEventListener("blur", blurListener);
+      }
+      if (this.data.comb) {
+        const fieldWidth = this.data.rect[2] - this.data.rect[0];
+        const combWidth = fieldWidth / maxLen;
+        element.classList.add("comb");
+        element.style.setProperty("--comb-width", `calc(${combWidth}px * var(--total-scale-factor))`);
+        const alignment = this.data.textAlignment;
+        if (alignment === 1 || alignment === 2) {
+          const setCombOffset = () => {
+            const free = maxLen - element.value.length;
+            element.style.setProperty("--comb-offset", `${alignment === 1 ? free >> 1 : free}`);
+          };
+          setCombOffset();
+          for (const evt of ["input", "blur", "resetform", "updatefromsandbox"]) {
+            element.addEventListener(evt, setCombOffset);
+          }
+        }
+      }
+    } else {
+      element = document.createElement("div");
+      element.textContent = this.data.fieldValue;
+      element.style.verticalAlign = "middle";
+      element.style.display = "table-cell";
+      if (this.data.hasOwnCanvas) {
+        element.hidden = true;
+      }
+    }
+    this._setTextStyle(element);
+    this._setBackgroundColor(element);
+    this._setDefaultPropertiesFromJS(element);
+    this.container.append(element);
+    return this.container;
+  }
+}
+class SignatureWidgetAnnotationElement extends WidgetAnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: !!parameters.data.hasOwnCanvas
+    });
+  }
+}
+class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: parameters.renderForms
+    });
+  }
+  render() {
+    const storage = this.annotationStorage;
+    const data = this.data;
+    const id = data.id;
+    let value = storage.getValue(id, {
+      value: data.exportValue === data.fieldValue
+    }).value;
+    if (typeof value === "string") {
+      value = value !== "Off";
+      storage.setValue(id, {
+        value
+      });
+    }
+    this.container.classList.add("buttonWidgetAnnotation", "checkBox");
+    const element = document.createElement("input");
+    GetElementsByNameSet.add(element);
+    element.setAttribute("data-element-id", id);
+    element.disabled = data.readOnly;
+    this._setRequired(element, this.data.required);
+    element.type = "checkbox";
+    element.name = data.fieldName;
+    if (value) {
+      element.setAttribute("checked", true);
+    }
+    element.setAttribute("exportValue", data.exportValue);
+    element.tabIndex = 0;
+    element.addEventListener("change", event => {
+      const {
+        name,
+        checked
+      } = event.target;
+      for (const checkbox of this._getElementsByName(name, id)) {
+        const curChecked = checked && checkbox.exportValue === data.exportValue;
+        if (checkbox.domElement) {
+          checkbox.domElement.checked = curChecked;
+        }
+        storage.setValue(checkbox.id, {
+          value: curChecked
+        });
+      }
+      storage.setValue(id, {
+        value: checked
+      });
+    });
+    element.addEventListener("resetform", event => {
+      const defaultValue = data.defaultFieldValue || "Off";
+      event.target.checked = defaultValue === data.exportValue;
+    });
+    if (this.enableScripting && this.hasJSActions) {
+      element.addEventListener("updatefromsandbox", jsEvent => {
+        const actions = {
+          value(event) {
+            event.target.checked = event.detail.value !== "Off";
+            storage.setValue(id, {
+              value: event.target.checked
+            });
+          }
+        };
+        this._dispatchEventFromSandbox(actions, jsEvent);
+      });
+      this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked);
+    }
+    this._setDefaultPropertiesFromJS(element);
+    this.container.append(element);
+    return this.container;
+  }
+}
+class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: parameters.renderForms
+    });
+  }
+  render() {
+    this.container.classList.add("buttonWidgetAnnotation", "radioButton");
+    const storage = this.annotationStorage;
+    const data = this.data;
+    const id = data.id;
+    let value = storage.getValue(id, {
+      value: data.buttonValue !== null && data.fieldValue === data.buttonValue
+    }).value;
+    if (typeof value === "string") {
+      value = value !== data.buttonValue;
+      storage.setValue(id, {
+        value
+      });
+    }
+    if (value) {
+      for (const radio of this._getElementsByName(data.fieldName, id)) {
+        storage.setValue(radio.id, {
+          value: false
+        });
+      }
+    }
+    const element = document.createElement("input");
+    GetElementsByNameSet.add(element);
+    element.setAttribute("data-element-id", id);
+    element.disabled = data.readOnly;
+    this._setRequired(element, this.data.required);
+    element.type = "radio";
+    element.name = data.fieldName;
+    if (value) {
+      element.setAttribute("checked", true);
+    }
+    element.tabIndex = 0;
+    element.addEventListener("change", event => {
+      const {
+        name,
+        checked
+      } = event.target;
+      for (const radio of this._getElementsByName(name, id)) {
+        storage.setValue(radio.id, {
+          value: false
+        });
+      }
+      storage.setValue(id, {
+        value: checked
+      });
+    });
+    element.addEventListener("resetform", event => {
+      const defaultValue = data.defaultFieldValue;
+      event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue;
+    });
+    if (this.enableScripting && this.hasJSActions) {
+      const pdfButtonValue = data.buttonValue;
+      element.addEventListener("updatefromsandbox", jsEvent => {
+        const actions = {
+          value: event => {
+            const checked = pdfButtonValue === event.detail.value;
+            for (const radio of this._getElementsByName(event.target.name)) {
+              const curChecked = checked && radio.id === id;
+              if (radio.domElement) {
+                radio.domElement.checked = curChecked;
+              }
+              storage.setValue(radio.id, {
+                value: curChecked
+              });
+            }
+          }
+        };
+        this._dispatchEventFromSandbox(actions, jsEvent);
+      });
+      this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked);
+    }
+    this._setDefaultPropertiesFromJS(element);
+    this.container.append(element);
+    return this.container;
+  }
+}
+class PushButtonWidgetAnnotationElement extends LinkAnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      ignoreBorder: parameters.data.hasAppearance
+    });
+  }
+  render() {
+    const container = super.render();
+    container.classList.add("buttonWidgetAnnotation", "pushButton");
+    const linkElement = container.lastChild;
+    if (this.enableScripting && this.hasJSActions && linkElement) {
+      this._setDefaultPropertiesFromJS(linkElement);
+      linkElement.addEventListener("updatefromsandbox", jsEvent => {
+        this._dispatchEventFromSandbox({}, jsEvent);
+      });
+    }
+    return container;
+  }
+}
+class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: parameters.renderForms
+    });
+  }
+  render() {
+    this.container.classList.add("choiceWidgetAnnotation");
+    const storage = this.annotationStorage;
+    const id = this.data.id;
+    const storedData = storage.getValue(id, {
+      value: this.data.fieldValue
+    });
+    const selectElement = document.createElement("select");
+    GetElementsByNameSet.add(selectElement);
+    selectElement.setAttribute("data-element-id", id);
+    selectElement.disabled = this.data.readOnly;
+    this._setRequired(selectElement, this.data.required);
+    selectElement.name = this.data.fieldName;
+    selectElement.tabIndex = 0;
+    let addAnEmptyEntry = this.data.combo && this.data.options.length > 0;
+    if (!this.data.combo) {
+      selectElement.size = this.data.options.length;
+      if (this.data.multiSelect) {
+        selectElement.multiple = true;
+      }
+    }
+    selectElement.addEventListener("resetform", event => {
+      const defaultValue = this.data.defaultFieldValue;
+      for (const option of selectElement.options) {
+        option.selected = option.value === defaultValue;
+      }
+    });
+    const fixDisplayValue = (option, value) => {
+      const newValue = value.replaceAll(" ", "\u00A0");
+      option.textContent = newValue;
+      if (newValue !== value) {
+        option.setAttribute("display-value", value);
+      }
+    };
+    for (const option of this.data.options) {
+      const optionElement = document.createElement("option");
+      fixDisplayValue(optionElement, option.displayValue);
+      optionElement.value = option.exportValue;
+      if (storedData.value.includes(option.exportValue)) {
+        optionElement.setAttribute("selected", true);
+        addAnEmptyEntry = false;
+      }
+      selectElement.append(optionElement);
+    }
+    let removeEmptyEntry = null;
+    if (addAnEmptyEntry) {
+      const noneOptionElement = document.createElement("option");
+      noneOptionElement.value = " ";
+      noneOptionElement.setAttribute("hidden", true);
+      noneOptionElement.setAttribute("selected", true);
+      selectElement.prepend(noneOptionElement);
+      removeEmptyEntry = () => {
+        noneOptionElement.remove();
+        selectElement.removeEventListener("input", removeEmptyEntry);
+        removeEmptyEntry = null;
+      };
+      selectElement.addEventListener("input", removeEmptyEntry);
+    }
+    const getValue = isExport => {
+      const name = isExport ? "value" : "textContent";
+      const {
+        options,
+        multiple
+      } = selectElement;
+      if (!multiple) {
+        return options.selectedIndex === -1 ? null : options[options.selectedIndex][name];
+      }
+      return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]);
+    };
+    let selectedValues = getValue(false);
+    const getItems = event => {
+      const options = event.target.options;
+      return Array.prototype.map.call(options, option => ({
+        displayValue: option.getAttribute("display-value") || option.textContent,
+        exportValue: option.value
+      }));
+    };
+    if (this.enableScripting && this.hasJSActions) {
+      selectElement.addEventListener("updatefromsandbox", jsEvent => {
+        const actions = {
+          value(event) {
+            removeEmptyEntry?.();
+            const value = event.detail.value;
+            const values = new Set(Array.isArray(value) ? value : [value]);
+            for (const option of selectElement.options) {
+              option.selected = values.has(option.value);
+            }
+            storage.setValue(id, {
+              value: getValue(true)
+            });
+            selectedValues = getValue(false);
+          },
+          multipleSelection(event) {
+            selectElement.multiple = true;
+          },
+          remove(event) {
+            const options = selectElement.options;
+            const index = event.detail.remove;
+            options[index].selected = false;
+            selectElement.remove(index);
+            if (options.length > 0) {
+              const i = Array.prototype.findIndex.call(options, option => option.selected);
+              if (i === -1) {
+                options[0].selected = true;
+              }
+            }
+            storage.setValue(id, {
+              value: getValue(true),
+              items: getItems(event)
+            });
+            selectedValues = getValue(false);
+          },
+          clear(event) {
+            while (selectElement.length !== 0) {
+              selectElement.remove(0);
+            }
+            storage.setValue(id, {
+              value: null,
+              items: []
+            });
+            selectedValues = getValue(false);
+          },
+          insert(event) {
+            const {
+              index,
+              displayValue,
+              exportValue
+            } = event.detail.insert;
+            const selectChild = selectElement.children[index];
+            const optionElement = document.createElement("option");
+            fixDisplayValue(optionElement, displayValue);
+            optionElement.value = exportValue;
+            if (selectChild) {
+              selectChild.before(optionElement);
+            } else {
+              selectElement.append(optionElement);
+            }
+            storage.setValue(id, {
+              value: getValue(true),
+              items: getItems(event)
+            });
+            selectedValues = getValue(false);
+          },
+          items(event) {
+            const {
+              items
+            } = event.detail;
+            while (selectElement.length !== 0) {
+              selectElement.remove(0);
+            }
+            for (const item of items) {
+              const {
+                displayValue,
+                exportValue
+              } = item;
+              const optionElement = document.createElement("option");
+              fixDisplayValue(optionElement, displayValue);
+              optionElement.value = exportValue;
+              selectElement.append(optionElement);
+            }
+            if (selectElement.options.length > 0) {
+              selectElement.options[0].selected = true;
+            }
+            storage.setValue(id, {
+              value: getValue(true),
+              items: getItems(event)
+            });
+            selectedValues = getValue(false);
+          },
+          indices(event) {
+            const indices = new Set(event.detail.indices);
+            for (const option of event.target.options) {
+              option.selected = indices.has(option.index);
+            }
+            storage.setValue(id, {
+              value: getValue(true)
+            });
+            selectedValues = getValue(false);
+          },
+          editable(event) {
+            event.target.disabled = !event.detail.editable;
+          }
+        };
+        this._dispatchEventFromSandbox(actions, jsEvent);
+      });
+      selectElement.addEventListener("input", event => {
+        const exportValue = getValue(true);
+        const change = getValue(false);
+        storage.setValue(id, {
+          value: exportValue
+        });
+        event.preventDefault();
+        this.linkService.eventBus?.dispatch("dispatcheventinsandbox", {
+          source: this,
+          detail: {
+            id,
+            name: "Keystroke",
+            value: selectedValues,
+            change,
+            changeEx: exportValue,
+            willCommit: false,
+            commitKey: 1,
+            keyDown: false
+          }
+        });
+      });
+      this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value);
+    } else {
+      selectElement.addEventListener("input", function (event) {
+        storage.setValue(id, {
+          value: getValue(true)
+        });
+      });
+    }
+    if (this.data.combo) {
+      this._setTextStyle(selectElement);
+    } else {}
+    this._setBackgroundColor(selectElement);
+    this._setDefaultPropertiesFromJS(selectElement);
+    this.container.append(selectElement);
+    return this.container;
+  }
+}
+class PopupAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    const {
+      data,
+      elements,
+      parent
+    } = parameters;
+    const hasCommentManager = !!parent._commentManager;
+    super(parameters, {
+      isRenderable: !hasCommentManager && AnnotationElement._hasPopupData(data)
+    });
+    this.elements = elements;
+    if (hasCommentManager && AnnotationElement._hasPopupData(data)) {
+      const popup = this.popup = this.#createPopup();
+      for (const element of elements) {
+        element.popup = popup;
+      }
+    } else {
+      this.popup = null;
+    }
+  }
+  #createPopup() {
+    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
+    } = this;
+    container.classList.add("popupAnnotation");
+    container.role = "comment";
+    const popup = this.popup = this.#createPopup();
+    const elementIds = [];
+    for (const element of this.elements) {
+      element.popup = popup;
+      element.container.ariaHasPopup = "dialog";
+      elementIds.push(element.data.id);
+      element.addHighlightArea();
+    }
+    this.container.setAttribute("aria-controls", elementIds.map(id => `${AnnotationPrefix}${id}`).join(","));
+    return this.container;
+  }
+}
+class PopupElement {
+  #commentManager = null;
+  #boundKeyDown = this.#keyDown.bind(this);
+  #boundHide = this.#hide.bind(this);
+  #boundShow = this.#show.bind(this);
+  #boundToggle = this.#toggle.bind(this);
+  #color = null;
+  #container = null;
+  #contentsObj = null;
+  #dateObj = null;
+  #elements = null;
+  #parent = null;
+  #parentRect = null;
+  #pinned = false;
+  #popup = null;
+  #popupAbortController = null;
+  #position = null;
+  #commentButton = null;
+  #commentButtonPosition = null;
+  #popupPosition = null;
+  #rect = null;
+  #richText = null;
+  #titleObj = null;
+  #updates = null;
+  #wasVisible = false;
+  #firstElement = null;
+  #commentText = null;
+  constructor({
+    container,
+    color,
+    elements,
+    titleObj,
+    modificationDate,
+    contentsObj,
+    richText,
+    parent,
+    rect,
+    parentRect,
+    open,
+    commentManager = null
+  }) {
+    this.#container = container;
+    this.#titleObj = titleObj;
+    this.#contentsObj = contentsObj;
+    this.#richText = richText;
+    this.#parent = parent;
+    this.#color = color;
+    this.#rect = rect;
+    this.#parentRect = parentRect;
+    this.#elements = elements;
+    this.#commentManager = commentManager;
+    this.#firstElement = elements[0];
+    this.#dateObj = PDFDateString.toDateObject(modificationDate);
+    this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup());
+    if (!commentManager) {
+      this.#addEventListeners();
+      this.#container.hidden = true;
+      if (open) {
+        this.#toggle();
+      }
+    }
+  }
+  #addEventListeners() {
+    if (this.#popupAbortController) {
+      return;
+    }
+    this.#popupAbortController = new AbortController();
+    const {
+      signal
+    } = this.#popupAbortController;
+    for (const element of this.trigger) {
+      element.addEventListener("click", this.#boundToggle, {
+        signal
+      });
+      element.addEventListener("pointerenter", this.#boundShow, {
+        signal
+      });
+      element.addEventListener("pointerleave", this.#boundHide, {
+        signal
+      });
+      element.classList.add("popupTriggerArea");
+    }
+    for (const element of this.#elements) {
+      element.container?.addEventListener("keydown", this.#boundKeyDown, {
+        signal
+      });
+    }
+  }
+  #setCommentButtonPosition() {
+    const element = this.#elements.find(e => e.hasCommentButton);
+    if (!element) {
+      return;
+    }
+    this.#commentButtonPosition = element._normalizePoint(element.commentButtonPosition);
+  }
+  renderCommentButton() {
+    if (this.#commentButton) {
+      if (!this.#commentButton.parentNode) {
+        this.#firstElement.container.after(this.#commentButton);
+      }
+      return;
+    }
+    if (!this.#commentButtonPosition) {
+      this.#setCommentButtonPosition();
+    }
+    if (!this.#commentButtonPosition) {
+      return;
+    }
+    const {
+      signal
+    } = this.#popupAbortController = new AbortController();
+    const hasOwnButton = this.#firstElement.hasOwnCommentButton;
+    const togglePopup = () => {
+      this.#commentManager.toggleCommentPopup(this, true, undefined, !hasOwnButton);
+    };
+    const showPopup = () => {
+      this.#commentManager.toggleCommentPopup(this, false, true, !hasOwnButton);
+    };
+    const hidePopup = () => {
+      this.#commentManager.toggleCommentPopup(this, false, false);
+    };
+    if (!hasOwnButton) {
+      const button = this.#commentButton = document.createElement("button");
+      button.className = "annotationCommentButton";
+      const parentContainer = this.#firstElement.container;
+      button.style.zIndex = parseInt(parentContainer.style.zIndex, 10) + 1;
+      button.tabIndex = 0;
+      button.ariaHasPopup = "dialog";
+      button.ariaControls = "commentPopup";
+      button.setAttribute("data-l10n-id", "pdfjs-show-comment-button");
+      this.#updateColor();
+      this.#updateCommentButtonPosition();
+      button.addEventListener("keydown", this.#boundKeyDown, {
+        signal
+      });
+      button.addEventListener("click", togglePopup, {
+        signal
+      });
+      button.addEventListener("pointerenter", showPopup, {
+        signal
+      });
+      button.addEventListener("pointerleave", hidePopup, {
+        signal
+      });
+      parentContainer.after(button);
+    } else {
+      this.#commentButton = this.#firstElement.container;
+      for (const element of this.trigger) {
+        element.ariaHasPopup = "dialog";
+        element.ariaControls = "commentPopup";
+        element.addEventListener("keydown", this.#boundKeyDown, {
+          signal
+        });
+        element.addEventListener("click", togglePopup, {
+          signal
+        });
+        element.addEventListener("pointerenter", showPopup, {
+          signal
+        });
+        element.addEventListener("pointerleave", hidePopup, {
+          signal
+        });
+        element.classList.add("popupTriggerArea");
+      }
+    }
+  }
+  #updateCommentButtonPosition() {
+    if (this.#firstElement.extraPopupElement && !this.#firstElement.editor) {
+      return;
+    }
+    if (!this.#commentButton) {
+      this.renderCommentButton();
+    }
+    const [x, y] = this.#commentButtonPosition;
+    const {
+      style
+    } = this.#commentButton;
+    style.left = `calc(${x}%)`;
+    style.top = `calc(${y}% - var(--comment-button-dim))`;
+  }
+  #updateColor() {
+    if (this.#firstElement.extraPopupElement) {
+      return;
+    }
+    if (!this.#commentButton) {
+      this.renderCommentButton();
+    }
+    this.#commentButton.style.backgroundColor = this.commentButtonColor || "";
+  }
+  get commentButtonColor() {
+    const {
+      color,
+      opacity
+    } = this.#firstElement.commentData;
+    if (!color) {
+      return null;
+    }
+    return this.#parent._commentManager.makeCommentColor(color, opacity);
+  }
+  focusCommentButton() {
+    setTimeout(() => {
+      this.#commentButton?.focus();
+    }, 0);
+  }
+  getData() {
+    const {
+      richText,
+      color,
+      opacity,
+      creationDate,
+      modificationDate
+    } = this.#firstElement.commentData;
+    return {
+      contentsObj: {
+        str: this.comment
+      },
+      richText,
+      color,
+      opacity,
+      creationDate,
+      modificationDate
+    };
+  }
+  get elementBeforePopup() {
+    return this.#commentButton;
+  }
+  get comment() {
+    this.#commentText ||= this.#firstElement.commentText;
+    return this.#commentText;
+  }
+  set comment(text) {
+    if (text === this.comment) {
+      return;
+    }
+    this.#firstElement.commentText = this.#commentText = text;
+  }
+  focus() {
+    this.#firstElement.container?.focus();
+  }
+  get parentBoundingClientRect() {
+    return this.#firstElement.layer.getBoundingClientRect();
+  }
+  setCommentButtonStates({
+    selected,
+    hasPopup
+  }) {
+    if (!this.#commentButton) {
+      return;
+    }
+    this.#commentButton.classList.toggle("selected", selected);
+    this.#commentButton.ariaExpanded = hasPopup;
+  }
+  setSelectedCommentButton(selected) {
+    this.#commentButton.classList.toggle("selected", selected);
+  }
+  get commentPopupPosition() {
+    if (this.#popupPosition) {
+      return this.#popupPosition;
+    }
+    const {
+      x,
+      y,
+      height
+    } = this.#commentButton.getBoundingClientRect();
+    const {
+      x: parentX,
+      y: parentY,
+      width: parentWidth,
+      height: parentHeight
+    } = this.#firstElement.layer.getBoundingClientRect();
+    return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight];
+  }
+  set commentPopupPosition(pos) {
+    this.#popupPosition = pos;
+  }
+  hasDefaultPopupPosition() {
+    return this.#popupPosition === null;
+  }
+  get commentButtonPosition() {
+    return this.#commentButtonPosition;
+  }
+  get commentButtonWidth() {
+    return this.#commentButton.getBoundingClientRect().width / this.parentBoundingClientRect.width;
+  }
+  editComment(options) {
+    const [posX, posY] = this.#popupPosition || this.commentButtonPosition.map(x => x / 100);
+    const parentDimensions = this.parentBoundingClientRect;
+    const {
+      x: parentX,
+      y: parentY,
+      width: parentWidth,
+      height: parentHeight
+    } = parentDimensions;
+    this.#commentManager.showDialog(null, this, parentX + posX * parentWidth, parentY + posY * parentHeight, {
+      ...options,
+      parentDimensions
+    });
+  }
+  render() {
+    if (this.#popup) {
+      return;
+    }
+    const popup = this.#popup = document.createElement("div");
+    popup.className = "popup";
+    if (this.#color) {
+      const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color);
+      popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`;
+    }
+    const header = document.createElement("span");
+    header.className = "header";
+    if (this.#titleObj?.str) {
+      const title = document.createElement("span");
+      title.className = "title";
+      header.append(title);
+      ({
+        dir: title.dir,
+        str: title.textContent
+      } = this.#titleObj);
+    }
+    popup.append(header);
+    if (this.#dateObj) {
+      const modificationDate = document.createElement("time");
+      modificationDate.className = "popupDate";
+      modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string");
+      modificationDate.setAttribute("data-l10n-args", JSON.stringify({
+        dateObj: this.#dateObj.valueOf()
+      }));
+      modificationDate.dateTime = this.#dateObj.toISOString();
+      header.append(modificationDate);
+    }
+    renderRichText({
+      html: this.#html || this.#contentsObj.str,
+      dir: this.#contentsObj?.dir,
+      className: "popupContent"
+    }, popup);
+    this.#container.append(popup);
+  }
+  get #html() {
+    const richText = this.#richText;
+    const contentsObj = this.#contentsObj;
+    if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) {
+      return this.#richText.html || null;
+    }
+    return null;
+  }
+  get #fontSize() {
+    return this.#html?.attributes?.style?.fontSize || 0;
+  }
+  get #fontColor() {
+    return this.#html?.attributes?.style?.color || null;
+  }
+  #makePopupContent(text) {
+    const popupLines = [];
+    const popupContent = {
+      str: text,
+      html: {
+        name: "div",
+        attributes: {
+          dir: "auto"
+        },
+        children: [{
+          name: "p",
+          children: popupLines
+        }]
+      }
+    };
+    const lineAttributes = {
+      style: {
+        color: this.#fontColor,
+        fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--total-scale-factor))` : ""
+      }
+    };
+    for (const line of text.split("\n")) {
+      popupLines.push({
+        name: "span",
+        value: line,
+        attributes: lineAttributes
+      });
+    }
+    return popupContent;
+  }
+  #keyDown(event) {
+    if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {
+      return;
+    }
+    if (event.key === "Enter" || event.key === "Escape" && this.#pinned) {
+      this.#toggle();
+    }
+  }
+  updateEdited({
+    rect,
+    popup,
+    deleted
+  }) {
+    if (this.#commentManager) {
+      if (deleted) {
+        this.remove();
+        this.#commentText = null;
+      } else if (popup) {
+        if (popup.deleted) {
+          this.remove();
+        } else {
+          this.#updateColor();
+          this.#commentText = popup.text;
+        }
+      }
+      if (rect) {
+        this.#commentButtonPosition = null;
+        this.#setCommentButtonPosition();
+        this.#updateCommentButtonPosition();
+      }
+      return;
+    }
+    if (deleted || popup?.deleted) {
+      this.remove();
+      return;
+    }
+    this.#addEventListeners();
+    this.#updates ||= {
+      contentsObj: this.#contentsObj,
+      richText: this.#richText
+    };
+    if (rect) {
+      this.#position = null;
+    }
+    if (popup && popup.text) {
+      this.#richText = this.#makePopupContent(popup.text);
+      this.#dateObj = PDFDateString.toDateObject(popup.date);
+      this.#contentsObj = null;
+    }
+    this.#popup?.remove();
+    this.#popup = null;
+  }
+  resetEdited() {
+    if (!this.#updates) {
+      return;
+    }
+    ({
+      contentsObj: this.#contentsObj,
+      richText: this.#richText
+    } = this.#updates);
+    this.#updates = null;
+    this.#popup?.remove();
+    this.#popup = null;
+    this.#position = null;
+  }
+  remove() {
+    this.#popupAbortController?.abort();
+    this.#popupAbortController = null;
+    this.#popup?.remove();
+    this.#popup = null;
+    this.#wasVisible = false;
+    this.#pinned = false;
+    this.#commentButton?.remove();
+    this.#commentButton = null;
+    if (this.trigger) {
+      for (const element of this.trigger) {
+        element.classList.remove("popupTriggerArea");
+      }
+    }
+  }
+  #setPosition() {
+    if (this.#position !== null) {
+      return;
+    }
+    const {
+      page: {
+        view
+      },
+      viewport: {
+        rawDims: {
+          pageWidth,
+          pageHeight,
+          pageX,
+          pageY
+        }
+      }
+    } = this.#parent;
+    let useParentRect = !!this.#parentRect;
+    let rect = useParentRect ? this.#parentRect : this.#rect;
+    for (const element of this.#elements) {
+      if (!rect || Util.intersect(element.data.rect, rect) !== null) {
+        rect = element.data.rect;
+        useParentRect = true;
+        break;
+      }
+    }
+    const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]);
+    const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5;
+    const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0;
+    const popupLeft = normalizedRect[0] + parentWidth;
+    const popupTop = normalizedRect[1];
+    this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight];
+    const {
+      style
+    } = this.#container;
+    style.left = `${this.#position[0]}%`;
+    style.top = `${this.#position[1]}%`;
+  }
+  #toggle() {
+    if (this.#commentManager) {
+      this.#commentManager.toggleCommentPopup(this, false);
+      return;
+    }
+    this.#pinned = !this.#pinned;
+    if (this.#pinned) {
+      this.#show();
+      this.#container.addEventListener("click", this.#boundToggle);
+      this.#container.addEventListener("keydown", this.#boundKeyDown);
+    } else {
+      this.#hide();
+      this.#container.removeEventListener("click", this.#boundToggle);
+      this.#container.removeEventListener("keydown", this.#boundKeyDown);
+    }
+  }
+  #show() {
+    if (!this.#popup) {
+      this.render();
+    }
+    if (!this.isVisible) {
+      this.#setPosition();
+      this.#container.hidden = false;
+      this.#container.style.zIndex = parseInt(this.#container.style.zIndex, 10) + 1000;
+    } else if (this.#pinned) {
+      this.#container.classList.add("focused");
+    }
+  }
+  #hide() {
+    this.#container.classList.remove("focused");
+    if (this.#pinned || !this.isVisible) {
+      return;
+    }
+    this.#container.hidden = true;
+    this.#container.style.zIndex = parseInt(this.#container.style.zIndex, 10) - 1000;
+  }
+  forceHide() {
+    this.#wasVisible = this.isVisible;
+    if (!this.#wasVisible) {
+      return;
+    }
+    this.#container.hidden = true;
+  }
+  maybeShow() {
+    if (this.#commentManager) {
+      return;
+    }
+    this.#addEventListeners();
+    if (!this.#wasVisible) {
+      return;
+    }
+    if (!this.#popup) {
+      this.#show();
+    }
+    this.#wasVisible = false;
+    this.#container.hidden = false;
+  }
+  get isVisible() {
+    if (this.#commentManager) {
+      return false;
+    }
+    return this.#container.hidden === false;
+  }
+}
+class FreeTextAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+    this.textContent = parameters.data.textContent;
+    this.textPosition = parameters.data.textPosition;
+    this.annotationEditorType = AnnotationEditorType.FREETEXT;
+  }
+  render() {
+    this.container.classList.add("freeTextAnnotation");
+    if (this.textContent) {
+      const content = this.contentElement = document.createElement("div");
+      content.classList.add("annotationTextContent");
+      content.setAttribute("role", "comment");
+      for (const line of this.textContent) {
+        const lineSpan = document.createElement("span");
+        lineSpan.textContent = line;
+        content.append(lineSpan);
+      }
+      this.container.append(content);
+    }
+    if (!this.data.popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    this._editOnDoubleClick();
+    return this.container;
+  }
+}
+class LineAnnotationElement extends AnnotationElement {
+  #line = null;
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+  }
+  render() {
+    this.container.classList.add("lineAnnotation");
+    const {
+      data,
+      width,
+      height
+    } = this;
+    const svg = this.svgFactory.create(width, height, true);
+    const line = this.#line = this.svgFactory.createElement("svg:line");
+    line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]);
+    line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]);
+    line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]);
+    line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]);
+    line.setAttribute("stroke-width", data.borderStyle.width || 1);
+    line.setAttribute("stroke", "transparent");
+    line.setAttribute("fill", "transparent");
+    svg.append(line);
+    this.container.append(svg);
+    if (!data.popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    return this.container;
+  }
+  getElementsToTriggerPopup() {
+    return this.#line;
+  }
+  addHighlightArea() {
+    this.container.classList.add("highlightArea");
+  }
+}
+class SquareAnnotationElement extends AnnotationElement {
+  #square = null;
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+  }
+  render() {
+    this.container.classList.add("squareAnnotation");
+    const {
+      data,
+      width,
+      height
+    } = this;
+    const svg = this.svgFactory.create(width, height, true);
+    const borderWidth = data.borderStyle.width;
+    const square = this.#square = this.svgFactory.createElement("svg:rect");
+    square.setAttribute("x", borderWidth / 2);
+    square.setAttribute("y", borderWidth / 2);
+    square.setAttribute("width", width - borderWidth);
+    square.setAttribute("height", height - borderWidth);
+    square.setAttribute("stroke-width", borderWidth || 1);
+    square.setAttribute("stroke", "transparent");
+    square.setAttribute("fill", "transparent");
+    svg.append(square);
+    this.container.append(svg);
+    if (!data.popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    return this.container;
+  }
+  getElementsToTriggerPopup() {
+    return this.#square;
+  }
+  addHighlightArea() {
+    this.container.classList.add("highlightArea");
+  }
+}
+class CircleAnnotationElement extends AnnotationElement {
+  #circle = null;
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+  }
+  render() {
+    this.container.classList.add("circleAnnotation");
+    const {
+      data,
+      width,
+      height
+    } = this;
+    const svg = this.svgFactory.create(width, height, true);
+    const borderWidth = data.borderStyle.width;
+    const circle = this.#circle = this.svgFactory.createElement("svg:ellipse");
+    circle.setAttribute("cx", width / 2);
+    circle.setAttribute("cy", height / 2);
+    circle.setAttribute("rx", width / 2 - borderWidth / 2);
+    circle.setAttribute("ry", height / 2 - borderWidth / 2);
+    circle.setAttribute("stroke-width", borderWidth || 1);
+    circle.setAttribute("stroke", "transparent");
+    circle.setAttribute("fill", "transparent");
+    svg.append(circle);
+    this.container.append(svg);
+    if (!data.popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    return this.container;
+  }
+  getElementsToTriggerPopup() {
+    return this.#circle;
+  }
+  addHighlightArea() {
+    this.container.classList.add("highlightArea");
+  }
+}
+class PolylineAnnotationElement extends AnnotationElement {
+  #polyline = null;
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+    this.containerClassName = "polylineAnnotation";
+    this.svgElementName = "svg:polyline";
+  }
+  render() {
+    this.container.classList.add(this.containerClassName);
+    const {
+      data: {
+        rect,
+        vertices,
+        borderStyle,
+        popupRef
+      },
+      width,
+      height
+    } = this;
+    if (!vertices) {
+      return this.container;
+    }
+    const svg = this.svgFactory.create(width, height, true);
+    let points = [];
+    for (let i = 0, ii = vertices.length; i < ii; i += 2) {
+      const x = vertices[i] - rect[0];
+      const y = rect[3] - vertices[i + 1];
+      points.push(`${x},${y}`);
+    }
+    points = points.join(" ");
+    const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName);
+    polyline.setAttribute("points", points);
+    polyline.setAttribute("stroke-width", borderStyle.width || 1);
+    polyline.setAttribute("stroke", "transparent");
+    polyline.setAttribute("fill", "transparent");
+    svg.append(polyline);
+    this.container.append(svg);
+    if (!popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    return this.container;
+  }
+  getElementsToTriggerPopup() {
+    return this.#polyline;
+  }
+  addHighlightArea() {
+    this.container.classList.add("highlightArea");
+  }
+}
+class PolygonAnnotationElement extends PolylineAnnotationElement {
+  constructor(parameters) {
+    super(parameters);
+    this.containerClassName = "polygonAnnotation";
+    this.svgElementName = "svg:polygon";
+  }
+}
+class CaretAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+  }
+  render() {
+    this.container.classList.add("caretAnnotation");
+    if (!this.data.popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    return this.container;
+  }
+}
+class InkAnnotationElement extends AnnotationElement {
+  #polylinesGroupElement = null;
+  #polylines = [];
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+    this.containerClassName = "inkAnnotation";
+    this.svgElementName = "svg:polyline";
+    this.annotationEditorType = this.data.it === "InkHighlight" ? AnnotationEditorType.HIGHLIGHT : AnnotationEditorType.INK;
+  }
+  #getTransform(rotation, rect) {
+    switch (rotation) {
+      case 90:
+        return {
+          transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`,
+          width: rect[3] - rect[1],
+          height: rect[2] - rect[0]
+        };
+      case 180:
+        return {
+          transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`,
+          width: rect[2] - rect[0],
+          height: rect[3] - rect[1]
+        };
+      case 270:
+        return {
+          transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`,
+          width: rect[3] - rect[1],
+          height: rect[2] - rect[0]
+        };
+      default:
+        return {
+          transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`,
+          width: rect[2] - rect[0],
+          height: rect[3] - rect[1]
+        };
+    }
+  }
+  render() {
+    this.container.classList.add(this.containerClassName);
+    const {
+      data: {
+        rect,
+        rotation,
+        inkLists,
+        borderStyle,
+        popupRef
+      }
+    } = this;
+    const {
+      transform,
+      width,
+      height
+    } = this.#getTransform(rotation, rect);
+    const svg = this.svgFactory.create(width, height, true);
+    const g = this.#polylinesGroupElement = this.svgFactory.createElement("svg:g");
+    svg.append(g);
+    g.setAttribute("stroke-width", borderStyle.width || 1);
+    g.setAttribute("stroke-linecap", "round");
+    g.setAttribute("stroke-linejoin", "round");
+    g.setAttribute("stroke-miterlimit", 10);
+    g.setAttribute("stroke", "transparent");
+    g.setAttribute("fill", "transparent");
+    g.setAttribute("transform", transform);
+    for (let i = 0, ii = inkLists.length; i < ii; i++) {
+      const polyline = this.svgFactory.createElement(this.svgElementName);
+      this.#polylines.push(polyline);
+      polyline.setAttribute("points", inkLists[i].join(","));
+      g.append(polyline);
+    }
+    if (!popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    this.container.append(svg);
+    this._editOnDoubleClick();
+    return this.container;
+  }
+  updateEdited(params) {
+    super.updateEdited(params);
+    const {
+      thickness,
+      points,
+      rect
+    } = params;
+    const g = this.#polylinesGroupElement;
+    if (thickness >= 0) {
+      g.setAttribute("stroke-width", thickness || 1);
+    }
+    if (points) {
+      for (let i = 0, ii = this.#polylines.length; i < ii; i++) {
+        this.#polylines[i].setAttribute("points", points[i].join(","));
+      }
+    }
+    if (rect) {
+      const {
+        transform,
+        width,
+        height
+      } = this.#getTransform(this.data.rotation, rect);
+      const root = g.parentElement;
+      root.setAttribute("viewBox", `0 0 ${width} ${height}`);
+      g.setAttribute("transform", transform);
+    }
+  }
+  getElementsToTriggerPopup() {
+    return this.#polylines;
+  }
+  addHighlightArea() {
+    this.container.classList.add("highlightArea");
+  }
+}
+class HighlightAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true,
+      createQuadrilaterals: true
+    });
+    this.annotationEditorType = AnnotationEditorType.HIGHLIGHT;
+  }
+  render() {
+    const {
+      data: {
+        overlaidText,
+        popupRef
+      }
+    } = this;
+    if (!popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    this.container.classList.add("highlightAnnotation");
+    this._editOnDoubleClick();
+    if (overlaidText) {
+      const mark = document.createElement("mark");
+      mark.classList.add("overlaidText");
+      mark.textContent = overlaidText;
+      this.container.append(mark);
+    }
+    return this.container;
+  }
+}
+class UnderlineAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true,
+      createQuadrilaterals: true
+    });
+  }
+  render() {
+    const {
+      data: {
+        overlaidText,
+        popupRef
+      }
+    } = this;
+    if (!popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    this.container.classList.add("underlineAnnotation");
+    if (overlaidText) {
+      const underline = document.createElement("u");
+      underline.classList.add("overlaidText");
+      underline.textContent = overlaidText;
+      this.container.append(underline);
+    }
+    return this.container;
+  }
+}
+class SquigglyAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true,
+      createQuadrilaterals: true
+    });
+  }
+  render() {
+    const {
+      data: {
+        overlaidText,
+        popupRef
+      }
+    } = this;
+    if (!popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    this.container.classList.add("squigglyAnnotation");
+    if (overlaidText) {
+      const underline = document.createElement("u");
+      underline.classList.add("overlaidText");
+      underline.textContent = overlaidText;
+      this.container.append(underline);
+    }
+    return this.container;
+  }
+}
+class StrikeOutAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true,
+      createQuadrilaterals: true
+    });
+  }
+  render() {
+    const {
+      data: {
+        overlaidText,
+        popupRef
+      }
+    } = this;
+    if (!popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    this.container.classList.add("strikeoutAnnotation");
+    if (overlaidText) {
+      const strikeout = document.createElement("s");
+      strikeout.classList.add("overlaidText");
+      strikeout.textContent = overlaidText;
+      this.container.append(strikeout);
+    }
+    return this.container;
+  }
+}
+class StampAnnotationElement extends AnnotationElement {
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true,
+      ignoreBorder: true
+    });
+    this.annotationEditorType = AnnotationEditorType.STAMP;
+  }
+  render() {
+    this.container.classList.add("stampAnnotation");
+    this.container.setAttribute("role", "img");
+    if (!this.data.popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    }
+    this._editOnDoubleClick();
+    return this.container;
+  }
+}
+class FileAttachmentAnnotationElement extends AnnotationElement {
+  #trigger = null;
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: true
+    });
+    const {
+      fileId,
+      file
+    } = this.data;
+    this.filename = file.filename;
+    this.content = file.content;
+    this.fileId = fileId;
+    this.linkService.eventBus?.dispatch("fileattachmentannotation", {
+      source: this,
+      attachmentId: this.fileId,
+      ...file
+    });
+  }
+  render() {
+    this.container.classList.add("fileAttachmentAnnotation");
+    const {
+      container,
+      data
+    } = this;
+    let trigger;
+    if (data.hasAppearance || data.fillAlpha === 0) {
+      trigger = document.createElement("div");
+    } else {
+      trigger = document.createElement("img");
+      trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`;
+      if (data.fillAlpha && data.fillAlpha < 1) {
+        trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`;
+      }
+    }
+    trigger.addEventListener("dblclick", this.#download.bind(this));
+    this.#trigger = trigger;
+    const {
+      isMac
+    } = FeatureTest.platform;
+    container.addEventListener("keydown", evt => {
+      if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) {
+        this.#download();
+      }
+    });
+    if (!data.popupRef && this.hasPopupData) {
+      this.hasOwnCommentButton = true;
+      this._createPopup();
+    } else {
+      trigger.classList.add("popupTriggerArea");
+    }
+    container.append(trigger);
+    return container;
+  }
+  getElementsToTriggerPopup() {
+    return this.#trigger;
+  }
+  addHighlightArea() {
+    this.container.classList.add("highlightArea");
+  }
+  async #download() {
+    const {
+      fileId,
+      filename,
+      content: fallbackContent
+    } = this;
+    const content = (await this.linkService.getAttachmentContent(fileId)) || fallbackContent;
+    if (content) {
+      this.downloadManager?.openOrDownloadData(content, filename);
+    }
+  }
+}
+class MediaAnnotationElement extends AnnotationElement {
+  #abortController = new AbortController();
+  #contentUrl = null;
+  #media = null;
+  constructor(parameters) {
+    super(parameters, {
+      isRenderable: !!parameters.data.richMedia
+    });
+  }
+  render() {
+    this.container.classList.add("mediaAnnotation");
+    const {
+      filename
+    } = this.data.richMedia;
+    const button = document.createElement("button");
+    button.className = "mediaPlayButton";
+    button.type = "button";
+    button.title = button.ariaLabel = filename;
+    button.addEventListener("click", () => this.#load(button), {
+      signal: this.#abortController.signal
+    });
+    this.container.append(button);
+    return this.container;
+  }
+  async #load(button) {
+    const {
+      fileId,
+      filename,
+      contentType
+    } = this.data.richMedia;
+    button.disabled = true;
+    let content;
+    try {
+      content = await this.linkService.getAttachmentContent(fileId);
+    } catch {
+      return;
+    } finally {
+      button.disabled = false;
+    }
+    if (!content || !button.isConnected) {
+      return;
+    }
+    const {
+      signal
+    } = this.#abortController;
+    const url = URL.createObjectURL(new Blob([content], {
+      type: contentType
+    }));
+    this.#contentUrl = url;
+    const isAudio = contentType.startsWith("audio/");
+    const media = document.createElement(isAudio ? "audio" : "video");
+    this.#media = media;
+    media.className = "mediaContent";
+    this._setBackgroundColor(media);
+    media.src = url;
+    media.title = filename;
+    media.controls = true;
+    media.autoplay = true;
+    media.tabIndex = 0;
+    if (isAudio) {
+      let hovered = false;
+      let focused = false;
+      const updateControls = () => {
+        media.controls = hovered || focused;
+      };
+      this.container.addEventListener("pointerenter", () => {
+        hovered = true;
+        updateControls();
+      }, {
+        signal
+      });
+      this.container.addEventListener("pointerleave", () => {
+        hovered = false;
+        updateControls();
+      }, {
+        signal
+      });
+      this.container.addEventListener("focusin", () => {
+        focused = true;
+        updateControls();
+      }, {
+        signal
+      });
+      this.container.addEventListener("focusout", () => {
+        focused = false;
+        updateControls();
+      }, {
+        signal
+      });
+    }
+    media.addEventListener("emptied", () => this.#revokeContentUrl(url), {
+      once: true,
+      signal
+    });
+    button.replaceWith(media);
+    media.play().catch(() => {});
+  }
+  #revokeContentUrl(url = this.#contentUrl) {
+    if (url && url === this.#contentUrl) {
+      URL.revokeObjectURL(url);
+      this.#contentUrl = null;
+    }
+  }
+  destroy() {
+    this.#abortController.abort();
+    if (this.#media) {
+      this.#media.pause();
+      this.#media.removeAttribute("src");
+      this.#media.load();
+      this.#media = null;
+    }
+    this.#revokeContentUrl();
+  }
+}
+class AnnotationLayer {
+  #accessibilityManager = null;
+  #annotationCanvasMap = null;
+  #annotationStorage = null;
+  #editableAnnotations = new Map();
+  #structTreeLayer = null;
+  #linkService = null;
+  #elements = [];
+  #hasAriaAttributesFromStructTree = false;
+  zIndex = 0;
+  constructor({
+    div,
+    accessibilityManager,
+    annotationCanvasMap,
+    annotationEditorUIManager,
+    page,
+    viewport,
+    structTreeLayer,
+    commentManager,
+    linkService,
+    annotationStorage
+  }) {
+    this.div = div;
+    this.#accessibilityManager = accessibilityManager;
+    this.#annotationCanvasMap = annotationCanvasMap;
+    this.#structTreeLayer = structTreeLayer || null;
+    this.#linkService = linkService || null;
+    this.#annotationStorage = annotationStorage || new AnnotationStorage();
+    this.page = page;
+    this.viewport = viewport;
+    this._annotationEditorUIManager = annotationEditorUIManager;
+    this._commentManager = commentManager || null;
+  }
+  hasEditableAnnotations() {
+    return this.#editableAnnotations.size > 0;
+  }
+  async render(params) {
+    const {
+      annotations,
+      optionalContentConfig
+    } = params;
+    const layer = this.div;
+    setLayerDimensions(layer, this.viewport);
+    const popupToElements = new Map();
+    const popupAnnotations = [];
+    const elementParams = {
+      data: null,
+      layer,
+      linkService: this.#linkService,
+      downloadManager: params.downloadManager,
+      imageResourcesPath: params.imageResourcesPath || "",
+      renderForms: params.renderForms !== false,
+      svgFactory: new DOMSVGFactory(),
+      annotationStorage: this.#annotationStorage,
+      enableComment: params.enableComment === true,
+      enableScripting: params.enableScripting === true,
+      hasJSActions: params.hasJSActions,
+      fieldObjects: params.fieldObjects,
+      parent: this,
+      elements: null
+    };
+    for (const data of annotations) {
+      if (data.noHTML) {
+        continue;
+      }
+      const isPopupAnnotation = data.annotationType === AnnotationType.POPUP;
+      if (!isPopupAnnotation) {
+        if (data.rect[2] === data.rect[0] || data.rect[3] === data.rect[1]) {
+          continue;
+        }
+      } else {
+        const elements = popupToElements.get(data.id);
+        if (!elements) {
+          continue;
+        }
+        if (!this._commentManager) {
+          popupAnnotations.push(data);
+          continue;
+        }
+        elementParams.elements = elements;
+      }
+      elementParams.data = data;
+      const element = AnnotationElementFactory.create(elementParams);
+      if (!element.isRenderable) {
+        continue;
+      }
+      if (!isPopupAnnotation) {
+        this.#elements.push(element);
+        if (data.popupRef) {
+          popupToElements.getOrInsertComputed(data.popupRef, makeArr).push(element);
+        }
+      }
+      const rendered = element.render();
+      if (data.hidden) {
+        rendered.style.visibility = "hidden";
+      }
+      element.updateOC(optionalContentConfig);
+      if (element._isEditable) {
+        this.#editableAnnotations.set(element.data.id, element);
+        this._annotationEditorUIManager?.renderAnnotationElement(element);
+      }
+    }
+    await this.#addElementsToDOM();
+    for (const data of popupAnnotations) {
+      const elements = elementParams.elements = popupToElements.get(data.id);
+      elementParams.data = data;
+      const element = AnnotationElementFactory.create(elementParams);
+      if (!element.isRenderable) {
+        continue;
+      }
+      const rendered = element.render();
+      element.contentElement.id = `${AnnotationPrefix}${data.id}`;
+      if (data.hidden) {
+        rendered.style.visibility = "hidden";
+      }
+      elements.at(-1).container.after(rendered);
+    }
+    this.#setAnnotationCanvasMap();
+  }
+  async #addElementsToDOM() {
+    if (this.#elements.length === 0) {
+      return;
+    }
+    this.div.replaceChildren();
+    const promises = [];
+    if (!this.#hasAriaAttributesFromStructTree) {
+      this.#hasAriaAttributesFromStructTree = true;
+      for (const {
+        contentElement,
+        data: {
+          id
+        }
+      } of this.#elements) {
+        const annotationId = contentElement.id = `${AnnotationPrefix}${id}`;
+        promises.push(this.#structTreeLayer?.getAriaAttributes(annotationId).then(ariaAttributes => {
+          if (ariaAttributes) {
+            for (const [key, value] of ariaAttributes) {
+              contentElement.setAttribute(key, value);
+            }
+          }
+        }));
+      }
+    }
+    this.#elements.sort(({
+      data: {
+        rect: [a0, a1, a2, a3]
+      }
+    }, {
+      data: {
+        rect: [b0, b1, b2, b3]
+      }
+    }) => {
+      if (a0 === a2 && a1 === a3) {
+        return +1;
+      }
+      if (b0 === b2 && b1 === b3) {
+        return -1;
+      }
+      const top1 = a3;
+      const bot1 = a1;
+      const mid1 = (a1 + a3) / 2;
+      const top2 = b3;
+      const bot2 = b1;
+      const mid2 = (b1 + b3) / 2;
+      if (mid1 >= top2 && mid2 <= bot1) {
+        return -1;
+      }
+      if (mid2 >= top1 && mid1 <= bot2) {
+        return +1;
+      }
+      const centerX1 = (a0 + a2) / 2;
+      const centerX2 = (b0 + b2) / 2;
+      return centerX1 - centerX2;
+    });
+    const fragment = document.createDocumentFragment();
+    for (const element of this.#elements) {
+      fragment.append(element.container);
+      if (this._commentManager) {
+        (element.extraPopupElement?.popup || element.popup)?.renderCommentButton();
+      } else if (element.extraPopupElement) {
+        fragment.append(element.extraPopupElement.render());
+      }
+    }
+    this.div.append(fragment);
+    await Promise.all(promises);
+    if (this.#accessibilityManager) {
+      for (const element of this.#elements) {
+        this.#accessibilityManager.addPointerInTextLayer(element.contentElement, false);
+      }
+    }
+  }
+  async addLinkAnnotations(annotations) {
+    const elementParams = {
+      data: null,
+      layer: this.div,
+      linkService: this.#linkService,
+      svgFactory: new DOMSVGFactory(),
+      parent: this
+    };
+    for (const data of annotations) {
+      data.borderStyle ||= AnnotationLayer._defaultBorderStyle;
+      elementParams.data = data;
+      const element = AnnotationElementFactory.create(elementParams);
+      if (!element.isRenderable) {
+        continue;
+      }
+      element.render();
+      element.contentElement.id = `${AnnotationPrefix}${data.id}`;
+      this.#elements.push(element);
+    }
+    await this.#addElementsToDOM();
+  }
+  update({
+    viewport,
+    optionalContentConfig
+  }) {
+    const layer = this.div;
+    this.viewport = viewport;
+    setLayerDimensions(layer, {
+      rotation: viewport.rotation
+    });
+    for (const element of this.#elements) {
+      element.updateOC(optionalContentConfig);
+    }
+    this.#setAnnotationCanvasMap();
+    layer.hidden = false;
+  }
+  destroy() {
+    for (const element of this.#elements) {
+      element.destroy?.();
+      this.#accessibilityManager?.removePointerInTextLayer(element.contentElement);
+    }
+    this.#elements.length = 0;
+    this.#editableAnnotations.clear();
+    this.div.replaceChildren();
+  }
+  #setAnnotationCanvasMap() {
+    if (!this.#annotationCanvasMap) {
+      return;
+    }
+    const layer = this.div;
+    for (const [id, canvas] of this.#annotationCanvasMap) {
+      const element = layer.querySelector(`[data-annotation-id="${id}"]`);
+      if (!element) {
+        continue;
+      }
+      if (Array.isArray(canvas)) {
+        for (const cvs of canvas) {
+          cvs.className = "annotationContent";
+          cvs.ariaHidden = true;
+        }
+      } else {
+        canvas.className = "annotationContent";
+        canvas.ariaHidden = true;
+      }
+      const toRemove = [];
+      for (const child of element.children) {
+        if (child.nodeName === "CANVAS") {
+          toRemove.push(child);
+        }
+      }
+      for (const child of toRemove) {
+        child.remove();
+      }
+      const firstCanvas = Array.isArray(canvas) ? canvas[0] : canvas;
+      const {
+        firstChild
+      } = element;
+      if (!firstChild) {
+        element.append(firstCanvas);
+      } else if (!firstChild.classList.contains("annotationContent")) {
+        firstChild.before(firstCanvas);
+      } else {
+        firstChild.after(firstCanvas);
+      }
+      if (Array.isArray(canvas)) {
+        let lastCanvas = firstCanvas;
+        for (let i = 1, ii = canvas.length; i < ii; i++) {
+          lastCanvas.after(canvas[i]);
+          lastCanvas = canvas[i];
+        }
+      }
+      this.#annotationCanvasMap.delete(id);
+      const editableAnnotation = this.#editableAnnotations.get(id);
+      if (!editableAnnotation) {
+        continue;
+      }
+      if (editableAnnotation._hasNoCanvas) {
+        this._annotationEditorUIManager?.setMissingCanvas(id, element.id, canvas);
+        editableAnnotation._hasNoCanvas = false;
+      } else {
+        editableAnnotation.canvas = canvas;
+      }
+    }
+  }
+  refreshCanvases() {
+    this.#setAnnotationCanvasMap();
+  }
+  getEditableAnnotations() {
+    return this.#editableAnnotations.values();
+  }
+  getEditableAnnotation(id) {
+    return this.#editableAnnotations.get(id);
+  }
+  addFakeAnnotation(editor) {
+    const {
+      div
+    } = this;
+    const {
+      id,
+      rotation
+    } = editor;
+    const element = new EditorAnnotationElement({
+      data: {
+        id,
+        rect: editor.getPDFRect(),
+        rotation
+      },
+      editor,
+      layer: div,
+      parent: this,
+      enableComment: !!this._commentManager,
+      linkService: this.#linkService,
+      annotationStorage: this.#annotationStorage
+    });
+    element.render();
+    element.contentElement.id = `${AnnotationPrefix}${id}`;
+    element.createOrUpdatePopup();
+    this.#elements.push(element);
+    return element;
+  }
+  removeAnnotation(id) {
+    const index = this.#elements.findIndex(el => el.data.id === id);
+    if (index < 0) {
+      return;
+    }
+    const [element] = this.#elements.splice(index, 1);
+    this.#accessibilityManager?.removePointerInTextLayer(element.contentElement);
+  }
+  updateFakeAnnotations(editors) {
+    if (editors.length === 0) {
+      return;
+    }
+    for (const editor of editors) {
+      editor.updateFakeAnnotationElement(this);
+    }
+    this.#addElementsToDOM();
+  }
+  togglePointerEvents(enabled = false) {
+    this.div.classList.toggle("disabled", !enabled);
+  }
+  static get _defaultBorderStyle() {
+    return shadow(this, "_defaultBorderStyle", Object.freeze({
+      width: 1,
+      rawWidth: 1,
+      style: AnnotationBorderStyleType.SOLID,
+      dashArray: [3],
+      horizontalCornerRadius: 0,
+      verticalCornerRadius: 0
+    }));
+  }
+}
+
+;// ./src/display/editor/freetext.js
+
+
+
+
+
+const EOL_PATTERN = /\r\n?|\n/g;
+class FreeTextEditor extends AnnotationEditor {
+  #content = "";
+  #editorDivId = `${this.id}-editor`;
+  #editModeAC = null;
+  #fontSize;
+  _colorPicker = null;
+  static _freeTextDefaultContent = "";
+  static _internalPadding = 0;
+  static _defaultColor = null;
+  static _defaultFontSize = 10;
+  static get _keyboardManager() {
+    const proto = FreeTextEditor.prototype;
+    const arrowChecker = self => self.isEmpty();
+    const small = AnnotationEditorUIManager.TRANSLATE_SMALL;
+    const big = AnnotationEditorUIManager.TRANSLATE_BIG;
+    return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, {
+      bubbles: true
+    }], [["ctrl+Enter", "mac+meta+Enter"], proto.commitOrRemove], [["Escape"], proto.commitOrRemove], [["ArrowLeft"], proto._translateEmpty, {
+      args: [-small, 0],
+      checker: arrowChecker
+    }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, {
+      args: [-big, 0],
+      checker: arrowChecker
+    }], [["ArrowRight"], proto._translateEmpty, {
+      args: [small, 0],
+      checker: arrowChecker
+    }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, {
+      args: [big, 0],
+      checker: arrowChecker
+    }], [["ArrowUp"], proto._translateEmpty, {
+      args: [0, -small],
+      checker: arrowChecker
+    }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, {
+      args: [0, -big],
+      checker: arrowChecker
+    }], [["ArrowDown"], proto._translateEmpty, {
+      args: [0, small],
+      checker: arrowChecker
+    }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, {
+      args: [0, big],
+      checker: arrowChecker
+    }]]));
+  }
+  static _type = "freetext";
+  static _editorType = AnnotationEditorType.FREETEXT;
+  constructor(params) {
+    super({
+      ...params,
+      name: "freeTextEditor"
+    });
+    this.color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor;
+    this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize;
+    if (!this.annotationElementId) {
+      this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.freetext);
+    }
+    this.canAddComment = false;
+  }
+  static initialize(l10n, uiManager) {
+    AnnotationEditor.initialize(l10n, uiManager);
+    const style = getComputedStyle(document.documentElement);
+    this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding"));
+  }
+  static updateDefaultParams(type, value) {
+    switch (type) {
+      case AnnotationEditorParamsType.FREETEXT_SIZE:
+        FreeTextEditor._defaultFontSize = value;
+        break;
+      case AnnotationEditorParamsType.FREETEXT_COLOR:
+        FreeTextEditor._defaultColor = value;
+        break;
+    }
+  }
+  updateParams(type, value) {
+    switch (type) {
+      case AnnotationEditorParamsType.FREETEXT_SIZE:
+        this.#updateFontSize(value);
+        break;
+      case AnnotationEditorParamsType.FREETEXT_COLOR:
+        this.#updateColor(value);
+        break;
+    }
+  }
+  static get defaultPropertiesToUpdate() {
+    return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]];
+  }
+  get propertiesToUpdate() {
+    return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.color]];
+  }
+  get toolbarButtons() {
+    this._colorPicker ||= new BasicColorPicker(this);
+    return [["colorPicker", this._colorPicker]];
+  }
+  get colorType() {
+    return AnnotationEditorParamsType.FREETEXT_COLOR;
+  }
+  #updateFontSize(fontSize) {
+    const setFontsize = size => {
+      this.editorDiv.style.fontSize = `calc(${size}px * var(--total-scale-factor))`;
+      this.translate(0, -(size - this.#fontSize) * this.parentScale);
+      this.#fontSize = size;
+      this.#setEditorDimensions();
+    };
+    const savedFontsize = this.#fontSize;
+    this.addCommands({
+      cmd: setFontsize.bind(this, fontSize),
+      undo: setFontsize.bind(this, savedFontsize),
+      post: this._uiManager.updateUI.bind(this._uiManager, this),
+      mustExec: true,
+      type: AnnotationEditorParamsType.FREETEXT_SIZE,
+      overwriteIfSameType: true,
+      keepUndo: true
+    });
+  }
+  onUpdatedColor() {
+    this.editorDiv.style.color = this.color;
+    this._colorPicker?.update(this.color);
+    super.onUpdatedColor();
+  }
+  #updateColor(color) {
+    const setColor = col => {
+      this.color = col;
+      this.onUpdatedColor();
+    };
+    const savedColor = this.color;
+    this.addCommands({
+      cmd: setColor.bind(this, color),
+      undo: setColor.bind(this, savedColor),
+      post: this._uiManager.updateUI.bind(this._uiManager, this),
+      mustExec: true,
+      type: AnnotationEditorParamsType.FREETEXT_COLOR,
+      overwriteIfSameType: true,
+      keepUndo: true
+    });
+  }
+  _translateEmpty(x, y) {
+    this._uiManager.translateSelectedEditors(x, y, true);
+  }
+  getInitialTranslation() {
+    const scale = this.parentScale;
+    return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale];
+  }
+  rebuild() {
+    if (!this.parent) {
+      return;
+    }
+    super.rebuild();
+    if (this.div === null) {
+      return;
+    }
+    if (!this.isAttachedToDOM) {
+      this.parent.add(this);
+    }
+  }
+  enableEditMode() {
+    if (!super.enableEditMode()) {
+      return false;
+    }
+    this.overlayDiv.classList.remove("enabled");
+    this.editorDiv.contentEditable = true;
+    this._isDraggable = false;
+    this.div.removeAttribute("aria-activedescendant");
+    this.#editModeAC = new AbortController();
+    const signal = this._uiManager.combinedSignal(this.#editModeAC);
+    this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), {
+      signal
+    });
+    this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), {
+      signal
+    });
+    this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), {
+      signal
+    });
+    this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), {
+      signal
+    });
+    this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), {
+      signal
+    });
+    return true;
+  }
+  disableEditMode() {
+    if (!super.disableEditMode()) {
+      return false;
+    }
+    this.overlayDiv.classList.add("enabled");
+    this.editorDiv.contentEditable = false;
+    this.div.setAttribute("aria-activedescendant", this.#editorDivId);
+    this._isDraggable = true;
+    this.#editModeAC?.abort();
+    this.#editModeAC = null;
+    this.div.focus({
+      preventScroll: true
+    });
+    this.isEditing = false;
+    this.parent.div.classList.add("freetextEditing");
+    return true;
+  }
+  focusin(event) {
+    if (!this._focusEventsAllowed) {
+      return;
+    }
+    super.focusin(event);
+    if (event.target !== this.editorDiv) {
+      this.editorDiv.focus();
+    }
+  }
+  onceAdded(focus) {
+    if (this.width) {
+      return;
+    }
+    this.enableEditMode();
+    if (focus) {
+      this.editorDiv.focus();
+    }
+    if (this._initialOptions?.isCentered) {
+      this.center();
+    }
+    this._initialOptions = null;
+  }
+  isEmpty() {
+    return !this.editorDiv || this.editorDiv.innerText.trim() === "";
+  }
+  remove() {
+    this.isEditing = false;
+    if (this.parent) {
+      this.parent.setEditingState(true);
+      this.parent.div.classList.add("freetextEditing");
+    }
+    super.remove();
+  }
+  #extractText() {
+    const buffer = [];
+    this.editorDiv.normalize();
+    let prevChild = null;
+    for (const child of this.editorDiv.childNodes) {
+      if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === "BR") {
+        continue;
+      }
+      buffer.push(FreeTextEditor.#getNodeContent(child));
+      prevChild = child;
+    }
+    return buffer.join("\n");
+  }
+  #setEditorDimensions() {
+    const [parentWidth, parentHeight] = this.parentDimensions;
+    let rect;
+    if (this.isAttachedToDOM) {
+      rect = this.div.getBoundingClientRect();
+    } else {
+      const {
+        currentLayer,
+        div
+      } = this;
+      const savedDisplay = div.style.display;
+      const savedVisibility = div.classList.contains("hidden");
+      div.classList.remove("hidden");
+      div.style.display = "hidden";
+      currentLayer.div.append(this.div);
+      rect = div.getBoundingClientRect();
+      div.remove();
+      div.style.display = savedDisplay;
+      div.classList.toggle("hidden", savedVisibility);
+    }
+    if (this.rotation % 180 === this.parentRotation % 180) {
+      this.width = rect.width / parentWidth;
+      this.height = rect.height / parentHeight;
+    } else {
+      this.width = rect.height / parentWidth;
+      this.height = rect.width / parentHeight;
+    }
+    this.fixAndSetPosition();
+  }
+  commit() {
+    if (!this.isInEditMode()) {
+      return;
+    }
+    super.commit();
+    this.disableEditMode();
+    const savedText = this.#content;
+    const newText = this.#content = this.#extractText().trimEnd();
+    if (savedText === newText) {
+      return;
+    }
+    const setText = text => {
+      this.#content = text;
+      if (!text) {
+        this.remove();
+        return;
+      }
+      this.#setContent();
+      this._uiManager.rebuild(this);
+      this.#setEditorDimensions();
+    };
+    this.addCommands({
+      cmd: () => {
+        setText(newText);
+      },
+      undo: () => {
+        setText(savedText);
+      },
+      mustExec: false
+    });
+    this.#setEditorDimensions();
+  }
+  shouldGetKeyboardEvents() {
+    return this.isInEditMode();
+  }
+  enterInEditMode() {
+    this.enableEditMode();
+    this.editorDiv.focus();
+  }
+  keydown(event) {
+    if (event.target === this.div && event.key === "Enter") {
+      this.enterInEditMode();
+      event.preventDefault();
+    }
+  }
+  editorDivKeydown(event) {
+    FreeTextEditor._keyboardManager.exec(this, event);
+  }
+  editorDivFocus(event) {
+    this.isEditing = true;
+  }
+  editorDivBlur(event) {
+    this.isEditing = false;
+  }
+  editorDivInput(event) {
+    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", true);
+  }
+  get canChangeContent() {
+    return true;
+  }
+  render() {
+    if (this.div) {
+      return this.div;
+    }
+    let baseX, baseY;
+    if (this._isCopy || this.annotationElementId) {
+      baseX = this.x;
+      baseY = this.y;
+    }
+    super.render();
+    this.editorDiv = document.createElement("div");
+    this.editorDiv.className = "internal";
+    this.editorDiv.setAttribute("id", this.#editorDivId);
+    this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2");
+    this.editorDiv.setAttribute("data-l10n-attrs", "default-content");
+    this.enableEditing();
+    this.editorDiv.contentEditable = true;
+    const {
+      style
+    } = this.editorDiv;
+    style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`;
+    style.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 [parentWidth, parentHeight] = this.parentDimensions;
+      if (this.annotationElementId) {
+        const {
+          position
+        } = this._initialData;
+        let [tx, ty] = this.getInitialTranslation();
+        [tx, ty] = this.pageTranslationToScreen(tx, ty);
+        const [pageWidth, pageHeight] = this.pageDimensions;
+        const [pageX, pageY] = this.pageTranslation;
+        let posX, posY;
+        switch (this.rotation) {
+          case 0:
+            posX = baseX + (position[0] - pageX) / pageWidth;
+            posY = baseY + this.height - (position[1] - pageY) / pageHeight;
+            break;
+          case 90:
+            posX = baseX + (position[0] - pageX) / pageWidth;
+            posY = baseY - (position[1] - pageY) / pageHeight;
+            [tx, ty] = [ty, -tx];
+            break;
+          case 180:
+            posX = baseX - this.width + (position[0] - pageX) / pageWidth;
+            posY = baseY - (position[1] - pageY) / pageHeight;
+            [tx, ty] = [-tx, -ty];
+            break;
+          case 270:
+            posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth;
+            posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight;
+            [tx, ty] = [-ty, tx];
+            break;
+        }
+        this.setAt(posX * parentWidth, posY * parentHeight, tx, ty);
+      } else {
+        this._moveAfterPaste(baseX, baseY);
+      }
+      this.#setContent();
+      this._isDraggable = true;
+      this.editorDiv.contentEditable = false;
+    } else {
+      this._isDraggable = false;
+      this.editorDiv.contentEditable = true;
+    }
+    return this.div;
+  }
+  static #getNodeContent(node) {
+    return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, "");
+  }
+  editorDivPaste(event) {
+    const clipboardData = event.clipboardData || window.clipboardData;
+    const {
+      types
+    } = clipboardData;
+    if (types.length === 1 && types[0] === "text/plain") {
+      return;
+    }
+    event.preventDefault();
+    const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n");
+    if (!paste) {
+      return;
+    }
+    const selection = window.getSelection();
+    if (!selection.rangeCount) {
+      return;
+    }
+    this.editorDiv.normalize();
+    selection.deleteFromDocument();
+    const range = selection.getRangeAt(0);
+    if (!paste.includes("\n")) {
+      range.insertNode(document.createTextNode(paste));
+      this.editorDiv.normalize();
+      selection.collapseToStart();
+      return;
+    }
+    const {
+      startContainer,
+      startOffset
+    } = range;
+    const bufferBefore = [];
+    const bufferAfter = [];
+    if (startContainer.nodeType === Node.TEXT_NODE) {
+      const parent = startContainer.parentElement;
+      bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, ""));
+      if (parent !== this.editorDiv) {
+        let buffer = bufferBefore;
+        for (const child of this.editorDiv.childNodes) {
+          if (child === parent) {
+            buffer = bufferAfter;
+            continue;
+          }
+          buffer.push(FreeTextEditor.#getNodeContent(child));
+        }
+      }
+      bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, ""));
+    } else if (startContainer === this.editorDiv) {
+      let buffer = bufferBefore;
+      let i = 0;
+      for (const child of this.editorDiv.childNodes) {
+        if (i++ === startOffset) {
+          buffer = bufferAfter;
+        }
+        buffer.push(FreeTextEditor.#getNodeContent(child));
+      }
+    }
+    this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`;
+    this.#setContent();
+    const newRange = new Range();
+    let beforeLength = Math.sumPrecise(bufferBefore.map(line => line.length));
+    for (const {
+      firstChild
+    } of this.editorDiv.childNodes) {
+      if (firstChild.nodeType === Node.TEXT_NODE) {
+        const length = firstChild.nodeValue.length;
+        if (beforeLength <= length) {
+          newRange.setStart(firstChild, beforeLength);
+          newRange.setEnd(firstChild, beforeLength);
+          break;
+        }
+        beforeLength -= length;
+      }
+    }
+    selection.removeAllRanges();
+    selection.addRange(newRange);
+  }
+  #setContent() {
+    this.editorDiv.replaceChildren();
+    if (!this.#content) {
+      return;
+    }
+    for (const line of this.#content.split("\n")) {
+      const div = document.createElement("div");
+      div.append(line ? document.createTextNode(line) : document.createElement("br"));
+      this.editorDiv.append(div);
+    }
+  }
+  #serializeContent() {
+    return this.#content.replaceAll("\xa0", " ");
+  }
+  static #deserializeContent(content) {
+    return content.replaceAll(" ", "\xa0");
+  }
+  get contentDiv() {
+    return this.editorDiv;
+  }
+  getPDFRect() {
+    const padding = FreeTextEditor._internalPadding * this.parentScale;
+    return this.getRect(padding, padding);
+  }
+  static async deserialize(data, parent, uiManager) {
+    let initialData = null;
+    if (data instanceof FreeTextAnnotationElement) {
+      const {
+        data: {
+          defaultAppearanceData: {
+            fontSize,
+            fontColor
+          },
+          rect,
+          rotation,
+          id,
+          popupRef,
+          richText,
+          contentsObj,
+          creationDate,
+          modificationDate
+        },
+        textContent,
+        textPosition,
+        parent: {
+          page: {
+            pageNumber
+          }
+        }
+      } = data;
+      if (!textContent?.length) {
+        return null;
+      }
+      initialData = data = {
+        annotationType: AnnotationEditorType.FREETEXT,
+        color: Array.from(fontColor),
+        fontSize,
+        value: textContent.join("\n"),
+        position: textPosition,
+        pageIndex: pageNumber - 1,
+        rect: rect.slice(0),
+        rotation,
+        annotationElementId: id,
+        id,
+        deleted: false,
+        popupRef,
+        comment: contentsObj?.str || null,
+        richText,
+        creationDate,
+        modificationDate
+      };
+    }
+    const editor = await super.deserialize(data, parent, uiManager);
+    editor.#fontSize = data.fontSize;
+    editor.color = Util.makeHexColor(...data.color);
+    editor.#content = FreeTextEditor.#deserializeContent(data.value);
+    editor._initialData = initialData;
+    if (data.comment) {
+      editor.setCommentData(data);
+    }
+    return editor;
+  }
+  serialize(isForCopying = false) {
+    if (this.isEmpty()) {
+      return null;
+    }
+    if (this.deleted) {
+      return this.serializeDeleted();
+    }
+    const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.color);
+    const serialized = Object.assign(super.serialize(isForCopying), {
+      color,
+      fontSize: this.#fontSize,
+      value: this.#serializeContent()
+    });
+    this.addComment(serialized);
+    if (isForCopying) {
+      serialized.isCopy = true;
+      return serialized;
+    }
+    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {
+      return null;
+    }
+    serialized.id = this.annotationElementId;
+    return serialized;
+  }
+  #hasElementChanged(serialized) {
+    const {
+      value,
+      fontSize,
+      color,
+      pageIndex
+    } = this._initialData;
+    return this.hasEditedComment || this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex;
+  }
+  renderAnnotationElement(annotation) {
+    const content = super.renderAnnotationElement(annotation);
+    if (!content) {
+      return null;
+    }
+    const {
+      style
+    } = content;
+    style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`;
+    style.color = this.color;
+    content.replaceChildren();
+    for (const line of this.#content.split("\n")) {
+      const div = document.createElement("div");
+      div.append(line ? document.createTextNode(line) : document.createElement("br"));
+      content.append(div);
+    }
+    annotation.updateEdited({
+      rect: this.getPDFRect(),
+      popup: this._uiManager.hasCommentManager() || this.hasEditedComment ? this.comment : {
+        text: this.#content
+      }
+    });
+    return content;
+  }
+  resetAnnotationElement(annotation) {
+    super.resetAnnotationElement(annotation);
+    annotation.resetEdited();
+  }
+}
+
+;// ./src/display/editor/drawers/outline.js
+
+class Outline {
+  static PRECISION = 1e-4;
+  toSVGPath() {
+    unreachable("Abstract method `toSVGPath` must be implemented.");
+  }
+  get box() {
+    unreachable("Abstract getter `box` must be implemented.");
+  }
+  serialize(_bbox, _rotation) {
+    unreachable("Abstract method `serialize` must be implemented.");
+  }
+  static _rescale(src, tx, ty, sx, sy, dest) {
+    dest ||= new Float32Array(src.length);
+    for (let i = 0, ii = src.length; i < ii; i += 2) {
+      dest[i] = tx + src[i] * sx;
+      dest[i + 1] = ty + src[i + 1] * sy;
+    }
+    return dest;
+  }
+  static _rescaleAndSwap(src, tx, ty, sx, sy, dest) {
+    dest ||= new Float32Array(src.length);
+    for (let i = 0, ii = src.length; i < ii; i += 2) {
+      dest[i] = tx + src[i + 1] * sx;
+      dest[i + 1] = ty + src[i] * sy;
+    }
+    return dest;
+  }
+  static _translate(src, tx, ty, dest) {
+    dest ||= new Float32Array(src.length);
+    for (let i = 0, ii = src.length; i < ii; i += 2) {
+      dest[i] = tx + src[i];
+      dest[i + 1] = ty + src[i + 1];
+    }
+    return dest;
+  }
+  static svgRound(x) {
+    return Math.round(x * 10000);
+  }
+  static _normalizePoint(x, y, parentWidth, parentHeight, rotation) {
+    switch (rotation) {
+      case 90:
+        return [1 - y / parentWidth, x / parentHeight];
+      case 180:
+        return [1 - x / parentWidth, 1 - y / parentHeight];
+      case 270:
+        return [y / parentWidth, 1 - x / parentHeight];
+      default:
+        return [x / parentWidth, y / parentHeight];
+    }
+  }
+  static createBezierPoints(x1, y1, x2, y2, x3, y3) {
+    return [(x1 + 5 * x2) / 6, (y1 + 5 * y2) / 6, (5 * x2 + x3) / 6, (5 * y2 + y3) / 6, (x2 + x3) / 2, (y2 + y3) / 2];
+  }
+}
+
+;// ./src/display/editor/drawers/freedraw.js
+
+
+class FreeDrawOutliner {
+  #box;
+  #bottom = [];
+  #innerMargin;
+  #isLTR;
+  #top = [];
+  #last = new Float32Array(18);
+  #lastX;
+  #lastY;
+  #min;
+  #min_dist;
+  #scaleFactor;
+  #thickness;
+  #points = [];
+  static #MIN_DIST = 8;
+  static #MIN_DIFF = 2;
+  static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF;
+  constructor({
+    x,
+    y
+  }, box, scaleFactor, thickness, isLTR, innerMargin = 0) {
+    this.#box = box;
+    this.#thickness = thickness * scaleFactor;
+    this.#isLTR = isLTR;
+    this.#last.set([NaN, NaN, NaN, NaN, x, y], 6);
+    this.#innerMargin = innerMargin;
+    this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor;
+    this.#min = FreeDrawOutliner.#MIN * scaleFactor;
+    this.#scaleFactor = scaleFactor;
+    this.#points.push(x, y);
+  }
+  isEmpty() {
+    return isNaN(this.#last[8]);
+  }
+  #getLastCoords() {
+    const lastTop = this.#last.subarray(4, 6);
+    const lastBottom = this.#last.subarray(16, 18);
+    const [x, y, width, height] = this.#box;
+    return [(this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height];
+  }
+  add({
+    x,
+    y
+  }) {
+    this.#lastX = x;
+    this.#lastY = y;
+    const [layerX, layerY, layerWidth, layerHeight] = this.#box;
+    let [x1, y1, x2, y2] = this.#last.subarray(8, 12);
+    const diffX = x - x2;
+    const diffY = y - y2;
+    const d = Math.hypot(diffX, diffY);
+    if (d < this.#min) {
+      return false;
+    }
+    const diffD = d - this.#min_dist;
+    const K = diffD / d;
+    const shiftX = K * diffX;
+    const shiftY = K * diffY;
+    let x0 = x1;
+    let y0 = y1;
+    x1 = x2;
+    y1 = y2;
+    x2 += shiftX;
+    y2 += shiftY;
+    this.#points?.push(x, y);
+    const nX = -shiftY / diffD;
+    const nY = shiftX / diffD;
+    const thX = nX * this.#thickness;
+    const thY = nY * this.#thickness;
+    this.#last.set(this.#last.subarray(2, 8), 0);
+    this.#last.set([x2 + thX, y2 + thY], 4);
+    this.#last.set(this.#last.subarray(14, 18), 12);
+    this.#last.set([x2 - thX, y2 - thY], 16);
+    if (isNaN(this.#last[6])) {
+      if (this.#top.length === 0) {
+        this.#last.set([x1 + thX, y1 + thY], 2);
+        this.#top.push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight);
+        this.#last.set([x1 - thX, y1 - thY], 14);
+        this.#bottom.push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight);
+      }
+      this.#last.set([x0, y0, x1, y1, x2, y2], 6);
+      return !this.isEmpty();
+    }
+    this.#last.set([x0, y0, x1, y1, x2, y2], 6);
+    const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX));
+    if (angle < Math.PI / 2) {
+      [x1, y1, x2, y2] = this.#last.subarray(2, 6);
+      this.#top.push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);
+      [x1, y1, x0, y0] = this.#last.subarray(14, 18);
+      this.#bottom.push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight);
+      return true;
+    }
+    [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6);
+    this.#top.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);
+    [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18);
+    this.#bottom.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);
+    return true;
+  }
+  toSVGPath() {
+    if (this.isEmpty()) {
+      return "";
+    }
+    const top = this.#top;
+    const bottom = this.#bottom;
+    if (isNaN(this.#last[6]) && !this.isEmpty()) {
+      return this.#toSVGPathTwoPoints();
+    }
+    const buffer = [];
+    buffer.push(`M${top[4]} ${top[5]}`);
+    for (let i = 6; i < top.length; i += 6) {
+      if (isNaN(top[i])) {
+        buffer.push(`L${top[i + 4]} ${top[i + 5]}`);
+      } else {
+        buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`);
+      }
+    }
+    this.#toSVGPathEnd(buffer);
+    for (let i = bottom.length - 6; i >= 6; i -= 6) {
+      if (isNaN(bottom[i])) {
+        buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`);
+      } else {
+        buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`);
+      }
+    }
+    this.#toSVGPathStart(buffer);
+    return buffer.join(" ");
+  }
+  #toSVGPathTwoPoints() {
+    const [x, y, width, height] = this.#box;
+    const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords();
+    return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`;
+  }
+  #toSVGPathStart(buffer) {
+    const bottom = this.#bottom;
+    buffer.push(`L${bottom[4]} ${bottom[5]} Z`);
+  }
+  #toSVGPathEnd(buffer) {
+    const [x, y, width, height] = this.#box;
+    const lastTop = this.#last.subarray(4, 6);
+    const lastBottom = this.#last.subarray(16, 18);
+    const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords();
+    buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`);
+  }
+  newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) {
+    return new FreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR);
+  }
+  getOutlines() {
+    const top = this.#top;
+    const bottom = this.#bottom;
+    const last = this.#last;
+    const [layerX, layerY, layerWidth, layerHeight] = this.#box;
+    const points = new Float32Array((this.#points?.length ?? 0) + 2);
+    for (let i = 0, ii = points.length - 2; i < ii; i += 2) {
+      points[i] = (this.#points[i] - layerX) / layerWidth;
+      points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight;
+    }
+    points[points.length - 2] = (this.#lastX - layerX) / layerWidth;
+    points[points.length - 1] = (this.#lastY - layerY) / layerHeight;
+    if (isNaN(last[6]) && !this.isEmpty()) {
+      return this.#getOutlineTwoPoints(points);
+    }
+    const outline = new Float32Array(this.#top.length + 24 + this.#bottom.length);
+    let N = top.length;
+    for (let i = 0; i < N; i += 2) {
+      if (isNaN(top[i])) {
+        outline[i] = outline[i + 1] = NaN;
+        continue;
+      }
+      outline[i] = top[i];
+      outline[i + 1] = top[i + 1];
+    }
+    N = this.#getOutlineEnd(outline, N);
+    for (let i = bottom.length - 6; i >= 6; i -= 6) {
+      for (let j = 0; j < 6; j += 2) {
+        if (isNaN(bottom[i + j])) {
+          outline[N] = outline[N + 1] = NaN;
+          N += 2;
+          continue;
+        }
+        outline[N] = bottom[i + j];
+        outline[N + 1] = bottom[i + j + 1];
+        N += 2;
+      }
+    }
+    this.#getOutlineStart(outline, N);
+    return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR);
+  }
+  #getOutlineTwoPoints(points) {
+    const last = this.#last;
+    const [layerX, layerY, layerWidth, layerHeight] = this.#box;
+    const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords();
+    const outline = new Float32Array(36);
+    outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0);
+    return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR);
+  }
+  #getOutlineStart(outline, pos) {
+    const bottom = this.#bottom;
+    outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos);
+    return pos += 6;
+  }
+  #getOutlineEnd(outline, pos) {
+    const lastTop = this.#last.subarray(4, 6);
+    const lastBottom = this.#last.subarray(16, 18);
+    const [layerX, layerY, layerWidth, layerHeight] = this.#box;
+    const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords();
+    outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], pos);
+    return pos += 24;
+  }
+}
+class FreeDrawOutline extends Outline {
+  #box;
+  #bbox = new Float32Array(4);
+  #innerMargin;
+  #isLTR;
+  #points;
+  #scaleFactor;
+  #outline;
+  constructor(outline, points, box, scaleFactor, innerMargin, isLTR) {
+    super();
+    this.#outline = outline;
+    this.#points = points;
+    this.#box = box;
+    this.#scaleFactor = scaleFactor;
+    this.#innerMargin = innerMargin;
+    this.#isLTR = isLTR;
+    this.firstPoint = [NaN, NaN];
+    this.lastPoint = [NaN, NaN];
+    this.#computeMinMax(isLTR);
+    const [x, y, width, height] = this.#bbox;
+    for (let i = 0, ii = outline.length; i < ii; i += 2) {
+      outline[i] = (outline[i] - x) / width;
+      outline[i + 1] = (outline[i + 1] - y) / height;
+    }
+    for (let i = 0, ii = points.length; i < ii; i += 2) {
+      points[i] = (points[i] - x) / width;
+      points[i + 1] = (points[i + 1] - y) / height;
+    }
+  }
+  toSVGPath() {
+    const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`];
+    for (let i = 6, ii = this.#outline.length; i < ii; i += 6) {
+      if (isNaN(this.#outline[i])) {
+        buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`);
+        continue;
+      }
+      buffer.push(`C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${this.#outline[i + 3]} ${this.#outline[i + 4]} ${this.#outline[i + 5]}`);
+    }
+    buffer.push("Z");
+    return buffer.join(" ");
+  }
+  serialize([blX, blY, trX, trY], rotation) {
+    const width = trX - blX;
+    const height = trY - blY;
+    let outline;
+    let points;
+    switch (rotation) {
+      case 0:
+        outline = Outline._rescale(this.#outline, blX, trY, width, -height);
+        points = Outline._rescale(this.#points, blX, trY, width, -height);
+        break;
+      case 90:
+        outline = Outline._rescaleAndSwap(this.#outline, blX, blY, width, height);
+        points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height);
+        break;
+      case 180:
+        outline = Outline._rescale(this.#outline, trX, blY, -width, height);
+        points = Outline._rescale(this.#points, trX, blY, -width, height);
+        break;
+      case 270:
+        outline = Outline._rescaleAndSwap(this.#outline, trX, trY, -width, -height);
+        points = Outline._rescaleAndSwap(this.#points, trX, trY, -width, -height);
+        break;
+    }
+    return {
+      outline: Array.from(outline),
+      points: [Array.from(points)]
+    };
+  }
+  #computeMinMax(isLTR) {
+    const outline = this.#outline;
+    let lastX = outline[4];
+    let lastY = outline[5];
+    const minMax = [lastX, lastY, lastX, lastY];
+    let firstPointX = lastX;
+    let firstPointY = lastY;
+    let lastPointX = lastX;
+    let lastPointY = lastY;
+    const ltrCallback = isLTR ? Math.max : Math.min;
+    const bezierBbox = new Float32Array(4);
+    for (let i = 6, ii = outline.length; i < ii; i += 6) {
+      const x = outline[i + 4],
+        y = outline[i + 5];
+      if (isNaN(outline[i])) {
+        Util.pointBoundingBox(x, y, minMax);
+        if (firstPointY > y) {
+          firstPointX = x;
+          firstPointY = y;
+        } else if (firstPointY === y) {
+          firstPointX = ltrCallback(firstPointX, x);
+        }
+        if (lastPointY < y) {
+          lastPointX = x;
+          lastPointY = y;
+        } else if (lastPointY === y) {
+          lastPointX = ltrCallback(lastPointX, x);
+        }
+      } else {
+        bezierBbox.set(BBOX_INIT, 0);
+        Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6), bezierBbox);
+        Util.rectBoundingBox(...bezierBbox, minMax);
+        if (firstPointY > bezierBbox[1]) {
+          firstPointX = bezierBbox[0];
+          firstPointY = bezierBbox[1];
+        } else if (firstPointY === bezierBbox[1]) {
+          firstPointX = ltrCallback(firstPointX, bezierBbox[0]);
+        }
+        if (lastPointY < bezierBbox[3]) {
+          lastPointX = bezierBbox[2];
+          lastPointY = bezierBbox[3];
+        } else if (lastPointY === bezierBbox[3]) {
+          lastPointX = ltrCallback(lastPointX, bezierBbox[2]);
+        }
+      }
+      lastX = x;
+      lastY = y;
+    }
+    const bbox = this.#bbox;
+    bbox[0] = minMax[0] - this.#innerMargin;
+    bbox[1] = minMax[1] - this.#innerMargin;
+    bbox[2] = minMax[2] - minMax[0] + 2 * this.#innerMargin;
+    bbox[3] = minMax[3] - minMax[1] + 2 * this.#innerMargin;
+    this.firstPoint = [firstPointX, firstPointY];
+    this.lastPoint = [lastPointX, lastPointY];
+  }
+  get box() {
+    return this.#bbox;
+  }
+  newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) {
+    return new FreeDrawOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin);
+  }
+  getNewOutline(thickness, innerMargin) {
+    const [x, y, width, height] = this.#bbox;
+    const [layerX, layerY, layerWidth, layerHeight] = this.#box;
+    const sx = width * layerWidth;
+    const sy = height * layerHeight;
+    const tx = x * layerWidth + layerX;
+    const ty = y * layerHeight + layerY;
+    const outliner = this.newOutliner({
+      x: this.#points[0] * sx + tx,
+      y: this.#points[1] * sy + ty
+    }, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin);
+    for (let i = 2; i < this.#points.length; i += 2) {
+      outliner.add({
+        x: this.#points[i] * sx + tx,
+        y: this.#points[i + 1] * sy + ty
+      });
+    }
+    return outliner.getOutlines();
+  }
+}
+
+;// ./src/display/editor/drawers/highlight.js
+
+
+
+class HighlightOutliner {
+  #box;
+  #firstPoint;
+  #lastPoint;
+  #verticalEdges = [];
+  #intervals = [];
+  constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) {
+    const minMax = BBOX_INIT.slice();
+    const NUMBER_OF_DIGITS = 4;
+    const EPSILON = 10 ** -NUMBER_OF_DIGITS;
+    for (const {
+      x,
+      y,
+      width,
+      height
+    } of boxes) {
+      const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON;
+      const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON;
+      const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON;
+      const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON;
+      const left = [x1, y1, y2, true];
+      const right = [x2, y1, y2, false];
+      this.#verticalEdges.push(left, right);
+      Util.rectBoundingBox(x1, y1, x2, y2, minMax);
+    }
+    const bboxWidth = minMax[2] - minMax[0] + 2 * innerMargin;
+    const bboxHeight = minMax[3] - minMax[1] + 2 * innerMargin;
+    const shiftedMinX = minMax[0] - innerMargin;
+    const shiftedMinY = minMax[1] - innerMargin;
+    let firstPointX = isLTR ? -Infinity : Infinity;
+    let firstPointY = Infinity;
+    const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2);
+    const lastPoint = [lastEdge[0], lastEdge[2]];
+    for (const edge of this.#verticalEdges) {
+      const [x, y1, y2, left] = edge;
+      if (!left && isLTR) {
+        if (y1 < firstPointY) {
+          firstPointY = y1;
+          firstPointX = x;
+        } else if (y1 === firstPointY) {
+          firstPointX = Math.max(firstPointX, x);
+        }
+      } else if (left && !isLTR) {
+        if (y1 < firstPointY) {
+          firstPointY = y1;
+          firstPointX = x;
+        } else if (y1 === firstPointY) {
+          firstPointX = Math.min(firstPointX, x);
+        }
+      }
+      edge[0] = (x - shiftedMinX) / bboxWidth;
+      edge[1] = (y1 - shiftedMinY) / bboxHeight;
+      edge[2] = (y2 - shiftedMinY) / bboxHeight;
+    }
+    this.#box = new Float32Array([shiftedMinX, shiftedMinY, bboxWidth, bboxHeight]);
+    this.#firstPoint = [firstPointX, firstPointY];
+    this.#lastPoint = lastPoint;
+  }
+  getOutlines() {
+    this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]);
+    const outlineVerticalEdges = [];
+    for (const edge of this.#verticalEdges) {
+      if (edge[3]) {
+        outlineVerticalEdges.push(...this.#breakEdge(edge));
+        this.#insert(edge);
+      } else {
+        this.#remove(edge);
+        outlineVerticalEdges.push(...this.#breakEdge(edge));
+      }
+    }
+    return this.#getOutlines(outlineVerticalEdges);
+  }
+  #getOutlines(outlineVerticalEdges) {
+    const edges = [];
+    const allEdges = new Set();
+    for (const edge of outlineVerticalEdges) {
+      const [x, y1, y2] = edge;
+      edges.push([x, y1, edge], [x, y2, edge]);
+    }
+    edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]);
+    for (let i = 0, ii = edges.length; i < ii; i += 2) {
+      const edge1 = edges[i][2];
+      const edge2 = edges[i + 1][2];
+      edge1.push(edge2);
+      edge2.push(edge1);
+      allEdges.add(edge1);
+      allEdges.add(edge2);
+    }
+    const outlines = [];
+    let outline;
+    while (allEdges.size > 0) {
+      const edge = allEdges.values().next().value;
+      let [x, y1, y2, edge1, edge2] = edge;
+      allEdges.delete(edge);
+      let lastPointX = x;
+      let lastPointY = y1;
+      outline = [x, y2];
+      outlines.push(outline);
+      while (true) {
+        let e;
+        if (allEdges.has(edge1)) {
+          e = edge1;
+        } else if (allEdges.has(edge2)) {
+          e = edge2;
+        } else {
+          break;
+        }
+        allEdges.delete(e);
+        [x, y1, y2, edge1, edge2] = e;
+        if (lastPointX !== x) {
+          outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2);
+          lastPointX = x;
+        }
+        lastPointY = lastPointY === y1 ? y2 : y1;
+      }
+      outline.push(lastPointX, lastPointY);
+    }
+    return new HighlightOutline(outlines, this.#box, this.#firstPoint, this.#lastPoint);
+  }
+  #binarySearch(y) {
+    const array = this.#intervals;
+    let start = 0;
+    let end = array.length - 1;
+    while (start <= end) {
+      const middle = start + end >> 1;
+      const y1 = array[middle][0];
+      if (y1 === y) {
+        return middle;
+      }
+      if (y1 < y) {
+        start = middle + 1;
+      } else {
+        end = middle - 1;
+      }
+    }
+    return end + 1;
+  }
+  #insert([, y1, y2]) {
+    const index = this.#binarySearch(y1);
+    this.#intervals.splice(index, 0, [y1, y2]);
+  }
+  #remove([, y1, y2]) {
+    const index = this.#binarySearch(y1);
+    for (let i = index; i < this.#intervals.length; i++) {
+      const [start, end] = this.#intervals[i];
+      if (start !== y1) {
+        break;
+      }
+      if (start === y1 && end === y2) {
+        this.#intervals.splice(i, 1);
+        return;
+      }
+    }
+    for (let i = index - 1; i >= 0; i--) {
+      const [start, end] = this.#intervals[i];
+      if (start !== y1) {
+        break;
+      }
+      if (start === y1 && end === y2) {
+        this.#intervals.splice(i, 1);
+        return;
+      }
+    }
+  }
+  #breakEdge(edge) {
+    const [x, y1, y2] = edge;
+    const results = [[x, y1, y2]];
+    const index = this.#binarySearch(y2);
+    for (let i = 0; i < index; i++) {
+      const [start, end] = this.#intervals[i];
+      for (let j = 0, jj = results.length; j < jj; j++) {
+        const [, y3, y4] = results[j];
+        if (end <= y3 || y4 <= start) {
+          continue;
+        }
+        if (y3 >= start) {
+          if (y4 > end) {
+            results[j][1] = end;
+          } else {
+            if (jj === 1) {
+              return [];
+            }
+            results.splice(j, 1);
+            j--;
+            jj--;
+          }
+          continue;
+        }
+        results[j][2] = start;
+        if (y4 > end) {
+          results.push([x, end, y4]);
+        }
+      }
+    }
+    return results;
+  }
+}
+class HighlightOutline extends Outline {
+  #box;
+  #outlines;
+  constructor(outlines, box, firstPoint, lastPoint) {
+    super();
+    this.#outlines = outlines;
+    this.#box = box;
+    this.firstPoint = firstPoint;
+    this.lastPoint = lastPoint;
+  }
+  toSVGPath() {
+    const buffer = [];
+    for (const polygon of this.#outlines) {
+      let [prevX, prevY] = polygon;
+      buffer.push(`M${prevX} ${prevY}`);
+      for (let i = 2; i < polygon.length; i += 2) {
+        const x = polygon[i];
+        const y = polygon[i + 1];
+        if (x === prevX) {
+          buffer.push(`V${y}`);
+          prevY = y;
+        } else if (y === prevY) {
+          buffer.push(`H${x}`);
+          prevX = x;
+        }
+      }
+      buffer.push("Z");
+    }
+    return buffer.join(" ");
+  }
+  serialize([blX, blY, trX, trY], _rotation) {
+    const outlines = [];
+    const width = trX - blX;
+    const height = trY - blY;
+    for (const outline of this.#outlines) {
+      const points = new Array(outline.length);
+      for (let i = 0; i < outline.length; i += 2) {
+        points[i] = blX + outline[i] * width;
+        points[i + 1] = trY - outline[i + 1] * height;
+      }
+      outlines.push(points);
+    }
+    return outlines;
+  }
+  get box() {
+    return this.#box;
+  }
+}
+class FreeHighlightOutliner extends FreeDrawOutliner {
+  newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) {
+    return new FreeHighlightOutline(outline, points, box, scaleFactor, innerMargin, isLTR);
+  }
+}
+class FreeHighlightOutline extends FreeDrawOutline {
+  newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) {
+    return new FreeHighlightOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin);
+  }
+}
+
+;// ./src/display/editor/highlight.js
+
+
+
+
+
+
+
+class HighlightEditor extends AnnotationEditor {
+  #anchorNode = null;
+  #anchorOffset = 0;
+  #boxes;
+  #clipPathId = null;
+  #colorPicker = null;
+  #focusOutlines = null;
+  #focusNode = null;
+  #focusOffset = 0;
+  #highlightDiv = null;
+  #highlightOutlines = null;
+  #id = null;
+  #isFreeHighlight = false;
+  #firstPoint = null;
+  #lastPoint = null;
+  #outlineId = null;
+  #text = "";
+  #thickness;
+  #methodOfCreation = "";
+  static _defaultColor = null;
+  static _defaultOpacity = 1;
+  static _defaultThickness = 12;
+  static _type = "highlight";
+  static _editorType = AnnotationEditorType.HIGHLIGHT;
+  static _freeHighlightId = -1;
+  static _freeHighlight = null;
+  static _freeHighlightClipId = "";
+  static get _keyboardManager() {
+    const proto = HighlightEditor.prototype;
+    return shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft"], proto._moveCaret, {
+      args: [0]
+    }], [["ArrowRight"], proto._moveCaret, {
+      args: [1]
+    }], [["ArrowUp"], proto._moveCaret, {
+      args: [2]
+    }], [["ArrowDown"], proto._moveCaret, {
+      args: [3]
+    }]]));
+  }
+  constructor(params) {
+    super({
+      ...params,
+      name: "highlightEditor"
+    });
+    this.color = params.color || HighlightEditor._defaultColor;
+    this.#thickness = params.thickness || HighlightEditor._defaultThickness;
+    this.opacity = params.opacity || HighlightEditor._defaultOpacity;
+    this.#boxes = params.boxes || null;
+    this.#methodOfCreation = params.methodOfCreation || "";
+    this.#text = params.text || "";
+    this._isDraggable = false;
+    this.defaultL10nId = "pdfjs-editor-highlight-editor";
+    if (params.highlightId > -1) {
+      this.#isFreeHighlight = true;
+      this.#createFreeOutlines(params);
+      this.#addToDrawLayer();
+    } else if (this.#boxes) {
+      this.#anchorNode = params.anchorNode;
+      this.#anchorOffset = params.anchorOffset;
+      this.#focusNode = params.focusNode;
+      this.#focusOffset = params.focusOffset;
+      this.#createOutlines();
+      this.#addToDrawLayer();
+      this.rotate(this.rotation);
+    }
+    if (!this.annotationElementId) {
+      this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.highlight);
+    }
+  }
+  get telemetryInitialData() {
+    return {
+      action: "added",
+      type: this.#isFreeHighlight ? "free_highlight" : "highlight",
+      color: this._uiManager.getNonHCMColorName(this.color),
+      thickness: this.#thickness,
+      methodOfCreation: this.#methodOfCreation
+    };
+  }
+  get telemetryFinalData() {
+    return {
+      type: "highlight",
+      color: this._uiManager.getNonHCMColorName(this.color)
+    };
+  }
+  static computeTelemetryFinalData(data) {
+    return {
+      numberOfColors: data.get("color").size
+    };
+  }
+  #createOutlines() {
+    const outliner = new HighlightOutliner(this.#boxes, 0.001);
+    this.#highlightOutlines = outliner.getOutlines();
+    [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box;
+    const outlinerForOutline = new HighlightOutliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === "ltr");
+    this.#focusOutlines = outlinerForOutline.getOutlines();
+    const {
+      firstPoint
+    } = this.#highlightOutlines;
+    this.#firstPoint = [(firstPoint[0] - this.x) / this.width, (firstPoint[1] - this.y) / this.height];
+    const {
+      lastPoint
+    } = this.#focusOutlines;
+    this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height];
+  }
+  #createFreeOutlines({
+    highlightOutlines,
+    highlightId,
+    clipPathId
+  }) {
+    this.#highlightOutlines = highlightOutlines;
+    const extraThickness = 1.5;
+    this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025);
+    if (highlightId >= 0) {
+      this.#id = highlightId;
+      this.#clipPathId = clipPathId;
+      this.parent.drawLayer.finalizeDraw(highlightId, {
+        bbox: highlightOutlines.box,
+        path: {
+          d: highlightOutlines.toSVGPath()
+        }
+      });
+      this.#outlineId = this.parent.drawLayer.drawOutline({
+        rootClass: {
+          highlightOutline: true,
+          free: true
+        },
+        bbox: this.#focusOutlines.box,
+        path: {
+          d: this.#focusOutlines.toSVGPath()
+        }
+      }, true);
+    } else if (this.parent) {
+      const angle = this.parent.viewport.rotation;
+      this.parent.drawLayer.updateProperties(this.#id, {
+        bbox: HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360),
+        path: {
+          d: highlightOutlines.toSVGPath()
+        }
+      });
+      this.parent.drawLayer.updateProperties(this.#outlineId, {
+        bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle),
+        path: {
+          d: this.#focusOutlines.toSVGPath()
+        }
+      });
+    }
+    const [x, y, width, height] = highlightOutlines.box;
+    switch (this.rotation) {
+      case 0:
+        this.x = x;
+        this.y = y;
+        this.width = width;
+        this.height = height;
+        break;
+      case 90:
+        {
+          const [pageWidth, pageHeight] = this.parentDimensions;
+          this.x = y;
+          this.y = 1 - x;
+          this.width = width * pageHeight / pageWidth;
+          this.height = height * pageWidth / pageHeight;
+          break;
+        }
+      case 180:
+        this.x = 1 - x;
+        this.y = 1 - y;
+        this.width = width;
+        this.height = height;
+        break;
+      case 270:
+        {
+          const [pageWidth, pageHeight] = this.parentDimensions;
+          this.x = 1 - y;
+          this.y = x;
+          this.width = width * pageHeight / pageWidth;
+          this.height = height * pageWidth / pageHeight;
+          break;
+        }
+    }
+    const {
+      firstPoint
+    } = highlightOutlines;
+    this.#firstPoint = [(firstPoint[0] - x) / width, (firstPoint[1] - y) / height];
+    const {
+      lastPoint
+    } = this.#focusOutlines;
+    this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height];
+  }
+  static initialize(l10n, uiManager) {
+    AnnotationEditor.initialize(l10n, uiManager);
+    HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || "#fff066";
+  }
+  static updateDefaultParams(type, value) {
+    switch (type) {
+      case AnnotationEditorParamsType.HIGHLIGHT_COLOR:
+        HighlightEditor._defaultColor = value;
+        break;
+      case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:
+        HighlightEditor._defaultThickness = value;
+        break;
+    }
+  }
+  translateInPage(x, y) {}
+  get toolbarPosition() {
+    return this.#lastPoint;
+  }
+  get commentButtonPosition() {
+    return this.#firstPoint;
+  }
+  updateParams(type, value) {
+    switch (type) {
+      case AnnotationEditorParamsType.HIGHLIGHT_COLOR:
+        this.#updateColor(value);
+        break;
+      case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:
+        this.#updateThickness(value);
+        break;
+    }
+  }
+  static get defaultPropertiesToUpdate() {
+    return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]];
+  }
+  get propertiesToUpdate() {
+    return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]];
+  }
+  onUpdatedColor() {
+    this.parent?.drawLayer.updateProperties(this.#id, {
+      root: {
+        fill: this.color,
+        "fill-opacity": this.opacity
+      }
+    });
+    this.#colorPicker?.updateColor(this.color);
+    super.onUpdatedColor();
+  }
+  #updateColor(color) {
+    const setColorAndOpacity = (col, opa) => {
+      this.color = col;
+      this.opacity = opa;
+      this.onUpdatedColor();
+    };
+    const savedColor = this.color;
+    const savedOpacity = this.opacity;
+    this.addCommands({
+      cmd: setColorAndOpacity.bind(this, color, HighlightEditor._defaultOpacity),
+      undo: setColorAndOpacity.bind(this, savedColor, savedOpacity),
+      post: this._uiManager.updateUI.bind(this._uiManager, this),
+      mustExec: true,
+      type: AnnotationEditorParamsType.HIGHLIGHT_COLOR,
+      overwriteIfSameType: true,
+      keepUndo: true
+    });
+    this._reportTelemetry({
+      action: "color_changed",
+      color: this._uiManager.getNonHCMColorName(color)
+    }, true);
+  }
+  #updateThickness(thickness) {
+    const savedThickness = this.#thickness;
+    const setThickness = th => {
+      this.#thickness = th;
+      this.#changeThickness(th);
+    };
+    this.addCommands({
+      cmd: setThickness.bind(this, thickness),
+      undo: setThickness.bind(this, savedThickness),
+      post: this._uiManager.updateUI.bind(this._uiManager, this),
+      mustExec: true,
+      type: AnnotationEditorParamsType.INK_THICKNESS,
+      overwriteIfSameType: true,
+      keepUndo: true
+    });
+    this._reportTelemetry({
+      action: "thickness_changed",
+      thickness
+    }, true);
+  }
+  get toolbarButtons() {
+    if (this._uiManager.highlightColors) {
+      const colorPicker = this.#colorPicker = new ColorPicker({
+        editor: this
+      });
+      return [["colorPicker", colorPicker]];
+    }
+    return super.toolbarButtons;
+  }
+  disableEditing() {
+    super.disableEditing();
+    this.div.classList.toggle("disabled", true);
+  }
+  enableEditing() {
+    super.enableEditing();
+    this.div.classList.toggle("disabled", false);
+  }
+  fixAndSetPosition() {
+    return super.fixAndSetPosition(this.#getRotation());
+  }
+  getBaseTranslation() {
+    return [0, 0];
+  }
+  getRect(tx, ty) {
+    return super.getRect(tx, ty, this.#getRotation());
+  }
+  onceAdded(focus) {
+    if (!this.annotationElementId) {
+      this.parent.addUndoableEditor(this);
+    }
+    if (focus) {
+      this.div.focus();
+    }
+  }
+  remove() {
+    this.#cleanDrawLayer();
+    this._reportTelemetry({
+      action: "deleted"
+    });
+    super.remove();
+  }
+  rebuild() {
+    if (!this.parent) {
+      return;
+    }
+    super.rebuild();
+    if (this.div === null) {
+      return;
+    }
+    this.#addToDrawLayer();
+    if (!this.isAttachedToDOM) {
+      this.parent.add(this);
+    }
+  }
+  setParent(parent) {
+    let mustBeSelected = false;
+    if (this.parent && !parent) {
+      this.#cleanDrawLayer();
+    } else if (parent) {
+      this.#addToDrawLayer(parent);
+      mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor");
+    }
+    super.setParent(parent);
+    this.show(this._isVisible);
+    if (mustBeSelected) {
+      this.select();
+    }
+  }
+  #changeThickness(thickness) {
+    if (!this.#isFreeHighlight) {
+      return;
+    }
+    this.#createFreeOutlines({
+      highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2)
+    });
+    this.fixAndSetPosition();
+    this.setDims();
+  }
+  #cleanDrawLayer() {
+    if (this.#id === null || !this.parent) {
+      return;
+    }
+    this.parent.drawLayer.remove(this.#id);
+    this.#id = null;
+    this.parent.drawLayer.remove(this.#outlineId);
+    this.#outlineId = null;
+  }
+  #addToDrawLayer(parent = this.parent) {
+    if (this.#id !== null) {
+      return;
+    }
+    ({
+      id: this.#id,
+      clipPathId: this.#clipPathId
+    } = parent.drawLayer.draw({
+      bbox: this.#highlightOutlines.box,
+      root: {
+        viewBox: "0 0 1 1",
+        fill: this.color,
+        "fill-opacity": this.opacity
+      },
+      rootClass: {
+        highlight: true,
+        free: this.#isFreeHighlight
+      },
+      path: {
+        d: this.#highlightOutlines.toSVGPath()
+      }
+    }, false, true));
+    this.#outlineId = parent.drawLayer.drawOutline({
+      rootClass: {
+        highlightOutline: true,
+        free: this.#isFreeHighlight
+      },
+      bbox: this.#focusOutlines.box,
+      path: {
+        d: this.#focusOutlines.toSVGPath()
+      }
+    }, this.#isFreeHighlight);
+    if (this.#highlightDiv) {
+      this.#highlightDiv.style.clipPath = this.#clipPathId;
+    }
+  }
+  static #rotateBbox([x, y, width, height], angle) {
+    switch (angle) {
+      case 90:
+        return [1 - y - height, x, height, width];
+      case 180:
+        return [1 - x - width, 1 - y - height, width, height];
+      case 270:
+        return [y, 1 - x - width, height, width];
+    }
+    return [x, y, width, height];
+  }
+  rotate(angle) {
+    const {
+      drawLayer
+    } = this.parent;
+    let box;
+    if (this.#isFreeHighlight) {
+      angle = (angle - this.rotation + 360) % 360;
+      box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle);
+    } else {
+      box = HighlightEditor.#rotateBbox([this.x, this.y, this.width, this.height], angle);
+    }
+    drawLayer.updateProperties(this.#id, {
+      bbox: box,
+      root: {
+        "data-main-rotation": angle
+      }
+    });
+    drawLayer.updateProperties(this.#outlineId, {
+      bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle),
+      root: {
+        "data-main-rotation": angle
+      }
+    });
+  }
+  render() {
+    if (this.div) {
+      return this.div;
+    }
+    const div = super.render();
+    if (this.#text) {
+      div.setAttribute("aria-label", this.#text);
+      div.setAttribute("role", "mark");
+    }
+    if (this.#isFreeHighlight) {
+      div.classList.add("free");
+    } else {
+      this.div.addEventListener("keydown", this.#keydown.bind(this), {
+        signal: this._uiManager._signal
+      });
+    }
+    const highlightDiv = this.#highlightDiv = document.createElement("div");
+    div.append(highlightDiv);
+    highlightDiv.setAttribute("aria-hidden", "true");
+    highlightDiv.className = "internal";
+    highlightDiv.style.clipPath = this.#clipPathId;
+    this.setDims();
+    bindEvents(this, this.#highlightDiv, ["pointerover", "pointerleave"]);
+    this.enableEditing();
+    return div;
+  }
+  pointerover() {
+    if (!this.isSelected) {
+      this.parent?.drawLayer.updateProperties(this.#outlineId, {
+        rootClass: {
+          hovered: true
+        }
+      });
+    }
+  }
+  pointerleave() {
+    if (!this.isSelected) {
+      this.parent?.drawLayer.updateProperties(this.#outlineId, {
+        rootClass: {
+          hovered: false
+        }
+      });
+    }
+  }
+  #keydown(event) {
+    HighlightEditor._keyboardManager.exec(this, event);
+  }
+  _moveCaret(direction) {
+    this.parent.unselect(this);
+    switch (direction) {
+      case 0:
+      case 2:
+        this.#setCaret(true);
+        break;
+      case 1:
+      case 3:
+        this.#setCaret(false);
+        break;
+    }
+  }
+  #setCaret(start) {
+    if (!this.#anchorNode) {
+      return;
+    }
+    const selection = window.getSelection();
+    if (start) {
+      selection.setPosition(this.#anchorNode, this.#anchorOffset);
+    } else {
+      selection.setPosition(this.#focusNode, this.#focusOffset);
+    }
+  }
+  select() {
+    super.select();
+    if (!this.#outlineId) {
+      return;
+    }
+    this.parent?.drawLayer.updateProperties(this.#outlineId, {
+      rootClass: {
+        hovered: false,
+        selected: true
+      }
+    });
+  }
+  unselect() {
+    super.unselect();
+    if (!this.#outlineId) {
+      return;
+    }
+    this.parent?.drawLayer.updateProperties(this.#outlineId, {
+      rootClass: {
+        selected: false
+      }
+    });
+    if (!this.#isFreeHighlight) {
+      this.#setCaret(false);
+    }
+  }
+  get _mustFixPosition() {
+    return !this.#isFreeHighlight;
+  }
+  show(visible = this._isVisible) {
+    super.show(visible);
+    if (this.parent) {
+      this.parent.drawLayer.updateProperties(this.#id, {
+        rootClass: {
+          hidden: !visible
+        }
+      });
+      this.parent.drawLayer.updateProperties(this.#outlineId, {
+        rootClass: {
+          hidden: !visible
+        }
+      });
+    }
+  }
+  #getRotation() {
+    return this.#isFreeHighlight ? this.rotation : 0;
+  }
+  #serializeBoxes() {
+    if (this.#isFreeHighlight) {
+      return null;
+    }
+    const [pageWidth, pageHeight] = this.pageDimensions;
+    const [pageX, pageY] = this.pageTranslation;
+    const boxes = this.#boxes;
+    const quadPoints = new Float32Array(boxes.length * 8);
+    let i = 0;
+    for (const {
+      x,
+      y,
+      width,
+      height
+    } of boxes) {
+      const sx = x * pageWidth + pageX;
+      const sy = (1 - y) * pageHeight + pageY;
+      quadPoints[i] = quadPoints[i + 4] = sx;
+      quadPoints[i + 1] = quadPoints[i + 3] = sy;
+      quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth;
+      quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight;
+      i += 8;
+    }
+    return quadPoints;
+  }
+  #serializeOutlines(rect) {
+    return this.#highlightOutlines.serialize(rect, this.#getRotation());
+  }
+  static startHighlighting(parent, isLTR, {
+    target: textLayer,
+    x,
+    y
+  }) {
+    const {
+      x: layerX,
+      y: layerY,
+      width: parentWidth,
+      height: parentHeight
+    } = textLayer.getBoundingClientRect();
+    const ac = new AbortController();
+    const signal = parent.combinedSignal(ac);
+    const pointerUpCallback = e => {
+      ac.abort();
+      this.#endHighlight(parent, e);
+    };
+    window.addEventListener("blur", pointerUpCallback, {
+      signal
+    });
+    window.addEventListener("pointerup", pointerUpCallback, {
+      signal
+    });
+    window.addEventListener("pointerdown", stopEvent, {
+      capture: true,
+      passive: false,
+      signal
+    });
+    window.addEventListener("contextmenu", noContextMenu, {
+      signal
+    });
+    textLayer.addEventListener("pointermove", this.#highlightMove.bind(this, parent), {
+      signal
+    });
+    this._freeHighlight = new FreeHighlightOutliner({
+      x,
+      y
+    }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001);
+    ({
+      id: this._freeHighlightId,
+      clipPathId: this._freeHighlightClipId
+    } = parent.drawLayer.draw({
+      bbox: [0, 0, 1, 1],
+      root: {
+        viewBox: "0 0 1 1",
+        fill: this._defaultColor,
+        "fill-opacity": this._defaultOpacity
+      },
+      rootClass: {
+        highlight: true,
+        free: true
+      },
+      path: {
+        d: this._freeHighlight.toSVGPath()
+      }
+    }, true, true));
+  }
+  static #highlightMove(parent, event) {
+    if (this._freeHighlight.add(event)) {
+      parent.drawLayer.updateProperties(this._freeHighlightId, {
+        path: {
+          d: this._freeHighlight.toSVGPath()
+        }
+      });
+    }
+  }
+  static #endHighlight(parent, event) {
+    if (!this._freeHighlight.isEmpty()) {
+      parent.createAndAddNewEditor(event, false, {
+        highlightId: this._freeHighlightId,
+        highlightOutlines: this._freeHighlight.getOutlines(),
+        clipPathId: this._freeHighlightClipId,
+        methodOfCreation: "main_toolbar"
+      });
+    } else {
+      parent.drawLayer.remove(this._freeHighlightId);
+    }
+    this._freeHighlightId = -1;
+    this._freeHighlight = null;
+    this._freeHighlightClipId = "";
+  }
+  static async deserialize(data, parent, uiManager) {
+    let initialData = null;
+    if (data instanceof HighlightAnnotationElement) {
+      const {
+        data: {
+          quadPoints,
+          rect,
+          rotation,
+          id,
+          color,
+          opacity,
+          popupRef,
+          richText,
+          contentsObj,
+          creationDate,
+          modificationDate
+        },
+        parent: {
+          page: {
+            pageNumber
+          }
+        }
+      } = data;
+      initialData = data = {
+        annotationType: AnnotationEditorType.HIGHLIGHT,
+        color: Array.from(color),
+        opacity,
+        quadPoints,
+        boxes: null,
+        pageIndex: pageNumber - 1,
+        rect: rect.slice(0),
+        rotation,
+        annotationElementId: id,
+        id,
+        deleted: false,
+        popupRef,
+        richText,
+        comment: contentsObj?.str || null,
+        creationDate,
+        modificationDate
+      };
+    } else if (data instanceof InkAnnotationElement) {
+      const {
+        data: {
+          inkLists,
+          rect,
+          rotation,
+          id,
+          color,
+          borderStyle: {
+            rawWidth: thickness
+          },
+          popupRef,
+          richText,
+          contentsObj,
+          creationDate,
+          modificationDate
+        },
+        parent: {
+          page: {
+            pageNumber
+          }
+        }
+      } = data;
+      initialData = data = {
+        annotationType: AnnotationEditorType.HIGHLIGHT,
+        color: Array.from(color),
+        thickness,
+        inkLists,
+        boxes: null,
+        pageIndex: pageNumber - 1,
+        rect: rect.slice(0),
+        rotation,
+        annotationElementId: id,
+        id,
+        deleted: false,
+        popupRef,
+        richText,
+        comment: contentsObj?.str || null,
+        creationDate,
+        modificationDate
+      };
+    }
+    const {
+      color,
+      quadPoints,
+      inkLists,
+      outlines,
+      opacity
+    } = data;
+    const editor = await super.deserialize(data, parent, uiManager);
+    editor.color = Util.makeHexColor(...color);
+    editor.opacity = opacity || 1;
+    if (inkLists) {
+      editor.#thickness = data.thickness;
+    }
+    editor._initialData = initialData;
+    if (data.comment) {
+      editor.setCommentData(data);
+    }
+    const [pageWidth, pageHeight] = editor.pageDimensions;
+    const [pageX, pageY] = editor.pageTranslation;
+    if (quadPoints) {
+      const boxes = editor.#boxes = [];
+      for (let i = 0; i < quadPoints.length; i += 8) {
+        boxes.push({
+          x: (quadPoints[i] - pageX) / pageWidth,
+          y: 1 - (quadPoints[i + 1] - pageY) / pageHeight,
+          width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth,
+          height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight
+        });
+      }
+      editor.#createOutlines();
+      editor.#addToDrawLayer();
+      editor.rotate(editor.rotation);
+    } else if (inkLists || outlines) {
+      editor.#isFreeHighlight = true;
+      const points = (inkLists || outlines.points)[0];
+      const point = {
+        x: points[0] - pageX,
+        y: pageHeight - (points[1] - pageY)
+      };
+      const outliner = new FreeHighlightOutliner(point, [0, 0, pageWidth, pageHeight], 1, editor.#thickness / 2, true, 0.001);
+      for (let i = 0, ii = points.length; i < ii; i += 2) {
+        point.x = points[i] - pageX;
+        point.y = pageHeight - (points[i + 1] - pageY);
+        outliner.add(point);
+      }
+      const {
+        id,
+        clipPathId
+      } = parent.drawLayer.draw({
+        bbox: [0, 0, 1, 1],
+        root: {
+          viewBox: "0 0 1 1",
+          fill: editor.color,
+          "fill-opacity": editor._defaultOpacity
+        },
+        rootClass: {
+          highlight: true,
+          free: true
+        },
+        path: {
+          d: outliner.toSVGPath()
+        }
+      }, true, true);
+      editor.#createFreeOutlines({
+        highlightOutlines: outliner.getOutlines(),
+        highlightId: id,
+        clipPathId
+      });
+      editor.#addToDrawLayer();
+      editor.rotate(editor.parentRotation);
+    }
+    return editor;
+  }
+  serialize(isForCopying = false) {
+    if (this.isEmpty() || isForCopying) {
+      return null;
+    }
+    if (this.deleted) {
+      return this.serializeDeleted();
+    }
+    const color = AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color));
+    const serialized = super.serialize(isForCopying);
+    Object.assign(serialized, {
+      color,
+      opacity: this.opacity,
+      thickness: this.#thickness,
+      quadPoints: this.#serializeBoxes(),
+      outlines: this.#serializeOutlines(serialized.rect)
+    });
+    this.addComment(serialized);
+    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {
+      return null;
+    }
+    serialized.id = this.annotationElementId;
+    return serialized;
+  }
+  #hasElementChanged(serialized) {
+    const {
+      color
+    } = this._initialData;
+    return this.hasEditedComment || serialized.color.some((c, i) => c !== color[i]);
+  }
+  renderAnnotationElement(annotation) {
+    if (this.deleted) {
+      annotation.hide();
+      return null;
+    }
+    annotation.updateEdited({
+      rect: this.getPDFRect(),
+      popup: this.comment
+    });
+    return null;
+  }
+  static canCreateNewEmptyEditor() {
+    return false;
+  }
+}
+
+;// ./src/display/editor/draw.js
+
+
+
+
+class DrawingOptions {
+  #svgProperties = Object.create(null);
+  updateProperty(name, value) {
+    this[name] = value;
+    this.updateSVGProperty(name, value);
+  }
+  updateProperties(properties) {
+    if (!properties) {
+      return;
+    }
+    for (const [name, value] of Object.entries(properties)) {
+      if (!name.startsWith("_")) {
+        this.updateProperty(name, value);
+      }
+    }
+  }
+  updateSVGProperty(name, value) {
+    this.#svgProperties[name] = value;
+  }
+  toSVGProperties() {
+    const root = this.#svgProperties;
+    this.#svgProperties = Object.create(null);
+    return {
+      root
+    };
+  }
+  reset() {
+    this.#svgProperties = Object.create(null);
+  }
+  updateAll(options = this) {
+    this.updateProperties(options);
+  }
+  clone() {
+    unreachable("Not implemented");
+  }
+}
+class DrawingEditor extends AnnotationEditor {
+  #drawOutlines = null;
+  #mustBeCommitted;
+  _colorPicker = null;
+  _drawId = null;
+  static _currentDrawId = -1;
+  static _currentParent = null;
+  static #currentDraw = null;
+  static #currentDrawingAC = null;
+  static #currentDrawingOptions = null;
+  static _INNER_MARGIN = 3;
+  constructor(params) {
+    super(params);
+    this.#mustBeCommitted = params.mustBeCommitted || false;
+    this._addOutlines(params);
+  }
+  onUpdatedColor() {
+    this._colorPicker?.update(this.color);
+    super.onUpdatedColor();
+  }
+  onUpdatedOpacity() {
+    this._colorPicker?.updateOpacity?.(this.opacity);
+  }
+  _addOutlines(params) {
+    if (params.drawOutlines) {
+      this.#createDrawOutlines(params);
+      this.#addToDrawLayer();
+    }
+  }
+  #createDrawOutlines({
+    drawOutlines,
+    drawId,
+    drawingOptions
+  }) {
+    this.#drawOutlines = drawOutlines;
+    this._drawingOptions ||= drawingOptions;
+    if (!this.annotationElementId) {
+      this._uiManager.a11yAlert(AnnotationEditor._l10nAlert[this.editorType]);
+    }
+    if (drawId >= 0) {
+      this._drawId = drawId;
+      this.parent.drawLayer.finalizeDraw(drawId, drawOutlines.defaultProperties);
+    } else {
+      this._drawId = this.#createDrawing(drawOutlines, this.parent);
+    }
+    this.#updateBbox(drawOutlines.box);
+  }
+  #createDrawing(drawOutlines, parent) {
+    const {
+      id
+    } = parent.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(), drawOutlines.defaultSVGProperties), false, false);
+    return id;
+  }
+  static _mergeSVGProperties(p1, p2) {
+    const p1Keys = new Set(Object.keys(p1));
+    for (const [key, value] of Object.entries(p2)) {
+      if (p1Keys.has(key)) {
+        Object.assign(p1[key], value);
+      } else {
+        p1[key] = value;
+      }
+    }
+    return p1;
+  }
+  static getDefaultDrawingOptions(_options) {
+    unreachable("Not implemented");
+  }
+  static get typesMap() {
+    unreachable("Not implemented");
+  }
+  static get isDrawer() {
+    return true;
+  }
+  static get supportMultipleDrawings() {
+    return false;
+  }
+  static updateDefaultParams(type, value) {
+    const propertyName = this.typesMap.get(type);
+    if (propertyName) {
+      this._defaultDrawingOptions.updateProperty(propertyName, value);
+    }
+    if (this._currentParent) {
+      DrawingEditor.#currentDraw.updateProperty(propertyName, value);
+      this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties());
+    }
+  }
+  updateParams(type, value) {
+    const propertyName = this.constructor.typesMap.get(type);
+    if (propertyName) {
+      this._updateProperty(type, propertyName, value);
+    }
+  }
+  static get defaultPropertiesToUpdate() {
+    const properties = [];
+    const options = this._defaultDrawingOptions;
+    for (const [type, name] of this.typesMap) {
+      properties.push([type, options[name]]);
+    }
+    return properties;
+  }
+  get propertiesToUpdate() {
+    const properties = [];
+    const {
+      _drawingOptions
+    } = this;
+    for (const [type, name] of this.constructor.typesMap) {
+      properties.push([type, _drawingOptions[name]]);
+    }
+    return properties;
+  }
+  _updateProperty(type, name, value) {
+    const options = this._drawingOptions;
+    const savedValue = options[name];
+    const setter = val => {
+      options.updateProperty(name, val);
+      const bbox = this.#drawOutlines.updateProperty(name, val);
+      if (bbox) {
+        this.#updateBbox(bbox);
+      }
+      this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties());
+      if (type === this.colorType) {
+        this.onUpdatedColor();
+      } else if (type === this.opacityType) {
+        this.onUpdatedOpacity();
+      }
+    };
+    this.addCommands({
+      cmd: setter.bind(this, value),
+      undo: setter.bind(this, savedValue),
+      post: this._uiManager.updateUI.bind(this._uiManager, this),
+      mustExec: true,
+      type,
+      overwriteIfSameType: true,
+      keepUndo: true
+    });
+  }
+  _updateColorAndOpacity(color, opacity) {
+    const colorName = this.constructor.typesMap.get(this.colorType);
+    const opacityName = this.constructor.typesMap.get(this.opacityType);
+    const options = this._drawingOptions;
+    const savedColor = options[colorName];
+    const savedOpacity = options[opacityName];
+    const setter = (c, op) => {
+      options.updateProperty(colorName, c);
+      options.updateProperty(opacityName, op);
+      this.#drawOutlines.updateProperty(colorName, c);
+      this.#drawOutlines.updateProperty(opacityName, op);
+      this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties());
+      this.onUpdatedColor();
+      this.onUpdatedOpacity();
+    };
+    this.addCommands({
+      cmd: setter.bind(this, color, opacity),
+      undo: setter.bind(this, savedColor, savedOpacity),
+      post: this._uiManager.updateUI.bind(this._uiManager, this),
+      mustExec: true,
+      type: AnnotationEditorParamsType.INK_COLOR_AND_OPACITY,
+      overwriteIfSameType: true,
+      keepUndo: true
+    });
+  }
+  _onResizing() {
+    this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizingSVGProperties(this.#convertToDrawSpace()), {
+      bbox: this.#rotateBox()
+    }));
+  }
+  _onResized() {
+    this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizedSVGProperties(this.#convertToDrawSpace()), {
+      bbox: this.#rotateBox()
+    }));
+  }
+  _onTranslating(_x, _y) {
+    this.parent?.drawLayer.updateProperties(this._drawId, {
+      bbox: this.#rotateBox()
+    });
+  }
+  _onTranslated() {
+    this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathTranslatedSVGProperties(this.#convertToDrawSpace(), this.parentDimensions), {
+      bbox: this.#rotateBox()
+    }));
+  }
+  _onStartDragging() {
+    this.parent?.drawLayer.updateProperties(this._drawId, {
+      rootClass: {
+        moving: true
+      }
+    });
+  }
+  _onStopDragging() {
+    this.parent?.drawLayer.updateProperties(this._drawId, {
+      rootClass: {
+        moving: false
+      }
+    });
+  }
+  commit() {
+    super.commit();
+    this.disableEditMode();
+    this.disableEditing();
+  }
+  disableEditing() {
+    super.disableEditing();
+    this.div.classList.toggle("disabled", true);
+  }
+  enableEditing() {
+    super.enableEditing();
+    this.div.classList.toggle("disabled", false);
+  }
+  getBaseTranslation() {
+    return [0, 0];
+  }
+  get isResizable() {
+    return true;
+  }
+  onceAdded(focus) {
+    if (!this.annotationElementId) {
+      this.parent.addUndoableEditor(this);
+    }
+    this._isDraggable = true;
+    if (this.#mustBeCommitted) {
+      this.#mustBeCommitted = false;
+      this.commit();
+      this.parent.setSelected(this);
+      if (focus && this.isOnScreen) {
+        this.div.focus();
+      }
+    }
+  }
+  remove() {
+    this.#cleanDrawLayer();
+    super.remove();
+  }
+  rebuild() {
+    if (!this.parent) {
+      return;
+    }
+    super.rebuild();
+    if (this.div === null) {
+      return;
+    }
+    this.#addToDrawLayer();
+    this.#updateBbox(this.#drawOutlines.box);
+    if (!this.isAttachedToDOM) {
+      this.parent.add(this);
+    }
+  }
+  setParent(parent) {
+    let mustBeSelected = false;
+    if (this.parent && !parent) {
+      this._uiManager.removeShouldRescale(this);
+      this.#cleanDrawLayer();
+    } else if (parent) {
+      this._uiManager.addShouldRescale(this);
+      this.#addToDrawLayer(parent);
+      mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor");
+    }
+    super.setParent(parent);
+    if (mustBeSelected) {
+      this.select();
+    }
+  }
+  #cleanDrawLayer() {
+    if (this._drawId === null || !this.parent) {
+      return;
+    }
+    this.parent.drawLayer.remove(this._drawId);
+    this._drawId = null;
+    this._drawingOptions.reset();
+  }
+  #addToDrawLayer(parent = this.parent) {
+    if (this._drawId !== null && this.parent === parent) {
+      return;
+    }
+    if (this._drawId !== null) {
+      this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer);
+      return;
+    }
+    this._drawingOptions.updateAll();
+    this._drawId = this.#createDrawing(this.#drawOutlines, parent);
+  }
+  #convertToParentSpace([x, y, width, height]) {
+    const {
+      parentDimensions: [pW, pH],
+      rotation
+    } = this;
+    switch (rotation) {
+      case 90:
+        return [y, 1 - x, width * (pH / pW), height * (pW / pH)];
+      case 180:
+        return [1 - x, 1 - y, width, height];
+      case 270:
+        return [1 - y, x, width * (pH / pW), height * (pW / pH)];
+      default:
+        return [x, y, width, height];
+    }
+  }
+  #convertToDrawSpace() {
+    const {
+      x,
+      y,
+      width,
+      height,
+      parentDimensions: [pW, pH],
+      rotation
+    } = this;
+    switch (rotation) {
+      case 90:
+        return [1 - y, x, width * (pW / pH), height * (pH / pW)];
+      case 180:
+        return [1 - x, 1 - y, width, height];
+      case 270:
+        return [y, 1 - x, width * (pW / pH), height * (pH / pW)];
+      default:
+        return [x, y, width, height];
+    }
+  }
+  #updateBbox(bbox) {
+    [this.x, this.y, this.width, this.height] = this.#convertToParentSpace(bbox);
+    if (this.div) {
+      this.fixAndSetPosition();
+      this.setDims();
+    }
+    this._onResized();
+  }
+  #rotateBox() {
+    const {
+      x,
+      y,
+      width,
+      height,
+      rotation,
+      parentRotation,
+      parentDimensions: [pW, pH]
+    } = this;
+    switch ((rotation * 4 + parentRotation) / 90) {
+      case 1:
+        return [1 - y - height, x, height, width];
+      case 2:
+        return [1 - x - width, 1 - y - height, width, height];
+      case 3:
+        return [y, 1 - x - width, height, width];
+      case 4:
+        return [x, y - width * (pW / pH), height * (pH / pW), width * (pW / pH)];
+      case 5:
+        return [1 - y, x, width * (pW / pH), height * (pH / pW)];
+      case 6:
+        return [1 - x - height * (pH / pW), 1 - y, height * (pH / pW), width * (pW / pH)];
+      case 7:
+        return [y - width * (pW / pH), 1 - x - height * (pH / pW), width * (pW / pH), height * (pH / pW)];
+      case 8:
+        return [x - width, y - height, width, height];
+      case 9:
+        return [1 - y, x - width, height, width];
+      case 10:
+        return [1 - x, 1 - y, width, height];
+      case 11:
+        return [y - height, 1 - x, height, width];
+      case 12:
+        return [x - height * (pH / pW), y, height * (pH / pW), width * (pW / pH)];
+      case 13:
+        return [1 - y - width * (pW / pH), x - height * (pH / pW), width * (pW / pH), height * (pH / pW)];
+      case 14:
+        return [1 - x, 1 - y - width * (pW / pH), height * (pH / pW), width * (pW / pH)];
+      case 15:
+        return [y, 1 - x, width * (pW / pH), height * (pH / pW)];
+      default:
+        return [x, y, width, height];
+    }
+  }
+  rotate() {
+    if (!this.parent) {
+      return;
+    }
+    this.parent.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties({
+      bbox: this.#rotateBox()
+    }, this.#drawOutlines.updateRotation((this.parentRotation - this.rotation + 360) % 360)));
+  }
+  onScaleChanging() {
+    if (!this.parent) {
+      return;
+    }
+    this.#updateBbox(this.#drawOutlines.updateParentDimensions(this.parentDimensions, this.parent.scale));
+  }
+  static onScaleChangingWhenDrawing() {}
+  render() {
+    if (this.div) {
+      return this.div;
+    }
+    let baseX, baseY;
+    if (this._isCopy) {
+      baseX = this.x;
+      baseY = this.y;
+    }
+    const div = super.render();
+    div.classList.add("draw");
+    const drawDiv = document.createElement("div");
+    div.append(drawDiv);
+    drawDiv.setAttribute("aria-hidden", "true");
+    drawDiv.className = "internal";
+    this.setDims();
+    this._uiManager.addShouldRescale(this);
+    this.disableEditing();
+    if (this._isCopy) {
+      this._moveAfterPaste(baseX, baseY);
+    }
+    return div;
+  }
+  static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) {
+    unreachable("Not implemented");
+  }
+  static startDrawing(parent, uiManager, _isLTR, event) {
+    const {
+      target,
+      offsetX: x,
+      offsetY: y,
+      pointerId,
+      pointerType
+    } = event;
+    if (CurrentPointers.isInitializedAndDifferentPointerType(pointerType)) {
+      return;
+    }
+    const {
+      viewport: {
+        rotation
+      }
+    } = parent;
+    const {
+      width: parentWidth,
+      height: parentHeight
+    } = target.getBoundingClientRect();
+    const ac = DrawingEditor.#currentDrawingAC = new AbortController();
+    const signal = parent.combinedSignal(ac);
+    CurrentPointers.setPointer(pointerType, pointerId);
+    window.addEventListener("pointerup", e => {
+      if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) {
+        this._endDraw(e);
+      }
+    }, {
+      signal
+    });
+    window.addEventListener("pointercancel", e => {
+      if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) {
+        this._currentParent.endDrawingSession();
+      }
+    }, {
+      signal
+    });
+    window.addEventListener("pointerdown", e => {
+      if (!CurrentPointers.isSamePointerType(e.pointerType)) {
+        return;
+      }
+      CurrentPointers.initializeAndAddPointerId(e.pointerId);
+      if (DrawingEditor.#currentDraw.isCancellable()) {
+        DrawingEditor.#currentDraw.removeLastElement();
+        if (DrawingEditor.#currentDraw.isEmpty()) {
+          this._currentParent.endDrawingSession(true);
+        } else {
+          this._endDraw(null);
+        }
+      }
+    }, {
+      capture: true,
+      passive: false,
+      signal
+    });
+    window.addEventListener("contextmenu", noContextMenu, {
+      signal
+    });
+    target.addEventListener("pointermove", this._drawMove.bind(this), {
+      signal
+    });
+    target.addEventListener("touchmove", e => {
+      if (CurrentPointers.isSameTimeStamp(e.timeStamp)) {
+        stopEvent(e);
+      }
+    }, {
+      signal
+    });
+    parent.toggleDrawing();
+    uiManager._editorUndoBar?.hide();
+    if (DrawingEditor.#currentDraw) {
+      parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.startNew(x, y, parentWidth, parentHeight, rotation));
+      return;
+    }
+    uiManager.updateUIForDefaultProperties(this);
+    DrawingEditor.#currentDraw = this.createDrawerInstance(x, y, parentWidth, parentHeight, rotation);
+    DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions();
+    this._currentParent = parent;
+    ({
+      id: this._currentDrawId
+    } = parent.drawLayer.draw(this._mergeSVGProperties(DrawingEditor.#currentDrawingOptions.toSVGProperties(), DrawingEditor.#currentDraw.defaultSVGProperties), true, false));
+  }
+  static _drawMove(event) {
+    CurrentPointers.isSameTimeStamp(event.timeStamp);
+    if (!DrawingEditor.#currentDraw) {
+      return;
+    }
+    const {
+      offsetX,
+      offsetY,
+      pointerId
+    } = event;
+    if (!CurrentPointers.isSamePointerId(pointerId)) {
+      return;
+    }
+    if (CurrentPointers.isUsingMultiplePointers()) {
+      this._endDraw(event);
+      return;
+    }
+    this._currentParent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.add(offsetX, offsetY));
+    CurrentPointers.setTimeStamp(event.timeStamp);
+    stopEvent(event);
+  }
+  static _cleanup(all) {
+    if (all) {
+      this._currentDrawId = -1;
+      this._currentParent = null;
+      DrawingEditor.#currentDraw = null;
+      DrawingEditor.#currentDrawingOptions = null;
+      CurrentPointers.clearTimeStamp();
+    }
+    if (DrawingEditor.#currentDrawingAC) {
+      DrawingEditor.#currentDrawingAC.abort();
+      DrawingEditor.#currentDrawingAC = null;
+      CurrentPointers.clearPointerIds();
+    }
+  }
+  static _endDraw(event) {
+    const parent = this._currentParent;
+    if (!parent) {
+      return;
+    }
+    parent.toggleDrawing(true);
+    this._cleanup(false);
+    if (event?.target === parent.div) {
+      parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.end(event.offsetX, event.offsetY));
+    }
+    if (this.supportMultipleDrawings) {
+      const draw = DrawingEditor.#currentDraw;
+      const drawId = this._currentDrawId;
+      const lastElement = draw.getLastElement();
+      parent.addCommands({
+        cmd: () => {
+          parent.drawLayer.updateProperties(drawId, draw.setLastElement(lastElement));
+        },
+        undo: () => {
+          parent.drawLayer.updateProperties(drawId, draw.removeLastElement());
+        },
+        mustExec: false,
+        type: AnnotationEditorParamsType.DRAW_STEP
+      });
+      return;
+    }
+    this.endDrawing(false);
+  }
+  static endDrawing(isAborted) {
+    const parent = this._currentParent;
+    if (!parent) {
+      return null;
+    }
+    parent.toggleDrawing(true);
+    parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP);
+    if (!DrawingEditor.#currentDraw.isEmpty()) {
+      const {
+        pageDimensions: [pageWidth, pageHeight],
+        scale
+      } = parent;
+      const editor = parent.createAndAddNewEditor({
+        offsetX: 0,
+        offsetY: 0
+      }, false, {
+        drawId: this._currentDrawId,
+        drawOutlines: DrawingEditor.#currentDraw.getOutlines(pageWidth * scale, pageHeight * scale, scale, this._INNER_MARGIN),
+        drawingOptions: DrawingEditor.#currentDrawingOptions,
+        mustBeCommitted: !isAborted
+      });
+      this._cleanup(true);
+      return editor;
+    }
+    parent.drawLayer.remove(this._currentDrawId);
+    this._cleanup(true);
+    return null;
+  }
+  createDrawingOptions(_data) {}
+  static deserializeDraw(_pageX, _pageY, _pageWidth, _pageHeight, _innerWidth, _data) {
+    unreachable("Not implemented");
+  }
+  static async deserialize(data, parent, uiManager) {
+    const {
+      rawDims: {
+        pageWidth,
+        pageHeight,
+        pageX,
+        pageY
+      }
+    } = parent.viewport;
+    const drawOutlines = this.deserializeDraw(pageX, pageY, pageWidth, pageHeight, this._INNER_MARGIN, data);
+    const editor = await super.deserialize(data, parent, uiManager);
+    editor.createDrawingOptions(data);
+    editor.#createDrawOutlines({
+      drawOutlines
+    });
+    editor.#addToDrawLayer();
+    editor.onScaleChanging();
+    editor.rotate();
+    return editor;
+  }
+  serializeDraw(isForCopying) {
+    const [pageX, pageY] = this.pageTranslation;
+    const [pageWidth, pageHeight] = this.pageDimensions;
+    return this.#drawOutlines.serialize([pageX, pageY, pageWidth, pageHeight], isForCopying);
+  }
+  renderAnnotationElement(annotation) {
+    annotation.updateEdited({
+      rect: this.getPDFRect()
+    });
+    return null;
+  }
+  static canCreateNewEmptyEditor() {
+    return false;
+  }
+}
+
+;// ./src/display/editor/drawers/inkdraw.js
+
+
+
+class InkDrawOutliner {
+  #last = new Float64Array(6);
+  #line;
+  #lines;
+  #rotation;
+  #thickness;
+  #points;
+  #lastSVGPath = "";
+  #lastIndex = 0;
+  #outlines = new InkDrawOutline();
+  #parentWidth;
+  #parentHeight;
+  constructor(x, y, parentWidth, parentHeight, rotation, thickness) {
+    this.#parentWidth = parentWidth;
+    this.#parentHeight = parentHeight;
+    this.#rotation = rotation;
+    this.#thickness = thickness;
+    [x, y] = this.#normalizePoint(x, y);
+    const line = this.#line = [NaN, NaN, NaN, NaN, x, y];
+    this.#points = [x, y];
+    this.#lines = [{
+      line,
+      points: this.#points
+    }];
+    this.#last.set(line, 0);
+  }
+  updateProperty(name, value) {
+    if (name === "stroke-width") {
+      this.#thickness = value;
+    }
+  }
+  #normalizePoint(x, y) {
+    return Outline._normalizePoint(x, y, this.#parentWidth, this.#parentHeight, this.#rotation);
+  }
+  isEmpty() {
+    return !this.#lines?.length;
+  }
+  isCancellable() {
+    return this.#points.length <= 10;
+  }
+  add(x, y) {
+    [x, y] = this.#normalizePoint(x, y);
+    const [x1, y1, x2, y2] = this.#last.subarray(2, 6);
+    const diffX = x - x2;
+    const diffY = y - y2;
+    const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY);
+    if (d <= 2) {
+      return null;
+    }
+    this.#points.push(x, y);
+    if (isNaN(x1)) {
+      this.#last.set([x2, y2, x, y], 2);
+      this.#line.push(NaN, NaN, NaN, NaN, x, y);
+      return {
+        path: {
+          d: this.toSVGPath()
+        }
+      };
+    }
+    if (isNaN(this.#last[0])) {
+      this.#line.splice(6, 6);
+    }
+    this.#last.set([x1, y1, x2, y2, x, y], 0);
+    this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y));
+    return {
+      path: {
+        d: this.toSVGPath()
+      }
+    };
+  }
+  end(x, y) {
+    const change = this.add(x, y);
+    if (change) {
+      return change;
+    }
+    if (this.#points.length === 2) {
+      return {
+        path: {
+          d: this.toSVGPath()
+        }
+      };
+    }
+    return null;
+  }
+  startNew(x, y, parentWidth, parentHeight, rotation) {
+    this.#parentWidth = parentWidth;
+    this.#parentHeight = parentHeight;
+    this.#rotation = rotation;
+    [x, y] = this.#normalizePoint(x, y);
+    const line = this.#line = [NaN, NaN, NaN, NaN, x, y];
+    this.#points = [x, y];
+    const last = this.#lines.at(-1);
+    if (last) {
+      last.line = new Float32Array(last.line);
+      last.points = new Float32Array(last.points);
+    }
+    this.#lines.push({
+      line,
+      points: this.#points
+    });
+    this.#last.set(line, 0);
+    this.#lastIndex = 0;
+    this.toSVGPath();
+    return null;
+  }
+  getLastElement() {
+    return this.#lines.at(-1);
+  }
+  setLastElement(element) {
+    if (!this.#lines) {
+      return this.#outlines.setLastElement(element);
+    }
+    this.#lines.push(element);
+    this.#line = element.line;
+    this.#points = element.points;
+    this.#lastIndex = 0;
+    return {
+      path: {
+        d: this.toSVGPath()
+      }
+    };
+  }
+  removeLastElement() {
+    if (!this.#lines) {
+      return this.#outlines.removeLastElement();
+    }
+    this.#lines.pop();
+    this.#lastSVGPath = "";
+    for (let i = 0, ii = this.#lines.length; i < ii; i++) {
+      const {
+        line,
+        points
+      } = this.#lines[i];
+      this.#line = line;
+      this.#points = points;
+      this.#lastIndex = 0;
+      this.toSVGPath();
+    }
+    return {
+      path: {
+        d: this.#lastSVGPath
+      }
+    };
+  }
+  toSVGPath() {
+    const firstX = Outline.svgRound(this.#line[4]);
+    const firstY = Outline.svgRound(this.#line[5]);
+    if (this.#points.length === 2) {
+      this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`;
+      return this.#lastSVGPath;
+    }
+    if (this.#points.length <= 6) {
+      const i = this.#lastSVGPath.lastIndexOf("M");
+      this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`;
+      this.#lastIndex = 6;
+    }
+    if (this.#points.length === 4) {
+      const secondX = Outline.svgRound(this.#line[10]);
+      const secondY = Outline.svgRound(this.#line[11]);
+      this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`;
+      this.#lastIndex = 12;
+      return this.#lastSVGPath;
+    }
+    const buffer = [];
+    if (this.#lastIndex === 0) {
+      buffer.push(`M ${firstX} ${firstY}`);
+      this.#lastIndex = 6;
+    }
+    for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) {
+      const [c1x, c1y, c2x, c2y, x, y] = this.#line.slice(i, i + 6).map(Outline.svgRound);
+      buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`);
+    }
+    this.#lastSVGPath += buffer.join(" ");
+    this.#lastIndex = this.#line.length;
+    return this.#lastSVGPath;
+  }
+  getOutlines(parentWidth, parentHeight, scale, innerMargin) {
+    const last = this.#lines.at(-1);
+    last.line = new Float32Array(last.line);
+    last.points = new Float32Array(last.points);
+    this.#outlines.build(this.#lines, parentWidth, parentHeight, scale, this.#rotation, this.#thickness, innerMargin);
+    this.#last = null;
+    this.#line = null;
+    this.#lines = null;
+    this.#lastSVGPath = null;
+    return this.#outlines;
+  }
+  get defaultSVGProperties() {
+    return {
+      root: {
+        viewBox: "0 0 10000 10000"
+      },
+      rootClass: {
+        draw: true
+      },
+      bbox: [0, 0, 1, 1]
+    };
+  }
+}
+class InkDrawOutline extends Outline {
+  #bbox;
+  #currentRotation = 0;
+  #innerMargin;
+  #lines;
+  #parentWidth;
+  #parentHeight;
+  #parentScale;
+  #rotation;
+  #thickness;
+  build(lines, parentWidth, parentHeight, parentScale, rotation, thickness, innerMargin) {
+    this.#parentWidth = parentWidth;
+    this.#parentHeight = parentHeight;
+    this.#parentScale = parentScale;
+    this.#rotation = rotation;
+    this.#thickness = thickness;
+    this.#innerMargin = innerMargin ?? 0;
+    this.#lines = lines;
+    this.#computeBbox();
+  }
+  get thickness() {
+    return this.#thickness;
+  }
+  setLastElement(element) {
+    this.#lines.push(element);
+    return {
+      path: {
+        d: this.toSVGPath()
+      }
+    };
+  }
+  removeLastElement() {
+    this.#lines.pop();
+    return {
+      path: {
+        d: this.toSVGPath()
+      }
+    };
+  }
+  toSVGPath() {
+    const buffer = [];
+    for (const {
+      line
+    } of this.#lines) {
+      buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`);
+      if (line.length === 6) {
+        buffer.push("Z");
+        continue;
+      }
+      if (line.length === 12 && isNaN(line[6])) {
+        buffer.push(`L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`);
+        continue;
+      }
+      for (let i = 6, ii = line.length; i < ii; i += 6) {
+        const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6).map(Outline.svgRound);
+        buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`);
+      }
+    }
+    return buffer.join("");
+  }
+  serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) {
+    const serializedLines = [];
+    const serializedPoints = [];
+    const [x, y, width, height] = this.#getBBoxWithNoMargin();
+    let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn;
+    switch (this.#rotation) {
+      case 0:
+        rescaleFn = Outline._rescale;
+        tx = pageX;
+        ty = pageY + pageHeight;
+        sx = pageWidth;
+        sy = -pageHeight;
+        x1 = pageX + x * pageWidth;
+        y1 = pageY + (1 - y - height) * pageHeight;
+        x2 = pageX + (x + width) * pageWidth;
+        y2 = pageY + (1 - y) * pageHeight;
+        break;
+      case 90:
+        rescaleFn = Outline._rescaleAndSwap;
+        tx = pageX;
+        ty = pageY;
+        sx = pageWidth;
+        sy = pageHeight;
+        x1 = pageX + y * pageWidth;
+        y1 = pageY + x * pageHeight;
+        x2 = pageX + (y + height) * pageWidth;
+        y2 = pageY + (x + width) * pageHeight;
+        break;
+      case 180:
+        rescaleFn = Outline._rescale;
+        tx = pageX + pageWidth;
+        ty = pageY;
+        sx = -pageWidth;
+        sy = pageHeight;
+        x1 = pageX + (1 - x - width) * pageWidth;
+        y1 = pageY + y * pageHeight;
+        x2 = pageX + (1 - x) * pageWidth;
+        y2 = pageY + (y + height) * pageHeight;
+        break;
+      case 270:
+        rescaleFn = Outline._rescaleAndSwap;
+        tx = pageX + pageWidth;
+        ty = pageY + pageHeight;
+        sx = -pageWidth;
+        sy = -pageHeight;
+        x1 = pageX + (1 - y - height) * pageWidth;
+        y1 = pageY + (1 - x - width) * pageHeight;
+        x2 = pageX + (1 - y) * pageWidth;
+        y2 = pageY + (1 - x) * pageHeight;
+        break;
+    }
+    for (const {
+      line,
+      points
+    } of this.#lines) {
+      serializedLines.push(rescaleFn(line, tx, ty, sx, sy, isForCopying ? new Array(line.length) : null));
+      serializedPoints.push(rescaleFn(points, tx, ty, sx, sy, isForCopying ? new Array(points.length) : null));
+    }
+    return {
+      lines: serializedLines,
+      points: serializedPoints,
+      rect: [x1, y1, x2, y2]
+    };
+  }
+  static deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, {
+    paths: {
+      lines,
+      points
+    },
+    rotation,
+    thickness
+  }) {
+    const newLines = [];
+    let tx, ty, sx, sy, rescaleFn;
+    switch (rotation) {
+      case 0:
+        rescaleFn = Outline._rescale;
+        tx = -pageX / pageWidth;
+        ty = pageY / pageHeight + 1;
+        sx = 1 / pageWidth;
+        sy = -1 / pageHeight;
+        break;
+      case 90:
+        rescaleFn = Outline._rescaleAndSwap;
+        tx = -pageY / pageHeight;
+        ty = -pageX / pageWidth;
+        sx = 1 / pageHeight;
+        sy = 1 / pageWidth;
+        break;
+      case 180:
+        rescaleFn = Outline._rescale;
+        tx = pageX / pageWidth + 1;
+        ty = -pageY / pageHeight;
+        sx = -1 / pageWidth;
+        sy = 1 / pageHeight;
+        break;
+      case 270:
+        rescaleFn = Outline._rescaleAndSwap;
+        tx = pageY / pageHeight + 1;
+        ty = pageX / pageWidth + 1;
+        sx = -1 / pageHeight;
+        sy = -1 / pageWidth;
+        break;
+    }
+    if (!lines) {
+      lines = [];
+      for (const point of points) {
+        const len = point.length;
+        if (len === 2) {
+          lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]]));
+          continue;
+        }
+        if (len === 4) {
+          lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1], NaN, NaN, NaN, NaN, point[2], point[3]]));
+          continue;
+        }
+        const line = new Float32Array(3 * (len - 2));
+        lines.push(line);
+        let [x1, y1, x2, y2] = point.subarray(0, 4);
+        line.set([NaN, NaN, NaN, NaN, x1, y1], 0);
+        for (let i = 4; i < len; i += 2) {
+          const x = point[i];
+          const y = point[i + 1];
+          line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3);
+          [x1, y1, x2, y2] = [x2, y2, x, y];
+        }
+      }
+    }
+    for (let i = 0, ii = lines.length; i < ii; i++) {
+      newLines.push({
+        line: rescaleFn(lines[i].map(x => x ?? NaN), tx, ty, sx, sy),
+        points: rescaleFn(points[i].map(x => x ?? NaN), tx, ty, sx, sy)
+      });
+    }
+    const outlines = new this.prototype.constructor();
+    outlines.build(newLines, pageWidth, pageHeight, 1, rotation, thickness, innerMargin);
+    return outlines;
+  }
+  #getMarginComponents(thickness = this.#thickness) {
+    const margin = this.#innerMargin + thickness / 2 * this.#parentScale;
+    return this.#rotation % 180 === 0 ? [margin / this.#parentWidth, margin / this.#parentHeight] : [margin / this.#parentHeight, margin / this.#parentWidth];
+  }
+  #getBBoxWithNoMargin() {
+    const [x, y, width, height] = this.#bbox;
+    const [marginX, marginY] = this.#getMarginComponents(0);
+    return [x + marginX, y + marginY, width - 2 * marginX, height - 2 * marginY];
+  }
+  #computeBbox() {
+    const bbox = this.#bbox = F32_BBOX_INIT.slice();
+    for (const {
+      line
+    } of this.#lines) {
+      if (line.length <= 12) {
+        for (let i = 4, ii = line.length; i < ii; i += 6) {
+          Util.pointBoundingBox(line[i], line[i + 1], bbox);
+        }
+        continue;
+      }
+      let lastX = line[4],
+        lastY = line[5];
+      for (let i = 6, ii = line.length; i < ii; i += 6) {
+        const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6);
+        Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox);
+        lastX = x;
+        lastY = y;
+      }
+    }
+    const [marginX, marginY] = this.#getMarginComponents();
+    bbox[0] = MathClamp(bbox[0] - marginX, 0, 1);
+    bbox[1] = MathClamp(bbox[1] - marginY, 0, 1);
+    bbox[2] = MathClamp(bbox[2] + marginX, 0, 1);
+    bbox[3] = MathClamp(bbox[3] + marginY, 0, 1);
+    bbox[2] -= bbox[0];
+    bbox[3] -= bbox[1];
+  }
+  get box() {
+    return this.#bbox;
+  }
+  updateProperty(name, value) {
+    if (name === "stroke-width") {
+      return this.#updateThickness(value);
+    }
+    return null;
+  }
+  #updateThickness(thickness) {
+    const [oldMarginX, oldMarginY] = this.#getMarginComponents();
+    this.#thickness = thickness;
+    const [newMarginX, newMarginY] = this.#getMarginComponents();
+    const [diffMarginX, diffMarginY] = [newMarginX - oldMarginX, newMarginY - oldMarginY];
+    const bbox = this.#bbox;
+    bbox[0] -= diffMarginX;
+    bbox[1] -= diffMarginY;
+    bbox[2] += 2 * diffMarginX;
+    bbox[3] += 2 * diffMarginY;
+    return bbox;
+  }
+  updateParentDimensions([width, height], scale) {
+    const [oldMarginX, oldMarginY] = this.#getMarginComponents();
+    this.#parentWidth = width;
+    this.#parentHeight = height;
+    this.#parentScale = scale;
+    const [newMarginX, newMarginY] = this.#getMarginComponents();
+    const diffMarginX = newMarginX - oldMarginX;
+    const diffMarginY = newMarginY - oldMarginY;
+    const bbox = this.#bbox;
+    bbox[0] -= diffMarginX;
+    bbox[1] -= diffMarginY;
+    bbox[2] += 2 * diffMarginX;
+    bbox[3] += 2 * diffMarginY;
+    return bbox;
+  }
+  updateRotation(rotation) {
+    this.#currentRotation = rotation;
+    return {
+      path: {
+        transform: this.rotationTransform
+      }
+    };
+  }
+  get viewBox() {
+    return this.#bbox.map(Outline.svgRound).join(" ");
+  }
+  get defaultProperties() {
+    const [x, y] = this.#bbox;
+    return {
+      root: {
+        viewBox: this.viewBox
+      },
+      path: {
+        "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`
+      }
+    };
+  }
+  get rotationTransform() {
+    const [,, width, height] = this.#bbox;
+    let a = 0,
+      b = 0,
+      c = 0,
+      d = 0,
+      e = 0,
+      f = 0;
+    switch (this.#currentRotation) {
+      case 90:
+        b = height / width;
+        c = -width / height;
+        e = width;
+        break;
+      case 180:
+        a = -1;
+        d = -1;
+        e = width;
+        f = height;
+        break;
+      case 270:
+        b = -height / width;
+        c = width / height;
+        f = height;
+        break;
+      default:
+        return "";
+    }
+    return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`;
+  }
+  getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) {
+    const [marginX, marginY] = this.#getMarginComponents();
+    const [x, y, width, height] = this.#bbox;
+    if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) {
+      const tx = newX + newWidth / 2 - (x + width / 2);
+      const ty = newY + newHeight / 2 - (y + height / 2);
+      return {
+        path: {
+          "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,
+          transform: `${this.rotationTransform} translate(${tx} ${ty})`
+        }
+      };
+    }
+    const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX);
+    const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY);
+    const s2x = width / newWidth;
+    const s2y = height / newHeight;
+    return {
+      path: {
+        "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`,
+        transform: `${this.rotationTransform} scale(${s2x} ${s2y}) ` + `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` + `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})`
+      }
+    };
+  }
+  getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) {
+    const [marginX, marginY] = this.#getMarginComponents();
+    const bbox = this.#bbox;
+    const [x, y, width, height] = bbox;
+    bbox[0] = newX;
+    bbox[1] = newY;
+    bbox[2] = newWidth;
+    bbox[3] = newHeight;
+    if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) {
+      const tx = newX + newWidth / 2 - (x + width / 2);
+      const ty = newY + newHeight / 2 - (y + height / 2);
+      for (const {
+        line,
+        points
+      } of this.#lines) {
+        Outline._translate(line, tx, ty, line);
+        Outline._translate(points, tx, ty, points);
+      }
+      return {
+        root: {
+          viewBox: this.viewBox
+        },
+        path: {
+          "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,
+          transform: this.rotationTransform || null,
+          d: this.toSVGPath()
+        }
+      };
+    }
+    const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX);
+    const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY);
+    const tx = -s1x * (x + marginX) + newX + marginX;
+    const ty = -s1y * (y + marginY) + newY + marginY;
+    if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) {
+      for (const {
+        line,
+        points
+      } of this.#lines) {
+        Outline._rescale(line, tx, ty, s1x, s1y, line);
+        Outline._rescale(points, tx, ty, s1x, s1y, points);
+      }
+    }
+    return {
+      root: {
+        viewBox: this.viewBox
+      },
+      path: {
+        "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,
+        transform: this.rotationTransform || null,
+        d: this.toSVGPath()
+      }
+    };
+  }
+  getPathTranslatedSVGProperties([newX, newY], parentDimensions) {
+    const [newParentWidth, newParentHeight] = parentDimensions;
+    const bbox = this.#bbox;
+    const tx = newX - bbox[0];
+    const ty = newY - bbox[1];
+    if (this.#parentWidth === newParentWidth && this.#parentHeight === newParentHeight) {
+      for (const {
+        line,
+        points
+      } of this.#lines) {
+        Outline._translate(line, tx, ty, line);
+        Outline._translate(points, tx, ty, points);
+      }
+    } else {
+      const sx = this.#parentWidth / newParentWidth;
+      const sy = this.#parentHeight / newParentHeight;
+      this.#parentWidth = newParentWidth;
+      this.#parentHeight = newParentHeight;
+      for (const {
+        line,
+        points
+      } of this.#lines) {
+        Outline._rescale(line, tx, ty, sx, sy, line);
+        Outline._rescale(points, tx, ty, sx, sy, points);
+      }
+      bbox[2] *= sx;
+      bbox[3] *= sy;
+    }
+    bbox[0] = newX;
+    bbox[1] = newY;
+    return {
+      root: {
+        viewBox: this.viewBox
+      },
+      path: {
+        d: this.toSVGPath(),
+        "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`
+      }
+    };
+  }
+  get defaultSVGProperties() {
+    const bbox = this.#bbox;
+    return {
+      root: {
+        viewBox: this.viewBox
+      },
+      rootClass: {
+        draw: true
+      },
+      path: {
+        d: this.toSVGPath(),
+        "transform-origin": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`,
+        transform: this.rotationTransform || null
+      },
+      bbox
+    };
+  }
+}
+
+;// ./src/display/editor/ink.js
+
+
+
+
+
+
+class InkDrawingOptions extends DrawingOptions {
+  constructor(viewerParameters) {
+    super();
+    this._viewParameters = viewerParameters;
+    super.updateProperties({
+      fill: "none",
+      stroke: AnnotationEditor._defaultLineColor,
+      "stroke-opacity": 1,
+      "stroke-width": 1,
+      "stroke-linecap": "round",
+      "stroke-linejoin": "round",
+      "stroke-miterlimit": 10
+    });
+  }
+  updateSVGProperty(name, value) {
+    if (name === "stroke-width") {
+      value ??= this["stroke-width"];
+      value *= this._viewParameters.realScale;
+    }
+    super.updateSVGProperty(name, value);
+  }
+  clone() {
+    const clone = new InkDrawingOptions(this._viewParameters);
+    clone.updateAll(this);
+    return clone;
+  }
+}
+class InkEditor extends DrawingEditor {
+  static _type = "ink";
+  static _editorType = AnnotationEditorType.INK;
+  static _defaultDrawingOptions = null;
+  constructor(params) {
+    super({
+      ...params,
+      name: "inkEditor"
+    });
+    this._willKeepAspectRatio = true;
+    this.defaultL10nId = "pdfjs-editor-ink-editor";
+  }
+  static initialize(l10n, uiManager) {
+    AnnotationEditor.initialize(l10n, uiManager);
+    this._defaultDrawingOptions = new InkDrawingOptions(uiManager.viewParameters);
+  }
+  static getDefaultDrawingOptions(options) {
+    const clone = this._defaultDrawingOptions.clone();
+    clone.updateProperties(options);
+    return clone;
+  }
+  static get supportMultipleDrawings() {
+    return true;
+  }
+  static get typesMap() {
+    return shadow(this, "typesMap", new Map([[AnnotationEditorParamsType.INK_THICKNESS, "stroke-width"], [AnnotationEditorParamsType.INK_COLOR, "stroke"], [AnnotationEditorParamsType.INK_OPACITY, "stroke-opacity"]]));
+  }
+  static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) {
+    return new InkDrawOutliner(x, y, parentWidth, parentHeight, rotation, this._defaultDrawingOptions["stroke-width"]);
+  }
+  static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) {
+    return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data);
+  }
+  static async deserialize(data, parent, uiManager) {
+    let initialData = null;
+    if (data instanceof InkAnnotationElement) {
+      const {
+        data: {
+          inkLists,
+          rect,
+          rotation,
+          id,
+          color,
+          opacity,
+          borderStyle: {
+            rawWidth: thickness
+          },
+          popupRef,
+          richText,
+          contentsObj,
+          creationDate,
+          modificationDate
+        },
+        parent: {
+          page: {
+            pageNumber
+          }
+        }
+      } = data;
+      initialData = data = {
+        annotationType: AnnotationEditorType.INK,
+        color: Array.from(color),
+        thickness,
+        opacity,
+        paths: {
+          points: inkLists
+        },
+        boxes: null,
+        pageIndex: pageNumber - 1,
+        rect: rect.slice(0),
+        rotation,
+        annotationElementId: id,
+        id,
+        deleted: false,
+        popupRef,
+        richText,
+        comment: contentsObj?.str || null,
+        creationDate,
+        modificationDate
+      };
+    }
+    const editor = await super.deserialize(data, parent, uiManager);
+    editor._initialData = initialData;
+    if (data.comment) {
+      editor.setCommentData(data);
+    }
+    return editor;
+  }
+  get toolbarButtons() {
+    this._colorPicker ||= new BasicColorPicker(this);
+    return [["colorPicker", this._colorPicker]];
+  }
+  get colorType() {
+    return AnnotationEditorParamsType.INK_COLOR;
+  }
+  get colorAndOpacityType() {
+    return AnnotationEditorParamsType.INK_COLOR_AND_OPACITY;
+  }
+  get opacityType() {
+    return AnnotationEditorParamsType.INK_OPACITY;
+  }
+  updateParams(type, value) {
+    if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) {
+      this._updateColorAndOpacity(value.color, value.opacity);
+      return;
+    }
+    super.updateParams(type, value);
+  }
+  static updateDefaultParams(type, value) {
+    if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) {
+      super.updateDefaultParams(AnnotationEditorParamsType.INK_COLOR, value.color);
+      super.updateDefaultParams(AnnotationEditorParamsType.INK_OPACITY, value.opacity);
+      return;
+    }
+    super.updateDefaultParams(type, value);
+  }
+  get color() {
+    return this._drawingOptions.stroke;
+  }
+  get opacity() {
+    return this._drawingOptions["stroke-opacity"];
+  }
+  onScaleChanging() {
+    if (!this.parent) {
+      return;
+    }
+    super.onScaleChanging();
+    const {
+      _drawId,
+      _drawingOptions,
+      parent
+    } = this;
+    _drawingOptions.updateSVGProperty("stroke-width");
+    parent.drawLayer.updateProperties(_drawId, _drawingOptions.toSVGProperties());
+  }
+  static onScaleChangingWhenDrawing() {
+    const parent = this._currentParent;
+    if (!parent) {
+      return;
+    }
+    super.onScaleChangingWhenDrawing();
+    this._defaultDrawingOptions.updateSVGProperty("stroke-width");
+    parent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties());
+  }
+  createDrawingOptions({
+    color,
+    thickness,
+    opacity
+  }) {
+    this._drawingOptions = InkEditor.getDefaultDrawingOptions({
+      stroke: Util.makeHexColor(...color),
+      "stroke-width": thickness,
+      "stroke-opacity": opacity
+    });
+  }
+  serialize(isForCopying = false) {
+    if (this.isEmpty()) {
+      return null;
+    }
+    if (this.deleted) {
+      return this.serializeDeleted();
+    }
+    const {
+      lines,
+      points
+    } = this.serializeDraw(isForCopying);
+    const {
+      _drawingOptions: {
+        stroke,
+        "stroke-opacity": opacity,
+        "stroke-width": thickness
+      }
+    } = this;
+    const serialized = Object.assign(super.serialize(isForCopying), {
+      color: AnnotationEditor._colorManager.convert(stroke),
+      opacity,
+      thickness,
+      paths: {
+        lines,
+        points
+      }
+    });
+    this.addComment(serialized);
+    if (isForCopying) {
+      serialized.isCopy = true;
+      return serialized;
+    }
+    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {
+      return null;
+    }
+    serialized.id = this.annotationElementId;
+    return serialized;
+  }
+  #hasElementChanged(serialized) {
+    const {
+      color,
+      thickness,
+      opacity,
+      pageIndex
+    } = this._initialData;
+    return this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized || serialized.color.some((c, i) => c !== color[i]) || serialized.thickness !== thickness || serialized.opacity !== opacity || serialized.pageIndex !== pageIndex;
+  }
+  renderAnnotationElement(annotation) {
+    if (this.deleted) {
+      annotation.hide();
+      return null;
+    }
+    const {
+      points,
+      rect
+    } = this.serializeDraw(false);
+    annotation.updateEdited({
+      rect,
+      thickness: this._drawingOptions["stroke-width"],
+      points,
+      popup: this.comment
+    });
+    return null;
+  }
+}
+
+;// ./src/display/editor/drawers/contour.js
+
+class ContourDrawOutline extends InkDrawOutline {
+  toSVGPath() {
+    let path = super.toSVGPath();
+    if (!path.endsWith("Z")) {
+      path += "Z";
+    }
+    return path;
+  }
+}
+
+;// ./src/display/editor/drawers/signaturedraw.js
+
+
+
+
+const BASE_HEADER_LENGTH = 8;
+const POINTS_PROPERTIES_NUMBER = 3;
+class SignatureExtractor {
+  static #PARAMETERS = {
+    maxDim: 512,
+    sigmaSFactor: 0.02,
+    sigmaR: 25,
+    kernelSize: 16
+  };
+  static #neighborIndexToId(i0, j0, i, j) {
+    i -= i0;
+    j -= j0;
+    if (i === 0) {
+      return j > 0 ? 0 : 4;
+    }
+    if (i === 1) {
+      return j + 6;
+    }
+    return 2 - j;
+  }
+  static #neighborIdToIndex = new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]);
+  static #clockwiseNonZero(buf, width, i0, j0, i, j, offset) {
+    const id = this.#neighborIndexToId(i0, j0, i, j);
+    for (let k = 0; k < 8; k++) {
+      const kk = (-k + id - offset + 16) % 8;
+      const shiftI = this.#neighborIdToIndex[2 * kk];
+      const shiftJ = this.#neighborIdToIndex[2 * kk + 1];
+      if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) {
+        return kk;
+      }
+    }
+    return -1;
+  }
+  static #counterClockwiseNonZero(buf, width, i0, j0, i, j, offset) {
+    const id = this.#neighborIndexToId(i0, j0, i, j);
+    for (let k = 0; k < 8; k++) {
+      const kk = (k + id + offset + 16) % 8;
+      const shiftI = this.#neighborIdToIndex[2 * kk];
+      const shiftJ = this.#neighborIdToIndex[2 * kk + 1];
+      if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) {
+        return kk;
+      }
+    }
+    return -1;
+  }
+  static #findContours(buf, width, height, threshold) {
+    const N = buf.length;
+    const types = new Int32Array(N);
+    for (let i = 0; i < N; i++) {
+      types[i] = buf[i] <= threshold ? 1 : 0;
+    }
+    for (let i = 1; i < height - 1; i++) {
+      types[i * width] = types[i * width + width - 1] = 0;
+    }
+    for (let i = 0; i < width; i++) {
+      types[i] = types[width * height - 1 - i] = 0;
+    }
+    let nbd = 1;
+    let lnbd;
+    const contours = [];
+    for (let i = 1; i < height - 1; i++) {
+      lnbd = 1;
+      for (let j = 1; j < width - 1; j++) {
+        const ij = i * width + j;
+        const pix = types[ij];
+        if (pix === 0) {
+          continue;
+        }
+        let i2 = i;
+        let j2 = j;
+        if (pix === 1 && types[ij - 1] === 0) {
+          nbd += 1;
+          j2 -= 1;
+        } else if (pix >= 1 && types[ij + 1] === 0) {
+          nbd += 1;
+          j2 += 1;
+          if (pix > 1) {
+            lnbd = pix;
+          }
+        } else {
+          if (pix !== 1) {
+            lnbd = Math.abs(pix);
+          }
+          continue;
+        }
+        const points = [j, i];
+        const isHole = j2 === j + 1;
+        const contour = {
+          isHole,
+          points,
+          id: nbd,
+          parent: 0
+        };
+        contours.push(contour);
+        let contour0;
+        for (const c of contours) {
+          if (c.id === lnbd) {
+            contour0 = c;
+            break;
+          }
+        }
+        if (!contour0) {
+          contour.parent = isHole ? lnbd : 0;
+        } else if (contour0.isHole) {
+          contour.parent = isHole ? contour0.parent : lnbd;
+        } else {
+          contour.parent = isHole ? lnbd : contour0.parent;
+        }
+        const k = this.#clockwiseNonZero(types, width, i, j, i2, j2, 0);
+        if (k === -1) {
+          types[ij] = -nbd;
+          if (types[ij] !== 1) {
+            lnbd = Math.abs(types[ij]);
+          }
+          continue;
+        }
+        let shiftI = this.#neighborIdToIndex[2 * k];
+        let shiftJ = this.#neighborIdToIndex[2 * k + 1];
+        const i1 = i + shiftI;
+        const j1 = j + shiftJ;
+        i2 = i1;
+        j2 = j1;
+        let i3 = i;
+        let j3 = j;
+        while (true) {
+          const kk = this.#counterClockwiseNonZero(types, width, i3, j3, i2, j2, 1);
+          shiftI = this.#neighborIdToIndex[2 * kk];
+          shiftJ = this.#neighborIdToIndex[2 * kk + 1];
+          const i4 = i3 + shiftI;
+          const j4 = j3 + shiftJ;
+          points.push(j4, i4);
+          const ij3 = i3 * width + j3;
+          if (types[ij3 + 1] === 0) {
+            types[ij3] = -nbd;
+          } else if (types[ij3] === 1) {
+            types[ij3] = nbd;
+          }
+          if (i4 === i && j4 === j && i3 === i1 && j3 === j1) {
+            if (types[ij] !== 1) {
+              lnbd = Math.abs(types[ij]);
+            }
+            break;
+          } else {
+            i2 = i3;
+            j2 = j3;
+            i3 = i4;
+            j3 = j4;
+          }
+        }
+      }
+    }
+    return contours;
+  }
+  static #douglasPeuckerHelper(points, start, end, output) {
+    if (end - start <= 4) {
+      for (let i = start; i < end - 2; i += 2) {
+        output.push(points[i], points[i + 1]);
+      }
+      return;
+    }
+    const ax = points[start];
+    const ay = points[start + 1];
+    const abx = points[end - 4] - ax;
+    const aby = points[end - 3] - ay;
+    const dist = Math.hypot(abx, aby);
+    const nabx = abx / dist;
+    const naby = aby / dist;
+    const aa = nabx * ay - naby * ax;
+    const m = aby / abx;
+    const invS = 1 / dist;
+    const phi = Math.atan(m);
+    const cosPhi = Math.cos(phi);
+    const sinPhi = Math.sin(phi);
+    const tmax = invS * (Math.abs(cosPhi) + Math.abs(sinPhi));
+    const poly = invS * (1 - tmax + tmax ** 2);
+    const partialPhi = Math.max(Math.atan(Math.abs(sinPhi + cosPhi) * poly), Math.atan(Math.abs(sinPhi - cosPhi) * poly));
+    let dmax = 0;
+    let index = start;
+    for (let i = start + 2; i < end - 2; i += 2) {
+      const d = Math.abs(aa - nabx * points[i + 1] + naby * points[i]);
+      if (d > dmax) {
+        index = i;
+        dmax = d;
+      }
+    }
+    if (dmax > (dist * partialPhi) ** 2) {
+      this.#douglasPeuckerHelper(points, start, index + 2, output);
+      this.#douglasPeuckerHelper(points, index, end, output);
+    } else {
+      output.push(ax, ay);
+    }
+  }
+  static #douglasPeucker(points) {
+    const output = [];
+    const len = points.length;
+    this.#douglasPeuckerHelper(points, 0, len, output);
+    output.push(points[len - 2], points[len - 1]);
+    return output.length <= 4 ? null : output;
+  }
+  static #bilateralFilter(buf, width, height, sigmaS, sigmaR, kernelSize) {
+    const kernel = new Float32Array(kernelSize ** 2);
+    const sigmaS2 = -2 * sigmaS ** 2;
+    const halfSize = kernelSize >> 1;
+    for (let i = 0; i < kernelSize; i++) {
+      const x = (i - halfSize) ** 2;
+      for (let j = 0; j < kernelSize; j++) {
+        kernel[i * kernelSize + j] = Math.exp((x + (j - halfSize) ** 2) / sigmaS2);
+      }
+    }
+    const rangeValues = new Float32Array(256);
+    const sigmaR2 = -2 * sigmaR ** 2;
+    for (let i = 0; i < 256; i++) {
+      rangeValues[i] = Math.exp(i ** 2 / sigmaR2);
+    }
+    const N = buf.length;
+    const out = new Uint8Array(N);
+    const histogram = new Uint32Array(256);
+    for (let i = 0; i < height; i++) {
+      for (let j = 0; j < width; j++) {
+        const ij = i * width + j;
+        const center = buf[ij];
+        let sum = 0;
+        let norm = 0;
+        for (let k = 0; k < kernelSize; k++) {
+          const y = i + k - halfSize;
+          if (y < 0 || y >= height) {
+            continue;
+          }
+          for (let l = 0; l < kernelSize; l++) {
+            const x = j + l - halfSize;
+            if (x < 0 || x >= width) {
+              continue;
+            }
+            const neighbour = buf[y * width + x];
+            const w = kernel[k * kernelSize + l] * rangeValues[Math.abs(neighbour - center)];
+            sum += neighbour * w;
+            norm += w;
+          }
+        }
+        const pix = out[ij] = Math.round(sum / norm);
+        histogram[pix]++;
+      }
+    }
+    return [out, histogram];
+  }
+  static #getHistogram(buf) {
+    const histogram = new Uint32Array(256);
+    for (const g of buf) {
+      histogram[g]++;
+    }
+    return histogram;
+  }
+  static #toUint8(buf) {
+    const N = buf.length;
+    const out = new Uint8ClampedArray(N >> 2);
+    let max = -Infinity;
+    let min = Infinity;
+    for (let i = 0, ii = out.length; i < ii; i++) {
+      const pix = out[i] = buf[i << 2];
+      max = Math.max(max, pix);
+      min = Math.min(min, pix);
+    }
+    const ratio = 255 / (max - min);
+    for (let i = 0, ii = out.length; i < ii; i++) {
+      out[i] = (out[i] - min) * ratio;
+    }
+    return out;
+  }
+  static #guessThreshold(histogram) {
+    let i;
+    let M = -Infinity;
+    let L = -Infinity;
+    const min = histogram.findIndex(v => v !== 0);
+    let pos = min;
+    let spos = min;
+    for (i = min; i < 256; i++) {
+      const v = histogram[i];
+      if (v > M) {
+        if (i - pos > L) {
+          L = i - pos;
+          spos = i - 1;
+        }
+        M = v;
+        pos = i;
+      }
+    }
+    for (i = spos - 1; i >= 0; i--) {
+      if (histogram[i] > histogram[i + 1]) {
+        break;
+      }
+    }
+    return i;
+  }
+  static #getGrayPixels(bitmap) {
+    const originalBitmap = bitmap;
+    const {
+      width,
+      height
+    } = bitmap;
+    const {
+      maxDim
+    } = this.#PARAMETERS;
+    let newWidth = width;
+    let newHeight = height;
+    if (width > maxDim || height > maxDim) {
+      let prevWidth = width;
+      let prevHeight = height;
+      let steps = Math.log2(Math.max(width, height) / maxDim);
+      const isteps = Math.floor(steps);
+      steps = steps === isteps ? isteps - 1 : isteps;
+      for (let i = 0; i < steps; i++) {
+        newWidth = Math.ceil(prevWidth / 2);
+        newHeight = Math.ceil(prevHeight / 2);
+        const offscreen = new OffscreenCanvas(newWidth, newHeight);
+        const ctx = offscreen.getContext("2d");
+        ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight);
+        prevWidth = newWidth;
+        prevHeight = newHeight;
+        if (bitmap !== originalBitmap) {
+          bitmap.close();
+        }
+        bitmap = offscreen.transferToImageBitmap();
+      }
+      const ratio = Math.min(maxDim / newWidth, maxDim / newHeight);
+      newWidth = Math.round(newWidth * ratio);
+      newHeight = Math.round(newHeight * ratio);
+    }
+    const offscreen = new OffscreenCanvas(newWidth, newHeight);
+    const ctx = offscreen.getContext("2d", {
+      willReadFrequently: true
+    });
+    ctx.fillStyle = "white";
+    ctx.fillRect(0, 0, newWidth, newHeight);
+    ctx.filter = "grayscale(1)";
+    ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, newWidth, newHeight);
+    const grayImage = ctx.getImageData(0, 0, newWidth, newHeight).data;
+    const uint8Buf = this.#toUint8(grayImage);
+    return [uint8Buf, newWidth, newHeight];
+  }
+  static extractContoursFromText(text, {
+    fontFamily,
+    fontStyle,
+    fontWeight
+  }, pageWidth, pageHeight, rotation, innerMargin) {
+    let canvas = new OffscreenCanvas(1, 1);
+    let ctx = canvas.getContext("2d", {
+      alpha: false
+    });
+    const fontSize = 200;
+    const font = ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;
+    const {
+      actualBoundingBoxLeft,
+      actualBoundingBoxRight,
+      actualBoundingBoxAscent,
+      actualBoundingBoxDescent,
+      fontBoundingBoxAscent,
+      fontBoundingBoxDescent,
+      width
+    } = ctx.measureText(text);
+    const SCALE = 1.5;
+    const canvasWidth = Math.ceil(Math.max(Math.abs(actualBoundingBoxLeft) + Math.abs(actualBoundingBoxRight) || 0, width) * SCALE);
+    const canvasHeight = Math.ceil(Math.max(Math.abs(actualBoundingBoxAscent) + Math.abs(actualBoundingBoxDescent) || fontSize, Math.abs(fontBoundingBoxAscent) + Math.abs(fontBoundingBoxDescent) || fontSize) * SCALE);
+    canvas = new OffscreenCanvas(canvasWidth, canvasHeight);
+    ctx = canvas.getContext("2d", {
+      alpha: true,
+      willReadFrequently: true
+    });
+    ctx.font = font;
+    ctx.filter = "grayscale(1)";
+    ctx.fillStyle = "white";
+    ctx.fillRect(0, 0, canvasWidth, canvasHeight);
+    ctx.fillStyle = "black";
+    ctx.fillText(text, canvasWidth * (SCALE - 1) / 2, canvasHeight * (3 - SCALE) / 2);
+    const uint8Buf = this.#toUint8(ctx.getImageData(0, 0, canvasWidth, canvasHeight).data);
+    const histogram = this.#getHistogram(uint8Buf);
+    const threshold = this.#guessThreshold(histogram);
+    const contourList = this.#findContours(uint8Buf, canvasWidth, canvasHeight, threshold);
+    return this.processDrawnLines({
+      lines: {
+        curves: contourList,
+        width: canvasWidth,
+        height: canvasHeight
+      },
+      pageWidth,
+      pageHeight,
+      rotation,
+      innerMargin,
+      mustSmooth: true,
+      areContours: true
+    });
+  }
+  static process(bitmap, pageWidth, pageHeight, rotation, innerMargin) {
+    const [uint8Buf, width, height] = this.#getGrayPixels(bitmap);
+    const [buffer, histogram] = this.#bilateralFilter(uint8Buf, width, height, Math.hypot(width, height) * this.#PARAMETERS.sigmaSFactor, this.#PARAMETERS.sigmaR, this.#PARAMETERS.kernelSize);
+    const threshold = this.#guessThreshold(histogram);
+    const contourList = this.#findContours(buffer, width, height, threshold);
+    return this.processDrawnLines({
+      lines: {
+        curves: contourList,
+        width,
+        height
+      },
+      pageWidth,
+      pageHeight,
+      rotation,
+      innerMargin,
+      mustSmooth: true,
+      areContours: true
+    });
+  }
+  static processDrawnLines({
+    lines,
+    pageWidth,
+    pageHeight,
+    rotation,
+    innerMargin,
+    mustSmooth,
+    areContours
+  }) {
+    if (rotation % 180 !== 0) {
+      [pageWidth, pageHeight] = [pageHeight, pageWidth];
+    }
+    const {
+      curves,
+      width,
+      height
+    } = lines;
+    const thickness = lines.thickness ?? 0;
+    const linesAndPoints = [];
+    const ratio = Math.min(pageWidth / width, pageHeight / height);
+    const xScale = ratio / pageWidth;
+    const yScale = ratio / pageHeight;
+    const newCurves = [];
+    for (const {
+      points
+    } of curves) {
+      const reducedPoints = mustSmooth ? this.#douglasPeucker(points) : points;
+      if (!reducedPoints) {
+        continue;
+      }
+      newCurves.push(reducedPoints);
+      const len = reducedPoints.length;
+      const newPoints = new Float32Array(len);
+      const line = new Float32Array(3 * (len === 2 ? 2 : len - 2));
+      linesAndPoints.push({
+        line,
+        points: newPoints
+      });
+      if (len === 2) {
+        newPoints[0] = reducedPoints[0] * xScale;
+        newPoints[1] = reducedPoints[1] * yScale;
+        line.set([NaN, NaN, NaN, NaN, newPoints[0], newPoints[1]], 0);
+        continue;
+      }
+      let [x1, y1, x2, y2] = reducedPoints;
+      x1 *= xScale;
+      y1 *= yScale;
+      x2 *= xScale;
+      y2 *= yScale;
+      newPoints.set([x1, y1, x2, y2], 0);
+      line.set([NaN, NaN, NaN, NaN, x1, y1], 0);
+      for (let i = 4; i < len; i += 2) {
+        const x = newPoints[i] = reducedPoints[i] * xScale;
+        const y = newPoints[i + 1] = reducedPoints[i + 1] * yScale;
+        line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3);
+        [x1, y1, x2, y2] = [x2, y2, x, y];
+      }
+    }
+    if (linesAndPoints.length === 0) {
+      return null;
+    }
+    const outline = areContours ? new ContourDrawOutline() : new InkDrawOutline();
+    outline.build(linesAndPoints, pageWidth, pageHeight, 1, rotation, areContours ? 0 : thickness, innerMargin);
+    return {
+      outline,
+      newCurves,
+      areContours,
+      thickness,
+      width,
+      height
+    };
+  }
+  static async compressSignature({
+    outlines,
+    areContours,
+    thickness,
+    width,
+    height
+  }) {
+    let minDiff = Infinity;
+    let maxDiff = -Infinity;
+    let outlinesLength = 0;
+    for (const points of outlines) {
+      outlinesLength += points.length;
+      for (let i = 2, ii = points.length; i < ii; i++) {
+        const dx = points[i] - points[i - 2];
+        minDiff = Math.min(minDiff, dx);
+        maxDiff = Math.max(maxDiff, dx);
+      }
+    }
+    let bufferType;
+    if (minDiff >= -128 && maxDiff <= 127) {
+      bufferType = Int8Array;
+    } else if (minDiff >= -32768 && maxDiff <= 32767) {
+      bufferType = Int16Array;
+    } else {
+      bufferType = Int32Array;
+    }
+    const len = outlines.length;
+    const headerLength = BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * len;
+    const header = new Uint32Array(headerLength);
+    let offset = 0;
+    header[offset++] = headerLength * Uint32Array.BYTES_PER_ELEMENT + (outlinesLength - 2 * len) * bufferType.BYTES_PER_ELEMENT;
+    header[offset++] = 0;
+    header[offset++] = width;
+    header[offset++] = height;
+    header[offset++] = areContours ? 0 : 1;
+    header[offset++] = Math.max(0, Math.floor(thickness ?? 0));
+    header[offset++] = len;
+    header[offset++] = bufferType.BYTES_PER_ELEMENT;
+    for (const points of outlines) {
+      header[offset++] = points.length - 2;
+      header[offset++] = points[0];
+      header[offset++] = points[1];
+    }
+    const cs = new CompressionStream("deflate-raw");
+    const writer = cs.writable.getWriter();
+    await writer.ready;
+    writer.write(header);
+    const BufferCtor = bufferType.prototype.constructor;
+    for (const points of outlines) {
+      const diffs = new BufferCtor(points.length - 2);
+      for (let i = 2, ii = points.length; i < ii; i++) {
+        diffs[i - 2] = points[i] - points[i - 2];
+      }
+      writer.write(diffs);
+    }
+    writer.close();
+    const bytes = await new Response(cs.readable).bytes();
+    return bytes.toBase64();
+  }
+  static async decompressSignature(signatureData) {
+    try {
+      const bytes = Uint8Array.fromBase64(signatureData);
+      const {
+        readable,
+        writable
+      } = new DecompressionStream("deflate-raw");
+      const writer = writable.getWriter();
+      await writer.ready;
+      writer.write(bytes).then(async () => {
+        await writer.ready;
+        await writer.close();
+      }).catch(() => {});
+      let data = null;
+      let offset = 0;
+      for await (const chunk of readable) {
+        data ||= new Uint8Array(new Uint32Array(chunk.buffer, 0, 4)[0]);
+        data.set(chunk, offset);
+        offset += chunk.length;
+      }
+      const header = new Uint32Array(data.buffer, 0, data.length >> 2);
+      const version = header[1];
+      if (version !== 0) {
+        throw new Error(`Invalid version: ${version}`);
+      }
+      const width = header[2];
+      const height = header[3];
+      const areContours = header[4] === 0;
+      const thickness = header[5];
+      const numberOfDrawings = header[6];
+      const bufferType = header[7];
+      const outlines = [];
+      const diffsOffset = (BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * numberOfDrawings) * Uint32Array.BYTES_PER_ELEMENT;
+      let diffs;
+      switch (bufferType) {
+        case Int8Array.BYTES_PER_ELEMENT:
+          diffs = new Int8Array(data.buffer, diffsOffset);
+          break;
+        case Int16Array.BYTES_PER_ELEMENT:
+          diffs = new Int16Array(data.buffer, diffsOffset);
+          break;
+        case Int32Array.BYTES_PER_ELEMENT:
+          diffs = new Int32Array(data.buffer, diffsOffset);
+          break;
+      }
+      offset = 0;
+      for (let i = 0; i < numberOfDrawings; i++) {
+        const len = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH];
+        const points = new Float32Array(len + 2);
+        outlines.push(points);
+        for (let j = 0; j < POINTS_PROPERTIES_NUMBER - 1; j++) {
+          points[j] = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH + j + 1];
+        }
+        for (let j = 0; j < len; j++) {
+          points[j + 2] = points[j] + diffs[offset++];
+        }
+      }
+      return {
+        areContours,
+        thickness,
+        outlines,
+        width,
+        height
+      };
+    } catch (e) {
+      warn(`decompressSignature: ${e}`);
+      return null;
+    }
+  }
+}
+
+;// ./src/display/editor/signature.js
+
+
+
+
+
+
+
+class SignatureOptions extends DrawingOptions {
+  constructor() {
+    super();
+    super.updateProperties({
+      fill: AnnotationEditor._defaultLineColor,
+      "stroke-width": 0
+    });
+  }
+  clone() {
+    const clone = new SignatureOptions();
+    clone.updateAll(this);
+    return clone;
+  }
+}
+class DrawnSignatureOptions extends InkDrawingOptions {
+  constructor(viewerParameters) {
+    super(viewerParameters);
+    super.updateProperties({
+      stroke: AnnotationEditor._defaultLineColor,
+      "stroke-width": 1
+    });
+  }
+  clone() {
+    const clone = new DrawnSignatureOptions(this._viewParameters);
+    clone.updateAll(this);
+    return clone;
+  }
+}
+class SignatureEditor extends DrawingEditor {
+  #isExtracted = false;
+  #description = null;
+  #signatureData = null;
+  #signatureUUID = null;
+  static _type = "signature";
+  static _editorType = AnnotationEditorType.SIGNATURE;
+  static _defaultDrawingOptions = null;
+  constructor(params) {
+    super({
+      ...params,
+      mustBeCommitted: true,
+      name: "signatureEditor"
+    });
+    this._willKeepAspectRatio = true;
+    this.#signatureData = params.signatureData || null;
+    this.#description = null;
+    this.defaultL10nId = "pdfjs-editor-signature-editor1";
+  }
+  static initialize(l10n, uiManager) {
+    AnnotationEditor.initialize(l10n, uiManager);
+    this._defaultDrawingOptions = new SignatureOptions();
+    this._defaultDrawnSignatureOptions = new DrawnSignatureOptions(uiManager.viewParameters);
+  }
+  static getDefaultDrawingOptions(options) {
+    const clone = this._defaultDrawingOptions.clone();
+    clone.updateProperties(options);
+    return clone;
+  }
+  static get supportMultipleDrawings() {
+    return false;
+  }
+  static get typesMap() {
+    return shadow(this, "typesMap", new Map());
+  }
+  static get isDrawer() {
+    return false;
+  }
+  get telemetryFinalData() {
+    return {
+      type: "signature",
+      hasDescription: !!this.#description
+    };
+  }
+  static computeTelemetryFinalData(data) {
+    const hasDescriptionStats = data.get("hasDescription");
+    return {
+      hasAltText: hasDescriptionStats.get(true) ?? 0,
+      hasNoAltText: hasDescriptionStats.get(false) ?? 0
+    };
+  }
+  get isResizable() {
+    return true;
+  }
+  onScaleChanging() {
+    if (this._drawId === null) {
+      return;
+    }
+    super.onScaleChanging();
+  }
+  render() {
+    if (this.div) {
+      return this.div;
+    }
+    let baseX, baseY;
+    const {
+      _isCopy
+    } = this;
+    if (_isCopy) {
+      this._isCopy = false;
+      baseX = this.x;
+      baseY = this.y;
+    }
+    super.render();
+    if (this._drawId === null) {
+      if (this.#signatureData) {
+        const {
+          lines,
+          mustSmooth,
+          areContours,
+          description,
+          uuid,
+          heightInPage
+        } = this.#signatureData;
+        const {
+          rawDims: {
+            pageWidth,
+            pageHeight
+          },
+          rotation
+        } = this.parent.viewport;
+        const outline = SignatureExtractor.processDrawnLines({
+          lines,
+          pageWidth,
+          pageHeight,
+          rotation,
+          innerMargin: SignatureEditor._INNER_MARGIN,
+          mustSmooth,
+          areContours
+        });
+        this.addSignature(outline, heightInPage, description, uuid);
+      } else {
+        this.div.setAttribute("data-l10n-args", JSON.stringify({
+          description: ""
+        }));
+        this.div.hidden = true;
+        this._uiManager.getSignature(this);
+      }
+    } else {
+      this.div.setAttribute("data-l10n-args", JSON.stringify({
+        description: this.#description || ""
+      }));
+    }
+    if (_isCopy) {
+      this._isCopy = true;
+      this._moveAfterPaste(baseX, baseY);
+    }
+    return this.div;
+  }
+  setUuid(uuid) {
+    this.#signatureUUID = uuid;
+    this.addEditToolbar();
+  }
+  getUuid() {
+    return this.#signatureUUID;
+  }
+  get description() {
+    return this.#description;
+  }
+  set description(description) {
+    this.#description = description;
+    if (!this.div) {
+      return;
+    }
+    this.div.setAttribute("data-l10n-args", JSON.stringify({
+      description
+    }));
+    super.addEditToolbar().then(toolbar => {
+      toolbar?.updateEditSignatureButton(description);
+    });
+  }
+  getSignaturePreview() {
+    const {
+      newCurves,
+      areContours,
+      thickness,
+      width,
+      height
+    } = this.#signatureData;
+    const maxDim = Math.max(width, height);
+    const outlineData = SignatureExtractor.processDrawnLines({
+      lines: {
+        curves: newCurves.map(points => ({
+          points
+        })),
+        thickness,
+        width,
+        height
+      },
+      pageWidth: maxDim,
+      pageHeight: maxDim,
+      rotation: 0,
+      innerMargin: 0,
+      mustSmooth: false,
+      areContours
+    });
+    return {
+      areContours,
+      outline: outlineData.outline
+    };
+  }
+  get toolbarButtons() {
+    if (this._uiManager.signatureManager) {
+      return [["editSignature", this._uiManager.signatureManager]];
+    }
+    return super.toolbarButtons;
+  }
+  addSignature(data, heightInPage, description, uuid) {
+    const {
+      x: savedX,
+      y: savedY
+    } = this;
+    const {
+      outline
+    } = this.#signatureData = data;
+    this.#isExtracted = outline instanceof ContourDrawOutline;
+    this.description = description;
+    let drawingOptions;
+    if (this.#isExtracted) {
+      drawingOptions = SignatureEditor.getDefaultDrawingOptions();
+    } else {
+      drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone();
+      drawingOptions.updateProperties({
+        "stroke-width": outline.thickness
+      });
+    }
+    this._addOutlines({
+      drawOutlines: outline,
+      drawingOptions
+    });
+    const [, pageHeight] = this.pageDimensions;
+    let newHeight = heightInPage / pageHeight;
+    newHeight = newHeight >= 1 ? 0.5 : newHeight;
+    this.width *= newHeight / this.height;
+    if (this.width >= 1) {
+      newHeight *= 0.9 / this.width;
+      this.width = 0.9;
+    }
+    this.height = newHeight;
+    this.setDims();
+    this.x = savedX;
+    this.y = savedY;
+    this.center();
+    this._onResized();
+    this.onScaleChanging();
+    this.rotate();
+    this._uiManager.addToAnnotationStorage(this);
+    this.setUuid(uuid);
+    this._reportTelemetry({
+      action: "pdfjs.signature.inserted",
+      data: {
+        hasBeenSaved: !!uuid,
+        hasDescription: !!description
+      }
+    });
+    this.div.hidden = false;
+  }
+  getFromImage(bitmap) {
+    const {
+      rawDims: {
+        pageWidth,
+        pageHeight
+      },
+      rotation
+    } = this.parent.viewport;
+    return SignatureExtractor.process(bitmap, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN);
+  }
+  getFromText(text, fontInfo) {
+    const {
+      rawDims: {
+        pageWidth,
+        pageHeight
+      },
+      rotation
+    } = this.parent.viewport;
+    return SignatureExtractor.extractContoursFromText(text, fontInfo, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN);
+  }
+  getDrawnSignature(curves) {
+    const {
+      rawDims: {
+        pageWidth,
+        pageHeight
+      },
+      rotation
+    } = this.parent.viewport;
+    return SignatureExtractor.processDrawnLines({
+      lines: curves,
+      pageWidth,
+      pageHeight,
+      rotation,
+      innerMargin: SignatureEditor._INNER_MARGIN,
+      mustSmooth: false,
+      areContours: false
+    });
+  }
+  createDrawingOptions({
+    areContours,
+    thickness
+  }) {
+    if (areContours) {
+      this._drawingOptions = SignatureEditor.getDefaultDrawingOptions();
+    } else {
+      this._drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone();
+      this._drawingOptions.updateProperties({
+        "stroke-width": thickness
+      });
+    }
+  }
+  serialize(isForCopying = false) {
+    if (this.isEmpty()) {
+      return null;
+    }
+    const {
+      lines,
+      points
+    } = this.serializeDraw(isForCopying);
+    const {
+      _drawingOptions: {
+        "stroke-width": thickness
+      }
+    } = this;
+    const serialized = Object.assign(super.serialize(isForCopying), {
+      isSignature: true,
+      areContours: this.#isExtracted,
+      color: [0, 0, 0],
+      thickness: this.#isExtracted ? 0 : thickness
+    });
+    this.addComment(serialized);
+    if (isForCopying) {
+      serialized.paths = {
+        lines,
+        points
+      };
+      serialized.uuid = this.#signatureUUID;
+      serialized.isCopy = true;
+    } else {
+      serialized.lines = lines;
+    }
+    if (this.#description) {
+      serialized.accessibilityData = {
+        type: "Figure",
+        alt: this.#description
+      };
+    }
+    return serialized;
+  }
+  static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) {
+    if (data.areContours) {
+      return ContourDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data);
+    }
+    return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data);
+  }
+  static async deserialize(data, parent, uiManager) {
+    const editor = await super.deserialize(data, parent, uiManager);
+    editor.#isExtracted = data.areContours;
+    editor.description = data.accessibilityData?.alt || "";
+    editor.#signatureUUID = data.uuid;
+    return editor;
+  }
+}
+
+;// ./src/display/editor/stamp.js
+
+
+
+
+class StampEditor extends AnnotationEditor {
+  #bitmap = null;
+  #bitmapId = null;
+  #bitmapPromise = null;
+  #bitmapUrl = null;
+  #bitmapFile = null;
+  #bitmapFileName = "";
+  #canvas = null;
+  #missingCanvas = false;
+  #resizeTimeoutId = null;
+  #isSvg = false;
+  #hasBeenAddedInUndoStack = false;
+  static _type = "stamp";
+  static _editorType = AnnotationEditorType.STAMP;
+  constructor(params) {
+    super({
+      ...params,
+      name: "stampEditor"
+    });
+    this.#bitmapUrl = params.bitmapUrl;
+    this.#bitmapFile = params.bitmapFile;
+    this.defaultL10nId = "pdfjs-editor-stamp-editor";
+  }
+  static initialize(l10n, uiManager) {
+    AnnotationEditor.initialize(l10n, uiManager);
+  }
+  static isHandlingMimeForPasting(mime) {
+    return SupportedImageMimeTypes.includes(mime);
+  }
+  static paste(item, parent) {
+    parent.pasteEditor({
+      mode: AnnotationEditorType.STAMP
+    }, {
+      bitmapFile: item.getAsFile()
+    });
+  }
+  altTextFinish() {
+    if (this._uiManager.useNewAltTextFlow) {
+      this.div.hidden = false;
+    }
+    super.altTextFinish();
+  }
+  get telemetryFinalData() {
+    return {
+      type: "stamp",
+      hasAltText: !!this.altTextData?.altText
+    };
+  }
+  static computeTelemetryFinalData(data) {
+    const hasAltTextStats = data.get("hasAltText");
+    return {
+      hasAltText: hasAltTextStats.get(true) ?? 0,
+      hasNoAltText: hasAltTextStats.get(false) ?? 0
+    };
+  }
+  #getBitmapFetched(data, fromId = false) {
+    if (!data) {
+      this.remove();
+      return;
+    }
+    this.#bitmap = data.bitmap;
+    if (!fromId) {
+      this.#bitmapId = data.id;
+      this.#isSvg = data.isSvg;
+    }
+    if (data.file) {
+      this.#bitmapFileName = data.file.name;
+    }
+    this.#createCanvas();
+  }
+  #getBitmapDone() {
+    this.#bitmapPromise = null;
+    this._uiManager.enableWaiting(false);
+    if (!this.#canvas) {
+      return;
+    }
+    if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) {
+      this.addEditToolbar().then(() => {
+        this._editToolbar.hide();
+        this._uiManager.editAltText(this, true);
+      });
+      return;
+    }
+    if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) {
+      this._reportTelemetry({
+        action: "pdfjs.image.image_added",
+        data: {
+          alt_text_modal: false,
+          alt_text_type: "empty"
+        }
+      });
+      try {
+        this.mlGuessAltText();
+      } catch {}
+    }
+    this.div.focus();
+  }
+  async mlGuessAltText(imageData = null, updateAltTextData = true) {
+    if (this.hasAltTextData()) {
+      return null;
+    }
+    const {
+      mlManager
+    } = this._uiManager;
+    if (!mlManager) {
+      throw new Error("No ML.");
+    }
+    if (!(await mlManager.isEnabledFor("altText"))) {
+      throw new Error("ML isn't enabled for alt text.");
+    }
+    const {
+      data,
+      width,
+      height
+    } = imageData || this.copyCanvas(null, null, true).imageData;
+    const response = await mlManager.guess({
+      name: "altText",
+      request: {
+        data,
+        width,
+        height,
+        channels: data.length / (width * height)
+      }
+    });
+    if (!response) {
+      throw new Error("No response from the AI service.");
+    }
+    if (response.error) {
+      throw new Error("Error from the AI service.");
+    }
+    if (response.cancel) {
+      return null;
+    }
+    if (!response.output) {
+      throw new Error("No valid response from the AI service.");
+    }
+    const altText = response.output;
+    await this.setGuessedAltText(altText);
+    if (updateAltTextData && !this.hasAltTextData()) {
+      this.altTextData = {
+        alt: altText,
+        decorative: false
+      };
+    }
+    return altText;
+  }
+  #getBitmap() {
+    if (this.#bitmapId) {
+      this._uiManager.enableWaiting(true);
+      this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone());
+      return;
+    }
+    if (this.#bitmapUrl) {
+      const url = this.#bitmapUrl;
+      this.#bitmapUrl = null;
+      this._uiManager.enableWaiting(true);
+      this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone());
+      return;
+    }
+    if (this.#bitmapFile) {
+      const file = this.#bitmapFile;
+      this.#bitmapFile = null;
+      this._uiManager.enableWaiting(true);
+      this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone());
+      return;
+    }
+    const input = document.createElement("input");
+    input.type = "file";
+    input.accept = SupportedImageMimeTypes.join(",");
+    const signal = this._uiManager._signal;
+    this.#bitmapPromise = new Promise(resolve => {
+      input.addEventListener("change", async () => {
+        if (!input.files || input.files.length === 0) {
+          this.remove();
+        } else {
+          this._uiManager.enableWaiting(true);
+          const data = await this._uiManager.imageManager.getFromFile(input.files[0]);
+          this._reportTelemetry({
+            action: "pdfjs.image.image_selected",
+            data: {
+              alt_text_modal: this._uiManager.useNewAltTextFlow
+            }
+          });
+          this.#getBitmapFetched(data);
+        }
+        resolve();
+      }, {
+        signal
+      });
+      input.addEventListener("cancel", () => {
+        this.remove();
+        resolve();
+      }, {
+        signal
+      });
+    }).finally(() => this.#getBitmapDone());
+    input.click();
+  }
+  remove() {
+    if (this.#bitmapId) {
+      this.#bitmap = null;
+      this._uiManager.imageManager.deleteId(this.#bitmapId);
+      this.#canvas?.remove();
+      this.#canvas = null;
+      if (this.#resizeTimeoutId) {
+        clearTimeout(this.#resizeTimeoutId);
+        this.#resizeTimeoutId = null;
+      }
+    }
+    super.remove();
+  }
+  rebuild() {
+    if (!this.parent) {
+      if (this.#bitmapId) {
+        this.#getBitmap();
+      }
+      return;
+    }
+    super.rebuild();
+    if (this.div === null) {
+      return;
+    }
+    if (this.#bitmapId && this.#canvas === null) {
+      this.#getBitmap();
+    }
+    if (!this.isAttachedToDOM) {
+      this.parent.add(this);
+    }
+  }
+  onceAdded(focus) {
+    this._isDraggable = true;
+    if (focus) {
+      this.div.focus();
+    }
+  }
+  isEmpty() {
+    return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId || this.#missingCanvas);
+  }
+  get toolbarButtons() {
+    return [["altText", this.createAltText()]];
+  }
+  get isResizable() {
+    return true;
+  }
+  render() {
+    if (this.div) {
+      return this.div;
+    }
+    let baseX, baseY;
+    if (this._isCopy) {
+      baseX = this.x;
+      baseY = this.y;
+    }
+    super.render();
+    this.div.hidden = true;
+    this.createAltText();
+    if (!this.#missingCanvas) {
+      if (this.#bitmap) {
+        this.#createCanvas();
+      } else {
+        this.#getBitmap();
+      }
+    }
+    if (this._isCopy) {
+      this._moveAfterPaste(baseX, baseY);
+    }
+    this._uiManager.addShouldRescale(this);
+    return this.div;
+  }
+  setCanvas(annotationElementId, canvas) {
+    const {
+      id: bitmapId,
+      bitmap
+    } = this._uiManager.imageManager.getFromCanvas(annotationElementId, canvas);
+    canvas.remove();
+    if (bitmapId && this._uiManager.imageManager.isValidId(bitmapId)) {
+      this.#bitmapId = bitmapId;
+      if (bitmap) {
+        this.#bitmap = bitmap;
+      }
+      this.#missingCanvas = false;
+      this.#createCanvas();
+    }
+  }
+  _onResized() {
+    this.onScaleChanging();
+  }
+  onScaleChanging() {
+    if (!this.parent) {
+      return;
+    }
+    if (this.#resizeTimeoutId !== null) {
+      clearTimeout(this.#resizeTimeoutId);
+    }
+    const TIME_TO_WAIT = 200;
+    this.#resizeTimeoutId = setTimeout(() => {
+      this.#resizeTimeoutId = null;
+      this.#drawBitmap();
+    }, TIME_TO_WAIT);
+  }
+  #createCanvas() {
+    const {
+      div
+    } = this;
+    let {
+      width,
+      height
+    } = this.#bitmap;
+    const [pageWidth, pageHeight] = this.pageDimensions;
+    const MAX_RATIO = 0.75;
+    if (this.width) {
+      width = this.width * pageWidth;
+      height = this.height * pageHeight;
+    } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) {
+      const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height);
+      width *= factor;
+      height *= factor;
+    }
+    this._uiManager.enableWaiting(false);
+    const canvas = this.#canvas = document.createElement("canvas");
+    canvas.setAttribute("role", "img");
+    this.addContainer(canvas);
+    this.width = width / pageWidth;
+    this.height = height / pageHeight;
+    this.setDims();
+    if (this._initialOptions?.isCentered) {
+      this.center();
+    } else {
+      this.fixAndSetPosition();
+    }
+    this._initialOptions = null;
+    if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) {
+      div.hidden = false;
+    }
+    this.#drawBitmap();
+    if (!this.#hasBeenAddedInUndoStack) {
+      this.parent.addUndoableEditor(this);
+      this.#hasBeenAddedInUndoStack = true;
+    }
+    this._reportTelemetry({
+      action: "inserted_image"
+    });
+    if (this.#bitmapFileName) {
+      this.div.setAttribute("aria-description", this.#bitmapFileName);
+    }
+    if (!this.annotationElementId) {
+      this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.stamp);
+    }
+  }
+  copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) {
+    if (!maxDataDimension) {
+      maxDataDimension = 224;
+    }
+    const {
+      width: bitmapWidth,
+      height: bitmapHeight
+    } = this.#bitmap;
+    const outputScale = new OutputScale();
+    let bitmap = this.#bitmap;
+    let width = bitmapWidth,
+      height = bitmapHeight;
+    let canvas = null;
+    if (maxPreviewDimension) {
+      if (bitmapWidth > maxPreviewDimension || bitmapHeight > maxPreviewDimension) {
+        const ratio = Math.min(maxPreviewDimension / bitmapWidth, maxPreviewDimension / bitmapHeight);
+        width = Math.floor(bitmapWidth * ratio);
+        height = Math.floor(bitmapHeight * ratio);
+      }
+      canvas = document.createElement("canvas");
+      const scaledWidth = canvas.width = Math.ceil(width * outputScale.sx);
+      const scaledHeight = canvas.height = Math.ceil(height * outputScale.sy);
+      if (!this.#isSvg) {
+        bitmap = this.#scaleBitmap(scaledWidth, scaledHeight);
+      }
+      const ctx = canvas.getContext("2d");
+      ctx.filter = this._uiManager.hcmFilter;
+      let white = "white",
+        black = "#cfcfd8";
+      if (this._uiManager.hcmFilter !== "none") {
+        black = "black";
+      } else if (ColorScheme.isDarkMode) {
+        white = "#8f8f9d";
+        black = "#42414d";
+      }
+      const boxDim = 15;
+      const boxDimWidth = boxDim * outputScale.sx;
+      const boxDimHeight = boxDim * outputScale.sy;
+      const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2);
+      const patternCtx = pattern.getContext("2d");
+      patternCtx.fillStyle = white;
+      patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2);
+      patternCtx.fillStyle = black;
+      patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight);
+      patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight);
+      ctx.fillStyle = ctx.createPattern(pattern, "repeat");
+      ctx.fillRect(0, 0, scaledWidth, scaledHeight);
+      ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight);
+    }
+    let imageData = null;
+    if (createImageData) {
+      let dataWidth, dataHeight;
+      if (outputScale.symmetric && bitmap.width < maxDataDimension && bitmap.height < maxDataDimension) {
+        dataWidth = bitmap.width;
+        dataHeight = bitmap.height;
+      } else {
+        bitmap = this.#bitmap;
+        if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) {
+          const ratio = Math.min(maxDataDimension / bitmapWidth, maxDataDimension / bitmapHeight);
+          dataWidth = Math.floor(bitmapWidth * ratio);
+          dataHeight = Math.floor(bitmapHeight * ratio);
+          if (!this.#isSvg) {
+            bitmap = this.#scaleBitmap(dataWidth, dataHeight);
+          }
+        }
+      }
+      const offscreen = new OffscreenCanvas(dataWidth, dataHeight);
+      const offscreenCtx = offscreen.getContext("2d", {
+        willReadFrequently: true
+      });
+      offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, dataWidth, dataHeight);
+      imageData = {
+        width: dataWidth,
+        height: dataHeight,
+        data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data
+      };
+    }
+    return {
+      canvas,
+      width,
+      height,
+      imageData
+    };
+  }
+  #scaleBitmap(width, height) {
+    const {
+      width: bitmapWidth,
+      height: bitmapHeight
+    } = this.#bitmap;
+    let newWidth = bitmapWidth;
+    let newHeight = bitmapHeight;
+    let bitmap = this.#bitmap;
+    while (newWidth > 2 * width || newHeight > 2 * height) {
+      const prevWidth = newWidth;
+      const prevHeight = newHeight;
+      if (newWidth > 2 * width) {
+        newWidth = Math.ceil(newWidth / 2);
+      }
+      if (newHeight > 2 * height) {
+        newHeight = Math.ceil(newHeight / 2);
+      }
+      const offscreen = new OffscreenCanvas(newWidth, newHeight);
+      const ctx = offscreen.getContext("2d");
+      ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight);
+      bitmap = offscreen.transferToImageBitmap();
+    }
+    return bitmap;
+  }
+  #drawBitmap() {
+    const [parentWidth, parentHeight] = this.parentDimensions;
+    const {
+      width,
+      height
+    } = this;
+    const outputScale = new OutputScale();
+    const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx);
+    const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy);
+    const canvas = this.#canvas;
+    if (!canvas || canvas.width === scaledWidth && canvas.height === scaledHeight) {
+      return;
+    }
+    canvas.width = scaledWidth;
+    canvas.height = scaledHeight;
+    const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(scaledWidth, scaledHeight);
+    const ctx = canvas.getContext("2d");
+    ctx.filter = this._uiManager.hcmFilter;
+    ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight);
+  }
+  #serializeBitmap(toUrl) {
+    if (toUrl) {
+      if (this.#isSvg) {
+        const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId);
+        if (url) {
+          return url;
+        }
+      }
+      const canvas = document.createElement("canvas");
+      ({
+        width: canvas.width,
+        height: canvas.height
+      } = this.#bitmap);
+      const ctx = canvas.getContext("2d");
+      ctx.drawImage(this.#bitmap, 0, 0);
+      return canvas.toDataURL();
+    }
+    if (this.#isSvg) {
+      const [pageWidth, pageHeight] = this.pageDimensions;
+      const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS);
+      const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS);
+      const offscreen = new OffscreenCanvas(width, height);
+      const ctx = offscreen.getContext("2d");
+      ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height);
+      return offscreen.transferToImageBitmap();
+    }
+    return structuredClone(this.#bitmap);
+  }
+  static async deserialize(data, parent, uiManager) {
+    let initialData = null;
+    let missingCanvas = false;
+    if (data instanceof StampAnnotationElement) {
+      const {
+        data: {
+          rect,
+          rotation,
+          id,
+          structParent,
+          popupRef,
+          richText,
+          contentsObj,
+          creationDate,
+          modificationDate
+        },
+        container,
+        parent: {
+          page: {
+            pageNumber
+          }
+        },
+        canvas
+      } = data;
+      let bitmapId, bitmap;
+      if (canvas) {
+        delete data.canvas;
+        ({
+          id: bitmapId,
+          bitmap
+        } = uiManager.imageManager.getFromCanvas(container.id, canvas));
+        canvas.remove();
+      } else {
+        missingCanvas = true;
+        data._hasNoCanvas = true;
+      }
+      const altText = (await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`))?.get("aria-label") || "";
+      initialData = data = {
+        annotationType: AnnotationEditorType.STAMP,
+        bitmapId,
+        bitmap,
+        pageIndex: pageNumber - 1,
+        rect: rect.slice(0),
+        rotation,
+        annotationElementId: id,
+        id,
+        deleted: false,
+        accessibilityData: {
+          decorative: false,
+          altText
+        },
+        isSvg: false,
+        structParent,
+        popupRef,
+        richText,
+        comment: contentsObj?.str || null,
+        creationDate,
+        modificationDate
+      };
+    }
+    const editor = await super.deserialize(data, parent, uiManager);
+    const {
+      rect,
+      bitmap,
+      bitmapUrl,
+      bitmapId,
+      isSvg,
+      accessibilityData
+    } = data;
+    if (missingCanvas) {
+      uiManager.addMissingCanvas(data.id, editor);
+      editor.#missingCanvas = true;
+    } else if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) {
+      editor.#bitmapId = bitmapId;
+      if (bitmap) {
+        editor.#bitmap = bitmap;
+      }
+    } else {
+      editor.#bitmapUrl = bitmapUrl;
+    }
+    editor.#isSvg = isSvg;
+    const [parentWidth, parentHeight] = editor.pageDimensions;
+    editor.width = (rect[2] - rect[0]) / parentWidth;
+    editor.height = (rect[3] - rect[1]) / parentHeight;
+    if (accessibilityData) {
+      editor.altTextData = accessibilityData;
+    }
+    editor._initialData = initialData;
+    if (data.comment) {
+      editor.setCommentData(data);
+    }
+    editor.#hasBeenAddedInUndoStack = !!initialData;
+    return editor;
+  }
+  serialize(isForCopying = false, context = null) {
+    if (this.isEmpty()) {
+      return null;
+    }
+    if (this.deleted) {
+      return this.serializeDeleted();
+    }
+    const serialized = Object.assign(super.serialize(isForCopying), {
+      bitmapId: this.#bitmapId,
+      isSvg: this.#isSvg
+    });
+    this.addComment(serialized);
+    if (isForCopying) {
+      serialized.bitmapUrl = this.#serializeBitmap(true);
+      serialized.accessibilityData = this.serializeAltText(true);
+      serialized.isCopy = true;
+      return serialized;
+    }
+    const {
+      decorative,
+      altText
+    } = this.serializeAltText(false);
+    if (!decorative && altText) {
+      serialized.accessibilityData = {
+        type: "Figure",
+        alt: altText
+      };
+    }
+    if (this.annotationElementId) {
+      const changes = this.#hasElementChanged(serialized);
+      if (changes.isSame) {
+        return null;
+      }
+      if (changes.isSameAltText) {
+        delete serialized.accessibilityData;
+      } else {
+        serialized.accessibilityData.structParent = this._initialData.structParent ?? -1;
+      }
+      serialized.id = this.annotationElementId;
+      delete serialized.bitmapId;
+      return serialized;
+    }
+    if (context === null) {
+      return serialized;
+    }
+    context.stamps ||= new Map();
+    const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null;
+    if (!context.stamps.has(this.#bitmapId)) {
+      context.stamps.set(this.#bitmapId, {
+        area,
+        serialized
+      });
+      serialized.bitmap = this.#serializeBitmap(false);
+    } else if (this.#isSvg) {
+      const prevData = context.stamps.get(this.#bitmapId);
+      if (area > prevData.area) {
+        prevData.area = area;
+        prevData.serialized.bitmap.close();
+        prevData.serialized.bitmap = this.#serializeBitmap(false);
+      }
+    }
+    return serialized;
+  }
+  #hasElementChanged(serialized) {
+    const {
+      pageIndex,
+      accessibilityData: {
+        altText
+      }
+    } = this._initialData;
+    const isSamePageIndex = serialized.pageIndex === pageIndex;
+    const isSameAltText = (serialized.accessibilityData?.alt || "") === altText;
+    return {
+      isSame: !this.hasEditedComment && !this._hasBeenMoved && !this._hasBeenResized && isSamePageIndex && isSameAltText,
+      isSameAltText
+    };
+  }
+  renderAnnotationElement(annotation) {
+    if (this.deleted) {
+      annotation.hide();
+      return null;
+    }
+    annotation.updateEdited({
+      rect: this.getPDFRect(),
+      popup: this.comment
+    });
+    return null;
+  }
+}
+
+;// ./src/display/editor/annotation_editor_layer.js
+
+
+
+
+
+
+
+
+class AnnotationEditorLayer {
+  #accessibilityManager;
+  #allowClick = false;
+  #annotationLayer = null;
+  #clickAC = null;
+  #editorFocusTimeoutId = null;
+  #editors = new Map();
+  #hadPointerDown = false;
+  #isDisabling = false;
+  #isEnabling = false;
+  #drawingAC = null;
+  #focusedElement = null;
+  #textLayer = null;
+  #textSelectionAC = null;
+  #textLayerDblClickAC = null;
+  #lastPointerDownTimestamp = -1;
+  #uiManager;
+  static _initialized = false;
+  static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor, SignatureEditor].map(type => [type._editorType, type]));
+  constructor({
+    uiManager,
+    pageIndex,
+    div,
+    structTreeLayer,
+    accessibilityManager,
+    annotationLayer,
+    drawLayer,
+    textLayer,
+    viewport,
+    l10n
+  }) {
+    const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()];
+    if (!AnnotationEditorLayer._initialized) {
+      AnnotationEditorLayer._initialized = true;
+      for (const editorType of editorTypes) {
+        editorType.initialize(l10n, uiManager);
+      }
+    }
+    uiManager.registerEditorTypes(editorTypes);
+    this.#uiManager = uiManager;
+    this.pageIndex = pageIndex;
+    this.div = div;
+    this.#accessibilityManager = accessibilityManager;
+    this.#annotationLayer = annotationLayer;
+    this.viewport = viewport;
+    this.#textLayer = textLayer;
+    this.drawLayer = drawLayer;
+    this._structTree = structTreeLayer;
+    this.#uiManager.addLayer(this);
+  }
+  get isEmpty() {
+    return this.#editors.size === 0;
+  }
+  get isInvisible() {
+    return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE;
+  }
+  updateToolbar(options) {
+    this.#uiManager.updateToolbar(options);
+  }
+  updateMode(mode = this.#uiManager.getMode()) {
+    this.#cleanup();
+    switch (mode) {
+      case AnnotationEditorType.NONE:
+        this.div.classList.toggle("nonEditing", true);
+        this.disableTextSelection();
+        this.togglePointerEvents(false);
+        this.toggleAnnotationLayerPointerEvents(true);
+        this.disableClick();
+        return;
+      case AnnotationEditorType.INK:
+        this.disableTextSelection();
+        this.togglePointerEvents(true);
+        this.enableClick();
+        break;
+      case AnnotationEditorType.HIGHLIGHT:
+        this.enableTextSelection();
+        this.togglePointerEvents(false);
+        this.disableClick();
+        break;
+      default:
+        this.disableTextSelection();
+        this.togglePointerEvents(true);
+        this.enableClick();
+    }
+    this.toggleAnnotationLayerPointerEvents(false);
+    const {
+      classList
+    } = this.div;
+    classList.toggle("nonEditing", false);
+    if (mode === AnnotationEditorType.POPUP) {
+      classList.toggle("commentEditing", true);
+    } else {
+      classList.toggle("commentEditing", false);
+      for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {
+        classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType);
+      }
+    }
+    this.div.hidden = false;
+  }
+  hasTextLayer(textLayer) {
+    return textLayer === this.#textLayer?.div;
+  }
+  setEditingState(isEditing) {
+    this.#uiManager.setEditingState(isEditing);
+  }
+  addCommands(params) {
+    this.#uiManager.addCommands(params);
+  }
+  cleanUndoStack(type) {
+    this.#uiManager.cleanUndoStack(type);
+  }
+  toggleDrawing(enabled = false) {
+    this.div.classList.toggle("drawing", !enabled);
+  }
+  togglePointerEvents(enabled = false) {
+    this.div.classList.toggle("disabled", !enabled);
+  }
+  toggleAnnotationLayerPointerEvents(enabled = false) {
+    this.#annotationLayer?.togglePointerEvents(enabled);
+  }
+  get #allEditorsIterator() {
+    return this.#editors.size !== 0 ? this.#editors.values() : this.#uiManager.getEditors(this.pageIndex);
+  }
+  async enable() {
+    this.#isEnabling = true;
+    this.div.tabIndex = 0;
+    this.togglePointerEvents(true);
+    this.div.classList.toggle("nonEditing", false);
+    this.#textLayerDblClickAC?.abort();
+    this.#textLayerDblClickAC = null;
+    const annotationElementIds = new Set();
+    for (const editor of this.#allEditorsIterator) {
+      editor.enableEditing();
+      editor.show(true);
+      if (editor.annotationElementId) {
+        this.#uiManager.removeChangedExistingAnnotation(editor);
+        annotationElementIds.add(editor.annotationElementId);
+      }
+    }
+    const annotationLayer = this.#annotationLayer;
+    if (annotationLayer) {
+      for (const editable of annotationLayer.getEditableAnnotations()) {
+        editable.hide();
+        if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) {
+          continue;
+        }
+        if (annotationElementIds.has(editable.data.id)) {
+          continue;
+        }
+        const editor = await this.deserialize(editable);
+        if (!editor) {
+          continue;
+        }
+        this.addOrRebuild(editor);
+        editor.enableEditing();
+      }
+    }
+    this.#isEnabling = false;
+    this.#uiManager._eventBus.dispatch("editorsrendered", {
+      source: this,
+      pageNumber: this.pageIndex + 1
+    });
+  }
+  disable() {
+    this.#isDisabling = true;
+    this.div.tabIndex = -1;
+    this.togglePointerEvents(false);
+    this.div.classList.toggle("nonEditing", true);
+    if (this.#textLayer && !this.#textLayerDblClickAC) {
+      this.#textLayerDblClickAC = new AbortController();
+      const signal = this.#uiManager.combinedSignal(this.#textLayerDblClickAC);
+      this.#textLayer.div.addEventListener("pointerdown", e => {
+        const DBL_CLICK_THRESHOLD = 500;
+        const {
+          clientX,
+          clientY,
+          timeStamp
+        } = e;
+        const lastPointerDownTimestamp = this.#lastPointerDownTimestamp;
+        if (timeStamp - lastPointerDownTimestamp > DBL_CLICK_THRESHOLD) {
+          this.#lastPointerDownTimestamp = timeStamp;
+          return;
+        }
+        this.#lastPointerDownTimestamp = -1;
+        const {
+          classList
+        } = this.div;
+        classList.toggle("getElements", true);
+        const elements = document.elementsFromPoint(clientX, clientY);
+        classList.toggle("getElements", false);
+        if (!this.div.contains(elements[0])) {
+          return;
+        }
+        let id;
+        const regex = new RegExp(`^${AnnotationEditorPrefix}[0-9]+$`);
+        for (const element of elements) {
+          if (regex.test(element.id)) {
+            id = element.id;
+            break;
+          }
+        }
+        if (!id) {
+          return;
+        }
+        const editor = this.#editors.get(id);
+        if (editor?.annotationElementId === null) {
+          stopEvent(e);
+          editor.dblclick(e);
+        }
+      }, {
+        signal,
+        capture: true
+      });
+    }
+    const annotationLayer = this.#annotationLayer;
+    const needFakeAnnotation = [];
+    if (annotationLayer) {
+      const changedAnnotations = new Map();
+      const resetAnnotations = new Map();
+      for (const editor of this.#allEditorsIterator) {
+        editor.disableEditing();
+        if (!editor.annotationElementId) {
+          needFakeAnnotation.push(editor);
+          continue;
+        }
+        if (editor.serialize() !== null) {
+          changedAnnotations.set(editor.annotationElementId, editor);
+          continue;
+        } else {
+          resetAnnotations.set(editor.annotationElementId, editor);
+        }
+        this.getEditableAnnotation(editor.annotationElementId)?.show();
+        editor.remove();
+      }
+      for (const editable of annotationLayer.getEditableAnnotations()) {
+        const {
+          id
+        } = editable.data;
+        if (this.#uiManager.isDeletedAnnotationElement(id)) {
+          editable.updateEdited({
+            deleted: true
+          });
+          continue;
+        }
+        let editor = resetAnnotations.get(id);
+        if (editor) {
+          editor.resetAnnotationElement(editable);
+          editor.show(false);
+          editable.show();
+          continue;
+        }
+        editor = changedAnnotations.get(id);
+        if (editor) {
+          this.#uiManager.addChangedExistingAnnotation(editor);
+          if (editor.renderAnnotationElement(editable)) {
+            editor.show(false);
+          }
+        }
+        editable.show();
+      }
+    }
+    this.#cleanup();
+    if (this.isEmpty) {
+      this.div.hidden = true;
+    }
+    const {
+      classList
+    } = this.div;
+    for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {
+      classList.remove(`${editorType._type}Editing`);
+    }
+    this.disableTextSelection();
+    this.toggleAnnotationLayerPointerEvents(true);
+    annotationLayer?.updateFakeAnnotations(needFakeAnnotation);
+    this.#isDisabling = false;
+  }
+  getEditableAnnotation(id) {
+    return this.#annotationLayer?.getEditableAnnotation(id) || null;
+  }
+  setActiveEditor(editor) {
+    const currentActive = this.#uiManager.getActive();
+    if (currentActive === editor) {
+      return;
+    }
+    this.#uiManager.setActiveEditor(editor);
+  }
+  enableTextSelection() {
+    this.div.tabIndex = -1;
+    if (this.#textLayer?.div && !this.#textSelectionAC) {
+      this.#textSelectionAC = new AbortController();
+      const signal = this.#uiManager.combinedSignal(this.#textSelectionAC);
+      this.#textLayer.div.addEventListener("pointerdown", this.#textLayerPointerDown.bind(this), {
+        signal
+      });
+      this.#textLayer.div.classList.add("highlighting");
+    }
+  }
+  disableTextSelection() {
+    this.div.tabIndex = 0;
+    if (this.#textLayer?.div && this.#textSelectionAC) {
+      this.#textSelectionAC.abort();
+      this.#textSelectionAC = null;
+      this.#textLayer.div.classList.remove("highlighting");
+    }
+  }
+  #textLayerPointerDown(event) {
+    this.#uiManager.unselectAll();
+    const {
+      target
+    } = event;
+    if (target === this.#textLayer.div || (target.getAttribute("role") === "img" || target.classList.contains("endOfContent") || target.classList.contains("textLayerImages") || target.classList.contains("textLayerImagePlaceholder")) && this.#textLayer.div.contains(target)) {
+      const {
+        isMac
+      } = FeatureTest.platform;
+      if (event.button !== 0 || event.ctrlKey && isMac) {
+        return;
+      }
+      this.#uiManager.showAllEditors("highlight", true, true);
+      this.#textLayer.div.classList.add("free");
+      this.toggleDrawing();
+      HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", {
+        target: this.#textLayer.div,
+        x: event.x,
+        y: event.y
+      });
+      this.#textLayer.div.addEventListener("pointerup", () => {
+        this.#textLayer.div.classList.remove("free");
+        this.toggleDrawing(true);
+      }, {
+        once: true,
+        signal: this.#uiManager._signal
+      });
+      event.preventDefault();
+    }
+  }
+  enableClick() {
+    if (this.#clickAC) {
+      return;
+    }
+    this.#clickAC = new AbortController();
+    const signal = this.#uiManager.combinedSignal(this.#clickAC);
+    this.div.addEventListener("pointerdown", this.pointerdown.bind(this), {
+      signal
+    });
+    const pointerup = this.pointerup.bind(this);
+    this.div.addEventListener("pointerup", pointerup, {
+      signal
+    });
+    this.div.addEventListener("pointercancel", pointerup, {
+      signal
+    });
+  }
+  disableClick() {
+    this.#clickAC?.abort();
+    this.#clickAC = null;
+  }
+  attach(editor) {
+    this.#editors.set(editor.id, editor);
+    const {
+      annotationElementId
+    } = editor;
+    if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) {
+      this.#uiManager.removeDeletedAnnotationElement(editor);
+    }
+  }
+  detach(editor) {
+    this.#editors.delete(editor.id);
+    this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);
+    if (!this.#isDisabling && editor.annotationElementId) {
+      this.#uiManager.addDeletedAnnotationElement(editor);
+    }
+  }
+  remove(editor) {
+    this.detach(editor);
+    this.#uiManager.removeEditor(editor);
+    editor.div.remove();
+    editor.isAttachedToDOM = false;
+  }
+  changeParent(editor) {
+    if (editor.parent === this) {
+      return;
+    }
+    if (editor.parent && editor.annotationElementId) {
+      this.#uiManager.addDeletedAnnotationElement(editor);
+      AnnotationEditor.deleteAnnotationElement(editor);
+      editor.annotationElementId = null;
+    }
+    this.attach(editor);
+    editor.parent?.detach(editor);
+    editor.setParent(this);
+    if (editor.div && editor.isAttachedToDOM) {
+      editor.div.remove();
+      this.div.append(editor.div);
+    }
+  }
+  add(editor) {
+    if (editor.parent === this && editor.isAttachedToDOM) {
+      return;
+    }
+    this.changeParent(editor);
+    this.#uiManager.addEditor(editor);
+    this.attach(editor);
+    if (!editor.isAttachedToDOM) {
+      const div = editor.render();
+      this.div.append(div);
+      editor.isAttachedToDOM = true;
+    }
+    editor.fixAndSetPosition();
+    editor.onceAdded(!this.#isEnabling);
+    this.#uiManager.addToAnnotationStorage(editor);
+    editor._reportTelemetry(editor.telemetryInitialData);
+  }
+  moveEditorInDOM(editor) {
+    if (!editor.isAttachedToDOM) {
+      return;
+    }
+    const {
+      activeElement
+    } = document;
+    if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) {
+      editor._focusEventsAllowed = false;
+      this.#editorFocusTimeoutId = setTimeout(() => {
+        this.#editorFocusTimeoutId = null;
+        if (!editor.div.contains(document.activeElement)) {
+          editor.div.addEventListener("focusin", () => {
+            editor._focusEventsAllowed = true;
+          }, {
+            once: true,
+            signal: this.#uiManager._signal
+          });
+          activeElement.focus();
+        } else {
+          editor._focusEventsAllowed = true;
+        }
+      }, 0);
+    }
+    editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true);
+  }
+  addOrRebuild(editor) {
+    if (editor.needsToBeRebuilt()) {
+      editor.parent ||= this;
+      editor.rebuild();
+      editor.show();
+    } else {
+      this.add(editor);
+    }
+  }
+  addUndoableEditor(editor) {
+    const cmd = () => editor._uiManager.rebuild(editor);
+    const undo = () => {
+      editor.remove();
+    };
+    this.addCommands({
+      cmd,
+      undo,
+      mustExec: false
+    });
+  }
+  getEditorByUID(uid) {
+    for (const editor of this.#editors.values()) {
+      if (editor.uid === uid) {
+        return editor;
+      }
+    }
+    return null;
+  }
+  get #currentEditorType() {
+    return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode());
+  }
+  combinedSignal(ac) {
+    return this.#uiManager.combinedSignal(ac);
+  }
+  #createNewEditor(params) {
+    const editorType = this.#currentEditorType;
+    return editorType ? new editorType.prototype.constructor(params) : null;
+  }
+  canCreateNewEmptyEditor() {
+    return this.#currentEditorType?.canCreateNewEmptyEditor();
+  }
+  async pasteEditor(options, params) {
+    this.updateToolbar(options);
+    await this.#uiManager.updateMode(options.mode);
+    const {
+      offsetX,
+      offsetY
+    } = this.#getCenterPoint();
+    const id = this.#uiManager.getId();
+    const editor = this.#createNewEditor({
+      parent: this,
+      id,
+      x: offsetX,
+      y: offsetY,
+      uiManager: this.#uiManager,
+      isCentered: true,
+      ...params
+    });
+    if (editor) {
+      this.add(editor);
+    }
+  }
+  async deserialize(data) {
+    return (await AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager)) || null;
+  }
+  createAndAddNewEditor(event, isCentered, data = {}) {
+    const id = this.#uiManager.getId();
+    const editor = this.#createNewEditor({
+      parent: this,
+      id,
+      x: event.offsetX,
+      y: event.offsetY,
+      uiManager: this.#uiManager,
+      isCentered,
+      ...data
+    });
+    if (editor) {
+      this.add(editor);
+    }
+    return editor;
+  }
+  get boundingClientRect() {
+    return this.div.getBoundingClientRect();
+  }
+  #getCenterPoint() {
+    const {
+      x,
+      y,
+      width,
+      height
+    } = this.boundingClientRect;
+    const tlX = Math.max(0, x);
+    const tlY = Math.max(0, y);
+    const brX = Math.min(window.innerWidth, x + width);
+    const brY = Math.min(window.innerHeight, y + height);
+    const centerX = (tlX + brX) / 2 - x;
+    const centerY = (tlY + brY) / 2 - y;
+    const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX];
+    return {
+      offsetX,
+      offsetY
+    };
+  }
+  addNewEditor(data = {}) {
+    this.createAndAddNewEditor(this.#getCenterPoint(), true, data);
+  }
+  setSelected(editor) {
+    this.#uiManager.setSelected(editor);
+  }
+  toggleSelected(editor) {
+    this.#uiManager.toggleSelected(editor);
+  }
+  unselect(editor) {
+    this.#uiManager.unselect(editor);
+  }
+  pointerup(event) {
+    const {
+      isMac
+    } = FeatureTest.platform;
+    if (event.button !== 0 || event.ctrlKey && isMac) {
+      return;
+    }
+    if (event.target !== this.div) {
+      return;
+    }
+    if (!this.#hadPointerDown) {
+      return;
+    }
+    this.#hadPointerDown = false;
+    if (this.#currentEditorType?.isDrawer && this.#currentEditorType.supportMultipleDrawings) {
+      return;
+    }
+    if (!this.#allowClick) {
+      this.#allowClick = true;
+      return;
+    }
+    const currentMode = this.#uiManager.getMode();
+    if (currentMode === AnnotationEditorType.STAMP || currentMode === AnnotationEditorType.POPUP || currentMode === AnnotationEditorType.SIGNATURE) {
+      this.#uiManager.unselectAll();
+      return;
+    }
+    this.createAndAddNewEditor(event, false);
+  }
+  pointerdown(event) {
+    if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) {
+      this.enableTextSelection();
+    }
+    if (this.#hadPointerDown) {
+      this.#hadPointerDown = false;
+      return;
+    }
+    const {
+      isMac
+    } = FeatureTest.platform;
+    if (event.button !== 0 || event.ctrlKey && isMac) {
+      return;
+    }
+    if (event.target !== this.div) {
+      return;
+    }
+    this.#hadPointerDown = true;
+    if (this.#currentEditorType?.isDrawer) {
+      this.startDrawingSession(event);
+      return;
+    }
+    const editor = this.#uiManager.getActive();
+    this.#allowClick = !editor || editor.isEmpty();
+  }
+  startDrawingSession(event) {
+    this.div.focus({
+      preventScroll: true
+    });
+    if (this.#drawingAC) {
+      this.#currentEditorType.startDrawing(this, this.#uiManager, false, event);
+      return;
+    }
+    this.#uiManager.setCurrentDrawingSession(this);
+    this.#drawingAC = new AbortController();
+    const signal = this.#uiManager.combinedSignal(this.#drawingAC);
+    this.div.addEventListener("blur", ({
+      relatedTarget
+    }) => {
+      if (relatedTarget && !this.div.contains(relatedTarget)) {
+        this.#focusedElement = null;
+        this.commitOrRemove();
+      }
+    }, {
+      signal
+    });
+    this.#currentEditorType.startDrawing(this, this.#uiManager, false, event);
+  }
+  pause(on) {
+    if (on) {
+      const {
+        activeElement
+      } = document;
+      if (this.div.contains(activeElement)) {
+        this.#focusedElement = activeElement;
+      }
+      return;
+    }
+    if (this.#focusedElement) {
+      setTimeout(() => {
+        this.#focusedElement?.focus();
+        this.#focusedElement = null;
+      }, 0);
+    }
+  }
+  endDrawingSession(isAborted = false) {
+    if (!this.#drawingAC) {
+      return null;
+    }
+    this.#uiManager.setCurrentDrawingSession(null);
+    this.#drawingAC.abort();
+    this.#drawingAC = null;
+    this.#focusedElement = null;
+    return this.#currentEditorType.endDrawing(isAborted);
+  }
+  findNewParent(editor, x, y) {
+    const layer = this.#uiManager.findParent(x, y);
+    if (layer === null || layer === this) {
+      return false;
+    }
+    layer.changeParent(editor);
+    return true;
+  }
+  commitOrRemove() {
+    if (this.#drawingAC) {
+      this.endDrawingSession();
+      return true;
+    }
+    return false;
+  }
+  onScaleChanging() {
+    if (!this.#drawingAC) {
+      return;
+    }
+    this.#currentEditorType.onScaleChangingWhenDrawing(this);
+  }
+  destroy() {
+    this.commitOrRemove();
+    if (this.#uiManager.getActive()?.parent === this) {
+      this.#uiManager.commitOrRemove();
+      this.#uiManager.setActiveEditor(null);
+    }
+    if (this.#editorFocusTimeoutId) {
+      clearTimeout(this.#editorFocusTimeoutId);
+      this.#editorFocusTimeoutId = null;
+    }
+    for (const editor of this.#editors.values()) {
+      this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);
+      editor.setParent(null);
+      editor.isAttachedToDOM = false;
+      editor.div.remove();
+    }
+    this.div = null;
+    this.#editors.clear();
+    this.#uiManager.removeLayer(this);
+  }
+  #cleanup() {
+    for (const editor of this.#editors.values()) {
+      if (editor.isEmpty()) {
+        editor.remove();
+      }
+    }
+  }
+  async render({
+    viewport
+  }) {
+    this.viewport = viewport;
+    setLayerDimensions(this.div, viewport);
+    for (const editor of this.#uiManager.getEditors(this.pageIndex)) {
+      this.add(editor);
+      editor.rebuild();
+    }
+    await this.#uiManager.findClonesForPage(this);
+    this.div.hidden = this.isEmpty;
+    this.updateMode();
+  }
+  update({
+    viewport
+  }) {
+    this.#uiManager.commitOrRemove();
+    this.#cleanup();
+    const oldRotation = this.viewport.rotation;
+    const rotation = viewport.rotation;
+    this.viewport = viewport;
+    setLayerDimensions(this.div, {
+      rotation
+    });
+    if (oldRotation !== rotation) {
+      for (const editor of this.#editors.values()) {
+        editor.rotate(rotation);
+      }
+    }
+  }
+  get pageDimensions() {
+    const {
+      pageWidth,
+      pageHeight
+    } = this.viewport.rawDims;
+    return [pageWidth, pageHeight];
+  }
+  get scale() {
+    return this.#uiManager.viewParameters.realScale;
+  }
+}
+
+;// ./src/display/draw_layer.js
+
+
+function compareTextLayers(a, b) {
+  if (a === b) {
+    return 0;
+  }
+  return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;
+}
+function getTextLayer(node) {
+  if (!node) {
+    return null;
+  }
+  if (node.nodeType === Node.ELEMENT_NODE) {
+    return node.closest(".textLayer");
+  }
+  return node.parentElement?.closest(".textLayer") || null;
+}
+function isPointBefore(nodeA, offsetA, nodeB, offsetB) {
+  if (nodeA === nodeB) {
+    return offsetA <= offsetB;
+  }
+  const relation = nodeA.compareDocumentPosition(nodeB);
+  if (relation & Node.DOCUMENT_POSITION_FOLLOWING) {
+    return true;
+  }
+  if (relation & Node.DOCUMENT_POSITION_PRECEDING) {
+    return false;
+  }
+  return null;
+}
+function normalizeEdgeBoundary(container, offset, textLayer) {
+  if (container.nodeType !== Node.ELEMENT_NODE || !container.classList.contains("textLayer") || offset !== container.childNodes.length) {
+    return {
+      container,
+      offset
+    };
+  }
+  let lastNode = container.lastChild;
+  if (lastNode?.nodeType === Node.ELEMENT_NODE && lastNode.classList.contains("endOfContent")) {
+    lastNode = lastNode.previousSibling;
+  }
+  if (!lastNode || !textLayer.contains(lastNode)) {
+    return null;
+  }
+  if (lastNode.nodeType === Node.TEXT_NODE) {
+    return {
+      container: lastNode,
+      offset: lastNode.textContent.length
+    };
+  }
+  return {
+    container: lastNode,
+    offset: lastNode.childNodes.length
+  };
+}
+class DrawLayer {
+  #parent = null;
+  #mapping = new Map();
+  #textLayer = null;
+  #filterFactory = null;
+  #pageColors = null;
+  #textLayerObserver = null;
+  #toUpdate = new Map();
+  static #id = 0;
+  static #selectionId = 0;
+  static #selectionChangeAC = null;
+  static #selections = new Set();
+  static #isSelecting = false;
+  static #textLayerSet = new Set();
+  static #textLayers = new WeakMap();
+  constructor({
+    filterFactory = null,
+    pageColors = null,
+    pageIndex,
+    textLayer = null
+  }) {
+    this.pageIndex = pageIndex;
+    this.#filterFactory = filterFactory;
+    this.#pageColors = pageColors;
+    if (textLayer) {
+      const previousData = DrawLayer.#textLayers.get(textLayer);
+      if (previousData?.selectionDiv) {
+        previousData.selectionDiv.remove();
+        DrawLayer.#selections.delete(previousData.selectionDiv);
+      }
+      DrawLayer.#textLayers.set(textLayer, {
+        drawLayer: this
+      });
+      DrawLayer.#textLayerSet.add(textLayer);
+      this.#textLayer = textLayer;
+      this.#textLayerObserver = new MutationObserver(records => {
+        if (!this.#parent || !this.#textLayer?.isConnected || !DrawLayer.#hasSelection()) {
+          return;
+        }
+        for (const {
+          addedNodes
+        } of records) {
+          for (const node of addedNodes) {
+            if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains("endOfContent")) {
+              DrawLayer.#selectionChange();
+              return;
+            }
+          }
+        }
+      });
+      this.#textLayerObserver.observe(textLayer, {
+        childList: true
+      });
+      if (DrawLayer.#selectionChangeAC === null) {
+        DrawLayer.#selectionChangeAC = new AbortController();
+        const {
+          signal
+        } = DrawLayer.#selectionChangeAC;
+        document.addEventListener("selectionchange", DrawLayer.#selectionChange.bind(DrawLayer), {
+          signal
+        });
+        document.addEventListener("pointerdown", () => {
+          DrawLayer.#isSelecting = true;
+        }, {
+          signal
+        });
+        document.addEventListener("pointerup", () => {
+          DrawLayer.#isSelecting = false;
+        }, {
+          signal
+        });
+        window.addEventListener("blur", () => {
+          DrawLayer.#isSelecting = false;
+        }, {
+          signal
+        });
+      }
+    }
+  }
+  setParent(parent) {
+    if (!this.#parent) {
+      this.#parent = parent;
+      if (this.#textLayer?.isConnected && DrawLayer.#hasSelection()) {
+        DrawLayer.#selectionChange();
+      }
+      return;
+    }
+    if (this.#parent !== parent) {
+      if (this.#mapping.size > 0) {
+        for (const root of this.#mapping.values()) {
+          root.remove();
+          parent.append(root);
+        }
+      }
+      this.#parent = parent;
+    }
+  }
+  static #cleanupTextLayerSelection(textLayer) {
+    const textLayerData = this.#textLayers.get(textLayer);
+    if (!textLayerData?.selectionDiv) {
+      return;
+    }
+    textLayerData.selectionDiv.remove();
+    this.#selections.delete(textLayerData.selectionDiv);
+    textLayerData.selectionDiv = null;
+    textLayerData.path = null;
+  }
+  static #hasSelection() {
+    const selection = document.getSelection();
+    return !!selection && !selection.isCollapsed;
+  }
+  static #getOrderedTextLayers() {
+    return [...this.#textLayerSet].filter(textLayer => textLayer.isConnected).sort(compareTextLayers);
+  }
+  static #selectionChange() {
+    const selection = document.getSelection();
+    if (!selection || selection.isCollapsed) {
+      for (const root of this.#selections) {
+        root.remove();
+      }
+      this.#selections.clear();
+      return;
+    }
+    const rotators = new WeakMap();
+    const orderedTextLayers = this.#getOrderedTextLayers();
+    const ranges = [];
+    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {
+      const range = selection.getRangeAt(i);
+      if (range.collapsed) {
+        continue;
+      }
+      let {
+        startContainer,
+        startOffset,
+        endContainer,
+        endOffset
+      } = range;
+      let startTextLayer = getTextLayer(startContainer);
+      let endTextLayer = getTextLayer(endContainer);
+      const startMissing = startTextLayer === null;
+      const endMissing = endTextLayer === null;
+      if (this.#isSelecting && startMissing !== endMissing) {
+        return;
+      }
+      if (selection.rangeCount === 1) {
+        const {
+          anchorNode,
+          anchorOffset,
+          focusNode,
+          focusOffset
+        } = selection;
+        const anchorLayer = getTextLayer(anchorNode);
+        const focusLayer = getTextLayer(focusNode);
+        const anchorBeforeFocus = isPointBefore(anchorNode, anchorOffset, focusNode, focusOffset);
+        if (anchorLayer && focusLayer && anchorBeforeFocus !== null) {
+          if (anchorBeforeFocus) {
+            startContainer = anchorNode;
+            startOffset = anchorOffset;
+            startTextLayer = anchorLayer;
+            endContainer = focusNode;
+            endOffset = focusOffset;
+            endTextLayer = focusLayer;
+          } else {
+            startContainer = focusNode;
+            startOffset = focusOffset;
+            startTextLayer = focusLayer;
+            endContainer = anchorNode;
+            endOffset = anchorOffset;
+            endTextLayer = anchorLayer;
+          }
+        }
+      }
+      const activeTextLayers = orderedTextLayers.filter(textLayer => range.intersectsNode(textLayer));
+      if (activeTextLayers.length === 0) {
+        continue;
+      }
+      let boundarySubstituted = false;
+      if (!startTextLayer) {
+        startTextLayer = activeTextLayers[0];
+        startContainer = startTextLayer;
+        startOffset = 0;
+        boundarySubstituted = true;
+      }
+      if (!endTextLayer) {
+        endTextLayer = activeTextLayers.at(-1);
+        endContainer = endTextLayer;
+        endOffset = endTextLayer.childNodes.length;
+        boundarySubstituted = true;
+      }
+      if (endContainer.nodeType === Node.ELEMENT_NODE) {
+        if (endContainer.classList.contains("endOfContent")) {
+          const previousNode = endContainer.previousSibling;
+          if (!previousNode) {
+            continue;
+          }
+          endContainer = previousNode;
+          endOffset = previousNode.nodeType === Node.TEXT_NODE ? previousNode.textContent.length : previousNode.childNodes.length;
+        } else if (endContainer.classList.contains("textLayer") && endContainer.childNodes.length === endOffset) {
+          const normalizedEnd = normalizeEdgeBoundary(endContainer, endOffset, endTextLayer);
+          if (!normalizedEnd) {
+            continue;
+          }
+          endContainer = normalizedEnd.container;
+          endOffset = normalizedEnd.offset;
+        }
+      }
+      if (startContainer.nodeType === Node.ELEMENT_NODE) {
+        const normalizedStart = normalizeEdgeBoundary(startContainer, startOffset, startTextLayer);
+        if (!normalizedStart) {
+          continue;
+        }
+        startContainer = normalizedStart.container;
+        startOffset = normalizedStart.offset;
+      }
+      if (startTextLayer === endTextLayer && !boundarySubstituted && activeTextLayers.includes(startTextLayer)) {
+        ranges.push([range, startTextLayer]);
+        continue;
+      }
+      for (const textLayer of activeTextLayers) {
+        const firstNode = textLayer.firstChild;
+        if (!firstNode) {
+          continue;
+        }
+        const subRange = document.createRange();
+        if (textLayer === startTextLayer) {
+          subRange.setStart(startContainer, startOffset);
+        } else {
+          subRange.setStartBefore(firstNode);
+        }
+        if (textLayer === endTextLayer) {
+          subRange.setEnd(endContainer, endOffset);
+        } else {
+          const lastNode = textLayer.lastChild;
+          if (!lastNode) {
+            continue;
+          }
+          if (lastNode.nodeType === Node.ELEMENT_NODE && lastNode.classList.contains("endOfContent")) {
+            const lastTextNode = lastNode.previousSibling;
+            if (!lastTextNode) {
+              continue;
+            }
+            subRange.setEndAfter(lastTextNode);
+          } else {
+            subRange.setEndAfter(lastNode);
+          }
+        }
+        if (!subRange.collapsed) {
+          ranges.push([subRange, textLayer]);
+        }
+      }
+    }
+    const selectedTextLayers = new Set(ranges.map(range => range[1]));
+    for (const textLayer of this.#textLayerSet) {
+      if (!selectedTextLayers.has(textLayer)) {
+        this.#cleanupTextLayerSelection(textLayer);
+      }
+    }
+    for (const [range, textLayer] of ranges) {
+      const textLayerData = DrawLayer.#textLayers.get(textLayer);
+      if (!textLayerData) {
+        continue;
+      }
+      let rotator = rotators.get(textLayer);
+      if (!rotator) {
+        const clientRect = textLayer.getBoundingClientRect();
+        rotator = (x, y, w, h) => ({
+          x: (x - clientRect.x) / clientRect.width,
+          y: (y - clientRect.y) / clientRect.height,
+          width: w / clientRect.width,
+          height: h / clientRect.height
+        });
+        rotators.set(textLayer, rotator);
+      }
+      const boxes = [];
+      for (let {
+        x,
+        y,
+        width,
+        height
+      } of range.getClientRects()) {
+        if (width === 0 || height === 0) {
+          continue;
+        }
+        ({
+          x,
+          y,
+          width,
+          height
+        } = rotator(x, y, width, height));
+        if (width === 1 && height === 1) {
+          continue;
+        }
+        boxes.push(`M${x} ${y} h${width} v${height} h-${width} Z`);
+      }
+      if (boxes.length === 0) {
+        continue;
+      }
+      const drawLayer = textLayerData.drawLayer;
+      let div = textLayerData.selectionDiv;
+      let path = textLayerData.path;
+      if (!div) {
+        const clipPathId = `clip_selection_${DrawLayer.#selectionId++}`;
+        div = document.createElement("div");
+        div.className = "selection";
+        div.style.clipPath = `url(#${clipPathId})`;
+        const selectionStyle = drawLayer.#filterFactory?.createSelectionStyle(drawLayer.#pageColors);
+        if (selectionStyle) {
+          for (const [name, value] of Object.entries(selectionStyle)) {
+            div.style.setProperty(name, value);
+          }
+        }
+        const svg = DrawLayer._svgFactory.create(1, 1, true);
+        svg.setAttribute("aria-hidden", "true");
+        svg.setAttribute("width", "100%");
+        svg.setAttribute("height", "100%");
+        const clipPath = DrawLayer._svgFactory.createElement("clipPath");
+        clipPath.setAttribute("id", clipPathId);
+        clipPath.setAttribute("clipPathUnits", "objectBoundingBox");
+        path = DrawLayer._svgFactory.createElement("path");
+        clipPath.append(path);
+        svg.append(clipPath);
+        div.append(svg);
+        textLayerData.path = path;
+        textLayerData.selectionDiv = div;
+      }
+      if (!div.parentNode && drawLayer.#parent) {
+        drawLayer.#parent.append(div);
+        this.#selections.add(div);
+      }
+      path.setAttribute("d", boxes.join(" "));
+    }
+  }
+  static get _svgFactory() {
+    return shadow(this, "_svgFactory", new DOMSVGFactory());
+  }
+  static #setBox(element, [x, y, width, height]) {
+    const {
+      style
+    } = element;
+    style.top = `${100 * y}%`;
+    style.left = `${100 * x}%`;
+    style.width = `${100 * width}%`;
+    style.height = `${100 * height}%`;
+  }
+  #createSVG() {
+    const svg = DrawLayer._svgFactory.create(1, 1, true);
+    this.#parent.append(svg);
+    svg.setAttribute("aria-hidden", "true");
+    return svg;
+  }
+  #createClipPath(defs, pathId) {
+    const clipPath = DrawLayer._svgFactory.createElement("clipPath");
+    defs.append(clipPath);
+    const clipPathId = `clip_${pathId}`;
+    clipPath.setAttribute("id", clipPathId);
+    clipPath.setAttribute("clipPathUnits", "objectBoundingBox");
+    const clipPathUse = DrawLayer._svgFactory.createElement("use");
+    clipPath.append(clipPathUse);
+    clipPathUse.setAttribute("href", `#${pathId}`);
+    clipPathUse.classList.add("clip");
+    return clipPathId;
+  }
+  #updateProperties(element, properties) {
+    for (const [key, value] of Object.entries(properties)) {
+      if (value === null) {
+        element.removeAttribute(key);
+      } else {
+        element.setAttribute(key, value);
+      }
+    }
+  }
+  draw(properties, isPathUpdatable = false, hasClip = false) {
+    const id = DrawLayer.#id++;
+    const root = this.#createSVG();
+    const defs = DrawLayer._svgFactory.createElement("defs");
+    root.append(defs);
+    const path = DrawLayer._svgFactory.createElement("path");
+    defs.append(path);
+    const pathId = `path_${id}`;
+    path.setAttribute("id", pathId);
+    path.setAttribute("vector-effect", "non-scaling-stroke");
+    if (isPathUpdatable) {
+      this.#toUpdate.set(id, path);
+    }
+    const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null;
+    const use = DrawLayer._svgFactory.createElement("use");
+    root.append(use);
+    use.setAttribute("href", `#${pathId}`);
+    this.updateProperties(root, properties);
+    this.#mapping.set(id, root);
+    return {
+      id,
+      clipPathId: `url(#${clipPathId})`
+    };
+  }
+  drawOutline(properties, mustRemoveSelfIntersections) {
+    const id = DrawLayer.#id++;
+    const root = this.#createSVG();
+    const defs = DrawLayer._svgFactory.createElement("defs");
+    root.append(defs);
+    const path = DrawLayer._svgFactory.createElement("path");
+    defs.append(path);
+    const pathId = `path_${id}`;
+    path.setAttribute("id", pathId);
+    path.setAttribute("vector-effect", "non-scaling-stroke");
+    let maskId;
+    if (mustRemoveSelfIntersections) {
+      const mask = DrawLayer._svgFactory.createElement("mask");
+      defs.append(mask);
+      maskId = `mask_${id}`;
+      mask.setAttribute("id", maskId);
+      mask.setAttribute("maskUnits", "objectBoundingBox");
+      const rect = DrawLayer._svgFactory.createElement("rect");
+      mask.append(rect);
+      rect.setAttribute("width", "1");
+      rect.setAttribute("height", "1");
+      rect.setAttribute("fill", "white");
+      const use = DrawLayer._svgFactory.createElement("use");
+      mask.append(use);
+      use.setAttribute("href", `#${pathId}`);
+      use.setAttribute("stroke", "none");
+      use.setAttribute("fill", "black");
+      use.setAttribute("fill-rule", "nonzero");
+      use.classList.add("mask");
+    }
+    const use1 = DrawLayer._svgFactory.createElement("use");
+    root.append(use1);
+    use1.setAttribute("href", `#${pathId}`);
+    if (maskId) {
+      use1.setAttribute("mask", `url(#${maskId})`);
+    }
+    const use2 = use1.cloneNode();
+    root.append(use2);
+    use1.classList.add("mainOutline");
+    use2.classList.add("secondaryOutline");
+    this.updateProperties(root, properties);
+    this.#mapping.set(id, root);
+    return id;
+  }
+  finalizeDraw(id, properties) {
+    this.#toUpdate.delete(id);
+    this.updateProperties(id, properties);
+  }
+  updateProperties(elementOrId, properties) {
+    if (!properties) {
+      return;
+    }
+    const {
+      root,
+      bbox,
+      rootClass,
+      path
+    } = properties;
+    const element = typeof elementOrId === "number" ? this.#mapping.get(elementOrId) : elementOrId;
+    if (!element) {
+      return;
+    }
+    if (root) {
+      this.#updateProperties(element, root);
+    }
+    if (bbox) {
+      DrawLayer.#setBox(element, bbox);
+    }
+    if (rootClass) {
+      const {
+        classList
+      } = element;
+      for (const [className, value] of Object.entries(rootClass)) {
+        classList.toggle(className, value);
+      }
+    }
+    if (path) {
+      const defs = element.firstElementChild;
+      const pathElement = defs.firstElementChild;
+      this.#updateProperties(pathElement, path);
+    }
+  }
+  updateParent(id, layer) {
+    if (layer === this) {
+      return;
+    }
+    const root = this.#mapping.get(id);
+    if (!root) {
+      return;
+    }
+    layer.#parent.append(root);
+    this.#mapping.delete(id);
+    layer.#mapping.set(id, root);
+  }
+  remove(id) {
+    this.#toUpdate.delete(id);
+    if (this.#parent === null) {
+      return;
+    }
+    this.#mapping.get(id).remove();
+    this.#mapping.delete(id);
+  }
+  destroy() {
+    this.#parent = null;
+    for (const root of this.#mapping.values()) {
+      root.remove();
+    }
+    this.#mapping.clear();
+    this.#toUpdate.clear();
+    this.#textLayerObserver?.disconnect();
+    this.#textLayerObserver = null;
+    if (this.#textLayer) {
+      const data = DrawLayer.#textLayers.get(this.#textLayer);
+      if (data?.drawLayer === this) {
+        DrawLayer.#cleanupTextLayerSelection(this.#textLayer);
+        DrawLayer.#textLayers.delete(this.#textLayer);
+        DrawLayer.#textLayerSet.delete(this.#textLayer);
+        if (DrawLayer.#textLayerSet.size === 0) {
+          DrawLayer.#selectionChangeAC?.abort();
+          DrawLayer.#selectionChangeAC = null;
+          DrawLayer.#isSelecting = false;
+        }
+      }
+      this.#textLayer = null;
+    }
+  }
+}
+
+;// ./src/display/text_layer_images.js
+
+function percentage(value) {
+  return `${(value * 100).toFixed(2)}%`;
+}
+class TextLayerImages {
+  #coordinates = [];
+  #coordinatesByElement = new Map();
+  #getPageCanvas = null;
+  #minSize = 0;
+  #pageWidth = 0;
+  #pageHeight = 0;
+  static #activeImage = null;
+  constructor(minSize, coordinates, viewport, getPageCanvas) {
+    this.#minSize = minSize;
+    this.#coordinates = coordinates;
+    this.#pageWidth = viewport.rawDims.pageWidth;
+    this.#pageHeight = viewport.rawDims.pageHeight;
+    this.#getPageCanvas = getPageCanvas;
+  }
+  render() {
+    const container = document.createElement("div");
+    container.className = "textLayerImages";
+    for (let i = 0; i < this.#coordinates.length; i += 6) {
+      const el = this.#createImagePlaceholder(this.#coordinates.subarray(i, i + 6));
+      if (el) {
+        container.append(el);
+      }
+    }
+    container.addEventListener("contextmenu", event => {
+      if (!(event.target instanceof HTMLCanvasElement)) {
+        return;
+      }
+      const imgElement = event.target;
+      const coords = this.#coordinatesByElement.get(imgElement);
+      if (!coords) {
+        return;
+      }
+      const activeImage = TextLayerImages.#activeImage?.deref();
+      if (activeImage === imgElement) {
+        return;
+      }
+      if (activeImage) {
+        activeImage.width = 0;
+        activeImage.height = 0;
+      }
+      TextLayerImages.#activeImage = new WeakRef(imgElement);
+      const {
+        inverseTransform,
+        x1,
+        y1,
+        width,
+        height
+      } = coords;
+      const pageCanvas = this.#getPageCanvas();
+      const imageX1 = Math.ceil(x1 * pageCanvas.width);
+      const imageY1 = Math.ceil(y1 * pageCanvas.height);
+      const imageX2 = Math.floor((x1 + width / this.#pageWidth) * pageCanvas.width);
+      const imageY2 = Math.floor((y1 + height / this.#pageHeight) * pageCanvas.height);
+      imgElement.width = imageX2 - imageX1;
+      imgElement.height = imageY2 - imageY1;
+      const ctx = imgElement.getContext("2d");
+      ctx.setTransform(...inverseTransform);
+      ctx.translate(-imageX1, -imageY1);
+      ctx.drawImage(pageCanvas, 0, 0);
+    });
+    return container;
+  }
+  #createImagePlaceholder([x1, y1, x2, y2, x3, y3]) {
+    const width = Math.hypot((x3 - x1) * this.#pageWidth, (y3 - y1) * this.#pageHeight);
+    const height = Math.hypot((x2 - x1) * this.#pageWidth, (y2 - y1) * this.#pageHeight);
+    if (width < this.#minSize || height < this.#minSize) {
+      return null;
+    }
+    const transform = [(x3 - x1) * this.#pageWidth / width, (y3 - y1) * this.#pageHeight / width, (x2 - x1) * this.#pageWidth / height, (y2 - y1) * this.#pageHeight / height, 0, 0];
+    const inverseTransform = Util.inverseTransform(transform);
+    const imgElement = document.createElement("canvas");
+    imgElement.className = "textLayerImagePlaceholder";
+    imgElement.width = 0;
+    imgElement.height = 0;
+    Object.assign(imgElement.style, {
+      opacity: 0,
+      position: "absolute",
+      left: percentage(x1),
+      top: percentage(y1),
+      width: percentage(width / this.#pageWidth),
+      height: percentage(height / this.#pageHeight),
+      transformOrigin: "0% 0%",
+      transform: `matrix(${transform.join(",")})`
+    });
+    this.#coordinatesByElement.set(imgElement, {
+      inverseTransform,
+      width,
+      height,
+      x1,
+      y1
+    });
+    return imgElement;
+  }
+}
+
+;// ./src/pdf.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{
+  globalThis._pdfjsTestingUtils = {
+    HighlightOutliner: HighlightOutliner
+  };
+}
+globalThis.pdfjsLib = {
+  AbortException: AbortException,
+  AnnotationEditorLayer: AnnotationEditorLayer,
+  AnnotationEditorParamsType: AnnotationEditorParamsType,
+  AnnotationEditorType: AnnotationEditorType,
+  AnnotationEditorUIManager: AnnotationEditorUIManager,
+  AnnotationLayer: AnnotationLayer,
+  AnnotationMode: AnnotationMode,
+  AnnotationType: AnnotationType,
+  applyOpacity: applyOpacity,
+  build: build,
+  ColorPicker: ColorPicker,
+  createValidAbsoluteUrl: createValidAbsoluteUrl,
+  CSSConstants: CSSConstants,
+  DOMSVGFactory: DOMSVGFactory,
+  DrawLayer: DrawLayer,
+  FeatureTest: FeatureTest,
+  fetchData: fetchData,
+  findContrastColor: findContrastColor,
+  getDocument: getDocument,
+  getFilenameFromUrl: getFilenameFromUrl,
+  getPdfFilenameFromUrl: getPdfFilenameFromUrl,
+  getRGB: getRGB,
+  getRGBA: getRGBA,
+  getUuid: getUuid,
+  GlobalWorkerOptions: GlobalWorkerOptions,
+  ImageKind: ImageKind,
+  InvalidPDFException: InvalidPDFException,
+  isDataScheme: isDataScheme,
+  isPdfFile: isPdfFile,
+  isValidExplicitDest: isValidExplicitDest,
+  makeArr: makeArr,
+  makeMap: makeMap,
+  makeObj: makeObj,
+  MathClamp: MathClamp,
+  noContextMenu: noContextMenu,
+  normalizeUnicode: normalizeUnicode,
+  OPS: OPS,
+  OutputScale: OutputScale,
+  PasswordException: PasswordException,
+  PasswordResponses: PasswordResponses,
+  PDFDataRangeTransport: PDFDataRangeTransport,
+  PDFDateString: PDFDateString,
+  PDFWorker: PDFWorker,
+  PermissionFlag: PermissionFlag,
+  PixelsPerInch: PixelsPerInch,
+  RenderingCancelledException: RenderingCancelledException,
+  renderRichText: renderRichText,
+  ResponseException: ResponseException,
+  setLayerDimensions: setLayerDimensions,
+  shadow: shadow,
+  SignatureExtractor: SignatureExtractor,
+  stopEvent: stopEvent,
+  SupportedImageMimeTypes: SupportedImageMimeTypes,
+  TextLayer: TextLayer,
+  TextLayerImages: TextLayerImages,
+  TouchManager: TouchManager,
+  updateUrlHash: updateUrlHash,
+  Util: Util,
+  VerbosityLevel: VerbosityLevel,
+  version: version,
+  XfaLayer: XfaLayer
+};
+
+export { AbortException, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, AnnotationType, CSSConstants, ColorPicker, DOMSVGFactory, DrawLayer, FeatureTest, GlobalWorkerOptions, ImageKind, InvalidPDFException, MathClamp, OPS, OutputScale, PDFDataRangeTransport, PDFDateString, PDFWorker, PasswordException, PasswordResponses, PermissionFlag, PixelsPerInch, RenderingCancelledException, ResponseException, SignatureExtractor, SupportedImageMimeTypes, TextLayer, TextLayerImages, TouchManager, Util, VerbosityLevel, XfaLayer, applyOpacity, build, createValidAbsoluteUrl, fetchData, findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, getRGB, getRGBA, getUuid, isDataScheme, isPdfFile, isValidExplicitDest, makeArr, makeMap, makeObj, noContextMenu, normalizeUnicode, renderRichText, setLayerDimensions, shadow, stopEvent, updateUrlHash, version };
+
+//# sourceMappingURL=pdf.mjs.map
\ No newline at end of file
diff --git a/public/pdfjs/build/pdf.mjs.map b/public/pdfjs/build/pdf.mjs.map
new file mode 100644
index 0000000..83ad33e
--- /dev/null
+++ b/public/pdfjs/build/pdf.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"pdf.mjs","mappings":"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","sources":["webpack://pdf.js/./src/shared/util.js","webpack://pdf.js/./src/shared/math_clamp.js","webpack://pdf.js/./src/display/page_viewport.js","webpack://pdf.js/./src/display/xfa_text.js","webpack://pdf.js/./src/display/xfa_layer.js","webpack://pdf.js/./src/display/display_utils.js","webpack://pdf.js/./src/display/editor/toolbar.js","webpack://pdf.js/./src/shared/internal_evt.js","webpack://pdf.js/./src/display/editor/tools.js","webpack://pdf.js/./src/display/editor/alt_text.js","webpack://pdf.js/./src/display/editor/comment.js","webpack://pdf.js/./src/display/touch_manager.js","webpack://pdf.js/./src/display/editor/editor.js","webpack://pdf.js/./src/shared/murmurhash3.js","webpack://pdf.js/./src/display/annotation_storage.js","webpack://pdf.js/./src/display/canvas_dependency_tracker.js","webpack://pdf.js/./src/display/font_loader.js","webpack://pdf.js/./src/shared/obj_bin_transform_utils.js","webpack://pdf.js/./src/display/obj_bin_transform_display.js","webpack://pdf.js/./src/display/api_utils.js","webpack://pdf.js/./src/shared/message_handler.js","webpack://pdf.js/./src/display/binary_data_factory.js","webpack://pdf.js/./src/display/canvas_factory.js","webpack://pdf.js/./src/display/filter_factory.js","webpack://pdf.js/./src/display/node_utils.js","webpack://pdf.js/./src/shared/image_utils.js","webpack://pdf.js/./src/display/webgpu.js","webpack://pdf.js/./src/display/pattern_helper.js","webpack://pdf.js/./src/display/canvas.js","webpack://pdf.js/./src/shared/base_pdf_stream.js","webpack://pdf.js/./src/display/content_disposition.js","webpack://pdf.js/./src/display/network_utils.js","webpack://pdf.js/./src/display/fetch_stream.js","webpack://pdf.js/./src/display/transport_stream.js","webpack://pdf.js/./src/display/network.js","webpack://pdf.js/./src/display/node_stream.js","webpack://pdf.js/./src/display/network_stream.js","webpack://pdf.js/./src/display/worker_options.js","webpack://pdf.js/./src/display/metadata.js","webpack://pdf.js/./src/display/optional_content_config.js","webpack://pdf.js/./src/display/pages_mapper.js","webpack://pdf.js/./src/display/pdf_objects.js","webpack://pdf.js/./src/display/text_layer.js","webpack://pdf.js/./src/display/api.js","webpack://pdf.js/./src/display/editor/color_picker.js","webpack://pdf.js/./src/shared/scripting_utils.js","webpack://pdf.js/./src/display/svg_factory.js","webpack://pdf.js/./src/display/annotation_layer.js","webpack://pdf.js/./src/display/editor/freetext.js","webpack://pdf.js/./src/display/editor/drawers/outline.js","webpack://pdf.js/./src/display/editor/drawers/freedraw.js","webpack://pdf.js/./src/display/editor/drawers/highlight.js","webpack://pdf.js/./src/display/editor/highlight.js","webpack://pdf.js/./src/display/editor/draw.js","webpack://pdf.js/./src/display/editor/drawers/inkdraw.js","webpack://pdf.js/./src/display/editor/ink.js","webpack://pdf.js/./src/display/editor/drawers/contour.js","webpack://pdf.js/./src/display/editor/drawers/signaturedraw.js","webpack://pdf.js/./src/display/editor/signature.js","webpack://pdf.js/./src/display/editor/stamp.js","webpack://pdf.js/./src/display/editor/annotation_editor_layer.js","webpack://pdf.js/./src/display/draw_layer.js","webpack://pdf.js/./src/display/text_layer_images.js","webpack://pdf.js/./src/pdf.js"],"sourcesContent":["/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\n// NW.js / Electron is a browser context, but copies some Node.js objects; see\n// http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/#access-nodejs-and-nwjs-api-in-browser-context\n// https://www.electronjs.org/docs/api/process#processversionselectron-readonly\n// https://www.electronjs.org/docs/api/process#processtype-readonly\nconst isNodeJS =\n  (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n  typeof process === \"object\" &&\n  process + \"\" === \"[object process]\" &&\n  !process.versions.nw &&\n  !(process.versions.electron && process.type && process.type !== \"browser\");\n\nconst BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity];\nconst F32_BBOX_INIT = new Float32Array(BBOX_INIT);\n\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\n// Represent the percentage of the height of a single-line field over\n// the font size. Acrobat seems to use this value.\nconst LINE_FACTOR = 1.35;\nconst LINE_DESCENT_FACTOR = 0.35;\nconst BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/**\n * Refer to the `WorkerTransport.getRenderingIntent`-method in the API, to see\n * how these flags are being used:\n *  - ANY, DISPLAY, and PRINT are the normal rendering intents, note the\n *    `PDFPageProxy.{render, getOperatorList, getAnnotations}`-methods.\n *  - SAVE is used, on the worker-thread, when saving modified annotations.\n *  - ANNOTATIONS_FORMS, ANNOTATIONS_STORAGE, ANNOTATIONS_DISABLE control which\n *    annotations are rendered onto the canvas (i.e. by being included in the\n *    operatorList), note the `PDFPageProxy.{render, getOperatorList}`-methods\n *    and their `annotationMode`-option.\n *  - IS_EDITING is used when editing is active in the viewer.\n *  - OPLIST is used with the `PDFPageProxy.getOperatorList`-method, note the\n *    `OperatorList`-constructor (on the worker-thread).\n */\nconst RenderingIntentFlag = {\n  ANY: 0x01,\n  DISPLAY: 0x02,\n  PRINT: 0x04,\n  SAVE: 0x08,\n  ANNOTATIONS_FORMS: 0x10,\n  ANNOTATIONS_STORAGE: 0x20,\n  ANNOTATIONS_DISABLE: 0x40,\n  IS_EDITING: 0x80,\n  OPLIST: 0x100,\n};\n\nconst AnnotationMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_FORMS: 2,\n  ENABLE_STORAGE: 3,\n};\n\nconst AnnotationPrefix = \"pdfjs_internal_id_\";\nconst AnnotationEditorPrefix = \"pdfjs_internal_editor_\";\n\nconst AnnotationEditorType = {\n  DISABLE: -1,\n  NONE: 0,\n  FREETEXT: 3,\n  HIGHLIGHT: 9,\n  STAMP: 13,\n  INK: 15,\n  POPUP: 16,\n  SIGNATURE: 101,\n  COMMENT: 102,\n};\n\nconst AnnotationEditorParamsType = {\n  RESIZE: 1,\n  CREATE: 2,\n  FREETEXT_SIZE: 11,\n  FREETEXT_COLOR: 12,\n  FREETEXT_OPACITY: 13,\n  INK_COLOR: 21,\n  INK_THICKNESS: 22,\n  INK_OPACITY: 23,\n  INK_COLOR_AND_OPACITY: 24,\n  HIGHLIGHT_COLOR: 31,\n  HIGHLIGHT_THICKNESS: 32,\n  HIGHLIGHT_FREE: 33,\n  HIGHLIGHT_SHOW_ALL: 34,\n  DRAW_STEP: 41,\n};\n\n// Permission flags from Table 22, Section 7.6.3.2 of the PDF specification.\nconst PermissionFlag = {\n  PRINT: 0x04,\n  MODIFY_CONTENTS: 0x08,\n  COPY: 0x10,\n  MODIFY_ANNOTATIONS: 0x20,\n  FILL_INTERACTIVE_FORMS: 0x100,\n  COPY_FOR_ACCESSIBILITY: 0x200,\n  ASSEMBLE: 0x400,\n  PRINT_HIGH_QUALITY: 0x800,\n};\n\nconst MeshFigureType = {\n  TRIANGLES: 1,\n  LATTICE: 2,\n  PATCH: 3,\n};\n\nconst TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4,\n};\n\nconst ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3,\n};\n\nconst AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26,\n  RICHMEDIA: 27,\n};\n\nconst AnnotationReplyType = {\n  GROUP: \"Group\",\n  REPLY: \"R\",\n};\n\n// Rendition action operations from Table 214, Section 12.6.4.13 of the PDF\n// specification (ISO 32000-1).\nconst AnnotationRenditionOperation = {\n  PLAY_OR_RESUME: 0,\n  STOP: 1,\n  PAUSE: 2,\n  RESUME: 3,\n  PLAY: 4,\n};\n\nconst AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200,\n};\n\nconst AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000,\n};\n\nconst AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5,\n};\n\nconst AnnotationActionEventType = {\n  E: \"Mouse Enter\",\n  X: \"Mouse Exit\",\n  D: \"Mouse Down\",\n  U: \"Mouse Up\",\n  Fo: \"Focus\",\n  Bl: \"Blur\",\n  PO: \"PageOpen\",\n  PC: \"PageClose\",\n  PV: \"PageVisible\",\n  PI: \"PageInvisible\",\n  K: \"Keystroke\",\n  F: \"Format\",\n  V: \"Validate\",\n  C: \"Calculate\",\n};\n\nconst DocumentActionEventType = {\n  WC: \"WillClose\",\n  WS: \"WillSave\",\n  DS: \"DidSave\",\n  WP: \"WillPrint\",\n  DP: \"DidPrint\",\n};\n\nconst PageActionEventType = {\n  O: \"PageOpen\",\n  C: \"PageClose\",\n};\n\nconst VerbosityLevel = {\n  ERRORS: 0,\n  WARNINGS: 1,\n  INFOS: 5,\n};\n\n// All the possible operations for an operator list.\nconst OPS = {\n  // Intentionally start from 1 so it is easy to spot bad operators that will be\n  // 0's.\n  // PLEASE NOTE: We purposely keep any removed operators commented out, since\n  //              re-numbering the list would risk breaking third-party users.\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  // beginAnnotations: 78,\n  // endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  // paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91,\n  setStrokeTransparent: 92,\n  setFillTransparent: 93,\n  rawFillPath: 94,\n};\n\n// In order to have a switch statement that is fast (i.e. which use a jump\n// table), we need to have the OPS in a contiguous range.\nconst DrawOPS = {\n  moveTo: 0,\n  lineTo: 1,\n  curveTo: 2,\n  quadraticCurveTo: 3,\n  closePath: 4,\n};\n\nconst PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2,\n};\n\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n  if (Number.isInteger(level)) {\n    verbosity = level;\n  }\n}\n\nfunction getVerbosityLevel() {\n  return verbosity;\n}\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n  if (verbosity >= VerbosityLevel.INFOS) {\n    // eslint-disable-next-line no-console\n    console.info(`Info: ${msg}`);\n  }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n  if (verbosity >= VerbosityLevel.WARNINGS) {\n    // eslint-disable-next-line no-console\n    console.warn(`Warning: ${msg}`);\n  }\n}\n\n/**\n * @param {string} msg\n * @returns {never}\n */\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\n\n// Checks if URLs use one of the allowed protocols, e.g. to avoid XSS.\nfunction _isValidProtocol(url) {\n  switch (url?.protocol) {\n    case \"http:\":\n    case \"https:\":\n    case \"ftp:\":\n    case \"mailto:\":\n    case \"tel:\":\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Attempts to create a valid absolute URL.\n *\n * @param {URL|string} url - An absolute, or relative, URL.\n * @param {URL|string} [baseUrl] - An absolute URL.\n * @param {Object} [options]\n * @returns Either a valid {URL}, or `null` otherwise.\n */\nfunction createValidAbsoluteUrl(url, baseUrl = null, options = null) {\n  if (!url) {\n    return null;\n  }\n  if (options && typeof url === \"string\") {\n    // Let URLs beginning with \"www.\" default to using the \"http://\" protocol.\n    if (options.addDefaultProtocol && url.startsWith(\"www.\")) {\n      const dots = url.match(/\\./g);\n      // Avoid accidentally matching a *relative* URL pointing to a file named\n      // e.g. \"www.pdf\" or similar.\n      if (dots?.length >= 2) {\n        url = `http://${url}`;\n      }\n    }\n\n    // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded\n    // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding; see bug 1122280.\n    if (options.tryConvertEncoding) {\n      try {\n        url = stringToUTF8String(url);\n      } catch {}\n    }\n  }\n\n  const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n  return _isValidProtocol(absoluteUrl) ? absoluteUrl : null;\n}\n\n/**\n * Remove, or replace, the hash property of the URL.\n *\n * @param {URL|string} url - The absolute, or relative, URL.\n * @param {string} hash - The hash property (use an empty string to remove it).\n * @param {boolean} [allowRel] - Allow relative URLs.\n * @returns {string} The resulting URL string.\n */\nfunction updateUrlHash(url, hash, allowRel = false) {\n  const res = URL.parse(url);\n  if (res) {\n    res.hash = hash;\n    return res.href;\n  }\n  // Support well-formed relative URLs, necessary for `web/app.js` in GENERIC\n  // builds, by optionally falling back to string parsing.\n  if (allowRel && createValidAbsoluteUrl(url, \"http://example.com\")) {\n    return url.split(\"#\", 1)[0] + `${hash ? `#${hash}` : \"\"}`;\n  }\n  return \"\";\n}\n\n// Extract the final component from a path string.\nfunction stripPath(str) {\n  return str.substring(str.lastIndexOf(\"/\") + 1);\n}\n\nfunction shadow(obj, prop, value, nonSerializable = false) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      prop in obj,\n      `shadow: Property \"${prop && prop.toString()}\" not found in object.`\n    );\n  }\n  Object.defineProperty(obj, prop, {\n    value,\n    enumerable: !nonSerializable,\n    configurable: true,\n    writable: false,\n  });\n  return value;\n}\n\n/**\n * @type {any}\n */\nconst BaseException = (function BaseExceptionClosure() {\n  // eslint-disable-next-line no-shadow\n  function BaseException(message, name) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseException\n    ) {\n      unreachable(\"Cannot initialize BaseException.\");\n    }\n    this.message = message;\n    this.name = name;\n  }\n  BaseException.prototype = new Error();\n  BaseException.constructor = BaseException;\n\n  return BaseException;\n})();\n\nclass PasswordException extends BaseException {\n  constructor(msg, code) {\n    super(msg, \"PasswordException\");\n    this.code = code;\n  }\n}\n\nclass UnknownErrorException extends BaseException {\n  constructor(msg, details) {\n    super(msg, \"UnknownErrorException\");\n    this.details = details;\n  }\n}\n\nclass InvalidPDFException extends BaseException {\n  constructor(msg) {\n    super(msg, \"InvalidPDFException\");\n  }\n}\n\nclass ResponseException extends BaseException {\n  constructor(msg, status, missing) {\n    super(msg, \"ResponseException\");\n    this.status = status;\n    this.missing = missing;\n  }\n}\n\n/**\n * Error caused during parsing PDF data.\n */\nclass FormatError extends BaseException {\n  constructor(msg) {\n    super(msg, \"FormatError\");\n  }\n}\n\n/**\n * Error used to indicate task cancellation.\n */\nclass AbortException extends BaseException {\n  constructor(msg) {\n    super(msg, \"AbortException\");\n  }\n}\n\nfunction bytesToString(bytes) {\n  if (typeof bytes !== \"object\" || bytes?.length === undefined) {\n    unreachable(\"Invalid argument for bytesToString\");\n  }\n  const length = bytes.length;\n  const MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  const strBuf = [];\n  for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    const chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join(\"\");\n}\n\nfunction stringToBytes(str) {\n  if (typeof str !== \"string\") {\n    unreachable(\"Invalid argument for stringToBytes\");\n  }\n  const length = str.length;\n  const bytes = new Uint8Array(length);\n  for (let i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xff;\n  }\n  return bytes;\n}\n\nfunction objectSize(obj) {\n  return Object.keys(obj).length;\n}\n\nclass FeatureTest {\n  static get isLittleEndian() {\n    const buffer8 = new Uint8Array(4);\n    buffer8[0] = 1;\n    const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n\n    return shadow(this, \"isLittleEndian\", view32[0] === 1);\n  }\n\n  static get isOffscreenCanvasSupported() {\n    return shadow(\n      this,\n      \"isOffscreenCanvasSupported\",\n      typeof OffscreenCanvas !== \"undefined\"\n    );\n  }\n\n  static get isImageDecoderSupported() {\n    return shadow(\n      this,\n      \"isImageDecoderSupported\",\n      typeof ImageDecoder !== \"undefined\"\n    );\n  }\n\n  static get isFloat16ArraySupported() {\n    return shadow(\n      this,\n      \"isFloat16ArraySupported\",\n      typeof Float16Array !== \"undefined\"\n    );\n  }\n\n  static get isSanitizerSupported() {\n    return shadow(\n      this,\n      \"isSanitizerSupported\",\n      typeof Sanitizer !== \"undefined\"\n    );\n  }\n\n  static get platform() {\n    const { platform, userAgent } = navigator;\n\n    return shadow(this, \"platform\", {\n      isAndroid: userAgent.includes(\"Android\"),\n      isLinux: platform.includes(\"Linux\"),\n      isMac: platform.includes(\"Mac\"),\n      isWindows: platform.includes(\"Win\"),\n      isFirefox:\n        (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n        userAgent.includes(\"Firefox\"),\n    });\n  }\n\n  static get isCanvasFilterSupported() {\n    let ctx;\n    if (this.isOffscreenCanvasSupported) {\n      ctx = new OffscreenCanvas(1, 1).getContext(\"2d\");\n    } else if (\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"WORKER_THREAD\")) &&\n      typeof document !== \"undefined\"\n    ) {\n      ctx = document.createElement(\"canvas\").getContext(\"2d\");\n    }\n    // Spec-compliant Canvas2D defaults `ctx.filter` to \"none\". On\n    // browsers without filter support (Safari) the property is absent\n    // until you assign to it, after which it behaves like an ordinary\n    // JS property and stores whatever string you set without applying\n    // it. Probing the default lets us detect the difference reliably.\n    return shadow(this, \"isCanvasFilterSupported\", ctx?.filter !== undefined);\n  }\n\n  static get isAlphaColorInputSupported() {\n    if (\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"WORKER_THREAD\")) ||\n      typeof document === \"undefined\"\n    ) {\n      return shadow(this, \"isAlphaColorInputSupported\", false);\n    }\n    const input = document.createElement(\"input\");\n    input.type = \"color\";\n    input.setAttribute(\"alpha\", \"\");\n    input.value = \"#ff000080\";\n    // If alpha is supported the color picker retains the alpha channel, so\n    // the value won't be a plain opaque color (7-char #rrggbb).\n    return shadow(\n      this,\n      \"isAlphaColorInputSupported\",\n      input.value !== \"#ff0000\"\n    );\n  }\n\n  static get isBackdropFilterSupported() {\n    return shadow(\n      this,\n      \"isBackdropFilterSupported\",\n      typeof CSS !== \"undefined\" && CSS.supports(\"backdrop-filter\", \"blur(1px)\")\n    );\n  }\n}\n\nclass Util {\n  static get hexNums() {\n    return shadow(\n      this,\n      \"hexNums\",\n      Array.from(Array(256).keys(), n => n.toString(16).padStart(2, \"0\"))\n    );\n  }\n\n  static makeHexColor(r, g, b) {\n    return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`;\n  }\n\n  // Concatenates two transformation matrices together and returns the result.\n  static transform(m1, m2) {\n    return [\n      m1[0] * m2[0] + m1[2] * m2[1],\n      m1[1] * m2[0] + m1[3] * m2[1],\n      m1[0] * m2[2] + m1[2] * m2[3],\n      m1[1] * m2[2] + m1[3] * m2[3],\n      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n      m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n    ];\n  }\n\n  // Multiplies m (an array-based transform) by md (a DOMMatrix transform).\n  static multiplyByDOMMatrix(m, md) {\n    return [\n      m[0] * md.a + m[2] * md.b,\n      m[1] * md.a + m[3] * md.b,\n      m[0] * md.c + m[2] * md.d,\n      m[1] * md.c + m[3] * md.d,\n      m[0] * md.e + m[2] * md.f + m[4],\n      m[1] * md.e + m[3] * md.f + m[5],\n    ];\n  }\n\n  // For 2d affine transforms\n  static applyTransform(p, m, pos = 0) {\n    const p0 = p[pos];\n    const p1 = p[pos + 1];\n    p[pos] = p0 * m[0] + p1 * m[2] + m[4];\n    p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5];\n  }\n\n  static applyTransformToBezier(p, transform, pos = 0) {\n    const m0 = transform[0];\n    const m1 = transform[1];\n    const m2 = transform[2];\n    const m3 = transform[3];\n    const m4 = transform[4];\n    const m5 = transform[5];\n    for (let i = 0; i < 6; i += 2) {\n      const pI = p[pos + i];\n      const pI1 = p[pos + i + 1];\n      p[pos + i] = pI * m0 + pI1 * m2 + m4;\n      p[pos + i + 1] = pI * m1 + pI1 * m3 + m5;\n    }\n  }\n\n  static applyInverseTransform(p, m) {\n    const p0 = p[0];\n    const p1 = p[1];\n    const d = m[0] * m[3] - m[1] * m[2];\n    p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n  }\n\n  // Applies the transform to the rectangle and finds the minimum axially\n  // aligned bounding box.\n  static axialAlignedBoundingBox(rect, transform, output) {\n    const m0 = transform[0];\n    const m1 = transform[1];\n    const m2 = transform[2];\n    const m3 = transform[3];\n    const m4 = transform[4];\n    const m5 = transform[5];\n    const r0 = rect[0];\n    const r1 = rect[1];\n    const r2 = rect[2];\n    const r3 = rect[3];\n\n    let a0 = m0 * r0 + m4;\n    let a2 = a0;\n    let a1 = m0 * r2 + m4;\n    let a3 = a1;\n    let b0 = m3 * r1 + m5;\n    let b2 = b0;\n    let b1 = m3 * r3 + m5;\n    let b3 = b1;\n\n    if (m1 !== 0 || m2 !== 0) {\n      // Non-scaling matrix: shouldn't be frequent.\n      const m1r0 = m1 * r0;\n      const m1r2 = m1 * r2;\n      const m2r1 = m2 * r1;\n      const m2r3 = m2 * r3;\n      a0 += m2r1;\n      a3 += m2r1;\n      a1 += m2r3;\n      a2 += m2r3;\n      b0 += m1r0;\n      b3 += m1r0;\n      b1 += m1r2;\n      b2 += m1r2;\n    }\n\n    output[0] = Math.min(output[0], a0, a1, a2, a3);\n    output[1] = Math.min(output[1], b0, b1, b2, b3);\n    output[2] = Math.max(output[2], a0, a1, a2, a3);\n    output[3] = Math.max(output[3], b0, b1, b2, b3);\n  }\n\n  static inverseTransform(m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    return [\n      m[3] / d,\n      -m[1] / d,\n      -m[2] / d,\n      m[0] / d,\n      (m[2] * m[5] - m[4] * m[3]) / d,\n      (m[4] * m[1] - m[5] * m[0]) / d,\n    ];\n  }\n\n  // This calculation uses Singular Value Decomposition.\n  // The SVD can be represented with formula A = USV. We are interested in the\n  // matrix S here because it represents the scale values.\n  static singularValueDecompose2dScale(matrix, output) {\n    const m0 = matrix[0];\n    const m1 = matrix[1];\n    const m2 = matrix[2];\n    const m3 = matrix[3];\n    // Multiply matrix m with its transpose.\n    const a = m0 ** 2 + m1 ** 2;\n    const b = m0 * m2 + m1 * m3;\n    const c = m2 ** 2 + m3 ** 2;\n\n    // Solve the second degree polynomial to get roots.\n    const first = (a + c) / 2;\n    const second = Math.sqrt(first ** 2 - (a * c - b ** 2));\n    output[0] = Math.sqrt(first + second || 1);\n    output[1] = Math.sqrt(first - second || 1);\n  }\n\n  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n  // For coordinate systems whose origin lies in the bottom-left, this\n  // means normalization to (BL,TR) ordering. For systems with origin in the\n  // top-left, this means (TL,BR) ordering.\n  static normalizeRect(rect) {\n    const r = rect.slice(0); // clone rect\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  }\n\n  // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n  // intersection of rect1 and rect2. If no intersection, returns 'null'\n  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n  static intersect(rect1, rect2) {\n    const xLow = Math.max(\n      Math.min(rect1[0], rect1[2]),\n      Math.min(rect2[0], rect2[2])\n    );\n    const xHigh = Math.min(\n      Math.max(rect1[0], rect1[2]),\n      Math.max(rect2[0], rect2[2])\n    );\n    if (xLow > xHigh) {\n      return null;\n    }\n    const yLow = Math.max(\n      Math.min(rect1[1], rect1[3]),\n      Math.min(rect2[1], rect2[3])\n    );\n    const yHigh = Math.min(\n      Math.max(rect1[1], rect1[3]),\n      Math.max(rect2[1], rect2[3])\n    );\n    if (yLow > yHigh) {\n      return null;\n    }\n\n    return [xLow, yLow, xHigh, yHigh];\n  }\n\n  static pointBoundingBox(x, y, minMax) {\n    minMax[0] = Math.min(minMax[0], x);\n    minMax[1] = Math.min(minMax[1], y);\n    minMax[2] = Math.max(minMax[2], x);\n    minMax[3] = Math.max(minMax[3], y);\n  }\n\n  static rectBoundingBox(x0, y0, x1, y1, minMax) {\n    minMax[0] = Math.min(minMax[0], x0, x1);\n    minMax[1] = Math.min(minMax[1], y0, y1);\n    minMax[2] = Math.max(minMax[2], x0, x1);\n    minMax[3] = Math.max(minMax[3], y0, y1);\n  }\n\n  static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {\n    if (t <= 0 || t >= 1) {\n      return;\n    }\n    const mt = 1 - t;\n    const tt = t * t;\n    const ttt = tt * t;\n    const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;\n    const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;\n    minMax[0] = Math.min(minMax[0], x);\n    minMax[1] = Math.min(minMax[1], y);\n    minMax[2] = Math.max(minMax[2], x);\n    minMax[3] = Math.max(minMax[3], y);\n  }\n\n  static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {\n    if (Math.abs(a) < 1e-12) {\n      if (Math.abs(b) >= 1e-12) {\n        this.#getExtremumOnCurve(\n          x0,\n          x1,\n          x2,\n          x3,\n          y0,\n          y1,\n          y2,\n          y3,\n          -c / b,\n          minMax\n        );\n      }\n      return;\n    }\n\n    const delta = b ** 2 - 4 * c * a;\n    if (delta < 0) {\n      return;\n    }\n    const sqrtDelta = Math.sqrt(delta);\n    const a2 = 2 * a;\n    this.#getExtremumOnCurve(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      (-b + sqrtDelta) / a2,\n      minMax\n    );\n    this.#getExtremumOnCurve(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      (-b - sqrtDelta) / a2,\n      minMax\n    );\n  }\n\n  // From https://github.com/adobe-webplatform/Snap.svg/blob/b365287722a72526000ac4bfcf0ce4cac2faa015/src/path.js#L852\n  static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n    minMax[0] = Math.min(minMax[0], x0, x3);\n    minMax[1] = Math.min(minMax[1], y0, y3);\n    minMax[2] = Math.max(minMax[2], x0, x3);\n    minMax[3] = Math.max(minMax[3], y0, y3);\n\n    this.#getExtremum(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      3 * (-x0 + 3 * (x1 - x2) + x3),\n      6 * (x0 - 2 * x1 + x2),\n      3 * (x1 - x0),\n      minMax\n    );\n    this.#getExtremum(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      3 * (-y0 + 3 * (y1 - y2) + y3),\n      6 * (y0 - 2 * y1 + y2),\n      3 * (y1 - y0),\n      minMax\n    );\n  }\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isArrayEqual(arr1, arr2) {\n  if (arr1.length !== arr2.length) {\n    return false;\n  }\n  for (let i = 0, ii = arr1.length; i < ii; i++) {\n    if (arr1[i] !== arr2[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\nlet NormalizeRegex = null;\nlet NormalizationMap = null;\nfunction normalizeUnicode(str) {\n  if (!NormalizeRegex) {\n    // In order to generate the following regex:\n    //  - create a PDF containing all the chars in the range 0000-FFFF with\n    //    a NFKC which is different of the char.\n    //  - copy and paste all those chars and get the ones where NFKC is\n    //    required.\n    // It appears that most the chars here contain some ligatures.\n    NormalizeRegex =\n      /([\\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;\n    NormalizationMap = new Map([[\"铿匼", \"趴t\"]]);\n  }\n  return str.replaceAll(NormalizeRegex, (_, p1, p2) =>\n    p1 ? p1.normalize(\"NFKC\") : NormalizationMap.get(p2)\n  );\n}\n\nfunction getUuid() {\n  if (\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n    typeof crypto.randomUUID === \"function\"\n  ) {\n    return crypto.randomUUID();\n  }\n  const buf = new Uint8Array(32);\n  crypto.getRandomValues(buf);\n  return bytesToString(buf);\n}\n\nfunction _isValidExplicitDest(validRef, validName, dest) {\n  if (!Array.isArray(dest) || dest.length < 2) {\n    return false;\n  }\n  const [page, zoom, ...args] = dest;\n  if (!validRef(page) && !Number.isInteger(page)) {\n    return false;\n  }\n  if (!validName(zoom)) {\n    return false;\n  }\n  const argsLen = args.length;\n  let allowNull = true;\n  switch (zoom.name) {\n    case \"XYZ\":\n      if (argsLen < 2 || argsLen > 3) {\n        return false;\n      }\n      break;\n    case \"Fit\":\n    case \"FitB\":\n      return argsLen === 0;\n    case \"FitH\":\n    case \"FitBH\":\n    case \"FitV\":\n    case \"FitBV\":\n      if (argsLen > 1) {\n        return false;\n      }\n      break;\n    case \"FitR\":\n      if (argsLen !== 4) {\n        return false;\n      }\n      allowNull = false;\n      break;\n    default:\n      return false;\n  }\n  for (const arg of args) {\n    if (typeof arg === \"number\" || (allowNull && arg === null)) {\n      continue;\n    }\n    return false;\n  }\n  return true;\n}\n\n// Helpers for simple `Map.prototype.getOrInsertComputed()` invocations,\n// to avoid duplicate function creation.\nconst makeArr = () => [];\nconst makeMap = () => new Map();\nconst makeObj = () => Object.create(null);\n\n// See https://developer.mozilla.org/en-US/docs/Web/API/Blob/bytes#browser_compatibility\nif (\n  typeof PDFJSDev !== \"undefined\" &&\n  !PDFJSDev.test(\"SKIP_BABEL\") &&\n  typeof Blob.prototype.bytes !== \"function\"\n) {\n  Blob.prototype.bytes = async function () {\n    return new Uint8Array(await this.arrayBuffer());\n  };\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/API/Response/bytes#browser_compatibility\nif (\n  typeof PDFJSDev !== \"undefined\" &&\n  !PDFJSDev.test(\"SKIP_BABEL\") &&\n  typeof Response.prototype.bytes !== \"function\"\n) {\n  Response.prototype.bytes = async function () {\n    return new Uint8Array(await this.arrayBuffer());\n  };\n}\n\nexport {\n  _isValidExplicitDest,\n  AbortException,\n  AnnotationActionEventType,\n  AnnotationBorderStyleType,\n  AnnotationEditorParamsType,\n  AnnotationEditorPrefix,\n  AnnotationEditorType,\n  AnnotationFieldFlag,\n  AnnotationFlag,\n  AnnotationMode,\n  AnnotationPrefix,\n  AnnotationRenditionOperation,\n  AnnotationReplyType,\n  AnnotationType,\n  assert,\n  BaseException,\n  BASELINE_FACTOR,\n  BBOX_INIT,\n  bytesToString,\n  createValidAbsoluteUrl,\n  DocumentActionEventType,\n  DrawOPS,\n  F32_BBOX_INIT,\n  FeatureTest,\n  FONT_IDENTITY_MATRIX,\n  FormatError,\n  getUuid,\n  getVerbosityLevel,\n  ImageKind,\n  info,\n  InvalidPDFException,\n  isArrayEqual,\n  isNodeJS,\n  LINE_DESCENT_FACTOR,\n  LINE_FACTOR,\n  makeArr,\n  makeMap,\n  makeObj,\n  MeshFigureType,\n  normalizeUnicode,\n  objectSize,\n  OPS,\n  PageActionEventType,\n  PasswordException,\n  PasswordResponses,\n  PermissionFlag,\n  RenderingIntentFlag,\n  ResponseException,\n  setVerbosityLevel,\n  shadow,\n  stringToBytes,\n  stringToUTF8String,\n  stripPath,\n  SVG_NS,\n  TextRenderingMode,\n  UnknownErrorException,\n  unreachable,\n  updateUrlHash,\n  utf8StringToString,\n  Util,\n  VerbosityLevel,\n  warn,\n};\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// TODO: Replace all occurrences of this function, and remove the file, once\n//       https://github.com/tc39/proposal-math-clamp/ is generally available.\nfunction MathClamp(v, min, max) {\n  // eslint-disable-next-line prefer-math-clamp/prefer-math-clamp\n  return Math.min(Math.max(v, min), max);\n}\n\nexport { MathClamp };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { shadow, Util } from \"../shared/util.js\";\n\n/**\n * @typedef {Object} PageViewportParameters\n * @property {Array<number>} viewBox - The xMin, yMin, xMax and\n *   yMax coordinates.\n * @property {number} userUnit - The size of units.\n * @property {number} scale - The scale of the viewport.\n * @property {number} rotation - The rotation, in degrees, of the viewport.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset. The\n *   default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset. The\n *   default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be flipped.\n *   The default value is `false`.\n */\n\n/**\n * @typedef {Object} PageViewportCloneParameters\n * @property {number} [scale] - The scale, overriding the one in the cloned\n *   viewport. The default value is `this.scale`.\n * @property {number} [rotation] - The rotation, in degrees, overriding the one\n *   in the cloned viewport. The default value is `this.rotation`.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n *   The default value is `this.offsetX`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n *   The default value is `this.offsetY`.\n * @property {boolean} [dontFlip] - If true, the x-axis will not be flipped.\n *   The default value is `false`.\n */\n\n/**\n * PDF page viewport created based on scale, rotation and offset.\n */\nclass PageViewport {\n  /**\n   * @param {PageViewportParameters}\n   */\n  constructor({\n    viewBox,\n    userUnit,\n    scale,\n    rotation,\n    offsetX = 0,\n    offsetY = 0,\n    dontFlip = false,\n  }) {\n    this.viewBox = viewBox;\n    this.userUnit = userUnit;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n\n    scale *= userUnit; // Take the userUnit into account.\n\n    // creating transform to convert pdf coordinate system to the normal\n    // canvas like coordinates taking in account scale and rotation\n    const centerX = (viewBox[2] + viewBox[0]) / 2;\n    const centerY = (viewBox[3] + viewBox[1]) / 2;\n    let rotateA, rotateB, rotateC, rotateD;\n    // Normalize the rotation, by clamping it to the [0, 360) range.\n    rotation %= 360;\n    if (rotation < 0) {\n      rotation += 360;\n    }\n    switch (rotation) {\n      case 180:\n        rotateA = -1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0;\n        rotateB = 1;\n        rotateC = 1;\n        rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0;\n        rotateB = -1;\n        rotateC = -1;\n        rotateD = 0;\n        break;\n      case 0:\n        rotateA = 1;\n        rotateB = 0;\n        rotateC = 0;\n        rotateD = -1;\n        break;\n      default:\n        throw new Error(\n          \"PageViewport: Invalid rotation, must be a multiple of 90 degrees.\"\n        );\n    }\n\n    if (dontFlip) {\n      rotateC = -rotateC;\n      rotateD = -rotateD;\n    }\n\n    let offsetCanvasX, offsetCanvasY;\n    let width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = (viewBox[3] - viewBox[1]) * scale;\n      height = (viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = (viewBox[2] - viewBox[0]) * scale;\n      height = (viewBox[3] - viewBox[1]) * scale;\n    }\n    // creating transform for the following operations:\n    // translate(-centerX, -centerY), rotate and flip vertically,\n    // scale, and translate(offsetCanvasX, offsetCanvasY)\n    this.transform = [\n      rotateA * scale,\n      rotateB * scale,\n      rotateC * scale,\n      rotateD * scale,\n      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY,\n    ];\n\n    this.width = width;\n    this.height = height;\n  }\n\n  /**\n   * The original, un-scaled, viewport dimensions.\n   * @type {Object}\n   */\n  get rawDims() {\n    const dims = this.viewBox;\n\n    return shadow(this, \"rawDims\", {\n      pageWidth: dims[2] - dims[0],\n      pageHeight: dims[3] - dims[1],\n      pageX: dims[0],\n      pageY: dims[1],\n    });\n  }\n\n  /**\n   * Clones viewport, with optional additional properties.\n   * @param {PageViewportCloneParameters} [params]\n   * @returns {PageViewport} Cloned viewport.\n   */\n  clone({\n    scale = this.scale,\n    rotation = this.rotation,\n    offsetX = this.offsetX,\n    offsetY = this.offsetY,\n    dontFlip = false,\n  } = {}) {\n    return new PageViewport({\n      viewBox: this.viewBox.slice(),\n      userUnit: this.userUnit,\n      scale,\n      rotation,\n      offsetX,\n      offsetY,\n      dontFlip,\n    });\n  }\n\n  /**\n   * Converts PDF point to the viewport coordinates. For examples, useful for\n   * converting PDF location into canvas pixel coordinates.\n   * @param {number} x - The x-coordinate.\n   * @param {number} y - The y-coordinate.\n   * @returns {Array} Array containing `x`- and `y`-coordinates of the\n   *   point in the viewport coordinate space.\n   * @see {@link convertToPdfPoint}\n   */\n  convertToViewportPoint(x, y) {\n    const p = [x, y];\n    Util.applyTransform(p, this.transform);\n    return p;\n  }\n\n  /**\n   * Converts viewport coordinates to the PDF location. For examples, useful\n   * for converting canvas pixel location into PDF one.\n   * @param {number} x - The x-coordinate.\n   * @param {number} y - The y-coordinate.\n   * @returns {Array} Array containing `x`- and `y`-coordinates of the\n   *   point in the PDF coordinate space.\n   * @see {@link convertToViewportPoint}\n   */\n  convertToPdfPoint(x, y) {\n    const p = [x, y];\n    Util.applyInverseTransform(p, this.transform);\n    return p;\n  }\n}\n\nexport { PageViewport };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./api\").TextContent} TextContent */\n\nclass XfaText {\n  /**\n   * Walk an XFA tree and create an array of text nodes that is compatible\n   * with a regular PDFs TextContent. Currently, only TextItem.str is supported,\n   * all other fields and styles haven't been implemented.\n   *\n   * @param {Object} xfa - An XFA fake DOM object.\n   *\n   * @returns {TextContent}\n   */\n  static textContent(xfa) {\n    const items = [];\n    const output = {\n      items,\n      styles: Object.create(null),\n    };\n    function walk(node) {\n      if (!node) {\n        return;\n      }\n      let str = null;\n      const name = node.name;\n      if (name === \"#text\") {\n        str = node.value;\n      } else if (!XfaText.shouldBuildText(name)) {\n        return;\n      } else if (node?.attributes?.textContent) {\n        str = node.attributes.textContent;\n      } else if (node.value) {\n        str = node.value;\n      }\n      if (str !== null) {\n        items.push({\n          str,\n        });\n      }\n      if (!node.children) {\n        return;\n      }\n      for (const child of node.children) {\n        walk(child);\n      }\n    }\n    walk(xfa);\n    return output;\n  }\n\n  /**\n   * @param {string} name - DOM node name. (lower case)\n   *\n   * @returns {boolean} true if the DOM node should have a corresponding text\n   * node.\n   */\n  static shouldBuildText(name) {\n    return !(\n      name === \"textarea\" ||\n      name === \"input\" ||\n      name === \"option\" ||\n      name === \"select\"\n    );\n  }\n}\n\nexport { XfaText };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_storage\").AnnotationStorage} AnnotationStorage */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/pdf_link_service.js\").PDFLinkService} PDFLinkService */\n\nimport { PageViewport } from \"./page_viewport.js\";\nimport { XfaText } from \"./xfa_text.js\";\n\n/**\n * @typedef {Object} XfaLayerParameters\n * @property {PageViewport} viewport\n * @property {HTMLDivElement} div\n * @property {Object} xfaHtml\n * @property {AnnotationStorage} [annotationStorage]\n * @property {PDFLinkService} linkService\n * @property {string} [intent] - (default value is 'display').\n */\n\nclass XfaLayer {\n  static setupStorage(html, id, element, storage, intent) {\n    const storedData = storage.getValue(id, { value: null });\n    switch (element.name) {\n      case \"textarea\":\n        if (storedData.value !== null) {\n          html.textContent = storedData.value;\n        }\n        if (intent === \"print\") {\n          break;\n        }\n        html.addEventListener(\"input\", event => {\n          storage.setValue(id, { value: event.target.value });\n        });\n        break;\n      case \"input\":\n        if (\n          element.attributes.type === \"radio\" ||\n          element.attributes.type === \"checkbox\"\n        ) {\n          if (storedData.value === element.attributes.xfaOn) {\n            html.setAttribute(\"checked\", true);\n          } else if (storedData.value === element.attributes.xfaOff) {\n            // The checked attribute may have been set when opening the file,\n            // unset through the UI and we're here because of printing.\n            html.removeAttribute(\"checked\");\n          }\n          if (intent === \"print\") {\n            break;\n          }\n          html.addEventListener(\"change\", event => {\n            storage.setValue(id, {\n              value: event.target.checked\n                ? event.target.getAttribute(\"xfaOn\")\n                : event.target.getAttribute(\"xfaOff\"),\n            });\n          });\n        } else {\n          if (storedData.value !== null) {\n            html.setAttribute(\"value\", storedData.value);\n          }\n          if (intent === \"print\") {\n            break;\n          }\n          html.addEventListener(\"input\", event => {\n            storage.setValue(id, { value: event.target.value });\n          });\n        }\n        break;\n      case \"select\":\n        if (storedData.value !== null) {\n          html.setAttribute(\"value\", storedData.value);\n          for (const option of element.children) {\n            if (option.attributes.value === storedData.value) {\n              option.attributes.selected = true;\n            } else if (Object.hasOwn(option.attributes, \"selected\")) {\n              delete option.attributes.selected;\n            }\n          }\n        }\n        html.addEventListener(\"input\", event => {\n          const options = event.target.options;\n          const value =\n            options.selectedIndex === -1\n              ? \"\"\n              : options[options.selectedIndex].value;\n          storage.setValue(id, { value });\n        });\n        break;\n    }\n  }\n\n  static setAttributes({ html, element, storage = null, intent, linkService }) {\n    const { attributes } = element;\n    const isHTMLAnchorElement = html instanceof HTMLAnchorElement;\n\n    if (attributes.type === \"radio\") {\n      // Avoid to have a radio group when printing with the same as one\n      // already displayed.\n      attributes.name = `${attributes.name}-${intent}`;\n    }\n    for (const [key, value] of Object.entries(attributes)) {\n      if (value === null || value === undefined) {\n        continue;\n      }\n\n      switch (key) {\n        case \"class\":\n          if (value.length) {\n            html.setAttribute(key, value.join(\" \"));\n          }\n          break;\n        case \"dataId\":\n          // We don't need to add dataId in the html object but it can\n          // be useful to know its value when writing printing tests:\n          // in this case, don't skip dataId to have its value.\n          break;\n        case \"id\":\n          html.setAttribute(\"data-element-id\", value);\n          break;\n        case \"style\":\n          Object.assign(html.style, value);\n          break;\n        case \"textContent\":\n          html.textContent = value;\n          break;\n        default:\n          if (!isHTMLAnchorElement || (key !== \"href\" && key !== \"newWindow\")) {\n            html.setAttribute(key, value);\n          }\n      }\n    }\n\n    if (isHTMLAnchorElement) {\n      linkService.addLinkAttributes(\n        html,\n        attributes.href,\n        attributes.newWindow\n      );\n    }\n\n    // Set the value after the others to be sure to overwrite any other values.\n    if (storage && attributes.dataId) {\n      this.setupStorage(html, attributes.dataId, element, storage);\n    }\n  }\n\n  /**\n   * Render the XFA layer.\n   *\n   * @param {XfaLayerParameters} parameters\n   */\n  static render(parameters) {\n    const storage = parameters.annotationStorage;\n    const linkService = parameters.linkService;\n    const root = parameters.xfaHtml;\n    const intent = parameters.intent || \"display\";\n    const rootHtml = document.createElement(root.name);\n    if (root.attributes) {\n      this.setAttributes({\n        html: rootHtml,\n        element: root,\n        intent,\n        linkService,\n      });\n    }\n\n    const isNotForRichText = intent !== \"richText\";\n    const rootDiv = parameters.div;\n    rootDiv.append(rootHtml);\n\n    if (parameters.viewport) {\n      const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n      rootDiv.style.transform = transform;\n    }\n\n    // Set defaults.\n    if (isNotForRichText) {\n      rootDiv.setAttribute(\"class\", \"xfaLayer xfaFont\");\n    }\n\n    // Text nodes used for the text highlighter.\n    const textDivs = [];\n\n    // In the rich text context, it's possible to just have a text node without\n    // a root element, so we handle this case here (see issue 17215).\n    if (root.children.length === 0) {\n      if (root.value) {\n        const node = document.createTextNode(root.value);\n        rootHtml.append(node);\n        if (isNotForRichText && XfaText.shouldBuildText(root.name)) {\n          textDivs.push(node);\n        }\n      }\n      return { textDivs };\n    }\n\n    const stack = [[root, -1, rootHtml]];\n\n    while (stack.length > 0) {\n      const [parent, i, html] = stack.at(-1);\n      if (i + 1 === parent.children.length) {\n        stack.pop();\n        continue;\n      }\n\n      const child = parent.children[++stack.at(-1)[1]];\n      if (child === null) {\n        continue;\n      }\n\n      const { name } = child;\n      if (name === \"#text\") {\n        const node = document.createTextNode(child.value);\n        textDivs.push(node);\n        html.append(node);\n        continue;\n      }\n\n      const childHtml = child?.attributes?.xmlns\n        ? document.createElementNS(child.attributes.xmlns, name)\n        : document.createElement(name);\n\n      html.append(childHtml);\n      if (child.attributes) {\n        this.setAttributes({\n          html: childHtml,\n          element: child,\n          storage,\n          intent,\n          linkService,\n        });\n      }\n\n      if (child.children?.length > 0) {\n        stack.push([child, -1, childHtml]);\n      } else if (child.value) {\n        const node = document.createTextNode(child.value);\n        if (isNotForRichText && XfaText.shouldBuildText(name)) {\n          textDivs.push(node);\n        }\n        childHtml.append(node);\n      }\n    }\n\n    /**\n     * TODO: re-enable that stuff once we've JS implementation.\n     * See https://bugzilla.mozilla.org/show_bug.cgi?id=1719465.\n     *\n     * for (const el of rootDiv.querySelectorAll(\n     * \".xfaDisabled input, .xfaDisabled textarea\"\n     * )) {\n     * el.setAttribute(\"disabled\", true);\n     * }\n     * for (const el of rootDiv.querySelectorAll(\n     * \".xfaReadOnly input, .xfaReadOnly textarea\"\n     * )) {\n     * el.setAttribute(\"readOnly\", true);\n     * }\n     */\n\n    for (const el of rootDiv.querySelectorAll(\n      \".xfaNonInteractive input, .xfaNonInteractive textarea\"\n    )) {\n      el.setAttribute(\"readOnly\", true);\n    }\n\n    return {\n      textDivs,\n    };\n  }\n\n  /**\n   * Update the XFA layer.\n   *\n   * @param {XfaLayerParameters} parameters\n   */\n  static update(parameters) {\n    const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n    parameters.div.style.transform = transform;\n    parameters.div.hidden = false;\n  }\n\n  /**\n   * NOTE: This is (mostly) intended to support printing of XFA forms.\n   */\n  static getPageViewport(xfaPage, { scale = 1, rotation = 0 }) {\n    const { width, height } = xfaPage.attributes.style;\n\n    return new PageViewport({\n      viewBox: [0, 0, parseInt(width, 10), parseInt(height, 10)],\n      userUnit: 1,\n      scale,\n      rotation,\n    });\n  }\n}\n\nexport { XfaLayer };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  BaseException,\n  DrawOPS,\n  shadow,\n  stripPath,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\nimport { PageViewport } from \"./page_viewport.js\";\nimport { XfaLayer } from \"./xfa_layer.js\";\n\nclass PixelsPerInch {\n  static CSS = 96.0;\n\n  static PDF = 72.0;\n\n  static PDF_TO_CSS_UNITS = this.CSS / this.PDF;\n}\n\nasync function fetchData(url, type = \"text\") {\n  if (\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n    isValidFetchUrl(url, document.baseURI)\n  ) {\n    const response = await fetch(url);\n    if (!response.ok) {\n      throw new Error(response.statusText);\n    }\n    switch (type) {\n      case \"blob\":\n        return response.blob();\n      case \"bytes\":\n        return response.bytes();\n      case \"json\":\n        return response.json();\n    }\n    return response.text();\n  }\n\n  // The Fetch API is not supported.\n  return new Promise((resolve, reject) => {\n    const request = new XMLHttpRequest();\n    request.open(\"GET\", url, /* async = */ true);\n    request.responseType = type === \"bytes\" ? \"arraybuffer\" : type;\n\n    request.onreadystatechange = () => {\n      if (request.readyState !== XMLHttpRequest.DONE) {\n        return;\n      }\n      if (request.status === 200 || request.status === 0) {\n        switch (type) {\n          case \"bytes\":\n            resolve(new Uint8Array(request.response));\n            return;\n          case \"blob\":\n          case \"json\":\n            resolve(request.response);\n            return;\n        }\n        resolve(request.responseText);\n        return;\n      }\n      reject(new Error(request.statusText));\n    };\n\n    request.send(null);\n  });\n}\n\nclass RenderingCancelledException extends BaseException {\n  constructor(msg, extraDelay = 0) {\n    super(msg, \"RenderingCancelledException\");\n    this.extraDelay = extraDelay;\n  }\n}\n\nfunction isDataScheme(url) {\n  const ii = url.length;\n  let i = 0;\n  while (i < ii && url[i].trim() === \"\") {\n    i++;\n  }\n  return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\n\nfunction isPdfFile(filename) {\n  return typeof filename === \"string\" && /\\.pdf$/i.test(filename);\n}\n\n/**\n * Gets the filename from a given URL.\n * @param {string} url\n * @returns {string}\n */\nfunction getFilenameFromUrl(url) {\n  [url] = url.split(/[#?]/, 1);\n  return stripPath(url);\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * @param {string} url - The original PDF location.\n * @param {string} defaultFilename - The value returned if the filename is\n *   unknown, or the protocol is unsupported.\n * @returns {string} Guessed PDF filename.\n */\nfunction getPdfFilenameFromUrl(url, defaultFilename = \"document.pdf\") {\n  if (typeof url !== \"string\") {\n    return defaultFilename;\n  }\n  if (isDataScheme(url)) {\n    warn('getPdfFilenameFromUrl: ignore \"data:\"-URL for performance reasons.');\n    return defaultFilename;\n  }\n\n  const getURL = urlString => {\n    try {\n      return new URL(urlString);\n    } catch {}\n    try {\n      return new URL(decodeURIComponent(urlString));\n    } catch {}\n    try {\n      // Attempt to parse the URL using the document's base URI.\n      return new URL(urlString, \"https://foo.bar\");\n    } catch {}\n    try {\n      return new URL(decodeURIComponent(urlString), \"https://foo.bar\");\n    } catch {}\n\n    return null;\n  };\n\n  const newURL = getURL(url);\n  if (!newURL) {\n    // If the URL is invalid, return the default filename.\n    return defaultFilename;\n  }\n\n  const decode = name => {\n    try {\n      let decoded = decodeURIComponent(name);\n      if (decoded.includes(\"/\")) {\n        decoded = stripPath(decoded);\n        // Ignore the decoded name if it's identical to \".pdf\".\n        if (decoded.length === 4 && pdfRegex.test(decoded)) {\n          return name;\n        }\n      }\n      return decoded;\n    } catch {\n      return name;\n    }\n  };\n\n  const pdfRegex = /\\.pdf$/i;\n  const filename = stripPath(newURL.pathname);\n  if (pdfRegex.test(filename)) {\n    return decode(filename);\n  }\n\n  if (newURL.searchParams.size > 0) {\n    const getLast = iterator => [...iterator].findLast(v => pdfRegex.test(v));\n\n    // If any of the search parameters ends with \".pdf\", return it.\n    const name =\n      getLast(newURL.searchParams.values()) ??\n      getLast(newURL.searchParams.keys());\n    if (name) {\n      return decode(name);\n    }\n  }\n\n  if (newURL.hash) {\n    const reFilename = /[^/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n    const hashFilename = reFilename.exec(newURL.hash);\n    if (hashFilename) {\n      return decode(hashFilename[0]);\n    }\n  }\n\n  return defaultFilename;\n}\n\nclass StatTimer {\n  #started = new Map();\n\n  times = [];\n\n  time(name) {\n    if (this.#started.has(name)) {\n      warn(`Timer is already running for ${name}`);\n    }\n    this.#started.set(name, Date.now());\n  }\n\n  timeEnd(name) {\n    if (!this.#started.has(name)) {\n      warn(`Timer has not been started for ${name}`);\n    }\n    this.times.push({\n      name,\n      start: this.#started.get(name),\n      end: Date.now(),\n    });\n    // Remove timer from started so it can be called again.\n    this.#started.delete(name);\n  }\n\n  toString() {\n    // Find the longest name for padding purposes.\n    const longest = Math.max(...this.times.map(t => t.name.length));\n\n    return this.times\n      .map(t => `${t.name.padEnd(longest)} ${t.end - t.start}ms\\n`)\n      .join(\"\");\n  }\n}\n\nfunction isValidFetchUrl(url, baseUrl) {\n  if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n    throw new Error(\"Not implemented: isValidFetchUrl\");\n  }\n  const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n  // The Fetch API only supports the http/https protocols, and not file/ftp.\n  return /https?:/.test(res?.protocol ?? \"\");\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenu(e) {\n  e.preventDefault();\n}\n\nfunction stopEvent(e) {\n  e.preventDefault();\n  e.stopPropagation();\n}\n\n// Deprecated API function -- display regardless of the `verbosity` setting.\nfunction deprecated(details) {\n  // eslint-disable-next-line no-console\n  console.log(\"Deprecated API usage: \" + details);\n}\n\nclass PDFDateString {\n  static #regex;\n\n  /**\n   * Convert a PDF date string to a JavaScript `Date` object.\n   *\n   * The PDF date string format is described in section 7.9.4 of the official\n   * PDF 32000-1:2008 specification. However, in the PDF 1.7 reference (sixth\n   * edition) Adobe describes the same format including a trailing apostrophe.\n   * This syntax in incorrect, but Adobe Acrobat creates PDF files that contain\n   * them. We ignore all apostrophes as they are not necessary for date parsing.\n   *\n   * Moreover, Adobe Acrobat doesn't handle changing the date to universal time\n   * and doesn't use the user's time zone (effectively ignoring the HH' and mm'\n   * parts of the date string).\n   *\n   * @param {string} input\n   * @returns {Date|null}\n   */\n  static toDateObject(input) {\n    if (input instanceof Date) {\n      return input;\n    }\n    if (!input || typeof input !== \"string\") {\n      return null;\n    }\n\n    // Lazily initialize the regular expression.\n    this.#regex ||= new RegExp(\n      \"^D:\" + // Prefix (required)\n        \"(\\\\d{4})\" + // Year (required)\n        \"(\\\\d{2})?\" + // Month (optional)\n        \"(\\\\d{2})?\" + // Day (optional)\n        \"(\\\\d{2})?\" + // Hour (optional)\n        \"(\\\\d{2})?\" + // Minute (optional)\n        \"(\\\\d{2})?\" + // Second (optional)\n        \"([Z|+\\\\-])?\" + // Universal time relation (optional)\n        \"(\\\\d{2})?\" + // Offset hour (optional)\n        \"'?\" + // Splitting apostrophe (optional)\n        \"(\\\\d{2})?\" + // Offset minute (optional)\n        \"'?\" // Trailing apostrophe (optional)\n    );\n\n    // Optional fields that don't satisfy the requirements from the regular\n    // expression (such as incorrect digit counts or numbers that are out of\n    // range) will fall back the defaults from the specification.\n    const matches = this.#regex.exec(input);\n    if (!matches) {\n      return null;\n    }\n\n    // JavaScript's `Date` object expects the month to be between 0 and 11\n    // instead of 1 and 12, so we have to correct for that.\n    const year = parseInt(matches[1], 10);\n    let month = parseInt(matches[2], 10);\n    month = month >= 1 && month <= 12 ? month - 1 : 0;\n    let day = parseInt(matches[3], 10);\n    day = day >= 1 && day <= 31 ? day : 1;\n    let hour = parseInt(matches[4], 10);\n    hour = hour >= 0 && hour <= 23 ? hour : 0;\n    let minute = parseInt(matches[5], 10);\n    minute = minute >= 0 && minute <= 59 ? minute : 0;\n    let second = parseInt(matches[6], 10);\n    second = second >= 0 && second <= 59 ? second : 0;\n    const universalTimeRelation = matches[7] || \"Z\";\n    let offsetHour = parseInt(matches[8], 10);\n    offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;\n    let offsetMinute = parseInt(matches[9], 10) || 0;\n    offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;\n\n    // Universal time relation 'Z' means that the local time is equal to the\n    // universal time, whereas the relations '+'/'-' indicate that the local\n    // time is later respectively earlier than the universal time. Every date\n    // is normalized to universal time.\n    if (universalTimeRelation === \"-\") {\n      hour += offsetHour;\n      minute += offsetMinute;\n    } else if (universalTimeRelation === \"+\") {\n      hour -= offsetHour;\n      minute -= offsetMinute;\n    }\n\n    return new Date(Date.UTC(year, month, day, hour, minute, second));\n  }\n}\n\nfunction getRGBA(color) {\n  if (color.startsWith(\"#\")) {\n    // #RRGGBB or #RRGGBBAA\n    const hex = color.slice(1);\n    return [\n      parseInt(hex.slice(0, 2), 16),\n      parseInt(hex.slice(2, 4), 16),\n      parseInt(hex.slice(4, 6), 16),\n      hex.length >= 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1,\n    ];\n  }\n\n  if (color.startsWith(\"rgb(\")) {\n    // getComputedStyle(...).color returns a `rgb(R, G, B)` color.\n    const [r, g, b] = color\n      .slice(/* \"rgb(\".length */ 4, -1) // Strip out \"rgb(\" and \")\".\n      .split(\",\")\n      .map(x => parseInt(x, 10));\n    return [r, g, b, 1];\n  }\n\n  if (color.startsWith(\"rgba(\")) {\n    const parts = color\n      .slice(/* \"rgba(\".length */ 5, -1) // Strip out \"rgba(\" and \")\".\n      .split(\",\");\n    return [\n      parseInt(parts[0], 10),\n      parseInt(parts[1], 10),\n      parseInt(parts[2], 10),\n      parseFloat(parts[3]),\n    ];\n  }\n\n  // color(srgb r g b / a) 鈥� CSS Color 4, used e.g. by Firefox alpha inputs.\n  // Components are in [0, 1]; alpha may be \"none\" (treated as fully opaque).\n  const m = color.match(\n    /^color\\(srgb\\s+([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*([\\d.]+|none))?\\)$/\n  );\n  if (m) {\n    return [\n      Math.round(parseFloat(m[1]) * 255),\n      Math.round(parseFloat(m[2]) * 255),\n      Math.round(parseFloat(m[3]) * 255),\n      m[4] !== undefined && m[4] !== \"none\" ? parseFloat(m[4]) : 1,\n    ];\n  }\n\n  return null;\n}\n\nfunction getRGB(color) {\n  const rgba = getRGBA(color);\n  if (!rgba) {\n    warn(`Not a valid color format: \"${color}\"`);\n    return [0, 0, 0];\n  }\n  return rgba.slice(0, 3);\n}\n\nfunction getColorValues(colors) {\n  const span = document.createElement(\"span\");\n  span.style.visibility = \"hidden\";\n  // NOTE: The following does *not* affect `forced-colors: active` mode.\n  span.style.colorScheme = \"only light\";\n  document.body.append(span);\n  for (const name of colors.keys()) {\n    span.style.color = name;\n    const computedColor = window.getComputedStyle(span).color;\n    colors.set(name, getRGB(computedColor));\n  }\n  span.remove();\n}\n\nfunction getCurrentTransform(ctx) {\n  const { a, b, c, d, e, f } = ctx.getTransform();\n  return [a, b, c, d, e, f];\n}\n\nfunction getCurrentTransformInverse(ctx) {\n  const { a, b, c, d, e, f } = ctx.getTransform().invertSelf();\n  return [a, b, c, d, e, f];\n}\n\n/**\n * @param {HTMLDivElement} div\n * @param {PageViewport} viewport\n * @param {boolean} mustFlip\n * @param {boolean} mustRotate\n */\nfunction setLayerDimensions(\n  div,\n  viewport,\n  mustFlip = false,\n  mustRotate = true\n) {\n  if (viewport instanceof PageViewport) {\n    const { pageWidth, pageHeight } = viewport.rawDims;\n    const { style } = div;\n\n    const widthStr = `round(down, var(--total-scale-factor) * ${pageWidth}px, var(--scale-round-x))`,\n      heightStr = `round(down, var(--total-scale-factor) * ${pageHeight}px, var(--scale-round-y))`;\n\n    if (!mustFlip || viewport.rotation % 180 === 0) {\n      style.width = widthStr;\n      style.height = heightStr;\n    } else {\n      style.width = heightStr;\n      style.height = widthStr;\n    }\n  }\n\n  if (mustRotate) {\n    div.setAttribute(\"data-main-rotation\", viewport.rotation);\n  }\n}\n\n/**\n * Scale factors for the canvas, necessary with HiDPI displays.\n */\nclass OutputScale {\n  constructor() {\n    const { pixelRatio } = OutputScale;\n\n    /**\n     * @type {number} Horizontal scale.\n     */\n    this.sx = pixelRatio;\n\n    /**\n     * @type {number} Vertical scale.\n     */\n    this.sy = pixelRatio;\n  }\n\n  /**\n   * @type {boolean} Returns `true` when scaling is required, `false` otherwise.\n   */\n  get scaled() {\n    return this.sx !== 1 || this.sy !== 1;\n  }\n\n  /**\n   * @type {boolean} Returns `true` when scaling is symmetric,\n   *   `false` otherwise.\n   */\n  get symmetric() {\n    return this.sx === this.sy;\n  }\n\n  /**\n   * @returns {boolean} Returns `true` if scaling was limited,\n   *   `false` otherwise.\n   */\n  limitCanvas(width, height, maxPixels, maxDim, capAreaFactor = -1) {\n    let maxAreaScale = Infinity,\n      maxWidthScale = Infinity,\n      maxHeightScale = Infinity;\n\n    maxPixels = OutputScale.capPixels(maxPixels, capAreaFactor);\n    if (maxPixels > 0) {\n      maxAreaScale = Math.sqrt(maxPixels / (width * height));\n    }\n    if (maxDim !== -1) {\n      maxWidthScale = maxDim / width;\n      maxHeightScale = maxDim / height;\n    }\n    const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale);\n\n    if (this.sx > maxScale || this.sy > maxScale) {\n      this.sx = maxScale;\n      this.sy = maxScale;\n      return true;\n    }\n    return false;\n  }\n\n  static get pixelRatio() {\n    return globalThis.devicePixelRatio || 1;\n  }\n\n  static capPixels(maxPixels, capAreaFactor) {\n    if (capAreaFactor >= 0) {\n      const winPixels = Math.ceil(\n        (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")\n          ? window.innerWidth * window.innerHeight\n          : window.screen.availWidth * window.screen.availHeight) *\n          this.pixelRatio ** 2 *\n          (1 + capAreaFactor / 100)\n      );\n      return maxPixels > 0 ? Math.min(maxPixels, winPixels) : winPixels;\n    }\n    return maxPixels;\n  }\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types\n// to know which types are supported by the browser.\nconst SupportedImageMimeTypes = [\n  \"image/apng\",\n  \"image/avif\",\n  \"image/bmp\",\n  \"image/gif\",\n  \"image/jpeg\",\n  \"image/png\",\n  \"image/svg+xml\",\n  \"image/webp\",\n  \"image/x-icon\",\n];\n\nclass ColorScheme {\n  static get isDarkMode() {\n    return shadow(\n      this,\n      \"isDarkMode\",\n      !!window?.matchMedia?.(\"(prefers-color-scheme: dark)\").matches\n    );\n  }\n}\n\nclass CSSConstants {\n  static get commentForegroundColor() {\n    const element = document.createElement(\"span\");\n    element.classList.add(\"comment\", \"sidebar\");\n    const { style } = element;\n    style.width = style.height = \"0\";\n    style.display = \"none\";\n    style.color = \"var(--comment-fg-color)\";\n    document.body.append(element);\n    const { color } = window.getComputedStyle(element);\n    element.remove();\n    return shadow(this, \"commentForegroundColor\", getRGB(color));\n  }\n}\n\nfunction applyOpacity(color, opacity) {\n  opacity = MathClamp(opacity ?? 1, 0, 1);\n  const white = 255 * (1 - opacity);\n  return color.map(c => Math.round(c * opacity + white));\n}\n\nfunction RGBToHSL(rgb, output) {\n  const r = rgb[0] / 255;\n  const g = rgb[1] / 255;\n  const b = rgb[2] / 255;\n\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n\n  if (max === min) {\n    // achromatic\n    output[0] = output[1] = 0; // hue and saturation are 0\n  } else {\n    const d = max - min;\n    output[1] = l < 0.5 ? d / (max + min) : d / (2 - max - min);\n    // hue\n    switch (max) {\n      case r:\n        output[0] = ((g - b) / d + (g < b ? 6 : 0)) * 60;\n        break;\n      case g:\n        output[0] = ((b - r) / d + 2) * 60;\n        break;\n      case b:\n        output[0] = ((r - g) / d + 4) * 60;\n        break;\n    }\n  }\n  output[2] = l;\n}\n\nfunction HSLToRGB(hsl, output) {\n  const h = hsl[0];\n  const s = hsl[1];\n  const l = hsl[2];\n  const c = (1 - Math.abs(2 * l - 1)) * s; // chroma\n  const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n  const m = l - c / 2;\n\n  switch (Math.floor(h / 60)) {\n    case 0:\n      output[0] = c + m;\n      output[1] = x + m;\n      output[2] = m;\n      break;\n    case 1:\n      output[0] = x + m;\n      output[1] = c + m;\n      output[2] = m;\n      break;\n    case 2:\n      output[0] = m;\n      output[1] = c + m;\n      output[2] = x + m;\n      break;\n    case 3:\n      output[0] = m;\n      output[1] = x + m;\n      output[2] = c + m;\n      break;\n    case 4:\n      output[0] = x + m;\n      output[1] = m;\n      output[2] = c + m;\n      break;\n    case 5:\n    case 6:\n      output[0] = c + m;\n      output[1] = m;\n      output[2] = x + m;\n      break;\n  }\n}\n\nfunction computeLuminance(x) {\n  return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n}\n\nfunction contrastRatio(hsl1, hsl2, output) {\n  HSLToRGB(hsl1, output);\n  output.map(computeLuminance);\n  const lum1 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2];\n  HSLToRGB(hsl2, output);\n  output.map(computeLuminance);\n  const lum2 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2];\n  return lum1 > lum2\n    ? (lum1 + 0.05) / (lum2 + 0.05)\n    : (lum2 + 0.05) / (lum1 + 0.05);\n}\n\n// Cache for the findContrastColor function, to improve performance.\nconst contrastCache = new Map();\n\n/**\n * Find a color that has sufficient contrast against a fixed color.\n * The luminance (in HSL color space) of the base color is adjusted\n * until the contrast ratio between the base color and the fixed color\n * is at least the minimum contrast ratio required by WCAG 2.1.\n * @param {Array<number>} baseColor\n * @param {Array<number>} fixedColor\n * @returns {string}\n */\nfunction findContrastColor(baseColor, fixedColor) {\n  const key =\n    baseColor[0] +\n    baseColor[1] * 0x100 +\n    baseColor[2] * 0x10000 +\n    fixedColor[0] * 0x1000000 +\n    fixedColor[1] * 0x100000000 +\n    fixedColor[2] * 0x10000000000;\n  let cachedValue = contrastCache.get(key);\n  if (cachedValue) {\n    return cachedValue;\n  }\n  const array = new Float32Array(9);\n  const output = array.subarray(0, 3);\n  const baseHSL = array.subarray(3, 6);\n  RGBToHSL(baseColor, baseHSL);\n  const fixedHSL = array.subarray(6, 9);\n  RGBToHSL(fixedColor, fixedHSL);\n  const isFixedColorDark = fixedHSL[2] < 0.5;\n\n  // Use the contrast ratio requirements from WCAG 2.1.\n  // https://www.w3.org/TR/WCAG21/#contrast-minimum\n  // https://www.w3.org/TR/WCAG21/#contrast-enhanced\n  const minContrast = isFixedColorDark ? 12 : 4.5;\n\n  baseHSL[2] = isFixedColorDark\n    ? Math.sqrt(baseHSL[2])\n    : 1 - Math.sqrt(1 - baseHSL[2]);\n\n  if (contrastRatio(baseHSL, fixedHSL, output) < minContrast) {\n    let start, end;\n    if (isFixedColorDark) {\n      start = baseHSL[2];\n      end = 1;\n    } else {\n      start = 0;\n      end = baseHSL[2];\n    }\n    const PRECISION = 0.005;\n    while (end - start > PRECISION) {\n      const mid = (baseHSL[2] = (start + end) / 2);\n      if (\n        isFixedColorDark ===\n        contrastRatio(baseHSL, fixedHSL, output) < minContrast\n      ) {\n        start = mid;\n      } else {\n        end = mid;\n      }\n    }\n    baseHSL[2] = isFixedColorDark ? end : start;\n  }\n\n  HSLToRGB(baseHSL, output);\n  cachedValue = Util.makeHexColor(\n    Math.round(output[0] * 255),\n    Math.round(output[1] * 255),\n    Math.round(output[2] * 255)\n  );\n  contrastCache.set(key, cachedValue);\n  return cachedValue;\n}\n\nfunction renderRichText({ html, dir, className }, container) {\n  const fragment = document.createDocumentFragment();\n  if (typeof html === \"string\") {\n    const p = document.createElement(\"p\");\n    p.dir = dir || \"auto\";\n    const lines = html.split(/\\r\\n?|\\n/);\n    for (let i = 0, ii = lines.length; i < ii; ++i) {\n      const line = lines[i];\n      p.append(document.createTextNode(line));\n      if (i < ii - 1) {\n        p.append(document.createElement(\"br\"));\n      }\n    }\n    fragment.append(p);\n  } else {\n    XfaLayer.render({\n      xfaHtml: html,\n      div: fragment,\n      intent: \"richText\",\n    });\n  }\n  fragment.firstElementChild.classList.add(\"richText\", className);\n  container.append(fragment);\n}\n\nfunction makePathFromDrawOPS(data) {\n  // Using a SVG string is slightly slower than using the following loop.\n  const path = new Path2D();\n  if (!data) {\n    return path;\n  }\n  for (let i = 0, ii = data.length; i < ii; ) {\n    switch (data[i++]) {\n      case DrawOPS.moveTo:\n        path.moveTo(data[i++], data[i++]);\n        break;\n      case DrawOPS.lineTo:\n        path.lineTo(data[i++], data[i++]);\n        break;\n      case DrawOPS.curveTo:\n        path.bezierCurveTo(\n          data[i++],\n          data[i++],\n          data[i++],\n          data[i++],\n          data[i++],\n          data[i++]\n        );\n        break;\n      case DrawOPS.quadraticCurveTo:\n        path.quadraticCurveTo(data[i++], data[i++], data[i++], data[i++]);\n        break;\n      case DrawOPS.closePath:\n        path.closePath();\n        break;\n      default:\n        warn(`Unrecognized drawing path operator: ${data[i - 1]}`);\n        break;\n    }\n  }\n  return path;\n}\n\nexport {\n  applyOpacity,\n  ColorScheme,\n  CSSConstants,\n  deprecated,\n  fetchData,\n  findContrastColor,\n  getColorValues,\n  getCurrentTransform,\n  getCurrentTransformInverse,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getRGB,\n  getRGBA,\n  isDataScheme,\n  isPdfFile,\n  isValidFetchUrl,\n  makePathFromDrawOPS,\n  noContextMenu,\n  OutputScale,\n  PDFDateString,\n  PixelsPerInch,\n  RenderingCancelledException,\n  renderRichText,\n  setLayerDimensions,\n  StatTimer,\n  stopEvent,\n  SupportedImageMimeTypes,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\n\nclass EditorToolbar {\n  #toolbar = null;\n\n  #colorPicker = null;\n\n  #editor;\n\n  #buttons = null;\n\n  #altText = null;\n\n  #comment = null;\n\n  #commentButtonDivider = null;\n\n  #signatureDescriptionButton = null;\n\n  static #l10nRemove = null;\n\n  constructor(editor) {\n    this.#editor = editor;\n\n    EditorToolbar.#l10nRemove ||= Object.freeze({\n      freetext: \"pdfjs-editor-remove-freetext-button\",\n      highlight: \"pdfjs-editor-remove-highlight-button\",\n      ink: \"pdfjs-editor-remove-ink-button\",\n      stamp: \"pdfjs-editor-remove-stamp-button\",\n      signature: \"pdfjs-editor-remove-signature-button\",\n    });\n  }\n\n  render() {\n    const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n    editToolbar.classList.add(\"editToolbar\", \"hidden\");\n    editToolbar.setAttribute(\"role\", \"toolbar\");\n\n    const signal = this.#editor._uiManager._signal;\n    if (signal instanceof AbortSignal && !signal.aborted) {\n      editToolbar.addEventListener(\"contextmenu\", noContextMenu, { signal });\n      editToolbar.addEventListener(\"pointerdown\", EditorToolbar.#pointerDown, {\n        signal,\n      });\n    }\n\n    const buttons = (this.#buttons = document.createElement(\"div\"));\n    buttons.className = \"buttons\";\n    editToolbar.append(buttons);\n\n    const position = this.#editor.toolbarPosition;\n    if (position) {\n      const { style } = editToolbar;\n      const x =\n        this.#editor._uiManager.direction === \"ltr\"\n          ? 1 - position[0]\n          : position[0];\n      style.insetInlineEnd = `${100 * x}%`;\n      style.top = `calc(${\n        100 * position[1]\n      }% + var(--editor-toolbar-vert-offset))`;\n    }\n\n    return editToolbar;\n  }\n\n  get div() {\n    return this.#toolbar;\n  }\n\n  static #pointerDown(e) {\n    e.stopPropagation();\n  }\n\n  #focusIn(e) {\n    this.#editor._focusEventsAllowed = false;\n    stopEvent(e);\n  }\n\n  #focusOut(e) {\n    this.#editor._focusEventsAllowed = true;\n    stopEvent(e);\n  }\n\n  #addListenersToElement(element) {\n    // If we're clicking on a button with the keyboard or with\n    // the mouse, we don't want to trigger any focus events on\n    // the editor.\n    const signal = this.#editor._uiManager._signal;\n    if (!(signal instanceof AbortSignal) || signal.aborted) {\n      return false;\n    }\n    element.addEventListener(\"focusin\", this.#focusIn.bind(this), {\n      capture: true,\n      signal,\n    });\n    element.addEventListener(\"focusout\", this.#focusOut.bind(this), {\n      capture: true,\n      signal,\n    });\n    element.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    return true;\n  }\n\n  hide() {\n    this.#toolbar.classList.add(\"hidden\");\n    this.#colorPicker?.hideDropdown();\n  }\n\n  show() {\n    this.#toolbar.classList.remove(\"hidden\");\n    this.#altText?.shown();\n    this.#comment?.shown();\n  }\n\n  addDeleteButton() {\n    const { editorType, _uiManager } = this.#editor;\n\n    const button = document.createElement(\"button\");\n    button.classList.add(\"basic\", \"deleteButton\");\n    button.tabIndex = 0;\n    button.setAttribute(\"data-l10n-id\", EditorToolbar.#l10nRemove[editorType]);\n    if (this.#addListenersToElement(button)) {\n      button.addEventListener(\n        \"click\",\n        e => {\n          _uiManager.delete();\n        },\n        { signal: _uiManager._signal }\n      );\n    }\n    this.#buttons.append(button);\n  }\n\n  get #divider() {\n    const divider = document.createElement(\"div\");\n    divider.className = \"divider\";\n    return divider;\n  }\n\n  async addAltText(altText) {\n    const button = await altText.render();\n    this.#addListenersToElement(button);\n    this.#buttons.append(button, this.#divider);\n    this.#altText = altText;\n  }\n\n  addComment(comment, beforeElement = null) {\n    if (this.#comment) {\n      return;\n    }\n    const button = comment.renderForToolbar();\n    if (!button) {\n      return;\n    }\n    this.#addListenersToElement(button);\n    const divider = (this.#commentButtonDivider = this.#divider);\n    if (!beforeElement) {\n      this.#buttons.append(button, divider);\n    } else {\n      this.#buttons.insertBefore(button, beforeElement);\n      this.#buttons.insertBefore(divider, beforeElement);\n    }\n    this.#comment = comment;\n    comment.toolbar = this;\n  }\n\n  addColorPicker(colorPicker) {\n    if (this.#colorPicker) {\n      return;\n    }\n    this.#colorPicker = colorPicker;\n    const button = colorPicker.renderButton();\n    this.#addListenersToElement(button);\n    this.#buttons.append(button, this.#divider);\n  }\n\n  async addEditSignatureButton(signatureManager) {\n    const button = (this.#signatureDescriptionButton =\n      await signatureManager.renderEditButton(this.#editor));\n    this.#addListenersToElement(button);\n    this.#buttons.append(button, this.#divider);\n  }\n\n  removeButton(name) {\n    switch (name) {\n      case \"comment\":\n        this.#comment?.removeToolbarCommentButton();\n        this.#comment = null;\n        this.#commentButtonDivider?.remove();\n        this.#commentButtonDivider = null;\n        break;\n    }\n  }\n\n  async addButton(name, tool) {\n    switch (name) {\n      case \"colorPicker\":\n        if (tool) {\n          this.addColorPicker(tool);\n        }\n        break;\n      case \"altText\":\n        if (tool) {\n          await this.addAltText(tool);\n        }\n        break;\n      case \"editSignature\":\n        if (tool) {\n          await this.addEditSignatureButton(tool);\n        }\n        break;\n      case \"delete\":\n        this.addDeleteButton();\n        break;\n      case \"comment\":\n        if (tool) {\n          this.addComment(tool);\n        }\n        break;\n    }\n  }\n\n  async addButtonBefore(name, tool, beforeSelector) {\n    if (!tool && name === \"comment\") {\n      return;\n    }\n    const beforeElement = this.#buttons.querySelector(beforeSelector);\n    if (!beforeElement) {\n      return;\n    }\n    if (name === \"comment\") {\n      this.addComment(tool, beforeElement);\n    }\n  }\n\n  updateEditSignatureButton(description) {\n    if (this.#signatureDescriptionButton) {\n      this.#signatureDescriptionButton.title = description;\n    }\n  }\n\n  remove() {\n    this.#toolbar.remove();\n    this.#colorPicker?.destroy();\n    this.#colorPicker = null;\n  }\n}\n\nclass FloatingToolbar {\n  #buttons = null;\n\n  #toolbar = null;\n\n  #uiManager;\n\n  constructor(uiManager) {\n    this.#uiManager = uiManager;\n  }\n\n  #render() {\n    const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n    editToolbar.className = \"editToolbar\";\n    editToolbar.setAttribute(\"role\", \"toolbar\");\n\n    const signal = this.#uiManager._signal;\n    if (signal instanceof AbortSignal && !signal.aborted) {\n      editToolbar.addEventListener(\"contextmenu\", noContextMenu, {\n        signal,\n      });\n    }\n\n    const buttons = (this.#buttons = document.createElement(\"div\"));\n    buttons.className = \"buttons\";\n    editToolbar.append(buttons);\n\n    if (this.#uiManager.hasCommentManager()) {\n      this.#makeButton(\n        \"commentButton\",\n        `pdfjs-comment-floating-button`,\n        \"pdfjs-comment-floating-button-label\",\n        () => {\n          this.#uiManager.commentSelection(\"floating_button\");\n        }\n      );\n    }\n\n    this.#makeButton(\n      \"highlightButton\",\n      `pdfjs-highlight-floating-button1`,\n      \"pdfjs-highlight-floating-button-label\",\n      () => {\n        this.#uiManager.highlightSelection(\"floating_button\");\n      }\n    );\n\n    return editToolbar;\n  }\n\n  #getLastPoint(boxes, isLTR) {\n    let lastY = 0;\n    let lastX = 0;\n    for (const box of boxes) {\n      const y = box.y + box.height;\n      if (y < lastY) {\n        continue;\n      }\n      const x = box.x + (isLTR ? box.width : 0);\n      if (y > lastY) {\n        lastX = x;\n        lastY = y;\n        continue;\n      }\n      if (isLTR) {\n        if (x > lastX) {\n          lastX = x;\n        }\n      } else if (x < lastX) {\n        lastX = x;\n      }\n    }\n    return [isLTR ? 1 - lastX : lastX, lastY];\n  }\n\n  show(parent, boxes, isLTR) {\n    const [x, y] = this.#getLastPoint(boxes, isLTR);\n    const { style } = (this.#toolbar ||= this.#render());\n    parent.append(this.#toolbar);\n    style.insetInlineEnd = `${100 * x}%`;\n    style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`;\n  }\n\n  hide() {\n    this.#toolbar.remove();\n  }\n\n  #makeButton(buttonClass, l10nId, labelL10nId, clickHandler) {\n    const button = document.createElement(\"button\");\n    button.classList.add(\"basic\", buttonClass);\n    button.tabIndex = 0;\n    button.setAttribute(\"data-l10n-id\", l10nId);\n    const span = document.createElement(\"span\");\n    button.append(span);\n    span.className = \"visuallyHidden\";\n    span.setAttribute(\"data-l10n-id\", labelL10nId);\n    const signal = this.#uiManager._signal;\n    if (signal instanceof AbortSignal && !signal.aborted) {\n      button.addEventListener(\"contextmenu\", noContextMenu, { signal });\n      button.addEventListener(\"click\", clickHandler, { signal });\n    }\n    this.#buttons.append(button);\n  }\n}\n\nexport { EditorToolbar, FloatingToolbar };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Keep this file in sync with `web/internal_evt.js`.\n */\n\nconst INTERNAL_EVT =\n  typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n    ? PDFJSDev.eval(\"INTERNAL_EVT\")\n    : \"internalEvent\";\n\nconst internalOpt = Object.freeze({ internal: INTERNAL_EVT });\n\nexport { INTERNAL_EVT, internalOpt };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./editor.js\").AnnotationEditor} AnnotationEditor */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n  AnnotationEditorParamsType,\n  AnnotationEditorPrefix,\n  AnnotationEditorType,\n  FeatureTest,\n  getUuid,\n  makeArr,\n  shadow,\n  SVG_NS,\n  Util,\n  warn,\n} from \"../../shared/util.js\";\nimport {\n  fetchData,\n  getColorValues,\n  getRGB,\n  PixelsPerInch,\n  stopEvent,\n} from \"../display_utils.js\";\nimport { FloatingToolbar } from \"./toolbar.js\";\nimport { internalOpt } from \"../../shared/internal_evt.js\";\n\nfunction bindEvents(obj, element, names) {\n  for (const name of names) {\n    element.addEventListener(name, obj[name].bind(obj));\n  }\n}\n\n/**\n * Class to store current pointers used by the editor to be able to handle\n * multiple pointers (e.g. two fingers, a pen, a mouse, ...).\n */\nclass CurrentPointers {\n  // To manage the pointer events.\n\n  // The pointerId  and pointerIds are used to keep track of\n  // the pointers with a same type (e.g. two fingers).\n  static #pointerId = NaN;\n\n  static #pointerIds = null;\n\n  // Track the timestamp to know if the touchmove event is used.\n  static #moveTimestamp = NaN;\n\n  // The pointerType is used to know if we are using a mouse, a pen or a touch.\n  static #pointerType = null;\n\n  static initializeAndAddPointerId(pointerId) {\n    // Store pointer ids. For example, the user is using a second finger.\n    (CurrentPointers.#pointerIds ||= new Set()).add(pointerId);\n  }\n\n  static setPointer(pointerType, pointerId) {\n    CurrentPointers.#pointerId ||= pointerId;\n    CurrentPointers.#pointerType ??= pointerType;\n  }\n\n  static setTimeStamp(timeStamp) {\n    CurrentPointers.#moveTimestamp = timeStamp;\n  }\n\n  static isSamePointerId(pointerId) {\n    return CurrentPointers.#pointerId === pointerId;\n  }\n\n  // Check if it's the same pointer id, otherwise remove it from the set.\n  static isSamePointerIdOrRemove(pointerId) {\n    if (CurrentPointers.#pointerId === pointerId) {\n      return true;\n    }\n\n    CurrentPointers.#pointerIds?.delete(pointerId);\n    return false;\n  }\n\n  static isSamePointerType(pointerType) {\n    return CurrentPointers.#pointerType === pointerType;\n  }\n\n  static isInitializedAndDifferentPointerType(pointerType) {\n    return (\n      CurrentPointers.#pointerType !== null &&\n      !CurrentPointers.isSamePointerType(pointerType)\n    );\n  }\n\n  static isSameTimeStamp(timeStamp) {\n    return CurrentPointers.#moveTimestamp === timeStamp;\n  }\n\n  static isUsingMultiplePointers() {\n    // Check if the user is using multiple fingers\n    return CurrentPointers.#pointerIds?.size >= 1;\n  }\n\n  static clearPointerType() {\n    CurrentPointers.#pointerType = null;\n  }\n\n  static clearPointerIds() {\n    CurrentPointers.#pointerId = NaN;\n    CurrentPointers.#pointerIds = null;\n  }\n\n  static clearTimeStamp() {\n    CurrentPointers.#moveTimestamp = NaN;\n  }\n}\n\n/**\n * Class to create some unique ids for the different editors.\n */\nclass IdManager {\n  #id = 0;\n\n  constructor() {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      Object.defineProperty(this, \"getNextId\", {\n        value: () => this.#id,\n      });\n    }\n  }\n\n  /**\n   * Get a unique id.\n   * @returns {string}\n   */\n  get id() {\n    return `${AnnotationEditorPrefix}${this.#id++}`;\n  }\n}\n\n/**\n * Class to manage the images used by the editors.\n * The main idea is to try to minimize the memory used by the images.\n * The images are cached and reused when possible\n * We use a refCounter to know when an image is not used anymore but we need to\n * be able to restore an image after a remove+undo, so we keep a file reference\n * or an url one.\n */\nclass ImageManager {\n  #baseId = getUuid();\n\n  #id = 0;\n\n  #cache = null;\n\n  static get _isSVGFittingCanvas() {\n    // By default, Firefox doesn't rescale without preserving the aspect ratio\n    // when drawing an SVG image on a canvas, see https://bugzilla.mozilla.org/1547776.\n    // The \"workaround\" is to append \"svgView(preserveAspectRatio(none))\" to the\n    // url, but according to comment #15, it seems that it leads to unexpected\n    // behavior in Safari.\n    const svg = `data:image/svg+xml;charset=UTF-8,<svg viewBox=\"0 0 1 1\" width=\"1\" height=\"1\" xmlns=\"${SVG_NS}\"><rect width=\"1\" height=\"1\" style=\"fill:red;\"/></svg>`;\n    const canvas = new OffscreenCanvas(1, 3);\n    const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n    const image = new Image();\n    image.src = svg;\n    const promise = image.decode().then(() => {\n      ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);\n      return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;\n    });\n\n    return shadow(this, \"_isSVGFittingCanvas\", promise);\n  }\n\n  async #get(key, rawData) {\n    this.#cache ||= new Map();\n    let data = this.#cache.get(key);\n    if (data === null) {\n      // We already tried to load the image but it failed.\n      return null;\n    }\n    if (data?.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n    try {\n      data ||= {\n        bitmap: null,\n        id: `image_${this.#baseId}_${this.#id++}`,\n        refCounter: 0,\n        isSvg: false,\n      };\n      let image;\n      if (typeof rawData === \"string\") {\n        data.url = rawData;\n        image = await fetchData(rawData, \"blob\");\n      } else if (rawData instanceof File) {\n        image = data.file = rawData;\n      } else if (rawData instanceof Blob) {\n        image = rawData;\n      }\n\n      if (image.type === \"image/svg+xml\") {\n        // Unfortunately, createImageBitmap doesn't work with SVG images.\n        // (see https://bugzilla.mozilla.org/1841972).\n        const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas;\n        const fileReader = new FileReader();\n        const imageElement = new Image();\n        const imagePromise = new Promise((resolve, reject) => {\n          imageElement.onload = () => {\n            data.bitmap = imageElement;\n            data.isSvg = true;\n            resolve();\n          };\n          fileReader.onload = async () => {\n            const url = (data.svgUrl = fileReader.result);\n            // We need to set the preserveAspectRatio to none in order to let\n            // the image fits the canvas when resizing.\n            imageElement.src = (await mustRemoveAspectRatioPromise)\n              ? `${url}#svgView(preserveAspectRatio(none))`\n              : url;\n          };\n          imageElement.onerror = fileReader.onerror = reject;\n        });\n        fileReader.readAsDataURL(image);\n        await imagePromise;\n      } else {\n        data.bitmap = await createImageBitmap(image);\n      }\n      data.refCounter = 1;\n    } catch (e) {\n      warn(e);\n      data = null;\n    }\n    this.#cache.set(key, data);\n    if (data) {\n      this.#cache.set(data.id, data);\n    }\n    return data;\n  }\n\n  async getFromFile(file) {\n    const { lastModified, name, size, type } = file;\n    return this.#get(`${lastModified}_${name}_${size}_${type}`, file);\n  }\n\n  async getFromUrl(url) {\n    return this.#get(url, url);\n  }\n\n  async getFromBlob(id, blobPromise) {\n    const blob = await blobPromise;\n    return this.#get(id, blob);\n  }\n\n  async getFromId(id) {\n    this.#cache ||= new Map();\n    const data = this.#cache.get(id);\n    if (!data) {\n      return null;\n    }\n    if (data.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n\n    if (data.file) {\n      return this.getFromFile(data.file);\n    }\n    if (data.blobPromise) {\n      const { blobPromise } = data;\n      delete data.blobPromise;\n      return this.getFromBlob(data.id, blobPromise);\n    }\n    return this.getFromUrl(data.url);\n  }\n\n  getFromCanvas(id, canvas) {\n    this.#cache ||= new Map();\n    let data = this.#cache.get(id);\n    if (data?.bitmap) {\n      data.refCounter += 1;\n      return data;\n    }\n    const offscreen = new OffscreenCanvas(canvas.width, canvas.height);\n    const ctx = offscreen.getContext(\"2d\");\n    ctx.drawImage(canvas, 0, 0);\n    data = {\n      bitmap: offscreen.transferToImageBitmap(),\n      id: `image_${this.#baseId}_${this.#id++}`,\n      refCounter: 1,\n      isSvg: false,\n    };\n    this.#cache.set(id, data);\n    this.#cache.set(data.id, data);\n    return data;\n  }\n\n  getSvgUrl(id) {\n    const data = this.#cache.get(id);\n    if (!data?.isSvg) {\n      return null;\n    }\n    return data.svgUrl;\n  }\n\n  deleteId(id) {\n    this.#cache ||= new Map();\n    const data = this.#cache.get(id);\n    if (!data) {\n      return;\n    }\n    data.refCounter -= 1;\n    if (data.refCounter !== 0) {\n      return;\n    }\n    const { bitmap } = data;\n    if (!data.url && !data.file) {\n      // The image has no way to be restored (ctrl+z) so we must fix that.\n      const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n      const ctx = canvas.getContext(\"bitmaprenderer\");\n      ctx.transferFromImageBitmap(bitmap);\n      data.blobPromise = canvas.convertToBlob();\n    }\n\n    bitmap.close?.();\n    data.bitmap = null;\n  }\n\n  // We can use the id only if it belongs this manager.\n  // We must take care of having the right manager because we can copy/paste\n  // some images from other documents, hence it'd be a pity to use an id from an\n  // other manager.\n  isValidId(id) {\n    return id.startsWith(`image_${this.#baseId}_`);\n  }\n}\n\n/**\n * Class to handle undo/redo.\n * Commands are just saved in a buffer.\n * If we hit some memory issues we could likely use a circular buffer.\n * It has to be used as a singleton.\n */\nclass CommandManager {\n  #commands = [];\n\n  #locked = false;\n\n  #maxSize;\n\n  #position = -1;\n\n  constructor(maxSize = 128) {\n    this.#maxSize = maxSize;\n  }\n\n  /**\n   * @typedef {Object} addOptions\n   * @property {function} cmd\n   * @property {function} undo\n   * @property {function} [post]\n   * @property {boolean} mustExec\n   * @property {number} type\n   * @property {boolean} overwriteIfSameType\n   * @property {boolean} keepUndo\n   */\n\n  /**\n   * Add a new couple of commands to be used in case of redo/undo.\n   * @param {addOptions} options\n   */\n  add({\n    cmd,\n    undo,\n    post,\n    mustExec,\n    type = NaN,\n    overwriteIfSameType = false,\n    keepUndo = false,\n  }) {\n    if (mustExec) {\n      cmd();\n    }\n\n    if (this.#locked) {\n      return;\n    }\n\n    const save = { cmd, undo, post, type };\n    if (this.#position === -1) {\n      if (this.#commands.length > 0) {\n        // All the commands have been undone and then a new one is added\n        // hence we clear the queue.\n        this.#commands.length = 0;\n      }\n      this.#position = 0;\n      this.#commands.push(save);\n      return;\n    }\n\n    if (overwriteIfSameType && this.#commands[this.#position].type === type) {\n      // For example when we change a color we don't want to\n      // be able to undo all the steps, hence we only want to\n      // keep the last undoable action in this sequence of actions.\n      if (keepUndo) {\n        save.undo = this.#commands[this.#position].undo;\n      }\n      this.#commands[this.#position] = save;\n      return;\n    }\n\n    const next = this.#position + 1;\n    if (next === this.#maxSize) {\n      this.#commands.splice(0, 1);\n    } else {\n      this.#position = next;\n      if (next < this.#commands.length) {\n        this.#commands.splice(next);\n      }\n    }\n\n    this.#commands.push(save);\n  }\n\n  /**\n   * Undo the last command.\n   */\n  undo() {\n    if (this.#position === -1) {\n      // Nothing to undo.\n      return;\n    }\n\n    // Avoid to insert something during the undo execution.\n    this.#locked = true;\n    const { undo, post } = this.#commands[this.#position];\n    undo();\n    post?.();\n    this.#locked = false;\n\n    this.#position -= 1;\n  }\n\n  /**\n   * Redo the last command.\n   */\n  redo() {\n    if (this.#position < this.#commands.length - 1) {\n      this.#position += 1;\n\n      // Avoid to insert something during the redo execution.\n      this.#locked = true;\n      const { cmd, post } = this.#commands[this.#position];\n      cmd();\n      post?.();\n      this.#locked = false;\n    }\n  }\n\n  /**\n   * Check if there is something to undo.\n   * @returns {boolean}\n   */\n  hasSomethingToUndo() {\n    return this.#position !== -1;\n  }\n\n  /**\n   * Check if there is something to redo.\n   * @returns {boolean}\n   */\n  hasSomethingToRedo() {\n    return this.#position < this.#commands.length - 1;\n  }\n\n  cleanType(type) {\n    if (this.#position === -1) {\n      return;\n    }\n    for (let i = this.#position; i >= 0; i--) {\n      if (this.#commands[i].type !== type) {\n        this.#commands.splice(i + 1, this.#position - i);\n        this.#position = i;\n        return;\n      }\n    }\n    this.#commands.length = 0;\n    this.#position = -1;\n  }\n\n  destroy() {\n    this.#commands = null;\n  }\n}\n\n/**\n * Class to handle the different keyboards shortcuts we can have on mac or\n * non-mac OSes.\n */\nclass KeyboardManager {\n  static ALT = 0x1;\n\n  static CTRL = 0x2;\n\n  static META = 0x4;\n\n  static SHIFT = 0x8;\n\n  /**\n   * Create a new keyboard manager class.\n   * @param {Array<Array>} callbacks - an array containing an array of shortcuts\n   * and a callback to call. If the array contains no `mac+`-prefixed entry,\n   * every shortcut applies on all platforms. As soon as it contains at least\n   * one `mac+` entry, the `mac+` ones become the macOS-only set and the bare\n   * entries apply only on non-Mac.\n   */\n  constructor(callbacks) {\n    this.callbacks = new Map();\n\n    const { isMac } = FeatureTest.platform;\n    for (const [keys, callback, options = {}] of callbacks) {\n      const hasMacOverride = keys.some(k => k.startsWith(\"mac+\"));\n      for (const key of keys) {\n        let shortcut = key;\n        if (hasMacOverride) {\n          const isMacKey = key.startsWith(\"mac+\");\n          if (isMac !== isMacKey) {\n            continue;\n          }\n          if (isMacKey) {\n            shortcut = key.slice(4);\n          }\n        }\n        const [keyName, modifiers] = KeyboardManager.#parseShortcut(shortcut);\n        if (keyName === null) {\n          continue;\n        }\n        this.callbacks\n          .getOrInsertComputed(keyName, makeArr)\n          .push({ callback, options, modifiers });\n      }\n    }\n  }\n\n  /**\n   * Parse a shortcut string like \"ctrl+shift+a\" into a `[key, modifiers]`\n   * pair. Modifier names are case-insensitive and may appear in any order;\n   * the key part is matched against `event.key` so `Space` is normalized to\n   * `\" \"` but other names like `ArrowLeft`, `Enter`, `Backspace`, and\n   * single-letter keys (`a`, `Z`) are preserved.\n   * @param {string} value\n   * @returns {[string|null, number]}\n   */\n  static #parseShortcut(value) {\n    let keyPart = null;\n    let modifiers = 0;\n    for (let part of value.split(\"+\")) {\n      part = part.trim();\n      if (!part) {\n        continue;\n      }\n      const upper = part.toUpperCase();\n      const modifier = KeyboardManager[upper];\n      if (modifier) {\n        modifiers |= modifier;\n        continue;\n      }\n      if (keyPart !== null) {\n        warn(`KeyboardManager: multiple keys in shortcut \"${value}\"`);\n        break;\n      }\n      keyPart = upper === \"SPACE\" ? \" \" : part;\n    }\n    if (keyPart === null) {\n      warn(`KeyboardManager: no key found in shortcut \"${value}\"`);\n    }\n    return [keyPart, modifiers];\n  }\n\n  /**\n   * Translate `event.code` (a layout-independent physical key identifier) to\n   * the equivalent `event.key` value on a US layout, so a Ctrl+A shortcut\n   * still fires when the user is on a layout where the \"A\" key produces a\n   * non-Latin character.\n   * @param {string} code\n   * @returns {string|null}\n   */\n  static #codeToKey(code) {\n    // KeyA..KeyZ -> a..z, Digit0..Digit9 / Numpad0..Numpad9 -> 0..9.\n    // Codes like NumpadEnter are intentionally skipped 鈥� their event.key\n    // already matches the corresponding non-numpad key.\n    const match = /^(?:Key([A-Z])|(?:Digit|Numpad)(\\d))$/.exec(code);\n    if (!match) {\n      return null;\n    }\n    return match[1]?.toLowerCase() ?? match[2];\n  }\n\n  /**\n   * Execute a callback, if any, for a given keyboard event.\n   * The self is used as `this` in the callback.\n   * @param {Object} self\n   * @param {KeyboardEvent} event\n   * @returns\n   */\n  exec(self, event) {\n    let shortcuts = this.callbacks.get(event.key);\n    if (!shortcuts) {\n      // Layout-independent fallback: on a Cyrillic layout the physical \"A\"\n      // key reports event.key=\"褎\" but event.code=\"KeyA\". This must be skipped\n      // when event.key is already a Latin letter, otherwise on AZERTY (where\n      // the \"A\" key has event.key=\"a\" but event.code=\"KeyQ\") ctrl+A would\n      // wrongly trigger ctrl+Q.\n      if (/^[a-z]$/i.test(event.key)) {\n        return;\n      }\n      const fallback = KeyboardManager.#codeToKey(event.code);\n      if (fallback === null || fallback === event.key) {\n        return;\n      }\n      shortcuts = this.callbacks.get(fallback);\n      if (!shortcuts) {\n        return;\n      }\n    }\n\n    const eventModifiers =\n      (event.altKey ? KeyboardManager.ALT : 0) |\n      (event.ctrlKey ? KeyboardManager.CTRL : 0) |\n      (event.metaKey ? KeyboardManager.META : 0) |\n      (event.shiftKey ? KeyboardManager.SHIFT : 0);\n    const info = shortcuts.find(\n      shortcut => shortcut.modifiers === eventModifiers\n    );\n    if (!info) {\n      return;\n    }\n\n    const {\n      callback,\n      options: { bubbles = false, args = [], checker = null },\n    } = info;\n\n    if (checker && !checker(self, event)) {\n      return;\n    }\n    callback.bind(self, ...args, event)();\n\n    // For example, ctrl+s in a FreeText must be handled by the viewer, hence\n    // the event must bubble.\n    if (!bubbles) {\n      stopEvent(event);\n    }\n  }\n}\n\nclass ColorManager {\n  static _colorsMapping = new Map([\n    [\"CanvasText\", [0, 0, 0]],\n    [\"Canvas\", [255, 255, 255]],\n  ]);\n\n  get _colors() {\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"LIB\") &&\n      typeof document === \"undefined\"\n    ) {\n      return shadow(this, \"_colors\", ColorManager._colorsMapping);\n    }\n\n    const colors = new Map([\n      [\"CanvasText\", null],\n      [\"Canvas\", null],\n    ]);\n    getColorValues(colors);\n    return shadow(this, \"_colors\", colors);\n  }\n\n  /**\n   * In High Contrast Mode, the color on the screen is not always the\n   * real color used in the pdf.\n   * For example in some cases white can appear to be black but when saving\n   * we want to have white.\n   * @param {string} color\n   * @returns {Array<number>}\n   */\n  convert(color) {\n    const rgb = getRGB(color);\n    if (!window.matchMedia(\"(forced-colors: active)\").matches) {\n      return rgb;\n    }\n\n    for (const [name, RGB] of this._colors) {\n      if (RGB.every((x, i) => x === rgb[i])) {\n        return ColorManager._colorsMapping.get(name);\n      }\n    }\n    return rgb;\n  }\n\n  /**\n   * An input element must have its color value as a hex string\n   * and not as color name.\n   * So this function converts a name into an hex string.\n   * @param {string} name\n   * @returns {string}\n   */\n  getHexCode(name) {\n    const rgb = this._colors.get(name);\n    if (!rgb) {\n      return name;\n    }\n    return Util.makeHexColor(...rgb);\n  }\n}\n\n/**\n * A pdf has several pages and each of them when it will rendered\n * will have an AnnotationEditorLayer which will contain the some\n * new Annotations associated to an editor in order to modify them.\n *\n * This class is used to manage all the different layers, editors and\n * some action like copy/paste, undo/redo, ...\n */\nclass AnnotationEditorUIManager {\n  #abortController = new AbortController();\n\n  #activeEditor = null;\n\n  #allEditableAnnotations = null;\n\n  #allEditors = new Map();\n\n  #allLayers = new Map();\n\n  #savedAllLayers = null;\n\n  #altTextManager = null;\n\n  #annotationStorage = null;\n\n  #changedExistingAnnotations = null;\n\n  #commandManager = new CommandManager();\n\n  #commentManager = null;\n\n  #copyPasteAC = null;\n\n  #currentDrawingSession = null;\n\n  #currentPageIndex = 0;\n\n  #deletedAnnotationsElementIds = new Set();\n\n  #draggingEditors = null;\n\n  #editorTypes = null;\n\n  #editorsToRescale = new Set();\n\n  _editorUndoBar = null;\n\n  #enableHighlightFloatingButton = false;\n\n  #enableUpdatedAddImage = false;\n\n  #enableNewAltTextWhenAddingImage = false;\n\n  #filterFactory = null;\n\n  #focusMainContainerTimeoutId = null;\n\n  #focusManagerAC = null;\n\n  #highlightColors = null;\n\n  #highlightWhenShiftUp = false;\n\n  #floatingToolbar = null;\n\n  #idManager = new IdManager();\n\n  #isEnabled = false;\n\n  #isPointerDown = false;\n\n  #isWaiting = false;\n\n  #keyboardManagerAC = null;\n\n  #lastActiveElement = null;\n\n  #mainHighlightColorPicker = null;\n\n  #missingCanvases = null;\n\n  #mlManager = null;\n\n  #mode = AnnotationEditorType.NONE;\n\n  #selectedEditors = new Set();\n\n  #selectedTextNode = null;\n\n  #signatureManager = null;\n\n  #pageColors = null;\n\n  #showAllStates = null;\n\n  #pdfDocument = null;\n\n  #previousStates = {\n    isEditing: false,\n    isEmpty: true,\n    hasSomethingToUndo: false,\n    hasSomethingToRedo: false,\n    hasSelectedEditor: false,\n    hasSelectedText: false,\n  };\n\n  #translation = [0, 0];\n\n  #translationTimeoutId = null;\n\n  #container = null;\n\n  #viewer = null;\n\n  #viewerAlert = null;\n\n  #updateModeCapability = null;\n\n  static TRANSLATE_SMALL = 1; // page units.\n\n  static TRANSLATE_BIG = 10; // page units.\n\n  static get _keyboardManager() {\n    const proto = AnnotationEditorUIManager.prototype;\n\n    /**\n     * If the focused element is an input, we don't want to handle the arrow.\n     * For example, sliders can be controlled with the arrow keys.\n     */\n    const arrowChecker = self =>\n      self.#container.contains(document.activeElement) &&\n      document.activeElement.tagName !== \"BUTTON\" &&\n      self.hasSomethingToControl();\n\n    const textInputChecker = (_self, { target: el }) => {\n      if (el instanceof HTMLInputElement) {\n        const { type } = el;\n        return type !== \"text\" && type !== \"number\";\n      }\n      return true;\n    };\n\n    const small = this.TRANSLATE_SMALL;\n    const big = this.TRANSLATE_BIG;\n\n    return shadow(\n      this,\n      \"_keyboardManager\",\n      new KeyboardManager([\n        [\n          [\"ctrl+a\", \"mac+meta+a\"],\n          proto.selectAll,\n          { checker: textInputChecker },\n        ],\n        [[\"ctrl+z\", \"mac+meta+z\"], proto.undo, { checker: textInputChecker }],\n        [\n          // On mac, depending of the OS version, the event.key is either \"z\" or\n          // \"Z\" when the user presses \"meta+shift+z\".\n          [\n            \"ctrl+y\",\n            \"ctrl+shift+z\",\n            \"mac+meta+shift+z\",\n            \"ctrl+shift+Z\",\n            \"mac+meta+shift+Z\",\n          ],\n          proto.redo,\n          { checker: textInputChecker },\n        ],\n        [\n          [\n            \"Backspace\",\n            \"alt+Backspace\",\n            \"ctrl+Backspace\",\n            \"shift+Backspace\",\n            \"mac+Backspace\",\n            \"mac+alt+Backspace\",\n            \"mac+ctrl+Backspace\",\n            \"Delete\",\n            \"ctrl+Delete\",\n            \"shift+Delete\",\n            \"mac+Delete\",\n          ],\n          proto.delete,\n          { checker: textInputChecker },\n        ],\n        [\n          [\"Enter\"],\n          proto.addNewEditorFromKeyboard,\n          {\n            // Those shortcuts can be used in the toolbar for some other actions\n            // like zooming, hence we need to check if the container has the\n            // focus.\n            checker: (self, { target: el }) =>\n              !(el instanceof HTMLButtonElement) &&\n              self.#container.contains(el) &&\n              !self.isEnterHandled,\n          },\n        ],\n        [\n          [\"Space\"],\n          proto.addNewEditorFromKeyboard,\n          {\n            // Those shortcuts can be used in the toolbar for some other actions\n            // like zooming, hence we need to check if the container has the\n            // focus.\n            checker: (self, { target: el }) =>\n              !(el instanceof HTMLButtonElement) &&\n              self.#container.contains(document.activeElement),\n          },\n        ],\n        [[\"Escape\"], proto.unselectAll],\n        [\n          [\"ArrowLeft\"],\n          proto.translateSelectedEditors,\n          { args: [-small, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n          proto.translateSelectedEditors,\n          { args: [-big, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowRight\"],\n          proto.translateSelectedEditors,\n          { args: [small, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n          proto.translateSelectedEditors,\n          { args: [big, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowUp\"],\n          proto.translateSelectedEditors,\n          { args: [0, -small], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"],\n          proto.translateSelectedEditors,\n          { args: [0, -big], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowDown\"],\n          proto.translateSelectedEditors,\n          { args: [0, small], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"],\n          proto.translateSelectedEditors,\n          { args: [0, big], checker: arrowChecker },\n        ],\n      ])\n    );\n  }\n\n  constructor(\n    container,\n    viewer,\n    viewerAlert,\n    altTextManager,\n    commentManager,\n    signatureManager,\n    eventBus,\n    pdfDocument,\n    pageColors,\n    highlightColors,\n    enableHighlightFloatingButton,\n    enableUpdatedAddImage,\n    enableNewAltTextWhenAddingImage,\n    mlManager,\n    editorUndoBar,\n    supportsPinchToZoom\n  ) {\n    const signal = (this._signal = this.#abortController.signal);\n    this.#container = container;\n    this.#viewer = viewer;\n    this.#viewerAlert = viewerAlert;\n    this.#altTextManager = altTextManager;\n    this.#commentManager = commentManager;\n    this.#signatureManager = signatureManager;\n    this.#pdfDocument = pdfDocument;\n    this._eventBus = eventBus;\n\n    const evtOpts = { signal, ...internalOpt };\n    eventBus.on(\"editingaction\", this.onEditingAction.bind(this), evtOpts);\n    eventBus.on(\"pagechanging\", this.onPageChanging.bind(this), evtOpts);\n    eventBus.on(\"scalechanging\", this.onScaleChanging.bind(this), evtOpts);\n    eventBus.on(\n      \"rotationchanging\",\n      this.onRotationChanging.bind(this),\n      evtOpts\n    );\n    eventBus.on(\"setpreference\", this.onSetPreference.bind(this), evtOpts);\n    eventBus.on(\n      \"switchannotationeditorparams\",\n      evt => this.updateParams(evt.type, evt.value),\n      evtOpts\n    );\n    window.addEventListener(\n      \"pointerdown\",\n      () => {\n        this.#isPointerDown = true;\n      },\n      { capture: true, signal }\n    );\n    window.addEventListener(\n      \"pointerup\",\n      () => {\n        this.#isPointerDown = false;\n      },\n      { capture: true, signal }\n    );\n    window.addEventListener(\"beforeunload\", this.#beforeUnload.bind(this), {\n      capture: true,\n      signal,\n    });\n    this.#addSelectionListener();\n    this.#addDragAndDropListeners();\n    this.#addKeyboardManager();\n    this.#annotationStorage = pdfDocument.annotationStorage;\n    this.#filterFactory = pdfDocument.filterFactory;\n    this.#pageColors = pageColors;\n    this.#highlightColors = highlightColors || null;\n    this.#enableHighlightFloatingButton = enableHighlightFloatingButton;\n    this.#enableUpdatedAddImage = enableUpdatedAddImage;\n    this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage;\n    this.#mlManager = mlManager || null;\n    this.viewParameters = {\n      realScale: PixelsPerInch.PDF_TO_CSS_UNITS,\n      rotation: 0,\n    };\n    this.isShiftKeyDown = false;\n    this._editorUndoBar = editorUndoBar || null;\n    this._supportsPinchToZoom = supportsPinchToZoom !== false;\n    commentManager?.setSidebarUiManager(this);\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      Object.defineProperty(this, \"getNextEditorId\", {\n        value: () => this.#idManager.getNextId(),\n      });\n    }\n  }\n\n  destroy() {\n    this.#updateModeCapability?.resolve();\n    this.#updateModeCapability = null;\n\n    this.#abortController?.abort();\n    this.#abortController = null;\n    this._signal = null;\n\n    for (const layer of this.#allLayers.values()) {\n      layer.destroy();\n    }\n    this.#allLayers.clear();\n    this.#allEditors.clear();\n    this.#editorsToRescale.clear();\n    this.#missingCanvases?.clear();\n    this.#activeEditor = null;\n    this.#selectedEditors.clear();\n    this.#commandManager.destroy();\n    this.#altTextManager?.destroy();\n    this.#commentManager?.destroy();\n    this.#signatureManager?.destroy();\n    this.#floatingToolbar?.hide();\n    this.#floatingToolbar = null;\n    this.#mainHighlightColorPicker?.destroy();\n    this.#mainHighlightColorPicker = null;\n    this.#allEditableAnnotations = null;\n    if (this.#focusMainContainerTimeoutId) {\n      clearTimeout(this.#focusMainContainerTimeoutId);\n      this.#focusMainContainerTimeoutId = null;\n    }\n    if (this.#translationTimeoutId) {\n      clearTimeout(this.#translationTimeoutId);\n      this.#translationTimeoutId = null;\n    }\n    this._editorUndoBar?.destroy();\n    this.#pdfDocument = null;\n  }\n\n  combinedSignal(ac) {\n    return AbortSignal.any([this._signal, ac.signal]);\n  }\n\n  get mlManager() {\n    return this.#mlManager;\n  }\n\n  get useNewAltTextFlow() {\n    return this.#enableUpdatedAddImage;\n  }\n\n  get useNewAltTextWhenAddingImage() {\n    return this.#enableNewAltTextWhenAddingImage;\n  }\n\n  get hcmFilter() {\n    return shadow(\n      this,\n      \"hcmFilter\",\n      this.#pageColors\n        ? this.#filterFactory.addHCMFilter(\n            this.#pageColors.foreground,\n            this.#pageColors.background\n          )\n        : \"none\"\n    );\n  }\n\n  get direction() {\n    return shadow(\n      this,\n      \"direction\",\n      getComputedStyle(this.#container).direction\n    );\n  }\n\n  get _highlightColors() {\n    return shadow(\n      this,\n      \"_highlightColors\",\n      this.#highlightColors\n        ? new Map(\n            this.#highlightColors.split(\",\").map(pair => {\n              pair = pair.split(\"=\").map(x => x.trim());\n              pair[1] = pair[1].toUpperCase();\n              return pair;\n            })\n          )\n        : null\n    );\n  }\n\n  get highlightColors() {\n    const { _highlightColors } = this;\n    if (!_highlightColors) {\n      return shadow(this, \"highlightColors\", null);\n    }\n    const map = new Map();\n    const hasHCM = !!this.#pageColors;\n    for (const [name, color] of _highlightColors) {\n      const isNameForHCM = name.endsWith(\"_HCM\");\n      if (hasHCM && isNameForHCM) {\n        map.set(name.replace(\"_HCM\", \"\"), color);\n        continue;\n      }\n      if (!hasHCM && !isNameForHCM) {\n        map.set(name, color);\n      }\n    }\n    return shadow(this, \"highlightColors\", map);\n  }\n\n  get highlightColorNames() {\n    return shadow(\n      this,\n      \"highlightColorNames\",\n      this.highlightColors\n        ? new Map(Array.from(this.highlightColors, e => e.reverse()))\n        : null\n    );\n  }\n\n  getNonHCMColor(color) {\n    if (!this._highlightColors) {\n      return color;\n    }\n    const colorName = this.highlightColorNames.get(color);\n    return this._highlightColors.get(colorName) || color;\n  }\n\n  getNonHCMColorName(color) {\n    return this.highlightColorNames.get(color) || color;\n  }\n\n  /**\n   * Set the current drawing session.\n   * @param {AnnotationEditorLayer} layer\n   */\n  setCurrentDrawingSession(layer) {\n    if (layer) {\n      this.unselectAll();\n      this.disableUserSelect(true);\n    } else {\n      this.disableUserSelect(false);\n    }\n    this.#currentDrawingSession = layer;\n  }\n\n  setMainHighlightColorPicker(colorPicker) {\n    this.#mainHighlightColorPicker = colorPicker;\n  }\n\n  editAltText(editor, firstTime = false) {\n    this.#altTextManager?.editAltText(this, editor, firstTime);\n  }\n\n  hasCommentManager() {\n    return !!this.#commentManager;\n  }\n\n  editComment(editor, posX, posY, options) {\n    this.#commentManager?.showDialog(this, editor, posX, posY, options);\n  }\n\n  selectComment(pageIndex, uid) {\n    const layer = this.#allLayers.get(pageIndex);\n    const editor = layer?.getEditorByUID(uid);\n    editor?.toggleComment(/* isSelected */ true, /* visibility */ true);\n  }\n\n  updateComment(editor) {\n    this.#commentManager?.updateComment(editor.getData());\n  }\n\n  updatePopupColor(editor) {\n    this.#commentManager?.updatePopupColor(editor);\n  }\n\n  removeComment(editor) {\n    this.#commentManager?.removeComments([editor.uid]);\n  }\n\n  /**\n   * Delete a comment from an editor with undo support.\n   * @param {AnnotationEditor} editor - The editor whose comment to delete.\n   * @param {Object} savedData - The comment data to save for undo.\n   */\n  deleteComment(editor, savedData) {\n    const undo = () => {\n      editor.comment = savedData;\n    };\n    const cmd = () => {\n      this._editorUndoBar?.show(undo, \"comment\");\n      this.toggleComment(/* editor = */ null);\n      editor.comment = null;\n    };\n    this.addCommands({ cmd, undo, mustExec: true });\n  }\n\n  toggleComment(editor, isSelected, visibility = undefined) {\n    this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility);\n  }\n\n  makeCommentColor(color, opacity) {\n    return (\n      (color && this.#commentManager?.makeCommentColor(color, opacity)) || null\n    );\n  }\n\n  getCommentDialogElement() {\n    return this.#commentManager?.dialogElement || null;\n  }\n\n  async waitForEditorsRendered(pageNumber) {\n    if (this.#allLayers.has(pageNumber - 1)) {\n      return;\n    }\n    const { resolve, promise } = Promise.withResolvers();\n    const onEditorsRendered = evt => {\n      if (evt.pageNumber === pageNumber) {\n        this._eventBus.off(\"editorsrendered\", onEditorsRendered);\n        resolve();\n      }\n    };\n    this._eventBus.on(\"editorsrendered\", onEditorsRendered, internalOpt);\n    await promise;\n  }\n\n  getSignature(editor) {\n    this.#signatureManager?.getSignature({ uiManager: this, editor });\n  }\n\n  get signatureManager() {\n    return this.#signatureManager;\n  }\n\n  switchToMode(mode, callback) {\n    // Switching to a mode can be asynchronous.\n    this._eventBus.on(\"annotationeditormodechanged\", callback, {\n      once: true,\n      signal: this._signal,\n      ...internalOpt,\n    });\n    this._eventBus.dispatch(\"showannotationeditorui\", {\n      source: this,\n      mode,\n    });\n  }\n\n  setPreference(name, value) {\n    this._eventBus.dispatch(\"setpreference\", {\n      source: this,\n      name,\n      value,\n    });\n  }\n\n  onSetPreference({ name, value }) {\n    switch (name) {\n      case \"enableNewAltTextWhenAddingImage\":\n        this.#enableNewAltTextWhenAddingImage = value;\n        break;\n    }\n  }\n\n  onPageChanging({ pageNumber }) {\n    this.#currentPageIndex = pageNumber - 1;\n  }\n\n  deletePage(id) {\n    for (const editor of this.getEditors(id)) {\n      editor.remove();\n    }\n    this.#allLayers.delete(id);\n    if (this.#currentPageIndex === id) {\n      this.#currentPageIndex = 0;\n    }\n  }\n\n  focusMainContainer() {\n    this.#container.focus();\n  }\n\n  findParent(x, y) {\n    for (const layer of this.#allLayers.values()) {\n      const {\n        x: layerX,\n        y: layerY,\n        width,\n        height,\n      } = layer.div.getBoundingClientRect();\n      if (\n        x >= layerX &&\n        x <= layerX + width &&\n        y >= layerY &&\n        y <= layerY + height\n      ) {\n        return layer;\n      }\n    }\n    return null;\n  }\n\n  disableUserSelect(value = false) {\n    this.#viewer.classList.toggle(\"noUserSelect\", value);\n  }\n\n  addShouldRescale(editor) {\n    this.#editorsToRescale.add(editor);\n  }\n\n  removeShouldRescale(editor) {\n    this.#editorsToRescale.delete(editor);\n  }\n\n  onScaleChanging({ scale }) {\n    this.commitOrRemove();\n    this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS;\n    for (const editor of this.#editorsToRescale) {\n      editor.onScaleChanging();\n    }\n    this.#currentDrawingSession?.onScaleChanging();\n  }\n\n  onRotationChanging({ pagesRotation }) {\n    this.commitOrRemove();\n    this.viewParameters.rotation = pagesRotation;\n  }\n\n  #getAnchorElementForSelection({ anchorNode }) {\n    return anchorNode.nodeType === Node.TEXT_NODE\n      ? anchorNode.parentElement\n      : anchorNode;\n  }\n\n  #getLayerForTextLayer(textLayer) {\n    const { currentLayer } = this;\n    if (currentLayer.hasTextLayer(textLayer)) {\n      return currentLayer;\n    }\n    for (const layer of this.#allLayers.values()) {\n      if (layer.hasTextLayer(textLayer)) {\n        return layer;\n      }\n    }\n    return null;\n  }\n\n  highlightSelection(methodOfCreation = \"\", comment = false) {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      return;\n    }\n    const { anchorNode, anchorOffset, focusNode, focusOffset } = selection;\n    const text = selection.toString();\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    const boxes = this.getSelectionBoxes(textLayer);\n    if (!boxes) {\n      return;\n    }\n    selection.empty();\n\n    const layer = this.#getLayerForTextLayer(textLayer);\n    const isNoneMode = this.#mode === AnnotationEditorType.NONE;\n    const callback = () => {\n      const editor = layer?.createAndAddNewEditor({ x: 0, y: 0 }, false, {\n        methodOfCreation,\n        boxes,\n        anchorNode,\n        anchorOffset,\n        focusNode,\n        focusOffset,\n        text,\n      });\n      if (isNoneMode) {\n        this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n      }\n      if (comment) {\n        editor?.editComment();\n      }\n    };\n    if (isNoneMode) {\n      this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback);\n      return;\n    }\n    callback();\n  }\n\n  commentSelection(methodOfCreation = \"\") {\n    this.highlightSelection(methodOfCreation, /* comment */ true);\n  }\n\n  #beforeUnload(e) {\n    this.commitOrRemove();\n    this.currentLayer?.endDrawingSession(/* isAborted = */ false);\n  }\n\n  #displayFloatingToolbar() {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      return;\n    }\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    const boxes = this.getSelectionBoxes(textLayer);\n    if (!boxes) {\n      return;\n    }\n    this.#floatingToolbar ||= new FloatingToolbar(this);\n    this.#floatingToolbar.show(textLayer, boxes, this.direction === \"ltr\");\n  }\n\n  /**\n   * Some annotations may have been modified in the annotation layer\n   * (e.g. comments added or modified).\n   * So this function retrieves the data from the storage and removes\n   * them from the storage in order to be able to save them later.\n   * @param {string} annotationId\n   * @returns {Object|null} The data associated to the annotation or null.\n   */\n  getAndRemoveDataFromAnnotationStorage(annotationId) {\n    if (!this.#annotationStorage) {\n      return null;\n    }\n    const key = `${AnnotationEditorPrefix}${annotationId}`;\n    const storedValue = this.#annotationStorage.getRawValue(key);\n    if (storedValue) {\n      this.#annotationStorage.remove(key);\n    }\n    return storedValue;\n  }\n\n  /**\n   * Add an editor in the annotation storage.\n   * @param {AnnotationEditor} editor\n   */\n  addToAnnotationStorage(editor) {\n    if (\n      !editor.isEmpty() &&\n      this.#annotationStorage &&\n      !this.#annotationStorage.has(editor.id)\n    ) {\n      this.#annotationStorage.setValue(editor.id, editor);\n    }\n  }\n\n  a11yAlert(messageId, args = null) {\n    const viewerAlert = this.#viewerAlert;\n    if (!viewerAlert) {\n      return;\n    }\n    viewerAlert.setAttribute(\"data-l10n-id\", messageId);\n    if (args) {\n      viewerAlert.setAttribute(\"data-l10n-args\", JSON.stringify(args));\n    } else {\n      viewerAlert.removeAttribute(\"data-l10n-args\");\n    }\n  }\n\n  #selectionChange() {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      if (this.#selectedTextNode) {\n        this.#floatingToolbar?.hide();\n        this.#selectedTextNode = null;\n        this.#dispatchUpdateStates({\n          hasSelectedText: false,\n        });\n      }\n      return;\n    }\n    const { anchorNode } = selection;\n    if (anchorNode === this.#selectedTextNode) {\n      return;\n    }\n\n    const anchorElement = this.#getAnchorElementForSelection(selection);\n    const textLayer = anchorElement.closest(\".textLayer\");\n    if (!textLayer) {\n      if (this.#selectedTextNode) {\n        this.#floatingToolbar?.hide();\n        this.#selectedTextNode = null;\n        this.#dispatchUpdateStates({\n          hasSelectedText: false,\n        });\n      }\n      return;\n    }\n\n    this.#floatingToolbar?.hide();\n    this.#selectedTextNode = anchorNode;\n    this.#dispatchUpdateStates({\n      hasSelectedText: true,\n    });\n\n    if (\n      this.#mode !== AnnotationEditorType.HIGHLIGHT &&\n      this.#mode !== AnnotationEditorType.NONE\n    ) {\n      return;\n    }\n\n    if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n      this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n    }\n\n    this.#highlightWhenShiftUp = this.isShiftKeyDown;\n    if (!this.isShiftKeyDown) {\n      const activeLayer =\n        this.#mode === AnnotationEditorType.HIGHLIGHT\n          ? this.#getLayerForTextLayer(textLayer)\n          : null;\n      activeLayer?.toggleDrawing();\n\n      if (this.#isPointerDown) {\n        const ac = new AbortController();\n        const signal = this.combinedSignal(ac);\n\n        const pointerup = e => {\n          if (e.type === \"pointerup\" && e.button !== 0) {\n            // Do nothing on right click.\n            return;\n          }\n          ac.abort();\n          activeLayer?.toggleDrawing(true);\n          if (e.type === \"pointerup\") {\n            this.#onSelectEnd(\"main_toolbar\");\n          }\n        };\n        window.addEventListener(\"pointerup\", pointerup, { signal });\n        window.addEventListener(\"blur\", pointerup, { signal });\n      } else {\n        // Here neither the shift key nor the pointer is down and we've\n        // something in the selection: we can be in the case where the user is\n        // using a screen reader (see bug 1976597).\n        activeLayer?.toggleDrawing(true);\n        this.#onSelectEnd(\"main_toolbar\");\n      }\n    }\n  }\n\n  #onSelectEnd(methodOfCreation = \"\") {\n    if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n      this.highlightSelection(methodOfCreation);\n    } else if (this.#enableHighlightFloatingButton) {\n      this.#displayFloatingToolbar();\n    }\n  }\n\n  #addSelectionListener() {\n    document.addEventListener(\n      \"selectionchange\",\n      this.#selectionChange.bind(this),\n      { signal: this._signal }\n    );\n  }\n\n  #addFocusManager() {\n    if (this.#focusManagerAC) {\n      return;\n    }\n    this.#focusManagerAC = new AbortController();\n    const signal = this.combinedSignal(this.#focusManagerAC);\n\n    window.addEventListener(\"focus\", this.focus.bind(this), { signal });\n    window.addEventListener(\"blur\", this.blur.bind(this), { signal });\n  }\n\n  #removeFocusManager() {\n    this.#focusManagerAC?.abort();\n    this.#focusManagerAC = null;\n  }\n\n  blur() {\n    this.isShiftKeyDown = false;\n    if (this.#highlightWhenShiftUp) {\n      this.#highlightWhenShiftUp = false;\n      this.#onSelectEnd(\"main_toolbar\");\n    }\n    if (!this.hasSelection) {\n      return;\n    }\n    // When several editors are selected and the window loses focus, we want to\n    // keep the last active element in order to be able to focus it again when\n    // the window gets the focus back but we don't want to trigger any focus\n    // callbacks else only one editor will be selected.\n    const { activeElement } = document;\n    for (const editor of this.#selectedEditors) {\n      if (editor.div.contains(activeElement)) {\n        this.#lastActiveElement = [editor, activeElement];\n        editor._focusEventsAllowed = false;\n        break;\n      }\n    }\n  }\n\n  focus() {\n    if (!this.#lastActiveElement) {\n      return;\n    }\n    const [lastEditor, lastActiveElement] = this.#lastActiveElement;\n    this.#lastActiveElement = null;\n    lastActiveElement.addEventListener(\n      \"focusin\",\n      () => {\n        lastEditor._focusEventsAllowed = true;\n      },\n      { once: true, signal: this._signal }\n    );\n    lastActiveElement.focus();\n  }\n\n  #addKeyboardManager() {\n    if (this.#keyboardManagerAC) {\n      return;\n    }\n    this.#keyboardManagerAC = new AbortController();\n    const signal = this.combinedSignal(this.#keyboardManagerAC);\n\n    // The keyboard events are caught at the container level in order to be able\n    // to execute some callbacks even if the current page doesn't have focus.\n    window.addEventListener(\"keydown\", this.keydown.bind(this), { signal });\n    window.addEventListener(\"keyup\", this.keyup.bind(this), { signal });\n  }\n\n  #removeKeyboardManager() {\n    this.#keyboardManagerAC?.abort();\n    this.#keyboardManagerAC = null;\n  }\n\n  #addCopyPasteListeners() {\n    if (this.#copyPasteAC) {\n      return;\n    }\n    this.#copyPasteAC = new AbortController();\n    const signal = this.combinedSignal(this.#copyPasteAC);\n\n    document.addEventListener(\"copy\", this.copy.bind(this), { signal });\n    document.addEventListener(\"cut\", this.cut.bind(this), { signal });\n    document.addEventListener(\"paste\", this.paste.bind(this), { signal });\n  }\n\n  #removeCopyPasteListeners() {\n    this.#copyPasteAC?.abort();\n    this.#copyPasteAC = null;\n  }\n\n  #addDragAndDropListeners() {\n    const signal = this._signal;\n    document.addEventListener(\"dragover\", this.dragOver.bind(this), { signal });\n    document.addEventListener(\"drop\", this.drop.bind(this), { signal });\n  }\n\n  addEditListeners() {\n    this.#addKeyboardManager();\n    this.setEditingState(true);\n  }\n\n  removeEditListeners() {\n    this.#removeKeyboardManager();\n    this.setEditingState(false);\n  }\n\n  dragOver(event) {\n    for (const { type } of event.dataTransfer.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(type)) {\n          event.dataTransfer.dropEffect = \"copy\";\n          event.preventDefault();\n          return;\n        }\n      }\n    }\n  }\n\n  /**\n   * Drop callback.\n   * @param {DragEvent} event\n   */\n  drop(event) {\n    for (const item of event.dataTransfer.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(item.type)) {\n          editorType.paste(item, this.currentLayer);\n          event.preventDefault();\n          return;\n        }\n      }\n    }\n  }\n\n  /**\n   * Copy callback.\n   * @param {ClipboardEvent} event\n   */\n  copy(event) {\n    event.preventDefault();\n\n    // An editor is being edited so just commit it.\n    this.#activeEditor?.commitOrRemove();\n\n    if (!this.hasSelection) {\n      return;\n    }\n\n    const editors = [];\n    for (const editor of this.#selectedEditors) {\n      const serialized = editor.serialize(/* isForCopying = */ true);\n      if (serialized) {\n        editors.push(serialized);\n      }\n    }\n    if (editors.length === 0) {\n      return;\n    }\n\n    event.clipboardData.setData(\"application/pdfjs\", JSON.stringify(editors));\n  }\n\n  /**\n   * Cut callback.\n   * @param {ClipboardEvent} event\n   */\n  cut(event) {\n    this.copy(event);\n    this.delete();\n  }\n\n  /**\n   * Paste callback.\n   * @param {ClipboardEvent} event\n   */\n  async paste(event) {\n    event.preventDefault();\n    const { clipboardData } = event;\n    for (const item of clipboardData.items) {\n      for (const editorType of this.#editorTypes) {\n        if (editorType.isHandlingMimeForPasting(item.type)) {\n          editorType.paste(item, this.currentLayer);\n          return;\n        }\n      }\n    }\n\n    let data = clipboardData.getData(\"application/pdfjs\");\n    if (!data) {\n      return;\n    }\n\n    try {\n      data = JSON.parse(data);\n    } catch (ex) {\n      warn(`paste: \"${ex.message}\".`);\n      return;\n    }\n\n    if (!Array.isArray(data)) {\n      return;\n    }\n\n    this.unselectAll();\n    const layer = this.currentLayer;\n\n    try {\n      const newEditors = [];\n      for (const editor of data) {\n        const deserializedEditor = await layer.deserialize(editor);\n        if (!deserializedEditor) {\n          return;\n        }\n        newEditors.push(deserializedEditor);\n      }\n\n      const cmd = () => {\n        for (const editor of newEditors) {\n          this.#addEditorToLayer(editor);\n        }\n        this.#selectEditors(newEditors);\n      };\n      const undo = () => {\n        for (const editor of newEditors) {\n          editor.remove();\n        }\n      };\n      this.addCommands({ cmd, undo, mustExec: true });\n    } catch (ex) {\n      warn(`paste: \"${ex.message}\".`);\n    }\n  }\n\n  /**\n   * Keydown callback.\n   * @param {KeyboardEvent} event\n   */\n  keydown(event) {\n    if (!this.isShiftKeyDown && event.key === \"Shift\") {\n      this.isShiftKeyDown = true;\n    }\n    if (\n      this.#mode !== AnnotationEditorType.NONE &&\n      !this.isEditorHandlingKeyboard\n    ) {\n      AnnotationEditorUIManager._keyboardManager.exec(this, event);\n    }\n  }\n\n  /**\n   * Keyup callback.\n   * @param {KeyboardEvent} event\n   */\n  keyup(event) {\n    if (this.isShiftKeyDown && event.key === \"Shift\") {\n      this.isShiftKeyDown = false;\n      if (this.#highlightWhenShiftUp) {\n        this.#highlightWhenShiftUp = false;\n        this.#onSelectEnd(\"main_toolbar\");\n      }\n    }\n  }\n\n  /**\n   * Execute an action for a given name.\n   * For example, the user can click on the \"Undo\" entry in the context menu\n   * and it'll trigger the undo action.\n   */\n  onEditingAction({ name }) {\n    switch (name) {\n      case \"undo\":\n      case \"redo\":\n      case \"delete\":\n      case \"selectAll\":\n        this[name]();\n        break;\n      case \"highlightSelection\":\n        this.highlightSelection(\"context_menu\");\n        break;\n      case \"commentSelection\":\n        this.commentSelection(\"context_menu\");\n        break;\n    }\n  }\n\n  updatePageIndex(oldPageIndex, newPageIndex) {\n    for (const editor of this.getEditors(oldPageIndex)) {\n      editor.pageIndex = newPageIndex;\n    }\n    const layer = this.#savedAllLayers.get(oldPageIndex);\n    if (layer) {\n      layer.pageIndex = newPageIndex;\n      this.#allLayers.set(newPageIndex, layer);\n      if (this.#isEnabled) {\n        layer.enable();\n      } else {\n        layer.disable();\n      }\n    }\n  }\n\n  startUpdatePages() {\n    this.#savedAllLayers = new Map(this.#allLayers);\n    this.#allLayers.clear();\n  }\n\n  endUpdatePages() {\n    this.#savedAllLayers = null;\n  }\n\n  clonePage(pageIndex, newPageIndex) {\n    for (const editor of this.getEditors(pageIndex)) {\n      const serialized = editor.serialize(\n        editor.mode !== AnnotationEditorType.HIGHLIGHT\n      );\n      if (!serialized) {\n        continue;\n      }\n      serialized.pageIndex = newPageIndex;\n      serialized.id = this.getId();\n      serialized.isClone = true;\n      delete serialized.popupRef;\n      this.#annotationStorage.setValue(serialized.id, serialized);\n    }\n  }\n\n  findClonesForPage(layer) {\n    const promises = [];\n    const { pageIndex } = layer;\n    for (const [id, editor] of this.#annotationStorage) {\n      if (editor.pageIndex === pageIndex && editor.isClone) {\n        this.#annotationStorage.remove(id);\n        promises.push(\n          layer.deserialize(editor).then(deserializedEditor => {\n            if (deserializedEditor) {\n              deserializedEditor.isClone = true;\n              layer.addOrRebuild(deserializedEditor);\n            }\n          })\n        );\n      }\n    }\n    return Promise.all(promises);\n  }\n\n  /**\n   * Update the different possible states of this manager, e.g. is there\n   * something to undo, redo, ...\n   * @param {Object} details\n   */\n  #dispatchUpdateStates(details) {\n    const hasChanged = Object.entries(details).some(\n      ([key, value]) => this.#previousStates[key] !== value\n    );\n\n    if (hasChanged) {\n      this._eventBus.dispatch(\"editingstateschanged\", {\n        source: this,\n        details: Object.assign(this.#previousStates, details),\n      });\n      // We could listen on our own event but it sounds like a bit weird and\n      // it's a way to simpler to handle that stuff here instead of having to\n      // add something in every place where an editor can be unselected.\n      if (\n        this.#mode === AnnotationEditorType.HIGHLIGHT &&\n        details.hasSelectedEditor === false\n      ) {\n        this.#dispatchUpdateUI([\n          [AnnotationEditorParamsType.HIGHLIGHT_FREE, true],\n        ]);\n      }\n    }\n  }\n\n  #dispatchUpdateUI(details) {\n    this._eventBus.dispatch(\"annotationeditorparamschanged\", {\n      source: this,\n      details,\n    });\n  }\n\n  /**\n   * Set the editing state.\n   * It can be useful to temporarily disable it when the user is editing a\n   * FreeText annotation.\n   * @param {boolean} isEditing\n   */\n  setEditingState(isEditing) {\n    if (isEditing) {\n      this.#addFocusManager();\n      this.#addCopyPasteListeners();\n      this.#dispatchUpdateStates({\n        isEditing: this.#mode !== AnnotationEditorType.NONE,\n        isEmpty: this.#isEmpty(),\n        hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n        hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n        hasSelectedEditor: false,\n      });\n    } else {\n      this.#removeFocusManager();\n      this.#removeCopyPasteListeners();\n      this.#dispatchUpdateStates({\n        isEditing: false,\n      });\n      this.disableUserSelect(false);\n    }\n  }\n\n  registerEditorTypes(types) {\n    if (this.#editorTypes) {\n      return;\n    }\n    this.#editorTypes = types;\n    for (const editorType of this.#editorTypes) {\n      this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n    }\n  }\n\n  /**\n   * Get an id.\n   * @returns {string}\n   */\n  getId() {\n    return this.#idManager.id;\n  }\n\n  get currentLayer() {\n    return this.#allLayers.get(this.#currentPageIndex);\n  }\n\n  getLayer(pageIndex) {\n    return this.#allLayers.get(pageIndex);\n  }\n\n  get currentPageIndex() {\n    return this.#currentPageIndex;\n  }\n\n  /**\n   * Add a new layer for a page which will contains the editors.\n   * @param {AnnotationEditorLayer} layer\n   */\n  addLayer(layer) {\n    this.#allLayers.set(layer.pageIndex, layer);\n    if (this.#isEnabled) {\n      layer.enable();\n    } else {\n      layer.disable();\n    }\n  }\n\n  /**\n   * Remove a layer.\n   * @param {AnnotationEditorLayer} layer\n   */\n  removeLayer(layer) {\n    this.#allLayers.delete(layer.pageIndex);\n  }\n\n  /**\n   * Change the editor mode (None, FreeText, Ink, ...)\n   * @param {number} mode\n   * @param {string|null} editId\n   * @param {boolean} [isFromUser] - true if the mode change is due to a\n   *   user action.\n   * @param {boolean} [isFromKeyboard] - true if the mode change is due to a\n   *   keyboard action.\n   * @param {boolean} [mustEnterInEditMode] - true if the editor must enter in\n   *   edit mode.\n   * @param {boolean} [editComment] - true if the mode change is due to a\n   *   comment edit.\n   */\n  async updateMode(\n    mode,\n    editId = null,\n    isFromUser = false,\n    isFromKeyboard = false,\n    mustEnterInEditMode = false,\n    editComment = false\n  ) {\n    if (this.#mode === mode) {\n      return;\n    }\n\n    if (this.#updateModeCapability) {\n      await this.#updateModeCapability.promise;\n      if (!this.#updateModeCapability) {\n        // This ui manager has been destroyed.\n        return;\n      }\n    }\n\n    this.#updateModeCapability = Promise.withResolvers();\n    this.#currentDrawingSession?.commitOrRemove();\n\n    if (this.#mode === AnnotationEditorType.POPUP) {\n      this.#commentManager?.hideSidebar();\n    }\n    this.#commentManager?.destroyPopup();\n\n    this.#mode = mode;\n    if (mode === AnnotationEditorType.NONE) {\n      this.setEditingState(false);\n      this.#disableAll();\n      for (const editor of this.#allEditors.values()) {\n        editor.hideStandaloneCommentButton();\n      }\n\n      this._editorUndoBar?.hide();\n      this.toggleComment(/* editor = */ null);\n\n      this.#updateModeCapability.resolve();\n      return;\n    }\n\n    for (const editor of this.#allEditors.values()) {\n      editor.addStandaloneCommentButton();\n    }\n\n    if (mode === AnnotationEditorType.SIGNATURE) {\n      await this.#signatureManager?.loadSignatures();\n    }\n\n    if (isFromUser) {\n      // reinitialize the pointer type when the mode is changed by the user\n      CurrentPointers.clearPointerType();\n    }\n\n    this.setEditingState(true);\n    await this.#enableAll();\n    this.unselectAll();\n    for (const layer of this.#allLayers.values()) {\n      layer.updateMode(mode);\n    }\n\n    if (mode === AnnotationEditorType.POPUP) {\n      this.#allEditableAnnotations ||=\n        await this.#pdfDocument.getAnnotationsByType(\n          new Set(this.#editorTypes.map(editorClass => editorClass._editorType))\n        );\n      const elementIds = new Set();\n      const allComments = [];\n      for (const editor of this.#allEditors.values()) {\n        const { annotationElementId, hasComment, deleted } = editor;\n        if (annotationElementId) {\n          elementIds.add(annotationElementId);\n        }\n        if (hasComment && !deleted) {\n          allComments.push(editor.getData());\n        }\n      }\n      for (const annotation of this.#allEditableAnnotations) {\n        const { id, popupRef, contentsObj } = annotation;\n        if (\n          popupRef &&\n          contentsObj?.str &&\n          !elementIds.has(id) &&\n          !this.#deletedAnnotationsElementIds.has(id)\n        ) {\n          // The annotation exists in the PDF and has a comment but there\n          // is no editor for it (anymore).\n          allComments.push(annotation);\n        }\n      }\n      this.#commentManager?.showSidebar(allComments);\n    }\n\n    if (!editId) {\n      if (isFromKeyboard) {\n        this.addNewEditorFromKeyboard();\n      }\n\n      this.#updateModeCapability.resolve();\n      return;\n    }\n\n    for (const editor of this.#allEditors.values()) {\n      if (editor.uid === editId) {\n        this.setSelected(editor);\n        if (editComment) {\n          editor.editComment();\n        } else if (mustEnterInEditMode) {\n          editor.enterInEditMode();\n        } else {\n          editor.focus();\n        }\n      } else {\n        editor.unselect();\n      }\n    }\n\n    this.#updateModeCapability.resolve();\n  }\n\n  addNewEditorFromKeyboard() {\n    if (this.currentLayer.canCreateNewEmptyEditor()) {\n      this.currentLayer.addNewEditor();\n    }\n  }\n\n  /**\n   * Update the toolbar if it's required to reflect the tool currently used.\n   * @param {Object} options\n   * @param {number} mode\n   * @returns {undefined}\n   */\n  updateToolbar(options) {\n    if (options.mode === this.#mode) {\n      return;\n    }\n    this._eventBus.dispatch(\"switchannotationeditormode\", {\n      source: this,\n      ...options,\n    });\n  }\n\n  /**\n   * Update a parameter in the current editor or globally.\n   * @param {number} type\n   * @param {*} value\n   */\n  updateParams(type, value) {\n    if (!this.#editorTypes) {\n      return;\n    }\n\n    switch (type) {\n      case AnnotationEditorParamsType.CREATE:\n        this.currentLayer.addNewEditor(value);\n        return;\n      case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n        this._eventBus.dispatch(\"reporttelemetry\", {\n          source: this,\n          details: {\n            type: \"editing\",\n            data: {\n              type: \"highlight\",\n              action: \"toggle_visibility\",\n            },\n          },\n        });\n        (this.#showAllStates ||= new Map()).set(type, value);\n        this.showAllEditors(\"highlight\", value);\n        break;\n    }\n\n    if (this.hasSelection) {\n      for (const editor of this.#selectedEditors) {\n        editor.updateParams(type, value);\n      }\n    } else {\n      for (const editorType of this.#editorTypes) {\n        editorType.updateDefaultParams(type, value);\n      }\n    }\n  }\n\n  showAllEditors(type, visible, updateButton = false) {\n    for (const editor of this.#allEditors.values()) {\n      if (editor.editorType === type) {\n        editor.show(visible);\n      }\n    }\n    const state =\n      this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ??\n      true;\n    if (state !== visible) {\n      this.#dispatchUpdateUI([\n        [AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible],\n      ]);\n    }\n  }\n\n  enableWaiting(mustWait = false) {\n    if (this.#isWaiting === mustWait) {\n      return;\n    }\n    this.#isWaiting = mustWait;\n    for (const layer of this.#allLayers.values()) {\n      if (mustWait) {\n        layer.disableClick();\n      } else {\n        layer.enableClick();\n      }\n      layer.div.classList.toggle(\"waiting\", mustWait);\n    }\n  }\n\n  /**\n   * Enable all the layers.\n   */\n  async #enableAll() {\n    if (!this.#isEnabled) {\n      this.#isEnabled = true;\n      const promises = [];\n      for (const layer of this.#allLayers.values()) {\n        promises.push(layer.enable());\n      }\n      await Promise.all(promises);\n      for (const editor of this.#allEditors.values()) {\n        editor.enable();\n      }\n    }\n  }\n\n  /**\n   * Disable all the layers.\n   */\n  #disableAll() {\n    this.unselectAll();\n    if (this.#isEnabled) {\n      this.#isEnabled = false;\n      for (const layer of this.#allLayers.values()) {\n        layer.disable();\n      }\n      for (const editor of this.#allEditors.values()) {\n        editor.disable();\n      }\n    }\n  }\n\n  /**\n   * Get all the editors belonging to a given page.\n   * @param {number} pageIndex\n   * @yields {AnnotationEditor}\n   */\n  *getEditors(pageIndex) {\n    for (const editor of this.#allEditors.values()) {\n      if (editor.pageIndex === pageIndex) {\n        yield editor;\n      }\n    }\n  }\n\n  /**\n   * Get an editor with the given id.\n   * @param {string} id\n   * @returns {AnnotationEditor}\n   */\n  getEditor(id) {\n    return this.#allEditors.get(id);\n  }\n\n  /**\n   * Add a new editor.\n   * @param {AnnotationEditor} editor\n   */\n  addEditor(editor) {\n    this.#allEditors.set(editor.id, editor);\n  }\n\n  /**\n   * Remove an editor.\n   * @param {AnnotationEditor} editor\n   */\n  removeEditor(editor) {\n    if (editor.div.contains(document.activeElement)) {\n      if (this.#focusMainContainerTimeoutId) {\n        clearTimeout(this.#focusMainContainerTimeoutId);\n      }\n      this.#focusMainContainerTimeoutId = setTimeout(() => {\n        // When the div is removed from DOM the focus can move on the\n        // document.body, so we need to move it back to the main container.\n        this.focusMainContainer();\n        this.#focusMainContainerTimeoutId = null;\n      }, 0);\n    }\n    this.#allEditors.delete(editor.id);\n    if (editor.annotationElementId) {\n      this.#missingCanvases?.delete(editor.annotationElementId);\n    }\n    this.unselect(editor);\n    if (\n      !editor.annotationElementId ||\n      !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)\n    ) {\n      this.#annotationStorage?.remove(editor.id);\n    }\n  }\n\n  /**\n   * The annotation element with the given id has been deleted.\n   * @param {AnnotationEditor} editor\n   */\n  addDeletedAnnotationElement(editor) {\n    this.#deletedAnnotationsElementIds.add(editor.annotationElementId);\n    this.addChangedExistingAnnotation(editor);\n    editor.deleted = true;\n  }\n\n  /**\n   * Check if the annotation element with the given id has been deleted.\n   * @param {string} annotationElementId\n   * @returns {boolean}\n   */\n  isDeletedAnnotationElement(annotationElementId) {\n    return this.#deletedAnnotationsElementIds.has(annotationElementId);\n  }\n\n  /**\n   * The annotation element with the given id have been restored.\n   * @param {AnnotationEditor} editor\n   */\n  removeDeletedAnnotationElement(editor) {\n    this.#deletedAnnotationsElementIds.delete(editor.annotationElementId);\n    this.removeChangedExistingAnnotation(editor);\n    editor.deleted = false;\n  }\n\n  /**\n   * Add an editor to the layer it belongs to or add it to the global map.\n   * @param {AnnotationEditor} editor\n   */\n  #addEditorToLayer(editor) {\n    const layer = this.#allLayers.get(editor.pageIndex);\n    if (layer) {\n      layer.addOrRebuild(editor);\n    } else {\n      this.addEditor(editor);\n      this.addToAnnotationStorage(editor);\n    }\n  }\n\n  /**\n   * Set the given editor as the active one.\n   * @param {AnnotationEditor} editor\n   */\n  setActiveEditor(editor) {\n    if (this.#activeEditor === editor) {\n      return;\n    }\n\n    this.#activeEditor = editor;\n    if (editor) {\n      this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    }\n  }\n\n  get #lastSelectedEditor() {\n    let ed = null;\n    for (ed of this.#selectedEditors) {\n      // Iterate to get the last element.\n    }\n    return ed;\n  }\n\n  /**\n   * Update the UI of the active editor.\n   * @param {AnnotationEditor} editor\n   */\n  updateUI(editor) {\n    if (this.#lastSelectedEditor === editor) {\n      this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    }\n  }\n\n  updateUIForDefaultProperties(editorType) {\n    this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n  }\n\n  /**\n   * Add or remove an editor the current selection.\n   * @param {AnnotationEditor} editor\n   */\n  toggleSelected(editor) {\n    if (this.#selectedEditors.has(editor)) {\n      this.#selectedEditors.delete(editor);\n      editor.unselect();\n      this.#dispatchUpdateStates({\n        hasSelectedEditor: this.hasSelection,\n      });\n      return;\n    }\n    this.#selectedEditors.add(editor);\n    editor.select();\n    this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: true,\n    });\n  }\n\n  /**\n   * Set the last selected editor.\n   * @param {AnnotationEditor} editor\n   */\n  setSelected(editor) {\n    this.updateToolbar({\n      mode: editor.mode,\n      editId: editor.uid,\n    });\n\n    this.#currentDrawingSession?.commitOrRemove();\n    for (const ed of this.#selectedEditors) {\n      if (ed !== editor) {\n        ed.unselect();\n      }\n    }\n    this.#commentManager?.destroyPopup();\n    this.#selectedEditors.clear();\n\n    this.#selectedEditors.add(editor);\n    editor.select();\n    this.#dispatchUpdateUI(editor.propertiesToUpdate);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: true,\n    });\n  }\n\n  get firstSelectedEditor() {\n    return this.#selectedEditors.values().next().value;\n  }\n\n  /**\n   * Unselect an editor.\n   * @param {AnnotationEditor} editor\n   */\n  unselect(editor) {\n    editor.unselect();\n    this.#selectedEditors.delete(editor);\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: this.hasSelection,\n    });\n  }\n\n  get hasSelection() {\n    return this.#selectedEditors.size !== 0;\n  }\n\n  get isEnterHandled() {\n    return (\n      this.#selectedEditors.size === 1 &&\n      this.firstSelectedEditor.isEnterHandled\n    );\n  }\n\n  /**\n   * Undo the last command.\n   */\n  undo() {\n    this.#commandManager.undo();\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n      hasSomethingToRedo: true,\n      isEmpty: this.#isEmpty(),\n    });\n    this._editorUndoBar?.hide();\n  }\n\n  /**\n   * Redo the last undoed command.\n   */\n  redo() {\n    this.#commandManager.redo();\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: true,\n      hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n      isEmpty: this.#isEmpty(),\n    });\n  }\n\n  /**\n   * Add a command to execute (cmd) and another one to undo it.\n   * @param {Object} params\n   */\n  addCommands(params) {\n    this.#commandManager.add(params);\n    this.#dispatchUpdateStates({\n      hasSomethingToUndo: true,\n      hasSomethingToRedo: false,\n      isEmpty: this.#isEmpty(),\n    });\n  }\n\n  cleanUndoStack(type) {\n    this.#commandManager.cleanType(type);\n  }\n\n  #isEmpty() {\n    if (this.#allEditors.size === 0) {\n      return true;\n    }\n\n    if (this.#allEditors.size === 1) {\n      for (const editor of this.#allEditors.values()) {\n        return editor.isEmpty();\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Delete the current editor or all.\n   */\n  delete() {\n    this.commitOrRemove();\n    const drawingEditor = this.currentLayer?.endDrawingSession(\n      /* isAborted = */ true\n    );\n    if (!this.hasSelection && !drawingEditor) {\n      return;\n    }\n\n    const editors = drawingEditor\n      ? [drawingEditor]\n      : [...this.#selectedEditors];\n    const cmd = () => {\n      this._editorUndoBar?.show(\n        undo,\n        editors.length === 1 ? editors[0].editorType : editors.length\n      );\n      for (const editor of editors) {\n        editor.remove();\n      }\n    };\n    const undo = () => {\n      for (const editor of editors) {\n        this.#addEditorToLayer(editor);\n      }\n    };\n\n    this.addCommands({ cmd, undo, mustExec: true });\n  }\n\n  commitOrRemove() {\n    // An editor is being edited so just commit it.\n    this.#activeEditor?.commitOrRemove();\n  }\n\n  hasSomethingToControl() {\n    return this.#activeEditor || this.hasSelection;\n  }\n\n  /**\n   * Select the editors.\n   * @param {Array<AnnotationEditor>} editors\n   */\n  #selectEditors(editors) {\n    for (const editor of this.#selectedEditors) {\n      editor.unselect();\n    }\n    this.#selectedEditors.clear();\n    for (const editor of editors) {\n      if (editor.isEmpty()) {\n        continue;\n      }\n      this.#selectedEditors.add(editor);\n      editor.select();\n    }\n    this.#dispatchUpdateStates({ hasSelectedEditor: this.hasSelection });\n  }\n\n  /**\n   * Select all the editors.\n   */\n  selectAll() {\n    for (const editor of this.#selectedEditors) {\n      editor.commit();\n    }\n    this.#selectEditors(this.#allEditors.values());\n  }\n\n  /**\n   * Unselect all the selected editors.\n   */\n  unselectAll() {\n    if (this.#activeEditor) {\n      // An editor is being edited so just commit it.\n      this.#activeEditor.commitOrRemove();\n      if (this.#mode !== AnnotationEditorType.NONE) {\n        // If the mode is NONE, we want to really unselect the editor, hence we\n        // mustn't return here.\n        return;\n      }\n    }\n\n    if (this.#currentDrawingSession?.commitOrRemove()) {\n      return;\n    }\n\n    this.#commentManager?.destroyPopup();\n\n    if (!this.hasSelection) {\n      return;\n    }\n    for (const editor of this.#selectedEditors) {\n      editor.unselect();\n    }\n    this.#selectedEditors.clear();\n    this.#dispatchUpdateStates({\n      hasSelectedEditor: false,\n    });\n  }\n\n  translateSelectedEditors(x, y, noCommit = false) {\n    if (!noCommit) {\n      this.commitOrRemove();\n    }\n    if (!this.hasSelection) {\n      return;\n    }\n\n    this.#translation[0] += x;\n    this.#translation[1] += y;\n    const [totalX, totalY] = this.#translation;\n    const editors = [...this.#selectedEditors];\n\n    // We don't want to have an undo/redo for each translation so we wait a bit\n    // before adding the command to the command manager.\n    const TIME_TO_WAIT = 1000;\n\n    if (this.#translationTimeoutId) {\n      clearTimeout(this.#translationTimeoutId);\n    }\n\n    this.#translationTimeoutId = setTimeout(() => {\n      this.#translationTimeoutId = null;\n      this.#translation[0] = this.#translation[1] = 0;\n\n      this.addCommands({\n        cmd: () => {\n          for (const editor of editors) {\n            if (this.#allEditors.has(editor.id)) {\n              editor.translateInPage(totalX, totalY);\n              editor.translationDone();\n            }\n          }\n        },\n        undo: () => {\n          for (const editor of editors) {\n            if (this.#allEditors.has(editor.id)) {\n              editor.translateInPage(-totalX, -totalY);\n              editor.translationDone();\n            }\n          }\n        },\n        mustExec: false,\n      });\n    }, TIME_TO_WAIT);\n\n    for (const editor of editors) {\n      editor.translateInPage(x, y);\n      editor.translationDone();\n    }\n  }\n\n  /**\n   * Set up the drag session for moving the selected editors.\n   */\n  setUpDragSession() {\n    // Note: don't use any references to the editor's parent which can be null\n    // if the editor belongs to a destroyed page.\n    if (!this.hasSelection) {\n      return;\n    }\n    // Avoid to have spurious text selection in the text layer when dragging.\n    this.disableUserSelect(true);\n    this.#draggingEditors = new Map();\n    for (const editor of this.#selectedEditors) {\n      this.#draggingEditors.set(editor, {\n        savedX: editor.x,\n        savedY: editor.y,\n        savedPageIndex: editor.pageIndex,\n        newX: 0,\n        newY: 0,\n        newPageIndex: -1,\n      });\n    }\n  }\n\n  /**\n   * Ends the drag session.\n   * @returns {boolean} true if at least one editor has been moved.\n   */\n  endDragSession() {\n    if (!this.#draggingEditors) {\n      return false;\n    }\n    this.disableUserSelect(false);\n    const map = this.#draggingEditors;\n    this.#draggingEditors = null;\n    let mustBeAddedInUndoStack = false;\n\n    for (const [{ x, y, pageIndex }, value] of map) {\n      value.newX = x;\n      value.newY = y;\n      value.newPageIndex = pageIndex;\n      mustBeAddedInUndoStack ||=\n        x !== value.savedX ||\n        y !== value.savedY ||\n        pageIndex !== value.savedPageIndex;\n    }\n\n    if (!mustBeAddedInUndoStack) {\n      return false;\n    }\n\n    const move = (editor, x, y, pageIndex) => {\n      if (this.#allEditors.has(editor.id)) {\n        // The editor can be undone/redone on a page which is not visible (and\n        // which potentially has no annotation editor layer), hence we need to\n        // use the pageIndex instead of the parent.\n        const parent = this.#allLayers.get(pageIndex);\n        if (parent) {\n          editor._setParentAndPosition(parent, x, y);\n        } else {\n          editor.pageIndex = pageIndex;\n          editor.x = x;\n          editor.y = y;\n        }\n      }\n    };\n\n    this.addCommands({\n      cmd: () => {\n        for (const [editor, { newX, newY, newPageIndex }] of map) {\n          move(editor, newX, newY, newPageIndex);\n        }\n      },\n      undo: () => {\n        for (const [editor, { savedX, savedY, savedPageIndex }] of map) {\n          move(editor, savedX, savedY, savedPageIndex);\n        }\n      },\n      mustExec: true,\n    });\n\n    return true;\n  }\n\n  /**\n   * Drag the set of selected editors.\n   * @param {number} tx\n   * @param {number} ty\n   */\n  dragSelectedEditors(tx, ty) {\n    if (!this.#draggingEditors) {\n      return;\n    }\n    for (const editor of this.#draggingEditors.keys()) {\n      editor.drag(tx, ty);\n    }\n  }\n\n  /**\n   * Rebuild the editor (usually on undo/redo actions) on a potentially\n   * non-rendered page.\n   * @param {AnnotationEditor} editor\n   */\n  rebuild(editor) {\n    if (editor.parent === null) {\n      const parent = this.getLayer(editor.pageIndex);\n      if (parent) {\n        parent.changeParent(editor);\n        parent.addOrRebuild(editor);\n      } else {\n        this.addEditor(editor);\n        this.addToAnnotationStorage(editor);\n        editor.rebuild();\n      }\n    } else {\n      editor.parent.addOrRebuild(editor);\n    }\n  }\n\n  get isEditorHandlingKeyboard() {\n    return (\n      this.getActive()?.shouldGetKeyboardEvents() ||\n      (this.#selectedEditors.size === 1 &&\n        this.firstSelectedEditor.shouldGetKeyboardEvents())\n    );\n  }\n\n  /**\n   * Is the current editor the one passed as argument?\n   * @param {AnnotationEditor} editor\n   * @returns\n   */\n  isActive(editor) {\n    return this.#activeEditor === editor;\n  }\n\n  /**\n   * Get the current active editor.\n   * @returns {AnnotationEditor|null}\n   */\n  getActive() {\n    return this.#activeEditor;\n  }\n\n  /**\n   * Get the current editor mode.\n   * @returns {number}\n   */\n  getMode() {\n    return this.#mode;\n  }\n\n  isEditingMode() {\n    return this.#mode !== AnnotationEditorType.NONE;\n  }\n\n  get imageManager() {\n    return shadow(this, \"imageManager\", new ImageManager());\n  }\n\n  getSelectionBoxes(textLayer) {\n    if (!textLayer) {\n      return null;\n    }\n    const selection = document.getSelection();\n    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n      if (\n        !textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)\n      ) {\n        return null;\n      }\n    }\n\n    const {\n      x: layerX,\n      y: layerY,\n      width: parentWidth,\n      height: parentHeight,\n    } = textLayer.getBoundingClientRect();\n\n    // We must rotate the boxes because we want to have them in the non-rotated\n    // page coordinates.\n    let rotator;\n    switch (textLayer.getAttribute(\"data-main-rotation\")) {\n      case \"90\":\n        rotator = (x, y, w, h) => ({\n          x: (y - layerY) / parentHeight,\n          y: 1 - (x + w - layerX) / parentWidth,\n          width: h / parentHeight,\n          height: w / parentWidth,\n        });\n        break;\n      case \"180\":\n        rotator = (x, y, w, h) => ({\n          x: 1 - (x + w - layerX) / parentWidth,\n          y: 1 - (y + h - layerY) / parentHeight,\n          width: w / parentWidth,\n          height: h / parentHeight,\n        });\n        break;\n      case \"270\":\n        rotator = (x, y, w, h) => ({\n          x: 1 - (y + h - layerY) / parentHeight,\n          y: (x - layerX) / parentWidth,\n          width: h / parentHeight,\n          height: w / parentWidth,\n        });\n        break;\n      default:\n        rotator = (x, y, w, h) => ({\n          x: (x - layerX) / parentWidth,\n          y: (y - layerY) / parentHeight,\n          width: w / parentWidth,\n          height: h / parentHeight,\n        });\n        break;\n    }\n\n    const boxes = [];\n    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n      const range = selection.getRangeAt(i);\n      if (range.collapsed) {\n        continue;\n      }\n      for (const { x, y, width, height } of range.getClientRects()) {\n        if (width === 0 || height === 0) {\n          continue;\n        }\n        boxes.push(rotator(x, y, width, height));\n      }\n    }\n    return boxes.length === 0 ? null : boxes;\n  }\n\n  addChangedExistingAnnotation({ annotationElementId, id }) {\n    (this.#changedExistingAnnotations ||= new Map()).set(\n      annotationElementId,\n      id\n    );\n  }\n\n  removeChangedExistingAnnotation({ annotationElementId }) {\n    this.#changedExistingAnnotations?.delete(annotationElementId);\n  }\n\n  renderAnnotationElement(annotation) {\n    const editorId = this.#changedExistingAnnotations?.get(annotation.data.id);\n    if (!editorId) {\n      return;\n    }\n    const editor = this.#annotationStorage.getRawValue(editorId);\n    if (!editor) {\n      return;\n    }\n    if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) {\n      return;\n    }\n    editor.renderAnnotationElement(annotation);\n  }\n\n  setMissingCanvas(annotationId, annotationElementId, canvas) {\n    const editor = this.#missingCanvases?.get(annotationId);\n    if (!editor) {\n      return;\n    }\n    editor.setCanvas(annotationElementId, canvas);\n    this.#missingCanvases.delete(annotationId);\n  }\n\n  addMissingCanvas(annotationId, editor) {\n    (this.#missingCanvases ||= new Map()).set(annotationId, editor);\n  }\n}\n\nexport {\n  AnnotationEditorUIManager,\n  bindEvents,\n  ColorManager,\n  CommandManager,\n  CurrentPointers,\n  KeyboardManager,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu } from \"../display_utils.js\";\n\nclass AltText {\n  #altText = null;\n\n  #altTextDecorative = false;\n\n  #altTextButton = null;\n\n  #altTextButtonLabel = null;\n\n  #altTextTooltip = null;\n\n  #altTextTooltipTimeout = null;\n\n  #altTextWasFromKeyBoard = false;\n\n  #badge = null;\n\n  #editor = null;\n\n  #guessedText = null;\n\n  #textWithDisclaimer = null;\n\n  #useNewAltTextFlow = false;\n\n  static #l10nNewButton = null;\n\n  static _l10n = null;\n\n  constructor(editor) {\n    this.#editor = editor;\n    this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow;\n\n    AltText.#l10nNewButton ||= Object.freeze({\n      added: \"pdfjs-editor-new-alt-text-added-button\",\n      \"added-label\": \"pdfjs-editor-new-alt-text-added-button-label\",\n      missing: \"pdfjs-editor-new-alt-text-missing-button\",\n      \"missing-label\": \"pdfjs-editor-new-alt-text-missing-button-label\",\n      review: \"pdfjs-editor-new-alt-text-to-review-button\",\n      \"review-label\": \"pdfjs-editor-new-alt-text-to-review-button-label\",\n    });\n  }\n\n  static initialize(l10n) {\n    AltText._l10n ??= l10n;\n  }\n\n  async render() {\n    const altText = (this.#altTextButton = document.createElement(\"button\"));\n    altText.className = \"altText\";\n    altText.tabIndex = \"0\";\n\n    const label = (this.#altTextButtonLabel = document.createElement(\"span\"));\n    altText.append(label);\n\n    if (this.#useNewAltTextFlow) {\n      altText.classList.add(\"new\");\n      altText.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton.missing);\n      label.setAttribute(\n        \"data-l10n-id\",\n        AltText.#l10nNewButton[\"missing-label\"]\n      );\n    } else {\n      altText.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button\");\n      label.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button-label\");\n    }\n\n    const signal = this.#editor._uiManager._signal;\n    altText.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    altText.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n      signal,\n    });\n\n    const onClick = event => {\n      event.preventDefault();\n      this.#editor._uiManager.editAltText(this.#editor);\n      if (this.#useNewAltTextFlow) {\n        this.#editor._reportTelemetry({\n          action: \"pdfjs.image.alt_text.image_status_label_clicked\",\n          data: { label: this.#label },\n        });\n      }\n    };\n    altText.addEventListener(\"click\", onClick, { capture: true, signal });\n    altText.addEventListener(\n      \"keydown\",\n      event => {\n        if (event.target === altText && event.key === \"Enter\") {\n          this.#altTextWasFromKeyBoard = true;\n          onClick(event);\n        }\n      },\n      { signal }\n    );\n    await this.#setState();\n\n    return altText;\n  }\n\n  get #label() {\n    return (\n      (this.#altText && \"added\") ||\n      (this.#altText === null && this.guessedText && \"review\") ||\n      \"missing\"\n    );\n  }\n\n  finish() {\n    if (!this.#altTextButton) {\n      return;\n    }\n    this.#altTextButton.focus({ focusVisible: this.#altTextWasFromKeyBoard });\n    this.#altTextWasFromKeyBoard = false;\n  }\n\n  isEmpty() {\n    if (this.#useNewAltTextFlow) {\n      return this.#altText === null;\n    }\n    return !this.#altText && !this.#altTextDecorative;\n  }\n\n  hasData() {\n    if (this.#useNewAltTextFlow) {\n      return this.#altText !== null || !!this.#guessedText;\n    }\n    return this.isEmpty();\n  }\n\n  get guessedText() {\n    return this.#guessedText;\n  }\n\n  async setGuessedText(guessedText) {\n    if (this.#altText !== null) {\n      // The user provided their own alt text, so we don't want to overwrite it.\n      return;\n    }\n    this.#guessedText = guessedText;\n    this.#textWithDisclaimer = await AltText._l10n.get(\n      \"pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer\",\n      { generatedAltText: guessedText }\n    );\n    this.#setState();\n  }\n\n  toggleAltTextBadge(visibility = false) {\n    if (!this.#useNewAltTextFlow || this.#altText) {\n      this.#badge?.remove();\n      this.#badge = null;\n      return;\n    }\n    if (!this.#badge) {\n      const badge = (this.#badge = document.createElement(\"div\"));\n      badge.className = \"noAltTextBadge\";\n      this.#editor.div.append(badge);\n    }\n    this.#badge.classList.toggle(\"hidden\", !visibility);\n  }\n\n  serialize(isForCopying) {\n    let altText = this.#altText;\n    if (!isForCopying && this.#guessedText === altText) {\n      altText = this.#textWithDisclaimer;\n    }\n    return {\n      altText,\n      decorative: this.#altTextDecorative,\n      guessedText: this.#guessedText,\n      textWithDisclaimer: this.#textWithDisclaimer,\n    };\n  }\n\n  get data() {\n    return {\n      altText: this.#altText,\n      decorative: this.#altTextDecorative,\n    };\n  }\n\n  /**\n   * Set the alt text data.\n   */\n  set data({\n    altText,\n    decorative,\n    guessedText,\n    textWithDisclaimer,\n    cancel = false,\n  }) {\n    if (guessedText) {\n      this.#guessedText = guessedText;\n      this.#textWithDisclaimer = textWithDisclaimer;\n    }\n    if (this.#altText === altText && this.#altTextDecorative === decorative) {\n      return;\n    }\n    if (!cancel) {\n      this.#altText = altText;\n      this.#altTextDecorative = decorative;\n    }\n    this.#setState();\n  }\n\n  toggle(enabled = false) {\n    if (!this.#altTextButton) {\n      return;\n    }\n    if (!enabled && this.#altTextTooltipTimeout) {\n      clearTimeout(this.#altTextTooltipTimeout);\n      this.#altTextTooltipTimeout = null;\n    }\n    this.#altTextButton.disabled = !enabled;\n  }\n\n  shown() {\n    this.#editor._reportTelemetry({\n      action: \"pdfjs.image.alt_text.image_status_label_displayed\",\n      data: { label: this.#label },\n    });\n  }\n\n  destroy() {\n    this.#altTextButton?.remove();\n    this.#altTextButton = null;\n    this.#altTextButtonLabel = null;\n    this.#altTextTooltip = null;\n    this.#badge?.remove();\n    this.#badge = null;\n  }\n\n  async #setState() {\n    const button = this.#altTextButton;\n    if (!button) {\n      return;\n    }\n\n    if (this.#useNewAltTextFlow) {\n      button.classList.toggle(\"done\", !!this.#altText);\n      button.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton[this.#label]);\n\n      this.#altTextButtonLabel?.setAttribute(\n        \"data-l10n-id\",\n        AltText.#l10nNewButton[`${this.#label}-label`]\n      );\n      if (!this.#altText) {\n        this.#altTextTooltip?.remove();\n        return;\n      }\n    } else {\n      if (!this.#altText && !this.#altTextDecorative) {\n        button.classList.remove(\"done\");\n        this.#altTextTooltip?.remove();\n        return;\n      }\n      button.classList.add(\"done\");\n      button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-edit-button\");\n    }\n\n    let tooltip = this.#altTextTooltip;\n    if (!tooltip) {\n      this.#altTextTooltip = tooltip = document.createElement(\"span\");\n      tooltip.className = \"tooltip\";\n      tooltip.setAttribute(\"role\", \"tooltip\");\n      tooltip.id = `alt-text-tooltip-${this.#editor.id}`;\n\n      const DELAY_TO_SHOW_TOOLTIP = 100;\n      const signal = this.#editor._uiManager._signal;\n      signal.addEventListener(\n        \"abort\",\n        () => {\n          clearTimeout(this.#altTextTooltipTimeout);\n          this.#altTextTooltipTimeout = null;\n        },\n        { once: true }\n      );\n      button.addEventListener(\n        \"mouseenter\",\n        () => {\n          this.#altTextTooltipTimeout = setTimeout(() => {\n            this.#altTextTooltipTimeout = null;\n            this.#altTextTooltip.classList.add(\"show\");\n            this.#editor._reportTelemetry({\n              action: \"alt_text_tooltip\",\n            });\n          }, DELAY_TO_SHOW_TOOLTIP);\n        },\n        { signal }\n      );\n      button.addEventListener(\n        \"mouseleave\",\n        () => {\n          if (this.#altTextTooltipTimeout) {\n            clearTimeout(this.#altTextTooltipTimeout);\n            this.#altTextTooltipTimeout = null;\n          }\n          this.#altTextTooltip?.classList.remove(\"show\");\n        },\n        { signal }\n      );\n    }\n    if (this.#altTextDecorative) {\n      tooltip.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-editor-alt-text-decorative-tooltip\"\n      );\n    } else {\n      tooltip.removeAttribute(\"data-l10n-id\");\n      tooltip.textContent = this.#altText;\n    }\n\n    if (!tooltip.parentNode) {\n      button.append(tooltip);\n    }\n\n    const element = this.#editor.getElementForAltText();\n    element?.setAttribute(\"aria-describedby\", tooltip.id);\n  }\n}\n\nexport { AltText };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\n\nclass Comment {\n  #commentStandaloneButton = null;\n\n  #commentToolbarButton = null;\n\n  #commentWasFromKeyBoard = false;\n\n  #editor = null;\n\n  #initialText = null;\n\n  #richText = null;\n\n  #text = null;\n\n  #date = null;\n\n  #deleted = false;\n\n  #popupPosition = null;\n\n  constructor(editor) {\n    this.#editor = editor;\n  }\n\n  renderForToolbar() {\n    const button = (this.#commentToolbarButton =\n      document.createElement(\"button\"));\n    button.className = \"comment\";\n    return this.#render(button, false);\n  }\n\n  renderForStandalone() {\n    const button = (this.#commentStandaloneButton =\n      document.createElement(\"button\"));\n    button.className = \"annotationCommentButton\";\n\n    const position = this.#editor.commentButtonPosition;\n    if (position) {\n      const { style } = button;\n      style.insetInlineEnd = `calc(${\n        100 *\n        (this.#editor._uiManager.direction === \"ltr\"\n          ? 1 - position[0]\n          : position[0])\n      }% - var(--comment-button-dim))`;\n      style.top = `calc(${100 * position[1]}% - var(--comment-button-dim))`;\n      const color = this.#editor.commentButtonColor;\n      if (color) {\n        style.backgroundColor = color;\n      }\n    }\n\n    return this.#render(button, true);\n  }\n\n  focusButton() {\n    setTimeout(() => {\n      (this.#commentStandaloneButton ?? this.#commentToolbarButton)?.focus();\n    }, 0);\n  }\n\n  onUpdatedColor() {\n    if (!this.#commentStandaloneButton) {\n      return;\n    }\n    const color = this.#editor.commentButtonColor;\n    if (color) {\n      this.#commentStandaloneButton.style.backgroundColor = color;\n    }\n    this.#editor._uiManager.updatePopupColor(this.#editor);\n  }\n\n  get commentButtonWidth() {\n    return (\n      (this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) /\n      this.#editor.parent.boundingClientRect.width\n    );\n  }\n\n  get commentPopupPositionInLayer() {\n    if (this.#popupPosition) {\n      return this.#popupPosition;\n    }\n    if (!this.#commentStandaloneButton) {\n      return null;\n    }\n    const { x, y, height } =\n      this.#commentStandaloneButton.getBoundingClientRect();\n    const {\n      x: parentX,\n      y: parentY,\n      width: parentWidth,\n      height: parentHeight,\n    } = this.#editor.parent.boundingClientRect;\n    return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight];\n  }\n\n  set commentPopupPositionInLayer(pos) {\n    this.#popupPosition = pos;\n  }\n\n  hasDefaultPopupPosition() {\n    return this.#popupPosition === null;\n  }\n\n  removeStandaloneCommentButton() {\n    this.#commentStandaloneButton?.remove();\n    this.#commentStandaloneButton = null;\n  }\n\n  removeToolbarCommentButton() {\n    this.#commentToolbarButton?.remove();\n    this.#commentToolbarButton = null;\n  }\n\n  setCommentButtonStates({ selected, hasPopup }) {\n    if (!this.#commentStandaloneButton) {\n      return;\n    }\n    this.#commentStandaloneButton.classList.toggle(\"selected\", selected);\n    this.#commentStandaloneButton.ariaExpanded = hasPopup;\n  }\n\n  #render(comment, isStandalone) {\n    if (!this.#editor._uiManager.hasCommentManager()) {\n      return null;\n    }\n\n    comment.tabIndex = \"0\";\n    comment.ariaHasPopup = \"dialog\";\n\n    if (isStandalone) {\n      comment.ariaControls = \"commentPopup\";\n      comment.setAttribute(\"data-l10n-id\", \"pdfjs-show-comment-button\");\n    } else {\n      comment.ariaControlsElements = [\n        this.#editor._uiManager.getCommentDialogElement(),\n      ];\n      comment.setAttribute(\"data-l10n-id\", \"pdfjs-editor-add-comment-button\");\n    }\n\n    const signal = this.#editor._uiManager._signal;\n    if (!(signal instanceof AbortSignal) || signal.aborted) {\n      return comment;\n    }\n\n    comment.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    if (isStandalone) {\n      comment.addEventListener(\n        \"focusin\",\n        e => {\n          this.#editor._focusEventsAllowed = false;\n          stopEvent(e);\n        },\n        {\n          capture: true,\n          signal,\n        }\n      );\n      comment.addEventListener(\n        \"focusout\",\n        e => {\n          this.#editor._focusEventsAllowed = true;\n          stopEvent(e);\n        },\n        {\n          capture: true,\n          signal,\n        }\n      );\n    }\n    comment.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n      signal,\n    });\n\n    const onClick = event => {\n      event.preventDefault();\n      if (comment === this.#commentToolbarButton) {\n        this.edit();\n      } else {\n        this.#editor.toggleComment(/* isSelected = */ true);\n      }\n    };\n    comment.addEventListener(\"click\", onClick, { capture: true, signal });\n    comment.addEventListener(\n      \"keydown\",\n      event => {\n        if (event.target === comment && event.key === \"Enter\") {\n          this.#commentWasFromKeyBoard = true;\n          onClick(event);\n        }\n      },\n      { signal }\n    );\n\n    comment.addEventListener(\n      \"pointerenter\",\n      () => {\n        this.#editor.toggleComment(\n          /* isSelected = */ false,\n          /* visibility = */ true\n        );\n      },\n      { signal }\n    );\n    comment.addEventListener(\n      \"pointerleave\",\n      () => {\n        this.#editor.toggleComment(\n          /* isSelected = */ false,\n          /* visibility = */ false\n        );\n      },\n      { signal }\n    );\n\n    return comment;\n  }\n\n  edit(options) {\n    const position = this.commentPopupPositionInLayer;\n    let posX, posY;\n    if (position) {\n      [posX, posY] = position;\n    } else {\n      // The position is in the editor coordinates.\n      [posX, posY] = this.#editor.commentButtonPosition;\n      const { width, height, x, y } = this.#editor;\n      posX = x + posX * width;\n      posY = y + posY * height;\n    }\n    const parentDimensions = this.#editor.parent.boundingClientRect;\n    const {\n      x: parentX,\n      y: parentY,\n      width: parentWidth,\n      height: parentHeight,\n    } = parentDimensions;\n    this.#editor._uiManager.editComment(\n      this.#editor,\n      parentX + posX * parentWidth,\n      parentY + posY * parentHeight,\n      { ...options, parentDimensions }\n    );\n  }\n\n  finish() {\n    if (!this.#commentToolbarButton) {\n      return;\n    }\n    this.#commentToolbarButton.focus({\n      focusVisible: this.#commentWasFromKeyBoard,\n    });\n    this.#commentWasFromKeyBoard = false;\n  }\n\n  isDeleted() {\n    return this.#deleted || this.#text === \"\";\n  }\n\n  isEmpty() {\n    return this.#text === null;\n  }\n\n  hasBeenEdited() {\n    return this.isDeleted() || this.#text !== this.#initialText;\n  }\n\n  serialize() {\n    return this.data;\n  }\n\n  get data() {\n    return {\n      text: this.#text,\n      richText: this.#richText,\n      date: this.#date,\n      deleted: this.isDeleted(),\n    };\n  }\n\n  /**\n   * Set the comment data.\n   */\n  set data(text) {\n    if (text !== this.#text) {\n      this.#richText = null;\n    }\n    if (text === null) {\n      this.#text = \"\";\n      this.#deleted = true;\n      return;\n    }\n    this.#text = text;\n    this.#date = new Date();\n    this.#deleted = false;\n  }\n\n  /**\n   * Restore the comment data (used for undo).\n   * @param {Object} data - The comment data to restore.\n   * @param {string} data.text - The comment text.\n   * @param {string|null} data.richText - The rich text content.\n   * @param {Date|null} data.date - The original date.\n   */\n  restoreData({ text, richText, date }) {\n    this.#text = text;\n    this.#richText = richText;\n    this.#date = date;\n    this.#deleted = false;\n  }\n\n  setInitialText(text, richText = null) {\n    this.#initialText = text;\n    this.data = text;\n    this.#date = null;\n    this.#richText = richText;\n  }\n\n  shown() {}\n\n  destroy() {\n    this.#commentToolbarButton?.remove();\n    this.#commentToolbarButton = null;\n    this.#commentStandaloneButton?.remove();\n    this.#commentStandaloneButton = null;\n    this.#text = \"\";\n    this.#richText = null;\n    this.#date = null;\n    this.#editor = null;\n    this.#commentWasFromKeyBoard = false;\n    this.#deleted = false;\n  }\n}\n\nexport { Comment };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { OutputScale, stopEvent } from \"./display_utils.js\";\n\nclass TouchManager {\n  #container;\n\n  #isPinching = false;\n\n  #isPinchingStopped = null;\n\n  #isPinchingDisabled;\n\n  #onPinchStart;\n\n  #onPinching;\n\n  #onPinchEnd;\n\n  #pointerDownAC = null;\n\n  #signal;\n\n  #touchInfo = null;\n\n  #touchManagerAC;\n\n  #touchMoveAC = null;\n\n  constructor({\n    container,\n    isPinchingDisabled = null,\n    isPinchingStopped = null,\n    onPinchStart = null,\n    onPinching = null,\n    onPinchEnd = null,\n    signal,\n  }) {\n    this.#container = container;\n    this.#isPinchingStopped = isPinchingStopped;\n    this.#isPinchingDisabled = isPinchingDisabled;\n    this.#onPinchStart = onPinchStart;\n    this.#onPinching = onPinching;\n    this.#onPinchEnd = onPinchEnd;\n    this.#touchManagerAC = new AbortController();\n    this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]);\n\n    container.addEventListener(\"touchstart\", this.#onTouchStart.bind(this), {\n      passive: false,\n      signal: this.#signal,\n    });\n  }\n\n  /**\n   * NOTE: Don't shadow this value since `devicePixelRatio` may change if the\n   * window resolution changes, e.g. if the viewer is moved to another monitor.\n   */\n  get MIN_TOUCH_DISTANCE_TO_PINCH() {\n    // The 35 is coming from:\n    //  https://searchfox.org/mozilla-central/source/gfx/layers/apz/src/GestureEventListener.cpp#36\n    //\n    // The properties TouchEvent::screenX/Y are in screen CSS pixels:\n    //  https://developer.mozilla.org/en-US/docs/Web/API/Touch/screenX#examples\n    // MIN_TOUCH_DISTANCE_TO_PINCH is in CSS pixels.\n    return 35 / OutputScale.pixelRatio;\n  }\n\n  #onTouchStart(evt) {\n    if (this.#isPinchingDisabled?.()) {\n      return;\n    }\n\n    if (evt.touches.length === 1) {\n      if (this.#pointerDownAC) {\n        return;\n      }\n      const pointerDownAC = (this.#pointerDownAC = new AbortController());\n      const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]);\n      const container = this.#container;\n\n      // We want to have the events at the capture phase to make sure we can\n      // cancel them.\n      const opts = { capture: true, signal, passive: false };\n      const cancelPointerDown = e => {\n        if (e.pointerType === \"touch\") {\n          this.#pointerDownAC?.abort();\n          this.#pointerDownAC = null;\n        }\n      };\n      container.addEventListener(\n        \"pointerdown\",\n        e => {\n          if (e.pointerType === \"touch\") {\n            // This is the second finger so we don't want it select something\n            // or whatever.\n            stopEvent(e);\n            cancelPointerDown(e);\n          }\n        },\n        opts\n      );\n      container.addEventListener(\"pointerup\", cancelPointerDown, opts);\n      container.addEventListener(\"pointercancel\", cancelPointerDown, opts);\n      return;\n    }\n\n    if (!this.#touchMoveAC) {\n      this.#touchMoveAC = new AbortController();\n      const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]);\n      const container = this.#container;\n\n      const opt = { signal, capture: false, passive: false };\n      container.addEventListener(\n        \"touchmove\",\n        this.#onTouchMove.bind(this),\n        opt\n      );\n      const onTouchEnd = this.#onTouchEnd.bind(this);\n      container.addEventListener(\"touchend\", onTouchEnd, opt);\n      container.addEventListener(\"touchcancel\", onTouchEnd, opt);\n\n      opt.capture = true;\n      container.addEventListener(\"pointerdown\", stopEvent, opt);\n      container.addEventListener(\"pointermove\", stopEvent, opt);\n      container.addEventListener(\"pointercancel\", stopEvent, opt);\n      container.addEventListener(\"pointerup\", stopEvent, opt);\n      this.#onPinchStart?.();\n    }\n\n    stopEvent(evt);\n\n    if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) {\n      this.#touchInfo = null;\n      return;\n    }\n\n    let [touch0, touch1] = evt.touches;\n    if (touch0.identifier > touch1.identifier) {\n      [touch0, touch1] = [touch1, touch0];\n    }\n    this.#touchInfo = {\n      touch0X: touch0.screenX,\n      touch0Y: touch0.screenY,\n      touch1X: touch1.screenX,\n      touch1Y: touch1.screenY,\n    };\n  }\n\n  #onTouchMove(evt) {\n    if (!this.#touchInfo || evt.touches.length !== 2) {\n      return;\n    }\n\n    stopEvent(evt);\n\n    let [touch0, touch1] = evt.touches;\n    if (touch0.identifier > touch1.identifier) {\n      [touch0, touch1] = [touch1, touch0];\n    }\n    const { screenX: screen0X, screenY: screen0Y } = touch0;\n    const { screenX: screen1X, screenY: screen1Y } = touch1;\n    const touchInfo = this.#touchInfo;\n    const {\n      touch0X: pTouch0X,\n      touch0Y: pTouch0Y,\n      touch1X: pTouch1X,\n      touch1Y: pTouch1Y,\n    } = touchInfo;\n\n    const prevGapX = pTouch1X - pTouch0X;\n    const prevGapY = pTouch1Y - pTouch0Y;\n    const currGapX = screen1X - screen0X;\n    const currGapY = screen1Y - screen0Y;\n\n    const distance = Math.hypot(currGapX, currGapY) || 1;\n    const pDistance = Math.hypot(prevGapX, prevGapY) || 1;\n    if (\n      !this.#isPinching &&\n      Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH\n    ) {\n      return;\n    }\n\n    touchInfo.touch0X = screen0X;\n    touchInfo.touch0Y = screen0Y;\n    touchInfo.touch1X = screen1X;\n    touchInfo.touch1Y = screen1Y;\n\n    if (!this.#isPinching) {\n      // Start pinching.\n      this.#isPinching = true;\n\n      // We return here else the first pinch is a bit too much\n      return;\n    }\n\n    const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2];\n    this.#onPinching?.(origin, pDistance, distance);\n  }\n\n  #onTouchEnd(evt) {\n    if (evt.touches.length >= 2) {\n      return;\n    }\n    // #touchMoveAC shouldn't be null but it seems that irl it can (see #19793).\n    if (this.#touchMoveAC) {\n      this.#touchMoveAC.abort();\n      this.#touchMoveAC = null;\n      this.#onPinchEnd?.();\n    }\n\n    if (!this.#touchInfo) {\n      return;\n    }\n    stopEvent(evt);\n    this.#touchInfo = null;\n    this.#isPinching = false;\n  }\n\n  destroy() {\n    this.#touchManagerAC?.abort();\n    this.#touchManagerAC = null;\n    this.#pointerDownAC?.abort();\n    this.#pointerDownAC = null;\n  }\n}\n\nexport { TouchManager };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n  AnnotationEditorUIManager,\n  bindEvents,\n  ColorManager,\n  KeyboardManager,\n} from \"./tools.js\";\nimport { FeatureTest, shadow, unreachable } from \"../../shared/util.js\";\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\nimport { AltText } from \"./alt_text.js\";\nimport { Comment } from \"./comment.js\";\nimport { EditorToolbar } from \"./toolbar.js\";\nimport { MathClamp } from \"../../shared/math_clamp.js\";\nimport { TouchManager } from \"../touch_manager.js\";\n\n/**\n * @typedef {Object} AnnotationEditorParameters\n * @property {AnnotationEditorUIManager} uiManager - the global manager\n * @property {AnnotationEditorLayer} parent - the layer containing this editor\n * @property {string} id - editor id\n * @property {number} x - x-coordinate\n * @property {number} y - y-coordinate\n */\n\n/**\n * Base class for editors.\n */\nclass AnnotationEditor {\n  #accessibilityData = null;\n\n  #allResizerDivs = null;\n\n  #altText = null;\n\n  #comment = null;\n\n  #commentStandaloneButton = null;\n\n  #disabled = false;\n\n  #dragPointerId = null;\n\n  #dragPointerType = \"\";\n\n  #resizersDiv = null;\n\n  #lastPointerCoords = null;\n\n  #savedDimensions = null;\n\n  #fakeAnnotation = null;\n\n  #focusAC = null;\n\n  #focusedResizerName = \"\";\n\n  #hasBeenClicked = false;\n\n  #initialRect = null;\n\n  #isEditing = false;\n\n  #isInEditMode = false;\n\n  #isResizerEnabledForKeyboard = false;\n\n  #moveInDOMTimeout = null;\n\n  #prevDragX = 0;\n\n  #prevDragY = 0;\n\n  #telemetryTimeouts = null;\n\n  #touchManager = null;\n\n  isSelected = false;\n\n  _isCopy = false;\n\n  _editToolbar = null;\n\n  _initialOptions = Object.create(null);\n\n  _initialData = null;\n\n  _isVisible = true;\n\n  _uiManager = null;\n\n  _focusEventsAllowed = true;\n\n  static _l10n = null;\n\n  static _l10nAlert = null;\n\n  static _l10nResizer = null;\n\n  #isDraggable = false;\n\n  #zIndex = AnnotationEditor._zIndex++;\n\n  static _borderLineWidth = -1;\n\n  static _colorManager = new ColorManager();\n\n  static _zIndex = 1;\n\n  // Time to wait (in ms) before sending the telemetry data.\n  // We wait a bit to avoid sending too many requests when changing something\n  // like the thickness of a line.\n  static _telemetryTimeout = 1000;\n\n  static get _resizerKeyboardManager() {\n    const resize = AnnotationEditor.prototype._resizeWithKeyboard;\n    const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n    const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n\n    return shadow(\n      this,\n      \"_resizerKeyboardManager\",\n      new KeyboardManager([\n        [[\"ArrowLeft\"], resize, { args: [-small, 0] }],\n        [\n          [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n          resize,\n          { args: [-big, 0] },\n        ],\n        [[\"ArrowRight\"], resize, { args: [small, 0] }],\n        [\n          [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n          resize,\n          { args: [big, 0] },\n        ],\n        [[\"ArrowUp\"], resize, { args: [0, -small] }],\n        [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], resize, { args: [0, -big] }],\n        [[\"ArrowDown\"], resize, { args: [0, small] }],\n        [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], resize, { args: [0, big] }],\n        [[\"Escape\"], AnnotationEditor.prototype._stopResizingWithKeyboard],\n      ])\n    );\n  }\n\n  /**\n   * @param {AnnotationEditorParameters} parameters\n   */\n  constructor(parameters) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === AnnotationEditor\n    ) {\n      unreachable(\"Cannot initialize AnnotationEditor.\");\n    }\n\n    this.parent = parameters.parent;\n    this.id = parameters.id;\n    this.width = this.height = null;\n    this.pageIndex = parameters.parent.pageIndex;\n    this.name = parameters.name;\n    this.div = null;\n    this._uiManager = parameters.uiManager;\n    this.annotationElementId = null;\n    this._willKeepAspectRatio = false;\n    this._initialOptions.isCentered = parameters.isCentered;\n    this._structTreeParentId = null;\n    this.annotationElementId = parameters.annotationElementId || null;\n    this.creationDate = parameters.creationDate || new Date();\n    this.modificationDate = parameters.modificationDate || null;\n    this.canAddComment = true;\n\n    const {\n      rotation,\n      rawDims: { pageWidth, pageHeight, pageX, pageY },\n    } = this.parent.viewport;\n\n    this.rotation = rotation;\n    this.pageRotation =\n      (360 + rotation - this._uiManager.viewParameters.rotation) % 360;\n    this.pageDimensions = [pageWidth, pageHeight];\n    this.pageTranslation = [pageX, pageY];\n\n    const [width, height] = this.parentDimensions;\n    this.x = parameters.x / width;\n    this.y = parameters.y / height;\n\n    this.isAttachedToDOM = false;\n    this.deleted = false;\n  }\n\n  updatePageIndex(newPageIndex) {\n    this.pageIndex = newPageIndex;\n  }\n\n  get editorType() {\n    return Object.getPrototypeOf(this).constructor._type;\n  }\n\n  get mode() {\n    return Object.getPrototypeOf(this).constructor._editorType;\n  }\n\n  static get isDrawer() {\n    return false;\n  }\n\n  static get _defaultLineColor() {\n    return shadow(\n      this,\n      \"_defaultLineColor\",\n      this._colorManager.getHexCode(\"CanvasText\")\n    );\n  }\n\n  static deleteAnnotationElement(editor) {\n    const fakeEditor = new FakeEditor({\n      id: editor._uiManager.getId(),\n      parent: editor.parent,\n      uiManager: editor._uiManager,\n    });\n    fakeEditor.annotationElementId = editor.annotationElementId;\n    fakeEditor.deleted = true;\n    fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);\n  }\n\n  /**\n   * Initialize the l10n stuff for this type of editor.\n   * @param {Object} l10n\n   */\n  static initialize(l10n, _uiManager) {\n    AnnotationEditor._l10n ??= l10n;\n\n    AnnotationEditor._l10nAlert ??= Object.freeze({\n      highlight: \"pdfjs-editor-highlight-added-alert\",\n      freetext: \"pdfjs-editor-freetext-added-alert\",\n      ink: \"pdfjs-editor-ink-added-alert\",\n      stamp: \"pdfjs-editor-stamp-added-alert\",\n      signature: \"pdfjs-editor-signature-added-alert\",\n    });\n\n    AnnotationEditor._l10nResizer ??= Object.freeze({\n      topLeft: \"pdfjs-editor-resizer-top-left\",\n      topMiddle: \"pdfjs-editor-resizer-top-middle\",\n      topRight: \"pdfjs-editor-resizer-top-right\",\n      middleRight: \"pdfjs-editor-resizer-middle-right\",\n      bottomRight: \"pdfjs-editor-resizer-bottom-right\",\n      bottomMiddle: \"pdfjs-editor-resizer-bottom-middle\",\n      bottomLeft: \"pdfjs-editor-resizer-bottom-left\",\n      middleLeft: \"pdfjs-editor-resizer-middle-left\",\n    });\n\n    if (AnnotationEditor._borderLineWidth !== -1) {\n      return;\n    }\n    const style = getComputedStyle(document.documentElement);\n    AnnotationEditor._borderLineWidth =\n      parseFloat(style.getPropertyValue(\"--outline-width\")) || 0;\n  }\n\n  /**\n   * Update the default parameters for this type of editor.\n   * @param {number} _type\n   * @param {*} _value\n   */\n  static updateDefaultParams(_type, _value) {}\n\n  /**\n   * Get the default properties to set in the UI for this type of editor.\n   * @returns {Array}\n   */\n  static get defaultPropertiesToUpdate() {\n    return [];\n  }\n\n  /**\n   * Check if this kind of editor is able to handle the given mime type for\n   * pasting.\n   * @param {string} mime\n   * @returns {boolean}\n   */\n  static isHandlingMimeForPasting(mime) {\n    return false;\n  }\n\n  /**\n   * Extract the data from the clipboard item and delegate the creation of the\n   * editor to the parent.\n   * @param {DataTransferItem} item\n   * @param {AnnotationEditorLayer} parent\n   */\n  static paste(item, parent) {\n    unreachable(\"Not implemented\");\n  }\n\n  /**\n   * Get the properties to update in the UI for this editor.\n   * @returns {Array}\n   */\n  get propertiesToUpdate() {\n    return [];\n  }\n\n  get _isDraggable() {\n    return this.#isDraggable;\n  }\n\n  set _isDraggable(value) {\n    this.#isDraggable = value;\n    this.div?.classList.toggle(\"draggable\", value);\n  }\n\n  get uid() {\n    return this.annotationElementId || this.id;\n  }\n\n  /**\n   * @returns {boolean} true if the editor handles the Enter key itself.\n   */\n  get isEnterHandled() {\n    return true;\n  }\n\n  center() {\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    switch (this.parentRotation) {\n      case 90:\n        this.x -= (this.height * pageHeight) / (pageWidth * 2);\n        this.y += (this.width * pageWidth) / (pageHeight * 2);\n        break;\n      case 180:\n        this.x += this.width / 2;\n        this.y += this.height / 2;\n        break;\n      case 270:\n        this.x += (this.height * pageHeight) / (pageWidth * 2);\n        this.y -= (this.width * pageWidth) / (pageHeight * 2);\n        break;\n      default:\n        this.x -= this.width / 2;\n        this.y -= this.height / 2;\n        break;\n    }\n    this.fixAndSetPosition();\n  }\n\n  /**\n   * Add some commands into the CommandManager (undo/redo stuff).\n   * @param {Object} params\n   */\n  addCommands(params) {\n    this._uiManager.addCommands(params);\n  }\n\n  get currentLayer() {\n    return this._uiManager.currentLayer;\n  }\n\n  /**\n   * This editor will be behind the others.\n   */\n  setInBackground() {\n    this.div.style.zIndex = 0;\n  }\n\n  /**\n   * This editor will be in the foreground.\n   */\n  setInForeground() {\n    this.div.style.zIndex = this.#zIndex;\n  }\n\n  setParent(parent) {\n    if (parent !== null) {\n      this.pageIndex = parent.pageIndex;\n      this.pageDimensions = parent.pageDimensions;\n    } else {\n      // The editor is being removed from the DOM, so we need to stop resizing.\n      this.#stopResizing();\n\n      // Remove the fake annotation in the annotation layer.\n      this.#fakeAnnotation?.remove();\n      this.#fakeAnnotation = null;\n    }\n    this.parent = parent;\n  }\n\n  /**\n   * onfocus callback.\n   */\n  focusin(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n    if (!this.#hasBeenClicked) {\n      this.parent.setSelected(this);\n    } else {\n      this.#hasBeenClicked = false;\n    }\n  }\n\n  /**\n   * onblur callback.\n   * @param {FocusEvent} event\n   */\n  focusout(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n\n    if (!this.isAttachedToDOM) {\n      return;\n    }\n\n    // In case of focusout, the relatedTarget is the element which\n    // is grabbing the focus.\n    // So if the related target is an element under the div for this\n    // editor, then the editor isn't unactive.\n    const target = event.relatedTarget;\n    if (target?.closest(`#${this.id}`)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (!this.parent?.isMultipleSelection) {\n      this.commitOrRemove();\n    }\n  }\n\n  commitOrRemove() {\n    if (this.isEmpty()) {\n      this.remove();\n    } else {\n      this.commit();\n    }\n  }\n\n  /**\n   * Commit the data contained in this editor.\n   */\n  commit() {\n    if (!this.isInEditMode()) {\n      return;\n    }\n    this.addToAnnotationStorage();\n  }\n\n  addToAnnotationStorage() {\n    this._uiManager.addToAnnotationStorage(this);\n  }\n\n  /**\n   * Set the editor position within its parent.\n   * @param {number} x\n   * @param {number} y\n   * @param {number} tx - x-translation in screen coordinates.\n   * @param {number} ty - y-translation in screen coordinates.\n   */\n  setAt(x, y, tx, ty) {\n    const [width, height] = this.parentDimensions;\n    [tx, ty] = this.screenToPageTranslation(tx, ty);\n\n    this.x = (x + tx) / width;\n    this.y = (y + ty) / height;\n\n    this.fixAndSetPosition();\n  }\n\n  _moveAfterPaste(baseX, baseY) {\n    if (this.isClone) {\n      delete this.isClone;\n      return;\n    }\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    this.setAt(\n      baseX * parentWidth,\n      baseY * parentHeight,\n      this.width * parentWidth,\n      this.height * parentHeight\n    );\n    this._onTranslated();\n  }\n\n  #translate([width, height], x, y) {\n    [x, y] = this.screenToPageTranslation(x, y);\n\n    this.x += x / width;\n    this.y += y / height;\n\n    this._onTranslating(this.x, this.y);\n\n    this.fixAndSetPosition();\n  }\n\n  /**\n   * Translate the editor position within its parent.\n   * @param {number} x - x-translation in screen coordinates.\n   * @param {number} y - y-translation in screen coordinates.\n   */\n  translate(x, y) {\n    // We don't change the initial position because the move here hasn't been\n    // done by the user.\n    this.#translate(this.parentDimensions, x, y);\n  }\n\n  /**\n   * Translate the editor position within its page and adjust the scroll\n   * in order to have the editor in the view.\n   * @param {number} x - x-translation in page coordinates.\n   * @param {number} y - y-translation in page coordinates.\n   */\n  translateInPage(x, y) {\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    this.#translate(this.pageDimensions, x, y);\n    this.div.scrollIntoView({ block: \"nearest\" });\n  }\n\n  translationDone() {\n    this._onTranslated(this.x, this.y);\n  }\n\n  drag(tx, ty) {\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    const {\n      div,\n      parentDimensions: [parentWidth, parentHeight],\n    } = this;\n    this.x += tx / parentWidth;\n    this.y += ty / parentHeight;\n    if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {\n      // It's possible to not have a parent: for example, when the user is\n      // dragging all the selected editors but this one on a page which has been\n      // destroyed.\n      // It's why we need to check for it. In such a situation, it isn't really\n      // a problem to not find a new parent: it's something which is related to\n      // what the user is seeing, hence it depends on how pages are layed out.\n\n      // The element will be outside of its parent so change the parent.\n      const { x, y } = this.div.getBoundingClientRect();\n      if (this.parent.findNewParent(this, x, y)) {\n        this.x -= Math.floor(this.x);\n        this.y -= Math.floor(this.y);\n      }\n    }\n\n    // The editor can be moved wherever the user wants, so we don't need to fix\n    // the position: it'll be done when the user will release the mouse button.\n\n    let { x, y } = this;\n    const [bx, by] = this.getBaseTranslation();\n    x += bx;\n    y += by;\n\n    const { style } = div;\n    style.left = `${(100 * x).toFixed(2)}%`;\n    style.top = `${(100 * y).toFixed(2)}%`;\n\n    this._onTranslating(x, y);\n\n    div.scrollIntoView({ block: \"nearest\" });\n  }\n\n  /**\n   * Called when the editor is being translated.\n   * @param {number} x - in page coordinates.\n   * @param {number} y - in page coordinates.\n   */\n  _onTranslating(x, y) {}\n\n  /**\n   * Called when the editor has been translated.\n   * @param {number} x - in page coordinates.\n   * @param {number} y - in page coordinates.\n   */\n  _onTranslated(x, y) {}\n\n  get _hasBeenMoved() {\n    return (\n      !!this.#initialRect &&\n      (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y)\n    );\n  }\n\n  get _hasBeenResized() {\n    return (\n      !!this.#initialRect &&\n      (this.#initialRect[2] !== this.width ||\n        this.#initialRect[3] !== this.height)\n    );\n  }\n\n  /**\n   * Get the translation to take into account the editor border.\n   * The CSS engine positions the element by taking the border into account so\n   * we must apply the opposite translation to have the editor in the right\n   * position.\n   * @returns {Array<number>}\n   */\n  getBaseTranslation() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const { _borderLineWidth } = AnnotationEditor;\n    const x = _borderLineWidth / parentWidth;\n    const y = _borderLineWidth / parentHeight;\n    switch (this.rotation) {\n      case 90:\n        return [-x, y];\n      case 180:\n        return [x, y];\n      case 270:\n        return [x, -y];\n      default:\n        return [-x, -y];\n    }\n  }\n\n  /**\n   * @returns {boolean} true if position must be fixed (i.e. make the x and y\n   * living in the page).\n   */\n  get _mustFixPosition() {\n    return true;\n  }\n\n  /**\n   * Fix the position of the editor in order to keep it inside its parent page.\n   * @param {number} [rotation] - the rotation of the page.\n   */\n  fixAndSetPosition(rotation = this.rotation) {\n    const {\n      div: { style },\n      pageDimensions: [pageWidth, pageHeight],\n    } = this;\n    let { x, y, width, height } = this;\n    width *= pageWidth;\n    height *= pageHeight;\n    x *= pageWidth;\n    y *= pageHeight;\n\n    if (this._mustFixPosition) {\n      switch (rotation) {\n        case 0:\n          x = MathClamp(x, 0, pageWidth - width);\n          y = MathClamp(y, 0, pageHeight - height);\n          break;\n        case 90:\n          x = MathClamp(x, 0, pageWidth - height);\n          y = MathClamp(y, width, pageHeight);\n          break;\n        case 180:\n          x = MathClamp(x, width, pageWidth);\n          y = MathClamp(y, height, pageHeight);\n          break;\n        case 270:\n          x = MathClamp(x, height, pageWidth);\n          y = MathClamp(y, 0, pageHeight - width);\n          break;\n      }\n    }\n\n    this.x = x /= pageWidth;\n    this.y = y /= pageHeight;\n\n    const [bx, by] = this.getBaseTranslation();\n    x += bx;\n    y += by;\n\n    style.left = `${(100 * x).toFixed(2)}%`;\n    style.top = `${(100 * y).toFixed(2)}%`;\n\n    this.moveInDOM();\n  }\n\n  static #rotatePoint(x, y, angle) {\n    switch (angle) {\n      case 90:\n        return [y, -x];\n      case 180:\n        return [-x, -y];\n      case 270:\n        return [-y, x];\n      default:\n        return [x, y];\n    }\n  }\n\n  /**\n   * Convert a screen translation into a page one.\n   * @param {number} x\n   * @param {number} y\n   */\n  screenToPageTranslation(x, y) {\n    return AnnotationEditor.#rotatePoint(x, y, this.parentRotation);\n  }\n\n  /**\n   * Convert a page translation into a screen one.\n   * @param {number} x\n   * @param {number} y\n   */\n  pageTranslationToScreen(x, y) {\n    return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation);\n  }\n\n  #getRotationMatrix(rotation) {\n    switch (rotation) {\n      case 90: {\n        const [pageWidth, pageHeight] = this.pageDimensions;\n        return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];\n      }\n      case 180:\n        return [-1, 0, 0, -1];\n      case 270: {\n        const [pageWidth, pageHeight] = this.pageDimensions;\n        return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0];\n      }\n      default:\n        return [1, 0, 0, 1];\n    }\n  }\n\n  get parentScale() {\n    return this._uiManager.viewParameters.realScale;\n  }\n\n  get parentRotation() {\n    return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;\n  }\n\n  get parentDimensions() {\n    const {\n      parentScale,\n      pageDimensions: [pageWidth, pageHeight],\n    } = this;\n    return [pageWidth * parentScale, pageHeight * parentScale];\n  }\n\n  /**\n   * Set the dimensions of this editor.\n   */\n  setDims() {\n    const {\n      div: { style },\n      width,\n      height,\n    } = this;\n    style.width = `${(100 * width).toFixed(2)}%`;\n    style.height = `${(100 * height).toFixed(2)}%`;\n  }\n\n  /**\n   * Get the translation used to position this editor when it's created.\n   * @returns {Array<number>}\n   */\n  getInitialTranslation() {\n    return [0, 0];\n  }\n\n  #createResizers() {\n    if (this.#resizersDiv) {\n      return;\n    }\n    this.#resizersDiv = document.createElement(\"div\");\n    this.#resizersDiv.classList.add(\"resizers\");\n    // When the resizers are used with the keyboard, they're focusable, hence\n    // we want to have them in this order (top left, top middle, top right, ...)\n    // in the DOM to have the focus order correct.\n    const classes = this._willKeepAspectRatio\n      ? [\"topLeft\", \"topRight\", \"bottomRight\", \"bottomLeft\"]\n      : [\n          \"topLeft\",\n          \"topMiddle\",\n          \"topRight\",\n          \"middleRight\",\n          \"bottomRight\",\n          \"bottomMiddle\",\n          \"bottomLeft\",\n          \"middleLeft\",\n        ];\n    const signal = this._uiManager._signal;\n    for (const name of classes) {\n      const div = document.createElement(\"div\");\n      this.#resizersDiv.append(div);\n      div.classList.add(\"resizer\", name);\n      div.setAttribute(\"data-resizer-name\", name);\n      div.addEventListener(\n        \"pointerdown\",\n        this.#resizerPointerdown.bind(this, name),\n        { signal }\n      );\n      div.addEventListener(\"contextmenu\", noContextMenu, { signal });\n      div.tabIndex = -1;\n    }\n    this.div.prepend(this.#resizersDiv);\n  }\n\n  #resizerPointerdown(name, event) {\n    event.preventDefault();\n    const { isMac } = FeatureTest.platform;\n    if (event.button !== 0 || (event.ctrlKey && isMac)) {\n      return;\n    }\n\n    this.#altText?.toggle(false);\n\n    const savedDraggable = this._isDraggable;\n    this._isDraggable = false;\n    this.#lastPointerCoords = [event.screenX, event.screenY];\n\n    const ac = new AbortController();\n    const signal = this._uiManager.combinedSignal(ac);\n\n    this.parent.togglePointerEvents(false);\n    window.addEventListener(\n      \"pointermove\",\n      this.#resizerPointermove.bind(this, name),\n      { passive: true, capture: true, signal }\n    );\n    window.addEventListener(\n      \"touchmove\",\n      stopEvent /* Prevent the page from scrolling */,\n      { passive: false, signal }\n    );\n    window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height,\n    };\n    const savedParentCursor = this.parent.div.style.cursor;\n    const savedCursor = this.div.style.cursor;\n    this.div.style.cursor = this.parent.div.style.cursor =\n      window.getComputedStyle(event.target).cursor;\n\n    const pointerUpCallback = () => {\n      ac.abort();\n      this.parent.togglePointerEvents(true);\n      this.#altText?.toggle(true);\n      this._isDraggable = savedDraggable;\n      this.parent.div.style.cursor = savedParentCursor;\n      this.div.style.cursor = savedCursor;\n\n      this.#addResizeToUndoStack();\n    };\n    window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n    // If the user switches to another window (with alt+tab), then we end the\n    // resize session.\n    window.addEventListener(\"blur\", pointerUpCallback, { signal });\n  }\n\n  #resize(x, y, width, height) {\n    this.width = width;\n    this.height = height;\n    this.x = x;\n    this.y = y;\n    this.setDims();\n    this.fixAndSetPosition();\n    this._onResized();\n  }\n\n  /**\n   * Called when the editor has been resized.\n   */\n  _onResized() {}\n\n  #addResizeToUndoStack() {\n    if (!this.#savedDimensions) {\n      return;\n    }\n    const { savedX, savedY, savedWidth, savedHeight } = this.#savedDimensions;\n    this.#savedDimensions = null;\n\n    const newX = this.x;\n    const newY = this.y;\n    const newWidth = this.width;\n    const newHeight = this.height;\n    if (\n      newX === savedX &&\n      newY === savedY &&\n      newWidth === savedWidth &&\n      newHeight === savedHeight\n    ) {\n      return;\n    }\n\n    this.addCommands({\n      cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight),\n      undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight),\n      mustExec: true,\n    });\n  }\n\n  static _round(x) {\n    // 10000 because we multiply by 100 and use toFixed(2) in fixAndSetPosition.\n    // Without rounding, the positions of the corners other than the top left\n    // one can be slightly wrong.\n    return Math.round(x * 10000) / 10000;\n  }\n\n  #resizerPointermove(name, event) {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const savedX = this.x;\n    const savedY = this.y;\n    const savedWidth = this.width;\n    const savedHeight = this.height;\n    const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n    const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n\n    const rotationMatrix = this.#getRotationMatrix(this.rotation);\n    const transf = (x, y) => [\n      rotationMatrix[0] * x + rotationMatrix[2] * y,\n      rotationMatrix[1] * x + rotationMatrix[3] * y,\n    ];\n    const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation);\n    const invTransf = (x, y) => [\n      invRotationMatrix[0] * x + invRotationMatrix[2] * y,\n      invRotationMatrix[1] * x + invRotationMatrix[3] * y,\n    ];\n    let getPoint;\n    let getOpposite;\n    let isDiagonal = false;\n    let isHorizontal = false;\n\n    switch (name) {\n      case \"topLeft\":\n        isDiagonal = true;\n        getPoint = (w, h) => [0, 0];\n        getOpposite = (w, h) => [w, h];\n        break;\n      case \"topMiddle\":\n        getPoint = (w, h) => [w / 2, 0];\n        getOpposite = (w, h) => [w / 2, h];\n        break;\n      case \"topRight\":\n        isDiagonal = true;\n        getPoint = (w, h) => [w, 0];\n        getOpposite = (w, h) => [0, h];\n        break;\n      case \"middleRight\":\n        isHorizontal = true;\n        getPoint = (w, h) => [w, h / 2];\n        getOpposite = (w, h) => [0, h / 2];\n        break;\n      case \"bottomRight\":\n        isDiagonal = true;\n        getPoint = (w, h) => [w, h];\n        getOpposite = (w, h) => [0, 0];\n        break;\n      case \"bottomMiddle\":\n        getPoint = (w, h) => [w / 2, h];\n        getOpposite = (w, h) => [w / 2, 0];\n        break;\n      case \"bottomLeft\":\n        isDiagonal = true;\n        getPoint = (w, h) => [0, h];\n        getOpposite = (w, h) => [w, 0];\n        break;\n      case \"middleLeft\":\n        isHorizontal = true;\n        getPoint = (w, h) => [0, h / 2];\n        getOpposite = (w, h) => [w, h / 2];\n        break;\n    }\n\n    const point = getPoint(savedWidth, savedHeight);\n    const oppositePoint = getOpposite(savedWidth, savedHeight);\n    let transfOppositePoint = transf(...oppositePoint);\n    const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]);\n    const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]);\n    let ratioX = 1;\n    let ratioY = 1;\n\n    let deltaX, deltaY;\n\n    if (!event.fromKeyboard) {\n      // We can't use event.movementX/Y because they're not reliable:\n      //  https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX\n      // (it was buggy on a laptop with a touch screen).\n      const { screenX, screenY } = event;\n      const [lastScreenX, lastScreenY] = this.#lastPointerCoords;\n      [deltaX, deltaY] = this.screenToPageTranslation(\n        screenX - lastScreenX,\n        screenY - lastScreenY\n      );\n      this.#lastPointerCoords[0] = screenX;\n      this.#lastPointerCoords[1] = screenY;\n    } else {\n      ({ deltaX, deltaY } = event);\n    }\n    [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);\n\n    if (isDiagonal) {\n      const oldDiag = Math.hypot(savedWidth, savedHeight);\n      ratioX = ratioY = Math.max(\n        Math.min(\n          Math.hypot(\n            oppositePoint[0] - point[0] - deltaX,\n            oppositePoint[1] - point[1] - deltaY\n          ) / oldDiag,\n          // Avoid the editor to be larger than the page.\n          1 / savedWidth,\n          1 / savedHeight\n        ),\n        // Avoid the editor to be smaller than the minimum size.\n        minWidth / savedWidth,\n        minHeight / savedHeight\n      );\n    } else if (isHorizontal) {\n      ratioX =\n        MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) /\n        savedWidth;\n    } else {\n      ratioY =\n        MathClamp(\n          Math.abs(oppositePoint[1] - point[1] - deltaY),\n          minHeight,\n          1\n        ) / savedHeight;\n    }\n\n    const newWidth = AnnotationEditor._round(savedWidth * ratioX);\n    const newHeight = AnnotationEditor._round(savedHeight * ratioY);\n    transfOppositePoint = transf(...getOpposite(newWidth, newHeight));\n    const newX = oppositeX - transfOppositePoint[0];\n    const newY = oppositeY - transfOppositePoint[1];\n\n    this.#initialRect ||= [this.x, this.y, this.width, this.height];\n    this.width = newWidth;\n    this.height = newHeight;\n    this.x = newX;\n    this.y = newY;\n\n    this.setDims();\n    this.fixAndSetPosition();\n\n    this._onResizing();\n  }\n\n  /**\n   * Called when the editor is being resized.\n   */\n  _onResizing() {}\n\n  /**\n   * Called when the alt text dialog is closed.\n   */\n  altTextFinish() {\n    this.#altText?.finish();\n  }\n\n  /**\n   * Get the toolbar buttons for this editor.\n   * @returns {Array<Array<string|object|null>>|null}\n   */\n  get toolbarButtons() {\n    return null;\n  }\n\n  /**\n   * Add a toolbar for this editor.\n   * @returns {Promise<EditorToolbar|null>}\n   */\n  async addEditToolbar() {\n    if (this._editToolbar || this.#isInEditMode) {\n      return this._editToolbar;\n    }\n    this._editToolbar = new EditorToolbar(this);\n    this.div.append(this._editToolbar.render());\n    const { toolbarButtons } = this;\n    if (toolbarButtons) {\n      for (const [name, tool] of toolbarButtons) {\n        await this._editToolbar.addButton(name, tool);\n      }\n    }\n    if (!this.hasComment) {\n      this._editToolbar.addButton(\"comment\", this.addCommentButton());\n    }\n    this._editToolbar.addButton(\"delete\");\n\n    return this._editToolbar;\n  }\n\n  addCommentButtonInToolbar() {\n    this._editToolbar?.addButtonBefore(\n      \"comment\",\n      this.addCommentButton(),\n      \".deleteButton\"\n    );\n  }\n\n  removeCommentButtonFromToolbar() {\n    this._editToolbar?.removeButton(\"comment\");\n  }\n\n  removeEditToolbar() {\n    this._editToolbar?.remove();\n    this._editToolbar = null;\n\n    // We destroy the alt text but we don't null it because we want to be able\n    // to restore it in case the user undoes the deletion.\n    this.#altText?.destroy();\n  }\n\n  addContainer(container) {\n    const editToolbarDiv = this._editToolbar?.div;\n    if (editToolbarDiv) {\n      editToolbarDiv.before(container);\n    } else {\n      this.div.append(container);\n    }\n  }\n\n  getClientDimensions() {\n    return this.div.getBoundingClientRect();\n  }\n\n  /**\n   * Create the alt text for this editor.\n   * @returns {object}\n   */\n  createAltText() {\n    if (!this.#altText) {\n      AltText.initialize(AnnotationEditor._l10n);\n      this.#altText = new AltText(this);\n      if (this.#accessibilityData) {\n        this.#altText.data = this.#accessibilityData;\n        this.#accessibilityData = null;\n      }\n    }\n    return this.#altText;\n  }\n\n  get altTextData() {\n    return this.#altText?.data;\n  }\n\n  /**\n   * Set the alt text data.\n   */\n  set altTextData(data) {\n    if (!this.#altText) {\n      return;\n    }\n    this.#altText.data = data;\n  }\n\n  get guessedAltText() {\n    return this.#altText?.guessedText;\n  }\n\n  async setGuessedAltText(text) {\n    await this.#altText?.setGuessedText(text);\n  }\n\n  serializeAltText(isForCopying) {\n    return this.#altText?.serialize(isForCopying);\n  }\n\n  hasAltText() {\n    return !!this.#altText && !this.#altText.isEmpty();\n  }\n\n  hasAltTextData() {\n    return this.#altText?.hasData() ?? false;\n  }\n\n  focusCommentButton() {\n    this.#comment?.focusButton();\n  }\n\n  addCommentButton() {\n    return this.canAddComment ? (this.#comment ||= new Comment(this)) : null;\n  }\n\n  addStandaloneCommentButton() {\n    if (!this._uiManager.hasCommentManager()) {\n      return;\n    }\n    if (this.#commentStandaloneButton) {\n      if (this._uiManager.isEditingMode()) {\n        this.#commentStandaloneButton.classList.remove(\"hidden\");\n      }\n      return;\n    }\n    if (!this.hasComment) {\n      return;\n    }\n    this.#commentStandaloneButton = this.#comment.renderForStandalone();\n    this.div.append(this.#commentStandaloneButton);\n  }\n\n  removeStandaloneCommentButton() {\n    this.#comment.removeStandaloneCommentButton();\n    this.#commentStandaloneButton = null;\n  }\n\n  hideStandaloneCommentButton() {\n    this.#commentStandaloneButton?.classList.add(\"hidden\");\n  }\n\n  get comment() {\n    if (!this.#comment) {\n      return null;\n    }\n    const {\n      data: { richText, text, date, deleted },\n    } = this.#comment;\n    return {\n      text,\n      richText,\n      date,\n      deleted,\n      color: this.getNonHCMColor(),\n      opacity: this.opacity ?? 1,\n    };\n  }\n\n  set comment(value) {\n    this.#comment ||= new Comment(this);\n    if (typeof value === \"object\" && value !== null) {\n      // Restore full comment data (used for undo).\n      this.#comment.restoreData(value);\n    } else {\n      this.#comment.data = value;\n    }\n    if (this.hasComment) {\n      this.removeCommentButtonFromToolbar();\n      this.addStandaloneCommentButton();\n      this._uiManager.updateComment(this);\n    } else {\n      this.addCommentButtonInToolbar();\n      this.removeStandaloneCommentButton();\n      this._uiManager.removeComment(this);\n    }\n  }\n\n  setCommentData({ comment, popupRef, richText }) {\n    if (!popupRef) {\n      return;\n    }\n    this.#comment ||= new Comment(this);\n    this.#comment.setInitialText(comment, richText);\n\n    if (!this.annotationElementId) {\n      return;\n    }\n    const storedData = this._uiManager.getAndRemoveDataFromAnnotationStorage(\n      this.annotationElementId\n    );\n    if (storedData) {\n      this.updateFromAnnotationLayer(storedData);\n    }\n  }\n\n  get hasEditedComment() {\n    return this.#comment?.hasBeenEdited();\n  }\n\n  get hasDeletedComment() {\n    return this.#comment?.isDeleted();\n  }\n\n  get hasComment() {\n    return (\n      !!this.#comment && !this.#comment.isEmpty() && !this.#comment.isDeleted()\n    );\n  }\n\n  async editComment(options) {\n    this.#comment ||= new Comment(this);\n    this.#comment.edit(options);\n  }\n\n  toggleComment(isSelected, visibility = undefined) {\n    if (this.hasComment) {\n      this._uiManager.toggleComment(this, isSelected, visibility);\n    }\n  }\n\n  setSelectedCommentButton(selected) {\n    this.#comment.setSelectedButton(selected);\n  }\n\n  addComment(serialized) {\n    if (this.hasEditedComment) {\n      const DEFAULT_POPUP_WIDTH = 180;\n      const DEFAULT_POPUP_HEIGHT = 100;\n      const [, , , trY] = serialized.rect;\n      const [pageWidth] = this.pageDimensions;\n      const [pageX] = this.pageTranslation;\n      const blX = pageX + pageWidth + 1;\n      const blY = trY - DEFAULT_POPUP_HEIGHT;\n      const trX = blX + DEFAULT_POPUP_WIDTH;\n      serialized.popup = {\n        contents: this.comment.text,\n        deleted: this.comment.deleted,\n        rect: [blX, blY, trX, trY],\n      };\n    }\n  }\n\n  updateFromAnnotationLayer({ popup: { contents, deleted } }) {\n    this.#comment.data = deleted ? null : contents;\n  }\n\n  get parentBoundingClientRect() {\n    return this.parent.boundingClientRect;\n  }\n\n  /**\n   * Render this editor in a div.\n   * @returns {HTMLDivElement | null}\n   */\n  render() {\n    const div = (this.div = document.createElement(\"div\"));\n    div.setAttribute(\"data-editor-rotation\", (360 - this.rotation) % 360);\n    div.className = this.name;\n    div.setAttribute(\"id\", this.id);\n    div.tabIndex = this.#disabled ? -1 : 0;\n    div.setAttribute(\"role\", \"application\");\n    if (this.defaultL10nId) {\n      div.setAttribute(\"data-l10n-id\", this.defaultL10nId);\n    }\n    if (!this._isVisible) {\n      div.classList.add(\"hidden\");\n    }\n\n    this.setInForeground();\n    this.#addFocusListeners();\n\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    if (this.parentRotation % 180 !== 0) {\n      div.style.maxWidth = `${((100 * parentHeight) / parentWidth).toFixed(\n        2\n      )}%`;\n      div.style.maxHeight = `${((100 * parentWidth) / parentHeight).toFixed(\n        2\n      )}%`;\n    }\n\n    const [tx, ty] = this.getInitialTranslation();\n    this.translate(tx, ty);\n\n    bindEvents(this, div, [\"keydown\", \"pointerdown\", \"dblclick\"]);\n\n    if (this.isResizable && this._uiManager._supportsPinchToZoom) {\n      this.#touchManager ||= new TouchManager({\n        container: div,\n        isPinchingDisabled: () => !this.isSelected,\n        onPinchStart: this.#touchPinchStartCallback.bind(this),\n        onPinching: this.#touchPinchCallback.bind(this),\n        onPinchEnd: this.#touchPinchEndCallback.bind(this),\n        signal: this._uiManager._signal,\n      });\n    }\n\n    this.addStandaloneCommentButton();\n    this._uiManager._editorUndoBar?.hide();\n\n    return div;\n  }\n\n  #touchPinchStartCallback() {\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height,\n    };\n    this.#altText?.toggle(false);\n    this.parent.togglePointerEvents(false);\n  }\n\n  #touchPinchCallback(_origin, prevDistance, distance) {\n    // Slightly slow down the zooming because the editor could be small and the\n    // user could have difficulties to rescale it as they want.\n    const slowDownFactor = 0.7;\n    let factor =\n      slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor;\n    if (factor === 1) {\n      return;\n    }\n\n    const rotationMatrix = this.#getRotationMatrix(this.rotation);\n    const transf = (x, y) => [\n      rotationMatrix[0] * x + rotationMatrix[2] * y,\n      rotationMatrix[1] * x + rotationMatrix[3] * y,\n    ];\n\n    // The center of the editor is the fixed point.\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const savedX = this.x;\n    const savedY = this.y;\n    const savedWidth = this.width;\n    const savedHeight = this.height;\n\n    const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n    const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n    factor = Math.max(\n      Math.min(factor, 1 / savedWidth, 1 / savedHeight),\n      minWidth / savedWidth,\n      minHeight / savedHeight\n    );\n    const newWidth = AnnotationEditor._round(savedWidth * factor);\n    const newHeight = AnnotationEditor._round(savedHeight * factor);\n    if (newWidth === savedWidth && newHeight === savedHeight) {\n      return;\n    }\n\n    this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight];\n    const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2);\n    const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]);\n    const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]);\n    const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2);\n\n    this.x = centerX - newTransfCenterPoint[0];\n    this.y = centerY - newTransfCenterPoint[1];\n    this.width = newWidth;\n    this.height = newHeight;\n\n    this.setDims();\n    this.fixAndSetPosition();\n\n    this._onResizing();\n  }\n\n  #touchPinchEndCallback() {\n    this.#altText?.toggle(true);\n    this.parent.togglePointerEvents(true);\n    this.#addResizeToUndoStack();\n  }\n\n  /**\n   * Onpointerdown callback.\n   * @param {PointerEvent} event\n   */\n  pointerdown(event) {\n    const { isMac } = FeatureTest.platform;\n    if (event.button !== 0 || (event.ctrlKey && isMac)) {\n      // Avoid to focus this editor because of a non-left click.\n      event.preventDefault();\n      return;\n    }\n    this.#hasBeenClicked = true;\n\n    if (this._isDraggable) {\n      this.#setUpDragSession(event);\n      return;\n    }\n\n    this.#selectOnPointerEvent(event);\n  }\n\n  #selectOnPointerEvent(event) {\n    const { isMac } = FeatureTest.platform;\n    if (\n      (event.ctrlKey && !isMac) ||\n      event.shiftKey ||\n      (event.metaKey && isMac)\n    ) {\n      this.parent.toggleSelected(this);\n    } else {\n      this.parent.setSelected(this);\n    }\n  }\n\n  #setUpDragSession(event) {\n    const { isSelected } = this;\n    this._uiManager.setUpDragSession();\n    let hasDraggingStarted = false;\n\n    const ac = new AbortController();\n    const signal = this._uiManager.combinedSignal(ac);\n    const opts = { capture: true, passive: false, signal };\n    const cancelDrag = e => {\n      ac.abort();\n\n      this.#dragPointerId = null;\n      this.#hasBeenClicked = false;\n      if (!this._uiManager.endDragSession()) {\n        this.#selectOnPointerEvent(e);\n      }\n      if (hasDraggingStarted) {\n        this._onStopDragging();\n      }\n    };\n\n    if (isSelected) {\n      this.#prevDragX = event.clientX;\n      this.#prevDragY = event.clientY;\n      this.#dragPointerId = event.pointerId;\n      this.#dragPointerType = event.pointerType;\n      window.addEventListener(\n        \"pointermove\",\n        e => {\n          if (!hasDraggingStarted) {\n            hasDraggingStarted = true;\n            this._uiManager.toggleComment(\n              this,\n              /* isSelected = */ true,\n              /* visibility = */ false\n            );\n            this._onStartDragging();\n          }\n          const { clientX: x, clientY: y, pointerId } = e;\n          if (pointerId !== this.#dragPointerId) {\n            stopEvent(e);\n            return;\n          }\n          const [tx, ty] = this.screenToPageTranslation(\n            x - this.#prevDragX,\n            y - this.#prevDragY\n          );\n          this.#prevDragX = x;\n          this.#prevDragY = y;\n          this._uiManager.dragSelectedEditors(tx, ty);\n        },\n        opts\n      );\n      window.addEventListener(\n        \"touchmove\",\n        stopEvent /* Prevent the page from scrolling */,\n        opts\n      );\n      window.addEventListener(\n        \"pointerdown\",\n        // If the user drags with one finger and then clicks with another.\n        e => {\n          if (e.pointerType === this.#dragPointerType) {\n            // We've a pinch to zoom session.\n            // We cannot have two primaries at the same time.\n            // It's possible to be in this state with Firefox and Gnome when\n            // trying to drag with three fingers (see bug 1933716).\n            if (this.#touchManager || e.isPrimary) {\n              cancelDrag(e);\n            }\n          }\n          stopEvent(e);\n        },\n        opts\n      );\n    }\n\n    const pointerUpCallback = e => {\n      if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) {\n        cancelDrag(e);\n        return;\n      }\n      stopEvent(e);\n    };\n    window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n    // If the user is using alt+tab during the dragging session, the pointerup\n    // event could be not fired, but a blur event is fired so we can use it in\n    // order to interrupt the dragging session.\n    window.addEventListener(\"blur\", pointerUpCallback, { signal });\n  }\n\n  _onStartDragging() {}\n\n  _onStopDragging() {}\n\n  moveInDOM() {\n    // Moving the editor in the DOM can be expensive, so we wait a bit before.\n    // It's important to not block the UI (for example when changing the font\n    // size in a FreeText).\n    if (this.#moveInDOMTimeout) {\n      clearTimeout(this.#moveInDOMTimeout);\n    }\n    this.#moveInDOMTimeout = setTimeout(() => {\n      this.#moveInDOMTimeout = null;\n      this.parent?.moveEditorInDOM(this);\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n        this._uiManager._eventBus.dispatch(\"editormovedindom\", {\n          source: this,\n        });\n      }\n    }, 0);\n  }\n\n  _setParentAndPosition(parent, x, y) {\n    parent.changeParent(this);\n    this.x = x;\n    this.y = y;\n    this.fixAndSetPosition();\n    this._onTranslated();\n  }\n\n  /**\n   * Convert the current rect into a page one.\n   * @param {number} tx - x-translation in screen coordinates.\n   * @param {number} ty - y-translation in screen coordinates.\n   * @param {number} [rotation] - the rotation of the page.\n   */\n  getRect(tx, ty, rotation = this.rotation) {\n    const scale = this.parentScale;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const [pageX, pageY] = this.pageTranslation;\n    const shiftX = tx / scale;\n    const shiftY = ty / scale;\n    const x = this.x * pageWidth;\n    const y = this.y * pageHeight;\n    const width = this.width * pageWidth;\n    const height = this.height * pageHeight;\n\n    switch (rotation) {\n      case 0:\n        return [\n          x + shiftX + pageX,\n          pageHeight - y - shiftY - height + pageY,\n          x + shiftX + width + pageX,\n          pageHeight - y - shiftY + pageY,\n        ];\n      case 90:\n        return [\n          x + shiftY + pageX,\n          pageHeight - y + shiftX + pageY,\n          x + shiftY + height + pageX,\n          pageHeight - y + shiftX + width + pageY,\n        ];\n      case 180:\n        return [\n          x - shiftX - width + pageX,\n          pageHeight - y + shiftY + pageY,\n          x - shiftX + pageX,\n          pageHeight - y + shiftY + height + pageY,\n        ];\n      case 270:\n        return [\n          x - shiftY - height + pageX,\n          pageHeight - y - shiftX - width + pageY,\n          x - shiftY + pageX,\n          pageHeight - y - shiftX + pageY,\n        ];\n      default:\n        throw new Error(\"Invalid rotation\");\n    }\n  }\n\n  getRectInCurrentCoords(rect, pageHeight) {\n    const [x1, y1, x2, y2] = rect;\n\n    const width = x2 - x1;\n    const height = y2 - y1;\n\n    switch (this.rotation) {\n      case 0:\n        return [x1, pageHeight - y2, width, height];\n      case 90:\n        return [x1, pageHeight - y1, height, width];\n      case 180:\n        return [x2, pageHeight - y1, width, height];\n      case 270:\n        return [x2, pageHeight - y2, height, width];\n      default:\n        throw new Error(\"Invalid rotation\");\n    }\n  }\n\n  /**\n   * Get the rect in page coordinates without any translation.\n   * It's used when serializing the editor.\n   * @returns {Array<number>}\n   */\n  getPDFRect() {\n    return this.getRect(0, 0);\n  }\n\n  getNonHCMColor() {\n    return (\n      this.color &&\n      AnnotationEditor._colorManager.convert(\n        this._uiManager.getNonHCMColor(this.color)\n      )\n    );\n  }\n\n  /**\n   * The color has been changed.\n   */\n  onUpdatedColor() {\n    this.#comment?.onUpdatedColor();\n  }\n\n  getData() {\n    const {\n      comment: { text: str, color, date, opacity, deleted, richText },\n      uid: id,\n      pageIndex,\n      creationDate,\n      modificationDate,\n    } = this;\n    return {\n      id,\n      pageIndex,\n      rect: this.getPDFRect(),\n      richText,\n      contentsObj: { str },\n      creationDate,\n      modificationDate: date || modificationDate,\n      popupRef: !deleted,\n      color,\n      opacity,\n    };\n  }\n\n  /**\n   * Executed once this editor has been rendered.\n   * @param {boolean} focus - true if the editor should be focused.\n   */\n  onceAdded(focus) {}\n\n  /**\n   * Check if the editor contains something.\n   * @returns {boolean}\n   */\n  isEmpty() {\n    return false;\n  }\n\n  /**\n   * Enable edit mode.\n   * @returns {boolean} - true if the edit mode has been enabled.\n   */\n  enableEditMode() {\n    if (this.isInEditMode()) {\n      return false;\n    }\n    this.parent.setEditingState(false);\n    this.#isInEditMode = true;\n\n    return true;\n  }\n\n  /**\n   * Disable edit mode.\n   * @returns {boolean} - true if the edit mode has been disabled.\n   */\n  disableEditMode() {\n    if (!this.isInEditMode()) {\n      return false;\n    }\n    this.parent.setEditingState(true);\n    this.#isInEditMode = false;\n\n    return true;\n  }\n\n  /**\n   * Check if the editor is edited.\n   * @returns {boolean}\n   */\n  isInEditMode() {\n    return this.#isInEditMode;\n  }\n\n  /**\n   * If it returns true, then this editor handles the keyboard\n   * events itself.\n   * @returns {boolean}\n   */\n  shouldGetKeyboardEvents() {\n    return this.#isResizerEnabledForKeyboard;\n  }\n\n  /**\n   * Check if this editor needs to be rebuilt or not.\n   * @returns {boolean}\n   */\n  needsToBeRebuilt() {\n    return this.div && !this.isAttachedToDOM;\n  }\n\n  get isOnScreen() {\n    const { top, left, bottom, right } = this.getClientDimensions();\n    const { innerHeight, innerWidth } = window;\n    return left < innerWidth && right > 0 && top < innerHeight && bottom > 0;\n  }\n\n  #addFocusListeners() {\n    if (this.#focusAC || !this.div) {\n      return;\n    }\n    this.#focusAC = new AbortController();\n    const signal = this._uiManager.combinedSignal(this.#focusAC);\n\n    this.div.addEventListener(\"focusin\", this.focusin.bind(this), { signal });\n    this.div.addEventListener(\"focusout\", this.focusout.bind(this), { signal });\n  }\n\n  /**\n   * Rebuild the editor in case it has been removed on undo.\n   *\n   * To implement in subclasses.\n   */\n  rebuild() {\n    this.#addFocusListeners();\n  }\n\n  /**\n   * Rotate the editor when the page is rotated.\n   * @param {number} angle\n   */\n  rotate(_angle) {}\n\n  /**\n   * Resize the editor when the page is resized.\n   */\n  resize() {}\n\n  /**\n   * Serialize the editor when it has been deleted.\n   * @returns {Object}\n   */\n  serializeDeleted() {\n    return {\n      id: this.annotationElementId,\n      deleted: true,\n      pageIndex: this.pageIndex,\n      popupRef: this._initialData?.popupRef || \"\",\n    };\n  }\n\n  /**\n   * Serialize the editor.\n   * The result of the serialization will be used to construct a\n   * new annotation to add to the pdf document.\n   *\n   * To implement in subclasses.\n   * @param {boolean} [isForCopying]\n   * @param {Object | null} [context]\n   * @returns {Object | null}\n   */\n  serialize(isForCopying = false, context = null) {\n    return {\n      annotationType: this.mode,\n      pageIndex: this.pageIndex,\n      rect: this.getPDFRect(),\n      rotation: this.rotation,\n      structTreeParentId: this._structTreeParentId,\n      popupRef: this._initialData?.popupRef || \"\",\n    };\n  }\n\n  /**\n   * Deserialize the editor.\n   * The result of the deserialization is a new editor.\n   *\n   * @param {Object} data\n   * @param {AnnotationEditorLayer} parent\n   * @param {AnnotationEditorUIManager} uiManager\n   * @returns {Promise<AnnotationEditor | null>}\n   */\n  static async deserialize(data, parent, uiManager) {\n    const editor = new this.prototype.constructor({\n      parent,\n      id: uiManager.getId(),\n      uiManager,\n      annotationElementId: data.annotationElementId,\n      creationDate: data.creationDate,\n      modificationDate: data.modificationDate,\n    });\n    editor.rotation = data.rotation;\n    editor.#accessibilityData = data.accessibilityData;\n    editor._isCopy = data.isCopy || false;\n\n    const [pageWidth, pageHeight] = editor.pageDimensions;\n    const [x, y, width, height] = editor.getRectInCurrentCoords(\n      data.rect,\n      pageHeight\n    );\n\n    editor.x = x / pageWidth;\n    editor.y = y / pageHeight;\n    editor.width = width / pageWidth;\n    editor.height = height / pageHeight;\n\n    return editor;\n  }\n\n  /**\n   * Check if an existing annotation associated with this editor has been\n   * modified.\n   * @returns {boolean}\n   */\n  get hasBeenModified() {\n    return (\n      !!this.annotationElementId && (this.deleted || this.serialize() !== null)\n    );\n  }\n\n  /**\n   * Remove this editor.\n   * It's used on ctrl+backspace action.\n   */\n  remove() {\n    this.#focusAC?.abort();\n    this.#focusAC = null;\n\n    if (!this.isEmpty()) {\n      // The editor is removed but it can be back at some point thanks to\n      // undo/redo so we must commit it before.\n      this.commit();\n    }\n    if (this.parent) {\n      this.parent.remove(this);\n    } else {\n      this._uiManager.removeEditor(this);\n    }\n    this.hideCommentPopup();\n\n    if (this.#moveInDOMTimeout) {\n      clearTimeout(this.#moveInDOMTimeout);\n      this.#moveInDOMTimeout = null;\n    }\n    this.#stopResizing();\n    this.removeEditToolbar();\n    if (this.#telemetryTimeouts) {\n      for (const timeout of this.#telemetryTimeouts.values()) {\n        clearTimeout(timeout);\n      }\n      this.#telemetryTimeouts = null;\n    }\n    this.parent = null;\n    this.#touchManager?.destroy();\n    this.#touchManager = null;\n    this.#fakeAnnotation?.remove();\n    this.#fakeAnnotation = null;\n  }\n\n  /**\n   * @returns {boolean} true if this editor can be resized.\n   */\n  get isResizable() {\n    return false;\n  }\n\n  /**\n   * Add the resizers to this editor.\n   */\n  makeResizable() {\n    if (this.isResizable) {\n      this.#createResizers();\n      this.#resizersDiv.classList.remove(\"hidden\");\n    }\n  }\n\n  get toolbarPosition() {\n    return null;\n  }\n\n  /**\n   * Get the position of the comment button.\n   * @returns {Array<number>|null}\n   */\n  get commentButtonPosition() {\n    return this._uiManager.direction === \"ltr\" ? [1, 0] : [0, 0];\n  }\n\n  get commentButtonPositionInPage() {\n    const {\n      commentButtonPosition: [posX, posY],\n    } = this;\n    const [blX, blY, trX, trY] = this.getPDFRect();\n    return [\n      AnnotationEditor._round(blX + (trX - blX) * posX),\n      AnnotationEditor._round(blY + (trY - blY) * (1 - posY)),\n    ];\n  }\n\n  get commentButtonColor() {\n    return this._uiManager.makeCommentColor(\n      this.getNonHCMColor(),\n      this.opacity\n    );\n  }\n\n  get commentPopupPosition() {\n    return this.#comment.commentPopupPositionInLayer;\n  }\n\n  set commentPopupPosition(pos) {\n    this.#comment.commentPopupPositionInLayer = pos;\n  }\n\n  hasDefaultPopupPosition() {\n    return this.#comment.hasDefaultPopupPosition();\n  }\n\n  get commentButtonWidth() {\n    return this.#comment.commentButtonWidth;\n  }\n\n  get elementBeforePopup() {\n    return this.div;\n  }\n\n  setCommentButtonStates(options) {\n    this.#comment?.setCommentButtonStates(options);\n  }\n\n  /**\n   * onkeydown callback.\n   * @param {KeyboardEvent} event\n   */\n  keydown(event) {\n    if (\n      !this.isResizable ||\n      event.target !== this.div ||\n      event.key !== \"Enter\"\n    ) {\n      return;\n    }\n    this._uiManager.setSelected(this);\n    this.#savedDimensions = {\n      savedX: this.x,\n      savedY: this.y,\n      savedWidth: this.width,\n      savedHeight: this.height,\n    };\n    const children = this.#resizersDiv.children;\n    if (!this.#allResizerDivs) {\n      this.#allResizerDivs = Array.from(children);\n      const boundResizerKeydown = this.#resizerKeydown.bind(this);\n      const boundResizerBlur = this.#resizerBlur.bind(this);\n      const signal = this._uiManager._signal;\n      for (const div of this.#allResizerDivs) {\n        const name = div.getAttribute(\"data-resizer-name\");\n        div.setAttribute(\"role\", \"spinbutton\");\n        div.addEventListener(\"keydown\", boundResizerKeydown, { signal });\n        div.addEventListener(\"blur\", boundResizerBlur, { signal });\n        div.addEventListener(\"focus\", this.#resizerFocus.bind(this, name), {\n          signal,\n        });\n        div.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n      }\n    }\n\n    // We want to have the resizers in the visual order, so we move the first\n    // (top-left) to the right place.\n    const first = this.#allResizerDivs[0];\n    let firstPosition = 0;\n    for (const div of children) {\n      if (div === first) {\n        break;\n      }\n      firstPosition++;\n    }\n    const nextFirstPosition =\n      (((360 - this.rotation + this.parentRotation) % 360) / 90) *\n      (this.#allResizerDivs.length / 4);\n\n    if (nextFirstPosition !== firstPosition) {\n      // We need to reorder the resizers in the DOM in order to have the focus\n      // on the top-left one.\n      if (nextFirstPosition < firstPosition) {\n        for (let i = 0; i < firstPosition - nextFirstPosition; i++) {\n          this.#resizersDiv.append(this.#resizersDiv.firstElementChild);\n        }\n      } else if (nextFirstPosition > firstPosition) {\n        for (let i = 0; i < nextFirstPosition - firstPosition; i++) {\n          this.#resizersDiv.firstElementChild.before(\n            this.#resizersDiv.lastElementChild\n          );\n        }\n      }\n\n      let i = 0;\n      for (const child of children) {\n        const div = this.#allResizerDivs[i++];\n        const name = div.getAttribute(\"data-resizer-name\");\n        child.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n      }\n    }\n\n    this.#setResizerTabIndex(0);\n    this.#isResizerEnabledForKeyboard = true;\n    this.#resizersDiv.firstElementChild.focus({ focusVisible: true });\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }\n\n  #resizerKeydown(event) {\n    AnnotationEditor._resizerKeyboardManager.exec(this, event);\n  }\n\n  #resizerBlur(event) {\n    if (\n      this.#isResizerEnabledForKeyboard &&\n      event.relatedTarget?.parentNode !== this.#resizersDiv\n    ) {\n      this.#stopResizing();\n    }\n  }\n\n  #resizerFocus(name) {\n    this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : \"\";\n  }\n\n  #setResizerTabIndex(value) {\n    if (!this.#allResizerDivs) {\n      return;\n    }\n    for (const div of this.#allResizerDivs) {\n      div.tabIndex = value;\n    }\n  }\n\n  _resizeWithKeyboard(x, y) {\n    if (!this.#isResizerEnabledForKeyboard) {\n      return;\n    }\n    this.#resizerPointermove(this.#focusedResizerName, {\n      deltaX: x,\n      deltaY: y,\n      fromKeyboard: true,\n    });\n  }\n\n  #stopResizing() {\n    this.#isResizerEnabledForKeyboard = false;\n    this.#setResizerTabIndex(-1);\n    this.#addResizeToUndoStack();\n  }\n\n  _stopResizingWithKeyboard() {\n    this.#stopResizing();\n    this.div.focus();\n  }\n\n  /**\n   * Select this editor.\n   */\n  select() {\n    if (this.isSelected && this._editToolbar) {\n      this._editToolbar.show();\n      return;\n    }\n    this.isSelected = true;\n    this.makeResizable();\n    this.div?.classList.add(\"selectedEditor\");\n    if (!this._editToolbar) {\n      this.addEditToolbar().then(() => {\n        if (this.div?.classList.contains(\"selectedEditor\")) {\n          // The editor can have been unselected while we were waiting for the\n          // edit toolbar to be created, hence we want to be sure that this\n          // editor is still selected.\n          this._editToolbar?.show();\n        }\n      });\n      return;\n    }\n    this._editToolbar?.show();\n    this.#altText?.toggleAltTextBadge(false);\n  }\n\n  focus() {\n    if (this.div && !this.div.contains(document.activeElement)) {\n      setTimeout(() => this.div?.focus({ preventScroll: true }), 0);\n    }\n  }\n\n  /**\n   * Unselect this editor.\n   */\n  unselect() {\n    if (!this.isSelected) {\n      return;\n    }\n    this.isSelected = false;\n    this.#resizersDiv?.classList.add(\"hidden\");\n    this.div?.classList.remove(\"selectedEditor\");\n    if (this.div?.contains(document.activeElement)) {\n      // Don't use this.div.blur() because we don't know where the focus will\n      // go.\n      this._uiManager.currentLayer.div.focus({\n        preventScroll: true,\n      });\n    }\n    this._editToolbar?.hide();\n    this.#altText?.toggleAltTextBadge(true);\n    this.hideCommentPopup();\n  }\n\n  hideCommentPopup() {\n    if (this.hasComment) {\n      this._uiManager.toggleComment(null);\n    }\n  }\n\n  /**\n   * Update some parameters which have been changed through the UI.\n   * @param {number} type\n   * @param {*} value\n   */\n  updateParams(type, value) {}\n\n  /**\n   * When the user disables the editing mode some editors can change some of\n   * their properties.\n   */\n  disableEditing() {}\n\n  /**\n   * When the user enables the editing mode some editors can change some of\n   * their properties.\n   */\n  enableEditing() {}\n\n  /**\n   * Check if the content of this editor can be changed.\n   * For example, a FreeText editor can be changed (the user can change the\n   * text), but a Stamp editor cannot.\n   * @returns {boolean}\n   */\n  get canChangeContent() {\n    return false;\n  }\n\n  /**\n   * The editor is about to be edited.\n   */\n  enterInEditMode() {\n    if (!this.canChangeContent) {\n      return;\n    }\n    this.enableEditMode();\n    this.div.focus();\n  }\n\n  /**\n   * ondblclick callback.\n   * @param {MouseEvent} event\n   */\n  dblclick(event) {\n    if (event.target.nodeName === \"BUTTON\") {\n      // Avoid entering in edit mode when clicking on the comment button.\n      return;\n    }\n    this.enterInEditMode();\n    this.parent.updateToolbar({\n      mode: this.constructor._editorType,\n      editId: this.uid,\n    });\n  }\n\n  /**\n   * @returns {HTMLElement | null} the element requiring an alt text.\n   */\n  getElementForAltText() {\n    return this.div;\n  }\n\n  /**\n   * Get the div which really contains the displayed content.\n   * @returns {HTMLDivElement | undefined}\n   */\n  get contentDiv() {\n    return this.div;\n  }\n\n  /**\n   * If true then the editor is currently edited.\n   * @type {boolean}\n   */\n  get isEditing() {\n    return this.#isEditing;\n  }\n\n  /**\n   * When set to true, it means that this editor is currently edited.\n   * @param {boolean} value\n   */\n  set isEditing(value) {\n    this.#isEditing = value;\n    if (!this.parent) {\n      return;\n    }\n    if (value) {\n      this.parent.setSelected(this);\n      this.parent.setActiveEditor(this);\n    } else {\n      this.parent.setActiveEditor(null);\n    }\n  }\n\n  static get MIN_SIZE() {\n    return 16;\n  }\n\n  static canCreateNewEmptyEditor() {\n    return true;\n  }\n\n  /**\n   * Get the data to report to the telemetry when the editor is added.\n   * @returns {Object}\n   */\n  get telemetryInitialData() {\n    return { action: \"added\" };\n  }\n\n  /**\n   * The telemetry data to use when saving/printing.\n   * @returns {Object|null}\n   */\n  get telemetryFinalData() {\n    return null;\n  }\n\n  _reportTelemetry(data, mustWait = false) {\n    if (mustWait) {\n      this.#telemetryTimeouts ||= new Map();\n      const { action } = data;\n      let timeout = this.#telemetryTimeouts.get(action);\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n      timeout = setTimeout(() => {\n        this._reportTelemetry(data);\n        this.#telemetryTimeouts.delete(action);\n        if (this.#telemetryTimeouts.size === 0) {\n          this.#telemetryTimeouts = null;\n        }\n      }, AnnotationEditor._telemetryTimeout);\n      this.#telemetryTimeouts.set(action, timeout);\n      return;\n    }\n    data.type ||= this.editorType;\n    this._uiManager._eventBus.dispatch(\"reporttelemetry\", {\n      source: this,\n      details: {\n        type: \"editing\",\n        data,\n      },\n    });\n  }\n\n  /**\n   * Show or hide this editor.\n   * @param {boolean|undefined} visible\n   */\n  show(visible = this._isVisible) {\n    this.div.classList.toggle(\"hidden\", !visible);\n    this._isVisible = visible;\n  }\n\n  enable() {\n    if (this.div) {\n      this.div.tabIndex = 0;\n    }\n    this.#disabled = false;\n  }\n\n  disable() {\n    if (this.div) {\n      this.div.tabIndex = -1;\n    }\n    this.#disabled = true;\n  }\n\n  updateFakeAnnotationElement(annotationLayer) {\n    if (!this.#fakeAnnotation && !this.deleted) {\n      this.#fakeAnnotation = annotationLayer.addFakeAnnotation(this);\n      return;\n    }\n    if (this.deleted) {\n      this.#fakeAnnotation.remove();\n      this.#fakeAnnotation = null;\n      return;\n    }\n    if (this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized) {\n      this.#fakeAnnotation.updateEdited({\n        rect: this.getPDFRect(),\n        popup: this.comment,\n      });\n    }\n  }\n\n  /**\n   * Render an annotation in the annotation layer.\n   * @param {Object} annotation\n   * @returns {HTMLElement|null}\n   */\n  renderAnnotationElement(annotation) {\n    if (this.deleted) {\n      annotation.hide();\n      return null;\n    }\n    let content = annotation.container.querySelector(\".annotationContent\");\n    if (!content) {\n      content = document.createElement(\"div\");\n      content.classList.add(\"annotationContent\", this.editorType);\n      annotation.container.prepend(content);\n    } else if (content.nodeName === \"CANVAS\") {\n      const canvas = content;\n      content = document.createElement(\"div\");\n      content.classList.add(\"annotationContent\", this.editorType);\n      canvas.before(content);\n    }\n\n    return content;\n  }\n\n  resetAnnotationElement(annotation) {\n    const { firstElementChild } = annotation.container;\n    if (\n      firstElementChild?.nodeName === \"DIV\" &&\n      firstElementChild.classList.contains(\"annotationContent\")\n    ) {\n      firstElementChild.remove();\n    }\n  }\n}\n\n// This class is used to fake an editor which has been deleted.\nclass FakeEditor extends AnnotationEditor {\n  constructor(params) {\n    super(params);\n    this.annotationElementId = params.annotationElementId;\n    this.deleted = true;\n  }\n\n  serialize() {\n    return this.serializeDeleted();\n  }\n}\n\nexport { AnnotationEditor };\n","/* Copyright 2014 Opera Software ASA\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n *\n * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.\n * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.\n */\n\nconst SEED = 0xc3d2e1f0;\n// Workaround for missing math precision in JS.\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\n\nclass MurmurHash3_64 {\n  constructor(seed) {\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n\n  update(input) {\n    let data, length;\n    if (typeof input === \"string\") {\n      data = new Uint8Array(input.length * 2);\n      length = 0;\n      for (let i = 0, ii = input.length; i < ii; i++) {\n        const code = input.charCodeAt(i);\n        if (code <= 0xff) {\n          data[length++] = code;\n        } else {\n          data[length++] = code >>> 8;\n          data[length++] = code & 0xff;\n        }\n      }\n    } else if (ArrayBuffer.isView(input)) {\n      data = input.slice();\n      length = data.byteLength;\n    } else {\n      throw new Error(\"Invalid data format, must be a string or TypedArray.\");\n    }\n\n    const blockCounts = length >> 2;\n    const tailLength = length - blockCounts * 4;\n    // We don't care about endianness here.\n    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n    let k1 = 0,\n      k2 = 0;\n    let h1 = this.h1,\n      h2 = this.h2;\n    const C1 = 0xcc9e2d51,\n      C2 = 0x1b873593;\n    const C1_LOW = C1 & MASK_LOW,\n      C2_LOW = C2 & MASK_LOW;\n\n    for (let i = 0; i < blockCounts; i++) {\n      if (i & 1) {\n        k1 = dataUint32[i];\n        k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n        k1 = (k1 << 15) | (k1 >>> 17);\n        k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n        h1 ^= k1;\n        h1 = (h1 << 13) | (h1 >>> 19);\n        h1 = h1 * 5 + 0xe6546b64;\n      } else {\n        k2 = dataUint32[i];\n        k2 = ((k2 * C1) & MASK_HIGH) | ((k2 * C1_LOW) & MASK_LOW);\n        k2 = (k2 << 15) | (k2 >>> 17);\n        k2 = ((k2 * C2) & MASK_HIGH) | ((k2 * C2_LOW) & MASK_LOW);\n        h2 ^= k2;\n        h2 = (h2 << 13) | (h2 >>> 19);\n        h2 = h2 * 5 + 0xe6546b64;\n      }\n    }\n\n    k1 = 0;\n\n    switch (tailLength) {\n      case 3:\n        k1 ^= data[blockCounts * 4 + 2] << 16;\n      /* falls through */\n      case 2:\n        k1 ^= data[blockCounts * 4 + 1] << 8;\n      /* falls through */\n      case 1:\n        k1 ^= data[blockCounts * 4];\n        /* falls through */\n\n        k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n        k1 = (k1 << 15) | (k1 >>> 17);\n        k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n        if (blockCounts & 1) {\n          h1 ^= k1;\n        } else {\n          h2 ^= k1;\n        }\n    }\n\n    this.h1 = h1;\n    this.h2 = h2;\n  }\n\n  hexdigest() {\n    let h1 = this.h1,\n      h2 = this.h2;\n\n    h1 ^= h2 >>> 1;\n    h1 = ((h1 * 0xed558ccd) & MASK_HIGH) | ((h1 * 0x8ccd) & MASK_LOW);\n    h2 =\n      ((h2 * 0xff51afd7) & MASK_HIGH) |\n      (((((h2 << 16) | (h1 >>> 16)) * 0xafd7ed55) & MASK_HIGH) >>> 16);\n    h1 ^= h2 >>> 1;\n    h1 = ((h1 * 0x1a85ec53) & MASK_HIGH) | ((h1 * 0xec53) & MASK_LOW);\n    h2 =\n      ((h2 * 0xc4ceb9fe) & MASK_HIGH) |\n      (((((h2 << 16) | (h1 >>> 16)) * 0xb9fe1a85) & MASK_HIGH) >>> 16);\n    h1 ^= h2 >>> 1;\n\n    return (\n      (h1 >>> 0).toString(16).padStart(8, \"0\") +\n      (h2 >>> 0).toString(16).padStart(8, \"0\")\n    );\n  }\n}\n\nexport { MurmurHash3_64 };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeMap, shadow, unreachable } from \"../shared/util.js\";\nimport { AnnotationEditor } from \"./editor/editor.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst SerializableEmpty = Object.freeze({\n  map: null,\n  hash: \"\",\n  transfer: undefined,\n});\n\n/**\n * Key/value storage for annotation data in forms.\n */\nclass AnnotationStorage {\n  #modified = false;\n\n  #modifiedIds = null;\n\n  #editorsMap = null;\n\n  #storage = new Map();\n\n  // Callbacks to signal when the modification state is set or reset.\n  // This is used by the viewer to only bind on `beforeunload` if forms\n  // are actually edited to prevent doing so unconditionally since that\n  // can have undesirable effects.\n  onSetModified = null;\n\n  onResetModified = null;\n\n  onAnnotationEditor = null;\n\n  constructor() {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"_setValues\", {\n        value: obj => {\n          for (const [key, val] of Object.entries(obj)) {\n            this.setValue(key, val);\n          }\n        },\n      });\n    }\n  }\n\n  /**\n   * Get the value for a given key if it exists, or return the default value.\n   * @param {string} key\n   * @param {Object} defaultValue\n   * @returns {Object}\n   */\n  getValue(key, defaultValue) {\n    const value = this.#storage.get(key);\n    if (value === undefined) {\n      return defaultValue;\n    }\n\n    return Object.assign(defaultValue, value);\n  }\n\n  /**\n   * Get the value for a given key.\n   * @param {string} key\n   * @returns {Object}\n   */\n  getRawValue(key) {\n    return this.#storage.get(key);\n  }\n\n  /**\n   * Remove a value from the storage.\n   * @param {string} key\n   */\n  remove(key) {\n    const storedValue = this.#storage.get(key);\n    if (storedValue === undefined) {\n      return;\n    }\n    if (storedValue instanceof AnnotationEditor) {\n      this.#editorsMap.delete(storedValue.annotationElementId);\n    }\n    this.#storage.delete(key);\n\n    if (this.#storage.size === 0) {\n      this.resetModified();\n    }\n\n    if (this.#storage.values().some(v => v instanceof AnnotationEditor)) {\n      return;\n    }\n    this.onAnnotationEditor?.(null);\n  }\n\n  /**\n   * Set the value for a given key\n   * @param {string} key\n   * @param {Object} value\n   */\n  setValue(key, value) {\n    const obj = this.#storage.get(key);\n    let modified = false;\n    if (obj !== undefined) {\n      for (const [entry, val] of Object.entries(value)) {\n        if (obj[entry] !== val) {\n          modified = true;\n          obj[entry] = val;\n        }\n      }\n    } else {\n      modified = true;\n      this.#storage.set(key, value);\n    }\n    if (modified) {\n      this.#setModified();\n    }\n\n    if (value instanceof AnnotationEditor) {\n      (this.#editorsMap ||= new Map()).set(value.annotationElementId, value);\n      this.onAnnotationEditor?.(value.constructor._type);\n    }\n  }\n\n  /**\n   * Check if the storage contains the given key.\n   * @param {string} key\n   * @returns {boolean}\n   */\n  has(key) {\n    return this.#storage.has(key);\n  }\n\n  get size() {\n    return this.#storage.size;\n  }\n\n  #setModified() {\n    if (!this.#modified) {\n      this.#modified = true;\n      this.onSetModified?.();\n    }\n  }\n\n  resetModified() {\n    if (this.#modified) {\n      this.#modified = false;\n      this.onResetModified?.();\n    }\n  }\n\n  /**\n   * @returns {PrintAnnotationStorage}\n   */\n  get print() {\n    return new PrintAnnotationStorage(this);\n  }\n\n  /**\n   * PLEASE NOTE: Only intended for usage within the API itself.\n   * @ignore\n   */\n  get serializable() {\n    if (this.#storage.size === 0) {\n      return SerializableEmpty;\n    }\n    const map = new Map(),\n      hash = new MurmurHash3_64(),\n      transfer = [];\n    const context = Object.create(null);\n    let hasBitmap = false;\n\n    for (const [key, val] of this.#storage) {\n      const serialized =\n        val instanceof AnnotationEditor\n          ? val.serialize(/* isForCopying = */ false, context)\n          : val;\n      if (val.page) {\n        val.pageIndex = val.page._pageIndex;\n        delete val.page;\n      }\n      if (serialized) {\n        map.set(key, serialized);\n\n        hash.update(`${key}:${JSON.stringify(serialized)}`);\n        hasBitmap ||= !!serialized.bitmap;\n      }\n    }\n\n    if (hasBitmap) {\n      // We must transfer the bitmap data separately, since it can be changed\n      // during serialization with SVG images.\n      for (const value of map.values()) {\n        if (value.bitmap) {\n          transfer.push(value.bitmap);\n        }\n      }\n    }\n\n    return map.size > 0\n      ? { map, hash: hash.hexdigest(), transfer }\n      : SerializableEmpty;\n  }\n\n  get editorStats() {\n    let stats = null;\n    const typeToEditor = new Map();\n    let numberOfEditedComments = 0;\n    let numberOfDeletedComments = 0;\n    for (const value of this.#storage.values()) {\n      if (!(value instanceof AnnotationEditor)) {\n        if (value.popup) {\n          if (value.popup.deleted) {\n            numberOfDeletedComments += 1;\n          } else {\n            numberOfEditedComments += 1;\n          }\n        }\n        continue;\n      }\n      if (value.isCommentDeleted) {\n        numberOfDeletedComments += 1;\n      } else if (value.hasEditedComment) {\n        numberOfEditedComments += 1;\n      }\n      const editorStats = value.telemetryFinalData;\n      if (!editorStats) {\n        continue;\n      }\n      const { type } = editorStats;\n      typeToEditor.getOrInsertComputed(\n        type,\n        () => Object.getPrototypeOf(value).constructor\n      );\n      stats ||= Object.create(null);\n      const map = (stats[type] ||= new Map());\n      for (const [key, val] of Object.entries(editorStats)) {\n        if (key === \"type\") {\n          continue;\n        }\n        const counters = map.getOrInsertComputed(key, makeMap);\n        counters.set(val, (counters.get(val) ?? 0) + 1);\n      }\n    }\n    if (numberOfDeletedComments > 0 || numberOfEditedComments > 0) {\n      stats ||= Object.create(null);\n      stats.comments = {\n        deleted: numberOfDeletedComments,\n        edited: numberOfEditedComments,\n      };\n    }\n    if (!stats) {\n      return null;\n    }\n    for (const [type, editor] of typeToEditor) {\n      stats[type] = editor.computeTelemetryFinalData(stats[type]);\n    }\n    return stats;\n  }\n\n  resetModifiedIds() {\n    this.#modifiedIds = null;\n  }\n\n  updateEditor(annotationId, data) {\n    const value = this.#editorsMap?.get(annotationId);\n    if (value) {\n      value.updateFromAnnotationLayer(data);\n      return true;\n    }\n    return false;\n  }\n\n  getEditor(annotationId) {\n    return this.#editorsMap?.get(annotationId) || null;\n  }\n\n  /**\n   * @returns {{ids: Set<string>, hash: string}}\n   */\n  get modifiedIds() {\n    if (this.#modifiedIds) {\n      return this.#modifiedIds;\n    }\n    const ids = [];\n    if (this.#editorsMap) {\n      for (const value of this.#editorsMap.values()) {\n        if (!value.serialize()) {\n          continue;\n        }\n        ids.push(value.annotationElementId);\n      }\n    }\n    let hash = \"\";\n    if (ids.length) {\n      const h = new MurmurHash3_64();\n      h.update(ids.join(\",\"));\n      hash = h.hexdigest();\n    }\n    return (this.#modifiedIds = {\n      ids: new Set(ids),\n      hash,\n    });\n  }\n\n  [Symbol.iterator]() {\n    return this.#storage.entries();\n  }\n}\n\n/**\n * A special `AnnotationStorage` for use during printing, where the serializable\n * data is *frozen* upon initialization, to prevent scripting from modifying its\n * contents. (Necessary since printing is triggered synchronously in browsers.)\n */\nclass PrintAnnotationStorage extends AnnotationStorage {\n  #serializable = SerializableEmpty;\n\n  constructor(parent) {\n    super();\n\n    const { serializable } = parent;\n    if (serializable === SerializableEmpty) {\n      return;\n    }\n    const { map, hash, transfer } = serializable;\n    // Create a *copy* of the data, since Objects are passed by reference in JS.\n    const clone = structuredClone(map, transfer ? { transfer } : null);\n    // The `PrintAnnotationStorage` instance is re-used for all pages,\n    // hence we cannot transfer the data since that breaks printing.\n    this.#serializable = { map: clone, hash, transfer: [] };\n  }\n\n  /**\n   * @returns {PrintAnnotationStorage}\n   */\n  // eslint-disable-next-line getter-return\n  get print() {\n    unreachable(\"Should not call PrintAnnotationStorage.print\");\n  }\n\n  /**\n   * PLEASE NOTE: Only intended for usage within the API itself.\n   * @ignore\n   */\n  get serializable() {\n    return this.#serializable;\n  }\n\n  get modifiedIds() {\n    return shadow(this, \"modifiedIds\", {\n      ids: new Set(),\n      hash: \"\",\n    });\n  }\n}\n\nexport { AnnotationStorage, PrintAnnotationStorage, SerializableEmpty };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BBOX_INIT, FeatureTest, Util } from \"../shared/util.js\";\nimport { getCurrentTransform } from \"./display_utils.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\nconst FORCED_DEPENDENCY_LABEL = \"__forcedDependency\";\n\nconst { floor, ceil } = Math;\n\nfunction expandBBox(array, index, minX, minY, maxX, maxY) {\n  array[index * 4 + 0] = Math.min(array[index * 4 + 0], minX);\n  array[index * 4 + 1] = Math.min(array[index * 4 + 1], minY);\n  array[index * 4 + 2] = Math.max(array[index * 4 + 2], maxX);\n  array[index * 4 + 3] = Math.max(array[index * 4 + 3], maxY);\n}\n\n// If a scaling factor is negative then min and max must be swapped.\nfunction scaleCharBBox(scaleX, scaleY, x, y, bbox) {\n  let temp;\n  if (scaleX) {\n    if (scaleX < 0) {\n      temp = bbox[0];\n      bbox[0] = bbox[2];\n      bbox[2] = temp;\n    }\n    bbox[0] *= scaleX;\n    bbox[2] *= scaleX;\n\n    if (scaleY < 0) {\n      temp = bbox[1];\n      bbox[1] = bbox[3];\n      bbox[3] = temp;\n    }\n    bbox[1] *= scaleY;\n    bbox[3] *= scaleY;\n  } else {\n    bbox.fill(0);\n  }\n  bbox[0] += x;\n  bbox[1] += y;\n  bbox[2] += x;\n  bbox[3] += y;\n}\n\n// This is computed rathter than hard-coded to keep into\n// account the platform's endianess.\nconst EMPTY_BBOX = new Uint32Array(new Uint8Array([255, 255, 0, 0]).buffer)[0];\n\nclass BBoxReader {\n  #bboxes;\n\n  #coords;\n\n  constructor(bboxes, coords) {\n    this.#bboxes = bboxes;\n    this.#coords = coords;\n  }\n\n  get length() {\n    return this.#bboxes.length;\n  }\n\n  isEmpty(i) {\n    return this.#bboxes[i] === EMPTY_BBOX;\n  }\n\n  minX(i) {\n    return this.#coords[i * 4 + 0] / 256;\n  }\n\n  minY(i) {\n    return this.#coords[i * 4 + 1] / 256;\n  }\n\n  maxX(i) {\n    return (this.#coords[i * 4 + 2] + 1) / 256;\n  }\n\n  maxY(i) {\n    return (this.#coords[i * 4 + 3] + 1) / 256;\n  }\n}\n\nconst ensureDebugMetadata = (map, key) =>\n  map?.getOrInsertComputed(key, () => ({\n    dependencies: new Set(),\n    isRenderingOperation: false,\n  }));\n\n// NOTE: CanvasBBoxTracker, CanvasDependencyTracker and\n// CanvasNestedDependencyTracker must all have the same interface.\n\nclass CanvasBBoxTracker {\n  #baseTransformStack = [[1, 0, 0, 1, 0, 0]];\n\n  // minX, minY, maxX, maxY\n  #clipBox = [-Infinity, -Infinity, Infinity, Infinity];\n\n  // minX, minY, maxX, maxY\n  #pendingBBox = new Float64Array(BBOX_INIT);\n\n  _pendingBBoxIdx = -1;\n\n  #canvasWidth;\n\n  #canvasHeight;\n\n  // Uint8ClampedArray<minX, minY, maxX, maxY>\n  #bboxesCoords;\n\n  #bboxes;\n\n  _savesStack = [];\n\n  _markedContentStack = [];\n\n  constructor(canvas, operationsCount) {\n    this.#canvasWidth = canvas.width;\n    this.#canvasHeight = canvas.height;\n    this.#initializeBBoxes(operationsCount);\n  }\n\n  growOperationsCount(operationsCount) {\n    if (operationsCount >= this.#bboxes.length) {\n      this.#initializeBBoxes(operationsCount, this.#bboxes);\n    }\n  }\n\n  #initializeBBoxes(operationsCount, oldBBoxes) {\n    const buffer = new ArrayBuffer(operationsCount * 4);\n    this.#bboxesCoords = new Uint8ClampedArray(buffer);\n    this.#bboxes = new Uint32Array(buffer);\n    if (oldBBoxes && oldBBoxes.length > 0) {\n      this.#bboxes.set(oldBBoxes);\n      this.#bboxes.fill(EMPTY_BBOX, oldBBoxes.length);\n    } else {\n      this.#bboxes.fill(EMPTY_BBOX);\n    }\n  }\n\n  get clipBox() {\n    return this.#clipBox;\n  }\n\n  save(opIdx) {\n    this.#clipBox = { __proto__: this.#clipBox };\n    this._savesStack.push(opIdx);\n    return this;\n  }\n\n  restore(opIdx, onSavePopped) {\n    const previous = Object.getPrototypeOf(this.#clipBox);\n    if (previous === null) {\n      // Sometimes we call more .restore() than .save(), for\n      // example when using CanvasGraphics' #restoreInitialState()\n      return this;\n    }\n    this.#clipBox = previous;\n\n    const lastSave = this._savesStack.pop();\n    if (lastSave !== undefined) {\n      onSavePopped?.(lastSave, opIdx);\n      this.#bboxes[opIdx] = this.#bboxes[lastSave];\n    }\n    return this;\n  }\n\n  /**\n   * @param {number} idx\n   */\n  recordOpenMarker(idx) {\n    this._savesStack.push(idx);\n    return this;\n  }\n\n  getOpenMarker() {\n    if (this._savesStack.length === 0) {\n      return null;\n    }\n    return this._savesStack.at(-1);\n  }\n\n  recordCloseMarker(opIdx, onSavePopped) {\n    const lastSave = this._savesStack.pop();\n    if (lastSave !== undefined) {\n      onSavePopped?.(lastSave, opIdx);\n      this.#bboxes[opIdx] = this.#bboxes[lastSave];\n    }\n    return this;\n  }\n\n  // Marked content needs a separate stack from save/restore, because they\n  // form two independent trees.\n  beginMarkedContent(opIdx) {\n    this._markedContentStack.push(opIdx);\n    return this;\n  }\n\n  endMarkedContent(opIdx, onSavePopped) {\n    const lastSave = this._markedContentStack.pop();\n    if (lastSave !== undefined) {\n      onSavePopped?.(lastSave, opIdx);\n      this.#bboxes[opIdx] = this.#bboxes[lastSave];\n    }\n    return this;\n  }\n\n  pushBaseTransform(ctx) {\n    this.#baseTransformStack.push(\n      Util.multiplyByDOMMatrix(\n        this.#baseTransformStack.at(-1),\n        ctx.getTransform()\n      )\n    );\n    return this;\n  }\n\n  popBaseTransform() {\n    if (this.#baseTransformStack.length > 1) {\n      this.#baseTransformStack.pop();\n    }\n    return this;\n  }\n\n  resetBBox(idx) {\n    if (this._pendingBBoxIdx !== idx) {\n      this._pendingBBoxIdx = idx;\n      this.#pendingBBox.set(BBOX_INIT, 0);\n    }\n    return this;\n  }\n\n  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {\n    const transform = Util.multiplyByDOMMatrix(\n      this.#baseTransformStack.at(-1),\n      ctx.getTransform()\n    );\n    const clipBox = BBOX_INIT.slice();\n    Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, clipBox);\n    const intersection = Util.intersect(this.#clipBox, clipBox);\n    if (intersection) {\n      this.#clipBox[0] = intersection[0];\n      this.#clipBox[1] = intersection[1];\n      this.#clipBox[2] = intersection[2];\n      this.#clipBox[3] = intersection[3];\n    } else {\n      this.#clipBox[0] = this.#clipBox[1] = Infinity;\n      this.#clipBox[2] = this.#clipBox[3] = -Infinity;\n    }\n    return this;\n  }\n\n  recordBBox(idx, ctx, minX, maxX, minY, maxY) {\n    const clipBox = this.#clipBox;\n    if (clipBox[0] === Infinity) {\n      return this;\n    }\n\n    const transform = Util.multiplyByDOMMatrix(\n      this.#baseTransformStack.at(-1),\n      ctx.getTransform()\n    );\n    if (clipBox[0] === -Infinity) {\n      Util.axialAlignedBoundingBox(\n        [minX, minY, maxX, maxY],\n        transform,\n        this.#pendingBBox\n      );\n      return this;\n    }\n\n    const bbox = BBOX_INIT.slice();\n    Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, bbox);\n\n    this.#pendingBBox[0] = MathClamp(bbox[0], clipBox[0], this.#pendingBBox[0]);\n    this.#pendingBBox[1] = MathClamp(bbox[1], clipBox[1], this.#pendingBBox[1]);\n    this.#pendingBBox[2] = MathClamp(bbox[2], this.#pendingBBox[2], clipBox[2]);\n    this.#pendingBBox[3] = MathClamp(bbox[3], this.#pendingBBox[3], clipBox[3]);\n    return this;\n  }\n\n  recordFullPageBBox(idx) {\n    this.#pendingBBox[0] = Math.max(0, this.#clipBox[0]);\n    this.#pendingBBox[1] = Math.max(0, this.#clipBox[1]);\n    this.#pendingBBox[2] = Math.min(this.#canvasWidth, this.#clipBox[2]);\n    this.#pendingBBox[3] = Math.min(this.#canvasHeight, this.#clipBox[3]);\n    return this;\n  }\n\n  /**\n   * @param {number} idx\n   */\n  recordOperation(idx, preserve = false, dependencyLists) {\n    if (this._pendingBBoxIdx !== idx) {\n      return this;\n    }\n\n    const minX = floor((this.#pendingBBox[0] * 256) / this.#canvasWidth);\n    const minY = floor((this.#pendingBBox[1] * 256) / this.#canvasHeight);\n    const maxX = ceil((this.#pendingBBox[2] * 256) / this.#canvasWidth);\n    const maxY = ceil((this.#pendingBBox[3] * 256) / this.#canvasHeight);\n\n    expandBBox(this.#bboxesCoords, idx, minX, minY, maxX, maxY);\n    if (dependencyLists) {\n      for (const dependencies of dependencyLists) {\n        for (const depIdx of dependencies) {\n          if (depIdx !== idx) {\n            expandBBox(this.#bboxesCoords, depIdx, minX, minY, maxX, maxY);\n          }\n        }\n      }\n    }\n\n    if (!preserve) {\n      this._pendingBBoxIdx = -1;\n    }\n\n    return this;\n  }\n\n  bboxToClipBoxDropOperation(idx) {\n    if (this._pendingBBoxIdx === idx) {\n      this._pendingBBoxIdx = -1;\n\n      this.#clipBox[0] = Math.max(this.#clipBox[0], this.#pendingBBox[0]);\n      this.#clipBox[1] = Math.max(this.#clipBox[1], this.#pendingBBox[1]);\n      this.#clipBox[2] = Math.min(this.#clipBox[2], this.#pendingBBox[2]);\n      this.#clipBox[3] = Math.min(this.#clipBox[3], this.#pendingBBox[3]);\n    }\n    return this;\n  }\n\n  take() {\n    return new BBoxReader(this.#bboxes, this.#bboxesCoords);\n  }\n\n  takeDebugMetadata() {\n    throw new Error(\"Unreachable\");\n  }\n\n  recordSimpleData(name, idx) {\n    return this;\n  }\n\n  recordIncrementalData(name, idx) {\n    return this;\n  }\n\n  resetIncrementalData(name, idx) {\n    return this;\n  }\n\n  recordNamedData(name, idx) {\n    return this;\n  }\n\n  recordSimpleDataFromNamed(name, depName, fallbackIdx) {\n    return this;\n  }\n\n  recordFutureForcedDependency(name, idx) {\n    return this;\n  }\n\n  inheritSimpleDataAsFutureForcedDependencies(names) {\n    return this;\n  }\n\n  inheritPendingDependenciesAsFutureForcedDependencies() {\n    return this;\n  }\n\n  recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) {\n    return this;\n  }\n\n  getSimpleIndex(dependencyName) {\n    return undefined;\n  }\n\n  recordDependencies(idx, dependencyNames) {\n    return this;\n  }\n\n  recordNamedDependency(idx, name) {\n    return this;\n  }\n\n  recordShowTextOperation(idx, preserve = false) {\n    return this;\n  }\n}\n\n/**\n * @typedef {\"lineWidth\" | \"lineCap\" | \"lineJoin\" | \"miterLimit\" | \"dash\" |\n * \"strokeAlpha\" | \"fillColor\" | \"fillAlpha\" | \"globalCompositeOperation\" |\n * \"path\" | \"filter\" | \"font\" | \"fontObj\"} SimpleDependency\n */\n\n/**\n * @typedef {\"transform\" | \"moveText\" | \"sameLineText\"} IncrementalDependency\n */\n\n/**\n * @typedef {IncrementalDependency |\n * typeof FORCED_DEPENDENCY_LABEL} InternalIncrementalDependency\n */\nclass CanvasDependencyTracker {\n  /** @type {Record<SimpleDependency, number>} */\n  #simple = { __proto__: null };\n\n  /** @type {Record<InternalIncrementalDependency , number[]>} */\n  #incremental = {\n    __proto__: null,\n    transform: [],\n    moveText: [],\n    sameLineText: [],\n    [FORCED_DEPENDENCY_LABEL]: [],\n  };\n\n  #namedDependencies = new Map();\n\n  #pendingDependencies = new Set();\n\n  #fontBBoxTrustworthy = new Map();\n\n  #debugMetadata;\n\n  #recordDebugMetadataDepenencyAfterRestore;\n\n  #bboxTracker;\n\n  constructor(bboxTracker, recordDebugMetadata = false) {\n    this.#bboxTracker = bboxTracker;\n    if (recordDebugMetadata) {\n      this.#debugMetadata = new Map();\n      this.#recordDebugMetadataDepenencyAfterRestore = (lastSave, opIdx) => {\n        ensureDebugMetadata(this.#debugMetadata, opIdx).dependencies.add(\n          lastSave\n        );\n      };\n    }\n  }\n\n  get clipBox() {\n    return this.#bboxTracker.clipBox;\n  }\n\n  growOperationsCount(operationsCount) {\n    this.#bboxTracker.growOperationsCount(operationsCount);\n  }\n\n  save(opIdx) {\n    this.#simple = { __proto__: this.#simple };\n    this.#incremental = {\n      __proto__: this.#incremental,\n      transform: { __proto__: this.#incremental.transform },\n      moveText: { __proto__: this.#incremental.moveText },\n      sameLineText: { __proto__: this.#incremental.sameLineText },\n      [FORCED_DEPENDENCY_LABEL]: {\n        __proto__: this.#incremental[FORCED_DEPENDENCY_LABEL],\n      },\n    };\n    this.#bboxTracker.save(opIdx);\n\n    return this;\n  }\n\n  restore(opIdx) {\n    this.#bboxTracker.restore(\n      opIdx,\n      this.#recordDebugMetadataDepenencyAfterRestore\n    );\n\n    const previous = Object.getPrototypeOf(this.#simple);\n    if (previous === null) {\n      // Sometimes we call more .restore() than .save(), for\n      // example when using CanvasGraphics' #restoreInitialState()\n      return this;\n    }\n    this.#simple = previous;\n    this.#incremental = Object.getPrototypeOf(this.#incremental);\n\n    return this;\n  }\n\n  recordOpenMarker(opIdx) {\n    this.#bboxTracker.recordOpenMarker(\n      opIdx,\n      this.#recordDebugMetadataDepenencyAfterRestore\n    );\n    return this;\n  }\n\n  getOpenMarker() {\n    return this.#bboxTracker.getOpenMarker();\n  }\n\n  recordCloseMarker(opIdx) {\n    this.#bboxTracker.recordCloseMarker(\n      opIdx,\n      this.#recordDebugMetadataDepenencyAfterRestore\n    );\n    return this;\n  }\n\n  /**\n   * @param {number} opIdx\n   */\n  beginMarkedContent(opIdx) {\n    this.#bboxTracker.beginMarkedContent(opIdx);\n    return this;\n  }\n\n  endMarkedContent(opIdx) {\n    this.#bboxTracker.endMarkedContent(\n      opIdx,\n      this.#recordDebugMetadataDepenencyAfterRestore\n    );\n    return this;\n  }\n\n  pushBaseTransform(ctx) {\n    this.#bboxTracker.pushBaseTransform(ctx);\n    return this;\n  }\n\n  popBaseTransform() {\n    this.#bboxTracker.popBaseTransform();\n    return this;\n  }\n\n  /**\n   * @param {SimpleDependency} name\n   * @param {number} idx\n   */\n  recordSimpleData(name, idx) {\n    this.#simple[name] = idx;\n    return this;\n  }\n\n  /**\n   * @param {IncrementalDependency} name\n   * @param {number} idx\n   */\n  recordIncrementalData(name, idx) {\n    this.#incremental[name].push(idx);\n    return this;\n  }\n\n  /**\n   * @param {IncrementalDependency} name\n   * @param {number} idx\n   */\n  resetIncrementalData(name, idx) {\n    this.#incremental[name].length = 0;\n    return this;\n  }\n\n  recordNamedData(name, idx) {\n    this.#namedDependencies.set(name, idx);\n    return this;\n  }\n\n  /**\n   * @param {SimpleDependency} name\n   * @param {string} depName\n   * @param {number} fallbackIdx\n   */\n  recordSimpleDataFromNamed(name, depName, fallbackIdx) {\n    this.#simple[name] = this.#namedDependencies.get(depName) ?? fallbackIdx;\n  }\n\n  // All next operations, until the next .restore(), will depend on this\n  recordFutureForcedDependency(name, idx) {\n    this.recordIncrementalData(FORCED_DEPENDENCY_LABEL, idx);\n    return this;\n  }\n\n  // All next operations, until the next .restore(), will depend on all\n  // the already recorded data with the given names.\n  inheritSimpleDataAsFutureForcedDependencies(names) {\n    for (const name of names) {\n      if (name in this.#simple) {\n        this.recordFutureForcedDependency(name, this.#simple[name]);\n      }\n    }\n    return this;\n  }\n\n  inheritPendingDependenciesAsFutureForcedDependencies() {\n    for (const dep of this.#pendingDependencies) {\n      this.recordFutureForcedDependency(FORCED_DEPENDENCY_LABEL, dep);\n    }\n    return this;\n  }\n\n  resetBBox(idx) {\n    this.#bboxTracker.resetBBox(idx);\n    return this;\n  }\n\n  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {\n    this.#bboxTracker.recordClipBox(idx, ctx, minX, maxX, minY, maxY);\n    return this;\n  }\n\n  recordBBox(idx, ctx, minX, maxX, minY, maxY) {\n    this.#bboxTracker.recordBBox(idx, ctx, minX, maxX, minY, maxY);\n    return this;\n  }\n\n  recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) {\n    const fontBBox = font.bbox;\n    let isBBoxTrustworthy;\n    let computedBBox;\n\n    if (fontBBox) {\n      isBBoxTrustworthy =\n        // Only use the bounding box defined by the font if it\n        // has a non-empty area.\n        fontBBox[2] !== fontBBox[0] &&\n        fontBBox[3] !== fontBBox[1] &&\n        this.#fontBBoxTrustworthy.get(font);\n\n      if (isBBoxTrustworthy !== false) {\n        computedBBox = [0, 0, 0, 0];\n        Util.axialAlignedBoundingBox(fontBBox, font.fontMatrix, computedBBox);\n        if (scale !== 1 || x !== 0 || y !== 0) {\n          scaleCharBBox(scale, -scale, x, y, computedBBox);\n        }\n\n        if (isBBoxTrustworthy) {\n          return this.recordBBox(\n            idx,\n            ctx,\n            computedBBox[0],\n            computedBBox[2],\n            computedBBox[1],\n            computedBBox[3]\n          );\n        }\n      }\n    }\n\n    if (!getMeasure) {\n      // We have no way of telling how big this character actually is, record\n      // a full page bounding box.\n      return this.recordFullPageBBox(idx);\n    }\n\n    const measure = getMeasure();\n\n    if (fontBBox && computedBBox && isBBoxTrustworthy === undefined) {\n      // If it's the first time we can compare the font bbox with the actual\n      // bbox measured when drawing it, check if the one recorded in the font\n      // is large enough to cover the actual bbox. If it is, we assume that the\n      // font is well-formed and we can use the declared bbox without having to\n      // measure it again for every character.\n      isBBoxTrustworthy =\n        computedBBox[0] <= x - measure.actualBoundingBoxLeft &&\n        computedBBox[2] >= x + measure.actualBoundingBoxRight &&\n        computedBBox[1] <= y - measure.actualBoundingBoxAscent &&\n        computedBBox[3] >= y + measure.actualBoundingBoxDescent;\n      this.#fontBBoxTrustworthy.set(font, isBBoxTrustworthy);\n      if (isBBoxTrustworthy) {\n        return this.recordBBox(\n          idx,\n          ctx,\n          computedBBox[0],\n          computedBBox[2],\n          computedBBox[1],\n          computedBBox[3]\n        );\n      }\n    }\n\n    // The font has no bbox or it is not trustworthy, so we need to\n    // return the bounding box based on .measureText().\n    return this.recordBBox(\n      idx,\n      ctx,\n      x - measure.actualBoundingBoxLeft,\n      x + measure.actualBoundingBoxRight,\n      y - measure.actualBoundingBoxAscent,\n      y + measure.actualBoundingBoxDescent\n    );\n  }\n\n  recordFullPageBBox(idx) {\n    this.#bboxTracker.recordFullPageBBox(idx);\n    return this;\n  }\n\n  getSimpleIndex(dependencyName) {\n    return this.#simple[dependencyName];\n  }\n\n  recordDependencies(idx, dependencyNames) {\n    const pendingDependencies = this.#pendingDependencies;\n    const simple = this.#simple;\n    const incremental = this.#incremental;\n    for (const name of dependencyNames) {\n      if (name in this.#simple) {\n        pendingDependencies.add(simple[name]);\n      } else if (name in incremental) {\n        incremental[name].forEach(pendingDependencies.add, pendingDependencies);\n      }\n    }\n\n    return this;\n  }\n\n  recordNamedDependency(idx, name) {\n    if (this.#namedDependencies.has(name)) {\n      this.#pendingDependencies.add(this.#namedDependencies.get(name));\n    }\n\n    return this;\n  }\n\n  /**\n   * @param {number} idx\n   */\n  recordOperation(idx, preserve = false) {\n    this.recordDependencies(idx, [FORCED_DEPENDENCY_LABEL]);\n\n    if (this.#debugMetadata) {\n      const metadata = ensureDebugMetadata(this.#debugMetadata, idx);\n      const { dependencies } = metadata;\n      this.#pendingDependencies.forEach(dependencies.add, dependencies);\n      this.#bboxTracker._savesStack.forEach(dependencies.add, dependencies);\n      this.#bboxTracker._markedContentStack.forEach(\n        dependencies.add,\n        dependencies\n      );\n      dependencies.delete(idx);\n      metadata.isRenderingOperation = true;\n    }\n\n    const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx;\n\n    this.#bboxTracker.recordOperation(idx, preserve, [\n      this.#pendingDependencies,\n      this.#bboxTracker._savesStack,\n      this.#bboxTracker._markedContentStack,\n    ]);\n\n    if (needsCleanup) {\n      this.#pendingDependencies.clear();\n    }\n\n    return this;\n  }\n\n  recordShowTextOperation(idx, preserve = false) {\n    const deps = Array.from(this.#pendingDependencies);\n    this.recordOperation(idx, preserve);\n    this.recordIncrementalData(\"sameLineText\", idx);\n    for (const dep of deps) {\n      this.recordIncrementalData(\"sameLineText\", dep);\n    }\n    return this;\n  }\n\n  bboxToClipBoxDropOperation(idx, preserve = false) {\n    const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx;\n    this.#bboxTracker.bboxToClipBoxDropOperation(idx);\n    if (needsCleanup) {\n      this.#pendingDependencies.clear();\n    }\n    return this;\n  }\n\n  take() {\n    this.#fontBBoxTrustworthy.clear();\n    return this.#bboxTracker.take();\n  }\n\n  takeDebugMetadata() {\n    return this.#debugMetadata;\n  }\n}\n\n/**\n * Used to track dependencies of nested operations list, that\n * should actually all map to the index of the operation that\n * contains the nested list.\n *\n * @implements {CanvasDependencyTracker}\n */\nclass CanvasNestedDependencyTracker {\n  /** @type {CanvasDependencyTracker} */\n  #dependencyTracker;\n\n  /** @type {number} */\n  #opIdx;\n\n  #ignoreBBoxes;\n\n  #nestingLevel = 0;\n\n  #savesLevel = 0;\n\n  constructor(dependencyTracker, opIdx, ignoreBBoxes) {\n    if (\n      dependencyTracker instanceof CanvasNestedDependencyTracker &&\n      dependencyTracker.#ignoreBBoxes === !!ignoreBBoxes\n    ) {\n      // The goal of CanvasNestedDependencyTracker is to collapse all operations\n      // into a single one. If we are already in a\n      // CanvasNestedDependencyTracker, that is already happening.\n      return dependencyTracker;\n    }\n\n    this.#dependencyTracker = dependencyTracker;\n    this.#opIdx = opIdx;\n    this.#ignoreBBoxes = !!ignoreBBoxes;\n  }\n\n  get clipBox() {\n    return this.#dependencyTracker.clipBox;\n  }\n\n  growOperationsCount() {\n    throw new Error(\"Unreachable\");\n  }\n\n  save(opIdx) {\n    this.#savesLevel++;\n    this.#dependencyTracker.save(this.#opIdx);\n    return this;\n  }\n\n  restore(opIdx) {\n    if (this.#savesLevel > 0) {\n      this.#dependencyTracker.restore(this.#opIdx);\n      this.#savesLevel--;\n    }\n    return this;\n  }\n\n  recordOpenMarker(idx) {\n    this.#nestingLevel++;\n    return this;\n  }\n\n  getOpenMarker() {\n    return this.#nestingLevel > 0\n      ? this.#opIdx\n      : this.#dependencyTracker.getOpenMarker();\n  }\n\n  recordCloseMarker(idx) {\n    this.#nestingLevel--;\n    return this;\n  }\n\n  beginMarkedContent(opIdx) {\n    return this;\n  }\n\n  endMarkedContent(opIdx) {\n    return this;\n  }\n\n  pushBaseTransform(ctx) {\n    this.#dependencyTracker.pushBaseTransform(ctx);\n    return this;\n  }\n\n  popBaseTransform() {\n    this.#dependencyTracker.popBaseTransform();\n    return this;\n  }\n\n  /**\n   * @param {SimpleDependency} name\n   * @param {number} idx\n   */\n  recordSimpleData(name, idx) {\n    this.#dependencyTracker.recordSimpleData(name, this.#opIdx);\n    return this;\n  }\n\n  /**\n   * @param {IncrementalDependency} name\n   * @param {number} idx\n   */\n  recordIncrementalData(name, idx) {\n    this.#dependencyTracker.recordIncrementalData(name, this.#opIdx);\n    return this;\n  }\n\n  /**\n   * @param {IncrementalDependency} name\n   * @param {number} idx\n   */\n  resetIncrementalData(name, idx) {\n    this.#dependencyTracker.resetIncrementalData(name, this.#opIdx);\n    return this;\n  }\n\n  recordNamedData(name, idx) {\n    // Nested dependencies are not visible to the outside.\n    return this;\n  }\n\n  /**\n   * @param {SimpleDependency} name\n   * @param {string} depName\n   * @param {number} fallbackIdx\n   */\n  recordSimpleDataFromNamed(name, depName, fallbackIdx) {\n    this.#dependencyTracker.recordSimpleDataFromNamed(\n      name,\n      depName,\n      this.#opIdx\n    );\n    return this;\n  }\n\n  // All next operations, until the next .restore(), will depend on this\n  recordFutureForcedDependency(name, idx) {\n    this.#dependencyTracker.recordFutureForcedDependency(name, this.#opIdx);\n    return this;\n  }\n\n  // All next operations, until the next .restore(), will depend on all\n  // the already recorded data with the given names.\n  inheritSimpleDataAsFutureForcedDependencies(names) {\n    this.#dependencyTracker.inheritSimpleDataAsFutureForcedDependencies(names);\n    return this;\n  }\n\n  inheritPendingDependenciesAsFutureForcedDependencies() {\n    this.#dependencyTracker.inheritPendingDependenciesAsFutureForcedDependencies();\n    return this;\n  }\n\n  resetBBox(idx) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.resetBBox(this.#opIdx);\n    }\n    return this;\n  }\n\n  recordClipBox(idx, ctx, minX, maxX, minY, maxY) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.recordClipBox(\n        this.#opIdx,\n        ctx,\n        minX,\n        maxX,\n        minY,\n        maxY\n      );\n    }\n    return this;\n  }\n\n  recordBBox(idx, ctx, minX, maxX, minY, maxY) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.recordBBox(\n        this.#opIdx,\n        ctx,\n        minX,\n        maxX,\n        minY,\n        maxY\n      );\n    }\n    return this;\n  }\n\n  recordCharacterBBox(idx, ctx, font, scale, x, y, getMeasure) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.recordCharacterBBox(\n        this.#opIdx,\n        ctx,\n        font,\n        scale,\n        x,\n        y,\n        getMeasure\n      );\n    }\n    return this;\n  }\n\n  recordFullPageBBox(idx) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.recordFullPageBBox(this.#opIdx);\n    }\n    return this;\n  }\n\n  getSimpleIndex(dependencyName) {\n    return this.#dependencyTracker.getSimpleIndex(dependencyName);\n  }\n\n  recordDependencies(idx, dependencyNames) {\n    this.#dependencyTracker.recordDependencies(this.#opIdx, dependencyNames);\n    return this;\n  }\n\n  recordNamedDependency(idx, name) {\n    this.#dependencyTracker.recordNamedDependency(this.#opIdx, name);\n    return this;\n  }\n\n  /**\n   * @param {number} idx\n   * @param {SimpleDependency[]} dependencyNames\n   */\n  recordOperation(idx) {\n    this.#dependencyTracker.recordOperation(this.#opIdx, true);\n    return this;\n  }\n\n  recordShowTextOperation(idx) {\n    this.#dependencyTracker.recordShowTextOperation(this.#opIdx, true);\n    return this;\n  }\n\n  bboxToClipBoxDropOperation(idx) {\n    if (!this.#ignoreBBoxes) {\n      this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx, true);\n    }\n    return this;\n  }\n\n  take() {\n    throw new Error(\"Unreachable\");\n  }\n\n  takeDebugMetadata() {\n    throw new Error(\"Unreachable\");\n  }\n}\n\n/** @satisfies {Record<string, SimpleDependency | IncrementalDependency>} */\nconst Dependencies = {\n  stroke: [\n    \"path\",\n    \"transform\",\n    \"filter\",\n    \"strokeColor\",\n    \"strokeAlpha\",\n    \"lineWidth\",\n    \"lineCap\",\n    \"lineJoin\",\n    \"miterLimit\",\n    \"dash\",\n  ],\n  fill: [\n    \"path\",\n    \"transform\",\n    \"filter\",\n    \"fillColor\",\n    \"fillAlpha\",\n    \"globalCompositeOperation\",\n    \"SMask\",\n  ],\n  imageXObject: [\n    \"transform\",\n    \"SMask\",\n    \"filter\",\n    \"fillAlpha\",\n    \"strokeAlpha\",\n    \"globalCompositeOperation\",\n  ],\n  rawFillPath: [\"filter\", \"fillColor\", \"fillAlpha\"],\n  showText: [\n    \"transform\",\n    \"leading\",\n    \"charSpacing\",\n    \"wordSpacing\",\n    \"hScale\",\n    \"textRise\",\n    \"moveText\",\n    \"textMatrix\",\n    \"font\",\n    \"fontObj\",\n    \"filter\",\n    \"fillColor\",\n    \"textRenderingMode\",\n    \"SMask\",\n    \"fillAlpha\",\n    \"strokeAlpha\",\n    \"globalCompositeOperation\",\n\n    \"sameLineText\",\n  ],\n  transform: [\"transform\"],\n  transformAndFill: [\"transform\", \"fillColor\"],\n};\n\n/**\n * Track the locations of images in the canvas. For each image it computes\n * a bounding box as a potentially rotated rectangle, matching the rotation of\n * the current canvas transform.\n */\nclass CanvasImagesTracker {\n  #canvasWidth;\n\n  #canvasHeight;\n\n  #capacity = 4;\n\n  #count = 0;\n\n  // Array of [x1, y1, x2, y2, x3, y3] coordinates.\n  // We need three points to be able to represent a rectangle with a transform\n  // applied.\n  #coords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6);\n\n  static #CoordsArray =\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n    FeatureTest.isFloat16ArraySupported\n      ? Float16Array\n      : Float32Array;\n\n  constructor(canvas) {\n    this.#canvasWidth = canvas.width;\n    this.#canvasHeight = canvas.height;\n  }\n\n  record(ctx, width, height, clipBox) {\n    if (this.#count === this.#capacity) {\n      this.#capacity *= 2;\n      const newCoords = new CanvasImagesTracker.#CoordsArray(\n        this.#capacity * 6\n      );\n      newCoords.set(this.#coords);\n      this.#coords = newCoords;\n    }\n\n    const transform = getCurrentTransform(ctx);\n\n    // We want top left, bottom left, top right.\n    // (0, 0) is the bottom left corner.\n    let coords;\n\n    if (clipBox[0] !== Infinity) {\n      const bbox = BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox([0, -height, width, 0], transform, bbox);\n\n      const finalBBox = Util.intersect(clipBox, bbox);\n      if (!finalBBox) {\n        // The image is fully clipped out.\n        return;\n      }\n\n      const [minX, minY, maxX, maxY] = finalBBox;\n\n      if (\n        minX !== bbox[0] ||\n        minY !== bbox[1] ||\n        maxX !== bbox[2] ||\n        maxY !== bbox[3]\n      ) {\n        // The clip box affects the image drawing. We need to compute a\n        // transform that takes the image bbox and fits it into the final bbox,\n        // so that we can then apply it to the original image shape (the\n        // non-axially-aligned rectangle).\n        const rotationAngle = Math.atan2(transform[1], transform[0]);\n\n        // Normalize the angle to be between 0 and 90 degrees.\n        const sin = Math.abs(Math.sin(rotationAngle));\n        const cos = Math.abs(Math.cos(rotationAngle));\n\n        if (\n          sin < 1e-6 ||\n          cos < 1e-6 ||\n          // The logic in the `else` case gives more accurate bounding boxes for\n          // rotated images, but the equation it uses does not give a result\n          // when the rotation is exactly 45 degrees, because there are infinite\n          // possible rectangles that can fit into the same bbox with that same\n          // 45deg rotation. Fallback to returning the whole bbox.\n          Math.abs(sin - cos) < 1e-6\n        ) {\n          coords = [minX, minY, minX, maxY, maxX, minY];\n        } else {\n          // We cannot just scale the bbox into the original bbox, because that\n          // would not preserve the 90deg corners if they have been rotated.\n          // We instead need to find the transform that maps the original\n          // rectangle into the only rectangle that is rotated by the expected\n          // angle and fits into the final bbox.\n          //\n          // This represents the final bbox, with the top-left corner having\n          // coordinates (minX, minY) and the bottom-right corner having\n          // coordinates (maxX, maxY). Alpha is the rotation angle, and a and b\n          // are helper variables used to compute the effective transform.\n          //\n          //               ------------b----------\n          //              +-----------------------*----+\n          //            | |                _ -鈥�    \\   |\n          //            a |           _ -鈥�          \\  |\n          //            | |alpha _ -鈥�                \\ |\n          //            | | _ -鈥�                      \\|\n          //              |\\                       _ -鈥緗\n          //              | \\                 _ -鈥�     |\n          //              |  \\           _ -鈥�          |\n          //              |   \\     _ -鈥�               |\n          //              +----*-----------------------+\n\n          const finalBBoxWidth = maxX - minX;\n          const finalBBoxHeight = maxY - minY;\n\n          const sin2 = sin * sin;\n          const cos2 = cos * cos;\n          const cosSin = cos * sin;\n          const denom = cos2 - sin2;\n\n          const a = (finalBBoxHeight * cos2 - finalBBoxWidth * cosSin) / denom;\n          const b = (finalBBoxHeight * cosSin - finalBBoxWidth * sin2) / denom;\n\n          coords = [minX + b, minY, minX, minY + a, maxX, maxY - a];\n        }\n      }\n    }\n\n    if (!coords) {\n      coords = [0, -height, 0, 0, width, -height];\n      Util.applyTransform(coords, transform, 0);\n      Util.applyTransform(coords, transform, 2);\n      Util.applyTransform(coords, transform, 4);\n    }\n    coords[0] /= this.#canvasWidth;\n    coords[1] /= this.#canvasHeight;\n    coords[2] /= this.#canvasWidth;\n    coords[3] /= this.#canvasHeight;\n    coords[4] /= this.#canvasWidth;\n    coords[5] /= this.#canvasHeight;\n    this.#coords.set(coords, this.#count * 6);\n    this.#count++;\n  }\n\n  take() {\n    return this.#coords.subarray(0, this.#count * 6);\n  }\n}\n\nexport {\n  CanvasBBoxTracker,\n  CanvasDependencyTracker,\n  CanvasImagesTracker,\n  CanvasNestedDependencyTracker,\n  Dependencies,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  FeatureTest,\n  isNodeJS,\n  shadow,\n  unreachable,\n  warn,\n} from \"../shared/util.js\";\nimport { makePathFromDrawOPS } from \"./display_utils.js\";\n\nclass FontLoader {\n  #systemFonts = new Set();\n\n  #styleSheet = null;\n\n  constructor({\n    ownerDocument = globalThis.document,\n    styleElement = null, // For testing only.\n  }) {\n    this._document = ownerDocument;\n\n    this.nativeFontFaces = new Set();\n    this.styleElement =\n      typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n        ? styleElement\n        : null;\n\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      this.loadingRequests = [];\n      this.loadTestFontId = 0;\n    }\n  }\n\n  addNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.add(nativeFontFace);\n    this._document.fonts.add(nativeFontFace);\n  }\n\n  removeNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.delete(nativeFontFace);\n    this._document.fonts.delete(nativeFontFace);\n  }\n\n  insertRule(rule) {\n    const styleSheet = this.#getStyleSheet();\n    styleSheet.insertRule(rule, styleSheet.cssRules.length);\n  }\n\n  #getStyleSheet() {\n    if (this.#styleSheet) {\n      return this.#styleSheet;\n    }\n\n    // Constructable stylesheets aren't blocked by CSP inline-style checks.\n    // Use the constructor from the document's own window, since\n    // `this._document` may belong to a different window (e.g. a print iframe)\n    // and a constructable stylesheet can only be adopted by the document it was\n    // created for.\n    const StyleSheet =\n      this._document.defaultView?.CSSStyleSheet || globalThis.CSSStyleSheet;\n    if (!this.styleElement && StyleSheet) {\n      const { adoptedStyleSheets } = this._document;\n      if (adoptedStyleSheets) {\n        const styleSheet = new StyleSheet();\n        adoptedStyleSheets.push(styleSheet);\n        return (this.#styleSheet = styleSheet);\n      }\n    }\n\n    if (!this.styleElement) {\n      this.styleElement = this._document.createElement(\"style\");\n      this._document.documentElement\n        .getElementsByTagName(\"head\")[0]\n        .append(this.styleElement);\n    }\n    return (this.#styleSheet = this.styleElement.sheet);\n  }\n\n  clear() {\n    for (const nativeFontFace of this.nativeFontFaces) {\n      this._document.fonts.delete(nativeFontFace);\n    }\n    this.nativeFontFaces.clear();\n    this.#systemFonts.clear();\n\n    if (this.#styleSheet) {\n      const { adoptedStyleSheets } = this._document;\n      if (adoptedStyleSheets?.includes(this.#styleSheet)) {\n        this._document.adoptedStyleSheets = adoptedStyleSheets.filter(\n          styleSheet => styleSheet !== this.#styleSheet\n        );\n      }\n      this.#styleSheet = null;\n    }\n\n    if (this.styleElement) {\n      // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n      this.styleElement.remove();\n      this.styleElement = null;\n    }\n  }\n\n  async loadSystemFont({\n    systemFontInfo: info,\n    disableFontFace,\n    _inspectFont,\n  }) {\n    if (!info || this.#systemFonts.has(info.loadedName)) {\n      return;\n    }\n    assert(\n      !disableFontFace,\n      \"loadSystemFont shouldn't be called when `disableFontFace` is set.\"\n    );\n\n    if (this.isFontLoadingAPISupported) {\n      const { loadedName, src, style } = info;\n      const fontFace = new FontFace(loadedName, src, style);\n      this.addNativeFontFace(fontFace);\n      try {\n        await fontFace.load();\n        this.#systemFonts.add(loadedName);\n        _inspectFont?.(info);\n      } catch {\n        warn(\n          `Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`\n        );\n\n        this.removeNativeFontFace(fontFace);\n      }\n      return;\n    }\n\n    unreachable(\n      \"Not implemented: loadSystemFont without the Font Loading API.\"\n    );\n  }\n\n  async bind(font) {\n    // Add the font to the DOM only once; skip if the font is already loaded.\n    if (font.attached || (font.missingFile && !font.systemFontInfo)) {\n      return;\n    }\n    font.attached = true;\n\n    if (font.systemFontInfo) {\n      await this.loadSystemFont(font);\n      return;\n    }\n\n    if (this.isFontLoadingAPISupported) {\n      const nativeFontFace = font.createNativeFontFace();\n      if (nativeFontFace) {\n        this.addNativeFontFace(nativeFontFace);\n        try {\n          await nativeFontFace.loaded;\n        } catch (ex) {\n          warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);\n\n          // When font loading failed, fall back to the built-in font renderer.\n          font.disableFontFace = true;\n          throw ex;\n        }\n      }\n      return; // The font was, asynchronously, loaded.\n    }\n\n    // !this.isFontLoadingAPISupported\n    const rule = font.createFontFaceRule();\n    if (rule) {\n      this.insertRule(rule);\n\n      if (this.isSyncFontLoadingSupported) {\n        return; // The font was, synchronously, loaded.\n      }\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n        throw new Error(\"Not implemented: async font loading\");\n      }\n      await new Promise(resolve => {\n        const request = this._queueLoadingCallback(resolve);\n        this._prepareFontLoadEvent(font, request);\n      });\n      // The font was, asynchronously, loaded.\n    }\n  }\n\n  get isFontLoadingAPISupported() {\n    const hasFonts = !!this._document?.fonts;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      return shadow(\n        this,\n        \"isFontLoadingAPISupported\",\n        hasFonts && !this.styleElement\n      );\n    }\n    return shadow(this, \"isFontLoadingAPISupported\", hasFonts);\n  }\n\n  get isSyncFontLoadingSupported() {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      return shadow(this, \"isSyncFontLoadingSupported\", true);\n    }\n\n    // Node.js - we can pretend that sync font loading is supported.\n    // Firefox, from version 14, supports synchronous font loading.\n    return shadow(\n      this,\n      \"isSyncFontLoadingSupported\",\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\")) &&\n        (isNodeJS || FeatureTest.platform.isFirefox)\n    );\n  }\n\n  _queueLoadingCallback(callback) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: _queueLoadingCallback\");\n    }\n\n    function completeRequest() {\n      assert(!request.done, \"completeRequest() cannot be called twice.\");\n      request.done = true;\n\n      // Sending all completed requests in order of how they were queued.\n      while (loadingRequests.length > 0 && loadingRequests[0].done) {\n        const otherRequest = loadingRequests.shift();\n        setTimeout(otherRequest.callback, 0);\n      }\n    }\n\n    const { loadingRequests } = this;\n    const request = {\n      done: false,\n      complete: completeRequest,\n      callback,\n    };\n    loadingRequests.push(request);\n    return request;\n  }\n\n  get _loadTestFont() {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: _loadTestFont\");\n    }\n\n    // This is a CFF font with 1 glyph for '.' that fills its entire width\n    // and height.\n    const testFont = atob(\n      \"T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA\" +\n        \"FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA\" +\n        \"ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA\" +\n        \"AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1\" +\n        \"AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD\" +\n        \"6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM\" +\n        \"AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D\" +\n        \"IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA\" +\n        \"AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA\" +\n        \"AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB\" +\n        \"AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY\" +\n        \"AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA\" +\n        \"AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n        \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA\" +\n        \"AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC\" +\n        \"AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3\" +\n        \"Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj\" +\n        \"FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==\"\n    );\n    return shadow(this, \"_loadTestFont\", testFont);\n  }\n\n  _prepareFontLoadEvent(font, request) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: _prepareFontLoadEvent\");\n    }\n\n    /** Hack begin */\n    // There's currently no event when a font has finished downloading so the\n    // following code is a dirty hack to 'guess' when a font is ready.\n    // It's assumed fonts are loaded in order, so add a known test font after\n    // the desired fonts and then test for the loading of that test font.\n\n    function int32(data, offset) {\n      return (\n        (data.charCodeAt(offset) << 24) |\n        (data.charCodeAt(offset + 1) << 16) |\n        (data.charCodeAt(offset + 2) << 8) |\n        (data.charCodeAt(offset + 3) & 0xff)\n      );\n    }\n    function string32(value) {\n      return String.fromCharCode(\n        (value >> 24) & 0xff,\n        (value >> 16) & 0xff,\n        (value >> 8) & 0xff,\n        value & 0xff\n      );\n    }\n    function spliceString(s, offset, remove, insert) {\n      const chunk1 = s.substring(0, offset);\n      const chunk2 = s.substring(offset + remove);\n      return chunk1 + insert + chunk2;\n    }\n    let i, ii;\n\n    // The temporary canvas is used to determine if fonts are loaded.\n    const canvas = this._document.createElement(\"canvas\");\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext(\"2d\");\n\n    let called = 0;\n    function isFontReady(name, callback) {\n      // With setTimeout clamping this gives the font ~100ms to load.\n      if (++called > 30) {\n        warn(\"Load test font never loaded.\");\n        callback();\n        return;\n      }\n      ctx.font = \"30px \" + name;\n      ctx.fillText(\".\", 0, 20);\n      const imageData = ctx.getImageData(0, 0, 1, 1);\n      if (imageData.data[3] > 0) {\n        callback();\n        return;\n      }\n      setTimeout(isFontReady.bind(null, name, callback));\n    }\n\n    const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n    // Chromium seems to cache fonts based on a hash of the actual font data,\n    // so the font must be modified for each load test else it will appear to\n    // be loaded already.\n    // TODO: This could maybe be made faster by avoiding the btoa of the full\n    // font by splitting it in chunks before hand and padding the font id.\n    let data = this._loadTestFont;\n    const COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)\n    data = spliceString(\n      data,\n      COMMENT_OFFSET,\n      loadTestFontId.length,\n      loadTestFontId\n    );\n    // CFF checksum is important for IE, adjusting it\n    const CFF_CHECKSUM_OFFSET = 16;\n    const XXXX_VALUE = 0x58585858; // the \"comment\" filled with 'X'\n    let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n    for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n      checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;\n    }\n    if (i < loadTestFontId.length) {\n      // align to 4 bytes boundary\n      checksum = (checksum - XXXX_VALUE + int32(loadTestFontId + \"XXX\", i)) | 0;\n    }\n    data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));\n\n    const url = `url(data:font/opentype;base64,${btoa(data)});`;\n    const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n    this.insertRule(rule);\n\n    const div = this._document.createElement(\"div\");\n    div.style.visibility = \"hidden\";\n    div.style.width = div.style.height = \"10px\";\n    div.style.position = \"absolute\";\n    div.style.top = div.style.left = \"0px\";\n\n    for (const name of [font.loadedName, loadTestFontId]) {\n      const span = this._document.createElement(\"span\");\n      span.textContent = \"Hi\";\n      span.style.fontFamily = name;\n      div.append(span);\n    }\n    this._document.body.append(div);\n\n    isFontReady(loadTestFontId, () => {\n      div.remove();\n      request.complete();\n    });\n    /** Hack end */\n  }\n}\n\nclass FontFaceObject {\n  compiledGlyphs = Object.create(null);\n\n  #fontData;\n\n  constructor(translatedData, inspectFont = null, charProcOperatorList, extra) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        typeof translatedData.disableFontFace === \"boolean\",\n        \"disableFontFace must be available.\"\n      );\n      assert(\n        typeof translatedData.fontExtraProperties === \"boolean\",\n        \"fontExtraProperties must be available.\"\n      );\n    }\n    this.#fontData = translatedData;\n    this._inspectFont = inspectFont;\n\n    if (charProcOperatorList) {\n      this.charProcOperatorList = charProcOperatorList;\n    }\n    if (extra) {\n      Object.assign(this, extra);\n    }\n  }\n\n  createNativeFontFace() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n    let nativeFontFace;\n    if (!this.cssFontInfo) {\n      nativeFontFace = new FontFace(this.loadedName, this.data, {});\n    } else {\n      const css = {\n        weight: this.cssFontInfo.fontWeight,\n      };\n      if (this.cssFontInfo.italicAngle) {\n        css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;\n      }\n      nativeFontFace = new FontFace(\n        this.cssFontInfo.fontFamily,\n        this.data,\n        css\n      );\n    }\n\n    this._inspectFont?.(this);\n    return nativeFontFace;\n  }\n\n  createFontFaceRule() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n    // Add the @font-face rule to the document.\n    const url = `url(data:${this.mimetype};base64,${this.data.toBase64()});`;\n    let rule;\n    if (!this.cssFontInfo) {\n      rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n    } else {\n      let css = `font-weight: ${this.cssFontInfo.fontWeight};`;\n      if (this.cssFontInfo.italicAngle) {\n        css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;\n      }\n      rule = `@font-face {font-family:\"${this.cssFontInfo.fontFamily}\";${css}src:${url}}`;\n    }\n\n    this._inspectFont?.(this, url);\n    return rule;\n  }\n\n  getPathGenerator(objs, character) {\n    if (this.compiledGlyphs[character] !== undefined) {\n      return this.compiledGlyphs[character];\n    }\n\n    const objId = this.loadedName + \"_path_\" + character;\n    let cmds;\n    try {\n      cmds = objs.get(objId);\n    } catch (ex) {\n      warn(`getPathGenerator - ignoring character: \"${ex}\".`);\n    }\n    const path = makePathFromDrawOPS(cmds?.path);\n\n    if (!this.fontExtraProperties) {\n      // Remove the raw path-string, since we don't need it anymore.\n      objs.delete(objId);\n    }\n    return (this.compiledGlyphs[character] = path);\n  }\n\n  get black() {\n    return this.#fontData.black;\n  }\n\n  get bold() {\n    return this.#fontData.bold;\n  }\n\n  get disableFontFace() {\n    return this.#fontData.disableFontFace;\n  }\n\n  set disableFontFace(value) {\n    shadow(this, \"disableFontFace\", !!value);\n  }\n\n  get fontExtraProperties() {\n    return this.#fontData.fontExtraProperties;\n  }\n\n  get isInvalidPDFjsFont() {\n    return this.#fontData.isInvalidPDFjsFont;\n  }\n\n  get isType3Font() {\n    return this.#fontData.isType3Font;\n  }\n\n  get italic() {\n    return this.#fontData.italic;\n  }\n\n  get missingFile() {\n    return this.#fontData.missingFile;\n  }\n\n  get remeasure() {\n    return this.#fontData.remeasure;\n  }\n\n  get vertical() {\n    return this.#fontData.vertical;\n  }\n\n  get ascent() {\n    return this.#fontData.ascent;\n  }\n\n  get defaultWidth() {\n    return this.#fontData.defaultWidth;\n  }\n\n  get descent() {\n    return this.#fontData.descent;\n  }\n\n  get bbox() {\n    return this.#fontData.bbox;\n  }\n\n  get fontMatrix() {\n    return this.#fontData.fontMatrix;\n  }\n\n  get fallbackName() {\n    return this.#fontData.fallbackName;\n  }\n\n  get loadedName() {\n    return this.#fontData.loadedName;\n  }\n\n  get mimetype() {\n    return this.#fontData.mimetype;\n  }\n\n  get name() {\n    return this.#fontData.name;\n  }\n\n  get data() {\n    return this.#fontData.data;\n  }\n\n  clearData() {\n    this.#fontData.clearData();\n  }\n\n  get cssFontInfo() {\n    return this.#fontData.cssFontInfo;\n  }\n\n  get systemFontInfo() {\n    return this.#fontData.systemFontInfo;\n  }\n\n  get defaultVMetrics() {\n    return this.#fontData.defaultVMetrics;\n  }\n}\n\nexport { FontFaceObject, FontLoader };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass CSS_FONT_INFO {\n  static strings = [\"fontFamily\", \"fontWeight\", \"italicAngle\"];\n}\n\nclass SYSTEM_FONT_INFO {\n  static strings = [\"css\", \"loadedName\", \"baseFontName\", \"src\"];\n}\n\nclass FONT_INFO {\n  static bools = [\n    \"black\",\n    \"bold\",\n    \"disableFontFace\",\n    \"fontExtraProperties\",\n    \"isInvalidPDFjsFont\",\n    \"isType3Font\",\n    \"italic\",\n    \"missingFile\",\n    \"remeasure\",\n    \"vertical\",\n  ];\n\n  static numbers = [\"ascent\", \"defaultWidth\", \"descent\"];\n\n  static strings = [\"fallbackName\", \"loadedName\", \"mimetype\", \"name\"];\n\n  static OFFSET_NUMBERS = Math.ceil((this.bools.length * 2) / 8);\n\n  static OFFSET_BBOX = this.OFFSET_NUMBERS + this.numbers.length * 8;\n\n  static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4;\n\n  static OFFSET_DEFAULT_VMETRICS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6;\n\n  static OFFSET_STRINGS = this.OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3;\n}\n\nclass PATTERN_INFO {\n  static KIND = 0; // 1=axial, 2=radial, 3=mesh\n\n  static HAS_BBOX = 1; // 0/1\n\n  static HAS_BACKGROUND = 2; // 0/1 (background for mesh patterns)\n\n  static SHADING_TYPE = 3; // shadingType (only for mesh patterns)\n\n  static N_COORD = 4; // number of coordinate pairs\n\n  static N_COLOR = 8; // number of RGBA-stride color entries\n\n  static N_STOP = 12; // number of gradient stops\n\n  static N_FIGURES = 16; // number of figures\n}\n\nexport { CSS_FONT_INFO, FONT_INFO, PATTERN_INFO, SYSTEM_FONT_INFO };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, BBOX_INIT, FeatureTest, Util } from \"../shared/util.js\";\nimport {\n  CSS_FONT_INFO,\n  FONT_INFO,\n  PATTERN_INFO,\n  SYSTEM_FONT_INFO,\n} from \"../shared/obj_bin_transform_utils.js\";\n\nclass CssFontInfo {\n  #buffer;\n\n  #decoder = new TextDecoder();\n\n  #view;\n\n  constructor(buffer) {\n    this.#buffer = buffer;\n    this.#view = new DataView(buffer);\n  }\n\n  #readString(index) {\n    assert(index < CSS_FONT_INFO.strings.length, \"Invalid string index\");\n    let offset = 0;\n    for (let i = 0; i < index; i++) {\n      offset += this.#view.getUint32(offset) + 4;\n    }\n    const length = this.#view.getUint32(offset);\n    return this.#decoder.decode(\n      new Uint8Array(this.#buffer, offset + 4, length)\n    );\n  }\n\n  get fontFamily() {\n    return this.#readString(0);\n  }\n\n  get fontWeight() {\n    return this.#readString(1);\n  }\n\n  get italicAngle() {\n    return this.#readString(2);\n  }\n}\n\nclass SystemFontInfo {\n  #buffer;\n\n  #decoder = new TextDecoder();\n\n  #view;\n\n  constructor(buffer) {\n    this.#buffer = buffer;\n    this.#view = new DataView(buffer);\n  }\n\n  get guessFallback() {\n    return this.#view.getUint8(0) !== 0;\n  }\n\n  #readString(index) {\n    assert(index < SYSTEM_FONT_INFO.strings.length, \"Invalid string index\");\n    let offset = 5;\n    for (let i = 0; i < index; i++) {\n      offset += this.#view.getUint32(offset) + 4;\n    }\n    const length = this.#view.getUint32(offset);\n    return this.#decoder.decode(\n      new Uint8Array(this.#buffer, offset + 4, length)\n    );\n  }\n\n  get css() {\n    return this.#readString(0);\n  }\n\n  get loadedName() {\n    return this.#readString(1);\n  }\n\n  get baseFontName() {\n    return this.#readString(2);\n  }\n\n  get src() {\n    return this.#readString(3);\n  }\n\n  get style() {\n    let offset = 1;\n    offset += 4 + this.#view.getUint32(offset);\n    const styleLength = this.#view.getUint32(offset);\n    const style = this.#decoder.decode(\n      new Uint8Array(this.#buffer, offset + 4, styleLength)\n    );\n    offset += 4 + styleLength;\n    const weightLength = this.#view.getUint32(offset);\n    const weight = this.#decoder.decode(\n      new Uint8Array(this.#buffer, offset + 4, weightLength)\n    );\n    return { style, weight };\n  }\n}\n\nclass FontInfo {\n  #buffer;\n\n  #decoder = new TextDecoder();\n\n  #view;\n\n  constructor({ buffer, extra }) {\n    this.#buffer = buffer;\n    this.#view = new DataView(buffer);\n    if (extra) {\n      Object.assign(this, extra);\n    }\n  }\n\n  #readBoolean(index) {\n    assert(index < FONT_INFO.bools.length, \"Invalid boolean index\");\n    const byteOffset = Math.floor(index / 4);\n    const bitOffset = (index * 2) % 8;\n    const value = (this.#view.getUint8(byteOffset) >> bitOffset) & 0x03;\n    return value === 0x00 ? undefined : value === 0x02;\n  }\n\n  get black() {\n    return this.#readBoolean(0);\n  }\n\n  get bold() {\n    return this.#readBoolean(1);\n  }\n\n  get disableFontFace() {\n    return this.#readBoolean(2);\n  }\n\n  get fontExtraProperties() {\n    return this.#readBoolean(3);\n  }\n\n  get isInvalidPDFjsFont() {\n    return this.#readBoolean(4);\n  }\n\n  get isType3Font() {\n    return this.#readBoolean(5);\n  }\n\n  get italic() {\n    return this.#readBoolean(6);\n  }\n\n  get missingFile() {\n    return this.#readBoolean(7);\n  }\n\n  get remeasure() {\n    return this.#readBoolean(8);\n  }\n\n  get vertical() {\n    return this.#readBoolean(9);\n  }\n\n  #readNumber(index) {\n    assert(index < FONT_INFO.numbers.length, \"Invalid number index\");\n    return this.#view.getFloat64(FONT_INFO.OFFSET_NUMBERS + index * 8);\n  }\n\n  get ascent() {\n    return this.#readNumber(0);\n  }\n\n  get defaultWidth() {\n    return this.#readNumber(1);\n  }\n\n  get descent() {\n    return this.#readNumber(2);\n  }\n\n  #readArray(offset, arrLen, lookupName, increment) {\n    const len = this.#view.getUint8(offset);\n    if (len === 0) {\n      return undefined;\n    }\n    assert(len === arrLen, \"Invalid array length.\");\n    offset += 1;\n    const arr = new Array(len);\n    for (let i = 0; i < len; i++) {\n      arr[i] = this.#view[lookupName](offset, true);\n      offset += increment;\n    }\n    return arr;\n  }\n\n  get bbox() {\n    return this.#readArray(\n      /* offset = */ FONT_INFO.OFFSET_BBOX,\n      /* arrLen = */ 4,\n      /* lookup = */ \"getInt16\",\n      /* increment = */ 2\n    );\n  }\n\n  get fontMatrix() {\n    return this.#readArray(\n      /* offset = */ FONT_INFO.OFFSET_FONT_MATRIX,\n      /* arrLen = */ 6,\n      /* lookup = */ \"getFloat64\",\n      /* increment = */ 8\n    );\n  }\n\n  get defaultVMetrics() {\n    return this.#readArray(\n      /* offset = */ FONT_INFO.OFFSET_DEFAULT_VMETRICS,\n      /* arrLen = */ 3,\n      /* lookup = */ \"getInt16\",\n      /* increment = */ 2\n    );\n  }\n\n  #readString(index) {\n    assert(index < FONT_INFO.strings.length, \"Invalid string index\");\n    let offset = FONT_INFO.OFFSET_STRINGS + 4;\n    for (let i = 0; i < index; i++) {\n      offset += this.#view.getUint32(offset) + 4;\n    }\n    const length = this.#view.getUint32(offset);\n    return this.#decoder.decode(\n      new Uint8Array(this.#buffer, offset + 4, length)\n    );\n  }\n\n  get fallbackName() {\n    return this.#readString(0);\n  }\n\n  get loadedName() {\n    return this.#readString(1);\n  }\n\n  get mimetype() {\n    return this.#readString(2);\n  }\n\n  get name() {\n    return this.#readString(3);\n  }\n\n  #getDataOffsets() {\n    let offset = FONT_INFO.OFFSET_STRINGS;\n    const stringsLength = this.#view.getUint32(offset);\n    offset += 4 + stringsLength;\n    const systemFontInfoLength = this.#view.getUint32(offset);\n    offset += 4 + systemFontInfoLength;\n    const cssFontInfoLength = this.#view.getUint32(offset);\n    offset += 4 + cssFontInfoLength;\n    const length = this.#view.getUint32(offset);\n\n    return { offset, length };\n  }\n\n  get data() {\n    const { offset, length } = this.#getDataOffsets();\n    return length === 0\n      ? undefined\n      : new Uint8Array(this.#buffer, offset + 4, length);\n  }\n\n  clearData() {\n    const { offset, length } = this.#getDataOffsets();\n    if (length === 0) {\n      return; // The data is either not present, or it was previously cleared.\n    }\n    this.#view.setUint32(offset, 0); // Zero the data-length.\n\n    // Replace the buffer/view with only its contents *before* the data-block.\n    this.#buffer = new Uint8Array(this.#buffer, 0, offset + 4).slice().buffer;\n    this.#view = new DataView(this.#buffer);\n  }\n\n  get cssFontInfo() {\n    let offset = FONT_INFO.OFFSET_STRINGS;\n    const stringsLength = this.#view.getUint32(offset);\n    offset += 4 + stringsLength;\n    const systemFontInfoLength = this.#view.getUint32(offset);\n    offset += 4 + systemFontInfoLength;\n    const cssFontInfoLength = this.#view.getUint32(offset);\n    if (cssFontInfoLength === 0) {\n      return null;\n    }\n    const cssFontInfoData = new Uint8Array(cssFontInfoLength);\n    cssFontInfoData.set(\n      new Uint8Array(this.#buffer, offset + 4, cssFontInfoLength)\n    );\n    return new CssFontInfo(cssFontInfoData.buffer);\n  }\n\n  get systemFontInfo() {\n    let offset = FONT_INFO.OFFSET_STRINGS;\n    const stringsLength = this.#view.getUint32(offset);\n    offset += 4 + stringsLength;\n    const systemFontInfoLength = this.#view.getUint32(offset);\n    if (systemFontInfoLength === 0) {\n      return null;\n    }\n    const systemFontInfoData = new Uint8Array(systemFontInfoLength);\n    systemFontInfoData.set(\n      new Uint8Array(this.#buffer, offset + 4, systemFontInfoLength)\n    );\n    return new SystemFontInfo(systemFontInfoData.buffer);\n  }\n}\n\nclass PatternInfo {\n  constructor(buffer) {\n    this.buffer = buffer;\n    this.view = new DataView(buffer);\n    this.data = new Uint8Array(buffer);\n  }\n\n  getIR() {\n    const dataView = this.view;\n    const kind = this.data[PATTERN_INFO.KIND];\n    const hasBBox = !!this.data[PATTERN_INFO.HAS_BBOX];\n    const hasBackground = !!this.data[PATTERN_INFO.HAS_BACKGROUND];\n    const nCoord = dataView.getUint32(PATTERN_INFO.N_COORD, true);\n    const nColor = dataView.getUint32(PATTERN_INFO.N_COLOR, true);\n    const nStop = dataView.getUint32(PATTERN_INFO.N_STOP, true);\n\n    let offset = 20;\n    const coords = new Float32Array(this.buffer, offset, nCoord * 2);\n    offset += nCoord * 8;\n    const colors = new Uint8Array(this.buffer, offset, nColor * 4);\n    offset += nColor * 4;\n    const stops = [];\n    for (let i = 0; i < nStop; ++i) {\n      const p = dataView.getFloat32(offset, true);\n      offset += 4;\n      const rgb = dataView.getUint32(offset, true);\n      offset += 4;\n      stops.push([p, `#${rgb.toString(16).padStart(6, \"0\")}`]);\n    }\n    let bbox = null;\n    if (hasBBox) {\n      bbox = [];\n      for (let i = 0; i < 4; ++i) {\n        bbox.push(dataView.getFloat32(offset, true));\n        offset += 4;\n      }\n    }\n\n    let background = null;\n    if (hasBackground) {\n      background = new Uint8Array(this.buffer, offset, 3);\n      offset += 3;\n    }\n\n    if (kind === 1) {\n      // axial\n      return [\n        \"RadialAxial\",\n        \"axial\",\n        bbox,\n        stops,\n        Array.from(coords.slice(0, 2)),\n        Array.from(coords.slice(2, 4)),\n        null,\n        null,\n      ];\n    }\n    if (kind === 2) {\n      return [\n        \"RadialAxial\",\n        \"radial\",\n        bbox,\n        stops,\n        [coords[0], coords[1]],\n        [coords[3], coords[4]],\n        coords[2],\n        coords[5],\n      ];\n    }\n    if (kind === 3) {\n      const shadingType = this.data[PATTERN_INFO.SHADING_TYPE];\n      let bounds = null;\n      if (coords.length > 0) {\n        bounds = BBOX_INIT.slice();\n\n        for (let i = 0, ii = coords.length; i < ii; i += 2) {\n          Util.pointBoundingBox(coords[i], coords[i + 1], bounds);\n        }\n      }\n      return [\n        \"Mesh\",\n        shadingType,\n        coords,\n        colors,\n        nCoord,\n        bounds,\n        bbox,\n        background,\n      ];\n    }\n    throw new Error(`Unsupported pattern kind: ${kind}`);\n  }\n}\n\nclass FontPathInfo {\n  #buffer;\n\n  constructor(buffer) {\n    this.#buffer = buffer;\n  }\n\n  get path() {\n    if (\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n      FeatureTest.isFloat16ArraySupported\n    ) {\n      return new Float16Array(this.#buffer);\n    }\n    return new Float32Array(this.#buffer);\n  }\n}\n\nexport { CssFontInfo, FontInfo, FontPathInfo, PatternInfo, SystemFontInfo };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  _isValidExplicitDest,\n  isNodeJS,\n  stringToBytes,\n  warn,\n} from \"../shared/util.js\";\n\nfunction getUrlProp(val) {\n  if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n    return null; // The 'url' is unused with `PDFDataRangeTransport`.\n  }\n  if (val instanceof URL) {\n    return val;\n  }\n  if (typeof val === \"string\") {\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"GENERIC\") &&\n      isNodeJS\n    ) {\n      if (/^[a-z][a-z0-9\\-+.]+:/i.test(val)) {\n        return new URL(val);\n      }\n      // eslint-disable-next-line no-undef\n      const url = process.getBuiltinModule(\"url\");\n      return new URL(url.pathToFileURL(val));\n    }\n\n    // The full path is required in the 'url' field.\n    const url = URL.parse(val, window.location);\n    if (url) {\n      return url;\n    }\n  }\n  throw new Error(\n    \"Invalid PDF url data: \" +\n      \"either string or URL-object is expected in the url property.\"\n  );\n}\n\nfunction getDataProp(val) {\n  // Converting string or array-like data to Uint8Array.\n  if (\n    typeof PDFJSDev !== \"undefined\" &&\n    PDFJSDev.test(\"GENERIC\") &&\n    isNodeJS &&\n    typeof Buffer !== \"undefined\" && // eslint-disable-line no-undef\n    val instanceof Buffer // eslint-disable-line no-undef\n  ) {\n    throw new Error(\n      \"Please provide binary data as `Uint8Array`, rather than `Buffer`.\"\n    );\n  }\n  if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {\n    // Use the data as-is when it's already a Uint8Array that completely\n    // \"utilizes\" its underlying ArrayBuffer, to prevent any possible\n    // issues when transferring it to the worker-thread.\n    return val;\n  }\n  if (typeof val === \"string\") {\n    return stringToBytes(val);\n  }\n  if (\n    val instanceof ArrayBuffer ||\n    ArrayBuffer.isView(val) ||\n    (typeof val === \"object\" && !isNaN(val?.length))\n  ) {\n    return new Uint8Array(val);\n  }\n  throw new Error(\n    \"Invalid PDF binary data: either TypedArray, \" +\n      \"string, or array-like object is expected in the data property.\"\n  );\n}\n\nfunction getFactoryUrlProp(val) {\n  if (typeof val !== \"string\") {\n    return null;\n  }\n  if (val.endsWith(\"/\")) {\n    return val;\n  }\n  throw new Error(`Invalid factory url: \"${val}\" must include trailing slash.`);\n}\n\nconst isRefProxy = v =>\n  typeof v === \"object\" &&\n  Number.isInteger(v?.num) &&\n  v.num >= 0 &&\n  Number.isInteger(v?.gen) &&\n  v.gen >= 0;\n\nconst isNameProxy = v => typeof v === \"object\" && typeof v?.name === \"string\";\n\nconst isValidExplicitDest = _isValidExplicitDest.bind(\n  null,\n  /* validRef = */ isRefProxy,\n  /* validName = */ isNameProxy\n);\n\nclass LoopbackPort {\n  #listeners = new Map();\n\n  #deferred = Promise.resolve();\n\n  postMessage(obj, transfer) {\n    const event = {\n      data: structuredClone(obj, transfer ? { transfer } : null),\n    };\n\n    this.#deferred.then(() => {\n      for (const [listener] of this.#listeners) {\n        listener.call(this, event);\n      }\n    });\n  }\n\n  addEventListener(name, listener, options = null) {\n    let rmAbort = null;\n    if (options?.signal instanceof AbortSignal) {\n      const { signal } = options;\n      if (signal.aborted) {\n        warn(\"LoopbackPort - cannot use an `aborted` signal.\");\n        return;\n      }\n      const onAbort = () => this.removeEventListener(name, listener);\n      rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n      signal.addEventListener(\"abort\", onAbort);\n    }\n    this.#listeners.set(listener, rmAbort);\n  }\n\n  removeEventListener(name, listener) {\n    const rmAbort = this.#listeners.get(listener);\n    rmAbort?.();\n\n    this.#listeners.delete(listener);\n  }\n\n  terminate() {\n    for (const [, rmAbort] of this.#listeners) {\n      rmAbort?.();\n    }\n    this.#listeners.clear();\n  }\n}\n\nexport {\n  getDataProp,\n  getFactoryUrlProp,\n  getUrlProp,\n  isNameProxy,\n  isRefProxy,\n  isValidExplicitDest,\n  LoopbackPort,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException,\n  assert,\n  InvalidPDFException,\n  PasswordException,\n  ResponseException,\n  UnknownErrorException,\n  unreachable,\n} from \"./util.js\";\n\nconst CallbackKind = {\n  DATA: 1,\n  ERROR: 2,\n};\n\nconst StreamKind = {\n  CANCEL: 1,\n  CANCEL_COMPLETE: 2,\n  CLOSE: 3,\n  ENQUEUE: 4,\n  ERROR: 5,\n  PULL: 6,\n  PULL_COMPLETE: 7,\n  START_COMPLETE: 8,\n};\n\nfunction onFn() {}\n\nfunction wrapReason(ex) {\n  if (\n    ex instanceof AbortException ||\n    ex instanceof InvalidPDFException ||\n    ex instanceof PasswordException ||\n    ex instanceof ResponseException ||\n    ex instanceof UnknownErrorException\n  ) {\n    // Avoid re-creating the exception when its type is already correct.\n    return ex;\n  }\n\n  if (!(ex instanceof Error || (typeof ex === \"object\" && ex !== null))) {\n    unreachable(\n      'wrapReason: Expected \"reason\" to be a (possibly cloned) Error.'\n    );\n  }\n  switch (ex.name) {\n    case \"AbortException\":\n      return new AbortException(ex.message);\n    case \"InvalidPDFException\":\n      return new InvalidPDFException(ex.message);\n    case \"PasswordException\":\n      return new PasswordException(ex.message, ex.code);\n    case \"ResponseException\":\n      return new ResponseException(ex.message, ex.status, ex.missing);\n    case \"UnknownErrorException\":\n      return new UnknownErrorException(ex.message, ex.details);\n  }\n  return new UnknownErrorException(ex.message, ex.toString());\n}\n\nclass MessageHandler {\n  #messageAC = new AbortController();\n\n  constructor(sourceName, targetName, comObj) {\n    this.sourceName = sourceName;\n    this.targetName = targetName;\n    this.comObj = comObj;\n    this.callbackId = 1;\n    this.streamId = 1;\n    this.streamSinks = Object.create(null);\n    this.streamControllers = Object.create(null);\n    this.callbackCapabilities = Object.create(null);\n    this.actionHandler = Object.create(null);\n\n    comObj.addEventListener(\"message\", this.#onMessage.bind(this), {\n      signal: this.#messageAC.signal,\n    });\n  }\n\n  #onMessage({ data }) {\n    if (data.targetName !== this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      this.#processStreamMessage(data);\n      return;\n    }\n    if (data.callback) {\n      const callbackId = data.callbackId;\n      const capability = this.callbackCapabilities[callbackId];\n      if (!capability) {\n        throw new Error(`Cannot resolve callback ${callbackId}`);\n      }\n      delete this.callbackCapabilities[callbackId];\n\n      if (data.callback === CallbackKind.DATA) {\n        capability.resolve(data.data);\n      } else if (data.callback === CallbackKind.ERROR) {\n        capability.reject(wrapReason(data.reason));\n      } else {\n        throw new Error(\"Unexpected callback case\");\n      }\n      return;\n    }\n    const action = this.actionHandler[data.action];\n    if (!action) {\n      throw new Error(`Unknown action from worker: ${data.action}`);\n    }\n    if (data.callbackId) {\n      const sourceName = this.sourceName,\n        targetName = data.sourceName,\n        comObj = this.comObj;\n\n      Promise.try(action, data.data).then(\n        function (result) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            callback: CallbackKind.DATA,\n            callbackId: data.callbackId,\n            data: result,\n          });\n        },\n        function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            callback: CallbackKind.ERROR,\n            callbackId: data.callbackId,\n            reason: wrapReason(reason),\n          });\n        }\n      );\n      return;\n    }\n    if (data.streamId) {\n      this.#createStreamSink(data);\n      return;\n    }\n    action(data.data);\n  }\n\n  on(actionName, handler) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        typeof handler === \"function\",\n        'MessageHandler.on: Expected \"handler\" to be a function.'\n      );\n    }\n    const ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error(`There is already an actionName called \"${actionName}\"`);\n    }\n    ah[actionName] = handler;\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   */\n  send(actionName, data, transfers) {\n    this.comObj.postMessage(\n      {\n        sourceName: this.sourceName,\n        targetName: this.targetName,\n        action: actionName,\n        data,\n      },\n      transfers\n    );\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expects that the other side will callback with the response.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   * @returns {Promise} Promise to be resolved with response data.\n   */\n  sendWithPromise(actionName, data, transfers) {\n    const callbackId = this.callbackId++;\n    const capability = Promise.withResolvers();\n    this.callbackCapabilities[callbackId] = capability;\n    try {\n      this.comObj.postMessage(\n        {\n          sourceName: this.sourceName,\n          targetName: this.targetName,\n          action: actionName,\n          callbackId,\n          data,\n        },\n        transfers\n      );\n    } catch (ex) {\n      capability.reject(ex);\n    }\n    return capability.promise;\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expect that the other side will callback to signal 'start_complete'.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Object} queueingStrategy - Strategy to signal backpressure based on\n   *                 internal queue.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   * @returns {ReadableStream} ReadableStream to read data in chunks.\n   */\n  sendWithStream(actionName, data, queueingStrategy, transfers) {\n    const streamId = this.streamId++,\n      sourceName = this.sourceName,\n      targetName = this.targetName,\n      comObj = this.comObj;\n\n    return new ReadableStream(\n      {\n        start: controller => {\n          const startCapability = Promise.withResolvers();\n          this.streamControllers[streamId] = {\n            controller,\n            startCall: startCapability,\n            pullCall: null,\n            cancelCall: null,\n            isClosed: false,\n          };\n          comObj.postMessage(\n            {\n              sourceName,\n              targetName,\n              action: actionName,\n              streamId,\n              data,\n              desiredSize: controller.desiredSize,\n            },\n            transfers\n          );\n          // Return Promise for Async process, to signal success/failure.\n          return startCapability.promise;\n        },\n\n        pull: controller => {\n          const pullCapability = Promise.withResolvers();\n          this.streamControllers[streamId].pullCall = pullCapability;\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL,\n            streamId,\n            desiredSize: controller.desiredSize,\n          });\n          // Returning Promise will not call \"pull\"\n          // again until current pull is resolved.\n          return pullCapability.promise;\n        },\n\n        cancel: reason => {\n          assert(reason instanceof Error, \"cancel must have a valid reason\");\n          const cancelCapability = Promise.withResolvers();\n          this.streamControllers[streamId].cancelCall = cancelCapability;\n          this.streamControllers[streamId].isClosed = true;\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL,\n            streamId,\n            reason: wrapReason(reason),\n          });\n          // Return Promise to signal success or failure.\n          return cancelCapability.promise;\n        },\n      },\n      queueingStrategy\n    );\n  }\n\n  #createStreamSink(data) {\n    const streamId = data.streamId,\n      sourceName = this.sourceName,\n      targetName = data.sourceName,\n      comObj = this.comObj;\n    const self = this,\n      action = this.actionHandler[data.action];\n\n    const streamSink = {\n      enqueue(chunk, size = 1, transfers) {\n        if (this.isCancelled) {\n          return;\n        }\n        const lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        // Enqueue decreases the desiredSize property of sink,\n        // so when it changes from positive to negative,\n        // set ready as unresolved promise.\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = Promise.withResolvers();\n          this.ready = this.sinkCapability.promise;\n        }\n        comObj.postMessage(\n          {\n            sourceName,\n            targetName,\n            stream: StreamKind.ENQUEUE,\n            streamId,\n            chunk,\n          },\n          transfers\n        );\n      },\n\n      close() {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CLOSE,\n          streamId,\n        });\n        delete self.streamSinks[streamId];\n      },\n\n      error(reason) {\n        assert(reason instanceof Error, \"error must have a valid reason\");\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ERROR,\n          streamId,\n          reason: wrapReason(reason),\n        });\n      },\n\n      sinkCapability: Promise.withResolvers(),\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: data.desiredSize,\n      ready: null,\n    };\n\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n\n    Promise.try(action, data.data, streamSink).then(\n      function () {\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.START_COMPLETE,\n          streamId,\n          success: true,\n        });\n      },\n      function (reason) {\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.START_COMPLETE,\n          streamId,\n          reason: wrapReason(reason),\n        });\n      }\n    );\n  }\n\n  #processStreamMessage(data) {\n    const streamId = data.streamId,\n      sourceName = this.sourceName,\n      targetName = data.sourceName,\n      comObj = this.comObj;\n    const streamController = this.streamControllers[streamId],\n      streamSink = this.streamSinks[streamId];\n\n    switch (data.stream) {\n      case StreamKind.START_COMPLETE:\n        if (data.success) {\n          streamController.startCall.resolve();\n        } else {\n          streamController.startCall.reject(wrapReason(data.reason));\n        }\n        break;\n      case StreamKind.PULL_COMPLETE:\n        if (data.success) {\n          streamController.pullCall.resolve();\n        } else {\n          streamController.pullCall.reject(wrapReason(data.reason));\n        }\n        break;\n      case StreamKind.PULL:\n        // Ignore any pull after close is called.\n        if (!streamSink) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true,\n          });\n          break;\n        }\n        // Pull increases the desiredSize property of sink, so when it changes\n        // from negative to positive, set ready property as resolved promise.\n        if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {\n          streamSink.sinkCapability.resolve();\n        }\n        // Reset desiredSize property of sink on every pull.\n        streamSink.desiredSize = data.desiredSize;\n\n        Promise.try(streamSink.onPull || onFn).then(\n          function () {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.PULL_COMPLETE,\n              streamId,\n              success: true,\n            });\n          },\n          function (reason) {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.PULL_COMPLETE,\n              streamId,\n              reason: wrapReason(reason),\n            });\n          }\n        );\n        break;\n      case StreamKind.ENQUEUE:\n        assert(streamController, \"enqueue should have stream controller\");\n        if (streamController.isClosed) {\n          break;\n        }\n        streamController.controller.enqueue(data.chunk);\n        break;\n      case StreamKind.CLOSE:\n        assert(streamController, \"close should have stream controller\");\n        if (streamController.isClosed) {\n          break;\n        }\n        streamController.isClosed = true;\n        streamController.controller.close();\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.ERROR:\n        assert(streamController, \"error should have stream controller\");\n        streamController.controller.error(wrapReason(data.reason));\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.CANCEL_COMPLETE:\n        if (data.success) {\n          streamController.cancelCall.resolve();\n        } else {\n          streamController.cancelCall.reject(wrapReason(data.reason));\n        }\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.CANCEL:\n        if (!streamSink) {\n          break;\n        }\n        const dataReason = wrapReason(data.reason);\n\n        Promise.try(streamSink.onCancel || onFn, dataReason).then(\n          function () {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.CANCEL_COMPLETE,\n              streamId,\n              success: true,\n            });\n          },\n          function (reason) {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.CANCEL_COMPLETE,\n              streamId,\n              reason: wrapReason(reason),\n            });\n          }\n        );\n        streamSink.sinkCapability.reject(dataReason);\n        streamSink.isCancelled = true;\n        delete this.streamSinks[streamId];\n        break;\n      default:\n        throw new Error(\"Unexpected stream case\");\n    }\n  }\n\n  async #deleteStreamController(streamController, streamId) {\n    // Delete the `streamController` only when the start, pull, and cancel\n    // capabilities have settled, to prevent `TypeError`s.\n    await Promise.allSettled([\n      streamController.startCall?.promise,\n      streamController.pullCall?.promise,\n      streamController.cancelCall?.promise,\n    ]);\n    delete this.streamControllers[streamId];\n  }\n\n  destroy() {\n    this.#messageAC?.abort();\n    this.#messageAC = null;\n  }\n}\n\nexport { MessageHandler, wrapReason };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes, unreachable } from \"../shared/util.js\";\nimport { fetchData } from \"./display_utils.js\";\n\nclass BaseBinaryDataFactory {\n  #errorStr = Object.freeze({\n    cMapUrl: \"CMap\",\n    standardFontDataUrl: \"font\",\n    wasmUrl: \"wasm\",\n  });\n\n  constructor({ cMapUrl = null, standardFontDataUrl = null, wasmUrl = null }) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseBinaryDataFactory\n    ) {\n      unreachable(\"Cannot initialize BaseBinaryDataFactory.\");\n    }\n    this.cMapUrl = cMapUrl;\n    this.standardFontDataUrl = standardFontDataUrl;\n    this.wasmUrl = wasmUrl;\n  }\n\n  async fetch({ kind, filename }) {\n    switch (kind) {\n      case \"cMapUrl\":\n      case \"standardFontDataUrl\":\n      case \"wasmUrl\":\n        break;\n      default:\n        unreachable(`Not implemented: ${kind}`);\n    }\n    const baseUrl = this[kind];\n    if (!baseUrl) {\n      throw new Error(`Ensure that the \\`${kind}\\` API parameter is provided.`);\n    }\n    const url = `${baseUrl}${filename}`;\n\n    return this._fetch(url, kind).catch(reason => {\n      throw new Error(`Unable to load ${this.#errorStr[kind]} data at: ${url}`);\n    });\n  }\n\n  /**\n   * @ignore\n   * @returns {Promise<Uint8Array>}\n   */\n  async _fetch(url, kind) {\n    unreachable(\"Abstract method `_fetch` called.\");\n  }\n}\n\nclass DOMBinaryDataFactory extends BaseBinaryDataFactory {\n  /**\n   * @ignore\n   */\n  async _fetch(url, kind) {\n    const type =\n      kind === \"cMapUrl\" && !url.endsWith(\".bcmap\") ? \"text\" : \"bytes\";\n    const data = await fetchData(url, type);\n    return data instanceof Uint8Array ? data : stringToBytes(data);\n  }\n}\n\nexport { BaseBinaryDataFactory, DOMBinaryDataFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseCanvasFactory {\n  #enableHWA = false;\n\n  constructor({ enableHWA = false }) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseCanvasFactory\n    ) {\n      unreachable(\"Cannot initialize BaseCanvasFactory.\");\n    }\n    this.#enableHWA = enableHWA;\n  }\n\n  create(width, height) {\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid canvas size\");\n    }\n    const canvas = this._createCanvas(width, height);\n    return {\n      canvas,\n      context: canvas.getContext(\"2d\", {\n        willReadFrequently: !this.#enableHWA,\n      }),\n    };\n  }\n\n  reset({ canvas }, width, height) {\n    if (!canvas) {\n      throw new Error(\"Canvas is not specified\");\n    }\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid canvas size\");\n    }\n    canvas.width = width;\n    canvas.height = height;\n  }\n\n  destroy(canvasAndContext) {\n    const { canvas } = canvasAndContext;\n    if (!canvas) {\n      throw new Error(\"Canvas is not specified\");\n    }\n    // Zeroing the width and height cause Firefox to release graphics\n    // resources immediately, which can greatly reduce memory consumption.\n    canvas.width = canvas.height = 0;\n    canvasAndContext.canvas = null;\n    canvasAndContext.context = null;\n  }\n\n  /**\n   * @ignore\n   */\n  _createCanvas(width, height) {\n    unreachable(\"Abstract method `_createCanvas` called.\");\n  }\n}\n\nclass DOMCanvasFactory extends BaseCanvasFactory {\n  constructor({ ownerDocument = globalThis.document, enableHWA = false }) {\n    super({ enableHWA });\n    this._document = ownerDocument;\n  }\n\n  /**\n   * @ignore\n   */\n  _createCanvas(width, height) {\n    const canvas = this._document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    return canvas;\n  }\n}\n\nexport { BaseCanvasFactory, DOMCanvasFactory };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  FeatureTest,\n  SVG_NS,\n  unreachable,\n  updateUrlHash,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { getRGB, getRGBA, isDataScheme } from \"./display_utils.js\";\n\nclass BaseFilterFactory {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseFilterFactory\n    ) {\n      unreachable(\"Cannot initialize BaseFilterFactory.\");\n    }\n  }\n\n  addFilter(maps) {\n    return \"none\";\n  }\n\n  addHCMFilter(fgColor, bgColor) {\n    return \"none\";\n  }\n\n  addAlphaFilter(map) {\n    return \"none\";\n  }\n\n  addLuminosityFilter(map) {\n    return \"none\";\n  }\n\n  addKnockoutFilter(alpha = 0) {\n    return \"none\";\n  }\n\n  addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n    return \"none\";\n  }\n\n  /**\n   * Create a filter for the selection of text, given colors.\n   *\n   * @param {string} fgColor\n   * @param {string} bgColor\n   * @returns {string}\n   */\n  addSelectionHCMFilter(fgColor, bgColor) {\n    return \"none\";\n  }\n\n  /**\n   * Create a filter for the selection of text.\n   *\n   * @returns {string}\n   */\n  addSelectionFilter() {\n    return \"none\";\n  }\n\n  /**\n   * @param {Object} [pageColors]\n   * @param {string} [pageColors.background]\n   * @param {string} [pageColors.foreground]\n   * @returns {Record<string, string> | null}\n   */\n  createSelectionStyle(pageColors = null) {\n    return null;\n  }\n\n  destroy(keepHCM = false) {}\n}\n\n/**\n * FilterFactory aims to create some SVG filters we can use when drawing an\n * image (or whatever) on a canvas.\n * Filters aren't applied with ctx.putImageData because it just overwrites the\n * underlying pixels.\n * With these filters, it's possible for example to apply some transfer maps on\n * an image without the need to apply them on the pixel arrays: the renderer\n * does the magic for us.\n */\nclass DOMFilterFactory extends BaseFilterFactory {\n  #baseUrl;\n\n  #_cache;\n\n  #_defs;\n\n  #docId;\n\n  #document;\n\n  #_hcmCache;\n\n  #id = 0;\n\n  constructor({ docId, ownerDocument = globalThis.document }) {\n    super();\n    this.#docId = docId;\n    this.#document = ownerDocument;\n  }\n\n  get #cache() {\n    return (this.#_cache ||= new Map());\n  }\n\n  get #hcmCache() {\n    return (this.#_hcmCache ||= new Map());\n  }\n\n  get #defs() {\n    if (!this.#_defs) {\n      const div = this.#document.createElement(\"div\");\n      const { style } = div;\n      // The pdf colors are mostly in light mode (white background with a black\n      // foreground), so the filters are created in light mode.\n      style.colorScheme = \"only light\";\n      style.visibility = \"hidden\";\n      style.contain = \"strict\";\n      style.width = style.height = 0;\n      style.position = \"absolute\";\n      style.top = style.left = 0;\n      style.zIndex = -1;\n\n      const svg = this.#document.createElementNS(SVG_NS, \"svg\");\n      svg.setAttribute(\"width\", 0);\n      svg.setAttribute(\"height\", 0);\n      this.#_defs = this.#document.createElementNS(SVG_NS, \"defs\");\n      div.append(svg);\n      svg.append(this.#_defs);\n      this.#document.body.append(div);\n    }\n    return this.#_defs;\n  }\n\n  #createTables(maps) {\n    if (maps.length === 1) {\n      const mapR = maps[0];\n      const buffer = new Array(256);\n      for (let i = 0; i < 256; i++) {\n        buffer[i] = mapR[i] / 255;\n      }\n\n      const table = buffer.join(\",\");\n      return [table, table, table];\n    }\n\n    const [mapR, mapG, mapB] = maps;\n    const bufferR = new Array(256);\n    const bufferG = new Array(256);\n    const bufferB = new Array(256);\n    for (let i = 0; i < 256; i++) {\n      bufferR[i] = mapR[i] / 255;\n      bufferG[i] = mapG[i] / 255;\n      bufferB[i] = mapB[i] / 255;\n    }\n    return [bufferR.join(\",\"), bufferG.join(\",\"), bufferB.join(\",\")];\n  }\n\n  #createUrl(id) {\n    if (this.#baseUrl === undefined) {\n      // Unless a `<base>`-element is present a relative URL should work.\n      this.#baseUrl = \"\";\n\n      const url = this.#document.URL;\n      if (url !== this.#document.baseURI) {\n        if (isDataScheme(url)) {\n          warn('#createUrl: ignore \"data:\"-URL for performance reasons.');\n        } else {\n          this.#baseUrl = updateUrlHash(url, \"\");\n        }\n      }\n    }\n    return `url(${this.#baseUrl}#${id})`;\n  }\n\n  addFilter(maps) {\n    if (!maps) {\n      return \"none\";\n    }\n\n    // When a page is zoomed the page is re-drawn but the maps are likely\n    // the same.\n    let value = this.#cache.get(maps);\n    if (value) {\n      return value;\n    }\n\n    const [tableR, tableG, tableB] = this.#createTables(maps);\n    const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`;\n\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(maps, value);\n      return value;\n    }\n\n    // We create a SVG filter: feComponentTransferElement\n    //  https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement\n\n    const id = `g_${this.#docId}_transfer_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(maps, url);\n    this.#cache.set(key, url);\n\n    const filter = this.#createFilter(id);\n    this.#addTransferMapConversion(tableR, tableG, tableB, filter);\n\n    return url;\n  }\n\n  addHCMFilter(fgColor, bgColor) {\n    const key = `${fgColor}-${bgColor}`;\n    const filterName = \"base\";\n    let info = this.#hcmCache.get(filterName);\n    if (info?.key === key) {\n      return info.url;\n    }\n\n    if (info) {\n      info.filter?.remove();\n      info.key = key;\n      info.url = \"none\";\n      info.filter = null;\n    } else {\n      info = {\n        key,\n        url: \"none\",\n        filter: null,\n      };\n      this.#hcmCache.set(filterName, info);\n    }\n\n    if (!fgColor || !bgColor) {\n      return info.url;\n    }\n\n    const fgRGB = this.#getRGB(fgColor);\n    fgColor = Util.makeHexColor(...fgRGB);\n    const bgRGB = this.#getRGB(bgColor);\n    bgColor = Util.makeHexColor(...bgRGB);\n    this.#defs.style.color = \"\";\n\n    if (\n      (fgColor === \"#000000\" && bgColor === \"#ffffff\") ||\n      fgColor === bgColor\n    ) {\n      return info.url;\n    }\n\n    // https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_Colors_and_Luminance\n    //\n    // Relative luminance:\n    // https://www.w3.org/TR/WCAG20/#relativeluminancedef\n    //\n    // We compute the rounded luminance of the default background color.\n    // Then for every color in the pdf, if its rounded luminance is the\n    // same as the background one then it's replaced by the new\n    // background color else by the foreground one.\n    const map = new Array(256);\n    for (let i = 0; i <= 255; i++) {\n      const x = i / 255;\n      map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n    }\n    const table = map.join(\",\");\n\n    const id = `g_${this.#docId}_hcm_filter`;\n    const filter = (info.filter = this.#createFilter(id));\n    this.#addTransferMapConversion(table, table, table, filter);\n    this.#addGrayConversion(filter);\n\n    const getSteps = (c, n) => {\n      const start = fgRGB[c] / 255;\n      const end = bgRGB[c] / 255;\n      const arr = new Array(n + 1);\n      for (let i = 0; i <= n; i++) {\n        arr[i] = start + (i / n) * (end - start);\n      }\n      return arr.join(\",\");\n    };\n    this.#addTransferMapConversion(\n      getSteps(0, 5),\n      getSteps(1, 5),\n      getSteps(2, 5),\n      filter\n    );\n\n    info.url = this.#createUrl(id);\n    return info.url;\n  }\n\n  /**\n   * Create a filter for the selection of text, given colors.\n   *\n   * @param {string} fgColor\n   * @param {string} bgColor\n   * @returns {string}\n   */\n  addSelectionHCMFilter(fgColor, bgColor) {\n    return this.addHighlightHCMFilter(\n      \"selection\",\n      fgColor,\n      bgColor,\n      // Background becomes foreground so these are flipped.\n      \"HighlightText\",\n      \"Highlight\"\n    );\n  }\n\n  /**\n   * Create a filter for the selection of text.\n   *\n   * @param {string} fgColor\n   * @param {string} bgColor\n   * @returns {string}\n   */\n  addSelectionFilter() {\n    return this.addHighlightHCMFilter(\n      \"selection_default\",\n      \"black\",\n      \"white\",\n      \"HighlightText\",\n      \"Highlight\"\n    );\n  }\n\n  /**\n   * @param {Object} [pageColors]\n   * @param {string} [pageColors.background]\n   * @param {string} [pageColors.foreground]\n   * @returns {Record<string, string> | null}\n   */\n  createSelectionStyle(pageColors = null) {\n    const filter = pageColors\n      ? this.addSelectionHCMFilter(pageColors.foreground, pageColors.background)\n      : this.addSelectionFilter();\n\n    // Safari does not supported SVG filters in `backdrop-filter`:\n    // <https://bugs.webkit.org/show_bug.cgi?id=245510>.\n    // Chrome *and* Safari do not use the user鈥檚 preferred text selection color.\n    // So this is Firefox-specific for now.\n    if (filter === \"none\" || !FeatureTest.platform.isFirefox) {\n      return null;\n    }\n\n    return {\n      \"backdrop-filter\": filter,\n      \"background-color\": \"transparent\",\n    };\n  }\n\n  addAlphaFilter(map) {\n    // When a page is zoomed the page is re-drawn but the maps are likely\n    // the same.\n    let value = this.#cache.get(map);\n    if (value) {\n      return value;\n    }\n\n    const [tableA] = this.#createTables([map]);\n    const key = `alpha_${tableA}`;\n\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(map, value);\n      return value;\n    }\n\n    const id = `g_${this.#docId}_alpha_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(map, url);\n    this.#cache.set(key, url);\n\n    const filter = this.#createFilter(id);\n    this.#addTransferMapAlphaConversion(tableA, filter);\n\n    return url;\n  }\n\n  addLuminosityFilter(map) {\n    // When a page is zoomed the page is re-drawn but the maps are likely\n    // the same.\n    let value = this.#cache.get(map || \"luminosity\");\n    if (value) {\n      return value;\n    }\n\n    let tableA, key;\n    if (map) {\n      [tableA] = this.#createTables([map]);\n      key = `luminosity_${tableA}`;\n    } else {\n      key = \"luminosity\";\n    }\n\n    value = this.#cache.get(key);\n    if (value) {\n      this.#cache.set(map, value);\n      return value;\n    }\n\n    const id = `g_${this.#docId}_luminosity_map_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(map, url);\n    this.#cache.set(key, url);\n\n    const filter = this.#createFilter(id);\n    this.#addLuminosityConversion(filter);\n    if (map) {\n      this.#addTransferMapAlphaConversion(tableA, filter);\n    }\n\n    return url;\n  }\n\n  addKnockoutFilter(alpha = 0) {\n    // Shape alpha mask: for translucent elements, remove the opacity constant\n    // from the painted alpha while preserving antialias coverage. With no\n    // usable opacity, fall back to a binary mask.\n    const slope = alpha > 0 ? Math.min(1 / alpha, 1e6) : 1e6;\n    const key = `knockout_${slope}`;\n    const value = this.#cache.get(key);\n    if (value) {\n      return value;\n    }\n\n    const id = `g_${this.#docId}_knockout_filter_${this.#id++}`;\n    const url = this.#createUrl(id);\n    this.#cache.set(key, url);\n\n    const filter = this.#createFilter(id);\n    const feComponentTransfer = this.#document.createElementNS(\n      SVG_NS,\n      \"feComponentTransfer\"\n    );\n    filter.append(feComponentTransfer);\n    const feFuncA = this.#document.createElementNS(SVG_NS, \"feFuncA\");\n    // Linear feFunc clamps to [0, 1].\n    feFuncA.setAttribute(\"type\", \"linear\");\n    feFuncA.setAttribute(\"slope\", `${slope}`);\n    feFuncA.setAttribute(\"intercept\", \"0\");\n    feComponentTransfer.append(feFuncA);\n\n    return url;\n  }\n\n  addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n    const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;\n    let info = this.#hcmCache.get(filterName);\n    if (info?.key === key) {\n      return info.url;\n    }\n\n    if (info) {\n      info.filter?.remove();\n      info.key = key;\n      info.url = \"none\";\n      info.filter = null;\n    } else {\n      info = {\n        key,\n        url: \"none\",\n        filter: null,\n      };\n      this.#hcmCache.set(filterName, info);\n    }\n\n    if (!fgColor || !bgColor) {\n      return info.url;\n    }\n\n    const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));\n    let fgGray = Math.round(\n      0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]\n    );\n    let bgGray = Math.round(\n      0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]\n    );\n    let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(\n      this.#getOpaqueTextColor.bind(this)\n    );\n    if (bgGray < fgGray) {\n      [fgGray, bgGray, newFgRGB, newBgRGB] = [\n        bgGray,\n        fgGray,\n        newBgRGB,\n        newFgRGB,\n      ];\n    }\n    this.#defs.style.color = \"\";\n\n    // Now we can create the filters to highlight some canvas parts.\n    // The colors in the pdf will almost be Canvas and CanvasText, hence we\n    // want to filter them to finally get Highlight and HighlightText.\n    // Since we're in HCM the background color and the foreground color should\n    // be really different when converted to grayscale (if they're not then it\n    // means that we've a poor contrast). Once the canvas colors are converted\n    // to grayscale we can easily map them on their new colors.\n    // The grayscale step is important because if we've something like:\n    //   fgColor = #FF....\n    //   bgColor = #FF....\n    //   then we are enable to map the red component on the new red components\n    //   which can be different.\n\n    const getSteps = (fg, bg, n) => {\n      const arr = new Array(256);\n      const step = (bgGray - fgGray) / n;\n      const newStart = fg / 255;\n      const newStep = (bg - fg) / (255 * n);\n      let prev = 0;\n      for (let i = 0; i <= n; i++) {\n        const k = Math.round(fgGray + i * step);\n        const value = newStart + i * newStep;\n        for (let j = prev; j <= k; j++) {\n          arr[j] = value;\n        }\n        prev = k + 1;\n      }\n      for (let i = prev; i < 256; i++) {\n        arr[i] = arr[prev - 1];\n      }\n      return arr.join(\",\");\n    };\n\n    const id = `g_${this.#docId}_hcm_${filterName}_filter`;\n    const filter = (info.filter = this.#createFilter(id));\n\n    this.#addGrayConversion(filter);\n    this.#addTransferMapConversion(\n      getSteps(newFgRGB[0], newBgRGB[0], 5),\n      getSteps(newFgRGB[1], newBgRGB[1], 5),\n      getSteps(newFgRGB[2], newBgRGB[2], 5),\n      filter\n    );\n\n    info.url = this.#createUrl(id);\n    return info.url;\n  }\n\n  destroy(keepHCM = false) {\n    if (keepHCM && this.#_hcmCache?.size) {\n      return;\n    }\n    this.#_defs?.parentNode.parentNode.remove();\n    this.#_defs = null;\n\n    this.#_cache?.clear();\n    this.#_cache = null;\n\n    this.#_hcmCache?.clear();\n    this.#_hcmCache = null;\n\n    this.#id = 0;\n  }\n\n  #addLuminosityConversion(filter) {\n    const feColorMatrix = this.#document.createElementNS(\n      SVG_NS,\n      \"feColorMatrix\"\n    );\n    feColorMatrix.setAttribute(\"type\", \"matrix\");\n    feColorMatrix.setAttribute(\n      \"values\",\n      \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0\"\n    );\n    filter.append(feColorMatrix);\n  }\n\n  #addGrayConversion(filter) {\n    const feColorMatrix = this.#document.createElementNS(\n      SVG_NS,\n      \"feColorMatrix\"\n    );\n    feColorMatrix.setAttribute(\"type\", \"matrix\");\n    feColorMatrix.setAttribute(\n      \"values\",\n      \"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\"\n    );\n    filter.append(feColorMatrix);\n  }\n\n  #createFilter(id) {\n    const filter = this.#document.createElementNS(SVG_NS, \"filter\");\n    filter.setAttribute(\"color-interpolation-filters\", \"sRGB\");\n    filter.setAttribute(\"id\", id);\n    this.#defs.append(filter);\n\n    return filter;\n  }\n\n  #appendFeFunc(feComponentTransfer, func, table) {\n    const feFunc = this.#document.createElementNS(SVG_NS, func);\n    feFunc.setAttribute(\"type\", \"discrete\");\n    feFunc.setAttribute(\"tableValues\", table);\n    feComponentTransfer.append(feFunc);\n  }\n\n  #addTransferMapConversion(rTable, gTable, bTable, filter) {\n    const feComponentTransfer = this.#document.createElementNS(\n      SVG_NS,\n      \"feComponentTransfer\"\n    );\n    filter.append(feComponentTransfer);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncR\", rTable);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncG\", gTable);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncB\", bTable);\n  }\n\n  #addTransferMapAlphaConversion(aTable, filter) {\n    const feComponentTransfer = this.#document.createElementNS(\n      SVG_NS,\n      \"feComponentTransfer\"\n    );\n    filter.append(feComponentTransfer);\n    this.#appendFeFunc(feComponentTransfer, \"feFuncA\", aTable);\n  }\n\n  #getRGB(color) {\n    this.#defs.style.color = color;\n    return getRGB(getComputedStyle(this.#defs).getPropertyValue(\"color\"));\n  }\n\n  /**\n   * Get the RGBA channels of a color.\n   *\n   * @param {string} color\n   *   Color in any valid CSS format (such as `x` in `color: x`).\n   * @returns {[number, number, number, number]}\n   *   RGBA values of the color;\n   *   the RGB channels are in the range `[0, 255]`;\n   *   the alpha channel is in the range `[0, 1]`.\n   */\n  #getRGBA(color) {\n    this.#defs.style.color = color;\n    return getRGBA(getComputedStyle(this.#defs).getPropertyValue(\"color\"));\n  }\n\n  /**\n   * Get the opaque text color by, if it has an alpha layer, blending it with\n   * the `Canvas` background.\n   *\n   * @param {string} color\n   *   Color in any valid CSS format (such as `x` in `color: x`).\n   * @returns {[number, number, number]}\n   *   RGB values of the opaque color.\n   */\n  #getOpaqueTextColor(color) {\n    const [r, g, b, alpha] = this.#getRGBA(color);\n\n    if (alpha === 1) {\n      return [r, g, b];\n    }\n\n    const [canvasR, canvasG, canvasB] = this.#getRGB(\"Canvas\");\n\n    return [\n      blend(r, canvasR, alpha),\n      blend(g, canvasG, alpha),\n      blend(b, canvasB, alpha),\n    ];\n  }\n}\n\n/**\n * Blend a foreground color with a background color using the alpha value.\n *\n * @param {number} fg\n *   Foreground color channel value in the range `[0, 255]`.\n * @param {number} bg\n *   Background color channel value in the range `[0, 255]`.\n * @param {number} alpha\n *   Alpha value in the range `[0, 1]`.\n * @returns {number}\n *   Blended color channel value in the range `[0, 255]`.\n */\nfunction blend(fg, bg, alpha) {\n  return Math.round(alpha * fg + (1 - alpha) * bg);\n}\n\nexport { BaseFilterFactory, DOMFilterFactory };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\nimport { isNodeJS, warn } from \"../shared/util.js\";\nimport { BaseBinaryDataFactory } from \"./binary_data_factory.js\";\nimport { BaseCanvasFactory } from \"./canvas_factory.js\";\nimport { BaseFilterFactory } from \"./filter_factory.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n  throw new Error(\n    'Module \"./node_utils.js\" shall not be used with MOZCENTRAL builds.'\n  );\n}\n\nif (isNodeJS) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"SKIP_BABEL\")) {\n    warn(\"Please use the `legacy` build in Node.js environments.\");\n  } else {\n    let canvas;\n    try {\n      const require = process\n        .getBuiltinModule(\"module\")\n        .createRequire(import.meta.url);\n\n      try {\n        canvas = require(\"@napi-rs/canvas\");\n      } catch (ex) {\n        warn(`Cannot load \"@napi-rs/canvas\" package: \"${ex}\".`);\n      }\n    } catch (ex) {\n      warn(`Cannot access the \\`require\\` function: \"${ex}\".`);\n    }\n\n    if (!globalThis.DOMMatrix) {\n      if (canvas?.DOMMatrix) {\n        globalThis.DOMMatrix = canvas.DOMMatrix;\n      } else {\n        warn(\"Cannot polyfill `DOMMatrix`, rendering may be broken.\");\n      }\n    }\n    if (!globalThis.Path2D) {\n      if (canvas?.Path2D) {\n        globalThis.Path2D = canvas.Path2D;\n      } else {\n        warn(\"Cannot polyfill `Path2D`, rendering may be broken.\");\n      }\n    }\n    if (!globalThis.navigator?.language) {\n      globalThis.navigator = {\n        language: \"en-US\",\n        platform: \"\",\n        userAgent: \"\",\n      };\n    }\n  }\n}\n\nasync function fetchData(url) {\n  const fs = process.getBuiltinModule(\"fs/promises\");\n  const data = await fs.readFile(url);\n  return new Uint8Array(data);\n}\n\nclass NodeFilterFactory extends BaseFilterFactory {}\n\nclass NodeCanvasFactory extends BaseCanvasFactory {\n  /**\n   * @ignore\n   */\n  _createCanvas(width, height) {\n    const require = process\n      .getBuiltinModule(\"module\")\n      .createRequire(import.meta.url);\n    const canvas = require(\"@napi-rs/canvas\");\n    return canvas.createCanvas(width, height);\n  }\n}\n\nclass NodeBinaryDataFactory extends BaseBinaryDataFactory {\n  /**\n   * @ignore\n   */\n  async _fetch(url, kind) {\n    return fetchData(url);\n  }\n}\n\nexport {\n  fetchData,\n  NodeBinaryDataFactory,\n  NodeCanvasFactory,\n  NodeFilterFactory,\n};\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, ImageKind } from \"./util.js\";\n\nfunction convertToRGBA(params) {\n  switch (params.kind) {\n    case ImageKind.GRAYSCALE_1BPP:\n      return convertBlackAndWhiteToRGBA(params);\n    case ImageKind.RGB_24BPP:\n      return convertRGBToRGBA(params);\n  }\n\n  return null;\n}\n\nfunction convertBlackAndWhiteToRGBA({\n  src,\n  srcPos = 0,\n  dest,\n  width,\n  height,\n  nonBlackColor = 0xffffffff,\n  inverseDecode = false,\n}) {\n  const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n  const [zeroMapping, oneMapping] = inverseDecode\n    ? [nonBlackColor, black]\n    : [black, nonBlackColor];\n  const widthInSource = width >> 3;\n  const widthRemainder = width & 7;\n  const xorMask = zeroMapping ^ oneMapping;\n  const srcLength = src.length;\n  dest = new Uint32Array(dest.buffer);\n  let destPos = 0;\n\n  for (let i = 0; i < height; ++i) {\n    for (\n      const max = srcPos + widthInSource;\n      srcPos < max;\n      ++srcPos, destPos += 8\n    ) {\n      const elem = src[srcPos];\n      dest[destPos] = zeroMapping ^ (-((elem >> 7) & 1) & xorMask);\n      dest[destPos + 1] = zeroMapping ^ (-((elem >> 6) & 1) & xorMask);\n      dest[destPos + 2] = zeroMapping ^ (-((elem >> 5) & 1) & xorMask);\n      dest[destPos + 3] = zeroMapping ^ (-((elem >> 4) & 1) & xorMask);\n      dest[destPos + 4] = zeroMapping ^ (-((elem >> 3) & 1) & xorMask);\n      dest[destPos + 5] = zeroMapping ^ (-((elem >> 2) & 1) & xorMask);\n      dest[destPos + 6] = zeroMapping ^ (-((elem >> 1) & 1) & xorMask);\n      dest[destPos + 7] = zeroMapping ^ (-(elem & 1) & xorMask);\n    }\n    if (widthRemainder === 0) {\n      continue;\n    }\n    const elem = srcPos < srcLength ? src[srcPos++] : 255;\n    for (let j = 0; j < widthRemainder; ++j, ++destPos) {\n      dest[destPos] = zeroMapping ^ (-((elem >> (7 - j)) & 1) & xorMask);\n    }\n  }\n\n  return { srcPos, destPos };\n}\n\nfunction convertRGBToRGBA({\n  src,\n  srcPos = 0,\n  dest,\n  destPos = 0,\n  width,\n  height,\n}) {\n  let i = 0;\n  const len = width * height * 3;\n  const len32 = len >> 2;\n  const src32 = new Uint32Array(src.buffer, srcPos, len32);\n  const alphaMask = FeatureTest.isLittleEndian ? 0xff000000 : 0xff;\n\n  if (FeatureTest.isLittleEndian) {\n    // It's a way faster to do the shuffle manually instead of working\n    // component by component with some Uint8 arrays.\n    for (; i < len32 - 2; i += 3, destPos += 4) {\n      const s1 = src32[i], // R2B1G1R1\n        s2 = src32[i + 1], // G3R3B2G2\n        s3 = src32[i + 2]; // B4G4R4B3\n\n      dest[destPos] = s1 | alphaMask;\n      dest[destPos + 1] = (s1 >>> 24) | (s2 << 8) | alphaMask;\n      dest[destPos + 2] = (s2 >>> 16) | (s3 << 16) | alphaMask;\n      dest[destPos + 3] = (s3 >>> 8) | alphaMask;\n    }\n\n    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n      dest[destPos++] =\n        src[j] | (src[j + 1] << 8) | (src[j + 2] << 16) | alphaMask;\n    }\n  } else {\n    for (; i < len32 - 2; i += 3, destPos += 4) {\n      const s1 = src32[i], // R1G1B1R2\n        s2 = src32[i + 1], // G2B2R3G3\n        s3 = src32[i + 2]; // B3R4G4B4\n\n      dest[destPos] = s1 | alphaMask;\n      dest[destPos + 1] = (s1 << 24) | (s2 >>> 8) | alphaMask;\n      dest[destPos + 2] = (s2 << 16) | (s3 >>> 16) | alphaMask;\n      dest[destPos + 3] = (s3 << 8) | alphaMask;\n    }\n\n    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n      dest[destPos++] =\n        (src[j] << 24) | (src[j + 1] << 16) | (src[j + 2] << 8) | alphaMask;\n    }\n  }\n\n  return { srcPos: srcPos + len, destPos };\n}\n\nfunction grayToRGBA(src, dest) {\n  if (FeatureTest.isLittleEndian) {\n    for (let i = 0, ii = src.length; i < ii; i++) {\n      dest[i] = (src[i] * 0x10101) | 0xff000000;\n    }\n  } else {\n    for (let i = 0, ii = src.length; i < ii; i++) {\n      dest[i] = (src[i] * 0x1010100) | 0x000000ff;\n    }\n  }\n}\n\nexport {\n  convertBlackAndWhiteToRGBA,\n  convertRGBToRGBA,\n  convertToRGBA,\n  grayToRGBA,\n};\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// WGSL shader for Gouraud-shaded triangle mesh rasterization.\n// Vertices arrive in PDF content-space coordinates; the vertex shader\n// applies the affine transform supplied via a uniform buffer to map them\n// to NDC (X: -1..1 left鈫抮ight, Y: -1..1 bottom鈫抰op).\n// Colors are delivered as unorm8x4 (r,g,b,_) and passed through as-is.\nconst MESH_WGSL = /* wgsl */ `\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<uniform> u : Uniforms;\n\nstruct VertexInput {\n  @location(0) position : vec2<f32>,\n  @location(1) color    : vec4<f32>,\n};\n\nstruct VertexOutput {\n  @builtin(position) position : vec4<f32>,\n  @location(0)       color    : vec3<f32>,\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<f32>(\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<f32> {\n  return vec4<f32>(in.color, 1.0);\n}\n`;\n\nclass WebGPU {\n  #initPromise = null;\n\n  #device = null;\n\n  #meshPipeline = null;\n\n  // Format chosen to match the OffscreenCanvas swapchain on this device.\n  #preferredFormat = null;\n\n  async #initGPU() {\n    if (!globalThis.navigator?.gpu) {\n      return false;\n    }\n    try {\n      const adapter = await navigator.gpu.requestAdapter();\n      if (!adapter) {\n        return false;\n      }\n      this.#preferredFormat = navigator.gpu.getPreferredCanvasFormat();\n      this.#device = await adapter.requestDevice();\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Start GPU initialization.\n   * @returns {Promise<boolean>}  true when a GPU device is available.\n   */\n  init() {\n    return (this.#initPromise ||= this.#initGPU());\n  }\n\n  get isReady() {\n    return this.#device !== null;\n  }\n\n  /**\n   * Compile (and cache) the Gouraud-mesh pipeline.\n   */\n  loadMeshShader() {\n    if (!this.#device || this.#meshPipeline) {\n      return;\n    }\n    const shaderModule = this.#device.createShaderModule({ code: MESH_WGSL });\n    this.#meshPipeline = this.#device.createRenderPipeline({\n      layout: \"auto\",\n      vertex: {\n        module: shaderModule,\n        entryPoint: \"vs_main\",\n        buffers: [\n          {\n            // Buffer 0: PDF content-space coords, 2 脳 float32 per vertex.\n            arrayStride: 2 * 4,\n            attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n          },\n          {\n            // Buffer 1: vertex colors, 4 脳 unorm8 per vertex (r, g, b, _).\n            arrayStride: 4,\n            attributes: [{ shaderLocation: 1, offset: 0, format: \"unorm8x4\" }],\n          },\n        ],\n      },\n      fragment: {\n        module: shaderModule,\n        entryPoint: \"fs_main\",\n        // Use the canvas-preferred format so the OffscreenCanvas swapchain\n        // and the pipeline output format always agree.\n        targets: [{ format: this.#preferredFormat }],\n      },\n      primitive: { topology: \"triangle-list\" },\n    });\n  }\n\n  /**\n   * Render a mesh shading to an ImageBitmap using WebGPU.\n   *\n   * The flat vertex streams (positions and colors) were pre-built by the\n   * worker and arrive ready to upload.  A uniform buffer carries the affine\n   * transform so the vertex shader maps PDF content-space coordinates to NDC\n   * without any CPU arithmetic per vertex.\n   *\n   * After `device.queue.submit()`, `transferToImageBitmap()` presents the\n   * current GPU frame synchronously 鈥� the browser ensures all submitted GPU\n   * commands are complete before returning.  The resulting ImageBitmap stays\n   * GPU-resident; `ctx2d.drawImage(bitmap)` is a zero-copy GPU-to-GPU blit.\n   *\n   * The GPU device must already be initialized (`this.isReady === true`).\n   *\n   * @param {Float32Array} posData  flat vertex positions (x,y per vertex)\n   * @param {Uint8Array}   colData  flat vertex colors (r,g,b,_ per vertex)\n   * @param {number}       vertexCount\n   * @param {Object} context offsetX/offsetY/scaleX/scaleY\n   * @param {Uint8Array|null} backgroundColor  [r,g,b] or null for transparent\n   * @param {number} paddedWidth  render-target width\n   * @param {number} paddedHeight render-target height\n   * @param {number} borderSize  transparent border size in pixels\n   * @returns {ImageBitmap}\n   */\n  draw(\n    posData,\n    colData,\n    vertexCount,\n    context,\n    backgroundColor,\n    paddedWidth,\n    paddedHeight,\n    borderSize\n  ) {\n    // Lazily compile the mesh pipeline the first time we need to draw.\n    this.loadMeshShader();\n\n    const device = this.#device;\n    const { offsetX, offsetY, scaleX, scaleY } = context;\n\n    // Upload vertex positions (raw PDF coords) and colors as separate buffers.\n    // GPUBufferUsage requires size > 0.\n    const posBuffer = device.createBuffer({\n      size: Math.max(posData.byteLength, 4),\n      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n    });\n    if (posData.byteLength > 0) {\n      device.queue.writeBuffer(posBuffer, 0, posData);\n    }\n\n    const colBuffer = device.createBuffer({\n      size: Math.max(colData.byteLength, 4),\n      usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n    });\n    if (colData.byteLength > 0) {\n      device.queue.writeBuffer(colBuffer, 0, colData);\n    }\n\n    // Uniform buffer: affine transform parameters for the vertex shader.\n    const uniformBuffer = device.createBuffer({\n      size: 8 * 4, // 8 脳 float32 = 32 bytes\n      usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n    });\n    device.queue.writeBuffer(\n      uniformBuffer,\n      0,\n      new Float32Array([\n        offsetX,\n        offsetY,\n        scaleX,\n        scaleY,\n        paddedWidth,\n        paddedHeight,\n        borderSize,\n        0, // padding to 32 bytes\n      ])\n    );\n\n    const bindGroup = device.createBindGroup({\n      layout: this.#meshPipeline.getBindGroupLayout(0),\n      entries: [{ binding: 0, resource: { buffer: uniformBuffer } }],\n    });\n\n    // The canvas covers the full padded area so the border is naturally clear.\n    const offscreen = new OffscreenCanvas(paddedWidth, paddedHeight);\n    const gpuCtx = offscreen.getContext(\"webgpu\");\n    gpuCtx.configure({\n      device,\n      format: this.#preferredFormat,\n      // \"premultiplied\" allows fully transparent border pixels when there is\n      // no backgroundColor; \"opaque\" is slightly more efficient otherwise.\n      alphaMode: backgroundColor ? \"opaque\" : \"premultiplied\",\n    });\n\n    const clearValue = backgroundColor\n      ? {\n          r: backgroundColor[0] / 255,\n          g: backgroundColor[1] / 255,\n          b: backgroundColor[2] / 255,\n          a: 1,\n        }\n      : { r: 0, g: 0, b: 0, a: 0 };\n\n    const commandEncoder = device.createCommandEncoder();\n    const renderPass = commandEncoder.beginRenderPass({\n      colorAttachments: [\n        {\n          view: gpuCtx.getCurrentTexture().createView(),\n          clearValue,\n          loadOp: \"clear\",\n          storeOp: \"store\",\n        },\n      ],\n    });\n    if (vertexCount > 0) {\n      renderPass.setPipeline(this.#meshPipeline);\n      renderPass.setBindGroup(0, bindGroup);\n      renderPass.setVertexBuffer(0, posBuffer);\n      renderPass.setVertexBuffer(1, colBuffer);\n      renderPass.draw(vertexCount);\n    }\n    renderPass.end();\n\n    device.queue.submit([commandEncoder.finish()]);\n    posBuffer.destroy();\n    colBuffer.destroy();\n    uniformBuffer.destroy();\n\n    // Present the current GPU frame and capture it as an ImageBitmap.\n    // The browser flushes all pending GPU commands before returning, so this\n    // is synchronous from the JavaScript perspective.  The ImageBitmap is\n    // GPU-resident; drawing it onto a 2D canvas is a GPU-to-GPU blit.\n    return offscreen.transferToImageBitmap();\n  }\n}\n\nconst _webGPU = new WebGPU();\n\n/**\n * Start GPU initialization as early as possible.\n * @returns {Promise<boolean>}  true if a GPU device was acquired.\n */\nfunction initGPU() {\n  return _webGPU.init();\n}\n\nfunction isGPUReady() {\n  return _webGPU.isReady;\n}\n\n/**\n * Pre-compile the Gouraud-mesh WGSL pipeline.\n */\nfunction loadMeshShader() {\n  _webGPU.loadMeshShader();\n}\n\nfunction drawMeshWithGPU(\n  posData,\n  colData,\n  vertexCount,\n  context,\n  backgroundColor,\n  paddedWidth,\n  paddedHeight,\n  borderSize\n) {\n  return _webGPU.draw(\n    posData,\n    colData,\n    vertexCount,\n    context,\n    backgroundColor,\n    paddedWidth,\n    paddedHeight,\n    borderSize\n  );\n}\n\nexport { drawMeshWithGPU, initGPU, isGPUReady, loadMeshShader };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { drawMeshWithGPU, isGPUReady, loadMeshShader } from \"./webgpu.js\";\nimport { FormatError, info, unreachable, Util } from \"../shared/util.js\";\nimport { CanvasNestedDependencyTracker } from \"./canvas_dependency_tracker.js\";\nimport { getCurrentTransform } from \"./display_utils.js\";\n\nconst PathType = {\n  FILL: \"Fill\",\n  STROKE: \"Stroke\",\n  SHADING: \"Shading\",\n};\n\nfunction applyBoundingBox(ctx, bbox) {\n  if (!bbox) {\n    return;\n  }\n  const width = bbox[2] - bbox[0];\n  const height = bbox[3] - bbox[1];\n  const region = new Path2D();\n  region.rect(bbox[0], bbox[1], width, height);\n  ctx.clip(region);\n}\n\nclass BaseShadingPattern {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseShadingPattern\n    ) {\n      unreachable(\"Cannot initialize BaseShadingPattern.\");\n    }\n  }\n\n  isModifyingCurrentTransform() {\n    return false;\n  }\n\n  getPattern() {\n    unreachable(\"Abstract method `getPattern` called.\");\n  }\n}\n\nclass RadialAxialShadingPattern extends BaseShadingPattern {\n  constructor(IR) {\n    super();\n    this._type = IR[1];\n    this._bbox = IR[2];\n    this._colorStops = IR[3];\n    this._p0 = IR[4];\n    this._p1 = IR[5];\n    this._r0 = IR[6];\n    this._r1 = IR[7];\n    this.matrix = null;\n  }\n\n  isOriginBased() {\n    return (\n      this._p0[0] === 0 &&\n      this._p0[1] === 0 &&\n      (!this.isRadial() || (this._p1[0] === 0 && this._p1[1] === 0))\n    );\n  }\n\n  isRadial() {\n    return this._type === \"radial\";\n  }\n\n  // Return true when the a circle of a radial gradient isn't fully included in\n  // the other circle, which means that the gradient is conic and we need to\n  // draw the reversed gradient first to correctly render the pattern (see\n  // #20851 and #257).\n  areConic() {\n    if (!this.isRadial()) {\n      return false;\n    }\n    const dist = Math.hypot(\n      this._p0[0] - this._p1[0],\n      this._p0[1] - this._p1[1]\n    );\n    return dist + this._r1 > this._r0 && dist + this._r0 > this._r1;\n  }\n\n  _createGradient(ctx, transform = null) {\n    let grad;\n    let firstPoint = this._p0;\n    let secondPoint = this._p1;\n    if (transform) {\n      firstPoint = firstPoint.slice();\n      secondPoint = secondPoint.slice();\n      Util.applyTransform(firstPoint, transform);\n      Util.applyTransform(secondPoint, transform);\n    }\n    if (this._type === \"axial\") {\n      grad = ctx.createLinearGradient(\n        firstPoint[0],\n        firstPoint[1],\n        secondPoint[0],\n        secondPoint[1]\n      );\n    } else if (this._type === \"radial\") {\n      let r0 = this._r0;\n      let r1 = this._r1;\n      if (transform) {\n        const scale = new Float32Array(2);\n        Util.singularValueDecompose2dScale(transform, scale);\n        r0 *= scale[0];\n        r1 *= scale[0];\n      }\n      grad = ctx.createRadialGradient(\n        firstPoint[0],\n        firstPoint[1],\n        r0,\n        secondPoint[0],\n        secondPoint[1],\n        r1\n      );\n    }\n\n    for (const colorStop of this._colorStops) {\n      grad.addColorStop(colorStop[0], colorStop[1]);\n    }\n    return grad;\n  }\n\n  _createReversedGradient(ctx, transform = null) {\n    // Swapped circles: (p1, r1) 鈫� (p0, r0), with color stops reversed.\n    let firstPoint = this._p1;\n    let secondPoint = this._p0;\n    if (transform) {\n      firstPoint = firstPoint.slice();\n      secondPoint = secondPoint.slice();\n      Util.applyTransform(firstPoint, transform);\n      Util.applyTransform(secondPoint, transform);\n    }\n    let r0 = this._r1;\n    let r1 = this._r0;\n    if (transform) {\n      const scale = new Float32Array(2);\n      Util.singularValueDecompose2dScale(transform, scale);\n      r0 *= scale[0];\n      r1 *= scale[0];\n    }\n    const grad = ctx.createRadialGradient(\n      firstPoint[0],\n      firstPoint[1],\n      r0,\n      secondPoint[0],\n      secondPoint[1],\n      r1\n    );\n    const reversedStops = this._colorStops\n      .map(([t, c]) => [1 - t, c])\n      .reverse();\n    for (const [t, c] of reversedStops) {\n      grad.addColorStop(t, c);\n    }\n    return grad;\n  }\n\n  getPattern(ctx, owner, inverse, pathType) {\n    let pattern;\n    if (pathType === PathType.STROKE || pathType === PathType.FILL) {\n      if (this.isOriginBased()) {\n        let transf = Util.transform(inverse, owner.baseTransform);\n        if (this.matrix) {\n          transf = Util.transform(transf, this.matrix);\n        }\n        const precision = 1e-3;\n        const n1 = Math.hypot(transf[0], transf[1]);\n        const n2 = Math.hypot(transf[2], transf[3]);\n        const ps = (transf[0] * transf[2] + transf[1] * transf[3]) / (n1 * n2);\n        if (Math.abs(ps) < precision) {\n          // The images of the basis vectors are orthogonal.\n          if (this.isRadial()) {\n            // If the images of the basis vectors are a square then the\n            // circles are transformed to circles and we can use a gradient\n            // directly.\n            if (Math.abs(n1 - n2) < precision) {\n              return this._createGradient(ctx, transf);\n            }\n          } else {\n            // The rectangles are transformed to rectangles and we can use a\n            // gradient directly.\n            return this._createGradient(ctx, transf);\n          }\n        }\n      }\n\n      const ownerBBox = owner.current.getClippedPathBoundingBox(\n        pathType,\n        getCurrentTransform(ctx)\n      ) || [0, 0, 0, 0];\n      // Create a canvas that is only as big as the current path. This doesn't\n      // allow us to cache the pattern, but it generally creates much smaller\n      // canvases and saves memory use. See bug 1722807 for an example.\n      const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;\n      const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;\n\n      const tmpCanvas = owner.canvasFactory.create(width, height);\n\n      const tmpCtx = tmpCanvas.context;\n      tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n      tmpCtx.beginPath();\n      tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n      // Non shading fill patterns are positioned relative to the base transform\n      // (usually the page's initial transform), but we may have created a\n      // smaller canvas based on the path, so we must account for the shift.\n      tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);\n      inverse = Util.transform(inverse, [\n        1,\n        0,\n        0,\n        1,\n        ownerBBox[0],\n        ownerBBox[1],\n      ]);\n\n      tmpCtx.transform(...owner.baseTransform);\n      if (this.matrix) {\n        tmpCtx.transform(...this.matrix);\n      }\n      applyBoundingBox(tmpCtx, this._bbox);\n\n      if (this.areConic()) {\n        tmpCtx.fillStyle = this._createReversedGradient(tmpCtx);\n        tmpCtx.fill();\n      }\n      tmpCtx.fillStyle = this._createGradient(tmpCtx);\n      tmpCtx.fill();\n\n      pattern = ctx.createPattern(tmpCanvas.canvas, \"no-repeat\");\n      owner.canvasFactory.destroy(tmpCanvas);\n      const domMatrix = new DOMMatrix(inverse);\n      pattern.setTransform(domMatrix);\n    } else {\n      // Shading fills are applied relative to the current matrix which is also\n      // how canvas gradients work, so there's no need to do anything special\n      // here.\n      if (this.areConic()) {\n        // Draw the reversed gradient first so the normal gradient can\n        // correctly overlay it (see _isCircleCenterOutside for details).\n        ctx.save();\n        applyBoundingBox(ctx, this._bbox);\n        ctx.fillStyle = this._createReversedGradient(ctx);\n        ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n        ctx.restore();\n      }\n      applyBoundingBox(ctx, this._bbox);\n      pattern = this._createGradient(ctx);\n    }\n    return pattern;\n  }\n}\n\nfunction drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n  // Very basic Gouraud-shaded triangle rasterization algorithm.\n  const coords = context.coords,\n    colors = context.colors;\n  const bytes = data.data,\n    rowSize = data.width * 4;\n  let tmp;\n  if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) {\n    tmp = p1;\n    p1 = p2;\n    p2 = tmp;\n    tmp = c1;\n    c1 = c2;\n    c2 = tmp;\n  }\n  if (coords[p2 * 2 + 1] > coords[p3 * 2 + 1]) {\n    tmp = p2;\n    p2 = p3;\n    p3 = tmp;\n    tmp = c2;\n    c2 = c3;\n    c3 = tmp;\n  }\n  if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) {\n    tmp = p1;\n    p1 = p2;\n    p2 = tmp;\n    tmp = c1;\n    c1 = c2;\n    c2 = tmp;\n  }\n  const x1 = (coords[p1 * 2] + context.offsetX) * context.scaleX;\n  const y1 = (coords[p1 * 2 + 1] + context.offsetY) * context.scaleY;\n  const x2 = (coords[p2 * 2] + context.offsetX) * context.scaleX;\n  const y2 = (coords[p2 * 2 + 1] + context.offsetY) * context.scaleY;\n  const x3 = (coords[p3 * 2] + context.offsetX) * context.scaleX;\n  const y3 = (coords[p3 * 2 + 1] + context.offsetY) * context.scaleY;\n  if (y1 >= y3) {\n    return;\n  }\n  const c1r = colors[c1 * 4],\n    c1g = colors[c1 * 4 + 1],\n    c1b = colors[c1 * 4 + 2];\n  const c2r = colors[c2 * 4],\n    c2g = colors[c2 * 4 + 1],\n    c2b = colors[c2 * 4 + 2];\n  const c3r = colors[c3 * 4],\n    c3g = colors[c3 * 4 + 1],\n    c3b = colors[c3 * 4 + 2];\n\n  const minY = Math.round(y1),\n    maxY = Math.round(y3);\n  let xa, car, cag, cab;\n  let xb, cbr, cbg, cbb;\n  for (let y = minY; y <= maxY; y++) {\n    if (y < y2) {\n      const k = y < y1 ? 0 : (y1 - y) / (y1 - y2);\n      xa = x1 - (x1 - x2) * k;\n      car = c1r - (c1r - c2r) * k;\n      cag = c1g - (c1g - c2g) * k;\n      cab = c1b - (c1b - c2b) * k;\n    } else {\n      let k;\n      if (y > y3) {\n        k = 1;\n      } else if (y2 === y3) {\n        k = 0;\n      } else {\n        k = (y2 - y) / (y2 - y3);\n      }\n      xa = x2 - (x2 - x3) * k;\n      car = c2r - (c2r - c3r) * k;\n      cag = c2g - (c2g - c3g) * k;\n      cab = c2b - (c2b - c3b) * k;\n    }\n\n    let k;\n    if (y < y1) {\n      k = 0;\n    } else if (y > y3) {\n      k = 1;\n    } else {\n      k = (y1 - y) / (y1 - y3);\n    }\n    xb = x1 - (x1 - x3) * k;\n    cbr = c1r - (c1r - c3r) * k;\n    cbg = c1g - (c1g - c3g) * k;\n    cbb = c1b - (c1b - c3b) * k;\n    const x1_ = Math.round(Math.min(xa, xb));\n    const x2_ = Math.round(Math.max(xa, xb));\n    let j = rowSize * y + x1_ * 4;\n    for (let x = x1_; x <= x2_; x++) {\n      k = (xa - x) / (xa - xb);\n      if (k < 0) {\n        k = 0;\n      } else if (k > 1) {\n        k = 1;\n      }\n      bytes[j++] = (car - (car - cbr) * k) | 0;\n      bytes[j++] = (cag - (cag - cbg) * k) | 0;\n      bytes[j++] = (cab - (cab - cbb) * k) | 0;\n      bytes[j++] = 255;\n    }\n  }\n}\n\nclass MeshShadingPattern extends BaseShadingPattern {\n  constructor(IR) {\n    super();\n    this._posData = IR[2];\n    this._colData = IR[3];\n    this._vertexCount = IR[4];\n    this._bounds = IR[5];\n    this._bbox = IR[6];\n    this._background = IR[7];\n    this.matrix = null;\n    // Pre-compile the mesh pipeline now that we know GPU-renderable content\n    // is present; no-op if the GPU is not available or already compiled.\n    loadMeshShader();\n  }\n\n  _createMeshCanvas(combinedScale, backgroundColor, canvasFactory) {\n    // we will increase scale on some weird factor to let antialiasing take\n    // care of \"rough\" edges\n    const EXPECTED_SCALE = 1.1;\n    // MAX_PATTERN_SIZE is used to avoid OOM situation.\n    const MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n    // We need to keep transparent border around our pattern for fill():\n    // createPattern with 'no-repeat' will bleed edges across entire area.\n    const BORDER_SIZE = 2;\n\n    const offsetX = Math.floor(this._bounds[0]);\n    const offsetY = Math.floor(this._bounds[1]);\n    const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;\n    const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;\n\n    // Ensure that the shading has non-zero width and height, to prevent errors\n    // in `pattern_helper.js` (fixes issue17848.pdf).\n    const width =\n      Math.min(\n        Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)),\n        MAX_PATTERN_SIZE\n      ) || 1;\n    const height =\n      Math.min(\n        Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)),\n        MAX_PATTERN_SIZE\n      ) || 1;\n    const scaleX = boundsWidth ? boundsWidth / width : 1;\n    const scaleY = boundsHeight ? boundsHeight / height : 1;\n\n    const context = {\n      coords: this._posData,\n      colors: this._colData,\n      offsetX: -offsetX,\n      offsetY: -offsetY,\n      scaleX: 1 / scaleX,\n      scaleY: 1 / scaleY,\n    };\n\n    const paddedWidth = width + BORDER_SIZE * 2;\n    const paddedHeight = height + BORDER_SIZE * 2;\n    const tmpCanvas = canvasFactory.create(paddedWidth, paddedHeight);\n\n    // Use the GPU path when there are more than 16 triangles (> 48 vertices).\n    // With small meshes the GPU overhead is significant and the CPU path is\n    // faster. The texture has to move from the GPU to the main thread and it's\n    // costly. So it's frequent to have a lot of mesh-based shading patterns\n    // when rendering some 3D surfaces (see bug 2030745).\n    if (isGPUReady() && this._vertexCount > 48) {\n      tmpCanvas.context.drawImage(\n        drawMeshWithGPU(\n          this._posData,\n          this._colData,\n          this._vertexCount,\n          context,\n          backgroundColor,\n          paddedWidth,\n          paddedHeight,\n          BORDER_SIZE\n        ),\n        0,\n        0\n      );\n    } else {\n      const data = tmpCanvas.context.createImageData(width, height);\n      if (backgroundColor) {\n        const bytes = data.data;\n        for (let i = 0, ii = bytes.length; i < ii; i += 4) {\n          bytes[i] = backgroundColor[0];\n          bytes[i + 1] = backgroundColor[1];\n          bytes[i + 2] = backgroundColor[2];\n          bytes[i + 3] = 255;\n        }\n      }\n      for (let i = 0, ii = this._vertexCount; i < ii; i += 3) {\n        drawTriangle(data, context, i, i + 1, i + 2, i, i + 1, i + 2);\n      }\n      tmpCanvas.context.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n    }\n\n    return {\n      canvas: tmpCanvas.canvas,\n      offsetX: offsetX - BORDER_SIZE * scaleX,\n      offsetY: offsetY - BORDER_SIZE * scaleY,\n      scaleX,\n      scaleY,\n    };\n  }\n\n  isModifyingCurrentTransform() {\n    return true;\n  }\n\n  getPattern(ctx, owner, inverse, pathType) {\n    applyBoundingBox(ctx, this._bbox);\n    const scale = new Float32Array(2);\n    if (pathType === PathType.SHADING) {\n      Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale);\n    } else if (this.matrix) {\n      // Obtain scale from matrix and current transformation matrix.\n      Util.singularValueDecompose2dScale(this.matrix, scale);\n      const [matrixScaleX, matrixScaleY] = scale;\n      Util.singularValueDecompose2dScale(owner.baseTransform, scale);\n      scale[0] *= matrixScaleX;\n      scale[1] *= matrixScaleY;\n    } else {\n      Util.singularValueDecompose2dScale(owner.baseTransform, scale);\n    }\n\n    // Rasterizing on the main thread since sending/queue large canvases\n    // might cause OOM.\n    const temporaryPatternCanvas = this._createMeshCanvas(\n      scale,\n      pathType === PathType.SHADING ? null : this._background,\n      owner.canvasFactory\n    );\n\n    if (pathType !== PathType.SHADING) {\n      ctx.setTransform(...owner.baseTransform);\n      if (this.matrix) {\n        ctx.transform(...this.matrix);\n      }\n    }\n\n    ctx.translate(\n      temporaryPatternCanvas.offsetX,\n      temporaryPatternCanvas.offsetY\n    );\n    ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n\n    const pattern = ctx.createPattern(\n      temporaryPatternCanvas.canvas,\n      \"no-repeat\"\n    );\n    owner.canvasFactory.destroy(temporaryPatternCanvas);\n    return pattern;\n  }\n}\n\nclass DummyShadingPattern extends BaseShadingPattern {\n  getPattern() {\n    return \"hotpink\";\n  }\n}\n\nfunction getShadingPattern(IR) {\n  switch (IR[0]) {\n    case \"RadialAxial\":\n      return new RadialAxialShadingPattern(IR);\n    case \"Mesh\":\n      return new MeshShadingPattern(IR);\n    case \"Dummy\":\n      return new DummyShadingPattern();\n  }\n  throw new Error(`Unknown IR type: ${IR[0]}`);\n}\n\nconst PaintType = {\n  COLORED: 1,\n  UNCOLORED: 2,\n};\n\nclass TilingPattern {\n  // 10in @ 300dpi shall be enough.\n  static MAX_PATTERN_SIZE = 3000;\n\n  constructor(IR, ctx, canvasGraphicsFactory, baseTransform) {\n    this.color = IR[1];\n    this.operatorList = IR[2];\n    this.matrix = IR[3];\n    this.bbox = IR[4];\n    this.xstep = IR[5];\n    this.ystep = IR[6];\n    this.paintType = IR[7];\n    this.tilingType = IR[8];\n    this.needsIsolation = IR[9] ?? true;\n    this.ctx = ctx;\n    this.canvasGraphicsFactory = canvasGraphicsFactory;\n    this.baseTransform = baseTransform;\n    // baseTransform * patternMatrix.\n    this.patternBaseMatrix = this.matrix\n      ? Util.transform(baseTransform, this.matrix)\n      : baseTransform;\n  }\n\n  // Returns [n, m] tile index if the fill area fits within one tile,\n  // null otherwise.\n  canSkipPatternCanvas([width, height, offsetX, offsetY]) {\n    const [x0, y0, x1, y1] = this.bbox;\n    const absXStep = Math.abs(this.xstep);\n    const absYStep = Math.abs(this.ystep);\n\n    // dims is in pattern space, so compare directly with xstep/ystep.\n    if (width > absXStep + 1e-6 || height > absYStep + 1e-6) {\n      return null;\n    }\n\n    // Tile n covers [x0+n路xstep, x1+n路xstep]; find the range intersecting\n    // [offsetX, offsetX+width].\n    const nXFirst = Math.floor((offsetX - x1) / absXStep) + 1;\n    const nXLast = Math.ceil((offsetX + width - x0) / absXStep) - 1;\n    const nYFirst = Math.floor((offsetY - y1) / absYStep) + 1;\n    const nYLast = Math.ceil((offsetY + height - y0) / absYStep) - 1;\n    return nXLast <= nXFirst && nYLast <= nYFirst ? [nXFirst, nYFirst] : null;\n  }\n\n  // Converts clippedBBox from device space to pattern space and stores it\n  // as [width, height, offsetX, offsetY] in dims.\n  updatePatternDims(clippedBBox, dims) {\n    const inv = Util.inverseTransform(this.patternBaseMatrix);\n    const c1 = [clippedBBox[0], clippedBBox[1]];\n    const c2 = [clippedBBox[2], clippedBBox[3]];\n    Util.applyTransform(c1, inv);\n    Util.applyTransform(c2, inv);\n    dims[0] = Math.abs(c2[0] - c1[0]);\n    dims[1] = Math.abs(c2[1] - c1[1]);\n    dims[2] = Math.min(c1[0], c2[0]);\n    dims[3] = Math.min(c1[1], c2[1]);\n  }\n\n  // Renders the tile operators onto a fresh canvas and returns it.\n  _renderTileCanvas(owner, opIdx, dimx, dimy) {\n    const [x0, y0, x1, y1] = this.bbox;\n    const tmpCanvas = owner.canvasFactory.create(dimx.size, dimy.size);\n    const tmpCtx = tmpCanvas.context;\n    const graphics = this.canvasGraphicsFactory.createCanvasGraphics(\n      tmpCtx,\n      opIdx\n    );\n    graphics.groupLevel = owner.groupLevel;\n\n    this.setFillAndStrokeStyleToContext(graphics, this.paintType, this.color);\n\n    tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0);\n    // 0: sub-ops are indexed under the top-level opIdx from\n    // createCanvasGraphics.\n    graphics.transform(0, dimx.scale, 0, 0, dimy.scale, 0, 0);\n\n    // Required to balance the save/restore in CanvasGraphics beginDrawing.\n    tmpCtx.save();\n    graphics.dependencyTracker?.save();\n\n    this.clipBbox(graphics, x0, y0, x1, y1);\n    graphics.baseTransform = getCurrentTransform(graphics.ctx);\n    graphics.executeOperatorList(this.operatorList);\n\n    graphics.endDrawing();\n    graphics.dependencyTracker?.restore();\n    tmpCtx.restore();\n\n    return tmpCanvas;\n  }\n\n  _getCombinedScales() {\n    const scale = new Float32Array(2);\n    Util.singularValueDecompose2dScale(this.matrix, scale);\n    const [matrixScaleX, matrixScaleY] = scale;\n    Util.singularValueDecompose2dScale(this.baseTransform, scale);\n    return [matrixScaleX * scale[0], matrixScaleY * scale[1]];\n  }\n\n  // Draws a single tile directly onto owner, clipped to path.\n  drawPattern(owner, path, useEOFill = false, [n, m], opIdx) {\n    const [x0, y0, x1, y1] = this.bbox;\n\n    const dependencyTracker = owner.dependencyTracker;\n    if (dependencyTracker) {\n      owner.dependencyTracker = new CanvasNestedDependencyTracker(\n        dependencyTracker,\n        opIdx\n      );\n    }\n\n    owner.save();\n    if (useEOFill) {\n      owner.ctx.clip(path, \"evenodd\");\n    } else {\n      owner.ctx.clip(path);\n    }\n    // Position tile (n, m) in device space; the clip above is unaffected\n    // by setTransform.\n    owner.ctx.setTransform(...this.patternBaseMatrix);\n    owner.ctx.translate(n * this.xstep, m * this.ystep);\n    if (\n      this.needsIsolation ||\n      owner.ctx.globalAlpha !== 1 ||\n      owner.ctx.globalCompositeOperation !== \"source-over\" ||\n      owner.inSMaskMode\n    ) {\n      const bboxWidth = x1 - x0;\n      const bboxHeight = y1 - y0;\n      const [combinedScaleX, combinedScaleY] = this._getCombinedScales();\n      const dimx = this.getSizeAndScale(\n        bboxWidth,\n        this.ctx.canvas.width,\n        combinedScaleX\n      );\n      const dimy = this.getSizeAndScale(\n        bboxHeight,\n        this.ctx.canvas.height,\n        combinedScaleY\n      );\n      // Isolate blend modes from the main canvas.\n      const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy);\n      owner.ctx.drawImage(tmpCanvas.canvas, x0, y0, bboxWidth, bboxHeight);\n      owner.canvasFactory.destroy(tmpCanvas);\n    } else {\n      // No blend modes or transparency: render the tile directly onto owner.\n      this.setFillAndStrokeStyleToContext(owner, this.paintType, this.color);\n      this.clipBbox(owner, x0, y0, x1, y1);\n      owner.baseTransformStack.push(owner.baseTransform);\n      owner.baseTransform = getCurrentTransform(owner.ctx);\n      owner.executeOperatorList(this.operatorList);\n      owner.baseTransform = owner.baseTransformStack.pop();\n    }\n\n    owner.restore();\n    if (dependencyTracker) {\n      owner.dependencyTracker = dependencyTracker;\n    }\n  }\n\n  createPatternCanvas(owner, opIdx) {\n    const [x0, y0, x1, y1] = this.bbox;\n    const width = x1 - x0;\n    const height = y1 - y0;\n    let { xstep, ystep } = this;\n    xstep = Math.abs(xstep);\n    ystep = Math.abs(ystep);\n\n    info(\"TilingType: \" + this.tilingType);\n\n    // A tiling pattern as defined by PDF spec 8.7.2 is a cell whose size is\n    // described by bbox, and may repeat regularly by shifting the cell by\n    // xstep and ystep.\n    // Because the HTML5 canvas API does not support pattern repetition with\n    // gaps in between, we use the xstep/ystep instead of the bbox's size.\n    //\n    // This has the following consequences (similarly for ystep):\n    //\n    // - If xstep is the same as bbox, then there is no observable difference.\n    //\n    // - If xstep is larger than bbox, then the pattern canvas is partially\n    //   empty: the area bounded by bbox is painted, the outside area is void.\n    //\n    // - If xstep is smaller than bbox, then the pixels between xstep and the\n    //   bbox boundary will be missing. This is INCORRECT behavior.\n    //   \"Figures on adjacent tiles should not overlap\" (PDF spec 8.7.3.1),\n    //   but overlapping cells without common pixels are still valid.\n\n    // Obtain scale from matrix and current transformation matrix.\n    const [combinedScaleX, combinedScaleY] = this._getCombinedScales();\n\n    // Use width and height values that are as close as possible to the end\n    // result when the pattern is used. Too low value makes the pattern look\n    // blurry. Too large value makes it look too crispy.\n    let canvasWidth = width,\n      canvasHeight = height,\n      redrawHorizontally = false,\n      redrawVertically = false;\n\n    if (\n      Math.ceil(xstep * combinedScaleX) >= Math.ceil(width * combinedScaleX)\n    ) {\n      canvasWidth = xstep;\n    } else {\n      redrawHorizontally = true;\n    }\n    if (\n      Math.ceil(ystep * combinedScaleY) >= Math.ceil(height * combinedScaleY)\n    ) {\n      canvasHeight = ystep;\n    } else {\n      redrawVertically = true;\n    }\n\n    const dimx = this.getSizeAndScale(\n      canvasWidth,\n      this.ctx.canvas.width,\n      combinedScaleX\n    );\n    const dimy = this.getSizeAndScale(\n      canvasHeight,\n      this.ctx.canvas.height,\n      combinedScaleY\n    );\n\n    const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy);\n\n    if (redrawHorizontally || redrawVertically) {\n      // The tile is overlapping itself, so we create a new tile with\n      // dimensions xstep * ystep.\n      // Then we draw the overlapping parts of the original tile on the new\n      // tile.\n      // Just as a side note, the code here works correctly even if we don't\n      // have to redraw the tile horizontally or vertically. In that case, the\n      // original tile is drawn on the new tile only once, but it's useless.\n      const image = tmpCanvas.canvas;\n      if (redrawHorizontally) {\n        canvasWidth = xstep;\n      }\n      if (redrawVertically) {\n        canvasHeight = ystep;\n      }\n\n      const dimx2 = this.getSizeAndScale(\n        canvasWidth,\n        this.ctx.canvas.width,\n        combinedScaleX\n      );\n      const dimy2 = this.getSizeAndScale(\n        canvasHeight,\n        this.ctx.canvas.height,\n        combinedScaleY\n      );\n\n      const xSize = dimx2.size;\n      const ySize = dimy2.size;\n      const tmpCanvas2 = owner.canvasFactory.create(xSize, ySize);\n      const tmpCtx2 = tmpCanvas2.context;\n      const ii = redrawHorizontally ? Math.floor(width / xstep) : 0;\n      const jj = redrawVertically ? Math.floor(height / ystep) : 0;\n\n      // Draw the overlapping parts of the original tile on the new tile.\n      for (let i = 0; i <= ii; i++) {\n        for (let j = 0; j <= jj; j++) {\n          tmpCtx2.drawImage(\n            image,\n            xSize * i,\n            ySize * j,\n            xSize,\n            ySize,\n            0,\n            0,\n            xSize,\n            ySize\n          );\n        }\n      }\n      owner.canvasFactory.destroy(tmpCanvas);\n      return {\n        canvas: tmpCanvas2.canvas,\n        canvasEntry: tmpCanvas2,\n        scaleX: dimx2.scale,\n        scaleY: dimy2.scale,\n        offsetX: x0,\n        offsetY: y0,\n      };\n    }\n\n    return {\n      canvas: tmpCanvas.canvas,\n      canvasEntry: tmpCanvas,\n      scaleX: dimx.scale,\n      scaleY: dimy.scale,\n      offsetX: x0,\n      offsetY: y0,\n    };\n  }\n\n  getSizeAndScale(step, realOutputSize, scale) {\n    // MAX_PATTERN_SIZE is used to avoid OOM situation.\n    // Use the destination canvas's size if it is bigger than the hard-coded\n    // limit of MAX_PATTERN_SIZE to avoid clipping patterns that cover the\n    // whole canvas.\n    const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);\n    let size = Math.ceil(step * scale);\n    if (size >= maxSize) {\n      size = maxSize;\n    } else {\n      scale = size / step;\n    }\n    return { scale, size };\n  }\n\n  clipBbox(graphics, x0, y0, x1, y1) {\n    const bboxWidth = x1 - x0;\n    const bboxHeight = y1 - y0;\n    const clip = new Path2D();\n    clip.rect(x0, y0, bboxWidth, bboxHeight);\n    Util.axialAlignedBoundingBox(\n      [x0, y0, x1, y1],\n      getCurrentTransform(graphics.ctx),\n      graphics.current.minMax\n    );\n    graphics.ctx.clip(clip);\n    graphics.current.updateClipFromPath();\n  }\n\n  setFillAndStrokeStyleToContext(graphics, paintType, color) {\n    const context = graphics.ctx,\n      current = graphics.current;\n    current.patternFill = current.patternStroke = false;\n    switch (paintType) {\n      case PaintType.COLORED:\n        const { fillStyle, strokeStyle } = this.ctx;\n        context.fillStyle = current.fillColor = fillStyle;\n        context.strokeStyle = current.strokeColor = strokeStyle;\n        break;\n      case PaintType.UNCOLORED:\n        context.fillStyle = context.strokeStyle = color;\n        // Set color needed by image masks (fixes issues 3226 and 8741).\n        current.fillColor = current.strokeColor = color;\n        break;\n      default:\n        throw new FormatError(`Unsupported paint type: ${paintType}`);\n    }\n  }\n\n  isModifyingCurrentTransform() {\n    return false;\n  }\n\n  getPattern(ctx, owner, inverse, pathType, opIdx) {\n    // PDF spec 8.7.2: prepend inverse CTM to patternBaseMatrix to position\n    // the CSS pattern.\n    const matrix =\n      pathType !== PathType.SHADING\n        ? Util.transform(inverse, this.patternBaseMatrix)\n        : inverse;\n\n    const temporaryPatternCanvas = this.createPatternCanvas(owner, opIdx);\n\n    let domMatrix = new DOMMatrix(matrix);\n    // Rescale and so that the ctx.createPattern call generates a pattern with\n    // the desired size.\n    domMatrix = domMatrix.translate(\n      temporaryPatternCanvas.offsetX,\n      temporaryPatternCanvas.offsetY\n    );\n    domMatrix = domMatrix.scale(\n      1 / temporaryPatternCanvas.scaleX,\n      1 / temporaryPatternCanvas.scaleY\n    );\n\n    const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, \"repeat\");\n    owner.canvasFactory.destroy(temporaryPatternCanvas.canvasEntry);\n    pattern.setTransform(domMatrix);\n\n    return pattern;\n  }\n}\n\nexport { getShadingPattern, PathType, TilingPattern };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  CanvasNestedDependencyTracker,\n  Dependencies,\n} from \"./canvas_dependency_tracker.js\";\nimport {\n  convertBlackAndWhiteToRGBA,\n  convertRGBToRGBA,\n} from \"../shared/image_utils.js\";\nimport {\n  F32_BBOX_INIT,\n  FeatureTest,\n  FONT_IDENTITY_MATRIX,\n  ImageKind,\n  info,\n  makeArr,\n  makeMap,\n  OPS,\n  shadow,\n  TextRenderingMode,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  getCurrentTransform,\n  getCurrentTransformInverse,\n  getRGBA,\n  makePathFromDrawOPS,\n  OutputScale,\n  PixelsPerInch,\n} from \"./display_utils.js\";\nimport {\n  getShadingPattern,\n  PathType,\n  TilingPattern,\n} from \"./pattern_helper.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\n// <canvas> contexts store most of the state we need natively.\n// However, PDF needs a bit more state, which we store here.\n// Minimal font size that would be used during canvas fillText operations.\nconst MIN_FONT_SIZE = 16;\n// Maximum font size that would be used during canvas fillText operations.\nconst MAX_FONT_SIZE = 100;\n\n// Defines the time the `executeOperatorList`-method is going to be executing\n// before it stops and schedules a continue of execution.\nconst EXECUTION_TIME = 15; // ms\n// Defines the number of steps before checking the execution time.\nconst EXECUTION_STEPS = 10;\n\nconst FULL_CHUNK_HEIGHT = 16;\n\n// Only used in rescaleAndStroke. The goal is to avoid\n// creating a new DOMMatrix object each time we need it.\nconst SCALE_MATRIX = new DOMMatrix();\n\n// Used to get some coordinates.\nconst XY = new Float32Array(2);\n\n/**\n * Overrides certain methods on a 2d ctx so that when they are called they\n * will also call the same method on the destCtx. The methods that are\n * overridden are all the transformation state modifiers, path creation, and\n * save/restore. We only forward these specific methods because they are the\n * only state modifiers that we cannot copy over when we switch contexts.\n *\n * To remove mirroring call `ctx._removeMirroring()`.\n *\n * @param {Object} ctx - The 2d canvas context that will duplicate its calls on\n *   the destCtx.\n * @param {Object} destCtx - The 2d canvas context that will receive the\n *   forwarded calls.\n */\nfunction mirrorContextOperations(ctx, destCtx) {\n  if (ctx._removeMirroring) {\n    throw new Error(\"Context is already forwarding operations.\");\n  }\n  const originalMethods = new Map();\n  for (const name of [\n    \"save\",\n    \"restore\",\n    \"rotate\",\n    \"scale\",\n    \"translate\",\n    \"transform\",\n    \"setTransform\",\n    \"resetTransform\",\n    \"clip\",\n    \"moveTo\",\n    \"lineTo\",\n    \"bezierCurveTo\",\n    \"quadraticCurveTo\",\n    \"arc\",\n    \"arcTo\",\n    \"ellipse\",\n    \"rect\",\n    \"roundRect\",\n    \"closePath\",\n    \"beginPath\",\n  ]) {\n    const original = ctx[name];\n    if (typeof original !== \"function\" || typeof destCtx[name] !== \"function\") {\n      continue;\n    }\n    originalMethods.set(name, original);\n    ctx[name] = function (...args) {\n      destCtx[name](...args);\n      return original.apply(this, args);\n    };\n  }\n\n  ctx._removeMirroring = () => {\n    for (const [name, original] of originalMethods) {\n      ctx[name] = original;\n    }\n    delete ctx._removeMirroring;\n  };\n}\n\nfunction drawImageAtIntegerCoords(\n  ctx,\n  srcImg,\n  srcX,\n  srcY,\n  srcW,\n  srcH,\n  destX,\n  destY,\n  destW,\n  destH\n) {\n  const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);\n  if (b === 0 && c === 0) {\n    // top-left corner is at (X, Y) and\n    // bottom-right one is at (X + width, Y + height).\n\n    // If leftX is 4.321 then it's rounded to 4.\n    // If width is 10.432 then it's rounded to 11 because\n    // rightX = leftX + width = 14.753 which is rounded to 15\n    // so after rounding the total width is 11 (15 - 4).\n    // It's why we can't just floor/ceil uniformly, it just depends\n    // on the values we've.\n\n    const tlX = destX * a + tx;\n    const rTlX = Math.round(tlX);\n    const tlY = destY * d + ty;\n    const rTlY = Math.round(tlY);\n    const brX = (destX + destW) * a + tx;\n\n    // Some pdf contains images with 1x1 images so in case of 0-width after\n    // scaling we must fallback on 1 to be sure there is something.\n    const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n    const brY = (destY + destH) * d + ty;\n    const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n    // We must apply a transformation in order to apply it on the image itself.\n    // For example if a == 1 && d == -1, it means that the image itself is\n    // mirrored w.r.t. the x-axis.\n    ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);\n    ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);\n    ctx.setTransform(a, b, c, d, tx, ty);\n\n    return [rWidth, rHeight];\n  }\n\n  if (a === 0 && d === 0) {\n    // This path is taken in issue9462.pdf (page 3).\n    const tlX = destY * c + tx;\n    const rTlX = Math.round(tlX);\n    const tlY = destX * b + ty;\n    const rTlY = Math.round(tlY);\n    const brX = (destY + destH) * c + tx;\n    const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n    const brY = (destX + destW) * b + ty;\n    const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n    ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);\n    ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);\n    ctx.setTransform(a, b, c, d, tx, ty);\n\n    return [rHeight, rWidth];\n  }\n\n  // Not a scale matrix so let the render handle the case without rounding.\n  ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);\n\n  const scaleX = Math.hypot(a, b);\n  const scaleY = Math.hypot(c, d);\n  return [scaleX * destW, scaleY * destH];\n}\n\nclass CanvasExtraState {\n  // Are soft masks and alpha values shapes or opacities?\n  alphaIsShape = false;\n\n  fontSize = 0;\n\n  fontSizeScale = 1;\n\n  textMatrix = null;\n\n  textMatrixScale = 1;\n\n  fontMatrix = FONT_IDENTITY_MATRIX;\n\n  leading = 0;\n\n  // Current point (in user coordinates)\n  x = 0;\n\n  y = 0;\n\n  // Start of text line (in text coordinates)\n  lineX = 0;\n\n  lineY = 0;\n\n  // Character and word spacing\n  charSpacing = 0;\n\n  wordSpacing = 0;\n\n  textHScale = 1;\n\n  textRenderingMode = TextRenderingMode.FILL;\n\n  textRise = 0;\n\n  // Default fore and background colors\n  fillColor = \"#000000\";\n\n  strokeColor = \"#000000\";\n\n  tilingPatternDims = null;\n\n  patternFill = false;\n\n  patternStroke = false;\n\n  // Note: fill alpha applies to all non-stroking operations\n  fillAlpha = 1;\n\n  strokeAlpha = 1;\n\n  lineWidth = 1;\n\n  activeSMask = null;\n\n  transferMaps = \"none\";\n\n  minMax = F32_BBOX_INIT.slice();\n\n  constructor(width, height) {\n    this.clipBox = new Float32Array([0, 0, width, height]);\n  }\n\n  clone() {\n    const clone = Object.create(this);\n    clone.clipBox = this.clipBox.slice();\n    clone.minMax = this.minMax.slice();\n    clone.tilingPatternDims = this.tilingPatternDims?.slice();\n    return clone;\n  }\n\n  getPathBoundingBox(pathType = PathType.FILL, transform = null) {\n    const box = this.minMax.slice();\n    if (pathType === PathType.STROKE) {\n      if (!transform) {\n        unreachable(\"Stroke bounding box must include transform.\");\n      }\n      // Stroked paths can be outside of the path bounding box by 1/2 the line\n      // width.\n      Util.singularValueDecompose2dScale(transform, XY);\n      const xStrokePad = (XY[0] * this.lineWidth) / 2;\n      const yStrokePad = (XY[1] * this.lineWidth) / 2;\n      box[0] -= xStrokePad;\n      box[1] -= yStrokePad;\n      box[2] += xStrokePad;\n      box[3] += yStrokePad;\n    }\n    return box;\n  }\n\n  updateClipFromPath() {\n    const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox());\n    this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);\n  }\n\n  isEmptyClip() {\n    return this.minMax[0] === Infinity;\n  }\n\n  startNewPathAndClipBox(box) {\n    this.clipBox.set(box, 0);\n    this.minMax.set(F32_BBOX_INIT, 0);\n  }\n\n  getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) {\n    return Util.intersect(\n      this.clipBox,\n      this.getPathBoundingBox(pathType, transform)\n    );\n  }\n}\n\nfunction putBinaryImageData(ctx, imgData) {\n  // Put the image data to the canvas in chunks, rather than putting the\n  // whole image at once.  This saves JS memory, because the ImageData object\n  // is smaller. It also possibly saves C++ memory within the implementation\n  // of putImageData(). (E.g. in Firefox we make two short-lived copies of\n  // the data passed to putImageData()). |n| shouldn't be too small, however,\n  // because too many putImageData() calls will slow things down.\n  //\n  // Note: as written, if the last chunk is partial, the putImageData() call\n  // will (conceptually) put pixels past the bounds of the canvas.  But\n  // that's ok; any such pixels are ignored.\n\n  const { width, height, kind } = imgData;\n  const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n  const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n  const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n  const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n  let srcPos = 0;\n  const src = imgData.data;\n  const dest = chunkImgData.data;\n  let i;\n\n  // There are multiple forms in which the pixel data can be passed, and\n  // imgData.kind tells us which one this is.\n  if (kind === ImageKind.GRAYSCALE_1BPP) {\n    // Grayscale, 1 bit per pixel (i.e. black-and-white).\n    for (i = 0; i < totalChunks; i++) {\n      ({ srcPos } = convertBlackAndWhiteToRGBA({\n        src,\n        srcPos,\n        dest,\n        width,\n        height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight,\n      }));\n\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  } else if (kind === ImageKind.RGBA_32BPP) {\n    // RGBA, 32-bits per pixel.\n    let j = 0;\n    let elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n    for (i = 0; i < fullChunks; i++) {\n      dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n      srcPos += elemsInThisChunk;\n\n      ctx.putImageData(chunkImgData, 0, j);\n      j += FULL_CHUNK_HEIGHT;\n    }\n    if (i < totalChunks) {\n      elemsInThisChunk = width * partialChunkHeight * 4;\n      dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n\n      ctx.putImageData(chunkImgData, 0, j);\n    }\n  } else if (kind === ImageKind.RGB_24BPP) {\n    // RGB, 24-bits per pixel.\n    for (i = 0; i < totalChunks; i++) {\n      ({ srcPos } = convertRGBToRGBA({\n        src,\n        srcPos,\n        dest: new Uint32Array(dest.buffer),\n        width,\n        height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight,\n      }));\n\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  } else {\n    throw new Error(`bad image kind: ${kind}`);\n  }\n}\n\nfunction putBinaryImageMask(ctx, imgData) {\n  if (imgData.bitmap) {\n    // The bitmap has been created in the worker.\n    ctx.drawImage(imgData.bitmap, 0, 0);\n    return;\n  }\n\n  // Slow path: OffscreenCanvas isn't available in the worker.\n  const { width, height } = imgData;\n  const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n  const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n  const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n  const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n  let srcPos = 0;\n  const src = imgData.data;\n  const dest = chunkImgData.data;\n\n  for (let i = 0; i < totalChunks; i++) {\n    // Expand the mask so it can be used by the canvas.  Any required\n    // inversion has already been handled.\n    ({ srcPos } = convertBlackAndWhiteToRGBA({\n      src,\n      srcPos,\n      dest,\n      width,\n      height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight,\n      nonBlackColor: 0,\n    }));\n\n    ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n  }\n}\n\nfunction copyCtxState(sourceCtx, destCtx) {\n  const properties = [\n    \"strokeStyle\",\n    \"fillStyle\",\n    \"fillRule\",\n    \"globalAlpha\",\n    \"lineWidth\",\n    \"lineCap\",\n    \"lineJoin\",\n    \"miterLimit\",\n    \"globalCompositeOperation\",\n    \"font\",\n    \"filter\",\n  ];\n  for (const property of properties) {\n    if (sourceCtx[property] !== undefined) {\n      destCtx[property] = sourceCtx[property];\n    }\n  }\n  if (sourceCtx.setLineDash !== undefined) {\n    destCtx.setLineDash(sourceCtx.getLineDash());\n    destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n  }\n}\n\nfunction resetCtxToDefault(ctx) {\n  ctx.strokeStyle = ctx.fillStyle = \"#000000\";\n  ctx.fillRule = \"nonzero\";\n  ctx.globalAlpha = 1;\n  ctx.lineWidth = 1;\n  ctx.lineCap = \"butt\";\n  ctx.lineJoin = \"miter\";\n  ctx.miterLimit = 10;\n  ctx.globalCompositeOperation = \"source-over\";\n  ctx.font = \"10px sans-serif\";\n  if (ctx.setLineDash !== undefined) {\n    ctx.setLineDash([]);\n    ctx.lineDashOffset = 0;\n  }\n  const { filter } = ctx;\n  if (filter !== \"none\" && filter !== \"\") {\n    ctx.filter = \"none\";\n  }\n}\n\nfunction getImageSmoothingEnabled(transform, interpolate) {\n  // In section 8.9.5.3 of the PDF spec, it's mentioned that the interpolate\n  // flag should be used when the image is upscaled.\n  // In Firefox, smoothing is always used when downscaling images (bug 1360415).\n\n  if (interpolate) {\n    return true;\n  }\n\n  Util.singularValueDecompose2dScale(transform, XY);\n  // Round to a 32bit float so that `<=` check below will pass for numbers that\n  // are very close, but not exactly the same 64bit floats.\n  const actualScale = Math.fround(\n    OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS\n  );\n  // `XY` is a Float32Array.\n  return XY[0] <= actualScale && XY[1] <= actualScale;\n}\n\nconst LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\nconst LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\nconst NORMAL_CLIP = {};\nconst EO_CLIP = {};\n\nclass CanvasGraphics {\n  // Knockout group support fields.\n  #knockoutGroupLevel = 0;\n\n  #knockoutElementDepth = 0;\n\n  #knockoutTempCanvasEntry = null;\n\n  #knockoutSavedCtx = null;\n\n  #knockoutSavedSMaskCtx = null;\n\n  // Parent ctx globalCompositeOperation (GCO) at element start. Restored on\n  // tempCtx before the post-element copyCtxState so the saved ctx keeps its\n  // blend mode.\n  #knockoutSavedGCO = null;\n\n  #knockoutElementAlpha = 1;\n\n  /**\n   * Lazy alpha-scaling filter cache, populated on the first translucent\n   * knockout element. One of:\n   *   - `Map<alpha, url>` - when `ctx.filter` is supported; one SVG filter\n   *     per quantised alpha_s value (cache bounded by 8-bit alpha precision).\n   *   - `\"none\"` - no DOM available; the JS pixel-loop fallback handles\n   *     scaling instead.\n   * Stays `undefined` until the first translucent element forces a resolve.\n   * @type {Map<number, string> | \"none\" | undefined}\n   */\n  #knockoutFilterCache;\n\n  // Snapshot of #groupStackMeta.at(-1) at element-begin so the right backdrop\n  // is used even if nested groups push/pop during the element's lifetime.\n  #knockoutElementGroupMeta = null;\n\n  // Per-group metadata, aligned with `groupStack`. `null` for the no-canvas\n  // fast path. Otherwise: `backdropCtx` (parent ctx for non-isolated KO,\n  // read directly since it's frozen), `hasInnerBackdrop` (non-isolated\n  // non-KO subgroup inside a KO parent), `savedKnockoutLevel` (level to\n  // restore on exit), pixel offsets, and pooled scratch entries.\n  #groupStackMeta = [];\n\n  constructor(\n    canvasCtx,\n    commonObjs,\n    objs,\n    canvasFactory,\n    filterFactory,\n    { optionalContentConfig, markedContentStack = null },\n    annotationCanvasMap,\n    pageColors,\n    dependencyTracker,\n    imagesTracker\n  ) {\n    this.ctx = canvasCtx;\n    this.current = new CanvasExtraState(\n      this.ctx.canvas.width,\n      this.ctx.canvas.height\n    );\n    this.stateStack = [];\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.canvasFactory = canvasFactory;\n    this.filterFactory = filterFactory;\n    this.groupStack = [];\n    // Patterns are painted relative to the initial page/form transform, see\n    // PDF spec 8.7.2 NOTE 1.\n    this.baseTransform = null;\n    this.baseTransformStack = [];\n    this.groupLevel = 0;\n    this.smaskStack = [];\n    this.tempSMask = null;\n    this.smaskGroupCanvases = [];\n    this.smaskPreparedEntry = null;\n    this.smaskPreparedFor = null;\n    this.smaskPreparedOffsetX = 0;\n    this.smaskPreparedOffsetY = 0;\n    // For mask-size prebakes with non-zero OOB alpha, the constant\n    // alpha applied to OOB pixels (dirty box outside the mask canvas)\n    // at compose time. Null when no compose-time OOB work is needed:\n    //   - layer-size prebake bakes OOB inline; or\n    //   - OOB alpha is 0 and destination-in's transparent source\n    //     samples clear OOB layer pixels for free.\n    // Compose-time behavior splits on this:\n    //   null         -> clip = full dirty box; OOB cleared or baked.\n    //   255          -> clip excludes OOB; OOB survives unchanged.\n    //   intermediate -> clip excludes OOB, then a fade pass applies\n    //                   this constant alpha.\n    this.smaskPreparedOOBAlpha = null;\n    this.suspendedCtx = null;\n    this.contentVisible = true;\n    this.markedContentStack = markedContentStack || [];\n    this.optionalContentConfig = optionalContentConfig;\n    this.cachedPatterns = new Map();\n    this.annotationCanvasMap = annotationCanvasMap;\n    this.viewportScale = 1;\n    this.outputScaleX = 1;\n    this.outputScaleY = 1;\n    this.pageColors = pageColors;\n\n    this._cachedScaleForStroking = [-1, 0];\n    this._cachedGetSinglePixelWidth = null;\n    this._cachedBitmapsMap = new Map();\n\n    this.dependencyTracker = dependencyTracker ?? null;\n    this.imagesTracker = imagesTracker ?? null;\n  }\n\n  getObject(opIdx, data, fallback = null) {\n    if (typeof data === \"string\") {\n      this.dependencyTracker?.recordNamedDependency(opIdx, data);\n      return data.startsWith(\"g_\")\n        ? this.commonObjs.get(data)\n        : this.objs.get(data);\n    }\n    return fallback;\n  }\n\n  beginDrawing({\n    transform,\n    viewport,\n    transparency = false,\n    background = null,\n  }) {\n    // For pdfs that use blend modes we have to clear the canvas else certain\n    // blend modes can look wrong since we'd be blending with a white\n    // backdrop. The problem with a transparent backdrop though is we then\n    // don't get sub pixel anti aliasing on text, creating temporary\n    // transparent canvas when we have blend modes.\n    const width = this.ctx.canvas.width;\n    const height = this.ctx.canvas.height;\n\n    const savedFillStyle = this.ctx.fillStyle;\n    this.ctx.fillStyle = background || \"#ffffff\";\n    this.ctx.fillRect(0, 0, width, height);\n    this.ctx.fillStyle = savedFillStyle;\n\n    if (transparency) {\n      const transparentCanvas = (this.transparentCanvasEntry =\n        this.canvasFactory.create(width, height));\n      this.compositeCtx = this.ctx;\n      ({ canvas: this.transparentCanvas, context: this.ctx } =\n        transparentCanvas);\n      this.ctx.save();\n      // The transform can be applied before rendering, transferring it to\n      // the new canvas.\n      this.ctx.transform(...getCurrentTransform(this.compositeCtx));\n    }\n\n    this.ctx.save();\n    resetCtxToDefault(this.ctx);\n    if (transform) {\n      this.ctx.transform(...transform);\n      this.outputScaleX = transform[0];\n      this.outputScaleY = transform[3];\n    }\n    this.ctx.transform(...viewport.transform);\n    this.viewportScale = viewport.scale;\n\n    this.baseTransform = getCurrentTransform(this.ctx);\n  }\n\n  executeOperatorList(\n    operatorList,\n    executionStartIdx,\n    continueCallback,\n    stepper,\n    operationsFilter\n  ) {\n    const argsArray = operatorList.argsArray;\n    const fnArray = operatorList.fnArray;\n    let i = executionStartIdx || 0;\n    const argsArrayLen = argsArray.length;\n\n    // Sometimes the OperatorList to execute is empty.\n    if (argsArrayLen === i) {\n      return i;\n    }\n\n    const chunkOperations =\n      argsArrayLen - i > EXECUTION_STEPS &&\n      typeof continueCallback === \"function\";\n    const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n    let steps = 0;\n\n    const commonObjs = this.commonObjs;\n    const objs = this.objs;\n    let fnId, fnArgs;\n\n    while (true) {\n      if (stepper !== undefined) {\n        if (i === stepper.nextBreakPoint) {\n          stepper.breakIt(i, continueCallback);\n          return i;\n        }\n        if (stepper.shouldSkip(i)) {\n          if (++i === argsArrayLen) {\n            return i;\n          }\n          continue;\n        }\n      }\n\n      if (!operationsFilter || operationsFilter(i)) {\n        fnId = fnArray[i];\n        // TODO: There is a `undefined` coming from somewhere.\n        fnArgs = argsArray[i] ?? null;\n\n        if (fnId !== OPS.dependency) {\n          if (fnArgs === null) {\n            this[fnId](i);\n          } else {\n            this[fnId](i, ...fnArgs);\n          }\n        } else {\n          for (const depObjId of fnArgs) {\n            this.dependencyTracker?.recordNamedData(depObjId, i);\n            const objsPool = depObjId.startsWith(\"g_\") ? commonObjs : objs;\n\n            // If the promise isn't resolved yet, add the continueCallback\n            // to the promise and bail out.\n            if (!objsPool.has(depObjId)) {\n              objsPool.get(depObjId, continueCallback);\n              return i;\n            }\n          }\n        }\n      }\n\n      i++;\n\n      // If the entire operatorList was executed, stop as were done.\n      if (i === argsArrayLen) {\n        return i;\n      }\n\n      // If the execution took longer then a certain amount of time and\n      // `continueCallback` is specified, interrupt the execution.\n      if (chunkOperations && ++steps > EXECUTION_STEPS) {\n        if (Date.now() > endTime) {\n          continueCallback();\n          return i;\n        }\n        steps = 0;\n      }\n\n      // If the operatorList isn't executed completely yet OR the execution\n      // time was short enough, do another execution round.\n    }\n  }\n\n  #restoreInitialState() {\n    // Finishing all opened operations such as SMask group painting.\n    while (this.stateStack.length || this.inSMaskMode) {\n      this.restore();\n    }\n\n    this.current.activeSMask = null;\n    this.ctx.restore();\n\n    if (this.transparentCanvas) {\n      this.ctx = this.compositeCtx;\n      this.ctx.save();\n      this.ctx.setTransform(1, 0, 0, 1, 0, 0); // Avoid apply transform twice\n      this.ctx.drawImage(this.transparentCanvas, 0, 0);\n      this.ctx.restore();\n      this.canvasFactory.destroy(this.transparentCanvasEntry);\n      this.transparentCanvas = null;\n      this.transparentCanvasEntry = null;\n    }\n  }\n\n  endDrawing() {\n    this.#restoreInitialState();\n\n    // Destroy all smask group canvases now that rendering is complete.\n    // These cannot be destroyed eagerly because activeSMask is part of\n    // CanvasExtraState and is shared (via Object.create prototype chain) across\n    // save/restore state copies.\n    for (const canvas of this.smaskGroupCanvases) {\n      this.canvasFactory.destroy(canvas);\n    }\n    this.smaskGroupCanvases.length = 0;\n    this._clearPreparedSMask();\n    this.tempSMask = null;\n    this.smaskStack.length = 0;\n\n    // Drop knockout state in case rendering was cancelled mid-group. Pooled\n    // temp/backdrop entries are owned by the meta and freed there; the\n    // active-element fields just alias into the meta, so only clear them.\n    for (const meta of this.#groupStackMeta) {\n      this.#destroyKnockoutPools(meta);\n    }\n    this.#groupStackMeta.length = 0;\n    this.#knockoutTempCanvasEntry = null;\n    this.#knockoutSavedCtx = null;\n    this.#knockoutSavedSMaskCtx = null;\n    this.#knockoutSavedGCO = null;\n    this.#knockoutElementAlpha = 1;\n    this.#knockoutElementGroupMeta = null;\n    this.#knockoutElementDepth = 0;\n    this.#knockoutGroupLevel = 0;\n\n    this.cachedPatterns.clear();\n\n    for (const cache of this._cachedBitmapsMap.values()) {\n      for (const canvas of cache.values()) {\n        if (\n          typeof HTMLCanvasElement !== \"undefined\" &&\n          canvas instanceof HTMLCanvasElement\n        ) {\n          canvas.width = canvas.height = 0;\n        }\n      }\n      cache.clear();\n    }\n    this._cachedBitmapsMap.clear();\n    this.#drawFilter();\n  }\n\n  #drawFilter() {\n    if (this.pageColors) {\n      const hcmFilterId = this.filterFactory.addHCMFilter(\n        this.pageColors.foreground,\n        this.pageColors.background\n      );\n      if (hcmFilterId !== \"none\") {\n        const savedFilter = this.ctx.filter;\n        this.ctx.filter = hcmFilterId;\n        this.ctx.drawImage(this.ctx.canvas, 0, 0);\n        this.ctx.filter = savedFilter;\n      }\n    }\n  }\n\n  _scaleImage(img, inverseTransform) {\n    // Vertical or horizontal scaling shall not be more than 2 to not lose the\n    // pixels during drawImage operation, painting on the temporary canvas(es)\n    // that are twice smaller in size.\n\n    // displayWidth and displayHeight are used for VideoFrame.\n    const width = img.width ?? img.displayWidth;\n    const height = img.height ?? img.displayHeight;\n    const widthScale = Math.max(\n      Math.hypot(inverseTransform[0], inverseTransform[1]),\n      1\n    );\n    const heightScale = Math.max(\n      Math.hypot(inverseTransform[2], inverseTransform[3]),\n      1\n    );\n\n    // Pre-compute each step's output dimensions.\n    const scaleSteps = [];\n    let ws = widthScale,\n      hs = heightScale,\n      pw = width,\n      ph = height;\n    while ((ws > 2 && pw > 1) || (hs > 2 && ph > 1)) {\n      let nw = pw,\n        nh = ph;\n      if (ws > 2 && pw > 1) {\n        nw = Math.ceil(pw / 2);\n        ws /= pw / nw;\n      }\n      if (hs > 2 && ph > 1) {\n        nh = Math.ceil(ph / 2);\n        hs /= ph / nh;\n      }\n      scaleSteps.push({ newWidth: nw, newHeight: nh });\n      pw = nw;\n      ph = nh;\n    }\n\n    if (scaleSteps.length === 0) {\n      return { img, paintWidth: width, paintHeight: height, tmpCanvas: null };\n    }\n\n    if (scaleSteps.length === 1) {\n      const { newWidth, newHeight } = scaleSteps[0];\n      const tmpCanvas = this.canvasFactory.create(newWidth, newHeight);\n      tmpCanvas.context.drawImage(\n        img,\n        0,\n        0,\n        width,\n        height,\n        0,\n        0,\n        newWidth,\n        newHeight\n      );\n      return {\n        img: tmpCanvas.canvas,\n        paintWidth: newWidth,\n        paintHeight: newHeight,\n        tmpCanvas,\n      };\n    }\n\n    // More than 2 steps: ping-pong between two reused canvas entries.\n    // canvasFactory.reset() resizes (and implicitly clears) a canvas without\n    // creating a new JS object or calling getContext() again.\n    let readEntry = this.canvasFactory.create(1, 1);\n    let writeEntry = this.canvasFactory.create(1, 1);\n    let paintWidth = width,\n      paintHeight = height;\n    let source = img;\n\n    for (const { newWidth, newHeight } of scaleSteps) {\n      this.canvasFactory.reset(writeEntry, newWidth, newHeight);\n      writeEntry.context.drawImage(\n        source,\n        0,\n        0,\n        paintWidth,\n        paintHeight,\n        0,\n        0,\n        newWidth,\n        newHeight\n      );\n      [readEntry, writeEntry] = [writeEntry, readEntry];\n      source = readEntry.canvas;\n      paintWidth = newWidth;\n      paintHeight = newHeight;\n    }\n\n    // writeEntry is now the stale buffer; destroy it.\n    this.canvasFactory.destroy(writeEntry);\n    return {\n      img: readEntry.canvas,\n      paintWidth,\n      paintHeight,\n      tmpCanvas: readEntry,\n    };\n  }\n\n  _createMaskCanvas(opIdx, img) {\n    const ctx = this.ctx;\n    const { width, height } = img;\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n    const currentTransform = getCurrentTransform(ctx);\n\n    let cache, cacheKey, scaled, maskCanvas;\n    if ((img.bitmap || img.data) && img.count > 1) {\n      const mainKey = img.bitmap || img.data.buffer;\n      // We're reusing the same image several times, so we can cache it.\n      // In case we've a pattern fill we just keep the scaled version of\n      // the image.\n      // Only the scaling part matters, the translation part is just used\n      // to compute offsets (but not when filling patterns see #15573).\n      // TODO: handle the case of a pattern fill if it's possible.\n      cacheKey = JSON.stringify(\n        isPatternFill\n          ? currentTransform\n          : [currentTransform.slice(0, 4), fillColor]\n      );\n\n      cache = this._cachedBitmapsMap.getOrInsertComputed(mainKey, makeMap);\n      const cachedImage = cache.get(cacheKey);\n      if (cachedImage && !isPatternFill) {\n        const offsetX = Math.round(\n          Math.min(currentTransform[0], currentTransform[2]) +\n            currentTransform[4]\n        );\n        const offsetY = Math.round(\n          Math.min(currentTransform[1], currentTransform[3]) +\n            currentTransform[5]\n        );\n\n        this.dependencyTracker?.recordDependencies(\n          opIdx,\n          Dependencies.transformAndFill\n        );\n        return {\n          canvas: cachedImage,\n          offsetX,\n          offsetY,\n        };\n      }\n      scaled = cachedImage;\n    }\n\n    if (!scaled) {\n      maskCanvas = this.canvasFactory.create(width, height);\n      putBinaryImageMask(maskCanvas.context, img);\n    }\n\n    // Create the mask canvas at the size it will be drawn at and also set\n    // its transform to match the current transform so if there are any\n    // patterns applied they will be applied relative to the correct\n    // transform.\n\n    let maskToCanvas = Util.transform(currentTransform, [\n      1 / width,\n      0,\n      0,\n      -1 / height,\n      0,\n      0,\n    ]);\n    maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);\n    const minMax = F32_BBOX_INIT.slice();\n    Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax);\n    const [minX, minY, maxX, maxY] = minMax;\n    const drawnWidth = Math.round(maxX - minX) || 1;\n    const drawnHeight = Math.round(maxY - minY) || 1;\n    const fillCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);\n    const fillCtx = fillCanvas.context;\n\n    // The offset will be the top-left coordinate mask.\n    // If objToCanvas is [a,b,c,d,e,f] then:\n    //   - offsetX = min(a, c) + e\n    //   - offsetY = min(b, d) + f\n    const offsetX = minX;\n    const offsetY = minY;\n    fillCtx.translate(-offsetX, -offsetY);\n    fillCtx.transform(...maskToCanvas);\n\n    let scaledEntry = null;\n    if (!scaled) {\n      // Pre-scale if needed to improve image smoothing.\n      const scaleResult = this._scaleImage(\n        maskCanvas.canvas,\n        getCurrentTransformInverse(fillCtx)\n      );\n      scaled = scaleResult.img;\n      scaledEntry = scaleResult.tmpCanvas;\n      if (scaled !== maskCanvas.canvas) {\n        // _scaleImage created a new canvas; maskCanvas is no longer needed.\n        this.canvasFactory.destroy(maskCanvas);\n        maskCanvas = null;\n      }\n      if (cache && isPatternFill) {\n        cache.set(cacheKey, scaled);\n        scaledEntry = null; // bitmap cache owns the canvas now\n        maskCanvas = null; // bitmap cache may own maskCanvas.canvas (= scaled)\n      }\n    }\n\n    fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(\n      getCurrentTransform(fillCtx),\n      img.interpolate\n    );\n\n    drawImageAtIntegerCoords(\n      fillCtx,\n      scaled,\n      0,\n      0,\n      scaled.width,\n      scaled.height,\n      0,\n      0,\n      width,\n      height\n    );\n    if (scaledEntry) {\n      this.canvasFactory.destroy(scaledEntry);\n    }\n    if (maskCanvas) {\n      // scaled === maskCanvas.canvas and not owned by the bitmap cache.\n      this.canvasFactory.destroy(maskCanvas);\n    }\n    fillCtx.globalCompositeOperation = \"source-in\";\n\n    const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [\n      1,\n      0,\n      0,\n      1,\n      -offsetX,\n      -offsetY,\n    ]);\n    fillCtx.fillStyle = isPatternFill\n      ? fillColor.getPattern(ctx, this, inverse, PathType.FILL, opIdx)\n      : fillColor;\n\n    fillCtx.fillRect(0, 0, width, height);\n\n    if (cache && !isPatternFill) {\n      // The fill canvas is put in the cache associated to the mask image\n      // so it mustn't be used again.\n      cache.set(cacheKey, fillCanvas.canvas);\n    }\n\n    this.dependencyTracker?.recordDependencies(\n      opIdx,\n      Dependencies.transformAndFill\n    );\n\n    // Round the offsets to avoid drawing fractional pixels.\n    return {\n      canvas: fillCanvas.canvas,\n      // canvasEntry is null when the bitmap cache owns the canvas.\n      canvasEntry: cache && !isPatternFill ? null : fillCanvas,\n      offsetX: Math.round(offsetX),\n      offsetY: Math.round(offsetY),\n    };\n  }\n\n  // Graphics state\n  setLineWidth(opIdx, width) {\n    this.dependencyTracker?.recordSimpleData(\"lineWidth\", opIdx);\n    if (width !== this.current.lineWidth) {\n      this._cachedScaleForStroking[0] = -1;\n    }\n    this.current.lineWidth = width;\n    this.ctx.lineWidth = width;\n  }\n\n  setLineCap(opIdx, style) {\n    this.dependencyTracker?.recordSimpleData(\"lineCap\", opIdx);\n    this.ctx.lineCap = LINE_CAP_STYLES[style];\n  }\n\n  setLineJoin(opIdx, style) {\n    this.dependencyTracker?.recordSimpleData(\"lineJoin\", opIdx);\n    this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n  }\n\n  setMiterLimit(opIdx, limit) {\n    this.dependencyTracker?.recordSimpleData(\"miterLimit\", opIdx);\n    this.ctx.miterLimit = limit;\n  }\n\n  setDash(opIdx, dashArray, dashPhase) {\n    this.dependencyTracker?.recordSimpleData(\"dash\", opIdx);\n    const ctx = this.ctx;\n    if (ctx.setLineDash !== undefined) {\n      ctx.setLineDash(dashArray);\n      ctx.lineDashOffset = dashPhase;\n    }\n  }\n\n  setRenderingIntent(opIdx, intent) {\n    // This operation is ignored since we haven't found a use case for it yet.\n  }\n\n  setFlatness(opIdx, flatness) {\n    // This operation is ignored since we haven't found a use case for it yet.\n  }\n\n  setGState(opIdx, states) {\n    for (const [key, value] of states) {\n      switch (key) {\n        case \"LW\":\n          this.setLineWidth(opIdx, value);\n          break;\n        case \"LC\":\n          this.setLineCap(opIdx, value);\n          break;\n        case \"LJ\":\n          this.setLineJoin(opIdx, value);\n          break;\n        case \"ML\":\n          this.setMiterLimit(opIdx, value);\n          break;\n        case \"D\":\n          this.setDash(opIdx, value[0], value[1]);\n          break;\n        case \"RI\":\n          this.setRenderingIntent(opIdx, value);\n          break;\n        case \"FL\":\n          this.setFlatness(opIdx, value);\n          break;\n        case \"Font\":\n          this.setFont(opIdx, value[0], value[1]);\n          break;\n        case \"CA\":\n          this.dependencyTracker?.recordSimpleData(\"strokeAlpha\", opIdx);\n          this.current.strokeAlpha = value;\n          break;\n        case \"ca\":\n          this.dependencyTracker?.recordSimpleData(\"fillAlpha\", opIdx);\n          this.ctx.globalAlpha = this.current.fillAlpha = value;\n          break;\n        case \"BM\":\n          this.dependencyTracker?.recordSimpleData(\n            \"globalCompositeOperation\",\n            opIdx\n          );\n          this.ctx.globalCompositeOperation = value;\n          break;\n        case \"SMask\":\n          this.dependencyTracker?.recordSimpleData(\"SMask\", opIdx);\n          this.current.activeSMask = value ? this.tempSMask : null;\n          if (this.current.activeSMask) {\n            // Save the current blend mode so that it can be applied when\n            // compositing the SMask result back to the main canvas.\n            this.current.activeSMask.blendMode =\n              this.ctx.globalCompositeOperation;\n          }\n          this.tempSMask = null;\n          this.checkSMaskState(opIdx);\n          break;\n        case \"TR\":\n          this.dependencyTracker?.recordSimpleData(\"filter\", opIdx);\n          this.ctx.filter = this.current.transferMaps =\n            this.filterFactory.addFilter(value);\n          break;\n      }\n    }\n  }\n\n  get inSMaskMode() {\n    return !!this.suspendedCtx;\n  }\n\n  _clearPreparedSMask() {\n    if (this.smaskPreparedEntry) {\n      this.canvasFactory.destroy(this.smaskPreparedEntry);\n      this.smaskPreparedEntry = null;\n    }\n    this.smaskPreparedFor = null;\n    this.smaskPreparedOffsetX = 0;\n    this.smaskPreparedOffsetY = 0;\n    this.smaskPreparedOOBAlpha = null;\n  }\n\n  _ensurePreparedSMask(smask) {\n    if (smask === this.smaskPreparedFor) {\n      return;\n    }\n    this._clearPreparedSMask();\n    this._prepareSMaskCanvas(smask);\n  }\n\n  checkSMaskState(opIdx) {\n    const inSMaskMode = this.inSMaskMode;\n    if (this.current.activeSMask && !inSMaskMode) {\n      this.beginSMaskMode(opIdx);\n    } else if (!this.current.activeSMask && inSMaskMode) {\n      this.endSMaskMode();\n    } else if (this.current.activeSMask && inSMaskMode) {\n      // The active SMask may have changed while SMask mode stayed active\n      // (e.g. a direct SMask A->B replacement, or a restore() that surfaces\n      // a different saved mask). _ensurePreparedSMask is a no-op when the\n      // same mask object is re-encountered.\n      this._ensurePreparedSMask(this.current.activeSMask);\n    }\n  }\n\n  _prepareSMaskCanvas(smask) {\n    const { canvas: maskCanvas, subtype, backdrop, transferMap } = smask;\n    const hasFilter =\n      subtype === \"Luminosity\" || (subtype === \"Alpha\" && transferMap);\n\n    // Nothing to amortize unless we have a filter or a Luminosity\n    // backdrop -- Alpha SMasks ignore /BC for the alpha output, and\n    // unknown subtypes have no defined backdrop semantics. Record the\n    // mask so checkSMaskState's identity check skips the rebuild path\n    // on subsequent restore()/setGState() calls.\n    if (!hasFilter && !(subtype === \"Luminosity\" && backdrop)) {\n      this.smaskPreparedFor = smask;\n      return;\n    }\n\n    // Constant alpha OOB pixels receive after the spec backdrop+filter\n    // chain (see smaskPreparedOOBAlpha field doc for the compose-time\n    // table). /BC only feeds the alpha output for Luminosity (its\n    // color enters the luminance computation). Alpha SMasks treat /BC\n    // as a pure color-space backdrop and must not bake it into the\n    // alpha output.\n    let filteredOOBAlpha;\n    if (subtype === \"Luminosity\" && backdrop) {\n      // backdrop is \"#RRGGBB\" (see Evaluator#handleSMask).\n      const [r, g, b] = getRGBA(backdrop);\n      const inputAlpha = Math.round(0.3 * r + 0.59 * g + 0.11 * b);\n      filteredOOBAlpha = transferMap?.[inputAlpha] ?? inputAlpha;\n    } else {\n      // Alpha, or Luminosity with no backdrop: OOB input is transparent,\n      // and both filters map alpha=0 to alpha=0; only transferMap[0] can\n      // produce a non-zero result.\n      filteredOOBAlpha = transferMap?.[0] ?? 0;\n    }\n\n    // Use a layer-size prebake when the layer is at most this many\n    // times bigger than the mask: layer-size avoids compose-time OOB\n    // work and hits the same-size drawImage GPU fast path, but the\n    // alloc cost grows with the layer. The crossover is empirical;\n    // tuned against the bug-2033095 corpus.\n    const SMASK_LAYER_TO_MASK_AREA_RATIO = 4;\n    const { width: layerW, height: layerH } = this.ctx.canvas;\n    const maskArea = maskCanvas.width * maskCanvas.height;\n    const useLayerSize =\n      layerW * layerH < SMASK_LAYER_TO_MASK_AREA_RATIO * maskArea;\n\n    // Bundle the filter URL with the spec needed for the pixel-buffer\n    // fallback (see _bakeSMaskCanvas). subtype + transferMap let the\n    // fallback reproduce the SVG filter without an extra round-trip\n    // through the filter factory.\n    const filterSpec = hasFilter\n      ? {\n          url:\n            subtype === \"Alpha\"\n              ? this.filterFactory.addAlphaFilter(transferMap)\n              : this.filterFactory.addLuminosityFilter(transferMap),\n          subtype,\n          transferMap,\n        }\n      : null;\n\n    // Alpha SMasks must not bake /BC into the prepared canvas (see\n    // filteredOOBAlpha comment above).\n    const bakedBackdrop = subtype === \"Luminosity\" ? backdrop : null;\n\n    let preparedEntry, offsetX, offsetY;\n    if (useLayerSize) {\n      preparedEntry = this._bakeSMaskCanvas(\n        maskCanvas,\n        smask.offsetX,\n        smask.offsetY,\n        layerW,\n        layerH,\n        bakedBackdrop,\n        filterSpec\n      );\n      offsetX = 0;\n      offsetY = 0;\n    } else {\n      preparedEntry = this._bakeSMaskCanvas(\n        maskCanvas,\n        0,\n        0,\n        maskCanvas.width,\n        maskCanvas.height,\n        bakedBackdrop,\n        filterSpec\n      );\n      offsetX = smask.offsetX;\n      offsetY = smask.offsetY;\n    }\n\n    this.smaskPreparedEntry = preparedEntry;\n    this.smaskPreparedFor = smask;\n    this.smaskPreparedOffsetX = offsetX;\n    this.smaskPreparedOffsetY = offsetY;\n    // Only mask-size prebakes with non-zero OOB alpha need compose-time\n    // OOB work (see field doc).\n    this.smaskPreparedOOBAlpha =\n      !useLayerSize && filteredOOBAlpha !== 0 ? filteredOOBAlpha : null;\n  }\n\n  /**\n   * Bake the mask plus optional backdrop into a (w x h) canvas with the\n   * mask drawn at (drawX, drawY), then optionally pipe through the SVG\n   * filter described by `filterSpec`. Returns the prepared canvas-\n   * factory entry.\n   *\n   * The backdrop fill uses destination-atop so transparent / partial-\n   * alpha pixels inside the mask see the backdrop *before* filtering\n   * (per PDF spec). Filtering the raw mask would yield filter(0)\n   * instead of filter(backdrop) -- wrong for \"keep\" Luminosity and for\n   * Alpha masks whose transferMap[255] differs from transferMap[0].\n   *\n   * In the no-backdrop layer-size case the OOB region of srcEntry\n   * stays transparent and the filter outputs filter(transparent) =\n   * transferMap[0], matching the spec's transparent extension of the\n   * mask group. No-backdrop mask-size prebakes have no OOB region;\n   * destination-in handles OOB at compose time.\n   *\n   * Some browsers (e.g. older Safari) silently ignore SVG `url(#id)`\n   * filters on a 2D canvas: the assignment is accepted but\n   * `ctx.filter` reads back as \"none\" and `drawImage` produces an\n   * unfiltered copy. We detect that and fall back to a pixel-buffer\n   * loop that reproduces the SVG filter exactly (matrix luminance and\n   * `feFuncA` transferMap, both with sRGB color-interpolation, i.e.\n   * straight on gamma-encoded byte values).\n   */\n  _bakeSMaskCanvas(maskCanvas, drawX, drawY, w, h, backdrop, filterSpec) {\n    if (!backdrop && !filterSpec) {\n      // Caller (_prepareSMaskCanvas) gates on this; without either,\n      // the prebake would just be a wasted copy of the mask.\n      unreachable(\"_bakeSMaskCanvas with neither backdrop nor filter\");\n    }\n    const srcEntry = this.canvasFactory.create(w, h);\n    const sCtx = srcEntry.context;\n    sCtx.drawImage(maskCanvas, drawX, drawY);\n    if (backdrop) {\n      sCtx.globalCompositeOperation = \"destination-atop\";\n      sCtx.fillStyle = backdrop;\n      sCtx.fillRect(0, 0, w, h);\n    }\n    if (!filterSpec) {\n      return srcEntry;\n    }\n    const preparedEntry = this.canvasFactory.create(w, h);\n    const pCtx = preparedEntry.context;\n    // Post-assign \"none\"/\"\" means the URL was rejected (Firefox\n    // normalizes accepted url(#id) to an absolute URL).\n    pCtx.filter = filterSpec.url;\n    const filterApplied =\n      FeatureTest.isCanvasFilterSupported &&\n      pCtx.filter !== \"none\" &&\n      pCtx.filter !== \"\";\n    pCtx.drawImage(srcEntry.canvas, 0, 0);\n    if (FeatureTest.isCanvasFilterSupported) {\n      pCtx.filter = \"none\";\n    }\n    if (!filterApplied) {\n      const img = pCtx.getImageData(0, 0, w, h);\n      const { data } = img;\n      const { transferMap } = filterSpec;\n      if (filterSpec.subtype === \"Luminosity\") {\n        for (let i = 0, ii = data.length; i < ii; i += 4) {\n          // Match #addLuminosityConversion: a' = 0.3*R + 0.59*G + 0.11*B,\n          // RGB -> 0; then optional transferMap on alpha.\n          const a =\n            (0.3 * data[i] + 0.59 * data[i + 1] + 0.11 * data[i + 2] + 0.5) | 0;\n          data[i] = data[i + 1] = data[i + 2] = 0;\n          data[i + 3] = transferMap?.[a] ?? a;\n        }\n      } else {\n        // Alpha: transferMap is guaranteed by _prepareSMaskCanvas's\n        // hasFilter gate.\n        for (let i = 3, ii = data.length; i < ii; i += 4) {\n          data[i] = transferMap[data[i]];\n        }\n      }\n      pCtx.putImageData(img, 0, 0);\n    }\n    this.canvasFactory.destroy(srcEntry);\n    return preparedEntry;\n  }\n\n  /**\n   * Replaces the current drawing canvas with a temporary scratch canvas and\n   * suspends the main context. Drawing operations on the scratch canvas are\n   * composited back via `compose()`. The scratch canvas mirrors many operations\n   * onto the suspended canvas to keep their graphics-state stacks in sync, so\n   * that clipping paths and transformations remain correct when soft mask mode\n   * ends.\n   */\n  beginSMaskMode(opIdx) {\n    if (this.inSMaskMode) {\n      throw new Error(\"beginSMaskMode called while already in smask mode\");\n    }\n    const { width: drawnWidth, height: drawnHeight } = this.ctx.canvas;\n    const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);\n    this.smaskScratchCanvas = scratchCanvas;\n    this.suspendedCtx = this.ctx;\n    const ctx = (this.ctx = scratchCanvas.context);\n    ctx.setTransform(this.suspendedCtx.getTransform());\n    copyCtxState(this.suspendedCtx, ctx);\n    mirrorContextOperations(ctx, this.suspendedCtx);\n\n    this._ensurePreparedSMask(this.current.activeSMask);\n\n    this.setGState(opIdx, [[\"BM\", \"source-over\"]]);\n  }\n\n  endSMaskMode() {\n    if (!this.inSMaskMode) {\n      throw new Error(\"endSMaskMode called while not in smask mode\");\n    }\n    // The soft mask is done, now restore the suspended canvas as the main\n    // drawing canvas.\n    this.ctx._removeMirroring();\n    copyCtxState(this.ctx, this.suspendedCtx);\n    this.ctx = this.suspendedCtx;\n\n    this.suspendedCtx = null;\n    this.canvasFactory.destroy(this.smaskScratchCanvas);\n    this.smaskScratchCanvas = null;\n    this._clearPreparedSMask();\n  }\n\n  #createKnockoutMaskCanvas(sourceCanvas, reuseEntry = null, alpha = 1) {\n    const { width, height } = sourceCanvas;\n    // reuseEntry is assumed to match sourceCanvas in size (all current call\n    // sites guarantee this); the mask is rebuilt in-place.\n    const maskEntry = reuseEntry ?? this.canvasFactory.create(width, height);\n    const maskCtx = maskEntry.context;\n    // Snap alpha_s to 8-bit precision: the painted alpha we're scaling is\n    // already 8-bit, so any finer-grained alpha_s is indistinguishable. Caps\n    // both the local Map and the filter-factory cache at <=256 entries\n    // regardless of how many distinct gstate alpha values the PDF uses.\n    alpha = Math.round(alpha * 255) / 255;\n    const needsAlphaScaling = alpha < 1;\n    if (needsAlphaScaling && this.#knockoutFilterCache === undefined) {\n      // On Safari `ctx.filter` is settable but inert: the filter URL would\n      // be stored without being applied, leaving the mask unscaled.\n      // Force the JS fallback there.\n      this.#knockoutFilterCache = FeatureTest.isCanvasFilterSupported\n        ? new Map()\n        : \"none\";\n    }\n    let knockoutFilter = \"none\";\n    if (needsAlphaScaling && this.#knockoutFilterCache instanceof Map) {\n      knockoutFilter = this.#knockoutFilterCache.getOrInsertComputed(\n        alpha,\n        () => this.filterFactory.addKnockoutFilter(alpha)\n      );\n    }\n\n    if (!needsAlphaScaling || knockoutFilter !== \"none\") {\n      // Reused entries may carry stale pixels. Avoid the\n      // globalCompositeOperation = \"copy\" + filter combo: that pair is\n      // browser-divergent.\n      if (reuseEntry) {\n        maskCtx.save();\n        maskCtx.setTransform(1, 0, 0, 1, 0, 0);\n        maskCtx.clearRect(0, 0, width, height);\n        maskCtx.restore();\n      }\n      maskCtx.filter = knockoutFilter;\n      maskCtx.drawImage(sourceCanvas, 0, 0);\n      maskCtx.filter = \"none\";\n      return maskEntry;\n    }\n\n    // No-DOM fallback (Node/embedded). Scale painted alpha back to shape\n    // coverage; color channels are irrelevant for destination-out/in.\n    const sourceData = sourceCanvas\n      .getContext(\"2d\", { willReadFrequently: true })\n      .getImageData(0, 0, width, height);\n    const maskData = maskCtx.createImageData(width, height);\n    const sourcePixels = sourceData.data,\n      maskPixels = maskData.data;\n    const alphaScale = alpha > 0 ? 1 / alpha : 1e6;\n    for (let i = 3, ii = sourcePixels.length; i < ii; i += 4) {\n      maskPixels[i] = Math.min(Math.round(sourcePixels[i] * alphaScale), 255);\n    }\n    maskCtx.putImageData(maskData, 0, 0);\n    return maskEntry;\n  }\n\n  #getOrCreatePooledEntry(meta, key, width, height) {\n    let entry = meta?.[key] ?? null;\n    if (\n      entry &&\n      (entry.canvas.width !== width || entry.canvas.height !== height)\n    ) {\n      this.canvasFactory.destroy(entry);\n      entry = null;\n    }\n    if (!entry) {\n      entry = this.canvasFactory.create(width, height);\n      if (meta) {\n        meta[key] = entry;\n      }\n      return entry;\n    }\n    // Reused entry: clear any stale pixels before the caller refills it.\n    const ctx = entry.context;\n    ctx.save();\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.clearRect(0, 0, width, height);\n    ctx.restore();\n    return entry;\n  }\n\n  #compositeKnockoutSurface(destCtx, surfaceCanvas, options = {}) {\n    const {\n      // Backdrop canvas for non-isolated groups, or null for isolated.\n      // Passed directly (no copy) since the parent canvas is frozen while\n      // the group renders.\n      backdropCanvas = null,\n      // Transform for destCtx before the final draw. Identity is correct\n      // when destCtx and surfaceCanvas share pixel coords (per-element\n      // path); pass currentMtx for the endGroup subgroup-into-parent path.\n      destTransform = [1, 0, 0, 1, 0, 0],\n      // Pixel origin within backdropCanvas of the region that maps onto\n      // surfaceCanvas. [0,0] when the backdrop is already pre-cropped;\n      // pass the (possibly compounded) group offsets in endGroup.\n      backdropOffset = [0, 0],\n      // Pool entry to refill in place for the knockout mask. Caller owns\n      // its lifetime when provided.\n      reuseMaskEntry = null,\n      // Group meta to pool the backdrop scratch on. Without it the scratch\n      // is allocated and destroyed locally.\n      poolMeta = null,\n      // Per-element surfaces already have alpha/filter baked in (defaults\n      // 1/\"none\"). Subgroup canvases don't, so endGroup passes the parent\n      // values to apply only at the final draw.\n      sourceAlpha = 1,\n      sourceFilter = \"none\",\n      knockoutAlpha = 1,\n    } = options;\n    const { width, height } = surfaceCanvas;\n    const knockoutMaskEntry = this.#createKnockoutMaskCanvas(\n      surfaceCanvas,\n      reuseMaskEntry,\n      knockoutAlpha\n    );\n    const sourceCompositeOperation = destCtx.globalCompositeOperation;\n\n    destCtx.save();\n    destCtx.setTransform(...destTransform);\n    destCtx.globalAlpha = 1;\n    if (FeatureTest.isCanvasFilterSupported) {\n      destCtx.filter = \"none\";\n    }\n\n    // Erase prior group content wherever the new surface has any coverage.\n    destCtx.globalCompositeOperation = \"destination-out\";\n    destCtx.drawImage(knockoutMaskEntry.canvas, 0, 0);\n\n    if (backdropCanvas) {\n      // Non-isolated: refill the just-erased footprint with the backdrop,\n      // pre-clipped to the same shape mask so non-element pixels stay\n      // transparent (otherwise sparse groups bleed the backdrop rect).\n      const [bx, by] = backdropOffset;\n      const backdropEntry = this.#getOrCreatePooledEntry(\n        poolMeta,\n        \"knockoutBackdropEntry\",\n        width,\n        height\n      );\n      const backdropCtx = backdropEntry.context;\n      backdropCtx.drawImage(\n        backdropCanvas,\n        bx,\n        by,\n        width,\n        height,\n        0,\n        0,\n        width,\n        height\n      );\n      backdropCtx.globalCompositeOperation = \"destination-in\";\n      backdropCtx.drawImage(knockoutMaskEntry.canvas, 0, 0);\n      // Reset the GCO so the pooled entry is in a known state for next use.\n      backdropCtx.globalCompositeOperation = \"source-over\";\n\n      destCtx.globalCompositeOperation = \"destination-over\";\n      destCtx.drawImage(backdropEntry.canvas, 0, 0);\n      if (!poolMeta) {\n        this.canvasFactory.destroy(backdropEntry);\n      }\n    }\n    destCtx.globalCompositeOperation = sourceCompositeOperation;\n    destCtx.globalAlpha = sourceAlpha;\n    if (FeatureTest.isCanvasFilterSupported) {\n      destCtx.filter = sourceFilter ?? \"none\";\n    }\n    destCtx.drawImage(surfaceCanvas, 0, 0);\n\n    destCtx.restore();\n    if (!reuseMaskEntry) {\n      this.canvasFactory.destroy(knockoutMaskEntry);\n    }\n  }\n\n  /**\n   * Begin a knockout element. In a KO group each element composites against\n   * the initial group backdrop (transparent if isolated, parent canvas if\n   * not) rather than against the running group result. We render onto a temp\n   * canvas; path/clip/transform ops are mirrored back to the group canvas so\n   * its state stays in sync for the next element.\n   *\n   * @returns {boolean} true if a knockout element was started.\n   */\n  #beginKnockoutElement(alpha = 1) {\n    if (\n      this.#knockoutGroupLevel === 0 ||\n      this.#knockoutElementDepth > 0 ||\n      !this.contentVisible\n    ) {\n      return false;\n    }\n    this.#knockoutElementDepth++;\n    this.#knockoutElementAlpha = alpha;\n    const groupMeta = this.#groupStackMeta.at(-1);\n    const { canvas } = this.ctx;\n    const tempEntry = this.#getOrCreatePooledEntry(\n      groupMeta,\n      \"knockoutTempEntry\",\n      canvas.width,\n      canvas.height\n    );\n    this.#knockoutTempCanvasEntry = tempEntry;\n    const tempCtx = tempEntry.context;\n    // Bracket-save before installing mirroring so #endKnockoutElement can\n    // restore() the pooled canvas to a clean clip+transform without\n    // propagating that save through the mirror.\n    tempCtx.save();\n    tempCtx.setTransform(this.ctx.getTransform());\n    copyCtxState(this.ctx, tempCtx);\n    // Force source-over for the element raster: the parent's blend mode is\n    // meant for the final composite back onto the group canvas (done by\n    // #compositeKnockoutSurface), not for drawing onto a transparent temp\n    // (e.g. multiply on alpha=0 zeros the element's colour). Stash the\n    // parent GCO and re-apply it on tempCtx before the post-element\n    // copyCtxState so the saved ctx keeps the parent blend mode.\n    this.#knockoutSavedGCO = tempCtx.globalCompositeOperation;\n    tempCtx.globalCompositeOperation = \"source-over\";\n    mirrorContextOperations(tempCtx, this.ctx);\n    this.#knockoutElementGroupMeta = groupMeta;\n    this.#knockoutSavedCtx = this.ctx;\n    this.#knockoutSavedSMaskCtx = this.suspendedCtx;\n    this.ctx = tempCtx;\n    if (this.inSMaskMode) {\n      this.suspendedCtx = tempCtx;\n    }\n    return true;\n  }\n\n  /**\n   * End a knockout element started by `#beginKnockoutElement`. Composites\n   * the rendered surface onto the group canvas with KO semantics: build a\n   * shape mask from the element (painted alpha scaled back to geometric\n   * coverage when alpha_s < 1), destination-out the group canvas over that\n   * mask, restore the initial backdrop into the cleared footprint\n   * (non-isolated only), then paint the element on top.\n   *\n   * @param {boolean} started - the value returned by `#beginKnockoutElement`.\n   */\n  #endKnockoutElement(started) {\n    if (!started) {\n      return;\n    }\n    const tempEntry = this.#knockoutTempCanvasEntry;\n    const savedCtx = this.#knockoutSavedCtx;\n    const savedSMaskCtx = this.#knockoutSavedSMaskCtx;\n    const tempCtx = tempEntry.context;\n    this.#knockoutTempCanvasEntry = null;\n    this.#knockoutSavedCtx = null;\n    this.#knockoutSavedSMaskCtx = null;\n    if (\n      this.inSMaskMode &&\n      this.suspendedCtx === tempCtx &&\n      this.ctx !== tempCtx\n    ) {\n      this.endSMaskMode();\n    }\n    if (this.inSMaskMode) {\n      this.suspendedCtx = savedSMaskCtx;\n    }\n    this.ctx._removeMirroring();\n    // Re-apply the parent GCO before copyCtxState writes it back to\n    // savedCtx so #compositeKnockoutSurface sees the original blend mode.\n    this.ctx.globalCompositeOperation = this.#knockoutSavedGCO;\n    this.#knockoutSavedGCO = null;\n    copyCtxState(this.ctx, savedCtx);\n    this.ctx = savedCtx;\n    const groupMeta = this.#knockoutElementGroupMeta;\n    this.#knockoutElementGroupMeta = null;\n    const knockoutAlpha = this.#knockoutElementAlpha;\n    this.#knockoutElementAlpha = 1;\n    try {\n      this.#compositeKnockoutSurface(\n        savedSMaskCtx ?? savedCtx,\n        tempEntry.canvas,\n        {\n          backdropCanvas: groupMeta?.backdropCtx?.canvas ?? null,\n          backdropOffset: groupMeta?.backdropCtx\n            ? [groupMeta.offsetX, groupMeta.offsetY]\n            : [0, 0],\n          reuseMaskEntry: groupMeta?.knockoutMaskEntry ?? null,\n          poolMeta: groupMeta,\n          knockoutAlpha,\n        }\n      );\n    } finally {\n      // Pop the begin-element bracket save so the pooled canvas re-enters\n      // with a clean clip+transform stack.\n      tempCtx.restore();\n      // Decrement only after the canvas is fully reset, so a re-entry from\n      // a compositing callback sees depth>0 and bails out.\n      this.#knockoutElementDepth--;\n      // Defensive: groupMeta is non-null in practice for any active KO\n      // element, but if it isn't we must release the unpooled entry.\n      if (!groupMeta) {\n        this.canvasFactory.destroy(tempEntry);\n      }\n    }\n  }\n\n  compose(dirtyBox) {\n    if (!this.current.activeSMask) {\n      return;\n    }\n\n    // Don't mutate the caller's box -- callers (e.g. consumePath) may\n    // hold on to it.\n    dirtyBox = dirtyBox\n      ? [\n          Math.floor(dirtyBox[0]),\n          Math.floor(dirtyBox[1]),\n          Math.ceil(dirtyBox[2]),\n          Math.ceil(dirtyBox[3]),\n        ]\n      : [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];\n    const smask = this.current.activeSMask;\n    const suspendedCtx = this.suspendedCtx;\n    const applySMaskInPlace =\n      this.#knockoutElementDepth > 0 && suspendedCtx === this.ctx;\n\n    this.composeSMask(\n      applySMaskInPlace ? null : suspendedCtx,\n      smask,\n      this.ctx,\n      dirtyBox\n    );\n    if (applySMaskInPlace) {\n      return;\n    }\n\n    // Clear the full scratch canvas, not just the dirty box. Pixels left\n    // outside dirtyBox can leak into a later compose() whose destination-in\n    // pass doesn't overwrite them, producing stale output -- this is what\n    // breaks `firefox-issue17779-partial` (issue #21276).\n    this.ctx.save();\n    this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n    this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n    this.ctx.restore();\n  }\n\n  composeSMask(ctx, smask, layerCtx, layerBox) {\n    const layerOffsetX = layerBox[0];\n    const layerOffsetY = layerBox[1];\n    const layerWidth = layerBox[2] - layerOffsetX;\n    const layerHeight = layerBox[3] - layerOffsetY;\n    if (layerWidth === 0 || layerHeight === 0) {\n      return;\n    }\n\n    const preparedEntry = this.smaskPreparedEntry;\n    if (preparedEntry) {\n      // Fast path: prepared-mask destination-in drawImage. See\n      // smaskPreparedOOBAlpha field doc for the OOB handling table.\n      let clipX = layerOffsetX;\n      let clipY = layerOffsetY;\n      let clipW = layerWidth;\n      let clipH = layerHeight;\n      const oobAlpha = this.smaskPreparedOOBAlpha;\n      const hasOOBAlpha = oobAlpha !== null;\n      if (hasOOBAlpha) {\n        clipX = Math.max(layerOffsetX, smask.offsetX);\n        clipY = Math.max(layerOffsetY, smask.offsetY);\n        const x1 = Math.min(\n          layerOffsetX + layerWidth,\n          smask.offsetX + smask.canvas.width\n        );\n        const y1 = Math.min(\n          layerOffsetY + layerHeight,\n          smask.offsetY + smask.canvas.height\n        );\n        clipW = x1 - clipX;\n        clipH = y1 - clipY;\n      }\n      if (clipW > 0 && clipH > 0) {\n        const srcX = clipX - this.smaskPreparedOffsetX;\n        const srcY = clipY - this.smaskPreparedOffsetY;\n        layerCtx.save();\n        layerCtx.globalAlpha = 1;\n        layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n        const clip = new Path2D();\n        clip.rect(clipX, clipY, clipW, clipH);\n        layerCtx.clip(clip);\n        layerCtx.globalCompositeOperation = \"destination-in\";\n        layerCtx.drawImage(\n          preparedEntry.canvas,\n          srcX,\n          srcY,\n          clipW,\n          clipH,\n          clipX,\n          clipY,\n          clipW,\n          clipH\n        );\n        layerCtx.restore();\n      }\n      if (hasOOBAlpha && oobAlpha < 255) {\n        this._applySMaskOOBAlpha(\n          layerCtx,\n          layerOffsetX,\n          layerOffsetY,\n          layerWidth,\n          layerHeight,\n          clipX,\n          clipY,\n          clipX + clipW,\n          clipY + clipH,\n          oobAlpha\n        );\n      }\n    } else {\n      this.genericComposeSMask(\n        smask,\n        layerCtx,\n        layerWidth,\n        layerHeight,\n        layerOffsetX,\n        layerOffsetY\n      );\n    }\n\n    if (!ctx) {\n      return;\n    }\n\n    ctx.save();\n    ctx.globalAlpha = 1;\n    ctx.globalCompositeOperation = smask.blendMode || \"source-over\";\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    // Blit only the dirty box -- the rest of the scratch canvas was\n    // cleared in compose().\n    ctx.drawImage(\n      layerCtx.canvas,\n      layerOffsetX,\n      layerOffsetY,\n      layerWidth,\n      layerHeight,\n      layerOffsetX,\n      layerOffsetY,\n      layerWidth,\n      layerHeight\n    );\n    ctx.restore();\n  }\n\n  /**\n   * Fade the dirty box's OOB region by a constant alpha. Called from\n   * composeSMask when smaskPreparedOOBAlpha is in (0, 255).\n   *\n   * destination-in clears every destination pixel outside the source's\n   * footprint, so four fillRects (one per strip) would each clear the\n   * others. Instead one fillRect covers the dirty box, restricted by\n   * an even-odd clip enclosing exactly (dirty_box XOR mask_region);\n   * within the clip the source covers everything so no \"outside\n   * source\" pixels exist.\n   */\n  _applySMaskOOBAlpha(\n    layerCtx,\n    layerOffsetX,\n    layerOffsetY,\n    layerWidth,\n    layerHeight,\n    maskX0,\n    maskY0,\n    maskX1,\n    maskY1,\n    alpha\n  ) {\n    const hasInnerCutout = maskX0 < maskX1 && maskY0 < maskY1;\n    if (\n      hasInnerCutout &&\n      maskX0 === layerOffsetX &&\n      maskY0 === layerOffsetY &&\n      maskX1 === layerOffsetX + layerWidth &&\n      maskY1 === layerOffsetY + layerHeight\n    ) {\n      // Dirty box is entirely inside the mask -- no OOB region to fade.\n      return;\n    }\n    const path = new Path2D();\n    path.rect(layerOffsetX, layerOffsetY, layerWidth, layerHeight);\n    if (hasInnerCutout) {\n      path.rect(maskX0, maskY0, maskX1 - maskX0, maskY1 - maskY0);\n    }\n\n    layerCtx.save();\n    layerCtx.globalAlpha = alpha / 255;\n    layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n    layerCtx.clip(path, \"evenodd\");\n    layerCtx.globalCompositeOperation = \"destination-in\";\n    // MUST be fully opaque -- destination-in scales dst_a by src_a, and\n    // globalAlpha must be the only thing scaling source alpha.\n    layerCtx.fillStyle = \"#000000\";\n    layerCtx.fillRect(layerOffsetX, layerOffsetY, layerWidth, layerHeight);\n    layerCtx.restore();\n  }\n\n  genericComposeSMask(\n    smask,\n    layerCtx,\n    width,\n    height,\n    layerOffsetX,\n    layerOffsetY\n  ) {\n    // composeSMask helper, reached only for plain-alpha masks (no\n    // filter, no backdrop); every backdrop/filter case prebakes in\n    // _prepareSMaskCanvas. A single destination-in blit suffices:\n    // transparent OOB mask samples clear OOB layer pixels.\n    const {\n      context: maskCtx,\n      offsetX: maskOffsetX,\n      offsetY: maskOffsetY,\n    } = smask;\n\n    layerCtx.save();\n    layerCtx.globalAlpha = 1;\n    layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n    const clip = new Path2D();\n    clip.rect(layerOffsetX, layerOffsetY, width, height);\n    layerCtx.clip(clip);\n    layerCtx.globalCompositeOperation = \"destination-in\";\n    layerCtx.drawImage(\n      maskCtx.canvas,\n      layerOffsetX - maskOffsetX,\n      layerOffsetY - maskOffsetY,\n      width,\n      height,\n      layerOffsetX,\n      layerOffsetY,\n      width,\n      height\n    );\n    layerCtx.restore();\n  }\n\n  save(opIdx) {\n    if (this.inSMaskMode) {\n      // SMask mode may be turned on/off causing us to lose graphics state.\n      // Copy the temporary canvas state to the main(suspended) canvas to keep\n      // it in sync.\n      copyCtxState(this.ctx, this.suspendedCtx);\n    }\n    this.ctx.save();\n    const old = this.current;\n    this.stateStack.push(old);\n    this.current = old.clone();\n    this.dependencyTracker?.save(opIdx);\n  }\n\n  restore(opIdx) {\n    this.dependencyTracker?.restore(opIdx);\n\n    if (this.stateStack.length === 0) {\n      if (this.inSMaskMode) {\n        this.endSMaskMode();\n      }\n      return;\n    }\n\n    this.current = this.stateStack.pop();\n    this.ctx.restore();\n    if (this.inSMaskMode) {\n      // Graphics state is stored on the main(suspended) canvas. Restore its\n      // state then copy it over to the temporary canvas.\n      copyCtxState(this.suspendedCtx, this.ctx);\n      // The scratch canvas may have been freshly created by beginSMaskMode\n      // (called from checkSMaskState during a previous endGroup), in which\n      // case its save/restore stack is empty and ctx.restore() above was a\n      // no-op. Explicitly sync the CTM from the main canvas so that any CTM\n      // change that the mirrored restore applied to the main canvas is also\n      // reflected on the scratch canvas.\n      this.ctx.setTransform(this.suspendedCtx.getTransform());\n    }\n    this.checkSMaskState(opIdx);\n\n    // Ensure that the clipping path is reset (fixes issue6413.pdf).\n    this.pendingClip = null;\n\n    this._cachedScaleForStroking[0] = -1;\n    this._cachedGetSinglePixelWidth = null;\n  }\n\n  transform(opIdx, a, b, c, d, e, f) {\n    this.dependencyTracker?.recordIncrementalData(\"transform\", opIdx);\n    this.ctx.transform(a, b, c, d, e, f);\n\n    this._cachedScaleForStroking[0] = -1;\n    this._cachedGetSinglePixelWidth = null;\n  }\n\n  // Path\n  constructPath(opIdx, op, data, minMax) {\n    let [path] = data;\n    if (!minMax) {\n      // The path is empty, so no need to update the current minMax.\n      path ||= data[0] = new Path2D();\n      if (op !== OPS.stroke && op !== OPS.closeStroke) {\n        this.current.tilingPatternDims = null;\n      }\n      this[op](opIdx, path);\n      return;\n    }\n\n    if (this.dependencyTracker !== null) {\n      const outerExtraSize = op === OPS.stroke ? this.current.lineWidth / 2 : 0;\n      this.dependencyTracker\n        .resetBBox(opIdx)\n        .recordBBox(\n          opIdx,\n          this.ctx,\n          minMax[0] - outerExtraSize,\n          minMax[2] + outerExtraSize,\n          minMax[1] - outerExtraSize,\n          minMax[3] + outerExtraSize\n        )\n        .recordDependencies(opIdx, [\"transform\"]);\n    }\n\n    if (!(path instanceof Path2D)) {\n      path = data[0] = makePathFromDrawOPS(path);\n    }\n    Util.axialAlignedBoundingBox(\n      minMax,\n      getCurrentTransform(this.ctx),\n      this.current.minMax\n    );\n\n    const tilingDims = this.current.tilingPatternDims;\n    if (\n      tilingDims &&\n      op !== OPS.stroke &&\n      op !== OPS.closeStroke &&\n      this.current.fillColor instanceof TilingPattern\n    ) {\n      // Intersect with clip box to get the actual fill area, then convert\n      // to pattern space.\n      const clippedBBox = Util.intersect(\n        this.current.clipBox,\n        this.current.minMax\n      );\n      if (!clippedBBox) {\n        this.current.tilingPatternDims = null;\n      } else {\n        this.current.fillColor.updatePatternDims(clippedBBox, tilingDims);\n      }\n    }\n\n    this[op](opIdx, path);\n\n    this._pathStartIdx = opIdx;\n  }\n\n  closePath(opIdx) {\n    this.ctx.closePath();\n  }\n\n  stroke(opIdx, path, consumePath = true) {\n    const started =\n      consumePath && this.#beginKnockoutElement(this.current.strokeAlpha);\n    const ctx = this.ctx;\n    const strokeColor = this.current.strokeColor;\n    // For stroke we want to temporarily change the global alpha to the\n    // stroking alpha.\n    ctx.globalAlpha = this.current.strokeAlpha;\n    if (this.contentVisible) {\n      if (typeof strokeColor === \"object\" && strokeColor?.getPattern) {\n        const baseTransform = strokeColor.isModifyingCurrentTransform()\n          ? ctx.getTransform()\n          : null;\n        ctx.save();\n        ctx.strokeStyle = strokeColor.getPattern(\n          ctx,\n          this,\n          getCurrentTransformInverse(ctx),\n          PathType.STROKE,\n          opIdx\n        );\n        if (baseTransform) {\n          const newPath = new Path2D();\n          newPath.addPath(\n            path,\n            ctx.getTransform().invertSelf().multiplySelf(baseTransform)\n          );\n          path = newPath;\n        }\n        this.rescaleAndStroke(path, /* saveRestore */ false);\n        ctx.restore();\n      } else {\n        this.rescaleAndStroke(path, /* saveRestore */ true);\n      }\n    }\n\n    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.stroke);\n\n    if (consumePath) {\n      this.consumePath(\n        opIdx,\n        path,\n        this.current.getClippedPathBoundingBox(\n          PathType.STROKE,\n          getCurrentTransform(this.ctx)\n        )\n      );\n    }\n\n    // Restore the global alpha to the fill alpha\n    ctx.globalAlpha = this.current.fillAlpha;\n    this.#endKnockoutElement(started);\n  }\n\n  closeStroke(opIdx, path) {\n    this.stroke(opIdx, path);\n  }\n\n  fill(opIdx, path, consumePath = true) {\n    const started =\n      consumePath && this.#beginKnockoutElement(this.current.fillAlpha);\n    const ctx = this.ctx;\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n    let needRestore = false;\n    const intersect = this.current.getClippedPathBoundingBox();\n\n    this.dependencyTracker?.recordDependencies(opIdx, Dependencies.fill);\n\n    if (isPatternFill) {\n      const dims = this.current.tilingPatternDims;\n      const tileIdx = dims && fillColor.canSkipPatternCanvas(dims);\n      if (tileIdx) {\n        // Draw the tile directly, skipping the pattern canvas.\n        fillColor.drawPattern(this, path, this.pendingEOFill, tileIdx, opIdx);\n        this.pendingEOFill = false;\n        if (consumePath) {\n          this.consumePath(opIdx, path, intersect);\n        }\n        this.current.tilingPatternDims = null;\n        this.#endKnockoutElement(started);\n        return;\n      }\n      const baseTransform = fillColor.isModifyingCurrentTransform()\n        ? ctx.getTransform()\n        : null;\n      this.dependencyTracker?.save(opIdx);\n      ctx.save();\n      ctx.fillStyle = fillColor.getPattern(\n        ctx,\n        this,\n        getCurrentTransformInverse(ctx),\n        PathType.FILL,\n        opIdx\n      );\n      if (baseTransform) {\n        const newPath = new Path2D();\n        newPath.addPath(\n          path,\n          ctx.getTransform().invertSelf().multiplySelf(baseTransform)\n        );\n        path = newPath;\n      }\n      needRestore = true;\n    }\n\n    if (this.contentVisible && intersect !== null) {\n      if (this.pendingEOFill) {\n        ctx.fill(path, \"evenodd\");\n        this.pendingEOFill = false;\n      } else {\n        ctx.fill(path);\n      }\n    }\n\n    if (needRestore) {\n      ctx.restore();\n      this.dependencyTracker?.restore(opIdx);\n    }\n    if (consumePath) {\n      this.consumePath(opIdx, path, intersect);\n    }\n    this.#endKnockoutElement(started);\n  }\n\n  eoFill(opIdx, path) {\n    this.pendingEOFill = true;\n    this.fill(opIdx, path);\n  }\n\n  fillStroke(opIdx, path) {\n    // Fill and stroke share one KO element so they composite against the\n    // initial backdrop once, not twice. Use the smaller of the two alpha_s as\n    // the mask divisor: it's conservative (over-clamps the other pass's\n    // mask towards 1) but keeps the mask coverage at least as large as the\n    // union of fill+stroke shapes, which is what KO erasure wants.\n    const started = this.#beginKnockoutElement(\n      Math.min(this.current.fillAlpha, this.current.strokeAlpha)\n    );\n    this.fill(opIdx, path, false);\n    this.stroke(opIdx, path, false);\n    this.consumePath(opIdx, path);\n    this.#endKnockoutElement(started);\n  }\n\n  eoFillStroke(opIdx, path) {\n    this.pendingEOFill = true;\n    this.fillStroke(opIdx, path);\n  }\n\n  closeFillStroke(opIdx, path) {\n    this.fillStroke(opIdx, path);\n  }\n\n  closeEOFillStroke(opIdx, path) {\n    this.pendingEOFill = true;\n    this.fillStroke(opIdx, path);\n  }\n\n  endPath(opIdx, path) {\n    this.consumePath(opIdx, path);\n  }\n\n  rawFillPath(opIdx, path) {\n    const started = this.#beginKnockoutElement(this.current.fillAlpha);\n    this.ctx.fill(path);\n    this.dependencyTracker\n      ?.recordDependencies(opIdx, Dependencies.rawFillPath)\n      .recordOperation(opIdx);\n    this.#endKnockoutElement(started);\n  }\n\n  // Clipping\n  clip(opIdx) {\n    this.dependencyTracker?.recordFutureForcedDependency(\"clipMode\", opIdx);\n    this.pendingClip = NORMAL_CLIP;\n  }\n\n  eoClip(opIdx) {\n    this.dependencyTracker?.recordFutureForcedDependency(\"clipMode\", opIdx);\n    this.pendingClip = EO_CLIP;\n  }\n\n  // Text\n  beginText(opIdx) {\n    this.current.textMatrix = null;\n    this.current.textMatrixScale = 1;\n    this.current.x = this.current.lineX = 0;\n    this.current.y = this.current.lineY = 0;\n\n    this.dependencyTracker\n      ?.recordOpenMarker(opIdx)\n      .resetIncrementalData(\"sameLineText\")\n      .resetIncrementalData(\"moveText\", opIdx);\n  }\n\n  endText(opIdx) {\n    const paths = this.pendingTextPaths;\n    const ctx = this.ctx;\n\n    if (this.dependencyTracker) {\n      const { dependencyTracker } = this;\n      if (paths !== undefined) {\n        dependencyTracker\n          .recordFutureForcedDependency(\n            \"textClip\",\n            dependencyTracker.getOpenMarker()\n          )\n          .recordFutureForcedDependency(\"textClip\", opIdx);\n      }\n      dependencyTracker.recordCloseMarker(opIdx);\n    }\n\n    if (paths !== undefined) {\n      const newPath = new Path2D();\n      const invTransf = ctx.getTransform().invertSelf();\n      for (const { transform, x, y, fontSize, path } of paths) {\n        if (!path) {\n          continue; // Skip empty paths.\n        }\n        newPath.addPath(\n          path,\n          new DOMMatrix(transform)\n            .preMultiplySelf(invTransf)\n            .translate(x, y)\n            .scale(fontSize, -fontSize)\n        );\n      }\n\n      ctx.clip(newPath);\n    }\n    delete this.pendingTextPaths;\n  }\n\n  setCharSpacing(opIdx, spacing) {\n    this.dependencyTracker?.recordSimpleData(\"charSpacing\", opIdx);\n    this.current.charSpacing = spacing;\n  }\n\n  setWordSpacing(opIdx, spacing) {\n    this.dependencyTracker?.recordSimpleData(\"wordSpacing\", opIdx);\n    this.current.wordSpacing = spacing;\n  }\n\n  setHScale(opIdx, scale) {\n    this.dependencyTracker?.recordSimpleData(\"hScale\", opIdx);\n    this.current.textHScale = scale / 100;\n  }\n\n  setLeading(opIdx, leading) {\n    this.dependencyTracker?.recordSimpleData(\"leading\", opIdx);\n    this.current.leading = -leading;\n  }\n\n  setFont(opIdx, fontRefName, size) {\n    this.dependencyTracker\n      ?.recordSimpleData(\"font\", opIdx)\n      .recordSimpleDataFromNamed(\"fontObj\", fontRefName, opIdx);\n    const fontObj = this.commonObjs.get(fontRefName);\n    const current = this.current;\n\n    if (!fontObj) {\n      throw new Error(`Can't find font for ${fontRefName}`);\n    }\n    current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX;\n\n    // A valid matrix needs all main diagonal elements to be non-zero\n    // This also ensures we bypass FF bugzilla bug #719844.\n    if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n      warn(\"Invalid font matrix for font \" + fontRefName);\n    }\n\n    // The spec for Tf (setFont) says that 'size' specifies the font 'scale',\n    // and in some docs this can be negative (inverted x-y axes).\n    if (size < 0) {\n      size = -size;\n      current.fontDirection = -1;\n    } else {\n      current.fontDirection = 1;\n    }\n\n    this.current.font = fontObj;\n    this.current.fontSize = size;\n\n    if (fontObj.isType3Font) {\n      return; // we don't need ctx.font for Type3 fonts\n    }\n\n    const name = fontObj.loadedName || \"sans-serif\";\n    const typeface =\n      fontObj.systemFontInfo?.css || `\"${name}\", ${fontObj.fallbackName}`;\n\n    let bold = \"normal\";\n    if (fontObj.black) {\n      bold = \"900\";\n    } else if (fontObj.bold) {\n      bold = \"bold\";\n    }\n    const italic = fontObj.italic ? \"italic\" : \"normal\";\n\n    // Some font backends cannot handle fonts below certain size.\n    // Keeping the font at minimal size and using the fontSizeScale to change\n    // the current transformation matrix before the fillText/strokeText.\n    // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227\n    const browserFontSize = MathClamp(size, MIN_FONT_SIZE, MAX_FONT_SIZE);\n    this.current.fontSizeScale = size / browserFontSize;\n\n    this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;\n  }\n\n  setTextRenderingMode(opIdx, mode) {\n    this.dependencyTracker?.recordSimpleData(\"textRenderingMode\", opIdx);\n    this.current.textRenderingMode = mode;\n  }\n\n  setTextRise(opIdx, rise) {\n    this.dependencyTracker?.recordSimpleData(\"textRise\", opIdx);\n    this.current.textRise = rise;\n  }\n\n  moveText(opIdx, x, y) {\n    this.dependencyTracker\n      ?.resetIncrementalData(\"sameLineText\")\n      .recordIncrementalData(\"moveText\", opIdx);\n    this.current.x = this.current.lineX += x;\n    this.current.y = this.current.lineY += y;\n  }\n\n  setLeadingMoveText(opIdx, x, y) {\n    this.setLeading(opIdx, -y);\n    this.moveText(opIdx, x, y);\n  }\n\n  setTextMatrix(opIdx, matrix) {\n    this.dependencyTracker\n      ?.resetIncrementalData(\"sameLineText\")\n      .recordSimpleData(\"textMatrix\", opIdx);\n    const { current } = this;\n    current.textMatrix = matrix;\n    current.textMatrixScale = Math.hypot(matrix[0], matrix[1]);\n\n    current.x = current.lineX = 0;\n    current.y = current.lineY = 0;\n  }\n\n  nextLine(opIdx) {\n    this.moveText(opIdx, 0, this.current.leading);\n\n    this.dependencyTracker?.recordIncrementalData(\n      \"moveText\",\n      // 'leading' affects 'nextLine' operations. Rather than dealing\n      // with transitive dependencies, just mark everything that depends on\n      // the 'moveText' operation as depending on the 'leading' value.\n      this.dependencyTracker.getSimpleIndex(\"leading\") ?? opIdx\n    );\n  }\n\n  #getScaledPath(path, currentTransform, transform) {\n    const newPath = new Path2D();\n    newPath.addPath(\n      path,\n      new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)\n    );\n    return newPath;\n  }\n\n  paintChar(\n    opIdx,\n    character,\n    x,\n    y,\n    patternFillTransform,\n    patternStrokeTransform\n  ) {\n    const ctx = this.ctx;\n    const current = this.current;\n    const font = current.font;\n    const textRenderingMode = current.textRenderingMode;\n    const fontSize = current.fontSize / current.fontSizeScale;\n    const fillStrokeMode =\n      textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n    const isAddToPathSet = !!(\n      textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG\n    );\n    const patternFill = current.patternFill && !font.missingFile;\n    const patternStroke = current.patternStroke && !font.missingFile;\n\n    let path;\n    if (\n      (font.disableFontFace ||\n        isAddToPathSet ||\n        patternFill ||\n        patternStroke) &&\n      !font.missingFile\n    ) {\n      path = font.getPathGenerator(this.commonObjs, character);\n    }\n\n    if (path && (font.disableFontFace || patternFill || patternStroke)) {\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.scale(fontSize, -fontSize);\n\n      this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font);\n\n      let currentTransform;\n      if (\n        fillStrokeMode === TextRenderingMode.FILL ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        if (patternFillTransform) {\n          currentTransform = ctx.getTransform();\n          ctx.setTransform(...patternFillTransform);\n          const scaledPath = this.#getScaledPath(\n            path,\n            currentTransform,\n            patternFillTransform\n          );\n          ctx.fill(scaledPath);\n        } else {\n          ctx.fill(path);\n        }\n      }\n      if (\n        fillStrokeMode === TextRenderingMode.STROKE ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        if (patternStrokeTransform) {\n          currentTransform ||= ctx.getTransform();\n          ctx.setTransform(...patternStrokeTransform);\n          const { a, b, c, d } = currentTransform;\n          const invPatternTransform = Util.inverseTransform(\n            patternStrokeTransform\n          );\n          const transf = Util.transform(\n            [a, b, c, d, 0, 0],\n            invPatternTransform\n          );\n          Util.singularValueDecompose2dScale(transf, XY);\n\n          // Cancel the pattern scaling of the line width.\n          // If sx and sy are different, unfortunately we can't do anything and\n          // we'll have a rendering bug.\n          ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize;\n          ctx.stroke(\n            this.#getScaledPath(path, currentTransform, patternStrokeTransform)\n          );\n        } else {\n          ctx.lineWidth /= fontSize;\n          ctx.stroke(path);\n        }\n      }\n      ctx.restore();\n    } else {\n      if (\n        fillStrokeMode === TextRenderingMode.FILL ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        ctx.fillText(character, x, y);\n        this.dependencyTracker?.recordCharacterBBox(\n          opIdx,\n          ctx,\n          font,\n          fontSize,\n          x,\n          y,\n          () => ctx.measureText(character)\n        );\n      }\n      if (\n        fillStrokeMode === TextRenderingMode.STROKE ||\n        fillStrokeMode === TextRenderingMode.FILL_STROKE\n      ) {\n        if (this.dependencyTracker) {\n          this.dependencyTracker\n            ?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () =>\n              ctx.measureText(character)\n            )\n            .recordDependencies(opIdx, Dependencies.stroke);\n        }\n        ctx.strokeText(character, x, y);\n      }\n    }\n\n    if (isAddToPathSet) {\n      const paths = (this.pendingTextPaths ||= []);\n      paths.push({\n        transform: getCurrentTransform(ctx),\n        x,\n        y,\n        fontSize,\n        path,\n      });\n      this.dependencyTracker?.recordCharacterBBox(\n        opIdx,\n        ctx,\n        font,\n        fontSize,\n        x,\n        y\n      );\n    }\n  }\n\n  get isFontSubpixelAAEnabled() {\n    // Checks if anti-aliasing is enabled when scaled text is painted.\n    // On Windows GDI scaled fonts looks bad.\n    const tmpCanvas = this.canvasFactory.create(10, 10);\n    const ctx = tmpCanvas.context;\n    ctx.scale(1.5, 1);\n    ctx.fillText(\"I\", 0, 10);\n    const data = ctx.getImageData(0, 0, 10, 10).data;\n    this.canvasFactory.destroy(tmpCanvas);\n    let enabled = false;\n    for (let i = 3; i < data.length; i += 4) {\n      if (data[i] > 0 && data[i] < 255) {\n        enabled = true;\n        break;\n      }\n    }\n    return shadow(this, \"isFontSubpixelAAEnabled\", enabled);\n  }\n\n  showText(opIdx, glyphs) {\n    if (this.dependencyTracker) {\n      this.dependencyTracker\n        .recordDependencies(opIdx, Dependencies.showText)\n        .resetBBox(opIdx);\n      if (this.current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) {\n        this.dependencyTracker\n          .recordFutureForcedDependency(\"textClip\", opIdx)\n          .inheritPendingDependenciesAsFutureForcedDependencies();\n      }\n    }\n\n    const current = this.current;\n    const font = current.font;\n    if (font.isType3Font) {\n      const started = this.#beginKnockoutElement(current.fillAlpha);\n      this.showType3Text(opIdx, glyphs);\n      this.dependencyTracker?.recordShowTextOperation(opIdx);\n      this.#endKnockoutElement(started);\n      return;\n    }\n\n    const fontSize = current.fontSize;\n    if (fontSize === 0) {\n      this.dependencyTracker?.recordOperation(opIdx);\n      return;\n    }\n\n    const started = this.#beginKnockoutElement(current.fillAlpha);\n    const ctx = this.ctx;\n    const fontSizeScale = current.fontSizeScale;\n    const charSpacing = current.charSpacing;\n    const wordSpacing = current.wordSpacing;\n    const fontDirection = current.fontDirection;\n    const textHScale = current.textHScale * fontDirection;\n    const glyphsLength = glyphs.length;\n    const vertical = font.vertical;\n    const spacingDir = vertical ? 1 : -1;\n    const defaultVMetrics = font.defaultVMetrics;\n    const widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n    const simpleFillText =\n      current.textRenderingMode === TextRenderingMode.FILL &&\n      !font.disableFontFace &&\n      !current.patternFill;\n\n    ctx.save();\n    if (current.textMatrix) {\n      ctx.transform(...current.textMatrix);\n    }\n    ctx.translate(current.x, current.y + current.textRise);\n\n    if (fontDirection > 0) {\n      ctx.scale(textHScale, -1);\n    } else {\n      ctx.scale(textHScale, 1);\n    }\n\n    let patternFillTransform, patternStrokeTransform;\n\n    // Only compute pattern transforms if the text rendering mode actually\n    // uses fill/stroke. This avoids expensive pattern calculations each call\n    // when a patternFill/patternStroke is set, but unused.\n    const fillStrokeMode =\n      current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n    const needsFill =\n      fillStrokeMode === TextRenderingMode.FILL ||\n      fillStrokeMode === TextRenderingMode.FILL_STROKE;\n    const needsStroke =\n      fillStrokeMode === TextRenderingMode.STROKE ||\n      fillStrokeMode === TextRenderingMode.FILL_STROKE;\n\n    let lineWidth = current.lineWidth;\n    const scale = current.textMatrixScale;\n    if (scale === 0 || lineWidth === 0) {\n      if (needsStroke) {\n        lineWidth = this.getSinglePixelWidth();\n      }\n    } else {\n      lineWidth /= scale;\n    }\n\n    if (fontSizeScale !== 1.0) {\n      ctx.scale(fontSizeScale, fontSizeScale);\n      lineWidth /= fontSizeScale;\n    }\n\n    ctx.lineWidth = lineWidth;\n\n    if (needsFill && current.patternFill) {\n      ctx.save();\n      const pattern = current.fillColor.getPattern(\n        ctx,\n        this,\n        getCurrentTransformInverse(ctx),\n        PathType.FILL,\n        opIdx\n      );\n      patternFillTransform = getCurrentTransform(ctx);\n      ctx.restore();\n      ctx.fillStyle = pattern;\n    }\n\n    if (needsStroke && current.patternStroke) {\n      ctx.save();\n      const pattern = current.strokeColor.getPattern(\n        ctx,\n        this,\n        getCurrentTransformInverse(ctx),\n        PathType.STROKE,\n        opIdx\n      );\n      patternStrokeTransform = getCurrentTransform(ctx);\n      ctx.restore();\n      ctx.strokeStyle = pattern;\n    }\n\n    if (font.isInvalidPDFjsFont) {\n      const chars = [];\n      let width = 0;\n      for (const glyph of glyphs) {\n        chars.push(glyph.unicode);\n        width += glyph.width;\n      }\n      const joinedChars = chars.join(\"\");\n      ctx.fillText(joinedChars, 0, 0);\n      if (this.dependencyTracker !== null) {\n        const measure = ctx.measureText(joinedChars);\n        this.dependencyTracker\n          .recordBBox(\n            opIdx,\n            this.ctx,\n            -measure.actualBoundingBoxLeft,\n            measure.actualBoundingBoxRight,\n            -measure.actualBoundingBoxAscent,\n            measure.actualBoundingBoxDescent\n          )\n          .recordShowTextOperation(opIdx);\n      }\n      current.x += width * widthAdvanceScale * textHScale;\n      ctx.restore();\n      this.compose();\n      this.#endKnockoutElement(started);\n      return;\n    }\n\n    let x = 0,\n      i;\n    for (i = 0; i < glyphsLength; ++i) {\n      const glyph = glyphs[i];\n      if (typeof glyph === \"number\") {\n        x += (spacingDir * glyph * fontSize) / 1000;\n        continue;\n      }\n\n      let restoreNeeded = false;\n      const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n      const character = glyph.fontChar;\n      const accent = glyph.accent;\n      let scaledX, scaledY;\n      let width = glyph.width;\n      if (vertical) {\n        const vmetric = glyph.vmetric || defaultVMetrics;\n        const vx =\n          -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;\n        const vy = vmetric[2] * widthAdvanceScale;\n\n        width = vmetric ? -vmetric[0] : width;\n        scaledX = vx / fontSizeScale;\n        scaledY = (x + vy) / fontSizeScale;\n      } else {\n        scaledX = x / fontSizeScale;\n        scaledY = 0;\n      }\n\n      let measure;\n\n      if (font.remeasure && width > 0) {\n        measure = ctx.measureText(character);\n\n        // Some standard fonts may not have the exact width: rescale per\n        // character if measured width is greater than expected glyph width\n        // and subpixel-aa is enabled, otherwise just center the glyph.\n        const measuredWidth =\n          ((measure.width * 1000) / fontSize) * fontSizeScale;\n        if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n          const characterScaleX = width / measuredWidth;\n          restoreNeeded = true;\n          ctx.save();\n          ctx.scale(characterScaleX, 1);\n          scaledX /= characterScaleX;\n        } else if (width !== measuredWidth) {\n          scaledX +=\n            (((width - measuredWidth) / 2000) * fontSize) / fontSizeScale;\n        }\n      }\n\n      // Only attempt to draw the glyph if it is actually in the embedded font\n      // file or if there isn't a font file so the fallback font is shown.\n      if (this.contentVisible && (glyph.isInFont || font.missingFile)) {\n        if (simpleFillText && !accent) {\n          // common case\n          ctx.fillText(character, scaledX, scaledY);\n\n          this.dependencyTracker?.recordCharacterBBox(\n            opIdx,\n            ctx,\n            // If we already measured the character, force usage of that\n            measure ? { bbox: null } : font,\n            fontSize / fontSizeScale,\n            scaledX,\n            scaledY,\n            () => measure ?? ctx.measureText(character)\n          );\n        } else {\n          this.paintChar(\n            opIdx,\n            character,\n            scaledX,\n            scaledY,\n            patternFillTransform,\n            patternStrokeTransform\n          );\n          if (accent) {\n            const scaledAccentX =\n              scaledX + (fontSize * accent.offset.x) / fontSizeScale;\n            const scaledAccentY =\n              scaledY - (fontSize * accent.offset.y) / fontSizeScale;\n            this.paintChar(\n              opIdx,\n              accent.fontChar,\n              scaledAccentX,\n              scaledAccentY,\n              patternFillTransform,\n              patternStrokeTransform\n            );\n          }\n        }\n      }\n\n      const charWidth = vertical\n        ? width * widthAdvanceScale - spacing * fontDirection\n        : width * widthAdvanceScale + spacing * fontDirection;\n      x += charWidth;\n\n      if (restoreNeeded) {\n        ctx.restore();\n      }\n    }\n    if (vertical) {\n      current.y -= x;\n    } else {\n      current.x += x * textHScale;\n    }\n    ctx.restore();\n    this.compose();\n\n    this.dependencyTracker?.recordShowTextOperation(opIdx);\n    this.#endKnockoutElement(started);\n  }\n\n  showType3Text(opIdx, glyphs) {\n    // Type3 fonts - each glyph is a \"mini-PDF\"\n    const ctx = this.ctx;\n    const current = this.current;\n    const font = current.font;\n    const fontSize = current.fontSize;\n    const fontDirection = current.fontDirection;\n    const spacingDir = font.vertical ? 1 : -1;\n    const charSpacing = current.charSpacing;\n    const wordSpacing = current.wordSpacing;\n    const textHScale = current.textHScale * fontDirection;\n    const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;\n    const glyphsLength = glyphs.length;\n    const isTextInvisible =\n      current.textRenderingMode === TextRenderingMode.INVISIBLE;\n    let i, glyph, width, spacingLength;\n\n    if (isTextInvisible || fontSize === 0) {\n      return;\n    }\n    this._cachedScaleForStroking[0] = -1;\n    this._cachedGetSinglePixelWidth = null;\n\n    ctx.save();\n    if (current.textMatrix) {\n      ctx.transform(...current.textMatrix);\n    }\n    ctx.translate(current.x, current.y + current.textRise);\n\n    ctx.scale(textHScale, fontDirection);\n\n    // Type3 fonts have their own operator list. Avoid mixing it up with the\n    // dependency tracker of the main operator list.\n    const dependencyTracker = this.dependencyTracker;\n    this.dependencyTracker = dependencyTracker\n      ? new CanvasNestedDependencyTracker(dependencyTracker, opIdx)\n      : null;\n\n    for (i = 0; i < glyphsLength; ++i) {\n      glyph = glyphs[i];\n      if (typeof glyph === \"number\") {\n        spacingLength = (spacingDir * glyph * fontSize) / 1000;\n        this.ctx.translate(spacingLength, 0);\n        current.x += spacingLength * textHScale;\n        continue;\n      }\n\n      const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n      const operatorList = font.charProcOperatorList[glyph.operatorListId];\n      if (!operatorList) {\n        warn(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n      } else if (this.contentVisible) {\n        this.save();\n        // A d0 (setCharWidth) glyph is colored (see Table 113 in pdf 1.7 specs)\n        // unlike a d1 glyph painted as a stencil mask with the current fill\n        // color. The constant alphas (ca/CA) are the opacity of that current\n        // color, so they must not attenuate a d0 glyph.\n        if (operatorList.fnArray[0] === OPS.setCharWidth) {\n          current.fillAlpha = current.strokeAlpha = 1;\n          ctx.globalAlpha = 1;\n        }\n        ctx.scale(fontSize, fontSize);\n        ctx.transform(...fontMatrix);\n        this.executeOperatorList(operatorList);\n        this.restore();\n      }\n\n      const p = [glyph.width, 0];\n      Util.applyTransform(p, fontMatrix);\n      width = p[0] * fontSize + spacing;\n\n      ctx.translate(width, 0);\n      current.x += width * textHScale;\n    }\n    ctx.restore();\n    if (dependencyTracker) {\n      this.dependencyTracker = dependencyTracker;\n    }\n  }\n\n  // Type3 fonts\n  setCharWidth(opIdx, xWidth, yWidth) {\n    // We can safely ignore this since the width should be the same\n    // as the width in the Widths array.\n  }\n\n  setCharWidthAndBounds(opIdx, xWidth, yWidth, llx, lly, urx, ury) {\n    const clip = new Path2D();\n    clip.rect(llx, lly, urx - llx, ury - lly);\n    this.ctx.clip(clip);\n    this.dependencyTracker\n      ?.recordBBox(opIdx, this.ctx, llx, urx, lly, ury)\n      .recordClipBox(opIdx, this.ctx, llx, urx, lly, ury);\n    this.endPath(opIdx);\n  }\n\n  // Color\n  getColorN_Pattern(opIdx, IR) {\n    let pattern;\n    if (IR[0] === \"TilingPattern\") {\n      const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);\n      const canvasGraphicsFactory = {\n        createCanvasGraphics: (ctx, renderingOpIdx) =>\n          new CanvasGraphics(\n            ctx,\n            this.commonObjs,\n            this.objs,\n            this.canvasFactory,\n            this.filterFactory,\n            {\n              optionalContentConfig: this.optionalContentConfig,\n              markedContentStack: this.markedContentStack,\n            },\n            undefined,\n            undefined,\n            this.dependencyTracker\n              ? new CanvasNestedDependencyTracker(\n                  this.dependencyTracker,\n                  renderingOpIdx,\n                  /* ignoreBBoxes */ true\n                )\n              : null\n          ),\n      };\n      pattern = new TilingPattern(\n        IR,\n        this.ctx,\n        canvasGraphicsFactory,\n        baseTransform\n      );\n    } else {\n      pattern = this._getPattern(opIdx, IR[1], IR[2]);\n    }\n    return pattern;\n  }\n\n  setStrokeColorN(opIdx, ...args) {\n    this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n    this.current.strokeColor = this.getColorN_Pattern(opIdx, args);\n    this.current.patternStroke = true;\n  }\n\n  setFillColorN(opIdx, ...args) {\n    this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n    const pattern = (this.current.fillColor = this.getColorN_Pattern(\n      opIdx,\n      args\n    ));\n    this.current.patternFill = true;\n    this.current.tilingPatternDims =\n      pattern instanceof TilingPattern ? [0, 0, 0, 0] : null;\n  }\n\n  setStrokeRGBColor(opIdx, color) {\n    this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n    this.ctx.strokeStyle = this.current.strokeColor = color;\n    this.current.patternStroke = false;\n  }\n\n  setStrokeTransparent(opIdx) {\n    this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n    this.ctx.strokeStyle = this.current.strokeColor = \"transparent\";\n    this.current.patternStroke = false;\n  }\n\n  setFillRGBColor(opIdx, color) {\n    this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n    this.ctx.fillStyle = this.current.fillColor = color;\n    this.current.patternFill = false;\n    this.current.tilingPatternDims = null;\n  }\n\n  setFillTransparent(opIdx) {\n    this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n    this.ctx.fillStyle = this.current.fillColor = \"transparent\";\n    this.current.patternFill = false;\n    this.current.tilingPatternDims = null;\n  }\n\n  _getPattern(opIdx, objId, matrix = null) {\n    let pattern;\n    if (this.cachedPatterns.has(objId)) {\n      pattern = this.cachedPatterns.get(objId);\n    } else {\n      pattern = getShadingPattern(this.getObject(opIdx, objId));\n      this.cachedPatterns.set(objId, pattern);\n    }\n    if (matrix) {\n      pattern.matrix = matrix;\n    }\n    return pattern;\n  }\n\n  shadingFill(opIdx, objId) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const started = this.#beginKnockoutElement(this.current.fillAlpha);\n    const ctx = this.ctx;\n\n    this.save(opIdx);\n    const pattern = this._getPattern(opIdx, objId);\n    ctx.fillStyle = pattern.getPattern(\n      ctx,\n      this,\n      getCurrentTransformInverse(ctx),\n      PathType.SHADING,\n      opIdx\n    );\n\n    const inv = getCurrentTransformInverse(ctx);\n    if (inv) {\n      const { width, height } = ctx.canvas;\n      const minMax = F32_BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax);\n      const [x0, y0, x1, y1] = minMax;\n\n      this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n    } else {\n      // HACK to draw the gradient onto an infinite rectangle.\n      // PDF gradients are drawn across the entire image while\n      // Canvas only allows gradients to be drawn in a rectangle\n      // The following bug should allow us to remove this.\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=664884\n\n      this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n    }\n\n    this.dependencyTracker\n      ?.resetBBox(opIdx)\n      // TODO: Track proper bbox\n      .recordFullPageBBox(opIdx)\n      .recordDependencies(opIdx, Dependencies.transform)\n      .recordDependencies(opIdx, Dependencies.fill)\n      .recordOperation(opIdx);\n\n    this.compose(this.current.getClippedPathBoundingBox());\n    this.restore(opIdx);\n    this.#endKnockoutElement(started);\n  }\n\n  // Images\n  beginInlineImage() {\n    unreachable(\"Should not call beginInlineImage\");\n  }\n\n  beginImageData() {\n    unreachable(\"Should not call beginImageData\");\n  }\n\n  paintFormXObjectBegin(opIdx, matrix, bbox) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.save(opIdx);\n    this.baseTransformStack.push(this.baseTransform);\n\n    if (matrix) {\n      this.transform(opIdx, ...matrix);\n    }\n    this.baseTransform = getCurrentTransform(this.ctx);\n\n    if (bbox) {\n      Util.axialAlignedBoundingBox(\n        bbox,\n        this.baseTransform,\n        this.current.minMax\n      );\n      const [x0, y0, x1, y1] = bbox;\n      const clip = new Path2D();\n      clip.rect(x0, y0, x1 - x0, y1 - y0);\n      this.ctx.clip(clip);\n      this.dependencyTracker?.recordClipBox(opIdx, this.ctx, x0, x1, y0, y1);\n      this.endPath(opIdx);\n    }\n  }\n\n  paintFormXObjectEnd(opIdx) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.restore(opIdx);\n    this.baseTransform = this.baseTransformStack.pop();\n  }\n\n  beginGroup(opIdx, group) {\n    if (!this.contentVisible) {\n      return;\n    }\n\n    this.save(opIdx);\n    // If there's an active soft mask we don't want it enabled for the group, so\n    // clear it out. The mask and suspended canvas will be restored in endGroup.\n    const { inSMaskMode } = this;\n    if (inSMaskMode) {\n      this.endSMaskMode();\n      this.current.activeSMask = null;\n    }\n\n    const currentCtx = this.ctx;\n    if (\n      // A non-isolated group blends with its backdrop, so drawing it directly\n      // on the parent canvas (rather than on a transparent intermediate one)\n      // is correct even when it contains blend modes (bug 1873345). A soft\n      // mask still needs its own canvas though, and an isolated group requires\n      // a transparent backdrop, so both keep the intermediate canvas.\n      (!group.needsIsolation || (!group.isolated && !group.hasSoftMask)) &&\n      !group.knockout &&\n      !group.isGray &&\n      this.#knockoutGroupLevel === 0 &&\n      currentCtx.globalAlpha === 1 &&\n      currentCtx.globalCompositeOperation === \"source-over\" &&\n      !inSMaskMode\n    ) {\n      if (group.bbox) {\n        let clip = new Path2D();\n        const [x0, y0, x1, y1] = group.bbox;\n        clip.rect(x0, y0, x1 - x0, y1 - y0);\n        if (group.matrix) {\n          const path = new Path2D();\n          path.addPath(clip, new DOMMatrix(group.matrix));\n          clip = path;\n        }\n        currentCtx.clip(clip);\n      }\n      // Unlike the intermediate-canvas path below, the content is drawn\n      // straight onto the parent canvas with no later compositing step, so the\n      // inherited blend mode, alpha constants and transfer function must stay\n      // active here rather than being reset (issue 20722); the conditions\n      // above already guarantee a Normal blend and an opaque (ca === 1) state.\n      this.groupStack.push(null); // null = no intermediate canvas\n      this.#groupStackMeta.push(null);\n      this.groupLevel++;\n      return;\n    }\n\n    // Reached only when the direct path above didn't apply, e.g. a soft mask,\n    // non-default group alpha or blend mode: we still composite on a\n    // transparent intermediate canvas rather than the real backdrop.\n    if (!group.isolated && !group.knockout && this.#knockoutGroupLevel === 0) {\n      info(\"TODO: Fully support non-isolated non-knockout groups.\");\n    }\n\n    const currentTransform = getCurrentTransform(currentCtx);\n    if (group.matrix) {\n      currentCtx.transform(...group.matrix);\n    }\n\n    // Clip the bounding box to the current canvas.\n    const canvasBounds = [\n      0,\n      0,\n      currentCtx.canvas.width,\n      currentCtx.canvas.height,\n    ];\n\n    let bounds;\n    if (group.bbox) {\n      bounds = F32_BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox(\n        group.bbox,\n        getCurrentTransform(currentCtx),\n        bounds\n      );\n\n      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n    } else {\n      bounds = canvasBounds;\n    }\n\n    // Based on the current transform figure out how big the bounding box\n    // will actually be.\n    // Use ceil in case we're between sizes so we don't create canvas that is\n    // too small and make the canvas at least 1x1 pixels.\n    const offsetX = Math.floor(bounds[0]);\n    const offsetY = Math.floor(bounds[1]);\n    const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n    const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n\n    this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);\n\n    const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight);\n    if (group.smask) {\n      this.smaskGroupCanvases.push(scratchCanvas);\n    }\n    const groupCtx = scratchCanvas.context;\n    // Non-isolated KO: keep a reference to the parent ctx (not a copy). It's\n    // frozen while the group renders, so we can read from it on demand. The\n    // backdrop is only restored under each element's footprint in\n    // #compositeKnockoutSurface so it doesn't become part of the group\n    // source itself.\n    const backdropCtx = group.knockout && !group.isolated ? currentCtx : null;\n    // Non-isolated non-KO subgroup inside a KO parent, with inner compositing\n    // of its own: at endGroup we'll blend its elements against the outer KO\n    // running canvas (also frozen), so just record the flag here and read\n    // ctx.canvas at composite time.\n    const hasInnerBackdrop =\n      !group.isolated &&\n      !group.knockout &&\n      !group.smask &&\n      group.needsIsolation &&\n      this.#knockoutGroupLevel > 0;\n\n    // Pool the per-element shape mask for the lifetime of this KO group.\n    // Non-KO groups never call #compositeKnockoutSurface for their own\n    // elements so the entry is unused there.\n    const knockoutMaskEntry = group.knockout\n      ? this.canvasFactory.create(drawnWidth, drawnHeight)\n      : null;\n\n    // For KO groups bump the level so inner elements get KO treatment; for\n    // non-KO groups reset to 0 so an ancestor KO group doesn't apply to\n    // them. Restored on endGroup.\n    const savedKnockoutLevel = this.#knockoutGroupLevel;\n    if (group.knockout) {\n      this.#knockoutGroupLevel++;\n    } else {\n      this.#knockoutGroupLevel = 0;\n    }\n\n    // Since we created a new canvas that is just the size of the bounding box\n    // we have to translate the group ctx.\n    groupCtx.translate(-offsetX, -offsetY);\n    groupCtx.transform(...currentTransform);\n\n    if (\n      !group.isolated &&\n      !group.smask &&\n      inSMaskMode &&\n      group.needsIsolation\n    ) {\n      // For non-isolated groups that need isolation and are entered from SMask\n      // mode, copy the current canvas background so that inner blend modes\n      // (e.g. \"screen\") interact correctly with the background rather than\n      // compositing onto a transparent canvas.\n      // Groups without needsIsolation have no inner blend modes; their content\n      // is composited correctly via the SMask in endGroup without a copy.\n      groupCtx.save();\n      groupCtx.setTransform(1, 0, 0, 1, 0, 0);\n      groupCtx.drawImage(currentCtx.canvas, -offsetX, -offsetY);\n      groupCtx.restore();\n    }\n\n    // Apply the bbox to the group context.\n    if (group.bbox) {\n      let clip = new Path2D();\n      const [x0, y0, x1, y1] = group.bbox;\n      clip.rect(x0, y0, x1 - x0, y1 - y0);\n      if (group.matrix) {\n        const path = new Path2D();\n        path.addPath(clip, new DOMMatrix(group.matrix));\n        clip = path;\n      }\n      groupCtx.clip(clip);\n    }\n\n    if (group.smask) {\n      // Saving state and cached mask to be used in setGState.\n      this.smaskStack.push({\n        canvas: scratchCanvas.canvas,\n        context: groupCtx,\n        offsetX,\n        offsetY,\n        subtype: group.smask.subtype,\n        backdrop: group.smask.backdrop,\n        transferMap: group.smask.transferMap || null,\n      });\n    }\n    if (\n      !group.smask ||\n      // When this is not an SMask group, we only need to update the current\n      // transform if recording operations bboxes, so they the bboxes have the\n      // correct transform applied.\n      this.dependencyTracker\n    ) {\n      // Setup the current ctx so when the group is popped we draw it at the\n      // right location.\n      currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n      currentCtx.translate(offsetX, offsetY);\n      currentCtx.save();\n    }\n    // The transparency group inherits all off the current graphics state\n    // except the blend mode, soft mask, and alpha constants.\n    copyCtxState(currentCtx, groupCtx);\n    this.ctx = groupCtx;\n    this.dependencyTracker\n      ?.inheritSimpleDataAsFutureForcedDependencies([\n        \"fillAlpha\",\n        \"strokeAlpha\",\n        \"globalCompositeOperation\",\n      ])\n      .pushBaseTransform(currentCtx);\n    this.setGState(opIdx, [\n      [\"BM\", \"source-over\"],\n      [\"ca\", 1],\n      [\"CA\", 1],\n      [\"TR\", null],\n    ]);\n    this.groupStack.push(currentCtx);\n    this.#groupStackMeta.push({\n      backdropCtx,\n      savedKnockoutLevel,\n      offsetX,\n      offsetY,\n      hasInnerBackdrop,\n      knockoutMaskEntry,\n      // Per-group scratch pools, lazily filled and freed in endGroup.\n      knockoutTempEntry: null,\n      knockoutBackdropEntry: null,\n    });\n    this.groupLevel++;\n  }\n\n  endGroup(opIdx, group) {\n    if (!this.contentVisible) {\n      return;\n    }\n    this.groupLevel--;\n    const groupCtx = this.ctx;\n    const ctx = this.groupStack.pop();\n    const groupMeta = this.#groupStackMeta.pop();\n    // Restore the knockout level that was in effect before this group began.\n    // Simple groups (groupMeta === null) never modify the level, so skip them.\n    if (groupMeta) {\n      this.#knockoutGroupLevel = groupMeta.savedKnockoutLevel;\n    }\n    if (ctx === null) {\n      // Simple group: content was drawn directly on the parent canvas.\n      this.restore(opIdx);\n      return;\n    }\n\n    if (group.isGray) {\n      // The group color space is gray (a single component), so its rendered\n      // content must be converted to grayscale before being composited onto\n      // the parent canvas, see issue 7998.\n      this.#convertGroupToGray(groupCtx);\n    }\n\n    this.ctx = ctx;\n    // Turn off image smoothing to avoid sub pixel interpolation which can\n    // look kind of blurry for some pdfs.\n    this.ctx.imageSmoothingEnabled = false;\n\n    this.dependencyTracker?.popBaseTransform();\n\n    if (group.smask) {\n      this.tempSMask = this.smaskStack.pop();\n      this.restore(opIdx);\n      if (this.dependencyTracker) {\n        this.ctx.restore();\n        // beginSMaskMode() may have been called inside restore(opIdx) above\n        // (via checkSMaskState), creating a fresh scratch canvas. If so,\n        // the mirrored ctx.restore() just synced main's CTM but left the\n        // scratch at the stale CTM set by beginSMaskMode(). Re-sync it.\n        if (this.inSMaskMode) {\n          this.ctx.setTransform(this.suspendedCtx.getTransform());\n        }\n      }\n      this.#destroyKnockoutPools(groupMeta);\n    } else {\n      this.ctx.restore();\n      const currentMtx = getCurrentTransform(this.ctx);\n      this.restore(opIdx);\n      this.ctx.save();\n      this.ctx.setTransform(...currentMtx);\n      const dirtyBox = F32_BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox(\n        [0, 0, groupCtx.canvas.width, groupCtx.canvas.height],\n        currentMtx,\n        dirtyBox\n      );\n      const parentGroupMeta = this.#groupStackMeta.at(-1);\n      if (this.#knockoutGroupLevel > 0) {\n        // The subgroup is one element of the enclosing KO group, so\n        // composite it with KO semantics. Two coord systems below:\n        //  - `currentMtx` (`destTransform`) places the subgroup canvas in\n        //    the parent on the final draw, like the non-KO `drawImage`.\n        //  - `groupMeta.offsetX/Y` are the pixel origins beginGroup stored\n        //    when sizing the scratch; we use them (not `currentMtx[4]/[5]`,\n        //    which are PDF-transform components) to crop the backdrop.\n        if (groupMeta.hasInnerBackdrop) {\n          // Non-isolated subgroup inside a KO parent: blend the elements\n          // against the subgroup's own initial backdrop for colour, but use\n          // the elements-only scratch as the alpha mask so transparent\n          // areas don't erase the parent. `ctx` is the outer KO canvas\n          // (just popped); its pixels still match the subgroup's\n          // beginGroup state since the subgroup draws to its own scratch.\n          const { width, height } = groupCtx.canvas;\n          const colorEntry = this.canvasFactory.create(width, height);\n          const colorCtx = colorEntry.context;\n          colorCtx.drawImage(\n            ctx.canvas,\n            groupMeta.offsetX,\n            groupMeta.offsetY,\n            width,\n            height,\n            0,\n            0,\n            width,\n            height\n          );\n          colorCtx.globalCompositeOperation = \"source-over\";\n          colorCtx.drawImage(groupCtx.canvas, 0, 0);\n          // Clip colorEntry to the subgroup's element footprint so\n          // backdrop pixels outside the elements don't bleed onto the\n          // parent. Built with alpha=1 (no scaling) so the mask uses the\n          // subgroup's composited painted alpha directly as shape - its\n          // global gstate alpha gets applied at the final draw below. The\n          // mask is sized to the subgroup canvas, so we can't reuse the\n          // parent KO group's pooled mask here; allocate a fresh entry\n          // and reuse it for both the destination-in and the\n          // destination-out below.\n          const shapeMaskEntry = this.#createKnockoutMaskCanvas(\n            groupCtx.canvas\n          );\n          colorCtx.globalCompositeOperation = \"destination-in\";\n          colorCtx.drawImage(shapeMaskEntry.canvas, 0, 0);\n          // Inline the isolated-path compositing here so we can share\n          // shapeMaskEntry with the destination-in above.\n          const sourceCompositeOperation = this.ctx.globalCompositeOperation;\n          const sourceAlpha = this.ctx.globalAlpha;\n          const sourceFilter = this.ctx.filter;\n          this.ctx.save();\n          this.ctx.setTransform(...currentMtx);\n          this.ctx.globalAlpha = 1;\n          if (FeatureTest.isCanvasFilterSupported) {\n            this.ctx.filter = \"none\";\n          }\n          this.ctx.globalCompositeOperation = \"destination-out\";\n          this.ctx.drawImage(shapeMaskEntry.canvas, 0, 0);\n          this.ctx.globalCompositeOperation = sourceCompositeOperation;\n          this.ctx.globalAlpha = sourceAlpha;\n          if (FeatureTest.isCanvasFilterSupported) {\n            this.ctx.filter = sourceFilter ?? \"none\";\n          }\n          this.ctx.drawImage(colorEntry.canvas, 0, 0);\n          this.ctx.restore();\n          this.canvasFactory.destroy(shapeMaskEntry);\n          this.canvasFactory.destroy(colorEntry);\n        } else {\n          // For a non-isolated KO parent the backdrop lives one level up.\n          // Compound the parent's and subgroup's offsets to crop it.\n          const backdropCtx = parentGroupMeta?.backdropCtx ?? null;\n          this.#compositeKnockoutSurface(this.ctx, groupCtx.canvas, {\n            backdropCanvas: backdropCtx?.canvas ?? null,\n            destTransform: currentMtx,\n            backdropOffset: backdropCtx\n              ? [\n                  parentGroupMeta.offsetX + groupMeta.offsetX,\n                  parentGroupMeta.offsetY + groupMeta.offsetY,\n                ]\n              : [0, 0],\n            sourceAlpha: this.ctx.globalAlpha,\n            sourceFilter: this.ctx.filter,\n          });\n        }\n      } else {\n        this.ctx.drawImage(groupCtx.canvas, 0, 0);\n      }\n      this.ctx.restore();\n      this.canvasFactory.destroy({\n        canvas: groupCtx.canvas,\n        context: groupCtx,\n      });\n      this.#destroyKnockoutPools(groupMeta);\n      this.compose(dirtyBox);\n    }\n  }\n\n  #convertGroupToGray(groupCtx) {\n    const { canvas } = groupCtx;\n    const { width, height } = canvas;\n\n    if (FeatureTest.isCanvasFilterSupported) {\n      // Draw the canvas onto itself with the grayscale filter applied (which\n      // preserves the alpha channel), using the \"copy\" composite operation so\n      // the filtered content fully replaces the original.\n      groupCtx.save();\n      groupCtx.setTransform(1, 0, 0, 1, 0, 0);\n      groupCtx.filter = \"grayscale(1)\";\n      groupCtx.globalAlpha = 1;\n      groupCtx.globalCompositeOperation = \"copy\";\n      groupCtx.drawImage(canvas, 0, 0);\n      groupCtx.restore();\n      return;\n    }\n\n    // Fallback when canvas filters aren't supported: convert each pixel to\n    // grayscale by hand, using the same luminance coefficients as the\n    // \"grayscale(1)\" filter while leaving the alpha channel untouched.\n    const imageData = groupCtx.getImageData(0, 0, width, height);\n    const { data } = imageData;\n    for (let i = 0, ii = data.length; i < ii; i += 4) {\n      const gray =\n        (data[i] * 0.2126 + data[i + 1] * 0.7152 + data[i + 2] * 0.0722 + 0.5) |\n        0;\n      data[i] = data[i + 1] = data[i + 2] = gray;\n    }\n    groupCtx.putImageData(imageData, 0, 0);\n  }\n\n  #destroyKnockoutPools(groupMeta) {\n    if (!groupMeta) {\n      return;\n    }\n    if (groupMeta.knockoutMaskEntry) {\n      this.canvasFactory.destroy(groupMeta.knockoutMaskEntry);\n      groupMeta.knockoutMaskEntry = null;\n    }\n    if (groupMeta.knockoutTempEntry) {\n      this.canvasFactory.destroy(groupMeta.knockoutTempEntry);\n      groupMeta.knockoutTempEntry = null;\n    }\n    if (groupMeta.knockoutBackdropEntry) {\n      this.canvasFactory.destroy(groupMeta.knockoutBackdropEntry);\n      groupMeta.knockoutBackdropEntry = null;\n    }\n  }\n\n  beginAnnotation(\n    opIdx,\n    id,\n    rect,\n    transform,\n    matrix,\n    hasOwnCanvas,\n    canvasName\n  ) {\n    // The annotations are drawn just after the page content.\n    // The page content drawing can potentially have set a transform,\n    // a clipping path, whatever...\n    // So in order to have something clean, we restore the initial state.\n    this.#restoreInitialState();\n    resetCtxToDefault(this.ctx);\n\n    this.ctx.save();\n    this.save(opIdx);\n\n    if (this.baseTransform) {\n      this.ctx.setTransform(...this.baseTransform);\n    }\n\n    if (rect) {\n      const width = rect[2] - rect[0];\n      const height = rect[3] - rect[1];\n\n      if (hasOwnCanvas && this.annotationCanvasMap) {\n        transform = transform.slice();\n        transform[4] -= rect[0];\n        transform[5] -= rect[1];\n\n        rect = rect.slice();\n        rect[0] = rect[1] = 0;\n        rect[2] = width;\n        rect[3] = height;\n\n        Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY);\n        const { viewportScale } = this;\n        const canvasWidth = Math.ceil(\n          width * this.outputScaleX * viewportScale\n        );\n        const canvasHeight = Math.ceil(\n          height * this.outputScaleY * viewportScale\n        );\n\n        this.annotationCanvas = this.canvasFactory.create(\n          canvasWidth,\n          canvasHeight\n        );\n        const { canvas, context } = this.annotationCanvas;\n        if (canvasName) {\n          const canvases = this.annotationCanvasMap.getOrInsertComputed(\n            id,\n            makeArr\n          );\n          canvas.setAttribute(\"data-canvas-name\", canvasName);\n          // Replace any same-named canvas from a previous render so stale\n          // low-resolution canvases don't pile up across zooms.\n          const index = canvases.findIndex(\n            c => c.getAttribute(\"data-canvas-name\") === canvasName\n          );\n          if (index === -1) {\n            canvases.push(canvas);\n          } else {\n            canvases[index] = canvas;\n          }\n        } else {\n          this.annotationCanvasMap.set(id, canvas);\n        }\n        this.annotationCanvas.savedCtx = this.ctx;\n        this.ctx = context;\n        this.ctx.save();\n        this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]);\n\n        resetCtxToDefault(this.ctx);\n      } else {\n        resetCtxToDefault(this.ctx);\n\n        // Consume a potential path before clipping.\n        this.endPath(opIdx);\n\n        const clip = new Path2D();\n        clip.rect(rect[0], rect[1], width, height);\n        this.ctx.clip(clip);\n      }\n    }\n\n    this.current = new CanvasExtraState(\n      this.ctx.canvas.width,\n      this.ctx.canvas.height\n    );\n\n    this.baseTransformStack.push(this.baseTransform);\n    this.transform(opIdx, ...transform);\n    this.transform(opIdx, ...matrix);\n    this.baseTransform = getCurrentTransform(this.ctx);\n  }\n\n  endAnnotation(opIdx) {\n    if (this.annotationCanvas) {\n      this.ctx.restore();\n      this.#drawFilter();\n\n      this.ctx = this.annotationCanvas.savedCtx;\n      delete this.annotationCanvas.savedCtx;\n      delete this.annotationCanvas;\n    }\n    this.baseTransform = this.baseTransformStack.pop();\n  }\n\n  paintImageMaskXObject(opIdx, img) {\n    if (!this.contentVisible) {\n      return;\n    }\n\n    const count = img.count;\n    img = this.getObject(opIdx, img.data, img);\n    img.count = count;\n\n    const started = this.#beginKnockoutElement(this.current.fillAlpha);\n    const ctx = this.ctx;\n    const mask = this._createMaskCanvas(opIdx, img);\n    const maskCanvas = mask.canvas;\n\n    ctx.save();\n    // The mask is drawn with the transform applied. Reset the current\n    // transform to draw to the identity.\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);\n    this.dependencyTracker\n      ?.resetBBox(opIdx)\n      .recordBBox(\n        opIdx,\n        this.ctx,\n        mask.offsetX,\n        mask.offsetX + maskCanvas.width,\n        mask.offsetY,\n        mask.offsetY + maskCanvas.height\n      )\n      .recordOperation(opIdx);\n    ctx.restore();\n    if (mask.canvasEntry) {\n      this.canvasFactory.destroy(mask.canvasEntry);\n    }\n    this.compose();\n    this.#endKnockoutElement(started);\n  }\n\n  paintImageMaskXObjectRepeat(\n    opIdx,\n    img,\n    scaleX,\n    skewX = 0,\n    skewY = 0,\n    scaleY,\n    positions\n  ) {\n    if (!this.contentVisible) {\n      return;\n    }\n\n    img = this.getObject(opIdx, img.data, img);\n\n    const started = this.#beginKnockoutElement(this.current.fillAlpha);\n    const ctx = this.ctx;\n    ctx.save();\n    const currentTransform = getCurrentTransform(ctx);\n    ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);\n    const mask = this._createMaskCanvas(opIdx, img);\n\n    ctx.setTransform(\n      1,\n      0,\n      0,\n      1,\n      mask.offsetX - currentTransform[4],\n      mask.offsetY - currentTransform[5]\n    );\n    this.dependencyTracker?.resetBBox(opIdx);\n    for (let i = 0, ii = positions.length; i < ii; i += 2) {\n      const trans = Util.transform(currentTransform, [\n        scaleX,\n        skewX,\n        skewY,\n        scaleY,\n        positions[i],\n        positions[i + 1],\n      ]);\n\n      // Here we want to apply the transform at the origin,\n      // hence no additional computation is necessary.\n      ctx.drawImage(mask.canvas, trans[4], trans[5]);\n      this.dependencyTracker?.recordBBox(\n        opIdx,\n        this.ctx,\n        trans[4],\n        trans[4] + mask.canvas.width,\n        trans[5],\n        trans[5] + mask.canvas.height\n      );\n    }\n    ctx.restore();\n    if (mask.canvasEntry) {\n      this.canvasFactory.destroy(mask.canvasEntry);\n    }\n    this.compose();\n\n    this.dependencyTracker?.recordOperation(opIdx);\n    this.#endKnockoutElement(started);\n  }\n\n  paintImageMaskXObjectGroup(opIdx, images) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const started = this.#beginKnockoutElement(this.current.fillAlpha);\n    const ctx = this.ctx;\n\n    const fillColor = this.current.fillColor;\n    const isPatternFill = this.current.patternFill;\n\n    this.dependencyTracker\n      ?.resetBBox(opIdx)\n      .recordDependencies(opIdx, Dependencies.transformAndFill);\n\n    for (const image of images) {\n      const { data, width, height, transform } = image;\n\n      const maskCanvas = this.canvasFactory.create(width, height);\n      const maskCtx = maskCanvas.context;\n      maskCtx.save();\n\n      const img = this.getObject(opIdx, data, image);\n      putBinaryImageMask(maskCtx, img);\n\n      maskCtx.globalCompositeOperation = \"source-in\";\n\n      maskCtx.fillStyle = isPatternFill\n        ? fillColor.getPattern(\n            maskCtx,\n            this,\n            getCurrentTransformInverse(ctx),\n            PathType.FILL,\n            opIdx\n          )\n        : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n\n      maskCtx.restore();\n\n      ctx.save();\n      ctx.transform(...transform);\n      ctx.scale(1, -1);\n      drawImageAtIntegerCoords(\n        ctx,\n        maskCanvas.canvas,\n        0,\n        0,\n        width,\n        height,\n        0,\n        -1,\n        1,\n        1\n      );\n      this.canvasFactory.destroy(maskCanvas);\n\n      this.dependencyTracker?.recordBBox(opIdx, ctx, 0, width, 0, height);\n      ctx.restore();\n    }\n    this.compose();\n    this.dependencyTracker?.recordOperation(opIdx);\n    this.#endKnockoutElement(started);\n  }\n\n  paintImageXObject(opIdx, objId) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const imgData = this.getObject(opIdx, objId);\n    if (!imgData) {\n      warn(\"Dependent image isn't ready yet\");\n      return;\n    }\n\n    this.paintInlineImageXObject(opIdx, imgData);\n  }\n\n  paintImageXObjectRepeat(opIdx, objId, scaleX, scaleY, positions) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const imgData = this.getObject(opIdx, objId);\n    if (!imgData) {\n      warn(\"Dependent image isn't ready yet\");\n      return;\n    }\n\n    const width = imgData.width;\n    const height = imgData.height;\n    const map = [];\n    for (let i = 0, ii = positions.length; i < ii; i += 2) {\n      map.push({\n        transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n        x: 0,\n        y: 0,\n        w: width,\n        h: height,\n      });\n    }\n    this.paintInlineImageXObjectGroup(opIdx, imgData, map);\n  }\n\n  applyTransferMapsToCanvas(ctx) {\n    if (this.current.transferMaps !== \"none\") {\n      ctx.filter = this.current.transferMaps;\n      ctx.drawImage(ctx.canvas, 0, 0);\n      ctx.filter = \"none\";\n    }\n    return ctx.canvas;\n  }\n\n  applyTransferMapsToBitmap(imgData) {\n    if (this.current.transferMaps === \"none\") {\n      return { img: imgData.bitmap, canvasEntry: null };\n    }\n    const { bitmap, width, height } = imgData;\n    const tmpCanvas = this.canvasFactory.create(width, height);\n    const tmpCtx = tmpCanvas.context;\n    tmpCtx.filter = this.current.transferMaps;\n    tmpCtx.drawImage(bitmap, 0, 0);\n    tmpCtx.filter = \"none\";\n\n    return { img: tmpCanvas.canvas, canvasEntry: tmpCanvas };\n  }\n\n  paintInlineImageXObject(opIdx, imgData) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const width = imgData.width;\n    const height = imgData.height;\n    const started = this.#beginKnockoutElement(this.current.fillAlpha);\n    const ctx = this.ctx;\n\n    this.save(opIdx);\n\n    // The filter, if any, will be applied in applyTransferMapsToBitmap.\n    // It must be applied to the image before rescaling else some artifacts\n    // could appear.\n    // The final restore will reset it to its value.\n    const { filter } = ctx;\n    if (filter !== \"none\" && filter !== \"\") {\n      ctx.filter = \"none\";\n    }\n\n    // scale the image to the unit square\n    ctx.scale(1 / width, -1 / height);\n\n    let imgToPaint;\n    let inlineImgCanvas = null;\n    if (imgData.bitmap) {\n      const result = this.applyTransferMapsToBitmap(imgData);\n      imgToPaint = result.img;\n      inlineImgCanvas = result.canvasEntry;\n    } else {\n      const tmpCanvas = this.canvasFactory.create(width, height);\n      putBinaryImageData(tmpCanvas.context, imgData);\n      imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context);\n      inlineImgCanvas = tmpCanvas;\n    }\n\n    const scaled = this._scaleImage(\n      imgToPaint,\n      getCurrentTransformInverse(ctx)\n    );\n    ctx.imageSmoothingEnabled = getImageSmoothingEnabled(\n      getCurrentTransform(ctx),\n      imgData.interpolate\n    );\n\n    if (this.dependencyTracker) {\n      this.dependencyTracker\n        .resetBBox(opIdx)\n        .recordBBox(opIdx, ctx, 0, width, -height, 0)\n        .recordDependencies(opIdx, Dependencies.imageXObject)\n        .recordOperation(opIdx);\n      this.imagesTracker?.record(\n        ctx,\n        width,\n        height,\n        this.dependencyTracker.clipBox\n      );\n    }\n\n    drawImageAtIntegerCoords(\n      ctx,\n      scaled.img,\n      0,\n      0,\n      scaled.paintWidth,\n      scaled.paintHeight,\n      0,\n      -height,\n      width,\n      height\n    );\n    if (scaled.tmpCanvas) {\n      this.canvasFactory.destroy(scaled.tmpCanvas);\n    }\n    if (inlineImgCanvas) {\n      this.canvasFactory.destroy(inlineImgCanvas);\n    }\n    this.compose();\n    this.restore(opIdx);\n    this.#endKnockoutElement(started);\n  }\n\n  paintInlineImageXObjectGroup(opIdx, imgData, map) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const started = this.#beginKnockoutElement(this.current.fillAlpha);\n    const ctx = this.ctx;\n    let imgToPaint;\n    let inlineImgCanvas = null;\n    if (imgData.bitmap) {\n      imgToPaint = imgData.bitmap;\n    } else {\n      const w = imgData.width;\n      const h = imgData.height;\n\n      const tmpCanvas = this.canvasFactory.create(w, h);\n      putBinaryImageData(tmpCanvas.context, imgData);\n      imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context);\n      inlineImgCanvas = tmpCanvas;\n    }\n\n    this.dependencyTracker?.resetBBox(opIdx);\n\n    for (const entry of map) {\n      ctx.save();\n      ctx.transform(...entry.transform);\n      ctx.scale(1, -1);\n      drawImageAtIntegerCoords(\n        ctx,\n        imgToPaint,\n        entry.x,\n        entry.y,\n        entry.w,\n        entry.h,\n        0,\n        -1,\n        1,\n        1\n      );\n      this.dependencyTracker?.recordBBox(opIdx, ctx, 0, 1, -1, 0);\n      ctx.restore();\n    }\n    if (inlineImgCanvas) {\n      this.canvasFactory.destroy(inlineImgCanvas);\n    }\n    this.dependencyTracker?.recordOperation(opIdx);\n    this.compose();\n    this.#endKnockoutElement(started);\n  }\n\n  paintSolidColorImageMask(opIdx) {\n    if (!this.contentVisible) {\n      return;\n    }\n    const started = this.#beginKnockoutElement(this.current.fillAlpha);\n    this.dependencyTracker\n      ?.resetBBox(opIdx)\n      .recordBBox(opIdx, this.ctx, 0, 1, 0, 1)\n      .recordDependencies(opIdx, Dependencies.fill)\n      .recordOperation(opIdx);\n    this.ctx.fillRect(0, 0, 1, 1);\n    this.compose();\n    this.#endKnockoutElement(started);\n  }\n\n  // Marked content\n\n  markPoint(opIdx, tag) {\n    // TODO Marked content.\n  }\n\n  markPointProps(opIdx, tag, properties) {\n    // TODO Marked content.\n  }\n\n  beginMarkedContent(opIdx, tag) {\n    this.dependencyTracker?.beginMarkedContent(opIdx);\n    this.markedContentStack.push({\n      visible: true,\n    });\n  }\n\n  beginMarkedContentProps(opIdx, tag, properties) {\n    this.dependencyTracker?.beginMarkedContent(opIdx);\n    if (tag === \"OC\") {\n      this.markedContentStack.push({\n        visible: this.optionalContentConfig.isVisible(properties),\n      });\n    } else {\n      this.markedContentStack.push({\n        visible: true,\n      });\n    }\n    this.contentVisible = this.isContentVisible();\n  }\n\n  endMarkedContent(opIdx) {\n    this.dependencyTracker?.endMarkedContent(opIdx);\n    this.markedContentStack.pop();\n    this.contentVisible = this.isContentVisible();\n  }\n\n  // Compatibility\n\n  beginCompat(opIdx) {\n    // TODO ignore undefined operators (should we do that anyway?)\n  }\n\n  endCompat(opIdx) {\n    // TODO stop ignoring undefined operators\n  }\n\n  // Helper functions\n\n  consumePath(opIdx, path, clipBox) {\n    const isEmpty = this.current.isEmptyClip();\n    if (this.pendingClip) {\n      this.current.updateClipFromPath();\n    }\n    if (!this.pendingClip) {\n      this.compose(clipBox);\n    }\n    const ctx = this.ctx;\n    if (this.pendingClip) {\n      if (!isEmpty) {\n        if (this.pendingClip === EO_CLIP) {\n          ctx.clip(path, \"evenodd\");\n        } else {\n          ctx.clip(path);\n        }\n      }\n      this.pendingClip = null;\n      this.dependencyTracker\n        ?.bboxToClipBoxDropOperation(opIdx)\n        .recordFutureForcedDependency(\"clipPath\", opIdx);\n    } else {\n      this.dependencyTracker?.recordOperation(opIdx);\n    }\n\n    this.current.startNewPathAndClipBox(this.current.clipBox);\n  }\n\n  getSinglePixelWidth() {\n    if (!this._cachedGetSinglePixelWidth) {\n      const m = getCurrentTransform(this.ctx);\n      if (m[1] === 0 && m[2] === 0) {\n        // Fast path\n        this._cachedGetSinglePixelWidth =\n          1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));\n      } else {\n        const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);\n        const normX = Math.hypot(m[0], m[2]);\n        const normY = Math.hypot(m[1], m[3]);\n        this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;\n      }\n    }\n    return this._cachedGetSinglePixelWidth;\n  }\n\n  getScaleForStroking() {\n    // A pixel has thicknessX = thicknessY = 1;\n    // A transformed pixel is a parallelogram and the thicknesses\n    // corresponds to the heights.\n    // The goal of this function is to rescale before setting the\n    // lineWidth in order to have both thicknesses greater or equal\n    // to 1 after transform.\n    if (this._cachedScaleForStroking[0] === -1) {\n      const { lineWidth } = this.current;\n      const { a, b, c, d } = this.ctx.getTransform();\n      let scaleX, scaleY;\n\n      if (b === 0 && c === 0) {\n        // Fast path\n        const normX = Math.abs(a);\n        const normY = Math.abs(d);\n        if (normX === normY) {\n          if (lineWidth === 0) {\n            scaleX = scaleY = 1 / normX;\n          } else {\n            const scaledLineWidth = normX * lineWidth;\n            scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;\n          }\n        } else if (lineWidth === 0) {\n          scaleX = 1 / normX;\n          scaleY = 1 / normY;\n        } else {\n          const scaledXLineWidth = normX * lineWidth;\n          const scaledYLineWidth = normY * lineWidth;\n          scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;\n          scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;\n        }\n      } else {\n        // A pixel (base (x, y)) is transformed by M into a parallelogram:\n        //  - its area is |det(M)|;\n        //  - heightY (orthogonal to Mx) has a length: |det(M)| / norm(Mx);\n        //  - heightX (orthogonal to My) has a length: |det(M)| / norm(My).\n        // heightX and heightY are the thicknesses of the transformed pixel\n        // and they must be both greater or equal to 1.\n        const absDet = Math.abs(a * d - b * c);\n        const normX = Math.hypot(a, b);\n        const normY = Math.hypot(c, d);\n        if (lineWidth === 0) {\n          scaleX = normY / absDet;\n          scaleY = normX / absDet;\n        } else {\n          const baseArea = lineWidth * absDet;\n          scaleX = normY > baseArea ? normY / baseArea : 1;\n          scaleY = normX > baseArea ? normX / baseArea : 1;\n        }\n      }\n      this._cachedScaleForStroking[0] = scaleX;\n      this._cachedScaleForStroking[1] = scaleY;\n    }\n    return this._cachedScaleForStroking;\n  }\n\n  // Rescale before stroking in order to have a final lineWidth\n  // with both thicknesses greater or equal to 1.\n  rescaleAndStroke(path, saveRestore) {\n    const {\n      ctx,\n      current: { lineWidth },\n    } = this;\n    const [scaleX, scaleY] = this.getScaleForStroking();\n\n    if (scaleX === scaleY) {\n      ctx.lineWidth = (lineWidth || 1) * scaleX;\n      ctx.stroke(path);\n      return;\n    }\n\n    const dashes = ctx.getLineDash();\n    if (saveRestore) {\n      ctx.save();\n    }\n\n    ctx.scale(scaleX, scaleY);\n    SCALE_MATRIX.a = 1 / scaleX;\n    SCALE_MATRIX.d = 1 / scaleY;\n    const newPath = new Path2D();\n    newPath.addPath(path, SCALE_MATRIX);\n\n    // How the dashed line is rendered depends on the current transform...\n    // so we added a rescale to handle too thin lines and consequently\n    // the way the line is dashed will be modified.\n    // If scaleX === scaleY, the dashed lines will be rendered correctly\n    // else we'll have some bugs (but only with too thin lines).\n    // Here we take the max... why not taking the min... or something else.\n    // Anyway, as said it's buggy when scaleX !== scaleY.\n    if (dashes.length > 0) {\n      const scale = Math.max(scaleX, scaleY);\n      ctx.setLineDash(dashes.map(x => x / scale));\n      ctx.lineDashOffset /= scale;\n    }\n\n    ctx.lineWidth = lineWidth || 1;\n    ctx.stroke(newPath);\n\n    if (saveRestore) {\n      ctx.restore();\n    }\n  }\n\n  isContentVisible() {\n    for (let i = this.markedContentStack.length - 1; i >= 0; i--) {\n      if (!this.markedContentStack[i].visible) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\nfor (const op in OPS) {\n  if (CanvasGraphics.prototype[op] !== undefined) {\n    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];\n  }\n}\n\nexport { CanvasGraphics };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, unreachable } from \"./util.js\";\n\n/**\n * Interface that represents PDF data transport. If possible, it allows\n * progressively load entire or fragment of the PDF binary data.\n */\nclass BasePDFStream {\n  #PDFStreamReader = null;\n\n  #PDFStreamRangeReader = null;\n\n  _fullReader = null;\n\n  _rangeReaders = new Set();\n\n  _source = null;\n\n  constructor(source, PDFStreamReader, PDFStreamRangeReader) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BasePDFStream\n    ) {\n      unreachable(\"Cannot initialize BasePDFStream.\");\n    }\n    this._source = source;\n\n    this.#PDFStreamReader = PDFStreamReader;\n    this.#PDFStreamRangeReader = PDFStreamRangeReader;\n  }\n\n  get _progressiveDataLength() {\n    return this._fullReader?._loaded ?? 0;\n  }\n\n  /**\n   * Gets a reader for the entire PDF data.\n   * @returns {BasePDFStreamReader}\n   */\n  getFullReader() {\n    assert(\n      !this._fullReader,\n      \"BasePDFStream.getFullReader can only be called once.\"\n    );\n    return (this._fullReader = new this.#PDFStreamReader(this));\n  }\n\n  /**\n   * Gets a reader for the range of the PDF data.\n   *\n   * NOTE: Currently this method is only expected to be invoked *after*\n   * the `BasePDFStreamReader.prototype.headersReady` promise has resolved.\n   *\n   * @param {number} begin - the start offset of the data.\n   * @param {number} end - the end offset of the data.\n   * @returns {BasePDFStreamRangeReader}\n   */\n  getRangeReader(begin, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n    const reader = new this.#PDFStreamRangeReader(this, begin, end);\n    this._rangeReaders.add(reader);\n    return reader;\n  }\n\n  /**\n   * Cancels all opened reader and closes all their opened requests.\n   * @param {Object} reason - the reason for cancelling\n   */\n  cancelAllRequests(reason) {\n    this._fullReader?.cancel(reason);\n\n    // Always create a copy of the rangeReaders.\n    for (const reader of new Set(this._rangeReaders)) {\n      reader.cancel(reason);\n    }\n  }\n}\n\n/**\n * Interface for a PDF binary data reader.\n */\nclass BasePDFStreamReader {\n  /**\n   * Sets or gets the progress callback. The callback can be useful when the\n   * isStreamingSupported property of the object is defined as false.\n   * The callback is called with one parameter: an object with the loaded and\n   * total properties.\n   */\n  onProgress = null;\n\n  _contentLength = 0;\n\n  _filename = null;\n\n  _headersCapability = Promise.withResolvers();\n\n  _isRangeSupported = false;\n\n  _isStreamingSupported = false;\n\n  _loaded = 0;\n\n  _stream = null;\n\n  constructor(stream) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BasePDFStreamReader\n    ) {\n      unreachable(\"Cannot initialize BasePDFStreamReader.\");\n    }\n    this._stream = stream;\n  }\n\n  _callOnProgress() {\n    this.onProgress?.({ loaded: this._loaded, total: this._contentLength });\n  }\n\n  /**\n   * Gets a promise that is resolved when the headers and other metadata of\n   * the PDF data stream are available.\n   * @type {Promise}\n   */\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  /**\n   * Gets the Content-Disposition filename. It is defined after the headersReady\n   * promise is resolved.\n   * @type {string|null} The filename, or `null` if the Content-Disposition\n   *                     header is missing/invalid.\n   */\n  get filename() {\n    return this._filename;\n  }\n\n  /**\n   * Gets PDF binary data length. It is defined after the headersReady promise\n   * is resolved.\n   * @type {number} The data length (or 0 if unknown).\n   */\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  /**\n   * Gets ability of the stream to handle range requests. It is defined after\n   * the headersReady promise is resolved. Rejected when the reader is cancelled\n   * or an error occurs.\n   * @type {boolean}\n   */\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  /**\n   * Gets ability of the stream to progressively load binary data. It is defined\n   * after the headersReady promise is resolved.\n   * @type {boolean}\n   */\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  /**\n   * Requests a chunk of the binary data. The method returns the promise, which\n   * is resolved into object with properties \"value\" and \"done\". If the done\n   * is set to true, then the stream has reached its end, otherwise the value\n   * contains binary data. Cancelled requests will be resolved with the done is\n   * set to true.\n   * @returns {Promise}\n   */\n  async read() {\n    unreachable(\"Abstract method `read` called\");\n  }\n\n  /**\n   * Cancels all pending read requests and closes the stream.\n   * @param {Object} reason\n   */\n  cancel(reason) {\n    unreachable(\"Abstract method `cancel` called\");\n  }\n}\n\n/**\n * Interface for a PDF binary data fragment reader.\n */\nclass BasePDFStreamRangeReader {\n  _stream = null;\n\n  constructor(stream, begin, end) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BasePDFStreamRangeReader\n    ) {\n      unreachable(\"Cannot initialize BasePDFStreamRangeReader.\");\n    }\n    this._stream = stream;\n  }\n\n  /**\n   * Requests a chunk of the binary data. The method returns the promise, which\n   * is resolved into object with properties \"value\" and \"done\". If the done\n   * is set to true, then the stream has reached its end, otherwise the value\n   * contains binary data. Cancelled requests will be resolved with the done is\n   * set to true.\n   * @returns {Promise}\n   */\n  async read() {\n    unreachable(\"Abstract method `read` called\");\n  }\n\n  /**\n   * Cancels all pending read requests and closes the stream.\n   * @param {Object} reason\n   */\n  cancel(reason) {\n    unreachable(\"Abstract method `cancel` called\");\n  }\n}\n\nexport { BasePDFStream, BasePDFStreamRangeReader, BasePDFStreamReader };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes } from \"../shared/util.js\";\n\n// This getFilenameFromContentDispositionHeader function is adapted from\n// https://github.com/Rob--W/open-in-browser/blob/7e2e35a38b8b4e981b11da7b2f01df0149049e92/extension/content-disposition.js\n// with the following changes:\n// - Modified to conform to PDF.js's coding style.\n// - Move return to the end of the function to prevent Babel from dropping the\n//   function declarations.\n\n/**\n * Extract file name from the Content-Disposition HTTP response header.\n *\n * @param {string} contentDisposition\n * @returns {string} Filename, if found in the Content-Disposition header.\n */\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n  let needsEncodingFixup = true;\n\n  // filename*=ext-value (\"ext-value\" from RFC 5987, referenced by RFC 6266).\n  let tmp = toParamRegExp(\"filename\\\\*\", \"i\").exec(contentDisposition);\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = unescape(filename);\n    filename = rfc5987decode(filename);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n\n  // Continuations (RFC 2231 section 3, referenced by RFC 5987 section 3.1).\n  // filename*n*=part\n  // filename*n=part\n  tmp = rfc2231getparam(contentDisposition);\n  if (tmp) {\n    // RFC 2047, section\n    const filename = rfc2047decode(tmp);\n    return fixupEncoding(filename);\n  }\n\n  // filename=value (RFC 5987, section 4.1).\n  tmp = toParamRegExp(\"filename\", \"i\").exec(contentDisposition);\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n\n  // After this line there are only function declarations. We cannot put\n  // \"return\" here for readability because babel would then drop the function\n  // declarations...\n  function toParamRegExp(attributePattern, flags) {\n    return new RegExp(\n      \"(?:^|;)\\\\s*\" +\n        attributePattern +\n        \"\\\\s*=\\\\s*\" +\n        // Captures: value = token | quoted-string\n        // (RFC 2616, section 3.6 and referenced by RFC 6266 4.1)\n        \"(\" +\n        '[^\";\\\\s][^;\\\\s]*' +\n        \"|\" +\n        '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' +\n        \")\",\n      flags\n    );\n  }\n  function textdecode(encoding, value) {\n    if (encoding) {\n      // eslint-disable-next-line no-control-regex\n      if (!/^[\\x00-\\xFF]+$/.test(value)) {\n        return value;\n      }\n      try {\n        const decoder = new TextDecoder(encoding, { fatal: true });\n        const buffer = stringToBytes(value);\n        value = decoder.decode(buffer);\n        needsEncodingFixup = false;\n      } catch {\n        // TextDecoder constructor threw - unrecognized encoding.\n      }\n    }\n    return value;\n  }\n  function fixupEncoding(value) {\n    if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n      // Maybe multi-byte UTF-8.\n      value = textdecode(\"utf-8\", value);\n      if (needsEncodingFixup) {\n        // Try iso-8859-1 encoding.\n        value = textdecode(\"iso-8859-1\", value);\n      }\n    }\n    return value;\n  }\n  function rfc2231getparam(contentDispositionStr) {\n    const matches = [];\n    let match;\n    // Iterate over all filename*n= and filename*n*= with n being an integer\n    // of at least zero. Any non-zero number must not start with '0'.\n    const iter = toParamRegExp(\"filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)\", \"ig\");\n    while ((match = iter.exec(contentDispositionStr)) !== null) {\n      let [, n, quot, part] = match; // eslint-disable-line prefer-const\n      n = parseInt(n, 10);\n      if (n in matches) {\n        // Ignore anything after the invalid second filename*0.\n        if (n === 0) {\n          break;\n        }\n        continue;\n      }\n      matches[n] = [quot, part];\n    }\n    const parts = [];\n    for (let n = 0; n < matches.length; ++n) {\n      if (!(n in matches)) {\n        // Numbers must be consecutive. Truncate when there is a hole.\n        break;\n      }\n      let [quot, part] = matches[n]; // eslint-disable-line prefer-const\n      part = rfc2616unquote(part);\n      if (quot) {\n        part = unescape(part);\n        if (n === 0) {\n          part = rfc5987decode(part);\n        }\n      }\n      parts.push(part);\n    }\n    return parts.join(\"\");\n  }\n  function rfc2616unquote(value) {\n    if (value.startsWith('\"')) {\n      const parts = value.slice(1).split('\\\\\"');\n      // Find the first unescaped \" and terminate there.\n      for (let i = 0; i < parts.length; ++i) {\n        const quotindex = parts[i].indexOf('\"');\n        if (quotindex !== -1) {\n          parts[i] = parts[i].slice(0, quotindex);\n          parts.length = i + 1; // Truncates and stop the iteration.\n        }\n        parts[i] = parts[i].replaceAll(/\\\\(.)/g, \"$1\");\n      }\n      value = parts.join('\"');\n    }\n    return value;\n  }\n  function rfc5987decode(extvalue) {\n    // Decodes \"ext-value\" from RFC 5987.\n    const encodingend = extvalue.indexOf(\"'\");\n    if (encodingend === -1) {\n      // Some servers send \"filename*=\" without encoding 'language' prefix,\n      // e.g. in https://github.com/Rob--W/open-in-browser/issues/26\n      // Let's accept the value like Firefox (57) (Chrome 62 rejects it).\n      return extvalue;\n    }\n    const encoding = extvalue.slice(0, encodingend);\n    const langvalue = extvalue.slice(encodingend + 1);\n    // Ignore language (RFC 5987 section 3.2.1, and RFC 6266 section 4.1 ).\n    const value = langvalue.replace(/^[^']*'/, \"\");\n    return textdecode(encoding, value);\n  }\n  function rfc2047decode(value) {\n    // RFC 2047-decode the result. Firefox tried to drop support for it, but\n    // backed out because some servers use it - https://bugzil.la/875615\n    // Firefox's condition for decoding is here: https://searchfox.org/mozilla-central/rev/4a590a5a15e35d88a3b23dd6ac3c471cf85b04a8/netwerk/mime/nsMIMEHeaderParamImpl.cpp#742-748\n\n    // We are more strict and only recognize RFC 2047-encoding if the value\n    // starts with \"=?\", since then it is likely that the full value is\n    // RFC 2047-encoded.\n\n    // Firefox also decodes words even where RFC 2047 section 5 states:\n    // \"An 'encoded-word' MUST NOT appear within a 'quoted-string'.\"\n    // eslint-disable-next-line no-control-regex\n    if (!value.startsWith(\"=?\") || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n      return value;\n    }\n    // RFC 2047, section 2.4\n    // encoded-word = \"=?\" charset \"?\" encoding \"?\" encoded-text \"?=\"\n    // charset = token (but let's restrict to characters that denote a\n    //       possibly valid encoding).\n    // encoding = q or b\n    // encoded-text = any printable ASCII character other than ? or space.\n    //        ... but Firefox permits ? and space.\n    return value.replaceAll(\n      /=\\?([\\w-]*)\\?([QB])\\?((?:[^?]|\\?(?!=))*)\\?=/gi,\n      function (matches, charset, encoding, text) {\n        if (encoding === \"q\" || encoding === \"Q\") {\n          // RFC 2047 section 4.2.\n          text = text.replaceAll(\"_\", \" \");\n          text = text.replaceAll(/=([0-9a-f]{2})/gi, function (match, hex) {\n            return String.fromCharCode(parseInt(hex, 16));\n          });\n          return textdecode(charset, text);\n        } // else encoding is b or B - base64 (RFC 2047 section 4.1)\n        try {\n          text = atob(text);\n        } catch {}\n        return textdecode(charset, text);\n      }\n    );\n  }\n\n  return \"\";\n}\n\nexport { getFilenameFromContentDispositionHeader };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, ResponseException } from \"../shared/util.js\";\nimport { getFilenameFromContentDispositionHeader } from \"./content_disposition.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\nfunction createHeaders(isHttp, httpHeaders) {\n  const headers = new Headers();\n\n  if (!isHttp || !httpHeaders || typeof httpHeaders !== \"object\") {\n    return headers;\n  }\n  for (const key in httpHeaders) {\n    const val = httpHeaders[key];\n    if (val !== undefined) {\n      headers.append(key, val);\n    }\n  }\n  return headers;\n}\n\nfunction getResponseOrigin(url) {\n  // Notably, null is distinct from \"null\" string (e.g. from file:-URLs).\n  return URL.parse(url)?.origin ?? null;\n}\n\nfunction validateRangeRequestCapabilities({\n  responseHeaders,\n  isHttp,\n  rangeChunkSize,\n  disableRange,\n}) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      Number.isInteger(rangeChunkSize) && rangeChunkSize > 0,\n      \"rangeChunkSize must be an integer larger than zero.\"\n    );\n  }\n  const rv = {\n    contentLength: 0,\n    isRangeSupported: false,\n  };\n\n  const length = parseInt(responseHeaders.get(\"Content-Length\"), 10);\n  if (!Number.isInteger(length)) {\n    return rv;\n  }\n  rv.contentLength = length;\n\n  if (length <= 2 * rangeChunkSize) {\n    // The file size is smaller than the size of two chunks, so it does not\n    // make any sense to abort the request and retry with a range request.\n    return rv;\n  }\n  if (disableRange || !isHttp) {\n    return rv;\n  }\n  if (responseHeaders.get(\"Accept-Ranges\") !== \"bytes\") {\n    return rv;\n  }\n\n  const contentEncoding = responseHeaders.get(\"Content-Encoding\") || \"identity\";\n  if (contentEncoding === \"identity\") {\n    rv.isRangeSupported = true;\n  }\n  return rv;\n}\n\nfunction extractFilenameFromHeader(responseHeaders) {\n  const contentDisposition = responseHeaders.get(\"Content-Disposition\");\n  if (contentDisposition) {\n    let filename = getFilenameFromContentDispositionHeader(contentDisposition);\n    if (filename.includes(\"%\")) {\n      try {\n        filename = decodeURIComponent(filename);\n      } catch {}\n    }\n    if (isPdfFile(filename)) {\n      return filename;\n    }\n  }\n  return null;\n}\n\nfunction createResponseError(status, url) {\n  return new ResponseException(\n    `Unexpected server response (${status}) while retrieving PDF \"${url.href}\".`,\n    status,\n    /* missing = */ status === 404 || (status === 0 && url.protocol === \"file:\")\n  );\n}\n\nfunction ensureResponseOrigin(rangeOrigin, origin) {\n  if (rangeOrigin !== origin) {\n    throw new Error(\n      `Expected range response-origin \"${rangeOrigin}\" to match \"${origin}\".`\n    );\n  }\n}\n\nexport {\n  createHeaders,\n  createResponseError,\n  ensureResponseOrigin,\n  extractFilenameFromHeader,\n  getResponseOrigin,\n  validateRangeRequestCapabilities,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AbortException, assert } from \"../shared/util.js\";\nimport {\n  BasePDFStream,\n  BasePDFStreamRangeReader,\n  BasePDFStreamReader,\n} from \"../shared/base_pdf_stream.js\";\nimport {\n  createHeaders,\n  createResponseError,\n  ensureResponseOrigin,\n  extractFilenameFromHeader,\n  getResponseOrigin,\n  validateRangeRequestCapabilities,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n  throw new Error(\n    'Module \"./fetch_stream.js\" shall not be used with MOZCENTRAL builds.'\n  );\n}\n\nfunction fetchUrl(url, headers, withCredentials, abortController) {\n  return fetch(url, {\n    method: \"GET\",\n    headers,\n    signal: abortController.signal,\n    mode: \"cors\",\n    credentials: withCredentials ? \"include\" : \"same-origin\",\n    redirect: \"follow\",\n  });\n}\n\nfunction ensureResponseStatus(status, url) {\n  if (status !== 200 && status !== 206) {\n    throw createResponseError(status, url);\n  }\n}\n\nfunction getArrayBuffer(val) {\n  if (val instanceof Uint8Array) {\n    return val.buffer;\n  }\n  if (val instanceof ArrayBuffer) {\n    return val;\n  }\n  throw new Error(`getArrayBuffer - unexpected data: ${val}`);\n}\n\nclass PDFFetchStream extends BasePDFStream {\n  _responseOrigin = null;\n\n  constructor(source) {\n    super(source, PDFFetchStreamReader, PDFFetchStreamRangeReader);\n    const { httpHeaders, url } = source;\n\n    assert(\n      /https?:/.test(url.protocol),\n      \"PDFFetchStream only supports http(s):// URLs.\"\n    );\n    this.headers = createHeaders(/* isHttp = */ true, httpHeaders);\n  }\n}\n\nclass PDFFetchStreamReader extends BasePDFStreamReader {\n  _abortController = new AbortController();\n\n  _reader = null;\n\n  constructor(stream) {\n    super(stream);\n    const {\n      disableRange,\n      disableStream,\n      rangeChunkSize,\n      url,\n      withCredentials,\n    } = stream._source;\n\n    this._isStreamingSupported = !disableStream;\n    // Always create a copy of the headers.\n    const headers = new Headers(stream.headers);\n\n    fetchUrl(url, headers, withCredentials, this._abortController)\n      .then(response => {\n        stream._responseOrigin = getResponseOrigin(response.url);\n\n        ensureResponseStatus(response.status, url);\n        this._reader = response.body.getReader();\n\n        const responseHeaders = response.headers;\n\n        const { contentLength, isRangeSupported } =\n          validateRangeRequestCapabilities({\n            responseHeaders,\n            isHttp: true,\n            rangeChunkSize,\n            disableRange,\n          });\n        this._contentLength = contentLength;\n        this._isRangeSupported = isRangeSupported;\n\n        this._filename = extractFilenameFromHeader(responseHeaders);\n\n        // We need to stop reading when range is supported and streaming is\n        // disabled.\n        if (!this._isStreamingSupported && this._isRangeSupported) {\n          this.cancel(new AbortException(\"Streaming is disabled.\"));\n        }\n\n        this._headersCapability.resolve();\n      })\n      .catch(this._headersCapability.reject);\n  }\n\n  async read() {\n    await this._headersCapability.promise;\n    const { value, done } = await this._reader.read();\n    if (done) {\n      return { value, done };\n    }\n    this._loaded += value.byteLength;\n    this._callOnProgress();\n\n    return { value: getArrayBuffer(value), done: false };\n  }\n\n  cancel(reason) {\n    this._reader?.cancel(reason);\n    this._abortController.abort();\n  }\n}\n\nclass PDFFetchStreamRangeReader extends BasePDFStreamRangeReader {\n  _abortController = new AbortController();\n\n  _readCapability = Promise.withResolvers();\n\n  _reader = null;\n\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n    const { url, withCredentials } = stream._source;\n\n    // Always create a copy of the headers.\n    const headers = new Headers(stream.headers);\n    headers.append(\"Range\", `bytes=${begin}-${end - 1}`);\n\n    fetchUrl(url, headers, withCredentials, this._abortController)\n      .then(response => {\n        const responseOrigin = getResponseOrigin(response.url);\n\n        ensureResponseOrigin(responseOrigin, stream._responseOrigin);\n        ensureResponseStatus(response.status, url);\n        this._reader = response.body.getReader();\n\n        this._readCapability.resolve();\n      })\n      .catch(this._readCapability.reject);\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    const { value, done } = await this._reader.read();\n    if (done) {\n      return { value, done };\n    }\n    return { value: getArrayBuffer(value), done: false };\n  }\n\n  cancel(reason) {\n    this._reader?.cancel(reason);\n    this._abortController.abort();\n  }\n}\n\nexport { getArrayBuffer, PDFFetchStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  BasePDFStream,\n  BasePDFStreamRangeReader,\n  BasePDFStreamReader,\n} from \"../shared/base_pdf_stream.js\";\nimport { assert } from \"../shared/util.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\nfunction getArrayBuffer(val) {\n  // Prevent any possible issues by only transferring a Uint8Array that\n  // completely \"utilizes\" its underlying ArrayBuffer.\n  return val instanceof Uint8Array && val.byteLength === val.buffer.byteLength\n    ? val.buffer\n    : new Uint8Array(val).buffer;\n}\n\nfunction endRequests() {\n  for (const capability of this._requests) {\n    capability.resolve({ value: undefined, done: true });\n  }\n  this._requests.length = 0;\n}\n\nclass PDFDataTransportStream extends BasePDFStream {\n  _progressiveDone = false;\n\n  _queuedChunks = [];\n\n  constructor(source) {\n    super(\n      source,\n      PDFDataTransportStreamReader,\n      PDFDataTransportStreamRangeReader\n    );\n    const { pdfDataRangeTransport } = source;\n    const { initialData, progressiveDone } = pdfDataRangeTransport;\n\n    if (initialData?.length > 0) {\n      const buffer = getArrayBuffer(initialData);\n      this._queuedChunks.push(buffer);\n    }\n    this._progressiveDone = progressiveDone;\n\n    const listener = args => {\n      switch (args.type) {\n        case \"range\":\n        case \"progressiveRead\":\n          this.#onReceiveData(args.begin, args.chunk);\n          break;\n        case \"progressiveDone\":\n          this._fullReader?.progressiveDone();\n          this._progressiveDone = true;\n          break;\n      }\n    };\n    pdfDataRangeTransport.transportReady(listener);\n  }\n\n  #onReceiveData(begin, chunk) {\n    const buffer = getArrayBuffer(chunk);\n\n    if (begin === undefined) {\n      if (this._fullReader) {\n        this._fullReader._enqueue(buffer);\n      } else {\n        this._queuedChunks.push(buffer);\n      }\n    } else {\n      const rangeReader = this._rangeReaders\n        .keys()\n        .find(r => r._begin === begin);\n\n      assert(\n        rangeReader,\n        \"#onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.\"\n      );\n      rangeReader._enqueue(buffer);\n    }\n  }\n\n  getFullReader() {\n    const reader = super.getFullReader();\n    this._queuedChunks = null;\n    return reader;\n  }\n\n  getRangeReader(begin, end) {\n    const reader = super.getRangeReader(begin, end);\n\n    if (reader) {\n      reader.onDone = () => this._rangeReaders.delete(reader);\n\n      this._source.pdfDataRangeTransport.requestDataRange(begin, end);\n    }\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    super.cancelAllRequests(reason);\n\n    this._source.pdfDataRangeTransport.abort();\n  }\n}\n\nclass PDFDataTransportStreamReader extends BasePDFStreamReader {\n  #endRequests = endRequests.bind(this);\n\n  _done = false;\n\n  _queuedChunks = null;\n\n  _requests = [];\n\n  constructor(stream) {\n    super(stream);\n    const { pdfDataRangeTransport, disableRange, disableStream } =\n      stream._source;\n    const { length, contentDispositionFilename } = pdfDataRangeTransport;\n\n    this._queuedChunks = stream._queuedChunks || [];\n    for (const chunk of this._queuedChunks) {\n      this._loaded += chunk.byteLength;\n    }\n    this._done = stream._progressiveDone;\n\n    this._contentLength = length;\n    this._isStreamingSupported = !disableStream;\n    this._isRangeSupported = !disableRange;\n\n    if (isPdfFile(contentDispositionFilename)) {\n      this._filename = contentDispositionFilename;\n    }\n    this._headersCapability.resolve();\n\n    // Report loading progress when there is `initialData`, and `_enqueue` has\n    // not been invoked, but with a small delay to give an `onProgress` callback\n    // a chance to be registered first.\n    const loaded = this._loaded;\n    Promise.resolve().then(() => {\n      if (loaded > 0 && this._loaded === loaded) {\n        this._callOnProgress();\n      }\n    });\n  }\n\n  _enqueue(chunk) {\n    if (this._done) {\n      return; // Ignore new data.\n    }\n    if (this._requests.length > 0) {\n      const capability = this._requests.shift();\n      capability.resolve({ value: chunk, done: false });\n    } else {\n      this._queuedChunks.push(chunk);\n    }\n    this._loaded += chunk.byteLength;\n    this._callOnProgress();\n  }\n\n  async read() {\n    if (this._queuedChunks.length > 0) {\n      const chunk = this._queuedChunks.shift();\n      return { value: chunk, done: false };\n    }\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    const capability = Promise.withResolvers();\n    this._requests.push(capability);\n    return capability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n    this.#endRequests();\n  }\n\n  progressiveDone() {\n    this._done ||= true;\n\n    if (this._queuedChunks.length === 0) {\n      this.#endRequests();\n    }\n  }\n}\n\nclass PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader {\n  #endRequests = endRequests.bind(this);\n\n  onDone = null;\n\n  _begin = -1;\n\n  _done = false;\n\n  _queuedChunk = null;\n\n  _requests = [];\n\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n    this._begin = begin;\n  }\n\n  _enqueue(chunk) {\n    if (this._done) {\n      return; // ignore new data\n    }\n    if (this._requests.length === 0) {\n      this._queuedChunk = chunk;\n    } else {\n      const capability = this._requests.shift();\n      capability.resolve({ value: chunk, done: false });\n\n      this.#endRequests();\n    }\n    this._done = true;\n    this.onDone?.();\n  }\n\n  async read() {\n    if (this._queuedChunk) {\n      const chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return { value: chunk, done: false };\n    }\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    const capability = Promise.withResolvers();\n    this._requests.push(capability);\n    return capability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n    this.#endRequests();\n    this.onDone?.();\n  }\n}\n\nexport { endRequests, PDFDataTransportStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, stringToBytes, warn } from \"../shared/util.js\";\nimport {\n  BasePDFStream,\n  BasePDFStreamRangeReader,\n  BasePDFStreamReader,\n} from \"../shared/base_pdf_stream.js\";\nimport {\n  createHeaders,\n  createResponseError,\n  ensureResponseOrigin,\n  extractFilenameFromHeader,\n  getResponseOrigin,\n  validateRangeRequestCapabilities,\n} from \"./network_utils.js\";\nimport { endRequests } from \"./transport_stream.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n  throw new Error(\n    'Module \"./network.js\" shall not be used with MOZCENTRAL builds.'\n  );\n}\n\nconst OK_RESPONSE = 200;\nconst PARTIAL_CONTENT_RESPONSE = 206;\n\nfunction getArrayBuffer(val) {\n  return typeof val !== \"string\" ? val : stringToBytes(val).buffer;\n}\n\nclass PDFNetworkStream extends BasePDFStream {\n  #pendingRequests = new WeakMap();\n\n  _responseOrigin = null;\n\n  constructor(source) {\n    super(source, PDFNetworkStreamReader, PDFNetworkStreamRangeReader);\n    const { httpHeaders, url } = source;\n\n    this.url = url;\n    this.isHttp = /https?:/.test(url.protocol);\n    this.headers = createHeaders(this.isHttp, httpHeaders);\n  }\n\n  /**\n   * @ignore\n   */\n  _request(args) {\n    const xhr = new XMLHttpRequest();\n    const pendingRequest = {\n      validateStatus: null,\n      onHeadersReceived: args.onHeadersReceived,\n      onDone: args.onDone,\n      onError: args.onError,\n      onProgress: args.onProgress,\n    };\n    this.#pendingRequests.set(xhr, pendingRequest);\n\n    xhr.open(\"GET\", this.url);\n    xhr.withCredentials = this._source.withCredentials;\n    for (const [key, val] of this.headers) {\n      xhr.setRequestHeader(key, val);\n    }\n    if (this.isHttp && \"begin\" in args && \"end\" in args) {\n      xhr.setRequestHeader(\"Range\", `bytes=${args.begin}-${args.end - 1}`);\n\n      // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:\n      // \"A server MAY ignore the Range header\". This means it's possible to\n      // get a 200 rather than a 206 response from a range request.\n      pendingRequest.validateStatus = status =>\n        status === PARTIAL_CONTENT_RESPONSE || status === OK_RESPONSE;\n    } else {\n      pendingRequest.validateStatus = status => status === OK_RESPONSE;\n    }\n    xhr.responseType = \"arraybuffer\";\n\n    assert(args.onError, \"Expected `onError` callback to be provided.\");\n    xhr.onerror = () => args.onError(xhr.status);\n    xhr.onreadystatechange = this.#onStateChange.bind(this, xhr);\n    xhr.onprogress = this.#onProgress.bind(this, xhr);\n\n    xhr.send(null);\n\n    return xhr;\n  }\n\n  #onProgress(xhr, evt) {\n    const pendingRequest = this.#pendingRequests.get(xhr);\n    pendingRequest?.onProgress?.(evt);\n  }\n\n  #onStateChange(xhr, evt) {\n    const pendingRequest = this.#pendingRequests.get(xhr);\n    if (!pendingRequest) {\n      return; // Maybe abortRequest was called...\n    }\n\n    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n      pendingRequest.onHeadersReceived();\n      delete pendingRequest.onHeadersReceived;\n    }\n\n    if (xhr.readyState !== 4) {\n      return;\n    }\n\n    if (!this.#pendingRequests.has(xhr)) {\n      // The XHR request might have been aborted in onHeadersReceived()\n      // callback, in which case we should abort request.\n      return;\n    }\n    this.#pendingRequests.delete(xhr);\n\n    // Success status == 0 can be on ftp, file and other protocols.\n    if (xhr.status === 0 && this.isHttp) {\n      pendingRequest.onError(xhr.status);\n      return;\n    }\n    const xhrStatus = xhr.status || OK_RESPONSE;\n\n    if (!pendingRequest.validateStatus(xhrStatus)) {\n      pendingRequest.onError(xhr.status);\n      return;\n    }\n\n    const chunk = getArrayBuffer(xhr.response);\n    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n      const rangeHeader = xhr.getResponseHeader(\"Content-Range\");\n      if (/bytes \\d+-\\d+\\/\\d+/.test(rangeHeader)) {\n        pendingRequest.onDone(chunk);\n      } else {\n        warn(`Missing or invalid \"Content-Range\" header.`);\n        pendingRequest.onError(0);\n      }\n    } else if (chunk) {\n      pendingRequest.onDone(chunk);\n    } else {\n      pendingRequest.onError(xhr.status);\n    }\n  }\n\n  /**\n   * Abort the request, if it's pending.\n   * @ignore\n   */\n  _abortRequest(xhr) {\n    if (this.#pendingRequests.has(xhr)) {\n      this.#pendingRequests.delete(xhr);\n      xhr.abort();\n    }\n  }\n\n  getRangeReader(begin, end) {\n    const reader = super.getRangeReader(begin, end);\n\n    if (reader) {\n      reader.onClosed = () => this._rangeReaders.delete(reader);\n    }\n    return reader;\n  }\n}\n\nclass PDFNetworkStreamReader extends BasePDFStreamReader {\n  #endRequests = endRequests.bind(this);\n\n  _cachedChunks = [];\n\n  _done = false;\n\n  _requests = [];\n\n  _storedError = null;\n\n  constructor(stream) {\n    super(stream);\n    // Note that `XMLHttpRequest` doesn't support streaming, and range requests\n    // will be enabled (if supported) in `this.#onHeadersReceived` below.\n\n    this._fullRequestXhr = stream._request({\n      onHeadersReceived: this.#onHeadersReceived.bind(this),\n      onDone: this.#onDone.bind(this),\n      onError: this.#onError.bind(this),\n      onProgress: this.#onProgress.bind(this),\n    });\n  }\n\n  #onHeadersReceived() {\n    const stream = this._stream;\n    const { disableRange, rangeChunkSize } = stream._source;\n    const fullRequestXhr = this._fullRequestXhr;\n\n    stream._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL);\n\n    const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders();\n    const responseHeaders = new Headers(\n      rawResponseHeaders\n        ? rawResponseHeaders\n            .trimStart()\n            .replace(/[^\\S ]+$/, \"\") // Not `trimEnd`, to keep regular spaces.\n            .split(/[\\r\\n]+/)\n            .map(x => {\n              const [key, ...val] = x.split(\": \");\n              return [key, val.join(\": \")];\n            })\n        : []\n    );\n\n    const { contentLength, isRangeSupported } =\n      validateRangeRequestCapabilities({\n        responseHeaders,\n        isHttp: stream.isHttp,\n        rangeChunkSize,\n        disableRange,\n      });\n    this._contentLength = contentLength;\n    this._isRangeSupported = isRangeSupported;\n\n    this._filename = extractFilenameFromHeader(responseHeaders);\n\n    if (this._isRangeSupported) {\n      // NOTE: by cancelling the full request, and then issuing range\n      // requests, there will be an issue for sites where you can only\n      // request the pdf once. However, if this is the case, then the\n      // server should not be returning that it can support range requests.\n      stream._abortRequest(fullRequestXhr);\n    }\n\n    this._headersCapability.resolve();\n  }\n\n  #onDone(chunk) {\n    if (this._requests.length > 0) {\n      const capability = this._requests.shift();\n      capability.resolve({ value: chunk, done: false });\n    } else {\n      this._cachedChunks.push(chunk);\n    }\n    this._done = true;\n    if (this._cachedChunks.length === 0) {\n      this.#endRequests();\n    }\n  }\n\n  #onError(status) {\n    this._storedError = createResponseError(status, this._stream.url);\n    this._headersCapability.reject(this._storedError);\n    for (const capability of this._requests) {\n      capability.reject(this._storedError);\n    }\n    this._requests.length = 0;\n    this._cachedChunks.length = 0;\n  }\n\n  #onProgress(evt) {\n    this.onProgress?.({\n      loaded: evt.loaded,\n      total: evt.lengthComputable ? evt.total : this._contentLength,\n    });\n  }\n\n  async read() {\n    await this._headersCapability.promise;\n\n    if (this._storedError) {\n      throw this._storedError;\n    }\n    if (this._cachedChunks.length > 0) {\n      const chunk = this._cachedChunks.shift();\n      return { value: chunk, done: false };\n    }\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    const capability = Promise.withResolvers();\n    this._requests.push(capability);\n    return capability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n    this._headersCapability.reject(reason);\n    this.#endRequests();\n\n    this._stream._abortRequest(this._fullRequestXhr);\n    this._fullRequestXhr = null;\n  }\n}\n\nclass PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader {\n  #endRequests = endRequests.bind(this);\n\n  onClosed = null;\n\n  _done = false;\n\n  _queuedChunk = null;\n\n  _requests = [];\n\n  _storedError = null;\n\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n\n    this._requestXhr = stream._request({\n      begin,\n      end,\n      onHeadersReceived: this.#onHeadersReceived.bind(this),\n      onDone: this.#onDone.bind(this),\n      onError: this.#onError.bind(this),\n      onProgress: null,\n    });\n  }\n\n  #onHeadersReceived() {\n    const responseOrigin = getResponseOrigin(this._requestXhr?.responseURL);\n    try {\n      ensureResponseOrigin(responseOrigin, this._stream._responseOrigin);\n    } catch (ex) {\n      this._storedError = ex;\n      this.#onError(0);\n    }\n  }\n\n  #onDone(chunk) {\n    if (this._requests.length > 0) {\n      const capability = this._requests.shift();\n      capability.resolve({ value: chunk, done: false });\n    } else {\n      this._queuedChunk = chunk;\n    }\n    this._done = true;\n    this.#endRequests();\n    this.onClosed?.();\n  }\n\n  #onError(status) {\n    this._storedError ??= createResponseError(status, this._stream.url);\n    for (const capability of this._requests) {\n      capability.reject(this._storedError);\n    }\n    this._requests.length = 0;\n    this._queuedChunk = null;\n  }\n\n  async read() {\n    if (this._storedError) {\n      throw this._storedError;\n    }\n    if (this._queuedChunk !== null) {\n      const chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return { value: chunk, done: false };\n    }\n    if (this._done) {\n      return { value: undefined, done: true };\n    }\n    const capability = Promise.withResolvers();\n    this._requests.push(capability);\n    return capability.promise;\n  }\n\n  cancel(reason) {\n    this._done = true;\n    this.#endRequests();\n\n    this._stream._abortRequest(this._requestXhr);\n    this.onClosed?.();\n  }\n}\n\nexport { PDFNetworkStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\nimport { AbortException, assert } from \"../shared/util.js\";\nimport {\n  BasePDFStream,\n  BasePDFStreamRangeReader,\n  BasePDFStreamReader,\n} from \"../shared/base_pdf_stream.js\";\nimport { createResponseError } from \"./network_utils.js\";\nimport { getArrayBuffer } from \"./fetch_stream.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n  throw new Error(\n    'Module \"./node_stream.js\" shall not be used with MOZCENTRAL builds.'\n  );\n}\n\nfunction getReadableStream(url, opts = null) {\n  const fs = process.getBuiltinModule(\"fs\");\n  const { Readable } = process.getBuiltinModule(\"stream\");\n\n  const readStream = fs.createReadStream(url, opts);\n  return Readable.toWeb(readStream);\n}\n\nclass PDFNodeStream extends BasePDFStream {\n  constructor(source) {\n    super(source, PDFNodeStreamReader, PDFNodeStreamRangeReader);\n    const { url } = source;\n\n    assert(\n      url.protocol === \"file:\",\n      \"PDFNodeStream only supports file:// URLs.\"\n    );\n  }\n}\n\nclass PDFNodeStreamReader extends BasePDFStreamReader {\n  _reader = null;\n\n  constructor(stream) {\n    super(stream);\n    const { disableRange, disableStream, rangeChunkSize, url } = stream._source;\n\n    this._isStreamingSupported = !disableStream;\n\n    const fs = process.getBuiltinModule(\"fs/promises\");\n    fs.lstat(url)\n      .then(stat => {\n        const readableStream = getReadableStream(url);\n        this._reader = readableStream.getReader();\n\n        const { size } = stat;\n        this._contentLength = size;\n        // When the file size is smaller than the size of two chunks, it doesn't\n        // make any sense to abort the request and retry with a range request.\n        this._isRangeSupported = !disableRange && size > 2 * rangeChunkSize;\n\n        // We need to stop reading when range is supported and streaming is\n        // disabled.\n        if (!this._isStreamingSupported && this._isRangeSupported) {\n          this.cancel(new AbortException(\"Streaming is disabled.\"));\n        }\n\n        this._headersCapability.resolve();\n      })\n      .catch(error => {\n        if (error.code === \"ENOENT\") {\n          error = createResponseError(/* status = */ 0, url);\n        }\n        this._headersCapability.reject(error);\n      });\n  }\n\n  async read() {\n    await this._headersCapability.promise;\n    const { value, done } = await this._reader.read();\n    if (done) {\n      return { value, done };\n    }\n    this._loaded += value.byteLength;\n    this._callOnProgress();\n\n    return { value: getArrayBuffer(value), done: false };\n  }\n\n  cancel(reason) {\n    this._reader?.cancel(reason);\n  }\n}\n\nclass PDFNodeStreamRangeReader extends BasePDFStreamRangeReader {\n  _readCapability = Promise.withResolvers();\n\n  _reader = null;\n\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n    const { url } = stream._source;\n\n    try {\n      const readableStream = getReadableStream(url, {\n        start: begin,\n        end: end - 1,\n      });\n      this._reader = readableStream.getReader();\n\n      this._readCapability.resolve();\n    } catch (error) {\n      this._readCapability.reject(error);\n    }\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    const { value, done } = await this._reader.read();\n    if (done) {\n      return { value, done };\n    }\n    return { value: getArrayBuffer(value), done: false };\n  }\n\n  cancel(reason) {\n    this._reader?.cancel(reason);\n  }\n}\n\nexport { PDFNodeStream };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isNodeJS } from \"../shared/util.js\";\nimport { isValidFetchUrl } from \"./display_utils.js\";\nimport { PDFFetchStream } from \"./fetch_stream.js\";\nimport { PDFNetworkStream } from \"./network.js\";\nimport { PDFNodeStream } from \"./node_stream.js\";\n\nfunction getNetworkStream(url) {\n  // eslint-disable-next-line no-nested-ternary\n  return isValidFetchUrl(url)\n    ? PDFFetchStream\n    : typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n      ? PDFNodeStream\n      : PDFNetworkStream;\n}\n\nexport { getNetworkStream };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass GlobalWorkerOptions {\n  static #port = null;\n\n  static #src = \"\";\n\n  /**\n   * @type {Worker | null}\n   */\n  static get workerPort() {\n    return this.#port;\n  }\n\n  /**\n   * @param {Worker | null} workerPort - Defines global port for worker process.\n   *   Overrides the `workerSrc` option.\n   */\n  static set workerPort(val) {\n    if (\n      !(typeof Worker !== \"undefined\" && val instanceof Worker) &&\n      val !== null\n    ) {\n      throw new Error(\"Invalid `workerPort` type.\");\n    }\n    this.#port = val;\n  }\n\n  /**\n   * @type {string}\n   */\n  static get workerSrc() {\n    return this.#src;\n  }\n\n  /**\n   * @param {string} workerSrc - A string containing the path and filename of\n   *   the worker file.\n   *\n   *   NOTE: The `workerSrc` option should always be set, in order to prevent\n   *         any issues when using the PDF.js library.\n   */\n  static set workerSrc(val) {\n    if (typeof val !== \"string\") {\n      throw new Error(\"Invalid `workerSrc` type.\");\n    }\n    this.#src = val;\n  }\n}\n\nexport { GlobalWorkerOptions };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass Metadata {\n  #map;\n\n  #data;\n\n  constructor({ parsedData, rawData }) {\n    this.#map = parsedData;\n    this.#data = rawData;\n  }\n\n  getRaw() {\n    return this.#data;\n  }\n\n  get(name) {\n    return this.#map.get(name) ?? null;\n  }\n\n  [Symbol.iterator]() {\n    return this.#map.entries();\n  }\n}\n\nexport { Metadata };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  info,\n  RenderingIntentFlag,\n  unreachable,\n  warn,\n} from \"../shared/util.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst INTERNAL = Symbol(\"INTERNAL\");\n\nclass OptionalContentGroup {\n  #isDisplay = false;\n\n  #isPrint = false;\n\n  #userSet = false;\n\n  #visible = true;\n\n  constructor(renderingIntent, { name, intent, usage, rbGroups }) {\n    this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY);\n    this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n    this.name = name;\n    this.intent = intent;\n    this.usage = usage;\n    this.rbGroups = rbGroups;\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get visible() {\n    if (this.#userSet) {\n      return this.#visible;\n    }\n    if (!this.#visible) {\n      return false;\n    }\n    const { print, view } = this.usage;\n\n    if (this.#isDisplay) {\n      return view?.viewState !== \"OFF\";\n    } else if (this.#isPrint) {\n      return print?.printState !== \"OFF\";\n    }\n    return true;\n  }\n\n  /**\n   * @ignore\n   */\n  _setVisible(internal, visible, userSet = false) {\n    if (internal !== INTERNAL) {\n      unreachable(\"Internal method `_setVisible` called.\");\n    }\n    this.#userSet = userSet;\n    this.#visible = visible;\n  }\n\n  get serializable() {\n    return {\n      userSet: this.#userSet,\n      visible: this.#visible,\n    };\n  }\n}\n\nclass OptionalContentConfig {\n  #cachedGetHash = null;\n\n  #groups = new Map();\n\n  #initialHash = null;\n\n  #order = null;\n\n  #rawData;\n\n  creator = null;\n\n  name = null;\n\n  constructor(\n    data,\n    renderingIntent = RenderingIntentFlag.DISPLAY,\n    groupState = null // Should *only* be used with `fromSerializable`.\n  ) {\n    this.#rawData = data;\n    this.renderingIntent = renderingIntent;\n\n    if (data === null) {\n      return;\n    }\n    this.name = data.name;\n    this.creator = data.creator;\n    this.#order = data.order;\n    for (const group of data.groups) {\n      this.#groups.set(\n        group.id,\n        new OptionalContentGroup(renderingIntent, group)\n      );\n    }\n\n    if (groupState) {\n      if (groupState.size !== this.#groups.size) {\n        unreachable(\"Incorrect serialized groupState.\");\n      }\n      for (const [id, group] of groupState) {\n        this.#groups\n          .get(id)\n          ._setVisible(INTERNAL, group.visible, group.userSet);\n      }\n    } else {\n      if (data.baseState === \"OFF\") {\n        for (const group of this.#groups.values()) {\n          group._setVisible(INTERNAL, false);\n        }\n      }\n\n      for (const on of data.on) {\n        this.#groups.get(on)._setVisible(INTERNAL, true);\n      }\n\n      for (const off of data.off) {\n        this.#groups.get(off)._setVisible(INTERNAL, false);\n      }\n    }\n\n    // The following code must always run *last* in the constructor.\n    this.#initialHash = this.getHash();\n  }\n\n  #evaluateVisibilityExpression(array) {\n    const length = array.length;\n    if (length < 2) {\n      return true;\n    }\n    const operator = array[0];\n    for (let i = 1; i < length; i++) {\n      const element = array[i];\n      let state;\n      if (Array.isArray(element)) {\n        state = this.#evaluateVisibilityExpression(element);\n      } else if (this.#groups.has(element)) {\n        state = this.#groups.get(element).visible;\n      } else {\n        warn(`Optional content group not found: ${element}`);\n        return true;\n      }\n      switch (operator) {\n        case \"And\":\n          if (!state) {\n            return false;\n          }\n          break;\n        case \"Or\":\n          if (state) {\n            return true;\n          }\n          break;\n        case \"Not\":\n          return !state;\n        default:\n          return true;\n      }\n    }\n    return operator === \"And\";\n  }\n\n  isVisible(group) {\n    if (this.#groups.size === 0) {\n      return true;\n    }\n    if (!group) {\n      info(\"Optional content group not defined.\");\n      return true;\n    }\n    if (group.type === \"OCG\") {\n      if (!this.#groups.has(group.id)) {\n        warn(`Optional content group not found: ${group.id}`);\n        return true;\n      }\n      return this.#groups.get(group.id).visible;\n    } else if (group.type === \"OCMD\") {\n      // Per the spec, the expression should be preferred if available.\n      if (group.expression) {\n        return this.#evaluateVisibilityExpression(group.expression);\n      }\n      if (!group.policy || group.policy === \"AnyOn\") {\n        // Default\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (this.#groups.get(id).visible) {\n            return true;\n          }\n        }\n        return false;\n      } else if (group.policy === \"AllOn\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (!this.#groups.get(id).visible) {\n            return false;\n          }\n        }\n        return true;\n      } else if (group.policy === \"AnyOff\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (!this.#groups.get(id).visible) {\n            return true;\n          }\n        }\n        return false;\n      } else if (group.policy === \"AllOff\") {\n        for (const id of group.ids) {\n          if (!this.#groups.has(id)) {\n            warn(`Optional content group not found: ${id}`);\n            return true;\n          }\n          if (this.#groups.get(id).visible) {\n            return false;\n          }\n        }\n        return true;\n      }\n      warn(`Unknown optional content policy ${group.policy}.`);\n      return true;\n    }\n    warn(`Unknown group type ${group.type}.`);\n    return true;\n  }\n\n  setVisibility(id, visible = true, preserveRB = true) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"WORKER_THREAD\")) {\n      throw new Error(\"Not implemented: setVisibility\");\n    }\n    const group = this.#groups.get(id);\n    if (!group) {\n      warn(`Optional content group not found: ${id}`);\n      return;\n    }\n\n    // If the visibility is about to be set to `true` and the group belongs to\n    // any radiobutton groups, hide all other OCGs in these radiobutton groups,\n    // provided that radiobutton state relationships are to be preserved.\n    if (preserveRB && visible && group.rbGroups.length) {\n      for (const rbGroup of group.rbGroups) {\n        for (const otherId of rbGroup) {\n          if (otherId !== id) {\n            this.#groups.get(otherId)?._setVisible(INTERNAL, false, true);\n          }\n        }\n      }\n    }\n\n    group._setVisible(INTERNAL, !!visible, /* userSet = */ true);\n\n    this.#cachedGetHash = null;\n  }\n\n  setOCGState({ state, preserveRB }) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"WORKER_THREAD\")) {\n      throw new Error(\"Not implemented: setOCGState\");\n    }\n    let operator;\n\n    for (const elem of state) {\n      switch (elem) {\n        case \"ON\":\n        case \"OFF\":\n        case \"Toggle\":\n          operator = elem;\n          continue;\n      }\n\n      const group = this.#groups.get(elem);\n      if (!group) {\n        continue;\n      }\n      switch (operator) {\n        case \"ON\":\n          this.setVisibility(elem, true, preserveRB);\n          break;\n        case \"OFF\":\n          this.setVisibility(elem, false, preserveRB);\n          break;\n        case \"Toggle\":\n          this.setVisibility(elem, !group.visible, preserveRB);\n          break;\n      }\n    }\n\n    this.#cachedGetHash = null;\n  }\n\n  get hasInitialVisibility() {\n    return this.#initialHash === null || this.getHash() === this.#initialHash;\n  }\n\n  getOrder() {\n    if (!this.#groups.size) {\n      return null;\n    }\n    if (this.#order) {\n      return this.#order.slice();\n    }\n    return [...this.#groups.keys()];\n  }\n\n  getGroup(id) {\n    return this.#groups.get(id) || null;\n  }\n\n  getHash() {\n    if (this.#cachedGetHash !== null) {\n      return this.#cachedGetHash;\n    }\n    const hash = new MurmurHash3_64();\n\n    for (const [id, group] of this.#groups) {\n      hash.update(`${id}:${group.visible}`);\n    }\n    return (this.#cachedGetHash = hash.hexdigest());\n  }\n\n  [Symbol.iterator]() {\n    return this.#groups.entries();\n  }\n\n  get serializable() {\n    const groupState = new Map();\n    for (const [id, group] of this.#groups) {\n      groupState.set(id, group.serializable);\n    }\n\n    return {\n      data: this.#rawData,\n      renderingIntent: this.renderingIntent,\n      groupState,\n    };\n  }\n\n  static fromSerializable({ data, renderingIntent, groupState }) {\n    return new OptionalContentConfig(data, renderingIntent, groupState);\n  }\n}\n\nexport { OptionalContentConfig };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeArr } from \"../shared/util.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\n/**\n * Maps between page IDs and page numbers, allowing bidirectional conversion\n * between the two representations. This is useful when the page numbering\n * in the PDF document doesn't match the default sequential ordering.\n *\n * When #pageNumberToId is null the mapping is the identity (page N has ID N).\n */\nclass PagesMapper {\n  /**\n   * Maps page positions (0-indexed) to their page IDs (1-indexed).\n   * Null when the mapping is the identity.\n   * @type {Uint32Array|null}\n   */\n  #pageNumberToId = null;\n\n  /**\n   * Previous page number for each position, used to track what happened to\n   * each page after a mutation. Negative values indicate copied pages.\n   * @type {Int32Array|null}\n   */\n  #prevPageNumbers = null;\n\n  /** @type {number} */\n  #pagesNumber = 0;\n\n  /**\n   * Clipboard state for copy/paste operations.\n   * @type {{pageNumbers: Uint32Array, pageIds: Uint32Array}|null}\n   */\n  #clipboard = null;\n\n  /** Saved state for undoing a delete. */\n  #savedData = null;\n\n  get pagesNumber() {\n    return this.#pagesNumber;\n  }\n\n  set pagesNumber(n) {\n    if (this.#pagesNumber === n) {\n      return;\n    }\n    this.#pagesNumber = n;\n    this.#pageNumberToId = null;\n    this.#prevPageNumbers = null;\n  }\n\n  /**\n   * Ensures the identity mapping is initialized.\n   * Must be called before any mutation or before reading #pageNumberToId.\n   */\n  #ensureInit() {\n    if (this.#pageNumberToId) {\n      return;\n    }\n    const n = this.#pagesNumber;\n    const pageNumberToId = (this.#pageNumberToId = new Uint32Array(n));\n    for (let i = 0; i < n; i++) {\n      pageNumberToId[i] = i + 1;\n    }\n    this.#prevPageNumbers = new Int32Array(pageNumberToId);\n  }\n\n  /**\n   * Builds and returns the inverse map (id to page numbers) from\n   * #pageNumberToId.\n   * Since a page ID can appear multiple times (after a copy), the value is an\n   * array of all page numbers that share that ID.\n   * @returns {Map<number, Array<number>>}\n   */\n  #buildIdToPageNumber() {\n    const idToPageNumber = new Map();\n    const pageNumberToId = this.#pageNumberToId;\n    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {\n      const id = pageNumberToId[i];\n      const pageNumbers = idToPageNumber.get(id);\n      if (pageNumbers) {\n        pageNumbers.push(i + 1);\n      } else {\n        idToPageNumber.set(id, [i + 1]);\n      }\n    }\n    return idToPageNumber;\n  }\n\n  /**\n   * Move a set of pages to a new position.\n   *\n   * @param {Set<number>} selectedPages - Page numbers being moved (1-indexed).\n   * @param {number[]} pagesToMove - Ordered list of page numbers to move.\n   * @param {number} index - Zero-based insertion index in the page-number list.\n   */\n  movePages(selectedPages, pagesToMove, index) {\n    this.#ensureInit();\n    const pageNumberToId = this.#pageNumberToId;\n    const prevIdToPageNumber = this.#buildIdToPageNumber();\n    const movedCount = pagesToMove.length;\n    const mappedPagesToMove = new Uint32Array(movedCount);\n    let removedBeforeTarget = 0;\n\n    for (let i = 0; i < movedCount; i++) {\n      const pageIndex = pagesToMove[i] - 1;\n      mappedPagesToMove[i] = pageNumberToId[pageIndex];\n      if (pageIndex < index) {\n        removedBeforeTarget++;\n      }\n    }\n\n    const pagesNumber = this.#pagesNumber;\n    const remainingLen = pagesNumber - movedCount;\n    const adjustedTarget = MathClamp(\n      index - removedBeforeTarget,\n      0,\n      remainingLen\n    );\n\n    // Compact: keep only non-moved pages.\n    for (let i = 0, r = 0; i < pagesNumber; i++) {\n      if (!selectedPages.has(i + 1)) {\n        pageNumberToId[r++] = pageNumberToId[i];\n      }\n    }\n\n    // Make room at the target and insert.\n    pageNumberToId.copyWithin(\n      adjustedTarget + movedCount,\n      adjustedTarget,\n      remainingLen\n    );\n    pageNumberToId.set(mappedPagesToMove, adjustedTarget);\n\n    this.#updatePrevPageNumbers(prevIdToPageNumber);\n\n    if (pageNumberToId.every((id, i) => id === i + 1)) {\n      this.#pageNumberToId = null;\n    }\n  }\n\n  /**\n   * Deletes a set of pages.\n   * @param {Array<number>} pagesToDelete - Page numbers to delete (1-indexed),\n   *   unique and sorted ascending.\n   */\n  deletePages(pagesToDelete) {\n    this.#ensureInit();\n    const pageNumberToId = this.#pageNumberToId;\n    const prevIdToPageNumber = this.#buildIdToPageNumber();\n\n    this.#savedData = {\n      pageNumberToId: pageNumberToId.slice(),\n      pagesNumber: this.#pagesNumber,\n      prevPageNumbers: this.#prevPageNumbers.slice(),\n    };\n\n    const newN = this.#pagesNumber - pagesToDelete.length;\n    this.#pagesNumber = newN;\n    const newPageNumberToId = (this.#pageNumberToId = new Uint32Array(newN));\n    this.#prevPageNumbers = new Int32Array(newN);\n\n    let sourceIndex = 0;\n    let destIndex = 0;\n    for (const pageNumber of pagesToDelete) {\n      const pageIndex = pageNumber - 1;\n      if (pageIndex !== sourceIndex) {\n        newPageNumberToId.set(\n          pageNumberToId.subarray(sourceIndex, pageIndex),\n          destIndex\n        );\n        destIndex += pageIndex - sourceIndex;\n      }\n      sourceIndex = pageIndex + 1;\n    }\n    if (sourceIndex < pageNumberToId.length) {\n      newPageNumberToId.set(pageNumberToId.subarray(sourceIndex), destIndex);\n    }\n\n    this.#updatePrevPageNumbers(prevIdToPageNumber, new Set(pagesToDelete));\n  }\n\n  cancelDelete() {\n    if (this.#savedData) {\n      this.#pageNumberToId = this.#savedData.pageNumberToId;\n      this.#pagesNumber = this.#savedData.pagesNumber;\n      this.#prevPageNumbers = this.#savedData.prevPageNumbers;\n      this.#savedData = null;\n    }\n  }\n\n  cleanSavedData() {\n    this.#savedData = null;\n  }\n\n  /**\n   * Records which pages are being copied so that pastePages can insert them.\n   * @param {Uint32Array} pagesToCopy - Page numbers to copy (1-indexed).\n   */\n  copyPages(pagesToCopy) {\n    this.#ensureInit();\n    this.#clipboard = {\n      pageNumbers: pagesToCopy,\n      pageIds: pagesToCopy.map(n => this.#pageNumberToId[n - 1]),\n    };\n  }\n\n  cancelCopy() {\n    this.#clipboard = null;\n  }\n\n  /**\n   * Inserts the previously copied pages at the given position.\n   * @param {number} index - Zero-based insertion index in the page-number list.\n   */\n  pastePages(index) {\n    this.#ensureInit();\n    const pageNumberToId = this.#pageNumberToId;\n    const prevIdToPageNumber = this.#buildIdToPageNumber();\n    const { pageNumbers: copiedPageNumbers, pageIds: copiedPageIds } =\n      this.#clipboard;\n\n    const newN = this.#pagesNumber + copiedPageNumbers.length;\n    this.#pagesNumber = newN;\n    const newPageNumberToId = (this.#pageNumberToId = new Uint32Array(newN));\n    this.#prevPageNumbers = new Int32Array(newN);\n\n    newPageNumberToId.set(pageNumberToId.subarray(0, index), 0);\n    newPageNumberToId.set(copiedPageIds, index);\n    newPageNumberToId.set(\n      pageNumberToId.subarray(index),\n      index + copiedPageNumbers.length\n    );\n\n    this.#updatePrevPageNumbers(\n      prevIdToPageNumber,\n      null,\n      index,\n      copiedPageNumbers\n    );\n    this.#clipboard = null;\n  }\n\n  /**\n   * Recomputes #prevPageNumbers after a mutation, using the pre-mutation\n   * id to pageNumbers map to track where each page came from.\n   *\n   * @param {Map<number, Array<number>>} prevIdToPageNumber - Id to pageNumbers\n   *   before the mutation.\n   * @param {Set<number>|null} [deletedPageNumbers] - Page numbers that were\n   *   deleted (so their old positions are skipped).\n   * @param {number} [pasteIndex] - If this is a paste, the zero-based\n   *   insertion index; paired with copiedPageNumbers.\n   * @param {Uint32Array} [copiedPageNumbers] - Source page numbers of the\n   *   pasted pages; paired with pasteIndex.\n   */\n  #updatePrevPageNumbers(\n    prevIdToPageNumber,\n    deletedPageNumbers = null,\n    pasteIndex = -1,\n    copiedPageNumbers = null\n  ) {\n    const prevPageNumbers = this.#prevPageNumbers;\n    const newPageNumberToId = this.#pageNumberToId;\n    const pasteEnd = pasteIndex + (copiedPageNumbers?.length ?? 0);\n    const idsIndices = new Map();\n\n    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {\n      if (i >= pasteIndex && i < pasteEnd) {\n        // Negative value signals this page is a copy; encodes its source.\n        prevPageNumbers[i] = -copiedPageNumbers[i - pasteIndex];\n        continue;\n      }\n      const id = newPageNumberToId[i];\n      const oldPositions = prevIdToPageNumber.get(id);\n      let j = idsIndices.get(id) || 0;\n      if (deletedPageNumbers && oldPositions) {\n        while (\n          j < oldPositions.length &&\n          deletedPageNumbers.has(oldPositions[j])\n        ) {\n          j++;\n        }\n      }\n      prevPageNumbers[i] = oldPositions?.[j];\n      idsIndices.set(id, j + 1);\n    }\n  }\n\n  /**\n   * Checks if the page mappings have been altered from their initial state.\n   * @returns {boolean}\n   */\n  hasBeenAltered() {\n    return this.#pageNumberToId !== null;\n  }\n\n  /**\n   * Gets the current page mapping suitable for saving.\n   * @param {Map<number, Array<number>>} [idToPageNumber]\n   * @returns {Array<Object>}\n   */\n  getPageMappingForSaving(idToPageNumber = null) {\n    idToPageNumber ??= this.#buildIdToPageNumber();\n    // idToPageNumber maps used 1-based IDs to 1-based page numbers.\n    // For example if the final pdf contains page 3 twice and they are moved at\n    // page 1 and 4, then it contains:\n    //   pageNumberToId = [3, ., ., 3, ...,]\n    //   idToPageNumber = {3: [1, 4], ...}\n    // In such a case we need to take a page 3 from the original pdf and take\n    // page 3 from a \"copy\".\n    // So we need to pass to the api something like:\n    // [ {\n    //   document: null // this pdf\n    //   includePages: [ 2, ... ], // page 3 is at index 2\n    //   pageIndices: [0, ...], // page 3 will be at index 0 in the new pdf\n    // }, {\n    //   document: null // this pdf\n    //   includePages: [ 2, ... ], // page 3 is at index 2\n    //   pageIndices: [3, ...], // page 3 will be at index 3 in the new pdf\n    // }\n    // ]\n\n    let nCopy = 0;\n    for (const pageNumbers of idToPageNumber.values()) {\n      nCopy = Math.max(nCopy, pageNumbers.length);\n    }\n\n    const extractParams = new Array(nCopy);\n    for (let i = 0; i < nCopy; i++) {\n      extractParams[i] = {\n        document: null,\n        pageIndices: [],\n        includePages: [],\n      };\n    }\n\n    for (const [id, pageNumbers] of idToPageNumber) {\n      for (let i = 0, ii = pageNumbers.length; i < ii; i++) {\n        extractParams[i].includePages.push([id - 1, pageNumbers[i] - 1]);\n      }\n    }\n\n    for (const { includePages, pageIndices } of extractParams) {\n      includePages.sort((a, b) => a[0] - b[0]);\n      for (let i = 0, ii = includePages.length; i < ii; i++) {\n        pageIndices.push(includePages[i][1]);\n        includePages[i] = includePages[i][0];\n      }\n    }\n\n    return extractParams;\n  }\n\n  extractPages(extractedPageNumbers) {\n    extractedPageNumbers = Array.from(extractedPageNumbers).sort(\n      (a, b) => a - b\n    );\n    const usedIds = new Map();\n    for (let i = 0, ii = extractedPageNumbers.length; i < ii; i++) {\n      const id = this.getPageId(extractedPageNumbers[i]);\n      const usedPageNumbers = usedIds.getOrInsertComputed(id, makeArr);\n      usedPageNumbers.push(i + 1);\n    }\n    return this.getPageMappingForSaving(usedIds);\n  }\n\n  /**\n   * Gets the previous page number for a given page number.\n   * Negative values indicate a copied page (the absolute value is the source).\n   * @param {number} pageNumber\n   * @returns {number}\n   */\n  getPrevPageNumber(pageNumber) {\n    return this.#prevPageNumbers?.[pageNumber - 1] ?? 0;\n  }\n\n  /**\n   * Gets the first page number that currently maps to the given page ID.\n   * @param {number} id - The page ID (1-indexed).\n   * @returns {number} The page number, or 0 if not found.\n   */\n  getPageNumber(id) {\n    if (!this.#pageNumberToId) {\n      return id; // identity mapping\n    }\n    const pageNumberToId = this.#pageNumberToId;\n    for (let i = 0, ii = this.#pagesNumber; i < ii; i++) {\n      if (pageNumberToId[i] === id) {\n        return i + 1;\n      }\n    }\n    return 0;\n  }\n\n  /**\n   * Gets the page ID for a given page number.\n   * @param {number} pageNumber - The page number (1-indexed).\n   * @returns {number} The page ID, or the page number itself if no mapping\n   *   exists.\n   */\n  getPageId(pageNumber) {\n    return this.#pageNumberToId?.[pageNumber - 1] ?? pageNumber;\n  }\n\n  getMapping() {\n    return this.#pageNumberToId?.subarray(0, this.pagesNumber);\n  }\n}\n\nexport { PagesMapper };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst INITIAL_DATA = Symbol(\"INITIAL_DATA\");\n\nconst dataObj = () => ({\n  ...Promise.withResolvers(),\n  data: INITIAL_DATA,\n});\n\n/**\n * A PDF document and page is built of many objects. E.g. there are objects for\n * fonts, images, rendering code, etc. These objects may get processed inside of\n * a worker. This class implements some basic methods to manage these objects.\n */\nclass PDFObjects {\n  #objs = new Map();\n\n  /**\n   * If called *without* callback, this returns the data of `objId` but the\n   * object needs to be resolved. If it isn't, this method throws.\n   *\n   * If called *with* a callback, the callback is called with the data of the\n   * object once the object is resolved. That means, if you call this method\n   * and the object is already resolved, the callback gets called right away.\n   *\n   * @param {string} objId\n   * @param {function} [callback]\n   * @returns {any}\n   */\n  get(objId, callback = null) {\n    // If there is a callback, then the get can be async and the object is\n    // not required to be resolved right now.\n    if (callback) {\n      const obj = this.#objs.getOrInsertComputed(objId, dataObj);\n      obj.promise.then(() => callback(obj.data));\n      return null;\n    }\n    // If there isn't a callback, the user expects to get the resolved data\n    // directly.\n    const obj = this.#objs.get(objId);\n    // If there isn't an object yet or the object isn't resolved, then the\n    // data isn't ready yet!\n    if (!obj || obj.data === INITIAL_DATA) {\n      throw new Error(`Requesting object that isn't resolved yet ${objId}.`);\n    }\n    return obj.data;\n  }\n\n  /**\n   * @param {string} objId\n   * @returns {boolean}\n   */\n  has(objId) {\n    const obj = this.#objs.get(objId);\n    return !!obj && obj.data !== INITIAL_DATA;\n  }\n\n  /**\n   * @param {string} objId\n   * @returns {boolean}\n   */\n  delete(objId) {\n    const obj = this.#objs.get(objId);\n    if (!obj || obj.data === INITIAL_DATA) {\n      // Only allow removing the object *after* it's been resolved.\n      return false;\n    }\n    this.#objs.delete(objId);\n    return true;\n  }\n\n  /**\n   * Resolves the object `objId` with optional `data`.\n   *\n   * @param {string} objId\n   * @param {any} [data]\n   */\n  resolve(objId, data = null) {\n    const obj = this.#objs.getOrInsertComputed(objId, dataObj);\n    if (obj.data !== INITIAL_DATA) {\n      throw new Error(`Object already resolved ${objId}.`);\n    }\n    obj.data = data;\n    obj.resolve();\n  }\n\n  clear() {\n    for (const { data } of this.#objs.values()) {\n      data?.bitmap?.close(); // Release any `ImageBitmap` data.\n    }\n    this.#objs.clear();\n  }\n\n  *[Symbol.iterator]() {\n    for (const [objId, { data }] of this.#objs) {\n      if (data !== INITIAL_DATA) {\n        yield [objId, data];\n      }\n    }\n  }\n}\n\nexport { PDFObjects };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./page_viewport\").PageViewport} PageViewport */\n/** @typedef {import(\"./api\").TextContent} TextContent */\n/** @typedef {import(\"./text_layer_images\").TextLayerImages} TextLayerImages */\n\nimport {\n  AbortException,\n  FeatureTest,\n  shadow,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { OutputScale, setLayerDimensions } from \"./display_utils.js\";\n\n/**\n * @typedef {Object} TextLayerParameters\n * @property {ReadableStream | TextContent} textContentSource - Text content to\n *   render, i.e. the value returned by the page's `streamTextContent` or\n *   `getTextContent` method.\n * @property {HTMLElement} container - The DOM node that will contain the text\n *   runs.\n * @property {PageViewport} viewport - The target viewport to properly layout\n *   the text runs.\n * @property {TextLayerImages} [images] - An optional TextLayerImages instance\n *  that handles right clicking on images.\n */\n\n/**\n * @typedef {Object} TextLayerUpdateParameters\n * @property {PageViewport} viewport - The target viewport to properly layout\n *   the text runs.\n * @property {function} [onBefore] - Callback invoked before the textLayer is\n *   updated in the DOM.\n */\n\nconst MAX_TEXT_DIVS_TO_RENDER = 100000;\nconst DEFAULT_FONT_SIZE = 30;\n\nclass TextLayer {\n  #capability = Promise.withResolvers();\n\n  #container = null;\n\n  #disableProcessItems = false;\n\n  #fontInspectorEnabled = !!globalThis.FontInspector?.enabled;\n\n  #imagesHandler = null;\n\n  #lang = null;\n\n  #layoutTextParams = null;\n\n  #pageHeight = 0;\n\n  #pageWidth = 0;\n\n  #reader = null;\n\n  #rootContainer = null;\n\n  #rotation = 0;\n\n  #scale = 0;\n\n  #styleCache = Object.create(null);\n\n  #textContentItemsStr = [];\n\n  #textContentSource = null;\n\n  #textDivs = [];\n\n  #textDivProperties = new WeakMap();\n\n  #transform = null;\n\n  static #ascentCache = new Map();\n\n  static #canvasContexts = new Map();\n\n  static #canvasCtxFonts = new WeakMap();\n\n  static #minFontSize = null;\n\n  static #pendingTextLayers = new Set();\n\n  /**\n   * @param {TextLayerParameters} options\n   */\n  constructor({ textContentSource, images, container, viewport }) {\n    if (textContentSource instanceof ReadableStream) {\n      this.#textContentSource = textContentSource;\n    } else if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      typeof textContentSource === \"object\"\n    ) {\n      this.#textContentSource = new ReadableStream({\n        start(controller) {\n          controller.enqueue(textContentSource);\n          controller.close();\n        },\n      });\n    } else {\n      throw new Error('No \"textContentSource\" parameter specified.');\n    }\n    this.#container = this.#rootContainer = container;\n\n    this.#imagesHandler = images;\n\n    this.#scale = viewport.scale * OutputScale.pixelRatio;\n    this.#rotation = viewport.rotation;\n    this.#layoutTextParams = {\n      div: null,\n      properties: null,\n      ctx: null,\n    };\n    const { pageWidth, pageHeight, pageX, pageY } = viewport.rawDims;\n    this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight];\n    this.#pageWidth = pageWidth;\n    this.#pageHeight = pageHeight;\n\n    TextLayer.#ensureMinFontSizeComputed();\n    container.style.setProperty(\"--min-font-size\", TextLayer.#minFontSize);\n\n    setLayerDimensions(container, viewport);\n\n    // Always clean-up the temporary canvas once rendering is no longer pending.\n    this.#capability.promise\n      .finally(() => {\n        TextLayer.#pendingTextLayers.delete(this);\n        this.#layoutTextParams = null;\n        this.#styleCache = null;\n      })\n      .catch(() => {\n        // Avoid \"Uncaught promise\" messages in the console.\n      });\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"pageWidth\", {\n        get() {\n          return this.#pageWidth;\n        },\n      });\n      Object.defineProperty(this, \"pageHeight\", {\n        get() {\n          return this.#pageHeight;\n        },\n      });\n    }\n  }\n\n  static get fontFamilyMap() {\n    const { isWindows, isFirefox } = FeatureTest.platform;\n    return shadow(\n      this,\n      \"fontFamilyMap\",\n      new Map([\n        [\n          \"sans-serif\",\n          `${isWindows && isFirefox ? \"Calibri, \" : \"\"}sans-serif`,\n        ],\n        [\n          \"monospace\",\n          `${isWindows && isFirefox ? \"Lucida Console, \" : \"\"}monospace`,\n        ],\n      ])\n    );\n  }\n\n  /**\n   * Render the textLayer.\n   * @returns {Promise}\n   */\n  render() {\n    if (this.#imagesHandler) {\n      this.#container.append(this.#imagesHandler.render());\n    }\n\n    const pump = () => {\n      this.#reader.read().then(({ value, done }) => {\n        if (done) {\n          this.#capability.resolve();\n          return;\n        }\n        this.#lang ??= value.lang;\n        Object.assign(this.#styleCache, value.styles);\n        this.#processItems(value.items);\n        pump();\n      }, this.#capability.reject);\n    };\n    this.#reader = this.#textContentSource.getReader();\n    TextLayer.#pendingTextLayers.add(this);\n    pump();\n\n    return this.#capability.promise;\n  }\n\n  /**\n   * Update a previously rendered textLayer, if necessary.\n   * @param {TextLayerUpdateParameters} options\n   * @returns {undefined}\n   */\n  update({ viewport, onBefore = null }) {\n    const scale = viewport.scale * OutputScale.pixelRatio;\n    const rotation = viewport.rotation;\n\n    if (rotation !== this.#rotation) {\n      onBefore?.();\n      this.#rotation = rotation;\n      setLayerDimensions(this.#rootContainer, { rotation });\n    }\n\n    if (scale !== this.#scale) {\n      onBefore?.();\n      this.#scale = scale;\n      const params = {\n        div: null,\n        properties: null,\n        ctx: TextLayer.#getCtx(this.#lang),\n      };\n      for (const div of this.#textDivs) {\n        params.properties = this.#textDivProperties.get(div);\n        params.div = div;\n        this.#layout(params);\n      }\n    }\n  }\n\n  /**\n   * Cancel rendering of the textLayer.\n   * @returns {undefined}\n   */\n  cancel() {\n    const abortEx = new AbortException(\"TextLayer task cancelled.\");\n\n    this.#reader?.cancel(abortEx).catch(() => {\n      // Avoid \"Uncaught promise\" messages in the console.\n    });\n    this.#reader = null;\n\n    this.#capability.reject(abortEx);\n  }\n\n  /**\n   * @type {Array<HTMLElement>} HTML elements that correspond to the text items\n   *   of the textContent input.\n   *   This is output and will initially be set to an empty array.\n   */\n  get textDivs() {\n    return this.#textDivs;\n  }\n\n  /**\n   * @type {Array<string>} Strings that correspond to the `str` property of\n   *   the text items of the textContent input.\n   *   This is output and will initially be set to an empty array\n   */\n  get textContentItemsStr() {\n    return this.#textContentItemsStr;\n  }\n\n  #processItems(items) {\n    if (this.#disableProcessItems) {\n      return;\n    }\n    this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang);\n\n    const textDivs = this.#textDivs,\n      textContentItemsStr = this.#textContentItemsStr;\n\n    for (const item of items) {\n      // No point in rendering many divs as it would make the browser\n      // unusable even after the divs are rendered.\n      if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {\n        warn(\"Ignoring additional textDivs for performance reasons.\");\n\n        this.#disableProcessItems = true; // Avoid multiple warnings for one page.\n        return;\n      }\n\n      if (item.str === undefined) {\n        if (\n          item.type === \"beginMarkedContentProps\" ||\n          item.type === \"beginMarkedContent\"\n        ) {\n          const parent = this.#container;\n          this.#container = document.createElement(\"span\");\n          this.#container.classList.add(\"markedContent\");\n          if (item.id) {\n            this.#container.setAttribute(\"id\", `${item.id}`);\n          }\n          if (item.tag === \"Artifact\") {\n            this.#container.ariaHidden = true;\n          }\n          parent.append(this.#container);\n        } else if (item.type === \"endMarkedContent\") {\n          this.#container = this.#container.parentNode;\n        }\n        continue;\n      }\n      textContentItemsStr.push(item.str);\n      this.#appendText(item);\n    }\n  }\n\n  #appendText(geom) {\n    // Initialize all used properties to keep the caches monomorphic.\n    const textDiv = document.createElement(\"span\");\n    const textDivProperties = {\n      angle: 0,\n      canvasWidth: 0,\n      hasText: geom.str !== \"\",\n      hasEOL: geom.hasEOL,\n      fontSize: 0,\n    };\n    this.#textDivs.push(textDiv);\n\n    const tx = Util.transform(this.#transform, geom.transform);\n    let angle = Math.atan2(tx[1], tx[0]);\n    const style = this.#styleCache[geom.fontName];\n    if (style.vertical) {\n      angle += Math.PI / 2;\n    }\n\n    let fontFamily =\n      (this.#fontInspectorEnabled && style.fontSubstitution) ||\n      style.fontFamily;\n\n    // Workaround for bug 1922063.\n    fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily;\n    const fontHeight = Math.hypot(tx[2], tx[3]);\n    const fontAscent =\n      fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang);\n\n    let left, top;\n    if (angle === 0) {\n      left = tx[4];\n      top = tx[5] - fontAscent;\n    } else {\n      left = tx[4] + fontAscent * Math.sin(angle);\n      top = tx[5] - fontAscent * Math.cos(angle);\n    }\n\n    const divStyle = textDiv.style;\n    // Setting the style properties individually, rather than all at once,\n    // should be OK since the `textDiv` isn't appended to the document yet.\n    divStyle.left = `${((100 * left) / this.#pageWidth).toFixed(2)}%`;\n    divStyle.top = `${((100 * top) / this.#pageHeight).toFixed(2)}%`;\n    divStyle.setProperty(\"--font-height\", `${fontHeight.toFixed(2)}px`);\n    divStyle.fontFamily = fontFamily;\n\n    textDivProperties.fontSize = fontHeight;\n\n    // Keeps screen readers from pausing on every new text span.\n    textDiv.setAttribute(\"role\", \"presentation\");\n\n    textDiv.textContent = geom.str;\n    // geom.dir may be 'ttb' for vertical texts.\n    textDiv.dir = geom.dir;\n\n    // `fontName` is only used by the FontInspector, and we only use `dataset`\n    // here to make the font name available in the debugger.\n    if (this.#fontInspectorEnabled) {\n      textDiv.dataset.fontName =\n        style.fontSubstitutionLoadedName || geom.fontName;\n    }\n    if (angle !== 0) {\n      textDivProperties.angle = angle * (180 / Math.PI);\n    }\n    // We don't bother scaling single-char text divs, because it has very\n    // little effect on text highlighting. This makes scrolling on docs with\n    // lots of such divs a lot faster.\n    let shouldScaleText = false;\n    if (geom.str.length > 1) {\n      shouldScaleText = true;\n    } else if (geom.str !== \" \" && geom.transform[0] !== geom.transform[3]) {\n      const absScaleX = Math.abs(geom.transform[0]),\n        absScaleY = Math.abs(geom.transform[3]);\n      // When the horizontal/vertical scaling differs significantly, also scale\n      // even single-char text to improve highlighting (fixes issue11713.pdf).\n      if (\n        absScaleX !== absScaleY &&\n        Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5\n      ) {\n        shouldScaleText = true;\n      }\n    }\n    if (shouldScaleText) {\n      textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;\n    }\n    this.#textDivProperties.set(textDiv, textDivProperties);\n\n    // Finally, layout and append the text to the DOM.\n    this.#layoutTextParams.div = textDiv;\n    this.#layoutTextParams.properties = textDivProperties;\n    this.#layout(this.#layoutTextParams);\n\n    if (textDivProperties.hasText) {\n      this.#container.append(textDiv);\n    }\n    if (textDivProperties.hasEOL) {\n      const br = document.createElement(\"br\");\n      br.setAttribute(\"role\", \"presentation\");\n      this.#container.append(br);\n    }\n  }\n\n  #layout(params) {\n    const { div, properties, ctx } = params;\n    const { style } = div;\n\n    if (properties.canvasWidth !== 0 && properties.hasText) {\n      const { fontFamily } = style;\n      const { canvasWidth, fontSize } = properties;\n\n      TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily);\n      // Only measure the width for multi-char text divs, see `appendText`.\n      const { width } = ctx.measureText(div.textContent);\n\n      if (width > 0) {\n        style.setProperty(\"--scale-x\", (canvasWidth * this.#scale) / width);\n      }\n    }\n    if (properties.angle !== 0) {\n      style.setProperty(\"--rotate\", `${properties.angle}deg`);\n    }\n  }\n\n  /**\n   * Clean-up global textLayer data.\n   * @returns {undefined}\n   */\n  static cleanup() {\n    if (this.#pendingTextLayers.size > 0) {\n      return;\n    }\n    this.#ascentCache.clear();\n\n    for (const { canvas } of this.#canvasContexts.values()) {\n      canvas.remove();\n    }\n    this.#canvasContexts.clear();\n  }\n\n  static #getCtx(lang = null) {\n    let ctx = this.#canvasContexts.get((lang ||= \"\"));\n    if (!ctx) {\n      // We don't use an OffscreenCanvas here because we use serif/sans serif\n      // fonts with it and they depends on the locale.\n      // In Firefox, the <html> element get a lang attribute that depends on\n      // what Fluent returns for the locale and the OffscreenCanvas uses\n      // the OS locale.\n      // Those two locales can be different and consequently the used fonts will\n      // be different (see bug 1869001).\n      // Ideally, we should use in the text layer the fonts we've in the pdf (or\n      // their replacements when they aren't embedded) and then we can use an\n      // OffscreenCanvas.\n      const canvas = document.createElement(\"canvas\");\n      canvas.style.cssText =\n        \"position:absolute;top:0;left:0;width:0;height:0;display:none;\" +\n        \"letter-spacing:normal;word-spacing:normal\";\n      canvas.lang = lang;\n      document.body.append(canvas);\n      ctx = canvas.getContext(\"2d\", {\n        alpha: false,\n        willReadFrequently: true,\n      });\n      this.#canvasContexts.set(lang, ctx);\n\n      // Also, initialize state for the `#ensureCtxFont` method.\n      this.#canvasCtxFonts.set(ctx, { size: 0, family: \"\" });\n    }\n    return ctx;\n  }\n\n  static #ensureCtxFont(ctx, size, family) {\n    const cached = this.#canvasCtxFonts.get(ctx);\n    if (size === cached.size && family === cached.family) {\n      return; // The font is already set.\n    }\n    ctx.font = `${size}px ${family}`;\n    cached.size = size;\n    cached.family = family;\n  }\n\n  /**\n   * Compute the minimum font size enforced by the browser.\n   */\n  static #ensureMinFontSizeComputed() {\n    if (this.#minFontSize !== null) {\n      return;\n    }\n    const div = document.createElement(\"div\");\n    div.style.opacity = 0;\n    div.style.lineHeight = 1;\n    div.style.fontSize = \"1px\";\n    div.style.position = \"absolute\";\n    div.textContent = \"X\";\n    document.body.append(div);\n    // In `display:block` elements contain a single line of text,\n    // the height matches the line height (which, when set to 1,\n    // matches the actual font size).\n    this.#minFontSize = div.getBoundingClientRect().height;\n    div.remove();\n  }\n\n  static #getAscent(fontFamily, style, lang) {\n    const cachedAscent = this.#ascentCache.get(fontFamily);\n    if (cachedAscent) {\n      return cachedAscent;\n    }\n    const ctx = this.#getCtx(lang);\n\n    ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE;\n    this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily);\n    const metrics = ctx.measureText(\"\");\n\n    const ascent = metrics.fontBoundingBoxAscent;\n    const descent = Math.abs(metrics.fontBoundingBoxDescent);\n\n    ctx.canvas.width = ctx.canvas.height = 0;\n    let ratio = 0.8; // DEFAULT_FONT_ASCENT\n\n    if (ascent) {\n      ratio = ascent / (ascent + descent);\n    } else {\n      if (\n        (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n        FeatureTest.platform.isFirefox\n      ) {\n        warn(\n          \"Enable the `dom.textMetrics.fontBoundingBox.enabled` preference \" +\n            \"in `about:config` to improve TextLayer rendering.\"\n        );\n      }\n      if (style.ascent) {\n        ratio = style.ascent;\n      } else if (style.descent) {\n        ratio = 1 + style.descent;\n      }\n    }\n\n    this.#ascentCache.set(fontFamily, ratio);\n    return ratio;\n  }\n}\n\nexport { TextLayer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @module pdfjsLib\n */\n\nimport {\n  AbortException,\n  AnnotationMode,\n  assert,\n  getVerbosityLevel,\n  info,\n  isNodeJS,\n  makeObj,\n  RenderingIntentFlag,\n  setVerbosityLevel,\n  shadow,\n  unreachable,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  AnnotationStorage,\n  PrintAnnotationStorage,\n  SerializableEmpty,\n} from \"./annotation_storage.js\";\nimport {\n  CanvasBBoxTracker,\n  CanvasDependencyTracker,\n  CanvasImagesTracker,\n} from \"./canvas_dependency_tracker.js\";\nimport { FontFaceObject, FontLoader } from \"./font_loader.js\";\nimport {\n  FontInfo,\n  FontPathInfo,\n  PatternInfo,\n} from \"./obj_bin_transform_display.js\";\nimport {\n  getDataProp,\n  getFactoryUrlProp,\n  getUrlProp,\n  isRefProxy,\n  LoopbackPort,\n} from \"./api_utils.js\";\nimport {\n  isDataScheme,\n  isValidFetchUrl,\n  RenderingCancelledException,\n  StatTimer,\n} from \"./display_utils.js\";\nimport { MessageHandler, wrapReason } from \"../shared/message_handler.js\";\nimport {\n  NodeBinaryDataFactory,\n  NodeCanvasFactory,\n  NodeFilterFactory,\n} from \"display-node_utils\";\nimport { CanvasGraphics } from \"./canvas.js\";\nimport { DOMBinaryDataFactory } from \"display-binary_data_factory\";\nimport { DOMCanvasFactory } from \"./canvas_factory.js\";\nimport { DOMFilterFactory } from \"./filter_factory.js\";\nimport { getNetworkStream } from \"display-network_stream\";\nimport { GlobalWorkerOptions } from \"./worker_options.js\";\nimport { initGPU } from \"./webgpu.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\nimport { Metadata } from \"./metadata.js\";\nimport { OptionalContentConfig } from \"./optional_content_config.js\";\nimport { PagesMapper } from \"./pages_mapper.js\";\nimport { PageViewport } from \"./page_viewport.js\";\nimport { PDFDataTransportStream } from \"./transport_stream.js\";\nimport { PDFObjects } from \"./pdf_objects.js\";\nimport { TextLayer } from \"./text_layer.js\";\nimport { XfaText } from \"./xfa_text.js\";\n\nconst RENDERING_CANCELLED_TIMEOUT = 100; // ms\n\n/**\n * @import {\n *   CatalogAttachmentContent,\n *   CatalogAttachment\n * } from \"../core/catalog.js\";\n */\n\n/**\n * @typedef { Int8Array | Uint8Array | Uint8ClampedArray |\n *            Int16Array | Uint16Array |\n *            Int32Array | Uint32Array | Float32Array |\n *            Float64Array\n * } TypedArray\n */\n\n/**\n * @typedef {Object} RefProxy\n * @property {number} num\n * @property {number} gen\n */\n\n/**\n * Document initialization / loading parameters object.\n *\n * @typedef {Object} DocumentInitParameters\n * @property {string | URL} [url] - The URL of the PDF.\n * @property {TypedArray | ArrayBuffer | Array<number> | string} [data] -\n *   Binary PDF data.\n *   Use TypedArrays (Uint8Array) to improve the memory usage. If PDF data is\n *   BASE64-encoded, use `atob()` to convert it to a binary string first.\n *\n *   NOTE: If TypedArrays are used they will generally be transferred to the\n *   worker-thread. This will help reduce main-thread memory usage, however\n *   it will take ownership of the TypedArrays.\n * @property {Object} [httpHeaders] - Basic authentication headers.\n * @property {boolean} [withCredentials] - Indicates whether or not\n *   cross-site Access-Control requests should be made using credentials such\n *   as cookies or authorization headers. The default is `false`.\n * @property {string} [password] - For decrypting password-protected PDFs.\n * @property {PDFDataRangeTransport} [range] - Allows for using a custom range\n *   transport implementation.\n * @property {number} [rangeChunkSize] - Specify maximum number of bytes fetched\n *   per range request. The default value is 65536 (= 2^16).\n * @property {PDFWorker} [worker] - The worker that will be used for loading and\n *   parsing the PDF data.\n * @property {number} [verbosity] - Controls the logging level; the constants\n *   from {@link VerbosityLevel} should be used.\n * @property {string} [docBaseUrl] - The base URL of the document, used when\n *   attempting to recover valid absolute URLs for annotations, and outline\n *   items, that (incorrectly) only specify relative URLs.\n * @property {string} [cMapUrl] - The URL where the predefined Adobe CMaps are\n *   located. Include the trailing slash.\n * @property {boolean} [cMapPacked] - Specifies if the Adobe CMaps are binary\n *   packed or not. The default value is `true`.\n * @property {string} [iccUrl] - The URL where the predefined ICC profiles are\n *   located. Include the trailing slash.\n * @property {boolean} [useSystemFonts] - When `true`, fonts that aren't\n *   embedded in the PDF document will fallback to a system font.\n *   The default value is `true` in web environments and `false` in Node.js;\n *   unless `disableFontFace === true` in which case this defaults to `false`\n *   regardless of the environment (to prevent completely broken fonts).\n * @property {string} [standardFontDataUrl] - The URL where the standard font\n *   files are located. Include the trailing slash.\n * @property {string} [wasmUrl] - The URL where the wasm files are located.\n *   Include the trailing slash.\n * @property {boolean} [useWorkerFetch] - Enable using the Fetch API in the\n *   worker-thread when reading built-in CMap files, standard font files,\n *   and wasm files. If `true`, the `BinaryDataFactory` option is ignored.\n *   The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [useWasm] - Attempt to use WebAssembly in order to\n *    improve e.g. image decoding performance.\n *    The default value is `true`.\n * @property {boolean} [stopAtErrors] - Reject certain promises, e.g.\n *   `getOperatorList`, `getTextContent`, and `RenderTask`, when the associated\n *   PDF data cannot be successfully parsed, instead of attempting to recover\n *   whatever possible of the data. The default value is `false`.\n * @property {number} [maxImageSize] - The maximum allowed image size in total\n *   pixels, i.e. width * height. Images above this value will not be rendered.\n *   Use -1 for no limit, which is also the default value.\n * @property {boolean} [isOffscreenCanvasSupported] - Determines if we can use\n *   `OffscreenCanvas` in the worker. Primarily used to improve performance of\n *   image conversion/rendering.\n *   The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [isImageDecoderSupported] - Determines if we can use\n *   `ImageDecoder` in the worker. Primarily used to improve performance of\n *   image conversion/rendering.\n *   The default value is `true` in web environments and `false` in Node.js.\n * @property {number} [canvasMaxAreaInBytes] - The integer value is used to\n *   know when an image must be resized (uses `OffscreenCanvas` in the worker).\n *   If it's -1 then a possibly slow algorithm is used to guess the max value.\n * @property {boolean} [disableFontFace] - By default fonts are converted to\n *   OpenType fonts and loaded via the Font Loading API or `@font-face` rules.\n *   If disabled, fonts will be rendered using a built-in font renderer that\n *   constructs the glyphs with primitive path commands.\n *   The default value is `false` in web environments and `true` in Node.js.\n * @property {boolean} [fontExtraProperties] - Include additional properties,\n *   which are unused during rendering of PDF documents, when exporting the\n *   parsed font data from the worker-thread. This may be useful for debugging\n *   purposes (and backwards compatibility), but note that it will lead to\n *   increased memory usage. The default value is `false`.\n * @property {boolean} [enableXfa] - Render Xfa forms if any.\n *   The default value is `false`.\n * @property {HTMLDocument} [ownerDocument] - Specify an explicit document\n *   context to create elements with and to load resources, such as fonts,\n *   into. Defaults to the current document.\n * @property {boolean} [disableRange] - Disable range request loading of PDF\n *   files. When enabled, and if the server supports partial content requests,\n *   then the PDF will be fetched in chunks. The default value is `false`.\n * @property {boolean} [disableStream] - Disable streaming of PDF file data.\n *   By default PDF.js attempts to load PDF files in chunks. The default value\n *   is `false`.\n * @property {boolean} [disableAutoFetch] - Disable pre-fetching of PDF file\n *   data. When range requests are enabled PDF.js will automatically keep\n *   fetching more data even if it isn't needed to display the current page.\n *   The default value is `false`.\n *\n *   NOTE: It is also necessary to disable streaming, see above, in order for\n *   disabling of pre-fetching to work correctly.\n * @property {boolean} [pdfBug] - Enables special hooks for debugging PDF.js\n *   (see `web/debugger.js`). The default value is `false`.\n * @property {Object} [CanvasFactory] - The factory that will be used when\n *    creating canvases. The default value is {DOMCanvasFactory}.\n * @property {Object} [FilterFactory] - The factory that will be used to\n *    create SVG filters when rendering some images on the main canvas.\n *    The default value is {DOMFilterFactory}.\n * @property {Object} [BinaryDataFactory] - The factory that will be used when\n *   falling back to reading built-in CMap files, standard font files,\n *   and wasm files in the main-thread.\n *   The default value is {DOMBinaryDataFactory}.\n * @property {boolean} [enableHWA] - Enables hardware acceleration for\n *   rendering. The default value is `false`.\n * @property {Object} [pagesMapper] - The pages mapper that will be used to map\n *   page ids and page numbers. It's used when the page order is changed or some\n *   pages are removed, cloned, etc.\n */\n\n/**\n * This is the main entry point for loading a PDF and interacting with it.\n *\n * NOTE: If a URL is used to fetch the PDF data a standard Fetch API call (or\n * XHR as fallback) is used, which means it must follow same origin rules,\n * e.g. no cross-domain requests without CORS.\n *\n * @param {DocumentInitParameters} src - Parameter object.\n * @returns {PDFDocumentLoadingTask}\n */\nfunction getDocument(src = {}) {\n  const task = new PDFDocumentLoadingTask();\n  const { docId } = task;\n\n  const url = src.url ? getUrlProp(src.url) : null;\n  const data = src.data ? getDataProp(src.data) : null;\n  const httpHeaders = src.httpHeaders || null;\n  const withCredentials = src.withCredentials === true;\n  const password = src.password ?? null;\n  const rangeTransport =\n    src.range instanceof PDFDataRangeTransport ? src.range : null;\n  const rangeChunkSize =\n    Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0\n      ? src.rangeChunkSize\n      : 2 ** 16;\n  let worker = src.worker instanceof PDFWorker ? src.worker : null;\n  const verbosity = src.verbosity;\n  // Ignore \"data:\"-URLs, since they can't be used to recover valid absolute\n  // URLs anyway. We want to avoid sending them to the worker-thread, since\n  // they contain the *entire* PDF document and can thus be arbitrarily long.\n  const docBaseUrl =\n    typeof src.docBaseUrl === \"string\" && !isDataScheme(src.docBaseUrl)\n      ? src.docBaseUrl\n      : null;\n  const cMapUrl = getFactoryUrlProp(src.cMapUrl);\n  const cMapPacked = src.cMapPacked !== false;\n  const iccUrl = getFactoryUrlProp(src.iccUrl);\n  const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl);\n  const wasmUrl = getFactoryUrlProp(src.wasmUrl);\n  const ignoreErrors = src.stopAtErrors !== true;\n  const maxImageSize =\n    Number.isInteger(src.maxImageSize) && src.maxImageSize > -1\n      ? src.maxImageSize\n      : -1;\n  const isOffscreenCanvasSupported =\n    typeof src.isOffscreenCanvasSupported === \"boolean\"\n      ? src.isOffscreenCanvasSupported\n      : !isNodeJS;\n  const isImageDecoderSupported =\n    typeof src.isImageDecoderSupported === \"boolean\"\n      ? src.isImageDecoderSupported\n      : !isNodeJS;\n  const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes)\n    ? src.canvasMaxAreaInBytes\n    : -1;\n  const disableFontFace =\n    typeof src.disableFontFace === \"boolean\" ? src.disableFontFace : isNodeJS;\n  const fontExtraProperties = src.fontExtraProperties === true;\n  const enableXfa = src.enableXfa === true;\n  const ownerDocument = src.ownerDocument || globalThis.document;\n  const disableRange = src.disableRange === true;\n  const disableStream = src.disableStream === true;\n  const disableAutoFetch = src.disableAutoFetch === true;\n  const pdfBug = src.pdfBug === true;\n  const CanvasFactory =\n    src.CanvasFactory ||\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n      ? NodeCanvasFactory\n      : DOMCanvasFactory);\n  const FilterFactory =\n    src.FilterFactory ||\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n      ? NodeFilterFactory\n      : DOMFilterFactory);\n  const BinaryDataFactory =\n    src.BinaryDataFactory ||\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n      ? NodeBinaryDataFactory\n      : DOMBinaryDataFactory);\n  const enableHWA = src.enableHWA === true;\n  const enableWebGPU = src.enableWebGPU === true;\n  // Start GPU initialisation immediately so it runs in parallel with the\n  // worker bootstrap; the resolved boolean is forwarded to the worker.\n  const gpuPromise = enableWebGPU ? initGPU() : Promise.resolve(false);\n  const useWasm = src.useWasm !== false;\n  const pagesMapper = src.pagesMapper || new PagesMapper();\n\n  // Parameters whose default values depend on other parameters.\n  const useSystemFonts =\n    typeof src.useSystemFonts === \"boolean\"\n      ? src.useSystemFonts\n      : !isNodeJS && !disableFontFace;\n  const useWorkerFetch =\n    typeof src.useWorkerFetch === \"boolean\"\n      ? src.useWorkerFetch\n      : (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n        !!(\n          BinaryDataFactory === DOMBinaryDataFactory &&\n          cMapUrl &&\n          cMapPacked &&\n          standardFontDataUrl &&\n          wasmUrl &&\n          isValidFetchUrl(cMapUrl, document.baseURI) &&\n          isValidFetchUrl(standardFontDataUrl, document.baseURI) &&\n          isValidFetchUrl(wasmUrl, document.baseURI)\n        );\n\n  // Parameters only intended for development/testing purposes.\n  const styleElement =\n    typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n      ? src.styleElement\n      : null;\n\n  // Set the main-thread verbosity level.\n  setVerbosityLevel(verbosity);\n\n  // Ensure that the various factories can be initialized, when necessary,\n  // since the user may provide *custom* ones.\n  const transportFactory = {\n    canvasFactory: new CanvasFactory({ ownerDocument, enableHWA }),\n    filterFactory: new FilterFactory({ docId, ownerDocument }),\n    binaryDataFactory:\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n      useWorkerFetch\n        ? null\n        : new BinaryDataFactory({ cMapUrl, standardFontDataUrl, wasmUrl }),\n  };\n\n  if (!worker) {\n    // Worker was not provided -- creating and owning our own. If message port\n    // is specified in global worker options, using it.\n    worker = PDFWorker.create({\n      verbosity,\n      port: GlobalWorkerOptions.workerPort,\n    });\n    task._worker = worker;\n  }\n\n  const docParams = {\n    docId,\n    apiVersion:\n      typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n        ? PDFJSDev.eval(\"BUNDLE_VERSION\")\n        : null,\n    data,\n    password,\n    disableAutoFetch,\n    rangeChunkSize,\n    docBaseUrl,\n    enableXfa,\n    evaluatorOptions: {\n      maxImageSize,\n      disableFontFace,\n      ignoreErrors,\n      isOffscreenCanvasSupported,\n      isImageDecoderSupported,\n      canvasMaxAreaInBytes,\n      fontExtraProperties,\n      useSystemFonts,\n      useWasm,\n      useWorkerFetch,\n      cMapUrl,\n      cMapPacked,\n      iccUrl,\n      standardFontDataUrl,\n      wasmUrl,\n      hasGPU: false, // Set below.\n    },\n  };\n  const transportParams = {\n    ownerDocument,\n    pdfBug,\n    styleElement,\n    enableHWA,\n    loadingParams: {\n      disableAutoFetch,\n      enableXfa,\n    },\n  };\n\n  Promise.all([worker.promise, gpuPromise])\n    .then(function ([, hasGPU]) {\n      if (worker.destroyed) {\n        throw new Error(\"Worker was destroyed\");\n      }\n\n      docParams.evaluatorOptions.hasGPU = hasGPU;\n\n      const workerIdPromise = worker.messageHandler.sendWithPromise(\n        \"GetDocRequest\",\n        docParams,\n        data ? [data.buffer] : null\n      );\n\n      let networkStream;\n      if (data) {\n        // The entire PDF was provided, no `networkStream` necessary.\n      } else if (rangeTransport) {\n        networkStream = new PDFDataTransportStream({\n          pdfDataRangeTransport: rangeTransport,\n          disableRange,\n          disableStream,\n        });\n      } else if (url) {\n        if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n          throw new Error(\"Not implemented: NetworkStream\");\n        }\n        const NetworkStream = getNetworkStream(url);\n\n        networkStream = new NetworkStream({\n          url,\n          httpHeaders,\n          withCredentials,\n          rangeChunkSize,\n          disableRange,\n          disableStream,\n        });\n      } else {\n        throw new Error(\n          \"getDocument - expected either `data`, `range`, or `url` parameter.\"\n        );\n      }\n\n      return workerIdPromise.then(workerId => {\n        if (worker.destroyed) {\n          throw new Error(\"Worker was destroyed\");\n        }\n\n        const messageHandler = new MessageHandler(docId, workerId, worker.port);\n        const transport = new WorkerTransport(\n          messageHandler,\n          task,\n          networkStream,\n          transportParams,\n          transportFactory,\n          pagesMapper\n        );\n        task._transport = transport;\n\n        if (task.destroyed) {\n          // `destroy()` was called during the worker handshake; the orderly\n          // shutdown (including the \"Terminate\" message) will be issued\n          // through the transport once destroy resumes.\n          throw new Error(\"Loading aborted\");\n        }\n        messageHandler.send(\"Ready\", null);\n      });\n    })\n    .catch(task._capability.reject)\n    .finally(task._setupCapability.resolve);\n\n  return task;\n}\n\n/**\n * @typedef {Object} OnProgressParameters\n * @property {number} loaded - Currently loaded number of bytes.\n * @property {number} total - Total number of bytes in the PDF file.\n * @property {number} percent - Currently loaded percentage, as an integer value\n *   in the [0, 100] range. If `total` is undefined, the percentage is `NaN`.\n */\n\n/**\n * The loading task controls the operations required to load a PDF document\n * (such as network requests) and provides a way to listen for completion,\n * after which individual pages can be rendered.\n */\nclass PDFDocumentLoadingTask {\n  static #docId = 0;\n\n  /**\n   * @private\n   */\n  _capability = Promise.withResolvers();\n\n  /**\n   * Resolves once the load-time setup chain has settled, regardless of\n   * outcome; used by `destroy()` to wait until `_transport` is either set\n   * or definitely never going to be.\n   * @private\n   */\n  _setupCapability = Promise.withResolvers();\n\n  /**\n   * @private\n   */\n  _transport = null;\n\n  /**\n   * @private\n   */\n  _worker = null;\n\n  /**\n   * Unique identifier for the document loading task.\n   * @type {string}\n   */\n  docId = `d${PDFDocumentLoadingTask.#docId++}`;\n\n  /**\n   * Whether the loading task is destroyed or not.\n   * @type {boolean}\n   */\n  destroyed = false;\n\n  /**\n   * Callback to request a password if a wrong or no password was provided.\n   * The callback receives two parameters: a function that should be called\n   * with the new password, and a reason (see {@link PasswordResponses}).\n   * @type {function}\n   */\n  onPassword = null;\n\n  /**\n   * Callback to be able to monitor the loading progress of the PDF file\n   * (necessary to implement e.g. a loading bar).\n   * The callback receives an {@link OnProgressParameters} argument.\n   * @type {function}\n   */\n  onProgress = null;\n\n  /**\n   * Promise for document loading task completion.\n   * @type {Promise<PDFDocumentProxy>}\n   */\n  get promise() {\n    return this._capability.promise;\n  }\n\n  /**\n   * Abort all network requests and destroy the worker.\n   * @returns {Promise<void>} A promise that is resolved when destruction is\n   *   completed.\n   */\n  async destroy() {\n    this.destroyed = true;\n    // The setup chain rejects `_capability` with \"Loading aborted\" once the\n    // load-time chain unwinds (see `getDocument`). Claim that rejection\n    // here so it isn't reported as unhandled during the awaits below;\n    // callers awaiting `task.promise` still see it.\n    this._capability.promise.catch(() => {});\n\n    try {\n      // `_pendingDestroy` must be set synchronously, before any `await`,\n      // so subsequent `PDFWorker.create()` calls on the shared `workerPort`\n      // observe it and throw (see issue 16777).\n      if (this._worker?.port) {\n        this._worker._pendingDestroy = true;\n      }\n      // Wait for the load-time setup chain to settle so `_transport` is set\n      // (when applicable) before we tear down. This is what guarantees the\n      // \"Terminate\" message gets sent through `WorkerTransport.destroy` if\n      // `destroy` races with the initial worker handshake.\n      await this._setupCapability.promise;\n\n      await this._transport?.destroy();\n    } catch (ex) {\n      if (this._worker?.port) {\n        delete this._worker._pendingDestroy;\n      }\n      throw ex;\n    }\n    this._transport = null;\n\n    this._worker?.destroy();\n    this._worker = null;\n  }\n\n  /**\n   * Attempt to fetch the raw data of the PDF document, when e.g.\n   *  - An exception was thrown during document initialization.\n   *  - An `onPassword` callback is delaying initialization.\n   * @returns {Promise<Uint8Array>}\n   */\n  async getData() {\n    return this._transport.getData();\n  }\n}\n\n/**\n * Abstract class to support range requests file loading.\n *\n * NOTE: The TypedArrays passed to the constructor and relevant methods below\n * will generally be transferred to the worker-thread. This will help reduce\n * main-thread memory usage, however it will take ownership of the TypedArrays.\n */\nclass PDFDataRangeTransport {\n  #capability = Promise.withResolvers();\n\n  #listener = null;\n\n  /**\n   * @param {number} length\n   * @param {Uint8Array|null} initialData\n   * @param {boolean} [progressiveDone]\n   * @param {string} [contentDispositionFilename]\n   */\n  constructor(\n    length,\n    initialData,\n    progressiveDone = false,\n    contentDispositionFilename = null\n  ) {\n    this.length = length;\n    this.initialData = initialData;\n    this.progressiveDone = progressiveDone;\n    this.contentDispositionFilename = contentDispositionFilename;\n  }\n\n  /**\n   * @param {number} begin\n   * @param {Uint8Array|null} chunk\n   */\n  onDataRange(begin, chunk) {\n    this.#listener({ type: \"range\", begin, chunk });\n  }\n\n  /**\n   * @param {Uint8Array|null} chunk\n   */\n  onDataProgressiveRead(chunk) {\n    this.#capability.promise.then(() => {\n      this.#listener({ type: \"progressiveRead\", chunk });\n    });\n  }\n\n  onDataProgressiveDone() {\n    this.#capability.promise.then(() => {\n      this.#listener({ type: \"progressiveDone\" });\n    });\n  }\n\n  transportReady(listener) {\n    this.#listener = listener;\n    this.#capability.resolve();\n  }\n\n  /**\n   * @param {number} begin\n   * @param {number} end\n   */\n  requestDataRange(begin, end) {\n    unreachable(\"Abstract method PDFDataRangeTransport.requestDataRange\");\n  }\n\n  abort() {}\n}\n\n/**\n * Proxy to a `PDFDocument` in the worker thread.\n */\nclass PDFDocumentProxy {\n  constructor(pdfInfo, transport) {\n    this._pdfInfo = pdfInfo;\n    this._transport = transport;\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"getNetworkStreamName\", {\n        value: () => this._transport.getNetworkStreamName(),\n      });\n      Object.defineProperty(this, \"getXFADatasets\", {\n        value: () => this._transport.getXFADatasets(),\n      });\n      Object.defineProperty(this, \"getStartXRefPos\", {\n        value: () => this._transport.getStartXRefPos(),\n      });\n      Object.defineProperty(this, \"getAnnotArray\", {\n        value: pageIndex => this._transport.getAnnotArray(pageIndex),\n      });\n    }\n  }\n\n  /**\n   * @type {PagesMapper} The pages mapper instance.\n   */\n  get pagesMapper() {\n    return this._transport.pagesMapper;\n  }\n\n  /**\n   * @type {AnnotationStorage} Storage for annotation data in forms.\n   */\n  get annotationStorage() {\n    return this._transport.annotationStorage;\n  }\n\n  /**\n   * @type {Object} The canvas factory instance.\n   */\n  get canvasFactory() {\n    return this._transport.canvasFactory;\n  }\n\n  /**\n   * @type {Object} The filter factory instance.\n   */\n  get filterFactory() {\n    return this._transport.filterFactory;\n  }\n\n  /**\n   * @type {number} Total number of pages in the PDF file.\n   */\n  get numPages() {\n    return this._pdfInfo.numPages;\n  }\n\n  /**\n   * @type {Array<string | null>} A (not guaranteed to be) unique ID to identify\n   *   the PDF document.\n   *   NOTE: The first element will always be defined for all PDF documents,\n   *   whereas the second element is only defined for *modified* PDF documents.\n   */\n  get fingerprints() {\n    return this._pdfInfo.fingerprints;\n  }\n\n  /**\n   * @type {boolean} True if only XFA form.\n   */\n  get isPureXfa() {\n    return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n  }\n\n  /**\n   * NOTE: This is (mostly) intended to support printing of XFA forms.\n   *\n   * @type {Object | null} An object representing a HTML tree structure\n   *   to render the XFA, or `null` when no XFA form exists.\n   */\n  get allXfaHtml() {\n    return this._transport._htmlForXfa;\n  }\n\n  /**\n   * @param {number} pageNumber - The page number to get. The first page is 1.\n   * @returns {Promise<PDFPageProxy>} A promise that is resolved with\n   *   a {@link PDFPageProxy} object.\n   */\n  getPage(pageNumber) {\n    return this._transport.getPage(pageNumber);\n  }\n\n  /**\n   * @param {RefProxy} ref - The page reference.\n   * @returns {Promise<number>} A promise that is resolved with the page index,\n   *   starting from zero, that is associated with the reference.\n   */\n  getPageIndex(ref) {\n    return this._transport.getPageIndex(ref);\n  }\n\n  /**\n   * @returns {Promise<Object<string, Array<any>>>} A promise that is resolved\n   *   with a mapping from named destinations to references.\n   *\n   * This can be slow for large documents. Use `getDestination` instead.\n   */\n  getDestinations() {\n    return this._transport.getDestinations();\n  }\n\n  /**\n   * @param {string} id - The named destination to get.\n   * @returns {Promise<Array<any> | null>} A promise that is resolved with all\n   *   information of the given named destination, or `null` when the named\n   *   destination is not present in the PDF file.\n   */\n  getDestination(id) {\n    return this._transport.getDestination(id);\n  }\n\n  /**\n   * @returns {Promise<Array<string> | null>} A promise that is resolved with\n   *   an {Array} containing the page labels that correspond to the page\n   *   indexes, or `null` when no page labels are present in the PDF file.\n   */\n  getPageLabels() {\n    return this._transport.getPageLabels();\n  }\n\n  /**\n   * @returns {Promise<string>} A promise that is resolved with a {string}\n   *   containing the page layout name.\n   */\n  getPageLayout() {\n    return this._transport.getPageLayout();\n  }\n\n  /**\n   * @returns {Promise<string>} A promise that is resolved with a {string}\n   *   containing the page mode name.\n   */\n  getPageMode() {\n    return this._transport.getPageMode();\n  }\n\n  /**\n   * @returns {Promise<Object | null>} A promise that is resolved with an\n   *   {Object} containing the viewer preferences, or `null` when no viewer\n   *   preferences are present in the PDF file.\n   */\n  getViewerPreferences() {\n    return this._transport.getViewerPreferences();\n  }\n\n  /**\n   * @returns {Promise<any | null>} A promise that is resolved with an {Array}\n   *   containing the destination, or `null` when no open action is present\n   *   in the PDF.\n   */\n  getOpenAction() {\n    return this._transport.getOpenAction();\n  }\n\n  /**\n   * @returns {Promise<Map<string, CatalogAttachment> | null>}\n   *   Promise that is resolved with a lookup table for mapping named\n   *   attachments to their content.\n   */\n  getAttachments() {\n    return this._transport.getAttachments();\n  }\n\n  /**\n   * @param {string} id\n   *   Unique attachment identifier (required).\n   * @returns {Promise<CatalogAttachmentContent>}\n   *   Promise that resolves to attachment content.\n   */\n  getAttachmentContent(id) {\n    return this._transport.getAttachmentContent(id);\n  }\n\n  /**\n   * @param {Set<number>} types - The annotation types to retrieve.\n   * @param {Set<number>} pageIndexesToSkip\n   * @returns {Promise<Array<Object>>} A promise that is resolved with a list of\n   *   annotations data.\n   */\n  getAnnotationsByType(types, pageIndexesToSkip) {\n    return this._transport.getAnnotationsByType(types, pageIndexesToSkip);\n  }\n\n  /**\n   * @returns {Promise<Object | null>} A promise that is resolved with\n   *   an {Object} with the JavaScript actions:\n   *     - from the name tree.\n   *     - from A or AA entries in the catalog dictionary.\n   *   , or `null` if no JavaScript exists.\n   */\n  getJSActions() {\n    return this._transport.getDocJSActions();\n  }\n\n  /**\n   * @typedef {Object} OutlineNode\n   * @property {string} title\n   * @property {boolean} bold\n   * @property {boolean} italic\n   * @property {Uint8ClampedArray} color - The color in RGB format to use for\n   *   display purposes.\n   * @property {string | Array<any> | null} dest\n   * @property {string | null} url\n   * @property {string | undefined} unsafeUrl\n   * @property {boolean | undefined} newWindow\n   * @property {number | undefined} count\n   * @property {Array<OutlineNode>} items\n   */\n\n  /**\n   * @returns {Promise<Array<OutlineNode>>} A promise that is resolved with an\n   *   {Array} that is a tree outline (if it has one) of the PDF file.\n   */\n  getOutline() {\n    return this._transport.getOutline();\n  }\n\n  /**\n   * @typedef {Object} GetOptionalContentConfigParameters\n   * @property {string} [intent] - Determines the optional content groups that\n   *   are visible by default; valid values are:\n   *    - 'display' (viewable groups).\n   *    - 'print' (printable groups).\n   *    - 'any' (all groups).\n   *   The default value is 'display'.\n   */\n\n  /**\n   * @param {GetOptionalContentConfigParameters} [params] - Optional content\n   *   config parameters.\n   * @returns {Promise<OptionalContentConfig>} A promise that is resolved with\n   *   an {@link OptionalContentConfig} that contains all the optional content\n   *   groups (assuming that the document has any).\n   */\n  getOptionalContentConfig({ intent = \"display\" } = {}) {\n    const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n    return this._transport.getOptionalContentConfig(renderingIntent);\n  }\n\n  /**\n   * @returns {Promise<Array<number> | null>} A promise that is resolved with\n   *   an {Array} that contains the permission flags for the PDF document, or\n   *   `null` when no permissions are present in the PDF file.\n   */\n  getPermissions() {\n    return this._transport.getPermissions();\n  }\n\n  /**\n   * @returns {Promise<{ info: Object, metadata: Metadata }>} A promise that is\n   *   resolved with an {Object} that has `info` and `metadata` properties.\n   *   `info` is an {Object} filled with anything available in the information\n   *   dictionary and similarly `metadata` is a {Metadata} object with\n   *   information from the metadata section of the PDF.\n   */\n  getMetadata() {\n    return this._transport.getMetadata();\n  }\n\n  /**\n   * @typedef {Object} MarkInfo\n   * Properties correspond to Table 321 of the PDF 32000-1:2008 spec.\n   * @property {boolean} Marked\n   * @property {boolean} UserProperties\n   * @property {boolean} Suspects\n   */\n\n  /**\n   * @returns {Promise<MarkInfo | null>} A promise that is resolved with\n   *   a {MarkInfo} object that contains the MarkInfo flags for the PDF\n   *   document, or `null` when no MarkInfo values are present in the PDF file.\n   */\n  getMarkInfo() {\n    return this._transport.getMarkInfo();\n  }\n\n  /**\n   * @returns {Promise<Uint8Array>} A promise that is resolved with a\n   *   {Uint8Array} containing the raw data of the PDF document.\n   */\n  getData() {\n    return this._transport.getData();\n  }\n\n  /**\n   * @returns {Promise<Uint8Array<ArrayBuffer>>} A promise that is\n   *   resolved with a {Uint8Array<ArrayBuffer>} containing the\n   *   full data of the saved document.\n   */\n  saveDocument() {\n    return this._transport.saveDocument();\n  }\n\n  /**\n   * @typedef {Object} PageInfo\n   * @property {null|Uint8Array} [document]\n   * @property {ImageBitmap} [image] Image to insert as a synthetic page.\n   * @property {Array<Array<number>|number>} [includePages]\n   *  included ranges or indices.\n   * @property {Array<Array<number>|number>} [excludePages]\n   *  excluded ranges or indices.\n   * @property {Array<number>} [pageIndices] Explicit 0-based positions in the\n   *  final document for pages contributed by this entry. If shorter than the\n   *  filtered page list, the remaining pages are placed in the first free\n   *  slots at extraction time. Positions must not overlap with those of\n   *  other entries, and the union of all explicit/auto-filled positions\n   *  across the call must form a dense `[0, N)` range (where `N` is the\n   *  total page count of the final document) 鈥� sparse layouts leave empty\n   *  slots and are not supported. Cannot be combined with `insertAfter` on\n   *  the same entry, and must fully cover the filtered page list when any\n   *  entry in the same call specifies `insertAfter` (partial arrays are\n   *  rejected in that case).\n   * @property {number} [insertAfter] 0-based index in the base sequential\n   *  sequence (the concatenation of entries that have neither `pageIndices`\n   *  nor `insertAfter`) after which to insert the pages. When every\n   *  contributing entry carries explicit `pageIndices`, this is interpreted\n   *  against that explicit layout instead, shifting any existing positions\n   *  beyond the insertion point to make room. Use `-1` to insert before\n   *  everything. Values beyond the current layout are clamped so the pages\n   *  are appended at the end. Cannot be combined with `pageIndices` on the\n   *  same entry.\n   */\n\n  /**\n   * @param {Array<PageInfo>} pageInfos - The pages to extract.\n   * @returns {Promise<Uint8Array>} A promise that is resolved with a\n   *   {Uint8Array} containing the full data of the saved document.\n   */\n  extractPages(pageInfos) {\n    return this._transport.extractPages(pageInfos);\n  }\n\n  /**\n   * @returns {Promise<{ length: number }>} A promise that is resolved when the\n   *   document's data is loaded. It is resolved with an {Object} that contains\n   *   the `length` property that indicates size of the PDF data in bytes.\n   */\n  getDownloadInfo() {\n    return this._transport.downloadInfoCapability.promise;\n  }\n\n  getRawData(data) {\n    return this._transport.getRawData(data);\n  }\n\n  /**\n   * Cleans up resources allocated by the document on both the main and worker\n   * threads.\n   *\n   * NOTE: Do not, under any circumstances, call this method when rendering is\n   * currently ongoing since that may lead to rendering errors.\n   *\n   * @param {boolean} [keepLoadedFonts] - Let fonts remain attached to the DOM.\n   *   NOTE: This will increase persistent memory usage, hence don't use this\n   *   option unless absolutely necessary. The default value is `false`.\n   * @returns {Promise} A promise that is resolved when clean-up has finished.\n   */\n  cleanup(keepLoadedFonts = false) {\n    return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);\n  }\n\n  /**\n   * @param {RefProxy} ref - The page reference.\n   * @returns {number | null} The page number, if it's cached.\n   */\n  cachedPageNumber(ref) {\n    return this._transport.cachedPageNumber(ref);\n  }\n\n  /**\n   * @type {DocumentInitParameters} A subset of the current\n   *   {DocumentInitParameters}, which are needed in the viewer.\n   */\n  get loadingParams() {\n    return this._transport.loadingParams;\n  }\n\n  /**\n   * @type {PDFDocumentLoadingTask} The loadingTask for the current document.\n   */\n  get loadingTask() {\n    return this._transport.loadingTask;\n  }\n\n  /**\n   * @returns {Promise<Object<string, Array<Object>> | null>} A promise that is\n   *   resolved with an {Object} containing /AcroForm field data for the JS\n   *   sandbox, or `null` when no field data is present in the PDF file.\n   */\n  getFieldObjects() {\n    return this._transport.getFieldObjects();\n  }\n\n  /**\n   * @returns {Promise<boolean>} A promise that is resolved with `true`\n   *   if some /AcroForm fields have JavaScript actions.\n   */\n  hasJSActions() {\n    return this._transport.hasJSActions();\n  }\n\n  /**\n   * @returns {Promise<Array<string> | null>} A promise that is resolved with an\n   *   {Array<string>} containing IDs of annotations that have a calculation\n   *   action, or `null` when no such annotations are present in the PDF file.\n   */\n  getCalculationOrderIds() {\n    return this._transport.getCalculationOrderIds();\n  }\n}\n\n/**\n * Page getViewport parameters.\n *\n * @typedef {Object} GetViewportParameters\n * @property {number} scale - The desired scale of the viewport.\n * @property {number} [rotation] - The desired rotation, in degrees, of\n *   the viewport. If omitted it defaults to the page rotation.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n *   The default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n *   The default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be\n *   flipped. The default value is `false`.\n */\n\n/**\n * Page getTextContent parameters.\n *\n * @typedef {Object} getTextContentParameters\n * @property {boolean} [includeMarkedContent] - When true include marked\n *   content items in the items array of TextContent. The default is `false`.\n * @property {boolean} [disableNormalization] - When true the text is *not*\n *   normalized in the worker-thread. The default is `false`.\n */\n\n/**\n * Page text content.\n *\n * @typedef {Object} TextContent\n * @property {Array<TextItem | TextMarkedContent>} items - Array of\n *   {@link TextItem} and {@link TextMarkedContent} objects. TextMarkedContent\n *   items are included when includeMarkedContent is true.\n * @property {Object<string, TextStyle>} styles - {@link TextStyle} objects,\n *   indexed by font name.\n * @property {string | null} lang - The document /Lang attribute.\n */\n\n/**\n * Page text content part.\n *\n * @typedef {Object} TextItem\n * @property {string} str - Text content.\n * @property {string} dir - Text direction: 'ttb', 'ltr' or 'rtl'.\n * @property {Array<any>} transform - Transformation matrix.\n * @property {number} width - Width in device space.\n * @property {number} height - Height in device space.\n * @property {string} fontName - Font name used by PDF.js for converted font.\n * @property {boolean} hasEOL - Indicating if the text content is followed by a\n *   line-break.\n */\n\n/**\n * Page text marked content part.\n *\n * @typedef {Object} TextMarkedContent\n * @property {string} type - Either 'beginMarkedContent',\n *   'beginMarkedContentProps', or 'endMarkedContent'.\n * @property {string} id - The marked content identifier. Only used for type\n *   'beginMarkedContentProps'.\n */\n\n/**\n * Text style.\n *\n * @typedef {Object} TextStyle\n * @property {number} ascent - Font ascent.\n * @property {number} descent - Font descent.\n * @property {boolean} vertical - Whether or not the text is in vertical mode.\n * @property {string} fontFamily - The possible font family.\n */\n\n/**\n * Page annotation parameters.\n *\n * @typedef {Object} GetAnnotationsParameters\n * @property {string} [intent] - Determines the annotations that are fetched,\n *   can be 'display' (viewable annotations), 'print' (printable annotations),\n *   or 'any' (all annotations). The default value is 'display'.\n */\n\n/**\n * Page render parameters.\n *\n * @typedef {Object} RenderParameters\n * @property {HTMLCanvasElement|null} canvas - A DOM Canvas object. The default\n *   value is the canvas associated with the `canvasContext` parameter if no\n *   value is provided explicitly.\n * @property {PageViewport} viewport - Rendering viewport obtained by calling\n *   the `PDFPageProxy.getViewport` method.\n * @property {CanvasRenderingContext2D} [canvasContext] - 2D context of a DOM\n *   Canvas object for backwards compatibility; it is recommended to use the\n *   `canvas` parameter instead.\n *   If the context must absolutely be used to render the page, the canvas must\n *   be null.\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n *   or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are rendered\n *   onto the canvas, for annotations with appearance-data; the values from\n *   {@link AnnotationMode} should be used. The following values are supported:\n *    - `AnnotationMode.DISABLE`, which disables all annotations.\n *    - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n *      it also depends on the `intent`-option, see above).\n *    - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n *      interactive form elements (those will be rendered in the display layer).\n *    - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n *      (as above) but where interactive form elements are updated with data\n *      from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n *   The default value is `AnnotationMode.ENABLE`.\n * @property {Array<any>} [transform] - Additional transform, applied just\n *   before viewport transform.\n * @property {CanvasGradient | CanvasPattern | string} [background] - Background\n *   to use for the canvas.\n *   Any valid `canvas.fillStyle` can be used: a `DOMString` parsed as CSS\n *   <color> value, a `CanvasGradient` object (a linear or radial gradient) or\n *   a `CanvasPattern` object (a repetitive image). The default value is\n *   'rgb(255,255,255)'.\n *\n *   NOTE: This option may be partially, or completely, ignored when the\n *   `pageColors`-option is used.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n *   with user defined ones in order to improve readability in high contrast\n *   mode.\n * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -\n *   A promise that should resolve with an {@link OptionalContentConfig}\n *   created from `PDFDocumentProxy.getOptionalContentConfig`. If `null`,\n *   the configuration will be fetched automatically with the default visibility\n *   states set.\n * @property {Map<string, HTMLCanvasElement>} [annotationCanvasMap] - Map some\n *   annotation ids with canvases used to render them.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n * @property {boolean} [isEditing] - Render the page in editing mode.\n * @property {boolean} [recordImages] - Record the location of images in the PDF\n * @property {boolean} [recordOperations] - Record the dependencies and bounding\n *   boxes of all PDF operations that render onto the canvas.\n * @property {OperationsFilter} [operationsFilter] - If provided, only\n *   run for which this function returns `true`.\n */\n\n/**\n * @callback OperationsFilter\n * @param {number} index - The index of the operation.\n * @returns {boolean} If false, the operation is ignored.\n */\n\n/**\n * Page getOperatorList parameters.\n *\n * @typedef {Object} GetOperatorListParameters\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n *   or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are included\n *   in the operatorList, for annotations with appearance-data; the values from\n *   {@link AnnotationMode} should be used. The following values are supported:\n *    - `AnnotationMode.DISABLE`, which disables all annotations.\n *    - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n *      it also depends on the `intent`-option, see above).\n *    - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n *      interactive form elements (those will be rendered in the display layer).\n *    - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n *      (as above) but where interactive form elements are updated with data\n *      from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n *   The default value is `AnnotationMode.ENABLE`.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n * @property {boolean} [isEditing] - Render the page in editing mode.\n */\n\n/**\n * Structure tree node. The root node will have a role \"Root\".\n *\n * @typedef {Object} StructTreeNode\n * @property {Array<StructTreeNode | StructTreeContent>} children - Array of\n *   {@link StructTreeNode} and {@link StructTreeContent} objects.\n * @property {string} role - element's role, already mapped if a role map exists\n * in the PDF.\n */\n\n/**\n * Structure tree content.\n *\n * @typedef {Object} StructTreeContent\n * @property {string} type - either \"content\" for page and stream structure\n *   elements or \"object\" for object references.\n * @property {string} id - unique id that will map to the text layer.\n */\n\n/**\n * PDF page operator list.\n *\n * @typedef {Object} PDFOperatorList\n * @property {Array<number>} fnArray - Array containing the operator functions.\n * @property {Array<any>} argsArray - Array containing the arguments of the\n *   functions.\n */\n\n/**\n * Proxy to a `PDFPage` in the worker thread.\n */\nclass PDFPageProxy {\n  #pendingCleanup = false;\n\n  #pagesMapper = null;\n\n  constructor(pageIndex, pageInfo, transport, pagesMapper, pdfBug = false) {\n    this._pageIndex = pageIndex;\n    this._pageInfo = pageInfo;\n    this._transport = transport;\n    this._stats = pdfBug ? new StatTimer() : null;\n    this._pdfBug = pdfBug;\n    /** @type {PDFObjects} */\n    this.commonObjs = transport.commonObjs;\n    this.objs = new PDFObjects();\n\n    this._intentStates = new Map();\n    this.destroyed = false;\n    this.recordedBBoxes = null;\n    this.#pagesMapper = pagesMapper;\n    this.imageCoordinates = null;\n  }\n\n  clone(id) {\n    const clone = new PDFPageProxy(\n      id,\n      this._pageInfo,\n      this._transport,\n      this.#pagesMapper,\n      this._pdfBug\n    );\n    clone.clonedFromIndex = this.clonedFromIndex ?? this._pageIndex;\n    this._transport.updatePage(clone);\n    return clone;\n  }\n\n  /**\n   * @type {number} Page number of the page. First page is 1.\n   */\n  get pageNumber() {\n    return this._pageIndex + 1;\n  }\n\n  /**\n   * @param {number} value - The page number to set. First page is 1.\n   */\n  set pageNumber(value) {\n    this._pageIndex = value - 1;\n    this._transport.updatePage(this);\n  }\n\n  /**\n   * @type {number} The number of degrees the page is rotated clockwise.\n   */\n  get rotate() {\n    return this._pageInfo.rotate;\n  }\n\n  /**\n   * @type {RefProxy | null} The reference that points to this page.\n   */\n  get ref() {\n    return this._pageInfo.ref;\n  }\n\n  /**\n   * @type {number} The default size of units in 1/72nds of an inch.\n   */\n  get userUnit() {\n    return this._pageInfo.userUnit;\n  }\n\n  /**\n   * @type {Array<number>} An array of the visible portion of the PDF page in\n   *   user space units [x1, y1, x2, y2].\n   */\n  get view() {\n    return this._pageInfo.view;\n  }\n\n  /**\n   * @param {GetViewportParameters} params - Viewport parameters.\n   * @returns {PageViewport} Contains 'width' and 'height' properties\n   *   along with transforms required for rendering.\n   */\n  getViewport({\n    scale,\n    rotation = this.rotate,\n    offsetX = 0,\n    offsetY = 0,\n    dontFlip = false,\n  } = {}) {\n    return new PageViewport({\n      viewBox: this.view,\n      userUnit: this.userUnit,\n      scale,\n      rotation,\n      offsetX,\n      offsetY,\n      dontFlip,\n    });\n  }\n\n  /**\n   * @param {GetAnnotationsParameters} [params] - Annotation parameters.\n   * @returns {Promise<Array<any>>} A promise that is resolved with an\n   *   {Array} of the annotation objects.\n   */\n  getAnnotations({ intent = \"display\" } = {}) {\n    const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n    return this._transport.getAnnotations(this._pageIndex, renderingIntent);\n  }\n\n  /**\n   * @returns {Promise<Object>} A promise that is resolved with an\n   *   {Object} with JS actions.\n   */\n  getJSActions() {\n    return this._transport.getPageJSActions(this._pageIndex);\n  }\n\n  /**\n   * @type {Object} The filter factory instance.\n   */\n  get filterFactory() {\n    return this._transport.filterFactory;\n  }\n\n  /**\n   * @type {boolean} True if only XFA form.\n   */\n  get isPureXfa() {\n    return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n  }\n\n  /**\n   * @returns {Promise<Object | null>} A promise that is resolved with\n   *   an {Object} with a fake DOM object (a tree structure where elements\n   *   are {Object} with a name, attributes (class, style, ...), value and\n   *   children, very similar to a HTML DOM tree), or `null` if no XFA exists.\n   */\n  async getXfa() {\n    return this._transport._htmlForXfa?.children[this._pageIndex] || null;\n  }\n\n  /**\n   * Begins the process of rendering a page to the desired context.\n   *\n   * @param {RenderParameters} params - Page render parameters.\n   * @returns {RenderTask} An object that contains a promise that is\n   *   resolved when the page finishes rendering.\n   */\n  render({\n    canvasContext,\n    canvas = canvasContext.canvas,\n    viewport,\n    intent = \"display\",\n    annotationMode = AnnotationMode.ENABLE,\n    transform = null,\n    background = null,\n    optionalContentConfigPromise = null,\n    annotationCanvasMap = null,\n    pageColors = null,\n    printAnnotationStorage = null,\n    isEditing = false,\n    recordImages = false,\n    recordOperations = false,\n    operationsFilter = null,\n  }) {\n    this._stats?.time(\"Overall\");\n\n    const intentArgs = this._transport.getRenderingIntent(\n      intent,\n      annotationMode,\n      printAnnotationStorage,\n      isEditing\n    );\n    const { renderingIntent, cacheKey } = intentArgs;\n    // If there was a pending destroy, cancel it so no cleanup happens during\n    // this call to render.\n    this.#pendingCleanup = false;\n\n    optionalContentConfigPromise ||=\n      this._transport.getOptionalContentConfig(renderingIntent);\n\n    const intentState = this._intentStates.getOrInsertComputed(\n      cacheKey,\n      makeObj\n    );\n    // Ensure that a pending `streamReader` cancel timeout is always aborted.\n    if (intentState.streamReaderCancelTimeout) {\n      clearTimeout(intentState.streamReaderCancelTimeout);\n      intentState.streamReaderCancelTimeout = null;\n    }\n\n    const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n    // If there's no displayReadyCapability yet, then the operatorList\n    // was never requested before. Make the request and create the promise.\n    if (!intentState.displayReadyCapability) {\n      intentState.displayReadyCapability = Promise.withResolvers();\n      intentState.operatorList = {\n        fnArray: [],\n        argsArray: [],\n        lastChunk: false,\n        separateAnnots: null,\n      };\n\n      this._stats?.time(\"Page Request\");\n      this._pumpOperatorList(intentArgs);\n    }\n\n    const recordForDebugger = !!(\n      this._pdfBug && globalThis.StepperManager?.enabled\n    );\n    const shouldRecordOperations =\n      !!canvas &&\n      !this.recordedBBoxes &&\n      (recordOperations || recordForDebugger);\n    const shouldRecordImages =\n      !!canvas && !this.imageCoordinates && recordImages;\n\n    const complete = error => {\n      intentState.renderTasks.delete(internalRenderTask);\n\n      if (shouldRecordOperations) {\n        const recordedBBoxes = internalRenderTask.gfx?.dependencyTracker.take();\n        if (recordedBBoxes) {\n          internalRenderTask.stepper?.setOperatorBBoxes(\n            recordedBBoxes,\n            internalRenderTask.gfx.dependencyTracker.takeDebugMetadata()\n          );\n\n          if (recordOperations) {\n            this.recordedBBoxes = recordedBBoxes;\n          }\n        }\n      }\n\n      if (shouldRecordImages && !error) {\n        this.imageCoordinates = internalRenderTask.gfx?.imagesTracker.take();\n      }\n\n      // Attempt to reduce memory usage during *printing*, by always running\n      // cleanup immediately once rendering has finished.\n      if (intentPrint) {\n        this.#pendingCleanup = true;\n      }\n      this.#tryCleanup();\n\n      if (error) {\n        internalRenderTask.capability.reject(error);\n\n        this._abortOperatorList({\n          intentState,\n          reason: error instanceof Error ? error : new Error(error),\n        });\n      } else {\n        internalRenderTask.capability.resolve();\n      }\n\n      if (this._stats) {\n        this._stats.timeEnd(\"Rendering\");\n        this._stats.timeEnd(\"Overall\");\n\n        if (globalThis.Stats?.enabled) {\n          globalThis.Stats.add(this.pageNumber, this._stats);\n        }\n      }\n    };\n\n    let dependencyTracker = null;\n    let bboxTracker = null;\n    if (shouldRecordOperations || shouldRecordImages) {\n      bboxTracker = new CanvasBBoxTracker(\n        canvas,\n        intentState.operatorList.length\n      );\n    }\n    if (shouldRecordOperations) {\n      dependencyTracker = new CanvasDependencyTracker(\n        bboxTracker,\n        recordForDebugger\n      );\n    }\n\n    const internalRenderTask = new InternalRenderTask({\n      callback: complete,\n      // Only include the required properties, and *not* the entire object.\n      params: {\n        canvas,\n        canvasContext,\n        dependencyTracker: dependencyTracker ?? bboxTracker,\n        imagesTracker: shouldRecordImages\n          ? new CanvasImagesTracker(canvas)\n          : null,\n        viewport,\n        transform,\n        background,\n      },\n      objs: this.objs,\n      commonObjs: this.commonObjs,\n      annotationCanvasMap,\n      operatorList: intentState.operatorList,\n      pageIndex: this._pageIndex,\n      canvasFactory: this._transport.canvasFactory,\n      filterFactory: this._transport.filterFactory,\n      useRequestAnimationFrame: !intentPrint,\n      pdfBug: this._pdfBug,\n      pageColors,\n      enableHWA: this._transport.enableHWA,\n      operationsFilter,\n    });\n\n    (intentState.renderTasks ||= new Set()).add(internalRenderTask);\n    const renderTask = internalRenderTask.task;\n\n    Promise.all([\n      intentState.displayReadyCapability.promise,\n      optionalContentConfigPromise,\n    ])\n      .then(([transparency, optionalContentConfig]) => {\n        if (this.destroyed) {\n          complete();\n          return;\n        }\n        this._stats?.time(\"Rendering\");\n\n        if (!(optionalContentConfig.renderingIntent & renderingIntent)) {\n          throw new Error(\n            \"Must use the same `intent`-argument when calling the `PDFPageProxy.render` \" +\n              \"and `PDFDocumentProxy.getOptionalContentConfig` methods.\"\n          );\n        }\n        internalRenderTask.initializeGraphics({\n          transparency,\n          optionalContentConfig,\n        });\n        internalRenderTask.operatorListChanged();\n      })\n      .catch(complete);\n\n    return renderTask;\n  }\n\n  /**\n   * @param {GetOperatorListParameters} params - Page getOperatorList\n   *   parameters.\n   * @returns {Promise<PDFOperatorList>} A promise resolved with an\n   *   {@link PDFOperatorList} object that represents the page's operator list.\n   */\n  getOperatorList({\n    intent = \"display\",\n    annotationMode = AnnotationMode.ENABLE,\n    printAnnotationStorage = null,\n    isEditing = false,\n  } = {}) {\n    if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n      throw new Error(\"Not implemented: getOperatorList\");\n    }\n    function operatorListChanged() {\n      if (intentState.operatorList.lastChunk) {\n        intentState.opListReadCapability.resolve(intentState.operatorList);\n\n        intentState.renderTasks.delete(opListTask);\n      }\n    }\n\n    const intentArgs = this._transport.getRenderingIntent(\n      intent,\n      annotationMode,\n      printAnnotationStorage,\n      isEditing,\n      /* isOpList = */ true\n    );\n    const intentState = this._intentStates.getOrInsertComputed(\n      intentArgs.cacheKey,\n      makeObj\n    );\n    let opListTask;\n\n    if (!intentState.opListReadCapability) {\n      opListTask = Object.create(null);\n      opListTask.operatorListChanged = operatorListChanged;\n      intentState.opListReadCapability = Promise.withResolvers();\n      (intentState.renderTasks ||= new Set()).add(opListTask);\n      intentState.operatorList = {\n        fnArray: [],\n        argsArray: [],\n        lastChunk: false,\n        separateAnnots: null,\n      };\n\n      this._stats?.time(\"Page Request\");\n      this._pumpOperatorList(intentArgs);\n    }\n    return intentState.opListReadCapability.promise;\n  }\n\n  /**\n   * NOTE: All occurrences of whitespace will be replaced by\n   * standard spaces (0x20).\n   *\n   * @param {getTextContentParameters} params - getTextContent parameters.\n   * @returns {ReadableStream} Stream for reading text content chunks.\n   */\n  streamTextContent({\n    includeMarkedContent = false,\n    disableNormalization = false,\n  } = {}) {\n    const TEXT_CONTENT_CHUNK_SIZE = 100;\n\n    return this._transport.messageHandler.sendWithStream(\n      \"GetTextContent\",\n      {\n        pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1,\n        pageIndex: this._pageIndex,\n        includeMarkedContent: includeMarkedContent === true,\n        disableNormalization: disableNormalization === true,\n      },\n      {\n        highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n        size(textContent) {\n          return textContent.items.length;\n        },\n      }\n    );\n  }\n\n  /**\n   * NOTE: All occurrences of whitespace will be replaced by\n   * standard spaces (0x20).\n   *\n   * @param {getTextContentParameters} params - getTextContent parameters.\n   * @returns {Promise<TextContent>} A promise that is resolved with a\n   *   {@link TextContent} object that represents the page's text content.\n   */\n  async getTextContent(params = {}) {\n    if (this._transport._htmlForXfa) {\n      // TODO: We need to revisit this once the XFA foreground patch lands and\n      // only do this for non-foreground XFA.\n      return this.getXfa().then(xfa => XfaText.textContent(xfa));\n    }\n    const readableStream = this.streamTextContent(params);\n\n    const textContent = {\n      items: [],\n      styles: Object.create(null),\n      lang: null,\n    };\n\n    for await (const value of readableStream) {\n      textContent.lang ??= value.lang;\n      Object.assign(textContent.styles, value.styles);\n      textContent.items.push(...value.items);\n    }\n    return textContent;\n  }\n\n  /**\n   * @returns {Promise<StructTreeNode>} A promise that is resolved with a\n   *   {@link StructTreeNode} object that represents the page's structure tree,\n   *   or `null` when no structure tree is present for the current page.\n   */\n  getStructTree() {\n    return this._transport.getStructTree(this._pageIndex);\n  }\n\n  /**\n   * Destroys the page object.\n   * @private\n   */\n  _destroy() {\n    this.destroyed = true;\n\n    const waitOn = [];\n    for (const intentState of this._intentStates.values()) {\n      this._abortOperatorList({\n        intentState,\n        reason: new Error(\"Page was destroyed.\"),\n        force: true,\n      });\n\n      if (intentState.opListReadCapability) {\n        // Avoid errors below, since the renderTasks are just stubs.\n        continue;\n      }\n      for (const internalRenderTask of intentState.renderTasks) {\n        waitOn.push(internalRenderTask.completed);\n        internalRenderTask.cancel();\n      }\n    }\n    this.objs.clear();\n    this.#pendingCleanup = false;\n\n    return Promise.all(waitOn);\n  }\n\n  /**\n   * Cleans up resources allocated by the page.\n   *\n   * @param {boolean} [resetStats] - Reset page stats, if enabled.\n   *   The default value is `false`.\n   * @returns {boolean} Indicates if clean-up was successfully run.\n   */\n  cleanup(resetStats = false) {\n    this.#pendingCleanup = true;\n    const success = this.#tryCleanup();\n\n    if (resetStats && success) {\n      this._stats &&= new StatTimer();\n    }\n    return success;\n  }\n\n  /**\n   * Attempts to clean up if rendering is in a state where that's possible.\n   * @returns {boolean} Indicates if clean-up was successfully run.\n   */\n  #tryCleanup() {\n    if (!this.#pendingCleanup || this.destroyed) {\n      return false;\n    }\n    for (const { renderTasks, operatorList } of this._intentStates.values()) {\n      if (renderTasks.size > 0 || !operatorList.lastChunk) {\n        return false;\n      }\n    }\n    this._intentStates.clear();\n    this.objs.clear();\n    this.#pendingCleanup = false;\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _startRenderPage(transparency, cacheKey) {\n    const intentState = this._intentStates.get(cacheKey);\n    if (!intentState) {\n      return; // Rendering was cancelled.\n    }\n    this._stats?.timeEnd(\"Page Request\");\n\n    // TODO Refactor RenderPageRequest to separate rendering\n    // and operator list logic\n    intentState.displayReadyCapability?.resolve(transparency);\n  }\n\n  /**\n   * @private\n   */\n  _renderPageChunk(operatorListChunk, intentState) {\n    // Add the new chunk to the current operator list.\n    for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {\n      intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n      intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n    }\n    intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n    intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;\n\n    // Notify all the rendering tasks there are more operators to be consumed.\n    for (const internalRenderTask of intentState.renderTasks) {\n      internalRenderTask.operatorListChanged();\n    }\n\n    if (operatorListChunk.lastChunk) {\n      this.#tryCleanup();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _pumpOperatorList({\n    renderingIntent,\n    cacheKey,\n    annotationStorageSerializable,\n    modifiedIds,\n  }) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        Number.isInteger(renderingIntent) && renderingIntent > 0,\n        '_pumpOperatorList: Expected valid \"renderingIntent\" argument.'\n      );\n    }\n    const { map, transfer } = annotationStorageSerializable;\n\n    const readableStream = this._transport.messageHandler.sendWithStream(\n      \"GetOperatorList\",\n      {\n        pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1,\n        pageIndex: this._pageIndex,\n        intent: renderingIntent,\n        cacheKey,\n        annotationStorage: map,\n        modifiedIds,\n      },\n      /* queueingStrategy = */ undefined,\n      transfer\n    );\n    const reader = readableStream.getReader();\n\n    const intentState = this._intentStates.get(cacheKey);\n    intentState.streamReader = reader;\n\n    const pump = () => {\n      reader.read().then(\n        ({ value, done }) => {\n          if (done) {\n            intentState.streamReader = null;\n            return;\n          }\n          if (this._transport.destroyed) {\n            return; // Ignore any pending requests if the worker was terminated.\n          }\n          this._renderPageChunk(value, intentState);\n          pump();\n        },\n        reason => {\n          intentState.streamReader = null;\n\n          if (this._transport.destroyed) {\n            return; // Ignore any pending requests if the worker was terminated.\n          }\n          if (intentState.operatorList) {\n            // Mark operator list as complete.\n            intentState.operatorList.lastChunk = true;\n\n            for (const internalRenderTask of intentState.renderTasks) {\n              internalRenderTask.operatorListChanged();\n            }\n            this.#tryCleanup();\n          }\n\n          if (intentState.displayReadyCapability) {\n            intentState.displayReadyCapability.reject(reason);\n          } else if (intentState.opListReadCapability) {\n            intentState.opListReadCapability.reject(reason);\n          } else {\n            throw reason;\n          }\n        }\n      );\n    };\n    pump();\n  }\n\n  /**\n   * @private\n   */\n  _abortOperatorList({ intentState, reason, force = false }) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        reason instanceof Error,\n        '_abortOperatorList: Expected valid \"reason\" argument.'\n      );\n    }\n\n    if (!intentState.streamReader) {\n      return;\n    }\n    // Ensure that a pending `streamReader` cancel timeout is always aborted.\n    if (intentState.streamReaderCancelTimeout) {\n      clearTimeout(intentState.streamReaderCancelTimeout);\n      intentState.streamReaderCancelTimeout = null;\n    }\n\n    if (!force) {\n      // Ensure that an Error occurring in *only* one `InternalRenderTask`, e.g.\n      // multiple render() calls on the same canvas, won't break all rendering.\n      if (intentState.renderTasks.size > 0) {\n        return;\n      }\n      // Don't immediately abort parsing on the worker-thread when rendering is\n      // cancelled, since that will unnecessarily delay re-rendering when (for\n      // partially parsed pages) e.g. zooming/rotation occurs in the viewer.\n      if (reason instanceof RenderingCancelledException) {\n        let delay = RENDERING_CANCELLED_TIMEOUT;\n        if (reason.extraDelay > 0 && reason.extraDelay < /* ms = */ 1000) {\n          // Above, we prevent the total delay from becoming arbitrarily large.\n          delay += reason.extraDelay;\n        }\n\n        intentState.streamReaderCancelTimeout = setTimeout(() => {\n          intentState.streamReaderCancelTimeout = null;\n          this._abortOperatorList({ intentState, reason, force: true });\n        }, delay);\n        return;\n      }\n    }\n    intentState.streamReader\n      .cancel(new AbortException(reason.message))\n      .catch(() => {\n        // Avoid \"Uncaught promise\" messages in the console.\n      });\n    intentState.streamReader = null;\n\n    if (this._transport.destroyed) {\n      return; // Ignore any pending requests if the worker was terminated.\n    }\n    // Remove the current `intentState`, since a cancelled `getOperatorList`\n    // call on the worker-thread cannot be re-started...\n    for (const [curCacheKey, curIntentState] of this._intentStates) {\n      if (curIntentState === intentState) {\n        this._intentStates.delete(curCacheKey);\n        break;\n      }\n    }\n    // ... and force clean-up to ensure that any old state is always removed.\n    this.cleanup();\n  }\n\n  /**\n   * @type {StatTimer | null} Returns page stats, if enabled; returns `null`\n   *   otherwise.\n   */\n  get stats() {\n    return this._stats;\n  }\n}\n\n/**\n * @typedef {Object} PDFWorkerParameters\n * @property {string} [name] - The name of the worker.\n * @property {Worker} [port] - The `workerPort` object.\n * @property {number} [verbosity] - Controls the logging level;\n *   the constants from {@link VerbosityLevel} should be used.\n */\n\n/**\n * PDF.js web worker abstraction that controls the instantiation of PDF\n * documents. Message handlers are used to pass information from the main\n * thread to the worker thread and vice versa. If the creation of a web\n * worker is not possible, a \"fake\" worker will be used instead.\n *\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n */\nclass PDFWorker {\n  #capability = Promise.withResolvers();\n\n  #messageHandler = null;\n\n  #port = null;\n\n  #webWorker = null;\n\n  static #fakeWorkerId = 0;\n\n  static #isWorkerDisabled = false;\n\n  static #workerPorts = new WeakMap();\n\n  static {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      if (isNodeJS) {\n        // Workers aren't supported in Node.js, force-disabling them there.\n        this.#isWorkerDisabled = true;\n\n        GlobalWorkerOptions.workerSrc ||= PDFJSDev.test(\"LIB\")\n          ? \"../pdf.worker.js\"\n          : \"./pdf.worker.mjs\";\n      }\n\n      // Check if URLs have the same origin. For non-HTTP based URLs, returns\n      // false.\n      this._isSameOrigin = (baseUrl, otherUrl) => {\n        const base = URL.parse(baseUrl);\n        if (!base?.origin || base.origin === \"null\") {\n          return false; // non-HTTP url\n        }\n        const other = new URL(otherUrl, base);\n        return base.origin === other.origin;\n      };\n\n      this._createCDNWrapper = url => {\n        // We will rely on blob URL's property to specify origin.\n        // We want this function to fail in case if createObjectURL or Blob do\n        // not exist or fail for some reason -- our Worker creation will fail\n        // anyway.\n        const wrapper = `await import(\"${url}\");`;\n        return URL.createObjectURL(\n          new Blob([wrapper], { type: \"text/javascript\" })\n        );\n      };\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      this._resetGlobalState = () => {\n        this.#isWorkerDisabled = false;\n        delete globalThis.pdfjsWorker;\n      };\n    }\n  }\n\n  constructor({\n    name = null,\n    port = null,\n    verbosity = getVerbosityLevel(),\n  } = {}) {\n    this.name = name;\n    this.destroyed = false;\n    this.verbosity = verbosity;\n\n    if (port) {\n      if (PDFWorker.#workerPorts.has(port)) {\n        throw new Error(\"Cannot use more than one PDFWorker per port.\");\n      }\n      PDFWorker.#workerPorts.set(port, this);\n      this.#initializeFromPort(port);\n    } else {\n      this.#initialize();\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"_webWorker\", {\n        get() {\n          return this.#webWorker;\n        },\n      });\n    }\n  }\n\n  /**\n   * Promise for worker initialization completion.\n   * @type {Promise<void>}\n   */\n  get promise() {\n    return this.#capability.promise;\n  }\n\n  #resolve() {\n    this.#capability.resolve();\n    // Send global setting, e.g. verbosity level.\n    this.#messageHandler.send(\"configure\", {\n      verbosity: this.verbosity,\n    });\n  }\n\n  /**\n   * The current `workerPort`, when it exists.\n   * @type {Worker}\n   */\n  get port() {\n    return this.#port;\n  }\n\n  /**\n   * The current MessageHandler-instance.\n   * @type {MessageHandler}\n   */\n  get messageHandler() {\n    return this.#messageHandler;\n  }\n\n  #initializeFromPort(port) {\n    this.#port = port;\n    this.#messageHandler = new MessageHandler(\"main\", \"worker\", port);\n    this.#messageHandler.on(\"ready\", () => {\n      // Ignoring \"ready\" event -- MessageHandler should already be initialized\n      // and ready to accept messages.\n    });\n    this.#resolve();\n  }\n\n  #initialize() {\n    // If worker support isn't disabled explicit and the browser has worker\n    // support, create a new web worker and test if it/the browser fulfills\n    // all requirements to run parts of pdf.js in a web worker.\n    // Right now, the requirement is, that an Uint8Array is still an\n    // Uint8Array as it arrives on the worker.\n    if (\n      PDFWorker.#isWorkerDisabled ||\n      PDFWorker.#mainThreadWorkerMessageHandler\n    ) {\n      this.#setupFakeWorker();\n      return;\n    }\n    let { workerSrc } = PDFWorker;\n\n    try {\n      // Wraps workerSrc path into blob URL, if the former does not belong\n      // to the same origin.\n      if (\n        typeof PDFJSDev !== \"undefined\" &&\n        PDFJSDev.test(\"GENERIC\") &&\n        !PDFWorker._isSameOrigin(window.location, workerSrc)\n      ) {\n        workerSrc = PDFWorker._createCDNWrapper(\n          new URL(workerSrc, window.location).href\n        );\n      }\n\n      const worker = new Worker(workerSrc, { type: \"module\" });\n      const messageHandler = new MessageHandler(\"main\", \"worker\", worker);\n      const terminateEarly = () => {\n        ac.abort();\n        messageHandler.destroy();\n        worker.terminate();\n        if (this.destroyed) {\n          this.#capability.reject(new Error(\"Worker was destroyed\"));\n        } else {\n          // Fall back to fake worker if the termination is caused by an\n          // error (e.g. NetworkError / SecurityError).\n          this.#setupFakeWorker();\n        }\n      };\n\n      const ac = new AbortController();\n      worker.addEventListener(\n        \"error\",\n        () => {\n          if (!this.#webWorker) {\n            // Worker failed to initialize due to an error. Clean up and fall\n            // back to the fake worker.\n            terminateEarly();\n          }\n        },\n        { signal: ac.signal }\n      );\n\n      messageHandler.on(\"test\", data => {\n        ac.abort();\n        if (this.destroyed || !data) {\n          terminateEarly();\n          return;\n        }\n        this.#messageHandler = messageHandler;\n        this.#port = worker;\n        this.#webWorker = worker;\n\n        this.#resolve();\n      });\n\n      messageHandler.on(\"ready\", data => {\n        ac.abort();\n        if (this.destroyed) {\n          terminateEarly();\n          return;\n        }\n        try {\n          sendTest();\n        } catch {\n          // We need fallback to a faked worker.\n          this.#setupFakeWorker();\n        }\n      });\n\n      const sendTest = () => {\n        const testObj = new Uint8Array();\n        // Ensure that we can use `postMessage` transfers.\n        messageHandler.send(\"test\", testObj, [testObj.buffer]);\n      };\n\n      // It might take time for the worker to initialize. We will try to send\n      // the \"test\" message immediately, and once the \"ready\" message arrives.\n      // The worker shall process only the first received \"test\" message.\n      sendTest();\n      return;\n    } catch {\n      info(\"The worker has been disabled.\");\n    }\n    // Either workers are not supported or have thrown an exception.\n    // Thus, we fallback to a faked worker.\n    this.#setupFakeWorker();\n  }\n\n  #setupFakeWorker() {\n    if (!PDFWorker.#isWorkerDisabled) {\n      warn(\"Setting up fake worker.\");\n      PDFWorker.#isWorkerDisabled = true;\n    }\n\n    PDFWorker._setupFakeWorkerGlobal\n      .then(WorkerMessageHandler => {\n        if (this.destroyed) {\n          this.#capability.reject(new Error(\"Worker was destroyed\"));\n          return;\n        }\n        const port = new LoopbackPort();\n        this.#port = port;\n\n        // All fake workers use the same port, making id unique.\n        const id = `fake${PDFWorker.#fakeWorkerId++}`;\n\n        // If the main thread is our worker, setup the handling for the\n        // messages -- the main thread sends to it self.\n        const workerHandler = new MessageHandler(id + \"_worker\", id, port);\n        WorkerMessageHandler.setup(workerHandler, port);\n\n        this.#messageHandler = new MessageHandler(id, id + \"_worker\", port);\n        this.#resolve();\n      })\n      .catch(reason => {\n        this.#capability.reject(\n          new Error(`Setting up fake worker failed: \"${reason.message}\".`)\n        );\n      });\n  }\n\n  /**\n   * Destroys the worker instance.\n   */\n  destroy() {\n    this.destroyed = true;\n\n    // We need to terminate only web worker created resource.\n    this.#webWorker?.terminate();\n    this.#webWorker = null;\n\n    PDFWorker.#workerPorts.delete(this.#port);\n    this.#port = null;\n\n    this.#messageHandler?.destroy();\n    this.#messageHandler = null;\n  }\n\n  /**\n   * @param {PDFWorkerParameters} params - The worker initialization parameters.\n   * @returns {PDFWorker}\n   */\n  static create(params) {\n    const cachedPort = this.#workerPorts.get(params?.port);\n    if (cachedPort) {\n      if (cachedPort._pendingDestroy) {\n        throw new Error(\n          \"PDFWorker.create - the worker is being destroyed.\\n\" +\n            \"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls.\"\n        );\n      }\n      return cachedPort;\n    }\n    return new PDFWorker(params);\n  }\n\n  /**\n   * The current `workerSrc`, when it exists.\n   * @type {string}\n   */\n  static get workerSrc() {\n    if (GlobalWorkerOptions.workerSrc) {\n      return GlobalWorkerOptions.workerSrc;\n    }\n    throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n  }\n\n  static get #mainThreadWorkerMessageHandler() {\n    try {\n      return globalThis.pdfjsWorker?.WorkerMessageHandler || null;\n    } catch {\n      return null;\n    }\n  }\n\n  // Loads worker code into the main-thread.\n  static get _setupFakeWorkerGlobal() {\n    const loader = async () => {\n      if (this.#mainThreadWorkerMessageHandler) {\n        // The worker was already loaded using e.g. a `<script>` tag.\n        return this.#mainThreadWorkerMessageHandler;\n      }\n      const worker =\n        typeof PDFJSDev === \"undefined\"\n          ? await import(\"pdfjs/pdf.worker.js\")\n          : await __raw_import__(this.workerSrc);\n      return worker.WorkerMessageHandler;\n    };\n\n    return shadow(this, \"_setupFakeWorkerGlobal\", loader());\n  }\n}\n\n/**\n * For internal use only.\n * @ignore\n */\nclass WorkerTransport {\n  downloadInfoCapability = Promise.withResolvers();\n\n  #fullReader = null;\n\n  #methodPromises = new Map();\n\n  #networkStream = null;\n\n  #pageCache = new Map();\n\n  #pagePromises = new Map();\n\n  #pageRefCache = new Map();\n\n  #passwordCapability = null;\n\n  constructor(\n    messageHandler,\n    loadingTask,\n    networkStream,\n    params,\n    factory,\n    pagesMapper\n  ) {\n    this.messageHandler = messageHandler;\n    this.loadingTask = loadingTask;\n    this.#networkStream = networkStream;\n\n    this.commonObjs = new PDFObjects();\n    this.fontLoader = new FontLoader({\n      ownerDocument: params.ownerDocument,\n      styleElement: params.styleElement,\n    });\n    this.enableHWA = params.enableHWA;\n    this.loadingParams = params.loadingParams;\n    this._params = params;\n\n    this.canvasFactory = factory.canvasFactory;\n    this.filterFactory = factory.filterFactory;\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      this.binaryDataFactory = factory.binaryDataFactory;\n    }\n    this.pagesMapper = pagesMapper;\n\n    this.destroyed = false;\n    this.destroyCapability = null;\n\n    this.setupMessageHandler();\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"getNetworkStreamName\", {\n        value: () => networkStream?.constructor?.name || null,\n      });\n      Object.defineProperty(this, \"getXFADatasets\", {\n        value: () =>\n          this.messageHandler.sendWithPromise(\"GetXFADatasets\", null),\n      });\n      Object.defineProperty(this, \"getXRefPrevValue\", {\n        value: () =>\n          this.messageHandler.sendWithPromise(\"GetXRefPrevValue\", null),\n      });\n      Object.defineProperty(this, \"getStartXRefPos\", {\n        value: () =>\n          this.messageHandler.sendWithPromise(\"GetStartXRefPos\", null),\n      });\n      Object.defineProperty(this, \"getAnnotArray\", {\n        value: pageIndex =>\n          this.messageHandler.sendWithPromise(\"GetAnnotArray\", { pageIndex }),\n      });\n    }\n  }\n\n  updatePage(page) {\n    const { _pageIndex } = page;\n    this.#pageCache.set(_pageIndex, page);\n    this.#pagePromises.set(_pageIndex, Promise.resolve(page));\n  }\n\n  #cacheSimpleMethod(name, data = null) {\n    return this.#methodPromises.getOrInsertComputed(name, () =>\n      this.messageHandler.sendWithPromise(name, data)\n    );\n  }\n\n  #onProgress({ loaded, total }) {\n    this.loadingTask.onProgress?.({\n      loaded,\n      total,\n      percent: total\n        ? MathClamp(Math.round((loaded / total) * 100), 0, 100)\n        : NaN,\n    });\n  }\n\n  get annotationStorage() {\n    return shadow(this, \"annotationStorage\", new AnnotationStorage());\n  }\n\n  getRenderingIntent(\n    intent,\n    annotationMode = AnnotationMode.ENABLE,\n    printAnnotationStorage = null,\n    isEditing = false,\n    isOpList = false\n  ) {\n    let renderingIntent = RenderingIntentFlag.DISPLAY; // Default value.\n    let annotationStorageSerializable = SerializableEmpty;\n\n    switch (intent) {\n      case \"any\":\n        renderingIntent = RenderingIntentFlag.ANY;\n        break;\n      case \"display\":\n        break;\n      case \"print\":\n        renderingIntent = RenderingIntentFlag.PRINT;\n        break;\n      default:\n        warn(`getRenderingIntent - invalid intent: ${intent}`);\n    }\n\n    const annotationStorage =\n      renderingIntent & RenderingIntentFlag.PRINT &&\n      printAnnotationStorage instanceof PrintAnnotationStorage\n        ? printAnnotationStorage\n        : this.annotationStorage;\n\n    switch (annotationMode) {\n      case AnnotationMode.DISABLE:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE;\n        break;\n      case AnnotationMode.ENABLE:\n        break;\n      case AnnotationMode.ENABLE_FORMS:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS;\n        break;\n      case AnnotationMode.ENABLE_STORAGE:\n        renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE;\n\n        annotationStorageSerializable = annotationStorage.serializable;\n        break;\n      default:\n        warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`);\n    }\n\n    if (isEditing) {\n      renderingIntent += RenderingIntentFlag.IS_EDITING;\n    }\n    if (isOpList) {\n      renderingIntent += RenderingIntentFlag.OPLIST;\n    }\n\n    const { ids: modifiedIds, hash: modifiedIdsHash } =\n      annotationStorage.modifiedIds;\n\n    const cacheKeyBuf = [\n      renderingIntent,\n      annotationStorageSerializable.hash,\n      modifiedIdsHash,\n    ];\n\n    return {\n      renderingIntent,\n      cacheKey: cacheKeyBuf.join(\"_\"),\n      annotationStorageSerializable,\n      modifiedIds,\n    };\n  }\n\n  destroy() {\n    if (this.destroyCapability) {\n      return this.destroyCapability.promise;\n    }\n\n    this.destroyed = true;\n    this.destroyCapability = Promise.withResolvers();\n\n    this.#passwordCapability?.reject(\n      new Error(\"Worker was destroyed during onPassword callback\")\n    );\n\n    const waitOn = [];\n    // We need to wait for all renderings to be completed, e.g.\n    // timeout/rAF can take a long time.\n    for (const page of this.#pageCache.values()) {\n      waitOn.push(page._destroy());\n    }\n    this.#pageCache.clear();\n    this.#pagePromises.clear();\n    this.#pageRefCache.clear();\n    // Allow `AnnotationStorage`-related clean-up when destroying the document.\n    if (Object.hasOwn(this, \"annotationStorage\")) {\n      this.annotationStorage.resetModified();\n    }\n    // We also need to wait for the worker to finish its long running tasks.\n    const terminated = this.messageHandler.sendWithPromise(\"Terminate\", null);\n    waitOn.push(terminated);\n\n    Promise.all(waitOn).then(() => {\n      this.commonObjs.clear();\n      this.fontLoader.clear();\n      this.#methodPromises.clear();\n      this.filterFactory.destroy();\n      TextLayer.cleanup();\n\n      this.#networkStream?.cancelAllRequests(\n        new AbortException(\"Worker was terminated.\")\n      );\n\n      this.messageHandler?.destroy();\n      this.messageHandler = null;\n\n      this.destroyCapability.resolve();\n    }, this.destroyCapability.reject);\n    return this.destroyCapability.promise;\n  }\n\n  setupMessageHandler() {\n    const { messageHandler, loadingTask } = this;\n\n    messageHandler.on(\"GetReader\", (data, sink) => {\n      assert(\n        this.#networkStream,\n        \"GetReader - no `BasePDFStream` instance available.\"\n      );\n      this.#fullReader = this.#networkStream.getFullReader();\n      // If stream or range turn out to be disabled, once `headersReady` is\n      // resolved, this is our only way to report loading progress.\n      this.#fullReader.onProgress = evt => this.#onProgress(evt);\n\n      sink.onPull = () => {\n        this.#fullReader\n          .read()\n          .then(function ({ value, done }) {\n            if (done) {\n              sink.close();\n              return;\n            }\n            assert(\n              value instanceof ArrayBuffer,\n              \"GetReader - expected an ArrayBuffer.\"\n            );\n            // Enqueue data chunk into sink, and transfer it\n            // to other side as `Transferable` object.\n            sink.enqueue(new Uint8Array(value), 1, [value]);\n          })\n          .catch(reason => {\n            sink.error(reason);\n          });\n      };\n\n      sink.onCancel = reason => {\n        this.#fullReader.cancel(reason);\n\n        sink.ready.catch(readyReason => {\n          if (this.destroyed) {\n            return; // Ignore any pending requests if the worker was terminated.\n          }\n          throw readyReason;\n        });\n      };\n    });\n\n    messageHandler.on(\"ReaderHeadersReady\", async data => {\n      await this.#fullReader.headersReady;\n\n      const { isStreamingSupported, isRangeSupported, contentLength } =\n        this.#fullReader;\n\n      if (isStreamingSupported && isRangeSupported) {\n        this.#fullReader.onProgress = null; // See comment in \"GetReader\" above.\n      }\n      return { isStreamingSupported, isRangeSupported, contentLength };\n    });\n\n    messageHandler.on(\"GetRangeReader\", (data, sink) => {\n      assert(\n        this.#networkStream,\n        \"GetRangeReader - no `BasePDFStream` instance available.\"\n      );\n      const rangeReader = this.#networkStream.getRangeReader(\n        data.begin,\n        data.end\n      );\n\n      // When streaming is enabled, it's possible that the data requested here\n      // has already been fetched via the `#fullReader` implementation.\n      // However, given that the PDF data is loaded asynchronously on the\n      // main-thread and then sent via `postMessage` to the worker-thread,\n      // it may not have been available during parsing (hence the attempt to\n      // use range requests here).\n      //\n      // To avoid wasting time and resources here, we'll thus *not* dispatch\n      // range requests if the data was already loaded but has not been sent to\n      // the worker-thread yet (which will happen via the `#fullReader`).\n      if (!rangeReader) {\n        sink.close();\n        return;\n      }\n\n      sink.onPull = () => {\n        rangeReader\n          .read()\n          .then(function ({ value, done }) {\n            if (done) {\n              sink.close();\n              return;\n            }\n            assert(\n              value instanceof ArrayBuffer,\n              \"GetRangeReader - expected an ArrayBuffer.\"\n            );\n            sink.enqueue(new Uint8Array(value), 1, [value]);\n          })\n          .catch(reason => {\n            sink.error(reason);\n          });\n      };\n\n      sink.onCancel = reason => {\n        rangeReader.cancel(reason);\n\n        sink.ready.catch(readyReason => {\n          if (this.destroyed) {\n            return; // Ignore any pending requests if the worker was terminated.\n          }\n          throw readyReason;\n        });\n      };\n    });\n\n    messageHandler.on(\"GetDoc\", ({ pdfInfo }) => {\n      this.pagesMapper.pagesNumber = pdfInfo.numPages;\n      this._numPages = pdfInfo.numPages;\n      this._htmlForXfa = pdfInfo.htmlForXfa;\n      delete pdfInfo.htmlForXfa;\n      loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));\n    });\n\n    messageHandler.on(\"DocException\", ex => {\n      loadingTask._capability.reject(wrapReason(ex));\n    });\n\n    messageHandler.on(\"PasswordRequest\", ex => {\n      this.#passwordCapability = Promise.withResolvers();\n\n      try {\n        if (!loadingTask.onPassword) {\n          throw wrapReason(ex);\n        }\n\n        const updatePassword = password => {\n          if (password instanceof Error) {\n            this.#passwordCapability.reject(password);\n          } else {\n            this.#passwordCapability.resolve({ password });\n          }\n        };\n        loadingTask.onPassword(updatePassword, ex.code);\n      } catch (err) {\n        this.#passwordCapability.reject(err);\n      }\n      return this.#passwordCapability.promise;\n    });\n\n    messageHandler.on(\"DataLoaded\", data => {\n      // For consistency: Ensure that progress is always reported when the\n      // entire PDF file has been loaded, regardless of how it was fetched.\n      this.#onProgress({ loaded: data.length, total: data.length });\n\n      this.downloadInfoCapability.resolve(data);\n    });\n\n    messageHandler.on(\"StartRenderPage\", data => {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n\n      const page = this.#pageCache.get(data.pageIndex);\n      page._startRenderPage(data.transparency, data.cacheKey);\n    });\n\n    messageHandler.on(\"commonobj\", ([id, type, exportedData]) => {\n      if (this.destroyed) {\n        return null; // Ignore any pending requests if the worker was terminated.\n      }\n\n      if (this.commonObjs.has(id)) {\n        return null;\n      }\n\n      switch (type) {\n        case \"Font\":\n          if (\"error\" in exportedData) {\n            const exportedError = exportedData.error;\n            warn(`Error during font loading: ${exportedError}`);\n            this.commonObjs.resolve(id, exportedError);\n            break;\n          }\n\n          const fontData = new FontInfo(exportedData);\n          const inspectFont =\n            this._params.pdfBug && globalThis.FontInspector?.enabled\n              ? (font, url) => globalThis.FontInspector.fontAdded(font, url)\n              : null;\n          const font = new FontFaceObject(\n            fontData,\n            inspectFont,\n            exportedData.charProcOperatorList,\n            exportedData.extra\n          );\n\n          this.fontLoader\n            .bind(font)\n            .catch(() => messageHandler.sendWithPromise(\"FontFallback\", { id }))\n            .finally(() => {\n              if (!font.fontExtraProperties) {\n                // Immediately release the `font.data` property once the font\n                // has been attached to the DOM, since it's no longer needed,\n                // rather than waiting for a `PDFDocumentProxy.cleanup` call.\n                // Since `font.data` could be very large, e.g. in some cases\n                // multiple megabytes, this will help reduce memory usage.\n                font.clearData();\n              }\n              this.commonObjs.resolve(id, font);\n            });\n          break;\n        case \"CopyLocalImage\":\n          const { imageRef } = exportedData;\n          assert(imageRef, \"The imageRef must be defined.\");\n\n          for (const pageProxy of this.#pageCache.values()) {\n            for (const [, data] of pageProxy.objs) {\n              if (data?.ref !== imageRef) {\n                continue;\n              }\n              if (!data.dataLen) {\n                return null;\n              }\n              const copy = structuredClone(data);\n              if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n                copy.CopyLocalImage = true;\n              }\n              this.commonObjs.resolve(id, copy);\n              return data.dataLen;\n            }\n          }\n          break;\n        case \"FontPath\":\n          this.commonObjs.resolve(id, new FontPathInfo(exportedData));\n          break;\n        case \"Image\":\n          this.commonObjs.resolve(id, exportedData);\n          break;\n        case \"Pattern\":\n          const pattern = new PatternInfo(exportedData);\n          this.commonObjs.resolve(id, pattern.getIR());\n          break;\n        default:\n          throw new Error(`Got unknown common object type ${type}`);\n      }\n\n      return null;\n    });\n\n    messageHandler.on(\"obj\", ([id, pageIndex, type, imageData]) => {\n      if (this.destroyed) {\n        // Ignore any pending requests if the worker was terminated.\n        return;\n      }\n\n      const pageProxy = this.#pageCache.get(pageIndex);\n      if (pageProxy.objs.has(id)) {\n        return;\n      }\n      // Don't store data *after* cleanup has successfully run, see bug 1854145.\n      if (pageProxy._intentStates.size === 0) {\n        imageData?.bitmap?.close(); // Release any `ImageBitmap` data.\n        return;\n      }\n\n      switch (type) {\n        case \"Image\":\n        case \"Pattern\":\n          pageProxy.objs.resolve(id, imageData);\n          break;\n        default:\n          throw new Error(`Got unknown object type ${type}`);\n      }\n    });\n\n    messageHandler.on(\"DocProgress\", data => {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n      this.#onProgress(data);\n    });\n\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      messageHandler.on(\"FetchBinaryData\", async data => {\n        if (this.destroyed) {\n          throw new Error(\"Worker was destroyed.\");\n        }\n        if (!this.binaryDataFactory) {\n          throw new Error(\n            \"`BinaryDataFactory` not initialized, see the `useWorkerFetch` parameter.\"\n          );\n        }\n        return this.binaryDataFactory.fetch(data);\n      });\n    }\n  }\n\n  getData() {\n    return this.messageHandler.sendWithPromise(\"GetData\", null);\n  }\n\n  saveDocument() {\n    if (this.annotationStorage.size <= 0) {\n      warn(\n        \"saveDocument called while `annotationStorage` is empty, \" +\n          \"please use the getData-method instead.\"\n      );\n    }\n    const { map, transfer } = this.annotationStorage.serializable;\n\n    return this.messageHandler\n      .sendWithPromise(\n        \"SaveDocument\",\n        {\n          isPureXfa: !!this._htmlForXfa,\n          numPages: this._numPages,\n          annotationStorage: map,\n          filename: this.#fullReader?.filename ?? null,\n        },\n        transfer\n      )\n      .finally(() => {\n        this.annotationStorage.resetModified();\n      });\n  }\n\n  extractPages(pageInfos) {\n    const params = {\n      pageInfos,\n    };\n    let transfer;\n    const ImageBitmapCtor = globalThis.ImageBitmap;\n    if (typeof ImageBitmapCtor === \"function\") {\n      const infos = Array.isArray(pageInfos) ? pageInfos : [pageInfos];\n      for (const pageInfo of infos) {\n        if (pageInfo?.image instanceof ImageBitmapCtor) {\n          (transfer ||= []).push(pageInfo.image);\n        }\n      }\n    }\n    if (this.annotationStorage.size > 0) {\n      const serialized = this.annotationStorage.serializable;\n      let { map } = serialized;\n      if (serialized.transfer?.length) {\n        if (transfer) {\n          transfer.push(...serialized.transfer);\n        } else {\n          transfer = serialized.transfer;\n        }\n      }\n      // Annotation pageIndex tracks the editor's current viewer position; the\n      // worker keys lookups by source index. Remap UI -> source via pagesMapper\n      // so reorganized pages still receive their annotations after extraction.\n      const mapping = this.pagesMapper.getMapping();\n      if (mapping) {\n        const remapped = new Map();\n        for (const [k, v] of map) {\n          if (\n            v?.pageIndex !== undefined &&\n            v.pageIndex >= 0 &&\n            v.pageIndex < mapping.length\n          ) {\n            const sourceIdx = mapping[v.pageIndex] - 1;\n            if (sourceIdx !== v.pageIndex) {\n              remapped.set(k, { ...v, pageIndex: sourceIdx });\n              continue;\n            }\n          }\n          remapped.set(k, v);\n        }\n        map = remapped;\n      }\n      params.annotationStorage = map;\n    }\n    return this.messageHandler\n      .sendWithPromise(\"ExtractPages\", params, transfer)\n      .finally(() => {\n        this.annotationStorage.resetModified();\n      });\n  }\n\n  getPage(pageNumber) {\n    if (\n      !Number.isInteger(pageNumber) ||\n      pageNumber <= 0 ||\n      pageNumber > this.pagesMapper.pagesNumber\n    ) {\n      return Promise.reject(new Error(\"Invalid page request.\"));\n    }\n    const pageIndex = pageNumber - 1;\n    const newPageIndex = this.pagesMapper.getPageId(pageNumber) - 1;\n\n    const cachedPromise = this.#pagePromises.get(pageIndex);\n    if (cachedPromise) {\n      return cachedPromise;\n    }\n    const promise = this.messageHandler\n      .sendWithPromise(\"GetPage\", {\n        pageIndex: newPageIndex,\n      })\n      .then(pageInfo => {\n        if (this.destroyed) {\n          throw new Error(\"Transport destroyed\");\n        }\n        if (pageInfo.refStr) {\n          this.#pageRefCache.set(pageInfo.refStr, newPageIndex);\n        }\n\n        const page = new PDFPageProxy(\n          pageIndex,\n          pageInfo,\n          this,\n          this.pagesMapper,\n          this._params.pdfBug\n        );\n        this.#pageCache.set(pageIndex, page);\n        return page;\n      });\n    this.#pagePromises.set(pageIndex, promise);\n    return promise;\n  }\n\n  async getPageIndex(ref) {\n    if (!isRefProxy(ref)) {\n      throw new Error(\"Invalid pageIndex request.\");\n    }\n    const index = await this.messageHandler.sendWithPromise(\"GetPageIndex\", {\n      num: ref.num,\n      gen: ref.gen,\n    });\n    const pageNumber = this.pagesMapper.getPageNumber(index + 1);\n    if (pageNumber === 0) {\n      throw new Error(\"GetPageIndex: page has been removed.\");\n    }\n    return pageNumber - 1;\n  }\n\n  getAnnotations(pageIndex, intent) {\n    return this.messageHandler.sendWithPromise(\"GetAnnotations\", {\n      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1,\n      intent,\n    });\n  }\n\n  getFieldObjects() {\n    return this.#cacheSimpleMethod(\"GetFieldObjects\");\n  }\n\n  hasJSActions() {\n    return this.#cacheSimpleMethod(\"HasJSActions\");\n  }\n\n  getCalculationOrderIds() {\n    return this.messageHandler.sendWithPromise(\"GetCalculationOrderIds\", null);\n  }\n\n  getDestinations() {\n    return this.messageHandler.sendWithPromise(\"GetDestinations\", null);\n  }\n\n  getDestination(id) {\n    if (typeof id !== \"string\") {\n      return Promise.reject(new Error(\"Invalid destination request.\"));\n    }\n    return this.messageHandler.sendWithPromise(\"GetDestination\", {\n      id,\n    });\n  }\n\n  getPageLabels() {\n    return this.messageHandler.sendWithPromise(\"GetPageLabels\", null);\n  }\n\n  getPageLayout() {\n    return this.messageHandler.sendWithPromise(\"GetPageLayout\", null);\n  }\n\n  getPageMode() {\n    return this.messageHandler.sendWithPromise(\"GetPageMode\", null);\n  }\n\n  getViewerPreferences() {\n    return this.messageHandler.sendWithPromise(\"GetViewerPreferences\", null);\n  }\n\n  getOpenAction() {\n    return this.messageHandler.sendWithPromise(\"GetOpenAction\", null);\n  }\n\n  /**\n   * @returns {Promise<Map<string, CatalogAttachment> | null>}\n   *   Promise that is resolved with a lookup table for mapping named\n   *   attachments to their content.\n   */\n  getAttachments() {\n    return this.messageHandler.sendWithPromise(\"GetAttachments\", null);\n  }\n\n  /**\n   * @param {string} id\n   *   Unique attachment identifier (required).\n   * @returns {Promise<CatalogAttachmentContent>}\n   *   Promise that resolves to attachment content.\n   */\n  getAttachmentContent(id) {\n    return this.messageHandler.sendWithPromise(\"GetAttachmentContent\", id);\n  }\n\n  getAnnotationsByType(types, pageIndexesToSkip) {\n    return this.messageHandler.sendWithPromise(\"GetAnnotationsByType\", {\n      types,\n      pageIndexesToSkip,\n    });\n  }\n\n  getDocJSActions() {\n    return this.#cacheSimpleMethod(\"GetDocJSActions\");\n  }\n\n  getPageJSActions(pageIndex) {\n    return this.messageHandler.sendWithPromise(\"GetPageJSActions\", {\n      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1,\n    });\n  }\n\n  getStructTree(pageIndex) {\n    return this.messageHandler.sendWithPromise(\"GetStructTree\", {\n      pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1,\n    });\n  }\n\n  getOutline() {\n    return this.messageHandler.sendWithPromise(\"GetOutline\", null);\n  }\n\n  getOptionalContentConfig(renderingIntent) {\n    return this.#cacheSimpleMethod(\"GetOptionalContentConfig\").then(\n      data => new OptionalContentConfig(data, renderingIntent)\n    );\n  }\n\n  getPermissions() {\n    return this.messageHandler.sendWithPromise(\"GetPermissions\", null);\n  }\n\n  getMetadata() {\n    const name = \"GetMetadata\";\n\n    return this.#methodPromises.getOrInsertComputed(name, () =>\n      this.messageHandler.sendWithPromise(name, null).then(results => ({\n        info: results[0],\n        metadata: results[1] ? new Metadata(results[1]) : null,\n        contentDispositionFilename: this.#fullReader?.filename ?? null,\n        contentLength: this.#fullReader?.contentLength ?? null,\n        hasStructTree: results[2],\n      }))\n    );\n  }\n\n  getMarkInfo() {\n    return this.messageHandler.sendWithPromise(\"GetMarkInfo\", null);\n  }\n\n  getRawData(data) {\n    return this.messageHandler.sendWithPromise(\"GetRawData\", data);\n  }\n\n  async startCleanup(keepLoadedFonts = false) {\n    if (this.destroyed) {\n      return; // No need to manually clean-up when destruction has started.\n    }\n    await this.messageHandler.sendWithPromise(\"Cleanup\", null);\n\n    for (const page of this.#pageCache.values()) {\n      const cleanupSuccessful = page.cleanup();\n\n      if (!cleanupSuccessful) {\n        throw new Error(\n          `startCleanup: Page ${page.pageNumber} is currently rendering.`\n        );\n      }\n    }\n    this.commonObjs.clear();\n    if (!keepLoadedFonts) {\n      this.fontLoader.clear();\n    }\n    this.#methodPromises.clear();\n    this.filterFactory.destroy(/* keepHCM = */ true);\n    TextLayer.cleanup();\n  }\n\n  cachedPageNumber(ref) {\n    if (!isRefProxy(ref)) {\n      return null;\n    }\n    const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`;\n    const pageIndex = this.#pageRefCache.get(refStr);\n    if (pageIndex >= 0) {\n      const pageNumber = this.pagesMapper.getPageNumber(pageIndex + 1);\n      if (pageNumber !== 0) {\n        return pageNumber;\n      }\n    }\n    return null;\n  }\n}\n\n/**\n * Allows controlling of the rendering tasks.\n */\nclass RenderTask {\n  _internalRenderTask = null;\n\n  /**\n   * Callback for incremental rendering -- a function that will be called\n   * each time the rendering is paused.  To continue rendering call the\n   * function that is the first argument to the callback.\n   * @type {function}\n   */\n  onContinue = null;\n\n  /**\n   * A function that will be synchronously called when the rendering tasks\n   * finishes with an error (either because of an actual error, or because the\n   * rendering is cancelled).\n   *\n   * @type {function}\n   * @param {Error} error\n   */\n  onError = null;\n\n  constructor(internalRenderTask) {\n    this._internalRenderTask = internalRenderTask;\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"getOperatorList\", {\n        value: () => this._internalRenderTask.operatorList,\n      });\n    }\n  }\n\n  /**\n   * Promise for rendering task completion.\n   * @type {Promise<void>}\n   */\n  get promise() {\n    return this._internalRenderTask.capability.promise;\n  }\n\n  /**\n   * Cancels the rendering task. If the task is currently rendering it will\n   * not be cancelled until graphics pauses with a timeout. The promise that\n   * this object extends will be rejected when cancelled.\n   *\n   * @param {number} [extraDelay]\n   */\n  cancel(extraDelay = 0) {\n    this._internalRenderTask.cancel(/* error = */ null, extraDelay);\n  }\n\n  /**\n   * Whether form fields are rendered separately from the main operatorList.\n   * @type {boolean}\n   */\n  get separateAnnots() {\n    const { separateAnnots } = this._internalRenderTask.operatorList;\n    if (!separateAnnots) {\n      return false;\n    }\n    const { annotationCanvasMap } = this._internalRenderTask;\n    return (\n      separateAnnots.form ||\n      (separateAnnots.canvas && annotationCanvasMap?.size > 0)\n    );\n  }\n\n  get imageCoordinates() {\n    return this._internalRenderTask.imageCoordinates || null;\n  }\n}\n\n/**\n * For internal use only.\n * @ignore\n */\nclass InternalRenderTask {\n  #rAF = null;\n\n  static #canvasInUse = new WeakSet();\n\n  constructor({\n    callback,\n    params,\n    objs,\n    commonObjs,\n    annotationCanvasMap,\n    operatorList,\n    pageIndex,\n    canvasFactory,\n    filterFactory,\n    useRequestAnimationFrame = false,\n    pdfBug = false,\n    pageColors = null,\n    enableHWA = false,\n    operationsFilter = null,\n  }) {\n    this.callback = callback;\n    this.params = params;\n    this.objs = objs;\n    this.commonObjs = commonObjs;\n    this.annotationCanvasMap = annotationCanvasMap;\n    this.operatorListIdx = null;\n    this.operatorList = operatorList;\n    this._pageIndex = pageIndex;\n    this.canvasFactory = canvasFactory;\n    this.filterFactory = filterFactory;\n    this._pdfBug = pdfBug;\n    this.pageColors = pageColors;\n\n    this.running = false;\n    this.graphicsReadyCallback = null;\n    this.graphicsReady = false;\n    this._useRequestAnimationFrame =\n      useRequestAnimationFrame === true && typeof window !== \"undefined\";\n    this.cancelled = false;\n    this.capability = Promise.withResolvers();\n    this.task = new RenderTask(this);\n    // caching this-bound methods\n    this._cancelBound = this.cancel.bind(this);\n    this._continueBound = this._continue.bind(this);\n    this._scheduleNextBound = this._scheduleNext.bind(this);\n    this._nextBound = this._next.bind(this);\n    this._canvas = params.canvas;\n    this._canvasContext = params.canvas ? null : params.canvasContext;\n    this._enableHWA = enableHWA;\n    this._dependencyTracker = params.dependencyTracker;\n    this._imagesTracker = params.imagesTracker;\n    this._operationsFilter = operationsFilter;\n  }\n\n  get completed() {\n    return this.capability.promise.catch(function () {\n      // Ignoring errors, since we only want to know when rendering is\n      // no longer pending.\n    });\n  }\n\n  initializeGraphics({ transparency = false, optionalContentConfig }) {\n    if (this.cancelled) {\n      return;\n    }\n    if (this._canvas) {\n      if (InternalRenderTask.#canvasInUse.has(this._canvas)) {\n        throw new Error(\n          \"Cannot use the same canvas during multiple render() operations. \" +\n            \"Use different canvas or ensure previous operations were \" +\n            \"cancelled or completed.\"\n        );\n      }\n      InternalRenderTask.#canvasInUse.add(this._canvas);\n    }\n\n    if (this._pdfBug && globalThis.StepperManager?.enabled) {\n      this.stepper = globalThis.StepperManager.create(this._pageIndex);\n      this.stepper.init(this.operatorList);\n      this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n    }\n    const {\n      viewport,\n      transform,\n      background,\n      dependencyTracker,\n      imagesTracker,\n    } = this.params;\n\n    // When printing in Firefox, we get a specific context in mozPrintCallback\n    // which cannot be created from the canvas itself.\n    const canvasContext =\n      this._canvasContext ||\n      this._canvas.getContext(\"2d\", {\n        alpha: false,\n        willReadFrequently: !this._enableHWA,\n      });\n\n    this.gfx = new CanvasGraphics(\n      canvasContext,\n      this.commonObjs,\n      this.objs,\n      this.canvasFactory,\n      this.filterFactory,\n      { optionalContentConfig },\n      this.annotationCanvasMap,\n      this.pageColors,\n      dependencyTracker,\n      imagesTracker\n    );\n    this.gfx.beginDrawing({\n      transform,\n      viewport,\n      transparency,\n      background,\n    });\n    this.operatorListIdx = 0;\n    this.graphicsReady = true;\n    this.graphicsReadyCallback?.();\n  }\n\n  cancel(error = null, extraDelay = 0) {\n    this.running = false;\n    this.cancelled = true;\n    this.gfx?.endDrawing();\n    if (this.#rAF) {\n      window.cancelAnimationFrame(this.#rAF);\n      this.#rAF = null;\n    }\n    InternalRenderTask.#canvasInUse.delete(this._canvas);\n\n    error ||= new RenderingCancelledException(\n      `Rendering cancelled, page ${this._pageIndex + 1}`,\n      extraDelay\n    );\n    this.callback(error);\n\n    this.task.onError?.(error);\n  }\n\n  operatorListChanged() {\n    if (!this.graphicsReady) {\n      this.graphicsReadyCallback ||= this._continueBound;\n      return;\n    }\n    this.gfx.dependencyTracker?.growOperationsCount(\n      this.operatorList.fnArray.length\n    );\n    this.stepper?.updateOperatorList(this.operatorList);\n\n    if (this.running) {\n      return;\n    }\n    this._continue();\n  }\n\n  _continue() {\n    this.running = true;\n    if (this.cancelled) {\n      return;\n    }\n    if (this.task.onContinue) {\n      this.task.onContinue(this._scheduleNextBound);\n    } else {\n      this._scheduleNext();\n    }\n  }\n\n  _scheduleNext() {\n    if (this._useRequestAnimationFrame) {\n      this.#rAF = window.requestAnimationFrame(() => {\n        this.#rAF = null;\n        this._nextBound().catch(this._cancelBound);\n      });\n    } else {\n      Promise.resolve().then(this._nextBound).catch(this._cancelBound);\n    }\n  }\n\n  async _next() {\n    if (this.cancelled) {\n      return;\n    }\n    this.operatorListIdx = this.gfx.executeOperatorList(\n      this.operatorList,\n      this.operatorListIdx,\n      this._continueBound,\n      this.stepper,\n      this._operationsFilter\n    );\n    if (this.operatorListIdx === this.operatorList.argsArray.length) {\n      this.running = false;\n      if (this.operatorList.lastChunk) {\n        this.gfx.endDrawing();\n        InternalRenderTask.#canvasInUse.delete(this._canvas);\n        this.callback();\n      }\n    }\n  }\n}\n\n/** @type {string} */\nconst version =\n  typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_VERSION\") : null;\n/** @type {string} */\nconst build =\n  typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_BUILD\") : null;\n\nexport {\n  build,\n  getDocument,\n  PDFDataRangeTransport,\n  PDFDocumentLoadingTask,\n  PDFDocumentProxy,\n  PDFPageProxy,\n  PDFWorker,\n  RenderTask,\n  version,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorParamsType,\n  FeatureTest,\n  shadow,\n  Util,\n} from \"../../shared/util.js\";\nimport { getRGBA, noContextMenu } from \"../display_utils.js\";\nimport { KeyboardManager } from \"./tools.js\";\n\n/**\n * ColorPicker class provides a color picker for the annotation editor.\n * It displays a dropdown with some predefined colors and allows the user\n * to select a color for the annotation.\n */\nclass ColorPicker {\n  #button = null;\n\n  #buttonSwatch = null;\n\n  #defaultColor;\n\n  #dropdown = null;\n\n  #dropdownWasFromKeyboard = false;\n\n  #isMainColorPicker = false;\n\n  #editor = null;\n\n  #eventBus;\n\n  #openDropdownAC = null;\n\n  #uiManager = null;\n\n  static #l10nColor = null;\n\n  static get _keyboardManager() {\n    return shadow(\n      this,\n      \"_keyboardManager\",\n      new KeyboardManager([\n        [[\"Escape\"], ColorPicker.prototype._hideDropdownFromKeyboard],\n        [[\"Space\"], ColorPicker.prototype._colorSelectFromKeyboard],\n        [[\"ArrowDown\", \"ArrowRight\"], ColorPicker.prototype._moveToNext],\n        [[\"ArrowUp\", \"ArrowLeft\"], ColorPicker.prototype._moveToPrevious],\n        [[\"Home\"], ColorPicker.prototype._moveToBeginning],\n        [[\"End\"], ColorPicker.prototype._moveToEnd],\n      ])\n    );\n  }\n\n  constructor({ editor = null, uiManager = null }) {\n    if (editor) {\n      this.#isMainColorPicker = false;\n      this.#editor = editor;\n    } else {\n      this.#isMainColorPicker = true;\n    }\n    this.#uiManager = editor?._uiManager || uiManager;\n    this.#eventBus = this.#uiManager._eventBus;\n    this.#defaultColor =\n      editor?.color?.toUpperCase() ||\n      this.#uiManager?.highlightColors.values().next().value ||\n      \"#FFFF98\";\n\n    ColorPicker.#l10nColor ||= Object.freeze({\n      blue: \"pdfjs-editor-colorpicker-blue\",\n      green: \"pdfjs-editor-colorpicker-green\",\n      pink: \"pdfjs-editor-colorpicker-pink\",\n      red: \"pdfjs-editor-colorpicker-red\",\n      yellow: \"pdfjs-editor-colorpicker-yellow\",\n    });\n  }\n\n  renderButton() {\n    const button = (this.#button = document.createElement(\"button\"));\n    button.className = \"colorPicker\";\n    button.tabIndex = \"0\";\n    button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-colorpicker-button\");\n    button.ariaHasPopup = \"true\";\n    if (this.#editor) {\n      button.ariaControls = `${this.#editor.id}_colorpicker_dropdown`;\n    }\n    const signal = this.#uiManager._signal;\n    button.addEventListener(\"click\", this.#openDropdown.bind(this), { signal });\n    button.addEventListener(\"keydown\", this.#keyDown.bind(this), { signal });\n    const swatch = (this.#buttonSwatch = document.createElement(\"span\"));\n    swatch.className = \"swatch\";\n    swatch.ariaHidden = \"true\";\n    swatch.style.backgroundColor = this.#defaultColor;\n    button.append(swatch);\n    return button;\n  }\n\n  renderMainDropdown() {\n    const dropdown = (this.#dropdown = this.#getDropdownRoot());\n    dropdown.ariaOrientation = \"horizontal\";\n    dropdown.ariaLabelledBy = \"highlightColorPickerLabel\";\n\n    return dropdown;\n  }\n\n  #getDropdownRoot() {\n    const div = document.createElement(\"div\");\n    const signal = this.#uiManager._signal;\n    div.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    div.className = \"dropdown\";\n    div.role = \"listbox\";\n    div.ariaMultiSelectable = \"false\";\n    div.ariaOrientation = \"vertical\";\n    div.setAttribute(\"data-l10n-id\", \"pdfjs-editor-colorpicker-dropdown\");\n    if (this.#editor) {\n      div.id = `${this.#editor.id}_colorpicker_dropdown`;\n    }\n    for (const [name, color] of this.#uiManager.highlightColors) {\n      const button = document.createElement(\"button\");\n      button.tabIndex = \"0\";\n      button.role = \"option\";\n      button.setAttribute(\"data-color\", color);\n      button.title = name;\n      button.setAttribute(\"data-l10n-id\", ColorPicker.#l10nColor[name]);\n      const swatch = document.createElement(\"span\");\n      button.append(swatch);\n      swatch.className = \"swatch\";\n      swatch.style.backgroundColor = color;\n      button.ariaSelected = color === this.#defaultColor;\n      button.addEventListener(\"click\", this.#colorSelect.bind(this, color), {\n        signal,\n      });\n      div.append(button);\n    }\n\n    div.addEventListener(\"keydown\", this.#keyDown.bind(this), { signal });\n\n    return div;\n  }\n\n  #colorSelect(color, event) {\n    event.stopPropagation();\n    this.#eventBus.dispatch(\"switchannotationeditorparams\", {\n      source: this,\n      type: AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n      value: color,\n    });\n    this.updateColor(color);\n  }\n\n  _colorSelectFromKeyboard(event) {\n    if (event.target === this.#button) {\n      this.#openDropdown(event);\n      return;\n    }\n    const color = event.target.getAttribute(\"data-color\");\n    if (!color) {\n      return;\n    }\n    this.#colorSelect(color, event);\n  }\n\n  _moveToNext(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    if (event.target === this.#button) {\n      this.#dropdown.firstElementChild?.focus();\n      return;\n    }\n    event.target.nextSibling?.focus();\n  }\n\n  _moveToPrevious(event) {\n    if (\n      event.target === this.#dropdown?.firstElementChild ||\n      event.target === this.#button\n    ) {\n      if (this.#isDropdownVisible) {\n        this._hideDropdownFromKeyboard();\n      }\n      return;\n    }\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n    }\n    event.target.previousSibling?.focus();\n  }\n\n  _moveToBeginning(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    this.#dropdown.firstElementChild?.focus();\n  }\n\n  _moveToEnd(event) {\n    if (!this.#isDropdownVisible) {\n      this.#openDropdown(event);\n      return;\n    }\n    this.#dropdown.lastElementChild?.focus();\n  }\n\n  #keyDown(event) {\n    ColorPicker._keyboardManager.exec(this, event);\n  }\n\n  #openDropdown(event) {\n    if (this.#isDropdownVisible) {\n      this.hideDropdown();\n      return;\n    }\n    this.#dropdownWasFromKeyboard = event.detail === 0;\n\n    if (!this.#openDropdownAC) {\n      this.#openDropdownAC = new AbortController();\n\n      window.addEventListener(\"pointerdown\", this.#pointerDown.bind(this), {\n        signal: this.#uiManager.combinedSignal(this.#openDropdownAC),\n      });\n    }\n    this.#button.ariaExpanded = \"true\";\n    if (this.#dropdown) {\n      this.#dropdown.classList.remove(\"hidden\");\n      return;\n    }\n    const root = (this.#dropdown = this.#getDropdownRoot());\n    this.#button.append(root);\n  }\n\n  #pointerDown(event) {\n    if (this.#dropdown?.contains(event.target)) {\n      return;\n    }\n    this.hideDropdown();\n  }\n\n  hideDropdown() {\n    this.#dropdown?.classList.add(\"hidden\");\n    this.#button.ariaExpanded = \"false\";\n    this.#openDropdownAC?.abort();\n    this.#openDropdownAC = null;\n  }\n\n  get #isDropdownVisible() {\n    return this.#dropdown && !this.#dropdown.classList.contains(\"hidden\");\n  }\n\n  _hideDropdownFromKeyboard() {\n    if (this.#isMainColorPicker) {\n      return;\n    }\n    if (!this.#isDropdownVisible) {\n      // The user pressed Escape with no dropdown visible, so we must\n      // unselect it.\n      this.#editor?.unselect();\n      return;\n    }\n    this.hideDropdown();\n    this.#button.focus({\n      preventScroll: true,\n      focusVisible: this.#dropdownWasFromKeyboard,\n    });\n  }\n\n  updateColor(color) {\n    if (this.#buttonSwatch) {\n      this.#buttonSwatch.style.backgroundColor = color;\n    }\n    if (!this.#dropdown) {\n      return;\n    }\n\n    const i = this.#uiManager.highlightColors.values();\n    for (const child of this.#dropdown.children) {\n      child.ariaSelected = i.next().value === color.toUpperCase();\n    }\n  }\n\n  destroy() {\n    this.#button?.remove();\n    this.#button = null;\n    this.#buttonSwatch = null;\n    this.#dropdown?.remove();\n    this.#dropdown = null;\n  }\n}\n\n/**\n * BasicColorPicker class provides a simple color picker.\n * It displays an input element (with type=\"color\") that allows the user\n * to select a color for the annotation.\n */\nclass BasicColorPicker {\n  #input = null;\n\n  #hasAlpha = false;\n\n  #editor = null;\n\n  #uiManager = null;\n\n  static #l10nColor = null;\n\n  constructor(editor) {\n    this.#editor = editor;\n    this.#uiManager = editor._uiManager;\n\n    BasicColorPicker.#l10nColor ||= Object.freeze({\n      freetext: \"pdfjs-editor-color-picker-free-text-input\",\n      ink: \"pdfjs-editor-color-picker-ink-input\",\n    });\n  }\n\n  renderButton() {\n    if (this.#input) {\n      return this.#input;\n    }\n    const {\n      editorType,\n      colorType,\n      colorAndOpacityType,\n      opacityType,\n      color,\n      opacity,\n    } = this.#editor;\n    const hasAlpha = (this.#hasAlpha =\n      FeatureTest.isAlphaColorInputSupported && opacityType !== undefined);\n    const input = (this.#input = document.createElement(\"input\"));\n    input.type = \"color\";\n    if (hasAlpha) {\n      input.setAttribute(\"alpha\", \"\");\n      const alphaHex = Util.hexNums[Math.round((opacity ?? 1) * 255)];\n      input.value = (color || \"#000000\") + alphaHex;\n    } else {\n      input.value = color || \"#000000\";\n    }\n    input.className = \"basicColorPicker\";\n    input.tabIndex = 0;\n    input.setAttribute(\"data-l10n-id\", BasicColorPicker.#l10nColor[editorType]);\n    input.addEventListener(\n      \"input\",\n      () => {\n        if (hasAlpha) {\n          const rgba = getRGBA(input.value);\n          if (!rgba) {\n            return;\n          }\n          const [r, g, b, op] = rgba;\n          const hex = Util.makeHexColor(r, g, b);\n          if (colorAndOpacityType !== undefined) {\n            this.#uiManager.updateParams(colorAndOpacityType, {\n              color: hex,\n              opacity: op,\n            });\n          } else {\n            this.#uiManager.updateParams(colorType, hex);\n            this.#uiManager.updateParams(opacityType, op);\n          }\n        } else {\n          this.#uiManager.updateParams(colorType, input.value);\n        }\n      },\n      { signal: this.#uiManager._signal }\n    );\n    return input;\n  }\n\n  update(value) {\n    if (!this.#input) {\n      return;\n    }\n    if (this.#hasAlpha) {\n      // Reconstruct #RRGGBBAA using the editor's current opacity.\n      const alphaHex = Util.hexNums[Math.round(this.#editor.opacity * 255)];\n      this.#input.value = value + alphaHex;\n    } else {\n      this.#input.value = value;\n    }\n  }\n\n  updateOpacity(value) {\n    if (!this.#input || !this.#hasAlpha) {\n      return;\n    }\n    // Reconstruct #RRGGBBAA using the editor's current color.\n    const alphaHex = Util.hexNums[Math.round(value * 255)];\n    this.#input.value = this.#editor.color + alphaHex;\n  }\n\n  destroy() {\n    this.#input?.remove();\n    this.#input = null;\n  }\n\n  hideDropdown() {}\n}\n\nexport { BasicColorPicker, ColorPicker };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * PLEASE NOTE: This file is currently imported in both the `../display/` and\n *              `../scripting_api/` folders, hence be EXTREMELY careful about\n *              introducing any dependencies here since that can lead to an\n *              unexpected/unnecessary size increase of the *built* files.\n */\n\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\nfunction makeColorComp(n) {\n  return Math.floor(MathClamp(n, 0, 1) * 255)\n    .toString(16)\n    .padStart(2, \"0\");\n}\n\nfunction scaleAndClamp(x) {\n  return MathClamp(x, 0, 1) * 255;\n}\n\n// PDF specifications section 10.3\nclass ColorConverters {\n  static CMYK_G([c, y, m, k]) {\n    return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n  }\n\n  static G_CMYK([g]) {\n    return [\"CMYK\", 0, 0, 0, 1 - g];\n  }\n\n  static G_RGB([g]) {\n    return [\"RGB\", g, g, g];\n  }\n\n  static G_rgb([g]) {\n    g = scaleAndClamp(g);\n    return [g, g, g];\n  }\n\n  static G_HTML([g]) {\n    const G = makeColorComp(g);\n    return `#${G}${G}${G}`;\n  }\n\n  static RGB_G([r, g, b]) {\n    return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n  }\n\n  static RGB_rgb(color) {\n    return color.map(scaleAndClamp);\n  }\n\n  static RGB_HTML(color) {\n    return `#${color.map(makeColorComp).join(\"\")}`;\n  }\n\n  static T_HTML() {\n    return \"#00000000\";\n  }\n\n  static T_rgb() {\n    return [null];\n  }\n\n  static CMYK_RGB([c, y, m, k]) {\n    return [\n      \"RGB\",\n      1 - Math.min(1, c + k),\n      1 - Math.min(1, m + k),\n      1 - Math.min(1, y + k),\n    ];\n  }\n\n  static CMYK_rgb([c, y, m, k]) {\n    return [\n      scaleAndClamp(1 - Math.min(1, c + k)),\n      scaleAndClamp(1 - Math.min(1, m + k)),\n      scaleAndClamp(1 - Math.min(1, y + k)),\n    ];\n  }\n\n  static CMYK_HTML(components) {\n    const rgb = this.CMYK_RGB(components).slice(1);\n    return this.RGB_HTML(rgb);\n  }\n\n  static RGB_CMYK([r, g, b]) {\n    const c = 1 - r;\n    const m = 1 - g;\n    const y = 1 - b;\n    const k = Math.min(c, m, y);\n    return [\"CMYK\", c, m, y, k];\n  }\n}\n\nconst DateFormats = [\n  \"m/d\",\n  \"m/d/yy\",\n  \"mm/dd/yy\",\n  \"mm/yy\",\n  \"d-mmm\",\n  \"d-mmm-yy\",\n  \"dd-mmm-yy\",\n  \"yy-mm-dd\",\n  \"mmm-yy\",\n  \"mmmm-yy\",\n  \"mmm d, yyyy\",\n  \"mmmm d, yyyy\",\n  \"m/d/yy h:MM tt\",\n  \"m/d/yy HH:MM\",\n];\nconst TimeFormats = [\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"];\n\nexport { ColorConverters, DateFormats, TimeFormats };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SVG_NS, unreachable } from \"../shared/util.js\";\n\nclass BaseSVGFactory {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseSVGFactory\n    ) {\n      unreachable(\"Cannot initialize BaseSVGFactory.\");\n    }\n  }\n\n  create(width, height, skipDimensions = false) {\n    if (width <= 0 || height <= 0) {\n      throw new Error(\"Invalid SVG dimensions\");\n    }\n    const svg = this._createSVG(\"svg:svg\");\n    svg.setAttribute(\"version\", \"1.1\");\n\n    if (!skipDimensions) {\n      svg.setAttribute(\"width\", `${width}px`);\n      svg.setAttribute(\"height\", `${height}px`);\n    }\n\n    svg.setAttribute(\"preserveAspectRatio\", \"none\");\n    svg.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n\n    return svg;\n  }\n\n  createElement(type) {\n    if (typeof type !== \"string\") {\n      throw new Error(\"Invalid SVG element type\");\n    }\n    return this._createSVG(type);\n  }\n\n  /**\n   * @ignore\n   */\n  _createSVG(type) {\n    unreachable(\"Abstract method `_createSVG` called.\");\n  }\n}\n\nclass DOMSVGFactory extends BaseSVGFactory {\n  /**\n   * @ignore\n   */\n  _createSVG(type) {\n    return document.createElementNS(SVG_NS, type);\n  }\n}\n\nexport { BaseSVGFactory, DOMSVGFactory };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./api\").PDFPageProxy} PDFPageProxy */\n/** @typedef {import(\"./page_viewport\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/optional_content_config\").OptionalContentConfig} OptionalContentConfig */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/editor/tools.js\").AnnotationEditorUIManager} AnnotationEditorUIManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/struct_tree_layer_builder.js\").StructTreeLayerBuilder} StructTreeLayerBuilder */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/comment_manager.js\").CommentManager} CommentManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/pdf_link_service.js\").PDFLinkService} PDFLinkService */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../web/base_download_manager.js\").BaseDownloadManager} BaseDownloadManager */\n\n/**\n * @import { CatalogAttachmentContent } from \"../src/core/catalog.js\";\n */\n\nimport {\n  AnnotationBorderStyleType,\n  AnnotationEditorPrefix,\n  AnnotationEditorType,\n  AnnotationPrefix,\n  AnnotationType,\n  FeatureTest,\n  LINE_FACTOR,\n  makeArr,\n  shadow,\n  SVG_NS,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  PDFDateString,\n  renderRichText,\n  setLayerDimensions,\n} from \"./display_utils.js\";\nimport { AnnotationStorage } from \"./annotation_storage.js\";\nimport { ColorConverters } from \"../shared/scripting_utils.js\";\nimport { DOMSVGFactory } from \"./svg_factory.js\";\n\nconst DEFAULT_FONT_SIZE = 9;\nconst GetElementsByNameSet = new WeakSet();\nconst TIMEZONE_OFFSET = new Date().getTimezoneOffset() * 60 * 1000;\n\n/**\n * @typedef {Object} AnnotationElementParameters\n * @property {Object} data\n * @property {HTMLDivElement} layer\n * @property {PDFLinkService} linkService\n * @property {BaseDownloadManager} [downloadManager]\n * @property {AnnotationStorage} [annotationStorage]\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {boolean} renderForms\n * @property {Object} svgFactory\n * @property {boolean} [enableScripting]\n * @property {boolean} [hasJSActions]\n * @property {Object} [fieldObjects]\n */\n\nclass AnnotationElementFactory {\n  /**\n   * @param {AnnotationElementParameters} parameters\n   * @returns {AnnotationElement}\n   */\n  static create(parameters) {\n    const subtype = parameters.data.annotationType;\n\n    switch (subtype) {\n      case AnnotationType.LINK:\n        return new LinkAnnotationElement(parameters);\n\n      case AnnotationType.TEXT:\n        return new TextAnnotationElement(parameters);\n\n      case AnnotationType.WIDGET:\n        const fieldType = parameters.data.fieldType;\n\n        switch (fieldType) {\n          case \"Tx\":\n            return new TextWidgetAnnotationElement(parameters);\n          case \"Btn\":\n            if (parameters.data.radioButton) {\n              return new RadioButtonWidgetAnnotationElement(parameters);\n            } else if (parameters.data.checkBox) {\n              return new CheckboxWidgetAnnotationElement(parameters);\n            }\n            return new PushButtonWidgetAnnotationElement(parameters);\n          case \"Ch\":\n            return new ChoiceWidgetAnnotationElement(parameters);\n          case \"Sig\":\n            return new SignatureWidgetAnnotationElement(parameters);\n        }\n        return new WidgetAnnotationElement(parameters);\n\n      case AnnotationType.POPUP:\n        return new PopupAnnotationElement(parameters);\n\n      case AnnotationType.FREETEXT:\n        return new FreeTextAnnotationElement(parameters);\n\n      case AnnotationType.LINE:\n        return new LineAnnotationElement(parameters);\n\n      case AnnotationType.SQUARE:\n        return new SquareAnnotationElement(parameters);\n\n      case AnnotationType.CIRCLE:\n        return new CircleAnnotationElement(parameters);\n\n      case AnnotationType.POLYLINE:\n        return new PolylineAnnotationElement(parameters);\n\n      case AnnotationType.CARET:\n        return new CaretAnnotationElement(parameters);\n\n      case AnnotationType.INK:\n        return new InkAnnotationElement(parameters);\n\n      case AnnotationType.POLYGON:\n        return new PolygonAnnotationElement(parameters);\n\n      case AnnotationType.HIGHLIGHT:\n        return new HighlightAnnotationElement(parameters);\n\n      case AnnotationType.UNDERLINE:\n        return new UnderlineAnnotationElement(parameters);\n\n      case AnnotationType.SQUIGGLY:\n        return new SquigglyAnnotationElement(parameters);\n\n      case AnnotationType.STRIKEOUT:\n        return new StrikeOutAnnotationElement(parameters);\n\n      case AnnotationType.STAMP:\n        return new StampAnnotationElement(parameters);\n\n      case AnnotationType.FILEATTACHMENT:\n        return new FileAttachmentAnnotationElement(parameters);\n\n      // A Screen annotation with a rendition action plays embedded media the\n      // same way RichMedia does (see `MediaAnnotation` in the core layer).\n      case AnnotationType.RICHMEDIA:\n      case AnnotationType.SCREEN:\n        return new MediaAnnotationElement(parameters);\n\n      default:\n        return new AnnotationElement(parameters);\n    }\n  }\n}\n\nclass AnnotationElement {\n  #updates = null;\n\n  #hasBorder = false;\n\n  #popupElement = null;\n\n  constructor(\n    parameters,\n    {\n      isRenderable = false,\n      ignoreBorder = false,\n      createQuadrilaterals = false,\n    } = {}\n  ) {\n    this.isRenderable = isRenderable;\n    this.data = parameters.data;\n    this.layer = parameters.layer;\n    this.linkService = parameters.linkService;\n    this.downloadManager = parameters.downloadManager;\n    this.imageResourcesPath = parameters.imageResourcesPath;\n    this.renderForms = parameters.renderForms;\n    this.svgFactory = parameters.svgFactory;\n    this.annotationStorage = parameters.annotationStorage;\n    this.enableComment = parameters.enableComment;\n    this.enableScripting = parameters.enableScripting;\n    this.hasJSActions = parameters.hasJSActions;\n    this._fieldObjects = parameters.fieldObjects;\n    this.parent = parameters.parent;\n    this.hasOwnCommentButton = false;\n\n    if (isRenderable) {\n      this.contentElement = this.container =\n        this._createContainer(ignoreBorder);\n    }\n    if (createQuadrilaterals) {\n      this._createQuadrilaterals();\n    }\n  }\n\n  static _hasPopupData({ contentsObj, richText }) {\n    return !!(contentsObj?.str || richText?.str);\n  }\n\n  get _isEditable() {\n    return this.data.isEditable;\n  }\n\n  get hasPopupData() {\n    return (\n      AnnotationElement._hasPopupData(this.data) ||\n      (this.enableComment && !!this.commentText)\n    );\n  }\n\n  get commentData() {\n    const { data } = this;\n    const editor = this.annotationStorage?.getEditor(data.id);\n    if (editor) {\n      return editor.getData();\n    }\n    return data;\n  }\n\n  get hasCommentButton() {\n    return this.enableComment && this.hasPopupElement;\n  }\n\n  get commentButtonPosition() {\n    const editor = this.annotationStorage?.getEditor(this.data.id);\n    if (editor) {\n      return editor.commentButtonPositionInPage;\n    }\n    const { quadPoints, inkLists, rect } = this.data;\n    let maxX = -Infinity;\n    let maxY = -Infinity;\n    if (quadPoints?.length >= 8) {\n      for (let i = 0; i < quadPoints.length; i += 8) {\n        if (quadPoints[i + 1] > maxY) {\n          maxY = quadPoints[i + 1];\n          maxX = quadPoints[i + 2];\n        } else if (quadPoints[i + 1] === maxY) {\n          maxX = Math.max(maxX, quadPoints[i + 2]);\n        }\n      }\n      return [maxX, maxY];\n    }\n    if (inkLists?.length >= 1) {\n      for (const inkList of inkLists) {\n        for (let i = 0, ii = inkList.length; i < ii; i += 2) {\n          if (inkList[i + 1] > maxY) {\n            maxY = inkList[i + 1];\n            maxX = inkList[i];\n          } else if (inkList[i + 1] === maxY) {\n            maxX = Math.max(maxX, inkList[i]);\n          }\n        }\n      }\n      if (maxX !== Infinity) {\n        return [maxX, maxY];\n      }\n    }\n    if (rect) {\n      return [rect[2], rect[3]];\n    }\n    return null;\n  }\n\n  _normalizePoint(point) {\n    const {\n      page: { view },\n      viewport: {\n        rawDims: { pageWidth, pageHeight, pageX, pageY },\n      },\n    } = this.parent;\n    point[1] = view[3] - point[1] + view[1];\n    point[0] = (100 * (point[0] - pageX)) / pageWidth;\n    point[1] = (100 * (point[1] - pageY)) / pageHeight;\n    return point;\n  }\n\n  get commentText() {\n    const { data } = this;\n    return (\n      this.annotationStorage.getRawValue(`${AnnotationEditorPrefix}${data.id}`)\n        ?.popup?.contents ||\n      data.contentsObj?.str ||\n      \"\"\n    );\n  }\n\n  set commentText(text) {\n    const { data } = this;\n    const popup = { deleted: !text, contents: text || \"\" };\n    if (!this.annotationStorage.updateEditor(data.id, { popup })) {\n      this.annotationStorage.setValue(`${AnnotationEditorPrefix}${data.id}`, {\n        id: data.id,\n        annotationType: data.annotationType,\n        page: this.parent.page,\n        popup,\n        popupRef: data.popupRef,\n        modificationDate: new Date(),\n      });\n    }\n    if (!text) {\n      this.removePopup();\n    }\n  }\n\n  removePopup() {\n    (this.#popupElement?.popup || this.popup)?.remove();\n    this.#popupElement = this.popup = null;\n  }\n\n  updateEdited(params) {\n    if (!this.container) {\n      return;\n    }\n\n    if (params.rect) {\n      this.#updates ||= {\n        rect: this.data.rect.slice(0),\n      };\n    }\n\n    const { rect, popup: newPopup } = params;\n\n    if (rect) {\n      this.#setRectEdited(rect);\n    }\n\n    let popup = this.#popupElement?.popup || this.popup;\n    if (!popup && newPopup?.text) {\n      this._createPopup(newPopup);\n      popup = this.#popupElement.popup;\n    }\n    if (!popup) {\n      return;\n    }\n    popup.updateEdited(params);\n    if (newPopup?.deleted) {\n      popup.remove();\n      this.#popupElement = null;\n      this.popup = null;\n    }\n  }\n\n  resetEdited() {\n    if (!this.#updates) {\n      return;\n    }\n    this.#setRectEdited(this.#updates.rect);\n    this.#popupElement?.popup.resetEdited();\n    this.#updates = null;\n  }\n\n  #setRectEdited(rect) {\n    const {\n      container: { style },\n      data: { rect: currentRect, rotation },\n      parent: {\n        viewport: {\n          rawDims: { pageWidth, pageHeight, pageX, pageY },\n        },\n      },\n    } = this;\n    currentRect?.splice(0, 4, ...rect);\n    style.left = `${(100 * (rect[0] - pageX)) / pageWidth}%`;\n    style.top = `${(100 * (pageHeight - rect[3] + pageY)) / pageHeight}%`;\n    if (rotation === 0) {\n      style.width = `${(100 * /* width = */ (rect[2] - rect[0])) / pageWidth}%`;\n      style.height = `${(100 * /* height = */ (rect[3] - rect[1])) / pageHeight}%`;\n    } else {\n      this.setRotation(rotation);\n    }\n  }\n\n  /**\n   * Create an empty container for the annotation's HTML element.\n   *\n   * @private\n   * @param {boolean} ignoreBorder\n   * @memberof AnnotationElement\n   * @returns {HTMLElement} A section element.\n   */\n  _createContainer(ignoreBorder) {\n    const {\n      data,\n      parent: { page, viewport },\n    } = this;\n\n    const container = document.createElement(\"section\");\n    container.setAttribute(\"data-annotation-id\", data.id);\n    if (\n      !(this instanceof WidgetAnnotationElement) &&\n      !(this instanceof LinkAnnotationElement) &&\n      !(this instanceof MediaAnnotationElement)\n    ) {\n      container.tabIndex = 0;\n    }\n    const { style } = container;\n\n    // The accessibility manager will move the annotation in the DOM in\n    // order to match the visual ordering.\n    // But if an annotation is above an other one, then we must draw it\n    // after the other one whatever the order is in the DOM, hence the\n    // use of the z-index.\n    style.zIndex = this.parent.zIndex;\n    // Keep zIndex + 1 for stuff we want to add on top of this annotation.\n    this.parent.zIndex += 2;\n\n    if (data.alternativeText) {\n      container.title = data.alternativeText;\n    }\n\n    if (data.noRotate) {\n      container.classList.add(\"norotate\");\n    }\n\n    if (!data.rect || this instanceof PopupAnnotationElement) {\n      const { rotation } = data;\n      if (!data.hasOwnCanvas && rotation !== 0) {\n        this.setRotation(rotation, container);\n      }\n      return container;\n    }\n    const { width, height } = this;\n\n    if (!ignoreBorder && data.borderStyle.width > 0) {\n      style.borderWidth = `${data.borderStyle.width}px`;\n\n      const horizontalRadius = data.borderStyle.horizontalCornerRadius;\n      const verticalRadius = data.borderStyle.verticalCornerRadius;\n      if (horizontalRadius > 0 || verticalRadius > 0) {\n        const radius = `calc(${horizontalRadius}px * var(--total-scale-factor)) / calc(${verticalRadius}px * var(--total-scale-factor))`;\n        style.borderRadius = radius;\n      }\n\n      switch (data.borderStyle.style) {\n        case AnnotationBorderStyleType.SOLID:\n          style.borderStyle = \"solid\";\n          break;\n\n        case AnnotationBorderStyleType.DASHED:\n          style.borderStyle = \"dashed\";\n          break;\n\n        case AnnotationBorderStyleType.BEVELED:\n          warn(\"Unimplemented border style: beveled\");\n          break;\n\n        case AnnotationBorderStyleType.INSET:\n          warn(\"Unimplemented border style: inset\");\n          break;\n\n        case AnnotationBorderStyleType.UNDERLINE:\n          style.borderBottomStyle = \"solid\";\n          break;\n\n        default:\n          break;\n      }\n\n      const borderColor = data.borderColor || null;\n      if (borderColor) {\n        this.#hasBorder = true;\n        style.borderColor = Util.makeHexColor(...borderColor);\n      } else {\n        // Transparent (invisible) border, so do not draw it at all.\n        style.borderWidth = 0;\n      }\n    }\n\n    // Do *not* modify `data.rect`, since that will corrupt the annotation\n    // position on subsequent calls to `_createContainer` (see issue 6804).\n    const rect = Util.normalizeRect([\n      data.rect[0],\n      page.view[3] - data.rect[1] + page.view[1],\n      data.rect[2],\n      page.view[3] - data.rect[3] + page.view[1],\n    ]);\n    const { pageWidth, pageHeight, pageX, pageY } = viewport.rawDims;\n\n    style.left = `${(100 * (rect[0] - pageX)) / pageWidth}%`;\n    style.top = `${(100 * (rect[1] - pageY)) / pageHeight}%`;\n\n    const { rotation } = data;\n    if (data.hasOwnCanvas || rotation === 0) {\n      style.width = `${(100 * width) / pageWidth}%`;\n      style.height = `${(100 * height) / pageHeight}%`;\n    } else {\n      this.setRotation(rotation, container);\n    }\n\n    return container;\n  }\n\n  setRotation(angle, container = this.container) {\n    if (!this.data.rect) {\n      return;\n    }\n    const { pageWidth, pageHeight } = this.parent.viewport.rawDims;\n    let { width, height } = this;\n\n    if (angle % 180 !== 0) {\n      [width, height] = [height, width];\n    }\n    container.style.width = `${(100 * width) / pageWidth}%`;\n    container.style.height = `${(100 * height) / pageHeight}%`;\n\n    container.setAttribute(\"data-main-rotation\", (360 - angle) % 360);\n  }\n\n  get _commonActions() {\n    const setColor = (jsName, styleName, event) => {\n      const color = event.detail[jsName];\n      const colorType = color[0];\n      const colorArray = color.slice(1);\n      event.target.style[styleName] =\n        ColorConverters[`${colorType}_HTML`](colorArray);\n      this.annotationStorage.setValue(this.data.id, {\n        [styleName]: ColorConverters[`${colorType}_rgb`](colorArray),\n      });\n    };\n\n    return shadow(this, \"_commonActions\", {\n      display: event => {\n        const { display } = event.detail;\n        // See scripting/constants.js for the values of `Display`.\n        // 0 = visible, 1 = hidden, 2 = noPrint and 3 = noView.\n        const hidden = display % 2 === 1;\n        this.container.style.visibility = hidden ? \"hidden\" : \"visible\";\n        this.annotationStorage.setValue(this.data.id, {\n          noView: hidden,\n          noPrint: display === 1 || display === 2,\n        });\n      },\n      print: event => {\n        this.annotationStorage.setValue(this.data.id, {\n          noPrint: !event.detail.print,\n        });\n      },\n      hidden: event => {\n        const { hidden } = event.detail;\n        this.container.style.visibility = hidden ? \"hidden\" : \"visible\";\n        this.annotationStorage.setValue(this.data.id, {\n          noPrint: hidden,\n          noView: hidden,\n        });\n      },\n      focus: event => {\n        setTimeout(() => event.target.focus({ preventScroll: false }), 0);\n      },\n      userName: event => {\n        // tooltip\n        event.target.title = event.detail.userName;\n      },\n      readonly: event => {\n        event.target.disabled = event.detail.readonly;\n      },\n      required: event => {\n        this._setRequired(event.target, event.detail.required);\n      },\n      bgColor: event => {\n        setColor(\"bgColor\", \"backgroundColor\", event);\n      },\n      fillColor: event => {\n        setColor(\"fillColor\", \"backgroundColor\", event);\n      },\n      fgColor: event => {\n        setColor(\"fgColor\", \"color\", event);\n      },\n      textColor: event => {\n        setColor(\"textColor\", \"color\", event);\n      },\n      borderColor: event => {\n        setColor(\"borderColor\", \"borderColor\", event);\n      },\n      strokeColor: event => {\n        setColor(\"strokeColor\", \"borderColor\", event);\n      },\n      rotation: event => {\n        const angle = event.detail.rotation;\n        this.setRotation(angle);\n        this.annotationStorage.setValue(this.data.id, {\n          rotation: angle,\n        });\n      },\n    });\n  }\n\n  _dispatchEventFromSandbox(actions, jsEvent) {\n    const commonActions = this._commonActions;\n    for (const name of Object.keys(jsEvent.detail)) {\n      const action = actions[name] || commonActions[name];\n      action?.(jsEvent);\n    }\n  }\n\n  _setDefaultPropertiesFromJS(element) {\n    if (!this.enableScripting) {\n      return;\n    }\n\n    // Some properties may have been updated thanks to JS.\n    const storedData = this.annotationStorage.getRawValue(this.data.id);\n    if (!storedData) {\n      return;\n    }\n\n    const commonActions = this._commonActions;\n    for (const [actionName, detail] of Object.entries(storedData)) {\n      const action = commonActions[actionName];\n      if (action) {\n        const eventProxy = {\n          detail: {\n            [actionName]: detail,\n          },\n          target: element,\n        };\n        action(eventProxy);\n        // The action has been consumed: no need to keep it.\n        delete storedData[actionName];\n      }\n    }\n  }\n\n  /**\n   * Create quadrilaterals from the annotation's quadpoints.\n   *\n   * @private\n   * @memberof AnnotationElement\n   */\n  _createQuadrilaterals() {\n    if (!this.container) {\n      return;\n    }\n    const { quadPoints } = this.data;\n    if (!quadPoints) {\n      return;\n    }\n\n    const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x =>\n      Math.fround(x)\n    );\n\n    if (quadPoints.length === 8) {\n      const [trX, trY, blX, blY] = quadPoints.subarray(2, 6);\n      if (\n        rectTrX === trX &&\n        rectTrY === trY &&\n        rectBlX === blX &&\n        rectBlY === blY\n      ) {\n        // The quadpoints cover the whole annotation rectangle, so no need to\n        // create a quadrilateral.\n        return;\n      }\n    }\n\n    const { style } = this.container;\n    let svgBuffer;\n    if (this.#hasBorder) {\n      const { borderColor, borderWidth } = style;\n      style.borderWidth = 0;\n      svgBuffer = [\n        \"url('data:image/svg+xml;utf8,\",\n        `<svg xmlns=\"${SVG_NS}\" preserveAspectRatio=\"none\" viewBox=\"0 0 1 1\">`,\n        `<g fill=\"transparent\" stroke=\"${borderColor}\" stroke-width=\"${borderWidth}\">`,\n      ];\n      this.container.classList.add(\"hasBorder\");\n    }\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      this.container.classList.add(\"hasClipPath\");\n    }\n\n    const width = rectTrX - rectBlX;\n    const height = rectTrY - rectBlY;\n\n    const { svgFactory } = this;\n    const svg = svgFactory.createElement(\"svg\");\n    svg.classList.add(\"quadrilateralsContainer\");\n    svg.setAttribute(\"width\", 0);\n    svg.setAttribute(\"height\", 0);\n    svg.role = \"none\";\n    const defs = svgFactory.createElement(\"defs\");\n    svg.append(defs);\n    const clipPath = svgFactory.createElement(\"clipPath\");\n    const id = `clippath_${this.data.id}`;\n    clipPath.setAttribute(\"id\", id);\n    clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n    defs.append(clipPath);\n\n    for (let i = 2, ii = quadPoints.length; i < ii; i += 8) {\n      const trX = quadPoints[i];\n      const trY = quadPoints[i + 1];\n      const blX = quadPoints[i + 2];\n      const blY = quadPoints[i + 3];\n      const rect = svgFactory.createElement(\"rect\");\n      const x = (blX - rectBlX) / width;\n      const y = (rectTrY - trY) / height;\n      const rectWidth = (trX - blX) / width;\n      const rectHeight = (trY - blY) / height;\n      rect.setAttribute(\"x\", x);\n      rect.setAttribute(\"y\", y);\n      rect.setAttribute(\"width\", rectWidth);\n      rect.setAttribute(\"height\", rectHeight);\n      clipPath.append(rect);\n      svgBuffer?.push(\n        `<rect vector-effect=\"non-scaling-stroke\" x=\"${x}\" y=\"${y}\" width=\"${rectWidth}\" height=\"${rectHeight}\"/>`\n      );\n    }\n\n    if (this.#hasBorder) {\n      svgBuffer.push(`</g></svg>')`);\n      style.backgroundImage = svgBuffer.join(\"\");\n    }\n\n    this.container.append(svg);\n    this.container.style.clipPath = `url(#${id})`;\n  }\n\n  /**\n   * Create a popup for the annotation's HTML element. This is used for\n   * annotations that do not have a Popup entry in the dictionary, but\n   * are of a type that works with popups (such as Highlight annotations).\n   *\n   * @param {Object} [popupData] - The data for the popup, if any.\n   *\n   * @private\n   * @memberof AnnotationElement\n   */\n  _createPopup(popupData = null) {\n    const { data } = this;\n\n    let contentsObj, modificationDate;\n    if (popupData) {\n      contentsObj = {\n        str: popupData.text,\n      };\n      modificationDate = popupData.date;\n    } else {\n      contentsObj = data.contentsObj;\n      modificationDate = data.modificationDate;\n    }\n    this.#popupElement = new PopupAnnotationElement({\n      data: {\n        color: data.color,\n        titleObj: data.titleObj,\n        modificationDate,\n        contentsObj,\n        richText: data.richText,\n        parentRect: data.rect,\n        borderStyle: 0,\n        id: `popup_${data.id}`,\n        rotation: data.rotation,\n        noRotate: true,\n      },\n      linkService: this.linkService,\n      parent: this.parent,\n      elements: [this],\n    });\n  }\n\n  get hasPopupElement() {\n    return !!(this.#popupElement || this.popup || this.data.popupRef);\n  }\n\n  get extraPopupElement() {\n    return this.#popupElement;\n  }\n\n  /**\n   * Render the annotation's HTML element(s).\n   *\n   * @public\n   * @memberof AnnotationElement\n   */\n  render() {\n    unreachable(\"Abstract method `AnnotationElement.render` called\");\n  }\n\n  /**\n   * @private\n   * @returns {Array}\n   */\n  _getElementsByName(name, skipId = null) {\n    const fields = [];\n\n    if (this._fieldObjects) {\n      const fieldObj = this._fieldObjects[name];\n      if (fieldObj) {\n        for (const { page, id, exportValues } of fieldObj) {\n          if (page === -1) {\n            continue;\n          }\n          if (id === skipId) {\n            continue;\n          }\n          const exportValue =\n            typeof exportValues === \"string\" ? exportValues : null;\n\n          const domElement = document.querySelector(\n            `[data-element-id=\"${id}\"]`\n          );\n          if (domElement && !GetElementsByNameSet.has(domElement)) {\n            warn(`_getElementsByName - element not allowed: ${id}`);\n            continue;\n          }\n          fields.push({ id, exportValue, domElement });\n        }\n      }\n      return fields;\n    }\n    // Fallback to a regular DOM lookup, to ensure that the standalone\n    // viewer components won't break.\n    for (const domElement of document.getElementsByName(name)) {\n      const { exportValue } = domElement;\n      const id = domElement.getAttribute(\"data-element-id\");\n      if (id === skipId) {\n        continue;\n      }\n      if (!GetElementsByNameSet.has(domElement)) {\n        continue;\n      }\n      fields.push({ id, exportValue, domElement });\n    }\n    return fields;\n  }\n\n  show() {\n    if (this.container) {\n      this.container.hidden = false;\n    }\n    this.popup?.maybeShow();\n  }\n\n  hide() {\n    if (this.container) {\n      this.container.hidden = true;\n    }\n    this.popup?.forceHide();\n  }\n\n  /**\n   * Get the HTML element(s) which can trigger a popup when clicked or hovered.\n   *\n   * @public\n   * @memberof AnnotationElement\n   * @returns {Array<HTMLElement>|HTMLElement} An array of elements or an\n   *          element.\n   */\n  getElementsToTriggerPopup() {\n    return this.container;\n  }\n\n  addHighlightArea() {\n    const triggers = this.getElementsToTriggerPopup();\n    if (Array.isArray(triggers)) {\n      for (const element of triggers) {\n        element.classList.add(\"highlightArea\");\n      }\n    } else {\n      triggers.classList.add(\"highlightArea\");\n    }\n  }\n\n  _editOnDoubleClick() {\n    if (!this._isEditable) {\n      return;\n    }\n    const {\n      annotationEditorType: mode,\n      data: { id: editId },\n    } = this;\n    this.container.addEventListener(\"dblclick\", () => {\n      this.linkService.eventBus?.dispatch(\"switchannotationeditormode\", {\n        source: this,\n        mode,\n        editId,\n        mustEnterInEditMode: true,\n      });\n    });\n  }\n\n  updateOC(optionalContentConfig) {\n    if (!this.data.oc || !optionalContentConfig) {\n      return;\n    }\n    const isVisible = optionalContentConfig.isVisible(this.data.oc);\n    if (isVisible) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  get width() {\n    return this.data.rect[2] - this.data.rect[0];\n  }\n\n  get height() {\n    return this.data.rect[3] - this.data.rect[1];\n  }\n\n  _setBackgroundColor(element) {\n    const color = this.data.backgroundColor || null;\n    element.style.backgroundColor =\n      color === null ? \"transparent\" : Util.makeHexColor(...color);\n  }\n}\n\nclass EditorAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n    this.editor = parameters.editor;\n  }\n\n  render() {\n    this.container.className = \"editorAnnotation\";\n    return this.container;\n  }\n\n  createOrUpdatePopup() {\n    const { editor } = this;\n    if (!editor.hasComment) {\n      return;\n    }\n    this._createPopup(editor.comment);\n  }\n\n  get hasCommentButton() {\n    return this.enableComment && this.editor.hasComment;\n  }\n\n  get commentButtonPosition() {\n    return this.editor.commentButtonPositionInPage;\n  }\n\n  get commentText() {\n    return this.editor.comment.text;\n  }\n\n  set commentText(text) {\n    this.editor.comment = text;\n    if (!text) {\n      this.removePopup();\n    }\n  }\n\n  get commentData() {\n    return this.editor.getData();\n  }\n\n  remove() {\n    this.parent.removeAnnotation(this.data.id);\n    this.container.remove();\n    this.container = null;\n    this.removePopup();\n  }\n}\n\nclass LinkAnnotationElement extends AnnotationElement {\n  constructor(parameters, options = null) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: !!options?.ignoreBorder,\n      createQuadrilaterals: true,\n    });\n    this.isTooltipOnly = parameters.data.isTooltipOnly;\n  }\n\n  render() {\n    const { data, linkService } = this;\n    const link = document.createElement(\"a\");\n    link.setAttribute(\"data-element-id\", data.id);\n    let isBound = false;\n\n    if (data.url) {\n      linkService.addLinkAttributes(link, data.url, data.newWindow);\n      isBound = true;\n    } else if (data.action) {\n      this._bindNamedAction(link, data.action, data.overlaidText);\n      isBound = true;\n    } else if (data.attachment) {\n      this.#bindAttachment(\n        link,\n        data.attachmentId,\n        data.attachment,\n        data.overlaidText,\n        data.attachmentDest\n      );\n      isBound = true;\n    } else if (data.setOCGState) {\n      this.#bindSetOCGState(link, data.setOCGState, data.overlaidText);\n      isBound = true;\n    } else if (data.dest) {\n      this._bindLink(link, data.dest, data.overlaidText);\n      isBound = true;\n    } else {\n      if (\n        data.actions &&\n        (data.actions.Action ||\n          data.actions[\"Mouse Up\"] ||\n          data.actions[\"Mouse Down\"]) &&\n        this.enableScripting &&\n        this.hasJSActions\n      ) {\n        this._bindJSAction(link, data);\n        isBound = true;\n      }\n\n      if (data.resetForm) {\n        this._bindResetFormAction(link, data.resetForm);\n        isBound = true;\n      } else if (this.isTooltipOnly && !isBound) {\n        this._bindLink(link, \"\");\n        isBound = true;\n      }\n    }\n\n    this.container.classList.add(\"linkAnnotation\");\n    if (isBound) {\n      this.contentElement = link;\n      this.container.append(link);\n    }\n\n    return this.container;\n  }\n\n  #setInternalLink() {\n    this.container.setAttribute(\"data-internal-link\", \"\");\n  }\n\n  /**\n   * Bind internal links to the link element.\n   *\n   * @private\n   * @param {Object} link\n   * @param {Object} destination\n   * @param {string} [overlaidText]\n   * @memberof LinkAnnotationElement\n   */\n  _bindLink(link, destination, overlaidText = \"\") {\n    link.href = this.linkService.getDestinationHash(destination);\n    link.onclick = () => {\n      if (destination) {\n        this.linkService.goToDestination(destination);\n      }\n      return false;\n    };\n    if (destination || destination === /* isTooltipOnly = */ \"\") {\n      this.#setInternalLink();\n    }\n    if (overlaidText) {\n      link.title = overlaidText;\n    }\n  }\n\n  /**\n   * Bind named actions to the link element.\n   *\n   * @private\n   * @param {Object} link\n   * @param {Object} action\n   * @param {string} [overlaidText]\n   * @memberof LinkAnnotationElement\n   */\n  _bindNamedAction(link, action, overlaidText = \"\") {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    link.onclick = () => {\n      this.linkService.executeNamedAction(action);\n      return false;\n    };\n    if (overlaidText) {\n      link.title = overlaidText;\n    }\n    this.#setInternalLink();\n  }\n\n  /**\n   * Bind attachments to the link element.\n   * @param {Object} link\n   * @param {string} attachmentId\n   * @param {CatalogAttachment} attachment\n   * @param {string} [overlaidText]\n   * @param {string} [dest]\n   */\n  #bindAttachment(\n    link,\n    attachmentId,\n    attachment,\n    overlaidText = \"\",\n    dest = null\n  ) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    if (attachment.description) {\n      link.title = attachment.description;\n    } else if (overlaidText) {\n      link.title = overlaidText;\n    }\n\n    const openAttachment = async () => {\n      /** @type {CatalogAttachmentContent} */\n      const content = await this.linkService.getAttachmentContent(attachmentId);\n\n      if (content) {\n        this.downloadManager?.openOrDownloadData(\n          content,\n          attachment.filename,\n          dest\n        );\n      }\n    };\n\n    link.onclick = () => {\n      openAttachment();\n      return false;\n    };\n    this.#setInternalLink();\n  }\n\n  /**\n   * Bind SetOCGState actions to the link element.\n   * @param {Object} link\n   * @param {Object} action\n   * @param {string} [overlaidText]\n   */\n  #bindSetOCGState(link, action, overlaidText = \"\") {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    link.onclick = () => {\n      this.linkService.executeSetOCGState(action);\n      return false;\n    };\n    if (overlaidText) {\n      link.title = overlaidText;\n    }\n    this.#setInternalLink();\n  }\n\n  /**\n   * Bind JS actions to the link element.\n   *\n   * @private\n   * @param {Object} link\n   * @param {Object} data\n   * @memberof LinkAnnotationElement\n   */\n  _bindJSAction(link, data) {\n    link.href = this.linkService.getAnchorUrl(\"\");\n    const map = new Map([\n      [\"Action\", \"onclick\"],\n      [\"Mouse Up\", \"onmouseup\"],\n      [\"Mouse Down\", \"onmousedown\"],\n    ]);\n    for (const name of Object.keys(data.actions)) {\n      const jsName = map.get(name);\n      if (!jsName) {\n        continue;\n      }\n      link[jsName] = () => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: data.id,\n            name,\n          },\n        });\n        return false;\n      };\n    }\n    if (data.overlaidText) {\n      link.title = data.overlaidText;\n    }\n\n    if (!link.onclick) {\n      link.onclick = () => false;\n    }\n    this.#setInternalLink();\n  }\n\n  _bindResetFormAction(link, resetForm) {\n    const otherClickAction = link.onclick;\n    if (!otherClickAction) {\n      link.href = this.linkService.getAnchorUrl(\"\");\n    }\n    this.#setInternalLink();\n\n    if (!this._fieldObjects) {\n      warn(\n        `_bindResetFormAction - \"resetForm\" action not supported, ` +\n          \"ensure that the `fieldObjects` parameter is provided.\"\n      );\n      if (!otherClickAction) {\n        link.onclick = () => false;\n      }\n      return;\n    }\n\n    link.onclick = () => {\n      otherClickAction?.();\n\n      const {\n        fields: resetFormFields,\n        refs: resetFormRefs,\n        include,\n      } = resetForm;\n\n      const allFields = [];\n      if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) {\n        const fieldIds = new Set(resetFormRefs);\n        for (const fieldName of resetFormFields) {\n          const fields = this._fieldObjects[fieldName] || [];\n          for (const { id } of fields) {\n            fieldIds.add(id);\n          }\n        }\n        for (const fields of Object.values(this._fieldObjects)) {\n          for (const field of fields) {\n            if (fieldIds.has(field.id) === include) {\n              allFields.push(field);\n            }\n          }\n        }\n      } else {\n        for (const fields of Object.values(this._fieldObjects)) {\n          allFields.push(...fields);\n        }\n      }\n\n      const storage = this.annotationStorage;\n      const allIds = [];\n      for (const field of allFields) {\n        const { id } = field;\n        allIds.push(id);\n        switch (field.type) {\n          case \"text\": {\n            const value = field.defaultValue || \"\";\n            storage.setValue(id, { value });\n            break;\n          }\n          case \"checkbox\":\n          case \"radiobutton\": {\n            const value = field.defaultValue === field.exportValues;\n            storage.setValue(id, { value });\n            break;\n          }\n          case \"combobox\":\n          case \"listbox\": {\n            const value = field.defaultValue || \"\";\n            storage.setValue(id, { value });\n            break;\n          }\n          default:\n            continue;\n        }\n\n        const domElement = document.querySelector(`[data-element-id=\"${id}\"]`);\n        if (!domElement) {\n          continue;\n        } else if (!GetElementsByNameSet.has(domElement)) {\n          warn(`_bindResetFormAction - element not allowed: ${id}`);\n          continue;\n        }\n        domElement.dispatchEvent(new Event(\"resetform\"));\n      }\n\n      if (this.enableScripting) {\n        // Update the values in the sandbox.\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: \"app\",\n            ids: allIds,\n            name: \"ResetForm\",\n          },\n        });\n      }\n\n      return false;\n    };\n  }\n}\n\nclass TextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true });\n  }\n\n  render() {\n    this.container.classList.add(\"textAnnotation\");\n\n    const image = document.createElement(\"img\");\n    image.src =\n      this.imageResourcesPath +\n      \"annotation-\" +\n      this.data.name.toLowerCase() +\n      \".svg\";\n    image.setAttribute(\"data-l10n-id\", \"pdfjs-text-annotation-type\");\n    image.setAttribute(\n      \"data-l10n-args\",\n      JSON.stringify({ type: this.data.name })\n    );\n\n    if (!this.data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    this.container.append(image);\n    return this.container;\n  }\n}\n\nclass WidgetAnnotationElement extends AnnotationElement {\n  render() {\n    // Show only the container for unsupported field types.\n    return this.container;\n  }\n\n  _getKeyModifier(event) {\n    return FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey;\n  }\n\n  _setEventListener(element, elementData, baseName, eventName, valueGetter) {\n    if (baseName.includes(\"mouse\")) {\n      // Mouse events\n      element.addEventListener(baseName, event => {\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: this.data.id,\n            name: eventName,\n            value: valueGetter(event),\n            shift: event.shiftKey,\n            modifier: this._getKeyModifier(event),\n          },\n        });\n      });\n    } else {\n      // Non-mouse events\n      element.addEventListener(baseName, event => {\n        if (baseName === \"blur\") {\n          if (!elementData.focused || !event.relatedTarget) {\n            return;\n          }\n          elementData.focused = false;\n        } else if (baseName === \"focus\") {\n          if (elementData.focused) {\n            return;\n          }\n          elementData.focused = true;\n        }\n\n        if (!valueGetter) {\n          return;\n        }\n\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id: this.data.id,\n            name: eventName,\n            value: valueGetter(event),\n          },\n        });\n      });\n    }\n  }\n\n  _setEventListeners(element, elementData, names, getter) {\n    for (const [baseName, eventName] of names) {\n      if (eventName === \"Action\" || this.data.actions?.[eventName]) {\n        if (eventName === \"Focus\" || eventName === \"Blur\") {\n          elementData ||= { focused: false };\n        }\n        this._setEventListener(\n          element,\n          elementData,\n          baseName,\n          eventName,\n          getter\n        );\n        if (eventName === \"Focus\" && !this.data.actions?.Blur) {\n          // Ensure that elementData will have the correct value.\n          this._setEventListener(element, elementData, \"blur\", \"Blur\", null);\n        } else if (eventName === \"Blur\" && !this.data.actions?.Focus) {\n          this._setEventListener(element, elementData, \"focus\", \"Focus\", null);\n        }\n      }\n    }\n  }\n\n  /**\n   * Apply text styles to the text in the element.\n   *\n   * @private\n   * @param {HTMLDivElement} element\n   * @memberof TextWidgetAnnotationElement\n   */\n  _setTextStyle(element) {\n    const TEXT_ALIGNMENT = [\"left\", \"center\", \"right\"];\n    const { fontColor } = this.data.defaultAppearanceData;\n    const fontSize =\n      this.data.defaultAppearanceData.fontSize || DEFAULT_FONT_SIZE;\n\n    const style = element.style;\n\n    // TODO: If the font-size is zero, calculate it based on the height and\n    //       width of the element.\n    // Not setting `style.fontSize` will use the default font-size for now.\n\n    // We don't use the font, as specified in the PDF document, for the <input>\n    // element. Hence using the original `fontSize` could look bad, which is why\n    // it's instead based on the field height.\n    // If the height is \"big\" then it could lead to a too big font size\n    // so in this case use the one we've in the pdf (hence the min).\n    let computedFontSize;\n    const BORDER_SIZE = 2;\n    const roundToOneDecimal = x => Math.round(10 * x) / 10;\n    if (this.data.multiLine) {\n      const height = Math.abs(\n        this.data.rect[3] - this.data.rect[1] - BORDER_SIZE\n      );\n      const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1;\n      const lineHeight = height / numberOfLines;\n      computedFontSize = Math.min(\n        fontSize,\n        roundToOneDecimal(lineHeight / LINE_FACTOR)\n      );\n    } else {\n      const height = Math.abs(\n        this.data.rect[3] - this.data.rect[1] - BORDER_SIZE\n      );\n      computedFontSize = Math.min(\n        fontSize,\n        roundToOneDecimal(height / LINE_FACTOR)\n      );\n    }\n    style.fontSize = `calc(${computedFontSize}px * var(--total-scale-factor))`;\n\n    style.color = Util.makeHexColor(...fontColor);\n\n    if (this.data.textAlignment !== null && !this.data.comb) {\n      style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];\n    }\n  }\n\n  _setRequired(element, isRequired) {\n    if (isRequired) {\n      element.setAttribute(\"required\", true);\n    } else {\n      element.removeAttribute(\"required\");\n    }\n    element.setAttribute(\"aria-required\", isRequired);\n  }\n}\n\nclass TextWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    const isRenderable =\n      parameters.renderForms ||\n      parameters.data.hasOwnCanvas ||\n      (!parameters.data.hasAppearance && !!parameters.data.fieldValue);\n    super(parameters, { isRenderable });\n  }\n\n  setPropertyOnSiblings(base, key, value, keyInStorage) {\n    const storage = this.annotationStorage;\n    for (const element of this._getElementsByName(\n      base.name,\n      /* skipId = */ base.id\n    )) {\n      if (element.domElement) {\n        element.domElement[key] = value;\n      }\n      storage.setValue(element.id, { [keyInStorage]: value });\n    }\n  }\n\n  render() {\n    const storage = this.annotationStorage;\n    const id = this.data.id;\n\n    this.container.classList.add(\"textWidgetAnnotation\");\n\n    let element = null;\n    if (this.renderForms) {\n      // NOTE: We cannot set the values using `element.value` below, since it\n      //       prevents the AnnotationLayer rasterizer in `test/driver.js`\n      //       from parsing the elements correctly for the reference tests.\n      const storedData = storage.getValue(id, {\n        value: this.data.fieldValue,\n      });\n      let textContent = storedData.value || \"\";\n      const maxLen = storage.getValue(id, {\n        charLimit: this.data.maxLen,\n      }).charLimit;\n      if (maxLen && textContent.length > maxLen) {\n        textContent = textContent.slice(0, maxLen);\n      }\n\n      let fieldFormattedValues =\n        storedData.formattedValue || this.data.textContent?.join(\"\\n\") || null;\n      if (fieldFormattedValues && this.data.comb) {\n        fieldFormattedValues = fieldFormattedValues.replaceAll(/\\s+/g, \"\");\n      }\n\n      const elementData = {\n        userValue: textContent,\n        formattedValue: fieldFormattedValues,\n        lastCommittedValue: null,\n        commitKey: 1,\n        focused: false,\n      };\n\n      if (this.data.multiLine) {\n        element = document.createElement(\"textarea\");\n        element.textContent = fieldFormattedValues ?? textContent;\n        if (this.data.doNotScroll) {\n          element.style.overflowY = \"hidden\";\n        }\n      } else {\n        element = document.createElement(\"input\");\n        element.type = this.data.password ? \"password\" : \"text\";\n        element.setAttribute(\"value\", fieldFormattedValues ?? textContent);\n        if (this.data.doNotScroll) {\n          element.style.overflowX = \"hidden\";\n        }\n      }\n      if (this.data.hasOwnCanvas) {\n        // The rendered appearance (a canvas) is shown instead of this element.\n        this.container.classList.add(\"hasOwnCanvas\");\n        if (storage.has(id)) {\n          // Once the field is modified, the `sandboxModified` class hides the\n          // (now outdated) canvas and shows this element instead.\n          // The field can already have been modified.\n          this.container.classList.add(\"sandboxModified\");\n        }\n      }\n      GetElementsByNameSet.add(element);\n      this.contentElement = element;\n      element.setAttribute(\"data-element-id\", id);\n\n      element.disabled = this.data.readOnly;\n      element.name = this.data.fieldName;\n      element.tabIndex = 0;\n      const { datetimeFormat, datetimeType, timeStep } = this.data;\n      const hasDateOrTime = !!datetimeType && this.enableScripting;\n      if (datetimeFormat) {\n        element.title = datetimeFormat;\n      }\n\n      this._setRequired(element, this.data.required);\n\n      if (maxLen) {\n        element.maxLength = maxLen;\n      }\n\n      element.addEventListener(\"input\", event => {\n        storage.setValue(id, { value: event.target.value });\n        this.setPropertyOnSiblings(\n          element,\n          \"value\",\n          event.target.value,\n          \"value\"\n        );\n        elementData.formattedValue = null;\n      });\n\n      element.addEventListener(\"resetform\", event => {\n        const defaultValue = this.data.defaultFieldValue ?? \"\";\n        element.value = elementData.userValue = defaultValue;\n        elementData.formattedValue = null;\n      });\n\n      let blurListener = event => {\n        const { formattedValue } = elementData;\n        if (formattedValue !== null && formattedValue !== undefined) {\n          event.target.value = formattedValue;\n        }\n        // Reset the cursor position to the start of the field (issue 12359).\n        event.target.scrollLeft = 0;\n      };\n\n      if (this.enableScripting && this.hasJSActions) {\n        element.addEventListener(\"focus\", event => {\n          if (elementData.focused) {\n            return;\n          }\n          const { target } = event;\n          if (hasDateOrTime) {\n            target.type = datetimeType;\n            if (timeStep) {\n              target.step = timeStep;\n            }\n          }\n\n          if (elementData.userValue) {\n            const value = elementData.userValue;\n            if (hasDateOrTime) {\n              if (datetimeType === \"time\") {\n                const date = new Date(value);\n                const parts = [\n                  date.getHours(),\n                  date.getMinutes(),\n                  date.getSeconds(),\n                ];\n                target.value = parts\n                  .map(v => v.toString().padStart(2, \"0\"))\n                  .join(\":\");\n              } else {\n                target.value = new Date(value - TIMEZONE_OFFSET)\n                  .toISOString()\n                  .split(datetimeType === \"date\" ? \"T\" : \".\", 1)[0];\n              }\n            } else {\n              target.value = value;\n            }\n          }\n          elementData.lastCommittedValue = target.value;\n          elementData.commitKey = 1;\n          if (!this.data.actions?.Focus) {\n            elementData.focused = true;\n          }\n        });\n\n        element.addEventListener(\"updatefromsandbox\", jsEvent => {\n          this.container.classList.add(\"sandboxModified\");\n          const actions = {\n            value(event) {\n              elementData.userValue = event.detail.value ?? \"\";\n              if (!hasDateOrTime) {\n                storage.setValue(id, {\n                  value: elementData.userValue.toString(),\n                });\n              }\n              event.target.value = elementData.userValue;\n            },\n            formattedValue(event) {\n              const { formattedValue } = event.detail;\n              elementData.formattedValue = formattedValue;\n              if (\n                formattedValue !== null &&\n                formattedValue !== undefined &&\n                event.target !== document.activeElement\n              ) {\n                // Input hasn't the focus so display formatted string\n                event.target.value = formattedValue;\n              }\n              const data = {\n                formattedValue,\n              };\n              if (hasDateOrTime) {\n                // If the field is a date or time, we store the formatted value\n                // in the `value` property, so that it can be used by the\n                // `Keystroke` action.\n                data.value = formattedValue;\n              }\n              storage.setValue(id, data);\n            },\n            selRange(event) {\n              event.target.setSelectionRange(...event.detail.selRange);\n            },\n            charLimit: event => {\n              const { charLimit } = event.detail;\n              const { target } = event;\n              if (charLimit === 0) {\n                target.removeAttribute(\"maxLength\");\n                return;\n              }\n\n              target.setAttribute(\"maxLength\", charLimit);\n              let value = elementData.userValue;\n              if (!value || value.length <= charLimit) {\n                return;\n              }\n              value = value.slice(0, charLimit);\n              target.value = elementData.userValue = value;\n              storage.setValue(id, { value });\n\n              this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n                source: this,\n                detail: {\n                  id,\n                  name: \"Keystroke\",\n                  value,\n                  willCommit: true,\n                  commitKey: 1,\n                  selStart: target.selectionStart,\n                  selEnd: target.selectionEnd,\n                },\n              });\n            },\n          };\n          this._dispatchEventFromSandbox(actions, jsEvent);\n        });\n\n        // Even if the field hasn't any actions\n        // leaving it can still trigger some actions with Calculate\n        element.addEventListener(\"keydown\", event => {\n          elementData.commitKey = 1;\n          // If the key is one of Escape, Enter then the data are committed.\n          // If we've a Tab then data will be committed on blur.\n          let commitKey = -1;\n          if (event.key === \"Escape\") {\n            commitKey = 0;\n          } else if (event.key === \"Enter\" && !this.data.multiLine) {\n            // When we've a multiline field, \"Enter\" key is a key as the other\n            // hence we don't commit the data (Acrobat behaves the same way)\n            // (see issue #15627).\n            commitKey = 2;\n          } else if (event.key === \"Tab\") {\n            elementData.commitKey = 3;\n          }\n          if (commitKey === -1) {\n            return;\n          }\n          const { value } = event.target;\n          if (elementData.lastCommittedValue === value) {\n            return;\n          }\n          elementData.lastCommittedValue = value;\n          // Save the entered value\n          elementData.userValue = value;\n          this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n            source: this,\n            detail: {\n              id,\n              name: \"Keystroke\",\n              value,\n              willCommit: true,\n              commitKey,\n              selStart: event.target.selectionStart,\n              selEnd: event.target.selectionEnd,\n            },\n          });\n        });\n        const _blurListener = blurListener;\n        blurListener = null;\n        element.addEventListener(\"blur\", event => {\n          if (!elementData.focused || !event.relatedTarget) {\n            return;\n          }\n          if (!this.data.actions?.Blur) {\n            elementData.focused = false;\n          }\n          const { target } = event;\n          let { value } = target;\n          if (hasDateOrTime) {\n            if (value && datetimeType === \"time\") {\n              const parts = value.split(\":\").map(v => parseInt(v, 10));\n              value = new Date(\n                2000,\n                0,\n                1,\n                parts[0],\n                parts[1],\n                parts[2] || 0\n              ).valueOf();\n              target.step = \"\";\n            } else {\n              // Unfortunately, when the date is \"2025-09-23\", the parser\n              // converts it to UTC time which may lead to the date being off by\n              // one day depending on the timezone. To workaround this, we\n              // append \"T00:00\" to the date so that it's parsed as local\n              // time (bug 1989874).\n              if (!value.includes(\"T\")) {\n                value = `${value}T00:00`;\n              }\n              value = new Date(value).valueOf();\n            }\n            target.type = \"text\";\n          }\n          elementData.userValue = value;\n          if (elementData.lastCommittedValue !== value) {\n            this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n              source: this,\n              detail: {\n                id,\n                name: \"Keystroke\",\n                value,\n                willCommit: true,\n                commitKey: elementData.commitKey,\n                selStart: event.target.selectionStart,\n                selEnd: event.target.selectionEnd,\n              },\n            });\n          }\n          _blurListener(event);\n        });\n\n        if (this.data.actions?.Keystroke) {\n          element.addEventListener(\"beforeinput\", event => {\n            elementData.lastCommittedValue = null;\n            const { data, target } = event;\n            const { value, selectionStart, selectionEnd } = target;\n\n            let selStart = selectionStart,\n              selEnd = selectionEnd;\n\n            switch (event.inputType) {\n              // https://rawgit.com/w3c/input-events/v1/index.html#interface-InputEvent-Attributes\n              case \"deleteWordBackward\": {\n                const match = value\n                  .substring(0, selectionStart)\n                  .match(/\\w*\\W*$/);\n                if (match) {\n                  selStart -= match[0].length;\n                }\n                break;\n              }\n              case \"deleteWordForward\": {\n                const match = value.substring(selectionStart).match(/^\\W*\\w*/);\n                if (match) {\n                  selEnd += match[0].length;\n                }\n                break;\n              }\n              case \"deleteContentBackward\":\n                if (selectionStart === selectionEnd) {\n                  selStart -= 1;\n                }\n                break;\n              case \"deleteContentForward\":\n                if (selectionStart === selectionEnd) {\n                  selEnd += 1;\n                }\n                break;\n            }\n\n            // We handle the event ourselves.\n            event.preventDefault();\n            this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n              source: this,\n              detail: {\n                id,\n                name: \"Keystroke\",\n                value,\n                change: data || \"\",\n                willCommit: false,\n                selStart,\n                selEnd,\n              },\n            });\n          });\n        }\n\n        this._setEventListeners(\n          element,\n          elementData,\n          [\n            [\"focus\", \"Focus\"],\n            [\"blur\", \"Blur\"],\n            [\"mousedown\", \"Mouse Down\"],\n            [\"mouseenter\", \"Mouse Enter\"],\n            [\"mouseleave\", \"Mouse Exit\"],\n            [\"mouseup\", \"Mouse Up\"],\n          ],\n          event => event.target.value\n        );\n      }\n\n      if (blurListener) {\n        element.addEventListener(\"blur\", blurListener);\n      }\n\n      if (this.data.comb) {\n        const fieldWidth = this.data.rect[2] - this.data.rect[0];\n        const combWidth = fieldWidth / maxLen;\n\n        element.classList.add(\"comb\");\n        element.style.setProperty(\n          \"--comb-width\",\n          `calc(${combWidth}px * var(--total-scale-factor))`\n        );\n\n        const alignment = this.data.textAlignment;\n        if (alignment === 1 || alignment === 2) {\n          const setCombOffset = () => {\n            const free = maxLen - element.value.length;\n            element.style.setProperty(\n              \"--comb-offset\",\n              `${alignment === 1 ? free >> 1 : free}`\n            );\n          };\n          setCombOffset();\n          for (const evt of [\n            \"input\",\n            \"blur\",\n            \"resetform\",\n            \"updatefromsandbox\",\n          ]) {\n            element.addEventListener(evt, setCombOffset);\n          }\n        }\n      }\n    } else {\n      element = document.createElement(\"div\");\n      element.textContent = this.data.fieldValue;\n      element.style.verticalAlign = \"middle\";\n      element.style.display = \"table-cell\";\n\n      if (this.data.hasOwnCanvas) {\n        element.hidden = true;\n      }\n    }\n\n    this._setTextStyle(element);\n    this._setBackgroundColor(element);\n    this._setDefaultPropertiesFromJS(element);\n\n    this.container.append(element);\n    return this.container;\n  }\n}\n\nclass SignatureWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: !!parameters.data.hasOwnCanvas });\n  }\n}\n\nclass CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: parameters.renderForms });\n  }\n\n  render() {\n    const storage = this.annotationStorage;\n    const data = this.data;\n    const id = data.id;\n    let value = storage.getValue(id, {\n      value: data.exportValue === data.fieldValue,\n    }).value;\n    if (typeof value === \"string\") {\n      // The value has been changed through js and set in annotationStorage.\n      value = value !== \"Off\";\n      storage.setValue(id, { value });\n    }\n\n    this.container.classList.add(\"buttonWidgetAnnotation\", \"checkBox\");\n\n    const element = document.createElement(\"input\");\n    GetElementsByNameSet.add(element);\n    element.setAttribute(\"data-element-id\", id);\n\n    element.disabled = data.readOnly;\n    this._setRequired(element, this.data.required);\n    element.type = \"checkbox\";\n    element.name = data.fieldName;\n    if (value) {\n      element.setAttribute(\"checked\", true);\n    }\n    element.setAttribute(\"exportValue\", data.exportValue);\n    element.tabIndex = 0;\n\n    element.addEventListener(\"change\", event => {\n      const { name, checked } = event.target;\n      for (const checkbox of this._getElementsByName(name, /* skipId = */ id)) {\n        const curChecked = checked && checkbox.exportValue === data.exportValue;\n        if (checkbox.domElement) {\n          checkbox.domElement.checked = curChecked;\n        }\n        storage.setValue(checkbox.id, { value: curChecked });\n      }\n      storage.setValue(id, { value: checked });\n    });\n\n    element.addEventListener(\"resetform\", event => {\n      const defaultValue = data.defaultFieldValue || \"Off\";\n      event.target.checked = defaultValue === data.exportValue;\n    });\n\n    if (this.enableScripting && this.hasJSActions) {\n      element.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value(event) {\n            event.target.checked = event.detail.value !== \"Off\";\n            storage.setValue(id, { value: event.target.checked });\n          },\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n\n      this._setEventListeners(\n        element,\n        null,\n        [\n          [\"change\", \"Validate\"],\n          [\"change\", \"Action\"],\n          [\"focus\", \"Focus\"],\n          [\"blur\", \"Blur\"],\n          [\"mousedown\", \"Mouse Down\"],\n          [\"mouseenter\", \"Mouse Enter\"],\n          [\"mouseleave\", \"Mouse Exit\"],\n          [\"mouseup\", \"Mouse Up\"],\n        ],\n        event => event.target.checked\n      );\n    }\n\n    this._setDefaultPropertiesFromJS(element);\n\n    this.container.append(element);\n    return this.container;\n  }\n}\n\nclass RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: parameters.renderForms });\n  }\n\n  render() {\n    this.container.classList.add(\"buttonWidgetAnnotation\", \"radioButton\");\n    const storage = this.annotationStorage;\n    const data = this.data;\n    const id = data.id;\n    let value = storage.getValue(id, {\n      // A radio without an on-state (`buttonValue === null`, e.g. no /AP) must\n      // not be checked by default, otherwise `null === null` would select it.\n      value: data.buttonValue !== null && data.fieldValue === data.buttonValue,\n    }).value;\n    if (typeof value === \"string\") {\n      // The value has been changed through js and set in annotationStorage.\n      value = value !== data.buttonValue;\n      storage.setValue(id, { value });\n    }\n\n    if (value) {\n      // It's possible that multiple radio buttons are checked.\n      // So if this one is checked we just reset the other ones.\n      // (see bug 1864136). Then when the other ones will be rendered they will\n      // unchecked (because of their value in the storage).\n      // Consequently, the first checked radio button will be the only checked\n      // one.\n      for (const radio of this._getElementsByName(\n        data.fieldName,\n        /* skipId = */ id\n      )) {\n        storage.setValue(radio.id, { value: false });\n      }\n    }\n\n    const element = document.createElement(\"input\");\n    GetElementsByNameSet.add(element);\n    element.setAttribute(\"data-element-id\", id);\n\n    element.disabled = data.readOnly;\n    this._setRequired(element, this.data.required);\n    element.type = \"radio\";\n    element.name = data.fieldName;\n    if (value) {\n      element.setAttribute(\"checked\", true);\n    }\n    element.tabIndex = 0;\n\n    element.addEventListener(\"change\", event => {\n      const { name, checked } = event.target;\n      for (const radio of this._getElementsByName(name, /* skipId = */ id)) {\n        storage.setValue(radio.id, { value: false });\n      }\n      storage.setValue(id, { value: checked });\n    });\n\n    element.addEventListener(\"resetform\", event => {\n      const defaultValue = data.defaultFieldValue;\n      event.target.checked =\n        defaultValue !== null &&\n        defaultValue !== undefined &&\n        defaultValue === data.buttonValue;\n    });\n\n    if (this.enableScripting && this.hasJSActions) {\n      const pdfButtonValue = data.buttonValue;\n      element.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value: event => {\n            const checked = pdfButtonValue === event.detail.value;\n            for (const radio of this._getElementsByName(event.target.name)) {\n              const curChecked = checked && radio.id === id;\n              if (radio.domElement) {\n                radio.domElement.checked = curChecked;\n              }\n              storage.setValue(radio.id, { value: curChecked });\n            }\n          },\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n\n      this._setEventListeners(\n        element,\n        null,\n        [\n          [\"change\", \"Validate\"],\n          [\"change\", \"Action\"],\n          [\"focus\", \"Focus\"],\n          [\"blur\", \"Blur\"],\n          [\"mousedown\", \"Mouse Down\"],\n          [\"mouseenter\", \"Mouse Enter\"],\n          [\"mouseleave\", \"Mouse Exit\"],\n          [\"mouseup\", \"Mouse Up\"],\n        ],\n        event => event.target.checked\n      );\n    }\n\n    this._setDefaultPropertiesFromJS(element);\n\n    this.container.append(element);\n    return this.container;\n  }\n}\n\nclass PushButtonWidgetAnnotationElement extends LinkAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { ignoreBorder: parameters.data.hasAppearance });\n  }\n\n  render() {\n    // The rendering and functionality of a push button widget annotation is\n    // equal to that of a link annotation, but may have more functionality, such\n    // as performing actions on form fields (resetting, submitting, et cetera).\n    const container = super.render();\n    container.classList.add(\"buttonWidgetAnnotation\", \"pushButton\");\n\n    const linkElement = container.lastChild;\n    if (this.enableScripting && this.hasJSActions && linkElement) {\n      this._setDefaultPropertiesFromJS(linkElement);\n\n      linkElement.addEventListener(\"updatefromsandbox\", jsEvent => {\n        this._dispatchEventFromSandbox({}, jsEvent);\n      });\n    }\n\n    return container;\n  }\n}\n\nclass ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: parameters.renderForms });\n  }\n\n  render() {\n    this.container.classList.add(\"choiceWidgetAnnotation\");\n    const storage = this.annotationStorage;\n    const id = this.data.id;\n\n    const storedData = storage.getValue(id, {\n      value: this.data.fieldValue,\n    });\n\n    const selectElement = document.createElement(\"select\");\n    GetElementsByNameSet.add(selectElement);\n    selectElement.setAttribute(\"data-element-id\", id);\n\n    selectElement.disabled = this.data.readOnly;\n    this._setRequired(selectElement, this.data.required);\n    selectElement.name = this.data.fieldName;\n    selectElement.tabIndex = 0;\n\n    let addAnEmptyEntry = this.data.combo && this.data.options.length > 0;\n\n    if (!this.data.combo) {\n      // List boxes have a size and (optionally) multiple selection.\n      selectElement.size = this.data.options.length;\n      if (this.data.multiSelect) {\n        selectElement.multiple = true;\n      }\n    }\n\n    selectElement.addEventListener(\"resetform\", event => {\n      const defaultValue = this.data.defaultFieldValue;\n      for (const option of selectElement.options) {\n        option.selected = option.value === defaultValue;\n      }\n    });\n\n    const fixDisplayValue = (option, value) => {\n      const newValue = value.replaceAll(\" \", \"\\u00A0\");\n      option.textContent = newValue;\n      if (newValue !== value) {\n        option.setAttribute(\"display-value\", value);\n      }\n    };\n\n    // Insert the options into the choice field.\n    for (const option of this.data.options) {\n      const optionElement = document.createElement(\"option\");\n      fixDisplayValue(optionElement, option.displayValue);\n      optionElement.value = option.exportValue;\n      if (storedData.value.includes(option.exportValue)) {\n        optionElement.setAttribute(\"selected\", true);\n        addAnEmptyEntry = false;\n      }\n      selectElement.append(optionElement);\n    }\n\n    let removeEmptyEntry = null;\n    if (addAnEmptyEntry) {\n      const noneOptionElement = document.createElement(\"option\");\n      noneOptionElement.value = \" \";\n      noneOptionElement.setAttribute(\"hidden\", true);\n      noneOptionElement.setAttribute(\"selected\", true);\n      selectElement.prepend(noneOptionElement);\n\n      removeEmptyEntry = () => {\n        noneOptionElement.remove();\n        selectElement.removeEventListener(\"input\", removeEmptyEntry);\n        removeEmptyEntry = null;\n      };\n      selectElement.addEventListener(\"input\", removeEmptyEntry);\n    }\n\n    const getValue = isExport => {\n      const name = isExport ? \"value\" : \"textContent\";\n      const { options, multiple } = selectElement;\n      if (!multiple) {\n        return options.selectedIndex === -1\n          ? null\n          : options[options.selectedIndex][name];\n      }\n      return Array.prototype.filter\n        .call(options, option => option.selected)\n        .map(option => option[name]);\n    };\n\n    let selectedValues = getValue(/* isExport */ false);\n\n    const getItems = event => {\n      const options = event.target.options;\n      return Array.prototype.map.call(options, option => ({\n        displayValue:\n          option.getAttribute(\"display-value\") || option.textContent,\n        exportValue: option.value,\n      }));\n    };\n\n    if (this.enableScripting && this.hasJSActions) {\n      selectElement.addEventListener(\"updatefromsandbox\", jsEvent => {\n        const actions = {\n          value(event) {\n            removeEmptyEntry?.();\n            const value = event.detail.value;\n            const values = new Set(Array.isArray(value) ? value : [value]);\n            for (const option of selectElement.options) {\n              option.selected = values.has(option.value);\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          multipleSelection(event) {\n            selectElement.multiple = true;\n          },\n          remove(event) {\n            const options = selectElement.options;\n            const index = event.detail.remove;\n            options[index].selected = false;\n            selectElement.remove(index);\n            if (options.length > 0) {\n              const i = Array.prototype.findIndex.call(\n                options,\n                option => option.selected\n              );\n              if (i === -1) {\n                options[0].selected = true;\n              }\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n              items: getItems(event),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          clear(event) {\n            while (selectElement.length !== 0) {\n              selectElement.remove(0);\n            }\n            storage.setValue(id, { value: null, items: [] });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          insert(event) {\n            const { index, displayValue, exportValue } = event.detail.insert;\n            const selectChild = selectElement.children[index];\n            const optionElement = document.createElement(\"option\");\n            fixDisplayValue(optionElement, displayValue);\n            optionElement.value = exportValue;\n\n            if (selectChild) {\n              selectChild.before(optionElement);\n            } else {\n              selectElement.append(optionElement);\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n              items: getItems(event),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          items(event) {\n            const { items } = event.detail;\n            while (selectElement.length !== 0) {\n              selectElement.remove(0);\n            }\n            for (const item of items) {\n              const { displayValue, exportValue } = item;\n              const optionElement = document.createElement(\"option\");\n              fixDisplayValue(optionElement, displayValue);\n              optionElement.value = exportValue;\n              selectElement.append(optionElement);\n            }\n            if (selectElement.options.length > 0) {\n              selectElement.options[0].selected = true;\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n              items: getItems(event),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          indices(event) {\n            const indices = new Set(event.detail.indices);\n            for (const option of event.target.options) {\n              option.selected = indices.has(option.index);\n            }\n            storage.setValue(id, {\n              value: getValue(/* isExport */ true),\n            });\n            selectedValues = getValue(/* isExport */ false);\n          },\n          editable(event) {\n            event.target.disabled = !event.detail.editable;\n          },\n        };\n        this._dispatchEventFromSandbox(actions, jsEvent);\n      });\n\n      selectElement.addEventListener(\"input\", event => {\n        const exportValue = getValue(/* isExport */ true);\n        const change = getValue(/* isExport */ false);\n        storage.setValue(id, { value: exportValue });\n\n        event.preventDefault();\n\n        this.linkService.eventBus?.dispatch(\"dispatcheventinsandbox\", {\n          source: this,\n          detail: {\n            id,\n            name: \"Keystroke\",\n            value: selectedValues,\n            change,\n            changeEx: exportValue,\n            willCommit: false,\n            commitKey: 1,\n            keyDown: false,\n          },\n        });\n      });\n\n      this._setEventListeners(\n        selectElement,\n        null,\n        [\n          [\"focus\", \"Focus\"],\n          [\"blur\", \"Blur\"],\n          [\"mousedown\", \"Mouse Down\"],\n          [\"mouseenter\", \"Mouse Enter\"],\n          [\"mouseleave\", \"Mouse Exit\"],\n          [\"mouseup\", \"Mouse Up\"],\n          [\"input\", \"Action\"],\n          [\"input\", \"Validate\"],\n        ],\n        event => event.target.value\n      );\n    } else {\n      selectElement.addEventListener(\"input\", function (event) {\n        storage.setValue(id, { value: getValue(/* isExport */ true) });\n      });\n    }\n\n    if (this.data.combo) {\n      this._setTextStyle(selectElement);\n    } else {\n      // Just use the default font size...\n      // it's a bit hard to guess what is a good size.\n    }\n    this._setBackgroundColor(selectElement);\n    this._setDefaultPropertiesFromJS(selectElement);\n\n    this.container.append(selectElement);\n    return this.container;\n  }\n}\n\nclass PopupAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    const { data, elements, parent } = parameters;\n    const hasCommentManager = !!parent._commentManager;\n    super(parameters, {\n      isRenderable: !hasCommentManager && AnnotationElement._hasPopupData(data),\n    });\n    this.elements = elements;\n    if (hasCommentManager && AnnotationElement._hasPopupData(data)) {\n      const popup = (this.popup = this.#createPopup());\n      for (const element of elements) {\n        element.popup = popup;\n      }\n    } else {\n      this.popup = null;\n    }\n  }\n\n  #createPopup() {\n    return new PopupElement({\n      container: this.container,\n      color: this.data.color,\n      titleObj: this.data.titleObj,\n      modificationDate: this.data.modificationDate || this.data.creationDate,\n      contentsObj: this.data.contentsObj,\n      richText: this.data.richText,\n      rect: this.data.rect,\n      parentRect: this.data.parentRect || null,\n      parent: this.parent,\n      elements: this.elements,\n      open: this.data.open,\n      commentManager: this.parent._commentManager,\n    });\n  }\n\n  render() {\n    const { container } = this;\n    container.classList.add(\"popupAnnotation\");\n    container.role = \"comment\";\n\n    const popup = (this.popup = this.#createPopup());\n\n    const elementIds = [];\n    for (const element of this.elements) {\n      element.popup = popup;\n      element.container.ariaHasPopup = \"dialog\";\n      elementIds.push(element.data.id);\n      element.addHighlightArea();\n    }\n\n    this.container.setAttribute(\n      \"aria-controls\",\n      elementIds.map(id => `${AnnotationPrefix}${id}`).join(\",\")\n    );\n\n    return this.container;\n  }\n}\n\nclass PopupElement {\n  #commentManager = null;\n\n  #boundKeyDown = this.#keyDown.bind(this);\n\n  #boundHide = this.#hide.bind(this);\n\n  #boundShow = this.#show.bind(this);\n\n  #boundToggle = this.#toggle.bind(this);\n\n  #color = null;\n\n  #container = null;\n\n  #contentsObj = null;\n\n  #dateObj = null;\n\n  #elements = null;\n\n  #parent = null;\n\n  #parentRect = null;\n\n  #pinned = false;\n\n  #popup = null;\n\n  #popupAbortController = null;\n\n  #position = null;\n\n  #commentButton = null;\n\n  #commentButtonPosition = null;\n\n  #popupPosition = null;\n\n  #rect = null;\n\n  #richText = null;\n\n  #titleObj = null;\n\n  #updates = null;\n\n  #wasVisible = false;\n\n  #firstElement = null;\n\n  #commentText = null;\n\n  constructor({\n    container,\n    color,\n    elements,\n    titleObj,\n    modificationDate,\n    contentsObj,\n    richText,\n    parent,\n    rect,\n    parentRect,\n    open,\n    commentManager = null,\n  }) {\n    this.#container = container;\n    this.#titleObj = titleObj;\n    this.#contentsObj = contentsObj;\n    this.#richText = richText;\n    this.#parent = parent;\n    this.#color = color;\n    this.#rect = rect;\n    this.#parentRect = parentRect;\n    this.#elements = elements;\n    this.#commentManager = commentManager;\n    this.#firstElement = elements[0];\n\n    // The modification date is shown in the popup instead of the creation\n    // date if it is available and can be parsed correctly, which is\n    // consistent with other viewers such as Adobe Acrobat.\n    this.#dateObj = PDFDateString.toDateObject(modificationDate);\n\n    // The elements that will trigger the popup.\n    this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup());\n\n    if (!commentManager) {\n      this.#addEventListeners();\n\n      this.#container.hidden = true;\n      if (open) {\n        this.#toggle();\n      }\n\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n        // Since the popup is lazily created, we need to ensure that it'll be\n        // created and displayed during reference tests.\n        this.#parent.popupShow.push(async () => {\n          if (this.#container.hidden) {\n            this.#show();\n          }\n        });\n      }\n    }\n  }\n\n  #addEventListeners() {\n    if (this.#popupAbortController) {\n      return;\n    }\n    this.#popupAbortController = new AbortController();\n    const { signal } = this.#popupAbortController;\n\n    // Attach the event listeners to the trigger element.\n    for (const element of this.trigger) {\n      element.addEventListener(\"click\", this.#boundToggle, { signal });\n      element.addEventListener(\"pointerenter\", this.#boundShow, { signal });\n      element.addEventListener(\"pointerleave\", this.#boundHide, { signal });\n      element.classList.add(\"popupTriggerArea\");\n    }\n\n    // Attach the event listener to toggle the popup with the keyboard.\n    for (const element of this.#elements) {\n      element.container?.addEventListener(\"keydown\", this.#boundKeyDown, {\n        signal,\n      });\n    }\n  }\n\n  #setCommentButtonPosition() {\n    const element = this.#elements.find(e => e.hasCommentButton);\n    if (!element) {\n      return;\n    }\n    this.#commentButtonPosition = element._normalizePoint(\n      element.commentButtonPosition\n    );\n  }\n\n  renderCommentButton() {\n    if (this.#commentButton) {\n      if (!this.#commentButton.parentNode) {\n        this.#firstElement.container.after(this.#commentButton);\n      }\n      return;\n    }\n\n    if (!this.#commentButtonPosition) {\n      this.#setCommentButtonPosition();\n    }\n\n    if (!this.#commentButtonPosition) {\n      return;\n    }\n\n    const { signal } = (this.#popupAbortController = new AbortController());\n    const hasOwnButton = this.#firstElement.hasOwnCommentButton;\n    const togglePopup = () => {\n      this.#commentManager.toggleCommentPopup(\n        this,\n        /* isSelected = */ true,\n        /* visibility = */ undefined,\n        /* isEditable = */ !hasOwnButton\n      );\n    };\n    const showPopup = () => {\n      this.#commentManager.toggleCommentPopup(\n        this,\n        /* isSelected = */ false,\n        /* visibility = */ true,\n        /* isEditable = */ !hasOwnButton\n      );\n    };\n    const hidePopup = () => {\n      this.#commentManager.toggleCommentPopup(\n        this,\n        /* isSelected = */ false,\n        /* visibility = */ false\n      );\n    };\n\n    if (!hasOwnButton) {\n      const button = (this.#commentButton = document.createElement(\"button\"));\n      button.className = \"annotationCommentButton\";\n      const parentContainer = this.#firstElement.container;\n      button.style.zIndex = parseInt(parentContainer.style.zIndex, 10) + 1;\n      button.tabIndex = 0;\n      button.ariaHasPopup = \"dialog\";\n      button.ariaControls = \"commentPopup\";\n      button.setAttribute(\"data-l10n-id\", \"pdfjs-show-comment-button\");\n      this.#updateColor();\n      this.#updateCommentButtonPosition();\n      button.addEventListener(\"keydown\", this.#boundKeyDown, { signal });\n      button.addEventListener(\"click\", togglePopup, { signal });\n      button.addEventListener(\"pointerenter\", showPopup, { signal });\n      button.addEventListener(\"pointerleave\", hidePopup, { signal });\n      parentContainer.after(button);\n    } else {\n      this.#commentButton = this.#firstElement.container;\n      for (const element of this.trigger) {\n        element.ariaHasPopup = \"dialog\";\n        element.ariaControls = \"commentPopup\";\n        element.addEventListener(\"keydown\", this.#boundKeyDown, { signal });\n        element.addEventListener(\"click\", togglePopup, { signal });\n        element.addEventListener(\"pointerenter\", showPopup, { signal });\n        element.addEventListener(\"pointerleave\", hidePopup, { signal });\n        element.classList.add(\"popupTriggerArea\");\n      }\n    }\n  }\n\n  #updateCommentButtonPosition() {\n    if (this.#firstElement.extraPopupElement && !this.#firstElement.editor) {\n      // If there's no editor associated with the annotation then the comment\n      // button position can't be changed.\n      return;\n    }\n    if (!this.#commentButton) {\n      this.renderCommentButton();\n    }\n    const [x, y] = this.#commentButtonPosition;\n    const { style } = this.#commentButton;\n    style.left = `calc(${x}%)`;\n    style.top = `calc(${y}% - var(--comment-button-dim))`;\n  }\n\n  #updateColor() {\n    if (this.#firstElement.extraPopupElement) {\n      return;\n    }\n    if (!this.#commentButton) {\n      this.renderCommentButton();\n    }\n    this.#commentButton.style.backgroundColor = this.commentButtonColor || \"\";\n  }\n\n  get commentButtonColor() {\n    const { color, opacity } = this.#firstElement.commentData;\n    if (!color) {\n      return null;\n    }\n    return this.#parent._commentManager.makeCommentColor(color, opacity);\n  }\n\n  focusCommentButton() {\n    setTimeout(() => {\n      this.#commentButton?.focus();\n    }, 0);\n  }\n\n  getData() {\n    const { richText, color, opacity, creationDate, modificationDate } =\n      this.#firstElement.commentData;\n    return {\n      contentsObj: { str: this.comment },\n      richText,\n      color,\n      opacity,\n      creationDate,\n      modificationDate,\n    };\n  }\n\n  get elementBeforePopup() {\n    return this.#commentButton;\n  }\n\n  get comment() {\n    this.#commentText ||= this.#firstElement.commentText;\n    return this.#commentText;\n  }\n\n  set comment(text) {\n    if (text === this.comment) {\n      return;\n    }\n    this.#firstElement.commentText = this.#commentText = text;\n  }\n\n  focus() {\n    this.#firstElement.container?.focus();\n  }\n\n  get parentBoundingClientRect() {\n    return this.#firstElement.layer.getBoundingClientRect();\n  }\n\n  setCommentButtonStates({ selected, hasPopup }) {\n    if (!this.#commentButton) {\n      return;\n    }\n    this.#commentButton.classList.toggle(\"selected\", selected);\n    this.#commentButton.ariaExpanded = hasPopup;\n  }\n\n  setSelectedCommentButton(selected) {\n    this.#commentButton.classList.toggle(\"selected\", selected);\n  }\n\n  get commentPopupPosition() {\n    if (this.#popupPosition) {\n      return this.#popupPosition;\n    }\n    const { x, y, height } = this.#commentButton.getBoundingClientRect();\n    const {\n      x: parentX,\n      y: parentY,\n      width: parentWidth,\n      height: parentHeight,\n    } = this.#firstElement.layer.getBoundingClientRect();\n    return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight];\n  }\n\n  set commentPopupPosition(pos) {\n    this.#popupPosition = pos;\n  }\n\n  hasDefaultPopupPosition() {\n    return this.#popupPosition === null;\n  }\n\n  get commentButtonPosition() {\n    return this.#commentButtonPosition;\n  }\n\n  get commentButtonWidth() {\n    return (\n      this.#commentButton.getBoundingClientRect().width /\n      this.parentBoundingClientRect.width\n    );\n  }\n\n  editComment(options) {\n    const [posX, posY] =\n      this.#popupPosition || this.commentButtonPosition.map(x => x / 100);\n    const parentDimensions = this.parentBoundingClientRect;\n    const {\n      x: parentX,\n      y: parentY,\n      width: parentWidth,\n      height: parentHeight,\n    } = parentDimensions;\n    this.#commentManager.showDialog(\n      null,\n      this,\n      parentX + posX * parentWidth,\n      parentY + posY * parentHeight,\n      { ...options, parentDimensions }\n    );\n  }\n\n  render() {\n    if (this.#popup) {\n      return;\n    }\n\n    const popup = (this.#popup = document.createElement(\"div\"));\n    popup.className = \"popup\";\n\n    if (this.#color) {\n      const baseColor = (popup.style.outlineColor = Util.makeHexColor(\n        ...this.#color\n      ));\n      popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`;\n    }\n\n    const header = document.createElement(\"span\");\n    header.className = \"header\";\n    if (this.#titleObj?.str) {\n      const title = document.createElement(\"span\");\n      title.className = \"title\";\n      header.append(title);\n      ({ dir: title.dir, str: title.textContent } = this.#titleObj);\n    }\n    popup.append(header);\n\n    if (this.#dateObj) {\n      const modificationDate = document.createElement(\"time\");\n      modificationDate.className = \"popupDate\";\n      modificationDate.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-annotation-date-time-string\"\n      );\n      modificationDate.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({ dateObj: this.#dateObj.valueOf() })\n      );\n      modificationDate.dateTime = this.#dateObj.toISOString();\n      header.append(modificationDate);\n    }\n\n    renderRichText(\n      {\n        html: this.#html || this.#contentsObj.str,\n        dir: this.#contentsObj?.dir,\n        className: \"popupContent\",\n      },\n      popup\n    );\n\n    this.#container.append(popup);\n  }\n\n  get #html() {\n    const richText = this.#richText;\n    const contentsObj = this.#contentsObj;\n    if (\n      richText?.str &&\n      (!contentsObj?.str || contentsObj.str === richText.str)\n    ) {\n      return this.#richText.html || null;\n    }\n    return null;\n  }\n\n  get #fontSize() {\n    return this.#html?.attributes?.style?.fontSize || 0;\n  }\n\n  get #fontColor() {\n    return this.#html?.attributes?.style?.color || null;\n  }\n\n  #makePopupContent(text) {\n    const popupLines = [];\n    const popupContent = {\n      str: text,\n      html: {\n        name: \"div\",\n        attributes: {\n          dir: \"auto\",\n        },\n        children: [\n          {\n            name: \"p\",\n            children: popupLines,\n          },\n        ],\n      },\n    };\n    const lineAttributes = {\n      style: {\n        color: this.#fontColor,\n        fontSize: this.#fontSize\n          ? `calc(${this.#fontSize}px * var(--total-scale-factor))`\n          : \"\",\n      },\n    };\n    for (const line of text.split(\"\\n\")) {\n      popupLines.push({\n        name: \"span\",\n        value: line,\n        attributes: lineAttributes,\n      });\n    }\n    return popupContent;\n  }\n\n  #keyDown(event) {\n    if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    if (event.key === \"Enter\" || (event.key === \"Escape\" && this.#pinned)) {\n      this.#toggle();\n    }\n  }\n\n  updateEdited({ rect, popup, deleted }) {\n    if (this.#commentManager) {\n      if (deleted) {\n        this.remove();\n        this.#commentText = null;\n      } else if (popup) {\n        if (popup.deleted) {\n          this.remove();\n        } else {\n          this.#updateColor();\n          this.#commentText = popup.text;\n        }\n      }\n      if (rect) {\n        this.#commentButtonPosition = null;\n        this.#setCommentButtonPosition();\n        this.#updateCommentButtonPosition();\n      }\n      return;\n    }\n    if (deleted || popup?.deleted) {\n      this.remove();\n      return;\n    }\n    this.#addEventListeners();\n    this.#updates ||= {\n      contentsObj: this.#contentsObj,\n      richText: this.#richText,\n    };\n    if (rect) {\n      this.#position = null;\n    }\n    if (popup && popup.text) {\n      this.#richText = this.#makePopupContent(popup.text);\n      this.#dateObj = PDFDateString.toDateObject(popup.date);\n      this.#contentsObj = null;\n    }\n    this.#popup?.remove();\n    this.#popup = null;\n  }\n\n  resetEdited() {\n    if (!this.#updates) {\n      return;\n    }\n    ({ contentsObj: this.#contentsObj, richText: this.#richText } =\n      this.#updates);\n    this.#updates = null;\n    this.#popup?.remove();\n    this.#popup = null;\n    this.#position = null;\n  }\n\n  remove() {\n    this.#popupAbortController?.abort();\n    this.#popupAbortController = null;\n    this.#popup?.remove();\n    this.#popup = null;\n    this.#wasVisible = false;\n    this.#pinned = false;\n    this.#commentButton?.remove();\n    this.#commentButton = null;\n    if (this.trigger) {\n      for (const element of this.trigger) {\n        element.classList.remove(\"popupTriggerArea\");\n      }\n    }\n  }\n\n  #setPosition() {\n    if (this.#position !== null) {\n      return;\n    }\n    const {\n      page: { view },\n      viewport: {\n        rawDims: { pageWidth, pageHeight, pageX, pageY },\n      },\n    } = this.#parent;\n\n    let useParentRect = !!this.#parentRect;\n    let rect = useParentRect ? this.#parentRect : this.#rect;\n    for (const element of this.#elements) {\n      if (!rect || Util.intersect(element.data.rect, rect) !== null) {\n        rect = element.data.rect;\n        useParentRect = true;\n        break;\n      }\n    }\n\n    const normalizedRect = Util.normalizeRect([\n      rect[0],\n      view[3] - rect[1] + view[1],\n      rect[2],\n      view[3] - rect[3] + view[1],\n    ]);\n\n    const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5;\n    const parentWidth = useParentRect\n      ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION\n      : 0;\n    const popupLeft = normalizedRect[0] + parentWidth;\n    const popupTop = normalizedRect[1];\n    this.#position = [\n      (100 * (popupLeft - pageX)) / pageWidth,\n      (100 * (popupTop - pageY)) / pageHeight,\n    ];\n\n    const { style } = this.#container;\n    style.left = `${this.#position[0]}%`;\n    style.top = `${this.#position[1]}%`;\n  }\n\n  /**\n   * Toggle the visibility of the popup.\n   */\n  #toggle() {\n    if (this.#commentManager) {\n      this.#commentManager.toggleCommentPopup(this, /* isSelected = */ false);\n      return;\n    }\n\n    this.#pinned = !this.#pinned;\n    if (this.#pinned) {\n      this.#show();\n      this.#container.addEventListener(\"click\", this.#boundToggle);\n      this.#container.addEventListener(\"keydown\", this.#boundKeyDown);\n    } else {\n      this.#hide();\n      this.#container.removeEventListener(\"click\", this.#boundToggle);\n      this.#container.removeEventListener(\"keydown\", this.#boundKeyDown);\n    }\n  }\n\n  /**\n   * Show the popup.\n   */\n  #show() {\n    if (!this.#popup) {\n      this.render();\n    }\n    if (!this.isVisible) {\n      this.#setPosition();\n      this.#container.hidden = false;\n      this.#container.style.zIndex =\n        parseInt(this.#container.style.zIndex, 10) + 1000;\n    } else if (this.#pinned) {\n      this.#container.classList.add(\"focused\");\n    }\n  }\n\n  /**\n   * Hide the popup.\n   */\n  #hide() {\n    this.#container.classList.remove(\"focused\");\n    if (this.#pinned || !this.isVisible) {\n      return;\n    }\n    this.#container.hidden = true;\n    this.#container.style.zIndex =\n      parseInt(this.#container.style.zIndex, 10) - 1000;\n  }\n\n  forceHide() {\n    this.#wasVisible = this.isVisible;\n    if (!this.#wasVisible) {\n      return;\n    }\n    this.#container.hidden = true;\n  }\n\n  maybeShow() {\n    if (this.#commentManager) {\n      return;\n    }\n    this.#addEventListeners();\n    if (!this.#wasVisible) {\n      return;\n    }\n    if (!this.#popup) {\n      this.#show();\n    }\n    this.#wasVisible = false;\n    this.#container.hidden = false;\n  }\n\n  get isVisible() {\n    if (this.#commentManager) {\n      return false;\n    }\n    return this.#container.hidden === false;\n  }\n}\n\nclass FreeTextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n    this.textContent = parameters.data.textContent;\n    this.textPosition = parameters.data.textPosition;\n    this.annotationEditorType = AnnotationEditorType.FREETEXT;\n  }\n\n  render() {\n    this.container.classList.add(\"freeTextAnnotation\");\n\n    if (this.textContent) {\n      const content = (this.contentElement = document.createElement(\"div\"));\n      content.classList.add(\"annotationTextContent\");\n      content.setAttribute(\"role\", \"comment\");\n      for (const line of this.textContent) {\n        const lineSpan = document.createElement(\"span\");\n        lineSpan.textContent = line;\n        content.append(lineSpan);\n      }\n      this.container.append(content);\n    }\n\n    if (!this.data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    this._editOnDoubleClick();\n\n    return this.container;\n  }\n}\n\nclass LineAnnotationElement extends AnnotationElement {\n  #line = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n  }\n\n  render() {\n    this.container.classList.add(\"lineAnnotation\");\n\n    // Create an invisible line with the same starting and ending coordinates\n    // that acts as the trigger for the popup. Only the line itself should\n    // trigger the popup, not the entire container.\n    const { data, width, height } = this;\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n\n    // PDF coordinates are calculated from a bottom left origin, so transform\n    // the line coordinates to a top left origin for the SVG element.\n    const line = (this.#line = this.svgFactory.createElement(\"svg:line\"));\n    line.setAttribute(\"x1\", data.rect[2] - data.lineCoordinates[0]);\n    line.setAttribute(\"y1\", data.rect[3] - data.lineCoordinates[1]);\n    line.setAttribute(\"x2\", data.rect[2] - data.lineCoordinates[2]);\n    line.setAttribute(\"y2\", data.rect[3] - data.lineCoordinates[3]);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    line.setAttribute(\"stroke-width\", data.borderStyle.width || 1);\n    line.setAttribute(\"stroke\", \"transparent\");\n    line.setAttribute(\"fill\", \"transparent\");\n\n    svg.append(line);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the line instead\n    // of to the entire container (which is the default).\n    if (!data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    return this.container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#line;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass SquareAnnotationElement extends AnnotationElement {\n  #square = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n  }\n\n  render() {\n    this.container.classList.add(\"squareAnnotation\");\n\n    // Create an invisible square with the same rectangle that acts as the\n    // trigger for the popup. Only the square itself should trigger the\n    // popup, not the entire container.\n    const { data, width, height } = this;\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n\n    // The browser draws half of the borders inside the square and half of\n    // the borders outside the square by default. This behavior cannot be\n    // changed programmatically, so correct for that here.\n    const borderWidth = data.borderStyle.width;\n    const square = (this.#square = this.svgFactory.createElement(\"svg:rect\"));\n    square.setAttribute(\"x\", borderWidth / 2);\n    square.setAttribute(\"y\", borderWidth / 2);\n    square.setAttribute(\"width\", width - borderWidth);\n    square.setAttribute(\"height\", height - borderWidth);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    square.setAttribute(\"stroke-width\", borderWidth || 1);\n    square.setAttribute(\"stroke\", \"transparent\");\n    square.setAttribute(\"fill\", \"transparent\");\n\n    svg.append(square);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the square instead\n    // of to the entire container (which is the default).\n    if (!data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    return this.container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#square;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass CircleAnnotationElement extends AnnotationElement {\n  #circle = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n  }\n\n  render() {\n    this.container.classList.add(\"circleAnnotation\");\n\n    // Create an invisible circle with the same ellipse that acts as the\n    // trigger for the popup. Only the circle itself should trigger the\n    // popup, not the entire container.\n    const { data, width, height } = this;\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n\n    // The browser draws half of the borders inside the circle and half of\n    // the borders outside the circle by default. This behavior cannot be\n    // changed programmatically, so correct for that here.\n    const borderWidth = data.borderStyle.width;\n    const circle = (this.#circle =\n      this.svgFactory.createElement(\"svg:ellipse\"));\n    circle.setAttribute(\"cx\", width / 2);\n    circle.setAttribute(\"cy\", height / 2);\n    circle.setAttribute(\"rx\", width / 2 - borderWidth / 2);\n    circle.setAttribute(\"ry\", height / 2 - borderWidth / 2);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    circle.setAttribute(\"stroke-width\", borderWidth || 1);\n    circle.setAttribute(\"stroke\", \"transparent\");\n    circle.setAttribute(\"fill\", \"transparent\");\n\n    svg.append(circle);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the circle instead\n    // of to the entire container (which is the default).\n    if (!data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    return this.container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#circle;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass PolylineAnnotationElement extends AnnotationElement {\n  #polyline = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n\n    this.containerClassName = \"polylineAnnotation\";\n    this.svgElementName = \"svg:polyline\";\n  }\n\n  render() {\n    this.container.classList.add(this.containerClassName);\n\n    // Create an invisible polyline with the same points that acts as the\n    // trigger for the popup. Only the polyline itself should trigger the\n    // popup, not the entire container.\n    const {\n      data: { rect, vertices, borderStyle, popupRef },\n      width,\n      height,\n    } = this;\n    if (!vertices) {\n      return this.container;\n    }\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n\n    // Convert the vertices array to a single points string that the SVG\n    // polyline element expects (\"x1,y1 x2,y2 ...\"). PDF coordinates are\n    // calculated from a bottom left origin, so transform the polyline\n    // coordinates to a top left origin for the SVG element.\n    let points = [];\n    for (let i = 0, ii = vertices.length; i < ii; i += 2) {\n      const x = vertices[i] - rect[0];\n      const y = rect[3] - vertices[i + 1];\n      points.push(`${x},${y}`);\n    }\n    points = points.join(\" \");\n\n    const polyline = (this.#polyline = this.svgFactory.createElement(\n      this.svgElementName\n    ));\n    polyline.setAttribute(\"points\", points);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    polyline.setAttribute(\"stroke-width\", borderStyle.width || 1);\n    polyline.setAttribute(\"stroke\", \"transparent\");\n    polyline.setAttribute(\"fill\", \"transparent\");\n\n    svg.append(polyline);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the polyline\n    // instead of to the entire container (which is the default).\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    return this.container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#polyline;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass PolygonAnnotationElement extends PolylineAnnotationElement {\n  constructor(parameters) {\n    // Polygons are specific forms of polylines, so reuse their logic.\n    super(parameters);\n\n    this.containerClassName = \"polygonAnnotation\";\n    this.svgElementName = \"svg:polygon\";\n  }\n}\n\nclass CaretAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n  }\n\n  render() {\n    this.container.classList.add(\"caretAnnotation\");\n\n    if (!this.data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    return this.container;\n  }\n}\n\nclass InkAnnotationElement extends AnnotationElement {\n  #polylinesGroupElement = null;\n\n  #polylines = [];\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n\n    this.containerClassName = \"inkAnnotation\";\n\n    // Use the polyline SVG element since it allows us to use coordinates\n    // directly and to draw both straight lines and curves.\n    this.svgElementName = \"svg:polyline\";\n\n    this.annotationEditorType =\n      this.data.it === \"InkHighlight\"\n        ? AnnotationEditorType.HIGHLIGHT\n        : AnnotationEditorType.INK;\n  }\n\n  #getTransform(rotation, rect) {\n    // PDF coordinates are calculated from a bottom left origin, so\n    // transform the polyline coordinates to a top left origin for the\n    // SVG element.\n    switch (rotation) {\n      case 90:\n        return {\n          transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`,\n          width: rect[3] - rect[1],\n          height: rect[2] - rect[0],\n        };\n      case 180:\n        return {\n          transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`,\n          width: rect[2] - rect[0],\n          height: rect[3] - rect[1],\n        };\n      case 270:\n        return {\n          transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`,\n          width: rect[3] - rect[1],\n          height: rect[2] - rect[0],\n        };\n      default:\n        return {\n          transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`,\n          width: rect[2] - rect[0],\n          height: rect[3] - rect[1],\n        };\n    }\n  }\n\n  render() {\n    this.container.classList.add(this.containerClassName);\n\n    // Create an invisible polyline with the same points that acts as the\n    // trigger for the popup.\n    const {\n      data: { rect, rotation, inkLists, borderStyle, popupRef },\n    } = this;\n    const { transform, width, height } = this.#getTransform(rotation, rect);\n\n    const svg = this.svgFactory.create(\n      width,\n      height,\n      /* skipDimensions = */ true\n    );\n    const g = (this.#polylinesGroupElement =\n      this.svgFactory.createElement(\"svg:g\"));\n    svg.append(g);\n    // Ensure that the 'stroke-width' is always non-zero, since otherwise it\n    // won't be possible to open/close the popup (note e.g. issue 11122).\n    g.setAttribute(\"stroke-width\", borderStyle.width || 1);\n    g.setAttribute(\"stroke-linecap\", \"round\");\n    g.setAttribute(\"stroke-linejoin\", \"round\");\n    g.setAttribute(\"stroke-miterlimit\", 10);\n    g.setAttribute(\"stroke\", \"transparent\");\n    g.setAttribute(\"fill\", \"transparent\");\n    g.setAttribute(\"transform\", transform);\n\n    for (let i = 0, ii = inkLists.length; i < ii; i++) {\n      const polyline = this.svgFactory.createElement(this.svgElementName);\n      this.#polylines.push(polyline);\n      polyline.setAttribute(\"points\", inkLists[i].join(\",\"));\n      g.append(polyline);\n    }\n\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    this.container.append(svg);\n    this._editOnDoubleClick();\n\n    return this.container;\n  }\n\n  updateEdited(params) {\n    super.updateEdited(params);\n    const { thickness, points, rect } = params;\n    const g = this.#polylinesGroupElement;\n    if (thickness >= 0) {\n      g.setAttribute(\"stroke-width\", thickness || 1);\n    }\n    if (points) {\n      for (let i = 0, ii = this.#polylines.length; i < ii; i++) {\n        this.#polylines[i].setAttribute(\"points\", points[i].join(\",\"));\n      }\n    }\n    if (rect) {\n      const { transform, width, height } = this.#getTransform(\n        this.data.rotation,\n        rect\n      );\n      const root = g.parentElement;\n      root.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n      g.setAttribute(\"transform\", transform);\n    }\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#polylines;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n}\n\nclass HighlightAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true,\n    });\n    this.annotationEditorType = AnnotationEditorType.HIGHLIGHT;\n  }\n\n  render() {\n    const {\n      data: { overlaidText, popupRef },\n    } = this;\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    this.container.classList.add(\"highlightAnnotation\");\n    this._editOnDoubleClick();\n\n    if (overlaidText) {\n      const mark = document.createElement(\"mark\");\n      mark.classList.add(\"overlaidText\");\n      mark.textContent = overlaidText;\n      this.container.append(mark);\n    }\n\n    return this.container;\n  }\n}\n\nclass UnderlineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true,\n    });\n  }\n\n  render() {\n    const {\n      data: { overlaidText, popupRef },\n    } = this;\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    this.container.classList.add(\"underlineAnnotation\");\n\n    if (overlaidText) {\n      const underline = document.createElement(\"u\");\n      underline.classList.add(\"overlaidText\");\n      underline.textContent = overlaidText;\n      this.container.append(underline);\n    }\n\n    return this.container;\n  }\n}\n\nclass SquigglyAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true,\n    });\n  }\n\n  render() {\n    const {\n      data: { overlaidText, popupRef },\n    } = this;\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    this.container.classList.add(\"squigglyAnnotation\");\n\n    if (overlaidText) {\n      const underline = document.createElement(\"u\");\n      underline.classList.add(\"overlaidText\");\n      underline.textContent = overlaidText;\n      this.container.append(underline);\n    }\n\n    return this.container;\n  }\n}\n\nclass StrikeOutAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, {\n      isRenderable: true,\n      ignoreBorder: true,\n      createQuadrilaterals: true,\n    });\n  }\n\n  render() {\n    const {\n      data: { overlaidText, popupRef },\n    } = this;\n    if (!popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n\n    this.container.classList.add(\"strikeoutAnnotation\");\n\n    if (overlaidText) {\n      const strikeout = document.createElement(\"s\");\n      strikeout.classList.add(\"overlaidText\");\n      strikeout.textContent = overlaidText;\n      this.container.append(strikeout);\n    }\n\n    return this.container;\n  }\n}\n\nclass StampAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, { isRenderable: true, ignoreBorder: true });\n    this.annotationEditorType = AnnotationEditorType.STAMP;\n  }\n\n  render() {\n    this.container.classList.add(\"stampAnnotation\");\n    this.container.setAttribute(\"role\", \"img\");\n\n    if (!this.data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    }\n    this._editOnDoubleClick();\n\n    return this.container;\n  }\n}\n\nclass FileAttachmentAnnotationElement extends AnnotationElement {\n  #trigger = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: true });\n\n    const { fileId, file } = this.data;\n    this.filename = file.filename;\n    this.content = file.content;\n    this.fileId = fileId;\n\n    this.linkService.eventBus?.dispatch(\"fileattachmentannotation\", {\n      source: this,\n      attachmentId: this.fileId,\n      ...file,\n    });\n  }\n\n  render() {\n    this.container.classList.add(\"fileAttachmentAnnotation\");\n\n    const { container, data } = this;\n    let trigger;\n    if (data.hasAppearance || data.fillAlpha === 0) {\n      trigger = document.createElement(\"div\");\n    } else {\n      // Unfortunately it seems that it's not clearly specified exactly what\n      // names are actually valid, since Table 184 contains:\n      //   Conforming readers shall provide predefined icon appearances for at\n      //   least the following standard names: GraphPushPin, PaperclipTag.\n      //   Additional names may be supported as well. Default value: PushPin.\n      trigger = document.createElement(\"img\");\n      trigger.src = `${this.imageResourcesPath}annotation-${\n        /paperclip/i.test(data.name) ? \"paperclip\" : \"pushpin\"\n      }.svg`;\n\n      if (data.fillAlpha && data.fillAlpha < 1) {\n        trigger.style = `filter: opacity(${Math.round(\n          data.fillAlpha * 100\n        )}%);`;\n\n        if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n          this.container.classList.add(\"hasFillAlpha\");\n        }\n      }\n    }\n    trigger.addEventListener(\"dblclick\", this.#download.bind(this));\n    this.#trigger = trigger;\n\n    const { isMac } = FeatureTest.platform;\n    container.addEventListener(\"keydown\", evt => {\n      if (evt.key === \"Enter\" && (isMac ? evt.metaKey : evt.ctrlKey)) {\n        this.#download();\n      }\n    });\n\n    if (!data.popupRef && this.hasPopupData) {\n      this.hasOwnCommentButton = true;\n      this._createPopup();\n    } else {\n      trigger.classList.add(\"popupTriggerArea\");\n    }\n\n    container.append(trigger);\n    return container;\n  }\n\n  getElementsToTriggerPopup() {\n    return this.#trigger;\n  }\n\n  addHighlightArea() {\n    this.container.classList.add(\"highlightArea\");\n  }\n\n  /**\n   * Download the file attachment associated with this annotation.\n   */\n  async #download() {\n    const { fileId, filename, content: fallbackContent } = this;\n    /** @type {CatalogAttachmentContent} */\n    const content =\n      (await this.linkService.getAttachmentContent(fileId)) || fallbackContent;\n\n    if (content) {\n      this.downloadManager?.openOrDownloadData(content, filename);\n    }\n  }\n}\n\nclass MediaAnnotationElement extends AnnotationElement {\n  #abortController = new AbortController();\n\n  #contentUrl = null;\n\n  #media = null;\n\n  constructor(parameters) {\n    super(parameters, { isRenderable: !!parameters.data.richMedia });\n  }\n\n  render() {\n    this.container.classList.add(\"mediaAnnotation\");\n\n    const { filename } = this.data.richMedia;\n\n    // The annotation's appearance (a poster image) is painted on the canvas;\n    // overlay a play button that loads the embedded media on demand.\n    const button = document.createElement(\"button\");\n    button.className = \"mediaPlayButton\";\n    button.type = \"button\";\n    button.title = button.ariaLabel = filename;\n    button.addEventListener(\"click\", () => this.#load(button), {\n      signal: this.#abortController.signal,\n    });\n\n    this.container.append(button);\n    return this.container;\n  }\n\n  async #load(button) {\n    const { fileId, filename, contentType } = this.data.richMedia;\n    button.disabled = true;\n\n    let content;\n    try {\n      content = await this.linkService.getAttachmentContent(fileId);\n    } catch {\n      // Leave the play button in place so the load can be retried.\n      return;\n    } finally {\n      button.disabled = false;\n    }\n    if (!content || !button.isConnected) {\n      return;\n    }\n\n    const { signal } = this.#abortController;\n    const url = URL.createObjectURL(new Blob([content], { type: contentType }));\n    this.#contentUrl = url;\n    const isAudio = contentType.startsWith(\"audio/\");\n    const media = document.createElement(isAudio ? \"audio\" : \"video\");\n    this.#media = media;\n    media.className = \"mediaContent\";\n    this._setBackgroundColor(media);\n    media.src = url;\n    media.title = filename;\n    media.controls = true;\n    media.autoplay = true;\n    media.tabIndex = 0;\n    if (isAudio) {\n      // An `<audio>` element's controls would otherwise always be visible;\n      // only show them while the section is hovered or focused.\n      let hovered = false;\n      let focused = false;\n      const updateControls = () => {\n        media.controls = hovered || focused;\n      };\n      this.container.addEventListener(\n        \"pointerenter\",\n        () => {\n          hovered = true;\n          updateControls();\n        },\n        { signal }\n      );\n      this.container.addEventListener(\n        \"pointerleave\",\n        () => {\n          hovered = false;\n          updateControls();\n        },\n        { signal }\n      );\n      this.container.addEventListener(\n        \"focusin\",\n        () => {\n          focused = true;\n          updateControls();\n        },\n        { signal }\n      );\n      this.container.addEventListener(\n        \"focusout\",\n        () => {\n          focused = false;\n          updateControls();\n        },\n        { signal }\n      );\n    }\n    // Release the object URL once the browser no longer needs the source.\n    media.addEventListener(\"emptied\", () => this.#revokeContentUrl(url), {\n      once: true,\n      signal,\n    });\n\n    button.replaceWith(media);\n    media.play().catch(() => {});\n  }\n\n  #revokeContentUrl(url = this.#contentUrl) {\n    if (url && url === this.#contentUrl) {\n      URL.revokeObjectURL(url);\n      this.#contentUrl = null;\n    }\n  }\n\n  destroy() {\n    // Aborting also removes the `emptied` listener below, so revoke the object\n    // URL explicitly rather than relying on the teardown triggering it.\n    this.#abortController.abort();\n    if (this.#media) {\n      this.#media.pause();\n      this.#media.removeAttribute(\"src\");\n      this.#media.load();\n      this.#media = null;\n    }\n    this.#revokeContentUrl();\n  }\n}\n\n/**\n * @typedef {Object} AnnotationLayerParameters\n * @property {PageViewport} viewport\n * @property {HTMLDivElement} div\n * @property {Array} annotations\n * @property {PDFPageProxy} page\n * @property {PDFLinkService} linkService\n * @property {BaseDownloadManager} [downloadManager]\n * @property {AnnotationStorage} [annotationStorage]\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {boolean} renderForms\n * @property {boolean} [enableScripting] - Enable embedded script execution.\n * @property {boolean} [hasJSActions] - Some fields have JS actions.\n *   The default value is `false`.\n * @property {Object<string, Array<Object>> | null} [fieldObjects]\n * @property {Map<string, HTMLCanvasElement>} [annotationCanvasMap]\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {AnnotationEditorUIManager} [annotationEditorUIManager]\n * @property {StructTreeLayerBuilder} [structTreeLayer]\n * @property {OptionalContentConfig} [optionalContentConfig]\n */\n\n/**\n * Manage the layer containing all the annotations.\n */\nclass AnnotationLayer {\n  #accessibilityManager = null;\n\n  #annotationCanvasMap = null;\n\n  #annotationStorage = null;\n\n  #editableAnnotations = new Map();\n\n  #structTreeLayer = null;\n\n  #linkService = null;\n\n  #elements = [];\n\n  #hasAriaAttributesFromStructTree = false;\n\n  zIndex = 0;\n\n  constructor({\n    div,\n    accessibilityManager,\n    annotationCanvasMap,\n    annotationEditorUIManager,\n    page,\n    viewport,\n    structTreeLayer,\n    commentManager,\n    linkService,\n    annotationStorage,\n  }) {\n    this.div = div;\n    this.#accessibilityManager = accessibilityManager;\n    this.#annotationCanvasMap = annotationCanvasMap;\n    this.#structTreeLayer = structTreeLayer || null;\n    this.#linkService = linkService || null;\n    this.#annotationStorage = annotationStorage || new AnnotationStorage();\n    this.page = page;\n    this.viewport = viewport;\n    this._annotationEditorUIManager = annotationEditorUIManager;\n    this._commentManager = commentManager || null;\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"showPopups\", {\n        value: async () => {\n          for (const show of this.popupShow) {\n            await show();\n          }\n        },\n      });\n      this.popupShow = [];\n    }\n  }\n\n  hasEditableAnnotations() {\n    return this.#editableAnnotations.size > 0;\n  }\n\n  /**\n   * Render a new annotation layer with all annotation elements.\n   *\n   * @param {AnnotationLayerParameters} params\n   * @memberof AnnotationLayer\n   */\n  async render(params) {\n    const { annotations, optionalContentConfig } = params;\n    const layer = this.div;\n    setLayerDimensions(layer, this.viewport);\n\n    const popupToElements = new Map();\n    const popupAnnotations = [];\n    const elementParams = {\n      data: null,\n      layer,\n      linkService: this.#linkService,\n      downloadManager: params.downloadManager,\n      imageResourcesPath: params.imageResourcesPath || \"\",\n      renderForms: params.renderForms !== false,\n      svgFactory: new DOMSVGFactory(),\n      annotationStorage: this.#annotationStorage,\n      enableComment: params.enableComment === true,\n      enableScripting: params.enableScripting === true,\n      hasJSActions: params.hasJSActions,\n      fieldObjects: params.fieldObjects,\n      parent: this,\n      elements: null,\n    };\n\n    for (const data of annotations) {\n      if (data.noHTML) {\n        continue;\n      }\n      const isPopupAnnotation = data.annotationType === AnnotationType.POPUP;\n      if (!isPopupAnnotation) {\n        if (data.rect[2] === data.rect[0] || data.rect[3] === data.rect[1]) {\n          continue; // Ignore empty annotations.\n        }\n      } else {\n        const elements = popupToElements.get(data.id);\n        if (!elements) {\n          // Ignore popup annotations without a corresponding annotation.\n          continue;\n        }\n        if (!this._commentManager) {\n          popupAnnotations.push(data);\n          continue;\n        }\n        elementParams.elements = elements;\n      }\n      elementParams.data = data;\n      const element = AnnotationElementFactory.create(elementParams);\n\n      if (!element.isRenderable) {\n        continue;\n      }\n\n      if (!isPopupAnnotation) {\n        this.#elements.push(element);\n\n        if (data.popupRef) {\n          popupToElements\n            .getOrInsertComputed(data.popupRef, makeArr)\n            .push(element);\n        }\n      }\n\n      const rendered = element.render();\n      if (data.hidden) {\n        rendered.style.visibility = \"hidden\";\n      }\n      element.updateOC(optionalContentConfig);\n\n      if (element._isEditable) {\n        this.#editableAnnotations.set(element.data.id, element);\n        this._annotationEditorUIManager?.renderAnnotationElement(element);\n      }\n    }\n\n    await this.#addElementsToDOM();\n\n    for (const data of popupAnnotations) {\n      const elements = (elementParams.elements = popupToElements.get(data.id));\n      elementParams.data = data;\n      const element = AnnotationElementFactory.create(elementParams);\n      if (!element.isRenderable) {\n        continue;\n      }\n      const rendered = element.render();\n      element.contentElement.id = `${AnnotationPrefix}${data.id}`;\n      if (data.hidden) {\n        rendered.style.visibility = \"hidden\";\n      }\n      elements.at(-1).container.after(rendered);\n    }\n\n    this.#setAnnotationCanvasMap();\n  }\n\n  async #addElementsToDOM() {\n    if (this.#elements.length === 0) {\n      return;\n    }\n    // Clear the existing annotations in order to make sure comment buttons\n    // don't have a parent any longer.\n    this.div.replaceChildren();\n\n    const promises = [];\n    if (!this.#hasAriaAttributesFromStructTree) {\n      this.#hasAriaAttributesFromStructTree = true;\n      for (const {\n        contentElement,\n        data: { id },\n      } of this.#elements) {\n        const annotationId = (contentElement.id = `${AnnotationPrefix}${id}`);\n        promises.push(\n          this.#structTreeLayer\n            ?.getAriaAttributes(annotationId)\n            .then(ariaAttributes => {\n              if (ariaAttributes) {\n                for (const [key, value] of ariaAttributes) {\n                  contentElement.setAttribute(key, value);\n                }\n              }\n            })\n        );\n      }\n    }\n    this.#elements.sort(\n      (\n        {\n          data: {\n            rect: [a0, a1, a2, a3],\n          },\n        },\n        {\n          data: {\n            rect: [b0, b1, b2, b3],\n          },\n        }\n      ) => {\n        // We are in page coordinates, which has the origin at the\n        // bottom left.\n        if (a0 === a2 && a1 === a3) {\n          return +1;\n        }\n\n        if (b0 === b2 && b1 === b3) {\n          return -1;\n        }\n\n        const top1 = a3;\n        const bot1 = a1;\n        const mid1 = (a1 + a3) / 2;\n\n        const top2 = b3;\n        const bot2 = b1;\n        const mid2 = (b1 + b3) / 2;\n\n        if (mid1 >= top2 && mid2 <= bot1) {\n          return -1;\n        }\n\n        if (mid2 >= top1 && mid1 <= bot2) {\n          return +1;\n        }\n\n        const centerX1 = (a0 + a2) / 2;\n        const centerX2 = (b0 + b2) / 2;\n\n        return centerX1 - centerX2;\n      }\n    );\n\n    const fragment = document.createDocumentFragment();\n    for (const element of this.#elements) {\n      fragment.append(element.container);\n      if (this._commentManager) {\n        (\n          element.extraPopupElement?.popup || element.popup\n        )?.renderCommentButton();\n      } else if (element.extraPopupElement) {\n        fragment.append(element.extraPopupElement.render());\n      }\n    }\n    this.div.append(fragment);\n    await Promise.all(promises);\n    if (this.#accessibilityManager) {\n      for (const element of this.#elements) {\n        this.#accessibilityManager.addPointerInTextLayer(\n          element.contentElement,\n          /* isRemovable = */ false\n        );\n      }\n    }\n  }\n\n  /**\n   * Add link annotations to the annotation layer.\n   *\n   * @param {Array<Object>} annotations\n   */\n  async addLinkAnnotations(annotations) {\n    const elementParams = {\n      data: null,\n      layer: this.div,\n      linkService: this.#linkService,\n      svgFactory: new DOMSVGFactory(),\n      parent: this,\n    };\n    for (const data of annotations) {\n      data.borderStyle ||= AnnotationLayer._defaultBorderStyle;\n\n      elementParams.data = data;\n      const element = AnnotationElementFactory.create(elementParams);\n\n      if (!element.isRenderable) {\n        continue;\n      }\n      element.render();\n      element.contentElement.id = `${AnnotationPrefix}${data.id}`;\n      this.#elements.push(element);\n    }\n    await this.#addElementsToDOM();\n  }\n\n  /**\n   * Update the annotation elements on existing annotation layer.\n   *\n   * @param {AnnotationLayerParameters} viewport\n   * @memberof AnnotationLayer\n   */\n  update({ viewport, optionalContentConfig }) {\n    const layer = this.div;\n    this.viewport = viewport;\n    setLayerDimensions(layer, { rotation: viewport.rotation });\n\n    for (const element of this.#elements) {\n      element.updateOC(optionalContentConfig);\n    }\n    this.#setAnnotationCanvasMap();\n    layer.hidden = false;\n  }\n\n  destroy() {\n    for (const element of this.#elements) {\n      element.destroy?.();\n      this.#accessibilityManager?.removePointerInTextLayer(\n        element.contentElement\n      );\n    }\n    this.#elements.length = 0;\n    this.#editableAnnotations.clear();\n    this.div.replaceChildren();\n  }\n\n  #setAnnotationCanvasMap() {\n    if (!this.#annotationCanvasMap) {\n      return;\n    }\n    const layer = this.div;\n    for (const [id, canvas] of this.#annotationCanvasMap) {\n      const element = layer.querySelector(`[data-annotation-id=\"${id}\"]`);\n      if (!element) {\n        continue;\n      }\n      if (Array.isArray(canvas)) {\n        for (const cvs of canvas) {\n          cvs.className = \"annotationContent\";\n          cvs.ariaHidden = true;\n        }\n      } else {\n        canvas.className = \"annotationContent\";\n        canvas.ariaHidden = true;\n      }\n      const toRemove = [];\n      for (const child of element.children) {\n        if (child.nodeName === \"CANVAS\") {\n          toRemove.push(child);\n        }\n      }\n      for (const child of toRemove) {\n        child.remove();\n      }\n      const firstCanvas = Array.isArray(canvas) ? canvas[0] : canvas;\n      const { firstChild } = element;\n      if (!firstChild) {\n        element.append(firstCanvas);\n      } else if (!firstChild.classList.contains(\"annotationContent\")) {\n        firstChild.before(firstCanvas);\n      } else {\n        firstChild.after(firstCanvas);\n      }\n      if (Array.isArray(canvas)) {\n        let lastCanvas = firstCanvas;\n        for (let i = 1, ii = canvas.length; i < ii; i++) {\n          lastCanvas.after(canvas[i]);\n          lastCanvas = canvas[i];\n        }\n      }\n      // Drop only the entries we inserted; keep ones whose element isn't in the\n      // DOM yet so a later refresh can still pick them up instead of losing\n      // them.\n      this.#annotationCanvasMap.delete(id);\n\n      const editableAnnotation = this.#editableAnnotations.get(id);\n      if (!editableAnnotation) {\n        continue;\n      }\n      if (editableAnnotation._hasNoCanvas) {\n        // The canvas wasn't available when the annotation was created.\n        this._annotationEditorUIManager?.setMissingCanvas(\n          id,\n          element.id,\n          canvas\n        );\n        editableAnnotation._hasNoCanvas = false;\n      } else {\n        editableAnnotation.canvas = canvas;\n      }\n    }\n  }\n\n  // Move any pending annotation canvases (e.g. higher-resolution ones rendered\n  // by the detail view) into their elements.\n  refreshCanvases() {\n    this.#setAnnotationCanvasMap();\n  }\n\n  getEditableAnnotations() {\n    return this.#editableAnnotations.values();\n  }\n\n  getEditableAnnotation(id) {\n    return this.#editableAnnotations.get(id);\n  }\n\n  addFakeAnnotation(editor) {\n    const { div } = this;\n    const { id, rotation } = editor;\n    const element = new EditorAnnotationElement({\n      data: {\n        id,\n        rect: editor.getPDFRect(),\n        rotation,\n      },\n      editor,\n      layer: div,\n      parent: this,\n      enableComment: !!this._commentManager,\n      linkService: this.#linkService,\n      annotationStorage: this.#annotationStorage,\n    });\n    element.render();\n    element.contentElement.id = `${AnnotationPrefix}${id}`;\n    element.createOrUpdatePopup();\n    this.#elements.push(element);\n    return element;\n  }\n\n  removeAnnotation(id) {\n    const index = this.#elements.findIndex(el => el.data.id === id);\n    if (index < 0) {\n      return;\n    }\n    const [element] = this.#elements.splice(index, 1);\n    this.#accessibilityManager?.removePointerInTextLayer(\n      element.contentElement\n    );\n  }\n\n  updateFakeAnnotations(editors) {\n    if (editors.length === 0) {\n      return;\n    }\n    for (const editor of editors) {\n      editor.updateFakeAnnotationElement(this);\n    }\n    this.#addElementsToDOM();\n  }\n\n  togglePointerEvents(enabled = false) {\n    this.div.classList.toggle(\"disabled\", !enabled);\n  }\n\n  /**\n   * @private\n   */\n  static get _defaultBorderStyle() {\n    return shadow(\n      this,\n      \"_defaultBorderStyle\",\n      Object.freeze({\n        width: 1,\n        rawWidth: 1,\n        style: AnnotationBorderStyleType.SOLID,\n        dashArray: [3],\n        horizontalCornerRadius: 0,\n        verticalCornerRadius: 0,\n      })\n    );\n  }\n}\n\nexport {\n  AnnotationLayer,\n  FreeTextAnnotationElement,\n  HighlightAnnotationElement,\n  InkAnnotationElement,\n  StampAnnotationElement,\n};\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  assert,\n  LINE_FACTOR,\n  shadow,\n  Util,\n} from \"../../shared/util.js\";\nimport { AnnotationEditorUIManager, KeyboardManager } from \"./tools.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { BasicColorPicker } from \"./color_picker.js\";\nimport { FreeTextAnnotationElement } from \"../annotation_layer.js\";\n\nconst EOL_PATTERN = /\\r\\n?|\\n/g;\n\n/**\n * Basic text editor in order to create a FreeTex annotation.\n */\nclass FreeTextEditor extends AnnotationEditor {\n  #content = \"\";\n\n  #editorDivId = `${this.id}-editor`;\n\n  #editModeAC = null;\n\n  #fontSize;\n\n  _colorPicker = null;\n\n  static _freeTextDefaultContent = \"\";\n\n  static _internalPadding = 0;\n\n  static _defaultColor = null;\n\n  static _defaultFontSize = 10;\n\n  static get _keyboardManager() {\n    const proto = FreeTextEditor.prototype;\n\n    const arrowChecker = self => self.isEmpty();\n\n    const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n    const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n\n    return shadow(\n      this,\n      \"_keyboardManager\",\n      new KeyboardManager([\n        [\n          // Commit the text in case the user use ctrl+s to save the document.\n          // The event must bubble in order to be caught by the viewer.\n          // See bug 1831574.\n          [\"ctrl+s\", \"mac+meta+s\", \"ctrl+p\", \"mac+meta+p\"],\n          proto.commitOrRemove,\n          { bubbles: true },\n        ],\n        [[\"ctrl+Enter\", \"mac+meta+Enter\"], proto.commitOrRemove],\n        [[\"Escape\"], proto.commitOrRemove],\n        [\n          [\"ArrowLeft\"],\n          proto._translateEmpty,\n          { args: [-small, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n          proto._translateEmpty,\n          { args: [-big, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowRight\"],\n          proto._translateEmpty,\n          { args: [small, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n          proto._translateEmpty,\n          { args: [big, 0], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowUp\"],\n          proto._translateEmpty,\n          { args: [0, -small], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"],\n          proto._translateEmpty,\n          { args: [0, -big], checker: arrowChecker },\n        ],\n        [\n          [\"ArrowDown\"],\n          proto._translateEmpty,\n          { args: [0, small], checker: arrowChecker },\n        ],\n        [\n          [\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"],\n          proto._translateEmpty,\n          { args: [0, big], checker: arrowChecker },\n        ],\n      ])\n    );\n  }\n\n  static _type = \"freetext\";\n\n  static _editorType = AnnotationEditorType.FREETEXT;\n\n  constructor(params) {\n    super({ ...params, name: \"freeTextEditor\" });\n    this.color =\n      params.color ||\n      FreeTextEditor._defaultColor ||\n      AnnotationEditor._defaultLineColor;\n    this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize;\n    if (!this.annotationElementId) {\n      this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.freetext);\n    }\n    this.canAddComment = false;\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    const style = getComputedStyle(document.documentElement);\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      const lineHeight = parseFloat(\n        style.getPropertyValue(\"--freetext-line-height\")\n      );\n      assert(\n        lineHeight === LINE_FACTOR,\n        \"Update the CSS variable to agree with the constant.\"\n      );\n    }\n\n    this._internalPadding = parseFloat(\n      style.getPropertyValue(\"--freetext-padding\")\n    );\n  }\n\n  /** @inheritdoc */\n  static updateDefaultParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.FREETEXT_SIZE:\n        FreeTextEditor._defaultFontSize = value;\n        break;\n      case AnnotationEditorParamsType.FREETEXT_COLOR:\n        FreeTextEditor._defaultColor = value;\n        break;\n    }\n  }\n\n  /** @inheritdoc */\n  updateParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.FREETEXT_SIZE:\n        this.#updateFontSize(value);\n        break;\n      case AnnotationEditorParamsType.FREETEXT_COLOR:\n        this.#updateColor(value);\n        break;\n    }\n  }\n\n  /** @inheritdoc */\n  static get defaultPropertiesToUpdate() {\n    return [\n      [\n        AnnotationEditorParamsType.FREETEXT_SIZE,\n        FreeTextEditor._defaultFontSize,\n      ],\n      [\n        AnnotationEditorParamsType.FREETEXT_COLOR,\n        FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor,\n      ],\n    ];\n  }\n\n  /** @inheritdoc */\n  get propertiesToUpdate() {\n    return [\n      [AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize],\n      [AnnotationEditorParamsType.FREETEXT_COLOR, this.color],\n    ];\n  }\n\n  /** @inheritdoc */\n  get toolbarButtons() {\n    this._colorPicker ||= new BasicColorPicker(this);\n    return [[\"colorPicker\", this._colorPicker]];\n  }\n\n  get colorType() {\n    return AnnotationEditorParamsType.FREETEXT_COLOR;\n  }\n\n  /**\n   * Update the font size and make this action as undoable.\n   * @param {number} fontSize\n   */\n  #updateFontSize(fontSize) {\n    const setFontsize = size => {\n      this.editorDiv.style.fontSize = `calc(${size}px * var(--total-scale-factor))`;\n      this.translate(0, -(size - this.#fontSize) * this.parentScale);\n      this.#fontSize = size;\n      this.#setEditorDimensions();\n    };\n    const savedFontsize = this.#fontSize;\n    this.addCommands({\n      cmd: setFontsize.bind(this, fontSize),\n      undo: setFontsize.bind(this, savedFontsize),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.FREETEXT_SIZE,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n  }\n\n  /** @inheritdoc */\n  onUpdatedColor() {\n    this.editorDiv.style.color = this.color;\n    this._colorPicker?.update(this.color);\n    super.onUpdatedColor();\n  }\n\n  /**\n   * Update the color and make this action undoable.\n   * @param {string} color\n   */\n  #updateColor(color) {\n    const setColor = col => {\n      this.color = col;\n      this.onUpdatedColor();\n    };\n    const savedColor = this.color;\n    this.addCommands({\n      cmd: setColor.bind(this, color),\n      undo: setColor.bind(this, savedColor),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.FREETEXT_COLOR,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n  }\n\n  /**\n   * Helper to translate the editor with the keyboard when it's empty.\n   * @param {number} x in page units.\n   * @param {number} y in page units.\n   */\n  _translateEmpty(x, y) {\n    this._uiManager.translateSelectedEditors(x, y, /* noCommit = */ true);\n  }\n\n  /** @inheritdoc */\n  getInitialTranslation() {\n    // The start of the base line is where the user clicked.\n    const scale = this.parentScale;\n    return [\n      -FreeTextEditor._internalPadding * scale,\n      -(FreeTextEditor._internalPadding + this.#fontSize) * scale,\n    ];\n  }\n\n  /** @inheritdoc */\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n\n    if (!this.isAttachedToDOM) {\n      // At some point this editor was removed and we're rebuilting it,\n      // hence we must add it to its parent.\n      this.parent.add(this);\n    }\n  }\n\n  /** @inheritdoc */\n  enableEditMode() {\n    if (!super.enableEditMode()) {\n      return false;\n    }\n\n    this.overlayDiv.classList.remove(\"enabled\");\n    this.editorDiv.contentEditable = true;\n    this._isDraggable = false;\n    this.div.removeAttribute(\"aria-activedescendant\");\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        !this.#editModeAC,\n        \"No `this.#editModeAC` AbortController should exist.\"\n      );\n    }\n    this.#editModeAC = new AbortController();\n    const signal = this._uiManager.combinedSignal(this.#editModeAC);\n\n    this.editorDiv.addEventListener(\n      \"keydown\",\n      this.editorDivKeydown.bind(this),\n      { signal }\n    );\n    this.editorDiv.addEventListener(\"focus\", this.editorDivFocus.bind(this), {\n      signal,\n    });\n    this.editorDiv.addEventListener(\"blur\", this.editorDivBlur.bind(this), {\n      signal,\n    });\n    this.editorDiv.addEventListener(\"input\", this.editorDivInput.bind(this), {\n      signal,\n    });\n    this.editorDiv.addEventListener(\"paste\", this.editorDivPaste.bind(this), {\n      signal,\n    });\n\n    return true;\n  }\n\n  /** @inheritdoc */\n  disableEditMode() {\n    if (!super.disableEditMode()) {\n      return false;\n    }\n\n    this.overlayDiv.classList.add(\"enabled\");\n    this.editorDiv.contentEditable = false;\n    this.div.setAttribute(\"aria-activedescendant\", this.#editorDivId);\n    this._isDraggable = true;\n\n    this.#editModeAC?.abort();\n    this.#editModeAC = null;\n\n    // On Chrome, the focus is given to <body> when contentEditable is set to\n    // false, hence we focus the div.\n    this.div.focus({\n      preventScroll: true /* See issue #15744 */,\n    });\n\n    // In case the blur callback hasn't been called.\n    this.isEditing = false;\n    this.parent.div.classList.add(\"freetextEditing\");\n\n    return true;\n  }\n\n  /** @inheritdoc */\n  focusin(event) {\n    if (!this._focusEventsAllowed) {\n      return;\n    }\n    super.focusin(event);\n    if (event.target !== this.editorDiv) {\n      this.editorDiv.focus();\n    }\n  }\n\n  /** @inheritdoc */\n  onceAdded(focus) {\n    if (this.width) {\n      // The editor was created in using ctrl+c.\n      return;\n    }\n    this.enableEditMode();\n    if (focus) {\n      this.editorDiv.focus();\n    }\n    if (this._initialOptions?.isCentered) {\n      this.center();\n    }\n    this._initialOptions = null;\n  }\n\n  /** @inheritdoc */\n  isEmpty() {\n    return !this.editorDiv || this.editorDiv.innerText.trim() === \"\";\n  }\n\n  /** @inheritdoc */\n  remove() {\n    this.isEditing = false;\n    if (this.parent) {\n      this.parent.setEditingState(true);\n      this.parent.div.classList.add(\"freetextEditing\");\n    }\n    super.remove();\n  }\n\n  /**\n   * Extract the text from this editor.\n   * @returns {string}\n   */\n  #extractText() {\n    // We don't use innerText because there are some bugs with line breaks.\n    const buffer = [];\n    this.editorDiv.normalize();\n    let prevChild = null;\n    for (const child of this.editorDiv.childNodes) {\n      if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === \"BR\") {\n        // It can happen if the user uses shift+enter to add a new line.\n        // If we don't skip it, we'll end up with an extra line (one for the\n        // text and one for the br element).\n        continue;\n      }\n      buffer.push(FreeTextEditor.#getNodeContent(child));\n      prevChild = child;\n    }\n    return buffer.join(\"\\n\");\n  }\n\n  #setEditorDimensions() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n\n    let rect;\n    if (this.isAttachedToDOM) {\n      rect = this.div.getBoundingClientRect();\n    } else {\n      // This editor isn't on screen but we need to get its dimensions, so\n      // we just insert it in the DOM, get its bounding box and then remove it.\n      const { currentLayer, div } = this;\n      const savedDisplay = div.style.display;\n      const savedVisibility = div.classList.contains(\"hidden\");\n      div.classList.remove(\"hidden\");\n      div.style.display = \"hidden\";\n      currentLayer.div.append(this.div);\n      rect = div.getBoundingClientRect();\n      div.remove();\n      div.style.display = savedDisplay;\n      div.classList.toggle(\"hidden\", savedVisibility);\n    }\n\n    // The dimensions are relative to the rotation of the page, hence we need to\n    // take that into account (see issue #16636).\n    if (this.rotation % 180 === this.parentRotation % 180) {\n      this.width = rect.width / parentWidth;\n      this.height = rect.height / parentHeight;\n    } else {\n      this.width = rect.height / parentWidth;\n      this.height = rect.width / parentHeight;\n    }\n    this.fixAndSetPosition();\n  }\n\n  /**\n   * Commit the content we have in this editor.\n   * @returns {undefined}\n   */\n  commit() {\n    if (!this.isInEditMode()) {\n      return;\n    }\n\n    super.commit();\n    this.disableEditMode();\n    const savedText = this.#content;\n    const newText = (this.#content = this.#extractText().trimEnd());\n    if (savedText === newText) {\n      return;\n    }\n\n    const setText = text => {\n      this.#content = text;\n      if (!text) {\n        this.remove();\n        return;\n      }\n      this.#setContent();\n      this._uiManager.rebuild(this);\n      this.#setEditorDimensions();\n    };\n    this.addCommands({\n      cmd: () => {\n        setText(newText);\n      },\n      undo: () => {\n        setText(savedText);\n      },\n      mustExec: false,\n    });\n    this.#setEditorDimensions();\n  }\n\n  /** @inheritdoc */\n  shouldGetKeyboardEvents() {\n    return this.isInEditMode();\n  }\n\n  /** @inheritdoc */\n  enterInEditMode() {\n    this.enableEditMode();\n    this.editorDiv.focus();\n  }\n\n  /** @inheritdoc */\n  keydown(event) {\n    if (event.target === this.div && event.key === \"Enter\") {\n      this.enterInEditMode();\n      // Avoid to add an unwanted new line.\n      event.preventDefault();\n    }\n  }\n\n  editorDivKeydown(event) {\n    FreeTextEditor._keyboardManager.exec(this, event);\n  }\n\n  editorDivFocus(event) {\n    this.isEditing = true;\n  }\n\n  editorDivBlur(event) {\n    this.isEditing = false;\n  }\n\n  editorDivInput(event) {\n    this.parent.div.classList.toggle(\"freetextEditing\", this.isEmpty());\n  }\n\n  /** @inheritdoc */\n  disableEditing() {\n    this.editorDiv.setAttribute(\"role\", \"comment\");\n    this.editorDiv.removeAttribute(\"aria-multiline\");\n  }\n\n  /** @inheritdoc */\n  enableEditing() {\n    this.editorDiv.setAttribute(\"role\", \"textbox\");\n    this.editorDiv.setAttribute(\"aria-multiline\", true);\n  }\n\n  /** @inheritdoc */\n  get canChangeContent() {\n    return true;\n  }\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    let baseX, baseY;\n    if (this._isCopy || this.annotationElementId) {\n      baseX = this.x;\n      baseY = this.y;\n    }\n\n    super.render();\n    this.editorDiv = document.createElement(\"div\");\n    this.editorDiv.className = \"internal\";\n\n    this.editorDiv.setAttribute(\"id\", this.#editorDivId);\n    this.editorDiv.setAttribute(\"data-l10n-id\", \"pdfjs-free-text2\");\n    this.editorDiv.setAttribute(\"data-l10n-attrs\", \"default-content\");\n    this.enableEditing();\n\n    this.editorDiv.contentEditable = true;\n\n    const { style } = this.editorDiv;\n    style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`;\n    style.color = this.color;\n\n    this.div.append(this.editorDiv);\n\n    this.overlayDiv = document.createElement(\"div\");\n    this.overlayDiv.classList.add(\"overlay\", \"enabled\");\n    this.div.append(this.overlayDiv);\n\n    if (this._isCopy || this.annotationElementId) {\n      // This editor was created in using copy (ctrl+c).\n      const [parentWidth, parentHeight] = this.parentDimensions;\n      if (this.annotationElementId) {\n        // This stuff is hard to test: if something is changed here, please\n        // test with the following PDF file:\n        //  - freetexts.pdf\n        //  - rotated_freetexts.pdf\n        // Only small variations between the original annotation and its editor\n        // are allowed.\n\n        // position is the position of the first glyph in the annotation\n        // and it's relative to its container.\n        const { position } = this._initialData;\n        let [tx, ty] = this.getInitialTranslation();\n        [tx, ty] = this.pageTranslationToScreen(tx, ty);\n        const [pageWidth, pageHeight] = this.pageDimensions;\n        const [pageX, pageY] = this.pageTranslation;\n        let posX, posY;\n        switch (this.rotation) {\n          case 0:\n            posX = baseX + (position[0] - pageX) / pageWidth;\n            posY = baseY + this.height - (position[1] - pageY) / pageHeight;\n            break;\n          case 90:\n            posX = baseX + (position[0] - pageX) / pageWidth;\n            posY = baseY - (position[1] - pageY) / pageHeight;\n            [tx, ty] = [ty, -tx];\n            break;\n          case 180:\n            posX = baseX - this.width + (position[0] - pageX) / pageWidth;\n            posY = baseY - (position[1] - pageY) / pageHeight;\n            [tx, ty] = [-tx, -ty];\n            break;\n          case 270:\n            posX =\n              baseX +\n              (position[0] - pageX - this.height * pageHeight) / pageWidth;\n            posY =\n              baseY +\n              (position[1] - pageY - this.width * pageWidth) / pageHeight;\n            [tx, ty] = [-ty, tx];\n            break;\n        }\n        this.setAt(posX * parentWidth, posY * parentHeight, tx, ty);\n      } else {\n        this._moveAfterPaste(baseX, baseY);\n      }\n\n      this.#setContent();\n      this._isDraggable = true;\n      this.editorDiv.contentEditable = false;\n    } else {\n      this._isDraggable = false;\n      this.editorDiv.contentEditable = true;\n    }\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      this.div.setAttribute(\"annotation-id\", this.annotationElementId);\n    }\n\n    return this.div;\n  }\n\n  static #getNodeContent(node) {\n    return (\n      node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText\n    ).replaceAll(EOL_PATTERN, \"\");\n  }\n\n  editorDivPaste(event) {\n    const clipboardData = event.clipboardData || window.clipboardData;\n    const { types } = clipboardData;\n    if (types.length === 1 && types[0] === \"text/plain\") {\n      return;\n    }\n\n    event.preventDefault();\n    const paste = FreeTextEditor.#deserializeContent(\n      clipboardData.getData(\"text\") || \"\"\n    ).replaceAll(EOL_PATTERN, \"\\n\");\n    if (!paste) {\n      return;\n    }\n    const selection = window.getSelection();\n    if (!selection.rangeCount) {\n      return;\n    }\n    this.editorDiv.normalize();\n    selection.deleteFromDocument();\n    const range = selection.getRangeAt(0);\n    if (!paste.includes(\"\\n\")) {\n      range.insertNode(document.createTextNode(paste));\n      this.editorDiv.normalize();\n      selection.collapseToStart();\n      return;\n    }\n\n    // Collect the text before and after the caret.\n    const { startContainer, startOffset } = range;\n    const bufferBefore = [];\n    const bufferAfter = [];\n    if (startContainer.nodeType === Node.TEXT_NODE) {\n      const parent = startContainer.parentElement;\n      bufferAfter.push(\n        startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, \"\")\n      );\n      if (parent !== this.editorDiv) {\n        let buffer = bufferBefore;\n        for (const child of this.editorDiv.childNodes) {\n          if (child === parent) {\n            buffer = bufferAfter;\n            continue;\n          }\n          buffer.push(FreeTextEditor.#getNodeContent(child));\n        }\n      }\n      bufferBefore.push(\n        startContainer.nodeValue\n          .slice(0, startOffset)\n          .replaceAll(EOL_PATTERN, \"\")\n      );\n    } else if (startContainer === this.editorDiv) {\n      let buffer = bufferBefore;\n      let i = 0;\n      for (const child of this.editorDiv.childNodes) {\n        if (i++ === startOffset) {\n          buffer = bufferAfter;\n        }\n        buffer.push(FreeTextEditor.#getNodeContent(child));\n      }\n    }\n    this.#content = `${bufferBefore.join(\"\\n\")}${paste}${bufferAfter.join(\"\\n\")}`;\n    this.#setContent();\n\n    // Set the caret at the right position.\n    const newRange = new Range();\n    let beforeLength = Math.sumPrecise(bufferBefore.map(line => line.length));\n    for (const { firstChild } of this.editorDiv.childNodes) {\n      // Each child is either a div with a text node or a br element.\n      if (firstChild.nodeType === Node.TEXT_NODE) {\n        const length = firstChild.nodeValue.length;\n        if (beforeLength <= length) {\n          newRange.setStart(firstChild, beforeLength);\n          newRange.setEnd(firstChild, beforeLength);\n          break;\n        }\n        beforeLength -= length;\n      }\n    }\n    selection.removeAllRanges();\n    selection.addRange(newRange);\n  }\n\n  #setContent() {\n    this.editorDiv.replaceChildren();\n    if (!this.#content) {\n      return;\n    }\n    for (const line of this.#content.split(\"\\n\")) {\n      const div = document.createElement(\"div\");\n      div.append(\n        line ? document.createTextNode(line) : document.createElement(\"br\")\n      );\n      this.editorDiv.append(div);\n    }\n  }\n\n  #serializeContent() {\n    return this.#content.replaceAll(\"\\xa0\", \" \");\n  }\n\n  static #deserializeContent(content) {\n    return content.replaceAll(\" \", \"\\xa0\");\n  }\n\n  /** @inheritdoc */\n  get contentDiv() {\n    return this.editorDiv;\n  }\n\n  /** @inheritdoc */\n  getPDFRect() {\n    const padding = FreeTextEditor._internalPadding * this.parentScale;\n    return this.getRect(padding, padding);\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof FreeTextAnnotationElement) {\n      const {\n        data: {\n          defaultAppearanceData: { fontSize, fontColor },\n          rect,\n          rotation,\n          id,\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate,\n        },\n        textContent,\n        textPosition,\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      // textContent is supposed to be an array of strings containing each line\n      // of text. However, it can be null or empty.\n      if (!textContent?.length) {\n        // Empty annotation.\n        return null;\n      }\n      initialData = data = {\n        annotationType: AnnotationEditorType.FREETEXT,\n        color: Array.from(fontColor),\n        fontSize,\n        value: textContent.join(\"\\n\"),\n        position: textPosition,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        popupRef,\n        comment: contentsObj?.str || null,\n        richText,\n        creationDate,\n        modificationDate,\n      };\n    }\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.#fontSize = data.fontSize;\n    editor.color = Util.makeHexColor(...data.color);\n    editor.#content = FreeTextEditor.#deserializeContent(data.value);\n    editor._initialData = initialData;\n    if (data.comment) {\n      editor.setCommentData(data);\n    }\n\n    return editor;\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false) {\n    if (this.isEmpty()) {\n      return null;\n    }\n\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n\n    const color = AnnotationEditor._colorManager.convert(\n      this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.color\n    );\n    const serialized = Object.assign(super.serialize(isForCopying), {\n      color,\n      fontSize: this.#fontSize,\n      value: this.#serializeContent(),\n    });\n    this.addComment(serialized);\n\n    if (isForCopying) {\n      // Don't add the id when copying because the pasted editor mustn't be\n      // linked to an existing annotation.\n      serialized.isCopy = true;\n      return serialized;\n    }\n\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n\n    serialized.id = this.annotationElementId;\n\n    return serialized;\n  }\n\n  #hasElementChanged(serialized) {\n    const { value, fontSize, color, pageIndex } = this._initialData;\n\n    return (\n      this.hasEditedComment ||\n      this._hasBeenMoved ||\n      serialized.value !== value ||\n      serialized.fontSize !== fontSize ||\n      serialized.color.some((c, i) => c !== color[i]) ||\n      serialized.pageIndex !== pageIndex\n    );\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    const content = super.renderAnnotationElement(annotation);\n    if (!content) {\n      return null;\n    }\n    const { style } = content;\n    style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`;\n    style.color = this.color;\n\n    content.replaceChildren();\n    for (const line of this.#content.split(\"\\n\")) {\n      const div = document.createElement(\"div\");\n      div.append(\n        line ? document.createTextNode(line) : document.createElement(\"br\")\n      );\n      content.append(div);\n    }\n\n    annotation.updateEdited({\n      rect: this.getPDFRect(),\n      popup:\n        this._uiManager.hasCommentManager() || this.hasEditedComment\n          ? this.comment\n          : { text: this.#content },\n    });\n\n    return content;\n  }\n\n  resetAnnotationElement(annotation) {\n    super.resetAnnotationElement(annotation);\n    annotation.resetEdited();\n  }\n}\n\nexport { FreeTextEditor };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { unreachable } from \"../../../shared/util.js\";\n\nclass Outline {\n  static PRECISION = 1e-4;\n\n  /**\n   * @returns {string} The SVG path of the outline.\n   */\n  toSVGPath() {\n    unreachable(\"Abstract method `toSVGPath` must be implemented.\");\n  }\n\n  /**\n   * @type {Object|null} The bounding box of the outline.\n   */\n  // eslint-disable-next-line getter-return\n  get box() {\n    unreachable(\"Abstract getter `box` must be implemented.\");\n  }\n\n  serialize(_bbox, _rotation) {\n    unreachable(\"Abstract method `serialize` must be implemented.\");\n  }\n\n  static _rescale(src, tx, ty, sx, sy, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i] * sx;\n      dest[i + 1] = ty + src[i + 1] * sy;\n    }\n    return dest;\n  }\n\n  static _rescaleAndSwap(src, tx, ty, sx, sy, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i + 1] * sx;\n      dest[i + 1] = ty + src[i] * sy;\n    }\n    return dest;\n  }\n\n  static _translate(src, tx, ty, dest) {\n    dest ||= new Float32Array(src.length);\n    for (let i = 0, ii = src.length; i < ii; i += 2) {\n      dest[i] = tx + src[i];\n      dest[i + 1] = ty + src[i + 1];\n    }\n    return dest;\n  }\n\n  static svgRound(x) {\n    // 0.1234 will be 1234 and this way we economize 2 bytes per number.\n    // Of course, it makes sense only when the viewBox is [0 0 10000 10000].\n    // And it helps to avoid bugs like:\n    //  https://bugzilla.mozilla.org/show_bug.cgi?id=1929340\n    return Math.round(x * 10000);\n  }\n\n  static _normalizePoint(x, y, parentWidth, parentHeight, rotation) {\n    switch (rotation) {\n      case 90:\n        return [1 - y / parentWidth, x / parentHeight];\n      case 180:\n        return [1 - x / parentWidth, 1 - y / parentHeight];\n      case 270:\n        return [y / parentWidth, 1 - x / parentHeight];\n      default:\n        return [x / parentWidth, y / parentHeight];\n    }\n  }\n\n  static createBezierPoints(x1, y1, x2, y2, x3, y3) {\n    return [\n      (x1 + 5 * x2) / 6,\n      (y1 + 5 * y2) / 6,\n      (5 * x2 + x3) / 6,\n      (5 * y2 + y3) / 6,\n      (x2 + x3) / 2,\n      (y2 + y3) / 2,\n    ];\n  }\n}\n\nexport { Outline };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BBOX_INIT, Util } from \"../../../shared/util.js\";\nimport { Outline } from \"./outline.js\";\n\nclass FreeDrawOutliner {\n  #box;\n\n  #bottom = [];\n\n  #innerMargin;\n\n  #isLTR;\n\n  #top = [];\n\n  // The first 6 elements are the last 3 points of the top part of the outline.\n  // The next 6 elements are the last 3 points of the line.\n  // The next 6 elements are the last 3 points of the bottom part of the\n  // outline.\n  // We track the last 3 points in order to be able to:\n  //  - compute the normal of the line,\n  //  - compute the control points of the quadratic B茅zier curve.\n  #last = new Float32Array(18);\n\n  #lastX;\n\n  #lastY;\n\n  #min;\n\n  #min_dist;\n\n  #scaleFactor;\n\n  #thickness;\n\n  #points = [];\n\n  static #MIN_DIST = 8;\n\n  static #MIN_DIFF = 2;\n\n  static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF;\n\n  constructor({ x, y }, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    this.#box = box;\n    this.#thickness = thickness * scaleFactor;\n    this.#isLTR = isLTR;\n    this.#last.set([NaN, NaN, NaN, NaN, x, y], 6);\n    this.#innerMargin = innerMargin;\n    this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor;\n    this.#min = FreeDrawOutliner.#MIN * scaleFactor;\n    this.#scaleFactor = scaleFactor;\n    this.#points.push(x, y);\n  }\n\n  isEmpty() {\n    // When we add a second point then this.#last.slice(6) will be something\n    // like [NaN, NaN, firstX, firstY, secondX, secondY,...] so having a NaN\n    // at index 8 means that we've only one point.\n    return isNaN(this.#last[8]);\n  }\n\n  #getLastCoords() {\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [x, y, width, height] = this.#box;\n\n    return [\n      (this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width,\n      (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height,\n      (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width,\n      (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height,\n    ];\n  }\n\n  add({ x, y }) {\n    this.#lastX = x;\n    this.#lastY = y;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    let [x1, y1, x2, y2] = this.#last.subarray(8, 12);\n    const diffX = x - x2;\n    const diffY = y - y2;\n    const d = Math.hypot(diffX, diffY);\n    if (d < this.#min) {\n      // The idea is to avoid garbage points around the last point.\n      // When the points are too close, it just leads to bad normal vectors and\n      // control points.\n      return false;\n    }\n    const diffD = d - this.#min_dist;\n    const K = diffD / d;\n    const shiftX = K * diffX;\n    const shiftY = K * diffY;\n\n    // We update the last 3 points of the line.\n    let x0 = x1;\n    let y0 = y1;\n    x1 = x2;\n    y1 = y2;\n    x2 += shiftX;\n    y2 += shiftY;\n\n    // We keep track of the points in order to be able to compute the focus\n    // outline.\n    this.#points?.push(x, y);\n\n    // Create the normal unit vector.\n    // |(shiftX, shiftY)| = |K| * |(diffX, diffY)| = |K| * d = diffD.\n    const nX = -shiftY / diffD;\n    const nY = shiftX / diffD;\n    const thX = nX * this.#thickness;\n    const thY = nY * this.#thickness;\n    this.#last.set(this.#last.subarray(2, 8), 0);\n    this.#last.set([x2 + thX, y2 + thY], 4);\n    this.#last.set(this.#last.subarray(14, 18), 12);\n    this.#last.set([x2 - thX, y2 - thY], 16);\n\n    if (isNaN(this.#last[6])) {\n      if (this.#top.length === 0) {\n        this.#last.set([x1 + thX, y1 + thY], 2);\n        this.#top.push(\n          NaN,\n          NaN,\n          NaN,\n          NaN,\n          (x1 + thX - layerX) / layerWidth,\n          (y1 + thY - layerY) / layerHeight\n        );\n        this.#last.set([x1 - thX, y1 - thY], 14);\n        this.#bottom.push(\n          NaN,\n          NaN,\n          NaN,\n          NaN,\n          (x1 - thX - layerX) / layerWidth,\n          (y1 - thY - layerY) / layerHeight\n        );\n      }\n      this.#last.set([x0, y0, x1, y1, x2, y2], 6);\n      return !this.isEmpty();\n    }\n\n    this.#last.set([x0, y0, x1, y1, x2, y2], 6);\n\n    const angle = Math.abs(\n      Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX)\n    );\n    if (angle < Math.PI / 2) {\n      // In order to avoid some possible artifacts, we're going to use the a\n      // straight line instead of a quadratic B茅zier curve.\n      [x1, y1, x2, y2] = this.#last.subarray(2, 6);\n      this.#top.push(\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        ((x1 + x2) / 2 - layerX) / layerWidth,\n        ((y1 + y2) / 2 - layerY) / layerHeight\n      );\n      [x1, y1, x0, y0] = this.#last.subarray(14, 18);\n      this.#bottom.push(\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        ((x0 + x1) / 2 - layerX) / layerWidth,\n        ((y0 + y1) / 2 - layerY) / layerHeight\n      );\n      return true;\n    }\n\n    // Control points and the final point for the quadratic B茅zier curve.\n    [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6);\n    this.#top.push(\n      ((x0 + 5 * x1) / 6 - layerX) / layerWidth,\n      ((y0 + 5 * y1) / 6 - layerY) / layerHeight,\n      ((5 * x1 + x2) / 6 - layerX) / layerWidth,\n      ((5 * y1 + y2) / 6 - layerY) / layerHeight,\n      ((x1 + x2) / 2 - layerX) / layerWidth,\n      ((y1 + y2) / 2 - layerY) / layerHeight\n    );\n    [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18);\n    this.#bottom.push(\n      ((x0 + 5 * x1) / 6 - layerX) / layerWidth,\n      ((y0 + 5 * y1) / 6 - layerY) / layerHeight,\n      ((5 * x1 + x2) / 6 - layerX) / layerWidth,\n      ((5 * y1 + y2) / 6 - layerY) / layerHeight,\n      ((x1 + x2) / 2 - layerX) / layerWidth,\n      ((y1 + y2) / 2 - layerY) / layerHeight\n    );\n    return true;\n  }\n\n  toSVGPath() {\n    if (this.isEmpty()) {\n      // We've only one point.\n      return \"\";\n    }\n    const top = this.#top;\n    const bottom = this.#bottom;\n\n    if (isNaN(this.#last[6]) && !this.isEmpty()) {\n      // We've only two points.\n      return this.#toSVGPathTwoPoints();\n    }\n\n    const buffer = [];\n    buffer.push(`M${top[4]} ${top[5]}`);\n    for (let i = 6; i < top.length; i += 6) {\n      if (isNaN(top[i])) {\n        buffer.push(`L${top[i + 4]} ${top[i + 5]}`);\n      } else {\n        buffer.push(\n          `C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${\n            top[i + 5]\n          }`\n        );\n      }\n    }\n\n    this.#toSVGPathEnd(buffer);\n\n    for (let i = bottom.length - 6; i >= 6; i -= 6) {\n      if (isNaN(bottom[i])) {\n        buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`);\n      } else {\n        buffer.push(\n          `C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${\n            bottom[i + 4]\n          } ${bottom[i + 5]}`\n        );\n      }\n    }\n\n    this.#toSVGPathStart(buffer);\n\n    return buffer.join(\" \");\n  }\n\n  #toSVGPathTwoPoints() {\n    const [x, y, width, height] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] =\n      this.#getLastCoords();\n\n    return `M${(this.#last[2] - x) / width} ${\n      (this.#last[3] - y) / height\n    } L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${\n      (this.#last[16] - x) / width\n    } ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${\n      (this.#last[15] - y) / height\n    } Z`;\n  }\n\n  #toSVGPathStart(buffer) {\n    const bottom = this.#bottom;\n    buffer.push(`L${bottom[4]} ${bottom[5]} Z`);\n  }\n\n  #toSVGPathEnd(buffer) {\n    const [x, y, width, height] = this.#box;\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] =\n      this.#getLastCoords();\n\n    buffer.push(\n      `L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${\n        (lastBottom[0] - x) / width\n      } ${(lastBottom[1] - y) / height}`\n    );\n  }\n\n  newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    return new FreeDrawOutline(\n      outline,\n      points,\n      box,\n      scaleFactor,\n      innerMargin,\n      isLTR\n    );\n  }\n\n  getOutlines() {\n    const top = this.#top;\n    const bottom = this.#bottom;\n    const last = this.#last;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n\n    const points = new Float32Array((this.#points?.length ?? 0) + 2);\n    for (let i = 0, ii = points.length - 2; i < ii; i += 2) {\n      points[i] = (this.#points[i] - layerX) / layerWidth;\n      points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight;\n    }\n    points[points.length - 2] = (this.#lastX - layerX) / layerWidth;\n    points[points.length - 1] = (this.#lastY - layerY) / layerHeight;\n\n    if (isNaN(last[6]) && !this.isEmpty()) {\n      // We've only two points.\n      return this.#getOutlineTwoPoints(points);\n    }\n\n    const outline = new Float32Array(\n      this.#top.length + 24 + this.#bottom.length\n    );\n    let N = top.length;\n    for (let i = 0; i < N; i += 2) {\n      if (isNaN(top[i])) {\n        outline[i] = outline[i + 1] = NaN;\n        continue;\n      }\n      outline[i] = top[i];\n      outline[i + 1] = top[i + 1];\n    }\n\n    N = this.#getOutlineEnd(outline, N);\n\n    for (let i = bottom.length - 6; i >= 6; i -= 6) {\n      for (let j = 0; j < 6; j += 2) {\n        if (isNaN(bottom[i + j])) {\n          outline[N] = outline[N + 1] = NaN;\n          N += 2;\n          continue;\n        }\n        outline[N] = bottom[i + j];\n        outline[N + 1] = bottom[i + j + 1];\n        N += 2;\n      }\n    }\n\n    this.#getOutlineStart(outline, N);\n\n    return this.newFreeDrawOutline(\n      outline,\n      points,\n      this.#box,\n      this.#scaleFactor,\n      this.#innerMargin,\n      this.#isLTR\n    );\n  }\n\n  #getOutlineTwoPoints(points) {\n    const last = this.#last;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] =\n      this.#getLastCoords();\n    const outline = new Float32Array(36);\n    outline.set(\n      [\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (last[2] - layerX) / layerWidth,\n        (last[3] - layerY) / layerHeight,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (last[4] - layerX) / layerWidth,\n        (last[5] - layerY) / layerHeight,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        lastTopX,\n        lastTopY,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        lastBottomX,\n        lastBottomY,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (last[16] - layerX) / layerWidth,\n        (last[17] - layerY) / layerHeight,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (last[14] - layerX) / layerWidth,\n        (last[15] - layerY) / layerHeight,\n      ],\n      0\n    );\n    return this.newFreeDrawOutline(\n      outline,\n      points,\n      this.#box,\n      this.#scaleFactor,\n      this.#innerMargin,\n      this.#isLTR\n    );\n  }\n\n  #getOutlineStart(outline, pos) {\n    const bottom = this.#bottom;\n    outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos);\n    return (pos += 6);\n  }\n\n  #getOutlineEnd(outline, pos) {\n    const lastTop = this.#last.subarray(4, 6);\n    const lastBottom = this.#last.subarray(16, 18);\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const [lastTopX, lastTopY, lastBottomX, lastBottomY] =\n      this.#getLastCoords();\n    outline.set(\n      [\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (lastTop[0] - layerX) / layerWidth,\n        (lastTop[1] - layerY) / layerHeight,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        lastTopX,\n        lastTopY,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        lastBottomX,\n        lastBottomY,\n        NaN,\n        NaN,\n        NaN,\n        NaN,\n        (lastBottom[0] - layerX) / layerWidth,\n        (lastBottom[1] - layerY) / layerHeight,\n      ],\n      pos\n    );\n    return (pos += 24);\n  }\n}\n\nclass FreeDrawOutline extends Outline {\n  #box;\n\n  #bbox = new Float32Array(4);\n\n  #innerMargin;\n\n  #isLTR;\n\n  #points;\n\n  #scaleFactor;\n\n  #outline;\n\n  constructor(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    super();\n    this.#outline = outline;\n    this.#points = points;\n    this.#box = box;\n    this.#scaleFactor = scaleFactor;\n    this.#innerMargin = innerMargin;\n    this.#isLTR = isLTR;\n    this.firstPoint = [NaN, NaN];\n    this.lastPoint = [NaN, NaN];\n    this.#computeMinMax(isLTR);\n\n    const [x, y, width, height] = this.#bbox;\n    for (let i = 0, ii = outline.length; i < ii; i += 2) {\n      outline[i] = (outline[i] - x) / width;\n      outline[i + 1] = (outline[i + 1] - y) / height;\n    }\n    for (let i = 0, ii = points.length; i < ii; i += 2) {\n      points[i] = (points[i] - x) / width;\n      points[i + 1] = (points[i + 1] - y) / height;\n    }\n  }\n\n  toSVGPath() {\n    const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`];\n    for (let i = 6, ii = this.#outline.length; i < ii; i += 6) {\n      if (isNaN(this.#outline[i])) {\n        buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`);\n        continue;\n      }\n      buffer.push(\n        `C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${\n          this.#outline[i + 3]\n        } ${this.#outline[i + 4]} ${this.#outline[i + 5]}`\n      );\n    }\n    buffer.push(\"Z\");\n    return buffer.join(\" \");\n  }\n\n  serialize([blX, blY, trX, trY], rotation) {\n    const width = trX - blX;\n    const height = trY - blY;\n    let outline;\n    let points;\n    switch (rotation) {\n      case 0:\n        outline = Outline._rescale(this.#outline, blX, trY, width, -height);\n        points = Outline._rescale(this.#points, blX, trY, width, -height);\n        break;\n      case 90:\n        outline = Outline._rescaleAndSwap(\n          this.#outline,\n          blX,\n          blY,\n          width,\n          height\n        );\n        points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height);\n        break;\n      case 180:\n        outline = Outline._rescale(this.#outline, trX, blY, -width, height);\n        points = Outline._rescale(this.#points, trX, blY, -width, height);\n        break;\n      case 270:\n        outline = Outline._rescaleAndSwap(\n          this.#outline,\n          trX,\n          trY,\n          -width,\n          -height\n        );\n        points = Outline._rescaleAndSwap(\n          this.#points,\n          trX,\n          trY,\n          -width,\n          -height\n        );\n        break;\n    }\n    return { outline: Array.from(outline), points: [Array.from(points)] };\n  }\n\n  #computeMinMax(isLTR) {\n    const outline = this.#outline;\n    let lastX = outline[4];\n    let lastY = outline[5];\n    const minMax = [lastX, lastY, lastX, lastY];\n    let firstPointX = lastX;\n    let firstPointY = lastY;\n    let lastPointX = lastX;\n    let lastPointY = lastY;\n    const ltrCallback = isLTR ? Math.max : Math.min;\n    const bezierBbox = new Float32Array(4);\n\n    for (let i = 6, ii = outline.length; i < ii; i += 6) {\n      const x = outline[i + 4],\n        y = outline[i + 5];\n\n      if (isNaN(outline[i])) {\n        Util.pointBoundingBox(x, y, minMax);\n\n        if (firstPointY > y) {\n          firstPointX = x;\n          firstPointY = y;\n        } else if (firstPointY === y) {\n          firstPointX = ltrCallback(firstPointX, x);\n        }\n        if (lastPointY < y) {\n          lastPointX = x;\n          lastPointY = y;\n        } else if (lastPointY === y) {\n          lastPointX = ltrCallback(lastPointX, x);\n        }\n      } else {\n        bezierBbox.set(BBOX_INIT, 0);\n        Util.bezierBoundingBox(\n          lastX,\n          lastY,\n          ...outline.slice(i, i + 6),\n          bezierBbox\n        );\n        Util.rectBoundingBox(...bezierBbox, minMax);\n\n        if (firstPointY > bezierBbox[1]) {\n          firstPointX = bezierBbox[0];\n          firstPointY = bezierBbox[1];\n        } else if (firstPointY === bezierBbox[1]) {\n          firstPointX = ltrCallback(firstPointX, bezierBbox[0]);\n        }\n        if (lastPointY < bezierBbox[3]) {\n          lastPointX = bezierBbox[2];\n          lastPointY = bezierBbox[3];\n        } else if (lastPointY === bezierBbox[3]) {\n          lastPointX = ltrCallback(lastPointX, bezierBbox[2]);\n        }\n      }\n      lastX = x;\n      lastY = y;\n    }\n\n    const bbox = this.#bbox;\n    bbox[0] = minMax[0] - this.#innerMargin;\n    bbox[1] = minMax[1] - this.#innerMargin;\n    bbox[2] = minMax[2] - minMax[0] + 2 * this.#innerMargin;\n    bbox[3] = minMax[3] - minMax[1] + 2 * this.#innerMargin;\n    this.firstPoint = [firstPointX, firstPointY];\n    this.lastPoint = [lastPointX, lastPointY];\n  }\n\n  get box() {\n    return this.#bbox;\n  }\n\n  newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    return new FreeDrawOutliner(\n      point,\n      box,\n      scaleFactor,\n      thickness,\n      isLTR,\n      innerMargin\n    );\n  }\n\n  getNewOutline(thickness, innerMargin) {\n    // Build the outline of the highlight to use as the focus outline.\n    const [x, y, width, height] = this.#bbox;\n    const [layerX, layerY, layerWidth, layerHeight] = this.#box;\n    const sx = width * layerWidth;\n    const sy = height * layerHeight;\n    const tx = x * layerWidth + layerX;\n    const ty = y * layerHeight + layerY;\n    const outliner = this.newOutliner(\n      {\n        x: this.#points[0] * sx + tx,\n        y: this.#points[1] * sy + ty,\n      },\n      this.#box,\n      this.#scaleFactor,\n      thickness,\n      this.#isLTR,\n      innerMargin ?? this.#innerMargin\n    );\n    for (let i = 2; i < this.#points.length; i += 2) {\n      outliner.add({\n        x: this.#points[i] * sx + tx,\n        y: this.#points[i + 1] * sy + ty,\n      });\n    }\n    return outliner.getOutlines();\n  }\n}\n\nexport { FreeDrawOutline, FreeDrawOutliner };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BBOX_INIT, Util } from \"../../../shared/util.js\";\nimport { FreeDrawOutline, FreeDrawOutliner } from \"./freedraw.js\";\nimport { Outline } from \"./outline.js\";\n\nclass HighlightOutliner {\n  #box;\n\n  #firstPoint;\n\n  #lastPoint;\n\n  #verticalEdges = [];\n\n  #intervals = [];\n\n  /**\n   * Construct an outliner.\n   * @param {Array<Object>} boxes - An array of axis-aligned rectangles.\n   * @param {number} borderWidth - The width of the border of the boxes, it\n   *   allows to make the boxes bigger (or smaller).\n   * @param {number} innerMargin - The margin between the boxes and the\n   *   outlines. It's important to not have a null innerMargin when we want to\n   *   draw the outline else the stroked outline could be clipped because of its\n   *   width.\n   * @param {boolean} isLTR - true if we're in LTR mode. It's used to determine\n   *   the last point of the boxes.\n   */\n  constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) {\n    const minMax = BBOX_INIT.slice();\n\n    // We round the coordinates to slightly reduce the number of edges in the\n    // final outlines.\n    const NUMBER_OF_DIGITS = 4;\n    const EPSILON = 10 ** -NUMBER_OF_DIGITS;\n\n    // The coordinates of the boxes are in the page coordinate system.\n    for (const { x, y, width, height } of boxes) {\n      const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON;\n      const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON;\n      const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON;\n      const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON;\n      const left = [x1, y1, y2, true];\n      const right = [x2, y1, y2, false];\n      this.#verticalEdges.push(left, right);\n\n      Util.rectBoundingBox(x1, y1, x2, y2, minMax);\n    }\n\n    const bboxWidth = minMax[2] - minMax[0] + 2 * innerMargin;\n    const bboxHeight = minMax[3] - minMax[1] + 2 * innerMargin;\n    const shiftedMinX = minMax[0] - innerMargin;\n    const shiftedMinY = minMax[1] - innerMargin;\n    let firstPointX = isLTR ? -Infinity : Infinity;\n    let firstPointY = Infinity;\n    const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2);\n    const lastPoint = [lastEdge[0], lastEdge[2]];\n\n    // Convert the coordinates of the edges into box coordinates.\n    for (const edge of this.#verticalEdges) {\n      const [x, y1, y2, left] = edge;\n      if (!left && isLTR) {\n        if (y1 < firstPointY) {\n          firstPointY = y1;\n          firstPointX = x;\n        } else if (y1 === firstPointY) {\n          firstPointX = Math.max(firstPointX, x);\n        }\n      } else if (left && !isLTR) {\n        if (y1 < firstPointY) {\n          firstPointY = y1;\n          firstPointX = x;\n        } else if (y1 === firstPointY) {\n          firstPointX = Math.min(firstPointX, x);\n        }\n      }\n\n      edge[0] = (x - shiftedMinX) / bboxWidth;\n      edge[1] = (y1 - shiftedMinY) / bboxHeight;\n      edge[2] = (y2 - shiftedMinY) / bboxHeight;\n    }\n\n    this.#box = new Float32Array([\n      shiftedMinX,\n      shiftedMinY,\n      bboxWidth,\n      bboxHeight,\n    ]);\n    this.#firstPoint = [firstPointX, firstPointY];\n    this.#lastPoint = lastPoint;\n  }\n\n  getOutlines() {\n    // We begin to sort lexicographically the vertical edges by their abscissa,\n    // and then by their ordinate.\n    this.#verticalEdges.sort(\n      (a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]\n    );\n\n    // We're now using a sweep line algorithm to find the outlines.\n    // We start with the leftmost vertical edge, and we're going to iterate\n    // over all the vertical edges from left to right.\n    // Each time we encounter a left edge, we're going to insert the interval\n    // [y1, y2] in the set of intervals.\n    // This set of intervals is used to break the vertical edges into chunks:\n    // we only take the part of the vertical edge that isn't in the union of\n    // the intervals.\n    const outlineVerticalEdges = [];\n    for (const edge of this.#verticalEdges) {\n      if (edge[3]) {\n        // Left edge.\n        outlineVerticalEdges.push(...this.#breakEdge(edge));\n        this.#insert(edge);\n      } else {\n        // Right edge.\n        this.#remove(edge);\n        outlineVerticalEdges.push(...this.#breakEdge(edge));\n      }\n    }\n    return this.#getOutlines(outlineVerticalEdges);\n  }\n\n  #getOutlines(outlineVerticalEdges) {\n    const edges = [];\n    const allEdges = new Set();\n\n    for (const edge of outlineVerticalEdges) {\n      const [x, y1, y2] = edge;\n      edges.push([x, y1, edge], [x, y2, edge]);\n    }\n\n    // We sort lexicographically the vertices of each edge by their ordinate and\n    // by their abscissa.\n    // Every pair (v_2i, v_{2i + 1}) of vertices defines a horizontal edge.\n    // So for every vertical edge, we're going to add the two vertical edges\n    // which are connected to it through a horizontal edge.\n    edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]);\n    for (let i = 0, ii = edges.length; i < ii; i += 2) {\n      const edge1 = edges[i][2];\n      const edge2 = edges[i + 1][2];\n      edge1.push(edge2);\n      edge2.push(edge1);\n      allEdges.add(edge1);\n      allEdges.add(edge2);\n    }\n    const outlines = [];\n    let outline;\n\n    while (allEdges.size > 0) {\n      const edge = allEdges.values().next().value;\n      let [x, y1, y2, edge1, edge2] = edge;\n      allEdges.delete(edge);\n      let lastPointX = x;\n      let lastPointY = y1;\n\n      outline = [x, y2];\n      outlines.push(outline);\n\n      while (true) {\n        let e;\n        if (allEdges.has(edge1)) {\n          e = edge1;\n        } else if (allEdges.has(edge2)) {\n          e = edge2;\n        } else {\n          break;\n        }\n\n        allEdges.delete(e);\n        [x, y1, y2, edge1, edge2] = e;\n\n        if (lastPointX !== x) {\n          outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2);\n          lastPointX = x;\n        }\n        lastPointY = lastPointY === y1 ? y2 : y1;\n      }\n      outline.push(lastPointX, lastPointY);\n    }\n    return new HighlightOutline(\n      outlines,\n      this.#box,\n      this.#firstPoint,\n      this.#lastPoint\n    );\n  }\n\n  #binarySearch(y) {\n    const array = this.#intervals;\n    let start = 0;\n    let end = array.length - 1;\n\n    while (start <= end) {\n      const middle = (start + end) >> 1;\n      const y1 = array[middle][0];\n      if (y1 === y) {\n        return middle;\n      }\n      if (y1 < y) {\n        start = middle + 1;\n      } else {\n        end = middle - 1;\n      }\n    }\n    return end + 1;\n  }\n\n  #insert([, y1, y2]) {\n    const index = this.#binarySearch(y1);\n    this.#intervals.splice(index, 0, [y1, y2]);\n  }\n\n  #remove([, y1, y2]) {\n    const index = this.#binarySearch(y1);\n    for (let i = index; i < this.#intervals.length; i++) {\n      const [start, end] = this.#intervals[i];\n      if (start !== y1) {\n        break;\n      }\n      if (start === y1 && end === y2) {\n        this.#intervals.splice(i, 1);\n        return;\n      }\n    }\n    for (let i = index - 1; i >= 0; i--) {\n      const [start, end] = this.#intervals[i];\n      if (start !== y1) {\n        break;\n      }\n      if (start === y1 && end === y2) {\n        this.#intervals.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  #breakEdge(edge) {\n    const [x, y1, y2] = edge;\n    const results = [[x, y1, y2]];\n    const index = this.#binarySearch(y2);\n    for (let i = 0; i < index; i++) {\n      const [start, end] = this.#intervals[i];\n      for (let j = 0, jj = results.length; j < jj; j++) {\n        const [, y3, y4] = results[j];\n        if (end <= y3 || y4 <= start) {\n          // There is no intersection between the interval and the edge, hence\n          // we keep it as is.\n          continue;\n        }\n        if (y3 >= start) {\n          if (y4 > end) {\n            results[j][1] = end;\n          } else {\n            if (jj === 1) {\n              return [];\n            }\n            // The edge is included in the interval, hence we remove it.\n            results.splice(j, 1);\n            j--;\n            jj--;\n          }\n          continue;\n        }\n        results[j][2] = start;\n        if (y4 > end) {\n          results.push([x, end, y4]);\n        }\n      }\n    }\n    return results;\n  }\n}\n\nclass HighlightOutline extends Outline {\n  #box;\n\n  #outlines;\n\n  constructor(outlines, box, firstPoint, lastPoint) {\n    super();\n    this.#outlines = outlines;\n    this.#box = box;\n    this.firstPoint = firstPoint;\n    this.lastPoint = lastPoint;\n  }\n\n  toSVGPath() {\n    const buffer = [];\n    for (const polygon of this.#outlines) {\n      let [prevX, prevY] = polygon;\n      buffer.push(`M${prevX} ${prevY}`);\n      for (let i = 2; i < polygon.length; i += 2) {\n        const x = polygon[i];\n        const y = polygon[i + 1];\n        if (x === prevX) {\n          buffer.push(`V${y}`);\n          prevY = y;\n        } else if (y === prevY) {\n          buffer.push(`H${x}`);\n          prevX = x;\n        }\n      }\n      buffer.push(\"Z\");\n    }\n    return buffer.join(\" \");\n  }\n\n  /**\n   * Serialize the outlines into the PDF page coordinate system.\n   * @param {Array<number>} _bbox - the bounding box of the annotation.\n   * @param {number} _rotation - the rotation of the annotation.\n   * @returns {Array<Array<number>>}\n   */\n  serialize([blX, blY, trX, trY], _rotation) {\n    const outlines = [];\n    const width = trX - blX;\n    const height = trY - blY;\n    for (const outline of this.#outlines) {\n      const points = new Array(outline.length);\n      for (let i = 0; i < outline.length; i += 2) {\n        points[i] = blX + outline[i] * width;\n        points[i + 1] = trY - outline[i + 1] * height;\n      }\n      outlines.push(points);\n    }\n    return outlines;\n  }\n\n  get box() {\n    return this.#box;\n  }\n}\n\nclass FreeHighlightOutliner extends FreeDrawOutliner {\n  newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) {\n    return new FreeHighlightOutline(\n      outline,\n      points,\n      box,\n      scaleFactor,\n      innerMargin,\n      isLTR\n    );\n  }\n}\n\nclass FreeHighlightOutline extends FreeDrawOutline {\n  newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) {\n    return new FreeHighlightOutliner(\n      point,\n      box,\n      scaleFactor,\n      thickness,\n      isLTR,\n      innerMargin\n    );\n  }\n}\n\nexport { FreeHighlightOutliner, HighlightOutliner };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  shadow,\n  Util,\n} from \"../../shared/util.js\";\nimport { bindEvents, KeyboardManager } from \"./tools.js\";\nimport {\n  FreeHighlightOutliner,\n  HighlightOutliner,\n} from \"./drawers/highlight.js\";\nimport {\n  HighlightAnnotationElement,\n  InkAnnotationElement,\n} from \"../annotation_layer.js\";\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { ColorPicker } from \"./color_picker.js\";\n\n/**\n * Basic draw editor in order to generate an Highlight annotation.\n */\nclass HighlightEditor extends AnnotationEditor {\n  #anchorNode = null;\n\n  #anchorOffset = 0;\n\n  #boxes;\n\n  #clipPathId = null;\n\n  #colorPicker = null;\n\n  #focusOutlines = null;\n\n  #focusNode = null;\n\n  #focusOffset = 0;\n\n  #highlightDiv = null;\n\n  #highlightOutlines = null;\n\n  #id = null;\n\n  #isFreeHighlight = false;\n\n  #firstPoint = null;\n\n  #lastPoint = null;\n\n  #outlineId = null;\n\n  #text = \"\";\n\n  #thickness;\n\n  #methodOfCreation = \"\";\n\n  static _defaultColor = null;\n\n  static _defaultOpacity = 1;\n\n  static _defaultThickness = 12;\n\n  static _type = \"highlight\";\n\n  static _editorType = AnnotationEditorType.HIGHLIGHT;\n\n  static _freeHighlightId = -1;\n\n  static _freeHighlight = null;\n\n  static _freeHighlightClipId = \"\";\n\n  static get _keyboardManager() {\n    const proto = HighlightEditor.prototype;\n    return shadow(\n      this,\n      \"_keyboardManager\",\n      new KeyboardManager([\n        [[\"ArrowLeft\"], proto._moveCaret, { args: [0] }],\n        [[\"ArrowRight\"], proto._moveCaret, { args: [1] }],\n        [[\"ArrowUp\"], proto._moveCaret, { args: [2] }],\n        [[\"ArrowDown\"], proto._moveCaret, { args: [3] }],\n      ])\n    );\n  }\n\n  constructor(params) {\n    super({ ...params, name: \"highlightEditor\" });\n    this.color = params.color || HighlightEditor._defaultColor;\n    this.#thickness = params.thickness || HighlightEditor._defaultThickness;\n    this.opacity = params.opacity || HighlightEditor._defaultOpacity;\n    this.#boxes = params.boxes || null;\n    this.#methodOfCreation = params.methodOfCreation || \"\";\n    this.#text = params.text || \"\";\n    this._isDraggable = false;\n    this.defaultL10nId = \"pdfjs-editor-highlight-editor\";\n\n    if (params.highlightId > -1) {\n      this.#isFreeHighlight = true;\n      this.#createFreeOutlines(params);\n      this.#addToDrawLayer();\n    } else if (this.#boxes) {\n      this.#anchorNode = params.anchorNode;\n      this.#anchorOffset = params.anchorOffset;\n      this.#focusNode = params.focusNode;\n      this.#focusOffset = params.focusOffset;\n      this.#createOutlines();\n      this.#addToDrawLayer();\n      this.rotate(this.rotation);\n    }\n\n    if (!this.annotationElementId) {\n      this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.highlight);\n    }\n  }\n\n  /** @inheritdoc */\n  get telemetryInitialData() {\n    return {\n      action: \"added\",\n      type: this.#isFreeHighlight ? \"free_highlight\" : \"highlight\",\n      color: this._uiManager.getNonHCMColorName(this.color),\n      thickness: this.#thickness,\n      methodOfCreation: this.#methodOfCreation,\n    };\n  }\n\n  /** @inheritdoc */\n  get telemetryFinalData() {\n    return {\n      type: \"highlight\",\n      color: this._uiManager.getNonHCMColorName(this.color),\n    };\n  }\n\n  static computeTelemetryFinalData(data) {\n    // We want to know how many colors have been used.\n    return { numberOfColors: data.get(\"color\").size };\n  }\n\n  #createOutlines() {\n    const outliner = new HighlightOutliner(\n      this.#boxes,\n      /* borderWidth = */ 0.001\n    );\n    this.#highlightOutlines = outliner.getOutlines();\n    [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box;\n\n    const outlinerForOutline = new HighlightOutliner(\n      this.#boxes,\n      /* borderWidth = */ 0.0025,\n      /* innerMargin = */ 0.001,\n      this._uiManager.direction === \"ltr\"\n    );\n    this.#focusOutlines = outlinerForOutline.getOutlines();\n\n    const { firstPoint } = this.#highlightOutlines;\n    this.#firstPoint = [\n      (firstPoint[0] - this.x) / this.width,\n      (firstPoint[1] - this.y) / this.height,\n    ];\n    // The last point is in the pages coordinate system.\n    const { lastPoint } = this.#focusOutlines;\n    this.#lastPoint = [\n      (lastPoint[0] - this.x) / this.width,\n      (lastPoint[1] - this.y) / this.height,\n    ];\n  }\n\n  #createFreeOutlines({ highlightOutlines, highlightId, clipPathId }) {\n    this.#highlightOutlines = highlightOutlines;\n    const extraThickness = 1.5;\n    this.#focusOutlines = highlightOutlines.getNewOutline(\n      /* Slightly bigger than the highlight in order to have a little\n         space between the highlight and the outline. */\n      this.#thickness / 2 + extraThickness,\n      /* innerMargin = */ 0.0025\n    );\n\n    if (highlightId >= 0) {\n      this.#id = highlightId;\n      this.#clipPathId = clipPathId;\n      // We need to redraw the highlight because we change the coordinates to be\n      // in the box coordinate system.\n      this.parent.drawLayer.finalizeDraw(highlightId, {\n        bbox: highlightOutlines.box,\n        path: {\n          d: highlightOutlines.toSVGPath(),\n        },\n      });\n      this.#outlineId = this.parent.drawLayer.drawOutline(\n        {\n          rootClass: {\n            highlightOutline: true,\n            free: true,\n          },\n          bbox: this.#focusOutlines.box,\n          path: {\n            d: this.#focusOutlines.toSVGPath(),\n          },\n        },\n        /* mustRemoveSelfIntersections = */ true\n      );\n    } else if (this.parent) {\n      const angle = this.parent.viewport.rotation;\n      this.parent.drawLayer.updateProperties(this.#id, {\n        bbox: HighlightEditor.#rotateBbox(\n          this.#highlightOutlines.box,\n          (angle - this.rotation + 360) % 360\n        ),\n        path: {\n          d: highlightOutlines.toSVGPath(),\n        },\n      });\n      this.parent.drawLayer.updateProperties(this.#outlineId, {\n        bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle),\n        path: {\n          d: this.#focusOutlines.toSVGPath(),\n        },\n      });\n    }\n    const [x, y, width, height] = highlightOutlines.box;\n    switch (this.rotation) {\n      case 0:\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n        break;\n      case 90: {\n        const [pageWidth, pageHeight] = this.parentDimensions;\n        this.x = y;\n        this.y = 1 - x;\n        this.width = (width * pageHeight) / pageWidth;\n        this.height = (height * pageWidth) / pageHeight;\n        break;\n      }\n      case 180:\n        this.x = 1 - x;\n        this.y = 1 - y;\n        this.width = width;\n        this.height = height;\n        break;\n      case 270: {\n        const [pageWidth, pageHeight] = this.parentDimensions;\n        this.x = 1 - y;\n        this.y = x;\n        this.width = (width * pageHeight) / pageWidth;\n        this.height = (height * pageWidth) / pageHeight;\n        break;\n      }\n    }\n\n    const { firstPoint } = highlightOutlines;\n    this.#firstPoint = [\n      (firstPoint[0] - x) / width,\n      (firstPoint[1] - y) / height,\n    ];\n    const { lastPoint } = this.#focusOutlines;\n    this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height];\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    HighlightEditor._defaultColor ||=\n      uiManager.highlightColors?.values().next().value || \"#fff066\";\n  }\n\n  /** @inheritdoc */\n  static updateDefaultParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.HIGHLIGHT_COLOR:\n        HighlightEditor._defaultColor = value;\n        break;\n      case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n        HighlightEditor._defaultThickness = value;\n        break;\n    }\n  }\n\n  /** @inheritdoc */\n  translateInPage(x, y) {}\n\n  /** @inheritdoc */\n  get toolbarPosition() {\n    return this.#lastPoint;\n  }\n\n  /** @inheritdoc */\n  get commentButtonPosition() {\n    return this.#firstPoint;\n  }\n\n  /** @inheritdoc */\n  updateParams(type, value) {\n    switch (type) {\n      case AnnotationEditorParamsType.HIGHLIGHT_COLOR:\n        this.#updateColor(value);\n        break;\n      case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n        this.#updateThickness(value);\n        break;\n    }\n  }\n\n  static get defaultPropertiesToUpdate() {\n    return [\n      [\n        AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n        HighlightEditor._defaultColor,\n      ],\n      [\n        AnnotationEditorParamsType.HIGHLIGHT_THICKNESS,\n        HighlightEditor._defaultThickness,\n      ],\n    ];\n  }\n\n  /** @inheritdoc */\n  get propertiesToUpdate() {\n    return [\n      [\n        AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n        this.color || HighlightEditor._defaultColor,\n      ],\n      [\n        AnnotationEditorParamsType.HIGHLIGHT_THICKNESS,\n        this.#thickness || HighlightEditor._defaultThickness,\n      ],\n      [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight],\n    ];\n  }\n\n  /** @inheritdoc */\n  onUpdatedColor() {\n    this.parent?.drawLayer.updateProperties(this.#id, {\n      root: {\n        fill: this.color,\n        \"fill-opacity\": this.opacity,\n      },\n    });\n    this.#colorPicker?.updateColor(this.color);\n    super.onUpdatedColor();\n  }\n\n  /**\n   * Update the color and make this action undoable.\n   * @param {string} color\n   */\n  #updateColor(color) {\n    const setColorAndOpacity = (col, opa) => {\n      this.color = col;\n      this.opacity = opa;\n      this.onUpdatedColor();\n    };\n    const savedColor = this.color;\n    const savedOpacity = this.opacity;\n    this.addCommands({\n      cmd: setColorAndOpacity.bind(\n        this,\n        color,\n        HighlightEditor._defaultOpacity\n      ),\n      undo: setColorAndOpacity.bind(this, savedColor, savedOpacity),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.HIGHLIGHT_COLOR,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n\n    this._reportTelemetry(\n      {\n        action: \"color_changed\",\n        color: this._uiManager.getNonHCMColorName(color),\n      },\n      /* mustWait = */ true\n    );\n  }\n\n  /**\n   * Update the thickness and make this action undoable.\n   * @param {number} thickness\n   */\n  #updateThickness(thickness) {\n    const savedThickness = this.#thickness;\n    const setThickness = th => {\n      this.#thickness = th;\n      this.#changeThickness(th);\n    };\n    this.addCommands({\n      cmd: setThickness.bind(this, thickness),\n      undo: setThickness.bind(this, savedThickness),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.INK_THICKNESS,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n    this._reportTelemetry(\n      { action: \"thickness_changed\", thickness },\n      /* mustWait = */ true\n    );\n  }\n\n  /** @inheritdoc */\n  get toolbarButtons() {\n    if (this._uiManager.highlightColors) {\n      const colorPicker = (this.#colorPicker = new ColorPicker({\n        editor: this,\n      }));\n      return [[\"colorPicker\", colorPicker]];\n    }\n    return super.toolbarButtons;\n  }\n\n  /** @inheritdoc */\n  disableEditing() {\n    super.disableEditing();\n    this.div.classList.toggle(\"disabled\", true);\n  }\n\n  /** @inheritdoc */\n  enableEditing() {\n    super.enableEditing();\n    this.div.classList.toggle(\"disabled\", false);\n  }\n\n  /** @inheritdoc */\n  fixAndSetPosition() {\n    return super.fixAndSetPosition(this.#getRotation());\n  }\n\n  /** @inheritdoc */\n  getBaseTranslation() {\n    // The editor itself doesn't have any CSS border (we're drawing one\n    // ourselves in using SVG).\n    return [0, 0];\n  }\n\n  /** @inheritdoc */\n  getRect(tx, ty) {\n    return super.getRect(tx, ty, this.#getRotation());\n  }\n\n  /** @inheritdoc */\n  onceAdded(focus) {\n    if (!this.annotationElementId) {\n      this.parent.addUndoableEditor(this);\n    }\n    if (focus) {\n      this.div.focus();\n    }\n  }\n\n  /** @inheritdoc */\n  remove() {\n    this.#cleanDrawLayer();\n    this._reportTelemetry({\n      action: \"deleted\",\n    });\n    super.remove();\n  }\n\n  /** @inheritdoc */\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n\n    this.#addToDrawLayer();\n\n    if (!this.isAttachedToDOM) {\n      // At some point this editor was removed and we're rebuilding it,\n      // hence we must add it to its parent.\n      this.parent.add(this);\n    }\n  }\n\n  setParent(parent) {\n    let mustBeSelected = false;\n    if (this.parent && !parent) {\n      this.#cleanDrawLayer();\n    } else if (parent) {\n      this.#addToDrawLayer(parent);\n      // If mustBeSelected is true it means that this editor was selected\n      // when its parent has been destroyed, hence we must select it again.\n      mustBeSelected =\n        !this.parent && this.div?.classList.contains(\"selectedEditor\");\n    }\n    super.setParent(parent);\n    this.show(this._isVisible);\n    if (mustBeSelected) {\n      // We select it after the parent has been set.\n      this.select();\n    }\n  }\n\n  #changeThickness(thickness) {\n    if (!this.#isFreeHighlight) {\n      return;\n    }\n    this.#createFreeOutlines({\n      highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2),\n    });\n    this.fixAndSetPosition();\n    this.setDims();\n  }\n\n  #cleanDrawLayer() {\n    if (this.#id === null || !this.parent) {\n      return;\n    }\n    this.parent.drawLayer.remove(this.#id);\n    this.#id = null;\n    this.parent.drawLayer.remove(this.#outlineId);\n    this.#outlineId = null;\n  }\n\n  #addToDrawLayer(parent = this.parent) {\n    if (this.#id !== null) {\n      return;\n    }\n    ({ id: this.#id, clipPathId: this.#clipPathId } = parent.drawLayer.draw(\n      {\n        bbox: this.#highlightOutlines.box,\n        root: {\n          viewBox: \"0 0 1 1\",\n          fill: this.color,\n          \"fill-opacity\": this.opacity,\n        },\n        rootClass: {\n          highlight: true,\n          free: this.#isFreeHighlight,\n        },\n        path: {\n          d: this.#highlightOutlines.toSVGPath(),\n        },\n      },\n      /* isPathUpdatable = */ false,\n      /* hasClip = */ true\n    ));\n    this.#outlineId = parent.drawLayer.drawOutline(\n      {\n        rootClass: {\n          highlightOutline: true,\n          free: this.#isFreeHighlight,\n        },\n        bbox: this.#focusOutlines.box,\n        path: {\n          d: this.#focusOutlines.toSVGPath(),\n        },\n      },\n      /* mustRemoveSelfIntersections = */ this.#isFreeHighlight\n    );\n\n    if (this.#highlightDiv) {\n      this.#highlightDiv.style.clipPath = this.#clipPathId;\n    }\n  }\n\n  static #rotateBbox([x, y, width, height], angle) {\n    switch (angle) {\n      case 90:\n        return [1 - y - height, x, height, width];\n      case 180:\n        return [1 - x - width, 1 - y - height, width, height];\n      case 270:\n        return [y, 1 - x - width, height, width];\n    }\n    return [x, y, width, height];\n  }\n\n  /** @inheritdoc */\n  rotate(angle) {\n    // We need to rotate the svgs because of the coordinates system.\n    const { drawLayer } = this.parent;\n    let box;\n    if (this.#isFreeHighlight) {\n      angle = (angle - this.rotation + 360) % 360;\n      box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle);\n    } else {\n      // An highlight annotation is always drawn horizontally.\n      box = HighlightEditor.#rotateBbox(\n        [this.x, this.y, this.width, this.height],\n        angle\n      );\n    }\n    drawLayer.updateProperties(this.#id, {\n      bbox: box,\n      root: {\n        \"data-main-rotation\": angle,\n      },\n    });\n    drawLayer.updateProperties(this.#outlineId, {\n      bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle),\n      root: {\n        \"data-main-rotation\": angle,\n      },\n    });\n  }\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    const div = super.render();\n    if (this.#text) {\n      div.setAttribute(\"aria-label\", this.#text);\n      div.setAttribute(\"role\", \"mark\");\n    }\n    if (this.#isFreeHighlight) {\n      div.classList.add(\"free\");\n    } else {\n      this.div.addEventListener(\"keydown\", this.#keydown.bind(this), {\n        signal: this._uiManager._signal,\n      });\n    }\n    const highlightDiv = (this.#highlightDiv = document.createElement(\"div\"));\n    div.append(highlightDiv);\n    highlightDiv.setAttribute(\"aria-hidden\", \"true\");\n    highlightDiv.className = \"internal\";\n    highlightDiv.style.clipPath = this.#clipPathId;\n    this.setDims();\n\n    bindEvents(this, this.#highlightDiv, [\"pointerover\", \"pointerleave\"]);\n    this.enableEditing();\n\n    return div;\n  }\n\n  pointerover() {\n    if (!this.isSelected) {\n      this.parent?.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hovered: true,\n        },\n      });\n    }\n  }\n\n  pointerleave() {\n    if (!this.isSelected) {\n      this.parent?.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hovered: false,\n        },\n      });\n    }\n  }\n\n  #keydown(event) {\n    HighlightEditor._keyboardManager.exec(this, event);\n  }\n\n  _moveCaret(direction) {\n    this.parent.unselect(this);\n    switch (direction) {\n      case 0 /* left */:\n      case 2 /* up */:\n        this.#setCaret(/* start = */ true);\n        break;\n      case 1 /* right */:\n      case 3 /* down */:\n        this.#setCaret(/* start = */ false);\n        break;\n    }\n  }\n\n  #setCaret(start) {\n    if (!this.#anchorNode) {\n      return;\n    }\n    const selection = window.getSelection();\n    if (start) {\n      selection.setPosition(this.#anchorNode, this.#anchorOffset);\n    } else {\n      selection.setPosition(this.#focusNode, this.#focusOffset);\n    }\n  }\n\n  /** @inheritdoc */\n  select() {\n    super.select();\n    if (!this.#outlineId) {\n      return;\n    }\n    this.parent?.drawLayer.updateProperties(this.#outlineId, {\n      rootClass: {\n        hovered: false,\n        selected: true,\n      },\n    });\n  }\n\n  /** @inheritdoc */\n  unselect() {\n    super.unselect();\n    if (!this.#outlineId) {\n      return;\n    }\n    this.parent?.drawLayer.updateProperties(this.#outlineId, {\n      rootClass: {\n        selected: false,\n      },\n    });\n    if (!this.#isFreeHighlight) {\n      this.#setCaret(/* start = */ false);\n    }\n  }\n\n  /** @inheritdoc */\n  get _mustFixPosition() {\n    return !this.#isFreeHighlight;\n  }\n\n  /** @inheritdoc */\n  show(visible = this._isVisible) {\n    super.show(visible);\n    if (this.parent) {\n      this.parent.drawLayer.updateProperties(this.#id, {\n        rootClass: {\n          hidden: !visible,\n        },\n      });\n      this.parent.drawLayer.updateProperties(this.#outlineId, {\n        rootClass: {\n          hidden: !visible,\n        },\n      });\n    }\n  }\n\n  #getRotation() {\n    // Highlight annotations are always drawn horizontally but if\n    // a free highlight annotation can be rotated.\n    return this.#isFreeHighlight ? this.rotation : 0;\n  }\n\n  #serializeBoxes() {\n    if (this.#isFreeHighlight) {\n      return null;\n    }\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const [pageX, pageY] = this.pageTranslation;\n    const boxes = this.#boxes;\n    const quadPoints = new Float32Array(boxes.length * 8);\n    let i = 0;\n    for (const { x, y, width, height } of boxes) {\n      const sx = x * pageWidth + pageX;\n      const sy = (1 - y) * pageHeight + pageY;\n      // Serializes the rectangle in the Adobe Acrobat format.\n      // The rectangle's coordinates (b = bottom, t = top, L = left, R = right)\n      // are ordered as follows: tL, tR, bL, bR (bL origin).\n      quadPoints[i] = quadPoints[i + 4] = sx;\n      quadPoints[i + 1] = quadPoints[i + 3] = sy;\n      quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth;\n      quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight;\n      i += 8;\n    }\n    return quadPoints;\n  }\n\n  #serializeOutlines(rect) {\n    return this.#highlightOutlines.serialize(rect, this.#getRotation());\n  }\n\n  static startHighlighting(parent, isLTR, { target: textLayer, x, y }) {\n    const {\n      x: layerX,\n      y: layerY,\n      width: parentWidth,\n      height: parentHeight,\n    } = textLayer.getBoundingClientRect();\n\n    const ac = new AbortController();\n    const signal = parent.combinedSignal(ac);\n\n    const pointerUpCallback = e => {\n      ac.abort();\n      this.#endHighlight(parent, e);\n    };\n    window.addEventListener(\"blur\", pointerUpCallback, { signal });\n    window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n    window.addEventListener(\n      \"pointerdown\",\n      stopEvent /* Avoid to have undesired clicks during the drawing. */,\n      {\n        capture: true,\n        passive: false,\n        signal,\n      }\n    );\n    window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n\n    textLayer.addEventListener(\n      \"pointermove\",\n      this.#highlightMove.bind(this, parent),\n      { signal }\n    );\n    this._freeHighlight = new FreeHighlightOutliner(\n      { x, y },\n      [layerX, layerY, parentWidth, parentHeight],\n      parent.scale,\n      this._defaultThickness / 2,\n      isLTR,\n      /* innerMargin = */ 0.001\n    );\n    ({ id: this._freeHighlightId, clipPathId: this._freeHighlightClipId } =\n      parent.drawLayer.draw(\n        {\n          bbox: [0, 0, 1, 1],\n          root: {\n            viewBox: \"0 0 1 1\",\n            fill: this._defaultColor,\n            \"fill-opacity\": this._defaultOpacity,\n          },\n          rootClass: {\n            highlight: true,\n            free: true,\n          },\n          path: {\n            d: this._freeHighlight.toSVGPath(),\n          },\n        },\n        /* isPathUpdatable = */ true,\n        /* hasClip = */ true\n      ));\n  }\n\n  static #highlightMove(parent, event) {\n    if (this._freeHighlight.add(event)) {\n      // Redraw only if the point has been added.\n      parent.drawLayer.updateProperties(this._freeHighlightId, {\n        path: {\n          d: this._freeHighlight.toSVGPath(),\n        },\n      });\n    }\n  }\n\n  static #endHighlight(parent, event) {\n    if (!this._freeHighlight.isEmpty()) {\n      parent.createAndAddNewEditor(event, false, {\n        highlightId: this._freeHighlightId,\n        highlightOutlines: this._freeHighlight.getOutlines(),\n        clipPathId: this._freeHighlightClipId,\n        methodOfCreation: \"main_toolbar\",\n      });\n    } else {\n      parent.drawLayer.remove(this._freeHighlightId);\n    }\n    this._freeHighlightId = -1;\n    this._freeHighlight = null;\n    this._freeHighlightClipId = \"\";\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof HighlightAnnotationElement) {\n      const {\n        data: {\n          quadPoints,\n          rect,\n          rotation,\n          id,\n          color,\n          opacity,\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate,\n        },\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.HIGHLIGHT,\n        color: Array.from(color),\n        opacity,\n        quadPoints,\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        popupRef,\n        richText,\n        comment: contentsObj?.str || null,\n        creationDate,\n        modificationDate,\n      };\n    } else if (data instanceof InkAnnotationElement) {\n      const {\n        data: {\n          inkLists,\n          rect,\n          rotation,\n          id,\n          color,\n          borderStyle: { rawWidth: thickness },\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate,\n        },\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.HIGHLIGHT,\n        color: Array.from(color),\n        thickness,\n        inkLists,\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        popupRef,\n        richText,\n        comment: contentsObj?.str || null,\n        creationDate,\n        modificationDate,\n      };\n    }\n\n    const { color, quadPoints, inkLists, outlines, opacity } = data;\n    const editor = await super.deserialize(data, parent, uiManager);\n\n    editor.color = Util.makeHexColor(...color);\n    editor.opacity = opacity || 1;\n    if (inkLists) {\n      editor.#thickness = data.thickness;\n    }\n    editor._initialData = initialData;\n    if (data.comment) {\n      editor.setCommentData(data);\n    }\n\n    const [pageWidth, pageHeight] = editor.pageDimensions;\n    const [pageX, pageY] = editor.pageTranslation;\n\n    if (quadPoints) {\n      const boxes = (editor.#boxes = []);\n      for (let i = 0; i < quadPoints.length; i += 8) {\n        boxes.push({\n          x: (quadPoints[i] - pageX) / pageWidth,\n          y: 1 - (quadPoints[i + 1] - pageY) / pageHeight,\n          width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth,\n          height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight,\n        });\n      }\n      editor.#createOutlines();\n      editor.#addToDrawLayer();\n      editor.rotate(editor.rotation);\n    } else if (inkLists || outlines) {\n      editor.#isFreeHighlight = true;\n      const points = (inkLists || outlines.points)[0];\n      const point = {\n        x: points[0] - pageX,\n        y: pageHeight - (points[1] - pageY),\n      };\n      const outliner = new FreeHighlightOutliner(\n        point,\n        [0, 0, pageWidth, pageHeight],\n        1,\n        editor.#thickness / 2,\n        true,\n        0.001\n      );\n      for (let i = 0, ii = points.length; i < ii; i += 2) {\n        point.x = points[i] - pageX;\n        point.y = pageHeight - (points[i + 1] - pageY);\n        outliner.add(point);\n      }\n      const { id, clipPathId } = parent.drawLayer.draw(\n        {\n          bbox: [0, 0, 1, 1],\n          root: {\n            viewBox: \"0 0 1 1\",\n            fill: editor.color,\n            \"fill-opacity\": editor._defaultOpacity,\n          },\n          rootClass: {\n            highlight: true,\n            free: true,\n          },\n          path: {\n            d: outliner.toSVGPath(),\n          },\n        },\n        /* isPathUpdatable = */ true,\n        /* hasClip = */ true\n      );\n      editor.#createFreeOutlines({\n        highlightOutlines: outliner.getOutlines(),\n        highlightId: id,\n        clipPathId,\n      });\n      editor.#addToDrawLayer();\n      editor.rotate(editor.parentRotation);\n    }\n\n    return editor;\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false) {\n    // It doesn't make sense to copy/paste a highlight annotation.\n    if (this.isEmpty() || isForCopying) {\n      return null;\n    }\n\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n\n    const color = AnnotationEditor._colorManager.convert(\n      this._uiManager.getNonHCMColor(this.color)\n    );\n    const serialized = super.serialize(isForCopying);\n    Object.assign(serialized, {\n      color,\n      opacity: this.opacity,\n      thickness: this.#thickness,\n      quadPoints: this.#serializeBoxes(),\n      outlines: this.#serializeOutlines(serialized.rect),\n    });\n    this.addComment(serialized);\n\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n\n    serialized.id = this.annotationElementId;\n    return serialized;\n  }\n\n  #hasElementChanged(serialized) {\n    const { color } = this._initialData;\n    return (\n      this.hasEditedComment || serialized.color.some((c, i) => c !== color[i])\n    );\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    if (this.deleted) {\n      annotation.hide();\n      return null;\n    }\n    annotation.updateEdited({\n      rect: this.getPDFRect(),\n      popup: this.comment,\n    });\n\n    return null;\n  }\n\n  static canCreateNewEmptyEditor() {\n    return false;\n  }\n}\n\nexport { HighlightEditor };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationEditorParamsType, unreachable } from \"../../shared/util.js\";\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { CurrentPointers } from \"./tools.js\";\n\nclass DrawingOptions {\n  #svgProperties = Object.create(null);\n\n  updateProperty(name, value) {\n    this[name] = value;\n    this.updateSVGProperty(name, value);\n  }\n\n  updateProperties(properties) {\n    if (!properties) {\n      return;\n    }\n    for (const [name, value] of Object.entries(properties)) {\n      if (!name.startsWith(\"_\")) {\n        this.updateProperty(name, value);\n      }\n    }\n  }\n\n  updateSVGProperty(name, value) {\n    this.#svgProperties[name] = value;\n  }\n\n  toSVGProperties() {\n    const root = this.#svgProperties;\n    this.#svgProperties = Object.create(null);\n    return { root };\n  }\n\n  reset() {\n    this.#svgProperties = Object.create(null);\n  }\n\n  updateAll(options = this) {\n    this.updateProperties(options);\n  }\n\n  clone() {\n    unreachable(\"Not implemented\");\n  }\n}\n\n/**\n * Basic draw editor.\n */\nclass DrawingEditor extends AnnotationEditor {\n  #drawOutlines = null;\n\n  #mustBeCommitted;\n\n  _colorPicker = null;\n\n  _drawId = null;\n\n  static _currentDrawId = -1;\n\n  static _currentParent = null;\n\n  static #currentDraw = null;\n\n  static #currentDrawingAC = null;\n\n  static #currentDrawingOptions = null;\n\n  static _INNER_MARGIN = 3;\n\n  constructor(params) {\n    super(params);\n    this.#mustBeCommitted = params.mustBeCommitted || false;\n\n    this._addOutlines(params);\n  }\n\n  /** @inheritdoc */\n  onUpdatedColor() {\n    this._colorPicker?.update(this.color);\n    super.onUpdatedColor();\n  }\n\n  /** @inheritdoc */\n  onUpdatedOpacity() {\n    this._colorPicker?.updateOpacity?.(this.opacity);\n  }\n\n  _addOutlines(params) {\n    if (params.drawOutlines) {\n      this.#createDrawOutlines(params);\n      this.#addToDrawLayer();\n    }\n  }\n\n  #createDrawOutlines({ drawOutlines, drawId, drawingOptions }) {\n    this.#drawOutlines = drawOutlines;\n    this._drawingOptions ||= drawingOptions;\n    if (!this.annotationElementId) {\n      this._uiManager.a11yAlert(AnnotationEditor._l10nAlert[this.editorType]);\n    }\n\n    if (drawId >= 0) {\n      this._drawId = drawId;\n      // We need to redraw the drawing because we changed the coordinates to be\n      // in the box coordinate system.\n      this.parent.drawLayer.finalizeDraw(\n        drawId,\n        drawOutlines.defaultProperties\n      );\n    } else {\n      // We create a new drawing.\n      this._drawId = this.#createDrawing(drawOutlines, this.parent);\n    }\n\n    this.#updateBbox(drawOutlines.box);\n  }\n\n  #createDrawing(drawOutlines, parent) {\n    const { id } = parent.drawLayer.draw(\n      DrawingEditor._mergeSVGProperties(\n        this._drawingOptions.toSVGProperties(),\n        drawOutlines.defaultSVGProperties\n      ),\n      /* isPathUpdatable = */ false,\n      /* hasClip = */ false\n    );\n    return id;\n  }\n\n  static _mergeSVGProperties(p1, p2) {\n    const p1Keys = new Set(Object.keys(p1));\n\n    for (const [key, value] of Object.entries(p2)) {\n      if (p1Keys.has(key)) {\n        Object.assign(p1[key], value);\n      } else {\n        p1[key] = value;\n      }\n    }\n    return p1;\n  }\n\n  /**\n   * @param {Object} options\n   * @return {DrawingOptions} the default options to use for a new editor.\n   */\n  static getDefaultDrawingOptions(_options) {\n    unreachable(\"Not implemented\");\n  }\n\n  /**\n   * @return {Map<AnnotationEditorParamsType, string>} a map between the\n   *   parameter types and the name of the options.\n   */\n  // eslint-disable-next-line getter-return\n  static get typesMap() {\n    unreachable(\"Not implemented\");\n  }\n\n  static get isDrawer() {\n    return true;\n  }\n\n  /**\n   * @returns {boolean} `true` if several drawings can be added to the\n   * annotation.\n   */\n  static get supportMultipleDrawings() {\n    return false;\n  }\n\n  /** @inheritdoc */\n  static updateDefaultParams(type, value) {\n    const propertyName = this.typesMap.get(type);\n    if (propertyName) {\n      this._defaultDrawingOptions.updateProperty(propertyName, value);\n    }\n    if (this._currentParent) {\n      DrawingEditor.#currentDraw.updateProperty(propertyName, value);\n      this._currentParent.drawLayer.updateProperties(\n        this._currentDrawId,\n        this._defaultDrawingOptions.toSVGProperties()\n      );\n    }\n  }\n\n  /** @inheritdoc */\n  updateParams(type, value) {\n    const propertyName = this.constructor.typesMap.get(type);\n    if (propertyName) {\n      this._updateProperty(type, propertyName, value);\n    }\n  }\n\n  /** @inheritdoc */\n  static get defaultPropertiesToUpdate() {\n    const properties = [];\n    const options = this._defaultDrawingOptions;\n    for (const [type, name] of this.typesMap) {\n      properties.push([type, options[name]]);\n    }\n    return properties;\n  }\n\n  /** @inheritdoc */\n  get propertiesToUpdate() {\n    const properties = [];\n    const { _drawingOptions } = this;\n    for (const [type, name] of this.constructor.typesMap) {\n      properties.push([type, _drawingOptions[name]]);\n    }\n    return properties;\n  }\n\n  /**\n   * Update a property and make this action undoable.\n   * @param {string} color\n   */\n  _updateProperty(type, name, value) {\n    const options = this._drawingOptions;\n    const savedValue = options[name];\n    const setter = val => {\n      options.updateProperty(name, val);\n      const bbox = this.#drawOutlines.updateProperty(name, val);\n      if (bbox) {\n        this.#updateBbox(bbox);\n      }\n      this.parent?.drawLayer.updateProperties(\n        this._drawId,\n        options.toSVGProperties()\n      );\n      if (type === this.colorType) {\n        this.onUpdatedColor();\n      } else if (type === this.opacityType) {\n        this.onUpdatedOpacity();\n      }\n    };\n    this.addCommands({\n      cmd: setter.bind(this, value),\n      undo: setter.bind(this, savedValue),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n  }\n\n  /**\n   * Update color and opacity atomically as one undoable command.\n   */\n  _updateColorAndOpacity(color, opacity) {\n    const colorName = this.constructor.typesMap.get(this.colorType);\n    const opacityName = this.constructor.typesMap.get(this.opacityType);\n    const options = this._drawingOptions;\n    const savedColor = options[colorName];\n    const savedOpacity = options[opacityName];\n    const setter = (c, op) => {\n      options.updateProperty(colorName, c);\n      options.updateProperty(opacityName, op);\n      this.#drawOutlines.updateProperty(colorName, c);\n      this.#drawOutlines.updateProperty(opacityName, op);\n      this.parent?.drawLayer.updateProperties(\n        this._drawId,\n        options.toSVGProperties()\n      );\n      this.onUpdatedColor();\n      this.onUpdatedOpacity();\n    };\n    this.addCommands({\n      cmd: setter.bind(this, color, opacity),\n      undo: setter.bind(this, savedColor, savedOpacity),\n      post: this._uiManager.updateUI.bind(this._uiManager, this),\n      mustExec: true,\n      type: AnnotationEditorParamsType.INK_COLOR_AND_OPACITY,\n      overwriteIfSameType: true,\n      keepUndo: true,\n    });\n  }\n\n  /** @inheritdoc */\n  _onResizing() {\n    this.parent?.drawLayer.updateProperties(\n      this._drawId,\n      DrawingEditor._mergeSVGProperties(\n        this.#drawOutlines.getPathResizingSVGProperties(\n          this.#convertToDrawSpace()\n        ),\n        {\n          bbox: this.#rotateBox(),\n        }\n      )\n    );\n  }\n\n  /** @inheritdoc */\n  _onResized() {\n    this.parent?.drawLayer.updateProperties(\n      this._drawId,\n      DrawingEditor._mergeSVGProperties(\n        this.#drawOutlines.getPathResizedSVGProperties(\n          this.#convertToDrawSpace()\n        ),\n        {\n          bbox: this.#rotateBox(),\n        }\n      )\n    );\n  }\n\n  /** @inheritdoc */\n  _onTranslating(_x, _y) {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      bbox: this.#rotateBox(),\n    });\n  }\n\n  /** @inheritdoc */\n  _onTranslated() {\n    this.parent?.drawLayer.updateProperties(\n      this._drawId,\n      DrawingEditor._mergeSVGProperties(\n        this.#drawOutlines.getPathTranslatedSVGProperties(\n          this.#convertToDrawSpace(),\n          this.parentDimensions\n        ),\n        {\n          bbox: this.#rotateBox(),\n        }\n      )\n    );\n  }\n\n  _onStartDragging() {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      rootClass: {\n        moving: true,\n      },\n    });\n  }\n\n  _onStopDragging() {\n    this.parent?.drawLayer.updateProperties(this._drawId, {\n      rootClass: {\n        moving: false,\n      },\n    });\n  }\n\n  /** @inheritdoc */\n  commit() {\n    super.commit();\n\n    this.disableEditMode();\n    this.disableEditing();\n  }\n\n  /** @inheritdoc */\n  disableEditing() {\n    super.disableEditing();\n    this.div.classList.toggle(\"disabled\", true);\n  }\n\n  /** @inheritdoc */\n  enableEditing() {\n    super.enableEditing();\n    this.div.classList.toggle(\"disabled\", false);\n  }\n\n  /** @inheritdoc */\n  getBaseTranslation() {\n    // The editor itself doesn't have any CSS border (we're drawing one\n    // ourselves in using SVG).\n    return [0, 0];\n  }\n\n  /** @inheritdoc */\n  get isResizable() {\n    return true;\n  }\n\n  /** @inheritdoc */\n  onceAdded(focus) {\n    if (!this.annotationElementId) {\n      this.parent.addUndoableEditor(this);\n    }\n    this._isDraggable = true;\n    if (this.#mustBeCommitted) {\n      this.#mustBeCommitted = false;\n      this.commit();\n      this.parent.setSelected(this);\n      if (focus && this.isOnScreen) {\n        this.div.focus();\n      }\n    }\n  }\n\n  /** @inheritdoc */\n  remove() {\n    this.#cleanDrawLayer();\n    super.remove();\n  }\n\n  /** @inheritdoc */\n  rebuild() {\n    if (!this.parent) {\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n\n    this.#addToDrawLayer();\n    this.#updateBbox(this.#drawOutlines.box);\n\n    if (!this.isAttachedToDOM) {\n      // At some point this editor was removed and we're rebuilding it,\n      // hence we must add it to its parent.\n      this.parent.add(this);\n    }\n  }\n\n  setParent(parent) {\n    let mustBeSelected = false;\n    if (this.parent && !parent) {\n      this._uiManager.removeShouldRescale(this);\n      this.#cleanDrawLayer();\n    } else if (parent) {\n      this._uiManager.addShouldRescale(this);\n      this.#addToDrawLayer(parent);\n      // If mustBeSelected is true it means that this editor was selected\n      // when its parent has been destroyed, hence we must select it again.\n      mustBeSelected =\n        !this.parent && this.div?.classList.contains(\"selectedEditor\");\n    }\n    super.setParent(parent);\n    if (mustBeSelected) {\n      // We select it after the parent has been set.\n      this.select();\n    }\n  }\n\n  #cleanDrawLayer() {\n    if (this._drawId === null || !this.parent) {\n      return;\n    }\n    this.parent.drawLayer.remove(this._drawId);\n    this._drawId = null;\n\n    // All the SVG properties must be reset in order to make it possible to\n    // undo.\n    this._drawingOptions.reset();\n  }\n\n  #addToDrawLayer(parent = this.parent) {\n    if (this._drawId !== null && this.parent === parent) {\n      return;\n    }\n    if (this._drawId !== null) {\n      // The parent has changed, we need to move the drawing to the new parent.\n      this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer);\n      return;\n    }\n    this._drawingOptions.updateAll();\n    this._drawId = this.#createDrawing(this.#drawOutlines, parent);\n  }\n\n  #convertToParentSpace([x, y, width, height]) {\n    const {\n      parentDimensions: [pW, pH],\n      rotation,\n    } = this;\n    switch (rotation) {\n      case 90:\n        return [y, 1 - x, width * (pH / pW), height * (pW / pH)];\n      case 180:\n        return [1 - x, 1 - y, width, height];\n      case 270:\n        return [1 - y, x, width * (pH / pW), height * (pW / pH)];\n      default:\n        return [x, y, width, height];\n    }\n  }\n\n  #convertToDrawSpace() {\n    const {\n      x,\n      y,\n      width,\n      height,\n      parentDimensions: [pW, pH],\n      rotation,\n    } = this;\n    switch (rotation) {\n      case 90:\n        return [1 - y, x, width * (pW / pH), height * (pH / pW)];\n      case 180:\n        return [1 - x, 1 - y, width, height];\n      case 270:\n        return [y, 1 - x, width * (pW / pH), height * (pH / pW)];\n      default:\n        return [x, y, width, height];\n    }\n  }\n\n  #updateBbox(bbox) {\n    [this.x, this.y, this.width, this.height] =\n      this.#convertToParentSpace(bbox);\n    if (this.div) {\n      this.fixAndSetPosition();\n      this.setDims();\n    }\n    this._onResized();\n  }\n\n  #rotateBox() {\n    // We've to deal with two rotations: the rotation of the annotation and the\n    // rotation of the parent page.\n    // When the page is rotated, all the layers are just rotated thanks to CSS\n    // but there is a notable exception: the canvas wrapper.\n    // The canvas wrapper is not rotated but the dimensions are (or not) swapped\n    // and the page is redrawn with the rotation applied to the canvas.\n    // The drawn layer is under the canvas wrapper and is not rotated so we have\n    // to \"manually\" rotate the coordinates.\n    //\n    // The coordinates (this.x, this.y) correspond to the top-left corner of\n    // the editor after it has been rotated in the page coordinate system.\n\n    const {\n      x,\n      y,\n      width,\n      height,\n      rotation,\n      parentRotation,\n      parentDimensions: [pW, pH],\n    } = this;\n    switch ((rotation * 4 + parentRotation) / 90) {\n      case 1:\n        // 0 -> 90\n        return [1 - y - height, x, height, width];\n      case 2:\n        // 0 -> 180\n        return [1 - x - width, 1 - y - height, width, height];\n      case 3:\n        // 0 -> 270\n        return [y, 1 - x - width, height, width];\n      case 4:\n        // 90 -> 0\n        return [\n          x,\n          y - width * (pW / pH),\n          height * (pH / pW),\n          width * (pW / pH),\n        ];\n      case 5:\n        // 90 -> 90\n        return [1 - y, x, width * (pW / pH), height * (pH / pW)];\n      case 6:\n        // 90 -> 180\n        return [\n          1 - x - height * (pH / pW),\n          1 - y,\n          height * (pH / pW),\n          width * (pW / pH),\n        ];\n      case 7:\n        // 90 -> 270\n        return [\n          y - width * (pW / pH),\n          1 - x - height * (pH / pW),\n          width * (pW / pH),\n          height * (pH / pW),\n        ];\n      case 8:\n        // 180 -> 0\n        return [x - width, y - height, width, height];\n      case 9:\n        // 180 -> 90\n        return [1 - y, x - width, height, width];\n      case 10:\n        // 180 -> 180\n        return [1 - x, 1 - y, width, height];\n      case 11:\n        // 180 -> 270\n        return [y - height, 1 - x, height, width];\n      case 12:\n        // 270 -> 0\n        return [\n          x - height * (pH / pW),\n          y,\n          height * (pH / pW),\n          width * (pW / pH),\n        ];\n      case 13:\n        // 270 -> 90\n        return [\n          1 - y - width * (pW / pH),\n          x - height * (pH / pW),\n          width * (pW / pH),\n          height * (pH / pW),\n        ];\n      case 14:\n        // 270 -> 180\n        return [\n          1 - x,\n          1 - y - width * (pW / pH),\n          height * (pH / pW),\n          width * (pW / pH),\n        ];\n      case 15:\n        // 270 -> 270\n        return [y, 1 - x, width * (pW / pH), height * (pH / pW)];\n      default:\n        // 0 -> 0\n        return [x, y, width, height];\n    }\n  }\n\n  /** @inheritdoc */\n  rotate() {\n    if (!this.parent) {\n      return;\n    }\n    this.parent.drawLayer.updateProperties(\n      this._drawId,\n      DrawingEditor._mergeSVGProperties(\n        {\n          bbox: this.#rotateBox(),\n        },\n        this.#drawOutlines.updateRotation(\n          (this.parentRotation - this.rotation + 360) % 360\n        )\n      )\n    );\n  }\n\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    this.#updateBbox(\n      this.#drawOutlines.updateParentDimensions(\n        this.parentDimensions,\n        this.parent.scale\n      )\n    );\n  }\n\n  static onScaleChangingWhenDrawing() {}\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    let baseX, baseY;\n    if (this._isCopy) {\n      baseX = this.x;\n      baseY = this.y;\n    }\n\n    const div = super.render();\n    div.classList.add(\"draw\");\n\n    const drawDiv = document.createElement(\"div\");\n    div.append(drawDiv);\n    drawDiv.setAttribute(\"aria-hidden\", \"true\");\n    drawDiv.className = \"internal\";\n    this.setDims();\n    this._uiManager.addShouldRescale(this);\n    this.disableEditing();\n\n    if (this._isCopy) {\n      this._moveAfterPaste(baseX, baseY);\n    }\n\n    return div;\n  }\n\n  /**\n   * Create a new drawer instance.\n   * @param {number} x - The x coordinate of the event.\n   * @param {number} y - The y coordinate of the event.\n   * @param {number} parentWidth - The parent width.\n   * @param {number} parentHeight - The parent height.\n   * @param {number} rotation - The parent rotation.\n   */\n  static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) {\n    unreachable(\"Not implemented\");\n  }\n\n  static startDrawing(parent, uiManager, _isLTR, event) {\n    // The pointerType of CurrentPointer is set when the user starts an empty\n    // drawing session. If, in the same drawing session, the user starts using a\n    // different type of pointer (e.g. a pen and then a finger), we just return.\n    //\n    // If the user starts to draw with a finger and then uses a second finger,\n    // we just stop the current drawing and let the user zoom the document.\n\n    const { target, offsetX: x, offsetY: y, pointerId, pointerType } = event;\n    if (CurrentPointers.isInitializedAndDifferentPointerType(pointerType)) {\n      return;\n    }\n\n    const {\n      viewport: { rotation },\n    } = parent;\n    const { width: parentWidth, height: parentHeight } =\n      target.getBoundingClientRect();\n\n    const ac = (DrawingEditor.#currentDrawingAC = new AbortController());\n    const signal = parent.combinedSignal(ac);\n\n    CurrentPointers.setPointer(pointerType, pointerId);\n\n    window.addEventListener(\n      \"pointerup\",\n      e => {\n        if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) {\n          this._endDraw(e);\n        }\n      },\n      { signal }\n    );\n    window.addEventListener(\n      \"pointercancel\",\n      e => {\n        if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) {\n          this._currentParent.endDrawingSession();\n        }\n      },\n      { signal }\n    );\n    window.addEventListener(\n      \"pointerdown\",\n      e => {\n        if (!CurrentPointers.isSamePointerType(e.pointerType)) {\n          // For example, we started with a pen and the user\n          // is now using a finger.\n          return;\n        }\n\n        // For example, the user is using a second finger.\n        CurrentPointers.initializeAndAddPointerId(e.pointerId);\n\n        // The first finger created a first point and a second finger just\n        // started, so we stop the drawing and remove this only point.\n        if (DrawingEditor.#currentDraw.isCancellable()) {\n          DrawingEditor.#currentDraw.removeLastElement();\n          if (DrawingEditor.#currentDraw.isEmpty()) {\n            this._currentParent.endDrawingSession(/* isAborted = */ true);\n          } else {\n            this._endDraw(null);\n          }\n        }\n      },\n      {\n        capture: true,\n        passive: false,\n        signal,\n      }\n    );\n    window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    target.addEventListener(\"pointermove\", this._drawMove.bind(this), {\n      signal,\n    });\n    target.addEventListener(\n      \"touchmove\",\n      e => {\n        if (CurrentPointers.isSameTimeStamp(e.timeStamp)) {\n          // This move event is used to draw so we don't want to scroll.\n          stopEvent(e);\n        }\n      },\n      { signal }\n    );\n    parent.toggleDrawing();\n    uiManager._editorUndoBar?.hide();\n\n    if (DrawingEditor.#currentDraw) {\n      parent.drawLayer.updateProperties(\n        this._currentDrawId,\n        DrawingEditor.#currentDraw.startNew(\n          x,\n          y,\n          parentWidth,\n          parentHeight,\n          rotation\n        )\n      );\n      return;\n    }\n\n    uiManager.updateUIForDefaultProperties(this);\n\n    DrawingEditor.#currentDraw = this.createDrawerInstance(\n      x,\n      y,\n      parentWidth,\n      parentHeight,\n      rotation\n    );\n    DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions();\n    this._currentParent = parent;\n\n    ({ id: this._currentDrawId } = parent.drawLayer.draw(\n      this._mergeSVGProperties(\n        DrawingEditor.#currentDrawingOptions.toSVGProperties(),\n        DrawingEditor.#currentDraw.defaultSVGProperties\n      ),\n      /* isPathUpdatable = */ true,\n      /* hasClip = */ false\n    ));\n  }\n\n  static _drawMove(event) {\n    CurrentPointers.isSameTimeStamp(event.timeStamp);\n    if (!DrawingEditor.#currentDraw) {\n      return;\n    }\n    const { offsetX, offsetY, pointerId } = event;\n\n    if (!CurrentPointers.isSamePointerId(pointerId)) {\n      return;\n    }\n    if (CurrentPointers.isUsingMultiplePointers()) {\n      // The user is using multiple fingers and the first one is moving.\n      this._endDraw(event);\n      return;\n    }\n    this._currentParent.drawLayer.updateProperties(\n      this._currentDrawId,\n      DrawingEditor.#currentDraw.add(offsetX, offsetY)\n    );\n    // We track the timestamp to know if the touchmove event is used to draw.\n    CurrentPointers.setTimeStamp(event.timeStamp);\n    stopEvent(event);\n  }\n\n  static _cleanup(all) {\n    if (all) {\n      this._currentDrawId = -1;\n      this._currentParent = null;\n      DrawingEditor.#currentDraw = null;\n      DrawingEditor.#currentDrawingOptions = null;\n      CurrentPointers.clearTimeStamp();\n    }\n\n    if (DrawingEditor.#currentDrawingAC) {\n      DrawingEditor.#currentDrawingAC.abort();\n      DrawingEditor.#currentDrawingAC = null;\n      CurrentPointers.clearPointerIds();\n    }\n  }\n\n  static _endDraw(event) {\n    const parent = this._currentParent;\n    if (!parent) {\n      return;\n    }\n\n    parent.toggleDrawing(true);\n    this._cleanup(false);\n\n    if (event?.target === parent.div) {\n      parent.drawLayer.updateProperties(\n        this._currentDrawId,\n        DrawingEditor.#currentDraw.end(event.offsetX, event.offsetY)\n      );\n    }\n    if (this.supportMultipleDrawings) {\n      const draw = DrawingEditor.#currentDraw;\n      const drawId = this._currentDrawId;\n      const lastElement = draw.getLastElement();\n      parent.addCommands({\n        cmd: () => {\n          parent.drawLayer.updateProperties(\n            drawId,\n            draw.setLastElement(lastElement)\n          );\n        },\n        undo: () => {\n          parent.drawLayer.updateProperties(drawId, draw.removeLastElement());\n        },\n        mustExec: false,\n        type: AnnotationEditorParamsType.DRAW_STEP,\n      });\n\n      return;\n    }\n\n    this.endDrawing(/* isAborted = */ false);\n  }\n\n  static endDrawing(isAborted) {\n    const parent = this._currentParent;\n    if (!parent) {\n      return null;\n    }\n    parent.toggleDrawing(true);\n    parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP);\n\n    if (!DrawingEditor.#currentDraw.isEmpty()) {\n      const {\n        pageDimensions: [pageWidth, pageHeight],\n        scale,\n      } = parent;\n\n      const editor = parent.createAndAddNewEditor(\n        { offsetX: 0, offsetY: 0 },\n        false,\n        {\n          drawId: this._currentDrawId,\n          drawOutlines: DrawingEditor.#currentDraw.getOutlines(\n            pageWidth * scale,\n            pageHeight * scale,\n            scale,\n            this._INNER_MARGIN\n          ),\n          drawingOptions: DrawingEditor.#currentDrawingOptions,\n          mustBeCommitted: !isAborted,\n        }\n      );\n      this._cleanup(true);\n      return editor;\n    }\n\n    parent.drawLayer.remove(this._currentDrawId);\n    this._cleanup(true);\n    return null;\n  }\n\n  /**\n   * Create the drawing options.\n   * @param {Object} _data\n   */\n  createDrawingOptions(_data) {}\n\n  /**\n   * Deserialize the drawing outlines.\n   * @param {number} pageX - The x coordinate of the page.\n   * @param {number} pageY - The y coordinate of the page.\n   * @param {number} pageWidth - The width of the page.\n   * @param {number} pageHeight - The height of the page.\n   * @param {number} innerWidth - The inner width.\n   * @param {Object} data - The data to deserialize.\n   * @returns {Object} The deserialized outlines.\n   */\n  static deserializeDraw(\n    _pageX,\n    _pageY,\n    _pageWidth,\n    _pageHeight,\n    _innerWidth,\n    _data\n  ) {\n    unreachable(\"Not implemented\");\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    const {\n      rawDims: { pageWidth, pageHeight, pageX, pageY },\n    } = parent.viewport;\n    const drawOutlines = this.deserializeDraw(\n      pageX,\n      pageY,\n      pageWidth,\n      pageHeight,\n      this._INNER_MARGIN,\n      data\n    );\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.createDrawingOptions(data);\n    editor.#createDrawOutlines({ drawOutlines });\n    editor.#addToDrawLayer();\n    editor.onScaleChanging();\n    editor.rotate();\n\n    return editor;\n  }\n\n  serializeDraw(isForCopying) {\n    const [pageX, pageY] = this.pageTranslation;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    return this.#drawOutlines.serialize(\n      [pageX, pageY, pageWidth, pageHeight],\n      isForCopying\n    );\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    annotation.updateEdited({\n      rect: this.getPDFRect(),\n    });\n\n    return null;\n  }\n\n  static canCreateNewEmptyEditor() {\n    return false;\n  }\n}\n\nexport { DrawingEditor, DrawingOptions };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { F32_BBOX_INIT, Util } from \"../../../shared/util.js\";\nimport { MathClamp } from \"../../../shared/math_clamp.js\";\nimport { Outline } from \"./outline.js\";\n\nclass InkDrawOutliner {\n  // The last 3 points of the line.\n  #last = new Float64Array(6);\n\n  #line;\n\n  #lines;\n\n  #rotation;\n\n  #thickness;\n\n  #points;\n\n  #lastSVGPath = \"\";\n\n  #lastIndex = 0;\n\n  #outlines = new InkDrawOutline();\n\n  #parentWidth;\n\n  #parentHeight;\n\n  constructor(x, y, parentWidth, parentHeight, rotation, thickness) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#rotation = rotation;\n    this.#thickness = thickness;\n\n    [x, y] = this.#normalizePoint(x, y);\n\n    const line = (this.#line = [NaN, NaN, NaN, NaN, x, y]);\n    this.#points = [x, y];\n    this.#lines = [{ line, points: this.#points }];\n    this.#last.set(line, 0);\n  }\n\n  updateProperty(name, value) {\n    if (name === \"stroke-width\") {\n      this.#thickness = value;\n    }\n  }\n\n  #normalizePoint(x, y) {\n    return Outline._normalizePoint(\n      x,\n      y,\n      this.#parentWidth,\n      this.#parentHeight,\n      this.#rotation\n    );\n  }\n\n  isEmpty() {\n    return !this.#lines?.length;\n  }\n\n  isCancellable() {\n    // The user a second finger after drawing 5 points: it's small enough\n    // to not be a real drawing.\n    return this.#points.length <= 10;\n  }\n\n  add(x, y) {\n    // The point is in canvas coordinates which means that there is no rotation.\n    // It's the same as parent coordinates.\n    [x, y] = this.#normalizePoint(x, y);\n    const [x1, y1, x2, y2] = this.#last.subarray(2, 6);\n    const diffX = x - x2;\n    const diffY = y - y2;\n    const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY);\n    if (d <= 2) {\n      // The idea is to avoid garbage points around the last point.\n      // When the points are too close, it just leads to bad normal vectors and\n      // control points.\n      return null;\n    }\n\n    this.#points.push(x, y);\n\n    if (isNaN(x1)) {\n      // We've only one point.\n      this.#last.set([x2, y2, x, y], 2);\n      this.#line.push(NaN, NaN, NaN, NaN, x, y);\n      return {\n        path: {\n          d: this.toSVGPath(),\n        },\n      };\n    }\n\n    if (isNaN(this.#last[0])) {\n      // We've only two points.\n      this.#line.splice(6, 6);\n    }\n\n    this.#last.set([x1, y1, x2, y2, x, y], 0);\n    this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y));\n\n    return {\n      path: {\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  end(x, y) {\n    const change = this.add(x, y);\n    if (change) {\n      return change;\n    }\n    if (this.#points.length === 2) {\n      // We've only one point.\n      return {\n        path: {\n          d: this.toSVGPath(),\n        },\n      };\n    }\n    return null;\n  }\n\n  startNew(x, y, parentWidth, parentHeight, rotation) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#rotation = rotation;\n\n    [x, y] = this.#normalizePoint(x, y);\n\n    const line = (this.#line = [NaN, NaN, NaN, NaN, x, y]);\n    this.#points = [x, y];\n    const last = this.#lines.at(-1);\n    if (last) {\n      last.line = new Float32Array(last.line);\n      last.points = new Float32Array(last.points);\n    }\n    this.#lines.push({ line, points: this.#points });\n    this.#last.set(line, 0);\n    this.#lastIndex = 0;\n    this.toSVGPath();\n\n    return null;\n  }\n\n  getLastElement() {\n    return this.#lines.at(-1);\n  }\n\n  setLastElement(element) {\n    if (!this.#lines) {\n      return this.#outlines.setLastElement(element);\n    }\n    this.#lines.push(element);\n    this.#line = element.line;\n    this.#points = element.points;\n    this.#lastIndex = 0;\n    return {\n      path: {\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  removeLastElement() {\n    if (!this.#lines) {\n      return this.#outlines.removeLastElement();\n    }\n    this.#lines.pop();\n    this.#lastSVGPath = \"\";\n    for (let i = 0, ii = this.#lines.length; i < ii; i++) {\n      const { line, points } = this.#lines[i];\n      this.#line = line;\n      this.#points = points;\n      this.#lastIndex = 0;\n      this.toSVGPath();\n    }\n\n    return {\n      path: {\n        d: this.#lastSVGPath,\n      },\n    };\n  }\n\n  toSVGPath() {\n    const firstX = Outline.svgRound(this.#line[4]);\n    const firstY = Outline.svgRound(this.#line[5]);\n    if (this.#points.length === 2) {\n      this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`;\n      return this.#lastSVGPath;\n    }\n\n    if (this.#points.length <= 6) {\n      // We've 2 or 3 points.\n      const i = this.#lastSVGPath.lastIndexOf(\"M\");\n      this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`;\n      this.#lastIndex = 6;\n    }\n\n    if (this.#points.length === 4) {\n      const secondX = Outline.svgRound(this.#line[10]);\n      const secondY = Outline.svgRound(this.#line[11]);\n      this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`;\n      this.#lastIndex = 12;\n      return this.#lastSVGPath;\n    }\n\n    const buffer = [];\n    if (this.#lastIndex === 0) {\n      buffer.push(`M ${firstX} ${firstY}`);\n      this.#lastIndex = 6;\n    }\n\n    for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) {\n      const [c1x, c1y, c2x, c2y, x, y] = this.#line\n        .slice(i, i + 6)\n        .map(Outline.svgRound);\n      buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`);\n    }\n    this.#lastSVGPath += buffer.join(\" \");\n    this.#lastIndex = this.#line.length;\n\n    return this.#lastSVGPath;\n  }\n\n  getOutlines(parentWidth, parentHeight, scale, innerMargin) {\n    const last = this.#lines.at(-1);\n    last.line = new Float32Array(last.line);\n    last.points = new Float32Array(last.points);\n\n    this.#outlines.build(\n      this.#lines,\n      parentWidth,\n      parentHeight,\n      scale,\n      this.#rotation,\n      this.#thickness,\n      innerMargin\n    );\n\n    // We reset everything: the drawing is done.\n    this.#last = null;\n    this.#line = null;\n    this.#lines = null;\n    this.#lastSVGPath = null;\n\n    return this.#outlines;\n  }\n\n  get defaultSVGProperties() {\n    return {\n      root: {\n        viewBox: \"0 0 10000 10000\",\n      },\n      rootClass: {\n        draw: true,\n      },\n      bbox: [0, 0, 1, 1],\n    };\n  }\n}\n\nclass InkDrawOutline extends Outline {\n  #bbox;\n\n  #currentRotation = 0;\n\n  #innerMargin;\n\n  #lines;\n\n  #parentWidth;\n\n  #parentHeight;\n\n  #parentScale;\n\n  #rotation;\n\n  #thickness;\n\n  build(\n    lines,\n    parentWidth,\n    parentHeight,\n    parentScale,\n    rotation,\n    thickness,\n    innerMargin\n  ) {\n    this.#parentWidth = parentWidth;\n    this.#parentHeight = parentHeight;\n    this.#parentScale = parentScale;\n    this.#rotation = rotation;\n    this.#thickness = thickness;\n    this.#innerMargin = innerMargin ?? 0;\n    this.#lines = lines;\n\n    this.#computeBbox();\n  }\n\n  get thickness() {\n    return this.#thickness;\n  }\n\n  setLastElement(element) {\n    this.#lines.push(element);\n    return {\n      path: {\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  removeLastElement() {\n    this.#lines.pop();\n    return {\n      path: {\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  toSVGPath() {\n    const buffer = [];\n    for (const { line } of this.#lines) {\n      buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`);\n      if (line.length === 6) {\n        buffer.push(\"Z\");\n        continue;\n      }\n      if (line.length === 12 && isNaN(line[6])) {\n        buffer.push(\n          `L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`\n        );\n        continue;\n      }\n      for (let i = 6, ii = line.length; i < ii; i += 6) {\n        const [c1x, c1y, c2x, c2y, x, y] = line\n          .subarray(i, i + 6)\n          .map(Outline.svgRound);\n        buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`);\n      }\n    }\n    return buffer.join(\"\");\n  }\n\n  serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) {\n    const serializedLines = [];\n    const serializedPoints = [];\n    const [x, y, width, height] = this.#getBBoxWithNoMargin();\n    let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn;\n\n    switch (this.#rotation) {\n      case 0:\n        rescaleFn = Outline._rescale;\n        tx = pageX;\n        ty = pageY + pageHeight;\n        sx = pageWidth;\n        sy = -pageHeight;\n        x1 = pageX + x * pageWidth;\n        y1 = pageY + (1 - y - height) * pageHeight;\n        x2 = pageX + (x + width) * pageWidth;\n        y2 = pageY + (1 - y) * pageHeight;\n        break;\n      case 90:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageX;\n        ty = pageY;\n        sx = pageWidth;\n        sy = pageHeight;\n        x1 = pageX + y * pageWidth;\n        y1 = pageY + x * pageHeight;\n        x2 = pageX + (y + height) * pageWidth;\n        y2 = pageY + (x + width) * pageHeight;\n        break;\n      case 180:\n        rescaleFn = Outline._rescale;\n        tx = pageX + pageWidth;\n        ty = pageY;\n        sx = -pageWidth;\n        sy = pageHeight;\n        x1 = pageX + (1 - x - width) * pageWidth;\n        y1 = pageY + y * pageHeight;\n        x2 = pageX + (1 - x) * pageWidth;\n        y2 = pageY + (y + height) * pageHeight;\n        break;\n      case 270:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageX + pageWidth;\n        ty = pageY + pageHeight;\n        sx = -pageWidth;\n        sy = -pageHeight;\n        x1 = pageX + (1 - y - height) * pageWidth;\n        y1 = pageY + (1 - x - width) * pageHeight;\n        x2 = pageX + (1 - y) * pageWidth;\n        y2 = pageY + (1 - x) * pageHeight;\n        break;\n    }\n\n    for (const { line, points } of this.#lines) {\n      serializedLines.push(\n        rescaleFn(\n          line,\n          tx,\n          ty,\n          sx,\n          sy,\n          isForCopying ? new Array(line.length) : null\n        )\n      );\n      serializedPoints.push(\n        rescaleFn(\n          points,\n          tx,\n          ty,\n          sx,\n          sy,\n          isForCopying ? new Array(points.length) : null\n        )\n      );\n    }\n\n    return {\n      lines: serializedLines,\n      points: serializedPoints,\n      rect: [x1, y1, x2, y2],\n    };\n  }\n\n  static deserialize(\n    pageX,\n    pageY,\n    pageWidth,\n    pageHeight,\n    innerMargin,\n    { paths: { lines, points }, rotation, thickness }\n  ) {\n    const newLines = [];\n    let tx, ty, sx, sy, rescaleFn;\n    switch (rotation) {\n      case 0:\n        rescaleFn = Outline._rescale;\n        tx = -pageX / pageWidth;\n        ty = pageY / pageHeight + 1;\n        sx = 1 / pageWidth;\n        sy = -1 / pageHeight;\n        break;\n      case 90:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = -pageY / pageHeight;\n        ty = -pageX / pageWidth;\n        sx = 1 / pageHeight;\n        sy = 1 / pageWidth;\n        break;\n      case 180:\n        rescaleFn = Outline._rescale;\n        tx = pageX / pageWidth + 1;\n        ty = -pageY / pageHeight;\n        sx = -1 / pageWidth;\n        sy = 1 / pageHeight;\n        break;\n      case 270:\n        rescaleFn = Outline._rescaleAndSwap;\n        tx = pageY / pageHeight + 1;\n        ty = pageX / pageWidth + 1;\n        sx = -1 / pageHeight;\n        sy = -1 / pageWidth;\n        break;\n    }\n\n    if (!lines) {\n      lines = [];\n      for (const point of points) {\n        const len = point.length;\n        if (len === 2) {\n          lines.push(\n            new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]])\n          );\n          continue;\n        }\n        if (len === 4) {\n          lines.push(\n            new Float32Array([\n              NaN,\n              NaN,\n              NaN,\n              NaN,\n              point[0],\n              point[1],\n              NaN,\n              NaN,\n              NaN,\n              NaN,\n              point[2],\n              point[3],\n            ])\n          );\n          continue;\n        }\n        const line = new Float32Array(3 * (len - 2));\n        lines.push(line);\n        let [x1, y1, x2, y2] = point.subarray(0, 4);\n        line.set([NaN, NaN, NaN, NaN, x1, y1], 0);\n        for (let i = 4; i < len; i += 2) {\n          const x = point[i];\n          const y = point[i + 1];\n          line.set(\n            Outline.createBezierPoints(x1, y1, x2, y2, x, y),\n            (i - 2) * 3\n          );\n          [x1, y1, x2, y2] = [x2, y2, x, y];\n        }\n      }\n    }\n\n    for (let i = 0, ii = lines.length; i < ii; i++) {\n      newLines.push({\n        line: rescaleFn(\n          lines[i].map(x => x ?? NaN),\n          tx,\n          ty,\n          sx,\n          sy\n        ),\n        points: rescaleFn(\n          points[i].map(x => x ?? NaN),\n          tx,\n          ty,\n          sx,\n          sy\n        ),\n      });\n    }\n\n    const outlines = new this.prototype.constructor();\n    outlines.build(\n      newLines,\n      pageWidth,\n      pageHeight,\n      1,\n      rotation,\n      thickness,\n      innerMargin\n    );\n\n    return outlines;\n  }\n\n  #getMarginComponents(thickness = this.#thickness) {\n    const margin = this.#innerMargin + (thickness / 2) * this.#parentScale;\n    return this.#rotation % 180 === 0\n      ? [margin / this.#parentWidth, margin / this.#parentHeight]\n      : [margin / this.#parentHeight, margin / this.#parentWidth];\n  }\n\n  #getBBoxWithNoMargin() {\n    const [x, y, width, height] = this.#bbox;\n    const [marginX, marginY] = this.#getMarginComponents(0);\n\n    return [\n      x + marginX,\n      y + marginY,\n      width - 2 * marginX,\n      height - 2 * marginY,\n    ];\n  }\n\n  #computeBbox() {\n    const bbox = (this.#bbox = F32_BBOX_INIT.slice());\n\n    for (const { line } of this.#lines) {\n      if (line.length <= 12) {\n        // We've only one or two points => no bezier curve.\n        for (let i = 4, ii = line.length; i < ii; i += 6) {\n          Util.pointBoundingBox(line[i], line[i + 1], bbox);\n        }\n        continue;\n      }\n      let lastX = line[4],\n        lastY = line[5];\n      for (let i = 6, ii = line.length; i < ii; i += 6) {\n        const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6);\n        Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox);\n        lastX = x;\n        lastY = y;\n      }\n    }\n\n    const [marginX, marginY] = this.#getMarginComponents();\n    bbox[0] = MathClamp(bbox[0] - marginX, 0, 1);\n    bbox[1] = MathClamp(bbox[1] - marginY, 0, 1);\n    bbox[2] = MathClamp(bbox[2] + marginX, 0, 1);\n    bbox[3] = MathClamp(bbox[3] + marginY, 0, 1);\n\n    bbox[2] -= bbox[0];\n    bbox[3] -= bbox[1];\n  }\n\n  get box() {\n    return this.#bbox;\n  }\n\n  updateProperty(name, value) {\n    if (name === \"stroke-width\") {\n      return this.#updateThickness(value);\n    }\n    return null;\n  }\n\n  #updateThickness(thickness) {\n    const [oldMarginX, oldMarginY] = this.#getMarginComponents();\n    this.#thickness = thickness;\n    const [newMarginX, newMarginY] = this.#getMarginComponents();\n    const [diffMarginX, diffMarginY] = [\n      newMarginX - oldMarginX,\n      newMarginY - oldMarginY,\n    ];\n    const bbox = this.#bbox;\n    bbox[0] -= diffMarginX;\n    bbox[1] -= diffMarginY;\n    bbox[2] += 2 * diffMarginX;\n    bbox[3] += 2 * diffMarginY;\n\n    return bbox;\n  }\n\n  updateParentDimensions([width, height], scale) {\n    const [oldMarginX, oldMarginY] = this.#getMarginComponents();\n    this.#parentWidth = width;\n    this.#parentHeight = height;\n    this.#parentScale = scale;\n    const [newMarginX, newMarginY] = this.#getMarginComponents();\n    const diffMarginX = newMarginX - oldMarginX;\n    const diffMarginY = newMarginY - oldMarginY;\n\n    const bbox = this.#bbox;\n    bbox[0] -= diffMarginX;\n    bbox[1] -= diffMarginY;\n    bbox[2] += 2 * diffMarginX;\n    bbox[3] += 2 * diffMarginY;\n\n    return bbox;\n  }\n\n  updateRotation(rotation) {\n    this.#currentRotation = rotation;\n    return {\n      path: {\n        transform: this.rotationTransform,\n      },\n    };\n  }\n\n  get viewBox() {\n    return this.#bbox.map(Outline.svgRound).join(\" \");\n  }\n\n  get defaultProperties() {\n    const [x, y] = this.#bbox;\n    return {\n      root: {\n        viewBox: this.viewBox,\n      },\n      path: {\n        \"transform-origin\": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`,\n      },\n    };\n  }\n\n  get rotationTransform() {\n    const [, , width, height] = this.#bbox;\n    let a = 0,\n      b = 0,\n      c = 0,\n      d = 0,\n      e = 0,\n      f = 0;\n    switch (this.#currentRotation) {\n      case 90:\n        b = height / width;\n        c = -width / height;\n        e = width;\n        break;\n      case 180:\n        a = -1;\n        d = -1;\n        e = width;\n        f = height;\n        break;\n      case 270:\n        b = -height / width;\n        c = width / height;\n        f = height;\n        break;\n      default:\n        return \"\";\n    }\n    return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`;\n  }\n\n  getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) {\n    const [marginX, marginY] = this.#getMarginComponents();\n    const [x, y, width, height] = this.#bbox;\n\n    if (\n      Math.abs(width - marginX) <= Outline.PRECISION ||\n      Math.abs(height - marginY) <= Outline.PRECISION\n    ) {\n      // Center the path in the new bounding box.\n      const tx = newX + newWidth / 2 - (x + width / 2);\n      const ty = newY + newHeight / 2 - (y + height / 2);\n      return {\n        path: {\n          \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n          transform: `${this.rotationTransform} translate(${tx} ${ty})`,\n        },\n      };\n    }\n\n    // We compute the following transform:\n    //  1. Translate the path to the origin (-marginX, -marginY).\n    //  2. Scale the path to the new size:\n    //   ((newWidth - 2*marginX) / (bbox.width - 2*marginX),\n    //   (newHeight - 2*marginY) / (bbox.height - 2*marginY)).\n    //  3. Translate the path back to its original position\n    //   (marginX, marginY).\n    //  4. Scale the inverse of bbox scaling:\n    //   (bbox.width / newWidth, bbox.height / newHeight).\n\n    const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX);\n    const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY);\n    const s2x = width / newWidth;\n    const s2y = height / newHeight;\n\n    return {\n      path: {\n        \"transform-origin\": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`,\n        transform:\n          `${this.rotationTransform} scale(${s2x} ${s2y}) ` +\n          `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` +\n          `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})`,\n      },\n    };\n  }\n\n  getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) {\n    const [marginX, marginY] = this.#getMarginComponents();\n    const bbox = this.#bbox;\n    const [x, y, width, height] = bbox;\n\n    bbox[0] = newX;\n    bbox[1] = newY;\n    bbox[2] = newWidth;\n    bbox[3] = newHeight;\n\n    if (\n      Math.abs(width - marginX) <= Outline.PRECISION ||\n      Math.abs(height - marginY) <= Outline.PRECISION\n    ) {\n      // Center the path in the new bounding box.\n      const tx = newX + newWidth / 2 - (x + width / 2);\n      const ty = newY + newHeight / 2 - (y + height / 2);\n      for (const { line, points } of this.#lines) {\n        Outline._translate(line, tx, ty, line);\n        Outline._translate(points, tx, ty, points);\n      }\n      return {\n        root: {\n          viewBox: this.viewBox,\n        },\n        path: {\n          \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n          transform: this.rotationTransform || null,\n          d: this.toSVGPath(),\n        },\n      };\n    }\n\n    // We compute the following transform:\n    //  1. Translate the path to the origin (-(x + marginX), -(y + marginY)).\n    //  2. Scale the path to the new size:\n    //   ((newWidth - 2*marginX) / (bbox.width - 2*marginX),\n    //   (newHeight - 2*marginY) / (bbox.height - 2*marginY)).\n    //  3. Translate the path back to its new position\n    //     (newX + marginX,y newY + marginY).\n\n    const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX);\n    const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY);\n    const tx = -s1x * (x + marginX) + newX + marginX;\n    const ty = -s1y * (y + marginY) + newY + marginY;\n\n    if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) {\n      for (const { line, points } of this.#lines) {\n        Outline._rescale(line, tx, ty, s1x, s1y, line);\n        Outline._rescale(points, tx, ty, s1x, s1y, points);\n      }\n    }\n\n    return {\n      root: {\n        viewBox: this.viewBox,\n      },\n      path: {\n        \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n        transform: this.rotationTransform || null,\n        d: this.toSVGPath(),\n      },\n    };\n  }\n\n  getPathTranslatedSVGProperties([newX, newY], parentDimensions) {\n    const [newParentWidth, newParentHeight] = parentDimensions;\n    const bbox = this.#bbox;\n    const tx = newX - bbox[0];\n    const ty = newY - bbox[1];\n\n    if (\n      this.#parentWidth === newParentWidth &&\n      this.#parentHeight === newParentHeight\n    ) {\n      // We don't change the parent dimensions so it's a simple translation.\n      for (const { line, points } of this.#lines) {\n        Outline._translate(line, tx, ty, line);\n        Outline._translate(points, tx, ty, points);\n      }\n    } else {\n      const sx = this.#parentWidth / newParentWidth;\n      const sy = this.#parentHeight / newParentHeight;\n      this.#parentWidth = newParentWidth;\n      this.#parentHeight = newParentHeight;\n\n      for (const { line, points } of this.#lines) {\n        Outline._rescale(line, tx, ty, sx, sy, line);\n        Outline._rescale(points, tx, ty, sx, sy, points);\n      }\n      bbox[2] *= sx;\n      bbox[3] *= sy;\n    }\n    bbox[0] = newX;\n    bbox[1] = newY;\n\n    return {\n      root: {\n        viewBox: this.viewBox,\n      },\n      path: {\n        d: this.toSVGPath(),\n        \"transform-origin\": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`,\n      },\n    };\n  }\n\n  get defaultSVGProperties() {\n    const bbox = this.#bbox;\n    return {\n      root: {\n        viewBox: this.viewBox,\n      },\n      rootClass: {\n        draw: true,\n      },\n      path: {\n        d: this.toSVGPath(),\n        \"transform-origin\": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`,\n        transform: this.rotationTransform || null,\n      },\n      bbox,\n    };\n  }\n}\n\nexport { InkDrawOutline, InkDrawOutliner };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  shadow,\n  Util,\n} from \"../../shared/util.js\";\nimport { DrawingEditor, DrawingOptions } from \"./draw.js\";\nimport { InkDrawOutline, InkDrawOutliner } from \"./drawers/inkdraw.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { BasicColorPicker } from \"./color_picker.js\";\nimport { InkAnnotationElement } from \"../annotation_layer.js\";\n\nclass InkDrawingOptions extends DrawingOptions {\n  constructor(viewerParameters) {\n    super();\n    this._viewParameters = viewerParameters;\n\n    super.updateProperties({\n      fill: \"none\",\n      stroke: AnnotationEditor._defaultLineColor,\n      \"stroke-opacity\": 1,\n      \"stroke-width\": 1,\n      \"stroke-linecap\": \"round\",\n      \"stroke-linejoin\": \"round\",\n      \"stroke-miterlimit\": 10,\n    });\n  }\n\n  updateSVGProperty(name, value) {\n    if (name === \"stroke-width\") {\n      value ??= this[\"stroke-width\"];\n      value *= this._viewParameters.realScale;\n    }\n    super.updateSVGProperty(name, value);\n  }\n\n  clone() {\n    const clone = new InkDrawingOptions(this._viewParameters);\n    clone.updateAll(this);\n    return clone;\n  }\n}\n\n/**\n * Basic draw editor in order to generate an Ink annotation.\n */\nclass InkEditor extends DrawingEditor {\n  static _type = \"ink\";\n\n  static _editorType = AnnotationEditorType.INK;\n\n  static _defaultDrawingOptions = null;\n\n  constructor(params) {\n    super({ ...params, name: \"inkEditor\" });\n    this._willKeepAspectRatio = true;\n    this.defaultL10nId = \"pdfjs-editor-ink-editor\";\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n    this._defaultDrawingOptions = new InkDrawingOptions(\n      uiManager.viewParameters\n    );\n  }\n\n  /** @inheritdoc */\n  static getDefaultDrawingOptions(options) {\n    const clone = this._defaultDrawingOptions.clone();\n    clone.updateProperties(options);\n    return clone;\n  }\n\n  /** @inheritdoc */\n  static get supportMultipleDrawings() {\n    return true;\n  }\n\n  /** @inheritdoc */\n  static get typesMap() {\n    return shadow(\n      this,\n      \"typesMap\",\n      new Map([\n        [AnnotationEditorParamsType.INK_THICKNESS, \"stroke-width\"],\n        [AnnotationEditorParamsType.INK_COLOR, \"stroke\"],\n        [AnnotationEditorParamsType.INK_OPACITY, \"stroke-opacity\"],\n      ])\n    );\n  }\n\n  /** @inheritdoc */\n  static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) {\n    return new InkDrawOutliner(\n      x,\n      y,\n      parentWidth,\n      parentHeight,\n      rotation,\n      this._defaultDrawingOptions[\"stroke-width\"]\n    );\n  }\n\n  /** @inheritdoc */\n  static deserializeDraw(\n    pageX,\n    pageY,\n    pageWidth,\n    pageHeight,\n    innerMargin,\n    data\n  ) {\n    return InkDrawOutline.deserialize(\n      pageX,\n      pageY,\n      pageWidth,\n      pageHeight,\n      innerMargin,\n      data\n    );\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    if (data instanceof InkAnnotationElement) {\n      const {\n        data: {\n          inkLists,\n          rect,\n          rotation,\n          id,\n          color,\n          opacity,\n          borderStyle: { rawWidth: thickness },\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate,\n        },\n        parent: {\n          page: { pageNumber },\n        },\n      } = data;\n      initialData = data = {\n        annotationType: AnnotationEditorType.INK,\n        color: Array.from(color),\n        thickness,\n        opacity,\n        paths: { points: inkLists },\n        boxes: null,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        popupRef,\n        richText,\n        comment: contentsObj?.str || null,\n        creationDate,\n        modificationDate,\n      };\n    }\n\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor._initialData = initialData;\n    if (data.comment) {\n      editor.setCommentData(data);\n    }\n\n    return editor;\n  }\n\n  /** @inheritdoc */\n  get toolbarButtons() {\n    this._colorPicker ||= new BasicColorPicker(this);\n    return [[\"colorPicker\", this._colorPicker]];\n  }\n\n  get colorType() {\n    return AnnotationEditorParamsType.INK_COLOR;\n  }\n\n  get colorAndOpacityType() {\n    return AnnotationEditorParamsType.INK_COLOR_AND_OPACITY;\n  }\n\n  get opacityType() {\n    return AnnotationEditorParamsType.INK_OPACITY;\n  }\n\n  /** @inheritdoc */\n  updateParams(type, value) {\n    if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) {\n      this._updateColorAndOpacity(value.color, value.opacity);\n      return;\n    }\n    super.updateParams(type, value);\n  }\n\n  /** @inheritdoc */\n  static updateDefaultParams(type, value) {\n    if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) {\n      super.updateDefaultParams(\n        AnnotationEditorParamsType.INK_COLOR,\n        value.color\n      );\n      super.updateDefaultParams(\n        AnnotationEditorParamsType.INK_OPACITY,\n        value.opacity\n      );\n      return;\n    }\n    super.updateDefaultParams(type, value);\n  }\n\n  get color() {\n    return this._drawingOptions.stroke;\n  }\n\n  get opacity() {\n    return this._drawingOptions[\"stroke-opacity\"];\n  }\n\n  /** @inheritdoc */\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    super.onScaleChanging();\n    const { _drawId, _drawingOptions, parent } = this;\n    _drawingOptions.updateSVGProperty(\"stroke-width\");\n    parent.drawLayer.updateProperties(\n      _drawId,\n      _drawingOptions.toSVGProperties()\n    );\n  }\n\n  static onScaleChangingWhenDrawing() {\n    const parent = this._currentParent;\n    if (!parent) {\n      return;\n    }\n    super.onScaleChangingWhenDrawing();\n    this._defaultDrawingOptions.updateSVGProperty(\"stroke-width\");\n    parent.drawLayer.updateProperties(\n      this._currentDrawId,\n      this._defaultDrawingOptions.toSVGProperties()\n    );\n  }\n\n  /** @inheritdoc */\n  createDrawingOptions({ color, thickness, opacity }) {\n    this._drawingOptions = InkEditor.getDefaultDrawingOptions({\n      stroke: Util.makeHexColor(...color),\n      \"stroke-width\": thickness,\n      \"stroke-opacity\": opacity,\n    });\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false) {\n    if (this.isEmpty()) {\n      return null;\n    }\n\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n\n    const { lines, points } = this.serializeDraw(isForCopying);\n    const {\n      _drawingOptions: {\n        stroke,\n        \"stroke-opacity\": opacity,\n        \"stroke-width\": thickness,\n      },\n    } = this;\n    const serialized = Object.assign(super.serialize(isForCopying), {\n      color: AnnotationEditor._colorManager.convert(stroke),\n      opacity,\n      thickness,\n      paths: {\n        lines,\n        points,\n      },\n    });\n    this.addComment(serialized);\n\n    if (isForCopying) {\n      serialized.isCopy = true;\n      return serialized;\n    }\n\n    if (this.annotationElementId && !this.#hasElementChanged(serialized)) {\n      return null;\n    }\n\n    serialized.id = this.annotationElementId;\n    return serialized;\n  }\n\n  #hasElementChanged(serialized) {\n    const { color, thickness, opacity, pageIndex } = this._initialData;\n    return (\n      this.hasEditedComment ||\n      this._hasBeenMoved ||\n      this._hasBeenResized ||\n      serialized.color.some((c, i) => c !== color[i]) ||\n      serialized.thickness !== thickness ||\n      serialized.opacity !== opacity ||\n      serialized.pageIndex !== pageIndex\n    );\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    if (this.deleted) {\n      annotation.hide();\n      return null;\n    }\n    const { points, rect } = this.serializeDraw(/* isForCopying = */ false);\n    annotation.updateEdited({\n      rect,\n      thickness: this._drawingOptions[\"stroke-width\"],\n      points,\n      popup: this.comment,\n    });\n\n    return null;\n  }\n}\n\nexport { InkDrawingOptions, InkEditor };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InkDrawOutline } from \"./inkdraw.js\";\n\nclass ContourDrawOutline extends InkDrawOutline {\n  toSVGPath() {\n    let path = super.toSVGPath();\n    if (!path.endsWith(\"Z\")) {\n      path += \"Z\";\n    }\n    return path;\n  }\n}\n\nexport { ContourDrawOutline };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ContourDrawOutline } from \"./contour.js\";\nimport { InkDrawOutline } from \"./inkdraw.js\";\nimport { Outline } from \"./outline.js\";\nimport { warn } from \"../../../shared/util.js\";\n\nconst BASE_HEADER_LENGTH = 8;\nconst POINTS_PROPERTIES_NUMBER = 3;\n\n/**\n * Basic text editor in order to create a Signature annotation.\n */\nclass SignatureExtractor {\n  static #PARAMETERS = {\n    maxDim: 512,\n    sigmaSFactor: 0.02,\n    sigmaR: 25,\n    kernelSize: 16,\n  };\n\n  static #neighborIndexToId(i0, j0, i, j) {\n    /*\n      The idea is to map the neighbors of a pixel into a unique id.\n        3 2 1\n        4 X 0\n        5 6 7\n    */\n\n    i -= i0;\n    j -= j0;\n\n    if (i === 0) {\n      return j > 0 ? 0 : 4;\n    }\n\n    if (i === 1) {\n      return j + 6;\n    }\n\n    return 2 - j;\n  }\n\n  static #neighborIdToIndex = new Int32Array([\n    0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1,\n  ]);\n\n  static #clockwiseNonZero(buf, width, i0, j0, i, j, offset) {\n    const id = this.#neighborIndexToId(i0, j0, i, j);\n    for (let k = 0; k < 8; k++) {\n      const kk = (-k + id - offset + 16) % 8;\n      const shiftI = this.#neighborIdToIndex[2 * kk];\n      const shiftJ = this.#neighborIdToIndex[2 * kk + 1];\n      if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) {\n        return kk;\n      }\n    }\n    return -1;\n  }\n\n  static #counterClockwiseNonZero(buf, width, i0, j0, i, j, offset) {\n    const id = this.#neighborIndexToId(i0, j0, i, j);\n    for (let k = 0; k < 8; k++) {\n      const kk = (k + id + offset + 16) % 8;\n      const shiftI = this.#neighborIdToIndex[2 * kk];\n      const shiftJ = this.#neighborIdToIndex[2 * kk + 1];\n      if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) {\n        return kk;\n      }\n    }\n    return -1;\n  }\n\n  static #findContours(buf, width, height, threshold) {\n    // Based on the Suzuki's algorithm:\n    //  https://web.archive.org/web/20231213161741/https://www.nevis.columbia.edu/~vgenty/public/suzuki_et_al.pdf\n\n    const N = buf.length;\n    const types = new Int32Array(N);\n    for (let i = 0; i < N; i++) {\n      types[i] = buf[i] <= threshold ? 1 : 0;\n    }\n\n    for (let i = 1; i < height - 1; i++) {\n      types[i * width] = types[i * width + width - 1] = 0;\n    }\n    for (let i = 0; i < width; i++) {\n      types[i] = types[width * height - 1 - i] = 0;\n    }\n\n    let nbd = 1;\n    let lnbd;\n    const contours = [];\n\n    for (let i = 1; i < height - 1; i++) {\n      lnbd = 1;\n      for (let j = 1; j < width - 1; j++) {\n        const ij = i * width + j;\n        const pix = types[ij];\n        if (pix === 0) {\n          continue;\n        }\n\n        let i2 = i;\n        let j2 = j;\n\n        if (pix === 1 && types[ij - 1] === 0) {\n          // Outer border.\n          nbd += 1;\n          j2 -= 1;\n        } else if (pix >= 1 && types[ij + 1] === 0) {\n          // Hole border.\n          nbd += 1;\n          j2 += 1;\n          if (pix > 1) {\n            lnbd = pix;\n          }\n        } else {\n          if (pix !== 1) {\n            lnbd = Math.abs(pix);\n          }\n          continue;\n        }\n\n        const points = [j, i];\n        const isHole = j2 === j + 1;\n        const contour = {\n          isHole,\n          points,\n          id: nbd,\n          parent: 0,\n        };\n        contours.push(contour);\n\n        let contour0;\n        for (const c of contours) {\n          if (c.id === lnbd) {\n            contour0 = c;\n            break;\n          }\n        }\n\n        if (!contour0) {\n          contour.parent = isHole ? lnbd : 0;\n        } else if (contour0.isHole) {\n          contour.parent = isHole ? contour0.parent : lnbd;\n        } else {\n          contour.parent = isHole ? lnbd : contour0.parent;\n        }\n\n        const k = this.#clockwiseNonZero(types, width, i, j, i2, j2, 0);\n        if (k === -1) {\n          types[ij] = -nbd;\n          if (types[ij] !== 1) {\n            lnbd = Math.abs(types[ij]);\n          }\n          continue;\n        }\n\n        let shiftI = this.#neighborIdToIndex[2 * k];\n        let shiftJ = this.#neighborIdToIndex[2 * k + 1];\n        const i1 = i + shiftI;\n        const j1 = j + shiftJ;\n        i2 = i1;\n        j2 = j1;\n        let i3 = i;\n        let j3 = j;\n\n        while (true) {\n          const kk = this.#counterClockwiseNonZero(\n            types,\n            width,\n            i3,\n            j3,\n            i2,\n            j2,\n            1\n          );\n          shiftI = this.#neighborIdToIndex[2 * kk];\n          shiftJ = this.#neighborIdToIndex[2 * kk + 1];\n          const i4 = i3 + shiftI;\n          const j4 = j3 + shiftJ;\n          points.push(j4, i4);\n          const ij3 = i3 * width + j3;\n          if (types[ij3 + 1] === 0) {\n            types[ij3] = -nbd;\n          } else if (types[ij3] === 1) {\n            types[ij3] = nbd;\n          }\n\n          if (i4 === i && j4 === j && i3 === i1 && j3 === j1) {\n            if (types[ij] !== 1) {\n              lnbd = Math.abs(types[ij]);\n            }\n            break;\n          } else {\n            i2 = i3;\n            j2 = j3;\n            i3 = i4;\n            j3 = j4;\n          }\n        }\n      }\n    }\n    return contours;\n  }\n\n  static #douglasPeuckerHelper(points, start, end, output) {\n    // Based on the Douglas-Peucker algorithm:\n    //  https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm\n    if (end - start <= 4) {\n      for (let i = start; i < end - 2; i += 2) {\n        output.push(points[i], points[i + 1]);\n      }\n      return;\n    }\n\n    const ax = points[start];\n    const ay = points[start + 1];\n    const abx = points[end - 4] - ax;\n    const aby = points[end - 3] - ay;\n    const dist = Math.hypot(abx, aby);\n    const nabx = abx / dist;\n    const naby = aby / dist;\n    const aa = nabx * ay - naby * ax;\n\n    // Guessing the epsilon value.\n    // See \"A novel framework for making dominant point detection methods\n    // non-parametric\".\n    const m = aby / abx;\n    const invS = 1 / dist;\n    const phi = Math.atan(m);\n    const cosPhi = Math.cos(phi);\n    const sinPhi = Math.sin(phi);\n    const tmax = invS * (Math.abs(cosPhi) + Math.abs(sinPhi));\n    const poly = invS * (1 - tmax + tmax ** 2);\n    const partialPhi = Math.max(\n      Math.atan(Math.abs(sinPhi + cosPhi) * poly),\n      Math.atan(Math.abs(sinPhi - cosPhi) * poly)\n    );\n\n    let dmax = 0;\n    let index = start;\n    for (let i = start + 2; i < end - 2; i += 2) {\n      const d = Math.abs(aa - nabx * points[i + 1] + naby * points[i]);\n      if (d > dmax) {\n        index = i;\n        dmax = d;\n      }\n    }\n\n    if (dmax > (dist * partialPhi) ** 2) {\n      this.#douglasPeuckerHelper(points, start, index + 2, output);\n      this.#douglasPeuckerHelper(points, index, end, output);\n    } else {\n      output.push(ax, ay);\n    }\n  }\n\n  static #douglasPeucker(points) {\n    const output = [];\n    const len = points.length;\n    this.#douglasPeuckerHelper(points, 0, len, output);\n    output.push(points[len - 2], points[len - 1]);\n    return output.length <= 4 ? null : output;\n  }\n\n  static #bilateralFilter(buf, width, height, sigmaS, sigmaR, kernelSize) {\n    // The bilateral filter is a nonlinear filter that does spatial averaging.\n    // Its main interest is to preserve edges while removing noise.\n    // See https://en.wikipedia.org/wiki/Bilateral_filter for more details.\n    // sigmaS is the standard deviation of the spatial gaussian.\n    // sigmaR is the standard deviation of the range (in term of pixel\n    // intensity) gaussian.\n\n    // Create a gaussian kernel\n    const kernel = new Float32Array(kernelSize ** 2);\n    const sigmaS2 = -2 * sigmaS ** 2;\n    const halfSize = kernelSize >> 1;\n\n    for (let i = 0; i < kernelSize; i++) {\n      const x = (i - halfSize) ** 2;\n      for (let j = 0; j < kernelSize; j++) {\n        kernel[i * kernelSize + j] = Math.exp(\n          (x + (j - halfSize) ** 2) / sigmaS2\n        );\n      }\n    }\n\n    // Create the range values to be used with the distance between pixels.\n    // It's a way faster with a lookup table than computing the exponential.\n    const rangeValues = new Float32Array(256);\n    const sigmaR2 = -2 * sigmaR ** 2;\n    for (let i = 0; i < 256; i++) {\n      rangeValues[i] = Math.exp(i ** 2 / sigmaR2);\n    }\n\n    const N = buf.length;\n    const out = new Uint8Array(N);\n\n    // We compute the histogram here instead of doing it later: it's slightly\n    // faster.\n    const histogram = new Uint32Array(256);\n    for (let i = 0; i < height; i++) {\n      for (let j = 0; j < width; j++) {\n        const ij = i * width + j;\n        const center = buf[ij];\n        let sum = 0;\n        let norm = 0;\n\n        for (let k = 0; k < kernelSize; k++) {\n          const y = i + k - halfSize;\n          if (y < 0 || y >= height) {\n            continue;\n          }\n          for (let l = 0; l < kernelSize; l++) {\n            const x = j + l - halfSize;\n            if (x < 0 || x >= width) {\n              continue;\n            }\n            const neighbour = buf[y * width + x];\n            const w =\n              kernel[k * kernelSize + l] *\n              rangeValues[Math.abs(neighbour - center)];\n            sum += neighbour * w;\n            norm += w;\n          }\n        }\n\n        const pix = (out[ij] = Math.round(sum / norm));\n        histogram[pix]++;\n      }\n    }\n\n    return [out, histogram];\n  }\n\n  static #getHistogram(buf) {\n    const histogram = new Uint32Array(256);\n    for (const g of buf) {\n      histogram[g]++;\n    }\n    return histogram;\n  }\n\n  static #toUint8(buf) {\n    // We have a RGBA buffer, containing a grayscale image.\n    // We want to convert it into a basic G buffer.\n    // Also, we want to normalize the values between 0 and 255 in order to\n    // increase the contrast.\n    const N = buf.length;\n    const out = new Uint8ClampedArray(N >> 2);\n    let max = -Infinity;\n    let min = Infinity;\n    for (let i = 0, ii = out.length; i < ii; i++) {\n      const pix = (out[i] = buf[i << 2]);\n      max = Math.max(max, pix);\n      min = Math.min(min, pix);\n    }\n    const ratio = 255 / (max - min);\n    for (let i = 0, ii = out.length; i < ii; i++) {\n      out[i] = (out[i] - min) * ratio;\n    }\n\n    return out;\n  }\n\n  static #guessThreshold(histogram) {\n    // We want to find the threshold that will separate the background from the\n    // foreground.\n    // We could have used Otsu's method, but unfortunately it doesn't work well\n    // when the background has too much shade of greys.\n    // So the idea is to find a maximum in the black part of the histogram and\n    // figure out the value which will be the first one of the white part.\n\n    let i;\n    let M = -Infinity;\n    let L = -Infinity;\n    const min = histogram.findIndex(v => v !== 0);\n    let pos = min;\n    let spos = min;\n    for (i = min; i < 256; i++) {\n      const v = histogram[i];\n      if (v > M) {\n        if (i - pos > L) {\n          L = i - pos;\n          spos = i - 1;\n        }\n        M = v;\n        pos = i;\n      }\n    }\n    for (i = spos - 1; i >= 0; i--) {\n      if (histogram[i] > histogram[i + 1]) {\n        break;\n      }\n    }\n\n    return i;\n  }\n\n  static #getGrayPixels(bitmap) {\n    const originalBitmap = bitmap;\n    const { width, height } = bitmap;\n    const { maxDim } = this.#PARAMETERS;\n    let newWidth = width;\n    let newHeight = height;\n\n    if (width > maxDim || height > maxDim) {\n      let prevWidth = width;\n      let prevHeight = height;\n\n      let steps = Math.log2(Math.max(width, height) / maxDim);\n      const isteps = Math.floor(steps);\n      steps = steps === isteps ? isteps - 1 : isteps;\n      for (let i = 0; i < steps; i++) {\n        newWidth = Math.ceil(prevWidth / 2);\n        newHeight = Math.ceil(prevHeight / 2);\n\n        const offscreen = new OffscreenCanvas(newWidth, newHeight);\n        const ctx = offscreen.getContext(\"2d\");\n        ctx.drawImage(\n          bitmap,\n          0,\n          0,\n          prevWidth,\n          prevHeight,\n          0,\n          0,\n          newWidth,\n          newHeight\n        );\n        prevWidth = newWidth;\n        prevHeight = newHeight;\n\n        // Release the resources associated with the bitmap.\n        if (bitmap !== originalBitmap) {\n          bitmap.close();\n        }\n        bitmap = offscreen.transferToImageBitmap();\n      }\n\n      const ratio = Math.min(maxDim / newWidth, maxDim / newHeight);\n      newWidth = Math.round(newWidth * ratio);\n      newHeight = Math.round(newHeight * ratio);\n    }\n    const offscreen = new OffscreenCanvas(newWidth, newHeight);\n    const ctx = offscreen.getContext(\"2d\", { willReadFrequently: true });\n    ctx.fillStyle = \"white\";\n    ctx.fillRect(0, 0, newWidth, newHeight);\n    ctx.filter = \"grayscale(1)\";\n    ctx.drawImage(\n      bitmap,\n      0,\n      0,\n      bitmap.width,\n      bitmap.height,\n      0,\n      0,\n      newWidth,\n      newHeight\n    );\n    const grayImage = ctx.getImageData(0, 0, newWidth, newHeight).data;\n    const uint8Buf = this.#toUint8(grayImage);\n\n    return [uint8Buf, newWidth, newHeight];\n  }\n\n  static extractContoursFromText(\n    text,\n    { fontFamily, fontStyle, fontWeight },\n    pageWidth,\n    pageHeight,\n    rotation,\n    innerMargin\n  ) {\n    let canvas = new OffscreenCanvas(1, 1);\n    let ctx = canvas.getContext(\"2d\", { alpha: false });\n    const fontSize = 200;\n    const font =\n      (ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`);\n    const {\n      actualBoundingBoxLeft,\n      actualBoundingBoxRight,\n      actualBoundingBoxAscent,\n      actualBoundingBoxDescent,\n      fontBoundingBoxAscent,\n      fontBoundingBoxDescent,\n      width,\n    } = ctx.measureText(text);\n\n    // We rescale the canvas to make \"sure\" the text fits.\n    const SCALE = 1.5;\n    const canvasWidth = Math.ceil(\n      Math.max(\n        Math.abs(actualBoundingBoxLeft) + Math.abs(actualBoundingBoxRight) || 0,\n        width\n      ) * SCALE\n    );\n    const canvasHeight = Math.ceil(\n      Math.max(\n        Math.abs(actualBoundingBoxAscent) +\n          Math.abs(actualBoundingBoxDescent) || fontSize,\n        Math.abs(fontBoundingBoxAscent) + Math.abs(fontBoundingBoxDescent) ||\n          fontSize\n      ) * SCALE\n    );\n    canvas = new OffscreenCanvas(canvasWidth, canvasHeight);\n    ctx = canvas.getContext(\"2d\", { alpha: true, willReadFrequently: true });\n    ctx.font = font;\n    ctx.filter = \"grayscale(1)\";\n    ctx.fillStyle = \"white\";\n    ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n    ctx.fillStyle = \"black\";\n    ctx.fillText(\n      text,\n      (canvasWidth * (SCALE - 1)) / 2,\n      (canvasHeight * (3 - SCALE)) / 2\n    );\n\n    const uint8Buf = this.#toUint8(\n      ctx.getImageData(0, 0, canvasWidth, canvasHeight).data\n    );\n    const histogram = this.#getHistogram(uint8Buf);\n    const threshold = this.#guessThreshold(histogram);\n\n    const contourList = this.#findContours(\n      uint8Buf,\n      canvasWidth,\n      canvasHeight,\n      threshold\n    );\n\n    return this.processDrawnLines({\n      lines: { curves: contourList, width: canvasWidth, height: canvasHeight },\n      pageWidth,\n      pageHeight,\n      rotation,\n      innerMargin,\n      mustSmooth: true,\n      areContours: true,\n    });\n  }\n\n  static process(bitmap, pageWidth, pageHeight, rotation, innerMargin) {\n    const [uint8Buf, width, height] = this.#getGrayPixels(bitmap);\n    const [buffer, histogram] = this.#bilateralFilter(\n      uint8Buf,\n      width,\n      height,\n      Math.hypot(width, height) * this.#PARAMETERS.sigmaSFactor,\n      this.#PARAMETERS.sigmaR,\n      this.#PARAMETERS.kernelSize\n    );\n\n    const threshold = this.#guessThreshold(histogram);\n    const contourList = this.#findContours(buffer, width, height, threshold);\n\n    return this.processDrawnLines({\n      lines: { curves: contourList, width, height },\n      pageWidth,\n      pageHeight,\n      rotation,\n      innerMargin,\n      mustSmooth: true,\n      areContours: true,\n    });\n  }\n\n  static processDrawnLines({\n    lines,\n    pageWidth,\n    pageHeight,\n    rotation,\n    innerMargin,\n    mustSmooth,\n    areContours,\n  }) {\n    if (rotation % 180 !== 0) {\n      [pageWidth, pageHeight] = [pageHeight, pageWidth];\n    }\n\n    const { curves, width, height } = lines;\n    const thickness = lines.thickness ?? 0;\n    const linesAndPoints = [];\n    const ratio = Math.min(pageWidth / width, pageHeight / height);\n    const xScale = ratio / pageWidth;\n    const yScale = ratio / pageHeight;\n    const newCurves = [];\n\n    for (const { points } of curves) {\n      const reducedPoints = mustSmooth ? this.#douglasPeucker(points) : points;\n      if (!reducedPoints) {\n        continue;\n      }\n      newCurves.push(reducedPoints);\n\n      const len = reducedPoints.length;\n      const newPoints = new Float32Array(len);\n      const line = new Float32Array(3 * (len === 2 ? 2 : len - 2));\n      linesAndPoints.push({ line, points: newPoints });\n\n      if (len === 2) {\n        newPoints[0] = reducedPoints[0] * xScale;\n        newPoints[1] = reducedPoints[1] * yScale;\n        line.set([NaN, NaN, NaN, NaN, newPoints[0], newPoints[1]], 0);\n        continue;\n      }\n\n      let [x1, y1, x2, y2] = reducedPoints;\n      x1 *= xScale;\n      y1 *= yScale;\n      x2 *= xScale;\n      y2 *= yScale;\n      newPoints.set([x1, y1, x2, y2], 0);\n\n      line.set([NaN, NaN, NaN, NaN, x1, y1], 0);\n      for (let i = 4; i < len; i += 2) {\n        const x = (newPoints[i] = reducedPoints[i] * xScale);\n        const y = (newPoints[i + 1] = reducedPoints[i + 1] * yScale);\n        line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3);\n        [x1, y1, x2, y2] = [x2, y2, x, y];\n      }\n    }\n\n    if (linesAndPoints.length === 0) {\n      return null;\n    }\n\n    const outline = areContours\n      ? new ContourDrawOutline()\n      : new InkDrawOutline();\n\n    outline.build(\n      linesAndPoints,\n      pageWidth,\n      pageHeight,\n      1,\n      rotation,\n      areContours ? 0 : thickness,\n      innerMargin\n    );\n\n    return { outline, newCurves, areContours, thickness, width, height };\n  }\n\n  static async compressSignature({\n    outlines,\n    areContours,\n    thickness,\n    width,\n    height,\n  }) {\n    // We create a single array containing all the outlines.\n    // The format is the following:\n    // - 4 bytes: data length.\n    // - 4 bytes: version.\n    // - 4 bytes: width.\n    // - 4 bytes: height.\n    // - 4 bytes: 0 if it's a contour, 1 if it's an ink.\n    // - 4 bytes: thickness.\n    // - 4 bytes: number of drawings.\n    // - 4 bytes: size of the buffer containing the diff of the coordinates.\n    // - 4 bytes: number of points in the first drawing.\n    // - 4 bytes: x coordinate of the first point.\n    // - 4 bytes: y coordinate of the first point.\n    // - 4 bytes: number of points in the second drawing.\n    // - 4 bytes: x coordinate of the first point.\n    // - 4 bytes: y coordinate of the first point.\n    // - ...\n    // - The buffer containing the diff of the coordinates.\n\n    // The coordinates are supposed to be positive integers.\n\n    // We also compute the min and max difference between two points.\n    // This will help us to determine the type of the buffer (Int8, Int16 or\n    // Int32) in order to minimize the amount of data we have.\n    let minDiff = Infinity;\n    let maxDiff = -Infinity;\n    let outlinesLength = 0;\n    for (const points of outlines) {\n      outlinesLength += points.length;\n      for (let i = 2, ii = points.length; i < ii; i++) {\n        const dx = points[i] - points[i - 2];\n        minDiff = Math.min(minDiff, dx);\n        maxDiff = Math.max(maxDiff, dx);\n      }\n    }\n\n    let bufferType;\n    if (minDiff >= -128 && maxDiff <= 127) {\n      bufferType = Int8Array;\n    } else if (minDiff >= -32768 && maxDiff <= 32767) {\n      bufferType = Int16Array;\n    } else {\n      bufferType = Int32Array;\n    }\n\n    const len = outlines.length;\n    const headerLength = BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * len;\n    const header = new Uint32Array(headerLength);\n\n    let offset = 0;\n    header[offset++] =\n      headerLength * Uint32Array.BYTES_PER_ELEMENT +\n      (outlinesLength - 2 * len) * bufferType.BYTES_PER_ELEMENT;\n    header[offset++] = 0; // Version.\n    header[offset++] = width;\n    header[offset++] = height;\n    header[offset++] = areContours ? 0 : 1;\n    header[offset++] = Math.max(0, Math.floor(thickness ?? 0));\n    header[offset++] = len;\n    header[offset++] = bufferType.BYTES_PER_ELEMENT;\n    for (const points of outlines) {\n      header[offset++] = points.length - 2;\n      header[offset++] = points[0];\n      header[offset++] = points[1];\n    }\n\n    const cs = new CompressionStream(\"deflate-raw\");\n    const writer = cs.writable.getWriter();\n    await writer.ready;\n\n    writer.write(header);\n    const BufferCtor = bufferType.prototype.constructor;\n    for (const points of outlines) {\n      const diffs = new BufferCtor(points.length - 2);\n      for (let i = 2, ii = points.length; i < ii; i++) {\n        diffs[i - 2] = points[i] - points[i - 2];\n      }\n      writer.write(diffs);\n    }\n\n    writer.close();\n\n    const bytes = await new Response(cs.readable).bytes();\n    return bytes.toBase64();\n  }\n\n  static async decompressSignature(signatureData) {\n    try {\n      const bytes = Uint8Array.fromBase64(signatureData);\n      const { readable, writable } = new DecompressionStream(\"deflate-raw\");\n      const writer = writable.getWriter();\n      await writer.ready;\n\n      // We can't await writer.write() because it'll block until the reader\n      // starts which happens few lines below.\n      writer\n        .write(bytes)\n        .then(async () => {\n          await writer.ready;\n          await writer.close();\n        })\n        .catch(() => {});\n\n      let data = null;\n      let offset = 0;\n      for await (const chunk of readable) {\n        data ||= new Uint8Array(new Uint32Array(chunk.buffer, 0, 4)[0]);\n        data.set(chunk, offset);\n        offset += chunk.length;\n      }\n\n      // We take a bit too much data for the header but it's fine.\n      const header = new Uint32Array(data.buffer, 0, data.length >> 2);\n      const version = header[1];\n      if (version !== 0) {\n        throw new Error(`Invalid version: ${version}`);\n      }\n      const width = header[2];\n      const height = header[3];\n      const areContours = header[4] === 0;\n      const thickness = header[5];\n      const numberOfDrawings = header[6];\n      const bufferType = header[7];\n      const outlines = [];\n      const diffsOffset =\n        (BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * numberOfDrawings) *\n        Uint32Array.BYTES_PER_ELEMENT;\n      let diffs;\n\n      switch (bufferType) {\n        case Int8Array.BYTES_PER_ELEMENT:\n          diffs = new Int8Array(data.buffer, diffsOffset);\n          break;\n        case Int16Array.BYTES_PER_ELEMENT:\n          diffs = new Int16Array(data.buffer, diffsOffset);\n          break;\n        case Int32Array.BYTES_PER_ELEMENT:\n          diffs = new Int32Array(data.buffer, diffsOffset);\n          break;\n      }\n\n      offset = 0;\n      for (let i = 0; i < numberOfDrawings; i++) {\n        const len = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH];\n        const points = new Float32Array(len + 2);\n        outlines.push(points);\n\n        for (let j = 0; j < POINTS_PROPERTIES_NUMBER - 1; j++) {\n          points[j] =\n            header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH + j + 1];\n        }\n        for (let j = 0; j < len; j++) {\n          points[j + 2] = points[j] + diffs[offset++];\n        }\n      }\n\n      return {\n        areContours,\n        thickness,\n        outlines,\n        width,\n        height,\n      };\n    } catch (e) {\n      warn(`decompressSignature: ${e}`);\n      return null;\n    }\n  }\n}\n\nexport { SignatureExtractor };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationEditorType, shadow } from \"../../shared/util.js\";\nimport { DrawingEditor, DrawingOptions } from \"./draw.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { ContourDrawOutline } from \"./drawers/contour.js\";\nimport { InkDrawingOptions } from \"./ink.js\";\nimport { InkDrawOutline } from \"./drawers/inkdraw.js\";\nimport { SignatureExtractor } from \"./drawers/signaturedraw.js\";\n\nclass SignatureOptions extends DrawingOptions {\n  constructor() {\n    super();\n\n    super.updateProperties({\n      fill: AnnotationEditor._defaultLineColor,\n      \"stroke-width\": 0,\n    });\n  }\n\n  clone() {\n    const clone = new SignatureOptions();\n    clone.updateAll(this);\n    return clone;\n  }\n}\n\nclass DrawnSignatureOptions extends InkDrawingOptions {\n  constructor(viewerParameters) {\n    super(viewerParameters);\n\n    super.updateProperties({\n      stroke: AnnotationEditor._defaultLineColor,\n      \"stroke-width\": 1,\n    });\n  }\n\n  clone() {\n    const clone = new DrawnSignatureOptions(this._viewParameters);\n    clone.updateAll(this);\n    return clone;\n  }\n}\n\n/**\n * Basic editor in order to generate an Stamp annotation annotation containing\n * a signature drawing.\n */\nclass SignatureEditor extends DrawingEditor {\n  #isExtracted = false;\n\n  #description = null;\n\n  #signatureData = null;\n\n  #signatureUUID = null;\n\n  static _type = \"signature\";\n\n  static _editorType = AnnotationEditorType.SIGNATURE;\n\n  static _defaultDrawingOptions = null;\n\n  constructor(params) {\n    super({ ...params, mustBeCommitted: true, name: \"signatureEditor\" });\n    this._willKeepAspectRatio = true;\n    this.#signatureData = params.signatureData || null;\n    this.#description = null;\n    this.defaultL10nId = \"pdfjs-editor-signature-editor1\";\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n\n    this._defaultDrawingOptions = new SignatureOptions();\n    this._defaultDrawnSignatureOptions = new DrawnSignatureOptions(\n      uiManager.viewParameters\n    );\n  }\n\n  /** @inheritdoc */\n  static getDefaultDrawingOptions(options) {\n    const clone = this._defaultDrawingOptions.clone();\n    clone.updateProperties(options);\n    return clone;\n  }\n\n  /** @inheritdoc */\n  static get supportMultipleDrawings() {\n    return false;\n  }\n\n  static get typesMap() {\n    return shadow(this, \"typesMap\", new Map());\n  }\n\n  static get isDrawer() {\n    return false;\n  }\n\n  /** @inheritdoc */\n  get telemetryFinalData() {\n    return {\n      type: \"signature\",\n      hasDescription: !!this.#description,\n    };\n  }\n\n  static computeTelemetryFinalData(data) {\n    const hasDescriptionStats = data.get(\"hasDescription\");\n    return {\n      hasAltText: hasDescriptionStats.get(true) ?? 0,\n      hasNoAltText: hasDescriptionStats.get(false) ?? 0,\n    };\n  }\n\n  /** @inheritdoc */\n  get isResizable() {\n    return true;\n  }\n\n  /** @inheritdoc */\n  onScaleChanging() {\n    if (this._drawId === null) {\n      return;\n    }\n    super.onScaleChanging();\n  }\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    let baseX, baseY;\n    const { _isCopy } = this;\n    if (_isCopy) {\n      // No need to adjust the position when rendering in DrawingEditor.\n      this._isCopy = false;\n      baseX = this.x;\n      baseY = this.y;\n    }\n\n    super.render();\n\n    if (this._drawId === null) {\n      if (this.#signatureData) {\n        const {\n          lines,\n          mustSmooth,\n          areContours,\n          description,\n          uuid,\n          heightInPage,\n        } = this.#signatureData;\n        const {\n          rawDims: { pageWidth, pageHeight },\n          rotation,\n        } = this.parent.viewport;\n        const outline = SignatureExtractor.processDrawnLines({\n          lines,\n          pageWidth,\n          pageHeight,\n          rotation,\n          innerMargin: SignatureEditor._INNER_MARGIN,\n          mustSmooth,\n          areContours,\n        });\n        this.addSignature(outline, heightInPage, description, uuid);\n      } else {\n        // Avoid Firefox crashing (with a local build) because the description\n        // parameter is missing.\n        this.div.setAttribute(\n          \"data-l10n-args\",\n          JSON.stringify({ description: \"\" })\n        );\n        this.div.hidden = true;\n        this._uiManager.getSignature(this);\n      }\n    } else {\n      this.div.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({ description: this.#description || \"\" })\n      );\n    }\n\n    if (_isCopy) {\n      this._isCopy = true;\n      this._moveAfterPaste(baseX, baseY);\n    }\n\n    return this.div;\n  }\n\n  setUuid(uuid) {\n    this.#signatureUUID = uuid;\n    this.addEditToolbar();\n  }\n\n  getUuid() {\n    return this.#signatureUUID;\n  }\n\n  get description() {\n    return this.#description;\n  }\n\n  set description(description) {\n    this.#description = description;\n    if (!this.div) {\n      return;\n    }\n    this.div.setAttribute(\"data-l10n-args\", JSON.stringify({ description }));\n    super.addEditToolbar().then(toolbar => {\n      toolbar?.updateEditSignatureButton(description);\n    });\n  }\n\n  getSignaturePreview() {\n    const { newCurves, areContours, thickness, width, height } =\n      this.#signatureData;\n    const maxDim = Math.max(width, height);\n    const outlineData = SignatureExtractor.processDrawnLines({\n      lines: {\n        curves: newCurves.map(points => ({ points })),\n        thickness,\n        width,\n        height,\n      },\n      pageWidth: maxDim,\n      pageHeight: maxDim,\n      rotation: 0,\n      innerMargin: 0,\n      mustSmooth: false,\n      areContours,\n    });\n    return { areContours, outline: outlineData.outline };\n  }\n\n  /** @inheritdoc */\n  get toolbarButtons() {\n    if (this._uiManager.signatureManager) {\n      return [[\"editSignature\", this._uiManager.signatureManager]];\n    }\n    return super.toolbarButtons;\n  }\n\n  addSignature(data, heightInPage, description, uuid) {\n    const { x: savedX, y: savedY } = this;\n    const { outline } = (this.#signatureData = data);\n    this.#isExtracted = outline instanceof ContourDrawOutline;\n    this.description = description;\n    let drawingOptions;\n    if (this.#isExtracted) {\n      drawingOptions = SignatureEditor.getDefaultDrawingOptions();\n    } else {\n      drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone();\n      drawingOptions.updateProperties({ \"stroke-width\": outline.thickness });\n    }\n    this._addOutlines({\n      drawOutlines: outline,\n      drawingOptions,\n    });\n    const [, pageHeight] = this.pageDimensions;\n    let newHeight = heightInPage / pageHeight;\n    // Ensure the signature doesn't exceed the page height.\n    // If the signature is too big, we scale it down to 50% of the page height.\n    newHeight = newHeight >= 1 ? 0.5 : newHeight;\n\n    this.width *= newHeight / this.height;\n    if (this.width >= 1) {\n      newHeight *= 0.9 / this.width;\n      this.width = 0.9;\n    }\n\n    this.height = newHeight;\n    this.setDims();\n    this.x = savedX;\n    this.y = savedY;\n    this.center();\n\n    this._onResized();\n    this.onScaleChanging();\n    this.rotate();\n    this._uiManager.addToAnnotationStorage(this);\n    this.setUuid(uuid);\n\n    this._reportTelemetry({\n      action: \"pdfjs.signature.inserted\",\n      data: {\n        hasBeenSaved: !!uuid,\n        hasDescription: !!description,\n      },\n    });\n\n    this.div.hidden = false;\n  }\n\n  getFromImage(bitmap) {\n    const {\n      rawDims: { pageWidth, pageHeight },\n      rotation,\n    } = this.parent.viewport;\n    return SignatureExtractor.process(\n      bitmap,\n      pageWidth,\n      pageHeight,\n      rotation,\n      SignatureEditor._INNER_MARGIN\n    );\n  }\n\n  getFromText(text, fontInfo) {\n    const {\n      rawDims: { pageWidth, pageHeight },\n      rotation,\n    } = this.parent.viewport;\n    return SignatureExtractor.extractContoursFromText(\n      text,\n      fontInfo,\n      pageWidth,\n      pageHeight,\n      rotation,\n      SignatureEditor._INNER_MARGIN\n    );\n  }\n\n  getDrawnSignature(curves) {\n    const {\n      rawDims: { pageWidth, pageHeight },\n      rotation,\n    } = this.parent.viewport;\n    return SignatureExtractor.processDrawnLines({\n      lines: curves,\n      pageWidth,\n      pageHeight,\n      rotation,\n      innerMargin: SignatureEditor._INNER_MARGIN,\n      mustSmooth: false,\n      areContours: false,\n    });\n  }\n\n  /** @inheritdoc */\n  createDrawingOptions({ areContours, thickness }) {\n    if (areContours) {\n      this._drawingOptions = SignatureEditor.getDefaultDrawingOptions();\n    } else {\n      this._drawingOptions =\n        SignatureEditor._defaultDrawnSignatureOptions.clone();\n      this._drawingOptions.updateProperties({ \"stroke-width\": thickness });\n    }\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false) {\n    if (this.isEmpty()) {\n      return null;\n    }\n\n    const { lines, points } = this.serializeDraw(isForCopying);\n    const {\n      _drawingOptions: { \"stroke-width\": thickness },\n    } = this;\n    const serialized = Object.assign(super.serialize(isForCopying), {\n      isSignature: true,\n      areContours: this.#isExtracted,\n      color: [0, 0, 0],\n      thickness: this.#isExtracted ? 0 : thickness,\n    });\n    this.addComment(serialized);\n    if (isForCopying) {\n      serialized.paths = { lines, points };\n      serialized.uuid = this.#signatureUUID;\n      serialized.isCopy = true;\n    } else {\n      serialized.lines = lines;\n    }\n    if (this.#description) {\n      serialized.accessibilityData = { type: \"Figure\", alt: this.#description };\n    }\n    return serialized;\n  }\n\n  /** @inheritdoc */\n  static deserializeDraw(\n    pageX,\n    pageY,\n    pageWidth,\n    pageHeight,\n    innerMargin,\n    data\n  ) {\n    if (data.areContours) {\n      return ContourDrawOutline.deserialize(\n        pageX,\n        pageY,\n        pageWidth,\n        pageHeight,\n        innerMargin,\n        data\n      );\n    }\n\n    return InkDrawOutline.deserialize(\n      pageX,\n      pageY,\n      pageWidth,\n      pageHeight,\n      innerMargin,\n      data\n    );\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    const editor = await super.deserialize(data, parent, uiManager);\n    editor.#isExtracted = data.areContours;\n    editor.description = data.accessibilityData?.alt || \"\";\n    editor.#signatureUUID = data.uuid;\n    return editor;\n  }\n}\n\nexport { SignatureEditor };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationEditorType, AnnotationPrefix } from \"../../shared/util.js\";\nimport {\n  ColorScheme,\n  OutputScale,\n  PixelsPerInch,\n  SupportedImageMimeTypes,\n} from \"../display_utils.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { StampAnnotationElement } from \"../annotation_layer.js\";\n\n/**\n * Basic text editor in order to create a FreeTex annotation.\n */\nclass StampEditor extends AnnotationEditor {\n  #bitmap = null;\n\n  #bitmapId = null;\n\n  #bitmapPromise = null;\n\n  #bitmapUrl = null;\n\n  #bitmapFile = null;\n\n  #bitmapFileName = \"\";\n\n  #canvas = null;\n\n  #missingCanvas = false;\n\n  #resizeTimeoutId = null;\n\n  #isSvg = false;\n\n  #hasBeenAddedInUndoStack = false;\n\n  static _type = \"stamp\";\n\n  static _editorType = AnnotationEditorType.STAMP;\n\n  constructor(params) {\n    super({ ...params, name: \"stampEditor\" });\n    this.#bitmapUrl = params.bitmapUrl;\n    this.#bitmapFile = params.bitmapFile;\n    this.defaultL10nId = \"pdfjs-editor-stamp-editor\";\n  }\n\n  /** @inheritdoc */\n  static initialize(l10n, uiManager) {\n    AnnotationEditor.initialize(l10n, uiManager);\n  }\n\n  /** @inheritdoc */\n  static isHandlingMimeForPasting(mime) {\n    return SupportedImageMimeTypes.includes(mime);\n  }\n\n  /** @inheritdoc */\n  static paste(item, parent) {\n    parent.pasteEditor(\n      { mode: AnnotationEditorType.STAMP },\n      { bitmapFile: item.getAsFile() }\n    );\n  }\n\n  /** @inheritdoc */\n  altTextFinish() {\n    if (this._uiManager.useNewAltTextFlow) {\n      this.div.hidden = false;\n    }\n    super.altTextFinish();\n  }\n\n  /** @inheritdoc */\n  get telemetryFinalData() {\n    return {\n      type: \"stamp\",\n      hasAltText: !!this.altTextData?.altText,\n    };\n  }\n\n  static computeTelemetryFinalData(data) {\n    const hasAltTextStats = data.get(\"hasAltText\");\n    return {\n      hasAltText: hasAltTextStats.get(true) ?? 0,\n      hasNoAltText: hasAltTextStats.get(false) ?? 0,\n    };\n  }\n\n  #getBitmapFetched(data, fromId = false) {\n    if (!data) {\n      this.remove();\n      return;\n    }\n    this.#bitmap = data.bitmap;\n    if (!fromId) {\n      this.#bitmapId = data.id;\n      this.#isSvg = data.isSvg;\n    }\n    if (data.file) {\n      this.#bitmapFileName = data.file.name;\n    }\n    this.#createCanvas();\n  }\n\n  #getBitmapDone() {\n    this.#bitmapPromise = null;\n    this._uiManager.enableWaiting(false);\n    if (!this.#canvas) {\n      return;\n    }\n    if (\n      this._uiManager.useNewAltTextWhenAddingImage &&\n      this._uiManager.useNewAltTextFlow &&\n      this.#bitmap\n    ) {\n      this.addEditToolbar().then(() => {\n        this._editToolbar.hide();\n        this._uiManager.editAltText(this, /* firstTime = */ true);\n      });\n      return;\n    }\n\n    if (\n      !this._uiManager.useNewAltTextWhenAddingImage &&\n      this._uiManager.useNewAltTextFlow &&\n      this.#bitmap\n    ) {\n      this._reportTelemetry({\n        action: \"pdfjs.image.image_added\",\n        data: { alt_text_modal: false, alt_text_type: \"empty\" },\n      });\n      try {\n        // The alt-text dialog isn't opened but we still want to guess the alt\n        // text.\n        this.mlGuessAltText();\n      } catch {}\n    }\n\n    this.div.focus();\n  }\n\n  async mlGuessAltText(imageData = null, updateAltTextData = true) {\n    if (this.hasAltTextData()) {\n      return null;\n    }\n\n    const { mlManager } = this._uiManager;\n    if (!mlManager) {\n      throw new Error(\"No ML.\");\n    }\n    if (!(await mlManager.isEnabledFor(\"altText\"))) {\n      throw new Error(\"ML isn't enabled for alt text.\");\n    }\n    const { data, width, height } =\n      imageData ||\n      this.copyCanvas(null, null, /* createImageData = */ true).imageData;\n    const response = await mlManager.guess({\n      name: \"altText\",\n      request: {\n        data,\n        width,\n        height,\n        channels: data.length / (width * height),\n      },\n    });\n    if (!response) {\n      throw new Error(\"No response from the AI service.\");\n    }\n    if (response.error) {\n      throw new Error(\"Error from the AI service.\");\n    }\n    if (response.cancel) {\n      return null;\n    }\n    if (!response.output) {\n      throw new Error(\"No valid response from the AI service.\");\n    }\n    const altText = response.output;\n    await this.setGuessedAltText(altText);\n    if (updateAltTextData && !this.hasAltTextData()) {\n      this.altTextData = { alt: altText, decorative: false };\n    }\n    return altText;\n  }\n\n  #getBitmap() {\n    if (this.#bitmapId) {\n      this._uiManager.enableWaiting(true);\n      this._uiManager.imageManager\n        .getFromId(this.#bitmapId)\n        .then(data => this.#getBitmapFetched(data, /* fromId = */ true))\n        .finally(() => this.#getBitmapDone());\n      return;\n    }\n\n    if (this.#bitmapUrl) {\n      const url = this.#bitmapUrl;\n      this.#bitmapUrl = null;\n      this._uiManager.enableWaiting(true);\n      this.#bitmapPromise = this._uiManager.imageManager\n        .getFromUrl(url)\n        .then(data => this.#getBitmapFetched(data))\n        .finally(() => this.#getBitmapDone());\n      return;\n    }\n\n    if (this.#bitmapFile) {\n      const file = this.#bitmapFile;\n      this.#bitmapFile = null;\n      this._uiManager.enableWaiting(true);\n      this.#bitmapPromise = this._uiManager.imageManager\n        .getFromFile(file)\n        .then(data => this.#getBitmapFetched(data))\n        .finally(() => this.#getBitmapDone());\n      return;\n    }\n\n    const input = document.createElement(\"input\");\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      input.hidden = true;\n      input.id = \"stampEditorFileInput\";\n      document.body.append(input);\n    }\n    input.type = \"file\";\n    input.accept = SupportedImageMimeTypes.join(\",\");\n    const signal = this._uiManager._signal;\n    this.#bitmapPromise = new Promise(resolve => {\n      input.addEventListener(\n        \"change\",\n        async () => {\n          if (!input.files || input.files.length === 0) {\n            this.remove();\n          } else {\n            this._uiManager.enableWaiting(true);\n            const data = await this._uiManager.imageManager.getFromFile(\n              input.files[0]\n            );\n            this._reportTelemetry({\n              action: \"pdfjs.image.image_selected\",\n              data: { alt_text_modal: this._uiManager.useNewAltTextFlow },\n            });\n            this.#getBitmapFetched(data);\n          }\n          if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n            input.remove();\n          }\n          resolve();\n        },\n        { signal }\n      );\n      input.addEventListener(\n        \"cancel\",\n        () => {\n          this.remove();\n          resolve();\n        },\n        { signal }\n      );\n    }).finally(() => this.#getBitmapDone());\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"TESTING\")) {\n      input.click();\n    }\n  }\n\n  /** @inheritdoc */\n  remove() {\n    if (this.#bitmapId) {\n      this.#bitmap = null;\n      this._uiManager.imageManager.deleteId(this.#bitmapId);\n      this.#canvas?.remove();\n      this.#canvas = null;\n      if (this.#resizeTimeoutId) {\n        clearTimeout(this.#resizeTimeoutId);\n        this.#resizeTimeoutId = null;\n      }\n    }\n    super.remove();\n  }\n\n  /** @inheritdoc */\n  rebuild() {\n    if (!this.parent) {\n      // It's possible to have to rebuild an editor which is not on a visible\n      // page.\n      if (this.#bitmapId) {\n        this.#getBitmap();\n      }\n      return;\n    }\n    super.rebuild();\n    if (this.div === null) {\n      return;\n    }\n\n    if (this.#bitmapId && this.#canvas === null) {\n      this.#getBitmap();\n    }\n\n    if (!this.isAttachedToDOM) {\n      // At some point this editor was removed and we're rebuilting it,\n      // hence we must add it to its parent.\n      this.parent.add(this);\n    }\n  }\n\n  /** @inheritdoc */\n  onceAdded(focus) {\n    this._isDraggable = true;\n    if (focus) {\n      this.div.focus();\n    }\n  }\n\n  /** @inheritdoc */\n  isEmpty() {\n    return !(\n      this.#bitmapPromise ||\n      this.#bitmap ||\n      this.#bitmapUrl ||\n      this.#bitmapFile ||\n      this.#bitmapId ||\n      this.#missingCanvas\n    );\n  }\n\n  /** @inheritdoc */\n  get toolbarButtons() {\n    return [[\"altText\", this.createAltText()]];\n  }\n\n  /** @inheritdoc */\n  get isResizable() {\n    return true;\n  }\n\n  /** @inheritdoc */\n  render() {\n    if (this.div) {\n      return this.div;\n    }\n\n    let baseX, baseY;\n    if (this._isCopy) {\n      baseX = this.x;\n      baseY = this.y;\n    }\n\n    super.render();\n    this.div.hidden = true;\n\n    this.createAltText();\n\n    if (!this.#missingCanvas) {\n      if (this.#bitmap) {\n        this.#createCanvas();\n      } else {\n        this.#getBitmap();\n      }\n    }\n\n    if (this._isCopy) {\n      this._moveAfterPaste(baseX, baseY);\n    }\n\n    this._uiManager.addShouldRescale(this);\n\n    return this.div;\n  }\n\n  setCanvas(annotationElementId, canvas) {\n    const { id: bitmapId, bitmap } = this._uiManager.imageManager.getFromCanvas(\n      annotationElementId,\n      canvas\n    );\n    canvas.remove();\n    if (bitmapId && this._uiManager.imageManager.isValidId(bitmapId)) {\n      this.#bitmapId = bitmapId;\n      if (bitmap) {\n        this.#bitmap = bitmap;\n      }\n      this.#missingCanvas = false;\n      this.#createCanvas();\n    }\n  }\n\n  /** @inheritdoc */\n  _onResized() {\n    // We used a CSS-zoom during the resizing, but now it's resized we can\n    // rescale correctly the bitmap to fit the new dimensions.\n    this.onScaleChanging();\n  }\n\n  onScaleChanging() {\n    if (!this.parent) {\n      return;\n    }\n    if (this.#resizeTimeoutId !== null) {\n      clearTimeout(this.#resizeTimeoutId);\n    }\n    // The user's zooming the page, there is no need to redraw the bitmap at\n    // each step, hence we wait a bit before redrawing it.\n    const TIME_TO_WAIT = 200;\n    this.#resizeTimeoutId = setTimeout(() => {\n      this.#resizeTimeoutId = null;\n      this.#drawBitmap();\n    }, TIME_TO_WAIT);\n  }\n\n  #createCanvas() {\n    const { div } = this;\n    let { width, height } = this.#bitmap;\n    const [pageWidth, pageHeight] = this.pageDimensions;\n    const MAX_RATIO = 0.75;\n    if (this.width) {\n      width = this.width * pageWidth;\n      height = this.height * pageHeight;\n    } else if (\n      width > MAX_RATIO * pageWidth ||\n      height > MAX_RATIO * pageHeight\n    ) {\n      // If the image is too big compared to the page dimensions\n      // (more than MAX_RATIO) then we scale it down.\n      const factor = Math.min(\n        (MAX_RATIO * pageWidth) / width,\n        (MAX_RATIO * pageHeight) / height\n      );\n      width *= factor;\n      height *= factor;\n    }\n\n    this._uiManager.enableWaiting(false);\n    const canvas = (this.#canvas = document.createElement(\"canvas\"));\n    canvas.setAttribute(\"role\", \"img\");\n    this.addContainer(canvas);\n\n    this.width = width / pageWidth;\n    this.height = height / pageHeight;\n    this.setDims();\n\n    if (this._initialOptions?.isCentered) {\n      this.center();\n    } else {\n      this.fixAndSetPosition();\n    }\n    this._initialOptions = null;\n\n    if (\n      !this._uiManager.useNewAltTextWhenAddingImage ||\n      !this._uiManager.useNewAltTextFlow ||\n      this.annotationElementId\n    ) {\n      div.hidden = false;\n    }\n    this.#drawBitmap();\n    if (!this.#hasBeenAddedInUndoStack) {\n      this.parent.addUndoableEditor(this);\n      this.#hasBeenAddedInUndoStack = true;\n    }\n\n    // There are multiple ways to add an image to the page, so here we just\n    // count the number of times an image is added to the page whatever the way\n    // is.\n    this._reportTelemetry({\n      action: \"inserted_image\",\n    });\n    if (this.#bitmapFileName) {\n      this.div.setAttribute(\"aria-description\", this.#bitmapFileName);\n    }\n    if (!this.annotationElementId) {\n      this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.stamp);\n    }\n  }\n\n  copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) {\n    if (!maxDataDimension) {\n      // TODO: get this value from Firefox\n      //   (https://bugzilla.mozilla.org/show_bug.cgi?id=1908184)\n      // It's the maximum dimension that the AI can handle.\n      maxDataDimension = 224;\n    }\n\n    const { width: bitmapWidth, height: bitmapHeight } = this.#bitmap;\n    const outputScale = new OutputScale();\n\n    let bitmap = this.#bitmap;\n    let width = bitmapWidth,\n      height = bitmapHeight;\n    let canvas = null;\n\n    if (maxPreviewDimension) {\n      if (\n        bitmapWidth > maxPreviewDimension ||\n        bitmapHeight > maxPreviewDimension\n      ) {\n        const ratio = Math.min(\n          maxPreviewDimension / bitmapWidth,\n          maxPreviewDimension / bitmapHeight\n        );\n        width = Math.floor(bitmapWidth * ratio);\n        height = Math.floor(bitmapHeight * ratio);\n      }\n\n      canvas = document.createElement(\"canvas\");\n      const scaledWidth = (canvas.width = Math.ceil(width * outputScale.sx));\n      const scaledHeight = (canvas.height = Math.ceil(height * outputScale.sy));\n\n      if (!this.#isSvg) {\n        bitmap = this.#scaleBitmap(scaledWidth, scaledHeight);\n      }\n\n      const ctx = canvas.getContext(\"2d\");\n      ctx.filter = this._uiManager.hcmFilter;\n\n      // Add a checkerboard pattern as a background in case the image has some\n      // transparency.\n      let white = \"white\",\n        black = \"#cfcfd8\";\n      if (this._uiManager.hcmFilter !== \"none\") {\n        black = \"black\";\n      } else if (ColorScheme.isDarkMode) {\n        white = \"#8f8f9d\";\n        black = \"#42414d\";\n      }\n      const boxDim = 15;\n      const boxDimWidth = boxDim * outputScale.sx;\n      const boxDimHeight = boxDim * outputScale.sy;\n      const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2);\n      const patternCtx = pattern.getContext(\"2d\");\n      patternCtx.fillStyle = white;\n      patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2);\n      patternCtx.fillStyle = black;\n      patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight);\n      patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight);\n      ctx.fillStyle = ctx.createPattern(pattern, \"repeat\");\n      ctx.fillRect(0, 0, scaledWidth, scaledHeight);\n      ctx.drawImage(\n        bitmap,\n        0,\n        0,\n        bitmap.width,\n        bitmap.height,\n        0,\n        0,\n        scaledWidth,\n        scaledHeight\n      );\n    }\n\n    let imageData = null;\n    if (createImageData) {\n      let dataWidth, dataHeight;\n      if (\n        outputScale.symmetric &&\n        bitmap.width < maxDataDimension &&\n        bitmap.height < maxDataDimension\n      ) {\n        dataWidth = bitmap.width;\n        dataHeight = bitmap.height;\n      } else {\n        bitmap = this.#bitmap;\n        if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) {\n          const ratio = Math.min(\n            maxDataDimension / bitmapWidth,\n            maxDataDimension / bitmapHeight\n          );\n          dataWidth = Math.floor(bitmapWidth * ratio);\n          dataHeight = Math.floor(bitmapHeight * ratio);\n\n          if (!this.#isSvg) {\n            bitmap = this.#scaleBitmap(dataWidth, dataHeight);\n          }\n        }\n      }\n\n      const offscreen = new OffscreenCanvas(dataWidth, dataHeight);\n      const offscreenCtx = offscreen.getContext(\"2d\", {\n        willReadFrequently: true,\n      });\n      offscreenCtx.drawImage(\n        bitmap,\n        0,\n        0,\n        bitmap.width,\n        bitmap.height,\n        0,\n        0,\n        dataWidth,\n        dataHeight\n      );\n      imageData = {\n        width: dataWidth,\n        height: dataHeight,\n        data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data,\n      };\n    }\n\n    return { canvas, width, height, imageData };\n  }\n\n  #scaleBitmap(width, height) {\n    const { width: bitmapWidth, height: bitmapHeight } = this.#bitmap;\n\n    let newWidth = bitmapWidth;\n    let newHeight = bitmapHeight;\n    let bitmap = this.#bitmap;\n    while (newWidth > 2 * width || newHeight > 2 * height) {\n      const prevWidth = newWidth;\n      const prevHeight = newHeight;\n\n      if (newWidth > 2 * width) {\n        newWidth = Math.ceil(newWidth / 2);\n      }\n      if (newHeight > 2 * height) {\n        newHeight = Math.ceil(newHeight / 2);\n      }\n\n      const offscreen = new OffscreenCanvas(newWidth, newHeight);\n      const ctx = offscreen.getContext(\"2d\");\n      ctx.drawImage(\n        bitmap,\n        0,\n        0,\n        prevWidth,\n        prevHeight,\n        0,\n        0,\n        newWidth,\n        newHeight\n      );\n      bitmap = offscreen.transferToImageBitmap();\n    }\n\n    return bitmap;\n  }\n\n  #drawBitmap() {\n    const [parentWidth, parentHeight] = this.parentDimensions;\n    const { width, height } = this;\n    const outputScale = new OutputScale();\n    const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx);\n    const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy);\n    const canvas = this.#canvas;\n\n    if (\n      !canvas ||\n      (canvas.width === scaledWidth && canvas.height === scaledHeight)\n    ) {\n      return;\n    }\n\n    canvas.width = scaledWidth;\n    canvas.height = scaledHeight;\n\n    const bitmap = this.#isSvg\n      ? this.#bitmap\n      : this.#scaleBitmap(scaledWidth, scaledHeight);\n\n    const ctx = canvas.getContext(\"2d\");\n    ctx.filter = this._uiManager.hcmFilter;\n    ctx.drawImage(\n      bitmap,\n      0,\n      0,\n      bitmap.width,\n      bitmap.height,\n      0,\n      0,\n      scaledWidth,\n      scaledHeight\n    );\n  }\n\n  #serializeBitmap(toUrl) {\n    if (toUrl) {\n      if (this.#isSvg) {\n        const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId);\n        if (url) {\n          return url;\n        }\n      }\n      // We convert to a data url because it's sync and the url can live in the\n      // clipboard.\n      const canvas = document.createElement(\"canvas\");\n      ({ width: canvas.width, height: canvas.height } = this.#bitmap);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.drawImage(this.#bitmap, 0, 0);\n\n      return canvas.toDataURL();\n    }\n\n    if (this.#isSvg) {\n      const [pageWidth, pageHeight] = this.pageDimensions;\n      // Multiply by PixelsPerInch.PDF_TO_CSS_UNITS in order to increase the\n      // image resolution when rasterizing it.\n      const width = Math.round(\n        this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS\n      );\n      const height = Math.round(\n        this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS\n      );\n      const offscreen = new OffscreenCanvas(width, height);\n      const ctx = offscreen.getContext(\"2d\");\n      ctx.drawImage(\n        this.#bitmap,\n        0,\n        0,\n        this.#bitmap.width,\n        this.#bitmap.height,\n        0,\n        0,\n        width,\n        height\n      );\n      return offscreen.transferToImageBitmap();\n    }\n\n    return structuredClone(this.#bitmap);\n  }\n\n  /** @inheritdoc */\n  static async deserialize(data, parent, uiManager) {\n    let initialData = null;\n    let missingCanvas = false;\n    if (data instanceof StampAnnotationElement) {\n      const {\n        data: {\n          rect,\n          rotation,\n          id,\n          structParent,\n          popupRef,\n          richText,\n          contentsObj,\n          creationDate,\n          modificationDate,\n        },\n        container,\n        parent: {\n          page: { pageNumber },\n        },\n        canvas,\n      } = data;\n      let bitmapId, bitmap;\n      if (canvas) {\n        delete data.canvas;\n        ({ id: bitmapId, bitmap } = uiManager.imageManager.getFromCanvas(\n          container.id,\n          canvas\n        ));\n        canvas.remove();\n      } else {\n        missingCanvas = true;\n        data._hasNoCanvas = true;\n      }\n\n      // When switching to edit mode, we wait for the structure tree to be\n      // ready (see pdf_viewer.js), so it's fine to use getAriaAttributesSync.\n      const altText =\n        (\n          await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`)\n        )?.get(\"aria-label\") || \"\";\n\n      initialData = data = {\n        annotationType: AnnotationEditorType.STAMP,\n        bitmapId,\n        bitmap,\n        pageIndex: pageNumber - 1,\n        rect: rect.slice(0),\n        rotation,\n        annotationElementId: id,\n        id,\n        deleted: false,\n        accessibilityData: {\n          decorative: false,\n          altText,\n        },\n        isSvg: false,\n        structParent,\n        popupRef,\n        richText,\n        comment: contentsObj?.str || null,\n        creationDate,\n        modificationDate,\n      };\n    }\n    const editor = await super.deserialize(data, parent, uiManager);\n    const { rect, bitmap, bitmapUrl, bitmapId, isSvg, accessibilityData } =\n      data;\n    if (missingCanvas) {\n      uiManager.addMissingCanvas(data.id, editor);\n      editor.#missingCanvas = true;\n    } else if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) {\n      editor.#bitmapId = bitmapId;\n      if (bitmap) {\n        editor.#bitmap = bitmap;\n      }\n    } else {\n      editor.#bitmapUrl = bitmapUrl;\n    }\n    editor.#isSvg = isSvg;\n\n    const [parentWidth, parentHeight] = editor.pageDimensions;\n    editor.width = (rect[2] - rect[0]) / parentWidth;\n    editor.height = (rect[3] - rect[1]) / parentHeight;\n\n    if (accessibilityData) {\n      editor.altTextData = accessibilityData;\n    }\n    editor._initialData = initialData;\n    if (data.comment) {\n      editor.setCommentData(data);\n    }\n    // No need to be add in the undo stack if the editor is created from an\n    // existing one.\n    editor.#hasBeenAddedInUndoStack = !!initialData;\n\n    return editor;\n  }\n\n  /** @inheritdoc */\n  serialize(isForCopying = false, context = null) {\n    if (this.isEmpty()) {\n      return null;\n    }\n\n    if (this.deleted) {\n      return this.serializeDeleted();\n    }\n\n    const serialized = Object.assign(super.serialize(isForCopying), {\n      bitmapId: this.#bitmapId,\n      isSvg: this.#isSvg,\n    });\n    this.addComment(serialized);\n\n    if (isForCopying) {\n      // We don't know what's the final destination (this pdf or another one)\n      // of this annotation and the clipboard doesn't support ImageBitmaps,\n      // hence we serialize the bitmap to a data url.\n      serialized.bitmapUrl = this.#serializeBitmap(/* toUrl = */ true);\n      serialized.accessibilityData = this.serializeAltText(true);\n      serialized.isCopy = true;\n      return serialized;\n    }\n\n    const { decorative, altText } = this.serializeAltText(false);\n    if (!decorative && altText) {\n      serialized.accessibilityData = { type: \"Figure\", alt: altText };\n    }\n    if (this.annotationElementId) {\n      const changes = this.#hasElementChanged(serialized);\n      if (changes.isSame) {\n        // Nothing has been changed.\n        return null;\n      }\n      if (changes.isSameAltText) {\n        delete serialized.accessibilityData;\n      } else {\n        serialized.accessibilityData.structParent =\n          this._initialData.structParent ?? -1;\n      }\n      serialized.id = this.annotationElementId;\n      delete serialized.bitmapId;\n      return serialized;\n    }\n\n    if (context === null) {\n      return serialized;\n    }\n\n    context.stamps ||= new Map();\n    const area = this.#isSvg\n      ? (serialized.rect[2] - serialized.rect[0]) *\n        (serialized.rect[3] - serialized.rect[1])\n      : null;\n    if (!context.stamps.has(this.#bitmapId)) {\n      // We don't want to have multiple copies of the same bitmap in the\n      // annotationMap, hence we only add the bitmap the first time we meet it.\n      context.stamps.set(this.#bitmapId, { area, serialized });\n      serialized.bitmap = this.#serializeBitmap(/* toUrl = */ false);\n    } else if (this.#isSvg) {\n      // If we have multiple copies of the same svg but with different sizes,\n      // then we want to keep the biggest one.\n      const prevData = context.stamps.get(this.#bitmapId);\n      if (area > prevData.area) {\n        prevData.area = area;\n        prevData.serialized.bitmap.close();\n        prevData.serialized.bitmap = this.#serializeBitmap(/* toUrl = */ false);\n      }\n    }\n    return serialized;\n  }\n\n  #hasElementChanged(serialized) {\n    const {\n      pageIndex,\n      accessibilityData: { altText },\n    } = this._initialData;\n\n    const isSamePageIndex = serialized.pageIndex === pageIndex;\n    const isSameAltText = (serialized.accessibilityData?.alt || \"\") === altText;\n\n    return {\n      isSame:\n        !this.hasEditedComment &&\n        !this._hasBeenMoved &&\n        !this._hasBeenResized &&\n        isSamePageIndex &&\n        isSameAltText,\n      isSameAltText,\n    };\n  }\n\n  /** @inheritdoc */\n  renderAnnotationElement(annotation) {\n    if (this.deleted) {\n      annotation.hide();\n      return null;\n    }\n    annotation.updateEdited({\n      rect: this.getPDFRect(),\n      popup: this.comment,\n    });\n\n    return null;\n  }\n}\n\nexport { StampEditor };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./tools.js\").AnnotationEditorUIManager} AnnotationEditorUIManager */\n/** @typedef {import(\"../page_viewport.js\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../../web/text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../annotation_layer.js\").AnnotationLayer} AnnotationLayer */\n/** @typedef {import(\"../draw_layer.js\").DrawLayer} DrawLayer */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../../web/struct_tree_layer_builder.js\").StructTreeLayerBuilder} StructTreeLayerBuilder */\n/** @typedef {import(\"../../../web/l10n.js\").L10n} L10n */\n\nimport {\n  AnnotationEditorPrefix,\n  AnnotationEditorType,\n  FeatureTest,\n} from \"../../shared/util.js\";\nimport { setLayerDimensions, stopEvent } from \"../display_utils.js\";\nimport { AnnotationEditor } from \"./editor.js\";\nimport { FreeTextEditor } from \"./freetext.js\";\nimport { HighlightEditor } from \"./highlight.js\";\nimport { InkEditor } from \"./ink.js\";\nimport { SignatureEditor } from \"./signature.js\";\nimport { StampEditor } from \"./stamp.js\";\n\n/**\n * @typedef {Object} AnnotationEditorLayerOptions\n * @property {Object} mode\n * @property {HTMLDivElement} div\n * @property {StructTreeLayerBuilder} structTreeLayer\n * @property {AnnotationEditorUIManager} uiManager\n * @property {boolean} enabled\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {number} pageIndex\n * @property {L10n} l10n\n * @property {AnnotationLayer} [annotationLayer]\n * @property {HTMLDivElement} [textLayer]\n * @property {DrawLayer} drawLayer\n * @property {PageViewport} viewport\n */\n\n/**\n * @typedef {Object} RenderEditorLayerOptions\n * @property {PageViewport} viewport\n */\n\n/**\n * Manage all the different editors on a page.\n */\nclass AnnotationEditorLayer {\n  #accessibilityManager;\n\n  #allowClick = false;\n\n  #annotationLayer = null;\n\n  #clickAC = null;\n\n  #editorFocusTimeoutId = null;\n\n  #editors = new Map();\n\n  #hadPointerDown = false;\n\n  #isDisabling = false;\n\n  #isEnabling = false;\n\n  #drawingAC = null;\n\n  #focusedElement = null;\n\n  #textLayer = null;\n\n  #textSelectionAC = null;\n\n  #textLayerDblClickAC = null;\n\n  #lastPointerDownTimestamp = -1;\n\n  #uiManager;\n\n  static _initialized = false;\n\n  static #editorTypes = new Map(\n    [\n      FreeTextEditor,\n      InkEditor,\n      StampEditor,\n      HighlightEditor,\n      SignatureEditor,\n    ].map(type => [type._editorType, type])\n  );\n\n  /**\n   * @param {AnnotationEditorLayerOptions} options\n   */\n  constructor({\n    uiManager,\n    pageIndex,\n    div,\n    structTreeLayer,\n    accessibilityManager,\n    annotationLayer,\n    drawLayer,\n    textLayer,\n    viewport,\n    l10n,\n  }) {\n    const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()];\n    if (!AnnotationEditorLayer._initialized) {\n      AnnotationEditorLayer._initialized = true;\n      for (const editorType of editorTypes) {\n        editorType.initialize(l10n, uiManager);\n      }\n    }\n    uiManager.registerEditorTypes(editorTypes);\n\n    this.#uiManager = uiManager;\n    this.pageIndex = pageIndex;\n    this.div = div;\n    this.#accessibilityManager = accessibilityManager;\n    this.#annotationLayer = annotationLayer;\n    this.viewport = viewport;\n    this.#textLayer = textLayer;\n    this.drawLayer = drawLayer;\n    this._structTree = structTreeLayer;\n\n    this.#uiManager.addLayer(this);\n  }\n\n  get isEmpty() {\n    return this.#editors.size === 0;\n  }\n\n  get isInvisible() {\n    return (\n      this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE\n    );\n  }\n\n  /**\n   * Update the toolbar if it's required to reflect the tool currently used.\n   * @param {Object} options\n   */\n  updateToolbar(options) {\n    this.#uiManager.updateToolbar(options);\n  }\n\n  /**\n   * The mode has changed: it must be updated.\n   * @param {number} mode\n   */\n  updateMode(mode = this.#uiManager.getMode()) {\n    this.#cleanup();\n    switch (mode) {\n      case AnnotationEditorType.NONE:\n        this.div.classList.toggle(\"nonEditing\", true);\n        this.disableTextSelection();\n        this.togglePointerEvents(false);\n        this.toggleAnnotationLayerPointerEvents(true);\n        this.disableClick();\n        return;\n      case AnnotationEditorType.INK:\n        this.disableTextSelection();\n        this.togglePointerEvents(true);\n        this.enableClick();\n        break;\n      case AnnotationEditorType.HIGHLIGHT:\n        this.enableTextSelection();\n        this.togglePointerEvents(false);\n        this.disableClick();\n        break;\n      default:\n        this.disableTextSelection();\n        this.togglePointerEvents(true);\n        this.enableClick();\n    }\n\n    this.toggleAnnotationLayerPointerEvents(false);\n    const { classList } = this.div;\n    classList.toggle(\"nonEditing\", false);\n    if (mode === AnnotationEditorType.POPUP) {\n      classList.toggle(\"commentEditing\", true);\n    } else {\n      classList.toggle(\"commentEditing\", false);\n      for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {\n        classList.toggle(\n          `${editorType._type}Editing`,\n          mode === editorType._editorType\n        );\n      }\n    }\n    this.div.hidden = false;\n  }\n\n  hasTextLayer(textLayer) {\n    return textLayer === this.#textLayer?.div;\n  }\n\n  /**\n   * Set the editing state.\n   * @param {boolean} isEditing\n   */\n  setEditingState(isEditing) {\n    this.#uiManager.setEditingState(isEditing);\n  }\n\n  /**\n   * Add some commands into the CommandManager (undo/redo stuff).\n   * @param {Object} params\n   */\n  addCommands(params) {\n    this.#uiManager.addCommands(params);\n  }\n\n  cleanUndoStack(type) {\n    this.#uiManager.cleanUndoStack(type);\n  }\n\n  toggleDrawing(enabled = false) {\n    this.div.classList.toggle(\"drawing\", !enabled);\n  }\n\n  togglePointerEvents(enabled = false) {\n    this.div.classList.toggle(\"disabled\", !enabled);\n  }\n\n  toggleAnnotationLayerPointerEvents(enabled = false) {\n    this.#annotationLayer?.togglePointerEvents(enabled);\n  }\n\n  get #allEditorsIterator() {\n    return this.#editors.size !== 0\n      ? this.#editors.values()\n      : this.#uiManager.getEditors(this.pageIndex);\n  }\n\n  /**\n   * Enable pointer events on the main div in order to enable\n   * editor creation.\n   */\n  async enable() {\n    this.#isEnabling = true;\n    this.div.tabIndex = 0;\n    this.togglePointerEvents(true);\n    this.div.classList.toggle(\"nonEditing\", false);\n    this.#textLayerDblClickAC?.abort();\n    this.#textLayerDblClickAC = null;\n    const annotationElementIds = new Set();\n    for (const editor of this.#allEditorsIterator) {\n      editor.enableEditing();\n      editor.show(true);\n      if (editor.annotationElementId) {\n        this.#uiManager.removeChangedExistingAnnotation(editor);\n        annotationElementIds.add(editor.annotationElementId);\n      }\n    }\n\n    const annotationLayer = this.#annotationLayer;\n    if (annotationLayer) {\n      for (const editable of annotationLayer.getEditableAnnotations()) {\n        // The element must be hidden whatever its state is.\n        editable.hide();\n        if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) {\n          continue;\n        }\n        if (annotationElementIds.has(editable.data.id)) {\n          continue;\n        }\n        const editor = await this.deserialize(editable);\n        if (!editor) {\n          continue;\n        }\n        this.addOrRebuild(editor);\n        editor.enableEditing();\n      }\n    }\n    this.#isEnabling = false;\n    this.#uiManager._eventBus.dispatch(\"editorsrendered\", {\n      source: this,\n      pageNumber: this.pageIndex + 1,\n    });\n  }\n\n  /**\n   * Disable editor creation.\n   */\n  disable() {\n    this.#isDisabling = true;\n    this.div.tabIndex = -1;\n    this.togglePointerEvents(false);\n    this.div.classList.toggle(\"nonEditing\", true);\n    if (this.#textLayer && !this.#textLayerDblClickAC) {\n      this.#textLayerDblClickAC = new AbortController();\n      const signal = this.#uiManager.combinedSignal(this.#textLayerDblClickAC);\n      this.#textLayer.div.addEventListener(\n        \"pointerdown\",\n        e => {\n          // It's the default value in Fenix:\n          // https://searchfox.org/mozilla-central/rev/beba5cde846f944c4d709e75cbe499d17af880a4/modules/libpref/init/StaticPrefList.yaml#19064\n          // and in Chrome and Windows:\n          // https://source.chromium.org/chromium/chromium/src/+/main:ui/events/event_constants.h;drc=f0f5f3ceebb00da9363ccc7a1e2c0f17b6b383ba;l=115\n          const DBL_CLICK_THRESHOLD = 500;\n          const { clientX, clientY, timeStamp } = e;\n          const lastPointerDownTimestamp = this.#lastPointerDownTimestamp;\n          if (timeStamp - lastPointerDownTimestamp > DBL_CLICK_THRESHOLD) {\n            this.#lastPointerDownTimestamp = timeStamp;\n            return;\n          }\n          this.#lastPointerDownTimestamp = -1;\n          const { classList } = this.div;\n          classList.toggle(\"getElements\", true);\n          const elements = document.elementsFromPoint(clientX, clientY);\n          classList.toggle(\"getElements\", false);\n          if (!this.div.contains(elements[0])) {\n            return;\n          }\n          let id;\n          const regex = new RegExp(`^${AnnotationEditorPrefix}[0-9]+$`);\n          for (const element of elements) {\n            if (regex.test(element.id)) {\n              id = element.id;\n              break;\n            }\n          }\n          if (!id) {\n            return;\n          }\n          const editor = this.#editors.get(id);\n          if (editor?.annotationElementId === null) {\n            stopEvent(e);\n            editor.dblclick(e);\n          }\n        },\n        { signal, capture: true }\n      );\n    }\n\n    const annotationLayer = this.#annotationLayer;\n    const needFakeAnnotation = [];\n    if (annotationLayer) {\n      const changedAnnotations = new Map();\n      const resetAnnotations = new Map();\n      for (const editor of this.#allEditorsIterator) {\n        editor.disableEditing();\n        if (!editor.annotationElementId) {\n          needFakeAnnotation.push(editor);\n          continue;\n        }\n        if (editor.serialize() !== null) {\n          changedAnnotations.set(editor.annotationElementId, editor);\n          continue;\n        } else {\n          resetAnnotations.set(editor.annotationElementId, editor);\n        }\n        this.getEditableAnnotation(editor.annotationElementId)?.show();\n        editor.remove();\n      }\n\n      // Show the annotations that were hidden in enable().\n      for (const editable of annotationLayer.getEditableAnnotations()) {\n        const { id } = editable.data;\n        if (this.#uiManager.isDeletedAnnotationElement(id)) {\n          editable.updateEdited({ deleted: true });\n          continue;\n        }\n        let editor = resetAnnotations.get(id);\n        if (editor) {\n          editor.resetAnnotationElement(editable);\n          editor.show(false);\n          editable.show();\n          continue;\n        }\n\n        editor = changedAnnotations.get(id);\n        if (editor) {\n          this.#uiManager.addChangedExistingAnnotation(editor);\n          if (editor.renderAnnotationElement(editable)) {\n            // Content has changed, so we need to hide the editor.\n            editor.show(false);\n          }\n        }\n        editable.show();\n      }\n    }\n\n    this.#cleanup();\n    if (this.isEmpty) {\n      this.div.hidden = true;\n    }\n    const { classList } = this.div;\n    for (const editorType of AnnotationEditorLayer.#editorTypes.values()) {\n      classList.remove(`${editorType._type}Editing`);\n    }\n    this.disableTextSelection();\n    this.toggleAnnotationLayerPointerEvents(true);\n    annotationLayer?.updateFakeAnnotations(needFakeAnnotation);\n\n    this.#isDisabling = false;\n  }\n\n  getEditableAnnotation(id) {\n    return this.#annotationLayer?.getEditableAnnotation(id) || null;\n  }\n\n  /**\n   * Set the current editor.\n   * @param {AnnotationEditor} editor\n   */\n  setActiveEditor(editor) {\n    const currentActive = this.#uiManager.getActive();\n    if (currentActive === editor) {\n      return;\n    }\n\n    this.#uiManager.setActiveEditor(editor);\n  }\n\n  enableTextSelection() {\n    this.div.tabIndex = -1;\n    if (this.#textLayer?.div && !this.#textSelectionAC) {\n      this.#textSelectionAC = new AbortController();\n      const signal = this.#uiManager.combinedSignal(this.#textSelectionAC);\n\n      this.#textLayer.div.addEventListener(\n        \"pointerdown\",\n        this.#textLayerPointerDown.bind(this),\n        { signal }\n      );\n      this.#textLayer.div.classList.add(\"highlighting\");\n    }\n  }\n\n  disableTextSelection() {\n    this.div.tabIndex = 0;\n    if (this.#textLayer?.div && this.#textSelectionAC) {\n      this.#textSelectionAC.abort();\n      this.#textSelectionAC = null;\n\n      this.#textLayer.div.classList.remove(\"highlighting\");\n    }\n  }\n\n  #textLayerPointerDown(event) {\n    // Unselect all the editors in order to let the user select some text\n    // without being annoyed by an editor toolbar.\n    this.#uiManager.unselectAll();\n    const { target } = event;\n    if (\n      target === this.#textLayer.div ||\n      ((target.getAttribute(\"role\") === \"img\" ||\n        target.classList.contains(\"endOfContent\") ||\n        target.classList.contains(\"textLayerImages\") ||\n        target.classList.contains(\"textLayerImagePlaceholder\")) &&\n        this.#textLayer.div.contains(target))\n    ) {\n      const { isMac } = FeatureTest.platform;\n      if (event.button !== 0 || (event.ctrlKey && isMac)) {\n        // Do nothing on right click.\n        return;\n      }\n      this.#uiManager.showAllEditors(\n        \"highlight\",\n        true,\n        /* updateButton = */ true\n      );\n      this.#textLayer.div.classList.add(\"free\");\n      this.toggleDrawing();\n      HighlightEditor.startHighlighting(\n        this,\n        this.#uiManager.direction === \"ltr\",\n        { target: this.#textLayer.div, x: event.x, y: event.y }\n      );\n      this.#textLayer.div.addEventListener(\n        \"pointerup\",\n        () => {\n          this.#textLayer.div.classList.remove(\"free\");\n          this.toggleDrawing(true);\n        },\n        { once: true, signal: this.#uiManager._signal }\n      );\n      event.preventDefault();\n    }\n  }\n\n  enableClick() {\n    if (this.#clickAC) {\n      return;\n    }\n    this.#clickAC = new AbortController();\n    const signal = this.#uiManager.combinedSignal(this.#clickAC);\n\n    this.div.addEventListener(\"pointerdown\", this.pointerdown.bind(this), {\n      signal,\n    });\n    const pointerup = this.pointerup.bind(this);\n    this.div.addEventListener(\"pointerup\", pointerup, { signal });\n    this.div.addEventListener(\"pointercancel\", pointerup, { signal });\n  }\n\n  disableClick() {\n    this.#clickAC?.abort();\n    this.#clickAC = null;\n  }\n\n  attach(editor) {\n    this.#editors.set(editor.id, editor);\n    const { annotationElementId } = editor;\n    if (\n      annotationElementId &&\n      this.#uiManager.isDeletedAnnotationElement(annotationElementId)\n    ) {\n      this.#uiManager.removeDeletedAnnotationElement(editor);\n    }\n  }\n\n  detach(editor) {\n    this.#editors.delete(editor.id);\n    this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);\n\n    if (!this.#isDisabling && editor.annotationElementId) {\n      this.#uiManager.addDeletedAnnotationElement(editor);\n    }\n  }\n\n  /**\n   * Remove an editor.\n   * @param {AnnotationEditor} editor\n   */\n  remove(editor) {\n    this.detach(editor);\n    this.#uiManager.removeEditor(editor);\n    editor.div.remove();\n    editor.isAttachedToDOM = false;\n  }\n\n  /**\n   * An editor can have a different parent, for example after having\n   * being dragged and dropped from a page to another.\n   * @param {AnnotationEditor} editor\n   */\n  changeParent(editor) {\n    if (editor.parent === this) {\n      return;\n    }\n\n    if (editor.parent && editor.annotationElementId) {\n      this.#uiManager.addDeletedAnnotationElement(editor);\n      AnnotationEditor.deleteAnnotationElement(editor);\n      editor.annotationElementId = null;\n    }\n\n    this.attach(editor);\n    editor.parent?.detach(editor);\n    editor.setParent(this);\n    if (editor.div && editor.isAttachedToDOM) {\n      editor.div.remove();\n      this.div.append(editor.div);\n    }\n  }\n\n  /**\n   * Add a new editor in the current view.\n   * @param {AnnotationEditor} editor\n   */\n  add(editor) {\n    if (editor.parent === this && editor.isAttachedToDOM) {\n      return;\n    }\n    this.changeParent(editor);\n    this.#uiManager.addEditor(editor);\n    this.attach(editor);\n\n    if (!editor.isAttachedToDOM) {\n      const div = editor.render();\n      this.div.append(div);\n      editor.isAttachedToDOM = true;\n    }\n\n    // The editor will be correctly moved into the DOM (see fixAndSetPosition).\n    editor.fixAndSetPosition();\n    editor.onceAdded(/* focus = */ !this.#isEnabling);\n    this.#uiManager.addToAnnotationStorage(editor);\n    editor._reportTelemetry(editor.telemetryInitialData);\n  }\n\n  moveEditorInDOM(editor) {\n    if (!editor.isAttachedToDOM) {\n      return;\n    }\n\n    const { activeElement } = document;\n    if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) {\n      // When the div is moved in the DOM the focus can move somewhere else,\n      // so we want to be sure that the focus will stay on the editor but we\n      // don't want to call any focus callbacks, hence we disable them and only\n      // re-enable them when the editor has the focus.\n      editor._focusEventsAllowed = false;\n      this.#editorFocusTimeoutId = setTimeout(() => {\n        this.#editorFocusTimeoutId = null;\n        if (!editor.div.contains(document.activeElement)) {\n          editor.div.addEventListener(\n            \"focusin\",\n            () => {\n              editor._focusEventsAllowed = true;\n            },\n            { once: true, signal: this.#uiManager._signal }\n          );\n          activeElement.focus();\n        } else {\n          editor._focusEventsAllowed = true;\n        }\n      }, 0);\n    }\n\n    editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(\n      this.div,\n      editor.div,\n      editor.contentDiv,\n      /* isRemovable = */ true\n    );\n  }\n\n  /**\n   * Add or rebuild depending if it has been removed or not.\n   * @param {AnnotationEditor} editor\n   */\n  addOrRebuild(editor) {\n    if (editor.needsToBeRebuilt()) {\n      editor.parent ||= this;\n      editor.rebuild();\n      editor.show();\n    } else {\n      this.add(editor);\n    }\n  }\n\n  /**\n   * Add a new editor and make this addition undoable.\n   * @param {AnnotationEditor} editor\n   */\n  addUndoableEditor(editor) {\n    const cmd = () => editor._uiManager.rebuild(editor);\n    const undo = () => {\n      editor.remove();\n    };\n\n    this.addCommands({ cmd, undo, mustExec: false });\n  }\n\n  getEditorByUID(uid) {\n    for (const editor of this.#editors.values()) {\n      if (editor.uid === uid) {\n        return editor;\n      }\n    }\n    return null;\n  }\n\n  get #currentEditorType() {\n    return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode());\n  }\n\n  combinedSignal(ac) {\n    return this.#uiManager.combinedSignal(ac);\n  }\n\n  /**\n   * Create a new editor\n   * @param {Object} params\n   * @returns {AnnotationEditor}\n   */\n  #createNewEditor(params) {\n    const editorType = this.#currentEditorType;\n    return editorType ? new editorType.prototype.constructor(params) : null;\n  }\n\n  canCreateNewEmptyEditor() {\n    return this.#currentEditorType?.canCreateNewEmptyEditor();\n  }\n\n  /**\n   * Paste some content into a new editor.\n   * @param {Object} options\n   * @param {Object} params\n   */\n  async pasteEditor(options, params) {\n    this.updateToolbar(options);\n    await this.#uiManager.updateMode(options.mode);\n\n    const { offsetX, offsetY } = this.#getCenterPoint();\n    const id = this.#uiManager.getId();\n    const editor = this.#createNewEditor({\n      parent: this,\n      id,\n      x: offsetX,\n      y: offsetY,\n      uiManager: this.#uiManager,\n      isCentered: true,\n      ...params,\n    });\n    if (editor) {\n      this.add(editor);\n    }\n  }\n\n  /**\n   * Create a new editor\n   * @param {Object} data\n   * @returns {Promise<AnnotationEditor | null>}\n   */\n  async deserialize(data) {\n    return (\n      (await AnnotationEditorLayer.#editorTypes\n        .get(data.annotationType ?? data.annotationEditorType)\n        ?.deserialize(data, this, this.#uiManager)) || null\n    );\n  }\n\n  /**\n   * Create and add a new editor.\n   * @param {PointerEvent} event\n   * @param {boolean} isCentered\n   * @param [Object] data\n   * @returns {AnnotationEditor}\n   */\n  createAndAddNewEditor(event, isCentered, data = {}) {\n    const id = this.#uiManager.getId();\n    const editor = this.#createNewEditor({\n      parent: this,\n      id,\n      x: event.offsetX,\n      y: event.offsetY,\n      uiManager: this.#uiManager,\n      isCentered,\n      ...data,\n    });\n    if (editor) {\n      this.add(editor);\n    }\n\n    return editor;\n  }\n\n  get boundingClientRect() {\n    return this.div.getBoundingClientRect();\n  }\n\n  #getCenterPoint() {\n    const { x, y, width, height } = this.boundingClientRect;\n    const tlX = Math.max(0, x);\n    const tlY = Math.max(0, y);\n    const brX = Math.min(window.innerWidth, x + width);\n    const brY = Math.min(window.innerHeight, y + height);\n    const centerX = (tlX + brX) / 2 - x;\n    const centerY = (tlY + brY) / 2 - y;\n    const [offsetX, offsetY] =\n      this.viewport.rotation % 180 === 0\n        ? [centerX, centerY]\n        : [centerY, centerX];\n\n    return { offsetX, offsetY };\n  }\n\n  /**\n   * Create and add a new editor.\n   */\n  addNewEditor(data = {}) {\n    this.createAndAddNewEditor(\n      this.#getCenterPoint(),\n      /* isCentered = */ true,\n      data\n    );\n  }\n\n  /**\n   * Set the last selected editor.\n   * @param {AnnotationEditor} editor\n   */\n  setSelected(editor) {\n    this.#uiManager.setSelected(editor);\n  }\n\n  /**\n   * Add or remove an editor the current selection.\n   * @param {AnnotationEditor} editor\n   */\n  toggleSelected(editor) {\n    this.#uiManager.toggleSelected(editor);\n  }\n\n  /**\n   * Unselect an editor.\n   * @param {AnnotationEditor} editor\n   */\n  unselect(editor) {\n    this.#uiManager.unselect(editor);\n  }\n\n  /**\n   * Pointerup callback.\n   * @param {PointerEvent} event\n   */\n  pointerup(event) {\n    const { isMac } = FeatureTest.platform;\n    if (event.button !== 0 || (event.ctrlKey && isMac)) {\n      // Don't create an editor on right click.\n      return;\n    }\n\n    if (event.target !== this.div) {\n      return;\n    }\n\n    if (!this.#hadPointerDown) {\n      // It can happen when the user starts a drag inside a text editor\n      // and then releases the mouse button outside of it. In such a case\n      // we don't want to create a new editor, hence we check that a pointerdown\n      // occurred on this div previously.\n      return;\n    }\n    this.#hadPointerDown = false;\n\n    if (\n      this.#currentEditorType?.isDrawer &&\n      this.#currentEditorType.supportMultipleDrawings\n    ) {\n      return;\n    }\n\n    if (!this.#allowClick) {\n      this.#allowClick = true;\n      return;\n    }\n\n    const currentMode = this.#uiManager.getMode();\n    if (\n      currentMode === AnnotationEditorType.STAMP ||\n      currentMode === AnnotationEditorType.POPUP ||\n      currentMode === AnnotationEditorType.SIGNATURE\n    ) {\n      this.#uiManager.unselectAll();\n      return;\n    }\n\n    this.createAndAddNewEditor(event, /* isCentered = */ false);\n  }\n\n  /**\n   * Pointerdown callback.\n   * @param {PointerEvent} event\n   */\n  pointerdown(event) {\n    if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) {\n      this.enableTextSelection();\n    }\n    if (this.#hadPointerDown) {\n      // It's possible to have a second pointerdown event before a pointerup one\n      // when the user puts a finger on a touchscreen and then add a second one\n      // to start a pinch-to-zoom gesture.\n      // That said, in case it's possible to have two pointerdown events with\n      // a mouse, we don't want to create a new editor in such a case either.\n      this.#hadPointerDown = false;\n      return;\n    }\n    const { isMac } = FeatureTest.platform;\n    if (event.button !== 0 || (event.ctrlKey && isMac)) {\n      // Do nothing on right click.\n      return;\n    }\n\n    if (event.target !== this.div) {\n      return;\n    }\n\n    this.#hadPointerDown = true;\n\n    if (this.#currentEditorType?.isDrawer) {\n      this.startDrawingSession(event);\n      return;\n    }\n\n    const editor = this.#uiManager.getActive();\n    this.#allowClick = !editor || editor.isEmpty();\n  }\n\n  startDrawingSession(event) {\n    this.div.focus({\n      preventScroll: true,\n    });\n    if (this.#drawingAC) {\n      this.#currentEditorType.startDrawing(this, this.#uiManager, false, event);\n      return;\n    }\n\n    this.#uiManager.setCurrentDrawingSession(this);\n    this.#drawingAC = new AbortController();\n    const signal = this.#uiManager.combinedSignal(this.#drawingAC);\n    this.div.addEventListener(\n      \"blur\",\n      ({ relatedTarget }) => {\n        if (relatedTarget && !this.div.contains(relatedTarget)) {\n          this.#focusedElement = null;\n          this.commitOrRemove();\n        }\n      },\n      { signal }\n    );\n    this.#currentEditorType.startDrawing(this, this.#uiManager, false, event);\n  }\n\n  pause(on) {\n    if (on) {\n      const { activeElement } = document;\n      if (this.div.contains(activeElement)) {\n        this.#focusedElement = activeElement;\n      }\n      return;\n    }\n    if (this.#focusedElement) {\n      setTimeout(() => {\n        this.#focusedElement?.focus();\n        this.#focusedElement = null;\n      }, 0);\n    }\n  }\n\n  endDrawingSession(isAborted = false) {\n    if (!this.#drawingAC) {\n      return null;\n    }\n    this.#uiManager.setCurrentDrawingSession(null);\n    this.#drawingAC.abort();\n    this.#drawingAC = null;\n    this.#focusedElement = null;\n    return this.#currentEditorType.endDrawing(isAborted);\n  }\n\n  /**\n   *\n   * @param {AnnotationEditor} editor\n   * @param {number} x\n   * @param {number} y\n   * @returns\n   */\n  findNewParent(editor, x, y) {\n    const layer = this.#uiManager.findParent(x, y);\n    if (layer === null || layer === this) {\n      return false;\n    }\n    layer.changeParent(editor);\n    return true;\n  }\n\n  commitOrRemove() {\n    if (this.#drawingAC) {\n      this.endDrawingSession();\n      return true;\n    }\n    return false;\n  }\n\n  onScaleChanging() {\n    if (!this.#drawingAC) {\n      return;\n    }\n    this.#currentEditorType.onScaleChangingWhenDrawing(this);\n  }\n\n  /**\n   * Destroy the main editor.\n   */\n  destroy() {\n    this.commitOrRemove();\n    if (this.#uiManager.getActive()?.parent === this) {\n      // We need to commit the current editor before destroying the layer.\n      this.#uiManager.commitOrRemove();\n      this.#uiManager.setActiveEditor(null);\n    }\n\n    if (this.#editorFocusTimeoutId) {\n      clearTimeout(this.#editorFocusTimeoutId);\n      this.#editorFocusTimeoutId = null;\n    }\n\n    for (const editor of this.#editors.values()) {\n      this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);\n      editor.setParent(null);\n      editor.isAttachedToDOM = false;\n      editor.div.remove();\n    }\n    this.div = null;\n    this.#editors.clear();\n    this.#uiManager.removeLayer(this);\n  }\n\n  #cleanup() {\n    // When we're cleaning up, some editors are removed but we don't want\n    // to add a new one which will induce an addition in this.#editors, hence\n    // an infinite loop.\n    for (const editor of this.#editors.values()) {\n      if (editor.isEmpty()) {\n        editor.remove();\n      }\n    }\n  }\n\n  /**\n   * Render the main editor.\n   * @param {RenderEditorLayerOptions} parameters\n   */\n  async render({ viewport }) {\n    this.viewport = viewport;\n    setLayerDimensions(this.div, viewport);\n    for (const editor of this.#uiManager.getEditors(this.pageIndex)) {\n      this.add(editor);\n      editor.rebuild();\n    }\n\n    await this.#uiManager.findClonesForPage(this);\n    this.div.hidden = this.isEmpty;\n\n    // We're maybe rendering a layer which was invisible when we started to edit\n    // so we must set the different callbacks for it.\n    this.updateMode();\n  }\n\n  /**\n   * Update the main editor.\n   * @param {RenderEditorLayerOptions} parameters\n   */\n  update({ viewport }) {\n    // Editors have their dimensions/positions in percent so to avoid any\n    // issues (see #15582), we must commit the current one before changing\n    // the viewport.\n    this.#uiManager.commitOrRemove();\n    this.#cleanup();\n\n    const oldRotation = this.viewport.rotation;\n    const rotation = viewport.rotation;\n\n    this.viewport = viewport;\n    setLayerDimensions(this.div, { rotation });\n    if (oldRotation !== rotation) {\n      for (const editor of this.#editors.values()) {\n        editor.rotate(rotation);\n      }\n    }\n  }\n\n  /**\n   * Get page dimensions.\n   * @returns {Object} dimensions.\n   */\n  get pageDimensions() {\n    const { pageWidth, pageHeight } = this.viewport.rawDims;\n    return [pageWidth, pageHeight];\n  }\n\n  get scale() {\n    return this.#uiManager.viewParameters.realScale;\n  }\n}\n\nexport { AnnotationEditorLayer };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DOMSVGFactory } from \"./svg_factory.js\";\nimport { shadow } from \"../shared/util.js\";\n\n/**\n * @typedef DrawLayerOptions\n *   Configuration for {@linkcode DrawLayer}.\n * @property {Object | null} [filterFactory]\n *   Filter factory used to style selections (optional).\n * @property {Object | null} [pageColors]\n *   Page foreground/background colors for HCM (optional).\n * @property {number} pageIndex\n *   Zero-based page index.\n * @property {Element | null} [textLayer]\n *   Text layer element (optional).\n */\n\n/**\n * @typedef EdgeBoundaryResult\n *   Result of {@linkcode normalizeEdgeBoundary}.\n * @property {Node} container\n *   Normalized container.\n * @property {number} offset\n *   Normalized offset.\n */\n\n/**\n * @typedef SelectionRotatorResult\n *   Result of {@linkcode SelectionRotator}.\n * @property {number} x\n *   Rotated X coordinate.\n * @property {number} y\n *   Rotated Y coordinate.\n * @property {number} width\n *   Rotated width.\n * @property {number} height\n *   Rotated height.\n */\n\n/**\n * @callback SelectionRotator\n *   Rotate the coordinates of a rectangle according to the position of the\n *   text layer in the viewport.\n * @param {number} x\n *   X coordinate.\n * @param {number} y\n *   Y coordinate.\n * @param {number} width\n *   Width.\n * @param {number} height\n *   Height.\n * @returns {SelectionRotatorResult}\n *   Rotated coordinates.\n */\n\n/**\n * @typedef TextLayerSelectionData\n *   Data related to the selection for a text layer.\n * @property {DrawLayer} drawLayer\n *   Draw layer associated with the text layer.\n * @property {SVGPathElement | null} [path]\n *   Node (SVG path element) used to draw the selection.\n * @property {HTMLDivElement | null} [selectionDiv]\n *   Node (div element) used to display the selection.\n */\n\n/**\n * Compare the document position of two text layers.\n *\n * @param {Element} a\n *   Text layer.\n * @param {Element} b\n *   Other text layer.\n * @returns {-1 | 0 | 1}\n *    `-1` if the `a` is before `b`, `1` if after, or `0`.\n */\nfunction compareTextLayers(a, b) {\n  if (a === b) {\n    return 0;\n  }\n  return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING\n    ? -1\n    : 1;\n}\n\n/**\n * Find the closest text layer upwards.\n *\n * @param {Node | null} node\n *   Node.\n * @returns {Element | null}\n *   Closest ancestral text layer or `null`.\n */\nfunction getTextLayer(node) {\n  if (!node) {\n    return null;\n  }\n  if (node.nodeType === Node.ELEMENT_NODE) {\n    return node.closest(\".textLayer\");\n  }\n  return node.parentElement?.closest(\".textLayer\") || null;\n}\n\n/**\n * Compare the position of two points in the document order.\n *\n * @param {Node} nodeA\n *   Node.\n * @param {number} offsetA\n *   Offset.\n * @param {Node} nodeB\n *   Other node.\n * @param {number} offsetB\n *   Other offset.\n * @returns {boolean | null}\n *   Whether the first point is before the second one, or `null` if they are\n *   not comparable.\n */\nfunction isPointBefore(nodeA, offsetA, nodeB, offsetB) {\n  if (nodeA === nodeB) {\n    return offsetA <= offsetB;\n  }\n  const relation = nodeA.compareDocumentPosition(nodeB);\n  if (relation & Node.DOCUMENT_POSITION_FOLLOWING) {\n    return true;\n  }\n  if (relation & Node.DOCUMENT_POSITION_PRECEDING) {\n    return false;\n  }\n  return null;\n}\n\n/**\n * Normalize the position of a boundary point when it's at the end of a text\n * layer.\n * In that case, we want to move it to the last valid position within\n * the text layer, which can be either the end of the last text node or the end\n * of the last text node before the endOfContent element if it exists.\n *\n * @param {Node} container\n *   Container.\n * @param {number} offset\n *   Offset.\n * @param {Element} textLayer\n *   Text layer.\n * @returns {EdgeBoundaryResult | null}\n *   Normalized position or `null` if the position is not valid.\n */\nfunction normalizeEdgeBoundary(container, offset, textLayer) {\n  if (\n    container.nodeType !== Node.ELEMENT_NODE ||\n    !container.classList.contains(\"textLayer\") ||\n    offset !== container.childNodes.length\n  ) {\n    return { container, offset };\n  }\n  let lastNode = container.lastChild;\n  if (\n    lastNode?.nodeType === Node.ELEMENT_NODE &&\n    lastNode.classList.contains(\"endOfContent\")\n  ) {\n    lastNode = lastNode.previousSibling;\n  }\n  if (!lastNode || !textLayer.contains(lastNode)) {\n    return null;\n  }\n  if (lastNode.nodeType === Node.TEXT_NODE) {\n    return { container: lastNode, offset: lastNode.textContent.length };\n  }\n  return { container: lastNode, offset: lastNode.childNodes.length };\n}\n\n/**\n * Manage the SVGs drawn on top of the page canvas.\n * It's important to have them directly on top of the canvas because we want to\n * be able to use mix-blend-mode for some of them.\n */\nclass DrawLayer {\n  #parent = null;\n\n  #mapping = new Map();\n\n  /** @type {Element | null} */\n  #textLayer = null;\n\n  /** @type {Object | null} */\n  #filterFactory = null;\n\n  /** @type {Object | null} */\n  #pageColors = null;\n\n  /** @type {MutationObserver | null} */\n  #textLayerObserver = null;\n\n  #toUpdate = new Map();\n\n  static #id = 0;\n\n  static #selectionId = 0;\n\n  /** @type {AbortController | null} */\n  static #selectionChangeAC = null;\n\n  /** @type {Set<HTMLDivElement>} */\n  static #selections = new Set();\n\n  /** @type {boolean} */\n  static #isSelecting = false;\n\n  /** @type {Set<Element>} */\n  static #textLayerSet = new Set();\n\n  /** @type {WeakMap<Element, TextLayerSelectionData>} */\n  static #textLayers = new WeakMap();\n\n  /**\n   * @param {DrawLayerOptions} options\n   *   Configuration.\n   * @returns\n   *   Instance.\n   */\n  constructor({\n    filterFactory = null,\n    pageColors = null,\n    pageIndex,\n    textLayer = null,\n  }) {\n    this.pageIndex = pageIndex;\n    this.#filterFactory = filterFactory;\n    this.#pageColors = pageColors;\n    if (textLayer) {\n      const previousData = DrawLayer.#textLayers.get(textLayer);\n      if (previousData?.selectionDiv) {\n        previousData.selectionDiv.remove();\n        DrawLayer.#selections.delete(previousData.selectionDiv);\n      }\n      DrawLayer.#textLayers.set(textLayer, { drawLayer: this });\n      DrawLayer.#textLayerSet.add(textLayer);\n      this.#textLayer = textLayer;\n      this.#textLayerObserver = new MutationObserver(records => {\n        if (\n          !this.#parent ||\n          !this.#textLayer?.isConnected ||\n          !DrawLayer.#hasSelection()\n        ) {\n          return;\n        }\n        for (const { addedNodes } of records) {\n          for (const node of addedNodes) {\n            if (\n              node.nodeType === Node.ELEMENT_NODE &&\n              node.classList.contains(\"endOfContent\")\n            ) {\n              DrawLayer.#selectionChange();\n              return;\n            }\n          }\n        }\n      });\n      this.#textLayerObserver.observe(textLayer, { childList: true });\n\n      if (DrawLayer.#selectionChangeAC === null) {\n        DrawLayer.#selectionChangeAC = new AbortController();\n        const { signal } = DrawLayer.#selectionChangeAC;\n        document.addEventListener(\n          \"selectionchange\",\n          DrawLayer.#selectionChange.bind(DrawLayer),\n          { signal }\n        );\n        // Track pointer selection state to preserve selections during\n        // cross-boundary drags.\n        document.addEventListener(\n          \"pointerdown\",\n          () => {\n            DrawLayer.#isSelecting = true;\n          },\n          { signal }\n        );\n        document.addEventListener(\n          \"pointerup\",\n          () => {\n            DrawLayer.#isSelecting = false;\n          },\n          { signal }\n        );\n        // If the pointer is released outside the window, we may not get a\n        // corresponding `pointerup` event.\n        window.addEventListener(\n          \"blur\",\n          () => {\n            DrawLayer.#isSelecting = false;\n          },\n          { signal }\n        );\n      }\n    }\n  }\n\n  setParent(parent) {\n    if (!this.#parent) {\n      this.#parent = parent;\n      // A new text layer just became live (e.g. its page was scrolled into\n      // view). If a selection already exists, redraw overlays so that the\n      // selection extends into this newly-rendered text layer.\n      if (this.#textLayer?.isConnected && DrawLayer.#hasSelection()) {\n        DrawLayer.#selectionChange();\n      }\n      return;\n    }\n\n    if (this.#parent !== parent) {\n      if (this.#mapping.size > 0) {\n        for (const root of this.#mapping.values()) {\n          root.remove();\n          parent.append(root);\n        }\n      }\n      this.#parent = parent;\n    }\n  }\n\n  /**\n   * Clean up the selection for a text layer.\n   *\n   * @param {Element} textLayer\n   *   Text layer.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  static #cleanupTextLayerSelection(textLayer) {\n    const textLayerData = this.#textLayers.get(textLayer);\n    if (!textLayerData?.selectionDiv) {\n      return;\n    }\n    textLayerData.selectionDiv.remove();\n    this.#selections.delete(textLayerData.selectionDiv);\n    textLayerData.selectionDiv = null;\n    textLayerData.path = null;\n  }\n\n  /**\n   * @returns {boolean}\n   *   Whether there is a non-collapsed document selection.\n   */\n  static #hasSelection() {\n    const selection = document.getSelection();\n    return !!selection && !selection.isCollapsed;\n  }\n\n  /**\n   * @returns {Array<Element>}\n   *   Connected text layers sorted in document order.\n   */\n  static #getOrderedTextLayers() {\n    return [...this.#textLayerSet]\n      .filter(textLayer => textLayer.isConnected)\n      .sort(compareTextLayers);\n  }\n\n  /**\n   * Handle `selectionchange` to update the selection display for text layers.\n   * We want to display the selection in a separate layer on top of the text\n   * layer because the text layer has `mix-blend-mode: multiply` and we want\n   * the selection to have a different blend mode.\n   *\n   * @returns {undefined}\n   *   Nothing.\n   */\n  static #selectionChange() {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      for (const root of this.#selections) {\n        root.remove();\n      }\n      this.#selections.clear();\n      return;\n    }\n    /** @type {WeakMap<Node, SelectionRotator>} */\n    const rotators = new WeakMap();\n    const orderedTextLayers = this.#getOrderedTextLayers();\n    /** @type {Array<[Range, Element]>} */\n    const ranges = [];\n    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n      const range = selection.getRangeAt(i);\n      if (range.collapsed) {\n        continue;\n      }\n      let { startContainer, startOffset, endContainer, endOffset } = range;\n      let startTextLayer = getTextLayer(startContainer);\n      let endTextLayer = getTextLayer(endContainer);\n      const startMissing = startTextLayer === null;\n      const endMissing = endTextLayer === null;\n\n      // XOR case: exactly one boundary is outside tracked text layers.\n      // In Firefox/Safari this can happen transiently while dragging outside\n      // the page. Preserve the current overlay and exit early.\n      if (this.#isSelecting && startMissing !== endMissing) {\n        return;\n      }\n\n      if (selection.rangeCount === 1) {\n        const { anchorNode, anchorOffset, focusNode, focusOffset } = selection;\n        const anchorLayer = getTextLayer(anchorNode);\n        const focusLayer = getTextLayer(focusNode);\n        const anchorBeforeFocus = isPointBefore(\n          anchorNode,\n          anchorOffset,\n          focusNode,\n          focusOffset\n        );\n        if (anchorLayer && focusLayer && anchorBeforeFocus !== null) {\n          if (anchorBeforeFocus) {\n            startContainer = anchorNode;\n            startOffset = anchorOffset;\n            startTextLayer = anchorLayer;\n            endContainer = focusNode;\n            endOffset = focusOffset;\n            endTextLayer = focusLayer;\n          } else {\n            startContainer = focusNode;\n            startOffset = focusOffset;\n            startTextLayer = focusLayer;\n            endContainer = anchorNode;\n            endOffset = anchorOffset;\n            endTextLayer = anchorLayer;\n          }\n        }\n      }\n\n      const activeTextLayers = orderedTextLayers.filter(textLayer =>\n        range.intersectsNode(textLayer)\n      );\n      if (activeTextLayers.length === 0) {\n        continue;\n      }\n\n      // If a boundary is outside any text layer, use the selected live text\n      // layers as the range edges. This handles Select All, whose DOM range can\n      // span ancestors of the text layers.\n      let boundarySubstituted = false;\n      if (!startTextLayer) {\n        startTextLayer = activeTextLayers[0];\n        startContainer = startTextLayer;\n        startOffset = 0;\n        boundarySubstituted = true;\n      }\n      if (!endTextLayer) {\n        endTextLayer = activeTextLayers.at(-1);\n        endContainer = endTextLayer;\n        endOffset = endTextLayer.childNodes.length;\n        boundarySubstituted = true;\n      }\n\n      if (endContainer.nodeType === Node.ELEMENT_NODE) {\n        if (endContainer.classList.contains(\"endOfContent\")) {\n          const previousNode = endContainer.previousSibling;\n          if (!previousNode) {\n            continue;\n          }\n          endContainer = previousNode;\n          endOffset =\n            previousNode.nodeType === Node.TEXT_NODE\n              ? previousNode.textContent.length\n              : previousNode.childNodes.length;\n        } else if (\n          endContainer.classList.contains(\"textLayer\") &&\n          endContainer.childNodes.length === endOffset\n        ) {\n          const normalizedEnd = normalizeEdgeBoundary(\n            endContainer,\n            endOffset,\n            endTextLayer\n          );\n          if (!normalizedEnd) {\n            continue;\n          }\n          endContainer = normalizedEnd.container;\n          endOffset = normalizedEnd.offset;\n        }\n      }\n\n      if (startContainer.nodeType === Node.ELEMENT_NODE) {\n        const normalizedStart = normalizeEdgeBoundary(\n          startContainer,\n          startOffset,\n          startTextLayer\n        );\n        if (!normalizedStart) {\n          continue;\n        }\n        startContainer = normalizedStart.container;\n        startOffset = normalizedStart.offset;\n      }\n\n      if (\n        startTextLayer === endTextLayer &&\n        !boundarySubstituted &&\n        activeTextLayers.includes(startTextLayer)\n      ) {\n        ranges.push([range, startTextLayer]);\n        continue;\n      }\n\n      for (const textLayer of activeTextLayers) {\n        const firstNode = textLayer.firstChild;\n        if (!firstNode) {\n          continue;\n        }\n        const subRange = document.createRange();\n        if (textLayer === startTextLayer) {\n          subRange.setStart(startContainer, startOffset);\n        } else {\n          subRange.setStartBefore(firstNode);\n        }\n\n        if (textLayer === endTextLayer) {\n          subRange.setEnd(endContainer, endOffset);\n        } else {\n          const lastNode = textLayer.lastChild;\n          if (!lastNode) {\n            continue;\n          }\n          if (\n            lastNode.nodeType === Node.ELEMENT_NODE &&\n            lastNode.classList.contains(\"endOfContent\")\n          ) {\n            const lastTextNode = lastNode.previousSibling;\n            if (!lastTextNode) {\n              continue;\n            }\n            subRange.setEndAfter(lastTextNode);\n          } else {\n            subRange.setEndAfter(lastNode);\n          }\n        }\n\n        if (!subRange.collapsed) {\n          ranges.push([subRange, textLayer]);\n        }\n      }\n    }\n\n    /** @type {Set<Element>} */\n    const selectedTextLayers = new Set(ranges.map(range => range[1]));\n\n    for (const textLayer of this.#textLayerSet) {\n      if (!selectedTextLayers.has(textLayer)) {\n        this.#cleanupTextLayerSelection(textLayer);\n      }\n    }\n\n    for (const [range, textLayer] of ranges) {\n      const textLayerData = DrawLayer.#textLayers.get(textLayer);\n      if (!textLayerData) {\n        continue;\n      }\n\n      let rotator = rotators.get(textLayer);\n      if (!rotator) {\n        const clientRect = textLayer.getBoundingClientRect();\n\n        rotator = (x, y, w, h) => ({\n          x: (x - clientRect.x) / clientRect.width,\n          y: (y - clientRect.y) / clientRect.height,\n          width: w / clientRect.width,\n          height: h / clientRect.height,\n        });\n        rotators.set(textLayer, rotator);\n      }\n      /** @type {Array<string>} */\n      const boxes = [];\n      for (let { x, y, width, height } of range.getClientRects()) {\n        if (width === 0 || height === 0) {\n          continue;\n        }\n        ({ x, y, width, height } = rotator(x, y, width, height));\n        if (width === 1 && height === 1) {\n          // The entire page is selected.\n          continue;\n        }\n        boxes.push(`M${x} ${y} h${width} v${height} h-${width} Z`);\n      }\n      if (boxes.length === 0) {\n        continue;\n      }\n      const drawLayer = textLayerData.drawLayer;\n      let div = textLayerData.selectionDiv;\n      let path = textLayerData.path;\n      if (!div) {\n        const clipPathId = `clip_selection_${DrawLayer.#selectionId++}`;\n\n        div = document.createElement(\"div\");\n        div.className = \"selection\";\n        div.style.clipPath = `url(#${clipPathId})`;\n\n        const selectionStyle = drawLayer.#filterFactory?.createSelectionStyle(\n          drawLayer.#pageColors\n        );\n        if (selectionStyle) {\n          for (const [name, value] of Object.entries(selectionStyle)) {\n            div.style.setProperty(name, value);\n          }\n        }\n\n        const svg = DrawLayer._svgFactory.create(\n          1,\n          1,\n          /* skipDimensions = */ true\n        );\n        svg.setAttribute(\"aria-hidden\", \"true\");\n        svg.setAttribute(\"width\", \"100%\");\n        svg.setAttribute(\"height\", \"100%\");\n\n        const clipPath = DrawLayer._svgFactory.createElement(\"clipPath\");\n        clipPath.setAttribute(\"id\", clipPathId);\n        clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n\n        path = DrawLayer._svgFactory.createElement(\"path\");\n\n        clipPath.append(path);\n        svg.append(clipPath);\n        div.append(svg);\n\n        textLayerData.path = path;\n        textLayerData.selectionDiv = div;\n      }\n\n      if (!div.parentNode && drawLayer.#parent) {\n        drawLayer.#parent.append(div);\n        this.#selections.add(div);\n      }\n\n      path.setAttribute(\"d\", boxes.join(\" \"));\n    }\n  }\n\n  static get _svgFactory() {\n    return shadow(this, \"_svgFactory\", new DOMSVGFactory());\n  }\n\n  static #setBox(element, [x, y, width, height]) {\n    const { style } = element;\n    style.top = `${100 * y}%`;\n    style.left = `${100 * x}%`;\n    style.width = `${100 * width}%`;\n    style.height = `${100 * height}%`;\n  }\n\n  #createSVG() {\n    const svg = DrawLayer._svgFactory.create(1, 1, /* skipDimensions = */ true);\n    this.#parent.append(svg);\n    svg.setAttribute(\"aria-hidden\", \"true\");\n\n    return svg;\n  }\n\n  #createClipPath(defs, pathId) {\n    const clipPath = DrawLayer._svgFactory.createElement(\"clipPath\");\n    defs.append(clipPath);\n    const clipPathId = `clip_${pathId}`;\n    clipPath.setAttribute(\"id\", clipPathId);\n    clipPath.setAttribute(\"clipPathUnits\", \"objectBoundingBox\");\n    const clipPathUse = DrawLayer._svgFactory.createElement(\"use\");\n    clipPath.append(clipPathUse);\n    clipPathUse.setAttribute(\"href\", `#${pathId}`);\n    clipPathUse.classList.add(\"clip\");\n\n    return clipPathId;\n  }\n\n  #updateProperties(element, properties) {\n    for (const [key, value] of Object.entries(properties)) {\n      if (value === null) {\n        element.removeAttribute(key);\n      } else {\n        element.setAttribute(key, value);\n      }\n    }\n  }\n\n  draw(properties, isPathUpdatable = false, hasClip = false) {\n    const id = DrawLayer.#id++;\n    const root = this.#createSVG();\n\n    const defs = DrawLayer._svgFactory.createElement(\"defs\");\n    root.append(defs);\n    const path = DrawLayer._svgFactory.createElement(\"path\");\n    defs.append(path);\n    const pathId = `path_${id}`;\n    path.setAttribute(\"id\", pathId);\n    path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n\n    if (isPathUpdatable) {\n      this.#toUpdate.set(id, path);\n    }\n\n    // Create the clipping path for the editor div.\n    const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null;\n\n    const use = DrawLayer._svgFactory.createElement(\"use\");\n    root.append(use);\n    use.setAttribute(\"href\", `#${pathId}`);\n    this.updateProperties(root, properties);\n\n    this.#mapping.set(id, root);\n\n    return { id, clipPathId: `url(#${clipPathId})` };\n  }\n\n  drawOutline(properties, mustRemoveSelfIntersections) {\n    // We cannot draw the outline directly in the SVG for highlights because\n    // it composes with its parent with mix-blend-mode: multiply.\n    // But the outline has a different mix-blend-mode, so we need to draw it in\n    // its own SVG.\n    const id = DrawLayer.#id++;\n    const root = this.#createSVG();\n    const defs = DrawLayer._svgFactory.createElement(\"defs\");\n    root.append(defs);\n    const path = DrawLayer._svgFactory.createElement(\"path\");\n    defs.append(path);\n    const pathId = `path_${id}`;\n    path.setAttribute(\"id\", pathId);\n    path.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n\n    let maskId;\n    if (mustRemoveSelfIntersections) {\n      const mask = DrawLayer._svgFactory.createElement(\"mask\");\n      defs.append(mask);\n      maskId = `mask_${id}`;\n      mask.setAttribute(\"id\", maskId);\n      mask.setAttribute(\"maskUnits\", \"objectBoundingBox\");\n      const rect = DrawLayer._svgFactory.createElement(\"rect\");\n      mask.append(rect);\n      rect.setAttribute(\"width\", \"1\");\n      rect.setAttribute(\"height\", \"1\");\n      rect.setAttribute(\"fill\", \"white\");\n      const use = DrawLayer._svgFactory.createElement(\"use\");\n      mask.append(use);\n      use.setAttribute(\"href\", `#${pathId}`);\n      use.setAttribute(\"stroke\", \"none\");\n      use.setAttribute(\"fill\", \"black\");\n      use.setAttribute(\"fill-rule\", \"nonzero\");\n      use.classList.add(\"mask\");\n    }\n\n    const use1 = DrawLayer._svgFactory.createElement(\"use\");\n    root.append(use1);\n    use1.setAttribute(\"href\", `#${pathId}`);\n    if (maskId) {\n      use1.setAttribute(\"mask\", `url(#${maskId})`);\n    }\n    const use2 = use1.cloneNode();\n    root.append(use2);\n    use1.classList.add(\"mainOutline\");\n    use2.classList.add(\"secondaryOutline\");\n\n    this.updateProperties(root, properties);\n\n    this.#mapping.set(id, root);\n\n    return id;\n  }\n\n  finalizeDraw(id, properties) {\n    this.#toUpdate.delete(id);\n    this.updateProperties(id, properties);\n  }\n\n  updateProperties(elementOrId, properties) {\n    if (!properties) {\n      return;\n    }\n    const { root, bbox, rootClass, path } = properties;\n    const element =\n      typeof elementOrId === \"number\"\n        ? this.#mapping.get(elementOrId)\n        : elementOrId;\n    if (!element) {\n      return;\n    }\n    if (root) {\n      this.#updateProperties(element, root);\n    }\n    if (bbox) {\n      DrawLayer.#setBox(element, bbox);\n    }\n    if (rootClass) {\n      const { classList } = element;\n      for (const [className, value] of Object.entries(rootClass)) {\n        classList.toggle(className, value);\n      }\n    }\n    if (path) {\n      const defs = element.firstElementChild;\n      const pathElement = defs.firstElementChild;\n      this.#updateProperties(pathElement, path);\n    }\n  }\n\n  updateParent(id, layer) {\n    if (layer === this) {\n      return;\n    }\n    const root = this.#mapping.get(id);\n    if (!root) {\n      return;\n    }\n    layer.#parent.append(root);\n    this.#mapping.delete(id);\n    layer.#mapping.set(id, root);\n  }\n\n  remove(id) {\n    this.#toUpdate.delete(id);\n    if (this.#parent === null) {\n      return;\n    }\n    this.#mapping.get(id).remove();\n    this.#mapping.delete(id);\n  }\n\n  destroy() {\n    this.#parent = null;\n    for (const root of this.#mapping.values()) {\n      root.remove();\n    }\n    this.#mapping.clear();\n    this.#toUpdate.clear();\n    this.#textLayerObserver?.disconnect();\n    this.#textLayerObserver = null;\n    if (this.#textLayer) {\n      const data = DrawLayer.#textLayers.get(this.#textLayer);\n      if (data?.drawLayer === this) {\n        DrawLayer.#cleanupTextLayerSelection(this.#textLayer);\n        DrawLayer.#textLayers.delete(this.#textLayer);\n        DrawLayer.#textLayerSet.delete(this.#textLayer);\n        if (DrawLayer.#textLayerSet.size === 0) {\n          DrawLayer.#selectionChangeAC?.abort();\n          DrawLayer.#selectionChangeAC = null;\n          DrawLayer.#isSelecting = false;\n        }\n      }\n      this.#textLayer = null;\n    }\n  }\n}\n\nexport { DrawLayer };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Util } from \"../shared/util.js\";\n\nfunction percentage(value) {\n  return `${(value * 100).toFixed(2)}%`;\n}\n\n/**\n * Used to manage paceholder <canvas> elements that, when right-clicked on,\n * are populated with the corresponding image extracted from the PDF page.\n */\nclass TextLayerImages {\n  #coordinates = [];\n\n  #coordinatesByElement = new Map();\n\n  #getPageCanvas = null;\n\n  #minSize = 0;\n\n  #pageWidth = 0;\n\n  #pageHeight = 0;\n\n  static #activeImage = null;\n\n  constructor(minSize, coordinates, viewport, getPageCanvas) {\n    this.#minSize = minSize;\n    this.#coordinates = coordinates;\n    this.#pageWidth = viewport.rawDims.pageWidth;\n    this.#pageHeight = viewport.rawDims.pageHeight;\n    this.#getPageCanvas = getPageCanvas;\n  }\n\n  render() {\n    const container = document.createElement(\"div\");\n    container.className = \"textLayerImages\";\n\n    for (let i = 0; i < this.#coordinates.length; i += 6) {\n      const el = this.#createImagePlaceholder(\n        this.#coordinates.subarray(i, i + 6)\n      );\n      if (el) {\n        container.append(el);\n      }\n    }\n\n    container.addEventListener(\"contextmenu\", event => {\n      if (!(event.target instanceof HTMLCanvasElement)) {\n        return;\n      }\n      const imgElement = event.target;\n      const coords = this.#coordinatesByElement.get(imgElement);\n      if (!coords) {\n        return;\n      }\n\n      const activeImage = TextLayerImages.#activeImage?.deref();\n      if (activeImage === imgElement) {\n        return;\n      }\n      if (activeImage) {\n        activeImage.width = 0;\n        activeImage.height = 0;\n      }\n      TextLayerImages.#activeImage = new WeakRef(imgElement);\n\n      const { inverseTransform, x1, y1, width, height } = coords;\n\n      const pageCanvas = this.#getPageCanvas();\n\n      const imageX1 = Math.ceil(x1 * pageCanvas.width);\n      const imageY1 = Math.ceil(y1 * pageCanvas.height);\n      const imageX2 = Math.floor(\n        (x1 + width / this.#pageWidth) * pageCanvas.width\n      );\n      const imageY2 = Math.floor(\n        (y1 + height / this.#pageHeight) * pageCanvas.height\n      );\n\n      imgElement.width = imageX2 - imageX1;\n      imgElement.height = imageY2 - imageY1;\n\n      const ctx = imgElement.getContext(\"2d\");\n      ctx.setTransform(...inverseTransform);\n      ctx.translate(-imageX1, -imageY1);\n      ctx.drawImage(pageCanvas, 0, 0);\n    });\n\n    return container;\n  }\n\n  #createImagePlaceholder(\n    [x1, y1, x2, y2, x3, y3] // top left, bottom left, top right\n  ) {\n    const width = Math.hypot(\n      (x3 - x1) * this.#pageWidth,\n      (y3 - y1) * this.#pageHeight\n    );\n    const height = Math.hypot(\n      (x2 - x1) * this.#pageWidth,\n      (y2 - y1) * this.#pageHeight\n    );\n\n    if (width < this.#minSize || height < this.#minSize) {\n      return null;\n    }\n\n    const transform = [\n      ((x3 - x1) * this.#pageWidth) / width,\n      ((y3 - y1) * this.#pageHeight) / width,\n      ((x2 - x1) * this.#pageWidth) / height,\n      ((y2 - y1) * this.#pageHeight) / height,\n      0,\n      0,\n    ];\n    const inverseTransform = Util.inverseTransform(transform);\n\n    const imgElement = document.createElement(\"canvas\");\n    imgElement.className = \"textLayerImagePlaceholder\";\n    imgElement.width = 0;\n    imgElement.height = 0;\n    Object.assign(imgElement.style, {\n      opacity: 0,\n      position: \"absolute\",\n      left: percentage(x1),\n      top: percentage(y1),\n      width: percentage(width / this.#pageWidth),\n      height: percentage(height / this.#pageHeight),\n      transformOrigin: \"0% 0%\",\n      transform: `matrix(${transform.join(\",\")})`,\n    });\n\n    this.#coordinatesByElement.set(imgElement, {\n      inverseTransform,\n      width,\n      height,\n      x1,\n      y1,\n    });\n\n    return imgElement;\n  }\n}\n\nexport { TextLayerImages };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./display/api\").OnProgressParameters} OnProgressParameters */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./display/api\").PDFDocumentLoadingTask} PDFDocumentLoadingTask */\n/** @typedef {import(\"./display/api\").PDFDocumentProxy} PDFDocumentProxy */\n/** @typedef {import(\"./display/api\").PDFPageProxy} PDFPageProxy */\n/** @typedef {import(\"./display/api\").RenderTask} RenderTask */\n/** @typedef {import(\"./display/page_viewport\").PageViewport} PageViewport */\n\nimport {\n  AbortException,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationMode,\n  AnnotationType,\n  createValidAbsoluteUrl,\n  FeatureTest,\n  getUuid,\n  ImageKind,\n  InvalidPDFException,\n  makeArr,\n  makeMap,\n  makeObj,\n  normalizeUnicode,\n  OPS,\n  PasswordException,\n  PasswordResponses,\n  PermissionFlag,\n  ResponseException,\n  shadow,\n  updateUrlHash,\n  Util,\n  VerbosityLevel,\n} from \"./shared/util.js\";\nimport {\n  applyOpacity,\n  CSSConstants,\n  fetchData,\n  findContrastColor,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getRGB,\n  getRGBA,\n  isDataScheme,\n  isPdfFile,\n  noContextMenu,\n  OutputScale,\n  PDFDateString,\n  PixelsPerInch,\n  RenderingCancelledException,\n  renderRichText,\n  setLayerDimensions,\n  stopEvent,\n  SupportedImageMimeTypes,\n} from \"./display/display_utils.js\";\nimport {\n  build,\n  getDocument,\n  PDFDataRangeTransport,\n  PDFWorker,\n  version,\n} from \"./display/api.js\";\nimport { AnnotationEditorLayer } from \"./display/editor/annotation_editor_layer.js\";\nimport { AnnotationEditorUIManager } from \"./display/editor/tools.js\";\nimport { AnnotationLayer } from \"./display/annotation_layer.js\";\nimport { ColorPicker } from \"./display/editor/color_picker.js\";\nimport { DOMSVGFactory } from \"./display/svg_factory.js\";\nimport { DrawLayer } from \"./display/draw_layer.js\";\nimport { GlobalWorkerOptions } from \"./display/worker_options.js\";\nimport { HighlightOutliner } from \"./display/editor/drawers/highlight.js\";\nimport { isValidExplicitDest } from \"./display/api_utils.js\";\nimport { MathClamp } from \"./shared/math_clamp.js\";\nimport { SignatureExtractor } from \"./display/editor/drawers/signaturedraw.js\";\nimport { TextLayer } from \"./display/text_layer.js\";\nimport { TextLayerImages } from \"./display/text_layer_images.js\";\nimport { TouchManager } from \"./display/touch_manager.js\";\nimport { XfaLayer } from \"./display/xfa_layer.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING || GENERIC\")) {\n  globalThis._pdfjsTestingUtils = {\n    HighlightOutliner,\n  };\n}\n\nglobalThis.pdfjsLib = {\n  AbortException,\n  AnnotationEditorLayer,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationLayer,\n  AnnotationMode,\n  AnnotationType,\n  applyOpacity,\n  build,\n  ColorPicker,\n  createValidAbsoluteUrl,\n  CSSConstants,\n  DOMSVGFactory,\n  DrawLayer,\n  FeatureTest,\n  fetchData,\n  findContrastColor,\n  getDocument,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getRGB,\n  getRGBA,\n  getUuid,\n  GlobalWorkerOptions,\n  ImageKind,\n  InvalidPDFException,\n  isDataScheme,\n  isPdfFile,\n  isValidExplicitDest,\n  makeArr,\n  makeMap,\n  makeObj,\n  MathClamp,\n  noContextMenu,\n  normalizeUnicode,\n  OPS,\n  OutputScale,\n  PasswordException,\n  PasswordResponses,\n  PDFDataRangeTransport,\n  PDFDateString,\n  PDFWorker,\n  PermissionFlag,\n  PixelsPerInch,\n  RenderingCancelledException,\n  renderRichText,\n  ResponseException,\n  setLayerDimensions,\n  shadow,\n  SignatureExtractor,\n  stopEvent,\n  SupportedImageMimeTypes,\n  TextLayer,\n  TextLayerImages,\n  TouchManager,\n  updateUrlHash,\n  Util,\n  VerbosityLevel,\n  version,\n  XfaLayer,\n};\n\nexport {\n  AbortException,\n  AnnotationEditorLayer,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationLayer,\n  AnnotationMode,\n  AnnotationType,\n  applyOpacity,\n  build,\n  ColorPicker,\n  createValidAbsoluteUrl,\n  CSSConstants,\n  DOMSVGFactory,\n  DrawLayer,\n  FeatureTest,\n  fetchData,\n  findContrastColor,\n  getDocument,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getRGB,\n  getRGBA,\n  getUuid,\n  GlobalWorkerOptions,\n  ImageKind,\n  InvalidPDFException,\n  isDataScheme,\n  isPdfFile,\n  isValidExplicitDest,\n  makeArr,\n  makeMap,\n  makeObj,\n  MathClamp,\n  noContextMenu,\n  normalizeUnicode,\n  OPS,\n  OutputScale,\n  PasswordException,\n  PasswordResponses,\n  PDFDataRangeTransport,\n  PDFDateString,\n  PDFWorker,\n  PermissionFlag,\n  PixelsPerInch,\n  RenderingCancelledException,\n  renderRichText,\n  ResponseException,\n  setLayerDimensions,\n  shadow,\n  SignatureExtractor,\n  stopEvent,\n  SupportedImageMimeTypes,\n  TextLayer,\n  TextLayerImages,\n  TouchManager,\n  updateUrlHash,\n  Util,\n  VerbosityLevel,\n  version,\n  XfaLayer,\n};\n"],"names":["isNodeJS","process","versions","nw","electron","type","BBOX_INIT","Infinity","F32_BBOX_INIT","Float32Array","FONT_IDENTITY_MATRIX","LINE_FACTOR","LINE_DESCENT_FACTOR","BASELINE_FACTOR","SVG_NS","RenderingIntentFlag","ANY","DISPLAY","PRINT","SAVE","ANNOTATIONS_FORMS","ANNOTATIONS_STORAGE","ANNOTATIONS_DISABLE","IS_EDITING","OPLIST","AnnotationMode","DISABLE","ENABLE","ENABLE_FORMS","ENABLE_STORAGE","AnnotationPrefix","AnnotationEditorPrefix","AnnotationEditorType","NONE","FREETEXT","HIGHLIGHT","STAMP","INK","POPUP","SIGNATURE","COMMENT","AnnotationEditorParamsType","RESIZE","CREATE","FREETEXT_SIZE","FREETEXT_COLOR","FREETEXT_OPACITY","INK_COLOR","INK_THICKNESS","INK_OPACITY","INK_COLOR_AND_OPACITY","HIGHLIGHT_COLOR","HIGHLIGHT_THICKNESS","HIGHLIGHT_FREE","HIGHLIGHT_SHOW_ALL","DRAW_STEP","PermissionFlag","MODIFY_CONTENTS","COPY","MODIFY_ANNOTATIONS","FILL_INTERACTIVE_FORMS","COPY_FOR_ACCESSIBILITY","ASSEMBLE","PRINT_HIGH_QUALITY","MeshFigureType","TRIANGLES","LATTICE","PATCH","TextRenderingMode","FILL","STROKE","FILL_STROKE","INVISIBLE","FILL_ADD_TO_PATH","STROKE_ADD_TO_PATH","FILL_STROKE_ADD_TO_PATH","ADD_TO_PATH","FILL_STROKE_MASK","ADD_TO_PATH_FLAG","ImageKind","GRAYSCALE_1BPP","RGB_24BPP","RGBA_32BPP","AnnotationType","TEXT","LINK","LINE","SQUARE","CIRCLE","POLYGON","POLYLINE","UNDERLINE","SQUIGGLY","STRIKEOUT","CARET","FILEATTACHMENT","SOUND","MOVIE","WIDGET","SCREEN","PRINTERMARK","TRAPNET","WATERMARK","THREED","REDACT","RICHMEDIA","AnnotationReplyType","GROUP","REPLY","AnnotationRenditionOperation","PLAY_OR_RESUME","STOP","PAUSE","RESUME","PLAY","AnnotationFlag","HIDDEN","NOZOOM","NOROTATE","NOVIEW","READONLY","LOCKED","TOGGLENOVIEW","LOCKEDCONTENTS","AnnotationFieldFlag","REQUIRED","NOEXPORT","MULTILINE","PASSWORD","NOTOGGLETOOFF","RADIO","PUSHBUTTON","COMBO","EDIT","SORT","FILESELECT","MULTISELECT","DONOTSPELLCHECK","DONOTSCROLL","COMB","RICHTEXT","RADIOSINUNISON","COMMITONSELCHANGE","AnnotationBorderStyleType","SOLID","DASHED","BEVELED","INSET","AnnotationActionEventType","E","X","D","U","Fo","Bl","PO","PC","PV","PI","K","F","V","C","DocumentActionEventType","WC","WS","DS","WP","DP","PageActionEventType","O","VerbosityLevel","ERRORS","WARNINGS","INFOS","OPS","dependency","setLineWidth","setLineCap","setLineJoin","setMiterLimit","setDash","setRenderingIntent","setFlatness","setGState","save","restore","transform","moveTo","lineTo","curveTo","curveTo2","curveTo3","closePath","rectangle","stroke","closeStroke","fill","eoFill","fillStroke","eoFillStroke","closeFillStroke","closeEOFillStroke","endPath","clip","eoClip","beginText","endText","setCharSpacing","setWordSpacing","setHScale","setLeading","setFont","setTextRenderingMode","setTextRise","moveText","setLeadingMoveText","setTextMatrix","nextLine","showText","showSpacedText","nextLineShowText","nextLineSetSpacingShowText","setCharWidth","setCharWidthAndBounds","setStrokeColorSpace","setFillColorSpace","setStrokeColor","setStrokeColorN","setFillColor","setFillColorN","setStrokeGray","setFillGray","setStrokeRGBColor","setFillRGBColor","setStrokeCMYKColor","setFillCMYKColor","shadingFill","beginInlineImage","beginImageData","endInlineImage","paintXObject","markPoint","markPointProps","beginMarkedContent","beginMarkedContentProps","endMarkedContent","beginCompat","endCompat","paintFormXObjectBegin","paintFormXObjectEnd","beginGroup","endGroup","beginAnnotation","endAnnotation","paintImageMaskXObject","paintImageMaskXObjectGroup","paintImageXObject","paintInlineImageXObject","paintInlineImageXObjectGroup","paintImageXObjectRepeat","paintImageMaskXObjectRepeat","paintSolidColorImageMask","constructPath","setStrokeTransparent","setFillTransparent","rawFillPath","DrawOPS","quadraticCurveTo","PasswordResponses","NEED_PASSWORD","INCORRECT_PASSWORD","verbosity","setVerbosityLevel","level","Number","isInteger","getVerbosityLevel","info","msg","console","warn","unreachable","Error","assert","cond","_isValidProtocol","url","protocol","createValidAbsoluteUrl","baseUrl","options","addDefaultProtocol","startsWith","dots","match","length","tryConvertEncoding","stringToUTF8String","absoluteUrl","URL","parse","updateUrlHash","hash","allowRel","res","href","split","stripPath","str","substring","lastIndexOf","shadow","obj","prop","value","nonSerializable","Object","defineProperty","enumerable","configurable","writable","BaseException","BaseExceptionClosure","message","name","prototype","constructor","PasswordException","code","UnknownErrorException","details","InvalidPDFException","ResponseException","status","missing","FormatError","AbortException","bytesToString","bytes","undefined","MAX_ARGUMENT_COUNT","String","fromCharCode","apply","strBuf","i","chunkEnd","Math","min","chunk","subarray","push","join","stringToBytes","Uint8Array","charCodeAt","objectSize","keys","FeatureTest","isLittleEndian","buffer8","view32","Uint32Array","buffer","isOffscreenCanvasSupported","OffscreenCanvas","isImageDecoderSupported","ImageDecoder","isFloat16ArraySupported","Float16Array","isSanitizerSupported","Sanitizer","platform","userAgent","navigator","isAndroid","includes","isLinux","isMac","isWindows","isFirefox","isCanvasFilterSupported","ctx","getContext","document","createElement","filter","isAlphaColorInputSupported","input","setAttribute","isBackdropFilterSupported","CSS","supports","Util","hexNums","Array","from","n","toString","padStart","makeHexColor","r","g","b","m1","m2","multiplyByDOMMatrix","m","md","a","c","d","e","f","applyTransform","p","pos","p0","p1","applyTransformToBezier","m0","m3","m4","m5","pI","pI1","applyInverseTransform","axialAlignedBoundingBox","rect","output","r0","r1","r2","r3","a0","a2","a1","a3","b0","b2","b1","b3","m1r0","m1r2","m2r1","m2r3","max","inverseTransform","singularValueDecompose2dScale","matrix","first","second","sqrt","normalizeRect","slice","intersect","rect1","rect2","xLow","xHigh","yLow","yHigh","pointBoundingBox","x","y","minMax","rectBoundingBox","x0","y0","x1","y1","getExtremumOnCurve","#getExtremumOnCurve","x2","x3","y2","y3","t","mt","tt","ttt","getExtremum","#getExtremum","abs","delta","sqrtDelta","bezierBoundingBox","decodeURIComponent","escape","utf8StringToString","unescape","encodeURIComponent","isArrayEqual","arr1","arr2","ii","NormalizeRegex","NormalizationMap","normalizeUnicode","Map","replaceAll","_","p2","normalize","get","getUuid","crypto","randomUUID","buf","getRandomValues","_isValidExplicitDest","validRef","validName","dest","isArray","page","zoom","args","argsLen","allowNull","arg","makeArr","makeMap","makeObj","create","MathClamp","v","PageViewport","viewBox","userUnit","scale","rotation","offsetX","offsetY","dontFlip","centerX","centerY","rotateA","rotateB","rotateC","rotateD","offsetCanvasX","offsetCanvasY","width","height","rawDims","dims","pageWidth","pageHeight","pageX","pageY","clone","convertToViewportPoint","convertToPdfPoint","XfaText","textContent","xfa","items","styles","walk","node","shouldBuildText","attributes","children","child","XfaLayer","setupStorage","html","id","element","storage","intent","storedData","getValue","addEventListener","event","setValue","target","xfaOn","xfaOff","removeAttribute","checked","getAttribute","option","selected","hasOwn","selectedIndex","setAttributes","linkService","isHTMLAnchorElement","HTMLAnchorElement","key","entries","assign","style","addLinkAttributes","newWindow","dataId","render","parameters","annotationStorage","root","xfaHtml","rootHtml","isNotForRichText","rootDiv","div","append","viewport","textDivs","createTextNode","stack","parent","at","pop","childHtml","xmlns","createElementNS","el","querySelectorAll","update","hidden","getPageViewport","xfaPage","parseInt","PixelsPerInch","PDF","PDF_TO_CSS_UNITS","fetchData","isValidFetchUrl","baseURI","response","fetch","ok","statusText","blob","json","text","Promise","resolve","reject","request","XMLHttpRequest","open","responseType","onreadystatechange","readyState","DONE","responseText","send","RenderingCancelledException","extraDelay","isDataScheme","trim","toLowerCase","isPdfFile","filename","test","getFilenameFromUrl","getPdfFilenameFromUrl","defaultFilename","getURL","urlString","newURL","decode","decoded","pdfRegex","pathname","searchParams","size","getLast","iterator","findLast","values","reFilename","hashFilename","exec","StatTimer","started","times","time","has","set","Date","now","timeEnd","start","end","delete","longest","map","padEnd","noContextMenu","preventDefault","stopEvent","stopPropagation","deprecated","log","PDFDateString","regex","toDateObject","RegExp","matches","year","month","day","hour","minute","universalTimeRelation","offsetHour","offsetMinute","UTC","getRGBA","color","hex","parts","parseFloat","round","getRGB","rgba","getColorValues","colors","span","visibility","colorScheme","body","computedColor","window","getComputedStyle","remove","getCurrentTransform","getTransform","getCurrentTransformInverse","invertSelf","setLayerDimensions","mustFlip","mustRotate","widthStr","heightStr","OutputScale","pixelRatio","sx","sy","scaled","symmetric","limitCanvas","maxPixels","maxDim","capAreaFactor","maxAreaScale","maxWidthScale","maxHeightScale","capPixels","maxScale","globalThis","devicePixelRatio","winPixels","ceil","screen","availWidth","availHeight","SupportedImageMimeTypes","ColorScheme","isDarkMode","matchMedia","CSSConstants","commentForegroundColor","classList","add","display","applyOpacity","opacity","white","RGBToHSL","rgb","l","HSLToRGB","hsl","h","s","floor","computeLuminance","contrastRatio","hsl1","hsl2","lum1","lum2","contrastCache","findContrastColor","baseColor","fixedColor","cachedValue","array","baseHSL","fixedHSL","isFixedColorDark","minContrast","PRECISION","mid","renderRichText","dir","className","container","fragment","createDocumentFragment","lines","line","firstElementChild","makePathFromDrawOPS","data","path","Path2D","bezierCurveTo","EditorToolbar","toolbar","colorPicker","editor","buttons","altText","comment","commentButtonDivider","signatureDescriptionButton","l10nRemove","freeze","freetext","highlight","ink","stamp","signature","editToolbar","signal","_uiManager","_signal","AbortSignal","aborted","pointerDown","position","toolbarPosition","direction","insetInlineEnd","top","#pointerDown","focusIn","#focusIn","_focusEventsAllowed","focusOut","#focusOut","addListenersToElement","#addListenersToElement","bind","capture","hide","hideDropdown","show","shown","addDeleteButton","editorType","button","tabIndex","divider","#divider","addAltText","addComment","beforeElement","renderForToolbar","insertBefore","addColorPicker","renderButton","addEditSignatureButton","signatureManager","renderEditButton","removeButton","removeToolbarCommentButton","addButton","tool","addButtonBefore","beforeSelector","querySelector","updateEditSignatureButton","description","title","destroy","FloatingToolbar","uiManager","#render","hasCommentManager","makeButton","commentSelection","highlightSelection","getLastPoint","#getLastPoint","boxes","isLTR","lastY","lastX","box","#makeButton","buttonClass","l10nId","labelL10nId","clickHandler","INTERNAL_EVT","internalOpt","internal","bindEvents","names","CurrentPointers","pointerId","NaN","pointerIds","moveTimestamp","pointerType","initializeAndAddPointerId","Set","setPointer","setTimeStamp","timeStamp","isSamePointerId","isSamePointerIdOrRemove","isSamePointerType","isInitializedAndDifferentPointerType","isSameTimeStamp","isUsingMultiplePointers","clearPointerType","clearPointerIds","clearTimeStamp","IdManager","ImageManager","baseId","cache","_isSVGFittingCanvas","svg","canvas","willReadFrequently","image","Image","src","promise","then","drawImage","getImageData","#get","rawData","bitmap","refCounter","isSvg","File","file","Blob","mustRemoveAspectRatioPromise","fileReader","FileReader","imageElement","imagePromise","onload","svgUrl","result","onerror","readAsDataURL","createImageBitmap","getFromFile","lastModified","getFromUrl","getFromBlob","blobPromise","getFromId","getFromCanvas","offscreen","transferToImageBitmap","getSvgUrl","deleteId","transferFromImageBitmap","convertToBlob","close","isValidId","CommandManager","commands","locked","maxSize","cmd","undo","post","mustExec","overwriteIfSameType","keepUndo","next","splice","redo","hasSomethingToUndo","hasSomethingToRedo","cleanType","KeyboardManager","ALT","CTRL","META","SHIFT","callbacks","callback","hasMacOverride","some","k","shortcut","isMacKey","keyName","modifiers","parseShortcut","getOrInsertComputed","#parseShortcut","keyPart","part","upper","toUpperCase","modifier","codeToKey","#codeToKey","self","shortcuts","fallback","eventModifiers","altKey","ctrlKey","metaKey","shiftKey","find","bubbles","checker","ColorManager","_colorsMapping","_colors","convert","RGB","every","getHexCode","AnnotationEditorUIManager","abortController","AbortController","activeEditor","allEditableAnnotations","allEditors","allLayers","savedAllLayers","altTextManager","changedExistingAnnotations","commandManager","commentManager","copyPasteAC","currentDrawingSession","currentPageIndex","deletedAnnotationsElementIds","draggingEditors","editorTypes","editorsToRescale","_editorUndoBar","enableHighlightFloatingButton","enableUpdatedAddImage","enableNewAltTextWhenAddingImage","filterFactory","focusMainContainerTimeoutId","focusManagerAC","highlightColors","highlightWhenShiftUp","floatingToolbar","idManager","isEnabled","isPointerDown","isWaiting","keyboardManagerAC","lastActiveElement","mainHighlightColorPicker","missingCanvases","mlManager","mode","selectedEditors","selectedTextNode","pageColors","showAllStates","pdfDocument","previousStates","isEditing","isEmpty","hasSelectedEditor","hasSelectedText","translation","translationTimeoutId","viewer","viewerAlert","updateModeCapability","TRANSLATE_SMALL","TRANSLATE_BIG","_keyboardManager","proto","arrowChecker","contains","activeElement","tagName","hasSomethingToControl","textInputChecker","_self","HTMLInputElement","small","big","selectAll","addNewEditorFromKeyboard","HTMLButtonElement","isEnterHandled","unselectAll","translateSelectedEditors","eventBus","editorUndoBar","supportsPinchToZoom","_eventBus","evtOpts","on","onEditingAction","onPageChanging","onScaleChanging","onRotationChanging","onSetPreference","evt","updateParams","beforeUnload","addSelectionListener","addDragAndDropListeners","addKeyboardManager","viewParameters","realScale","isShiftKeyDown","_supportsPinchToZoom","setSidebarUiManager","abort","layer","clear","clearTimeout","combinedSignal","ac","any","useNewAltTextFlow","useNewAltTextWhenAddingImage","hcmFilter","addHCMFilter","foreground","background","_highlightColors","pair","hasHCM","isNameForHCM","endsWith","replace","highlightColorNames","reverse","getNonHCMColor","colorName","getNonHCMColorName","setCurrentDrawingSession","disableUserSelect","setMainHighlightColorPicker","editAltText","firstTime","editComment","posX","posY","showDialog","selectComment","pageIndex","uid","getEditorByUID","toggleComment","updateComment","getData","updatePopupColor","removeComment","removeComments","deleteComment","savedData","addCommands","isSelected","toggleCommentPopup","makeCommentColor","getCommentDialogElement","dialogElement","waitForEditorsRendered","pageNumber","withResolvers","onEditorsRendered","off","getSignature","switchToMode","once","dispatch","source","setPreference","deletePage","getEditors","focusMainContainer","focus","findParent","layerX","layerY","getBoundingClientRect","toggle","addShouldRescale","removeShouldRescale","commitOrRemove","pagesRotation","getAnchorElementForSelection","#getAnchorElementForSelection","anchorNode","nodeType","Node","TEXT_NODE","parentElement","getLayerForTextLayer","#getLayerForTextLayer","textLayer","currentLayer","hasTextLayer","methodOfCreation","selection","getSelection","isCollapsed","anchorOffset","focusNode","focusOffset","anchorElement","closest","getSelectionBoxes","empty","isNoneMode","createAndAddNewEditor","showAllEditors","#beforeUnload","endDrawingSession","displayFloatingToolbar","#displayFloatingToolbar","getAndRemoveDataFromAnnotationStorage","annotationId","storedValue","getRawValue","addToAnnotationStorage","a11yAlert","messageId","JSON","stringify","selectionChange","#selectionChange","dispatchUpdateStates","activeLayer","toggleDrawing","pointerup","onSelectEnd","#onSelectEnd","#addSelectionListener","addFocusManager","#addFocusManager","blur","removeFocusManager","#removeFocusManager","hasSelection","lastEditor","#addKeyboardManager","keydown","keyup","removeKeyboardManager","#removeKeyboardManager","addCopyPasteListeners","#addCopyPasteListeners","copy","cut","paste","removeCopyPasteListeners","#removeCopyPasteListeners","#addDragAndDropListeners","dragOver","drop","addEditListeners","setEditingState","removeEditListeners","dataTransfer","isHandlingMimeForPasting","dropEffect","item","editors","serialized","serialize","clipboardData","setData","ex","newEditors","deserializedEditor","deserialize","addEditorToLayer","selectEditors","isEditorHandlingKeyboard","updatePageIndex","oldPageIndex","newPageIndex","enable","disable","startUpdatePages","endUpdatePages","clonePage","getId","isClone","popupRef","findClonesForPage","promises","addOrRebuild","all","#dispatchUpdateStates","hasChanged","dispatchUpdateUI","#dispatchUpdateUI","registerEditorTypes","types","defaultPropertiesToUpdate","getLayer","addLayer","removeLayer","updateMode","editId","isFromUser","isFromKeyboard","mustEnterInEditMode","hideSidebar","destroyPopup","disableAll","hideStandaloneCommentButton","addStandaloneCommentButton","loadSignatures","enableAll","getAnnotationsByType","editorClass","_editorType","elementIds","allComments","annotationElementId","hasComment","deleted","annotation","contentsObj","showSidebar","setSelected","enterInEditMode","unselect","canCreateNewEmptyEditor","addNewEditor","updateToolbar","action","updateDefaultParams","visible","updateButton","state","enableWaiting","mustWait","disableClick","enableClick","#enableAll","#disableAll","getEditor","addEditor","removeEditor","setTimeout","addDeletedAnnotationElement","addChangedExistingAnnotation","isDeletedAnnotationElement","removeDeletedAnnotationElement","removeChangedExistingAnnotation","#addEditorToLayer","setActiveEditor","propertiesToUpdate","lastSelectedEditor","#lastSelectedEditor","ed","updateUI","updateUIForDefaultProperties","toggleSelected","select","firstSelectedEditor","params","cleanUndoStack","#isEmpty","drawingEditor","#selectEditors","commit","noCommit","totalX","totalY","TIME_TO_WAIT","translateInPage","translationDone","setUpDragSession","savedX","savedY","savedPageIndex","newX","newY","endDragSession","mustBeAddedInUndoStack","move","_setParentAndPosition","dragSelectedEditors","tx","ty","drag","rebuild","changeParent","getActive","shouldGetKeyboardEvents","isActive","getMode","isEditingMode","imageManager","rangeCount","getRangeAt","commonAncestorContainer","parentWidth","parentHeight","rotator","w","range","collapsed","getClientRects","renderAnnotationElement","editorId","hasBeenModified","setMissingCanvas","setCanvas","addMissingCanvas","AltText","altTextDecorative","altTextButton","altTextButtonLabel","altTextTooltip","altTextTooltipTimeout","altTextWasFromKeyBoard","badge","guessedText","textWithDisclaimer","l10nNewButton","_l10n","added","review","initialize","l10n","label","onClick","_reportTelemetry","setState","#label","finish","focusVisible","hasData","setGuessedText","generatedAltText","toggleAltTextBadge","isForCopying","decorative","cancel","enabled","disabled","#setState","tooltip","DELAY_TO_SHOW_TOOLTIP","parentNode","getElementForAltText","Comment","commentStandaloneButton","commentToolbarButton","commentWasFromKeyBoard","initialText","richText","date","popupPosition","renderForStandalone","commentButtonPosition","commentButtonColor","backgroundColor","focusButton","onUpdatedColor","commentButtonWidth","boundingClientRect","commentPopupPositionInLayer","parentX","parentY","hasDefaultPopupPosition","removeStandaloneCommentButton","setCommentButtonStates","hasPopup","ariaExpanded","isStandalone","ariaHasPopup","ariaControls","ariaControlsElements","edit","parentDimensions","isDeleted","hasBeenEdited","restoreData","setInitialText","TouchManager","isPinching","isPinchingStopped","isPinchingDisabled","onPinchStart","onPinching","onPinchEnd","pointerDownAC","touchInfo","touchManagerAC","touchMoveAC","onTouchStart","passive","MIN_TOUCH_DISTANCE_TO_PINCH","#onTouchStart","touches","opts","cancelPointerDown","opt","onTouchMove","onTouchEnd","touch0","touch1","identifier","touch0X","screenX","touch0Y","screenY","touch1X","touch1Y","#onTouchMove","screen0X","screen0Y","screen1X","screen1Y","pTouch0X","pTouch0Y","pTouch1X","pTouch1Y","prevGapX","prevGapY","currGapX","currGapY","distance","hypot","pDistance","origin","#onTouchEnd","AnnotationEditor","accessibilityData","allResizerDivs","dragPointerId","dragPointerType","resizersDiv","lastPointerCoords","savedDimensions","fakeAnnotation","focusAC","focusedResizerName","hasBeenClicked","initialRect","isInEditMode","isResizerEnabledForKeyboard","moveInDOMTimeout","prevDragX","prevDragY","telemetryTimeouts","touchManager","_isCopy","_editToolbar","_initialOptions","_initialData","_isVisible","_l10nAlert","_l10nResizer","isDraggable","zIndex","_zIndex","_borderLineWidth","_colorManager","_telemetryTimeout","_resizerKeyboardManager","resize","_resizeWithKeyboard","_stopResizingWithKeyboard","_willKeepAspectRatio","isCentered","_structTreeParentId","creationDate","modificationDate","canAddComment","pageRotation","pageDimensions","pageTranslation","isAttachedToDOM","getPrototypeOf","_type","isDrawer","_defaultLineColor","deleteAnnotationElement","fakeEditor","FakeEditor","topLeft","topMiddle","topRight","middleRight","bottomRight","bottomMiddle","bottomLeft","middleLeft","documentElement","getPropertyValue","_value","mime","_isDraggable","center","parentRotation","fixAndSetPosition","setInBackground","setInForeground","setParent","stopResizing","focusin","focusout","relatedTarget","isMultipleSelection","setAt","screenToPageTranslation","_moveAfterPaste","baseX","baseY","_onTranslated","translate","#translate","_onTranslating","scrollIntoView","block","findNewParent","bx","by","getBaseTranslation","left","toFixed","_hasBeenMoved","_hasBeenResized","_mustFixPosition","moveInDOM","rotatePoint","#rotatePoint","angle","pageTranslationToScreen","getRotationMatrix","#getRotationMatrix","parentScale","setDims","getInitialTranslation","createResizers","#createResizers","classes","resizerPointerdown","prepend","#resizerPointerdown","savedDraggable","togglePointerEvents","resizerPointermove","savedWidth","savedHeight","savedParentCursor","cursor","savedCursor","pointerUpCallback","addResizeToUndoStack","#resize","_onResized","#addResizeToUndoStack","newWidth","newHeight","_round","#resizerPointermove","minWidth","MIN_SIZE","minHeight","rotationMatrix","transf","invRotationMatrix","invTransf","getPoint","getOpposite","isDiagonal","isHorizontal","point","oppositePoint","transfOppositePoint","oppositeX","oppositeY","ratioX","ratioY","deltaX","deltaY","fromKeyboard","lastScreenX","lastScreenY","oldDiag","_onResizing","altTextFinish","toolbarButtons","addEditToolbar","addCommentButton","addCommentButtonInToolbar","removeCommentButtonFromToolbar","removeEditToolbar","addContainer","editToolbarDiv","before","getClientDimensions","createAltText","altTextData","guessedAltText","setGuessedAltText","serializeAltText","hasAltText","hasAltTextData","focusCommentButton","setCommentData","updateFromAnnotationLayer","hasEditedComment","hasDeletedComment","setSelectedCommentButton","setSelectedButton","DEFAULT_POPUP_WIDTH","DEFAULT_POPUP_HEIGHT","trY","blX","blY","trX","popup","contents","parentBoundingClientRect","defaultL10nId","addFocusListeners","maxWidth","maxHeight","isResizable","touchPinchStartCallback","touchPinchCallback","touchPinchEndCallback","#touchPinchStartCallback","#touchPinchCallback","_origin","prevDistance","slowDownFactor","factor","transfCenterPoint","newTransfCenterPoint","#touchPinchEndCallback","pointerdown","selectOnPointerEvent","#selectOnPointerEvent","#setUpDragSession","hasDraggingStarted","cancelDrag","_onStopDragging","clientX","clientY","_onStartDragging","isPrimary","moveEditorInDOM","getRect","shiftX","shiftY","getRectInCurrentCoords","getPDFRect","onceAdded","enableEditMode","disableEditMode","needsToBeRebuilt","isOnScreen","bottom","right","innerHeight","innerWidth","#addFocusListeners","rotate","_angle","serializeDeleted","context","annotationType","structTreeParentId","isCopy","hideCommentPopup","timeout","makeResizable","commentButtonPositionInPage","commentPopupPosition","elementBeforePopup","boundResizerKeydown","resizerKeydown","boundResizerBlur","resizerBlur","resizerFocus","firstPosition","nextFirstPosition","lastElementChild","setResizerTabIndex","stopImmediatePropagation","#resizerKeydown","#resizerBlur","#resizerFocus","#setResizerTabIndex","#stopResizing","preventScroll","disableEditing","enableEditing","canChangeContent","dblclick","nodeName","contentDiv","telemetryInitialData","telemetryFinalData","updateFakeAnnotationElement","annotationLayer","addFakeAnnotation","updateEdited","content","resetAnnotationElement","SEED","MASK_HIGH","MASK_LOW","MurmurHash3_64","seed","h1","h2","ArrayBuffer","isView","byteLength","blockCounts","tailLength","dataUint32","k1","k2","C1","C2","C1_LOW","C2_LOW","hexdigest","SerializableEmpty","transfer","AnnotationStorage","modified","modifiedIds","editorsMap","onSetModified","onResetModified","onAnnotationEditor","defaultValue","resetModified","entry","val","setModified","#setModified","print","PrintAnnotationStorage","serializable","hasBitmap","_pageIndex","editorStats","stats","typeToEditor","numberOfEditedComments","numberOfDeletedComments","isCommentDeleted","counters","comments","edited","computeTelemetryFinalData","resetModifiedIds","updateEditor","ids","Symbol","structuredClone","FORCED_DEPENDENCY_LABEL","expandBBox","index","minX","minY","maxX","maxY","scaleCharBBox","scaleX","scaleY","bbox","temp","EMPTY_BBOX","BBoxReader","bboxes","coords","ensureDebugMetadata","dependencies","isRenderingOperation","CanvasBBoxTracker","baseTransformStack","clipBox","pendingBBox","Float64Array","_pendingBBoxIdx","canvasWidth","canvasHeight","bboxesCoords","_savesStack","_markedContentStack","operationsCount","initializeBBoxes","growOperationsCount","#initializeBBoxes","oldBBoxes","Uint8ClampedArray","opIdx","__proto__","onSavePopped","previous","lastSave","recordOpenMarker","idx","getOpenMarker","recordCloseMarker","pushBaseTransform","popBaseTransform","resetBBox","recordClipBox","intersection","recordBBox","recordFullPageBBox","recordOperation","preserve","dependencyLists","depIdx","bboxToClipBoxDropOperation","take","takeDebugMetadata","recordSimpleData","recordIncrementalData","resetIncrementalData","recordNamedData","recordSimpleDataFromNamed","depName","fallbackIdx","recordFutureForcedDependency","inheritSimpleDataAsFutureForcedDependencies","inheritPendingDependenciesAsFutureForcedDependencies","recordCharacterBBox","font","getMeasure","getSimpleIndex","dependencyName","recordDependencies","dependencyNames","recordNamedDependency","recordShowTextOperation","CanvasDependencyTracker","simple","incremental","sameLineText","namedDependencies","pendingDependencies","fontBBoxTrustworthy","debugMetadata","recordDebugMetadataDepenencyAfterRestore","bboxTracker","recordDebugMetadata","dep","fontBBox","isBBoxTrustworthy","computedBBox","fontMatrix","measure","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","forEach","metadata","needsCleanup","deps","CanvasNestedDependencyTracker","dependencyTracker","ignoreBBoxes","nestingLevel","savesLevel","Dependencies","imageXObject","transformAndFill","CanvasImagesTracker","capacity","count","CoordsArray","record","newCoords","finalBBox","rotationAngle","atan2","sin","cos","finalBBoxWidth","finalBBoxHeight","sin2","cos2","cosSin","denom","FontLoader","systemFonts","styleSheet","ownerDocument","styleElement","_document","nativeFontFaces","loadingRequests","loadTestFontId","addNativeFontFace","nativeFontFace","fonts","removeNativeFontFace","insertRule","rule","getStyleSheet","cssRules","#getStyleSheet","StyleSheet","defaultView","CSSStyleSheet","adoptedStyleSheets","getElementsByTagName","sheet","loadSystemFont","systemFontInfo","disableFontFace","_inspectFont","loadedName","isFontLoadingAPISupported","fontFace","FontFace","load","baseFontName","attached","missingFile","createNativeFontFace","loaded","family","createFontFaceRule","isSyncFontLoadingSupported","_queueLoadingCallback","_prepareFontLoadEvent","hasFonts","completeRequest","done","otherRequest","shift","complete","_loadTestFont","testFont","atob","int32","offset","string32","spliceString","insert","chunk1","chunk2","called","isFontReady","fillText","imageData","COMMENT_OFFSET","CFF_CHECKSUM_OFFSET","XXXX_VALUE","checksum","btoa","fontFamily","FontFaceObject","compiledGlyphs","fontData","translatedData","inspectFont","charProcOperatorList","extra","cssFontInfo","css","weight","fontWeight","italicAngle","mimetype","toBase64","getPathGenerator","objs","character","objId","cmds","fontExtraProperties","black","bold","isInvalidPDFjsFont","isType3Font","italic","remeasure","vertical","ascent","defaultWidth","descent","fallbackName","clearData","defaultVMetrics","CSS_FONT_INFO","strings","SYSTEM_FONT_INFO","FONT_INFO","bools","numbers","OFFSET_NUMBERS","OFFSET_BBOX","OFFSET_FONT_MATRIX","OFFSET_DEFAULT_VMETRICS","OFFSET_STRINGS","PATTERN_INFO","KIND","HAS_BBOX","HAS_BACKGROUND","SHADING_TYPE","N_COORD","N_COLOR","N_STOP","N_FIGURES","CssFontInfo","decoder","TextDecoder","view","DataView","readString","#readString","getUint32","SystemFontInfo","guessFallback","getUint8","styleLength","weightLength","FontInfo","readBoolean","#readBoolean","byteOffset","bitOffset","readNumber","#readNumber","getFloat64","readArray","#readArray","arrLen","lookupName","increment","len","arr","getDataOffsets","#getDataOffsets","stringsLength","systemFontInfoLength","cssFontInfoLength","setUint32","cssFontInfoData","systemFontInfoData","PatternInfo","getIR","dataView","kind","hasBBox","hasBackground","nCoord","nColor","nStop","stops","getFloat32","shadingType","bounds","FontPathInfo","getUrlProp","getBuiltinModule","pathToFileURL","location","getDataProp","Buffer","isNaN","getFactoryUrlProp","isRefProxy","num","gen","isNameProxy","isValidExplicitDest","LoopbackPort","listeners","deferred","postMessage","listener","call","rmAbort","onAbort","removeEventListener","terminate","CallbackKind","DATA","ERROR","StreamKind","CANCEL","CANCEL_COMPLETE","CLOSE","ENQUEUE","PULL","PULL_COMPLETE","START_COMPLETE","onFn","wrapReason","MessageHandler","messageAC","sourceName","targetName","comObj","callbackId","streamId","streamSinks","streamControllers","callbackCapabilities","actionHandler","onMessage","#onMessage","stream","processStreamMessage","capability","reason","try","createStreamSink","actionName","handler","ah","transfers","sendWithPromise","sendWithStream","queueingStrategy","ReadableStream","controller","startCapability","startCall","pullCall","cancelCall","isClosed","desiredSize","pull","pullCapability","cancelCapability","#createStreamSink","streamSink","enqueue","isCancelled","lastDesiredSize","sinkCapability","ready","error","onPull","onCancel","success","#processStreamMessage","streamController","deleteStreamController","dataReason","#deleteStreamController","allSettled","BaseBinaryDataFactory","errorStr","cMapUrl","standardFontDataUrl","wasmUrl","_fetch","catch","DOMBinaryDataFactory","BaseCanvasFactory","enableHWA","_createCanvas","reset","canvasAndContext","DOMCanvasFactory","BaseFilterFactory","addFilter","maps","fgColor","bgColor","addAlphaFilter","addLuminosityFilter","addKnockoutFilter","alpha","addHighlightHCMFilter","filterName","newFgColor","newBgColor","addSelectionHCMFilter","addSelectionFilter","createSelectionStyle","keepHCM","DOMFilterFactory","_cache","_defs","docId","_hcmCache","#cache","hcmCache","#hcmCache","defs","#defs","contain","createTables","#createTables","mapR","table","mapG","mapB","bufferR","bufferG","bufferB","createUrl","#createUrl","tableR","tableG","tableB","createFilter","addTransferMapConversion","fgRGB","bgRGB","addGrayConversion","getSteps","tableA","addTransferMapAlphaConversion","addLuminosityConversion","slope","feComponentTransfer","feFuncA","fgGray","bgGray","newFgRGB","newBgRGB","getOpaqueTextColor","fg","bg","step","newStart","newStep","prev","j","#addLuminosityConversion","feColorMatrix","#addGrayConversion","#createFilter","appendFeFunc","#appendFeFunc","func","feFunc","#addTransferMapConversion","rTable","gTable","bTable","#addTransferMapAlphaConversion","aTable","#getRGB","#getRGBA","#getOpaqueTextColor","canvasR","canvasG","canvasB","blend","fs","readFile","NodeFilterFactory","NodeCanvasFactory","require","createRequire","import","meta","createCanvas","NodeBinaryDataFactory","convertToRGBA","convertBlackAndWhiteToRGBA","convertRGBToRGBA","srcPos","nonBlackColor","inverseDecode","zeroMapping","oneMapping","widthInSource","widthRemainder","xorMask","srcLength","destPos","elem","len32","src32","alphaMask","s1","s2","s3","jj","grayToRGBA","MESH_WGSL","WebGPU","initPromise","device","meshPipeline","preferredFormat","initGPU","#initGPU","gpu","adapter","requestAdapter","getPreferredCanvasFormat","requestDevice","init","isReady","loadMeshShader","shaderModule","createShaderModule","createRenderPipeline","layout","vertex","module","entryPoint","buffers","arrayStride","shaderLocation","format","targets","primitive","topology","draw","posData","colData","vertexCount","paddedWidth","paddedHeight","borderSize","posBuffer","createBuffer","usage","GPUBufferUsage","VERTEX","COPY_DST","queue","writeBuffer","colBuffer","uniformBuffer","UNIFORM","bindGroup","createBindGroup","getBindGroupLayout","binding","resource","gpuCtx","configure","alphaMode","clearValue","commandEncoder","createCommandEncoder","renderPass","beginRenderPass","colorAttachments","getCurrentTexture","createView","loadOp","storeOp","setPipeline","setBindGroup","setVertexBuffer","submit","_webGPU","isGPUReady","drawMeshWithGPU","PathType","SHADING","applyBoundingBox","region","BaseShadingPattern","isModifyingCurrentTransform","getPattern","RadialAxialShadingPattern","IR","_bbox","_colorStops","_p0","_p1","_r0","_r1","isOriginBased","isRadial","areConic","dist","_createGradient","grad","firstPoint","secondPoint","createLinearGradient","createRadialGradient","colorStop","addColorStop","_createReversedGradient","reversedStops","owner","inverse","pathType","pattern","baseTransform","precision","n1","n2","ps","ownerBBox","current","getClippedPathBoundingBox","tmpCanvas","canvasFactory","tmpCtx","clearRect","beginPath","fillStyle","createPattern","domMatrix","DOMMatrix","setTransform","fillRect","drawTriangle","p3","c1","c2","c3","rowSize","tmp","c1r","c1g","c1b","c2r","c2g","c2b","c3r","c3g","c3b","xa","car","cag","cab","xb","cbr","cbg","cbb","x1_","x2_","MeshShadingPattern","_posData","_colData","_vertexCount","_bounds","_background","_createMeshCanvas","combinedScale","EXPECTED_SCALE","MAX_PATTERN_SIZE","BORDER_SIZE","boundsWidth","boundsHeight","createImageData","putImageData","matrixScaleX","matrixScaleY","temporaryPatternCanvas","DummyShadingPattern","getShadingPattern","PaintType","COLORED","UNCOLORED","TilingPattern","canvasGraphicsFactory","operatorList","xstep","ystep","paintType","tilingType","needsIsolation","patternBaseMatrix","canSkipPatternCanvas","absXStep","absYStep","nXFirst","nXLast","nYFirst","nYLast","updatePatternDims","clippedBBox","inv","_renderTileCanvas","dimx","dimy","graphics","createCanvasGraphics","groupLevel","setFillAndStrokeStyleToContext","clipBbox","executeOperatorList","endDrawing","_getCombinedScales","drawPattern","useEOFill","globalAlpha","globalCompositeOperation","inSMaskMode","bboxWidth","bboxHeight","combinedScaleX","combinedScaleY","getSizeAndScale","createPatternCanvas","redrawHorizontally","redrawVertically","dimx2","dimy2","xSize","ySize","tmpCanvas2","tmpCtx2","canvasEntry","realOutputSize","updateClipFromPath","patternFill","patternStroke","strokeStyle","fillColor","strokeColor","MIN_FONT_SIZE","MAX_FONT_SIZE","EXECUTION_TIME","EXECUTION_STEPS","FULL_CHUNK_HEIGHT","SCALE_MATRIX","XY","mirrorContextOperations","destCtx","_removeMirroring","originalMethods","original","drawImageAtIntegerCoords","srcImg","srcX","srcY","srcW","srcH","destX","destY","destW","destH","tlX","rTlX","tlY","rTlY","brX","rWidth","brY","rHeight","sign","CanvasExtraState","alphaIsShape","fontSize","fontSizeScale","textMatrix","textMatrixScale","leading","lineX","lineY","charSpacing","wordSpacing","textHScale","textRenderingMode","textRise","tilingPatternDims","fillAlpha","strokeAlpha","lineWidth","activeSMask","transferMaps","getPathBoundingBox","xStrokePad","yStrokePad","startNewPathAndClipBox","isEmptyClip","putBinaryImageData","imgData","partialChunkHeight","fullChunks","totalChunks","chunkImgData","elemsInThisChunk","putBinaryImageMask","copyCtxState","sourceCtx","properties","property","setLineDash","getLineDash","lineDashOffset","resetCtxToDefault","fillRule","lineCap","lineJoin","miterLimit","getImageSmoothingEnabled","interpolate","actualScale","fround","LINE_CAP_STYLES","LINE_JOIN_STYLES","NORMAL_CLIP","EO_CLIP","CanvasGraphics","knockoutGroupLevel","knockoutElementDepth","knockoutTempCanvasEntry","knockoutSavedCtx","knockoutSavedSMaskCtx","knockoutSavedGCO","knockoutElementAlpha","knockoutFilterCache","knockoutElementGroupMeta","groupStackMeta","canvasCtx","commonObjs","optionalContentConfig","markedContentStack","annotationCanvasMap","imagesTracker","stateStack","pendingClip","pendingEOFill","groupStack","smaskStack","tempSMask","smaskGroupCanvases","smaskPreparedEntry","smaskPreparedFor","smaskPreparedOffsetX","smaskPreparedOffsetY","smaskPreparedOOBAlpha","suspendedCtx","contentVisible","cachedPatterns","viewportScale","outputScaleX","outputScaleY","_cachedScaleForStroking","_cachedGetSinglePixelWidth","_cachedBitmapsMap","getObject","beginDrawing","transparency","savedFillStyle","transparentCanvas","transparentCanvasEntry","compositeCtx","executionStartIdx","continueCallback","stepper","operationsFilter","argsArray","fnArray","argsArrayLen","chunkOperations","endTime","steps","fnId","fnArgs","nextBreakPoint","breakIt","shouldSkip","depObjId","objsPool","restoreInitialState","#restoreInitialState","_clearPreparedSMask","destroyKnockoutPools","HTMLCanvasElement","drawFilter","#drawFilter","hcmFilterId","savedFilter","_scaleImage","img","displayWidth","displayHeight","widthScale","heightScale","scaleSteps","ws","hs","pw","ph","nh","paintWidth","paintHeight","readEntry","writeEntry","_createMaskCanvas","isPatternFill","currentTransform","cacheKey","maskCanvas","mainKey","cachedImage","maskToCanvas","drawnWidth","drawnHeight","fillCanvas","fillCtx","scaledEntry","scaleResult","imageSmoothingEnabled","limit","dashArray","dashPhase","flatness","states","blendMode","checkSMaskState","_ensurePreparedSMask","smask","_prepareSMaskCanvas","beginSMaskMode","endSMaskMode","subtype","backdrop","transferMap","hasFilter","filteredOOBAlpha","inputAlpha","SMASK_LAYER_TO_MASK_AREA_RATIO","layerW","layerH","maskArea","useLayerSize","filterSpec","bakedBackdrop","preparedEntry","_bakeSMaskCanvas","drawX","drawY","srcEntry","sCtx","pCtx","filterApplied","scratchCanvas","smaskScratchCanvas","createKnockoutMaskCanvas","#createKnockoutMaskCanvas","sourceCanvas","reuseEntry","maskEntry","maskCtx","needsAlphaScaling","knockoutFilter","sourceData","maskData","sourcePixels","maskPixels","alphaScale","getOrCreatePooledEntry","#getOrCreatePooledEntry","compositeKnockoutSurface","#compositeKnockoutSurface","surfaceCanvas","backdropCanvas","destTransform","backdropOffset","reuseMaskEntry","poolMeta","sourceAlpha","sourceFilter","knockoutAlpha","knockoutMaskEntry","sourceCompositeOperation","backdropEntry","backdropCtx","beginKnockoutElement","#beginKnockoutElement","groupMeta","tempEntry","tempCtx","endKnockoutElement","#endKnockoutElement","savedCtx","savedSMaskCtx","compose","dirtyBox","applySMaskInPlace","composeSMask","layerCtx","layerBox","layerOffsetX","layerOffsetY","layerWidth","layerHeight","clipX","clipY","clipW","clipH","oobAlpha","hasOOBAlpha","_applySMaskOOBAlpha","genericComposeSMask","maskX0","maskY0","maskX1","maskY1","hasInnerCutout","maskOffsetX","maskOffsetY","old","op","outerExtraSize","tilingDims","_pathStartIdx","consumePath","newPath","addPath","multiplySelf","rescaleAndStroke","needRestore","tileIdx","paths","pendingTextPaths","preMultiplySelf","spacing","fontRefName","fontObj","fontDirection","typeface","browserFontSize","rise","getScaledPath","#getScaledPath","paintChar","patternFillTransform","patternStrokeTransform","fillStrokeMode","isAddToPathSet","scaledPath","invPatternTransform","measureText","strokeText","isFontSubpixelAAEnabled","glyphs","showType3Text","glyphsLength","spacingDir","widthAdvanceScale","simpleFillText","needsFill","needsStroke","getSinglePixelWidth","chars","glyph","unicode","joinedChars","restoreNeeded","isSpace","fontChar","accent","scaledX","scaledY","vmetric","vx","vy","measuredWidth","characterScaleX","isInFont","scaledAccentX","scaledAccentY","charWidth","isTextInvisible","spacingLength","operatorListId","xWidth","yWidth","llx","lly","urx","ury","getColorN_Pattern","renderingOpIdx","_getPattern","group","currentCtx","isolated","hasSoftMask","knockout","isGray","canvasBounds","groupCtx","hasInnerBackdrop","savedKnockoutLevel","knockoutTempEntry","knockoutBackdropEntry","convertGroupToGray","currentMtx","parentGroupMeta","colorEntry","colorCtx","shapeMaskEntry","#convertGroupToGray","gray","#destroyKnockoutPools","hasOwnCanvas","canvasName","annotationCanvas","canvases","findIndex","mask","skewX","skewY","positions","trans","images","applyTransferMapsToCanvas","applyTransferMapsToBitmap","imgToPaint","inlineImgCanvas","tag","isVisible","isContentVisible","absDet","normX","normY","getScaleForStroking","scaledLineWidth","scaledXLineWidth","scaledYLineWidth","baseArea","saveRestore","dashes","BasePDFStream","PDFStreamReader","PDFStreamRangeReader","_fullReader","_rangeReaders","_source","_progressiveDataLength","_loaded","getFullReader","getRangeReader","begin","reader","cancelAllRequests","BasePDFStreamReader","onProgress","_contentLength","_filename","_headersCapability","_isRangeSupported","_isStreamingSupported","_stream","_callOnProgress","total","headersReady","contentLength","isRangeSupported","isStreamingSupported","read","BasePDFStreamRangeReader","getFilenameFromContentDispositionHeader","contentDisposition","needsEncodingFixup","toParamRegExp","rfc2616unquote","rfc5987decode","rfc2047decode","fixupEncoding","rfc2231getparam","attributePattern","flags","textdecode","encoding","fatal","contentDispositionStr","iter","quot","quotindex","indexOf","extvalue","encodingend","langvalue","charset","createHeaders","isHttp","httpHeaders","headers","Headers","getResponseOrigin","validateRangeRequestCapabilities","responseHeaders","rangeChunkSize","disableRange","rv","contentEncoding","extractFilenameFromHeader","createResponseError","ensureResponseOrigin","rangeOrigin","fetchUrl","withCredentials","method","credentials","redirect","ensureResponseStatus","getArrayBuffer","PDFFetchStream","_responseOrigin","PDFFetchStreamReader","PDFFetchStreamRangeReader","_abortController","_reader","disableStream","getReader","_readCapability","responseOrigin","endRequests","_requests","PDFDataTransportStream","_progressiveDone","_queuedChunks","PDFDataTransportStreamReader","PDFDataTransportStreamRangeReader","pdfDataRangeTransport","initialData","progressiveDone","onReceiveData","transportReady","#onReceiveData","_enqueue","rangeReader","_begin","onDone","requestDataRange","_done","contentDispositionFilename","_queuedChunk","OK_RESPONSE","PARTIAL_CONTENT_RESPONSE","PDFNetworkStream","pendingRequests","WeakMap","PDFNetworkStreamReader","PDFNetworkStreamRangeReader","_request","xhr","pendingRequest","validateStatus","onHeadersReceived","onError","setRequestHeader","onStateChange","onprogress","#onProgress","#onStateChange","xhrStatus","rangeHeader","getResponseHeader","_abortRequest","onClosed","_cachedChunks","_storedError","_fullRequestXhr","#onHeadersReceived","fullRequestXhr","responseURL","rawResponseHeaders","getAllResponseHeaders","trimStart","#onDone","#onError","lengthComputable","_requestXhr","getReadableStream","Readable","readStream","createReadStream","toWeb","PDFNodeStream","PDFNodeStreamReader","PDFNodeStreamRangeReader","lstat","stat","readableStream","getNetworkStream","GlobalWorkerOptions","port","workerPort","Worker","workerSrc","Metadata","parsedData","getRaw","INTERNAL","OptionalContentGroup","isDisplay","isPrint","userSet","renderingIntent","rbGroups","viewState","printState","_setVisible","OptionalContentConfig","cachedGetHash","groups","initialHash","order","creator","groupState","baseState","getHash","evaluateVisibilityExpression","#evaluateVisibilityExpression","operator","expression","policy","setVisibility","preserveRB","rbGroup","otherId","setOCGState","hasInitialVisibility","getOrder","getGroup","fromSerializable","PagesMapper","pageNumberToId","prevPageNumbers","pagesNumber","clipboard","ensureInit","#ensureInit","Int32Array","buildIdToPageNumber","#buildIdToPageNumber","idToPageNumber","pageNumbers","movePages","selectedPages","pagesToMove","prevIdToPageNumber","movedCount","mappedPagesToMove","removedBeforeTarget","remainingLen","adjustedTarget","copyWithin","updatePrevPageNumbers","deletePages","pagesToDelete","newN","newPageNumberToId","sourceIndex","destIndex","cancelDelete","cleanSavedData","copyPages","pagesToCopy","pageIds","cancelCopy","pastePages","copiedPageNumbers","copiedPageIds","#updatePrevPageNumbers","deletedPageNumbers","pasteIndex","pasteEnd","idsIndices","oldPositions","hasBeenAltered","getPageMappingForSaving","nCopy","extractParams","pageIndices","includePages","sort","extractPages","extractedPageNumbers","usedIds","getPageId","usedPageNumbers","getPrevPageNumber","getPageNumber","getMapping","INITIAL_DATA","dataObj","PDFObjects","MAX_TEXT_DIVS_TO_RENDER","DEFAULT_FONT_SIZE","TextLayer","disableProcessItems","fontInspectorEnabled","FontInspector","imagesHandler","lang","layoutTextParams","rootContainer","styleCache","textContentItemsStr","textContentSource","textDivProperties","ascentCache","canvasContexts","canvasCtxFonts","minFontSize","pendingTextLayers","ensureMinFontSizeComputed","setProperty","finally","fontFamilyMap","pump","processItems","onBefore","getCtx","abortEx","#processItems","ariaHidden","appendText","#appendText","geom","textDiv","hasText","hasEOL","fontName","fontSubstitution","fontHeight","fontAscent","getAscent","divStyle","dataset","fontSubstitutionLoadedName","shouldScaleText","absScaleX","absScaleY","br","#layout","ensureCtxFont","cleanup","#getCtx","cssText","#ensureCtxFont","cached","#ensureMinFontSizeComputed","lineHeight","#getAscent","cachedAscent","metrics","fontBoundingBoxAscent","fontBoundingBoxDescent","ratio","RENDERING_CANCELLED_TIMEOUT","getDocument","task","PDFDocumentLoadingTask","password","rangeTransport","PDFDataRangeTransport","worker","PDFWorker","docBaseUrl","cMapPacked","iccUrl","ignoreErrors","stopAtErrors","maxImageSize","canvasMaxAreaInBytes","enableXfa","disableAutoFetch","pdfBug","CanvasFactory","FilterFactory","BinaryDataFactory","enableWebGPU","gpuPromise","useWasm","pagesMapper","useSystemFonts","useWorkerFetch","transportFactory","binaryDataFactory","_worker","docParams","apiVersion","evaluatorOptions","hasGPU","transportParams","loadingParams","destroyed","workerIdPromise","messageHandler","networkStream","NetworkStream","workerId","transport","WorkerTransport","_transport","_capability","_setupCapability","onPassword","_pendingDestroy","onDataRange","onDataProgressiveRead","onDataProgressiveDone","PDFDocumentProxy","pdfInfo","_pdfInfo","numPages","fingerprints","isPureXfa","_htmlForXfa","allXfaHtml","getPage","getPageIndex","ref","getDestinations","getDestination","getPageLabels","getPageLayout","getPageMode","getViewerPreferences","getOpenAction","getAttachments","getAttachmentContent","pageIndexesToSkip","getJSActions","getDocJSActions","getOutline","getOptionalContentConfig","getRenderingIntent","getPermissions","getMetadata","getMarkInfo","saveDocument","pageInfos","getDownloadInfo","downloadInfoCapability","getRawData","keepLoadedFonts","startCleanup","cachedPageNumber","loadingTask","getFieldObjects","hasJSActions","getCalculationOrderIds","PDFPageProxy","pendingCleanup","pageInfo","_pageInfo","_stats","_pdfBug","_intentStates","recordedBBoxes","imageCoordinates","clonedFromIndex","updatePage","getViewport","getAnnotations","getPageJSActions","getXfa","canvasContext","annotationMode","optionalContentConfigPromise","printAnnotationStorage","recordImages","recordOperations","intentArgs","intentState","streamReaderCancelTimeout","intentPrint","displayReadyCapability","lastChunk","separateAnnots","_pumpOperatorList","recordForDebugger","StepperManager","shouldRecordOperations","shouldRecordImages","renderTasks","internalRenderTask","gfx","setOperatorBBoxes","tryCleanup","_abortOperatorList","Stats","InternalRenderTask","useRequestAnimationFrame","renderTask","initializeGraphics","operatorListChanged","getOperatorList","opListReadCapability","opListTask","streamTextContent","includeMarkedContent","disableNormalization","TEXT_CONTENT_CHUNK_SIZE","pageId","highWaterMark","getTextContent","getStructTree","_destroy","waitOn","force","completed","resetStats","#tryCleanup","_startRenderPage","_renderPageChunk","operatorListChunk","annotationStorageSerializable","streamReader","delay","curCacheKey","curIntentState","webWorker","fakeWorkerId","isWorkerDisabled","workerPorts","_isSameOrigin","otherUrl","base","other","_createCDNWrapper","wrapper","createObjectURL","initializeFromPort","#resolve","#initializeFromPort","#initialize","mainThreadWorkerMessageHandler","setupFakeWorker","terminateEarly","sendTest","testObj","#setupFakeWorker","_setupFakeWorkerGlobal","WorkerMessageHandler","workerHandler","setup","cachedPort","#mainThreadWorkerMessageHandler","pdfjsWorker","loader","fullReader","methodPromises","pageCache","pagePromises","pageRefCache","passwordCapability","factory","fontLoader","_params","destroyCapability","setupMessageHandler","cacheSimpleMethod","#cacheSimpleMethod","percent","isOpList","modifiedIdsHash","cacheKeyBuf","terminated","sink","readyReason","_numPages","htmlForXfa","updatePassword","err","exportedData","exportedError","fontAdded","imageRef","pageProxy","dataLen","ImageBitmapCtor","ImageBitmap","infos","mapping","remapped","sourceIdx","cachedPromise","refStr","results","hasStructTree","cleanupSuccessful","RenderTask","_internalRenderTask","onContinue","form","rAF","canvasInUse","WeakSet","operatorListIdx","running","graphicsReadyCallback","graphicsReady","_useRequestAnimationFrame","cancelled","_cancelBound","_continueBound","_continue","_scheduleNextBound","_scheduleNext","_nextBound","_next","_canvas","_canvasContext","_enableHWA","_dependencyTracker","_imagesTracker","_operationsFilter","getNextBreakPoint","cancelAnimationFrame","updateOperatorList","requestAnimationFrame","version","build","ColorPicker","buttonSwatch","defaultColor","dropdown","dropdownWasFromKeyboard","isMainColorPicker","openDropdownAC","l10nColor","_hideDropdownFromKeyboard","_colorSelectFromKeyboard","_moveToNext","_moveToPrevious","_moveToBeginning","_moveToEnd","blue","green","pink","red","yellow","openDropdown","keyDown","swatch","renderMainDropdown","getDropdownRoot","ariaOrientation","ariaLabelledBy","#getDropdownRoot","role","ariaMultiSelectable","ariaSelected","colorSelect","#colorSelect","updateColor","isDropdownVisible","nextSibling","previousSibling","#keyDown","#openDropdown","detail","#isDropdownVisible","BasicColorPicker","hasAlpha","colorType","colorAndOpacityType","opacityType","alphaHex","updateOpacity","makeColorComp","scaleAndClamp","ColorConverters","CMYK_G","G_CMYK","G_RGB","G_rgb","G_HTML","G","RGB_G","RGB_rgb","RGB_HTML","T_HTML","T_rgb","CMYK_RGB","CMYK_rgb","CMYK_HTML","components","RGB_CMYK","DateFormats","TimeFormats","BaseSVGFactory","skipDimensions","_createSVG","DOMSVGFactory","GetElementsByNameSet","TIMEZONE_OFFSET","getTimezoneOffset","AnnotationElementFactory","LinkAnnotationElement","TextAnnotationElement","fieldType","TextWidgetAnnotationElement","radioButton","RadioButtonWidgetAnnotationElement","checkBox","CheckboxWidgetAnnotationElement","PushButtonWidgetAnnotationElement","ChoiceWidgetAnnotationElement","SignatureWidgetAnnotationElement","WidgetAnnotationElement","PopupAnnotationElement","FreeTextAnnotationElement","LineAnnotationElement","SquareAnnotationElement","CircleAnnotationElement","PolylineAnnotationElement","CaretAnnotationElement","InkAnnotationElement","PolygonAnnotationElement","HighlightAnnotationElement","UnderlineAnnotationElement","SquigglyAnnotationElement","StrikeOutAnnotationElement","StampAnnotationElement","FileAttachmentAnnotationElement","MediaAnnotationElement","AnnotationElement","updates","hasBorder","popupElement","isRenderable","ignoreBorder","createQuadrilaterals","downloadManager","imageResourcesPath","renderForms","svgFactory","enableComment","enableScripting","_fieldObjects","fieldObjects","hasOwnCommentButton","contentElement","_createContainer","_createQuadrilaterals","_hasPopupData","_isEditable","isEditable","hasPopupData","commentText","commentData","hasCommentButton","hasPopupElement","quadPoints","inkLists","inkList","_normalizePoint","removePopup","newPopup","setRectEdited","_createPopup","resetEdited","#setRectEdited","currentRect","setRotation","alternativeText","noRotate","borderStyle","borderWidth","horizontalRadius","horizontalCornerRadius","verticalRadius","verticalCornerRadius","radius","borderRadius","borderBottomStyle","borderColor","_commonActions","setColor","jsName","styleName","colorArray","noView","noPrint","userName","readonly","required","_setRequired","textColor","_dispatchEventFromSandbox","actions","jsEvent","commonActions","_setDefaultPropertiesFromJS","eventProxy","rectBlX","rectBlY","rectTrX","rectTrY","svgBuffer","clipPath","rectWidth","rectHeight","backgroundImage","popupData","titleObj","parentRect","elements","extraPopupElement","_getElementsByName","skipId","fields","fieldObj","exportValues","exportValue","domElement","getElementsByName","maybeShow","forceHide","getElementsToTriggerPopup","addHighlightArea","triggers","_editOnDoubleClick","annotationEditorType","updateOC","oc","_setBackgroundColor","EditorAnnotationElement","createOrUpdatePopup","removeAnnotation","isTooltipOnly","link","isBound","_bindNamedAction","overlaidText","attachment","bindAttachment","attachmentId","attachmentDest","bindSetOCGState","_bindLink","Action","_bindJSAction","resetForm","_bindResetFormAction","setInternalLink","#setInternalLink","destination","getDestinationHash","onclick","goToDestination","getAnchorUrl","executeNamedAction","#bindAttachment","openAttachment","openOrDownloadData","#bindSetOCGState","executeSetOCGState","otherClickAction","resetFormFields","refs","resetFormRefs","include","allFields","fieldIds","fieldName","field","allIds","dispatchEvent","Event","_getKeyModifier","_setEventListener","elementData","baseName","eventName","valueGetter","focused","_setEventListeners","getter","Blur","Focus","_setTextStyle","TEXT_ALIGNMENT","fontColor","defaultAppearanceData","computedFontSize","roundToOneDecimal","multiLine","numberOfLines","textAlignment","comb","textAlign","isRequired","hasAppearance","fieldValue","setPropertyOnSiblings","keyInStorage","maxLen","charLimit","fieldFormattedValues","formattedValue","userValue","lastCommittedValue","commitKey","doNotScroll","overflowY","overflowX","readOnly","datetimeFormat","datetimeType","timeStep","hasDateOrTime","maxLength","defaultFieldValue","blurListener","scrollLeft","getHours","getMinutes","getSeconds","toISOString","selRange","setSelectionRange","willCommit","selStart","selectionStart","selEnd","selectionEnd","_blurListener","valueOf","Keystroke","inputType","change","fieldWidth","combWidth","alignment","setCombOffset","free","verticalAlign","checkbox","curChecked","buttonValue","radio","pdfButtonValue","linkElement","lastChild","selectElement","addAnEmptyEntry","combo","multiSelect","multiple","fixDisplayValue","newValue","optionElement","displayValue","removeEmptyEntry","noneOptionElement","isExport","selectedValues","getItems","multipleSelection","selectChild","indices","editable","changeEx","_commentManager","createPopup","#createPopup","PopupElement","boundKeyDown","boundHide","boundShow","boundToggle","dateObj","pinned","popupAbortController","commentButton","wasVisible","firstElement","trigger","flatMap","addEventListeners","#addEventListeners","setCommentButtonPosition","#setCommentButtonPosition","renderCommentButton","after","hasOwnButton","togglePopup","showPopup","hidePopup","parentContainer","updateCommentButtonPosition","#updateCommentButtonPosition","#updateColor","outlineColor","header","dateTime","#html","#fontSize","#fontColor","makePopupContent","#makePopupContent","popupLines","popupContent","lineAttributes","setPosition","#setPosition","useParentRect","normalizedRect","HORIZONTAL_SPACE_AFTER_ANNOTATION","popupLeft","popupTop","#toggle","#show","#hide","textPosition","lineSpan","lineCoordinates","square","circle","polyline","containerClassName","svgElementName","vertices","points","polylinesGroupElement","polylines","it","#getTransform","thickness","mark","underline","strikeout","fileId","download","#download","fallbackContent","contentUrl","media","richMedia","ariaLabel","#load","contentType","isConnected","isAudio","controls","autoplay","hovered","updateControls","revokeContentUrl","replaceWith","play","#revokeContentUrl","revokeObjectURL","pause","AnnotationLayer","accessibilityManager","editableAnnotations","structTreeLayer","hasAriaAttributesFromStructTree","annotationEditorUIManager","_annotationEditorUIManager","hasEditableAnnotations","annotations","popupToElements","popupAnnotations","elementParams","noHTML","isPopupAnnotation","rendered","addElementsToDOM","setAnnotationCanvasMap","#addElementsToDOM","replaceChildren","getAriaAttributes","ariaAttributes","top1","bot1","mid1","top2","bot2","mid2","centerX1","centerX2","addPointerInTextLayer","addLinkAnnotations","_defaultBorderStyle","removePointerInTextLayer","#setAnnotationCanvasMap","cvs","toRemove","firstCanvas","firstChild","lastCanvas","editableAnnotation","_hasNoCanvas","refreshCanvases","getEditableAnnotations","getEditableAnnotation","updateFakeAnnotations","rawWidth","EOL_PATTERN","FreeTextEditor","editorDivId","editModeAC","_colorPicker","_freeTextDefaultContent","_internalPadding","_defaultColor","_defaultFontSize","_translateEmpty","updateFontSize","#updateFontSize","setFontsize","editorDiv","setEditorDimensions","savedFontsize","col","savedColor","overlayDiv","contentEditable","editorDivKeydown","editorDivFocus","editorDivBlur","editorDivInput","editorDivPaste","innerText","extractText","#extractText","prevChild","childNodes","getNodeContent","#setEditorDimensions","savedDisplay","savedVisibility","savedText","newText","trimEnd","setText","setContent","#getNodeContent","nodeValue","deserializeContent","deleteFromDocument","insertNode","collapseToStart","startContainer","startOffset","bufferBefore","bufferAfter","newRange","Range","beforeLength","sumPrecise","setStart","setEnd","removeAllRanges","addRange","#setContent","serializeContent","#serializeContent","#deserializeContent","padding","hasElementChanged","#hasElementChanged","Outline","toSVGPath","_rotation","_rescale","_rescaleAndSwap","_translate","svgRound","createBezierPoints","FreeDrawOutliner","innerMargin","last","min_dist","scaleFactor","MIN_DIST","MIN_DIFF","MIN","getLastCoords","#getLastCoords","lastTop","lastBottom","diffX","diffY","diffD","nX","nY","thX","thY","toSVGPathTwoPoints","toSVGPathEnd","toSVGPathStart","#toSVGPathTwoPoints","lastTopX","lastTopY","lastBottomX","lastBottomY","#toSVGPathStart","#toSVGPathEnd","newFreeDrawOutline","outline","FreeDrawOutline","getOutlines","getOutlineTwoPoints","N","getOutlineEnd","getOutlineStart","#getOutlineTwoPoints","#getOutlineStart","#getOutlineEnd","lastPoint","computeMinMax","#computeMinMax","firstPointX","firstPointY","lastPointX","lastPointY","ltrCallback","bezierBbox","newOutliner","getNewOutline","outliner","HighlightOutliner","verticalEdges","intervals","NUMBER_OF_DIGITS","EPSILON","shiftedMinX","shiftedMinY","lastEdge","edge","outlineVerticalEdges","breakEdge","#getOutlines","edges","allEdges","edge1","edge2","outlines","HighlightOutline","binarySearch","#binarySearch","middle","#insert","#remove","#breakEdge","y4","polygon","prevX","prevY","FreeHighlightOutliner","FreeHighlightOutline","HighlightEditor","clipPathId","focusOutlines","highlightDiv","highlightOutlines","isFreeHighlight","outlineId","_defaultOpacity","_defaultThickness","_freeHighlightId","_freeHighlight","_freeHighlightClipId","_moveCaret","highlightId","createFreeOutlines","addToDrawLayer","createOutlines","numberOfColors","#createOutlines","outlinerForOutline","#createFreeOutlines","extraThickness","drawLayer","finalizeDraw","drawOutline","rootClass","highlightOutline","updateProperties","rotateBbox","updateThickness","setColorAndOpacity","opa","savedOpacity","#updateThickness","savedThickness","setThickness","th","changeThickness","getRotation","addUndoableEditor","cleanDrawLayer","mustBeSelected","#changeThickness","#cleanDrawLayer","#addToDrawLayer","#rotateBbox","pointerover","pointerleave","#keydown","setCaret","#setCaret","#getRotation","serializeBoxes","#serializeBoxes","serializeOutlines","#serializeOutlines","startHighlighting","endHighlight","highlightMove","#highlightMove","#endHighlight","DrawingOptions","svgProperties","updateProperty","updateSVGProperty","toSVGProperties","updateAll","DrawingEditor","drawOutlines","mustBeCommitted","_drawId","_currentDrawId","_currentParent","currentDraw","currentDrawingAC","currentDrawingOptions","_INNER_MARGIN","_addOutlines","onUpdatedOpacity","createDrawOutlines","#createDrawOutlines","drawId","drawingOptions","_drawingOptions","defaultProperties","createDrawing","updateBbox","#createDrawing","_mergeSVGProperties","defaultSVGProperties","p1Keys","getDefaultDrawingOptions","_options","typesMap","supportMultipleDrawings","propertyName","_defaultDrawingOptions","_updateProperty","savedValue","setter","_updateColorAndOpacity","opacityName","getPathResizingSVGProperties","convertToDrawSpace","rotateBox","getPathResizedSVGProperties","_x","_y","getPathTranslatedSVGProperties","moving","updateParent","convertToParentSpace","#convertToParentSpace","pW","pH","#convertToDrawSpace","#updateBbox","#rotateBox","updateRotation","updateParentDimensions","onScaleChangingWhenDrawing","drawDiv","createDrawerInstance","_parentWidth","_parentHeight","startDrawing","_isLTR","_endDraw","isCancellable","removeLastElement","_drawMove","startNew","_cleanup","lastElement","getLastElement","setLastElement","isAborted","createDrawingOptions","_data","deserializeDraw","_pageX","_pageY","_pageWidth","_pageHeight","_innerWidth","serializeDraw","InkDrawOutliner","lastSVGPath","lastIndex","InkDrawOutline","normalizePoint","#normalizePoint","firstX","firstY","secondX","secondY","c1x","c1y","c2x","c2y","currentRotation","computeBbox","serializedLines","serializedPoints","getBBoxWithNoMargin","rescaleFn","newLines","getMarginComponents","#getMarginComponents","margin","#getBBoxWithNoMargin","marginX","marginY","#computeBbox","oldMarginX","oldMarginY","newMarginX","newMarginY","diffMarginX","diffMarginY","rotationTransform","s1x","s1y","s2x","s2y","newParentWidth","newParentHeight","InkDrawingOptions","viewerParameters","_viewParameters","InkEditor","ContourDrawOutline","BASE_HEADER_LENGTH","POINTS_PROPERTIES_NUMBER","SignatureExtractor","PARAMETERS","sigmaSFactor","sigmaR","kernelSize","neighborIndexToId","#neighborIndexToId","i0","j0","neighborIdToIndex","clockwiseNonZero","#clockwiseNonZero","kk","shiftI","shiftJ","counterClockwiseNonZero","#counterClockwiseNonZero","findContours","#findContours","threshold","nbd","lnbd","contours","ij","pix","i2","j2","isHole","contour","contour0","i1","j1","i3","j3","i4","j4","ij3","douglasPeuckerHelper","#douglasPeuckerHelper","ax","ay","abx","aby","nabx","naby","aa","invS","phi","atan","cosPhi","sinPhi","tmax","poly","partialPhi","dmax","douglasPeucker","#douglasPeucker","bilateralFilter","#bilateralFilter","sigmaS","kernel","sigmaS2","halfSize","exp","rangeValues","sigmaR2","out","histogram","sum","norm","neighbour","getHistogram","#getHistogram","toUint8","#toUint8","guessThreshold","#guessThreshold","M","L","spos","getGrayPixels","#getGrayPixels","originalBitmap","prevWidth","prevHeight","log2","isteps","grayImage","uint8Buf","extractContoursFromText","fontStyle","SCALE","contourList","processDrawnLines","curves","mustSmooth","areContours","linesAndPoints","xScale","yScale","newCurves","reducedPoints","newPoints","compressSignature","minDiff","maxDiff","outlinesLength","dx","bufferType","Int8Array","Int16Array","headerLength","BYTES_PER_ELEMENT","cs","CompressionStream","writer","getWriter","write","BufferCtor","diffs","Response","readable","decompressSignature","signatureData","fromBase64","DecompressionStream","numberOfDrawings","diffsOffset","SignatureOptions","DrawnSignatureOptions","SignatureEditor","isExtracted","signatureUUID","_defaultDrawnSignatureOptions","hasDescription","hasDescriptionStats","hasNoAltText","uuid","heightInPage","addSignature","setUuid","getSignaturePreview","outlineData","hasBeenSaved","getFromImage","getFromText","fontInfo","getDrawnSignature","isSignature","alt","StampEditor","bitmapId","bitmapPromise","bitmapUrl","bitmapFile","bitmapFileName","missingCanvas","resizeTimeoutId","hasBeenAddedInUndoStack","pasteEditor","getAsFile","hasAltTextStats","getBitmapFetched","#getBitmapFetched","fromId","getBitmapDone","#getBitmapDone","alt_text_modal","alt_text_type","mlGuessAltText","updateAltTextData","isEnabledFor","copyCanvas","guess","channels","getBitmap","#getBitmap","accept","files","click","drawBitmap","#createCanvas","MAX_RATIO","maxDataDimension","maxPreviewDimension","bitmapWidth","bitmapHeight","outputScale","scaledWidth","scaledHeight","scaleBitmap","boxDim","boxDimWidth","boxDimHeight","patternCtx","dataWidth","dataHeight","offscreenCtx","#scaleBitmap","#drawBitmap","serializeBitmap","#serializeBitmap","toUrl","toDataURL","structParent","_structTree","changes","isSame","isSameAltText","stamps","area","prevData","isSamePageIndex","AnnotationEditorLayer","allowClick","clickAC","editorFocusTimeoutId","hadPointerDown","isDisabling","isEnabling","drawingAC","focusedElement","textSelectionAC","textLayerDblClickAC","lastPointerDownTimestamp","_initialized","isInvisible","disableTextSelection","toggleAnnotationLayerPointerEvents","enableTextSelection","allEditorsIterator","#allEditorsIterator","annotationElementIds","DBL_CLICK_THRESHOLD","elementsFromPoint","needFakeAnnotation","changedAnnotations","resetAnnotations","currentActive","textLayerPointerDown","#textLayerPointerDown","attach","detach","moveElementInDOM","currentEditorType","#currentEditorType","createNewEditor","#createNewEditor","getCenterPoint","#getCenterPoint","currentMode","startDrawingSession","#cleanup","oldRotation","compareTextLayers","compareDocumentPosition","DOCUMENT_POSITION_FOLLOWING","getTextLayer","ELEMENT_NODE","isPointBefore","nodeA","offsetA","nodeB","offsetB","relation","DOCUMENT_POSITION_PRECEDING","normalizeEdgeBoundary","lastNode","DrawLayer","textLayerObserver","toUpdate","selectionId","selectionChangeAC","selections","isSelecting","textLayerSet","textLayers","previousData","selectionDiv","MutationObserver","records","addedNodes","observe","childList","cleanupTextLayerSelection","#cleanupTextLayerSelection","textLayerData","#hasSelection","getOrderedTextLayers","#getOrderedTextLayers","rotators","orderedTextLayers","ranges","endContainer","endOffset","startTextLayer","endTextLayer","startMissing","endMissing","anchorLayer","focusLayer","anchorBeforeFocus","activeTextLayers","intersectsNode","boundarySubstituted","previousNode","normalizedEnd","normalizedStart","firstNode","subRange","createRange","setStartBefore","lastTextNode","setEndAfter","selectedTextLayers","clientRect","selectionStyle","_svgFactory","setBox","#setBox","createSVG","#createSVG","createClipPath","#createClipPath","pathId","clipPathUse","#updateProperties","isPathUpdatable","hasClip","use","mustRemoveSelfIntersections","maskId","use1","use2","cloneNode","elementOrId","pathElement","disconnect","percentage","TextLayerImages","coordinates","coordinatesByElement","getPageCanvas","minSize","activeImage","createImagePlaceholder","imgElement","deref","WeakRef","pageCanvas","imageX1","imageY1","imageX2","imageY2","#createImagePlaceholder","transformOrigin","_pdfjsTestingUtils","pdfjsLib"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/pdfjs/build/pdf.sandbox.mjs b/public/pdfjs/build/pdf.sandbox.mjs
new file mode 100644
index 0000000..92f9de5
--- /dev/null
+++ b/public/pdfjs/build/pdf.sandbox.mjs
@@ -0,0 +1,222 @@
+/**
+ * @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 = 6.1.200
+ * pdfjsBuild = 6353acefe
+ */
+
+;// ./src/pdf.sandbox.external.js
+class SandboxSupportBase {
+  constructor(win) {
+    this.win = win;
+    this.timeoutIds = new Map();
+    this.commFun = null;
+  }
+  destroy() {
+    this.commFun = null;
+    for (const id of this.timeoutIds.values()) {
+      this.win.clearTimeout(id);
+    }
+    this.timeoutIds = null;
+  }
+  exportValueToSandbox(val) {
+    throw new Error("Not implemented");
+  }
+  importValueFromSandbox(val) {
+    throw new Error("Not implemented");
+  }
+  createErrorForSandbox(errorMessage) {
+    throw new Error("Not implemented");
+  }
+  callSandboxFunction(name, args) {
+    if (!this.commFun) {
+      return;
+    }
+    try {
+      args = this.exportValueToSandbox(args);
+      this.commFun(name, args);
+    } catch (e) {
+      this.win.console.error(e);
+    }
+  }
+  createSandboxExternals() {
+    const externals = {
+      setTimeout: (callbackId, nMilliseconds) => {
+        if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") {
+          return;
+        }
+        if (callbackId === 0) {
+          this.win.clearTimeout(this.timeoutIds.get(callbackId));
+        }
+        const id = this.win.setTimeout(() => {
+          this.timeoutIds.delete(callbackId);
+          this.callSandboxFunction("timeoutCb", {
+            callbackId,
+            interval: false
+          });
+        }, nMilliseconds);
+        this.timeoutIds.set(callbackId, id);
+      },
+      clearTimeout: callbackId => {
+        this.win.clearTimeout(this.timeoutIds.get(callbackId));
+        this.timeoutIds.delete(callbackId);
+      },
+      setInterval: (callbackId, nMilliseconds) => {
+        if (typeof callbackId !== "number" || typeof nMilliseconds !== "number") {
+          return;
+        }
+        const id = this.win.setInterval(() => {
+          this.callSandboxFunction("timeoutCb", {
+            callbackId,
+            interval: true
+          });
+        }, nMilliseconds);
+        this.timeoutIds.set(callbackId, id);
+      },
+      clearInterval: callbackId => {
+        this.win.clearInterval(this.timeoutIds.get(callbackId));
+        this.timeoutIds.delete(callbackId);
+      },
+      alert: cMsg => {
+        if (typeof cMsg !== "string") {
+          return;
+        }
+        this.win.alert(cMsg);
+      },
+      confirm: cMsg => {
+        if (typeof cMsg !== "string") {
+          return false;
+        }
+        return this.win.confirm(cMsg);
+      },
+      prompt: (cQuestion, cDefault) => {
+        if (typeof cQuestion !== "string" || typeof cDefault !== "string") {
+          return null;
+        }
+        return this.win.prompt(cQuestion, cDefault);
+      },
+      parseURL: cUrl => {
+        const url = new this.win.URL(cUrl);
+        const props = ["hash", "host", "hostname", "href", "origin", "password", "pathname", "port", "protocol", "search", "searchParams", "username"];
+        return Object.fromEntries(props.map(name => [name, url[name].toString()]));
+      },
+      send: data => {
+        if (!data) {
+          return;
+        }
+        const event = new this.win.CustomEvent("updatefromsandbox", {
+          detail: this.importValueFromSandbox(data)
+        });
+        this.win.dispatchEvent(event);
+      }
+    };
+    Object.setPrototypeOf(externals, null);
+    return (name, args) => {
+      try {
+        const result = externals[name](...args);
+        return this.exportValueToSandbox(result);
+      } catch (error) {
+        throw this.createErrorForSandbox(error?.toString() ?? "");
+      }
+    };
+  }
+}
+;// ./src/pdf.sandbox.js
+
+class SandboxSupport extends SandboxSupportBase {
+  exportValueToSandbox(val) {
+    return JSON.stringify(val);
+  }
+  importValueFromSandbox(val) {
+    return val;
+  }
+  createErrorForSandbox(errorMessage) {
+    return new Error(errorMessage);
+  }
+}
+class Sandbox {
+  constructor(win, module) {
+    this.support = new SandboxSupport(win, this);
+    module.externalCall = this.support.createSandboxExternals();
+    this._module = module;
+    this._alertOnError = 0;
+  }
+  create(data) {
+    const code = ["\n;// ./src/scripting_api/constants.js\nconst Border = Object.freeze({\n  s: \"solid\",\n  d: \"dashed\",\n  b: \"beveled\",\n  i: \"inset\",\n  u: \"underline\"\n});\nconst Cursor = Object.freeze({\n  visible: 0,\n  hidden: 1,\n  delay: 2\n});\nconst Display = Object.freeze({\n  visible: 0,\n  hidden: 1,\n  noPrint: 2,\n  noView: 3\n});\nconst Font = Object.freeze({\n  Times: \"Times-Roman\",\n  TimesB: \"Times-Bold\",\n  TimesI: \"Times-Italic\",\n  TimesBI: \"Times-BoldItalic\",\n  Helv: \"Helvetica\",\n  HelvB: \"Helvetica-Bold\",\n  HelvI: \"Helvetica-Oblique\",\n  HelvBI: \"Helvetica-BoldOblique\",\n  Cour: \"Courier\",\n  CourB: \"Courier-Bold\",\n  CourI: \"Courier-Oblique\",\n  CourBI: \"Courier-BoldOblique\",\n  Symbol: \"Symbol\",\n  ZapfD: \"ZapfDingbats\",\n  KaGo: \"HeiseiKakuGo-W5-UniJIS-UCS2-H\",\n  KaMi: \"HeiseiMin-W3-UniJIS-UCS2-H\"\n});\nconst Highlight = Object.freeze({\n  n: \"none\",\n  i: \"invert\",\n  p: \"push\",\n  o: \"outline\"\n});\nconst Position = Object.freeze({\n  textOnly: 0,\n  iconOnly: 1,\n  iconTextV: 2,\n  textIconV: 3,\n  iconTextH: 4,\n  textIconH: 5,\n  overlay: 6\n});\nconst ScaleHow = Object.freeze({\n  proportional: 0,\n  anamorphic: 1\n});\nconst ScaleWhen = Object.freeze({\n  always: 0,\n  never: 1,\n  tooBig: 2,\n  tooSmall: 3\n});\nconst Style = Object.freeze({\n  ch: \"check\",\n  cr: \"cross\",\n  di: \"diamond\",\n  ci: \"circle\",\n  st: \"star\",\n  sq: \"square\"\n});\nconst Trans = Object.freeze({\n  blindsH: \"BlindsHorizontal\",\n  blindsV: \"BlindsVertical\",\n  boxI: \"BoxIn\",\n  boxO: \"BoxOut\",\n  dissolve: \"Dissolve\",\n  glitterD: \"GlitterDown\",\n  glitterR: \"GlitterRight\",\n  glitterRD: \"GlitterRightDown\",\n  random: \"Random\",\n  replace: \"Replace\",\n  splitHI: \"SplitHorizontalIn\",\n  splitHO: \"SplitHorizontalOut\",\n  splitVI: \"SplitVerticalIn\",\n  splitVO: \"SplitVerticalOut\",\n  wipeD: \"WipeDown\",\n  wipeL: \"WipeLeft\",\n  wipeR: \"WipeRight\",\n  wipeU: \"WipeUp\"\n});\nconst ZoomType = Object.freeze({\n  none: \"NoVary\",\n  fitP: \"FitPage\",\n  fitW: \"FitWidth\",\n  fitH: \"FitHeight\",\n  fitV: \"FitVisibleWidth\",\n  pref: \"Preferred\",\n  refW: \"ReflowWidth\"\n});\nconst GlobalConstants = Object.freeze({\n  IDS_GREATER_THAN: \"Invalid value: must be greater than or equal to % s.\",\n  IDS_GT_AND_LT: \"Invalid value: must be greater than or equal to % s \" + \"and less than or equal to % s.\",\n  IDS_LESS_THAN: \"Invalid value: must be less than or equal to % s.\",\n  IDS_INVALID_MONTH: \"** Invalid **\",\n  IDS_INVALID_DATE: \"Invalid date / time: please ensure that the date / time exists. Field\",\n  IDS_INVALID_DATE2: \" should match format \",\n  IDS_INVALID_VALUE: \"The value entered does not match the format of the field\",\n  IDS_AM: \"am\",\n  IDS_PM: \"pm\",\n  IDS_MONTH_INFO: \"January[1] February[2] March[3] April[4] May[5] \" + \"June[6] July[7] August[8] September[9] October[10] \" + \"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] \" + \"Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] Dec[12]\",\n  IDS_STARTUP_CONSOLE_MSG: \"** ^ _ ^ **\",\n  RE_NUMBER_ENTRY_DOT_SEP: [\"[+-]?\\\\d*\\\\.?\\\\d*\"],\n  RE_NUMBER_COMMIT_DOT_SEP: [\"[+-]?\\\\d+(\\\\.\\\\d+)?\", \"[+-]?\\\\.\\\\d+\", \"[+-]?\\\\d+\\\\.\"],\n  RE_NUMBER_ENTRY_COMMA_SEP: [\"[+-]?\\\\d*,?\\\\d*\"],\n  RE_NUMBER_COMMIT_COMMA_SEP: [\"[+-]?\\\\d+([.,]\\\\d+)?\", \"[+-]?[.,]\\\\d+\", \"[+-]?\\\\d+[.,]\"],\n  RE_ZIP_ENTRY: [\"\\\\d{0,5}\"],\n  RE_ZIP_COMMIT: [\"\\\\d{5}\"],\n  RE_ZIP4_ENTRY: [\"\\\\d{0,5}(\\\\.|[- ])?\\\\d{0,4}\"],\n  RE_ZIP4_COMMIT: [\"\\\\d{5}(\\\\.|[- ])?\\\\d{4}\"],\n  RE_PHONE_ENTRY: [\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\(\\\\d{0,3}\", \"\\\\(\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\(\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"011(\\\\.|[- \\\\d])*\"],\n  RE_PHONE_COMMIT: [\"\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"\\\\d{3}(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"\\\\(\\\\d{3}\\\\)(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"011(\\\\.|[- \\\\d])*\"],\n  RE_SSN_ENTRY: [\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,2}(\\\\.|[- ])?\\\\d{0,4}\"],\n  RE_SSN_COMMIT: [\"\\\\d{3}(\\\\.|[- ])?\\\\d{2}(\\\\.|[- ])?\\\\d{4}\"]\n});\n\n;// ./src/scripting_api/common.js\nconst FieldType = {\n  none: 0,\n  number: 1,\n  percent: 2,\n  date: 3,\n  time: 4\n};\nfunction createActionsMap(actions) {\n  return new Map(actions ? Object.entries(actions) : null);\n}\nfunction getFieldType(actions) {\n  let format = actions.get(\"Format\");\n  if (!format) {\n    return FieldType.none;\n  }\n  format = format[0];\n  format = format.trim();\n  if (format.startsWith(\"AFNumber_\")) {\n    return FieldType.number;\n  }\n  if (format.startsWith(\"AFPercent_\")) {\n    return FieldType.percent;\n  }\n  if (format.startsWith(\"AFDate_\")) {\n    return FieldType.date;\n  }\n  if (format.startsWith(\"AFTime_\")) {\n    return FieldType.time;\n  }\n  return FieldType.none;\n}\n\n;// ./src/shared/math_clamp.js\nfunction MathClamp(v, min, max) {\n  return Math.min(Math.max(v, min), max);\n}\n\n;// ./src/shared/scripting_utils.js\n\nfunction makeColorComp(n) {\n  return Math.floor(MathClamp(n, 0, 1) * 255).toString(16).padStart(2, \"0\");\n}\nfunction scaleAndClamp(x) {\n  return MathClamp(x, 0, 1) * 255;\n}\nclass ColorConverters {\n  static CMYK_G([c, y, m, k]) {\n    return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n  }\n  static G_CMYK([g]) {\n    return [\"CMYK\", 0, 0, 0, 1 - g];\n  }\n  static G_RGB([g]) {\n    return [\"RGB\", g, g, g];\n  }\n  static G_rgb([g]) {\n    g = scaleAndClamp(g);\n    return [g, g, g];\n  }\n  static G_HTML([g]) {\n    const G = makeColorComp(g);\n    return `#${G}${G}${G}`;\n  }\n  static RGB_G([r, g, b]) {\n    return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n  }\n  static RGB_rgb(color) {\n    return color.map(scaleAndClamp);\n  }\n  static RGB_HTML(color) {\n    return `#${color.map(makeColorComp).join(\"\")}`;\n  }\n  static T_HTML() {\n    return \"#00000000\";\n  }\n  static T_rgb() {\n    return [null];\n  }\n  static CMYK_RGB([c, y, m, k]) {\n    return [\"RGB\", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n  }\n  static CMYK_rgb([c, y, m, k]) {\n    return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];\n  }\n  static CMYK_HTML(components) {\n    const rgb = this.CMYK_RGB(components).slice(1);\n    return this.RGB_HTML(rgb);\n  }\n  static RGB_CMYK([r, g, b]) {\n    const c = 1 - r;\n    const m = 1 - g;\n    const y = 1 - b;\n    const k = Math.min(c, m, y);\n    return [\"CMYK\", c, m, y, k];\n  }\n}\nconst DateFormats = [\"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\"];\nconst TimeFormats = [\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"];\n\n;// ./src/scripting_api/pdf_object.js\nclass PDFObject {\n  constructor(data) {\n    this._expandos = Object.create(null);\n    this._send = data.send || null;\n    this._id = data.id || null;\n  }\n}\n\n;// ./src/scripting_api/color.js\n\n\nclass Color extends PDFObject {\n  transparent = [\"T\"];\n  black = [\"G\", 0];\n  white = [\"G\", 1];\n  red = [\"RGB\", 1, 0, 0];\n  green = [\"RGB\", 0, 1, 0];\n  blue = [\"RGB\", 0, 0, 1];\n  cyan = [\"CMYK\", 1, 0, 0, 0];\n  magenta = [\"CMYK\", 0, 1, 0, 0];\n  yellow = [\"CMYK\", 0, 0, 1, 0];\n  dkGray = [\"G\", 0.25];\n  gray = [\"G\", 0.5];\n  ltGray = [\"G\", 0.75];\n  constructor() {\n    super({});\n  }\n  static _isValidSpace(cColorSpace) {\n    return typeof cColorSpace === \"string\" && (cColorSpace === \"T\" || cColorSpace === \"G\" || cColorSpace === \"RGB\" || cColorSpace === \"CMYK\");\n  }\n  static _isValidColor(colorArray) {\n    if (!Array.isArray(colorArray) || colorArray.length === 0) {\n      return false;\n    }\n    const space = colorArray[0];\n    if (!Color._isValidSpace(space)) {\n      return false;\n    }\n    switch (space) {\n      case \"T\":\n        if (colorArray.length !== 1) {\n          return false;\n        }\n        break;\n      case \"G\":\n        if (colorArray.length !== 2) {\n          return false;\n        }\n        break;\n      case \"RGB\":\n        if (colorArray.length !== 4) {\n          return false;\n        }\n        break;\n      case \"CMYK\":\n        if (colorArray.length !== 5) {\n          return false;\n        }\n        break;\n      default:\n        return false;\n    }\n    return colorArray.slice(1).every(c => typeof c === \"number\" && c >= 0 && c <= 1);\n  }\n  static _getCorrectColor(colorArray) {\n    return Color._isValidColor(colorArray) ? colorArray : [\"G\", 0];\n  }\n  convert(colorArray, cColorSpace) {\n    if (!Color._isValidSpace(cColorSpace)) {\n      return this.black;\n    }\n    if (cColorSpace === \"T\") {\n      return [\"T\"];\n    }\n    colorArray = Color._getCorrectColor(colorArray);\n    if (colorArray[0] === cColorSpace) {\n      return colorArray;\n    }\n    if (colorArray[0] === \"T\") {\n      return this.convert(this.black, cColorSpace);\n    }\n    return ColorConverters[`${colorArray[0]}_${cColorSpace}`](colorArray.slice(1));\n  }\n  equal(colorArray1, colorArray2) {\n    colorArray1 = Color._getCorrectColor(colorArray1);\n    colorArray2 = Color._getCorrectColor(colorArray2);\n    if (colorArray1[0] === \"T\" || colorArray2[0] === \"T\") {\n      return colorArray1[0] === \"T\" && colorArray2[0] === \"T\";\n    }\n    if (colorArray1[0] !== colorArray2[0]) {\n      colorArray2 = this.convert(colorArray2, colorArray1[0]);\n    }\n    return colorArray1.slice(1).every((c, i) => c === colorArray2[i + 1]);\n  }\n}\n\n;// ./src/scripting_api/app_utils.js\nconst VIEWER_TYPE = \"PDF.js\";\nconst VIEWER_VARIATION = \"Full\";\nconst VIEWER_VERSION = 21.00720099;\nconst FORMS_VERSION = 21.00720099;\nconst USERACTIVATION_CALLBACKID = 0;\nconst USERACTIVATION_MAXTIME_VALIDITY = 5000;\nfunction serializeError(error) {\n  const value = `${error.toString()}\\n${error.stack}`;\n  return {\n    command: \"error\",\n    value\n  };\n}\nconst makeArr = () => [];\nconst makeMap = () => new Map();\n\n;// ./src/scripting_api/field.js\n\n\n\n\nclass Field extends PDFObject {\n  constructor(data) {\n    super(data);\n    this.alignment = data.alignment || \"left\";\n    this.borderStyle = data.borderStyle || \"\";\n    this.buttonAlignX = data.buttonAlignX || 50;\n    this.buttonAlignY = data.buttonAlignY || 50;\n    this.buttonFitBounds = data.buttonFitBounds;\n    this.buttonPosition = data.buttonPosition;\n    this.buttonScaleHow = data.buttonScaleHow;\n    this.ButtonScaleWhen = data.buttonScaleWhen;\n    this.calcOrderIndex = data.calcOrderIndex;\n    this.comb = data.comb;\n    this.commitOnSelChange = data.commitOnSelChange;\n    this.currentValueIndices = data.currentValueIndices;\n    this.defaultStyle = data.defaultStyle;\n    this.defaultValue = data.defaultValue;\n    this.doNotScroll = data.doNotScroll;\n    this.doNotSpellCheck = data.doNotSpellCheck;\n    this.delay = data.delay;\n    this.display = data.display;\n    this.doc = data.doc.wrapped;\n    this.editable = data.editable;\n    this.exportValues = data.exportValues;\n    this.fileSelect = data.fileSelect;\n    this.hidden = data.hidden;\n    this.highlight = data.highlight;\n    this.lineWidth = data.lineWidth;\n    this.multiline = data.multiline;\n    this.multipleSelection = !!data.multipleSelection;\n    this.name = data.name;\n    this.password = data.password;\n    this.print = data.print;\n    this.radiosInUnison = data.radiosInUnison;\n    this.readonly = data.readonly;\n    this.rect = data.rect;\n    this.required = data.required;\n    this.richText = data.richText;\n    this.richValue = data.richValue;\n    this.style = data.style;\n    this.submitName = data.submitName;\n    this.textFont = data.textFont;\n    this.textSize = data.textSize;\n    this.type = data.type;\n    this.userName = data.userName;\n    this._actions = createActionsMap(data.actions);\n    this._browseForFileToSubmit = data.browseForFileToSubmit || null;\n    this._buttonCaption = null;\n    this._buttonIcon = null;\n    this._charLimit = data.charLimit;\n    this._children = null;\n    this._currentValueIndices = data.currentValueIndices || 0;\n    this._document = data.doc;\n    this._fieldPath = data.fieldPath;\n    this._fillColor = data.fillColor || [\"T\"];\n    this._isChoice = Array.isArray(data.items);\n    this._items = data.items || [];\n    this._hasValue = Object.hasOwn(data, \"value\");\n    this._page = data.page || 0;\n    this._strokeColor = data.strokeColor || [\"G\", 0];\n    this._textColor = data.textColor || [\"G\", 0];\n    this._value = null;\n    this._kidIds = data.kidIds || null;\n    this._fieldType = getFieldType(this._actions);\n    this._siblings = data.siblings || null;\n    this._rotation = data.rotation || 0;\n    this._datetimeFormat = data.datetimeFormat || null;\n    this._hasDateOrTime = !!data.hasDatetimeHTML;\n    this._util = data.util;\n    this._globalEval = data.globalEval;\n    this._appObjects = data.appObjects;\n    this.value = data.value || \"\";\n  }\n  get currentValueIndices() {\n    if (!this._isChoice) {\n      return 0;\n    }\n    return this._currentValueIndices;\n  }\n  set currentValueIndices(indices) {\n    if (!this._isChoice) {\n      return;\n    }\n    if (!Array.isArray(indices)) {\n      indices = [indices];\n    }\n    if (!indices.every(i => typeof i === \"number\" && Number.isInteger(i) && i >= 0 && i < this.numItems)) {\n      return;\n    }\n    indices.sort();\n    if (this.multipleSelection) {\n      this._currentValueIndices = indices;\n      this._value = [];\n      indices.forEach(i => {\n        this._value.push(this._items[i].displayValue);\n      });\n    } else if (indices.length > 0) {\n      indices = indices.splice(1, indices.length - 1);\n      this._currentValueIndices = indices[0];\n      this._value = this._items[this._currentValueIndices];\n    }\n    this._send({\n      id: this._id,\n      indices\n    });\n  }\n  get fillColor() {\n    return this._fillColor;\n  }\n  set fillColor(color) {\n    if (Color._isValidColor(color)) {\n      this._fillColor = color;\n    }\n  }\n  get bgColor() {\n    return this.fillColor;\n  }\n  set bgColor(color) {\n    this.fillColor = color;\n  }\n  get charLimit() {\n    return this._charLimit;\n  }\n  set charLimit(limit) {\n    if (typeof limit !== \"number\") {\n      throw new Error(\"Invalid argument value\");\n    }\n    this._charLimit = Math.max(0, Math.floor(limit));\n  }\n  get numItems() {\n    if (!this._isChoice) {\n      throw new Error(\"Not a choice widget\");\n    }\n    return this._items.length;\n  }\n  set numItems(_) {\n    throw new Error(\"field.numItems is read-only\");\n  }\n  get strokeColor() {\n    return this._strokeColor;\n  }\n  set strokeColor(color) {\n    if (Color._isValidColor(color)) {\n      this._strokeColor = color;\n    }\n  }\n  get borderColor() {\n    return this.strokeColor;\n  }\n  set borderColor(color) {\n    this.strokeColor = color;\n  }\n  get page() {\n    return this._page;\n  }\n  set page(_) {\n    throw new Error(\"field.page is read-only\");\n  }\n  get rotation() {\n    return this._rotation;\n  }\n  set rotation(angle) {\n    angle = Math.floor(angle);\n    if (angle % 90 !== 0) {\n      throw new Error(\"Invalid rotation: must be a multiple of 90\");\n    }\n    angle %= 360;\n    if (angle < 0) {\n      angle += 360;\n    }\n    this._rotation = angle;\n  }\n  get textColor() {\n    return this._textColor;\n  }\n  set textColor(color) {\n    if (Color._isValidColor(color)) {\n      this._textColor = color;\n    }\n  }\n  get fgColor() {\n    return this.textColor;\n  }\n  set fgColor(color) {\n    this.textColor = color;\n  }\n  get value() {\n    return this._value;\n  }\n  set value(value) {\n    if (this._isChoice) {\n      this._setChoiceValue(value);\n      return;\n    }\n    if (this._hasDateOrTime && value) {\n      const date = this._util.scand(this._datetimeFormat, value);\n      if (date) {\n        this._originalValue = date.valueOf();\n        value = this._util.printd(this._datetimeFormat, date);\n        this._value = !isNaN(value) ? parseFloat(value) : value;\n        return;\n      }\n    }\n    if (value === \"\" || typeof value !== \"string\" || this._fieldType >= FieldType.date) {\n      this._originalValue = undefined;\n      this._value = value;\n      return;\n    }\n    this._originalValue = value;\n    const _value = value.trim().replace(\",\", \".\");\n    this._value = !isNaN(_value) ? parseFloat(_value) : value;\n  }\n  get _initialValue() {\n    return this._hasDateOrTime && this._originalValue || null;\n  }\n  _getValue() {\n    return this._originalValue ?? this.value;\n  }\n  _setChoiceValue(value) {\n    if (this.multipleSelection) {\n      if (!Array.isArray(value)) {\n        value = [value];\n      }\n      const values = new Set(value);\n      if (Array.isArray(this._currentValueIndices)) {\n        this._currentValueIndices.length = 0;\n        this._value.length = 0;\n      } else {\n        this._currentValueIndices = [];\n        this._value = [];\n      }\n      this._items.forEach((item, i) => {\n        if (values.has(item.exportValue)) {\n          this._currentValueIndices.push(i);\n          this._value.push(item.exportValue);\n        }\n      });\n    } else {\n      if (Array.isArray(value)) {\n        value = value[0];\n      }\n      const index = this._items.findIndex(({\n        exportValue\n      }) => value === exportValue);\n      if (index !== -1) {\n        this._currentValueIndices = index;\n        this._value = this._items[index].exportValue;\n      }\n    }\n  }\n  get valueAsString() {\n    return (this._value ?? \"\").toString();\n  }\n  set valueAsString(_) {}\n  browseForFileToSubmit() {\n    if (this._browseForFileToSubmit) {\n      this._browseForFileToSubmit();\n    }\n  }\n  buttonGetCaption(nFace = 0) {\n    if (this._buttonCaption) {\n      return this._buttonCaption[nFace];\n    }\n    return \"\";\n  }\n  buttonGetIcon(nFace = 0) {\n    if (this._buttonIcon) {\n      return this._buttonIcon[nFace];\n    }\n    return null;\n  }\n  buttonImportIcon(cPath = null, nPave = 0) {}\n  buttonSetCaption(cCaption, nFace = 0) {\n    if (!this._buttonCaption) {\n      this._buttonCaption = [\"\", \"\", \"\"];\n    }\n    this._buttonCaption[nFace] = cCaption;\n  }\n  buttonSetIcon(oIcon, nFace = 0) {\n    if (!this._buttonIcon) {\n      this._buttonIcon = [null, null, null];\n    }\n    this._buttonIcon[nFace] = oIcon;\n  }\n  checkThisBox(nWidget, bCheckIt = true) {}\n  clearItems() {\n    if (!this._isChoice) {\n      throw new Error(\"Not a choice widget\");\n    }\n    this._items = [];\n    this._send({\n      id: this._id,\n      clear: null\n    });\n  }\n  deleteItemAt(nIdx = null) {\n    if (!this._isChoice) {\n      throw new Error(\"Not a choice widget\");\n    }\n    if (!this.numItems) {\n      return;\n    }\n    if (nIdx === null) {\n      nIdx = Array.isArray(this._currentValueIndices) ? this._currentValueIndices[0] : this._currentValueIndices;\n      nIdx ||= 0;\n    }\n    if (nIdx < 0 || nIdx >= this.numItems) {\n      nIdx = this.numItems - 1;\n    }\n    this._items.splice(nIdx, 1);\n    if (Array.isArray(this._currentValueIndices)) {\n      let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n      if (index !== -1) {\n        if (this._currentValueIndices[index] === nIdx) {\n          this._currentValueIndices.splice(index, 1);\n        }\n        for (const ii = this._currentValueIndices.length; index < ii; index++) {\n          --this._currentValueIndices[index];\n        }\n      }\n    } else if (this._currentValueIndices === nIdx) {\n      this._currentValueIndices = this.numItems > 0 ? 0 : -1;\n    } else if (this._currentValueIndices > nIdx) {\n      --this._currentValueIndices;\n    }\n    this._send({\n      id: this._id,\n      remove: nIdx\n    });\n  }\n  getItemAt(nIdx = -1, bExportValue = false) {\n    if (!this._isChoice) {\n      throw new Error(\"Not a choice widget\");\n    }\n    if (nIdx < 0 || nIdx >= this.numItems) {\n      nIdx = this.numItems - 1;\n    }\n    const item = this._items[nIdx];\n    return bExportValue ? item.exportValue : item.displayValue;\n  }\n  getArray() {\n    if (this._kidIds) {\n      const array = [];\n      const fillArrayWithKids = kidIds => {\n        for (const id of kidIds) {\n          const obj = this._appObjects[id];\n          if (!obj) {\n            continue;\n          }\n          if (obj.obj._hasValue) {\n            array.push(obj.wrapped);\n          }\n          if (obj.obj._kidIds) {\n            fillArrayWithKids(obj.obj._kidIds);\n          }\n        }\n      };\n      fillArrayWithKids(this._kidIds);\n      return array;\n    }\n    return this._children ??= this._document.obj._getTerminalChildren(this._fieldPath);\n  }\n  getLock() {\n    return undefined;\n  }\n  isBoxChecked(nWidget) {\n    return false;\n  }\n  isDefaultChecked(nWidget) {\n    return false;\n  }\n  insertItemAt(cName, cExport = undefined, nIdx = 0) {\n    if (!this._isChoice) {\n      throw new Error(\"Not a choice widget\");\n    }\n    if (!cName) {\n      return;\n    }\n    if (nIdx < 0 || nIdx > this.numItems) {\n      nIdx = this.numItems;\n    }\n    if (this._items.some(({\n      displayValue\n    }) => displayValue === cName)) {\n      return;\n    }\n    if (cExport === undefined) {\n      cExport = cName;\n    }\n    const data = {\n      displayValue: cName,\n      exportValue: cExport\n    };\n    this._items.splice(nIdx, 0, data);\n    if (Array.isArray(this._currentValueIndices)) {\n      let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n      if (index !== -1) {\n        for (const ii = this._currentValueIndices.length; index < ii; index++) {\n          ++this._currentValueIndices[index];\n        }\n      }\n    } else if (this._currentValueIndices >= nIdx) {\n      ++this._currentValueIndices;\n    }\n    this._send({\n      id: this._id,\n      insert: {\n        index: nIdx,\n        ...data\n      }\n    });\n  }\n  setAction(cTrigger, cScript) {\n    if (typeof cTrigger !== \"string\" || typeof cScript !== \"string\") {\n      return;\n    }\n    if (!(cTrigger in this._actions)) {\n      this._actions[cTrigger] = [];\n    }\n    this._actions[cTrigger].push(cScript);\n  }\n  setFocus() {\n    this._send({\n      id: this._id,\n      focus: true\n    });\n  }\n  setItems(oArray) {\n    if (!this._isChoice) {\n      throw new Error(\"Not a choice widget\");\n    }\n    this._items.length = 0;\n    for (const element of oArray) {\n      let displayValue, exportValue;\n      if (Array.isArray(element)) {\n        displayValue = element[0]?.toString() || \"\";\n        exportValue = element[1]?.toString() || \"\";\n      } else {\n        displayValue = exportValue = element?.toString() || \"\";\n      }\n      this._items.push({\n        displayValue,\n        exportValue\n      });\n    }\n    this._currentValueIndices = 0;\n    this._send({\n      id: this._id,\n      items: this._items\n    });\n  }\n  setLock() {}\n  signatureGetModifications() {}\n  signatureGetSeedValue() {}\n  signatureInfo() {}\n  signatureSetSeedValue() {}\n  signatureSign() {}\n  signatureValidate() {}\n  _isButton() {\n    return false;\n  }\n  _reset() {\n    this.value = this.defaultValue;\n  }\n  _runActions(event) {\n    const eventName = event.name;\n    if (!this._actions.has(eventName)) {\n      return false;\n    }\n    const actions = this._actions.get(eventName);\n    for (const action of actions) {\n      try {\n        this._globalEval(action);\n      } catch (error) {\n        const serializedError = serializeError(error);\n        serializedError.value = `Error when executing \"${eventName}\" for field \"${this._id}\"\\n${serializedError.value}`;\n        this._send(serializedError);\n      }\n    }\n    return true;\n  }\n}\nclass RadioButtonField extends Field {\n  constructor(otherButtons, data) {\n    super(data);\n    this.exportValues = [this.exportValues];\n    this._radioIds = [this._id];\n    this._radioActions = [this._actions];\n    for (const radioData of otherButtons) {\n      this.exportValues.push(radioData.exportValues);\n      this._radioIds.push(radioData.id);\n      this._radioActions.push(createActionsMap(radioData.actions));\n      if (this._value === radioData.exportValues) {\n        this._id = radioData.id;\n      }\n    }\n    this._hasBeenInitialized = true;\n    this._value = data.value || \"\";\n  }\n  get _siblings() {\n    return this._radioIds.filter(id => id !== this._id);\n  }\n  set _siblings(_) {}\n  get value() {\n    return this._value;\n  }\n  set value(value) {\n    if (!this._hasBeenInitialized) {\n      return;\n    }\n    if (value === null || value === undefined) {\n      this._value = \"\";\n    }\n    const i = this.exportValues.indexOf(value);\n    if (0 <= i && i < this._radioIds.length) {\n      this._id = this._radioIds[i];\n      this._value = value;\n    } else if (value === \"Off\" && this._radioIds.length === 2) {\n      const nextI = (1 + this._radioIds.indexOf(this._id)) % 2;\n      this._id = this._radioIds[nextI];\n      this._value = this.exportValues[nextI];\n    }\n  }\n  checkThisBox(nWidget, bCheckIt = true) {\n    if (nWidget < 0 || nWidget >= this._radioIds.length || !bCheckIt) {\n      return;\n    }\n    this._id = this._radioIds[nWidget];\n    this._value = this.exportValues[nWidget];\n    this._send({\n      id: this._id,\n      value: this._value\n    });\n  }\n  isBoxChecked(nWidget) {\n    return nWidget >= 0 && nWidget < this._radioIds.length && this._id === this._radioIds[nWidget];\n  }\n  isDefaultChecked(nWidget) {\n    return nWidget >= 0 && nWidget < this.exportValues.length && this.defaultValue === this.exportValues[nWidget];\n  }\n  _getExportValue(state) {\n    const i = this._radioIds.indexOf(this._id);\n    return this.exportValues[i];\n  }\n  _runActions(event) {\n    const i = this._radioIds.indexOf(this._id);\n    this._actions = this._radioActions[i];\n    return super._runActions(event);\n  }\n  _isButton() {\n    return true;\n  }\n}\nclass CheckboxField extends RadioButtonField {\n  get value() {\n    return this._value;\n  }\n  set value(value) {\n    if (!value || value === \"Off\") {\n      this._value = \"Off\";\n    } else {\n      super.value = value;\n    }\n  }\n  _getExportValue(state) {\n    return state ? super._getExportValue(state) : \"Off\";\n  }\n  isBoxChecked(nWidget) {\n    if (this._value === \"Off\") {\n      return false;\n    }\n    return super.isBoxChecked(nWidget);\n  }\n  isDefaultChecked(nWidget) {\n    if (this.defaultValue === \"Off\") {\n      return this._value === \"Off\";\n    }\n    return super.isDefaultChecked(nWidget);\n  }\n  checkThisBox(nWidget, bCheckIt = true) {\n    if (nWidget < 0 || nWidget >= this._radioIds.length) {\n      return;\n    }\n    this._id = this._radioIds[nWidget];\n    this._value = bCheckIt ? this.exportValues[nWidget] : \"Off\";\n    this._send({\n      id: this._id,\n      value: this._value\n    });\n  }\n}\n\n;// ./src/scripting_api/aform.js\n\n\n\nclass AForm {\n  constructor(document, app, util, color) {\n    this._document = document;\n    this._app = app;\n    this._util = util;\n    this._color = color;\n    this._emailRegex = new RegExp(\"^[\\\\w.!#$%&'*+/=?^`{|}~-]+\" + \"@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\" + \"(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\");\n  }\n  _mkTargetName(event) {\n    return event.target ? `[ ${event.target.name} ]` : \"\";\n  }\n  _parseDate(cFormat, cDate) {\n    let date = null;\n    try {\n      date = this._util._scand(cFormat, cDate, false);\n    } catch {}\n    if (date) {\n      return date;\n    }\n    date = Date.parse(cDate);\n    return isNaN(date) ? null : new Date(date);\n  }\n  AFMergeChange(event = globalThis.event) {\n    if (event.willCommit) {\n      return event.value.toString();\n    }\n    return this._app._eventDispatcher.mergeChange(event);\n  }\n  AFParseDateEx(cString, cOrder) {\n    return this._parseDate(cOrder, cString);\n  }\n  AFExtractNums(str) {\n    if (typeof str === \"number\") {\n      return [str];\n    }\n    if (!str || typeof str !== \"string\") {\n      return null;\n    }\n    const first = str.charAt(0);\n    if (first === \".\" || first === \",\") {\n      str = `0${str}`;\n    }\n    const numbers = str.match(/(\\d+)/g);\n    if (numbers.length === 0) {\n      return null;\n    }\n    return numbers;\n  }\n  AFMakeNumber(str) {\n    if (typeof str === \"number\") {\n      return str;\n    }\n    if (typeof str !== \"string\") {\n      return null;\n    }\n    str = str.trim().replace(\",\", \".\");\n    const number = parseFloat(str);\n    if (isNaN(number) || !isFinite(number)) {\n      return null;\n    }\n    return number;\n  }\n  AFMakeArrayFromList(string) {\n    if (typeof string === \"string\") {\n      return string.split(/, ?/g);\n    }\n    return string;\n  }\n  AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n    const event = globalThis.event;\n    let value = this.AFMakeNumber(event.value);\n    if (value === null) {\n      event.value = \"\";\n      return;\n    }\n    const sign = Math.sign(value);\n    const buf = [];\n    let hasParen = false;\n    if (sign === -1 && bCurrencyPrepend && negStyle === 0) {\n      buf.push(\"-\");\n    }\n    if ((negStyle === 2 || negStyle === 3) && sign === -1) {\n      buf.push(\"(\");\n      hasParen = true;\n    }\n    if (bCurrencyPrepend) {\n      buf.push(strCurrency);\n    }\n    sepStyle = MathClamp(Math.floor(sepStyle), 0, 4);\n    buf.push(\"%,\", sepStyle, \".\", nDec.toString(), \"f\");\n    if (!bCurrencyPrepend) {\n      buf.push(strCurrency);\n    }\n    if (hasParen) {\n      buf.push(\")\");\n    }\n    if (negStyle === 1 || negStyle === 3) {\n      event.target.textColor = sign === 1 ? this._color.black : this._color.red;\n    }\n    if ((negStyle !== 0 || bCurrencyPrepend) && sign === -1) {\n      value = -value;\n    }\n    const formatStr = buf.join(\"\");\n    event.value = this._util.printf(formatStr, value);\n  }\n  AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n    const event = globalThis.event;\n    let value = this.AFMergeChange(event);\n    if (!value) {\n      return;\n    }\n    value = value.trim();\n    let pattern;\n    if (sepStyle > 1) {\n      pattern = event.willCommit ? /^[+-]?(\\d+(,\\d*)?|,\\d+)$/ : /^[+-]?\\d*(?:,\\d*)?$/;\n    } else {\n      pattern = event.willCommit ? /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/ : /^[+-]?\\d*(?:\\.\\d*)?$/;\n    }\n    if (!pattern.test(value)) {\n      if (event.willCommit) {\n        const err = `${GlobalConstants.IDS_INVALID_VALUE} ${this._mkTargetName(event)}`;\n        this._app.alert(err);\n      }\n      event.rc = false;\n    }\n    if (event.willCommit && sepStyle > 1) {\n      event.value = parseFloat(value.replace(\",\", \".\"));\n    }\n  }\n  AFPercent_Format(nDec, sepStyle, percentPrepend = false) {\n    if (typeof nDec !== \"number\") {\n      return;\n    }\n    if (typeof sepStyle !== \"number\") {\n      return;\n    }\n    if (nDec < 0) {\n      throw new Error(\"Invalid nDec value in AFPercent_Format\");\n    }\n    const event = globalThis.event;\n    if (nDec > 512) {\n      event.value = \"%\";\n      return;\n    }\n    nDec = Math.floor(nDec);\n    sepStyle = MathClamp(Math.floor(sepStyle), 0, 4);\n    let value = this.AFMakeNumber(event.value);\n    if (value === null) {\n      event.value = \"%\";\n      return;\n    }\n    const formatStr = `%,${sepStyle}.${nDec}f`;\n    value = this._util.printf(formatStr, value * 100);\n    event.value = percentPrepend ? `%${value}` : `${value}%`;\n  }\n  AFPercent_Keystroke(nDec, sepStyle) {\n    this.AFNumber_Keystroke(nDec, sepStyle, 0, 0, \"\", true);\n  }\n  AFDate_FormatEx(cFormat) {\n    const event = globalThis.event;\n    const value = event.value;\n    if (!value) {\n      return;\n    }\n    const date = this._parseDate(cFormat, value);\n    if (date !== null) {\n      event.value = this._util.printd(cFormat, date);\n    }\n  }\n  AFDate_Format(pdf) {\n    this.AFDate_FormatEx(DateFormats[pdf] ?? pdf);\n  }\n  AFDate_KeystrokeEx(cFormat) {\n    const event = globalThis.event;\n    if (!event.willCommit) {\n      return;\n    }\n    const value = this.AFMergeChange(event);\n    if (!value) {\n      return;\n    }\n    if (this._parseDate(cFormat, value) === null) {\n      const invalid = GlobalConstants.IDS_INVALID_DATE;\n      const invalid2 = GlobalConstants.IDS_INVALID_DATE2;\n      const err = `${invalid} ${this._mkTargetName(event)}${invalid2}${cFormat}`;\n      this._app.alert(err);\n      event.rc = false;\n    }\n  }\n  AFDate_Keystroke(pdf) {\n    if (pdf >= 0 && pdf < DateFormats.length) {\n      this.AFDate_KeystrokeEx(DateFormats[pdf]);\n    }\n  }\n  AFRange_Validate(bGreaterThan, nGreaterThan, bLessThan, nLessThan) {\n    const event = globalThis.event;\n    if (!event.value) {\n      return;\n    }\n    const value = this.AFMakeNumber(event.value);\n    if (value === null) {\n      return;\n    }\n    bGreaterThan = !!bGreaterThan;\n    bLessThan = !!bLessThan;\n    if (bGreaterThan) {\n      nGreaterThan = this.AFMakeNumber(nGreaterThan);\n      if (nGreaterThan === null) {\n        return;\n      }\n    }\n    if (bLessThan) {\n      nLessThan = this.AFMakeNumber(nLessThan);\n      if (nLessThan === null) {\n        return;\n      }\n    }\n    let err = \"\";\n    if (bGreaterThan && bLessThan) {\n      if (value < nGreaterThan || value > nLessThan) {\n        err = this._util.printf(GlobalConstants.IDS_GT_AND_LT, nGreaterThan, nLessThan);\n      }\n    } else if (bGreaterThan) {\n      if (value < nGreaterThan) {\n        err = this._util.printf(GlobalConstants.IDS_GREATER_THAN, nGreaterThan);\n      }\n    } else if (value > nLessThan) {\n      err = this._util.printf(GlobalConstants.IDS_LESS_THAN, nLessThan);\n    }\n    if (err) {\n      this._app.alert(err);\n      event.rc = false;\n    }\n  }\n  AFSimple(cFunction, nValue1, nValue2) {\n    const value1 = this.AFMakeNumber(nValue1);\n    if (value1 === null) {\n      throw new Error(\"Invalid nValue1 in AFSimple\");\n    }\n    const value2 = this.AFMakeNumber(nValue2);\n    if (value2 === null) {\n      throw new Error(\"Invalid nValue2 in AFSimple\");\n    }\n    switch (cFunction) {\n      case \"AVG\":\n        return (value1 + value2) / 2;\n      case \"SUM\":\n        return value1 + value2;\n      case \"PRD\":\n        return value1 * value2;\n      case \"MIN\":\n        return Math.min(value1, value2);\n      case \"MAX\":\n        return Math.max(value1, value2);\n    }\n    throw new Error(\"Invalid cFunction in AFSimple\");\n  }\n  AFSimple_Calculate(cFunction, cFields) {\n    const actions = {\n      AVG: args => Math.sumPrecise(args) / args.length,\n      SUM: args => Math.sumPrecise(args),\n      PRD: args => args.reduce((acc, value) => acc * value, 1),\n      MIN: args => Math.min(...args),\n      MAX: args => Math.max(...args)\n    };\n    if (!(cFunction in actions)) {\n      throw new TypeError(\"Invalid function in AFSimple_Calculate\");\n    }\n    const event = globalThis.event;\n    const values = [];\n    cFields = this.AFMakeArrayFromList(cFields);\n    for (const cField of cFields) {\n      const field = this._document.getField(cField);\n      if (!field) {\n        continue;\n      }\n      for (const child of field.getArray()) {\n        const number = this.AFMakeNumber(child.value);\n        values.push(number ?? 0);\n      }\n    }\n    if (values.length === 0) {\n      event.value = 0;\n      return;\n    }\n    const res = actions[cFunction](values);\n    event.value = Math.round(1e6 * res) / 1e6;\n  }\n  AFSpecial_Format(psf) {\n    const event = globalThis.event;\n    if (!event.value) {\n      return;\n    }\n    psf = this.AFMakeNumber(psf);\n    let formatStr;\n    switch (psf) {\n      case 0:\n        formatStr = \"99999\";\n        break;\n      case 1:\n        formatStr = \"99999-9999\";\n        break;\n      case 2:\n        formatStr = this._util.printx(\"9999999999\", event.value).length >= 10 ? \"(999) 999-9999\" : \"999-9999\";\n        break;\n      case 3:\n        formatStr = \"999-99-9999\";\n        break;\n      default:\n        throw new Error(\"Invalid psf in AFSpecial_Format\");\n    }\n    event.value = this._util.printx(formatStr, event.value);\n  }\n  AFSpecial_KeystrokeEx(cMask) {\n    const event = globalThis.event;\n    const simplifiedFormatStr = cMask.replaceAll(/[^9AOX]/g, \"\");\n    this.#AFSpecial_KeystrokeEx_helper(simplifiedFormatStr, null, false);\n    if (event.rc) {\n      return;\n    }\n    event.rc = true;\n    this.#AFSpecial_KeystrokeEx_helper(cMask, null, true);\n  }\n  #AFSpecial_KeystrokeEx_helper(cMask, value, warn) {\n    if (!cMask) {\n      return;\n    }\n    const event = globalThis.event;\n    value ||= this.AFMergeChange(event);\n    if (!value) {\n      return;\n    }\n    const checkers = new Map([[\"9\", char => char >= \"0\" && char <= \"9\"], [\"A\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\"], [\"O\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\"], [\"X\", char => true]]);\n    function _checkValidity(_value, _cMask) {\n      for (let i = 0, ii = _value.length; i < ii; i++) {\n        const mask = _cMask.charAt(i);\n        const char = _value.charAt(i);\n        const checker = checkers.get(mask);\n        if (checker) {\n          if (!checker(char)) {\n            return false;\n          }\n        } else if (mask !== char) {\n          return false;\n        }\n      }\n      return true;\n    }\n    const err = `${GlobalConstants.IDS_INVALID_VALUE} = \"${cMask}\"`;\n    if (value.length > cMask.length) {\n      if (warn) {\n        this._app.alert(err);\n      }\n      event.rc = false;\n      return;\n    }\n    if (event.willCommit) {\n      if (value.length < cMask.length) {\n        if (warn) {\n          this._app.alert(err);\n        }\n        event.rc = false;\n        return;\n      }\n      if (!_checkValidity(value, cMask)) {\n        if (warn) {\n          this._app.alert(err);\n        }\n        event.rc = false;\n        return;\n      }\n      event.value += cMask.substring(value.length);\n      return;\n    }\n    if (value.length < cMask.length) {\n      cMask = cMask.substring(0, value.length);\n    }\n    if (!_checkValidity(value, cMask)) {\n      if (warn) {\n        this._app.alert(err);\n      }\n      event.rc = false;\n    }\n  }\n  AFSpecial_Keystroke(psf) {\n    const event = globalThis.event;\n    psf = this.AFMakeNumber(psf);\n    let value = this.AFMergeChange(event);\n    let formatStr, secondFormatStr;\n    switch (psf) {\n      case 0:\n        formatStr = \"99999\";\n        break;\n      case 1:\n        formatStr = \"99999-9999\";\n        break;\n      case 2:\n        formatStr = \"999-9999\";\n        secondFormatStr = \"(999) 999-9999\";\n        break;\n      case 3:\n        formatStr = \"999-99-9999\";\n        break;\n      default:\n        throw new Error(\"Invalid psf in AFSpecial_Keystroke\");\n    }\n    const formats = secondFormatStr ? [formatStr, secondFormatStr] : [formatStr];\n    for (const format of formats) {\n      this.#AFSpecial_KeystrokeEx_helper(format, value, false);\n      if (event.rc) {\n        return;\n      }\n      event.rc = true;\n    }\n    const re = /[-()\\s]+/g;\n    value = value.replaceAll(re, \"\");\n    for (const format of formats) {\n      this.#AFSpecial_KeystrokeEx_helper(format.replaceAll(re, \"\"), value, false);\n      if (event.rc) {\n        return;\n      }\n      event.rc = true;\n    }\n    this.AFSpecial_KeystrokeEx((secondFormatStr && value.match(/\\d/g) || []).length > 7 ? secondFormatStr : formatStr);\n  }\n  AFTime_FormatEx(cFormat) {\n    this.AFDate_FormatEx(cFormat);\n  }\n  AFTime_Format(pdf) {\n    this.AFDate_FormatEx(TimeFormats[pdf] ?? pdf);\n  }\n  AFTime_KeystrokeEx(cFormat) {\n    this.AFDate_KeystrokeEx(cFormat);\n  }\n  AFTime_Keystroke(pdf) {\n    if (pdf >= 0 && pdf < TimeFormats.length) {\n      this.AFDate_KeystrokeEx(TimeFormats[pdf]);\n    }\n  }\n  eMailValidate(str) {\n    return this._emailRegex.test(str);\n  }\n  AFExactMatch(rePatterns, str) {\n    if (rePatterns instanceof RegExp) {\n      return str.match(rePatterns)?.[0] === str || 0;\n    }\n    return rePatterns.findIndex(re => str.match(re)?.[0] === str) + 1;\n  }\n}\n\n;// ./src/scripting_api/event.js\n\nclass Event {\n  constructor(data) {\n    this.change = data.change || \"\";\n    this.changeEx = data.changeEx || null;\n    this.commitKey = data.commitKey || 0;\n    this.fieldFull = data.fieldFull || false;\n    this.keyDown = data.keyDown || false;\n    this.modifier = data.modifier || false;\n    this.name = data.name;\n    this.rc = true;\n    this.richChange = data.richChange || [];\n    this.richChangeEx = data.richChangeEx || [];\n    this.richValue = data.richValue || [];\n    this.selEnd = data.selEnd ?? -1;\n    this.selStart = data.selStart ?? -1;\n    this.shift = data.shift || false;\n    this.source = data.source || null;\n    this.target = data.target || null;\n    this.targetName = \"\";\n    this.type = \"Field\";\n    this.value = data.value || \"\";\n    this.willCommit = data.willCommit || false;\n  }\n}\nclass EventDispatcher {\n  constructor(document, calculationOrder, objects, externalCall) {\n    this._document = document;\n    this._calculationOrder = calculationOrder;\n    this._objects = objects;\n    this._externalCall = externalCall;\n    this._document.obj._eventDispatcher = this;\n    this._isCalculating = false;\n  }\n  mergeChange(event) {\n    let value = event.value;\n    if (Array.isArray(value)) {\n      return value;\n    }\n    if (typeof value !== \"string\") {\n      value = value.toString();\n    }\n    const prefix = event.selStart >= 0 ? value.substring(0, event.selStart) : \"\";\n    const postfix = event.selEnd >= 0 && event.selEnd <= value.length ? value.substring(event.selEnd) : \"\";\n    return `${prefix}${event.change}${postfix}`;\n  }\n  userActivation() {\n    this._document.obj._userActivation = true;\n    this._externalCall(\"setTimeout\", [USERACTIVATION_CALLBACKID, USERACTIVATION_MAXTIME_VALIDITY]);\n  }\n  dispatch(baseEvent) {\n    const id = baseEvent.id;\n    if (!(id in this._objects)) {\n      let event;\n      if (id === \"doc\" || id === \"page\") {\n        event = globalThis.event = new Event(baseEvent);\n        event.source = event.target = this._document.wrapped;\n        event.name = baseEvent.name;\n      }\n      if (id === \"doc\") {\n        const eventName = event.name;\n        if (eventName === \"Open\") {\n          this.userActivation();\n          this._document.obj._initActions();\n          this.formatAll();\n        }\n        if (![\"DidPrint\", \"DidSave\", \"WillPrint\", \"WillSave\"].includes(eventName)) {\n          this.userActivation();\n        }\n        this._document.obj._dispatchDocEvent(event.name);\n      } else if (id === \"page\") {\n        this.userActivation();\n        this._document.obj._dispatchPageEvent(event.name, baseEvent.actions, baseEvent.pageNumber);\n      } else if (id === \"app\" && baseEvent.name === \"ResetForm\") {\n        this.userActivation();\n        for (const fieldId of baseEvent.ids) {\n          const obj = this._objects[fieldId];\n          obj?.obj._reset();\n        }\n      }\n      return;\n    }\n    const name = baseEvent.name;\n    const source = this._objects[id];\n    const event = globalThis.event = new Event(baseEvent);\n    let savedChange;\n    this.userActivation();\n    if (source.obj._isButton()) {\n      source.obj._id = id;\n      event.value = source.obj._getExportValue(event.value);\n      if (name === \"Action\") {\n        source.obj._value = event.value;\n      }\n    }\n    switch (name) {\n      case \"Keystroke\":\n        savedChange = {\n          value: event.value,\n          changeEx: event.changeEx,\n          change: event.change,\n          selStart: event.selStart,\n          selEnd: event.selEnd\n        };\n        break;\n      case \"Blur\":\n      case \"Focus\":\n        Object.defineProperty(event, \"value\", {\n          configurable: false,\n          writable: false,\n          enumerable: true,\n          value: event.value\n        });\n        break;\n      case \"Validate\":\n        this.runValidation(source, event);\n        return;\n      case \"Action\":\n        this.runActions(source, source, event, name);\n        this.runCalculate(source, event);\n        return;\n    }\n    this.runActions(source, source, event, name);\n    if (name !== \"Keystroke\") {\n      return;\n    }\n    if (event.rc) {\n      if (event.willCommit) {\n        this.runValidation(source, event);\n      } else {\n        if (source.obj._isChoice) {\n          source.obj.value = savedChange.changeEx;\n          source.obj._send({\n            id: source.obj._id,\n            siblings: source.obj._siblings,\n            value: source.obj.value\n          });\n          return;\n        }\n        const value = source.obj.value = this.mergeChange(event);\n        let selStart, selEnd;\n        if (event.selStart !== savedChange.selStart || event.selEnd !== savedChange.selEnd) {\n          selStart = event.selStart;\n          selEnd = event.selEnd;\n        } else {\n          selEnd = selStart = savedChange.selStart + event.change.length;\n        }\n        source.obj._send({\n          id: source.obj._id,\n          siblings: source.obj._siblings,\n          value,\n          selRange: [selStart, selEnd]\n        });\n      }\n    } else if (!event.willCommit) {\n      source.obj._send({\n        id: source.obj._id,\n        siblings: source.obj._siblings,\n        value: savedChange.value,\n        selRange: [savedChange.selStart, savedChange.selEnd]\n      });\n    } else {\n      source.obj._send({\n        id: source.obj._id,\n        siblings: source.obj._siblings,\n        value: \"\",\n        formattedValue: null,\n        selRange: [0, 0]\n      });\n    }\n  }\n  formatAll() {\n    const event = globalThis.event = new Event({});\n    for (const source of Object.values(this._objects)) {\n      event.value = source.obj._getValue();\n      this.runActions(source, source, event, \"Format\");\n    }\n  }\n  runValidation(source, event) {\n    const didValidateRun = this.runActions(source, source, event, \"Validate\");\n    if (event.rc) {\n      source.obj.value = event.value;\n      this.runCalculate(source, event);\n      const savedValue = event.value = source.obj._getValue();\n      const formattedValue = this.runActions(source, source, event, \"Format\") ? event.value?.toString?.() : null;\n      source.obj._send({\n        id: source.obj._id,\n        siblings: source.obj._siblings,\n        value: savedValue,\n        formattedValue\n      });\n      event.value = savedValue;\n    } else if (didValidateRun) {\n      source.obj._send({\n        id: source.obj._id,\n        siblings: source.obj._siblings,\n        value: \"\",\n        formattedValue: null,\n        selRange: [0, 0],\n        focus: true\n      });\n    }\n  }\n  runActions(source, target, event, eventName) {\n    event.source = source.wrapped;\n    event.target = target.wrapped;\n    event.name = eventName;\n    event.targetName = target.obj.name;\n    event.rc = true;\n    return target.obj._runActions(event);\n  }\n  calculateNow() {\n    if (!this._calculationOrder || this._isCalculating || !this._document.obj.calculate) {\n      return;\n    }\n    this._isCalculating = true;\n    const first = this._calculationOrder[0];\n    const source = this._objects[first];\n    globalThis.event = new Event({});\n    this.runCalculate(source, globalThis.event);\n    this._isCalculating = false;\n  }\n  runCalculate(source, event) {\n    if (!this._calculationOrder || !this._document.obj.calculate) {\n      return;\n    }\n    for (const targetId of this._calculationOrder) {\n      if (!(targetId in this._objects)) {\n        continue;\n      }\n      if (!this._document.obj.calculate) {\n        break;\n      }\n      event.value = null;\n      const target = this._objects[targetId];\n      let savedValue = target.obj._getValue();\n      this.runActions(source, target, event, \"Calculate\");\n      if (!event.rc) {\n        continue;\n      }\n      if (event.value !== null) {\n        target.obj.value = event.value;\n      } else {\n        event.value = target.obj._getValue();\n      }\n      this.runActions(target, target, event, \"Validate\");\n      if (!event.rc) {\n        if (target.obj._getValue() !== savedValue) {\n          target.wrapped.value = savedValue;\n        }\n        continue;\n      }\n      if (event.value === null) {\n        event.value = target.obj._getValue();\n      }\n      savedValue = target.obj._getValue();\n      const formattedValue = this.runActions(target, target, event, \"Format\") ? event.value?.toString?.() : null;\n      target.obj._send({\n        id: target.obj._id,\n        siblings: target.obj._siblings,\n        value: savedValue,\n        formattedValue\n      });\n    }\n  }\n}\n\n;// ./src/scripting_api/fullscreen.js\n\n\nclass FullScreen extends PDFObject {\n  _backgroundColor = [];\n  _clickAdvances = true;\n  _cursor = Cursor.hidden;\n  _defaultTransition = \"\";\n  _escapeExits = true;\n  _isFullScreen = true;\n  _loop = false;\n  _timeDelay = 3600;\n  _usePageTiming = false;\n  _useTimer = false;\n  get backgroundColor() {\n    return this._backgroundColor;\n  }\n  set backgroundColor(_) {}\n  get clickAdvances() {\n    return this._clickAdvances;\n  }\n  set clickAdvances(_) {}\n  get cursor() {\n    return this._cursor;\n  }\n  set cursor(_) {}\n  get defaultTransition() {\n    return this._defaultTransition;\n  }\n  set defaultTransition(_) {}\n  get escapeExits() {\n    return this._escapeExits;\n  }\n  set escapeExits(_) {}\n  get isFullScreen() {\n    return this._isFullScreen;\n  }\n  set isFullScreen(_) {}\n  get loop() {\n    return this._loop;\n  }\n  set loop(_) {}\n  get timeDelay() {\n    return this._timeDelay;\n  }\n  set timeDelay(_) {}\n  get transitions() {\n    return [\"Replace\", \"WipeRight\", \"WipeLeft\", \"WipeDown\", \"WipeUp\", \"SplitHorizontalIn\", \"SplitHorizontalOut\", \"SplitVerticalIn\", \"SplitVerticalOut\", \"BlindsHorizontal\", \"BlindsVertical\", \"BoxIn\", \"BoxOut\", \"GlitterRight\", \"GlitterDown\", \"GlitterRightDown\", \"Dissolve\", \"Random\"];\n  }\n  set transitions(_) {\n    throw new Error(\"fullscreen.transitions is read-only\");\n  }\n  get usePageTiming() {\n    return this._usePageTiming;\n  }\n  set usePageTiming(_) {}\n  get useTimer() {\n    return this._useTimer;\n  }\n  set useTimer(_) {}\n}\n\n;// ./src/scripting_api/thermometer.js\n\nclass Thermometer extends PDFObject {\n  _cancelled = false;\n  _duration = 100;\n  _text = \"\";\n  _value = 0;\n  get cancelled() {\n    return this._cancelled;\n  }\n  set cancelled(_) {\n    throw new Error(\"thermometer.cancelled is read-only\");\n  }\n  get duration() {\n    return this._duration;\n  }\n  set duration(val) {\n    this._duration = val;\n  }\n  get text() {\n    return this._text;\n  }\n  set text(val) {\n    this._text = val;\n  }\n  get value() {\n    return this._value;\n  }\n  set value(val) {\n    this._value = val;\n  }\n  begin() {}\n  end() {}\n}\n\n;// ./src/scripting_api/app.js\n\n\n\n\n\n\nclass App extends PDFObject {\n  constructor(data) {\n    super(data);\n    this._constants = null;\n    this._focusRect = true;\n    this._fs = null;\n    this._language = App._getLanguage(data.language);\n    this._openInPlace = false;\n    this._platform = App._getPlatform(data.platform);\n    this._runtimeHighlight = false;\n    this._runtimeHighlightColor = [\"T\"];\n    this._thermometer = null;\n    this._toolbar = false;\n    this._document = data._document;\n    this._proxyHandler = data.proxyHandler;\n    this._objects = Object.create(null);\n    this._eventDispatcher = new EventDispatcher(this._document, data.calculationOrder, this._objects, data.externalCall);\n    this._timeoutIds = new WeakMap();\n    this._timeoutIdsRegistry = new FinalizationRegistry(this._cleanTimeout.bind(this));\n    this._timeoutCallbackIds = new Map();\n    this._timeoutCallbackId = USERACTIVATION_CALLBACKID + 1;\n    this._globalEval = data.globalEval;\n    this._externalCall = data.externalCall;\n  }\n  _dispatchEvent(pdfEvent) {\n    this._eventDispatcher.dispatch(pdfEvent);\n  }\n  _registerTimeoutCallback(cExpr) {\n    const id = this._timeoutCallbackId++;\n    this._timeoutCallbackIds.set(id, cExpr);\n    return id;\n  }\n  _unregisterTimeoutCallback(id) {\n    this._timeoutCallbackIds.delete(id);\n  }\n  _evalCallback({\n    callbackId,\n    interval\n  }) {\n    const documentObj = this._document.obj;\n    if (callbackId === USERACTIVATION_CALLBACKID) {\n      documentObj._userActivation = false;\n      return;\n    }\n    const expr = this._timeoutCallbackIds.get(callbackId);\n    if (!interval) {\n      this._unregisterTimeoutCallback(callbackId);\n    }\n    if (expr) {\n      const saveUserActivation = documentObj._userActivation;\n      documentObj._userActivation = false;\n      this._globalEval(expr);\n      documentObj._userActivation = saveUserActivation;\n    }\n  }\n  _registerTimeout(callbackId, interval) {\n    const timeout = Object.create(null);\n    const id = {\n      callbackId,\n      interval\n    };\n    this._timeoutIds.set(timeout, id);\n    this._timeoutIdsRegistry.register(timeout, id);\n    return timeout;\n  }\n  _unregisterTimeout(timeout) {\n    this._timeoutIdsRegistry.unregister(timeout);\n    const data = this._timeoutIds.get(timeout);\n    if (!data) {\n      return;\n    }\n    this._timeoutIds.delete(timeout);\n    this._cleanTimeout(data);\n  }\n  _cleanTimeout({\n    callbackId,\n    interval\n  }) {\n    this._unregisterTimeoutCallback(callbackId);\n    if (interval) {\n      this._externalCall(\"clearInterval\", [callbackId]);\n    } else {\n      this._externalCall(\"clearTimeout\", [callbackId]);\n    }\n  }\n  static _getPlatform(platform) {\n    if (typeof platform === \"string\") {\n      platform = platform.toLowerCase();\n      if (platform.includes(\"win\")) {\n        return \"WIN\";\n      } else if (platform.includes(\"mac\")) {\n        return \"MAC\";\n      }\n    }\n    return \"UNIX\";\n  }\n  static _getLanguage(language) {\n    const [main, sub] = language.toLowerCase().split(/[-_]/, 2);\n    switch (main) {\n      case \"zh\":\n        return sub === \"cn\" || sub === \"sg\" ? \"CHS\" : \"CHT\";\n      case \"da\":\n        return \"DAN\";\n      case \"de\":\n        return \"DEU\";\n      case \"es\":\n        return \"ESP\";\n      case \"fr\":\n        return \"FRA\";\n      case \"it\":\n        return \"ITA\";\n      case \"ko\":\n        return \"KOR\";\n      case \"ja\":\n        return \"JPN\";\n      case \"nl\":\n        return \"NLD\";\n      case \"no\":\n        return \"NOR\";\n      case \"pt\":\n        return sub === \"br\" ? \"PTB\" : \"ENU\";\n      case \"fi\":\n        return \"SUO\";\n      case \"SV\":\n        return \"SVE\";\n      default:\n        return \"ENU\";\n    }\n  }\n  get activeDocs() {\n    return [this._document.wrapped];\n  }\n  set activeDocs(_) {\n    throw new Error(\"app.activeDocs is read-only\");\n  }\n  get calculate() {\n    return this._document.obj.calculate;\n  }\n  set calculate(calculate) {\n    this._document.obj.calculate = calculate;\n  }\n  get constants() {\n    return this._constants ??= Object.freeze({\n      align: Object.freeze({\n        left: 0,\n        center: 1,\n        right: 2,\n        top: 3,\n        bottom: 4\n      })\n    });\n  }\n  set constants(_) {\n    throw new Error(\"app.constants is read-only\");\n  }\n  get focusRect() {\n    return this._focusRect;\n  }\n  set focusRect(val) {\n    this._focusRect = val;\n  }\n  get formsVersion() {\n    return FORMS_VERSION;\n  }\n  set formsVersion(_) {\n    throw new Error(\"app.formsVersion is read-only\");\n  }\n  get fromPDFConverters() {\n    return [];\n  }\n  set fromPDFConverters(_) {\n    throw new Error(\"app.fromPDFConverters is read-only\");\n  }\n  get fs() {\n    return this._fs ??= new Proxy(new FullScreen({\n      send: this._send\n    }), this._proxyHandler);\n  }\n  set fs(_) {\n    throw new Error(\"app.fs is read-only\");\n  }\n  get language() {\n    return this._language;\n  }\n  set language(_) {\n    throw new Error(\"app.language is read-only\");\n  }\n  get media() {\n    return undefined;\n  }\n  set media(_) {\n    throw new Error(\"app.media is read-only\");\n  }\n  get monitors() {\n    return [];\n  }\n  set monitors(_) {\n    throw new Error(\"app.monitors is read-only\");\n  }\n  get numPlugins() {\n    return 0;\n  }\n  set numPlugins(_) {\n    throw new Error(\"app.numPlugins is read-only\");\n  }\n  get openInPlace() {\n    return this._openInPlace;\n  }\n  set openInPlace(val) {\n    this._openInPlace = val;\n  }\n  get platform() {\n    return this._platform;\n  }\n  set platform(_) {\n    throw new Error(\"app.platform is read-only\");\n  }\n  get plugins() {\n    return [];\n  }\n  set plugins(_) {\n    throw new Error(\"app.plugins is read-only\");\n  }\n  get printColorProfiles() {\n    return [];\n  }\n  set printColorProfiles(_) {\n    throw new Error(\"app.printColorProfiles is read-only\");\n  }\n  get printerNames() {\n    return [];\n  }\n  set printerNames(_) {\n    throw new Error(\"app.printerNames is read-only\");\n  }\n  get runtimeHighlight() {\n    return this._runtimeHighlight;\n  }\n  set runtimeHighlight(val) {\n    this._runtimeHighlight = val;\n  }\n  get runtimeHighlightColor() {\n    return this._runtimeHighlightColor;\n  }\n  set runtimeHighlightColor(val) {\n    if (Color._isValidColor(val)) {\n      this._runtimeHighlightColor = val;\n    }\n  }\n  get thermometer() {\n    return this._thermometer ??= new Proxy(new Thermometer({\n      send: this._send\n    }), this._proxyHandler);\n  }\n  set thermometer(_) {\n    throw new Error(\"app.thermometer is read-only\");\n  }\n  get toolbar() {\n    return this._toolbar;\n  }\n  set toolbar(val) {\n    this._toolbar = val;\n  }\n  get toolbarHorizontal() {\n    return this.toolbar;\n  }\n  set toolbarHorizontal(value) {\n    this.toolbar = value;\n  }\n  get toolbarVertical() {\n    return this.toolbar;\n  }\n  set toolbarVertical(value) {\n    this.toolbar = value;\n  }\n  get viewerType() {\n    return VIEWER_TYPE;\n  }\n  set viewerType(_) {\n    throw new Error(\"app.viewerType is read-only\");\n  }\n  get viewerVariation() {\n    return VIEWER_VARIATION;\n  }\n  set viewerVariation(_) {\n    throw new Error(\"app.viewerVariation is read-only\");\n  }\n  get viewerVersion() {\n    return VIEWER_VERSION;\n  }\n  set viewerVersion(_) {\n    throw new Error(\"app.viewerVersion is read-only\");\n  }\n  addMenuItem() {}\n  addSubMenu() {}\n  addToolButton() {}\n  alert(cMsg, nIcon = 0, nType = 0, cTitle = \"PDF.js\", oDoc = null, oCheckbox = null) {\n    if (!this._document.obj._userActivation) {\n      return 0;\n    }\n    this._document.obj._userActivation = false;\n    if (cMsg && typeof cMsg === \"object\") {\n      nType = cMsg.nType;\n      cMsg = cMsg.cMsg;\n    }\n    cMsg = (cMsg || \"\").toString();\n    if (!cMsg) {\n      return 0;\n    }\n    nType = typeof nType !== \"number\" || isNaN(nType) || nType < 0 || nType > 3 ? 0 : nType;\n    if (nType >= 2) {\n      return this._externalCall(\"confirm\", [cMsg]) ? 4 : 3;\n    }\n    this._externalCall(\"alert\", [cMsg]);\n    return 1;\n  }\n  beep() {}\n  beginPriv() {}\n  browseForDoc() {}\n  clearInterval(oInterval) {\n    this._unregisterTimeout(oInterval);\n  }\n  clearTimeOut(oTime) {\n    this._unregisterTimeout(oTime);\n  }\n  endPriv() {}\n  execDialog() {}\n  execMenuItem(item) {\n    if (!this._document.obj._userActivation) {\n      return;\n    }\n    this._document.obj._userActivation = false;\n    switch (item) {\n      case \"SaveAs\":\n        if (this._document.obj._disableSaving) {\n          return;\n        }\n        this._send({\n          command: item\n        });\n        break;\n      case \"FirstPage\":\n      case \"LastPage\":\n      case \"NextPage\":\n      case \"PrevPage\":\n      case \"ZoomViewIn\":\n      case \"ZoomViewOut\":\n        this._send({\n          command: item\n        });\n        break;\n      case \"FitPage\":\n        this._send({\n          command: \"zoom\",\n          value: \"page-fit\"\n        });\n        break;\n      case \"Print\":\n        if (this._document.obj._disablePrinting) {\n          return;\n        }\n        this._send({\n          command: \"print\"\n        });\n        break;\n    }\n  }\n  getNthPlugInName() {}\n  getPath() {}\n  goBack() {}\n  goForward() {}\n  hideMenuItem() {}\n  hideToolbarButton() {}\n  launchURL() {}\n  listMenuItems() {}\n  listToolbarButtons() {}\n  loadPolicyFile() {}\n  mailGetAddrs() {}\n  mailMsg() {}\n  newDoc() {}\n  newCollection() {}\n  newFDF() {}\n  openDoc() {}\n  openFDF() {}\n  popUpMenu() {}\n  popUpMenuEx() {}\n  removeToolButton() {}\n  response(cQuestion, cTitle = \"\", cDefault = \"\", bPassword = \"\", cLabel = \"\") {\n    if (!this._document.obj._userActivation) {\n      return null;\n    }\n    this._document.obj._userActivation = false;\n    if (cQuestion && typeof cQuestion === \"object\") {\n      cDefault = cQuestion.cDefault;\n      cQuestion = cQuestion.cQuestion;\n    }\n    cQuestion = (cQuestion || \"\").toString();\n    cDefault = (cDefault || \"\").toString();\n    return this._externalCall(\"prompt\", [cQuestion, cDefault || \"\"]);\n  }\n  setInterval(cExpr, nMilliseconds = 0) {\n    if (cExpr && typeof cExpr === \"object\") {\n      nMilliseconds = cExpr.nMilliseconds || 0;\n      cExpr = cExpr.cExpr;\n    }\n    if (typeof cExpr !== \"string\") {\n      throw new TypeError(\"First argument of app.setInterval must be a string\");\n    }\n    if (typeof nMilliseconds !== \"number\") {\n      throw new TypeError(\"Second argument of app.setInterval must be a number\");\n    }\n    const callbackId = this._registerTimeoutCallback(cExpr);\n    this._externalCall(\"setInterval\", [callbackId, nMilliseconds]);\n    return this._registerTimeout(callbackId, true);\n  }\n  setTimeOut(cExpr, nMilliseconds = 0) {\n    if (cExpr && typeof cExpr === \"object\") {\n      nMilliseconds = cExpr.nMilliseconds || 0;\n      cExpr = cExpr.cExpr;\n    }\n    if (typeof cExpr !== \"string\") {\n      throw new TypeError(\"First argument of app.setTimeOut must be a string\");\n    }\n    if (typeof nMilliseconds !== \"number\") {\n      throw new TypeError(\"Second argument of app.setTimeOut must be a number\");\n    }\n    const callbackId = this._registerTimeoutCallback(cExpr);\n    this._externalCall(\"setTimeout\", [callbackId, nMilliseconds]);\n    return this._registerTimeout(callbackId, false);\n  }\n  trustedFunction() {}\n  trustPropagatorFunction() {}\n}\n\n;// ./src/scripting_api/console.js\n\nclass Console extends PDFObject {\n  clear() {\n    this._send({\n      id: \"clear\"\n    });\n  }\n  hide() {}\n  println(msg) {\n    if (typeof msg !== \"string\") {\n      try {\n        msg = JSON.stringify(msg);\n      } catch {\n        msg = msg.toString?.() || \"[Unserializable object]\";\n      }\n    }\n    this._send({\n      command: \"println\",\n      value: \"PDF.js Console:: \" + msg\n    });\n  }\n  show() {}\n}\n\n;// ./src/scripting_api/print_params.js\nclass PrintParams {\n  binaryOk = true;\n  bitmapDPI = 150;\n  booklet = {\n    binding: 0,\n    duplexMode: 0,\n    subsetFrom: 0,\n    subsetTo: -1\n  };\n  colorOverride = 0;\n  colorProfile = \"\";\n  constants = Object.freeze({\n    bookletBindings: Object.freeze({\n      Left: 0,\n      Right: 1,\n      LeftTall: 2,\n      RightTall: 3\n    }),\n    bookletDuplexMode: Object.freeze({\n      BothSides: 0,\n      FrontSideOnly: 1,\n      BasicSideOnly: 2\n    }),\n    colorOverrides: Object.freeze({\n      auto: 0,\n      gray: 1,\n      mono: 2\n    }),\n    fontPolicies: Object.freeze({\n      everyPage: 0,\n      jobStart: 1,\n      pageRange: 2\n    }),\n    handling: Object.freeze({\n      none: 0,\n      fit: 1,\n      shrink: 2,\n      tileAll: 3,\n      tileLarge: 4,\n      nUp: 5,\n      booklet: 6\n    }),\n    interactionLevel: Object.freeze({\n      automatic: 0,\n      full: 1,\n      silent: 2\n    }),\n    nUpPageOrders: Object.freeze({\n      Horizontal: 0,\n      HorizontalReversed: 1,\n      Vertical: 2\n    }),\n    printContents: Object.freeze({\n      doc: 0,\n      docAndComments: 1,\n      formFieldsOnly: 2\n    }),\n    flagValues: Object.freeze({\n      applyOverPrint: 1,\n      applySoftProofSettings: 1 << 1,\n      applyWorkingColorSpaces: 1 << 2,\n      emitHalftones: 1 << 3,\n      emitPostScriptXObjects: 1 << 4,\n      emitFormsAsPSForms: 1 << 5,\n      maxJP2KRes: 1 << 6,\n      setPageSize: 1 << 7,\n      suppressBG: 1 << 8,\n      suppressCenter: 1 << 9,\n      suppressCJKFontSubst: 1 << 10,\n      suppressCropClip: 1 << 11,\n      suppressRotate: 1 << 12,\n      suppressTransfer: 1 << 13,\n      suppressUCR: 1 << 14,\n      useTrapAnnots: 1 << 15,\n      usePrintersMarks: 1 << 16\n    }),\n    rasterFlagValues: Object.freeze({\n      textToOutline: 1,\n      strokesToOutline: 1 << 1,\n      allowComplexClip: 1 << 2,\n      preserveOverprint: 1 << 3\n    }),\n    subsets: Object.freeze({\n      all: 0,\n      even: 1,\n      odd: 2\n    }),\n    tileMarks: Object.freeze({\n      none: 0,\n      west: 1,\n      east: 2\n    }),\n    usages: Object.freeze({\n      auto: 0,\n      use: 1,\n      noUse: 2\n    })\n  });\n  downloadFarEastFonts = false;\n  fileName = \"\";\n  firstPage = 0;\n  flags = 0;\n  fontPolicy = 0;\n  gradientDPI = 150;\n  interactive = 1;\n  npUpAutoRotate = false;\n  npUpNumPagesH = 2;\n  npUpNumPagesV = 2;\n  npUpPageBorder = false;\n  npUpPageOrder = 0;\n  pageHandling = 0;\n  pageSubset = 0;\n  printAsImage = false;\n  printContent = 0;\n  printerName = \"\";\n  psLevel = 0;\n  rasterFlags = 0;\n  reversePages = false;\n  tileLabel = false;\n  tileMark = 0;\n  tileOverlap = 0;\n  tileScale = 1.0;\n  transparencyLevel = 75;\n  usePrinterCRD = 0;\n  useT1Conversion = 0;\n  constructor(data) {\n    this.lastPage = data.lastPage;\n  }\n}\n\n;// ./src/scripting_api/doc.js\n\n\n\n\n\nconst DOC_EXTERNAL = false;\nclass InfoProxyHandler {\n  static get(obj, prop) {\n    return obj[prop.toLowerCase()];\n  }\n  static set(obj, prop, value) {\n    throw new Error(`doc.info.${prop} is read-only`);\n  }\n}\nclass Doc extends PDFObject {\n  #pageActions = null;\n  #otherPageActions = null;\n  constructor(data) {\n    super(data);\n    this._expandos = globalThis;\n    this._baseURL = data.baseURL || \"\";\n    this._calculate = true;\n    this._delay = false;\n    this._dirty = false;\n    this._disclosed = false;\n    this._media = undefined;\n    this._metadata = data.metadata || \"\";\n    this._noautocomplete = undefined;\n    this._nocache = undefined;\n    this._spellDictionaryOrder = [];\n    this._spellLanguageOrder = [];\n    this._printParams = null;\n    this._fields = new Map();\n    this._fieldNames = [];\n    this._event = null;\n    this._author = data.Author || \"\";\n    this._creator = data.Creator || \"\";\n    this._creationDate = this._getDate(data.CreationDate) || null;\n    this._docID = data.docID || [\"\", \"\"];\n    this._documentFileName = data.filename || \"\";\n    this._filesize = data.filesize || 0;\n    this._keywords = data.Keywords || \"\";\n    this._layout = data.layout || \"\";\n    this._modDate = this._getDate(data.ModDate) || null;\n    this._numFields = 0;\n    this._numPages = data.numPages || 1;\n    this._pageNum = data.pageNum || 0;\n    this._producer = data.Producer || \"\";\n    this._securityHandler = data.EncryptFilterName || null;\n    this._subject = data.Subject || \"\";\n    this._title = data.Title || \"\";\n    this._URL = data.URL || \"\";\n    this._info = new Proxy({\n      title: this._title,\n      author: this._author,\n      authors: data.authors || [this._author],\n      subject: this._subject,\n      keywords: this._keywords,\n      creator: this._creator,\n      producer: this._producer,\n      creationdate: this._creationDate,\n      moddate: this._modDate,\n      trapped: data.Trapped || \"Unknown\"\n    }, InfoProxyHandler);\n    this._zoomType = ZoomType.none;\n    this._zoom = data.zoom || 100;\n    this._actions = createActionsMap(data.actions);\n    this._globalEval = data.globalEval;\n    this._userActivation = false;\n    this._disablePrinting = false;\n    this._disableSaving = false;\n  }\n  _initActions() {\n    for (const {\n      obj\n    } of this._fields.values()) {\n      const initialValue = obj._initialValue;\n      if (initialValue) {\n        this._send({\n          id: obj._id,\n          siblings: obj._siblings,\n          value: initialValue,\n          formattedValue: obj.value.toString()\n        });\n      }\n    }\n    const dontRun = new Set([\"WillClose\", \"WillSave\", \"DidSave\", \"WillPrint\", \"DidPrint\", \"OpenAction\"]);\n    this._disableSaving = true;\n    for (const actionName of this._actions.keys()) {\n      if (!dontRun.has(actionName)) {\n        this._runActions(actionName);\n      }\n    }\n    this._runActions(\"OpenAction\");\n    this._disableSaving = false;\n  }\n  _dispatchDocEvent(name) {\n    switch (name) {\n      case \"Open\":\n        this._disableSaving = true;\n        this._runActions(\"OpenAction\");\n        this._disableSaving = false;\n        break;\n      case \"WillPrint\":\n        this._disablePrinting = true;\n        try {\n          this._runActions(name);\n        } catch (error) {\n          this._send(serializeError(error));\n        }\n        this._send({\n          command: \"WillPrintFinished\"\n        });\n        this._disablePrinting = false;\n        break;\n      case \"WillSave\":\n        this._disableSaving = true;\n        this._runActions(name);\n        this._disableSaving = false;\n        break;\n      default:\n        this._runActions(name);\n    }\n  }\n  _dispatchPageEvent(name, actions, pageNumber) {\n    if (name === \"PageOpen\") {\n      this.#pageActions ??= new Map();\n      if (!this.#pageActions.has(pageNumber)) {\n        this.#pageActions.set(pageNumber, createActionsMap(actions));\n      }\n      this._pageNum = pageNumber - 1;\n    }\n    for (const acts of [this.#pageActions, this.#otherPageActions]) {\n      actions = acts?.get(pageNumber)?.get(name);\n      if (actions) {\n        for (const action of actions) {\n          this._globalEval(action);\n        }\n      }\n    }\n  }\n  _runActions(name) {\n    const actions = this._actions.get(name);\n    if (!actions) {\n      return;\n    }\n    for (const action of actions) {\n      try {\n        this._globalEval(action);\n      } catch (error) {\n        const serializedError = serializeError(error);\n        serializedError.value = `Error when executing \"${name}\" for document\\n${serializedError.value}`;\n        this._send(serializedError);\n      }\n    }\n  }\n  _addField(name, field) {\n    this._fields.set(name, field);\n    this._fieldNames.push(name);\n    this._numFields++;\n    const po = field.obj._actions.get(\"PageOpen\");\n    const pc = field.obj._actions.get(\"PageClose\");\n    if (po || pc) {\n      this.#otherPageActions ??= new Map();\n      const actions = this.#otherPageActions.getOrInsertComputed(field.obj._page + 1, makeMap);\n      if (po) {\n        actions.getOrInsertComputed(\"PageOpen\", makeArr).push(...po);\n      }\n      if (pc) {\n        actions.getOrInsertComputed(\"PageClose\", makeArr).push(...pc);\n      }\n    }\n  }\n  _getDate(date) {\n    if (!date || date.length < 15 || !date.startsWith(\"D:\")) {\n      return date;\n    }\n    date = date.substring(2);\n    const year = date.substring(0, 4);\n    const month = date.substring(4, 6);\n    const day = date.substring(6, 8);\n    const hour = date.substring(8, 10);\n    const minute = date.substring(10, 12);\n    const o = date.charAt(12);\n    let second, offsetPos;\n    if (o === \"Z\" || o === \"+\" || o === \"-\") {\n      second = \"00\";\n      offsetPos = 12;\n    } else {\n      second = date.substring(12, 14);\n      offsetPos = 14;\n    }\n    const offset = date.substring(offsetPos).replaceAll(\"'\", \"\");\n    return new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`);\n  }\n  get author() {\n    return this._author;\n  }\n  set author(_) {\n    throw new Error(\"doc.author is read-only\");\n  }\n  get baseURL() {\n    return this._baseURL;\n  }\n  set baseURL(baseURL) {\n    this._baseURL = baseURL;\n  }\n  get bookmarkRoot() {\n    return undefined;\n  }\n  set bookmarkRoot(_) {\n    throw new Error(\"doc.bookmarkRoot is read-only\");\n  }\n  get calculate() {\n    return this._calculate;\n  }\n  set calculate(calculate) {\n    this._calculate = calculate;\n  }\n  get creator() {\n    return this._creator;\n  }\n  set creator(_) {\n    throw new Error(\"doc.creator is read-only\");\n  }\n  get dataObjects() {\n    return [];\n  }\n  set dataObjects(_) {\n    throw new Error(\"doc.dataObjects is read-only\");\n  }\n  get delay() {\n    return this._delay;\n  }\n  set delay(delay) {\n    this._delay = delay;\n  }\n  get dirty() {\n    return this._dirty;\n  }\n  set dirty(dirty) {\n    this._dirty = dirty;\n  }\n  get disclosed() {\n    return this._disclosed;\n  }\n  set disclosed(disclosed) {\n    this._disclosed = disclosed;\n  }\n  get docID() {\n    return this._docID;\n  }\n  set docID(_) {\n    throw new Error(\"doc.docID is read-only\");\n  }\n  get documentFileName() {\n    return this._documentFileName;\n  }\n  set documentFileName(_) {\n    throw new Error(\"doc.documentFileName is read-only\");\n  }\n  get dynamicXFAForm() {\n    return false;\n  }\n  set dynamicXFAForm(_) {\n    throw new Error(\"doc.dynamicXFAForm is read-only\");\n  }\n  get external() {\n    return DOC_EXTERNAL;\n  }\n  set external(_) {\n    throw new Error(\"doc.external is read-only\");\n  }\n  get filesize() {\n    return this._filesize;\n  }\n  set filesize(_) {\n    throw new Error(\"doc.filesize is read-only\");\n  }\n  get hidden() {\n    return false;\n  }\n  set hidden(_) {\n    throw new Error(\"doc.hidden is read-only\");\n  }\n  get hostContainer() {\n    return undefined;\n  }\n  set hostContainer(_) {\n    throw new Error(\"doc.hostContainer is read-only\");\n  }\n  get icons() {\n    return undefined;\n  }\n  set icons(_) {\n    throw new Error(\"doc.icons is read-only\");\n  }\n  get info() {\n    return this._info;\n  }\n  set info(_) {\n    throw new Error(\"doc.info is read-only\");\n  }\n  get innerAppWindowRect() {\n    return [0, 0, 0, 0];\n  }\n  set innerAppWindowRect(_) {\n    throw new Error(\"doc.innerAppWindowRect is read-only\");\n  }\n  get innerDocWindowRect() {\n    return [0, 0, 0, 0];\n  }\n  set innerDocWindowRect(_) {\n    throw new Error(\"doc.innerDocWindowRect is read-only\");\n  }\n  get isModal() {\n    return false;\n  }\n  set isModal(_) {\n    throw new Error(\"doc.isModal is read-only\");\n  }\n  get keywords() {\n    return this._keywords;\n  }\n  set keywords(_) {\n    throw new Error(\"doc.keywords is read-only\");\n  }\n  get layout() {\n    return this._layout;\n  }\n  set layout(value) {\n    if (!this._userActivation) {\n      return;\n    }\n    this._userActivation = false;\n    if (typeof value !== \"string\") {\n      return;\n    }\n    if (value !== \"SinglePage\" && value !== \"OneColumn\" && value !== \"TwoColumnLeft\" && value !== \"TwoPageLeft\" && value !== \"TwoColumnRight\" && value !== \"TwoPageRight\") {\n      value = \"SinglePage\";\n    }\n    this._send({\n      command: \"layout\",\n      value\n    });\n    this._layout = value;\n  }\n  get media() {\n    return this._media;\n  }\n  set media(media) {\n    this._media = media;\n  }\n  get metadata() {\n    return this._metadata;\n  }\n  set metadata(metadata) {\n    this._metadata = metadata;\n  }\n  get modDate() {\n    return this._modDate;\n  }\n  set modDate(_) {\n    throw new Error(\"doc.modDate is read-only\");\n  }\n  get mouseX() {\n    return 0;\n  }\n  set mouseX(_) {\n    throw new Error(\"doc.mouseX is read-only\");\n  }\n  get mouseY() {\n    return 0;\n  }\n  set mouseY(_) {\n    throw new Error(\"doc.mouseY is read-only\");\n  }\n  get noautocomplete() {\n    return this._noautocomplete;\n  }\n  set noautocomplete(noautocomplete) {\n    this._noautocomplete = noautocomplete;\n  }\n  get nocache() {\n    return this._nocache;\n  }\n  set nocache(nocache) {\n    this._nocache = nocache;\n  }\n  get numFields() {\n    return this._numFields;\n  }\n  set numFields(_) {\n    throw new Error(\"doc.numFields is read-only\");\n  }\n  get numPages() {\n    return this._numPages;\n  }\n  set numPages(_) {\n    throw new Error(\"doc.numPages is read-only\");\n  }\n  get numTemplates() {\n    return 0;\n  }\n  set numTemplates(_) {\n    throw new Error(\"doc.numTemplates is read-only\");\n  }\n  get outerAppWindowRect() {\n    return [0, 0, 0, 0];\n  }\n  set outerAppWindowRect(_) {\n    throw new Error(\"doc.outerAppWindowRect is read-only\");\n  }\n  get outerDocWindowRect() {\n    return [0, 0, 0, 0];\n  }\n  set outerDocWindowRect(_) {\n    throw new Error(\"doc.outerDocWindowRect is read-only\");\n  }\n  get pageNum() {\n    return this._pageNum;\n  }\n  set pageNum(value) {\n    if (!this._userActivation) {\n      return;\n    }\n    this._userActivation = false;\n    if (typeof value !== \"number\" || value < 0 || value >= this._numPages) {\n      return;\n    }\n    this._send({\n      command: \"page-num\",\n      value\n    });\n    this._pageNum = value;\n  }\n  get pageWindowRect() {\n    return [0, 0, 0, 0];\n  }\n  set pageWindowRect(_) {\n    throw new Error(\"doc.pageWindowRect is read-only\");\n  }\n  get path() {\n    return \"\";\n  }\n  set path(_) {\n    throw new Error(\"doc.path is read-only\");\n  }\n  get permStatusReady() {\n    return true;\n  }\n  set permStatusReady(_) {\n    throw new Error(\"doc.permStatusReady is read-only\");\n  }\n  get producer() {\n    return this._producer;\n  }\n  set producer(_) {\n    throw new Error(\"doc.producer is read-only\");\n  }\n  get requiresFullSave() {\n    return false;\n  }\n  set requiresFullSave(_) {\n    throw new Error(\"doc.requiresFullSave is read-only\");\n  }\n  get securityHandler() {\n    return this._securityHandler;\n  }\n  set securityHandler(_) {\n    throw new Error(\"doc.securityHandler is read-only\");\n  }\n  get selectedAnnots() {\n    return [];\n  }\n  set selectedAnnots(_) {\n    throw new Error(\"doc.selectedAnnots is read-only\");\n  }\n  get sounds() {\n    return [];\n  }\n  set sounds(_) {\n    throw new Error(\"doc.sounds is read-only\");\n  }\n  get spellDictionaryOrder() {\n    return this._spellDictionaryOrder;\n  }\n  set spellDictionaryOrder(spellDictionaryOrder) {\n    this._spellDictionaryOrder = spellDictionaryOrder;\n  }\n  get spellLanguageOrder() {\n    return this._spellLanguageOrder;\n  }\n  set spellLanguageOrder(spellLanguageOrder) {\n    this._spellLanguageOrder = spellLanguageOrder;\n  }\n  get subject() {\n    return this._subject;\n  }\n  set subject(_) {\n    throw new Error(\"doc.subject is read-only\");\n  }\n  get templates() {\n    return [];\n  }\n  set templates(_) {\n    throw new Error(\"doc.templates is read-only\");\n  }\n  get title() {\n    return this._title;\n  }\n  set title(_) {\n    throw new Error(\"doc.title is read-only\");\n  }\n  get URL() {\n    return this._URL;\n  }\n  set URL(_) {\n    throw new Error(\"doc.URL is read-only\");\n  }\n  get viewState() {\n    return undefined;\n  }\n  set viewState(_) {\n    throw new Error(\"doc.viewState is read-only\");\n  }\n  get xfa() {\n    return this._xfa;\n  }\n  set xfa(_) {\n    throw new Error(\"doc.xfa is read-only\");\n  }\n  get XFAForeground() {\n    return false;\n  }\n  set XFAForeground(_) {\n    throw new Error(\"doc.XFAForeground is read-only\");\n  }\n  get zoomType() {\n    return this._zoomType;\n  }\n  set zoomType(type) {\n    if (!this._userActivation) {\n      return;\n    }\n    this._userActivation = false;\n    if (typeof type !== \"string\") {\n      return;\n    }\n    switch (type) {\n      case ZoomType.none:\n        this._send({\n          command: \"zoom\",\n          value: 1\n        });\n        break;\n      case ZoomType.fitP:\n        this._send({\n          command: \"zoom\",\n          value: \"page-fit\"\n        });\n        break;\n      case ZoomType.fitW:\n        this._send({\n          command: \"zoom\",\n          value: \"page-width\"\n        });\n        break;\n      case ZoomType.fitH:\n        this._send({\n          command: \"zoom\",\n          value: \"page-height\"\n        });\n        break;\n      case ZoomType.fitV:\n        this._send({\n          command: \"zoom\",\n          value: \"auto\"\n        });\n        break;\n      case ZoomType.pref:\n      case ZoomType.refW:\n        break;\n      default:\n        return;\n    }\n    this._zoomType = type;\n  }\n  get zoom() {\n    return this._zoom;\n  }\n  set zoom(value) {\n    if (!this._userActivation) {\n      return;\n    }\n    this._userActivation = false;\n    if (typeof value !== \"number\" || value < 8.33 || value > 6400) {\n      return;\n    }\n    this._send({\n      command: \"zoom\",\n      value: value / 100\n    });\n  }\n  addAnnot() {}\n  addField() {}\n  addIcon() {}\n  addLink() {}\n  addRecipientListCryptFilter() {}\n  addRequirement() {}\n  addScript() {}\n  addThumbnails() {}\n  addWatermarkFromFile() {}\n  addWatermarkFromText() {}\n  addWeblinks() {}\n  bringToFront() {}\n  calculateNow() {\n    this._eventDispatcher.calculateNow();\n  }\n  closeDoc() {}\n  colorConvertPage() {}\n  createDataObject() {}\n  createTemplate() {}\n  deletePages() {}\n  deleteSound() {}\n  embedDocAsDataObject() {}\n  embedOutputIntent() {}\n  encryptForRecipients() {}\n  encryptUsingPolicy() {}\n  exportAsFDF() {}\n  exportAsFDFStr() {}\n  exportAsText() {}\n  exportAsXFDF() {}\n  exportAsXFDFStr() {}\n  exportDataObject() {}\n  exportXFAData() {}\n  extractPages() {}\n  flattenPages() {}\n  getAnnot() {}\n  getAnnots() {}\n  getAnnot3D() {}\n  getAnnots3D() {}\n  getColorConvertAction() {}\n  getDataObject() {}\n  getDataObjectContents() {}\n  _getField(cName) {\n    if (cName && typeof cName === \"object\") {\n      cName = cName.cName;\n    }\n    if (typeof cName !== \"string\") {\n      throw new TypeError(\"Invalid field name: must be a string\");\n    }\n    const searchedField = this._fields.get(cName);\n    if (searchedField) {\n      return searchedField;\n    }\n    const parts = cName.split(\"#\");\n    let childIndex = NaN;\n    if (parts.length === 2) {\n      childIndex = Math.floor(parseFloat(parts[1]));\n      cName = parts[0];\n    }\n    for (const [name, field] of this._fields) {\n      if (name.endsWith(cName)) {\n        if (!isNaN(childIndex)) {\n          const children = this._getChildren(name);\n          if (childIndex < 0 || childIndex >= children.length) {\n            childIndex = 0;\n          }\n          if (childIndex < children.length) {\n            this._fields.set(cName, children[childIndex]);\n            return children[childIndex];\n          }\n        }\n        this._fields.set(cName, field);\n        return field;\n      }\n    }\n    return null;\n  }\n  getField(cName) {\n    const field = this._getField(cName);\n    if (!field) {\n      return null;\n    }\n    return field.wrapped;\n  }\n  _getChildren(fieldName) {\n    const len = fieldName.length;\n    const children = [];\n    const pattern = /^\\.[^.]+$/;\n    for (const [name, field] of this._fields) {\n      if (name.startsWith(fieldName)) {\n        const finalPart = name.slice(len);\n        if (pattern.test(finalPart)) {\n          children.push(field);\n        }\n      }\n    }\n    return children;\n  }\n  _getTerminalChildren(fieldName) {\n    const children = [];\n    const len = fieldName.length;\n    for (const [name, field] of this._fields) {\n      if (name.startsWith(fieldName)) {\n        const finalPart = name.slice(len);\n        if (field.obj._hasValue && (finalPart === \"\" || finalPart.startsWith(\".\"))) {\n          children.push(field.wrapped);\n        }\n      }\n    }\n    return children;\n  }\n  getIcon() {}\n  getLegalWarnings() {}\n  getLinks() {}\n  getNthFieldName(nIndex) {\n    if (nIndex && typeof nIndex === \"object\") {\n      nIndex = nIndex.nIndex;\n    }\n    if (typeof nIndex !== \"number\") {\n      throw new TypeError(\"Invalid field index: must be a number\");\n    }\n    if (0 <= nIndex && nIndex < this.numFields) {\n      return this._fieldNames[Math.trunc(nIndex)];\n    }\n    return null;\n  }\n  getNthTemplate() {\n    return null;\n  }\n  getOCGs() {}\n  getOCGOrder() {}\n  getPageBox() {}\n  getPageLabel() {}\n  getPageNthWord() {}\n  getPageNthWordQuads() {}\n  getPageNumWords() {}\n  getPageRotation() {}\n  getPageTransition() {}\n  getPrintParams() {\n    return this._printParams ||= new PrintParams({\n      lastPage: this._numPages - 1\n    });\n  }\n  getSound() {}\n  getTemplate() {}\n  getURL() {}\n  gotoNamedDest() {}\n  importAnFDF() {}\n  importAnXFDF() {}\n  importDataObject() {}\n  importIcon() {}\n  importSound() {}\n  importTextData() {}\n  importXFAData() {}\n  insertPages() {}\n  mailDoc() {}\n  mailForm() {}\n  movePage() {}\n  newPage() {}\n  openDataObject() {}\n  print(bUI = true, nStart = 0, nEnd = -1, bSilent = false, bShrinkToFit = false, bPrintAsImage = false, bReverse = false, bAnnotations = true, printParams = null) {\n    if (this._disablePrinting || !this._userActivation) {\n      return;\n    }\n    this._userActivation = false;\n    if (bUI && typeof bUI === \"object\") {\n      nStart = bUI.nStart;\n      nEnd = bUI.nEnd;\n      bSilent = bUI.bSilent;\n      bShrinkToFit = bUI.bShrinkToFit;\n      bPrintAsImage = bUI.bPrintAsImage;\n      bReverse = bUI.bReverse;\n      bAnnotations = bUI.bAnnotations;\n      printParams = bUI.printParams;\n      bUI = bUI.bUI;\n    }\n    if (printParams) {\n      nStart = printParams.firstPage;\n      nEnd = printParams.lastPage;\n    }\n    nStart = typeof nStart === \"number\" ? Math.max(0, Math.trunc(nStart)) : 0;\n    nEnd = typeof nEnd === \"number\" ? Math.max(0, Math.trunc(nEnd)) : -1;\n    this._send({\n      command: \"print\",\n      start: nStart,\n      end: nEnd\n    });\n  }\n  removeDataObject() {}\n  removeField() {}\n  removeIcon() {}\n  removeLinks() {}\n  removeRequirement() {}\n  removeScript() {}\n  removeTemplate() {}\n  removeThumbnails() {}\n  removeWeblinks() {}\n  replacePages() {}\n  resetForm(aFields = null) {\n    if (aFields && typeof aFields === \"object\" && !Array.isArray(aFields)) {\n      aFields = aFields.aFields;\n    }\n    if (aFields && !Array.isArray(aFields)) {\n      aFields = [aFields];\n    }\n    let mustCalculate = false;\n    let fieldsToReset;\n    if (aFields) {\n      fieldsToReset = [];\n      for (const fieldName of aFields) {\n        if (!fieldName) {\n          continue;\n        }\n        if (typeof fieldName !== \"string\") {\n          fieldsToReset = null;\n          break;\n        }\n        const field = this._getField(fieldName);\n        if (!field) {\n          continue;\n        }\n        fieldsToReset.push(field);\n        mustCalculate = true;\n      }\n    }\n    if (!fieldsToReset) {\n      fieldsToReset = this._fields.values();\n      mustCalculate = this._fields.size !== 0;\n    }\n    for (const field of fieldsToReset) {\n      field.obj.value = field.obj.defaultValue;\n      this._send({\n        id: field.obj._id,\n        siblings: field.obj._siblings,\n        value: field.obj.defaultValue,\n        formattedValue: null,\n        selRange: [0, 0]\n      });\n    }\n    if (mustCalculate) {\n      this.calculateNow();\n    }\n  }\n  saveAs() {}\n  scroll() {}\n  selectPageNthWord() {}\n  setAction() {}\n  setDataObjectContents() {}\n  setOCGOrder() {}\n  setPageAction() {}\n  setPageBoxes() {}\n  setPageLabels() {}\n  setPageRotations() {}\n  setPageTabOrder() {}\n  setPageTransitions() {}\n  spawnPageFromTemplate() {}\n  submitForm() {}\n  syncAnnotScan() {}\n}\n\n;// ./src/scripting_api/proxy.js\nclass ProxyHandler {\n  nosend = new Set([\"delay\"]);\n  get(obj, prop) {\n    if (prop in obj._expandos) {\n      const val = obj._expandos[prop];\n      if (typeof val === \"function\") {\n        return val.bind(obj);\n      }\n      return val;\n    }\n    if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n      const val = obj[prop];\n      if (typeof val === \"function\") {\n        return val.bind(obj);\n      }\n      return val;\n    }\n    return undefined;\n  }\n  set(obj, prop, value) {\n    if (obj._kidIds) {\n      obj._kidIds.forEach(id => {\n        obj._appObjects[id].wrapped[prop] = value;\n      });\n    }\n    if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n      const old = obj[prop];\n      obj[prop] = value;\n      if (!this.nosend.has(prop) && obj._send && obj._id !== null && typeof old !== \"function\") {\n        const data = {\n          id: obj._id\n        };\n        data[prop] = prop === \"value\" ? obj._getValue() : obj[prop];\n        if (!obj._siblings) {\n          obj._send(data);\n        } else {\n          data.siblings = obj._siblings;\n          obj._send(data);\n        }\n      }\n    } else {\n      obj._expandos[prop] = value;\n    }\n    return true;\n  }\n  has(obj, prop) {\n    return prop in obj._expandos || typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj;\n  }\n  getPrototypeOf(obj) {\n    return null;\n  }\n  setPrototypeOf(obj, proto) {\n    return false;\n  }\n  isExtensible(obj) {\n    return true;\n  }\n  preventExtensions(obj) {\n    return false;\n  }\n  getOwnPropertyDescriptor(obj, prop) {\n    if (prop in obj._expandos) {\n      return {\n        configurable: true,\n        enumerable: true,\n        value: obj._expandos[prop]\n      };\n    }\n    if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n      return {\n        configurable: true,\n        enumerable: true,\n        value: obj[prop]\n      };\n    }\n    return undefined;\n  }\n  defineProperty(obj, key, descriptor) {\n    Object.defineProperty(obj._expandos, key, descriptor);\n    return true;\n  }\n  deleteProperty(obj, prop) {\n    if (prop in obj._expandos) {\n      delete obj._expandos[prop];\n    }\n  }\n  ownKeys(obj) {\n    const fromExpandos = Reflect.ownKeys(obj._expandos);\n    const fromObj = Reflect.ownKeys(obj).filter(k => !k.startsWith(\"_\"));\n    return fromExpandos.concat(fromObj);\n  }\n}\n\n;// ./src/scripting_api/util.js\n\nclass Util extends PDFObject {\n  #dateActionsCache = null;\n  constructor(data) {\n    super(data);\n    this._scandCache = new Map();\n    this._months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n    this._days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n    this.MILLISECONDS_IN_DAY = 86400000;\n    this.MILLISECONDS_IN_WEEK = 604800000;\n    this._externalCall = data.externalCall;\n  }\n  printf(...args) {\n    if (args.length === 0) {\n      throw new Error(\"Invalid number of params in printf\");\n    }\n    if (typeof args[0] !== \"string\") {\n      throw new TypeError(\"First argument of printf must be a string\");\n    }\n    const pattern = /%(,[0-4])?([+ 0#]+)?(\\d+)?(\\.\\d+)?(.)/g;\n    const PLUS = 1;\n    const SPACE = 2;\n    const ZERO = 4;\n    const HASH = 8;\n    let i = 0;\n    return args[0].replaceAll(pattern, function (match, nDecSep, cFlags, nWidth, nPrecision, cConvChar) {\n      if (cConvChar !== \"d\" && cConvChar !== \"f\" && cConvChar !== \"s\" && cConvChar !== \"x\") {\n        const buf = [\"%\"];\n        for (const str of [nDecSep, cFlags, nWidth, nPrecision, cConvChar]) {\n          if (str) {\n            buf.push(str);\n          }\n        }\n        return buf.join(\"\");\n      }\n      i++;\n      if (i === args.length) {\n        throw new Error(\"Not enough arguments in printf\");\n      }\n      const arg = args[i];\n      if (cConvChar === \"s\") {\n        return arg.toString();\n      }\n      let flags = 0;\n      if (cFlags) {\n        for (const flag of cFlags) {\n          switch (flag) {\n            case \"+\":\n              flags |= PLUS;\n              break;\n            case \" \":\n              flags |= SPACE;\n              break;\n            case \"0\":\n              flags |= ZERO;\n              break;\n            case \"#\":\n              flags |= HASH;\n              break;\n          }\n        }\n      }\n      cFlags = flags;\n      if (nWidth) {\n        nWidth = parseInt(nWidth);\n      }\n      let intPart = Math.trunc(arg);\n      if (cConvChar === \"x\") {\n        let hex = Math.abs(intPart).toString(16).toUpperCase();\n        if (nWidth !== undefined) {\n          hex = hex.padStart(nWidth, cFlags & ZERO ? \"0\" : \" \");\n        }\n        if (cFlags & HASH) {\n          hex = `0x${hex}`;\n        }\n        return hex;\n      }\n      if (nPrecision) {\n        nPrecision = parseInt(nPrecision.substring(1));\n      }\n      nDecSep = nDecSep ? nDecSep.substring(1) : \"0\";\n      const separators = {\n        0: [\",\", \".\"],\n        1: [\"\", \".\"],\n        2: [\".\", \",\"],\n        3: [\"\", \",\"],\n        4: [\"'\", \".\"]\n      };\n      const [thousandSep, decimalSep] = separators[nDecSep];\n      let decPart = \"\";\n      if (cConvChar === \"f\") {\n        decPart = nPrecision !== undefined ? Math.abs(arg - intPart).toFixed(nPrecision) : Math.abs(arg - intPart).toString();\n        if (decPart.length > 2) {\n          if (/^1\\.0+$/.test(decPart)) {\n            intPart += Math.sign(arg);\n            decPart = `${decimalSep}${decPart.split(\".\")[1]}`;\n          } else {\n            decPart = `${decimalSep}${decPart.substring(2)}`;\n          }\n        } else {\n          if (decPart === \"1\") {\n            intPart += Math.sign(arg);\n          }\n          decPart = cFlags & HASH ? \".\" : \"\";\n        }\n      }\n      let sign = \"\";\n      if (intPart < 0) {\n        sign = \"-\";\n        intPart = -intPart;\n      } else if (cFlags & PLUS) {\n        sign = \"+\";\n      } else if (cFlags & SPACE) {\n        sign = \" \";\n      }\n      if (thousandSep && intPart >= 1000) {\n        const buf = [];\n        while (true) {\n          buf.push((intPart % 1000).toString().padStart(3, \"0\"));\n          intPart = Math.trunc(intPart / 1000);\n          if (intPart < 1000) {\n            buf.push(intPart.toString());\n            break;\n          }\n        }\n        intPart = buf.reverse().join(thousandSep);\n      } else {\n        intPart = intPart.toString();\n      }\n      let n = `${intPart}${decPart}`;\n      if (nWidth !== undefined) {\n        n = n.padStart(nWidth - sign.length, cFlags & ZERO ? \"0\" : \" \");\n      }\n      return `${sign}${n}`;\n    });\n  }\n  iconStreamFromIcon() {}\n  printd(cFormat, oDate) {\n    switch (cFormat) {\n      case 0:\n        return this.printd(\"D:yyyymmddHHMMss\", oDate);\n      case 1:\n        return this.printd(\"yyyy.mm.dd HH:MM:ss\", oDate);\n      case 2:\n        return this.printd(\"m/d/yy h:MM:ss tt\", oDate);\n    }\n    const handlers = {\n      mmmm: data => this._months[data.month],\n      mmm: data => this._months[data.month].substring(0, 3),\n      mm: data => (data.month + 1).toString().padStart(2, \"0\"),\n      m: data => (data.month + 1).toString(),\n      dddd: data => this._days[data.dayOfWeek],\n      ddd: data => this._days[data.dayOfWeek].substring(0, 3),\n      dd: data => data.day.toString().padStart(2, \"0\"),\n      d: data => data.day.toString(),\n      yyyy: data => data.year.toString().padStart(4, \"0\"),\n      yy: data => (data.year % 100).toString().padStart(2, \"0\"),\n      HH: data => data.hours.toString().padStart(2, \"0\"),\n      H: data => data.hours.toString(),\n      hh: data => (1 + (data.hours + 11) % 12).toString().padStart(2, \"0\"),\n      h: data => (1 + (data.hours + 11) % 12).toString(),\n      MM: data => data.minutes.toString().padStart(2, \"0\"),\n      M: data => data.minutes.toString(),\n      ss: data => data.seconds.toString().padStart(2, \"0\"),\n      s: data => data.seconds.toString(),\n      tt: data => data.hours < 12 ? \"am\" : \"pm\",\n      t: data => data.hours < 12 ? \"a\" : \"p\"\n    };\n    const data = {\n      year: oDate.getFullYear(),\n      month: oDate.getMonth(),\n      day: oDate.getDate(),\n      dayOfWeek: oDate.getDay(),\n      hours: oDate.getHours(),\n      minutes: oDate.getMinutes(),\n      seconds: oDate.getSeconds()\n    };\n    const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t|\\\\.)/g;\n    return cFormat.replaceAll(patterns, function (match, pattern) {\n      if (pattern in handlers) {\n        return handlers[pattern](data);\n      }\n      return pattern.charCodeAt(1);\n    });\n  }\n  printx(cFormat, cSource) {\n    cSource = (cSource ?? \"\").toString();\n    const handlers = [x => x, x => x.toUpperCase(), x => x.toLowerCase()];\n    const buf = [];\n    let i = 0;\n    const ii = cSource.length;\n    let currCase = handlers[0];\n    let escaped = false;\n    for (const command of cFormat) {\n      if (escaped) {\n        buf.push(command);\n        escaped = false;\n        continue;\n      }\n      if (i >= ii) {\n        break;\n      }\n      switch (command) {\n        case \"?\":\n          buf.push(currCase(cSource.charAt(i++)));\n          break;\n        case \"X\":\n          while (i < ii) {\n            const char = cSource.charAt(i++);\n            if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\") {\n              buf.push(currCase(char));\n              break;\n            }\n          }\n          break;\n        case \"A\":\n          while (i < ii) {\n            const char = cSource.charAt(i++);\n            if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\") {\n              buf.push(currCase(char));\n              break;\n            }\n          }\n          break;\n        case \"9\":\n          while (i < ii) {\n            const char = cSource.charAt(i++);\n            if (\"0\" <= char && char <= \"9\") {\n              buf.push(char);\n              break;\n            }\n          }\n          break;\n        case \"*\":\n          while (i < ii) {\n            buf.push(currCase(cSource.charAt(i++)));\n          }\n          break;\n        case \"\\\\\":\n          escaped = true;\n          break;\n        case \">\":\n          currCase = handlers[1];\n          break;\n        case \"<\":\n          currCase = handlers[2];\n          break;\n        case \"=\":\n          currCase = handlers[0];\n          break;\n        default:\n          buf.push(command);\n      }\n    }\n    return buf.join(\"\");\n  }\n  #tryToGuessDate(cFormat, cDate) {\n    let actions = (this.#dateActionsCache ||= new Map()).get(cFormat);\n    if (!actions) {\n      actions = [];\n      this.#dateActionsCache.set(cFormat, actions);\n      cFormat.replaceAll(/(d+)|(m+)|(y+)|(H+)|(M+)|(s+)/g, function (_match, d, m, y, H, M, s) {\n        if (d) {\n          actions.push((n, data) => {\n            if (n >= 1 && n <= 31) {\n              data.day = n;\n              return true;\n            }\n            return false;\n          });\n        } else if (m) {\n          actions.push((n, data) => {\n            if (n >= 1 && n <= 12) {\n              data.month = n - 1;\n              return true;\n            }\n            return false;\n          });\n        } else if (y) {\n          actions.push((n, data) => {\n            if (n < 50) {\n              n += 2000;\n            } else if (n < 100) {\n              n += 1900;\n            }\n            data.year = n;\n            return true;\n          });\n        } else if (H) {\n          actions.push((n, data) => {\n            if (n >= 0 && n <= 23) {\n              data.hours = n;\n              return true;\n            }\n            return false;\n          });\n        } else if (M) {\n          actions.push((n, data) => {\n            if (n >= 0 && n <= 59) {\n              data.minutes = n;\n              return true;\n            }\n            return false;\n          });\n        } else if (s) {\n          actions.push((n, data) => {\n            if (n >= 0 && n <= 59) {\n              data.seconds = n;\n              return true;\n            }\n            return false;\n          });\n        }\n        return \"\";\n      });\n    }\n    const number = /\\d+/g;\n    let i = 0;\n    let array;\n    const data = {\n      year: new Date().getFullYear(),\n      month: 0,\n      day: 1,\n      hours: 12,\n      minutes: 0,\n      seconds: 0\n    };\n    while ((array = number.exec(cDate)) !== null) {\n      if (i < actions.length) {\n        if (!actions[i++](parseInt(array[0]), data)) {\n          return null;\n        }\n      } else {\n        break;\n      }\n    }\n    if (i === 0) {\n      return null;\n    }\n    return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n  }\n  scand(cFormat, cDate) {\n    return this._scand(cFormat, cDate);\n  }\n  _scand(cFormat, cDate, strict = false) {\n    if (typeof cDate !== \"string\") {\n      return new Date(cDate);\n    }\n    if (cDate === \"\") {\n      return new Date();\n    }\n    switch (cFormat) {\n      case 0:\n        return this.scand(\"D:yyyymmddHHMMss\", cDate);\n      case 1:\n        return this.scand(\"yyyy.mm.dd HH:MM:ss\", cDate);\n      case 2:\n        return this.scand(\"m/d/yy h:MM:ss tt\", cDate);\n    }\n    if (!this._scandCache.has(cFormat)) {\n      const months = this._months;\n      const days = this._days;\n      const handlers = {\n        mmmm: {\n          pattern: `(${months.join(\"|\")})`,\n          action: (value, data) => {\n            data.month = months.indexOf(value);\n          }\n        },\n        mmm: {\n          pattern: `(${months.map(month => month.substring(0, 3)).join(\"|\")})`,\n          action: (value, data) => {\n            data.month = months.findIndex(month => month.substring(0, 3) === value);\n          }\n        },\n        mm: {\n          pattern: `(\\\\d{2})`,\n          action: (value, data) => {\n            data.month = parseInt(value) - 1;\n          }\n        },\n        m: {\n          pattern: `(\\\\d{1,2})`,\n          action: (value, data) => {\n            data.month = parseInt(value) - 1;\n          }\n        },\n        dddd: {\n          pattern: `(${days.join(\"|\")})`,\n          action: (value, data) => {\n            data.day = days.indexOf(value);\n          }\n        },\n        ddd: {\n          pattern: `(${days.map(day => day.substring(0, 3)).join(\"|\")})`,\n          action: (value, data) => {\n            data.day = days.findIndex(day => day.substring(0, 3) === value);\n          }\n        },\n        dd: {\n          pattern: \"(\\\\d{2})\",\n          action: (value, data) => {\n            data.day = parseInt(value);\n          }\n        },\n        d: {\n          pattern: \"(\\\\d{1,2})\",\n          action: (value, data) => {\n            data.day = parseInt(value);\n          }\n        },\n        yyyy: {\n          pattern: \"(\\\\d{4})\",\n          action: (value, data) => {\n            data.year = parseInt(value);\n          }\n        },\n        yy: {\n          pattern: \"(\\\\d{2})\",\n          action: (value, data) => {\n            data.year = 2000 + parseInt(value);\n          }\n        },\n        HH: {\n          pattern: \"(\\\\d{2})\",\n          action: (value, data) => {\n            data.hours = parseInt(value);\n          }\n        },\n        H: {\n          pattern: \"(\\\\d{1,2})\",\n          action: (value, data) => {\n            data.hours = parseInt(value);\n          }\n        },\n        hh: {\n          pattern: \"(\\\\d{2})\",\n          action: (value, data) => {\n            data.hours = parseInt(value);\n          }\n        },\n        h: {\n          pattern: \"(\\\\d{1,2})\",\n          action: (value, data) => {\n            data.hours = parseInt(value);\n          }\n        },\n        MM: {\n          pattern: \"(\\\\d{2})\",\n          action: (value, data) => {\n            data.minutes = parseInt(value);\n          }\n        },\n        M: {\n          pattern: \"(\\\\d{1,2})\",\n          action: (value, data) => {\n            data.minutes = parseInt(value);\n          }\n        },\n        ss: {\n          pattern: \"(\\\\d{2})\",\n          action: (value, data) => {\n            data.seconds = parseInt(value);\n          }\n        },\n        s: {\n          pattern: \"(\\\\d{1,2})\",\n          action: (value, data) => {\n            data.seconds = parseInt(value);\n          }\n        },\n        tt: {\n          pattern: \"([aApP][mM])\",\n          action: (value, data) => {\n            const char = value.charAt(0);\n            data.am = char === \"a\" || char === \"A\";\n          }\n        },\n        t: {\n          pattern: \"([aApP])\",\n          action: (value, data) => {\n            data.am = value === \"a\" || value === \"A\";\n          }\n        }\n      };\n      const escapedFormat = cFormat.replaceAll(/[.*+\\-?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n      const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t)/g;\n      const actions = [];\n      const re = escapedFormat.replaceAll(patterns, function (match, patternElement) {\n        const {\n          pattern,\n          action\n        } = handlers[patternElement];\n        actions.push(action);\n        return pattern;\n      });\n      this._scandCache.set(cFormat, [re, actions]);\n    }\n    const [re, actions] = this._scandCache.get(cFormat);\n    const matches = new RegExp(`^${re}$`, \"g\").exec(cDate);\n    if (!matches || matches.length !== actions.length + 1) {\n      return strict ? null : this.#tryToGuessDate(cFormat, cDate);\n    }\n    const data = {\n      year: 2000,\n      month: 0,\n      day: 1,\n      hours: 0,\n      minutes: 0,\n      seconds: 0,\n      am: null\n    };\n    actions.forEach((action, i) => action(matches[i + 1], data));\n    if (data.am !== null) {\n      data.hours = data.hours % 12 + (data.am ? 0 : 12);\n    }\n    return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n  }\n  spansToXML() {}\n  stringFromStream() {}\n  xmlToSpans() {}\n}\n\n;// ./src/scripting_api/initialization.js\n\n\n\n\n\n\n\n\n\n\nfunction initSandbox(params) {\n  delete globalThis.pdfjsScripting;\n  const externalCall = globalThis.callExternalFunction;\n  delete globalThis.callExternalFunction;\n  const globalEval = code => globalThis.eval(code);\n  const send = data => externalCall(\"send\", [data]);\n  const proxyHandler = new ProxyHandler();\n  const {\n    data\n  } = params;\n  const doc = new Doc({\n    send,\n    globalEval,\n    ...data.docInfo\n  });\n  const _document = {\n    obj: doc,\n    wrapped: new Proxy(doc, proxyHandler)\n  };\n  const app = new App({\n    send,\n    globalEval,\n    externalCall,\n    _document,\n    calculationOrder: data.calculationOrder,\n    proxyHandler,\n    ...data.appInfo\n  });\n  const util = new Util({\n    externalCall\n  });\n  const appObjects = app._objects;\n  if (data.objects) {\n    const annotations = [];\n    for (const [name, objs] of Object.entries(data.objects)) {\n      annotations.length = 0;\n      let container = null;\n      for (const obj of objs) {\n        if (obj.type !== \"\") {\n          annotations.push(obj);\n        } else {\n          container = obj;\n        }\n      }\n      let obj = container;\n      if (annotations.length > 0) {\n        obj = annotations[0];\n        obj.send = send;\n      }\n      obj.globalEval = globalEval;\n      obj.doc = _document;\n      obj.fieldPath = name;\n      obj.appObjects = appObjects;\n      obj.util = util;\n      const otherFields = annotations.slice(1);\n      let field;\n      switch (obj.type) {\n        case \"radiobutton\":\n          {\n            field = new RadioButtonField(otherFields, obj);\n            break;\n          }\n        case \"checkbox\":\n          {\n            field = new CheckboxField(otherFields, obj);\n            break;\n          }\n        default:\n          if (otherFields.length > 0) {\n            obj.siblings = otherFields.map(x => x.id);\n          }\n          field = new Field(obj);\n      }\n      const wrapped = new Proxy(field, proxyHandler);\n      const _object = {\n        obj: field,\n        wrapped\n      };\n      doc._addField(name, _object);\n      for (const object of objs) {\n        appObjects[object.id] = _object;\n      }\n      if (container) {\n        appObjects[container.id] = _object;\n      }\n    }\n  }\n  const color = new Color();\n  globalThis.event = null;\n  globalThis.global = Object.create(null);\n  globalThis.app = new Proxy(app, proxyHandler);\n  globalThis.color = new Proxy(color, proxyHandler);\n  globalThis.console = new Proxy(new Console({\n    send\n  }), proxyHandler);\n  globalThis.util = new Proxy(util, proxyHandler);\n  globalThis.border = Border;\n  globalThis.cursor = Cursor;\n  globalThis.display = Display;\n  globalThis.font = Font;\n  globalThis.highlight = Highlight;\n  globalThis.position = Position;\n  globalThis.scaleHow = ScaleHow;\n  globalThis.scaleWhen = ScaleWhen;\n  globalThis.style = Style;\n  globalThis.trans = Trans;\n  globalThis.zoomtype = ZoomType;\n  globalThis.ADBE = {\n    Reader_Value_Asked: true,\n    Viewer_Value_Asked: true\n  };\n  const aform = new AForm(doc, app, util, color);\n  for (const name of Object.getOwnPropertyNames(AForm.prototype)) {\n    if (name !== \"constructor\" && !name.startsWith(\"_\")) {\n      globalThis[name] = aform[name].bind(aform);\n    }\n  }\n  for (const [name, value] of Object.entries(GlobalConstants)) {\n    Object.defineProperty(globalThis, name, {\n      value,\n      writable: false\n    });\n  }\n  Object.defineProperties(globalThis, {\n    ColorConvert: {\n      value: color.convert.bind(color),\n      writable: true\n    },\n    ColorEqual: {\n      value: color.equal.bind(color),\n      writable: true\n    }\n  });\n  const properties = Object.create(null);\n  for (const name of Object.getOwnPropertyNames(Doc.prototype)) {\n    if (name === \"constructor\" || name.startsWith(\"_\")) {\n      continue;\n    }\n    const descriptor = Object.getOwnPropertyDescriptor(Doc.prototype, name);\n    if (descriptor.get) {\n      properties[name] = {\n        get: descriptor.get.bind(doc),\n        set: descriptor.set.bind(doc)\n      };\n    } else {\n      properties[name] = {\n        value: Doc.prototype[name].bind(doc)\n      };\n    }\n  }\n  Object.defineProperties(globalThis, properties);\n  const functions = {\n    dispatchEvent: app._dispatchEvent.bind(app),\n    timeoutCb: app._evalCallback.bind(app)\n  };\n  return (name, args) => {\n    try {\n      functions[name](args);\n    } catch (error) {\n      send(serializeError(error));\n    }\n  };\n}\n\n;// ./src/pdf.scripting.js\n\nglobalThis.pdfjsScripting = {\n  initSandbox: initSandbox\n};\n"];
+    code.push("delete dump;");
+    let success = false;
+    let buf = 0;
+    try {
+      const sandboxData = JSON.stringify(data);
+      code.push(`pdfjsScripting.initSandbox({ data: ${sandboxData} })`);
+      buf = this._module.stringToNewUTF8(code.join("\n"));
+      success = !!this._module.ccall("init", "number", ["number", "number"], [buf, this._alertOnError]);
+    } catch (error) {
+      console.error(error);
+    } finally {
+      if (buf) {
+        this._module.ccall("free", "number", ["number"], [buf]);
+      }
+    }
+    if (success) {
+      this.support.commFun = this._module.cwrap("commFun", null, ["string", "string"]);
+    } else {
+      this.nukeSandbox();
+      throw new Error("Cannot start sandbox");
+    }
+  }
+  dispatchEvent(event) {
+    this.support?.callSandboxFunction("dispatchEvent", event);
+  }
+  dumpMemoryUse() {
+    this._module?.ccall("dumpMemoryUse", null, []);
+  }
+  nukeSandbox() {
+    if (this._module !== null) {
+      this.support.destroy();
+      this.support = null;
+      this._module.ccall("nukeSandbox", null, []);
+      this._module = null;
+    }
+  }
+  evalForTesting(code, key) {
+    throw new Error("Not implemented: evalForTesting");
+  }
+}
+async function QuickJSSandbox(wasmUrl = "../web/wasm/") {
+  const {
+    default: ModuleLoader
+  } = await import(
+  /*webpackIgnore: true*/
+  /*@vite-ignore*/
+  `${wasmUrl}quickjs-eval.js`);
+  const module = await ModuleLoader();
+  return new Sandbox(window, module);
+}
+globalThis.pdfjsSandbox = {
+  QuickJSSandbox
+};
+
+export { QuickJSSandbox };
+
+//# sourceMappingURL=pdf.sandbox.mjs.map
\ No newline at end of file
diff --git a/public/pdfjs/build/pdf.sandbox.mjs.map b/public/pdfjs/build/pdf.sandbox.mjs.map
new file mode 100644
index 0000000..6419200
--- /dev/null
+++ b/public/pdfjs/build/pdf.sandbox.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"pdf.sandbox.mjs","mappings":"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","sources":["webpack://pdf.js/./src/pdf.sandbox.external.js","webpack://pdf.js/./src/pdf.sandbox.js"],"sourcesContent":["/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// In mozilla-central, this file is loaded as non-module script,\n// so it mustn't have any dependencies.\n\n// eslint-disable-next-line no-restricted-syntax\nexport class SandboxSupportBase {\n  /**\n   * @param {DOMWindow} - win\n   */\n  constructor(win) {\n    this.win = win;\n    this.timeoutIds = new Map();\n\n    // Will be assigned after the sandbox is initialized\n    this.commFun = null;\n  }\n\n  destroy() {\n    this.commFun = null;\n    for (const id of this.timeoutIds.values()) {\n      this.win.clearTimeout(id);\n    }\n    this.timeoutIds = null;\n  }\n\n  /**\n   * @param {Object} val - Export a value in the sandbox.\n   */\n  exportValueToSandbox(val) {\n    throw new Error(\"Not implemented\");\n  }\n\n  /**\n   * @param {Object} val - Import a value from the sandbox.\n   */\n  importValueFromSandbox(val) {\n    throw new Error(\"Not implemented\");\n  }\n\n  /**\n   * @param {String} errorMessage - Create an error in the sandbox.\n   */\n  createErrorForSandbox(errorMessage) {\n    throw new Error(\"Not implemented\");\n  }\n\n  /**\n   * @param {String} name - Name of the function to call in the sandbox\n   * @param {Array<Object>} args - Arguments of the function.\n   */\n  callSandboxFunction(name, args) {\n    if (!this.commFun) {\n      return;\n    }\n    try {\n      args = this.exportValueToSandbox(args);\n      this.commFun(name, args);\n    } catch (e) {\n      this.win.console.error(e);\n    }\n  }\n\n  createSandboxExternals() {\n    // All the functions in externals object are called\n    // from the sandbox.\n    const externals = {\n      setTimeout: (callbackId, nMilliseconds) => {\n        if (\n          typeof callbackId !== \"number\" ||\n          typeof nMilliseconds !== \"number\"\n        ) {\n          return;\n        }\n\n        if (callbackId === 0) {\n          // This callbackId corresponds to the one used for userActivation.\n          // So here, we cancel the last userActivation.\n          this.win.clearTimeout(this.timeoutIds.get(callbackId));\n        }\n\n        const id = this.win.setTimeout(() => {\n          this.timeoutIds.delete(callbackId);\n          this.callSandboxFunction(\"timeoutCb\", {\n            callbackId,\n            interval: false,\n          });\n        }, nMilliseconds);\n        this.timeoutIds.set(callbackId, id);\n      },\n      clearTimeout: callbackId => {\n        this.win.clearTimeout(this.timeoutIds.get(callbackId));\n        this.timeoutIds.delete(callbackId);\n      },\n      setInterval: (callbackId, nMilliseconds) => {\n        if (\n          typeof callbackId !== \"number\" ||\n          typeof nMilliseconds !== \"number\"\n        ) {\n          return;\n        }\n        const id = this.win.setInterval(() => {\n          this.callSandboxFunction(\"timeoutCb\", {\n            callbackId,\n            interval: true,\n          });\n        }, nMilliseconds);\n        this.timeoutIds.set(callbackId, id);\n      },\n      clearInterval: callbackId => {\n        this.win.clearInterval(this.timeoutIds.get(callbackId));\n        this.timeoutIds.delete(callbackId);\n      },\n      alert: cMsg => {\n        if (typeof cMsg !== \"string\") {\n          return;\n        }\n        this.win.alert(cMsg);\n      },\n      confirm: cMsg => {\n        if (typeof cMsg !== \"string\") {\n          return false;\n        }\n        return this.win.confirm(cMsg);\n      },\n      prompt: (cQuestion, cDefault) => {\n        if (typeof cQuestion !== \"string\" || typeof cDefault !== \"string\") {\n          return null;\n        }\n        return this.win.prompt(cQuestion, cDefault);\n      },\n      parseURL: cUrl => {\n        const url = new this.win.URL(cUrl);\n        const props = [\n          \"hash\",\n          \"host\",\n          \"hostname\",\n          \"href\",\n          \"origin\",\n          \"password\",\n          \"pathname\",\n          \"port\",\n          \"protocol\",\n          \"search\",\n          \"searchParams\",\n          \"username\",\n        ];\n\n        return Object.fromEntries(\n          props.map(name => [name, url[name].toString()])\n        );\n      },\n      send: data => {\n        if (!data) {\n          return;\n        }\n        const event = new this.win.CustomEvent(\"updatefromsandbox\", {\n          detail: this.importValueFromSandbox(data),\n        });\n        this.win.dispatchEvent(event);\n      },\n    };\n    Object.setPrototypeOf(externals, null);\n\n    return (name, args) => {\n      try {\n        const result = externals[name](...args);\n        return this.exportValueToSandbox(result);\n      } catch (error) {\n        throw this.createErrorForSandbox(error?.toString() ?? \"\");\n      }\n    };\n  }\n}\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SandboxSupportBase } from \"./pdf.sandbox.external.js\";\n\nclass SandboxSupport extends SandboxSupportBase {\n  exportValueToSandbox(val) {\n    // The communication with the Quickjs sandbox is based on strings\n    // So we use JSON.stringfy to serialize\n    return JSON.stringify(val);\n  }\n\n  importValueFromSandbox(val) {\n    return val;\n  }\n\n  createErrorForSandbox(errorMessage) {\n    return new Error(errorMessage);\n  }\n}\n\nclass Sandbox {\n  constructor(win, module) {\n    this.support = new SandboxSupport(win, this);\n\n    // The \"external\" functions created in pdf.sandbox.external.js\n    // are finally used here:\n    // https://github.com/mozilla/pdf.js.quickjs/blob/main/src/myjs.js\n    // They're called from the sandbox only.\n    module.externalCall = this.support.createSandboxExternals();\n\n    this._module = module;\n\n    // 0 to display error using console.error\n    // else display error using window.alert\n    this._alertOnError = 0;\n  }\n\n  create(data) {\n    if (PDFJSDev.test(\"TESTING\")) {\n      this._module.ccall(\"nukeSandbox\", null, []);\n    }\n    const code = [PDFJSDev.eval(\"PDF_SCRIPTING_JS_SOURCE\")];\n\n    if (PDFJSDev.test(\"TESTING\")) {\n      code.push(\n        `globalThis.sendResultForTesting = callExternalFunction.bind(null, \"send\");`\n      );\n    } else {\n      code.push(\"delete dump;\");\n    }\n\n    let success = false;\n    let buf = 0;\n    try {\n      const sandboxData = JSON.stringify(data);\n      // \"pdfjsScripting.initSandbox...\" MUST be the last line to be evaluated\n      // since the returned value is used for the communication.\n      code.push(`pdfjsScripting.initSandbox({ data: ${sandboxData} })`);\n      buf = this._module.stringToNewUTF8(code.join(\"\\n\"));\n\n      success = !!this._module.ccall(\n        \"init\",\n        \"number\",\n        [\"number\", \"number\"],\n        [buf, this._alertOnError]\n      );\n    } catch (error) {\n      // eslint-disable-next-line no-console\n      console.error(error);\n    } finally {\n      if (buf) {\n        this._module.ccall(\"free\", \"number\", [\"number\"], [buf]);\n      }\n    }\n\n    if (success) {\n      this.support.commFun = this._module.cwrap(\"commFun\", null, [\n        \"string\",\n        \"string\",\n      ]);\n    } else {\n      this.nukeSandbox();\n      throw new Error(\"Cannot start sandbox\");\n    }\n  }\n\n  dispatchEvent(event) {\n    this.support?.callSandboxFunction(\"dispatchEvent\", event);\n  }\n\n  dumpMemoryUse() {\n    this._module?.ccall(\"dumpMemoryUse\", null, []);\n  }\n\n  nukeSandbox() {\n    if (this._module !== null) {\n      this.support.destroy();\n      this.support = null;\n      this._module.ccall(\"nukeSandbox\", null, []);\n      this._module = null;\n    }\n  }\n\n  evalForTesting(code, key) {\n    if (PDFJSDev.test(\"TESTING\")) {\n      this._module.ccall(\n        \"evalInSandbox\",\n        null,\n        [\"string\", \"int\"],\n        [\n          `try {\n             sendResultForTesting([{ id: \"${key}\", result: ${code} }]);\n          } catch (error) {\n             sendResultForTesting([{ id: \"${key}\", result: error.message }]);\n          }`,\n          this._alertOnError,\n        ]\n      );\n    } else {\n      throw new Error(\"Not implemented: evalForTesting\");\n    }\n  }\n}\n\nasync function QuickJSSandbox(wasmUrl = \"../web/wasm/\") {\n  const { default: ModuleLoader } = await __raw_import__(\n    `${wasmUrl}quickjs-eval.js`\n  );\n  const module = await ModuleLoader();\n  return new Sandbox(window, module);\n}\n\nglobalThis.pdfjsSandbox = {\n  QuickJSSandbox,\n};\n\nexport { QuickJSSandbox };\n"],"names":["SandboxSupportBase","constructor","win","timeoutIds","Map","commFun","destroy","id","values","clearTimeout","exportValueToSandbox","val","Error","importValueFromSandbox","createErrorForSandbox","errorMessage","callSandboxFunction","name","args","e","console","error","createSandboxExternals","externals","setTimeout","callbackId","nMilliseconds","get","delete","interval","set","setInterval","clearInterval","alert","cMsg","confirm","prompt","cQuestion","cDefault","parseURL","cUrl","url","URL","props","Object","fromEntries","map","toString","send","data","event","CustomEvent","detail","dispatchEvent","setPrototypeOf","result","SandboxSupport","JSON","stringify","Sandbox","module","support","externalCall","_module","_alertOnError","create","code","push","success","buf","sandboxData","stringToNewUTF8","join","ccall","cwrap","nukeSandbox","dumpMemoryUse","evalForTesting","key","QuickJSSandbox","wasmUrl","default","ModuleLoader","window","globalThis","pdfjsSandbox"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/pdfjs/build/pdf.worker.mjs b/public/pdfjs/build/pdf.worker.mjs
new file mode 100644
index 0000000..72a8a90
--- /dev/null
+++ b/public/pdfjs/build/pdf.worker.mjs
@@ -0,0 +1,64390 @@
+/**
+ * @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 = 6.1.200
+ * pdfjsBuild = 6353acefe
+ */
+
+;// ./src/shared/util.js
+const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser");
+const BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity];
+const F32_BBOX_INIT = new Float32Array(BBOX_INIT);
+const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+const LINE_FACTOR = 1.35;
+const LINE_DESCENT_FACTOR = 0.35;
+const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;
+const SVG_NS = "http://www.w3.org/2000/svg";
+const RenderingIntentFlag = {
+  ANY: 0x01,
+  DISPLAY: 0x02,
+  PRINT: 0x04,
+  SAVE: 0x08,
+  ANNOTATIONS_FORMS: 0x10,
+  ANNOTATIONS_STORAGE: 0x20,
+  ANNOTATIONS_DISABLE: 0x40,
+  IS_EDITING: 0x80,
+  OPLIST: 0x100
+};
+const AnnotationMode = (/* unused pure expression or super */ null && ({
+  DISABLE: 0,
+  ENABLE: 1,
+  ENABLE_FORMS: 2,
+  ENABLE_STORAGE: 3
+}));
+const AnnotationPrefix = "pdfjs_internal_id_";
+const AnnotationEditorPrefix = "pdfjs_internal_editor_";
+const AnnotationEditorType = {
+  DISABLE: -1,
+  NONE: 0,
+  FREETEXT: 3,
+  HIGHLIGHT: 9,
+  STAMP: 13,
+  INK: 15,
+  POPUP: 16,
+  SIGNATURE: 101,
+  COMMENT: 102
+};
+const AnnotationEditorParamsType = (/* unused pure expression or super */ null && ({
+  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
+}));
+const PermissionFlag = {
+  PRINT: 0x04,
+  MODIFY_CONTENTS: 0x08,
+  COPY: 0x10,
+  MODIFY_ANNOTATIONS: 0x20,
+  FILL_INTERACTIVE_FORMS: 0x100,
+  COPY_FOR_ACCESSIBILITY: 0x200,
+  ASSEMBLE: 0x400,
+  PRINT_HIGH_QUALITY: 0x800
+};
+const MeshFigureType = {
+  TRIANGLES: 1,
+  LATTICE: 2,
+  PATCH: 3
+};
+const TextRenderingMode = {
+  FILL: 0,
+  STROKE: 1,
+  FILL_STROKE: 2,
+  INVISIBLE: 3,
+  FILL_ADD_TO_PATH: 4,
+  STROKE_ADD_TO_PATH: 5,
+  FILL_STROKE_ADD_TO_PATH: 6,
+  ADD_TO_PATH: 7,
+  FILL_STROKE_MASK: 3,
+  ADD_TO_PATH_FLAG: 4
+};
+const ImageKind = {
+  GRAYSCALE_1BPP: 1,
+  RGB_24BPP: 2,
+  RGBA_32BPP: 3
+};
+const AnnotationType = {
+  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,
+  RICHMEDIA: 27
+};
+const AnnotationReplyType = {
+  GROUP: "Group",
+  REPLY: "R"
+};
+const AnnotationRenditionOperation = {
+  PLAY_OR_RESUME: 0,
+  STOP: 1,
+  PAUSE: 2,
+  RESUME: 3,
+  PLAY: 4
+};
+const AnnotationFlag = {
+  INVISIBLE: 0x01,
+  HIDDEN: 0x02,
+  PRINT: 0x04,
+  NOZOOM: 0x08,
+  NOROTATE: 0x10,
+  NOVIEW: 0x20,
+  READONLY: 0x40,
+  LOCKED: 0x80,
+  TOGGLENOVIEW: 0x100,
+  LOCKEDCONTENTS: 0x200
+};
+const AnnotationFieldFlag = {
+  READONLY: 0x0000001,
+  REQUIRED: 0x0000002,
+  NOEXPORT: 0x0000004,
+  MULTILINE: 0x0001000,
+  PASSWORD: 0x0002000,
+  NOTOGGLETOOFF: 0x0004000,
+  RADIO: 0x0008000,
+  PUSHBUTTON: 0x0010000,
+  COMBO: 0x0020000,
+  EDIT: 0x0040000,
+  SORT: 0x0080000,
+  FILESELECT: 0x0100000,
+  MULTISELECT: 0x0200000,
+  DONOTSPELLCHECK: 0x0400000,
+  DONOTSCROLL: 0x0800000,
+  COMB: 0x1000000,
+  RICHTEXT: 0x2000000,
+  RADIOSINUNISON: 0x2000000,
+  COMMITONSELCHANGE: 0x4000000
+};
+const AnnotationBorderStyleType = {
+  SOLID: 1,
+  DASHED: 2,
+  BEVELED: 3,
+  INSET: 4,
+  UNDERLINE: 5
+};
+const AnnotationActionEventType = {
+  E: "Mouse Enter",
+  X: "Mouse Exit",
+  D: "Mouse Down",
+  U: "Mouse Up",
+  Fo: "Focus",
+  Bl: "Blur",
+  PO: "PageOpen",
+  PC: "PageClose",
+  PV: "PageVisible",
+  PI: "PageInvisible",
+  K: "Keystroke",
+  F: "Format",
+  V: "Validate",
+  C: "Calculate"
+};
+const DocumentActionEventType = {
+  WC: "WillClose",
+  WS: "WillSave",
+  DS: "DidSave",
+  WP: "WillPrint",
+  DP: "DidPrint"
+};
+const PageActionEventType = {
+  O: "PageOpen",
+  C: "PageClose"
+};
+const VerbosityLevel = {
+  ERRORS: 0,
+  WARNINGS: 1,
+  INFOS: 5
+};
+const OPS = {
+  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
+};
+const DrawOPS = {
+  moveTo: 0,
+  lineTo: 1,
+  curveTo: 2,
+  quadraticCurveTo: 3,
+  closePath: 4
+};
+const PasswordResponses = {
+  NEED_PASSWORD: 1,
+  INCORRECT_PASSWORD: 2
+};
+let verbosity = VerbosityLevel.WARNINGS;
+function setVerbosityLevel(level) {
+  if (Number.isInteger(level)) {
+    verbosity = level;
+  }
+}
+function getVerbosityLevel() {
+  return verbosity;
+}
+function info(msg) {
+  if (verbosity >= VerbosityLevel.INFOS) {
+    console.info(`Info: ${msg}`);
+  }
+}
+function warn(msg) {
+  if (verbosity >= VerbosityLevel.WARNINGS) {
+    console.warn(`Warning: ${msg}`);
+  }
+}
+function unreachable(msg) {
+  throw new Error(msg);
+}
+function assert(cond, msg) {
+  if (!cond) {
+    unreachable(msg);
+  }
+}
+function _isValidProtocol(url) {
+  switch (url?.protocol) {
+    case "http:":
+    case "https:":
+    case "ftp:":
+    case "mailto:":
+    case "tel:":
+      return true;
+    default:
+      return false;
+  }
+}
+function createValidAbsoluteUrl(url, baseUrl = null, options = null) {
+  if (!url) {
+    return null;
+  }
+  if (options && typeof url === "string") {
+    if (options.addDefaultProtocol && url.startsWith("www.")) {
+      const dots = url.match(/\./g);
+      if (dots?.length >= 2) {
+        url = `http://${url}`;
+      }
+    }
+    if (options.tryConvertEncoding) {
+      try {
+        url = stringToUTF8String(url);
+      } catch {}
+    }
+  }
+  const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);
+  return _isValidProtocol(absoluteUrl) ? absoluteUrl : null;
+}
+function updateUrlHash(url, hash, allowRel = false) {
+  const res = URL.parse(url);
+  if (res) {
+    res.hash = hash;
+    return res.href;
+  }
+  if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) {
+    return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`;
+  }
+  return "";
+}
+function stripPath(str) {
+  return str.substring(str.lastIndexOf("/") + 1);
+}
+function shadow(obj, prop, value, nonSerializable = false) {
+  Object.defineProperty(obj, prop, {
+    value,
+    enumerable: !nonSerializable,
+    configurable: true,
+    writable: false
+  });
+  return value;
+}
+const BaseException = function BaseExceptionClosure() {
+  function BaseException(message, name) {
+    this.message = message;
+    this.name = name;
+  }
+  BaseException.prototype = new Error();
+  BaseException.constructor = BaseException;
+  return BaseException;
+}();
+class PasswordException extends BaseException {
+  constructor(msg, code) {
+    super(msg, "PasswordException");
+    this.code = code;
+  }
+}
+class UnknownErrorException extends BaseException {
+  constructor(msg, details) {
+    super(msg, "UnknownErrorException");
+    this.details = details;
+  }
+}
+class InvalidPDFException extends BaseException {
+  constructor(msg) {
+    super(msg, "InvalidPDFException");
+  }
+}
+class ResponseException extends BaseException {
+  constructor(msg, status, missing) {
+    super(msg, "ResponseException");
+    this.status = status;
+    this.missing = missing;
+  }
+}
+class FormatError extends BaseException {
+  constructor(msg) {
+    super(msg, "FormatError");
+  }
+}
+class AbortException extends BaseException {
+  constructor(msg) {
+    super(msg, "AbortException");
+  }
+}
+function bytesToString(bytes) {
+  if (typeof bytes !== "object" || bytes?.length === undefined) {
+    unreachable("Invalid argument for bytesToString");
+  }
+  const length = bytes.length;
+  const MAX_ARGUMENT_COUNT = 8192;
+  if (length < MAX_ARGUMENT_COUNT) {
+    return String.fromCharCode.apply(null, bytes);
+  }
+  const strBuf = [];
+  for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
+    const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
+    const chunk = bytes.subarray(i, chunkEnd);
+    strBuf.push(String.fromCharCode.apply(null, chunk));
+  }
+  return strBuf.join("");
+}
+function stringToBytes(str) {
+  if (typeof str !== "string") {
+    unreachable("Invalid argument for stringToBytes");
+  }
+  const length = str.length;
+  const bytes = new Uint8Array(length);
+  for (let i = 0; i < length; ++i) {
+    bytes[i] = str.charCodeAt(i) & 0xff;
+  }
+  return bytes;
+}
+function objectSize(obj) {
+  return Object.keys(obj).length;
+}
+class FeatureTest {
+  static get isLittleEndian() {
+    const buffer8 = new Uint8Array(4);
+    buffer8[0] = 1;
+    const view32 = new Uint32Array(buffer8.buffer, 0, 1);
+    return shadow(this, "isLittleEndian", view32[0] === 1);
+  }
+  static get isOffscreenCanvasSupported() {
+    return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined");
+  }
+  static get isImageDecoderSupported() {
+    return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined");
+  }
+  static get isFloat16ArraySupported() {
+    return shadow(this, "isFloat16ArraySupported", typeof Float16Array !== "undefined");
+  }
+  static get isSanitizerSupported() {
+    return shadow(this, "isSanitizerSupported", typeof Sanitizer !== "undefined");
+  }
+  static get platform() {
+    const {
+      platform,
+      userAgent
+    } = navigator;
+    return shadow(this, "platform", {
+      isAndroid: userAgent.includes("Android"),
+      isLinux: platform.includes("Linux"),
+      isMac: platform.includes("Mac"),
+      isWindows: platform.includes("Win"),
+      isFirefox: userAgent.includes("Firefox")
+    });
+  }
+  static get isCanvasFilterSupported() {
+    let ctx;
+    if (this.isOffscreenCanvasSupported) {
+      ctx = new OffscreenCanvas(1, 1).getContext("2d");
+    }
+    return shadow(this, "isCanvasFilterSupported", ctx?.filter !== undefined);
+  }
+  static get isAlphaColorInputSupported() {
+    return shadow(this, "isAlphaColorInputSupported", false);
+  }
+  static get isBackdropFilterSupported() {
+    return shadow(this, "isBackdropFilterSupported", typeof CSS !== "undefined" && CSS.supports("backdrop-filter", "blur(1px)"));
+  }
+}
+class Util {
+  static get hexNums() {
+    return shadow(this, "hexNums", Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")));
+  }
+  static makeHexColor(r, g, b) {
+    return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`;
+  }
+  static transform(m1, m2) {
+    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];
+  }
+  static multiplyByDOMMatrix(m, md) {
+    return [m[0] * md.a + m[2] * md.b, m[1] * md.a + m[3] * md.b, m[0] * md.c + m[2] * md.d, m[1] * md.c + m[3] * md.d, m[0] * md.e + m[2] * md.f + m[4], m[1] * md.e + m[3] * md.f + m[5]];
+  }
+  static applyTransform(p, m, pos = 0) {
+    const p0 = p[pos];
+    const p1 = p[pos + 1];
+    p[pos] = p0 * m[0] + p1 * m[2] + m[4];
+    p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5];
+  }
+  static applyTransformToBezier(p, transform, pos = 0) {
+    const m0 = transform[0];
+    const m1 = transform[1];
+    const m2 = transform[2];
+    const m3 = transform[3];
+    const m4 = transform[4];
+    const m5 = transform[5];
+    for (let i = 0; i < 6; i += 2) {
+      const pI = p[pos + i];
+      const pI1 = p[pos + i + 1];
+      p[pos + i] = pI * m0 + pI1 * m2 + m4;
+      p[pos + i + 1] = pI * m1 + pI1 * m3 + m5;
+    }
+  }
+  static applyInverseTransform(p, m) {
+    const p0 = p[0];
+    const p1 = p[1];
+    const d = m[0] * m[3] - m[1] * m[2];
+    p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+    p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+  }
+  static axialAlignedBoundingBox(rect, transform, output) {
+    const m0 = transform[0];
+    const m1 = transform[1];
+    const m2 = transform[2];
+    const m3 = transform[3];
+    const m4 = transform[4];
+    const m5 = transform[5];
+    const r0 = rect[0];
+    const r1 = rect[1];
+    const r2 = rect[2];
+    const r3 = rect[3];
+    let a0 = m0 * r0 + m4;
+    let a2 = a0;
+    let a1 = m0 * r2 + m4;
+    let a3 = a1;
+    let b0 = m3 * r1 + m5;
+    let b2 = b0;
+    let b1 = m3 * r3 + m5;
+    let b3 = b1;
+    if (m1 !== 0 || m2 !== 0) {
+      const m1r0 = m1 * r0;
+      const m1r2 = m1 * r2;
+      const m2r1 = m2 * r1;
+      const m2r3 = m2 * r3;
+      a0 += m2r1;
+      a3 += m2r1;
+      a1 += m2r3;
+      a2 += m2r3;
+      b0 += m1r0;
+      b3 += m1r0;
+      b1 += m1r2;
+      b2 += m1r2;
+    }
+    output[0] = Math.min(output[0], a0, a1, a2, a3);
+    output[1] = Math.min(output[1], b0, b1, b2, b3);
+    output[2] = Math.max(output[2], a0, a1, a2, a3);
+    output[3] = Math.max(output[3], b0, b1, b2, b3);
+  }
+  static inverseTransform(m) {
+    const d = m[0] * m[3] - m[1] * m[2];
+    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+  }
+  static singularValueDecompose2dScale(matrix, output) {
+    const m0 = matrix[0];
+    const m1 = matrix[1];
+    const m2 = matrix[2];
+    const m3 = matrix[3];
+    const a = m0 ** 2 + m1 ** 2;
+    const b = m0 * m2 + m1 * m3;
+    const c = m2 ** 2 + m3 ** 2;
+    const first = (a + c) / 2;
+    const second = Math.sqrt(first ** 2 - (a * c - b ** 2));
+    output[0] = Math.sqrt(first + second || 1);
+    output[1] = Math.sqrt(first - second || 1);
+  }
+  static normalizeRect(rect) {
+    const r = rect.slice(0);
+    if (rect[0] > rect[2]) {
+      r[0] = rect[2];
+      r[2] = rect[0];
+    }
+    if (rect[1] > rect[3]) {
+      r[1] = rect[3];
+      r[3] = rect[1];
+    }
+    return r;
+  }
+  static intersect(rect1, rect2) {
+    const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2]));
+    const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2]));
+    if (xLow > xHigh) {
+      return null;
+    }
+    const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3]));
+    const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3]));
+    if (yLow > yHigh) {
+      return null;
+    }
+    return [xLow, yLow, xHigh, yHigh];
+  }
+  static pointBoundingBox(x, y, minMax) {
+    minMax[0] = Math.min(minMax[0], x);
+    minMax[1] = Math.min(minMax[1], y);
+    minMax[2] = Math.max(minMax[2], x);
+    minMax[3] = Math.max(minMax[3], y);
+  }
+  static rectBoundingBox(x0, y0, x1, y1, minMax) {
+    minMax[0] = Math.min(minMax[0], x0, x1);
+    minMax[1] = Math.min(minMax[1], y0, y1);
+    minMax[2] = Math.max(minMax[2], x0, x1);
+    minMax[3] = Math.max(minMax[3], y0, y1);
+  }
+  static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {
+    if (t <= 0 || t >= 1) {
+      return;
+    }
+    const mt = 1 - t;
+    const tt = t * t;
+    const ttt = tt * t;
+    const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;
+    const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;
+    minMax[0] = Math.min(minMax[0], x);
+    minMax[1] = Math.min(minMax[1], y);
+    minMax[2] = Math.max(minMax[2], x);
+    minMax[3] = Math.max(minMax[3], y);
+  }
+  static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {
+    if (Math.abs(a) < 1e-12) {
+      if (Math.abs(b) >= 1e-12) {
+        this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax);
+      }
+      return;
+    }
+    const delta = b ** 2 - 4 * c * a;
+    if (delta < 0) {
+      return;
+    }
+    const sqrtDelta = Math.sqrt(delta);
+    const a2 = 2 * a;
+    this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax);
+    this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax);
+  }
+  static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {
+    minMax[0] = Math.min(minMax[0], x0, x3);
+    minMax[1] = Math.min(minMax[1], y0, y3);
+    minMax[2] = Math.max(minMax[2], x0, x3);
+    minMax[3] = Math.max(minMax[3], y0, y3);
+    this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax);
+    this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax);
+  }
+}
+function stringToUTF8String(str) {
+  return decodeURIComponent(escape(str));
+}
+function utf8StringToString(str) {
+  return unescape(encodeURIComponent(str));
+}
+function isArrayEqual(arr1, arr2) {
+  if (arr1.length !== arr2.length) {
+    return false;
+  }
+  for (let i = 0, ii = arr1.length; i < ii; i++) {
+    if (arr1[i] !== arr2[i]) {
+      return false;
+    }
+  }
+  return true;
+}
+let NormalizeRegex = null;
+let NormalizationMap = null;
+function normalizeUnicode(str) {
+  if (!NormalizeRegex) {
+    NormalizeRegex = /([\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;
+    NormalizationMap = new Map([["铿�", "趴t"]]);
+  }
+  return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2));
+}
+function getUuid() {
+  if (typeof crypto.randomUUID === "function") {
+    return crypto.randomUUID();
+  }
+  const buf = new Uint8Array(32);
+  crypto.getRandomValues(buf);
+  return bytesToString(buf);
+}
+function _isValidExplicitDest(validRef, validName, dest) {
+  if (!Array.isArray(dest) || dest.length < 2) {
+    return false;
+  }
+  const [page, zoom, ...args] = dest;
+  if (!validRef(page) && !Number.isInteger(page)) {
+    return false;
+  }
+  if (!validName(zoom)) {
+    return false;
+  }
+  const argsLen = args.length;
+  let allowNull = true;
+  switch (zoom.name) {
+    case "XYZ":
+      if (argsLen < 2 || argsLen > 3) {
+        return false;
+      }
+      break;
+    case "Fit":
+    case "FitB":
+      return argsLen === 0;
+    case "FitH":
+    case "FitBH":
+    case "FitV":
+    case "FitBV":
+      if (argsLen > 1) {
+        return false;
+      }
+      break;
+    case "FitR":
+      if (argsLen !== 4) {
+        return false;
+      }
+      allowNull = false;
+      break;
+    default:
+      return false;
+  }
+  for (const arg of args) {
+    if (typeof arg === "number" || allowNull && arg === null) {
+      continue;
+    }
+    return false;
+  }
+  return true;
+}
+const makeArr = () => [];
+const makeMap = () => new Map();
+const makeObj = () => Object.create(null);
+
+;// ./src/core/primitives.js
+
+const CIRCULAR_REF = Symbol("CIRCULAR_REF");
+const EOF = Symbol("EOF");
+let CmdCache = Object.create(null);
+let NameCache = Object.create(null);
+let RefCache = Object.create(null);
+function clearPrimitiveCaches() {
+  CmdCache = Object.create(null);
+  NameCache = Object.create(null);
+  RefCache = Object.create(null);
+}
+class Name {
+  constructor(name) {
+    this.name = name;
+  }
+  static get(name) {
+    return NameCache[name] ||= new Name(name);
+  }
+}
+class Cmd {
+  constructor(cmd) {
+    this.cmd = cmd;
+  }
+  static get(cmd) {
+    return CmdCache[cmd] ||= new Cmd(cmd);
+  }
+}
+const nonSerializable = function nonSerializableClosure() {
+  return nonSerializable;
+};
+class Dict {
+  __nonSerializable__ = nonSerializable;
+  #map = new Map();
+  objId = null;
+  suppressEncryption = false;
+  xref;
+  constructor(xref = null) {
+    this.xref = xref;
+  }
+  assignXref(newXref) {
+    this.xref = newXref;
+  }
+  get size() {
+    return this.#map.size;
+  }
+  #getValue(isAsync, key1, key2, key3) {
+    let value = this.#map.get(key1);
+    if (value === undefined && key2 !== undefined) {
+      value = this.#map.get(key2);
+      if (value === undefined && key3 !== undefined) {
+        value = this.#map.get(key3);
+      }
+    }
+    if (value instanceof Ref && this.xref) {
+      return isAsync ? this.xref.fetchAsync(value, this.suppressEncryption) : this.xref.fetch(value, this.suppressEncryption);
+    }
+    return value;
+  }
+  get(key1, key2, key3) {
+    return this.#getValue(false, key1, key2, key3);
+  }
+  async getAsync(key1, key2, key3) {
+    return this.#getValue(true, key1, key2, key3);
+  }
+  getArray(key1, key2, key3) {
+    let value = this.#getValue(false, key1, key2, key3);
+    if (Array.isArray(value)) {
+      value = value.slice();
+      for (let i = 0, ii = value.length; i < ii; i++) {
+        if (value[i] instanceof Ref && this.xref) {
+          value[i] = this.xref.fetch(value[i], this.suppressEncryption);
+        }
+      }
+    }
+    return value;
+  }
+  getRaw(key) {
+    return this.#map.get(key);
+  }
+  getKeys() {
+    return this.#map.keys();
+  }
+  getRawValues() {
+    return this.#map.values();
+  }
+  getRawEntries() {
+    return this.#map.entries();
+  }
+  set(key, value) {
+    this.#map.set(key, value);
+  }
+  setIfNotExists(key, value) {
+    if (!this.has(key)) {
+      this.set(key, value);
+    }
+  }
+  setIfNumber(key, value) {
+    if (typeof value === "number") {
+      this.set(key, value);
+    }
+  }
+  setIfArray(key, value) {
+    if (Array.isArray(value) || ArrayBuffer.isView(value)) {
+      this.set(key, value);
+    }
+  }
+  setIfDefined(key, value) {
+    if (value !== undefined && value !== null) {
+      this.set(key, value);
+    }
+  }
+  setIfName(key, value) {
+    if (typeof value === "string") {
+      this.set(key, Name.get(value));
+    } else if (value instanceof Name) {
+      this.set(key, value);
+    }
+  }
+  setIfDict(key, value) {
+    if (value instanceof Dict) {
+      this.set(key, value);
+    }
+  }
+  has(key) {
+    return this.#map.has(key);
+  }
+  *[Symbol.iterator]() {
+    for (const [key, value] of this.#map) {
+      yield [key, value instanceof Ref && this.xref ? this.xref.fetch(value, this.suppressEncryption) : value];
+    }
+  }
+  static get empty() {
+    const emptyDict = new Dict(null);
+    emptyDict.set = (key, value) => {
+      unreachable("Should not call `set` on the empty dictionary.");
+    };
+    return shadow(this, "empty", emptyDict);
+  }
+  static merge({
+    xref,
+    dictArray,
+    mergeSubDicts = false
+  }) {
+    const mergedDict = new Dict(xref),
+      properties = new Map();
+    for (const dict of dictArray) {
+      if (!(dict instanceof Dict)) {
+        continue;
+      }
+      for (const [key, value] of dict.getRawEntries()) {
+        const property = properties.getOrInsertComputed(key, makeArr);
+        if (property.length && !(mergeSubDicts && value instanceof Dict)) {
+          continue;
+        }
+        property.push(value);
+      }
+    }
+    for (const [name, values] of properties) {
+      if (values.length === 1 || !(values[0] instanceof Dict)) {
+        mergedDict.set(name, values[0]);
+        continue;
+      }
+      const subDict = new Dict(xref);
+      for (const dict of values) {
+        for (const [key, value] of dict.getRawEntries()) {
+          subDict.setIfNotExists(key, value);
+        }
+      }
+      if (subDict.size > 0) {
+        mergedDict.set(name, subDict);
+      }
+    }
+    properties.clear();
+    return mergedDict.size > 0 ? mergedDict : Dict.empty;
+  }
+  clone() {
+    const dict = new Dict(this.xref);
+    for (const [key, value] of this.#map) {
+      dict.set(key, value);
+    }
+    return dict;
+  }
+  delete(key) {
+    this.#map.delete(key);
+  }
+}
+class Ref {
+  constructor(num, gen) {
+    this.num = num;
+    this.gen = gen;
+  }
+  toString() {
+    if (this.gen === 0) {
+      return `${this.num}R`;
+    }
+    return `${this.num}R${this.gen}`;
+  }
+  static fromString(str) {
+    const ref = RefCache[str];
+    if (ref) {
+      return ref;
+    }
+    const m = /^(\d+)R(\d*)$/.exec(str);
+    if (!m || m[1] === "0") {
+      return null;
+    }
+    return RefCache[str] = new Ref(parseInt(m[1], 10), !m[2] ? 0 : parseInt(m[2], 10));
+  }
+  static get(num, gen) {
+    const key = gen === 0 ? `${num}R` : `${num}R${gen}`;
+    return RefCache[key] ||= new Ref(num, gen);
+  }
+}
+class RefSet {
+  constructor(parent = null) {
+    this._set = new Set(parent?._set);
+  }
+  has(ref) {
+    return this._set.has(ref.toString());
+  }
+  put(ref) {
+    this._set.add(ref.toString());
+  }
+  remove(ref) {
+    this._set.delete(ref.toString());
+  }
+  [Symbol.iterator]() {
+    return this._set.values();
+  }
+  clear() {
+    this._set.clear();
+  }
+}
+class RefSetCache {
+  _map = new Map();
+  get size() {
+    return this._map.size;
+  }
+  get(ref) {
+    return this._map.get(ref.toString());
+  }
+  has(ref) {
+    return this._map.has(ref.toString());
+  }
+  put(ref, obj) {
+    this._map.set(ref.toString(), obj);
+  }
+  putAlias(ref, aliasRef) {
+    this._map.set(ref.toString(), this.get(aliasRef));
+  }
+  [Symbol.iterator]() {
+    return this._map.values();
+  }
+  clear() {
+    this._map.clear();
+  }
+  *values() {
+    yield* this._map.values();
+  }
+  *items() {
+    for (const [ref, value] of this._map) {
+      yield [Ref.fromString(ref), value];
+    }
+  }
+  *keys() {
+    for (const ref of this._map.keys()) {
+      yield Ref.fromString(ref);
+    }
+  }
+}
+function isName(v, name) {
+  return v instanceof Name && (name === undefined || v.name === name);
+}
+function isCmd(v, cmd) {
+  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
+}
+function isDict(v, type) {
+  return v instanceof Dict && (type === undefined || isName(v.get("Type"), type));
+}
+function isRefsEqual(v1, v2) {
+  return v1.num === v2.num && v1.gen === v2.gen;
+}
+
+;// ./src/core/base_stream.js
+
+class BaseStream {
+  get length() {
+    unreachable("Abstract getter `length` accessed");
+  }
+  get isEmpty() {
+    unreachable("Abstract getter `isEmpty` accessed");
+  }
+  get isDataLoaded() {
+    return shadow(this, "isDataLoaded", true);
+  }
+  getByte() {
+    unreachable("Abstract method `getByte` called");
+  }
+  getBytes(length) {
+    unreachable("Abstract method `getBytes` called");
+  }
+  async getImageData(length, decoderOptions) {
+    return this.getBytes(length, decoderOptions);
+  }
+  async asyncGetBytes() {
+    unreachable("Abstract method `asyncGetBytes` called");
+  }
+  get isAsync() {
+    return false;
+  }
+  get isAsyncDecoder() {
+    return false;
+  }
+  get isImageStream() {
+    return false;
+  }
+  get canAsyncDecodeImageFromBuffer() {
+    return false;
+  }
+  async getTransferableImage() {
+    return null;
+  }
+  peekByte() {
+    const peekedByte = this.getByte();
+    if (peekedByte !== -1) {
+      this.pos--;
+    }
+    return peekedByte;
+  }
+  peekBytes(length) {
+    const bytes = this.getBytes(length);
+    this.pos -= bytes.length;
+    return bytes;
+  }
+  getUint16() {
+    const b0 = this.getByte();
+    const b1 = this.getByte();
+    if (b0 === -1 || b1 === -1) {
+      return -1;
+    }
+    return (b0 << 8) + b1;
+  }
+  getInt32() {
+    const b0 = this.getByte();
+    const b1 = this.getByte();
+    const b2 = this.getByte();
+    const b3 = this.getByte();
+    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+  }
+  getByteRange(begin, end) {
+    unreachable("Abstract method `getByteRange` called");
+  }
+  getString(length) {
+    return bytesToString(this.getBytes(length));
+  }
+  skip(n) {
+    this.pos += n || 1;
+  }
+  reset() {
+    unreachable("Abstract method `reset` called");
+  }
+  moveStart() {
+    unreachable("Abstract method `moveStart` called");
+  }
+  makeSubStream(start, length, dict = null) {
+    unreachable("Abstract method `makeSubStream` called");
+  }
+  clone() {
+    unreachable("Abstract method `clone` called");
+  }
+  getBaseStreams() {
+    return null;
+  }
+  getOriginalStream() {
+    return this.stream?.getOriginalStream() || this;
+  }
+}
+
+;// ./src/core/string_utils.js
+
+function isAscii(str) {
+  return typeof str === "string" && (!str || /^[\x00-\x7F]*$/.test(str));
+}
+function stringToAsciiOrUTF16BE(str) {
+  if (str === null || str === undefined) {
+    return str;
+  }
+  return isAscii(str) ? str : stringToUTF16String(str, true);
+}
+function stringToUTF16HexString(str) {
+  const buf = [];
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.charCodeAt(i);
+    buf.push(Util.hexNums[char >> 8 & 0xff], Util.hexNums[char & 0xff]);
+  }
+  return buf.join("");
+}
+function stringToUTF16String(str, bigEndian = false) {
+  const buf = [];
+  if (bigEndian) {
+    buf.push("\xFE\xFF");
+  }
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.charCodeAt(i);
+    buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff));
+  }
+  return buf.join("");
+}
+const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 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, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac];
+function stringToPDFString(str, keepEscapeSequence = false) {
+  if (str[0] >= "\xEF") {
+    let encoding;
+    if (str[0] === "\xFE" && str[1] === "\xFF") {
+      encoding = "utf-16be";
+      if (str.length % 2 === 1) {
+        str = str.slice(0, -1);
+      }
+    } else if (str[0] === "\xFF" && str[1] === "\xFE") {
+      encoding = "utf-16le";
+      if (str.length % 2 === 1) {
+        str = str.slice(0, -1);
+      }
+    } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") {
+      encoding = "utf-8";
+    }
+    if (encoding) {
+      try {
+        const decoder = new TextDecoder(encoding, {
+          fatal: true
+        });
+        const buffer = stringToBytes(str);
+        const decoded = decoder.decode(buffer);
+        if (keepEscapeSequence || !decoded.includes("\x1b")) {
+          return decoded;
+        }
+        return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, "");
+      } catch (ex) {
+        warn(`stringToPDFString: "${ex}".`);
+      }
+    }
+  }
+  const strBuf = [];
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const charCode = str.charCodeAt(i);
+    if (!keepEscapeSequence && charCode === 0x1b) {
+      while (++i < ii && str.charCodeAt(i) !== 0x1b) {}
+      continue;
+    }
+    const code = PDFStringTranslateTable[charCode];
+    strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
+  }
+  return strBuf.join("");
+}
+
+;// ./src/core/core_utils.js
+
+
+
+
+const PDF_VERSION_REGEXP = /^[1-9]\.\d$/;
+const MAX_INT_32 = 2 ** 31 - 1;
+const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+const RESOURCES_KEYS_OPERATOR_LIST = ["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"];
+const RESOURCES_KEYS_TEXT_CONTENT = ["ExtGState", "Font", "Properties", "XObject"];
+function getLookupTableFactory(initializer) {
+  let lookup;
+  return function () {
+    if (initializer) {
+      lookup = Object.create(null);
+      initializer(lookup);
+      initializer = null;
+    }
+    return lookup;
+  };
+}
+class MissingDataException extends BaseException {
+  constructor(begin, end) {
+    super(`Missing data [${begin}, ${end})`, "MissingDataException");
+    this.begin = begin;
+    this.end = end;
+  }
+}
+class ParserEOFException extends BaseException {
+  constructor(msg) {
+    super(msg, "ParserEOFException");
+  }
+}
+class XRefEntryException extends BaseException {
+  constructor(msg) {
+    super(msg, "XRefEntryException");
+  }
+}
+class XRefParseException extends BaseException {
+  constructor(msg) {
+    super(msg, "XRefParseException");
+  }
+}
+function arrayBuffersToBytes(arr) {
+  const length = arr.length;
+  if (length === 0) {
+    return new Uint8Array(0);
+  }
+  if (length === 1) {
+    return new Uint8Array(arr[0]);
+  }
+  let dataLength = 0;
+  for (let i = 0; i < length; i++) {
+    dataLength += arr[i].byteLength;
+  }
+  const data = new Uint8Array(dataLength);
+  let pos = 0;
+  for (let i = 0; i < length; i++) {
+    const item = new Uint8Array(arr[i]);
+    data.set(item, pos);
+    pos += item.byteLength;
+  }
+  return data;
+}
+async function fetchBinaryData(url) {
+  const response = await fetch(url);
+  if (!response.ok) {
+    throw new Error(`Failed to fetch file "${url}" with "${response.statusText}".`);
+  }
+  return response.bytes();
+}
+function getInheritableProperty({
+  dict,
+  key,
+  getArray = false,
+  stopWhenFound = true
+}) {
+  let values;
+  const visited = new RefSet();
+  while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) {
+    if (dict.objId) {
+      visited.put(dict.objId);
+    }
+    const value = getArray ? dict.getArray(key) : dict.get(key);
+    if (value !== undefined) {
+      if (stopWhenFound) {
+        return value;
+      }
+      (values ||= []).push(value);
+    }
+    dict = dict.get("Parent");
+  }
+  return values;
+}
+function getParentToUpdate(dict, ref, xref) {
+  const visited = new RefSet();
+  const firstDict = dict;
+  const result = {
+    dict: null,
+    ref: null
+  };
+  while (dict instanceof Dict && !visited.has(ref)) {
+    visited.put(ref);
+    if (dict.has("T")) {
+      break;
+    }
+    ref = dict.getRaw("Parent");
+    if (!(ref instanceof Ref)) {
+      return result;
+    }
+    dict = xref.fetch(ref);
+  }
+  if (dict instanceof Dict && dict !== firstDict) {
+    result.dict = dict;
+    result.ref = ref;
+  }
+  return result;
+}
+function deepCompare(a, b) {
+  if (a === b) {
+    return true;
+  }
+  if (a instanceof Ref && b instanceof Ref) {
+    return isRefsEqual(a, b);
+  }
+  if (a instanceof Name && b instanceof Name) {
+    return a.name === b.name;
+  }
+  if (a instanceof Dict && b instanceof Dict) {
+    if (a.size !== b.size) {
+      return false;
+    }
+    for (const [key, value1] of a.getRawEntries()) {
+      const value2 = b.getRaw(key);
+      if (value2 === undefined || !deepCompare(value1, value2)) {
+        return false;
+      }
+    }
+    return true;
+  }
+  if (Array.isArray(a) && Array.isArray(b)) {
+    if (a.length !== b.length) {
+      return false;
+    }
+    for (let i = 0, ii = a.length; i < ii; i++) {
+      if (!deepCompare(a[i], b[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+  return false;
+}
+const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
+function toRomanNumerals(number, lowerCase = false) {
+  assert(Number.isInteger(number) && number > 0, "The number should be a positive integer.");
+  const roman = "M".repeat(number / 1000 | 0) + ROMAN_NUMBER_MAP[number % 1000 / 100 | 0] + ROMAN_NUMBER_MAP[10 + (number % 100 / 10 | 0)] + ROMAN_NUMBER_MAP[20 + number % 10];
+  return lowerCase ? roman.toLowerCase() : roman;
+}
+function isWhiteSpace(ch) {
+  return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a;
+}
+function isBooleanArray(arr, len) {
+  return Array.isArray(arr) && (len === null || arr.length === len) && arr.every(x => typeof x === "boolean");
+}
+function isNumberArray(arr, len) {
+  if (Array.isArray(arr)) {
+    return (len === null || arr.length === len) && arr.every(x => typeof x === "number");
+  }
+  return ArrayBuffer.isView(arr) && !(arr instanceof BigInt64Array || arr instanceof BigUint64Array) && (len === null || arr.length === len);
+}
+function lookupMatrix(arr, fallback) {
+  return isNumberArray(arr, 6) ? arr : fallback;
+}
+function lookupRect(arr, fallback) {
+  return isNumberArray(arr, 4) ? arr : fallback;
+}
+function lookupNormalRect(arr, fallback) {
+  return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback;
+}
+function parseXFAPath(path) {
+  const positionPattern = /(.+)\[(\d+)\]$/;
+  return path.split(".").map(component => {
+    const m = component.match(positionPattern);
+    if (m) {
+      return {
+        name: m[1],
+        pos: parseInt(m[2], 10)
+      };
+    }
+    return {
+      name: component,
+      pos: 0
+    };
+  });
+}
+function escapePDFName(str) {
+  const buffer = [];
+  let start = 0;
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.charCodeAt(i);
+    if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char === 0x25) {
+      if (start < i) {
+        buffer.push(str.substring(start, i));
+      }
+      buffer.push(`#${char.toString(16)}`);
+      start = i + 1;
+    }
+  }
+  if (buffer.length === 0) {
+    return str;
+  }
+  if (start < str.length) {
+    buffer.push(str.substring(start));
+  }
+  return buffer.join("");
+}
+function escapeString(str) {
+  return str.replaceAll(/([()\\\n\r])/g, match => {
+    if (match === "\n") {
+      return "\\n";
+    } else if (match === "\r") {
+      return "\\r";
+    }
+    return `\\${match}`;
+  });
+}
+function _collectJS(entry, xref, list, parents) {
+  if (!entry) {
+    return;
+  }
+  let parent = null;
+  if (entry instanceof Ref) {
+    if (parents.has(entry)) {
+      return;
+    }
+    parent = entry;
+    parents.put(parent);
+    entry = xref.fetch(entry);
+  }
+  if (Array.isArray(entry)) {
+    for (const element of entry) {
+      _collectJS(element, xref, list, parents);
+    }
+  } else if (entry instanceof Dict) {
+    if (isName(entry.get("S"), "JavaScript")) {
+      const js = entry.get("JS");
+      let code;
+      if (js instanceof BaseStream) {
+        code = js.getString();
+      } else if (typeof js === "string") {
+        code = js;
+      }
+      code &&= stringToPDFString(code, true).replaceAll("\x00", "");
+      if (code) {
+        list.push(code.trim());
+      }
+    }
+    _collectJS(entry.getRaw("Next"), xref, list, parents);
+  }
+  if (parent) {
+    parents.remove(parent);
+  }
+}
+function collectActions(xref, dict, eventType) {
+  const actions = Object.create(null);
+  const additionalActionsDicts = getInheritableProperty({
+    dict,
+    key: "AA",
+    stopWhenFound: false
+  });
+  if (additionalActionsDicts) {
+    for (let i = additionalActionsDicts.length - 1; i >= 0; i--) {
+      const additionalActions = additionalActionsDicts[i];
+      if (!(additionalActions instanceof Dict)) {
+        continue;
+      }
+      for (const [key, rawActionDict] of additionalActions.getRawEntries()) {
+        const action = eventType[key];
+        if (!action) {
+          continue;
+        }
+        const parents = new RefSet();
+        const list = [];
+        _collectJS(rawActionDict, xref, list, parents);
+        if (list.length > 0) {
+          actions[action] = list;
+        }
+      }
+    }
+  }
+  if (dict.has("A")) {
+    const actionDict = dict.get("A");
+    const parents = new RefSet();
+    const list = [];
+    _collectJS(actionDict, xref, list, parents);
+    if (list.length > 0) {
+      actions.Action = list;
+    }
+  }
+  return objectSize(actions) > 0 ? actions : null;
+}
+const XMLEntities = {
+  0x3c: "&lt;",
+  0x3e: "&gt;",
+  0x26: "&amp;",
+  0x22: "&quot;",
+  0x27: "&apos;"
+};
+function* codePointIter(str) {
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.codePointAt(i);
+    if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {
+      i++;
+    }
+    yield char;
+  }
+}
+function encodeToXmlString(str) {
+  const buffer = [];
+  let start = 0;
+  for (let i = 0, ii = str.length; i < ii; i++) {
+    const char = str.codePointAt(i);
+    if (0x20 <= char && char <= 0x7e) {
+      const entity = XMLEntities[char];
+      if (entity) {
+        if (start < i) {
+          buffer.push(str.substring(start, i));
+        }
+        buffer.push(entity);
+        start = i + 1;
+      }
+    } else {
+      if (start < i) {
+        buffer.push(str.substring(start, i));
+      }
+      buffer.push(`&#x${char.toString(16).toUpperCase()};`);
+      if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {
+        i++;
+      }
+      start = i + 1;
+    }
+  }
+  if (buffer.length === 0) {
+    return str;
+  }
+  if (start < str.length) {
+    buffer.push(str.substring(start));
+  }
+  return buffer.join("");
+}
+function validateFontName(fontFamily, mustWarn = false) {
+  const m = /^("|').*("|')$/.exec(fontFamily);
+  if (m && m[1] === m[2]) {
+    const re = new RegExp(`[^\\\\]${m[1]}`);
+    if (re.test(fontFamily.slice(1, -1))) {
+      if (mustWarn) {
+        warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`);
+      }
+      return false;
+    }
+  } else {
+    for (const ident of fontFamily.split(/[ \t]+/)) {
+      if (/^(?:\d|-[\d-])/.test(ident) || !/^[\w\\-]+$/.test(ident)) {
+        if (mustWarn) {
+          warn(`FontFamily contains invalid <custom-ident>: ${fontFamily}.`);
+        }
+        return false;
+      }
+    }
+  }
+  return true;
+}
+function validateCSSFont(cssFontInfo) {
+  const DEFAULT_CSS_FONT_OBLIQUE = "14";
+  const DEFAULT_CSS_FONT_WEIGHT = "400";
+  const CSS_FONT_WEIGHT_VALUES = new Set(["100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "normal", "bold", "bolder", "lighter"]);
+  const {
+    fontFamily,
+    fontWeight,
+    italicAngle
+  } = cssFontInfo;
+  if (!validateFontName(fontFamily, true)) {
+    return false;
+  }
+  const weight = fontWeight ? fontWeight.toString() : "";
+  cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight) ? weight : DEFAULT_CSS_FONT_WEIGHT;
+  const angle = parseFloat(italicAngle);
+  cssFontInfo.italicAngle = isNaN(angle) || angle < -90 || angle > 90 ? DEFAULT_CSS_FONT_OBLIQUE : italicAngle.toString();
+  return true;
+}
+function recoverJsURL(str) {
+  const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"];
+  const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i");
+  const jsUrl = regex.exec(str);
+  if (jsUrl?.[2]) {
+    return {
+      url: jsUrl[2],
+      newWindow: jsUrl[1] === "app.launchURL" && jsUrl[3] === "true"
+    };
+  }
+  return null;
+}
+function numberToString(value) {
+  if (Number.isInteger(value)) {
+    return value.toString();
+  }
+  const roundedValue = Math.round(value * 100);
+  if (roundedValue % 100 === 0) {
+    return (roundedValue / 100).toString();
+  }
+  if (roundedValue % 10 === 0) {
+    return value.toFixed(1);
+  }
+  return value.toFixed(2);
+}
+function getNewAnnotationsMap(annotationStorage) {
+  if (!annotationStorage) {
+    return null;
+  }
+  const newAnnotationsByPage = new Map();
+  for (const [key, value] of annotationStorage) {
+    if (!key.startsWith(AnnotationEditorPrefix)) {
+      continue;
+    }
+    newAnnotationsByPage.getOrInsertComputed(value.pageIndex, makeArr).push(value);
+  }
+  return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null;
+}
+function getModificationDate(date = new Date()) {
+  if (!(date instanceof Date)) {
+    date = new Date(date);
+  }
+  const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")];
+  return buffer.join("");
+}
+function getRotationMatrix(rotation, width, height) {
+  switch (rotation) {
+    case 90:
+      return [0, 1, -1, 0, width, 0];
+    case 180:
+      return [-1, 0, 0, -1, width, height];
+    case 270:
+      return [0, -1, 1, 0, 0, height];
+    default:
+      throw new Error("Invalid rotation");
+  }
+}
+function getSizeInBytes(x) {
+  return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8);
+}
+
+;// ./external/qcms/qcms_utils.js
+class QCMS {
+  static #memoryArray = null;
+  static _memory = null;
+  static _mustAddAlpha = false;
+  static _destBuffer = null;
+  static _destOffset = 0;
+  static _destLength = 0;
+  static _cssColor = "";
+  static _makeHexColor = null;
+  static get _memoryArray() {
+    const array = this.#memoryArray;
+    if (array?.byteLength) {
+      return array;
+    }
+    return this.#memoryArray = new Uint8Array(this._memory.buffer);
+  }
+}
+function copy_result(ptr, len) {
+  const {
+    _mustAddAlpha,
+    _destBuffer,
+    _destOffset,
+    _destLength,
+    _memoryArray
+  } = QCMS;
+  if (len === _destLength) {
+    _destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset);
+    return;
+  }
+  if (_mustAddAlpha) {
+    for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) {
+      _destBuffer[j] = _memoryArray[i];
+      _destBuffer[j + 1] = _memoryArray[i + 1];
+      _destBuffer[j + 2] = _memoryArray[i + 2];
+      _destBuffer[j + 3] = 255;
+    }
+  } else {
+    for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) {
+      _destBuffer[j] = _memoryArray[i];
+      _destBuffer[j + 1] = _memoryArray[i + 1];
+      _destBuffer[j + 2] = _memoryArray[i + 2];
+    }
+  }
+}
+function copy_rgb(ptr) {
+  const {
+    _destBuffer,
+    _destOffset,
+    _memoryArray
+  } = QCMS;
+  _destBuffer[_destOffset] = _memoryArray[ptr];
+  _destBuffer[_destOffset + 1] = _memoryArray[ptr + 1];
+  _destBuffer[_destOffset + 2] = _memoryArray[ptr + 2];
+}
+function make_cssRGB(ptr) {
+  const {
+    _memoryArray
+  } = QCMS;
+  QCMS._cssColor = QCMS._makeHexColor(_memoryArray[ptr], _memoryArray[ptr + 1], _memoryArray[ptr + 2]);
+}
+
+;// ./external/qcms/qcms.js
+
+const DataType = 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"
+});
+const Intent = Object.freeze({
+  Perceptual: 0,
+  "0": "Perceptual",
+  RelativeColorimetric: 1,
+  "1": "RelativeColorimetric",
+  Saturation: 2,
+  "2": "Saturation",
+  AbsoluteColorimetric: 3,
+  "3": "AbsoluteColorimetric"
+});
+function qcms_convert_array(transformer, src) {
+  const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc);
+  const len0 = WASM_VECTOR_LEN;
+  wasm.qcms_convert_array(transformer, ptr0, len0);
+}
+function qcms_convert_four(transformer, src1, src2, src3, src4, css) {
+  wasm.qcms_convert_four(transformer, src1, src2, src3, src4, css);
+}
+function qcms_convert_one(transformer, src, css) {
+  wasm.qcms_convert_one(transformer, src, css);
+}
+function qcms_convert_three(transformer, src1, src2, src3, css) {
+  wasm.qcms_convert_three(transformer, src1, src2, src3, css);
+}
+function qcms_drop_transformer(transformer) {
+  wasm.qcms_drop_transformer(transformer);
+}
+function qcms_transformer_from_memory(mem, in_type, intent) {
+  const ptr0 = passArray8ToWasm0(mem, wasm.__wbindgen_malloc);
+  const len0 = WASM_VECTOR_LEN;
+  const ret = wasm.qcms_transformer_from_memory(ptr0, len0, in_type, intent);
+  return ret >>> 0;
+}
+function __wbg_get_imports() {
+  const import0 = {
+    __proto__: null,
+    __wbg___wbindgen_throw_6b64449b9b9ed33c: function (arg0, arg1) {
+      throw new Error(getStringFromWasm0(arg0, arg1));
+    },
+    __wbg_copy_result_0d15f3bf9d9012ae: function (arg0, arg1) {
+      copy_result(arg0 >>> 0, arg1 >>> 0);
+    },
+    __wbg_copy_rgb_0106d9d9464fce43: function (arg0) {
+      copy_rgb(arg0 >>> 0);
+    },
+    __wbg_make_cssRGB_8e24b34f71f5363e: function (arg0) {
+      make_cssRGB(arg0 >>> 0);
+    },
+    __wbindgen_init_externref_table: function () {
+      const table = wasm.__wbindgen_externrefs;
+      const offset = table.grow(4);
+      table.set(0, undefined);
+      table.set(offset + 0, undefined);
+      table.set(offset + 1, null);
+      table.set(offset + 2, true);
+      table.set(offset + 3, false);
+    }
+  };
+  return {
+    __proto__: null,
+    "./qcms_bg.js": import0
+  };
+}
+function getStringFromWasm0(ptr, len) {
+  ptr = ptr >>> 0;
+  return decodeText(ptr, len);
+}
+let cachedUint8ArrayMemory0 = null;
+function getUint8ArrayMemory0() {
+  if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
+    cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
+  }
+  return cachedUint8ArrayMemory0;
+}
+function passArray8ToWasm0(arg, malloc) {
+  const ptr = malloc(arg.length * 1, 1) >>> 0;
+  getUint8ArrayMemory0().set(arg, ptr / 1);
+  WASM_VECTOR_LEN = arg.length;
+  return ptr;
+}
+let cachedTextDecoder = new TextDecoder('utf-8', {
+  ignoreBOM: true,
+  fatal: true
+});
+cachedTextDecoder.decode();
+const MAX_SAFARI_DECODE_BYTES = 2146435072;
+let numBytesDecoded = 0;
+function decodeText(ptr, len) {
+  numBytesDecoded += len;
+  if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {
+    cachedTextDecoder = new TextDecoder('utf-8', {
+      ignoreBOM: true,
+      fatal: true
+    });
+    cachedTextDecoder.decode();
+    numBytesDecoded = len;
+  }
+  return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
+}
+let WASM_VECTOR_LEN = 0;
+let wasmModule, wasm;
+function __wbg_finalize_init(instance, module) {
+  wasm = instance.exports;
+  wasmModule = module;
+  cachedUint8ArrayMemory0 = null;
+  wasm.__wbindgen_start();
+  return wasm;
+}
+async function __wbg_load(module, imports) {
+  if (typeof Response === 'function' && module instanceof Response) {
+    if (typeof WebAssembly.instantiateStreaming === 'function') {
+      try {
+        return await WebAssembly.instantiateStreaming(module, imports);
+      } catch (e) {
+        const validResponse = module.ok && expectedResponseType(module.type);
+        if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {
+          console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
+        } else {
+          throw e;
+        }
+      }
+    }
+    const bytes = await module.arrayBuffer();
+    return await WebAssembly.instantiate(bytes, imports);
+  } else {
+    const instance = await WebAssembly.instantiate(module, imports);
+    if (instance instanceof WebAssembly.Instance) {
+      return {
+        instance,
+        module
+      };
+    } else {
+      return instance;
+    }
+  }
+  function expectedResponseType(type) {
+    switch (type) {
+      case 'basic':
+      case 'cors':
+      case 'default':
+        return true;
+    }
+    return false;
+  }
+}
+function initSync(module) {
+  if (wasm !== undefined) return wasm;
+  if (module !== undefined) {
+    if (Object.getPrototypeOf(module) === Object.prototype) {
+      ({
+        module
+      } = module);
+    } else {
+      console.warn('using deprecated parameters for `initSync()`; pass a single object instead');
+    }
+  }
+  const imports = __wbg_get_imports();
+  if (!(module instanceof WebAssembly.Module)) {
+    module = new WebAssembly.Module(module);
+  }
+  const instance = new WebAssembly.Instance(module, imports);
+  return __wbg_finalize_init(instance, module);
+}
+async function __wbg_init(module_or_path) {
+  if (wasm !== undefined) return wasm;
+  if (module_or_path !== undefined) {
+    if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
+      ({
+        module_or_path
+      } = module_or_path);
+    } else {
+      console.warn('using deprecated parameters for the initialization function; pass a single object instead');
+    }
+  }
+  const imports = __wbg_get_imports();
+  if (typeof module_or_path === 'string' || typeof Request === 'function' && module_or_path instanceof Request || typeof URL === 'function' && module_or_path instanceof URL) {
+    module_or_path = fetch(module_or_path);
+  }
+  const {
+    instance,
+    module
+  } = await __wbg_load(await module_or_path, imports);
+  return __wbg_finalize_init(instance, module);
+}
+
+;// ./src/shared/math_clamp.js
+function MathClamp(v, min, max) {
+  return Math.min(Math.max(v, min), max);
+}
+
+;// ./src/core/colorspace.js
+
+
+
+function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {
+  const COMPONENTS = 3;
+  alpha01 = alpha01 !== 1 ? 0 : alpha01;
+  const xRatio = w1 / w2;
+  const yRatio = h1 / h2;
+  let newIndex = 0,
+    oldIndex;
+  const xScaled = new Uint16Array(w2);
+  const w1Scanline = w1 * COMPONENTS;
+  for (let i = 0; i < w2; i++) {
+    xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;
+  }
+  for (let i = 0; i < h2; i++) {
+    const py = Math.floor(i * yRatio) * w1Scanline;
+    for (let j = 0; j < w2; j++) {
+      oldIndex = py + xScaled[j];
+      dest[newIndex++] = src[oldIndex++];
+      dest[newIndex++] = src[oldIndex++];
+      dest[newIndex++] = src[oldIndex++];
+      newIndex += alpha01;
+    }
+  }
+}
+function resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) {
+  const xRatio = w1 / w2;
+  const yRatio = h1 / h2;
+  let newIndex = 0;
+  const xScaled = new Uint16Array(w2);
+  if (alpha01 === 1) {
+    for (let i = 0; i < w2; i++) {
+      xScaled[i] = Math.floor(i * xRatio);
+    }
+    const src32 = new Uint32Array(src.buffer);
+    const dest32 = new Uint32Array(dest.buffer);
+    const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00;
+    for (let i = 0; i < h2; i++) {
+      const buf = src32.subarray(Math.floor(i * yRatio) * w1);
+      for (let j = 0; j < w2; j++) {
+        dest32[newIndex++] |= buf[xScaled[j]] & rgbMask;
+      }
+    }
+  } else {
+    const COMPONENTS = 4;
+    const w1Scanline = w1 * COMPONENTS;
+    for (let i = 0; i < w2; i++) {
+      xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;
+    }
+    for (let i = 0; i < h2; i++) {
+      const buf = src.subarray(Math.floor(i * yRatio) * w1Scanline);
+      for (let j = 0; j < w2; j++) {
+        const oldIndex = xScaled[j];
+        dest[newIndex++] = buf[oldIndex];
+        dest[newIndex++] = buf[oldIndex + 1];
+        dest[newIndex++] = buf[oldIndex + 2];
+      }
+    }
+  }
+}
+function copyRgbaImage(src, dest, alpha01) {
+  if (alpha01 === 1) {
+    const src32 = new Uint32Array(src.buffer);
+    const dest32 = new Uint32Array(dest.buffer);
+    const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00;
+    for (let i = 0, ii = src32.length; i < ii; i++) {
+      dest32[i] |= src32[i] & rgbMask;
+    }
+  } else {
+    let j = 0;
+    for (let i = 0, ii = src.length; i < ii; i += 4) {
+      dest[j++] = src[i];
+      dest[j++] = src[i + 1];
+      dest[j++] = src[i + 2];
+    }
+  }
+}
+function isDefaultDecodeHelper(decode, expectedLen) {
+  if (!Array.isArray(decode)) {
+    return true;
+  }
+  const decodeLen = decode.length;
+  if (decodeLen < expectedLen) {
+    warn("Decode map length is too short.");
+    return true;
+  }
+  if (decodeLen > expectedLen) {
+    info("Truncating too long decode map.");
+    decode.length = expectedLen;
+  }
+  return false;
+}
+class ColorSpace {
+  static #rgbBuf = new Uint8ClampedArray(3);
+  constructor(name, numComps) {
+    this.name = name;
+    this.numComps = numComps;
+  }
+  getRgb(src, srcOffset, output = new Uint8ClampedArray(3)) {
+    this.getRgbItem(src, srcOffset, output, 0);
+    return output;
+  }
+  getRgbHex(src, srcOffset) {
+    const buffer = this.getRgb(src, srcOffset, ColorSpace.#rgbBuf);
+    return Util.makeHexColor(buffer[0], buffer[1], buffer[2]);
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    unreachable("Should not call ColorSpace.getRgbItem");
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    unreachable("Should not call ColorSpace.getRgbBuffer");
+  }
+  getOutputLength(inputLength, alpha01) {
+    unreachable("Should not call ColorSpace.getOutputLength");
+  }
+  isPassthrough(bits) {
+    return false;
+  }
+  isDefaultDecode(decode, bpc) {
+    return ColorSpace.isDefaultDecode(decode, this.numComps);
+  }
+  fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {
+    const count = originalWidth * originalHeight;
+    let rgbBuf = null;
+    const numComponentColors = 1 << bpc;
+    const needsResizing = originalHeight !== height || originalWidth !== width;
+    if (this.isPassthrough(bpc)) {
+      rgbBuf = comps;
+    } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name !== "DeviceRGB") {
+      const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);
+      for (let i = 0; i < numComponentColors; i++) {
+        allColors[i] = i;
+      }
+      const colorMap = new Uint8ClampedArray(numComponentColors * 3);
+      this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);
+      if (!needsResizing) {
+        let destPos = 0;
+        for (let i = 0; i < count; ++i) {
+          const key = comps[i] * 3;
+          dest[destPos++] = colorMap[key];
+          dest[destPos++] = colorMap[key + 1];
+          dest[destPos++] = colorMap[key + 2];
+          destPos += alpha01;
+        }
+      } else {
+        rgbBuf = new Uint8Array(count * 3);
+        let rgbPos = 0;
+        for (let i = 0; i < count; ++i) {
+          const key = comps[i] * 3;
+          rgbBuf[rgbPos++] = colorMap[key];
+          rgbBuf[rgbPos++] = colorMap[key + 1];
+          rgbBuf[rgbPos++] = colorMap[key + 2];
+        }
+      }
+    } else if (!needsResizing) {
+      this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);
+    } else {
+      rgbBuf = new Uint8ClampedArray(count * 3);
+      this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);
+    }
+    if (rgbBuf) {
+      if (needsResizing) {
+        resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01);
+      } else {
+        let destPos = 0,
+          rgbPos = 0;
+        for (let i = 0, ii = width * actualHeight; i < ii; i++) {
+          dest[destPos++] = rgbBuf[rgbPos++];
+          dest[destPos++] = rgbBuf[rgbPos++];
+          dest[destPos++] = rgbBuf[rgbPos++];
+          destPos += alpha01;
+        }
+      }
+    }
+  }
+  get usesZeroToOneRange() {
+    return shadow(this, "usesZeroToOneRange", true);
+  }
+  static isDefaultDecode(decode, numComps) {
+    if (isDefaultDecodeHelper(decode, numComps * 2)) {
+      return true;
+    }
+    for (let i = 0, ii = decode.length; i < ii; i += 2) {
+      if (decode[i] !== 0 || decode[i + 1] !== 1) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+class AlternateCS extends ColorSpace {
+  constructor(numComps, base, tintFn) {
+    super("Alternate", numComps);
+    this.base = base;
+    this.tintFn = tintFn;
+    this.tmpBuf = new Float32Array(base.numComps);
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    const tmpBuf = this.tmpBuf;
+    this.tintFn(src, srcOffset, tmpBuf, 0);
+    this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const tintFn = this.tintFn;
+    const base = this.base;
+    const scale = 1 / ((1 << bits) - 1);
+    const baseNumComps = base.numComps;
+    const usesZeroToOneRange = base.usesZeroToOneRange;
+    const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;
+    let pos = isPassthrough ? destOffset : 0;
+    const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count);
+    const numComps = this.numComps;
+    const scaled = new Float32Array(numComps);
+    const tinted = new Float32Array(baseNumComps);
+    let i, j;
+    for (i = 0; i < count; i++) {
+      for (j = 0; j < numComps; j++) {
+        scaled[j] = src[srcOffset++] * scale;
+      }
+      tintFn(scaled, 0, tinted, 0);
+      if (usesZeroToOneRange) {
+        for (j = 0; j < baseNumComps; j++) {
+          baseBuf[pos++] = tinted[j] * 255;
+        }
+      } else {
+        base.getRgbItem(tinted, 0, baseBuf, pos);
+        pos += baseNumComps;
+      }
+    }
+    if (!isPassthrough) {
+      base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
+    }
+  }
+  getOutputLength(inputLength, alpha01) {
+    return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);
+  }
+}
+class PatternCS extends ColorSpace {
+  constructor(baseCS) {
+    super("Pattern", null);
+    this.base = baseCS;
+  }
+  isDefaultDecode(decode, bpc) {
+    unreachable("Should not call PatternCS.isDefaultDecode");
+  }
+}
+class IndexedCS extends ColorSpace {
+  constructor(base, highVal, lookup) {
+    super("Indexed", 1);
+    this.base = base;
+    this.highVal = highVal;
+    const length = base.numComps * (highVal + 1);
+    this.lookup = new Uint8Array(length);
+    if (lookup instanceof BaseStream) {
+      const bytes = lookup.getBytes(length);
+      this.lookup.set(bytes);
+    } else if (typeof lookup === "string") {
+      for (let i = 0; i < length; ++i) {
+        this.lookup[i] = lookup.charCodeAt(i) & 0xff;
+      }
+    } else {
+      throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`);
+    }
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    const {
+      base,
+      highVal,
+      lookup
+    } = this;
+    const start = MathClamp(Math.round(src[srcOffset]), 0, highVal) * base.numComps;
+    base.getRgbBuffer(lookup, start, 1, dest, destOffset, 8, 0);
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const {
+      base,
+      highVal,
+      lookup
+    } = this;
+    const {
+      numComps
+    } = base;
+    const outputDelta = base.getOutputLength(numComps, alpha01);
+    for (let i = 0; i < count; ++i) {
+      const lookupPos = MathClamp(Math.round(src[srcOffset++]), 0, highVal) * numComps;
+      base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
+      destOffset += outputDelta;
+    }
+  }
+  getOutputLength(inputLength, alpha01) {
+    return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);
+  }
+  isDefaultDecode(decode, bpc) {
+    if (isDefaultDecodeHelper(decode, 2)) {
+      return true;
+    }
+    if (!Number.isInteger(bpc) || bpc < 1) {
+      warn("Bits per component is not correct");
+      return true;
+    }
+    return decode[0] === 0 && decode[1] === (1 << bpc) - 1;
+  }
+}
+class DeviceGrayCS extends ColorSpace {
+  constructor() {
+    super("DeviceGray", 1);
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    const c = src[srcOffset] * 255;
+    dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const scale = 255 / ((1 << bits) - 1);
+    let j = srcOffset,
+      q = destOffset;
+    for (let i = 0; i < count; ++i) {
+      const c = scale * src[j++];
+      dest[q++] = c;
+      dest[q++] = c;
+      dest[q++] = c;
+      q += alpha01;
+    }
+  }
+  getOutputLength(inputLength, alpha01) {
+    return inputLength * (3 + alpha01);
+  }
+}
+class DeviceRgbCS extends ColorSpace {
+  constructor() {
+    super("DeviceRGB", 3);
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    dest[destOffset] = src[srcOffset] * 255;
+    dest[destOffset + 1] = src[srcOffset + 1] * 255;
+    dest[destOffset + 2] = src[srcOffset + 2] * 255;
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    if (bits === 8 && alpha01 === 0) {
+      dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
+      return;
+    }
+    const scale = 255 / ((1 << bits) - 1);
+    let j = srcOffset,
+      q = destOffset;
+    for (let i = 0; i < count; ++i) {
+      dest[q++] = scale * src[j++];
+      dest[q++] = scale * src[j++];
+      dest[q++] = scale * src[j++];
+      q += alpha01;
+    }
+  }
+  getOutputLength(inputLength, alpha01) {
+    return inputLength * (3 + alpha01) / 3 | 0;
+  }
+  isPassthrough(bits) {
+    return bits === 8;
+  }
+}
+class DeviceRgbaCS extends ColorSpace {
+  constructor() {
+    super("DeviceRGBA", 4);
+  }
+  getOutputLength(inputLength, _alpha01) {
+    return inputLength * 4;
+  }
+  isPassthrough(bits) {
+    return bits === 8;
+  }
+  fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {
+    if (originalHeight !== height || originalWidth !== width) {
+      resizeRgbaImage(comps, dest, originalWidth, originalHeight, width, height, alpha01);
+    } else {
+      copyRgbaImage(comps, dest, alpha01);
+    }
+  }
+}
+class DeviceCmykCS extends ColorSpace {
+  constructor() {
+    super("DeviceCMYK", 4);
+  }
+  #toRgb(src, srcOffset, srcScale, dest, destOffset) {
+    const c = src[srcOffset] * srcScale;
+    const m = src[srcOffset + 1] * srcScale;
+    const y = src[srcOffset + 2] * srcScale;
+    const k = src[srcOffset + 3] * srcScale;
+    dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747);
+    dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578);
+    dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367);
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    this.#toRgb(src, srcOffset, 1, dest, destOffset);
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const scale = 1 / ((1 << bits) - 1);
+    for (let i = 0; i < count; i++) {
+      this.#toRgb(src, srcOffset, scale, dest, destOffset);
+      srcOffset += 4;
+      destOffset += 3 + alpha01;
+    }
+  }
+  getOutputLength(inputLength, alpha01) {
+    return inputLength / 4 * (3 + alpha01) | 0;
+  }
+}
+class CalGrayCS extends ColorSpace {
+  constructor(whitePoint, blackPoint, gamma) {
+    super("CalGray", 1);
+    if (!whitePoint) {
+      throw new FormatError("WhitePoint missing - required for color space CalGray");
+    }
+    [this.XW, this.YW, this.ZW] = whitePoint;
+    [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0];
+    this.G = gamma || 1;
+    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+      throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`);
+    }
+    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+      info(`Invalid BlackPoint for ${this.name}, falling back to default.`);
+      this.XB = this.YB = this.ZB = 0;
+    }
+    if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {
+      warn(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only default values are supported.`);
+    }
+    if (this.G < 1) {
+      info(`Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`);
+      this.G = 1;
+    }
+  }
+  #toRgb(src, srcOffset, dest, destOffset, scale) {
+    const A = src[srcOffset] * scale;
+    const AG = A ** this.G;
+    const L = this.YW * AG;
+    const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0);
+    dest[destOffset] = val;
+    dest[destOffset + 1] = val;
+    dest[destOffset + 2] = val;
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    this.#toRgb(src, srcOffset, dest, destOffset, 1);
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const scale = 1 / ((1 << bits) - 1);
+    for (let i = 0; i < count; ++i) {
+      this.#toRgb(src, srcOffset, dest, destOffset, scale);
+      srcOffset += 1;
+      destOffset += 3 + alpha01;
+    }
+  }
+  getOutputLength(inputLength, alpha01) {
+    return inputLength * (3 + alpha01);
+  }
+}
+class CalRGBCS extends ColorSpace {
+  static #BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]);
+  static #BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);
+  static #SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);
+  static #FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);
+  static #tempNormalizeMatrix = new Float32Array(3);
+  static #tempConvertMatrix1 = new Float32Array(3);
+  static #tempConvertMatrix2 = new Float32Array(3);
+  static #DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0;
+  constructor(whitePoint, blackPoint, gamma, matrix) {
+    super("CalRGB", 3);
+    if (!whitePoint) {
+      throw new FormatError("WhitePoint missing - required for color space CalRGB");
+    }
+    const [XW, YW, ZW] = this.whitePoint = whitePoint;
+    const [XB, YB, ZB] = this.blackPoint = blackPoint || new Float32Array(3);
+    [this.GR, this.GG, this.GB] = gamma || new Float32Array([1, 1, 1]);
+    [this.MXA, this.MYA, this.MZA, this.MXB, this.MYB, this.MZB, this.MXC, this.MYC, this.MZC] = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
+    if (XW < 0 || ZW < 0 || YW !== 1) {
+      throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`);
+    }
+    if (XB < 0 || YB < 0 || ZB < 0) {
+      info(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to default.");
+      this.blackPoint = new Float32Array(3);
+    }
+    if (this.GR < 0 || this.GG < 0 || this.GB < 0) {
+      info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`);
+      this.GR = this.GG = this.GB = 1;
+    }
+  }
+  #matrixProduct(a, b, result) {
+    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];
+    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];
+  }
+  #toFlat(sourceWhitePoint, LMS, result) {
+    result[0] = LMS[0] * 1 / sourceWhitePoint[0];
+    result[1] = LMS[1] * 1 / sourceWhitePoint[1];
+    result[2] = LMS[2] * 1 / sourceWhitePoint[2];
+  }
+  #toD65(sourceWhitePoint, LMS, result) {
+    const D65X = 0.95047;
+    const D65Y = 1;
+    const D65Z = 1.08883;
+    result[0] = LMS[0] * D65X / sourceWhitePoint[0];
+    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];
+    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];
+  }
+  #sRGBTransferFunction(color) {
+    if (color <= 0.0031308) {
+      return MathClamp(12.92 * color, 0, 1);
+    }
+    if (color >= 0.99554525) {
+      return 1;
+    }
+    return MathClamp((1 + 0.055) * color ** (1 / 2.4) - 0.055, 0, 1);
+  }
+  #decodeL(L) {
+    if (L < 0) {
+      return -this.#decodeL(-L);
+    }
+    if (L > 8.0) {
+      return ((L + 16) / 116) ** 3;
+    }
+    return L * CalRGBCS.#DECODE_L_CONSTANT;
+  }
+  #compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
+    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {
+      result[0] = XYZ_Flat[0];
+      result[1] = XYZ_Flat[1];
+      result[2] = XYZ_Flat[2];
+      return;
+    }
+    const zeroDecodeL = this.#decodeL(0);
+    const X_DST = zeroDecodeL;
+    const X_SRC = this.#decodeL(sourceBlackPoint[0]);
+    const Y_DST = zeroDecodeL;
+    const Y_SRC = this.#decodeL(sourceBlackPoint[1]);
+    const Z_DST = zeroDecodeL;
+    const Z_SRC = this.#decodeL(sourceBlackPoint[2]);
+    const X_Scale = (1 - X_DST) / (1 - X_SRC);
+    const X_Offset = 1 - X_Scale;
+    const Y_Scale = (1 - Y_DST) / (1 - Y_SRC);
+    const Y_Offset = 1 - Y_Scale;
+    const Z_Scale = (1 - Z_DST) / (1 - Z_SRC);
+    const Z_Offset = 1 - Z_Scale;
+    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;
+    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;
+    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;
+  }
+  #normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
+    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {
+      result[0] = XYZ_In[0];
+      result[1] = XYZ_In[1];
+      result[2] = XYZ_In[2];
+      return;
+    }
+    const LMS = result;
+    this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
+    const LMS_Flat = CalRGBCS.#tempNormalizeMatrix;
+    this.#toFlat(sourceWhitePoint, LMS, LMS_Flat);
+    this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);
+  }
+  #normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
+    const LMS = result;
+    this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
+    const LMS_D65 = CalRGBCS.#tempNormalizeMatrix;
+    this.#toD65(sourceWhitePoint, LMS, LMS_D65);
+    this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);
+  }
+  #toRgb(src, srcOffset, dest, destOffset, scale) {
+    const A = MathClamp(src[srcOffset] * scale, 0, 1);
+    const B = MathClamp(src[srcOffset + 1] * scale, 0, 1);
+    const C = MathClamp(src[srcOffset + 2] * scale, 0, 1);
+    const AGR = A === 1 ? 1 : A ** this.GR;
+    const BGG = B === 1 ? 1 : B ** this.GG;
+    const CGB = C === 1 ? 1 : C ** this.GB;
+    const X = this.MXA * AGR + this.MXB * BGG + this.MXC * CGB;
+    const Y = this.MYA * AGR + this.MYB * BGG + this.MYC * CGB;
+    const Z = this.MZA * AGR + this.MZB * BGG + this.MZC * CGB;
+    const XYZ = CalRGBCS.#tempConvertMatrix1;
+    XYZ[0] = X;
+    XYZ[1] = Y;
+    XYZ[2] = Z;
+    const XYZ_Flat = CalRGBCS.#tempConvertMatrix2;
+    this.#normalizeWhitePointToFlat(this.whitePoint, XYZ, XYZ_Flat);
+    const XYZ_Black = CalRGBCS.#tempConvertMatrix1;
+    this.#compensateBlackPoint(this.blackPoint, XYZ_Flat, XYZ_Black);
+    const XYZ_D65 = CalRGBCS.#tempConvertMatrix2;
+    this.#normalizeWhitePointToD65(CalRGBCS.#FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);
+    const SRGB = CalRGBCS.#tempConvertMatrix1;
+    this.#matrixProduct(CalRGBCS.#SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);
+    dest[destOffset] = this.#sRGBTransferFunction(SRGB[0]) * 255;
+    dest[destOffset + 1] = this.#sRGBTransferFunction(SRGB[1]) * 255;
+    dest[destOffset + 2] = this.#sRGBTransferFunction(SRGB[2]) * 255;
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    this.#toRgb(src, srcOffset, dest, destOffset, 1);
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const scale = 1 / ((1 << bits) - 1);
+    for (let i = 0; i < count; ++i) {
+      this.#toRgb(src, srcOffset, dest, destOffset, scale);
+      srcOffset += 3;
+      destOffset += 3 + alpha01;
+    }
+  }
+  getOutputLength(inputLength, alpha01) {
+    return inputLength * (3 + alpha01) / 3 | 0;
+  }
+}
+class LabCS extends ColorSpace {
+  constructor(whitePoint, blackPoint, range) {
+    super("Lab", 3);
+    if (!whitePoint) {
+      throw new FormatError("WhitePoint missing - required for color space Lab");
+    }
+    [this.XW, this.YW, this.ZW] = whitePoint;
+    [this.amin, this.amax, this.bmin, this.bmax] = range || [-100, 100, -100, 100];
+    [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0];
+    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+      throw new FormatError("Invalid WhitePoint components, no fallback available");
+    }
+    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+      info("Invalid BlackPoint, falling back to default");
+      this.XB = this.YB = this.ZB = 0;
+    }
+    if (this.amin > 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;
+    }
+  }
+  #fn_g(x) {
+    return x >= 6 / 29 ? x ** 3 : 108 / 841 * (x - 4 / 29);
+  }
+  #decode(value, high1, low2, high2) {
+    return low2 + value * (high2 - low2) / high1;
+  }
+  #toRgb(src, srcOffset, maxVal, dest, destOffset) {
+    let Ls = src[srcOffset];
+    let as = src[srcOffset + 1];
+    let bs = src[srcOffset + 2];
+    if (maxVal !== false) {
+      Ls = this.#decode(Ls, maxVal, 0, 100);
+      as = this.#decode(as, maxVal, this.amin, this.amax);
+      bs = this.#decode(bs, maxVal, this.bmin, this.bmax);
+    }
+    if (as > this.amax) {
+      as = this.amax;
+    } else if (as < this.amin) {
+      as = this.amin;
+    }
+    if (bs > this.bmax) {
+      bs = this.bmax;
+    } else if (bs < this.bmin) {
+      bs = this.bmin;
+    }
+    const M = (Ls + 16) / 116;
+    const L = M + as / 500;
+    const N = M - bs / 200;
+    const X = this.XW * this.#fn_g(L);
+    const Y = this.YW * this.#fn_g(M);
+    const Z = this.ZW * this.#fn_g(N);
+    let r, g, b;
+    if (this.ZW < 1) {
+      r = X * 3.1339 + Y * -1.617 + Z * -0.4906;
+      g = X * -0.9785 + Y * 1.916 + Z * 0.0333;
+      b = X * 0.072 + Y * -0.229 + Z * 1.4057;
+    } else {
+      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
+      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
+      b = X * 0.0557 + Y * -0.204 + Z * 1.057;
+    }
+    dest[destOffset] = Math.sqrt(r) * 255;
+    dest[destOffset + 1] = Math.sqrt(g) * 255;
+    dest[destOffset + 2] = Math.sqrt(b) * 255;
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    this.#toRgb(src, srcOffset, false, dest, destOffset);
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    const maxVal = (1 << bits) - 1;
+    for (let i = 0; i < count; i++) {
+      this.#toRgb(src, srcOffset, maxVal, dest, destOffset);
+      srcOffset += 3;
+      destOffset += 3 + alpha01;
+    }
+  }
+  getOutputLength(inputLength, alpha01) {
+    return inputLength * (3 + alpha01) / 3 | 0;
+  }
+  isDefaultDecode(decode, bpc) {
+    return true;
+  }
+  get usesZeroToOneRange() {
+    return shadow(this, "usesZeroToOneRange", false);
+  }
+}
+
+;// ./src/core/icc_colorspace.js
+
+
+
+
+function fetchSync(url) {
+  const xhr = new XMLHttpRequest();
+  xhr.open("GET", url, false);
+  xhr.responseType = "arraybuffer";
+  xhr.send(null);
+  return xhr.response;
+}
+class IccColorSpace extends ColorSpace {
+  #transformer;
+  #convertPixel;
+  static #useWasm = true;
+  static #wasmUrl = null;
+  static #finalizer = null;
+  constructor(iccProfile, name, numComps) {
+    if (!IccColorSpace.isUsable) {
+      throw new Error("No ICC color space support");
+    }
+    super(name, numComps);
+    let inType;
+    switch (numComps) {
+      case 1:
+        inType = DataType.Gray8;
+        this.#convertPixel = (src, srcOffset, css) => qcms_convert_one(this.#transformer, src[srcOffset] * 255, css);
+        break;
+      case 3:
+        inType = DataType.RGB8;
+        this.#convertPixel = (src, srcOffset, css) => qcms_convert_three(this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255, css);
+        break;
+      case 4:
+        inType = DataType.CMYK;
+        this.#convertPixel = (src, srcOffset, css) => qcms_convert_four(this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255, src[srcOffset + 3] * 255, css);
+        break;
+      default:
+        throw new Error(`Unsupported number of components: ${numComps}`);
+    }
+    this.#transformer = qcms_transformer_from_memory(iccProfile, inType, Intent.Perceptual);
+    if (!this.#transformer) {
+      throw new Error("Failed to create ICC color space");
+    }
+    IccColorSpace.#finalizer ||= new FinalizationRegistry(transformer => {
+      qcms_drop_transformer(transformer);
+    });
+    IccColorSpace.#finalizer.register(this, this.#transformer);
+  }
+  getRgbHex(src, srcOffset) {
+    this.#convertPixel(src, srcOffset, true);
+    return QCMS._cssColor;
+  }
+  getRgbItem(src, srcOffset, dest, destOffset) {
+    QCMS._destBuffer = dest;
+    QCMS._destOffset = destOffset;
+    QCMS._destLength = 3;
+    this.#convertPixel(src, srcOffset, false);
+    QCMS._destBuffer = null;
+  }
+  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+    src = src.subarray(srcOffset, srcOffset + count * this.numComps);
+    if (bits !== 8) {
+      const scale = 255 / ((1 << bits) - 1);
+      for (let i = 0, ii = src.length; i < ii; i++) {
+        src[i] *= scale;
+      }
+    }
+    QCMS._mustAddAlpha = alpha01 && dest.buffer === src.buffer;
+    QCMS._destBuffer = dest;
+    QCMS._destOffset = destOffset;
+    QCMS._destLength = count * (3 + alpha01);
+    qcms_convert_array(this.#transformer, src);
+    QCMS._mustAddAlpha = false;
+    QCMS._destBuffer = null;
+  }
+  getOutputLength(inputLength, alpha01) {
+    return inputLength / this.numComps * (3 + alpha01) | 0;
+  }
+  static setOptions({
+    useWasm,
+    useWorkerFetch,
+    wasmUrl
+  }) {
+    if (!useWorkerFetch) {
+      this.#useWasm = false;
+      return;
+    }
+    this.#useWasm = useWasm;
+    this.#wasmUrl = wasmUrl;
+  }
+  static get isUsable() {
+    let isUsable = false;
+    if (this.#useWasm) {
+      if (this.#wasmUrl) {
+        try {
+          this._module = initSync({
+            module: fetchSync(`${this.#wasmUrl}qcms_bg.wasm`)
+          });
+          isUsable = !!this._module;
+          QCMS._memory = this._module.memory;
+          QCMS._makeHexColor = Util.makeHexColor.bind(Util);
+        } catch (e) {
+          warn(`ICCBased color space: "${e}".`);
+        }
+      } else {
+        warn("No ICC color space support due to missing `wasmUrl` API option");
+      }
+    }
+    return shadow(this, "isUsable", isUsable);
+  }
+}
+class CmykICCBasedCS extends IccColorSpace {
+  static #iccUrl;
+  constructor() {
+    const iccProfile = new Uint8Array(fetchSync(`${CmykICCBasedCS.#iccUrl}CGATS001Compat-v2-micro.icc`));
+    super(iccProfile, "DeviceCMYK", 4);
+  }
+  static setOptions({
+    iccUrl
+  }) {
+    this.#iccUrl = iccUrl;
+  }
+  static get isUsable() {
+    let isUsable = false;
+    if (IccColorSpace.isUsable) {
+      if (this.#iccUrl) {
+        isUsable = true;
+      } else {
+        warn("No CMYK ICC profile support due to missing `iccUrl` API option");
+      }
+    }
+    return shadow(this, "isUsable", isUsable);
+  }
+}
+
+;// ./src/core/stream.js
+
+
+class Stream extends BaseStream {
+  constructor(arrayBuffer, start, length, dict) {
+    super();
+    this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);
+    this.start = start || 0;
+    this.pos = this.start;
+    this.end = start + length || this.bytes.length;
+    this.dict = dict;
+  }
+  get length() {
+    return this.end - this.start;
+  }
+  get isEmpty() {
+    return this.length === 0;
+  }
+  getByte() {
+    if (this.pos >= this.end) {
+      return -1;
+    }
+    return this.bytes[this.pos++];
+  }
+  getBytes(length) {
+    const pos = this.pos;
+    const endPos = !length ? this.end : Math.min(pos + length, this.end);
+    this.pos = endPos;
+    return this.bytes.subarray(pos, endPos);
+  }
+  getByteRange(begin, end) {
+    if (begin < 0) {
+      begin = 0;
+    }
+    if (end > this.end) {
+      end = this.end;
+    }
+    return this.bytes.subarray(begin, end);
+  }
+  reset() {
+    this.pos = this.start;
+  }
+  moveStart() {
+    this.start = this.pos;
+  }
+  makeSubStream(start, length, dict = null) {
+    return new Stream(this.bytes.buffer, start, length, dict);
+  }
+  clone() {
+    return new Stream(this.bytes.buffer, this.start, this.length, this.dict?.clone());
+  }
+}
+class StringStream extends Stream {
+  constructor(str, dict = null) {
+    super(stringToBytes(str), NaN, NaN, dict);
+  }
+}
+class NullStream extends Stream {
+  constructor() {
+    super(new Uint8Array(0));
+  }
+}
+
+;// ./src/core/chunked_stream.js
+
+
+
+
+class ChunkedStream extends Stream {
+  progressiveDataLength = 0;
+  _lastSuccessfulEnsureByteChunk = -1;
+  _loadedChunks = new Set();
+  constructor(length, chunkSize, manager) {
+    super(new Uint8Array(length), 0, length, null);
+    this.chunkSize = chunkSize;
+    this.numChunks = Math.ceil(length / chunkSize);
+    this.manager = manager;
+  }
+  getMissingChunks() {
+    const chunks = [];
+    for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) {
+      if (!this._loadedChunks.has(chunk)) {
+        chunks.push(chunk);
+      }
+    }
+    return chunks;
+  }
+  get numChunksLoaded() {
+    return this._loadedChunks.size;
+  }
+  get isDataLoaded() {
+    return this.numChunksLoaded === this.numChunks;
+  }
+  onReceiveData(begin, chunk) {
+    const chunkSize = this.chunkSize;
+    if (begin % chunkSize !== 0) {
+      throw new Error(`Bad begin offset: ${begin}`);
+    }
+    const end = begin + chunk.byteLength;
+    if (end % chunkSize !== 0 && end !== this.bytes.length) {
+      throw new Error(`Bad end offset: ${end}`);
+    }
+    this.bytes.set(new Uint8Array(chunk), begin);
+    const beginChunk = Math.floor(begin / chunkSize);
+    const endChunk = Math.floor((end - 1) / chunkSize) + 1;
+    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
+      this._loadedChunks.add(curChunk);
+    }
+  }
+  onReceiveProgressiveData(data) {
+    let position = this.progressiveDataLength;
+    const beginChunk = Math.floor(position / this.chunkSize);
+    this.bytes.set(new Uint8Array(data), position);
+    position += data.byteLength;
+    this.progressiveDataLength = position;
+    const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize);
+    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
+      this._loadedChunks.add(curChunk);
+    }
+  }
+  ensureByte(pos) {
+    if (pos < this.progressiveDataLength) {
+      return;
+    }
+    const chunk = Math.floor(pos / this.chunkSize);
+    if (chunk > this.numChunks) {
+      return;
+    }
+    if (chunk === this._lastSuccessfulEnsureByteChunk) {
+      return;
+    }
+    if (!this._loadedChunks.has(chunk)) {
+      throw new MissingDataException(pos, pos + 1);
+    }
+    this._lastSuccessfulEnsureByteChunk = chunk;
+  }
+  ensureRange(begin, end) {
+    if (begin >= end) {
+      return;
+    }
+    if (end <= this.progressiveDataLength) {
+      return;
+    }
+    const beginChunk = Math.floor(begin / this.chunkSize);
+    if (beginChunk > this.numChunks) {
+      return;
+    }
+    const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks);
+    for (let chunk = beginChunk; chunk < endChunk; ++chunk) {
+      if (!this._loadedChunks.has(chunk)) {
+        throw new MissingDataException(begin, end);
+      }
+    }
+  }
+  nextEmptyChunk(beginChunk) {
+    const numChunks = this.numChunks;
+    for (let i = 0; i < numChunks; ++i) {
+      const chunk = (beginChunk + i) % numChunks;
+      if (!this._loadedChunks.has(chunk)) {
+        return chunk;
+      }
+    }
+    return null;
+  }
+  hasChunk(chunk) {
+    return this._loadedChunks.has(chunk);
+  }
+  getByte() {
+    const pos = this.pos;
+    if (pos >= this.end) {
+      return -1;
+    }
+    if (pos >= this.progressiveDataLength) {
+      this.ensureByte(pos);
+    }
+    return this.bytes[this.pos++];
+  }
+  getBytes(length) {
+    const pos = this.pos;
+    const endPos = !length ? this.end : Math.min(pos + length, this.end);
+    if (endPos > this.progressiveDataLength) {
+      this.ensureRange(pos, endPos);
+    }
+    this.pos = endPos;
+    return this.bytes.subarray(pos, endPos);
+  }
+  getByteRange(begin, end) {
+    if (begin < 0) {
+      begin = 0;
+    }
+    if (end > this.end) {
+      end = this.end;
+    }
+    if (end > this.progressiveDataLength) {
+      this.ensureRange(begin, end);
+    }
+    return this.bytes.subarray(begin, end);
+  }
+  makeSubStream(start, length, dict = null) {
+    if (length) {
+      if (start + length > this.progressiveDataLength) {
+        this.ensureRange(start, start + length);
+      }
+    } else if (start >= this.progressiveDataLength) {
+      this.ensureByte(start);
+    }
+    function ChunkedStreamSubstream() {}
+    ChunkedStreamSubstream.prototype = Object.create(this);
+    ChunkedStreamSubstream.prototype.getMissingChunks = function () {
+      const chunkSize = this.chunkSize;
+      const beginChunk = Math.floor(this.start / chunkSize);
+      const endChunk = Math.floor((this.end - 1) / chunkSize) + 1;
+      const missingChunks = [];
+      for (let chunk = beginChunk; chunk < endChunk; ++chunk) {
+        if (!this._loadedChunks.has(chunk)) {
+          missingChunks.push(chunk);
+        }
+      }
+      return missingChunks;
+    };
+    Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", {
+      get() {
+        if (this.numChunksLoaded === this.numChunks) {
+          return true;
+        }
+        return this.getMissingChunks().length === 0;
+      },
+      configurable: true
+    });
+    const subStream = new ChunkedStreamSubstream();
+    subStream.pos = subStream.start = start;
+    subStream.end = start + length || this.end;
+    subStream.dict = dict;
+    return subStream;
+  }
+  getBaseStreams() {
+    return [this];
+  }
+}
+class ChunkedStreamManager {
+  #aborted = false;
+  currRequestId = 0;
+  _chunksNeededByRequest = new Map();
+  #loadedStreamCapability = Promise.withResolvers();
+  _promisesByRequest = new Map();
+  _requestsByChunk = new Map();
+  constructor(pdfStream, args) {
+    this.length = args.length;
+    this.chunkSize = args.rangeChunkSize;
+    this.stream = new ChunkedStream(this.length, this.chunkSize, this);
+    this.pdfStream = pdfStream;
+    this.disableAutoFetch = args.disableAutoFetch;
+    this.msgHandler = args.msgHandler;
+  }
+  async sendRequest(begin, end) {
+    const rangeReader = this.pdfStream.getRangeReader(begin, end);
+    let chunks = [];
+    while (true) {
+      const {
+        value,
+        done
+      } = await rangeReader.read();
+      if (this.#aborted) {
+        chunks = null;
+        return;
+      }
+      if (done) {
+        break;
+      }
+      chunks.push(value);
+    }
+    if (chunks.length === 0 && this.disableAutoFetch) {
+      return;
+    }
+    const data = arrayBuffersToBytes(chunks);
+    chunks = null;
+    this.onReceiveData({
+      chunk: data.buffer,
+      begin
+    });
+  }
+  requestAllChunks(noFetch = false) {
+    if (!noFetch) {
+      const missingChunks = this.stream.getMissingChunks();
+      this._requestChunks(missingChunks);
+    }
+    return this.#loadedStreamCapability.promise;
+  }
+  _requestChunks(chunks) {
+    const requestId = this.currRequestId++;
+    const chunksNeeded = new Set();
+    this._chunksNeededByRequest.set(requestId, chunksNeeded);
+    for (const chunk of chunks) {
+      if (!this.stream.hasChunk(chunk)) {
+        chunksNeeded.add(chunk);
+      }
+    }
+    if (chunksNeeded.size === 0) {
+      return Promise.resolve();
+    }
+    const capability = Promise.withResolvers();
+    this._promisesByRequest.set(requestId, capability);
+    const chunksToRequest = [];
+    for (const chunk of chunksNeeded) {
+      const requestIds = this._requestsByChunk.getOrInsertComputed(chunk, () => {
+        chunksToRequest.push(chunk);
+        return [];
+      });
+      requestIds.push(requestId);
+    }
+    if (chunksToRequest.length > 0) {
+      const groupedChunksToRequest = this.groupChunks(chunksToRequest);
+      for (const groupedChunk of groupedChunksToRequest) {
+        const begin = groupedChunk.beginChunk * this.chunkSize;
+        const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);
+        this.sendRequest(begin, end).catch(capability.reject);
+      }
+    }
+    return capability.promise.catch(reason => {
+      if (this.#aborted) {
+        return;
+      }
+      throw reason;
+    });
+  }
+  getStream() {
+    return this.stream;
+  }
+  requestRange(begin, end) {
+    end = Math.min(end, this.length);
+    const beginChunk = this.getBeginChunk(begin);
+    const endChunk = this.getEndChunk(end);
+    const chunks = [];
+    for (let chunk = beginChunk; chunk < endChunk; ++chunk) {
+      chunks.push(chunk);
+    }
+    return this._requestChunks(chunks);
+  }
+  requestRanges(ranges = []) {
+    const chunksToRequest = [];
+    for (const range of ranges) {
+      const beginChunk = this.getBeginChunk(range.begin);
+      const endChunk = this.getEndChunk(range.end);
+      for (let chunk = beginChunk; chunk < endChunk; ++chunk) {
+        if (!chunksToRequest.includes(chunk)) {
+          chunksToRequest.push(chunk);
+        }
+      }
+    }
+    chunksToRequest.sort((a, b) => a - b);
+    return this._requestChunks(chunksToRequest);
+  }
+  groupChunks(chunks) {
+    const groupedChunks = [];
+    let beginChunk = -1;
+    let prevChunk = -1;
+    for (let i = 0, ii = chunks.length; i < ii; ++i) {
+      const chunk = chunks[i];
+      if (beginChunk < 0) {
+        beginChunk = chunk;
+      }
+      if (prevChunk >= 0 && prevChunk + 1 !== chunk) {
+        groupedChunks.push({
+          beginChunk,
+          endChunk: prevChunk + 1
+        });
+        beginChunk = chunk;
+      }
+      if (i + 1 === chunks.length) {
+        groupedChunks.push({
+          beginChunk,
+          endChunk: chunk + 1
+        });
+      }
+      prevChunk = chunk;
+    }
+    return groupedChunks;
+  }
+  onReceiveData(args) {
+    const {
+      chunkSize,
+      length,
+      stream
+    } = this;
+    const chunk = args.chunk;
+    const isProgressive = args.begin === undefined;
+    const begin = isProgressive ? stream.progressiveDataLength : args.begin;
+    const end = begin + chunk.byteLength;
+    const beginChunk = Math.floor(begin / chunkSize);
+    const endChunk = end < length ? Math.floor(end / chunkSize) : Math.ceil(end / chunkSize);
+    if (isProgressive) {
+      stream.onReceiveProgressiveData(chunk);
+    } else {
+      stream.onReceiveData(begin, chunk);
+    }
+    if (stream.isDataLoaded) {
+      this.#loadedStreamCapability.resolve(stream);
+    }
+    const loadedRequests = [];
+    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
+      const requestIds = this._requestsByChunk.get(curChunk);
+      if (!requestIds) {
+        continue;
+      }
+      this._requestsByChunk.delete(curChunk);
+      for (const requestId of requestIds) {
+        const chunksNeeded = this._chunksNeededByRequest.get(requestId);
+        if (chunksNeeded.has(curChunk)) {
+          chunksNeeded.delete(curChunk);
+        }
+        if (chunksNeeded.size > 0) {
+          continue;
+        }
+        loadedRequests.push(requestId);
+      }
+    }
+    if (!this.disableAutoFetch && this._requestsByChunk.size === 0) {
+      let nextEmptyChunk;
+      if (stream.numChunksLoaded === 1) {
+        const lastChunk = stream.numChunks - 1;
+        if (!stream.hasChunk(lastChunk)) {
+          nextEmptyChunk = lastChunk;
+        }
+      } else {
+        nextEmptyChunk = stream.nextEmptyChunk(endChunk);
+      }
+      if (Number.isInteger(nextEmptyChunk)) {
+        this._requestChunks([nextEmptyChunk]);
+      }
+    }
+    for (const requestId of loadedRequests) {
+      const capability = this._promisesByRequest.get(requestId);
+      this._promisesByRequest.delete(requestId);
+      capability.resolve();
+    }
+    this.msgHandler.send("DocProgress", {
+      loaded: MathClamp(stream.numChunksLoaded * chunkSize, stream.progressiveDataLength, length),
+      total: length
+    });
+  }
+  getBeginChunk(begin) {
+    return Math.floor(begin / this.chunkSize);
+  }
+  getEndChunk(end) {
+    return Math.floor((end - 1) / this.chunkSize) + 1;
+  }
+  abort(reason) {
+    this.#aborted = true;
+    this.pdfStream?.cancelAllRequests(reason);
+    for (const capability of this._promisesByRequest.values()) {
+      capability.reject(reason);
+    }
+    this.#loadedStreamCapability.reject(reason);
+  }
+}
+
+;// ./src/shared/image_utils.js
+
+function convertToRGBA(params) {
+  switch (params.kind) {
+    case ImageKind.GRAYSCALE_1BPP:
+      return convertBlackAndWhiteToRGBA(params);
+    case ImageKind.RGB_24BPP:
+      return convertRGBToRGBA(params);
+  }
+  return null;
+}
+function convertBlackAndWhiteToRGBA({
+  src,
+  srcPos = 0,
+  dest,
+  width,
+  height,
+  nonBlackColor = 0xffffffff,
+  inverseDecode = false
+}) {
+  const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;
+  const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor];
+  const widthInSource = width >> 3;
+  const widthRemainder = width & 7;
+  const xorMask = zeroMapping ^ oneMapping;
+  const srcLength = src.length;
+  dest = new Uint32Array(dest.buffer);
+  let destPos = 0;
+  for (let i = 0; i < height; ++i) {
+    for (const max = srcPos + widthInSource; srcPos < max; ++srcPos, destPos += 8) {
+      const elem = src[srcPos];
+      dest[destPos] = zeroMapping ^ -(elem >> 7 & 1) & xorMask;
+      dest[destPos + 1] = zeroMapping ^ -(elem >> 6 & 1) & xorMask;
+      dest[destPos + 2] = zeroMapping ^ -(elem >> 5 & 1) & xorMask;
+      dest[destPos + 3] = zeroMapping ^ -(elem >> 4 & 1) & xorMask;
+      dest[destPos + 4] = zeroMapping ^ -(elem >> 3 & 1) & xorMask;
+      dest[destPos + 5] = zeroMapping ^ -(elem >> 2 & 1) & xorMask;
+      dest[destPos + 6] = zeroMapping ^ -(elem >> 1 & 1) & xorMask;
+      dest[destPos + 7] = zeroMapping ^ -(elem & 1) & xorMask;
+    }
+    if (widthRemainder === 0) {
+      continue;
+    }
+    const elem = srcPos < srcLength ? src[srcPos++] : 255;
+    for (let j = 0; j < widthRemainder; ++j, ++destPos) {
+      dest[destPos] = zeroMapping ^ -(elem >> 7 - j & 1) & xorMask;
+    }
+  }
+  return {
+    srcPos,
+    destPos
+  };
+}
+function convertRGBToRGBA({
+  src,
+  srcPos = 0,
+  dest,
+  destPos = 0,
+  width,
+  height
+}) {
+  let i = 0;
+  const len = width * height * 3;
+  const len32 = len >> 2;
+  const src32 = new Uint32Array(src.buffer, srcPos, len32);
+  const alphaMask = FeatureTest.isLittleEndian ? 0xff000000 : 0xff;
+  if (FeatureTest.isLittleEndian) {
+    for (; i < len32 - 2; i += 3, destPos += 4) {
+      const s1 = src32[i],
+        s2 = src32[i + 1],
+        s3 = src32[i + 2];
+      dest[destPos] = s1 | alphaMask;
+      dest[destPos + 1] = s1 >>> 24 | s2 << 8 | alphaMask;
+      dest[destPos + 2] = s2 >>> 16 | s3 << 16 | alphaMask;
+      dest[destPos + 3] = s3 >>> 8 | alphaMask;
+    }
+    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {
+      dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | alphaMask;
+    }
+  } else {
+    for (; i < len32 - 2; i += 3, destPos += 4) {
+      const s1 = src32[i],
+        s2 = src32[i + 1],
+        s3 = src32[i + 2];
+      dest[destPos] = s1 | alphaMask;
+      dest[destPos + 1] = s1 << 24 | s2 >>> 8 | alphaMask;
+      dest[destPos + 2] = s2 << 16 | s3 >>> 16 | alphaMask;
+      dest[destPos + 3] = s3 << 8 | alphaMask;
+    }
+    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {
+      dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | alphaMask;
+    }
+  }
+  return {
+    srcPos: srcPos + len,
+    destPos
+  };
+}
+function grayToRGBA(src, dest) {
+  if (FeatureTest.isLittleEndian) {
+    for (let i = 0, ii = src.length; i < ii; i++) {
+      dest[i] = src[i] * 0x10101 | 0xff000000;
+    }
+  } else {
+    for (let i = 0, ii = src.length; i < ii; i++) {
+      dest[i] = src[i] * 0x1010100 | 0x000000ff;
+    }
+  }
+}
+
+;// ./src/core/image_resizer.js
+
+
+
+const MIN_IMAGE_DIM = 2048;
+const MAX_IMAGE_DIM = 32768;
+const MAX_ERROR = 128;
+class ImageResizer {
+  static #goodSquareLength = MIN_IMAGE_DIM;
+  static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported;
+  constructor(imgData, isMask) {
+    this._imgData = imgData;
+    this._isMask = isMask;
+  }
+  static get canUseImageDecoder() {
+    return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/bmp") : Promise.resolve(false));
+  }
+  static needsToBeResized(width, height) {
+    if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) {
+      return false;
+    }
+    const {
+      MAX_DIM
+    } = this;
+    if (width > MAX_DIM || height > MAX_DIM) {
+      return true;
+    }
+    const area = width * height;
+    if (this._hasMaxArea) {
+      return area > this.MAX_AREA;
+    }
+    if (area < this.#goodSquareLength ** 2) {
+      return false;
+    }
+    if (this._areGoodDims(width, height)) {
+      this.#goodSquareLength = Math.max(this.#goodSquareLength, Math.floor(Math.sqrt(width * height)));
+      return false;
+    }
+    this.#goodSquareLength = this._guessMax(this.#goodSquareLength, MAX_DIM, MAX_ERROR, 0);
+    const maxArea = this.MAX_AREA = this.#goodSquareLength ** 2;
+    return area > maxArea;
+  }
+  static getReducePowerForJPX(width, height, componentsCount) {
+    const area = width * height;
+    const maxJPXArea = 2 ** 30 / (componentsCount * 4);
+    if (!this.needsToBeResized(width, height)) {
+      if (area > maxJPXArea) {
+        return Math.ceil(Math.log2(area / maxJPXArea));
+      }
+      return 0;
+    }
+    const {
+      MAX_DIM,
+      MAX_AREA
+    } = this;
+    const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(area / Math.min(maxJPXArea, MAX_AREA)));
+    return Math.ceil(Math.log2(minFactor));
+  }
+  static get MAX_DIM() {
+    return shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1));
+  }
+  static get MAX_AREA() {
+    this._hasMaxArea = true;
+    return shadow(this, "MAX_AREA", this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2);
+  }
+  static set MAX_AREA(area) {
+    if (area >= 0) {
+      this._hasMaxArea = true;
+      shadow(this, "MAX_AREA", area);
+    }
+  }
+  static setOptions({
+    canvasMaxAreaInBytes = -1,
+    isImageDecoderSupported = false
+  }) {
+    if (!this._hasMaxArea) {
+      this.MAX_AREA = canvasMaxAreaInBytes >> 2;
+    }
+    this.#isImageDecoderSupported = isImageDecoderSupported;
+  }
+  static _areGoodDims(width, height) {
+    try {
+      const canvas = new OffscreenCanvas(width, height);
+      const ctx = canvas.getContext("2d");
+      ctx.fillRect(0, 0, 1, 1);
+      const opacity = ctx.getImageData(0, 0, 1, 1).data[3];
+      canvas.width = canvas.height = 1;
+      return opacity !== 0;
+    } catch {
+      return false;
+    }
+  }
+  static _guessMax(start, end, tolerance, defaultHeight) {
+    while (start + tolerance + 1 < end) {
+      const middle = Math.floor((start + end) / 2);
+      const height = defaultHeight || middle;
+      if (this._areGoodDims(middle, height)) {
+        start = middle;
+      } else {
+        end = middle;
+      }
+    }
+    return start;
+  }
+  static async createImage(imgData, isMask = false) {
+    return new ImageResizer(imgData, isMask)._createImage();
+  }
+  async _createImage() {
+    const {
+      _imgData: imgData
+    } = this;
+    const {
+      width,
+      height
+    } = imgData;
+    if (width * height * 4 > MAX_INT_32) {
+      const result = this.#rescaleImageData();
+      if (result) {
+        return result;
+      }
+    }
+    const data = this._encodeBMP();
+    let decoder, imagePromise;
+    if (await ImageResizer.canUseImageDecoder) {
+      decoder = new ImageDecoder({
+        data,
+        type: "image/bmp",
+        preferAnimation: false,
+        transfer: [data.buffer]
+      });
+      imagePromise = decoder.decode().catch(reason => {
+        warn(`BMP image decoding failed: ${reason}`);
+        return createImageBitmap(new Blob([this._encodeBMP().buffer], {
+          type: "image/bmp"
+        }));
+      }).finally(() => {
+        decoder.close();
+      });
+    } else {
+      imagePromise = createImageBitmap(new Blob([data.buffer], {
+        type: "image/bmp"
+      }));
+    }
+    const {
+      MAX_AREA,
+      MAX_DIM
+    } = ImageResizer;
+    const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA));
+    const firstFactor = Math.max(minFactor, 2);
+    const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor;
+    const N = Math.floor(Math.log2(factor));
+    const steps = new Array(N + 2).fill(2);
+    steps[0] = firstFactor;
+    steps.splice(-1, 1, factor / (1 << N));
+    let newWidth = width;
+    let newHeight = height;
+    const result = await imagePromise;
+    let bitmap = result.image || result;
+    for (const step of steps) {
+      const prevWidth = newWidth;
+      const prevHeight = newHeight;
+      newWidth = Math.floor(newWidth / step);
+      newHeight = Math.floor(newHeight / step);
+      const canvas = new OffscreenCanvas(newWidth, newHeight);
+      const ctx = canvas.getContext("2d");
+      ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight);
+      bitmap.close();
+      bitmap = canvas.transferToImageBitmap();
+    }
+    imgData.data = null;
+    imgData.bitmap = bitmap;
+    imgData.width = newWidth;
+    imgData.height = newHeight;
+    return imgData;
+  }
+  #rescaleImageData() {
+    const {
+      _imgData: imgData
+    } = this;
+    const {
+      data,
+      width,
+      height,
+      kind
+    } = imgData;
+    const rgbaSize = width * height * 4;
+    const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32));
+    const newWidth = width >> K;
+    const newHeight = height >> K;
+    let rgbaData;
+    let maxHeight = height;
+    try {
+      rgbaData = new Uint8Array(rgbaSize);
+    } catch {
+      let n = Math.floor(Math.log2(rgbaSize + 1));
+      while (true) {
+        try {
+          rgbaData = new Uint8Array(2 ** n - 1);
+          break;
+        } catch {
+          n -= 1;
+        }
+      }
+      maxHeight = Math.floor((2 ** n - 1) / (width * 4));
+      const newSize = width * maxHeight * 4;
+      if (newSize < rgbaData.length) {
+        rgbaData = new Uint8Array(newSize);
+      }
+    }
+    const src32 = new Uint32Array(rgbaData.buffer);
+    const dest32 = new Uint32Array(newWidth * newHeight);
+    let srcPos = 0;
+    let newIndex = 0;
+    const step = Math.ceil(height / maxHeight);
+    const remainder = height % maxHeight === 0 ? height : height % maxHeight;
+    for (let k = 0; k < step; k++) {
+      const h = k < step - 1 ? maxHeight : remainder;
+      ({
+        srcPos
+      } = convertToRGBA({
+        kind,
+        src: data,
+        dest: src32,
+        width,
+        height: h,
+        inverseDecode: this._isMask,
+        srcPos
+      }));
+      for (let i = 0, ii = h >> K; i < ii; i++) {
+        const buf = src32.subarray((i << K) * width);
+        for (let j = 0; j < newWidth; j++) {
+          dest32[newIndex++] = buf[j << K];
+        }
+      }
+    }
+    if (ImageResizer.needsToBeResized(newWidth, newHeight)) {
+      imgData.data = dest32;
+      imgData.width = newWidth;
+      imgData.height = newHeight;
+      imgData.kind = ImageKind.RGBA_32BPP;
+      return null;
+    }
+    const canvas = new OffscreenCanvas(newWidth, newHeight);
+    const ctx = canvas.getContext("2d", {
+      willReadFrequently: true
+    });
+    ctx.putImageData(new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight), 0, 0);
+    imgData.data = null;
+    imgData.bitmap = canvas.transferToImageBitmap();
+    imgData.width = newWidth;
+    imgData.height = newHeight;
+    return imgData;
+  }
+  _encodeBMP() {
+    const {
+      width,
+      height,
+      kind
+    } = this._imgData;
+    let data = this._imgData.data;
+    let bitPerPixel;
+    let colorTable = new Uint8Array(0);
+    let maskTable = colorTable;
+    let compression = 0;
+    switch (kind) {
+      case ImageKind.GRAYSCALE_1BPP:
+        {
+          bitPerPixel = 1;
+          colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]);
+          const rowLen = width + 7 >> 3;
+          const rowSize = rowLen + 3 & -4;
+          if (rowLen !== rowSize) {
+            const newData = new Uint8Array(rowSize * height);
+            let k = 0;
+            for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) {
+              newData.set(data.subarray(i, i + rowLen), k);
+            }
+            data = newData;
+          }
+          break;
+        }
+      case ImageKind.RGB_24BPP:
+        {
+          bitPerPixel = 24;
+          if (width & 3) {
+            const rowLen = 3 * width;
+            const rowSize = rowLen + 3 & -4;
+            const extraLen = rowSize - rowLen;
+            const newData = new Uint8Array(rowSize * height);
+            let k = 0;
+            for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) {
+              const row = data.subarray(i, i + rowLen);
+              for (let j = 0; j < rowLen; j += 3) {
+                newData[k++] = row[j + 2];
+                newData[k++] = row[j + 1];
+                newData[k++] = row[j];
+              }
+              k += extraLen;
+            }
+            data = newData;
+          } else {
+            for (let i = 0, ii = data.length; i < ii; i += 3) {
+              const tmp = data[i];
+              data[i] = data[i + 2];
+              data[i + 2] = tmp;
+            }
+          }
+          break;
+        }
+      case ImageKind.RGBA_32BPP:
+        bitPerPixel = 32;
+        compression = 3;
+        maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52);
+        const view = new DataView(maskTable.buffer);
+        if (FeatureTest.isLittleEndian) {
+          view.setUint32(0, 0x000000ff, true);
+          view.setUint32(4, 0x0000ff00, true);
+          view.setUint32(8, 0x00ff0000, true);
+          view.setUint32(12, 0xff000000, true);
+        } else {
+          view.setUint32(0, 0xff000000, true);
+          view.setUint32(4, 0x00ff0000, true);
+          view.setUint32(8, 0x0000ff00, true);
+          view.setUint32(12, 0x000000ff, true);
+        }
+        break;
+      default:
+        throw new Error("invalid format");
+    }
+    let i = 0;
+    const headerLength = 40 + maskTable.length;
+    const fileLength = 14 + headerLength + colorTable.length + data.length;
+    const bmpData = new Uint8Array(fileLength);
+    const view = new DataView(bmpData.buffer);
+    view.setUint16(i, 0x4d42, true);
+    i += 2;
+    view.setUint32(i, fileLength, true);
+    i += 4;
+    view.setUint32(i, 0, true);
+    i += 4;
+    view.setUint32(i, 14 + headerLength + colorTable.length, true);
+    i += 4;
+    view.setUint32(i, headerLength, true);
+    i += 4;
+    view.setInt32(i, width, true);
+    i += 4;
+    view.setInt32(i, -height, true);
+    i += 4;
+    view.setUint16(i, 1, true);
+    i += 2;
+    view.setUint16(i, bitPerPixel, true);
+    i += 2;
+    view.setUint32(i, compression, true);
+    i += 4;
+    view.setUint32(i, 0, true);
+    i += 4;
+    view.setInt32(i, 0, true);
+    i += 4;
+    view.setInt32(i, 0, true);
+    i += 4;
+    view.setUint32(i, colorTable.length / 4, true);
+    i += 4;
+    view.setUint32(i, 0, true);
+    i += 4;
+    bmpData.set(maskTable, i);
+    i += maskTable.length;
+    bmpData.set(colorTable, i);
+    i += colorTable.length;
+    bmpData.set(data, i);
+    return bmpData;
+  }
+}
+
+;// ./src/core/decode_stream.js
+
+
+
+const emptyBuffer = new Uint8Array(0);
+class DecodeStream extends BaseStream {
+  buffer = emptyBuffer;
+  bufferLength = 0;
+  eof = false;
+  minBufferLength = 512;
+  pos = 0;
+  constructor(maybeMinBufferLength) {
+    super();
+    this._rawMinBufferLength = maybeMinBufferLength || 0;
+    if (maybeMinBufferLength) {
+      while (this.minBufferLength < maybeMinBufferLength) {
+        this.minBufferLength *= 2;
+      }
+    }
+  }
+  readBlock() {
+    unreachable("Abstract method `readBlock` called");
+  }
+  get isEmpty() {
+    while (!this.eof && this.bufferLength === 0) {
+      this.readBlock();
+    }
+    return this.bufferLength === 0;
+  }
+  ensureBuffer(requested) {
+    const buffer = this.buffer;
+    if (requested <= buffer.byteLength) {
+      return buffer;
+    }
+    let size = this.minBufferLength;
+    while (size < requested) {
+      size *= 2;
+    }
+    const buffer2 = new Uint8Array(size);
+    buffer2.set(buffer);
+    return this.buffer = buffer2;
+  }
+  getByte() {
+    const pos = this.pos;
+    while (this.bufferLength <= pos) {
+      if (this.eof) {
+        return -1;
+      }
+      this.readBlock();
+    }
+    return this.buffer[this.pos++];
+  }
+  getBytes(length, decoderOptions = null) {
+    const pos = this.pos;
+    let end;
+    if (length) {
+      this.ensureBuffer(pos + length);
+      end = pos + length;
+      while (!this.eof && this.bufferLength < end) {
+        this.readBlock(decoderOptions);
+      }
+      const bufEnd = this.bufferLength;
+      if (end > bufEnd) {
+        end = bufEnd;
+      }
+    } else {
+      while (!this.eof) {
+        this.readBlock(decoderOptions);
+      }
+      end = this.bufferLength;
+    }
+    this.pos = end;
+    return this.buffer.subarray(pos, end);
+  }
+  async getImageData(length, decoderOptions) {
+    if (!this.canAsyncDecodeImageFromBuffer) {
+      if (this.isAsyncDecoder) {
+        return this.decodeImage(null, length, decoderOptions);
+      }
+      return this.getBytes(length, decoderOptions);
+    }
+    const data = await this.stream.asyncGetBytes();
+    return this.decodeImage(data, length, decoderOptions);
+  }
+  async asyncGetBytesFromDecompressionStream(name) {
+    this.stream.reset();
+    const bytes = this.stream.isAsync ? await this.stream.asyncGetBytes() : this.stream.getBytes();
+    try {
+      const {
+        readable,
+        writable
+      } = new DecompressionStream(name);
+      const writer = writable.getWriter();
+      await writer.ready;
+      writer.write(bytes).then(async () => {
+        await writer.ready;
+        await writer.close();
+      }).catch(() => {});
+      const chunks = [];
+      let totalLength = 0;
+      for await (const chunk of readable) {
+        chunks.push(chunk);
+        totalLength += chunk.byteLength;
+      }
+      const data = new Uint8Array(totalLength);
+      let offset = 0;
+      for (const chunk of chunks) {
+        data.set(chunk, offset);
+        offset += chunk.byteLength;
+      }
+      return {
+        decompressed: data,
+        compressed: bytes
+      };
+    } catch {
+      return {
+        decompressed: null,
+        compressed: bytes
+      };
+    }
+  }
+  reset() {
+    this.pos = 0;
+  }
+  makeSubStream(start, length, dict = null) {
+    if (length === undefined) {
+      while (!this.eof) {
+        this.readBlock();
+      }
+    } else {
+      const end = start + length;
+      while (this.bufferLength <= end && !this.eof) {
+        this.readBlock();
+      }
+    }
+    return new Stream(this.buffer, start, length, dict);
+  }
+  clone() {
+    while (!this.eof) {
+      this.readBlock();
+    }
+    return new Stream(this.buffer, 0, this.bufferLength, this.dict?.clone());
+  }
+  getBaseStreams() {
+    return this.stream ? this.stream.getBaseStreams() : null;
+  }
+}
+class StreamsSequenceStream extends DecodeStream {
+  constructor(streams, onError = null) {
+    streams = streams.filter(s => s instanceof BaseStream && !s.isImageStream);
+    let maybeLength = 0;
+    for (const stream of streams) {
+      maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length;
+    }
+    super(maybeLength);
+    this.streams = streams;
+    this._onError = onError;
+  }
+  readBlock() {
+    const streams = this.streams;
+    if (streams.length === 0) {
+      this.eof = true;
+      return;
+    }
+    const stream = streams.shift();
+    let chunk;
+    try {
+      chunk = stream.getBytes();
+    } catch (reason) {
+      if (this._onError) {
+        this._onError(reason, stream.dict?.objId);
+        return;
+      }
+      throw reason;
+    }
+    const bufferLength = this.bufferLength;
+    const newLength = bufferLength + chunk.length;
+    const buffer = this.ensureBuffer(newLength);
+    buffer.set(chunk, bufferLength);
+    this.bufferLength = newLength;
+  }
+  getBaseStreams() {
+    const baseStreamsBuf = [];
+    for (const stream of this.streams) {
+      const baseStreams = stream.getBaseStreams();
+      if (baseStreams) {
+        baseStreamsBuf.push(...baseStreams);
+      }
+    }
+    return baseStreamsBuf.length > 0 ? baseStreamsBuf : null;
+  }
+}
+
+;// ./src/core/colorspace_utils.js
+
+
+
+
+
+
+class ColorSpaceUtils {
+  static parse({
+    cs,
+    xref,
+    resources = null,
+    pdfFunctionFactory,
+    globalColorSpaceCache,
+    localColorSpaceCache,
+    asyncIfNotCached = false
+  }) {
+    const options = {
+      xref,
+      resources,
+      pdfFunctionFactory,
+      globalColorSpaceCache,
+      localColorSpaceCache
+    };
+    let csName, csRef, parsedCS;
+    if (cs instanceof Ref) {
+      csRef = cs;
+      const cachedCS = globalColorSpaceCache.getByRef(csRef) || localColorSpaceCache.getByRef(csRef);
+      if (cachedCS) {
+        return cachedCS;
+      }
+      cs = xref.fetch(cs);
+    }
+    if (cs instanceof Name) {
+      csName = cs.name;
+      const cachedCS = localColorSpaceCache.getByName(csName);
+      if (cachedCS) {
+        return cachedCS;
+      }
+    }
+    try {
+      parsedCS = this.#parse(cs, options);
+    } catch (ex) {
+      if (asyncIfNotCached && !(ex instanceof MissingDataException)) {
+        return Promise.reject(ex);
+      }
+      throw ex;
+    }
+    if (csName || csRef) {
+      localColorSpaceCache.set(csName, csRef, parsedCS);
+      if (csRef) {
+        globalColorSpaceCache.set(null, csRef, parsedCS);
+      }
+    }
+    return asyncIfNotCached ? Promise.resolve(parsedCS) : parsedCS;
+  }
+  static #subParse(cs, options) {
+    const {
+      globalColorSpaceCache
+    } = options;
+    let csRef;
+    if (cs instanceof Ref) {
+      csRef = cs;
+      const cachedCS = globalColorSpaceCache.getByRef(csRef);
+      if (cachedCS) {
+        return cachedCS;
+      }
+    }
+    const parsedCS = this.#parse(cs, options);
+    if (csRef) {
+      globalColorSpaceCache.set(null, csRef, parsedCS);
+    }
+    return parsedCS;
+  }
+  static #parse(cs, options) {
+    const {
+      xref,
+      resources,
+      pdfFunctionFactory,
+      globalColorSpaceCache
+    } = options;
+    cs = xref.fetchIfRef(cs);
+    if (cs instanceof Name) {
+      switch (cs.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 (resources instanceof Dict) {
+            const colorSpaces = resources.get("ColorSpace");
+            if (colorSpaces instanceof Dict) {
+              const resourcesCS = colorSpaces.get(cs.name);
+              if (resourcesCS) {
+                if (resourcesCS instanceof Name) {
+                  return this.#parse(resourcesCS, options);
+                }
+                cs = resourcesCS;
+                break;
+              }
+            }
+          }
+          warn(`Unrecognized ColorSpace: ${cs.name}`);
+          return this.gray;
+      }
+    }
+    if (Array.isArray(cs)) {
+      const mode = xref.fetchIfRef(cs[0]).name;
+      let params, numComps, baseCS, whitePoint, blackPoint, gamma;
+      switch (mode) {
+        case "G":
+        case "DeviceGray":
+          return this.gray;
+        case "RGB":
+        case "DeviceRGB":
+          return this.rgb;
+        case "CMYK":
+        case "DeviceCMYK":
+          return this.cmyk;
+        case "CalGray":
+          params = xref.fetchIfRef(cs[1]);
+          whitePoint = params.getArray("WhitePoint");
+          blackPoint = params.getArray("BlackPoint");
+          gamma = params.get("Gamma");
+          return new CalGrayCS(whitePoint, blackPoint, gamma);
+        case "CalRGB":
+          params = xref.fetchIfRef(cs[1]);
+          whitePoint = params.getArray("WhitePoint");
+          blackPoint = params.getArray("BlackPoint");
+          gamma = params.getArray("Gamma");
+          const matrix = params.getArray("Matrix");
+          return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);
+        case "ICCBased":
+          const isRef = cs[1] instanceof Ref;
+          if (isRef) {
+            const cachedCS = globalColorSpaceCache.getByRef(cs[1]);
+            if (cachedCS) {
+              return cachedCS;
+            }
+          }
+          const stream = xref.fetchIfRef(cs[1]);
+          const dict = stream.dict;
+          numComps = dict.get("N");
+          if (IccColorSpace.isUsable) {
+            try {
+              const iccCS = new IccColorSpace(stream.getBytes(), "ICCBased", numComps);
+              if (isRef) {
+                globalColorSpaceCache.set(null, cs[1], iccCS);
+              }
+              return iccCS;
+            } catch (ex) {
+              if (ex instanceof MissingDataException) {
+                throw ex;
+              }
+              warn(`ICCBased color space (${cs[1]}): "${ex}".`);
+            }
+          }
+          const altRaw = dict.getRaw("Alternate");
+          if (altRaw) {
+            const altCS = this.#subParse(altRaw, options);
+            if (altCS.numComps === numComps) {
+              return altCS;
+            }
+            warn("ICCBased color space: Ignoring incorrect /Alternate entry.");
+          }
+          if (numComps === 1) {
+            return this.gray;
+          } else if (numComps === 3) {
+            return this.rgb;
+          } else if (numComps === 4) {
+            return this.cmyk;
+          }
+          break;
+        case "Pattern":
+          baseCS = cs[1] || null;
+          if (baseCS) {
+            baseCS = this.#subParse(baseCS, options);
+          }
+          return new PatternCS(baseCS);
+        case "I":
+        case "Indexed":
+          baseCS = this.#subParse(cs[1], options);
+          const hiVal = MathClamp(xref.fetchIfRef(cs[2]), 0, 255);
+          const lookup = xref.fetchIfRef(cs[3]);
+          return new IndexedCS(baseCS, hiVal, lookup);
+        case "Separation":
+        case "DeviceN":
+          const name = xref.fetchIfRef(cs[1]);
+          numComps = Array.isArray(name) ? name.length : 1;
+          baseCS = this.#subParse(cs[2], options);
+          const tintFn = pdfFunctionFactory.create(cs[3]);
+          return new AlternateCS(numComps, baseCS, tintFn);
+        case "Lab":
+          params = xref.fetchIfRef(cs[1]);
+          whitePoint = params.getArray("WhitePoint");
+          blackPoint = params.getArray("BlackPoint");
+          const range = params.getArray("Range");
+          return new LabCS(whitePoint, blackPoint, range);
+        default:
+          warn(`Unimplemented ColorSpace object: ${mode}`);
+          return this.gray;
+      }
+    }
+    warn(`Unrecognized ColorSpace object: ${cs}`);
+    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());
+  }
+}
+
+;// ./src/core/jpg.js
+
+
+
+
+class JpegError extends BaseException {
+  constructor(msg) {
+    super(msg, "JpegError");
+  }
+}
+class DNLMarkerError extends BaseException {
+  constructor(message, scanLines) {
+    super(message, "DNLMarkerError");
+    this.scanLines = scanLines;
+  }
+}
+class EOIMarkerError extends BaseException {
+  constructor(msg) {
+    super(msg, "EOIMarkerError");
+  }
+}
+const dctZigZag = 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]);
+const dctCos1 = 4017;
+const dctSin1 = 799;
+const dctCos3 = 3406;
+const dctSin3 = 2276;
+const dctCos6 = 1567;
+const dctSin6 = 3784;
+const dctSqrt2 = 5793;
+const dctSqrt1d2 = 2896;
+function buildHuffmanTable(codeLengths, values) {
+  let k = 0,
+    i,
+    j,
+    length = 16;
+  while (length > 0 && !codeLengths[length - 1]) {
+    length--;
+  }
+  const code = [{
+    children: [],
+    index: 0
+  }];
+  let p = code[0],
+    q;
+  for (i = 0; i < length; i++) {
+    for (j = 0; j < codeLengths[i]; j++) {
+      p = code.pop();
+      p.children[p.index] = values[k];
+      while (p.index > 0) {
+        p = code.pop();
+      }
+      p.index++;
+      code.push(p);
+      while (code.length <= i) {
+        code.push(q = {
+          children: [],
+          index: 0
+        });
+        p.children[p.index] = q.children;
+        p = q;
+      }
+      k++;
+    }
+    if (i + 1 < length) {
+      code.push(q = {
+        children: [],
+        index: 0
+      });
+      p.children[p.index] = q.children;
+      p = q;
+    }
+  }
+  return code[0].children;
+}
+function getBlockBufferOffset(component, row, col) {
+  return 64 * ((component.blocksPerLine + 1) * row + col);
+}
+function decodeScan(data, view, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) {
+  const mcusPerLine = frame.mcusPerLine;
+  const progressive = frame.progressive;
+  const startOffset = offset;
+  let bitsData = 0,
+    bitsCount = 0;
+  function readBit() {
+    if (bitsCount > 0) {
+      bitsCount--;
+      return bitsData >> bitsCount & 1;
+    }
+    bitsData = data[offset++];
+    if (bitsData === 0xff) {
+      const nextByte = data[offset++];
+      if (nextByte) {
+        if (nextByte === 0xdc && parseDNLMarker) {
+          offset += 2;
+          const scanLines = view.getUint16(offset);
+          offset += 2;
+          if (scanLines > 0 && scanLines !== frame.scanLines) {
+            throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines);
+          }
+        } else if (nextByte === 0xd9) {
+          if (parseDNLMarker) {
+            const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0);
+            if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 5) {
+              throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines);
+            }
+          }
+          throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data");
+        }
+        throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`);
+      }
+    }
+    bitsCount = 7;
+    return bitsData >>> 7;
+  }
+  function decodeHuffman(tree) {
+    let node = tree;
+    while (true) {
+      node = node[readBit()];
+      switch (typeof node) {
+        case "number":
+          return node;
+        case "object":
+          continue;
+      }
+      throw new JpegError("invalid huffman sequence");
+    }
+  }
+  function receive(length) {
+    let n = 0;
+    while (length > 0) {
+      n = n << 1 | readBit();
+      length--;
+    }
+    return n;
+  }
+  function receiveAndExtend(length) {
+    if (length === 1) {
+      return readBit() === 1 ? 1 : -1;
+    }
+    const n = receive(length);
+    if (n >= 1 << length - 1) {
+      return n;
+    }
+    return n + (-1 << length) + 1;
+  }
+  function decodeBaseline(component, blockOffset) {
+    const t = decodeHuffman(component.huffmanTableDC);
+    const diff = t === 0 ? 0 : receiveAndExtend(t);
+    component.blockData[blockOffset] = component.pred += diff;
+    let k = 1;
+    while (k < 64) {
+      const rs = decodeHuffman(component.huffmanTableAC);
+      const s = rs & 15,
+        r = rs >> 4;
+      if (s === 0) {
+        if (r < 15) {
+          break;
+        }
+        k += 16;
+        continue;
+      }
+      k += r;
+      const z = dctZigZag[k];
+      component.blockData[blockOffset + z] = receiveAndExtend(s);
+      k++;
+    }
+  }
+  function decodeDCFirst(component, blockOffset) {
+    const t = decodeHuffman(component.huffmanTableDC);
+    const diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
+    component.blockData[blockOffset] = component.pred += diff;
+  }
+  function decodeDCSuccessive(component, blockOffset) {
+    component.blockData[blockOffset] |= readBit() << successive;
+  }
+  let eobrun = 0;
+  function decodeACFirst(component, blockOffset) {
+    if (eobrun > 0) {
+      eobrun--;
+      return;
+    }
+    let k = spectralStart;
+    const e = spectralEnd;
+    while (k <= e) {
+      const rs = decodeHuffman(component.huffmanTableAC);
+      const s = rs & 15,
+        r = rs >> 4;
+      if (s === 0) {
+        if (r < 15) {
+          eobrun = receive(r) + (1 << r) - 1;
+          break;
+        }
+        k += 16;
+        continue;
+      }
+      k += r;
+      const z = dctZigZag[k];
+      component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive);
+      k++;
+    }
+  }
+  let successiveACState = 0,
+    successiveACNextValue;
+  function decodeACSuccessive(component, blockOffset) {
+    let k = spectralStart;
+    const e = spectralEnd;
+    let r = 0;
+    let s;
+    let rs;
+    while (k <= e) {
+      const offsetZ = blockOffset + dctZigZag[k];
+      const sign = component.blockData[offsetZ] < 0 ? -1 : 1;
+      switch (successiveACState) {
+        case 0:
+          rs = decodeHuffman(component.huffmanTableAC);
+          s = rs & 15;
+          r = rs >> 4;
+          if (s === 0) {
+            if (r < 15) {
+              eobrun = receive(r) + (1 << r);
+              successiveACState = 4;
+            } else {
+              r = 16;
+              successiveACState = 1;
+            }
+          } else {
+            if (s !== 1) {
+              throw new JpegError("invalid ACn encoding");
+            }
+            successiveACNextValue = receiveAndExtend(s);
+            successiveACState = r ? 2 : 3;
+          }
+          continue;
+        case 1:
+        case 2:
+          if (component.blockData[offsetZ]) {
+            component.blockData[offsetZ] += sign * (readBit() << successive);
+          } else {
+            r--;
+            if (r === 0) {
+              successiveACState = successiveACState === 2 ? 3 : 0;
+            }
+          }
+          break;
+        case 3:
+          if (component.blockData[offsetZ]) {
+            component.blockData[offsetZ] += sign * (readBit() << successive);
+          } else {
+            component.blockData[offsetZ] = successiveACNextValue << successive;
+            successiveACState = 0;
+          }
+          break;
+        case 4:
+          if (component.blockData[offsetZ]) {
+            component.blockData[offsetZ] += sign * (readBit() << successive);
+          }
+          break;
+      }
+      k++;
+    }
+    if (successiveACState === 4) {
+      eobrun--;
+      if (eobrun === 0) {
+        successiveACState = 0;
+      }
+    }
+  }
+  let blockRow = 0;
+  function decodeMcu(component, decode, mcu, row, col) {
+    const mcuRow = mcu / mcusPerLine | 0;
+    const mcuCol = mcu % mcusPerLine;
+    blockRow = mcuRow * component.v + row;
+    const blockCol = mcuCol * component.h + col;
+    const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
+    decode(component, blockOffset);
+  }
+  function decodeBlock(component, decode, mcu) {
+    blockRow = mcu / component.blocksPerLine | 0;
+    const blockCol = mcu % component.blocksPerLine;
+    const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
+    decode(component, blockOffset);
+  }
+  const componentsLength = components.length;
+  let component, i, j, k, n;
+  let decodeFn;
+  if (progressive) {
+    if (spectralStart === 0) {
+      decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
+    } else {
+      decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
+    }
+  } else {
+    decodeFn = decodeBaseline;
+  }
+  let mcu = 0,
+    fileMarker;
+  const mcuExpected = componentsLength === 1 ? components[0].blocksPerLine * components[0].blocksPerColumn : mcusPerLine * frame.mcusPerColumn;
+  let h, v;
+  while (mcu <= mcuExpected) {
+    const mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;
+    if (mcuToRead > 0) {
+      for (i = 0; i < componentsLength; i++) {
+        components[i].pred = 0;
+      }
+      eobrun = 0;
+      if (componentsLength === 1) {
+        component = components[0];
+        for (n = 0; n < mcuToRead; n++) {
+          decodeBlock(component, decodeFn, mcu);
+          mcu++;
+        }
+      } else {
+        for (n = 0; n < mcuToRead; n++) {
+          for (i = 0; i < componentsLength; i++) {
+            component = components[i];
+            h = component.h;
+            v = component.v;
+            for (j = 0; j < v; j++) {
+              for (k = 0; k < h; k++) {
+                decodeMcu(component, decodeFn, mcu, j, k);
+              }
+            }
+          }
+          mcu++;
+        }
+      }
+    }
+    bitsCount = 0;
+    fileMarker = findNextFileMarker(data, view, offset);
+    if (!fileMarker) {
+      break;
+    }
+    if (fileMarker.invalid) {
+      const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive";
+      warn(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`);
+      offset = fileMarker.offset;
+    }
+    if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) {
+      offset += 2;
+    } else {
+      break;
+    }
+  }
+  return offset - startOffset;
+}
+function quantizeAndInverse(component, blockBufferOffset, p) {
+  const qt = component.quantizationTable,
+    blockData = component.blockData;
+  let v0, v1, v2, v3, v4, v5, v6, v7;
+  let p0, p1, p2, p3, p4, p5, p6, p7;
+  let t;
+  if (!qt) {
+    throw new JpegError("missing required Quantization Table.");
+  }
+  for (let row = 0; row < 64; row += 8) {
+    p0 = blockData[blockBufferOffset + row];
+    p1 = blockData[blockBufferOffset + row + 1];
+    p2 = blockData[blockBufferOffset + row + 2];
+    p3 = blockData[blockBufferOffset + row + 3];
+    p4 = blockData[blockBufferOffset + row + 4];
+    p5 = blockData[blockBufferOffset + row + 5];
+    p6 = blockData[blockBufferOffset + row + 6];
+    p7 = blockData[blockBufferOffset + row + 7];
+    p0 *= qt[row];
+    if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
+      t = dctSqrt2 * p0 + 512 >> 10;
+      p[row] = t;
+      p[row + 1] = t;
+      p[row + 2] = t;
+      p[row + 3] = t;
+      p[row + 4] = t;
+      p[row + 5] = t;
+      p[row + 6] = t;
+      p[row + 7] = t;
+      continue;
+    }
+    p1 *= qt[row + 1];
+    p2 *= qt[row + 2];
+    p3 *= qt[row + 3];
+    p4 *= qt[row + 4];
+    p5 *= qt[row + 5];
+    p6 *= qt[row + 6];
+    p7 *= qt[row + 7];
+    v0 = dctSqrt2 * p0 + 128 >> 8;
+    v1 = dctSqrt2 * p4 + 128 >> 8;
+    v2 = p2;
+    v3 = p6;
+    v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;
+    v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;
+    v5 = p3 << 4;
+    v6 = p5 << 4;
+    v0 = v0 + v1 + 1 >> 1;
+    v1 = v0 - v1;
+    t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
+    v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
+    v3 = t;
+    v4 = v4 + v6 + 1 >> 1;
+    v6 = v4 - v6;
+    v7 = v7 + v5 + 1 >> 1;
+    v5 = v7 - v5;
+    v0 = v0 + v3 + 1 >> 1;
+    v3 = v0 - v3;
+    v1 = v1 + v2 + 1 >> 1;
+    v2 = v1 - v2;
+    t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
+    v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
+    v7 = t;
+    t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
+    v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
+    v6 = t;
+    p[row] = v0 + v7;
+    p[row + 7] = v0 - v7;
+    p[row + 1] = v1 + v6;
+    p[row + 6] = v1 - v6;
+    p[row + 2] = v2 + v5;
+    p[row + 5] = v2 - v5;
+    p[row + 3] = v3 + v4;
+    p[row + 4] = v3 - v4;
+  }
+  for (let col = 0; col < 8; ++col) {
+    p0 = p[col];
+    p1 = p[col + 8];
+    p2 = p[col + 16];
+    p3 = p[col + 24];
+    p4 = p[col + 32];
+    p5 = p[col + 40];
+    p6 = p[col + 48];
+    p7 = p[col + 56];
+    if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
+      t = dctSqrt2 * p0 + 8192 >> 14;
+      if (t < -2040) {
+        t = 0;
+      } else if (t >= 2024) {
+        t = 255;
+      } else {
+        t = t + 2056 >> 4;
+      }
+      blockData[blockBufferOffset + col] = t;
+      blockData[blockBufferOffset + col + 8] = t;
+      blockData[blockBufferOffset + col + 16] = t;
+      blockData[blockBufferOffset + col + 24] = t;
+      blockData[blockBufferOffset + col + 32] = t;
+      blockData[blockBufferOffset + col + 40] = t;
+      blockData[blockBufferOffset + col + 48] = t;
+      blockData[blockBufferOffset + col + 56] = t;
+      continue;
+    }
+    v0 = dctSqrt2 * p0 + 2048 >> 12;
+    v1 = dctSqrt2 * p4 + 2048 >> 12;
+    v2 = p2;
+    v3 = p6;
+    v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;
+    v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;
+    v5 = p3;
+    v6 = p5;
+    v0 = (v0 + v1 + 1 >> 1) + 4112;
+    v1 = v0 - v1;
+    t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
+    v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
+    v3 = t;
+    v4 = v4 + v6 + 1 >> 1;
+    v6 = v4 - v6;
+    v7 = v7 + v5 + 1 >> 1;
+    v5 = v7 - v5;
+    v0 = v0 + v3 + 1 >> 1;
+    v3 = v0 - v3;
+    v1 = v1 + v2 + 1 >> 1;
+    v2 = v1 - v2;
+    t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
+    v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
+    v7 = t;
+    t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
+    v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
+    v6 = t;
+    p0 = v0 + v7;
+    p7 = v0 - v7;
+    p1 = v1 + v6;
+    p6 = v1 - v6;
+    p2 = v2 + v5;
+    p5 = v2 - v5;
+    p3 = v3 + v4;
+    p4 = v3 - v4;
+    if (p0 < 16) {
+      p0 = 0;
+    } else if (p0 >= 4080) {
+      p0 = 255;
+    } else {
+      p0 >>= 4;
+    }
+    if (p1 < 16) {
+      p1 = 0;
+    } else if (p1 >= 4080) {
+      p1 = 255;
+    } else {
+      p1 >>= 4;
+    }
+    if (p2 < 16) {
+      p2 = 0;
+    } else if (p2 >= 4080) {
+      p2 = 255;
+    } else {
+      p2 >>= 4;
+    }
+    if (p3 < 16) {
+      p3 = 0;
+    } else if (p3 >= 4080) {
+      p3 = 255;
+    } else {
+      p3 >>= 4;
+    }
+    if (p4 < 16) {
+      p4 = 0;
+    } else if (p4 >= 4080) {
+      p4 = 255;
+    } else {
+      p4 >>= 4;
+    }
+    if (p5 < 16) {
+      p5 = 0;
+    } else if (p5 >= 4080) {
+      p5 = 255;
+    } else {
+      p5 >>= 4;
+    }
+    if (p6 < 16) {
+      p6 = 0;
+    } else if (p6 >= 4080) {
+      p6 = 255;
+    } else {
+      p6 >>= 4;
+    }
+    if (p7 < 16) {
+      p7 = 0;
+    } else if (p7 >= 4080) {
+      p7 = 255;
+    } else {
+      p7 >>= 4;
+    }
+    blockData[blockBufferOffset + col] = p0;
+    blockData[blockBufferOffset + col + 8] = p1;
+    blockData[blockBufferOffset + col + 16] = p2;
+    blockData[blockBufferOffset + col + 24] = p3;
+    blockData[blockBufferOffset + col + 32] = p4;
+    blockData[blockBufferOffset + col + 40] = p5;
+    blockData[blockBufferOffset + col + 48] = p6;
+    blockData[blockBufferOffset + col + 56] = p7;
+  }
+}
+function buildComponentData(frame, component) {
+  const blocksPerLine = component.blocksPerLine;
+  const blocksPerColumn = component.blocksPerColumn;
+  const computationBuffer = new Int16Array(64);
+  for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
+    for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) {
+      const offset = getBlockBufferOffset(component, blockRow, blockCol);
+      quantizeAndInverse(component, offset, computationBuffer);
+    }
+  }
+  return component.blockData;
+}
+function findNextFileMarker(data, view, currentPos, startPos = currentPos) {
+  const maxPos = data.length - 1;
+  let newPos = startPos < currentPos ? startPos : currentPos;
+  if (currentPos >= maxPos) {
+    return null;
+  }
+  const currentMarker = view.getUint16(currentPos);
+  if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {
+    return {
+      invalid: null,
+      marker: currentMarker,
+      offset: currentPos
+    };
+  }
+  let newMarker = view.getUint16(newPos);
+  while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {
+    if (++newPos >= maxPos) {
+      return null;
+    }
+    newMarker = view.getUint16(newPos);
+  }
+  return {
+    invalid: currentMarker.toString(16),
+    marker: newMarker,
+    offset: newPos
+  };
+}
+function prepareComponents(frame) {
+  const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
+  const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
+  for (const component of frame.components) {
+    const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
+    const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);
+    const blocksPerLineForMcu = mcusPerLine * component.h;
+    const blocksPerColumnForMcu = mcusPerColumn * component.v;
+    const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);
+    component.blockData = new Int16Array(blocksBufferSize);
+    component.blocksPerLine = blocksPerLine;
+    component.blocksPerColumn = blocksPerColumn;
+  }
+  frame.mcusPerLine = mcusPerLine;
+  frame.mcusPerColumn = mcusPerColumn;
+}
+function readDataBlock(data, view, offset) {
+  const length = view.getUint16(offset);
+  offset += 2;
+  let endOffset = offset + length - 2;
+  const fileMarker = findNextFileMarker(data, view, endOffset, offset);
+  if (fileMarker?.invalid) {
+    warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid);
+    endOffset = fileMarker.offset;
+  }
+  const array = data.subarray(offset, endOffset);
+  return {
+    appData: array,
+    oldOffset: offset,
+    newOffset: offset + array.length
+  };
+}
+function skipData(data, view, offset) {
+  const length = view.getUint16(offset);
+  offset += 2;
+  const endOffset = offset + length - 2;
+  const fileMarker = findNextFileMarker(data, view, endOffset, offset);
+  if (fileMarker?.invalid) {
+    return fileMarker.offset;
+  }
+  return endOffset;
+}
+class JpegImage {
+  constructor({
+    decodeTransform = null,
+    colorTransform = -1
+  } = {}) {
+    this._decodeTransform = decodeTransform;
+    this._colorTransform = colorTransform;
+  }
+  static canUseImageDecoder(data, colorTransform = -1) {
+    const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
+    let exifOffsets = null;
+    let offset = 0;
+    let numComponents = null;
+    let fileMarker = view.getUint16(offset);
+    offset += 2;
+    if (fileMarker !== 0xffd8) {
+      throw new JpegError("SOI not found");
+    }
+    fileMarker = view.getUint16(offset);
+    offset += 2;
+    markerLoop: while (fileMarker !== 0xffd9) {
+      switch (fileMarker) {
+        case 0xffe1:
+          const {
+            appData,
+            oldOffset,
+            newOffset
+          } = readDataBlock(data, view, offset);
+          offset = newOffset;
+          if (appData[0] === 0x45 && appData[1] === 0x78 && appData[2] === 0x69 && appData[3] === 0x66 && appData[4] === 0 && appData[5] === 0) {
+            if (exifOffsets) {
+              throw new JpegError("Duplicate EXIF-blocks found.");
+            }
+            exifOffsets = {
+              exifStart: oldOffset + 6,
+              exifEnd: newOffset
+            };
+          }
+          fileMarker = view.getUint16(offset);
+          offset += 2;
+          continue;
+        case 0xffc0:
+        case 0xffc1:
+        case 0xffc2:
+          numComponents = data[offset + (2 + 1 + 2 + 2)];
+          break markerLoop;
+        case 0xffff:
+          if (data[offset] !== 0xff) {
+            offset--;
+          }
+          break;
+      }
+      offset = skipData(data, view, offset);
+      fileMarker = view.getUint16(offset);
+      offset += 2;
+    }
+    if (numComponents === 4) {
+      return null;
+    }
+    if (numComponents === 3 && colorTransform === 0) {
+      return null;
+    }
+    return exifOffsets || {};
+  }
+  parse(data, {
+    dnlScanLines = null
+  } = {}) {
+    const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
+    const maxOffset = data.length - 1;
+    let offset = 0;
+    let jfif = null;
+    let adobe = null;
+    let frame, resetInterval;
+    let numSOSMarkers = 0;
+    const quantizationTables = [];
+    const huffmanTablesAC = [],
+      huffmanTablesDC = [];
+    let fileMarker = view.getUint16(offset);
+    offset += 2;
+    if (fileMarker !== 0xffd8) {
+      throw new JpegError("SOI not found");
+    }
+    fileMarker = view.getUint16(offset);
+    offset += 2;
+    markerLoop: while (fileMarker !== 0xffd9) {
+      let i, j, l;
+      switch (fileMarker) {
+        case 0xffe0:
+        case 0xffe1:
+        case 0xffe2:
+        case 0xffe3:
+        case 0xffe4:
+        case 0xffe5:
+        case 0xffe6:
+        case 0xffe7:
+        case 0xffe8:
+        case 0xffe9:
+        case 0xffea:
+        case 0xffeb:
+        case 0xffec:
+        case 0xffed:
+        case 0xffee:
+        case 0xffef:
+        case 0xfffe:
+          const {
+            appData,
+            newOffset
+          } = readDataBlock(data, view, offset);
+          offset = newOffset;
+          if (fileMarker === 0xffe0) {
+            if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
+              jfif = {
+                version: {
+                  major: appData[5],
+                  minor: appData[6]
+                },
+                densityUnits: appData[7],
+                xDensity: appData[8] << 8 | appData[9],
+                yDensity: appData[10] << 8 | appData[11],
+                thumbWidth: appData[12],
+                thumbHeight: appData[13],
+                thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
+              };
+            }
+          }
+          if (fileMarker === 0xffee) {
+            if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) {
+              adobe = {
+                version: appData[5] << 8 | appData[6],
+                flags0: appData[7] << 8 | appData[8],
+                flags1: appData[9] << 8 | appData[10],
+                transformCode: appData[11]
+              };
+            }
+          }
+          break;
+        case 0xffdb:
+          const quantizationTablesLength = view.getUint16(offset);
+          offset += 2;
+          const quantizationTablesEnd = quantizationTablesLength + offset - 2;
+          let z;
+          while (offset < quantizationTablesEnd) {
+            const quantizationTableSpec = data[offset++];
+            const tableData = new Uint16Array(64);
+            if (quantizationTableSpec >> 4 === 0) {
+              for (j = 0; j < 64; j++) {
+                z = dctZigZag[j];
+                tableData[z] = data[offset++];
+              }
+            } else if (quantizationTableSpec >> 4 === 1) {
+              for (j = 0; j < 64; j++) {
+                z = dctZigZag[j];
+                tableData[z] = view.getUint16(offset);
+                offset += 2;
+              }
+            } else {
+              throw new JpegError("DQT - invalid table spec");
+            }
+            quantizationTables[quantizationTableSpec & 15] = tableData;
+          }
+          break;
+        case 0xffc0:
+        case 0xffc1:
+        case 0xffc2:
+          if (frame) {
+            throw new JpegError("Only single frame JPEGs supported");
+          }
+          offset += 2;
+          frame = {};
+          frame.extended = fileMarker === 0xffc1;
+          frame.progressive = fileMarker === 0xffc2;
+          frame.precision = data[offset++];
+          const sofScanLines = view.getUint16(offset);
+          offset += 2;
+          frame.scanLines = dnlScanLines || sofScanLines;
+          frame.samplesPerLine = view.getUint16(offset);
+          offset += 2;
+          frame.components = [];
+          frame.componentIds = {};
+          const componentsCount = data[offset++];
+          let maxH = 0,
+            maxV = 0;
+          for (i = 0; i < componentsCount; i++) {
+            const componentId = data[offset];
+            const h = data[offset + 1] >> 4;
+            const v = data[offset + 1] & 15;
+            if (maxH < h) {
+              maxH = h;
+            }
+            if (maxV < v) {
+              maxV = v;
+            }
+            const qId = data[offset + 2];
+            l = frame.components.push({
+              h,
+              v,
+              quantizationId: qId,
+              quantizationTable: null
+            });
+            frame.componentIds[componentId] = l - 1;
+            offset += 3;
+          }
+          frame.maxH = maxH;
+          frame.maxV = maxV;
+          prepareComponents(frame);
+          break;
+        case 0xffc4:
+          const huffmanLength = view.getUint16(offset);
+          offset += 2;
+          for (i = 2; i < huffmanLength;) {
+            const huffmanTableSpec = data[offset++];
+            const codeLengths = new Uint8Array(16);
+            let codeLengthSum = 0;
+            for (j = 0; j < 16; j++, offset++) {
+              codeLengthSum += codeLengths[j] = data[offset];
+            }
+            const huffmanValues = new Uint8Array(codeLengthSum);
+            for (j = 0; j < codeLengthSum; j++, offset++) {
+              huffmanValues[j] = data[offset];
+            }
+            i += 17 + codeLengthSum;
+            (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
+          }
+          break;
+        case 0xffdd:
+          offset += 2;
+          resetInterval = view.getUint16(offset);
+          offset += 2;
+          break;
+        case 0xffda:
+          const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
+          offset += 2;
+          const selectorsCount = data[offset++],
+            components = [];
+          for (i = 0; i < selectorsCount; i++) {
+            const index = data[offset++];
+            const componentIndex = frame.componentIds[index];
+            const component = frame.components[componentIndex];
+            component.index = index;
+            const tableSpec = data[offset++];
+            component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
+            component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
+            components.push(component);
+          }
+          const spectralStart = data[offset++],
+            spectralEnd = data[offset++],
+            successiveApproximation = data[offset++];
+          try {
+            const processed = decodeScan(data, view, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker);
+            offset += processed;
+          } catch (ex) {
+            if (ex instanceof DNLMarkerError) {
+              warn(`${ex.message} -- attempting to re-parse the JPEG image.`);
+              return this.parse(data, {
+                dnlScanLines: ex.scanLines
+              });
+            } else if (ex instanceof EOIMarkerError) {
+              warn(`${ex.message} -- ignoring the rest of the image data.`);
+              break markerLoop;
+            }
+            throw ex;
+          }
+          break;
+        case 0xffdc:
+          offset += 4;
+          break;
+        case 0xffff:
+          if (data[offset] !== 0xff) {
+            offset--;
+          }
+          break;
+        default:
+          const nextFileMarker = findNextFileMarker(data, view, offset - 2, offset - 3);
+          if (nextFileMarker?.invalid) {
+            warn("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid);
+            offset = nextFileMarker.offset;
+            break;
+          }
+          if (!nextFileMarker || offset >= maxOffset) {
+            warn("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9).");
+            break markerLoop;
+          }
+          throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16));
+      }
+      if (offset < maxOffset) {
+        fileMarker = view.getUint16(offset);
+        offset += 2;
+      } else {
+        fileMarker = 0;
+      }
+    }
+    if (!frame) {
+      throw new JpegError("JpegImage.parse - no frame data found.");
+    }
+    this.width = frame.samplesPerLine;
+    this.height = frame.scanLines;
+    this.jfif = jfif;
+    this.adobe = adobe;
+    this.components = [];
+    for (const component of frame.components) {
+      const quantizationTable = quantizationTables[component.quantizationId];
+      if (quantizationTable) {
+        component.quantizationTable = quantizationTable;
+      }
+      this.components.push({
+        index: component.index,
+        output: buildComponentData(frame, component),
+        scaleX: component.h / frame.maxH,
+        scaleY: component.v / frame.maxV,
+        blocksPerLine: component.blocksPerLine,
+        blocksPerColumn: component.blocksPerColumn
+      });
+    }
+    this.numComponents = this.components.length;
+    return undefined;
+  }
+  #getLinearizedBlockData(width, height, isSourcePDF) {
+    const scaleX = this.width / width,
+      scaleY = this.height / height;
+    let component, componentScaleX, componentScaleY, blocksPerScanline;
+    let x, y, i, j, k;
+    let index;
+    let offset = 0;
+    let output;
+    const numComponents = this.components.length;
+    const dataLength = width * height * numComponents;
+    const data = new Uint8ClampedArray(dataLength);
+    const xScaleBlockOffset = new Uint32Array(width);
+    const mask3LSB = 0xfffffff8;
+    let lastComponentScaleX;
+    for (i = 0; i < numComponents; i++) {
+      component = this.components[i];
+      componentScaleX = component.scaleX * scaleX;
+      componentScaleY = component.scaleY * scaleY;
+      offset = i;
+      output = component.output;
+      blocksPerScanline = component.blocksPerLine + 1 << 3;
+      if (componentScaleX !== lastComponentScaleX) {
+        for (x = 0; x < width; x++) {
+          j = 0 | x * componentScaleX;
+          xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
+        }
+        lastComponentScaleX = componentScaleX;
+      }
+      for (y = 0; y < height; y++) {
+        j = 0 | y * componentScaleY;
+        index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;
+        for (x = 0; x < width; x++) {
+          data[offset] = output[index + xScaleBlockOffset[x]];
+          offset += numComponents;
+        }
+      }
+    }
+    let transform = this._decodeTransform;
+    if (transform) {
+      for (i = 0; i < dataLength;) {
+        for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
+          data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];
+        }
+      }
+    }
+    return data;
+  }
+  get _isColorConversionNeeded() {
+    if (this.adobe) {
+      return !!this.adobe.transformCode;
+    }
+    if (this.numComponents === 3) {
+      if (this._colorTransform === 0) {
+        return false;
+      } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) {
+        return false;
+      }
+      return true;
+    }
+    if (this._colorTransform === 1) {
+      return true;
+    }
+    return false;
+  }
+  _convertYccToRgb(data) {
+    let Y, Cb, Cr;
+    for (let i = 0, ii = data.length; i < ii; i += 3) {
+      Y = data[i];
+      Cb = data[i + 1];
+      Cr = data[i + 2];
+      data[i] = Y - 179.456 + 1.402 * Cr;
+      data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
+      data[i + 2] = Y - 226.816 + 1.772 * Cb;
+    }
+    return data;
+  }
+  _convertYccToRgba(data, out) {
+    for (let i = 0, j = 0, ii = data.length; i < ii; i += 3, j += 4) {
+      const Y = data[i];
+      const Cb = data[i + 1];
+      const Cr = data[i + 2];
+      out[j] = Y - 179.456 + 1.402 * Cr;
+      out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
+      out[j + 2] = Y - 226.816 + 1.772 * Cb;
+      out[j + 3] = 255;
+    }
+    return out;
+  }
+  _convertYcckToRgb(data) {
+    this._convertYcckToCmyk(data);
+    return this._convertCmykToRgb(data);
+  }
+  _convertYcckToRgba(data) {
+    this._convertYcckToCmyk(data);
+    return this._convertCmykToRgba(data);
+  }
+  _convertYcckToCmyk(data) {
+    let Y, Cb, Cr;
+    for (let i = 0, ii = data.length; i < ii; i += 4) {
+      Y = data[i];
+      Cb = data[i + 1];
+      Cr = data[i + 2];
+      data[i] = 434.456 - Y - 1.402 * Cr;
+      data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;
+      data[i + 2] = 481.816 - Y - 1.772 * Cb;
+    }
+    return data;
+  }
+  _convertCmykToRgb(data) {
+    const count = data.length / 4;
+    ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, count, data, 0, 8, 0);
+    return data.subarray(0, count * 3);
+  }
+  _convertCmykToRgba(data) {
+    ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, data.length / 4, data, 0, 8, 1);
+    if (ColorSpaceUtils.cmyk instanceof DeviceCmykCS) {
+      for (let i = 3, ii = data.length; i < ii; i += 4) {
+        data[i] = 255;
+      }
+    }
+    return data;
+  }
+  getData({
+    width,
+    height,
+    forceRGBA = false,
+    forceRGB = false,
+    isSourcePDF = true
+  }) {
+    if (this.numComponents > 4) {
+      throw new JpegError("Unsupported color mode");
+    }
+    const data = this.#getLinearizedBlockData(width, height, isSourcePDF);
+    if (this.numComponents === 1 && (forceRGBA || forceRGB)) {
+      const len = data.length * (forceRGBA ? 4 : 3);
+      const rgbaData = new Uint8ClampedArray(len);
+      let offset = 0;
+      if (forceRGBA) {
+        grayToRGBA(data, new Uint32Array(rgbaData.buffer));
+      } else {
+        for (const grayColor of data) {
+          rgbaData[offset++] = grayColor;
+          rgbaData[offset++] = grayColor;
+          rgbaData[offset++] = grayColor;
+        }
+      }
+      return rgbaData;
+    } else if (this.numComponents === 3 && this._isColorConversionNeeded) {
+      if (forceRGBA) {
+        const rgbaData = new Uint8ClampedArray(data.length / 3 * 4);
+        return this._convertYccToRgba(data, rgbaData);
+      }
+      return this._convertYccToRgb(data);
+    } else if (this.numComponents === 4) {
+      if (this._isColorConversionNeeded) {
+        if (forceRGBA) {
+          return this._convertYcckToRgba(data);
+        }
+        if (forceRGB) {
+          return this._convertYcckToRgb(data);
+        }
+        return this._convertYcckToCmyk(data);
+      } else if (forceRGBA) {
+        return this._convertCmykToRgba(data);
+      } else if (forceRGB) {
+        return this._convertCmykToRgb(data);
+      }
+    }
+    return data;
+  }
+}
+
+;// ./src/core/jpeg_stream.js
+
+
+
+
+class JpegStream extends DecodeStream {
+  static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported;
+  constructor(stream, maybeLength, params) {
+    super(maybeLength);
+    this.stream = stream;
+    this.dict = stream.dict;
+    this.maybeLength = maybeLength;
+    this.params = params;
+  }
+  static get canUseImageDecoder() {
+    return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/jpeg") : Promise.resolve(false));
+  }
+  static setOptions({
+    isImageDecoderSupported = false
+  }) {
+    this.#isImageDecoderSupported = isImageDecoderSupported;
+  }
+  get bytes() {
+    return shadow(this, "bytes", this.stream.getBytes(this.maybeLength));
+  }
+  ensureBuffer(requested) {}
+  readBlock() {
+    this.decodeImage();
+  }
+  get jpegOptions() {
+    const jpegOptions = {
+      decodeTransform: undefined,
+      colorTransform: undefined
+    };
+    const decodeArr = this.dict.getArray("D", "Decode");
+    if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) {
+      const bitsPerComponent = this.dict.get("BPC", "BitsPerComponent") || 8;
+      const decodeArrLength = decodeArr.length;
+      const transform = new Int32Array(decodeArrLength);
+      let transformNeeded = false;
+      const maxValue = (1 << bitsPerComponent) - 1;
+      for (let i = 0; i < decodeArrLength; i += 2) {
+        transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;
+        transform[i + 1] = decodeArr[i] * maxValue | 0;
+        if (transform[i] !== 256 || transform[i + 1] !== 0) {
+          transformNeeded = true;
+        }
+      }
+      if (transformNeeded) {
+        jpegOptions.decodeTransform = transform;
+      }
+    }
+    if (this.params instanceof Dict) {
+      const colorTransform = this.params.get("ColorTransform");
+      if (Number.isInteger(colorTransform)) {
+        jpegOptions.colorTransform = colorTransform;
+      }
+    }
+    return shadow(this, "jpegOptions", jpegOptions);
+  }
+  #skipUselessBytes(data) {
+    for (let i = 0, ii = data.length - 1; i < ii; i++) {
+      if (data[i] === 0xff && data[i + 1] === 0xd8) {
+        if (i > 0) {
+          data = data.subarray(i);
+        }
+        break;
+      }
+    }
+    return data;
+  }
+  decodeImage(bytes) {
+    if (this.eof) {
+      return this.buffer;
+    }
+    bytes = this.#skipUselessBytes(bytes || this.bytes);
+    const jpegImage = new JpegImage(this.jpegOptions);
+    jpegImage.parse(bytes);
+    const data = jpegImage.getData({
+      width: this.drawWidth,
+      height: this.drawHeight,
+      forceRGBA: this.forceRGBA,
+      forceRGB: this.forceRGB
+    });
+    this.buffer = data;
+    this.bufferLength = data.length;
+    this.eof = true;
+    return this.buffer;
+  }
+  get canAsyncDecodeImageFromBuffer() {
+    return this.stream.isAsync;
+  }
+  async getTransferableImage() {
+    if (!(await JpegStream.canUseImageDecoder)) {
+      return null;
+    }
+    const jpegOptions = this.jpegOptions;
+    if (jpegOptions.decodeTransform) {
+      return null;
+    }
+    let decoder;
+    try {
+      const bytes = this.canAsyncDecodeImageFromBuffer && (await this.stream.asyncGetBytes()) || this.bytes;
+      if (!bytes) {
+        return null;
+      }
+      let data = this.#skipUselessBytes(bytes);
+      const useImageDecoder = JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform);
+      if (!useImageDecoder) {
+        return null;
+      }
+      if (useImageDecoder.exifStart) {
+        data = data.slice();
+        data.fill(0x00, useImageDecoder.exifStart, useImageDecoder.exifEnd);
+      }
+      decoder = new ImageDecoder({
+        data,
+        type: "image/jpeg",
+        preferAnimation: false
+      });
+      return (await decoder.decode()).image;
+    } catch (reason) {
+      warn(`getTransferableImage - failed: "${reason}".`);
+      return null;
+    } finally {
+      decoder?.close();
+    }
+  }
+  get isImageStream() {
+    return true;
+  }
+}
+
+;// ./src/core/operator_list.js
+
+function addState(parentState, pattern, checkFn, iterateFn, processFn) {
+  let state = parentState;
+  for (let i = 0, ii = pattern.length - 1; i < ii; i++) {
+    const item = pattern[i];
+    state = state[item] ||= [];
+  }
+  state[pattern.at(-1)] = {
+    checkFn,
+    iterateFn,
+    processFn
+  };
+}
+const InitialState = [];
+addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) {
+  const fnArray = context.fnArray;
+  const iFirstSave = context.iCurr - 3;
+  const pos = (i - iFirstSave) % 4;
+  switch (pos) {
+    case 0:
+      return fnArray[i] === OPS.save;
+    case 1:
+      return fnArray[i] === OPS.transform;
+    case 2:
+      return fnArray[i] === OPS.paintInlineImageXObject;
+    case 3:
+      return fnArray[i] === OPS.restore;
+  }
+  throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`);
+}, function foundInlineImageGroup(context, i) {
+  const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
+  const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
+  const MAX_WIDTH = 1000;
+  const IMAGE_PADDING = 1;
+  const fnArray = context.fnArray,
+    argsArray = context.argsArray;
+  const curr = context.iCurr;
+  const iFirstSave = curr - 3;
+  const iFirstTransform = curr - 2;
+  const iFirstPIIXO = curr - 1;
+  const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
+  if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
+    return i - (i - iFirstSave) % 4;
+  }
+  let maxX = 0;
+  const map = [];
+  let maxLineHeight = 0;
+  let currentX = IMAGE_PADDING,
+    currentY = IMAGE_PADDING;
+  for (let q = 0; q < count; q++) {
+    const transform = argsArray[iFirstTransform + (q << 2)];
+    const img = argsArray[iFirstPIIXO + (q << 2)][0];
+    if (currentX + img.width > MAX_WIDTH) {
+      maxX = Math.max(maxX, currentX);
+      currentY += maxLineHeight + 2 * IMAGE_PADDING;
+      currentX = 0;
+      maxLineHeight = 0;
+    }
+    map.push({
+      transform,
+      x: currentX,
+      y: currentY,
+      w: img.width,
+      h: img.height
+    });
+    currentX += img.width + 2 * IMAGE_PADDING;
+    maxLineHeight = Math.max(maxLineHeight, img.height);
+  }
+  const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
+  const imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
+  const imgData = new Uint8Array(imgWidth * imgHeight * 4);
+  const imgRowSize = imgWidth << 2;
+  for (let q = 0; q < count; q++) {
+    const data = argsArray[iFirstPIIXO + (q << 2)][0].data;
+    const rowSize = map[q].w << 2;
+    let dataOffset = 0;
+    let offset = map[q].x + map[q].y * imgWidth << 2;
+    imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
+    for (let k = 0, kk = map[q].h; k < kk; k++) {
+      imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
+      dataOffset += rowSize;
+      offset += imgRowSize;
+    }
+    imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
+    while (offset >= 0) {
+      data[offset - 4] = data[offset];
+      data[offset - 3] = data[offset + 1];
+      data[offset - 2] = data[offset + 2];
+      data[offset - 1] = data[offset + 3];
+      data[offset + rowSize] = data[offset + rowSize - 4];
+      data[offset + rowSize + 1] = data[offset + rowSize - 3];
+      data[offset + rowSize + 2] = data[offset + rowSize - 2];
+      data[offset + rowSize + 3] = data[offset + rowSize - 1];
+      offset -= imgRowSize;
+    }
+  }
+  const img = {
+    width: imgWidth,
+    height: imgHeight
+  };
+  if (context.isOffscreenCanvasSupported) {
+    const canvas = new OffscreenCanvas(imgWidth, imgHeight);
+    const ctx = canvas.getContext("2d");
+    ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0);
+    img.bitmap = canvas.transferToImageBitmap();
+    img.data = null;
+  } else {
+    img.kind = ImageKind.RGBA_32BPP;
+    img.data = imgData;
+  }
+  fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);
+  argsArray.splice(iFirstSave, count * 4, [img, map]);
+  return iFirstSave + 1;
+});
+addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) {
+  const fnArray = context.fnArray;
+  const iFirstSave = context.iCurr - 3;
+  const pos = (i - iFirstSave) % 4;
+  switch (pos) {
+    case 0:
+      return fnArray[i] === OPS.save;
+    case 1:
+      return fnArray[i] === OPS.transform;
+    case 2:
+      return fnArray[i] === OPS.paintImageMaskXObject;
+    case 3:
+      return fnArray[i] === OPS.restore;
+  }
+  throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`);
+}, function foundImageMaskGroup(context, i) {
+  const MIN_IMAGES_IN_MASKS_BLOCK = 10;
+  const MAX_IMAGES_IN_MASKS_BLOCK = 100;
+  const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
+  const fnArray = context.fnArray,
+    argsArray = context.argsArray;
+  const curr = context.iCurr;
+  const iFirstSave = curr - 3;
+  const iFirstTransform = curr - 2;
+  const iFirstPIMXO = curr - 1;
+  let count = Math.floor((i - iFirstSave) / 4);
+  if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
+    return i - (i - iFirstSave) % 4;
+  }
+  let isSameImage = false;
+  let iTransform, transformArgs;
+  const firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
+  const firstTransformArg0 = argsArray[iFirstTransform][0],
+    firstTransformArg1 = argsArray[iFirstTransform][1],
+    firstTransformArg2 = argsArray[iFirstTransform][2],
+    firstTransformArg3 = argsArray[iFirstTransform][3];
+  if (firstTransformArg1 === firstTransformArg2) {
+    isSameImage = true;
+    iTransform = iFirstTransform + 4;
+    let iPIMXO = iFirstPIMXO + 4;
+    for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
+      transformArgs = argsArray[iTransform];
+      if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) {
+        if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
+          isSameImage = false;
+        } else {
+          count = q;
+        }
+        break;
+      }
+    }
+  }
+  if (isSameImage) {
+    count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
+    const positions = new Float32Array(count * 2);
+    iTransform = iFirstTransform;
+    for (let q = 0; q < count; q++, iTransform += 4) {
+      transformArgs = argsArray[iTransform];
+      positions[q << 1] = transformArgs[4];
+      positions[(q << 1) + 1] = transformArgs[5];
+    }
+    fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);
+    argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]);
+  } else {
+    count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
+    const images = [];
+    for (let q = 0; q < count; q++) {
+      transformArgs = argsArray[iFirstTransform + (q << 2)];
+      const maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
+      images.push({
+        data: maskParams.data,
+        width: maskParams.width,
+        height: maskParams.height,
+        interpolate: maskParams.interpolate,
+        count: maskParams.count,
+        transform: transformArgs
+      });
+    }
+    fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);
+    argsArray.splice(iFirstSave, count * 4, [images]);
+  }
+  return iFirstSave + 1;
+});
+addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) {
+  const argsArray = context.argsArray;
+  const iFirstTransform = context.iCurr - 2;
+  return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0;
+}, function iterateImageGroup(context, i) {
+  const fnArray = context.fnArray,
+    argsArray = context.argsArray;
+  const iFirstSave = context.iCurr - 3;
+  const pos = (i - iFirstSave) % 4;
+  switch (pos) {
+    case 0:
+      return fnArray[i] === OPS.save;
+    case 1:
+      if (fnArray[i] !== OPS.transform) {
+        return false;
+      }
+      const iFirstTransform = context.iCurr - 2;
+      const firstTransformArg0 = argsArray[iFirstTransform][0];
+      const firstTransformArg3 = argsArray[iFirstTransform][3];
+      if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) {
+        return false;
+      }
+      return true;
+    case 2:
+      if (fnArray[i] !== OPS.paintImageXObject) {
+        return false;
+      }
+      const iFirstPIXO = context.iCurr - 1;
+      const firstPIXOArg0 = argsArray[iFirstPIXO][0];
+      if (argsArray[i][0] !== firstPIXOArg0) {
+        return false;
+      }
+      return true;
+    case 3:
+      return fnArray[i] === OPS.restore;
+  }
+  throw new Error(`iterateImageGroup - invalid pos: ${pos}`);
+}, function (context, i) {
+  const MIN_IMAGES_IN_BLOCK = 3;
+  const MAX_IMAGES_IN_BLOCK = 1000;
+  const fnArray = context.fnArray,
+    argsArray = context.argsArray;
+  const curr = context.iCurr;
+  const iFirstSave = curr - 3;
+  const iFirstTransform = curr - 2;
+  const iFirstPIXO = curr - 1;
+  const firstPIXOArg0 = argsArray[iFirstPIXO][0];
+  const firstTransformArg0 = argsArray[iFirstTransform][0];
+  const firstTransformArg3 = argsArray[iFirstTransform][3];
+  const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK);
+  if (count < MIN_IMAGES_IN_BLOCK) {
+    return i - (i - iFirstSave) % 4;
+  }
+  const positions = new Float32Array(count * 2);
+  let iTransform = iFirstTransform;
+  for (let q = 0; q < count; q++, iTransform += 4) {
+    const transformArgs = argsArray[iTransform];
+    positions[q << 1] = transformArgs[4];
+    positions[(q << 1) + 1] = transformArgs[5];
+  }
+  const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];
+  fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);
+  argsArray.splice(iFirstSave, count * 4, args);
+  return iFirstSave + 1;
+});
+addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) {
+  const fnArray = context.fnArray,
+    argsArray = context.argsArray;
+  const iFirstSave = context.iCurr - 4;
+  const pos = (i - iFirstSave) % 5;
+  switch (pos) {
+    case 0:
+      return fnArray[i] === OPS.beginText;
+    case 1:
+      return fnArray[i] === OPS.setFont;
+    case 2:
+      return fnArray[i] === OPS.setTextMatrix;
+    case 3:
+      if (fnArray[i] !== OPS.showText) {
+        return false;
+      }
+      const iFirstSetFont = context.iCurr - 3;
+      const firstSetFontArg0 = argsArray[iFirstSetFont][0];
+      const firstSetFontArg1 = argsArray[iFirstSetFont][1];
+      if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) {
+        return false;
+      }
+      return true;
+    case 4:
+      return fnArray[i] === OPS.endText;
+  }
+  throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`);
+}, function (context, i) {
+  const MIN_CHARS_IN_BLOCK = 3;
+  const MAX_CHARS_IN_BLOCK = 1000;
+  const fnArray = context.fnArray,
+    argsArray = context.argsArray;
+  const curr = context.iCurr;
+  const iFirstBeginText = curr - 4;
+  const iFirstSetFont = curr - 3;
+  const iFirstSetTextMatrix = curr - 2;
+  const iFirstShowText = curr - 1;
+  const iFirstEndText = curr;
+  const firstSetFontArg0 = argsArray[iFirstSetFont][0];
+  const firstSetFontArg1 = argsArray[iFirstSetFont][1];
+  let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);
+  if (count < MIN_CHARS_IN_BLOCK) {
+    return i - (i - iFirstBeginText) % 5;
+  }
+  let iFirst = iFirstBeginText;
+  if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {
+    count++;
+    iFirst -= 5;
+  }
+  let iEndText = iFirst + 4;
+  for (let q = 1; q < count; q++) {
+    fnArray.splice(iEndText, 3);
+    argsArray.splice(iEndText, 3);
+    iEndText += 2;
+  }
+  return iEndText + 1;
+});
+addState(InitialState, [OPS.save, OPS.transform, OPS.constructPath, OPS.restore], context => {
+  const argsArray = context.argsArray;
+  const iFirstConstructPath = context.iCurr - 1;
+  const op = argsArray[iFirstConstructPath][0];
+  if (op !== OPS.stroke && op !== OPS.closeStroke && op !== OPS.fillStroke && op !== OPS.eoFillStroke && op !== OPS.closeFillStroke && op !== OPS.closeEOFillStroke) {
+    return true;
+  }
+  const iFirstTransform = context.iCurr - 2;
+  const transform = argsArray[iFirstTransform];
+  return transform[0] === 1 && transform[1] === 0 && transform[2] === 0 && transform[3] === 1;
+}, () => false, (context, i) => {
+  const {
+    fnArray,
+    argsArray
+  } = context;
+  const curr = context.iCurr;
+  const iFirstSave = curr - 3;
+  const iFirstTransform = curr - 2;
+  const iFirstConstructPath = curr - 1;
+  const args = argsArray[iFirstConstructPath];
+  const transform = argsArray[iFirstTransform];
+  const [, [buffer], minMax] = args;
+  if (minMax) {
+    const newBBox = F32_BBOX_INIT.slice();
+    Util.axialAlignedBoundingBox(minMax, transform, newBBox);
+    minMax.set(newBBox);
+    for (let k = 0, kk = buffer.length; k < kk;) {
+      switch (buffer[k++]) {
+        case DrawOPS.moveTo:
+        case DrawOPS.lineTo:
+          Util.applyTransform(buffer, transform, k);
+          k += 2;
+          break;
+        case DrawOPS.curveTo:
+          Util.applyTransformToBezier(buffer, transform, k);
+          k += 6;
+          break;
+      }
+    }
+  }
+  fnArray.splice(iFirstSave, 4, OPS.constructPath);
+  argsArray.splice(iFirstSave, 4, args);
+  return iFirstSave + 1;
+});
+class NullOptimizer {
+  constructor(queue) {
+    this.queue = queue;
+  }
+  _optimize() {}
+  push(fn, args) {
+    this.queue.fnArray.push(fn);
+    this.queue.argsArray.push(args);
+    this._optimize();
+  }
+  flush() {}
+  reset() {}
+}
+class QueueOptimizer extends NullOptimizer {
+  constructor(queue) {
+    super(queue);
+    this.state = null;
+    this.context = {
+      iCurr: 0,
+      fnArray: queue.fnArray,
+      argsArray: queue.argsArray,
+      isOffscreenCanvasSupported: OperatorList.isOffscreenCanvasSupported
+    };
+    this.match = null;
+    this.lastProcessed = 0;
+  }
+  _optimize() {
+    const fnArray = this.queue.fnArray;
+    let i = this.lastProcessed,
+      ii = fnArray.length;
+    let state = this.state;
+    let match = this.match;
+    if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {
+      this.lastProcessed = ii;
+      return;
+    }
+    const context = this.context;
+    while (i < ii) {
+      if (match) {
+        const iterate = (0, match.iterateFn)(context, i);
+        if (iterate) {
+          i++;
+          continue;
+        }
+        i = (0, match.processFn)(context, i + 1);
+        ii = fnArray.length;
+        match = null;
+        state = null;
+        if (i >= ii) {
+          break;
+        }
+      }
+      state = (state || InitialState)[fnArray[i]];
+      if (!state || Array.isArray(state)) {
+        i++;
+        continue;
+      }
+      context.iCurr = i;
+      i++;
+      if (state.checkFn && !(0, state.checkFn)(context)) {
+        state = null;
+        continue;
+      }
+      match = state;
+      state = null;
+    }
+    this.state = state;
+    this.match = match;
+    this.lastProcessed = i;
+  }
+  flush() {
+    while (this.match) {
+      const length = this.queue.fnArray.length;
+      this.lastProcessed = (0, this.match.processFn)(this.context, length);
+      this.match = null;
+      this.state = null;
+      this._optimize();
+    }
+  }
+  reset() {
+    this.state = null;
+    this.match = null;
+    this.lastProcessed = 0;
+  }
+}
+class OperatorList {
+  static CHUNK_SIZE = 1000;
+  static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5;
+  static isOffscreenCanvasSupported = false;
+  constructor(intent = 0, streamSink) {
+    this._streamSink = streamSink;
+    this.fnArray = [];
+    this.argsArray = [];
+    this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this);
+    this.dependencies = new Set();
+    this._totalLength = 0;
+    this.weight = 0;
+    this._resolved = streamSink ? null : Promise.resolve();
+  }
+  static setOptions({
+    isOffscreenCanvasSupported
+  }) {
+    this.isOffscreenCanvasSupported = isOffscreenCanvasSupported;
+  }
+  get length() {
+    return this.argsArray.length;
+  }
+  get ready() {
+    return this._resolved || this._streamSink.ready;
+  }
+  get totalLength() {
+    return this._totalLength + this.length;
+  }
+  addOp(fn, args) {
+    this.optimizer.push(fn, args);
+    this.weight++;
+    if (this._streamSink) {
+      if (this.weight >= OperatorList.CHUNK_SIZE) {
+        this.flush();
+      } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) {
+        this.flush();
+      }
+    }
+  }
+  addImageOps(fn, args, optionalContent, hasMask = false) {
+    if (hasMask) {
+      this.addOp(OPS.save);
+      this.addOp(OPS.setGState, [[["SMask", false]]]);
+    }
+    if (optionalContent !== undefined) {
+      this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]);
+    }
+    this.addOp(fn, args);
+    if (optionalContent !== undefined) {
+      this.addOp(OPS.endMarkedContent, []);
+    }
+    if (hasMask) {
+      this.addOp(OPS.restore);
+    }
+  }
+  addDependency(dependency) {
+    if (this.dependencies.has(dependency)) {
+      return;
+    }
+    this.dependencies.add(dependency);
+    this.addOp(OPS.dependency, [dependency]);
+  }
+  addDependencies(dependencies) {
+    for (const dependency of dependencies) {
+      this.addDependency(dependency);
+    }
+  }
+  addOpList(opList) {
+    if (!(opList instanceof OperatorList)) {
+      warn('addOpList - ignoring invalid "opList" parameter.');
+      return;
+    }
+    for (const dependency of opList.dependencies) {
+      this.dependencies.add(dependency);
+    }
+    for (let i = 0, ii = opList.length; i < ii; i++) {
+      this.addOp(opList.fnArray[i], opList.argsArray[i]);
+    }
+  }
+  getIR() {
+    return {
+      fnArray: this.fnArray,
+      argsArray: this.argsArray,
+      length: this.length
+    };
+  }
+  get _transfers() {
+    const transfers = [];
+    const {
+      fnArray,
+      argsArray,
+      length
+    } = this;
+    for (let i = 0; i < length; i++) {
+      switch (fnArray[i]) {
+        case OPS.paintInlineImageXObject:
+        case OPS.paintInlineImageXObjectGroup:
+        case OPS.paintImageMaskXObject:
+          {
+            const {
+              bitmap,
+              data
+            } = argsArray[i][0];
+            if (bitmap || data?.buffer) {
+              transfers.push(bitmap || data.buffer);
+            }
+            break;
+          }
+        case OPS.constructPath:
+          {
+            const [, [data], minMax] = argsArray[i];
+            if (data) {
+              transfers.push(data.buffer, minMax.buffer);
+            }
+            break;
+          }
+        case OPS.paintFormXObjectBegin:
+          const [matrix, bbox] = argsArray[i];
+          if (matrix) {
+            transfers.push(matrix.buffer);
+          }
+          if (bbox) {
+            transfers.push(bbox.buffer);
+          }
+          break;
+        case OPS.setTextMatrix:
+          transfers.push(argsArray[i][0].buffer);
+          break;
+      }
+    }
+    return transfers;
+  }
+  flush(lastChunk = false, separateAnnots = null) {
+    this.optimizer.flush();
+    const length = this.length;
+    this._totalLength += length;
+    this._streamSink.enqueue({
+      fnArray: this.fnArray,
+      argsArray: this.argsArray,
+      lastChunk,
+      separateAnnots,
+      length
+    }, 1, this._transfers);
+    this.dependencies.clear();
+    this.fnArray.length = 0;
+    this.argsArray.length = 0;
+    this.weight = 0;
+    this.optimizer.reset();
+  }
+}
+class CheckedOperatorList extends OperatorList {
+  needsIsolation = false;
+  hasSoftMask = false;
+  addOp(fn, args) {
+    if (!this.needsIsolation || !this.hasSoftMask) {
+      if (fn === OPS.beginGroup) {
+        this.needsIsolation ||= args[0].needsIsolation;
+        this.hasSoftMask ||= args[0].hasSoftMask;
+      } else if (fn === OPS.setGState) {
+        for (const [key, val] of args[0]) {
+          if (key === "BM" && val !== "source-over") {
+            this.needsIsolation = true;
+          } else if (key === "SMask" && val !== false) {
+            this.needsIsolation = true;
+            this.hasSoftMask = true;
+          }
+        }
+      }
+    }
+    super.addOp(fn, args);
+  }
+}
+
+;// ./src/core/pattern.js
+
+
+
+
+
+const ShadingType = {
+  FUNCTION_BASED: 1,
+  AXIAL: 2,
+  RADIAL: 3,
+  FREE_FORM_MESH: 4,
+  LATTICE_FORM_MESH: 5,
+  COONS_PATCH_MESH: 6,
+  TENSOR_PATCH_MESH: 7
+};
+class Pattern {
+  static #hasGPU = false;
+  constructor() {
+    unreachable("Cannot initialize Pattern.");
+  }
+  static setOptions({
+    hasGPU
+  }) {
+    this.#hasGPU = hasGPU;
+  }
+  static parseShading(shading, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) {
+    const dict = shading instanceof BaseStream ? shading.dict : shading;
+    const type = dict.get("ShadingType");
+    try {
+      switch (type) {
+        case ShadingType.FUNCTION_BASED:
+          return new FunctionBasedShading(dict, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache);
+        case ShadingType.AXIAL:
+        case ShadingType.RADIAL:
+          return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache);
+        case ShadingType.FREE_FORM_MESH:
+        case ShadingType.LATTICE_FORM_MESH:
+        case ShadingType.COONS_PATCH_MESH:
+        case ShadingType.TENSOR_PATCH_MESH:
+          return new MeshShading(shading, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache);
+        default:
+          throw new FormatError("Unsupported ShadingType: " + type);
+      }
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn(ex);
+      return new DummyShading();
+    }
+  }
+}
+class BaseShading {
+  static SMALL_NUMBER = 1e-6;
+  getIR() {
+    unreachable("Abstract method `getIR` called.");
+  }
+}
+class RadialAxialShading extends BaseShading {
+  constructor(dict, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) {
+    super();
+    this.shadingType = dict.get("ShadingType");
+    let coordsLen = 0;
+    if (this.shadingType === ShadingType.AXIAL) {
+      coordsLen = 4;
+    } else if (this.shadingType === ShadingType.RADIAL) {
+      coordsLen = 6;
+    }
+    this.coordsArr = dict.getArray("Coords");
+    if (!isNumberArray(this.coordsArr, coordsLen)) {
+      throw new FormatError("RadialAxialShading: Invalid /Coords array.");
+    }
+    const cs = ColorSpaceUtils.parse({
+      cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"),
+      xref,
+      resources,
+      pdfFunctionFactory,
+      globalColorSpaceCache,
+      localColorSpaceCache
+    });
+    this.bbox = lookupNormalRect(dict.getArray("BBox"), null);
+    let t0 = 0.0,
+      t1 = 1.0;
+    const domainArr = dict.getArray("Domain");
+    if (isNumberArray(domainArr, 2)) {
+      [t0, t1] = domainArr;
+    }
+    let extendStart = false,
+      extendEnd = false;
+    const extendArr = dict.getArray("Extend");
+    if (isBooleanArray(extendArr, 2)) {
+      [extendStart, extendEnd] = extendArr;
+    }
+    this.extendStart = extendStart;
+    this.extendEnd = extendEnd;
+    const fnObj = dict.getRaw("Function");
+    const fn = pdfFunctionFactory.create(fnObj, true);
+    const NUMBER_OF_SAMPLES = 840;
+    const step = (t1 - t0) / NUMBER_OF_SAMPLES;
+    const colorStops = this.colorStops = [];
+    if (t0 >= t1 || step <= 0) {
+      info("Bad shading domain.");
+      return;
+    }
+    const color = new Float32Array(cs.numComps),
+      ratio = new Float32Array(1);
+    let iBase = 0;
+    ratio[0] = t0;
+    fn(ratio, 0, color, 0);
+    const rgbBuffer = new Uint8ClampedArray(3);
+    cs.getRgb(color, 0, rgbBuffer);
+    let [rBase, gBase, bBase] = rgbBuffer;
+    colorStops.push([0, Util.makeHexColor(rBase, gBase, bBase)]);
+    let iPrev = 1;
+    ratio[0] = t0 + step;
+    fn(ratio, 0, color, 0);
+    cs.getRgb(color, 0, rgbBuffer);
+    let [rPrev, gPrev, bPrev] = rgbBuffer;
+    let maxSlopeR = rPrev - rBase + 1;
+    let maxSlopeG = gPrev - gBase + 1;
+    let maxSlopeB = bPrev - bBase + 1;
+    let minSlopeR = rPrev - rBase - 1;
+    let minSlopeG = gPrev - gBase - 1;
+    let minSlopeB = bPrev - bBase - 1;
+    for (let i = 2; i < NUMBER_OF_SAMPLES; i++) {
+      ratio[0] = t0 + i * step;
+      fn(ratio, 0, color, 0);
+      cs.getRgb(color, 0, rgbBuffer);
+      const [r, g, b] = rgbBuffer;
+      const run = i - iBase;
+      maxSlopeR = Math.min(maxSlopeR, (r - rBase + 1) / run);
+      maxSlopeG = Math.min(maxSlopeG, (g - gBase + 1) / run);
+      maxSlopeB = Math.min(maxSlopeB, (b - bBase + 1) / run);
+      minSlopeR = Math.max(minSlopeR, (r - rBase - 1) / run);
+      minSlopeG = Math.max(minSlopeG, (g - gBase - 1) / run);
+      minSlopeB = Math.max(minSlopeB, (b - bBase - 1) / run);
+      const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB;
+      if (!slopesExist) {
+        const cssColor = Util.makeHexColor(rPrev, gPrev, bPrev);
+        colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]);
+        maxSlopeR = r - rPrev + 1;
+        maxSlopeG = g - gPrev + 1;
+        maxSlopeB = b - bPrev + 1;
+        minSlopeR = r - rPrev - 1;
+        minSlopeG = g - gPrev - 1;
+        minSlopeB = b - bPrev - 1;
+        iBase = iPrev;
+        rBase = rPrev;
+        gBase = gPrev;
+        bBase = bPrev;
+      }
+      iPrev = i;
+      rPrev = r;
+      gPrev = g;
+      bPrev = b;
+    }
+    colorStops.push([1, Util.makeHexColor(rPrev, gPrev, bPrev)]);
+    const background = dict.has("Background") ? cs.getRgbHex(dict.get("Background"), 0) : "transparent";
+    if (!extendStart) {
+      colorStops.unshift([0, background]);
+      colorStops[1][0] += BaseShading.SMALL_NUMBER;
+    }
+    if (!extendEnd) {
+      colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER;
+      colorStops.push([1, background]);
+    }
+    this.colorStops = colorStops;
+  }
+  getIR() {
+    const {
+      coordsArr,
+      shadingType
+    } = this;
+    let type, p0, p1, r0, r1;
+    if (shadingType === ShadingType.AXIAL) {
+      p0 = [coordsArr[0], coordsArr[1]];
+      p1 = [coordsArr[2], coordsArr[3]];
+      r0 = null;
+      r1 = null;
+      type = "axial";
+    } else if (shadingType === ShadingType.RADIAL) {
+      p0 = [coordsArr[0], coordsArr[1]];
+      p1 = [coordsArr[3], coordsArr[4]];
+      r0 = coordsArr[2];
+      r1 = coordsArr[5];
+      type = "radial";
+    } else {
+      unreachable(`getPattern type unknown: ${shadingType}`);
+    }
+    return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1];
+  }
+}
+function meshUpdateBounds(self) {
+  let minX = self.coords[0][0],
+    minY = self.coords[0][1],
+    maxX = minX,
+    maxY = minY;
+  for (let i = 1, ii = self.coords.length; i < ii; i++) {
+    const x = self.coords[i][0],
+      y = self.coords[i][1];
+    minX = minX > x ? x : minX;
+    minY = minY > y ? y : minY;
+    maxX = maxX < x ? x : maxX;
+    maxY = maxY < y ? y : maxY;
+  }
+  self.bounds = [minX, minY, maxX, maxY];
+}
+function meshPackData(self) {
+  let i, j, ii;
+  const coords = self.coords;
+  const coordsPacked = new Float32Array(coords.length * 2);
+  for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
+    const xy = coords[i];
+    coordsPacked[j++] = xy[0];
+    coordsPacked[j++] = xy[1];
+  }
+  self.coords = coordsPacked;
+  const colors = self.colors;
+  const colorsPacked = new Uint8Array(colors.length * 4);
+  for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
+    const c = colors[i];
+    colorsPacked[j++] = c[0];
+    colorsPacked[j++] = c[1];
+    colorsPacked[j++] = c[2];
+    j++;
+  }
+  self.colors = colorsPacked;
+  for (const figure of self.figures) {
+    figure.coords = new Uint32Array(figure.coords);
+    figure.colors = new Uint32Array(figure.colors);
+  }
+}
+function buildMeshVertexData(coords, colors, figures) {
+  let vertexCount = 0;
+  for (const figure of figures) {
+    if (figure.type === MeshFigureType.TRIANGLES) {
+      vertexCount += figure.coords.length;
+    } else if (figure.type === MeshFigureType.LATTICE) {
+      const vpr = figure.verticesPerRow;
+      vertexCount += (Math.floor(figure.coords.length / vpr) - 1) * (vpr - 1) * 6;
+    }
+  }
+  const posData = new Float32Array(vertexCount * 2);
+  const colData = new Uint8Array(vertexCount * 4);
+  let pOff = 0,
+    cOff = 0;
+  const addVertex = (pi, ci) => {
+    posData[pOff++] = coords[pi * 2];
+    posData[pOff++] = coords[pi * 2 + 1];
+    colData[cOff++] = colors[ci * 4];
+    colData[cOff++] = colors[ci * 4 + 1];
+    colData[cOff++] = colors[ci * 4 + 2];
+    cOff++;
+  };
+  for (const figure of figures) {
+    const ps = figure.coords;
+    const cs = figure.colors;
+    if (figure.type === MeshFigureType.TRIANGLES) {
+      for (let i = 0, ii = ps.length; i < ii; i++) {
+        addVertex(ps[i], cs[i]);
+      }
+    } else if (figure.type === MeshFigureType.LATTICE) {
+      const vpr = figure.verticesPerRow;
+      const rows = Math.floor(ps.length / vpr) - 1;
+      const cols = vpr - 1;
+      for (let i = 0; i < rows; i++) {
+        let q = i * vpr;
+        for (let j = 0; j < cols; j++, q++) {
+          addVertex(ps[q], cs[q]);
+          addVertex(ps[q + 1], cs[q + 1]);
+          addVertex(ps[q + vpr], cs[q + vpr]);
+          addVertex(ps[q + vpr + 1], cs[q + vpr + 1]);
+          addVertex(ps[q + 1], cs[q + 1]);
+          addVertex(ps[q + vpr], cs[q + vpr]);
+        }
+      }
+    }
+  }
+  return {
+    posData,
+    colData,
+    vertexCount
+  };
+}
+class FunctionBasedShading extends BaseShading {
+  static MAX_STEP_COUNT = 512;
+  constructor(dict, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) {
+    super();
+    this.bbox = lookupNormalRect(dict.getArray("BBox"), null);
+    const cs = ColorSpaceUtils.parse({
+      cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"),
+      xref,
+      resources,
+      pdfFunctionFactory,
+      globalColorSpaceCache,
+      localColorSpaceCache
+    });
+    this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null;
+    const fnObj = dict.getRaw("Function");
+    if (!fnObj) {
+      throw new FormatError("FunctionBasedShading: missing /Function");
+    }
+    const fn = pdfFunctionFactory.create(fnObj, true);
+    const [x0, x1, y0, y1] = lookupRect(dict.getArray("Domain"), [0, 1, 0, 1]);
+    const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX);
+    this.bounds = BBOX_INIT.slice();
+    Util.axialAlignedBoundingBox([x0, y0, x1, y1], matrix, this.bounds);
+    const bboxW = this.bounds[2] - this.bounds[0];
+    const bboxH = this.bounds[3] - this.bounds[1];
+    const stepsX = MathClamp(Math.ceil(bboxW), 1, FunctionBasedShading.MAX_STEP_COUNT);
+    const stepsY = MathClamp(Math.ceil(bboxH), 1, FunctionBasedShading.MAX_STEP_COUNT);
+    const verticesPerRow = stepsX + 1;
+    const totalVertices = (stepsY + 1) * verticesPerRow;
+    const coords = this.coords = new Float32Array(totalVertices * 2);
+    const colors = this.colors = new Uint8ClampedArray(totalVertices * 4);
+    const xyBuf = new Float32Array(2);
+    const colorBuf = new Float32Array(cs.numComps);
+    const rangeX = (x1 - x0) / stepsX;
+    const rangeY = (y1 - y0) / stepsY;
+    const halfStepX = rangeX / 2;
+    const halfStepY = rangeY / 2;
+    let coordOffset = 0;
+    let colorOffset = 0;
+    for (let row = 0; row <= stepsY; row++) {
+      const yDomain = y0 + rangeY * row;
+      xyBuf[1] = row === stepsY ? yDomain - halfStepY : yDomain;
+      for (let col = 0; col <= stepsX; col++) {
+        const xDomain = x0 + rangeX * col;
+        xyBuf[0] = col === stepsX ? xDomain - halfStepX : xDomain;
+        fn(xyBuf, 0, colorBuf, 0);
+        coords[coordOffset] = xDomain;
+        coords[coordOffset + 1] = yDomain;
+        Util.applyTransform(coords, matrix, coordOffset);
+        coordOffset += 2;
+        cs.getRgbItem(colorBuf, 0, colors, colorOffset);
+        colorOffset += 4;
+      }
+    }
+    const ps = new Uint32Array(totalVertices);
+    for (let i = 0; i < totalVertices; i++) {
+      ps[i] = i;
+    }
+    this.figures = [{
+      type: MeshFigureType.LATTICE,
+      coords: ps,
+      colors: new Uint32Array(ps),
+      verticesPerRow
+    }];
+  }
+  getIR() {
+    const {
+      posData,
+      colData,
+      vertexCount
+    } = buildMeshVertexData(this.coords, this.colors, this.figures);
+    return ["Mesh", ShadingType.FUNCTION_BASED, posData, colData, vertexCount, this.bounds, this.bbox, this.background];
+  }
+}
+class MeshStreamReader {
+  constructor(stream, context) {
+    this.stream = stream;
+    this.context = context;
+    this.buffer = 0;
+    this.bufferLength = 0;
+    const numComps = context.numComps;
+    this.tmpCompsBuf = new Float32Array(numComps);
+    const csNumComps = context.colorSpace.numComps;
+    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;
+  }
+  get hasData() {
+    if (this.stream.end) {
+      return this.stream.pos < this.stream.end;
+    }
+    if (this.bufferLength > 0) {
+      return true;
+    }
+    const nextByte = this.stream.getByte();
+    if (nextByte < 0) {
+      return false;
+    }
+    this.buffer = nextByte;
+    this.bufferLength = 8;
+    return true;
+  }
+  readBits(n) {
+    const {
+      stream
+    } = this;
+    let {
+      buffer,
+      bufferLength
+    } = this;
+    if (n === 32) {
+      if (bufferLength === 0) {
+        return stream.getInt32() >>> 0;
+      }
+      buffer = buffer << 24 | stream.getByte() << 16 | stream.getByte() << 8 | stream.getByte();
+      const nextByte = stream.getByte();
+      this.buffer = nextByte & (1 << bufferLength) - 1;
+      return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0;
+    }
+    if (n === 8 && bufferLength === 0) {
+      return stream.getByte();
+    }
+    while (bufferLength < n) {
+      buffer = buffer << 8 | stream.getByte();
+      bufferLength += 8;
+    }
+    bufferLength -= n;
+    this.bufferLength = bufferLength;
+    this.buffer = buffer & (1 << bufferLength) - 1;
+    return buffer >> bufferLength;
+  }
+  align() {
+    this.buffer = 0;
+    this.bufferLength = 0;
+  }
+  readFlag() {
+    return this.readBits(this.context.bitsPerFlag);
+  }
+  readCoordinate() {
+    const {
+      bitsPerCoordinate,
+      decode
+    } = this.context;
+    const xi = this.readBits(bitsPerCoordinate);
+    const yi = this.readBits(bitsPerCoordinate);
+    const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;
+    return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]];
+  }
+  readComponents() {
+    const {
+      bitsPerComponent,
+      colorFn,
+      colorSpace,
+      decode,
+      numComps
+    } = this.context;
+    const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;
+    const components = this.tmpCompsBuf;
+    for (let i = 0, j = 4; i < numComps; i++, j += 2) {
+      const ci = this.readBits(bitsPerComponent);
+      components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
+    }
+    const color = this.tmpCsCompsBuf;
+    colorFn?.(components, 0, color, 0);
+    return colorSpace.getRgb(color, 0);
+  }
+}
+let bCache = Object.create(null);
+function buildB(count) {
+  const lut = [];
+  for (let i = 0; i <= count; i++) {
+    const t = i / count,
+      t_ = 1 - t;
+    lut.push(new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3]));
+  }
+  return lut;
+}
+function getB(count) {
+  return bCache[count] ||= buildB(count);
+}
+function clearPatternCaches() {
+  bCache = Object.create(null);
+}
+class MeshShading extends BaseShading {
+  static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
+  static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
+  static TRIANGLE_DENSITY = 20;
+  constructor(stream, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) {
+    super();
+    if (!(stream instanceof BaseStream)) {
+      throw new FormatError("Mesh data is not a stream");
+    }
+    const dict = stream.dict;
+    this.shadingType = dict.get("ShadingType");
+    this.bbox = lookupNormalRect(dict.getArray("BBox"), null);
+    const cs = ColorSpaceUtils.parse({
+      cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"),
+      xref,
+      resources,
+      pdfFunctionFactory,
+      globalColorSpaceCache,
+      localColorSpaceCache
+    });
+    this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null;
+    const fnObj = dict.getRaw("Function");
+    const fn = fnObj ? pdfFunctionFactory.create(fnObj, true) : null;
+    this.coords = [];
+    this.colors = [];
+    this.figures = [];
+    const decodeContext = {
+      bitsPerCoordinate: dict.get("BitsPerCoordinate"),
+      bitsPerComponent: dict.get("BitsPerComponent"),
+      bitsPerFlag: dict.get("BitsPerFlag"),
+      decode: dict.getArray("Decode"),
+      colorFn: fn,
+      colorSpace: cs,
+      numComps: fn ? 1 : cs.numComps
+    };
+    const reader = new MeshStreamReader(stream, decodeContext);
+    let patchMesh = false;
+    switch (this.shadingType) {
+      case ShadingType.FREE_FORM_MESH:
+        this._decodeType4Shading(reader);
+        break;
+      case ShadingType.LATTICE_FORM_MESH:
+        const verticesPerRow = dict.get("VerticesPerRow") | 0;
+        if (verticesPerRow < 2) {
+          throw new FormatError("Invalid VerticesPerRow");
+        }
+        this._decodeType5Shading(reader, verticesPerRow);
+        break;
+      case ShadingType.COONS_PATCH_MESH:
+        this._decodeType6Shading(reader);
+        patchMesh = true;
+        break;
+      case ShadingType.TENSOR_PATCH_MESH:
+        this._decodeType7Shading(reader);
+        patchMesh = true;
+        break;
+      default:
+        unreachable("Unsupported mesh type.");
+        break;
+    }
+    if (patchMesh) {
+      this._updateBounds();
+      for (let i = 0, ii = this.figures.length; i < ii; i++) {
+        this._buildFigureFromPatch(i);
+      }
+    }
+    this._updateBounds();
+    this._packData();
+  }
+  _decodeType4Shading(reader) {
+    const coords = this.coords;
+    const colors = this.colors;
+    const operators = [];
+    const ps = [];
+    let verticesLeft = 0;
+    while (reader.hasData) {
+      const f = reader.readFlag();
+      const coord = reader.readCoordinate();
+      const color = reader.readComponents();
+      if (verticesLeft === 0) {
+        if (!(0 <= f && f <= 2)) {
+          throw new FormatError("Unknown type4 flag");
+        }
+        switch (f) {
+          case 0:
+            verticesLeft = 3;
+            break;
+          case 1:
+            ps.push(ps.at(-2), ps.at(-1));
+            verticesLeft = 1;
+            break;
+          case 2:
+            ps.push(ps.at(-3), ps.at(-1));
+            verticesLeft = 1;
+            break;
+        }
+        operators.push(f);
+      }
+      ps.push(coords.length);
+      coords.push(coord);
+      colors.push(color);
+      verticesLeft--;
+      reader.align();
+    }
+    this.figures.push({
+      type: MeshFigureType.TRIANGLES,
+      coords: new Int32Array(ps),
+      colors: new Int32Array(ps)
+    });
+  }
+  _decodeType5Shading(reader, verticesPerRow) {
+    const coords = this.coords;
+    const colors = this.colors;
+    const ps = [];
+    while (reader.hasData) {
+      const coord = reader.readCoordinate();
+      const color = reader.readComponents();
+      ps.push(coords.length);
+      coords.push(coord);
+      colors.push(color);
+    }
+    this.figures.push({
+      type: MeshFigureType.LATTICE,
+      coords: new Int32Array(ps),
+      colors: new Int32Array(ps),
+      verticesPerRow
+    });
+  }
+  _decodeType6Shading(reader) {
+    const coords = this.coords;
+    const colors = this.colors;
+    const ps = new Int32Array(16);
+    const cs = new Int32Array(4);
+    while (reader.hasData) {
+      const f = reader.readFlag();
+      if (!(0 <= f && f <= 3)) {
+        throw new FormatError("Unknown type6 flag");
+      }
+      const pi = coords.length;
+      for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {
+        coords.push(reader.readCoordinate());
+      }
+      const ci = colors.length;
+      for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
+        colors.push(reader.readComponents());
+      }
+      let tmp1, tmp2, tmp3, tmp4;
+      switch (f) {
+        case 0:
+          ps[12] = pi + 3;
+          ps[13] = pi + 4;
+          ps[14] = pi + 5;
+          ps[15] = pi + 6;
+          ps[8] = pi + 2;
+          ps[11] = pi + 7;
+          ps[4] = pi + 1;
+          ps[7] = pi + 8;
+          ps[0] = pi;
+          ps[1] = pi + 11;
+          ps[2] = pi + 10;
+          ps[3] = pi + 9;
+          cs[2] = ci + 1;
+          cs[3] = ci + 2;
+          cs[0] = ci;
+          cs[1] = ci + 3;
+          break;
+        case 1:
+          tmp1 = ps[12];
+          tmp2 = ps[13];
+          tmp3 = ps[14];
+          tmp4 = ps[15];
+          ps[12] = tmp4;
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = tmp3;
+          ps[11] = pi + 3;
+          ps[4] = tmp2;
+          ps[7] = pi + 4;
+          ps[0] = tmp1;
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          tmp1 = cs[2];
+          tmp2 = cs[3];
+          cs[2] = tmp2;
+          cs[3] = ci;
+          cs[0] = tmp1;
+          cs[1] = ci + 1;
+          break;
+        case 2:
+          tmp1 = ps[15];
+          tmp2 = ps[11];
+          ps[12] = ps[3];
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = ps[7];
+          ps[11] = pi + 3;
+          ps[4] = tmp2;
+          ps[7] = pi + 4;
+          ps[0] = tmp1;
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          tmp1 = cs[3];
+          cs[2] = cs[1];
+          cs[3] = ci;
+          cs[0] = tmp1;
+          cs[1] = ci + 1;
+          break;
+        case 3:
+          ps[12] = ps[0];
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = ps[1];
+          ps[11] = pi + 3;
+          ps[4] = ps[2];
+          ps[7] = pi + 4;
+          ps[0] = ps[3];
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          cs[2] = cs[0];
+          cs[3] = ci;
+          cs[0] = cs[1];
+          cs[1] = ci + 1;
+          break;
+      }
+      ps[5] = coords.length;
+      coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]);
+      ps[6] = coords.length;
+      coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]);
+      ps[9] = coords.length;
+      coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);
+      ps[10] = coords.length;
+      coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);
+      this.figures.push({
+        type: MeshFigureType.PATCH,
+        coords: new Int32Array(ps),
+        colors: new Int32Array(cs)
+      });
+    }
+  }
+  _decodeType7Shading(reader) {
+    const coords = this.coords;
+    const colors = this.colors;
+    const ps = new Int32Array(16);
+    const cs = new Int32Array(4);
+    while (reader.hasData) {
+      const f = reader.readFlag();
+      if (!(0 <= f && f <= 3)) {
+        throw new FormatError("Unknown type7 flag");
+      }
+      const pi = coords.length;
+      for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {
+        coords.push(reader.readCoordinate());
+      }
+      const ci = colors.length;
+      for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
+        colors.push(reader.readComponents());
+      }
+      let tmp1, tmp2, tmp3, tmp4;
+      switch (f) {
+        case 0:
+          ps[12] = pi + 3;
+          ps[13] = pi + 4;
+          ps[14] = pi + 5;
+          ps[15] = pi + 6;
+          ps[8] = pi + 2;
+          ps[9] = pi + 13;
+          ps[10] = pi + 14;
+          ps[11] = pi + 7;
+          ps[4] = pi + 1;
+          ps[5] = pi + 12;
+          ps[6] = pi + 15;
+          ps[7] = pi + 8;
+          ps[0] = pi;
+          ps[1] = pi + 11;
+          ps[2] = pi + 10;
+          ps[3] = pi + 9;
+          cs[2] = ci + 1;
+          cs[3] = ci + 2;
+          cs[0] = ci;
+          cs[1] = ci + 3;
+          break;
+        case 1:
+          tmp1 = ps[12];
+          tmp2 = ps[13];
+          tmp3 = ps[14];
+          tmp4 = ps[15];
+          ps[12] = tmp4;
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = tmp3;
+          ps[9] = pi + 9;
+          ps[10] = pi + 10;
+          ps[11] = pi + 3;
+          ps[4] = tmp2;
+          ps[5] = pi + 8;
+          ps[6] = pi + 11;
+          ps[7] = pi + 4;
+          ps[0] = tmp1;
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          tmp1 = cs[2];
+          tmp2 = cs[3];
+          cs[2] = tmp2;
+          cs[3] = ci;
+          cs[0] = tmp1;
+          cs[1] = ci + 1;
+          break;
+        case 2:
+          tmp1 = ps[15];
+          tmp2 = ps[11];
+          ps[12] = ps[3];
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = ps[7];
+          ps[9] = pi + 9;
+          ps[10] = pi + 10;
+          ps[11] = pi + 3;
+          ps[4] = tmp2;
+          ps[5] = pi + 8;
+          ps[6] = pi + 11;
+          ps[7] = pi + 4;
+          ps[0] = tmp1;
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          tmp1 = cs[3];
+          cs[2] = cs[1];
+          cs[3] = ci;
+          cs[0] = tmp1;
+          cs[1] = ci + 1;
+          break;
+        case 3:
+          ps[12] = ps[0];
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = ps[1];
+          ps[9] = pi + 9;
+          ps[10] = pi + 10;
+          ps[11] = pi + 3;
+          ps[4] = ps[2];
+          ps[5] = pi + 8;
+          ps[6] = pi + 11;
+          ps[7] = pi + 4;
+          ps[0] = ps[3];
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          cs[2] = cs[0];
+          cs[3] = ci;
+          cs[0] = cs[1];
+          cs[1] = ci + 1;
+          break;
+      }
+      this.figures.push({
+        type: MeshFigureType.PATCH,
+        coords: new Int32Array(ps),
+        colors: new Int32Array(cs)
+      });
+    }
+  }
+  _buildFigureFromPatch(index) {
+    const figure = this.figures[index];
+    assert(figure.type === MeshFigureType.PATCH, "Unexpected patch mesh figure");
+    const coords = this.coords,
+      colors = this.colors;
+    const pi = figure.coords;
+    const ci = figure.colors;
+    const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
+    const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
+    const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
+    const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
+    let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0]));
+    splitXBy = MathClamp(splitXBy, MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT);
+    let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1]));
+    splitYBy = MathClamp(splitYBy, MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT);
+    const verticesPerRow = splitXBy + 1;
+    const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
+    const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
+    let k = 0;
+    const cl = new Uint8Array(3),
+      cr = new Uint8Array(3);
+    const c0 = colors[ci[0]],
+      c1 = colors[ci[1]],
+      c2 = colors[ci[2]],
+      c3 = colors[ci[3]];
+    const bRow = getB(splitYBy),
+      bCol = getB(splitXBy);
+    for (let row = 0; row <= splitYBy; row++) {
+      cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;
+      cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;
+      cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;
+      cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;
+      cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;
+      cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;
+      for (let col = 0; col <= splitXBy; col++, k++) {
+        if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {
+          continue;
+        }
+        let x = 0,
+          y = 0;
+        let q = 0;
+        for (let i = 0; i <= 3; i++) {
+          for (let j = 0; j <= 3; j++, q++) {
+            const m = bRow[row][i] * bCol[col][j];
+            x += coords[pi[q]][0] * m;
+            y += coords[pi[q]][1] * m;
+          }
+        }
+        figureCoords[k] = coords.length;
+        coords.push([x, y]);
+        figureColors[k] = colors.length;
+        const newColor = new Uint8Array(3);
+        newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;
+        newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;
+        newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;
+        colors.push(newColor);
+      }
+    }
+    figureCoords[0] = pi[0];
+    figureColors[0] = ci[0];
+    figureCoords[splitXBy] = pi[3];
+    figureColors[splitXBy] = ci[1];
+    figureCoords[verticesPerRow * splitYBy] = pi[12];
+    figureColors[verticesPerRow * splitYBy] = ci[2];
+    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
+    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
+    this.figures[index] = {
+      type: MeshFigureType.LATTICE,
+      coords: figureCoords,
+      colors: figureColors,
+      verticesPerRow
+    };
+  }
+  _updateBounds() {
+    meshUpdateBounds(this);
+  }
+  _packData() {
+    meshPackData(this);
+  }
+  getIR() {
+    const {
+      posData,
+      colData,
+      vertexCount
+    } = buildMeshVertexData(this.coords, this.colors, this.figures);
+    return ["Mesh", this.shadingType, posData, colData, vertexCount, this.bounds, this.bbox, this.background];
+  }
+}
+class DummyShading extends BaseShading {
+  getIR() {
+    return ["Dummy"];
+  }
+}
+function getTilingPatternIR(operatorList, dict, color, needsIsolation = true) {
+  const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX);
+  const bbox = lookupNormalRect(dict.getArray("BBox"), null);
+  if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {
+    throw new FormatError(`Invalid getTilingPatternIR /BBox array.`);
+  }
+  const xstep = dict.get("XStep");
+  if (typeof xstep !== "number") {
+    throw new FormatError(`Invalid getTilingPatternIR /XStep value.`);
+  }
+  const ystep = dict.get("YStep");
+  if (typeof ystep !== "number") {
+    throw new FormatError(`Invalid getTilingPatternIR /YStep value.`);
+  }
+  const paintType = dict.get("PaintType");
+  if (!Number.isInteger(paintType)) {
+    throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`);
+  }
+  const tilingType = dict.get("TilingType");
+  if (!Number.isInteger(tilingType)) {
+    throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`);
+  }
+  return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType, needsIsolation];
+}
+
+;// ./src/core/binary_cmap.js
+
+
+function hexToInt(a, size) {
+  let n = 0;
+  for (let i = 0; i <= size; i++) {
+    n = n << 8 | a[i];
+  }
+  return n >>> 0;
+}
+function hexToStr(a, size) {
+  if (size === 1) {
+    return String.fromCharCode(a[0], a[1]);
+  }
+  if (size === 3) {
+    return String.fromCharCode(a[0], a[1], a[2], a[3]);
+  }
+  return String.fromCharCode(...a.subarray(0, size + 1));
+}
+function addHex(a, b, size) {
+  let c = 0;
+  for (let i = size; i >= 0; i--) {
+    c += a[i] + b[i];
+    a[i] = c & 255;
+    c >>= 8;
+  }
+}
+function incHex(a, size) {
+  let c = 1;
+  for (let i = size; i >= 0 && c > 0; i--) {
+    c += a[i];
+    a[i] = c & 255;
+    c >>= 8;
+  }
+}
+const MAX_NUM_SIZE = 16;
+const MAX_ENCODED_NUM_SIZE = 19;
+class BinaryCMapStream extends Stream {
+  tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
+  constructor(data) {
+    super(data, 0, data.length, null);
+  }
+  readNumber() {
+    let n = 0;
+    let last;
+    do {
+      const b = this.getByte();
+      if (b < 0) {
+        throw new FormatError("unexpected EOF in bcmap");
+      }
+      last = !(b & 0x80);
+      n = n << 7 | b & 0x7f;
+    } while (!last);
+    return n;
+  }
+  readSigned() {
+    const n = this.readNumber();
+    return n & 1 ? ~(n >>> 1) : n >>> 1;
+  }
+  readHex(num, size) {
+    num.set(this.getBytes(size + 1));
+  }
+  readHexNumber(num, size) {
+    let last;
+    const stack = this.tmpBuf;
+    let sp = 0;
+    do {
+      const b = this.getByte();
+      if (b < 0) {
+        throw new FormatError("unexpected EOF in bcmap");
+      }
+      last = !(b & 0x80);
+      stack[sp++] = b & 0x7f;
+    } while (!last);
+    let i = size,
+      buffer = 0,
+      bufferSize = 0;
+    while (i >= 0) {
+      while (bufferSize < 8 && stack.length > 0) {
+        buffer |= stack[--sp] << bufferSize;
+        bufferSize += 7;
+      }
+      num[i] = buffer & 255;
+      i--;
+      buffer >>= 8;
+      bufferSize -= 8;
+    }
+  }
+  readHexSigned(num, size) {
+    this.readHexNumber(num, size);
+    const sign = num[size] & 1 ? 255 : 0;
+    let c = 0;
+    for (let i = 0; i <= size; i++) {
+      c = (c & 1) << 8 | num[i];
+      num[i] = c >> 1 ^ sign;
+    }
+  }
+  readString() {
+    const len = this.readNumber(),
+      buf = new Array(len);
+    for (let i = 0; i < len; i++) {
+      buf[i] = this.readNumber();
+    }
+    return String.fromCharCode(...buf);
+  }
+}
+class BinaryCMapReader {
+  async process(data, cMap, extend) {
+    const stream = new BinaryCMapStream(data);
+    const header = stream.getByte();
+    cMap.vertical = !!(header & 1);
+    let useCMap = null;
+    const start = new Uint8Array(MAX_NUM_SIZE);
+    const end = new Uint8Array(MAX_NUM_SIZE);
+    const char = new Uint8Array(MAX_NUM_SIZE);
+    const charCode = new Uint8Array(MAX_NUM_SIZE);
+    const tmp = new Uint8Array(MAX_NUM_SIZE);
+    let code;
+    let b;
+    while ((b = stream.getByte()) >= 0) {
+      const type = b >> 5;
+      if (type === 7) {
+        switch (b & 0x1f) {
+          case 0:
+            stream.readString();
+            break;
+          case 1:
+            useCMap = stream.readString();
+            break;
+        }
+        continue;
+      }
+      const sequence = !!(b & 0x10);
+      const dataSize = b & 15;
+      if (dataSize + 1 > MAX_NUM_SIZE) {
+        throw new Error("BinaryCMapReader.process: Invalid dataSize.");
+      }
+      const ucs2DataSize = 1;
+      const subitemsCount = stream.readNumber();
+      switch (type) {
+        case 0:
+          stream.readHex(start, dataSize);
+          stream.readHexNumber(end, dataSize);
+          addHex(end, start, dataSize);
+          cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
+          for (let i = 1; i < subitemsCount; i++) {
+            incHex(end, dataSize);
+            stream.readHexNumber(start, dataSize);
+            addHex(start, end, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
+          }
+          break;
+        case 1:
+          stream.readHex(start, dataSize);
+          stream.readHexNumber(end, dataSize);
+          addHex(end, start, dataSize);
+          stream.readNumber();
+          for (let i = 1; i < subitemsCount; i++) {
+            incHex(end, dataSize);
+            stream.readHexNumber(start, dataSize);
+            addHex(start, end, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            stream.readNumber();
+          }
+          break;
+        case 2:
+          stream.readHex(char, dataSize);
+          code = stream.readNumber();
+          cMap.mapOne(hexToInt(char, dataSize), code);
+          for (let i = 1; i < subitemsCount; i++) {
+            incHex(char, dataSize);
+            if (!sequence) {
+              stream.readHexNumber(tmp, dataSize);
+              addHex(char, tmp, dataSize);
+            }
+            code = stream.readSigned() + (code + 1);
+            cMap.mapOne(hexToInt(char, dataSize), code);
+          }
+          break;
+        case 3:
+          stream.readHex(start, dataSize);
+          stream.readHexNumber(end, dataSize);
+          addHex(end, start, dataSize);
+          code = stream.readNumber();
+          cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
+          for (let i = 1; i < subitemsCount; i++) {
+            incHex(end, dataSize);
+            if (!sequence) {
+              stream.readHexNumber(start, dataSize);
+              addHex(start, end, dataSize);
+            } else {
+              start.set(end);
+            }
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            code = stream.readNumber();
+            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
+          }
+          break;
+        case 4:
+          stream.readHex(char, ucs2DataSize);
+          stream.readHex(charCode, dataSize);
+          cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
+          for (let i = 1; i < subitemsCount; i++) {
+            incHex(char, ucs2DataSize);
+            if (!sequence) {
+              stream.readHexNumber(tmp, ucs2DataSize);
+              addHex(char, tmp, ucs2DataSize);
+            }
+            incHex(charCode, dataSize);
+            stream.readHexSigned(tmp, dataSize);
+            addHex(charCode, tmp, dataSize);
+            cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
+          }
+          break;
+        case 5:
+          stream.readHex(start, ucs2DataSize);
+          stream.readHexNumber(end, ucs2DataSize);
+          addHex(end, start, ucs2DataSize);
+          stream.readHex(charCode, dataSize);
+          cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));
+          for (let i = 1; i < subitemsCount; i++) {
+            incHex(end, ucs2DataSize);
+            if (!sequence) {
+              stream.readHexNumber(start, ucs2DataSize);
+              addHex(start, end, ucs2DataSize);
+            } else {
+              start.set(end);
+            }
+            stream.readHexNumber(end, ucs2DataSize);
+            addHex(end, start, ucs2DataSize);
+            stream.readHex(charCode, dataSize);
+            cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));
+          }
+          break;
+        default:
+          throw new Error(`BinaryCMapReader.process - unknown type: ${type}`);
+      }
+    }
+    if (useCMap) {
+      return extend(useCMap);
+    }
+    return cMap;
+  }
+}
+
+;// ./src/core/ascii_85_stream.js
+
+
+class Ascii85Stream extends DecodeStream {
+  #input = new Uint8Array(5);
+  constructor(str, maybeLength) {
+    if (maybeLength) {
+      maybeLength *= 0.8;
+    }
+    super(maybeLength);
+    this.stream = str;
+    this.dict = str.dict;
+  }
+  readBlock() {
+    const TILDA_CHAR = 0x7e;
+    const Z_LOWER_CHAR = 0x7a;
+    const EOF = -1;
+    const str = this.stream;
+    let c = str.getByte();
+    while (isWhiteSpace(c)) {
+      c = str.getByte();
+    }
+    if (c === EOF || c === TILDA_CHAR) {
+      this.eof = true;
+      return;
+    }
+    const bufferLength = this.bufferLength;
+    let buffer, i;
+    if (c === Z_LOWER_CHAR) {
+      buffer = this.ensureBuffer(bufferLength + 4);
+      buffer.fill(0, bufferLength, bufferLength + 4);
+      this.bufferLength += 4;
+    } else {
+      const input = this.#input;
+      input[0] = c;
+      for (i = 1; i < 5; ++i) {
+        c = str.getByte();
+        while (isWhiteSpace(c)) {
+          c = str.getByte();
+        }
+        input[i] = c;
+        if (c === EOF || c === TILDA_CHAR) {
+          break;
+        }
+      }
+      buffer = this.ensureBuffer(bufferLength + i - 1);
+      this.bufferLength += i - 1;
+      if (i < 5) {
+        input.fill(0x21 + 84, i, 5);
+        this.eof = true;
+      }
+      let t = 0;
+      for (i = 0; i < 5; ++i) {
+        t = t * 85 + (input[i] - 0x21);
+      }
+      for (i = 3; i >= 0; --i) {
+        buffer[bufferLength + i] = t & 0xff;
+        t >>= 8;
+      }
+    }
+  }
+}
+
+;// ./src/core/ascii_hex_stream.js
+
+class AsciiHexStream extends DecodeStream {
+  constructor(str, maybeLength) {
+    if (maybeLength) {
+      maybeLength *= 0.5;
+    }
+    super(maybeLength);
+    this.stream = str;
+    this.dict = str.dict;
+    this.firstDigit = -1;
+  }
+  readBlock() {
+    const UPSTREAM_BLOCK_SIZE = 8000;
+    const bytes = this.stream.getBytes(UPSTREAM_BLOCK_SIZE);
+    if (!bytes.length) {
+      this.eof = true;
+      return;
+    }
+    const maxDecodeLength = bytes.length + 1 >> 1;
+    const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
+    let bufferLength = this.bufferLength;
+    let firstDigit = this.firstDigit;
+    for (const ch of bytes) {
+      let digit;
+      if (ch >= 0x30 && ch <= 0x39) {
+        digit = ch & 0x0f;
+      } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
+        digit = (ch & 0x0f) + 9;
+      } else if (ch === 0x3e) {
+        this.eof = true;
+        break;
+      } else {
+        continue;
+      }
+      if (firstDigit < 0) {
+        firstDigit = digit;
+      } else {
+        buffer[bufferLength++] = firstDigit << 4 | digit;
+        firstDigit = -1;
+      }
+    }
+    if (firstDigit >= 0 && this.eof) {
+      buffer[bufferLength++] = firstDigit << 4;
+      firstDigit = -1;
+    }
+    this.firstDigit = firstDigit;
+    this.bufferLength = bufferLength;
+  }
+}
+
+;// ./external/brotli/decode.js
+let Options;
+let makeBrotliDecode = () => {
+  const MAX_HUFFMAN_TABLE_SIZE = 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]);
+  const CODE_LENGTH_CODE_ORDER = Int32Array.from([1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
+  const DISTANCE_SHORT_CODE_INDEX_OFFSET = Int32Array.from([0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3]);
+  const DISTANCE_SHORT_CODE_VALUE_OFFSET = Int32Array.from([0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3]);
+  const FIXED_TABLE = Int32Array.from([0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040001, 0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040005]);
+  const BLOCK_LENGTH_OFFSET = 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]);
+  const BLOCK_LENGTH_N_BITS = 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]);
+  const INSERT_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18]);
+  const COPY_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18]);
+  const CMD_LOOKUP = new Int16Array(2816);
+  unpackCommandLookupTable(CMD_LOOKUP);
+  function log2floor(i) {
+    let result = -1;
+    let step = 16;
+    let v = i;
+    while (step > 0) {
+      let next = v >> step;
+      if (next !== 0) {
+        result += step;
+        v = next;
+      }
+      step = step >> 1;
+    }
+    return result + v;
+  }
+  function calculateDistanceAlphabetSize(npostfix, ndirect, maxndistbits) {
+    return 16 + ndirect + 2 * (maxndistbits << npostfix);
+  }
+  function calculateDistanceAlphabetLimit(s, maxDistance, npostfix, ndirect) {
+    if (maxDistance < ndirect + (2 << npostfix)) {
+      return makeError(s, -23);
+    }
+    const offset = (maxDistance - ndirect >> npostfix) + 4;
+    const ndistbits = log2floor(offset) - 1;
+    const group = ndistbits - 1 << 1 | offset >> ndistbits & 1;
+    return (group - 1 << npostfix) + (1 << npostfix) + ndirect + 16;
+  }
+  function unpackCommandLookupTable(cmdLookup) {
+    const insertLengthOffsets = new Int32Array(24);
+    const copyLengthOffsets = new Int32Array(24);
+    copyLengthOffsets[0] = 2;
+    for (let i = 0; i < 23; ++i) {
+      insertLengthOffsets[i + 1] = insertLengthOffsets[i] + (1 << INSERT_LENGTH_N_BITS[i]);
+      copyLengthOffsets[i + 1] = copyLengthOffsets[i] + (1 << COPY_LENGTH_N_BITS[i]);
+    }
+    for (let cmdCode = 0; cmdCode < 704; ++cmdCode) {
+      let rangeIdx = cmdCode >> 6;
+      let distanceContextOffset = -4;
+      if (rangeIdx >= 2) {
+        rangeIdx -= 2;
+        distanceContextOffset = 0;
+      }
+      const insertCode = (0x29850 >> rangeIdx * 2 & 0x3) << 3 | cmdCode >> 3 & 7;
+      const copyCode = (0x26244 >> rangeIdx * 2 & 0x3) << 3 | cmdCode & 7;
+      const copyLengthOffset = copyLengthOffsets[copyCode];
+      const distanceContext = distanceContextOffset + Math.min(copyLengthOffset, 5) - 2;
+      const index = cmdCode * 4;
+      cmdLookup[index] = INSERT_LENGTH_N_BITS[insertCode] | COPY_LENGTH_N_BITS[copyCode] << 8;
+      cmdLookup[index + 1] = insertLengthOffsets[insertCode];
+      cmdLookup[index + 2] = copyLengthOffsets[copyCode];
+      cmdLookup[index + 3] = distanceContext;
+    }
+  }
+  function decodeWindowBits(s) {
+    const largeWindowEnabled = s.isLargeWindow;
+    s.isLargeWindow = 0;
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    if (readFewBits(s, 1) === 0) {
+      return 16;
+    }
+    let n = readFewBits(s, 3);
+    if (n !== 0) {
+      return 17 + n;
+    }
+    n = readFewBits(s, 3);
+    if (n !== 0) {
+      if (n === 1) {
+        if (largeWindowEnabled === 0) {
+          return -1;
+        }
+        s.isLargeWindow = 1;
+        if (readFewBits(s, 1) === 1) {
+          return -1;
+        }
+        n = readFewBits(s, 6);
+        if (n < 10 || n > 30) {
+          return -1;
+        }
+        return n;
+      }
+      return 8 + n;
+    }
+    return 17;
+  }
+  function attachDictionaryChunk(s, data) {
+    if (s.runningState !== 1) {
+      return makeError(s, -24);
+    }
+    if (s.cdNumChunks === 0) {
+      s.cdChunks = new Array(16);
+      s.cdChunkOffsets = new Int32Array(16);
+      s.cdBlockBits = -1;
+    }
+    if (s.cdNumChunks === 15) {
+      return makeError(s, -27);
+    }
+    s.cdChunks[s.cdNumChunks] = data;
+    s.cdNumChunks++;
+    s.cdTotalSize += data.length;
+    s.cdChunkOffsets[s.cdNumChunks] = s.cdTotalSize;
+    return 0;
+  }
+  function initState(s) {
+    if (s.runningState !== 0) {
+      return makeError(s, -26);
+    }
+    s.blockTrees = new Int32Array(3091);
+    s.blockTrees[0] = 7;
+    s.distRbIdx = 3;
+    let result = calculateDistanceAlphabetLimit(s, 0x7FFFFFFC, 3, 120);
+    if (result < 0) {
+      return result;
+    }
+    const maxDistanceAlphabetLimit = result;
+    s.distExtraBits = new Int8Array(maxDistanceAlphabetLimit);
+    s.distOffset = new Int32Array(maxDistanceAlphabetLimit);
+    result = initBitReader(s);
+    if (result < 0) {
+      return result;
+    }
+    s.runningState = 1;
+    return 0;
+  }
+  function close(s) {
+    if (s.runningState === 0) {
+      return makeError(s, -25);
+    }
+    if (s.runningState > 0) {
+      s.runningState = 11;
+    }
+    return 0;
+  }
+  function decodeVarLenUnsignedByte(s) {
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    if (readFewBits(s, 1) !== 0) {
+      const n = readFewBits(s, 3);
+      if (n === 0) {
+        return 1;
+      }
+      return readFewBits(s, n) + (1 << n);
+    }
+    return 0;
+  }
+  function decodeMetaBlockLength(s) {
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    s.inputEnd = readFewBits(s, 1);
+    s.metaBlockLength = 0;
+    s.isUncompressed = 0;
+    s.isMetadata = 0;
+    if (s.inputEnd !== 0 && readFewBits(s, 1) !== 0) {
+      return 0;
+    }
+    const sizeNibbles = readFewBits(s, 2) + 4;
+    if (sizeNibbles === 7) {
+      s.isMetadata = 1;
+      if (readFewBits(s, 1) !== 0) {
+        return makeError(s, -6);
+      }
+      const sizeBytes = readFewBits(s, 2);
+      if (sizeBytes === 0) {
+        return 0;
+      }
+      for (let i = 0; i < sizeBytes; ++i) {
+        if (s.bitOffset >= 16) {
+          s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+          s.bitOffset -= 16;
+        }
+        const bits = readFewBits(s, 8);
+        if (bits === 0 && i + 1 === sizeBytes && sizeBytes > 1) {
+          return makeError(s, -8);
+        }
+        s.metaBlockLength += bits << i * 8;
+      }
+    } else {
+      for (let i = 0; i < sizeNibbles; ++i) {
+        if (s.bitOffset >= 16) {
+          s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+          s.bitOffset -= 16;
+        }
+        const bits = readFewBits(s, 4);
+        if (bits === 0 && i + 1 === sizeNibbles && sizeNibbles > 4) {
+          return makeError(s, -8);
+        }
+        s.metaBlockLength += bits << i * 4;
+      }
+    }
+    s.metaBlockLength++;
+    if (s.inputEnd === 0) {
+      s.isUncompressed = readFewBits(s, 1);
+    }
+    return 0;
+  }
+  function readSymbol(tableGroup, tableIdx, s) {
+    let offset = tableGroup[tableIdx];
+    const v = s.accumulator32 >>> s.bitOffset;
+    offset += v & 0xFF;
+    const bits = tableGroup[offset] >> 16;
+    const sym = tableGroup[offset] & 0xFFFF;
+    if (bits <= 8) {
+      s.bitOffset += bits;
+      return sym;
+    }
+    offset += sym;
+    const mask = (1 << bits) - 1;
+    offset += (v & mask) >>> 8;
+    s.bitOffset += (tableGroup[offset] >> 16) + 8;
+    return tableGroup[offset] & 0xFFFF;
+  }
+  function readBlockLength(tableGroup, tableIdx, s) {
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    const code = readSymbol(tableGroup, tableIdx, s);
+    const n = BLOCK_LENGTH_N_BITS[code];
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    return BLOCK_LENGTH_OFFSET[code] + (n <= 16 ? readFewBits(s, n) : readManyBits(s, n));
+  }
+  function moveToFront(v, index) {
+    let i = index;
+    const value = v[i];
+    while (i > 0) {
+      v[i] = v[i - 1];
+      i--;
+    }
+    v[0] = value;
+  }
+  function inverseMoveToFrontTransform(v, vLen) {
+    const mtf = new Int32Array(256);
+    for (let i = 0; i < 256; ++i) {
+      mtf[i] = i;
+    }
+    for (let i = 0; i < vLen; ++i) {
+      const index = v[i] & 0xFF;
+      v[i] = mtf[index];
+      if (index !== 0) {
+        moveToFront(mtf, index);
+      }
+    }
+  }
+  function readHuffmanCodeLengths(codeLengthCodeLengths, numSymbols, codeLengths, s) {
+    let symbol = 0;
+    let prevCodeLen = 8;
+    let repeat = 0;
+    let repeatCodeLen = 0;
+    let space = 32768;
+    const table = new Int32Array(33);
+    const tableIdx = table.length - 1;
+    buildHuffmanTable(table, tableIdx, 5, codeLengthCodeLengths, 18);
+    while (symbol < numSymbols && space > 0) {
+      if (s.halfOffset > 2030) {
+        const result = readMoreInput(s);
+        if (result < 0) {
+          return result;
+        }
+      }
+      if (s.bitOffset >= 16) {
+        s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+        s.bitOffset -= 16;
+      }
+      const p = s.accumulator32 >>> s.bitOffset & 31;
+      s.bitOffset += table[p] >> 16;
+      const codeLen = table[p] & 0xFFFF;
+      if (codeLen < 16) {
+        repeat = 0;
+        codeLengths[symbol++] = codeLen;
+        if (codeLen !== 0) {
+          prevCodeLen = codeLen;
+          space -= 32768 >> codeLen;
+        }
+      } else {
+        const extraBits = codeLen - 14;
+        let newLen = 0;
+        if (codeLen === 16) {
+          newLen = prevCodeLen;
+        }
+        if (repeatCodeLen !== newLen) {
+          repeat = 0;
+          repeatCodeLen = newLen;
+        }
+        const oldRepeat = repeat;
+        if (repeat > 0) {
+          repeat -= 2;
+          repeat = repeat << extraBits;
+        }
+        if (s.bitOffset >= 16) {
+          s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+          s.bitOffset -= 16;
+        }
+        repeat += readFewBits(s, extraBits) + 3;
+        const repeatDelta = repeat - oldRepeat;
+        if (symbol + repeatDelta > numSymbols) {
+          return makeError(s, -2);
+        }
+        for (let i = 0; i < repeatDelta; ++i) {
+          codeLengths[symbol++] = repeatCodeLen;
+        }
+        if (repeatCodeLen !== 0) {
+          space -= repeatDelta << 15 - repeatCodeLen;
+        }
+      }
+    }
+    if (space !== 0) {
+      return makeError(s, -18);
+    }
+    codeLengths.fill(0, symbol, numSymbols);
+    return 0;
+  }
+  function checkDupes(s, symbols, length) {
+    for (let i = 0; i < length - 1; ++i) {
+      for (let j = i + 1; j < length; ++j) {
+        if (symbols[i] === symbols[j]) {
+          return makeError(s, -7);
+        }
+      }
+    }
+    return 0;
+  }
+  function readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) {
+    const codeLengths = new Int32Array(alphabetSizeLimit);
+    const symbols = new Int32Array(4);
+    const maxBits = 1 + log2floor(alphabetSizeMax - 1);
+    const numSymbols = readFewBits(s, 2) + 1;
+    for (let i = 0; i < numSymbols; ++i) {
+      if (s.bitOffset >= 16) {
+        s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+        s.bitOffset -= 16;
+      }
+      const symbol = readFewBits(s, maxBits);
+      if (symbol >= alphabetSizeLimit) {
+        return makeError(s, -15);
+      }
+      symbols[i] = symbol;
+    }
+    const result = checkDupes(s, symbols, numSymbols);
+    if (result < 0) {
+      return result;
+    }
+    let histogramId = numSymbols;
+    if (numSymbols === 4) {
+      histogramId += readFewBits(s, 1);
+    }
+    switch (histogramId) {
+      case 1:
+        codeLengths[symbols[0]] = 1;
+        break;
+      case 2:
+        codeLengths[symbols[0]] = 1;
+        codeLengths[symbols[1]] = 1;
+        break;
+      case 3:
+        codeLengths[symbols[0]] = 1;
+        codeLengths[symbols[1]] = 2;
+        codeLengths[symbols[2]] = 2;
+        break;
+      case 4:
+        codeLengths[symbols[0]] = 2;
+        codeLengths[symbols[1]] = 2;
+        codeLengths[symbols[2]] = 2;
+        codeLengths[symbols[3]] = 2;
+        break;
+      case 5:
+        codeLengths[symbols[0]] = 1;
+        codeLengths[symbols[1]] = 2;
+        codeLengths[symbols[2]] = 3;
+        codeLengths[symbols[3]] = 3;
+        break;
+      default:
+        break;
+    }
+    return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit);
+  }
+  function readComplexHuffmanCode(alphabetSizeLimit, skip, tableGroup, tableIdx, s) {
+    const codeLengths = new Int32Array(alphabetSizeLimit);
+    const codeLengthCodeLengths = new Int32Array(18);
+    let space = 32;
+    let numCodes = 0;
+    for (let i = skip; i < 18; ++i) {
+      const codeLenIdx = CODE_LENGTH_CODE_ORDER[i];
+      if (s.bitOffset >= 16) {
+        s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+        s.bitOffset -= 16;
+      }
+      const p = s.accumulator32 >>> s.bitOffset & 15;
+      s.bitOffset += FIXED_TABLE[p] >> 16;
+      const v = FIXED_TABLE[p] & 0xFFFF;
+      codeLengthCodeLengths[codeLenIdx] = v;
+      if (v !== 0) {
+        space -= 32 >> v;
+        numCodes++;
+        if (space <= 0) {
+          break;
+        }
+      }
+    }
+    if (space !== 0 && numCodes !== 1) {
+      return makeError(s, -4);
+    }
+    const result = readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSizeLimit, codeLengths, s);
+    if (result < 0) {
+      return result;
+    }
+    return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit);
+  }
+  function readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) {
+    if (s.halfOffset > 2030) {
+      const result = readMoreInput(s);
+      if (result < 0) {
+        return result;
+      }
+    }
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    const simpleCodeOrSkip = readFewBits(s, 2);
+    if (simpleCodeOrSkip === 1) {
+      return readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s);
+    }
+    return readComplexHuffmanCode(alphabetSizeLimit, simpleCodeOrSkip, tableGroup, tableIdx, s);
+  }
+  function decodeContextMap(contextMapSize, contextMap, s) {
+    let result;
+    if (s.halfOffset > 2030) {
+      result = readMoreInput(s);
+      if (result < 0) {
+        return result;
+      }
+    }
+    const numTrees = decodeVarLenUnsignedByte(s) + 1;
+    if (numTrees === 1) {
+      contextMap.fill(0, 0, contextMapSize);
+      return numTrees;
+    }
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    const useRleForZeros = readFewBits(s, 1);
+    let maxRunLengthPrefix = 0;
+    if (useRleForZeros !== 0) {
+      maxRunLengthPrefix = readFewBits(s, 4) + 1;
+    }
+    const alphabetSize = numTrees + maxRunLengthPrefix;
+    const tableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSize + 31 >> 5];
+    const table = new Int32Array(tableSize + 1);
+    const tableIdx = table.length - 1;
+    result = readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s);
+    if (result < 0) {
+      return result;
+    }
+    let i = 0;
+    while (i < contextMapSize) {
+      if (s.halfOffset > 2030) {
+        result = readMoreInput(s);
+        if (result < 0) {
+          return result;
+        }
+      }
+      if (s.bitOffset >= 16) {
+        s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+        s.bitOffset -= 16;
+      }
+      const code = readSymbol(table, tableIdx, s);
+      if (code === 0) {
+        contextMap[i] = 0;
+        i++;
+      } else if (code <= maxRunLengthPrefix) {
+        if (s.bitOffset >= 16) {
+          s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+          s.bitOffset -= 16;
+        }
+        let reps = (1 << code) + readFewBits(s, code);
+        while (reps !== 0) {
+          if (i >= contextMapSize) {
+            return makeError(s, -3);
+          }
+          contextMap[i] = 0;
+          i++;
+          reps--;
+        }
+      } else {
+        contextMap[i] = code - maxRunLengthPrefix;
+        i++;
+      }
+    }
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    if (readFewBits(s, 1) === 1) {
+      inverseMoveToFrontTransform(contextMap, contextMapSize);
+    }
+    return numTrees;
+  }
+  function decodeBlockTypeAndLength(s, treeType, numBlockTypes) {
+    const ringBuffers = s.rings;
+    const offset = 4 + treeType * 2;
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    let blockType = readSymbol(s.blockTrees, 2 * treeType, s);
+    const result = readBlockLength(s.blockTrees, 2 * treeType + 1, s);
+    if (blockType === 1) {
+      blockType = ringBuffers[offset + 1] + 1;
+    } else if (blockType === 0) {
+      blockType = ringBuffers[offset];
+    } else {
+      blockType -= 2;
+    }
+    if (blockType >= numBlockTypes) {
+      blockType -= numBlockTypes;
+    }
+    ringBuffers[offset] = ringBuffers[offset + 1];
+    ringBuffers[offset + 1] = blockType;
+    return result;
+  }
+  function decodeLiteralBlockSwitch(s) {
+    s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes);
+    const literalBlockType = s.rings[5];
+    s.contextMapSlice = literalBlockType << 6;
+    s.literalTreeIdx = s.contextMap[s.contextMapSlice] & 0xFF;
+    const contextMode = s.contextModes[literalBlockType];
+    s.contextLookupOffset1 = contextMode << 9;
+    s.contextLookupOffset2 = s.contextLookupOffset1 + 256;
+  }
+  function decodeCommandBlockSwitch(s) {
+    s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes);
+    s.commandTreeIdx = s.rings[7];
+  }
+  function decodeDistanceBlockSwitch(s) {
+    s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes);
+    s.distContextMapSlice = s.rings[9] << 2;
+  }
+  function maybeReallocateRingBuffer(s) {
+    let newSize = s.maxRingBufferSize;
+    if (newSize > s.expectedTotalSize) {
+      const minimalNewSize = s.expectedTotalSize;
+      while (newSize >> 1 > minimalNewSize) {
+        newSize = newSize >> 1;
+      }
+      if (s.inputEnd === 0 && newSize < 16384 && s.maxRingBufferSize >= 16384) {
+        newSize = 16384;
+      }
+    }
+    if (newSize <= s.ringBufferSize) {
+      return;
+    }
+    const ringBufferSizeWithSlack = newSize + 37;
+    const newBuffer = new Int8Array(ringBufferSizeWithSlack);
+    const oldBuffer = s.ringBuffer;
+    if (oldBuffer.length !== 0) {
+      newBuffer.set(oldBuffer.subarray(0, s.ringBufferSize), 0);
+    }
+    s.ringBuffer = newBuffer;
+    s.ringBufferSize = newSize;
+  }
+  function readNextMetablockHeader(s) {
+    if (s.inputEnd !== 0) {
+      s.nextRunningState = 10;
+      s.runningState = 12;
+      return 0;
+    }
+    s.literalTreeGroup = new Int32Array(0);
+    s.commandTreeGroup = new Int32Array(0);
+    s.distanceTreeGroup = new Int32Array(0);
+    let result;
+    if (s.halfOffset > 2030) {
+      result = readMoreInput(s);
+      if (result < 0) {
+        return result;
+      }
+    }
+    result = decodeMetaBlockLength(s);
+    if (result < 0) {
+      return result;
+    }
+    if (s.metaBlockLength === 0 && s.isMetadata === 0) {
+      return 0;
+    }
+    if (s.isUncompressed !== 0 || s.isMetadata !== 0) {
+      result = jumpToByteBoundary(s);
+      if (result < 0) {
+        return result;
+      }
+      if (s.isMetadata === 0) {
+        s.runningState = 6;
+      } else {
+        s.runningState = 5;
+      }
+    } else {
+      s.runningState = 3;
+    }
+    if (s.isMetadata !== 0) {
+      return 0;
+    }
+    s.expectedTotalSize += s.metaBlockLength;
+    if (s.expectedTotalSize > 1 << 30) {
+      s.expectedTotalSize = 1 << 30;
+    }
+    if (s.ringBufferSize < s.maxRingBufferSize) {
+      maybeReallocateRingBuffer(s);
+    }
+    return 0;
+  }
+  function readMetablockPartition(s, treeType, numBlockTypes) {
+    let offset = s.blockTrees[2 * treeType];
+    if (numBlockTypes <= 1) {
+      s.blockTrees[2 * treeType + 1] = offset;
+      s.blockTrees[2 * treeType + 2] = offset;
+      return 1 << 28;
+    }
+    const blockTypeAlphabetSize = numBlockTypes + 2;
+    let result = readHuffmanCode(blockTypeAlphabetSize, blockTypeAlphabetSize, s.blockTrees, 2 * treeType, s);
+    if (result < 0) {
+      return result;
+    }
+    offset += result;
+    s.blockTrees[2 * treeType + 1] = offset;
+    const blockLengthAlphabetSize = 26;
+    result = readHuffmanCode(blockLengthAlphabetSize, blockLengthAlphabetSize, s.blockTrees, 2 * treeType + 1, s);
+    if (result < 0) {
+      return result;
+    }
+    offset += result;
+    s.blockTrees[2 * treeType + 2] = offset;
+    return readBlockLength(s.blockTrees, 2 * treeType + 1, s);
+  }
+  function calculateDistanceLut(s, alphabetSizeLimit) {
+    const distExtraBits = s.distExtraBits;
+    const distOffset = s.distOffset;
+    const npostfix = s.distancePostfixBits;
+    const ndirect = s.numDirectDistanceCodes;
+    const postfix = 1 << npostfix;
+    let bits = 1;
+    let half = 0;
+    let i = 16;
+    for (let j = 0; j < ndirect; ++j) {
+      distExtraBits[i] = 0;
+      distOffset[i] = j + 1;
+      ++i;
+    }
+    while (i < alphabetSizeLimit) {
+      const base = ndirect + ((2 + half << bits) - 4 << npostfix) + 1;
+      for (let j = 0; j < postfix; ++j) {
+        distExtraBits[i] = bits;
+        distOffset[i] = base + j;
+        ++i;
+      }
+      bits = bits + half;
+      half = half ^ 1;
+    }
+  }
+  function readMetablockHuffmanCodesAndContextMaps(s) {
+    s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1;
+    let result = readMetablockPartition(s, 0, s.numLiteralBlockTypes);
+    if (result < 0) {
+      return result;
+    }
+    s.literalBlockLength = result;
+    s.numCommandBlockTypes = decodeVarLenUnsignedByte(s) + 1;
+    result = readMetablockPartition(s, 1, s.numCommandBlockTypes);
+    if (result < 0) {
+      return result;
+    }
+    s.commandBlockLength = result;
+    s.numDistanceBlockTypes = decodeVarLenUnsignedByte(s) + 1;
+    result = readMetablockPartition(s, 2, s.numDistanceBlockTypes);
+    if (result < 0) {
+      return result;
+    }
+    s.distanceBlockLength = result;
+    if (s.halfOffset > 2030) {
+      result = readMoreInput(s);
+      if (result < 0) {
+        return result;
+      }
+    }
+    if (s.bitOffset >= 16) {
+      s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+      s.bitOffset -= 16;
+    }
+    s.distancePostfixBits = readFewBits(s, 2);
+    s.numDirectDistanceCodes = readFewBits(s, 4) << s.distancePostfixBits;
+    s.contextModes = new Int8Array(s.numLiteralBlockTypes);
+    let i = 0;
+    while (i < s.numLiteralBlockTypes) {
+      const limit = Math.min(i + 96, s.numLiteralBlockTypes);
+      while (i < limit) {
+        if (s.bitOffset >= 16) {
+          s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+          s.bitOffset -= 16;
+        }
+        s.contextModes[i] = readFewBits(s, 2);
+        i++;
+      }
+      if (s.halfOffset > 2030) {
+        result = readMoreInput(s);
+        if (result < 0) {
+          return result;
+        }
+      }
+    }
+    const contextMapLength = s.numLiteralBlockTypes << 6;
+    s.contextMap = new Int8Array(contextMapLength);
+    result = decodeContextMap(contextMapLength, s.contextMap, s);
+    if (result < 0) {
+      return result;
+    }
+    const numLiteralTrees = result;
+    s.trivialLiteralContext = 1;
+    for (let j = 0; j < contextMapLength; ++j) {
+      if (s.contextMap[j] !== j >> 6) {
+        s.trivialLiteralContext = 0;
+        break;
+      }
+    }
+    s.distContextMap = new Int8Array(s.numDistanceBlockTypes << 2);
+    result = decodeContextMap(s.numDistanceBlockTypes << 2, s.distContextMap, s);
+    if (result < 0) {
+      return result;
+    }
+    const numDistTrees = result;
+    s.literalTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(256, numLiteralTrees));
+    result = decodeHuffmanTreeGroup(256, 256, numLiteralTrees, s, s.literalTreeGroup);
+    if (result < 0) {
+      return result;
+    }
+    s.commandTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(704, s.numCommandBlockTypes));
+    result = decodeHuffmanTreeGroup(704, 704, s.numCommandBlockTypes, s, s.commandTreeGroup);
+    if (result < 0) {
+      return result;
+    }
+    let distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 24);
+    let distanceAlphabetSizeLimit = distanceAlphabetSizeMax;
+    if (s.isLargeWindow === 1) {
+      distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 62);
+      result = calculateDistanceAlphabetLimit(s, 0x7FFFFFFC, s.distancePostfixBits, s.numDirectDistanceCodes);
+      if (result < 0) {
+        return result;
+      }
+      distanceAlphabetSizeLimit = result;
+    }
+    s.distanceTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(distanceAlphabetSizeLimit, numDistTrees));
+    result = decodeHuffmanTreeGroup(distanceAlphabetSizeMax, distanceAlphabetSizeLimit, numDistTrees, s, s.distanceTreeGroup);
+    if (result < 0) {
+      return result;
+    }
+    calculateDistanceLut(s, distanceAlphabetSizeLimit);
+    s.contextMapSlice = 0;
+    s.distContextMapSlice = 0;
+    s.contextLookupOffset1 = s.contextModes[0] * 512;
+    s.contextLookupOffset2 = s.contextLookupOffset1 + 256;
+    s.literalTreeIdx = 0;
+    s.commandTreeIdx = 0;
+    s.rings[4] = 1;
+    s.rings[5] = 0;
+    s.rings[6] = 1;
+    s.rings[7] = 0;
+    s.rings[8] = 1;
+    s.rings[9] = 0;
+    return 0;
+  }
+  function copyUncompressedData(s) {
+    const ringBuffer = s.ringBuffer;
+    let result;
+    if (s.metaBlockLength <= 0) {
+      result = reload(s);
+      if (result < 0) {
+        return result;
+      }
+      s.runningState = 2;
+      return 0;
+    }
+    const chunkLength = Math.min(s.ringBufferSize - s.pos, s.metaBlockLength);
+    result = copyRawBytes(s, ringBuffer, s.pos, chunkLength);
+    if (result < 0) {
+      return result;
+    }
+    s.metaBlockLength -= chunkLength;
+    s.pos += chunkLength;
+    if (s.pos === s.ringBufferSize) {
+      s.nextRunningState = 6;
+      s.runningState = 12;
+      return 0;
+    }
+    result = reload(s);
+    if (result < 0) {
+      return result;
+    }
+    s.runningState = 2;
+    return 0;
+  }
+  function writeRingBuffer(s) {
+    const toWrite = Math.min(s.outputLength - s.outputUsed, s.ringBufferBytesReady - s.ringBufferBytesWritten);
+    if (toWrite !== 0) {
+      s.output.set(s.ringBuffer.subarray(s.ringBufferBytesWritten, s.ringBufferBytesWritten + toWrite), s.outputOffset + s.outputUsed);
+      s.outputUsed += toWrite;
+      s.ringBufferBytesWritten += toWrite;
+    }
+    if (s.outputUsed < s.outputLength) {
+      return 0;
+    }
+    return 2;
+  }
+  function huffmanTreeGroupAllocSize(alphabetSizeLimit, n) {
+    const maxTableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSizeLimit + 31 >> 5];
+    return n + n * maxTableSize;
+  }
+  function decodeHuffmanTreeGroup(alphabetSizeMax, alphabetSizeLimit, n, s, group) {
+    let next = n;
+    for (let i = 0; i < n; ++i) {
+      group[i] = next;
+      const result = readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, group, i, s);
+      if (result < 0) {
+        return result;
+      }
+      next += result;
+    }
+    return 0;
+  }
+  function calculateFence(s) {
+    let result = s.ringBufferSize;
+    if (s.isEager !== 0) {
+      result = Math.min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed);
+    }
+    return result;
+  }
+  function doUseDictionary(s, fence) {
+    if (s.distance > 0x7FFFFFFC) {
+      return makeError(s, -9);
+    }
+    const address = s.distance - s.maxDistance - 1 - s.cdTotalSize;
+    if (address < 0) {
+      const result = initializeCompoundDictionaryCopy(s, -address - 1, s.copyLength);
+      if (result < 0) {
+        return result;
+      }
+      s.runningState = 14;
+    } else {
+      const dictionaryData = data;
+      const wordLength = s.copyLength;
+      if (wordLength > 31) {
+        return makeError(s, -9);
+      }
+      const shift = sizeBits[wordLength];
+      if (shift === 0) {
+        return makeError(s, -9);
+      }
+      let offset = offsets[wordLength];
+      const mask = (1 << shift) - 1;
+      const wordIdx = address & mask;
+      const transformIdx = address >> shift;
+      offset += wordIdx * wordLength;
+      const transforms = RFC_TRANSFORMS;
+      if (transformIdx >= transforms.numTransforms) {
+        return makeError(s, -9);
+      }
+      const len = transformDictionaryWord(s.ringBuffer, s.pos, dictionaryData, offset, wordLength, transforms, transformIdx);
+      s.pos += len;
+      s.metaBlockLength -= len;
+      if (s.pos >= fence) {
+        s.nextRunningState = 4;
+        s.runningState = 12;
+        return 0;
+      }
+      s.runningState = 4;
+    }
+    return 0;
+  }
+  function initializeCompoundDictionary(s) {
+    s.cdBlockMap = new Int8Array(256);
+    let blockBits = 8;
+    while (s.cdTotalSize - 1 >> blockBits !== 0) {
+      blockBits++;
+    }
+    blockBits -= 8;
+    s.cdBlockBits = blockBits;
+    let cursor = 0;
+    let index = 0;
+    while (cursor < s.cdTotalSize) {
+      while (s.cdChunkOffsets[index + 1] < cursor) {
+        index++;
+      }
+      s.cdBlockMap[cursor >> blockBits] = index;
+      cursor += 1 << blockBits;
+    }
+  }
+  function initializeCompoundDictionaryCopy(s, address, length) {
+    if (s.cdBlockBits === -1) {
+      initializeCompoundDictionary(s);
+    }
+    let index = s.cdBlockMap[address >> s.cdBlockBits];
+    while (address >= s.cdChunkOffsets[index + 1]) {
+      index++;
+    }
+    if (s.cdTotalSize > address + length) {
+      return makeError(s, -9);
+    }
+    s.distRbIdx = s.distRbIdx + 1 & 0x3;
+    s.rings[s.distRbIdx] = s.distance;
+    s.metaBlockLength -= length;
+    s.cdBrIndex = index;
+    s.cdBrOffset = address - s.cdChunkOffsets[index];
+    s.cdBrLength = length;
+    s.cdBrCopied = 0;
+    return 0;
+  }
+  function copyFromCompoundDictionary(s, fence) {
+    let pos = s.pos;
+    const origPos = pos;
+    while (s.cdBrLength !== s.cdBrCopied) {
+      const space = fence - pos;
+      const chunkLength = s.cdChunkOffsets[s.cdBrIndex + 1] - s.cdChunkOffsets[s.cdBrIndex];
+      const remChunkLength = chunkLength - s.cdBrOffset;
+      let length = s.cdBrLength - s.cdBrCopied;
+      if (length > remChunkLength) {
+        length = remChunkLength;
+      }
+      if (length > space) {
+        length = space;
+      }
+      s.ringBuffer.set(s.cdChunks[s.cdBrIndex].subarray(s.cdBrOffset, s.cdBrOffset + length), pos);
+      pos += length;
+      s.cdBrOffset += length;
+      s.cdBrCopied += length;
+      if (length === remChunkLength) {
+        s.cdBrIndex++;
+        s.cdBrOffset = 0;
+      }
+      if (pos >= fence) {
+        break;
+      }
+    }
+    return pos - origPos;
+  }
+  function decompress(s) {
+    let result;
+    if (s.runningState === 0) {
+      return makeError(s, -25);
+    }
+    if (s.runningState < 0) {
+      return makeError(s, -28);
+    }
+    if (s.runningState === 11) {
+      return makeError(s, -22);
+    }
+    if (s.runningState === 1) {
+      const windowBits = decodeWindowBits(s);
+      if (windowBits === -1) {
+        return makeError(s, -11);
+      }
+      s.maxRingBufferSize = 1 << windowBits;
+      s.maxBackwardDistance = s.maxRingBufferSize - 16;
+      s.runningState = 2;
+    }
+    let fence = calculateFence(s);
+    let ringBufferMask = s.ringBufferSize - 1;
+    let ringBuffer = s.ringBuffer;
+    while (s.runningState !== 10) {
+      switch (s.runningState) {
+        case 2:
+          if (s.metaBlockLength < 0) {
+            return makeError(s, -10);
+          }
+          result = readNextMetablockHeader(s);
+          if (result < 0) {
+            return result;
+          }
+          fence = calculateFence(s);
+          ringBufferMask = s.ringBufferSize - 1;
+          ringBuffer = s.ringBuffer;
+          continue;
+        case 3:
+          result = readMetablockHuffmanCodesAndContextMaps(s);
+          if (result < 0) {
+            return result;
+          }
+          s.runningState = 4;
+          continue;
+        case 4:
+          if (s.metaBlockLength <= 0) {
+            s.runningState = 2;
+            continue;
+          }
+          if (s.halfOffset > 2030) {
+            result = readMoreInput(s);
+            if (result < 0) {
+              return result;
+            }
+          }
+          if (s.commandBlockLength === 0) {
+            decodeCommandBlockSwitch(s);
+          }
+          s.commandBlockLength--;
+          if (s.bitOffset >= 16) {
+            s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+            s.bitOffset -= 16;
+          }
+          const cmdCode = readSymbol(s.commandTreeGroup, s.commandTreeIdx, s) << 2;
+          const insertAndCopyExtraBits = CMD_LOOKUP[cmdCode];
+          const insertLengthOffset = CMD_LOOKUP[cmdCode + 1];
+          const copyLengthOffset = CMD_LOOKUP[cmdCode + 2];
+          s.distanceCode = CMD_LOOKUP[cmdCode + 3];
+          if (s.bitOffset >= 16) {
+            s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+            s.bitOffset -= 16;
+          }
+          const insertLengthExtraBits = insertAndCopyExtraBits & 0xFF;
+          s.insertLength = insertLengthOffset + (insertLengthExtraBits <= 16 ? readFewBits(s, insertLengthExtraBits) : readManyBits(s, insertLengthExtraBits));
+          if (s.bitOffset >= 16) {
+            s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+            s.bitOffset -= 16;
+          }
+          const copyLengthExtraBits = insertAndCopyExtraBits >> 8;
+          s.copyLength = copyLengthOffset + (copyLengthExtraBits <= 16 ? readFewBits(s, copyLengthExtraBits) : readManyBits(s, copyLengthExtraBits));
+          s.j = 0;
+          s.runningState = 7;
+          continue;
+        case 7:
+          if (s.trivialLiteralContext !== 0) {
+            while (s.j < s.insertLength) {
+              if (s.halfOffset > 2030) {
+                result = readMoreInput(s);
+                if (result < 0) {
+                  return result;
+                }
+              }
+              if (s.literalBlockLength === 0) {
+                decodeLiteralBlockSwitch(s);
+              }
+              s.literalBlockLength--;
+              if (s.bitOffset >= 16) {
+                s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+                s.bitOffset -= 16;
+              }
+              ringBuffer[s.pos] = readSymbol(s.literalTreeGroup, s.literalTreeIdx, s);
+              s.pos++;
+              s.j++;
+              if (s.pos >= fence) {
+                s.nextRunningState = 7;
+                s.runningState = 12;
+                break;
+              }
+            }
+          } else {
+            let prevByte1 = ringBuffer[s.pos - 1 & ringBufferMask] & 0xFF;
+            let prevByte2 = ringBuffer[s.pos - 2 & ringBufferMask] & 0xFF;
+            while (s.j < s.insertLength) {
+              if (s.halfOffset > 2030) {
+                result = readMoreInput(s);
+                if (result < 0) {
+                  return result;
+                }
+              }
+              if (s.literalBlockLength === 0) {
+                decodeLiteralBlockSwitch(s);
+              }
+              const literalContext = LOOKUP[s.contextLookupOffset1 + prevByte1] | LOOKUP[s.contextLookupOffset2 + prevByte2];
+              const literalTreeIdx = s.contextMap[s.contextMapSlice + literalContext] & 0xFF;
+              s.literalBlockLength--;
+              prevByte2 = prevByte1;
+              if (s.bitOffset >= 16) {
+                s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+                s.bitOffset -= 16;
+              }
+              prevByte1 = readSymbol(s.literalTreeGroup, literalTreeIdx, s);
+              ringBuffer[s.pos] = prevByte1;
+              s.pos++;
+              s.j++;
+              if (s.pos >= fence) {
+                s.nextRunningState = 7;
+                s.runningState = 12;
+                break;
+              }
+            }
+          }
+          if (s.runningState !== 7) {
+            continue;
+          }
+          s.metaBlockLength -= s.insertLength;
+          if (s.metaBlockLength <= 0) {
+            s.runningState = 4;
+            continue;
+          }
+          let distanceCode = s.distanceCode;
+          if (distanceCode < 0) {
+            s.distance = s.rings[s.distRbIdx];
+          } else {
+            if (s.halfOffset > 2030) {
+              result = readMoreInput(s);
+              if (result < 0) {
+                return result;
+              }
+            }
+            if (s.distanceBlockLength === 0) {
+              decodeDistanceBlockSwitch(s);
+            }
+            s.distanceBlockLength--;
+            if (s.bitOffset >= 16) {
+              s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+              s.bitOffset -= 16;
+            }
+            const distTreeIdx = s.distContextMap[s.distContextMapSlice + distanceCode] & 0xFF;
+            distanceCode = readSymbol(s.distanceTreeGroup, distTreeIdx, s);
+            if (distanceCode < 16) {
+              const index = s.distRbIdx + DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode] & 0x3;
+              s.distance = s.rings[index] + DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode];
+              if (s.distance < 0) {
+                return makeError(s, -12);
+              }
+            } else {
+              const extraBits = s.distExtraBits[distanceCode];
+              let bits;
+              if (s.bitOffset + extraBits <= 32) {
+                bits = readFewBits(s, extraBits);
+              } else {
+                if (s.bitOffset >= 16) {
+                  s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+                  s.bitOffset -= 16;
+                }
+                bits = extraBits <= 16 ? readFewBits(s, extraBits) : readManyBits(s, extraBits);
+              }
+              s.distance = s.distOffset[distanceCode] + (bits << s.distancePostfixBits);
+            }
+          }
+          if (s.maxDistance !== s.maxBackwardDistance && s.pos < s.maxBackwardDistance) {
+            s.maxDistance = s.pos;
+          } else {
+            s.maxDistance = s.maxBackwardDistance;
+          }
+          if (s.distance > s.maxDistance) {
+            s.runningState = 9;
+            continue;
+          }
+          if (distanceCode > 0) {
+            s.distRbIdx = s.distRbIdx + 1 & 0x3;
+            s.rings[s.distRbIdx] = s.distance;
+          }
+          if (s.copyLength > s.metaBlockLength) {
+            return makeError(s, -9);
+          }
+          s.j = 0;
+          s.runningState = 8;
+          continue;
+        case 8:
+          let src = s.pos - s.distance & ringBufferMask;
+          let dst = s.pos;
+          const copyLength = s.copyLength - s.j;
+          const srcEnd = src + copyLength;
+          const dstEnd = dst + copyLength;
+          if (srcEnd < ringBufferMask && dstEnd < ringBufferMask) {
+            if (copyLength < 12 || srcEnd > dst && dstEnd > src) {
+              const numQuads = copyLength + 3 >> 2;
+              for (let k = 0; k < numQuads; ++k) {
+                ringBuffer[dst++] = ringBuffer[src++];
+                ringBuffer[dst++] = ringBuffer[src++];
+                ringBuffer[dst++] = ringBuffer[src++];
+                ringBuffer[dst++] = ringBuffer[src++];
+              }
+            } else {
+              ringBuffer.copyWithin(dst, src, srcEnd);
+            }
+            s.j += copyLength;
+            s.metaBlockLength -= copyLength;
+            s.pos += copyLength;
+          } else {
+            while (s.j < s.copyLength) {
+              ringBuffer[s.pos] = ringBuffer[s.pos - s.distance & ringBufferMask];
+              s.metaBlockLength--;
+              s.pos++;
+              s.j++;
+              if (s.pos >= fence) {
+                s.nextRunningState = 8;
+                s.runningState = 12;
+                break;
+              }
+            }
+          }
+          if (s.runningState === 8) {
+            s.runningState = 4;
+          }
+          continue;
+        case 9:
+          result = doUseDictionary(s, fence);
+          if (result < 0) {
+            return result;
+          }
+          continue;
+        case 14:
+          s.pos += copyFromCompoundDictionary(s, fence);
+          if (s.pos >= fence) {
+            s.nextRunningState = 14;
+            s.runningState = 12;
+            return 2;
+          }
+          s.runningState = 4;
+          continue;
+        case 5:
+          while (s.metaBlockLength > 0) {
+            if (s.halfOffset > 2030) {
+              result = readMoreInput(s);
+              if (result < 0) {
+                return result;
+              }
+            }
+            if (s.bitOffset >= 16) {
+              s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+              s.bitOffset -= 16;
+            }
+            readFewBits(s, 8);
+            s.metaBlockLength--;
+          }
+          s.runningState = 2;
+          continue;
+        case 6:
+          result = copyUncompressedData(s);
+          if (result < 0) {
+            return result;
+          }
+          continue;
+        case 12:
+          s.ringBufferBytesReady = Math.min(s.pos, s.ringBufferSize);
+          s.runningState = 13;
+          continue;
+        case 13:
+          result = writeRingBuffer(s);
+          if (result !== 0) {
+            return result;
+          }
+          if (s.pos >= s.maxBackwardDistance) {
+            s.maxDistance = s.maxBackwardDistance;
+          }
+          if (s.pos >= s.ringBufferSize) {
+            if (s.pos > s.ringBufferSize) {
+              ringBuffer.copyWithin(0, s.ringBufferSize, s.pos);
+            }
+            s.pos = s.pos & ringBufferMask;
+            s.ringBufferBytesWritten = 0;
+          }
+          s.runningState = s.nextRunningState;
+          continue;
+        default:
+          return makeError(s, -28);
+      }
+    }
+    if (s.runningState !== 10) {
+      return makeError(s, -29);
+    }
+    if (s.metaBlockLength < 0) {
+      return makeError(s, -10);
+    }
+    result = jumpToByteBoundary(s);
+    if (result !== 0) {
+      return result;
+    }
+    result = checkHealth(s, 1);
+    if (result !== 0) {
+      return result;
+    }
+    return 1;
+  }
+  function Transforms(numTransforms, prefixSuffixLen, prefixSuffixCount) {
+    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 = numTransforms;
+    this.triplets = new Int32Array(numTransforms * 3);
+    this.params = new Int16Array(numTransforms);
+    this.prefixSuffixStorage = new Int8Array(prefixSuffixLen);
+    this.prefixSuffixHeads = new Int32Array(prefixSuffixCount + 1);
+  }
+  const RFC_TRANSFORMS = new Transforms(121, 167, 50);
+  function unpackTransforms(prefixSuffix, prefixSuffixHeads, transforms, prefixSuffixSrc, transformsSrc) {
+    const prefixSuffixBytes = toUtf8Runes(prefixSuffixSrc);
+    const n = prefixSuffixBytes.length;
+    let index = 1;
+    let j = 0;
+    for (let i = 0; i < n; ++i) {
+      const c = prefixSuffixBytes[i];
+      if (c === 35) {
+        prefixSuffixHeads[index++] = j;
+      } else {
+        prefixSuffix[j++] = c;
+      }
+    }
+    for (let i = 0; i < 363; ++i) {
+      transforms[i] = transformsSrc.charCodeAt(i) - 32;
+    }
+  }
+  unpackTransforms(RFC_TRANSFORMS.prefixSuffixStorage, RFC_TRANSFORMS.prefixSuffixHeads, RFC_TRANSFORMS.triplets, "# #s #, #e #.# the #.com/#\xC2\xA0# of # and # in # to #\"#\">#\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 transformDictionaryWord(dst, dstOffset, src, srcOffset, wordLen, transforms, transformIndex) {
+    let offset = dstOffset;
+    const triplets = transforms.triplets;
+    const prefixSuffixStorage = transforms.prefixSuffixStorage;
+    const prefixSuffixHeads = transforms.prefixSuffixHeads;
+    const transformOffset = 3 * transformIndex;
+    const prefixIdx = triplets[transformOffset];
+    const transformType = triplets[transformOffset + 1];
+    const suffixIdx = triplets[transformOffset + 2];
+    let prefix = prefixSuffixHeads[prefixIdx];
+    const prefixEnd = prefixSuffixHeads[prefixIdx + 1];
+    let suffix = prefixSuffixHeads[suffixIdx];
+    const suffixEnd = prefixSuffixHeads[suffixIdx + 1];
+    let omitFirst = transformType - 11;
+    let omitLast = transformType;
+    if (omitFirst < 1 || omitFirst > 9) {
+      omitFirst = 0;
+    }
+    if (omitLast < 1 || omitLast > 9) {
+      omitLast = 0;
+    }
+    while (prefix !== prefixEnd) {
+      dst[offset++] = prefixSuffixStorage[prefix++];
+    }
+    let len = wordLen;
+    if (omitFirst > len) {
+      omitFirst = len;
+    }
+    let dictOffset = srcOffset + omitFirst;
+    len -= omitFirst;
+    len -= omitLast;
+    let i = len;
+    while (i > 0) {
+      dst[offset++] = src[dictOffset++];
+      i--;
+    }
+    if (transformType === 10 || transformType === 11) {
+      let uppercaseOffset = offset - len;
+      if (transformType === 10) {
+        len = 1;
+      }
+      while (len > 0) {
+        const c0 = dst[uppercaseOffset] & 0xFF;
+        if (c0 < 0xC0) {
+          if (c0 >= 97 && c0 <= 122) {
+            dst[uppercaseOffset] = dst[uppercaseOffset] ^ 32;
+          }
+          uppercaseOffset += 1;
+          len -= 1;
+        } else if (c0 < 0xE0) {
+          dst[uppercaseOffset + 1] = dst[uppercaseOffset + 1] ^ 32;
+          uppercaseOffset += 2;
+          len -= 2;
+        } else {
+          dst[uppercaseOffset + 2] = dst[uppercaseOffset + 2] ^ 5;
+          uppercaseOffset += 3;
+          len -= 3;
+        }
+      }
+    } else if (transformType === 21 || transformType === 22) {
+      let shiftOffset = offset - len;
+      const param = transforms.params[transformIndex];
+      let scalar = (param & 0x7FFF) + (0x1000000 - (param & 0x8000));
+      while (len > 0) {
+        let step = 1;
+        const c0 = dst[shiftOffset] & 0xFF;
+        if (c0 < 0x80) {
+          scalar += c0;
+          dst[shiftOffset] = scalar & 0x7F;
+        } else if (c0 < 0xC0) {} else if (c0 < 0xE0) {
+          if (len >= 2) {
+            const c1 = dst[shiftOffset + 1];
+            scalar += c1 & 0x3F | (c0 & 0x1F) << 6;
+            dst[shiftOffset] = 0xC0 | scalar >> 6 & 0x1F;
+            dst[shiftOffset + 1] = c1 & 0xC0 | scalar & 0x3F;
+            step = 2;
+          } else {
+            step = len;
+          }
+        } else if (c0 < 0xF0) {
+          if (len >= 3) {
+            const c1 = dst[shiftOffset + 1];
+            const c2 = dst[shiftOffset + 2];
+            scalar += c2 & 0x3F | (c1 & 0x3F) << 6 | (c0 & 0x0F) << 12;
+            dst[shiftOffset] = 0xE0 | scalar >> 12 & 0x0F;
+            dst[shiftOffset + 1] = c1 & 0xC0 | scalar >> 6 & 0x3F;
+            dst[shiftOffset + 2] = c2 & 0xC0 | scalar & 0x3F;
+            step = 3;
+          } else {
+            step = len;
+          }
+        } else if (c0 < 0xF8) {
+          if (len >= 4) {
+            const c1 = dst[shiftOffset + 1];
+            const c2 = dst[shiftOffset + 2];
+            const c3 = dst[shiftOffset + 3];
+            scalar += c3 & 0x3F | (c2 & 0x3F) << 6 | (c1 & 0x3F) << 12 | (c0 & 0x07) << 18;
+            dst[shiftOffset] = 0xF0 | scalar >> 18 & 0x07;
+            dst[shiftOffset + 1] = c1 & 0xC0 | scalar >> 12 & 0x3F;
+            dst[shiftOffset + 2] = c2 & 0xC0 | scalar >> 6 & 0x3F;
+            dst[shiftOffset + 3] = c3 & 0xC0 | scalar & 0x3F;
+            step = 4;
+          } else {
+            step = len;
+          }
+        }
+        shiftOffset += step;
+        len -= step;
+        if (transformType === 21) {
+          len = 0;
+        }
+      }
+    }
+    while (suffix !== suffixEnd) {
+      dst[offset++] = prefixSuffixStorage[suffix++];
+    }
+    return offset - dstOffset;
+  }
+  function getNextKey(key, len) {
+    let step = 1 << len - 1;
+    while ((key & step) !== 0) {
+      step = step >> 1;
+    }
+    return (key & step - 1) + step;
+  }
+  function replicateValue(table, offset, step, end, item) {
+    let pos = end;
+    while (pos > 0) {
+      pos -= step;
+      table[offset + pos] = item;
+    }
+  }
+  function nextTableBitSize(count, len, rootBits) {
+    let bits = len;
+    let left = 1 << bits - rootBits;
+    while (bits < 15) {
+      left -= count[bits];
+      if (left <= 0) {
+        break;
+      }
+      bits++;
+      left = left << 1;
+    }
+    return bits - rootBits;
+  }
+  function buildHuffmanTable(tableGroup, tableIdx, rootBits, codeLengths, codeLengthsSize) {
+    const tableOffset = tableGroup[tableIdx];
+    const sorted = new Int32Array(codeLengthsSize);
+    const count = new Int32Array(16);
+    const offset = new Int32Array(16);
+    for (let sym = 0; sym < codeLengthsSize; ++sym) {
+      count[codeLengths[sym]]++;
+    }
+    offset[1] = 0;
+    for (let len = 1; len < 15; ++len) {
+      offset[len + 1] = offset[len] + count[len];
+    }
+    for (let sym = 0; sym < codeLengthsSize; ++sym) {
+      if (codeLengths[sym] !== 0) {
+        sorted[offset[codeLengths[sym]]++] = sym;
+      }
+    }
+    let tableBits = rootBits;
+    let tableSize = 1 << tableBits;
+    let totalSize = tableSize;
+    if (offset[15] === 1) {
+      for (let k = 0; k < totalSize; ++k) {
+        tableGroup[tableOffset + k] = sorted[0];
+      }
+      return totalSize;
+    }
+    let key = 0;
+    let symbol = 0;
+    let step = 1;
+    for (let len = 1; len <= rootBits; ++len) {
+      step = step << 1;
+      while (count[len] > 0) {
+        replicateValue(tableGroup, tableOffset + key, step, tableSize, len << 16 | sorted[symbol++]);
+        key = getNextKey(key, len);
+        count[len]--;
+      }
+    }
+    const mask = totalSize - 1;
+    let low = -1;
+    let currentOffset = tableOffset;
+    step = 1;
+    for (let len = rootBits + 1; len <= 15; ++len) {
+      step = step << 1;
+      while (count[len] > 0) {
+        if ((key & mask) !== low) {
+          currentOffset += tableSize;
+          tableBits = nextTableBitSize(count, len, rootBits);
+          tableSize = 1 << tableBits;
+          totalSize += tableSize;
+          low = key & mask;
+          tableGroup[tableOffset + low] = tableBits + rootBits << 16 | currentOffset - tableOffset - low;
+        }
+        replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize, len - rootBits << 16 | sorted[symbol++]);
+        key = getNextKey(key, len);
+        count[len]--;
+      }
+    }
+    return totalSize;
+  }
+  function readMoreInput(s) {
+    if (s.endOfStreamReached !== 0) {
+      if (halfAvailable(s) >= -2) {
+        return 0;
+      }
+      return makeError(s, -16);
+    }
+    const readOffset = s.halfOffset << 1;
+    let bytesInBuffer = 4096 - readOffset;
+    s.byteBuffer.copyWithin(0, readOffset, 4096);
+    s.halfOffset = 0;
+    while (bytesInBuffer < 4096) {
+      const spaceLeft = 4096 - bytesInBuffer;
+      const len = readInput(s, s.byteBuffer, bytesInBuffer, spaceLeft);
+      if (len < -1) {
+        return len;
+      }
+      if (len <= 0) {
+        s.endOfStreamReached = 1;
+        s.tailBytes = bytesInBuffer;
+        bytesInBuffer += 1;
+        break;
+      }
+      bytesInBuffer += len;
+    }
+    bytesToNibbles(s, bytesInBuffer);
+    return 0;
+  }
+  function checkHealth(s, endOfStream) {
+    if (s.endOfStreamReached === 0) {
+      return 0;
+    }
+    const byteOffset = (s.halfOffset << 1) + (s.bitOffset + 7 >> 3) - 4;
+    if (byteOffset > s.tailBytes) {
+      return makeError(s, -13);
+    }
+    if (endOfStream !== 0 && byteOffset !== s.tailBytes) {
+      return makeError(s, -17);
+    }
+    return 0;
+  }
+  function readFewBits(s, n) {
+    const v = s.accumulator32 >>> s.bitOffset & (1 << n) - 1;
+    s.bitOffset += n;
+    return v;
+  }
+  function readManyBits(s, n) {
+    const low = readFewBits(s, 16);
+    s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+    s.bitOffset -= 16;
+    return low | readFewBits(s, n - 16) << 16;
+  }
+  function initBitReader(s) {
+    s.byteBuffer = new Int8Array(4160);
+    s.accumulator32 = 0;
+    s.shortBuffer = new Int16Array(2080);
+    s.bitOffset = 32;
+    s.halfOffset = 2048;
+    s.endOfStreamReached = 0;
+    return prepare(s);
+  }
+  function prepare(s) {
+    if (s.halfOffset > 2030) {
+      const result = readMoreInput(s);
+      if (result !== 0) {
+        return result;
+      }
+    }
+    let health = checkHealth(s, 0);
+    if (health !== 0) {
+      return health;
+    }
+    s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+    s.bitOffset -= 16;
+    s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+    s.bitOffset -= 16;
+    return 0;
+  }
+  function reload(s) {
+    if (s.bitOffset === 32) {
+      return prepare(s);
+    }
+    return 0;
+  }
+  function jumpToByteBoundary(s) {
+    const padding = 32 - s.bitOffset & 7;
+    if (padding !== 0) {
+      const paddingBits = readFewBits(s, padding);
+      if (paddingBits !== 0) {
+        return makeError(s, -5);
+      }
+    }
+    return 0;
+  }
+  function halfAvailable(s) {
+    let limit = 2048;
+    if (s.endOfStreamReached !== 0) {
+      limit = s.tailBytes + 1 >> 1;
+    }
+    return limit - s.halfOffset;
+  }
+  function copyRawBytes(s, data, offset, length) {
+    let pos = offset;
+    let len = length;
+    if ((s.bitOffset & 7) !== 0) {
+      return makeError(s, -30);
+    }
+    while (s.bitOffset !== 32 && len !== 0) {
+      data[pos++] = s.accumulator32 >>> s.bitOffset;
+      s.bitOffset += 8;
+      len--;
+    }
+    if (len === 0) {
+      return 0;
+    }
+    const copyNibbles = Math.min(halfAvailable(s), len >> 1);
+    if (copyNibbles > 0) {
+      const readOffset = s.halfOffset << 1;
+      const delta = copyNibbles << 1;
+      data.set(s.byteBuffer.subarray(readOffset, readOffset + delta), pos);
+      pos += delta;
+      len -= delta;
+      s.halfOffset += copyNibbles;
+    }
+    if (len === 0) {
+      return 0;
+    }
+    if (halfAvailable(s) > 0) {
+      if (s.bitOffset >= 16) {
+        s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16;
+        s.bitOffset -= 16;
+      }
+      while (len !== 0) {
+        data[pos++] = s.accumulator32 >>> s.bitOffset;
+        s.bitOffset += 8;
+        len--;
+      }
+      return checkHealth(s, 0);
+    }
+    while (len > 0) {
+      const chunkLen = readInput(s, data, pos, len);
+      if (chunkLen < -1) {
+        return chunkLen;
+      }
+      if (chunkLen <= 0) {
+        return makeError(s, -16);
+      }
+      pos += chunkLen;
+      len -= chunkLen;
+    }
+    return 0;
+  }
+  function bytesToNibbles(s, byteLen) {
+    const byteBuffer = s.byteBuffer;
+    const halfLen = byteLen >> 1;
+    const shortBuffer = s.shortBuffer;
+    for (let i = 0; i < halfLen; ++i) {
+      shortBuffer[i] = byteBuffer[i * 2] & 0xFF | (byteBuffer[i * 2 + 1] & 0xFF) << 8;
+    }
+  }
+  const LOOKUP = new Int32Array(2048);
+  function unpackLookupTable(lookup, utfMap, utfRle) {
+    for (let i = 0; i < 256; ++i) {
+      lookup[i] = i & 0x3F;
+      lookup[512 + i] = i >> 2;
+      lookup[1792 + i] = 2 + (i >> 6);
+    }
+    for (let i = 0; i < 128; ++i) {
+      lookup[1024 + i] = 4 * (utfMap.charCodeAt(i) - 32);
+    }
+    for (let i = 0; i < 64; ++i) {
+      lookup[1152 + i] = i & 1;
+      lookup[1216 + i] = 2 + (i & 1);
+    }
+    let offset = 1280;
+    for (let k = 0; k < 19; ++k) {
+      const value = k & 3;
+      const rep = utfRle.charCodeAt(k) - 32;
+      for (let i = 0; i < rep; ++i) {
+        lookup[offset++] = value;
+      }
+    }
+    for (let i = 0; i < 16; ++i) {
+      lookup[1792 + i] = 1;
+      lookup[2032 + i] = 6;
+    }
+    lookup[1792] = 0;
+    lookup[2047] = 7;
+    for (let i = 0; i < 256; ++i) {
+      lookup[1536 + i] = lookup[1792 + i] << 3;
+    }
+  }
+  unpackLookupTable(LOOKUP, "         !!  !                  \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ", "A/*  ':  & : $  \x81 @");
+  function State() {
+    this.ringBuffer = new Int8Array(0);
+    this.contextModes = new Int8Array(0);
+    this.contextMap = new Int8Array(0);
+    this.distContextMap = new Int8Array(0);
+    this.distExtraBits = new Int8Array(0);
+    this.output = new Int8Array(0);
+    this.byteBuffer = new Int8Array(0);
+    this.shortBuffer = new Int16Array(0);
+    this.intBuffer = new Int32Array(0);
+    this.rings = new Int32Array(0);
+    this.blockTrees = new Int32Array(0);
+    this.literalTreeGroup = new Int32Array(0);
+    this.commandTreeGroup = new Int32Array(0);
+    this.distanceTreeGroup = new Int32Array(0);
+    this.distOffset = new Int32Array(0);
+    this.accumulator64 = 0;
+    this.runningState = 0;
+    this.nextRunningState = 0;
+    this.accumulator32 = 0;
+    this.bitOffset = 0;
+    this.halfOffset = 0;
+    this.tailBytes = 0;
+    this.endOfStreamReached = 0;
+    this.metaBlockLength = 0;
+    this.inputEnd = 0;
+    this.isUncompressed = 0;
+    this.isMetadata = 0;
+    this.literalBlockLength = 0;
+    this.numLiteralBlockTypes = 0;
+    this.commandBlockLength = 0;
+    this.numCommandBlockTypes = 0;
+    this.distanceBlockLength = 0;
+    this.numDistanceBlockTypes = 0;
+    this.pos = 0;
+    this.maxDistance = 0;
+    this.distRbIdx = 0;
+    this.trivialLiteralContext = 0;
+    this.literalTreeIdx = 0;
+    this.commandTreeIdx = 0;
+    this.j = 0;
+    this.insertLength = 0;
+    this.contextMapSlice = 0;
+    this.distContextMapSlice = 0;
+    this.contextLookupOffset1 = 0;
+    this.contextLookupOffset2 = 0;
+    this.distanceCode = 0;
+    this.numDirectDistanceCodes = 0;
+    this.distancePostfixBits = 0;
+    this.distance = 0;
+    this.copyLength = 0;
+    this.maxBackwardDistance = 0;
+    this.maxRingBufferSize = 0;
+    this.ringBufferSize = 0;
+    this.expectedTotalSize = 0;
+    this.outputOffset = 0;
+    this.outputLength = 0;
+    this.outputUsed = 0;
+    this.ringBufferBytesWritten = 0;
+    this.ringBufferBytesReady = 0;
+    this.isEager = 0;
+    this.isLargeWindow = 0;
+    this.cdNumChunks = 0;
+    this.cdTotalSize = 0;
+    this.cdBrIndex = 0;
+    this.cdBrOffset = 0;
+    this.cdBrLength = 0;
+    this.cdBrCopied = 0;
+    this.cdChunks = new Array(0);
+    this.cdChunkOffsets = new Int32Array(0);
+    this.cdBlockBits = 0;
+    this.cdBlockMap = new Int8Array(0);
+    this.input = new InputStream(new Int8Array(0));
+    this.ringBuffer = new Int8Array(0);
+    this.rings = new Int32Array(10);
+    this.rings[0] = 16;
+    this.rings[1] = 15;
+    this.rings[2] = 11;
+    this.rings[3] = 4;
+  }
+  let data = new Int8Array(0);
+  const offsets = new Int32Array(32);
+  const sizeBits = new Int32Array(32);
+  function setData(newData, newSizeBits) {
+    const dictionaryOffsets = offsets;
+    const dictionarySizeBits = sizeBits;
+    for (let i = 0; i < newSizeBits.length; ++i) {
+      dictionarySizeBits[i] = newSizeBits[i];
+    }
+    let pos = 0;
+    for (let i = 0; i < newSizeBits.length; ++i) {
+      dictionaryOffsets[i] = pos;
+      const bits = dictionarySizeBits[i];
+      if (bits !== 0) {
+        pos += i << (bits & 31);
+      }
+    }
+    for (let i = newSizeBits.length; i < 32; ++i) {
+      dictionaryOffsets[i] = pos;
+    }
+    data = newData;
+  }
+  function unpackDictionaryData(dictionary, data0, data1, skipFlip, sizeBits, sizeBitsData) {
+    const dict = toUsAsciiBytes(data0 + data1);
+    const skipFlipRunes = toUtf8Runes(skipFlip);
+    let offset = 0;
+    const n = skipFlipRunes.length >> 1;
+    for (let i = 0; i < n; ++i) {
+      const skip = skipFlipRunes[2 * i] - 36;
+      const flip = skipFlipRunes[2 * i + 1] - 36;
+      for (let j = 0; j < skip; ++j) {
+        dict[offset] = dict[offset] ^ 3;
+        offset++;
+      }
+      for (let j = 0; j < flip; ++j) {
+        dict[offset] = dict[offset] ^ 236;
+        offset++;
+      }
+    }
+    for (let i = 0; i < sizeBitsData.length; ++i) {
+      sizeBits[i] = sizeBitsData.charCodeAt(i) - 65;
+    }
+    dictionary.set(dict);
+  }
+  const dictionaryData = new Int8Array(122784);
+  const dictionarySizeBits = new Int32Array(25);
+  unpackDictionaryData(dictionaryData, "wjnfgltmojefofewab`h`lgfgbwbpkltlmozpjwf`jwzlsfmivpwojhfeqfftlqhwf{wzfbqlufqalgzolufelqnallhsobzojufojmfkfosklnfpjgfnlqftlqgolmdwkfnujftejmgsbdfgbzpevookfbgwfqnfb`kbqfbeqlnwqvfnbqhbaofvslmkjdkgbwfobmgmftpfufmmf{w`bpfalwkslpwvpfgnbgfkbmgkfqftkbwmbnfOjmhaoldpjyfabpfkfognbhfnbjmvpfq$*#(klogfmgptjwkMftpqfbgtfqfpjdmwbhfkbufdbnfpffm`boosbwktfoosovpnfmvejonsbqwiljmwkjpojpwdllgmffgtbzptfpwilapnjmgboploldlqj`kvpfpobpwwfbnbqnzellghjmdtjoofbpwtbqgafpwejqfSbdfhmltbtbz-smdnlufwkbmolbgdjufpfoemlwfnv`keffgnbmzql`hj`lmlm`follhkjgfgjfgKlnfqvofklpwbib{jmel`ovaobtpofppkboeplnfpv`kylmf233&lmfp`bqfWjnfqb`faovfelvqtffheb`fklsfdbufkbqgolpwtkfmsbqhhfswsbpppkjsqllnKWNOsobmWzsfglmfpbufhffseobdojmhplogejufwllhqbwfwltmivnswkvpgbqh`bqgejofefbqpwbzhjoowkbweboobvwlfufq-`lnwbohpklsulwfgffsnlgfqfpwwvqmalqmabmgefooqlpfvqo+phjmqlof`lnfb`wpbdfpnffwdlog-isdjwfnubqzefowwkfmpfmggqlsUjft`lsz2-3!?,b=pwlsfopfojfpwlvqsb`h-djesbpw`pp<dqbznfbm%dw8qjgfpklwobwfpbjgqlbgubq#effoilkmqj`hslqwebpw$VB.gfbg?,a=sllqajoowzsfV-P-tllgnvpw1s{8JmelqbmhtjgftbmwtbooofbgX3^8sbvotbufpvqf'+$ tbjwnbppbqnpdlfpdbjmobmdsbjg\"..#ol`hvmjwqllwtbohejqntjef{no!plmdwfpw13s{hjmgqltpwlloelmwnbjopbefpwbqnbsp`lqfqbjmeoltabazpsbmpbzp7s{85s{8bqwpellwqfbotjhjkfbwpwfswqjslqd,obhftfbhwlogElqn`bpwebmpabmhufqzqvmpivozwbph2s{8dlbodqftpoltfgdfjg>!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#~sks<kfoowbootklnyk9\t),\x0E\t#233kboo-\t\tB4s{8svpk`kbw3s{8`qft),?,kbpk46s{eobwqbqf#%%#wfoo`bnslmwlobjgnjppphjswfmwejmfnbofdfwpsolw733/\x0E\t\x0E\t`lloeffw-sks?aq=fqj`nlpwdvjgafoogfp`kbjqnbwkbwln,jnd% ;1ov`h`fmw3338wjmzdlmfkwnopfoogqvdEQFFmlgfmj`h<jg>olpfmvooubpwtjmgQPP#tfbqqfozaffmpbnfgvhfmbpb`bsftjpkdvoeW109kjwppolwdbwfhj`haovqwkfz26s{$$*8*8!=npjftjmpajqgplqwafwbpffhW2;9lqgpwqffnboo53s{ebqn\x0ElupalzpX3^-$*8!SLPWafbqhjgp*8~~nbqzwfmg+VH*rvbgyk9\n.pjy....sqls$*8\x0EojewW2:9uj`fbmgzgfaw=QPPsllomf`haoltW259gllqfuboW249ofwpebjolqbosloomlub`lopdfmf#\x0Elxplewqlnfwjooqlpp?k0=slvqebgfsjmh?wq=njmj*\x7F\"+njmfyk9\x04abqpkfbq33*8njoh#..=jqlmeqfggjphtfmwpljosvwp,ip,klozW119JPAMW139bgbnpffp?k1=iplm$/#$`lmwW129#QPPollsbpjbnllm?,s=plvoOJMFelqw`bqwW279?k2=;3s{\"..?:s{8W379njhf975Ymj`fjm`kZlqhqj`fyk9\b$**8svqfnbdfsbqbwlmfalmg904Y\\le\\$^*8333/yk9\x0Bwbmhzbqgaltoavpk965YIbub03s{\t\x7F~\t&@0&907YifeeF[SJ`bpkujpbdloepmltyk9\x05rvfq-`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~\x0E\tKFBGX3^*baaqivbm+2:;ofpkwtjm?,j=plmzdvzpev`hsjsf\x7F.\t\"331*mgltX2^8X^8\tOld#pbow\x0E\t\n\nabmdwqjnabwk*x\x0E\t33s{\t~*8hl9\0effpbg=\x0Ep9,,#X^8wloosovd+*x\tx\x0E\t#-ip$133sgvboalbw-ISD*8\t~rvlw*8\t\t$*8\t\x0E\t~\x0E1327132613251324132;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<[<\\<Q<\\<R<P=l<\\=l=o=n<\\<Q<Y<S<R<R=n<T<[<Q<R<X<R=n<R<Z<Y<R<Q<T=i<q<\\<Y<Y<]=g<P=g<~=g=m<R<^=g<^<R<q<R<R<]<s<R<W<T<Q<T<L<H<q<Y<p=g=n=g<r<Q<T<P<X<\\<{<\\<x<\\<q=o<r<]=n<Y<t<[<Y<U<Q=o<P<P<N=g=o<Z5m5f4O5j5i4K5i4U5o5h4O5d4]4C5f4K5m5e5k5d5h5i5h5o4K5d5h5k4D4_4K5h4I5j5k5f4O5f5n4C5k5h4G5i4D5k5h5d5h5f4D5h4K5f4D5o4X5f4K5i4O5i5j4F4D5f5h5j4A4D5k5i5i4X5d4Xejqpwujgflojdkwtlqognfgjbtkjwf`olpfaob`hqjdkwpnbooallhpsob`fnvpj`ejfoglqgfqsljmwubovfofufowbaofalbqgklvpfdqlvstlqhpzfbqppwbwfwlgbztbwfqpwbqwpwzofgfbwksltfqsklmfmjdkwfqqlqjmsvwbalvwwfqnpwjwofwllopfufmwol`bowjnfpobqdftlqgpdbnfppklqwpsb`fel`vp`ofbqnlgfoaol`hdvjgfqbgjlpkbqftlnfmbdbjmnlmfzjnbdfmbnfpzlvmdojmfpobwfq`lolqdqffmeqlmw%bns8tbw`kelq`fsqj`fqvofpafdjmbewfqujpjwjppvfbqfbpafoltjmgf{wlwboklvqpobafosqjmwsqfppavjowojmhppsffgpwvgzwqbgfelvmgpfmpfvmgfqpkltmelqnpqbmdfbggfgpwjoonlufgwbhfmbalufeobpkej{fglewfmlwkfqujftp`kf`hofdboqjufqjwfnprvj`hpkbsfkvnbmf{jpwdljmdnlujfwkjqgabpj`sfb`fpwbdftjgwkoldjmjgfbptqlwfsbdfpvpfqpgqjufpwlqfaqfbhplvwkulj`fpjwfpnlmwktkfqfavjogtkj`kfbqwkelqvnwkqffpslqwsbqwz@oj`holtfqojufp`obppobzfqfmwqzpwlqzvpbdfplvmg`lvqwzlvq#ajqwkslsvswzsfpbssozJnbdfafjmdvssfqmlwfpfufqzpkltpnfbmpf{wqbnbw`kwqb`hhmltmfbqozafdbmpvsfqsbsfqmlqwkofbqmdjufmmbnfgfmgfgWfqnpsbqwpDqlvsaqbmgvpjmdtlnbmebopfqfbgzbvgjlwbhfptkjof-`ln,ojufg`bpfpgbjoz`kjogdqfbwivgdfwklpfvmjwpmfufqaqlbg`lbpw`lufqbssofejofp`z`ofp`fmfsobmp`oj`htqjwfrvffmsjf`ffnbjoeqbnflogfqsklwlojnjw`b`kf`jujop`boffmwfqwkfnfwkfqfwlv`kalvmgqlzbobphfgtklofpjm`fpwl`h#mbnfebjwkkfbqwfnswzleefqp`lsfltmfgnjdkwboavnwkjmhaollgbqqbznbilqwqvpw`bmlmvmjlm`lvmwubojgpwlmfPwzofOldjmkbsszl``vqofew9eqfpkrvjwfejonpdqbgfmffgpvqabmejdkwabpjpklufqbvwl8qlvwf-kwnonj{fgejmboZlvq#pojgfwlsj`aqltmbolmfgqbtmpsojwqfb`kQjdkwgbwfpnbq`krvlwfdllgpOjmhpglvawbpzm`wkvnaboolt`kjfezlvwkmlufo23s{8pfqufvmwjokbmgp@kf`hPsb`frvfqzibnfpfrvbowtj`f3/333Pwbqwsbmfoplmdpqlvmgfjdkwpkjewtlqwkslpwpofbgptffhpbuljgwkfpfnjofpsobmfpnbqwboskbsobmwnbqhpqbwfpsobzp`objnpbofpwf{wppwbqptqlmd?,k0=wkjmd-lqd,nvowjkfbqgSltfqpwbmgwlhfmplojg+wkjpaqjmdpkjsppwbeewqjfg`boopevoozeb`wpbdfmwWkjp#,,..=bgnjmfdzswFufmw26s{8Fnbjowqvf!`qlpppsfmwaoldpal{!=mlwfgofbuf`kjmbpjyfpdvfpw?,k7=qlalwkfbuzwqvf/pfufmdqbmg`qjnfpjdmpbtbqfgbm`fskbpf=?\"..fm\\VP% 0:8133s{\\mbnfobwjmfmilzbib{-bwjlmpnjwkV-P-#klogpsfwfqjmgjbmbu!=`kbjmp`lqf`lnfpgljmdsqjlqPkbqf2::3pqlnbmojpwpibsbmeboopwqjboltmfqbdqff?,k1=bavpfbofqwlsfqb!.,,T`bqgpkjoopwfbnpSklwlwqvwk`ofbm-sks<pbjmwnfwboolvjpnfbmwsqlleaqjfeqlt!=dfmqfwqv`hollhpUbovfEqbnf-mfw,..=\t?wqz#x\tubq#nbhfp`lpwpsobjmbgvowrvfpwwqbjmobalqkfosp`bvpfnbdj`nlwlqwkfjq163s{ofbpwpwfsp@lvmw`lvogdobpppjgfpevmgpklwfobtbqgnlvwknlufpsbqjpdjufpgvw`kwf{bpeqvjwmvoo/\x7F\x7FX^8wls!=\t?\"..SLPW!l`fbm?aq,=eollqpsfbhgfswk#pjyfabmhp`bw`k`kbqw13s{8bojdmgfboptlvog63s{8vqo>!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\x0E\tabmgprvfvf>#x~8;3s{8`hjmdx\x0E\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*#\x7F\x7F#oftjppkboo 30:8#elq#olufgtbpwf33s{8ib9\x0Fnpjnlm?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*(-isd\x7Fpvjwfpoj`fkbqqz213!#ptffwwq=\x0E\tmbnf>gjfdlsbdf#ptjpp..=\t\t eee8!=Old-`ln!wqfbwpkffw*#%%#27s{8poffsmwfmwejofgib9\x0Fojg>!`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=\x0E\t?\"pwffo#zlv#k1=\x0E\telqn#ifpvp233&#nfmv-\x0E\t\n\x0E\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{\x7F`bmbgbbdfm`zp`kfnfqfnbjmAqbyjopbnsofoldl!=afzlmg.p`bofb``fswpfqufgnbqjmfEllwfq`bnfqb?,k2=\t\\elqn!ofbufppwqfpp!#,=\x0E\t-dje!#lmolbgolbgfqL{elqgpjpwfqpvqujuojpwfmefnbofGfpjdmpjyf>!bssfbowf{w!=ofufopwkbmhpkjdkfqelq`fgbmjnbobmzlmfBeqj`bbdqffgqf`fmwSflsof?aq#,=tlmgfqsqj`fpwvqmfg\x7F\x7F#x~8nbjm!=jmojmfpvmgbztqbs!=ebjofg`fmpvpnjmvwfafb`lmrvlwfp263s{\x7Ffpwbwfqfnlwffnbjo!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#\x7F\x7F#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=\x0Evpjmd#\t\nubq#=$*8\t\n?,wg=\t?,wq=\tabkbpbaqbpjodbofdlnbdzbqslophjpqsphj4]4C5d\bTA\nzk\x0BBl\bQ\x7F\x0BUm\x05Gx\bSM\nmC\bTA\twQ\nd}\bW@\bTl\bTF\ti@\tcT\x0BBM\x0B|j\x04BV\tqw\tcC\bWI\npa\tfM\n{Z\x05{X\bTF\bVV\bVK\t\x7Fm\x04kF\t[]\bPm\bTv\nsI\x0Bpg\t[I\bQp\x04mx\x0B_W\n^M\npe\x0BQ}\x0BGu\nel\npe\x04Ch\x04BV\bTA\tSo\nzk\x0BGL\x0BxD\nd[\x05Jz\x05MY\bQp\x04li\nfl\npC\x05{B\x05Nt\x0BwT\ti_\bTg\x04QQ\n|p\x0BXN\bQS\x0BxD\x04QC\bWZ\tpD\x0BVS\bTW\x05Nt\x04Yh\nzu\x04Kj\x05N}\twr\tHa\n_D\tj`\x0BQ}\x0BWp\nxZ\x04{c\tji\tBU\nbD\x04a|\tTn\tpV\nZd\nmC\x0BEV\x05{X\tc}\tTo\bWl\bUd\tIQ\tcg\x0Bxs\nXW\twR\x0Bek\tc}\t]y\tJn\nrp\neg\npV\nz\\\x05{W\npl\nz\\\nzU\tPc\t`{\bV@\nc|\bRw\ti_\bVb\nwX\tHv\x04Su\bTF\x0B_W\x0BWs\x0BsI\x05m\x7F\nTT\ndc\tUS\t}f\tiZ\bWz\tc}\x04MD\tBe\tiD\x0B@@\bTl\bPv\t}t\x04Sw\x04M`\x0BnU\tkW\x0Bed\nqo\x0BxY\tA|\bTz\x0By`\x04BR\x04BM\tia\x04XU\nyu\x04n^\tfL\tiI\nXW\tfD\bWz\bW@\tyj\t\x7Fm\tav\tBN\x0Bb\\\tpD\bTf\nY[\tJn\bQy\t[^\x0BWc\x0Byu\x04Dl\x04CJ\x0BWj\x0BHR\t`V\x0BuW\tQy\np@\x0BGu\x05pl\x04Jm\bW[\nLP\nxC\n`m\twQ\x05ui\x05\x7FR\nbI\twQ\tBZ\tWV\x04BR\npg\tcg\x05ti\x04CW\n_y\tRg\bQa\x0BQB\x0BWc\nYb\x05le\ngE\x04Su\nL[\tQ\x7F\tea\tdj\x0B]W\nb~\x04M`\twL\bTV\bVH\nt\x7F\npl\t|b\x05s_\bU|\bTa\x04oQ\x05lv\x04Sk\x04M`\bTv\x0BK}\nfl\tcC\x04oQ\x04BR\tHk\t|d\bQp\tHK\tBZ\x0BHR\bPv\x0BLx\x0BEZ\bT\x7F\bTv\tiD\x05oD\x05MU\x0BwB\x04Su\x05k`\x04St\ntC\tPl\tKg\noi\tjY\x0BxY\x04h}\nzk\bWZ\t\x7Fm\x0Be`\tTB\tfE\nzk\t`z\x04Yh\nV|\tHK\tAJ\tAJ\bUL\tp\\\tql\nYc\x04Kd\nfy\x04Yh\t[I\x0BDg\x04Jm\n]n\nlb\bUd\n{Z\tlu\tfs\x04oQ\bTW\x04Jm\x0BwB\tea\x04Yh\x04BC\tsb\tTn\nzU\n_y\x0BxY\tQ]\ngw\x04mt\tO\\\ntb\bWW\bQy\tmI\tV[\ny\\\naB\x0BRb\twQ\n]Q\x04QJ\bWg\x0BWa\bQj\ntC\bVH\nYm\x0Bxs\bVK\nel\bWI\x0BxY\x04Cq\ntR\x0BHV\bTl\bVw\tay\bQa\bVV\t}t\tdj\nr|\tp\\\twR\n{i\nTT\t[I\ti[\tAJ\x0Bxs\x0B_W\td{\x0BQ}\tcg\tTz\tA|\tCj\x0BLm\x05N}\x05m\x7F\nbK\tdZ\tp\\\t`V\tsV\np@\tiD\twQ\x0BQ}\bTf\x05ka\x04Jm\x0B@@\bV`\tzp\n@N\x04Sw\tiI\tcg\noi\x04Su\bVw\x04lo\x04Cy\tc}\x0Bb\\\tsU\x04BA\bWI\bTf\nxS\tVp\nd|\bTV\x0BbC\tNo\x05Ju\nTC\t|`\n{Z\tD]\bU|\tc}\x05lm\bTl\tBv\tPl\tc}\bQp\t\x7Fm\nLk\tkj\n@N\x04Sb\x04KO\tj_\tp\\\nzU\bTl\bTg\bWI\tcf\x04XO\bWW\ndz\x04li\tBN\nd[\bWO\x04MD\x0BKC\tdj\tI_\bVV\ny\\\x0BLm\x05xl\txB\tkV\x0Bb\\\x0BJW\x0BVS\tVx\x0BxD\td{\x04MD\bTa\t|`\x0BPz\x04R}\x0BWs\x04BM\nsI\x04CN\bTa\x04Jm\npe\ti_\npV\nrh\tRd\tHv\n~A\nxR\x0BWh\x0BWk\nxS\x0BAz\x0BwX\nbI\x04oQ\tfw\nqI\nV|\nun\x05z\x7F\x0Bpg\td\\\x0BoA\x05{D\ti_\x05xB\bT\x7F\t`V\x05qr\tTT\x04g]\x04CA\x0BuR\tVJ\tT`\npw\x0BRb\tI_\nCx\x04Ro\x0BsI\x04Cj\x04Kh\tBv\tWV\x04BB\x05oD\x05{D\nhc\x04Km\x0B^R\tQE\n{I\np@\nc|\x05Gt\tc}\x04Dl\nzU\x05qN\tsV\x05k}\tHh\x0B|j\nqo\x05u|\tQ]\x0Bek\x05\x7FZ\x04M`\x04St\npe\tdj\bVG\x0BeE\t\x7Fm\x0BWc\x04|I\n[W\tfL\bT\x7F\tBZ\x04Su\x0BKa\x04Cq\x05Nt\x04Y[\nqI\bTv\tfM\ti@\t}f\x04B\\\tQy\x0BBl\bWg\x04XD\x05kc\x0Bx[\bVV\tQ]\t\x7Fa\tPy\x0BxD\nfI\t}f\x05oD\tdj\tSG\x05ls\t~D\x04CN\n{Z\t\\v\n_D\nhc\x0Bx_\x04C[\tAJ\nLM\tVx\x04CI\tbj\tc^\tcF\ntC\x04Sx\twr\x04XA\bU\\\t|a\x0BK\\\bTV\bVj\nd|\tfs\x04CX\ntb\bRw\tVx\tAE\tA|\bT\x7F\x05Nt\x0BDg\tVc\bTl\x04d@\npo\t\x7FM\tcF\npe\tiZ\tBo\bSq\nfH\x04l`\bTx\bWf\tHE\x0BF{\tcO\tfD\nlm\x0BfZ\nlm\x0BeU\tdG\x04BH\bTV\tSi\x05MW\nwX\nz\\\t\\c\x04CX\nd}\tl}\bQp\bTV\tF~\bQ\x7F\t`i\ng@\x05nO\bUd\bTl\nL[\twQ\tji\ntC\t|J\nLU\naB\x0BxY\x04Kj\tAJ\x05uN\ti[\npe\x04Sk\x0BDg\x0Bx]\bVb\bVV\nea\tkV\nqI\bTa\x04Sk\nAO\tpD\ntb\nts\nyi\bVg\ti_\x0B_W\nLk\x05Nt\tyj\tfM\x04R\x7F\tiI\bTl\x0BwX\tsV\x0BMl\nyu\tAJ\bVj\x04KO\tWV\x0BA}\x0BW\x7F\nrp\tiD\x0B|o\x05lv\x0BsI\x04BM\td~\tCU\bVb\x04eV\npC\x0BwT\tj`\tc}\x0Bxs\x0Bps\x0Bvh\tWV\x0BGg\x0BAe\x0BVK\x0B]W\trg\x0BWc\x05F`\tBr\x0Bb\\\tdZ\bQp\nqI\x04kF\nLk\x0BAR\bWI\bTg\tbs\tdw\n{L\n_y\tiZ\bTA\tlg\bVV\bTl\tdk\n`k\ta{\ti_\x05{A\x05wj\twN\x0B@@\bTe\ti_\n_D\twL\nAH\x0BiK\x0Bek\n[]\tp_\tyj\bTv\tUS\t[r\n{I\nps\x05Gt\x0BVK\npl\x04S}\x0BWP\t|d\x04MD\x0BHV\bT\x7F\x04R}\x04M`\bTV\bVH\x05lv\x04Ch\bW[\x04Ke\tR{\x0B^R\tab\tBZ\tVA\tB`\nd|\nhs\x04Ke\tBe\x04Oi\tR{\td\\\x05nB\bWZ\tdZ\tVJ\x05Os\t\x7Fm\x04uQ\x0BhZ\x04Q@\x04QQ\nfI\bW[\x04B\\\x04li\nzU\nMd\x04M`\nxS\bVV\n\\}\x0BxD\t\x7Fm\bTp\x04IS\nc|\tkV\x05i~\tV{\x0BhZ\t|b\bWt\n@R\x0BoA\x0BnU\bWI\tea\tB`\tiD\tc}\tTz\x04BR\x0BQB\x05Nj\tCP\t[I\bTv\t`W\x05uN\x0Bpg\x0Bpg\x0BWc\tiT\tbs\twL\tU_\tc\\\t|h\x0BKa\tNr\tfL\nq|\nzu\nz\\\tNr\bUg\t|b\x04m`\bTv\nyd\nrp\bWf\tUX\x04BV\nzk\nd}\twQ\t}f\x04Ce\x0Bed\bTW\bSB\nxU\tcn\bTb\ne\x7F\ta\\\tSG\bU|\npV\nN\\\x04Kn\x0BnU\tAt\tpD\x0B^R\x0BIr\x04b[\tR{\tdE\x0BxD\x0BWK\x0BWA\bQL\bW@\x04Su\bUd\nDM\tPc\x04CA\x04Dl\x04oQ\tHs\x05wi\x04ub\n\x7Fa\bQp\x05Ob\nLP\bTl\x04Y[\x0BK}\tAJ\bQ\x7F\x04n^\x0BsA\bSM\nqM\bWZ\n^W\x0Bz{\x04S|\tfD\bVK\bTv\bPv\x04BB\tCP\x04dF\tid\x0Bxs\x04mx\x0Bws\tcC\ntC\tyc\x05M`\x0BW\x7F\nrh\bQp\x0BxD\x04\\o\nsI\x04_k\nzu\x04kF\tfD\x04Xs\x04XO\tjp\bTv\x04BS\x05{B\tBr\nzQ\nbI\tc{\x04BD\x04BV\x05nO\bTF\tca\x05Jd\tfL\tPV\tI_\nlK\x04`o\twX\npa\tgu\bP}\x05{^\bWf\n{I\tBN\npa\x04Kl\x0Bpg\tcn\tfL\x0Bvh\x04Cq\bTl\x0BnU\bSq\x04Cm\twR\bUJ\npe\nyd\nYg\x04Cy\x0BKW\tfD\nea\x04oQ\tj_\tBv\x04nM\x0BID\bTa\nzA\x05pl\n]n\bTa\tR{\tfr\n_y\bUg\x05{X\x05kk\x0BxD\x04|I\x05xl\nfy\x04Ce\x0BwB\nLk\x0Bd]\noi\n}h\tQ]\npe\bVw\x04Hk\x04OQ\nzk\tAJ\npV\bPv\ny\\\tA{\x04Oi\bSB\x04XA\x0BeE\tjp\nq}\tiD\x05qN\x0B^R\t\x7Fm\tiZ\tBr\bVg\noi\n\\X\tU_\nc|\x0BHV\bTf\tTn\x04\\N\x04\\N\nuB\x05lv\nyu\tTd\bTf\bPL\x0B]W\tdG\nA`\nw^\ngI\npe\tdw\nz\\\x05ia\bWZ\tcF\x04Jm\n{Z\bWO\x04_k\x04Df\x04RR\td\\\bVV\x0Bxs\x04BN\x05ti\x04lm\tTd\t]y\x0BHV\tSo\x0B|j\x04XX\tA|\x0BZ^\x0BGu\bTW\x05M`\x04kF\x0BhZ\x0BVK\tdG\x0BBl\tay\nxU\x05qE\x05nO\bVw\nqI\x04CX\ne\x7F\tPl\bWO\x0BLm\tdL\x05uH\x04Cm\tdT\x04fn\x0BwB\x05ka\x0BnU\n@M\nyT\tHv\t\\}\x04Kh\td~\x04Yh\x05k}\neR\td\\\bWI\t|b\tHK\tiD\bTW\x05MY\npl\bQ_\twr\x0BAx\tHE\bTg\bSq\x05vp\x0Bb\\\bWO\nOl\nsI\nfy\x0BID\t\\c\n{Z\n^~\npe\nAO\tTT\x0Bxv\x04k_\bWO\x0B|j\x0BwB\tQy\ti@\tPl\tHa\tdZ\x05k}\x04ra\tUT\x0BJc\x0Bed\np@\tQN\nd|\tkj\tHk\x04M`\noi\twr\td\\\nlq\no_\nlb\nL[\tac\x04BB\x04BH\x04Cm\npl\tIQ\bVK\x0Bxs\n`e\x0BiK\npa\x04Oi\tUS\bTp\tfD\nPG\x05kk\x04XA\nz\\\neg\x0BWh\twR\x05qN\nqS\tcn\x04lo\nxS\n^W\tBU\nt\x7F\tHE\tp\\\tfF\tfw\bVV\bW@\tak\x0BVK\x05ls\tVJ\bVV\x0BeE\x04\\o\nyX\nYm\x04M`\x05lL\nd|\nzk\tA{\x05sE\twQ\x04XT\nt\x7F\tPl\t]y\x0BwT\x05{p\x04MD\x0Bb\\\tQ]\x04Kj\tJn\nAH\x0BRb\tBU\tHK\t\\c\nfI\x05m\x7F\nqM\n@R\tSo\noi\x04BT\tHv\n_y\x04Kh\tBZ\t]i\bUJ\tV{\x04Sr\nbI\x0BGg\ta_\bTR\nfI\nfl\t[K\tII\x04S|\x0BuW\tiI\bWI\nqI\x0B|j\x04BV\bVg\bWZ\x04kF\x0Bx]\bTA\tab\tfr\ti@\tJd\tJd\x0Bps\nAO\bTa\x05xu\tiD\nzk\t|d\t|`\bW[\tlP\tdG\bVV\x0Bw}\x0BqO\ti[\bQ\x7F\bTz\x0BVF\twN\x05ts\tdw\bTv\neS\ngi\tNr\x05yS\npe\bVV\bSq\n`m\tyj\tBZ\x0BWX\bSB\tc\\\nUR\t[J\tc_\x04nM\bWQ\x0BAx\nMd\tBr\x05ui\x0BxY\bSM\x0BWc\x0B|j\x0Bxs\t}Q\tBO\bPL\bWW\tfM\nAO\tPc\x0BeU\x04e^\bTg\nqI\tac\bPv\tcF\x04oQ\tQ\x7F\x0BhZ\x05ka\nz\\\tiK\tBU\n`k\tCP\x04S|\x04M`\n{I\tS{\x04_O\tBZ\x04Zi\x04Sk\tps\tp\\\nYu\n]s\nxC\bWt\nbD\tkV\x0BGu\x05yS\nqA\t[r\neK\x04M`\tdZ\x05lL\bUg\bTl\nbD\tUS\x0Bb\\\tpV\ncc\x04S\\\tct\t`z\bPL\x0BWs\nA`\neg\bSq\x05uE\x04CR\x0BDg\t`W\x0Bz{\x0BWc\x04Sk\x04Sk\tbW\bUg\tea\nxZ\tiI\tUX\tVJ\nqn\tS{\x0BRb\bTQ\npl\x05Gt\x0BuW\x05uj\npF\nqI\tfL\t[I\tia\x04XO\nyu\x0BDg\x0Bed\tq{\x04VG\bQ\x7F\x05ka\tVj\tkV\txB\nd|\np@\tQN\tPc\tps\x04]j\tkV\toU\bTp\nzU\x05nB\x0BB]\ta{\bV@\n]n\x04m`\tcz\tR{\x04m`\bQa\x0BwT\bSM\x05MY\x05qN\tdj\x05~s\x0BQ}\x05MY\x0BMB\tBv\twR\bRg\x0BQ}\tql\x0BKC\nrm\x05xu\x04CC\x0BwB\x0Bvh\tBq\x04Xq\npV\ti_\x05Ob\x05uE\nbd\nqo\x0B{i\nC~\tBL\x0BeE\x05uH\bVj\x04Ey\x04Gz\x0BzR\x0B{i\tcf\n{Z\n]n\x04XA\x0BGu\x0BnU\thS\x0BGI\nCc\tHE\bTA\tHB\x04BH\x04Cj\nCc\bTF\tHE\nXI\tA{\bQ\x7F\tc\\\x0BmO\x0BWX\nfH\np@\x05MY\bTF\nlK\tBt\nzU\tTT\x04Km\x0BwT\npV\ndt\x0ByI\tVx\tQ\x7F\tRg\tTd\nzU\bRS\nLM\twA\x04nM\tTn\ndS\t]g\nLc\x0BwB\t}t\t[I\tCP\x04kX\x0BFm\x0BhZ\x05m\x7F\ti[\np@\x0BQ}\x0BW\x7F\t|d\nMO\nMd\tf_\tfD\tcJ\tHz\x0BRb\tio\tPy\x04Y[\nxU\tct\x0B@@\tww\bPv\x04BM\x04FF\ntb\x05v|\x0BKm\tBq\tBq\x04Kh\x04`o\nZd\x04XU\ti]\t|`\tSt\x04B\\\bQ\x7F\x0B_W\tTJ\nqI\t|a\tA{\x0BuP\x04MD\tPl\nxR\tfL\x0Bws\tc{\td\\\bV`\neg\tHK\x05kc\nd|\bVV\ny\\\x05kc\ti]\bVG\t`V\tss\tI_\tAE\tbs\tdu\nel\tpD\x0BW\x7F\nqs\x05lv\bSM\x04Zi\x0BVK\x05ia\x0BQB\tQ\x7F\n{Z\bPt\x0BKl\nlK\nhs\ndS\bVK\x05mf\nd^\tkV\tcO\nc|\bVH\t\\]\bTv\bSq\tmI\x0BDg\tVJ\tcn\ny\\\bVg\bTv\nyX\bTF\t]]\bTp\noi\nhs\x0BeU\nBf\tdj\x05Mr\n|p\t\\g\t]r\bVb\x05{D\nd[\x04XN\tfM\tO\\\x05s_\tcf\tiZ\x04XN\x0BWc\tqv\n`m\tU^\x05oD\nd|\x0BGg\tdE\x0Bwf\x04lo\x04u}\nd|\x05oQ\t`i\x04Oi\x0BxD\ndZ\nCx\x04Yw\nzk\ntb\ngw\tyj\tB`\nyX\x0Bps\ntC\x0BpP\x0Bqw\bPu\bPX\tDm\npw\x05Nj\tss\taG\x0Bxs\bPt\noL\x04Gz\tOk\ti@\ti]\x04eC\tIQ\tii\tdj\x0B@J\t|d\x05uh\bWZ\x0BeU\x0BnU\bTa\tcC\x04g]\nzk\x04Yh\bVK\nLU\np@\ntb\ntR\tCj\x0BNP\ti@\bP{\n\\}\n{c\nwX\tfL\bVG\tc{\t|`\tAJ\t|C\tfD\x05ln\t|d\tbs\nqI\x05{B\x0BAx\np@\nzk\x0BRb\x05Os\x0BWS\x04e^\x0BD_\tBv\x0BWd\bVb\x0Bxs\x0BeE\bRw\n]n\n|p\x0Bg|\tfw\x05kc\bTI\x05ka\n\\T\x04Sp\tju\x0Bps\npe\x05u|\x0BGr\bVe\tCU\x04]M\x04XU\x0BxD\bTa\tIQ\x0BWq\tCU\tam\tdj\bSo\x04Sw\x0BnU\x04Ch\tQ]\x05s_\bPt\tfS\bTa\t\\}\n@O\x04Yc\tUZ\bTx\npe\x0BnU\nzU\t|}\tiD\nz\\\bSM\x0BxD\x04BR\nzQ\tQN\x04]M\x04Yh\nLP\x0BFm\x0BLX\x05vc\x0Bql\x05ka\tHK\bVb\ntC\nCy\bTv\nuV\x04oQ\t`z\t[I\tB`\x0BRb\tyj\tsb\x0BWs\bTl\tkV\x0Bed\ne\x7F\x05lL\x0BxN\t\x7Fm\nJn\tjY\x0BxD\bVb\bSq\x0Byu\twL\x0BXL\bTA\tpg\tAt\tnD\x04XX\twR\npl\nhw\x05yS\nps\tcO\bW[\x0B|j\x04XN\tsV\tp\\\tBe\nb~\nAJ\n]e\x05k`\x05qN\tdw\tWV\tHE\x0BEV\x05Jz\tid\tB`\tzh\x05E]\tfD\bTg\x05qN\bTa\tja\x04Cv\bSM\nhc\bUe\x05t_\tie\x04g]\twQ\nPn\bVB\tjw\bVg\x0BbE\tBZ\x0BRH\bP{\tjp\n\\}\ta_\tcC\t|a\x0BD]\tBZ\ti[\tfD\x0BxW\no_\td\\\n_D\ntb\t\\c\tAJ\nlK\x04oQ\x04lo\x0BLx\x0BM@\bWZ\x04Kn\x0Bpg\nTi\nIv\n|r\x0B@}\x05Jz\x05Lm\x05Wh\x05k}\x05ln\x0BxD\n]s\x04gc\x0Bps\tBr\bTW\x0BBM\x05tZ\nBY\x04DW\tjf\x0BSW\x04C}\nqo\tdE\tmv\tIQ\bPP\bUb\x05lv\x04BC\nzQ\t[I\x0Bgl\nig\bUs\x04BT\x0BbC\bSq\tsU\tiW\nJn\tSY\tHK\trg\npV\x0BID\x0B|j\x04KO\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`qfbgl<X<W=c=k=n<R<V<\\<V<T<W<T=a=n<R<^=m<Y<Y<_<R<S=l<T=n<\\<V<Y=e<Y=o<Z<Y<v<\\<V<]<Y<[<]=g<W<R<Q<T<~=m<Y<S<R<X<A=n<R=n<R<P=k<Y<P<Q<Y=n<W<Y=n=l<\\<[<R<Q<\\<_<X<Y<P<Q<Y<x<W=c<s=l<T<Q<\\=m<Q<T=i=n<Y<P<V=n<R<_<R<X<^<R=n=n<\\<P<M<D<|<P<\\=c<K=n<R<^<\\=m<^<\\<P<Y<P=o<N<\\<V<X<^<\\<Q<\\<P=a=n<T=a=n=o<~<\\<P=n<Y=i<S=l<R=n=o=n<Q<\\<X<X<Q=c<~<R=n=n=l<T<Q<Y<U<~<\\=m<Q<T<P=m<\\<P=n<R=n=l=o<]<r<Q<T<P<T=l<Q<Y<Y<r<r<r<W<T=j=a=n<\\<r<Q<\\<Q<Y<P<X<R<P<P<R<U<X<^<Y<R<Q<R=m=o<X\fHy\fIk\fHU\fId\fHy\fIl\fHT\fIk\fHy\fHR\fHy\fIg\fHx\fH\\\fHF\fH\\\fHD\fIk\fHc\fHy\fHy\fHS\fHA\fIl\fHk\fHT\fHy\fH\\\fHH\fIg\fHU\fIg\fHj\fHF\fHU\fIl\fHC\fHU\fHC\fHR\fHH\fHy\fHI\fHRibdqbm\fHj\fHp\fHp\fIg\fHi\fH@\fHJ\fIg\fH{\fHd\fHp\fHR\fH{\fHc\fHU\fHB\fHk\fHD\fHY\fHU\fHC\fIk\fHI\fIk\fHI\fIl\fHt\fH\\\fHp\fH@\fHJ\fIl\fHy\fHd\fHp\fIl\fHY\fIk\fHD\fHd\fHD\fHc\fHU\fH\\\fHe\fHT\fHB\fIk\fHy\fHB\fHY\fIg\fH^\fIk\fHT\fH@\fHB\fHd\fHJ\fIk\fH\x7F\fH\\\fHj\fHB\fH@\fHT\fHA\fH\\\fH@\fHD\fHv\fH^\fHB\fHD\fHj\fH{\fHT\fIl\fH^\fIl4U5h5e4I5h5e5k4\\4K4N4B4]4U4C4C4K5h5e5k4\\5k4Y5d4]4V5f4]5o4K5j5d5h4K4D5f5j4U4]4Z4\\5h5o5k5j4K5f5d5i5n4K5h4U5h5f4K5j4K5h5o5j4A4F5e5n4D5h5d4A4E4K4B4]5m5n4[4U4D4C4]5o5j4I4\\4K5o5i4K4K4A4C4I5h4K5m5f5k4D4U4Z5o5f5m4D4A4G5d5i5j5d5k5d4O5j4K4@4C4K5h5k4K4_5h5i4U5j4C5h5f4_4U4D4]4Y5h5e5i5j4\\4D5k4K4O5j5k5i4G5h5o5j4F4K5h4K4A5f4G5i4Y4]4X4]4A4A5d5h5d5m5f4K4\\4K5h5o5h5i4]4E4K5j4F4K5h5m4O4D5d4B4K4Y4O5j4F4K5j5k4K5h5f4U4Z5d5d5n4C4K4D5j4B5f4]4D5j4F5h5o5i4X4K4M5d5k5f4K4D5d5n4Y4Y5d5i4K4]5n5i4O4A4C5j4A5j4U4C5i4]4O5f4K4A4E5o4F4D4C5d5j5f4@4D5i5j5k4F4A4F4@5k4E4_5j4E5f4F5i5o4]4E4V4^4E5j5m4_4D5f4F5h5h5k5h5j4K4F5h5o5n5h4D5h5i4K4U5j5k4O5d5h4X5f4M5j5d4]4O5i4K5m5f5o4D5o5h4\\4K4F4]4F4D4D4O5j5k5i4_4K5j5o4D5f4U5m5n4C4A4_5j5h5k5i4X4U4]4O5k5h4X5k4]5n4[4]4[5h4Dsqlejofpfquj`fgfebvowkjnpfoegfwbjop`lmwfmwpvsslqwpwbqwfgnfppbdfpv``fppebpkjlm?wjwof=`lvmwqzb``lvmw`qfbwfgpwlqjfpqfpvowpqvmmjmdsql`fpptqjwjmdlaif`wpujpjaoftfo`lnfbqwj`ofvmhmltmmfwtlqh`lnsbmzgzmbnj`aqltpfqsqjub`zsqlaofnPfquj`fqfpsf`wgjpsobzqfrvfpwqfpfquftfapjwfkjpwlqzeqjfmgplswjlmptlqhjmdufqpjlmnjoojlm`kbmmfotjmglt-bggqfppujpjwfgtfbwkfq`lqqf`wsqlgv`wfgjqf`welqtbqgzlv#`bmqfnlufgpvaif`w`lmwqlobq`kjuf`vqqfmwqfbgjmdojaqbqzojnjwfgnbmbdfqevqwkfqpvnnbqznb`kjmfnjmvwfpsqjubwf`lmwf{wsqldqbnpl`jfwzmvnafqptqjwwfmfmbaofgwqjddfqplvq`fpolbgjmdfofnfmwsbqwmfqejmboozsfqef`wnfbmjmdpzpwfnphffsjmd`vowvqf%rvlw8/ilvqmbosqlif`wpvqeb`fp%rvlw8f{sjqfpqfujftpabobm`fFmdojpk@lmwfmwwkqlvdkSofbpf#lsjmjlm`lmwb`wbufqbdfsqjnbqzujoobdfPsbmjpkdboofqzgf`ojmfnffwjmdnjppjlmslsvobqrvbojwznfbpvqfdfmfqbopsf`jfppfppjlmpf`wjlmtqjwfqp`lvmwfqjmjwjboqfslqwpejdvqfpnfnafqpklogjmdgjpsvwffbqojfqf{sqfppgjdjwbosj`wvqfBmlwkfqnbqqjfgwqbeej`ofbgjmd`kbmdfg`fmwqbouj`wlqzjnbdfp,qfbplmppwvgjfpefbwvqfojpwjmdnvpw#afp`kllopUfqpjlmvpvboozfsjplgfsobzjmddqltjmdlaujlvplufqobzsqfpfmwb`wjlmp?,vo=\x0E\ttqbssfqboqfbgz`fqwbjmqfbojwzpwlqbdfbmlwkfqgfphwlsleefqfgsbwwfqmvmvpvboGjdjwbo`bsjwboTfapjwfebjovqf`lmmf`wqfgv`fgBmgqljggf`bgfpqfdvobq#%bns8#bmjnbopqfofbpfBvwlnbwdfwwjmdnfwklgpmlwkjmdSlsvobq`bswjlmofwwfqp`bswvqfp`jfm`foj`fmpf`kbmdfpFmdobmg>2%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\x0E\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=\x0E\tNlgfqm#sqlujgf!#bow>!alqgfqp-\t\tElq#\t\tNbmz#bqwjpwpsltfqfgsfqelqnej`wjlmwzsf#lenfgj`bowj`hfwplsslpfg@lvm`jotjwmfppivpwj`fDflqdf#Afodjvn---?,b=wtjwwfqmlwbaoztbjwjmdtbqebqf#Lwkfq#qbmhjmdskqbpfpnfmwjlmpvqujufp`klobq?,s=\x0E\t#@lvmwqzjdmlqfgolpp#leivpw#bpDflqdjbpwqbmdf?kfbg=?pwlssfg2$^*8\x0E\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=\x0E\t`lolq9 vo#jg>!slppfppqloojmdskzpj`pebjojmdf{f`vwf`lmwfpwojmh#wlGfebvow?aq#,=\t9#wqvf/`kbqwfqwlvqjpn`obppj`sql`ffgf{sobjm?,k2=\x0E\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+\x7F\x7F#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`ovpwfqsks<jg>bo`lklo*8~*+*8vpjmd#b=?psbm=ufppfopqfujuboBggqfppbnbwfvqbmgqljgboofdfgjoomfpptbohjmd`fmwfqprvbojeznbw`kfpvmjejfgf{wjm`wGfefmpfgjfg#jm\t\n?\"..#`vpwlnpojmhjmdOjwwof#Allh#lefufmjmdnjm-ip<bqf#wkfhlmwbhwwlgbz$p-kwno!#wbqdfw>tfbqjmdBoo#Qjd8\t~*+*8qbjpjmd#Bopl/#`qv`jbobalvw!=gf`obqf..=\t?p`ejqfel{bp#nv`kbssojfpjmgf{/#p/#avw#wzsf#>#\t\x0E\t?\"..wltbqgpQf`lqgpSqjubwfElqfjdmSqfnjfq`klj`fpUjqwvboqfwvqmp@lnnfmwSltfqfgjmojmf8slufqwz`kbnafqOjujmd#ulovnfpBmwklmzoldjm!#QfobwfgF`lmlnzqfb`kfp`vwwjmddqbujwzojef#jm@kbswfq.pkbgltMlwbaof?,wg=\x0E\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#`bqqjfp\x7F\x7Fx~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=\x0E\t##bwwfnswsbjq#lenbhf#jwHlmwbhwBmwlmjlkbujmd#qbwjmdp#b`wjufpwqfbnpwqbssfg!*-`pp+klpwjofofbg#wlojwwof#dqlvsp/Sj`wvqf..=\x0E\t\x0E\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\x0E\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\x0E\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!=\x0E\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#,=\x0E\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#=\x0E\t\x0E\t\x0E\tnbqhfw-kjdktbzglmf#jm`wjujwz!obpw!=laojdfgqjpf#wl!vmgfejnbgf#wl#Fbqoz#sqbjpfgjm#jwp#elq#kjpbwkofwfIvsjwfqZbkll\"#wfqnfg#pl#nbmzqfbooz#p-#Wkf#b#tlnbm<ubovf>gjqf`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=\x0E\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=\x0E\t?vpwlnUb8%dw8?,jnslqwplq#wkbwnlpwoz#%bns8qf#pjyf>!?,b=?,kb#`obppsbppjufKlpw#>#TkfwkfqefqwjofUbqjlvp>X^8+ev`bnfqbp,=?,wg=b`wp#bpJm#plnf=\x0E\t\x0E\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=\x0E\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#,=\x0E\t\\slsvsp\x7Fp`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=\x0E\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+\x0BBl\bQ\x7F*+\x0BUm\x05Gx*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<_<R<X<\\<Y=m<W<T<Y=m=n=`<]=g<W<R<]=g=n=`=a=n<R<P<y=m<W<T=n<R<_<R<P<Y<Q=c<^=m<Y=i=a=n<R<U<X<\\<Z<Y<]=g<W<T<_<R<X=o<X<Y<Q=`=a=n<R=n<]=g<W<\\=m<Y<]=c<R<X<T<Q=m<Y<]<Y<Q<\\<X<R=m<\\<U=n=h<R=n<R<Q<Y<_<R=m<^<R<T=m<^<R<U<T<_=l=g=n<R<Z<Y<^=m<Y<P=m<^<R=b<W<T=d=`=a=n<T=i<S<R<V<\\<X<Q<Y<U<X<R<P<\\<P<T=l<\\<W<T<]<R=n<Y<P=o=i<R=n=c<X<^=o=i=m<Y=n<T<W=b<X<T<X<Y<W<R<P<T=l<Y=n<Y<]=c=m<^<R<Y<^<T<X<Y=k<Y<_<R=a=n<T<P=m=k<Y=n=n<Y<P=g=j<Y<Q=g=m=n<\\<W<^<Y<X=`=n<Y<P<Y<^<R<X=g=n<Y<]<Y<^=g=d<Y<Q<\\<P<T=n<T<S<\\=n<R<P=o<S=l<\\<^<W<T=j<\\<R<X<Q<\\<_<R<X=g<[<Q<\\=b<P<R<_=o<X=l=o<_<^=m<Y<U<T<X<Y=n<V<T<Q<R<R<X<Q<R<X<Y<W<\\<X<Y<W<Y=m=l<R<V<T=b<Q=c<^<Y=m=`<y=m=n=`=l<\\<[<\\<Q<\\=d<T4K5h5h5k4K5h4F5f4@5i5f4U4B4K4Y4E4K5h4\\5f4U5h5f5k4@4C5f4C4K5h4N5j4K5h4]4C4F4A5o5i4Y5m4A4E5o4K5j4F4K5h5h5f5f5o5d5j4X4D5o4E5m5f5k4K4D5j4K4F4A5d4K4M4O5o4G4]4B5h4K5h4K5h4A4D4C5h5f5h4C4]5d4_4K4Z4V4[4F5o5d5j5k5j4K5o4_4K4A4E5j4K4C5f4K5h4[4D4U5h5f5o4X5o4]4K5f5i5o5j5i5j5k4K4X4]5o4E4]4J5f4_5j4X5f4[5i4K4\\4K4K5h5m5j4X4D4K4D4F4U4D4]4]4A5i4E5o4K5m4E5f5n5d5h5i4]5o4^5o5h5i4E4O4A5i4C5n5h4D5f5f4U5j5f4Y5d4]4E4[4]5f5n4X4K4]5o4@5d4K5h4O4B4]5e5i4U5j4K4K4D4A4G4U4]5d4Z4D4X5o5h5i4_4@5h4D5j4K5j4B4K5h4C5o4F4K4D5o5h5f4E4D4C5d5j4O5f4Z4K5f5d4@4C5m4]5f5n5o4F4D4F4O5m4Z5h5i4[4D4B4K5o4G4]4D4K4]5o4K5m4Z5h4K4A5h5e5j5m4_5k4O5f4K5i4]4C5d4C4O5j5k4K4C5f5j4K4K5h4K5j5i4U4]4Z4F4U5h5i4C4K4B5h5i5i5o5j\x03\x03\x03\x03\x03\x03\x03\x03\x02\x03\x02\x03\x02\x03\x02\x03\x01\x03\x01\x03\x01\x03\x01\x03\x07\x03\x07\x03\x07\x03\x07\x03\x03\x02\x01\0\x07\x06\x05\x04\x04\x05\x06\x07\0\x01\x02\x03\x0B\n\t\b\x0F\x0E\r\f\f\r\x0E\x0F\b\t\n\x0B\x13\x12\x11\x10\x17\x16\x15\x14\x14\x15\x16\x17\x10\x11\x12\x13\x1B\x1A\x19\x18\x1F\x1E\x1D\x1C\x1C\x1D\x1E\x1F\x18\x19\x1A\x1B\x13\x13\x13\x13\x03\x03\x03\x03\x03\x03\x03\x03\x13\x13\x13\x13\x02\x03\x03\x03\x01\x03\x03\x03\x01\x03\x03\x03\x02\x03\x03\x03\x02\x03\x03\x03\0\x03\x03\x03\x13\x13\x03\x02\x03\x03\x03\x02\x03\x03\x13\x13\x03\x02\x03\x03\x03\x0B\x03\x0B\x03\x0B\x03\x0B\x03\x03\x03\x02\x03\x01\x03\0\x03\x07\x03\x06\x03\x05\x03\x04qfplvq`fp`lvmwqjfprvfpwjlmpfrvjsnfmw`lnnvmjwzbubjobaofkjdkojdkwGWG,{kwnonbqhfwjmdhmltofgdfplnfwkjmd`lmwbjmfqgjqf`wjlmpvap`qjafbgufqwjpf`kbqb`wfq!#ubovf>!?,pfof`w=Bvpwqbojb!#`obpp>!pjwvbwjlmbvwklqjwzelooltjmdsqjnbqjozlsfqbwjlm`kboofmdfgfufolsfgbmlmznlvpevm`wjlm#evm`wjlmp`lnsbmjfppwqv`wvqfbdqffnfmw!#wjwof>!slwfmwjbofgv`bwjlmbqdvnfmwppf`lmgbqz`lszqjdkwobmdvbdfpf{`ovpjuf`lmgjwjlm?,elqn=\x0E\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..=\x0E\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!=\x0E\tqfpjgfm`fofbuf#wkf`lmwfmw!=bqf#lewfm##~*+*8\x0E\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{\x7Fqjdknbgf#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\x0E\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@\x04Fr\x0BBl\bQ\x7F\tA{\x0BUm\x05Gx\tA{\x01yp\x06YA\0zX\bTV\bWl\bUd\x04BM\x0BB{\npV\x0B@x\x04B\\\np@\x04Db\x04Gz\tal\npa\tfM\tuD\bV~\x04mx\x0BQ}\ndS\tp\\\bVK\bS]\bU|\x05oD\tkV\x0Bed\x0BHR\nb~\x04M`\nJp\x05oD\x04|Q\nLP\x04Sw\bTl\nAI\nxC\bWt\tBq\x05F`\x04Cm\x0BLm\tKx\t}t\bPv\ny\\\naB\tV\x7F\nZd\x04XU\x04li\tfr\ti@\tBH\x04BD\x04BV\t`V\n[]\tp_\tTn\n~A\nxR\tuD\t`{\bV@\tTn\tHK\tAJ\x0Bxs\x04Zf\nqI\x04Zf\x0BBM\x0B|j\t}t\bSM\nmC\x0BQ}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=\x0E\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=\x0E\tbaplovwf8#pvsslqwjmdf{wqfnfoz#nbjmpwqfbn?,pwqlmd=#slsvobqjwzfnsolznfmw?,wbaof=\x0E\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\x0E\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=\x0E\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..=\x0E\t?gju#?ejfogpfw=Bq`kajpkls#`obpp>!mlafjmd#vpfgbssqlb`kfpsqjujofdfpmlp`qjsw=\tqfpvowp#jmnbz#af#wkfFbpwfq#fddnf`kbmjpnpqfbplmbaofSlsvobwjlm@loof`wjlmpfof`wfg!=mlp`qjsw=\x0E,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<?,avwwlm=\tsfq`fmwbdfafpw.hmltm`qfbwjmd#b!#gjq>!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!=\x0E?p`qjsw=+ewvqmfg#lvwkbujmd#wkf?,psbm=\x0E\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<P<R<Z<Q<R<]=o<X<Y=n<P<R<Z<Y=n<^=l<Y<P=c=n<\\<V<Z<Y=k=n<R<]=g<]<R<W<Y<Y<R=k<Y<Q=`=a=n<R<_<R<V<R<_<X<\\<S<R=m<W<Y<^=m<Y<_<R=m<\\<U=n<Y=k<Y=l<Y<[<P<R<_=o=n=m<\\<U=n<\\<Z<T<[<Q<T<P<Y<Z<X=o<]=o<X=o=n<s<R<T=m<V<[<X<Y=m=`<^<T<X<Y<R=m<^=c<[<T<Q=o<Z<Q<R=m<^<R<Y<U<W=b<X<Y<U<S<R=l<Q<R<P<Q<R<_<R<X<Y=n<Y<U=m<^<R<T=i<S=l<\\<^<\\=n<\\<V<R<U<P<Y=m=n<R<T<P<Y<Y=n<Z<T<[<Q=`<R<X<Q<R<U<W=o=k=d<Y<S<Y=l<Y<X=k<\\=m=n<T=k<\\=m=n=`=l<\\<]<R=n<Q<R<^=g=i<S=l<\\<^<R=m<R<]<R<U<S<R=n<R<P<P<Y<Q<Y<Y=k<T=m<W<Y<Q<R<^=g<Y=o=m<W=o<_<R<V<R<W<R<Q<\\<[<\\<X=n<\\<V<R<Y=n<R<_<X<\\<S<R=k=n<T<s<R=m<W<Y=n<\\<V<T<Y<Q<R<^=g<U=m=n<R<T=n=n<\\<V<T=i=m=l<\\<[=o<M<\\<Q<V=n=h<R=l=o<P<v<R<_<X<\\<V<Q<T<_<T=m<W<R<^<\\<Q<\\=d<Y<U<Q<\\<U=n<T=m<^<R<T<P=m<^=c<[=`<W=b<]<R<U=k<\\=m=n<R=m=l<Y<X<T<v=l<R<P<Y<H<R=l=o<P=l=g<Q<V<Y=m=n<\\<W<T<S<R<T=m<V=n=g=m=c=k<P<Y=m=c=j=j<Y<Q=n=l=n=l=o<X<\\=m<\\<P=g=i=l=g<Q<V<\\<q<R<^=g<U=k<\\=m<R<^<P<Y=m=n<\\=h<T<W=`<P<P<\\=l=n<\\=m=n=l<\\<Q<P<Y=m=n<Y=n<Y<V=m=n<Q<\\=d<T=i<P<T<Q=o=n<T<P<Y<Q<T<T<P<Y=b=n<Q<R<P<Y=l<_<R=l<R<X=m<\\<P<R<P=a=n<R<P=o<V<R<Q=j<Y=m<^<R<Y<P<V<\\<V<R<U<|=l=i<T<^5i5j4F4C5e4I4]4_4K5h4]4_4K5h4E4K5h4U4K5i5o4F4D5k4K4D4]4K5i4@4K5h5f5d5i4K5h4Y5d4]4@4C5f4C4E4K5h4U4Z5d4I4Z4K5m4E4K5h5n4_5i4K5h4U4K4D4F4A5i5f5h5i5h5m4K4F5i5h4F5n5e4F4U4C5f5h4K5h4X4U4]4O4B4D4K4]4F4[5d5f4]4U5h5f5o5i4I4]5m4K5n4[5h4D4K4F4K5h5h4V4E4F4]4F5f4D4K5h5j4K4_4K5h4X5f4B5i5j4F4C5f4K5h4U4]4D4K5h5n4Y4Y4K5m5h4K5i4U5h5f5k4K4F4A4C5f4G4K5h5h5k5i4K5h4U5i5h5i5o4F4D4E5f5i5o5j5o4K5h4[5m5h5m5f4C5f5d4I4C4K4]4E4F4K4]5f4B4K5h4Y4A4E4F4_4@5f5h4K5h5d5n4F4U5j4C5i4K5i4C5f5j4E4F4Y5i5f5i4O4]4X5f5m4K5h4\\5f5j4U4]4D5f4E4D5d4K4D4E4O5h4U4K4D4K5h4_5m4]5i4X4K5o5h4F4U4K5h5e4K5h4O5d5h4K5h4_5j4E4@4K5i4U4E4K5h4Y4A5m4K5h4C5f5j5o5h5i4K4F4K5h4B4K4Y4K5h5i5h5m4O4U4Z4K4M5o4F4K4D4E4K5h4B5f4]4]4_4K4J5h4K5h5n5h4D4K5h4O4C4D5i5n4K4[4U5i4]4K4_5h5i5j4[5n4E4K5h5o4F4D4K5h4]4@5h4K4X4F4]5o4K5h5n4C5i5f4U4[5f5opAzWbdMbnf+-isd!#bow>!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-ISD\x7Fwkvna\x7Fsbqwj`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\x0E\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\x0E\t?kfbg=\x0E\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=\x0E\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<qfnbjmfg#jmwqbmpelqnfgKf#tbp#bopltbp#boqfbgzpwbwjpwj`bojm#ebulq#leNjmjpwqz#lenlufnfmw#leelqnvobwjlmjp#qfrvjqfg?ojmh#qfo>!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\x0E\t?,kfbg=\x0E\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\x0E\t\n?,gju=\x0E\t\x0E\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=\x0E\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#\x7Fpklqw#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!=\x0E\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=\x0E\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#=\x0E\t?kfbg=\x0E\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=\x0Epbjg#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=\x0E\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(\x7F_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*<p<R<Q<_<R<W<M=l<S=m<V<T=m=l<S=m<V<T=m=l<S=m<V<R5h4U4]4D5f4E\nAO\x05Gx\bTA\nzk\x0BBl\bQ\x7F\bTA\nzk\x0BUm\bQ\x7F\bTA\nzk\npe\x05u|\ti@\tcT\bVV\n\\}\nxS\tVp\x05tS\x05k`\t[X\t[X\x0BHR\bPv\bTW\bUe\n\x7Fa\bQp\x0B_W\x0BWs\nxS\x0BAz\n_y\x04Khjmelqnb`j/_mkfqqbnjfmwbpfof`wq/_mj`lgfp`qjs`j/_m`obpjej`bglp`lml`jnjfmwlsvaoj`b`j/_mqfob`jlmbgbpjmelqn/Mwj`bqfob`jlmbglpgfsbqwbnfmwlwqbabibglqfpgjqf`wbnfmwfbzvmwbnjfmwlnfq`bglOjaqf`lmw/M`wfmlpkbajwb`jlmfp`vnsojnjfmwlqfpwbvqbmwfpgjpslpj`j/_m`lmpf`vfm`jbfof`wq/_mj`bbsoj`b`jlmfpgfp`lmf`wbgljmpwbob`j/_mqfbojyb`j/_mvwjojyb`j/_mfm`j`olsfgjbfmefqnfgbgfpjmpwqvnfmwlpf{sfqjfm`jbpjmpwjwv`j/_msbqwj`vobqfppva`bwfdlqjb=n<R<W=`<V<R<L<R=m=m<T<T=l<\\<]<R=n=g<]<R<W=`=d<Y<S=l<R=m=n<R<P<R<Z<Y=n<Y<X=l=o<_<T=i=m<W=o=k<\\<Y=m<Y<U=k<\\=m<^=m<Y<_<X<\\<L<R=m=m<T=c<p<R=m<V<^<Y<X=l=o<_<T<Y<_<R=l<R<X<\\<^<R<S=l<R=m<X<\\<Q<Q=g=i<X<R<W<Z<Q=g<T<P<Y<Q<Q<R<p<R=m<V<^=g=l=o<]<W<Y<U<p<R=m<V<^<\\=m=n=l<\\<Q=g<Q<T=k<Y<_<R=l<\\<]<R=n<Y<X<R<W<Z<Y<Q=o=m<W=o<_<T=n<Y<S<Y=l=`<r<X<Q<\\<V<R<S<R=n<R<P=o=l<\\<]<R=n=o<\\<S=l<Y<W=c<^<R<R<]=e<Y<R<X<Q<R<_<R=m<^<R<Y<_<R=m=n<\\=n=`<T<X=l=o<_<R<U=h<R=l=o<P<Y=i<R=l<R=d<R<S=l<R=n<T<^=m=m=g<W<V<\\<V<\\<Z<X=g<U<^<W<\\=m=n<T<_=l=o<S<S=g<^<P<Y=m=n<Y=l<\\<]<R=n<\\=m<V<\\<[<\\<W<S<Y=l<^=g<U<X<Y<W<\\=n=`<X<Y<Q=`<_<T<S<Y=l<T<R<X<]<T<[<Q<Y=m<R=m<Q<R<^<Y<P<R<P<Y<Q=n<V=o<S<T=n=`<X<R<W<Z<Q<\\=l<\\<P<V<\\=i<Q<\\=k<\\<W<R<L<\\<]<R=n<\\<N<R<W=`<V<R=m<R<^=m<Y<P<^=n<R=l<R<U<Q<\\=k<\\<W<\\=m<S<T=m<R<V=m<W=o<Z<]=g=m<T=m=n<Y<P<S<Y=k<\\=n<T<Q<R<^<R<_<R<S<R<P<R=e<T=m<\\<U=n<R<^<S<R=k<Y<P=o<S<R<P<R=e=`<X<R<W<Z<Q<R=m=m=g<W<V<T<]=g=m=n=l<R<X<\\<Q<Q=g<Y<P<Q<R<_<T<Y<S=l<R<Y<V=n<M<Y<U=k<\\=m<P<R<X<Y<W<T=n<\\<V<R<_<R<R<Q<W<\\<U<Q<_<R=l<R<X<Y<^<Y=l=m<T=c=m=n=l<\\<Q<Y=h<T<W=`<P=g=o=l<R<^<Q=c=l<\\<[<Q=g=i<T=m<V<\\=n=`<Q<Y<X<Y<W=b=c<Q<^<\\=l=c<P<Y<Q=`=d<Y<P<Q<R<_<T=i<X<\\<Q<Q<R<U<[<Q<\\=k<T=n<Q<Y<W=`<[=c=h<R=l=o<P<\\<N<Y<S<Y=l=`<P<Y=m=c=j<\\<[<\\=e<T=n=g<w=o=k=d<T<Y\fHD\fHU\fIl\fHn\fHy\fH\\\fHD\fIk\fHi\fHF\fHD\fIk\fHy\fHS\fHC\fHR\fHy\fH\\\fIk\fHn\fHi\fHD\fIa\fHC\fHy\fIa\fHC\fHR\fH{\fHR\fHk\fHM\fH@\fHR\fH\\\fIk\fHy\fHS\fHT\fIl\fHJ\fHS\fHC\fHR\fHF\fHU\fH^\fIk\fHT\fHS\fHn\fHU\fHA\fHR\fH\\\fHH\fHi\fHF\fHD\fIl\fHY\fHR\fH^\fIk\fHT\fIk\fHY\fHR\fHy\fH\\\fHH\fIk\fHB\fIk\fH\\\fIk\fHU\fIg\fHD\fIk\fHT\fHy\fHH\fIk\fH@\fHU\fIm\fHH\fHT\fHR\fHk\fHs\fHU\fIg\fH{\fHR\fHp\fHR\fHD\fIk\fHB\fHS\fHD\fHs\fHy\fH\\\fHH\fHR\fHy\fH\\\fHD\fHR\fHe\fHD\fHy\fIk\fHC\fHU\fHR\fHm\fHT\fH@\fHT\fIk\fHA\fHR\fH[\fHR\fHj\fHF\fHy\fIk\fH^\fHS\fHC\fIk\fHZ\fIm\fH\\\fIn\fHk\fHT\fHy\fIk\fHt\fHn\fHs\fIk\fHB\fIk\fH\\\fIl\fHT\fHy\fHH\fHR\fHB\fIk\fH\\\fHR\fH^\fIk\fHy\fH\\\fHi\fHK\fHS\fHy\fHi\fHF\fHD\fHR\fHT\fHB\fHR\fHp\fHB\fIm\fHq\fIk\fHy\fHR\fH\\\fHO\fHU\fIg\fHH\fHR\fHy\fHM\fHP\fIl\fHC\fHU\fHR\fHn\fHU\fIg\fHs\fH^\fHZ\fH@\fIa\fHJ\fH^\fHS\fHC\fHR\fHp\fIl\fHY\fHD\fHp\fHR\fHH\fHR\fHy\fId\fHT\fIk\fHj\fHF\fHy\fHR\fHY\fHR\fH^\fIl\fHJ\fIk\fHD\fIk\fHF\fIn\fH\\\fIl\fHF\fHR\fHD\fIl\fHe\fHT\fHy\fIk\fHU\fIg\fH{\fIl\fH@\fId\fHL\fHy\fHj\fHF\fHy\fIl\fHY\fH\\\fIa\fH[\fH{\fHR\fHn\fHY\fHj\fHF\fHy\fIg\fHp\fHS\fH^\fHR\fHp\fHR\fHD\fHR\fHT\fHU\fHB\fHH\fHU\fHB\fIk\fHn\fHe\fHD\fHy\fIl\fHC\fHR\fHU\fIn\fHJ\fH\\\fIa\fHp\fHT\fIn\fHv\fIl\fHF\fHT\fHn\fHJ\fHT\fHY\fHR\fH^\fHU\fIg\fHD\fHR\fHU\fIg\fHH\fIl\fHp\fId\fHT\fIk\fHY\fHR\fHF\fHT\fHp\fHD\fHH\fHR\fHD\fIk\fHH\fHR\fHp\fHR\fH\\\fIl\fHt\fHR\fHC\fH^\fHp\fHS\fH^\fIk\fHD\fIl\fHv\fIk\fHp\fHR\fHn\fHv\fHF\fHH\fIa\fH\\\fH{\fIn\fH{\fH^\fHp\fHR\fHH\fIk\fH@\fHR\fHU\fH\\\fHj\fHF\fHD\fIk\fHY\fHR\fHU\fHD\fHk\fHT\fHy\fHR\fHT\fIm\fH@\fHU\fH\\\fHU\fHD\fIk\fHk\fHT\fHT\fIk\fHT\fHU\fHS\fHH\fH@\fHM\fHP\fIk\fHt\fHs\fHD\fHR\fHH\fH^\fHR\fHZ\fHF\fHR\fHn\fHv\fHZ\fIa\fH\\\fIl\fH@\fHM\fHP\fIl\fHU\fIg\fHH\fIk\fHT\fHR\fHd\fHs\fHZ\fHR\fHC\fHJ\fHT\fHy\fHH\fIl\fHp\fHR\fHH\fIl\fHY\fHR\fH^\fHR\fHU\fHp\fHR\fH\\\fHF\fHs\fHD\fHR\fH\\\fHz\fHD\fIk\fHT\fHM\fHP\fHy\fHB\fHS\fH^\fHR\fHe\fHT\fHy\fIl\fHy\fIk\fHY\fH^\fH^\fH{\fHH\fHR\fHz\fHR\fHD\fHR\fHi\fH\\\fIa\fHI\fHp\fHU\fHR\fHn\fHJ\fIk\fHz\fHR\fHF\fHU\fH^\fIl\fHD\fHS\fHC\fHB\fH@\fHS\fHD\fHR\fH@\fId\fHn\fHy\fHy\fHU\fIl\fHn\fHy\fHU\fHD\fHR\fHJ\fIk\fHH\fHR\fHU\fHB\fH^\fIk\fHy\fHR\fHG\fIl\fHp\fH@\fHy\fHS\fHH\fIm\fH\\\fHH\fHB\fHR\fHn\fH{\fHY\fHU\fIl\fHn\fH\\\fIg\fHp\fHP\fHB\fHS\fH^\fIl\fHj\fH\\\fIg\fHF\fHT\fIk\fHD\fHR\fHC\fHR\fHJ\fHY\fH^\fIk\fHD\fIk\fHz\fHR\fHH\fHR\fHy\fH\\\fIl\fH@\fHe\fHD\fHy\fHR\fHp\fHY\fHR\fH@\fHF\fIn\fH\\\fHR\fH@\fHM\fHP\fHR\fHT\fI`\fHJ\fHR\fHZ\fIk\fHC\fH\\\fHy\fHS\fHC\fIk\fHy\fHU\fHR\fHn\fHi\fHy\fHT\fH\\\fH@\fHD\fHR\fHc\fHY\fHU\fHR\fHn\fHT\fIa\fHI\fH^\fHB\fHS\fH^\fIk\fH^\fIk\fHz\fHy\fHY\fHS\fH[\fHC\fHy\fIa\fH\\\fHn\fHT\fHB\fIn\fHU\fHI\fHR\fHD\fHR4F4_4F4[5f4U5i4X4K4]5o4E4D5d4K4_4[4E4K5h4Y5m4A4E5i5d4K4Z5f4U4K5h4B4K4Y4E4K5h5i4^5f4C4K5h4U4K5i4E4K5h5o4K4F4D4K5h4]4C5d4C4D4]5j4K5i4@4K5h4C5d5h4E4K5h4U4K5h5i4K5h5i5d5n4U4K5h4U4]4D5f4K5h4_4]5f4U4K5h4@5d4K5h4K5h4\\5k4K4D4K5h4A5f4K4E4K5h4A5n5d5n4K5h5o4]5f5i4K5h4U4]4K5n5i4A5m5d4T4E4K5h4G4K5j5f5i4X4K5k4C4E4K5h5i4]4O4E4K5h5n4]4N5j4K5h4X4D4K4D4K5h4A5d4K4]4K5h4@4C5f4C4K5h4O4_4]4E4K5h4U5h5d5i5i4@5i5d4U4E4K5h4]4A5i5j4K5h5j5n4K4[5m5h4_4[5f5j4K5h5o5d5f4F4K5h4C5j5f4K4D4]5o4K4F5k4K5h4]5f4K4Z4F4A5f4K4F5f4D4F5d5n5f4F4K5h4O5d5h5e4K5h4D4]5f4C4K5h5o5h4K5i4K5h4]4K4D4[4K5h4X4B4Y5f4_5f4K4]4K4F4K5h4G4K5h4G4K5h4Y5h4K4E4K5h4A4C5f4G4K5h4^5d4K4]4K5h4B5h5f4@4K5h4@5i5f4U4K5h4U4K5i5k4K5h4@5i4K5h4K5h4_4K4U4E5i4X4K5k4C5k4K5h4]4J5f4_4K5h4C4B5d5h4K5h5m5j5f4E4K5h5o4F4K4D4K5h4C5d4]5f4K5h4C4]5d4_4K4_4F4V4]5n4F4Y4K5i5f5i4K5h4D5j4K4F4K5h4U4T5f5ifmwfqwbjmnfmwvmgfqpwbmgjmd#>#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=\x0E\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\x7F%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^..=\x0E\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,<plqw>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^..=\x0E\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=\x0E\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=\x0E#ubojdm>!wls!#jmkbajwbmwp#leelooltjmd#zfbq\x0E\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\x0E\t?,p`qjsw=\x0E\t?tbp#elvmgfg#jmjmwfqujft#tjwk\\jg!#`lmwfmw>!`bsjwbo#le#wkf\x0E\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+*#x\x0Eje#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=\x0E\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=\x0E\t\x0E\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<L=o=m=m<V<T<U=l=o=m=m<V<T<Ujmufpwjdb`j/_msbqwj`jsb`j/_m<V<R=n<R=l=g<Y<R<]<W<\\=m=n<T<V<R=n<R=l=g<U=k<Y<W<R<^<Y<V=m<T=m=n<Y<P=g<q<R<^<R=m=n<T<V<R=n<R=l=g=i<R<]<W<\\=m=n=`<^=l<Y<P<Y<Q<T<V<R=n<R=l<\\=c=m<Y<_<R<X<Q=c=m<V<\\=k<\\=n=`<Q<R<^<R=m=n<T<O<V=l<\\<T<Q=g<^<R<S=l<R=m=g<V<R=n<R=l<R<U=m<X<Y<W<\\=n=`<S<R<P<R=e=`=b=m=l<Y<X=m=n<^<R<]=l<\\<[<R<P=m=n<R=l<R<Q=g=o=k<\\=m=n<T<Y=n<Y=k<Y<Q<T<Y<\x7F<W<\\<^<Q<\\=c<T=m=n<R=l<T<T=m<T=m=n<Y<P<\\=l<Y=d<Y<Q<T=c<M<V<\\=k<\\=n=`<S<R=a=n<R<P=o=m<W<Y<X=o<Y=n=m<V<\\<[<\\=n=`=n<R<^<\\=l<R<^<V<R<Q<Y=k<Q<R=l<Y=d<Y<Q<T<Y<V<R=n<R=l<R<Y<R=l<_<\\<Q<R<^<V<R=n<R=l<R<P<L<Y<V<W<\\<P<\\4K5h5i5j4F4C5e5i5j4F4C5f4K4F4K5h5i5d4Z5d4U4K5h4D4]4K5i4@4K5h5i5d4K5n4U4K5h4]4_4K4J5h5i4X4K4]5o4K4F4K5h4O4U4Z4K4M4K5h4]5f4K4Z4E4K5h4F4Y5i5f5i4K5h4K4U4Z4K4M4K5h5j4F4K4J4@4K5h4O5h4U4K4D4K5h4F4_4@5f5h4K5h4O5n4_4K5i4K5h4Z4V4[4K4F4K5h5m5f4C5f5d4K5h4F4]4A5f4D4K5h4@4C5f4C4E4K5h4F4U5h5f5i4K5h4O4B4D4K4]4K5h4K5m5h4K5i4K5h4O5m5h4K5i4K5h4F4K4]5f4B4K5h4F5n5j5f4E4K5h4K5h4U4K4D4K5h4B5d4K4[4]4K5h5i4@4F5i4U4K5h4C5f5o5d4]4K5h4_5f4K4A4E4U4D4C4K5h5h5k4K5h4F4]4D5f4E4K5h4]5d4K4D4[4K5h4O4C4D5f4E4K5h4K4B4D4K4]4K5h5i4F4A4C4E4K5h4K4V4K5j5f`vqplq9sljmwfq8?,wjwof=\t?nfwb#!#kqfe>!kwws9,,!=?psbm#`obpp>!nfnafqp#le#wkf#tjmglt-ol`bwjlmufqwj`bo.bojdm9,b=#\x7F#?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\x0E\t?,p`qjsw=\x0E\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\x0E\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=\x0E\tvo=?,gju=?,gju=bewfq#wkf#gfbwktjwk#qfpsf`w#wlpwzof>!sbggjmd9jp#sbqwj`vobqozgjpsobz9jmojmf8#wzsf>!pvanjw!#jp#gjujgfg#jmwl\bTA\nzk#+\x0BBl\bQ\x7F*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\x0E\t?,p`qjsw=\x0E\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-isd\x7Fwkvna\x7Fofew\x7Fubpw#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=\x0E\t?-ip!=?,p`qjsw=\x0E\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<V<T<V<R<P<S<\\<Q<T<T=c<^<W=c<Y=n=m=c<x<R<]<\\<^<T=n=`=k<Y<W<R<^<Y<V<\\=l<\\<[<^<T=n<T=c<t<Q=n<Y=l<Q<Y=n<r=n<^<Y=n<T=n=`<Q<\\<S=l<T<P<Y=l<T<Q=n<Y=l<Q<Y=n<V<R=n<R=l<R<_<R=m=n=l<\\<Q<T=j=g<V<\\=k<Y=m=n<^<Y=o=m<W<R<^<T=c=i<S=l<R<]<W<Y<P=g<S<R<W=o=k<T=n=`=c<^<W=c=b=n=m=c<Q<\\<T<]<R<W<Y<Y<V<R<P<S<\\<Q<T=c<^<Q<T<P<\\<Q<T<Y=m=l<Y<X=m=n<^<\\4K5h5i5d4K4Z5f4U4K5h4]4J5f4_5f4E4K5h4K5j4F5n4K5h5i4X4K4]5o4K4F5o4K5h4_5f4K4]4K4F4K5h5i5o4F5d4D4E4K5h4_4U5d4C5f4E4K4A4Y4K4J5f4K4F4K5h4U4K5h5i5f4E4K5h4Y5d4F5f4K4F4K5h4K5j4F4]5j4F4K5h4F4Y4K5i5f5i4K5h4I4_5h4K5i5f4K5h5i4X4K4]5o4E4K5h5i4]4J5f4K4Fqlalwp!#`lmwfmw>!?gju#jg>!ellwfq!=wkf#Vmjwfg#Pwbwfp?jnd#pq`>!kwws9,,-isd\x7Fqjdkw\x7Fwkvna\x7F-ip!=?,p`qjsw=\x0E\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\x0E\tjmelqnbwjlm#balvw?gju#jg>!kfbgfq!=!#b`wjlm>!kwws9,,?b#kqfe>!kwwsp9,,?gju#jg>!`lmwfmw!?,gju=\x0E\t?,gju=\x0E\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=\x0E\t?,gju=\x0E\t\x0E\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=\x0E\t?,kwno=\x0E\"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/-isd\x7Fwkvna\x7Fqjdkw\x7F1?,gju=?gju#`obpp>!?gju#pwzof>!eolbw9mjmfwffmwk#`fmwvqz?,algz=\x0E\t?,kwno=\x0E\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=\x0E\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\x7F#?b#kqfe>!kwws9,,Jm#sbqwj`vobq/#wkfNvowjsof#ellwmlwfplq#lwkfq#pvapwbm`fwklvpbmgp#le#zfbqpwqbmpobwjlm#le#wkf?,gju=\x0E\t?,gju=\x0E\t\x0E\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<W<_<\\=l=m<V<T<]=f<W<_<\\=l=m<V<T<H<Y<X<Y=l<\\=j<T<T<Q<Y=m<V<R<W=`<V<R=m<R<R<]=e<Y<Q<T<Y=m<R<R<]=e<Y<Q<T=c<S=l<R<_=l<\\<P<P=g<r=n<S=l<\\<^<T=n=`<]<Y=m<S<W<\\=n<Q<R<P<\\=n<Y=l<T<\\<W=g<S<R<[<^<R<W=c<Y=n<S<R=m<W<Y<X<Q<T<Y=l<\\<[<W<T=k<Q=g=i<S=l<R<X=o<V=j<T<T<S=l<R<_=l<\\<P<P<\\<S<R<W<Q<R=m=n=`=b<Q<\\=i<R<X<T=n=m=c<T<[<]=l<\\<Q<Q<R<Y<Q<\\=m<Y<W<Y<Q<T=c<T<[<P<Y<Q<Y<Q<T=c<V<\\=n<Y<_<R=l<T<T<|<W<Y<V=m<\\<Q<X=l\fHJ\fIa\fHY\fHR\fH\\\fHR\fHB\fId\fHD\fIm\fHi\fH^\fHF\fIa\fH\\\fHJ\fHR\fHD\fHA\fHR\fH\\\fHH\fIl\fHC\fHi\fHD\fIm\fHJ\fIk\fHZ\fHU\fHS\fHD\fIa\fHJ\fIl\fHk\fHn\fHM\fHS\fHC\fHR\fHJ\fHS\fH^\fIa\fH^\fIl\fHi\fHK\fHS\fHy\fHR\fH\\\fHY\fIl\fHM\fHS\fHC\fIg\fHv\fHS\fHs\fIa\fHL\fIk\fHT\fHB\fHR\fHv\fHR\fH\\\fHp\fHn\fHy\fIa\fHZ\fHD\fHJ\fIm\fHD\fHS\fHC\fHR\fHF\fIa\fH\\\fHC\fIg\fH{\fHi\fHD\fIm\fHT\fHR\fH\\\fH}\fHD\fH^\fHR\fHk\fHD\fHF\fHR\fH\\\fIa\fHs\fIl\fHZ\fH\\\fIa\fHH\fIg\fHn\fH^\fIg\fHy\fHT\fHA\fHR\fHG\fHP\fIa\fH^\fId\fHZ\fHZ\fH\\\fIa\fHH\fIk\fHn\fHF\fIa\fH\\\fHJ\fIk\fHZ\fHF\fIa\fH^\fIk\fHC\fH\\\fHy\fIk\fHn\fHJ\fIa\fH\\\fHT\fIa\fHI\fHS\fHH\fHS\fHe\fHH\fIa\fHF\fHR\fHJ\fHe\fHD\fIa\fHU\fIk\fHn\fHv\fHS\fHs\fIa\fHL\fHR\fHC\fHR\fHH\fIa\fH\\\fHR\fHp\fIa\fHC\fHR\fHJ\fHR\fHF\fIm\fH\\\fHR\fHD\fIk\fHp\fIg\fHM\fHP\fIk\fHn\fHi\fHD\fIm\fHY\fHR\fHJ\fHZ\fIa\fH\\\fIk\fHO\fIl\fHZ\fHS\fHy\fIa\fH[\fHR\fHT\fH\\\fHy\fHR\fH\\\fIl\fHT\fHn\fH{\fIa\fH\\\fHU\fHF\fH\\\fHS\fHO\fHR\fHB\fH@\fIa\fH\\\fHR\fHn\fHM\fH@\fHv\fIa\fHv\fIg\fHn\fHe\fHF\fH^\fH@\fIa\fHK\fHB\fHn\fHH\fIa\fH\\\fIl\fHT\fHn\fHF\fH\\\fIa\fHy\fHe\fHB\fIa\fHB\fIl\fHJ\fHB\fHR\fHK\fIa\fHC\fHB\fHT\fHU\fHR\fHC\fHH\fHR\fHZ\fH@\fIa\fHJ\fIg\fHn\fHB\fIl\fHM\fHS\fHC\fHR\fHj\fHd\fHF\fIl\fHc\fH^\fHB\fIg\fH@\fHR\fHk\fH^\fHT\fHn\fHz\fIa\fHC\fHR\fHj\fHF\fH\\\fIk\fHZ\fHD\fHi\fHD\fIm\fH@\fHn\fHK\fH@\fHR\fHp\fHP\fHR\fH\\\fHD\fHY\fIl\fHD\fHH\fHB\fHF\fIa\fH\\\fHB\fIm\fHz\fHF\fIa\fH\\\fHZ\fIa\fHD\fHF\fH\\\fHS\fHY\fHR\fH\\\fHD\fIm\fHy\fHT\fHR\fHD\fHT\fHB\fH\\\fIa\fHI\fHD\fHj\fHC\fIg\fHp\fHS\fHH\fHT\fIg\fHB\fHY\fHR\fH\\4K5h5i4X4K4]5o4K4F4K5h5i5j4F4C5f4K4F4K5h5o5i4D5f5d4F4]4K5h5i4X4K5k4C4K4F4U4C4C4K5h4^5d4K4]4U4C4C4K5h4]4C5d4C4K5h4I4_5h4K5i5f4E4K5h5m5d4F5d4X5d4D4K5h5i4_4K4D5n4K4F4K5h5i4U5h5d5i4K4F4K5h5i4_5h4_5h4K4F4K5h4@4]4K5m5f5o4_4K5h4K4_5h4K5i5f4E4K5h4K4F4Y4K5h4K4Fhfztlqgp!#`lmwfmw>!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\x0E\t?,algz=\x0E\t?,kwno=gjpwjm`wjlm#afwtffm,!#wbqdfw>!\\aobmh!=?ojmh#kqfe>!kwws9,,fm`lgjmd>!vwe.;!<=\tt-bggFufmwOjpwfmfq<b`wjlm>!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<W<_<\\=l=m<V<T\t#wzsf>!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..=\x0E\t?p`qjsw#wzsf>!w?b#kqfe>$kwws9,,ttt-klqw`vw#j`lm!#kqfe>!?,gju=\x0E\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=\x0E\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\x0E\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=\x0E\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*<O<V=l<\\={<Q=m=`<V<\\=o<V=l<\\={<Q=m=`<V<\\<L<R=m=m<T<U=m<V<R<U<P<\\=n<Y=l<T<\\<W<R<^<T<Q=h<R=l<P<\\=j<T<T=o<S=l<\\<^<W<Y<Q<T=c<Q<Y<R<]=i<R<X<T<P<R<T<Q=h<R=l<P<\\=j<T=c<t<Q=h<R=l<P<\\=j<T=c<L<Y=m<S=o<]<W<T<V<T<V<R<W<T=k<Y=m=n<^<R<T<Q=h<R=l<P<\\=j<T=b=n<Y=l=l<T=n<R=l<T<T<X<R=m=n<\\=n<R=k<Q<R4K5h5i4F5d4K4@4C5d5j4K5h4K4X4F4]4K5o4K4F4K5h4K5n4F4]4K4A4K4Fkwno8#`kbqpfw>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!#\x0E\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\nAO\x05Gx\bTA\nzk#+\x0BUm\x05Gx*\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*<R=l<_<\\<Q<T<[<\\=j<T<T<^<R<[<P<R<Z<Q<R=m=n=`<R<]=l<\\<[<R<^<\\<Q<T=c=l<Y<_<T=m=n=l<\\=j<T<T<^<R<[<P<R<Z<Q<R=m=n<T<R<]=c<[<\\=n<Y<W=`<Q<\\?\"GL@WZSF#kwno#SVAOJ@#!mw.Wzsf!#`lmwfmw>!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$=<X<Y=c=n<Y<W=`<Q<R=m=n<T=m<R<R=n<^<Y=n=m=n<^<T<T<S=l<R<T<[<^<R<X=m=n<^<\\<]<Y<[<R<S<\\=m<Q<R=m=n<T\fHF\fIm\fHT\fIa\fHH\fHS\fHy\fHR\fHy\fHR\fHn\fH{\fIa\fH\\\fIk\fHT\fHe\fHD\fIa\fHU\fIg\fHn\fHD\fIk\fHY\fHS\fHK\fHR\fHD\fHT\fHA\fHR\fHG\fHS\fHy\fIa\fHT\fHS\fHn\fH{\fHT\fIm\fH\\\fHy\fIa\fH[\fHS\fHH\fHy\fIe\fHF\fIl\fH\\\fHR\fHk\fHs\fHY\fHS\fHp\fIa\fHr\fHR\fHF\fHD\fHy\fHR\fH\\\fIa\fH\\\fHY\fHR\fHd\fHT\fHy\fIa\fH\\\fHS\fHC\fHH\fHR", "\u06F7%\u018C'T%\x85'W%\xD7%O%g%\xA6&\u0193%\u01E5&>&*&'&^&\x88\u0178\u0C3E&\u01AD&\u0192&)&^&%&'&\x82&P&1&\xB1&3&]&m&u&E&t&C&\xCF&V&V&/&>&6&\u0F76\u177Co&p&@&E&M&P&x&@&F&e&\xCC&7&:&(&D&0&C&)&.&F&-&1&(&L&F&1\u025E*\u03EA\u21F3&\u1372&K&;&)&E&H&P&0&?&9&V&\x81&-&v&a&,&E&)&?&=&'&'&B&\u0D2E&\u0503&\u0316*&*8&%&%&&&%,)&\x9A&>&\x86&7&]&F&2&>&J&6&n&2&%&?&\x8E&2&6&J&g&-&0&,&*&J&*&O&)&6&(&<&B&N&.&P&@&2&.&W&M&%\u053C\x84(,(<&,&\u03DA&\u18C7&-&,(%&(&%&(\u013B0&X&D&\x81&j&'&J&(&.&B&3&Z&R&h&3&E&E&<\xC6-\u0360\u1EF3&%8?&@&,&Z&@&0&J&,&^&x&_&6&C&6&C\u072C\u2A25&f&-&-&-&-&,&J&2&8&z&8&C&Y&8&-&d&\u1E78\xCC-&7&1&F&7&t&W&7&I&.&.&^&=\u0F9C\u19D3&8(>&/&/&\u077B')'\u1065')'%@/&0&%\u043E\u09C0*&*@&C\u053D\u05D4\u0274\u05EB4\u0DD7\u071A\u04D16\u0D84&/\u0178\u0303Z&*%\u0246\u03FF&\u0134&1\xA8\u04B4\u0174", dictionarySizeBits, "AAAAKKLLKKKKKJJIHHIHHGGFF");
+  setData(dictionaryData, dictionarySizeBits);
+  function InputStream(data) {
+    this.data = new Int8Array(0);
+    this.offset = 0;
+    this.data = data;
+  }
+  function readInput(s, dst, offset, length) {
+    if (s.input === null) {
+      return -1;
+    }
+    const src = s.input;
+    const end = Math.min(src.offset + length, src.data.length);
+    const bytesRead = end - src.offset;
+    dst.set(src.data.subarray(src.offset, end), offset);
+    src.offset += bytesRead;
+    return bytesRead;
+  }
+  function closeInput(s) {
+    s.input = new InputStream(new Int8Array(0));
+  }
+  function toUsAsciiBytes(src) {
+    const n = src.length;
+    const result = new Int8Array(n);
+    for (let i = 0; i < n; ++i) {
+      result[i] = src.charCodeAt(i);
+    }
+    return result;
+  }
+  function toUtf8Runes(src) {
+    const n = src.length;
+    const result = new Int32Array(n);
+    for (let i = 0; i < n; ++i) {
+      result[i] = src.charCodeAt(i);
+    }
+    return result;
+  }
+  function makeError(s, code) {
+    if (code >= 0) {
+      return code;
+    }
+    if (s.runningState >= 0) {
+      s.runningState = code;
+    }
+    throw new Error("Brotli error code: " + code);
+  }
+  let ByteBuffer;
+  function decode(bytes, options) {
+    let s = new State();
+    s.input = new InputStream(bytes);
+    initState(s);
+    if (options) {
+      let customDictionary = options["customDictionary"];
+      if (customDictionary) attachDictionaryChunk(s, customDictionary);
+    }
+    let totalOutput = 0;
+    let chunks = [];
+    while (true) {
+      let chunk = new Int8Array(16384);
+      chunks.push(chunk);
+      s.output = chunk;
+      s.outputOffset = 0;
+      s.outputLength = 16384;
+      s.outputUsed = 0;
+      decompress(s);
+      totalOutput += s.outputUsed;
+      if (s.outputUsed < 16384) break;
+    }
+    close(s);
+    closeInput(s);
+    let result = new Int8Array(totalOutput);
+    let offset = 0;
+    for (let i = 0; i < chunks.length; ++i) {
+      let chunk = chunks[i];
+      let end = Math.min(totalOutput, offset + 16384);
+      let len = end - offset;
+      if (len < 16384) {
+        result.set(chunk.subarray(0, len), offset);
+      } else {
+        result.set(chunk, offset);
+      }
+      offset += len;
+    }
+    return result;
+  }
+  return decode;
+};
+let BrotliDecode = makeBrotliDecode();
+;// ./src/core/brotli_stream.js
+
+
+
+class BrotliStream extends DecodeStream {
+  #isAsync = true;
+  constructor(stream, maybeLength) {
+    super(maybeLength);
+    this.stream = stream;
+    this.dict = stream.dict;
+  }
+  readBlock() {
+    const bytes = this.stream.getBytes();
+    const decodedData = BrotliDecode(new Int8Array(bytes.buffer, bytes.byteOffset, bytes.length));
+    this.buffer = new Uint8Array(decodedData.buffer, decodedData.byteOffset, decodedData.length);
+    this.bufferLength = this.buffer.length;
+    this.eof = true;
+  }
+  async getImageData(length, _decoderOptions) {
+    const data = await this.asyncGetBytes();
+    if (!data) {
+      return this.getBytes(length);
+    }
+    if (data.length <= length) {
+      return data;
+    }
+    return data.subarray(0, length);
+  }
+  async asyncGetBytes() {
+    const {
+      decompressed,
+      compressed
+    } = await this.asyncGetBytesFromDecompressionStream("brotli");
+    if (decompressed) {
+      return decompressed;
+    }
+    this.#isAsync = false;
+    this.stream = new Stream(compressed, 0, compressed.length, this.stream.dict);
+    this.reset();
+    return null;
+  }
+  get isAsync() {
+    return this.#isAsync;
+  }
+}
+
+;// ./external/jbig2/jbig2.js
+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, readBinary;
+  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 ABORT = false;
+  var EXITSTATUS;
+  var readyPromiseResolve, readyPromiseReject;
+  var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
+  var HEAP64, HEAPU64;
+  var runtimeInitialized = false;
+  function updateMemoryViews() {
+    var b = wasmMemory.buffer;
+    HEAP8 = new Int8Array(b);
+    HEAP16 = new Int16Array(b);
+    HEAPU8 = new Uint8Array(b);
+    HEAPU16 = new Uint16Array(b);
+    HEAP32 = new Int32Array(b);
+    HEAPU32 = new Uint32Array(b);
+    HEAPF32 = new Float32Array(b);
+    HEAPF64 = new Float64Array(b);
+    HEAP64 = new BigInt64Array(b);
+    HEAPU64 = new BigUint64Array(b);
+  }
+  function preRun() {
+    if (Module["preRun"]) {
+      if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]];
+      while (Module["preRun"].length) {
+        addOnPreRun(Module["preRun"].shift());
+      }
+    }
+    callRuntimeCallbacks(onPreRuns);
+  }
+  function initRuntime() {
+    runtimeInitialized = true;
+    wasmExports["j"]();
+  }
+  function postRun() {
+    if (Module["postRun"]) {
+      if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]];
+      while (Module["postRun"].length) {
+        addOnPostRun(Module["postRun"].shift());
+      }
+    }
+    callRuntimeCallbacks(onPostRuns);
+  }
+  function abort(what) {
+    Module["onAbort"]?.(what);
+    what = "Aborted(" + what + ")";
+    err(what);
+    ABORT = true;
+    what += ". Build with -sASSERTIONS for more info.";
+    var e = new WebAssembly.RuntimeError(what);
+    readyPromiseReject?.(e);
+    throw e;
+  }
+  var wasmBinaryFile;
+  function getWasmImports() {
+    var imports = {
+      a: wasmImports
+    };
+    return imports;
+  }
+  async function createWasm() {
+    function receiveInstance(instance, module) {
+      wasmExports = instance.exports;
+      assignWasmExports(wasmExports);
+      updateMemoryViews();
+      return wasmExports;
+    }
+    var info = getWasmImports();
+    return new Promise((resolve, reject) => {
+      Module["instantiateWasm"](info, (inst, mod) => {
+        resolve(receiveInstance(inst, mod));
+      });
+    });
+  }
+  class ExitStatus {
+    name = "ExitStatus";
+    constructor(status) {
+      this.message = `Program terminated with exit(${status})`;
+      this.status = status;
+    }
+  }
+  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 _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 < destSize; srcStart += pitch32, destStart += pitch8) {
+      imageData.set(HEAPU8.subarray(srcStart, srcStart + pitch8), destStart);
+    }
+  }
+  function _setLineData(line_ptr, pitch8, offset) {
+    Module.imageData.set(HEAPU8.subarray(line_ptr, line_ptr + pitch8), offset);
+  }
+  var writeArrayToMemory = (array, buffer) => {
+    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["k"];
+    _free = Module["_free"] = wasmExports["l"];
+    _jbig2_decode = Module["_jbig2_decode"] = wasmExports["m"];
+    _ccitt_decode = Module["_ccitt_decode"] = wasmExports["n"];
+    __emscripten_timeout = wasmExports["o"];
+    memory = wasmMemory = wasmExports["i"];
+    __indirect_function_table = wasmExports["__indirect_function_table"];
+  }
+  var wasmImports = {
+    e: __abort_js,
+    b: __emscripten_runtime_keepalive_clear,
+    c: __setitimer_js,
+    g: _createImageData,
+    d: _emscripten_resize_heap,
+    a: _proc_exit,
+    h: _setImageData,
+    f: _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 = await createWasm();
+  run();
+  if (runtimeInitialized) {
+    moduleRtn = Module;
+  } else {
+    moduleRtn = new Promise((resolve, reject) => {
+      readyPromiseResolve = resolve;
+      readyPromiseReject = reject;
+    });
+  }
+  return moduleRtn;
+}
+/* harmony default export */ const jbig2 = (JBig2);
+;// ./src/core/wasm_image.js
+
+
+class WasmImage {
+  static #handler = null;
+  static #instances = new Set();
+  static #useWasm = true;
+  static #useWorkerFetch = true;
+  static #wasmUrl = null;
+  #buffer = null;
+  #modulePromise = null;
+  _filename = null;
+  _noWasmFilename = null;
+  static setOptions({
+    handler,
+    useWasm,
+    useWorkerFetch,
+    wasmUrl
+  }) {
+    WasmImage.#useWasm = useWasm;
+    WasmImage.#useWorkerFetch = useWorkerFetch;
+    WasmImage.#wasmUrl = wasmUrl;
+    if (!useWorkerFetch) {
+      WasmImage.#handler = handler;
+    }
+  }
+  static get instance() {
+    unreachable("Abstract getter `instance` accessed");
+  }
+  static cleanup() {
+    for (const instance of WasmImage.#instances) {
+      instance.#modulePromise = null;
+    }
+  }
+  constructor(trackInstance = false) {
+    if (trackInstance) {
+      WasmImage.#instances.add(this);
+    }
+  }
+  async #getJsModule(fallbackCallback) {
+    let instance = null;
+    try {
+      const mod = await import(
+      /*webpackIgnore: true*/
+      /*@vite-ignore*/
+      `${WasmImage.#wasmUrl}${this._noWasmFilename}`);
+      instance = mod.default();
+    } catch (ex) {
+      warn(`#getJsModule: ${ex}`);
+    }
+    fallbackCallback(instance);
+  }
+  async #instantiateWasm(fallbackCallback, imports, successCallback) {
+    try {
+      if (!this.#buffer) {
+        if (WasmImage.#useWorkerFetch) {
+          this.#buffer = await fetchBinaryData(`${WasmImage.#wasmUrl}${this._filename}`);
+        } else {
+          this.#buffer = await WasmImage.#handler.sendWithPromise("FetchBinaryData", {
+            kind: "wasmUrl",
+            filename: this._filename
+          });
+        }
+      }
+      const results = await WebAssembly.instantiate(this.#buffer, imports);
+      return successCallback(results.instance);
+    } catch (ex) {
+      warn(`#instantiateWasm: ${ex}`);
+      this.#getJsModule(fallbackCallback);
+      return null;
+    }
+  }
+  _getModule(ImageDecoder) {
+    if (!this.#modulePromise) {
+      const {
+        promise,
+        resolve
+      } = Promise.withResolvers();
+      const promises = [promise];
+      if (!WasmImage.#useWasm) {
+        this.#getJsModule(resolve);
+      } else {
+        promises.push(ImageDecoder({
+          warn: warn,
+          instantiateWasm: this.#instantiateWasm.bind(this, resolve)
+        }));
+      }
+      this.#modulePromise = Promise.race(promises);
+    }
+    return this.#modulePromise;
+  }
+  async decode(bytes, _params) {
+    unreachable("Abstract method `decode` called");
+  }
+}
+
+;// ./src/core/jbig2_ccittFax.js
+
+
+
+class Jbig2Error extends BaseException {
+  constructor(msg) {
+    super(msg, "Jbig2Error");
+  }
+}
+class JBig2CCITTFaxImage extends WasmImage {
+  _filename = "jbig2.wasm";
+  _noWasmFilename = "jbig2_nowasm_fallback.js";
+  static get instance() {
+    return shadow(this, "instance", new JBig2CCITTFaxImage(true));
+  }
+  async decode(bytes, width, height, globals, CCITTOptions) {
+    const module = await this._getModule(jbig2);
+    if (!module) {
+      throw new Jbig2Error("JBig2 failed to initialize");
+    }
+    let ptr, globalsPtr;
+    try {
+      const size = bytes.length;
+      ptr = module._malloc(size);
+      module.writeArrayToMemory(bytes, ptr);
+      if (CCITTOptions) {
+        module._ccitt_decode(ptr, size, width, height, CCITTOptions.K, CCITTOptions.EndOfLine ? 1 : 0, CCITTOptions.EncodedByteAlign ? 1 : 0, CCITTOptions.BlackIs1 ? 1 : 0, CCITTOptions.Columns, CCITTOptions.Rows);
+      } else {
+        const globalsSize = globals ? globals.length : 0;
+        if (globalsSize > 0) {
+          globalsPtr = module._malloc(globalsSize);
+          module.writeArrayToMemory(globals, globalsPtr);
+        }
+        module._jbig2_decode(ptr, size, width, height, globalsPtr, globalsSize);
+      }
+      if (!module.imageData) {
+        throw new Jbig2Error("Unknown error");
+      }
+      const {
+        imageData
+      } = module;
+      module.imageData = null;
+      return imageData;
+    } finally {
+      if (ptr) {
+        module._free(ptr);
+      }
+      if (globalsPtr) {
+        module._free(globalsPtr);
+      }
+    }
+  }
+}
+
+;// ./src/core/ccitt_stream.js
+
+
+
+
+class CCITTFaxStream extends DecodeStream {
+  constructor(str, maybeLength, params) {
+    super(maybeLength);
+    this.stream = str;
+    this.maybeLength = maybeLength;
+    this.dict = str.dict;
+    if (!(params instanceof Dict)) {
+      params = Dict.empty;
+    }
+    this.params = {
+      K: params.get("K") || 0,
+      EndOfLine: !!params.get("EndOfLine"),
+      EncodedByteAlign: !!params.get("EncodedByteAlign"),
+      Columns: params.get("Columns") || 1728,
+      Rows: params.get("Rows") || 0,
+      EndOfBlock: !!(params.get("EndOfBlock") ?? true),
+      BlackIs1: !!params.get("BlackIs1")
+    };
+  }
+  get bytes() {
+    return shadow(this, "bytes", this.stream.getBytes(this.maybeLength));
+  }
+  get isImageStream() {
+    return true;
+  }
+  get isAsyncDecoder() {
+    return true;
+  }
+  async decodeImage(bytes, length, _decoderOptions) {
+    if (this.eof) {
+      return this.buffer;
+    }
+    if (!bytes) {
+      bytes = this.stream.isAsync ? (await this.stream.asyncGetBytes()) || this.bytes : this.bytes;
+    }
+    this.buffer = await JBig2CCITTFaxImage.instance.decode(bytes, this.dict.get("W", "Width"), this.dict.get("H", "Height"), null, this.params);
+    this.bufferLength = this.buffer.length;
+    this.eof = true;
+    return this.buffer;
+  }
+}
+
+;// ./src/core/flate_stream.js
+
+
+
+const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
+const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);
+const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);
+const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9];
+const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5];
+class FlateStream extends DecodeStream {
+  #isAsync = true;
+  constructor(str, maybeLength) {
+    super(maybeLength);
+    this.stream = str;
+    this.dict = str.dict;
+    const cmf = str.getByte();
+    const flg = str.getByte();
+    if (cmf === -1 || flg === -1) {
+      throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`);
+    }
+    if ((cmf & 0x0f) !== 0x08) {
+      throw new FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`);
+    }
+    if (((cmf << 8) + flg) % 31 !== 0) {
+      throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`);
+    }
+    if (flg & 0x20) {
+      throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`);
+    }
+    this.codeSize = 0;
+    this.codeBuf = 0;
+  }
+  async getImageData(length, _decoderOptions) {
+    const data = await this.asyncGetBytes();
+    if (!data) {
+      return this.getBytes(length);
+    }
+    if (data.length <= length) {
+      return data;
+    }
+    return data.subarray(0, length);
+  }
+  async asyncGetBytes() {
+    const {
+      decompressed,
+      compressed
+    } = await this.asyncGetBytesFromDecompressionStream("deflate");
+    if (decompressed) {
+      return decompressed;
+    }
+    this.#isAsync = false;
+    this.stream = new Stream(compressed, 2, compressed.length, this.stream.dict);
+    this.reset();
+    return null;
+  }
+  get isAsync() {
+    return this.#isAsync;
+  }
+  getBits(bits) {
+    const str = this.stream;
+    let codeSize = this.codeSize;
+    let codeBuf = this.codeBuf;
+    let b;
+    while (codeSize < bits) {
+      if ((b = str.getByte()) === -1) {
+        throw new FormatError("Bad encoding in flate stream");
+      }
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
+    b = codeBuf & (1 << bits) - 1;
+    this.codeBuf = codeBuf >> bits;
+    this.codeSize = codeSize -= bits;
+    return b;
+  }
+  getCode(table) {
+    const str = this.stream;
+    const codes = table[0];
+    const maxLen = table[1];
+    let codeSize = this.codeSize;
+    let codeBuf = this.codeBuf;
+    let b;
+    while (codeSize < maxLen) {
+      if ((b = str.getByte()) === -1) {
+        break;
+      }
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
+    const code = codes[codeBuf & (1 << maxLen) - 1];
+    const codeLen = code >> 16;
+    const codeVal = code & 0xffff;
+    if (codeLen < 1 || codeSize < codeLen) {
+      throw new FormatError("Bad encoding in flate stream");
+    }
+    this.codeBuf = codeBuf >> codeLen;
+    this.codeSize = codeSize - codeLen;
+    return codeVal;
+  }
+  generateHuffmanTable(lengths) {
+    const n = lengths.length;
+    let maxLen = 0;
+    let i;
+    for (i = 0; i < n; ++i) {
+      if (lengths[i] > maxLen) {
+        maxLen = lengths[i];
+      }
+    }
+    const size = 1 << maxLen;
+    const codes = new Int32Array(size);
+    for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {
+      for (let val = 0; val < n; ++val) {
+        if (lengths[val] === len) {
+          let code2 = 0;
+          let t = code;
+          for (i = 0; i < len; ++i) {
+            code2 = code2 << 1 | t & 1;
+            t >>= 1;
+          }
+          for (i = code2; i < size; i += skip) {
+            codes[i] = len << 16 | val;
+          }
+          ++code;
+        }
+      }
+    }
+    return [codes, maxLen];
+  }
+  #endsStreamOnError(err) {
+    info(err);
+    this.eof = true;
+  }
+  readBlock() {
+    let buffer, hdr, len;
+    const str = this.stream;
+    try {
+      hdr = this.getBits(3);
+    } catch (ex) {
+      this.#endsStreamOnError(ex.message);
+      return;
+    }
+    if (hdr & 1) {
+      this.eof = true;
+    }
+    hdr >>= 1;
+    if (hdr === 0) {
+      let b;
+      if ((b = str.getByte()) === -1) {
+        this.#endsStreamOnError("Bad block header in flate stream");
+        return;
+      }
+      let blockLen = b;
+      if ((b = str.getByte()) === -1) {
+        this.#endsStreamOnError("Bad block header in flate stream");
+        return;
+      }
+      blockLen |= b << 8;
+      if ((b = str.getByte()) === -1) {
+        this.#endsStreamOnError("Bad block header in flate stream");
+        return;
+      }
+      let check = b;
+      if ((b = str.getByte()) === -1) {
+        this.#endsStreamOnError("Bad block header in flate stream");
+        return;
+      }
+      check |= b << 8;
+      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {
+        throw new FormatError("Bad uncompressed block length in flate stream");
+      }
+      this.codeBuf = 0;
+      this.codeSize = 0;
+      const bufferLength = this.bufferLength,
+        end = bufferLength + blockLen;
+      buffer = this.ensureBuffer(end);
+      this.bufferLength = end;
+      if (blockLen === 0) {
+        if (str.peekByte() === -1) {
+          this.eof = true;
+        }
+      } else {
+        const block = str.getBytes(blockLen);
+        buffer.set(block, bufferLength);
+        if (block.length < blockLen) {
+          this.eof = true;
+        }
+      }
+      return;
+    }
+    let litCodeTable;
+    let distCodeTable;
+    if (hdr === 1) {
+      litCodeTable = fixedLitCodeTab;
+      distCodeTable = fixedDistCodeTab;
+    } else if (hdr === 2) {
+      const numLitCodes = this.getBits(5) + 257;
+      const numDistCodes = this.getBits(5) + 1;
+      const numCodeLenCodes = this.getBits(4) + 4;
+      const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
+      let i;
+      for (i = 0; i < numCodeLenCodes; ++i) {
+        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
+      }
+      const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+      len = 0;
+      i = 0;
+      const codes = numLitCodes + numDistCodes;
+      const codeLengths = new Uint8Array(codes);
+      let bitsLength, bitsOffset, what;
+      while (i < codes) {
+        const code = this.getCode(codeLenCodeTab);
+        if (code === 16) {
+          bitsLength = 2;
+          bitsOffset = 3;
+          what = len;
+        } else if (code === 17) {
+          bitsLength = 3;
+          bitsOffset = 3;
+          what = len = 0;
+        } else if (code === 18) {
+          bitsLength = 7;
+          bitsOffset = 11;
+          what = len = 0;
+        } else {
+          codeLengths[i++] = len = code;
+          continue;
+        }
+        let repeatLength = this.getBits(bitsLength) + bitsOffset;
+        while (repeatLength-- > 0) {
+          codeLengths[i++] = what;
+        }
+      }
+      litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
+      distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
+    } else {
+      throw new FormatError("Unknown block type in flate stream");
+    }
+    buffer = this.buffer;
+    let limit = buffer ? buffer.length : 0;
+    let pos = this.bufferLength;
+    while (true) {
+      let code1 = this.getCode(litCodeTable);
+      if (code1 < 256) {
+        if (pos + 1 >= limit) {
+          buffer = this.ensureBuffer(pos + 1);
+          limit = buffer.length;
+        }
+        buffer[pos++] = code1;
+        continue;
+      }
+      if (code1 === 256) {
+        this.bufferLength = pos;
+        return;
+      }
+      code1 -= 257;
+      code1 = lengthDecode[code1];
+      let code2 = code1 >> 16;
+      if (code2 > 0) {
+        code2 = this.getBits(code2);
+      }
+      len = (code1 & 0xffff) + code2;
+      code1 = this.getCode(distCodeTable);
+      code1 = distDecode[code1];
+      code2 = code1 >> 16;
+      if (code2 > 0) {
+        code2 = this.getBits(code2);
+      }
+      const dist = (code1 & 0xffff) + code2;
+      if (pos + len >= limit) {
+        buffer = this.ensureBuffer(pos + len);
+        limit = buffer.length;
+      }
+      for (let k = 0; k < len; ++k, ++pos) {
+        buffer[pos] = buffer[pos - dist];
+      }
+    }
+  }
+}
+
+;// ./src/core/jbig2_stream.js
+
+
+
+
+
+class Jbig2Stream extends DecodeStream {
+  constructor(stream, maybeLength, params) {
+    super(maybeLength);
+    this.stream = stream;
+    this.dict = stream.dict;
+    this.maybeLength = maybeLength;
+    this.params = params;
+  }
+  get bytes() {
+    return shadow(this, "bytes", this.stream.getBytes(this.maybeLength));
+  }
+  ensureBuffer(requested) {}
+  get isAsyncDecoder() {
+    return true;
+  }
+  get isImageStream() {
+    return true;
+  }
+  static stripFileHeader(bytes) {
+    if (bytes.length >= 9 && bytes[0] === 0x97 && bytes[1] === 0x4a && bytes[2] === 0x42 && bytes[3] === 0x32 && bytes[4] === 0x0d && bytes[5] === 0x0a && bytes[6] === 0x1a && bytes[7] === 0x0a) {
+      const headerLength = (bytes[8] & 2) === 0 ? 13 : 9;
+      return bytes.subarray(headerLength);
+    }
+    return bytes;
+  }
+  async decodeImage(bytes, length, _decoderOptions) {
+    if (this.eof) {
+      return this.buffer;
+    }
+    bytes = Jbig2Stream.stripFileHeader(bytes || this.bytes);
+    let globals = null;
+    if (this.params instanceof Dict) {
+      const globalsStream = this.params.get("JBIG2Globals");
+      if (globalsStream instanceof BaseStream) {
+        globals = Jbig2Stream.stripFileHeader(globalsStream.getBytes());
+      }
+    }
+    this.buffer = await JBig2CCITTFaxImage.instance.decode(bytes, this.dict.get("Width"), this.dict.get("Height"), globals);
+    this.bufferLength = this.buffer.length;
+    this.eof = true;
+    return this.buffer;
+  }
+  get canAsyncDecodeImageFromBuffer() {
+    return this.stream.isAsync;
+  }
+}
+
+;// ./external/openjpeg/openjpeg.js
+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, readBinary;
+  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 ABORT = false;
+  var EXITSTATUS;
+  class EmscriptenEH {}
+  class EmscriptenSjLj extends EmscriptenEH {}
+  var readyPromiseResolve, readyPromiseReject;
+  var runtimeInitialized = false;
+  function updateMemoryViews() {
+    var b = wasmMemory.buffer;
+    HEAP8 = new Int8Array(b);
+    HEAP16 = new Int16Array(b);
+    HEAPU8 = new Uint8Array(b);
+    HEAPU16 = new Uint16Array(b);
+    HEAP32 = new Int32Array(b);
+    HEAPU32 = new Uint32Array(b);
+    HEAPF32 = new Float32Array(b);
+    HEAPF64 = new Float64Array(b);
+    HEAP64 = new BigInt64Array(b);
+    HEAPU64 = new BigUint64Array(b);
+  }
+  function preRun() {
+    if (Module["preRun"]) {
+      if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]];
+      while (Module["preRun"].length) {
+        addOnPreRun(Module["preRun"].shift());
+      }
+    }
+    callRuntimeCallbacks(onPreRuns);
+  }
+  function initRuntime() {
+    runtimeInitialized = true;
+    wasmExports["s"]();
+  }
+  function postRun() {
+    if (Module["postRun"]) {
+      if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]];
+      while (Module["postRun"].length) {
+        addOnPostRun(Module["postRun"].shift());
+      }
+    }
+    callRuntimeCallbacks(onPostRuns);
+  }
+  function abort(what) {
+    Module["onAbort"]?.(what);
+    what = `Aborted(${what})`;
+    err(what);
+    ABORT = true;
+    what += ". Build with -sASSERTIONS for more info.";
+    var e = new WebAssembly.RuntimeError(what);
+    readyPromiseReject?.(e);
+    throw e;
+  }
+  var wasmBinaryFile;
+  function getWasmImports() {
+    var imports = {
+      a: wasmImports
+    };
+    return imports;
+  }
+  async function createWasm() {
+    function receiveInstance(instance, module) {
+      wasmExports = instance.exports;
+      assignWasmExports(wasmExports);
+      updateMemoryViews();
+      return wasmExports;
+    }
+    var info = getWasmImports();
+    return new Promise((resolve, reject) => {
+      Module["instantiateWasm"](info, (inst, mod) => {
+        resolve(receiveInstance(inst, mod));
+      });
+    });
+  }
+  class ExitStatus {
+    name = "ExitStatus";
+    constructor(status) {
+      this.message = `Program terminated with exit(${status})`;
+      this.status = status;
+    }
+  }
+  var HEAP16;
+  var HEAP32;
+  var HEAP64;
+  var HEAP8;
+  var HEAPF32;
+  var HEAPF64;
+  var HEAPU16;
+  var HEAPU32;
+  var HEAPU64;
+  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 < nb_pixels; i++) {
+      imageData[3 * i] = compR[i];
+      imageData[3 * i + 1] = compG[i];
+      imageData[3 * i + 2] = compB[i];
+    }
+  }
+  function _copy_pixels_4(compR_ptr, compG_ptr, compB_ptr, compA_ptr, nb_pixels) {
+    compR_ptr >>= 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; i < nb_pixels; i++) {
+      imageData[4 * i] = compR[i];
+      imageData[4 * i + 1] = compG[i];
+      imageData[4 * i + 2] = compB[i];
+      imageData[4 * i + 3] = compA[i];
+    }
+  }
+  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;
+  };
+  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 < str.length; ++i) {
+      var u = str.codePointAt(i);
+      if (u <= 127) {
+        if (outIdx >= 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 < str.length; ++i) {
+      var c = str.charCodeAt(i);
+      if (c <= 127) {
+        len++;
+      } else if (c <= 2047) {
+        len += 2;
+      } else if (c >= 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 INT53_MAX = 9007199254740992;
+  var INT53_MIN = -9007199254740992;
+  var bigintToI53Checked = num => num < INT53_MIN || num > INT53_MAX ? NaN : Number(num);
+  function _fd_seek(fd, offset, whence, newOffset) {
+    offset = bigintToI53Checked(offset);
+    return 70;
+  }
+  var printCharBuffers = [null, [], []];
+  var UTF8Decoder = globalThis.TextDecoder && 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);
+    if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
+      return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
+    }
+    var str = "";
+    while (idx < endPtr) {
+      var u0 = heapOrArray[idx++];
+      if (!(u0 & 128)) {
+        str += String.fromCharCode(u0);
+        continue;
+      }
+      var u1 = heapOrArray[idx++] & 63;
+      if ((u0 & 224) == 192) {
+        str += String.fromCharCode((u0 & 31) << 6 | u1);
+        continue;
+      }
+      var u2 = heapOrArray[idx++] & 63;
+      if ((u0 & 240) == 224) {
+        u0 = (u0 & 15) << 12 | u1 << 6 | u2;
+      } else {
+        u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63;
+      }
+      if (u0 < 65536) {
+        str += String.fromCharCode(u0);
+      } else {
+        var ch = u0 - 65536;
+        str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
+      }
+    }
+    return str;
+  };
+  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) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : "";
+  var _fd_write = (fd, iov, iovcnt, pnum) => {
+    var num = 0;
+    for (var i = 0; i < iovcnt; i++) {
+      var ptr = HEAPU32[iov >> 2];
+      var len = HEAPU32[iov + 4 >> 2];
+      iov += 8;
+      for (var j = 0; j < len; j++) {
+        printChar(fd, HEAPU8[ptr + j]);
+      }
+      num += len;
+    }
+    HEAPU32[pnum >> 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 < nb_pixels; i++) {
+      imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i];
+      imageData[4 * i + 3] = 255;
+    }
+  }
+  function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) {
+    compG_ptr >>= 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 < nb_pixels; i++) {
+      imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i];
+      imageData[4 * i + 3] = compA[i];
+    }
+  }
+  function _jsPrintWarning(message_ptr) {
+    const message = UTF8ToString(message_ptr);
+    (Module.warn || console.warn)(`OpenJPEG: ${message}`);
+  }
+  function _rgb_to_rgba(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 * 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 < nb_pixels; i++) {
+      imageData[4 * i] = compR[i];
+      imageData[4 * i + 1] = compG[i];
+      imageData[4 * i + 2] = compB[i];
+      imageData[4 * i + 3] = 255;
+    }
+  }
+  function _storeErrorMessage(message_ptr) {
+    const message = UTF8ToString(message_ptr);
+    if (!Module.errorMessages) {
+      Module.errorMessages = message;
+    } else {
+      Module.errorMessages += "\n" + message;
+    }
+  }
+  var writeArrayToMemory = (array, buffer) => {
+    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, 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"];
+    memory = wasmMemory = wasmExports["r"];
+    __indirect_function_table = wasmExports["__indirect_function_table"];
+  }
+  var wasmImports = {
+    m: __abort_js,
+    l: __emscripten_runtime_keepalive_clear,
+    i: __setitimer_js,
+    f: _copy_pixels_1,
+    e: _copy_pixels_3,
+    d: _copy_pixels_4,
+    j: _emscripten_resize_heap,
+    o: _environ_get,
+    p: _environ_sizes_get,
+    n: _fd_seek,
+    b: _fd_write,
+    q: _gray_to_rgba,
+    h: _graya_to_rgba,
+    c: _jsPrintWarning,
+    k: _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 = await createWasm();
+  run();
+  if (runtimeInitialized) {
+    moduleRtn = Module;
+  } else {
+    moduleRtn = new Promise((resolve, reject) => {
+      readyPromiseResolve = resolve;
+      readyPromiseReject = reject;
+    });
+  }
+  return moduleRtn;
+}
+/* harmony default export */ const openjpeg = (OpenJPEG);
+;// ./src/core/jpx.js
+
+
+
+
+class JpxError extends BaseException {
+  constructor(msg) {
+    super(msg, "JpxError");
+  }
+}
+class JpxImage extends WasmImage {
+  _filename = "openjpeg.wasm";
+  _noWasmFilename = "openjpeg_nowasm_fallback.js";
+  static get instance() {
+    return shadow(this, "instance", new JpxImage(true));
+  }
+  async decode(bytes, {
+    numComponents = 4,
+    isIndexedColormap = false,
+    smaskInData = false,
+    reducePower = 0
+  } = {}) {
+    const module = await this._getModule(openjpeg);
+    if (!module) {
+      throw new JpxError("OpenJPEG failed to initialize");
+    }
+    let ptr;
+    try {
+      const size = bytes.length;
+      ptr = module._malloc(size);
+      module.writeArrayToMemory(bytes, ptr);
+      const ret = module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData, reducePower);
+      if (ret) {
+        const {
+          errorMessages
+        } = module;
+        if (errorMessages) {
+          delete module.errorMessages;
+          throw new JpxError(errorMessages);
+        }
+        throw new JpxError("Unknown error");
+      }
+      const {
+        imageData
+      } = module;
+      module.imageData = null;
+      return imageData;
+    } finally {
+      if (ptr) {
+        module._free(ptr);
+      }
+    }
+  }
+  static parseImageProperties(stream) {
+    let newByte = stream.getByte();
+    while (newByte >= 0) {
+      const oldByte = newByte;
+      newByte = stream.getByte();
+      const code = oldByte << 8 | newByte;
+      if (code === 0xff51) {
+        stream.skip(4);
+        const Xsiz = stream.getInt32() >>> 0;
+        const Ysiz = stream.getInt32() >>> 0;
+        const XOsiz = stream.getInt32() >>> 0;
+        const YOsiz = stream.getInt32() >>> 0;
+        stream.skip(16);
+        const Csiz = stream.getUint16();
+        return {
+          width: Xsiz - XOsiz,
+          height: Ysiz - YOsiz,
+          bitsPerComponent: 8,
+          componentsCount: Csiz
+        };
+      }
+    }
+    throw new JpxError("No size marker found in JPX stream");
+  }
+}
+
+;// ./src/core/jpx_stream.js
+
+
+
+class JpxStream extends DecodeStream {
+  constructor(stream, maybeLength) {
+    super(maybeLength);
+    this.stream = stream;
+    this.dict = stream.dict;
+    this.maybeLength = maybeLength;
+  }
+  get bytes() {
+    return shadow(this, "bytes", this.stream.getBytes(this.maybeLength));
+  }
+  ensureBuffer(requested) {}
+  get isAsyncDecoder() {
+    return true;
+  }
+  async decodeImage(bytes, _length, decoderOptions) {
+    if (this.eof) {
+      return this.buffer;
+    }
+    bytes ||= this.bytes;
+    this.buffer = await JpxImage.instance.decode(bytes, decoderOptions);
+    this.bufferLength = this.buffer.length;
+    this.eof = true;
+    return this.buffer;
+  }
+  get canAsyncDecodeImageFromBuffer() {
+    return this.stream.isAsync;
+  }
+  get isImageStream() {
+    return true;
+  }
+}
+
+;// ./src/core/lzw_stream.js
+
+class LZWStream extends DecodeStream {
+  constructor(str, maybeLength, earlyChange) {
+    super(maybeLength);
+    this.stream = str;
+    this.dict = str.dict;
+    this.cachedData = 0;
+    this.bitsCached = 0;
+    const maxLzwDictionarySize = 4096;
+    const lzwState = {
+      earlyChange,
+      codeLength: 9,
+      nextCode: 258,
+      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
+      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
+      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
+      currentSequence: new Uint8Array(maxLzwDictionarySize),
+      currentSequenceLength: 0
+    };
+    for (let i = 0; i < 256; ++i) {
+      lzwState.dictionaryValues[i] = i;
+      lzwState.dictionaryLengths[i] = 1;
+    }
+    this.lzwState = lzwState;
+  }
+  readBits(n) {
+    let bitsCached = this.bitsCached;
+    let cachedData = this.cachedData;
+    while (bitsCached < n) {
+      const c = this.stream.getByte();
+      if (c === -1) {
+        this.eof = true;
+        return null;
+      }
+      cachedData = cachedData << 8 | c;
+      bitsCached += 8;
+    }
+    this.bitsCached = bitsCached -= n;
+    this.cachedData = cachedData;
+    return cachedData >>> bitsCached & (1 << n) - 1;
+  }
+  readBlock() {
+    const blockSize = 512,
+      decodedSizeDelta = blockSize;
+    let estimatedDecodedSize = blockSize * 2;
+    let i, j, q;
+    const lzwState = this.lzwState;
+    if (!lzwState) {
+      return;
+    }
+    const earlyChange = lzwState.earlyChange;
+    let nextCode = lzwState.nextCode;
+    const dictionaryValues = lzwState.dictionaryValues;
+    const dictionaryLengths = lzwState.dictionaryLengths;
+    const dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
+    let codeLength = lzwState.codeLength;
+    let prevCode = lzwState.prevCode;
+    const currentSequence = lzwState.currentSequence;
+    let currentSequenceLength = lzwState.currentSequenceLength;
+    let decodedLength = 0;
+    let currentBufferLength = this.bufferLength;
+    let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+    for (i = 0; i < blockSize; i++) {
+      const code = this.readBits(codeLength);
+      const hasPrev = currentSequenceLength > 0;
+      if (code < 256) {
+        currentSequence[0] = code;
+        currentSequenceLength = 1;
+      } else if (code >= 258) {
+        if (code < nextCode) {
+          currentSequenceLength = dictionaryLengths[code];
+          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
+            currentSequence[j] = dictionaryValues[q];
+            q = dictionaryPrevCodes[q];
+          }
+        } else {
+          currentSequence[currentSequenceLength++] = currentSequence[0];
+        }
+      } else if (code === 256) {
+        codeLength = 9;
+        nextCode = 258;
+        currentSequenceLength = 0;
+        continue;
+      } else {
+        this.eof = true;
+        delete this.lzwState;
+        break;
+      }
+      if (hasPrev) {
+        dictionaryPrevCodes[nextCode] = prevCode;
+        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
+        dictionaryValues[nextCode] = currentSequence[0];
+        nextCode++;
+        codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;
+      }
+      prevCode = code;
+      decodedLength += currentSequenceLength;
+      if (estimatedDecodedSize < decodedLength) {
+        do {
+          estimatedDecodedSize += decodedSizeDelta;
+        } while (estimatedDecodedSize < decodedLength);
+        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+      }
+      for (j = 0; j < currentSequenceLength; j++) {
+        buffer[currentBufferLength++] = currentSequence[j];
+      }
+    }
+    lzwState.nextCode = nextCode;
+    lzwState.codeLength = codeLength;
+    lzwState.prevCode = prevCode;
+    lzwState.currentSequenceLength = currentSequenceLength;
+    this.bufferLength = currentBufferLength;
+  }
+}
+
+;// ./src/core/predictor_stream.js
+
+
+
+class PredictorStream extends DecodeStream {
+  constructor(str, maybeLength, params) {
+    super(maybeLength);
+    if (!(params instanceof Dict)) {
+      return str;
+    }
+    const predictor = this.predictor = params.get("Predictor") || 1;
+    if (predictor <= 1) {
+      return str;
+    }
+    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
+      throw new FormatError(`Unsupported predictor: ${predictor}`);
+    }
+    this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng;
+    this.stream = str;
+    this.dict = str.dict;
+    const colors = this.colors = params.get("Colors") || 1;
+    const bits = this.bits = params.get("BPC", "BitsPerComponent") || 8;
+    const columns = this.columns = params.get("Columns") || 1;
+    this.pixBytes = colors * bits + 7 >> 3;
+    this.rowBytes = columns * colors * bits + 7 >> 3;
+    return this;
+  }
+  readBlockTiff() {
+    const rowBytes = this.rowBytes;
+    const bufferLength = this.bufferLength;
+    const buffer = this.ensureBuffer(bufferLength + rowBytes);
+    const bits = this.bits;
+    const colors = this.colors;
+    const rawBytes = this.stream.getBytes(rowBytes);
+    this.eof = !rawBytes.length;
+    if (this.eof) {
+      return;
+    }
+    let inbuf = 0,
+      outbuf = 0;
+    let inbits = 0,
+      outbits = 0;
+    let pos = bufferLength;
+    let i;
+    if (bits === 1 && colors === 1) {
+      for (i = 0; i < rowBytes; ++i) {
+        let c = rawBytes[i] ^ inbuf;
+        c ^= c >> 1;
+        c ^= c >> 2;
+        c ^= c >> 4;
+        inbuf = (c & 1) << 7;
+        buffer[pos++] = c;
+      }
+    } else if (bits === 8) {
+      for (i = 0; i < colors; ++i) {
+        buffer[pos++] = rawBytes[i];
+      }
+      for (; i < rowBytes; ++i) {
+        buffer[pos] = buffer[pos - colors] + rawBytes[i];
+        pos++;
+      }
+    } else if (bits === 16) {
+      const bytesPerPixel = colors * 2;
+      for (i = 0; i < bytesPerPixel; ++i) {
+        buffer[pos++] = rawBytes[i];
+      }
+      for (; i < rowBytes; i += 2) {
+        const sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff);
+        buffer[pos++] = sum >> 8 & 0xff;
+        buffer[pos++] = sum & 0xff;
+      }
+    } else {
+      const compArray = new Uint8Array(colors + 1);
+      const bitMask = (1 << bits) - 1;
+      let j = 0,
+        k = bufferLength;
+      const columns = this.columns;
+      for (i = 0; i < columns; ++i) {
+        for (let kk = 0; kk < colors; ++kk) {
+          if (inbits < bits) {
+            inbuf = inbuf << 8 | rawBytes[j++] & 0xff;
+            inbits += 8;
+          }
+          compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;
+          inbits -= bits;
+          outbuf = outbuf << bits | compArray[kk];
+          outbits += bits;
+          if (outbits >= 8) {
+            buffer[k++] = outbuf >> outbits - 8 & 0xff;
+            outbits -= 8;
+          }
+        }
+      }
+      if (outbits > 0) {
+        buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);
+      }
+    }
+    this.bufferLength += rowBytes;
+  }
+  readBlockPng() {
+    const rowBytes = this.rowBytes;
+    const pixBytes = this.pixBytes;
+    const predictor = this.stream.getByte();
+    const rawBytes = this.stream.getBytes(rowBytes);
+    this.eof = !rawBytes.length;
+    if (this.eof) {
+      return;
+    }
+    const bufferLength = this.bufferLength;
+    const buffer = this.ensureBuffer(bufferLength + rowBytes);
+    let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
+    if (prevRow.length === 0) {
+      prevRow = new Uint8Array(rowBytes);
+    }
+    let i,
+      j = bufferLength,
+      up,
+      c;
+    switch (predictor) {
+      case 0:
+        for (i = 0; i < rowBytes; ++i) {
+          buffer[j++] = rawBytes[i];
+        }
+        break;
+      case 1:
+        for (i = 0; i < pixBytes; ++i) {
+          buffer[j++] = rawBytes[i];
+        }
+        for (; i < rowBytes; ++i) {
+          buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff;
+          j++;
+        }
+        break;
+      case 2:
+        for (i = 0; i < rowBytes; ++i) {
+          buffer[j++] = prevRow[i] + rawBytes[i] & 0xff;
+        }
+        break;
+      case 3:
+        for (i = 0; i < pixBytes; ++i) {
+          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
+        }
+        for (; i < rowBytes; ++i) {
+          buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff;
+          j++;
+        }
+        break;
+      case 4:
+        for (i = 0; i < pixBytes; ++i) {
+          up = prevRow[i];
+          c = rawBytes[i];
+          buffer[j++] = up + c;
+        }
+        for (; i < rowBytes; ++i) {
+          up = prevRow[i];
+          const upLeft = prevRow[i - pixBytes];
+          const left = buffer[j - pixBytes];
+          const p = left + up - upLeft;
+          let pa = p - left;
+          if (pa < 0) {
+            pa = -pa;
+          }
+          let pb = p - up;
+          if (pb < 0) {
+            pb = -pb;
+          }
+          let pc = p - upLeft;
+          if (pc < 0) {
+            pc = -pc;
+          }
+          c = rawBytes[i];
+          if (pa <= pb && pa <= pc) {
+            buffer[j++] = left + c;
+          } else if (pb <= pc) {
+            buffer[j++] = up + c;
+          } else {
+            buffer[j++] = upLeft + c;
+          }
+        }
+        break;
+      default:
+        throw new FormatError(`Unsupported predictor: ${predictor}`);
+    }
+    this.bufferLength += rowBytes;
+  }
+}
+
+;// ./src/core/run_length_stream.js
+
+class RunLengthStream extends DecodeStream {
+  constructor(str, maybeLength) {
+    super(maybeLength);
+    this.stream = str;
+    this.dict = str.dict;
+  }
+  readBlock() {
+    const repeatHeader = this.stream.getBytes(2);
+    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
+      this.eof = true;
+      return;
+    }
+    let buffer;
+    let bufferLength = this.bufferLength;
+    let n = repeatHeader[0];
+    if (n < 128) {
+      buffer = this.ensureBuffer(bufferLength + n + 1);
+      buffer[bufferLength++] = repeatHeader[1];
+      if (n > 0) {
+        const source = this.stream.getBytes(n);
+        buffer.set(source, bufferLength);
+        bufferLength += n;
+      }
+    } else {
+      n = 257 - n;
+      buffer = this.ensureBuffer(bufferLength + n + 1);
+      buffer.fill(repeatHeader[1], bufferLength, bufferLength + n);
+      bufferLength += n;
+    }
+    this.bufferLength = bufferLength;
+  }
+}
+
+;// ./src/core/parser.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const MAX_LENGTH_TO_CACHE = 1000;
+function getInlineImageCacheKey(bytes) {
+  const strBuf = [],
+    ii = bytes.length;
+  let i = 0;
+  while (i < ii - 1) {
+    strBuf.push(bytes[i++] << 8 | bytes[i++]);
+  }
+  if (i < ii) {
+    strBuf.push(bytes[i]);
+  }
+  return ii + "_" + String.fromCharCode.apply(null, strBuf);
+}
+class Parser {
+  constructor({
+    lexer,
+    xref,
+    allowStreams = false,
+    recoveryMode = false
+  }) {
+    this.lexer = lexer;
+    this.xref = xref;
+    this.allowStreams = allowStreams;
+    this.recoveryMode = recoveryMode;
+    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 && this.buf2.cmd === "ID") {
+      this.buf1 = this.buf2;
+      this.buf2 = null;
+    } else {
+      this.buf1 = this.buf2;
+      this.buf2 = this.lexer.getObj();
+    }
+  }
+  tryShift() {
+    try {
+      this.shift();
+      return true;
+    } catch (e) {
+      if (e instanceof MissingDataException) {
+        throw e;
+      }
+      return false;
+    }
+  }
+  getObj(cipherTransform = null) {
+    const buf1 = this.buf1;
+    this.shift();
+    if (buf1 instanceof Cmd) {
+      switch (buf1.cmd) {
+        case "BI":
+          return this.makeInlineImage(cipherTransform);
+        case "[":
+          const array = [];
+          while (!isCmd(this.buf1, "]") && this.buf1 !== EOF) {
+            array.push(this.getObj(cipherTransform));
+          }
+          if (this.buf1 === EOF) {
+            if (this.recoveryMode) {
+              return array;
+            }
+            throw new ParserEOFException("End of file inside array.");
+          }
+          this.shift();
+          return array;
+        case "<<":
+          const dict = new Dict(this.xref);
+          while (!isCmd(this.buf1, ">>") && this.buf1 !== EOF) {
+            if (!(this.buf1 instanceof Name)) {
+              info("Malformed dictionary: key must be a name object");
+              this.shift();
+              continue;
+            }
+            const key = this.buf1.name;
+            this.shift();
+            if (this.buf1 === EOF) {
+              break;
+            }
+            dict.set(key, this.getObj(cipherTransform));
+          }
+          if (this.buf1 === EOF) {
+            if (this.recoveryMode) {
+              return dict;
+            }
+            throw new ParserEOFException("End of file inside dictionary.");
+          }
+          if (isCmd(this.buf2, "stream")) {
+            return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;
+          }
+          this.shift();
+          return dict;
+        default:
+          return buf1;
+      }
+    }
+    if (Number.isInteger(buf1)) {
+      if (Number.isInteger(this.buf1) && isCmd(this.buf2, "R")) {
+        const ref = Ref.get(buf1, this.buf1);
+        this.shift();
+        this.shift();
+        return ref;
+      }
+      return buf1;
+    }
+    if (typeof buf1 === "string") {
+      if (cipherTransform) {
+        return cipherTransform.decryptString(buf1);
+      }
+      return buf1;
+    }
+    return buf1;
+  }
+  findDefaultInlineStreamEnd(stream) {
+    const E = 0x45,
+      I = 0x49,
+      SPACE = 0x20,
+      LF = 0xa,
+      CR = 0xd,
+      NUL = 0x0;
+    const {
+        knownCommands
+      } = this.lexer,
+      startPos = stream.pos,
+      n = 15;
+    let state = 0,
+      ch,
+      maybeEIPos;
+    while ((ch = stream.getByte()) !== -1) {
+      if (state === 0) {
+        state = ch === E ? 1 : 0;
+      } else if (state === 1) {
+        state = ch === I ? 2 : 0;
+      } else {
+        if (ch === SPACE || ch === LF || ch === CR) {
+          maybeEIPos = stream.pos;
+          const followingBytes = stream.peekBytes(n);
+          const ii = followingBytes.length;
+          if (ii === 0) {
+            break;
+          }
+          for (let i = 0; i < ii; i++) {
+            ch = followingBytes[i];
+            if (ch === NUL && followingBytes[i + 1] !== NUL) {
+              continue;
+            }
+            if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) {
+              state = 0;
+              break;
+            }
+          }
+          if (state !== 2) {
+            continue;
+          }
+          if (!knownCommands) {
+            warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");
+            continue;
+          }
+          const tmpLexer = new Lexer(new Stream(stream.peekBytes(5 * n)), knownCommands);
+          tmpLexer._hexStringWarn = () => {};
+          let numArgs = 0;
+          while (true) {
+            const nextObj = tmpLexer.getObj();
+            if (nextObj === EOF) {
+              state = 0;
+              break;
+            }
+            if (nextObj instanceof Cmd) {
+              const knownCommand = knownCommands[nextObj.cmd];
+              if (!knownCommand) {
+                state = 0;
+                break;
+              } else if (knownCommand.variableArgs ? numArgs <= knownCommand.numArgs : numArgs === knownCommand.numArgs) {
+                break;
+              }
+              numArgs = 0;
+              continue;
+            }
+            numArgs++;
+          }
+          if (state === 2) {
+            break;
+          }
+        } else {
+          state = 0;
+        }
+      }
+    }
+    if (ch === -1) {
+      warn("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a valid EI marker");
+      if (maybeEIPos) {
+        warn('... trying to recover by using the last "EI" occurrence.');
+        stream.skip(-(stream.pos - maybeEIPos));
+      }
+    }
+    let endOffset = 4;
+    stream.skip(-endOffset);
+    ch = stream.peekByte();
+    stream.skip(endOffset);
+    if (!isWhiteSpace(ch)) {
+      endOffset--;
+    }
+    return stream.pos - endOffset - startPos;
+  }
+  findDCTDecodeInlineStreamEnd(stream) {
+    const startPos = stream.pos;
+    let foundEOI = false,
+      b,
+      markerLength;
+    while ((b = stream.getByte()) !== -1) {
+      if (b !== 0xff) {
+        continue;
+      }
+      switch (stream.getByte()) {
+        case 0x00:
+          break;
+        case 0xff:
+          stream.skip(-1);
+          break;
+        case 0xd9:
+          foundEOI = true;
+          break;
+        case 0xc0:
+        case 0xc1:
+        case 0xc2:
+        case 0xc3:
+        case 0xc5:
+        case 0xc6:
+        case 0xc7:
+        case 0xc9:
+        case 0xca:
+        case 0xcb:
+        case 0xcd:
+        case 0xce:
+        case 0xcf:
+        case 0xc4:
+        case 0xcc:
+        case 0xda:
+        case 0xdb:
+        case 0xdc:
+        case 0xdd:
+        case 0xde:
+        case 0xdf:
+        case 0xe0:
+        case 0xe1:
+        case 0xe2:
+        case 0xe3:
+        case 0xe4:
+        case 0xe5:
+        case 0xe6:
+        case 0xe7:
+        case 0xe8:
+        case 0xe9:
+        case 0xea:
+        case 0xeb:
+        case 0xec:
+        case 0xed:
+        case 0xee:
+        case 0xef:
+        case 0xfe:
+          markerLength = stream.getUint16();
+          if (markerLength > 2) {
+            stream.skip(markerLength - 2);
+          } else {
+            stream.skip(-2);
+          }
+          break;
+      }
+      if (foundEOI) {
+        break;
+      }
+    }
+    const length = stream.pos - startPos;
+    if (b === -1) {
+      warn("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ instead.");
+      stream.skip(-length);
+      return this.findDefaultInlineStreamEnd(stream);
+    }
+    this.inlineStreamSkipEI(stream);
+    return length;
+  }
+  findASCII85DecodeInlineStreamEnd(stream) {
+    const TILDE = 0x7e,
+      GT = 0x3e;
+    const startPos = stream.pos;
+    let ch;
+    while ((ch = stream.getByte()) !== -1) {
+      if (ch === TILDE) {
+        const tildePos = stream.pos;
+        ch = stream.peekByte();
+        while (isWhiteSpace(ch)) {
+          stream.skip();
+          ch = stream.peekByte();
+        }
+        if (ch === GT) {
+          stream.skip();
+          break;
+        }
+        if (stream.pos > tildePos) {
+          const maybeEI = stream.peekBytes(2);
+          if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) {
+            break;
+          }
+        }
+      }
+    }
+    const length = stream.pos - startPos;
+    if (ch === -1) {
+      warn("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ instead.");
+      stream.skip(-length);
+      return this.findDefaultInlineStreamEnd(stream);
+    }
+    this.inlineStreamSkipEI(stream);
+    return length;
+  }
+  findASCIIHexDecodeInlineStreamEnd(stream) {
+    const GT = 0x3e;
+    const startPos = stream.pos;
+    let ch;
+    while ((ch = stream.getByte()) !== -1) {
+      if (ch === GT) {
+        break;
+      }
+    }
+    const length = stream.pos - startPos;
+    if (ch === -1) {
+      warn("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ instead.");
+      stream.skip(-length);
+      return this.findDefaultInlineStreamEnd(stream);
+    }
+    this.inlineStreamSkipEI(stream);
+    return length;
+  }
+  inlineStreamSkipEI(stream) {
+    const E = 0x45,
+      I = 0x49;
+    let state = 0,
+      ch;
+    while ((ch = stream.getByte()) !== -1) {
+      if (state === 0) {
+        state = ch === E ? 1 : 0;
+      } else if (state === 1) {
+        state = ch === I ? 2 : 0;
+      } else if (state === 2) {
+        break;
+      }
+    }
+  }
+  makeInlineImage(cipherTransform) {
+    const lexer = this.lexer;
+    const stream = lexer.stream;
+    const dictMap = Object.create(null);
+    let dictLength;
+    while (!isCmd(this.buf1, "ID") && this.buf1 !== EOF) {
+      if (!(this.buf1 instanceof Name)) {
+        throw new FormatError("Dictionary key must be a name object");
+      }
+      const key = this.buf1.name;
+      this.shift();
+      if (this.buf1 === EOF) {
+        break;
+      }
+      dictMap[key] = this.getObj(cipherTransform);
+    }
+    if (lexer.beginInlineImagePos !== -1) {
+      dictLength = stream.pos - lexer.beginInlineImagePos;
+    }
+    const filter = this.#fetchIfRef(dictMap.F || dictMap.Filter);
+    let filterName;
+    if (filter instanceof Name) {
+      filterName = filter.name;
+    } else if (Array.isArray(filter)) {
+      const filterZero = this.#fetchIfRef(filter[0]);
+      if (filterZero instanceof Name) {
+        filterName = filterZero.name;
+      }
+    }
+    const startPos = stream.pos;
+    let length;
+    switch (filterName) {
+      case "DCT":
+      case "DCTDecode":
+        length = this.findDCTDecodeInlineStreamEnd(stream);
+        break;
+      case "A85":
+      case "ASCII85Decode":
+        length = this.findASCII85DecodeInlineStreamEnd(stream);
+        break;
+      case "AHx":
+      case "ASCIIHexDecode":
+        length = this.findASCIIHexDecodeInlineStreamEnd(stream);
+        break;
+      default:
+        length = this.findDefaultInlineStreamEnd(stream);
+    }
+    let cacheKey;
+    if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) {
+      const initialStreamPos = stream.pos;
+      stream.pos = lexer.beginInlineImagePos;
+      cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length));
+      stream.pos = initialStreamPos;
+      const cacheEntry = this.imageCache[cacheKey];
+      if (cacheEntry !== undefined) {
+        this.buf2 = Cmd.get("EI");
+        this.shift();
+        cacheEntry.reset();
+        return cacheEntry;
+      }
+    }
+    const dict = new Dict(this.xref);
+    for (const key in dictMap) {
+      dict.set(key, dictMap[key]);
+    }
+    let imageStream = stream.makeSubStream(startPos, length, dict);
+    if (cipherTransform && !this.#hasCryptFilter(filter)) {
+      imageStream = cipherTransform.createStream(imageStream, length);
+    }
+    imageStream = this.filter(imageStream, dict, length, cipherTransform);
+    imageStream.dict = dict;
+    if (cacheKey !== undefined) {
+      imageStream.cacheKey = `inline_img_${++this._imageId}`;
+      this.imageCache[cacheKey] = imageStream;
+    }
+    this.buf2 = Cmd.get("EI");
+    this.shift();
+    return imageStream;
+  }
+  #fetchIfRef(obj) {
+    return this.xref ? this.xref.fetchIfRef(obj) : obj;
+  }
+  #hasCryptFilter(filter) {
+    if (!Array.isArray(filter)) {
+      return isName(filter, "Crypt");
+    }
+    for (const f of filter) {
+      if (isName(this.#fetchIfRef(f), "Crypt")) {
+        return true;
+      }
+    }
+    return false;
+  }
+  #findStreamLength(startPos) {
+    const {
+      stream
+    } = this.lexer;
+    stream.pos = startPos;
+    const SCAN_BLOCK_LENGTH = 2048;
+    const signatureLength = "endstream".length;
+    const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]);
+    const endLength = END_SIGNATURE.length;
+    const PARTIAL_SIGNATURE = [new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61])];
+    const normalLength = signatureLength - endLength;
+    while (stream.pos < stream.end) {
+      const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
+      const scanLength = scanBytes.length - signatureLength;
+      if (scanLength <= 0) {
+        break;
+      }
+      let pos = 0;
+      while (pos < scanLength) {
+        let j = 0;
+        while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) {
+          j++;
+        }
+        if (j >= endLength) {
+          let found = false;
+          for (const part of PARTIAL_SIGNATURE) {
+            const partLen = part.length;
+            let k = 0;
+            while (k < partLen && scanBytes[pos + j + k] === part[k]) {
+              k++;
+            }
+            if (k >= normalLength) {
+              found = true;
+              break;
+            }
+            if (k >= partLen) {
+              const lastByte = scanBytes[pos + j + k];
+              if (isWhiteSpace(lastByte)) {
+                info(`Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + "searching for endstream command.");
+                found = true;
+              }
+              break;
+            }
+          }
+          if (found) {
+            stream.pos += pos;
+            return stream.pos - startPos;
+          }
+        }
+        pos++;
+      }
+      stream.pos += scanLength;
+    }
+    return -1;
+  }
+  makeStream(dict, cipherTransform) {
+    const lexer = this.lexer;
+    let stream = lexer.stream;
+    lexer.skipToNextLine();
+    const startPos = stream.pos - 1;
+    let length = dict.get("Length");
+    if (!Number.isInteger(length)) {
+      info(`Bad length "${length && length.toString()}" in stream.`);
+      length = 0;
+    }
+    stream.pos = startPos + length;
+    lexer.nextChar();
+    if (this.tryShift() && isCmd(this.buf2, "endstream")) {
+      this.shift();
+    } else {
+      length = this.#findStreamLength(startPos);
+      if (length < 0) {
+        throw new FormatError("Missing endstream command.");
+      }
+      lexer.nextChar();
+      this.shift();
+      this.shift();
+    }
+    this.shift();
+    stream = stream.makeSubStream(startPos, length, dict);
+    const filter = dict.get("F", "Filter");
+    if (cipherTransform && !this.#hasCryptFilter(filter)) {
+      stream = cipherTransform.createStream(stream, length);
+    }
+    stream = this.filter(stream, dict, length, cipherTransform);
+    stream.dict = dict;
+    return stream;
+  }
+  filter(stream, dict, length, cipherTransform = null) {
+    let filter = dict.get("F", "Filter");
+    let params = dict.get("DP", "DecodeParms");
+    if (filter instanceof Name) {
+      if (Array.isArray(params)) {
+        warn("/DecodeParms should not be an Array, when /Filter is a Name.");
+      }
+      return this.makeFilter(stream, filter.name, length, params, cipherTransform);
+    }
+    let maybeLength = length;
+    if (Array.isArray(filter)) {
+      const filterArray = filter;
+      const paramsArray = params;
+      for (let i = 0, ii = filterArray.length; i < ii; ++i) {
+        filter = this.#fetchIfRef(filterArray[i]);
+        if (!(filter instanceof Name)) {
+          throw new FormatError(`Bad filter name "${filter}"`);
+        }
+        params = null;
+        if (Array.isArray(paramsArray) && i in paramsArray) {
+          params = this.#fetchIfRef(paramsArray[i]);
+        }
+        stream = this.makeFilter(stream, filter.name, maybeLength, params, cipherTransform);
+        maybeLength = null;
+      }
+    }
+    return stream;
+  }
+  makeFilter(stream, name, maybeLength, params, cipherTransform = null) {
+    if (maybeLength === 0) {
+      warn(`Empty "${name}" stream.`);
+      return new NullStream();
+    }
+    try {
+      switch (name) {
+        case "Fl":
+        case "FlateDecode":
+          if (params) {
+            return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params);
+          }
+          return new FlateStream(stream, maybeLength);
+        case "LZW":
+        case "LZWDecode":
+          let earlyChange = 1;
+          if (params) {
+            if (params.has("EarlyChange")) {
+              earlyChange = params.get("EarlyChange");
+            }
+            return new PredictorStream(new LZWStream(stream, maybeLength, earlyChange), maybeLength, params);
+          }
+          return new LZWStream(stream, maybeLength, earlyChange);
+        case "DCT":
+        case "DCTDecode":
+          return new JpegStream(stream, maybeLength, params);
+        case "JPX":
+        case "JPXDecode":
+          return new JpxStream(stream, maybeLength);
+        case "A85":
+        case "ASCII85Decode":
+          return new Ascii85Stream(stream, maybeLength);
+        case "AHx":
+        case "ASCIIHexDecode":
+          return new AsciiHexStream(stream, maybeLength);
+        case "CCF":
+        case "CCITTFaxDecode":
+          return new CCITTFaxStream(stream, maybeLength, params);
+        case "RL":
+        case "RunLengthDecode":
+          return new RunLengthStream(stream, maybeLength);
+        case "JBIG2Decode":
+          return new Jbig2Stream(stream, maybeLength, params);
+        case "BrotliDecode":
+          return new BrotliStream(stream, maybeLength);
+        case "Crypt":
+          {
+            if (!cipherTransform) {
+              warn('Filter "Crypt" is missing a cipher transform.');
+              return stream;
+            }
+            const param = params instanceof Dict ? params.get("Name") : null;
+            const cryptName = param instanceof Name ? param : Name.get("Identity");
+            return cipherTransform.createStream(stream, maybeLength, cryptName);
+          }
+      }
+      warn(`Filter "${name}" is not supported.`);
+      return stream;
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn(`Invalid stream: "${ex}"`);
+      return new NullStream();
+    }
+  }
+}
+const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 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, 2, 0, 2, 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, 2, 0, 2, 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, 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];
+function toHexDigit(ch) {
+  if (ch >= 0x30 && ch <= 0x39) {
+    return ch & 0x0f;
+  }
+  if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
+    return (ch & 0x0f) + 9;
+  }
+  return -1;
+}
+class Lexer {
+  constructor(stream, knownCommands = null) {
+    this.stream = stream;
+    this.nextChar();
+    this.strBuf = [];
+    this.knownCommands = knownCommands;
+    this._hexStringNumWarn = 0;
+    this.beginInlineImagePos = -1;
+  }
+  nextChar() {
+    return this.currentChar = this.stream.getByte();
+  }
+  peekChar() {
+    return this.stream.peekByte();
+  }
+  getNumber() {
+    let ch = this.currentChar;
+    let divideBy = 0;
+    let sign = 1;
+    if (ch === 0x2d) {
+      sign = -1;
+      ch = this.nextChar();
+      if (ch === 0x2d) {
+        ch = this.nextChar();
+      }
+    } else if (ch === 0x2b) {
+      ch = this.nextChar();
+    }
+    if (ch === 0x0a || ch === 0x0d) {
+      do {
+        ch = this.nextChar();
+      } while (ch === 0x0a || ch === 0x0d);
+    }
+    if (ch === 0x2e) {
+      divideBy = 10;
+      ch = this.nextChar();
+    }
+    if (ch < 0x30 || ch > 0x39) {
+      const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`;
+      if (isWhiteSpace(ch) || ch === 0x28 || ch === 0x3c || ch === -1) {
+        info(`Lexer.getNumber - "${msg}".`);
+        return 0;
+      }
+      throw new FormatError(msg);
+    }
+    let baseValue = ch - 0x30;
+    while ((ch = this.nextChar()) >= 0) {
+      if (ch >= 0x30 && ch <= 0x39) {
+        const currentDigit = ch - 0x30;
+        if (divideBy !== 0) {
+          divideBy *= 10;
+        }
+        baseValue = baseValue * 10 + currentDigit;
+      } else if (ch === 0x2e) {
+        if (divideBy === 0) {
+          divideBy = 1;
+        } else {
+          break;
+        }
+      } else if (ch === 0x2d) {
+        warn("Badly formatted number: minus sign in the middle");
+      } else {
+        break;
+      }
+    }
+    if (divideBy !== 0) {
+      baseValue /= divideBy;
+    }
+    return sign * baseValue;
+  }
+  getString() {
+    let numParen = 1;
+    let done = false;
+    const strBuf = this.strBuf;
+    strBuf.length = 0;
+    let ch = this.nextChar();
+    while (true) {
+      let charBuffered = false;
+      switch (ch | 0) {
+        case -1:
+          warn("Unterminated string");
+          done = true;
+          break;
+        case 0x28:
+          ++numParen;
+          strBuf.push("(");
+          break;
+        case 0x29:
+          if (--numParen === 0) {
+            this.nextChar();
+            done = true;
+          } else {
+            strBuf.push(")");
+          }
+          break;
+        case 0x5c:
+          ch = this.nextChar();
+          switch (ch) {
+            case -1:
+              warn("Unterminated string");
+              done = true;
+              break;
+            case 0x6e:
+              strBuf.push("\n");
+              break;
+            case 0x72:
+              strBuf.push("\r");
+              break;
+            case 0x74:
+              strBuf.push("\t");
+              break;
+            case 0x62:
+              strBuf.push("\b");
+              break;
+            case 0x66:
+              strBuf.push("\f");
+              break;
+            case 0x5c:
+            case 0x28:
+            case 0x29:
+              strBuf.push(String.fromCharCode(ch));
+              break;
+            case 0x30:
+            case 0x31:
+            case 0x32:
+            case 0x33:
+            case 0x34:
+            case 0x35:
+            case 0x36:
+            case 0x37:
+              let x = ch & 0x0f;
+              ch = this.nextChar();
+              charBuffered = true;
+              if (ch >= 0x30 && ch <= 0x37) {
+                x = (x << 3) + (ch & 0x0f);
+                ch = this.nextChar();
+                if (ch >= 0x30 && ch <= 0x37) {
+                  charBuffered = false;
+                  x = (x << 3) + (ch & 0x0f);
+                }
+              }
+              strBuf.push(String.fromCharCode(x));
+              break;
+            case 0x0d:
+              if (this.peekChar() === 0x0a) {
+                this.nextChar();
+              }
+              break;
+            case 0x0a:
+              break;
+            default:
+              strBuf.push(String.fromCharCode(ch));
+              break;
+          }
+          break;
+        default:
+          strBuf.push(String.fromCharCode(ch));
+          break;
+      }
+      if (done) {
+        break;
+      }
+      if (!charBuffered) {
+        ch = this.nextChar();
+      }
+    }
+    return strBuf.join("");
+  }
+  getName() {
+    let ch, previousCh;
+    const strBuf = this.strBuf;
+    strBuf.length = 0;
+    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+      if (ch === 0x23) {
+        ch = this.nextChar();
+        if (specialChars[ch]) {
+          warn("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number.");
+          strBuf.push("#");
+          break;
+        }
+        const x = toHexDigit(ch);
+        if (x !== -1) {
+          previousCh = ch;
+          ch = this.nextChar();
+          const x2 = toHexDigit(ch);
+          if (x2 === -1) {
+            warn(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number.");
+            strBuf.push("#", String.fromCharCode(previousCh));
+            if (specialChars[ch]) {
+              break;
+            }
+            strBuf.push(String.fromCharCode(ch));
+            continue;
+          }
+          strBuf.push(String.fromCharCode(x << 4 | x2));
+        } else {
+          strBuf.push("#", String.fromCharCode(ch));
+        }
+      } else {
+        strBuf.push(String.fromCharCode(ch));
+      }
+    }
+    if (strBuf.length > 127) {
+      warn(`Name token is longer than allowed by the spec: ${strBuf.length}`);
+    }
+    return Name.get(strBuf.join(""));
+  }
+  _hexStringWarn(ch) {
+    const MAX_HEX_STRING_NUM_WARN = 5;
+    if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) {
+      warn("getHexString - ignoring additional invalid characters.");
+      return;
+    }
+    if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) {
+      return;
+    }
+    warn(`getHexString - ignoring invalid character: ${ch}`);
+  }
+  getHexString() {
+    const strBuf = this.strBuf;
+    strBuf.length = 0;
+    let ch = this.currentChar;
+    let firstDigit = -1,
+      digit = -1;
+    this._hexStringNumWarn = 0;
+    while (true) {
+      if (ch < 0) {
+        warn("Unterminated hex string");
+        break;
+      } else if (ch === 0x3e) {
+        this.nextChar();
+        break;
+      } else if (specialChars[ch] === 1) {
+        ch = this.nextChar();
+        continue;
+      } else {
+        digit = toHexDigit(ch);
+        if (digit === -1) {
+          this._hexStringWarn(ch);
+        } else if (firstDigit === -1) {
+          firstDigit = digit;
+        } else {
+          strBuf.push(String.fromCharCode(firstDigit << 4 | digit));
+          firstDigit = -1;
+        }
+        ch = this.nextChar();
+      }
+    }
+    if (firstDigit !== -1) {
+      strBuf.push(String.fromCharCode(firstDigit << 4));
+    }
+    return strBuf.join("");
+  }
+  getObj() {
+    let comment = false;
+    let ch = this.currentChar;
+    while (true) {
+      if (ch < 0) {
+        return EOF;
+      }
+      if (comment) {
+        if (ch === 0x0a || ch === 0x0d) {
+          comment = false;
+        }
+      } else if (ch === 0x25) {
+        comment = true;
+      } else if (specialChars[ch] !== 1) {
+        break;
+      }
+      ch = this.nextChar();
+    }
+    switch (ch | 0) {
+      case 0x30:
+      case 0x31:
+      case 0x32:
+      case 0x33:
+      case 0x34:
+      case 0x35:
+      case 0x36:
+      case 0x37:
+      case 0x38:
+      case 0x39:
+      case 0x2b:
+      case 0x2d:
+      case 0x2e:
+        return this.getNumber();
+      case 0x28:
+        return this.getString();
+      case 0x2f:
+        return this.getName();
+      case 0x5b:
+        this.nextChar();
+        return Cmd.get("[");
+      case 0x5d:
+        this.nextChar();
+        return Cmd.get("]");
+      case 0x3c:
+        ch = this.nextChar();
+        if (ch === 0x3c) {
+          this.nextChar();
+          return Cmd.get("<<");
+        }
+        return this.getHexString();
+      case 0x3e:
+        ch = this.nextChar();
+        if (ch === 0x3e) {
+          this.nextChar();
+          return Cmd.get(">>");
+        }
+        return Cmd.get(">");
+      case 0x7b:
+        this.nextChar();
+        return Cmd.get("{");
+      case 0x7d:
+        this.nextChar();
+        return Cmd.get("}");
+      case 0x29:
+        this.nextChar();
+        throw new FormatError(`Illegal character: ${ch}`);
+    }
+    let str = String.fromCharCode(ch);
+    if (ch < 0x20 || ch > 0x7f) {
+      const nextCh = this.peekChar();
+      if (nextCh >= 0x20 && nextCh <= 0x7f) {
+        this.nextChar();
+        return Cmd.get(str);
+      }
+    }
+    const knownCommands = this.knownCommands;
+    let knownCommandFound = knownCommands?.[str] !== undefined;
+    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+      const possibleCommand = str + String.fromCharCode(ch);
+      if (knownCommandFound && knownCommands[possibleCommand] === undefined) {
+        break;
+      }
+      if (str.length === 128) {
+        throw new FormatError(`Command token too long: ${str.length}`);
+      }
+      str = possibleCommand;
+      knownCommandFound = knownCommands?.[str] !== undefined;
+    }
+    if (str === "true") {
+      return true;
+    }
+    if (str === "false") {
+      return false;
+    }
+    if (str === "null") {
+      return null;
+    }
+    if (str === "BI") {
+      this.beginInlineImagePos = this.stream.pos;
+    }
+    return Cmd.get(str);
+  }
+  skipToNextLine() {
+    let ch = this.currentChar;
+    while (ch >= 0) {
+      if (ch === 0x0d) {
+        ch = this.nextChar();
+        if (ch === 0x0a) {
+          this.nextChar();
+        }
+        break;
+      } else if (ch === 0x0a) {
+        this.nextChar();
+        break;
+      }
+      ch = this.nextChar();
+    }
+  }
+}
+class Linearization {
+  static create(stream) {
+    function getInt(linDict, name, allowZeroValue = false) {
+      const obj = linDict.get(name);
+      if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {
+        return obj;
+      }
+      throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid.");
+    }
+    function getHints(linDict) {
+      const hints = linDict.get("H");
+      let hintsLength;
+      if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {
+        for (let index = 0; index < hintsLength; index++) {
+          const hint = hints[index];
+          if (!(Number.isInteger(hint) && hint > 0)) {
+            throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`);
+          }
+        }
+        return hints;
+      }
+      throw new Error("Hint array in the linearization dictionary is invalid.");
+    }
+    const parser = new Parser({
+      lexer: new Lexer(stream),
+      xref: null
+    });
+    const obj1 = parser.getObj();
+    const obj2 = parser.getObj();
+    const obj3 = parser.getObj();
+    const linDict = parser.getObj();
+    let obj, length;
+    if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) {
+      return null;
+    } else if ((length = getInt(linDict, "L")) !== stream.length) {
+      throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length.");
+    }
+    return {
+      length,
+      hints: getHints(linDict),
+      objectNumberFirst: getInt(linDict, "O"),
+      endFirst: getInt(linDict, "E"),
+      numPages: getInt(linDict, "N"),
+      mainXRefEntriesOffset: getInt(linDict, "T"),
+      pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0
+    };
+  }
+}
+
+;// ./src/core/cmap.js
+
+
+
+
+
+
+
+const BUILT_IN_CMAPS = ["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"];
+const MAX_MAP_RANGE = 2 ** 24 - 1;
+class CMap {
+  constructor(builtInCMap = false) {
+    this.codespaceRanges = [[], [], [], []];
+    this.numCodespaceRanges = 0;
+    this._map = [];
+    this.name = "";
+    this.vertical = false;
+    this.useCMap = null;
+    this.builtInCMap = builtInCMap;
+  }
+  addCodespaceRange(n, low, high) {
+    this.codespaceRanges[n - 1].push(low, high);
+    this.numCodespaceRanges++;
+  }
+  mapCidRange(low, high, dstLow) {
+    if (high - low > MAX_MAP_RANGE) {
+      throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");
+    }
+    while (low <= high) {
+      this._map[low++] = dstLow++;
+    }
+  }
+  mapBfRange(low, high, dstLow) {
+    if (high - low > MAX_MAP_RANGE) {
+      throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");
+    }
+    const lastByte = dstLow.length - 1;
+    while (low <= high) {
+      this._map[low++] = dstLow;
+      const nextCharCode = dstLow.charCodeAt(lastByte) + 1;
+      if (nextCharCode > 0xff) {
+        dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00";
+        continue;
+      }
+      dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode);
+    }
+  }
+  mapBfRangeToArray(low, high, array) {
+    if (high - low > MAX_MAP_RANGE) {
+      throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");
+    }
+    const ii = array.length;
+    let i = 0;
+    while (low <= high && i < ii) {
+      this._map[low] = array[i++];
+      ++low;
+    }
+  }
+  mapOne(src, dst) {
+    this._map[src] = dst;
+  }
+  lookup(code) {
+    return this._map[code];
+  }
+  contains(code) {
+    return this._map[code] !== undefined;
+  }
+  forEach(callback) {
+    const map = this._map;
+    const length = map.length;
+    if (length <= 0x10000) {
+      for (let i = 0; i < length; i++) {
+        if (map[i] !== undefined) {
+          callback(i, map[i]);
+        }
+      }
+    } else {
+      for (const i in map) {
+        callback(i, map[i]);
+      }
+    }
+  }
+  charCodeOf(value) {
+    const map = this._map;
+    if (map.length <= 0x10000) {
+      return map.indexOf(value);
+    }
+    for (const charCode in map) {
+      if (map[charCode] === value) {
+        return charCode | 0;
+      }
+    }
+    return -1;
+  }
+  getMap() {
+    return this._map;
+  }
+  readCharCode(str, offset, out) {
+    let c = 0;
+    const codespaceRanges = this.codespaceRanges;
+    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {
+      c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;
+      const codespaceRange = codespaceRanges[n];
+      for (let k = 0, kk = codespaceRange.length; k < kk;) {
+        const low = codespaceRange[k++];
+        const high = codespaceRange[k++];
+        if (c >= low && c <= high) {
+          out.charcode = c;
+          out.length = n + 1;
+          return;
+        }
+      }
+    }
+    out.charcode = 0;
+    out.length = 1;
+  }
+  getCharCodeLength(charCode) {
+    const codespaceRanges = this.codespaceRanges;
+    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {
+      const codespaceRange = codespaceRanges[n];
+      for (let k = 0, kk = codespaceRange.length; k < kk;) {
+        const low = codespaceRange[k++];
+        const high = codespaceRange[k++];
+        if (charCode >= low && charCode <= high) {
+          return n + 1;
+        }
+      }
+    }
+    return 1;
+  }
+  get length() {
+    return this._map.length;
+  }
+  get isIdentityCMap() {
+    if (!(this.name === "Identity-H" || this.name === "Identity-V")) {
+      return false;
+    }
+    if (this._map.length !== 0x10000) {
+      return false;
+    }
+    for (let i = 0; i < 0x10000; i++) {
+      if (this._map[i] !== i) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+class IdentityCMap extends CMap {
+  constructor(vertical, n) {
+    super();
+    this.vertical = vertical;
+    this.addCodespaceRange(n, 0, 0xffff);
+  }
+  mapCidRange(low, high, dstLow) {
+    unreachable("should not call mapCidRange");
+  }
+  mapBfRange(low, high, dstLow) {
+    unreachable("should not call mapBfRange");
+  }
+  mapBfRangeToArray(low, high, array) {
+    unreachable("should not call mapBfRangeToArray");
+  }
+  mapOne(src, dst) {
+    unreachable("should not call mapCidOne");
+  }
+  lookup(code) {
+    return Number.isInteger(code) && code <= 0xffff ? code : undefined;
+  }
+  contains(code) {
+    return Number.isInteger(code) && code <= 0xffff;
+  }
+  forEach(callback) {
+    for (let i = 0; i <= 0xffff; i++) {
+      callback(i, i);
+    }
+  }
+  charCodeOf(value) {
+    return Number.isInteger(value) && value <= 0xffff ? value : -1;
+  }
+  getMap() {
+    const map = new Array(0x10000);
+    for (let i = 0; i <= 0xffff; i++) {
+      map[i] = i;
+    }
+    return map;
+  }
+  get length() {
+    return 0x10000;
+  }
+  get isIdentityCMap() {
+    unreachable("should not access .isIdentityCMap");
+  }
+}
+function strToInt(str) {
+  let a = 0;
+  for (let i = 0; i < str.length; i++) {
+    a = a << 8 | str.charCodeAt(i);
+  }
+  return a >>> 0;
+}
+function expectString(obj) {
+  if (typeof obj !== "string") {
+    throw new FormatError("Malformed CMap: expected string.");
+  }
+}
+function expectInt(obj) {
+  if (!Number.isInteger(obj)) {
+    throw new FormatError("Malformed CMap: expected int.");
+  }
+}
+function parseBfChar(cMap, lexer) {
+  while (true) {
+    let obj = lexer.getObj();
+    if (obj === EOF) {
+      break;
+    }
+    if (isCmd(obj, "endbfchar")) {
+      return;
+    }
+    expectString(obj);
+    const src = strToInt(obj);
+    obj = lexer.getObj();
+    expectString(obj);
+    const dst = obj;
+    cMap.mapOne(src, dst);
+  }
+}
+function parseBfRange(cMap, lexer) {
+  while (true) {
+    let obj = lexer.getObj();
+    if (obj === EOF) {
+      break;
+    }
+    if (isCmd(obj, "endbfrange")) {
+      return;
+    }
+    expectString(obj);
+    const low = strToInt(obj);
+    obj = lexer.getObj();
+    expectString(obj);
+    const high = strToInt(obj);
+    obj = lexer.getObj();
+    if (Number.isInteger(obj) || typeof obj === "string") {
+      const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;
+      cMap.mapBfRange(low, high, dstLow);
+    } else if (isCmd(obj, "[")) {
+      obj = lexer.getObj();
+      const array = [];
+      while (!isCmd(obj, "]") && obj !== EOF) {
+        array.push(obj);
+        obj = lexer.getObj();
+      }
+      cMap.mapBfRangeToArray(low, high, array);
+    } else {
+      break;
+    }
+  }
+  throw new FormatError("Invalid bf range.");
+}
+function parseCidChar(cMap, lexer) {
+  while (true) {
+    let obj = lexer.getObj();
+    if (obj === EOF) {
+      break;
+    }
+    if (isCmd(obj, "endcidchar")) {
+      return;
+    }
+    expectString(obj);
+    const src = strToInt(obj);
+    obj = lexer.getObj();
+    expectInt(obj);
+    const dst = obj;
+    cMap.mapOne(src, dst);
+  }
+}
+function parseCidRange(cMap, lexer) {
+  while (true) {
+    let obj = lexer.getObj();
+    if (obj === EOF) {
+      break;
+    }
+    if (isCmd(obj, "endcidrange")) {
+      return;
+    }
+    expectString(obj);
+    const low = strToInt(obj);
+    obj = lexer.getObj();
+    expectString(obj);
+    const high = strToInt(obj);
+    obj = lexer.getObj();
+    expectInt(obj);
+    const dstLow = obj;
+    cMap.mapCidRange(low, high, dstLow);
+  }
+}
+function parseCodespaceRange(cMap, lexer) {
+  while (true) {
+    let obj = lexer.getObj();
+    if (obj === EOF) {
+      break;
+    }
+    if (isCmd(obj, "endcodespacerange")) {
+      return;
+    }
+    if (typeof obj !== "string") {
+      break;
+    }
+    const low = strToInt(obj);
+    obj = lexer.getObj();
+    if (typeof obj !== "string") {
+      break;
+    }
+    const high = strToInt(obj);
+    cMap.addCodespaceRange(obj.length, low, high);
+  }
+  throw new FormatError("Invalid codespace range.");
+}
+function parseWMode(cMap, lexer) {
+  const obj = lexer.getObj();
+  if (Number.isInteger(obj)) {
+    cMap.vertical = !!obj;
+  }
+}
+function parseCMapName(cMap, lexer) {
+  const obj = lexer.getObj();
+  if (obj instanceof Name) {
+    cMap.name = obj.name;
+  }
+}
+async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {
+  let previous, embeddedUseCMap;
+  objLoop: while (true) {
+    try {
+      const obj = lexer.getObj();
+      if (obj === EOF) {
+        break;
+      } else if (obj instanceof Name) {
+        if (obj.name === "WMode") {
+          parseWMode(cMap, lexer);
+        } else if (obj.name === "CMapName") {
+          parseCMapName(cMap, lexer);
+        }
+        previous = obj;
+      } else if (obj instanceof Cmd) {
+        switch (obj.cmd) {
+          case "endcmap":
+            break objLoop;
+          case "usecmap":
+            if (previous instanceof Name) {
+              embeddedUseCMap = previous.name;
+            }
+            break;
+          case "begincodespacerange":
+            parseCodespaceRange(cMap, lexer);
+            break;
+          case "beginbfchar":
+            parseBfChar(cMap, lexer);
+            break;
+          case "begincidchar":
+            parseCidChar(cMap, lexer);
+            break;
+          case "beginbfrange":
+            parseBfRange(cMap, lexer);
+            break;
+          case "begincidrange":
+            parseCidRange(cMap, lexer);
+            break;
+        }
+      }
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn("Invalid cMap data: " + ex);
+      continue;
+    }
+  }
+  if (!useCMap && embeddedUseCMap) {
+    useCMap = embeddedUseCMap;
+  }
+  if (useCMap) {
+    return extendCMap(cMap, fetchBuiltInCMap, useCMap);
+  }
+  return cMap;
+}
+async function extendCMap(cMap, fetchBuiltInCMap, useCMap) {
+  cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap);
+  if (cMap.numCodespaceRanges === 0) {
+    const useCodespaceRanges = cMap.useCMap.codespaceRanges;
+    for (let i = 0; i < useCodespaceRanges.length; i++) {
+      cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
+    }
+    cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
+  }
+  cMap.useCMap.forEach(function (key, value) {
+    if (!cMap.contains(key)) {
+      cMap.mapOne(key, value);
+    }
+  });
+  return cMap;
+}
+async function createBuiltInCMap(name, fetchBuiltInCMap) {
+  if (name === "Identity-H") {
+    return new IdentityCMap(false, 2);
+  } else if (name === "Identity-V") {
+    return new IdentityCMap(true, 2);
+  }
+  if (!BUILT_IN_CMAPS.includes(name)) {
+    throw new Error("Unknown CMap name: " + name);
+  }
+  if (!fetchBuiltInCMap) {
+    throw new Error("Built-in CMap parameters are not provided.");
+  }
+  const {
+    cMapData,
+    isCompressed
+  } = await fetchBuiltInCMap(name);
+  const cMap = new CMap(true);
+  if (isCompressed) {
+    return new BinaryCMapReader().process(cMapData, cMap, useCMap => extendCMap(cMap, fetchBuiltInCMap, useCMap));
+  }
+  const lexer = new Lexer(new Stream(cMapData));
+  return parseCMap(cMap, lexer, fetchBuiltInCMap, null);
+}
+class CMapFactory {
+  static async create({
+    encoding,
+    fetchBuiltInCMap,
+    useCMap
+  }) {
+    if (encoding instanceof Name) {
+      return createBuiltInCMap(encoding.name, fetchBuiltInCMap);
+    } else if (encoding instanceof BaseStream) {
+      if (encoding.isAsync) {
+        const bytes = await encoding.asyncGetBytes();
+        if (bytes) {
+          encoding = new Stream(bytes, 0, bytes.length, encoding.dict);
+        }
+      }
+      const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap);
+      if (parsedCMap.isIdentityCMap) {
+        return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);
+      }
+      return parsedCMap;
+    }
+    throw new Error("Encoding required.");
+  }
+}
+
+;// ./src/shared/obj_bin_transform_utils.js
+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(this.bools.length * 2 / 8);
+  static OFFSET_BBOX = this.OFFSET_NUMBERS + this.numbers.length * 8;
+  static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4;
+  static OFFSET_DEFAULT_VMETRICS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6;
+  static OFFSET_STRINGS = this.OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3;
+}
+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;
+}
+
+;// ./src/core/obj_bin_transform_core.js
+
+
+function compileCssFontInfo(info) {
+  const encoder = new TextEncoder();
+  const encodedStrings = {};
+  let stringsLength = 0;
+  for (const prop of CSS_FONT_INFO.strings) {
+    const encoded = encoder.encode(info[prop]);
+    encodedStrings[prop] = encoded;
+    stringsLength += 4 + encoded.length;
+  }
+  const buffer = new ArrayBuffer(stringsLength);
+  const data = new Uint8Array(buffer);
+  const view = new DataView(buffer);
+  let offset = 0;
+  for (const prop of CSS_FONT_INFO.strings) {
+    const encoded = encodedStrings[prop];
+    const length = encoded.length;
+    view.setUint32(offset, length);
+    data.set(encoded, offset + 4);
+    offset += 4 + length;
+  }
+  assert(offset === buffer.byteLength, "compileCssFontInfo: Buffer overflow");
+  return buffer;
+}
+function compileSystemFontInfo(info) {
+  const encoder = new TextEncoder();
+  const encodedStrings = {};
+  let stringsLength = 0;
+  for (const prop of SYSTEM_FONT_INFO.strings) {
+    const encoded = encoder.encode(info[prop]);
+    encodedStrings[prop] = encoded;
+    stringsLength += 4 + encoded.length;
+  }
+  stringsLength += 4;
+  let encodedStyleStyle,
+    encodedStyleWeight,
+    lengthEstimate = 1 + stringsLength;
+  if (info.style) {
+    encodedStyleStyle = encoder.encode(info.style.style);
+    encodedStyleWeight = encoder.encode(info.style.weight);
+    lengthEstimate += 4 + encodedStyleStyle.length + 4 + encodedStyleWeight.length;
+  }
+  const buffer = new ArrayBuffer(lengthEstimate);
+  const data = new Uint8Array(buffer);
+  const view = new DataView(buffer);
+  let offset = 0;
+  view.setUint8(offset++, info.guessFallback ? 1 : 0);
+  view.setUint32(offset, 0);
+  offset += 4;
+  stringsLength = 0;
+  for (const prop of SYSTEM_FONT_INFO.strings) {
+    const encoded = encodedStrings[prop];
+    const length = encoded.length;
+    stringsLength += 4 + length;
+    view.setUint32(offset, length);
+    data.set(encoded, offset + 4);
+    offset += 4 + length;
+  }
+  view.setUint32(offset - stringsLength - 4, stringsLength);
+  if (info.style) {
+    view.setUint32(offset, encodedStyleStyle.length);
+    data.set(encodedStyleStyle, offset + 4);
+    offset += 4 + encodedStyleStyle.length;
+    view.setUint32(offset, encodedStyleWeight.length);
+    data.set(encodedStyleWeight, offset + 4);
+    offset += 4 + encodedStyleWeight.length;
+  }
+  assert(offset <= buffer.byteLength, "compileSystemFontInfo: Buffer overflow");
+  return buffer.transferToFixedLength(offset);
+}
+function compileFontInfo(font) {
+  const systemFontInfoBuffer = font.systemFontInfo ? compileSystemFontInfo(font.systemFontInfo) : null;
+  const cssFontInfoBuffer = font.cssFontInfo ? compileCssFontInfo(font.cssFontInfo) : null;
+  const encoder = new TextEncoder();
+  const encodedStrings = {};
+  let stringsLength = 0;
+  for (const prop of FONT_INFO.strings) {
+    encodedStrings[prop] = encoder.encode(font[prop]);
+    stringsLength += 4 + encodedStrings[prop].length;
+  }
+  const lengthEstimate = FONT_INFO.OFFSET_STRINGS + 4 + stringsLength + 4 + (systemFontInfoBuffer?.byteLength ?? 0) + 4 + (cssFontInfoBuffer?.byteLength ?? 0) + 4 + (font.data?.length ?? 0);
+  const buffer = new ArrayBuffer(lengthEstimate);
+  const data = new Uint8Array(buffer);
+  const view = new DataView(buffer);
+  let offset = 0;
+  const numBools = FONT_INFO.bools.length;
+  let boolByte = 0,
+    boolBit = 0;
+  for (let i = 0; i < numBools; i++) {
+    const value = font[FONT_INFO.bools[i]];
+    const bits = value === undefined ? 0x00 : value ? 0x02 : 0x01;
+    boolByte |= bits << boolBit;
+    boolBit += 2;
+    if (boolBit === 8 || i === numBools - 1) {
+      view.setUint8(offset++, boolByte);
+      boolByte = 0;
+      boolBit = 0;
+    }
+  }
+  assert(offset === FONT_INFO.OFFSET_NUMBERS, "compileFontInfo: Boolean properties offset mismatch");
+  for (const prop of FONT_INFO.numbers) {
+    view.setFloat64(offset, font[prop]);
+    offset += 8;
+  }
+  assert(offset === FONT_INFO.OFFSET_BBOX, "compileFontInfo: Number properties offset mismatch");
+  if (font.bbox) {
+    view.setUint8(offset++, 4);
+    for (const coord of font.bbox) {
+      view.setInt16(offset, coord, true);
+      offset += 2;
+    }
+  } else {
+    view.setUint8(offset++, 0);
+    offset += 2 * 4;
+  }
+  assert(offset === FONT_INFO.OFFSET_FONT_MATRIX, "compileFontInfo: BBox properties offset mismatch");
+  if (font.fontMatrix) {
+    view.setUint8(offset++, 6);
+    for (const point of font.fontMatrix) {
+      view.setFloat64(offset, point, true);
+      offset += 8;
+    }
+  } else {
+    view.setUint8(offset++, 0);
+    offset += 8 * 6;
+  }
+  assert(offset === FONT_INFO.OFFSET_DEFAULT_VMETRICS, "compileFontInfo: FontMatrix properties offset mismatch");
+  if (font.defaultVMetrics) {
+    view.setUint8(offset++, 3);
+    for (const metric of font.defaultVMetrics) {
+      view.setInt16(offset, metric, true);
+      offset += 2;
+    }
+  } else {
+    view.setUint8(offset++, 0);
+    offset += 3 * 2;
+  }
+  assert(offset === FONT_INFO.OFFSET_STRINGS, "compileFontInfo: DefaultVMetrics properties offset mismatch");
+  view.setUint32(FONT_INFO.OFFSET_STRINGS, 0);
+  offset += 4;
+  for (const prop of FONT_INFO.strings) {
+    const encoded = encodedStrings[prop];
+    const length = encoded.length;
+    view.setUint32(offset, length);
+    data.set(encoded, offset + 4);
+    offset += 4 + length;
+  }
+  view.setUint32(FONT_INFO.OFFSET_STRINGS, offset - FONT_INFO.OFFSET_STRINGS - 4);
+  if (!systemFontInfoBuffer) {
+    view.setUint32(offset, 0);
+    offset += 4;
+  } else {
+    const length = systemFontInfoBuffer.byteLength;
+    view.setUint32(offset, length);
+    assert(offset + 4 + length <= buffer.byteLength, "compileFontInfo: Buffer overflow at systemFontInfo");
+    data.set(new Uint8Array(systemFontInfoBuffer), offset + 4);
+    offset += 4 + length;
+  }
+  if (!cssFontInfoBuffer) {
+    view.setUint32(offset, 0);
+    offset += 4;
+  } else {
+    const length = cssFontInfoBuffer.byteLength;
+    view.setUint32(offset, length);
+    assert(offset + 4 + length <= buffer.byteLength, "compileFontInfo: Buffer overflow at cssFontInfo");
+    data.set(new Uint8Array(cssFontInfoBuffer), offset + 4);
+    offset += 4 + length;
+  }
+  if (font.data === undefined) {
+    view.setUint32(offset, 0);
+    offset += 4;
+  } else {
+    view.setUint32(offset, font.data.length);
+    data.set(font.data, offset + 4);
+    offset += 4 + font.data.length;
+  }
+  assert(offset <= buffer.byteLength, "compileFontInfo: Buffer overflow");
+  return buffer.transferToFixedLength(offset);
+}
+function compilePatternInfo(ir) {
+  let kind,
+    bbox = null,
+    coords = [],
+    colors = [],
+    colorStops = [],
+    shadingType = null,
+    background = null;
+  switch (ir[0]) {
+    case "RadialAxial":
+      kind = ir[1] === "axial" ? 1 : 2;
+      bbox = ir[2];
+      colorStops = ir[3];
+      if (kind === 1) {
+        coords.push(...ir[4], ...ir[5]);
+      } else {
+        coords.push(ir[4][0], ir[4][1], ir[6], ir[5][0], ir[5][1], ir[7]);
+      }
+      break;
+    case "Mesh":
+      kind = 3;
+      shadingType = ir[1];
+      coords = ir[2];
+      colors = ir[3];
+      bbox = ir[6];
+      background = ir[7];
+      break;
+    default:
+      throw new Error(`Unsupported pattern type: ${ir[0]}`);
+  }
+  const nCoord = Math.floor(coords.length / 2);
+  const nColor = Math.floor(colors.length / 4);
+  const nStop = colorStops.length;
+  const byteLen = 20 + nCoord * 8 + nColor * 4 + nStop * 8 + (bbox ? 16 : 0) + (background ? 3 : 0);
+  const buffer = new ArrayBuffer(byteLen);
+  const dataView = new DataView(buffer);
+  const u8data = new Uint8Array(buffer);
+  dataView.setUint8(PATTERN_INFO.KIND, kind);
+  dataView.setUint8(PATTERN_INFO.HAS_BBOX, bbox ? 1 : 0);
+  dataView.setUint8(PATTERN_INFO.HAS_BACKGROUND, background ? 1 : 0);
+  dataView.setUint8(PATTERN_INFO.SHADING_TYPE, shadingType);
+  dataView.setUint32(PATTERN_INFO.N_COORD, nCoord, true);
+  dataView.setUint32(PATTERN_INFO.N_COLOR, nColor, true);
+  dataView.setUint32(PATTERN_INFO.N_STOP, nStop, true);
+  dataView.setUint32(PATTERN_INFO.N_FIGURES, 0, true);
+  let offset = 20;
+  const coordsView = new Float32Array(buffer, offset, nCoord * 2);
+  coordsView.set(coords);
+  offset += nCoord * 8;
+  u8data.set(colors, offset);
+  offset += nColor * 4;
+  for (const [pos, hex] of colorStops) {
+    dataView.setFloat32(offset, pos, true);
+    offset += 4;
+    dataView.setUint32(offset, parseInt(hex.slice(1), 16), true);
+    offset += 4;
+  }
+  if (bbox) {
+    for (const v of bbox) {
+      dataView.setFloat32(offset, v, true);
+      offset += 4;
+    }
+  }
+  if (background) {
+    u8data.set(background, offset);
+  }
+  return buffer;
+}
+function compileFontPathInfo(path) {
+  return path.slice().buffer;
+}
+
+;// ./src/core/encodings.js
+const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "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"];
+const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", "questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", "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", "", "", "asuperior", "centsuperior", "", "", "", "", "Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", "osuperior", "fiveinferior", "", "commainferior", "periodinferior", "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", "", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", "exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", "tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", "", "", "", ""];
+const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "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", "space", "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"];
+const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "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", "", "", "", ""];
+const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "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", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"];
+const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega", "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""];
+const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", "a189", "a190", "a191", ""];
+function getEncoding(encodingName) {
+  switch (encodingName) {
+    case "WinAnsiEncoding":
+      return WinAnsiEncoding;
+    case "StandardEncoding":
+      return StandardEncoding;
+    case "MacRomanEncoding":
+      return MacRomanEncoding;
+    case "SymbolSetEncoding":
+      return SymbolSetEncoding;
+    case "ZapfDingbatsEncoding":
+      return ZapfDingbatsEncoding;
+    case "ExpertEncoding":
+      return ExpertEncoding;
+    case "MacExpertEncoding":
+      return MacExpertEncoding;
+    default:
+      return null;
+  }
+}
+
+;// ./src/core/glyphlist.js
+
+const getGlyphsUnicode = getLookupTableFactory(function (t) {
+  t.A = 0x0041;
+  t.AE = 0x00c6;
+  t.AEacute = 0x01fc;
+  t.AEmacron = 0x01e2;
+  t.AEsmall = 0xf7e6;
+  t.Aacute = 0x00c1;
+  t.Aacutesmall = 0xf7e1;
+  t.Abreve = 0x0102;
+  t.Abreveacute = 0x1eae;
+  t.Abrevecyrillic = 0x04d0;
+  t.Abrevedotbelow = 0x1eb6;
+  t.Abrevegrave = 0x1eb0;
+  t.Abrevehookabove = 0x1eb2;
+  t.Abrevetilde = 0x1eb4;
+  t.Acaron = 0x01cd;
+  t.Acircle = 0x24b6;
+  t.Acircumflex = 0x00c2;
+  t.Acircumflexacute = 0x1ea4;
+  t.Acircumflexdotbelow = 0x1eac;
+  t.Acircumflexgrave = 0x1ea6;
+  t.Acircumflexhookabove = 0x1ea8;
+  t.Acircumflexsmall = 0xf7e2;
+  t.Acircumflextilde = 0x1eaa;
+  t.Acute = 0xf6c9;
+  t.Acutesmall = 0xf7b4;
+  t.Acyrillic = 0x0410;
+  t.Adblgrave = 0x0200;
+  t.Adieresis = 0x00c4;
+  t.Adieresiscyrillic = 0x04d2;
+  t.Adieresismacron = 0x01de;
+  t.Adieresissmall = 0xf7e4;
+  t.Adotbelow = 0x1ea0;
+  t.Adotmacron = 0x01e0;
+  t.Agrave = 0x00c0;
+  t.Agravesmall = 0xf7e0;
+  t.Ahookabove = 0x1ea2;
+  t.Aiecyrillic = 0x04d4;
+  t.Ainvertedbreve = 0x0202;
+  t.Alpha = 0x0391;
+  t.Alphatonos = 0x0386;
+  t.Amacron = 0x0100;
+  t.Amonospace = 0xff21;
+  t.Aogonek = 0x0104;
+  t.Aring = 0x00c5;
+  t.Aringacute = 0x01fa;
+  t.Aringbelow = 0x1e00;
+  t.Aringsmall = 0xf7e5;
+  t.Asmall = 0xf761;
+  t.Atilde = 0x00c3;
+  t.Atildesmall = 0xf7e3;
+  t.Aybarmenian = 0x0531;
+  t.B = 0x0042;
+  t.Bcircle = 0x24b7;
+  t.Bdotaccent = 0x1e02;
+  t.Bdotbelow = 0x1e04;
+  t.Becyrillic = 0x0411;
+  t.Benarmenian = 0x0532;
+  t.Beta = 0x0392;
+  t.Bhook = 0x0181;
+  t.Blinebelow = 0x1e06;
+  t.Bmonospace = 0xff22;
+  t.Brevesmall = 0xf6f4;
+  t.Bsmall = 0xf762;
+  t.Btopbar = 0x0182;
+  t.C = 0x0043;
+  t.Caarmenian = 0x053e;
+  t.Cacute = 0x0106;
+  t.Caron = 0xf6ca;
+  t.Caronsmall = 0xf6f5;
+  t.Ccaron = 0x010c;
+  t.Ccedilla = 0x00c7;
+  t.Ccedillaacute = 0x1e08;
+  t.Ccedillasmall = 0xf7e7;
+  t.Ccircle = 0x24b8;
+  t.Ccircumflex = 0x0108;
+  t.Cdot = 0x010a;
+  t.Cdotaccent = 0x010a;
+  t.Cedillasmall = 0xf7b8;
+  t.Chaarmenian = 0x0549;
+  t.Cheabkhasiancyrillic = 0x04bc;
+  t.Checyrillic = 0x0427;
+  t.Chedescenderabkhasiancyrillic = 0x04be;
+  t.Chedescendercyrillic = 0x04b6;
+  t.Chedieresiscyrillic = 0x04f4;
+  t.Cheharmenian = 0x0543;
+  t.Chekhakassiancyrillic = 0x04cb;
+  t.Cheverticalstrokecyrillic = 0x04b8;
+  t.Chi = 0x03a7;
+  t.Chook = 0x0187;
+  t.Circumflexsmall = 0xf6f6;
+  t.Cmonospace = 0xff23;
+  t.Coarmenian = 0x0551;
+  t.Csmall = 0xf763;
+  t.D = 0x0044;
+  t.DZ = 0x01f1;
+  t.DZcaron = 0x01c4;
+  t.Daarmenian = 0x0534;
+  t.Dafrican = 0x0189;
+  t.Dcaron = 0x010e;
+  t.Dcedilla = 0x1e10;
+  t.Dcircle = 0x24b9;
+  t.Dcircumflexbelow = 0x1e12;
+  t.Dcroat = 0x0110;
+  t.Ddotaccent = 0x1e0a;
+  t.Ddotbelow = 0x1e0c;
+  t.Decyrillic = 0x0414;
+  t.Deicoptic = 0x03ee;
+  t.Delta = 0x2206;
+  t.Deltagreek = 0x0394;
+  t.Dhook = 0x018a;
+  t.Dieresis = 0xf6cb;
+  t.DieresisAcute = 0xf6cc;
+  t.DieresisGrave = 0xf6cd;
+  t.Dieresissmall = 0xf7a8;
+  t.Digammagreek = 0x03dc;
+  t.Djecyrillic = 0x0402;
+  t.Dlinebelow = 0x1e0e;
+  t.Dmonospace = 0xff24;
+  t.Dotaccentsmall = 0xf6f7;
+  t.Dslash = 0x0110;
+  t.Dsmall = 0xf764;
+  t.Dtopbar = 0x018b;
+  t.Dz = 0x01f2;
+  t.Dzcaron = 0x01c5;
+  t.Dzeabkhasiancyrillic = 0x04e0;
+  t.Dzecyrillic = 0x0405;
+  t.Dzhecyrillic = 0x040f;
+  t.E = 0x0045;
+  t.Eacute = 0x00c9;
+  t.Eacutesmall = 0xf7e9;
+  t.Ebreve = 0x0114;
+  t.Ecaron = 0x011a;
+  t.Ecedillabreve = 0x1e1c;
+  t.Echarmenian = 0x0535;
+  t.Ecircle = 0x24ba;
+  t.Ecircumflex = 0x00ca;
+  t.Ecircumflexacute = 0x1ebe;
+  t.Ecircumflexbelow = 0x1e18;
+  t.Ecircumflexdotbelow = 0x1ec6;
+  t.Ecircumflexgrave = 0x1ec0;
+  t.Ecircumflexhookabove = 0x1ec2;
+  t.Ecircumflexsmall = 0xf7ea;
+  t.Ecircumflextilde = 0x1ec4;
+  t.Ecyrillic = 0x0404;
+  t.Edblgrave = 0x0204;
+  t.Edieresis = 0x00cb;
+  t.Edieresissmall = 0xf7eb;
+  t.Edot = 0x0116;
+  t.Edotaccent = 0x0116;
+  t.Edotbelow = 0x1eb8;
+  t.Efcyrillic = 0x0424;
+  t.Egrave = 0x00c8;
+  t.Egravesmall = 0xf7e8;
+  t.Eharmenian = 0x0537;
+  t.Ehookabove = 0x1eba;
+  t.Eightroman = 0x2167;
+  t.Einvertedbreve = 0x0206;
+  t.Eiotifiedcyrillic = 0x0464;
+  t.Elcyrillic = 0x041b;
+  t.Elevenroman = 0x216a;
+  t.Emacron = 0x0112;
+  t.Emacronacute = 0x1e16;
+  t.Emacrongrave = 0x1e14;
+  t.Emcyrillic = 0x041c;
+  t.Emonospace = 0xff25;
+  t.Encyrillic = 0x041d;
+  t.Endescendercyrillic = 0x04a2;
+  t.Eng = 0x014a;
+  t.Enghecyrillic = 0x04a4;
+  t.Enhookcyrillic = 0x04c7;
+  t.Eogonek = 0x0118;
+  t.Eopen = 0x0190;
+  t.Epsilon = 0x0395;
+  t.Epsilontonos = 0x0388;
+  t.Ercyrillic = 0x0420;
+  t.Ereversed = 0x018e;
+  t.Ereversedcyrillic = 0x042d;
+  t.Escyrillic = 0x0421;
+  t.Esdescendercyrillic = 0x04aa;
+  t.Esh = 0x01a9;
+  t.Esmall = 0xf765;
+  t.Eta = 0x0397;
+  t.Etarmenian = 0x0538;
+  t.Etatonos = 0x0389;
+  t.Eth = 0x00d0;
+  t.Ethsmall = 0xf7f0;
+  t.Etilde = 0x1ebc;
+  t.Etildebelow = 0x1e1a;
+  t.Euro = 0x20ac;
+  t.Ezh = 0x01b7;
+  t.Ezhcaron = 0x01ee;
+  t.Ezhreversed = 0x01b8;
+  t.F = 0x0046;
+  t.Fcircle = 0x24bb;
+  t.Fdotaccent = 0x1e1e;
+  t.Feharmenian = 0x0556;
+  t.Feicoptic = 0x03e4;
+  t.Fhook = 0x0191;
+  t.Fitacyrillic = 0x0472;
+  t.Fiveroman = 0x2164;
+  t.Fmonospace = 0xff26;
+  t.Fourroman = 0x2163;
+  t.Fsmall = 0xf766;
+  t.G = 0x0047;
+  t.GBsquare = 0x3387;
+  t.Gacute = 0x01f4;
+  t.Gamma = 0x0393;
+  t.Gammaafrican = 0x0194;
+  t.Gangiacoptic = 0x03ea;
+  t.Gbreve = 0x011e;
+  t.Gcaron = 0x01e6;
+  t.Gcedilla = 0x0122;
+  t.Gcircle = 0x24bc;
+  t.Gcircumflex = 0x011c;
+  t.Gcommaaccent = 0x0122;
+  t.Gdot = 0x0120;
+  t.Gdotaccent = 0x0120;
+  t.Gecyrillic = 0x0413;
+  t.Ghadarmenian = 0x0542;
+  t.Ghemiddlehookcyrillic = 0x0494;
+  t.Ghestrokecyrillic = 0x0492;
+  t.Gheupturncyrillic = 0x0490;
+  t.Ghook = 0x0193;
+  t.Gimarmenian = 0x0533;
+  t.Gjecyrillic = 0x0403;
+  t.Gmacron = 0x1e20;
+  t.Gmonospace = 0xff27;
+  t.Grave = 0xf6ce;
+  t.Gravesmall = 0xf760;
+  t.Gsmall = 0xf767;
+  t.Gsmallhook = 0x029b;
+  t.Gstroke = 0x01e4;
+  t.H = 0x0048;
+  t.H18533 = 0x25cf;
+  t.H18543 = 0x25aa;
+  t.H18551 = 0x25ab;
+  t.H22073 = 0x25a1;
+  t.HPsquare = 0x33cb;
+  t.Haabkhasiancyrillic = 0x04a8;
+  t.Hadescendercyrillic = 0x04b2;
+  t.Hardsigncyrillic = 0x042a;
+  t.Hbar = 0x0126;
+  t.Hbrevebelow = 0x1e2a;
+  t.Hcedilla = 0x1e28;
+  t.Hcircle = 0x24bd;
+  t.Hcircumflex = 0x0124;
+  t.Hdieresis = 0x1e26;
+  t.Hdotaccent = 0x1e22;
+  t.Hdotbelow = 0x1e24;
+  t.Hmonospace = 0xff28;
+  t.Hoarmenian = 0x0540;
+  t.Horicoptic = 0x03e8;
+  t.Hsmall = 0xf768;
+  t.Hungarumlaut = 0xf6cf;
+  t.Hungarumlautsmall = 0xf6f8;
+  t.Hzsquare = 0x3390;
+  t.I = 0x0049;
+  t.IAcyrillic = 0x042f;
+  t.IJ = 0x0132;
+  t.IUcyrillic = 0x042e;
+  t.Iacute = 0x00cd;
+  t.Iacutesmall = 0xf7ed;
+  t.Ibreve = 0x012c;
+  t.Icaron = 0x01cf;
+  t.Icircle = 0x24be;
+  t.Icircumflex = 0x00ce;
+  t.Icircumflexsmall = 0xf7ee;
+  t.Icyrillic = 0x0406;
+  t.Idblgrave = 0x0208;
+  t.Idieresis = 0x00cf;
+  t.Idieresisacute = 0x1e2e;
+  t.Idieresiscyrillic = 0x04e4;
+  t.Idieresissmall = 0xf7ef;
+  t.Idot = 0x0130;
+  t.Idotaccent = 0x0130;
+  t.Idotbelow = 0x1eca;
+  t.Iebrevecyrillic = 0x04d6;
+  t.Iecyrillic = 0x0415;
+  t.Ifraktur = 0x2111;
+  t.Igrave = 0x00cc;
+  t.Igravesmall = 0xf7ec;
+  t.Ihookabove = 0x1ec8;
+  t.Iicyrillic = 0x0418;
+  t.Iinvertedbreve = 0x020a;
+  t.Iishortcyrillic = 0x0419;
+  t.Imacron = 0x012a;
+  t.Imacroncyrillic = 0x04e2;
+  t.Imonospace = 0xff29;
+  t.Iniarmenian = 0x053b;
+  t.Iocyrillic = 0x0401;
+  t.Iogonek = 0x012e;
+  t.Iota = 0x0399;
+  t.Iotaafrican = 0x0196;
+  t.Iotadieresis = 0x03aa;
+  t.Iotatonos = 0x038a;
+  t.Ismall = 0xf769;
+  t.Istroke = 0x0197;
+  t.Itilde = 0x0128;
+  t.Itildebelow = 0x1e2c;
+  t.Izhitsacyrillic = 0x0474;
+  t.Izhitsadblgravecyrillic = 0x0476;
+  t.J = 0x004a;
+  t.Jaarmenian = 0x0541;
+  t.Jcircle = 0x24bf;
+  t.Jcircumflex = 0x0134;
+  t.Jecyrillic = 0x0408;
+  t.Jheharmenian = 0x054b;
+  t.Jmonospace = 0xff2a;
+  t.Jsmall = 0xf76a;
+  t.K = 0x004b;
+  t.KBsquare = 0x3385;
+  t.KKsquare = 0x33cd;
+  t.Kabashkircyrillic = 0x04a0;
+  t.Kacute = 0x1e30;
+  t.Kacyrillic = 0x041a;
+  t.Kadescendercyrillic = 0x049a;
+  t.Kahookcyrillic = 0x04c3;
+  t.Kappa = 0x039a;
+  t.Kastrokecyrillic = 0x049e;
+  t.Kaverticalstrokecyrillic = 0x049c;
+  t.Kcaron = 0x01e8;
+  t.Kcedilla = 0x0136;
+  t.Kcircle = 0x24c0;
+  t.Kcommaaccent = 0x0136;
+  t.Kdotbelow = 0x1e32;
+  t.Keharmenian = 0x0554;
+  t.Kenarmenian = 0x053f;
+  t.Khacyrillic = 0x0425;
+  t.Kheicoptic = 0x03e6;
+  t.Khook = 0x0198;
+  t.Kjecyrillic = 0x040c;
+  t.Klinebelow = 0x1e34;
+  t.Kmonospace = 0xff2b;
+  t.Koppacyrillic = 0x0480;
+  t.Koppagreek = 0x03de;
+  t.Ksicyrillic = 0x046e;
+  t.Ksmall = 0xf76b;
+  t.L = 0x004c;
+  t.LJ = 0x01c7;
+  t.LL = 0xf6bf;
+  t.Lacute = 0x0139;
+  t.Lambda = 0x039b;
+  t.Lcaron = 0x013d;
+  t.Lcedilla = 0x013b;
+  t.Lcircle = 0x24c1;
+  t.Lcircumflexbelow = 0x1e3c;
+  t.Lcommaaccent = 0x013b;
+  t.Ldot = 0x013f;
+  t.Ldotaccent = 0x013f;
+  t.Ldotbelow = 0x1e36;
+  t.Ldotbelowmacron = 0x1e38;
+  t.Liwnarmenian = 0x053c;
+  t.Lj = 0x01c8;
+  t.Ljecyrillic = 0x0409;
+  t.Llinebelow = 0x1e3a;
+  t.Lmonospace = 0xff2c;
+  t.Lslash = 0x0141;
+  t.Lslashsmall = 0xf6f9;
+  t.Lsmall = 0xf76c;
+  t.M = 0x004d;
+  t.MBsquare = 0x3386;
+  t.Macron = 0xf6d0;
+  t.Macronsmall = 0xf7af;
+  t.Macute = 0x1e3e;
+  t.Mcircle = 0x24c2;
+  t.Mdotaccent = 0x1e40;
+  t.Mdotbelow = 0x1e42;
+  t.Menarmenian = 0x0544;
+  t.Mmonospace = 0xff2d;
+  t.Msmall = 0xf76d;
+  t.Mturned = 0x019c;
+  t.Mu = 0x039c;
+  t.N = 0x004e;
+  t.NJ = 0x01ca;
+  t.Nacute = 0x0143;
+  t.Ncaron = 0x0147;
+  t.Ncedilla = 0x0145;
+  t.Ncircle = 0x24c3;
+  t.Ncircumflexbelow = 0x1e4a;
+  t.Ncommaaccent = 0x0145;
+  t.Ndotaccent = 0x1e44;
+  t.Ndotbelow = 0x1e46;
+  t.Nhookleft = 0x019d;
+  t.Nineroman = 0x2168;
+  t.Nj = 0x01cb;
+  t.Njecyrillic = 0x040a;
+  t.Nlinebelow = 0x1e48;
+  t.Nmonospace = 0xff2e;
+  t.Nowarmenian = 0x0546;
+  t.Nsmall = 0xf76e;
+  t.Ntilde = 0x00d1;
+  t.Ntildesmall = 0xf7f1;
+  t.Nu = 0x039d;
+  t.O = 0x004f;
+  t.OE = 0x0152;
+  t.OEsmall = 0xf6fa;
+  t.Oacute = 0x00d3;
+  t.Oacutesmall = 0xf7f3;
+  t.Obarredcyrillic = 0x04e8;
+  t.Obarreddieresiscyrillic = 0x04ea;
+  t.Obreve = 0x014e;
+  t.Ocaron = 0x01d1;
+  t.Ocenteredtilde = 0x019f;
+  t.Ocircle = 0x24c4;
+  t.Ocircumflex = 0x00d4;
+  t.Ocircumflexacute = 0x1ed0;
+  t.Ocircumflexdotbelow = 0x1ed8;
+  t.Ocircumflexgrave = 0x1ed2;
+  t.Ocircumflexhookabove = 0x1ed4;
+  t.Ocircumflexsmall = 0xf7f4;
+  t.Ocircumflextilde = 0x1ed6;
+  t.Ocyrillic = 0x041e;
+  t.Odblacute = 0x0150;
+  t.Odblgrave = 0x020c;
+  t.Odieresis = 0x00d6;
+  t.Odieresiscyrillic = 0x04e6;
+  t.Odieresissmall = 0xf7f6;
+  t.Odotbelow = 0x1ecc;
+  t.Ogoneksmall = 0xf6fb;
+  t.Ograve = 0x00d2;
+  t.Ogravesmall = 0xf7f2;
+  t.Oharmenian = 0x0555;
+  t.Ohm = 0x2126;
+  t.Ohookabove = 0x1ece;
+  t.Ohorn = 0x01a0;
+  t.Ohornacute = 0x1eda;
+  t.Ohorndotbelow = 0x1ee2;
+  t.Ohorngrave = 0x1edc;
+  t.Ohornhookabove = 0x1ede;
+  t.Ohorntilde = 0x1ee0;
+  t.Ohungarumlaut = 0x0150;
+  t.Oi = 0x01a2;
+  t.Oinvertedbreve = 0x020e;
+  t.Omacron = 0x014c;
+  t.Omacronacute = 0x1e52;
+  t.Omacrongrave = 0x1e50;
+  t.Omega = 0x2126;
+  t.Omegacyrillic = 0x0460;
+  t.Omegagreek = 0x03a9;
+  t.Omegaroundcyrillic = 0x047a;
+  t.Omegatitlocyrillic = 0x047c;
+  t.Omegatonos = 0x038f;
+  t.Omicron = 0x039f;
+  t.Omicrontonos = 0x038c;
+  t.Omonospace = 0xff2f;
+  t.Oneroman = 0x2160;
+  t.Oogonek = 0x01ea;
+  t.Oogonekmacron = 0x01ec;
+  t.Oopen = 0x0186;
+  t.Oslash = 0x00d8;
+  t.Oslashacute = 0x01fe;
+  t.Oslashsmall = 0xf7f8;
+  t.Osmall = 0xf76f;
+  t.Ostrokeacute = 0x01fe;
+  t.Otcyrillic = 0x047e;
+  t.Otilde = 0x00d5;
+  t.Otildeacute = 0x1e4c;
+  t.Otildedieresis = 0x1e4e;
+  t.Otildesmall = 0xf7f5;
+  t.P = 0x0050;
+  t.Pacute = 0x1e54;
+  t.Pcircle = 0x24c5;
+  t.Pdotaccent = 0x1e56;
+  t.Pecyrillic = 0x041f;
+  t.Peharmenian = 0x054a;
+  t.Pemiddlehookcyrillic = 0x04a6;
+  t.Phi = 0x03a6;
+  t.Phook = 0x01a4;
+  t.Pi = 0x03a0;
+  t.Piwrarmenian = 0x0553;
+  t.Pmonospace = 0xff30;
+  t.Psi = 0x03a8;
+  t.Psicyrillic = 0x0470;
+  t.Psmall = 0xf770;
+  t.Q = 0x0051;
+  t.Qcircle = 0x24c6;
+  t.Qmonospace = 0xff31;
+  t.Qsmall = 0xf771;
+  t.R = 0x0052;
+  t.Raarmenian = 0x054c;
+  t.Racute = 0x0154;
+  t.Rcaron = 0x0158;
+  t.Rcedilla = 0x0156;
+  t.Rcircle = 0x24c7;
+  t.Rcommaaccent = 0x0156;
+  t.Rdblgrave = 0x0210;
+  t.Rdotaccent = 0x1e58;
+  t.Rdotbelow = 0x1e5a;
+  t.Rdotbelowmacron = 0x1e5c;
+  t.Reharmenian = 0x0550;
+  t.Rfraktur = 0x211c;
+  t.Rho = 0x03a1;
+  t.Ringsmall = 0xf6fc;
+  t.Rinvertedbreve = 0x0212;
+  t.Rlinebelow = 0x1e5e;
+  t.Rmonospace = 0xff32;
+  t.Rsmall = 0xf772;
+  t.Rsmallinverted = 0x0281;
+  t.Rsmallinvertedsuperior = 0x02b6;
+  t.S = 0x0053;
+  t.SF010000 = 0x250c;
+  t.SF020000 = 0x2514;
+  t.SF030000 = 0x2510;
+  t.SF040000 = 0x2518;
+  t.SF050000 = 0x253c;
+  t.SF060000 = 0x252c;
+  t.SF070000 = 0x2534;
+  t.SF080000 = 0x251c;
+  t.SF090000 = 0x2524;
+  t.SF100000 = 0x2500;
+  t.SF110000 = 0x2502;
+  t.SF190000 = 0x2561;
+  t.SF200000 = 0x2562;
+  t.SF210000 = 0x2556;
+  t.SF220000 = 0x2555;
+  t.SF230000 = 0x2563;
+  t.SF240000 = 0x2551;
+  t.SF250000 = 0x2557;
+  t.SF260000 = 0x255d;
+  t.SF270000 = 0x255c;
+  t.SF280000 = 0x255b;
+  t.SF360000 = 0x255e;
+  t.SF370000 = 0x255f;
+  t.SF380000 = 0x255a;
+  t.SF390000 = 0x2554;
+  t.SF400000 = 0x2569;
+  t.SF410000 = 0x2566;
+  t.SF420000 = 0x2560;
+  t.SF430000 = 0x2550;
+  t.SF440000 = 0x256c;
+  t.SF450000 = 0x2567;
+  t.SF460000 = 0x2568;
+  t.SF470000 = 0x2564;
+  t.SF480000 = 0x2565;
+  t.SF490000 = 0x2559;
+  t.SF500000 = 0x2558;
+  t.SF510000 = 0x2552;
+  t.SF520000 = 0x2553;
+  t.SF530000 = 0x256b;
+  t.SF540000 = 0x256a;
+  t.Sacute = 0x015a;
+  t.Sacutedotaccent = 0x1e64;
+  t.Sampigreek = 0x03e0;
+  t.Scaron = 0x0160;
+  t.Scarondotaccent = 0x1e66;
+  t.Scaronsmall = 0xf6fd;
+  t.Scedilla = 0x015e;
+  t.Schwa = 0x018f;
+  t.Schwacyrillic = 0x04d8;
+  t.Schwadieresiscyrillic = 0x04da;
+  t.Scircle = 0x24c8;
+  t.Scircumflex = 0x015c;
+  t.Scommaaccent = 0x0218;
+  t.Sdotaccent = 0x1e60;
+  t.Sdotbelow = 0x1e62;
+  t.Sdotbelowdotaccent = 0x1e68;
+  t.Seharmenian = 0x054d;
+  t.Sevenroman = 0x2166;
+  t.Shaarmenian = 0x0547;
+  t.Shacyrillic = 0x0428;
+  t.Shchacyrillic = 0x0429;
+  t.Sheicoptic = 0x03e2;
+  t.Shhacyrillic = 0x04ba;
+  t.Shimacoptic = 0x03ec;
+  t.Sigma = 0x03a3;
+  t.Sixroman = 0x2165;
+  t.Smonospace = 0xff33;
+  t.Softsigncyrillic = 0x042c;
+  t.Ssmall = 0xf773;
+  t.Stigmagreek = 0x03da;
+  t.T = 0x0054;
+  t.Tau = 0x03a4;
+  t.Tbar = 0x0166;
+  t.Tcaron = 0x0164;
+  t.Tcedilla = 0x0162;
+  t.Tcircle = 0x24c9;
+  t.Tcircumflexbelow = 0x1e70;
+  t.Tcommaaccent = 0x0162;
+  t.Tdotaccent = 0x1e6a;
+  t.Tdotbelow = 0x1e6c;
+  t.Tecyrillic = 0x0422;
+  t.Tedescendercyrillic = 0x04ac;
+  t.Tenroman = 0x2169;
+  t.Tetsecyrillic = 0x04b4;
+  t.Theta = 0x0398;
+  t.Thook = 0x01ac;
+  t.Thorn = 0x00de;
+  t.Thornsmall = 0xf7fe;
+  t.Threeroman = 0x2162;
+  t.Tildesmall = 0xf6fe;
+  t.Tiwnarmenian = 0x054f;
+  t.Tlinebelow = 0x1e6e;
+  t.Tmonospace = 0xff34;
+  t.Toarmenian = 0x0539;
+  t.Tonefive = 0x01bc;
+  t.Tonesix = 0x0184;
+  t.Tonetwo = 0x01a7;
+  t.Tretroflexhook = 0x01ae;
+  t.Tsecyrillic = 0x0426;
+  t.Tshecyrillic = 0x040b;
+  t.Tsmall = 0xf774;
+  t.Twelveroman = 0x216b;
+  t.Tworoman = 0x2161;
+  t.U = 0x0055;
+  t.Uacute = 0x00da;
+  t.Uacutesmall = 0xf7fa;
+  t.Ubreve = 0x016c;
+  t.Ucaron = 0x01d3;
+  t.Ucircle = 0x24ca;
+  t.Ucircumflex = 0x00db;
+  t.Ucircumflexbelow = 0x1e76;
+  t.Ucircumflexsmall = 0xf7fb;
+  t.Ucyrillic = 0x0423;
+  t.Udblacute = 0x0170;
+  t.Udblgrave = 0x0214;
+  t.Udieresis = 0x00dc;
+  t.Udieresisacute = 0x01d7;
+  t.Udieresisbelow = 0x1e72;
+  t.Udieresiscaron = 0x01d9;
+  t.Udieresiscyrillic = 0x04f0;
+  t.Udieresisgrave = 0x01db;
+  t.Udieresismacron = 0x01d5;
+  t.Udieresissmall = 0xf7fc;
+  t.Udotbelow = 0x1ee4;
+  t.Ugrave = 0x00d9;
+  t.Ugravesmall = 0xf7f9;
+  t.Uhookabove = 0x1ee6;
+  t.Uhorn = 0x01af;
+  t.Uhornacute = 0x1ee8;
+  t.Uhorndotbelow = 0x1ef0;
+  t.Uhorngrave = 0x1eea;
+  t.Uhornhookabove = 0x1eec;
+  t.Uhorntilde = 0x1eee;
+  t.Uhungarumlaut = 0x0170;
+  t.Uhungarumlautcyrillic = 0x04f2;
+  t.Uinvertedbreve = 0x0216;
+  t.Ukcyrillic = 0x0478;
+  t.Umacron = 0x016a;
+  t.Umacroncyrillic = 0x04ee;
+  t.Umacrondieresis = 0x1e7a;
+  t.Umonospace = 0xff35;
+  t.Uogonek = 0x0172;
+  t.Upsilon = 0x03a5;
+  t.Upsilon1 = 0x03d2;
+  t.Upsilonacutehooksymbolgreek = 0x03d3;
+  t.Upsilonafrican = 0x01b1;
+  t.Upsilondieresis = 0x03ab;
+  t.Upsilondieresishooksymbolgreek = 0x03d4;
+  t.Upsilonhooksymbol = 0x03d2;
+  t.Upsilontonos = 0x038e;
+  t.Uring = 0x016e;
+  t.Ushortcyrillic = 0x040e;
+  t.Usmall = 0xf775;
+  t.Ustraightcyrillic = 0x04ae;
+  t.Ustraightstrokecyrillic = 0x04b0;
+  t.Utilde = 0x0168;
+  t.Utildeacute = 0x1e78;
+  t.Utildebelow = 0x1e74;
+  t.V = 0x0056;
+  t.Vcircle = 0x24cb;
+  t.Vdotbelow = 0x1e7e;
+  t.Vecyrillic = 0x0412;
+  t.Vewarmenian = 0x054e;
+  t.Vhook = 0x01b2;
+  t.Vmonospace = 0xff36;
+  t.Voarmenian = 0x0548;
+  t.Vsmall = 0xf776;
+  t.Vtilde = 0x1e7c;
+  t.W = 0x0057;
+  t.Wacute = 0x1e82;
+  t.Wcircle = 0x24cc;
+  t.Wcircumflex = 0x0174;
+  t.Wdieresis = 0x1e84;
+  t.Wdotaccent = 0x1e86;
+  t.Wdotbelow = 0x1e88;
+  t.Wgrave = 0x1e80;
+  t.Wmonospace = 0xff37;
+  t.Wsmall = 0xf777;
+  t.X = 0x0058;
+  t.Xcircle = 0x24cd;
+  t.Xdieresis = 0x1e8c;
+  t.Xdotaccent = 0x1e8a;
+  t.Xeharmenian = 0x053d;
+  t.Xi = 0x039e;
+  t.Xmonospace = 0xff38;
+  t.Xsmall = 0xf778;
+  t.Y = 0x0059;
+  t.Yacute = 0x00dd;
+  t.Yacutesmall = 0xf7fd;
+  t.Yatcyrillic = 0x0462;
+  t.Ycircle = 0x24ce;
+  t.Ycircumflex = 0x0176;
+  t.Ydieresis = 0x0178;
+  t.Ydieresissmall = 0xf7ff;
+  t.Ydotaccent = 0x1e8e;
+  t.Ydotbelow = 0x1ef4;
+  t.Yericyrillic = 0x042b;
+  t.Yerudieresiscyrillic = 0x04f8;
+  t.Ygrave = 0x1ef2;
+  t.Yhook = 0x01b3;
+  t.Yhookabove = 0x1ef6;
+  t.Yiarmenian = 0x0545;
+  t.Yicyrillic = 0x0407;
+  t.Yiwnarmenian = 0x0552;
+  t.Ymonospace = 0xff39;
+  t.Ysmall = 0xf779;
+  t.Ytilde = 0x1ef8;
+  t.Yusbigcyrillic = 0x046a;
+  t.Yusbigiotifiedcyrillic = 0x046c;
+  t.Yuslittlecyrillic = 0x0466;
+  t.Yuslittleiotifiedcyrillic = 0x0468;
+  t.Z = 0x005a;
+  t.Zaarmenian = 0x0536;
+  t.Zacute = 0x0179;
+  t.Zcaron = 0x017d;
+  t.Zcaronsmall = 0xf6ff;
+  t.Zcircle = 0x24cf;
+  t.Zcircumflex = 0x1e90;
+  t.Zdot = 0x017b;
+  t.Zdotaccent = 0x017b;
+  t.Zdotbelow = 0x1e92;
+  t.Zecyrillic = 0x0417;
+  t.Zedescendercyrillic = 0x0498;
+  t.Zedieresiscyrillic = 0x04de;
+  t.Zeta = 0x0396;
+  t.Zhearmenian = 0x053a;
+  t.Zhebrevecyrillic = 0x04c1;
+  t.Zhecyrillic = 0x0416;
+  t.Zhedescendercyrillic = 0x0496;
+  t.Zhedieresiscyrillic = 0x04dc;
+  t.Zlinebelow = 0x1e94;
+  t.Zmonospace = 0xff3a;
+  t.Zsmall = 0xf77a;
+  t.Zstroke = 0x01b5;
+  t.a = 0x0061;
+  t.aabengali = 0x0986;
+  t.aacute = 0x00e1;
+  t.aadeva = 0x0906;
+  t.aagujarati = 0x0a86;
+  t.aagurmukhi = 0x0a06;
+  t.aamatragurmukhi = 0x0a3e;
+  t.aarusquare = 0x3303;
+  t.aavowelsignbengali = 0x09be;
+  t.aavowelsigndeva = 0x093e;
+  t.aavowelsigngujarati = 0x0abe;
+  t.abbreviationmarkarmenian = 0x055f;
+  t.abbreviationsigndeva = 0x0970;
+  t.abengali = 0x0985;
+  t.abopomofo = 0x311a;
+  t.abreve = 0x0103;
+  t.abreveacute = 0x1eaf;
+  t.abrevecyrillic = 0x04d1;
+  t.abrevedotbelow = 0x1eb7;
+  t.abrevegrave = 0x1eb1;
+  t.abrevehookabove = 0x1eb3;
+  t.abrevetilde = 0x1eb5;
+  t.acaron = 0x01ce;
+  t.acircle = 0x24d0;
+  t.acircumflex = 0x00e2;
+  t.acircumflexacute = 0x1ea5;
+  t.acircumflexdotbelow = 0x1ead;
+  t.acircumflexgrave = 0x1ea7;
+  t.acircumflexhookabove = 0x1ea9;
+  t.acircumflextilde = 0x1eab;
+  t.acute = 0x00b4;
+  t.acutebelowcmb = 0x0317;
+  t.acutecmb = 0x0301;
+  t.acutecomb = 0x0301;
+  t.acutedeva = 0x0954;
+  t.acutelowmod = 0x02cf;
+  t.acutetonecmb = 0x0341;
+  t.acyrillic = 0x0430;
+  t.adblgrave = 0x0201;
+  t.addakgurmukhi = 0x0a71;
+  t.adeva = 0x0905;
+  t.adieresis = 0x00e4;
+  t.adieresiscyrillic = 0x04d3;
+  t.adieresismacron = 0x01df;
+  t.adotbelow = 0x1ea1;
+  t.adotmacron = 0x01e1;
+  t.ae = 0x00e6;
+  t.aeacute = 0x01fd;
+  t.aekorean = 0x3150;
+  t.aemacron = 0x01e3;
+  t.afii00208 = 0x2015;
+  t.afii08941 = 0x20a4;
+  t.afii10017 = 0x0410;
+  t.afii10018 = 0x0411;
+  t.afii10019 = 0x0412;
+  t.afii10020 = 0x0413;
+  t.afii10021 = 0x0414;
+  t.afii10022 = 0x0415;
+  t.afii10023 = 0x0401;
+  t.afii10024 = 0x0416;
+  t.afii10025 = 0x0417;
+  t.afii10026 = 0x0418;
+  t.afii10027 = 0x0419;
+  t.afii10028 = 0x041a;
+  t.afii10029 = 0x041b;
+  t.afii10030 = 0x041c;
+  t.afii10031 = 0x041d;
+  t.afii10032 = 0x041e;
+  t.afii10033 = 0x041f;
+  t.afii10034 = 0x0420;
+  t.afii10035 = 0x0421;
+  t.afii10036 = 0x0422;
+  t.afii10037 = 0x0423;
+  t.afii10038 = 0x0424;
+  t.afii10039 = 0x0425;
+  t.afii10040 = 0x0426;
+  t.afii10041 = 0x0427;
+  t.afii10042 = 0x0428;
+  t.afii10043 = 0x0429;
+  t.afii10044 = 0x042a;
+  t.afii10045 = 0x042b;
+  t.afii10046 = 0x042c;
+  t.afii10047 = 0x042d;
+  t.afii10048 = 0x042e;
+  t.afii10049 = 0x042f;
+  t.afii10050 = 0x0490;
+  t.afii10051 = 0x0402;
+  t.afii10052 = 0x0403;
+  t.afii10053 = 0x0404;
+  t.afii10054 = 0x0405;
+  t.afii10055 = 0x0406;
+  t.afii10056 = 0x0407;
+  t.afii10057 = 0x0408;
+  t.afii10058 = 0x0409;
+  t.afii10059 = 0x040a;
+  t.afii10060 = 0x040b;
+  t.afii10061 = 0x040c;
+  t.afii10062 = 0x040e;
+  t.afii10063 = 0xf6c4;
+  t.afii10064 = 0xf6c5;
+  t.afii10065 = 0x0430;
+  t.afii10066 = 0x0431;
+  t.afii10067 = 0x0432;
+  t.afii10068 = 0x0433;
+  t.afii10069 = 0x0434;
+  t.afii10070 = 0x0435;
+  t.afii10071 = 0x0451;
+  t.afii10072 = 0x0436;
+  t.afii10073 = 0x0437;
+  t.afii10074 = 0x0438;
+  t.afii10075 = 0x0439;
+  t.afii10076 = 0x043a;
+  t.afii10077 = 0x043b;
+  t.afii10078 = 0x043c;
+  t.afii10079 = 0x043d;
+  t.afii10080 = 0x043e;
+  t.afii10081 = 0x043f;
+  t.afii10082 = 0x0440;
+  t.afii10083 = 0x0441;
+  t.afii10084 = 0x0442;
+  t.afii10085 = 0x0443;
+  t.afii10086 = 0x0444;
+  t.afii10087 = 0x0445;
+  t.afii10088 = 0x0446;
+  t.afii10089 = 0x0447;
+  t.afii10090 = 0x0448;
+  t.afii10091 = 0x0449;
+  t.afii10092 = 0x044a;
+  t.afii10093 = 0x044b;
+  t.afii10094 = 0x044c;
+  t.afii10095 = 0x044d;
+  t.afii10096 = 0x044e;
+  t.afii10097 = 0x044f;
+  t.afii10098 = 0x0491;
+  t.afii10099 = 0x0452;
+  t.afii10100 = 0x0453;
+  t.afii10101 = 0x0454;
+  t.afii10102 = 0x0455;
+  t.afii10103 = 0x0456;
+  t.afii10104 = 0x0457;
+  t.afii10105 = 0x0458;
+  t.afii10106 = 0x0459;
+  t.afii10107 = 0x045a;
+  t.afii10108 = 0x045b;
+  t.afii10109 = 0x045c;
+  t.afii10110 = 0x045e;
+  t.afii10145 = 0x040f;
+  t.afii10146 = 0x0462;
+  t.afii10147 = 0x0472;
+  t.afii10148 = 0x0474;
+  t.afii10192 = 0xf6c6;
+  t.afii10193 = 0x045f;
+  t.afii10194 = 0x0463;
+  t.afii10195 = 0x0473;
+  t.afii10196 = 0x0475;
+  t.afii10831 = 0xf6c7;
+  t.afii10832 = 0xf6c8;
+  t.afii10846 = 0x04d9;
+  t.afii299 = 0x200e;
+  t.afii300 = 0x200f;
+  t.afii301 = 0x200d;
+  t.afii57381 = 0x066a;
+  t.afii57388 = 0x060c;
+  t.afii57392 = 0x0660;
+  t.afii57393 = 0x0661;
+  t.afii57394 = 0x0662;
+  t.afii57395 = 0x0663;
+  t.afii57396 = 0x0664;
+  t.afii57397 = 0x0665;
+  t.afii57398 = 0x0666;
+  t.afii57399 = 0x0667;
+  t.afii57400 = 0x0668;
+  t.afii57401 = 0x0669;
+  t.afii57403 = 0x061b;
+  t.afii57407 = 0x061f;
+  t.afii57409 = 0x0621;
+  t.afii57410 = 0x0622;
+  t.afii57411 = 0x0623;
+  t.afii57412 = 0x0624;
+  t.afii57413 = 0x0625;
+  t.afii57414 = 0x0626;
+  t.afii57415 = 0x0627;
+  t.afii57416 = 0x0628;
+  t.afii57417 = 0x0629;
+  t.afii57418 = 0x062a;
+  t.afii57419 = 0x062b;
+  t.afii57420 = 0x062c;
+  t.afii57421 = 0x062d;
+  t.afii57422 = 0x062e;
+  t.afii57423 = 0x062f;
+  t.afii57424 = 0x0630;
+  t.afii57425 = 0x0631;
+  t.afii57426 = 0x0632;
+  t.afii57427 = 0x0633;
+  t.afii57428 = 0x0634;
+  t.afii57429 = 0x0635;
+  t.afii57430 = 0x0636;
+  t.afii57431 = 0x0637;
+  t.afii57432 = 0x0638;
+  t.afii57433 = 0x0639;
+  t.afii57434 = 0x063a;
+  t.afii57440 = 0x0640;
+  t.afii57441 = 0x0641;
+  t.afii57442 = 0x0642;
+  t.afii57443 = 0x0643;
+  t.afii57444 = 0x0644;
+  t.afii57445 = 0x0645;
+  t.afii57446 = 0x0646;
+  t.afii57448 = 0x0648;
+  t.afii57449 = 0x0649;
+  t.afii57450 = 0x064a;
+  t.afii57451 = 0x064b;
+  t.afii57452 = 0x064c;
+  t.afii57453 = 0x064d;
+  t.afii57454 = 0x064e;
+  t.afii57455 = 0x064f;
+  t.afii57456 = 0x0650;
+  t.afii57457 = 0x0651;
+  t.afii57458 = 0x0652;
+  t.afii57470 = 0x0647;
+  t.afii57505 = 0x06a4;
+  t.afii57506 = 0x067e;
+  t.afii57507 = 0x0686;
+  t.afii57508 = 0x0698;
+  t.afii57509 = 0x06af;
+  t.afii57511 = 0x0679;
+  t.afii57512 = 0x0688;
+  t.afii57513 = 0x0691;
+  t.afii57514 = 0x06ba;
+  t.afii57519 = 0x06d2;
+  t.afii57534 = 0x06d5;
+  t.afii57636 = 0x20aa;
+  t.afii57645 = 0x05be;
+  t.afii57658 = 0x05c3;
+  t.afii57664 = 0x05d0;
+  t.afii57665 = 0x05d1;
+  t.afii57666 = 0x05d2;
+  t.afii57667 = 0x05d3;
+  t.afii57668 = 0x05d4;
+  t.afii57669 = 0x05d5;
+  t.afii57670 = 0x05d6;
+  t.afii57671 = 0x05d7;
+  t.afii57672 = 0x05d8;
+  t.afii57673 = 0x05d9;
+  t.afii57674 = 0x05da;
+  t.afii57675 = 0x05db;
+  t.afii57676 = 0x05dc;
+  t.afii57677 = 0x05dd;
+  t.afii57678 = 0x05de;
+  t.afii57679 = 0x05df;
+  t.afii57680 = 0x05e0;
+  t.afii57681 = 0x05e1;
+  t.afii57682 = 0x05e2;
+  t.afii57683 = 0x05e3;
+  t.afii57684 = 0x05e4;
+  t.afii57685 = 0x05e5;
+  t.afii57686 = 0x05e6;
+  t.afii57687 = 0x05e7;
+  t.afii57688 = 0x05e8;
+  t.afii57689 = 0x05e9;
+  t.afii57690 = 0x05ea;
+  t.afii57694 = 0xfb2a;
+  t.afii57695 = 0xfb2b;
+  t.afii57700 = 0xfb4b;
+  t.afii57705 = 0xfb1f;
+  t.afii57716 = 0x05f0;
+  t.afii57717 = 0x05f1;
+  t.afii57718 = 0x05f2;
+  t.afii57723 = 0xfb35;
+  t.afii57793 = 0x05b4;
+  t.afii57794 = 0x05b5;
+  t.afii57795 = 0x05b6;
+  t.afii57796 = 0x05bb;
+  t.afii57797 = 0x05b8;
+  t.afii57798 = 0x05b7;
+  t.afii57799 = 0x05b0;
+  t.afii57800 = 0x05b2;
+  t.afii57801 = 0x05b1;
+  t.afii57802 = 0x05b3;
+  t.afii57803 = 0x05c2;
+  t.afii57804 = 0x05c1;
+  t.afii57806 = 0x05b9;
+  t.afii57807 = 0x05bc;
+  t.afii57839 = 0x05bd;
+  t.afii57841 = 0x05bf;
+  t.afii57842 = 0x05c0;
+  t.afii57929 = 0x02bc;
+  t.afii61248 = 0x2105;
+  t.afii61289 = 0x2113;
+  t.afii61352 = 0x2116;
+  t.afii61573 = 0x202c;
+  t.afii61574 = 0x202d;
+  t.afii61575 = 0x202e;
+  t.afii61664 = 0x200c;
+  t.afii63167 = 0x066d;
+  t.afii64937 = 0x02bd;
+  t.agrave = 0x00e0;
+  t.agujarati = 0x0a85;
+  t.agurmukhi = 0x0a05;
+  t.ahiragana = 0x3042;
+  t.ahookabove = 0x1ea3;
+  t.aibengali = 0x0990;
+  t.aibopomofo = 0x311e;
+  t.aideva = 0x0910;
+  t.aiecyrillic = 0x04d5;
+  t.aigujarati = 0x0a90;
+  t.aigurmukhi = 0x0a10;
+  t.aimatragurmukhi = 0x0a48;
+  t.ainarabic = 0x0639;
+  t.ainfinalarabic = 0xfeca;
+  t.aininitialarabic = 0xfecb;
+  t.ainmedialarabic = 0xfecc;
+  t.ainvertedbreve = 0x0203;
+  t.aivowelsignbengali = 0x09c8;
+  t.aivowelsigndeva = 0x0948;
+  t.aivowelsigngujarati = 0x0ac8;
+  t.akatakana = 0x30a2;
+  t.akatakanahalfwidth = 0xff71;
+  t.akorean = 0x314f;
+  t.alef = 0x05d0;
+  t.alefarabic = 0x0627;
+  t.alefdageshhebrew = 0xfb30;
+  t.aleffinalarabic = 0xfe8e;
+  t.alefhamzaabovearabic = 0x0623;
+  t.alefhamzaabovefinalarabic = 0xfe84;
+  t.alefhamzabelowarabic = 0x0625;
+  t.alefhamzabelowfinalarabic = 0xfe88;
+  t.alefhebrew = 0x05d0;
+  t.aleflamedhebrew = 0xfb4f;
+  t.alefmaddaabovearabic = 0x0622;
+  t.alefmaddaabovefinalarabic = 0xfe82;
+  t.alefmaksuraarabic = 0x0649;
+  t.alefmaksurafinalarabic = 0xfef0;
+  t.alefmaksurainitialarabic = 0xfef3;
+  t.alefmaksuramedialarabic = 0xfef4;
+  t.alefpatahhebrew = 0xfb2e;
+  t.alefqamatshebrew = 0xfb2f;
+  t.aleph = 0x2135;
+  t.allequal = 0x224c;
+  t.alpha = 0x03b1;
+  t.alphatonos = 0x03ac;
+  t.amacron = 0x0101;
+  t.amonospace = 0xff41;
+  t.ampersand = 0x0026;
+  t.ampersandmonospace = 0xff06;
+  t.ampersandsmall = 0xf726;
+  t.amsquare = 0x33c2;
+  t.anbopomofo = 0x3122;
+  t.angbopomofo = 0x3124;
+  t.angbracketleft = 0x3008;
+  t.angbracketright = 0x3009;
+  t.angkhankhuthai = 0x0e5a;
+  t.angle = 0x2220;
+  t.anglebracketleft = 0x3008;
+  t.anglebracketleftvertical = 0xfe3f;
+  t.anglebracketright = 0x3009;
+  t.anglebracketrightvertical = 0xfe40;
+  t.angleleft = 0x2329;
+  t.angleright = 0x232a;
+  t.angstrom = 0x212b;
+  t.anoteleia = 0x0387;
+  t.anudattadeva = 0x0952;
+  t.anusvarabengali = 0x0982;
+  t.anusvaradeva = 0x0902;
+  t.anusvaragujarati = 0x0a82;
+  t.aogonek = 0x0105;
+  t.apaatosquare = 0x3300;
+  t.aparen = 0x249c;
+  t.apostrophearmenian = 0x055a;
+  t.apostrophemod = 0x02bc;
+  t.apple = 0xf8ff;
+  t.approaches = 0x2250;
+  t.approxequal = 0x2248;
+  t.approxequalorimage = 0x2252;
+  t.approximatelyequal = 0x2245;
+  t.araeaekorean = 0x318e;
+  t.araeakorean = 0x318d;
+  t.arc = 0x2312;
+  t.arighthalfring = 0x1e9a;
+  t.aring = 0x00e5;
+  t.aringacute = 0x01fb;
+  t.aringbelow = 0x1e01;
+  t.arrowboth = 0x2194;
+  t.arrowdashdown = 0x21e3;
+  t.arrowdashleft = 0x21e0;
+  t.arrowdashright = 0x21e2;
+  t.arrowdashup = 0x21e1;
+  t.arrowdblboth = 0x21d4;
+  t.arrowdbldown = 0x21d3;
+  t.arrowdblleft = 0x21d0;
+  t.arrowdblright = 0x21d2;
+  t.arrowdblup = 0x21d1;
+  t.arrowdown = 0x2193;
+  t.arrowdownleft = 0x2199;
+  t.arrowdownright = 0x2198;
+  t.arrowdownwhite = 0x21e9;
+  t.arrowheaddownmod = 0x02c5;
+  t.arrowheadleftmod = 0x02c2;
+  t.arrowheadrightmod = 0x02c3;
+  t.arrowheadupmod = 0x02c4;
+  t.arrowhorizex = 0xf8e7;
+  t.arrowleft = 0x2190;
+  t.arrowleftdbl = 0x21d0;
+  t.arrowleftdblstroke = 0x21cd;
+  t.arrowleftoverright = 0x21c6;
+  t.arrowleftwhite = 0x21e6;
+  t.arrowright = 0x2192;
+  t.arrowrightdblstroke = 0x21cf;
+  t.arrowrightheavy = 0x279e;
+  t.arrowrightoverleft = 0x21c4;
+  t.arrowrightwhite = 0x21e8;
+  t.arrowtableft = 0x21e4;
+  t.arrowtabright = 0x21e5;
+  t.arrowup = 0x2191;
+  t.arrowupdn = 0x2195;
+  t.arrowupdnbse = 0x21a8;
+  t.arrowupdownbase = 0x21a8;
+  t.arrowupleft = 0x2196;
+  t.arrowupleftofdown = 0x21c5;
+  t.arrowupright = 0x2197;
+  t.arrowupwhite = 0x21e7;
+  t.arrowvertex = 0xf8e6;
+  t.asciicircum = 0x005e;
+  t.asciicircummonospace = 0xff3e;
+  t.asciitilde = 0x007e;
+  t.asciitildemonospace = 0xff5e;
+  t.ascript = 0x0251;
+  t.ascriptturned = 0x0252;
+  t.asmallhiragana = 0x3041;
+  t.asmallkatakana = 0x30a1;
+  t.asmallkatakanahalfwidth = 0xff67;
+  t.asterisk = 0x002a;
+  t.asteriskaltonearabic = 0x066d;
+  t.asteriskarabic = 0x066d;
+  t.asteriskmath = 0x2217;
+  t.asteriskmonospace = 0xff0a;
+  t.asterisksmall = 0xfe61;
+  t.asterism = 0x2042;
+  t.asuperior = 0xf6e9;
+  t.asymptoticallyequal = 0x2243;
+  t.at = 0x0040;
+  t.atilde = 0x00e3;
+  t.atmonospace = 0xff20;
+  t.atsmall = 0xfe6b;
+  t.aturned = 0x0250;
+  t.aubengali = 0x0994;
+  t.aubopomofo = 0x3120;
+  t.audeva = 0x0914;
+  t.augujarati = 0x0a94;
+  t.augurmukhi = 0x0a14;
+  t.aulengthmarkbengali = 0x09d7;
+  t.aumatragurmukhi = 0x0a4c;
+  t.auvowelsignbengali = 0x09cc;
+  t.auvowelsigndeva = 0x094c;
+  t.auvowelsigngujarati = 0x0acc;
+  t.avagrahadeva = 0x093d;
+  t.aybarmenian = 0x0561;
+  t.ayin = 0x05e2;
+  t.ayinaltonehebrew = 0xfb20;
+  t.ayinhebrew = 0x05e2;
+  t.b = 0x0062;
+  t.babengali = 0x09ac;
+  t.backslash = 0x005c;
+  t.backslashmonospace = 0xff3c;
+  t.badeva = 0x092c;
+  t.bagujarati = 0x0aac;
+  t.bagurmukhi = 0x0a2c;
+  t.bahiragana = 0x3070;
+  t.bahtthai = 0x0e3f;
+  t.bakatakana = 0x30d0;
+  t.bar = 0x007c;
+  t.barmonospace = 0xff5c;
+  t.bbopomofo = 0x3105;
+  t.bcircle = 0x24d1;
+  t.bdotaccent = 0x1e03;
+  t.bdotbelow = 0x1e05;
+  t.beamedsixteenthnotes = 0x266c;
+  t.because = 0x2235;
+  t.becyrillic = 0x0431;
+  t.beharabic = 0x0628;
+  t.behfinalarabic = 0xfe90;
+  t.behinitialarabic = 0xfe91;
+  t.behiragana = 0x3079;
+  t.behmedialarabic = 0xfe92;
+  t.behmeeminitialarabic = 0xfc9f;
+  t.behmeemisolatedarabic = 0xfc08;
+  t.behnoonfinalarabic = 0xfc6d;
+  t.bekatakana = 0x30d9;
+  t.benarmenian = 0x0562;
+  t.bet = 0x05d1;
+  t.beta = 0x03b2;
+  t.betasymbolgreek = 0x03d0;
+  t.betdagesh = 0xfb31;
+  t.betdageshhebrew = 0xfb31;
+  t.bethebrew = 0x05d1;
+  t.betrafehebrew = 0xfb4c;
+  t.bhabengali = 0x09ad;
+  t.bhadeva = 0x092d;
+  t.bhagujarati = 0x0aad;
+  t.bhagurmukhi = 0x0a2d;
+  t.bhook = 0x0253;
+  t.bihiragana = 0x3073;
+  t.bikatakana = 0x30d3;
+  t.bilabialclick = 0x0298;
+  t.bindigurmukhi = 0x0a02;
+  t.birusquare = 0x3331;
+  t.blackcircle = 0x25cf;
+  t.blackdiamond = 0x25c6;
+  t.blackdownpointingtriangle = 0x25bc;
+  t.blackleftpointingpointer = 0x25c4;
+  t.blackleftpointingtriangle = 0x25c0;
+  t.blacklenticularbracketleft = 0x3010;
+  t.blacklenticularbracketleftvertical = 0xfe3b;
+  t.blacklenticularbracketright = 0x3011;
+  t.blacklenticularbracketrightvertical = 0xfe3c;
+  t.blacklowerlefttriangle = 0x25e3;
+  t.blacklowerrighttriangle = 0x25e2;
+  t.blackrectangle = 0x25ac;
+  t.blackrightpointingpointer = 0x25ba;
+  t.blackrightpointingtriangle = 0x25b6;
+  t.blacksmallsquare = 0x25aa;
+  t.blacksmilingface = 0x263b;
+  t.blacksquare = 0x25a0;
+  t.blackstar = 0x2605;
+  t.blackupperlefttriangle = 0x25e4;
+  t.blackupperrighttriangle = 0x25e5;
+  t.blackuppointingsmalltriangle = 0x25b4;
+  t.blackuppointingtriangle = 0x25b2;
+  t.blank = 0x2423;
+  t.blinebelow = 0x1e07;
+  t.block = 0x2588;
+  t.bmonospace = 0xff42;
+  t.bobaimaithai = 0x0e1a;
+  t.bohiragana = 0x307c;
+  t.bokatakana = 0x30dc;
+  t.bparen = 0x249d;
+  t.bqsquare = 0x33c3;
+  t.braceex = 0xf8f4;
+  t.braceleft = 0x007b;
+  t.braceleftbt = 0xf8f3;
+  t.braceleftmid = 0xf8f2;
+  t.braceleftmonospace = 0xff5b;
+  t.braceleftsmall = 0xfe5b;
+  t.bracelefttp = 0xf8f1;
+  t.braceleftvertical = 0xfe37;
+  t.braceright = 0x007d;
+  t.bracerightbt = 0xf8fe;
+  t.bracerightmid = 0xf8fd;
+  t.bracerightmonospace = 0xff5d;
+  t.bracerightsmall = 0xfe5c;
+  t.bracerighttp = 0xf8fc;
+  t.bracerightvertical = 0xfe38;
+  t.bracketleft = 0x005b;
+  t.bracketleftbt = 0xf8f0;
+  t.bracketleftex = 0xf8ef;
+  t.bracketleftmonospace = 0xff3b;
+  t.bracketlefttp = 0xf8ee;
+  t.bracketright = 0x005d;
+  t.bracketrightbt = 0xf8fb;
+  t.bracketrightex = 0xf8fa;
+  t.bracketrightmonospace = 0xff3d;
+  t.bracketrighttp = 0xf8f9;
+  t.breve = 0x02d8;
+  t.brevebelowcmb = 0x032e;
+  t.brevecmb = 0x0306;
+  t.breveinvertedbelowcmb = 0x032f;
+  t.breveinvertedcmb = 0x0311;
+  t.breveinverteddoublecmb = 0x0361;
+  t.bridgebelowcmb = 0x032a;
+  t.bridgeinvertedbelowcmb = 0x033a;
+  t.brokenbar = 0x00a6;
+  t.bstroke = 0x0180;
+  t.bsuperior = 0xf6ea;
+  t.btopbar = 0x0183;
+  t.buhiragana = 0x3076;
+  t.bukatakana = 0x30d6;
+  t.bullet = 0x2022;
+  t.bulletinverse = 0x25d8;
+  t.bulletoperator = 0x2219;
+  t.bullseye = 0x25ce;
+  t.c = 0x0063;
+  t.caarmenian = 0x056e;
+  t.cabengali = 0x099a;
+  t.cacute = 0x0107;
+  t.cadeva = 0x091a;
+  t.cagujarati = 0x0a9a;
+  t.cagurmukhi = 0x0a1a;
+  t.calsquare = 0x3388;
+  t.candrabindubengali = 0x0981;
+  t.candrabinducmb = 0x0310;
+  t.candrabindudeva = 0x0901;
+  t.candrabindugujarati = 0x0a81;
+  t.capslock = 0x21ea;
+  t.careof = 0x2105;
+  t.caron = 0x02c7;
+  t.caronbelowcmb = 0x032c;
+  t.caroncmb = 0x030c;
+  t.carriagereturn = 0x21b5;
+  t.cbopomofo = 0x3118;
+  t.ccaron = 0x010d;
+  t.ccedilla = 0x00e7;
+  t.ccedillaacute = 0x1e09;
+  t.ccircle = 0x24d2;
+  t.ccircumflex = 0x0109;
+  t.ccurl = 0x0255;
+  t.cdot = 0x010b;
+  t.cdotaccent = 0x010b;
+  t.cdsquare = 0x33c5;
+  t.cedilla = 0x00b8;
+  t.cedillacmb = 0x0327;
+  t.cent = 0x00a2;
+  t.centigrade = 0x2103;
+  t.centinferior = 0xf6df;
+  t.centmonospace = 0xffe0;
+  t.centoldstyle = 0xf7a2;
+  t.centsuperior = 0xf6e0;
+  t.chaarmenian = 0x0579;
+  t.chabengali = 0x099b;
+  t.chadeva = 0x091b;
+  t.chagujarati = 0x0a9b;
+  t.chagurmukhi = 0x0a1b;
+  t.chbopomofo = 0x3114;
+  t.cheabkhasiancyrillic = 0x04bd;
+  t.checkmark = 0x2713;
+  t.checyrillic = 0x0447;
+  t.chedescenderabkhasiancyrillic = 0x04bf;
+  t.chedescendercyrillic = 0x04b7;
+  t.chedieresiscyrillic = 0x04f5;
+  t.cheharmenian = 0x0573;
+  t.chekhakassiancyrillic = 0x04cc;
+  t.cheverticalstrokecyrillic = 0x04b9;
+  t.chi = 0x03c7;
+  t.chieuchacirclekorean = 0x3277;
+  t.chieuchaparenkorean = 0x3217;
+  t.chieuchcirclekorean = 0x3269;
+  t.chieuchkorean = 0x314a;
+  t.chieuchparenkorean = 0x3209;
+  t.chochangthai = 0x0e0a;
+  t.chochanthai = 0x0e08;
+  t.chochingthai = 0x0e09;
+  t.chochoethai = 0x0e0c;
+  t.chook = 0x0188;
+  t.cieucacirclekorean = 0x3276;
+  t.cieucaparenkorean = 0x3216;
+  t.cieuccirclekorean = 0x3268;
+  t.cieuckorean = 0x3148;
+  t.cieucparenkorean = 0x3208;
+  t.cieucuparenkorean = 0x321c;
+  t.circle = 0x25cb;
+  t.circlecopyrt = 0x00a9;
+  t.circlemultiply = 0x2297;
+  t.circleot = 0x2299;
+  t.circleplus = 0x2295;
+  t.circlepostalmark = 0x3036;
+  t.circlewithlefthalfblack = 0x25d0;
+  t.circlewithrighthalfblack = 0x25d1;
+  t.circumflex = 0x02c6;
+  t.circumflexbelowcmb = 0x032d;
+  t.circumflexcmb = 0x0302;
+  t.clear = 0x2327;
+  t.clickalveolar = 0x01c2;
+  t.clickdental = 0x01c0;
+  t.clicklateral = 0x01c1;
+  t.clickretroflex = 0x01c3;
+  t.club = 0x2663;
+  t.clubsuitblack = 0x2663;
+  t.clubsuitwhite = 0x2667;
+  t.cmcubedsquare = 0x33a4;
+  t.cmonospace = 0xff43;
+  t.cmsquaredsquare = 0x33a0;
+  t.coarmenian = 0x0581;
+  t.colon = 0x003a;
+  t.colonmonetary = 0x20a1;
+  t.colonmonospace = 0xff1a;
+  t.colonsign = 0x20a1;
+  t.colonsmall = 0xfe55;
+  t.colontriangularhalfmod = 0x02d1;
+  t.colontriangularmod = 0x02d0;
+  t.comma = 0x002c;
+  t.commaabovecmb = 0x0313;
+  t.commaaboverightcmb = 0x0315;
+  t.commaaccent = 0xf6c3;
+  t.commaarabic = 0x060c;
+  t.commaarmenian = 0x055d;
+  t.commainferior = 0xf6e1;
+  t.commamonospace = 0xff0c;
+  t.commareversedabovecmb = 0x0314;
+  t.commareversedmod = 0x02bd;
+  t.commasmall = 0xfe50;
+  t.commasuperior = 0xf6e2;
+  t.commaturnedabovecmb = 0x0312;
+  t.commaturnedmod = 0x02bb;
+  t.compass = 0x263c;
+  t.congruent = 0x2245;
+  t.contourintegral = 0x222e;
+  t.control = 0x2303;
+  t.controlACK = 0x0006;
+  t.controlBEL = 0x0007;
+  t.controlBS = 0x0008;
+  t.controlCAN = 0x0018;
+  t.controlCR = 0x000d;
+  t.controlDC1 = 0x0011;
+  t.controlDC2 = 0x0012;
+  t.controlDC3 = 0x0013;
+  t.controlDC4 = 0x0014;
+  t.controlDEL = 0x007f;
+  t.controlDLE = 0x0010;
+  t.controlEM = 0x0019;
+  t.controlENQ = 0x0005;
+  t.controlEOT = 0x0004;
+  t.controlESC = 0x001b;
+  t.controlETB = 0x0017;
+  t.controlETX = 0x0003;
+  t.controlFF = 0x000c;
+  t.controlFS = 0x001c;
+  t.controlGS = 0x001d;
+  t.controlHT = 0x0009;
+  t.controlLF = 0x000a;
+  t.controlNAK = 0x0015;
+  t.controlNULL = 0x0000;
+  t.controlRS = 0x001e;
+  t.controlSI = 0x000f;
+  t.controlSO = 0x000e;
+  t.controlSOT = 0x0002;
+  t.controlSTX = 0x0001;
+  t.controlSUB = 0x001a;
+  t.controlSYN = 0x0016;
+  t.controlUS = 0x001f;
+  t.controlVT = 0x000b;
+  t.copyright = 0x00a9;
+  t.copyrightsans = 0xf8e9;
+  t.copyrightserif = 0xf6d9;
+  t.cornerbracketleft = 0x300c;
+  t.cornerbracketlefthalfwidth = 0xff62;
+  t.cornerbracketleftvertical = 0xfe41;
+  t.cornerbracketright = 0x300d;
+  t.cornerbracketrighthalfwidth = 0xff63;
+  t.cornerbracketrightvertical = 0xfe42;
+  t.corporationsquare = 0x337f;
+  t.cosquare = 0x33c7;
+  t.coverkgsquare = 0x33c6;
+  t.cparen = 0x249e;
+  t.cruzeiro = 0x20a2;
+  t.cstretched = 0x0297;
+  t.curlyand = 0x22cf;
+  t.curlyor = 0x22ce;
+  t.currency = 0x00a4;
+  t.cyrBreve = 0xf6d1;
+  t.cyrFlex = 0xf6d2;
+  t.cyrbreve = 0xf6d4;
+  t.cyrflex = 0xf6d5;
+  t.d = 0x0064;
+  t.daarmenian = 0x0564;
+  t.dabengali = 0x09a6;
+  t.dadarabic = 0x0636;
+  t.dadeva = 0x0926;
+  t.dadfinalarabic = 0xfebe;
+  t.dadinitialarabic = 0xfebf;
+  t.dadmedialarabic = 0xfec0;
+  t.dagesh = 0x05bc;
+  t.dageshhebrew = 0x05bc;
+  t.dagger = 0x2020;
+  t.daggerdbl = 0x2021;
+  t.dagujarati = 0x0aa6;
+  t.dagurmukhi = 0x0a26;
+  t.dahiragana = 0x3060;
+  t.dakatakana = 0x30c0;
+  t.dalarabic = 0x062f;
+  t.dalet = 0x05d3;
+  t.daletdagesh = 0xfb33;
+  t.daletdageshhebrew = 0xfb33;
+  t.dalethebrew = 0x05d3;
+  t.dalfinalarabic = 0xfeaa;
+  t.dammaarabic = 0x064f;
+  t.dammalowarabic = 0x064f;
+  t.dammatanaltonearabic = 0x064c;
+  t.dammatanarabic = 0x064c;
+  t.danda = 0x0964;
+  t.dargahebrew = 0x05a7;
+  t.dargalefthebrew = 0x05a7;
+  t.dasiapneumatacyrilliccmb = 0x0485;
+  t.dblGrave = 0xf6d3;
+  t.dblanglebracketleft = 0x300a;
+  t.dblanglebracketleftvertical = 0xfe3d;
+  t.dblanglebracketright = 0x300b;
+  t.dblanglebracketrightvertical = 0xfe3e;
+  t.dblarchinvertedbelowcmb = 0x032b;
+  t.dblarrowleft = 0x21d4;
+  t.dblarrowright = 0x21d2;
+  t.dbldanda = 0x0965;
+  t.dblgrave = 0xf6d6;
+  t.dblgravecmb = 0x030f;
+  t.dblintegral = 0x222c;
+  t.dbllowline = 0x2017;
+  t.dbllowlinecmb = 0x0333;
+  t.dbloverlinecmb = 0x033f;
+  t.dblprimemod = 0x02ba;
+  t.dblverticalbar = 0x2016;
+  t.dblverticallineabovecmb = 0x030e;
+  t.dbopomofo = 0x3109;
+  t.dbsquare = 0x33c8;
+  t.dcaron = 0x010f;
+  t.dcedilla = 0x1e11;
+  t.dcircle = 0x24d3;
+  t.dcircumflexbelow = 0x1e13;
+  t.dcroat = 0x0111;
+  t.ddabengali = 0x09a1;
+  t.ddadeva = 0x0921;
+  t.ddagujarati = 0x0aa1;
+  t.ddagurmukhi = 0x0a21;
+  t.ddalarabic = 0x0688;
+  t.ddalfinalarabic = 0xfb89;
+  t.dddhadeva = 0x095c;
+  t.ddhabengali = 0x09a2;
+  t.ddhadeva = 0x0922;
+  t.ddhagujarati = 0x0aa2;
+  t.ddhagurmukhi = 0x0a22;
+  t.ddotaccent = 0x1e0b;
+  t.ddotbelow = 0x1e0d;
+  t.decimalseparatorarabic = 0x066b;
+  t.decimalseparatorpersian = 0x066b;
+  t.decyrillic = 0x0434;
+  t.degree = 0x00b0;
+  t.dehihebrew = 0x05ad;
+  t.dehiragana = 0x3067;
+  t.deicoptic = 0x03ef;
+  t.dekatakana = 0x30c7;
+  t.deleteleft = 0x232b;
+  t.deleteright = 0x2326;
+  t.delta = 0x03b4;
+  t.deltaturned = 0x018d;
+  t.denominatorminusonenumeratorbengali = 0x09f8;
+  t.dezh = 0x02a4;
+  t.dhabengali = 0x09a7;
+  t.dhadeva = 0x0927;
+  t.dhagujarati = 0x0aa7;
+  t.dhagurmukhi = 0x0a27;
+  t.dhook = 0x0257;
+  t.dialytikatonos = 0x0385;
+  t.dialytikatonoscmb = 0x0344;
+  t.diamond = 0x2666;
+  t.diamondsuitwhite = 0x2662;
+  t.dieresis = 0x00a8;
+  t.dieresisacute = 0xf6d7;
+  t.dieresisbelowcmb = 0x0324;
+  t.dieresiscmb = 0x0308;
+  t.dieresisgrave = 0xf6d8;
+  t.dieresistonos = 0x0385;
+  t.dihiragana = 0x3062;
+  t.dikatakana = 0x30c2;
+  t.dittomark = 0x3003;
+  t.divide = 0x00f7;
+  t.divides = 0x2223;
+  t.divisionslash = 0x2215;
+  t.djecyrillic = 0x0452;
+  t.dkshade = 0x2593;
+  t.dlinebelow = 0x1e0f;
+  t.dlsquare = 0x3397;
+  t.dmacron = 0x0111;
+  t.dmonospace = 0xff44;
+  t.dnblock = 0x2584;
+  t.dochadathai = 0x0e0e;
+  t.dodekthai = 0x0e14;
+  t.dohiragana = 0x3069;
+  t.dokatakana = 0x30c9;
+  t.dollar = 0x0024;
+  t.dollarinferior = 0xf6e3;
+  t.dollarmonospace = 0xff04;
+  t.dollaroldstyle = 0xf724;
+  t.dollarsmall = 0xfe69;
+  t.dollarsuperior = 0xf6e4;
+  t.dong = 0x20ab;
+  t.dorusquare = 0x3326;
+  t.dotaccent = 0x02d9;
+  t.dotaccentcmb = 0x0307;
+  t.dotbelowcmb = 0x0323;
+  t.dotbelowcomb = 0x0323;
+  t.dotkatakana = 0x30fb;
+  t.dotlessi = 0x0131;
+  t.dotlessj = 0xf6be;
+  t.dotlessjstrokehook = 0x0284;
+  t.dotmath = 0x22c5;
+  t.dottedcircle = 0x25cc;
+  t.doubleyodpatah = 0xfb1f;
+  t.doubleyodpatahhebrew = 0xfb1f;
+  t.downtackbelowcmb = 0x031e;
+  t.downtackmod = 0x02d5;
+  t.dparen = 0x249f;
+  t.dsuperior = 0xf6eb;
+  t.dtail = 0x0256;
+  t.dtopbar = 0x018c;
+  t.duhiragana = 0x3065;
+  t.dukatakana = 0x30c5;
+  t.dz = 0x01f3;
+  t.dzaltone = 0x02a3;
+  t.dzcaron = 0x01c6;
+  t.dzcurl = 0x02a5;
+  t.dzeabkhasiancyrillic = 0x04e1;
+  t.dzecyrillic = 0x0455;
+  t.dzhecyrillic = 0x045f;
+  t.e = 0x0065;
+  t.eacute = 0x00e9;
+  t.earth = 0x2641;
+  t.ebengali = 0x098f;
+  t.ebopomofo = 0x311c;
+  t.ebreve = 0x0115;
+  t.ecandradeva = 0x090d;
+  t.ecandragujarati = 0x0a8d;
+  t.ecandravowelsigndeva = 0x0945;
+  t.ecandravowelsigngujarati = 0x0ac5;
+  t.ecaron = 0x011b;
+  t.ecedillabreve = 0x1e1d;
+  t.echarmenian = 0x0565;
+  t.echyiwnarmenian = 0x0587;
+  t.ecircle = 0x24d4;
+  t.ecircumflex = 0x00ea;
+  t.ecircumflexacute = 0x1ebf;
+  t.ecircumflexbelow = 0x1e19;
+  t.ecircumflexdotbelow = 0x1ec7;
+  t.ecircumflexgrave = 0x1ec1;
+  t.ecircumflexhookabove = 0x1ec3;
+  t.ecircumflextilde = 0x1ec5;
+  t.ecyrillic = 0x0454;
+  t.edblgrave = 0x0205;
+  t.edeva = 0x090f;
+  t.edieresis = 0x00eb;
+  t.edot = 0x0117;
+  t.edotaccent = 0x0117;
+  t.edotbelow = 0x1eb9;
+  t.eegurmukhi = 0x0a0f;
+  t.eematragurmukhi = 0x0a47;
+  t.efcyrillic = 0x0444;
+  t.egrave = 0x00e8;
+  t.egujarati = 0x0a8f;
+  t.eharmenian = 0x0567;
+  t.ehbopomofo = 0x311d;
+  t.ehiragana = 0x3048;
+  t.ehookabove = 0x1ebb;
+  t.eibopomofo = 0x311f;
+  t.eight = 0x0038;
+  t.eightarabic = 0x0668;
+  t.eightbengali = 0x09ee;
+  t.eightcircle = 0x2467;
+  t.eightcircleinversesansserif = 0x2791;
+  t.eightdeva = 0x096e;
+  t.eighteencircle = 0x2471;
+  t.eighteenparen = 0x2485;
+  t.eighteenperiod = 0x2499;
+  t.eightgujarati = 0x0aee;
+  t.eightgurmukhi = 0x0a6e;
+  t.eighthackarabic = 0x0668;
+  t.eighthangzhou = 0x3028;
+  t.eighthnotebeamed = 0x266b;
+  t.eightideographicparen = 0x3227;
+  t.eightinferior = 0x2088;
+  t.eightmonospace = 0xff18;
+  t.eightoldstyle = 0xf738;
+  t.eightparen = 0x247b;
+  t.eightperiod = 0x248f;
+  t.eightpersian = 0x06f8;
+  t.eightroman = 0x2177;
+  t.eightsuperior = 0x2078;
+  t.eightthai = 0x0e58;
+  t.einvertedbreve = 0x0207;
+  t.eiotifiedcyrillic = 0x0465;
+  t.ekatakana = 0x30a8;
+  t.ekatakanahalfwidth = 0xff74;
+  t.ekonkargurmukhi = 0x0a74;
+  t.ekorean = 0x3154;
+  t.elcyrillic = 0x043b;
+  t.element = 0x2208;
+  t.elevencircle = 0x246a;
+  t.elevenparen = 0x247e;
+  t.elevenperiod = 0x2492;
+  t.elevenroman = 0x217a;
+  t.ellipsis = 0x2026;
+  t.ellipsisvertical = 0x22ee;
+  t.emacron = 0x0113;
+  t.emacronacute = 0x1e17;
+  t.emacrongrave = 0x1e15;
+  t.emcyrillic = 0x043c;
+  t.emdash = 0x2014;
+  t.emdashvertical = 0xfe31;
+  t.emonospace = 0xff45;
+  t.emphasismarkarmenian = 0x055b;
+  t.emptyset = 0x2205;
+  t.enbopomofo = 0x3123;
+  t.encyrillic = 0x043d;
+  t.endash = 0x2013;
+  t.endashvertical = 0xfe32;
+  t.endescendercyrillic = 0x04a3;
+  t.eng = 0x014b;
+  t.engbopomofo = 0x3125;
+  t.enghecyrillic = 0x04a5;
+  t.enhookcyrillic = 0x04c8;
+  t.enspace = 0x2002;
+  t.eogonek = 0x0119;
+  t.eokorean = 0x3153;
+  t.eopen = 0x025b;
+  t.eopenclosed = 0x029a;
+  t.eopenreversed = 0x025c;
+  t.eopenreversedclosed = 0x025e;
+  t.eopenreversedhook = 0x025d;
+  t.eparen = 0x24a0;
+  t.epsilon = 0x03b5;
+  t.epsilontonos = 0x03ad;
+  t.equal = 0x003d;
+  t.equalmonospace = 0xff1d;
+  t.equalsmall = 0xfe66;
+  t.equalsuperior = 0x207c;
+  t.equivalence = 0x2261;
+  t.erbopomofo = 0x3126;
+  t.ercyrillic = 0x0440;
+  t.ereversed = 0x0258;
+  t.ereversedcyrillic = 0x044d;
+  t.escyrillic = 0x0441;
+  t.esdescendercyrillic = 0x04ab;
+  t.esh = 0x0283;
+  t.eshcurl = 0x0286;
+  t.eshortdeva = 0x090e;
+  t.eshortvowelsigndeva = 0x0946;
+  t.eshreversedloop = 0x01aa;
+  t.eshsquatreversed = 0x0285;
+  t.esmallhiragana = 0x3047;
+  t.esmallkatakana = 0x30a7;
+  t.esmallkatakanahalfwidth = 0xff6a;
+  t.estimated = 0x212e;
+  t.esuperior = 0xf6ec;
+  t.eta = 0x03b7;
+  t.etarmenian = 0x0568;
+  t.etatonos = 0x03ae;
+  t.eth = 0x00f0;
+  t.etilde = 0x1ebd;
+  t.etildebelow = 0x1e1b;
+  t.etnahtafoukhhebrew = 0x0591;
+  t.etnahtafoukhlefthebrew = 0x0591;
+  t.etnahtahebrew = 0x0591;
+  t.etnahtalefthebrew = 0x0591;
+  t.eturned = 0x01dd;
+  t.eukorean = 0x3161;
+  t.euro = 0x20ac;
+  t.evowelsignbengali = 0x09c7;
+  t.evowelsigndeva = 0x0947;
+  t.evowelsigngujarati = 0x0ac7;
+  t.exclam = 0x0021;
+  t.exclamarmenian = 0x055c;
+  t.exclamdbl = 0x203c;
+  t.exclamdown = 0x00a1;
+  t.exclamdownsmall = 0xf7a1;
+  t.exclammonospace = 0xff01;
+  t.exclamsmall = 0xf721;
+  t.existential = 0x2203;
+  t.ezh = 0x0292;
+  t.ezhcaron = 0x01ef;
+  t.ezhcurl = 0x0293;
+  t.ezhreversed = 0x01b9;
+  t.ezhtail = 0x01ba;
+  t.f = 0x0066;
+  t.fadeva = 0x095e;
+  t.fagurmukhi = 0x0a5e;
+  t.fahrenheit = 0x2109;
+  t.fathaarabic = 0x064e;
+  t.fathalowarabic = 0x064e;
+  t.fathatanarabic = 0x064b;
+  t.fbopomofo = 0x3108;
+  t.fcircle = 0x24d5;
+  t.fdotaccent = 0x1e1f;
+  t.feharabic = 0x0641;
+  t.feharmenian = 0x0586;
+  t.fehfinalarabic = 0xfed2;
+  t.fehinitialarabic = 0xfed3;
+  t.fehmedialarabic = 0xfed4;
+  t.feicoptic = 0x03e5;
+  t.female = 0x2640;
+  t.ff = 0xfb00;
+  t.f_f = 0xfb00;
+  t.ffi = 0xfb03;
+  t.f_f_i = 0xfb03;
+  t.ffl = 0xfb04;
+  t.f_f_l = 0xfb04;
+  t.fi = 0xfb01;
+  t.f_i = 0xfb01;
+  t.fifteencircle = 0x246e;
+  t.fifteenparen = 0x2482;
+  t.fifteenperiod = 0x2496;
+  t.figuredash = 0x2012;
+  t.filledbox = 0x25a0;
+  t.filledrect = 0x25ac;
+  t.finalkaf = 0x05da;
+  t.finalkafdagesh = 0xfb3a;
+  t.finalkafdageshhebrew = 0xfb3a;
+  t.finalkafhebrew = 0x05da;
+  t.finalmem = 0x05dd;
+  t.finalmemhebrew = 0x05dd;
+  t.finalnun = 0x05df;
+  t.finalnunhebrew = 0x05df;
+  t.finalpe = 0x05e3;
+  t.finalpehebrew = 0x05e3;
+  t.finaltsadi = 0x05e5;
+  t.finaltsadihebrew = 0x05e5;
+  t.firsttonechinese = 0x02c9;
+  t.fisheye = 0x25c9;
+  t.fitacyrillic = 0x0473;
+  t.five = 0x0035;
+  t.fivearabic = 0x0665;
+  t.fivebengali = 0x09eb;
+  t.fivecircle = 0x2464;
+  t.fivecircleinversesansserif = 0x278e;
+  t.fivedeva = 0x096b;
+  t.fiveeighths = 0x215d;
+  t.fivegujarati = 0x0aeb;
+  t.fivegurmukhi = 0x0a6b;
+  t.fivehackarabic = 0x0665;
+  t.fivehangzhou = 0x3025;
+  t.fiveideographicparen = 0x3224;
+  t.fiveinferior = 0x2085;
+  t.fivemonospace = 0xff15;
+  t.fiveoldstyle = 0xf735;
+  t.fiveparen = 0x2478;
+  t.fiveperiod = 0x248c;
+  t.fivepersian = 0x06f5;
+  t.fiveroman = 0x2174;
+  t.fivesuperior = 0x2075;
+  t.fivethai = 0x0e55;
+  t.fl = 0xfb02;
+  t.f_l = 0xfb02;
+  t.florin = 0x0192;
+  t.fmonospace = 0xff46;
+  t.fmsquare = 0x3399;
+  t.fofanthai = 0x0e1f;
+  t.fofathai = 0x0e1d;
+  t.fongmanthai = 0x0e4f;
+  t.forall = 0x2200;
+  t.four = 0x0034;
+  t.fourarabic = 0x0664;
+  t.fourbengali = 0x09ea;
+  t.fourcircle = 0x2463;
+  t.fourcircleinversesansserif = 0x278d;
+  t.fourdeva = 0x096a;
+  t.fourgujarati = 0x0aea;
+  t.fourgurmukhi = 0x0a6a;
+  t.fourhackarabic = 0x0664;
+  t.fourhangzhou = 0x3024;
+  t.fourideographicparen = 0x3223;
+  t.fourinferior = 0x2084;
+  t.fourmonospace = 0xff14;
+  t.fournumeratorbengali = 0x09f7;
+  t.fouroldstyle = 0xf734;
+  t.fourparen = 0x2477;
+  t.fourperiod = 0x248b;
+  t.fourpersian = 0x06f4;
+  t.fourroman = 0x2173;
+  t.foursuperior = 0x2074;
+  t.fourteencircle = 0x246d;
+  t.fourteenparen = 0x2481;
+  t.fourteenperiod = 0x2495;
+  t.fourthai = 0x0e54;
+  t.fourthtonechinese = 0x02cb;
+  t.fparen = 0x24a1;
+  t.fraction = 0x2044;
+  t.franc = 0x20a3;
+  t.g = 0x0067;
+  t.gabengali = 0x0997;
+  t.gacute = 0x01f5;
+  t.gadeva = 0x0917;
+  t.gafarabic = 0x06af;
+  t.gaffinalarabic = 0xfb93;
+  t.gafinitialarabic = 0xfb94;
+  t.gafmedialarabic = 0xfb95;
+  t.gagujarati = 0x0a97;
+  t.gagurmukhi = 0x0a17;
+  t.gahiragana = 0x304c;
+  t.gakatakana = 0x30ac;
+  t.gamma = 0x03b3;
+  t.gammalatinsmall = 0x0263;
+  t.gammasuperior = 0x02e0;
+  t.gangiacoptic = 0x03eb;
+  t.gbopomofo = 0x310d;
+  t.gbreve = 0x011f;
+  t.gcaron = 0x01e7;
+  t.gcedilla = 0x0123;
+  t.gcircle = 0x24d6;
+  t.gcircumflex = 0x011d;
+  t.gcommaaccent = 0x0123;
+  t.gdot = 0x0121;
+  t.gdotaccent = 0x0121;
+  t.gecyrillic = 0x0433;
+  t.gehiragana = 0x3052;
+  t.gekatakana = 0x30b2;
+  t.geometricallyequal = 0x2251;
+  t.gereshaccenthebrew = 0x059c;
+  t.gereshhebrew = 0x05f3;
+  t.gereshmuqdamhebrew = 0x059d;
+  t.germandbls = 0x00df;
+  t.gershayimaccenthebrew = 0x059e;
+  t.gershayimhebrew = 0x05f4;
+  t.getamark = 0x3013;
+  t.ghabengali = 0x0998;
+  t.ghadarmenian = 0x0572;
+  t.ghadeva = 0x0918;
+  t.ghagujarati = 0x0a98;
+  t.ghagurmukhi = 0x0a18;
+  t.ghainarabic = 0x063a;
+  t.ghainfinalarabic = 0xfece;
+  t.ghaininitialarabic = 0xfecf;
+  t.ghainmedialarabic = 0xfed0;
+  t.ghemiddlehookcyrillic = 0x0495;
+  t.ghestrokecyrillic = 0x0493;
+  t.gheupturncyrillic = 0x0491;
+  t.ghhadeva = 0x095a;
+  t.ghhagurmukhi = 0x0a5a;
+  t.ghook = 0x0260;
+  t.ghzsquare = 0x3393;
+  t.gihiragana = 0x304e;
+  t.gikatakana = 0x30ae;
+  t.gimarmenian = 0x0563;
+  t.gimel = 0x05d2;
+  t.gimeldagesh = 0xfb32;
+  t.gimeldageshhebrew = 0xfb32;
+  t.gimelhebrew = 0x05d2;
+  t.gjecyrillic = 0x0453;
+  t.glottalinvertedstroke = 0x01be;
+  t.glottalstop = 0x0294;
+  t.glottalstopinverted = 0x0296;
+  t.glottalstopmod = 0x02c0;
+  t.glottalstopreversed = 0x0295;
+  t.glottalstopreversedmod = 0x02c1;
+  t.glottalstopreversedsuperior = 0x02e4;
+  t.glottalstopstroke = 0x02a1;
+  t.glottalstopstrokereversed = 0x02a2;
+  t.gmacron = 0x1e21;
+  t.gmonospace = 0xff47;
+  t.gohiragana = 0x3054;
+  t.gokatakana = 0x30b4;
+  t.gparen = 0x24a2;
+  t.gpasquare = 0x33ac;
+  t.gradient = 0x2207;
+  t.grave = 0x0060;
+  t.gravebelowcmb = 0x0316;
+  t.gravecmb = 0x0300;
+  t.gravecomb = 0x0300;
+  t.gravedeva = 0x0953;
+  t.gravelowmod = 0x02ce;
+  t.gravemonospace = 0xff40;
+  t.gravetonecmb = 0x0340;
+  t.greater = 0x003e;
+  t.greaterequal = 0x2265;
+  t.greaterequalorless = 0x22db;
+  t.greatermonospace = 0xff1e;
+  t.greaterorequivalent = 0x2273;
+  t.greaterorless = 0x2277;
+  t.greateroverequal = 0x2267;
+  t.greatersmall = 0xfe65;
+  t.gscript = 0x0261;
+  t.gstroke = 0x01e5;
+  t.guhiragana = 0x3050;
+  t.guillemotleft = 0x00ab;
+  t.guillemotright = 0x00bb;
+  t.guilsinglleft = 0x2039;
+  t.guilsinglright = 0x203a;
+  t.gukatakana = 0x30b0;
+  t.guramusquare = 0x3318;
+  t.gysquare = 0x33c9;
+  t.h = 0x0068;
+  t.haabkhasiancyrillic = 0x04a9;
+  t.haaltonearabic = 0x06c1;
+  t.habengali = 0x09b9;
+  t.hadescendercyrillic = 0x04b3;
+  t.hadeva = 0x0939;
+  t.hagujarati = 0x0ab9;
+  t.hagurmukhi = 0x0a39;
+  t.haharabic = 0x062d;
+  t.hahfinalarabic = 0xfea2;
+  t.hahinitialarabic = 0xfea3;
+  t.hahiragana = 0x306f;
+  t.hahmedialarabic = 0xfea4;
+  t.haitusquare = 0x332a;
+  t.hakatakana = 0x30cf;
+  t.hakatakanahalfwidth = 0xff8a;
+  t.halantgurmukhi = 0x0a4d;
+  t.hamzaarabic = 0x0621;
+  t.hamzalowarabic = 0x0621;
+  t.hangulfiller = 0x3164;
+  t.hardsigncyrillic = 0x044a;
+  t.harpoonleftbarbup = 0x21bc;
+  t.harpoonrightbarbup = 0x21c0;
+  t.hasquare = 0x33ca;
+  t.hatafpatah = 0x05b2;
+  t.hatafpatah16 = 0x05b2;
+  t.hatafpatah23 = 0x05b2;
+  t.hatafpatah2f = 0x05b2;
+  t.hatafpatahhebrew = 0x05b2;
+  t.hatafpatahnarrowhebrew = 0x05b2;
+  t.hatafpatahquarterhebrew = 0x05b2;
+  t.hatafpatahwidehebrew = 0x05b2;
+  t.hatafqamats = 0x05b3;
+  t.hatafqamats1b = 0x05b3;
+  t.hatafqamats28 = 0x05b3;
+  t.hatafqamats34 = 0x05b3;
+  t.hatafqamatshebrew = 0x05b3;
+  t.hatafqamatsnarrowhebrew = 0x05b3;
+  t.hatafqamatsquarterhebrew = 0x05b3;
+  t.hatafqamatswidehebrew = 0x05b3;
+  t.hatafsegol = 0x05b1;
+  t.hatafsegol17 = 0x05b1;
+  t.hatafsegol24 = 0x05b1;
+  t.hatafsegol30 = 0x05b1;
+  t.hatafsegolhebrew = 0x05b1;
+  t.hatafsegolnarrowhebrew = 0x05b1;
+  t.hatafsegolquarterhebrew = 0x05b1;
+  t.hatafsegolwidehebrew = 0x05b1;
+  t.hbar = 0x0127;
+  t.hbopomofo = 0x310f;
+  t.hbrevebelow = 0x1e2b;
+  t.hcedilla = 0x1e29;
+  t.hcircle = 0x24d7;
+  t.hcircumflex = 0x0125;
+  t.hdieresis = 0x1e27;
+  t.hdotaccent = 0x1e23;
+  t.hdotbelow = 0x1e25;
+  t.he = 0x05d4;
+  t.heart = 0x2665;
+  t.heartsuitblack = 0x2665;
+  t.heartsuitwhite = 0x2661;
+  t.hedagesh = 0xfb34;
+  t.hedageshhebrew = 0xfb34;
+  t.hehaltonearabic = 0x06c1;
+  t.heharabic = 0x0647;
+  t.hehebrew = 0x05d4;
+  t.hehfinalaltonearabic = 0xfba7;
+  t.hehfinalalttwoarabic = 0xfeea;
+  t.hehfinalarabic = 0xfeea;
+  t.hehhamzaabovefinalarabic = 0xfba5;
+  t.hehhamzaaboveisolatedarabic = 0xfba4;
+  t.hehinitialaltonearabic = 0xfba8;
+  t.hehinitialarabic = 0xfeeb;
+  t.hehiragana = 0x3078;
+  t.hehmedialaltonearabic = 0xfba9;
+  t.hehmedialarabic = 0xfeec;
+  t.heiseierasquare = 0x337b;
+  t.hekatakana = 0x30d8;
+  t.hekatakanahalfwidth = 0xff8d;
+  t.hekutaarusquare = 0x3336;
+  t.henghook = 0x0267;
+  t.herutusquare = 0x3339;
+  t.het = 0x05d7;
+  t.hethebrew = 0x05d7;
+  t.hhook = 0x0266;
+  t.hhooksuperior = 0x02b1;
+  t.hieuhacirclekorean = 0x327b;
+  t.hieuhaparenkorean = 0x321b;
+  t.hieuhcirclekorean = 0x326d;
+  t.hieuhkorean = 0x314e;
+  t.hieuhparenkorean = 0x320d;
+  t.hihiragana = 0x3072;
+  t.hikatakana = 0x30d2;
+  t.hikatakanahalfwidth = 0xff8b;
+  t.hiriq = 0x05b4;
+  t.hiriq14 = 0x05b4;
+  t.hiriq21 = 0x05b4;
+  t.hiriq2d = 0x05b4;
+  t.hiriqhebrew = 0x05b4;
+  t.hiriqnarrowhebrew = 0x05b4;
+  t.hiriqquarterhebrew = 0x05b4;
+  t.hiriqwidehebrew = 0x05b4;
+  t.hlinebelow = 0x1e96;
+  t.hmonospace = 0xff48;
+  t.hoarmenian = 0x0570;
+  t.hohipthai = 0x0e2b;
+  t.hohiragana = 0x307b;
+  t.hokatakana = 0x30db;
+  t.hokatakanahalfwidth = 0xff8e;
+  t.holam = 0x05b9;
+  t.holam19 = 0x05b9;
+  t.holam26 = 0x05b9;
+  t.holam32 = 0x05b9;
+  t.holamhebrew = 0x05b9;
+  t.holamnarrowhebrew = 0x05b9;
+  t.holamquarterhebrew = 0x05b9;
+  t.holamwidehebrew = 0x05b9;
+  t.honokhukthai = 0x0e2e;
+  t.hookabovecomb = 0x0309;
+  t.hookcmb = 0x0309;
+  t.hookpalatalizedbelowcmb = 0x0321;
+  t.hookretroflexbelowcmb = 0x0322;
+  t.hoonsquare = 0x3342;
+  t.horicoptic = 0x03e9;
+  t.horizontalbar = 0x2015;
+  t.horncmb = 0x031b;
+  t.hotsprings = 0x2668;
+  t.house = 0x2302;
+  t.hparen = 0x24a3;
+  t.hsuperior = 0x02b0;
+  t.hturned = 0x0265;
+  t.huhiragana = 0x3075;
+  t.huiitosquare = 0x3333;
+  t.hukatakana = 0x30d5;
+  t.hukatakanahalfwidth = 0xff8c;
+  t.hungarumlaut = 0x02dd;
+  t.hungarumlautcmb = 0x030b;
+  t.hv = 0x0195;
+  t.hyphen = 0x002d;
+  t.hypheninferior = 0xf6e5;
+  t.hyphenmonospace = 0xff0d;
+  t.hyphensmall = 0xfe63;
+  t.hyphensuperior = 0xf6e6;
+  t.hyphentwo = 0x2010;
+  t.i = 0x0069;
+  t.iacute = 0x00ed;
+  t.iacyrillic = 0x044f;
+  t.ibengali = 0x0987;
+  t.ibopomofo = 0x3127;
+  t.ibreve = 0x012d;
+  t.icaron = 0x01d0;
+  t.icircle = 0x24d8;
+  t.icircumflex = 0x00ee;
+  t.icyrillic = 0x0456;
+  t.idblgrave = 0x0209;
+  t.ideographearthcircle = 0x328f;
+  t.ideographfirecircle = 0x328b;
+  t.ideographicallianceparen = 0x323f;
+  t.ideographiccallparen = 0x323a;
+  t.ideographiccentrecircle = 0x32a5;
+  t.ideographicclose = 0x3006;
+  t.ideographiccomma = 0x3001;
+  t.ideographiccommaleft = 0xff64;
+  t.ideographiccongratulationparen = 0x3237;
+  t.ideographiccorrectcircle = 0x32a3;
+  t.ideographicearthparen = 0x322f;
+  t.ideographicenterpriseparen = 0x323d;
+  t.ideographicexcellentcircle = 0x329d;
+  t.ideographicfestivalparen = 0x3240;
+  t.ideographicfinancialcircle = 0x3296;
+  t.ideographicfinancialparen = 0x3236;
+  t.ideographicfireparen = 0x322b;
+  t.ideographichaveparen = 0x3232;
+  t.ideographichighcircle = 0x32a4;
+  t.ideographiciterationmark = 0x3005;
+  t.ideographiclaborcircle = 0x3298;
+  t.ideographiclaborparen = 0x3238;
+  t.ideographicleftcircle = 0x32a7;
+  t.ideographiclowcircle = 0x32a6;
+  t.ideographicmedicinecircle = 0x32a9;
+  t.ideographicmetalparen = 0x322e;
+  t.ideographicmoonparen = 0x322a;
+  t.ideographicnameparen = 0x3234;
+  t.ideographicperiod = 0x3002;
+  t.ideographicprintcircle = 0x329e;
+  t.ideographicreachparen = 0x3243;
+  t.ideographicrepresentparen = 0x3239;
+  t.ideographicresourceparen = 0x323e;
+  t.ideographicrightcircle = 0x32a8;
+  t.ideographicsecretcircle = 0x3299;
+  t.ideographicselfparen = 0x3242;
+  t.ideographicsocietyparen = 0x3233;
+  t.ideographicspace = 0x3000;
+  t.ideographicspecialparen = 0x3235;
+  t.ideographicstockparen = 0x3231;
+  t.ideographicstudyparen = 0x323b;
+  t.ideographicsunparen = 0x3230;
+  t.ideographicsuperviseparen = 0x323c;
+  t.ideographicwaterparen = 0x322c;
+  t.ideographicwoodparen = 0x322d;
+  t.ideographiczero = 0x3007;
+  t.ideographmetalcircle = 0x328e;
+  t.ideographmooncircle = 0x328a;
+  t.ideographnamecircle = 0x3294;
+  t.ideographsuncircle = 0x3290;
+  t.ideographwatercircle = 0x328c;
+  t.ideographwoodcircle = 0x328d;
+  t.ideva = 0x0907;
+  t.idieresis = 0x00ef;
+  t.idieresisacute = 0x1e2f;
+  t.idieresiscyrillic = 0x04e5;
+  t.idotbelow = 0x1ecb;
+  t.iebrevecyrillic = 0x04d7;
+  t.iecyrillic = 0x0435;
+  t.ieungacirclekorean = 0x3275;
+  t.ieungaparenkorean = 0x3215;
+  t.ieungcirclekorean = 0x3267;
+  t.ieungkorean = 0x3147;
+  t.ieungparenkorean = 0x3207;
+  t.igrave = 0x00ec;
+  t.igujarati = 0x0a87;
+  t.igurmukhi = 0x0a07;
+  t.ihiragana = 0x3044;
+  t.ihookabove = 0x1ec9;
+  t.iibengali = 0x0988;
+  t.iicyrillic = 0x0438;
+  t.iideva = 0x0908;
+  t.iigujarati = 0x0a88;
+  t.iigurmukhi = 0x0a08;
+  t.iimatragurmukhi = 0x0a40;
+  t.iinvertedbreve = 0x020b;
+  t.iishortcyrillic = 0x0439;
+  t.iivowelsignbengali = 0x09c0;
+  t.iivowelsigndeva = 0x0940;
+  t.iivowelsigngujarati = 0x0ac0;
+  t.ij = 0x0133;
+  t.ikatakana = 0x30a4;
+  t.ikatakanahalfwidth = 0xff72;
+  t.ikorean = 0x3163;
+  t.ilde = 0x02dc;
+  t.iluyhebrew = 0x05ac;
+  t.imacron = 0x012b;
+  t.imacroncyrillic = 0x04e3;
+  t.imageorapproximatelyequal = 0x2253;
+  t.imatragurmukhi = 0x0a3f;
+  t.imonospace = 0xff49;
+  t.increment = 0x2206;
+  t.infinity = 0x221e;
+  t.iniarmenian = 0x056b;
+  t.integral = 0x222b;
+  t.integralbottom = 0x2321;
+  t.integralbt = 0x2321;
+  t.integralex = 0xf8f5;
+  t.integraltop = 0x2320;
+  t.integraltp = 0x2320;
+  t.intersection = 0x2229;
+  t.intisquare = 0x3305;
+  t.invbullet = 0x25d8;
+  t.invcircle = 0x25d9;
+  t.invsmileface = 0x263b;
+  t.iocyrillic = 0x0451;
+  t.iogonek = 0x012f;
+  t.iota = 0x03b9;
+  t.iotadieresis = 0x03ca;
+  t.iotadieresistonos = 0x0390;
+  t.iotalatin = 0x0269;
+  t.iotatonos = 0x03af;
+  t.iparen = 0x24a4;
+  t.irigurmukhi = 0x0a72;
+  t.ismallhiragana = 0x3043;
+  t.ismallkatakana = 0x30a3;
+  t.ismallkatakanahalfwidth = 0xff68;
+  t.issharbengali = 0x09fa;
+  t.istroke = 0x0268;
+  t.isuperior = 0xf6ed;
+  t.iterationhiragana = 0x309d;
+  t.iterationkatakana = 0x30fd;
+  t.itilde = 0x0129;
+  t.itildebelow = 0x1e2d;
+  t.iubopomofo = 0x3129;
+  t.iucyrillic = 0x044e;
+  t.ivowelsignbengali = 0x09bf;
+  t.ivowelsigndeva = 0x093f;
+  t.ivowelsigngujarati = 0x0abf;
+  t.izhitsacyrillic = 0x0475;
+  t.izhitsadblgravecyrillic = 0x0477;
+  t.j = 0x006a;
+  t.jaarmenian = 0x0571;
+  t.jabengali = 0x099c;
+  t.jadeva = 0x091c;
+  t.jagujarati = 0x0a9c;
+  t.jagurmukhi = 0x0a1c;
+  t.jbopomofo = 0x3110;
+  t.jcaron = 0x01f0;
+  t.jcircle = 0x24d9;
+  t.jcircumflex = 0x0135;
+  t.jcrossedtail = 0x029d;
+  t.jdotlessstroke = 0x025f;
+  t.jecyrillic = 0x0458;
+  t.jeemarabic = 0x062c;
+  t.jeemfinalarabic = 0xfe9e;
+  t.jeeminitialarabic = 0xfe9f;
+  t.jeemmedialarabic = 0xfea0;
+  t.jeharabic = 0x0698;
+  t.jehfinalarabic = 0xfb8b;
+  t.jhabengali = 0x099d;
+  t.jhadeva = 0x091d;
+  t.jhagujarati = 0x0a9d;
+  t.jhagurmukhi = 0x0a1d;
+  t.jheharmenian = 0x057b;
+  t.jis = 0x3004;
+  t.jmonospace = 0xff4a;
+  t.jparen = 0x24a5;
+  t.jsuperior = 0x02b2;
+  t.k = 0x006b;
+  t.kabashkircyrillic = 0x04a1;
+  t.kabengali = 0x0995;
+  t.kacute = 0x1e31;
+  t.kacyrillic = 0x043a;
+  t.kadescendercyrillic = 0x049b;
+  t.kadeva = 0x0915;
+  t.kaf = 0x05db;
+  t.kafarabic = 0x0643;
+  t.kafdagesh = 0xfb3b;
+  t.kafdageshhebrew = 0xfb3b;
+  t.kaffinalarabic = 0xfeda;
+  t.kafhebrew = 0x05db;
+  t.kafinitialarabic = 0xfedb;
+  t.kafmedialarabic = 0xfedc;
+  t.kafrafehebrew = 0xfb4d;
+  t.kagujarati = 0x0a95;
+  t.kagurmukhi = 0x0a15;
+  t.kahiragana = 0x304b;
+  t.kahookcyrillic = 0x04c4;
+  t.kakatakana = 0x30ab;
+  t.kakatakanahalfwidth = 0xff76;
+  t.kappa = 0x03ba;
+  t.kappasymbolgreek = 0x03f0;
+  t.kapyeounmieumkorean = 0x3171;
+  t.kapyeounphieuphkorean = 0x3184;
+  t.kapyeounpieupkorean = 0x3178;
+  t.kapyeounssangpieupkorean = 0x3179;
+  t.karoriisquare = 0x330d;
+  t.kashidaautoarabic = 0x0640;
+  t.kashidaautonosidebearingarabic = 0x0640;
+  t.kasmallkatakana = 0x30f5;
+  t.kasquare = 0x3384;
+  t.kasraarabic = 0x0650;
+  t.kasratanarabic = 0x064d;
+  t.kastrokecyrillic = 0x049f;
+  t.katahiraprolongmarkhalfwidth = 0xff70;
+  t.kaverticalstrokecyrillic = 0x049d;
+  t.kbopomofo = 0x310e;
+  t.kcalsquare = 0x3389;
+  t.kcaron = 0x01e9;
+  t.kcedilla = 0x0137;
+  t.kcircle = 0x24da;
+  t.kcommaaccent = 0x0137;
+  t.kdotbelow = 0x1e33;
+  t.keharmenian = 0x0584;
+  t.kehiragana = 0x3051;
+  t.kekatakana = 0x30b1;
+  t.kekatakanahalfwidth = 0xff79;
+  t.kenarmenian = 0x056f;
+  t.kesmallkatakana = 0x30f6;
+  t.kgreenlandic = 0x0138;
+  t.khabengali = 0x0996;
+  t.khacyrillic = 0x0445;
+  t.khadeva = 0x0916;
+  t.khagujarati = 0x0a96;
+  t.khagurmukhi = 0x0a16;
+  t.khaharabic = 0x062e;
+  t.khahfinalarabic = 0xfea6;
+  t.khahinitialarabic = 0xfea7;
+  t.khahmedialarabic = 0xfea8;
+  t.kheicoptic = 0x03e7;
+  t.khhadeva = 0x0959;
+  t.khhagurmukhi = 0x0a59;
+  t.khieukhacirclekorean = 0x3278;
+  t.khieukhaparenkorean = 0x3218;
+  t.khieukhcirclekorean = 0x326a;
+  t.khieukhkorean = 0x314b;
+  t.khieukhparenkorean = 0x320a;
+  t.khokhaithai = 0x0e02;
+  t.khokhonthai = 0x0e05;
+  t.khokhuatthai = 0x0e03;
+  t.khokhwaithai = 0x0e04;
+  t.khomutthai = 0x0e5b;
+  t.khook = 0x0199;
+  t.khorakhangthai = 0x0e06;
+  t.khzsquare = 0x3391;
+  t.kihiragana = 0x304d;
+  t.kikatakana = 0x30ad;
+  t.kikatakanahalfwidth = 0xff77;
+  t.kiroguramusquare = 0x3315;
+  t.kiromeetorusquare = 0x3316;
+  t.kirosquare = 0x3314;
+  t.kiyeokacirclekorean = 0x326e;
+  t.kiyeokaparenkorean = 0x320e;
+  t.kiyeokcirclekorean = 0x3260;
+  t.kiyeokkorean = 0x3131;
+  t.kiyeokparenkorean = 0x3200;
+  t.kiyeoksioskorean = 0x3133;
+  t.kjecyrillic = 0x045c;
+  t.klinebelow = 0x1e35;
+  t.klsquare = 0x3398;
+  t.kmcubedsquare = 0x33a6;
+  t.kmonospace = 0xff4b;
+  t.kmsquaredsquare = 0x33a2;
+  t.kohiragana = 0x3053;
+  t.kohmsquare = 0x33c0;
+  t.kokaithai = 0x0e01;
+  t.kokatakana = 0x30b3;
+  t.kokatakanahalfwidth = 0xff7a;
+  t.kooposquare = 0x331e;
+  t.koppacyrillic = 0x0481;
+  t.koreanstandardsymbol = 0x327f;
+  t.koroniscmb = 0x0343;
+  t.kparen = 0x24a6;
+  t.kpasquare = 0x33aa;
+  t.ksicyrillic = 0x046f;
+  t.ktsquare = 0x33cf;
+  t.kturned = 0x029e;
+  t.kuhiragana = 0x304f;
+  t.kukatakana = 0x30af;
+  t.kukatakanahalfwidth = 0xff78;
+  t.kvsquare = 0x33b8;
+  t.kwsquare = 0x33be;
+  t.l = 0x006c;
+  t.labengali = 0x09b2;
+  t.lacute = 0x013a;
+  t.ladeva = 0x0932;
+  t.lagujarati = 0x0ab2;
+  t.lagurmukhi = 0x0a32;
+  t.lakkhangyaothai = 0x0e45;
+  t.lamaleffinalarabic = 0xfefc;
+  t.lamalefhamzaabovefinalarabic = 0xfef8;
+  t.lamalefhamzaaboveisolatedarabic = 0xfef7;
+  t.lamalefhamzabelowfinalarabic = 0xfefa;
+  t.lamalefhamzabelowisolatedarabic = 0xfef9;
+  t.lamalefisolatedarabic = 0xfefb;
+  t.lamalefmaddaabovefinalarabic = 0xfef6;
+  t.lamalefmaddaaboveisolatedarabic = 0xfef5;
+  t.lamarabic = 0x0644;
+  t.lambda = 0x03bb;
+  t.lambdastroke = 0x019b;
+  t.lamed = 0x05dc;
+  t.lameddagesh = 0xfb3c;
+  t.lameddageshhebrew = 0xfb3c;
+  t.lamedhebrew = 0x05dc;
+  t.lamfinalarabic = 0xfede;
+  t.lamhahinitialarabic = 0xfcca;
+  t.laminitialarabic = 0xfedf;
+  t.lamjeeminitialarabic = 0xfcc9;
+  t.lamkhahinitialarabic = 0xfccb;
+  t.lamlamhehisolatedarabic = 0xfdf2;
+  t.lammedialarabic = 0xfee0;
+  t.lammeemhahinitialarabic = 0xfd88;
+  t.lammeeminitialarabic = 0xfccc;
+  t.largecircle = 0x25ef;
+  t.lbar = 0x019a;
+  t.lbelt = 0x026c;
+  t.lbopomofo = 0x310c;
+  t.lcaron = 0x013e;
+  t.lcedilla = 0x013c;
+  t.lcircle = 0x24db;
+  t.lcircumflexbelow = 0x1e3d;
+  t.lcommaaccent = 0x013c;
+  t.ldot = 0x0140;
+  t.ldotaccent = 0x0140;
+  t.ldotbelow = 0x1e37;
+  t.ldotbelowmacron = 0x1e39;
+  t.leftangleabovecmb = 0x031a;
+  t.lefttackbelowcmb = 0x0318;
+  t.less = 0x003c;
+  t.lessequal = 0x2264;
+  t.lessequalorgreater = 0x22da;
+  t.lessmonospace = 0xff1c;
+  t.lessorequivalent = 0x2272;
+  t.lessorgreater = 0x2276;
+  t.lessoverequal = 0x2266;
+  t.lesssmall = 0xfe64;
+  t.lezh = 0x026e;
+  t.lfblock = 0x258c;
+  t.lhookretroflex = 0x026d;
+  t.lira = 0x20a4;
+  t.liwnarmenian = 0x056c;
+  t.lj = 0x01c9;
+  t.ljecyrillic = 0x0459;
+  t.ll = 0xf6c0;
+  t.lladeva = 0x0933;
+  t.llagujarati = 0x0ab3;
+  t.llinebelow = 0x1e3b;
+  t.llladeva = 0x0934;
+  t.llvocalicbengali = 0x09e1;
+  t.llvocalicdeva = 0x0961;
+  t.llvocalicvowelsignbengali = 0x09e3;
+  t.llvocalicvowelsigndeva = 0x0963;
+  t.lmiddletilde = 0x026b;
+  t.lmonospace = 0xff4c;
+  t.lmsquare = 0x33d0;
+  t.lochulathai = 0x0e2c;
+  t.logicaland = 0x2227;
+  t.logicalnot = 0x00ac;
+  t.logicalnotreversed = 0x2310;
+  t.logicalor = 0x2228;
+  t.lolingthai = 0x0e25;
+  t.longs = 0x017f;
+  t.lowlinecenterline = 0xfe4e;
+  t.lowlinecmb = 0x0332;
+  t.lowlinedashed = 0xfe4d;
+  t.lozenge = 0x25ca;
+  t.lparen = 0x24a7;
+  t.lslash = 0x0142;
+  t.lsquare = 0x2113;
+  t.lsuperior = 0xf6ee;
+  t.ltshade = 0x2591;
+  t.luthai = 0x0e26;
+  t.lvocalicbengali = 0x098c;
+  t.lvocalicdeva = 0x090c;
+  t.lvocalicvowelsignbengali = 0x09e2;
+  t.lvocalicvowelsigndeva = 0x0962;
+  t.lxsquare = 0x33d3;
+  t.m = 0x006d;
+  t.mabengali = 0x09ae;
+  t.macron = 0x00af;
+  t.macronbelowcmb = 0x0331;
+  t.macroncmb = 0x0304;
+  t.macronlowmod = 0x02cd;
+  t.macronmonospace = 0xffe3;
+  t.macute = 0x1e3f;
+  t.madeva = 0x092e;
+  t.magujarati = 0x0aae;
+  t.magurmukhi = 0x0a2e;
+  t.mahapakhhebrew = 0x05a4;
+  t.mahapakhlefthebrew = 0x05a4;
+  t.mahiragana = 0x307e;
+  t.maichattawalowleftthai = 0xf895;
+  t.maichattawalowrightthai = 0xf894;
+  t.maichattawathai = 0x0e4b;
+  t.maichattawaupperleftthai = 0xf893;
+  t.maieklowleftthai = 0xf88c;
+  t.maieklowrightthai = 0xf88b;
+  t.maiekthai = 0x0e48;
+  t.maiekupperleftthai = 0xf88a;
+  t.maihanakatleftthai = 0xf884;
+  t.maihanakatthai = 0x0e31;
+  t.maitaikhuleftthai = 0xf889;
+  t.maitaikhuthai = 0x0e47;
+  t.maitholowleftthai = 0xf88f;
+  t.maitholowrightthai = 0xf88e;
+  t.maithothai = 0x0e49;
+  t.maithoupperleftthai = 0xf88d;
+  t.maitrilowleftthai = 0xf892;
+  t.maitrilowrightthai = 0xf891;
+  t.maitrithai = 0x0e4a;
+  t.maitriupperleftthai = 0xf890;
+  t.maiyamokthai = 0x0e46;
+  t.makatakana = 0x30de;
+  t.makatakanahalfwidth = 0xff8f;
+  t.male = 0x2642;
+  t.mansyonsquare = 0x3347;
+  t.maqafhebrew = 0x05be;
+  t.mars = 0x2642;
+  t.masoracirclehebrew = 0x05af;
+  t.masquare = 0x3383;
+  t.mbopomofo = 0x3107;
+  t.mbsquare = 0x33d4;
+  t.mcircle = 0x24dc;
+  t.mcubedsquare = 0x33a5;
+  t.mdotaccent = 0x1e41;
+  t.mdotbelow = 0x1e43;
+  t.meemarabic = 0x0645;
+  t.meemfinalarabic = 0xfee2;
+  t.meeminitialarabic = 0xfee3;
+  t.meemmedialarabic = 0xfee4;
+  t.meemmeeminitialarabic = 0xfcd1;
+  t.meemmeemisolatedarabic = 0xfc48;
+  t.meetorusquare = 0x334d;
+  t.mehiragana = 0x3081;
+  t.meizierasquare = 0x337e;
+  t.mekatakana = 0x30e1;
+  t.mekatakanahalfwidth = 0xff92;
+  t.mem = 0x05de;
+  t.memdagesh = 0xfb3e;
+  t.memdageshhebrew = 0xfb3e;
+  t.memhebrew = 0x05de;
+  t.menarmenian = 0x0574;
+  t.merkhahebrew = 0x05a5;
+  t.merkhakefulahebrew = 0x05a6;
+  t.merkhakefulalefthebrew = 0x05a6;
+  t.merkhalefthebrew = 0x05a5;
+  t.mhook = 0x0271;
+  t.mhzsquare = 0x3392;
+  t.middledotkatakanahalfwidth = 0xff65;
+  t.middot = 0x00b7;
+  t.mieumacirclekorean = 0x3272;
+  t.mieumaparenkorean = 0x3212;
+  t.mieumcirclekorean = 0x3264;
+  t.mieumkorean = 0x3141;
+  t.mieumpansioskorean = 0x3170;
+  t.mieumparenkorean = 0x3204;
+  t.mieumpieupkorean = 0x316e;
+  t.mieumsioskorean = 0x316f;
+  t.mihiragana = 0x307f;
+  t.mikatakana = 0x30df;
+  t.mikatakanahalfwidth = 0xff90;
+  t.minus = 0x2212;
+  t.minusbelowcmb = 0x0320;
+  t.minuscircle = 0x2296;
+  t.minusmod = 0x02d7;
+  t.minusplus = 0x2213;
+  t.minute = 0x2032;
+  t.miribaarusquare = 0x334a;
+  t.mirisquare = 0x3349;
+  t.mlonglegturned = 0x0270;
+  t.mlsquare = 0x3396;
+  t.mmcubedsquare = 0x33a3;
+  t.mmonospace = 0xff4d;
+  t.mmsquaredsquare = 0x339f;
+  t.mohiragana = 0x3082;
+  t.mohmsquare = 0x33c1;
+  t.mokatakana = 0x30e2;
+  t.mokatakanahalfwidth = 0xff93;
+  t.molsquare = 0x33d6;
+  t.momathai = 0x0e21;
+  t.moverssquare = 0x33a7;
+  t.moverssquaredsquare = 0x33a8;
+  t.mparen = 0x24a8;
+  t.mpasquare = 0x33ab;
+  t.mssquare = 0x33b3;
+  t.msuperior = 0xf6ef;
+  t.mturned = 0x026f;
+  t.mu = 0x00b5;
+  t.mu1 = 0x00b5;
+  t.muasquare = 0x3382;
+  t.muchgreater = 0x226b;
+  t.muchless = 0x226a;
+  t.mufsquare = 0x338c;
+  t.mugreek = 0x03bc;
+  t.mugsquare = 0x338d;
+  t.muhiragana = 0x3080;
+  t.mukatakana = 0x30e0;
+  t.mukatakanahalfwidth = 0xff91;
+  t.mulsquare = 0x3395;
+  t.multiply = 0x00d7;
+  t.mumsquare = 0x339b;
+  t.munahhebrew = 0x05a3;
+  t.munahlefthebrew = 0x05a3;
+  t.musicalnote = 0x266a;
+  t.musicalnotedbl = 0x266b;
+  t.musicflatsign = 0x266d;
+  t.musicsharpsign = 0x266f;
+  t.mussquare = 0x33b2;
+  t.muvsquare = 0x33b6;
+  t.muwsquare = 0x33bc;
+  t.mvmegasquare = 0x33b9;
+  t.mvsquare = 0x33b7;
+  t.mwmegasquare = 0x33bf;
+  t.mwsquare = 0x33bd;
+  t.n = 0x006e;
+  t.nabengali = 0x09a8;
+  t.nabla = 0x2207;
+  t.nacute = 0x0144;
+  t.nadeva = 0x0928;
+  t.nagujarati = 0x0aa8;
+  t.nagurmukhi = 0x0a28;
+  t.nahiragana = 0x306a;
+  t.nakatakana = 0x30ca;
+  t.nakatakanahalfwidth = 0xff85;
+  t.napostrophe = 0x0149;
+  t.nasquare = 0x3381;
+  t.nbopomofo = 0x310b;
+  t.nbspace = 0x00a0;
+  t.ncaron = 0x0148;
+  t.ncedilla = 0x0146;
+  t.ncircle = 0x24dd;
+  t.ncircumflexbelow = 0x1e4b;
+  t.ncommaaccent = 0x0146;
+  t.ndotaccent = 0x1e45;
+  t.ndotbelow = 0x1e47;
+  t.nehiragana = 0x306d;
+  t.nekatakana = 0x30cd;
+  t.nekatakanahalfwidth = 0xff88;
+  t.newsheqelsign = 0x20aa;
+  t.nfsquare = 0x338b;
+  t.ngabengali = 0x0999;
+  t.ngadeva = 0x0919;
+  t.ngagujarati = 0x0a99;
+  t.ngagurmukhi = 0x0a19;
+  t.ngonguthai = 0x0e07;
+  t.nhiragana = 0x3093;
+  t.nhookleft = 0x0272;
+  t.nhookretroflex = 0x0273;
+  t.nieunacirclekorean = 0x326f;
+  t.nieunaparenkorean = 0x320f;
+  t.nieuncieuckorean = 0x3135;
+  t.nieuncirclekorean = 0x3261;
+  t.nieunhieuhkorean = 0x3136;
+  t.nieunkorean = 0x3134;
+  t.nieunpansioskorean = 0x3168;
+  t.nieunparenkorean = 0x3201;
+  t.nieunsioskorean = 0x3167;
+  t.nieuntikeutkorean = 0x3166;
+  t.nihiragana = 0x306b;
+  t.nikatakana = 0x30cb;
+  t.nikatakanahalfwidth = 0xff86;
+  t.nikhahitleftthai = 0xf899;
+  t.nikhahitthai = 0x0e4d;
+  t.nine = 0x0039;
+  t.ninearabic = 0x0669;
+  t.ninebengali = 0x09ef;
+  t.ninecircle = 0x2468;
+  t.ninecircleinversesansserif = 0x2792;
+  t.ninedeva = 0x096f;
+  t.ninegujarati = 0x0aef;
+  t.ninegurmukhi = 0x0a6f;
+  t.ninehackarabic = 0x0669;
+  t.ninehangzhou = 0x3029;
+  t.nineideographicparen = 0x3228;
+  t.nineinferior = 0x2089;
+  t.ninemonospace = 0xff19;
+  t.nineoldstyle = 0xf739;
+  t.nineparen = 0x247c;
+  t.nineperiod = 0x2490;
+  t.ninepersian = 0x06f9;
+  t.nineroman = 0x2178;
+  t.ninesuperior = 0x2079;
+  t.nineteencircle = 0x2472;
+  t.nineteenparen = 0x2486;
+  t.nineteenperiod = 0x249a;
+  t.ninethai = 0x0e59;
+  t.nj = 0x01cc;
+  t.njecyrillic = 0x045a;
+  t.nkatakana = 0x30f3;
+  t.nkatakanahalfwidth = 0xff9d;
+  t.nlegrightlong = 0x019e;
+  t.nlinebelow = 0x1e49;
+  t.nmonospace = 0xff4e;
+  t.nmsquare = 0x339a;
+  t.nnabengali = 0x09a3;
+  t.nnadeva = 0x0923;
+  t.nnagujarati = 0x0aa3;
+  t.nnagurmukhi = 0x0a23;
+  t.nnnadeva = 0x0929;
+  t.nohiragana = 0x306e;
+  t.nokatakana = 0x30ce;
+  t.nokatakanahalfwidth = 0xff89;
+  t.nonbreakingspace = 0x00a0;
+  t.nonenthai = 0x0e13;
+  t.nonuthai = 0x0e19;
+  t.noonarabic = 0x0646;
+  t.noonfinalarabic = 0xfee6;
+  t.noonghunnaarabic = 0x06ba;
+  t.noonghunnafinalarabic = 0xfb9f;
+  t.nooninitialarabic = 0xfee7;
+  t.noonjeeminitialarabic = 0xfcd2;
+  t.noonjeemisolatedarabic = 0xfc4b;
+  t.noonmedialarabic = 0xfee8;
+  t.noonmeeminitialarabic = 0xfcd5;
+  t.noonmeemisolatedarabic = 0xfc4e;
+  t.noonnoonfinalarabic = 0xfc8d;
+  t.notcontains = 0x220c;
+  t.notelement = 0x2209;
+  t.notelementof = 0x2209;
+  t.notequal = 0x2260;
+  t.notgreater = 0x226f;
+  t.notgreaternorequal = 0x2271;
+  t.notgreaternorless = 0x2279;
+  t.notidentical = 0x2262;
+  t.notless = 0x226e;
+  t.notlessnorequal = 0x2270;
+  t.notparallel = 0x2226;
+  t.notprecedes = 0x2280;
+  t.notsubset = 0x2284;
+  t.notsucceeds = 0x2281;
+  t.notsuperset = 0x2285;
+  t.nowarmenian = 0x0576;
+  t.nparen = 0x24a9;
+  t.nssquare = 0x33b1;
+  t.nsuperior = 0x207f;
+  t.ntilde = 0x00f1;
+  t.nu = 0x03bd;
+  t.nuhiragana = 0x306c;
+  t.nukatakana = 0x30cc;
+  t.nukatakanahalfwidth = 0xff87;
+  t.nuktabengali = 0x09bc;
+  t.nuktadeva = 0x093c;
+  t.nuktagujarati = 0x0abc;
+  t.nuktagurmukhi = 0x0a3c;
+  t.numbersign = 0x0023;
+  t.numbersignmonospace = 0xff03;
+  t.numbersignsmall = 0xfe5f;
+  t.numeralsigngreek = 0x0374;
+  t.numeralsignlowergreek = 0x0375;
+  t.numero = 0x2116;
+  t.nun = 0x05e0;
+  t.nundagesh = 0xfb40;
+  t.nundageshhebrew = 0xfb40;
+  t.nunhebrew = 0x05e0;
+  t.nvsquare = 0x33b5;
+  t.nwsquare = 0x33bb;
+  t.nyabengali = 0x099e;
+  t.nyadeva = 0x091e;
+  t.nyagujarati = 0x0a9e;
+  t.nyagurmukhi = 0x0a1e;
+  t.o = 0x006f;
+  t.oacute = 0x00f3;
+  t.oangthai = 0x0e2d;
+  t.obarred = 0x0275;
+  t.obarredcyrillic = 0x04e9;
+  t.obarreddieresiscyrillic = 0x04eb;
+  t.obengali = 0x0993;
+  t.obopomofo = 0x311b;
+  t.obreve = 0x014f;
+  t.ocandradeva = 0x0911;
+  t.ocandragujarati = 0x0a91;
+  t.ocandravowelsigndeva = 0x0949;
+  t.ocandravowelsigngujarati = 0x0ac9;
+  t.ocaron = 0x01d2;
+  t.ocircle = 0x24de;
+  t.ocircumflex = 0x00f4;
+  t.ocircumflexacute = 0x1ed1;
+  t.ocircumflexdotbelow = 0x1ed9;
+  t.ocircumflexgrave = 0x1ed3;
+  t.ocircumflexhookabove = 0x1ed5;
+  t.ocircumflextilde = 0x1ed7;
+  t.ocyrillic = 0x043e;
+  t.odblacute = 0x0151;
+  t.odblgrave = 0x020d;
+  t.odeva = 0x0913;
+  t.odieresis = 0x00f6;
+  t.odieresiscyrillic = 0x04e7;
+  t.odotbelow = 0x1ecd;
+  t.oe = 0x0153;
+  t.oekorean = 0x315a;
+  t.ogonek = 0x02db;
+  t.ogonekcmb = 0x0328;
+  t.ograve = 0x00f2;
+  t.ogujarati = 0x0a93;
+  t.oharmenian = 0x0585;
+  t.ohiragana = 0x304a;
+  t.ohookabove = 0x1ecf;
+  t.ohorn = 0x01a1;
+  t.ohornacute = 0x1edb;
+  t.ohorndotbelow = 0x1ee3;
+  t.ohorngrave = 0x1edd;
+  t.ohornhookabove = 0x1edf;
+  t.ohorntilde = 0x1ee1;
+  t.ohungarumlaut = 0x0151;
+  t.oi = 0x01a3;
+  t.oinvertedbreve = 0x020f;
+  t.okatakana = 0x30aa;
+  t.okatakanahalfwidth = 0xff75;
+  t.okorean = 0x3157;
+  t.olehebrew = 0x05ab;
+  t.omacron = 0x014d;
+  t.omacronacute = 0x1e53;
+  t.omacrongrave = 0x1e51;
+  t.omdeva = 0x0950;
+  t.omega = 0x03c9;
+  t.omega1 = 0x03d6;
+  t.omegacyrillic = 0x0461;
+  t.omegalatinclosed = 0x0277;
+  t.omegaroundcyrillic = 0x047b;
+  t.omegatitlocyrillic = 0x047d;
+  t.omegatonos = 0x03ce;
+  t.omgujarati = 0x0ad0;
+  t.omicron = 0x03bf;
+  t.omicrontonos = 0x03cc;
+  t.omonospace = 0xff4f;
+  t.one = 0x0031;
+  t.onearabic = 0x0661;
+  t.onebengali = 0x09e7;
+  t.onecircle = 0x2460;
+  t.onecircleinversesansserif = 0x278a;
+  t.onedeva = 0x0967;
+  t.onedotenleader = 0x2024;
+  t.oneeighth = 0x215b;
+  t.onefitted = 0xf6dc;
+  t.onegujarati = 0x0ae7;
+  t.onegurmukhi = 0x0a67;
+  t.onehackarabic = 0x0661;
+  t.onehalf = 0x00bd;
+  t.onehangzhou = 0x3021;
+  t.oneideographicparen = 0x3220;
+  t.oneinferior = 0x2081;
+  t.onemonospace = 0xff11;
+  t.onenumeratorbengali = 0x09f4;
+  t.oneoldstyle = 0xf731;
+  t.oneparen = 0x2474;
+  t.oneperiod = 0x2488;
+  t.onepersian = 0x06f1;
+  t.onequarter = 0x00bc;
+  t.oneroman = 0x2170;
+  t.onesuperior = 0x00b9;
+  t.onethai = 0x0e51;
+  t.onethird = 0x2153;
+  t.oogonek = 0x01eb;
+  t.oogonekmacron = 0x01ed;
+  t.oogurmukhi = 0x0a13;
+  t.oomatragurmukhi = 0x0a4b;
+  t.oopen = 0x0254;
+  t.oparen = 0x24aa;
+  t.openbullet = 0x25e6;
+  t.option = 0x2325;
+  t.ordfeminine = 0x00aa;
+  t.ordmasculine = 0x00ba;
+  t.orthogonal = 0x221f;
+  t.oshortdeva = 0x0912;
+  t.oshortvowelsigndeva = 0x094a;
+  t.oslash = 0x00f8;
+  t.oslashacute = 0x01ff;
+  t.osmallhiragana = 0x3049;
+  t.osmallkatakana = 0x30a9;
+  t.osmallkatakanahalfwidth = 0xff6b;
+  t.ostrokeacute = 0x01ff;
+  t.osuperior = 0xf6f0;
+  t.otcyrillic = 0x047f;
+  t.otilde = 0x00f5;
+  t.otildeacute = 0x1e4d;
+  t.otildedieresis = 0x1e4f;
+  t.oubopomofo = 0x3121;
+  t.overline = 0x203e;
+  t.overlinecenterline = 0xfe4a;
+  t.overlinecmb = 0x0305;
+  t.overlinedashed = 0xfe49;
+  t.overlinedblwavy = 0xfe4c;
+  t.overlinewavy = 0xfe4b;
+  t.overscore = 0x00af;
+  t.ovowelsignbengali = 0x09cb;
+  t.ovowelsigndeva = 0x094b;
+  t.ovowelsigngujarati = 0x0acb;
+  t.p = 0x0070;
+  t.paampssquare = 0x3380;
+  t.paasentosquare = 0x332b;
+  t.pabengali = 0x09aa;
+  t.pacute = 0x1e55;
+  t.padeva = 0x092a;
+  t.pagedown = 0x21df;
+  t.pageup = 0x21de;
+  t.pagujarati = 0x0aaa;
+  t.pagurmukhi = 0x0a2a;
+  t.pahiragana = 0x3071;
+  t.paiyannoithai = 0x0e2f;
+  t.pakatakana = 0x30d1;
+  t.palatalizationcyrilliccmb = 0x0484;
+  t.palochkacyrillic = 0x04c0;
+  t.pansioskorean = 0x317f;
+  t.paragraph = 0x00b6;
+  t.parallel = 0x2225;
+  t.parenleft = 0x0028;
+  t.parenleftaltonearabic = 0xfd3e;
+  t.parenleftbt = 0xf8ed;
+  t.parenleftex = 0xf8ec;
+  t.parenleftinferior = 0x208d;
+  t.parenleftmonospace = 0xff08;
+  t.parenleftsmall = 0xfe59;
+  t.parenleftsuperior = 0x207d;
+  t.parenlefttp = 0xf8eb;
+  t.parenleftvertical = 0xfe35;
+  t.parenright = 0x0029;
+  t.parenrightaltonearabic = 0xfd3f;
+  t.parenrightbt = 0xf8f8;
+  t.parenrightex = 0xf8f7;
+  t.parenrightinferior = 0x208e;
+  t.parenrightmonospace = 0xff09;
+  t.parenrightsmall = 0xfe5a;
+  t.parenrightsuperior = 0x207e;
+  t.parenrighttp = 0xf8f6;
+  t.parenrightvertical = 0xfe36;
+  t.partialdiff = 0x2202;
+  t.paseqhebrew = 0x05c0;
+  t.pashtahebrew = 0x0599;
+  t.pasquare = 0x33a9;
+  t.patah = 0x05b7;
+  t.patah11 = 0x05b7;
+  t.patah1d = 0x05b7;
+  t.patah2a = 0x05b7;
+  t.patahhebrew = 0x05b7;
+  t.patahnarrowhebrew = 0x05b7;
+  t.patahquarterhebrew = 0x05b7;
+  t.patahwidehebrew = 0x05b7;
+  t.pazerhebrew = 0x05a1;
+  t.pbopomofo = 0x3106;
+  t.pcircle = 0x24df;
+  t.pdotaccent = 0x1e57;
+  t.pe = 0x05e4;
+  t.pecyrillic = 0x043f;
+  t.pedagesh = 0xfb44;
+  t.pedageshhebrew = 0xfb44;
+  t.peezisquare = 0x333b;
+  t.pefinaldageshhebrew = 0xfb43;
+  t.peharabic = 0x067e;
+  t.peharmenian = 0x057a;
+  t.pehebrew = 0x05e4;
+  t.pehfinalarabic = 0xfb57;
+  t.pehinitialarabic = 0xfb58;
+  t.pehiragana = 0x307a;
+  t.pehmedialarabic = 0xfb59;
+  t.pekatakana = 0x30da;
+  t.pemiddlehookcyrillic = 0x04a7;
+  t.perafehebrew = 0xfb4e;
+  t.percent = 0x0025;
+  t.percentarabic = 0x066a;
+  t.percentmonospace = 0xff05;
+  t.percentsmall = 0xfe6a;
+  t.period = 0x002e;
+  t.periodarmenian = 0x0589;
+  t.periodcentered = 0x00b7;
+  t.periodhalfwidth = 0xff61;
+  t.periodinferior = 0xf6e7;
+  t.periodmonospace = 0xff0e;
+  t.periodsmall = 0xfe52;
+  t.periodsuperior = 0xf6e8;
+  t.perispomenigreekcmb = 0x0342;
+  t.perpendicular = 0x22a5;
+  t.perthousand = 0x2030;
+  t.peseta = 0x20a7;
+  t.pfsquare = 0x338a;
+  t.phabengali = 0x09ab;
+  t.phadeva = 0x092b;
+  t.phagujarati = 0x0aab;
+  t.phagurmukhi = 0x0a2b;
+  t.phi = 0x03c6;
+  t.phi1 = 0x03d5;
+  t.phieuphacirclekorean = 0x327a;
+  t.phieuphaparenkorean = 0x321a;
+  t.phieuphcirclekorean = 0x326c;
+  t.phieuphkorean = 0x314d;
+  t.phieuphparenkorean = 0x320c;
+  t.philatin = 0x0278;
+  t.phinthuthai = 0x0e3a;
+  t.phisymbolgreek = 0x03d5;
+  t.phook = 0x01a5;
+  t.phophanthai = 0x0e1e;
+  t.phophungthai = 0x0e1c;
+  t.phosamphaothai = 0x0e20;
+  t.pi = 0x03c0;
+  t.pieupacirclekorean = 0x3273;
+  t.pieupaparenkorean = 0x3213;
+  t.pieupcieuckorean = 0x3176;
+  t.pieupcirclekorean = 0x3265;
+  t.pieupkiyeokkorean = 0x3172;
+  t.pieupkorean = 0x3142;
+  t.pieupparenkorean = 0x3205;
+  t.pieupsioskiyeokkorean = 0x3174;
+  t.pieupsioskorean = 0x3144;
+  t.pieupsiostikeutkorean = 0x3175;
+  t.pieupthieuthkorean = 0x3177;
+  t.pieuptikeutkorean = 0x3173;
+  t.pihiragana = 0x3074;
+  t.pikatakana = 0x30d4;
+  t.pisymbolgreek = 0x03d6;
+  t.piwrarmenian = 0x0583;
+  t.planckover2pi = 0x210f;
+  t.planckover2pi1 = 0x210f;
+  t.plus = 0x002b;
+  t.plusbelowcmb = 0x031f;
+  t.pluscircle = 0x2295;
+  t.plusminus = 0x00b1;
+  t.plusmod = 0x02d6;
+  t.plusmonospace = 0xff0b;
+  t.plussmall = 0xfe62;
+  t.plussuperior = 0x207a;
+  t.pmonospace = 0xff50;
+  t.pmsquare = 0x33d8;
+  t.pohiragana = 0x307d;
+  t.pointingindexdownwhite = 0x261f;
+  t.pointingindexleftwhite = 0x261c;
+  t.pointingindexrightwhite = 0x261e;
+  t.pointingindexupwhite = 0x261d;
+  t.pokatakana = 0x30dd;
+  t.poplathai = 0x0e1b;
+  t.postalmark = 0x3012;
+  t.postalmarkface = 0x3020;
+  t.pparen = 0x24ab;
+  t.precedes = 0x227a;
+  t.prescription = 0x211e;
+  t.primemod = 0x02b9;
+  t.primereversed = 0x2035;
+  t.product = 0x220f;
+  t.projective = 0x2305;
+  t.prolongedkana = 0x30fc;
+  t.propellor = 0x2318;
+  t.propersubset = 0x2282;
+  t.propersuperset = 0x2283;
+  t.proportion = 0x2237;
+  t.proportional = 0x221d;
+  t.psi = 0x03c8;
+  t.psicyrillic = 0x0471;
+  t.psilipneumatacyrilliccmb = 0x0486;
+  t.pssquare = 0x33b0;
+  t.puhiragana = 0x3077;
+  t.pukatakana = 0x30d7;
+  t.pvsquare = 0x33b4;
+  t.pwsquare = 0x33ba;
+  t.q = 0x0071;
+  t.qadeva = 0x0958;
+  t.qadmahebrew = 0x05a8;
+  t.qafarabic = 0x0642;
+  t.qaffinalarabic = 0xfed6;
+  t.qafinitialarabic = 0xfed7;
+  t.qafmedialarabic = 0xfed8;
+  t.qamats = 0x05b8;
+  t.qamats10 = 0x05b8;
+  t.qamats1a = 0x05b8;
+  t.qamats1c = 0x05b8;
+  t.qamats27 = 0x05b8;
+  t.qamats29 = 0x05b8;
+  t.qamats33 = 0x05b8;
+  t.qamatsde = 0x05b8;
+  t.qamatshebrew = 0x05b8;
+  t.qamatsnarrowhebrew = 0x05b8;
+  t.qamatsqatanhebrew = 0x05b8;
+  t.qamatsqatannarrowhebrew = 0x05b8;
+  t.qamatsqatanquarterhebrew = 0x05b8;
+  t.qamatsqatanwidehebrew = 0x05b8;
+  t.qamatsquarterhebrew = 0x05b8;
+  t.qamatswidehebrew = 0x05b8;
+  t.qarneyparahebrew = 0x059f;
+  t.qbopomofo = 0x3111;
+  t.qcircle = 0x24e0;
+  t.qhook = 0x02a0;
+  t.qmonospace = 0xff51;
+  t.qof = 0x05e7;
+  t.qofdagesh = 0xfb47;
+  t.qofdageshhebrew = 0xfb47;
+  t.qofhebrew = 0x05e7;
+  t.qparen = 0x24ac;
+  t.quarternote = 0x2669;
+  t.qubuts = 0x05bb;
+  t.qubuts18 = 0x05bb;
+  t.qubuts25 = 0x05bb;
+  t.qubuts31 = 0x05bb;
+  t.qubutshebrew = 0x05bb;
+  t.qubutsnarrowhebrew = 0x05bb;
+  t.qubutsquarterhebrew = 0x05bb;
+  t.qubutswidehebrew = 0x05bb;
+  t.question = 0x003f;
+  t.questionarabic = 0x061f;
+  t.questionarmenian = 0x055e;
+  t.questiondown = 0x00bf;
+  t.questiondownsmall = 0xf7bf;
+  t.questiongreek = 0x037e;
+  t.questionmonospace = 0xff1f;
+  t.questionsmall = 0xf73f;
+  t.quotedbl = 0x0022;
+  t.quotedblbase = 0x201e;
+  t.quotedblleft = 0x201c;
+  t.quotedblmonospace = 0xff02;
+  t.quotedblprime = 0x301e;
+  t.quotedblprimereversed = 0x301d;
+  t.quotedblright = 0x201d;
+  t.quoteleft = 0x2018;
+  t.quoteleftreversed = 0x201b;
+  t.quotereversed = 0x201b;
+  t.quoteright = 0x2019;
+  t.quoterightn = 0x0149;
+  t.quotesinglbase = 0x201a;
+  t.quotesingle = 0x0027;
+  t.quotesinglemonospace = 0xff07;
+  t.r = 0x0072;
+  t.raarmenian = 0x057c;
+  t.rabengali = 0x09b0;
+  t.racute = 0x0155;
+  t.radeva = 0x0930;
+  t.radical = 0x221a;
+  t.radicalex = 0xf8e5;
+  t.radoverssquare = 0x33ae;
+  t.radoverssquaredsquare = 0x33af;
+  t.radsquare = 0x33ad;
+  t.rafe = 0x05bf;
+  t.rafehebrew = 0x05bf;
+  t.ragujarati = 0x0ab0;
+  t.ragurmukhi = 0x0a30;
+  t.rahiragana = 0x3089;
+  t.rakatakana = 0x30e9;
+  t.rakatakanahalfwidth = 0xff97;
+  t.ralowerdiagonalbengali = 0x09f1;
+  t.ramiddlediagonalbengali = 0x09f0;
+  t.ramshorn = 0x0264;
+  t.ratio = 0x2236;
+  t.rbopomofo = 0x3116;
+  t.rcaron = 0x0159;
+  t.rcedilla = 0x0157;
+  t.rcircle = 0x24e1;
+  t.rcommaaccent = 0x0157;
+  t.rdblgrave = 0x0211;
+  t.rdotaccent = 0x1e59;
+  t.rdotbelow = 0x1e5b;
+  t.rdotbelowmacron = 0x1e5d;
+  t.referencemark = 0x203b;
+  t.reflexsubset = 0x2286;
+  t.reflexsuperset = 0x2287;
+  t.registered = 0x00ae;
+  t.registersans = 0xf8e8;
+  t.registerserif = 0xf6da;
+  t.reharabic = 0x0631;
+  t.reharmenian = 0x0580;
+  t.rehfinalarabic = 0xfeae;
+  t.rehiragana = 0x308c;
+  t.rekatakana = 0x30ec;
+  t.rekatakanahalfwidth = 0xff9a;
+  t.resh = 0x05e8;
+  t.reshdageshhebrew = 0xfb48;
+  t.reshhebrew = 0x05e8;
+  t.reversedtilde = 0x223d;
+  t.reviahebrew = 0x0597;
+  t.reviamugrashhebrew = 0x0597;
+  t.revlogicalnot = 0x2310;
+  t.rfishhook = 0x027e;
+  t.rfishhookreversed = 0x027f;
+  t.rhabengali = 0x09dd;
+  t.rhadeva = 0x095d;
+  t.rho = 0x03c1;
+  t.rhook = 0x027d;
+  t.rhookturned = 0x027b;
+  t.rhookturnedsuperior = 0x02b5;
+  t.rhosymbolgreek = 0x03f1;
+  t.rhotichookmod = 0x02de;
+  t.rieulacirclekorean = 0x3271;
+  t.rieulaparenkorean = 0x3211;
+  t.rieulcirclekorean = 0x3263;
+  t.rieulhieuhkorean = 0x3140;
+  t.rieulkiyeokkorean = 0x313a;
+  t.rieulkiyeoksioskorean = 0x3169;
+  t.rieulkorean = 0x3139;
+  t.rieulmieumkorean = 0x313b;
+  t.rieulpansioskorean = 0x316c;
+  t.rieulparenkorean = 0x3203;
+  t.rieulphieuphkorean = 0x313f;
+  t.rieulpieupkorean = 0x313c;
+  t.rieulpieupsioskorean = 0x316b;
+  t.rieulsioskorean = 0x313d;
+  t.rieulthieuthkorean = 0x313e;
+  t.rieultikeutkorean = 0x316a;
+  t.rieulyeorinhieuhkorean = 0x316d;
+  t.rightangle = 0x221f;
+  t.righttackbelowcmb = 0x0319;
+  t.righttriangle = 0x22bf;
+  t.rihiragana = 0x308a;
+  t.rikatakana = 0x30ea;
+  t.rikatakanahalfwidth = 0xff98;
+  t.ring = 0x02da;
+  t.ringbelowcmb = 0x0325;
+  t.ringcmb = 0x030a;
+  t.ringhalfleft = 0x02bf;
+  t.ringhalfleftarmenian = 0x0559;
+  t.ringhalfleftbelowcmb = 0x031c;
+  t.ringhalfleftcentered = 0x02d3;
+  t.ringhalfright = 0x02be;
+  t.ringhalfrightbelowcmb = 0x0339;
+  t.ringhalfrightcentered = 0x02d2;
+  t.rinvertedbreve = 0x0213;
+  t.rittorusquare = 0x3351;
+  t.rlinebelow = 0x1e5f;
+  t.rlongleg = 0x027c;
+  t.rlonglegturned = 0x027a;
+  t.rmonospace = 0xff52;
+  t.rohiragana = 0x308d;
+  t.rokatakana = 0x30ed;
+  t.rokatakanahalfwidth = 0xff9b;
+  t.roruathai = 0x0e23;
+  t.rparen = 0x24ad;
+  t.rrabengali = 0x09dc;
+  t.rradeva = 0x0931;
+  t.rragurmukhi = 0x0a5c;
+  t.rreharabic = 0x0691;
+  t.rrehfinalarabic = 0xfb8d;
+  t.rrvocalicbengali = 0x09e0;
+  t.rrvocalicdeva = 0x0960;
+  t.rrvocalicgujarati = 0x0ae0;
+  t.rrvocalicvowelsignbengali = 0x09c4;
+  t.rrvocalicvowelsigndeva = 0x0944;
+  t.rrvocalicvowelsigngujarati = 0x0ac4;
+  t.rsuperior = 0xf6f1;
+  t.rtblock = 0x2590;
+  t.rturned = 0x0279;
+  t.rturnedsuperior = 0x02b4;
+  t.ruhiragana = 0x308b;
+  t.rukatakana = 0x30eb;
+  t.rukatakanahalfwidth = 0xff99;
+  t.rupeemarkbengali = 0x09f2;
+  t.rupeesignbengali = 0x09f3;
+  t.rupiah = 0xf6dd;
+  t.ruthai = 0x0e24;
+  t.rvocalicbengali = 0x098b;
+  t.rvocalicdeva = 0x090b;
+  t.rvocalicgujarati = 0x0a8b;
+  t.rvocalicvowelsignbengali = 0x09c3;
+  t.rvocalicvowelsigndeva = 0x0943;
+  t.rvocalicvowelsigngujarati = 0x0ac3;
+  t.s = 0x0073;
+  t.sabengali = 0x09b8;
+  t.sacute = 0x015b;
+  t.sacutedotaccent = 0x1e65;
+  t.sadarabic = 0x0635;
+  t.sadeva = 0x0938;
+  t.sadfinalarabic = 0xfeba;
+  t.sadinitialarabic = 0xfebb;
+  t.sadmedialarabic = 0xfebc;
+  t.sagujarati = 0x0ab8;
+  t.sagurmukhi = 0x0a38;
+  t.sahiragana = 0x3055;
+  t.sakatakana = 0x30b5;
+  t.sakatakanahalfwidth = 0xff7b;
+  t.sallallahoualayhewasallamarabic = 0xfdfa;
+  t.samekh = 0x05e1;
+  t.samekhdagesh = 0xfb41;
+  t.samekhdageshhebrew = 0xfb41;
+  t.samekhhebrew = 0x05e1;
+  t.saraaathai = 0x0e32;
+  t.saraaethai = 0x0e41;
+  t.saraaimaimalaithai = 0x0e44;
+  t.saraaimaimuanthai = 0x0e43;
+  t.saraamthai = 0x0e33;
+  t.saraathai = 0x0e30;
+  t.saraethai = 0x0e40;
+  t.saraiileftthai = 0xf886;
+  t.saraiithai = 0x0e35;
+  t.saraileftthai = 0xf885;
+  t.saraithai = 0x0e34;
+  t.saraothai = 0x0e42;
+  t.saraueeleftthai = 0xf888;
+  t.saraueethai = 0x0e37;
+  t.saraueleftthai = 0xf887;
+  t.sarauethai = 0x0e36;
+  t.sarauthai = 0x0e38;
+  t.sarauuthai = 0x0e39;
+  t.sbopomofo = 0x3119;
+  t.scaron = 0x0161;
+  t.scarondotaccent = 0x1e67;
+  t.scedilla = 0x015f;
+  t.schwa = 0x0259;
+  t.schwacyrillic = 0x04d9;
+  t.schwadieresiscyrillic = 0x04db;
+  t.schwahook = 0x025a;
+  t.scircle = 0x24e2;
+  t.scircumflex = 0x015d;
+  t.scommaaccent = 0x0219;
+  t.sdotaccent = 0x1e61;
+  t.sdotbelow = 0x1e63;
+  t.sdotbelowdotaccent = 0x1e69;
+  t.seagullbelowcmb = 0x033c;
+  t.second = 0x2033;
+  t.secondtonechinese = 0x02ca;
+  t.section = 0x00a7;
+  t.seenarabic = 0x0633;
+  t.seenfinalarabic = 0xfeb2;
+  t.seeninitialarabic = 0xfeb3;
+  t.seenmedialarabic = 0xfeb4;
+  t.segol = 0x05b6;
+  t.segol13 = 0x05b6;
+  t.segol1f = 0x05b6;
+  t.segol2c = 0x05b6;
+  t.segolhebrew = 0x05b6;
+  t.segolnarrowhebrew = 0x05b6;
+  t.segolquarterhebrew = 0x05b6;
+  t.segoltahebrew = 0x0592;
+  t.segolwidehebrew = 0x05b6;
+  t.seharmenian = 0x057d;
+  t.sehiragana = 0x305b;
+  t.sekatakana = 0x30bb;
+  t.sekatakanahalfwidth = 0xff7e;
+  t.semicolon = 0x003b;
+  t.semicolonarabic = 0x061b;
+  t.semicolonmonospace = 0xff1b;
+  t.semicolonsmall = 0xfe54;
+  t.semivoicedmarkkana = 0x309c;
+  t.semivoicedmarkkanahalfwidth = 0xff9f;
+  t.sentisquare = 0x3322;
+  t.sentosquare = 0x3323;
+  t.seven = 0x0037;
+  t.sevenarabic = 0x0667;
+  t.sevenbengali = 0x09ed;
+  t.sevencircle = 0x2466;
+  t.sevencircleinversesansserif = 0x2790;
+  t.sevendeva = 0x096d;
+  t.seveneighths = 0x215e;
+  t.sevengujarati = 0x0aed;
+  t.sevengurmukhi = 0x0a6d;
+  t.sevenhackarabic = 0x0667;
+  t.sevenhangzhou = 0x3027;
+  t.sevenideographicparen = 0x3226;
+  t.seveninferior = 0x2087;
+  t.sevenmonospace = 0xff17;
+  t.sevenoldstyle = 0xf737;
+  t.sevenparen = 0x247a;
+  t.sevenperiod = 0x248e;
+  t.sevenpersian = 0x06f7;
+  t.sevenroman = 0x2176;
+  t.sevensuperior = 0x2077;
+  t.seventeencircle = 0x2470;
+  t.seventeenparen = 0x2484;
+  t.seventeenperiod = 0x2498;
+  t.seventhai = 0x0e57;
+  t.sfthyphen = 0x00ad;
+  t.shaarmenian = 0x0577;
+  t.shabengali = 0x09b6;
+  t.shacyrillic = 0x0448;
+  t.shaddaarabic = 0x0651;
+  t.shaddadammaarabic = 0xfc61;
+  t.shaddadammatanarabic = 0xfc5e;
+  t.shaddafathaarabic = 0xfc60;
+  t.shaddakasraarabic = 0xfc62;
+  t.shaddakasratanarabic = 0xfc5f;
+  t.shade = 0x2592;
+  t.shadedark = 0x2593;
+  t.shadelight = 0x2591;
+  t.shademedium = 0x2592;
+  t.shadeva = 0x0936;
+  t.shagujarati = 0x0ab6;
+  t.shagurmukhi = 0x0a36;
+  t.shalshelethebrew = 0x0593;
+  t.shbopomofo = 0x3115;
+  t.shchacyrillic = 0x0449;
+  t.sheenarabic = 0x0634;
+  t.sheenfinalarabic = 0xfeb6;
+  t.sheeninitialarabic = 0xfeb7;
+  t.sheenmedialarabic = 0xfeb8;
+  t.sheicoptic = 0x03e3;
+  t.sheqel = 0x20aa;
+  t.sheqelhebrew = 0x20aa;
+  t.sheva = 0x05b0;
+  t.sheva115 = 0x05b0;
+  t.sheva15 = 0x05b0;
+  t.sheva22 = 0x05b0;
+  t.sheva2e = 0x05b0;
+  t.shevahebrew = 0x05b0;
+  t.shevanarrowhebrew = 0x05b0;
+  t.shevaquarterhebrew = 0x05b0;
+  t.shevawidehebrew = 0x05b0;
+  t.shhacyrillic = 0x04bb;
+  t.shimacoptic = 0x03ed;
+  t.shin = 0x05e9;
+  t.shindagesh = 0xfb49;
+  t.shindageshhebrew = 0xfb49;
+  t.shindageshshindot = 0xfb2c;
+  t.shindageshshindothebrew = 0xfb2c;
+  t.shindageshsindot = 0xfb2d;
+  t.shindageshsindothebrew = 0xfb2d;
+  t.shindothebrew = 0x05c1;
+  t.shinhebrew = 0x05e9;
+  t.shinshindot = 0xfb2a;
+  t.shinshindothebrew = 0xfb2a;
+  t.shinsindot = 0xfb2b;
+  t.shinsindothebrew = 0xfb2b;
+  t.shook = 0x0282;
+  t.sigma = 0x03c3;
+  t.sigma1 = 0x03c2;
+  t.sigmafinal = 0x03c2;
+  t.sigmalunatesymbolgreek = 0x03f2;
+  t.sihiragana = 0x3057;
+  t.sikatakana = 0x30b7;
+  t.sikatakanahalfwidth = 0xff7c;
+  t.siluqhebrew = 0x05bd;
+  t.siluqlefthebrew = 0x05bd;
+  t.similar = 0x223c;
+  t.sindothebrew = 0x05c2;
+  t.siosacirclekorean = 0x3274;
+  t.siosaparenkorean = 0x3214;
+  t.sioscieuckorean = 0x317e;
+  t.sioscirclekorean = 0x3266;
+  t.sioskiyeokkorean = 0x317a;
+  t.sioskorean = 0x3145;
+  t.siosnieunkorean = 0x317b;
+  t.siosparenkorean = 0x3206;
+  t.siospieupkorean = 0x317d;
+  t.siostikeutkorean = 0x317c;
+  t.six = 0x0036;
+  t.sixarabic = 0x0666;
+  t.sixbengali = 0x09ec;
+  t.sixcircle = 0x2465;
+  t.sixcircleinversesansserif = 0x278f;
+  t.sixdeva = 0x096c;
+  t.sixgujarati = 0x0aec;
+  t.sixgurmukhi = 0x0a6c;
+  t.sixhackarabic = 0x0666;
+  t.sixhangzhou = 0x3026;
+  t.sixideographicparen = 0x3225;
+  t.sixinferior = 0x2086;
+  t.sixmonospace = 0xff16;
+  t.sixoldstyle = 0xf736;
+  t.sixparen = 0x2479;
+  t.sixperiod = 0x248d;
+  t.sixpersian = 0x06f6;
+  t.sixroman = 0x2175;
+  t.sixsuperior = 0x2076;
+  t.sixteencircle = 0x246f;
+  t.sixteencurrencydenominatorbengali = 0x09f9;
+  t.sixteenparen = 0x2483;
+  t.sixteenperiod = 0x2497;
+  t.sixthai = 0x0e56;
+  t.slash = 0x002f;
+  t.slashmonospace = 0xff0f;
+  t.slong = 0x017f;
+  t.slongdotaccent = 0x1e9b;
+  t.smileface = 0x263a;
+  t.smonospace = 0xff53;
+  t.sofpasuqhebrew = 0x05c3;
+  t.softhyphen = 0x00ad;
+  t.softsigncyrillic = 0x044c;
+  t.sohiragana = 0x305d;
+  t.sokatakana = 0x30bd;
+  t.sokatakanahalfwidth = 0xff7f;
+  t.soliduslongoverlaycmb = 0x0338;
+  t.solidusshortoverlaycmb = 0x0337;
+  t.sorusithai = 0x0e29;
+  t.sosalathai = 0x0e28;
+  t.sosothai = 0x0e0b;
+  t.sosuathai = 0x0e2a;
+  t.space = 0x0020;
+  t.spacehackarabic = 0x0020;
+  t.spade = 0x2660;
+  t.spadesuitblack = 0x2660;
+  t.spadesuitwhite = 0x2664;
+  t.sparen = 0x24ae;
+  t.squarebelowcmb = 0x033b;
+  t.squarecc = 0x33c4;
+  t.squarecm = 0x339d;
+  t.squarediagonalcrosshatchfill = 0x25a9;
+  t.squarehorizontalfill = 0x25a4;
+  t.squarekg = 0x338f;
+  t.squarekm = 0x339e;
+  t.squarekmcapital = 0x33ce;
+  t.squareln = 0x33d1;
+  t.squarelog = 0x33d2;
+  t.squaremg = 0x338e;
+  t.squaremil = 0x33d5;
+  t.squaremm = 0x339c;
+  t.squaremsquared = 0x33a1;
+  t.squareorthogonalcrosshatchfill = 0x25a6;
+  t.squareupperlefttolowerrightfill = 0x25a7;
+  t.squareupperrighttolowerleftfill = 0x25a8;
+  t.squareverticalfill = 0x25a5;
+  t.squarewhitewithsmallblack = 0x25a3;
+  t.srsquare = 0x33db;
+  t.ssabengali = 0x09b7;
+  t.ssadeva = 0x0937;
+  t.ssagujarati = 0x0ab7;
+  t.ssangcieuckorean = 0x3149;
+  t.ssanghieuhkorean = 0x3185;
+  t.ssangieungkorean = 0x3180;
+  t.ssangkiyeokkorean = 0x3132;
+  t.ssangnieunkorean = 0x3165;
+  t.ssangpieupkorean = 0x3143;
+  t.ssangsioskorean = 0x3146;
+  t.ssangtikeutkorean = 0x3138;
+  t.ssuperior = 0xf6f2;
+  t.sterling = 0x00a3;
+  t.sterlingmonospace = 0xffe1;
+  t.strokelongoverlaycmb = 0x0336;
+  t.strokeshortoverlaycmb = 0x0335;
+  t.subset = 0x2282;
+  t.subsetnotequal = 0x228a;
+  t.subsetorequal = 0x2286;
+  t.succeeds = 0x227b;
+  t.suchthat = 0x220b;
+  t.suhiragana = 0x3059;
+  t.sukatakana = 0x30b9;
+  t.sukatakanahalfwidth = 0xff7d;
+  t.sukunarabic = 0x0652;
+  t.summation = 0x2211;
+  t.sun = 0x263c;
+  t.superset = 0x2283;
+  t.supersetnotequal = 0x228b;
+  t.supersetorequal = 0x2287;
+  t.svsquare = 0x33dc;
+  t.syouwaerasquare = 0x337c;
+  t.t = 0x0074;
+  t.tabengali = 0x09a4;
+  t.tackdown = 0x22a4;
+  t.tackleft = 0x22a3;
+  t.tadeva = 0x0924;
+  t.tagujarati = 0x0aa4;
+  t.tagurmukhi = 0x0a24;
+  t.taharabic = 0x0637;
+  t.tahfinalarabic = 0xfec2;
+  t.tahinitialarabic = 0xfec3;
+  t.tahiragana = 0x305f;
+  t.tahmedialarabic = 0xfec4;
+  t.taisyouerasquare = 0x337d;
+  t.takatakana = 0x30bf;
+  t.takatakanahalfwidth = 0xff80;
+  t.tatweelarabic = 0x0640;
+  t.tau = 0x03c4;
+  t.tav = 0x05ea;
+  t.tavdages = 0xfb4a;
+  t.tavdagesh = 0xfb4a;
+  t.tavdageshhebrew = 0xfb4a;
+  t.tavhebrew = 0x05ea;
+  t.tbar = 0x0167;
+  t.tbopomofo = 0x310a;
+  t.tcaron = 0x0165;
+  t.tccurl = 0x02a8;
+  t.tcedilla = 0x0163;
+  t.tcheharabic = 0x0686;
+  t.tchehfinalarabic = 0xfb7b;
+  t.tchehinitialarabic = 0xfb7c;
+  t.tchehmedialarabic = 0xfb7d;
+  t.tcircle = 0x24e3;
+  t.tcircumflexbelow = 0x1e71;
+  t.tcommaaccent = 0x0163;
+  t.tdieresis = 0x1e97;
+  t.tdotaccent = 0x1e6b;
+  t.tdotbelow = 0x1e6d;
+  t.tecyrillic = 0x0442;
+  t.tedescendercyrillic = 0x04ad;
+  t.teharabic = 0x062a;
+  t.tehfinalarabic = 0xfe96;
+  t.tehhahinitialarabic = 0xfca2;
+  t.tehhahisolatedarabic = 0xfc0c;
+  t.tehinitialarabic = 0xfe97;
+  t.tehiragana = 0x3066;
+  t.tehjeeminitialarabic = 0xfca1;
+  t.tehjeemisolatedarabic = 0xfc0b;
+  t.tehmarbutaarabic = 0x0629;
+  t.tehmarbutafinalarabic = 0xfe94;
+  t.tehmedialarabic = 0xfe98;
+  t.tehmeeminitialarabic = 0xfca4;
+  t.tehmeemisolatedarabic = 0xfc0e;
+  t.tehnoonfinalarabic = 0xfc73;
+  t.tekatakana = 0x30c6;
+  t.tekatakanahalfwidth = 0xff83;
+  t.telephone = 0x2121;
+  t.telephoneblack = 0x260e;
+  t.telishagedolahebrew = 0x05a0;
+  t.telishaqetanahebrew = 0x05a9;
+  t.tencircle = 0x2469;
+  t.tenideographicparen = 0x3229;
+  t.tenparen = 0x247d;
+  t.tenperiod = 0x2491;
+  t.tenroman = 0x2179;
+  t.tesh = 0x02a7;
+  t.tet = 0x05d8;
+  t.tetdagesh = 0xfb38;
+  t.tetdageshhebrew = 0xfb38;
+  t.tethebrew = 0x05d8;
+  t.tetsecyrillic = 0x04b5;
+  t.tevirhebrew = 0x059b;
+  t.tevirlefthebrew = 0x059b;
+  t.thabengali = 0x09a5;
+  t.thadeva = 0x0925;
+  t.thagujarati = 0x0aa5;
+  t.thagurmukhi = 0x0a25;
+  t.thalarabic = 0x0630;
+  t.thalfinalarabic = 0xfeac;
+  t.thanthakhatlowleftthai = 0xf898;
+  t.thanthakhatlowrightthai = 0xf897;
+  t.thanthakhatthai = 0x0e4c;
+  t.thanthakhatupperleftthai = 0xf896;
+  t.theharabic = 0x062b;
+  t.thehfinalarabic = 0xfe9a;
+  t.thehinitialarabic = 0xfe9b;
+  t.thehmedialarabic = 0xfe9c;
+  t.thereexists = 0x2203;
+  t.therefore = 0x2234;
+  t.theta = 0x03b8;
+  t.theta1 = 0x03d1;
+  t.thetasymbolgreek = 0x03d1;
+  t.thieuthacirclekorean = 0x3279;
+  t.thieuthaparenkorean = 0x3219;
+  t.thieuthcirclekorean = 0x326b;
+  t.thieuthkorean = 0x314c;
+  t.thieuthparenkorean = 0x320b;
+  t.thirteencircle = 0x246c;
+  t.thirteenparen = 0x2480;
+  t.thirteenperiod = 0x2494;
+  t.thonangmonthothai = 0x0e11;
+  t.thook = 0x01ad;
+  t.thophuthaothai = 0x0e12;
+  t.thorn = 0x00fe;
+  t.thothahanthai = 0x0e17;
+  t.thothanthai = 0x0e10;
+  t.thothongthai = 0x0e18;
+  t.thothungthai = 0x0e16;
+  t.thousandcyrillic = 0x0482;
+  t.thousandsseparatorarabic = 0x066c;
+  t.thousandsseparatorpersian = 0x066c;
+  t.three = 0x0033;
+  t.threearabic = 0x0663;
+  t.threebengali = 0x09e9;
+  t.threecircle = 0x2462;
+  t.threecircleinversesansserif = 0x278c;
+  t.threedeva = 0x0969;
+  t.threeeighths = 0x215c;
+  t.threegujarati = 0x0ae9;
+  t.threegurmukhi = 0x0a69;
+  t.threehackarabic = 0x0663;
+  t.threehangzhou = 0x3023;
+  t.threeideographicparen = 0x3222;
+  t.threeinferior = 0x2083;
+  t.threemonospace = 0xff13;
+  t.threenumeratorbengali = 0x09f6;
+  t.threeoldstyle = 0xf733;
+  t.threeparen = 0x2476;
+  t.threeperiod = 0x248a;
+  t.threepersian = 0x06f3;
+  t.threequarters = 0x00be;
+  t.threequartersemdash = 0xf6de;
+  t.threeroman = 0x2172;
+  t.threesuperior = 0x00b3;
+  t.threethai = 0x0e53;
+  t.thzsquare = 0x3394;
+  t.tihiragana = 0x3061;
+  t.tikatakana = 0x30c1;
+  t.tikatakanahalfwidth = 0xff81;
+  t.tikeutacirclekorean = 0x3270;
+  t.tikeutaparenkorean = 0x3210;
+  t.tikeutcirclekorean = 0x3262;
+  t.tikeutkorean = 0x3137;
+  t.tikeutparenkorean = 0x3202;
+  t.tilde = 0x02dc;
+  t.tildebelowcmb = 0x0330;
+  t.tildecmb = 0x0303;
+  t.tildecomb = 0x0303;
+  t.tildedoublecmb = 0x0360;
+  t.tildeoperator = 0x223c;
+  t.tildeoverlaycmb = 0x0334;
+  t.tildeverticalcmb = 0x033e;
+  t.timescircle = 0x2297;
+  t.tipehahebrew = 0x0596;
+  t.tipehalefthebrew = 0x0596;
+  t.tippigurmukhi = 0x0a70;
+  t.titlocyrilliccmb = 0x0483;
+  t.tiwnarmenian = 0x057f;
+  t.tlinebelow = 0x1e6f;
+  t.tmonospace = 0xff54;
+  t.toarmenian = 0x0569;
+  t.tohiragana = 0x3068;
+  t.tokatakana = 0x30c8;
+  t.tokatakanahalfwidth = 0xff84;
+  t.tonebarextrahighmod = 0x02e5;
+  t.tonebarextralowmod = 0x02e9;
+  t.tonebarhighmod = 0x02e6;
+  t.tonebarlowmod = 0x02e8;
+  t.tonebarmidmod = 0x02e7;
+  t.tonefive = 0x01bd;
+  t.tonesix = 0x0185;
+  t.tonetwo = 0x01a8;
+  t.tonos = 0x0384;
+  t.tonsquare = 0x3327;
+  t.topatakthai = 0x0e0f;
+  t.tortoiseshellbracketleft = 0x3014;
+  t.tortoiseshellbracketleftsmall = 0xfe5d;
+  t.tortoiseshellbracketleftvertical = 0xfe39;
+  t.tortoiseshellbracketright = 0x3015;
+  t.tortoiseshellbracketrightsmall = 0xfe5e;
+  t.tortoiseshellbracketrightvertical = 0xfe3a;
+  t.totaothai = 0x0e15;
+  t.tpalatalhook = 0x01ab;
+  t.tparen = 0x24af;
+  t.trademark = 0x2122;
+  t.trademarksans = 0xf8ea;
+  t.trademarkserif = 0xf6db;
+  t.tretroflexhook = 0x0288;
+  t.triagdn = 0x25bc;
+  t.triaglf = 0x25c4;
+  t.triagrt = 0x25ba;
+  t.triagup = 0x25b2;
+  t.ts = 0x02a6;
+  t.tsadi = 0x05e6;
+  t.tsadidagesh = 0xfb46;
+  t.tsadidageshhebrew = 0xfb46;
+  t.tsadihebrew = 0x05e6;
+  t.tsecyrillic = 0x0446;
+  t.tsere = 0x05b5;
+  t.tsere12 = 0x05b5;
+  t.tsere1e = 0x05b5;
+  t.tsere2b = 0x05b5;
+  t.tserehebrew = 0x05b5;
+  t.tserenarrowhebrew = 0x05b5;
+  t.tserequarterhebrew = 0x05b5;
+  t.tserewidehebrew = 0x05b5;
+  t.tshecyrillic = 0x045b;
+  t.tsuperior = 0xf6f3;
+  t.ttabengali = 0x099f;
+  t.ttadeva = 0x091f;
+  t.ttagujarati = 0x0a9f;
+  t.ttagurmukhi = 0x0a1f;
+  t.tteharabic = 0x0679;
+  t.ttehfinalarabic = 0xfb67;
+  t.ttehinitialarabic = 0xfb68;
+  t.ttehmedialarabic = 0xfb69;
+  t.tthabengali = 0x09a0;
+  t.tthadeva = 0x0920;
+  t.tthagujarati = 0x0aa0;
+  t.tthagurmukhi = 0x0a20;
+  t.tturned = 0x0287;
+  t.tuhiragana = 0x3064;
+  t.tukatakana = 0x30c4;
+  t.tukatakanahalfwidth = 0xff82;
+  t.tusmallhiragana = 0x3063;
+  t.tusmallkatakana = 0x30c3;
+  t.tusmallkatakanahalfwidth = 0xff6f;
+  t.twelvecircle = 0x246b;
+  t.twelveparen = 0x247f;
+  t.twelveperiod = 0x2493;
+  t.twelveroman = 0x217b;
+  t.twentycircle = 0x2473;
+  t.twentyhangzhou = 0x5344;
+  t.twentyparen = 0x2487;
+  t.twentyperiod = 0x249b;
+  t.two = 0x0032;
+  t.twoarabic = 0x0662;
+  t.twobengali = 0x09e8;
+  t.twocircle = 0x2461;
+  t.twocircleinversesansserif = 0x278b;
+  t.twodeva = 0x0968;
+  t.twodotenleader = 0x2025;
+  t.twodotleader = 0x2025;
+  t.twodotleadervertical = 0xfe30;
+  t.twogujarati = 0x0ae8;
+  t.twogurmukhi = 0x0a68;
+  t.twohackarabic = 0x0662;
+  t.twohangzhou = 0x3022;
+  t.twoideographicparen = 0x3221;
+  t.twoinferior = 0x2082;
+  t.twomonospace = 0xff12;
+  t.twonumeratorbengali = 0x09f5;
+  t.twooldstyle = 0xf732;
+  t.twoparen = 0x2475;
+  t.twoperiod = 0x2489;
+  t.twopersian = 0x06f2;
+  t.tworoman = 0x2171;
+  t.twostroke = 0x01bb;
+  t.twosuperior = 0x00b2;
+  t.twothai = 0x0e52;
+  t.twothirds = 0x2154;
+  t.u = 0x0075;
+  t.uacute = 0x00fa;
+  t.ubar = 0x0289;
+  t.ubengali = 0x0989;
+  t.ubopomofo = 0x3128;
+  t.ubreve = 0x016d;
+  t.ucaron = 0x01d4;
+  t.ucircle = 0x24e4;
+  t.ucircumflex = 0x00fb;
+  t.ucircumflexbelow = 0x1e77;
+  t.ucyrillic = 0x0443;
+  t.udattadeva = 0x0951;
+  t.udblacute = 0x0171;
+  t.udblgrave = 0x0215;
+  t.udeva = 0x0909;
+  t.udieresis = 0x00fc;
+  t.udieresisacute = 0x01d8;
+  t.udieresisbelow = 0x1e73;
+  t.udieresiscaron = 0x01da;
+  t.udieresiscyrillic = 0x04f1;
+  t.udieresisgrave = 0x01dc;
+  t.udieresismacron = 0x01d6;
+  t.udotbelow = 0x1ee5;
+  t.ugrave = 0x00f9;
+  t.ugujarati = 0x0a89;
+  t.ugurmukhi = 0x0a09;
+  t.uhiragana = 0x3046;
+  t.uhookabove = 0x1ee7;
+  t.uhorn = 0x01b0;
+  t.uhornacute = 0x1ee9;
+  t.uhorndotbelow = 0x1ef1;
+  t.uhorngrave = 0x1eeb;
+  t.uhornhookabove = 0x1eed;
+  t.uhorntilde = 0x1eef;
+  t.uhungarumlaut = 0x0171;
+  t.uhungarumlautcyrillic = 0x04f3;
+  t.uinvertedbreve = 0x0217;
+  t.ukatakana = 0x30a6;
+  t.ukatakanahalfwidth = 0xff73;
+  t.ukcyrillic = 0x0479;
+  t.ukorean = 0x315c;
+  t.umacron = 0x016b;
+  t.umacroncyrillic = 0x04ef;
+  t.umacrondieresis = 0x1e7b;
+  t.umatragurmukhi = 0x0a41;
+  t.umonospace = 0xff55;
+  t.underscore = 0x005f;
+  t.underscoredbl = 0x2017;
+  t.underscoremonospace = 0xff3f;
+  t.underscorevertical = 0xfe33;
+  t.underscorewavy = 0xfe4f;
+  t.union = 0x222a;
+  t.universal = 0x2200;
+  t.uogonek = 0x0173;
+  t.uparen = 0x24b0;
+  t.upblock = 0x2580;
+  t.upperdothebrew = 0x05c4;
+  t.upsilon = 0x03c5;
+  t.upsilondieresis = 0x03cb;
+  t.upsilondieresistonos = 0x03b0;
+  t.upsilonlatin = 0x028a;
+  t.upsilontonos = 0x03cd;
+  t.uptackbelowcmb = 0x031d;
+  t.uptackmod = 0x02d4;
+  t.uragurmukhi = 0x0a73;
+  t.uring = 0x016f;
+  t.ushortcyrillic = 0x045e;
+  t.usmallhiragana = 0x3045;
+  t.usmallkatakana = 0x30a5;
+  t.usmallkatakanahalfwidth = 0xff69;
+  t.ustraightcyrillic = 0x04af;
+  t.ustraightstrokecyrillic = 0x04b1;
+  t.utilde = 0x0169;
+  t.utildeacute = 0x1e79;
+  t.utildebelow = 0x1e75;
+  t.uubengali = 0x098a;
+  t.uudeva = 0x090a;
+  t.uugujarati = 0x0a8a;
+  t.uugurmukhi = 0x0a0a;
+  t.uumatragurmukhi = 0x0a42;
+  t.uuvowelsignbengali = 0x09c2;
+  t.uuvowelsigndeva = 0x0942;
+  t.uuvowelsigngujarati = 0x0ac2;
+  t.uvowelsignbengali = 0x09c1;
+  t.uvowelsigndeva = 0x0941;
+  t.uvowelsigngujarati = 0x0ac1;
+  t.v = 0x0076;
+  t.vadeva = 0x0935;
+  t.vagujarati = 0x0ab5;
+  t.vagurmukhi = 0x0a35;
+  t.vakatakana = 0x30f7;
+  t.vav = 0x05d5;
+  t.vavdagesh = 0xfb35;
+  t.vavdagesh65 = 0xfb35;
+  t.vavdageshhebrew = 0xfb35;
+  t.vavhebrew = 0x05d5;
+  t.vavholam = 0xfb4b;
+  t.vavholamhebrew = 0xfb4b;
+  t.vavvavhebrew = 0x05f0;
+  t.vavyodhebrew = 0x05f1;
+  t.vcircle = 0x24e5;
+  t.vdotbelow = 0x1e7f;
+  t.vecyrillic = 0x0432;
+  t.veharabic = 0x06a4;
+  t.vehfinalarabic = 0xfb6b;
+  t.vehinitialarabic = 0xfb6c;
+  t.vehmedialarabic = 0xfb6d;
+  t.vekatakana = 0x30f9;
+  t.venus = 0x2640;
+  t.verticalbar = 0x007c;
+  t.verticallineabovecmb = 0x030d;
+  t.verticallinebelowcmb = 0x0329;
+  t.verticallinelowmod = 0x02cc;
+  t.verticallinemod = 0x02c8;
+  t.vewarmenian = 0x057e;
+  t.vhook = 0x028b;
+  t.vikatakana = 0x30f8;
+  t.viramabengali = 0x09cd;
+  t.viramadeva = 0x094d;
+  t.viramagujarati = 0x0acd;
+  t.visargabengali = 0x0983;
+  t.visargadeva = 0x0903;
+  t.visargagujarati = 0x0a83;
+  t.vmonospace = 0xff56;
+  t.voarmenian = 0x0578;
+  t.voicediterationhiragana = 0x309e;
+  t.voicediterationkatakana = 0x30fe;
+  t.voicedmarkkana = 0x309b;
+  t.voicedmarkkanahalfwidth = 0xff9e;
+  t.vokatakana = 0x30fa;
+  t.vparen = 0x24b1;
+  t.vtilde = 0x1e7d;
+  t.vturned = 0x028c;
+  t.vuhiragana = 0x3094;
+  t.vukatakana = 0x30f4;
+  t.w = 0x0077;
+  t.wacute = 0x1e83;
+  t.waekorean = 0x3159;
+  t.wahiragana = 0x308f;
+  t.wakatakana = 0x30ef;
+  t.wakatakanahalfwidth = 0xff9c;
+  t.wakorean = 0x3158;
+  t.wasmallhiragana = 0x308e;
+  t.wasmallkatakana = 0x30ee;
+  t.wattosquare = 0x3357;
+  t.wavedash = 0x301c;
+  t.wavyunderscorevertical = 0xfe34;
+  t.wawarabic = 0x0648;
+  t.wawfinalarabic = 0xfeee;
+  t.wawhamzaabovearabic = 0x0624;
+  t.wawhamzaabovefinalarabic = 0xfe86;
+  t.wbsquare = 0x33dd;
+  t.wcircle = 0x24e6;
+  t.wcircumflex = 0x0175;
+  t.wdieresis = 0x1e85;
+  t.wdotaccent = 0x1e87;
+  t.wdotbelow = 0x1e89;
+  t.wehiragana = 0x3091;
+  t.weierstrass = 0x2118;
+  t.wekatakana = 0x30f1;
+  t.wekorean = 0x315e;
+  t.weokorean = 0x315d;
+  t.wgrave = 0x1e81;
+  t.whitebullet = 0x25e6;
+  t.whitecircle = 0x25cb;
+  t.whitecircleinverse = 0x25d9;
+  t.whitecornerbracketleft = 0x300e;
+  t.whitecornerbracketleftvertical = 0xfe43;
+  t.whitecornerbracketright = 0x300f;
+  t.whitecornerbracketrightvertical = 0xfe44;
+  t.whitediamond = 0x25c7;
+  t.whitediamondcontainingblacksmalldiamond = 0x25c8;
+  t.whitedownpointingsmalltriangle = 0x25bf;
+  t.whitedownpointingtriangle = 0x25bd;
+  t.whiteleftpointingsmalltriangle = 0x25c3;
+  t.whiteleftpointingtriangle = 0x25c1;
+  t.whitelenticularbracketleft = 0x3016;
+  t.whitelenticularbracketright = 0x3017;
+  t.whiterightpointingsmalltriangle = 0x25b9;
+  t.whiterightpointingtriangle = 0x25b7;
+  t.whitesmallsquare = 0x25ab;
+  t.whitesmilingface = 0x263a;
+  t.whitesquare = 0x25a1;
+  t.whitestar = 0x2606;
+  t.whitetelephone = 0x260f;
+  t.whitetortoiseshellbracketleft = 0x3018;
+  t.whitetortoiseshellbracketright = 0x3019;
+  t.whiteuppointingsmalltriangle = 0x25b5;
+  t.whiteuppointingtriangle = 0x25b3;
+  t.wihiragana = 0x3090;
+  t.wikatakana = 0x30f0;
+  t.wikorean = 0x315f;
+  t.wmonospace = 0xff57;
+  t.wohiragana = 0x3092;
+  t.wokatakana = 0x30f2;
+  t.wokatakanahalfwidth = 0xff66;
+  t.won = 0x20a9;
+  t.wonmonospace = 0xffe6;
+  t.wowaenthai = 0x0e27;
+  t.wparen = 0x24b2;
+  t.wring = 0x1e98;
+  t.wsuperior = 0x02b7;
+  t.wturned = 0x028d;
+  t.wynn = 0x01bf;
+  t.x = 0x0078;
+  t.xabovecmb = 0x033d;
+  t.xbopomofo = 0x3112;
+  t.xcircle = 0x24e7;
+  t.xdieresis = 0x1e8d;
+  t.xdotaccent = 0x1e8b;
+  t.xeharmenian = 0x056d;
+  t.xi = 0x03be;
+  t.xmonospace = 0xff58;
+  t.xparen = 0x24b3;
+  t.xsuperior = 0x02e3;
+  t.y = 0x0079;
+  t.yaadosquare = 0x334e;
+  t.yabengali = 0x09af;
+  t.yacute = 0x00fd;
+  t.yadeva = 0x092f;
+  t.yaekorean = 0x3152;
+  t.yagujarati = 0x0aaf;
+  t.yagurmukhi = 0x0a2f;
+  t.yahiragana = 0x3084;
+  t.yakatakana = 0x30e4;
+  t.yakatakanahalfwidth = 0xff94;
+  t.yakorean = 0x3151;
+  t.yamakkanthai = 0x0e4e;
+  t.yasmallhiragana = 0x3083;
+  t.yasmallkatakana = 0x30e3;
+  t.yasmallkatakanahalfwidth = 0xff6c;
+  t.yatcyrillic = 0x0463;
+  t.ycircle = 0x24e8;
+  t.ycircumflex = 0x0177;
+  t.ydieresis = 0x00ff;
+  t.ydotaccent = 0x1e8f;
+  t.ydotbelow = 0x1ef5;
+  t.yeharabic = 0x064a;
+  t.yehbarreearabic = 0x06d2;
+  t.yehbarreefinalarabic = 0xfbaf;
+  t.yehfinalarabic = 0xfef2;
+  t.yehhamzaabovearabic = 0x0626;
+  t.yehhamzaabovefinalarabic = 0xfe8a;
+  t.yehhamzaaboveinitialarabic = 0xfe8b;
+  t.yehhamzaabovemedialarabic = 0xfe8c;
+  t.yehinitialarabic = 0xfef3;
+  t.yehmedialarabic = 0xfef4;
+  t.yehmeeminitialarabic = 0xfcdd;
+  t.yehmeemisolatedarabic = 0xfc58;
+  t.yehnoonfinalarabic = 0xfc94;
+  t.yehthreedotsbelowarabic = 0x06d1;
+  t.yekorean = 0x3156;
+  t.yen = 0x00a5;
+  t.yenmonospace = 0xffe5;
+  t.yeokorean = 0x3155;
+  t.yeorinhieuhkorean = 0x3186;
+  t.yerahbenyomohebrew = 0x05aa;
+  t.yerahbenyomolefthebrew = 0x05aa;
+  t.yericyrillic = 0x044b;
+  t.yerudieresiscyrillic = 0x04f9;
+  t.yesieungkorean = 0x3181;
+  t.yesieungpansioskorean = 0x3183;
+  t.yesieungsioskorean = 0x3182;
+  t.yetivhebrew = 0x059a;
+  t.ygrave = 0x1ef3;
+  t.yhook = 0x01b4;
+  t.yhookabove = 0x1ef7;
+  t.yiarmenian = 0x0575;
+  t.yicyrillic = 0x0457;
+  t.yikorean = 0x3162;
+  t.yinyang = 0x262f;
+  t.yiwnarmenian = 0x0582;
+  t.ymonospace = 0xff59;
+  t.yod = 0x05d9;
+  t.yoddagesh = 0xfb39;
+  t.yoddageshhebrew = 0xfb39;
+  t.yodhebrew = 0x05d9;
+  t.yodyodhebrew = 0x05f2;
+  t.yodyodpatahhebrew = 0xfb1f;
+  t.yohiragana = 0x3088;
+  t.yoikorean = 0x3189;
+  t.yokatakana = 0x30e8;
+  t.yokatakanahalfwidth = 0xff96;
+  t.yokorean = 0x315b;
+  t.yosmallhiragana = 0x3087;
+  t.yosmallkatakana = 0x30e7;
+  t.yosmallkatakanahalfwidth = 0xff6e;
+  t.yotgreek = 0x03f3;
+  t.yoyaekorean = 0x3188;
+  t.yoyakorean = 0x3187;
+  t.yoyakthai = 0x0e22;
+  t.yoyingthai = 0x0e0d;
+  t.yparen = 0x24b4;
+  t.ypogegrammeni = 0x037a;
+  t.ypogegrammenigreekcmb = 0x0345;
+  t.yr = 0x01a6;
+  t.yring = 0x1e99;
+  t.ysuperior = 0x02b8;
+  t.ytilde = 0x1ef9;
+  t.yturned = 0x028e;
+  t.yuhiragana = 0x3086;
+  t.yuikorean = 0x318c;
+  t.yukatakana = 0x30e6;
+  t.yukatakanahalfwidth = 0xff95;
+  t.yukorean = 0x3160;
+  t.yusbigcyrillic = 0x046b;
+  t.yusbigiotifiedcyrillic = 0x046d;
+  t.yuslittlecyrillic = 0x0467;
+  t.yuslittleiotifiedcyrillic = 0x0469;
+  t.yusmallhiragana = 0x3085;
+  t.yusmallkatakana = 0x30e5;
+  t.yusmallkatakanahalfwidth = 0xff6d;
+  t.yuyekorean = 0x318b;
+  t.yuyeokorean = 0x318a;
+  t.yyabengali = 0x09df;
+  t.yyadeva = 0x095f;
+  t.z = 0x007a;
+  t.zaarmenian = 0x0566;
+  t.zacute = 0x017a;
+  t.zadeva = 0x095b;
+  t.zagurmukhi = 0x0a5b;
+  t.zaharabic = 0x0638;
+  t.zahfinalarabic = 0xfec6;
+  t.zahinitialarabic = 0xfec7;
+  t.zahiragana = 0x3056;
+  t.zahmedialarabic = 0xfec8;
+  t.zainarabic = 0x0632;
+  t.zainfinalarabic = 0xfeb0;
+  t.zakatakana = 0x30b6;
+  t.zaqefgadolhebrew = 0x0595;
+  t.zaqefqatanhebrew = 0x0594;
+  t.zarqahebrew = 0x0598;
+  t.zayin = 0x05d6;
+  t.zayindagesh = 0xfb36;
+  t.zayindageshhebrew = 0xfb36;
+  t.zayinhebrew = 0x05d6;
+  t.zbopomofo = 0x3117;
+  t.zcaron = 0x017e;
+  t.zcircle = 0x24e9;
+  t.zcircumflex = 0x1e91;
+  t.zcurl = 0x0291;
+  t.zdot = 0x017c;
+  t.zdotaccent = 0x017c;
+  t.zdotbelow = 0x1e93;
+  t.zecyrillic = 0x0437;
+  t.zedescendercyrillic = 0x0499;
+  t.zedieresiscyrillic = 0x04df;
+  t.zehiragana = 0x305c;
+  t.zekatakana = 0x30bc;
+  t.zero = 0x0030;
+  t.zeroarabic = 0x0660;
+  t.zerobengali = 0x09e6;
+  t.zerodeva = 0x0966;
+  t.zerogujarati = 0x0ae6;
+  t.zerogurmukhi = 0x0a66;
+  t.zerohackarabic = 0x0660;
+  t.zeroinferior = 0x2080;
+  t.zeromonospace = 0xff10;
+  t.zerooldstyle = 0xf730;
+  t.zeropersian = 0x06f0;
+  t.zerosuperior = 0x2070;
+  t.zerothai = 0x0e50;
+  t.zerowidthjoiner = 0xfeff;
+  t.zerowidthnonjoiner = 0x200c;
+  t.zerowidthspace = 0x200b;
+  t.zeta = 0x03b6;
+  t.zhbopomofo = 0x3113;
+  t.zhearmenian = 0x056a;
+  t.zhebrevecyrillic = 0x04c2;
+  t.zhecyrillic = 0x0436;
+  t.zhedescendercyrillic = 0x0497;
+  t.zhedieresiscyrillic = 0x04dd;
+  t.zihiragana = 0x3058;
+  t.zikatakana = 0x30b8;
+  t.zinorhebrew = 0x05ae;
+  t.zlinebelow = 0x1e95;
+  t.zmonospace = 0xff5a;
+  t.zohiragana = 0x305e;
+  t.zokatakana = 0x30be;
+  t.zparen = 0x24b5;
+  t.zretroflexhook = 0x0290;
+  t.zstroke = 0x01b6;
+  t.zuhiragana = 0x305a;
+  t.zukatakana = 0x30ba;
+  t[".notdef"] = 0x0000;
+  t.angbracketleftbig = 0x2329;
+  t.angbracketleftBig = 0x2329;
+  t.angbracketleftbigg = 0x2329;
+  t.angbracketleftBigg = 0x2329;
+  t.angbracketrightBig = 0x232a;
+  t.angbracketrightbig = 0x232a;
+  t.angbracketrightBigg = 0x232a;
+  t.angbracketrightbigg = 0x232a;
+  t.arrowhookleft = 0x21aa;
+  t.arrowhookright = 0x21a9;
+  t.arrowlefttophalf = 0x21bc;
+  t.arrowleftbothalf = 0x21bd;
+  t.arrownortheast = 0x2197;
+  t.arrownorthwest = 0x2196;
+  t.arrowrighttophalf = 0x21c0;
+  t.arrowrightbothalf = 0x21c1;
+  t.arrowsoutheast = 0x2198;
+  t.arrowsouthwest = 0x2199;
+  t.backslashbig = 0x2216;
+  t.backslashBig = 0x2216;
+  t.backslashBigg = 0x2216;
+  t.backslashbigg = 0x2216;
+  t.bardbl = 0x2016;
+  t.bracehtipdownleft = 0xfe37;
+  t.bracehtipdownright = 0xfe37;
+  t.bracehtipupleft = 0xfe38;
+  t.bracehtipupright = 0xfe38;
+  t.braceleftBig = 0x007b;
+  t.braceleftbig = 0x007b;
+  t.braceleftbigg = 0x007b;
+  t.braceleftBigg = 0x007b;
+  t.bracerightBig = 0x007d;
+  t.bracerightbig = 0x007d;
+  t.bracerightbigg = 0x007d;
+  t.bracerightBigg = 0x007d;
+  t.bracketleftbig = 0x005b;
+  t.bracketleftBig = 0x005b;
+  t.bracketleftbigg = 0x005b;
+  t.bracketleftBigg = 0x005b;
+  t.bracketrightBig = 0x005d;
+  t.bracketrightbig = 0x005d;
+  t.bracketrightbigg = 0x005d;
+  t.bracketrightBigg = 0x005d;
+  t.ceilingleftbig = 0x2308;
+  t.ceilingleftBig = 0x2308;
+  t.ceilingleftBigg = 0x2308;
+  t.ceilingleftbigg = 0x2308;
+  t.ceilingrightbig = 0x2309;
+  t.ceilingrightBig = 0x2309;
+  t.ceilingrightbigg = 0x2309;
+  t.ceilingrightBigg = 0x2309;
+  t.circledotdisplay = 0x2299;
+  t.circledottext = 0x2299;
+  t.circlemultiplydisplay = 0x2297;
+  t.circlemultiplytext = 0x2297;
+  t.circleplusdisplay = 0x2295;
+  t.circleplustext = 0x2295;
+  t.contintegraldisplay = 0x222e;
+  t.contintegraltext = 0x222e;
+  t.coproductdisplay = 0x2210;
+  t.coproducttext = 0x2210;
+  t.floorleftBig = 0x230a;
+  t.floorleftbig = 0x230a;
+  t.floorleftbigg = 0x230a;
+  t.floorleftBigg = 0x230a;
+  t.floorrightbig = 0x230b;
+  t.floorrightBig = 0x230b;
+  t.floorrightBigg = 0x230b;
+  t.floorrightbigg = 0x230b;
+  t.hatwide = 0x0302;
+  t.hatwider = 0x0302;
+  t.hatwidest = 0x0302;
+  t.intercal = 0x1d40;
+  t.integraldisplay = 0x222b;
+  t.integraltext = 0x222b;
+  t.intersectiondisplay = 0x22c2;
+  t.intersectiontext = 0x22c2;
+  t.logicalanddisplay = 0x2227;
+  t.logicalandtext = 0x2227;
+  t.logicalordisplay = 0x2228;
+  t.logicalortext = 0x2228;
+  t.parenleftBig = 0x0028;
+  t.parenleftbig = 0x0028;
+  t.parenleftBigg = 0x0028;
+  t.parenleftbigg = 0x0028;
+  t.parenrightBig = 0x0029;
+  t.parenrightbig = 0x0029;
+  t.parenrightBigg = 0x0029;
+  t.parenrightbigg = 0x0029;
+  t.prime = 0x2032;
+  t.productdisplay = 0x220f;
+  t.producttext = 0x220f;
+  t.radicalbig = 0x221a;
+  t.radicalBig = 0x221a;
+  t.radicalBigg = 0x221a;
+  t.radicalbigg = 0x221a;
+  t.radicalbt = 0x221a;
+  t.radicaltp = 0x221a;
+  t.radicalvertex = 0x221a;
+  t.slashbig = 0x002f;
+  t.slashBig = 0x002f;
+  t.slashBigg = 0x002f;
+  t.slashbigg = 0x002f;
+  t.summationdisplay = 0x2211;
+  t.summationtext = 0x2211;
+  t.tildewide = 0x02dc;
+  t.tildewider = 0x02dc;
+  t.tildewidest = 0x02dc;
+  t.uniondisplay = 0x22c3;
+  t.unionmultidisplay = 0x228e;
+  t.unionmultitext = 0x228e;
+  t.unionsqdisplay = 0x2294;
+  t.unionsqtext = 0x2294;
+  t.uniontext = 0x22c3;
+  t.vextenddouble = 0x2225;
+  t.vextendsingle = 0x2223;
+});
+const getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {
+  t.space = 0x0020;
+  t.a1 = 0x2701;
+  t.a2 = 0x2702;
+  t.a202 = 0x2703;
+  t.a3 = 0x2704;
+  t.a4 = 0x260e;
+  t.a5 = 0x2706;
+  t.a119 = 0x2707;
+  t.a118 = 0x2708;
+  t.a117 = 0x2709;
+  t.a11 = 0x261b;
+  t.a12 = 0x261e;
+  t.a13 = 0x270c;
+  t.a14 = 0x270d;
+  t.a15 = 0x270e;
+  t.a16 = 0x270f;
+  t.a105 = 0x2710;
+  t.a17 = 0x2711;
+  t.a18 = 0x2712;
+  t.a19 = 0x2713;
+  t.a20 = 0x2714;
+  t.a21 = 0x2715;
+  t.a22 = 0x2716;
+  t.a23 = 0x2717;
+  t.a24 = 0x2718;
+  t.a25 = 0x2719;
+  t.a26 = 0x271a;
+  t.a27 = 0x271b;
+  t.a28 = 0x271c;
+  t.a6 = 0x271d;
+  t.a7 = 0x271e;
+  t.a8 = 0x271f;
+  t.a9 = 0x2720;
+  t.a10 = 0x2721;
+  t.a29 = 0x2722;
+  t.a30 = 0x2723;
+  t.a31 = 0x2724;
+  t.a32 = 0x2725;
+  t.a33 = 0x2726;
+  t.a34 = 0x2727;
+  t.a35 = 0x2605;
+  t.a36 = 0x2729;
+  t.a37 = 0x272a;
+  t.a38 = 0x272b;
+  t.a39 = 0x272c;
+  t.a40 = 0x272d;
+  t.a41 = 0x272e;
+  t.a42 = 0x272f;
+  t.a43 = 0x2730;
+  t.a44 = 0x2731;
+  t.a45 = 0x2732;
+  t.a46 = 0x2733;
+  t.a47 = 0x2734;
+  t.a48 = 0x2735;
+  t.a49 = 0x2736;
+  t.a50 = 0x2737;
+  t.a51 = 0x2738;
+  t.a52 = 0x2739;
+  t.a53 = 0x273a;
+  t.a54 = 0x273b;
+  t.a55 = 0x273c;
+  t.a56 = 0x273d;
+  t.a57 = 0x273e;
+  t.a58 = 0x273f;
+  t.a59 = 0x2740;
+  t.a60 = 0x2741;
+  t.a61 = 0x2742;
+  t.a62 = 0x2743;
+  t.a63 = 0x2744;
+  t.a64 = 0x2745;
+  t.a65 = 0x2746;
+  t.a66 = 0x2747;
+  t.a67 = 0x2748;
+  t.a68 = 0x2749;
+  t.a69 = 0x274a;
+  t.a70 = 0x274b;
+  t.a71 = 0x25cf;
+  t.a72 = 0x274d;
+  t.a73 = 0x25a0;
+  t.a74 = 0x274f;
+  t.a203 = 0x2750;
+  t.a75 = 0x2751;
+  t.a204 = 0x2752;
+  t.a76 = 0x25b2;
+  t.a77 = 0x25bc;
+  t.a78 = 0x25c6;
+  t.a79 = 0x2756;
+  t.a81 = 0x25d7;
+  t.a82 = 0x2758;
+  t.a83 = 0x2759;
+  t.a84 = 0x275a;
+  t.a97 = 0x275b;
+  t.a98 = 0x275c;
+  t.a99 = 0x275d;
+  t.a100 = 0x275e;
+  t.a101 = 0x2761;
+  t.a102 = 0x2762;
+  t.a103 = 0x2763;
+  t.a104 = 0x2764;
+  t.a106 = 0x2765;
+  t.a107 = 0x2766;
+  t.a108 = 0x2767;
+  t.a112 = 0x2663;
+  t.a111 = 0x2666;
+  t.a110 = 0x2665;
+  t.a109 = 0x2660;
+  t.a120 = 0x2460;
+  t.a121 = 0x2461;
+  t.a122 = 0x2462;
+  t.a123 = 0x2463;
+  t.a124 = 0x2464;
+  t.a125 = 0x2465;
+  t.a126 = 0x2466;
+  t.a127 = 0x2467;
+  t.a128 = 0x2468;
+  t.a129 = 0x2469;
+  t.a130 = 0x2776;
+  t.a131 = 0x2777;
+  t.a132 = 0x2778;
+  t.a133 = 0x2779;
+  t.a134 = 0x277a;
+  t.a135 = 0x277b;
+  t.a136 = 0x277c;
+  t.a137 = 0x277d;
+  t.a138 = 0x277e;
+  t.a139 = 0x277f;
+  t.a140 = 0x2780;
+  t.a141 = 0x2781;
+  t.a142 = 0x2782;
+  t.a143 = 0x2783;
+  t.a144 = 0x2784;
+  t.a145 = 0x2785;
+  t.a146 = 0x2786;
+  t.a147 = 0x2787;
+  t.a148 = 0x2788;
+  t.a149 = 0x2789;
+  t.a150 = 0x278a;
+  t.a151 = 0x278b;
+  t.a152 = 0x278c;
+  t.a153 = 0x278d;
+  t.a154 = 0x278e;
+  t.a155 = 0x278f;
+  t.a156 = 0x2790;
+  t.a157 = 0x2791;
+  t.a158 = 0x2792;
+  t.a159 = 0x2793;
+  t.a160 = 0x2794;
+  t.a161 = 0x2192;
+  t.a163 = 0x2194;
+  t.a164 = 0x2195;
+  t.a196 = 0x2798;
+  t.a165 = 0x2799;
+  t.a192 = 0x279a;
+  t.a166 = 0x279b;
+  t.a167 = 0x279c;
+  t.a168 = 0x279d;
+  t.a169 = 0x279e;
+  t.a170 = 0x279f;
+  t.a171 = 0x27a0;
+  t.a172 = 0x27a1;
+  t.a173 = 0x27a2;
+  t.a162 = 0x27a3;
+  t.a174 = 0x27a4;
+  t.a175 = 0x27a5;
+  t.a176 = 0x27a6;
+  t.a177 = 0x27a7;
+  t.a178 = 0x27a8;
+  t.a179 = 0x27a9;
+  t.a193 = 0x27aa;
+  t.a180 = 0x27ab;
+  t.a199 = 0x27ac;
+  t.a181 = 0x27ad;
+  t.a200 = 0x27ae;
+  t.a182 = 0x27af;
+  t.a201 = 0x27b1;
+  t.a183 = 0x27b2;
+  t.a184 = 0x27b3;
+  t.a197 = 0x27b4;
+  t.a185 = 0x27b5;
+  t.a194 = 0x27b6;
+  t.a198 = 0x27b7;
+  t.a186 = 0x27b8;
+  t.a195 = 0x27b9;
+  t.a187 = 0x27ba;
+  t.a188 = 0x27bb;
+  t.a189 = 0x27bc;
+  t.a190 = 0x27bd;
+  t.a191 = 0x27be;
+  t.a89 = 0x2768;
+  t.a90 = 0x2769;
+  t.a93 = 0x276a;
+  t.a94 = 0x276b;
+  t.a91 = 0x276c;
+  t.a92 = 0x276d;
+  t.a205 = 0x276e;
+  t.a85 = 0x276f;
+  t.a206 = 0x2770;
+  t.a86 = 0x2771;
+  t.a87 = 0x2772;
+  t.a88 = 0x2773;
+  t.a95 = 0x2774;
+  t.a96 = 0x2775;
+  t[".notdef"] = 0x0000;
+});
+
+;// ./src/core/unicode.js
+
+const getSpecialPUASymbols = getLookupTableFactory(function (t) {
+  t[63721] = 0x00a9;
+  t[63193] = 0x00a9;
+  t[63720] = 0x00ae;
+  t[63194] = 0x00ae;
+  t[63722] = 0x2122;
+  t[63195] = 0x2122;
+  t[63729] = 0x23a7;
+  t[63730] = 0x23a8;
+  t[63731] = 0x23a9;
+  t[63740] = 0x23ab;
+  t[63741] = 0x23ac;
+  t[63742] = 0x23ad;
+  t[63726] = 0x23a1;
+  t[63727] = 0x23a2;
+  t[63728] = 0x23a3;
+  t[63737] = 0x23a4;
+  t[63738] = 0x23a5;
+  t[63739] = 0x23a6;
+  t[63723] = 0x239b;
+  t[63724] = 0x239c;
+  t[63725] = 0x239d;
+  t[63734] = 0x239e;
+  t[63735] = 0x239f;
+  t[63736] = 0x23a0;
+});
+function mapSpecialUnicodeValues(code) {
+  if (code >= 0xfff0 && code <= 0xffff) {
+    return 0;
+  } else if (code >= 0xf600 && code <= 0xf8ff) {
+    return getSpecialPUASymbols()[code] || code;
+  } else if (code === 0x00ad) {
+    return 0x002d;
+  }
+  return code;
+}
+function getUnicodeForGlyph(name, glyphsUnicodeMap) {
+  let unicode = glyphsUnicodeMap[name];
+  if (unicode !== undefined) {
+    return unicode;
+  }
+  if (!name) {
+    return -1;
+  }
+  if (name[0] === "u") {
+    const nameLen = name.length;
+    let hexStr;
+    if (nameLen === 7 && name[1] === "n" && name[2] === "i") {
+      hexStr = name.substring(3);
+    } else if (nameLen >= 5 && nameLen <= 7) {
+      hexStr = name.substring(1);
+    } else {
+      return -1;
+    }
+    if (hexStr === hexStr.toUpperCase()) {
+      unicode = parseInt(hexStr, 16);
+      if (unicode >= 0) {
+        return unicode;
+      }
+    }
+  }
+  return -1;
+}
+const UnicodeRanges = [[0x0000, 0x007f], [0x0080, 0x00ff], [0x0100, 0x017f], [0x0180, 0x024f], [0x0250, 0x02af, 0x1d00, 0x1d7f, 0x1d80, 0x1dbf], [0x02b0, 0x02ff, 0xa700, 0xa71f], [0x0300, 0x036f, 0x1dc0, 0x1dff], [0x0370, 0x03ff], [0x2c80, 0x2cff], [0x0400, 0x04ff, 0x0500, 0x052f, 0x2de0, 0x2dff, 0xa640, 0xa69f], [0x0530, 0x058f], [0x0590, 0x05ff], [0xa500, 0xa63f], [0x0600, 0x06ff, 0x0750, 0x077f], [0x07c0, 0x07ff], [0x0900, 0x097f], [0x0980, 0x09ff], [0x0a00, 0x0a7f], [0x0a80, 0x0aff], [0x0b00, 0x0b7f], [0x0b80, 0x0bff], [0x0c00, 0x0c7f], [0x0c80, 0x0cff], [0x0d00, 0x0d7f], [0x0e00, 0x0e7f], [0x0e80, 0x0eff], [0x10a0, 0x10ff, 0x2d00, 0x2d2f], [0x1b00, 0x1b7f], [0x1100, 0x11ff], [0x1e00, 0x1eff, 0x2c60, 0x2c7f, 0xa720, 0xa7ff], [0x1f00, 0x1fff], [0x2000, 0x206f, 0x2e00, 0x2e7f], [0x2070, 0x209f], [0x20a0, 0x20cf], [0x20d0, 0x20ff], [0x2100, 0x214f], [0x2150, 0x218f], [0x2190, 0x21ff, 0x27f0, 0x27ff, 0x2900, 0x297f, 0x2b00, 0x2bff], [0x2200, 0x22ff, 0x2a00, 0x2aff, 0x27c0, 0x27ef, 0x2980, 0x29ff], [0x2300, 0x23ff], [0x2400, 0x243f], [0x2440, 0x245f], [0x2460, 0x24ff], [0x2500, 0x257f], [0x2580, 0x259f], [0x25a0, 0x25ff], [0x2600, 0x26ff], [0x2700, 0x27bf], [0x3000, 0x303f], [0x3040, 0x309f], [0x30a0, 0x30ff, 0x31f0, 0x31ff], [0x3100, 0x312f, 0x31a0, 0x31bf], [0x3130, 0x318f], [0xa840, 0xa87f], [0x3200, 0x32ff], [0x3300, 0x33ff], [0xac00, 0xd7af], [0xd800, 0xdfff], [0x10900, 0x1091f], [0x4e00, 0x9fff, 0x2e80, 0x2eff, 0x2f00, 0x2fdf, 0x2ff0, 0x2fff, 0x3400, 0x4dbf, 0x20000, 0x2a6df, 0x3190, 0x319f], [0xe000, 0xf8ff], [0x31c0, 0x31ef, 0xf900, 0xfaff, 0x2f800, 0x2fa1f], [0xfb00, 0xfb4f], [0xfb50, 0xfdff], [0xfe20, 0xfe2f], [0xfe10, 0xfe1f], [0xfe50, 0xfe6f], [0xfe70, 0xfeff], [0xff00, 0xffef], [0xfff0, 0xffff], [0x0f00, 0x0fff], [0x0700, 0x074f], [0x0780, 0x07bf], [0x0d80, 0x0dff], [0x1000, 0x109f], [0x1200, 0x137f, 0x1380, 0x139f, 0x2d80, 0x2ddf], [0x13a0, 0x13ff], [0x1400, 0x167f], [0x1680, 0x169f], [0x16a0, 0x16ff], [0x1780, 0x17ff], [0x1800, 0x18af], [0x2800, 0x28ff], [0xa000, 0xa48f], [0x1700, 0x171f, 0x1720, 0x173f, 0x1740, 0x175f, 0x1760, 0x177f], [0x10300, 0x1032f], [0x10330, 0x1034f], [0x10400, 0x1044f], [0x1d000, 0x1d0ff, 0x1d100, 0x1d1ff, 0x1d200, 0x1d24f], [0x1d400, 0x1d7ff], [0xff000, 0xffffd], [0xfe00, 0xfe0f, 0xe0100, 0xe01ef], [0xe0000, 0xe007f], [0x1900, 0x194f], [0x1950, 0x197f], [0x1980, 0x19df], [0x1a00, 0x1a1f], [0x2c00, 0x2c5f], [0x2d30, 0x2d7f], [0x4dc0, 0x4dff], [0xa800, 0xa82f], [0x10000, 0x1007f, 0x10080, 0x100ff, 0x10100, 0x1013f], [0x10140, 0x1018f], [0x10380, 0x1039f], [0x103a0, 0x103df], [0x10450, 0x1047f], [0x10480, 0x104af], [0x10800, 0x1083f], [0x10a00, 0x10a5f], [0x1d300, 0x1d35f], [0x12000, 0x123ff, 0x12400, 0x1247f], [0x1d360, 0x1d37f], [0x1b80, 0x1bbf], [0x1c00, 0x1c4f], [0x1c50, 0x1c7f], [0xa880, 0xa8df], [0xa900, 0xa92f], [0xa930, 0xa95f], [0xaa00, 0xaa5f], [0x10190, 0x101cf], [0x101d0, 0x101ff], [0x102a0, 0x102df, 0x10280, 0x1029f, 0x10920, 0x1093f], [0x1f030, 0x1f09f, 0x1f000, 0x1f02f]];
+function getUnicodeRangeFor(value, lastPosition = -1) {
+  if (lastPosition !== -1) {
+    const range = UnicodeRanges[lastPosition];
+    for (let i = 0, ii = range.length; i < ii; i += 2) {
+      if (value >= range[i] && value <= range[i + 1]) {
+        return lastPosition;
+      }
+    }
+  }
+  for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) {
+    const range = UnicodeRanges[i];
+    for (let j = 0, jj = range.length; j < jj; j += 2) {
+      if (value >= range[j] && value <= range[j + 1]) {
+        return i;
+      }
+    }
+  }
+  return -1;
+}
+const SpecialCharRegExp = /^(\s)|(\p{Mn})|(\p{Cf})$/u;
+const CategoryCache = new Map();
+function getCharUnicodeCategory(char) {
+  const cachedCategory = CategoryCache.get(char);
+  if (cachedCategory) {
+    return cachedCategory;
+  }
+  const groups = char.match(SpecialCharRegExp);
+  const category = {
+    isWhitespace: !!groups?.[1],
+    isZeroWidthDiacritic: !!groups?.[2],
+    isInvisibleFormatMark: !!groups?.[3]
+  };
+  CategoryCache.set(char, category);
+  return category;
+}
+function clearUnicodeCaches() {
+  CategoryCache.clear();
+}
+
+;// ./src/core/fonts_utils.js
+
+
+
+
+
+const SEAC_ANALYSIS_ENABLED = true;
+const FontFlags = {
+  FixedPitch: 1,
+  Serif: 2,
+  Symbolic: 4,
+  Script: 8,
+  Nonsymbolic: 32,
+  Italic: 64,
+  AllCap: 65536,
+  SmallCap: 131072,
+  ForceBold: 262144
+};
+const MacStandardGlyphOrdering = [".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(name, glyphsUnicodeMap) {
+  if (glyphsUnicodeMap[name] !== undefined) {
+    return name;
+  }
+  const unicode = getUnicodeForGlyph(name, glyphsUnicodeMap);
+  if (unicode !== -1) {
+    for (const key in glyphsUnicodeMap) {
+      if (glyphsUnicodeMap[key] === unicode) {
+        return key;
+      }
+    }
+  }
+  info("Unable to recover a standard glyph name for: " + name);
+  return name;
+}
+function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
+  const charCodeToGlyphId = Object.create(null);
+  let glyphId, charCode, baseEncoding;
+  const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
+  if (properties.isInternalFont) {
+    baseEncoding = builtInEncoding;
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+      charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0;
+    }
+  } else if (properties.baseEncodingName) {
+    baseEncoding = getEncoding(properties.baseEncodingName);
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+      charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0;
+    }
+  } else if (isSymbolicFont) {
+    for (charCode in builtInEncoding) {
+      charCodeToGlyphId[charCode] = builtInEncoding[charCode];
+    }
+  } else {
+    baseEncoding = StandardEncoding;
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+      charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0;
+    }
+  }
+  const differences = properties.differences;
+  let glyphsUnicodeMap;
+  if (differences) {
+    for (charCode in differences) {
+      const glyphName = differences[charCode];
+      glyphId = glyphNames.indexOf(glyphName);
+      if (glyphId === -1) {
+        if (!glyphsUnicodeMap) {
+          glyphsUnicodeMap = getGlyphsUnicode();
+        }
+        const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
+        if (standardGlyphName !== glyphName) {
+          glyphId = glyphNames.indexOf(standardGlyphName);
+        }
+      }
+      charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0;
+    }
+  }
+  return charCodeToGlyphId;
+}
+function normalizeFontName(name) {
+  return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, "");
+}
+const getVerticalPresentationForm = getLookupTableFactory(t => {
+  t[0x2013] = 0xfe32;
+  t[0x2014] = 0xfe31;
+  t[0x2025] = 0xfe30;
+  t[0x2026] = 0xfe19;
+  t[0x3001] = 0xfe11;
+  t[0x3002] = 0xfe12;
+  t[0x3008] = 0xfe3f;
+  t[0x3009] = 0xfe40;
+  t[0x300a] = 0xfe3d;
+  t[0x300b] = 0xfe3e;
+  t[0x300c] = 0xfe41;
+  t[0x300d] = 0xfe42;
+  t[0x300e] = 0xfe43;
+  t[0x300f] = 0xfe44;
+  t[0x3010] = 0xfe3b;
+  t[0x3011] = 0xfe3c;
+  t[0x3014] = 0xfe39;
+  t[0x3015] = 0xfe3a;
+  t[0x3016] = 0xfe17;
+  t[0x3017] = 0xfe18;
+  t[0xfe4f] = 0xfe34;
+  t[0xff01] = 0xfe15;
+  t[0xff08] = 0xfe35;
+  t[0xff09] = 0xfe36;
+  t[0xff0c] = 0xfe10;
+  t[0xff1a] = 0xfe13;
+  t[0xff1b] = 0xfe14;
+  t[0xff1f] = 0xfe16;
+  t[0xff3b] = 0xfe47;
+  t[0xff3d] = 0xfe48;
+  t[0xff3f] = 0xfe33;
+  t[0xff5b] = 0xfe37;
+  t[0xff5d] = 0xfe38;
+});
+const MAX_SIZE_TO_COMPILE = 1000;
+function compileType3Glyph({
+  data: img,
+  width,
+  height
+}) {
+  if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) {
+    return null;
+  }
+  const POINT_TO_PROCESS_LIMIT = 1000;
+  const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
+  const width1 = width + 1;
+  const points = new Uint8Array(width1 * (height + 1));
+  let i, j, j0;
+  const lineSize = width + 7 & ~7;
+  const data = new Uint8Array(lineSize * height);
+  let pos = 0;
+  for (const elem of img) {
+    let mask = 128;
+    while (mask > 0) {
+      data[pos++] = elem & mask ? 0 : 255;
+      mask >>= 1;
+    }
+  }
+  let count = 0;
+  pos = 0;
+  if (data[pos] !== 0) {
+    points[0] = 1;
+    ++count;
+  }
+  for (j = 1; j < width; j++) {
+    if (data[pos] !== data[pos + 1]) {
+      points[j] = data[pos] ? 2 : 1;
+      ++count;
+    }
+    pos++;
+  }
+  if (data[pos] !== 0) {
+    points[j] = 2;
+    ++count;
+  }
+  for (i = 1; i < height; i++) {
+    pos = i * lineSize;
+    j0 = i * width1;
+    if (data[pos - lineSize] !== data[pos]) {
+      points[j0] = data[pos] ? 1 : 8;
+      ++count;
+    }
+    let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
+    for (j = 1; j < width; j++) {
+      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0);
+      if (POINT_TYPES[sum]) {
+        points[j0 + j] = POINT_TYPES[sum];
+        ++count;
+      }
+      pos++;
+    }
+    if (data[pos - lineSize] !== data[pos]) {
+      points[j0 + j] = data[pos] ? 2 : 4;
+      ++count;
+    }
+    if (count > POINT_TO_PROCESS_LIMIT) {
+      return null;
+    }
+  }
+  pos = lineSize * (height - 1);
+  j0 = i * width1;
+  if (data[pos] !== 0) {
+    points[j0] = 8;
+    ++count;
+  }
+  for (j = 1; j < width; j++) {
+    if (data[pos] !== data[pos + 1]) {
+      points[j0 + j] = data[pos] ? 4 : 8;
+      ++count;
+    }
+    pos++;
+  }
+  if (data[pos] !== 0) {
+    points[j0 + j] = 4;
+    ++count;
+  }
+  if (count > POINT_TO_PROCESS_LIMIT) {
+    return null;
+  }
+  const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
+  const pathBuf = [];
+  const {
+    a,
+    b,
+    c,
+    d,
+    e,
+    f
+  } = new DOMMatrix().scaleSelf(1 / width, -1 / height).translateSelf(0, -height);
+  for (i = 0; count && i <= height; i++) {
+    let p = i * width1;
+    const end = p + width;
+    while (p < end && !points[p]) {
+      p++;
+    }
+    if (p === end) {
+      continue;
+    }
+    let x = p % width1;
+    let y = i;
+    pathBuf.push(DrawOPS.moveTo, a * x + c * y + e, b * x + d * y + f);
+    const p0 = p;
+    let type = points[p];
+    do {
+      const step = steps[type];
+      do {
+        p += step;
+      } while (!points[p]);
+      const pp = points[p];
+      if (pp !== 5 && pp !== 10) {
+        type = pp;
+        points[p] = 0;
+      } else {
+        type = pp & 0x33 * type >> 4;
+        points[p] &= type >> 2 | type << 2;
+      }
+      x = p % width1;
+      y = p / width1 | 0;
+      pathBuf.push(DrawOPS.lineTo, a * x + c * y + e, b * x + d * y + f);
+      if (!points[p]) {
+        --count;
+      }
+    } while (p0 !== p);
+    --i;
+  }
+  return [OPS.rawFillPath, [new Float32Array(pathBuf)], new Float32Array([0, 0, width, height])];
+}
+
+;// ./src/core/charsets.js
+const ISOAdobeCharset = [".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"];
+const ExpertCharset = [".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"];
+const ExpertSubsetCharset = [".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"];
+
+;// ./src/core/data_builder.js
+
+
+class DataBuilder {
+  #buf;
+  #bufLength = 1024;
+  #hasExactLength = false;
+  #pos = 0;
+  #view;
+  constructor({
+    exactLength = 0,
+    minLength = 0
+  }) {
+    this.#hasExactLength = !!exactLength;
+    this.#initBuf(exactLength || minLength);
+  }
+  #initBuf(minLength) {
+    if (this.#hasExactLength) {
+      this.#bufLength = minLength;
+    } else {
+      while (this.#bufLength < minLength) {
+        this.#bufLength *= 2;
+      }
+    }
+    const newBuf = new Uint8Array(this.#bufLength);
+    if (this.#buf) {
+      newBuf.set(this.#buf, 0);
+    }
+    this.#buf = newBuf;
+    this.#view = new DataView(newBuf.buffer);
+  }
+  get data() {
+    return this.#buf.subarray(0, this.#pos);
+  }
+  get length() {
+    return this.#pos;
+  }
+  skip(n) {
+    this.#pos += n;
+  }
+  setArray(arr) {
+    const newPos = this.#pos + arr.length;
+    if (!this.#hasExactLength && newPos > this.#bufLength) {
+      this.#initBuf(newPos);
+    }
+    this.#buf.set(arr, this.#pos);
+    this.#pos = newPos;
+  }
+  setInt16(val) {
+    const newPos = this.#pos + 2;
+    if (!this.#hasExactLength && newPos > this.#bufLength) {
+      this.#initBuf(newPos);
+    }
+    this.#view.setInt16(this.#pos, val);
+    this.#pos = newPos;
+  }
+  setSafeInt16(val) {
+    const newPos = this.#pos + 2;
+    if (!this.#hasExactLength && newPos > this.#bufLength) {
+      this.#initBuf(newPos);
+    }
+    this.#view.setInt16(this.#pos, MathClamp(val, -0x8000, 0x7fff));
+    this.#pos = newPos;
+  }
+  setInt32(val) {
+    const newPos = this.#pos + 4;
+    if (!this.#hasExactLength && newPos > this.#bufLength) {
+      this.#initBuf(newPos);
+    }
+    this.#view.setInt32(this.#pos, val);
+    this.#pos = newPos;
+  }
+}
+
+;// ./src/core/cff_parser.js
+
+
+
+
+
+const MAX_SUBR_NESTING = 10;
+function looksLikeUnsigned16BitNegative(coord) {
+  return coord > 0x7fff && coord <= 0xffff;
+}
+function recoverSigned16BitBBox(bbox, onlyLowerLeft = false) {
+  return Util.normalizeRect(bbox.map((coord, i) => (!onlyLowerLeft || i < 2) && looksLikeUnsigned16BitNegative(coord) ? coord - 0x10000 : coord));
+}
+const CFFStandardStrings = [".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"];
+const NUM_STANDARD_CFF_STRINGS = 391;
+const DEFAULT_BLUE_SCALE = 0.039625;
+const DEFAULT_BLUE_SHIFT = 7;
+const DEFAULT_BLUE_FUZZ = 1;
+const DEFAULT_EXPANSION_FACTOR = 0.06;
+const CharstringValidationData = [null, {
+  id: "hstem",
+  min: 2,
+  stackClearing: true,
+  stem: true
+}, null, {
+  id: "vstem",
+  min: 2,
+  stackClearing: true,
+  stem: true
+}, {
+  id: "vmoveto",
+  min: 1,
+  stackClearing: true
+}, {
+  id: "rlineto",
+  min: 2,
+  resetStack: true
+}, {
+  id: "hlineto",
+  min: 1,
+  resetStack: true
+}, {
+  id: "vlineto",
+  min: 1,
+  resetStack: true
+}, {
+  id: "rrcurveto",
+  min: 6,
+  resetStack: true
+}, null, {
+  id: "callsubr",
+  min: 1
+}, {
+  id: "return",
+  min: 0
+}, null, null, {
+  id: "endchar",
+  min: 0,
+  stackClearing: true
+}, null, null, null, {
+  id: "hstemhm",
+  min: 2,
+  stackClearing: true,
+  stem: true
+}, {
+  id: "hintmask",
+  min: 0,
+  stackClearing: true
+}, {
+  id: "cntrmask",
+  min: 0,
+  stackClearing: true
+}, {
+  id: "rmoveto",
+  min: 2,
+  stackClearing: true
+}, {
+  id: "hmoveto",
+  min: 1,
+  stackClearing: true
+}, {
+  id: "vstemhm",
+  min: 2,
+  stackClearing: true,
+  stem: true
+}, {
+  id: "rcurveline",
+  min: 8,
+  resetStack: true
+}, {
+  id: "rlinecurve",
+  min: 8,
+  resetStack: true
+}, {
+  id: "vvcurveto",
+  min: 4,
+  resetStack: true
+}, {
+  id: "hhcurveto",
+  min: 4,
+  resetStack: true
+}, null, {
+  id: "callgsubr",
+  min: 1
+}, {
+  id: "vhcurveto",
+  min: 4,
+  resetStack: true
+}, {
+  id: "hvcurveto",
+  min: 4,
+  resetStack: true
+}];
+const CharstringValidationData12 = [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(stack, index) {
+    stack[index - 2] = stack[index - 2] + stack[index - 1];
+  }
+}, {
+  id: "sub",
+  min: 2,
+  stackDelta: -1,
+  stackFn(stack, index) {
+    stack[index - 2] = stack[index - 2] - stack[index - 1];
+  }
+}, {
+  id: "div",
+  min: 2,
+  stackDelta: -1,
+  stackFn(stack, index) {
+    stack[index - 2] = stack[index - 2] / stack[index - 1];
+  }
+}, null, {
+  id: "neg",
+  min: 1,
+  stackDelta: 0,
+  stackFn(stack, index) {
+    stack[index - 1] = -stack[index - 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(stack, index) {
+    stack[index - 2] = stack[index - 2] * stack[index - 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: true
+}, {
+  id: "flex",
+  min: 13,
+  resetStack: true
+}, {
+  id: "hflex1",
+  min: 9,
+  resetStack: true
+}, {
+  id: "flex1",
+  min: 11,
+  resetStack: true
+}];
+class CFFParser {
+  constructor(file, properties, seacAnalysisEnabled) {
+    this.bytes = file.getBytes();
+    this.properties = properties;
+    this.seacAnalysisEnabled = !!seacAnalysisEnabled;
+  }
+  parse() {
+    const properties = this.properties;
+    const cff = new CFF(this.bytes.length);
+    this.cff = cff;
+    const header = this.parseHeader();
+    const nameIndex = this.parseIndex(header.endPos);
+    const topDictIndex = this.parseIndex(nameIndex.endPos);
+    const stringIndex = this.parseIndex(topDictIndex.endPos);
+    const globalSubrIndex = this.parseIndex(stringIndex.endPos);
+    const topDictParsed = this.parseDict(topDictIndex.obj.get(0));
+    const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
+    cff.header = header.obj;
+    cff.names = this.parseNameIndex(nameIndex.obj);
+    cff.strings = this.parseStringIndex(stringIndex.obj);
+    cff.topDict = topDict;
+    cff.globalSubrIndex = globalSubrIndex.obj;
+    this.parsePrivateDict(cff.topDict);
+    cff.isCIDFont = topDict.hasName("ROS");
+    const charStringOffset = topDict.getByName("CharStrings");
+    const charStringIndex = this.parseIndex(charStringOffset).obj;
+    cff.charStringCount = charStringIndex.count;
+    const fontMatrix = topDict.getByName("FontMatrix");
+    if (fontMatrix) {
+      properties.fontMatrix = fontMatrix;
+    }
+    let fontBBox = topDict.getByName("FontBBox");
+    const descriptorBBox = properties.bbox?.some(coord => coord !== 0) ? recoverSigned16BitBBox(properties.bbox) : null;
+    const cffBBoxHasUnsignedLowerLeft = fontBBox?.slice(0, 2).some(looksLikeUnsigned16BitNegative);
+    const cffBBoxHasUnsignedCoords = fontBBox?.some(looksLikeUnsigned16BitNegative);
+    if (fontBBox?.every(coord => coord === 0) && descriptorBBox) {
+      fontBBox = descriptorBBox;
+      topDict.setByName("FontBBox", fontBBox);
+    } else if (cffBBoxHasUnsignedCoords) {
+      const recoveredFontBBox = recoverSigned16BitBBox(fontBBox);
+      const descriptorCorroborates = descriptorBBox && properties.bbox.some(coord => coord < 0) && !properties.bbox.some(looksLikeUnsigned16BitNegative) && isArrayEqual(recoveredFontBBox, descriptorBBox);
+      if (descriptorCorroborates || cffBBoxHasUnsignedLowerLeft) {
+        fontBBox = descriptorCorroborates ? recoveredFontBBox : recoverSigned16BitBBox(fontBBox, true);
+        topDict.setByName("FontBBox", fontBBox);
+      }
+    }
+    if (fontBBox?.some(coord => coord !== 0)) {
+      properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
+      properties.descent = Math.min(fontBBox[1], fontBBox[3]);
+      properties.ascentScaled = true;
+    }
+    let charset, encoding;
+    if (cff.isCIDFont) {
+      const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj;
+      for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
+        const dictRaw = fdArrayIndex.get(i);
+        const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);
+        this.parsePrivateDict(fontDict);
+        cff.fdArray.push(fontDict);
+      }
+      encoding = null;
+      charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true);
+      cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count);
+    } else {
+      charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false);
+      encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset);
+    }
+    cff.charset = charset;
+    cff.encoding = encoding;
+    const charStringsAndSeacs = this.parseCharStrings({
+      charStrings: charStringIndex,
+      localSubrIndex: topDict.privateDict.subrsIndex,
+      globalSubrIndex: globalSubrIndex.obj,
+      fdSelect: cff.fdSelect,
+      fdArray: cff.fdArray,
+      privateDict: topDict.privateDict
+    });
+    cff.charStrings = charStringsAndSeacs.charStrings;
+    cff.seacs = charStringsAndSeacs.seacs;
+    cff.widths = charStringsAndSeacs.widths;
+    return cff;
+  }
+  parseHeader() {
+    let bytes = this.bytes;
+    const bytesLength = bytes.length;
+    let offset = 0;
+    while (offset < bytesLength && bytes[offset] !== 1) {
+      ++offset;
+    }
+    if (offset >= bytesLength) {
+      throw new FormatError("Invalid CFF header");
+    }
+    if (offset !== 0) {
+      info("cff data is shifted");
+      bytes = bytes.subarray(offset);
+      this.bytes = bytes;
+    }
+    const major = bytes[0];
+    const minor = bytes[1];
+    const hdrSize = bytes[2];
+    const offSize = bytes[3];
+    const header = new CFFHeader(major, minor, hdrSize, offSize);
+    return {
+      obj: header,
+      endPos: hdrSize
+    };
+  }
+  parseDict(dict) {
+    const view = new DataView(dict.buffer, dict.byteOffset, dict.bytesLength);
+    let pos = 0;
+    function parseOperand() {
+      let value = dict[pos++];
+      if (value === 30) {
+        return parseFloatOperand();
+      } else if (value === 28) {
+        value = view.getInt16(pos);
+        pos += 2;
+        return value;
+      } else if (value === 29) {
+        value = view.getInt32(pos);
+        pos += 4;
+        return value;
+      } else if (value >= 32 && value <= 246) {
+        return value - 139;
+      } else if (value >= 247 && value <= 250) {
+        return (value - 247) * 256 + dict[pos++] + 108;
+      } else if (value >= 251 && value <= 254) {
+        return -((value - 251) * 256) - dict[pos++] - 108;
+      }
+      warn(`CFFParser.parseDict: "${value}" is a reserved command.`);
+      return NaN;
+    }
+    function parseFloatOperand() {
+      let str = "";
+      const eof = 15;
+      const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"];
+      const length = dict.length;
+      while (pos < length) {
+        const b = dict[pos++];
+        const b1 = b >> 4;
+        const b2 = b & 15;
+        if (b1 === eof) {
+          break;
+        }
+        str += lookup[b1];
+        if (b2 === eof) {
+          break;
+        }
+        str += lookup[b2];
+      }
+      return parseFloat(str);
+    }
+    let operands = [];
+    const entries = [];
+    pos = 0;
+    const end = dict.length;
+    while (pos < end) {
+      let b = dict[pos];
+      if (b <= 21) {
+        if (b === 12) {
+          b = b << 8 | dict[++pos];
+        }
+        entries.push([b, operands]);
+        operands = [];
+        ++pos;
+      } else {
+        operands.push(parseOperand());
+      }
+    }
+    return entries;
+  }
+  parseIndex(pos) {
+    const cffIndex = new CFFIndex();
+    const bytes = this.bytes;
+    const count = bytes[pos++] << 8 | bytes[pos++];
+    const offsets = [];
+    let end = pos;
+    let i, ii;
+    if (count !== 0) {
+      const offsetSize = bytes[pos++];
+      const startPos = pos + (count + 1) * offsetSize - 1;
+      for (i = 0, ii = count + 1; i < ii; ++i) {
+        let offset = 0;
+        for (let j = 0; j < offsetSize; ++j) {
+          offset <<= 8;
+          offset += bytes[pos++];
+        }
+        offsets.push(startPos + offset);
+      }
+      end = offsets[count];
+    }
+    for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
+      const offsetStart = offsets[i];
+      const offsetEnd = offsets[i + 1];
+      cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
+    }
+    return {
+      obj: cffIndex,
+      endPos: end
+    };
+  }
+  parseNameIndex(index) {
+    const names = [];
+    for (let i = 0, ii = index.count; i < ii; ++i) {
+      const name = index.get(i);
+      names.push(bytesToString(name));
+    }
+    return names;
+  }
+  parseStringIndex(index) {
+    const strings = new CFFStrings();
+    for (let i = 0, ii = index.count; i < ii; ++i) {
+      const data = index.get(i);
+      strings.add(bytesToString(data));
+    }
+    return strings;
+  }
+  createDict(Type, dict, strings) {
+    const cffDict = new Type(strings);
+    for (const [key, value] of dict) {
+      cffDict.setByKey(key, value);
+    }
+    return cffDict;
+  }
+  parseCharString(state, data, localSubrIndex, globalSubrIndex) {
+    if (!data || state.callDepth > MAX_SUBR_NESTING) {
+      return false;
+    }
+    const view = new DataView(data.buffer, data.byteOffset, data.bytesLength);
+    let stackSize = state.stackSize;
+    const stack = state.stack;
+    let length = data.length;
+    for (let j = 0; j < length;) {
+      const value = data[j++];
+      let validationCommand = null;
+      if (value === 12) {
+        const q = data[j++];
+        if (q === 0) {
+          data[j - 2] = 139;
+          data[j - 1] = 22;
+          stackSize = 0;
+        } else {
+          validationCommand = CharstringValidationData12[q];
+        }
+      } else if (value === 28) {
+        stack[stackSize] = view.getInt16(j);
+        j += 2;
+        stackSize++;
+      } else if (value === 14) {
+        if (stackSize >= 4) {
+          stackSize -= 4;
+          if (this.seacAnalysisEnabled) {
+            state.seac = stack.slice(stackSize, stackSize + 4);
+            return false;
+          }
+        }
+        validationCommand = CharstringValidationData[value];
+      } else if (value >= 32 && value <= 246) {
+        stack[stackSize] = value - 139;
+        stackSize++;
+      } else if (value >= 247 && value <= 254) {
+        stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108;
+        j++;
+        stackSize++;
+      } else if (value === 255) {
+        stack[stackSize] = view.getInt32(j) / 65536;
+        j += 4;
+        stackSize++;
+      } else if (value === 19 || value === 20) {
+        state.hints += stackSize >> 1;
+        if (state.hints === 0) {
+          data.copyWithin(j - 1, j, -1);
+          j -= 1;
+          length -= 1;
+          continue;
+        }
+        j += state.hints + 7 >> 3;
+        stackSize %= 2;
+        validationCommand = CharstringValidationData[value];
+      } else if (value === 10 || value === 29) {
+        const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex;
+        if (!subrsIndex) {
+          validationCommand = CharstringValidationData[value];
+          warn("Missing subrsIndex for " + validationCommand.id);
+          return false;
+        }
+        let bias = 32768;
+        if (subrsIndex.count < 1240) {
+          bias = 107;
+        } else if (subrsIndex.count < 33900) {
+          bias = 1131;
+        }
+        const subrNumber = stack[--stackSize] + bias;
+        if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {
+          validationCommand = CharstringValidationData[value];
+          warn("Out of bounds subrIndex for " + validationCommand.id);
+          return false;
+        }
+        state.stackSize = stackSize;
+        state.callDepth++;
+        const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex);
+        if (!valid) {
+          return false;
+        }
+        state.callDepth--;
+        stackSize = state.stackSize;
+        continue;
+      } else if (value === 11) {
+        state.stackSize = stackSize;
+        return true;
+      } else if (value === 0 && j === data.length) {
+        data[j - 1] = 14;
+        validationCommand = CharstringValidationData[14];
+      } else if (value === 9) {
+        data.copyWithin(j - 1, j, -1);
+        j -= 1;
+        length -= 1;
+        continue;
+      } else {
+        validationCommand = CharstringValidationData[value];
+      }
+      if (validationCommand) {
+        if (validationCommand.stem) {
+          state.hints += stackSize >> 1;
+          if (value === 3 || value === 23) {
+            state.hasVStems = true;
+          } else if (state.hasVStems && (value === 1 || value === 18)) {
+            warn("CFF stem hints are in wrong order");
+            data[j - 1] = value === 1 ? 3 : 23;
+          }
+        }
+        if (stackSize < validationCommand.min) {
+          warn("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min);
+          if (stackSize === 0) {
+            data[j - 1] = 14;
+            return true;
+          }
+          return false;
+        }
+        if (state.firstStackClearing && validationCommand.stackClearing) {
+          state.firstStackClearing = false;
+          stackSize -= validationCommand.min;
+          if (stackSize >= 2 && validationCommand.stem) {
+            stackSize %= 2;
+          } else if (stackSize > 1) {
+            warn("Found too many parameters for stack-clearing command");
+          }
+          if (stackSize > 0) {
+            state.width = stack[stackSize - 1];
+          }
+        }
+        if ("stackDelta" in validationCommand) {
+          if ("stackFn" in validationCommand) {
+            validationCommand.stackFn(stack, stackSize);
+          }
+          stackSize += validationCommand.stackDelta;
+        } else if (validationCommand.stackClearing || validationCommand.resetStack) {
+          stackSize = 0;
+        }
+      }
+    }
+    if (length < data.length) {
+      data.fill(14, length);
+    }
+    state.stackSize = stackSize;
+    return true;
+  }
+  parseCharStrings({
+    charStrings,
+    localSubrIndex,
+    globalSubrIndex,
+    fdSelect,
+    fdArray,
+    privateDict
+  }) {
+    const seacs = [];
+    const widths = [];
+    const count = charStrings.count;
+    for (let i = 0; i < count; i++) {
+      const charstring = charStrings.get(i);
+      const state = {
+        callDepth: 0,
+        stackSize: 0,
+        stack: [],
+        hints: 0,
+        firstStackClearing: true,
+        seac: null,
+        width: null,
+        hasVStems: false
+      };
+      let valid = true;
+      let localSubrToUse = null;
+      let privateDictToUse = privateDict;
+      if (fdSelect && fdArray.length) {
+        const fdIndex = fdSelect.getFDIndex(i);
+        if (fdIndex === -1) {
+          warn("Glyph index is not in fd select.");
+          valid = false;
+        }
+        if (fdIndex >= fdArray.length) {
+          warn("Invalid fd index for glyph index.");
+          valid = false;
+        }
+        if (valid) {
+          privateDictToUse = fdArray[fdIndex].privateDict;
+          localSubrToUse = privateDictToUse.subrsIndex;
+        }
+      } else if (localSubrIndex) {
+        localSubrToUse = localSubrIndex;
+      }
+      if (valid) {
+        valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);
+      }
+      if (state.width !== null) {
+        const nominalWidth = privateDictToUse.getByName("nominalWidthX");
+        widths[i] = nominalWidth + state.width;
+      } else {
+        const defaultWidth = privateDictToUse.getByName("defaultWidthX");
+        widths[i] = defaultWidth;
+      }
+      if (state.seac !== null) {
+        seacs[i] = state.seac;
+      }
+      if (!valid) {
+        charStrings.set(i, new Uint8Array([14]));
+      }
+    }
+    return {
+      charStrings,
+      seacs,
+      widths
+    };
+  }
+  emptyPrivateDictionary(parentDict) {
+    const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);
+    parentDict.setByKey(18, [0, 0]);
+    parentDict.privateDict = privateDict;
+  }
+  parsePrivateDict(parentDict) {
+    if (!parentDict.hasName("Private")) {
+      this.emptyPrivateDictionary(parentDict);
+      return;
+    }
+    const privateOffset = parentDict.getByName("Private");
+    if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {
+      parentDict.removeByName("Private");
+      return;
+    }
+    const size = privateOffset[0];
+    const offset = privateOffset[1];
+    if (size === 0 || offset >= this.bytes.length) {
+      this.emptyPrivateDictionary(parentDict);
+      return;
+    }
+    if (offset + size > this.bytes.length) {
+      throw new FormatError("CFF Private DICT extends past end of font");
+    }
+    const privateDictEnd = offset + size;
+    const dictData = this.bytes.subarray(offset, privateDictEnd);
+    const dict = this.parseDict(dictData);
+    const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);
+    parentDict.privateDict = privateDict;
+    const blueScale = privateDict.getByName("BlueScale");
+    const blueShift = privateDict.getByName("BlueShift");
+    const blueFuzz = privateDict.getByName("BlueFuzz");
+    const expansionFactor = privateDict.getByName("ExpansionFactor");
+    if (blueScale === 0 && blueShift === 0 && blueFuzz === 0 && expansionFactor === 0) {
+      privateDict.setByName("BlueScale", DEFAULT_BLUE_SCALE);
+      privateDict.setByName("BlueShift", DEFAULT_BLUE_SHIFT);
+      privateDict.setByName("BlueFuzz", DEFAULT_BLUE_FUZZ);
+    }
+    if (expansionFactor === 0) {
+      privateDict.setByName("ExpansionFactor", DEFAULT_EXPANSION_FACTOR);
+    }
+    if (blueScale > 0) {
+      let maxZoneHeight = 0;
+      for (const zones of [privateDict.getByName("BlueValues"), privateDict.getByName("OtherBlues")]) {
+        if (!zones) {
+          continue;
+        }
+        for (let i = 1; i < zones.length; i += 2) {
+          if (zones[i] > maxZoneHeight) {
+            maxZoneHeight = zones[i];
+          }
+        }
+      }
+      if (maxZoneHeight > 0) {
+        const PRECISION = 1e5;
+        const lowerBound = 0.5 / maxZoneHeight;
+        const minBlueScale = lowerBound <= DEFAULT_BLUE_SCALE ? Math.ceil(lowerBound * PRECISION) / PRECISION : -Infinity;
+        const maxBlueScale = Math.floor(PRECISION / maxZoneHeight) / PRECISION;
+        const clamped = MathClamp(blueScale, minBlueScale, maxBlueScale);
+        if (clamped !== blueScale) {
+          privateDict.setByName("BlueScale", clamped);
+        }
+      }
+    }
+    if (!privateDict.getByName("Subrs")) {
+      return;
+    }
+    const subrsOffset = privateDict.getByName("Subrs");
+    const relativeOffset = offset + subrsOffset;
+    if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
+      this.emptyPrivateDictionary(parentDict);
+      return;
+    }
+    const subrsIndex = this.parseIndex(relativeOffset);
+    privateDict.subrsIndex = subrsIndex.obj;
+  }
+  parseCharsets(pos, length, strings, cid) {
+    if (pos === 0) {
+      return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset);
+    } else if (pos === 1) {
+      return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset);
+    } else if (pos === 2) {
+      return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset);
+    }
+    const {
+      bytes
+    } = this;
+    const format = bytes[pos++];
+    const charset = [cid ? 0 : ".notdef"];
+    let id, count, i;
+    length -= 1;
+    switch (format) {
+      case 0:
+        for (i = 0; i < length; i++) {
+          id = bytes[pos++] << 8 | bytes[pos++];
+          charset.push(cid ? id : strings.get(id));
+        }
+        break;
+      case 1:
+        while (charset.length <= length) {
+          id = bytes[pos++] << 8 | bytes[pos++];
+          count = bytes[pos++];
+          for (i = 0; i <= count; i++) {
+            charset.push(cid ? id++ : strings.get(id++));
+          }
+        }
+        break;
+      case 2:
+        while (charset.length <= length) {
+          id = bytes[pos++] << 8 | bytes[pos++];
+          count = bytes[pos++] << 8 | bytes[pos++];
+          for (i = 0; i <= count; i++) {
+            charset.push(cid ? id++ : strings.get(id++));
+          }
+        }
+        break;
+      default:
+        throw new FormatError("Unknown charset format");
+    }
+    return new CFFCharset(false, format, charset);
+  }
+  parseEncoding(pos, properties, strings, charset) {
+    const encoding = Object.create(null);
+    const bytes = this.bytes;
+    let predefined = false;
+    let format, i, ii;
+    let raw = null;
+    function readSupplement() {
+      const supplementsCount = bytes[pos++];
+      for (i = 0; i < supplementsCount; i++) {
+        const code = bytes[pos++];
+        const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
+        encoding[code] = charset.indexOf(strings.get(sid));
+      }
+    }
+    if (pos === 0 || pos === 1) {
+      predefined = true;
+      format = pos;
+      const baseEncoding = pos ? ExpertEncoding : StandardEncoding;
+      for (i = 0, ii = charset.length; i < ii; i++) {
+        const index = baseEncoding.indexOf(charset[i]);
+        if (index !== -1) {
+          encoding[index] = i;
+        }
+      }
+    } else {
+      const dataStart = pos;
+      format = bytes[pos++];
+      switch (format & 0x7f) {
+        case 0:
+          const glyphsCount = bytes[pos++];
+          for (i = 1; i <= glyphsCount; i++) {
+            encoding[bytes[pos++]] = i;
+          }
+          break;
+        case 1:
+          const rangesCount = bytes[pos++];
+          let gid = 1;
+          for (i = 0; i < rangesCount; i++) {
+            const start = bytes[pos++];
+            const left = bytes[pos++];
+            for (let j = start; j <= start + left; j++) {
+              encoding[j] = gid++;
+            }
+          }
+          break;
+        default:
+          throw new FormatError(`Unknown encoding format: ${format} in CFF`);
+      }
+      const dataEnd = pos;
+      if (format & 0x80) {
+        bytes[dataStart] &= 0x7f;
+        readSupplement();
+      }
+      raw = bytes.subarray(dataStart, dataEnd);
+    }
+    format &= 0x7f;
+    return new CFFEncoding(predefined, format, encoding, raw);
+  }
+  parseFDSelect(pos, length) {
+    const bytes = this.bytes;
+    const format = bytes[pos++];
+    const fdSelect = [];
+    let i;
+    switch (format) {
+      case 0:
+        for (i = 0; i < length; ++i) {
+          const id = bytes[pos++];
+          fdSelect.push(id);
+        }
+        break;
+      case 3:
+        const rangesCount = bytes[pos++] << 8 | bytes[pos++];
+        for (i = 0; i < rangesCount; ++i) {
+          let first = bytes[pos++] << 8 | bytes[pos++];
+          if (i === 0 && first !== 0) {
+            warn("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover.");
+            first = 0;
+          }
+          const fdIndex = bytes[pos++];
+          const next = bytes[pos] << 8 | bytes[pos + 1];
+          for (let j = first; j < next; ++j) {
+            fdSelect.push(fdIndex);
+          }
+        }
+        pos += 2;
+        break;
+      default:
+        throw new FormatError(`parseFDSelect: Unknown format "${format}".`);
+    }
+    if (fdSelect.length !== length) {
+      throw new FormatError("parseFDSelect: Invalid font data.");
+    }
+    return new CFFFDSelect(format, fdSelect);
+  }
+}
+class CFF {
+  header = null;
+  names = [];
+  topDict = null;
+  strings = new CFFStrings();
+  globalSubrIndex = null;
+  encoding = null;
+  charset = null;
+  charStrings = null;
+  fdArray = [];
+  fdSelect = null;
+  isCIDFont = false;
+  charStringCount = 0;
+  constructor(rawFileLength = 0) {
+    this.rawFileLength = rawFileLength;
+  }
+  duplicateFirstGlyph() {
+    if (this.charStrings.count >= 65535) {
+      warn("Not enough space in charstrings to duplicate first glyph.");
+      return;
+    }
+    const glyphZero = this.charStrings.get(0);
+    this.charStrings.add(glyphZero);
+    if (this.isCIDFont) {
+      this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
+    }
+  }
+  hasGlyphId(id) {
+    if (id < 0 || id >= this.charStrings.count) {
+      return false;
+    }
+    const glyph = this.charStrings.get(id);
+    return glyph.length > 0;
+  }
+}
+class CFFHeader {
+  constructor(major, minor, hdrSize, offSize) {
+    this.major = major;
+    this.minor = minor;
+    this.hdrSize = hdrSize;
+    this.offSize = offSize;
+  }
+}
+class CFFStrings {
+  strings = [];
+  get(index) {
+    if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) {
+      return CFFStandardStrings[index];
+    }
+    if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) {
+      return this.strings[index - NUM_STANDARD_CFF_STRINGS];
+    }
+    return CFFStandardStrings[0];
+  }
+  getSID(str) {
+    let index = CFFStandardStrings.indexOf(str);
+    if (index !== -1) {
+      return index;
+    }
+    index = this.strings.indexOf(str);
+    if (index !== -1) {
+      return index + NUM_STANDARD_CFF_STRINGS;
+    }
+    return -1;
+  }
+  add(value) {
+    this.strings.push(value);
+  }
+  get count() {
+    return this.strings.length;
+  }
+}
+class CFFIndex {
+  objects = [];
+  length = 0;
+  add(data) {
+    this.length += data.length;
+    this.objects.push(data);
+  }
+  set(index, data) {
+    this.length += data.length - this.objects[index].length;
+    this.objects[index] = data;
+  }
+  get(index) {
+    return this.objects[index];
+  }
+  get count() {
+    return this.objects.length;
+  }
+}
+class CFFDict {
+  constructor(tables, strings) {
+    this.keyToNameMap = tables.keyToNameMap;
+    this.nameToKeyMap = tables.nameToKeyMap;
+    this.defaults = tables.defaults;
+    this.types = tables.types;
+    this.opcodes = tables.opcodes;
+    this.order = tables.order;
+    this.strings = strings;
+    this.values = Object.create(null);
+  }
+  setByKey(key, value) {
+    if (!(key in this.keyToNameMap)) {
+      return false;
+    }
+    if (value.length === 0) {
+      return true;
+    }
+    for (const val of value) {
+      if (isNaN(val)) {
+        warn(`Invalid CFFDict value: "${value}" for key "${key}".`);
+        return true;
+      }
+    }
+    const type = this.types[key];
+    if (type === "num" || type === "sid" || type === "offset") {
+      value = value[0];
+    }
+    this.values[key] = value;
+    return true;
+  }
+  setByName(name, value) {
+    if (!(name in this.nameToKeyMap)) {
+      throw new FormatError(`Invalid dictionary name "${name}"`);
+    }
+    this.values[this.nameToKeyMap[name]] = value;
+  }
+  hasName(name) {
+    return this.nameToKeyMap[name] in this.values;
+  }
+  getByName(name) {
+    if (!(name in this.nameToKeyMap)) {
+      throw new FormatError(`Invalid dictionary name ${name}"`);
+    }
+    const key = this.nameToKeyMap[name];
+    if (!(key in this.values)) {
+      return this.defaults[key];
+    }
+    return this.values[key];
+  }
+  removeByName(name) {
+    delete this.values[this.nameToKeyMap[name]];
+  }
+  static createTables(layout) {
+    const tables = {
+      keyToNameMap: {},
+      nameToKeyMap: {},
+      defaults: {},
+      types: {},
+      opcodes: {},
+      order: []
+    };
+    for (const entry of layout) {
+      const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
+      tables.keyToNameMap[key] = entry[1];
+      tables.nameToKeyMap[entry[1]] = key;
+      tables.types[key] = entry[2];
+      tables.defaults[key] = entry[3];
+      tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];
+      tables.order.push(key);
+    }
+    return tables;
+  }
+}
+const CFFTopDictLayout = [[[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"], [0.001, 0, 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(CFFTopDictLayout));
+  }
+  constructor(strings) {
+    super(CFFTopDict.tables, strings);
+    this.privateDict = null;
+  }
+}
+const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", DEFAULT_BLUE_SCALE], [[12, 10], "BlueShift", "num", DEFAULT_BLUE_SHIFT], [[12, 11], "BlueFuzz", "num", DEFAULT_BLUE_FUZZ], [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", DEFAULT_EXPANSION_FACTOR], [[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(CFFPrivateDictLayout));
+  }
+  constructor(strings) {
+    super(CFFPrivateDict.tables, strings);
+    this.subrsIndex = null;
+  }
+}
+const CFFCharsetPredefinedTypes = {
+  ISO_ADOBE: 0,
+  EXPERT: 1,
+  EXPERT_SUBSET: 2
+};
+class CFFCharset {
+  constructor(predefined, format, charset) {
+    this.predefined = predefined;
+    this.format = format;
+    this.charset = charset;
+  }
+}
+class CFFEncoding {
+  constructor(predefined, format, encoding, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.encoding = encoding;
+    this.raw = raw;
+  }
+}
+class CFFFDSelect {
+  constructor(format, fdSelect) {
+    this.format = format;
+    this.fdSelect = fdSelect;
+  }
+  getFDIndex(glyphIndex) {
+    if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
+      return -1;
+    }
+    return this.fdSelect[glyphIndex];
+  }
+}
+class CFFOffsetTracker {
+  offsets = Object.create(null);
+  isTracking(key) {
+    return key in this.offsets;
+  }
+  track(key, location) {
+    if (key in this.offsets) {
+      throw new FormatError(`Already tracking location of ${key}`);
+    }
+    this.offsets[key] = location;
+  }
+  offset(value) {
+    for (const key in this.offsets) {
+      this.offsets[key] += value;
+    }
+  }
+  setEntryLocation(key, values, output) {
+    if (!(key in this.offsets)) {
+      throw new FormatError(`Not tracking location of ${key}`);
+    }
+    const data = output.data;
+    const dataOffset = this.offsets[key];
+    const size = 5;
+    for (let i = 0, ii = values.length; i < ii; ++i) {
+      const offset0 = i * size + dataOffset;
+      const offset1 = offset0 + 1;
+      const offset2 = offset0 + 2;
+      const offset3 = offset0 + 3;
+      const offset4 = offset0 + 4;
+      if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
+        throw new FormatError("writing to an offset that is not empty");
+      }
+      const value = values[i];
+      data[offset0] = 0x1d;
+      data[offset1] = value >> 24 & 0xff;
+      data[offset2] = value >> 16 & 0xff;
+      data[offset3] = value >> 8 & 0xff;
+      data[offset4] = value & 0xff;
+    }
+  }
+}
+class CFFCompiler {
+  constructor(cff) {
+    this.cff = cff;
+  }
+  compile() {
+    const cff = this.cff;
+    const output = new DataBuilder({
+      minLength: cff.rawFileLength
+    });
+    const header = this.compileHeader(cff.header);
+    output.setArray(header);
+    const nameIndex = this.compileNameIndex(cff.names);
+    output.setArray(nameIndex);
+    if (cff.isCIDFont) {
+      if (cff.topDict.hasName("FontMatrix")) {
+        const base = cff.topDict.getByName("FontMatrix");
+        cff.topDict.removeByName("FontMatrix");
+        for (const subDict of cff.fdArray) {
+          let matrix = base.slice(0);
+          if (subDict.hasName("FontMatrix")) {
+            matrix = Util.transform(matrix, subDict.getByName("FontMatrix"));
+          }
+          subDict.setByName("FontMatrix", matrix);
+        }
+      }
+    }
+    const xuid = cff.topDict.getByName("XUID");
+    if (xuid?.length > 16) {
+      cff.topDict.removeByName("XUID");
+    }
+    cff.topDict.setByName("charset", 0);
+    let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
+    output.setArray(compiled.output);
+    const topDictTracker = compiled.trackers[0];
+    const stringIndex = this.compileStringIndex(cff.strings.strings);
+    output.setArray(stringIndex);
+    const globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
+    output.setArray(globalSubrIndex);
+    if (cff.encoding && cff.topDict.hasName("Encoding")) {
+      if (cff.encoding.predefined) {
+        topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output);
+      } else {
+        const encoding = this.compileEncoding(cff.encoding);
+        topDictTracker.setEntryLocation("Encoding", [output.length], output);
+        output.setArray(encoding);
+      }
+    }
+    const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont);
+    topDictTracker.setEntryLocation("charset", [output.length], output);
+    output.setArray(charset);
+    const charStrings = this.compileCharStrings(cff.charStrings);
+    topDictTracker.setEntryLocation("CharStrings", [output.length], output);
+    output.setArray(charStrings);
+    if (cff.isCIDFont) {
+      topDictTracker.setEntryLocation("FDSelect", [output.length], output);
+      const fdSelect = this.compileFDSelect(cff.fdSelect);
+      output.setArray(fdSelect);
+      compiled = this.compileTopDicts(cff.fdArray, output.length, true);
+      topDictTracker.setEntryLocation("FDArray", [output.length], output);
+      output.setArray(compiled.output);
+      const fontDictTrackers = compiled.trackers;
+      this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
+    }
+    this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
+    output.setArray([0]);
+    return output.data;
+  }
+  encodeNumber(value) {
+    if (Number.isInteger(value)) {
+      return this.encodeInteger(value);
+    }
+    return this.encodeFloat(value);
+  }
+  static get EncodeFloatRegExp() {
+    return shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/);
+  }
+  encodeFloat(num) {
+    let value = num.toString();
+    const m = CFFCompiler.EncodeFloatRegExp.exec(value);
+    if (m) {
+      const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length));
+      value = (Math.round(num * epsilon) / epsilon).toString();
+    }
+    let nibbles = "";
+    let i, ii;
+    for (i = 0, ii = value.length; i < ii; ++i) {
+      const a = value[i];
+      if (a === "e") {
+        nibbles += value[++i] === "-" ? "c" : "b";
+      } else if (a === ".") {
+        nibbles += "a";
+      } else if (a === "-") {
+        nibbles += "e";
+      } else {
+        nibbles += a;
+      }
+    }
+    nibbles += nibbles.length & 1 ? "f" : "ff";
+    const out = [30];
+    for (i = 0, ii = nibbles.length; i < ii; i += 2) {
+      out.push(parseInt(nibbles.substring(i, i + 2), 16));
+    }
+    return out;
+  }
+  encodeInteger(value) {
+    let code;
+    if (value >= -107 && value <= 107) {
+      code = [value + 139];
+    } else if (value >= 108 && value <= 1131) {
+      value -= 108;
+      code = [(value >> 8) + 247, value & 0xff];
+    } else if (value >= -1131 && value <= -108) {
+      value = -value - 108;
+      code = [(value >> 8) + 251, value & 0xff];
+    } else if (value >= -32768 && value <= 32767) {
+      code = [0x1c, value >> 8 & 0xff, value & 0xff];
+    } else {
+      code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff];
+    }
+    return code;
+  }
+  compileHeader(header) {
+    return [header.major, header.minor, 4, header.offSize];
+  }
+  compileNameIndex(names) {
+    const nameIndex = new CFFIndex();
+    for (const name of names) {
+      const length = Math.min(name.length, 127);
+      let sanitizedName = new Array(length);
+      for (let j = 0; j < length; j++) {
+        let char = name[j];
+        if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") {
+          char = "_";
+        }
+        sanitizedName[j] = char;
+      }
+      sanitizedName = sanitizedName.join("");
+      if (sanitizedName === "") {
+        sanitizedName = "Bad_Font_Name";
+      }
+      nameIndex.add(stringToBytes(sanitizedName));
+    }
+    return this.compileIndex(nameIndex);
+  }
+  compileTopDicts(dicts, length, removeCidKeys) {
+    const fontDictTrackers = [];
+    let fdArrayIndex = new CFFIndex();
+    for (const fontDict of dicts) {
+      if (removeCidKeys) {
+        fontDict.removeByName("CIDFontVersion");
+        fontDict.removeByName("CIDFontRevision");
+        fontDict.removeByName("CIDFontType");
+        fontDict.removeByName("CIDCount");
+        fontDict.removeByName("UIDBase");
+      }
+      const fontDictTracker = new CFFOffsetTracker();
+      const fontDictData = this.compileDict(fontDict, fontDictTracker);
+      fontDictTrackers.push(fontDictTracker);
+      fdArrayIndex.add(fontDictData);
+      fontDictTracker.offset(length);
+    }
+    fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
+    return {
+      trackers: fontDictTrackers,
+      output: fdArrayIndex
+    };
+  }
+  compilePrivateDicts(dicts, trackers, output) {
+    for (let i = 0, ii = dicts.length; i < ii; ++i) {
+      const fontDict = dicts[i];
+      const privateDict = fontDict.privateDict;
+      if (!privateDict || !fontDict.hasName("Private")) {
+        throw new FormatError("There must be a private dictionary.");
+      }
+      const privateDictTracker = new CFFOffsetTracker();
+      const privateDictData = this.compileDict(privateDict, privateDictTracker);
+      let outputLength = output.length;
+      privateDictTracker.offset(outputLength);
+      if (!privateDictData.length) {
+        outputLength = 0;
+      }
+      trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output);
+      output.setArray(privateDictData);
+      if (privateDict.subrsIndex && privateDict.hasName("Subrs")) {
+        const subrs = this.compileIndex(privateDict.subrsIndex);
+        privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output);
+        output.setArray(subrs);
+      }
+    }
+  }
+  compileDict(dict, offsetTracker) {
+    const out = [];
+    for (const key of dict.order) {
+      if (!(key in dict.values)) {
+        continue;
+      }
+      let values = dict.values[key];
+      let types = dict.types[key];
+      if (!Array.isArray(types)) {
+        types = [types];
+      }
+      if (!Array.isArray(values)) {
+        values = [values];
+      }
+      if (values.length === 0) {
+        continue;
+      }
+      for (let j = 0, jj = types.length; j < jj; ++j) {
+        const type = types[j];
+        const value = values[j];
+        switch (type) {
+          case "num":
+          case "sid":
+            out.push(...this.encodeNumber(value));
+            break;
+          case "offset":
+            const name = dict.keyToNameMap[key];
+            if (!offsetTracker.isTracking(name)) {
+              offsetTracker.track(name, out.length);
+            }
+            out.push(0x1d, 0, 0, 0, 0);
+            break;
+          case "array":
+          case "delta":
+            out.push(...this.encodeNumber(value));
+            for (let k = 1, kk = values.length; k < kk; ++k) {
+              out.push(...this.encodeNumber(values[k]));
+            }
+            break;
+          default:
+            throw new FormatError(`Unknown data type of ${type}`);
+        }
+      }
+      out.push(...dict.opcodes[key]);
+    }
+    return out;
+  }
+  compileStringIndex(strings) {
+    const stringIndex = new CFFIndex();
+    for (const string of strings) {
+      stringIndex.add(stringToBytes(string));
+    }
+    return this.compileIndex(stringIndex);
+  }
+  compileCharStrings(charStrings) {
+    const charStringsIndex = new CFFIndex();
+    for (let i = 0; i < charStrings.count; i++) {
+      const glyph = charStrings.get(i);
+      if (glyph.length === 0) {
+        charStringsIndex.add(new Uint8Array([0x8b, 0x0e]));
+        continue;
+      }
+      charStringsIndex.add(glyph);
+    }
+    return this.compileIndex(charStringsIndex);
+  }
+  compileCharset(charset, numGlyphs, strings, isCIDFont) {
+    let out;
+    const numGlyphsLessNotDef = numGlyphs - 1;
+    if (isCIDFont) {
+      const nLeft = numGlyphsLessNotDef - 1;
+      out = new Uint8Array([2, 0, 1, nLeft >> 8 & 0xff, nLeft & 0xff]);
+    } else {
+      const length = 1 + numGlyphsLessNotDef * 2;
+      out = new Uint8Array(length);
+      let charsetIndex = 0;
+      const numCharsets = charset.charset.length;
+      let warned = false;
+      for (let i = 1; i < out.length; i += 2) {
+        let sid = 0;
+        if (charsetIndex < numCharsets) {
+          const name = charset.charset[charsetIndex++];
+          sid = strings.getSID(name);
+          if (sid === -1) {
+            sid = 0;
+            if (!warned) {
+              warned = true;
+              warn(`Couldn't find ${name} in CFF strings`);
+            }
+          }
+        }
+        out[i] = sid >> 8 & 0xff;
+        out[i + 1] = sid & 0xff;
+      }
+    }
+    return out;
+  }
+  compileEncoding(encoding) {
+    return encoding.raw;
+  }
+  compileFDSelect(fdSelect) {
+    const format = fdSelect.format;
+    let out, i;
+    switch (format) {
+      case 0:
+        out = new Uint8Array(1 + fdSelect.fdSelect.length);
+        out[0] = format;
+        out.set(fdSelect.fdSelect, 1);
+        break;
+      case 3:
+        const start = 0;
+        let lastFD = fdSelect.fdSelect[0];
+        const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD];
+        for (i = 1; i < fdSelect.fdSelect.length; i++) {
+          const currentFD = fdSelect.fdSelect[i];
+          if (currentFD !== lastFD) {
+            ranges.push(i >> 8 & 0xff, i & 0xff, currentFD);
+            lastFD = currentFD;
+          }
+        }
+        const numRanges = (ranges.length - 3) / 3;
+        ranges[1] = numRanges >> 8 & 0xff;
+        ranges[2] = numRanges & 0xff;
+        ranges.push(i >> 8 & 0xff, i & 0xff);
+        out = new Uint8Array(ranges);
+        break;
+    }
+    return out;
+  }
+  compileIndex(index, trackers = []) {
+    const objects = index.objects;
+    const count = objects.length;
+    if (count === 0) {
+      return new Uint8Array(2);
+    }
+    let lastOffset = 1,
+      i;
+    for (i = 0; i < count; ++i) {
+      lastOffset += objects[i].length;
+    }
+    let offsetSize;
+    if (lastOffset < 0x100) {
+      offsetSize = 1;
+    } else if (lastOffset < 0x10000) {
+      offsetSize = 2;
+    } else if (lastOffset < 0x1000000) {
+      offsetSize = 3;
+    } else {
+      offsetSize = 4;
+    }
+    const data = new Uint8Array(2 + offsetSize * (count + 1) + lastOffset);
+    let pos = 0;
+    data[pos++] = count >> 8 & 0xff;
+    data[pos++] = count & 0xff;
+    data[pos++] = offsetSize;
+    let relativeOffset = 1;
+    for (i = 0; i < count + 1; i++) {
+      if (offsetSize === 1) {
+        data[pos++] = relativeOffset & 0xff;
+      } else if (offsetSize === 2) {
+        data[pos++] = relativeOffset >> 8 & 0xff;
+        data[pos++] = relativeOffset & 0xff;
+      } else if (offsetSize === 3) {
+        data[pos++] = relativeOffset >> 16 & 0xff;
+        data[pos++] = relativeOffset >> 8 & 0xff;
+        data[pos++] = relativeOffset & 0xff;
+      } else {
+        data[pos++] = relativeOffset >>> 24 & 0xff;
+        data[pos++] = relativeOffset >> 16 & 0xff;
+        data[pos++] = relativeOffset >> 8 & 0xff;
+        data[pos++] = relativeOffset & 0xff;
+      }
+      if (objects[i]) {
+        relativeOffset += objects[i].length;
+      }
+    }
+    for (i = 0; i < count; i++) {
+      trackers[i]?.offset(pos);
+      data.set(objects[i], pos);
+      pos += objects[i].length;
+    }
+    return data;
+  }
+}
+
+;// ./src/core/standard_fonts.js
+
+
+const getStdFontMap = getLookupTableFactory(function (t) {
+  t["Times-Roman"] = "Times-Roman";
+  t.Helvetica = "Helvetica";
+  t.Courier = "Courier";
+  t.Symbol = "Symbol";
+  t["Times-Bold"] = "Times-Bold";
+  t["Helvetica-Bold"] = "Helvetica-Bold";
+  t["Courier-Bold"] = "Courier-Bold";
+  t.ZapfDingbats = "ZapfDingbats";
+  t["Times-Italic"] = "Times-Italic";
+  t["Helvetica-Oblique"] = "Helvetica-Oblique";
+  t["Courier-Oblique"] = "Courier-Oblique";
+  t["Times-BoldItalic"] = "Times-BoldItalic";
+  t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique";
+  t["Courier-BoldOblique"] = "Courier-BoldOblique";
+  t.ArialNarrow = "Helvetica";
+  t["ArialNarrow-Bold"] = "Helvetica-Bold";
+  t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique";
+  t["ArialNarrow-Italic"] = "Helvetica-Oblique";
+  t.ArialBlack = "Helvetica";
+  t["ArialBlack-Bold"] = "Helvetica-Bold";
+  t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique";
+  t["ArialBlack-Italic"] = "Helvetica-Oblique";
+  t["Arial-Black"] = "Helvetica";
+  t["Arial-Black-Bold"] = "Helvetica-Bold";
+  t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Arial-Black-Italic"] = "Helvetica-Oblique";
+  t.Arial = "Helvetica";
+  t["Arial-Bold"] = "Helvetica-Bold";
+  t["Arial-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Arial-Italic"] = "Helvetica-Oblique";
+  t.ArialMT = "Helvetica";
+  t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique";
+  t["Arial-BoldMT"] = "Helvetica-Bold";
+  t["Arial-ItalicMT"] = "Helvetica-Oblique";
+  t["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Arial-BoldMT-Bold"] = "Helvetica-Bold";
+  t["Arial-ItalicMT-Italic"] = "Helvetica-Oblique";
+  t.ArialUnicodeMS = "Helvetica";
+  t["ArialUnicodeMS-Bold"] = "Helvetica-Bold";
+  t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique";
+  t["ArialUnicodeMS-Italic"] = "Helvetica-Oblique";
+  t["Courier-BoldItalic"] = "Courier-BoldOblique";
+  t["Courier-Italic"] = "Courier-Oblique";
+  t.CourierNew = "Courier";
+  t["CourierNew-Bold"] = "Courier-Bold";
+  t["CourierNew-BoldItalic"] = "Courier-BoldOblique";
+  t["CourierNew-Italic"] = "Courier-Oblique";
+  t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique";
+  t["CourierNewPS-BoldMT"] = "Courier-Bold";
+  t["CourierNewPS-ItalicMT"] = "Courier-Oblique";
+  t.CourierNewPSMT = "Courier";
+  t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Helvetica-Italic"] = "Helvetica-Oblique";
+  t["HelveticaLTStd-Bold"] = "Helvetica-Bold";
+  t["Symbol-Bold"] = "Symbol";
+  t["Symbol-BoldItalic"] = "Symbol";
+  t["Symbol-Italic"] = "Symbol";
+  t.TimesNewRoman = "Times-Roman";
+  t["TimesNewRoman-Bold"] = "Times-Bold";
+  t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic";
+  t["TimesNewRoman-Italic"] = "Times-Italic";
+  t.TimesNewRomanPS = "Times-Roman";
+  t["TimesNewRomanPS-Bold"] = "Times-Bold";
+  t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic";
+  t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic";
+  t["TimesNewRomanPS-BoldMT"] = "Times-Bold";
+  t["TimesNewRomanPS-Italic"] = "Times-Italic";
+  t["TimesNewRomanPS-ItalicMT"] = "Times-Italic";
+  t.TimesNewRomanPSMT = "Times-Roman";
+  t["TimesNewRomanPSMT-Bold"] = "Times-Bold";
+  t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic";
+  t["TimesNewRomanPSMT-Italic"] = "Times-Italic";
+});
+const getFontNameToFileMap = getLookupTableFactory(function (t) {
+  t.Courier = "FoxitFixed.pfb";
+  t["Courier-Bold"] = "FoxitFixedBold.pfb";
+  t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb";
+  t["Courier-Oblique"] = "FoxitFixedItalic.pfb";
+  t.Helvetica = "LiberationSans-Regular.ttf";
+  t["Helvetica-Bold"] = "LiberationSans-Bold.ttf";
+  t["Helvetica-BoldOblique"] = "LiberationSans-BoldItalic.ttf";
+  t["Helvetica-Oblique"] = "LiberationSans-Italic.ttf";
+  t["Times-Roman"] = "FoxitSerif.pfb";
+  t["Times-Bold"] = "FoxitSerifBold.pfb";
+  t["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb";
+  t["Times-Italic"] = "FoxitSerifItalic.pfb";
+  t.Symbol = "FoxitSymbol.pfb";
+  t.ZapfDingbats = "FoxitDingbats.pfb";
+  t["LiberationSans-Regular"] = "LiberationSans-Regular.ttf";
+  t["LiberationSans-Bold"] = "LiberationSans-Bold.ttf";
+  t["LiberationSans-Italic"] = "LiberationSans-Italic.ttf";
+  t["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf";
+});
+const getNonStdFontMap = getLookupTableFactory(function (t) {
+  t.Calibri = "Helvetica";
+  t["Calibri-Bold"] = "Helvetica-Bold";
+  t["Calibri-BoldItalic"] = "Helvetica-BoldOblique";
+  t["Calibri-Italic"] = "Helvetica-Oblique";
+  t.CenturyGothic = "Helvetica";
+  t["CenturyGothic-Bold"] = "Helvetica-Bold";
+  t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique";
+  t["CenturyGothic-Italic"] = "Helvetica-Oblique";
+  t.ComicSansMS = "Comic Sans MS";
+  t["ComicSansMS-Bold"] = "Comic Sans MS-Bold";
+  t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic";
+  t["ComicSansMS-Italic"] = "Comic Sans MS-Italic";
+  t.GillSansMT = "Helvetica";
+  t["GillSansMT-Bold"] = "Helvetica-Bold";
+  t["GillSansMT-BoldItalic"] = "Helvetica-BoldOblique";
+  t["GillSansMT-Italic"] = "Helvetica-Oblique";
+  t.Impact = "Helvetica";
+  t["ItcSymbol-Bold"] = "Helvetica-Bold";
+  t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique";
+  t["ItcSymbol-Book"] = "Helvetica";
+  t["ItcSymbol-BookItalic"] = "Helvetica-Oblique";
+  t["ItcSymbol-Medium"] = "Helvetica";
+  t["ItcSymbol-MediumItalic"] = "Helvetica-Oblique";
+  t.LucidaConsole = "Courier";
+  t["LucidaConsole-Bold"] = "Courier-Bold";
+  t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique";
+  t["LucidaConsole-Italic"] = "Courier-Oblique";
+  t["LucidaSans-Demi"] = "Helvetica-Bold";
+  t["MS-Gothic"] = "MS Gothic";
+  t["MS-Gothic-Bold"] = "MS Gothic-Bold";
+  t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic";
+  t["MS-Gothic-Italic"] = "MS Gothic-Italic";
+  t["MS-Mincho"] = "MS Mincho";
+  t["MS-Mincho-Bold"] = "MS Mincho-Bold";
+  t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic";
+  t["MS-Mincho-Italic"] = "MS Mincho-Italic";
+  t["MS-PGothic"] = "MS PGothic";
+  t["MS-PGothic-Bold"] = "MS PGothic-Bold";
+  t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic";
+  t["MS-PGothic-Italic"] = "MS PGothic-Italic";
+  t["MS-PMincho"] = "MS PMincho";
+  t["MS-PMincho-Bold"] = "MS PMincho-Bold";
+  t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic";
+  t["MS-PMincho-Italic"] = "MS PMincho-Italic";
+  t.NuptialScript = "Times-Italic";
+  t.SegoeUISymbol = "Helvetica";
+});
+const getSerifFonts = getLookupTableFactory(function (t) {
+  t["Adobe Jenson"] = true;
+  t["Adobe Text"] = true;
+  t.Albertus = true;
+  t.Aldus = true;
+  t.Alexandria = true;
+  t.Algerian = true;
+  t["American Typewriter"] = true;
+  t.Antiqua = true;
+  t.Apex = true;
+  t.Arno = true;
+  t.Aster = true;
+  t.Aurora = true;
+  t.Baskerville = true;
+  t.Bell = true;
+  t.Bembo = true;
+  t["Bembo Schoolbook"] = true;
+  t.Benguiat = true;
+  t["Berkeley Old Style"] = true;
+  t["Bernhard Modern"] = true;
+  t["Berthold City"] = true;
+  t.Bodoni = true;
+  t["Bauer Bodoni"] = true;
+  t["Book Antiqua"] = true;
+  t.Bookman = true;
+  t["Bordeaux Roman"] = true;
+  t["Californian FB"] = true;
+  t.Calisto = true;
+  t.Calvert = true;
+  t.Capitals = true;
+  t.Cambria = true;
+  t.Cartier = true;
+  t.Caslon = true;
+  t.Catull = true;
+  t.Centaur = true;
+  t["Century Old Style"] = true;
+  t["Century Schoolbook"] = true;
+  t.Chaparral = true;
+  t["Charis SIL"] = true;
+  t.Cheltenham = true;
+  t["Cholla Slab"] = true;
+  t.Clarendon = true;
+  t.Clearface = true;
+  t.Cochin = true;
+  t.Colonna = true;
+  t["Computer Modern"] = true;
+  t["Concrete Roman"] = true;
+  t.Constantia = true;
+  t["Cooper Black"] = true;
+  t.Corona = true;
+  t.Ecotype = true;
+  t.Egyptienne = true;
+  t.Elephant = true;
+  t.Excelsior = true;
+  t.Fairfield = true;
+  t["FF Scala"] = true;
+  t.Folkard = true;
+  t.Footlight = true;
+  t.FreeSerif = true;
+  t["Friz Quadrata"] = true;
+  t.Garamond = true;
+  t.Gentium = true;
+  t.Georgia = true;
+  t.Gloucester = true;
+  t["Goudy Old Style"] = true;
+  t["Goudy Schoolbook"] = true;
+  t["Goudy Pro Font"] = true;
+  t.Granjon = true;
+  t["Guardian Egyptian"] = true;
+  t.Heather = true;
+  t.Hercules = true;
+  t["High Tower Text"] = true;
+  t.Hiroshige = true;
+  t["Hoefler Text"] = true;
+  t["Humana Serif"] = true;
+  t.Imprint = true;
+  t["Ionic No. 5"] = true;
+  t.Janson = true;
+  t.Joanna = true;
+  t.Korinna = true;
+  t.Lexicon = true;
+  t.LiberationSerif = true;
+  t["Liberation Serif"] = true;
+  t["Linux Libertine"] = true;
+  t.Literaturnaya = true;
+  t.Lucida = true;
+  t["Lucida Bright"] = true;
+  t.Melior = true;
+  t.Memphis = true;
+  t.Miller = true;
+  t.Minion = true;
+  t.Modern = true;
+  t["Mona Lisa"] = true;
+  t["Mrs Eaves"] = true;
+  t["MS Serif"] = true;
+  t["Museo Slab"] = true;
+  t["New York"] = true;
+  t["Nimbus Roman"] = true;
+  t["NPS Rawlinson Roadway"] = true;
+  t.NuptialScript = true;
+  t.Palatino = true;
+  t.Perpetua = true;
+  t.Plantin = true;
+  t["Plantin Schoolbook"] = true;
+  t.Playbill = true;
+  t["Poor Richard"] = true;
+  t["Rawlinson Roadway"] = true;
+  t.Renault = true;
+  t.Requiem = true;
+  t.Rockwell = true;
+  t.Roman = true;
+  t["Rotis Serif"] = true;
+  t.Sabon = true;
+  t.Scala = true;
+  t.Seagull = true;
+  t.Sistina = true;
+  t.Souvenir = true;
+  t.STIX = true;
+  t["Stone Informal"] = true;
+  t["Stone Serif"] = true;
+  t.Sylfaen = true;
+  t.Times = true;
+  t.Trajan = true;
+  t["Trinit茅"] = true;
+  t["Trump Mediaeval"] = true;
+  t.Utopia = true;
+  t["Vale Type"] = true;
+  t["Bitstream Vera"] = true;
+  t["Vera Serif"] = true;
+  t.Versailles = true;
+  t.Wanted = true;
+  t.Weiss = true;
+  t["Wide Latin"] = true;
+  t.Windsor = true;
+  t.XITS = true;
+});
+const getSymbolsFonts = getLookupTableFactory(function (t) {
+  t.Dingbats = true;
+  t.Symbol = true;
+  t.ZapfDingbats = true;
+  t.Wingdings = true;
+  t["Wingdings-Bold"] = true;
+  t["Wingdings-Regular"] = true;
+});
+const getGlyphMapForStandardFonts = getLookupTableFactory(function (t) {
+  t[2] = 10;
+  t[3] = 32;
+  t[4] = 33;
+  t[5] = 34;
+  t[6] = 35;
+  t[7] = 36;
+  t[8] = 37;
+  t[9] = 38;
+  t[10] = 39;
+  t[11] = 40;
+  t[12] = 41;
+  t[13] = 42;
+  t[14] = 43;
+  t[15] = 44;
+  t[16] = 45;
+  t[17] = 46;
+  t[18] = 47;
+  t[19] = 48;
+  t[20] = 49;
+  t[21] = 50;
+  t[22] = 51;
+  t[23] = 52;
+  t[24] = 53;
+  t[25] = 54;
+  t[26] = 55;
+  t[27] = 56;
+  t[28] = 57;
+  t[29] = 58;
+  t[30] = 894;
+  t[31] = 60;
+  t[32] = 61;
+  t[33] = 62;
+  t[34] = 63;
+  t[35] = 64;
+  t[36] = 65;
+  t[37] = 66;
+  t[38] = 67;
+  t[39] = 68;
+  t[40] = 69;
+  t[41] = 70;
+  t[42] = 71;
+  t[43] = 72;
+  t[44] = 73;
+  t[45] = 74;
+  t[46] = 75;
+  t[47] = 76;
+  t[48] = 77;
+  t[49] = 78;
+  t[50] = 79;
+  t[51] = 80;
+  t[52] = 81;
+  t[53] = 82;
+  t[54] = 83;
+  t[55] = 84;
+  t[56] = 85;
+  t[57] = 86;
+  t[58] = 87;
+  t[59] = 88;
+  t[60] = 89;
+  t[61] = 90;
+  t[62] = 91;
+  t[63] = 92;
+  t[64] = 93;
+  t[65] = 94;
+  t[66] = 95;
+  t[67] = 96;
+  t[68] = 97;
+  t[69] = 98;
+  t[70] = 99;
+  t[71] = 100;
+  t[72] = 101;
+  t[73] = 102;
+  t[74] = 103;
+  t[75] = 104;
+  t[76] = 105;
+  t[77] = 106;
+  t[78] = 107;
+  t[79] = 108;
+  t[80] = 109;
+  t[81] = 110;
+  t[82] = 111;
+  t[83] = 112;
+  t[84] = 113;
+  t[85] = 114;
+  t[86] = 115;
+  t[87] = 116;
+  t[88] = 117;
+  t[89] = 118;
+  t[90] = 119;
+  t[91] = 120;
+  t[92] = 121;
+  t[93] = 122;
+  t[94] = 123;
+  t[95] = 124;
+  t[96] = 125;
+  t[97] = 126;
+  t[98] = 196;
+  t[99] = 197;
+  t[100] = 199;
+  t[101] = 201;
+  t[102] = 209;
+  t[103] = 214;
+  t[104] = 220;
+  t[105] = 225;
+  t[106] = 224;
+  t[107] = 226;
+  t[108] = 228;
+  t[109] = 227;
+  t[110] = 229;
+  t[111] = 231;
+  t[112] = 233;
+  t[113] = 232;
+  t[114] = 234;
+  t[115] = 235;
+  t[116] = 237;
+  t[117] = 236;
+  t[118] = 238;
+  t[119] = 239;
+  t[120] = 241;
+  t[121] = 243;
+  t[122] = 242;
+  t[123] = 244;
+  t[124] = 246;
+  t[125] = 245;
+  t[126] = 250;
+  t[127] = 249;
+  t[128] = 251;
+  t[129] = 252;
+  t[130] = 8224;
+  t[131] = 176;
+  t[132] = 162;
+  t[133] = 163;
+  t[134] = 167;
+  t[135] = 8226;
+  t[136] = 182;
+  t[137] = 223;
+  t[138] = 174;
+  t[139] = 169;
+  t[140] = 8482;
+  t[141] = 180;
+  t[142] = 168;
+  t[143] = 8800;
+  t[144] = 198;
+  t[145] = 216;
+  t[146] = 8734;
+  t[147] = 177;
+  t[148] = 8804;
+  t[149] = 8805;
+  t[150] = 165;
+  t[151] = 181;
+  t[152] = 8706;
+  t[153] = 8721;
+  t[154] = 8719;
+  t[156] = 8747;
+  t[157] = 170;
+  t[158] = 186;
+  t[159] = 8486;
+  t[160] = 230;
+  t[161] = 248;
+  t[162] = 191;
+  t[163] = 161;
+  t[164] = 172;
+  t[165] = 8730;
+  t[166] = 402;
+  t[167] = 8776;
+  t[168] = 8710;
+  t[169] = 171;
+  t[170] = 187;
+  t[171] = 8230;
+  t[179] = 8220;
+  t[180] = 8221;
+  t[181] = 8216;
+  t[182] = 8217;
+  t[200] = 193;
+  t[203] = 205;
+  t[207] = 211;
+  t[210] = 218;
+  t[223] = 711;
+  t[224] = 321;
+  t[225] = 322;
+  t[226] = 352;
+  t[227] = 353;
+  t[228] = 381;
+  t[229] = 382;
+  t[233] = 221;
+  t[234] = 253;
+  t[252] = 263;
+  t[253] = 268;
+  t[254] = 269;
+  t[258] = 258;
+  t[260] = 260;
+  t[261] = 261;
+  t[265] = 280;
+  t[266] = 281;
+  t[267] = 282;
+  t[268] = 283;
+  t[269] = 313;
+  t[275] = 323;
+  t[276] = 324;
+  t[278] = 328;
+  t[283] = 344;
+  t[284] = 345;
+  t[285] = 346;
+  t[286] = 347;
+  t[292] = 367;
+  t[295] = 377;
+  t[296] = 378;
+  t[298] = 380;
+  t[305] = 963;
+  t[306] = 964;
+  t[307] = 966;
+  t[308] = 8215;
+  t[309] = 8252;
+  t[310] = 8319;
+  t[311] = 8359;
+  t[312] = 8592;
+  t[313] = 8593;
+  t[337] = 9552;
+  t[493] = 1039;
+  t[494] = 1040;
+  t[570] = 1040;
+  t[571] = 1041;
+  t[572] = 1042;
+  t[573] = 1043;
+  t[574] = 1044;
+  t[575] = 1045;
+  t[576] = 1046;
+  t[577] = 1047;
+  t[578] = 1048;
+  t[579] = 1049;
+  t[580] = 1050;
+  t[581] = 1051;
+  t[582] = 1052;
+  t[583] = 1053;
+  t[584] = 1054;
+  t[585] = 1055;
+  t[586] = 1056;
+  t[587] = 1057;
+  t[588] = 1058;
+  t[589] = 1059;
+  t[590] = 1060;
+  t[591] = 1061;
+  t[592] = 1062;
+  t[593] = 1063;
+  t[594] = 1064;
+  t[595] = 1065;
+  t[596] = 1066;
+  t[597] = 1067;
+  t[598] = 1068;
+  t[599] = 1069;
+  t[600] = 1070;
+  t[601] = 1071;
+  t[602] = 1072;
+  t[603] = 1073;
+  t[604] = 1074;
+  t[605] = 1075;
+  t[606] = 1076;
+  t[607] = 1077;
+  t[608] = 1078;
+  t[609] = 1079;
+  t[610] = 1080;
+  t[611] = 1081;
+  t[612] = 1082;
+  t[613] = 1083;
+  t[614] = 1084;
+  t[615] = 1085;
+  t[616] = 1086;
+  t[617] = 1087;
+  t[618] = 1088;
+  t[619] = 1089;
+  t[620] = 1090;
+  t[621] = 1091;
+  t[622] = 1092;
+  t[623] = 1093;
+  t[624] = 1094;
+  t[625] = 1095;
+  t[626] = 1096;
+  t[627] = 1097;
+  t[628] = 1098;
+  t[629] = 1099;
+  t[630] = 1100;
+  t[631] = 1101;
+  t[632] = 1102;
+  t[633] = 1103;
+  t[672] = 1488;
+  t[673] = 1489;
+  t[674] = 1490;
+  t[675] = 1491;
+  t[676] = 1492;
+  t[677] = 1493;
+  t[678] = 1494;
+  t[679] = 1495;
+  t[680] = 1496;
+  t[681] = 1497;
+  t[682] = 1498;
+  t[683] = 1499;
+  t[684] = 1500;
+  t[685] = 1501;
+  t[686] = 1502;
+  t[687] = 1503;
+  t[688] = 1504;
+  t[689] = 1505;
+  t[690] = 1506;
+  t[691] = 1507;
+  t[692] = 1508;
+  t[693] = 1509;
+  t[694] = 1510;
+  t[695] = 1511;
+  t[696] = 1512;
+  t[697] = 1513;
+  t[698] = 1514;
+  t[705] = 1524;
+  t[706] = 8362;
+  t[710] = 64288;
+  t[711] = 64298;
+  t[759] = 1617;
+  t[761] = 1776;
+  t[763] = 1778;
+  t[775] = 1652;
+  t[777] = 1764;
+  t[778] = 1780;
+  t[779] = 1781;
+  t[780] = 1782;
+  t[782] = 771;
+  t[783] = 64726;
+  t[786] = 8363;
+  t[788] = 8532;
+  t[790] = 768;
+  t[791] = 769;
+  t[792] = 768;
+  t[795] = 803;
+  t[797] = 64336;
+  t[798] = 64337;
+  t[799] = 64342;
+  t[800] = 64343;
+  t[801] = 64344;
+  t[802] = 64345;
+  t[803] = 64362;
+  t[804] = 64363;
+  t[805] = 64364;
+  t[2424] = 7821;
+  t[2425] = 7822;
+  t[2426] = 7823;
+  t[2427] = 7824;
+  t[2428] = 7825;
+  t[2429] = 7826;
+  t[2430] = 7827;
+  t[2433] = 7682;
+  t[2678] = 8045;
+  t[2679] = 8046;
+  t[2830] = 1552;
+  t[2838] = 686;
+  t[2840] = 751;
+  t[2842] = 753;
+  t[2843] = 754;
+  t[2844] = 755;
+  t[2846] = 757;
+  t[2856] = 767;
+  t[2857] = 848;
+  t[2858] = 849;
+  t[2862] = 853;
+  t[2863] = 854;
+  t[2864] = 855;
+  t[2865] = 861;
+  t[2866] = 862;
+  t[2906] = 7460;
+  t[2908] = 7462;
+  t[2909] = 7463;
+  t[2910] = 7464;
+  t[2912] = 7466;
+  t[2913] = 7467;
+  t[2914] = 7468;
+  t[2916] = 7470;
+  t[2917] = 7471;
+  t[2918] = 7472;
+  t[2920] = 7474;
+  t[2921] = 7475;
+  t[2922] = 7476;
+  t[2924] = 7478;
+  t[2925] = 7479;
+  t[2926] = 7480;
+  t[2928] = 7482;
+  t[2929] = 7483;
+  t[2930] = 7484;
+  t[2932] = 7486;
+  t[2933] = 7487;
+  t[2934] = 7488;
+  t[2936] = 7490;
+  t[2937] = 7491;
+  t[2938] = 7492;
+  t[2940] = 7494;
+  t[2941] = 7495;
+  t[2942] = 7496;
+  t[2944] = 7498;
+  t[2946] = 7500;
+  t[2948] = 7502;
+  t[2950] = 7504;
+  t[2951] = 7505;
+  t[2952] = 7506;
+  t[2954] = 7508;
+  t[2955] = 7509;
+  t[2956] = 7510;
+  t[2958] = 7512;
+  t[2959] = 7513;
+  t[2960] = 7514;
+  t[2962] = 7516;
+  t[2963] = 7517;
+  t[2964] = 7518;
+  t[2966] = 7520;
+  t[2967] = 7521;
+  t[2968] = 7522;
+  t[2970] = 7524;
+  t[2971] = 7525;
+  t[2972] = 7526;
+  t[2974] = 7528;
+  t[2975] = 7529;
+  t[2976] = 7530;
+  t[2978] = 1537;
+  t[2979] = 1538;
+  t[2980] = 1539;
+  t[2982] = 1549;
+  t[2983] = 1551;
+  t[2984] = 1552;
+  t[2986] = 1554;
+  t[2987] = 1555;
+  t[2988] = 1556;
+  t[2990] = 1623;
+  t[2991] = 1624;
+  t[2995] = 1775;
+  t[2999] = 1791;
+  t[3002] = 64290;
+  t[3003] = 64291;
+  t[3004] = 64292;
+  t[3006] = 64294;
+  t[3007] = 64295;
+  t[3008] = 64296;
+  t[3011] = 1900;
+  t[3014] = 8223;
+  t[3015] = 8244;
+  t[3017] = 7532;
+  t[3018] = 7533;
+  t[3019] = 7534;
+  t[3075] = 7590;
+  t[3076] = 7591;
+  t[3079] = 7594;
+  t[3080] = 7595;
+  t[3083] = 7598;
+  t[3084] = 7599;
+  t[3087] = 7602;
+  t[3088] = 7603;
+  t[3091] = 7606;
+  t[3092] = 7607;
+  t[3095] = 7610;
+  t[3096] = 7611;
+  t[3099] = 7614;
+  t[3100] = 7615;
+  t[3103] = 7618;
+  t[3104] = 7619;
+  t[3107] = 8337;
+  t[3108] = 8338;
+  t[3116] = 1884;
+  t[3119] = 1885;
+  t[3120] = 1885;
+  t[3123] = 1886;
+  t[3124] = 1886;
+  t[3127] = 1887;
+  t[3128] = 1887;
+  t[3131] = 1888;
+  t[3132] = 1888;
+  t[3135] = 1889;
+  t[3136] = 1889;
+  t[3139] = 1890;
+  t[3140] = 1890;
+  t[3143] = 1891;
+  t[3144] = 1891;
+  t[3147] = 1892;
+  t[3148] = 1892;
+  t[3153] = 580;
+  t[3154] = 581;
+  t[3157] = 584;
+  t[3158] = 585;
+  t[3161] = 588;
+  t[3162] = 589;
+  t[3165] = 891;
+  t[3166] = 892;
+  t[3169] = 1274;
+  t[3170] = 1275;
+  t[3173] = 1278;
+  t[3174] = 1279;
+  t[3181] = 7622;
+  t[3182] = 7623;
+  t[3282] = 11799;
+  t[3316] = 578;
+  t[3379] = 42785;
+  t[3393] = 1159;
+  t[3416] = 8377;
+});
+const getSupplementalGlyphMapForArialBlack = getLookupTableFactory(function (t) {
+  t[227] = 322;
+  t[264] = 261;
+  t[291] = 346;
+});
+const getSupplementalGlyphMapForCalibri = getLookupTableFactory(function (t) {
+  t[1] = 32;
+  t[4] = 65;
+  t[5] = 192;
+  t[6] = 193;
+  t[9] = 196;
+  t[17] = 66;
+  t[18] = 67;
+  t[21] = 268;
+  t[24] = 68;
+  t[28] = 69;
+  t[29] = 200;
+  t[30] = 201;
+  t[32] = 282;
+  t[38] = 70;
+  t[39] = 71;
+  t[44] = 72;
+  t[47] = 73;
+  t[48] = 204;
+  t[49] = 205;
+  t[58] = 74;
+  t[60] = 75;
+  t[62] = 76;
+  t[68] = 77;
+  t[69] = 78;
+  t[75] = 79;
+  t[76] = 210;
+  t[80] = 214;
+  t[87] = 80;
+  t[89] = 81;
+  t[90] = 82;
+  t[92] = 344;
+  t[94] = 83;
+  t[97] = 352;
+  t[100] = 84;
+  t[104] = 85;
+  t[109] = 220;
+  t[115] = 86;
+  t[116] = 87;
+  t[121] = 88;
+  t[122] = 89;
+  t[124] = 221;
+  t[127] = 90;
+  t[129] = 381;
+  t[258] = 97;
+  t[259] = 224;
+  t[260] = 225;
+  t[263] = 228;
+  t[268] = 261;
+  t[271] = 98;
+  t[272] = 99;
+  t[273] = 263;
+  t[275] = 269;
+  t[282] = 100;
+  t[286] = 101;
+  t[287] = 232;
+  t[288] = 233;
+  t[290] = 283;
+  t[295] = 281;
+  t[296] = 102;
+  t[336] = 103;
+  t[346] = 104;
+  t[349] = 105;
+  t[350] = 236;
+  t[351] = 237;
+  t[361] = 106;
+  t[364] = 107;
+  t[367] = 108;
+  t[371] = 322;
+  t[373] = 109;
+  t[374] = 110;
+  t[381] = 111;
+  t[382] = 242;
+  t[383] = 243;
+  t[386] = 246;
+  t[393] = 112;
+  t[395] = 113;
+  t[396] = 114;
+  t[398] = 345;
+  t[400] = 115;
+  t[401] = 347;
+  t[403] = 353;
+  t[410] = 116;
+  t[437] = 117;
+  t[442] = 252;
+  t[448] = 118;
+  t[449] = 119;
+  t[454] = 120;
+  t[455] = 121;
+  t[457] = 253;
+  t[460] = 122;
+  t[462] = 382;
+  t[463] = 380;
+  t[853] = 44;
+  t[855] = 58;
+  t[856] = 46;
+  t[876] = 47;
+  t[878] = 45;
+  t[882] = 45;
+  t[894] = 40;
+  t[895] = 41;
+  t[896] = 91;
+  t[897] = 93;
+  t[923] = 64;
+  t[940] = 163;
+  t[1004] = 48;
+  t[1005] = 49;
+  t[1006] = 50;
+  t[1007] = 51;
+  t[1008] = 52;
+  t[1009] = 53;
+  t[1010] = 54;
+  t[1011] = 55;
+  t[1012] = 56;
+  t[1013] = 57;
+  t[1081] = 37;
+  t[1085] = 43;
+  t[1086] = 45;
+});
+function getStandardFontName(name) {
+  const fontName = normalizeFontName(name);
+  const stdFontMap = getStdFontMap();
+  return stdFontMap[fontName];
+}
+function isKnownFontName(name) {
+  const fontName = normalizeFontName(name);
+  return !!(getStdFontMap()[fontName] || getNonStdFontMap()[fontName] || getSerifFonts()[fontName] || getSymbolsFonts()[fontName]);
+}
+
+;// ./src/core/glyf.js
+const ON_CURVE_POINT = 1 << 0;
+const X_SHORT_VECTOR = 1 << 1;
+const Y_SHORT_VECTOR = 1 << 2;
+const REPEAT_FLAG = 1 << 3;
+const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4;
+const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5;
+const OVERLAP_SIMPLE = 1 << 6;
+const ARG_1_AND_2_ARE_WORDS = 1 << 0;
+const ARGS_ARE_XY_VALUES = 1 << 1;
+const WE_HAVE_A_SCALE = 1 << 3;
+const MORE_COMPONENTS = 1 << 5;
+const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
+const WE_HAVE_A_TWO_BY_TWO = 1 << 7;
+const WE_HAVE_INSTRUCTIONS = 1 << 8;
+const GLYPH_HEADER_SIZE = 10;
+class GlyfTable {
+  constructor({
+    glyfTable,
+    isGlyphLocationsLong,
+    locaTable,
+    numGlyphs
+  }) {
+    this.glyphs = [];
+    const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength);
+    const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength);
+    const offsetSize = isGlyphLocationsLong ? 4 : 2;
+    let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0);
+    let pos = 0;
+    for (let i = 0; i < numGlyphs; i++) {
+      pos += offsetSize;
+      const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos);
+      if (next === prev) {
+        this.glyphs.push(new Glyph({}));
+        continue;
+      }
+      const glyph = Glyph.parse(prev, glyf);
+      this.glyphs.push(glyph);
+      prev = next;
+    }
+  }
+  getSize() {
+    return Math.sumPrecise(this.glyphs.map(g => g.getSize() + 3 & ~3));
+  }
+  write() {
+    const totalSize = this.getSize();
+    const glyfTable = new DataView(new ArrayBuffer(totalSize));
+    const isLocationLong = totalSize > 0x1fffe;
+    const offsetSize = isLocationLong ? 4 : 2;
+    const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize));
+    if (isLocationLong) {
+      locaTable.setUint32(0, 0);
+    } else {
+      locaTable.setUint16(0, 0);
+    }
+    let pos = 0;
+    let locaIndex = 0;
+    for (const glyph of this.glyphs) {
+      pos += glyph.write(pos, glyfTable);
+      pos = pos + 3 & ~3;
+      locaIndex += offsetSize;
+      if (isLocationLong) {
+        locaTable.setUint32(locaIndex, pos);
+      } else {
+        locaTable.setUint16(locaIndex, pos >> 1);
+      }
+    }
+    return {
+      isLocationLong,
+      loca: new Uint8Array(locaTable.buffer),
+      glyf: new Uint8Array(glyfTable.buffer)
+    };
+  }
+  scale(factors) {
+    for (let i = 0, ii = this.glyphs.length; i < ii; i++) {
+      this.glyphs[i].scale(factors[i]);
+    }
+  }
+}
+class Glyph {
+  constructor({
+    header = null,
+    simple = null,
+    composites = null
+  }) {
+    this.header = header;
+    this.simple = simple;
+    this.composites = composites;
+  }
+  static parse(pos, glyf) {
+    const [read, header] = GlyphHeader.parse(pos, glyf);
+    pos += read;
+    if (header.numberOfContours < 0) {
+      const composites = [];
+      while (true) {
+        const [n, composite] = CompositeGlyph.parse(pos, glyf);
+        pos += n;
+        composites.push(composite);
+        if (!(composite.flags & MORE_COMPONENTS)) {
+          break;
+        }
+      }
+      return new Glyph({
+        header,
+        composites
+      });
+    }
+    const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours);
+    return new Glyph({
+      header,
+      simple
+    });
+  }
+  getSize() {
+    if (!this.header) {
+      return 0;
+    }
+    const size = this.simple ? this.simple.getSize() : Math.sumPrecise(this.composites.map(c => c.getSize()));
+    return this.header.getSize() + size;
+  }
+  write(pos, buf) {
+    if (!this.header) {
+      return 0;
+    }
+    const spos = pos;
+    pos += this.header.write(pos, buf);
+    if (this.simple) {
+      pos += this.simple.write(pos, buf);
+    } else {
+      for (const composite of this.composites) {
+        pos += composite.write(pos, buf);
+      }
+    }
+    return pos - spos;
+  }
+  scale(factor) {
+    if (!this.header) {
+      return;
+    }
+    const xMiddle = (this.header.xMin + this.header.xMax) / 2;
+    this.header.scale(xMiddle, factor);
+    if (this.simple) {
+      this.simple.scale(xMiddle, factor);
+    } else {
+      for (const composite of this.composites) {
+        composite.scale(xMiddle, factor);
+      }
+    }
+  }
+}
+class GlyphHeader {
+  constructor({
+    numberOfContours,
+    xMin,
+    yMin,
+    xMax,
+    yMax
+  }) {
+    this.numberOfContours = numberOfContours;
+    this.xMin = xMin;
+    this.yMin = yMin;
+    this.xMax = xMax;
+    this.yMax = yMax;
+  }
+  static parse(pos, glyf) {
+    return [GLYPH_HEADER_SIZE, new GlyphHeader({
+      numberOfContours: glyf.getInt16(pos),
+      xMin: glyf.getInt16(pos + 2),
+      yMin: glyf.getInt16(pos + 4),
+      xMax: glyf.getInt16(pos + 6),
+      yMax: glyf.getInt16(pos + 8)
+    })];
+  }
+  getSize() {
+    return GLYPH_HEADER_SIZE;
+  }
+  write(pos, buf) {
+    buf.setInt16(pos, this.numberOfContours);
+    buf.setInt16(pos + 2, this.xMin);
+    buf.setInt16(pos + 4, this.yMin);
+    buf.setInt16(pos + 6, this.xMax);
+    buf.setInt16(pos + 8, this.yMax);
+    return GLYPH_HEADER_SIZE;
+  }
+  scale(x, factor) {
+    this.xMin = Math.round(x + (this.xMin - x) * factor);
+    this.xMax = Math.round(x + (this.xMax - x) * factor);
+  }
+}
+class Contour {
+  constructor({
+    flags,
+    xCoordinates,
+    yCoordinates
+  }) {
+    this.xCoordinates = xCoordinates;
+    this.yCoordinates = yCoordinates;
+    this.flags = flags;
+  }
+}
+class SimpleGlyph {
+  constructor({
+    contours,
+    instructions
+  }) {
+    this.contours = contours;
+    this.instructions = instructions;
+  }
+  static parse(pos, glyf, numberOfContours) {
+    const endPtsOfContours = [];
+    for (let i = 0; i < numberOfContours; i++) {
+      const endPt = glyf.getUint16(pos);
+      pos += 2;
+      endPtsOfContours.push(endPt);
+    }
+    const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1;
+    const instructionLength = glyf.getUint16(pos);
+    pos += 2;
+    const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength);
+    pos += instructionLength;
+    const flags = [];
+    for (let i = 0; i < numberOfPt; pos++, i++) {
+      let flag = glyf.getUint8(pos);
+      flags.push(flag);
+      if (flag & REPEAT_FLAG) {
+        const count = glyf.getUint8(++pos);
+        flag ^= REPEAT_FLAG;
+        for (let m = 0; m < count; m++) {
+          flags.push(flag);
+        }
+        i += count;
+      }
+    }
+    const allXCoordinates = [];
+    let xCoordinates = [];
+    let yCoordinates = [];
+    let pointFlags = [];
+    const contours = [];
+    let endPtsOfContoursIndex = 0;
+    let lastCoordinate = 0;
+    for (let i = 0; i < numberOfPt; i++) {
+      const flag = flags[i];
+      if (flag & X_SHORT_VECTOR) {
+        const x = glyf.getUint8(pos++);
+        lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x;
+        xCoordinates.push(lastCoordinate);
+      } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) {
+        xCoordinates.push(lastCoordinate);
+      } else {
+        lastCoordinate += glyf.getInt16(pos);
+        pos += 2;
+        xCoordinates.push(lastCoordinate);
+      }
+      if (endPtsOfContours[endPtsOfContoursIndex] === i) {
+        endPtsOfContoursIndex++;
+        allXCoordinates.push(xCoordinates);
+        xCoordinates = [];
+      }
+    }
+    lastCoordinate = 0;
+    endPtsOfContoursIndex = 0;
+    for (let i = 0; i < numberOfPt; i++) {
+      const flag = flags[i];
+      if (flag & Y_SHORT_VECTOR) {
+        const y = glyf.getUint8(pos++);
+        lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y;
+        yCoordinates.push(lastCoordinate);
+      } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) {
+        yCoordinates.push(lastCoordinate);
+      } else {
+        lastCoordinate += glyf.getInt16(pos);
+        pos += 2;
+        yCoordinates.push(lastCoordinate);
+      }
+      pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE);
+      if (endPtsOfContours[endPtsOfContoursIndex] === i) {
+        xCoordinates = allXCoordinates[endPtsOfContoursIndex];
+        endPtsOfContoursIndex++;
+        contours.push(new Contour({
+          flags: pointFlags,
+          xCoordinates,
+          yCoordinates
+        }));
+        yCoordinates = [];
+        pointFlags = [];
+      }
+    }
+    return new SimpleGlyph({
+      contours,
+      instructions
+    });
+  }
+  getSize() {
+    let size = this.contours.length * 2 + 2 + this.instructions.length;
+    let lastX = 0;
+    let lastY = 0;
+    for (const contour of this.contours) {
+      size += contour.flags.length;
+      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
+        const x = contour.xCoordinates[i];
+        const y = contour.yCoordinates[i];
+        let abs = Math.abs(x - lastX);
+        if (abs > 255) {
+          size += 2;
+        } else if (abs > 0) {
+          size += 1;
+        }
+        lastX = x;
+        abs = Math.abs(y - lastY);
+        if (abs > 255) {
+          size += 2;
+        } else if (abs > 0) {
+          size += 1;
+        }
+        lastY = y;
+      }
+    }
+    return size;
+  }
+  write(pos, buf) {
+    const spos = pos;
+    const xCoordinates = [];
+    const yCoordinates = [];
+    const flags = [];
+    let lastX = 0;
+    let lastY = 0;
+    for (const contour of this.contours) {
+      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
+        let flag = contour.flags[i];
+        const x = contour.xCoordinates[i];
+        let delta = x - lastX;
+        if (delta === 0) {
+          flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR;
+          xCoordinates.push(0);
+        } else {
+          const abs = Math.abs(delta);
+          if (abs <= 255) {
+            flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR;
+            xCoordinates.push(abs);
+          } else {
+            xCoordinates.push(delta);
+          }
+        }
+        lastX = x;
+        const y = contour.yCoordinates[i];
+        delta = y - lastY;
+        if (delta === 0) {
+          flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR;
+          yCoordinates.push(0);
+        } else {
+          const abs = Math.abs(delta);
+          if (abs <= 255) {
+            flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR;
+            yCoordinates.push(abs);
+          } else {
+            yCoordinates.push(delta);
+          }
+        }
+        lastY = y;
+        flags.push(flag);
+      }
+      buf.setUint16(pos, xCoordinates.length - 1);
+      pos += 2;
+    }
+    buf.setUint16(pos, this.instructions.length);
+    pos += 2;
+    if (this.instructions.length) {
+      new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos);
+      pos += this.instructions.length;
+    }
+    for (const flag of flags) {
+      buf.setUint8(pos++, flag);
+    }
+    for (let i = 0, ii = xCoordinates.length; i < ii; i++) {
+      const x = xCoordinates[i];
+      const flag = flags[i];
+      if (flag & X_SHORT_VECTOR) {
+        buf.setUint8(pos++, x);
+      } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) {
+        buf.setInt16(pos, x);
+        pos += 2;
+      }
+    }
+    for (let i = 0, ii = yCoordinates.length; i < ii; i++) {
+      const y = yCoordinates[i];
+      const flag = flags[i];
+      if (flag & Y_SHORT_VECTOR) {
+        buf.setUint8(pos++, y);
+      } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) {
+        buf.setInt16(pos, y);
+        pos += 2;
+      }
+    }
+    return pos - spos;
+  }
+  scale(x, factor) {
+    for (const contour of this.contours) {
+      if (contour.xCoordinates.length === 0) {
+        continue;
+      }
+      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
+        contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor);
+      }
+    }
+  }
+}
+class CompositeGlyph {
+  constructor({
+    flags,
+    glyphIndex,
+    argument1,
+    argument2,
+    transf,
+    instructions
+  }) {
+    this.flags = flags;
+    this.glyphIndex = glyphIndex;
+    this.argument1 = argument1;
+    this.argument2 = argument2;
+    this.transf = transf;
+    this.instructions = instructions;
+  }
+  static parse(pos, glyf) {
+    const spos = pos;
+    const transf = [];
+    let flags = glyf.getUint16(pos);
+    const glyphIndex = glyf.getUint16(pos + 2);
+    pos += 4;
+    let argument1, argument2;
+    if (flags & ARG_1_AND_2_ARE_WORDS) {
+      if (flags & ARGS_ARE_XY_VALUES) {
+        argument1 = glyf.getInt16(pos);
+        argument2 = glyf.getInt16(pos + 2);
+      } else {
+        argument1 = glyf.getUint16(pos);
+        argument2 = glyf.getUint16(pos + 2);
+      }
+      pos += 4;
+      flags ^= ARG_1_AND_2_ARE_WORDS;
+    } else {
+      if (flags & ARGS_ARE_XY_VALUES) {
+        argument1 = glyf.getInt8(pos);
+        argument2 = glyf.getInt8(pos + 1);
+      } else {
+        argument1 = glyf.getUint8(pos);
+        argument2 = glyf.getUint8(pos + 1);
+      }
+      pos += 2;
+    }
+    if (flags & WE_HAVE_A_SCALE) {
+      transf.push(glyf.getUint16(pos));
+      pos += 2;
+    } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
+      transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2));
+      pos += 4;
+    } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
+      transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6));
+      pos += 8;
+    }
+    let instructions = null;
+    if (flags & WE_HAVE_INSTRUCTIONS) {
+      const instructionLength = glyf.getUint16(pos);
+      pos += 2;
+      instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength);
+      pos += instructionLength;
+    }
+    return [pos - spos, new CompositeGlyph({
+      flags,
+      glyphIndex,
+      argument1,
+      argument2,
+      transf,
+      instructions
+    })];
+  }
+  getSize() {
+    let size = 2 + 2 + this.transf.length * 2;
+    if (this.flags & WE_HAVE_INSTRUCTIONS) {
+      size += 2 + this.instructions.length;
+    }
+    size += 2;
+    if (this.flags & 2) {
+      if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) {
+        size += 2;
+      }
+    } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) {
+      size += 2;
+    }
+    return size;
+  }
+  write(pos, buf) {
+    const spos = pos;
+    if (this.flags & ARGS_ARE_XY_VALUES) {
+      if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) {
+        this.flags |= ARG_1_AND_2_ARE_WORDS;
+      }
+    } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) {
+      this.flags |= ARG_1_AND_2_ARE_WORDS;
+    }
+    buf.setUint16(pos, this.flags);
+    buf.setUint16(pos + 2, this.glyphIndex);
+    pos += 4;
+    if (this.flags & ARG_1_AND_2_ARE_WORDS) {
+      if (this.flags & ARGS_ARE_XY_VALUES) {
+        buf.setInt16(pos, this.argument1);
+        buf.setInt16(pos + 2, this.argument2);
+      } else {
+        buf.setUint16(pos, this.argument1);
+        buf.setUint16(pos + 2, this.argument2);
+      }
+      pos += 4;
+    } else {
+      buf.setUint8(pos, this.argument1);
+      buf.setUint8(pos + 1, this.argument2);
+      pos += 2;
+    }
+    if (this.flags & WE_HAVE_INSTRUCTIONS) {
+      buf.setUint16(pos, this.instructions.length);
+      pos += 2;
+      if (this.instructions.length) {
+        new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos);
+        pos += this.instructions.length;
+      }
+    }
+    return pos - spos;
+  }
+  scale(x, factor) {}
+}
+function pruneCompositeGlyphCycles(glyfTable, locaEntries, numGlyphs) {
+  const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength);
+  const components = new Array(numGlyphs);
+  for (let i = 0; i < numGlyphs; i++) {
+    const offset = locaEntries[i].offset;
+    const endOffset = Math.min(locaEntries[i].endOffset, glyf.byteLength);
+    if (endOffset - offset <= GLYPH_HEADER_SIZE || glyf.getInt16(offset) >= 0) {
+      continue;
+    }
+    const comps = [];
+    let p = offset + GLYPH_HEADER_SIZE;
+    while (p + 4 <= endOffset) {
+      const flags = glyf.getUint16(p);
+      const gid = glyf.getUint16(p + 2);
+      let size = 4 + (flags & ARG_1_AND_2_ARE_WORDS ? 4 : 2);
+      if (flags & WE_HAVE_A_SCALE) {
+        size += 2;
+      } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
+        size += 4;
+      } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
+        size += 8;
+      }
+      comps.push({
+        gid,
+        offset: p,
+        size,
+        flags
+      });
+      p += size;
+      if (!(flags & MORE_COMPONENTS)) {
+        break;
+      }
+    }
+    if (comps.length) {
+      components[i] = comps;
+    }
+  }
+  const WHITE = 0,
+    GRAY = 1,
+    BLACK = 2;
+  const state = new Uint8Array(numGlyphs);
+  const backEdges = new Map();
+  for (let start = 0; start < numGlyphs; start++) {
+    if (state[start] !== WHITE || !components[start]) {
+      continue;
+    }
+    const stack = [{
+      node: start,
+      idx: 0
+    }];
+    state[start] = GRAY;
+    while (stack.length > 0) {
+      const top = stack.at(-1);
+      const comps = components[top.node];
+      if (!comps || top.idx >= comps.length) {
+        state[top.node] = BLACK;
+        stack.pop();
+        continue;
+      }
+      const compIdx = top.idx++;
+      const next = comps[compIdx].gid;
+      if (next >= numGlyphs || state[next] === BLACK) {
+        continue;
+      }
+      if (state[next] === WHITE) {
+        state[next] = GRAY;
+        stack.push({
+          node: next,
+          idx: 0
+        });
+        continue;
+      }
+      let removeSet = backEdges.get(top.node);
+      if (!removeSet) {
+        removeSet = new Set();
+        backEdges.set(top.node, removeSet);
+      }
+      removeSet.add(compIdx);
+    }
+  }
+  const droppedGlyphs = new Set();
+  for (const [gIdx, removeSet] of backEdges) {
+    const comps = components[gIdx];
+    const remaining = [];
+    for (let ci = 0; ci < comps.length; ci++) {
+      if (!removeSet.has(ci)) {
+        remaining.push(comps[ci]);
+      }
+    }
+    if (remaining.length === 0) {
+      droppedGlyphs.add(gIdx);
+      continue;
+    }
+    const start = locaEntries[gIdx].offset;
+    const endOffset = Math.min(locaEntries[gIdx].endOffset, glyf.byteLength);
+    let writePos = start + GLYPH_HEADER_SIZE;
+    for (let ci = 0; ci < remaining.length; ci++) {
+      const c = remaining[ci];
+      const isLast = ci === remaining.length - 1;
+      let newFlags = c.flags & ~WE_HAVE_INSTRUCTIONS;
+      newFlags = isLast ? newFlags & ~MORE_COMPONENTS : newFlags | MORE_COMPONENTS;
+      if (writePos !== c.offset) {
+        glyfTable.copyWithin(writePos, c.offset, c.offset + c.size);
+      }
+      glyf.setUint16(writePos, newFlags);
+      writePos += c.size;
+    }
+    if (writePos < endOffset) {
+      glyfTable.fill(0, writePos, endOffset);
+    }
+  }
+  return droppedGlyphs;
+}
+
+;// ./src/core/to_unicode_map.js
+
+class ToUnicodeMap {
+  constructor(cmap = []) {
+    this._map = cmap;
+  }
+  get length() {
+    return this._map.length;
+  }
+  forEach(callback) {
+    for (const charCode in this._map) {
+      callback(charCode, this._map[charCode].codePointAt(0));
+    }
+  }
+  has(i) {
+    return this._map[i] !== undefined;
+  }
+  get(i) {
+    return this._map[i];
+  }
+  charCodeOf(value) {
+    const map = this._map;
+    if (map.length <= 0x10000) {
+      return map.indexOf(value);
+    }
+    for (const charCode in map) {
+      if (map[charCode] === value) {
+        return charCode | 0;
+      }
+    }
+    return -1;
+  }
+  amend(map) {
+    for (const charCode in map) {
+      this._map[charCode] = map[charCode];
+    }
+  }
+}
+class IdentityToUnicodeMap {
+  constructor(firstChar, lastChar) {
+    this.firstChar = firstChar;
+    this.lastChar = lastChar;
+  }
+  get length() {
+    return this.lastChar + 1 - this.firstChar;
+  }
+  forEach(callback) {
+    for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
+      callback(i, i);
+    }
+  }
+  has(i) {
+    return this.firstChar <= i && i <= this.lastChar;
+  }
+  get(i) {
+    if (this.firstChar <= i && i <= this.lastChar) {
+      return String.fromCharCode(i);
+    }
+    return undefined;
+  }
+  charCodeOf(v) {
+    return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;
+  }
+  amend(map) {
+    unreachable("Should not call amend()");
+  }
+}
+
+;// ./src/core/cff_font.js
+
+
+
+class CFFFont {
+  constructor(file, properties) {
+    this.properties = properties;
+    const parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);
+    this.cff = parser.parse();
+    this.cff.duplicateFirstGlyph();
+    const compiler = new CFFCompiler(this.cff);
+    this.seacs = this.cff.seacs;
+    try {
+      this.data = compiler.compile();
+    } catch (ex) {
+      warn(`Failed to compile font "${properties.loadedName}": "${ex}".`);
+      file.reset();
+      this.data = file.getBytes();
+    }
+    this._createBuiltInEncoding();
+  }
+  get numGlyphs() {
+    return this.cff.charStrings.count;
+  }
+  getCharset() {
+    return this.cff.charset.charset;
+  }
+  getGlyphMapping() {
+    const cff = this.cff;
+    const properties = this.properties;
+    const {
+      cidToGidMap,
+      cMap
+    } = properties;
+    const charsets = cff.charset.charset;
+    let charCodeToGlyphId;
+    let glyphId;
+    if (properties.composite) {
+      let invCidToGidMap;
+      if (cidToGidMap?.length > 0) {
+        invCidToGidMap = Object.create(null);
+        for (let i = 0, ii = cidToGidMap.length; i < ii; i++) {
+          const gid = cidToGidMap[i];
+          if (gid !== undefined) {
+            invCidToGidMap[gid] = i;
+          }
+        }
+      }
+      charCodeToGlyphId = Object.create(null);
+      let charCode;
+      if (cff.isCIDFont) {
+        for (glyphId = 0; glyphId < charsets.length; glyphId++) {
+          const cid = charsets[glyphId];
+          charCode = cMap.charCodeOf(cid);
+          if (invCidToGidMap?.[charCode] !== undefined) {
+            charCode = invCidToGidMap[charCode];
+          }
+          charCodeToGlyphId[charCode] = glyphId;
+        }
+      } else {
+        for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
+          charCode = cMap.charCodeOf(glyphId);
+          charCodeToGlyphId[charCode] = glyphId;
+        }
+      }
+      return charCodeToGlyphId;
+    }
+    let encoding = cff.encoding ? cff.encoding.encoding : null;
+    if (properties.isInternalFont) {
+      encoding = properties.defaultEncoding;
+    }
+    charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);
+    return charCodeToGlyphId;
+  }
+  hasGlyphId(id) {
+    return this.cff.hasGlyphId(id);
+  }
+  _createBuiltInEncoding() {
+    const {
+      charset,
+      encoding
+    } = this.cff;
+    if (!charset || !encoding) {
+      return;
+    }
+    const charsets = charset.charset,
+      encodings = encoding.encoding;
+    const map = [];
+    for (const charCode in encodings) {
+      const glyphId = encodings[charCode];
+      if (glyphId >= 0) {
+        const glyphName = charsets[glyphId];
+        if (glyphName) {
+          map[charCode] = glyphName;
+        }
+      }
+    }
+    if (map.length > 0) {
+      this.properties.builtInEncoding = map;
+    }
+  }
+}
+
+;// ./src/core/font_renderer.js
+
+
+
+
+
+
+function getFloat214(view, offset) {
+  return view.getInt16(offset) / 16384;
+}
+function getSubroutineBias(subrs) {
+  const numSubrs = subrs.length;
+  if (numSubrs >= 33900) {
+    return 32768;
+  }
+  return numSubrs < 1240 ? 107 : 1131;
+}
+function parseCmap(data, start, end) {
+  const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
+  const offset = view.getUint16(start + 2) === 1 ? view.getUint32(start + 8) : view.getUint32(start + 16);
+  const format = view.getUint16(start + offset);
+  let ranges, p, i;
+  if (format === 4) {
+    const segCount = view.getUint16(start + offset + 6) >> 1;
+    p = start + offset + 14;
+    ranges = [];
+    for (i = 0; i < segCount; i++, p += 2) {
+      ranges[i] = {
+        end: view.getUint16(p)
+      };
+    }
+    p += 2;
+    for (i = 0; i < segCount; i++, p += 2) {
+      ranges[i].start = view.getUint16(p);
+    }
+    for (i = 0; i < segCount; i++, p += 2) {
+      ranges[i].idDelta = view.getUint16(p);
+    }
+    for (i = 0; i < segCount; i++, p += 2) {
+      let idOffset = view.getUint16(p);
+      if (idOffset === 0) {
+        continue;
+      }
+      ranges[i].ids = [];
+      for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
+        ranges[i].ids[j] = view.getUint16(p + idOffset);
+        idOffset += 2;
+      }
+    }
+    return ranges;
+  } else if (format === 12) {
+    const groups = view.getUint32(start + offset + 12);
+    p = start + offset + 16;
+    ranges = [];
+    for (i = 0; i < groups; i++) {
+      start = view.getUint32(p);
+      ranges.push({
+        start,
+        end: view.getUint32(p + 4),
+        idDelta: view.getUint32(p + 8) - start
+      });
+      p += 12;
+    }
+    return ranges;
+  }
+  throw new FormatError(`unsupported cmap: ${format}`);
+}
+function parseCff(data, start, end, seacAnalysisEnabled) {
+  const properties = {};
+  const parser = new CFFParser(new Stream(data, start, end - start), properties, seacAnalysisEnabled);
+  const cff = parser.parse();
+  return {
+    glyphs: cff.charStrings.objects,
+    subrs: cff.topDict.privateDict?.subrsIndex?.objects,
+    gsubrs: cff.globalSubrIndex?.objects,
+    isCFFCIDFont: cff.isCIDFont,
+    fdSelect: cff.fdSelect,
+    fdArray: cff.fdArray
+  };
+}
+function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
+  const view = new DataView(loca.buffer, loca.byteOffset, loca.byteLength);
+  let itemSize, itemDecode;
+  if (isGlyphLocationsLong) {
+    itemSize = 4;
+    itemDecode = (dv, offset) => dv.getUint32(offset);
+  } else {
+    itemSize = 2;
+    itemDecode = (dv, offset) => 2 * dv.getUint16(offset);
+  }
+  const glyphs = [];
+  let startOffset = itemDecode(view, 0);
+  for (let j = itemSize; j < loca.length; j += itemSize) {
+    const endOffset = itemDecode(view, j);
+    glyphs.push(glyf.subarray(startOffset, endOffset));
+    startOffset = endOffset;
+  }
+  return glyphs;
+}
+function lookupCmap(ranges, unicode) {
+  const code = unicode.codePointAt(0);
+  let gid = 0,
+    l = 0,
+    r = ranges.length - 1;
+  while (l < r) {
+    const c = l + r + 1 >> 1;
+    if (code < ranges[c].start) {
+      r = c - 1;
+    } else {
+      l = c;
+    }
+  }
+  if (ranges[l].start <= code && code <= ranges[l].end) {
+    gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff;
+  }
+  return {
+    charCode: code,
+    glyphId: gid
+  };
+}
+function compileGlyf(code, cmds, font, visitedGlyphs = new Set()) {
+  if (!code?.length) {
+    return;
+  }
+  if (visitedGlyphs.has(code)) {
+    warn("compileGlyf: skipping recursive composite glyph reference.");
+    return;
+  }
+  visitedGlyphs.add(code);
+  function moveTo(x, y) {
+    if (firstPoint) {
+      cmds.add(DrawOPS.lineTo, firstPoint);
+    }
+    firstPoint = [x, y];
+    cmds.add(DrawOPS.moveTo, [x, y]);
+  }
+  function lineTo(x, y) {
+    cmds.add(DrawOPS.lineTo, [x, y]);
+  }
+  function quadraticCurveTo(xa, ya, x, y) {
+    cmds.add(DrawOPS.quadraticCurveTo, [xa, ya, x, y]);
+  }
+  const view = new DataView(code.buffer, code.byteOffset, code.byteLength);
+  let i = 0;
+  const numberOfContours = view.getInt16(i);
+  let flags;
+  let firstPoint = null;
+  let x = 0,
+    y = 0;
+  i += 10;
+  if (numberOfContours < 0) {
+    do {
+      flags = view.getUint16(i);
+      const glyphIndex = view.getUint16(i + 2);
+      i += 4;
+      let arg1, arg2;
+      if (flags & 0x01) {
+        if (flags & 0x02) {
+          arg1 = view.getInt16(i);
+          arg2 = view.getInt16(i + 2);
+        } else {
+          arg1 = view.getUint16(i);
+          arg2 = view.getUint16(i + 2);
+        }
+        i += 4;
+      } else if (flags & 0x02) {
+        arg1 = view.getInt8(i++);
+        arg2 = view.getInt8(i++);
+      } else {
+        arg1 = code[i++];
+        arg2 = code[i++];
+      }
+      if (flags & 0x02) {
+        x = arg1;
+        y = arg2;
+      } else {
+        x = 0;
+        y = 0;
+      }
+      let scaleX = 1,
+        scaleY = 1,
+        scale01 = 0,
+        scale10 = 0;
+      if (flags & 0x08) {
+        scaleX = scaleY = getFloat214(view, i);
+        i += 2;
+      } else if (flags & 0x40) {
+        scaleX = getFloat214(view, i);
+        scaleY = getFloat214(view, i + 2);
+        i += 4;
+      } else if (flags & 0x80) {
+        scaleX = getFloat214(view, i);
+        scale01 = getFloat214(view, i + 2);
+        scale10 = getFloat214(view, i + 4);
+        scaleY = getFloat214(view, i + 6);
+        i += 8;
+      }
+      const subglyph = font.glyphs[glyphIndex];
+      if (subglyph) {
+        cmds.save();
+        cmds.transform([scaleX, scale01, scale10, scaleY, x, y]);
+        if (!(flags & 0x02)) {}
+        compileGlyf(subglyph, cmds, font, visitedGlyphs);
+        cmds.restore();
+      }
+    } while (flags & 0x20);
+  } else {
+    const endPtsOfContours = [];
+    let j, jj;
+    for (j = 0; j < numberOfContours; j++) {
+      endPtsOfContours.push(view.getUint16(i));
+      i += 2;
+    }
+    const instructionLength = view.getUint16(i);
+    i += 2 + instructionLength;
+    const numberOfPoints = endPtsOfContours.at(-1) + 1;
+    const points = [];
+    while (points.length < numberOfPoints) {
+      flags = code[i++];
+      let repeat = 1;
+      if (flags & 0x08) {
+        repeat += code[i++];
+      }
+      while (repeat-- > 0) {
+        points.push({
+          flags
+        });
+      }
+    }
+    for (j = 0; j < numberOfPoints; j++) {
+      switch (points[j].flags & 0x12) {
+        case 0x00:
+          x += view.getInt16(i);
+          i += 2;
+          break;
+        case 0x02:
+          x -= code[i++];
+          break;
+        case 0x12:
+          x += code[i++];
+          break;
+      }
+      points[j].x = x;
+    }
+    for (j = 0; j < numberOfPoints; j++) {
+      switch (points[j].flags & 0x24) {
+        case 0x00:
+          y += view.getInt16(i);
+          i += 2;
+          break;
+        case 0x04:
+          y -= code[i++];
+          break;
+        case 0x24:
+          y += code[i++];
+          break;
+      }
+      points[j].y = y;
+    }
+    let startPoint = 0;
+    for (i = 0; i < numberOfContours; i++) {
+      const endPoint = endPtsOfContours[i];
+      const contour = points.slice(startPoint, endPoint + 1);
+      if (contour[0].flags & 1) {
+        contour.push(contour[0]);
+      } else if (contour.at(-1).flags & 1) {
+        contour.unshift(contour.at(-1));
+      } else {
+        const p = {
+          flags: 1,
+          x: (contour[0].x + contour.at(-1).x) / 2,
+          y: (contour[0].y + contour.at(-1).y) / 2
+        };
+        contour.unshift(p);
+        contour.push(p);
+      }
+      moveTo(contour[0].x, contour[0].y);
+      for (j = 1, jj = contour.length; j < jj; j++) {
+        if (contour[j].flags & 1) {
+          lineTo(contour[j].x, contour[j].y);
+        } else if (contour[j + 1].flags & 1) {
+          quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);
+          j++;
+        } else {
+          quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2);
+        }
+      }
+      startPoint = endPoint + 1;
+    }
+  }
+  visitedGlyphs.delete(code);
+}
+function compileCharString(charStringCode, cmds, font, glyphId) {
+  function moveTo(x, y) {
+    if (firstPoint) {
+      cmds.add(DrawOPS.lineTo, firstPoint);
+    }
+    firstPoint = [x, y];
+    cmds.add(DrawOPS.moveTo, [x, y]);
+  }
+  function lineTo(x, y) {
+    cmds.add(DrawOPS.lineTo, [x, y]);
+  }
+  function bezierCurveTo(x1, y1, x2, y2, x, y) {
+    cmds.add(DrawOPS.curveTo, [x1, y1, x2, y2, x, y]);
+  }
+  const stack = [];
+  let x = 0,
+    y = 0;
+  let stems = 0;
+  let firstPoint = null;
+  function parse(code) {
+    const view = new DataView(code.buffer, code.byteOffset, code.byteLength);
+    let i = 0;
+    while (i < code.length) {
+      let stackClean = false;
+      let v = code[i++];
+      let xa, xb, ya, yb, y1, y2, y3, n, subrCode;
+      switch (v) {
+        case 1:
+          stems += stack.length >> 1;
+          stackClean = true;
+          break;
+        case 3:
+          stems += stack.length >> 1;
+          stackClean = true;
+          break;
+        case 4:
+          y += stack.pop();
+          moveTo(x, y);
+          stackClean = true;
+          break;
+        case 5:
+          while (stack.length > 0) {
+            x += stack.shift();
+            y += stack.shift();
+            lineTo(x, y);
+          }
+          break;
+        case 6:
+          while (stack.length > 0) {
+            x += stack.shift();
+            lineTo(x, y);
+            if (stack.length === 0) {
+              break;
+            }
+            y += stack.shift();
+            lineTo(x, y);
+          }
+          break;
+        case 7:
+          while (stack.length > 0) {
+            y += stack.shift();
+            lineTo(x, y);
+            if (stack.length === 0) {
+              break;
+            }
+            x += stack.shift();
+            lineTo(x, y);
+          }
+          break;
+        case 8:
+          while (stack.length > 0) {
+            xa = x + stack.shift();
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + stack.shift();
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+          break;
+        case 10:
+          n = stack.pop();
+          subrCode = null;
+          if (font.isCFFCIDFont) {
+            const fdIndex = font.fdSelect.getFDIndex(glyphId);
+            if (fdIndex >= 0 && fdIndex < font.fdArray.length) {
+              const fontDict = font.fdArray[fdIndex];
+              let subrs;
+              if (fontDict.privateDict?.subrsIndex) {
+                subrs = fontDict.privateDict.subrsIndex.objects;
+              }
+              if (subrs) {
+                n += getSubroutineBias(subrs);
+                subrCode = subrs[n];
+              }
+            } else {
+              warn("Invalid fd index for glyph index.");
+            }
+          } else {
+            subrCode = font.subrs[n + font.subrsBias];
+          }
+          if (subrCode) {
+            parse(subrCode);
+          }
+          break;
+        case 11:
+          return;
+        case 12:
+          v = code[i++];
+          switch (v) {
+            case 34:
+              xa = x + stack.shift();
+              xb = xa + stack.shift();
+              y1 = y + stack.shift();
+              x = xb + stack.shift();
+              bezierCurveTo(xa, y, xb, y1, x, y1);
+              xa = x + stack.shift();
+              xb = xa + stack.shift();
+              x = xb + stack.shift();
+              bezierCurveTo(xa, y1, xb, y, x, y);
+              break;
+            case 35:
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              stack.pop();
+              break;
+            case 36:
+              xa = x + stack.shift();
+              y1 = y + stack.shift();
+              xb = xa + stack.shift();
+              y2 = y1 + stack.shift();
+              x = xb + stack.shift();
+              bezierCurveTo(xa, y1, xb, y2, x, y2);
+              xa = x + stack.shift();
+              xb = xa + stack.shift();
+              y3 = y2 + stack.shift();
+              x = xb + stack.shift();
+              bezierCurveTo(xa, y2, xb, y3, x, y);
+              break;
+            case 37:
+              const x0 = x,
+                y0 = y;
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb;
+              y = yb;
+              if (Math.abs(x - x0) > Math.abs(y - y0)) {
+                x += stack.shift();
+              } else {
+                y += stack.shift();
+              }
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              break;
+            default:
+              throw new FormatError(`unknown operator: 12 ${v}`);
+          }
+          break;
+        case 14:
+          if (stack.length >= 4) {
+            const achar = stack.pop();
+            const bchar = stack.pop();
+            y = stack.pop();
+            x = stack.pop();
+            cmds.save();
+            cmds.translate(x, y);
+            let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]]));
+            compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
+            cmds.restore();
+            cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]]));
+            compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
+          }
+          return;
+        case 18:
+          stems += stack.length >> 1;
+          stackClean = true;
+          break;
+        case 19:
+          stems += stack.length >> 1;
+          i += stems + 7 >> 3;
+          stackClean = true;
+          break;
+        case 20:
+          stems += stack.length >> 1;
+          i += stems + 7 >> 3;
+          stackClean = true;
+          break;
+        case 21:
+          y += stack.pop();
+          x += stack.pop();
+          moveTo(x, y);
+          stackClean = true;
+          break;
+        case 22:
+          x += stack.pop();
+          moveTo(x, y);
+          stackClean = true;
+          break;
+        case 23:
+          stems += stack.length >> 1;
+          stackClean = true;
+          break;
+        case 24:
+          while (stack.length > 2) {
+            xa = x + stack.shift();
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + stack.shift();
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+          x += stack.shift();
+          y += stack.shift();
+          lineTo(x, y);
+          break;
+        case 25:
+          while (stack.length > 6) {
+            x += stack.shift();
+            y += stack.shift();
+            lineTo(x, y);
+          }
+          xa = x + stack.shift();
+          ya = y + stack.shift();
+          xb = xa + stack.shift();
+          yb = ya + stack.shift();
+          x = xb + stack.shift();
+          y = yb + stack.shift();
+          bezierCurveTo(xa, ya, xb, yb, x, y);
+          break;
+        case 26:
+          if (stack.length % 2) {
+            x += stack.shift();
+          }
+          while (stack.length > 0) {
+            xa = x;
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb;
+            y = yb + stack.shift();
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+          break;
+        case 27:
+          if (stack.length % 2) {
+            y += stack.shift();
+          }
+          while (stack.length > 0) {
+            xa = x + stack.shift();
+            ya = y;
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb;
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+          break;
+        case 28:
+          stack.push(view.getInt16(i));
+          i += 2;
+          break;
+        case 29:
+          n = stack.pop() + font.gsubrsBias;
+          subrCode = font.gsubrs[n];
+          if (subrCode) {
+            parse(subrCode);
+          }
+          break;
+        case 30:
+          while (stack.length > 0) {
+            xa = x;
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + (stack.length === 1 ? stack.shift() : 0);
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+            if (stack.length === 0) {
+              break;
+            }
+            xa = x + stack.shift();
+            ya = y;
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            y = yb + stack.shift();
+            x = xb + (stack.length === 1 ? stack.shift() : 0);
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+          break;
+        case 31:
+          while (stack.length > 0) {
+            xa = x + stack.shift();
+            ya = y;
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            y = yb + stack.shift();
+            x = xb + (stack.length === 1 ? stack.shift() : 0);
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+            if (stack.length === 0) {
+              break;
+            }
+            xa = x;
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + (stack.length === 1 ? stack.shift() : 0);
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+          }
+          break;
+        default:
+          if (v < 32) {
+            throw new FormatError(`unknown operator: ${v}`);
+          }
+          if (v < 247) {
+            stack.push(v - 139);
+          } else if (v < 251) {
+            stack.push((v - 247) * 256 + code[i++] + 108);
+          } else if (v < 255) {
+            stack.push(-(v - 251) * 256 - code[i++] - 108);
+          } else {
+            stack.push(view.getInt32(i) / 65536);
+            i += 4;
+          }
+          break;
+      }
+      if (stackClean) {
+        stack.length = 0;
+      }
+    }
+  }
+  parse(charStringCode);
+}
+class Commands {
+  cmds = [];
+  transformStack = [];
+  currentTransform = [1, 0, 0, 1, 0, 0];
+  add(cmd, args) {
+    if (args) {
+      const {
+        currentTransform
+      } = this;
+      for (let i = 0, ii = args.length; i < ii; i += 2) {
+        Util.applyTransform(args, currentTransform, i);
+      }
+      this.cmds.push(cmd, ...args);
+    } else {
+      this.cmds.push(cmd);
+    }
+  }
+  transform(transf) {
+    this.currentTransform = Util.transform(this.currentTransform, transf);
+  }
+  translate(x, y) {
+    this.transform([1, 0, 0, 1, x, y]);
+  }
+  save() {
+    this.transformStack.push(this.currentTransform.slice());
+  }
+  restore() {
+    this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0];
+  }
+  getPath() {
+    if (FeatureTest.isFloat16ArraySupported) {
+      return new Float16Array(this.cmds);
+    }
+    return new Float32Array(this.cmds);
+  }
+}
+class CompiledFont {
+  constructor(fontMatrix) {
+    this.fontMatrix = fontMatrix;
+    this.compiledGlyphs = Object.create(null);
+    this.compiledCharCodeToGlyphId = Object.create(null);
+  }
+  static get NOOP() {
+    return shadow(this, "NOOP", FeatureTest.isFloat16ArraySupported ? new Float16Array(0) : new Float32Array(0));
+  }
+  getPathJs(unicode) {
+    const {
+      charCode,
+      glyphId
+    } = lookupCmap(this.cmap, unicode);
+    let fn = this.compiledGlyphs[glyphId],
+      compileEx;
+    if (fn === undefined) {
+      try {
+        fn = this.compileGlyph(this.glyphs[glyphId], glyphId);
+      } catch (ex) {
+        fn = CompiledFont.NOOP;
+        compileEx = ex;
+      }
+      this.compiledGlyphs[glyphId] = fn;
+    }
+    this.compiledCharCodeToGlyphId[charCode] ??= glyphId;
+    if (compileEx) {
+      throw compileEx;
+    }
+    return fn;
+  }
+  compileGlyph(code, glyphId) {
+    if (!code?.length || code[0] === 14) {
+      return CompiledFont.NOOP;
+    }
+    let fontMatrix = this.fontMatrix;
+    if (this.isCFFCIDFont) {
+      const fdIndex = this.fdSelect.getFDIndex(glyphId);
+      if (fdIndex >= 0 && fdIndex < this.fdArray.length) {
+        const fontDict = this.fdArray[fdIndex];
+        fontMatrix = fontDict.getByName("FontMatrix") || FONT_IDENTITY_MATRIX;
+      } else {
+        warn("Invalid fd index for glyph index.");
+      }
+    }
+    assert(isNumberArray(fontMatrix, 6), "Expected a valid fontMatrix.");
+    const cmds = new Commands();
+    cmds.transform(fontMatrix.slice());
+    this.compileGlyphImpl(code, cmds, glyphId);
+    cmds.add(DrawOPS.closePath);
+    return cmds.getPath();
+  }
+  compileGlyphImpl() {
+    unreachable("Children classes should implement this.");
+  }
+  hasBuiltPath(unicode) {
+    const {
+      charCode,
+      glyphId
+    } = lookupCmap(this.cmap, unicode);
+    return this.compiledGlyphs[glyphId] !== undefined && this.compiledCharCodeToGlyphId[charCode] !== undefined;
+  }
+}
+class TrueTypeCompiled extends CompiledFont {
+  constructor(glyphs, cmap, fontMatrix) {
+    super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]);
+    this.glyphs = glyphs;
+    this.cmap = cmap;
+  }
+  compileGlyphImpl(code, cmds) {
+    compileGlyf(code, cmds, this);
+  }
+}
+class Type2Compiled extends CompiledFont {
+  constructor(cffInfo, cmap, fontMatrix) {
+    super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]);
+    this.glyphs = cffInfo.glyphs;
+    this.gsubrs = cffInfo.gsubrs || [];
+    this.subrs = cffInfo.subrs || [];
+    this.cmap = cmap;
+    this.glyphNameMap = getGlyphsUnicode();
+    this.gsubrsBias = getSubroutineBias(this.gsubrs);
+    this.subrsBias = getSubroutineBias(this.subrs);
+    this.isCFFCIDFont = cffInfo.isCFFCIDFont;
+    this.fdSelect = cffInfo.fdSelect;
+    this.fdArray = cffInfo.fdArray;
+  }
+  compileGlyphImpl(code, cmds, glyphId) {
+    compileCharString(code, cmds, this, glyphId);
+  }
+}
+class FontRendererFactory {
+  static create(font, seacAnalysisEnabled) {
+    const data = new Uint8Array(font.data),
+      view = new DataView(data.buffer);
+    let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
+    const numTables = view.getUint16(4);
+    for (let i = 0, p = 12; i < numTables; i++, p += 16) {
+      const tag = bytesToString(data.subarray(p, p + 4));
+      const offset = view.getUint32(p + 8);
+      const length = view.getUint32(p + 12);
+      switch (tag) {
+        case "cmap":
+          cmap = parseCmap(data, offset, offset + length);
+          break;
+        case "glyf":
+          glyf = data.subarray(offset, offset + length);
+          break;
+        case "loca":
+          loca = data.subarray(offset, offset + length);
+          break;
+        case "head":
+          unitsPerEm = view.getUint16(offset + 18);
+          indexToLocFormat = view.getUint16(offset + 50);
+          break;
+        case "CFF ":
+          cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);
+          break;
+      }
+    }
+    if (glyf) {
+      const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];
+      return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
+    }
+    return new Type2Compiled(cff, cmap, font.fontMatrix);
+  }
+}
+
+;// ./src/core/metrics.js
+
+const getMetrics = getLookupTableFactory(function (t) {
+  t.Courier = 600;
+  t["Courier-Bold"] = 600;
+  t["Courier-BoldOblique"] = 600;
+  t["Courier-Oblique"] = 600;
+  t.Helvetica = getLookupTableFactory(function (t) {
+    t.space = 278;
+    t.exclam = 278;
+    t.quotedbl = 355;
+    t.numbersign = 556;
+    t.dollar = 556;
+    t.percent = 889;
+    t.ampersand = 667;
+    t.quoteright = 222;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asterisk = 389;
+    t.plus = 584;
+    t.comma = 278;
+    t.hyphen = 333;
+    t.period = 278;
+    t.slash = 278;
+    t.zero = 556;
+    t.one = 556;
+    t.two = 556;
+    t.three = 556;
+    t.four = 556;
+    t.five = 556;
+    t.six = 556;
+    t.seven = 556;
+    t.eight = 556;
+    t.nine = 556;
+    t.colon = 278;
+    t.semicolon = 278;
+    t.less = 584;
+    t.equal = 584;
+    t.greater = 584;
+    t.question = 556;
+    t.at = 1015;
+    t.A = 667;
+    t.B = 667;
+    t.C = 722;
+    t.D = 722;
+    t.E = 667;
+    t.F = 611;
+    t.G = 778;
+    t.H = 722;
+    t.I = 278;
+    t.J = 500;
+    t.K = 667;
+    t.L = 556;
+    t.M = 833;
+    t.N = 722;
+    t.O = 778;
+    t.P = 667;
+    t.Q = 778;
+    t.R = 722;
+    t.S = 667;
+    t.T = 611;
+    t.U = 722;
+    t.V = 667;
+    t.W = 944;
+    t.X = 667;
+    t.Y = 667;
+    t.Z = 611;
+    t.bracketleft = 278;
+    t.backslash = 278;
+    t.bracketright = 278;
+    t.asciicircum = 469;
+    t.underscore = 556;
+    t.quoteleft = 222;
+    t.a = 556;
+    t.b = 556;
+    t.c = 500;
+    t.d = 556;
+    t.e = 556;
+    t.f = 278;
+    t.g = 556;
+    t.h = 556;
+    t.i = 222;
+    t.j = 222;
+    t.k = 500;
+    t.l = 222;
+    t.m = 833;
+    t.n = 556;
+    t.o = 556;
+    t.p = 556;
+    t.q = 556;
+    t.r = 333;
+    t.s = 500;
+    t.t = 278;
+    t.u = 556;
+    t.v = 500;
+    t.w = 722;
+    t.x = 500;
+    t.y = 500;
+    t.z = 500;
+    t.braceleft = 334;
+    t.bar = 260;
+    t.braceright = 334;
+    t.asciitilde = 584;
+    t.exclamdown = 333;
+    t.cent = 556;
+    t.sterling = 556;
+    t.fraction = 167;
+    t.yen = 556;
+    t.florin = 556;
+    t.section = 556;
+    t.currency = 556;
+    t.quotesingle = 191;
+    t.quotedblleft = 333;
+    t.guillemotleft = 556;
+    t.guilsinglleft = 333;
+    t.guilsinglright = 333;
+    t.fi = 500;
+    t.fl = 500;
+    t.endash = 556;
+    t.dagger = 556;
+    t.daggerdbl = 556;
+    t.periodcentered = 278;
+    t.paragraph = 537;
+    t.bullet = 350;
+    t.quotesinglbase = 222;
+    t.quotedblbase = 333;
+    t.quotedblright = 333;
+    t.guillemotright = 556;
+    t.ellipsis = 1000;
+    t.perthousand = 1000;
+    t.questiondown = 611;
+    t.grave = 333;
+    t.acute = 333;
+    t.circumflex = 333;
+    t.tilde = 333;
+    t.macron = 333;
+    t.breve = 333;
+    t.dotaccent = 333;
+    t.dieresis = 333;
+    t.ring = 333;
+    t.cedilla = 333;
+    t.hungarumlaut = 333;
+    t.ogonek = 333;
+    t.caron = 333;
+    t.emdash = 1000;
+    t.AE = 1000;
+    t.ordfeminine = 370;
+    t.Lslash = 556;
+    t.Oslash = 778;
+    t.OE = 1000;
+    t.ordmasculine = 365;
+    t.ae = 889;
+    t.dotlessi = 278;
+    t.lslash = 222;
+    t.oslash = 611;
+    t.oe = 944;
+    t.germandbls = 611;
+    t.Idieresis = 278;
+    t.eacute = 556;
+    t.abreve = 556;
+    t.uhungarumlaut = 556;
+    t.ecaron = 556;
+    t.Ydieresis = 667;
+    t.divide = 584;
+    t.Yacute = 667;
+    t.Acircumflex = 667;
+    t.aacute = 556;
+    t.Ucircumflex = 722;
+    t.yacute = 500;
+    t.scommaaccent = 500;
+    t.ecircumflex = 556;
+    t.Uring = 722;
+    t.Udieresis = 722;
+    t.aogonek = 556;
+    t.Uacute = 722;
+    t.uogonek = 556;
+    t.Edieresis = 667;
+    t.Dcroat = 722;
+    t.commaaccent = 250;
+    t.copyright = 737;
+    t.Emacron = 667;
+    t.ccaron = 500;
+    t.aring = 556;
+    t.Ncommaaccent = 722;
+    t.lacute = 222;
+    t.agrave = 556;
+    t.Tcommaaccent = 611;
+    t.Cacute = 722;
+    t.atilde = 556;
+    t.Edotaccent = 667;
+    t.scaron = 500;
+    t.scedilla = 500;
+    t.iacute = 278;
+    t.lozenge = 471;
+    t.Rcaron = 722;
+    t.Gcommaaccent = 778;
+    t.ucircumflex = 556;
+    t.acircumflex = 556;
+    t.Amacron = 667;
+    t.rcaron = 333;
+    t.ccedilla = 500;
+    t.Zdotaccent = 611;
+    t.Thorn = 667;
+    t.Omacron = 778;
+    t.Racute = 722;
+    t.Sacute = 667;
+    t.dcaron = 643;
+    t.Umacron = 722;
+    t.uring = 556;
+    t.threesuperior = 333;
+    t.Ograve = 778;
+    t.Agrave = 667;
+    t.Abreve = 667;
+    t.multiply = 584;
+    t.uacute = 556;
+    t.Tcaron = 611;
+    t.partialdiff = 476;
+    t.ydieresis = 500;
+    t.Nacute = 722;
+    t.icircumflex = 278;
+    t.Ecircumflex = 667;
+    t.adieresis = 556;
+    t.edieresis = 556;
+    t.cacute = 500;
+    t.nacute = 556;
+    t.umacron = 556;
+    t.Ncaron = 722;
+    t.Iacute = 278;
+    t.plusminus = 584;
+    t.brokenbar = 260;
+    t.registered = 737;
+    t.Gbreve = 778;
+    t.Idotaccent = 278;
+    t.summation = 600;
+    t.Egrave = 667;
+    t.racute = 333;
+    t.omacron = 556;
+    t.Zacute = 611;
+    t.Zcaron = 611;
+    t.greaterequal = 549;
+    t.Eth = 722;
+    t.Ccedilla = 722;
+    t.lcommaaccent = 222;
+    t.tcaron = 317;
+    t.eogonek = 556;
+    t.Uogonek = 722;
+    t.Aacute = 667;
+    t.Adieresis = 667;
+    t.egrave = 556;
+    t.zacute = 500;
+    t.iogonek = 222;
+    t.Oacute = 778;
+    t.oacute = 556;
+    t.amacron = 556;
+    t.sacute = 500;
+    t.idieresis = 278;
+    t.Ocircumflex = 778;
+    t.Ugrave = 722;
+    t.Delta = 612;
+    t.thorn = 556;
+    t.twosuperior = 333;
+    t.Odieresis = 778;
+    t.mu = 556;
+    t.igrave = 278;
+    t.ohungarumlaut = 556;
+    t.Eogonek = 667;
+    t.dcroat = 556;
+    t.threequarters = 834;
+    t.Scedilla = 667;
+    t.lcaron = 299;
+    t.Kcommaaccent = 667;
+    t.Lacute = 556;
+    t.trademark = 1000;
+    t.edotaccent = 556;
+    t.Igrave = 278;
+    t.Imacron = 278;
+    t.Lcaron = 556;
+    t.onehalf = 834;
+    t.lessequal = 549;
+    t.ocircumflex = 556;
+    t.ntilde = 556;
+    t.Uhungarumlaut = 722;
+    t.Eacute = 667;
+    t.emacron = 556;
+    t.gbreve = 556;
+    t.onequarter = 834;
+    t.Scaron = 667;
+    t.Scommaaccent = 667;
+    t.Ohungarumlaut = 778;
+    t.degree = 400;
+    t.ograve = 556;
+    t.Ccaron = 722;
+    t.ugrave = 556;
+    t.radical = 453;
+    t.Dcaron = 722;
+    t.rcommaaccent = 333;
+    t.Ntilde = 722;
+    t.otilde = 556;
+    t.Rcommaaccent = 722;
+    t.Lcommaaccent = 556;
+    t.Atilde = 667;
+    t.Aogonek = 667;
+    t.Aring = 667;
+    t.Otilde = 778;
+    t.zdotaccent = 500;
+    t.Ecaron = 667;
+    t.Iogonek = 278;
+    t.kcommaaccent = 500;
+    t.minus = 584;
+    t.Icircumflex = 278;
+    t.ncaron = 556;
+    t.tcommaaccent = 278;
+    t.logicalnot = 584;
+    t.odieresis = 556;
+    t.udieresis = 556;
+    t.notequal = 549;
+    t.gcommaaccent = 556;
+    t.eth = 556;
+    t.zcaron = 500;
+    t.ncommaaccent = 556;
+    t.onesuperior = 333;
+    t.imacron = 278;
+    t.Euro = 556;
+  });
+  t["Helvetica-Bold"] = getLookupTableFactory(function (t) {
+    t.space = 278;
+    t.exclam = 333;
+    t.quotedbl = 474;
+    t.numbersign = 556;
+    t.dollar = 556;
+    t.percent = 889;
+    t.ampersand = 722;
+    t.quoteright = 278;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asterisk = 389;
+    t.plus = 584;
+    t.comma = 278;
+    t.hyphen = 333;
+    t.period = 278;
+    t.slash = 278;
+    t.zero = 556;
+    t.one = 556;
+    t.two = 556;
+    t.three = 556;
+    t.four = 556;
+    t.five = 556;
+    t.six = 556;
+    t.seven = 556;
+    t.eight = 556;
+    t.nine = 556;
+    t.colon = 333;
+    t.semicolon = 333;
+    t.less = 584;
+    t.equal = 584;
+    t.greater = 584;
+    t.question = 611;
+    t.at = 975;
+    t.A = 722;
+    t.B = 722;
+    t.C = 722;
+    t.D = 722;
+    t.E = 667;
+    t.F = 611;
+    t.G = 778;
+    t.H = 722;
+    t.I = 278;
+    t.J = 556;
+    t.K = 722;
+    t.L = 611;
+    t.M = 833;
+    t.N = 722;
+    t.O = 778;
+    t.P = 667;
+    t.Q = 778;
+    t.R = 722;
+    t.S = 667;
+    t.T = 611;
+    t.U = 722;
+    t.V = 667;
+    t.W = 944;
+    t.X = 667;
+    t.Y = 667;
+    t.Z = 611;
+    t.bracketleft = 333;
+    t.backslash = 278;
+    t.bracketright = 333;
+    t.asciicircum = 584;
+    t.underscore = 556;
+    t.quoteleft = 278;
+    t.a = 556;
+    t.b = 611;
+    t.c = 556;
+    t.d = 611;
+    t.e = 556;
+    t.f = 333;
+    t.g = 611;
+    t.h = 611;
+    t.i = 278;
+    t.j = 278;
+    t.k = 556;
+    t.l = 278;
+    t.m = 889;
+    t.n = 611;
+    t.o = 611;
+    t.p = 611;
+    t.q = 611;
+    t.r = 389;
+    t.s = 556;
+    t.t = 333;
+    t.u = 611;
+    t.v = 556;
+    t.w = 778;
+    t.x = 556;
+    t.y = 556;
+    t.z = 500;
+    t.braceleft = 389;
+    t.bar = 280;
+    t.braceright = 389;
+    t.asciitilde = 584;
+    t.exclamdown = 333;
+    t.cent = 556;
+    t.sterling = 556;
+    t.fraction = 167;
+    t.yen = 556;
+    t.florin = 556;
+    t.section = 556;
+    t.currency = 556;
+    t.quotesingle = 238;
+    t.quotedblleft = 500;
+    t.guillemotleft = 556;
+    t.guilsinglleft = 333;
+    t.guilsinglright = 333;
+    t.fi = 611;
+    t.fl = 611;
+    t.endash = 556;
+    t.dagger = 556;
+    t.daggerdbl = 556;
+    t.periodcentered = 278;
+    t.paragraph = 556;
+    t.bullet = 350;
+    t.quotesinglbase = 278;
+    t.quotedblbase = 500;
+    t.quotedblright = 500;
+    t.guillemotright = 556;
+    t.ellipsis = 1000;
+    t.perthousand = 1000;
+    t.questiondown = 611;
+    t.grave = 333;
+    t.acute = 333;
+    t.circumflex = 333;
+    t.tilde = 333;
+    t.macron = 333;
+    t.breve = 333;
+    t.dotaccent = 333;
+    t.dieresis = 333;
+    t.ring = 333;
+    t.cedilla = 333;
+    t.hungarumlaut = 333;
+    t.ogonek = 333;
+    t.caron = 333;
+    t.emdash = 1000;
+    t.AE = 1000;
+    t.ordfeminine = 370;
+    t.Lslash = 611;
+    t.Oslash = 778;
+    t.OE = 1000;
+    t.ordmasculine = 365;
+    t.ae = 889;
+    t.dotlessi = 278;
+    t.lslash = 278;
+    t.oslash = 611;
+    t.oe = 944;
+    t.germandbls = 611;
+    t.Idieresis = 278;
+    t.eacute = 556;
+    t.abreve = 556;
+    t.uhungarumlaut = 611;
+    t.ecaron = 556;
+    t.Ydieresis = 667;
+    t.divide = 584;
+    t.Yacute = 667;
+    t.Acircumflex = 722;
+    t.aacute = 556;
+    t.Ucircumflex = 722;
+    t.yacute = 556;
+    t.scommaaccent = 556;
+    t.ecircumflex = 556;
+    t.Uring = 722;
+    t.Udieresis = 722;
+    t.aogonek = 556;
+    t.Uacute = 722;
+    t.uogonek = 611;
+    t.Edieresis = 667;
+    t.Dcroat = 722;
+    t.commaaccent = 250;
+    t.copyright = 737;
+    t.Emacron = 667;
+    t.ccaron = 556;
+    t.aring = 556;
+    t.Ncommaaccent = 722;
+    t.lacute = 278;
+    t.agrave = 556;
+    t.Tcommaaccent = 611;
+    t.Cacute = 722;
+    t.atilde = 556;
+    t.Edotaccent = 667;
+    t.scaron = 556;
+    t.scedilla = 556;
+    t.iacute = 278;
+    t.lozenge = 494;
+    t.Rcaron = 722;
+    t.Gcommaaccent = 778;
+    t.ucircumflex = 611;
+    t.acircumflex = 556;
+    t.Amacron = 722;
+    t.rcaron = 389;
+    t.ccedilla = 556;
+    t.Zdotaccent = 611;
+    t.Thorn = 667;
+    t.Omacron = 778;
+    t.Racute = 722;
+    t.Sacute = 667;
+    t.dcaron = 743;
+    t.Umacron = 722;
+    t.uring = 611;
+    t.threesuperior = 333;
+    t.Ograve = 778;
+    t.Agrave = 722;
+    t.Abreve = 722;
+    t.multiply = 584;
+    t.uacute = 611;
+    t.Tcaron = 611;
+    t.partialdiff = 494;
+    t.ydieresis = 556;
+    t.Nacute = 722;
+    t.icircumflex = 278;
+    t.Ecircumflex = 667;
+    t.adieresis = 556;
+    t.edieresis = 556;
+    t.cacute = 556;
+    t.nacute = 611;
+    t.umacron = 611;
+    t.Ncaron = 722;
+    t.Iacute = 278;
+    t.plusminus = 584;
+    t.brokenbar = 280;
+    t.registered = 737;
+    t.Gbreve = 778;
+    t.Idotaccent = 278;
+    t.summation = 600;
+    t.Egrave = 667;
+    t.racute = 389;
+    t.omacron = 611;
+    t.Zacute = 611;
+    t.Zcaron = 611;
+    t.greaterequal = 549;
+    t.Eth = 722;
+    t.Ccedilla = 722;
+    t.lcommaaccent = 278;
+    t.tcaron = 389;
+    t.eogonek = 556;
+    t.Uogonek = 722;
+    t.Aacute = 722;
+    t.Adieresis = 722;
+    t.egrave = 556;
+    t.zacute = 500;
+    t.iogonek = 278;
+    t.Oacute = 778;
+    t.oacute = 611;
+    t.amacron = 556;
+    t.sacute = 556;
+    t.idieresis = 278;
+    t.Ocircumflex = 778;
+    t.Ugrave = 722;
+    t.Delta = 612;
+    t.thorn = 611;
+    t.twosuperior = 333;
+    t.Odieresis = 778;
+    t.mu = 611;
+    t.igrave = 278;
+    t.ohungarumlaut = 611;
+    t.Eogonek = 667;
+    t.dcroat = 611;
+    t.threequarters = 834;
+    t.Scedilla = 667;
+    t.lcaron = 400;
+    t.Kcommaaccent = 722;
+    t.Lacute = 611;
+    t.trademark = 1000;
+    t.edotaccent = 556;
+    t.Igrave = 278;
+    t.Imacron = 278;
+    t.Lcaron = 611;
+    t.onehalf = 834;
+    t.lessequal = 549;
+    t.ocircumflex = 611;
+    t.ntilde = 611;
+    t.Uhungarumlaut = 722;
+    t.Eacute = 667;
+    t.emacron = 556;
+    t.gbreve = 611;
+    t.onequarter = 834;
+    t.Scaron = 667;
+    t.Scommaaccent = 667;
+    t.Ohungarumlaut = 778;
+    t.degree = 400;
+    t.ograve = 611;
+    t.Ccaron = 722;
+    t.ugrave = 611;
+    t.radical = 549;
+    t.Dcaron = 722;
+    t.rcommaaccent = 389;
+    t.Ntilde = 722;
+    t.otilde = 611;
+    t.Rcommaaccent = 722;
+    t.Lcommaaccent = 611;
+    t.Atilde = 722;
+    t.Aogonek = 722;
+    t.Aring = 722;
+    t.Otilde = 778;
+    t.zdotaccent = 500;
+    t.Ecaron = 667;
+    t.Iogonek = 278;
+    t.kcommaaccent = 556;
+    t.minus = 584;
+    t.Icircumflex = 278;
+    t.ncaron = 611;
+    t.tcommaaccent = 333;
+    t.logicalnot = 584;
+    t.odieresis = 611;
+    t.udieresis = 611;
+    t.notequal = 549;
+    t.gcommaaccent = 611;
+    t.eth = 611;
+    t.zcaron = 500;
+    t.ncommaaccent = 611;
+    t.onesuperior = 333;
+    t.imacron = 278;
+    t.Euro = 556;
+  });
+  t["Helvetica-BoldOblique"] = getLookupTableFactory(function (t) {
+    t.space = 278;
+    t.exclam = 333;
+    t.quotedbl = 474;
+    t.numbersign = 556;
+    t.dollar = 556;
+    t.percent = 889;
+    t.ampersand = 722;
+    t.quoteright = 278;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asterisk = 389;
+    t.plus = 584;
+    t.comma = 278;
+    t.hyphen = 333;
+    t.period = 278;
+    t.slash = 278;
+    t.zero = 556;
+    t.one = 556;
+    t.two = 556;
+    t.three = 556;
+    t.four = 556;
+    t.five = 556;
+    t.six = 556;
+    t.seven = 556;
+    t.eight = 556;
+    t.nine = 556;
+    t.colon = 333;
+    t.semicolon = 333;
+    t.less = 584;
+    t.equal = 584;
+    t.greater = 584;
+    t.question = 611;
+    t.at = 975;
+    t.A = 722;
+    t.B = 722;
+    t.C = 722;
+    t.D = 722;
+    t.E = 667;
+    t.F = 611;
+    t.G = 778;
+    t.H = 722;
+    t.I = 278;
+    t.J = 556;
+    t.K = 722;
+    t.L = 611;
+    t.M = 833;
+    t.N = 722;
+    t.O = 778;
+    t.P = 667;
+    t.Q = 778;
+    t.R = 722;
+    t.S = 667;
+    t.T = 611;
+    t.U = 722;
+    t.V = 667;
+    t.W = 944;
+    t.X = 667;
+    t.Y = 667;
+    t.Z = 611;
+    t.bracketleft = 333;
+    t.backslash = 278;
+    t.bracketright = 333;
+    t.asciicircum = 584;
+    t.underscore = 556;
+    t.quoteleft = 278;
+    t.a = 556;
+    t.b = 611;
+    t.c = 556;
+    t.d = 611;
+    t.e = 556;
+    t.f = 333;
+    t.g = 611;
+    t.h = 611;
+    t.i = 278;
+    t.j = 278;
+    t.k = 556;
+    t.l = 278;
+    t.m = 889;
+    t.n = 611;
+    t.o = 611;
+    t.p = 611;
+    t.q = 611;
+    t.r = 389;
+    t.s = 556;
+    t.t = 333;
+    t.u = 611;
+    t.v = 556;
+    t.w = 778;
+    t.x = 556;
+    t.y = 556;
+    t.z = 500;
+    t.braceleft = 389;
+    t.bar = 280;
+    t.braceright = 389;
+    t.asciitilde = 584;
+    t.exclamdown = 333;
+    t.cent = 556;
+    t.sterling = 556;
+    t.fraction = 167;
+    t.yen = 556;
+    t.florin = 556;
+    t.section = 556;
+    t.currency = 556;
+    t.quotesingle = 238;
+    t.quotedblleft = 500;
+    t.guillemotleft = 556;
+    t.guilsinglleft = 333;
+    t.guilsinglright = 333;
+    t.fi = 611;
+    t.fl = 611;
+    t.endash = 556;
+    t.dagger = 556;
+    t.daggerdbl = 556;
+    t.periodcentered = 278;
+    t.paragraph = 556;
+    t.bullet = 350;
+    t.quotesinglbase = 278;
+    t.quotedblbase = 500;
+    t.quotedblright = 500;
+    t.guillemotright = 556;
+    t.ellipsis = 1000;
+    t.perthousand = 1000;
+    t.questiondown = 611;
+    t.grave = 333;
+    t.acute = 333;
+    t.circumflex = 333;
+    t.tilde = 333;
+    t.macron = 333;
+    t.breve = 333;
+    t.dotaccent = 333;
+    t.dieresis = 333;
+    t.ring = 333;
+    t.cedilla = 333;
+    t.hungarumlaut = 333;
+    t.ogonek = 333;
+    t.caron = 333;
+    t.emdash = 1000;
+    t.AE = 1000;
+    t.ordfeminine = 370;
+    t.Lslash = 611;
+    t.Oslash = 778;
+    t.OE = 1000;
+    t.ordmasculine = 365;
+    t.ae = 889;
+    t.dotlessi = 278;
+    t.lslash = 278;
+    t.oslash = 611;
+    t.oe = 944;
+    t.germandbls = 611;
+    t.Idieresis = 278;
+    t.eacute = 556;
+    t.abreve = 556;
+    t.uhungarumlaut = 611;
+    t.ecaron = 556;
+    t.Ydieresis = 667;
+    t.divide = 584;
+    t.Yacute = 667;
+    t.Acircumflex = 722;
+    t.aacute = 556;
+    t.Ucircumflex = 722;
+    t.yacute = 556;
+    t.scommaaccent = 556;
+    t.ecircumflex = 556;
+    t.Uring = 722;
+    t.Udieresis = 722;
+    t.aogonek = 556;
+    t.Uacute = 722;
+    t.uogonek = 611;
+    t.Edieresis = 667;
+    t.Dcroat = 722;
+    t.commaaccent = 250;
+    t.copyright = 737;
+    t.Emacron = 667;
+    t.ccaron = 556;
+    t.aring = 556;
+    t.Ncommaaccent = 722;
+    t.lacute = 278;
+    t.agrave = 556;
+    t.Tcommaaccent = 611;
+    t.Cacute = 722;
+    t.atilde = 556;
+    t.Edotaccent = 667;
+    t.scaron = 556;
+    t.scedilla = 556;
+    t.iacute = 278;
+    t.lozenge = 494;
+    t.Rcaron = 722;
+    t.Gcommaaccent = 778;
+    t.ucircumflex = 611;
+    t.acircumflex = 556;
+    t.Amacron = 722;
+    t.rcaron = 389;
+    t.ccedilla = 556;
+    t.Zdotaccent = 611;
+    t.Thorn = 667;
+    t.Omacron = 778;
+    t.Racute = 722;
+    t.Sacute = 667;
+    t.dcaron = 743;
+    t.Umacron = 722;
+    t.uring = 611;
+    t.threesuperior = 333;
+    t.Ograve = 778;
+    t.Agrave = 722;
+    t.Abreve = 722;
+    t.multiply = 584;
+    t.uacute = 611;
+    t.Tcaron = 611;
+    t.partialdiff = 494;
+    t.ydieresis = 556;
+    t.Nacute = 722;
+    t.icircumflex = 278;
+    t.Ecircumflex = 667;
+    t.adieresis = 556;
+    t.edieresis = 556;
+    t.cacute = 556;
+    t.nacute = 611;
+    t.umacron = 611;
+    t.Ncaron = 722;
+    t.Iacute = 278;
+    t.plusminus = 584;
+    t.brokenbar = 280;
+    t.registered = 737;
+    t.Gbreve = 778;
+    t.Idotaccent = 278;
+    t.summation = 600;
+    t.Egrave = 667;
+    t.racute = 389;
+    t.omacron = 611;
+    t.Zacute = 611;
+    t.Zcaron = 611;
+    t.greaterequal = 549;
+    t.Eth = 722;
+    t.Ccedilla = 722;
+    t.lcommaaccent = 278;
+    t.tcaron = 389;
+    t.eogonek = 556;
+    t.Uogonek = 722;
+    t.Aacute = 722;
+    t.Adieresis = 722;
+    t.egrave = 556;
+    t.zacute = 500;
+    t.iogonek = 278;
+    t.Oacute = 778;
+    t.oacute = 611;
+    t.amacron = 556;
+    t.sacute = 556;
+    t.idieresis = 278;
+    t.Ocircumflex = 778;
+    t.Ugrave = 722;
+    t.Delta = 612;
+    t.thorn = 611;
+    t.twosuperior = 333;
+    t.Odieresis = 778;
+    t.mu = 611;
+    t.igrave = 278;
+    t.ohungarumlaut = 611;
+    t.Eogonek = 667;
+    t.dcroat = 611;
+    t.threequarters = 834;
+    t.Scedilla = 667;
+    t.lcaron = 400;
+    t.Kcommaaccent = 722;
+    t.Lacute = 611;
+    t.trademark = 1000;
+    t.edotaccent = 556;
+    t.Igrave = 278;
+    t.Imacron = 278;
+    t.Lcaron = 611;
+    t.onehalf = 834;
+    t.lessequal = 549;
+    t.ocircumflex = 611;
+    t.ntilde = 611;
+    t.Uhungarumlaut = 722;
+    t.Eacute = 667;
+    t.emacron = 556;
+    t.gbreve = 611;
+    t.onequarter = 834;
+    t.Scaron = 667;
+    t.Scommaaccent = 667;
+    t.Ohungarumlaut = 778;
+    t.degree = 400;
+    t.ograve = 611;
+    t.Ccaron = 722;
+    t.ugrave = 611;
+    t.radical = 549;
+    t.Dcaron = 722;
+    t.rcommaaccent = 389;
+    t.Ntilde = 722;
+    t.otilde = 611;
+    t.Rcommaaccent = 722;
+    t.Lcommaaccent = 611;
+    t.Atilde = 722;
+    t.Aogonek = 722;
+    t.Aring = 722;
+    t.Otilde = 778;
+    t.zdotaccent = 500;
+    t.Ecaron = 667;
+    t.Iogonek = 278;
+    t.kcommaaccent = 556;
+    t.minus = 584;
+    t.Icircumflex = 278;
+    t.ncaron = 611;
+    t.tcommaaccent = 333;
+    t.logicalnot = 584;
+    t.odieresis = 611;
+    t.udieresis = 611;
+    t.notequal = 549;
+    t.gcommaaccent = 611;
+    t.eth = 611;
+    t.zcaron = 500;
+    t.ncommaaccent = 611;
+    t.onesuperior = 333;
+    t.imacron = 278;
+    t.Euro = 556;
+  });
+  t["Helvetica-Oblique"] = getLookupTableFactory(function (t) {
+    t.space = 278;
+    t.exclam = 278;
+    t.quotedbl = 355;
+    t.numbersign = 556;
+    t.dollar = 556;
+    t.percent = 889;
+    t.ampersand = 667;
+    t.quoteright = 222;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asterisk = 389;
+    t.plus = 584;
+    t.comma = 278;
+    t.hyphen = 333;
+    t.period = 278;
+    t.slash = 278;
+    t.zero = 556;
+    t.one = 556;
+    t.two = 556;
+    t.three = 556;
+    t.four = 556;
+    t.five = 556;
+    t.six = 556;
+    t.seven = 556;
+    t.eight = 556;
+    t.nine = 556;
+    t.colon = 278;
+    t.semicolon = 278;
+    t.less = 584;
+    t.equal = 584;
+    t.greater = 584;
+    t.question = 556;
+    t.at = 1015;
+    t.A = 667;
+    t.B = 667;
+    t.C = 722;
+    t.D = 722;
+    t.E = 667;
+    t.F = 611;
+    t.G = 778;
+    t.H = 722;
+    t.I = 278;
+    t.J = 500;
+    t.K = 667;
+    t.L = 556;
+    t.M = 833;
+    t.N = 722;
+    t.O = 778;
+    t.P = 667;
+    t.Q = 778;
+    t.R = 722;
+    t.S = 667;
+    t.T = 611;
+    t.U = 722;
+    t.V = 667;
+    t.W = 944;
+    t.X = 667;
+    t.Y = 667;
+    t.Z = 611;
+    t.bracketleft = 278;
+    t.backslash = 278;
+    t.bracketright = 278;
+    t.asciicircum = 469;
+    t.underscore = 556;
+    t.quoteleft = 222;
+    t.a = 556;
+    t.b = 556;
+    t.c = 500;
+    t.d = 556;
+    t.e = 556;
+    t.f = 278;
+    t.g = 556;
+    t.h = 556;
+    t.i = 222;
+    t.j = 222;
+    t.k = 500;
+    t.l = 222;
+    t.m = 833;
+    t.n = 556;
+    t.o = 556;
+    t.p = 556;
+    t.q = 556;
+    t.r = 333;
+    t.s = 500;
+    t.t = 278;
+    t.u = 556;
+    t.v = 500;
+    t.w = 722;
+    t.x = 500;
+    t.y = 500;
+    t.z = 500;
+    t.braceleft = 334;
+    t.bar = 260;
+    t.braceright = 334;
+    t.asciitilde = 584;
+    t.exclamdown = 333;
+    t.cent = 556;
+    t.sterling = 556;
+    t.fraction = 167;
+    t.yen = 556;
+    t.florin = 556;
+    t.section = 556;
+    t.currency = 556;
+    t.quotesingle = 191;
+    t.quotedblleft = 333;
+    t.guillemotleft = 556;
+    t.guilsinglleft = 333;
+    t.guilsinglright = 333;
+    t.fi = 500;
+    t.fl = 500;
+    t.endash = 556;
+    t.dagger = 556;
+    t.daggerdbl = 556;
+    t.periodcentered = 278;
+    t.paragraph = 537;
+    t.bullet = 350;
+    t.quotesinglbase = 222;
+    t.quotedblbase = 333;
+    t.quotedblright = 333;
+    t.guillemotright = 556;
+    t.ellipsis = 1000;
+    t.perthousand = 1000;
+    t.questiondown = 611;
+    t.grave = 333;
+    t.acute = 333;
+    t.circumflex = 333;
+    t.tilde = 333;
+    t.macron = 333;
+    t.breve = 333;
+    t.dotaccent = 333;
+    t.dieresis = 333;
+    t.ring = 333;
+    t.cedilla = 333;
+    t.hungarumlaut = 333;
+    t.ogonek = 333;
+    t.caron = 333;
+    t.emdash = 1000;
+    t.AE = 1000;
+    t.ordfeminine = 370;
+    t.Lslash = 556;
+    t.Oslash = 778;
+    t.OE = 1000;
+    t.ordmasculine = 365;
+    t.ae = 889;
+    t.dotlessi = 278;
+    t.lslash = 222;
+    t.oslash = 611;
+    t.oe = 944;
+    t.germandbls = 611;
+    t.Idieresis = 278;
+    t.eacute = 556;
+    t.abreve = 556;
+    t.uhungarumlaut = 556;
+    t.ecaron = 556;
+    t.Ydieresis = 667;
+    t.divide = 584;
+    t.Yacute = 667;
+    t.Acircumflex = 667;
+    t.aacute = 556;
+    t.Ucircumflex = 722;
+    t.yacute = 500;
+    t.scommaaccent = 500;
+    t.ecircumflex = 556;
+    t.Uring = 722;
+    t.Udieresis = 722;
+    t.aogonek = 556;
+    t.Uacute = 722;
+    t.uogonek = 556;
+    t.Edieresis = 667;
+    t.Dcroat = 722;
+    t.commaaccent = 250;
+    t.copyright = 737;
+    t.Emacron = 667;
+    t.ccaron = 500;
+    t.aring = 556;
+    t.Ncommaaccent = 722;
+    t.lacute = 222;
+    t.agrave = 556;
+    t.Tcommaaccent = 611;
+    t.Cacute = 722;
+    t.atilde = 556;
+    t.Edotaccent = 667;
+    t.scaron = 500;
+    t.scedilla = 500;
+    t.iacute = 278;
+    t.lozenge = 471;
+    t.Rcaron = 722;
+    t.Gcommaaccent = 778;
+    t.ucircumflex = 556;
+    t.acircumflex = 556;
+    t.Amacron = 667;
+    t.rcaron = 333;
+    t.ccedilla = 500;
+    t.Zdotaccent = 611;
+    t.Thorn = 667;
+    t.Omacron = 778;
+    t.Racute = 722;
+    t.Sacute = 667;
+    t.dcaron = 643;
+    t.Umacron = 722;
+    t.uring = 556;
+    t.threesuperior = 333;
+    t.Ograve = 778;
+    t.Agrave = 667;
+    t.Abreve = 667;
+    t.multiply = 584;
+    t.uacute = 556;
+    t.Tcaron = 611;
+    t.partialdiff = 476;
+    t.ydieresis = 500;
+    t.Nacute = 722;
+    t.icircumflex = 278;
+    t.Ecircumflex = 667;
+    t.adieresis = 556;
+    t.edieresis = 556;
+    t.cacute = 500;
+    t.nacute = 556;
+    t.umacron = 556;
+    t.Ncaron = 722;
+    t.Iacute = 278;
+    t.plusminus = 584;
+    t.brokenbar = 260;
+    t.registered = 737;
+    t.Gbreve = 778;
+    t.Idotaccent = 278;
+    t.summation = 600;
+    t.Egrave = 667;
+    t.racute = 333;
+    t.omacron = 556;
+    t.Zacute = 611;
+    t.Zcaron = 611;
+    t.greaterequal = 549;
+    t.Eth = 722;
+    t.Ccedilla = 722;
+    t.lcommaaccent = 222;
+    t.tcaron = 317;
+    t.eogonek = 556;
+    t.Uogonek = 722;
+    t.Aacute = 667;
+    t.Adieresis = 667;
+    t.egrave = 556;
+    t.zacute = 500;
+    t.iogonek = 222;
+    t.Oacute = 778;
+    t.oacute = 556;
+    t.amacron = 556;
+    t.sacute = 500;
+    t.idieresis = 278;
+    t.Ocircumflex = 778;
+    t.Ugrave = 722;
+    t.Delta = 612;
+    t.thorn = 556;
+    t.twosuperior = 333;
+    t.Odieresis = 778;
+    t.mu = 556;
+    t.igrave = 278;
+    t.ohungarumlaut = 556;
+    t.Eogonek = 667;
+    t.dcroat = 556;
+    t.threequarters = 834;
+    t.Scedilla = 667;
+    t.lcaron = 299;
+    t.Kcommaaccent = 667;
+    t.Lacute = 556;
+    t.trademark = 1000;
+    t.edotaccent = 556;
+    t.Igrave = 278;
+    t.Imacron = 278;
+    t.Lcaron = 556;
+    t.onehalf = 834;
+    t.lessequal = 549;
+    t.ocircumflex = 556;
+    t.ntilde = 556;
+    t.Uhungarumlaut = 722;
+    t.Eacute = 667;
+    t.emacron = 556;
+    t.gbreve = 556;
+    t.onequarter = 834;
+    t.Scaron = 667;
+    t.Scommaaccent = 667;
+    t.Ohungarumlaut = 778;
+    t.degree = 400;
+    t.ograve = 556;
+    t.Ccaron = 722;
+    t.ugrave = 556;
+    t.radical = 453;
+    t.Dcaron = 722;
+    t.rcommaaccent = 333;
+    t.Ntilde = 722;
+    t.otilde = 556;
+    t.Rcommaaccent = 722;
+    t.Lcommaaccent = 556;
+    t.Atilde = 667;
+    t.Aogonek = 667;
+    t.Aring = 667;
+    t.Otilde = 778;
+    t.zdotaccent = 500;
+    t.Ecaron = 667;
+    t.Iogonek = 278;
+    t.kcommaaccent = 500;
+    t.minus = 584;
+    t.Icircumflex = 278;
+    t.ncaron = 556;
+    t.tcommaaccent = 278;
+    t.logicalnot = 584;
+    t.odieresis = 556;
+    t.udieresis = 556;
+    t.notequal = 549;
+    t.gcommaaccent = 556;
+    t.eth = 556;
+    t.zcaron = 500;
+    t.ncommaaccent = 556;
+    t.onesuperior = 333;
+    t.imacron = 278;
+    t.Euro = 556;
+  });
+  t.Symbol = getLookupTableFactory(function (t) {
+    t.space = 250;
+    t.exclam = 333;
+    t.universal = 713;
+    t.numbersign = 500;
+    t.existential = 549;
+    t.percent = 833;
+    t.ampersand = 778;
+    t.suchthat = 439;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asteriskmath = 500;
+    t.plus = 549;
+    t.comma = 250;
+    t.minus = 549;
+    t.period = 250;
+    t.slash = 278;
+    t.zero = 500;
+    t.one = 500;
+    t.two = 500;
+    t.three = 500;
+    t.four = 500;
+    t.five = 500;
+    t.six = 500;
+    t.seven = 500;
+    t.eight = 500;
+    t.nine = 500;
+    t.colon = 278;
+    t.semicolon = 278;
+    t.less = 549;
+    t.equal = 549;
+    t.greater = 549;
+    t.question = 444;
+    t.congruent = 549;
+    t.Alpha = 722;
+    t.Beta = 667;
+    t.Chi = 722;
+    t.Delta = 612;
+    t.Epsilon = 611;
+    t.Phi = 763;
+    t.Gamma = 603;
+    t.Eta = 722;
+    t.Iota = 333;
+    t.theta1 = 631;
+    t.Kappa = 722;
+    t.Lambda = 686;
+    t.Mu = 889;
+    t.Nu = 722;
+    t.Omicron = 722;
+    t.Pi = 768;
+    t.Theta = 741;
+    t.Rho = 556;
+    t.Sigma = 592;
+    t.Tau = 611;
+    t.Upsilon = 690;
+    t.sigma1 = 439;
+    t.Omega = 768;
+    t.Xi = 645;
+    t.Psi = 795;
+    t.Zeta = 611;
+    t.bracketleft = 333;
+    t.therefore = 863;
+    t.bracketright = 333;
+    t.perpendicular = 658;
+    t.underscore = 500;
+    t.radicalex = 500;
+    t.alpha = 631;
+    t.beta = 549;
+    t.chi = 549;
+    t.delta = 494;
+    t.epsilon = 439;
+    t.phi = 521;
+    t.gamma = 411;
+    t.eta = 603;
+    t.iota = 329;
+    t.phi1 = 603;
+    t.kappa = 549;
+    t.lambda = 549;
+    t.mu = 576;
+    t.nu = 521;
+    t.omicron = 549;
+    t.pi = 549;
+    t.theta = 521;
+    t.rho = 549;
+    t.sigma = 603;
+    t.tau = 439;
+    t.upsilon = 576;
+    t.omega1 = 713;
+    t.omega = 686;
+    t.xi = 493;
+    t.psi = 686;
+    t.zeta = 494;
+    t.braceleft = 480;
+    t.bar = 200;
+    t.braceright = 480;
+    t.similar = 549;
+    t.Euro = 750;
+    t.Upsilon1 = 620;
+    t.minute = 247;
+    t.lessequal = 549;
+    t.fraction = 167;
+    t.infinity = 713;
+    t.florin = 500;
+    t.club = 753;
+    t.diamond = 753;
+    t.heart = 753;
+    t.spade = 753;
+    t.arrowboth = 1042;
+    t.arrowleft = 987;
+    t.arrowup = 603;
+    t.arrowright = 987;
+    t.arrowdown = 603;
+    t.degree = 400;
+    t.plusminus = 549;
+    t.second = 411;
+    t.greaterequal = 549;
+    t.multiply = 549;
+    t.proportional = 713;
+    t.partialdiff = 494;
+    t.bullet = 460;
+    t.divide = 549;
+    t.notequal = 549;
+    t.equivalence = 549;
+    t.approxequal = 549;
+    t.ellipsis = 1000;
+    t.arrowvertex = 603;
+    t.arrowhorizex = 1000;
+    t.carriagereturn = 658;
+    t.aleph = 823;
+    t.Ifraktur = 686;
+    t.Rfraktur = 795;
+    t.weierstrass = 987;
+    t.circlemultiply = 768;
+    t.circleplus = 768;
+    t.emptyset = 823;
+    t.intersection = 768;
+    t.union = 768;
+    t.propersuperset = 713;
+    t.reflexsuperset = 713;
+    t.notsubset = 713;
+    t.propersubset = 713;
+    t.reflexsubset = 713;
+    t.element = 713;
+    t.notelement = 713;
+    t.angle = 768;
+    t.gradient = 713;
+    t.registerserif = 790;
+    t.copyrightserif = 790;
+    t.trademarkserif = 890;
+    t.product = 823;
+    t.radical = 549;
+    t.dotmath = 250;
+    t.logicalnot = 713;
+    t.logicaland = 603;
+    t.logicalor = 603;
+    t.arrowdblboth = 1042;
+    t.arrowdblleft = 987;
+    t.arrowdblup = 603;
+    t.arrowdblright = 987;
+    t.arrowdbldown = 603;
+    t.lozenge = 494;
+    t.angleleft = 329;
+    t.registersans = 790;
+    t.copyrightsans = 790;
+    t.trademarksans = 786;
+    t.summation = 713;
+    t.parenlefttp = 384;
+    t.parenleftex = 384;
+    t.parenleftbt = 384;
+    t.bracketlefttp = 384;
+    t.bracketleftex = 384;
+    t.bracketleftbt = 384;
+    t.bracelefttp = 494;
+    t.braceleftmid = 494;
+    t.braceleftbt = 494;
+    t.braceex = 494;
+    t.angleright = 329;
+    t.integral = 274;
+    t.integraltp = 686;
+    t.integralex = 686;
+    t.integralbt = 686;
+    t.parenrighttp = 384;
+    t.parenrightex = 384;
+    t.parenrightbt = 384;
+    t.bracketrighttp = 384;
+    t.bracketrightex = 384;
+    t.bracketrightbt = 384;
+    t.bracerighttp = 494;
+    t.bracerightmid = 494;
+    t.bracerightbt = 494;
+    t.apple = 790;
+  });
+  t["Times-Roman"] = getLookupTableFactory(function (t) {
+    t.space = 250;
+    t.exclam = 333;
+    t.quotedbl = 408;
+    t.numbersign = 500;
+    t.dollar = 500;
+    t.percent = 833;
+    t.ampersand = 778;
+    t.quoteright = 333;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asterisk = 500;
+    t.plus = 564;
+    t.comma = 250;
+    t.hyphen = 333;
+    t.period = 250;
+    t.slash = 278;
+    t.zero = 500;
+    t.one = 500;
+    t.two = 500;
+    t.three = 500;
+    t.four = 500;
+    t.five = 500;
+    t.six = 500;
+    t.seven = 500;
+    t.eight = 500;
+    t.nine = 500;
+    t.colon = 278;
+    t.semicolon = 278;
+    t.less = 564;
+    t.equal = 564;
+    t.greater = 564;
+    t.question = 444;
+    t.at = 921;
+    t.A = 722;
+    t.B = 667;
+    t.C = 667;
+    t.D = 722;
+    t.E = 611;
+    t.F = 556;
+    t.G = 722;
+    t.H = 722;
+    t.I = 333;
+    t.J = 389;
+    t.K = 722;
+    t.L = 611;
+    t.M = 889;
+    t.N = 722;
+    t.O = 722;
+    t.P = 556;
+    t.Q = 722;
+    t.R = 667;
+    t.S = 556;
+    t.T = 611;
+    t.U = 722;
+    t.V = 722;
+    t.W = 944;
+    t.X = 722;
+    t.Y = 722;
+    t.Z = 611;
+    t.bracketleft = 333;
+    t.backslash = 278;
+    t.bracketright = 333;
+    t.asciicircum = 469;
+    t.underscore = 500;
+    t.quoteleft = 333;
+    t.a = 444;
+    t.b = 500;
+    t.c = 444;
+    t.d = 500;
+    t.e = 444;
+    t.f = 333;
+    t.g = 500;
+    t.h = 500;
+    t.i = 278;
+    t.j = 278;
+    t.k = 500;
+    t.l = 278;
+    t.m = 778;
+    t.n = 500;
+    t.o = 500;
+    t.p = 500;
+    t.q = 500;
+    t.r = 333;
+    t.s = 389;
+    t.t = 278;
+    t.u = 500;
+    t.v = 500;
+    t.w = 722;
+    t.x = 500;
+    t.y = 500;
+    t.z = 444;
+    t.braceleft = 480;
+    t.bar = 200;
+    t.braceright = 480;
+    t.asciitilde = 541;
+    t.exclamdown = 333;
+    t.cent = 500;
+    t.sterling = 500;
+    t.fraction = 167;
+    t.yen = 500;
+    t.florin = 500;
+    t.section = 500;
+    t.currency = 500;
+    t.quotesingle = 180;
+    t.quotedblleft = 444;
+    t.guillemotleft = 500;
+    t.guilsinglleft = 333;
+    t.guilsinglright = 333;
+    t.fi = 556;
+    t.fl = 556;
+    t.endash = 500;
+    t.dagger = 500;
+    t.daggerdbl = 500;
+    t.periodcentered = 250;
+    t.paragraph = 453;
+    t.bullet = 350;
+    t.quotesinglbase = 333;
+    t.quotedblbase = 444;
+    t.quotedblright = 444;
+    t.guillemotright = 500;
+    t.ellipsis = 1000;
+    t.perthousand = 1000;
+    t.questiondown = 444;
+    t.grave = 333;
+    t.acute = 333;
+    t.circumflex = 333;
+    t.tilde = 333;
+    t.macron = 333;
+    t.breve = 333;
+    t.dotaccent = 333;
+    t.dieresis = 333;
+    t.ring = 333;
+    t.cedilla = 333;
+    t.hungarumlaut = 333;
+    t.ogonek = 333;
+    t.caron = 333;
+    t.emdash = 1000;
+    t.AE = 889;
+    t.ordfeminine = 276;
+    t.Lslash = 611;
+    t.Oslash = 722;
+    t.OE = 889;
+    t.ordmasculine = 310;
+    t.ae = 667;
+    t.dotlessi = 278;
+    t.lslash = 278;
+    t.oslash = 500;
+    t.oe = 722;
+    t.germandbls = 500;
+    t.Idieresis = 333;
+    t.eacute = 444;
+    t.abreve = 444;
+    t.uhungarumlaut = 500;
+    t.ecaron = 444;
+    t.Ydieresis = 722;
+    t.divide = 564;
+    t.Yacute = 722;
+    t.Acircumflex = 722;
+    t.aacute = 444;
+    t.Ucircumflex = 722;
+    t.yacute = 500;
+    t.scommaaccent = 389;
+    t.ecircumflex = 444;
+    t.Uring = 722;
+    t.Udieresis = 722;
+    t.aogonek = 444;
+    t.Uacute = 722;
+    t.uogonek = 500;
+    t.Edieresis = 611;
+    t.Dcroat = 722;
+    t.commaaccent = 250;
+    t.copyright = 760;
+    t.Emacron = 611;
+    t.ccaron = 444;
+    t.aring = 444;
+    t.Ncommaaccent = 722;
+    t.lacute = 278;
+    t.agrave = 444;
+    t.Tcommaaccent = 611;
+    t.Cacute = 667;
+    t.atilde = 444;
+    t.Edotaccent = 611;
+    t.scaron = 389;
+    t.scedilla = 389;
+    t.iacute = 278;
+    t.lozenge = 471;
+    t.Rcaron = 667;
+    t.Gcommaaccent = 722;
+    t.ucircumflex = 500;
+    t.acircumflex = 444;
+    t.Amacron = 722;
+    t.rcaron = 333;
+    t.ccedilla = 444;
+    t.Zdotaccent = 611;
+    t.Thorn = 556;
+    t.Omacron = 722;
+    t.Racute = 667;
+    t.Sacute = 556;
+    t.dcaron = 588;
+    t.Umacron = 722;
+    t.uring = 500;
+    t.threesuperior = 300;
+    t.Ograve = 722;
+    t.Agrave = 722;
+    t.Abreve = 722;
+    t.multiply = 564;
+    t.uacute = 500;
+    t.Tcaron = 611;
+    t.partialdiff = 476;
+    t.ydieresis = 500;
+    t.Nacute = 722;
+    t.icircumflex = 278;
+    t.Ecircumflex = 611;
+    t.adieresis = 444;
+    t.edieresis = 444;
+    t.cacute = 444;
+    t.nacute = 500;
+    t.umacron = 500;
+    t.Ncaron = 722;
+    t.Iacute = 333;
+    t.plusminus = 564;
+    t.brokenbar = 200;
+    t.registered = 760;
+    t.Gbreve = 722;
+    t.Idotaccent = 333;
+    t.summation = 600;
+    t.Egrave = 611;
+    t.racute = 333;
+    t.omacron = 500;
+    t.Zacute = 611;
+    t.Zcaron = 611;
+    t.greaterequal = 549;
+    t.Eth = 722;
+    t.Ccedilla = 667;
+    t.lcommaaccent = 278;
+    t.tcaron = 326;
+    t.eogonek = 444;
+    t.Uogonek = 722;
+    t.Aacute = 722;
+    t.Adieresis = 722;
+    t.egrave = 444;
+    t.zacute = 444;
+    t.iogonek = 278;
+    t.Oacute = 722;
+    t.oacute = 500;
+    t.amacron = 444;
+    t.sacute = 389;
+    t.idieresis = 278;
+    t.Ocircumflex = 722;
+    t.Ugrave = 722;
+    t.Delta = 612;
+    t.thorn = 500;
+    t.twosuperior = 300;
+    t.Odieresis = 722;
+    t.mu = 500;
+    t.igrave = 278;
+    t.ohungarumlaut = 500;
+    t.Eogonek = 611;
+    t.dcroat = 500;
+    t.threequarters = 750;
+    t.Scedilla = 556;
+    t.lcaron = 344;
+    t.Kcommaaccent = 722;
+    t.Lacute = 611;
+    t.trademark = 980;
+    t.edotaccent = 444;
+    t.Igrave = 333;
+    t.Imacron = 333;
+    t.Lcaron = 611;
+    t.onehalf = 750;
+    t.lessequal = 549;
+    t.ocircumflex = 500;
+    t.ntilde = 500;
+    t.Uhungarumlaut = 722;
+    t.Eacute = 611;
+    t.emacron = 444;
+    t.gbreve = 500;
+    t.onequarter = 750;
+    t.Scaron = 556;
+    t.Scommaaccent = 556;
+    t.Ohungarumlaut = 722;
+    t.degree = 400;
+    t.ograve = 500;
+    t.Ccaron = 667;
+    t.ugrave = 500;
+    t.radical = 453;
+    t.Dcaron = 722;
+    t.rcommaaccent = 333;
+    t.Ntilde = 722;
+    t.otilde = 500;
+    t.Rcommaaccent = 667;
+    t.Lcommaaccent = 611;
+    t.Atilde = 722;
+    t.Aogonek = 722;
+    t.Aring = 722;
+    t.Otilde = 722;
+    t.zdotaccent = 444;
+    t.Ecaron = 611;
+    t.Iogonek = 333;
+    t.kcommaaccent = 500;
+    t.minus = 564;
+    t.Icircumflex = 333;
+    t.ncaron = 500;
+    t.tcommaaccent = 278;
+    t.logicalnot = 564;
+    t.odieresis = 500;
+    t.udieresis = 500;
+    t.notequal = 549;
+    t.gcommaaccent = 500;
+    t.eth = 500;
+    t.zcaron = 444;
+    t.ncommaaccent = 500;
+    t.onesuperior = 300;
+    t.imacron = 278;
+    t.Euro = 500;
+  });
+  t["Times-Bold"] = getLookupTableFactory(function (t) {
+    t.space = 250;
+    t.exclam = 333;
+    t.quotedbl = 555;
+    t.numbersign = 500;
+    t.dollar = 500;
+    t.percent = 1000;
+    t.ampersand = 833;
+    t.quoteright = 333;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asterisk = 500;
+    t.plus = 570;
+    t.comma = 250;
+    t.hyphen = 333;
+    t.period = 250;
+    t.slash = 278;
+    t.zero = 500;
+    t.one = 500;
+    t.two = 500;
+    t.three = 500;
+    t.four = 500;
+    t.five = 500;
+    t.six = 500;
+    t.seven = 500;
+    t.eight = 500;
+    t.nine = 500;
+    t.colon = 333;
+    t.semicolon = 333;
+    t.less = 570;
+    t.equal = 570;
+    t.greater = 570;
+    t.question = 500;
+    t.at = 930;
+    t.A = 722;
+    t.B = 667;
+    t.C = 722;
+    t.D = 722;
+    t.E = 667;
+    t.F = 611;
+    t.G = 778;
+    t.H = 778;
+    t.I = 389;
+    t.J = 500;
+    t.K = 778;
+    t.L = 667;
+    t.M = 944;
+    t.N = 722;
+    t.O = 778;
+    t.P = 611;
+    t.Q = 778;
+    t.R = 722;
+    t.S = 556;
+    t.T = 667;
+    t.U = 722;
+    t.V = 722;
+    t.W = 1000;
+    t.X = 722;
+    t.Y = 722;
+    t.Z = 667;
+    t.bracketleft = 333;
+    t.backslash = 278;
+    t.bracketright = 333;
+    t.asciicircum = 581;
+    t.underscore = 500;
+    t.quoteleft = 333;
+    t.a = 500;
+    t.b = 556;
+    t.c = 444;
+    t.d = 556;
+    t.e = 444;
+    t.f = 333;
+    t.g = 500;
+    t.h = 556;
+    t.i = 278;
+    t.j = 333;
+    t.k = 556;
+    t.l = 278;
+    t.m = 833;
+    t.n = 556;
+    t.o = 500;
+    t.p = 556;
+    t.q = 556;
+    t.r = 444;
+    t.s = 389;
+    t.t = 333;
+    t.u = 556;
+    t.v = 500;
+    t.w = 722;
+    t.x = 500;
+    t.y = 500;
+    t.z = 444;
+    t.braceleft = 394;
+    t.bar = 220;
+    t.braceright = 394;
+    t.asciitilde = 520;
+    t.exclamdown = 333;
+    t.cent = 500;
+    t.sterling = 500;
+    t.fraction = 167;
+    t.yen = 500;
+    t.florin = 500;
+    t.section = 500;
+    t.currency = 500;
+    t.quotesingle = 278;
+    t.quotedblleft = 500;
+    t.guillemotleft = 500;
+    t.guilsinglleft = 333;
+    t.guilsinglright = 333;
+    t.fi = 556;
+    t.fl = 556;
+    t.endash = 500;
+    t.dagger = 500;
+    t.daggerdbl = 500;
+    t.periodcentered = 250;
+    t.paragraph = 540;
+    t.bullet = 350;
+    t.quotesinglbase = 333;
+    t.quotedblbase = 500;
+    t.quotedblright = 500;
+    t.guillemotright = 500;
+    t.ellipsis = 1000;
+    t.perthousand = 1000;
+    t.questiondown = 500;
+    t.grave = 333;
+    t.acute = 333;
+    t.circumflex = 333;
+    t.tilde = 333;
+    t.macron = 333;
+    t.breve = 333;
+    t.dotaccent = 333;
+    t.dieresis = 333;
+    t.ring = 333;
+    t.cedilla = 333;
+    t.hungarumlaut = 333;
+    t.ogonek = 333;
+    t.caron = 333;
+    t.emdash = 1000;
+    t.AE = 1000;
+    t.ordfeminine = 300;
+    t.Lslash = 667;
+    t.Oslash = 778;
+    t.OE = 1000;
+    t.ordmasculine = 330;
+    t.ae = 722;
+    t.dotlessi = 278;
+    t.lslash = 278;
+    t.oslash = 500;
+    t.oe = 722;
+    t.germandbls = 556;
+    t.Idieresis = 389;
+    t.eacute = 444;
+    t.abreve = 500;
+    t.uhungarumlaut = 556;
+    t.ecaron = 444;
+    t.Ydieresis = 722;
+    t.divide = 570;
+    t.Yacute = 722;
+    t.Acircumflex = 722;
+    t.aacute = 500;
+    t.Ucircumflex = 722;
+    t.yacute = 500;
+    t.scommaaccent = 389;
+    t.ecircumflex = 444;
+    t.Uring = 722;
+    t.Udieresis = 722;
+    t.aogonek = 500;
+    t.Uacute = 722;
+    t.uogonek = 556;
+    t.Edieresis = 667;
+    t.Dcroat = 722;
+    t.commaaccent = 250;
+    t.copyright = 747;
+    t.Emacron = 667;
+    t.ccaron = 444;
+    t.aring = 500;
+    t.Ncommaaccent = 722;
+    t.lacute = 278;
+    t.agrave = 500;
+    t.Tcommaaccent = 667;
+    t.Cacute = 722;
+    t.atilde = 500;
+    t.Edotaccent = 667;
+    t.scaron = 389;
+    t.scedilla = 389;
+    t.iacute = 278;
+    t.lozenge = 494;
+    t.Rcaron = 722;
+    t.Gcommaaccent = 778;
+    t.ucircumflex = 556;
+    t.acircumflex = 500;
+    t.Amacron = 722;
+    t.rcaron = 444;
+    t.ccedilla = 444;
+    t.Zdotaccent = 667;
+    t.Thorn = 611;
+    t.Omacron = 778;
+    t.Racute = 722;
+    t.Sacute = 556;
+    t.dcaron = 672;
+    t.Umacron = 722;
+    t.uring = 556;
+    t.threesuperior = 300;
+    t.Ograve = 778;
+    t.Agrave = 722;
+    t.Abreve = 722;
+    t.multiply = 570;
+    t.uacute = 556;
+    t.Tcaron = 667;
+    t.partialdiff = 494;
+    t.ydieresis = 500;
+    t.Nacute = 722;
+    t.icircumflex = 278;
+    t.Ecircumflex = 667;
+    t.adieresis = 500;
+    t.edieresis = 444;
+    t.cacute = 444;
+    t.nacute = 556;
+    t.umacron = 556;
+    t.Ncaron = 722;
+    t.Iacute = 389;
+    t.plusminus = 570;
+    t.brokenbar = 220;
+    t.registered = 747;
+    t.Gbreve = 778;
+    t.Idotaccent = 389;
+    t.summation = 600;
+    t.Egrave = 667;
+    t.racute = 444;
+    t.omacron = 500;
+    t.Zacute = 667;
+    t.Zcaron = 667;
+    t.greaterequal = 549;
+    t.Eth = 722;
+    t.Ccedilla = 722;
+    t.lcommaaccent = 278;
+    t.tcaron = 416;
+    t.eogonek = 444;
+    t.Uogonek = 722;
+    t.Aacute = 722;
+    t.Adieresis = 722;
+    t.egrave = 444;
+    t.zacute = 444;
+    t.iogonek = 278;
+    t.Oacute = 778;
+    t.oacute = 500;
+    t.amacron = 500;
+    t.sacute = 389;
+    t.idieresis = 278;
+    t.Ocircumflex = 778;
+    t.Ugrave = 722;
+    t.Delta = 612;
+    t.thorn = 556;
+    t.twosuperior = 300;
+    t.Odieresis = 778;
+    t.mu = 556;
+    t.igrave = 278;
+    t.ohungarumlaut = 500;
+    t.Eogonek = 667;
+    t.dcroat = 556;
+    t.threequarters = 750;
+    t.Scedilla = 556;
+    t.lcaron = 394;
+    t.Kcommaaccent = 778;
+    t.Lacute = 667;
+    t.trademark = 1000;
+    t.edotaccent = 444;
+    t.Igrave = 389;
+    t.Imacron = 389;
+    t.Lcaron = 667;
+    t.onehalf = 750;
+    t.lessequal = 549;
+    t.ocircumflex = 500;
+    t.ntilde = 556;
+    t.Uhungarumlaut = 722;
+    t.Eacute = 667;
+    t.emacron = 444;
+    t.gbreve = 500;
+    t.onequarter = 750;
+    t.Scaron = 556;
+    t.Scommaaccent = 556;
+    t.Ohungarumlaut = 778;
+    t.degree = 400;
+    t.ograve = 500;
+    t.Ccaron = 722;
+    t.ugrave = 556;
+    t.radical = 549;
+    t.Dcaron = 722;
+    t.rcommaaccent = 444;
+    t.Ntilde = 722;
+    t.otilde = 500;
+    t.Rcommaaccent = 722;
+    t.Lcommaaccent = 667;
+    t.Atilde = 722;
+    t.Aogonek = 722;
+    t.Aring = 722;
+    t.Otilde = 778;
+    t.zdotaccent = 444;
+    t.Ecaron = 667;
+    t.Iogonek = 389;
+    t.kcommaaccent = 556;
+    t.minus = 570;
+    t.Icircumflex = 389;
+    t.ncaron = 556;
+    t.tcommaaccent = 333;
+    t.logicalnot = 570;
+    t.odieresis = 500;
+    t.udieresis = 556;
+    t.notequal = 549;
+    t.gcommaaccent = 500;
+    t.eth = 500;
+    t.zcaron = 444;
+    t.ncommaaccent = 556;
+    t.onesuperior = 300;
+    t.imacron = 278;
+    t.Euro = 500;
+  });
+  t["Times-BoldItalic"] = getLookupTableFactory(function (t) {
+    t.space = 250;
+    t.exclam = 389;
+    t.quotedbl = 555;
+    t.numbersign = 500;
+    t.dollar = 500;
+    t.percent = 833;
+    t.ampersand = 778;
+    t.quoteright = 333;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asterisk = 500;
+    t.plus = 570;
+    t.comma = 250;
+    t.hyphen = 333;
+    t.period = 250;
+    t.slash = 278;
+    t.zero = 500;
+    t.one = 500;
+    t.two = 500;
+    t.three = 500;
+    t.four = 500;
+    t.five = 500;
+    t.six = 500;
+    t.seven = 500;
+    t.eight = 500;
+    t.nine = 500;
+    t.colon = 333;
+    t.semicolon = 333;
+    t.less = 570;
+    t.equal = 570;
+    t.greater = 570;
+    t.question = 500;
+    t.at = 832;
+    t.A = 667;
+    t.B = 667;
+    t.C = 667;
+    t.D = 722;
+    t.E = 667;
+    t.F = 667;
+    t.G = 722;
+    t.H = 778;
+    t.I = 389;
+    t.J = 500;
+    t.K = 667;
+    t.L = 611;
+    t.M = 889;
+    t.N = 722;
+    t.O = 722;
+    t.P = 611;
+    t.Q = 722;
+    t.R = 667;
+    t.S = 556;
+    t.T = 611;
+    t.U = 722;
+    t.V = 667;
+    t.W = 889;
+    t.X = 667;
+    t.Y = 611;
+    t.Z = 611;
+    t.bracketleft = 333;
+    t.backslash = 278;
+    t.bracketright = 333;
+    t.asciicircum = 570;
+    t.underscore = 500;
+    t.quoteleft = 333;
+    t.a = 500;
+    t.b = 500;
+    t.c = 444;
+    t.d = 500;
+    t.e = 444;
+    t.f = 333;
+    t.g = 500;
+    t.h = 556;
+    t.i = 278;
+    t.j = 278;
+    t.k = 500;
+    t.l = 278;
+    t.m = 778;
+    t.n = 556;
+    t.o = 500;
+    t.p = 500;
+    t.q = 500;
+    t.r = 389;
+    t.s = 389;
+    t.t = 278;
+    t.u = 556;
+    t.v = 444;
+    t.w = 667;
+    t.x = 500;
+    t.y = 444;
+    t.z = 389;
+    t.braceleft = 348;
+    t.bar = 220;
+    t.braceright = 348;
+    t.asciitilde = 570;
+    t.exclamdown = 389;
+    t.cent = 500;
+    t.sterling = 500;
+    t.fraction = 167;
+    t.yen = 500;
+    t.florin = 500;
+    t.section = 500;
+    t.currency = 500;
+    t.quotesingle = 278;
+    t.quotedblleft = 500;
+    t.guillemotleft = 500;
+    t.guilsinglleft = 333;
+    t.guilsinglright = 333;
+    t.fi = 556;
+    t.fl = 556;
+    t.endash = 500;
+    t.dagger = 500;
+    t.daggerdbl = 500;
+    t.periodcentered = 250;
+    t.paragraph = 500;
+    t.bullet = 350;
+    t.quotesinglbase = 333;
+    t.quotedblbase = 500;
+    t.quotedblright = 500;
+    t.guillemotright = 500;
+    t.ellipsis = 1000;
+    t.perthousand = 1000;
+    t.questiondown = 500;
+    t.grave = 333;
+    t.acute = 333;
+    t.circumflex = 333;
+    t.tilde = 333;
+    t.macron = 333;
+    t.breve = 333;
+    t.dotaccent = 333;
+    t.dieresis = 333;
+    t.ring = 333;
+    t.cedilla = 333;
+    t.hungarumlaut = 333;
+    t.ogonek = 333;
+    t.caron = 333;
+    t.emdash = 1000;
+    t.AE = 944;
+    t.ordfeminine = 266;
+    t.Lslash = 611;
+    t.Oslash = 722;
+    t.OE = 944;
+    t.ordmasculine = 300;
+    t.ae = 722;
+    t.dotlessi = 278;
+    t.lslash = 278;
+    t.oslash = 500;
+    t.oe = 722;
+    t.germandbls = 500;
+    t.Idieresis = 389;
+    t.eacute = 444;
+    t.abreve = 500;
+    t.uhungarumlaut = 556;
+    t.ecaron = 444;
+    t.Ydieresis = 611;
+    t.divide = 570;
+    t.Yacute = 611;
+    t.Acircumflex = 667;
+    t.aacute = 500;
+    t.Ucircumflex = 722;
+    t.yacute = 444;
+    t.scommaaccent = 389;
+    t.ecircumflex = 444;
+    t.Uring = 722;
+    t.Udieresis = 722;
+    t.aogonek = 500;
+    t.Uacute = 722;
+    t.uogonek = 556;
+    t.Edieresis = 667;
+    t.Dcroat = 722;
+    t.commaaccent = 250;
+    t.copyright = 747;
+    t.Emacron = 667;
+    t.ccaron = 444;
+    t.aring = 500;
+    t.Ncommaaccent = 722;
+    t.lacute = 278;
+    t.agrave = 500;
+    t.Tcommaaccent = 611;
+    t.Cacute = 667;
+    t.atilde = 500;
+    t.Edotaccent = 667;
+    t.scaron = 389;
+    t.scedilla = 389;
+    t.iacute = 278;
+    t.lozenge = 494;
+    t.Rcaron = 667;
+    t.Gcommaaccent = 722;
+    t.ucircumflex = 556;
+    t.acircumflex = 500;
+    t.Amacron = 667;
+    t.rcaron = 389;
+    t.ccedilla = 444;
+    t.Zdotaccent = 611;
+    t.Thorn = 611;
+    t.Omacron = 722;
+    t.Racute = 667;
+    t.Sacute = 556;
+    t.dcaron = 608;
+    t.Umacron = 722;
+    t.uring = 556;
+    t.threesuperior = 300;
+    t.Ograve = 722;
+    t.Agrave = 667;
+    t.Abreve = 667;
+    t.multiply = 570;
+    t.uacute = 556;
+    t.Tcaron = 611;
+    t.partialdiff = 494;
+    t.ydieresis = 444;
+    t.Nacute = 722;
+    t.icircumflex = 278;
+    t.Ecircumflex = 667;
+    t.adieresis = 500;
+    t.edieresis = 444;
+    t.cacute = 444;
+    t.nacute = 556;
+    t.umacron = 556;
+    t.Ncaron = 722;
+    t.Iacute = 389;
+    t.plusminus = 570;
+    t.brokenbar = 220;
+    t.registered = 747;
+    t.Gbreve = 722;
+    t.Idotaccent = 389;
+    t.summation = 600;
+    t.Egrave = 667;
+    t.racute = 389;
+    t.omacron = 500;
+    t.Zacute = 611;
+    t.Zcaron = 611;
+    t.greaterequal = 549;
+    t.Eth = 722;
+    t.Ccedilla = 667;
+    t.lcommaaccent = 278;
+    t.tcaron = 366;
+    t.eogonek = 444;
+    t.Uogonek = 722;
+    t.Aacute = 667;
+    t.Adieresis = 667;
+    t.egrave = 444;
+    t.zacute = 389;
+    t.iogonek = 278;
+    t.Oacute = 722;
+    t.oacute = 500;
+    t.amacron = 500;
+    t.sacute = 389;
+    t.idieresis = 278;
+    t.Ocircumflex = 722;
+    t.Ugrave = 722;
+    t.Delta = 612;
+    t.thorn = 500;
+    t.twosuperior = 300;
+    t.Odieresis = 722;
+    t.mu = 576;
+    t.igrave = 278;
+    t.ohungarumlaut = 500;
+    t.Eogonek = 667;
+    t.dcroat = 500;
+    t.threequarters = 750;
+    t.Scedilla = 556;
+    t.lcaron = 382;
+    t.Kcommaaccent = 667;
+    t.Lacute = 611;
+    t.trademark = 1000;
+    t.edotaccent = 444;
+    t.Igrave = 389;
+    t.Imacron = 389;
+    t.Lcaron = 611;
+    t.onehalf = 750;
+    t.lessequal = 549;
+    t.ocircumflex = 500;
+    t.ntilde = 556;
+    t.Uhungarumlaut = 722;
+    t.Eacute = 667;
+    t.emacron = 444;
+    t.gbreve = 500;
+    t.onequarter = 750;
+    t.Scaron = 556;
+    t.Scommaaccent = 556;
+    t.Ohungarumlaut = 722;
+    t.degree = 400;
+    t.ograve = 500;
+    t.Ccaron = 667;
+    t.ugrave = 556;
+    t.radical = 549;
+    t.Dcaron = 722;
+    t.rcommaaccent = 389;
+    t.Ntilde = 722;
+    t.otilde = 500;
+    t.Rcommaaccent = 667;
+    t.Lcommaaccent = 611;
+    t.Atilde = 667;
+    t.Aogonek = 667;
+    t.Aring = 667;
+    t.Otilde = 722;
+    t.zdotaccent = 389;
+    t.Ecaron = 667;
+    t.Iogonek = 389;
+    t.kcommaaccent = 500;
+    t.minus = 606;
+    t.Icircumflex = 389;
+    t.ncaron = 556;
+    t.tcommaaccent = 278;
+    t.logicalnot = 606;
+    t.odieresis = 500;
+    t.udieresis = 556;
+    t.notequal = 549;
+    t.gcommaaccent = 500;
+    t.eth = 500;
+    t.zcaron = 389;
+    t.ncommaaccent = 556;
+    t.onesuperior = 300;
+    t.imacron = 278;
+    t.Euro = 500;
+  });
+  t["Times-Italic"] = getLookupTableFactory(function (t) {
+    t.space = 250;
+    t.exclam = 333;
+    t.quotedbl = 420;
+    t.numbersign = 500;
+    t.dollar = 500;
+    t.percent = 833;
+    t.ampersand = 778;
+    t.quoteright = 333;
+    t.parenleft = 333;
+    t.parenright = 333;
+    t.asterisk = 500;
+    t.plus = 675;
+    t.comma = 250;
+    t.hyphen = 333;
+    t.period = 250;
+    t.slash = 278;
+    t.zero = 500;
+    t.one = 500;
+    t.two = 500;
+    t.three = 500;
+    t.four = 500;
+    t.five = 500;
+    t.six = 500;
+    t.seven = 500;
+    t.eight = 500;
+    t.nine = 500;
+    t.colon = 333;
+    t.semicolon = 333;
+    t.less = 675;
+    t.equal = 675;
+    t.greater = 675;
+    t.question = 500;
+    t.at = 920;
+    t.A = 611;
+    t.B = 611;
+    t.C = 667;
+    t.D = 722;
+    t.E = 611;
+    t.F = 611;
+    t.G = 722;
+    t.H = 722;
+    t.I = 333;
+    t.J = 444;
+    t.K = 667;
+    t.L = 556;
+    t.M = 833;
+    t.N = 667;
+    t.O = 722;
+    t.P = 611;
+    t.Q = 722;
+    t.R = 611;
+    t.S = 500;
+    t.T = 556;
+    t.U = 722;
+    t.V = 611;
+    t.W = 833;
+    t.X = 611;
+    t.Y = 556;
+    t.Z = 556;
+    t.bracketleft = 389;
+    t.backslash = 278;
+    t.bracketright = 389;
+    t.asciicircum = 422;
+    t.underscore = 500;
+    t.quoteleft = 333;
+    t.a = 500;
+    t.b = 500;
+    t.c = 444;
+    t.d = 500;
+    t.e = 444;
+    t.f = 278;
+    t.g = 500;
+    t.h = 500;
+    t.i = 278;
+    t.j = 278;
+    t.k = 444;
+    t.l = 278;
+    t.m = 722;
+    t.n = 500;
+    t.o = 500;
+    t.p = 500;
+    t.q = 500;
+    t.r = 389;
+    t.s = 389;
+    t.t = 278;
+    t.u = 500;
+    t.v = 444;
+    t.w = 667;
+    t.x = 444;
+    t.y = 444;
+    t.z = 389;
+    t.braceleft = 400;
+    t.bar = 275;
+    t.braceright = 400;
+    t.asciitilde = 541;
+    t.exclamdown = 389;
+    t.cent = 500;
+    t.sterling = 500;
+    t.fraction = 167;
+    t.yen = 500;
+    t.florin = 500;
+    t.section = 500;
+    t.currency = 500;
+    t.quotesingle = 214;
+    t.quotedblleft = 556;
+    t.guillemotleft = 500;
+    t.guilsinglleft = 333;
+    t.guilsinglright = 333;
+    t.fi = 500;
+    t.fl = 500;
+    t.endash = 500;
+    t.dagger = 500;
+    t.daggerdbl = 500;
+    t.periodcentered = 250;
+    t.paragraph = 523;
+    t.bullet = 350;
+    t.quotesinglbase = 333;
+    t.quotedblbase = 556;
+    t.quotedblright = 556;
+    t.guillemotright = 500;
+    t.ellipsis = 889;
+    t.perthousand = 1000;
+    t.questiondown = 500;
+    t.grave = 333;
+    t.acute = 333;
+    t.circumflex = 333;
+    t.tilde = 333;
+    t.macron = 333;
+    t.breve = 333;
+    t.dotaccent = 333;
+    t.dieresis = 333;
+    t.ring = 333;
+    t.cedilla = 333;
+    t.hungarumlaut = 333;
+    t.ogonek = 333;
+    t.caron = 333;
+    t.emdash = 889;
+    t.AE = 889;
+    t.ordfeminine = 276;
+    t.Lslash = 556;
+    t.Oslash = 722;
+    t.OE = 944;
+    t.ordmasculine = 310;
+    t.ae = 667;
+    t.dotlessi = 278;
+    t.lslash = 278;
+    t.oslash = 500;
+    t.oe = 667;
+    t.germandbls = 500;
+    t.Idieresis = 333;
+    t.eacute = 444;
+    t.abreve = 500;
+    t.uhungarumlaut = 500;
+    t.ecaron = 444;
+    t.Ydieresis = 556;
+    t.divide = 675;
+    t.Yacute = 556;
+    t.Acircumflex = 611;
+    t.aacute = 500;
+    t.Ucircumflex = 722;
+    t.yacute = 444;
+    t.scommaaccent = 389;
+    t.ecircumflex = 444;
+    t.Uring = 722;
+    t.Udieresis = 722;
+    t.aogonek = 500;
+    t.Uacute = 722;
+    t.uogonek = 500;
+    t.Edieresis = 611;
+    t.Dcroat = 722;
+    t.commaaccent = 250;
+    t.copyright = 760;
+    t.Emacron = 611;
+    t.ccaron = 444;
+    t.aring = 500;
+    t.Ncommaaccent = 667;
+    t.lacute = 278;
+    t.agrave = 500;
+    t.Tcommaaccent = 556;
+    t.Cacute = 667;
+    t.atilde = 500;
+    t.Edotaccent = 611;
+    t.scaron = 389;
+    t.scedilla = 389;
+    t.iacute = 278;
+    t.lozenge = 471;
+    t.Rcaron = 611;
+    t.Gcommaaccent = 722;
+    t.ucircumflex = 500;
+    t.acircumflex = 500;
+    t.Amacron = 611;
+    t.rcaron = 389;
+    t.ccedilla = 444;
+    t.Zdotaccent = 556;
+    t.Thorn = 611;
+    t.Omacron = 722;
+    t.Racute = 611;
+    t.Sacute = 500;
+    t.dcaron = 544;
+    t.Umacron = 722;
+    t.uring = 500;
+    t.threesuperior = 300;
+    t.Ograve = 722;
+    t.Agrave = 611;
+    t.Abreve = 611;
+    t.multiply = 675;
+    t.uacute = 500;
+    t.Tcaron = 556;
+    t.partialdiff = 476;
+    t.ydieresis = 444;
+    t.Nacute = 667;
+    t.icircumflex = 278;
+    t.Ecircumflex = 611;
+    t.adieresis = 500;
+    t.edieresis = 444;
+    t.cacute = 444;
+    t.nacute = 500;
+    t.umacron = 500;
+    t.Ncaron = 667;
+    t.Iacute = 333;
+    t.plusminus = 675;
+    t.brokenbar = 275;
+    t.registered = 760;
+    t.Gbreve = 722;
+    t.Idotaccent = 333;
+    t.summation = 600;
+    t.Egrave = 611;
+    t.racute = 389;
+    t.omacron = 500;
+    t.Zacute = 556;
+    t.Zcaron = 556;
+    t.greaterequal = 549;
+    t.Eth = 722;
+    t.Ccedilla = 667;
+    t.lcommaaccent = 278;
+    t.tcaron = 300;
+    t.eogonek = 444;
+    t.Uogonek = 722;
+    t.Aacute = 611;
+    t.Adieresis = 611;
+    t.egrave = 444;
+    t.zacute = 389;
+    t.iogonek = 278;
+    t.Oacute = 722;
+    t.oacute = 500;
+    t.amacron = 500;
+    t.sacute = 389;
+    t.idieresis = 278;
+    t.Ocircumflex = 722;
+    t.Ugrave = 722;
+    t.Delta = 612;
+    t.thorn = 500;
+    t.twosuperior = 300;
+    t.Odieresis = 722;
+    t.mu = 500;
+    t.igrave = 278;
+    t.ohungarumlaut = 500;
+    t.Eogonek = 611;
+    t.dcroat = 500;
+    t.threequarters = 750;
+    t.Scedilla = 500;
+    t.lcaron = 300;
+    t.Kcommaaccent = 667;
+    t.Lacute = 556;
+    t.trademark = 980;
+    t.edotaccent = 444;
+    t.Igrave = 333;
+    t.Imacron = 333;
+    t.Lcaron = 611;
+    t.onehalf = 750;
+    t.lessequal = 549;
+    t.ocircumflex = 500;
+    t.ntilde = 500;
+    t.Uhungarumlaut = 722;
+    t.Eacute = 611;
+    t.emacron = 444;
+    t.gbreve = 500;
+    t.onequarter = 750;
+    t.Scaron = 500;
+    t.Scommaaccent = 500;
+    t.Ohungarumlaut = 722;
+    t.degree = 400;
+    t.ograve = 500;
+    t.Ccaron = 667;
+    t.ugrave = 500;
+    t.radical = 453;
+    t.Dcaron = 722;
+    t.rcommaaccent = 389;
+    t.Ntilde = 667;
+    t.otilde = 500;
+    t.Rcommaaccent = 611;
+    t.Lcommaaccent = 556;
+    t.Atilde = 611;
+    t.Aogonek = 611;
+    t.Aring = 611;
+    t.Otilde = 722;
+    t.zdotaccent = 389;
+    t.Ecaron = 611;
+    t.Iogonek = 333;
+    t.kcommaaccent = 444;
+    t.minus = 675;
+    t.Icircumflex = 333;
+    t.ncaron = 500;
+    t.tcommaaccent = 278;
+    t.logicalnot = 675;
+    t.odieresis = 500;
+    t.udieresis = 500;
+    t.notequal = 549;
+    t.gcommaaccent = 500;
+    t.eth = 500;
+    t.zcaron = 389;
+    t.ncommaaccent = 500;
+    t.onesuperior = 300;
+    t.imacron = 278;
+    t.Euro = 500;
+  });
+  t.ZapfDingbats = getLookupTableFactory(function (t) {
+    t.space = 278;
+    t.a1 = 974;
+    t.a2 = 961;
+    t.a202 = 974;
+    t.a3 = 980;
+    t.a4 = 719;
+    t.a5 = 789;
+    t.a119 = 790;
+    t.a118 = 791;
+    t.a117 = 690;
+    t.a11 = 960;
+    t.a12 = 939;
+    t.a13 = 549;
+    t.a14 = 855;
+    t.a15 = 911;
+    t.a16 = 933;
+    t.a105 = 911;
+    t.a17 = 945;
+    t.a18 = 974;
+    t.a19 = 755;
+    t.a20 = 846;
+    t.a21 = 762;
+    t.a22 = 761;
+    t.a23 = 571;
+    t.a24 = 677;
+    t.a25 = 763;
+    t.a26 = 760;
+    t.a27 = 759;
+    t.a28 = 754;
+    t.a6 = 494;
+    t.a7 = 552;
+    t.a8 = 537;
+    t.a9 = 577;
+    t.a10 = 692;
+    t.a29 = 786;
+    t.a30 = 788;
+    t.a31 = 788;
+    t.a32 = 790;
+    t.a33 = 793;
+    t.a34 = 794;
+    t.a35 = 816;
+    t.a36 = 823;
+    t.a37 = 789;
+    t.a38 = 841;
+    t.a39 = 823;
+    t.a40 = 833;
+    t.a41 = 816;
+    t.a42 = 831;
+    t.a43 = 923;
+    t.a44 = 744;
+    t.a45 = 723;
+    t.a46 = 749;
+    t.a47 = 790;
+    t.a48 = 792;
+    t.a49 = 695;
+    t.a50 = 776;
+    t.a51 = 768;
+    t.a52 = 792;
+    t.a53 = 759;
+    t.a54 = 707;
+    t.a55 = 708;
+    t.a56 = 682;
+    t.a57 = 701;
+    t.a58 = 826;
+    t.a59 = 815;
+    t.a60 = 789;
+    t.a61 = 789;
+    t.a62 = 707;
+    t.a63 = 687;
+    t.a64 = 696;
+    t.a65 = 689;
+    t.a66 = 786;
+    t.a67 = 787;
+    t.a68 = 713;
+    t.a69 = 791;
+    t.a70 = 785;
+    t.a71 = 791;
+    t.a72 = 873;
+    t.a73 = 761;
+    t.a74 = 762;
+    t.a203 = 762;
+    t.a75 = 759;
+    t.a204 = 759;
+    t.a76 = 892;
+    t.a77 = 892;
+    t.a78 = 788;
+    t.a79 = 784;
+    t.a81 = 438;
+    t.a82 = 138;
+    t.a83 = 277;
+    t.a84 = 415;
+    t.a97 = 392;
+    t.a98 = 392;
+    t.a99 = 668;
+    t.a100 = 668;
+    t.a89 = 390;
+    t.a90 = 390;
+    t.a93 = 317;
+    t.a94 = 317;
+    t.a91 = 276;
+    t.a92 = 276;
+    t.a205 = 509;
+    t.a85 = 509;
+    t.a206 = 410;
+    t.a86 = 410;
+    t.a87 = 234;
+    t.a88 = 234;
+    t.a95 = 334;
+    t.a96 = 334;
+    t.a101 = 732;
+    t.a102 = 544;
+    t.a103 = 544;
+    t.a104 = 910;
+    t.a106 = 667;
+    t.a107 = 760;
+    t.a108 = 760;
+    t.a112 = 776;
+    t.a111 = 595;
+    t.a110 = 694;
+    t.a109 = 626;
+    t.a120 = 788;
+    t.a121 = 788;
+    t.a122 = 788;
+    t.a123 = 788;
+    t.a124 = 788;
+    t.a125 = 788;
+    t.a126 = 788;
+    t.a127 = 788;
+    t.a128 = 788;
+    t.a129 = 788;
+    t.a130 = 788;
+    t.a131 = 788;
+    t.a132 = 788;
+    t.a133 = 788;
+    t.a134 = 788;
+    t.a135 = 788;
+    t.a136 = 788;
+    t.a137 = 788;
+    t.a138 = 788;
+    t.a139 = 788;
+    t.a140 = 788;
+    t.a141 = 788;
+    t.a142 = 788;
+    t.a143 = 788;
+    t.a144 = 788;
+    t.a145 = 788;
+    t.a146 = 788;
+    t.a147 = 788;
+    t.a148 = 788;
+    t.a149 = 788;
+    t.a150 = 788;
+    t.a151 = 788;
+    t.a152 = 788;
+    t.a153 = 788;
+    t.a154 = 788;
+    t.a155 = 788;
+    t.a156 = 788;
+    t.a157 = 788;
+    t.a158 = 788;
+    t.a159 = 788;
+    t.a160 = 894;
+    t.a161 = 838;
+    t.a163 = 1016;
+    t.a164 = 458;
+    t.a196 = 748;
+    t.a165 = 924;
+    t.a192 = 748;
+    t.a166 = 918;
+    t.a167 = 927;
+    t.a168 = 928;
+    t.a169 = 928;
+    t.a170 = 834;
+    t.a171 = 873;
+    t.a172 = 828;
+    t.a173 = 924;
+    t.a162 = 924;
+    t.a174 = 917;
+    t.a175 = 930;
+    t.a176 = 931;
+    t.a177 = 463;
+    t.a178 = 883;
+    t.a179 = 836;
+    t.a193 = 836;
+    t.a180 = 867;
+    t.a199 = 867;
+    t.a181 = 696;
+    t.a200 = 696;
+    t.a182 = 874;
+    t.a201 = 874;
+    t.a183 = 760;
+    t.a184 = 946;
+    t.a197 = 771;
+    t.a185 = 865;
+    t.a194 = 771;
+    t.a198 = 888;
+    t.a186 = 967;
+    t.a195 = 888;
+    t.a187 = 831;
+    t.a188 = 873;
+    t.a189 = 927;
+    t.a190 = 970;
+    t.a191 = 918;
+  });
+});
+const getFontBasicMetrics = getLookupTableFactory(function (t) {
+  t.Courier = {
+    ascent: 629,
+    descent: -157,
+    capHeight: 562,
+    xHeight: -426
+  };
+  t["Courier-Bold"] = {
+    ascent: 629,
+    descent: -157,
+    capHeight: 562,
+    xHeight: 439
+  };
+  t["Courier-Oblique"] = {
+    ascent: 629,
+    descent: -157,
+    capHeight: 562,
+    xHeight: 426
+  };
+  t["Courier-BoldOblique"] = {
+    ascent: 629,
+    descent: -157,
+    capHeight: 562,
+    xHeight: 426
+  };
+  t.Helvetica = {
+    ascent: 718,
+    descent: -207,
+    capHeight: 718,
+    xHeight: 523
+  };
+  t["Helvetica-Bold"] = {
+    ascent: 718,
+    descent: -207,
+    capHeight: 718,
+    xHeight: 532
+  };
+  t["Helvetica-Oblique"] = {
+    ascent: 718,
+    descent: -207,
+    capHeight: 718,
+    xHeight: 523
+  };
+  t["Helvetica-BoldOblique"] = {
+    ascent: 718,
+    descent: -207,
+    capHeight: 718,
+    xHeight: 532
+  };
+  t["Times-Roman"] = {
+    ascent: 683,
+    descent: -217,
+    capHeight: 662,
+    xHeight: 450
+  };
+  t["Times-Bold"] = {
+    ascent: 683,
+    descent: -217,
+    capHeight: 676,
+    xHeight: 461
+  };
+  t["Times-Italic"] = {
+    ascent: 683,
+    descent: -217,
+    capHeight: 653,
+    xHeight: 441
+  };
+  t["Times-BoldItalic"] = {
+    ascent: 683,
+    descent: -217,
+    capHeight: 669,
+    xHeight: 462
+  };
+  t.Symbol = {
+    ascent: Math.NaN,
+    descent: Math.NaN,
+    capHeight: Math.NaN,
+    xHeight: Math.NaN
+  };
+  t.ZapfDingbats = {
+    ascent: Math.NaN,
+    descent: Math.NaN,
+    capHeight: Math.NaN,
+    xHeight: Math.NaN
+  };
+});
+
+;// ./src/core/opentype_file_builder.js
+
+const OTF_HEADER_SIZE = 12;
+const OTF_TABLE_ENTRY_SIZE = 16;
+class OpenTypeFileBuilder {
+  #tables = new Map();
+  constructor(sfnt) {
+    this.sfnt = sfnt;
+  }
+  static getSearchParams(entriesCount, entrySize) {
+    let maxPower2 = 1,
+      log2 = 0;
+    while ((maxPower2 ^ entriesCount) > maxPower2) {
+      maxPower2 <<= 1;
+      log2++;
+    }
+    const searchRange = maxPower2 * entrySize;
+    return {
+      range: searchRange,
+      entry: log2,
+      rangeShift: entrySize * entriesCount - searchRange
+    };
+  }
+  toArray() {
+    let sfnt = this.sfnt;
+    const tables = this.#tables;
+    const tablesNames = [...tables.keys()].sort();
+    const numTables = tablesNames.length;
+    let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;
+    const tableOffsets = [offset];
+    for (let i = 0; i < numTables; i++) {
+      const table = tables.get(tablesNames[i]);
+      const paddedLength = (table.length + 3 & ~3) >>> 0;
+      offset += paddedLength;
+      tableOffsets.push(offset);
+    }
+    const file = new Uint8Array(offset),
+      view = new DataView(file.buffer);
+    for (let i = 0; i < numTables; i++) {
+      const table = tables.get(tablesNames[i]);
+      file.set(table, tableOffsets[i]);
+    }
+    if (sfnt === "true") {
+      sfnt = "\x00\x01\x00\x00";
+    }
+    file.set(stringToBytes(sfnt), 0);
+    view.setInt16(4, numTables);
+    const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);
+    view.setInt16(6, searchParams.range);
+    view.setInt16(8, searchParams.entry);
+    view.setInt16(10, searchParams.rangeShift);
+    offset = OTF_HEADER_SIZE;
+    for (let i = 0; i < numTables; i++) {
+      const tableName = tablesNames[i];
+      file.set(stringToBytes(tableName), offset);
+      let checksum = 0;
+      for (let j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {
+        const quad = view.getUint32(j);
+        checksum = checksum + quad >>> 0;
+      }
+      view.setInt32(offset + 4, checksum);
+      view.setInt32(offset + 8, tableOffsets[i]);
+      view.setInt32(offset + 12, tables.get(tableName).length);
+      offset += OTF_TABLE_ENTRY_SIZE;
+    }
+    this.#tables.clear();
+    return file;
+  }
+  addTable(tag, data) {
+    if (this.#tables.has(tag)) {
+      throw new Error(`Table ${tag} already exists`);
+    }
+    this.#tables.set(tag, data);
+  }
+}
+
+;// ./src/core/type1_parser.js
+
+
+
+
+const HINTING_ENABLED = false;
+const COMMAND_MAP = {
+  hstem: [1],
+  vstem: [3],
+  vmoveto: [4],
+  rlineto: [5],
+  hlineto: [6],
+  vlineto: [7],
+  rrcurveto: [8],
+  callsubr: [10],
+  flex: [12, 35],
+  drop: [12, 18],
+  endchar: [14],
+  rmoveto: [21],
+  hmoveto: [22],
+  vhcurveto: [30],
+  hvcurveto: [31]
+};
+class Type1CharString {
+  width = 0;
+  lsb = 0;
+  flexing = false;
+  output = [];
+  stack = [];
+  convert(encoded, subrs, seacAnalysisEnabled) {
+    const count = encoded.length;
+    let error = false;
+    let wx, sbx, subrNumber;
+    for (let i = 0; i < count; i++) {
+      let value = encoded[i];
+      if (value < 32) {
+        if (value === 12) {
+          value = (value << 8) + encoded[++i];
+        }
+        switch (value) {
+          case 1:
+            if (!HINTING_ENABLED) {
+              this.stack = [];
+              break;
+            }
+            error = this.executeCommand(2, COMMAND_MAP.hstem);
+            break;
+          case 3:
+            if (!HINTING_ENABLED) {
+              this.stack = [];
+              break;
+            }
+            error = this.executeCommand(2, COMMAND_MAP.vstem);
+            break;
+          case 4:
+            if (this.flexing) {
+              if (this.stack.length < 1) {
+                error = true;
+                break;
+              }
+              const dy = this.stack.pop();
+              this.stack.push(0, dy);
+              break;
+            }
+            error = this.executeCommand(1, COMMAND_MAP.vmoveto);
+            break;
+          case 5:
+            error = this.executeCommand(2, COMMAND_MAP.rlineto);
+            break;
+          case 6:
+            error = this.executeCommand(1, COMMAND_MAP.hlineto);
+            break;
+          case 7:
+            error = this.executeCommand(1, COMMAND_MAP.vlineto);
+            break;
+          case 8:
+            error = this.executeCommand(6, COMMAND_MAP.rrcurveto);
+            break;
+          case 9:
+            this.stack = [];
+            break;
+          case 10:
+            if (this.stack.length < 1) {
+              error = true;
+              break;
+            }
+            subrNumber = this.stack.pop();
+            if (!subrs[subrNumber]) {
+              error = true;
+              break;
+            }
+            error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);
+            break;
+          case 11:
+            return error;
+          case 13:
+            if (this.stack.length < 2) {
+              error = true;
+              break;
+            }
+            wx = this.stack.pop();
+            sbx = this.stack.pop();
+            this.lsb = sbx;
+            this.width = wx;
+            this.stack.push(wx, sbx);
+            error = this.executeCommand(2, COMMAND_MAP.hmoveto);
+            break;
+          case 14:
+            this.output.push(COMMAND_MAP.endchar[0]);
+            break;
+          case 21:
+            if (this.flexing) {
+              break;
+            }
+            error = this.executeCommand(2, COMMAND_MAP.rmoveto);
+            break;
+          case 22:
+            if (this.flexing) {
+              this.stack.push(0);
+              break;
+            }
+            error = this.executeCommand(1, COMMAND_MAP.hmoveto);
+            break;
+          case 30:
+            error = this.executeCommand(4, COMMAND_MAP.vhcurveto);
+            break;
+          case 31:
+            error = this.executeCommand(4, COMMAND_MAP.hvcurveto);
+            break;
+          case (12 << 8) + 0:
+            this.stack = [];
+            break;
+          case (12 << 8) + 1:
+            if (!HINTING_ENABLED) {
+              this.stack = [];
+              break;
+            }
+            error = this.executeCommand(2, COMMAND_MAP.vstem);
+            break;
+          case (12 << 8) + 2:
+            if (!HINTING_ENABLED) {
+              this.stack = [];
+              break;
+            }
+            error = this.executeCommand(2, COMMAND_MAP.hstem);
+            break;
+          case (12 << 8) + 6:
+            if (seacAnalysisEnabled) {
+              const asb = this.stack.at(-5);
+              this.seac = this.stack.splice(-4, 4);
+              this.seac[0] += this.lsb - asb;
+              error = this.executeCommand(0, COMMAND_MAP.endchar);
+            } else {
+              error = this.executeCommand(4, COMMAND_MAP.endchar);
+            }
+            break;
+          case (12 << 8) + 7:
+            if (this.stack.length < 4) {
+              error = true;
+              break;
+            }
+            this.stack.pop();
+            wx = this.stack.pop();
+            const sby = this.stack.pop();
+            sbx = this.stack.pop();
+            this.lsb = sbx;
+            this.width = wx;
+            this.stack.push(wx, sbx, sby);
+            error = this.executeCommand(3, COMMAND_MAP.rmoveto);
+            break;
+          case (12 << 8) + 12:
+            if (this.stack.length < 2) {
+              error = true;
+              break;
+            }
+            const num2 = this.stack.pop();
+            const num1 = this.stack.pop();
+            this.stack.push(num1 / num2);
+            break;
+          case (12 << 8) + 16:
+            if (this.stack.length < 2) {
+              error = true;
+              break;
+            }
+            subrNumber = this.stack.pop();
+            const numArgs = this.stack.pop();
+            if (subrNumber === 0 && numArgs === 3) {
+              const flexArgs = this.stack.splice(-17, 17);
+              this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]);
+              error = this.executeCommand(13, COMMAND_MAP.flex, true);
+              this.flexing = false;
+              this.stack.push(flexArgs[15], flexArgs[16]);
+            } else if (subrNumber === 1 && numArgs === 0) {
+              this.flexing = true;
+            }
+            break;
+          case (12 << 8) + 17:
+            break;
+          case (12 << 8) + 33:
+            this.stack = [];
+            break;
+          default:
+            warn('Unknown type 1 charstring command of "' + value + '"');
+            break;
+        }
+        if (error) {
+          break;
+        }
+        continue;
+      } else if (value <= 246) {
+        value -= 139;
+      } else if (value <= 250) {
+        value = (value - 247) * 256 + encoded[++i] + 108;
+      } else if (value <= 254) {
+        value = -((value - 251) * 256) - encoded[++i] - 108;
+      } else {
+        value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;
+      }
+      this.stack.push(value);
+    }
+    return error;
+  }
+  executeCommand(howManyArgs, command, keepStack) {
+    const stackLength = this.stack.length;
+    if (howManyArgs > stackLength) {
+      return true;
+    }
+    const start = stackLength - howManyArgs;
+    for (let i = start; i < stackLength; i++) {
+      let value = this.stack[i];
+      if (Number.isInteger(value)) {
+        this.output.push(28, value >> 8 & 0xff, value & 0xff);
+      } else {
+        value = 65536 * value | 0;
+        this.output.push(255, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
+      }
+    }
+    this.output.push(...command);
+    if (keepStack) {
+      this.stack.splice(start, howManyArgs);
+    } else {
+      this.stack.length = 0;
+    }
+    return false;
+  }
+}
+const EEXEC_ENCRYPT_KEY = 55665;
+const CHAR_STRS_ENCRYPT_KEY = 4330;
+function isHexDigit(code) {
+  return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;
+}
+function decrypt(data, key, discardNumber) {
+  if (discardNumber >= data.length) {
+    return new Uint8Array(0);
+  }
+  const c1 = 52845,
+    c2 = 22719;
+  let r = key | 0,
+    i,
+    j;
+  for (i = 0; i < discardNumber; i++) {
+    r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;
+  }
+  const count = data.length - discardNumber;
+  const decrypted = new Uint8Array(count);
+  for (i = discardNumber, j = 0; j < count; i++, j++) {
+    const value = data[i];
+    decrypted[j] = value ^ r >> 8;
+    r = (value + r) * c1 + c2 & (1 << 16) - 1;
+  }
+  return decrypted;
+}
+function decryptAscii(data, key, discardNumber) {
+  const c1 = 52845,
+    c2 = 22719;
+  let r = key | 0;
+  const count = data.length,
+    maybeLength = count >>> 1;
+  const decrypted = new Uint8Array(maybeLength);
+  let i, j;
+  for (i = 0, j = 0; i < count; i++) {
+    const digit1 = data[i];
+    if (!isHexDigit(digit1)) {
+      continue;
+    }
+    i++;
+    let digit2;
+    while (i < count && !isHexDigit(digit2 = data[i])) {
+      i++;
+    }
+    if (i < count) {
+      const value = parseInt(String.fromCharCode(digit1, digit2), 16);
+      decrypted[j++] = value ^ r >> 8;
+      r = (value + r) * c1 + c2 & (1 << 16) - 1;
+    }
+  }
+  return decrypted.slice(discardNumber, j);
+}
+function isSpecial(c) {
+  return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29;
+}
+class Type1Parser {
+  constructor(stream, encrypted, seacAnalysisEnabled) {
+    if (encrypted) {
+      const data = stream.getBytes();
+      const isBinary = !((isHexDigit(data[0]) || isWhiteSpace(data[0])) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7]));
+      stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));
+    }
+    this.seacAnalysisEnabled = !!seacAnalysisEnabled;
+    this.stream = stream;
+    this.nextChar();
+  }
+  readNumberArray() {
+    this.getToken();
+    const array = [];
+    while (true) {
+      const token = this.getToken();
+      if (token === null || token === "]" || token === "}") {
+        break;
+      }
+      array.push(parseFloat(token || 0));
+    }
+    return array;
+  }
+  readNumber() {
+    const token = this.getToken();
+    return parseFloat(token || 0);
+  }
+  readInt() {
+    const token = this.getToken();
+    return parseInt(token || 0, 10) | 0;
+  }
+  readBoolean() {
+    const token = this.getToken();
+    return token === "true" ? 1 : 0;
+  }
+  nextChar() {
+    return this.currentChar = this.stream.getByte();
+  }
+  prevChar() {
+    this.stream.skip(-2);
+    return this.currentChar = this.stream.getByte();
+  }
+  getToken() {
+    let comment = false;
+    let ch = this.currentChar;
+    while (true) {
+      if (ch === -1) {
+        return null;
+      }
+      if (comment) {
+        if (ch === 0x0a || ch === 0x0d) {
+          comment = false;
+        }
+      } else if (ch === 0x25) {
+        comment = true;
+      } else if (!isWhiteSpace(ch)) {
+        break;
+      }
+      ch = this.nextChar();
+    }
+    if (isSpecial(ch)) {
+      this.nextChar();
+      return String.fromCharCode(ch);
+    }
+    let token = "";
+    do {
+      token += String.fromCharCode(ch);
+      ch = this.nextChar();
+    } while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch));
+    return token;
+  }
+  readCharStrings(bytes, lenIV) {
+    if (lenIV === -1) {
+      return bytes;
+    }
+    return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);
+  }
+  extractFontProgram(properties) {
+    const stream = this.stream;
+    const subrs = [],
+      charstrings = [];
+    const privateData = new Map([["lenIV", 4]]);
+    const program = {
+      subrs: [],
+      charstrings: [],
+      properties: {
+        privateData
+      }
+    };
+    let token, length, data, lenIV;
+    let subrsParsed = false;
+    let charStringsParsed = false;
+    while ((token = this.getToken()) !== null) {
+      if (token !== "/") {
+        continue;
+      }
+      token = this.getToken();
+      switch (token) {
+        case "CharStrings":
+          if (charStringsParsed) {
+            break;
+          }
+          charStringsParsed = true;
+          this.getToken();
+          this.getToken();
+          this.getToken();
+          this.getToken();
+          while (true) {
+            token = this.getToken();
+            if (token === null || token === "end") {
+              break;
+            }
+            if (token !== "/") {
+              continue;
+            }
+            const glyph = this.getToken();
+            length = this.readInt();
+            this.getToken();
+            data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
+            lenIV = privateData.get("lenIV");
+            const encoded = this.readCharStrings(data, lenIV);
+            this.nextChar();
+            token = this.getToken();
+            if (token === "noaccess") {
+              this.getToken();
+            } else if (token === "/") {
+              this.prevChar();
+            }
+            charstrings.push({
+              glyph,
+              encoded
+            });
+          }
+          break;
+        case "Subrs":
+          if (subrsParsed) {
+            break;
+          }
+          subrsParsed = true;
+          this.readInt();
+          this.getToken();
+          while (this.getToken() === "dup") {
+            const index = this.readInt();
+            length = this.readInt();
+            this.getToken();
+            data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
+            lenIV = privateData.get("lenIV");
+            const encoded = this.readCharStrings(data, lenIV);
+            this.nextChar();
+            token = this.getToken();
+            if (token === "noaccess") {
+              this.getToken();
+            }
+            subrs[index] = encoded;
+          }
+          break;
+        case "BlueValues":
+        case "OtherBlues":
+        case "FamilyBlues":
+        case "FamilyOtherBlues":
+          const blueArray = this.readNumberArray();
+          if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {
+            privateData.set(token, blueArray);
+          }
+          break;
+        case "StemSnapH":
+        case "StemSnapV":
+          privateData.set(token, this.readNumberArray());
+          break;
+        case "StdHW":
+        case "StdVW":
+          privateData.set(token, this.readNumberArray()[0]);
+          break;
+        case "BlueShift":
+        case "lenIV":
+        case "BlueFuzz":
+        case "BlueScale":
+        case "LanguageGroup":
+          privateData.set(token, this.readNumber());
+          break;
+        case "ExpansionFactor":
+          privateData.set(token, this.readNumber() || 0.06);
+          break;
+        case "ForceBold":
+          privateData.set(token, this.readBoolean());
+          break;
+      }
+    }
+    for (const {
+      encoded,
+      glyph
+    } of charstrings) {
+      const charString = new Type1CharString();
+      const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);
+      const output = !error ? charString.output : [14];
+      const charStringObject = {
+        glyphName: glyph,
+        charstring: output,
+        width: charString.width,
+        lsb: charString.lsb,
+        seac: charString.seac
+      };
+      if (glyph === ".notdef") {
+        program.charstrings.unshift(charStringObject);
+      } else {
+        program.charstrings.push(charStringObject);
+      }
+      if (properties.builtInEncoding) {
+        const index = properties.builtInEncoding.indexOf(glyph);
+        if (index > -1 && properties.widths[index] === undefined && index >= properties.firstChar && index <= properties.lastChar) {
+          properties.widths[index] = charString.width;
+        }
+      }
+    }
+    return program;
+  }
+  extractCidKeyedFontProgram(properties) {
+    const stream = this.stream;
+    const privateData = new Map([["lenIV", 4]]);
+    const program = {
+      subrs: [],
+      charstrings: [],
+      properties: {
+        privateData
+      }
+    };
+    let cidCount = 0;
+    let cidMapOffset = -1;
+    let fdBytes = 1;
+    let gdBytes = 0;
+    let subrMapOffset = -1;
+    let sdBytes = 0;
+    let subrCount = 0;
+    let startDataLength = 0;
+    let startDataIsHex = false;
+    let foundStartData = false;
+    const previousTokens = [];
+    function rememberToken(value) {
+      previousTokens.push(value);
+      if (previousTokens.length > 4) {
+        previousTokens.shift();
+      }
+    }
+    let token;
+    while ((token = this.getToken()) !== null) {
+      if (token === "StartData") {
+        const dataType = previousTokens.at(-3);
+        const dataLength = previousTokens.at(-1);
+        if (previousTokens.at(-4) !== "(" || previousTokens.at(-2) !== ")" || dataType !== "Binary" && dataType !== "Hex" || !/^\d+$/.test(dataLength)) {
+          return null;
+        }
+        startDataLength = parseInt(dataLength, 10);
+        if (startDataLength <= 0) {
+          return null;
+        }
+        startDataIsHex = dataType === "Hex";
+        foundStartData = true;
+        break;
+      }
+      rememberToken(token);
+      if (token !== "/") {
+        continue;
+      }
+      token = this.getToken();
+      rememberToken(token);
+      switch (token) {
+        case "FontMatrix":
+          properties.fontMatrix = this.readNumberArray();
+          break;
+        case "FontBBox":
+          const fontBBox = this.readNumberArray();
+          properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
+          properties.descent = Math.min(fontBBox[1], fontBBox[3]);
+          properties.ascentScaled = true;
+          break;
+        case "CIDCount":
+          cidCount = this.readInt();
+          break;
+        case "CIDMapOffset":
+          cidMapOffset = this.readInt();
+          break;
+        case "FDBytes":
+          fdBytes = this.readInt();
+          break;
+        case "GDBytes":
+          gdBytes = this.readInt();
+          break;
+        case "SubrMapOffset":
+          subrMapOffset = this.readInt();
+          break;
+        case "SDBytes":
+          sdBytes = this.readInt();
+          break;
+        case "SubrCount":
+          subrCount = this.readInt();
+          break;
+        case "BlueValues":
+        case "OtherBlues":
+        case "FamilyBlues":
+        case "FamilyOtherBlues":
+          this.readNumberArray();
+          break;
+        case "StemSnapH":
+        case "StemSnapV":
+          privateData.set(token, this.readNumberArray());
+          break;
+        case "StdHW":
+        case "StdVW":
+          privateData.set(token, this.readNumberArray()[0]);
+          break;
+        case "BlueShift":
+        case "lenIV":
+        case "BlueFuzz":
+        case "BlueScale":
+        case "LanguageGroup":
+          privateData.set(token, this.readNumber());
+          break;
+        case "ExpansionFactor":
+          privateData.set(token, this.readNumber() || 0.06);
+          break;
+        case "ForceBold":
+          privateData.set(token, this.readBoolean());
+          break;
+      }
+    }
+    if (!foundStartData || cidCount <= 0 || cidMapOffset < 0 || fdBytes < 0 || fdBytes > 4 || gdBytes < 1 || gdBytes > 4) {
+      return null;
+    }
+    const maxLength = stream.end - stream.pos;
+    if (startDataLength > maxLength) {
+      if (!startDataIsHex) {
+        startDataLength = maxLength;
+      } else if (startDataLength > 2 * maxLength) {
+        return null;
+      }
+    }
+    let binary = stream.getBytes(startDataIsHex ? undefined : startDataLength);
+    if (startDataIsHex) {
+      const decoded = new Uint8Array(startDataLength);
+      let digit1 = -1,
+        j = 0;
+      for (let i = 0, ii = binary.length; i < ii && j < startDataLength; i++) {
+        const digit = binary[i];
+        if (!isHexDigit(digit)) {
+          continue;
+        }
+        if (digit1 < 0) {
+          digit1 = digit;
+          continue;
+        }
+        decoded[j++] = parseInt(String.fromCharCode(digit1, digit), 16);
+        digit1 = -1;
+      }
+      if (j !== startDataLength) {
+        return null;
+      }
+      binary = decoded;
+    }
+    const lenIV = privateData.get("lenIV");
+    const cidEntrySize = fdBytes + gdBytes;
+    const subrs = [];
+    function readUint(offset, byteCount) {
+      let n = 0;
+      for (let i = 0; i < byteCount; i++) {
+        n = n << 8 | binary[offset + i];
+      }
+      return n >>> 0;
+    }
+    if (cidMapOffset + (cidCount + 1) * cidEntrySize > binary.length || subrCount > 0 && (subrMapOffset < 0 || sdBytes < 1 || sdBytes > 4 || subrMapOffset + (subrCount + 1) * sdBytes > binary.length)) {
+      return null;
+    }
+    if (fdBytes > 0) {
+      for (let cid = 0; cid < cidCount; cid++) {
+        if (readUint(cidMapOffset + cid * cidEntrySize, fdBytes) !== 0) {
+          return null;
+        }
+      }
+    }
+    if (subrCount > 0) {
+      const subrOffsets = new Array(subrCount + 1);
+      for (let i = 0; i <= subrCount; i++) {
+        subrOffsets[i] = readUint(subrMapOffset + i * sdBytes, sdBytes);
+      }
+      for (let i = 0; i < subrCount; i++) {
+        const start = subrOffsets[i];
+        const end = subrOffsets[i + 1];
+        if (end > binary.length || end < start) {
+          subrs[i] = new Uint8Array(0);
+          continue;
+        }
+        subrs[i] = this.readCharStrings(binary.subarray(start, end), lenIV);
+      }
+    }
+    const charstrings = [];
+    let prevOffset = readUint(cidMapOffset + fdBytes, gdBytes);
+    for (let cid = 0; cid < cidCount; cid++) {
+      const nextOffset = readUint(cidMapOffset + (cid + 1) * cidEntrySize + fdBytes, gdBytes);
+      const glyphName = cid === 0 ? ".notdef" : `cid${cid}`;
+      if (nextOffset > prevOffset && nextOffset <= binary.length) {
+        const encoded = this.readCharStrings(binary.subarray(prevOffset, nextOffset), lenIV);
+        const charString = new Type1CharString();
+        const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);
+        charstrings.push({
+          glyphName,
+          charstring: error ? [14] : charString.output,
+          width: charString.width,
+          lsb: charString.lsb,
+          seac: charString.seac
+        });
+      } else {
+        const notDef = charstrings[0];
+        charstrings.push({
+          glyphName,
+          charstring: notDef?.charstring.slice() || [0x8b, 0x0e],
+          width: notDef?.width || 0,
+          lsb: notDef?.lsb || 0
+        });
+      }
+      prevOffset = nextOffset;
+    }
+    program.subrs = subrs;
+    program.charstrings = charstrings;
+    return program;
+  }
+  extractFontHeader(properties) {
+    let token;
+    while ((token = this.getToken()) !== null) {
+      if (token !== "/") {
+        continue;
+      }
+      token = this.getToken();
+      switch (token) {
+        case "FontMatrix":
+          const matrix = this.readNumberArray();
+          properties.fontMatrix = matrix;
+          break;
+        case "Encoding":
+          const encodingArg = this.getToken();
+          let encoding;
+          if (!/^\d+$/.test(encodingArg)) {
+            encoding = getEncoding(encodingArg);
+          } else {
+            encoding = [];
+            const size = parseInt(encodingArg, 10) | 0;
+            this.getToken();
+            for (let j = 0; j < size; j++) {
+              token = this.getToken();
+              while (token !== "dup" && token !== "def") {
+                token = this.getToken();
+                if (token === null) {
+                  return;
+                }
+              }
+              if (token === "def") {
+                break;
+              }
+              const index = this.readInt();
+              this.getToken();
+              const glyph = this.getToken();
+              encoding[index] = glyph;
+              this.getToken();
+            }
+          }
+          properties.builtInEncoding = encoding;
+          break;
+        case "FontBBox":
+          const fontBBox = this.readNumberArray();
+          properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
+          properties.descent = Math.min(fontBBox[1], fontBBox[3]);
+          properties.ascentScaled = true;
+          break;
+      }
+    }
+  }
+}
+
+;// ./src/core/type1_font.js
+
+
+
+
+
+
+function findBlock(streamBytes, signature, startIndex) {
+  const streamBytesLength = streamBytes.length;
+  const signatureLength = signature.length;
+  const scanLength = streamBytesLength - signatureLength;
+  let i = startIndex,
+    found = false;
+  while (i < scanLength) {
+    let j = 0;
+    while (j < signatureLength && streamBytes[i + j] === signature[j]) {
+      j++;
+    }
+    if (j >= signatureLength) {
+      i += j;
+      while (i < streamBytesLength && isWhiteSpace(streamBytes[i])) {
+        i++;
+      }
+      found = true;
+      break;
+    }
+    i++;
+  }
+  return {
+    found,
+    length: i
+  };
+}
+function getHeaderBlock(stream, suggestedLength) {
+  const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];
+  const streamStartPos = stream.pos;
+  let headerBytes, headerBytesLength, block;
+  try {
+    headerBytes = stream.getBytes(suggestedLength);
+    headerBytesLength = headerBytes.length;
+  } catch {}
+  if (headerBytesLength === suggestedLength) {
+    block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);
+    if (block.found && block.length === suggestedLength) {
+      return {
+        stream: new Stream(headerBytes),
+        length: suggestedLength
+      };
+    }
+  }
+  warn('Invalid "Length1" property in Type1 font -- trying to recover.');
+  stream.pos = streamStartPos;
+  const SCAN_BLOCK_LENGTH = 2048;
+  let actualLength;
+  while (true) {
+    const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
+    block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);
+    if (block.length === 0) {
+      break;
+    }
+    stream.pos += block.length;
+    if (block.found) {
+      actualLength = stream.pos - streamStartPos;
+      break;
+    }
+  }
+  stream.pos = streamStartPos;
+  if (actualLength) {
+    return {
+      stream: new Stream(stream.getBytes(actualLength)),
+      length: actualLength
+    };
+  }
+  warn('Unable to recover "Length1" property in Type1 font -- using as is.');
+  return {
+    stream: new Stream(stream.getBytes(suggestedLength)),
+    length: suggestedLength
+  };
+}
+function getEexecBlock(stream, suggestedLength) {
+  const eexecBytes = stream.getBytes();
+  if (eexecBytes.length === 0) {
+    throw new FormatError("getEexecBlock - no font program found.");
+  }
+  return {
+    stream: new Stream(eexecBytes),
+    length: eexecBytes.length
+  };
+}
+function isCidKeyedType1File(file) {
+  const sample = file.peekBytes(2048);
+  if (sample.length < 2 || sample[0] !== 0x25 || sample[1] !== 0x21) {
+    return false;
+  }
+  const text = bytesToString(sample);
+  return text.includes("Resource-CIDFont") || /\/CIDFontType\s+0\b/.test(text);
+}
+class Type1Font {
+  #rawFileLength;
+  constructor(name, file, properties) {
+    let data;
+    if (properties.composite && isCidKeyedType1File(file)) {
+      data = this.#parseCidKeyedType1(file, properties);
+    }
+    data ||= this.#parseType1(file, properties);
+    for (const key in data.properties) {
+      properties[key] = data.properties[key];
+    }
+    const charstrings = data.charstrings;
+    const type2Charstrings = this.getType2Charstrings(charstrings);
+    const subrs = this.getType2Subrs(data.subrs);
+    this.charstrings = charstrings;
+    this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);
+    this.seacs = this.getSeacs(data.charstrings);
+  }
+  #parseType1(file, properties) {
+    const PFB_HEADER_SIZE = 6;
+    let headerBlockLength = properties.length1;
+    let eexecBlockLength = properties.length2;
+    let pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
+    const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;
+    if (pfbHeaderPresent) {
+      file.skip(PFB_HEADER_SIZE);
+      headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
+    }
+    const headerBlock = getHeaderBlock(file, headerBlockLength);
+    const headerBlockParser = new Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED);
+    headerBlockParser.extractFontHeader(properties);
+    if (pfbHeaderPresent) {
+      pfbHeader = file.getBytes(PFB_HEADER_SIZE);
+      eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
+    }
+    const eexecBlock = getEexecBlock(file, eexecBlockLength);
+    const eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);
+    const data = eexecBlockParser.extractFontProgram(properties);
+    this.#rawFileLength = headerBlock.length + eexecBlock.length;
+    return data;
+  }
+  #parseCidKeyedType1(file, properties) {
+    const fileStart = file.pos;
+    const length = file.end - fileStart;
+    const parser = new Type1Parser(file, false, SEAC_ANALYSIS_ENABLED);
+    const data = parser.extractCidKeyedFontProgram(properties);
+    if (!data) {
+      file.pos = fileStart;
+      warn("Type1Font: unable to parse CID-keyed Type 1 font.");
+      return null;
+    }
+    this.#rawFileLength = length;
+    return data;
+  }
+  get numGlyphs() {
+    return this.charstrings.length + 1;
+  }
+  getCharset() {
+    const charset = [".notdef"];
+    for (const {
+      glyphName
+    } of this.charstrings) {
+      charset.push(glyphName);
+    }
+    return charset;
+  }
+  getGlyphMapping(properties) {
+    const charstrings = this.charstrings;
+    if (properties.composite) {
+      const charCodeToGlyphId = Object.create(null);
+      for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) {
+        const charCode = properties.cMap.charCodeOf(glyphId);
+        charCodeToGlyphId[charCode] = glyphId + 1;
+      }
+      return charCodeToGlyphId;
+    }
+    const glyphNames = [".notdef"];
+    let builtInEncoding, glyphId;
+    for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
+      glyphNames.push(charstrings[glyphId].glyphName);
+    }
+    const encoding = properties.builtInEncoding;
+    if (encoding) {
+      builtInEncoding = Object.create(null);
+      for (const charCode in encoding) {
+        glyphId = glyphNames.indexOf(encoding[charCode]);
+        if (glyphId >= 0) {
+          builtInEncoding[charCode] = glyphId;
+        }
+      }
+    }
+    return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);
+  }
+  hasGlyphId(id) {
+    if (id < 0 || id >= this.numGlyphs) {
+      return false;
+    }
+    if (id === 0) {
+      return true;
+    }
+    const glyph = this.charstrings[id - 1];
+    return glyph.charstring.length > 0;
+  }
+  getSeacs(charstrings) {
+    const seacMap = [];
+    for (let i = 0, ii = charstrings.length; i < ii; i++) {
+      const charstring = charstrings[i];
+      if (charstring.seac) {
+        seacMap[i + 1] = charstring.seac;
+      }
+    }
+    return seacMap;
+  }
+  getType2Charstrings(type1Charstrings) {
+    const type2Charstrings = [];
+    for (const type1Charstring of type1Charstrings) {
+      type2Charstrings.push(type1Charstring.charstring);
+    }
+    return type2Charstrings;
+  }
+  getType2Subrs(type1Subrs) {
+    let bias = 0;
+    const count = type1Subrs.length;
+    if (count < 1133) {
+      bias = 107;
+    } else if (count < 33769) {
+      bias = 1131;
+    } else {
+      bias = 32768;
+    }
+    const type2Subrs = [];
+    let i;
+    for (i = 0; i < bias; i++) {
+      type2Subrs.push([0x0b]);
+    }
+    for (i = 0; i < count; i++) {
+      type2Subrs.push(type1Subrs[i]);
+    }
+    return type2Subrs;
+  }
+  wrap(name, glyphs, charstrings, subrs, properties) {
+    const cff = new CFF(this.#rawFileLength);
+    cff.header = new CFFHeader(1, 0, 4, 4);
+    cff.names = [name];
+    const topDict = new CFFTopDict();
+    topDict.setByName("version", 391);
+    topDict.setByName("Notice", 392);
+    topDict.setByName("FullName", 393);
+    topDict.setByName("FamilyName", 394);
+    topDict.setByName("Weight", 395);
+    topDict.setByName("Encoding", null);
+    topDict.setByName("FontMatrix", properties.fontMatrix);
+    topDict.setByName("FontBBox", properties.bbox);
+    topDict.setByName("charset", null);
+    topDict.setByName("CharStrings", null);
+    topDict.setByName("Private", null);
+    cff.topDict = topDict;
+    const strings = new CFFStrings();
+    strings.add("Version 0.11");
+    strings.add("See original notice");
+    strings.add(name);
+    strings.add(name);
+    strings.add("Medium");
+    cff.strings = strings;
+    cff.globalSubrIndex = new CFFIndex();
+    const count = glyphs.length;
+    const charsetArray = [".notdef"];
+    for (let i = 0; i < count; i++) {
+      const {
+        glyphName
+      } = charstrings[i];
+      const index = CFFStandardStrings.indexOf(glyphName);
+      if (index === -1) {
+        strings.add(glyphName);
+      }
+      charsetArray.push(glyphName);
+    }
+    cff.charset = new CFFCharset(false, 0, charsetArray);
+    const charStringsIndex = new CFFIndex();
+    charStringsIndex.add([0x8b, 0x0e]);
+    for (let i = 0; i < count; i++) {
+      charStringsIndex.add(glyphs[i]);
+    }
+    cff.charStrings = charStringsIndex;
+    const privateDict = new CFFPrivateDict();
+    privateDict.setByName("Subrs", null);
+    const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"];
+    for (const field of fields) {
+      if (!properties.privateData.has(field)) {
+        continue;
+      }
+      const value = properties.privateData.get(field);
+      if (Array.isArray(value)) {
+        for (let j = value.length - 1; j > 0; j--) {
+          value[j] -= value[j - 1];
+        }
+      }
+      privateDict.setByName(field, value);
+    }
+    cff.topDict.privateDict = privateDict;
+    const subrIndex = new CFFIndex();
+    for (const subr of subrs) {
+      subrIndex.add(subr);
+    }
+    privateDict.subrsIndex = subrIndex;
+    const compiler = new CFFCompiler(cff);
+    return compiler.compile();
+  }
+}
+
+;// ./src/core/fonts.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]];
+const PDF_GLYPH_SPACE_UNITS = 1000;
+const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "disableFontFace", "fallbackName", "fontExtraProperties", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "systemFontInfo", "vertical"];
+const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "composite", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "subtype", "toFontChar", "toUnicode", "type", "vmetrics", "widths"];
+function adjustWidths(properties) {
+  if (!properties.fontMatrix) {
+    return;
+  }
+  if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) {
+    return;
+  }
+  const scale = 0.001 / properties.fontMatrix[0];
+  const glyphsWidths = properties.widths;
+  for (const glyph in glyphsWidths) {
+    glyphsWidths[glyph] *= scale;
+  }
+  properties.defaultWidth *= scale;
+}
+function adjustTrueTypeToUnicode(properties, isSymbolicFont, nameRecords) {
+  if (properties.isInternalFont) {
+    return;
+  }
+  if (properties.hasIncludedToUnicodeMap) {
+    return;
+  }
+  if (properties.hasEncoding) {
+    return;
+  }
+  if (properties.toUnicode instanceof IdentityToUnicodeMap) {
+    return;
+  }
+  if (!isSymbolicFont) {
+    return;
+  }
+  if (nameRecords.length === 0) {
+    return;
+  }
+  if (properties.defaultEncoding === WinAnsiEncoding) {
+    return;
+  }
+  for (const r of nameRecords) {
+    if (!isWinNameRecord(r)) {
+      return;
+    }
+  }
+  const encoding = WinAnsiEncoding;
+  const toUnicode = [],
+    glyphsUnicodeMap = getGlyphsUnicode();
+  for (const charCode in encoding) {
+    const glyphName = encoding[charCode];
+    if (glyphName === "") {
+      continue;
+    }
+    const unicode = glyphsUnicodeMap[glyphName];
+    if (unicode === undefined) {
+      continue;
+    }
+    toUnicode[charCode] = String.fromCharCode(unicode);
+  }
+  if (toUnicode.length > 0) {
+    properties.toUnicode.amend(toUnicode);
+  }
+}
+function adjustType1ToUnicode(properties, builtInEncoding) {
+  if (properties.isInternalFont) {
+    return;
+  }
+  if (properties.hasIncludedToUnicodeMap) {
+    return;
+  }
+  if (builtInEncoding === properties.defaultEncoding) {
+    return;
+  }
+  if (properties.toUnicode instanceof IdentityToUnicodeMap) {
+    return;
+  }
+  const toUnicode = [],
+    glyphsUnicodeMap = getGlyphsUnicode();
+  for (const charCode in builtInEncoding) {
+    if (properties.hasEncoding) {
+      if (properties.baseEncodingName || properties.differences[charCode] !== undefined) {
+        continue;
+      }
+    }
+    const glyphName = builtInEncoding[charCode];
+    const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
+    if (unicode !== -1) {
+      toUnicode[charCode] = String.fromCharCode(unicode);
+    }
+  }
+  if (toUnicode.length > 0) {
+    properties.toUnicode.amend(toUnicode);
+  }
+}
+function amendFallbackToUnicode(properties) {
+  if (!properties.fallbackToUnicode) {
+    return;
+  }
+  if (properties.toUnicode instanceof IdentityToUnicodeMap) {
+    return;
+  }
+  const toUnicode = [];
+  for (const charCode in properties.fallbackToUnicode) {
+    if (properties.toUnicode.has(charCode)) {
+      continue;
+    }
+    toUnicode[charCode] = properties.fallbackToUnicode[charCode];
+  }
+  if (toUnicode.length > 0) {
+    properties.toUnicode.amend(toUnicode);
+  }
+}
+class fonts_Glyph {
+  constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {
+    this.originalCharCode = originalCharCode;
+    this.fontChar = fontChar;
+    this.unicode = unicode;
+    this.accent = accent;
+    this.width = width;
+    this.vmetric = vmetric;
+    this.operatorListId = operatorListId;
+    this.isSpace = isSpace;
+    this.isInFont = isInFont;
+  }
+  get category() {
+    return shadow(this, "category", getCharUnicodeCategory(this.unicode), true);
+  }
+}
+function int16(b0, b1) {
+  return (b0 << 8) + b1;
+}
+function writeSignedInt16(bytes, index, value) {
+  bytes[index + 1] = value;
+  bytes[index] = value >>> 8;
+}
+function signedInt16(b0, b1) {
+  const value = (b0 << 8) + b1;
+  return value & 1 << 15 ? value - 0x10000 : value;
+}
+function writeUint32(bytes, index, value) {
+  bytes[index + 3] = value & 0xff;
+  bytes[index + 2] = value >>> 8;
+  bytes[index + 1] = value >>> 16;
+  bytes[index] = value >>> 24;
+}
+function isTrueTypeFile(file) {
+  const header = file.peekBytes(4),
+    str = bytesToString(header);
+  return str === "\x00\x01\x00\x00" || str === "true";
+}
+function isTrueTypeCollectionFile(file) {
+  const header = file.peekBytes(4);
+  return bytesToString(header) === "ttcf";
+}
+function isOpenTypeFile(file) {
+  const header = file.peekBytes(4);
+  return bytesToString(header) === "OTTO";
+}
+function isType1File(file) {
+  const header = file.peekBytes(2);
+  if (header[0] === 0x25 && header[1] === 0x21) {
+    return true;
+  }
+  if (header[0] === 0x80 && header[1] === 0x01) {
+    return true;
+  }
+  return false;
+}
+function isCFFFile(file) {
+  const header = file.peekBytes(4);
+  if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) {
+    return true;
+  }
+  return false;
+}
+function getFontFileType(file, {
+  type,
+  subtype,
+  composite
+}) {
+  let fileType, fileSubtype;
+  if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {
+    fileType = composite ? "CIDFontType2" : "TrueType";
+  } else if (isOpenTypeFile(file)) {
+    fileType = composite ? "CIDFontType2" : "OpenType";
+  } else if (isType1File(file)) {
+    if (composite) {
+      fileType = "CIDFontType0";
+    } else {
+      fileType = type === "MMType1" ? "MMType1" : "Type1";
+    }
+  } else if (isCFFFile(file)) {
+    if (composite) {
+      fileType = "CIDFontType0";
+      fileSubtype = "CIDFontType0C";
+    } else {
+      fileType = type === "MMType1" ? "MMType1" : "Type1";
+      fileSubtype = "Type1C";
+    }
+  } else {
+    warn("getFontFileType: Unable to detect correct font file Type/Subtype.");
+    fileType = type;
+    fileSubtype = subtype;
+  }
+  return [fileType, fileSubtype];
+}
+function applyStandardFontGlyphMap(map, glyphMap) {
+  for (const charCode in glyphMap) {
+    map[+charCode] = glyphMap[charCode];
+  }
+}
+function buildToFontChar(encoding, glyphsUnicodeMap, differences) {
+  const toFontChar = [];
+  let unicode;
+  for (let i = 0, ii = encoding.length; i < ii; i++) {
+    unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap);
+    if (unicode !== -1) {
+      toFontChar[i] = unicode;
+    }
+  }
+  for (const charCode in differences) {
+    unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap);
+    if (unicode !== -1) {
+      toFontChar[+charCode] = unicode;
+    }
+  }
+  return toFontChar;
+}
+function isMacNameRecord(r) {
+  return r.platform === 1 && r.encoding === 0 && r.language === 0;
+}
+function isWinNameRecord(r) {
+  return r.platform === 3 && r.encoding === 1 && r.language === 0x409;
+}
+function convertCidString(charCode, cid, shouldThrow = false) {
+  switch (cid.length) {
+    case 1:
+      return cid.charCodeAt(0);
+    case 2:
+      return cid.charCodeAt(0) << 8 | cid.charCodeAt(1);
+  }
+  const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`;
+  if (shouldThrow) {
+    throw new FormatError(msg);
+  }
+  warn(msg);
+  return cid;
+}
+function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) {
+  const newMap = Object.create(null);
+  const toUnicodeExtraMap = new Map();
+  const toFontChar = [];
+  const usedGlyphIds = new Set();
+  let privateUseAreaIndex = 0;
+  const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
+  let nextAvailableFontCharCode = privateUseOffetStart;
+  let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
+  const isInPrivateArea = code => PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1] || PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1];
+  let LIGATURE_TO_UNICODE = null;
+  for (const originalCharCode in charCodeToGlyphId) {
+    let glyphId = charCodeToGlyphId[originalCharCode];
+    if (!hasGlyph(glyphId)) {
+      continue;
+    }
+    if (nextAvailableFontCharCode > privateUseOffetEnd) {
+      privateUseAreaIndex++;
+      if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {
+        warn("Ran out of space in font private use area.");
+        break;
+      }
+      nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
+      privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
+    }
+    const fontCharCode = nextAvailableFontCharCode++;
+    if (glyphId === 0) {
+      glyphId = newGlyphZeroId;
+    }
+    let unicode = toUnicode.get(originalCharCode);
+    if (typeof unicode === "string") {
+      if (unicode.length === 1) {
+        unicode = unicode.codePointAt(0);
+      } else {
+        if (!LIGATURE_TO_UNICODE) {
+          LIGATURE_TO_UNICODE = new Map();
+          for (let i = 0xfb00; i <= 0xfb4f; i++) {
+            const normalized = String.fromCharCode(i).normalize("NFKD");
+            if (normalized.length > 1) {
+              LIGATURE_TO_UNICODE.set(normalized, i);
+            }
+          }
+        }
+        unicode = LIGATURE_TO_UNICODE.get(unicode) || unicode.codePointAt(0);
+      }
+    }
+    if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) {
+      toUnicodeExtraMap.set(unicode, glyphId);
+      usedGlyphIds.add(glyphId);
+    }
+    newMap[fontCharCode] = glyphId;
+    toFontChar[originalCharCode] = fontCharCode;
+  }
+  return {
+    toFontChar,
+    charCodeToGlyphId: newMap,
+    toUnicodeExtraMap,
+    nextAvailableFontCharCode
+  };
+}
+function getRanges(glyphs, toUnicodeExtraMap, numGlyphs) {
+  const codes = [];
+  for (const charCode in glyphs) {
+    if (glyphs[charCode] >= numGlyphs) {
+      continue;
+    }
+    codes.push({
+      fontCharCode: charCode | 0,
+      glyphId: glyphs[charCode]
+    });
+  }
+  if (toUnicodeExtraMap) {
+    for (const [unicode, glyphId] of toUnicodeExtraMap) {
+      if (glyphId >= numGlyphs) {
+        continue;
+      }
+      codes.push({
+        fontCharCode: unicode,
+        glyphId
+      });
+    }
+  }
+  if (codes.length === 0) {
+    codes.push({
+      fontCharCode: 0,
+      glyphId: 0
+    });
+  }
+  codes.sort((a, b) => a.fontCharCode - b.fontCharCode);
+  const ranges = [];
+  const length = codes.length;
+  for (let n = 0; n < length;) {
+    const start = codes[n].fontCharCode;
+    const codeIndices = [codes[n].glyphId];
+    ++n;
+    let end = start;
+    while (n < length && end + 1 === codes[n].fontCharCode) {
+      codeIndices.push(codes[n].glyphId);
+      ++end;
+      ++n;
+      if (end === 0xffff) {
+        break;
+      }
+    }
+    ranges.push([start, end, codeIndices]);
+  }
+  return ranges;
+}
+function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) {
+  const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs);
+  const hasNonBmp = ranges.at(-1)[1] > 0xffff;
+  let i, ii, j, jj;
+  for (i = ranges.length - 1; i >= 0; --i) {
+    if (ranges[i][0] <= 0xffff) {
+      break;
+    }
+  }
+  const bmpLength = i + 1;
+  if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) {
+    ranges[i][1] = 0xfffe;
+  }
+  const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0;
+  const segCount = bmpLength + trailingRangesCount;
+  const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);
+  const segmentsLength = bmpLength * 2 + trailingRangesCount * 2;
+  const startCount = new DataBuilder({
+      exactLength: segmentsLength
+    }),
+    endCount = new DataBuilder({
+      exactLength: segmentsLength
+    }),
+    idDeltas = new DataBuilder({
+      exactLength: segmentsLength
+    }),
+    idRangeOffsets = new DataBuilder({
+      exactLength: segmentsLength
+    }),
+    glyphsIds = new DataBuilder({});
+  let bias = 0;
+  let format4Overflow = false;
+  for (i = 0, ii = bmpLength; i < ii; i++) {
+    const [start, end, codes] = ranges[i];
+    startCount.setInt16(start);
+    endCount.setInt16(end);
+    let contiguous = true;
+    for (j = 1, jj = codes.length; j < jj; ++j) {
+      if (codes[j] !== codes[j - 1] + 1) {
+        contiguous = false;
+        break;
+      }
+    }
+    if (!contiguous) {
+      const offset = (segCount - i) * 2 + bias * 2;
+      bias += end - start + 1;
+      idDeltas.skip(2);
+      if (offset > 0xffff) {
+        format4Overflow = true;
+        idRangeOffsets.skip(2);
+      } else {
+        idRangeOffsets.setInt16(offset);
+      }
+      for (j = 0, jj = codes.length; j < jj; ++j) {
+        glyphsIds.setInt16(codes[j]);
+      }
+    } else {
+      const startCode = codes[0];
+      idDeltas.setInt16(startCode - start & 0xffff);
+      idRangeOffsets.skip(2);
+    }
+  }
+  if (trailingRangesCount > 0) {
+    endCount.setArray([0xff, 0xff]);
+    startCount.setArray([0xff, 0xff]);
+    idDeltas.setArray([0x00, 0x01]);
+    idRangeOffsets.skip(2);
+  }
+  const format314 = new DataBuilder({
+    exactLength: 12 + startCount.length + endCount.length + idDeltas.length + idRangeOffsets.length + glyphsIds.length
+  });
+  format314.skip(2);
+  format314.setInt16(2 * segCount);
+  format314.setInt16(searchParams.range);
+  format314.setInt16(searchParams.entry);
+  format314.setInt16(searchParams.rangeShift);
+  format314.setArray(endCount.data);
+  format314.skip(2);
+  format314.setArray(startCount.data);
+  format314.setArray(idDeltas.data);
+  format314.setArray(idRangeOffsets.data);
+  format314.setArray(glyphsIds.data);
+  const useFormat4 = !format4Overflow && format314.length + 4 <= 0xffff;
+  const useFormat12 = hasNonBmp || !useFormat4;
+  const numTables = (useFormat4 ? 1 : 0) + (useFormat12 ? 1 : 0);
+  let format31012 = null,
+    header31012 = null;
+  if (useFormat12) {
+    format31012 = new DataBuilder({});
+    for (const range of ranges) {
+      let start = range[0];
+      const codes = range[2];
+      let code = codes[0];
+      for (j = 1, jj = codes.length; j < jj; ++j) {
+        if (codes[j] !== codes[j - 1] + 1) {
+          const end = range[0] + j - 1;
+          format31012.setInt32(start);
+          format31012.setInt32(end);
+          format31012.setInt32(code);
+          start = end + 1;
+          code = codes[j];
+        }
+      }
+      format31012.setInt32(start);
+      format31012.setInt32(range[1]);
+      format31012.setInt32(code);
+    }
+    header31012 = new DataBuilder({
+      exactLength: 16
+    });
+    header31012.setArray([0x00, 0x0c]);
+    header31012.skip(2);
+    header31012.setInt32(format31012.length + 16);
+    header31012.skip(4);
+    header31012.setInt32(format31012.length / 12);
+  }
+  const headerLength = 4 + numTables * 8;
+  const format4Length = useFormat4 ? 4 + format314.length : 0;
+  const cmap = new DataBuilder({
+    exactLength: headerLength
+  });
+  cmap.skip(2);
+  cmap.setInt16(numTables);
+  let tableOffset = headerLength;
+  if (useFormat4) {
+    cmap.setArray([0x00, 0x03]);
+    cmap.setArray([0x00, 0x01]);
+    cmap.setInt32(tableOffset);
+    tableOffset += format4Length;
+  }
+  if (useFormat12) {
+    cmap.setArray([0x00, 0x03]);
+    cmap.setArray([0x00, 0x0a]);
+    cmap.setInt32(tableOffset);
+  }
+  const table = new DataBuilder({
+    exactLength: cmap.length + format4Length + (header31012?.length ?? 0) + (format31012?.length ?? 0)
+  });
+  table.setArray(cmap.data);
+  if (useFormat4) {
+    table.setArray([0x00, 0x04]);
+    table.setInt16(format314.length + 4);
+    table.setArray(format314.data);
+  }
+  if (useFormat12) {
+    table.setArray(header31012.data);
+    table.setArray(format31012.data);
+  }
+  return table.data;
+}
+function validateOS2Table(os2, file) {
+  file.pos = (file.start || 0) + os2.offset;
+  const version = file.getUint16();
+  const minLength = [78, 86, 96, 96, 96, 100][version];
+  if (minLength === undefined || os2.length < minLength) {
+    return false;
+  }
+  file.skip(60);
+  const selection = file.getUint16();
+  if (version < 4 && selection & 0x0300) {
+    return false;
+  }
+  const firstChar = file.getUint16();
+  const lastChar = file.getUint16();
+  if (firstChar > lastChar) {
+    return false;
+  }
+  file.skip(6);
+  const usWinAscent = file.getUint16();
+  if (usWinAscent === 0) {
+    return false;
+  }
+  os2.data[8] = os2.data[9] = 0;
+  return true;
+}
+function createOS2Table(properties, charstrings, override) {
+  override ||= {
+    unitsPerEm: 0,
+    yMax: 0,
+    yMin: 0,
+    ascent: 0,
+    descent: 0
+  };
+  let ulUnicodeRange1 = 0;
+  let ulUnicodeRange2 = 0;
+  let ulUnicodeRange3 = 0;
+  let ulUnicodeRange4 = 0;
+  let firstCharIndex = null;
+  let lastCharIndex = 0;
+  let position = -1;
+  if (charstrings) {
+    for (let code in charstrings) {
+      code |= 0;
+      if (firstCharIndex > code || !firstCharIndex) {
+        firstCharIndex = code;
+      }
+      if (lastCharIndex < code) {
+        lastCharIndex = code;
+      }
+      position = getUnicodeRangeFor(code, position);
+      if (position < 32) {
+        ulUnicodeRange1 |= 1 << position;
+      } else if (position < 64) {
+        ulUnicodeRange2 |= 1 << position - 32;
+      } else if (position < 96) {
+        ulUnicodeRange3 |= 1 << position - 64;
+      } else if (position < 123) {
+        ulUnicodeRange4 |= 1 << position - 96;
+      } else {
+        throw new FormatError("Unicode ranges Bits > 123 are reserved for internal usage");
+      }
+    }
+    if (lastCharIndex > 0xffff) {
+      lastCharIndex = 0xffff;
+    }
+  } else {
+    firstCharIndex = 0;
+    lastCharIndex = 255;
+  }
+  const bbox = properties.bbox || [0, 0, 0, 0];
+  const unitsPerEm = override.unitsPerEm || (properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000);
+  const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;
+  const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));
+  let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));
+  if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
+    typoDescent = -typoDescent;
+  }
+  const winAscent = override.yMax || typoAscent;
+  const winDescent = -override.yMin || -typoDescent;
+  const os2 = new DataBuilder({
+    exactLength: 96
+  });
+  os2.setArray([0x00, 0x03]);
+  os2.setArray([0x02, 0x24]);
+  os2.setArray([0x01, 0xf4]);
+  os2.setArray([0x00, 0x05]);
+  os2.skip(2);
+  os2.setArray([0x02, 0x8a]);
+  os2.setArray([0x02, 0xbb]);
+  os2.skip(2);
+  os2.setArray([0x00, 0x8c]);
+  os2.setArray([0x02, 0x8a]);
+  os2.setArray([0x02, 0xbb]);
+  os2.skip(2);
+  os2.setArray([0x01, 0xdf]);
+  os2.setArray([0x00, 0x31]);
+  os2.setArray([0x01, 0x02]);
+  os2.skip(2);
+  os2.setArray([0x00, 0x00, 0x06, properties.fixedPitch ? 0x09 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
+  os2.setInt32(ulUnicodeRange1);
+  os2.setInt32(ulUnicodeRange2);
+  os2.setInt32(ulUnicodeRange3);
+  os2.setInt32(ulUnicodeRange4);
+  os2.setArray([0x2a, 0x32, 0x31, 0x2a]);
+  os2.setInt16(properties.italicAngle ? 1 : 0);
+  os2.setInt16(firstCharIndex || properties.firstChar);
+  os2.setInt16(lastCharIndex || properties.lastChar);
+  os2.setInt16(typoAscent);
+  os2.setInt16(typoDescent);
+  os2.setArray([0x00, 0x64]);
+  os2.setInt16(winAscent);
+  os2.setInt16(winDescent);
+  os2.skip(4 + 4);
+  os2.setInt16(properties.xHeight);
+  os2.setInt16(properties.capHeight);
+  os2.skip(2);
+  os2.setInt16(firstCharIndex || properties.firstChar);
+  os2.setArray([0x00, 0x03]);
+  return os2.data;
+}
+function createPostTable(properties) {
+  const post = new DataBuilder({
+    exactLength: 32
+  });
+  post.setArray([0x00, 0x03, 0x00, 0x00]);
+  post.setInt32(Math.floor(properties.italicAngle * 2 ** 16));
+  post.skip(2 + 2);
+  post.setInt32(properties.fixedPitch ? 1 : 0);
+  post.skip(4 + 4 + 4 + 4);
+  return post.data;
+}
+function createPostscriptName(name) {
+  return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63);
+}
+function createNameTable(name, proto) {
+  proto ||= [[], []];
+  const strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || createPostscriptName(name), proto[0][7] || "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"];
+  const stringsBytes = strings.map(s => stringToBytes(s));
+  const stringsUnicodeBytes = new Array(strings.length);
+  let i, ii, j, jj, str;
+  for (i = 0, ii = strings.length; i < ii; i++) {
+    str = proto[1][i] || strings[i];
+    const strUnicode = new DataBuilder({
+      exactLength: str.length * 2
+    });
+    for (j = 0, jj = str.length; j < jj; j++) {
+      strUnicode.setInt16(str.charCodeAt(j));
+    }
+    stringsUnicodeBytes[i] = strUnicode.data;
+  }
+  const namesBytes = [stringsBytes, stringsUnicodeBytes];
+  const platformsBytes = [[0x00, 0x01], [0x00, 0x03]];
+  const encodingsBytes = [[0x00, 0x00], [0x00, 0x01]];
+  const languagesBytes = [[0x00, 0x00], [0x04, 0x09]];
+  const nameRecords = [];
+  let strOffset = 0;
+  for (i = 0, ii = platformsBytes.length; i < ii; i++) {
+    const strs = namesBytes[i];
+    for (j = 0, jj = strs.length; j < jj; j++) {
+      str = strs[j];
+      const nameRecord = new DataBuilder({
+        exactLength: 6 + platformsBytes[i].length + encodingsBytes[i].length + languagesBytes[i].length
+      });
+      nameRecord.setArray(platformsBytes[i]);
+      nameRecord.setArray(encodingsBytes[i]);
+      nameRecord.setArray(languagesBytes[i]);
+      nameRecord.setInt16(j);
+      nameRecord.setInt16(str.length);
+      nameRecord.setInt16(strOffset);
+      nameRecords.push(nameRecord.data);
+      strOffset += str.length;
+    }
+  }
+  const namesRecordCount = stringsBytes.length * platformsBytes.length;
+  const nameTable = new DataBuilder({
+    exactLength: 6 + Math.sumPrecise(nameRecords.map(arr => arr.length)) + Math.sumPrecise(stringsBytes.map(arr => arr.length)) + Math.sumPrecise(stringsUnicodeBytes.map(arr => arr.length))
+  });
+  nameTable.skip(2);
+  nameTable.setInt16(namesRecordCount);
+  nameTable.setInt16(namesRecordCount * 12 + 6);
+  for (const arr of nameRecords) {
+    nameTable.setArray(arr);
+  }
+  for (const arr of stringsBytes) {
+    nameTable.setArray(arr);
+  }
+  for (const arr of stringsUnicodeBytes) {
+    nameTable.setArray(arr);
+  }
+  return nameTable.data;
+}
+class Font {
+  #charsCache = new Map();
+  #glyphCache = new Map();
+  charProcOperatorList;
+  constructor(name, file, properties, evaluatorOptions) {
+    this.name = name;
+    this.psName = null;
+    this.mimetype = null;
+    this.disableFontFace = evaluatorOptions.disableFontFace;
+    this.fontExtraProperties = evaluatorOptions.fontExtraProperties;
+    this.loadedName = properties.loadedName;
+    this.isType3Font = properties.isType3Font;
+    this.missingFile = false;
+    this.cssFontInfo = properties.cssFontInfo;
+    let isSerifFont = !!(properties.flags & FontFlags.Serif);
+    if (!isSerifFont && !properties.isSimulatedFlags) {
+      const stdFontMap = getStdFontMap(),
+        nonStdFontMap = getNonStdFontMap(),
+        serifFonts = getSerifFonts();
+      for (const namePart of name.split("+")) {
+        let fontName = normalizeFontName(namePart);
+        fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
+        fontName = fontName.split("-", 1)[0];
+        if (serifFonts[fontName]) {
+          isSerifFont = true;
+          break;
+        }
+      }
+    }
+    this.isSerifFont = isSerifFont;
+    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
+    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
+    let {
+      type,
+      subtype
+    } = properties;
+    this.type = type;
+    this.subtype = subtype;
+    this.systemFontInfo = properties.systemFontInfo;
+    const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/);
+    this.isInvalidPDFjsFont = !!matches;
+    if (this.isInvalidPDFjsFont) {
+      this.fallbackName = matches[1];
+    } else if (this.isMonospace) {
+      this.fallbackName = "monospace";
+    } else if (this.isSerifFont) {
+      this.fallbackName = "serif";
+    } else {
+      this.fallbackName = "sans-serif";
+    }
+    if (this.systemFontInfo?.guessFallback) {
+      this.systemFontInfo.guessFallback = false;
+      this.systemFontInfo.css += `,${this.fallbackName}`;
+    }
+    this.differences = properties.differences;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.composite = properties.composite;
+    this.cMap = properties.cMap;
+    this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS;
+    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
+    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
+    this.lineHeight = this.ascent - this.descent;
+    this.fontMatrix = properties.fontMatrix;
+    this.bbox = properties.bbox;
+    this.defaultEncoding = properties.defaultEncoding;
+    this.toUnicode = properties.toUnicode;
+    this.toFontChar = [];
+    if (properties.type === "Type3") {
+      for (let charCode = 0; charCode < 256; charCode++) {
+        this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];
+      }
+      return;
+    }
+    this.cidEncoding = properties.cidEncoding || "";
+    this.vertical = !!properties.vertical;
+    if (this.vertical) {
+      this.vmetrics = properties.vmetrics;
+      this.defaultVMetrics = properties.defaultVMetrics;
+    }
+    if (!file || file.isEmpty) {
+      if (file) {
+        warn('Font file is empty in "' + name + '" (' + this.loadedName + ")");
+      }
+      this.fallbackToSystemFont(properties);
+      return;
+    }
+    [type, subtype] = getFontFileType(file, properties);
+    if (type !== this.type || subtype !== this.subtype) {
+      info("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`);
+    }
+    let data;
+    try {
+      switch (type) {
+        case "MMType1":
+          info("MMType1 font (" + name + "), falling back to Type1.");
+        case "Type1":
+        case "CIDFontType0":
+          this.mimetype = "font/opentype";
+          const cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new CFFFont(file, properties) : new Type1Font(name, file, properties);
+          adjustWidths(properties);
+          data = this.convert(name, cff, properties);
+          break;
+        case "OpenType":
+        case "TrueType":
+        case "CIDFontType2":
+          this.mimetype = "font/opentype";
+          data = this.checkAndRepair(name, file, properties);
+          adjustWidths(properties);
+          if (this.isOpenType) {
+            type = "OpenType";
+          }
+          break;
+        default:
+          throw new FormatError(`Font ${type} is not supported`);
+      }
+    } catch (e) {
+      warn(e);
+      this.fallbackToSystemFont(properties);
+      return;
+    }
+    amendFallbackToUnicode(properties);
+    this.data = data;
+    this.type = type;
+    this.subtype = subtype;
+    this.fontMatrix = properties.fontMatrix;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.toUnicode = properties.toUnicode;
+    this.seacMap = properties.seacMap;
+  }
+  get renderer() {
+    const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);
+    return shadow(this, "renderer", renderer);
+  }
+  #getExportData(props) {
+    const data = Object.create(null);
+    for (const prop of props) {
+      const value = this[prop];
+      if (value !== undefined) {
+        data[prop] = value;
+      }
+    }
+    return data;
+  }
+  exportData() {
+    return {
+      buffer: compileFontInfo(this.#getExportData(EXPORT_DATA_PROPERTIES)),
+      charProcOperatorList: this.charProcOperatorList,
+      extra: this.fontExtraProperties ? this.#getExportData(EXPORT_DATA_EXTRA_PROPERTIES) : undefined
+    };
+  }
+  fallbackToSystemFont(properties) {
+    this.missingFile = true;
+    const {
+      name,
+      type
+    } = this;
+    let fontName = normalizeFontName(name);
+    const stdFontMap = getStdFontMap(),
+      nonStdFontMap = getNonStdFontMap();
+    const isStandardFont = !!stdFontMap[fontName];
+    const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);
+    fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
+    const fontBasicMetricsMap = getFontBasicMetrics();
+    const metrics = fontBasicMetricsMap[fontName];
+    if (metrics) {
+      if (isNaN(this.ascent)) {
+        this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS;
+      }
+      if (isNaN(this.descent)) {
+        this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS;
+      }
+      if (isNaN(this.capHeight)) {
+        this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS;
+      }
+    }
+    this.bold = /bold/i.test(fontName);
+    this.italic = /oblique|italic/i.test(fontName);
+    this.black = /Black/.test(name);
+    const isNarrow = /Narrow/.test(name);
+    this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0;
+    if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) {
+      const cidToGidMap = properties.cidToGidMap;
+      const map = [];
+      applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts());
+      if (/Arial-?Black/i.test(name)) {
+        applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack());
+      } else if (/Calibri/i.test(name)) {
+        applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri());
+      }
+      if (cidToGidMap) {
+        for (const charCode in map) {
+          const cid = map[charCode];
+          if (cidToGidMap[cid] !== undefined) {
+            map[+charCode] = cidToGidMap[cid];
+          }
+        }
+        if (cidToGidMap.length !== this.toUnicode.length && properties.hasIncludedToUnicodeMap && this.toUnicode instanceof IdentityToUnicodeMap) {
+          this.toUnicode.forEach(function (charCode, unicodeCharCode) {
+            const cid = map[charCode];
+            if (cidToGidMap[cid] === undefined) {
+              map[+charCode] = unicodeCharCode;
+            }
+          });
+        }
+      }
+      if (!(this.toUnicode instanceof IdentityToUnicodeMap)) {
+        this.toUnicode.forEach(function (charCode, unicodeCharCode) {
+          map[+charCode] = unicodeCharCode;
+        });
+      }
+      this.toFontChar = map;
+      this.toUnicode = new ToUnicodeMap(map);
+    } else if (/Symbol/i.test(fontName)) {
+      this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), this.differences);
+    } else if (/Dingbats/i.test(fontName)) {
+      this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), this.differences);
+    } else if (isStandardFont || isMappedToStandardFont) {
+      const map = buildToFontChar(this.defaultEncoding, getGlyphsUnicode(), this.differences);
+      if (type === "CIDFontType2" && !this.cidEncoding.startsWith("Identity-") && !(this.toUnicode instanceof IdentityToUnicodeMap)) {
+        this.toUnicode.forEach(function (charCode, unicodeCharCode) {
+          map[+charCode] = unicodeCharCode;
+        });
+      }
+      this.toFontChar = map;
+    } else {
+      const glyphsUnicodeMap = getGlyphsUnicode();
+      const map = [];
+      this.toUnicode.forEach((charCode, unicodeCharCode) => {
+        if (!this.composite) {
+          const glyphName = this.differences[charCode] || this.defaultEncoding[charCode];
+          const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
+          if (unicode !== -1) {
+            unicodeCharCode = unicode;
+          }
+        }
+        map[+charCode] = unicodeCharCode;
+      });
+      if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) {
+        if (/Tahoma|Verdana/i.test(name)) {
+          applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts());
+        }
+      }
+      this.toFontChar = map;
+    }
+    amendFallbackToUnicode(properties);
+    this.loadedName = fontName.split("-", 1)[0];
+  }
+  checkAndRepair(name, font, properties) {
+    const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", "fpgm", "prep", "cvt ", "CFF "];
+    function readTables(file, numTables) {
+      const tables = Object.create(null);
+      tables["OS/2"] = null;
+      tables.cmap = null;
+      tables.head = null;
+      tables.hhea = null;
+      tables.hmtx = null;
+      tables.maxp = null;
+      tables.name = null;
+      tables.post = null;
+      for (let i = 0; i < numTables; i++) {
+        const table = readTableEntry(file);
+        if (!VALID_TABLES.includes(table.tag)) {
+          continue;
+        }
+        if (table.length === 0) {
+          continue;
+        }
+        tables[table.tag] = table;
+      }
+      return tables;
+    }
+    function readTableEntry(file) {
+      const tag = file.getString(4);
+      const checksum = file.getInt32() >>> 0;
+      const offset = file.getInt32() >>> 0;
+      const length = file.getInt32() >>> 0;
+      const previousPosition = file.pos;
+      file.pos = file.start || 0;
+      file.skip(offset);
+      const data = file.getBytes(length);
+      file.pos = previousPosition;
+      if (tag === "head") {
+        data[8] = data[9] = data[10] = data[11] = 0;
+        data[17] |= 0x20;
+      }
+      const view = tag === "CFF " ? null : new DataView(data.buffer, data.byteOffset, data.byteLength);
+      return {
+        tag,
+        checksum,
+        length,
+        offset,
+        data,
+        view
+      };
+    }
+    function readOpenTypeHeader(ttf) {
+      return {
+        version: ttf.getString(4),
+        numTables: ttf.getUint16(),
+        searchRange: ttf.getUint16(),
+        entrySelector: ttf.getUint16(),
+        rangeShift: ttf.getUint16()
+      };
+    }
+    function readTrueTypeCollectionHeader(ttc) {
+      const ttcTag = ttc.getString(4);
+      assert(ttcTag === "ttcf", "Must be a TrueType Collection font.");
+      const majorVersion = ttc.getUint16();
+      const minorVersion = ttc.getUint16();
+      const numFonts = ttc.getInt32() >>> 0;
+      const offsetTable = [];
+      for (let i = 0; i < numFonts; i++) {
+        offsetTable.push(ttc.getInt32() >>> 0);
+      }
+      const header = {
+        ttcTag,
+        majorVersion,
+        minorVersion,
+        numFonts,
+        offsetTable
+      };
+      switch (majorVersion) {
+        case 1:
+          return header;
+        case 2:
+          header.dsigTag = ttc.getInt32() >>> 0;
+          header.dsigLength = ttc.getInt32() >>> 0;
+          header.dsigOffset = ttc.getInt32() >>> 0;
+          return header;
+      }
+      throw new FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`);
+    }
+    function readTrueTypeCollectionData(ttc, fontName) {
+      const {
+        numFonts,
+        offsetTable
+      } = readTrueTypeCollectionHeader(ttc);
+      const fontNameParts = fontName.split("+");
+      let fallbackData;
+      for (let i = 0; i < numFonts; i++) {
+        ttc.pos = (ttc.start || 0) + offsetTable[i];
+        const potentialHeader = readOpenTypeHeader(ttc);
+        const potentialTables = readTables(ttc, potentialHeader.numTables);
+        if (!potentialTables.name) {
+          throw new FormatError('TrueType Collection font must contain a "name" table.');
+        }
+        const [nameTable] = readNameTable(potentialTables.name);
+        for (let j = 0, jj = nameTable.length; j < jj; j++) {
+          for (let k = 0, kk = nameTable[j].length; k < kk; k++) {
+            const nameEntry = nameTable[j][k]?.replaceAll(/\s/g, "");
+            if (!nameEntry) {
+              continue;
+            }
+            if (nameEntry === fontName) {
+              return {
+                header: potentialHeader,
+                tables: potentialTables
+              };
+            }
+            if (fontNameParts.length < 2) {
+              continue;
+            }
+            for (const part of fontNameParts) {
+              if (nameEntry === part) {
+                fallbackData = {
+                  name: part,
+                  header: potentialHeader,
+                  tables: potentialTables
+                };
+              }
+            }
+          }
+        }
+      }
+      if (fallbackData) {
+        warn(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to "${fallbackData.name}" font instead.`);
+        return {
+          header: fallbackData.header,
+          tables: fallbackData.tables
+        };
+      }
+      throw new FormatError(`TrueType Collection does not contain "${fontName}" font.`);
+    }
+    function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) {
+      if (!cmap) {
+        warn("No cmap table available.");
+        return {
+          platformId: -1,
+          encodingId: -1,
+          mappings: [],
+          hasShortCmap: false
+        };
+      }
+      let segment;
+      let start = (file.start || 0) + cmap.offset;
+      file.pos = start;
+      file.skip(2);
+      const numTables = file.getUint16();
+      let potentialTable;
+      let canBreak = false;
+      for (let i = 0; i < numTables; i++) {
+        const platformId = file.getUint16();
+        const encodingId = file.getUint16();
+        const offset = file.getInt32() >>> 0;
+        let useTable = false;
+        if (potentialTable?.platformId === platformId && potentialTable?.encodingId === encodingId) {
+          continue;
+        }
+        if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) {
+          useTable = true;
+        } else if (platformId === 1 && encodingId === 0) {
+          useTable = true;
+        } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {
+          useTable = true;
+          if (!isSymbolicFont) {
+            canBreak = true;
+          }
+        } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
+          useTable = true;
+          let correctlySorted = true;
+          if (i < numTables - 1) {
+            const nextBytes = file.peekBytes(2),
+              nextPlatformId = int16(nextBytes[0], nextBytes[1]);
+            if (nextPlatformId < platformId) {
+              correctlySorted = false;
+            }
+          }
+          if (correctlySorted) {
+            canBreak = true;
+          }
+        }
+        if (useTable) {
+          potentialTable = {
+            platformId,
+            encodingId,
+            offset
+          };
+        }
+        if (canBreak) {
+          break;
+        }
+      }
+      if (potentialTable) {
+        file.pos = start + potentialTable.offset;
+      }
+      if (!potentialTable || file.peekByte() === -1) {
+        warn("Could not find a preferred cmap table.");
+        return {
+          platformId: -1,
+          encodingId: -1,
+          mappings: [],
+          hasShortCmap: false
+        };
+      }
+      const format = file.getUint16();
+      let hasShortCmap = false;
+      const mappings = [];
+      let j, glyphId;
+      if (format === 0) {
+        file.skip(2 + 2);
+        for (j = 0; j < 256; j++) {
+          const index = file.getByte();
+          if (!index) {
+            continue;
+          }
+          mappings.push({
+            charCode: j,
+            glyphId: index
+          });
+        }
+        hasShortCmap = true;
+      } else if (format === 2) {
+        file.skip(2 + 2);
+        const subHeaderKeys = [];
+        let maxSubHeaderKey = 0;
+        for (let i = 0; i < 256; i++) {
+          const subHeaderKey = file.getUint16() >> 3;
+          subHeaderKeys.push(subHeaderKey);
+          maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey);
+        }
+        const subHeaders = [];
+        for (let i = 0; i <= maxSubHeaderKey; i++) {
+          subHeaders.push({
+            firstCode: file.getUint16(),
+            entryCount: file.getUint16(),
+            idDelta: signedInt16(file.getByte(), file.getByte()),
+            idRangePos: file.pos + file.getUint16()
+          });
+        }
+        for (let i = 0; i < 256; i++) {
+          if (subHeaderKeys[i] === 0) {
+            file.pos = subHeaders[0].idRangePos + 2 * i;
+            glyphId = file.getUint16();
+            mappings.push({
+              charCode: i,
+              glyphId
+            });
+          } else {
+            const s = subHeaders[subHeaderKeys[i]];
+            for (j = 0; j < s.entryCount; j++) {
+              const charCode = (i << 8) + j + s.firstCode;
+              file.pos = s.idRangePos + 2 * j;
+              glyphId = file.getUint16();
+              if (glyphId !== 0) {
+                glyphId = (glyphId + s.idDelta) % 65536;
+              }
+              mappings.push({
+                charCode,
+                glyphId
+              });
+            }
+          }
+        }
+      } else if (format === 4) {
+        file.skip(2 + 2);
+        const segCount = file.getUint16() >> 1;
+        file.skip(6);
+        const segments = [];
+        let segIndex;
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segments.push({
+            end: file.getUint16()
+          });
+        }
+        file.skip(2);
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segments[segIndex].start = file.getUint16();
+        }
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segments[segIndex].delta = file.getUint16();
+        }
+        let offsetsCount = 0,
+          offsetIndex;
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segment = segments[segIndex];
+          const rangeOffset = file.getUint16();
+          if (!rangeOffset) {
+            segment.offsetIndex = -1;
+            continue;
+          }
+          offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
+          segment.offsetIndex = offsetIndex;
+          offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);
+        }
+        const offsets = [];
+        for (j = 0; j < offsetsCount; j++) {
+          offsets.push(file.getUint16());
+        }
+        for (segIndex = 0; segIndex < segCount; segIndex++) {
+          segment = segments[segIndex];
+          start = segment.start;
+          const end = segment.end;
+          const delta = segment.delta;
+          offsetIndex = segment.offsetIndex;
+          for (j = start; j <= end; j++) {
+            if (j === 0xffff) {
+              continue;
+            }
+            glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];
+            glyphId = glyphId + delta & 0xffff;
+            mappings.push({
+              charCode: j,
+              glyphId
+            });
+          }
+        }
+      } else if (format === 6) {
+        file.skip(2 + 2);
+        const firstCode = file.getUint16();
+        const entryCount = file.getUint16();
+        for (j = 0; j < entryCount; j++) {
+          glyphId = file.getUint16();
+          const charCode = firstCode + j;
+          mappings.push({
+            charCode,
+            glyphId
+          });
+        }
+      } else if (format === 12) {
+        file.skip(2 + 4 + 4);
+        const nGroups = file.getInt32() >>> 0;
+        for (j = 0; j < nGroups; j++) {
+          const startCharCode = file.getInt32() >>> 0;
+          const endCharCode = file.getInt32() >>> 0;
+          let glyphCode = file.getInt32() >>> 0;
+          for (let charCode = startCharCode; charCode <= endCharCode; charCode++) {
+            mappings.push({
+              charCode,
+              glyphId: glyphCode++
+            });
+          }
+        }
+      } else {
+        warn("cmap table has unsupported format: " + format);
+        return {
+          platformId: -1,
+          encodingId: -1,
+          mappings: [],
+          hasShortCmap: false
+        };
+      }
+      const finalMappings = [],
+        seenCharCodes = new Set();
+      for (const map of mappings) {
+        const {
+          charCode
+        } = map;
+        if (seenCharCodes.has(charCode)) {
+          continue;
+        }
+        seenCharCodes.add(charCode);
+        finalMappings.push(map);
+      }
+      return {
+        platformId: potentialTable.platformId,
+        encodingId: potentialTable.encodingId,
+        mappings: finalMappings.sort((a, b) => a.charCode - b.charCode),
+        hasShortCmap
+      };
+    }
+    function sanitizeMetrics(file, header, metrics, headTable, numGlyphs, dupFirstEntry) {
+      if (!header) {
+        if (metrics) {
+          metrics.data = null;
+        }
+        return;
+      }
+      file.pos = (file.start || 0) + header.offset;
+      file.pos += 4;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      file.pos += 2;
+      const caretOffset = file.getUint16();
+      file.pos += 8;
+      file.pos += 2;
+      let numOfMetrics = file.getUint16();
+      if (caretOffset !== 0) {
+        const macStyle = int16(headTable.data[44], headTable.data[45]);
+        if (!(macStyle & 2)) {
+          header.data[22] = 0;
+          header.data[23] = 0;
+        }
+      }
+      if (numOfMetrics > numGlyphs) {
+        info(`The numOfMetrics (${numOfMetrics}) should not be ` + `greater than the numGlyphs (${numGlyphs}).`);
+        numOfMetrics = numGlyphs;
+        header.data[34] = (numOfMetrics & 0xff00) >> 8;
+        header.data[35] = numOfMetrics & 0x00ff;
+      }
+      const numOfSidebearings = numGlyphs - numOfMetrics;
+      const numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);
+      if (numMissing > 0) {
+        const entries = new Uint8Array(metrics.length + numMissing * 2);
+        entries.set(metrics.data);
+        if (dupFirstEntry) {
+          entries[metrics.length] = metrics.data[2];
+          entries[metrics.length + 1] = metrics.data[3];
+        }
+        metrics.data = entries;
+      }
+    }
+    function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {
+      const glyphProfile = {
+        length: 0,
+        sizeOfInstructions: 0
+      };
+      if (sourceStart < 0 || sourceStart >= source.length || sourceEnd > source.length || sourceEnd - sourceStart <= 12) {
+        return glyphProfile;
+      }
+      const glyf = source.subarray(sourceStart, sourceEnd);
+      const xMin = signedInt16(glyf[2], glyf[3]);
+      const yMin = signedInt16(glyf[4], glyf[5]);
+      const xMax = signedInt16(glyf[6], glyf[7]);
+      const yMax = signedInt16(glyf[8], glyf[9]);
+      if (xMin > xMax) {
+        writeSignedInt16(glyf, 2, xMax);
+        writeSignedInt16(glyf, 6, xMin);
+      }
+      if (yMin > yMax) {
+        writeSignedInt16(glyf, 4, yMax);
+        writeSignedInt16(glyf, 8, yMin);
+      }
+      const contoursCount = signedInt16(glyf[0], glyf[1]);
+      if (contoursCount < 0) {
+        if (contoursCount < -1) {
+          return glyphProfile;
+        }
+        dest.set(glyf, destStart);
+        glyphProfile.length = glyf.length;
+        return glyphProfile;
+      }
+      let i,
+        j = 10,
+        flagsCount = 0;
+      for (i = 0; i < contoursCount; i++) {
+        const endPoint = glyf[j] << 8 | glyf[j + 1];
+        flagsCount = endPoint + 1;
+        j += 2;
+      }
+      const instructionsStart = j;
+      const instructionsLength = glyf[j] << 8 | glyf[j + 1];
+      glyphProfile.sizeOfInstructions = instructionsLength;
+      j += 2 + instructionsLength;
+      const instructionsEnd = j;
+      let coordinatesLength = 0;
+      for (i = 0; i < flagsCount; i++) {
+        const flag = glyf[j++];
+        if (flag & 0xc0) {
+          glyf[j - 1] = flag & 0x3f;
+        }
+        let xLength = 2;
+        if (flag & 2) {
+          xLength = 1;
+        } else if (flag & 16) {
+          xLength = 0;
+        }
+        let yLength = 2;
+        if (flag & 4) {
+          yLength = 1;
+        } else if (flag & 32) {
+          yLength = 0;
+        }
+        const xyLength = xLength + yLength;
+        coordinatesLength += xyLength;
+        if (flag & 8) {
+          const repeat = glyf[j++];
+          if (repeat === 0) {
+            glyf[j - 1] ^= 8;
+          }
+          i += repeat;
+          coordinatesLength += repeat * xyLength;
+        }
+      }
+      if (coordinatesLength === 0) {
+        return glyphProfile;
+      }
+      let glyphDataLength = j + coordinatesLength;
+      if (glyphDataLength > glyf.length) {
+        return glyphProfile;
+      }
+      if (!hintsValid && instructionsLength > 0) {
+        dest.set(glyf.subarray(0, instructionsStart), destStart);
+        dest.set([0, 0], destStart + instructionsStart);
+        dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);
+        glyphDataLength -= instructionsLength;
+        if (glyf.length - glyphDataLength > 3) {
+          glyphDataLength = glyphDataLength + 3 & ~3;
+        }
+        glyphProfile.length = glyphDataLength;
+        return glyphProfile;
+      }
+      if (glyf.length - glyphDataLength > 3) {
+        glyphDataLength = glyphDataLength + 3 & ~3;
+        dest.set(glyf.subarray(0, glyphDataLength), destStart);
+        glyphProfile.length = glyphDataLength;
+        return glyphProfile;
+      }
+      dest.set(glyf, destStart);
+      glyphProfile.length = glyf.length;
+      return glyphProfile;
+    }
+    function sanitizeHead(head, numGlyphs, locaLength) {
+      const {
+        data,
+        view
+      } = head;
+      const version = view.getInt32(0);
+      if (version >> 16 !== 1) {
+        info("Attempting to fix invalid version in head table: " + version);
+        view.setInt32(0, 0x00010000);
+      }
+      const indexToLocFormat = signedInt16(data[50], data[51]);
+      if (indexToLocFormat < 0 || indexToLocFormat > 1) {
+        info("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat);
+        const numGlyphsPlusOne = numGlyphs + 1;
+        if (locaLength === numGlyphsPlusOne << 1) {
+          data[50] = 0;
+          data[51] = 0;
+        } else if (locaLength === numGlyphsPlusOne << 2) {
+          data[50] = 0;
+          data[51] = 1;
+        } else {
+          throw new FormatError("Could not fix indexToLocFormat: " + indexToLocFormat);
+        }
+      }
+    }
+    function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) {
+      let itemSize, itemDecode, itemEncode;
+      if (isGlyphLocationsLong) {
+        itemSize = 4;
+        itemDecode = function fontItemDecodeLong(data, offset) {
+          return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
+        };
+        itemEncode = function fontItemEncodeLong(data, offset, value) {
+          data[offset] = value >>> 24 & 0xff;
+          data[offset + 1] = value >> 16 & 0xff;
+          data[offset + 2] = value >> 8 & 0xff;
+          data[offset + 3] = value & 0xff;
+        };
+      } else {
+        itemSize = 2;
+        itemDecode = function fontItemDecode(data, offset) {
+          return data[offset] << 9 | data[offset + 1] << 1;
+        };
+        itemEncode = function fontItemEncode(data, offset, value) {
+          data[offset] = value >> 9 & 0xff;
+          data[offset + 1] = value >> 1 & 0xff;
+        };
+      }
+      const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;
+      const locaDataSize = itemSize * (1 + numGlyphsOut);
+      const locaData = new Uint8Array(locaDataSize);
+      locaData.set(loca.data.subarray(0, locaDataSize));
+      loca.data = locaData;
+      const oldGlyfData = glyf.data;
+      const oldGlyfDataLength = oldGlyfData.length;
+      const newGlyfData = new Uint8Array(oldGlyfDataLength);
+      let i, j;
+      const locaEntries = [];
+      for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) {
+        let offset = itemDecode(locaData, j);
+        if (offset > oldGlyfDataLength) {
+          offset = oldGlyfDataLength;
+        }
+        locaEntries.push({
+          index: i,
+          offset,
+          endOffset: 0
+        });
+      }
+      locaEntries.sort((a, b) => a.offset - b.offset);
+      for (i = 0; i < numGlyphs; i++) {
+        locaEntries[i].endOffset = locaEntries[i + 1].offset;
+      }
+      locaEntries.sort((a, b) => a.index - b.index);
+      for (i = 0; i < numGlyphs; i++) {
+        const {
+          offset,
+          endOffset
+        } = locaEntries[i];
+        if (offset !== 0 || endOffset !== 0) {
+          break;
+        }
+        const nextOffset = locaEntries[i + 1].offset;
+        if (nextOffset === 0) {
+          continue;
+        }
+        locaEntries[i].endOffset = nextOffset;
+        break;
+      }
+      const last = locaEntries.at(-2);
+      if (last.offset !== 0 && last.endOffset === 0) {
+        last.endOffset = oldGlyfDataLength;
+      }
+      const droppedGlyphs = pruneCompositeGlyphCycles(oldGlyfData, locaEntries, numGlyphs);
+      const missingGlyphs = Object.create(null);
+      let writeOffset = 0;
+      itemEncode(locaData, 0, writeOffset);
+      for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
+        const glyphProfile = droppedGlyphs.has(i) ? {
+          length: 0,
+          sizeOfInstructions: 0
+        } : sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid);
+        const newLength = glyphProfile.length;
+        if (newLength === 0) {
+          missingGlyphs[i] = true;
+        }
+        if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {
+          maxSizeOfInstructions = glyphProfile.sizeOfInstructions;
+        }
+        writeOffset += newLength;
+        itemEncode(locaData, j, writeOffset);
+      }
+      if (writeOffset === 0) {
+        const simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
+        for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {
+          itemEncode(locaData, j, simpleGlyph.length);
+        }
+        glyf.data = simpleGlyph;
+      } else if (dupFirstEntry) {
+        const firstEntryLength = itemDecode(locaData, itemSize);
+        if (newGlyfData.length > firstEntryLength + writeOffset) {
+          glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
+        } else {
+          glyf.data = new Uint8Array(firstEntryLength + writeOffset);
+          glyf.data.set(newGlyfData.subarray(0, writeOffset));
+        }
+        glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
+        itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);
+      } else {
+        glyf.data = newGlyfData.subarray(0, writeOffset);
+      }
+      return {
+        missingGlyphs,
+        maxSizeOfInstructions
+      };
+    }
+    function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) {
+      const start = (font.start || 0) + post.offset;
+      font.pos = start;
+      const length = post.length,
+        end = start + length;
+      const version = font.getInt32();
+      font.skip(28);
+      let glyphNames;
+      let valid = true;
+      let i;
+      switch (version) {
+        case 0x00010000:
+          glyphNames = MacStandardGlyphOrdering;
+          break;
+        case 0x00020000:
+          const numGlyphs = font.getUint16();
+          if (numGlyphs !== maxpNumGlyphs) {
+            valid = false;
+            break;
+          }
+          const glyphNameIndexes = [];
+          for (i = 0; i < numGlyphs; ++i) {
+            const index = font.getUint16();
+            if (index >= 32768) {
+              valid = false;
+              break;
+            }
+            glyphNameIndexes.push(index);
+          }
+          if (!valid) {
+            break;
+          }
+          const customNames = [];
+          while (font.pos < end) {
+            const strLen = font.getByte(),
+              str = font.getString(strLen);
+            customNames.push(str);
+          }
+          glyphNames = [];
+          for (i = 0; i < numGlyphs; ++i) {
+            const j = glyphNameIndexes[i];
+            if (j < 258) {
+              glyphNames.push(MacStandardGlyphOrdering[j]);
+              continue;
+            }
+            glyphNames.push(customNames[j - 258]);
+          }
+          break;
+        case 0x00030000:
+          break;
+        default:
+          warn("Unknown/unsupported post table version " + version);
+          valid = false;
+          if (propertiesObj.defaultEncoding) {
+            glyphNames = propertiesObj.defaultEncoding;
+          }
+          break;
+      }
+      propertiesObj.glyphNames = glyphNames;
+      return valid;
+    }
+    function readNameTable(nameTable) {
+      const start = (font.start || 0) + nameTable.offset;
+      font.pos = start;
+      const names = [[], []],
+        records = [];
+      const length = nameTable.length,
+        end = start + length;
+      const format = font.getUint16();
+      const FORMAT_0_HEADER_LENGTH = 6;
+      if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
+        return [names, records];
+      }
+      const numRecords = font.getUint16();
+      const stringsStart = font.getUint16();
+      const NAME_RECORD_LENGTH = 12;
+      let i, ii;
+      for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {
+        const r = {
+          platform: font.getUint16(),
+          encoding: font.getUint16(),
+          language: font.getUint16(),
+          name: font.getUint16(),
+          length: font.getUint16(),
+          offset: font.getUint16()
+        };
+        if (isMacNameRecord(r) || isWinNameRecord(r)) {
+          records.push(r);
+        }
+      }
+      for (i = 0, ii = records.length; i < ii; i++) {
+        const record = records[i];
+        if (record.length <= 0) {
+          continue;
+        }
+        const pos = start + stringsStart + record.offset;
+        if (pos + record.length > end) {
+          continue;
+        }
+        font.pos = pos;
+        const nameIndex = record.name;
+        if (record.encoding) {
+          let str = "";
+          for (let j = 0, jj = record.length; j < jj; j += 2) {
+            str += String.fromCharCode(font.getUint16());
+          }
+          names[1][nameIndex] = str;
+        } else {
+          names[0][nameIndex] = font.getString(record.length);
+        }
+      }
+      return [names, records];
+    }
+    const TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];
+    function sanitizeTTProgram(table, ttContext) {
+      let data = table.data;
+      let i = 0,
+        j,
+        n,
+        b,
+        funcId,
+        pc,
+        lastEndf = 0,
+        lastDeff = 0;
+      const stack = [];
+      const callstack = [];
+      const functionsCalled = [];
+      let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;
+      let inFDEF = false,
+        ifLevel = 0,
+        inELSE = 0;
+      for (let ii = data.length; i < ii;) {
+        const op = data[i++];
+        if (op === 0x40) {
+          n = data[i++];
+          if (inFDEF || inELSE) {
+            i += n;
+          } else {
+            for (j = 0; j < n; j++) {
+              stack.push(data[i++]);
+            }
+          }
+        } else if (op === 0x41) {
+          n = data[i++];
+          if (inFDEF || inELSE) {
+            i += n * 2;
+          } else {
+            for (j = 0; j < n; j++) {
+              b = data[i++];
+              stack.push(signedInt16(b, data[i++]));
+            }
+          }
+        } else if ((op & 0xf8) === 0xb0) {
+          n = op - 0xb0 + 1;
+          if (inFDEF || inELSE) {
+            i += n;
+          } else {
+            for (j = 0; j < n; j++) {
+              stack.push(data[i++]);
+            }
+          }
+        } else if ((op & 0xf8) === 0xb8) {
+          n = op - 0xb8 + 1;
+          if (inFDEF || inELSE) {
+            i += n * 2;
+          } else {
+            for (j = 0; j < n; j++) {
+              b = data[i++];
+              stack.push(signedInt16(b, data[i++]));
+            }
+          }
+        } else if (op === 0x2b && !tooComplexToFollowFunctions) {
+          if (!inFDEF && !inELSE) {
+            funcId = stack.at(-1);
+            if (isNaN(funcId)) {
+              info("TT: CALL empty stack (or invalid entry).");
+            } else {
+              ttContext.functionsUsed[funcId] = true;
+              if (funcId in ttContext.functionsStackDeltas) {
+                const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId];
+                if (newStackLength < 0) {
+                  warn("TT: CALL invalid functions stack delta.");
+                  ttContext.hintsValid = false;
+                  return;
+                }
+                stack.length = newStackLength;
+              } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) {
+                callstack.push({
+                  data,
+                  i,
+                  stackTop: stack.length - 1
+                });
+                functionsCalled.push(funcId);
+                pc = ttContext.functionsDefined[funcId];
+                if (!pc) {
+                  warn("TT: CALL non-existent function");
+                  ttContext.hintsValid = false;
+                  return;
+                }
+                data = pc.data;
+                i = pc.i;
+              }
+            }
+          }
+        } else if (op === 0x2c && !tooComplexToFollowFunctions) {
+          if (inFDEF || inELSE) {
+            warn("TT: nested FDEFs not allowed");
+            tooComplexToFollowFunctions = true;
+          }
+          inFDEF = true;
+          lastDeff = i;
+          funcId = stack.pop();
+          ttContext.functionsDefined[funcId] = {
+            data,
+            i
+          };
+        } else if (op === 0x2d) {
+          if (inFDEF) {
+            inFDEF = false;
+            lastEndf = i;
+          } else {
+            pc = callstack.pop();
+            if (!pc) {
+              warn("TT: ENDF bad stack");
+              ttContext.hintsValid = false;
+              return;
+            }
+            funcId = functionsCalled.pop();
+            data = pc.data;
+            i = pc.i;
+            ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;
+          }
+        } else if (op === 0x89) {
+          if (inFDEF || inELSE) {
+            warn("TT: nested IDEFs not allowed");
+            tooComplexToFollowFunctions = true;
+          }
+          inFDEF = true;
+          lastDeff = i;
+        } else if (op === 0x58) {
+          ++ifLevel;
+        } else if (op === 0x1b) {
+          inELSE = ifLevel;
+        } else if (op === 0x59) {
+          if (inELSE === ifLevel) {
+            inELSE = 0;
+          }
+          --ifLevel;
+        } else if (op === 0x1c) {
+          if (!inFDEF && !inELSE) {
+            const offset = stack.at(-1);
+            if (offset > 0) {
+              i += offset - 1;
+            }
+          }
+        }
+        if (!inFDEF && !inELSE) {
+          let stackDelta = 0;
+          if (op <= 0x8e) {
+            stackDelta = TTOpsStackDeltas[op];
+          } else if (op >= 0xc0 && op <= 0xdf) {
+            stackDelta = -1;
+          } else if (op >= 0xe0) {
+            stackDelta = -2;
+          }
+          if (op >= 0x71 && op <= 0x75) {
+            n = stack.pop();
+            if (!isNaN(n)) {
+              stackDelta = -n * 2;
+            }
+          }
+          while (stackDelta < 0 && stack.length > 0) {
+            stack.pop();
+            stackDelta++;
+          }
+          while (stackDelta > 0) {
+            stack.push(NaN);
+            stackDelta--;
+          }
+        }
+      }
+      ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
+      const content = [data];
+      if (i > data.length) {
+        content.push(new Uint8Array(i - data.length));
+      }
+      if (lastDeff > lastEndf) {
+        warn("TT: complementing a missing function tail");
+        content.push(new Uint8Array([0x22, 0x2d]));
+      }
+      foldTTTable(table, content);
+    }
+    function checkInvalidFunctions(ttContext, maxFunctionDefs) {
+      if (ttContext.tooComplexToFollowFunctions) {
+        return;
+      }
+      if (ttContext.functionsDefined.length > maxFunctionDefs) {
+        warn("TT: more functions defined than expected");
+        ttContext.hintsValid = false;
+        return;
+      }
+      for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
+        if (j > maxFunctionDefs) {
+          warn("TT: invalid function id: " + j);
+          ttContext.hintsValid = false;
+          return;
+        }
+        if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
+          warn("TT: undefined function: " + j);
+          ttContext.hintsValid = false;
+          return;
+        }
+      }
+    }
+    function foldTTTable(table, content) {
+      if (content.length > 1) {
+        let newLength = 0;
+        let j, jj;
+        for (j = 0, jj = content.length; j < jj; j++) {
+          newLength += content[j].length;
+        }
+        newLength = newLength + 3 & ~3;
+        const result = new Uint8Array(newLength);
+        let pos = 0;
+        for (j = 0, jj = content.length; j < jj; j++) {
+          result.set(content[j], pos);
+          pos += content[j].length;
+        }
+        table.data = result;
+        table.length = newLength;
+      }
+    }
+    function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {
+      const ttContext = {
+        functionsDefined: [],
+        functionsUsed: [],
+        functionsStackDeltas: [],
+        tooComplexToFollowFunctions: false,
+        hintsValid: true
+      };
+      if (fpgm) {
+        sanitizeTTProgram(fpgm, ttContext);
+      }
+      if (prep) {
+        sanitizeTTProgram(prep, ttContext);
+      }
+      if (fpgm) {
+        checkInvalidFunctions(ttContext, maxFunctionDefs);
+      }
+      if (cvt && cvt.length & 1) {
+        const cvtData = new Uint8Array(cvt.length + 1);
+        cvtData.set(cvt.data);
+        cvt.data = cvtData;
+      }
+      return ttContext.hintsValid;
+    }
+    font = new Stream(new Uint8Array(font.getBytes()));
+    let header, tables;
+    if (isTrueTypeCollectionFile(font)) {
+      const ttcData = readTrueTypeCollectionData(font, this.name);
+      header = ttcData.header;
+      tables = ttcData.tables;
+    } else {
+      header = readOpenTypeHeader(font);
+      tables = readTables(font, header.numTables);
+    }
+    const isTrueType = !tables["CFF "];
+    let parsedCff = null;
+    if (!isTrueType) {
+      try {
+        parsedCff = new CFFParser(new Stream(tables["CFF "].data), properties, SEAC_ANALYSIS_ENABLED).parse();
+      } catch {
+        warn("Failed to parse font " + properties.loadedName);
+      }
+      if (header.version === "OTTO" && (!properties.composite || properties.fontFileN === "FontFile3" && parsedCff?.isCIDFont) || !tables.head || !tables.hhea || !tables.maxp || !tables.post) {
+        return this.convert(name, new CFFFont(new Stream(tables["CFF "].data), properties), properties);
+      }
+      delete tables.glyf;
+      delete tables.loca;
+      delete tables.fpgm;
+      delete tables.prep;
+      delete tables["cvt "];
+      this.isOpenType = true;
+    } else {
+      if (!tables.loca) {
+        throw new FormatError('Required "loca" table is not found');
+      }
+      if (!tables.glyf) {
+        warn('Required "glyf" table is not found -- trying to recover.');
+        tables.glyf = {
+          tag: "glyf",
+          data: new Uint8Array(0)
+        };
+      }
+      this.isOpenType = false;
+    }
+    if (!tables.maxp) {
+      throw new FormatError('Required "maxp" table is not found');
+    }
+    let numGlyphsFromCFF;
+    if (parsedCff) {
+      try {
+        parsedCff.duplicateFirstGlyph();
+        tables["CFF "].data = new CFFCompiler(parsedCff).compile();
+        numGlyphsFromCFF = parsedCff.charStringCount;
+      } catch {
+        warn("Failed to compile font " + properties.loadedName);
+      }
+    }
+    font.pos = (font.start || 0) + tables.maxp.offset;
+    let version = font.getInt32();
+    const numGlyphs = numGlyphsFromCFF ?? font.getUint16();
+    if (version === 0x00005000 && tables.maxp.length !== 6) {
+      tables.maxp.data = tables.maxp.data.subarray(0, 6);
+      tables.maxp.length = 6;
+    }
+    if (version !== 0x00010000 && version !== 0x00005000) {
+      if (tables.maxp.length === 6) {
+        version = 0x0005000;
+      } else if (tables.maxp.length >= 32) {
+        version = 0x00010000;
+      } else {
+        throw new FormatError(`"maxp" table has a wrong version number`);
+      }
+      writeUint32(tables.maxp.data, 0, version);
+    }
+    let isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]);
+    if (tables.loca) {
+      const locaLength = isGlyphLocationsLong ? (numGlyphs + 1) * 4 : (numGlyphs + 1) * 2;
+      if (tables.loca.length !== locaLength) {
+        warn("Incorrect 'loca' table length -- attempting to fix it.");
+        const sortedTables = Object.values(tables).filter(Boolean).sort((a, b) => a.offset - b.offset);
+        const locaIndex = sortedTables.indexOf(tables.loca);
+        const nextTable = sortedTables[locaIndex + 1] || null;
+        if (nextTable && tables.loca.offset + locaLength < nextTable.offset) {
+          const previousPos = font.pos;
+          font.pos = font.start || 0;
+          font.skip(tables.loca.offset);
+          tables.loca.data = font.getBytes(locaLength);
+          tables.loca.length = locaLength;
+          font.pos = previousPos;
+        }
+      }
+    }
+    if (properties.scaleFactors?.length === numGlyphs && isTrueType) {
+      const {
+        scaleFactors
+      } = properties;
+      const glyphs = new GlyfTable({
+        glyfTable: tables.glyf.data,
+        isGlyphLocationsLong,
+        locaTable: tables.loca.data,
+        numGlyphs
+      });
+      glyphs.scale(scaleFactors);
+      const {
+        glyf,
+        loca,
+        isLocationLong
+      } = glyphs.write();
+      tables.glyf.data = glyf;
+      tables.loca.data = loca;
+      if (isLocationLong !== !!isGlyphLocationsLong) {
+        tables.head.data[50] = 0;
+        isGlyphLocationsLong = tables.head.data[51] = isLocationLong ? 1 : 0;
+      }
+      const metrics = tables.hmtx.data;
+      for (let i = 0; i < numGlyphs; i++) {
+        const j = 4 * i;
+        const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1]));
+        metrics[j] = advanceWidth >> 8 & 0xff;
+        metrics[j + 1] = advanceWidth & 0xff;
+        const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3]));
+        writeSignedInt16(metrics, j + 2, lsb);
+      }
+    }
+    let numGlyphsOut = numGlyphs + 1;
+    let dupFirstEntry = true;
+    if (numGlyphsOut > 0xffff) {
+      dupFirstEntry = false;
+      numGlyphsOut = numGlyphs;
+      warn("Not enough space in glyfs to duplicate first glyph.");
+    }
+    let maxFunctionDefs = 0;
+    let maxSizeOfInstructions = 0;
+    if (version >= 0x00010000 && tables.maxp.length >= 32) {
+      font.pos += 8;
+      const maxZones = font.getUint16();
+      if (maxZones > 2) {
+        tables.maxp.data[14] = 0;
+        tables.maxp.data[15] = 2;
+      }
+      font.pos += 4;
+      maxFunctionDefs = font.getUint16();
+      font.pos += 4;
+      maxSizeOfInstructions = font.getUint16();
+    } else if (isTrueType && version === 0x00005000) {
+      const newMaxp = new Uint8Array(32);
+      writeUint32(newMaxp, 0, 0x00010000);
+      newMaxp[4] = numGlyphs >> 8 & 0xff;
+      newMaxp[5] = numGlyphs & 0xff;
+      newMaxp.fill(0xff, 6, 14);
+      newMaxp[15] = 2;
+      newMaxp[28] = 0xff;
+      newMaxp[29] = 0xff;
+      newMaxp[31] = 0x10;
+      tables.maxp.data = newMaxp;
+      tables.maxp.length = 32;
+      version = 0x00010000;
+    }
+    tables.maxp.data[4] = numGlyphsOut >> 8;
+    tables.maxp.data[5] = numGlyphsOut & 255;
+    const hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs);
+    if (!hintsValid) {
+      delete tables.fpgm;
+      delete tables.prep;
+      delete tables["cvt "];
+    }
+    sanitizeMetrics(font, tables.hhea, tables.hmtx, tables.head, numGlyphsOut, dupFirstEntry);
+    if (!tables.head) {
+      throw new FormatError('Required "head" table is not found');
+    }
+    sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);
+    let missingGlyphs = Object.create(null);
+    if (isTrueType) {
+      const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions);
+      missingGlyphs = glyphsInfo.missingGlyphs;
+      if (version >= 0x00010000 && tables.maxp.length >= 32) {
+        tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8;
+        tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255;
+      }
+    }
+    if (!tables.hhea) {
+      throw new FormatError('Required "hhea" table is not found');
+    }
+    if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {
+      tables.hhea.data[10] = 0xff;
+      tables.hhea.data[11] = 0xff;
+    }
+    const metricsOverride = {
+      unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),
+      yMax: signedInt16(tables.head.data[42], tables.head.data[43]),
+      yMin: signedInt16(tables.head.data[38], tables.head.data[39]),
+      ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]),
+      descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]),
+      lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9])
+    };
+    this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;
+    this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;
+    this.lineGap = metricsOverride.lineGap / metricsOverride.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;
+    }
+    if (tables.post) {
+      readPostScriptTable(tables.post, properties, numGlyphs);
+    }
+    tables.post = {
+      tag: "post",
+      data: createPostTable(properties)
+    };
+    const charCodeToGlyphId = Object.create(null);
+    function hasGlyph(glyphId) {
+      return !missingGlyphs[glyphId];
+    }
+    if (properties.composite) {
+      const cidToGidMap = properties.cidToGidMap || [];
+      const isCidToGidMapEmpty = cidToGidMap.length === 0;
+      properties.cMap.forEach(function (charCode, cid) {
+        if (typeof cid === "string") {
+          cid = convertCidString(charCode, cid, true);
+        }
+        if (cid > 0xffff) {
+          throw new FormatError("Max size of CID is 65,535");
+        }
+        let glyphId = -1;
+        if (isCidToGidMapEmpty) {
+          glyphId = cid;
+        } else if (cidToGidMap[cid] !== undefined) {
+          glyphId = cidToGidMap[cid];
+        }
+        if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {
+          charCodeToGlyphId[charCode] = glyphId;
+        }
+      });
+    } else {
+      const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding);
+      const cmapPlatformId = cmapTable.platformId;
+      const cmapEncodingId = cmapTable.encodingId;
+      const cmapMappings = cmapTable.mappings;
+      let baseEncoding = [],
+        forcePostTable = false;
+      if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || properties.baseEncodingName === "WinAnsiEncoding")) {
+        baseEncoding = getEncoding(properties.baseEncodingName);
+      }
+      if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0)) {
+        const glyphsUnicodeMap = getGlyphsUnicode();
+        for (let charCode = 0; charCode < 256; charCode++) {
+          let glyphName;
+          if (this.differences[charCode] !== undefined) {
+            glyphName = this.differences[charCode];
+          } else if (baseEncoding.length && baseEncoding[charCode] !== "") {
+            glyphName = baseEncoding[charCode];
+          } else {
+            glyphName = StandardEncoding[charCode];
+          }
+          if (!glyphName) {
+            continue;
+          }
+          const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
+          let unicodeOrCharCode;
+          if (cmapPlatformId === 3 && cmapEncodingId === 1) {
+            unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];
+          } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
+            unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName);
+          }
+          if (unicodeOrCharCode === undefined) {
+            if (!properties.glyphNames && properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof IdentityToUnicodeMap)) {
+              const unicode = this.toUnicode.get(charCode);
+              if (unicode) {
+                unicodeOrCharCode = unicode.codePointAt(0);
+              }
+            }
+            if (unicodeOrCharCode === undefined) {
+              continue;
+            }
+          }
+          for (const mapping of cmapMappings) {
+            if (mapping.charCode !== unicodeOrCharCode) {
+              continue;
+            }
+            charCodeToGlyphId[charCode] = mapping.glyphId;
+            break;
+          }
+        }
+      } else if (cmapPlatformId === 0) {
+        for (const mapping of cmapMappings) {
+          charCodeToGlyphId[mapping.charCode] = mapping.glyphId;
+        }
+        forcePostTable = true;
+      } else if (cmapPlatformId === 3 && cmapEncodingId === 0) {
+        for (const mapping of cmapMappings) {
+          let charCode = mapping.charCode;
+          if (charCode >= 0xf000 && charCode <= 0xf0ff) {
+            charCode &= 0xff;
+          }
+          charCodeToGlyphId[charCode] = mapping.glyphId;
+        }
+      } else {
+        for (const mapping of cmapMappings) {
+          charCodeToGlyphId[mapping.charCode] = mapping.glyphId;
+        }
+      }
+      if (properties.glyphNames && (baseEncoding.length || this.differences.length)) {
+        for (let i = 0; i < 256; ++i) {
+          if (!forcePostTable && charCodeToGlyphId[i] !== undefined) {
+            continue;
+          }
+          const glyphName = this.differences[i] || baseEncoding[i];
+          if (!glyphName) {
+            continue;
+          }
+          const glyphId = properties.glyphNames.indexOf(glyphName);
+          if (glyphId > 0 && hasGlyph(glyphId)) {
+            charCodeToGlyphId[i] = glyphId;
+          }
+        }
+      }
+      if (!properties.isInternalFont && charCodeToGlyphId[0] === undefined && hasGlyph(0)) {
+        charCodeToGlyphId[0] = 0;
+      }
+    }
+    if (charCodeToGlyphId.length === 0) {
+      charCodeToGlyphId[0] = 0;
+    }
+    const glyphZeroId = dupFirstEntry ? numGlyphsOut - 1 : 0;
+    if (!properties.cssFontInfo) {
+      const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId, this.toUnicode);
+      this.toFontChar = newMapping.toFontChar;
+      tables.cmap = {
+        tag: "cmap",
+        data: createCmapTable(newMapping.charCodeToGlyphId, newMapping.toUnicodeExtraMap, numGlyphsOut)
+      };
+      if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) {
+        tables["OS/2"] = {
+          tag: "OS/2",
+          data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)
+        };
+      }
+    }
+    if (!tables.name) {
+      tables.name = {
+        tag: "name",
+        data: createNameTable(this.name)
+      };
+    } else {
+      const [namePrototype, nameRecords] = readNameTable(tables.name);
+      tables.name.data = createNameTable(name, namePrototype);
+      this.psName = namePrototype[0][6] || null;
+      if (!properties.composite) {
+        adjustTrueTypeToUnicode(properties, this.isSymbolicFont, nameRecords);
+      }
+    }
+    const builder = new OpenTypeFileBuilder(header.version);
+    for (const tableTag in tables) {
+      builder.addTable(tableTag, tables[tableTag].data);
+    }
+    return builder.toArray();
+  }
+  convert(fontName, font, properties) {
+    properties.fixedPitch = false;
+    if (properties.builtInEncoding) {
+      adjustType1ToUnicode(properties, properties.builtInEncoding);
+    }
+    const glyphZeroId = font instanceof CFFFont ? font.numGlyphs - 1 : 1;
+    const mapping = font.getGlyphMapping(properties);
+    let newMapping = null;
+    let newCharCodeToGlyphId = mapping;
+    let toUnicodeExtraMap = null;
+    if (!properties.cssFontInfo) {
+      newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId, this.toUnicode);
+      this.toFontChar = newMapping.toFontChar;
+      newCharCodeToGlyphId = newMapping.charCodeToGlyphId;
+      toUnicodeExtraMap = newMapping.toUnicodeExtraMap;
+    }
+    const numGlyphs = font.numGlyphs;
+    function getCharCodes(charCodeToGlyphId, glyphId) {
+      let charCodes = null;
+      for (const charCode in charCodeToGlyphId) {
+        if (glyphId === charCodeToGlyphId[charCode]) {
+          (charCodes ||= []).push(charCode | 0);
+        }
+      }
+      return charCodes;
+    }
+    function createCharCode(charCodeToGlyphId, glyphId) {
+      for (const charCode in charCodeToGlyphId) {
+        if (glyphId === charCodeToGlyphId[charCode]) {
+          return charCode | 0;
+        }
+      }
+      newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;
+      return newMapping.nextAvailableFontCharCode++;
+    }
+    const seacs = font.seacs;
+    if (newMapping && SEAC_ANALYSIS_ENABLED && seacs?.length) {
+      const matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX;
+      const charset = font.getCharset();
+      const seacMap = Object.create(null);
+      for (let glyphId in seacs) {
+        glyphId |= 0;
+        const seac = seacs[glyphId];
+        const baseGlyphName = StandardEncoding[seac[2]];
+        const accentGlyphName = StandardEncoding[seac[3]];
+        const baseGlyphId = charset.indexOf(baseGlyphName);
+        const accentGlyphId = charset.indexOf(accentGlyphName);
+        if (baseGlyphId < 0 || accentGlyphId < 0) {
+          continue;
+        }
+        const accentOffset = {
+          x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
+          y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
+        };
+        const charCodes = getCharCodes(mapping, glyphId);
+        if (!charCodes) {
+          continue;
+        }
+        for (const charCode of charCodes) {
+          const charCodeToGlyphId = newMapping.charCodeToGlyphId;
+          const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);
+          const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);
+          seacMap[charCode] = {
+            baseFontCharCode,
+            accentFontCharCode,
+            accentOffset
+          };
+        }
+      }
+      properties.seacMap = seacMap;
+    }
+    const unitsPerEm = properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000;
+    const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F");
+    builder.addTable("CFF ", font.data);
+    builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId));
+    builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs));
+    builder.addTable("head", function fontTableHead() {
+      const dateArr = [0x00, 0x00, 0x00, 0x00, 0x9e, 0x0b, 0x7e, 0x27];
+      const head = new DataBuilder({
+        exactLength: 54
+      });
+      head.setArray([0x00, 0x01, 0x00, 0x00]);
+      head.setArray([0x00, 0x00, 0x10, 0x00]);
+      head.skip(4);
+      head.setArray([0x5f, 0x0f, 0x3c, 0xf5]);
+      head.skip(2);
+      head.setSafeInt16(unitsPerEm);
+      head.setArray(dateArr);
+      head.setArray(dateArr);
+      head.skip(2);
+      head.setSafeInt16(properties.descent);
+      head.setArray([0x0f, 0xff]);
+      head.setSafeInt16(properties.ascent);
+      head.setInt16(properties.italicAngle ? 2 : 0);
+      head.setArray([0x00, 0x11]);
+      head.skip(2 + 2 + 2);
+      return head.data;
+    }());
+    builder.addTable("hhea", function fontTableHhea() {
+      const hhea = new DataBuilder({
+        exactLength: 36
+      });
+      hhea.setArray([0x00, 0x01, 0x00, 0x00]);
+      hhea.setSafeInt16(properties.ascent);
+      hhea.setSafeInt16(properties.descent);
+      hhea.skip(2);
+      hhea.setArray([0xff, 0xff]);
+      hhea.skip(2 + 2 + 2);
+      hhea.setSafeInt16(properties.capHeight);
+      hhea.setSafeInt16(Math.tan(properties.italicAngle) * properties.xHeight);
+      hhea.skip(2 + 2 + 2 + 2 + 2 + 2);
+      hhea.setInt16(numGlyphs);
+      return hhea.data;
+    }());
+    builder.addTable("hmtx", function fontTableHmtx() {
+      const charstrings = font.charstrings;
+      const cffWidths = font.cff?.widths ?? null;
+      const hmtx = new DataBuilder({
+        exactLength: numGlyphs * 4
+      });
+      hmtx.skip(4);
+      for (let i = 1, ii = numGlyphs; i < ii; i++) {
+        let width = 0;
+        if (charstrings) {
+          width = charstrings[i - 1].width || 0;
+        } else if (cffWidths) {
+          width = Math.ceil(cffWidths[i] || 0);
+        }
+        hmtx.setInt16(width);
+        hmtx.skip(2);
+      }
+      return hmtx.data;
+    }());
+    builder.addTable("maxp", function fontTableMaxp() {
+      const maxp = new DataBuilder({
+        exactLength: 6
+      });
+      maxp.setArray([0x00, 0x00, 0x50, 0x00]);
+      maxp.setInt16(numGlyphs);
+      return maxp.data;
+    }());
+    builder.addTable("name", createNameTable(fontName));
+    builder.addTable("post", createPostTable(properties));
+    return builder.toArray();
+  }
+  get _spaceWidth() {
+    const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"];
+    let width;
+    for (const glyphName of possibleSpaceReplacements) {
+      if (glyphName in this.widths) {
+        width = this.widths[glyphName];
+        break;
+      }
+      const glyphsUnicodeMap = getGlyphsUnicode();
+      const glyphUnicode = glyphsUnicodeMap[glyphName];
+      let charcode = 0;
+      if (this.composite && this.cMap.contains(glyphUnicode)) {
+        charcode = this.cMap.lookup(glyphUnicode);
+        if (typeof charcode === "string") {
+          charcode = convertCidString(glyphUnicode, charcode);
+        }
+      }
+      if (!charcode && this.toUnicode) {
+        charcode = this.toUnicode.charCodeOf(glyphUnicode);
+      }
+      if (charcode <= 0) {
+        charcode = glyphUnicode;
+      }
+      width = this.widths[charcode];
+      if (width) {
+        break;
+      }
+    }
+    return shadow(this, "_spaceWidth", width || this.defaultWidth);
+  }
+  _charToGlyph(charcode, isSpace = false) {
+    let glyph = this.#glyphCache.get(charcode);
+    if (glyph?.isSpace === isSpace) {
+      return glyph;
+    }
+    let fontCharCode, width, operatorListId;
+    let widthCode = charcode;
+    if (this.cMap?.contains(charcode)) {
+      widthCode = this.cMap.lookup(charcode);
+      if (typeof widthCode === "string") {
+        widthCode = convertCidString(charcode, widthCode);
+      }
+    }
+    width = this.widths[widthCode];
+    if (typeof width !== "number") {
+      width = this.defaultWidth;
+    }
+    const vmetric = this.vmetrics?.[widthCode] || this.defaultVMetrics;
+    let unicode = this.toUnicode.get(charcode) || charcode;
+    if (typeof unicode === "number") {
+      unicode = String.fromCharCode(unicode);
+    }
+    let isInFont = this.toFontChar[charcode] !== undefined;
+    fontCharCode = this.toFontChar[charcode] || charcode;
+    if (this.missingFile) {
+      const glyphName = this.differences[charcode] || this.defaultEncoding[charcode];
+      if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") {
+        fontCharCode = 0x20;
+        if (glyphName === "") {
+          width ||= this._spaceWidth;
+          unicode = String.fromCharCode(fontCharCode);
+        }
+      }
+      fontCharCode = mapSpecialUnicodeValues(fontCharCode);
+    }
+    if (this.isType3Font) {
+      operatorListId = fontCharCode;
+    }
+    let accent = null;
+    if (this.seacMap?.[charcode]) {
+      isInFont = true;
+      const seac = this.seacMap[charcode];
+      fontCharCode = seac.baseFontCharCode;
+      accent = {
+        fontChar: String.fromCodePoint(seac.accentFontCharCode),
+        offset: seac.accentOffset
+      };
+    }
+    let fontChar = "";
+    if (typeof fontCharCode === "number") {
+      if (fontCharCode <= 0x10ffff) {
+        fontChar = String.fromCodePoint(fontCharCode);
+      } else {
+        warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`);
+      }
+    }
+    if (this.missingFile && this.vertical && fontChar.length === 1) {
+      const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)];
+      if (vertical) {
+        fontChar = unicode = String.fromCharCode(vertical);
+      }
+    }
+    glyph = new fonts_Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont);
+    this.#glyphCache.set(charcode, glyph);
+    return glyph;
+  }
+  charsToGlyphs(chars) {
+    let glyphs = this.#charsCache.get(chars);
+    if (glyphs) {
+      return glyphs;
+    }
+    glyphs = [];
+    if (this.cMap) {
+      const c = Object.create(null),
+        ii = chars.length;
+      let i = 0;
+      while (i < ii) {
+        this.cMap.readCharCode(chars, i, c);
+        const {
+          charcode,
+          length
+        } = c;
+        i += length;
+        const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20);
+        glyphs.push(glyph);
+      }
+    } else {
+      for (let i = 0, ii = chars.length; i < ii; ++i) {
+        const charcode = chars.charCodeAt(i);
+        const glyph = this._charToGlyph(charcode, charcode === 0x20);
+        glyphs.push(glyph);
+      }
+    }
+    this.#charsCache.set(chars, glyphs);
+    return glyphs;
+  }
+  getCharPositions(chars) {
+    const positions = [];
+    if (this.cMap) {
+      const c = Object.create(null);
+      let i = 0;
+      while (i < chars.length) {
+        this.cMap.readCharCode(chars, i, c);
+        const length = c.length;
+        positions.push([i, i + length]);
+        i += length;
+      }
+    } else {
+      for (let i = 0, ii = chars.length; i < ii; ++i) {
+        positions.push([i, i + 1]);
+      }
+    }
+    return positions;
+  }
+  get glyphCacheValues() {
+    return this.#glyphCache.values();
+  }
+  encodeString(str) {
+    const buffers = [];
+    const currentBuf = [];
+    const hasCurrentBufErrors = () => buffers.length % 2 === 1;
+    const getCharCode = this.toUnicode instanceof IdentityToUnicodeMap ? unicode => this.toUnicode.charCodeOf(unicode) : unicode => this.toUnicode.charCodeOf(String.fromCodePoint(unicode));
+    for (let i = 0, ii = str.length; i < ii; i++) {
+      const unicode = str.codePointAt(i);
+      if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) {
+        i++;
+      }
+      if (this.toUnicode) {
+        const charCode = getCharCode(unicode);
+        if (charCode !== -1) {
+          if (hasCurrentBufErrors()) {
+            buffers.push(currentBuf.join(""));
+            currentBuf.length = 0;
+          }
+          const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1;
+          for (let j = charCodeLength - 1; j >= 0; j--) {
+            currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff));
+          }
+          continue;
+        }
+      }
+      if (!hasCurrentBufErrors()) {
+        buffers.push(currentBuf.join(""));
+        currentBuf.length = 0;
+      }
+      currentBuf.push(String.fromCodePoint(unicode));
+    }
+    buffers.push(currentBuf.join(""));
+    return buffers;
+  }
+}
+class ErrorFont {
+  constructor(error) {
+    this.error = error;
+    this.loadedName = "g_font_error";
+    this.missingFile = true;
+  }
+  charsToGlyphs() {
+    return [];
+  }
+  encodeString(chars) {
+    return [chars];
+  }
+  exportData() {
+    return {
+      error: this.error
+    };
+  }
+}
+
+;// ./src/core/calibri_factors.js
+const CalibriBoldFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795, 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577, 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176, 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401, 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343, 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518, 0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, 0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, 0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, 0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, 0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, 0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, 0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, 0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, 0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.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, 0.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527, 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.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, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
+const CalibriBoldMetrics = {
+  lineHeight: 1.2207,
+  lineGap: 0.2207
+};
+const CalibriBoldItalicFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, 0.79795, 0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, 0.82577, 0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, 0.90176, 0.94908, 0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, 0.86331, 0.88401, 0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, 0.86411, 0.86411, 0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, 0.82616, 0.84548, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.19129, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.85887, 0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, 0.84548, 0.86411, 0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, 0.94908, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.87289, 0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, 0.86411, 0.81921, 0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, 0.91075, 0.8777, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.77312, 0.91926, 0.88175, 0.70823, 0.94903, 0.90872, 0.86331, 1, 1, 0.90872, 0.86331, 0.86906, 0.88116, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958, 0.90464, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908, 0.77539, 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387, 0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346, 1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356, 0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938, 0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466, 0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733, 0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, 1.02988, 0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, 0.87581, 0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, 0.86015, 1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.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, 0.88323, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, 1, 0.96068, 0.95794, 0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.92972, 0.83406, 0.91133, 0.83326, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90616, 1.81055, 0.90527, 1.81055, 1.3107, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.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, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
+const CalibriBoldItalicMetrics = {
+  lineHeight: 1.2207,
+  lineGap: 0.2207
+};
+const CalibriItalicFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, 0.77452, 0.85374, 0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, 0.77818, 0.7306, 0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, 0.8739, 0.9245, 0.9245, 0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, 1.03297, 1.07692, 0.90918, 1.03297, 0.94959, 0.9245, 0.92274, 0.9245, 0.9245, 1.02933, 0.77832, 1.20562, 0.9245, 0.8916, 0.98986, 0.86621, 0.89453, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.16359, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118, 0.84118, 0.84118, 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.84843, 0.83203, 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274, 0.92274, 0.90747, 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245, 0.89453, 0.8675, 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875, 0.86477, 0.99034, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105, 0.9245, 1, 1, 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.9375, 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249, 0.9245, 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118, 0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, 0.79776, 0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, 0.98986, 0.7306, 0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, 0.84557, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67009, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.8675, 0.90861, 0.6192, 0.7363, 0.64824, 0.82411, 0.56321, 0.85696, 1.23516, 0.8675, 0.81552, 0.7286, 0.84134, 0.73206, 0.76659, 0.86275, 0.84369, 0.90685, 0.77892, 0.85871, 1.02638, 0.89249, 0.75828, 0.84118, 0.85984, 0.77452, 0.76466, 0.79776, 0.7306, 0.90782, 0.77818, 0.903, 0.87291, 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516, 0.9849, 0.99058, 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297, 1.23516, 0.90918, 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507, 0.88832, 0.84438, 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248, 0.89404, 1.23516, 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.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, 0.85865, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309, 0.98986, 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055, 0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.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, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.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];
+const CalibriItalicMetrics = {
+  lineHeight: 1.2207,
+  lineGap: 0.2207
+};
+const CalibriRegularFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, 0.77452, 0.86503, 0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, 0.77818, 0.7306, 0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, 0.8739, 0.86128, 0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, 0.94469, 1.03297, 1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, 0.94469, 0.94469, 1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, 0.86621, 0.90527, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.08707, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.73834, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85284, 0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.8693, 0.8457, 0.89464, 0.89464, 0.89464, 0.89464, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90747, 0.86651, 0.94469, 0.94469, 0.94469, 0.94469, 0.90527, 0.94469, 0.90527, 0.8675, 0.86128, 0.8675, 0.86128, 0.8675, 0.86128, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.85193, 0.92454, 0.86477, 0.9921, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.81105, 0.84636, 0.81105, 0.84636, 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872, 0.95786, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429, 0.89385, 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122, 0.9482, 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692, 1, 1, 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.86128, 0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, 0.56963, 0.88254, 1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, 0.76659, 0.86275, 0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, 0.75657, 0.85122, 0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, 0.77818, 0.89772, 0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, 1.23516, 0.99018, 0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, 0.96576, 0.9561, 1.23516, 0.90918, 0.92578, 0.95424, 0.89746, 0.83969, 0.9482, 0.80113, 0.89442, 0.85208, 0.86155, 0.98022, 0.99018, 1.00452, 0.81209, 0.99247, 0.89181, 1.23516, 0.99018, 0.9482, 0.99018, 0.89181, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.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, 0.89464, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986, 0.94258, 0.98986, 0.94258, 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055, 0.90527, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.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, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1.07185, 0.99413, 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
+const CalibriRegularMetrics = {
+  lineHeight: 1.2207,
+  lineGap: 0.2207
+};
+
+;// ./src/core/helvetica_factors.js
+const HelveticaBoldFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.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, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.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, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, 1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, 1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, 0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, 1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, 1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, 1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, 0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 1.00001, 1.00021, 0.99926, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.99989, 1.00057, 1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994, 0.99976, 1.00035, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973, 1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 0.9996, 1.00034, 0.99999, 1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041, 1.00075, 0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 0.99973, 0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, 0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.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, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
+const HelveticaBoldMetrics = {
+  lineHeight: 1.2,
+  lineGap: 0.2
+};
+const HelveticaBoldItalicFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.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, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.01011, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99977, 1, 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998, 1.0006, 0.99977, 0.99977, 1.00022, 0.91155, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 0.99966, 1.00022, 1.00032, 1.00001, 0.99944, 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1, 1.0006, 1.00001, 0.99981, 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064, 0.99973, 0.99942, 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014, 0.99973, 1.01322, 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064, 1.00076, 0.99948, 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948, 1.00026, 0.99948, 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035, 1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967, 0.99964, 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001, 0.99973, 1.00066, 0.99967, 0.99967, 1.00041, 0.99998, 0.99999, 0.99977, 1.00022, 0.99967, 1.00001, 0.99977, 1.00026, 0.99964, 1.00031, 1.00001, 0.99999, 0.99999, 1, 1.00023, 1, 1, 0.99999, 1.00035, 1.00001, 0.99999, 0.99973, 0.99977, 0.99999, 1.00058, 0.99973, 0.99973, 0.99955, 0.9995, 1.00026, 1.00026, 1.00032, 0.99989, 1.00034, 0.99999, 1.00026, 1.00026, 1.00026, 0.99973, 0.45998, 0.99973, 1.00026, 0.99973, 1.00001, 0.99999, 0.99982, 0.99994, 0.99996, 1, 1.00042, 1.00044, 1.00029, 1.00023, 0.99973, 0.99973, 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, 1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, 1.00044, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, 0.99978, 1, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00098, 1, 1, 1, 1.00049, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.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, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
+const HelveticaBoldItalicMetrics = {
+  lineHeight: 1.35,
+  lineGap: 0.2
+};
+const HelveticaItalicFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 0.99946, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.06311, 0.99973, 1.00024, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00041, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013, 0.99924, 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022, 1.00054, 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1, 1.0006, 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945, 0.99949, 1, 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962, 1.01487, 1, 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036, 0.99947, 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036, 1.00025, 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, 1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001, 1.00019, 1.00001, 1.0001, 0.99986, 1.00001, 1.00001, 1.00038, 0.99954, 0.99954, 0.9994, 1.00066, 0.99999, 0.99977, 1.00022, 1.00054, 1.00001, 0.99977, 1.00026, 0.99975, 1.0001, 1.00001, 0.99993, 0.9995, 0.99955, 1.00016, 0.99978, 0.99974, 1.00019, 1.00022, 0.99955, 1.00053, 0.99973, 1.00089, 1.00005, 0.99967, 1.00048, 0.99973, 1.00002, 1.00034, 0.99973, 0.99973, 0.99964, 1.00006, 1.00066, 0.99947, 0.99973, 0.98894, 0.99973, 1, 0.44898, 1, 0.99946, 1, 1.00039, 1.00082, 0.99991, 0.99991, 0.99985, 1.00022, 1.00023, 1.00061, 1.00006, 0.99966, 0.99973, 0.99973, 0.99973, 1.00019, 1.0008, 1, 0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 0.98332, 1, 0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 1.00423, 0.99925, 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00049, 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 1.00003, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.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, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
+const HelveticaItalicMetrics = {
+  lineHeight: 1.35,
+  lineGap: 0.2
+};
+const HelveticaRegularFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 1.00019, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.02572, 0.99973, 1.00005, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99999, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941, 0.99924, 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022, 0.99977, 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1, 1.0006, 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978, 0.99966, 1, 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1, 0.96499, 1, 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023, 0.99933, 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023, 1.00031, 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, 1, 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962, 1.00001, 1.00092, 0.99964, 1.00001, 0.99963, 0.99999, 1.00035, 1.00035, 1.00082, 0.99962, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.9996, 0.99967, 1.00001, 1.00034, 1.00074, 1.00054, 1.00053, 1.00063, 0.99971, 0.99962, 1.00035, 0.99975, 0.99977, 0.99973, 1.00043, 0.99953, 1.0007, 0.99915, 0.99973, 1.00008, 0.99892, 1.00073, 1.00073, 1.00114, 0.99915, 1.00073, 0.99955, 0.99973, 1.00092, 0.99973, 1, 0.99998, 1, 1.0003, 1, 1.00043, 1.00001, 0.99969, 1.0003, 1, 1.00035, 1.00001, 0.9995, 1, 1.00092, 0.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006, 0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, 1, 1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.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, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
+const HelveticaRegularMetrics = {
+  lineHeight: 1.2,
+  lineGap: 0.2
+};
+
+;// ./src/core/liberationsans_widths.js
+const LiberationSansBoldWidths = [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, 1000, 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, 1000, 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, 1000, 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, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 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, 1000, 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];
+const LiberationSansBoldMapping = [-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];
+const LiberationSansBoldItalicWidths = [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, 1000, 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, 1000, 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, 1000, 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, 1000, 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, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600, 834, 834, 834, 834, 999, 500, 1000, 500, 1000, 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, 1000, 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];
+const LiberationSansBoldItalicMapping = [-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];
+const LiberationSansItalicWidths = [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, 1000, 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, 1000, 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, 1000, 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, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 998, 500, 1000, 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, 1000, 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];
+const LiberationSansItalicMapping = [-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];
+const LiberationSansRegularWidths = [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, 1000, 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, 1000, 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, 1000, 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, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 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, 1000, 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];
+const LiberationSansRegularMapping = [-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];
+
+;// ./src/core/myriadpro_factors.js
+const MyriadProBoldFactors = [1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179, 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083, 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903, 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933, 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407, 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938, 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793, 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295, 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1, 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061, 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179, 0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438, 0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938, 0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, 0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, 0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, 0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, 0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, 0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, 0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, 0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, 0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, 0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, 0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, 0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, 0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, 0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, 0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933, 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367, 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774, 1.0078, 0.95871, 0.9446, 0.95871, 0.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, 0.94083, 0.97579, 0.94083, 0.97579, 0.94083, 0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582, 0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, 0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.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];
+const MyriadProBoldMetrics = {
+  lineHeight: 1.2,
+  lineGap: 0.2
+};
+const MyriadProBoldItalicFactors = [1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, 0.92222, 0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, 0.93582, 1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, 0.83655, 0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, 0.92222, 0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, 0.91605, 0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, 1.02058, 0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, 0.98796, 0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, 0.92168, 0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, 0.92061, 0.94236, 0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, 0.80779, 0.97276, 0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, 0.91339, 1.08074, 0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, 1, 1.18616, 1, 0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, 0.99043, 0.99043, 0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.845, 0.80729, 0.77512, 0.77512, 0.77512, 0.77512, 0.98621, 0.98621, 0.98621, 0.98621, 0.95961, 0.92222, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 1.02058, 0.90251, 0.90699, 0.90699, 0.90699, 0.90699, 0.85458, 0.83659, 0.94951, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.85811, 0.78216, 0.90083, 0.90083, 0.90083, 0.90083, 0.95381, 0.95381, 0.95381, 0.95381, 0.9135, 0.92168, 0.91513, 0.91513, 0.91513, 0.91513, 0.91513, 1.08595, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.89364, 0.92332, 0.89364, 0.85576, 0.99613, 0.85576, 0.99613, 0.85576, 0.99613, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.94299, 0.76783, 0.95961, 0.91677, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.86523, 0.9135, 0.86523, 0.9135, 0.86523, 0.9135, 1, 1, 0.92222, 0.92168, 0.92222, 0.92168, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.86036, 0.97096, 0.71743, 0.98981, 1, 1, 0.95298, 0.79726, 0.95381, 1, 1, 0.79726, 0.6894, 0.79726, 0.74321, 0.81691, 1.0006, 0.92222, 0.92168, 1, 1, 0.92222, 0.92168, 0.79464, 0.92098, 0.92168, 0.90637, 0.91513, 0.90637, 0.91513, 0.90637, 0.91513, 0.909, 0.87514, 0.80729, 0.95077, 1, 1, 0.80729, 0.95077, 0.76463, 0.748, 0.76463, 0.748, 1, 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651, 0.86275, 1.04502, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.9154, 0.94236, 0.85458, 0.89364, 0.85458, 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1, 0.97276, 0.85576, 0.99613, 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.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, 0.85576, 0.80178, 0.66862, 0.7927, 0.69323, 0.88127, 0.72459, 0.89711, 0.95381, 0.85576, 0.80591, 0.7805, 0.94729, 0.77512, 0.90531, 0.92222, 0.90637, 0.98621, 0.81698, 0.92655, 0.98558, 0.92222, 0.85359, 0.90637, 0.90976, 0.83809, 0.94523, 0.86275, 0.83509, 0.93157, 0.85308, 0.83392, 0.92346, 0.98621, 0.83509, 0.92886, 0.91324, 0.92168, 0.95381, 0.90646, 0.92886, 0.90557, 0.86847, 0.90276, 0.91324, 0.86842, 0.92168, 0.99531, 0.95381, 0.9224, 0.85408, 0.92699, 0.86847, 1.0051, 0.91513, 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646, 0.97355, 0.81539, 0.89398, 0.85923, 0.95381, 0.90646, 0.91513, 0.90646, 0.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, 0.9154, 0.94236, 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694, 1, 0.89903, 1, 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896, 0.9332, 0.9332, 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1, 1, 1, 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.14542, 1, 0.79199, 0.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];
+const MyriadProBoldItalicMetrics = {
+  lineHeight: 1.2,
+  lineGap: 0.2
+};
+const MyriadProItalicFactors = [1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, 0.88307, 0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, 0.75945, 1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, 1.02058, 0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, 0.76125, 0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, 0.87514, 0.8588, 0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, 0.80811, 0.87832, 0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, 1.27014, 0.89903, 1.15012, 0.93859, 0.94399, 0.846, 0.94399, 0.81453, 1.0186, 0.94219, 0.96017, 1.03075, 1.02175, 0.912, 1.03075, 0.96998, 0.96017, 0.93859, 0.94399, 0.94399, 0.95493, 0.746, 1.12658, 0.94578, 0.91, 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537, 0.85034, 1.02058, 0.70869, 0.88465, 0.88465, 0.88465, 0.88465, 0.83537, 0.90083, 1.15012, 0.9161, 0.94565, 0.73541, 1.02058, 0.53609, 0.69353, 0.79519, 1.08595, 1, 1, 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446, 0.73361, 0.9005, 0.9005, 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864, 0.83864, 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588, 0.8588, 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512, 0.76013, 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.8075, 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424, 0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882, 0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, 0.94399, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, 0.94219, 1, 1, 0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, 0.81402, 1.02738, 0.728, 1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, 0.79475, 0.83911, 0.79475, 0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, 1, 0.87514, 0.96017, 0.86865, 0.87396, 0.96017, 0.8588, 0.93859, 0.8588, 0.93859, 0.8588, 0.93859, 0.867, 0.84759, 0.72421, 0.95493, 1, 1, 0.72421, 0.95493, 0.69866, 0.746, 0.69866, 0.746, 1, 1, 0.69866, 0.746, 1, 1, 0.77598, 0.88417, 0.77598, 1.12658, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.87832, 0.979, 0.77512, 0.882, 0.77512, 0.8562, 0.83, 0.8562, 0.83, 0.8562, 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773, 0.8075, 0.85751, 0.8562, 1, 1, 0.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, 0.85158, 0.77025, 0.62264, 0.7646, 0.65351, 0.86026, 0.69461, 0.89947, 1.03075, 0.85158, 0.77812, 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588, 0.83864, 0.77212, 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701, 0.76013, 0.89058, 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386, 0.83864, 0.8156, 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298, 0.878, 0.93942, 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787, 0.95829, 0.88, 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737, 0.91123, 0.93969, 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859, 0.91123, 0.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, 0.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219, 1, 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027, 0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, 1, 1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04828, 1, 0.74948, 0.75187, 1.02058, 0.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];
+const MyriadProItalicMetrics = {
+  lineHeight: 1.2,
+  lineGap: 0.2
+};
+const MyriadProRegularFactors = [1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, 0.90706, 0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, 0.74505, 1.23456, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, 1.02058, 0.73002, 0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, 0.79726, 0.83051, 0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, 0.8858, 0.79761, 0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, 0.89633, 0.85608, 0.8111, 0.90531, 1.0222, 1.22736, 1.0222, 1.27014, 0.89903, 0.90088, 0.86667, 1.0231, 0.896, 1.01411, 0.90083, 1.05099, 1.00512, 0.99793, 1.05326, 1.09377, 0.938, 1.06226, 1.00119, 0.99793, 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137, 0.99074, 0.962, 1.01915, 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034, 1.02058, 0.69067, 0.92241, 0.92241, 0.92241, 0.92241, 0.92006, 0.9332, 0.90088, 0.91882, 0.93484, 0.75339, 1.02058, 0.56866, 0.54324, 0.79519, 1.08595, 1, 1, 0.90088, 1, 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339, 0.91009, 0.91009, 0.91009, 0.66466, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.788, 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023, 0.86023, 0.86023, 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858, 0.8858, 1.02058, 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611, 0.89713, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896, 0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224, 0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595, 0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755, 0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, 0.90284, 0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, 0.74, 1.09377, 1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, 0.84869, 0.81441, 0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, 0.99793, 0.91887, 0.90991, 0.99793, 0.8858, 0.98714, 0.8858, 0.98714, 0.8858, 0.98714, 0.894, 0.91434, 0.74498, 0.98196, 1, 1, 0.74498, 0.98196, 0.73914, 0.792, 0.73914, 0.792, 1, 1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, 0.81363, 1.19137, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89633, 1.01915, 0.8111, 0.942, 0.8111, 0.90531, 0.856, 0.90531, 0.856, 0.90531, 0.856, 1, 0.92241, 0.91755, 0.86667, 0.788, 0.86936, 0.8858, 0.89876, 1, 1, 0.81363, 1.19137, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90388, 1.03901, 0.92138, 0.78105, 0.7154, 0.86169, 0.80513, 0.94007, 0.82528, 0.98612, 1.06226, 0.91755, 0.8126, 0.81884, 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023, 0.8126, 0.91172, 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297, 0.81363, 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157, 0.95308, 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088, 0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938, 0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007, 0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.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, 0.89633, 1.01915, 0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, 1, 0.89903, 1, 1, 1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, 1.06904, 0.89903, 0.89903, 0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, 0.72458, 1, 1, 1, 1, 0.92241, 1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.07257, 1, 0.74705, 0.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];
+const MyriadProRegularMetrics = {
+  lineHeight: 1.2,
+  lineGap: 0.2
+};
+
+;// ./src/core/segoeui_factors.js
+const SegoeuiBoldFactors = [1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847, 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406, 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489, 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361, 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304, 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527, 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862, 0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579, 0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727, 1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, 1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, 1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, 0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, 0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, 1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, 1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, 1.06085, 0.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, 0.97138, 1.08692, 0.8007, 1.02285, 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418, 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251, 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931, 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752, 0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733, 1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, 1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912, 1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167, 1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134, 0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, 1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, 0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, 1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, 1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439, 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.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, 0.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, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1, 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633, 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1, 0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416, 1.13973, 0.69825, 0.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, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18874, 1.42603, 1, 1.42603, 1.42603, 0.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];
+const SegoeuiBoldMetrics = {
+  lineHeight: 1.33008,
+  lineGap: 0
+};
+const SegoeuiBoldItalicFactors = [1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953, 1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, 1.59754, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 0.81378, 0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, 0.97363, 0.89723, 0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, 1.1406, 0.79631, 0.90128, 0.83853, 1.04396, 1.10615, 0.97552, 0.94436, 0.97552, 0.88641, 0.80527, 0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, 0.99361, 1.11144, 1.57293, 1.11144, 1.21237, 0.74627, 1.31818, 1.06585, 0.97042, 0.83055, 0.97042, 0.93503, 1.1261, 0.97042, 0.97922, 1.14236, 0.94552, 1.01054, 1.14236, 1.02471, 0.97922, 0.94165, 0.97042, 0.97042, 1.0276, 0.78929, 1.1261, 0.97922, 0.95874, 1.02197, 0.98507, 0.96752, 0.97168, 0.95107, 1.16579, 0.95107, 1.21237, 1.03959, 1.036, 1.036, 1, 1.036, 1.16579, 0.87357, 1.31818, 1.18754, 1.26781, 1.05356, 1.21237, 1.18622, 0.79487, 0.94994, 1.29004, 1.24047, 1.24047, 1.31818, 1, 0.91484, 0.9754, 1.31818, 1.1349, 1.24866, 1.05356, 1.13934, 1.15574, 1.17389, 0.73541, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.94385, 0.87897, 0.79429, 0.79429, 0.79429, 0.79429, 1.1406, 1.1406, 1.1406, 1.1406, 1.0426, 1.10615, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 1.21237, 0.97552, 1.00135, 1.00135, 1.00135, 1.00135, 0.91142, 0.94436, 0.98721, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 0.96705, 0.83055, 0.93503, 0.93503, 0.93503, 0.93503, 1.14236, 1.14236, 1.14236, 1.14236, 0.93125, 0.97922, 0.94165, 0.94165, 0.94165, 0.94165, 0.94165, 1.29004, 0.94165, 0.97922, 0.97922, 0.97922, 0.97922, 0.96752, 0.97042, 0.96752, 0.97363, 1.06585, 0.97363, 1.06585, 0.97363, 1.06585, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 1.0426, 1.0033, 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042, 0.91149, 0.97042, 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 0.97441, 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236, 1, 1, 0.83853, 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 1.10615, 0.97922, 1, 1, 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552, 0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641, 1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, 0.97168, 0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, 1.06585, 0.94385, 0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 0.95161, 1.27126, 1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, 0.86142, 1.07205, 1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, 0.99361, 1.05815, 0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, 0.84918, 0.97552, 1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, 0.9817, 1.01945, 0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, 1.14236, 1.07514, 1.04961, 0.99607, 1.02897, 1.008, 0.9898, 0.95134, 1.00639, 1.11121, 1.14236, 1.00518, 0.97981, 1.02186, 1, 1.08578, 0.94165, 0.99314, 0.98387, 0.93028, 0.93377, 1.35125, 1.07514, 1.10687, 0.93491, 1.04232, 1.00351, 1.14236, 1.07514, 0.94165, 1.07514, 1.00351, 0.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, 0.93503, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96609, 1, 1, 1, 1, 1, 1, 1.06777, 1.02197, 1.06777, 1.02197, 1.06777, 1.02197, 0.91142, 0.96752, 1, 1.21261, 0.89903, 1, 1, 0.75155, 1.04745, 1.04745, 1.04745, 1.04394, 0.98633, 0.98633, 0.98633, 0.72959, 0.72959, 1.20502, 0.91406, 1.26514, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.09125, 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1, 0.771, 1, 1, 1.15574, 1.15574, 1.15574, 1.15574, 0.86364, 0.94434, 0.86279, 0.94434, 0.86224, 1, 1, 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416, 1.13904, 0.69825, 0.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, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18775, 1.42603, 1, 1.42603, 1.42603, 0.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];
+const SegoeuiBoldItalicMetrics = {
+  lineHeight: 1.33008,
+  lineGap: 0
+};
+const SegoeuiItalicFactors = [1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, 1.15373, 1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, 0.78383, 1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, 1.17308, 0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, 0.80016, 0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, 1.03989, 0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, 0.94143, 0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, 1.45994, 0.74627, 1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, 1.06151, 0.97454, 1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, 1.01054, 0.96225, 0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, 0.94629, 0.9973, 0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, 1.17308, 0.95748, 0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, 1.23393, 1.1781, 0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, 1.09971, 1.09971, 1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, 0.9245, 1.09836, 1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, 0.74817, 0.95782, 0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, 0.95402, 0.95402, 0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, 0.87533, 0.93146, 0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, 0.96225, 0.96225, 0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, 1.00351, 1.00351, 0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, 0.97454, 0.94729, 0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.88449, 0.97454, 0.88449, 0.97454, 0.88449, 0.97454, 1, 1, 0.98039, 1.00176, 0.98039, 1.00176, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 1.16484, 0.95782, 0.93146, 0.84421, 1.12761, 0.69238, 1.08132, 1, 1, 0.98047, 0.83231, 1.16484, 1, 1, 0.84723, 1.04861, 0.84723, 0.78755, 0.83231, 1.23736, 1.03989, 1.01054, 1, 1, 1.03989, 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225, 0.96924, 0.96225, 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1, 0.80595, 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, 0.9043, 0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, 0.97454, 0.85498, 0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 0.81965, 0.81965, 0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, 0.77596, 1.05734, 1.2, 0.94729, 0.85944, 0.82791, 0.9607, 0.74817, 0.93285, 0.98039, 0.96924, 0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, 0.96924, 0.97642, 0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, 0.97296, 1.01284, 0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, 1.0976, 0.98205, 1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, 1.02148, 1.0119, 1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, 0.93574, 0.94818, 1.30679, 1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, 1.0675, 0.96225, 1.0675, 1.0326, 0.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, 0.87533, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, 0.98448, 0.9973, 0.98448, 0.9973, 0.83089, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 0.94945, 0.94945, 0.94945, 0.94945, 1.12317, 1.12317, 1.12317, 0.67603, 0.67603, 1.15621, 0.73584, 1.21191, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87709, 0.96927, 1.01473, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.09836, 1.09836, 1.09836, 1.01522, 0.86321, 0.94434, 0.8649, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86438, 1.17308, 1.18416, 1.14589, 0.69825, 0.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, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603, 1.42603, 0.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];
+const SegoeuiItalicMetrics = {
+  lineHeight: 1.33008,
+  lineGap: 0
+};
+const SegoeuiRegularFactors = [1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, 1.19985, 1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, 0.78032, 1.40246, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, 1.1714, 0.80597, 0.94084, 0.96706, 0.85944, 0.85734, 0.97093, 0.75842, 0.79936, 0.88198, 0.9831, 0.95782, 0.71387, 0.86969, 0.84636, 1.07796, 1.03584, 0.96924, 0.83968, 0.96924, 0.82826, 0.79649, 0.85771, 0.95132, 0.93119, 0.98965, 0.88433, 0.8287, 0.93365, 1.08612, 1.3638, 1.08612, 1.45786, 0.74627, 0.80499, 0.91484, 1.05707, 0.92383, 1.05882, 0.9403, 1.12654, 1.05882, 1.01756, 1.09011, 1.09011, 0.99414, 1.09011, 1.034, 1.01756, 1.05356, 1.05707, 1.05882, 1.04399, 0.84863, 1.21968, 1.01756, 0.95801, 1.00068, 0.91797, 0.96777, 0.9043, 0.90351, 0.92105, 0.90351, 1.1714, 0.85337, 0.96927, 0.96927, 0.99912, 0.96927, 0.92105, 0.80597, 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808, 0.75155, 0.94261, 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032, 0.61584, 1.05425, 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734, 0.75842, 0.75842, 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782, 0.97093, 1.03584, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714, 0.96924, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383, 0.9403, 0.9403, 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527, 1.01756, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923, 1.01756, 1.01756, 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706, 0.91484, 0.96706, 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093, 1.05882, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1, 0.9831, 1.01756, 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011, 1, 1, 0.99414, 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298, 0.84636, 1.23297, 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444, 1.01756, 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066, 0.98293, 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, 0.85771, 1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, 0.8287, 0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, 1.08571, 0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, 1, 0.85771, 1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, 0.55572, 1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, 0.92366, 0.98601, 1.03405, 0.77968, 1.09799, 1.2, 0.96706, 0.85944, 0.85638, 0.96491, 0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, 1.07796, 1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, 0.8287, 0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, 1.03424, 1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, 1.03424, 1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, 0.9087, 1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, 1.05205, 1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.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, 0.9403, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, 1, 0.98965, 1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, 1.13196, 1.13196, 1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, 0.96927, 1.01518, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, 1.11358, 1.06967, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86507, 1.1714, 1.18416, 1.14589, 0.69825, 0.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, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18083, 1.42603, 1, 1.42603, 1.42603, 0.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];
+const SegoeuiRegularMetrics = {
+  lineHeight: 1.33008,
+  lineGap: 0
+};
+
+;// ./src/core/xfa_fonts.js
+
+
+
+
+
+
+
+
+const getXFAFontMap = getLookupTableFactory(function (t) {
+  t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = {
+    name: "LiberationSans-Regular",
+    factors: MyriadProRegularFactors,
+    baseWidths: LiberationSansRegularWidths,
+    baseMapping: LiberationSansRegularMapping,
+    metrics: MyriadProRegularMetrics
+  };
+  t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = {
+    name: "LiberationSans-Bold",
+    factors: MyriadProBoldFactors,
+    baseWidths: LiberationSansBoldWidths,
+    baseMapping: LiberationSansBoldMapping,
+    metrics: MyriadProBoldMetrics
+  };
+  t["MyriadPro-It"] = t["MyriadPro-Italic"] = t["PdfJS-Fallback-Italic"] = {
+    name: "LiberationSans-Italic",
+    factors: MyriadProItalicFactors,
+    baseWidths: LiberationSansItalicWidths,
+    baseMapping: LiberationSansItalicMapping,
+    metrics: MyriadProItalicMetrics
+  };
+  t["MyriadPro-BoldIt"] = t["MyriadPro-BoldItalic"] = t["PdfJS-Fallback-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    factors: MyriadProBoldItalicFactors,
+    baseWidths: LiberationSansBoldItalicWidths,
+    baseMapping: LiberationSansBoldItalicMapping,
+    metrics: MyriadProBoldItalicMetrics
+  };
+  t.ArialMT = t.Arial = t["Arial-Regular"] = {
+    name: "LiberationSans-Regular",
+    baseWidths: LiberationSansRegularWidths,
+    baseMapping: LiberationSansRegularMapping
+  };
+  t["Arial-BoldMT"] = t["Arial-Bold"] = {
+    name: "LiberationSans-Bold",
+    baseWidths: LiberationSansBoldWidths,
+    baseMapping: LiberationSansBoldMapping
+  };
+  t["Arial-ItalicMT"] = t["Arial-Italic"] = {
+    name: "LiberationSans-Italic",
+    baseWidths: LiberationSansItalicWidths,
+    baseMapping: LiberationSansItalicMapping
+  };
+  t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    baseWidths: LiberationSansBoldItalicWidths,
+    baseMapping: LiberationSansBoldItalicMapping
+  };
+  t["Calibri-Regular"] = {
+    name: "LiberationSans-Regular",
+    factors: CalibriRegularFactors,
+    baseWidths: LiberationSansRegularWidths,
+    baseMapping: LiberationSansRegularMapping,
+    metrics: CalibriRegularMetrics
+  };
+  t["Calibri-Bold"] = {
+    name: "LiberationSans-Bold",
+    factors: CalibriBoldFactors,
+    baseWidths: LiberationSansBoldWidths,
+    baseMapping: LiberationSansBoldMapping,
+    metrics: CalibriBoldMetrics
+  };
+  t["Calibri-Italic"] = {
+    name: "LiberationSans-Italic",
+    factors: CalibriItalicFactors,
+    baseWidths: LiberationSansItalicWidths,
+    baseMapping: LiberationSansItalicMapping,
+    metrics: CalibriItalicMetrics
+  };
+  t["Calibri-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    factors: CalibriBoldItalicFactors,
+    baseWidths: LiberationSansBoldItalicWidths,
+    baseMapping: LiberationSansBoldItalicMapping,
+    metrics: CalibriBoldItalicMetrics
+  };
+  t["Segoeui-Regular"] = {
+    name: "LiberationSans-Regular",
+    factors: SegoeuiRegularFactors,
+    baseWidths: LiberationSansRegularWidths,
+    baseMapping: LiberationSansRegularMapping,
+    metrics: SegoeuiRegularMetrics
+  };
+  t["Segoeui-Bold"] = {
+    name: "LiberationSans-Bold",
+    factors: SegoeuiBoldFactors,
+    baseWidths: LiberationSansBoldWidths,
+    baseMapping: LiberationSansBoldMapping,
+    metrics: SegoeuiBoldMetrics
+  };
+  t["Segoeui-Italic"] = {
+    name: "LiberationSans-Italic",
+    factors: SegoeuiItalicFactors,
+    baseWidths: LiberationSansItalicWidths,
+    baseMapping: LiberationSansItalicMapping,
+    metrics: SegoeuiItalicMetrics
+  };
+  t["Segoeui-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    factors: SegoeuiBoldItalicFactors,
+    baseWidths: LiberationSansBoldItalicWidths,
+    baseMapping: LiberationSansBoldItalicMapping,
+    metrics: SegoeuiBoldItalicMetrics
+  };
+  t["Helvetica-Regular"] = t.Helvetica = {
+    name: "LiberationSans-Regular",
+    factors: HelveticaRegularFactors,
+    baseWidths: LiberationSansRegularWidths,
+    baseMapping: LiberationSansRegularMapping,
+    metrics: HelveticaRegularMetrics
+  };
+  t["Helvetica-Bold"] = {
+    name: "LiberationSans-Bold",
+    factors: HelveticaBoldFactors,
+    baseWidths: LiberationSansBoldWidths,
+    baseMapping: LiberationSansBoldMapping,
+    metrics: HelveticaBoldMetrics
+  };
+  t["Helvetica-Italic"] = {
+    name: "LiberationSans-Italic",
+    factors: HelveticaItalicFactors,
+    baseWidths: LiberationSansItalicWidths,
+    baseMapping: LiberationSansItalicMapping,
+    metrics: HelveticaItalicMetrics
+  };
+  t["Helvetica-BoldItalic"] = {
+    name: "LiberationSans-BoldItalic",
+    factors: HelveticaBoldItalicFactors,
+    baseWidths: LiberationSansBoldItalicWidths,
+    baseMapping: LiberationSansBoldItalicMapping,
+    metrics: HelveticaBoldItalicMetrics
+  };
+});
+function getXfaFontName(name) {
+  const fontName = normalizeFontName(name);
+  const fontMap = getXFAFontMap();
+  return fontMap[fontName];
+}
+function getXfaFontWidths(name) {
+  const info = getXfaFontName(name);
+  if (!info) {
+    return null;
+  }
+  const {
+    baseWidths,
+    baseMapping,
+    factors
+  } = info;
+  const rescaledBaseWidths = !factors ? baseWidths : baseWidths.map((w, i) => w * factors[i]);
+  let currentCode = -2;
+  let currentArray;
+  const newWidths = [];
+  for (const [unicode, glyphIndex] of baseMapping.map((charUnicode, index) => [charUnicode, index]).sort(([unicode1], [unicode2]) => unicode1 - unicode2)) {
+    if (unicode === -1) {
+      continue;
+    }
+    if (unicode === currentCode + 1) {
+      currentArray.push(rescaledBaseWidths[glyphIndex]);
+      currentCode += 1;
+    } else {
+      currentCode = unicode;
+      currentArray = [rescaledBaseWidths[glyphIndex]];
+      newWidths.push(unicode, currentArray);
+    }
+  }
+  return newWidths;
+}
+function getXfaFontDict(name) {
+  const widths = getXfaFontWidths(name);
+  const dict = new Dict(null);
+  dict.set("BaseFont", Name.get(name));
+  dict.set("Type", Name.get("Font"));
+  dict.set("Subtype", Name.get("CIDFontType2"));
+  dict.set("Encoding", Name.get("Identity-H"));
+  dict.set("CIDToGIDMap", Name.get("Identity"));
+  dict.set("W", widths);
+  dict.set("FirstChar", widths[0]);
+  dict.set("LastChar", widths.at(-2) + widths.at(-1).length - 1);
+  const descriptor = new Dict(null);
+  dict.set("FontDescriptor", descriptor);
+  const systemInfo = new Dict(null);
+  systemInfo.set("Ordering", "Identity");
+  systemInfo.set("Registry", "Adobe");
+  systemInfo.set("Supplement", 0);
+  dict.set("CIDSystemInfo", systemInfo);
+  return dict;
+}
+
+;// ./src/core/postscript/lexer.js
+const TOKEN = {
+  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(id, value = null) {
+    this.id = id;
+    this.value = value;
+  }
+}
+class lexer_Lexer {
+  static #singletons = null;
+  static #operatorSingletons = null;
+  static #initSingletons() {
+    const singletons = Object.create(null);
+    const operatorSingletons = Object.create(null);
+    for (const [name, id] of Object.entries(TOKEN)) {
+      if (name === "number") {
+        continue;
+      }
+      const isOperator = id >= TOKEN.true && id <= TOKEN.ifelse;
+      const token = new Token(id, isOperator ? name : null);
+      singletons[name] = token;
+      if (isOperator) {
+        operatorSingletons[name] = token;
+      }
+    }
+    this.#singletons = singletons;
+    this.#operatorSingletons = operatorSingletons;
+  }
+  constructor(data) {
+    if (!lexer_Lexer.#singletons) {
+      lexer_Lexer.#initSingletons();
+    }
+    this.data = data;
+    this.pos = 0;
+    this.len = data.length;
+    this._numberPattern = /[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?/iy;
+    this._identifierPattern = /[a-z]+/y;
+  }
+  _skipComment() {
+    const lf = this.data.indexOf("\n", this.pos);
+    const cr = this.data.indexOf("\r", this.pos);
+    const eol = Math.min(lf < 0 ? this.len : lf, cr < 0 ? this.len : cr);
+    this.pos = Math.min(eol + 1, this.len);
+  }
+  _getNumber() {
+    this._numberPattern.lastIndex = this.pos;
+    const match = this._numberPattern.exec(this.data);
+    if (!match) {
+      return new Token(TOKEN.number, 0);
+    }
+    const number = parseFloat(match[0]);
+    if (!Number.isFinite(number)) {
+      return new Token(TOKEN.number, 0);
+    }
+    this.pos = this._numberPattern.lastIndex;
+    return new Token(TOKEN.number, number);
+  }
+  _getOperator() {
+    this._identifierPattern.lastIndex = this.pos;
+    const match = this._identifierPattern.exec(this.data);
+    if (!match) {
+      return new Token(TOKEN.number, 0);
+    }
+    this.pos = this._identifierPattern.lastIndex;
+    const op = match[0];
+    const token = lexer_Lexer.#operatorSingletons[op];
+    if (!token) {
+      return new Token(TOKEN.number, 0);
+    }
+    return token;
+  }
+  next() {
+    while (this.pos < this.len) {
+      const ch = this.data.charCodeAt(this.pos++);
+      switch (ch) {
+        case 0x00:
+        case 0x09:
+        case 0x0a:
+        case 0x0c:
+        case 0x0d:
+        case 0x20:
+          break;
+        case 0x25:
+          this._skipComment();
+          break;
+        case 0x7b:
+          return lexer_Lexer.#singletons.lbrace;
+        case 0x7d:
+          return lexer_Lexer.#singletons.rbrace;
+        case 0x2b:
+        case 0x2d:
+          this.pos--;
+          return this._getNumber();
+        case 0x2e:
+          this.pos--;
+          return this._getNumber();
+        default:
+          if (ch >= 0x30 && ch <= 0x39) {
+            this.pos--;
+            return this._getNumber();
+          }
+          if (ch >= 0x61 && ch <= 0x7a) {
+            this.pos--;
+            return this._getOperator();
+          }
+          return new Token(TOKEN.number, 0);
+      }
+    }
+    return lexer_Lexer.#singletons.eof;
+  }
+}
+
+;// ./src/core/postscript/ast.js
+
+
+const PS_VALUE_TYPE = {
+  numeric: 0,
+  boolean: 1,
+  unknown: 2
+};
+const PS_NODE = {
+  program: 0,
+  block: 1,
+  number: 2,
+  operator: 3,
+  if: 4,
+  ifelse: 5,
+  arg: 6,
+  const: 7,
+  unary: 8,
+  binary: 9,
+  ternary: 10
+};
+class PsNode {
+  constructor(type) {
+    this.type = type;
+  }
+}
+class PsProgram extends PsNode {
+  constructor(body) {
+    super(PS_NODE.program);
+    this.body = body;
+  }
+}
+class PsBlock extends PsNode {
+  constructor(instructions) {
+    super(PS_NODE.block);
+    this.instructions = instructions;
+  }
+}
+class PsNumber extends PsNode {
+  constructor(value) {
+    super(PS_NODE.number);
+    this.value = value;
+  }
+}
+class PsOperator extends PsNode {
+  constructor(op) {
+    super(PS_NODE.operator);
+    this.op = op;
+  }
+}
+class PsIf extends PsNode {
+  constructor(then) {
+    super(PS_NODE.if);
+    this.then = then;
+  }
+}
+class PsIfElse extends PsNode {
+  constructor(then, otherwise) {
+    super(PS_NODE.ifelse);
+    this.then = then;
+    this.otherwise = otherwise;
+  }
+}
+class PsArgNode extends PsNode {
+  constructor(index) {
+    super(PS_NODE.arg);
+    this.index = index;
+    this.valueType = PS_VALUE_TYPE.numeric;
+  }
+}
+class PsConstNode extends PsNode {
+  constructor(value) {
+    super(PS_NODE.const);
+    this.value = value;
+    this.valueType = typeof value === "boolean" ? PS_VALUE_TYPE.boolean : PS_VALUE_TYPE.numeric;
+  }
+}
+class PsUnaryNode extends PsNode {
+  constructor(op, operand, valueType = PS_VALUE_TYPE.unknown) {
+    super(PS_NODE.unary);
+    this.op = op;
+    this.operand = operand;
+    this.valueType = valueType;
+  }
+}
+class PsBinaryNode extends PsNode {
+  constructor(op, first, second, valueType = PS_VALUE_TYPE.unknown) {
+    super(PS_NODE.binary);
+    this.op = op;
+    this.first = first;
+    this.second = second;
+    this.valueType = valueType;
+  }
+}
+class PsTernaryNode extends PsNode {
+  constructor(cond, then, otherwise, valueType = PS_VALUE_TYPE.unknown) {
+    super(PS_NODE.ternary);
+    this.cond = cond;
+    this.then = then;
+    this.otherwise = otherwise;
+    this.valueType = valueType;
+  }
+}
+class ast_Parser {
+  constructor(lexer) {
+    this.lexer = lexer;
+    this._token = null;
+  }
+  static _isRegularOperator(id) {
+    return id >= TOKEN.true && id < TOKEN.if;
+  }
+  _advance() {
+    this._token = this.lexer.next();
+  }
+  _expect(id) {
+    if (this._token.id !== id) {
+      throw new FormatError(`PostScript function: expected token id ${id}, got ${this._token.id}.`);
+    }
+    const tok = this._token;
+    this._advance();
+    return tok;
+  }
+  parse() {
+    this._advance();
+    this._expect(TOKEN.lbrace);
+    const block = this._parseBlock();
+    this._expect(TOKEN.rbrace);
+    if (this._token.id !== TOKEN.eof) {
+      warn("PostScript function: unexpected content after closing brace.");
+    }
+    return new PsProgram(block);
+  }
+  _parseBlock() {
+    const instructions = [];
+    while (true) {
+      const tok = this._token;
+      switch (tok.id) {
+        case TOKEN.number:
+          instructions.push(new PsNumber(tok.value));
+          this._advance();
+          break;
+        case TOKEN.lbrace:
+          {
+            this._advance();
+            const thenBlock = this._parseBlock();
+            this._expect(TOKEN.rbrace);
+            if (this._token.id === TOKEN.if) {
+              this._advance();
+              instructions.push(new PsIf(thenBlock));
+            } else if (this._token.id === TOKEN.lbrace) {
+              this._advance();
+              const elseBlock = this._parseBlock();
+              this._expect(TOKEN.rbrace);
+              this._expect(TOKEN.ifelse);
+              instructions.push(new PsIfElse(thenBlock, elseBlock));
+            } else {
+              throw new FormatError("PostScript function: a procedure block must be followed by 'if' or '{鈥 ifelse'.");
+            }
+            break;
+          }
+        case TOKEN.rbrace:
+        case TOKEN.eof:
+          return new PsBlock(instructions);
+        case TOKEN.if:
+        case TOKEN.ifelse:
+          throw new FormatError(`PostScript function: unexpected '${tok.value}' operator.`);
+        default:
+          if (ast_Parser._isRegularOperator(tok.id)) {
+            instructions.push(new PsOperator(tok.id));
+            this._advance();
+            break;
+          }
+          throw new FormatError(`PostScript function: unexpected token id ${tok.id}.`);
+      }
+    }
+  }
+}
+function parsePostScriptFunction(source) {
+  return new ast_Parser(new lexer_Lexer(source)).parse();
+}
+function _nodesEqual(a, b) {
+  if (a === b) {
+    return true;
+  }
+  if (a.type !== b.type) {
+    return false;
+  }
+  switch (a.type) {
+    case PS_NODE.arg:
+      return a.index === b.index;
+    case PS_NODE.const:
+      return a.value === b.value;
+    case PS_NODE.unary:
+      return a.op === b.op && _nodesEqual(a.operand, b.operand);
+    case PS_NODE.binary:
+      return a.op === b.op && _nodesEqual(a.first, b.first) && _nodesEqual(a.second, b.second);
+    case PS_NODE.ternary:
+      return _nodesEqual(a.cond, b.cond) && _nodesEqual(a.then, b.then) && _nodesEqual(a.otherwise, b.otherwise);
+    default:
+      return false;
+  }
+}
+function _evalBinaryConst(op, a, b) {
+  switch (op) {
+    case TOKEN.add:
+      return a + b;
+    case TOKEN.sub:
+      return a - b;
+    case TOKEN.mul:
+      return a * b;
+    case TOKEN.div:
+      return b !== 0 ? a / b : 0;
+    case TOKEN.idiv:
+      return b !== 0 ? Math.trunc(a / b) : 0;
+    case TOKEN.mod:
+      return b !== 0 ? a - Math.trunc(a / b) * b : 0;
+    case TOKEN.exp:
+      {
+        const r = a ** b;
+        return Number.isFinite(r) ? r : undefined;
+      }
+    case TOKEN.atan:
+      {
+        let deg = Math.atan2(a, b) * (180 / Math.PI);
+        if (deg < 0) {
+          deg += 360;
+        }
+        return deg;
+      }
+    case TOKEN.eq:
+      return a === b;
+    case TOKEN.ne:
+      return a !== b;
+    case TOKEN.gt:
+      return a > b;
+    case TOKEN.ge:
+      return a >= b;
+    case TOKEN.lt:
+      return a < b;
+    case TOKEN.le:
+      return a <= b;
+    case TOKEN.and:
+      return typeof a === "boolean" ? a && b : a & b | 0;
+    case TOKEN.or:
+      return typeof a === "boolean" ? a || b : a | b | 0;
+    case TOKEN.xor:
+      return typeof a === "boolean" ? a !== b : a ^ b | 0;
+    case TOKEN.bitshift:
+      return b >= 0 ? a << b | 0 : a >> -b | 0;
+    case TOKEN.min:
+      return Math.min(a, b);
+    case TOKEN.max:
+      return Math.max(a, b);
+    default:
+      return undefined;
+  }
+}
+function _evalUnaryConst(op, v) {
+  switch (op) {
+    case TOKEN.abs:
+      return Math.abs(v);
+    case TOKEN.neg:
+      return -v;
+    case TOKEN.ceiling:
+      return Math.ceil(v);
+    case TOKEN.floor:
+      return Math.floor(v);
+    case TOKEN.round:
+      return Math.round(v);
+    case TOKEN.truncate:
+      return Math.trunc(v);
+    case TOKEN.sqrt:
+      {
+        const r = Math.sqrt(v);
+        return Number.isFinite(r) ? r : undefined;
+      }
+    case TOKEN.sin:
+      return Math.sin(v % 360 * Math.PI / 180);
+    case TOKEN.cos:
+      return Math.cos(v % 360 * Math.PI / 180);
+    case TOKEN.ln:
+      {
+        const r = Math.log(v);
+        return Number.isFinite(r) ? r : undefined;
+      }
+    case TOKEN.log:
+      {
+        const r = Math.log10(v);
+        return Number.isFinite(r) ? r : undefined;
+      }
+    case TOKEN.cvi:
+      return Math.trunc(v);
+    case TOKEN.cvr:
+      return v;
+    case TOKEN.not:
+      return typeof v === "boolean" ? !v : ~v;
+    default:
+      return undefined;
+  }
+}
+const MAX_STACK_SIZE = 100;
+function _unaryValueType(op, operandType) {
+  return op === TOKEN.not ? operandType : PS_VALUE_TYPE.numeric;
+}
+function _binaryValueType(op, firstType, secondType) {
+  switch (op) {
+    case TOKEN.eq:
+    case TOKEN.ne:
+    case TOKEN.gt:
+    case TOKEN.ge:
+    case TOKEN.lt:
+    case TOKEN.le:
+      return PS_VALUE_TYPE.boolean;
+    case TOKEN.and:
+    case TOKEN.or:
+    case TOKEN.xor:
+      return firstType === secondType && firstType !== PS_VALUE_TYPE.unknown ? firstType : PS_VALUE_TYPE.unknown;
+    default:
+      return PS_VALUE_TYPE.numeric;
+  }
+}
+class PSStackToTree {
+  static #binaryOps = null;
+  static #unaryOps = null;
+  static #idempotentUnary = null;
+  static #negatedComparison = null;
+  static #init() {
+    this.#binaryOps = new Set([TOKEN.add, TOKEN.sub, TOKEN.mul, TOKEN.div, TOKEN.idiv, TOKEN.mod, TOKEN.exp, TOKEN.atan, TOKEN.eq, TOKEN.ne, TOKEN.gt, TOKEN.ge, TOKEN.lt, TOKEN.le, TOKEN.and, TOKEN.or, TOKEN.xor, TOKEN.bitshift]);
+    this.#unaryOps = new Set([TOKEN.abs, TOKEN.neg, TOKEN.ceiling, TOKEN.floor, TOKEN.round, TOKEN.truncate, TOKEN.sqrt, TOKEN.sin, TOKEN.cos, TOKEN.ln, TOKEN.log, TOKEN.cvi, TOKEN.cvr, TOKEN.not]);
+    this.#idempotentUnary = new Set([TOKEN.abs, TOKEN.ceiling, TOKEN.cvi, TOKEN.cvr, TOKEN.floor, TOKEN.round, TOKEN.truncate]);
+    this.#negatedComparison = new Map([[TOKEN.eq, TOKEN.ne], [TOKEN.ne, TOKEN.eq], [TOKEN.lt, TOKEN.ge], [TOKEN.le, TOKEN.gt], [TOKEN.gt, TOKEN.le], [TOKEN.ge, TOKEN.lt]]);
+  }
+  evaluate(program, numInputs) {
+    if (!PSStackToTree.#binaryOps) {
+      PSStackToTree.#init();
+    }
+    this._failed = false;
+    if (numInputs > MAX_STACK_SIZE) {
+      return null;
+    }
+    const stack = [];
+    for (let i = 0; i < numInputs; i++) {
+      stack.push(new PsArgNode(i));
+    }
+    this._evalBlock(program.body, stack);
+    if (this._failed) {
+      return null;
+    }
+    PSStackToTree.#markShared(stack);
+    return stack;
+  }
+  static #markShared(outputs) {
+    const refCount = new Map();
+    const visit = node => {
+      if (!node || node.type === PS_NODE.arg || node.type === PS_NODE.const) {
+        return;
+      }
+      const prev = refCount.get(node) ?? 0;
+      refCount.set(node, prev + 1);
+      if (prev > 0) {
+        return;
+      }
+      switch (node.type) {
+        case PS_NODE.unary:
+          visit(node.operand);
+          break;
+        case PS_NODE.binary:
+          visit(node.first);
+          visit(node.second);
+          break;
+        case PS_NODE.ternary:
+          visit(node.cond);
+          visit(node.then);
+          visit(node.otherwise);
+          break;
+      }
+    };
+    for (const output of outputs) {
+      visit(output);
+    }
+    for (const [node, count] of refCount) {
+      if (count > 1) {
+        node.shared = true;
+        node.sharedCount = count;
+      }
+    }
+  }
+  _evalBlock(block, stack) {
+    this._evalBlockFrom(block.instructions, 0, stack);
+  }
+  _evalBlockFrom(instructions, startIdx, stack) {
+    for (let idx = startIdx; idx < instructions.length; idx++) {
+      if (this._failed) {
+        break;
+      }
+      const instr = instructions[idx];
+      switch (instr.type) {
+        case PS_NODE.number:
+          stack.push(new PsConstNode(instr.value));
+          if (stack.length > MAX_STACK_SIZE) {
+            this._failed = true;
+          }
+          break;
+        case PS_NODE.operator:
+          this._evalOp(instr.op, stack);
+          break;
+        case PS_NODE.if:
+          {
+            if (stack.length < 1) {
+              this._failed = true;
+              break;
+            }
+            const cond = stack.pop();
+            const saved = stack.slice();
+            this._evalBlock(instr.then, stack);
+            if (this._failed) {
+              break;
+            }
+            if (stack.length === saved.length) {
+              for (let i = 0; i < stack.length; i++) {
+                if (stack[i] !== saved[i]) {
+                  stack[i] = this._makeTernary(cond, stack[i], saved[i]);
+                }
+              }
+            } else if (stack.length > saved.length) {
+              if (cond.type === PS_NODE.const) {
+                if (!cond.value) {
+                  stack.length = 0;
+                  stack.push(...saved);
+                }
+                break;
+              }
+              const trueStack = stack.slice();
+              this._evalBlockFrom(instructions, idx + 1, trueStack);
+              if (this._failed) {
+                break;
+              }
+              const falseStack = saved;
+              this._evalBlockFrom(instructions, idx + 1, falseStack);
+              if (this._failed) {
+                break;
+              }
+              if (trueStack.length !== falseStack.length) {
+                const zero = new PsConstNode(0);
+                while (trueStack.length < falseStack.length) {
+                  trueStack.push(zero);
+                }
+                while (falseStack.length < trueStack.length) {
+                  falseStack.push(zero);
+                }
+              }
+              stack.length = 0;
+              for (let i = 0; i < trueStack.length; i++) {
+                stack.push(this._makeTernary(cond, trueStack[i], falseStack[i]));
+              }
+              return;
+            } else {
+              this._failed = true;
+            }
+            break;
+          }
+        case PS_NODE.ifelse:
+          {
+            if (stack.length < 1) {
+              this._failed = true;
+              break;
+            }
+            const cond = stack.pop();
+            const snapshot = stack.slice();
+            const thenStack = snapshot.slice();
+            this._evalBlock(instr.then, thenStack);
+            if (this._failed) {
+              break;
+            }
+            const elseStack = snapshot.slice();
+            this._evalBlock(instr.otherwise, elseStack);
+            if (this._failed) {
+              break;
+            }
+            if (thenStack.length !== elseStack.length) {
+              const zero = new PsConstNode(0);
+              while (thenStack.length < elseStack.length) {
+                thenStack.push(zero);
+              }
+              while (elseStack.length < thenStack.length) {
+                elseStack.push(zero);
+              }
+            }
+            stack.length = 0;
+            for (let i = 0; i < thenStack.length; i++) {
+              stack.push(this._makeTernary(cond, thenStack[i], elseStack[i]));
+            }
+            break;
+          }
+      }
+    }
+  }
+  _evalOp(op, stack) {
+    if (PSStackToTree.#binaryOps.has(op)) {
+      if (stack.length < 2) {
+        this._failed = true;
+        return;
+      }
+      const first = stack.pop();
+      const second = stack.pop();
+      stack.push(this._makeBinary(op, first, second));
+      return;
+    }
+    if (PSStackToTree.#unaryOps.has(op)) {
+      if (stack.length < 1) {
+        this._failed = true;
+        return;
+      }
+      stack.push(this._makeUnary(op, stack.pop()));
+      return;
+    }
+    switch (op) {
+      case TOKEN.true:
+        stack.push(new PsConstNode(true));
+        if (stack.length > MAX_STACK_SIZE) {
+          this._failed = true;
+        }
+        break;
+      case TOKEN.false:
+        stack.push(new PsConstNode(false));
+        if (stack.length > MAX_STACK_SIZE) {
+          this._failed = true;
+        }
+        break;
+      case TOKEN.dup:
+        if (stack.length < 1) {
+          this._failed = true;
+          break;
+        }
+        stack.push(stack.at(-1));
+        if (stack.length > MAX_STACK_SIZE) {
+          this._failed = true;
+        }
+        break;
+      case TOKEN.exch:
+        {
+          if (stack.length < 2) {
+            this._failed = true;
+            break;
+          }
+          const a = stack.pop();
+          const b = stack.pop();
+          stack.push(a, b);
+          break;
+        }
+      case TOKEN.pop:
+        if (stack.length < 1) {
+          this._failed = true;
+          break;
+        }
+        stack.pop();
+        break;
+      case TOKEN.copy:
+        {
+          if (stack.length < 1) {
+            this._failed = true;
+            break;
+          }
+          const nNode = stack.pop();
+          if (nNode.type === PS_NODE.const) {
+            const n = nNode.value | 0;
+            if (n === 0) {} else if (n < 0 || n > stack.length) {
+              this._failed = true;
+            } else {
+              stack.push(...stack.slice(-n));
+              if (stack.length > MAX_STACK_SIZE) {
+                this._failed = true;
+              }
+            }
+          } else {
+            this._failed = true;
+          }
+          break;
+        }
+      case TOKEN.index:
+        {
+          if (stack.length < 1) {
+            this._failed = true;
+            break;
+          }
+          const nNode = stack.pop();
+          if (nNode.type === PS_NODE.const) {
+            const n = nNode.value | 0;
+            if (n < 0 || n >= stack.length) {
+              this._failed = true;
+            } else {
+              stack.push(stack.at(-n - 1));
+            }
+          } else {
+            this._failed = true;
+          }
+          break;
+        }
+      case TOKEN.roll:
+        {
+          if (stack.length < 2) {
+            this._failed = true;
+            break;
+          }
+          const jNode = stack.pop();
+          const nNode = stack.pop();
+          if (nNode.type === PS_NODE.const && jNode.type === PS_NODE.const) {
+            const n = nNode.value | 0;
+            if (n === 0) {} else if (n < 0 || n > stack.length) {
+              this._failed = true;
+            } else {
+              const j = ((jNode.value | 0) % n + n) % n;
+              if (j > 0) {
+                const slice = stack.splice(-n, n);
+                stack.push(...slice.slice(n - j), ...slice.slice(0, n - j));
+              }
+            }
+          } else {
+            this._failed = true;
+          }
+          break;
+        }
+      default:
+        this._failed = true;
+        break;
+    }
+  }
+  _makeBinary(op, first, second) {
+    if (first.type === PS_NODE.const && second.type === PS_NODE.const) {
+      const v = _evalBinaryConst(op, second.value, first.value);
+      if (v !== undefined) {
+        return new PsConstNode(v);
+      }
+    }
+    if (_nodesEqual(first, second)) {
+      switch (op) {
+        case TOKEN.sub:
+          return new PsConstNode(0);
+        case TOKEN.xor:
+          return new PsConstNode(first.valueType === PS_VALUE_TYPE.boolean ? false : 0);
+        case TOKEN.and:
+        case TOKEN.or:
+          return first;
+        case TOKEN.min:
+        case TOKEN.max:
+          return first;
+        case TOKEN.eq:
+        case TOKEN.ge:
+        case TOKEN.le:
+          return new PsConstNode(true);
+        case TOKEN.ne:
+        case TOKEN.gt:
+        case TOKEN.lt:
+          return new PsConstNode(false);
+      }
+    }
+    if (first.type === PS_NODE.const) {
+      const b = first.value;
+      switch (op) {
+        case TOKEN.add:
+          if (b === 0) {
+            return second;
+          }
+          break;
+        case TOKEN.sub:
+          if (b === 0) {
+            return second;
+          }
+          break;
+        case TOKEN.mul:
+          if (b === 1) {
+            return second;
+          }
+          if (b === 0) {
+            return first;
+          }
+          if (b === -1) {
+            return this._makeUnary(TOKEN.neg, second);
+          }
+          break;
+        case TOKEN.div:
+          if (b !== 0) {
+            return this._makeBinary(TOKEN.mul, new PsConstNode(1 / b), second);
+          }
+          break;
+        case TOKEN.idiv:
+          if (b === 1) {
+            return second;
+          }
+          break;
+        case TOKEN.exp:
+          if (b === 1) {
+            return second;
+          }
+          if (b === -1) {
+            return this._makeBinary(TOKEN.div, second, new PsConstNode(1));
+          }
+          if (b === 0.5) {
+            return this._makeUnary(TOKEN.sqrt, second);
+          }
+          if (b === 0.25) {
+            const sqrtOnce = this._makeUnary(TOKEN.sqrt, second);
+            return this._makeUnary(TOKEN.sqrt, sqrtOnce);
+          }
+          if (b === 2) {
+            return this._makeBinary(TOKEN.mul, second, second);
+          }
+          if (b === 3) {
+            return this._makeBinary(TOKEN.mul, this._makeBinary(TOKEN.mul, second, second), second);
+          }
+          if (b === 4) {
+            const square = this._makeBinary(TOKEN.mul, second, second);
+            return this._makeBinary(TOKEN.mul, square, square);
+          }
+          if (b === 0) {
+            return new PsConstNode(1);
+          }
+          break;
+        case TOKEN.and:
+          if (b === true) {
+            return second;
+          }
+          if (b === false) {
+            return first;
+          }
+          break;
+        case TOKEN.or:
+          if (b === false) {
+            return second;
+          }
+          if (b === true) {
+            return first;
+          }
+          break;
+        case TOKEN.min:
+          if (second.type === PS_NODE.binary && second.op === TOKEN.max && second.first.type === PS_NODE.const && second.first.value >= b) {
+            return first;
+          }
+          break;
+        case TOKEN.max:
+          if (second.type === PS_NODE.binary && second.op === TOKEN.min && second.first.type === PS_NODE.const && second.first.value <= b) {
+            return first;
+          }
+          break;
+      }
+    }
+    if (second.type === PS_NODE.const) {
+      const a = second.value;
+      switch (op) {
+        case TOKEN.add:
+          if (a === 0) {
+            return first;
+          }
+          break;
+        case TOKEN.sub:
+          if (a === 0) {
+            return this._makeUnary(TOKEN.neg, first);
+          }
+          break;
+        case TOKEN.mul:
+          if (a === 1) {
+            return first;
+          }
+          if (a === 0) {
+            return second;
+          }
+          if (a === -1) {
+            return this._makeUnary(TOKEN.neg, first);
+          }
+          break;
+        case TOKEN.and:
+          if (a === true) {
+            return first;
+          }
+          if (a === false) {
+            return second;
+          }
+          break;
+        case TOKEN.or:
+          if (a === false) {
+            return first;
+          }
+          if (a === true) {
+            return second;
+          }
+          break;
+      }
+    }
+    return new PsBinaryNode(op, first, second, _binaryValueType(op, first.valueType, second.valueType));
+  }
+  _makeUnary(op, operand) {
+    if (operand.type === PS_NODE.const) {
+      const v = _evalUnaryConst(op, operand.value);
+      if (v !== undefined) {
+        return new PsConstNode(v);
+      }
+    }
+    if (op === TOKEN.not && operand.type === PS_NODE.binary) {
+      const negated = PSStackToTree.#negatedComparison.get(operand.op);
+      if (negated !== undefined) {
+        return new PsBinaryNode(negated, operand.first, operand.second, PS_VALUE_TYPE.boolean);
+      }
+    }
+    if (op === TOKEN.neg && operand.type === PS_NODE.binary && operand.op === TOKEN.sub) {
+      return this._makeBinary(TOKEN.sub, operand.second, operand.first);
+    }
+    if (operand.type === PS_NODE.unary) {
+      if (op === TOKEN.neg && operand.op === TOKEN.neg || op === TOKEN.not && operand.op === TOKEN.not) {
+        return operand.operand;
+      }
+      if (op === TOKEN.abs && operand.op === TOKEN.neg) {
+        return this._makeUnary(TOKEN.abs, operand.operand);
+      }
+      if (PSStackToTree.#idempotentUnary.has(op) && op === operand.op) {
+        return operand;
+      }
+    }
+    return new PsUnaryNode(op, operand, _unaryValueType(op, operand.valueType));
+  }
+  _makeTernary(cond, then, otherwise) {
+    if (cond.type === PS_NODE.const) {
+      return cond.value ? then : otherwise;
+    }
+    if (_nodesEqual(then, otherwise)) {
+      return then;
+    }
+    if (then.type === PS_NODE.const && otherwise.type === PS_NODE.const) {
+      if (then.value === true && otherwise.value === false) {
+        return cond;
+      }
+      if (then.value === false && otherwise.value === true) {
+        return this._makeUnary(TOKEN.not, cond);
+      }
+    }
+    if (cond.type === PS_NODE.binary) {
+      const {
+        op: cop,
+        first: cf,
+        second: cs
+      } = cond;
+      if (cop === TOKEN.gt || cop === TOKEN.ge) {
+        if (_nodesEqual(then, cf) && _nodesEqual(otherwise, cs)) {
+          return this._makeBinary(TOKEN.min, cf, cs);
+        }
+        if (_nodesEqual(then, cs) && _nodesEqual(otherwise, cf)) {
+          return this._makeBinary(TOKEN.max, cf, cs);
+        }
+      } else if (cop === TOKEN.lt || cop === TOKEN.le) {
+        if (_nodesEqual(then, cf) && _nodesEqual(otherwise, cs)) {
+          return this._makeBinary(TOKEN.max, cf, cs);
+        }
+        if (_nodesEqual(then, cs) && _nodesEqual(otherwise, cf)) {
+          return this._makeBinary(TOKEN.min, cf, cs);
+        }
+      }
+    }
+    return new PsTernaryNode(cond, then, otherwise, then.valueType === otherwise.valueType ? then.valueType : PS_VALUE_TYPE.unknown);
+  }
+}
+
+;// ./src/core/postscript/js_evaluator.js
+
+
+
+const OP = {
+  ARG: 0,
+  CONST: 1,
+  STORE: 2,
+  IF: 3,
+  JUMP: 4,
+  ABS: 5,
+  NEG: 6,
+  CEIL: 7,
+  FLOOR: 8,
+  ROUND: 9,
+  TRUNC: 10,
+  NOT_B: 11,
+  NOT_N: 12,
+  SQRT: 13,
+  SIN: 14,
+  COS: 15,
+  LN: 16,
+  LOG10: 17,
+  CVI: 18,
+  SHIFT: 19,
+  ADD: 20,
+  SUB: 21,
+  MUL: 22,
+  DIV: 23,
+  IDIV: 24,
+  MOD: 25,
+  POW: 26,
+  EQ: 27,
+  NE: 28,
+  GT: 29,
+  GE: 30,
+  LT: 31,
+  LE: 32,
+  AND: 33,
+  OR: 34,
+  XOR: 35,
+  ATAN: 36,
+  MIN: 37,
+  MAX: 38,
+  TEE_TMP: 39,
+  LOAD_TMP: 40
+};
+const _DEG_TO_RAD = Math.PI / 180;
+const _RAD_TO_DEG = 180 / Math.PI;
+class PsJsCompiler {
+  static #stack = new Float64Array(64);
+  static #tmp = new Float64Array(64);
+  constructor(domain, range) {
+    this.nIn = domain.length >> 1;
+    this.nOut = range.length >> 1;
+    this.range = range;
+    this.ir = [];
+    this._tmpMap = new Map();
+    this._nextTmp = 0;
+  }
+  _compileNode(node) {
+    if (node.shared) {
+      const cached = this._tmpMap.get(node);
+      if (cached !== undefined) {
+        this.ir.push(OP.LOAD_TMP, cached);
+        return true;
+      }
+      if (!this._compileNodeImpl(node)) {
+        return false;
+      }
+      const slot = this._nextTmp++;
+      this._tmpMap.set(node, slot);
+      this.ir.push(OP.TEE_TMP, slot);
+      return true;
+    }
+    return this._compileNodeImpl(node);
+  }
+  _compileNodeImpl(node) {
+    switch (node.type) {
+      case PS_NODE.arg:
+        this.ir.push(OP.ARG, node.index);
+        return true;
+      case PS_NODE.const:
+        {
+          const v = node.value;
+          this.ir.push(OP.CONST, typeof v === "boolean" ? Number(v) : v);
+          return true;
+        }
+      case PS_NODE.unary:
+        return this._compileUnary(node);
+      case PS_NODE.binary:
+        return this._compileBinary(node);
+      case PS_NODE.ternary:
+        return this._compileTernary(node);
+      default:
+        return false;
+    }
+  }
+  _compileUnary(node) {
+    const {
+      op,
+      operand,
+      valueType
+    } = node;
+    if (op === TOKEN.cvr) {
+      return this._compileNode(operand);
+    }
+    if (!this._compileNode(operand)) {
+      return false;
+    }
+    switch (op) {
+      case TOKEN.abs:
+        this.ir.push(OP.ABS);
+        break;
+      case TOKEN.neg:
+        this.ir.push(OP.NEG);
+        break;
+      case TOKEN.ceiling:
+        this.ir.push(OP.CEIL);
+        break;
+      case TOKEN.floor:
+        this.ir.push(OP.FLOOR);
+        break;
+      case TOKEN.round:
+        this.ir.push(OP.ROUND);
+        break;
+      case TOKEN.truncate:
+        this.ir.push(OP.TRUNC);
+        break;
+      case TOKEN.sqrt:
+        this.ir.push(OP.SQRT);
+        break;
+      case TOKEN.sin:
+        this.ir.push(OP.SIN);
+        break;
+      case TOKEN.cos:
+        this.ir.push(OP.COS);
+        break;
+      case TOKEN.ln:
+        this.ir.push(OP.LN);
+        break;
+      case TOKEN.log:
+        this.ir.push(OP.LOG10);
+        break;
+      case TOKEN.cvi:
+        this.ir.push(OP.CVI);
+        break;
+      case TOKEN.not:
+        if (valueType === PS_VALUE_TYPE.boolean) {
+          this.ir.push(OP.NOT_B);
+        } else if (valueType === PS_VALUE_TYPE.numeric) {
+          this.ir.push(OP.NOT_N);
+        } else {
+          return false;
+        }
+        break;
+      default:
+        return false;
+    }
+    return true;
+  }
+  _compileBinary(node) {
+    const {
+      op,
+      first,
+      second
+    } = node;
+    if (op === TOKEN.bitshift) {
+      if (first.type !== PS_NODE.const || !Number.isInteger(first.value)) {
+        return false;
+      }
+      if (!this._compileNode(second)) {
+        return false;
+      }
+      this.ir.push(OP.SHIFT, first.value);
+      return true;
+    }
+    if (!this._compileNode(second)) {
+      return false;
+    }
+    if (!this._compileNode(first)) {
+      return false;
+    }
+    switch (op) {
+      case TOKEN.add:
+        this.ir.push(OP.ADD);
+        break;
+      case TOKEN.sub:
+        this.ir.push(OP.SUB);
+        break;
+      case TOKEN.mul:
+        this.ir.push(OP.MUL);
+        break;
+      case TOKEN.div:
+        this.ir.push(OP.DIV);
+        break;
+      case TOKEN.idiv:
+        this.ir.push(OP.IDIV);
+        break;
+      case TOKEN.mod:
+        this.ir.push(OP.MOD);
+        break;
+      case TOKEN.exp:
+        this.ir.push(OP.POW);
+        break;
+      case TOKEN.eq:
+        this.ir.push(OP.EQ);
+        break;
+      case TOKEN.ne:
+        this.ir.push(OP.NE);
+        break;
+      case TOKEN.gt:
+        this.ir.push(OP.GT);
+        break;
+      case TOKEN.ge:
+        this.ir.push(OP.GE);
+        break;
+      case TOKEN.lt:
+        this.ir.push(OP.LT);
+        break;
+      case TOKEN.le:
+        this.ir.push(OP.LE);
+        break;
+      case TOKEN.and:
+        this.ir.push(OP.AND);
+        break;
+      case TOKEN.or:
+        this.ir.push(OP.OR);
+        break;
+      case TOKEN.xor:
+        this.ir.push(OP.XOR);
+        break;
+      case TOKEN.atan:
+        this.ir.push(OP.ATAN);
+        break;
+      case TOKEN.min:
+        this.ir.push(OP.MIN);
+        break;
+      case TOKEN.max:
+        this.ir.push(OP.MAX);
+        break;
+      default:
+        return false;
+    }
+    return true;
+  }
+  _compileTernary(node) {
+    if (!this._compileNode(node.cond)) {
+      return false;
+    }
+    this.ir.push(OP.IF, 0);
+    const ifPatch = this.ir.length - 1;
+    if (!this._compileNode(node.then)) {
+      return false;
+    }
+    this.ir.push(OP.JUMP, 0);
+    const jumpPatch = this.ir.length - 1;
+    this.ir[ifPatch] = this.ir.length;
+    if (!this._compileNode(node.otherwise)) {
+      return false;
+    }
+    this.ir[jumpPatch] = this.ir.length;
+    return true;
+  }
+  compile(program) {
+    const outputs = new PSStackToTree().evaluate(program, this.nIn);
+    if (!outputs || outputs.length < this.nOut) {
+      return null;
+    }
+    for (let i = 0; i < this.nOut; i++) {
+      if (!this._compileNode(outputs[i])) {
+        return null;
+      }
+      const min = this.range[i * 2];
+      const max = this.range[i * 2 + 1];
+      this.ir.push(OP.STORE, i, min, max);
+    }
+    return new Float64Array(this.ir);
+  }
+  static execute(ir, src, srcOffset, dest, destOffset) {
+    let ip = 0,
+      sp = 0;
+    const n = ir.length;
+    const stack = this.#stack;
+    const tmp = this.#tmp;
+    while (ip < n) {
+      switch (ir[ip++] | 0) {
+        case OP.ARG:
+          stack[sp++] = src[srcOffset + (ir[ip++] | 0)];
+          break;
+        case OP.CONST:
+          stack[sp++] = ir[ip++];
+          break;
+        case OP.STORE:
+          {
+            const slot = ir[ip++] | 0;
+            const min = ir[ip++];
+            const max = ir[ip++];
+            dest[destOffset + slot] = MathClamp(stack[--sp], min, max);
+            break;
+          }
+        case OP.IF:
+          {
+            const tgt = ir[ip++];
+            if (stack[--sp] === 0) {
+              ip = tgt;
+            }
+            break;
+          }
+        case OP.JUMP:
+          ip = ir[ip];
+          break;
+        case OP.ABS:
+          stack[sp - 1] = Math.abs(stack[sp - 1]);
+          break;
+        case OP.NEG:
+          stack[sp - 1] = -stack[sp - 1];
+          break;
+        case OP.CEIL:
+          stack[sp - 1] = Math.ceil(stack[sp - 1]);
+          break;
+        case OP.FLOOR:
+          stack[sp - 1] = Math.floor(stack[sp - 1]);
+          break;
+        case OP.ROUND:
+          stack[sp - 1] = Math.floor(stack[sp - 1] + 0.5);
+          break;
+        case OP.TRUNC:
+          stack[sp - 1] = Math.trunc(stack[sp - 1]);
+          break;
+        case OP.NOT_B:
+          stack[sp - 1] = stack[sp - 1] !== 0 ? 0 : 1;
+          break;
+        case OP.NOT_N:
+          stack[sp - 1] = ~(stack[sp - 1] | 0);
+          break;
+        case OP.SQRT:
+          stack[sp - 1] = Math.sqrt(stack[sp - 1]);
+          break;
+        case OP.SIN:
+          stack[sp - 1] = Math.sin(stack[sp - 1] % 360 * _DEG_TO_RAD);
+          break;
+        case OP.COS:
+          stack[sp - 1] = Math.cos(stack[sp - 1] % 360 * _DEG_TO_RAD);
+          break;
+        case OP.LN:
+          stack[sp - 1] = Math.log(stack[sp - 1]);
+          break;
+        case OP.LOG10:
+          stack[sp - 1] = Math.log10(stack[sp - 1]);
+          break;
+        case OP.CVI:
+          stack[sp - 1] = Math.trunc(stack[sp - 1]) | 0;
+          break;
+        case OP.SHIFT:
+          {
+            const amt = ir[ip++];
+            const v = stack[sp - 1] | 0;
+            if (amt > 0) {
+              stack[sp - 1] = v << amt;
+            } else if (amt < 0) {
+              stack[sp - 1] = v >> -amt;
+            } else {
+              stack[sp - 1] = v;
+            }
+            break;
+          }
+        case OP.ADD:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] += b;
+            break;
+          }
+        case OP.SUB:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] -= b;
+            break;
+          }
+        case OP.MUL:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] *= b;
+            break;
+          }
+        case OP.DIV:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = b !== 0 ? stack[sp - 1] / b : 0;
+            break;
+          }
+        case OP.IDIV:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = b !== 0 ? Math.trunc(stack[sp - 1] / b) : 0;
+            break;
+          }
+        case OP.MOD:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = b !== 0 ? stack[sp - 1] % b : 0;
+            break;
+          }
+        case OP.POW:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] **= b;
+            break;
+          }
+        case OP.EQ:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = stack[sp - 1] === b ? 1 : 0;
+            break;
+          }
+        case OP.NE:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = stack[sp - 1] !== b ? 1 : 0;
+            break;
+          }
+        case OP.GT:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = stack[sp - 1] > b ? 1 : 0;
+            break;
+          }
+        case OP.GE:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = stack[sp - 1] >= b ? 1 : 0;
+            break;
+          }
+        case OP.LT:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = stack[sp - 1] < b ? 1 : 0;
+            break;
+          }
+        case OP.LE:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = stack[sp - 1] <= b ? 1 : 0;
+            break;
+          }
+        case OP.AND:
+          {
+            const b = stack[--sp] | 0;
+            stack[sp - 1] = (stack[sp - 1] | 0) & b;
+            break;
+          }
+        case OP.OR:
+          {
+            const b = stack[--sp] | 0;
+            stack[sp - 1] = stack[sp - 1] | 0 | b;
+            break;
+          }
+        case OP.XOR:
+          {
+            const b = stack[--sp] | 0;
+            stack[sp - 1] = (stack[sp - 1] | 0) ^ b;
+            break;
+          }
+        case OP.ATAN:
+          {
+            const b = stack[--sp];
+            const deg = Math.atan2(stack[sp - 1], b) * _RAD_TO_DEG;
+            stack[sp - 1] = deg < 0 ? deg + 360 : deg;
+            break;
+          }
+        case OP.MIN:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = Math.min(stack[sp - 1], b);
+            break;
+          }
+        case OP.MAX:
+          {
+            const b = stack[--sp];
+            stack[sp - 1] = Math.max(stack[sp - 1], b);
+            break;
+          }
+        case OP.TEE_TMP:
+          tmp[ir[ip++] | 0] = stack[sp - 1];
+          break;
+        case OP.LOAD_TMP:
+          stack[sp++] = tmp[ir[ip++] | 0];
+          break;
+      }
+    }
+  }
+}
+class PSStackBasedInterpreter {
+  static #stack = new Float64Array(100);
+  static #sp = 0;
+  static #push(v) {
+    if (this.#sp < this.#stack.length) {
+      this.#stack[this.#sp++] = v;
+    }
+  }
+  static #execOp(op) {
+    const stack = this.#stack;
+    switch (op) {
+      case TOKEN.true:
+        this.#push(1);
+        break;
+      case TOKEN.false:
+        this.#push(0);
+        break;
+      case TOKEN.abs:
+        stack[this.#sp - 1] = Math.abs(stack[this.#sp - 1]);
+        break;
+      case TOKEN.neg:
+        stack[this.#sp - 1] = -stack[this.#sp - 1];
+        break;
+      case TOKEN.ceiling:
+        stack[this.#sp - 1] = Math.ceil(stack[this.#sp - 1]);
+        break;
+      case TOKEN.floor:
+        stack[this.#sp - 1] = Math.floor(stack[this.#sp - 1]);
+        break;
+      case TOKEN.round:
+        stack[this.#sp - 1] = Math.floor(stack[this.#sp - 1] + 0.5);
+        break;
+      case TOKEN.truncate:
+        stack[this.#sp - 1] = Math.trunc(stack[this.#sp - 1]);
+        break;
+      case TOKEN.sqrt:
+        stack[this.#sp - 1] = Math.sqrt(stack[this.#sp - 1]);
+        break;
+      case TOKEN.sin:
+        stack[this.#sp - 1] = Math.sin(stack[this.#sp - 1] % 360 * _DEG_TO_RAD);
+        break;
+      case TOKEN.cos:
+        stack[this.#sp - 1] = Math.cos(stack[this.#sp - 1] % 360 * _DEG_TO_RAD);
+        break;
+      case TOKEN.ln:
+        stack[this.#sp - 1] = Math.log(stack[this.#sp - 1]);
+        break;
+      case TOKEN.log:
+        stack[this.#sp - 1] = Math.log10(stack[this.#sp - 1]);
+        break;
+      case TOKEN.cvi:
+        stack[this.#sp - 1] = Math.trunc(stack[this.#sp - 1]) | 0;
+        break;
+      case TOKEN.cvr:
+        break;
+      case TOKEN.not:
+        {
+          const v = stack[this.#sp - 1];
+          stack[this.#sp - 1] = v === 0 || v === 1 ? 1 - v : ~(v | 0);
+          break;
+        }
+      case TOKEN.add:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] += b;
+          break;
+        }
+      case TOKEN.sub:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] -= b;
+          break;
+        }
+      case TOKEN.mul:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] *= b;
+          break;
+        }
+      case TOKEN.div:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = b !== 0 ? stack[this.#sp - 1] / b : 0;
+          break;
+        }
+      case TOKEN.idiv:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = b !== 0 ? Math.trunc(stack[this.#sp - 1] / b) : 0;
+          break;
+        }
+      case TOKEN.mod:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = b !== 0 ? stack[this.#sp - 1] % b : 0;
+          break;
+        }
+      case TOKEN.exp:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] **= b;
+          break;
+        }
+      case TOKEN.atan:
+        {
+          const dx = stack[--this.#sp];
+          const deg = Math.atan2(stack[this.#sp - 1], dx) * _RAD_TO_DEG;
+          stack[this.#sp - 1] = deg < 0 ? deg + 360 : deg;
+          break;
+        }
+      case TOKEN.eq:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = stack[this.#sp - 1] === b ? 1 : 0;
+          break;
+        }
+      case TOKEN.ne:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = stack[this.#sp - 1] !== b ? 1 : 0;
+          break;
+        }
+      case TOKEN.gt:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = stack[this.#sp - 1] > b ? 1 : 0;
+          break;
+        }
+      case TOKEN.ge:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = stack[this.#sp - 1] >= b ? 1 : 0;
+          break;
+        }
+      case TOKEN.lt:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = stack[this.#sp - 1] < b ? 1 : 0;
+          break;
+        }
+      case TOKEN.le:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = stack[this.#sp - 1] <= b ? 1 : 0;
+          break;
+        }
+      case TOKEN.and:
+        {
+          const b = stack[--this.#sp] | 0;
+          stack[this.#sp - 1] = (stack[this.#sp - 1] | 0) & b;
+          break;
+        }
+      case TOKEN.or:
+        {
+          const b = stack[--this.#sp] | 0;
+          stack[this.#sp - 1] = stack[this.#sp - 1] | 0 | b;
+          break;
+        }
+      case TOKEN.xor:
+        {
+          const b = stack[--this.#sp] | 0;
+          stack[this.#sp - 1] = (stack[this.#sp - 1] | 0) ^ b;
+          break;
+        }
+      case TOKEN.bitshift:
+        {
+          const amt = stack[--this.#sp] | 0;
+          const v = stack[this.#sp - 1] | 0;
+          stack[this.#sp - 1] = amt > 0 ? v << amt : v >> -amt;
+          break;
+        }
+      case TOKEN.min:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = Math.min(stack[this.#sp - 1], b);
+          break;
+        }
+      case TOKEN.max:
+        {
+          const b = stack[--this.#sp];
+          stack[this.#sp - 1] = Math.max(stack[this.#sp - 1], b);
+          break;
+        }
+      case TOKEN.dup:
+        this.#push(stack[this.#sp - 1]);
+        break;
+      case TOKEN.exch:
+        {
+          const a = stack[--this.#sp];
+          const b = stack[--this.#sp];
+          this.#push(a);
+          this.#push(b);
+          break;
+        }
+      case TOKEN.pop:
+        this.#sp--;
+        break;
+      case TOKEN.copy:
+        {
+          const n = Math.trunc(stack[--this.#sp]);
+          const base = this.#sp - n;
+          for (let k = 0; k < n; k++) {
+            this.#push(stack[base + k]);
+          }
+          break;
+        }
+      case TOKEN.index:
+        {
+          const i = Math.trunc(stack[--this.#sp]);
+          this.#push(stack[this.#sp - 1 - i]);
+          break;
+        }
+      case TOKEN.roll:
+        {
+          const j = Math.trunc(stack[--this.#sp]);
+          const n = Math.trunc(stack[--this.#sp]);
+          if (n > 1 && j !== 0) {
+            const mod = (j % n + n) % n;
+            if (mod !== 0) {
+              const base = this.#sp - n;
+              const sub = stack.slice(base, this.#sp);
+              for (let k = 0; k < n; k++) {
+                stack[base + k] = sub[(k - mod + n) % n];
+              }
+            }
+          }
+          break;
+        }
+    }
+  }
+  static #execBlock(instructions) {
+    for (const instr of instructions) {
+      switch (instr.type) {
+        case PS_NODE.number:
+          this.#push(instr.value);
+          break;
+        case PS_NODE.operator:
+          this.#execOp(instr.op);
+          break;
+        case PS_NODE.if:
+          if (this.#stack[--this.#sp] !== 0) {
+            this.#execBlock(instr.then.instructions);
+          }
+          break;
+        case PS_NODE.ifelse:
+          if (this.#stack[--this.#sp] !== 0) {
+            this.#execBlock(instr.then.instructions);
+          } else {
+            this.#execBlock(instr.otherwise.instructions);
+          }
+          break;
+      }
+    }
+  }
+  static build(program, domain, range) {
+    const nIn = domain.length >> 1;
+    const nOut = range.length >> 1;
+    const {
+      instructions
+    } = program.body;
+    return (src, srcOffset, dest, destOffset) => {
+      this.#sp = 0;
+      for (let i = 0; i < nIn; i++) {
+        this.#push(src[srcOffset + i]);
+      }
+      this.#execBlock(instructions);
+      const base = this.#sp - nOut;
+      for (let i = 0; i < nOut; i++) {
+        const v = base + i >= 0 ? this.#stack[base + i] : 0;
+        dest[destOffset + i] = MathClamp(range[i * 2 + 1], range[i * 2], v);
+      }
+    };
+  }
+}
+function buildPostScriptJsFunction(source, domain, range, forceInterpreter = false) {
+  const program = parsePostScriptFunction(source);
+  const ir = !forceInterpreter && new PsJsCompiler(domain, range).compile(program);
+  if (ir) {
+    return (src, srcOffset, dest, destOffset) => {
+      PsJsCompiler.execute(ir, src, srcOffset, dest, destOffset);
+    };
+  }
+  return PSStackBasedInterpreter.build(program, domain, range);
+}
+
+;// ./src/core/postscript/wasm_compiler.js
+
+
+const wasm_compiler_OP = {
+  if: 0x04,
+  else: 0x05,
+  end: 0x0b,
+  select: 0x1b,
+  call: 0x10,
+  local_get: 0x20,
+  local_set: 0x21,
+  local_tee: 0x22,
+  i32_const: 0x41,
+  i32_eqz: 0x45,
+  i32_and: 0x71,
+  i32_or: 0x72,
+  i32_xor: 0x73,
+  i32_shl: 0x74,
+  i32_shr_s: 0x75,
+  i32_trunc_f64_s: 0xaa,
+  f64_const: 0x44,
+  f64_eq: 0x61,
+  f64_ne: 0x62,
+  f64_lt: 0x63,
+  f64_gt: 0x64,
+  f64_le: 0x65,
+  f64_ge: 0x66,
+  f64_abs: 0x99,
+  f64_neg: 0x9a,
+  f64_ceil: 0x9b,
+  f64_floor: 0x9c,
+  f64_trunc: 0x9d,
+  f64_nearest: 0x9e,
+  f64_sqrt: 0x9f,
+  f64_add: 0xa0,
+  f64_sub: 0xa1,
+  f64_mul: 0xa2,
+  f64_div: 0xa3,
+  f64_min: 0xa4,
+  f64_max: 0xa5,
+  f64_convert_i32_s: 0xb7,
+  f64_store: 0x39
+};
+const FUNC_TYPE = 0x60;
+const F64 = 0x7c;
+const SECTION = {
+  type: 0x01,
+  import: 0x02,
+  function: 0x03,
+  memory: 0x05,
+  export: 0x07,
+  code: 0x0a
+};
+const EXTERN_FUNC = 0x00;
+const EXTERN_MEM = 0x02;
+function unsignedLEB128(n) {
+  const out = [];
+  do {
+    let byte = n & 0x7f;
+    n >>>= 7;
+    if (n !== 0) {
+      byte |= 0x80;
+    }
+    out.push(byte);
+  } while (n !== 0);
+  return out;
+}
+function encodeASCIIString(s) {
+  return [...unsignedLEB128(s.length), ...Array.from(s, c => c.charCodeAt(0))];
+}
+function section(id, data) {
+  return [id, ...unsignedLEB128(data.length), ...data];
+}
+function vec(items) {
+  const out = unsignedLEB128(items.length);
+  for (const item of items) {
+    if (typeof item === "number") {
+      out.push(item);
+      continue;
+    }
+    for (const byte of item) {
+      out.push(byte);
+    }
+  }
+  return out;
+}
+const MATH_IMPORTS = [["sin", "Math", "sin", [F64], [F64]], ["cos", "Math", "cos", [F64], [F64]], ["atan2", "Math", "atan2", [F64, F64], [F64]], ["log", "Math", "log", [F64], [F64]], ["log10", "Math", "log10", [F64], [F64]], ["pow", "Math", "pow", [F64, F64], [F64]]];
+const _mathImportObject = {
+  Math: Object.fromEntries(MATH_IMPORTS.map(([name]) => [name, Math[name]]))
+};
+class PsWasmCompiler {
+  static #initialized = false;
+  static #comparisonToOp = null;
+  static #importIdx = null;
+  static #degToRad = 0;
+  static #radToDeg = 0;
+  static #importTypeEntries = null;
+  static #importSection = null;
+  static #functionSection = null;
+  static #memorySection = null;
+  static #exportSection = null;
+  static #wasmMagicVersion = null;
+  static #f64View = null;
+  static #f64Arr = null;
+  static #init() {
+    this.#comparisonToOp = new Map([[TOKEN.eq, wasm_compiler_OP.f64_eq], [TOKEN.ne, wasm_compiler_OP.f64_ne], [TOKEN.lt, wasm_compiler_OP.f64_lt], [TOKEN.le, wasm_compiler_OP.f64_le], [TOKEN.gt, wasm_compiler_OP.f64_gt], [TOKEN.ge, wasm_compiler_OP.f64_ge]]);
+    this.#importIdx = Object.create(null);
+    for (let i = 0; i < MATH_IMPORTS.length; i++) {
+      this.#importIdx[MATH_IMPORTS[i][0]] = i;
+    }
+    this.#degToRad = Math.PI / 180;
+    this.#radToDeg = 180 / Math.PI;
+    this.#importTypeEntries = MATH_IMPORTS.map(([,,, params, results]) => [FUNC_TYPE, ...vec(params), ...vec(results)]);
+    this.#importSection = new Uint8Array(section(SECTION.import, vec(MATH_IMPORTS.map(([, mod, field], i) => [...encodeASCIIString(mod), ...encodeASCIIString(field), EXTERN_FUNC, ...unsignedLEB128(i + 1)]))));
+    this.#functionSection = new Uint8Array(section(SECTION.function, vec([[0]])));
+    this.#memorySection = new Uint8Array(section(SECTION.memory, vec([[0x00, 0x01]])));
+    this.#exportSection = new Uint8Array(section(SECTION.export, vec([[...encodeASCIIString("fn"), EXTERN_FUNC, ...unsignedLEB128(MATH_IMPORTS.length)], [...encodeASCIIString("mem"), EXTERN_MEM, 0x00]])));
+    this.#wasmMagicVersion = new Uint8Array([0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]);
+    const f64Buf = new ArrayBuffer(8);
+    this.#f64View = new DataView(f64Buf);
+    this.#f64Arr = new Uint8Array(f64Buf);
+    this.#initialized = true;
+  }
+  constructor(domain, range) {
+    if (!PsWasmCompiler.#initialized) {
+      PsWasmCompiler.#init();
+    }
+    this._nIn = domain.length >> 1;
+    this._nOut = range.length >> 1;
+    this._range = range;
+    this._code = [];
+    this._nextLocal = this._nIn;
+    this._freeLocals = [];
+    this._sharedLocals = new Map();
+  }
+  _allocLocal() {
+    return this._freeLocals.pop() ?? this._nextLocal++;
+  }
+  _releaseLocal(idx) {
+    this._freeLocals.push(idx);
+  }
+  _emitULEB128(n) {
+    do {
+      let b = n & 0x7f;
+      n >>>= 7;
+      if (n !== 0) {
+        b |= 0x80;
+      }
+      this._code.push(b);
+    } while (n !== 0);
+  }
+  _emitF64Const(value) {
+    this._code.push(wasm_compiler_OP.f64_const);
+    PsWasmCompiler.#f64View.setFloat64(0, value, true);
+    for (let i = 0; i < 8; i++) {
+      this._code.push(PsWasmCompiler.#f64Arr[i]);
+    }
+  }
+  _emitLocalGet(idx) {
+    this._code.push(wasm_compiler_OP.local_get);
+    this._emitULEB128(idx);
+  }
+  _emitLocalSet(idx) {
+    this._code.push(wasm_compiler_OP.local_set);
+    this._emitULEB128(idx);
+  }
+  _emitLocalTee(idx) {
+    this._code.push(wasm_compiler_OP.local_tee);
+    this._emitULEB128(idx);
+  }
+  _compileNode(node) {
+    if (node.shared) {
+      const entry = this._sharedLocals.get(node);
+      if (entry !== undefined) {
+        this._emitLocalGet(entry.local);
+        if (--entry.remaining === 0) {
+          this._releaseLocal(entry.local);
+        }
+        return true;
+      }
+      if (!this._compileNodeImpl(node)) {
+        return false;
+      }
+      const local = this._allocLocal();
+      this._sharedLocals.set(node, {
+        local,
+        remaining: node.sharedCount - 1
+      });
+      this._emitLocalTee(local);
+      return true;
+    }
+    return this._compileNodeImpl(node);
+  }
+  _compileNodeImpl(node) {
+    switch (node.type) {
+      case PS_NODE.arg:
+        this._emitLocalGet(node.index);
+        return true;
+      case PS_NODE.const:
+        {
+          let v = node.value;
+          if (typeof v === "boolean") {
+            v = v ? 1 : 0;
+          }
+          this._emitF64Const(v);
+          return true;
+        }
+      case PS_NODE.unary:
+        return this._compileUnaryNode(node);
+      case PS_NODE.binary:
+        return this._compileBinaryNode(node);
+      case PS_NODE.ternary:
+        return this._compileTernaryNode(node);
+      default:
+        return false;
+    }
+  }
+  _compileSinCosNode(node) {
+    const local = this._allocLocal();
+    try {
+      if (!this._compileNode(node.operand)) {
+        return false;
+      }
+      const code = this._code;
+      this._emitLocalSet(local);
+      this._emitLocalGet(local);
+      this._emitLocalGet(local);
+      this._emitF64Const(360);
+      code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc);
+      this._emitF64Const(360);
+      code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub);
+      this._emitF64Const(PsWasmCompiler.#degToRad);
+      code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.call);
+      this._emitULEB128(PsWasmCompiler.#importIdx[node.op === TOKEN.sin ? "sin" : "cos"]);
+      return true;
+    } finally {
+      this._releaseLocal(local);
+    }
+  }
+  _compileUnaryNode(node) {
+    const code = this._code;
+    if (node.op === TOKEN.sin || node.op === TOKEN.cos) {
+      return this._compileSinCosNode(node);
+    }
+    if (node.op === TOKEN.not) {
+      if (node.valueType === PS_VALUE_TYPE.boolean) {
+        if (!this._compileNodeAsBoolI32(node.operand)) {
+          return false;
+        }
+        code.push(wasm_compiler_OP.i32_eqz, wasm_compiler_OP.f64_convert_i32_s);
+        return true;
+      }
+      if (node.valueType === PS_VALUE_TYPE.numeric) {
+        if (!this._compileNode(node.operand)) {
+          return false;
+        }
+        code.push(wasm_compiler_OP.i32_trunc_f64_s, wasm_compiler_OP.i32_const, 0x7f, wasm_compiler_OP.i32_xor, wasm_compiler_OP.f64_convert_i32_s);
+        return true;
+      }
+      return false;
+    }
+    if (!this._compileNode(node.operand)) {
+      return false;
+    }
+    switch (node.op) {
+      case TOKEN.abs:
+        code.push(wasm_compiler_OP.f64_abs);
+        break;
+      case TOKEN.neg:
+        code.push(wasm_compiler_OP.f64_neg);
+        break;
+      case TOKEN.sqrt:
+        code.push(wasm_compiler_OP.f64_sqrt);
+        break;
+      case TOKEN.floor:
+        code.push(wasm_compiler_OP.f64_floor);
+        break;
+      case TOKEN.ceiling:
+        code.push(wasm_compiler_OP.f64_ceil);
+        break;
+      case TOKEN.round:
+        this._emitF64Const(0.5);
+        code.push(wasm_compiler_OP.f64_add, wasm_compiler_OP.f64_floor);
+        break;
+      case TOKEN.truncate:
+        code.push(wasm_compiler_OP.f64_trunc);
+        break;
+      case TOKEN.cvi:
+        code.push(wasm_compiler_OP.i32_trunc_f64_s, wasm_compiler_OP.f64_convert_i32_s);
+        break;
+      case TOKEN.cvr:
+        break;
+      case TOKEN.ln:
+        code.push(wasm_compiler_OP.call);
+        this._emitULEB128(PsWasmCompiler.#importIdx.log);
+        break;
+      case TOKEN.log:
+        code.push(wasm_compiler_OP.call);
+        this._emitULEB128(PsWasmCompiler.#importIdx.log10);
+        break;
+      default:
+        return false;
+    }
+    return true;
+  }
+  _compileSafeDivNode(first, second) {
+    const tmp = this._allocLocal();
+    try {
+      if (!this._compileNode(second)) {
+        return false;
+      }
+      if (!this._compileNode(first)) {
+        return false;
+      }
+      const code = this._code;
+      this._emitLocalTee(tmp);
+      code.push(wasm_compiler_OP.f64_div);
+      this._emitF64Const(0);
+      this._emitLocalGet(tmp);
+      this._emitF64Const(0);
+      code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select);
+      return true;
+    } finally {
+      this._releaseLocal(tmp);
+    }
+  }
+  _compileSafeIdivNode(first, second) {
+    const tmp = this._allocLocal();
+    try {
+      if (!this._compileNode(second)) {
+        return false;
+      }
+      if (!this._compileNode(first)) {
+        return false;
+      }
+      const code = this._code;
+      this._emitLocalTee(tmp);
+      code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc);
+      this._emitF64Const(0);
+      this._emitLocalGet(tmp);
+      this._emitF64Const(0);
+      code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select);
+      return true;
+    } finally {
+      this._releaseLocal(tmp);
+    }
+  }
+  _compileBitshiftNode(first, second) {
+    if (first.type !== PS_NODE.const || !Number.isInteger(first.value)) {
+      return false;
+    }
+    if (!this._compileNode(second)) {
+      return false;
+    }
+    const code = this._code;
+    code.push(wasm_compiler_OP.i32_trunc_f64_s);
+    const shift = first.value;
+    if (shift > 0) {
+      code.push(wasm_compiler_OP.i32_const);
+      this._emitULEB128(shift);
+      code.push(wasm_compiler_OP.i32_shl);
+    } else if (shift < 0) {
+      code.push(wasm_compiler_OP.i32_const);
+      this._emitULEB128(-shift);
+      code.push(wasm_compiler_OP.i32_shr_s);
+    }
+    code.push(wasm_compiler_OP.f64_convert_i32_s);
+    return true;
+  }
+  _compileModNode(first, second) {
+    if (first.type === PS_NODE.const && first.value === 0) {
+      if (!this._compileNode(second)) {
+        return false;
+      }
+      this._code.push(wasm_compiler_OP.drop);
+      this._emitF64Const(0);
+      return true;
+    }
+    const localA = this._allocLocal();
+    try {
+      if (!this._compileNode(second)) {
+        return false;
+      }
+      this._emitLocalTee(localA);
+      const code = this._code;
+      if (first.type === PS_NODE.const) {
+        this._emitLocalGet(localA);
+        this._emitF64Const(first.value);
+        code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc);
+        this._emitF64Const(first.value);
+        code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub);
+      } else {
+        const localB = this._allocLocal();
+        try {
+          if (!this._compileNode(first)) {
+            return false;
+          }
+          this._emitLocalSet(localB);
+          this._emitLocalGet(localA);
+          this._emitLocalGet(localB);
+          code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc);
+          this._emitLocalGet(localB);
+          code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub);
+          this._emitF64Const(0);
+          this._emitLocalGet(localB);
+          this._emitF64Const(0);
+          code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select);
+        } finally {
+          this._releaseLocal(localB);
+        }
+      }
+      return true;
+    } finally {
+      this._releaseLocal(localA);
+    }
+  }
+  _compileAtanNode(first, second) {
+    const localR = this._allocLocal();
+    try {
+      if (!this._compileNode(second)) {
+        return false;
+      }
+      if (!this._compileNode(first)) {
+        return false;
+      }
+      const code = this._code;
+      code.push(wasm_compiler_OP.call);
+      this._emitULEB128(PsWasmCompiler.#importIdx.atan2);
+      this._emitF64Const(PsWasmCompiler.#radToDeg);
+      code.push(wasm_compiler_OP.f64_mul);
+      this._emitLocalTee(localR);
+      this._emitF64Const(0);
+      code.push(wasm_compiler_OP.f64_lt, wasm_compiler_OP.if, F64);
+      this._emitLocalGet(localR);
+      this._emitF64Const(360);
+      code.push(wasm_compiler_OP.f64_add, wasm_compiler_OP.else);
+      this._emitLocalGet(localR);
+      code.push(wasm_compiler_OP.end);
+      return true;
+    } finally {
+      this._releaseLocal(localR);
+    }
+  }
+  _compileBitwiseNode(op, first, second) {
+    if (!this._compileBitwiseOperandI32(second)) {
+      return false;
+    }
+    if (!this._compileBitwiseOperandI32(first)) {
+      return false;
+    }
+    const code = this._code;
+    switch (op) {
+      case TOKEN.and:
+        code.push(wasm_compiler_OP.i32_and);
+        break;
+      case TOKEN.or:
+        code.push(wasm_compiler_OP.i32_or);
+        break;
+      case TOKEN.xor:
+        code.push(wasm_compiler_OP.i32_xor);
+        break;
+      default:
+        return false;
+    }
+    code.push(wasm_compiler_OP.f64_convert_i32_s);
+    return true;
+  }
+  _compileBitwiseOperandI32(node) {
+    if (node.valueType === PS_VALUE_TYPE.boolean) {
+      return this._compileNodeAsBoolI32(node);
+    }
+    if (!this._compileNode(node)) {
+      return false;
+    }
+    this._code.push(wasm_compiler_OP.i32_trunc_f64_s);
+    return true;
+  }
+  _compileStandardBinaryNode(op, first, second) {
+    if (first === second && first.type !== PS_NODE.arg && first.type !== PS_NODE.const && !first.shared) {
+      const tmp = this._allocLocal();
+      try {
+        if (!this._compileNode(first)) {
+          return false;
+        }
+        this._emitLocalTee(tmp);
+        this._emitLocalGet(tmp);
+      } finally {
+        this._releaseLocal(tmp);
+      }
+    } else {
+      if (!this._compileNode(second)) {
+        return false;
+      }
+      if (!this._compileNode(first)) {
+        return false;
+      }
+    }
+    const code = this._code;
+    switch (op) {
+      case TOKEN.add:
+        code.push(wasm_compiler_OP.f64_add);
+        break;
+      case TOKEN.sub:
+        code.push(wasm_compiler_OP.f64_sub);
+        break;
+      case TOKEN.mul:
+        code.push(wasm_compiler_OP.f64_mul);
+        break;
+      case TOKEN.exp:
+        code.push(wasm_compiler_OP.call);
+        this._emitULEB128(PsWasmCompiler.#importIdx.pow);
+        break;
+      case TOKEN.eq:
+        code.push(wasm_compiler_OP.f64_eq, wasm_compiler_OP.f64_convert_i32_s);
+        break;
+      case TOKEN.ne:
+        code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.f64_convert_i32_s);
+        break;
+      case TOKEN.lt:
+        code.push(wasm_compiler_OP.f64_lt, wasm_compiler_OP.f64_convert_i32_s);
+        break;
+      case TOKEN.le:
+        code.push(wasm_compiler_OP.f64_le, wasm_compiler_OP.f64_convert_i32_s);
+        break;
+      case TOKEN.gt:
+        code.push(wasm_compiler_OP.f64_gt, wasm_compiler_OP.f64_convert_i32_s);
+        break;
+      case TOKEN.ge:
+        code.push(wasm_compiler_OP.f64_ge, wasm_compiler_OP.f64_convert_i32_s);
+        break;
+      case TOKEN.min:
+        code.push(wasm_compiler_OP.f64_min);
+        break;
+      case TOKEN.max:
+        code.push(wasm_compiler_OP.f64_max);
+        break;
+      default:
+        return false;
+    }
+    return true;
+  }
+  _compileBinaryNode(node) {
+    const {
+      op,
+      first,
+      second
+    } = node;
+    if (op === TOKEN.bitshift) {
+      return this._compileBitshiftNode(first, second);
+    }
+    if (op === TOKEN.div) {
+      return this._compileSafeDivNode(first, second);
+    }
+    if (op === TOKEN.idiv) {
+      return this._compileSafeIdivNode(first, second);
+    }
+    if (op === TOKEN.mod) {
+      return this._compileModNode(first, second);
+    }
+    if (op === TOKEN.atan) {
+      return this._compileAtanNode(first, second);
+    }
+    if (op === TOKEN.and || op === TOKEN.or || op === TOKEN.xor) {
+      return this._compileBitwiseNode(op, first, second);
+    }
+    return this._compileStandardBinaryNode(op, first, second);
+  }
+  _compileNodeAsBoolI32(node) {
+    if (node.type === PS_NODE.binary) {
+      const wasmOp = PsWasmCompiler.#comparisonToOp.get(node.op);
+      if (wasmOp !== undefined) {
+        if (!this._compileNode(node.second)) {
+          return false;
+        }
+        if (!this._compileNode(node.first)) {
+          return false;
+        }
+        this._code.push(wasmOp);
+        return true;
+      }
+      if (node.valueType === PS_VALUE_TYPE.boolean && (node.op === TOKEN.and || node.op === TOKEN.or || node.op === TOKEN.xor)) {
+        if (!this._compileNodeAsBoolI32(node.second)) {
+          return false;
+        }
+        if (!this._compileNodeAsBoolI32(node.first)) {
+          return false;
+        }
+        switch (node.op) {
+          case TOKEN.and:
+            this._code.push(wasm_compiler_OP.i32_and);
+            break;
+          case TOKEN.or:
+            this._code.push(wasm_compiler_OP.i32_or);
+            break;
+          case TOKEN.xor:
+            this._code.push(wasm_compiler_OP.i32_xor);
+            break;
+        }
+        return true;
+      }
+    }
+    if (node.type === PS_NODE.unary && node.op === TOKEN.not && node.valueType === PS_VALUE_TYPE.boolean) {
+      if (!this._compileNodeAsBoolI32(node.operand)) {
+        return false;
+      }
+      this._code.push(wasm_compiler_OP.i32_eqz);
+      return true;
+    }
+    if (!this._compileNode(node)) {
+      return false;
+    }
+    if (node.valueType === PS_VALUE_TYPE.boolean) {
+      this._code.push(wasm_compiler_OP.i32_trunc_f64_s);
+    } else {
+      this._emitF64Const(0);
+      this._code.push(wasm_compiler_OP.f64_ne);
+    }
+    return true;
+  }
+  _compileTernaryNode(node) {
+    if (!this._compileNodeAsBoolI32(node.cond)) {
+      return false;
+    }
+    this._code.push(wasm_compiler_OP.if, F64);
+    if (!this._compileNode(node.then)) {
+      return false;
+    }
+    this._code.push(wasm_compiler_OP.else);
+    if (!this._compileNode(node.otherwise)) {
+      return false;
+    }
+    this._code.push(wasm_compiler_OP.end);
+    return true;
+  }
+  compile(program) {
+    const outputs = new PSStackToTree().evaluate(program, this._nIn);
+    if (!outputs || outputs.length < this._nOut) {
+      return null;
+    }
+    const code = this._code;
+    for (let i = 0; i < this._nOut; i++) {
+      const min = this._range[i * 2];
+      const max = this._range[i * 2 + 1];
+      code.push(wasm_compiler_OP.i32_const);
+      this._emitULEB128(i * 8);
+      if (!this._compileNode(outputs[i])) {
+        return null;
+      }
+      this._emitF64Const(max);
+      code.push(wasm_compiler_OP.f64_min);
+      this._emitF64Const(min);
+      code.push(wasm_compiler_OP.f64_max, wasm_compiler_OP.f64_store, 0x03, 0x00);
+    }
+    code.push(wasm_compiler_OP.end);
+    const nIn = this._nIn;
+    const nLocals = this._nextLocal - nIn;
+    const paramTypes = Array(nIn).fill(F64);
+    const resultTypes = [];
+    const funcType = [FUNC_TYPE, ...vec(paramTypes), ...vec(resultTypes)];
+    const typeSectionBytes = new Uint8Array(section(SECTION.type, vec([funcType, ...PsWasmCompiler.#importTypeEntries])));
+    const localDecls = nLocals > 0 ? vec([[...unsignedLEB128(nLocals), F64]]) : vec([]);
+    const funcBodyLen = localDecls.length + code.length;
+    const codeSectionBytes = new Uint8Array(section(SECTION.code, vec([[...unsignedLEB128(funcBodyLen), ...localDecls, ...code]])));
+    const magicVersion = PsWasmCompiler.#wasmMagicVersion;
+    const importSection = PsWasmCompiler.#importSection;
+    const functionSection = PsWasmCompiler.#functionSection;
+    const memorySection = PsWasmCompiler.#memorySection;
+    const exportSection = PsWasmCompiler.#exportSection;
+    const totalLen = magicVersion.length + typeSectionBytes.length + importSection.length + functionSection.length + memorySection.length + exportSection.length + codeSectionBytes.length;
+    const result = new Uint8Array(totalLen);
+    let off = 0;
+    result.set(magicVersion, off);
+    off += magicVersion.length;
+    result.set(typeSectionBytes, off);
+    off += typeSectionBytes.length;
+    result.set(importSection, off);
+    off += importSection.length;
+    result.set(functionSection, off);
+    off += functionSection.length;
+    result.set(memorySection, off);
+    off += memorySection.length;
+    result.set(exportSection, off);
+    off += exportSection.length;
+    result.set(codeSectionBytes, off);
+    return result;
+  }
+}
+function compilePostScriptToWasm(source, domain, range) {
+  return new PsWasmCompiler(domain, range).compile(parsePostScriptFunction(source));
+}
+function _makeWrapper(exports, nIn, nOut) {
+  const {
+    fn,
+    mem
+  } = exports;
+  const outView = new Float64Array(mem.buffer, 0, nOut);
+  let writeOut;
+  switch (nOut) {
+    case 1:
+      writeOut = (dest, destOffset) => {
+        dest[destOffset] = outView[0];
+      };
+      break;
+    case 2:
+      writeOut = (dest, destOffset) => {
+        dest[destOffset] = outView[0];
+        dest[destOffset + 1] = outView[1];
+      };
+      break;
+    case 3:
+      writeOut = (dest, destOffset) => {
+        dest[destOffset] = outView[0];
+        dest[destOffset + 1] = outView[1];
+        dest[destOffset + 2] = outView[2];
+      };
+      break;
+    case 4:
+      writeOut = (dest, destOffset) => {
+        dest[destOffset] = outView[0];
+        dest[destOffset + 1] = outView[1];
+        dest[destOffset + 2] = outView[2];
+        dest[destOffset + 3] = outView[3];
+      };
+      break;
+    default:
+      writeOut = (dest, destOffset) => {
+        for (let i = 0; i < nOut; i++) {
+          dest[destOffset + i] = outView[i];
+        }
+      };
+  }
+  switch (nIn) {
+    case 1:
+      return (src, srcOffset, dest, destOffset) => {
+        fn(src[srcOffset]);
+        writeOut(dest, destOffset);
+      };
+    case 2:
+      return (src, srcOffset, dest, destOffset) => {
+        fn(src[srcOffset], src[srcOffset + 1]);
+        writeOut(dest, destOffset);
+      };
+    case 3:
+      return (src, srcOffset, dest, destOffset) => {
+        fn(src[srcOffset], src[srcOffset + 1], src[srcOffset + 2]);
+        writeOut(dest, destOffset);
+      };
+    case 4:
+      return (src, srcOffset, dest, destOffset) => {
+        fn(src[srcOffset], src[srcOffset + 1], src[srcOffset + 2], src[srcOffset + 3]);
+        writeOut(dest, destOffset);
+      };
+    default:
+      {
+        const inBuf = new Float64Array(nIn);
+        return (src, srcOffset, dest, destOffset) => {
+          for (let i = 0; i < nIn; i++) {
+            inBuf[i] = src[srcOffset + i];
+          }
+          fn(...inBuf);
+          writeOut(dest, destOffset);
+        };
+      }
+  }
+}
+function buildPostScriptWasmFunction(source, domain, range) {
+  const bytes = compilePostScriptToWasm(source, domain, range);
+  if (!bytes) {
+    return null;
+  }
+  try {
+    const instance = new WebAssembly.Instance(new WebAssembly.Module(bytes), _mathImportObject);
+    return _makeWrapper(instance.exports, domain.length >> 1, range.length >> 1);
+  } catch {
+    return null;
+  }
+}
+
+;// ./src/core/image_utils.js
+
+
+class BaseLocalCache {
+  constructor(options) {
+    this._onlyRefs = options?.onlyRefs === true;
+    if (!this._onlyRefs) {
+      this._nameRefMap = new Map();
+      this._imageMap = new Map();
+    }
+    this._imageCache = new RefSetCache();
+  }
+  getByName(name) {
+    if (this._onlyRefs) {
+      unreachable("Should not call `getByName` method.");
+    }
+    const ref = this._nameRefMap.get(name);
+    if (ref) {
+      return this.getByRef(ref);
+    }
+    return this._imageMap.get(name) || null;
+  }
+  getByRef(ref) {
+    return this._imageCache.get(ref) || null;
+  }
+  set(name, ref, data) {
+    unreachable("Abstract method `set` called.");
+  }
+}
+class LocalImageCache extends BaseLocalCache {
+  set(name, ref = null, data) {
+    if (typeof name !== "string") {
+      throw new Error('LocalImageCache.set - expected "name" argument.');
+    }
+    if (ref) {
+      if (this._imageCache.has(ref)) {
+        return;
+      }
+      this._nameRefMap.set(name, ref);
+      this._imageCache.put(ref, data);
+      return;
+    }
+    if (this._imageMap.has(name)) {
+      return;
+    }
+    this._imageMap.set(name, data);
+  }
+}
+class LocalColorSpaceCache extends BaseLocalCache {
+  set(name = null, ref = null, data) {
+    if (typeof name !== "string" && !ref) {
+      throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.');
+    }
+    if (ref) {
+      if (this._imageCache.has(ref)) {
+        return;
+      }
+      if (name !== null) {
+        this._nameRefMap.set(name, ref);
+      }
+      this._imageCache.put(ref, data);
+      return;
+    }
+    if (this._imageMap.has(name)) {
+      return;
+    }
+    this._imageMap.set(name, data);
+  }
+}
+class LocalFunctionCache extends BaseLocalCache {
+  constructor(options) {
+    super({
+      onlyRefs: true
+    });
+  }
+  set(name = null, ref, data) {
+    if (!ref) {
+      throw new Error('LocalFunctionCache.set - expected "ref" argument.');
+    }
+    if (this._imageCache.has(ref)) {
+      return;
+    }
+    this._imageCache.put(ref, data);
+  }
+}
+class LocalGStateCache extends BaseLocalCache {
+  set(name, ref = null, data) {
+    if (typeof name !== "string") {
+      throw new Error('LocalGStateCache.set - expected "name" argument.');
+    }
+    if (ref) {
+      if (this._imageCache.has(ref)) {
+        return;
+      }
+      this._nameRefMap.set(name, ref);
+      this._imageCache.put(ref, data);
+      return;
+    }
+    if (this._imageMap.has(name)) {
+      return;
+    }
+    this._imageMap.set(name, data);
+  }
+}
+class LocalTilingPatternCache extends BaseLocalCache {
+  constructor(options) {
+    super({
+      onlyRefs: true
+    });
+  }
+  set(name = null, ref, data) {
+    if (!ref) {
+      throw new Error('LocalTilingPatternCache.set - expected "ref" argument.');
+    }
+    if (this._imageCache.has(ref)) {
+      return;
+    }
+    this._imageCache.put(ref, data);
+  }
+}
+class RegionalImageCache extends BaseLocalCache {
+  constructor(options) {
+    super({
+      onlyRefs: true
+    });
+  }
+  set(name = null, ref, data) {
+    if (!ref) {
+      throw new Error('RegionalImageCache.set - expected "ref" argument.');
+    }
+    if (this._imageCache.has(ref)) {
+      return;
+    }
+    this._imageCache.put(ref, data);
+  }
+}
+class GlobalColorSpaceCache extends BaseLocalCache {
+  constructor(options) {
+    super({
+      onlyRefs: true
+    });
+  }
+  set(name = null, ref, data) {
+    if (!ref) {
+      throw new Error('GlobalColorSpaceCache.set - expected "ref" argument.');
+    }
+    if (this._imageCache.has(ref)) {
+      return;
+    }
+    this._imageCache.put(ref, data);
+  }
+  clear() {
+    this._imageCache.clear();
+  }
+}
+class GlobalImageCache {
+  static NUM_PAGES_THRESHOLD = 2;
+  static MIN_IMAGES_TO_CACHE = 10;
+  static MAX_BYTE_SIZE = 5e7;
+  #decodeFailedSet = new RefSet();
+  constructor() {
+    this._refCache = new RefSetCache();
+    this._imageCache = new RefSetCache();
+  }
+  get #byteSize() {
+    let byteSize = 0;
+    for (const imageData of this._imageCache) {
+      byteSize += imageData.byteSize;
+    }
+    return byteSize;
+  }
+  get #cacheLimitReached() {
+    if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) {
+      return false;
+    }
+    if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) {
+      return false;
+    }
+    return true;
+  }
+  shouldCache(ref, pageIndex) {
+    let pageIndexSet = this._refCache.get(ref);
+    if (!pageIndexSet) {
+      pageIndexSet = new Set();
+      this._refCache.put(ref, pageIndexSet);
+    }
+    pageIndexSet.add(pageIndex);
+    if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {
+      return false;
+    }
+    if (!this._imageCache.has(ref) && this.#cacheLimitReached) {
+      return false;
+    }
+    return true;
+  }
+  addDecodeFailed(ref) {
+    this.#decodeFailedSet.put(ref);
+  }
+  hasDecodeFailed(ref) {
+    return this.#decodeFailedSet.has(ref);
+  }
+  addByteSize(ref, byteSize) {
+    const imageData = this._imageCache.get(ref);
+    if (!imageData) {
+      return;
+    }
+    if (imageData.byteSize) {
+      return;
+    }
+    imageData.byteSize = byteSize;
+  }
+  getData(ref, pageIndex) {
+    const pageIndexSet = this._refCache.get(ref);
+    if (!pageIndexSet) {
+      return null;
+    }
+    if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {
+      return null;
+    }
+    const imageData = this._imageCache.get(ref);
+    if (!imageData) {
+      return null;
+    }
+    pageIndexSet.add(pageIndex);
+    return imageData;
+  }
+  setData(ref, data) {
+    if (!this._refCache.has(ref)) {
+      throw new Error('GlobalImageCache.setData - expected "shouldCache" to have been called.');
+    }
+    if (this._imageCache.has(ref)) {
+      return;
+    }
+    if (this.#cacheLimitReached) {
+      warn("GlobalImageCache.setData - cache limit reached.");
+      return;
+    }
+    this._imageCache.put(ref, data);
+  }
+  clear(onlyData = false) {
+    if (!onlyData) {
+      this.#decodeFailedSet.clear();
+      this._refCache.clear();
+    }
+    this._imageCache.clear();
+  }
+}
+
+;// ./src/core/function.js
+
+
+
+
+
+
+
+
+const FunctionType = {
+  SAMPLED: 0,
+  EXPONENTIAL_INTERPOLATION: 2,
+  STITCHING: 3,
+  POSTSCRIPT_CALCULATOR: 4
+};
+class PDFFunctionFactory {
+  static #useWasm = true;
+  static setOptions({
+    useWasm
+  }) {
+    this.#useWasm = useWasm;
+  }
+  constructor({
+    xref
+  }) {
+    this.xref = xref;
+  }
+  get useWasm() {
+    return PDFFunctionFactory.#useWasm;
+  }
+  create(fn, parseArray = false) {
+    let fnRef, parsedFn;
+    if (fn instanceof Ref) {
+      fnRef = fn;
+    } else if (fn instanceof Dict) {
+      fnRef = fn.objId;
+    } else if (fn instanceof BaseStream) {
+      fnRef = fn.dict?.objId;
+    }
+    if (fnRef) {
+      const cachedFn = this._localFunctionCache.getByRef(fnRef);
+      if (cachedFn) {
+        return cachedFn;
+      }
+    }
+    const fnObj = this.xref.fetchIfRef(fn);
+    if (Array.isArray(fnObj)) {
+      if (!parseArray) {
+        throw new Error('PDFFunctionFactory.create - expected "parseArray" argument.');
+      }
+      parsedFn = PDFFunction.parseArray(this, fnObj);
+    } else {
+      parsedFn = PDFFunction.parse(this, fnObj);
+    }
+    if (fnRef) {
+      this._localFunctionCache.set(null, fnRef, parsedFn);
+    }
+    return parsedFn;
+  }
+  get _localFunctionCache() {
+    return shadow(this, "_localFunctionCache", new LocalFunctionCache());
+  }
+}
+function toNumberArray(arr) {
+  if (!Array.isArray(arr)) {
+    return null;
+  }
+  if (!isNumberArray(arr, null)) {
+    return arr.map(x => +x);
+  }
+  return arr;
+}
+class PDFFunction {
+  static getSampleArray(size, outputSize, bps, stream) {
+    let length = outputSize;
+    for (const s of size) {
+      length *= s;
+    }
+    const array = new Array(length);
+    let codeSize = 0;
+    let codeBuf = 0;
+    const sampleMul = 1.0 / (2.0 ** bps - 1);
+    const strBytes = stream.getBytes((length * bps + 7) / 8);
+    let strIdx = 0;
+    for (let i = 0; i < length; i++) {
+      while (codeSize < bps) {
+        codeBuf <<= 8;
+        codeBuf |= strBytes[strIdx++];
+        codeSize += 8;
+      }
+      codeSize -= bps;
+      array[i] = (codeBuf >> codeSize) * sampleMul;
+      codeBuf &= (1 << codeSize) - 1;
+    }
+    return array;
+  }
+  static parse(factory, fn) {
+    const dict = fn.dict || fn;
+    const typeNum = dict.get("FunctionType");
+    switch (typeNum) {
+      case FunctionType.SAMPLED:
+        return this.constructSampled(factory, fn, dict);
+      case FunctionType.EXPONENTIAL_INTERPOLATION:
+        return this.constructInterpolated(factory, dict);
+      case FunctionType.STITCHING:
+        return this.constructStiched(factory, dict);
+      case FunctionType.POSTSCRIPT_CALCULATOR:
+        return this.constructPostScript(factory, fn, dict);
+    }
+    throw new FormatError(`Unknown function type: ${typeNum}`);
+  }
+  static parseArray(factory, fnObj) {
+    const {
+      xref
+    } = factory;
+    const fnArray = [];
+    for (const fn of fnObj) {
+      fnArray.push(this.parse(factory, xref.fetchIfRef(fn)));
+    }
+    return function (src, srcOffset, dest, destOffset) {
+      for (let i = 0, ii = fnArray.length; i < ii; i++) {
+        fnArray[i](src, srcOffset, dest, destOffset + i);
+      }
+    };
+  }
+  static constructSampled(factory, fn, dict) {
+    function interpolate(x, xmin, xmax, ymin, ymax) {
+      return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
+    }
+    const domain = toNumberArray(dict.getArray("Domain"));
+    const range = toNumberArray(dict.getArray("Range"));
+    if (!domain || !range) {
+      throw new FormatError("No domain or range");
+    }
+    const inputSize = domain.length / 2;
+    const outputSize = range.length / 2;
+    const size = toNumberArray(dict.getArray("Size"));
+    const bps = dict.get("BitsPerSample");
+    const order = dict.get("Order") || 1;
+    if (order !== 1) {
+      info("No support for cubic spline interpolation: " + order);
+    }
+    let encode = toNumberArray(dict.getArray("Encode"));
+    if (!encode) {
+      encode = [];
+      for (let i = 0; i < inputSize; ++i) {
+        encode.push(0, size[i] - 1);
+      }
+    }
+    const decode = toNumberArray(dict.getArray("Decode")) || range;
+    const samples = this.getSampleArray(size, outputSize, bps, fn);
+    return function constructSampledFn(src, srcOffset, dest, destOffset) {
+      const cubeVertices = 1 << inputSize;
+      const cubeN = new Float64Array(cubeVertices).fill(1);
+      const cubeVertex = new Uint32Array(cubeVertices);
+      let i, j;
+      let k = outputSize,
+        pos = 1;
+      for (i = 0; i < inputSize; ++i) {
+        const domain_2i = domain[2 * i];
+        const domain_2i_1 = domain[2 * i + 1];
+        const xi = MathClamp(src[srcOffset + i], domain_2i, domain_2i_1);
+        let e = interpolate(xi, domain_2i, domain_2i_1, encode[2 * i], encode[2 * i + 1]);
+        const size_i = size[i];
+        e = MathClamp(e, 0, size_i - 1);
+        const e0 = e < size_i - 1 ? Math.floor(e) : e - 1;
+        const n0 = e0 + 1 - e;
+        const n1 = e - e0;
+        const offset0 = e0 * k;
+        const offset1 = offset0 + k;
+        for (j = 0; j < cubeVertices; j++) {
+          if (j & pos) {
+            cubeN[j] *= n1;
+            cubeVertex[j] += offset1;
+          } else {
+            cubeN[j] *= n0;
+            cubeVertex[j] += offset0;
+          }
+        }
+        k *= size_i;
+        pos <<= 1;
+      }
+      for (j = 0; j < outputSize; ++j) {
+        let rj = 0;
+        for (i = 0; i < cubeVertices; i++) {
+          rj += samples[cubeVertex[i] + j] * cubeN[i];
+        }
+        rj = interpolate(rj, 0, 1, decode[2 * j], decode[2 * j + 1]);
+        dest[destOffset + j] = MathClamp(rj, range[2 * j], range[2 * j + 1]);
+      }
+    };
+  }
+  static constructInterpolated(factory, dict) {
+    const c0 = toNumberArray(dict.getArray("C0")) || [0];
+    const c1 = toNumberArray(dict.getArray("C1")) || [1];
+    const n = dict.get("N");
+    const diff = [];
+    for (let i = 0, ii = c0.length; i < ii; ++i) {
+      diff.push(c1[i] - c0[i]);
+    }
+    const length = diff.length;
+    return function constructInterpolatedFn(src, srcOffset, dest, destOffset) {
+      const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n;
+      for (let j = 0; j < length; ++j) {
+        dest[destOffset + j] = c0[j] + x * diff[j];
+      }
+    };
+  }
+  static constructStiched(factory, dict) {
+    const domain = toNumberArray(dict.getArray("Domain"));
+    if (!domain) {
+      throw new FormatError("No domain");
+    }
+    const inputSize = domain.length / 2;
+    if (inputSize !== 1) {
+      throw new FormatError("Bad domain for stiched function");
+    }
+    const {
+      xref
+    } = factory;
+    const fns = [];
+    for (const fn of dict.get("Functions")) {
+      fns.push(this.parse(factory, xref.fetchIfRef(fn)));
+    }
+    const bounds = toNumberArray(dict.getArray("Bounds"));
+    const encode = toNumberArray(dict.getArray("Encode"));
+    const tmpBuf = new Float32Array(1);
+    return function constructStichedFn(src, srcOffset, dest, destOffset) {
+      const v = MathClamp(src[srcOffset], domain[0], domain[1]);
+      const length = bounds.length;
+      let i;
+      for (i = 0; i < length; ++i) {
+        if (v < bounds[i]) {
+          break;
+        }
+      }
+      const dmin = i > 0 ? bounds[i - 1] : domain[0];
+      const dmax = i < length ? bounds[i] : domain[1];
+      const rmin = encode[2 * i];
+      const rmax = encode[2 * i + 1];
+      tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+      fns[i](tmpBuf, 0, dest, destOffset);
+    };
+  }
+  static constructPostScript(factory, fn, dict) {
+    const domain = toNumberArray(dict.getArray("Domain"));
+    const range = toNumberArray(dict.getArray("Range"));
+    if (!domain) {
+      throw new FormatError("No domain.");
+    }
+    if (!range) {
+      throw new FormatError("No range.");
+    }
+    const psCode = fn.getString();
+    try {
+      if (factory.useWasm) {
+        const wasmFn = buildPostScriptWasmFunction(psCode, domain, range);
+        if (wasmFn) {
+          return wasmFn;
+        }
+      }
+    } catch {}
+    warn("Failed to compile PostScript function to wasm, falling back to JS");
+    return buildPostScriptJsFunction(psCode, domain, range);
+  }
+}
+function isPDFFunction(v) {
+  let fnDict;
+  if (v instanceof Dict) {
+    fnDict = v;
+  } else if (v instanceof BaseStream) {
+    fnDict = v.dict;
+  } else {
+    return false;
+  }
+  return fnDict.has("FunctionType");
+}
+
+;// ./src/core/evaluator_utils.js
+
+
+function textSinkWrapper(sink) {
+  const TEXT_CONTENT_CHUNK_SIZE = 100;
+  const resolved = sink ? null : Promise.resolve();
+  return {
+    enqueueInvoked: false,
+    enqueue(chunk, size) {
+      this.enqueueInvoked = true;
+      sink?.enqueue(chunk, size);
+    },
+    get desiredSize() {
+      return sink?.desiredSize ?? TEXT_CONTENT_CHUNK_SIZE;
+    },
+    get ready() {
+      return sink?.ready ?? resolved;
+    }
+  };
+}
+function _parseVisibilityExpression(xref, array, nestingCounter, currentResult) {
+  const MAX_NESTING = 10;
+  if (++nestingCounter > MAX_NESTING) {
+    warn("Visibility expression is too deeply nested");
+    return;
+  }
+  const length = array.length;
+  const operator = xref.fetchIfRef(array[0]);
+  if (length < 2 || !(operator instanceof Name)) {
+    warn("Invalid visibility expression");
+    return;
+  }
+  switch (operator.name) {
+    case "And":
+    case "Or":
+    case "Not":
+      currentResult.push(operator.name);
+      break;
+    default:
+      warn(`Invalid operator ${operator.name} in visibility expression`);
+      return;
+  }
+  for (let i = 1; i < length; i++) {
+    const raw = array[i];
+    const object = xref.fetchIfRef(raw);
+    if (Array.isArray(object)) {
+      const nestedResult = [];
+      currentResult.push(nestedResult);
+      _parseVisibilityExpression(xref, object, nestingCounter, nestedResult);
+    } else if (raw instanceof Ref) {
+      currentResult.push(raw.toString());
+    }
+  }
+}
+function parseMarkedContentProps(xref, contentProperties, resources) {
+  let optionalContent;
+  if (contentProperties instanceof Name) {
+    const properties = resources.get("Properties");
+    optionalContent = properties.get(contentProperties.name);
+  } else if (contentProperties instanceof Dict) {
+    optionalContent = contentProperties;
+  } else {
+    throw new FormatError("Optional content properties malformed.");
+  }
+  const optionalContentType = optionalContent.get("Type")?.name;
+  if (optionalContentType === "OCG") {
+    return {
+      type: optionalContentType,
+      id: optionalContent.objId
+    };
+  } else if (optionalContentType === "OCMD") {
+    const expression = optionalContent.get("VE");
+    if (Array.isArray(expression)) {
+      const result = [];
+      _parseVisibilityExpression(xref, expression, 0, result);
+      if (result.length > 0) {
+        return {
+          type: "OCMD",
+          expression: result
+        };
+      }
+    }
+    const optionalContentGroups = optionalContent.get("OCGs");
+    if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) {
+      const groupIds = [];
+      if (Array.isArray(optionalContentGroups)) {
+        for (const ocg of optionalContentGroups) {
+          groupIds.push(ocg.toString());
+        }
+      } else {
+        groupIds.push(optionalContentGroups.objId);
+      }
+      const p = optionalContent.get("P");
+      return {
+        type: optionalContentType,
+        ids: groupIds,
+        policy: p instanceof Name ? p.name : null,
+        expression: null
+      };
+    } else if (optionalContentGroups instanceof Ref) {
+      return {
+        type: optionalContentType,
+        id: optionalContentGroups.toString()
+      };
+    }
+  }
+  return null;
+}
+
+;// ./src/core/bidi.js
+
+const baseTypes = ["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"];
+const arabicTypes = ["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(i) {
+  return (i & 1) !== 0;
+}
+function isEven(i) {
+  return (i & 1) === 0;
+}
+function findUnequal(arr, start, value) {
+  let j, jj;
+  for (j = start, jj = arr.length; j < jj; ++j) {
+    if (arr[j] !== value) {
+      return j;
+    }
+  }
+  return j;
+}
+function reverseValues(arr, start, end) {
+  for (let i = start, j = end - 1; i < j; ++i, --j) {
+    const temp = arr[i];
+    arr[i] = arr[j];
+    arr[j] = temp;
+  }
+}
+function createBidiText(str, isLTR, vertical = false) {
+  let dir = "ltr";
+  if (vertical) {
+    dir = "ttb";
+  } else if (!isLTR) {
+    dir = "rtl";
+  }
+  return {
+    str,
+    dir
+  };
+}
+const chars = [];
+const types = [];
+function bidi(str, startLevel = -1, vertical = false) {
+  let isLTR = true;
+  const strLength = str.length;
+  if (strLength === 0 || vertical) {
+    return createBidiText(str, isLTR, vertical);
+  }
+  chars.length = strLength;
+  types.length = strLength;
+  let numBidi = 0;
+  let i, ii;
+  for (i = 0; i < strLength; ++i) {
+    chars[i] = str.charAt(i);
+    const charCode = str.charCodeAt(i);
+    let charType = "L";
+    if (charCode <= 0x00ff) {
+      charType = baseTypes[charCode];
+    } else if (0x0590 <= charCode && charCode <= 0x05f4) {
+      charType = "R";
+    } else if (0x0600 <= charCode && charCode <= 0x06ff) {
+      charType = arabicTypes[charCode & 0xff];
+      if (!charType) {
+        warn("Bidi: invalid Unicode character " + charCode.toString(16));
+      }
+    } else if (0x0700 <= charCode && charCode <= 0x08ac || 0xfb50 <= charCode && charCode <= 0xfdff || 0xfe70 <= charCode && charCode <= 0xfeff) {
+      charType = "AL";
+    }
+    if (charType === "R" || charType === "AL" || charType === "AN") {
+      numBidi++;
+    }
+    types[i] = charType;
+  }
+  if (numBidi === 0) {
+    isLTR = true;
+    return createBidiText(str, isLTR);
+  }
+  if (startLevel === -1) {
+    if (numBidi / strLength < 0.3 && strLength > 4) {
+      isLTR = true;
+      startLevel = 0;
+    } else {
+      isLTR = false;
+      startLevel = 1;
+    }
+  }
+  const levels = [];
+  for (i = 0; i < strLength; ++i) {
+    levels[i] = startLevel;
+  }
+  const e = isOdd(startLevel) ? "R" : "L";
+  const sor = e;
+  const eor = sor;
+  let lastType = sor;
+  for (i = 0; i < strLength; ++i) {
+    if (types[i] === "NSM") {
+      types[i] = lastType;
+    } else {
+      lastType = types[i];
+    }
+  }
+  lastType = sor;
+  let t;
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (t === "EN") {
+      types[i] = lastType === "AL" ? "AN" : "EN";
+    } else if (t === "R" || t === "L" || t === "AL") {
+      lastType = t;
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (t === "AL") {
+      types[i] = "R";
+    }
+  }
+  for (i = 1; i < strLength - 1; ++i) {
+    if (types[i] === "ES" && types[i - 1] === "EN" && types[i + 1] === "EN") {
+      types[i] = "EN";
+    }
+    if (types[i] === "CS" && (types[i - 1] === "EN" || types[i - 1] === "AN") && types[i + 1] === types[i - 1]) {
+      types[i] = types[i - 1];
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    if (types[i] === "EN") {
+      for (let j = i - 1; j >= 0; --j) {
+        if (types[j] !== "ET") {
+          break;
+        }
+        types[j] = "EN";
+      }
+      for (let j = i + 1; j < strLength; ++j) {
+        if (types[j] !== "ET") {
+          break;
+        }
+        types[j] = "EN";
+      }
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (t === "WS" || t === "ES" || t === "ET" || t === "CS") {
+      types[i] = "ON";
+    }
+  }
+  lastType = sor;
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (t === "EN") {
+      types[i] = lastType === "L" ? "L" : "EN";
+    } else if (t === "R" || t === "L") {
+      lastType = t;
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    if (types[i] === "ON") {
+      const end = findUnequal(types, i + 1, "ON");
+      let before = sor;
+      for (let j = i - 1; j >= 0; j--) {
+        const tt = types[j];
+        if (tt === "L") {
+          before = "L";
+          break;
+        }
+        if (tt === "R" || tt === "EN" || tt === "AN") {
+          before = "R";
+          break;
+        }
+      }
+      let after = eor;
+      for (let j = end; j < strLength; j++) {
+        const tt = types[j];
+        if (tt === "L") {
+          after = "L";
+          break;
+        }
+        if (tt === "R" || tt === "EN" || tt === "AN") {
+          after = "R";
+          break;
+        }
+      }
+      if (before === after) {
+        types.fill(before, i, end);
+      }
+      i = end - 1;
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    if (types[i] === "ON") {
+      types[i] = e;
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (isEven(levels[i])) {
+      if (t === "R") {
+        levels[i] += 1;
+      } else if (t === "AN" || t === "EN") {
+        levels[i] += 2;
+      }
+    } else if (t === "L" || t === "AN" || t === "EN") {
+      levels[i] += 1;
+    }
+  }
+  let highestLevel = -1;
+  let lowestOddLevel = 99;
+  let level;
+  for (i = 0, ii = levels.length; i < ii; ++i) {
+    level = levels[i];
+    if (highestLevel < level) {
+      highestLevel = level;
+    }
+    if (lowestOddLevel > level && isOdd(level)) {
+      lowestOddLevel = level;
+    }
+  }
+  for (level = highestLevel; level >= lowestOddLevel; --level) {
+    let start = -1;
+    for (i = 0, ii = levels.length; i < ii; ++i) {
+      if (levels[i] < level) {
+        if (start >= 0) {
+          reverseValues(chars, start, i);
+          start = -1;
+        }
+      } else if (start < 0) {
+        start = i;
+      }
+    }
+    if (start >= 0) {
+      reverseValues(chars, start, levels.length);
+    }
+  }
+  for (i = 0, ii = chars.length; i < ii; ++i) {
+    const ch = chars[i];
+    if (ch === "<" || ch === ">") {
+      chars[i] = "";
+    }
+  }
+  return createBidiText(chars.join(""), isLTR);
+}
+
+;// ./src/core/font_substitutions.js
+
+
+
+const NORMAL = {
+  style: "normal",
+  weight: "normal"
+};
+const MEDIUM = {
+  style: "normal",
+  weight: "500"
+};
+const BOLD = {
+  style: "normal",
+  weight: "bold"
+};
+const ITALIC = {
+  style: "italic",
+  weight: "normal"
+};
+const BOLDITALIC = {
+  style: "italic",
+  weight: "bold"
+};
+const substitutionMap = 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: NORMAL,
+  ultimate: "serif"
+}], ["Times-Bold", {
+  alias: "Times-Roman",
+  style: BOLD,
+  ultimate: "serif"
+}], ["Times-Italic", {
+  alias: "Times-Roman",
+  style: ITALIC,
+  ultimate: "serif"
+}], ["Times-BoldItalic", {
+  alias: "Times-Roman",
+  style: BOLDITALIC,
+  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: NORMAL,
+  ultimate: "sans-serif"
+}], ["Helvetica-Bold", {
+  alias: "Helvetica",
+  path: "LiberationSans-Bold.ttf",
+  style: BOLD,
+  ultimate: "sans-serif"
+}], ["Helvetica-Oblique", {
+  alias: "Helvetica",
+  path: "LiberationSans-Italic.ttf",
+  style: ITALIC,
+  ultimate: "sans-serif"
+}], ["Helvetica-BoldOblique", {
+  alias: "Helvetica",
+  path: "LiberationSans-BoldItalic.ttf",
+  style: BOLDITALIC,
+  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: NORMAL,
+  ultimate: "monospace"
+}], ["Courier-Bold", {
+  alias: "Courier",
+  style: BOLD,
+  ultimate: "monospace"
+}], ["Courier-Oblique", {
+  alias: "Courier",
+  style: ITALIC,
+  ultimate: "monospace"
+}], ["Courier-BoldOblique", {
+  alias: "Courier",
+  style: BOLDITALIC,
+  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: NORMAL,
+  fallback: "Helvetica"
+}], ["ArialNarrow-Bold", {
+  alias: "ArialNarrow",
+  style: BOLD,
+  fallback: "Helvetica-Bold"
+}], ["ArialNarrow-Italic", {
+  alias: "ArialNarrow",
+  style: ITALIC,
+  fallback: "Helvetica-Oblique"
+}], ["ArialNarrow-BoldItalic", {
+  alias: "ArialNarrow",
+  style: BOLDITALIC,
+  fallback: "Helvetica-BoldOblique"
+}], ["Calibri", {
+  local: ["Calibri", "Carlito"],
+  style: NORMAL,
+  fallback: "Helvetica"
+}], ["Calibri-Bold", {
+  alias: "Calibri",
+  style: BOLD,
+  fallback: "Helvetica-Bold"
+}], ["Calibri-Italic", {
+  alias: "Calibri",
+  style: ITALIC,
+  fallback: "Helvetica-Oblique"
+}], ["Calibri-BoldItalic", {
+  alias: "Calibri",
+  style: BOLDITALIC,
+  fallback: "Helvetica-BoldOblique"
+}], ["Wingdings", {
+  local: ["Wingdings", "URW Dingbats"],
+  style: NORMAL
+}], ["Wingdings-Regular", {
+  alias: "Wingdings"
+}], ["Wingdings-Bold", {
+  alias: "Wingdings"
+}], ["\xCB\xCE\xCC\xE5", {
+  local: ["SimSun", "SimSun Regular", "NSimSun"],
+  style: NORMAL,
+  ultimate: "serif"
+}], ["\xBA\xDA\xCC\xE5", {
+  local: ["SimHei", "SimHei Regular"],
+  style: NORMAL,
+  ultimate: "sans-serif"
+}], ["\xBF\xAC\xCC\xE5", {
+  local: ["KaiTi", "SimKai", "SimKai Regular"],
+  style: NORMAL,
+  ultimate: "sans-serif"
+}], ["\xB7\xC2\xCB\xCE", {
+  local: ["FangSong", "SimFang", "SimFang Regular"],
+  style: NORMAL,
+  ultimate: "serif"
+}], ["\xBF\xAC\xCC\xE5_GB2312", {
+  alias: "\xBF\xAC\xCC\xE5"
+}], ["\xB7\xC2\xCB\xCE_GB2312", {
+  alias: "\xB7\xC2\xCB\xCE"
+}], ["\xC1\xA5\xCA\xE9", {
+  local: ["SimLi", "SimLi Regular"],
+  style: NORMAL,
+  ultimate: "serif"
+}], ["\xD0\xC2\xCB\xCE", {
+  alias: "\xCB\xCE\xCC\xE5"
+}], ["HeiseiMin-W3", {
+  local: ["Hiragino Mincho ProN", "Hiragino Mincho Pro", "Yu Mincho", "YuMincho", "Source Han Serif JP", "Noto Serif JP", "Noto Serif CJK JP", "IPAexMincho", "IPAMincho", "Takao Mincho", "MS Mincho", "MS PMincho"],
+  style: NORMAL,
+  ultimate: "serif"
+}], ["HeiseiKakuGo-W5", {
+  local: ["Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "Hiragino Sans", "Yu Gothic", "YuGothic", "Source Han Sans JP", "Noto Sans JP", "Noto Sans CJK JP", "IPAexGothic", "IPAGothic", "Takao Gothic", "Meiryo", "MS Gothic", "MS PGothic"],
+  style: MEDIUM,
+  ultimate: "sans-serif"
+}], ["HeiseiMin-W3-Acro", {
+  alias: "HeiseiMin-W3"
+}], ["HeiseiKakuGo-W5-Acro", {
+  alias: "HeiseiKakuGo-W5"
+}], ["KozMinPro-Regular", {
+  alias: "HeiseiMin-W3"
+}], ["KozMinProVI-Regular", {
+  alias: "HeiseiMin-W3"
+}], ["KozMinPr6N-Regular", {
+  alias: "HeiseiMin-W3"
+}], ["KozGoPro-Regular", {
+  alias: "HeiseiKakuGo-W5"
+}], ["KozGoProVI-Regular", {
+  alias: "HeiseiKakuGo-W5"
+}], ["KozGoPr6N-Regular", {
+  alias: "HeiseiKakuGo-W5"
+}], ["STSong-Light", {
+  local: ["STSong", "Songti SC", "Source Han Serif SC", "Source Han Serif CN", "Noto Serif SC", "Noto Serif CJK SC", "AR PL UMing CN", "SimSun", "NSimSun"],
+  style: NORMAL,
+  ultimate: "serif"
+}], ["STHeiti-Regular", {
+  local: ["STHeiti", "Heiti SC", "PingFang SC", "Source Han Sans SC", "Source Han Sans CN", "Noto Sans SC", "Noto Sans CJK SC", "Microsoft YaHei", "SimHei", "WenQuanYi Zen Hei"],
+  style: NORMAL,
+  ultimate: "sans-serif"
+}], ["STSongStd-Light", {
+  alias: "STSong-Light"
+}], ["AdobeSongStd-Light", {
+  alias: "STSong-Light"
+}], ["AdobeHeitiStd-Regular", {
+  alias: "STHeiti-Regular"
+}], ["AdobeKaitiStd-Regular", {
+  alias: "\xBF\xAC\xCC\xE5"
+}], ["AdobeFangsongStd-Regular", {
+  alias: "\xB7\xC2\xCB\xCE"
+}], ["MSung-Light", {
+  local: ["Songti TC", "LiSong Pro", "Source Han Serif TC", "Source Han Serif TW", "Noto Serif TC", "Noto Serif CJK TC", "AR PL UMing TW", "PMingLiU", "MingLiU", "MingLiU_HKSCS"],
+  style: NORMAL,
+  ultimate: "serif"
+}], ["MHei-Medium", {
+  local: ["Heiti TC", "STHeiti", "Source Han Sans TC", "Source Han Sans TW", "Noto Sans TC", "Noto Sans CJK TC", "PingFang TC", "Microsoft JhengHei"],
+  style: MEDIUM,
+  ultimate: "sans-serif"
+}], ["MSungStd-Light", {
+  alias: "MSung-Light"
+}], ["AdobeMingStd-Light", {
+  alias: "MSung-Light"
+}], ["HYSMyeongJo-Medium", {
+  local: ["AppleMyungjo", "Source Han Serif KR", "Noto Serif KR", "Noto Serif CJK KR", "Nanum Myeongjo", "Batang"],
+  style: MEDIUM,
+  ultimate: "serif"
+}], ["HYGoThic-Medium", {
+  local: ["Apple SD Gothic Neo", "AppleGothic", "Source Han Sans KR", "Noto Sans KR", "Noto Sans CJK KR", "Nanum Gothic", "Malgun Gothic", "Dotum", "Gulim"],
+  style: MEDIUM,
+  ultimate: "sans-serif"
+}], ["HYSMyeongJoStd-Medium", {
+  alias: "HYSMyeongJo-Medium"
+}], ["AdobeMyungjoStd-Medium", {
+  alias: "HYSMyeongJo-Medium"
+}], ["HYGoThic-Bold", {
+  alias: "HYGoThic-Medium",
+  style: BOLD
+}], ["AdobeGothicStd-Bold", {
+  alias: "HYGoThic-Medium",
+  style: BOLD
+}]]);
+const fontAliases = new Map([["Arial-Black", "ArialBlack"]]);
+function getStyleToAppend(style) {
+  switch (style) {
+    case BOLD:
+      return "Bold";
+    case ITALIC:
+      return "Italic";
+    case BOLDITALIC:
+      return "Bold Italic";
+    default:
+      if (style?.weight === "bold") {
+        return "Bold";
+      }
+      if (style?.style === "italic") {
+        return "Italic";
+      }
+  }
+  return "";
+}
+function getFamilyName(str) {
+  const keywords = 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 str.split(/[- ,+]+/g).filter(tok => !keywords.has(tok.toLowerCase())).join(" ");
+}
+function generateFont({
+  alias,
+  local,
+  path,
+  fallback,
+  style,
+  ultimate
+}, src, localFontPath, useFallback = true, usePath = true, append = "") {
+  const result = {
+    style: null,
+    ultimate: null
+  };
+  if (local) {
+    const extra = append ? ` ${append}` : "";
+    for (const name of local) {
+      src.push(`local(${name}${extra})`);
+    }
+  }
+  if (alias) {
+    const substitution = substitutionMap.get(alias);
+    const aliasAppend = append || getStyleToAppend(style);
+    Object.assign(result, generateFont(substitution, src, localFontPath, useFallback && !fallback, usePath && !path, aliasAppend));
+  }
+  if (style) {
+    result.style = style;
+  }
+  if (ultimate) {
+    result.ultimate = ultimate;
+  }
+  if (useFallback && fallback) {
+    const fallbackInfo = substitutionMap.get(fallback);
+    const {
+      ultimate: fallbackUltimate
+    } = generateFont(fallbackInfo, src, localFontPath, useFallback, usePath && !path, append);
+    result.ultimate ||= fallbackUltimate;
+  }
+  if (usePath && path && localFontPath) {
+    src.push(`url(${localFontPath}${path})`);
+  }
+  return result;
+}
+function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFontName, standardFontName, type) {
+  if (baseFontName.startsWith("InvalidPDFjsFont_")) {
+    return null;
+  }
+  if ((type === "TrueType" || type === "Type1") && /^[A-Z]{6}\+/.test(baseFontName)) {
+    baseFontName = baseFontName.slice(7);
+  }
+  baseFontName = normalizeFontName(baseFontName);
+  const key = baseFontName;
+  let substitutionInfo = systemFontCache.get(key);
+  if (substitutionInfo) {
+    return substitutionInfo;
+  }
+  let substitution = substitutionMap.get(baseFontName);
+  if (!substitution) {
+    for (const [alias, subst] of fontAliases) {
+      if (baseFontName.startsWith(alias)) {
+        baseFontName = `${subst}${baseFontName.substring(alias.length)}`;
+        substitution = substitutionMap.get(baseFontName);
+        break;
+      }
+    }
+  }
+  let mustAddBaseFont = false;
+  if (!substitution) {
+    substitution = substitutionMap.get(standardFontName);
+    mustAddBaseFont = true;
+  }
+  const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`;
+  if (!substitution) {
+    if (!validateFontName(baseFontName)) {
+      warn(`Cannot substitute the font because of its name: ${baseFontName}`);
+      systemFontCache.set(key, null);
+      return null;
+    }
+    const bold = /bold/i.test(baseFontName);
+    const italic = /oblique|italic/i.test(baseFontName);
+    const style = bold && italic && BOLDITALIC || bold && BOLD || italic && ITALIC || NORMAL;
+    substitutionInfo = {
+      css: `"${getFamilyName(baseFontName)}",${loadedName}`,
+      guessFallback: true,
+      loadedName,
+      baseFontName,
+      src: `local(${baseFontName})`,
+      style
+    };
+    systemFontCache.set(key, substitutionInfo);
+    return substitutionInfo;
+  }
+  const src = [];
+  if (mustAddBaseFont && validateFontName(baseFontName)) {
+    src.push(`local(${baseFontName})`);
+  }
+  const {
+    style,
+    ultimate
+  } = generateFont(substitution, src, localFontPath);
+  const guessFallback = ultimate === null;
+  const fallback = guessFallback ? "" : `,${ultimate}`;
+  substitutionInfo = {
+    css: `"${getFamilyName(baseFontName)}",${loadedName}${fallback}`,
+    guessFallback,
+    loadedName,
+    baseFontName,
+    src: src.join(","),
+    style
+  };
+  systemFontCache.set(key, substitutionInfo);
+  return substitutionInfo;
+}
+
+;// ./src/shared/murmurhash3.js
+const SEED = 0xc3d2e1f0;
+const MASK_HIGH = 0xffff0000;
+const MASK_LOW = 0xffff;
+class MurmurHash3_64 {
+  constructor(seed) {
+    this.h1 = seed ? seed & 0xffffffff : SEED;
+    this.h2 = seed ? seed & 0xffffffff : SEED;
+  }
+  update(input) {
+    let data, length;
+    if (typeof input === "string") {
+      data = new Uint8Array(input.length * 2);
+      length = 0;
+      for (let i = 0, ii = input.length; i < ii; i++) {
+        const code = input.charCodeAt(i);
+        if (code <= 0xff) {
+          data[length++] = code;
+        } else {
+          data[length++] = code >>> 8;
+          data[length++] = code & 0xff;
+        }
+      }
+    } else if (ArrayBuffer.isView(input)) {
+      data = input.slice();
+      length = data.byteLength;
+    } else {
+      throw new Error("Invalid data format, must be a string or TypedArray.");
+    }
+    const blockCounts = length >> 2;
+    const tailLength = length - blockCounts * 4;
+    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
+    let k1 = 0,
+      k2 = 0;
+    let h1 = this.h1,
+      h2 = this.h2;
+    const C1 = 0xcc9e2d51,
+      C2 = 0x1b873593;
+    const C1_LOW = C1 & MASK_LOW,
+      C2_LOW = C2 & MASK_LOW;
+    for (let i = 0; i < blockCounts; i++) {
+      if (i & 1) {
+        k1 = dataUint32[i];
+        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
+        k1 = k1 << 15 | k1 >>> 17;
+        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+        h1 ^= k1;
+        h1 = h1 << 13 | h1 >>> 19;
+        h1 = h1 * 5 + 0xe6546b64;
+      } else {
+        k2 = dataUint32[i];
+        k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
+        k2 = k2 << 15 | k2 >>> 17;
+        k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
+        h2 ^= k2;
+        h2 = h2 << 13 | h2 >>> 19;
+        h2 = h2 * 5 + 0xe6546b64;
+      }
+    }
+    k1 = 0;
+    switch (tailLength) {
+      case 3:
+        k1 ^= data[blockCounts * 4 + 2] << 16;
+      case 2:
+        k1 ^= data[blockCounts * 4 + 1] << 8;
+      case 1:
+        k1 ^= data[blockCounts * 4];
+        k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
+        k1 = k1 << 15 | k1 >>> 17;
+        k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+        if (blockCounts & 1) {
+          h1 ^= k1;
+        } else {
+          h2 ^= k1;
+        }
+    }
+    this.h1 = h1;
+    this.h2 = h2;
+  }
+  hexdigest() {
+    let h1 = this.h1,
+      h2 = this.h2;
+    h1 ^= h2 >>> 1;
+    h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;
+    h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;
+    h1 ^= h2 >>> 1;
+    h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;
+    h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;
+    h1 ^= h2 >>> 1;
+    return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0");
+  }
+}
+
+;// ./src/core/image.js
+
+
+
+
+
+
+
+
+
+
+
+class PDFImage {
+  constructor({
+    xref,
+    res,
+    image,
+    isInline = false,
+    smask = null,
+    mask = null,
+    isMask = false,
+    pdfFunctionFactory,
+    globalColorSpaceCache,
+    localColorSpaceCache
+  }) {
+    this.image = image;
+    const dict = image.dict;
+    const filter = dict.get("F", "Filter");
+    let filterName;
+    if (filter instanceof Name) {
+      filterName = filter.name;
+    } else if (Array.isArray(filter)) {
+      const filterZero = xref.fetchIfRef(filter[0]);
+      if (filterZero instanceof Name) {
+        filterName = filterZero.name;
+      }
+    }
+    switch (filterName) {
+      case "JPXDecode":
+        ({
+          width: image.width,
+          height: image.height,
+          componentsCount: image.numComps,
+          bitsPerComponent: image.bitsPerComponent
+        } = JpxImage.parseImageProperties(image.stream));
+        image.stream.reset();
+        const reducePower = ImageResizer.getReducePowerForJPX(image.width, image.height, image.numComps);
+        this.jpxDecoderOptions = {
+          numComponents: 0,
+          isIndexedColormap: false,
+          smaskInData: dict.has("SMaskInData"),
+          reducePower
+        };
+        if (reducePower) {
+          const factor = 2 ** reducePower;
+          image.width = Math.ceil(image.width / factor);
+          image.height = Math.ceil(image.height / factor);
+        }
+        break;
+      case "JBIG2Decode":
+        image.bitsPerComponent = 1;
+        image.numComps = 1;
+        break;
+    }
+    let width = dict.get("W", "Width");
+    let height = dict.get("H", "Height");
+    if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) {
+      warn("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary.");
+      width = image.width;
+      height = image.height;
+    } else {
+      const validWidth = typeof width === "number" && width > 0,
+        validHeight = typeof height === "number" && height > 0;
+      if (!validWidth || !validHeight) {
+        if (!image.fallbackDims) {
+          throw new FormatError(`Invalid image width: ${width} or height: ${height}`);
+        }
+        warn("PDFImage - using the Width/Height of the parent image, for SMask/Mask data.");
+        if (!validWidth) {
+          width = image.fallbackDims.width;
+        }
+        if (!validHeight) {
+          height = image.fallbackDims.height;
+        }
+      }
+    }
+    this.width = width;
+    this.height = height;
+    this.interpolate = dict.get("I", "Interpolate");
+    this.imageMask = dict.get("IM", "ImageMask") || false;
+    this.matte = dict.get("Matte") || false;
+    let bitsPerComponent = image.bitsPerComponent;
+    if (!bitsPerComponent) {
+      bitsPerComponent = dict.get("BPC", "BitsPerComponent");
+      if (!bitsPerComponent) {
+        if (this.imageMask) {
+          bitsPerComponent = 1;
+        } else {
+          throw new FormatError(`Bits per component missing in image: ${this.imageMask}`);
+        }
+      }
+    }
+    this.bpc = bitsPerComponent;
+    if (!this.imageMask) {
+      let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace");
+      const hasColorSpace = !!colorSpace;
+      if (!hasColorSpace) {
+        if (this.jpxDecoderOptions) {
+          colorSpace = Name.get("DeviceRGBA");
+        } else {
+          switch (image.numComps) {
+            case 1:
+              colorSpace = Name.get("DeviceGray");
+              break;
+            case 3:
+              colorSpace = Name.get("DeviceRGB");
+              break;
+            case 4:
+              colorSpace = Name.get("DeviceCMYK");
+              break;
+            default:
+              throw new Error(`Images with ${image.numComps} color components not supported.`);
+          }
+        }
+      } else if (this.jpxDecoderOptions?.smaskInData) {
+        colorSpace = Name.get("DeviceRGBA");
+      }
+      this.colorSpace = ColorSpaceUtils.parse({
+        cs: colorSpace,
+        xref,
+        resources: isInline ? res : null,
+        pdfFunctionFactory,
+        globalColorSpaceCache,
+        localColorSpaceCache
+      });
+      this.numComps = this.colorSpace.numComps;
+      if (this.jpxDecoderOptions) {
+        this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComps : 0;
+        this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed";
+      }
+    } else {
+      this.numComps = 1;
+    }
+    this.decode = dict.getArray("D", "Decode");
+    this.needsDecode = false;
+    if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) {
+      this.needsDecode = true;
+      const max = (1 << bitsPerComponent) - 1;
+      this.decodeCoefficients = [];
+      this.decodeAddends = [];
+      const isIndexed = this.colorSpace?.name === "Indexed";
+      for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
+        const dmin = this.decode[i];
+        const dmax = this.decode[i + 1];
+        this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;
+        this.decodeAddends[j] = isIndexed ? dmin : max * dmin;
+      }
+    }
+    if (smask) {
+      smask.fallbackDims ??= {
+        width,
+        height
+      };
+      this.smask = new PDFImage({
+        xref,
+        res,
+        image: smask,
+        isInline,
+        pdfFunctionFactory,
+        globalColorSpaceCache,
+        localColorSpaceCache
+      });
+    } else if (mask) {
+      if (mask instanceof BaseStream) {
+        const maskDict = mask.dict,
+          imageMask = maskDict.get("IM", "ImageMask");
+        if (!imageMask) {
+          warn("Ignoring /Mask in image without /ImageMask.");
+        } else {
+          mask.fallbackDims ??= {
+            width,
+            height
+          };
+          this.mask = new PDFImage({
+            xref,
+            res,
+            image: mask,
+            isInline,
+            isMask: true,
+            pdfFunctionFactory,
+            globalColorSpaceCache,
+            localColorSpaceCache
+          });
+        }
+      } else {
+        this.mask = mask;
+      }
+    }
+  }
+  static async buildImage({
+    xref,
+    res,
+    image,
+    isInline = false,
+    pdfFunctionFactory,
+    globalColorSpaceCache,
+    localColorSpaceCache
+  }) {
+    const imageData = image;
+    let smaskData = null;
+    let maskData = null;
+    const smask = image.dict.get("SMask");
+    const mask = image.dict.get("Mask");
+    if (smask) {
+      if (smask instanceof BaseStream) {
+        smaskData = smask;
+      } else {
+        warn("Unsupported /SMask format.");
+      }
+    } else if (mask) {
+      if (mask instanceof BaseStream || Array.isArray(mask)) {
+        maskData = mask;
+      } else {
+        warn("Unsupported /Mask format.");
+      }
+    }
+    return new PDFImage({
+      xref,
+      res,
+      image: imageData,
+      isInline,
+      smask: smaskData,
+      mask: maskData,
+      pdfFunctionFactory,
+      globalColorSpaceCache,
+      localColorSpaceCache
+    });
+  }
+  static async createMask({
+    image,
+    isOffscreenCanvasSupported = false
+  }) {
+    const {
+      dict
+    } = image;
+    const width = dict.get("W", "Width");
+    const height = dict.get("H", "Height");
+    const interpolate = dict.get("I", "Interpolate");
+    const decode = dict.getArray("D", "Decode");
+    const inverseDecode = decode?.[0] > 0;
+    const computedLength = (width + 7 >> 3) * height;
+    const imgArray = await image.getImageData(computedLength);
+    const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128));
+    if (isSingleOpaquePixel) {
+      return {
+        isSingleOpaquePixel
+      };
+    }
+    if (isOffscreenCanvasSupported) {
+      if (ImageResizer.needsToBeResized(width, height)) {
+        const data = new Uint8ClampedArray(width * height * 4);
+        convertBlackAndWhiteToRGBA({
+          src: imgArray,
+          dest: data,
+          width,
+          height,
+          nonBlackColor: 0,
+          inverseDecode
+        });
+        return ImageResizer.createImage({
+          kind: ImageKind.RGBA_32BPP,
+          data,
+          width,
+          height,
+          interpolate
+        });
+      }
+      const canvas = new OffscreenCanvas(width, height);
+      const ctx = canvas.getContext("2d");
+      const imgData = ctx.createImageData(width, height);
+      convertBlackAndWhiteToRGBA({
+        src: imgArray,
+        dest: imgData.data,
+        width,
+        height,
+        nonBlackColor: 0,
+        inverseDecode
+      });
+      ctx.putImageData(imgData, 0, 0);
+      const bitmap = canvas.transferToImageBitmap();
+      return {
+        data: null,
+        width,
+        height,
+        interpolate,
+        bitmap
+      };
+    }
+    const actualLength = imgArray.byteLength;
+    const haveFullData = computedLength === actualLength;
+    let data;
+    if (image instanceof DecodeStream && (!inverseDecode || haveFullData)) {
+      data = imgArray;
+    } else if (!inverseDecode) {
+      data = new Uint8Array(imgArray);
+    } else {
+      data = new Uint8Array(computedLength);
+      data.set(imgArray);
+      data.fill(0xff, actualLength);
+    }
+    if (inverseDecode) {
+      for (let i = 0; i < actualLength; i++) {
+        data[i] ^= 0xff;
+      }
+    }
+    return {
+      data,
+      width,
+      height,
+      interpolate
+    };
+  }
+  get drawWidth() {
+    return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0);
+  }
+  get drawHeight() {
+    return Math.max(this.height, this.smask?.height || 0, this.mask?.height || 0);
+  }
+  decodeBuffer(buffer) {
+    const bpc = this.bpc;
+    const numComps = this.numComps;
+    const decodeAddends = this.decodeAddends;
+    const decodeCoefficients = this.decodeCoefficients;
+    const max = (1 << bpc) - 1;
+    let i, ii;
+    if (bpc === 1) {
+      for (i = 0, ii = buffer.length; i < ii; i++) {
+        buffer[i] = +!buffer[i];
+      }
+      return;
+    }
+    let index = 0;
+    for (i = 0, ii = this.width * this.height; i < ii; i++) {
+      for (let j = 0; j < numComps; j++) {
+        buffer[index] = MathClamp(decodeAddends[j] + buffer[index] * decodeCoefficients[j], 0, max);
+        index++;
+      }
+    }
+  }
+  getComponents(buffer) {
+    const bpc = this.bpc;
+    if (bpc === 8) {
+      return buffer;
+    }
+    const width = this.width;
+    const height = this.height;
+    const numComps = this.numComps;
+    const length = width * height * numComps;
+    let bufferPos = 0;
+    let output;
+    if (bpc <= 8) {
+      output = new Uint8Array(length);
+    } else if (bpc <= 16) {
+      output = new Uint16Array(length);
+    } else {
+      output = new Uint32Array(length);
+    }
+    const rowComps = width * numComps;
+    const max = (1 << bpc) - 1;
+    let i = 0,
+      ii,
+      buf;
+    if (bpc === 1) {
+      let mask, loop1End, loop2End;
+      for (let j = 0; j < height; j++) {
+        loop1End = i + (rowComps & ~7);
+        loop2End = i + rowComps;
+        while (i < loop1End) {
+          buf = buffer[bufferPos++];
+          output[i] = buf >> 7 & 1;
+          output[i + 1] = buf >> 6 & 1;
+          output[i + 2] = buf >> 5 & 1;
+          output[i + 3] = buf >> 4 & 1;
+          output[i + 4] = buf >> 3 & 1;
+          output[i + 5] = buf >> 2 & 1;
+          output[i + 6] = buf >> 1 & 1;
+          output[i + 7] = buf & 1;
+          i += 8;
+        }
+        if (i < loop2End) {
+          buf = buffer[bufferPos++];
+          mask = 128;
+          while (i < loop2End) {
+            output[i++] = +!!(buf & mask);
+            mask >>= 1;
+          }
+        }
+      }
+    } else {
+      let bits = 0;
+      buf = 0;
+      for (i = 0, ii = length; i < ii; ++i) {
+        if (i % rowComps === 0) {
+          buf = 0;
+          bits = 0;
+        }
+        while (bits < bpc) {
+          buf = buf << 8 | buffer[bufferPos++];
+          bits += 8;
+        }
+        const remainingBits = bits - bpc;
+        let value = buf >> remainingBits;
+        if (value < 0) {
+          value = 0;
+        } else if (value > max) {
+          value = max;
+        }
+        output[i] = value;
+        buf &= (1 << remainingBits) - 1;
+        bits = remainingBits;
+      }
+    }
+    return output;
+  }
+  async fillOpacity(rgbaBuf, width, height, actualHeight, image) {
+    let apply;
+    if (this.smask) {
+      apply = (buffer, options) => this.smask.fillGrayBuffer(buffer, {
+        ...options,
+        destWidth: width,
+        destHeight: height
+      });
+    } else if (this.mask) {
+      if (this.mask instanceof PDFImage) {
+        apply = (buffer, options) => this.mask.fillGrayBuffer(buffer, {
+          ...options,
+          invertOutput: true,
+          destWidth: width,
+          destHeight: height
+        });
+      } else if (Array.isArray(this.mask)) {
+        apply = (buffer, {
+          maxRows,
+          offset,
+          stride
+        }) => {
+          for (let i = 0, ii = width * maxRows; i < ii; ++i) {
+            let opacity = 0;
+            const imageOffset = i * this.numComps;
+            for (let j = 0; j < this.numComps; ++j) {
+              const color = image[imageOffset + j];
+              const maskOffset = j * 2;
+              if (color < this.mask[maskOffset] || color > this.mask[maskOffset + 1]) {
+                opacity = 255;
+                break;
+              }
+            }
+            buffer[i * stride + offset] = opacity;
+          }
+        };
+      } else {
+        throw new FormatError("Unknown mask format.");
+      }
+    } else {
+      apply = (buffer, {
+        maxRows,
+        offset,
+        stride
+      }) => {
+        for (let i = 0, ii = width * maxRows; i < ii; ++i) {
+          buffer[i * stride + offset] = 255;
+        }
+      };
+    }
+    await apply(rgbaBuf, {
+      maxRows: actualHeight,
+      offset: 3,
+      stride: 4
+    });
+  }
+  undoPreblend(buffer, width, height) {
+    const matte = this.smask?.matte;
+    if (!matte) {
+      return;
+    }
+    const matteRgb = this.colorSpace.getRgb(matte, 0);
+    const matteR = matteRgb[0];
+    const matteG = matteRgb[1];
+    const matteB = matteRgb[2];
+    const length = width * height * 4;
+    for (let i = 0; i < length; i += 4) {
+      const alpha = buffer[i + 3];
+      if (alpha === 0) {
+        buffer[i] = 255;
+        buffer[i + 1] = 255;
+        buffer[i + 2] = 255;
+        continue;
+      }
+      const k = 255 / alpha;
+      buffer[i] = (buffer[i] - matteR) * k + matteR;
+      buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
+      buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
+    }
+  }
+  async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) {
+    const drawWidth = this.drawWidth;
+    const drawHeight = this.drawHeight;
+    const imgData = {
+      width: drawWidth,
+      height: drawHeight,
+      interpolate: this.interpolate,
+      kind: 0,
+      data: null
+    };
+    const numComps = this.numComps;
+    const originalWidth = this.width;
+    const originalHeight = this.height;
+    const bpc = this.bpc;
+    const rowBytes = originalWidth * numComps * bpc + 7 >> 3;
+    const mustBeResized = isOffscreenCanvasSupported && ImageResizer.needsToBeResized(drawWidth, drawHeight);
+    if (!this.smask && !this.mask && this.colorSpace.name === "DeviceRGBA") {
+      imgData.kind = ImageKind.RGBA_32BPP;
+      const imgArray = imgData.data = await this.getImageBytes(originalHeight * originalWidth * 4, {
+        internal: isOffscreenCanvasSupported && mustBeResized
+      });
+      if (isOffscreenCanvasSupported) {
+        if (!mustBeResized) {
+          return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray);
+        }
+        return ImageResizer.createImage(imgData, false);
+      }
+      return imgData;
+    }
+    if (!forceRGBA) {
+      let kind;
+      if (this.colorSpace.name === "DeviceGray" && bpc === 1) {
+        kind = ImageKind.GRAYSCALE_1BPP;
+      } else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) {
+        kind = ImageKind.RGB_24BPP;
+      }
+      if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {
+        const image = await this.#getImage(originalWidth, originalHeight);
+        if (image) {
+          return image;
+        }
+        const data = await this.getImageBytes(originalHeight * rowBytes, {
+          internal: isOffscreenCanvasSupported && mustBeResized
+        });
+        if (isOffscreenCanvasSupported) {
+          if (mustBeResized) {
+            return ImageResizer.createImage({
+              data,
+              kind,
+              width: drawWidth,
+              height: drawHeight,
+              interpolate: this.interpolate
+            }, this.needsDecode);
+          }
+          return this.createBitmap(kind, originalWidth, originalHeight, data);
+        }
+        imgData.kind = kind;
+        imgData.data = data;
+        if (this.needsDecode) {
+          assert(kind === ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale.");
+          const buffer = imgData.data;
+          for (let i = 0, ii = buffer.length; i < ii; i++) {
+            buffer[i] ^= 0xff;
+          }
+        }
+        return imgData;
+      }
+      if (this.image instanceof JpegStream && !this.smask && !this.mask && !this.needsDecode) {
+        let imageLength = originalHeight * rowBytes;
+        if (isOffscreenCanvasSupported && !mustBeResized) {
+          let isHandled = false;
+          switch (this.colorSpace.name) {
+            case "DeviceGray":
+              imageLength *= 4;
+              isHandled = true;
+              break;
+            case "DeviceRGB":
+              imageLength = imageLength / 3 * 4;
+              isHandled = true;
+              break;
+            case "DeviceCMYK":
+              isHandled = true;
+              break;
+          }
+          if (isHandled) {
+            const image = await this.#getImage(drawWidth, drawHeight);
+            if (image) {
+              return image;
+            }
+            const rgba = await this.getImageBytes(imageLength, {
+              drawWidth,
+              drawHeight,
+              forceRGBA: true,
+              internal: true
+            });
+            return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba);
+          }
+        } else {
+          switch (this.colorSpace.name) {
+            case "DeviceGray":
+              imageLength *= 3;
+            case "DeviceRGB":
+            case "DeviceCMYK":
+              imgData.kind = ImageKind.RGB_24BPP;
+              imgData.data = await this.getImageBytes(imageLength, {
+                drawWidth,
+                drawHeight,
+                forceRGB: true,
+                internal: mustBeResized
+              });
+              if (mustBeResized) {
+                return ImageResizer.createImage(imgData);
+              }
+              return imgData;
+          }
+        }
+      }
+    }
+    const imgArray = await this.getImageBytes(originalHeight * rowBytes, {
+      internal: true
+    });
+    const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
+    const comps = this.getComponents(imgArray);
+    let alpha01, maybeUndoPreblend;
+    let canvas, ctx, canvasImgData, data;
+    if (isOffscreenCanvasSupported && !mustBeResized) {
+      canvas = new OffscreenCanvas(drawWidth, drawHeight);
+      ctx = canvas.getContext("2d");
+      canvasImgData = ctx.createImageData(drawWidth, drawHeight);
+      data = canvasImgData.data;
+    }
+    imgData.kind = ImageKind.RGBA_32BPP;
+    if (!forceRGBA && !this.smask && !this.mask) {
+      if (!isOffscreenCanvasSupported || mustBeResized) {
+        imgData.kind = ImageKind.RGB_24BPP;
+        data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
+        alpha01 = 0;
+      } else {
+        const arr = new Uint32Array(data.buffer);
+        arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff);
+        alpha01 = 1;
+      }
+      maybeUndoPreblend = false;
+    } else {
+      if (!isOffscreenCanvasSupported || mustBeResized) {
+        data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
+      }
+      alpha01 = 1;
+      maybeUndoPreblend = true;
+      await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps);
+    }
+    if (this.needsDecode) {
+      this.decodeBuffer(comps);
+    }
+    this.colorSpace.fillRgb(data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);
+    if (maybeUndoPreblend) {
+      this.undoPreblend(data, drawWidth, actualHeight);
+    }
+    if (isOffscreenCanvasSupported && !mustBeResized) {
+      ctx.putImageData(canvasImgData, 0, 0);
+      const bitmap = canvas.transferToImageBitmap();
+      return {
+        data: null,
+        width: drawWidth,
+        height: drawHeight,
+        bitmap,
+        interpolate: this.interpolate
+      };
+    }
+    imgData.data = data;
+    if (mustBeResized) {
+      return ImageResizer.createImage(imgData);
+    }
+    return imgData;
+  }
+  async fillGrayBuffer(buffer, {
+    destWidth,
+    destHeight,
+    invertOutput,
+    maxRows,
+    offset = 0,
+    stride = 1
+  } = {}) {
+    const numComps = this.numComps;
+    if (numComps !== 1) {
+      throw new FormatError(`Reading gray scale from a color image: ${numComps}`);
+    }
+    const srcWidth = this.width;
+    const srcHeight = this.height;
+    const bpc = this.bpc;
+    const rowBytes = srcWidth * numComps * bpc + 7 >> 3;
+    const imgArray = await this.getImageBytes(srcHeight * rowBytes, {
+      internal: true
+    });
+    const comps = this.getComponents(imgArray);
+    const resolvedDestWidth = destWidth ?? srcWidth;
+    const resolvedDestHeight = destHeight ?? srcHeight;
+    const needsResampling = resolvedDestWidth !== srcWidth || resolvedDestHeight !== srcHeight;
+    const rows = maxRows === undefined ? resolvedDestHeight : Math.min(resolvedDestHeight, maxRows);
+    let outputWidth = srcWidth;
+    let yRatio = 0;
+    let xScaled = null;
+    if (needsResampling) {
+      outputWidth = resolvedDestWidth;
+      yRatio = srcHeight / resolvedDestHeight;
+      const xRatio = srcWidth / resolvedDestWidth;
+      xScaled = new Uint32Array(resolvedDestWidth);
+      for (let i = 0; i < resolvedDestWidth; i++) {
+        xScaled[i] = Math.floor(i * xRatio);
+      }
+    }
+    const mask = invertOutput ? 0xff : 0;
+    if (bpc === 1) {
+      if (xScaled) {
+        const xMap = xScaled;
+        let destIndex = offset;
+        if (this.needsDecode) {
+          for (let row = 0; row < rows; row++) {
+            const py = Math.floor(row * yRatio) * srcWidth;
+            for (let col = 0; col < outputWidth; col++) {
+              buffer[destIndex] = comps[py + xMap[col]] - 1 & 255 ^ mask;
+              destIndex += stride;
+            }
+          }
+        } else {
+          for (let row = 0; row < rows; row++) {
+            const py = Math.floor(row * yRatio) * srcWidth;
+            for (let col = 0; col < outputWidth; col++) {
+              buffer[destIndex] = -comps[py + xMap[col]] & 255 ^ mask;
+              destIndex += stride;
+            }
+          }
+        }
+      } else {
+        const length = outputWidth * rows;
+        if (this.needsDecode) {
+          for (let i = 0; i < length; ++i) {
+            buffer[i * stride + offset] = comps[i] - 1 & 255 ^ mask;
+          }
+        } else {
+          for (let i = 0; i < length; ++i) {
+            buffer[i * stride + offset] = -comps[i] & 255 ^ mask;
+          }
+        }
+      }
+      return;
+    }
+    if (this.needsDecode) {
+      this.decodeBuffer(comps);
+    }
+    const scale = 255 / ((1 << bpc) - 1);
+    if (xScaled) {
+      const xMap = xScaled;
+      let destIndex = offset;
+      for (let row = 0; row < rows; row++) {
+        const py = Math.floor(row * yRatio) * srcWidth;
+        for (let col = 0; col < outputWidth; col++) {
+          buffer[destIndex] = scale * comps[py + xMap[col]] ^ mask;
+          destIndex += stride;
+        }
+      }
+    } else {
+      const length = outputWidth * rows;
+      for (let i = 0; i < length; ++i) {
+        buffer[i * stride + offset] = scale * comps[i] ^ mask;
+      }
+    }
+  }
+  createBitmap(kind, width, height, src) {
+    const canvas = new OffscreenCanvas(width, height);
+    const ctx = canvas.getContext("2d");
+    let imgData;
+    if (kind === ImageKind.RGBA_32BPP) {
+      imgData = new ImageData(src, width, height);
+    } else {
+      imgData = ctx.createImageData(width, height);
+      convertToRGBA({
+        kind,
+        src,
+        dest: new Uint32Array(imgData.data.buffer),
+        width,
+        height,
+        inverseDecode: this.needsDecode
+      });
+    }
+    ctx.putImageData(imgData, 0, 0);
+    const bitmap = canvas.transferToImageBitmap();
+    return {
+      data: null,
+      width,
+      height,
+      bitmap,
+      interpolate: this.interpolate
+    };
+  }
+  async #getImage(width, height) {
+    const bitmap = await this.image.getTransferableImage();
+    if (!bitmap) {
+      return null;
+    }
+    return {
+      data: null,
+      width,
+      height,
+      bitmap,
+      interpolate: this.interpolate
+    };
+  }
+  async getImageBytes(length, {
+    drawWidth,
+    drawHeight,
+    forceRGBA = false,
+    forceRGB = false,
+    internal = false
+  }) {
+    this.image.reset();
+    this.image.drawWidth = drawWidth || this.width;
+    this.image.drawHeight = drawHeight || this.height;
+    this.image.forceRGBA = !!forceRGBA;
+    this.image.forceRGB = !!forceRGB;
+    const imageBytes = await this.image.getImageData(length, this.jpxDecoderOptions);
+    if (internal || this.image instanceof DecodeStream) {
+      return imageBytes;
+    }
+    assert(imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.');
+    return new Uint8Array(imageBytes);
+  }
+}
+
+;// ./src/core/evaluator.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const DefaultPartialEvaluatorOptions = Object.freeze({
+  maxImageSize: -1,
+  disableFontFace: false,
+  ignoreErrors: false,
+  isOffscreenCanvasSupported: false,
+  isImageDecoderSupported: false,
+  canvasMaxAreaInBytes: -1,
+  fontExtraProperties: false,
+  useSystemFonts: true,
+  useWasm: true,
+  useWorkerFetch: true,
+  cMapUrl: null,
+  cMapPacked: true,
+  iccUrl: null,
+  standardFontDataUrl: null,
+  wasmUrl: null,
+  hasGPU: false
+});
+const PatternType = {
+  TILING: 1,
+  SHADING: 2
+};
+const TEXT_CHUNK_BATCH_SIZE = 10;
+const deferred = Promise.resolve();
+function normalizeBlendMode(value, parsingArray = false) {
+  if (Array.isArray(value)) {
+    for (const val of value) {
+      const maybeBM = normalizeBlendMode(val, true);
+      if (maybeBM) {
+        return maybeBM;
+      }
+    }
+    warn(`Unsupported blend mode Array: ${value}`);
+    return "source-over";
+  }
+  if (!(value instanceof Name)) {
+    if (parsingArray) {
+      return null;
+    }
+    return "source-over";
+  }
+  switch (value.name) {
+    case "Normal":
+    case "Compatible":
+      return "source-over";
+    case "Multiply":
+      return "multiply";
+    case "Screen":
+      return "screen";
+    case "Overlay":
+      return "overlay";
+    case "Darken":
+      return "darken";
+    case "Lighten":
+      return "lighten";
+    case "ColorDodge":
+      return "color-dodge";
+    case "ColorBurn":
+      return "color-burn";
+    case "HardLight":
+      return "hard-light";
+    case "SoftLight":
+      return "soft-light";
+    case "Difference":
+      return "difference";
+    case "Exclusion":
+      return "exclusion";
+    case "Hue":
+      return "hue";
+    case "Saturation":
+      return "saturation";
+    case "Color":
+      return "color";
+    case "Luminosity":
+      return "luminosity";
+  }
+  if (parsingArray) {
+    return null;
+  }
+  warn(`Unsupported blend mode: ${value.name}`);
+  return "source-over";
+}
+function addCachedImageOps(opList, {
+  objId,
+  fn,
+  args,
+  optionalContent,
+  hasMask
+}) {
+  if (objId) {
+    opList.addDependency(objId);
+  }
+  opList.addImageOps(fn, args, optionalContent, hasMask);
+  if (fn === OPS.paintImageMaskXObject && args[0]?.count > 0) {
+    args[0].count++;
+  }
+}
+class TimeSlotManager {
+  static TIME_SLOT_DURATION_MS = 20;
+  static CHECK_TIME_EVERY = 100;
+  constructor() {
+    this.reset();
+  }
+  check() {
+    if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) {
+      return false;
+    }
+    this.checked = 0;
+    return this.endTime <= Date.now();
+  }
+  reset() {
+    this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS;
+    this.checked = 0;
+  }
+}
+class PartialEvaluator {
+  constructor({
+    xref,
+    handler,
+    pageIndex,
+    idFactory,
+    fontCache,
+    builtInCMapCache,
+    standardFontDataCache,
+    globalColorSpaceCache,
+    globalImageCache,
+    systemFontCache,
+    options = null
+  }) {
+    this.xref = xref;
+    this.handler = handler;
+    this.pageIndex = pageIndex;
+    this.idFactory = idFactory;
+    this.fontCache = fontCache;
+    this.builtInCMapCache = builtInCMapCache;
+    this.standardFontDataCache = standardFontDataCache;
+    this.globalColorSpaceCache = globalColorSpaceCache;
+    this.globalImageCache = globalImageCache;
+    this.systemFontCache = systemFontCache;
+    this.options = options || DefaultPartialEvaluatorOptions;
+    this.type3FontRefs = null;
+    this._regionalImageCache = new RegionalImageCache();
+    this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this);
+  }
+  get _pdfFunctionFactory() {
+    return shadow(this, "_pdfFunctionFactory", new PDFFunctionFactory({
+      xref: this.xref
+    }));
+  }
+  get parsingType3Font() {
+    return !!this.type3FontRefs;
+  }
+  clone(newOptions = null) {
+    const newEvaluator = Object.create(this);
+    newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions);
+    return newEvaluator;
+  }
+  hasBlendModes(resources, nonBlendModesSet) {
+    if (!(resources instanceof Dict)) {
+      return false;
+    }
+    if (resources.objId && nonBlendModesSet.has(resources.objId)) {
+      return false;
+    }
+    const processed = new RefSet(nonBlendModesSet);
+    if (resources.objId) {
+      processed.put(resources.objId);
+    }
+    const nodes = [resources],
+      xref = this.xref;
+    while (nodes.length) {
+      const node = nodes.shift();
+      const graphicStates = node.get("ExtGState");
+      if (graphicStates instanceof Dict) {
+        for (let graphicState of graphicStates.getRawValues()) {
+          if (graphicState instanceof Ref) {
+            if (processed.has(graphicState)) {
+              continue;
+            }
+            try {
+              graphicState = xref.fetch(graphicState);
+            } catch (ex) {
+              processed.put(graphicState);
+              info(`hasBlendModes - ignoring ExtGState: "${ex}".`);
+              continue;
+            }
+          }
+          if (!(graphicState instanceof Dict)) {
+            continue;
+          }
+          if (graphicState.objId) {
+            processed.put(graphicState.objId);
+          }
+          const bm = graphicState.get("BM");
+          if (bm instanceof Name) {
+            if (bm.name !== "Normal") {
+              return true;
+            }
+            continue;
+          }
+          if (bm !== undefined && Array.isArray(bm)) {
+            for (const element of bm) {
+              if (element instanceof Name && element.name !== "Normal") {
+                return true;
+              }
+            }
+          }
+        }
+      }
+      const xObjects = node.get("XObject");
+      if (!(xObjects instanceof Dict)) {
+        continue;
+      }
+      for (let xObject of xObjects.getRawValues()) {
+        if (xObject instanceof Ref) {
+          if (processed.has(xObject)) {
+            continue;
+          }
+          try {
+            xObject = xref.fetch(xObject);
+          } catch (ex) {
+            processed.put(xObject);
+            info(`hasBlendModes - ignoring XObject: "${ex}".`);
+            continue;
+          }
+        }
+        if (!(xObject instanceof BaseStream)) {
+          continue;
+        }
+        if (xObject.dict.objId) {
+          processed.put(xObject.dict.objId);
+        }
+        const xResources = xObject.dict.get("Resources");
+        if (!(xResources instanceof Dict)) {
+          continue;
+        }
+        if (xResources.objId && processed.has(xResources.objId)) {
+          continue;
+        }
+        nodes.push(xResources);
+        if (xResources.objId) {
+          processed.put(xResources.objId);
+        }
+      }
+    }
+    for (const ref of processed) {
+      nonBlendModesSet.put(ref);
+    }
+    return false;
+  }
+  async fetchBuiltInCMap(name) {
+    const cachedData = this.builtInCMapCache.get(name);
+    if (cachedData) {
+      return cachedData;
+    }
+    let data;
+    if (this.options.useWorkerFetch) {
+      data = {
+        cMapData: await fetchBinaryData(`${this.options.cMapUrl}${name}.bcmap`),
+        isCompressed: true
+      };
+    } else {
+      data = {
+        cMapData: await this.handler.sendWithPromise("FetchBinaryData", {
+          kind: "cMapUrl",
+          filename: `${name}${this.options.cMapPacked ? ".bcmap" : ""}`
+        }),
+        isCompressed: this.options.cMapPacked
+      };
+    }
+    this.builtInCMapCache.set(name, data);
+    return data;
+  }
+  async fetchStandardFontData(name) {
+    const cachedData = this.standardFontDataCache.get(name);
+    if (cachedData) {
+      return new Stream(cachedData);
+    }
+    if (this.options.useSystemFonts && name !== "Symbol" && name !== "ZapfDingbats") {
+      return null;
+    }
+    const standardFontNameToFileName = getFontNameToFileMap(),
+      filename = standardFontNameToFileName[name];
+    let data;
+    try {
+      if (this.options.useWorkerFetch) {
+        data = await fetchBinaryData(`${this.options.standardFontDataUrl}${filename}`);
+      } else {
+        data = await this.handler.sendWithPromise("FetchBinaryData", {
+          kind: "standardFontDataUrl",
+          filename
+        });
+      }
+    } catch (ex) {
+      warn(ex);
+      return null;
+    }
+    this.standardFontDataCache.set(name, data);
+    return new Stream(data);
+  }
+  async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache, seenRefs) {
+    const {
+      dict
+    } = xobj;
+    const matrix = lookupMatrix(dict.getArray("Matrix"), null);
+    const bbox = lookupNormalRect(dict.getArray("BBox"), null);
+    let f32bbox = bbox && new Float32Array(bbox);
+    if (f32bbox?.some(x => !isFinite(x))) {
+      f32bbox = null;
+    }
+    let optionalContent, groupOptions;
+    if (dict.has("OC")) {
+      optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources);
+    }
+    if (optionalContent !== undefined) {
+      operatorList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]);
+    }
+    const group = dict.get("Group");
+    let newOpList;
+    const f32matrix = matrix && new Float32Array(matrix);
+    const args = [f32matrix, !group && f32bbox || null];
+    const localResources = dict.get("Resources");
+    if (group) {
+      groupOptions = {
+        matrix,
+        bbox: f32bbox,
+        smask,
+        isolated: false,
+        knockout: false,
+        needsIsolation: false,
+        hasSoftMask: false,
+        isGray: false
+      };
+      const groupSubtype = group.get("S");
+      let colorSpace = null;
+      if (isName(groupSubtype, "Transparency")) {
+        groupOptions.isolated = group.get("I") || false;
+        groupOptions.knockout = group.get("K") || false;
+        if (group.has("CS")) {
+          const cs = this._getColorSpace(group.getRaw("CS"), resources, localColorSpaceCache);
+          colorSpace = cs instanceof ColorSpace ? cs : await this._handleColorSpace(cs);
+        }
+      }
+      groupOptions.isGray = colorSpace?.numComps === 1;
+      if (smask?.backdrop) {
+        colorSpace ||= ColorSpaceUtils.rgb;
+        smask.backdrop = colorSpace.getRgbHex(smask.backdrop, 0);
+      } else if (smask?.subtype === "Luminosity") {
+        smask.backdrop = "#000000";
+      }
+      newOpList = new CheckedOperatorList();
+    } else {
+      newOpList = operatorList;
+      operatorList.addOp(OPS.paintFormXObjectBegin, args);
+    }
+    await this.getOperatorList({
+      stream: xobj,
+      task,
+      resources: localResources instanceof Dict ? localResources : resources,
+      operatorList: newOpList,
+      initialState,
+      prevRefs: seenRefs
+    });
+    if (group) {
+      groupOptions.needsIsolation = newOpList.needsIsolation || !!smask;
+      groupOptions.hasSoftMask = newOpList.hasSoftMask || !!smask;
+      operatorList.addOp(OPS.beginGroup, [groupOptions]);
+      operatorList.addOp(OPS.paintFormXObjectBegin, args);
+      operatorList.addOpList(newOpList);
+      operatorList.addOp(OPS.paintFormXObjectEnd, []);
+      operatorList.addOp(OPS.endGroup, [groupOptions]);
+    } else {
+      operatorList.addOp(OPS.paintFormXObjectEnd, []);
+    }
+    if (optionalContent !== undefined) {
+      operatorList.addOp(OPS.endMarkedContent, []);
+    }
+  }
+  _sendImgData(objId, imgData, cacheGlobally = false) {
+    const transfers = imgData ? [imgData.bitmap || imgData.data.buffer] : null;
+    if (this.parsingType3Font || cacheGlobally) {
+      return this.handler.send("commonobj", [objId, "Image", imgData], transfers);
+    }
+    return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers);
+  }
+  async buildPaintImageXObject({
+    resources,
+    image,
+    isInline = false,
+    operatorList,
+    cacheKey,
+    localImageCache,
+    localColorSpaceCache
+  }) {
+    const {
+      maxImageSize,
+      ignoreErrors,
+      isOffscreenCanvasSupported
+    } = this.options;
+    const {
+      dict
+    } = image;
+    const imageRef = dict.objId;
+    const w = dict.get("W", "Width");
+    const h = dict.get("H", "Height");
+    if (!(w && typeof w === "number") || !(h && typeof h === "number")) {
+      warn("Image dimensions are missing, or not numbers.");
+      return;
+    }
+    if (maxImageSize !== -1 && w * h > maxImageSize) {
+      const msg = "Image exceeded maximum allowed size and was removed.";
+      if (!ignoreErrors) {
+        throw new Error(msg);
+      }
+      warn(msg);
+      return;
+    }
+    let optionalContent;
+    if (dict.has("OC")) {
+      optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources);
+    }
+    const imageMask = dict.get("IM", "ImageMask") || false;
+    let imgData, fn, args;
+    if (imageMask) {
+      imgData = await PDFImage.createMask({
+        image,
+        isOffscreenCanvasSupported: isOffscreenCanvasSupported && !this.parsingType3Font
+      });
+      if (imgData.isSingleOpaquePixel) {
+        fn = OPS.paintSolidColorImageMask;
+        args = [];
+        operatorList.addImageOps(fn, args, optionalContent);
+        if (cacheKey) {
+          const cacheData = {
+            fn,
+            args,
+            optionalContent
+          };
+          localImageCache.set(cacheKey, imageRef, cacheData);
+          if (imageRef) {
+            this._regionalImageCache.set(null, imageRef, cacheData);
+          }
+        }
+        return;
+      }
+      if (this.parsingType3Font) {
+        args = compileType3Glyph(imgData);
+        if (args) {
+          operatorList.addImageOps(OPS.constructPath, args, optionalContent);
+          return;
+        }
+        warn("Cannot compile Type3 glyph.");
+        operatorList.addImageOps(OPS.paintImageMaskXObject, [imgData], optionalContent);
+        return;
+      }
+      const objId = `mask_${this.idFactory.createObjId()}`;
+      operatorList.addDependency(objId);
+      imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length;
+      this._sendImgData(objId, imgData);
+      fn = OPS.paintImageMaskXObject;
+      args = [{
+        data: objId,
+        width: imgData.width,
+        height: imgData.height,
+        interpolate: imgData.interpolate,
+        count: 1
+      }];
+      operatorList.addImageOps(fn, args, optionalContent);
+      if (cacheKey) {
+        const cacheData = {
+          objId,
+          fn,
+          args,
+          optionalContent
+        };
+        localImageCache.set(cacheKey, imageRef, cacheData);
+        if (imageRef) {
+          this._regionalImageCache.set(null, imageRef, cacheData);
+        }
+      }
+      return;
+    }
+    const SMALL_IMAGE_DIMENSIONS = 200;
+    const hasMask = dict.has("SMask") || dict.has("Mask");
+    if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !hasMask) {
+      try {
+        const imageObj = new PDFImage({
+          xref: this.xref,
+          res: resources,
+          image,
+          isInline,
+          pdfFunctionFactory: this._pdfFunctionFactory,
+          globalColorSpaceCache: this.globalColorSpaceCache,
+          localColorSpaceCache
+        });
+        imgData = await imageObj.createImageData(true, false);
+        operatorList.addImageOps(OPS.paintInlineImageXObject, [imgData], optionalContent);
+      } catch (reason) {
+        const msg = `Unable to decode inline image: "${reason}".`;
+        if (!ignoreErrors) {
+          throw new Error(msg);
+        }
+        warn(msg);
+      }
+      return;
+    }
+    let objId = `img_${this.idFactory.createObjId()}`,
+      cacheGlobally = false,
+      globalCacheData = null;
+    if (this.parsingType3Font) {
+      objId = `${this.idFactory.getDocId()}_type3_${objId}`;
+    } else if (cacheKey && imageRef) {
+      cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex);
+      if (cacheGlobally) {
+        assert(!isInline, "Cannot cache an inline image globally.");
+        objId = `${this.idFactory.getDocId()}_${objId}`;
+      }
+    }
+    operatorList.addDependency(objId);
+    fn = OPS.paintImageXObject;
+    args = [objId, w, h];
+    operatorList.addImageOps(fn, args, optionalContent, hasMask);
+    if (cacheGlobally) {
+      globalCacheData = {
+        objId,
+        fn,
+        args,
+        optionalContent,
+        hasMask,
+        byteSize: 0
+      };
+      if (this.globalImageCache.hasDecodeFailed(imageRef)) {
+        this.globalImageCache.setData(imageRef, globalCacheData);
+        this._sendImgData(objId, null, cacheGlobally);
+        return;
+      }
+      if (w * h > 250000 || hasMask) {
+        const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", {
+          imageRef
+        }]);
+        if (localLength) {
+          this.globalImageCache.setData(imageRef, globalCacheData);
+          this.globalImageCache.addByteSize(imageRef, localLength);
+          return;
+        }
+      }
+    }
+    PDFImage.buildImage({
+      xref: this.xref,
+      res: resources,
+      image,
+      isInline,
+      pdfFunctionFactory: this._pdfFunctionFactory,
+      globalColorSpaceCache: this.globalColorSpaceCache,
+      localColorSpaceCache
+    }).then(async imageObj => {
+      imgData = await imageObj.createImageData(false, isOffscreenCanvasSupported);
+      imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length;
+      imgData.ref = imageRef;
+      if (cacheGlobally) {
+        this.globalImageCache.addByteSize(imageRef, imgData.dataLen);
+      }
+      return this._sendImgData(objId, imgData, cacheGlobally);
+    }).catch(reason => {
+      warn(`Unable to decode image "${objId}": "${reason}".`);
+      if (imageRef) {
+        this.globalImageCache.addDecodeFailed(imageRef);
+      }
+      return this._sendImgData(objId, null, cacheGlobally);
+    });
+    if (cacheKey) {
+      const cacheData = {
+        objId,
+        fn,
+        args,
+        optionalContent,
+        hasMask
+      };
+      localImageCache.set(cacheKey, imageRef, cacheData);
+      if (imageRef) {
+        this._regionalImageCache.set(null, imageRef, cacheData);
+        if (cacheGlobally) {
+          assert(globalCacheData, "The global cache-data must be available.");
+          this.globalImageCache.setData(imageRef, globalCacheData);
+        }
+      }
+    }
+  }
+  handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache, seenRefs) {
+    const smaskContent = smask.get("G");
+    const smaskOptions = {
+      subtype: smask.get("S").name,
+      backdrop: smask.get("BC")
+    };
+    const transferObj = smask.get("TR");
+    if (isPDFFunction(transferObj)) {
+      const transferFn = this._pdfFunctionFactory.create(transferObj);
+      const transferMap = new Uint8Array(256);
+      const tmp = new Float32Array(1);
+      for (let i = 0; i < 256; i++) {
+        tmp[0] = i / 255;
+        transferFn(tmp, 0, tmp, 0);
+        transferMap[i] = tmp[0] * 255 | 0;
+      }
+      smaskOptions.transferMap = transferMap;
+    }
+    return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone({
+      newPath: true
+    }), localColorSpaceCache, seenRefs);
+  }
+  handleTransferFunction(tr) {
+    let transferArray;
+    if (Array.isArray(tr)) {
+      transferArray = tr;
+      if (tr.length > 1 && tr.every(map => map === tr[0])) {
+        transferArray = [tr[0]];
+      }
+    } else if (isPDFFunction(tr)) {
+      transferArray = [tr];
+    } else {
+      return null;
+    }
+    const transferMaps = [];
+    let numFns = 0,
+      numEffectfulFns = 0;
+    for (const entry of transferArray) {
+      const transferObj = this.xref.fetchIfRef(entry);
+      numFns++;
+      if (isName(transferObj, "Identity")) {
+        transferMaps.push(null);
+        continue;
+      } else if (!isPDFFunction(transferObj)) {
+        return null;
+      }
+      const transferFn = this._pdfFunctionFactory.create(transferObj);
+      const transferMap = new Uint8Array(256),
+        tmp = new Float32Array(1);
+      for (let j = 0; j < 256; j++) {
+        tmp[0] = j / 255;
+        transferFn(tmp, 0, tmp, 0);
+        transferMap[j] = tmp[0] * 255 | 0;
+      }
+      transferMaps.push(transferMap);
+      numEffectfulFns++;
+    }
+    if (!(numFns === 1 || numFns === 4)) {
+      return null;
+    }
+    if (numEffectfulFns === 0) {
+      return null;
+    }
+    return transferMaps;
+  }
+  handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache, seenRefs) {
+    const tilingOpList = new CheckedOperatorList();
+    const patternResources = Dict.merge({
+      xref: this.xref,
+      dictArray: [patternDict.get("Resources"), resources]
+    });
+    return this.getOperatorList({
+      stream: pattern,
+      task,
+      resources: patternResources,
+      operatorList: tilingOpList,
+      prevRefs: seenRefs
+    }).then(function () {
+      const operatorListIR = tilingOpList.getIR();
+      const {
+        needsIsolation
+      } = tilingOpList;
+      const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color, needsIsolation);
+      operatorList.addDependencies(tilingOpList.dependencies);
+      operatorList.addOp(fn, tilingPatternIR);
+      if (patternDict.objId) {
+        localTilingPatternCache.set(null, patternDict.objId, {
+          operatorListIR,
+          needsIsolation,
+          dict: patternDict
+        });
+      }
+    }).catch(reason => {
+      if (reason instanceof AbortException) {
+        return;
+      }
+      if (this.options.ignoreErrors) {
+        warn(`handleTilingType - ignoring pattern: "${reason}".`);
+        return;
+      }
+      throw reason;
+    });
+  }
+  async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null, seenRefs = null) {
+    const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null;
+    const translated = await this.loadFont(fontName, fontRef, resources, task, fallbackFontDict, cssFontInfo, seenRefs);
+    if (translated.font.isType3Font) {
+      operatorList.addDependencies(translated.type3Dependencies);
+    }
+    state.font = translated.font;
+    translated.send(this.handler);
+    return translated.loadedName;
+  }
+  handleText(chars, state) {
+    const font = state.font;
+    const glyphs = font.charsToGlyphs(chars);
+    if (font.data) {
+      const isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG);
+      if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || state.strokeColorSpace.name === "Pattern" || font.disableFontFace) {
+        PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options);
+      }
+    }
+    return glyphs;
+  }
+  ensureStateFont(state) {
+    if (state.font) {
+      return;
+    }
+    const reason = new FormatError("Missing setFont (Tf) operator before text rendering operator.");
+    if (this.options.ignoreErrors) {
+      warn(`ensureStateFont: "${reason}".`);
+      return;
+    }
+    throw reason;
+  }
+  async setGState({
+    resources,
+    gState,
+    operatorList,
+    cacheKey,
+    task,
+    stateManager,
+    localGStateCache,
+    localColorSpaceCache,
+    seenRefs
+  }) {
+    const gStateRef = gState.objId;
+    let isSimpleGState = true;
+    const gStateObj = [];
+    let promise = Promise.resolve();
+    for (const [key, value] of gState) {
+      switch (key) {
+        case "Type":
+          break;
+        case "LW":
+          if (typeof value !== "number") {
+            warn(`Invalid LW (line width): ${value}`);
+            break;
+          }
+          gStateObj.push([key, Math.abs(value)]);
+          break;
+        case "LC":
+        case "LJ":
+        case "ML":
+        case "D":
+        case "RI":
+        case "FL":
+        case "CA":
+        case "ca":
+          gStateObj.push([key, value]);
+          break;
+        case "Font":
+          isSimpleGState = false;
+          promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state, null, null, seenRefs).then(function (loadedName) {
+            operatorList.addDependency(loadedName);
+            gStateObj.push([key, [loadedName, value[1]]]);
+          }));
+          break;
+        case "BM":
+          gStateObj.push([key, normalizeBlendMode(value)]);
+          break;
+        case "SMask":
+          if (isName(value, "None")) {
+            gStateObj.push([key, false]);
+            break;
+          }
+          if (value instanceof Dict) {
+            isSimpleGState = false;
+            promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache, seenRefs));
+            gStateObj.push([key, true]);
+          } else {
+            warn("Unsupported SMask type");
+          }
+          break;
+        case "TR":
+        case "TR2":
+          {
+            if (key === "TR" && gState.has("TR2")) {
+              break;
+            }
+            const transferMaps = this.handleTransferFunction(value);
+            gStateObj.push(["TR", transferMaps]);
+            break;
+          }
+        case "OP":
+        case "op":
+        case "OPM":
+        case "BG":
+        case "BG2":
+        case "UCR":
+        case "UCR2":
+        case "HT":
+        case "SM":
+        case "SA":
+        case "AIS":
+        case "TK":
+          info("graphic state operator " + key);
+          break;
+        default:
+          info("Unknown graphic state operator " + key);
+          break;
+      }
+    }
+    await promise;
+    if (gStateObj.length > 0) {
+      operatorList.addOp(OPS.setGState, [gStateObj]);
+    }
+    if (isSimpleGState) {
+      localGStateCache.set(cacheKey, gStateRef, gStateObj);
+    }
+  }
+  loadFont(fontName, font, resources, task, fallbackFontDict = null, cssFontInfo = null, seenRefs = null) {
+    const errorFont = async () => new TranslatedFont({
+      loadedName: "g_font_error",
+      font: new ErrorFont(`Font "${fontName}" is not available.`),
+      dict: font
+    });
+    let fontRef;
+    if (font) {
+      if (font instanceof Ref) {
+        fontRef = font;
+      }
+    } else {
+      const fontRes = resources.get("Font");
+      if (fontRes) {
+        fontRef = fontRes.getRaw(fontName);
+      }
+    }
+    if (fontRef) {
+      if (this.type3FontRefs?.has(fontRef)) {
+        return errorFont();
+      }
+      if (this.fontCache.has(fontRef)) {
+        return this.fontCache.get(fontRef);
+      }
+      try {
+        font = this.xref.fetchIfRef(fontRef);
+      } catch (ex) {
+        warn(`loadFont - lookup failed: "${ex}".`);
+      }
+    }
+    if (!(font instanceof Dict)) {
+      if (!this.options.ignoreErrors && !this.parsingType3Font) {
+        warn(`Font "${fontName}" is not available.`);
+        return errorFont();
+      }
+      warn(`Font "${fontName}" is not available -- attempting to fallback to a default font.`);
+      font = fallbackFontDict || PartialEvaluator.fallbackFontDict;
+    }
+    if (font.cacheKey && this.fontCache.has(font.cacheKey)) {
+      return this.fontCache.get(font.cacheKey);
+    }
+    const {
+      promise,
+      resolve
+    } = Promise.withResolvers();
+    let preEvaluatedFont;
+    try {
+      preEvaluatedFont = this.preEvaluateFont(font);
+      preEvaluatedFont.cssFontInfo = cssFontInfo;
+    } catch (reason) {
+      warn(`loadFont - preEvaluateFont failed: "${reason}".`);
+      return errorFont();
+    }
+    const {
+      descriptor,
+      hash
+    } = preEvaluatedFont;
+    const fontRefIsRef = fontRef instanceof Ref;
+    let fontID;
+    if (hash && descriptor instanceof Dict) {
+      const fontAliases = descriptor.fontAliases ||= Object.create(null);
+      if (fontAliases[hash]) {
+        const aliasFontRef = fontAliases[hash].aliasRef;
+        if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {
+          this.fontCache.putAlias(fontRef, aliasFontRef);
+          return this.fontCache.get(fontRef);
+        }
+      } else {
+        fontAliases[hash] = {
+          fontID: this.idFactory.createFontId()
+        };
+      }
+      if (fontRefIsRef) {
+        fontAliases[hash].aliasRef = fontRef;
+      }
+      fontID = fontAliases[hash].fontID;
+    } else {
+      fontID = this.idFactory.createFontId();
+    }
+    assert(fontID?.startsWith("f"), 'The "fontID" must be (correctly) defined.');
+    if (fontRefIsRef) {
+      this.fontCache.put(fontRef, promise);
+    } else {
+      font.cacheKey = `cacheKey_${fontID}`;
+      this.fontCache.put(font.cacheKey, promise);
+    }
+    font.loadedName = `${this.idFactory.getDocId()}_${fontID}`;
+    this.translateFont(preEvaluatedFont).then(async translatedFont => {
+      const translated = new TranslatedFont({
+        loadedName: font.loadedName,
+        font: translatedFont,
+        dict: font
+      });
+      if (translatedFont.isType3Font) {
+        try {
+          await translated.loadType3Data(this, resources, task, seenRefs);
+        } catch (reason) {
+          throw new Error(`Type3 font load error: ${reason}`);
+        }
+      }
+      resolve(translated);
+    }).catch(reason => {
+      warn(`loadFont - translateFont failed: "${reason}".`);
+      resolve(new TranslatedFont({
+        loadedName: font.loadedName,
+        font: new ErrorFont(reason?.message),
+        dict: font
+      }));
+    });
+    return promise;
+  }
+  buildPath(fn, args, state) {
+    const {
+      pathMinMax: minMax,
+      pathBuffer
+    } = state;
+    switch (fn | 0) {
+      case OPS.rectangle:
+        {
+          const x = state.currentPointX = args[0];
+          const y = state.currentPointY = args[1];
+          const width = args[2];
+          const height = args[3];
+          const xw = x + width;
+          const yh = y + height;
+          if (width === 0 || height === 0) {
+            pathBuffer.push(DrawOPS.moveTo, x, y, DrawOPS.lineTo, xw, yh, DrawOPS.closePath);
+          } else {
+            pathBuffer.push(DrawOPS.moveTo, x, y, DrawOPS.lineTo, xw, y, DrawOPS.lineTo, xw, yh, DrawOPS.lineTo, x, yh, DrawOPS.closePath);
+          }
+          Util.rectBoundingBox(x, y, xw, yh, minMax);
+          break;
+        }
+      case OPS.moveTo:
+        {
+          const x = state.currentPointX = args[0];
+          const y = state.currentPointY = args[1];
+          pathBuffer.push(DrawOPS.moveTo, x, y);
+          Util.pointBoundingBox(x, y, minMax);
+          break;
+        }
+      case OPS.lineTo:
+        {
+          const x = state.currentPointX = args[0];
+          const y = state.currentPointY = args[1];
+          pathBuffer.push(DrawOPS.lineTo, x, y);
+          Util.pointBoundingBox(x, y, minMax);
+          break;
+        }
+      case OPS.curveTo:
+        {
+          const startX = state.currentPointX;
+          const startY = state.currentPointY;
+          const [x1, y1, x2, y2, x, y] = args;
+          state.currentPointX = x;
+          state.currentPointY = y;
+          pathBuffer.push(DrawOPS.curveTo, x1, y1, x2, y2, x, y);
+          Util.bezierBoundingBox(startX, startY, x1, y1, x2, y2, x, y, minMax);
+          break;
+        }
+      case OPS.curveTo2:
+        {
+          const startX = state.currentPointX;
+          const startY = state.currentPointY;
+          const [x1, y1, x, y] = args;
+          state.currentPointX = x;
+          state.currentPointY = y;
+          pathBuffer.push(DrawOPS.curveTo, startX, startY, x1, y1, x, y);
+          Util.bezierBoundingBox(startX, startY, startX, startY, x1, y1, x, y, minMax);
+          break;
+        }
+      case OPS.curveTo3:
+        {
+          const startX = state.currentPointX;
+          const startY = state.currentPointY;
+          const [x1, y1, x, y] = args;
+          state.currentPointX = x;
+          state.currentPointY = y;
+          pathBuffer.push(DrawOPS.curveTo, x1, y1, x, y, x, y);
+          Util.bezierBoundingBox(startX, startY, x1, y1, x, y, x, y, minMax);
+          break;
+        }
+      case OPS.closePath:
+        pathBuffer.push(DrawOPS.closePath);
+        break;
+    }
+  }
+  _getColorSpace(cs, resources, localColorSpaceCache) {
+    return ColorSpaceUtils.parse({
+      cs,
+      xref: this.xref,
+      resources,
+      pdfFunctionFactory: this._pdfFunctionFactory,
+      globalColorSpaceCache: this.globalColorSpaceCache,
+      localColorSpaceCache,
+      asyncIfNotCached: true
+    });
+  }
+  async _handleColorSpace(csPromise) {
+    try {
+      return await csPromise;
+    } catch (ex) {
+      if (ex instanceof AbortException) {
+        return null;
+      }
+      if (this.options.ignoreErrors) {
+        warn(`_handleColorSpace - ignoring ColorSpace: "${ex}".`);
+        return null;
+      }
+      throw ex;
+    }
+  }
+  parseShading({
+    shading,
+    resources,
+    localColorSpaceCache,
+    localShadingPatternCache
+  }) {
+    let id = localShadingPatternCache.get(shading);
+    if (id) {
+      return id;
+    }
+    let patternIR;
+    try {
+      const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, this.globalColorSpaceCache, localColorSpaceCache);
+      patternIR = shadingFill.getIR();
+    } catch (reason) {
+      if (reason instanceof AbortException) {
+        return null;
+      }
+      if (this.options.ignoreErrors) {
+        warn(`parseShading - ignoring shading: "${reason}".`);
+        localShadingPatternCache.set(shading, null);
+        return null;
+      }
+      throw reason;
+    }
+    id = `pattern_${this.idFactory.createObjId()}`;
+    if (this.parsingType3Font) {
+      id = `${this.idFactory.getDocId()}_type3_${id}`;
+    }
+    localShadingPatternCache.set(shading, id);
+    if (this.parsingType3Font) {
+      const buffer = compilePatternInfo(patternIR);
+      this.handler.send("commonobj", [id, "Pattern", buffer], [buffer]);
+    } else {
+      this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]);
+    }
+    return id;
+  }
+  handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs) {
+    const patternName = args.pop();
+    if (patternName instanceof Name) {
+      const rawPattern = patterns.getRaw(patternName.name);
+      const localTilingPattern = rawPattern instanceof Ref && localTilingPatternCache.getByRef(rawPattern);
+      if (localTilingPattern) {
+        try {
+          const color = cs.base ? cs.base.getRgbHex(args, 0) : null;
+          const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color, localTilingPattern.needsIsolation);
+          operatorList.addOp(fn, tilingPatternIR);
+          return undefined;
+        } catch {}
+      }
+      const pattern = this.xref.fetchIfRef(rawPattern);
+      if (pattern) {
+        const dict = pattern instanceof BaseStream ? pattern.dict : pattern;
+        const typeNum = dict.get("PatternType");
+        if (typeNum === PatternType.TILING) {
+          const color = cs.base ? cs.base.getRgbHex(args, 0) : null;
+          return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache, seenRefs);
+        } else if (typeNum === PatternType.SHADING) {
+          const shading = dict.get("Shading");
+          const objId = this.parseShading({
+            shading,
+            resources,
+            localColorSpaceCache,
+            localShadingPatternCache
+          });
+          if (objId) {
+            const matrix = lookupMatrix(dict.getArray("Matrix"), null);
+            operatorList.addOp(fn, ["Shading", objId, matrix]);
+          }
+          return undefined;
+        }
+        throw new FormatError(`Unknown PatternType: ${typeNum}`);
+      }
+    }
+    throw new FormatError(`Unknown PatternName: ${patternName}`);
+  }
+  async parseMarkedContentProps(contentProperties, resources) {
+    return parseMarkedContentProps(this.xref, contentProperties, resources);
+  }
+  async getOperatorList({
+    stream,
+    task,
+    resources,
+    operatorList,
+    initialState = null,
+    fallbackFontDict = null,
+    prevRefs = null
+  }) {
+    if (stream.isAsync) {
+      const bytes = await stream.asyncGetBytes();
+      if (bytes) {
+        stream = new Stream(bytes, 0, bytes.length, stream.dict);
+      }
+    }
+    const objId = stream.dict?.objId;
+    const seenRefs = new RefSet(prevRefs);
+    if (objId) {
+      if (prevRefs?.has(objId)) {
+        throw new Error(`getOperatorList - ignoring circular reference: ${objId}`);
+      }
+      seenRefs.put(objId);
+    }
+    resources ||= Dict.empty;
+    initialState ||= new EvalState();
+    if (!operatorList) {
+      throw new Error('getOperatorList: missing "operatorList" parameter');
+    }
+    const self = this;
+    const xref = this.xref;
+    const localImageCache = new LocalImageCache();
+    const localColorSpaceCache = new LocalColorSpaceCache();
+    const localGStateCache = new LocalGStateCache();
+    const localTilingPatternCache = new LocalTilingPatternCache();
+    const localShadingPatternCache = new Map();
+    const xobjs = resources.get("XObject") || Dict.empty;
+    const patterns = resources.get("Pattern") || Dict.empty;
+    const stateManager = new StateManager(initialState);
+    const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+    const timeSlotManager = new TimeSlotManager();
+    function closePendingRestoreOPS(argument) {
+      for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
+        operatorList.addOp(OPS.restore, []);
+      }
+    }
+    return new Promise(function promiseBody(resolve, reject) {
+      const next = function (promise) {
+        Promise.all([promise, operatorList.ready]).then(function () {
+          try {
+            promiseBody(resolve, reject);
+          } catch (ex) {
+            reject(ex);
+          }
+        }, reject);
+      };
+      task.ensureNotTerminated();
+      timeSlotManager.reset();
+      const operation = {};
+      let stop, i, ii, cs, name, isValidName;
+      while (!(stop = timeSlotManager.check())) {
+        operation.args = null;
+        if (!preprocessor.read(operation)) {
+          break;
+        }
+        let args = operation.args;
+        let fn = operation.fn;
+        switch (fn | 0) {
+          case OPS.paintXObject:
+            isValidName = args[0] instanceof Name;
+            name = args[0].name;
+            if (isValidName) {
+              const localImage = localImageCache.getByName(name);
+              if (localImage) {
+                addCachedImageOps(operatorList, localImage);
+                args = null;
+                continue;
+              }
+            }
+            next(new Promise(function (resolveXObject, rejectXObject) {
+              if (!isValidName) {
+                throw new FormatError("XObject must be referred to by name.");
+              }
+              let xobj = xobjs.getRaw(name);
+              if (xobj instanceof Ref) {
+                const cachedImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj) || self.globalImageCache.getData(xobj, self.pageIndex);
+                if (cachedImage) {
+                  addCachedImageOps(operatorList, cachedImage);
+                  resolveXObject();
+                  return;
+                }
+                xobj = xref.fetch(xobj);
+              }
+              if (!(xobj instanceof BaseStream)) {
+                throw new FormatError("XObject should be a stream");
+              }
+              const type = xobj.dict.get("Subtype");
+              if (!(type instanceof Name)) {
+                throw new FormatError("XObject should have a Name subtype");
+              }
+              if (type.name === "Form") {
+                stateManager.save();
+                self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone({
+                  newPath: true
+                }), localColorSpaceCache, seenRefs).then(function () {
+                  stateManager.restore();
+                  resolveXObject();
+                }, rejectXObject);
+                return;
+              } else if (type.name === "Image") {
+                self.buildPaintImageXObject({
+                  resources,
+                  image: xobj,
+                  operatorList,
+                  cacheKey: name,
+                  localImageCache,
+                  localColorSpaceCache
+                }).then(resolveXObject, rejectXObject);
+                return;
+              } else if (type.name === "PS") {
+                info("Ignored XObject subtype PS");
+              } else {
+                throw new FormatError(`Unhandled XObject subtype ${type.name}`);
+              }
+              resolveXObject();
+            }).catch(function (reason) {
+              if (reason instanceof AbortException) {
+                return;
+              }
+              if (self.options.ignoreErrors) {
+                warn(`getOperatorList - ignoring XObject: "${reason}".`);
+                return;
+              }
+              throw reason;
+            }));
+            return;
+          case OPS.setFont:
+            const fontSize = args[1];
+            next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict, null, seenRefs).then(function (loadedName) {
+              operatorList.addDependency(loadedName);
+              operatorList.addOp(OPS.setFont, [loadedName, fontSize]);
+            }));
+            return;
+          case OPS.endInlineImage:
+            const cacheKey = args[0].cacheKey;
+            if (cacheKey) {
+              const localImage = localImageCache.getByName(cacheKey);
+              if (localImage) {
+                addCachedImageOps(operatorList, localImage);
+                args = null;
+                continue;
+              }
+            }
+            next(self.buildPaintImageXObject({
+              resources,
+              image: args[0],
+              isInline: true,
+              operatorList,
+              cacheKey,
+              localImageCache,
+              localColorSpaceCache
+            }));
+            return;
+          case OPS.showText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
+            args[0] = self.handleText(args[0], stateManager.state);
+            break;
+          case OPS.showSpacedText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
+            const combinedGlyphs = [],
+              state = stateManager.state;
+            for (const arrItem of args[0]) {
+              if (typeof arrItem === "string") {
+                combinedGlyphs.push(...self.handleText(arrItem, state));
+              } else if (typeof arrItem === "number") {
+                combinedGlyphs.push(arrItem);
+              }
+            }
+            args[0] = combinedGlyphs;
+            fn = OPS.showText;
+            break;
+          case OPS.nextLineShowText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
+            operatorList.addOp(OPS.nextLine);
+            args[0] = self.handleText(args[0], stateManager.state);
+            fn = OPS.showText;
+            break;
+          case OPS.nextLineSetSpacingShowText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
+            operatorList.addOp(OPS.nextLine);
+            operatorList.addOp(OPS.setWordSpacing, [args.shift()]);
+            operatorList.addOp(OPS.setCharSpacing, [args.shift()]);
+            args[0] = self.handleText(args[0], stateManager.state);
+            fn = OPS.showText;
+            break;
+          case OPS.setTextRenderingMode:
+            stateManager.state.textRenderingMode = args[0];
+            break;
+          case OPS.setFillColorSpace:
+            {
+              const fillCS = self._getColorSpace(args[0], resources, localColorSpaceCache);
+              if (fillCS instanceof ColorSpace) {
+                stateManager.state.fillColorSpace = fillCS;
+                continue;
+              }
+              next(self._handleColorSpace(fillCS).then(colorSpace => {
+                stateManager.state.fillColorSpace = colorSpace || ColorSpaceUtils.gray;
+              }));
+              return;
+            }
+          case OPS.setStrokeColorSpace:
+            {
+              const strokeCS = self._getColorSpace(args[0], resources, localColorSpaceCache);
+              if (strokeCS instanceof ColorSpace) {
+                stateManager.state.strokeColorSpace = strokeCS;
+                continue;
+              }
+              next(self._handleColorSpace(strokeCS).then(colorSpace => {
+                stateManager.state.strokeColorSpace = colorSpace || ColorSpaceUtils.gray;
+              }));
+              return;
+            }
+          case OPS.setFillColor:
+            cs = stateManager.state.fillColorSpace;
+            args = [cs.getRgbHex(args, 0)];
+            fn = OPS.setFillRGBColor;
+            break;
+          case OPS.setStrokeColor:
+            cs = stateManager.state.strokeColorSpace;
+            args = [cs.getRgbHex(args, 0)];
+            fn = OPS.setStrokeRGBColor;
+            break;
+          case OPS.setFillGray:
+            stateManager.state.fillColorSpace = ColorSpaceUtils.gray;
+            args = [ColorSpaceUtils.gray.getRgbHex(args, 0)];
+            fn = OPS.setFillRGBColor;
+            break;
+          case OPS.setStrokeGray:
+            stateManager.state.strokeColorSpace = ColorSpaceUtils.gray;
+            args = [ColorSpaceUtils.gray.getRgbHex(args, 0)];
+            fn = OPS.setStrokeRGBColor;
+            break;
+          case OPS.setFillCMYKColor:
+            stateManager.state.fillColorSpace = ColorSpaceUtils.cmyk;
+            args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)];
+            fn = OPS.setFillRGBColor;
+            break;
+          case OPS.setStrokeCMYKColor:
+            stateManager.state.strokeColorSpace = ColorSpaceUtils.cmyk;
+            args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)];
+            fn = OPS.setStrokeRGBColor;
+            break;
+          case OPS.setFillRGBColor:
+            stateManager.state.fillColorSpace = ColorSpaceUtils.rgb;
+            args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)];
+            break;
+          case OPS.setStrokeRGBColor:
+            stateManager.state.strokeColorSpace = ColorSpaceUtils.rgb;
+            args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)];
+            break;
+          case OPS.setFillColorN:
+            cs = stateManager.state.patternFillColorSpace;
+            if (!cs) {
+              if (isNumberArray(args, null)) {
+                args = [ColorSpaceUtils.gray.getRgbHex(args, 0)];
+                fn = OPS.setFillRGBColor;
+                break;
+              }
+              args = [];
+              fn = OPS.setFillTransparent;
+              break;
+            }
+            if (cs.name === "Pattern") {
+              next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs));
+              return;
+            }
+            args = [cs.getRgbHex(args, 0)];
+            fn = OPS.setFillRGBColor;
+            break;
+          case OPS.setStrokeColorN:
+            cs = stateManager.state.patternStrokeColorSpace;
+            if (!cs) {
+              if (isNumberArray(args, null)) {
+                args = [ColorSpaceUtils.gray.getRgbHex(args, 0)];
+                fn = OPS.setStrokeRGBColor;
+                break;
+              }
+              args = [];
+              fn = OPS.setStrokeTransparent;
+              break;
+            }
+            if (cs.name === "Pattern") {
+              next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs));
+              return;
+            }
+            args = [cs.getRgbHex(args, 0)];
+            fn = OPS.setStrokeRGBColor;
+            break;
+          case OPS.shadingFill:
+            let shading;
+            try {
+              const shadingRes = resources.get("Shading");
+              if (!shadingRes) {
+                throw new FormatError("No shading resource found");
+              }
+              shading = shadingRes.get(args[0].name);
+              if (!shading) {
+                throw new FormatError("No shading object found");
+              }
+            } catch (reason) {
+              if (reason instanceof AbortException) {
+                continue;
+              }
+              if (self.options.ignoreErrors) {
+                warn(`getOperatorList - ignoring Shading: "${reason}".`);
+                continue;
+              }
+              throw reason;
+            }
+            const patternId = self.parseShading({
+              shading,
+              resources,
+              localColorSpaceCache,
+              localShadingPatternCache
+            });
+            if (!patternId) {
+              continue;
+            }
+            args = [patternId];
+            fn = OPS.shadingFill;
+            break;
+          case OPS.setGState:
+            isValidName = args[0] instanceof Name;
+            name = args[0].name;
+            if (isValidName) {
+              const localGStateObj = localGStateCache.getByName(name);
+              if (localGStateObj) {
+                if (localGStateObj.length > 0) {
+                  operatorList.addOp(OPS.setGState, [localGStateObj]);
+                }
+                args = null;
+                continue;
+              }
+            }
+            next(new Promise(function (resolveGState, rejectGState) {
+              if (!isValidName) {
+                throw new FormatError("GState must be referred to by name.");
+              }
+              const extGState = resources.get("ExtGState");
+              if (!(extGState instanceof Dict)) {
+                throw new FormatError("ExtGState should be a dictionary.");
+              }
+              const gState = extGState.get(name);
+              if (!(gState instanceof Dict)) {
+                throw new FormatError("GState should be a dictionary.");
+              }
+              self.setGState({
+                resources,
+                gState,
+                operatorList,
+                cacheKey: name,
+                task,
+                stateManager,
+                localGStateCache,
+                localColorSpaceCache,
+                seenRefs
+              }).then(resolveGState, rejectGState);
+            }).catch(function (reason) {
+              if (reason instanceof AbortException) {
+                return;
+              }
+              if (self.options.ignoreErrors) {
+                warn(`getOperatorList - ignoring ExtGState: "${reason}".`);
+                return;
+              }
+              throw reason;
+            }));
+            return;
+          case OPS.setLineWidth:
+            {
+              const [thickness] = args;
+              if (typeof thickness !== "number") {
+                warn(`Invalid setLineWidth: ${thickness}`);
+                continue;
+              }
+              args[0] = Math.abs(thickness);
+              break;
+            }
+          case OPS.setDash:
+            {
+              const dashPhase = args[1];
+              if (typeof dashPhase !== "number") {
+                warn(`Invalid setDash: ${dashPhase}`);
+                continue;
+              }
+              const dashArray = args[0];
+              if (!Array.isArray(dashArray)) {
+                warn(`Invalid setDash: ${dashArray}`);
+                continue;
+              }
+              if (dashArray.some(x => typeof x !== "number")) {
+                args[0] = dashArray.filter(x => typeof x === "number");
+              }
+              break;
+            }
+          case OPS.moveTo:
+          case OPS.lineTo:
+          case OPS.curveTo:
+          case OPS.curveTo2:
+          case OPS.curveTo3:
+          case OPS.closePath:
+          case OPS.rectangle:
+            self.buildPath(fn, args, stateManager.state);
+            continue;
+          case OPS.stroke:
+          case OPS.closeStroke:
+          case OPS.fill:
+          case OPS.eoFill:
+          case OPS.fillStroke:
+          case OPS.eoFillStroke:
+          case OPS.closeFillStroke:
+          case OPS.closeEOFillStroke:
+          case OPS.endPath:
+            {
+              const {
+                state: {
+                  pathBuffer,
+                  pathMinMax
+                }
+              } = stateManager;
+              if (fn === OPS.closeStroke || fn === OPS.closeFillStroke || fn === OPS.closeEOFillStroke) {
+                pathBuffer.push(DrawOPS.closePath);
+              }
+              if (pathBuffer.length === 0) {
+                operatorList.addOp(OPS.constructPath, [fn, [null], null]);
+              } else {
+                operatorList.addOp(OPS.constructPath, [fn, [new Float32Array(pathBuffer)], pathMinMax.slice()]);
+                pathBuffer.length = 0;
+                pathMinMax.set(BBOX_INIT, 0);
+              }
+              continue;
+            }
+          case OPS.setTextMatrix:
+            operatorList.addOp(fn, [new Float32Array(args)]);
+            continue;
+          case OPS.markPoint:
+          case OPS.markPointProps:
+          case OPS.beginCompat:
+          case OPS.endCompat:
+            continue;
+          case OPS.beginMarkedContentProps:
+            if (!(args[0] instanceof Name)) {
+              warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`);
+              operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]);
+              continue;
+            }
+            if (args[0].name === "OC") {
+              next(self.parseMarkedContentProps(args[1], resources).then(data => {
+                operatorList.addOp(OPS.beginMarkedContentProps, ["OC", data]);
+              }).catch(reason => {
+                if (reason instanceof AbortException) {
+                  return;
+                }
+                if (self.options.ignoreErrors) {
+                  warn(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`);
+                  operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]);
+                  return;
+                }
+                throw reason;
+              }));
+              return;
+            }
+            args = [args[0].name, args[1] instanceof Dict ? args[1].get("MCID") : null];
+            break;
+          case OPS.beginMarkedContent:
+          case OPS.endMarkedContent:
+          default:
+            if (args !== null) {
+              for (i = 0, ii = args.length; i < ii; i++) {
+                if (args[i] instanceof Dict) {
+                  break;
+                }
+              }
+              if (i < ii) {
+                warn("getOperatorList - ignoring operator: " + fn);
+                continue;
+              }
+            }
+        }
+        operatorList.addOp(fn, args);
+      }
+      if (stop) {
+        next(deferred);
+        return;
+      }
+      closePendingRestoreOPS();
+      resolve();
+    }).catch(reason => {
+      if (reason instanceof AbortException) {
+        return;
+      }
+      if (this.options.ignoreErrors) {
+        warn(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`);
+        closePendingRestoreOPS();
+        return;
+      }
+      throw reason;
+    });
+  }
+  async getTextContent({
+    stream,
+    task,
+    resources,
+    stateManager = null,
+    includeMarkedContent = false,
+    sink,
+    seenStyles = new Set(),
+    viewBox,
+    lang = null,
+    markedContentData = null,
+    disableNormalization = false,
+    keepWhiteSpace = false,
+    prevRefs = null,
+    intersector = null
+  }) {
+    if (stream.isAsync) {
+      const bytes = await stream.asyncGetBytes();
+      if (bytes) {
+        stream = new Stream(bytes, 0, bytes.length, stream.dict);
+      }
+    }
+    sink ??= textSinkWrapper(null);
+    const objId = stream.dict?.objId;
+    const seenRefs = new RefSet(prevRefs);
+    if (objId) {
+      if (prevRefs?.has(objId)) {
+        throw new Error(`getTextContent - ignoring circular reference: ${objId}`);
+      }
+      seenRefs.put(objId);
+    }
+    resources ||= Dict.empty;
+    stateManager ||= new StateManager(new TextState());
+    if (includeMarkedContent) {
+      markedContentData ||= {
+        level: 0
+      };
+    }
+    const textContent = {
+      items: [],
+      styles: Object.create(null),
+      lang
+    };
+    const textContentItem = {
+      initialized: false,
+      str: [],
+      totalWidth: 0,
+      totalHeight: 0,
+      width: 0,
+      height: 0,
+      vertical: false,
+      prevTransform: null,
+      prevTextRise: 0,
+      textAdvanceScale: 0,
+      spaceInFlowMin: 0,
+      spaceInFlowMax: 0,
+      trackingSpaceMin: Infinity,
+      negativeSpaceMax: -Infinity,
+      notASpace: -Infinity,
+      transform: null,
+      fontName: null,
+      hasEOL: false
+    };
+    const twoLastChars = [" ", " "];
+    let twoLastCharsPos = 0;
+    function saveLastChar(char) {
+      const nextPos = (twoLastCharsPos + 1) % 2;
+      const ret = twoLastChars[twoLastCharsPos] !== " " && twoLastChars[nextPos] === " ";
+      twoLastChars[twoLastCharsPos] = char;
+      twoLastCharsPos = nextPos;
+      return !keepWhiteSpace && ret;
+    }
+    function shouldAddWhitepsace() {
+      return !keepWhiteSpace && twoLastChars[twoLastCharsPos] !== " " && twoLastChars[(twoLastCharsPos + 1) % 2] === " ";
+    }
+    function resetLastChars() {
+      twoLastChars[0] = twoLastChars[1] = " ";
+      twoLastCharsPos = 0;
+    }
+    const TRACKING_SPACE_FACTOR = 0.102;
+    const NOT_A_SPACE_FACTOR = 0.03;
+    const NEGATIVE_SPACE_FACTOR = -0.2;
+    const SPACE_IN_FLOW_MIN_FACTOR = 0.102;
+    const SPACE_IN_FLOW_MAX_FACTOR = 0.6;
+    const VERTICAL_SHIFT_RATIO = 0.25;
+    const self = this;
+    const xref = this.xref;
+    const showSpacedTextBuffer = [];
+    let xobjs = null;
+    const emptyXObjectCache = new LocalImageCache();
+    const emptyGStateCache = new LocalGStateCache();
+    const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+    let textState, currentTextState;
+    function pushWhitespace({
+      width = 0,
+      height = 0,
+      transform = textContentItem.prevTransform,
+      fontName = textContentItem.fontName
+    }) {
+      intersector?.addExtraChar(" ");
+      textContent.items.push({
+        str: " ",
+        dir: "ltr",
+        width,
+        height,
+        transform,
+        fontName,
+        hasEOL: false
+      });
+    }
+    function getCurrentTextTransform() {
+      const font = textState.font;
+      const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise];
+      if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX)) {
+        const glyphHeight = font.bbox[3] - font.bbox[1];
+        if (glyphHeight > 0) {
+          tsm[3] *= glyphHeight * textState.fontMatrix[3];
+        }
+      }
+      return Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm));
+    }
+    function ensureTextContentItem() {
+      if (textContentItem.initialized) {
+        return textContentItem;
+      }
+      const {
+        font,
+        loadedName
+      } = textState;
+      if (!seenStyles.has(loadedName)) {
+        seenStyles.add(loadedName);
+        textContent.styles[loadedName] = {
+          fontFamily: font.fallbackName,
+          ascent: font.ascent,
+          descent: font.descent,
+          vertical: font.vertical
+        };
+        if (self.options.fontExtraProperties && font.systemFontInfo) {
+          const style = textContent.styles[loadedName];
+          style.fontSubstitution = font.systemFontInfo.css;
+          style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName;
+        }
+      }
+      textContentItem.fontName = loadedName;
+      const trm = textContentItem.transform = getCurrentTextTransform();
+      if (!font.vertical) {
+        textContentItem.width = textContentItem.totalWidth = 0;
+        textContentItem.height = textContentItem.totalHeight = Math.hypot(trm[2], trm[3]);
+        textContentItem.vertical = false;
+      } else {
+        textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]);
+        textContentItem.height = textContentItem.totalHeight = 0;
+        textContentItem.vertical = true;
+      }
+      const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]);
+      const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);
+      textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;
+      const {
+        fontSize
+      } = textState;
+      textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR;
+      textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR;
+      textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR;
+      textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR;
+      textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR;
+      textContentItem.hasEOL = false;
+      textContentItem.initialized = true;
+      return textContentItem;
+    }
+    function updateAdvanceScale() {
+      if (!textContentItem.initialized) {
+        return;
+      }
+      const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]);
+      const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);
+      const scaleFactor = scaleCtmX * scaleLineX;
+      if (scaleFactor === textContentItem.textAdvanceScale) {
+        return;
+      }
+      if (!textContentItem.vertical) {
+        textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale;
+        textContentItem.width = 0;
+      } else {
+        textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale;
+        textContentItem.height = 0;
+      }
+      textContentItem.textAdvanceScale = scaleFactor;
+    }
+    function runBidiTransform(textChunk) {
+      let text = textChunk.str.join("");
+      if (!disableNormalization) {
+        text = normalizeUnicode(text);
+      }
+      const bidiResult = bidi(text, -1, textChunk.vertical);
+      return {
+        str: bidiResult.str,
+        dir: bidiResult.dir,
+        width: Math.abs(textChunk.totalWidth),
+        height: Math.abs(textChunk.totalHeight),
+        transform: textChunk.transform,
+        fontName: textChunk.fontName,
+        hasEOL: textChunk.hasEOL
+      };
+    }
+    async function handleSetFont(fontName, fontRef) {
+      const translated = await self.loadFont(fontName, fontRef, resources, task, null, null, seenRefs);
+      textState.loadedName = translated.loadedName;
+      textState.font = translated.font;
+      textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX;
+    }
+    function applyInverseRotation(x, y, matrix) {
+      const scale = Math.hypot(matrix[0], matrix[1]);
+      return [(matrix[0] * x + matrix[1] * y) / scale, (matrix[2] * x + matrix[3] * y) / scale];
+    }
+    function compareWithLastPosition(glyphWidth) {
+      const currentTransform = getCurrentTextTransform();
+      let posX = currentTransform[4];
+      let posY = currentTransform[5];
+      if (textState.font?.vertical) {
+        if (posX < viewBox[0] || posX > viewBox[2] || posY + glyphWidth < viewBox[1] || posY > viewBox[3]) {
+          return false;
+        }
+      } else if (posX + glyphWidth < viewBox[0] || posX > viewBox[2] || posY < viewBox[1] || posY > viewBox[3]) {
+        return false;
+      }
+      if (!textState.font || !textContentItem.prevTransform) {
+        return true;
+      }
+      let lastPosX = textContentItem.prevTransform[4];
+      let lastPosY = textContentItem.prevTransform[5];
+      if (lastPosX === posX && lastPosY === posY) {
+        return true;
+      }
+      let rotate = -1;
+      if (currentTransform[0] && currentTransform[1] === 0 && currentTransform[2] === 0) {
+        rotate = currentTransform[0] > 0 ? 0 : 180;
+      } else if (currentTransform[1] && currentTransform[0] === 0 && currentTransform[3] === 0) {
+        rotate = currentTransform[1] > 0 ? 90 : 270;
+      }
+      switch (rotate) {
+        case 0:
+          break;
+        case 90:
+          [posX, posY] = [posY, posX];
+          [lastPosX, lastPosY] = [lastPosY, lastPosX];
+          break;
+        case 180:
+          [posX, posY, lastPosX, lastPosY] = [-posX, -posY, -lastPosX, -lastPosY];
+          break;
+        case 270:
+          [posX, posY] = [-posY, -posX];
+          [lastPosX, lastPosY] = [-lastPosY, -lastPosX];
+          break;
+        default:
+          [posX, posY] = applyInverseRotation(posX, posY, currentTransform);
+          [lastPosX, lastPosY] = applyInverseRotation(lastPosX, lastPosY, textContentItem.prevTransform);
+      }
+      if (textState.font.vertical) {
+        const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale;
+        const advanceX = posX - lastPosX;
+        const textOrientation = Math.sign(textContentItem.height || textContentItem.totalHeight);
+        if (advanceY < textOrientation * textContentItem.negativeSpaceMax) {
+          if (Math.abs(advanceX) > 0.5 * textContentItem.width) {
+            appendEOL();
+            return true;
+          }
+          resetLastChars();
+          flushTextContentItem();
+          return true;
+        }
+        if (Math.abs(advanceX) > textContentItem.width) {
+          appendEOL();
+          return true;
+        }
+        if (advanceY <= textOrientation * textContentItem.notASpace) {
+          resetLastChars();
+        }
+        if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) {
+          if (shouldAddWhitepsace()) {
+            resetLastChars();
+            flushTextContentItem();
+            pushWhitespace({
+              height: Math.abs(advanceY)
+            });
+          } else {
+            textContentItem.height += advanceY;
+          }
+        } else if (!addFakeSpaces(advanceY, textContentItem.prevTransform, textOrientation)) {
+          if (textContentItem.str.length === 0) {
+            resetLastChars();
+            pushWhitespace({
+              height: Math.abs(advanceY)
+            });
+          } else {
+            textContentItem.height += advanceY;
+          }
+        }
+        if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) {
+          flushTextContentItem();
+        }
+        return true;
+      }
+      const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale;
+      const advanceY = posY - lastPosY;
+      const textOrientation = Math.sign(textContentItem.width || textContentItem.totalWidth);
+      if (advanceX < textOrientation * textContentItem.negativeSpaceMax) {
+        if (Math.abs(advanceY) > 0.5 * textContentItem.height) {
+          appendEOL();
+          return true;
+        }
+        resetLastChars();
+        flushTextContentItem();
+        return true;
+      }
+      const textRiseDelta = textState.textRise - textContentItem.prevTextRise;
+      const advanceYCorrected = textRiseDelta === 0 ? advanceY : advanceY - currentTransform[3] / textState.fontSize * textRiseDelta;
+      if (Math.abs(advanceYCorrected) > textContentItem.height) {
+        appendEOL();
+        return true;
+      }
+      if (advanceX <= textOrientation * textContentItem.notASpace) {
+        resetLastChars();
+      }
+      if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) {
+        if (shouldAddWhitepsace()) {
+          resetLastChars();
+          flushTextContentItem();
+          pushWhitespace({
+            width: Math.abs(advanceX)
+          });
+        } else {
+          textContentItem.width += advanceX;
+        }
+      } else if (!addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation)) {
+        if (textContentItem.str.length === 0) {
+          resetLastChars();
+          pushWhitespace({
+            width: Math.abs(advanceX)
+          });
+        } else {
+          textContentItem.width += advanceX;
+        }
+      }
+      if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) {
+        flushTextContentItem();
+      }
+      return true;
+    }
+    function buildTextContentItem({
+      chars,
+      extraSpacing
+    }) {
+      if (currentTextState !== textState && (currentTextState.fontSize !== textState.fontSize || currentTextState.fontName !== textState.fontName && (currentTextState.font.name !== textState.font.name || currentTextState.font.vertical !== textState.font.vertical))) {
+        flushTextContentItem();
+        currentTextState = textState.clone();
+      }
+      const font = textState.font;
+      const baseCharSpacing = font.vertical ? -textState.charSpacing : textState.charSpacing;
+      if (!chars) {
+        const charSpacing = baseCharSpacing + extraSpacing;
+        if (charSpacing) {
+          if (!font.vertical) {
+            textState.translateTextMatrix(charSpacing * textState.textHScale, 0);
+          } else {
+            textState.translateTextMatrix(0, -charSpacing);
+          }
+        }
+        if (keepWhiteSpace) {
+          compareWithLastPosition(0);
+        }
+        return;
+      }
+      const glyphs = font.charsToGlyphs(chars);
+      const scale = textState.fontMatrix[0] * textState.fontSize;
+      for (let i = 0, ii = glyphs.length; i < ii; i++) {
+        const glyph = glyphs[i];
+        const {
+          category,
+          originalCharCode
+        } = glyph;
+        if (category.isInvisibleFormatMark) {
+          continue;
+        }
+        let charSpacing = baseCharSpacing + (i + 1 === ii ? extraSpacing : 0);
+        let glyphWidth = glyph.width;
+        if (font.vertical) {
+          glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth;
+        }
+        let scaledDim = glyphWidth * scale;
+        if (originalCharCode === 0x20) {
+          charSpacing += textState.wordSpacing;
+        }
+        if (!keepWhiteSpace && category.isWhitespace) {
+          if (!font.vertical) {
+            charSpacing += scaledDim;
+            textState.translateTextMatrix(charSpacing * textState.textHScale, 0);
+          } else {
+            charSpacing += -scaledDim;
+            textState.translateTextMatrix(0, -charSpacing);
+          }
+          saveLastChar(" ");
+          continue;
+        }
+        if (!category.isZeroWidthDiacritic && !compareWithLastPosition(scaledDim)) {
+          if (!font.vertical) {
+            textState.translateTextMatrix(scaledDim * textState.textHScale, 0);
+          } else {
+            textState.translateTextMatrix(0, scaledDim);
+          }
+          continue;
+        }
+        const textChunk = ensureTextContentItem();
+        if (category.isZeroWidthDiacritic) {
+          scaledDim = 0;
+        }
+        if (!font.vertical) {
+          scaledDim *= textState.textHScale;
+          intersector?.addGlyph(getCurrentTextTransform(), scaledDim, 0, glyph.unicode);
+          textState.translateTextMatrix(scaledDim, 0);
+          textChunk.width += scaledDim;
+        } else {
+          intersector?.addGlyph(getCurrentTextTransform(), 0, scaledDim, glyph.unicode);
+          textState.translateTextMatrix(0, scaledDim);
+          scaledDim = Math.abs(scaledDim);
+          textChunk.height += scaledDim;
+        }
+        if (scaledDim) {
+          textChunk.prevTransform = getCurrentTextTransform();
+          textChunk.prevTextRise = textState.textRise;
+        }
+        const glyphUnicode = glyph.unicode;
+        if (saveLastChar(glyphUnicode)) {
+          textChunk.str.push(" ");
+          intersector?.addExtraChar(" ");
+        }
+        if (!intersector) {
+          textChunk.str.push(glyphUnicode);
+        }
+        if (charSpacing) {
+          if (!font.vertical) {
+            textState.translateTextMatrix(charSpacing * textState.textHScale, 0);
+          } else {
+            textState.translateTextMatrix(0, -charSpacing);
+          }
+        }
+      }
+    }
+    function appendEOL() {
+      intersector?.addExtraChar("\n");
+      resetLastChars();
+      if (textContentItem.initialized) {
+        textContentItem.hasEOL = true;
+        flushTextContentItem();
+      } else {
+        textContent.items.push({
+          str: "",
+          dir: "ltr",
+          width: 0,
+          height: 0,
+          transform: getCurrentTextTransform(),
+          fontName: textState.loadedName,
+          hasEOL: true
+        });
+      }
+    }
+    function addFakeSpaces(width, transf, textOrientation) {
+      if (textOrientation * textContentItem.spaceInFlowMin <= width && width <= textOrientation * textContentItem.spaceInFlowMax) {
+        if (textContentItem.initialized) {
+          resetLastChars();
+          textContentItem.str.push(" ");
+          intersector?.addExtraChar(" ");
+        }
+        return false;
+      }
+      const fontName = textContentItem.fontName;
+      let height = 0;
+      if (textContentItem.vertical) {
+        height = width;
+        width = 0;
+      }
+      flushTextContentItem();
+      resetLastChars();
+      pushWhitespace({
+        width: Math.abs(width),
+        height: Math.abs(height),
+        transform: transf || getCurrentTextTransform(),
+        fontName
+      });
+      return true;
+    }
+    function flushTextContentItem() {
+      if (!textContentItem.initialized || !textContentItem.str) {
+        return;
+      }
+      if (!textContentItem.vertical) {
+        textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale;
+      } else {
+        textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale;
+      }
+      textContent.items.push(runBidiTransform(textContentItem));
+      textContentItem.initialized = false;
+      textContentItem.str.length = 0;
+    }
+    function enqueueChunk(batch = false) {
+      const length = textContent.items.length;
+      if (length === 0) {
+        return;
+      }
+      if (batch && length < TEXT_CHUNK_BATCH_SIZE) {
+        return;
+      }
+      sink.enqueue(textContent, length);
+      textContent.items = [];
+      textContent.styles = Object.create(null);
+    }
+    const timeSlotManager = new TimeSlotManager();
+    return new Promise(function promiseBody(resolve, reject) {
+      const next = function (promise) {
+        enqueueChunk(true);
+        Promise.all([promise, sink.ready]).then(function () {
+          try {
+            promiseBody(resolve, reject);
+          } catch (ex) {
+            reject(ex);
+          }
+        }, reject);
+      };
+      task.ensureNotTerminated();
+      timeSlotManager.reset();
+      const operation = {};
+      let stop,
+        name,
+        isValidName,
+        args = [];
+      while (!(stop = timeSlotManager.check())) {
+        args.length = 0;
+        operation.args = args;
+        if (!preprocessor.read(operation)) {
+          break;
+        }
+        textState = stateManager.state;
+        currentTextState ||= textState.clone();
+        const fn = operation.fn;
+        args = operation.args;
+        switch (fn | 0) {
+          case OPS.setFont:
+            const fontNameArg = args[0].name,
+              fontSizeArg = args[1];
+            if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {
+              break;
+            }
+            textState.fontName = fontNameArg;
+            textState.fontSize = fontSizeArg;
+            next(handleSetFont(fontNameArg, null));
+            return;
+          case OPS.setTextRise:
+            textState.textRise = args[0];
+            break;
+          case OPS.setHScale:
+            textState.textHScale = args[0] / 100;
+            break;
+          case OPS.setLeading:
+            textState.leading = args[0];
+            break;
+          case OPS.moveText:
+            textState.translateTextLineMatrix(args[0], args[1]);
+            textState.textMatrix = textState.textLineMatrix.slice();
+            break;
+          case OPS.setLeadingMoveText:
+            textState.leading = -args[1];
+            textState.translateTextLineMatrix(args[0], args[1]);
+            textState.textMatrix = textState.textLineMatrix.slice();
+            break;
+          case OPS.nextLine:
+            textState.carriageReturn();
+            break;
+          case OPS.setTextMatrix:
+            textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
+            textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
+            updateAdvanceScale();
+            break;
+          case OPS.setCharSpacing:
+            textState.charSpacing = args[0];
+            break;
+          case OPS.setWordSpacing:
+            textState.wordSpacing = args[0];
+            break;
+          case OPS.beginText:
+            textState.textMatrix = IDENTITY_MATRIX.slice();
+            textState.textLineMatrix = IDENTITY_MATRIX.slice();
+            break;
+          case OPS.showSpacedText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
+            const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000;
+            const elements = args[0];
+            for (let i = 0, ii = elements.length; i < ii; i++) {
+              const item = elements[i];
+              if (typeof item === "string") {
+                showSpacedTextBuffer.push(item);
+              } else if (typeof item === "number" && item !== 0) {
+                const str = showSpacedTextBuffer.join("");
+                showSpacedTextBuffer.length = 0;
+                buildTextContentItem({
+                  chars: str,
+                  extraSpacing: item * spaceFactor
+                });
+              }
+            }
+            if (showSpacedTextBuffer.length > 0) {
+              const str = showSpacedTextBuffer.join("");
+              showSpacedTextBuffer.length = 0;
+              buildTextContentItem({
+                chars: str,
+                extraSpacing: 0
+              });
+            }
+            break;
+          case OPS.showText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
+            buildTextContentItem({
+              chars: args[0],
+              extraSpacing: 0
+            });
+            break;
+          case OPS.nextLineShowText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
+            textState.carriageReturn();
+            buildTextContentItem({
+              chars: args[0],
+              extraSpacing: 0
+            });
+            break;
+          case OPS.nextLineSetSpacingShowText:
+            if (!stateManager.state.font) {
+              self.ensureStateFont(stateManager.state);
+              continue;
+            }
+            textState.wordSpacing = args[0];
+            textState.charSpacing = args[1];
+            textState.carriageReturn();
+            buildTextContentItem({
+              chars: args[2],
+              extraSpacing: 0
+            });
+            break;
+          case OPS.paintXObject:
+            flushTextContentItem();
+            xobjs ??= resources.get("XObject") || Dict.empty;
+            isValidName = args[0] instanceof Name;
+            name = args[0].name;
+            if (isValidName && emptyXObjectCache.getByName(name)) {
+              break;
+            }
+            next(new Promise(function (resolveXObject, rejectXObject) {
+              if (!isValidName) {
+                throw new FormatError("XObject must be referred to by name.");
+              }
+              let xobj = xobjs.getRaw(name);
+              if (xobj instanceof Ref) {
+                if (emptyXObjectCache.getByRef(xobj)) {
+                  resolveXObject();
+                  return;
+                }
+                const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);
+                if (globalImage) {
+                  resolveXObject();
+                  return;
+                }
+                xobj = xref.fetch(xobj);
+              }
+              if (!(xobj instanceof BaseStream)) {
+                throw new FormatError("XObject should be a stream");
+              }
+              const {
+                dict
+              } = xobj;
+              const type = dict.get("Subtype");
+              if (!(type instanceof Name)) {
+                throw new FormatError("XObject should have a Name subtype");
+              }
+              if (type.name !== "Form") {
+                emptyXObjectCache.set(name, dict.objId, true);
+                resolveXObject();
+                return;
+              }
+              const currentState = stateManager.state.clone();
+              const xObjStateManager = new StateManager(currentState);
+              const matrix = lookupMatrix(dict.getArray("Matrix"), null);
+              if (matrix) {
+                xObjStateManager.transform(matrix);
+              }
+              const localResources = dict.get("Resources");
+              enqueueChunk();
+              const sinkWrapper = textSinkWrapper(sink);
+              self.getTextContent({
+                stream: xobj,
+                task,
+                resources: localResources instanceof Dict ? localResources : resources,
+                stateManager: xObjStateManager,
+                includeMarkedContent,
+                sink: sinkWrapper,
+                seenStyles,
+                viewBox,
+                lang,
+                markedContentData,
+                disableNormalization,
+                keepWhiteSpace,
+                prevRefs: seenRefs
+              }).then(function () {
+                if (!sinkWrapper.enqueueInvoked) {
+                  emptyXObjectCache.set(name, dict.objId, true);
+                }
+                resolveXObject();
+              }, rejectXObject);
+            }).catch(function (reason) {
+              if (reason instanceof AbortException) {
+                return;
+              }
+              if (self.options.ignoreErrors) {
+                warn(`getTextContent - ignoring XObject: "${reason}".`);
+                return;
+              }
+              throw reason;
+            }));
+            return;
+          case OPS.setGState:
+            isValidName = args[0] instanceof Name;
+            name = args[0].name;
+            if (isValidName && emptyGStateCache.getByName(name)) {
+              break;
+            }
+            next(new Promise(function (resolveGState, rejectGState) {
+              if (!isValidName) {
+                throw new FormatError("GState must be referred to by name.");
+              }
+              const extGState = resources.get("ExtGState");
+              if (!(extGState instanceof Dict)) {
+                throw new FormatError("ExtGState should be a dictionary.");
+              }
+              const gState = extGState.get(name);
+              if (!(gState instanceof Dict)) {
+                throw new FormatError("GState should be a dictionary.");
+              }
+              const gStateFont = gState.get("Font");
+              if (!gStateFont) {
+                emptyGStateCache.set(name, gState.objId, true);
+                resolveGState();
+                return;
+              }
+              flushTextContentItem();
+              textState.fontName = null;
+              textState.fontSize = gStateFont[1];
+              handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState);
+            }).catch(function (reason) {
+              if (reason instanceof AbortException) {
+                return;
+              }
+              if (self.options.ignoreErrors) {
+                warn(`getTextContent - ignoring ExtGState: "${reason}".`);
+                return;
+              }
+              throw reason;
+            }));
+            return;
+          case OPS.beginMarkedContent:
+            flushTextContentItem();
+            if (includeMarkedContent) {
+              markedContentData.level++;
+              textContent.items.push({
+                type: "beginMarkedContent",
+                tag: args[0] instanceof Name ? args[0].name : null
+              });
+            }
+            break;
+          case OPS.beginMarkedContentProps:
+            flushTextContentItem();
+            if (includeMarkedContent) {
+              markedContentData.level++;
+              const mcid = args[1] instanceof Dict ? args[1].get("MCID") : null;
+              textContent.items.push({
+                type: "beginMarkedContentProps",
+                id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null,
+                tag: args[0] instanceof Name ? args[0].name : null
+              });
+            }
+            break;
+          case OPS.endMarkedContent:
+            flushTextContentItem();
+            if (includeMarkedContent) {
+              if (markedContentData.level === 0) {
+                break;
+              }
+              markedContentData.level--;
+              textContent.items.push({
+                type: "endMarkedContent"
+              });
+            }
+            break;
+        }
+        if (textContent.items.length >= sink.desiredSize) {
+          stop = true;
+          break;
+        }
+      }
+      if (stop) {
+        next(deferred);
+        return;
+      }
+      flushTextContentItem();
+      enqueueChunk();
+      resolve();
+    }).catch(reason => {
+      if (reason instanceof AbortException) {
+        return;
+      }
+      if (this.options.ignoreErrors) {
+        warn(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`);
+        flushTextContentItem();
+        enqueueChunk();
+        return;
+      }
+      throw reason;
+    });
+  }
+  async extractDataStructures(dict, properties) {
+    const xref = this.xref;
+    let cidToGidBytes;
+    const toUnicodePromise = this.readToUnicode(properties.toUnicode);
+    if (properties.composite) {
+      const cidSystemInfo = dict.get("CIDSystemInfo");
+      if (cidSystemInfo instanceof Dict && !properties.cidSystemInfo) {
+        properties.cidSystemInfo = {
+          registry: stringToPDFString(cidSystemInfo.get("Registry")),
+          ordering: stringToPDFString(cidSystemInfo.get("Ordering")),
+          supplement: cidSystemInfo.get("Supplement")
+        };
+      }
+      try {
+        const cidToGidMap = dict.get("CIDToGIDMap");
+        if (cidToGidMap instanceof BaseStream) {
+          cidToGidBytes = cidToGidMap.getBytes();
+        }
+      } catch (ex) {
+        if (!this.options.ignoreErrors) {
+          throw ex;
+        }
+        warn(`extractDataStructures - ignoring CIDToGIDMap data: "${ex}".`);
+      }
+    }
+    const differences = [];
+    let baseEncodingName = null;
+    let encoding;
+    if (dict.has("Encoding")) {
+      encoding = dict.get("Encoding");
+      if (encoding instanceof Dict) {
+        baseEncodingName = encoding.get("BaseEncoding");
+        baseEncodingName = baseEncodingName instanceof Name ? baseEncodingName.name : null;
+        if (encoding.has("Differences")) {
+          const diffEncoding = encoding.get("Differences");
+          let index = 0;
+          for (const entry of diffEncoding) {
+            const data = xref.fetchIfRef(entry);
+            if (typeof data === "number") {
+              index = data;
+            } else if (data instanceof Name) {
+              differences[index++] = data.name;
+            } else {
+              throw new FormatError(`Invalid entry in 'Differences' array: ${data}`);
+            }
+          }
+        }
+      } else if (encoding instanceof Name) {
+        baseEncodingName = encoding.name;
+      } else {
+        const msg = "Encoding is not a Name nor a Dict";
+        if (!this.options.ignoreErrors) {
+          throw new FormatError(msg);
+        }
+        warn(msg);
+      }
+      if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && baseEncodingName !== "WinAnsiEncoding") {
+        baseEncodingName = null;
+      }
+    }
+    const nonEmbeddedFont = !properties.file || properties.isInternalFont,
+      isSymbolsFontName = getSymbolsFonts()[properties.name];
+    if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) {
+      baseEncodingName = null;
+    }
+    if (baseEncodingName === "WinAnsiEncoding" && nonEmbeddedFont && properties.name?.charCodeAt(0) >= 0xb7) {
+      const fontName = properties.name;
+      const chineseFontNames = ["\xCB\xCE\xCC\xE5", "\xBA\xDA\xCC\xE5", "\xBF\xAC\xCC\xE5", "\xB7\xC2\xCB\xCE", "\xBF\xAC\xCC\xE5_GB2312", "\xB7\xC2\xCB\xCE_GB2312", "\xC1\xA5\xCA\xE9", "\xD0\xC2\xCB\xCE", "\xB7\xC2\xCB\xCE\xCC\xE5", "\xD0\xA1\xB1\xEA\xCB\xCE"];
+      if (chineseFontNames.includes(fontName)) {
+        baseEncodingName = null;
+        properties.defaultEncoding = "Adobe-GB1-UCS2";
+        properties.composite = true;
+        properties.cidEncoding = Name.get("GBK-EUC-H");
+        const cMap = await CMapFactory.create({
+          encoding: properties.cidEncoding,
+          fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+          useCMap: null
+        });
+        properties.cMap = cMap;
+        properties.vertical = properties.cMap.vertical;
+        properties.cidSystemInfo = {
+          registry: "Adobe",
+          ordering: "GB1",
+          supplement: 0
+        };
+      }
+    }
+    if (baseEncodingName) {
+      properties.defaultEncoding = getEncoding(baseEncodingName);
+    } else {
+      let isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
+      const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic);
+      if (properties.type === "TrueType" && isSymbolicFont && isNonsymbolicFont && differences.length !== 0) {
+        properties.flags &= ~FontFlags.Symbolic;
+        isSymbolicFont = false;
+      }
+      encoding = StandardEncoding;
+      if (properties.type === "TrueType" && !isNonsymbolicFont) {
+        encoding = WinAnsiEncoding;
+      }
+      if (isSymbolicFont || isSymbolsFontName) {
+        encoding = MacRomanEncoding;
+        if (nonEmbeddedFont) {
+          if (/Symbol/i.test(properties.name)) {
+            encoding = SymbolSetEncoding;
+          } else if (/Dingbats/i.test(properties.name)) {
+            encoding = ZapfDingbatsEncoding;
+          } else if (/Wingdings/i.test(properties.name)) {
+            encoding = WinAnsiEncoding;
+          }
+        }
+      }
+      properties.defaultEncoding = encoding;
+    }
+    properties.differences = differences;
+    properties.baseEncodingName = baseEncodingName;
+    properties.hasEncoding = !!baseEncodingName || differences.length > 0;
+    properties.dict = dict;
+    properties.toUnicode = await toUnicodePromise;
+    const builtToUnicode = await this.buildToUnicode(properties);
+    properties.toUnicode = builtToUnicode;
+    if (cidToGidBytes) {
+      properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode);
+    }
+    return properties;
+  }
+  _simpleFontToUnicode(properties, forceGlyphs = false) {
+    assert(!properties.composite, "Must be a simple font.");
+    const toUnicode = [];
+    const encoding = properties.defaultEncoding.slice();
+    const baseEncodingName = properties.baseEncodingName;
+    const differences = properties.differences;
+    for (const charcode in differences) {
+      const glyphName = differences[charcode];
+      if (glyphName === ".notdef") {
+        continue;
+      }
+      encoding[charcode] = glyphName;
+    }
+    const glyphsUnicodeMap = getGlyphsUnicode();
+    for (const charcode in encoding) {
+      let glyphName = encoding[charcode];
+      if (glyphName === "") {
+        continue;
+      }
+      let unicode = glyphsUnicodeMap[glyphName];
+      if (unicode !== undefined) {
+        toUnicode[charcode] = String.fromCharCode(unicode);
+        continue;
+      }
+      let code = 0;
+      switch (glyphName[0]) {
+        case "G":
+          if (glyphName.length === 3) {
+            code = parseInt(glyphName.substring(1), 16);
+          }
+          break;
+        case "g":
+          if (glyphName.length === 5) {
+            code = parseInt(glyphName.substring(1), 16);
+          }
+          break;
+        case "C":
+        case "c":
+          if (glyphName.length >= 3 && glyphName.length <= 4) {
+            const codeStr = glyphName.substring(1);
+            if (forceGlyphs) {
+              code = parseInt(codeStr, 16);
+              break;
+            }
+            code = +codeStr;
+            if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) {
+              return this._simpleFontToUnicode(properties, true);
+            }
+          }
+          break;
+        case "u":
+          unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
+          if (unicode !== -1) {
+            code = unicode;
+          }
+          break;
+        default:
+          switch (glyphName) {
+            case "f_h":
+            case "f_t":
+            case "T_h":
+              toUnicode[charcode] = glyphName.replaceAll("_", "");
+              continue;
+          }
+          break;
+      }
+      if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) {
+        if (baseEncodingName && code === +charcode) {
+          const baseEncoding = getEncoding(baseEncodingName);
+          if (baseEncoding && (glyphName = baseEncoding[charcode])) {
+            toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
+            continue;
+          }
+        }
+        toUnicode[charcode] = String.fromCodePoint(code);
+      }
+    }
+    return toUnicode;
+  }
+  async buildToUnicode(properties) {
+    properties.hasIncludedToUnicodeMap = properties.toUnicode?.length > 0;
+    if (properties.hasIncludedToUnicodeMap) {
+      if (!properties.composite && properties.hasEncoding) {
+        properties.fallbackToUnicode = this._simpleFontToUnicode(properties);
+      }
+      return properties.toUnicode;
+    }
+    if (!properties.composite) {
+      return new ToUnicodeMap(this._simpleFontToUnicode(properties));
+    }
+    if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof IdentityCMap) || properties.cidSystemInfo?.registry === "Adobe" && (properties.cidSystemInfo.ordering === "GB1" || properties.cidSystemInfo.ordering === "CNS1" || properties.cidSystemInfo.ordering === "Japan1" || properties.cidSystemInfo.ordering === "Korea1"))) {
+      const {
+        registry,
+        ordering
+      } = properties.cidSystemInfo;
+      const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`);
+      const ucs2CMap = await CMapFactory.create({
+        encoding: ucs2CMapName,
+        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+        useCMap: null
+      });
+      const toUnicode = [],
+        buf = [];
+      properties.cMap.forEach(function (charcode, cid) {
+        if (cid > 0xffff) {
+          throw new FormatError("Max size of CID is 65,535");
+        }
+        const ucs2 = ucs2CMap.lookup(cid);
+        if (ucs2) {
+          buf.length = 0;
+          for (let i = 0, ii = ucs2.length; i < ii; i += 2) {
+            buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1));
+          }
+          toUnicode[charcode] = String.fromCharCode(...buf);
+        }
+      });
+      return new ToUnicodeMap(toUnicode);
+    }
+    return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar);
+  }
+  async readToUnicode(cmapObj) {
+    if (!cmapObj) {
+      return null;
+    }
+    if (cmapObj instanceof Name) {
+      const cmap = await CMapFactory.create({
+        encoding: cmapObj,
+        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+        useCMap: null
+      });
+      if (cmap instanceof IdentityCMap) {
+        return new IdentityToUnicodeMap(0, 0xffff);
+      }
+      return new ToUnicodeMap(cmap.getMap());
+    }
+    if (cmapObj instanceof BaseStream) {
+      try {
+        const cmap = await CMapFactory.create({
+          encoding: cmapObj,
+          fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+          useCMap: null
+        });
+        if (cmap instanceof IdentityCMap) {
+          return new IdentityToUnicodeMap(0, 0xffff);
+        }
+        const map = new Array(cmap.length);
+        cmap.forEach(function (charCode, token) {
+          if (typeof token === "number") {
+            map[charCode] = String.fromCodePoint(token);
+            return;
+          }
+          if (token.length % 2 !== 0) {
+            token = "\u0000" + token;
+          }
+          const str = [];
+          for (let k = 0; k < token.length; k += 2) {
+            const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
+            if ((w1 & 0xf800) !== 0xd800) {
+              str.push(w1);
+              continue;
+            }
+            k += 2;
+            const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
+            str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
+          }
+          map[charCode] = String.fromCodePoint(...str);
+        });
+        return new ToUnicodeMap(map);
+      } catch (reason) {
+        if (reason instanceof AbortException) {
+          return null;
+        }
+        if (this.options.ignoreErrors) {
+          warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`);
+          return null;
+        }
+        throw reason;
+      }
+    }
+    return null;
+  }
+  readCidToGidMap(glyphsData, toUnicode) {
+    const result = [];
+    for (let j = 0, jj = glyphsData.length; j < jj; j++) {
+      const glyphID = glyphsData[j++] << 8 | glyphsData[j];
+      const code = j >> 1;
+      if (glyphID === 0 && !toUnicode.has(code)) {
+        continue;
+      }
+      result[code] = glyphID;
+    }
+    return result;
+  }
+  extractWidths(dict, descriptor, properties) {
+    const xref = this.xref;
+    let glyphsWidths = [];
+    let defaultWidth = 0;
+    const glyphsVMetrics = [];
+    let defaultVMetrics;
+    if (properties.composite) {
+      const dw = dict.get("DW");
+      defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000;
+      const widths = dict.get("W");
+      if (Array.isArray(widths)) {
+        for (let i = 0, ii = widths.length; i < ii; i++) {
+          let start = xref.fetchIfRef(widths[i++]);
+          if (!Number.isInteger(start)) {
+            break;
+          }
+          const code = xref.fetchIfRef(widths[i]);
+          if (Array.isArray(code)) {
+            for (const c of code) {
+              const width = xref.fetchIfRef(c);
+              if (typeof width === "number") {
+                glyphsWidths[start] = width;
+              }
+              start++;
+            }
+          } else if (Number.isInteger(code)) {
+            const width = xref.fetchIfRef(widths[++i]);
+            if (typeof width !== "number") {
+              continue;
+            }
+            for (let j = start; j <= code; j++) {
+              glyphsWidths[j] = width;
+            }
+          } else {
+            break;
+          }
+        }
+      }
+      if (properties.vertical) {
+        const dw2 = dict.getArray("DW2");
+        let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000];
+        defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
+        vmetrics = dict.get("W2");
+        if (Array.isArray(vmetrics)) {
+          for (let i = 0, ii = vmetrics.length; i < ii; i++) {
+            let start = xref.fetchIfRef(vmetrics[i++]);
+            if (!Number.isInteger(start)) {
+              break;
+            }
+            const code = xref.fetchIfRef(vmetrics[i]);
+            if (Array.isArray(code)) {
+              for (let j = 0, jj = code.length; j < jj; j++) {
+                const vmetric = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])];
+                if (isNumberArray(vmetric, null)) {
+                  glyphsVMetrics[start] = vmetric;
+                }
+                start++;
+              }
+            } else if (Number.isInteger(code)) {
+              const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])];
+              if (!isNumberArray(vmetric, null)) {
+                continue;
+              }
+              for (let j = start; j <= code; j++) {
+                glyphsVMetrics[j] = vmetric;
+              }
+            } else {
+              break;
+            }
+          }
+        }
+      }
+    } else {
+      const widths = dict.get("Widths");
+      if (Array.isArray(widths)) {
+        let j = properties.firstChar;
+        for (const w of widths) {
+          const width = xref.fetchIfRef(w);
+          if (typeof width === "number") {
+            glyphsWidths[j] = width;
+          }
+          j++;
+        }
+        const missingWidth = descriptor.get("MissingWidth");
+        defaultWidth = typeof missingWidth === "number" ? missingWidth : 0;
+      } else {
+        const baseFontName = dict.get("BaseFont");
+        if (baseFontName instanceof Name) {
+          const metrics = this.getBaseFontMetrics(baseFontName.name);
+          glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);
+          defaultWidth = metrics.defaultWidth;
+        }
+      }
+    }
+    let isMonospace = true;
+    let firstWidth = defaultWidth;
+    for (const glyph in glyphsWidths) {
+      const glyphWidth = glyphsWidths[glyph];
+      if (!glyphWidth) {
+        continue;
+      }
+      if (!firstWidth) {
+        firstWidth = glyphWidth;
+        continue;
+      }
+      if (firstWidth !== glyphWidth) {
+        isMonospace = false;
+        break;
+      }
+    }
+    if (isMonospace) {
+      properties.flags |= FontFlags.FixedPitch;
+    } else {
+      properties.flags &= ~FontFlags.FixedPitch;
+    }
+    properties.defaultWidth = defaultWidth;
+    properties.widths = glyphsWidths;
+    properties.defaultVMetrics = defaultVMetrics;
+    properties.vmetrics = glyphsVMetrics;
+  }
+  isSerifFont(baseFontName) {
+    const fontNameWoStyle = baseFontName.split("-", 1)[0];
+    return fontNameWoStyle in getSerifFonts() || /serif/i.test(fontNameWoStyle);
+  }
+  getBaseFontMetrics(name) {
+    let defaultWidth = 0;
+    let widths = Object.create(null);
+    let monospace = false;
+    let fontName = normalizeFontName(name);
+    const stdFontMap = getStdFontMap();
+    fontName = stdFontMap[fontName] || fontName;
+    const Metrics = getMetrics();
+    const glyphWidths = Metrics[fontName] ?? Metrics[this.isSerifFont(name) ? "Times-Roman" : "Helvetica"];
+    if (typeof glyphWidths === "number") {
+      defaultWidth = glyphWidths;
+      monospace = true;
+    } else {
+      widths = glyphWidths();
+    }
+    return {
+      defaultWidth,
+      monospace,
+      widths
+    };
+  }
+  buildCharCodeToWidth(widthsByGlyphName, properties) {
+    const widths = Object.create(null);
+    const differences = properties.differences;
+    const encoding = properties.defaultEncoding;
+    for (let charCode = 0; charCode < 256; charCode++) {
+      if (charCode in differences && widthsByGlyphName[differences[charCode]]) {
+        widths[charCode] = widthsByGlyphName[differences[charCode]];
+        continue;
+      }
+      if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
+        widths[charCode] = widthsByGlyphName[encoding[charCode]];
+        continue;
+      }
+    }
+    return widths;
+  }
+  preEvaluateFont(dict) {
+    const baseDict = dict;
+    let type = dict.get("Subtype");
+    if (!(type instanceof Name)) {
+      throw new FormatError("invalid font Subtype");
+    }
+    let composite = false;
+    let hash;
+    if (type.name === "Type0") {
+      const df = dict.get("DescendantFonts");
+      if (!df) {
+        throw new FormatError("Descendant fonts are not specified");
+      }
+      dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df;
+      if (!(dict instanceof Dict)) {
+        throw new FormatError("Descendant font is not a dictionary.");
+      }
+      type = dict.get("Subtype");
+      if (!(type instanceof Name)) {
+        throw new FormatError("invalid font Subtype");
+      }
+      composite = true;
+    }
+    let firstChar = dict.get("FirstChar");
+    if (!Number.isInteger(firstChar)) {
+      firstChar = 0;
+    }
+    let lastChar = dict.get("LastChar");
+    if (!Number.isInteger(lastChar)) {
+      lastChar = composite ? 0xffff : 0xff;
+    }
+    const descriptor = dict.get("FontDescriptor");
+    const toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode");
+    if (descriptor) {
+      hash = new MurmurHash3_64();
+      const encoding = baseDict.getRaw("Encoding");
+      if (encoding instanceof Name) {
+        hash.update(encoding.name);
+      } else if (encoding instanceof Ref) {
+        hash.update(encoding.toString());
+      } else if (encoding instanceof Dict) {
+        for (const entry of encoding.getRawValues()) {
+          if (entry instanceof Name) {
+            hash.update(entry.name);
+          } else if (entry instanceof Ref) {
+            hash.update(entry.toString());
+          } else if (Array.isArray(entry)) {
+            const diffLength = entry.length,
+              diffBuf = new Array(diffLength);
+            for (let j = 0; j < diffLength; j++) {
+              const diffEntry = entry[j];
+              if (diffEntry instanceof Name) {
+                diffBuf[j] = diffEntry.name;
+              } else if (typeof diffEntry === "number" || diffEntry instanceof Ref) {
+                diffBuf[j] = diffEntry.toString();
+              }
+            }
+            hash.update(diffBuf.join());
+          }
+        }
+      }
+      hash.update(`${firstChar}-${lastChar}`);
+      if (toUnicode instanceof BaseStream) {
+        const stream = toUnicode.stream || toUnicode;
+        const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);
+        hash.update(uint8array);
+      } else if (toUnicode instanceof Name) {
+        hash.update(toUnicode.name);
+      }
+      const widths = dict.get("Widths") || baseDict.get("Widths");
+      if (Array.isArray(widths)) {
+        const widthsBuf = [];
+        for (const entry of widths) {
+          if (typeof entry === "number" || entry instanceof Ref) {
+            widthsBuf.push(entry.toString());
+          }
+        }
+        hash.update(widthsBuf.join());
+      }
+      if (composite) {
+        hash.update("compositeFont");
+        const compositeWidths = dict.get("W") || baseDict.get("W");
+        if (Array.isArray(compositeWidths)) {
+          const widthsBuf = [];
+          for (const entry of compositeWidths) {
+            if (typeof entry === "number" || entry instanceof Ref) {
+              widthsBuf.push(entry.toString());
+            } else if (Array.isArray(entry)) {
+              const subWidthsBuf = [];
+              for (const element of entry) {
+                if (typeof element === "number" || element instanceof Ref) {
+                  subWidthsBuf.push(element.toString());
+                }
+              }
+              widthsBuf.push(`[${subWidthsBuf.join()}]`);
+            }
+          }
+          hash.update(widthsBuf.join());
+        }
+        const cidToGidMap = dict.getRaw("CIDToGIDMap") || baseDict.getRaw("CIDToGIDMap");
+        if (cidToGidMap instanceof Name) {
+          hash.update(cidToGidMap.name);
+        } else if (cidToGidMap instanceof Ref) {
+          hash.update(cidToGidMap.toString());
+        } else if (cidToGidMap instanceof BaseStream) {
+          hash.update(cidToGidMap.peekBytes());
+        }
+      }
+      if (type.name === "Type3") {
+        const charProcs = baseDict.get("CharProcs");
+        if (charProcs instanceof Dict) {
+          for (const [key, entry] of charProcs.getRawEntries()) {
+            hash.update(entry instanceof Ref ? `${key}\0${entry}` : key);
+          }
+        }
+      }
+    }
+    return {
+      descriptor,
+      dict,
+      baseDict,
+      composite,
+      type: type.name,
+      firstChar,
+      lastChar,
+      toUnicode,
+      hash: hash ? hash.hexdigest() : ""
+    };
+  }
+  async translateFont({
+    descriptor,
+    dict,
+    baseDict,
+    composite,
+    type,
+    firstChar,
+    lastChar,
+    toUnicode,
+    cssFontInfo
+  }) {
+    const isType3Font = type === "Type3";
+    if (!descriptor) {
+      if (isType3Font) {
+        descriptor = Dict.empty;
+      } else if (composite) {
+        descriptor = Dict.empty;
+      } else {
+        let baseFontName = dict.get("BaseFont");
+        if (!(baseFontName instanceof Name)) {
+          throw new FormatError("Base font is not specified");
+        }
+        baseFontName = normalizeFontName(baseFontName.name);
+        const metrics = this.getBaseFontMetrics(baseFontName);
+        const fontNameWoStyle = baseFontName.split("-", 1)[0];
+        const flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic);
+        const properties = {
+          type,
+          name: baseFontName,
+          loadedName: baseDict.loadedName,
+          systemFontInfo: null,
+          widths: metrics.widths,
+          defaultWidth: metrics.defaultWidth,
+          isSimulatedFlags: true,
+          flags,
+          firstChar,
+          lastChar,
+          toUnicode,
+          xHeight: 0,
+          capHeight: 0,
+          italicAngle: 0,
+          isType3Font
+        };
+        const widths = dict.get("Widths");
+        const standardFontName = getStandardFontName(baseFontName);
+        let file = null;
+        if (standardFontName) {
+          file = await this.fetchStandardFontData(standardFontName);
+          properties.isInternalFont = !!file;
+        }
+        if (!properties.isInternalFont && this.options.useSystemFonts) {
+          properties.systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, baseFontName, standardFontName, type);
+        }
+        const newProperties = await this.extractDataStructures(dict, properties);
+        if (Array.isArray(widths)) {
+          const glyphWidths = [];
+          let j = firstChar;
+          for (const w of widths) {
+            const width = this.xref.fetchIfRef(w);
+            if (typeof width === "number") {
+              glyphWidths[j] = width;
+            }
+            j++;
+          }
+          newProperties.widths = glyphWidths;
+        } else {
+          newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties);
+        }
+        return new Font(baseFontName, file, newProperties, this.options);
+      }
+    }
+    let fontName = descriptor.get("FontName");
+    let baseFont = dict.get("BaseFont");
+    if (typeof fontName === "string") {
+      fontName = Name.get(fontName);
+    }
+    if (typeof baseFont === "string") {
+      baseFont = Name.get(baseFont);
+    }
+    const fontNameStr = fontName?.name;
+    const baseFontStr = baseFont?.name;
+    if (isType3Font) {
+      if (!fontNameStr) {
+        fontName = Name.get(type);
+      }
+    } else if (fontNameStr !== baseFontStr) {
+      info(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`);
+      if (fontNameStr && baseFontStr && (baseFontStr.startsWith(fontNameStr) || !isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) {
+        fontName = null;
+      }
+      fontName ||= baseFont;
+    }
+    if (!(fontName instanceof Name)) {
+      throw new FormatError("invalid font name");
+    }
+    let fontFile, fontFileN, subtype, length1, length2, length3;
+    try {
+      for (const n of ["FontFile", "FontFile2", "FontFile3"]) {
+        fontFile = descriptor.get(n);
+        if (fontFile) {
+          fontFileN = n;
+          break;
+        }
+      }
+      if (fontFile) {
+        if (!(fontFile instanceof BaseStream)) {
+          throw new FormatError("FontFile should be a stream");
+        } else {
+          if (fontFile.isAsync) {
+            const bytes = await fontFile.asyncGetBytes();
+            if (bytes) {
+              fontFile = new Stream(bytes, 0, bytes.length, fontFile.dict);
+            }
+          }
+          if (fontFile.isEmpty) {
+            throw new FormatError("FontFile is empty");
+          }
+        }
+      }
+    } catch (ex) {
+      if (!this.options.ignoreErrors) {
+        throw ex;
+      }
+      warn(`translateFont - fetching "${fontName.name}" font file: "${ex}".`);
+      fontFile = null;
+    }
+    let isInternalFont = false;
+    let glyphScaleFactors = null;
+    let systemFontInfo = null;
+    if (fontFile) {
+      if (fontFile.dict) {
+        const subtypeEntry = fontFile.dict.get("Subtype");
+        if (subtypeEntry instanceof Name) {
+          subtype = subtypeEntry.name;
+        }
+        length1 = fontFile.dict.get("Length1");
+        length2 = fontFile.dict.get("Length2");
+        length3 = fontFile.dict.get("Length3");
+      }
+    } else if (cssFontInfo) {
+      const standardFontName = getXfaFontName(fontName.name);
+      if (standardFontName) {
+        cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`;
+        cssFontInfo.metrics = standardFontName.metrics || null;
+        glyphScaleFactors = standardFontName.factors || null;
+        fontFile = await this.fetchStandardFontData(standardFontName.name);
+        isInternalFont = !!fontFile;
+        baseDict = dict = getXfaFontDict(fontName.name);
+        composite = true;
+      }
+    } else if (!isType3Font) {
+      const standardFontName = getStandardFontName(fontName.name);
+      if (standardFontName) {
+        fontFile = await this.fetchStandardFontData(standardFontName);
+        isInternalFont = !!fontFile;
+      }
+      if (!isInternalFont && this.options.useSystemFonts) {
+        systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type);
+      }
+    }
+    const fontMatrix = lookupMatrix(dict.getArray("FontMatrix"), FONT_IDENTITY_MATRIX);
+    const bbox = lookupNormalRect(descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), isType3Font ? [0, 0, 0, 0] : undefined);
+    let ascent = descriptor.get("Ascent");
+    if (typeof ascent !== "number") {
+      ascent = undefined;
+    }
+    let descent = descriptor.get("Descent");
+    if (typeof descent !== "number") {
+      descent = undefined;
+    }
+    let xHeight = descriptor.get("XHeight");
+    if (typeof xHeight !== "number") {
+      xHeight = 0;
+    }
+    let capHeight = descriptor.get("CapHeight");
+    if (typeof capHeight !== "number") {
+      capHeight = 0;
+    }
+    let flags = descriptor.get("Flags");
+    if (!Number.isInteger(flags)) {
+      flags = 0;
+    }
+    let italicAngle = descriptor.get("ItalicAngle");
+    if (typeof italicAngle !== "number") {
+      italicAngle = 0;
+    }
+    const properties = {
+      type,
+      name: fontName.name,
+      subtype,
+      file: fontFile,
+      fontFileN,
+      length1,
+      length2,
+      length3,
+      isInternalFont,
+      loadedName: baseDict.loadedName,
+      composite,
+      fixedPitch: false,
+      fontMatrix,
+      firstChar,
+      lastChar,
+      toUnicode,
+      bbox,
+      ascent,
+      descent,
+      xHeight,
+      capHeight,
+      flags,
+      italicAngle,
+      isType3Font,
+      cssFontInfo,
+      scaleFactors: glyphScaleFactors,
+      systemFontInfo
+    };
+    if (composite) {
+      const cidEncoding = baseDict.get("Encoding");
+      if (cidEncoding instanceof Name) {
+        properties.cidEncoding = cidEncoding.name;
+      }
+      const cMap = await CMapFactory.create({
+        encoding: cidEncoding,
+        fetchBuiltInCMap: this._fetchBuiltInCMapBound,
+        useCMap: null
+      });
+      properties.cMap = cMap;
+      properties.vertical = properties.cMap.vertical;
+    }
+    const newProperties = await this.extractDataStructures(dict, properties);
+    this.extractWidths(dict, descriptor, newProperties);
+    const font = new Font(fontName.name, fontFile, newProperties, this.options);
+    if (font.missingFile && !font.systemFontInfo && !isType3Font && this.options.useSystemFonts) {
+      const standardFontName = getStandardFontName(fontName.name);
+      const substitution = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type);
+      if (substitution) {
+        if (substitution.guessFallback) {
+          substitution.guessFallback = false;
+          substitution.css += `,${font.fallbackName}`;
+        }
+        font.systemFontInfo = substitution;
+      }
+    }
+    return font;
+  }
+  static buildFontPaths(font, glyphs, handler, evaluatorOptions) {
+    function buildPath(fontChar) {
+      const glyphName = `${font.loadedName}_path_${fontChar}`;
+      try {
+        if (font.renderer.hasBuiltPath(fontChar)) {
+          return;
+        }
+        const buffer = compileFontPathInfo(font.renderer.getPathJs(fontChar));
+        handler.send("commonobj", [glyphName, "FontPath", buffer], [buffer]);
+      } catch (reason) {
+        if (evaluatorOptions.ignoreErrors) {
+          warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`);
+          return;
+        }
+        throw reason;
+      }
+    }
+    for (const glyph of glyphs) {
+      buildPath(glyph.fontChar);
+      const accent = glyph.accent;
+      if (accent?.fontChar) {
+        buildPath(accent.fontChar);
+      }
+    }
+  }
+  static get fallbackFontDict() {
+    const dict = new Dict();
+    dict.set("BaseFont", Name.get("Helvetica"));
+    dict.set("Type", Name.get("FallbackType"));
+    dict.set("Subtype", Name.get("FallbackType"));
+    dict.set("Encoding", Name.get("WinAnsiEncoding"));
+    return shadow(this, "fallbackFontDict", dict);
+  }
+}
+class TranslatedFont {
+  #sent = false;
+  #type3Loaded = null;
+  constructor({
+    loadedName,
+    font,
+    dict
+  }) {
+    this.loadedName = loadedName;
+    this.font = font;
+    this.dict = dict;
+    this.type3Dependencies = font.isType3Font ? new Set() : null;
+  }
+  send(handler) {
+    if (this.#sent) {
+      return;
+    }
+    this.#sent = true;
+    const fontData = this.font.exportData(),
+      transfers = fontData.buffer ? [fontData.buffer] : null;
+    handler.send("commonobj", [this.loadedName, "Font", fontData], transfers);
+  }
+  fallback(handler, evaluatorOptions) {
+    if (!this.font.data) {
+      return;
+    }
+    this.font.disableFontFace = true;
+    PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, evaluatorOptions);
+  }
+  loadType3Data(evaluator, resources, task, seenRefs = null) {
+    if (this.#type3Loaded) {
+      return this.#type3Loaded;
+    }
+    const {
+      font,
+      type3Dependencies
+    } = this;
+    assert(font.isType3Font, "Must be a Type3 font.");
+    const type3Evaluator = evaluator.clone({
+      ignoreErrors: false
+    });
+    const type3FontRefs = new RefSet(evaluator.type3FontRefs);
+    if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) {
+      type3FontRefs.put(this.dict.objId);
+    }
+    type3Evaluator.type3FontRefs = type3FontRefs;
+    let loadCharProcsPromise = Promise.resolve();
+    const charProcs = this.dict.get("CharProcs");
+    const fontResources = this.dict.get("Resources") || resources;
+    const charProcOperatorList = Object.create(null);
+    const [x0, y0, x1, y1] = font.bbox,
+      width = x1 - x0,
+      height = y1 - y0;
+    const fontBBoxSize = Math.hypot(width, height);
+    for (const key of charProcs.getKeys()) {
+      loadCharProcsPromise = loadCharProcsPromise.then(() => {
+        const glyphStream = charProcs.get(key);
+        const operatorList = new OperatorList();
+        return type3Evaluator.getOperatorList({
+          stream: glyphStream,
+          task,
+          resources: fontResources,
+          operatorList,
+          prevRefs: seenRefs
+        }).then(() => {
+          switch (operatorList.fnArray[0]) {
+            case OPS.setCharWidthAndBounds:
+              this.#removeType3ColorOperators(operatorList, fontBBoxSize);
+              break;
+            case OPS.setCharWidth:
+              if (!fontBBoxSize) {
+                this.#guessType3FontBBox(operatorList);
+              }
+              break;
+          }
+          charProcOperatorList[key] = operatorList.getIR();
+          for (const dependency of operatorList.dependencies) {
+            type3Dependencies.add(dependency);
+          }
+        }).catch(function (reason) {
+          warn(`Type3 font resource "${key}" is not available.`);
+          const dummyOperatorList = new OperatorList();
+          charProcOperatorList[key] = dummyOperatorList.getIR();
+        });
+      });
+    }
+    this.#type3Loaded = loadCharProcsPromise.then(() => {
+      font.charProcOperatorList = charProcOperatorList;
+      if (this._bbox) {
+        font.isCharBBox = true;
+        font.bbox = this._bbox;
+      }
+    });
+    return this.#type3Loaded;
+  }
+  #removeType3ColorOperators(operatorList, fontBBoxSize = NaN) {
+    const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)),
+      width = charBBox[2] - charBBox[0],
+      height = charBBox[3] - charBBox[1];
+    const charBBoxSize = Math.hypot(width, height);
+    if (width === 0 || height === 0) {
+      operatorList.fnArray.splice(0, 1);
+      operatorList.argsArray.splice(0, 1);
+    } else if (fontBBoxSize === 0 || Math.round(charBBoxSize / fontBBoxSize) >= 10) {
+      this._bbox ??= BBOX_INIT.slice();
+      Util.rectBoundingBox(...charBBox, this._bbox);
+    }
+    let i = 0,
+      ii = operatorList.length;
+    while (i < ii) {
+      switch (operatorList.fnArray[i]) {
+        case OPS.setCharWidthAndBounds:
+          break;
+        case OPS.setStrokeColorSpace:
+        case OPS.setFillColorSpace:
+        case OPS.setStrokeColor:
+        case OPS.setStrokeColorN:
+        case OPS.setFillColor:
+        case OPS.setFillColorN:
+        case OPS.setStrokeGray:
+        case OPS.setFillGray:
+        case OPS.setStrokeRGBColor:
+        case OPS.setFillRGBColor:
+        case OPS.setStrokeCMYKColor:
+        case OPS.setFillCMYKColor:
+        case OPS.shadingFill:
+        case OPS.setRenderingIntent:
+          operatorList.fnArray.splice(i, 1);
+          operatorList.argsArray.splice(i, 1);
+          ii--;
+          continue;
+        case OPS.setGState:
+          const [gStateObj] = operatorList.argsArray[i];
+          let j = 0,
+            jj = gStateObj.length;
+          while (j < jj) {
+            const [gStateKey] = gStateObj[j];
+            switch (gStateKey) {
+              case "TR":
+              case "TR2":
+              case "HT":
+              case "BG":
+              case "BG2":
+              case "UCR":
+              case "UCR2":
+                gStateObj.splice(j, 1);
+                jj--;
+                continue;
+            }
+            j++;
+          }
+          break;
+      }
+      i++;
+    }
+  }
+  #guessType3FontBBox(operatorList) {
+    let i = 1;
+    const ii = operatorList.length;
+    while (i < ii) {
+      switch (operatorList.fnArray[i]) {
+        case OPS.constructPath:
+          const minMax = operatorList.argsArray[i][2];
+          this._bbox ??= BBOX_INIT.slice();
+          Util.rectBoundingBox(...minMax, this._bbox);
+          break;
+      }
+      i++;
+    }
+  }
+}
+class StateManager {
+  constructor(initialState = new EvalState()) {
+    this.state = initialState;
+    this.stateStack = [];
+  }
+  save() {
+    const old = this.state;
+    this.stateStack.push(this.state);
+    this.state = old.clone();
+  }
+  restore() {
+    const prev = this.stateStack.pop();
+    if (prev) {
+      this.state = prev;
+    }
+  }
+  transform(args) {
+    this.state.ctm = Util.transform(this.state.ctm, args);
+  }
+}
+class TextState {
+  ctm = new Float32Array(IDENTITY_MATRIX);
+  fontName = null;
+  fontSize = 0;
+  loadedName = null;
+  font = null;
+  fontMatrix = FONT_IDENTITY_MATRIX;
+  textMatrix = IDENTITY_MATRIX.slice();
+  textLineMatrix = IDENTITY_MATRIX.slice();
+  charSpacing = 0;
+  wordSpacing = 0;
+  leading = 0;
+  textHScale = 1;
+  textRise = 0;
+  setTextMatrix(a, b, c, d, e, f) {
+    const m = this.textMatrix;
+    m[0] = a;
+    m[1] = b;
+    m[2] = c;
+    m[3] = d;
+    m[4] = e;
+    m[5] = f;
+  }
+  setTextLineMatrix(a, b, c, d, e, f) {
+    const m = this.textLineMatrix;
+    m[0] = a;
+    m[1] = b;
+    m[2] = c;
+    m[3] = d;
+    m[4] = e;
+    m[5] = f;
+  }
+  translateTextMatrix(x, y) {
+    const m = this.textMatrix;
+    m[4] = m[0] * x + m[2] * y + m[4];
+    m[5] = m[1] * x + m[3] * y + m[5];
+  }
+  translateTextLineMatrix(x, y) {
+    const m = this.textLineMatrix;
+    m[4] = m[0] * x + m[2] * y + m[4];
+    m[5] = m[1] * x + m[3] * y + m[5];
+  }
+  carriageReturn() {
+    this.translateTextLineMatrix(0, -this.leading);
+    this.textMatrix = this.textLineMatrix.slice();
+  }
+  clone() {
+    const clone = Object.assign(Object.create(this), this);
+    clone.textMatrix = this.textMatrix.slice();
+    clone.textLineMatrix = this.textLineMatrix.slice();
+    clone.fontMatrix = this.fontMatrix.slice();
+    return clone;
+  }
+}
+class EvalState {
+  ctm = new Float32Array(IDENTITY_MATRIX);
+  font = null;
+  textRenderingMode = TextRenderingMode.FILL;
+  _fillColorSpace = ColorSpaceUtils.gray;
+  _strokeColorSpace = ColorSpaceUtils.gray;
+  patternFillColorSpace = null;
+  patternStrokeColorSpace = null;
+  currentPointX = 0;
+  currentPointY = 0;
+  pathMinMax = F32_BBOX_INIT.slice();
+  pathBuffer = [];
+  get fillColorSpace() {
+    return this._fillColorSpace;
+  }
+  set fillColorSpace(colorSpace) {
+    this._fillColorSpace = this.patternFillColorSpace = colorSpace;
+  }
+  get strokeColorSpace() {
+    return this._strokeColorSpace;
+  }
+  set strokeColorSpace(colorSpace) {
+    this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace;
+  }
+  clone({
+    newPath = false
+  } = {}) {
+    const clone = Object.create(this);
+    if (newPath) {
+      clone.pathBuffer = [];
+      clone.pathMinMax = F32_BBOX_INIT.slice();
+    }
+    return clone;
+  }
+}
+class EvaluatorPreprocessor {
+  static get opMap() {
+    return shadow(this, "opMap", Object.assign(Object.create(null), {
+      w: {
+        id: OPS.setLineWidth,
+        numArgs: 1,
+        variableArgs: false
+      },
+      J: {
+        id: OPS.setLineCap,
+        numArgs: 1,
+        variableArgs: false
+      },
+      j: {
+        id: OPS.setLineJoin,
+        numArgs: 1,
+        variableArgs: false
+      },
+      M: {
+        id: OPS.setMiterLimit,
+        numArgs: 1,
+        variableArgs: false
+      },
+      d: {
+        id: OPS.setDash,
+        numArgs: 2,
+        variableArgs: false
+      },
+      ri: {
+        id: OPS.setRenderingIntent,
+        numArgs: 1,
+        variableArgs: false
+      },
+      i: {
+        id: OPS.setFlatness,
+        numArgs: 1,
+        variableArgs: false
+      },
+      gs: {
+        id: OPS.setGState,
+        numArgs: 1,
+        variableArgs: false
+      },
+      q: {
+        id: OPS.save,
+        numArgs: 0,
+        variableArgs: false
+      },
+      Q: {
+        id: OPS.restore,
+        numArgs: 0,
+        variableArgs: false
+      },
+      cm: {
+        id: OPS.transform,
+        numArgs: 6,
+        variableArgs: false
+      },
+      m: {
+        id: OPS.moveTo,
+        numArgs: 2,
+        variableArgs: false
+      },
+      l: {
+        id: OPS.lineTo,
+        numArgs: 2,
+        variableArgs: false
+      },
+      c: {
+        id: OPS.curveTo,
+        numArgs: 6,
+        variableArgs: false
+      },
+      v: {
+        id: OPS.curveTo2,
+        numArgs: 4,
+        variableArgs: false
+      },
+      y: {
+        id: OPS.curveTo3,
+        numArgs: 4,
+        variableArgs: false
+      },
+      h: {
+        id: OPS.closePath,
+        numArgs: 0,
+        variableArgs: false
+      },
+      re: {
+        id: OPS.rectangle,
+        numArgs: 4,
+        variableArgs: false
+      },
+      S: {
+        id: OPS.stroke,
+        numArgs: 0,
+        variableArgs: false
+      },
+      s: {
+        id: OPS.closeStroke,
+        numArgs: 0,
+        variableArgs: false
+      },
+      f: {
+        id: OPS.fill,
+        numArgs: 0,
+        variableArgs: false
+      },
+      F: {
+        id: OPS.fill,
+        numArgs: 0,
+        variableArgs: false
+      },
+      "f*": {
+        id: OPS.eoFill,
+        numArgs: 0,
+        variableArgs: false
+      },
+      B: {
+        id: OPS.fillStroke,
+        numArgs: 0,
+        variableArgs: false
+      },
+      "B*": {
+        id: OPS.eoFillStroke,
+        numArgs: 0,
+        variableArgs: false
+      },
+      b: {
+        id: OPS.closeFillStroke,
+        numArgs: 0,
+        variableArgs: false
+      },
+      "b*": {
+        id: OPS.closeEOFillStroke,
+        numArgs: 0,
+        variableArgs: false
+      },
+      n: {
+        id: OPS.endPath,
+        numArgs: 0,
+        variableArgs: false
+      },
+      W: {
+        id: OPS.clip,
+        numArgs: 0,
+        variableArgs: false
+      },
+      "W*": {
+        id: OPS.eoClip,
+        numArgs: 0,
+        variableArgs: false
+      },
+      BT: {
+        id: OPS.beginText,
+        numArgs: 0,
+        variableArgs: false
+      },
+      ET: {
+        id: OPS.endText,
+        numArgs: 0,
+        variableArgs: false
+      },
+      Tc: {
+        id: OPS.setCharSpacing,
+        numArgs: 1,
+        variableArgs: false
+      },
+      Tw: {
+        id: OPS.setWordSpacing,
+        numArgs: 1,
+        variableArgs: false
+      },
+      Tz: {
+        id: OPS.setHScale,
+        numArgs: 1,
+        variableArgs: false
+      },
+      TL: {
+        id: OPS.setLeading,
+        numArgs: 1,
+        variableArgs: false
+      },
+      Tf: {
+        id: OPS.setFont,
+        numArgs: 2,
+        variableArgs: false
+      },
+      Tr: {
+        id: OPS.setTextRenderingMode,
+        numArgs: 1,
+        variableArgs: false
+      },
+      Ts: {
+        id: OPS.setTextRise,
+        numArgs: 1,
+        variableArgs: false
+      },
+      Td: {
+        id: OPS.moveText,
+        numArgs: 2,
+        variableArgs: false
+      },
+      TD: {
+        id: OPS.setLeadingMoveText,
+        numArgs: 2,
+        variableArgs: false
+      },
+      Tm: {
+        id: OPS.setTextMatrix,
+        numArgs: 6,
+        variableArgs: false
+      },
+      "T*": {
+        id: OPS.nextLine,
+        numArgs: 0,
+        variableArgs: false
+      },
+      Tj: {
+        id: OPS.showText,
+        numArgs: 1,
+        variableArgs: false
+      },
+      TJ: {
+        id: OPS.showSpacedText,
+        numArgs: 1,
+        variableArgs: false
+      },
+      "'": {
+        id: OPS.nextLineShowText,
+        numArgs: 1,
+        variableArgs: false
+      },
+      '"': {
+        id: OPS.nextLineSetSpacingShowText,
+        numArgs: 3,
+        variableArgs: false
+      },
+      d0: {
+        id: OPS.setCharWidth,
+        numArgs: 2,
+        variableArgs: false
+      },
+      d1: {
+        id: OPS.setCharWidthAndBounds,
+        numArgs: 6,
+        variableArgs: false
+      },
+      CS: {
+        id: OPS.setStrokeColorSpace,
+        numArgs: 1,
+        variableArgs: false
+      },
+      cs: {
+        id: OPS.setFillColorSpace,
+        numArgs: 1,
+        variableArgs: false
+      },
+      SC: {
+        id: OPS.setStrokeColor,
+        numArgs: 4,
+        variableArgs: true
+      },
+      SCN: {
+        id: OPS.setStrokeColorN,
+        numArgs: 33,
+        variableArgs: true
+      },
+      sc: {
+        id: OPS.setFillColor,
+        numArgs: 4,
+        variableArgs: true
+      },
+      scn: {
+        id: OPS.setFillColorN,
+        numArgs: 33,
+        variableArgs: true
+      },
+      G: {
+        id: OPS.setStrokeGray,
+        numArgs: 1,
+        variableArgs: false
+      },
+      g: {
+        id: OPS.setFillGray,
+        numArgs: 1,
+        variableArgs: false
+      },
+      RG: {
+        id: OPS.setStrokeRGBColor,
+        numArgs: 3,
+        variableArgs: false
+      },
+      rg: {
+        id: OPS.setFillRGBColor,
+        numArgs: 3,
+        variableArgs: false
+      },
+      K: {
+        id: OPS.setStrokeCMYKColor,
+        numArgs: 4,
+        variableArgs: false
+      },
+      k: {
+        id: OPS.setFillCMYKColor,
+        numArgs: 4,
+        variableArgs: false
+      },
+      sh: {
+        id: OPS.shadingFill,
+        numArgs: 1,
+        variableArgs: false
+      },
+      BI: {
+        id: OPS.beginInlineImage,
+        numArgs: 0,
+        variableArgs: false
+      },
+      ID: {
+        id: OPS.beginImageData,
+        numArgs: 0,
+        variableArgs: false
+      },
+      EI: {
+        id: OPS.endInlineImage,
+        numArgs: 1,
+        variableArgs: false
+      },
+      Do: {
+        id: OPS.paintXObject,
+        numArgs: 1,
+        variableArgs: false
+      },
+      MP: {
+        id: OPS.markPoint,
+        numArgs: 1,
+        variableArgs: false
+      },
+      DP: {
+        id: OPS.markPointProps,
+        numArgs: 2,
+        variableArgs: false
+      },
+      BMC: {
+        id: OPS.beginMarkedContent,
+        numArgs: 1,
+        variableArgs: false
+      },
+      BDC: {
+        id: OPS.beginMarkedContentProps,
+        numArgs: 2,
+        variableArgs: false
+      },
+      EMC: {
+        id: OPS.endMarkedContent,
+        numArgs: 0,
+        variableArgs: false
+      },
+      BX: {
+        id: OPS.beginCompat,
+        numArgs: 0,
+        variableArgs: false
+      },
+      EX: {
+        id: OPS.endCompat,
+        numArgs: 0,
+        variableArgs: false
+      },
+      BM: null,
+      BD: null,
+      true: null,
+      fa: null,
+      fal: null,
+      fals: null,
+      false: null,
+      nu: null,
+      nul: null,
+      null: null
+    }));
+  }
+  static MAX_INVALID_PATH_OPS = 10;
+  constructor(stream, xref, stateManager = new StateManager()) {
+    this.parser = new Parser({
+      lexer: new Lexer(stream, EvaluatorPreprocessor.opMap),
+      xref
+    });
+    this.stateManager = stateManager;
+    this.nonProcessedArgs = [];
+    this._isPathOp = false;
+    this._numInvalidPathOPS = 0;
+  }
+  get savedStatesDepth() {
+    return this.stateManager.stateStack.length;
+  }
+  read(operation) {
+    let args = operation.args;
+    while (true) {
+      const obj = this.parser.getObj();
+      if (obj instanceof Cmd) {
+        const cmd = obj.cmd;
+        const opSpec = EvaluatorPreprocessor.opMap[cmd];
+        if (!opSpec) {
+          warn(`Unknown command "${cmd}".`);
+          continue;
+        }
+        const fn = opSpec.id;
+        const numArgs = opSpec.numArgs;
+        let argsLength = args !== null ? args.length : 0;
+        if (!this._isPathOp) {
+          this._numInvalidPathOPS = 0;
+        }
+        this._isPathOp = fn >= OPS.moveTo && fn <= OPS.endPath;
+        if (!opSpec.variableArgs) {
+          if (argsLength !== numArgs) {
+            const nonProcessedArgs = this.nonProcessedArgs;
+            while (argsLength > numArgs) {
+              nonProcessedArgs.push(args.shift());
+              argsLength--;
+            }
+            while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
+              if (args === null) {
+                args = [];
+              }
+              args.unshift(nonProcessedArgs.pop());
+              argsLength++;
+            }
+          }
+          if (argsLength < numArgs) {
+            const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`;
+            if (this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) {
+              throw new FormatError(`Invalid ${partialMsg}`);
+            }
+            warn(`Skipping ${partialMsg}`);
+            if (args !== null) {
+              args.length = 0;
+            }
+            continue;
+          }
+        } else if (argsLength > numArgs) {
+          info(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} args.`);
+        }
+        this.preprocessCommand(fn, args);
+        operation.fn = fn;
+        operation.args = args;
+        return true;
+      }
+      if (obj === EOF) {
+        return false;
+      }
+      if (obj !== null) {
+        if (args === null) {
+          args = [];
+        }
+        args.push(obj);
+        if (args.length > 33) {
+          throw new FormatError("Too many arguments");
+        }
+      }
+    }
+  }
+  preprocessCommand(fn, args) {
+    switch (fn | 0) {
+      case OPS.save:
+        this.stateManager.save();
+        break;
+      case OPS.restore:
+        this.stateManager.restore();
+        break;
+      case OPS.transform:
+        this.stateManager.transform(args);
+        break;
+    }
+  }
+}
+
+;// ./src/core/default_appearance.js
+
+
+
+
+
+
+
+
+
+class DefaultAppearanceEvaluator extends EvaluatorPreprocessor {
+  constructor(str) {
+    super(new StringStream(str));
+  }
+  parse() {
+    const operation = {
+      fn: 0,
+      args: []
+    };
+    const result = {
+      fontSize: 0,
+      fontName: "",
+      fontColor: new Uint8ClampedArray(3)
+    };
+    try {
+      while (true) {
+        operation.args.length = 0;
+        if (!this.read(operation)) {
+          break;
+        }
+        if (this.savedStatesDepth !== 0) {
+          continue;
+        }
+        const {
+          fn,
+          args
+        } = operation;
+        switch (fn | 0) {
+          case OPS.setFont:
+            const [fontName, fontSize] = args;
+            if (fontName instanceof Name) {
+              result.fontName = fontName.name;
+            }
+            if (typeof fontSize === "number" && fontSize > 0) {
+              result.fontSize = fontSize;
+            }
+            break;
+          case OPS.setFillRGBColor:
+            ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0);
+            break;
+          case OPS.setFillGray:
+            ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0);
+            break;
+          case OPS.setFillCMYKColor:
+            ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0);
+            break;
+        }
+      }
+    } catch (reason) {
+      warn(`parseDefaultAppearance - ignoring errors: "${reason}".`);
+    }
+    return result;
+  }
+}
+function parseDefaultAppearance(str) {
+  return new DefaultAppearanceEvaluator(str).parse();
+}
+class AppearanceStreamEvaluator extends EvaluatorPreprocessor {
+  constructor(stream, xref, globalColorSpaceCache) {
+    super(stream);
+    this.stream = stream;
+    this.xref = xref;
+    this.globalColorSpaceCache = globalColorSpaceCache;
+    this.resources = stream.dict?.get("Resources");
+  }
+  parse() {
+    const operation = {
+      fn: 0,
+      args: []
+    };
+    let result = {
+      scaleFactor: 1,
+      fontSize: 0,
+      fontName: "",
+      fontColor: new Uint8ClampedArray(3),
+      fillColorSpace: ColorSpaceUtils.gray
+    };
+    let breakLoop = false;
+    const stack = [];
+    try {
+      while (true) {
+        operation.args.length = 0;
+        if (breakLoop || !this.read(operation)) {
+          break;
+        }
+        const {
+          fn,
+          args
+        } = operation;
+        switch (fn | 0) {
+          case OPS.save:
+            stack.push({
+              scaleFactor: result.scaleFactor,
+              fontSize: result.fontSize,
+              fontName: result.fontName,
+              fontColor: result.fontColor.slice(),
+              fillColorSpace: result.fillColorSpace
+            });
+            break;
+          case OPS.restore:
+            result = stack.pop() || result;
+            break;
+          case OPS.setTextMatrix:
+            result.scaleFactor *= Math.hypot(args[0], args[1]);
+            break;
+          case OPS.setFont:
+            const [fontName, fontSize] = args;
+            if (fontName instanceof Name) {
+              result.fontName = fontName.name;
+            }
+            if (typeof fontSize === "number" && fontSize > 0) {
+              result.fontSize = fontSize * result.scaleFactor;
+            }
+            break;
+          case OPS.setFillColorSpace:
+            result.fillColorSpace = ColorSpaceUtils.parse({
+              cs: args[0],
+              xref: this.xref,
+              resources: this.resources,
+              pdfFunctionFactory: this._pdfFunctionFactory,
+              globalColorSpaceCache: this.globalColorSpaceCache,
+              localColorSpaceCache: this._localColorSpaceCache
+            });
+            break;
+          case OPS.setFillColor:
+            const cs = result.fillColorSpace;
+            cs.getRgbItem(args, 0, result.fontColor, 0);
+            break;
+          case OPS.setFillRGBColor:
+            ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0);
+            break;
+          case OPS.setFillGray:
+            ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0);
+            break;
+          case OPS.setFillCMYKColor:
+            ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0);
+            break;
+          case OPS.showText:
+          case OPS.showSpacedText:
+          case OPS.nextLineShowText:
+          case OPS.nextLineSetSpacingShowText:
+            breakLoop = true;
+            break;
+        }
+      }
+    } catch (reason) {
+      warn(`parseAppearanceStream - ignoring errors: "${reason}".`);
+    }
+    this.stream.reset();
+    delete result.scaleFactor;
+    delete result.fillColorSpace;
+    return result;
+  }
+  get _localColorSpaceCache() {
+    return shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache());
+  }
+  get _pdfFunctionFactory() {
+    return shadow(this, "_pdfFunctionFactory", new PDFFunctionFactory({
+      xref: this.xref
+    }));
+  }
+}
+function parseAppearanceStream(stream, xref, globalColorSpaceCache) {
+  return new AppearanceStreamEvaluator(stream, xref, globalColorSpaceCache).parse();
+}
+function getPdfColor(color, isFill) {
+  if (color[0] === color[1] && color[1] === color[2]) {
+    const gray = color[0] / 255;
+    return `${numberToString(gray)} ${isFill ? "g" : "G"}`;
+  }
+  return Array.from(color, c => numberToString(c / 255)).join(" ") + ` ${isFill ? "rg" : "RG"}`;
+}
+function createDefaultAppearance({
+  fontSize,
+  fontName,
+  fontColor
+}) {
+  return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`;
+}
+class FakeUnicodeFont {
+  static #fontNameId = 1;
+  constructor(xref, fontFamily) {
+    this.xref = xref;
+    this.widths = null;
+    this.firstChar = Infinity;
+    this.lastChar = -Infinity;
+    this.fontFamily = fontFamily;
+    const canvas = new OffscreenCanvas(1, 1);
+    this.ctxMeasure = canvas.getContext("2d", {
+      willReadFrequently: true
+    });
+    this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont.#fontNameId++}`);
+  }
+  get fontDescriptorRef() {
+    if (!FakeUnicodeFont._fontDescriptorRef) {
+      const fontDescriptor = new Dict(this.xref);
+      fontDescriptor.setIfName("Type", "FontDescriptor");
+      fontDescriptor.set("FontName", this.fontName);
+      fontDescriptor.set("FontFamily", "MyriadPro Regular");
+      fontDescriptor.set("FontBBox", [0, 0, 0, 0]);
+      fontDescriptor.setIfName("FontStretch", "Normal");
+      fontDescriptor.set("FontWeight", 400);
+      fontDescriptor.set("ItalicAngle", 0);
+      FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor);
+    }
+    return FakeUnicodeFont._fontDescriptorRef;
+  }
+  get descendantFontRef() {
+    const descendantFont = new Dict(this.xref);
+    descendantFont.set("BaseFont", this.fontName);
+    descendantFont.setIfName("Type", "Font");
+    descendantFont.setIfName("Subtype", "CIDFontType0");
+    descendantFont.setIfName("CIDToGIDMap", "Identity");
+    descendantFont.set("FirstChar", this.firstChar);
+    descendantFont.set("LastChar", this.lastChar);
+    descendantFont.set("FontDescriptor", this.fontDescriptorRef);
+    descendantFont.set("DW", 1000);
+    const widths = [];
+    const chars = [...this.widths].sort();
+    let currentChar = null;
+    let currentWidths = null;
+    for (const [char, width] of chars) {
+      if (!currentChar) {
+        currentChar = char;
+        currentWidths = [width];
+        continue;
+      }
+      if (char === currentChar + currentWidths.length) {
+        currentWidths.push(width);
+      } else {
+        widths.push(currentChar, currentWidths);
+        currentChar = char;
+        currentWidths = [width];
+      }
+    }
+    if (currentChar) {
+      widths.push(currentChar, currentWidths);
+    }
+    descendantFont.set("W", widths);
+    const cidSystemInfo = new Dict(this.xref);
+    cidSystemInfo.set("Ordering", "Identity");
+    cidSystemInfo.set("Registry", "Adobe");
+    cidSystemInfo.set("Supplement", 0);
+    descendantFont.set("CIDSystemInfo", cidSystemInfo);
+    return this.xref.getNewPersistentRef(descendantFont);
+  }
+  get baseFontRef() {
+    const baseFont = new Dict(this.xref);
+    baseFont.set("BaseFont", this.fontName);
+    baseFont.setIfName("Type", "Font");
+    baseFont.setIfName("Subtype", "Type0");
+    baseFont.setIfName("Encoding", "Identity-H");
+    baseFont.set("DescendantFonts", [this.descendantFontRef]);
+    baseFont.setIfName("ToUnicode", "Identity-H");
+    return this.xref.getNewPersistentRef(baseFont);
+  }
+  get resources() {
+    const resources = new Dict(this.xref);
+    const font = new Dict(this.xref);
+    font.set(this.fontName.name, this.baseFontRef);
+    resources.set("Font", font);
+    return resources;
+  }
+  _createContext() {
+    this.widths = new Map();
+    this.ctxMeasure.font = `1000px ${this.fontFamily}`;
+    return this.ctxMeasure;
+  }
+  createFontResources(text) {
+    const ctx = this._createContext();
+    for (const line of text.split(/\r\n?|\n/)) {
+      for (const char of line.split("")) {
+        const code = char.charCodeAt(0);
+        if (this.widths.has(code)) {
+          continue;
+        }
+        const metrics = ctx.measureText(char);
+        const width = Math.ceil(metrics.width);
+        this.widths.set(code, width);
+        this.firstChar = Math.min(code, this.firstChar);
+        this.lastChar = Math.max(code, this.lastChar);
+      }
+    }
+    return this.resources;
+  }
+  static getFirstPositionInfo(rect, rotation, fontSize) {
+    const [x1, y1, x2, y2] = rect;
+    let w = x2 - x1;
+    let h = y2 - y1;
+    if (rotation % 180 !== 0) {
+      [w, h] = [h, w];
+    }
+    const lineHeight = LINE_FACTOR * fontSize;
+    const lineDescent = LINE_DESCENT_FACTOR * fontSize;
+    return {
+      coords: [0, h + lineDescent - lineHeight],
+      bbox: [0, 0, w, h],
+      matrix: rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined
+    };
+  }
+  createAppearance(text, rect, rotation, fontSize, bgColor, strokeAlpha) {
+    const ctx = this._createContext();
+    const lines = [];
+    let maxWidth = -Infinity;
+    for (const line of text.split(/\r\n?|\n/)) {
+      lines.push(line);
+      const lineWidth = ctx.measureText(line).width;
+      maxWidth = Math.max(maxWidth, lineWidth);
+      for (const code of codePointIter(line)) {
+        const char = String.fromCodePoint(code);
+        let width = this.widths.get(code);
+        if (width === undefined) {
+          const metrics = ctx.measureText(char);
+          width = Math.ceil(metrics.width);
+          this.widths.set(code, width);
+          this.firstChar = Math.min(code, this.firstChar);
+          this.lastChar = Math.max(code, this.lastChar);
+        }
+      }
+    }
+    maxWidth *= fontSize / 1000;
+    const [x1, y1, x2, y2] = rect;
+    let w = x2 - x1;
+    let h = y2 - y1;
+    if (rotation % 180 !== 0) {
+      [w, h] = [h, w];
+    }
+    const hscale = maxWidth > w ? w / maxWidth : 1;
+    let vscale = 1;
+    const lineHeight = LINE_FACTOR * fontSize;
+    const lineDescent = LINE_DESCENT_FACTOR * fontSize;
+    const maxHeight = lineHeight * lines.length;
+    if (maxHeight > h) {
+      vscale = h / maxHeight;
+    }
+    const fscale = Math.min(hscale, vscale);
+    const newFontSize = fontSize * fscale;
+    const buffer = ["q", `0 0 ${numberToString(w)} ${numberToString(h)} re W n`, `BT`, `1 0 0 1 0 ${numberToString(h + lineDescent)} Tm 0 Tc ${getPdfColor(bgColor, true)}`, `/${this.fontName.name} ${numberToString(newFontSize)} Tf`];
+    const {
+      resources
+    } = this;
+    strokeAlpha = typeof strokeAlpha === "number" && strokeAlpha >= 0 && strokeAlpha <= 1 ? strokeAlpha : 1;
+    if (strokeAlpha !== 1) {
+      buffer.push("/R0 gs");
+      const extGState = new Dict(this.xref);
+      const r0 = new Dict(this.xref);
+      r0.set("ca", strokeAlpha);
+      r0.set("CA", strokeAlpha);
+      r0.setIfName("Type", "ExtGState");
+      extGState.set("R0", r0);
+      resources.set("ExtGState", extGState);
+    }
+    const vShift = numberToString(lineHeight);
+    for (const line of lines) {
+      buffer.push(`0 -${vShift} Td <${stringToUTF16HexString(line)}> Tj`);
+    }
+    buffer.push("ET", "Q");
+    const appearance = buffer.join("\n");
+    const appearanceStreamDict = new Dict(this.xref);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    appearanceStreamDict.setIfName("Type", "XObject");
+    appearanceStreamDict.set("BBox", [0, 0, w, h]);
+    appearanceStreamDict.set("Length", appearance.length);
+    appearanceStreamDict.set("Resources", resources);
+    if (rotation) {
+      const matrix = getRotationMatrix(rotation, w, h);
+      appearanceStreamDict.set("Matrix", matrix);
+    }
+    return new StringStream(appearance, appearanceStreamDict);
+  }
+}
+
+;// ./src/shared/scripting_utils.js
+/* unused harmony import specifier */ var scripting_utils_MathClamp;
+
+function makeColorComp(n) {
+  return Math.floor(scripting_utils_MathClamp(n, 0, 1) * 255).toString(16).padStart(2, "0");
+}
+function scaleAndClamp(x) {
+  return scripting_utils_MathClamp(x, 0, 1) * 255;
+}
+class ColorConverters {
+  static CMYK_G([c, y, m, k]) {
+    return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];
+  }
+  static G_CMYK([g]) {
+    return ["CMYK", 0, 0, 0, 1 - g];
+  }
+  static G_RGB([g]) {
+    return ["RGB", g, g, g];
+  }
+  static G_rgb([g]) {
+    g = scaleAndClamp(g);
+    return [g, g, g];
+  }
+  static G_HTML([g]) {
+    const G = makeColorComp(g);
+    return `#${G}${G}${G}`;
+  }
+  static RGB_G([r, g, b]) {
+    return ["G", 0.3 * r + 0.59 * g + 0.11 * b];
+  }
+  static RGB_rgb(color) {
+    return color.map(scaleAndClamp);
+  }
+  static RGB_HTML(color) {
+    return `#${color.map(makeColorComp).join("")}`;
+  }
+  static T_HTML() {
+    return "#00000000";
+  }
+  static T_rgb() {
+    return [null];
+  }
+  static CMYK_RGB([c, y, m, k]) {
+    return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];
+  }
+  static CMYK_rgb([c, y, m, k]) {
+    return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];
+  }
+  static CMYK_HTML(components) {
+    const rgb = this.CMYK_RGB(components).slice(1);
+    return this.RGB_HTML(rgb);
+  }
+  static RGB_CMYK([r, g, b]) {
+    const c = 1 - r;
+    const m = 1 - g;
+    const y = 1 - b;
+    const k = Math.min(c, m, y);
+    return ["CMYK", c, m, y, k];
+  }
+}
+const DateFormats = ["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"];
+const TimeFormats = ["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"];
+
+;// ./src/core/name_number_tree.js
+
+
+class NameOrNumberTree {
+  constructor(root, xref, type) {
+    this.root = root;
+    this.xref = xref;
+    this._type = type;
+  }
+  getAll(isRaw = false) {
+    const map = new Map();
+    if (!this.root) {
+      return map;
+    }
+    const xref = this.xref;
+    const processed = new RefSet();
+    if (this.root instanceof Ref) {
+      processed.put(this.root);
+    }
+    const queue = [this.root];
+    for (const node of queue) {
+      const obj = xref.fetchIfRef(node);
+      if (!(obj instanceof Dict)) {
+        continue;
+      }
+      if (obj.has("Kids")) {
+        const kids = obj.get("Kids");
+        if (!Array.isArray(kids)) {
+          continue;
+        }
+        for (const kid of kids) {
+          if (kid instanceof Ref) {
+            if (processed.has(kid)) {
+              throw new FormatError(`Duplicate entry in "${this._type}" tree.`);
+            }
+            processed.put(kid);
+          }
+          queue.push(kid);
+        }
+        continue;
+      }
+      const entries = obj.get(this._type);
+      if (!Array.isArray(entries)) {
+        continue;
+      }
+      for (let i = 0, ii = entries.length; i < ii; i += 2) {
+        map.set(isRaw ? entries[i] : xref.fetchIfRef(entries[i]), isRaw ? entries[i + 1] : xref.fetchIfRef(entries[i + 1]));
+      }
+    }
+    return map;
+  }
+  getRaw(key) {
+    if (!this.root) {
+      return null;
+    }
+    const xref = this.xref;
+    let kidsOrEntries = xref.fetchIfRef(this.root);
+    let loopCount = 0;
+    const MAX_LEVELS = 10;
+    while (kidsOrEntries.has("Kids")) {
+      if (++loopCount > MAX_LEVELS) {
+        warn(`Search depth limit reached for "${this._type}" tree.`);
+        return null;
+      }
+      const kids = kidsOrEntries.get("Kids");
+      if (!Array.isArray(kids)) {
+        return null;
+      }
+      let l = 0,
+        r = kids.length - 1;
+      while (l <= r) {
+        const m = l + r >> 1;
+        const kid = xref.fetchIfRef(kids[m]);
+        const limits = kid.get("Limits");
+        if (key < xref.fetchIfRef(limits[0])) {
+          r = m - 1;
+        } else if (key > xref.fetchIfRef(limits[1])) {
+          l = m + 1;
+        } else {
+          kidsOrEntries = kid;
+          break;
+        }
+      }
+      if (l > r) {
+        return null;
+      }
+    }
+    const entries = kidsOrEntries.get(this._type);
+    if (Array.isArray(entries)) {
+      let l = 0,
+        r = entries.length - 2;
+      while (l <= r) {
+        const tmp = l + r >> 1,
+          m = tmp + (tmp & 1);
+        const currentKey = xref.fetchIfRef(entries[m]);
+        if (key < currentKey) {
+          r = m - 2;
+        } else if (key > currentKey) {
+          l = m + 2;
+        } else {
+          return entries[m + 1];
+        }
+      }
+    }
+    return null;
+  }
+  get(key) {
+    return this.xref.fetchIfRef(this.getRaw(key));
+  }
+}
+class NameTree extends NameOrNumberTree {
+  constructor(root, xref) {
+    super(root, xref, "Names");
+  }
+}
+class NumberTree extends NameOrNumberTree {
+  constructor(root, xref) {
+    super(root, xref, "Nums");
+  }
+}
+
+;// ./src/core/cleanup_helper.js
+
+
+
+
+function clearGlobalCaches() {
+  clearPatternCaches();
+  clearPrimitiveCaches();
+  clearUnicodeCaches();
+  WasmImage.cleanup();
+}
+
+;// ./src/core/file_spec.js
+
+
+
+
+class FileSpec {
+  constructor(root) {
+    if (!(root instanceof Dict)) {
+      return;
+    }
+    this.root = root;
+    if (root.has("FS")) {
+      this.fs = root.get("FS");
+    }
+    if (root.has("RF")) {
+      warn("Related file specifications are not supported");
+    }
+  }
+  get filename() {
+    const item = FileSpec.pickPlatformItem(this.root);
+    if (item && typeof item === "string") {
+      return stringToPDFString(item, true).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/");
+    }
+    return "";
+  }
+  get description() {
+    const desc = this.root?.get("Desc");
+    if (desc && typeof desc === "string") {
+      return stringToPDFString(desc);
+    }
+    return "";
+  }
+  get serializable() {
+    const {
+      filename,
+      description
+    } = this;
+    return {
+      rawFilename: filename,
+      filename: stripPath(filename) || "unnamed",
+      description
+    };
+  }
+  static pickPlatformItem(dict, raw = false) {
+    if (dict instanceof Dict) {
+      for (const key of ["UF", "F", "Unix", "Mac", "DOS"]) {
+        if (dict.has(key)) {
+          return raw ? dict.getRaw(key) : dict.get(key);
+        }
+      }
+    }
+    return null;
+  }
+  static hasEmbeddedFile(fileSpecDict) {
+    return this.pickPlatformItem(fileSpecDict.get("EF")) instanceof BaseStream;
+  }
+  static readContent(dict) {
+    if (!(dict instanceof Dict)) {
+      return null;
+    }
+    const ef = this.pickPlatformItem(dict.get("EF"));
+    if (!(ef instanceof BaseStream)) {
+      warn("Embedded file specification points to non-existing/invalid content");
+      return null;
+    }
+    return this.readStreamContent(ef);
+  }
+  static readStreamContent(stream) {
+    const encrypt = stream.dict?.xref?.encrypt;
+    if (encrypt?.encryptionKey === null) {
+      throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD);
+    }
+    return stream.getBytes();
+  }
+}
+
+;// ./src/core/xml_parser.js
+
+
+const XMLParserErrorCode = {
+  NoError: 0,
+  EndOfDocument: -1,
+  UnterminatedCdat: -2,
+  UnterminatedXmlDeclaration: -3,
+  UnterminatedDoctypeDeclaration: -4,
+  UnterminatedComment: -5,
+  MalformedElement: -6,
+  OutOfMemory: -7,
+  UnterminatedAttributeValue: -8,
+  UnterminatedElement: -9,
+  ElementNeverBegun: -10
+};
+function isWhitespace(s, index) {
+  const ch = s[index];
+  return ch === " " || ch === "\n" || ch === "\r" || ch === "\t";
+}
+function isWhitespaceString(s) {
+  for (let i = 0, ii = s.length; i < ii; i++) {
+    if (!isWhitespace(s, i)) {
+      return false;
+    }
+  }
+  return true;
+}
+class XMLParserBase {
+  static get _entityRegex() {
+    return shadow(this, "_entityRegex", /&(?:#x([^;]+)|#([^;]+)|([^;]+));/g);
+  }
+  _resolveEntities(s) {
+    return s.replaceAll(XMLParserBase._entityRegex, (_, hex, dec, entity) => {
+      if (hex) {
+        return String.fromCodePoint(parseInt(hex, 16));
+      }
+      if (dec) {
+        return String.fromCodePoint(parseInt(dec, 10));
+      }
+      switch (entity) {
+        case "lt":
+          return "<";
+        case "gt":
+          return ">";
+        case "amp":
+          return "&";
+        case "quot":
+          return '"';
+        case "apos":
+          return "'";
+      }
+      return this.onResolveEntity(entity);
+    });
+  }
+  _parseContent(s, start) {
+    const attributes = [];
+    let pos = start;
+    function skipWs() {
+      while (pos < s.length && isWhitespace(s, pos)) {
+        ++pos;
+      }
+    }
+    while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") {
+      ++pos;
+    }
+    const name = s.substring(start, pos);
+    skipWs();
+    while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") {
+      skipWs();
+      let attrName = "",
+        attrValue = "";
+      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") {
+        attrName += s[pos];
+        ++pos;
+      }
+      skipWs();
+      if (s[pos] !== "=") {
+        return null;
+      }
+      ++pos;
+      skipWs();
+      const attrEndChar = s[pos];
+      if (attrEndChar !== '"' && attrEndChar !== "'") {
+        return null;
+      }
+      const attrEndIndex = s.indexOf(attrEndChar, ++pos);
+      if (attrEndIndex < 0) {
+        return null;
+      }
+      attrValue = s.substring(pos, attrEndIndex);
+      attributes.push({
+        name: attrName,
+        value: this._resolveEntities(attrValue)
+      });
+      pos = attrEndIndex + 1;
+      skipWs();
+    }
+    return {
+      name,
+      attributes,
+      parsed: pos - start
+    };
+  }
+  _parseProcessingInstruction(s, start) {
+    let pos = start;
+    function skipWs() {
+      while (pos < s.length && isWhitespace(s, pos)) {
+        ++pos;
+      }
+    }
+    while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") {
+      ++pos;
+    }
+    const name = s.substring(start, pos);
+    skipWs();
+    const attrStart = pos;
+    while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) {
+      ++pos;
+    }
+    const value = s.substring(attrStart, pos);
+    return {
+      name,
+      value,
+      parsed: pos - start
+    };
+  }
+  parseXml(s) {
+    let i = 0;
+    while (i < s.length) {
+      const ch = s[i];
+      let j = i;
+      if (ch === "<") {
+        ++j;
+        const ch2 = s[j];
+        let q;
+        switch (ch2) {
+          case "/":
+            ++j;
+            q = s.indexOf(">", j);
+            if (q < 0) {
+              this.onError(XMLParserErrorCode.UnterminatedElement);
+              return;
+            }
+            this.onEndElement(s.substring(j, q));
+            j = q + 1;
+            break;
+          case "?":
+            ++j;
+            const pi = this._parseProcessingInstruction(s, j);
+            if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") {
+              this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);
+              return;
+            }
+            this.onPi(pi.name, pi.value);
+            j += pi.parsed + 2;
+            break;
+          case "!":
+            if (s.substring(j + 1, j + 3) === "--") {
+              q = s.indexOf("-->", j + 3);
+              if (q < 0) {
+                this.onError(XMLParserErrorCode.UnterminatedComment);
+                return;
+              }
+              this.onComment(s.substring(j + 3, q));
+              j = q + 3;
+            } else if (s.substring(j + 1, j + 8) === "[CDATA[") {
+              q = s.indexOf("]]>", j + 8);
+              if (q < 0) {
+                this.onError(XMLParserErrorCode.UnterminatedCdat);
+                return;
+              }
+              this.onCdata(s.substring(j + 8, q));
+              j = q + 3;
+            } else if (s.substring(j + 1, j + 8) === "DOCTYPE") {
+              const q2 = s.indexOf("[", j + 8);
+              let complexDoctype = false;
+              q = s.indexOf(">", j + 8);
+              if (q < 0) {
+                this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
+                return;
+              }
+              if (q2 > 0 && q > q2) {
+                q = s.indexOf("]>", j + 8);
+                if (q < 0) {
+                  this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
+                  return;
+                }
+                complexDoctype = true;
+              }
+              const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0));
+              this.onDoctype(doctypeContent);
+              j = q + (complexDoctype ? 2 : 1);
+            } else {
+              this.onError(XMLParserErrorCode.MalformedElement);
+              return;
+            }
+            break;
+          default:
+            const content = this._parseContent(s, j);
+            if (content === null) {
+              this.onError(XMLParserErrorCode.MalformedElement);
+              return;
+            }
+            let isClosed = false;
+            if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") {
+              isClosed = true;
+            } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") {
+              this.onError(XMLParserErrorCode.UnterminatedElement);
+              return;
+            }
+            this.onBeginElement(content.name, content.attributes, isClosed);
+            j += content.parsed + (isClosed ? 2 : 1);
+            break;
+        }
+      } else {
+        while (j < s.length && s[j] !== "<") {
+          j++;
+        }
+        const text = s.substring(i, j);
+        this.onText(this._resolveEntities(text));
+      }
+      i = j;
+    }
+  }
+  onResolveEntity(name) {
+    return `&${name};`;
+  }
+  onPi(name, value) {}
+  onComment(text) {}
+  onCdata(text) {}
+  onDoctype(doctypeContent) {}
+  onText(text) {}
+  onBeginElement(name, attributes, isEmpty) {}
+  onEndElement(name) {}
+  onError(code) {}
+}
+class SimpleDOMNode {
+  constructor(nodeName, nodeValue) {
+    this.nodeName = nodeName;
+    this.nodeValue = nodeValue;
+    Object.defineProperty(this, "parentNode", {
+      value: null,
+      writable: true
+    });
+  }
+  get firstChild() {
+    return this.childNodes?.[0];
+  }
+  get nextSibling() {
+    const childNodes = this.parentNode.childNodes;
+    if (!childNodes) {
+      return undefined;
+    }
+    const index = childNodes.indexOf(this);
+    if (index === -1) {
+      return undefined;
+    }
+    return childNodes[index + 1];
+  }
+  get textContent() {
+    if (!this.childNodes) {
+      return this.nodeValue || "";
+    }
+    return this.childNodes.map(child => child.textContent).join("");
+  }
+  get children() {
+    return this.childNodes || [];
+  }
+  hasChildNodes() {
+    return this.childNodes?.length > 0;
+  }
+  searchNode(paths, pos) {
+    if (pos >= paths.length) {
+      return this;
+    }
+    const component = paths[pos];
+    if (component.name.startsWith("#") && pos < paths.length - 1) {
+      return this.searchNode(paths, pos + 1);
+    }
+    const stack = [];
+    let node = this;
+    while (true) {
+      if (component.name === node.nodeName) {
+        if (component.pos === 0) {
+          const res = node.searchNode(paths, pos + 1);
+          if (res !== null) {
+            return res;
+          }
+        } else if (stack.length === 0) {
+          return null;
+        } else {
+          const [parent] = stack.pop();
+          let siblingPos = 0;
+          for (const child of parent.childNodes) {
+            if (component.name === child.nodeName) {
+              if (siblingPos === component.pos) {
+                return child.searchNode(paths, pos + 1);
+              }
+              siblingPos++;
+            }
+          }
+          return node.searchNode(paths, pos + 1);
+        }
+      }
+      if (node.childNodes?.length > 0) {
+        stack.push([node, 0]);
+        node = node.childNodes[0];
+      } else if (stack.length === 0) {
+        return null;
+      } else {
+        while (stack.length !== 0) {
+          const [parent, currentPos] = stack.pop();
+          const newPos = currentPos + 1;
+          if (newPos < parent.childNodes.length) {
+            stack.push([parent, newPos]);
+            node = parent.childNodes[newPos];
+            break;
+          }
+        }
+        if (stack.length === 0) {
+          return null;
+        }
+      }
+    }
+  }
+  dump(buffer) {
+    if (this.nodeName === "#text") {
+      buffer.push(encodeToXmlString(this.nodeValue));
+      return;
+    }
+    buffer.push(`<${this.nodeName}`);
+    if (this.attributes) {
+      for (const attribute of this.attributes) {
+        buffer.push(` ${attribute.name}="${encodeToXmlString(attribute.value)}"`);
+      }
+    }
+    if (this.hasChildNodes()) {
+      buffer.push(">");
+      for (const child of this.childNodes) {
+        child.dump(buffer);
+      }
+      buffer.push(`</${this.nodeName}>`);
+    } else if (this.nodeValue) {
+      buffer.push(`>${encodeToXmlString(this.nodeValue)}</${this.nodeName}>`);
+    } else {
+      buffer.push("/>");
+    }
+  }
+}
+class SimpleXMLParser extends XMLParserBase {
+  constructor({
+    hasAttributes = false,
+    lowerCaseName = false
+  }) {
+    super();
+    this._currentFragment = null;
+    this._stack = null;
+    this._errorCode = XMLParserErrorCode.NoError;
+    this._hasAttributes = hasAttributes;
+    this._lowerCaseName = lowerCaseName;
+  }
+  parseFromString(data) {
+    this._currentFragment = [];
+    this._stack = [];
+    this._errorCode = XMLParserErrorCode.NoError;
+    this.parseXml(data);
+    if (this._errorCode !== XMLParserErrorCode.NoError) {
+      return undefined;
+    }
+    const [documentElement] = this._currentFragment;
+    if (!documentElement) {
+      return undefined;
+    }
+    return {
+      documentElement
+    };
+  }
+  onText(text) {
+    if (isWhitespaceString(text)) {
+      return;
+    }
+    const node = new SimpleDOMNode("#text", text);
+    this._currentFragment.push(node);
+  }
+  onCdata(text) {
+    const node = new SimpleDOMNode("#text", text);
+    this._currentFragment.push(node);
+  }
+  onBeginElement(name, attributes, isEmpty) {
+    if (this._lowerCaseName) {
+      name = name.toLowerCase();
+    }
+    const node = new SimpleDOMNode(name);
+    node.childNodes = [];
+    if (this._hasAttributes) {
+      node.attributes = attributes;
+    }
+    this._currentFragment.push(node);
+    if (isEmpty) {
+      return;
+    }
+    this._stack.push(this._currentFragment);
+    this._currentFragment = node.childNodes;
+  }
+  onEndElement(name) {
+    this._currentFragment = this._stack.pop() || [];
+    const lastElement = this._currentFragment.at(-1);
+    if (!lastElement) {
+      return null;
+    }
+    for (const childNode of lastElement.childNodes) {
+      childNode.parentNode = lastElement;
+    }
+    return lastElement;
+  }
+  onError(code) {
+    this._errorCode = code;
+  }
+}
+
+;// ./src/core/metadata_parser.js
+
+class MetadataParser {
+  constructor(data) {
+    data = this._repair(data);
+    const parser = new SimpleXMLParser({
+      lowerCaseName: true
+    });
+    const xmlDocument = parser.parseFromString(data);
+    this._metadataMap = new Map();
+    this._data = data;
+    if (xmlDocument) {
+      this._parse(xmlDocument);
+    }
+  }
+  _repair(data) {
+    return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) {
+      const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {
+        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
+      }).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) {
+        switch (name) {
+          case "amp":
+            return "&";
+          case "apos":
+            return "'";
+          case "gt":
+            return ">";
+          case "lt":
+            return "<";
+          case "quot":
+            return '"';
+        }
+        throw new Error(`_repair: ${name} isn't defined.`);
+      });
+      const charBuf = [">"];
+      for (let i = 0, ii = bytes.length; i < ii; i += 2) {
+        const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
+        if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) {
+          charBuf.push(String.fromCharCode(code));
+        } else {
+          charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";");
+        }
+      }
+      return charBuf.join("");
+    });
+  }
+  _getSequence(entry) {
+    const name = entry.nodeName;
+    if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") {
+      return null;
+    }
+    return entry.childNodes.filter(node => node.nodeName === "rdf:li");
+  }
+  _parseArray(entry) {
+    if (!entry.hasChildNodes()) {
+      return;
+    }
+    const [seqNode] = entry.childNodes;
+    const sequence = this._getSequence(seqNode) || [];
+    this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim()));
+  }
+  _parse(xmlDocument) {
+    let rdf = xmlDocument.documentElement;
+    if (rdf.nodeName !== "rdf:rdf") {
+      rdf = rdf.firstChild;
+      while (rdf && rdf.nodeName !== "rdf:rdf") {
+        rdf = rdf.nextSibling;
+      }
+    }
+    if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) {
+      return;
+    }
+    for (const desc of rdf.childNodes) {
+      if (desc.nodeName !== "rdf:description") {
+        continue;
+      }
+      for (const entry of desc.childNodes) {
+        const name = entry.nodeName;
+        switch (name) {
+          case "#text":
+            continue;
+          case "dc:creator":
+          case "dc:subject":
+            this._parseArray(entry);
+            continue;
+        }
+        this._metadataMap.set(name, entry.textContent.trim());
+      }
+    }
+  }
+  get serializable() {
+    return {
+      parsedData: this._metadataMap,
+      rawData: this._data
+    };
+  }
+}
+
+;// ./src/core/struct_tree.js
+
+
+
+
+
+
+
+const MAX_DEPTH = 40;
+const StructElementType = {
+  PAGE_CONTENT: 1,
+  STREAM_CONTENT: 2,
+  OBJECT: 3,
+  ANNOTATION: 4,
+  ELEMENT: 5
+};
+class StructTreeRoot {
+  kidRefToPosition = undefined;
+  parentTree = null;
+  roleMap = new Map();
+  structParentIds = null;
+  constructor(xref, rootDict, rootRef) {
+    this.xref = xref;
+    this.dict = rootDict;
+    this.ref = rootRef instanceof Ref ? rootRef : null;
+    const roleMap = rootDict.get("RoleMap");
+    if (roleMap instanceof Dict) {
+      for (const [key, value] of roleMap) {
+        if (value instanceof Name) {
+          this.roleMap.set(key, value.name);
+        }
+      }
+    }
+    const parentTree = rootDict.getRaw("ParentTree");
+    if (parentTree) {
+      this.parentTree = new NumberTree(parentTree, xref);
+    }
+  }
+  getKidPosition(kidRef) {
+    if (this.kidRefToPosition === undefined) {
+      const obj = this.dict.get("K");
+      if (Array.isArray(obj)) {
+        const map = this.kidRefToPosition = new Map();
+        for (let i = 0, ii = obj.length; i < ii; i++) {
+          const ref = obj[i];
+          if (ref) {
+            map.set(ref.toString(), i);
+          }
+        }
+      } else if (obj instanceof Dict) {
+        this.kidRefToPosition = new Map([[obj.objId, 0]]);
+      } else if (!obj) {
+        this.kidRefToPosition = new Map();
+      } else {
+        this.kidRefToPosition = null;
+      }
+    }
+    return this.kidRefToPosition ? this.kidRefToPosition.get(kidRef) ?? NaN : -1;
+  }
+  #addIdToPage(pageRef, id, type) {
+    if (!(pageRef instanceof Ref) || id < 0) {
+      return;
+    }
+    this.structParentIds ||= new RefSetCache();
+    let ids = this.structParentIds.get(pageRef);
+    if (!ids) {
+      ids = [];
+      this.structParentIds.put(pageRef, ids);
+    }
+    ids.push([id, type]);
+  }
+  addAnnotationIdToPage(pageRef, id) {
+    this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION);
+  }
+  static async canCreateStructureTree({
+    catalogRef,
+    pdfManager,
+    newAnnotationsByPage
+  }) {
+    if (!(catalogRef instanceof Ref)) {
+      warn("Cannot save the struct tree: no catalog reference.");
+      return false;
+    }
+    let nextKey = 0;
+    let hasNothingToUpdate = true;
+    for (const [pageIndex, elements] of newAnnotationsByPage) {
+      const {
+        ref: pageRef
+      } = await pdfManager.getPage(pageIndex);
+      if (!(pageRef instanceof Ref)) {
+        warn(`Cannot save the struct tree: page ${pageIndex} has no ref.`);
+        hasNothingToUpdate = true;
+        break;
+      }
+      for (const element of elements) {
+        if (element.accessibilityData?.type) {
+          element.parentTreeId = nextKey++;
+          hasNothingToUpdate = false;
+        }
+      }
+    }
+    if (hasNothingToUpdate) {
+      for (const elements of newAnnotationsByPage.values()) {
+        for (const element of elements) {
+          delete element.parentTreeId;
+        }
+      }
+      return false;
+    }
+    return true;
+  }
+  static async createStructureTree({
+    newAnnotationsByPage,
+    xref,
+    catalogRef,
+    pdfManager,
+    changes
+  }) {
+    const root = await pdfManager.ensureCatalog("cloneDict");
+    const cache = new RefSetCache();
+    cache.put(catalogRef, root);
+    const structTreeRootRef = xref.getNewTemporaryRef();
+    root.set("StructTreeRoot", structTreeRootRef);
+    const structTreeRoot = new Dict(xref);
+    structTreeRoot.set("Type", Name.get("StructTreeRoot"));
+    const parentTreeRef = xref.getNewTemporaryRef();
+    structTreeRoot.set("ParentTree", parentTreeRef);
+    const kids = [];
+    structTreeRoot.set("K", kids);
+    cache.put(structTreeRootRef, structTreeRoot);
+    const parentTree = new Dict(xref);
+    const nums = [];
+    parentTree.set("Nums", nums);
+    const nextKey = await this.#writeKids({
+      newAnnotationsByPage,
+      structTreeRootRef,
+      structTreeRoot: null,
+      kids,
+      nums,
+      xref,
+      pdfManager,
+      changes,
+      cache
+    });
+    structTreeRoot.set("ParentTreeNextKey", nextKey);
+    cache.put(parentTreeRef, parentTree);
+    for (const [ref, obj] of cache.items()) {
+      changes.put(ref, {
+        data: obj
+      });
+    }
+  }
+  async canUpdateStructTree({
+    pdfManager,
+    newAnnotationsByPage
+  }) {
+    if (!this.ref) {
+      warn("Cannot update the struct tree: no root reference.");
+      return false;
+    }
+    let nextKey = this.dict.get("ParentTreeNextKey");
+    if (!Number.isInteger(nextKey) || nextKey < 0) {
+      warn("Cannot update the struct tree: invalid next key.");
+      return false;
+    }
+    const parentTree = this.dict.get("ParentTree");
+    if (!(parentTree instanceof Dict)) {
+      warn("Cannot update the struct tree: ParentTree isn't a dict.");
+      return false;
+    }
+    const nums = parentTree.get("Nums");
+    if (!Array.isArray(nums)) {
+      warn("Cannot update the struct tree: nums isn't an array.");
+      return false;
+    }
+    const numberTree = new NumberTree(parentTree, this.xref);
+    for (const pageIndex of newAnnotationsByPage.keys()) {
+      const {
+        pageDict
+      } = await pdfManager.getPage(pageIndex);
+      if (!pageDict.has("StructParents")) {
+        continue;
+      }
+      const id = pageDict.get("StructParents");
+      if (!Number.isInteger(id) || !Array.isArray(numberTree.get(id))) {
+        warn(`Cannot save the struct tree: page ${pageIndex} has a wrong id.`);
+        return false;
+      }
+    }
+    let hasNothingToUpdate = true;
+    for (const [pageIndex, elements] of newAnnotationsByPage) {
+      const {
+        pageDict
+      } = await pdfManager.getPage(pageIndex);
+      StructTreeRoot.#collectParents({
+        elements,
+        xref: this.xref,
+        pageDict,
+        numberTree
+      });
+      for (const element of elements) {
+        if (element.accessibilityData?.type) {
+          if (!(element.accessibilityData.structParent >= 0)) {
+            element.parentTreeId = nextKey++;
+          }
+          hasNothingToUpdate = false;
+        }
+      }
+    }
+    if (hasNothingToUpdate) {
+      for (const elements of newAnnotationsByPage.values()) {
+        for (const element of elements) {
+          delete element.parentTreeId;
+          delete element.structTreeParent;
+        }
+      }
+      return false;
+    }
+    return true;
+  }
+  async updateStructureTree({
+    newAnnotationsByPage,
+    pdfManager,
+    changes
+  }) {
+    const {
+      ref: structTreeRootRef,
+      xref
+    } = this;
+    const structTreeRoot = this.dict.clone();
+    const cache = new RefSetCache();
+    cache.put(structTreeRootRef, structTreeRoot);
+    let parentTreeRef = structTreeRoot.getRaw("ParentTree");
+    let parentTree;
+    if (parentTreeRef instanceof Ref) {
+      parentTree = xref.fetch(parentTreeRef);
+    } else {
+      parentTree = parentTreeRef;
+      parentTreeRef = xref.getNewTemporaryRef();
+      structTreeRoot.set("ParentTree", parentTreeRef);
+    }
+    parentTree = parentTree.clone();
+    cache.put(parentTreeRef, parentTree);
+    let nums = parentTree.getRaw("Nums");
+    let numsRef = null;
+    if (nums instanceof Ref) {
+      numsRef = nums;
+      nums = xref.fetch(numsRef);
+    }
+    nums = nums.slice();
+    if (!numsRef) {
+      parentTree.set("Nums", nums);
+    }
+    const newNextKey = await StructTreeRoot.#writeKids({
+      newAnnotationsByPage,
+      structTreeRootRef,
+      structTreeRoot: this,
+      kids: null,
+      nums,
+      xref,
+      pdfManager,
+      changes,
+      cache
+    });
+    if (newNextKey === -1) {
+      return;
+    }
+    structTreeRoot.set("ParentTreeNextKey", newNextKey);
+    if (numsRef) {
+      cache.put(numsRef, nums);
+    }
+    for (const [ref, obj] of cache.items()) {
+      changes.put(ref, {
+        data: obj
+      });
+    }
+  }
+  static async #writeKids({
+    newAnnotationsByPage,
+    structTreeRootRef,
+    structTreeRoot,
+    kids,
+    nums,
+    xref,
+    pdfManager,
+    changes,
+    cache
+  }) {
+    const objr = Name.get("OBJR");
+    let nextKey = -1;
+    let structTreePageObjs;
+    for (const [pageIndex, elements] of newAnnotationsByPage) {
+      const page = await pdfManager.getPage(pageIndex);
+      const {
+        ref: pageRef
+      } = page;
+      const isPageRef = pageRef instanceof Ref;
+      for (const {
+        accessibilityData,
+        ref,
+        parentTreeId,
+        structTreeParent
+      } of elements) {
+        if (!accessibilityData?.type) {
+          continue;
+        }
+        const {
+          structParent
+        } = accessibilityData;
+        if (structTreeRoot && Number.isInteger(structParent) && structParent >= 0) {
+          let objs = (structTreePageObjs ||= new Map()).get(pageIndex);
+          if (objs === undefined) {
+            const structTreePage = new StructTreePage(structTreeRoot, page.pageDict);
+            objs = structTreePage.collectObjects(pageRef);
+            structTreePageObjs.set(pageIndex, objs);
+          }
+          const objRef = objs?.get(structParent);
+          if (objRef) {
+            const tagDict = xref.fetch(objRef).clone();
+            StructTreeRoot.#writeProperties(tagDict, accessibilityData);
+            changes.put(objRef, {
+              data: tagDict
+            });
+            continue;
+          }
+        }
+        nextKey = Math.max(nextKey, parentTreeId);
+        const tagRef = xref.getNewTemporaryRef();
+        const tagDict = new Dict(xref);
+        StructTreeRoot.#writeProperties(tagDict, accessibilityData);
+        await this.#updateParentTag({
+          structTreeParent,
+          tagDict,
+          newTagRef: tagRef,
+          structTreeRootRef,
+          fallbackKids: kids,
+          xref,
+          cache
+        });
+        const objDict = new Dict(xref);
+        tagDict.set("K", objDict);
+        objDict.set("Type", objr);
+        if (isPageRef) {
+          objDict.set("Pg", pageRef);
+        }
+        objDict.set("Obj", ref);
+        cache.put(tagRef, tagDict);
+        nums.push(parentTreeId, tagRef);
+      }
+    }
+    return nextKey + 1;
+  }
+  static #writeProperties(tagDict, {
+    type,
+    title,
+    lang,
+    alt,
+    expanded,
+    actualText
+  }) {
+    tagDict.set("S", Name.get(type));
+    if (title) {
+      tagDict.set("T", stringToAsciiOrUTF16BE(title));
+    }
+    if (lang) {
+      tagDict.set("Lang", stringToAsciiOrUTF16BE(lang));
+    }
+    if (alt) {
+      tagDict.set("Alt", stringToAsciiOrUTF16BE(alt));
+    }
+    if (expanded) {
+      tagDict.set("E", stringToAsciiOrUTF16BE(expanded));
+    }
+    if (actualText) {
+      tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText));
+    }
+  }
+  static #collectParents({
+    elements,
+    xref,
+    pageDict,
+    numberTree
+  }) {
+    const idToElements = new Map();
+    for (const element of elements) {
+      if (element.structTreeParentId) {
+        const id = parseInt(element.structTreeParentId.split("_mc")[1], 10);
+        idToElements.getOrInsertComputed(id, makeArr).push(element);
+      }
+    }
+    const id = pageDict.get("StructParents");
+    if (!Number.isInteger(id)) {
+      return;
+    }
+    const parentArray = numberTree.get(id);
+    const updateElement = (kid, pageKid, kidRef) => {
+      const elems = idToElements.get(kid);
+      if (elems) {
+        const parentRef = pageKid.getRaw("P");
+        const parentDict = xref.fetchIfRef(parentRef);
+        if (parentRef instanceof Ref && parentDict instanceof Dict) {
+          const params = {
+            ref: kidRef,
+            dict: pageKid
+          };
+          for (const element of elems) {
+            element.structTreeParent = params;
+          }
+        }
+        return true;
+      }
+      return false;
+    };
+    for (const kidRef of parentArray) {
+      if (!(kidRef instanceof Ref)) {
+        continue;
+      }
+      const pageKid = xref.fetch(kidRef);
+      const k = pageKid.get("K");
+      if (Number.isInteger(k)) {
+        updateElement(k, pageKid, kidRef);
+        continue;
+      }
+      if (!Array.isArray(k)) {
+        continue;
+      }
+      for (let kid of k) {
+        kid = xref.fetchIfRef(kid);
+        if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) {
+          break;
+        }
+        if (!(kid instanceof Dict)) {
+          continue;
+        }
+        if (!isName(kid.get("Type"), "MCR")) {
+          break;
+        }
+        const mcid = kid.get("MCID");
+        if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) {
+          break;
+        }
+      }
+    }
+  }
+  static async #updateParentTag({
+    structTreeParent,
+    tagDict,
+    newTagRef,
+    structTreeRootRef,
+    fallbackKids,
+    xref,
+    cache
+  }) {
+    let ref = null;
+    let parentRef;
+    if (structTreeParent) {
+      ({
+        ref
+      } = structTreeParent);
+      parentRef = structTreeParent.dict.getRaw("P") || structTreeRootRef;
+    } else {
+      parentRef = structTreeRootRef;
+    }
+    tagDict.set("P", parentRef);
+    const parentDict = xref.fetchIfRef(parentRef);
+    if (!parentDict) {
+      fallbackKids.push(newTagRef);
+      return;
+    }
+    let cachedParentDict = cache.get(parentRef);
+    if (!cachedParentDict) {
+      cachedParentDict = parentDict.clone();
+      cache.put(parentRef, cachedParentDict);
+    }
+    const parentKidsRaw = cachedParentDict.getRaw("K");
+    let cachedParentKids = parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null;
+    if (!cachedParentKids) {
+      cachedParentKids = xref.fetchIfRef(parentKidsRaw);
+      cachedParentKids = Array.isArray(cachedParentKids) ? cachedParentKids.slice() : [parentKidsRaw];
+      const parentKidsRef = xref.getNewTemporaryRef();
+      cachedParentDict.set("K", parentKidsRef);
+      cache.put(parentKidsRef, cachedParentKids);
+    }
+    const index = cachedParentKids.indexOf(ref);
+    cachedParentKids.splice(index >= 0 ? index + 1 : cachedParentKids.length, 0, newTagRef);
+  }
+}
+class StructElementNode {
+  constructor(tree, dict) {
+    this.tree = tree;
+    this.xref = tree.xref;
+    this.dict = dict;
+    this.kids = [];
+    this.parseKids();
+  }
+  get role() {
+    const nameObj = this.dict.get("S");
+    const name = nameObj instanceof Name ? nameObj.name : "";
+    const {
+      root
+    } = this.tree;
+    return root.roleMap.get(name) ?? name;
+  }
+  get mathML() {
+    let AFs = this.dict.get("AF") || [];
+    if (!Array.isArray(AFs)) {
+      AFs = [AFs];
+    }
+    for (let af of AFs) {
+      af = this.xref.fetchIfRef(af);
+      if (!isDict(af, "Filespec") || !isName(af.get("AFRelationship"), "Supplement")) {
+        continue;
+      }
+      const fileStream = FileSpec.pickPlatformItem(af.get("EF"));
+      if (!(fileStream instanceof BaseStream) || !isDict(fileStream.dict, "EmbeddedFile") || !isName(fileStream.dict.get("Subtype"), "application/mathml+xml")) {
+        continue;
+      }
+      return stringToUTF8String(fileStream.getString());
+    }
+    const A = this.dict.get("A");
+    if (A instanceof Dict) {
+      const O = A.get("O");
+      if (isName(O, "MSFT_Office")) {
+        const mathml = A.get("MSFT_MathML");
+        return mathml ? stringToPDFString(mathml) : null;
+      }
+    }
+    return null;
+  }
+  parseKids() {
+    let pageObjId = null;
+    const objRef = this.dict.getRaw("Pg");
+    if (objRef instanceof Ref) {
+      pageObjId = objRef.toString();
+    }
+    const kids = this.dict.get("K");
+    if (Array.isArray(kids)) {
+      for (const kid of kids) {
+        const element = this.parseKid(pageObjId, this.xref.fetchIfRef(kid));
+        if (element) {
+          this.kids.push(element);
+        }
+      }
+    } else {
+      const element = this.parseKid(pageObjId, kids);
+      if (element) {
+        this.kids.push(element);
+      }
+    }
+  }
+  parseKid(pageObjId, kid) {
+    if (Number.isInteger(kid)) {
+      if (this.tree.pageDict.objId !== pageObjId) {
+        return null;
+      }
+      return new StructElement({
+        type: StructElementType.PAGE_CONTENT,
+        mcid: kid,
+        pageObjId
+      });
+    }
+    if (!(kid instanceof Dict)) {
+      return null;
+    }
+    const pageRef = kid.getRaw("Pg");
+    if (pageRef instanceof Ref) {
+      pageObjId = pageRef.toString();
+    }
+    const type = kid.get("Type") instanceof Name ? kid.get("Type").name : null;
+    if (type === "MCR") {
+      if (this.tree.pageDict.objId !== pageObjId) {
+        return null;
+      }
+      const kidRef = kid.getRaw("Stm");
+      return new StructElement({
+        type: StructElementType.STREAM_CONTENT,
+        refObjId: kidRef instanceof Ref ? kidRef.toString() : null,
+        pageObjId,
+        mcid: kid.get("MCID")
+      });
+    }
+    if (type === "OBJR") {
+      if (this.tree.pageDict.objId !== pageObjId) {
+        return null;
+      }
+      const kidRef = kid.getRaw("Obj");
+      return new StructElement({
+        type: StructElementType.OBJECT,
+        refObjId: kidRef instanceof Ref ? kidRef.toString() : null,
+        pageObjId
+      });
+    }
+    return new StructElement({
+      type: StructElementType.ELEMENT,
+      dict: kid
+    });
+  }
+}
+class StructElement {
+  constructor({
+    type,
+    dict = null,
+    mcid = null,
+    pageObjId = null,
+    refObjId = null
+  }) {
+    this.type = type;
+    this.dict = dict;
+    this.mcid = mcid;
+    this.pageObjId = pageObjId;
+    this.refObjId = refObjId;
+    this.parentNode = null;
+  }
+}
+class StructTreePage {
+  constructor(structTreeRoot, pageDict) {
+    this.root = structTreeRoot;
+    this.xref = structTreeRoot?.xref ?? null;
+    this.rootDict = structTreeRoot?.dict ?? null;
+    this.pageDict = pageDict;
+    this.nodes = [];
+  }
+  collectObjects(pageRef) {
+    if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) {
+      return null;
+    }
+    const parentTree = this.rootDict.get("ParentTree");
+    if (!parentTree) {
+      return null;
+    }
+    const ids = this.root.structParentIds?.get(pageRef);
+    if (!ids) {
+      return null;
+    }
+    const map = new Map();
+    const numberTree = new NumberTree(parentTree, this.xref);
+    for (const [elemId] of ids) {
+      const obj = numberTree.getRaw(elemId);
+      if (obj instanceof Ref) {
+        map.set(elemId, obj);
+      }
+    }
+    return map;
+  }
+  parse(pageRef) {
+    if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) {
+      return;
+    }
+    const {
+      parentTree
+    } = this.root;
+    if (!parentTree) {
+      return;
+    }
+    const id = this.pageDict.get("StructParents");
+    const ids = this.root.structParentIds?.get(pageRef);
+    if (!Number.isInteger(id) && !ids) {
+      return;
+    }
+    const map = new Map();
+    if (Number.isInteger(id)) {
+      const parentArray = parentTree.get(id);
+      if (Array.isArray(parentArray)) {
+        for (const ref of parentArray) {
+          if (ref instanceof Ref) {
+            this.addNode(this.xref.fetch(ref), map);
+          }
+        }
+      }
+    }
+    if (!ids) {
+      return;
+    }
+    for (const [elemId, type] of ids) {
+      const obj = parentTree.get(elemId);
+      if (obj) {
+        const elem = this.addNode(this.xref.fetchIfRef(obj), map);
+        if (elem?.kids?.length === 1 && elem.kids[0].type === StructElementType.OBJECT) {
+          elem.kids[0].type = type;
+        }
+      }
+    }
+  }
+  addNode(dict, map, level = 0) {
+    if (level > MAX_DEPTH) {
+      warn("StructTree MAX_DEPTH reached.");
+      return null;
+    }
+    if (!(dict instanceof Dict)) {
+      return null;
+    }
+    if (map.has(dict)) {
+      return map.get(dict);
+    }
+    const element = new StructElementNode(this, dict);
+    map.set(dict, element);
+    switch (element.role) {
+      case "L":
+      case "LBody":
+      case "LI":
+      case "Table":
+      case "THead":
+      case "TBody":
+      case "TFoot":
+      case "TR":
+        {
+          for (const kid of element.kids) {
+            if (kid.type === StructElementType.ELEMENT) {
+              this.addNode(kid.dict, map, level - 1);
+            }
+          }
+        }
+    }
+    const parent = dict.get("P");
+    if (!(parent instanceof Dict) || isName(parent.get("Type"), "StructTreeRoot")) {
+      if (!this.addTopLevelNode(dict, element)) {
+        map.delete(dict);
+      }
+      return element;
+    }
+    const parentNode = this.addNode(parent, map, level + 1);
+    if (!parentNode) {
+      return element;
+    }
+    let save = false;
+    for (const kid of parentNode.kids) {
+      if (kid.type === StructElementType.ELEMENT && kid.dict === dict) {
+        kid.parentNode = element;
+        save = true;
+      }
+    }
+    if (!save) {
+      map.delete(dict);
+    }
+    return element;
+  }
+  addTopLevelNode(dict, element) {
+    const index = this.root.getKidPosition(dict.objId);
+    if (isNaN(index)) {
+      return false;
+    }
+    if (index !== -1) {
+      this.nodes[index] = element;
+    }
+    return true;
+  }
+  get serializable() {
+    function nodeToSerializable(node, parent, level = 0) {
+      if (level > MAX_DEPTH) {
+        warn("StructTree too deep to be fully serialized.");
+        return;
+      }
+      const obj = Object.create(null);
+      obj.role = node.role;
+      obj.children = [];
+      parent.children.push(obj);
+      let alt = node.dict.get("Alt");
+      if (typeof alt !== "string") {
+        alt = node.dict.get("ActualText");
+      }
+      if (typeof alt === "string") {
+        obj.alt = stringToPDFString(alt);
+      }
+      if (obj.role === "Formula") {
+        try {
+          const {
+            mathML
+          } = node;
+          if (mathML) {
+            obj.mathML = mathML;
+          }
+        } catch (ex) {
+          if (ex instanceof MissingDataException) {
+            throw ex;
+          }
+          warn(`Ignoring mathML: "${ex}".`);
+        }
+      }
+      const a = node.dict.get("A");
+      if (a instanceof Dict) {
+        const bbox = lookupNormalRect(a.getArray("BBox"), null);
+        if (bbox) {
+          obj.bbox = bbox;
+        } else {
+          const width = a.get("Width");
+          const height = a.get("Height");
+          if (typeof width === "number" && width > 0 && typeof height === "number" && height > 0) {
+            obj.bbox = [0, 0, width, height];
+          }
+        }
+      }
+      const lang = node.dict.get("Lang");
+      if (typeof lang === "string") {
+        obj.lang = stringToPDFString(lang);
+      }
+      for (const kid of node.kids) {
+        const kidElement = kid.type === StructElementType.ELEMENT ? kid.parentNode : null;
+        if (kidElement) {
+          nodeToSerializable(kidElement, obj, level + 1);
+          continue;
+        } else if (kid.type === StructElementType.PAGE_CONTENT || kid.type === StructElementType.STREAM_CONTENT) {
+          obj.children.push({
+            type: "content",
+            id: `p${kid.pageObjId}_mc${kid.mcid}`
+          });
+        } else if (kid.type === StructElementType.OBJECT) {
+          obj.children.push({
+            type: "object",
+            id: kid.refObjId
+          });
+        } else if (kid.type === StructElementType.ANNOTATION) {
+          obj.children.push({
+            type: "annotation",
+            id: `${AnnotationPrefix}${kid.refObjId}`
+          });
+        }
+      }
+    }
+    const root = Object.create(null);
+    root.children = [];
+    root.role = "Root";
+    for (const child of this.nodes) {
+      if (!child) {
+        continue;
+      }
+      nodeToSerializable(child, root);
+    }
+    return root;
+  }
+}
+
+;// ./src/core/catalog.js
+
+
+
+
+
+
+
+
+
+
+
+
+const isRef = v => v instanceof Ref;
+const isValidExplicitDest = _isValidExplicitDest.bind(null, isRef, isName);
+function fetchDest(dest) {
+  if (dest instanceof Dict) {
+    dest = dest.get("D");
+  }
+  return isValidExplicitDest(dest) ? dest : null;
+}
+function fetchRemoteDest(action) {
+  let dest = action.get("D");
+  if (dest) {
+    if (dest instanceof Name) {
+      dest = dest.name;
+    }
+    if (typeof dest === "string") {
+      return stringToPDFString(dest, true);
+    } else if (isValidExplicitDest(dest)) {
+      return JSON.stringify(dest);
+    }
+  }
+  return null;
+}
+class Catalog {
+  #actualNumPages = null;
+  #annotationAttachmentIdByRef = new RefSetCache();
+  #annotationAttachmentRefById = new Map();
+  #catDict = 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(pdfManager, xref) {
+    this.pdfManager = pdfManager;
+    this.xref = xref;
+    this.#catDict = xref.getCatalogObj();
+    if (!(this.#catDict instanceof Dict)) {
+      throw new FormatError("Catalog object is not a dictionary.");
+    }
+    this.toplevelPagesDict;
+  }
+  cloneDict() {
+    return this.#catDict.clone();
+  }
+  getAttachmentIdForAnnotation(ref) {
+    let id = this.#annotationAttachmentIdByRef.get(ref);
+    if (id) {
+      return id;
+    }
+    const baseId = `attachmentRef:${ref.toString()}`;
+    id = baseId;
+    let i = 1;
+    while (this.#annotationAttachmentRefById.has(id) || this.attachments?.has(id)) {
+      id = `${baseId}-${i++}`;
+    }
+    this.#annotationAttachmentIdByRef.put(ref, id);
+    this.#annotationAttachmentRefById.set(id, ref);
+    return id;
+  }
+  get version() {
+    const version = this.#catDict.get("Version");
+    if (version instanceof Name) {
+      if (PDF_VERSION_REGEXP.test(version.name)) {
+        return shadow(this, "version", version.name);
+      }
+      warn(`Invalid PDF catalog version: ${version.name}`);
+    }
+    return shadow(this, "version", null);
+  }
+  get lang() {
+    const lang = this.#catDict.get("Lang");
+    return shadow(this, "lang", lang && typeof lang === "string" ? stringToPDFString(lang) : null);
+  }
+  get needsRendering() {
+    const needsRendering = this.#catDict.get("NeedsRendering");
+    return shadow(this, "needsRendering", typeof needsRendering === "boolean" ? needsRendering : false);
+  }
+  get collection() {
+    let collection = null;
+    try {
+      const obj = this.#catDict.get("Collection");
+      if (obj instanceof Dict && obj.size > 0) {
+        collection = obj;
+      }
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      info("Cannot fetch Collection entry; assuming no collection is present.");
+    }
+    return shadow(this, "collection", collection);
+  }
+  get acroForm() {
+    let acroForm = null;
+    try {
+      const obj = this.#catDict.get("AcroForm");
+      if (obj instanceof Dict && obj.size > 0) {
+        acroForm = obj;
+      }
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      info("Cannot fetch AcroForm entry; assuming no forms are present.");
+    }
+    return shadow(this, "acroForm", acroForm);
+  }
+  get acroFormRef() {
+    const value = this.#catDict.getRaw("AcroForm");
+    return shadow(this, "acroFormRef", value instanceof Ref ? value : null);
+  }
+  get metadata() {
+    const streamRef = this.#catDict.getRaw("Metadata");
+    if (!(streamRef instanceof Ref)) {
+      return shadow(this, "metadata", null);
+    }
+    let metadata = null;
+    try {
+      const stream = this.xref.fetch(streamRef, !this.xref.encrypt?.encryptMetadata);
+      if (stream instanceof BaseStream && isDict(stream.dict, "Metadata") && isName(stream.dict.get("Subtype"), "XML")) {
+        const data = stringToUTF8String(stream.getString());
+        if (data) {
+          metadata = new MetadataParser(data).serializable;
+        }
+      }
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      info(`Skipping invalid Metadata: "${ex}".`);
+    }
+    return shadow(this, "metadata", metadata);
+  }
+  get markInfo() {
+    let markInfo = null;
+    try {
+      markInfo = this.#readMarkInfo();
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn("Unable to read mark info.");
+    }
+    return shadow(this, "markInfo", markInfo);
+  }
+  #readMarkInfo() {
+    const obj = this.#catDict.get("MarkInfo");
+    if (!(obj instanceof Dict)) {
+      return null;
+    }
+    const markInfo = {
+      Marked: false,
+      UserProperties: false,
+      Suspects: false
+    };
+    for (const key in markInfo) {
+      const value = obj.get(key);
+      if (typeof value === "boolean") {
+        markInfo[key] = value;
+      }
+    }
+    return markInfo;
+  }
+  get hasStructTree() {
+    return this.#catDict.has("StructTreeRoot");
+  }
+  get structTreeRoot() {
+    let structTree = null;
+    try {
+      structTree = this.#readStructTreeRoot();
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn("Unable read to structTreeRoot info.");
+    }
+    return shadow(this, "structTreeRoot", structTree);
+  }
+  #readStructTreeRoot() {
+    const rawObj = this.#catDict.getRaw("StructTreeRoot"),
+      obj = this.xref.fetchIfRef(rawObj);
+    return obj instanceof Dict ? new StructTreeRoot(this.xref, obj, rawObj) : null;
+  }
+  get toplevelPagesDict() {
+    const pagesObj = this.#catDict.get("Pages");
+    if (!(pagesObj instanceof Dict)) {
+      throw new FormatError("Invalid top-level pages dictionary.");
+    }
+    return shadow(this, "toplevelPagesDict", pagesObj);
+  }
+  get documentOutline() {
+    let obj = null;
+    try {
+      obj = this.#readDocumentOutline();
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn("Unable to read document outline.");
+    }
+    return shadow(this, "documentOutline", obj);
+  }
+  #readDocumentOutline(options = {}) {
+    let obj = this.#catDict.get("Outlines");
+    if (!(obj instanceof Dict)) {
+      return null;
+    }
+    obj = obj.getRaw("First");
+    if (!(obj instanceof Ref)) {
+      return null;
+    }
+    const root = {
+      items: []
+    };
+    const queue = [{
+      obj,
+      parent: root
+    }];
+    const processed = new RefSet();
+    processed.put(obj);
+    const xref = this.xref,
+      blackColor = new Uint8ClampedArray(3);
+    while (queue.length > 0) {
+      const i = queue.shift();
+      const outlineDict = xref.fetchIfRef(i.obj);
+      if (outlineDict === null) {
+        continue;
+      }
+      if (!outlineDict.has("Title")) {
+        warn("Invalid outline item encountered.");
+      }
+      const data = {
+        url: null,
+        dest: null,
+        action: null
+      };
+      Catalog.parseDestDictionary({
+        destDict: outlineDict,
+        resultObj: data,
+        docBaseUrl: this.baseUrl,
+        docAttachments: this.attachments
+      });
+      const title = outlineDict.get("Title");
+      const flags = outlineDict.get("F") || 0;
+      const color = outlineDict.getArray("C");
+      const count = outlineDict.get("Count");
+      let rgbColor = blackColor;
+      if (isNumberArray(color, 3) && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) {
+        rgbColor = ColorSpaceUtils.rgb.getRgb(color, 0);
+      }
+      const outlineItem = {
+        action: data.action,
+        attachmentId: data.attachmentId,
+        attachment: data.attachment,
+        dest: data.dest,
+        url: data.url,
+        unsafeUrl: data.unsafeUrl,
+        newWindow: data.newWindow,
+        setOCGState: data.setOCGState,
+        title: typeof title === "string" ? stringToPDFString(title) : "",
+        color: rgbColor,
+        count: Number.isInteger(count) ? count : undefined,
+        bold: !!(flags & 2),
+        italic: !!(flags & 1),
+        items: []
+      };
+      if (options.keepRawDict) {
+        outlineItem.rawDict = outlineDict;
+      }
+      i.parent.items.push(outlineItem);
+      obj = outlineDict.getRaw("First");
+      if (obj instanceof Ref && !processed.has(obj)) {
+        queue.push({
+          obj,
+          parent: outlineItem
+        });
+        processed.put(obj);
+      }
+      obj = outlineDict.getRaw("Next");
+      if (obj instanceof Ref && !processed.has(obj)) {
+        queue.push({
+          obj,
+          parent: i.parent
+        });
+        processed.put(obj);
+      }
+    }
+    return root.items.length > 0 ? root.items : null;
+  }
+  get documentOutlineForEditor() {
+    let obj = null;
+    try {
+      obj = this.#readDocumentOutline({
+        keepRawDict: true
+      });
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn("Unable to read document outline.");
+    }
+    return shadow(this, "documentOutlineForEditor", obj);
+  }
+  get permissions() {
+    let permissions = null;
+    try {
+      permissions = this.#readPermissions();
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn("Unable to read permissions.");
+    }
+    return shadow(this, "permissions", permissions);
+  }
+  #readPermissions() {
+    const encrypt = this.xref.trailer.get("Encrypt");
+    if (!(encrypt instanceof Dict)) {
+      return null;
+    }
+    let flags = encrypt.get("P");
+    if (typeof flags !== "number") {
+      return null;
+    }
+    flags += 2 ** 32;
+    const permissions = [];
+    for (const key in PermissionFlag) {
+      const value = PermissionFlag[key];
+      if (flags & value) {
+        permissions.push(value);
+      }
+    }
+    return permissions;
+  }
+  get optionalContentConfig() {
+    let config = null;
+    try {
+      const properties = this.#catDict.get("OCProperties");
+      if (!properties) {
+        return shadow(this, "optionalContentConfig", null);
+      }
+      const defaultConfig = properties.get("D");
+      if (!defaultConfig) {
+        return shadow(this, "optionalContentConfig", null);
+      }
+      const groupsData = properties.get("OCGs");
+      if (!Array.isArray(groupsData)) {
+        return shadow(this, "optionalContentConfig", null);
+      }
+      const groupRefCache = new RefSetCache();
+      for (const groupRef of groupsData) {
+        if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) {
+          continue;
+        }
+        groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef));
+      }
+      config = this.#readOptionalContentConfig(defaultConfig, groupRefCache);
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn(`Unable to read optional content config: ${ex}`);
+    }
+    return shadow(this, "optionalContentConfig", config);
+  }
+  #readOptionalContentGroup(groupRef) {
+    const group = this.xref.fetch(groupRef);
+    const obj = {
+      id: groupRef.toString(),
+      name: null,
+      intent: null,
+      usage: {
+        print: null,
+        view: null
+      },
+      rbGroups: []
+    };
+    const name = group.get("Name");
+    if (typeof name === "string") {
+      obj.name = stringToPDFString(name);
+    }
+    let intent = group.getArray("Intent");
+    if (!Array.isArray(intent)) {
+      intent = [intent];
+    }
+    if (intent.every(i => i instanceof Name)) {
+      obj.intent = intent.map(i => i.name);
+    }
+    const usage = group.get("Usage");
+    if (!(usage instanceof Dict)) {
+      return obj;
+    }
+    const usageObj = obj.usage;
+    const print = usage.get("Print");
+    if (print instanceof Dict) {
+      const printState = print.get("PrintState");
+      if (printState instanceof Name) {
+        switch (printState.name) {
+          case "ON":
+          case "OFF":
+            usageObj.print = {
+              printState: printState.name
+            };
+        }
+      }
+    }
+    const view = usage.get("View");
+    if (view instanceof Dict) {
+      const viewState = view.get("ViewState");
+      if (viewState instanceof Name) {
+        switch (viewState.name) {
+          case "ON":
+          case "OFF":
+            usageObj.view = {
+              viewState: viewState.name
+            };
+        }
+      }
+    }
+    return obj;
+  }
+  #readOptionalContentConfig(config, groupRefCache) {
+    function parseOnOff(refs) {
+      const onParsed = [];
+      if (Array.isArray(refs)) {
+        for (const value of refs) {
+          if (value instanceof Ref && groupRefCache.has(value)) {
+            onParsed.push(value.toString());
+          }
+        }
+      }
+      return onParsed;
+    }
+    function parseOrder(refs, nestedLevels = 0) {
+      if (!Array.isArray(refs)) {
+        return null;
+      }
+      const order = [];
+      for (const value of refs) {
+        if (value instanceof Ref && groupRefCache.has(value)) {
+          parsedOrderRefs.put(value);
+          order.push(value.toString());
+          continue;
+        }
+        const nestedOrder = parseNestedOrder(value, nestedLevels);
+        if (nestedOrder) {
+          order.push(nestedOrder);
+        }
+      }
+      if (nestedLevels > 0) {
+        return order;
+      }
+      const hiddenGroups = [];
+      for (const [groupRef] of groupRefCache.items()) {
+        if (parsedOrderRefs.has(groupRef)) {
+          continue;
+        }
+        hiddenGroups.push(groupRef.toString());
+      }
+      if (hiddenGroups.length) {
+        order.push({
+          name: null,
+          order: hiddenGroups
+        });
+      }
+      return order;
+    }
+    function parseNestedOrder(ref, nestedLevels) {
+      if (++nestedLevels > MAX_NESTED_LEVELS) {
+        warn("parseNestedOrder - reached MAX_NESTED_LEVELS.");
+        return null;
+      }
+      const value = xref.fetchIfRef(ref);
+      if (!Array.isArray(value)) {
+        return null;
+      }
+      const nestedName = xref.fetchIfRef(value[0]);
+      if (typeof nestedName !== "string") {
+        return null;
+      }
+      const nestedOrder = parseOrder(value.slice(1), nestedLevels);
+      if (!nestedOrder?.length) {
+        return null;
+      }
+      return {
+        name: stringToPDFString(nestedName),
+        order: nestedOrder
+      };
+    }
+    function parseRBGroups(rbGroups) {
+      if (!Array.isArray(rbGroups)) {
+        return;
+      }
+      for (const value of rbGroups) {
+        const rbGroup = xref.fetchIfRef(value);
+        if (!Array.isArray(rbGroup) || !rbGroup.length) {
+          continue;
+        }
+        const parsedRbGroup = new Set();
+        for (const ref of rbGroup) {
+          if (ref instanceof Ref && groupRefCache.has(ref) && !parsedRbGroup.has(ref.toString())) {
+            parsedRbGroup.add(ref.toString());
+            groupRefCache.get(ref).rbGroups.push(parsedRbGroup);
+          }
+        }
+      }
+    }
+    const xref = this.xref,
+      parsedOrderRefs = new RefSet(),
+      MAX_NESTED_LEVELS = 10;
+    parseRBGroups(config.get("RBGroups"));
+    return {
+      name: typeof config.get("Name") === "string" ? stringToPDFString(config.get("Name")) : null,
+      creator: typeof config.get("Creator") === "string" ? stringToPDFString(config.get("Creator")) : null,
+      baseState: config.get("BaseState") instanceof Name ? config.get("BaseState").name : null,
+      on: parseOnOff(config.get("ON")),
+      off: parseOnOff(config.get("OFF")),
+      order: parseOrder(config.get("Order")),
+      groups: [...groupRefCache]
+    };
+  }
+  setActualNumPages(num = null) {
+    this.#actualNumPages = num;
+  }
+  get hasActualNumPages() {
+    return this.#actualNumPages !== null;
+  }
+  get _pagesCount() {
+    const obj = this.toplevelPagesDict.get("Count");
+    if (!Number.isInteger(obj)) {
+      throw new FormatError("Page count in top-level pages dictionary is not an integer.");
+    }
+    return shadow(this, "_pagesCount", obj);
+  }
+  get numPages() {
+    return this.#actualNumPages ?? this._pagesCount;
+  }
+  get destinations() {
+    const rawDests = this.#readDests(),
+      dests = Object.create(null);
+    for (const obj of rawDests) {
+      if (obj instanceof NameTree) {
+        for (const [key, value] of obj.getAll()) {
+          const dest = fetchDest(value);
+          if (dest) {
+            dests[stringToPDFString(key, true)] = dest;
+          }
+        }
+      } else if (obj instanceof Dict) {
+        for (const [key, value] of obj) {
+          const dest = fetchDest(value);
+          if (dest) {
+            dests[stringToPDFString(key, true)] ||= dest;
+          }
+        }
+      }
+    }
+    return shadow(this, "destinations", dests);
+  }
+  getDestination(id) {
+    if (Object.hasOwn(this, "destinations")) {
+      return this.destinations[id] ?? null;
+    }
+    const rawDests = this.#readDests();
+    for (const obj of rawDests) {
+      if (obj instanceof NameTree || obj instanceof Dict) {
+        const dest = fetchDest(obj.get(id));
+        if (dest) {
+          return dest;
+        }
+      }
+    }
+    if (rawDests.length) {
+      const dest = this.destinations[id];
+      if (dest) {
+        return dest;
+      }
+    }
+    return null;
+  }
+  #readDests() {
+    const obj = this.#catDict.get("Names");
+    const rawDests = [];
+    if (obj?.has("Dests")) {
+      rawDests.push(new NameTree(obj.getRaw("Dests"), this.xref));
+    }
+    if (this.#catDict.has("Dests")) {
+      rawDests.push(this.#catDict.get("Dests"));
+    }
+    return rawDests;
+  }
+  get rawPageLabels() {
+    const obj = this.#catDict.getRaw("PageLabels");
+    if (!obj) {
+      return null;
+    }
+    const numberTree = new NumberTree(obj, this.xref);
+    return numberTree.getAll();
+  }
+  get pageLabels() {
+    let obj = null;
+    try {
+      obj = this.#readPageLabels();
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn("Unable to read page labels.");
+    }
+    return shadow(this, "pageLabels", obj);
+  }
+  #readPageLabels() {
+    const nums = this.rawPageLabels;
+    if (!nums) {
+      return null;
+    }
+    const pageLabels = new Array(this.numPages);
+    let style = null,
+      prefix = "";
+    let currentLabel = "",
+      currentIndex = 1;
+    for (let i = 0, ii = this.numPages; i < ii; i++) {
+      const labelDict = nums.get(i);
+      if (labelDict !== undefined) {
+        if (!(labelDict instanceof Dict)) {
+          throw new FormatError("PageLabel is not a dictionary.");
+        }
+        if (labelDict.has("Type") && !isName(labelDict.get("Type"), "PageLabel")) {
+          throw new FormatError("Invalid type in PageLabel dictionary.");
+        }
+        if (labelDict.has("S")) {
+          const s = labelDict.get("S");
+          if (!(s instanceof Name)) {
+            throw new FormatError("Invalid style in PageLabel dictionary.");
+          }
+          style = s.name;
+        } else {
+          style = null;
+        }
+        if (labelDict.has("P")) {
+          const p = labelDict.get("P");
+          if (typeof p !== "string") {
+            throw new FormatError("Invalid prefix in PageLabel dictionary.");
+          }
+          prefix = stringToPDFString(p);
+        } else {
+          prefix = "";
+        }
+        if (labelDict.has("St")) {
+          const st = labelDict.get("St");
+          if (!(Number.isInteger(st) && st >= 1)) {
+            throw new FormatError("Invalid start in PageLabel dictionary.");
+          }
+          currentIndex = st;
+        } else {
+          currentIndex = 1;
+        }
+      }
+      switch (style) {
+        case "D":
+          currentLabel = currentIndex;
+          break;
+        case "R":
+        case "r":
+          currentLabel = toRomanNumerals(currentIndex, style === "r");
+          break;
+        case "A":
+        case "a":
+          const LIMIT = 26;
+          const A_UPPER_CASE = 0x41,
+            A_LOWER_CASE = 0x61;
+          const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE;
+          const letterIndex = currentIndex - 1;
+          const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);
+          currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1);
+          break;
+        default:
+          if (style) {
+            throw new FormatError(`Invalid style "${style}" in PageLabel dictionary.`);
+          }
+          currentLabel = "";
+      }
+      pageLabels[i] = prefix + currentLabel;
+      currentIndex++;
+    }
+    return pageLabels;
+  }
+  get pageLayout() {
+    const obj = this.#catDict.get("PageLayout");
+    let pageLayout = "";
+    if (obj instanceof Name) {
+      switch (obj.name) {
+        case "SinglePage":
+        case "OneColumn":
+        case "TwoColumnLeft":
+        case "TwoColumnRight":
+        case "TwoPageLeft":
+        case "TwoPageRight":
+          pageLayout = obj.name;
+      }
+    }
+    return shadow(this, "pageLayout", pageLayout);
+  }
+  get pageMode() {
+    const obj = this.#catDict.get("PageMode");
+    let pageMode = "UseNone";
+    if (obj instanceof Name) {
+      switch (obj.name) {
+        case "UseNone":
+        case "UseOutlines":
+        case "UseThumbs":
+        case "FullScreen":
+        case "UseOC":
+        case "UseAttachments":
+          pageMode = obj.name;
+      }
+    }
+    return shadow(this, "pageMode", pageMode);
+  }
+  get viewerPreferences() {
+    const obj = this.#catDict.get("ViewerPreferences");
+    if (!(obj instanceof Dict)) {
+      return shadow(this, "viewerPreferences", null);
+    }
+    let prefs = null;
+    for (const [key, value] of obj) {
+      let prefValue;
+      switch (key) {
+        case "HideToolbar":
+        case "HideMenubar":
+        case "HideWindowUI":
+        case "FitWindow":
+        case "CenterWindow":
+        case "DisplayDocTitle":
+        case "PickTrayByPDFSize":
+          if (typeof value === "boolean") {
+            prefValue = value;
+          }
+          break;
+        case "NonFullScreenPageMode":
+          if (value instanceof Name) {
+            switch (value.name) {
+              case "UseNone":
+              case "UseOutlines":
+              case "UseThumbs":
+              case "UseOC":
+                prefValue = value.name;
+                break;
+              default:
+                prefValue = "UseNone";
+            }
+          }
+          break;
+        case "Direction":
+          if (value instanceof Name) {
+            switch (value.name) {
+              case "L2R":
+              case "R2L":
+                prefValue = value.name;
+                break;
+              default:
+                prefValue = "L2R";
+            }
+          }
+          break;
+        case "ViewArea":
+        case "ViewClip":
+        case "PrintArea":
+        case "PrintClip":
+          if (value instanceof Name) {
+            switch (value.name) {
+              case "MediaBox":
+              case "CropBox":
+              case "BleedBox":
+              case "TrimBox":
+              case "ArtBox":
+                prefValue = value.name;
+                break;
+              default:
+                prefValue = "CropBox";
+            }
+          }
+          break;
+        case "PrintScaling":
+          if (value instanceof Name) {
+            switch (value.name) {
+              case "None":
+              case "AppDefault":
+                prefValue = value.name;
+                break;
+              default:
+                prefValue = "AppDefault";
+            }
+          }
+          break;
+        case "Duplex":
+          if (value instanceof Name) {
+            switch (value.name) {
+              case "Simplex":
+              case "DuplexFlipShortEdge":
+              case "DuplexFlipLongEdge":
+                prefValue = value.name;
+                break;
+              default:
+                prefValue = "None";
+            }
+          }
+          break;
+        case "PrintPageRange":
+          if (Array.isArray(value) && value.length % 2 === 0) {
+            const isValid = value.every((page, i, arr) => Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages);
+            if (isValid) {
+              prefValue = value;
+            }
+          }
+          break;
+        case "NumCopies":
+          if (Number.isInteger(value) && value > 0) {
+            prefValue = value;
+          }
+          break;
+        default:
+          warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`);
+          continue;
+      }
+      if (prefValue === undefined) {
+        warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`);
+        continue;
+      }
+      prefs ??= Object.create(null);
+      prefs[key] = prefValue;
+    }
+    return shadow(this, "viewerPreferences", prefs);
+  }
+  get openAction() {
+    const obj = this.#catDict.get("OpenAction");
+    const openAction = Object.create(null);
+    if (obj instanceof Dict) {
+      const destDict = new Dict(this.xref);
+      destDict.set("A", obj);
+      const resultObj = {
+        url: null,
+        dest: null,
+        action: null
+      };
+      Catalog.parseDestDictionary({
+        destDict,
+        resultObj
+      });
+      if (Array.isArray(resultObj.dest)) {
+        openAction.dest = resultObj.dest;
+      } else if (resultObj.action) {
+        openAction.action = resultObj.action;
+      }
+    } else if (isValidExplicitDest(obj)) {
+      openAction.dest = obj;
+    }
+    return shadow(this, "openAction", objectSize(openAction) > 0 ? openAction : null);
+  }
+  get attachments() {
+    const obj = this.#catDict.get("Names");
+    let attachments = null;
+    if (obj instanceof Dict && obj.has("EmbeddedFiles")) {
+      const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref);
+      for (const [key, value] of nameTree.getAll()) {
+        (attachments ??= new Map()).set(stringToPDFString(key, true), new FileSpec(value).serializable);
+      }
+    }
+    return shadow(this, "attachments", attachments);
+  }
+  #attachmentContentByName(id) {
+    const obj = this.#catDict.get("Names");
+    if (obj instanceof Dict && obj.has("EmbeddedFiles")) {
+      const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref);
+      for (const [key, value] of nameTree.getAll()) {
+        if (stringToPDFString(key, true) === id) {
+          return FileSpec.readContent(value);
+        }
+      }
+    }
+    return undefined;
+  }
+  attachmentContent(id) {
+    const namedContent = this.#attachmentContentByName(id);
+    if (namedContent !== undefined) {
+      return namedContent;
+    }
+    const ref = this.#annotationAttachmentRefById.get(id);
+    if (ref) {
+      const target = this.xref.fetch(ref);
+      if (target instanceof BaseStream) {
+        return FileSpec.readStreamContent(target);
+      }
+      return target instanceof Dict ? FileSpec.readContent(target) : null;
+    }
+    return null;
+  }
+  get rawEmbeddedFiles() {
+    const obj = this.#catDict.get("Names");
+    if (!(obj instanceof Dict) || !obj.has("EmbeddedFiles")) {
+      return null;
+    }
+    const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref);
+    return nameTree.getAll(true);
+  }
+  get xfaImages() {
+    const obj = this.#catDict.get("Names");
+    let xfaImages = null;
+    if (obj instanceof Dict && obj.has("XFAImages")) {
+      const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref);
+      for (const [key, value] of nameTree.getAll()) {
+        if (value instanceof BaseStream) {
+          xfaImages ??= new Map();
+          xfaImages.set(stringToPDFString(key, true), value.getBytes());
+        }
+      }
+    }
+    return shadow(this, "xfaImages", xfaImages);
+  }
+  #collectJavaScript() {
+    const obj = this.#catDict.get("Names");
+    let javaScript = null;
+    function appendIfJavaScriptDict(name, jsDict) {
+      if (!(jsDict instanceof Dict)) {
+        return;
+      }
+      if (!isName(jsDict.get("S"), "JavaScript")) {
+        return;
+      }
+      let js = jsDict.get("JS");
+      if (js instanceof BaseStream) {
+        js = js.getString();
+      } else if (typeof js !== "string") {
+        return;
+      }
+      js = stringToPDFString(js, true).replaceAll("\x00", "");
+      if (js) {
+        (javaScript ||= new Map()).set(name, js);
+      }
+    }
+    if (obj instanceof Dict && obj.has("JavaScript")) {
+      const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref);
+      for (const [key, value] of nameTree.getAll()) {
+        appendIfJavaScriptDict(stringToPDFString(key, true), value);
+      }
+    }
+    const openAction = this.#catDict.get("OpenAction");
+    if (openAction) {
+      appendIfJavaScriptDict("OpenAction", openAction);
+    }
+    return javaScript;
+  }
+  get jsActions() {
+    const javaScript = this.#collectJavaScript();
+    let actions = collectActions(this.xref, this.#catDict, DocumentActionEventType);
+    if (javaScript) {
+      actions ||= Object.create(null);
+      for (const [key, val] of javaScript) {
+        if (key in actions) {
+          actions[key].push(val);
+        } else {
+          actions[key] = [val];
+        }
+      }
+    }
+    return shadow(this, "jsActions", actions);
+  }
+  async cleanup(manuallyTriggered = false) {
+    clearGlobalCaches();
+    this.globalColorSpaceCache.clear();
+    this.globalImageCache.clear(manuallyTriggered);
+    this.pageKidsCountCache.clear();
+    this.pageIndexCache.clear();
+    this.pageDictCache.clear();
+    this.nonBlendModesSet.clear();
+    for (const {
+      dict
+    } of await Promise.all(this.fontCache)) {
+      delete dict.cacheKey;
+    }
+    this.fontCache.clear();
+    this.builtInCMapCache.clear();
+    this.standardFontDataCache.clear();
+    this.systemFontCache.clear();
+  }
+  async getPageDict(pageIndex) {
+    const nodesToVisit = [this.toplevelPagesDict];
+    const visitedNodes = new RefSet();
+    const pagesRef = this.#catDict.getRaw("Pages");
+    if (pagesRef instanceof Ref) {
+      visitedNodes.put(pagesRef);
+    }
+    const xref = this.xref,
+      pageKidsCountCache = this.pageKidsCountCache,
+      pageIndexCache = this.pageIndexCache,
+      pageDictCache = this.pageDictCache;
+    let currentPageIndex = 0;
+    while (nodesToVisit.length) {
+      const currentNode = nodesToVisit.pop();
+      if (currentNode instanceof Ref) {
+        const count = pageKidsCountCache.get(currentNode);
+        if (count >= 0 && currentPageIndex + count <= pageIndex) {
+          currentPageIndex += count;
+          continue;
+        }
+        if (visitedNodes.has(currentNode)) {
+          throw new FormatError("Pages tree contains circular reference.");
+        }
+        visitedNodes.put(currentNode);
+        const obj = await (pageDictCache.get(currentNode) || xref.fetchAsync(currentNode));
+        if (obj instanceof Dict) {
+          let type = obj.getRaw("Type");
+          if (type instanceof Ref) {
+            type = await xref.fetchAsync(type);
+          }
+          if (isName(type, "Page") || !obj.has("Kids")) {
+            if (!pageKidsCountCache.has(currentNode)) {
+              pageKidsCountCache.put(currentNode, 1);
+            }
+            if (!pageIndexCache.has(currentNode)) {
+              pageIndexCache.put(currentNode, currentPageIndex);
+            }
+            if (currentPageIndex === pageIndex) {
+              return [obj, currentNode];
+            }
+            currentPageIndex++;
+            continue;
+          }
+        }
+        nodesToVisit.push(obj);
+        continue;
+      }
+      if (!(currentNode instanceof Dict)) {
+        throw new FormatError("Page dictionary kid reference points to wrong type of object.");
+      }
+      const {
+        objId
+      } = currentNode;
+      let count = currentNode.getRaw("Count");
+      if (count instanceof Ref) {
+        count = await xref.fetchAsync(count);
+      }
+      if (Number.isInteger(count) && count >= 0) {
+        if (objId && !pageKidsCountCache.has(objId)) {
+          pageKidsCountCache.put(objId, count);
+        }
+        if (currentPageIndex + count <= pageIndex) {
+          currentPageIndex += count;
+          continue;
+        }
+      }
+      let kids = currentNode.getRaw("Kids");
+      if (kids instanceof Ref) {
+        kids = await xref.fetchAsync(kids);
+      }
+      if (!Array.isArray(kids)) {
+        let type = currentNode.getRaw("Type");
+        if (type instanceof Ref) {
+          type = await xref.fetchAsync(type);
+        }
+        if (isName(type, "Page") || !currentNode.has("Kids")) {
+          if (currentPageIndex === pageIndex) {
+            return [currentNode, null];
+          }
+          currentPageIndex++;
+          continue;
+        }
+        throw new FormatError("Page dictionary kids object is not an array.");
+      }
+      for (let last = kids.length - 1; last >= 0; last--) {
+        const lastKid = kids[last];
+        nodesToVisit.push(lastKid);
+        if (currentNode === this.toplevelPagesDict && lastKid instanceof Ref && !pageDictCache.has(lastKid)) {
+          pageDictCache.put(lastKid, xref.fetchAsync(lastKid));
+        }
+      }
+    }
+    throw new Error(`Page index ${pageIndex} not found.`);
+  }
+  async getAllPageDicts(recoveryMode = false) {
+    const {
+      ignoreErrors
+    } = this.pdfManager.evaluatorOptions;
+    const queue = [{
+      currentNode: this.toplevelPagesDict,
+      posInKids: 0
+    }];
+    const visitedNodes = new RefSet();
+    const pagesRef = this.#catDict.getRaw("Pages");
+    if (pagesRef instanceof Ref) {
+      visitedNodes.put(pagesRef);
+    }
+    const map = new Map(),
+      xref = this.xref,
+      pageIndexCache = this.pageIndexCache;
+    let pageIndex = 0;
+    function addPageDict(pageDict, pageRef) {
+      if (pageRef && !pageIndexCache.has(pageRef)) {
+        pageIndexCache.put(pageRef, pageIndex);
+      }
+      map.set(pageIndex++, [pageDict, pageRef]);
+    }
+    function addPageError(error) {
+      if (error instanceof XRefEntryException && !recoveryMode) {
+        throw error;
+      }
+      if (recoveryMode && ignoreErrors && pageIndex === 0) {
+        warn(`getAllPageDicts - Skipping invalid first page: "${error}".`);
+        error = Dict.empty;
+      }
+      map.set(pageIndex++, [error, null]);
+    }
+    while (queue.length > 0) {
+      const queueItem = queue.at(-1);
+      const {
+        currentNode,
+        posInKids
+      } = queueItem;
+      let kids = currentNode.getRaw("Kids");
+      if (kids instanceof Ref) {
+        try {
+          kids = await xref.fetchAsync(kids);
+        } catch (ex) {
+          addPageError(ex);
+          break;
+        }
+      }
+      if (!Array.isArray(kids)) {
+        let type = currentNode.getRaw("Type");
+        if (type instanceof Ref) {
+          try {
+            type = await xref.fetchAsync(type);
+          } catch (ex) {
+            addPageError(ex);
+            break;
+          }
+        }
+        if (isName(type, "Page") || !currentNode.has("Kids")) {
+          addPageDict(currentNode, null);
+          break;
+        }
+        addPageError(new FormatError("Page dictionary kids object is not an array."));
+        break;
+      }
+      if (posInKids >= kids.length) {
+        queue.pop();
+        continue;
+      }
+      const kidObj = kids[posInKids];
+      let obj;
+      if (kidObj instanceof Ref) {
+        if (visitedNodes.has(kidObj)) {
+          addPageError(new FormatError("Pages tree contains circular reference."));
+          break;
+        }
+        visitedNodes.put(kidObj);
+        try {
+          obj = await xref.fetchAsync(kidObj);
+        } catch (ex) {
+          addPageError(ex);
+          break;
+        }
+      } else {
+        obj = kidObj;
+      }
+      if (!(obj instanceof Dict)) {
+        addPageError(new FormatError("Page dictionary kid reference points to wrong type of object."));
+        break;
+      }
+      let type = obj.getRaw("Type");
+      if (type instanceof Ref) {
+        try {
+          type = await xref.fetchAsync(type);
+        } catch (ex) {
+          addPageError(ex);
+          break;
+        }
+      }
+      if (isName(type, "Page") || !obj.has("Kids")) {
+        addPageDict(obj, kidObj instanceof Ref ? kidObj : null);
+      } else {
+        queue.push({
+          currentNode: obj,
+          posInKids: 0
+        });
+      }
+      queueItem.posInKids++;
+    }
+    return map;
+  }
+  async getPageIndex(pageRef) {
+    const cachedPageIndex = this.pageIndexCache.get(pageRef);
+    if (cachedPageIndex !== undefined) {
+      return cachedPageIndex;
+    }
+    const xref = this.xref;
+    let total = 0,
+      ref = pageRef;
+    while (true) {
+      const node = await xref.fetchAsync(ref);
+      if (isRefsEqual(ref, pageRef) && !isDict(node, "Page") && !(node instanceof Dict && !node.has("Type") && node.has("Contents"))) {
+        throw new FormatError("The reference does not point to a /Page dictionary.");
+      }
+      if (!node) {
+        break;
+      }
+      if (!(node instanceof Dict)) {
+        throw new FormatError("Node must be a dictionary.");
+      }
+      const parentRef = node.getRaw("Parent");
+      const parent = await node.getAsync("Parent");
+      if (!parent) {
+        break;
+      }
+      if (!(parent instanceof Dict)) {
+        throw new FormatError("Parent must be a dictionary.");
+      }
+      const kids = await parent.getAsync("Kids");
+      if (!kids) {
+        break;
+      }
+      if (!Array.isArray(kids)) {
+        throw new FormatError("Kids must be an array.");
+      }
+      const kidPromises = [];
+      let found = false;
+      for (const kid of kids) {
+        if (!(kid instanceof Ref)) {
+          throw new FormatError("Kid must be a reference.");
+        }
+        if (isRefsEqual(kid, ref)) {
+          found = true;
+          break;
+        }
+        kidPromises.push(xref.fetchAsync(kid).then(obj => {
+          if (!(obj instanceof Dict)) {
+            throw new FormatError("Kid node must be a dictionary.");
+          }
+          if (obj.has("Count")) {
+            const count = obj.get("Count");
+            if (Number.isInteger(count) && count >= 0) {
+              total += count;
+              return;
+            }
+            throw new FormatError("Count must be a (positive) integer.");
+          }
+          total++;
+        }));
+      }
+      if (!found) {
+        throw new FormatError("Kid reference not found in parent's kids.");
+      }
+      await Promise.all(kidPromises);
+      ref = parentRef;
+    }
+    this.pageIndexCache.put(pageRef, total);
+    return total;
+  }
+  get baseUrl() {
+    const uri = this.#catDict.get("URI");
+    if (uri instanceof Dict) {
+      const base = uri.get("Base");
+      if (typeof base === "string") {
+        const absoluteUrl = createValidAbsoluteUrl(base, null, {
+          tryConvertEncoding: true
+        });
+        if (absoluteUrl) {
+          return shadow(this, "baseUrl", absoluteUrl.href);
+        }
+      }
+    }
+    return shadow(this, "baseUrl", this.pdfManager.docBaseUrl);
+  }
+  static #getDestFromStructElement(xref, seRef) {
+    const seDict = xref.fetchIfRef(seRef);
+    if (!(seDict instanceof Dict)) {
+      return null;
+    }
+    let pageRef = null;
+    const directPg = seDict.getRaw("Pg");
+    if (directPg instanceof Ref) {
+      pageRef = directPg;
+    }
+    if (!pageRef) {
+      const queue = [seDict];
+      while (queue.length > 0 && !pageRef) {
+        const node = queue.shift();
+        const kids = node.get("K");
+        let kidsArr;
+        if (Array.isArray(kids)) {
+          kidsArr = kids;
+        } else if (kids) {
+          kidsArr = [kids];
+        } else {
+          continue;
+        }
+        for (const kid of kidsArr) {
+          const kidObj = xref.fetchIfRef(kid);
+          if (!(kidObj instanceof Dict)) {
+            continue;
+          }
+          const pg = kidObj.getRaw("Pg");
+          if (pg instanceof Ref) {
+            pageRef = pg;
+            break;
+          }
+          queue.push(kidObj);
+        }
+      }
+    }
+    if (!pageRef) {
+      const MAX_DEPTH = 40;
+      let current = seDict;
+      for (let depth = 0; depth < MAX_DEPTH; depth++) {
+        const parentRaw = current.getRaw("P");
+        if (!(parentRaw instanceof Ref)) {
+          break;
+        }
+        const parentDict = xref.fetch(parentRaw);
+        if (!(parentDict instanceof Dict)) {
+          break;
+        }
+        if (isName(parentDict.get("Type"), "StructTreeRoot")) {
+          break;
+        }
+        const pg = parentDict.getRaw("Pg");
+        if (pg instanceof Ref) {
+          pageRef = pg;
+          break;
+        }
+        current = parentDict;
+      }
+    }
+    if (!pageRef) {
+      return null;
+    }
+    let x = null,
+      y = null;
+    const attrs = seDict.get("A");
+    if (attrs instanceof Dict) {
+      const bbox = lookupRect(attrs.getArray("BBox"), null);
+      if (bbox) {
+        x = bbox[0];
+        y = bbox[3];
+      }
+    }
+    return [pageRef, {
+      name: "XYZ"
+    }, x, y, null];
+  }
+  static parseDestDictionary({
+    destDict,
+    resultObj,
+    docBaseUrl = null,
+    docAttachments = null
+  }) {
+    if (!(destDict instanceof Dict)) {
+      warn("parseDestDictionary: `destDict` must be a dictionary.");
+      return;
+    }
+    let action = destDict.get("A"),
+      url,
+      dest;
+    if (!(action instanceof Dict)) {
+      if (destDict.has("Dest")) {
+        action = destDict.get("Dest");
+      } else {
+        action = destDict.get("AA");
+        if (action instanceof Dict) {
+          if (action.has("D")) {
+            action = action.get("D");
+          } else if (action.has("U")) {
+            action = action.get("U");
+          }
+        }
+      }
+    }
+    if (action instanceof Dict) {
+      const actionType = action.get("S");
+      if (!(actionType instanceof Name)) {
+        warn("parseDestDictionary: Invalid type in Action dictionary.");
+        return;
+      }
+      const actionName = actionType.name;
+      switch (actionName) {
+        case "ResetForm":
+          const flags = action.get("Flags");
+          const include = ((typeof flags === "number" ? flags : 0) & 1) === 0;
+          const fields = [];
+          const refs = [];
+          for (const obj of action.get("Fields") || []) {
+            if (obj instanceof Ref) {
+              refs.push(obj.toString());
+            } else if (typeof obj === "string") {
+              fields.push(stringToPDFString(obj));
+            }
+          }
+          resultObj.resetForm = {
+            fields,
+            refs,
+            include
+          };
+          break;
+        case "URI":
+          url = action.get("URI");
+          if (url instanceof Name) {
+            url = "/" + url.name;
+          }
+          break;
+        case "GoTo":
+          dest = action.get("D");
+          break;
+        case "Launch":
+        case "GoToR":
+          const urlDict = action.get("F");
+          if (urlDict instanceof Dict) {
+            url = new FileSpec(urlDict).filename;
+          } else if (typeof urlDict === "string") {
+            url = urlDict;
+          } else {
+            break;
+          }
+          const remoteDest = fetchRemoteDest(action);
+          if (remoteDest) {
+            url = url.split("#", 1)[0] + "#" + remoteDest;
+          }
+          const newWindow = action.get("NewWindow");
+          if (typeof newWindow === "boolean") {
+            resultObj.newWindow = newWindow;
+          }
+          break;
+        case "GoToE":
+          const target = action.get("T");
+          let id = null;
+          if (target instanceof Dict) {
+            const relationship = target.get("R");
+            const name = target.get("N");
+            if (isName(relationship, "C") && typeof name === "string") {
+              id = stringToPDFString(name, true);
+            }
+          }
+          if (docAttachments && id) {
+            resultObj.attachmentId = id;
+            resultObj.attachment = docAttachments.get(id);
+            const attachmentDest = fetchRemoteDest(action);
+            if (attachmentDest) {
+              resultObj.attachmentDest = attachmentDest;
+            }
+          } else {
+            warn(`parseDestDictionary - unimplemented "GoToE" action.`);
+          }
+          break;
+        case "Named":
+          const namedAction = action.get("N");
+          if (namedAction instanceof Name) {
+            resultObj.action = namedAction.name;
+          }
+          break;
+        case "SetOCGState":
+          const state = action.get("State");
+          const preserveRB = action.get("PreserveRB");
+          if (!Array.isArray(state) || state.length === 0) {
+            break;
+          }
+          const stateArr = [];
+          for (const elem of state) {
+            if (elem instanceof Name) {
+              switch (elem.name) {
+                case "ON":
+                case "OFF":
+                case "Toggle":
+                  stateArr.push(elem.name);
+                  break;
+              }
+            } else if (elem instanceof Ref) {
+              stateArr.push(elem.toString());
+            }
+          }
+          if (stateArr.length !== state.length) {
+            break;
+          }
+          resultObj.setOCGState = {
+            state: stateArr,
+            preserveRB: typeof preserveRB === "boolean" ? preserveRB : true
+          };
+          break;
+        case "JavaScript":
+          const jsAction = action.get("JS");
+          let js;
+          if (jsAction instanceof BaseStream) {
+            js = jsAction.getString();
+          } else if (typeof jsAction === "string") {
+            js = jsAction;
+          }
+          const jsURL = js && recoverJsURL(stringToPDFString(js, true));
+          if (jsURL) {
+            url = jsURL.url;
+            resultObj.newWindow = jsURL.newWindow;
+            break;
+          }
+        default:
+          if (actionName === "JavaScript" || actionName === "SubmitForm") {
+            break;
+          }
+          warn(`parseDestDictionary - unsupported action: "${actionName}".`);
+          break;
+      }
+    } else if (destDict.has("Dest")) {
+      dest = destDict.get("Dest");
+    }
+    if (typeof url === "string") {
+      const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl, {
+        addDefaultProtocol: true,
+        tryConvertEncoding: true
+      });
+      if (absoluteUrl) {
+        resultObj.url = absoluteUrl.href;
+      }
+      resultObj.unsafeUrl = url;
+    }
+    if (dest) {
+      if (dest instanceof Name) {
+        dest = dest.name;
+      }
+      if (typeof dest === "string") {
+        resultObj.dest = stringToPDFString(dest, true);
+      } else if (isValidExplicitDest(dest)) {
+        resultObj.dest = dest;
+      }
+    }
+    if (!resultObj.dest && !resultObj.url && !resultObj.action && !resultObj.attachment && !resultObj.setOCGState && !resultObj.resetForm) {
+      const seRef = destDict.getRaw("SE");
+      if (seRef instanceof Ref) {
+        try {
+          const seDest = Catalog.#getDestFromStructElement(destDict.xref, seRef);
+          if (seDest) {
+            resultObj.dest = seDest;
+          }
+        } catch (ex) {
+          if (ex instanceof MissingDataException) {
+            throw ex;
+          }
+          info("SE parsing failed.");
+        }
+      }
+    }
+  }
+}
+
+;// ./src/core/editor/pdf_images.js
+
+
+
+const FLATE_COLOR_COUNT_THRESHOLD = 16384;
+function createImageDict(xref, width, height, colorSpace) {
+  const image = new Dict(xref);
+  image.set("Type", Name.get("XObject"));
+  image.set("Subtype", Name.get("Image"));
+  image.set("BitsPerComponent", 8);
+  image.setIfName("ColorSpace", colorSpace);
+  image.set("Width", width);
+  image.set("Height", height);
+  return image;
+}
+function createRawImage(buffer, dict) {
+  return new Stream(buffer, 0, buffer.length, dict);
+}
+function paethPredictor(left, above, upperLeft) {
+  const p = left + above - upperLeft;
+  const pa = Math.abs(p - left);
+  const pb = Math.abs(p - above);
+  const pc = Math.abs(p - upperLeft);
+  if (pa <= pb && pa <= pc) {
+    return left;
+  }
+  return pb <= pc ? above : upperLeft;
+}
+function applyPNGOptimumFilter(data, width, height, bytesPerPixel) {
+  const rowSize = width * bytesPerPixel;
+  const out = new Uint8Array(height * (rowSize + 1));
+  const candidates = [new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize)];
+  for (let y = 0; y < height; y++) {
+    const rowOffset = y * rowSize;
+    const prevRowOffset = rowOffset - rowSize;
+    const scores = [0, 0, 0, 0, 0];
+    for (let x = 0; x < rowSize; x++) {
+      const offset = rowOffset + x;
+      const cur = data[offset];
+      const left = x >= bytesPerPixel ? data[offset - bytesPerPixel] : 0;
+      const above = y > 0 ? data[prevRowOffset + x] : 0;
+      const upperLeft = y > 0 && x >= bytesPerPixel ? data[prevRowOffset + x - bytesPerPixel] : 0;
+      candidates[0][x] = cur;
+      candidates[1][x] = cur - left & 0xff;
+      candidates[2][x] = cur - above & 0xff;
+      candidates[3][x] = cur - (left + above >> 1) & 0xff;
+      candidates[4][x] = cur - paethPredictor(left, above, upperLeft) & 0xff;
+      for (let f = 0; f < 5; f++) {
+        const v = candidates[f][x];
+        scores[f] += v < 128 ? v : 256 - v;
+      }
+    }
+    let bestFilter = 0;
+    for (let f = 1; f < 5; f++) {
+      if (scores[f] < scores[bestFilter]) {
+        bestFilter = f;
+      }
+    }
+    const outOffset = y * (rowSize + 1);
+    out[outOffset] = bestFilter;
+    out.set(candidates[bestFilter], outOffset + 1);
+  }
+  return out;
+}
+async function deflate(bytes) {
+  const cs = new CompressionStream("deflate");
+  const writer = cs.writable.getWriter();
+  const writePromise = (async () => {
+    try {
+      await writer.ready;
+      await writer.write(bytes);
+      await writer.ready;
+      await writer.close();
+    } catch (reason) {
+      await writer.abort(reason).catch(() => {});
+      throw reason;
+    }
+  })();
+  const [compressed] = await Promise.all([new Response(cs.readable).bytes(), writePromise.then(() => null)]);
+  return compressed;
+}
+async function createPNGLikeImage(buffer, width, height, dict) {
+  const bytesPerPixel = buffer.length / (width * height);
+  let compressed;
+  if (typeof CompressionStream === "function") {
+    try {
+      const filtered = applyPNGOptimumFilter(buffer, width, height, bytesPerPixel);
+      compressed = await deflate(filtered);
+    } catch {}
+  }
+  if (!compressed) {
+    return createRawImage(buffer, dict);
+  }
+  dict.setIfName("Filter", "FlateDecode");
+  const decodeParms = new Dict(dict.xref);
+  decodeParms.set("Predictor", 15);
+  decodeParms.set("Columns", width);
+  decodeParms.set("Colors", bytesPerPixel);
+  decodeParms.set("BitsPerComponent", 8);
+  dict.set("DecodeParms", decodeParms);
+  return createRawImage(compressed, dict);
+}
+async function createImage(bitmap, xref, {
+  closeBitmap = false
+} = {}) {
+  const {
+    width,
+    height
+  } = bitmap;
+  if (!Number.isInteger(width) || !Number.isInteger(height) || width <= 0 || height <= 0) {
+    if (closeBitmap) {
+      bitmap.close?.();
+    }
+    throw new Error(`createImage: invalid bitmap dimensions ${width}x${height}`);
+  }
+  const canvas = new OffscreenCanvas(width, height);
+  const ctx = canvas.getContext("2d", {
+    alpha: true,
+    willReadFrequently: true
+  });
+  let data;
+  try {
+    ctx.drawImage(bitmap, 0, 0);
+    data = ctx.getImageData(0, 0, width, height).data;
+  } finally {
+    if (closeBitmap) {
+      bitmap.close?.();
+    }
+  }
+  const buf32 = new Uint32Array(data.buffer, data.byteOffset, data.byteLength >> 2);
+  const isLE = FeatureTest.isLittleEndian;
+  const rgbMask = isLE ? 0x00ffffff : 0xffffff00;
+  const colorCounter = new Set();
+  let hasAlpha = false;
+  let useFlate = true;
+  for (let i = 0, ii = buf32.length; i < ii; i++) {
+    const v = buf32[i];
+    if ((isLE ? v >>> 24 : v & 0xff) !== 0xff) {
+      hasAlpha = true;
+      break;
+    }
+    if (useFlate) {
+      colorCounter.add((v & rgbMask) >>> 0);
+      if (colorCounter.size > FLATE_COLOR_COUNT_THRESHOLD) {
+        useFlate = false;
+        colorCounter.clear();
+      }
+    }
+  }
+  if (hasAlpha) {
+    useFlate = true;
+  }
+  const image = createImageDict(xref, width, height, "DeviceRGB");
+  let imageStreamPromise;
+  let imageRenderStream = null;
+  if (useFlate) {
+    const rgbBuffer = new Uint8Array(width * height * 3);
+    for (let i = 0, j = 0, ii = data.length; i < ii; i += 4, j += 3) {
+      rgbBuffer[j] = data[i];
+      rgbBuffer[j + 1] = data[i + 1];
+      rgbBuffer[j + 2] = data[i + 2];
+    }
+    imageStreamPromise = createPNGLikeImage(rgbBuffer, width, height, image);
+    imageRenderStream = createRawImage(rgbBuffer, createImageDict(xref, width, height, "DeviceRGB"));
+  } else {
+    image.setIfName("Filter", "DCTDecode");
+    imageStreamPromise = canvas.convertToBlob({
+      type: "image/jpeg",
+      quality: 1
+    }).then(blob => blob.bytes()).then(bytes => createRawImage(bytes, image));
+  }
+  let smaskStreamPromise = Promise.resolve(null);
+  let smaskRenderStream = null;
+  if (hasAlpha) {
+    const alphaBuffer = new Uint8Array(buf32.length);
+    if (isLE) {
+      for (let i = 0, ii = buf32.length; i < ii; i++) {
+        alphaBuffer[i] = buf32[i] >>> 24;
+      }
+    } else {
+      for (let i = 0, ii = buf32.length; i < ii; i++) {
+        alphaBuffer[i] = buf32[i] & 0xff;
+      }
+    }
+    const smask = createImageDict(xref, width, height, "DeviceGray");
+    const smaskRenderDict = createImageDict(xref, width, height, "DeviceGray");
+    smaskStreamPromise = createPNGLikeImage(alphaBuffer, width, height, smask);
+    smaskRenderStream = createRawImage(alphaBuffer, smaskRenderDict);
+  }
+  const [imageStream, smaskStream] = await Promise.all([imageStreamPromise, smaskStreamPromise]);
+  return {
+    imageStream,
+    imageRenderStream,
+    smaskStream,
+    smaskRenderStream,
+    width,
+    height
+  };
+}
+
+;// ./src/core/object_loader.js
+
+
+
+
+function mayHaveChildren(value) {
+  return value instanceof Ref || value instanceof Dict || value instanceof BaseStream || Array.isArray(value);
+}
+function addChildren(node, nodesToVisit) {
+  if (node instanceof Dict) {
+    node = node.getRawValues();
+  } else if (node instanceof BaseStream) {
+    node = node.dict.getRawValues();
+  } else if (!Array.isArray(node)) {
+    return;
+  }
+  for (const rawValue of node) {
+    if (mayHaveChildren(rawValue)) {
+      nodesToVisit.push(rawValue);
+    }
+  }
+}
+class ObjectLoader {
+  refSet = new RefSet();
+  constructor(dict, keys, xref) {
+    this.dict = dict;
+    this.keys = keys;
+    this.xref = xref;
+  }
+  async load() {
+    const {
+      keys,
+      dict
+    } = this;
+    const nodesToVisit = [];
+    for (const key of keys) {
+      const rawValue = dict.getRaw(key);
+      if (rawValue !== undefined) {
+        nodesToVisit.push(rawValue);
+      }
+    }
+    await this.#walk(nodesToVisit);
+    this.refSet = null;
+  }
+  async #walk(nodesToVisit) {
+    const nodesToRevisit = [];
+    const pendingRequests = [];
+    while (nodesToVisit.length) {
+      let currentNode = nodesToVisit.pop();
+      if (currentNode instanceof Ref) {
+        if (this.refSet.has(currentNode)) {
+          continue;
+        }
+        try {
+          this.refSet.put(currentNode);
+          currentNode = this.xref.fetch(currentNode);
+        } catch (ex) {
+          if (!(ex instanceof MissingDataException)) {
+            warn(`ObjectLoader.#walk - requesting all data: "${ex}".`);
+            await this.xref.stream.manager.requestAllChunks();
+            return;
+          }
+          nodesToRevisit.push(currentNode);
+          pendingRequests.push({
+            begin: ex.begin,
+            end: ex.end
+          });
+        }
+      }
+      if (currentNode instanceof BaseStream) {
+        const baseStreams = currentNode.getBaseStreams();
+        if (baseStreams) {
+          let foundMissingData = false;
+          for (const stream of baseStreams) {
+            if (stream.isDataLoaded) {
+              continue;
+            }
+            foundMissingData = true;
+            pendingRequests.push({
+              begin: stream.start,
+              end: stream.end
+            });
+          }
+          if (foundMissingData) {
+            nodesToRevisit.push(currentNode);
+          }
+        }
+      }
+      addChildren(currentNode, nodesToVisit);
+    }
+    if (pendingRequests.length) {
+      await this.xref.stream.manager.requestRanges(pendingRequests);
+      for (const node of nodesToRevisit) {
+        if (node instanceof Ref) {
+          this.refSet.remove(node);
+        }
+      }
+      await this.#walk(nodesToRevisit);
+    }
+  }
+  static async load(obj, keys, xref) {
+    if (xref.stream.isDataLoaded) {
+      return;
+    }
+    const objLoader = new ObjectLoader(obj, keys, xref);
+    await objLoader.load();
+  }
+}
+
+;// ./src/core/xfa/symbol_utils.js
+const $acceptWhitespace = Symbol();
+const $addHTML = Symbol();
+const $appendChild = Symbol();
+const $childrenToHTML = Symbol();
+const $clean = Symbol();
+const $cleanPage = Symbol();
+const $cleanup = Symbol();
+const $clone = Symbol();
+const $consumed = Symbol();
+const $content = Symbol("content");
+const $data = Symbol("data");
+const $dump = Symbol();
+const $extra = Symbol("extra");
+const $finalize = Symbol();
+const $flushHTML = Symbol();
+const $getAttributeIt = Symbol();
+const $getAttributes = Symbol();
+const $getAvailableSpace = Symbol();
+const $getChildrenByClass = Symbol();
+const $getChildrenByName = Symbol();
+const $getChildrenByNameIt = Symbol();
+const $getDataValue = Symbol();
+const $getExtra = Symbol();
+const $getRealChildrenByNameIt = Symbol();
+const $getChildren = Symbol();
+const $getContainedChildren = Symbol();
+const $getNextPage = Symbol();
+const $getSubformParent = Symbol();
+const $getParent = Symbol();
+const $getTemplateRoot = Symbol();
+const $globalData = Symbol();
+const $hasSettableValue = Symbol();
+const $ids = Symbol();
+const $indexOf = Symbol();
+const $insertAt = Symbol();
+const $isCDATAXml = Symbol();
+const $isBindable = Symbol();
+const $isDataValue = Symbol();
+const $isDescendent = Symbol();
+const $isNsAgnostic = Symbol();
+const $isSplittable = Symbol();
+const $isThereMoreWidth = Symbol();
+const $isTransparent = Symbol();
+const $isUsable = Symbol();
+const $lastAttribute = Symbol();
+const $namespaceId = Symbol("namespaceId");
+const $nodeName = Symbol("nodeName");
+const $nsAttributes = Symbol();
+const $onChild = Symbol();
+const $onChildCheck = Symbol();
+const $onText = Symbol();
+const $pushGlyphs = Symbol();
+const $popPara = Symbol();
+const $pushPara = Symbol();
+const $removeChild = Symbol();
+const $root = Symbol("root");
+const $resolvePrototypes = Symbol();
+const $searchNode = Symbol();
+const $setId = Symbol();
+const $setSetAttributes = Symbol();
+const $setValue = Symbol();
+const $tabIndex = Symbol();
+const $text = Symbol();
+const $toPages = Symbol();
+const $toHTML = Symbol();
+const $toString = Symbol();
+const $toStyle = Symbol();
+const $uid = Symbol("uid");
+
+;// ./src/core/xfa/namespaces.js
+const $buildXFAObject = Symbol();
+const NamespaceIds = {
+  config: {
+    id: 0,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xci/")
+  },
+  connectionSet: {
+    id: 1,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/")
+  },
+  datasets: {
+    id: 2,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/")
+  },
+  form: {
+    id: 3,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/")
+  },
+  localeSet: {
+    id: 4,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/")
+  },
+  pdf: {
+    id: 5,
+    check: ns => ns === "http://ns.adobe.com/xdp/pdf/"
+  },
+  signature: {
+    id: 6,
+    check: ns => ns === "http://www.w3.org/2000/09/xmldsig#"
+  },
+  sourceSet: {
+    id: 7,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/")
+  },
+  stylesheet: {
+    id: 8,
+    check: ns => ns === "http://www.w3.org/1999/XSL/Transform"
+  },
+  template: {
+    id: 9,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/")
+  },
+  xdc: {
+    id: 10,
+    check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/")
+  },
+  xdp: {
+    id: 11,
+    check: ns => ns === "http://ns.adobe.com/xdp/"
+  },
+  xfdf: {
+    id: 12,
+    check: ns => ns === "http://ns.adobe.com/xfdf/"
+  },
+  xhtml: {
+    id: 13,
+    check: ns => ns === "http://www.w3.org/1999/xhtml"
+  },
+  xmpmeta: {
+    id: 14,
+    check: ns => ns === "http://ns.adobe.com/xmpmeta/"
+  }
+};
+
+;// ./src/core/xfa/utils.js
+
+
+const dimConverters = {
+  pt: x => x,
+  cm: x => x / 2.54 * 72,
+  mm: x => x / (10 * 2.54) * 72,
+  in: x => x * 72,
+  px: x => x
+};
+const measurementPattern = /([+-]?\d+\.?\d*)(.*)/;
+function stripQuotes(str) {
+  if (str.startsWith("'") || str.startsWith('"')) {
+    return str.slice(1, -1);
+  }
+  return str;
+}
+function getInteger({
+  data,
+  defaultValue,
+  validate
+}) {
+  if (!data) {
+    return defaultValue;
+  }
+  data = data.trim();
+  const n = parseInt(data, 10);
+  if (!isNaN(n) && validate(n)) {
+    return n;
+  }
+  return defaultValue;
+}
+function getFloat({
+  data,
+  defaultValue,
+  validate
+}) {
+  if (!data) {
+    return defaultValue;
+  }
+  data = data.trim();
+  const n = parseFloat(data);
+  if (!isNaN(n) && validate(n)) {
+    return n;
+  }
+  return defaultValue;
+}
+function getKeyword({
+  data,
+  defaultValue,
+  validate
+}) {
+  if (!data) {
+    return defaultValue;
+  }
+  data = data.trim();
+  if (validate(data)) {
+    return data;
+  }
+  return defaultValue;
+}
+function getStringOption(data, options) {
+  return getKeyword({
+    data,
+    defaultValue: options[0],
+    validate: k => options.includes(k)
+  });
+}
+function getMeasurement(str, def = "0") {
+  def ||= "0";
+  if (!str) {
+    return getMeasurement(def);
+  }
+  const match = str.trim().match(measurementPattern);
+  if (!match) {
+    return getMeasurement(def);
+  }
+  const [, valueStr, unit] = match;
+  const value = parseFloat(valueStr);
+  if (isNaN(value)) {
+    return getMeasurement(def);
+  }
+  if (value === 0) {
+    return 0;
+  }
+  const conv = dimConverters[unit];
+  if (conv) {
+    return conv(value);
+  }
+  return value;
+}
+function getRatio(data) {
+  if (!data) {
+    return {
+      num: 1,
+      den: 1
+    };
+  }
+  const ratio = data.split(":", 2).map(x => parseFloat(x.trim())).filter(x => !isNaN(x));
+  if (ratio.length === 1) {
+    ratio.push(1);
+  }
+  if (ratio.length === 0) {
+    return {
+      num: 1,
+      den: 1
+    };
+  }
+  const [num, den] = ratio;
+  return {
+    num,
+    den
+  };
+}
+function getRelevant(data) {
+  if (!data) {
+    return [];
+  }
+  return data.trim().split(/\s+/).map(e => ({
+    excluded: e[0] === "-",
+    viewname: e.substring(1)
+  }));
+}
+function getColor(data, def = [0, 0, 0]) {
+  let [r, g, b] = def;
+  if (!data) {
+    return {
+      r,
+      g,
+      b
+    };
+  }
+  const color = data.split(",", 3).map(c => MathClamp(parseInt(c.trim(), 10), 0, 255)).map(c => isNaN(c) ? 0 : c);
+  if (color.length < 3) {
+    return {
+      r,
+      g,
+      b
+    };
+  }
+  [r, g, b] = color;
+  return {
+    r,
+    g,
+    b
+  };
+}
+function getBBox(data) {
+  const def = -1;
+  if (!data) {
+    return {
+      x: def,
+      y: def,
+      width: def,
+      height: def
+    };
+  }
+  const bbox = data.split(",", 4).map(m => getMeasurement(m.trim(), "-1"));
+  if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) {
+    return {
+      x: def,
+      y: def,
+      width: def,
+      height: def
+    };
+  }
+  const [x, y, width, height] = bbox;
+  return {
+    x,
+    y,
+    width,
+    height
+  };
+}
+class HTMLResult {
+  static get FAILURE() {
+    return shadow(this, "FAILURE", new HTMLResult(false, null, null, null));
+  }
+  static get EMPTY() {
+    return shadow(this, "EMPTY", new HTMLResult(true, null, null, null));
+  }
+  constructor(success, html, bbox, breakNode) {
+    this.success = success;
+    this.html = html;
+    this.bbox = bbox;
+    this.breakNode = breakNode;
+  }
+  isBreak() {
+    return !!this.breakNode;
+  }
+  static breakNode(node) {
+    return new HTMLResult(false, null, null, node);
+  }
+  static success(html, bbox = null) {
+    return new HTMLResult(true, html, bbox, null);
+  }
+}
+
+;// ./src/core/xfa/fonts.js
+
+
+
+class FontFinder {
+  constructor(pdfFonts) {
+    this.fonts = new Map();
+    this.cache = new Map();
+    this.warned = new Set();
+    this.defaultFont = null;
+    this.add(pdfFonts);
+  }
+  add(pdfFonts, reallyMissingFonts = null) {
+    for (const pdfFont of pdfFonts) {
+      this.addPdfFont(pdfFont);
+    }
+    for (const pdfFont of this.fonts.values()) {
+      if (!pdfFont.regular) {
+        pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic;
+      }
+    }
+    if (!reallyMissingFonts || reallyMissingFonts.size === 0) {
+      return;
+    }
+    const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA");
+    for (const missing of reallyMissingFonts) {
+      this.fonts.set(missing, myriad);
+    }
+  }
+  addPdfFont(pdfFont) {
+    const cssFontInfo = pdfFont.cssFontInfo;
+    const name = cssFontInfo.fontFamily;
+    const font = this.fonts.getOrInsertComputed(name, makeObj);
+    this.defaultFont ??= font;
+    let property = "";
+    const fontWeight = parseFloat(cssFontInfo.fontWeight);
+    if (parseFloat(cssFontInfo.italicAngle) !== 0) {
+      property = fontWeight >= 700 ? "bolditalic" : "italic";
+    } else if (fontWeight >= 700) {
+      property = "bold";
+    }
+    if (!property) {
+      if (pdfFont.name.includes("Bold") || pdfFont.psName?.includes("Bold")) {
+        property = "bold";
+      }
+      if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName?.includes("Italic") || pdfFont.psName?.endsWith("It")) {
+        property += "italic";
+      }
+    }
+    if (!property) {
+      property = "regular";
+    }
+    font[property] = pdfFont;
+  }
+  getDefault() {
+    return this.defaultFont;
+  }
+  find(fontName, mustWarn = true) {
+    let font = this.fonts.get(fontName) || this.cache.get(fontName);
+    if (font) {
+      return font;
+    }
+    const pattern = /[,\-_ ]|bolditalic|bold|italic|regular|it/gi;
+    let name = fontName.replaceAll(pattern, "");
+    font = this.fonts.get(name);
+    if (font) {
+      this.cache.set(fontName, font);
+      return font;
+    }
+    name = name.toLowerCase();
+    const maybe = [];
+    for (const [family, pdfFont] of this.fonts) {
+      if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) {
+        maybe.push(pdfFont);
+      }
+    }
+    if (maybe.length === 0) {
+      for (const pdfFont of this.fonts.values()) {
+        if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) {
+          maybe.push(pdfFont);
+        }
+      }
+    }
+    if (maybe.length === 0) {
+      name = name.replaceAll(/psmt|mt/gi, "");
+      for (const [family, pdfFont] of this.fonts) {
+        if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) {
+          maybe.push(pdfFont);
+        }
+      }
+    }
+    if (maybe.length === 0) {
+      for (const pdfFont of this.fonts.values()) {
+        if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) {
+          maybe.push(pdfFont);
+        }
+      }
+    }
+    if (maybe.length >= 1) {
+      if (maybe.length !== 1 && mustWarn) {
+        warn(`XFA - Too many choices to guess the correct font: ${fontName}`);
+      }
+      this.cache.set(fontName, maybe[0]);
+      return maybe[0];
+    }
+    if (mustWarn && !this.warned.has(fontName)) {
+      this.warned.add(fontName);
+      warn(`XFA - Cannot find the font: ${fontName}`);
+    }
+    return null;
+  }
+}
+function selectFont(xfaFont, typeface) {
+  if (xfaFont.posture === "italic") {
+    if (xfaFont.weight === "bold") {
+      return typeface.bolditalic;
+    }
+    return typeface.italic;
+  } else if (xfaFont.weight === "bold") {
+    return typeface.bold;
+  }
+  return typeface.regular;
+}
+function fonts_getMetrics(xfaFont, real = false) {
+  let pdfFont = null;
+  if (xfaFont) {
+    const name = stripQuotes(xfaFont.typeface);
+    const typeface = xfaFont[$globalData].fontFinder.find(name);
+    pdfFont = selectFont(xfaFont, typeface);
+  }
+  if (!pdfFont) {
+    return {
+      lineHeight: 12,
+      lineGap: 2,
+      lineNoGap: 10
+    };
+  }
+  const size = xfaFont.size || 10;
+  const lineHeight = pdfFont.lineHeight ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight) : 1.2;
+  const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap;
+  return {
+    lineHeight: lineHeight * size,
+    lineGap: lineGap * size,
+    lineNoGap: Math.max(1, lineHeight - lineGap) * size
+  };
+}
+
+;// ./src/core/xfa/text.js
+
+const WIDTH_FACTOR = 1.02;
+class FontInfo {
+  constructor(xfaFont, margin, lineHeight, fontFinder) {
+    this.lineHeight = lineHeight;
+    this.paraMargin = margin || {
+      top: 0,
+      bottom: 0,
+      left: 0,
+      right: 0
+    };
+    if (!xfaFont) {
+      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
+      return;
+    }
+    this.xfaFont = {
+      typeface: xfaFont.typeface,
+      posture: xfaFont.posture,
+      weight: xfaFont.weight,
+      size: xfaFont.size,
+      letterSpacing: xfaFont.letterSpacing
+    };
+    const typeface = fontFinder.find(xfaFont.typeface);
+    if (!typeface) {
+      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
+      return;
+    }
+    this.pdfFont = selectFont(xfaFont, typeface);
+    if (!this.pdfFont) {
+      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
+    }
+  }
+  defaultFont(fontFinder) {
+    const font = fontFinder.find("Helvetica", false) || fontFinder.find("Myriad Pro", false) || fontFinder.find("Arial", false) || fontFinder.getDefault();
+    if (font?.regular) {
+      const pdfFont = font.regular;
+      const info = pdfFont.cssFontInfo;
+      const xfaFont = {
+        typeface: info.fontFamily,
+        posture: "normal",
+        weight: "normal",
+        size: 10,
+        letterSpacing: 0
+      };
+      return [pdfFont, xfaFont];
+    }
+    const xfaFont = {
+      typeface: "Courier",
+      posture: "normal",
+      weight: "normal",
+      size: 10,
+      letterSpacing: 0
+    };
+    return [null, xfaFont];
+  }
+}
+class FontSelector {
+  constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) {
+    this.fontFinder = fontFinder;
+    this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)];
+  }
+  pushData(xfaFont, margin, lineHeight) {
+    const lastFont = this.stack.at(-1);
+    for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) {
+      xfaFont[name] ||= lastFont.xfaFont[name];
+    }
+    for (const name of ["top", "bottom", "left", "right"]) {
+      if (isNaN(margin[name])) {
+        margin[name] = lastFont.paraMargin[name];
+      }
+    }
+    const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder);
+    fontInfo.pdfFont ||= lastFont.pdfFont;
+    this.stack.push(fontInfo);
+  }
+  popFont() {
+    this.stack.pop();
+  }
+  topFont() {
+    return this.stack.at(-1);
+  }
+}
+class TextMeasure {
+  constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) {
+    this.glyphs = [];
+    this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts);
+    this.extraHeight = 0;
+  }
+  pushData(xfaFont, margin, lineHeight) {
+    this.fontSelector.pushData(xfaFont, margin, lineHeight);
+  }
+  popFont(xfaFont) {
+    return this.fontSelector.popFont();
+  }
+  addPara() {
+    const lastFont = this.fontSelector.topFont();
+    this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom;
+  }
+  addString(str) {
+    if (!str) {
+      return;
+    }
+    const lastFont = this.fontSelector.topFont();
+    const fontSize = lastFont.xfaFont.size;
+    if (lastFont.pdfFont) {
+      const letterSpacing = lastFont.xfaFont.letterSpacing;
+      const pdfFont = lastFont.pdfFont;
+      const fontLineHeight = pdfFont.lineHeight || 1.2;
+      const lineHeight = lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize;
+      const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap;
+      const noGap = fontLineHeight - lineGap;
+      const firstLineHeight = Math.max(1, noGap) * fontSize;
+      const scale = fontSize / 1000;
+      const fallbackWidth = pdfFont.defaultWidth || pdfFont.charsToGlyphs(" ")[0].width;
+      for (const line of str.split(/[\u2029\n]/)) {
+        const encodedLine = pdfFont.encodeString(line).join("");
+        const glyphs = pdfFont.charsToGlyphs(encodedLine);
+        for (const glyph of glyphs) {
+          const width = glyph.width || fallbackWidth;
+          this.glyphs.push([width * scale + letterSpacing, lineHeight, firstLineHeight, glyph.unicode, false]);
+        }
+        this.glyphs.push([0, 0, 0, "\n", true]);
+      }
+      this.glyphs.pop();
+      return;
+    }
+    for (const line of str.split(/[\u2029\n]/)) {
+      for (const char of line.split("")) {
+        this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]);
+      }
+      this.glyphs.push([0, 0, 0, "\n", true]);
+    }
+    this.glyphs.pop();
+  }
+  compute(maxWidth) {
+    let lastSpacePos = -1,
+      lastSpaceWidth = 0,
+      width = 0,
+      height = 0,
+      currentLineWidth = 0,
+      currentLineHeight = 0;
+    let isBroken = false;
+    let isFirstLine = true;
+    for (let i = 0, ii = this.glyphs.length; i < ii; i++) {
+      const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] = this.glyphs[i];
+      const isSpace = char === " ";
+      const glyphHeight = isFirstLine ? firstLineHeight : lineHeight;
+      if (isEOL) {
+        width = Math.max(width, currentLineWidth);
+        currentLineWidth = 0;
+        height += currentLineHeight;
+        currentLineHeight = glyphHeight;
+        lastSpacePos = -1;
+        lastSpaceWidth = 0;
+        isFirstLine = false;
+        continue;
+      }
+      if (isSpace) {
+        if (currentLineWidth + glyphWidth > maxWidth) {
+          width = Math.max(width, currentLineWidth);
+          currentLineWidth = 0;
+          height += currentLineHeight;
+          currentLineHeight = glyphHeight;
+          lastSpacePos = -1;
+          lastSpaceWidth = 0;
+          isBroken = true;
+          isFirstLine = false;
+        } else {
+          currentLineHeight = Math.max(glyphHeight, currentLineHeight);
+          lastSpaceWidth = currentLineWidth;
+          currentLineWidth += glyphWidth;
+          lastSpacePos = i;
+        }
+        continue;
+      }
+      if (currentLineWidth + glyphWidth > maxWidth) {
+        height += currentLineHeight;
+        currentLineHeight = glyphHeight;
+        if (lastSpacePos !== -1) {
+          i = lastSpacePos;
+          width = Math.max(width, lastSpaceWidth);
+          currentLineWidth = 0;
+          lastSpacePos = -1;
+          lastSpaceWidth = 0;
+        } else {
+          width = Math.max(width, currentLineWidth);
+          currentLineWidth = glyphWidth;
+        }
+        isBroken = true;
+        isFirstLine = false;
+        continue;
+      }
+      currentLineWidth += glyphWidth;
+      currentLineHeight = Math.max(glyphHeight, currentLineHeight);
+    }
+    width = Math.max(width, currentLineWidth);
+    height += currentLineHeight + this.extraHeight;
+    return {
+      width: WIDTH_FACTOR * width,
+      height,
+      isBroken
+    };
+  }
+}
+
+;// ./src/core/xfa/som.js
+
+
+const namePattern = /^[^.[]+/;
+const indexPattern = /^[^\]]+/;
+const operators = {
+  dot: 0,
+  dotDot: 1,
+  dotHash: 2,
+  dotBracket: 3,
+  dotParen: 4
+};
+const shortcuts = new Map([["$data", (root, current) => root.datasets ? root.datasets.data : root], ["$record", (root, current) => (root.datasets ? root.datasets.data : root)[$getChildren]()[0]], ["$template", (root, current) => root.template], ["$connectionSet", (root, current) => root.connectionSet], ["$form", (root, current) => root.form], ["$layout", (root, current) => root.layout], ["$host", (root, current) => root.host], ["$dataWindow", (root, current) => root.dataWindow], ["$event", (root, current) => root.event], ["!", (root, current) => root.datasets], ["$xfa", (root, current) => root], ["xfa", (root, current) => root], ["$", (root, current) => current]]);
+const somCache = new WeakMap();
+function parseIndex(index) {
+  index = index.trim();
+  if (index === "*") {
+    return Infinity;
+  }
+  return parseInt(index, 10) || 0;
+}
+function parseExpression(expr, dotDotAllowed, noExpr = true) {
+  let match = expr.match(namePattern);
+  if (!match) {
+    return null;
+  }
+  let [name] = match;
+  const parsed = [{
+    name,
+    cacheName: "." + name,
+    index: 0,
+    js: null,
+    formCalc: null,
+    operator: operators.dot
+  }];
+  let pos = name.length;
+  while (pos < expr.length) {
+    const spos = pos;
+    const char = expr.charAt(pos++);
+    if (char === "[") {
+      match = expr.slice(pos).match(indexPattern);
+      if (!match) {
+        warn("XFA - Invalid index in SOM expression");
+        return null;
+      }
+      parsed.at(-1).index = parseIndex(match[0]);
+      pos += match[0].length + 1;
+      continue;
+    }
+    let operator;
+    switch (expr.charAt(pos)) {
+      case ".":
+        if (!dotDotAllowed) {
+          return null;
+        }
+        pos++;
+        operator = operators.dotDot;
+        break;
+      case "#":
+        pos++;
+        operator = operators.dotHash;
+        break;
+      case "[":
+        if (noExpr) {
+          warn("XFA - SOM expression contains a FormCalc subexpression which is not supported for now.");
+          return null;
+        }
+        operator = operators.dotBracket;
+        break;
+      case "(":
+        if (noExpr) {
+          warn("XFA - SOM expression contains a JavaScript subexpression which is not supported for now.");
+          return null;
+        }
+        operator = operators.dotParen;
+        break;
+      default:
+        operator = operators.dot;
+        break;
+    }
+    match = expr.slice(pos).match(namePattern);
+    if (!match) {
+      break;
+    }
+    [name] = match;
+    pos += name.length;
+    parsed.push({
+      name,
+      cacheName: expr.slice(spos, pos),
+      operator,
+      index: 0,
+      js: null,
+      formCalc: null
+    });
+  }
+  return parsed;
+}
+function searchNode(root, container, expr, dotDotAllowed = true, useCache = true) {
+  const parsed = parseExpression(expr, dotDotAllowed);
+  if (!parsed) {
+    return null;
+  }
+  const fn = shortcuts.get(parsed[0].name);
+  let i = 0;
+  let isQualified;
+  if (fn) {
+    isQualified = true;
+    root = [fn(root, container)];
+    i = 1;
+  } else {
+    isQualified = container === null;
+    root = [container || root];
+  }
+  for (let ii = parsed.length; i < ii; i++) {
+    const {
+      name,
+      cacheName,
+      operator,
+      index
+    } = parsed[i];
+    const nodes = [];
+    for (const node of root) {
+      if (!node.isXFAObject) {
+        continue;
+      }
+      let children, cached;
+      if (useCache) {
+        cached = somCache.getOrInsertComputed(node, makeMap);
+        children = cached.get(cacheName);
+      }
+      if (!children) {
+        switch (operator) {
+          case operators.dot:
+            children = node[$getChildrenByName](name, false);
+            break;
+          case operators.dotDot:
+            children = node[$getChildrenByName](name, true);
+            break;
+          case operators.dotHash:
+            children = node[$getChildrenByClass](name);
+            children = children.isXFAObjectArray ? children.children : [children];
+            break;
+          default:
+            break;
+        }
+        if (useCache) {
+          cached.set(cacheName, children);
+        }
+      }
+      if (children.length > 0) {
+        nodes.push(children);
+      }
+    }
+    if (nodes.length === 0 && !isQualified && i === 0) {
+      const parent = container[$getParent]();
+      container = parent;
+      if (!container) {
+        return null;
+      }
+      i = -1;
+      root = [container];
+      continue;
+    }
+    root = isFinite(index) ? nodes.filter(node => index < node.length).map(node => node[index]) : nodes.flat();
+  }
+  if (root.length === 0) {
+    return null;
+  }
+  return root;
+}
+function createDataNode(root, container, expr) {
+  const parsed = parseExpression(expr);
+  if (!parsed) {
+    return null;
+  }
+  if (parsed.some(x => x.operator === operators.dotDot)) {
+    return null;
+  }
+  const fn = shortcuts.get(parsed[0].name);
+  let i = 0;
+  if (fn) {
+    root = fn(root, container);
+    i = 1;
+  } else {
+    root = container || root;
+  }
+  for (let ii = parsed.length; i < ii; i++) {
+    const {
+      name,
+      operator,
+      index
+    } = parsed[i];
+    if (!isFinite(index)) {
+      parsed[i].index = 0;
+      return root.createNodes(parsed.slice(i));
+    }
+    let children;
+    switch (operator) {
+      case operators.dot:
+        children = root[$getChildrenByName](name, false);
+        break;
+      case operators.dotDot:
+        children = root[$getChildrenByName](name, true);
+        break;
+      case operators.dotHash:
+        children = root[$getChildrenByClass](name);
+        children = children.isXFAObjectArray ? children.children : [children];
+        break;
+      default:
+        break;
+    }
+    if (children.length === 0) {
+      return root.createNodes(parsed.slice(i));
+    }
+    if (index < children.length) {
+      const child = children[index];
+      if (!child.isXFAObject) {
+        warn(`XFA - Cannot create a node.`);
+        return null;
+      }
+      root = child;
+    } else {
+      parsed[i].index = index - children.length;
+      return root.createNodes(parsed.slice(i));
+    }
+  }
+  return null;
+}
+
+;// ./src/core/xfa/xfa_object.js
+
+
+
+
+
+
+const _applyPrototype = Symbol();
+const _attributes = Symbol();
+const _attributeNames = Symbol();
+const _children = Symbol("_children");
+const _cloneAttribute = Symbol();
+const _dataValue = Symbol();
+const _defaultValue = Symbol();
+const _filteredChildrenGenerator = Symbol();
+const _getPrototype = Symbol();
+const _getUnsetAttributes = Symbol();
+const _hasChildren = Symbol();
+const _max = Symbol();
+const _options = Symbol();
+const _parent = Symbol("parent");
+const _resolvePrototypesHelper = Symbol();
+const _setAttributes = Symbol();
+const _validator = Symbol();
+let uid = 0;
+const NS_DATASETS = NamespaceIds.datasets.id;
+class XFAObject {
+  constructor(nsId, name, hasChildren = false) {
+    this[$namespaceId] = nsId;
+    this[$nodeName] = name;
+    this[_hasChildren] = hasChildren;
+    this[_parent] = null;
+    this[_children] = [];
+    this[$uid] = `${name}${uid++}`;
+    this[$globalData] = null;
+  }
+  get isXFAObject() {
+    return true;
+  }
+  get isXFAObjectArray() {
+    return false;
+  }
+  createNodes(path) {
+    let root = this,
+      node = null;
+    for (const {
+      name,
+      index
+    } of path) {
+      for (let i = 0, ii = isFinite(index) ? index : 0; i <= ii; i++) {
+        const nsId = root[$namespaceId] === NS_DATASETS ? -1 : root[$namespaceId];
+        node = new XmlObject(nsId, name);
+        root[$appendChild](node);
+      }
+      root = node;
+    }
+    return node;
+  }
+  [$onChild](child) {
+    if (!this[_hasChildren] || !this[$onChildCheck](child)) {
+      return false;
+    }
+    const name = child[$nodeName];
+    const node = this[name];
+    if (node instanceof XFAObjectArray) {
+      if (node.push(child)) {
+        this[$appendChild](child);
+        return true;
+      }
+    } else {
+      if (node !== null) {
+        this[$removeChild](node);
+      }
+      this[name] = child;
+      this[$appendChild](child);
+      return true;
+    }
+    let id = "";
+    if (this.id) {
+      id = ` (id: ${this.id})`;
+    } else if (this.name) {
+      id = ` (name: ${this.name} ${this.h.value})`;
+    }
+    warn(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`);
+    return false;
+  }
+  [$onChildCheck](child) {
+    return Object.hasOwn(this, child[$nodeName]) && child[$namespaceId] === this[$namespaceId];
+  }
+  [$isNsAgnostic]() {
+    return false;
+  }
+  [$acceptWhitespace]() {
+    return false;
+  }
+  [$isCDATAXml]() {
+    return false;
+  }
+  [$isBindable]() {
+    return false;
+  }
+  [$popPara]() {
+    if (this.para) {
+      this[$getTemplateRoot]()[$extra].paraStack.pop();
+    }
+  }
+  [$pushPara]() {
+    this[$getTemplateRoot]()[$extra].paraStack.push(this.para);
+  }
+  [$setId](ids) {
+    if (this.id && this[$namespaceId] === NamespaceIds.template.id) {
+      ids.set(this.id, this);
+    }
+  }
+  [$getTemplateRoot]() {
+    return this[$globalData].template;
+  }
+  [$isSplittable]() {
+    return false;
+  }
+  [$isThereMoreWidth]() {
+    return false;
+  }
+  [$appendChild](child) {
+    child[_parent] = this;
+    this[_children].push(child);
+    if (!child[$globalData] && this[$globalData]) {
+      child[$globalData] = this[$globalData];
+    }
+  }
+  [$removeChild](child) {
+    const i = this[_children].indexOf(child);
+    this[_children].splice(i, 1);
+  }
+  [$hasSettableValue]() {
+    return Object.hasOwn(this, "value");
+  }
+  [$setValue](_) {}
+  [$onText](_) {}
+  [$finalize]() {}
+  [$clean](builder) {
+    delete this[_hasChildren];
+    if (this[$cleanup]) {
+      builder.clean(this[$cleanup]);
+      delete this[$cleanup];
+    }
+  }
+  [$indexOf](child) {
+    return this[_children].indexOf(child);
+  }
+  [$insertAt](i, child) {
+    child[_parent] = this;
+    this[_children].splice(i, 0, child);
+    if (!child[$globalData] && this[$globalData]) {
+      child[$globalData] = this[$globalData];
+    }
+  }
+  [$isTransparent]() {
+    return !this.name;
+  }
+  [$lastAttribute]() {
+    return "";
+  }
+  [$text]() {
+    if (this[_children].length === 0) {
+      return this[$content];
+    }
+    return this[_children].map(c => c[$text]()).join("");
+  }
+  get [_attributeNames]() {
+    const proto = Object.getPrototypeOf(this);
+    if (!proto._attributes) {
+      const attributes = proto._attributes = new Set();
+      for (const name of Object.getOwnPropertyNames(this)) {
+        if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) {
+          break;
+        }
+        attributes.add(name);
+      }
+    }
+    return shadow(this, _attributeNames, proto._attributes);
+  }
+  [$isDescendent](parent) {
+    let node = this;
+    while (node) {
+      if (node === parent) {
+        return true;
+      }
+      node = node[$getParent]();
+    }
+    return false;
+  }
+  [$getParent]() {
+    return this[_parent];
+  }
+  [$getSubformParent]() {
+    return this[$getParent]();
+  }
+  [$getChildren](name = null) {
+    if (!name) {
+      return this[_children];
+    }
+    return this[name];
+  }
+  [$dump]() {
+    const dumped = Object.create(null);
+    if (this[$content]) {
+      dumped.$content = this[$content];
+    }
+    for (const name of Object.getOwnPropertyNames(this)) {
+      const value = this[name];
+      if (value === null) {
+        continue;
+      }
+      if (value instanceof XFAObject) {
+        dumped[name] = value[$dump]();
+      } else if (value instanceof XFAObjectArray) {
+        if (!value.isEmpty()) {
+          dumped[name] = value.dump();
+        }
+      } else {
+        dumped[name] = value;
+      }
+    }
+    return dumped;
+  }
+  [$toStyle]() {
+    return null;
+  }
+  [$toHTML]() {
+    return HTMLResult.EMPTY;
+  }
+  *[$getContainedChildren]() {
+    for (const node of this[$getChildren]()) {
+      yield node;
+    }
+  }
+  *[_filteredChildrenGenerator](filter, include) {
+    for (const node of this[$getContainedChildren]()) {
+      if (!filter || include === filter.has(node[$nodeName])) {
+        const availableSpace = this[$getAvailableSpace]();
+        const res = node[$toHTML](availableSpace);
+        if (!res.success) {
+          this[$extra].failingNode = node;
+        }
+        yield res;
+      }
+    }
+  }
+  [$flushHTML]() {
+    return null;
+  }
+  [$addHTML](html, bbox) {
+    this[$extra].children.push(html);
+  }
+  [$getAvailableSpace]() {}
+  [$childrenToHTML]({
+    filter = null,
+    include = true
+  }) {
+    if (!this[$extra].generator) {
+      this[$extra].generator = this[_filteredChildrenGenerator](filter, include);
+    } else {
+      const availableSpace = this[$getAvailableSpace]();
+      const res = this[$extra].failingNode[$toHTML](availableSpace);
+      if (!res.success) {
+        return res;
+      }
+      if (res.html) {
+        this[$addHTML](res.html, res.bbox);
+      }
+      delete this[$extra].failingNode;
+    }
+    while (true) {
+      const gen = this[$extra].generator.next();
+      if (gen.done) {
+        break;
+      }
+      const res = gen.value;
+      if (!res.success) {
+        return res;
+      }
+      if (res.html) {
+        this[$addHTML](res.html, res.bbox);
+      }
+    }
+    this[$extra].generator = null;
+    return HTMLResult.EMPTY;
+  }
+  [$setSetAttributes](attributes) {
+    this[_setAttributes] = new Set(Object.keys(attributes));
+  }
+  [_getUnsetAttributes](protoAttributes) {
+    const allAttr = this[_attributeNames];
+    const setAttr = this[_setAttributes];
+    return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x));
+  }
+  [$resolvePrototypes](ids, ancestors = new Set()) {
+    for (const child of this[_children]) {
+      child[_resolvePrototypesHelper](ids, ancestors);
+    }
+  }
+  [_resolvePrototypesHelper](ids, ancestors) {
+    const proto = this[_getPrototype](ids, ancestors);
+    if (proto) {
+      this[_applyPrototype](proto, ids, ancestors);
+    } else {
+      this[$resolvePrototypes](ids, ancestors);
+    }
+  }
+  [_getPrototype](ids, ancestors) {
+    const {
+      use,
+      usehref
+    } = this;
+    if (!use && !usehref) {
+      return null;
+    }
+    let proto = null;
+    let somExpression = null;
+    let id = null;
+    let ref = use;
+    if (usehref) {
+      ref = usehref;
+      if (usehref.startsWith("#som(") && usehref.endsWith(")")) {
+        somExpression = usehref.slice("#som(".length, -1);
+      } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) {
+        somExpression = usehref.slice(".#som(".length, -1);
+      } else if (usehref.startsWith("#")) {
+        id = usehref.slice(1);
+      } else if (usehref.startsWith(".#")) {
+        id = usehref.slice(2);
+      }
+    } else if (use.startsWith("#")) {
+      id = use.slice(1);
+    } else {
+      somExpression = use;
+    }
+    this.use = this.usehref = "";
+    if (id) {
+      proto = ids.get(id);
+    } else {
+      proto = searchNode(ids.get($root), this, somExpression, true, false);
+      if (proto) {
+        proto = proto[0];
+      }
+    }
+    if (!proto) {
+      warn(`XFA - Invalid prototype reference: ${ref}.`);
+      return null;
+    }
+    if (proto[$nodeName] !== this[$nodeName]) {
+      warn(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`);
+      return null;
+    }
+    if (ancestors.has(proto)) {
+      warn(`XFA - Cycle detected in prototypes use.`);
+      return null;
+    }
+    ancestors.add(proto);
+    const protoProto = proto[_getPrototype](ids, ancestors);
+    if (protoProto) {
+      proto[_applyPrototype](protoProto, ids, ancestors);
+    }
+    proto[$resolvePrototypes](ids, ancestors);
+    ancestors.delete(proto);
+    return proto;
+  }
+  [_applyPrototype](proto, ids, ancestors) {
+    if (ancestors.has(proto)) {
+      warn(`XFA - Cycle detected in prototypes use.`);
+      return;
+    }
+    if (!this[$content] && proto[$content]) {
+      this[$content] = proto[$content];
+    }
+    const newAncestors = new Set(ancestors);
+    newAncestors.add(proto);
+    for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) {
+      this[unsetAttrName] = proto[unsetAttrName];
+      if (this[_setAttributes]) {
+        this[_setAttributes].add(unsetAttrName);
+      }
+    }
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (this[_attributeNames].has(name)) {
+        continue;
+      }
+      const value = this[name];
+      const protoValue = proto[name];
+      if (value instanceof XFAObjectArray) {
+        for (const child of value[_children]) {
+          child[_resolvePrototypesHelper](ids, ancestors);
+        }
+        for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) {
+          const child = proto[_children][i][$clone]();
+          if (value.push(child)) {
+            child[_parent] = this;
+            this[_children].push(child);
+            child[_resolvePrototypesHelper](ids, ancestors);
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      if (value !== null) {
+        value[$resolvePrototypes](ids, ancestors);
+        if (protoValue) {
+          value[_applyPrototype](protoValue, ids, ancestors);
+        }
+        continue;
+      }
+      if (protoValue !== null) {
+        const child = protoValue[$clone]();
+        child[_parent] = this;
+        this[name] = child;
+        this[_children].push(child);
+        child[_resolvePrototypesHelper](ids, ancestors);
+      }
+    }
+  }
+  static [_cloneAttribute](obj) {
+    if (Array.isArray(obj)) {
+      return obj.map(x => XFAObject[_cloneAttribute](x));
+    }
+    if (typeof obj === "object" && obj !== null) {
+      return Object.assign({}, obj);
+    }
+    return obj;
+  }
+  [$clone]() {
+    const clone = Object.create(Object.getPrototypeOf(this));
+    for (const $symbol of Object.getOwnPropertySymbols(this)) {
+      try {
+        clone[$symbol] = this[$symbol];
+      } catch {
+        shadow(clone, $symbol, this[$symbol]);
+      }
+    }
+    clone[$uid] = `${clone[$nodeName]}${uid++}`;
+    clone[_children] = [];
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (this[_attributeNames].has(name)) {
+        clone[name] = XFAObject[_cloneAttribute](this[name]);
+        continue;
+      }
+      const value = this[name];
+      clone[name] = value instanceof XFAObjectArray ? new XFAObjectArray(value[_max]) : null;
+    }
+    for (const child of this[_children]) {
+      const name = child[$nodeName];
+      const clonedChild = child[$clone]();
+      clone[_children].push(clonedChild);
+      clonedChild[_parent] = clone;
+      if (clone[name] === null) {
+        clone[name] = clonedChild;
+      } else {
+        clone[name][_children].push(clonedChild);
+      }
+    }
+    return clone;
+  }
+  [$getChildren](name = null) {
+    if (!name) {
+      return this[_children];
+    }
+    return this[_children].filter(c => c[$nodeName] === name);
+  }
+  [$getChildrenByClass](name) {
+    return this[name];
+  }
+  [$getChildrenByName](name, allTransparent, first = true) {
+    return Array.from(this[$getChildrenByNameIt](name, allTransparent, first));
+  }
+  *[$getChildrenByNameIt](name, allTransparent, first = true) {
+    if (name === "parent") {
+      yield this[_parent];
+      return;
+    }
+    for (const child of this[_children]) {
+      if (child[$nodeName] === name) {
+        yield child;
+      }
+      if (child.name === name) {
+        yield child;
+      }
+      if (allTransparent || child[$isTransparent]()) {
+        yield* child[$getChildrenByNameIt](name, allTransparent, false);
+      }
+    }
+    if (first && this[_attributeNames].has(name)) {
+      yield new XFAAttribute(this, name, this[name]);
+    }
+  }
+}
+class XFAObjectArray {
+  constructor(max = Infinity) {
+    this[_max] = max;
+    this[_children] = [];
+  }
+  get isXFAObject() {
+    return false;
+  }
+  get isXFAObjectArray() {
+    return true;
+  }
+  push(child) {
+    const len = this[_children].length;
+    if (len <= this[_max]) {
+      this[_children].push(child);
+      return true;
+    }
+    warn(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`);
+    return false;
+  }
+  isEmpty() {
+    return this[_children].length === 0;
+  }
+  dump() {
+    return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]());
+  }
+  [$clone]() {
+    const clone = new XFAObjectArray(this[_max]);
+    clone[_children] = this[_children].map(c => c[$clone]());
+    return clone;
+  }
+  get children() {
+    return this[_children];
+  }
+  clear() {
+    this[_children].length = 0;
+  }
+}
+class XFAAttribute {
+  constructor(node, name, value) {
+    this[_parent] = node;
+    this[$nodeName] = name;
+    this[$content] = value;
+    this[$consumed] = false;
+    this[$uid] = `attribute${uid++}`;
+  }
+  [$getParent]() {
+    return this[_parent];
+  }
+  [$isDataValue]() {
+    return true;
+  }
+  [$getDataValue]() {
+    return this[$content].trim();
+  }
+  [$setValue](value) {
+    value = value.value || "";
+    this[$content] = value.toString();
+  }
+  [$text]() {
+    return this[$content];
+  }
+  [$isDescendent](parent) {
+    return this[_parent] === parent || this[_parent][$isDescendent](parent);
+  }
+}
+class XmlObject extends XFAObject {
+  constructor(nsId, name, attributes = {}) {
+    super(nsId, name);
+    this[$content] = "";
+    this[_dataValue] = null;
+    if (name !== "#text") {
+      const map = new Map();
+      this[_attributes] = map;
+      for (const [attrName, value] of Object.entries(attributes)) {
+        map.set(attrName, new XFAAttribute(this, attrName, value));
+      }
+      if (Object.hasOwn(attributes, $nsAttributes)) {
+        const dataNode = attributes[$nsAttributes].xfa.dataNode;
+        if (dataNode !== undefined) {
+          if (dataNode === "dataGroup") {
+            this[_dataValue] = false;
+          } else if (dataNode === "dataValue") {
+            this[_dataValue] = true;
+          }
+        }
+      }
+    }
+    this[$consumed] = false;
+  }
+  [$toString](buf) {
+    const tagName = this[$nodeName];
+    if (tagName === "#text") {
+      buf.push(encodeToXmlString(this[$content]));
+      return;
+    }
+    const utf8TagName = utf8StringToString(tagName);
+    const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : "";
+    buf.push(`<${prefix}${utf8TagName}`);
+    for (const [name, value] of this[_attributes]) {
+      const utf8Name = utf8StringToString(name);
+      buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`);
+    }
+    if (this[_dataValue] !== null) {
+      if (this[_dataValue]) {
+        buf.push(` xfa:dataNode="dataValue"`);
+      } else {
+        buf.push(` xfa:dataNode="dataGroup"`);
+      }
+    }
+    if (!this[$content] && this[_children].length === 0) {
+      buf.push("/>");
+      return;
+    }
+    buf.push(">");
+    if (this[$content]) {
+      if (typeof this[$content] === "string") {
+        buf.push(encodeToXmlString(this[$content]));
+      } else {
+        this[$content][$toString](buf);
+      }
+    } else {
+      for (const child of this[_children]) {
+        child[$toString](buf);
+      }
+    }
+    buf.push(`</${prefix}${utf8TagName}>`);
+  }
+  [$onChild](child) {
+    if (this[$content]) {
+      const node = new XmlObject(this[$namespaceId], "#text");
+      this[$appendChild](node);
+      node[$content] = this[$content];
+      this[$content] = "";
+    }
+    this[$appendChild](child);
+    return true;
+  }
+  [$onText](str) {
+    this[$content] += str;
+  }
+  [$finalize]() {
+    if (this[$content] && this[_children].length > 0) {
+      const node = new XmlObject(this[$namespaceId], "#text");
+      this[$appendChild](node);
+      node[$content] = this[$content];
+      delete this[$content];
+    }
+  }
+  [$toHTML]() {
+    if (this[$nodeName] === "#text") {
+      return HTMLResult.success({
+        name: "#text",
+        value: this[$content]
+      });
+    }
+    return HTMLResult.EMPTY;
+  }
+  [$getChildren](name = null) {
+    if (!name) {
+      return this[_children];
+    }
+    return this[_children].filter(c => c[$nodeName] === name);
+  }
+  [$getAttributes]() {
+    return this[_attributes];
+  }
+  [$getChildrenByClass](name) {
+    const value = this[_attributes].get(name);
+    if (value !== undefined) {
+      return value;
+    }
+    return this[$getChildren](name);
+  }
+  *[$getChildrenByNameIt](name, allTransparent) {
+    const value = this[_attributes].get(name);
+    if (value) {
+      yield value;
+    }
+    for (const child of this[_children]) {
+      if (child[$nodeName] === name) {
+        yield child;
+      }
+      if (allTransparent) {
+        yield* child[$getChildrenByNameIt](name, allTransparent);
+      }
+    }
+  }
+  *[$getAttributeIt](name, skipConsumed) {
+    const value = this[_attributes].get(name);
+    if (value && (!skipConsumed || !value[$consumed])) {
+      yield value;
+    }
+    for (const child of this[_children]) {
+      yield* child[$getAttributeIt](name, skipConsumed);
+    }
+  }
+  *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) {
+    for (const child of this[_children]) {
+      if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) {
+        yield child;
+      }
+      if (allTransparent) {
+        yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed);
+      }
+    }
+  }
+  [$isDataValue]() {
+    if (this[_dataValue] === null) {
+      return this[_children].length === 0 || this[_children][0][$namespaceId] === NamespaceIds.xhtml.id;
+    }
+    return this[_dataValue];
+  }
+  [$getDataValue]() {
+    if (this[_dataValue] === null) {
+      if (this[_children].length === 0) {
+        return this[$content].trim();
+      }
+      if (this[_children][0][$namespaceId] === NamespaceIds.xhtml.id) {
+        return this[_children][0][$text]().trim();
+      }
+      return null;
+    }
+    return this[$content].trim();
+  }
+  [$setValue](value) {
+    value = value.value || "";
+    this[$content] = value.toString();
+  }
+  [$dump](hasNS = false) {
+    const dumped = Object.create(null);
+    if (hasNS) {
+      dumped.$ns = this[$namespaceId];
+    }
+    if (this[$content]) {
+      dumped.$content = this[$content];
+    }
+    dumped.$name = this[$nodeName];
+    dumped.children = [];
+    for (const child of this[_children]) {
+      dumped.children.push(child[$dump](hasNS));
+    }
+    dumped.attributes = Object.create(null);
+    for (const [name, value] of this[_attributes]) {
+      dumped.attributes[name] = value[$content];
+    }
+    return dumped;
+  }
+}
+class ContentObject extends XFAObject {
+  constructor(nsId, name) {
+    super(nsId, name);
+    this[$content] = "";
+  }
+  [$onText](text) {
+    this[$content] += text;
+  }
+  [$finalize]() {}
+}
+class OptionObject extends ContentObject {
+  constructor(nsId, name, options) {
+    super(nsId, name);
+    this[_options] = options;
+  }
+  [$finalize]() {
+    this[$content] = getKeyword({
+      data: this[$content],
+      defaultValue: this[_options][0],
+      validate: k => this[_options].includes(k)
+    });
+  }
+  [$clean](builder) {
+    super[$clean](builder);
+    delete this[_options];
+  }
+}
+class StringObject extends ContentObject {
+  [$finalize]() {
+    this[$content] = this[$content].trim();
+  }
+}
+class IntegerObject extends ContentObject {
+  constructor(nsId, name, defaultValue, validator) {
+    super(nsId, name);
+    this[_defaultValue] = defaultValue;
+    this[_validator] = validator;
+  }
+  [$finalize]() {
+    this[$content] = getInteger({
+      data: this[$content],
+      defaultValue: this[_defaultValue],
+      validate: this[_validator]
+    });
+  }
+  [$clean](builder) {
+    super[$clean](builder);
+    delete this[_defaultValue];
+    delete this[_validator];
+  }
+}
+class Option01 extends IntegerObject {
+  constructor(nsId, name) {
+    super(nsId, name, 0, n => n === 1);
+  }
+}
+class Option10 extends IntegerObject {
+  constructor(nsId, name) {
+    super(nsId, name, 1, n => n === 0);
+  }
+}
+
+;// ./src/core/xfa/html_utils.js
+
+
+
+
+
+
+function measureToString(m) {
+  if (typeof m === "string") {
+    return "0px";
+  }
+  return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`;
+}
+const converters = {
+  anchorType(node, style) {
+    const parent = node[$getSubformParent]();
+    if (!parent || parent.layout && parent.layout !== "position") {
+      return;
+    }
+    if (!("transform" in style)) {
+      style.transform = "";
+    }
+    switch (node.anchorType) {
+      case "bottomCenter":
+        style.transform += "translate(-50%, -100%)";
+        break;
+      case "bottomLeft":
+        style.transform += "translate(0,-100%)";
+        break;
+      case "bottomRight":
+        style.transform += "translate(-100%,-100%)";
+        break;
+      case "middleCenter":
+        style.transform += "translate(-50%,-50%)";
+        break;
+      case "middleLeft":
+        style.transform += "translate(0,-50%)";
+        break;
+      case "middleRight":
+        style.transform += "translate(-100%,-50%)";
+        break;
+      case "topCenter":
+        style.transform += "translate(-50%,0)";
+        break;
+      case "topRight":
+        style.transform += "translate(-100%,0)";
+        break;
+    }
+  },
+  dimensions(node, style) {
+    const parent = node[$getSubformParent]();
+    let width = node.w;
+    const height = node.h;
+    if (parent.layout?.includes("row")) {
+      const extra = parent[$extra];
+      const colSpan = node.colSpan;
+      let w;
+      if (colSpan === -1) {
+        w = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn));
+        extra.currentColumn = 0;
+      } else {
+        w = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan));
+        extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length;
+      }
+      if (!isNaN(w)) {
+        width = node.w = w;
+      }
+    }
+    style.width = width !== "" ? measureToString(width) : "auto";
+    style.height = height !== "" ? measureToString(height) : "auto";
+  },
+  position(node, style) {
+    const parent = node[$getSubformParent]();
+    if (parent?.layout && parent.layout !== "position") {
+      return;
+    }
+    style.position = "absolute";
+    style.left = measureToString(node.x);
+    style.top = measureToString(node.y);
+  },
+  rotate(node, style) {
+    if (node.rotate) {
+      if (!("transform" in style)) {
+        style.transform = "";
+      }
+      style.transform += `rotate(-${node.rotate}deg)`;
+      style.transformOrigin = "top left";
+    }
+  },
+  presence(node, style) {
+    switch (node.presence) {
+      case "invisible":
+        style.visibility = "hidden";
+        break;
+      case "hidden":
+      case "inactive":
+        style.display = "none";
+        break;
+    }
+  },
+  hAlign(node, style) {
+    if (node[$nodeName] === "para") {
+      switch (node.hAlign) {
+        case "justifyAll":
+          style.textAlign = "justify-all";
+          break;
+        case "radix":
+          style.textAlign = "left";
+          break;
+        default:
+          style.textAlign = node.hAlign;
+      }
+    } else {
+      switch (node.hAlign) {
+        case "left":
+          style.alignSelf = "start";
+          break;
+        case "center":
+          style.alignSelf = "center";
+          break;
+        case "right":
+          style.alignSelf = "end";
+          break;
+      }
+    }
+  },
+  margin(node, style) {
+    if (node.margin) {
+      style.margin = node.margin[$toStyle]().margin;
+    }
+  }
+};
+function setMinMaxDimensions(node, style) {
+  const parent = node[$getSubformParent]();
+  if (parent.layout === "position") {
+    if (node.minW > 0) {
+      style.minWidth = measureToString(node.minW);
+    }
+    if (node.maxW > 0) {
+      style.maxWidth = measureToString(node.maxW);
+    }
+    if (node.minH > 0) {
+      style.minHeight = measureToString(node.minH);
+    }
+    if (node.maxH > 0) {
+      style.maxHeight = measureToString(node.maxH);
+    }
+  }
+}
+function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) {
+  const measure = new TextMeasure(xfaFont, margin, lineHeight, fontFinder);
+  if (typeof text === "string") {
+    measure.addString(text);
+  } else {
+    text[$pushGlyphs](measure);
+  }
+  return measure.compute(width);
+}
+function layoutNode(node, availableSpace) {
+  let height = null;
+  let width = null;
+  let isBroken = false;
+  if ((!node.w || !node.h) && node.value) {
+    let marginH = 0;
+    let marginV = 0;
+    if (node.margin) {
+      marginH = node.margin.leftInset + node.margin.rightInset;
+      marginV = node.margin.topInset + node.margin.bottomInset;
+    }
+    let lineHeight = null;
+    let margin = null;
+    if (node.para) {
+      margin = Object.create(null);
+      lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight;
+      margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove;
+      margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow;
+      margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft;
+      margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight;
+    }
+    let font = node.font;
+    if (!font) {
+      const root = node[$getTemplateRoot]();
+      let parent = node[$getParent]();
+      while (parent && parent !== root) {
+        if (parent.font) {
+          font = parent.font;
+          break;
+        }
+        parent = parent[$getParent]();
+      }
+    }
+    const maxWidth = (node.w || availableSpace.width) - marginH;
+    const fontFinder = node[$globalData].fontFinder;
+    if (node.value.exData && node.value.exData[$content] && node.value.exData.contentType === "text/html") {
+      const res = layoutText(node.value.exData[$content], font, margin, lineHeight, fontFinder, maxWidth);
+      width = res.width;
+      height = res.height;
+      isBroken = res.isBroken;
+    } else {
+      const text = node.value[$text]();
+      if (text) {
+        const res = layoutText(text, font, margin, lineHeight, fontFinder, maxWidth);
+        width = res.width;
+        height = res.height;
+        isBroken = res.isBroken;
+      }
+    }
+    if (width !== null && !node.w) {
+      width += marginH;
+    }
+    if (height !== null && !node.h) {
+      height += marginV;
+    }
+  }
+  return {
+    w: width,
+    h: height,
+    isBroken
+  };
+}
+function computeBbox(node, html, availableSpace) {
+  let bbox;
+  if (node.w !== "" && node.h !== "") {
+    bbox = [node.x, node.y, node.w, node.h];
+  } else {
+    if (!availableSpace) {
+      return null;
+    }
+    let width = node.w;
+    if (width === "") {
+      if (node.maxW === 0) {
+        const parent = node[$getSubformParent]();
+        width = parent.layout === "position" && parent.w !== "" ? 0 : node.minW;
+      } else {
+        width = Math.min(node.maxW, availableSpace.width);
+      }
+      html.attributes.style.width = measureToString(width);
+    }
+    let height = node.h;
+    if (height === "") {
+      if (node.maxH === 0) {
+        const parent = node[$getSubformParent]();
+        height = parent.layout === "position" && parent.h !== "" ? 0 : node.minH;
+      } else {
+        height = Math.min(node.maxH, availableSpace.height);
+      }
+      html.attributes.style.height = measureToString(height);
+    }
+    bbox = [node.x, node.y, width, height];
+  }
+  return bbox;
+}
+function fixDimensions(node) {
+  const parent = node[$getSubformParent]();
+  if (parent.layout?.includes("row")) {
+    const extra = parent[$extra];
+    const colSpan = node.colSpan;
+    let width;
+    if (colSpan === -1) {
+      width = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn));
+    } else {
+      width = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan));
+    }
+    if (!isNaN(width)) {
+      node.w = width;
+    }
+  }
+  if (parent.layout && parent.layout !== "position") {
+    node.x = node.y = 0;
+  }
+  if (node.layout === "table") {
+    if (node.w === "" && Array.isArray(node.columnWidths)) {
+      node.w = Math.sumPrecise(node.columnWidths);
+    }
+  }
+}
+function layoutClass(node) {
+  switch (node.layout) {
+    case "position":
+      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";
+    default:
+      return "xfaPosition";
+  }
+}
+function toStyle(node, ...names) {
+  const style = Object.create(null);
+  for (const name of names) {
+    const value = node[name];
+    if (value === null) {
+      continue;
+    }
+    if (Object.hasOwn(converters, name)) {
+      converters[name](node, style);
+      continue;
+    }
+    if (value instanceof XFAObject) {
+      const newStyle = value[$toStyle]();
+      if (newStyle) {
+        Object.assign(style, newStyle);
+      } else {
+        warn(`(DEBUG) - XFA - style for ${name} not implemented yet`);
+      }
+    }
+  }
+  return style;
+}
+function createWrapper(node, html) {
+  const {
+    attributes
+  } = html;
+  const {
+    style
+  } = attributes;
+  const wrapper = {
+    name: "div",
+    attributes: {
+      class: ["xfaWrapper"],
+      style: Object.create(null)
+    },
+    children: []
+  };
+  attributes.class.push("xfaWrapped");
+  if (node.border) {
+    const {
+      widths,
+      insets
+    } = node.border[$extra];
+    let width, height;
+    let top = insets[0];
+    let left = insets[3];
+    const insetsH = insets[0] + insets[2];
+    const insetsW = insets[1] + insets[3];
+    switch (node.border.hand) {
+      case "even":
+        top -= widths[0] / 2;
+        left -= widths[3] / 2;
+        width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`;
+        height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`;
+        break;
+      case "left":
+        top -= widths[0];
+        left -= widths[3];
+        width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`;
+        height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`;
+        break;
+      case "right":
+        width = insetsW ? `calc(100% - ${insetsW}px)` : "100%";
+        height = insetsH ? `calc(100% - ${insetsH}px)` : "100%";
+        break;
+    }
+    const classNames = ["xfaBorder"];
+    if (isPrintOnly(node.border)) {
+      classNames.push("xfaPrintOnly");
+    }
+    const border = {
+      name: "div",
+      attributes: {
+        class: classNames,
+        style: {
+          top: `${top}px`,
+          left: `${left}px`,
+          width,
+          height
+        }
+      },
+      children: []
+    };
+    for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) {
+      if (style[key] !== undefined) {
+        border.attributes.style[key] = style[key];
+        delete style[key];
+      }
+    }
+    wrapper.children.push(border, html);
+  } else {
+    wrapper.children.push(html);
+  }
+  for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) {
+    if (style[key] !== undefined) {
+      wrapper.attributes.style[key] = style[key];
+      delete style[key];
+    }
+  }
+  wrapper.attributes.style.position = style.position === "absolute" ? "absolute" : "relative";
+  delete style.position;
+  if (style.alignSelf) {
+    wrapper.attributes.style.alignSelf = style.alignSelf;
+    delete style.alignSelf;
+  }
+  return wrapper;
+}
+function fixTextIndent(styles) {
+  const indent = getMeasurement(styles.textIndent, "0px");
+  if (indent >= 0) {
+    return;
+  }
+  const align = styles.textAlign === "right" ? "right" : "left";
+  const name = "padding" + (align === "left" ? "Left" : "Right");
+  const padding = getMeasurement(styles[name], "0px");
+  styles[name] = `${padding - indent}px`;
+}
+function setAccess(node, classNames) {
+  switch (node.access) {
+    case "nonInteractive":
+      classNames.push("xfaNonInteractive");
+      break;
+    case "readOnly":
+      classNames.push("xfaReadOnly");
+      break;
+    case "protected":
+      classNames.push("xfaDisabled");
+      break;
+  }
+}
+function isPrintOnly(node) {
+  return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print";
+}
+function getCurrentPara(node) {
+  const stack = node[$getTemplateRoot]()[$extra].paraStack;
+  return stack.length ? stack.at(-1) : null;
+}
+function setPara(node, nodeStyle, value) {
+  if (value.attributes.class?.includes("xfaRich")) {
+    if (nodeStyle) {
+      if (node.h === "") {
+        nodeStyle.height = "auto";
+      }
+      if (node.w === "") {
+        nodeStyle.width = "auto";
+      }
+    }
+    const para = getCurrentPara(node);
+    if (para) {
+      const valueStyle = value.attributes.style;
+      valueStyle.display = "flex";
+      valueStyle.flexDirection = "column";
+      switch (para.vAlign) {
+        case "top":
+          valueStyle.justifyContent = "start";
+          break;
+        case "bottom":
+          valueStyle.justifyContent = "end";
+          break;
+        case "middle":
+          valueStyle.justifyContent = "center";
+          break;
+      }
+      const paraStyle = para[$toStyle]();
+      for (const [key, val] of Object.entries(paraStyle)) {
+        if (!(key in valueStyle)) {
+          valueStyle[key] = val;
+        }
+      }
+    }
+  }
+}
+function setFontFamily(xfaFont, node, fontFinder, style) {
+  if (!fontFinder) {
+    delete style.fontFamily;
+    return;
+  }
+  const name = stripQuotes(xfaFont.typeface);
+  style.fontFamily = `"${name}"`;
+  const typeface = fontFinder.find(name);
+  if (typeface) {
+    const {
+      fontFamily
+    } = typeface.regular.cssFontInfo;
+    if (fontFamily !== name) {
+      style.fontFamily = `"${fontFamily}"`;
+    }
+    const para = getCurrentPara(node);
+    if (para && para.lineHeight !== "") {
+      return;
+    }
+    if (style.lineHeight) {
+      return;
+    }
+    const pdfFont = selectFont(xfaFont, typeface);
+    if (pdfFont) {
+      style.lineHeight = Math.max(1.2, pdfFont.lineHeight);
+    }
+  }
+}
+function fixURL(str) {
+  const absoluteUrl = createValidAbsoluteUrl(str, null, {
+    addDefaultProtocol: true,
+    tryConvertEncoding: true
+  });
+  return absoluteUrl ? absoluteUrl.href : null;
+}
+
+;// ./src/core/xfa/layout.js
+
+
+
+function createLine(node, children) {
+  return {
+    name: "div",
+    attributes: {
+      class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"]
+    },
+    children
+  };
+}
+function flushHTML(node) {
+  if (!node[$extra]) {
+    return null;
+  }
+  const attributes = node[$extra].attributes;
+  const html = {
+    name: "div",
+    attributes,
+    children: node[$extra].children
+  };
+  if (node[$extra].failingNode) {
+    const htmlFromFailing = node[$extra].failingNode[$flushHTML]();
+    if (htmlFromFailing) {
+      if (node.layout.endsWith("-tb")) {
+        html.children.push(createLine(node, [htmlFromFailing]));
+      } else {
+        html.children.push(htmlFromFailing);
+      }
+    }
+  }
+  if (html.children.length === 0) {
+    return null;
+  }
+  return html;
+}
+function addHTML(node, html, bbox) {
+  const extra = node[$extra];
+  const availableSpace = extra.availableSpace;
+  const [x, y, w, h] = bbox;
+  switch (node.layout) {
+    case "position":
+      {
+        extra.width = Math.max(extra.width, x + w);
+        extra.height = Math.max(extra.height, y + h);
+        extra.children.push(html);
+        break;
+      }
+    case "lr-tb":
+    case "rl-tb":
+      if (!extra.line || extra.attempt === 1) {
+        extra.line = createLine(node, []);
+        extra.children.push(extra.line);
+        extra.numberInLine = 0;
+      }
+      extra.numberInLine += 1;
+      extra.line.children.push(html);
+      if (extra.attempt === 0) {
+        extra.currentWidth += w;
+        extra.height = Math.max(extra.height, extra.prevHeight + h);
+      } else {
+        extra.currentWidth = w;
+        extra.prevHeight = extra.height;
+        extra.height += h;
+        extra.attempt = 0;
+      }
+      extra.width = Math.max(extra.width, extra.currentWidth);
+      break;
+    case "rl-row":
+    case "row":
+      {
+        extra.children.push(html);
+        extra.width += w;
+        extra.height = Math.max(extra.height, h);
+        const height = measureToString(extra.height);
+        for (const child of extra.children) {
+          child.attributes.style.height = height;
+        }
+        break;
+      }
+    case "table":
+      {
+        extra.width = MathClamp(w, extra.width, availableSpace.width);
+        extra.height += h;
+        extra.children.push(html);
+        break;
+      }
+    case "tb":
+      {
+        extra.width = MathClamp(w, extra.width, availableSpace.width);
+        extra.height += h;
+        extra.children.push(html);
+        break;
+      }
+  }
+}
+function getAvailableSpace(node) {
+  const availableSpace = node[$extra].availableSpace;
+  const marginV = node.margin ? node.margin.topInset + node.margin.bottomInset : 0;
+  const marginH = node.margin ? node.margin.leftInset + node.margin.rightInset : 0;
+  switch (node.layout) {
+    case "lr-tb":
+    case "rl-tb":
+      if (node[$extra].attempt === 0) {
+        return {
+          width: availableSpace.width - marginH - node[$extra].currentWidth,
+          height: availableSpace.height - marginV - node[$extra].prevHeight
+        };
+      }
+      return {
+        width: availableSpace.width - marginH,
+        height: availableSpace.height - marginV - node[$extra].height
+      };
+    case "rl-row":
+    case "row":
+      const width = Math.sumPrecise(node[$extra].columnWidths.slice(node[$extra].currentColumn));
+      return {
+        width,
+        height: availableSpace.height - marginH
+      };
+    case "table":
+    case "tb":
+      return {
+        width: availableSpace.width - marginH,
+        height: availableSpace.height - marginV - node[$extra].height
+      };
+    case "position":
+    default:
+      return availableSpace;
+  }
+}
+function getTransformedBBox(node) {
+  let w = node.w === "" ? NaN : node.w;
+  let h = node.h === "" ? NaN : node.h;
+  let [centerX, centerY] = [0, 0];
+  switch (node.anchorType || "") {
+    case "bottomCenter":
+      [centerX, centerY] = [w / 2, h];
+      break;
+    case "bottomLeft":
+      [centerX, centerY] = [0, h];
+      break;
+    case "bottomRight":
+      [centerX, centerY] = [w, h];
+      break;
+    case "middleCenter":
+      [centerX, centerY] = [w / 2, h / 2];
+      break;
+    case "middleLeft":
+      [centerX, centerY] = [0, h / 2];
+      break;
+    case "middleRight":
+      [centerX, centerY] = [w, h / 2];
+      break;
+    case "topCenter":
+      [centerX, centerY] = [w / 2, 0];
+      break;
+    case "topRight":
+      [centerX, centerY] = [w, 0];
+      break;
+  }
+  let x, y;
+  switch (node.rotate || 0) {
+    case 0:
+      [x, y] = [-centerX, -centerY];
+      break;
+    case 90:
+      [x, y] = [-centerY, centerX];
+      [w, h] = [h, -w];
+      break;
+    case 180:
+      [x, y] = [centerX, centerY];
+      [w, h] = [-w, -h];
+      break;
+    case 270:
+      [x, y] = [centerY, -centerX];
+      [w, h] = [-h, w];
+      break;
+  }
+  return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)];
+}
+function checkDimensions(node, space) {
+  if (node[$getTemplateRoot]()[$extra].firstUnsplittable === null) {
+    return true;
+  }
+  if (node.w === 0 || node.h === 0) {
+    return true;
+  }
+  const ERROR = 2;
+  const parent = node[$getSubformParent]();
+  const attempt = parent[$extra]?.attempt || 0;
+  const [, y, w, h] = getTransformedBBox(node);
+  switch (parent.layout) {
+    case "lr-tb":
+    case "rl-tb":
+      if (attempt === 0) {
+        if (!node[$getTemplateRoot]()[$extra].noLayoutFailure) {
+          if (node.h !== "" && Math.round(h - space.height) > ERROR) {
+            return false;
+          }
+          if (node.w !== "") {
+            if (Math.round(w - space.width) <= ERROR) {
+              return true;
+            }
+            if (parent[$extra].numberInLine === 0) {
+              return space.height > ERROR;
+            }
+            return false;
+          }
+          return space.width > ERROR;
+        }
+        if (node.w !== "") {
+          return Math.round(w - space.width) <= ERROR;
+        }
+        return space.width > ERROR;
+      }
+      if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {
+        return true;
+      }
+      if (node.h !== "" && Math.round(h - space.height) > ERROR) {
+        return false;
+      }
+      if (node.w === "" || Math.round(w - space.width) <= ERROR) {
+        return space.height > ERROR;
+      }
+      if (parent[$isThereMoreWidth]()) {
+        return false;
+      }
+      return space.height > ERROR;
+    case "table":
+    case "tb":
+      if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {
+        return true;
+      }
+      if (node.h !== "" && !node[$isSplittable]()) {
+        return Math.round(h - space.height) <= ERROR;
+      }
+      if (node.w === "" || Math.round(w - space.width) <= ERROR) {
+        return space.height > ERROR;
+      }
+      if (parent[$isThereMoreWidth]()) {
+        return false;
+      }
+      return space.height > ERROR;
+    case "position":
+      if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {
+        return true;
+      }
+      if (node.h === "" || Math.round(h + y - space.height) <= ERROR) {
+        return true;
+      }
+      const area = node[$getTemplateRoot]()[$extra].currentContentArea;
+      return h + y > area.h;
+    case "rl-row":
+    case "row":
+      if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {
+        return true;
+      }
+      if (node.h !== "") {
+        return Math.round(h - space.height) <= ERROR;
+      }
+      return true;
+    default:
+      return true;
+  }
+}
+
+;// ./src/core/xfa/template.js
+
+
+
+
+
+
+
+
+
+
+const TEMPLATE_NS_ID = NamespaceIds.template.id;
+const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2;
+const MAX_EMPTY_PAGES = 3;
+const DEFAULT_TAB_INDEX = 5000;
+const HEADING_PATTERN = /^H(\d+)$/;
+const MIMES = 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"]);
+const IMAGES_HEADERS = [[[0x42, 0x4d], "image/bmp"], [[0xff, 0xd8, 0xff], "image/jpeg"], [[0x49, 0x49, 0x2a, 0x00], "image/tiff"], [[0x4d, 0x4d, 0x00, 0x2a], "image/tiff"], [[0x47, 0x49, 0x46, 0x38, 0x39, 0x61], "image/gif"], [[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], "image/png"]];
+function getBorderDims(node) {
+  if (!node || !node.border) {
+    return {
+      w: 0,
+      h: 0
+    };
+  }
+  const borderExtra = node.border[$getExtra]();
+  if (!borderExtra) {
+    return {
+      w: 0,
+      h: 0
+    };
+  }
+  return {
+    w: borderExtra.widths[0] + borderExtra.widths[2] + borderExtra.insets[0] + borderExtra.insets[2],
+    h: borderExtra.widths[1] + borderExtra.widths[3] + borderExtra.insets[1] + borderExtra.insets[3]
+  };
+}
+function hasMargin(node) {
+  return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || node.margin.leftInset);
+}
+function _setValue(templateNode, value) {
+  if (!templateNode.value) {
+    const nodeValue = new Value({});
+    templateNode[$appendChild](nodeValue);
+    templateNode.value = nodeValue;
+  }
+  templateNode.value[$setValue](value);
+}
+function* getContainedChildren(node) {
+  for (const child of node[$getChildren]()) {
+    if (child instanceof SubformSet) {
+      yield* child[$getContainedChildren]();
+      continue;
+    }
+    yield child;
+  }
+}
+function isRequired(node) {
+  return node.validate?.nullTest === "error";
+}
+function setTabIndex(node) {
+  while (node) {
+    if (!node.traversal) {
+      node[$tabIndex] = node[$getParent]()[$tabIndex];
+      return;
+    }
+    if (node[$tabIndex]) {
+      return;
+    }
+    let next = null;
+    for (const child of node.traversal[$getChildren]()) {
+      if (child.operation === "next") {
+        next = child;
+        break;
+      }
+    }
+    if (!next || !next.ref) {
+      node[$tabIndex] = node[$getParent]()[$tabIndex];
+      return;
+    }
+    const root = node[$getTemplateRoot]();
+    node[$tabIndex] = ++root[$tabIndex];
+    const ref = root[$searchNode](next.ref, node);
+    if (!ref) {
+      return;
+    }
+    node = ref[0];
+  }
+}
+function applyAssist(obj, attributes) {
+  const assist = obj.assist;
+  if (assist) {
+    const assistTitle = assist[$toHTML]();
+    if (assistTitle) {
+      attributes.title = assistTitle;
+    }
+    const role = assist.role;
+    const match = role.match(HEADING_PATTERN);
+    if (match) {
+      const ariaRole = "heading";
+      const ariaLevel = match[1];
+      attributes.role = ariaRole;
+      attributes["aria-level"] = ariaLevel;
+    }
+  }
+  if (obj.layout === "table") {
+    attributes.role = "table";
+  } else if (obj.layout === "row") {
+    attributes.role = "row";
+  } else {
+    const parent = obj[$getParent]();
+    if (parent.layout === "row") {
+      attributes.role = parent.assist?.role === "TH" ? "columnheader" : "cell";
+    }
+  }
+}
+function ariaLabel(obj) {
+  if (!obj.assist) {
+    return null;
+  }
+  const assist = obj.assist;
+  if (assist.speak && assist.speak[$content] !== "") {
+    return assist.speak[$content];
+  }
+  if (assist.toolTip) {
+    return assist.toolTip[$content];
+  }
+  return null;
+}
+function valueToHtml(value) {
+  return HTMLResult.success({
+    name: "div",
+    attributes: {
+      class: ["xfaRich"],
+      style: Object.create(null)
+    },
+    children: [{
+      name: "span",
+      attributes: {
+        style: Object.create(null)
+      },
+      value
+    }]
+  });
+}
+function setFirstUnsplittable(node) {
+  const root = node[$getTemplateRoot]();
+  if (root[$extra].firstUnsplittable === null) {
+    root[$extra].firstUnsplittable = node;
+    root[$extra].noLayoutFailure = true;
+  }
+}
+function unsetFirstUnsplittable(node) {
+  const root = node[$getTemplateRoot]();
+  if (root[$extra].firstUnsplittable === node) {
+    root[$extra].noLayoutFailure = false;
+  }
+}
+function handleBreak(node) {
+  if (node[$extra]) {
+    return false;
+  }
+  node[$extra] = Object.create(null);
+  if (node.targetType === "auto") {
+    return false;
+  }
+  const root = node[$getTemplateRoot]();
+  let target = null;
+  if (node.target) {
+    target = root[$searchNode](node.target, node[$getParent]());
+    if (!target) {
+      return false;
+    }
+    target = target[0];
+  }
+  const {
+    currentPageArea,
+    currentContentArea
+  } = root[$extra];
+  if (node.targetType === "pageArea") {
+    if (!(target instanceof PageArea)) {
+      target = null;
+    }
+    if (node.startNew) {
+      node[$extra].target = target || currentPageArea;
+      return true;
+    } else if (target && target !== currentPageArea) {
+      node[$extra].target = target;
+      return true;
+    }
+    return false;
+  }
+  if (!(target instanceof ContentArea)) {
+    target = null;
+  }
+  const pageArea = target && target[$getParent]();
+  let index;
+  let nextPageArea = pageArea;
+  if (node.startNew) {
+    if (target) {
+      const contentAreas = pageArea.contentArea.children;
+      const indexForCurrent = contentAreas.indexOf(currentContentArea);
+      const indexForTarget = contentAreas.indexOf(target);
+      if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) {
+        nextPageArea = null;
+      }
+      index = indexForTarget - 1;
+    } else {
+      index = currentPageArea.contentArea.children.indexOf(currentContentArea);
+    }
+  } else if (target && target !== currentContentArea) {
+    const contentAreas = pageArea.contentArea.children;
+    index = contentAreas.indexOf(target) - 1;
+    nextPageArea = pageArea === currentPageArea ? null : pageArea;
+  } else {
+    return false;
+  }
+  node[$extra].target = nextPageArea;
+  node[$extra].index = index;
+  return true;
+}
+function handleOverflow(node, extraNode, space) {
+  const root = node[$getTemplateRoot]();
+  const saved = root[$extra].noLayoutFailure;
+  const savedMethod = extraNode[$getSubformParent];
+  extraNode[$getSubformParent] = () => node;
+  root[$extra].noLayoutFailure = true;
+  const res = extraNode[$toHTML](space);
+  node[$addHTML](res.html, res.bbox);
+  root[$extra].noLayoutFailure = saved;
+  extraNode[$getSubformParent] = savedMethod;
+}
+class AppearanceFilter extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "appearanceFilter");
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Arc extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "arc", true);
+    this.circular = getInteger({
+      data: attributes.circular,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.hand = getStringOption(attributes.hand, ["even", "left", "right"]);
+    this.id = attributes.id || "";
+    this.startAngle = getFloat({
+      data: attributes.startAngle,
+      defaultValue: 0,
+      validate: x => true
+    });
+    this.sweepAngle = getFloat({
+      data: attributes.sweepAngle,
+      defaultValue: 360,
+      validate: x => true
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.edge = null;
+    this.fill = null;
+  }
+  [$toHTML]() {
+    const edge = this.edge || new Edge({});
+    const edgeStyle = edge[$toStyle]();
+    const style = Object.create(null);
+    if (this.fill?.presence === "visible") {
+      Object.assign(style, this.fill[$toStyle]());
+    } else {
+      style.fill = "transparent";
+    }
+    style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0);
+    style.stroke = edgeStyle.color;
+    let arc;
+    const attributes = {
+      xmlns: SVG_NS,
+      style: {
+        width: "100%",
+        height: "100%",
+        overflow: "visible"
+      }
+    };
+    if (this.sweepAngle === 360) {
+      arc = {
+        name: "ellipse",
+        attributes: {
+          xmlns: SVG_NS,
+          cx: "50%",
+          cy: "50%",
+          rx: "50%",
+          ry: "50%",
+          style
+        }
+      };
+    } else {
+      const startAngle = this.startAngle * Math.PI / 180;
+      const sweepAngle = this.sweepAngle * Math.PI / 180;
+      const largeArc = this.sweepAngle > 180 ? 1 : 0;
+      const [x1, y1, x2, y2] = [50 * (1 + Math.cos(startAngle)), 50 * (1 - Math.sin(startAngle)), 50 * (1 + Math.cos(startAngle + sweepAngle)), 50 * (1 - Math.sin(startAngle + sweepAngle))];
+      arc = {
+        name: "path",
+        attributes: {
+          xmlns: SVG_NS,
+          d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`,
+          vectorEffect: "non-scaling-stroke",
+          style
+        }
+      };
+      Object.assign(attributes, {
+        viewBox: "0 0 100 100",
+        preserveAspectRatio: "none"
+      });
+    }
+    const svg = {
+      name: "svg",
+      children: [arc],
+      attributes
+    };
+    const parent = this[$getParent]()[$getParent]();
+    if (hasMargin(parent)) {
+      return HTMLResult.success({
+        name: "div",
+        attributes: {
+          style: {
+            display: "inline",
+            width: "100%",
+            height: "100%"
+          }
+        },
+        children: [svg]
+      });
+    }
+    svg.attributes.style.position = "absolute";
+    return HTMLResult.success(svg);
+  }
+}
+class Area extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "area", true);
+    this.colSpan = getInteger({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.relevant = getRelevant(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.x = getMeasurement(attributes.x, "0pt");
+    this.y = getMeasurement(attributes.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();
+  }
+  *[$getContainedChildren]() {
+    yield* getContainedChildren(this);
+  }
+  [$isTransparent]() {
+    return true;
+  }
+  [$isBindable]() {
+    return true;
+  }
+  [$addHTML](html, bbox) {
+    const [x, y, w, h] = bbox;
+    this[$extra].width = Math.max(this[$extra].width, x + w);
+    this[$extra].height = Math.max(this[$extra].height, y + h);
+    this[$extra].children.push(html);
+  }
+  [$getAvailableSpace]() {
+    return this[$extra].availableSpace;
+  }
+  [$toHTML](availableSpace) {
+    const style = toStyle(this, "position");
+    const attributes = {
+      style,
+      id: this[$uid],
+      class: ["xfaArea"]
+    };
+    if (isPrintOnly(this)) {
+      attributes.class.push("xfaPrintOnly");
+    }
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+    const children = [];
+    this[$extra] = {
+      children,
+      width: 0,
+      height: 0,
+      availableSpace
+    };
+    const result = this[$childrenToHTML]({
+      filter: new Set(["area", "draw", "field", "exclGroup", "subform", "subformSet"]),
+      include: true
+    });
+    if (!result.success) {
+      if (result.isBreak()) {
+        return result;
+      }
+      delete this[$extra];
+      return HTMLResult.FAILURE;
+    }
+    style.width = measureToString(this[$extra].width);
+    style.height = measureToString(this[$extra].height);
+    const html = {
+      name: "div",
+      attributes,
+      children
+    };
+    const bbox = [this.x, this.y, this[$extra].width, this[$extra].height];
+    delete this[$extra];
+    return HTMLResult.success(html, bbox);
+  }
+}
+class Assist extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "assist", true);
+    this.id = attributes.id || "";
+    this.role = attributes.role || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.speak = null;
+    this.toolTip = null;
+  }
+  [$toHTML]() {
+    return this.toolTip?.[$content] || null;
+  }
+}
+class Barcode extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "barcode", true);
+    this.charEncoding = getKeyword({
+      data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "",
+      defaultValue: "",
+      validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/)
+    });
+    this.checksum = getStringOption(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", "2mod10", "auto"]);
+    this.dataColumnCount = getInteger({
+      data: attributes.dataColumnCount,
+      defaultValue: -1,
+      validate: x => x >= 0
+    });
+    this.dataLength = getInteger({
+      data: attributes.dataLength,
+      defaultValue: -1,
+      validate: x => x >= 0
+    });
+    this.dataPrep = getStringOption(attributes.dataPrep, ["none", "flateCompress"]);
+    this.dataRowCount = getInteger({
+      data: attributes.dataRowCount,
+      defaultValue: -1,
+      validate: x => x >= 0
+    });
+    this.endChar = attributes.endChar || "";
+    this.errorCorrectionLevel = getInteger({
+      data: attributes.errorCorrectionLevel,
+      defaultValue: -1,
+      validate: x => x >= 0 && x <= 8
+    });
+    this.id = attributes.id || "";
+    this.moduleHeight = getMeasurement(attributes.moduleHeight, "5mm");
+    this.moduleWidth = getMeasurement(attributes.moduleWidth, "0.25mm");
+    this.printCheckDigit = getInteger({
+      data: attributes.printCheckDigit,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.rowColumnRatio = getRatio(attributes.rowColumnRatio);
+    this.startChar = attributes.startChar || "";
+    this.textLocation = getStringOption(attributes.textLocation, ["below", "above", "aboveEmbedded", "belowEmbedded", "none"]);
+    this.truncate = getInteger({
+      data: attributes.truncate,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.type = getStringOption(attributes.type ? attributes.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(attributes.upsMode, ["usCarrier", "internationalCarrier", "secureSymbol", "standardSymbol"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio);
+    this.encrypt = null;
+    this.extras = null;
+  }
+}
+class Bind extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "bind", true);
+    this.match = getStringOption(attributes.match, ["once", "dataRef", "global", "none"]);
+    this.ref = attributes.ref || "";
+    this.picture = null;
+  }
+}
+class BindItems extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "bindItems");
+    this.connection = attributes.connection || "";
+    this.labelRef = attributes.labelRef || "";
+    this.ref = attributes.ref || "";
+    this.valueRef = attributes.valueRef || "";
+  }
+}
+class Bookend extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "bookend");
+    this.id = attributes.id || "";
+    this.leader = attributes.leader || "";
+    this.trailer = attributes.trailer || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class BooleanElement extends Option01 {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "boolean");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$toHTML](availableSpace) {
+    return valueToHtml(this[$content] === 1 ? "1" : "0");
+  }
+}
+class Border extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "border", true);
+    this.break = getStringOption(attributes.break, ["close", "open"]);
+    this.hand = getStringOption(attributes.hand, ["even", "left", "right"]);
+    this.id = attributes.id || "";
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.relevant = getRelevant(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.corner = new XFAObjectArray(4);
+    this.edge = new XFAObjectArray(4);
+    this.extras = null;
+    this.fill = null;
+    this.margin = null;
+  }
+  [$getExtra]() {
+    if (!this[$extra]) {
+      const edges = this.edge.children.slice();
+      if (edges.length < 4) {
+        const defaultEdge = edges.at(-1) || new Edge({});
+        for (let i = edges.length; i < 4; i++) {
+          edges.push(defaultEdge);
+        }
+      }
+      const widths = edges.map(edge => edge.thickness);
+      const insets = [0, 0, 0, 0];
+      if (this.margin) {
+        insets[0] = this.margin.topInset;
+        insets[1] = this.margin.rightInset;
+        insets[2] = this.margin.bottomInset;
+        insets[3] = this.margin.leftInset;
+      }
+      this[$extra] = {
+        widths,
+        insets,
+        edges
+      };
+    }
+    return this[$extra];
+  }
+  [$toStyle]() {
+    const {
+      edges
+    } = this[$getExtra]();
+    const edgeStyles = edges.map(node => {
+      const style = node[$toStyle]();
+      style.color ||= "#000000";
+      return style;
+    });
+    const style = Object.create(null);
+    if (this.margin) {
+      Object.assign(style, this.margin[$toStyle]());
+    }
+    if (this.fill?.presence === "visible") {
+      Object.assign(style, this.fill[$toStyle]());
+    }
+    if (this.corner.children.some(node => node.radius !== 0)) {
+      const cornerStyles = this.corner.children.map(node => node[$toStyle]());
+      if (cornerStyles.length === 2 || cornerStyles.length === 3) {
+        const last = cornerStyles.at(-1);
+        for (let i = cornerStyles.length; i < 4; i++) {
+          cornerStyles.push(last);
+        }
+      }
+      style.borderRadius = cornerStyles.map(s => s.radius).join(" ");
+    }
+    switch (this.presence) {
+      case "invisible":
+      case "hidden":
+        style.borderStyle = "";
+        break;
+      case "inactive":
+        style.borderStyle = "none";
+        break;
+      default:
+        style.borderStyle = edgeStyles.map(s => s.style).join(" ");
+        break;
+    }
+    style.borderWidth = edgeStyles.map(s => s.width).join(" ");
+    style.borderColor = edgeStyles.map(s => s.color).join(" ");
+    return style;
+  }
+}
+class Break extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "break", true);
+    this.after = getStringOption(attributes.after, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]);
+    this.afterTarget = attributes.afterTarget || "";
+    this.before = getStringOption(attributes.before, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]);
+    this.beforeTarget = attributes.beforeTarget || "";
+    this.bookendLeader = attributes.bookendLeader || "";
+    this.bookendTrailer = attributes.bookendTrailer || "";
+    this.id = attributes.id || "";
+    this.overflowLeader = attributes.overflowLeader || "";
+    this.overflowTarget = attributes.overflowTarget || "";
+    this.overflowTrailer = attributes.overflowTrailer || "";
+    this.startNew = getInteger({
+      data: attributes.startNew,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+}
+class BreakAfter extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "breakAfter", true);
+    this.id = attributes.id || "";
+    this.leader = attributes.leader || "";
+    this.startNew = getInteger({
+      data: attributes.startNew,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.target = attributes.target || "";
+    this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]);
+    this.trailer = attributes.trailer || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.script = null;
+  }
+}
+class BreakBefore extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "breakBefore", true);
+    this.id = attributes.id || "";
+    this.leader = attributes.leader || "";
+    this.startNew = getInteger({
+      data: attributes.startNew,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.target = attributes.target || "";
+    this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]);
+    this.trailer = attributes.trailer || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.script = null;
+  }
+  [$toHTML](availableSpace) {
+    this[$extra] = {};
+    return HTMLResult.FAILURE;
+  }
+}
+class Button extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "button", true);
+    this.highlight = getStringOption(attributes.highlight, ["inverted", "none", "outline", "push"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+  [$toHTML](availableSpace) {
+    const parent = this[$getParent]();
+    const grandpa = parent[$getParent]();
+    const htmlButton = {
+      name: "button",
+      attributes: {
+        id: this[$uid],
+        class: ["xfaButton"],
+        style: {}
+      },
+      children: []
+    };
+    for (const event of grandpa.event.children) {
+      if (event.activity !== "click" || !event.script) {
+        continue;
+      }
+      const jsURL = recoverJsURL(event.script[$content]);
+      if (!jsURL) {
+        continue;
+      }
+      const href = fixURL(jsURL.url);
+      if (!href) {
+        continue;
+      }
+      htmlButton.children.push({
+        name: "a",
+        attributes: {
+          id: "link" + this[$uid],
+          href,
+          newWindow: jsURL.newWindow,
+          class: ["xfaLink"],
+          style: {}
+        },
+        children: []
+      });
+    }
+    return HTMLResult.success(htmlButton);
+  }
+}
+class Calculate extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "calculate", true);
+    this.id = attributes.id || "";
+    this.override = getStringOption(attributes.override, ["disabled", "error", "ignore", "warning"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.message = null;
+    this.script = null;
+  }
+}
+class Caption extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "caption", true);
+    this.id = attributes.id || "";
+    this.placement = getStringOption(attributes.placement, ["left", "bottom", "inline", "right", "top"]);
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.reserve = Math.ceil(getMeasurement(attributes.reserve));
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.font = null;
+    this.margin = null;
+    this.para = null;
+    this.value = null;
+  }
+  [$setValue](value) {
+    _setValue(this, value);
+  }
+  [$getExtra](availableSpace) {
+    if (!this[$extra]) {
+      let {
+        width,
+        height
+      } = availableSpace;
+      switch (this.placement) {
+        case "left":
+        case "right":
+        case "inline":
+          width = this.reserve <= 0 ? width : this.reserve;
+          break;
+        case "top":
+        case "bottom":
+          height = this.reserve <= 0 ? height : this.reserve;
+          break;
+      }
+      this[$extra] = layoutNode(this, {
+        width,
+        height
+      });
+    }
+    return this[$extra];
+  }
+  [$toHTML](availableSpace) {
+    if (!this.value) {
+      return HTMLResult.EMPTY;
+    }
+    this[$pushPara]();
+    const value = this.value[$toHTML](availableSpace).html;
+    if (!value) {
+      this[$popPara]();
+      return HTMLResult.EMPTY;
+    }
+    const savedReserve = this.reserve;
+    if (this.reserve <= 0) {
+      const {
+        w,
+        h
+      } = this[$getExtra](availableSpace);
+      switch (this.placement) {
+        case "left":
+        case "right":
+        case "inline":
+          this.reserve = w;
+          break;
+        case "top":
+        case "bottom":
+          this.reserve = h;
+          break;
+      }
+    }
+    const children = [];
+    if (typeof value === "string") {
+      children.push({
+        name: "#text",
+        value
+      });
+    } else {
+      children.push(value);
+    }
+    const style = toStyle(this, "font", "margin", "visibility");
+    switch (this.placement) {
+      case "left":
+      case "right":
+        if (this.reserve > 0) {
+          style.width = measureToString(this.reserve);
+        }
+        break;
+      case "top":
+      case "bottom":
+        if (this.reserve > 0) {
+          style.height = measureToString(this.reserve);
+        }
+        break;
+    }
+    setPara(this, null, value);
+    this[$popPara]();
+    this.reserve = savedReserve;
+    return HTMLResult.success({
+      name: "div",
+      attributes: {
+        style,
+        class: ["xfaCaption"]
+      },
+      children
+    });
+  }
+}
+class Certificate extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "certificate");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Certificates extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "certificates", true);
+    this.credentialServerPolicy = getStringOption(attributes.credentialServerPolicy, ["optional", "required"]);
+    this.id = attributes.id || "";
+    this.url = attributes.url || "";
+    this.urlPolicy = attributes.urlPolicy || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.encryption = null;
+    this.issuers = null;
+    this.keyUsage = null;
+    this.oids = null;
+    this.signing = null;
+    this.subjectDNs = null;
+  }
+}
+class CheckButton extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "checkButton", true);
+    this.id = attributes.id || "";
+    this.mark = getStringOption(attributes.mark, ["default", "check", "circle", "cross", "diamond", "square", "star"]);
+    this.shape = getStringOption(attributes.shape, ["square", "round"]);
+    this.size = getMeasurement(attributes.size, "10pt");
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.margin = null;
+  }
+  [$toHTML](availableSpace) {
+    const style = toStyle(this, "margin");
+    const size = measureToString(this.size);
+    style.width = style.height = size;
+    let type;
+    let className;
+    let groupId;
+    const field = this[$getParent]()[$getParent]();
+    const items = field.items.children.length && field.items.children[0][$toHTML]().html || [];
+    const exportedValue = {
+      on: (items[0] !== undefined ? items[0] : "on").toString(),
+      off: (items[1] !== undefined ? items[1] : "off").toString()
+    };
+    const value = field.value?.[$text]() || "off";
+    const checked = value === exportedValue.on || undefined;
+    const container = field[$getSubformParent]();
+    const fieldId = field[$uid];
+    let dataId;
+    if (container instanceof ExclGroup) {
+      groupId = container[$uid];
+      type = "radio";
+      className = "xfaRadio";
+      dataId = container[$data]?.[$uid] || container[$uid];
+    } else {
+      type = "checkbox";
+      className = "xfaCheckbox";
+      dataId = field[$data]?.[$uid] || field[$uid];
+    }
+    const input = {
+      name: "input",
+      attributes: {
+        class: [className],
+        style,
+        fieldId,
+        dataId,
+        type,
+        checked,
+        xfaOn: exportedValue.on,
+        xfaOff: exportedValue.off,
+        "aria-label": ariaLabel(field),
+        "aria-required": false
+      }
+    };
+    if (groupId) {
+      input.attributes.name = groupId;
+    }
+    if (isRequired(field)) {
+      input.attributes["aria-required"] = true;
+      input.attributes.required = true;
+    }
+    return HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [input]
+    });
+  }
+}
+class ChoiceList extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "choiceList", true);
+    this.commitOn = getStringOption(attributes.commitOn, ["select", "exit"]);
+    this.id = attributes.id || "";
+    this.open = getStringOption(attributes.open, ["userControl", "always", "multiSelect", "onEntry"]);
+    this.textEntry = getInteger({
+      data: attributes.textEntry,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.margin = null;
+  }
+  [$toHTML](availableSpace) {
+    const style = toStyle(this, "border", "margin");
+    const ui = this[$getParent]();
+    const field = ui[$getParent]();
+    const fontSize = field.font?.size || 10;
+    const optionStyle = {
+      fontSize: `calc(${fontSize}px * var(--total-scale-factor))`
+    };
+    const children = [];
+    if (field.items.children.length > 0) {
+      const items = field.items;
+      let displayedIndex = 0;
+      let saveIndex = 0;
+      if (items.children.length === 2) {
+        displayedIndex = items.children[0].save;
+        saveIndex = 1 - displayedIndex;
+      }
+      const displayed = items.children[displayedIndex][$toHTML]().html;
+      const values = items.children[saveIndex][$toHTML]().html;
+      let selected = false;
+      const value = field.value?.[$text]() || "";
+      for (let i = 0, ii = displayed.length; i < ii; i++) {
+        const option = {
+          name: "option",
+          attributes: {
+            value: values[i] || displayed[i],
+            style: optionStyle
+          },
+          value: displayed[i]
+        };
+        if (values[i] === value) {
+          option.attributes.selected = selected = true;
+        }
+        children.push(option);
+      }
+      if (!selected) {
+        children.splice(0, 0, {
+          name: "option",
+          attributes: {
+            hidden: true,
+            selected: true
+          },
+          value: " "
+        });
+      }
+    }
+    const selectAttributes = {
+      class: ["xfaSelect"],
+      fieldId: field[$uid],
+      dataId: field[$data]?.[$uid] || field[$uid],
+      style,
+      "aria-label": ariaLabel(field),
+      "aria-required": false
+    };
+    if (isRequired(field)) {
+      selectAttributes["aria-required"] = true;
+      selectAttributes.required = true;
+    }
+    if (this.open === "multiSelect") {
+      selectAttributes.multiple = true;
+    }
+    return HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [{
+        name: "select",
+        children,
+        attributes: selectAttributes
+      }]
+    });
+  }
+}
+class Color extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "color", true);
+    this.cSpace = getStringOption(attributes.cSpace, ["SRGB"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.value = attributes.value ? getColor(attributes.value) : "";
+    this.extras = null;
+  }
+  [$hasSettableValue]() {
+    return false;
+  }
+  [$toStyle]() {
+    return this.value ? Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null;
+  }
+}
+class Comb extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "comb");
+    this.id = attributes.id || "";
+    this.numberOfCells = getInteger({
+      data: attributes.numberOfCells,
+      defaultValue: 0,
+      validate: x => x >= 0
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Connect extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "connect", true);
+    this.connection = attributes.connection || "";
+    this.id = attributes.id || "";
+    this.ref = attributes.ref || "";
+    this.usage = getStringOption(attributes.usage, ["exportAndImport", "exportOnly", "importOnly"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.picture = null;
+  }
+}
+class ContentArea extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "contentArea", true);
+    this.h = getMeasurement(attributes.h);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.relevant = getRelevant(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = getMeasurement(attributes.w);
+    this.x = getMeasurement(attributes.x, "0pt");
+    this.y = getMeasurement(attributes.y, "0pt");
+    this.desc = null;
+    this.extras = null;
+  }
+  [$toHTML](availableSpace) {
+    const left = measureToString(this.x);
+    const top = measureToString(this.y);
+    const style = {
+      left,
+      top,
+      width: measureToString(this.w),
+      height: measureToString(this.h)
+    };
+    const classNames = ["xfaContentarea"];
+    if (isPrintOnly(this)) {
+      classNames.push("xfaPrintOnly");
+    }
+    return HTMLResult.success({
+      name: "div",
+      children: [],
+      attributes: {
+        style,
+        class: classNames,
+        id: this[$uid]
+      }
+    });
+  }
+}
+class Corner extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "corner", true);
+    this.id = attributes.id || "";
+    this.inverted = getInteger({
+      data: attributes.inverted,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.join = getStringOption(attributes.join, ["square", "round"]);
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.radius = getMeasurement(attributes.radius);
+    this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]);
+    this.thickness = getMeasurement(attributes.thickness, "0.5pt");
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+  [$toStyle]() {
+    const style = toStyle(this, "visibility");
+    style.radius = measureToString(this.join === "square" ? 0 : this.radius);
+    return style;
+  }
+}
+class DateElement extends ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "date");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$finalize]() {
+    const date = this[$content].trim();
+    this[$content] = date ? new Date(date) : null;
+  }
+  [$toHTML](availableSpace) {
+    return valueToHtml(this[$content] ? this[$content].toString() : "");
+  }
+}
+class DateTime extends ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "dateTime");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$finalize]() {
+    const date = this[$content].trim();
+    this[$content] = date ? new Date(date) : null;
+  }
+  [$toHTML](availableSpace) {
+    return valueToHtml(this[$content] ? this[$content].toString() : "");
+  }
+}
+class DateTimeEdit extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "dateTimeEdit", true);
+    this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]);
+    this.id = attributes.id || "";
+    this.picker = getStringOption(attributes.picker, ["host", "none"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.comb = null;
+    this.extras = null;
+    this.margin = null;
+  }
+  [$toHTML](availableSpace) {
+    const style = toStyle(this, "border", "font", "margin");
+    const field = this[$getParent]()[$getParent]();
+    const html = {
+      name: "input",
+      attributes: {
+        type: "text",
+        fieldId: field[$uid],
+        dataId: field[$data]?.[$uid] || field[$uid],
+        class: ["xfaTextfield"],
+        style,
+        "aria-label": ariaLabel(field),
+        "aria-required": false
+      }
+    };
+    if (isRequired(field)) {
+      html.attributes["aria-required"] = true;
+      html.attributes.required = true;
+    }
+    return HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [html]
+    });
+  }
+}
+class Decimal extends ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "decimal");
+    this.fracDigits = getInteger({
+      data: attributes.fracDigits,
+      defaultValue: 2,
+      validate: x => true
+    });
+    this.id = attributes.id || "";
+    this.leadDigits = getInteger({
+      data: attributes.leadDigits,
+      defaultValue: -1,
+      validate: x => true
+    });
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$finalize]() {
+    const number = parseFloat(this[$content].trim());
+    this[$content] = isNaN(number) ? null : number;
+  }
+  [$toHTML](availableSpace) {
+    return valueToHtml(this[$content] !== null ? this[$content].toString() : "");
+  }
+}
+class DefaultUi extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "defaultUi", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+}
+class Desc extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "desc", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.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(attributes) {
+    super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class DigestMethods extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "digestMethods", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.digestMethod = new XFAObjectArray();
+  }
+}
+class Draw extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "draw", true);
+    this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
+    this.colSpan = getInteger({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.h = attributes.h ? getMeasurement(attributes.h) : "";
+    this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
+    this.id = attributes.id || "";
+    this.locale = attributes.locale || "";
+    this.maxH = getMeasurement(attributes.maxH, "0pt");
+    this.maxW = getMeasurement(attributes.maxW, "0pt");
+    this.minH = getMeasurement(attributes.minH, "0pt");
+    this.minW = getMeasurement(attributes.minW, "0pt");
+    this.name = attributes.name || "";
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.relevant = getRelevant(attributes.relevant);
+    this.rotate = getInteger({
+      data: attributes.rotate,
+      defaultValue: 0,
+      validate: x => x % 90 === 0
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = attributes.w ? getMeasurement(attributes.w) : "";
+    this.x = getMeasurement(attributes.x, "0pt");
+    this.y = getMeasurement(attributes.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();
+  }
+  [$setValue](value) {
+    _setValue(this, value);
+  }
+  [$toHTML](availableSpace) {
+    setTabIndex(this);
+    if (this.presence === "hidden" || this.presence === "inactive") {
+      return HTMLResult.EMPTY;
+    }
+    fixDimensions(this);
+    this[$pushPara]();
+    const savedW = this.w;
+    const savedH = this.h;
+    const {
+      w,
+      h,
+      isBroken
+    } = layoutNode(this, availableSpace);
+    if (w && this.w === "") {
+      if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) {
+        this[$popPara]();
+        return HTMLResult.FAILURE;
+      }
+      this.w = w;
+    }
+    if (h && this.h === "") {
+      this.h = h;
+    }
+    setFirstUnsplittable(this);
+    if (!checkDimensions(this, availableSpace)) {
+      this.w = savedW;
+      this.h = savedH;
+      this[$popPara]();
+      return HTMLResult.FAILURE;
+    }
+    unsetFirstUnsplittable(this);
+    const style = toStyle(this, "font", "hAlign", "dimensions", "position", "presence", "rotate", "anchorType", "border", "margin");
+    setMinMaxDimensions(this, style);
+    if (style.margin) {
+      style.padding = style.margin;
+      delete style.margin;
+    }
+    const classNames = ["xfaDraw"];
+    if (this.font) {
+      classNames.push("xfaFont");
+    }
+    if (isPrintOnly(this)) {
+      classNames.push("xfaPrintOnly");
+    }
+    const attributes = {
+      style,
+      id: this[$uid],
+      class: classNames
+    };
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+    const html = {
+      name: "div",
+      attributes,
+      children: []
+    };
+    applyAssist(this, attributes);
+    const bbox = computeBbox(this, html, availableSpace);
+    const value = this.value ? this.value[$toHTML](availableSpace).html : null;
+    if (value === null) {
+      this.w = savedW;
+      this.h = savedH;
+      this[$popPara]();
+      return HTMLResult.success(createWrapper(this, html), bbox);
+    }
+    html.children.push(value);
+    setPara(this, style, value);
+    this.w = savedW;
+    this.h = savedH;
+    this[$popPara]();
+    return HTMLResult.success(createWrapper(this, html), bbox);
+  }
+}
+class Edge extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "edge", true);
+    this.cap = getStringOption(attributes.cap, ["square", "butt", "round"]);
+    this.id = attributes.id || "";
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]);
+    this.thickness = getMeasurement(attributes.thickness, "0.5pt");
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+  [$toStyle]() {
+    const style = toStyle(this, "visibility");
+    Object.assign(style, {
+      linecap: this.cap,
+      width: measureToString(this.thickness),
+      color: this.color ? this.color[$toStyle]() : "#000000",
+      style: ""
+    });
+    if (this.presence !== "visible") {
+      style.style = "none";
+    } else {
+      switch (this.stroke) {
+        case "solid":
+          style.style = "solid";
+          break;
+        case "dashDot":
+          style.style = "dashed";
+          break;
+        case "dashDotDot":
+          style.style = "dashed";
+          break;
+        case "dashed":
+          style.style = "dashed";
+          break;
+        case "dotted":
+          style.style = "dotted";
+          break;
+        case "embossed":
+          style.style = "ridge";
+          break;
+        case "etched":
+          style.style = "groove";
+          break;
+        case "lowered":
+          style.style = "inset";
+          break;
+        case "raised":
+          style.style = "outset";
+          break;
+      }
+    }
+    return style;
+  }
+}
+class Encoding extends OptionObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Encodings extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encodings", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.encoding = new XFAObjectArray();
+  }
+}
+class Encrypt extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encrypt", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.certificate = null;
+  }
+}
+class EncryptData extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encryptData", true);
+    this.id = attributes.id || "";
+    this.operation = getStringOption(attributes.operation, ["encrypt", "decrypt"]);
+    this.target = attributes.target || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.filter = null;
+    this.manifest = null;
+  }
+}
+class Encryption extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encryption", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.certificate = new XFAObjectArray();
+  }
+}
+class EncryptionMethod extends OptionObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class EncryptionMethods extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "encryptionMethods", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.encryptionMethod = new XFAObjectArray();
+  }
+}
+class Event extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "event", true);
+    this.activity = getStringOption(attributes.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 = attributes.id || "";
+    this.listen = getStringOption(attributes.listen, ["refOnly", "refAndDescendents"]);
+    this.name = attributes.name || "";
+    this.ref = attributes.ref || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.encryptData = null;
+    this.execute = null;
+    this.script = null;
+    this.signData = null;
+    this.submit = null;
+  }
+}
+class ExData extends ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "exData");
+    this.contentType = attributes.contentType || "";
+    this.href = attributes.href || "";
+    this.id = attributes.id || "";
+    this.maxLength = getInteger({
+      data: attributes.maxLength,
+      defaultValue: -1,
+      validate: x => x >= -1
+    });
+    this.name = attributes.name || "";
+    this.rid = attributes.rid || "";
+    this.transferEncoding = getStringOption(attributes.transferEncoding, ["none", "base64", "package"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$isCDATAXml]() {
+    return this.contentType === "text/html";
+  }
+  [$onChild](child) {
+    if (this.contentType === "text/html" && child[$namespaceId] === NamespaceIds.xhtml.id) {
+      this[$content] = child;
+      return true;
+    }
+    if (this.contentType === "text/xml") {
+      this[$content] = child;
+      return true;
+    }
+    return false;
+  }
+  [$toHTML](availableSpace) {
+    if (this.contentType !== "text/html" || !this[$content]) {
+      return HTMLResult.EMPTY;
+    }
+    return this[$content][$toHTML](availableSpace);
+  }
+}
+class ExObject extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "exObject", true);
+    this.archive = attributes.archive || "";
+    this.classId = attributes.classId || "";
+    this.codeBase = attributes.codeBase || "";
+    this.codeType = attributes.codeType || "";
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.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(attributes) {
+    super(TEMPLATE_NS_ID, "exclGroup", true);
+    this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]);
+    this.accessKey = attributes.accessKey || "";
+    this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
+    this.colSpan = getInteger({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.h = attributes.h ? getMeasurement(attributes.h) : "";
+    this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
+    this.id = attributes.id || "";
+    this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]);
+    this.maxH = getMeasurement(attributes.maxH, "0pt");
+    this.maxW = getMeasurement(attributes.maxW, "0pt");
+    this.minH = getMeasurement(attributes.minH, "0pt");
+    this.minW = getMeasurement(attributes.minW, "0pt");
+    this.name = attributes.name || "";
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.relevant = getRelevant(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = attributes.w ? getMeasurement(attributes.w) : "";
+    this.x = getMeasurement(attributes.x, "0pt");
+    this.y = getMeasurement(attributes.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();
+  }
+  [$isBindable]() {
+    return true;
+  }
+  [$hasSettableValue]() {
+    return true;
+  }
+  [$setValue](value) {
+    for (const field of this.field.children) {
+      if (!field.value) {
+        const nodeValue = new Value({});
+        field[$appendChild](nodeValue);
+        field.value = nodeValue;
+      }
+      field.value[$setValue](value);
+    }
+  }
+  [$isThereMoreWidth]() {
+    return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth]();
+  }
+  [$isSplittable]() {
+    const parent = this[$getSubformParent]();
+    if (!parent[$isSplittable]()) {
+      return false;
+    }
+    if (this[$extra]._isSplittable !== undefined) {
+      return this[$extra]._isSplittable;
+    }
+    if (this.layout === "position" || this.layout.includes("row")) {
+      this[$extra]._isSplittable = false;
+      return false;
+    }
+    if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) {
+      return false;
+    }
+    this[$extra]._isSplittable = true;
+    return true;
+  }
+  [$flushHTML]() {
+    return flushHTML(this);
+  }
+  [$addHTML](html, bbox) {
+    addHTML(this, html, bbox);
+  }
+  [$getAvailableSpace]() {
+    return getAvailableSpace(this);
+  }
+  [$toHTML](availableSpace) {
+    setTabIndex(this);
+    if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) {
+      return HTMLResult.EMPTY;
+    }
+    fixDimensions(this);
+    const children = [];
+    const attributes = {
+      id: this[$uid],
+      class: []
+    };
+    setAccess(this, attributes.class);
+    this[$extra] ||= Object.create(null);
+    Object.assign(this[$extra], {
+      children,
+      attributes,
+      attempt: 0,
+      line: null,
+      numberInLine: 0,
+      availableSpace: {
+        width: Math.min(this.w || Infinity, availableSpace.width),
+        height: Math.min(this.h || Infinity, availableSpace.height)
+      },
+      width: 0,
+      height: 0,
+      prevHeight: 0,
+      currentWidth: 0
+    });
+    const isSplittable = this[$isSplittable]();
+    if (!isSplittable) {
+      setFirstUnsplittable(this);
+    }
+    if (!checkDimensions(this, availableSpace)) {
+      return HTMLResult.FAILURE;
+    }
+    const filter = new Set(["field"]);
+    if (this.layout.includes("row")) {
+      const columnWidths = this[$getSubformParent]().columnWidths;
+      if (Array.isArray(columnWidths) && columnWidths.length > 0) {
+        this[$extra].columnWidths = columnWidths;
+        this[$extra].currentColumn = 0;
+      }
+    }
+    const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign");
+    const classNames = ["xfaExclgroup"];
+    const cl = layoutClass(this);
+    if (cl) {
+      classNames.push(cl);
+    }
+    if (isPrintOnly(this)) {
+      classNames.push("xfaPrintOnly");
+    }
+    attributes.style = style;
+    attributes.class = classNames;
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+    this[$pushPara]();
+    const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb";
+    const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;
+    for (; this[$extra].attempt < maxRun; this[$extra].attempt++) {
+      if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
+        this[$extra].numberInLine = 0;
+      }
+      const result = this[$childrenToHTML]({
+        filter,
+        include: true
+      });
+      if (result.success) {
+        break;
+      }
+      if (result.isBreak()) {
+        this[$popPara]();
+        return result;
+      }
+      if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !this[$getTemplateRoot]()[$extra].noLayoutFailure) {
+        this[$extra].attempt = maxRun;
+        break;
+      }
+    }
+    this[$popPara]();
+    if (!isSplittable) {
+      unsetFirstUnsplittable(this);
+    }
+    if (this[$extra].attempt === maxRun) {
+      if (!isSplittable) {
+        delete this[$extra];
+      }
+      return HTMLResult.FAILURE;
+    }
+    let marginH = 0;
+    let marginV = 0;
+    if (this.margin) {
+      marginH = this.margin.leftInset + this.margin.rightInset;
+      marginV = this.margin.topInset + this.margin.bottomInset;
+    }
+    const width = Math.max(this[$extra].width + marginH, this.w || 0);
+    const height = Math.max(this[$extra].height + marginV, this.h || 0);
+    const bbox = [this.x, this.y, width, height];
+    if (this.w === "") {
+      style.width = measureToString(width);
+    }
+    if (this.h === "") {
+      style.height = measureToString(height);
+    }
+    const html = {
+      name: "div",
+      attributes,
+      children
+    };
+    applyAssist(this, attributes);
+    delete this[$extra];
+    return HTMLResult.success(createWrapper(this, html), bbox);
+  }
+}
+class Execute extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "execute");
+    this.connection = attributes.connection || "";
+    this.executeType = getStringOption(attributes.executeType, ["import", "remerge"]);
+    this.id = attributes.id || "";
+    this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Extras extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "extras", true);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.boolean = new XFAObjectArray();
+    this.date = new XFAObjectArray();
+    this.dateTime = new XFAObjectArray();
+    this.decimal = new XFAObjectArray();
+    this.exData = new XFAObjectArray();
+    this.extras = new XFAObjectArray();
+    this.float = new XFAObjectArray();
+    this.image = new XFAObjectArray();
+    this.integer = new XFAObjectArray();
+    this.text = new XFAObjectArray();
+    this.time = new XFAObjectArray();
+  }
+}
+class Field extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "field", true);
+    this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]);
+    this.accessKey = attributes.accessKey || "";
+    this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
+    this.colSpan = getInteger({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.h = attributes.h ? getMeasurement(attributes.h) : "";
+    this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
+    this.id = attributes.id || "";
+    this.locale = attributes.locale || "";
+    this.maxH = getMeasurement(attributes.maxH, "0pt");
+    this.maxW = getMeasurement(attributes.maxW, "0pt");
+    this.minH = getMeasurement(attributes.minH, "0pt");
+    this.minW = getMeasurement(attributes.minW, "0pt");
+    this.name = attributes.name || "";
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.relevant = getRelevant(attributes.relevant);
+    this.rotate = getInteger({
+      data: attributes.rotate,
+      defaultValue: 0,
+      validate: x => x % 90 === 0
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = attributes.w ? getMeasurement(attributes.w) : "";
+    this.x = getMeasurement(attributes.x, "0pt");
+    this.y = getMeasurement(attributes.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();
+  }
+  [$isBindable]() {
+    return true;
+  }
+  [$setValue](value) {
+    _setValue(this, value);
+  }
+  [$toHTML](availableSpace) {
+    setTabIndex(this);
+    if (!this.ui) {
+      this.ui = new Ui({});
+      this.ui[$globalData] = this[$globalData];
+      this[$appendChild](this.ui);
+      let node;
+      switch (this.items.children.length) {
+        case 0:
+          node = new TextEdit({});
+          this.ui.textEdit = node;
+          break;
+        case 1:
+          node = new CheckButton({});
+          this.ui.checkButton = node;
+          break;
+        case 2:
+          node = new ChoiceList({});
+          this.ui.choiceList = node;
+          break;
+      }
+      this.ui[$appendChild](node);
+    }
+    if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) {
+      return HTMLResult.EMPTY;
+    }
+    if (this.caption) {
+      delete this.caption[$extra];
+    }
+    this[$pushPara]();
+    const caption = this.caption ? this.caption[$toHTML](availableSpace).html : null;
+    const savedW = this.w;
+    const savedH = this.h;
+    let marginH = 0;
+    let marginV = 0;
+    if (this.margin) {
+      marginH = this.margin.leftInset + this.margin.rightInset;
+      marginV = this.margin.topInset + this.margin.bottomInset;
+    }
+    let borderDims = null;
+    if (this.w === "" || this.h === "") {
+      let width = null;
+      let height = null;
+      let uiW = 0;
+      let uiH = 0;
+      if (this.ui.checkButton) {
+        uiW = uiH = this.ui.checkButton.size;
+      } else {
+        const {
+          w,
+          h
+        } = layoutNode(this, availableSpace);
+        if (w !== null) {
+          uiW = w;
+          uiH = h;
+        } else {
+          uiH = fonts_getMetrics(this.font, true).lineNoGap;
+        }
+      }
+      borderDims = getBorderDims(this.ui[$getExtra]());
+      uiW += borderDims.w;
+      uiH += borderDims.h;
+      if (this.caption) {
+        const {
+          w,
+          h,
+          isBroken
+        } = this.caption[$getExtra](availableSpace);
+        if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) {
+          this[$popPara]();
+          return HTMLResult.FAILURE;
+        }
+        width = w;
+        height = h;
+        switch (this.caption.placement) {
+          case "left":
+          case "right":
+          case "inline":
+            width += uiW;
+            break;
+          case "top":
+          case "bottom":
+            height += uiH;
+            break;
+        }
+      } else {
+        width = uiW;
+        height = uiH;
+      }
+      if (width && this.w === "") {
+        width += marginH;
+        this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, this.minW + 1 < width ? width : this.minW);
+      }
+      if (height && this.h === "") {
+        height += marginV;
+        this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, this.minH + 1 < height ? height : this.minH);
+      }
+    }
+    this[$popPara]();
+    fixDimensions(this);
+    setFirstUnsplittable(this);
+    if (!checkDimensions(this, availableSpace)) {
+      this.w = savedW;
+      this.h = savedH;
+      this[$popPara]();
+      return HTMLResult.FAILURE;
+    }
+    unsetFirstUnsplittable(this);
+    const style = toStyle(this, "font", "dimensions", "position", "rotate", "anchorType", "presence", "margin", "hAlign");
+    setMinMaxDimensions(this, style);
+    const classNames = ["xfaField"];
+    if (this.font) {
+      classNames.push("xfaFont");
+    }
+    if (isPrintOnly(this)) {
+      classNames.push("xfaPrintOnly");
+    }
+    const attributes = {
+      style,
+      id: this[$uid],
+      class: classNames
+    };
+    if (style.margin) {
+      style.padding = style.margin;
+      delete style.margin;
+    }
+    setAccess(this, classNames);
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+    const children = [];
+    const html = {
+      name: "div",
+      attributes,
+      children
+    };
+    applyAssist(this, attributes);
+    const borderStyle = this.border ? this.border[$toStyle]() : null;
+    const bbox = computeBbox(this, html, availableSpace);
+    const ui = this.ui[$toHTML]().html;
+    if (!ui) {
+      Object.assign(style, borderStyle);
+      return HTMLResult.success(createWrapper(this, html), bbox);
+    }
+    if (this[$tabIndex]) {
+      if (ui.children?.[0]) {
+        ui.children[0].attributes.tabindex = this[$tabIndex];
+      } else {
+        ui.attributes.tabindex = this[$tabIndex];
+      }
+    }
+    ui.attributes.style ||= Object.create(null);
+    let aElement = null;
+    if (this.ui.button) {
+      if (ui.children.length === 1) {
+        [aElement] = ui.children.splice(0, 1);
+      }
+      Object.assign(ui.attributes.style, borderStyle);
+    } else {
+      Object.assign(style, borderStyle);
+    }
+    children.push(ui);
+    if (this.value) {
+      if (this.ui.imageEdit) {
+        ui.children.push(this.value[$toHTML]().html);
+      } else if (!this.ui.button) {
+        let value = "";
+        if (this.value.exData) {
+          value = this.value.exData[$text]();
+        } else if (this.value.text) {
+          value = this.value.text[$getExtra]();
+        } else {
+          const htmlValue = this.value[$toHTML]().html;
+          if (htmlValue !== null) {
+            value = htmlValue.children[0].value;
+          }
+        }
+        if (this.ui.textEdit && this.value.text?.maxChars) {
+          ui.children[0].attributes.maxLength = this.value.text.maxChars;
+        }
+        if (value) {
+          if (this.ui.numericEdit) {
+            value = parseFloat(value);
+            value = isNaN(value) ? "" : value.toString();
+          }
+          if (ui.children[0].name === "textarea") {
+            ui.children[0].attributes.textContent = value;
+          } else {
+            ui.children[0].attributes.value = value;
+          }
+        }
+      }
+    }
+    if (!this.ui.imageEdit && ui.children?.[0] && this.h) {
+      borderDims = borderDims || getBorderDims(this.ui[$getExtra]());
+      let captionHeight = 0;
+      if (this.caption && ["top", "bottom"].includes(this.caption.placement)) {
+        captionHeight = this.caption.reserve;
+        if (captionHeight <= 0) {
+          captionHeight = this.caption[$getExtra](availableSpace).h;
+        }
+        const inputHeight = this.h - captionHeight - marginV - borderDims.h;
+        ui.children[0].attributes.style.height = measureToString(inputHeight);
+      } else {
+        ui.children[0].attributes.style.height = "100%";
+      }
+    }
+    if (aElement) {
+      ui.children.push(aElement);
+    }
+    if (!caption) {
+      if (ui.attributes.class) {
+        ui.attributes.class.push("xfaLeft");
+      }
+      this.w = savedW;
+      this.h = savedH;
+      return HTMLResult.success(createWrapper(this, html), bbox);
+    }
+    if (this.ui.button) {
+      if (style.padding) {
+        delete style.padding;
+      }
+      if (caption.name === "div") {
+        caption.name = "span";
+      }
+      ui.children.push(caption);
+      return HTMLResult.success(html, bbox);
+    } else if (this.ui.checkButton) {
+      caption.attributes.class[0] = "xfaCaptionForCheckButton";
+    }
+    ui.attributes.class ||= [];
+    ui.children.splice(0, 0, caption);
+    switch (this.caption.placement) {
+      case "left":
+        ui.attributes.class.push("xfaLeft");
+        break;
+      case "right":
+        ui.attributes.class.push("xfaRight");
+        break;
+      case "top":
+        ui.attributes.class.push("xfaTop");
+        break;
+      case "bottom":
+        ui.attributes.class.push("xfaBottom");
+        break;
+      case "inline":
+        ui.attributes.class.push("xfaLeft");
+        break;
+    }
+    this.w = savedW;
+    this.h = savedH;
+    return HTMLResult.success(createWrapper(this, html), bbox);
+  }
+}
+class Fill extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "fill", true);
+    this.id = attributes.id || "";
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+    this.linear = null;
+    this.pattern = null;
+    this.radial = null;
+    this.solid = null;
+    this.stipple = null;
+  }
+  [$toStyle]() {
+    const parent = this[$getParent]();
+    const grandpa = parent[$getParent]();
+    const ggrandpa = grandpa[$getParent]();
+    const style = Object.create(null);
+    let propName = "color";
+    let altPropName = propName;
+    if (parent instanceof Border) {
+      propName = "background-color";
+      altPropName = "background";
+      if (ggrandpa instanceof Ui) {
+        style.backgroundColor = "white";
+      }
+    }
+    if (parent instanceof Rectangle || parent instanceof Arc) {
+      propName = altPropName = "fill";
+      style.fill = "white";
+    }
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (name === "extras" || name === "color") {
+        continue;
+      }
+      const obj = this[name];
+      if (!(obj instanceof XFAObject)) {
+        continue;
+      }
+      const color = obj[$toStyle](this.color);
+      if (color) {
+        style[color.startsWith("#") ? propName : altPropName] = color;
+      }
+      return style;
+    }
+    if (this.color?.value) {
+      const color = this.color[$toStyle]();
+      style[color.startsWith("#") ? propName : altPropName] = color;
+    }
+    return style;
+  }
+}
+class Filter extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "filter", true);
+    this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, ["", "required", "optional", "none"]);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.version = getInteger({
+      data: this.version,
+      defaultValue: 5,
+      validate: x => x >= 1 && x <= 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(attributes) {
+    super(TEMPLATE_NS_ID, "float");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$finalize]() {
+    const number = parseFloat(this[$content].trim());
+    this[$content] = isNaN(number) ? null : number;
+  }
+  [$toHTML](availableSpace) {
+    return valueToHtml(this[$content] !== null ? this[$content].toString() : "");
+  }
+}
+class template_Font extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "font", true);
+    this.baselineShift = getMeasurement(attributes.baselineShift);
+    this.fontHorizontalScale = getFloat({
+      data: attributes.fontHorizontalScale,
+      defaultValue: 100,
+      validate: x => x >= 0
+    });
+    this.fontVerticalScale = getFloat({
+      data: attributes.fontVerticalScale,
+      defaultValue: 100,
+      validate: x => x >= 0
+    });
+    this.id = attributes.id || "";
+    this.kerningMode = getStringOption(attributes.kerningMode, ["none", "pair"]);
+    this.letterSpacing = getMeasurement(attributes.letterSpacing, "0");
+    this.lineThrough = getInteger({
+      data: attributes.lineThrough,
+      defaultValue: 0,
+      validate: x => x === 1 || x === 2
+    });
+    this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, ["all", "word"]);
+    this.overline = getInteger({
+      data: attributes.overline,
+      defaultValue: 0,
+      validate: x => x === 1 || x === 2
+    });
+    this.overlinePeriod = getStringOption(attributes.overlinePeriod, ["all", "word"]);
+    this.posture = getStringOption(attributes.posture, ["normal", "italic"]);
+    this.size = getMeasurement(attributes.size, "10pt");
+    this.typeface = attributes.typeface || "Courier";
+    this.underline = getInteger({
+      data: attributes.underline,
+      defaultValue: 0,
+      validate: x => x === 1 || x === 2
+    });
+    this.underlinePeriod = getStringOption(attributes.underlinePeriod, ["all", "word"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.weight = getStringOption(attributes.weight, ["normal", "bold"]);
+    this.extras = null;
+    this.fill = null;
+  }
+  [$clean](builder) {
+    super[$clean](builder);
+    this[$globalData].usedTypefaces.add(this.typeface);
+  }
+  [$toStyle]() {
+    const style = toStyle(this, "fill");
+    const color = style.color;
+    if (color) {
+      if (color === "#000000") {
+        delete style.color;
+      } else if (!color.startsWith("#")) {
+        style.background = color;
+        style.backgroundClip = "text";
+        style.color = "transparent";
+      }
+    }
+    if (this.baselineShift) {
+      style.verticalAlign = measureToString(this.baselineShift);
+    }
+    style.fontKerning = this.kerningMode === "none" ? "none" : "normal";
+    style.letterSpacing = measureToString(this.letterSpacing);
+    if (this.lineThrough !== 0) {
+      style.textDecoration = "line-through";
+      if (this.lineThrough === 2) {
+        style.textDecorationStyle = "double";
+      }
+    }
+    if (this.overline !== 0) {
+      style.textDecoration = "overline";
+      if (this.overline === 2) {
+        style.textDecorationStyle = "double";
+      }
+    }
+    style.fontStyle = this.posture;
+    style.fontSize = measureToString(0.99 * this.size);
+    setFontFamily(this, this, this[$globalData].fontFinder, style);
+    if (this.underline !== 0) {
+      style.textDecoration = "underline";
+      if (this.underline === 2) {
+        style.textDecorationStyle = "double";
+      }
+    }
+    style.fontWeight = this.weight;
+    return style;
+  }
+}
+class Format extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "format", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.picture = null;
+  }
+}
+class Handler extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "handler");
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Hyphenation extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "hyphenation");
+    this.excludeAllCaps = getInteger({
+      data: attributes.excludeAllCaps,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.excludeInitialCap = getInteger({
+      data: attributes.excludeInitialCap,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.hyphenate = getInteger({
+      data: attributes.hyphenate,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.id = attributes.id || "";
+    this.pushCharacterCount = getInteger({
+      data: attributes.pushCharacterCount,
+      defaultValue: 3,
+      validate: x => x >= 0
+    });
+    this.remainCharacterCount = getInteger({
+      data: attributes.remainCharacterCount,
+      defaultValue: 3,
+      validate: x => x >= 0
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.wordCharacterCount = getInteger({
+      data: attributes.wordCharacterCount,
+      defaultValue: 7,
+      validate: x => x >= 0
+    });
+  }
+}
+class Image extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "image");
+    this.aspect = getStringOption(attributes.aspect, ["fit", "actual", "height", "none", "width"]);
+    this.contentType = attributes.contentType || "";
+    this.href = attributes.href || "";
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.transferEncoding = getStringOption(attributes.transferEncoding, ["base64", "none", "package"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$toHTML]() {
+    if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) {
+      return HTMLResult.EMPTY;
+    }
+    let buffer = this[$globalData].images?.get(this.href);
+    if (!buffer && (this.href || !this[$content])) {
+      return HTMLResult.EMPTY;
+    }
+    if (!buffer && this.transferEncoding === "base64") {
+      buffer = Uint8Array.fromBase64(this[$content]);
+    }
+    if (!buffer) {
+      return HTMLResult.EMPTY;
+    }
+    if (!this.contentType) {
+      for (const [header, type] of IMAGES_HEADERS) {
+        if (buffer.length > header.length && header.every((x, i) => x === buffer[i])) {
+          this.contentType = type;
+          break;
+        }
+      }
+      if (!this.contentType) {
+        return HTMLResult.EMPTY;
+      }
+    }
+    const blob = new Blob([buffer], {
+      type: this.contentType
+    });
+    let style;
+    switch (this.aspect) {
+      case "fit":
+      case "actual":
+        break;
+      case "height":
+        style = {
+          height: "100%",
+          objectFit: "fill"
+        };
+        break;
+      case "none":
+        style = {
+          width: "100%",
+          height: "100%",
+          objectFit: "fill"
+        };
+        break;
+      case "width":
+        style = {
+          width: "100%",
+          objectFit: "fill"
+        };
+        break;
+    }
+    const parent = this[$getParent]();
+    return HTMLResult.success({
+      name: "img",
+      attributes: {
+        class: ["xfaImage"],
+        style,
+        src: URL.createObjectURL(blob),
+        alt: parent ? ariaLabel(parent[$getParent]()) : null
+      }
+    });
+  }
+}
+class ImageEdit extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "imageEdit", true);
+    this.data = getStringOption(attributes.data, ["link", "embed"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.margin = null;
+  }
+  [$toHTML](availableSpace) {
+    if (this.data === "embed") {
+      return HTMLResult.success({
+        name: "div",
+        children: [],
+        attributes: {}
+      });
+    }
+    return HTMLResult.EMPTY;
+  }
+}
+class Integer extends ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "integer");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$finalize]() {
+    const number = parseInt(this[$content].trim(), 10);
+    this[$content] = isNaN(number) ? null : number;
+  }
+  [$toHTML](availableSpace) {
+    return valueToHtml(this[$content] !== null ? this[$content].toString() : "");
+  }
+}
+class Issuers extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "issuers", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.certificate = new XFAObjectArray();
+  }
+}
+class Items extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "items", true);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.ref = attributes.ref || "";
+    this.save = getInteger({
+      data: attributes.save,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.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();
+  }
+  [$toHTML]() {
+    const output = [];
+    for (const child of this[$getChildren]()) {
+      output.push(child[$text]());
+    }
+    return HTMLResult.success(output);
+  }
+}
+class Keep extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "keep", true);
+    this.id = attributes.id || "";
+    const options = ["none", "contentArea", "pageArea"];
+    this.intact = getStringOption(attributes.intact, options);
+    this.next = getStringOption(attributes.next, options);
+    this.previous = getStringOption(attributes.previous, options);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+}
+class KeyUsage extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "keyUsage");
+    const options = ["", "yes", "no"];
+    this.crlSign = getStringOption(attributes.crlSign, options);
+    this.dataEncipherment = getStringOption(attributes.dataEncipherment, options);
+    this.decipherOnly = getStringOption(attributes.decipherOnly, options);
+    this.digitalSignature = getStringOption(attributes.digitalSignature, options);
+    this.encipherOnly = getStringOption(attributes.encipherOnly, options);
+    this.id = attributes.id || "";
+    this.keyAgreement = getStringOption(attributes.keyAgreement, options);
+    this.keyCertSign = getStringOption(attributes.keyCertSign, options);
+    this.keyEncipherment = getStringOption(attributes.keyEncipherment, options);
+    this.nonRepudiation = getStringOption(attributes.nonRepudiation, options);
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Line extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "line", true);
+    this.hand = getStringOption(attributes.hand, ["even", "left", "right"]);
+    this.id = attributes.id || "";
+    this.slope = getStringOption(attributes.slope, ["\\", "/"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.edge = null;
+  }
+  [$toHTML]() {
+    const parent = this[$getParent]()[$getParent]();
+    const edge = this.edge || new Edge({});
+    const edgeStyle = edge[$toStyle]();
+    const style = Object.create(null);
+    const thickness = edge.presence === "visible" ? edge.thickness : 0;
+    style.strokeWidth = measureToString(thickness);
+    style.stroke = edgeStyle.color;
+    let x1, y1, x2, y2;
+    let width = "100%";
+    let height = "100%";
+    if (parent.w <= thickness) {
+      [x1, y1, x2, y2] = ["50%", 0, "50%", "100%"];
+      width = style.strokeWidth;
+    } else if (parent.h <= thickness) {
+      [x1, y1, x2, y2] = [0, "50%", "100%", "50%"];
+      height = style.strokeWidth;
+    } else if (this.slope === "\\") {
+      [x1, y1, x2, y2] = [0, 0, "100%", "100%"];
+    } else {
+      [x1, y1, x2, y2] = [0, "100%", "100%", 0];
+    }
+    const line = {
+      name: "line",
+      attributes: {
+        xmlns: SVG_NS,
+        x1,
+        y1,
+        x2,
+        y2,
+        style
+      }
+    };
+    const svg = {
+      name: "svg",
+      children: [line],
+      attributes: {
+        xmlns: SVG_NS,
+        width,
+        height,
+        style: {
+          overflow: "visible"
+        }
+      }
+    };
+    if (hasMargin(parent)) {
+      return HTMLResult.success({
+        name: "div",
+        attributes: {
+          style: {
+            display: "inline",
+            width: "100%",
+            height: "100%"
+          }
+        },
+        children: [svg]
+      });
+    }
+    svg.attributes.style.position = "absolute";
+    return HTMLResult.success(svg);
+  }
+}
+class Linear extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "linear", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+  [$toStyle](startColor) {
+    startColor = startColor ? startColor[$toStyle]() : "#FFFFFF";
+    const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase();
+    const endColor = this.color ? this.color[$toStyle]() : "#000000";
+    return `linear-gradient(${transf}, ${startColor}, ${endColor})`;
+  }
+}
+class LockDocument extends ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "lockDocument");
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$finalize]() {
+    this[$content] = getStringOption(this[$content], ["auto", "0", "1"]);
+  }
+}
+class Manifest extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "manifest", true);
+    this.action = getStringOption(attributes.action, ["include", "all", "exclude"]);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.ref = new XFAObjectArray();
+  }
+}
+class Margin extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "margin", true);
+    this.bottomInset = getMeasurement(attributes.bottomInset, "0");
+    this.id = attributes.id || "";
+    this.leftInset = getMeasurement(attributes.leftInset, "0");
+    this.rightInset = getMeasurement(attributes.rightInset, "0");
+    this.topInset = getMeasurement(attributes.topInset, "0");
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+  [$toStyle]() {
+    return {
+      margin: measureToString(this.topInset) + " " + measureToString(this.rightInset) + " " + measureToString(this.bottomInset) + " " + measureToString(this.leftInset)
+    };
+  }
+}
+class Mdp extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "mdp");
+    this.id = attributes.id || "";
+    this.permissions = getInteger({
+      data: attributes.permissions,
+      defaultValue: 2,
+      validate: x => x === 1 || x === 3
+    });
+    this.signatureType = getStringOption(attributes.signatureType, ["filler", "author"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Medium extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "medium");
+    this.id = attributes.id || "";
+    this.imagingBBox = getBBox(attributes.imagingBBox);
+    this.long = getMeasurement(attributes.long);
+    this.orientation = getStringOption(attributes.orientation, ["portrait", "landscape"]);
+    this.short = getMeasurement(attributes.short);
+    this.stock = attributes.stock || "";
+    this.trayIn = getStringOption(attributes.trayIn, ["auto", "delegate", "pageFront"]);
+    this.trayOut = getStringOption(attributes.trayOut, ["auto", "delegate"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Message extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "message", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.text = new XFAObjectArray();
+  }
+}
+class NumericEdit extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "numericEdit", true);
+    this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.comb = null;
+    this.extras = null;
+    this.margin = null;
+  }
+  [$toHTML](availableSpace) {
+    const style = toStyle(this, "border", "font", "margin");
+    const field = this[$getParent]()[$getParent]();
+    const html = {
+      name: "input",
+      attributes: {
+        type: "text",
+        fieldId: field[$uid],
+        dataId: field[$data]?.[$uid] || field[$uid],
+        class: ["xfaTextfield"],
+        style,
+        "aria-label": ariaLabel(field),
+        "aria-required": false
+      }
+    };
+    if (isRequired(field)) {
+      html.attributes["aria-required"] = true;
+      html.attributes.required = true;
+    }
+    return HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [html]
+    });
+  }
+}
+class Occur extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "occur", true);
+    this.id = attributes.id || "";
+    this.initial = attributes.initial !== "" ? getInteger({
+      data: attributes.initial,
+      defaultValue: "",
+      validate: x => true
+    }) : "";
+    this.max = attributes.max !== "" ? getInteger({
+      data: attributes.max,
+      defaultValue: -1,
+      validate: x => true
+    }) : "";
+    this.min = attributes.min !== "" ? getInteger({
+      data: attributes.min,
+      defaultValue: 1,
+      validate: x => true
+    }) : "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+  [$clean]() {
+    const parent = this[$getParent]();
+    const originalMin = this.min;
+    if (this.min === "") {
+      this.min = parent instanceof PageArea || parent instanceof PageSet ? 0 : 1;
+    }
+    if (this.max === "") {
+      if (originalMin === "") {
+        this.max = parent instanceof PageArea || parent instanceof PageSet ? -1 : 1;
+      } else {
+        this.max = this.min;
+      }
+    }
+    if (this.max !== -1 && this.max < this.min) {
+      this.max = this.min;
+    }
+    if (this.initial === "") {
+      this.initial = parent instanceof Template ? 1 : this.min;
+    }
+  }
+}
+class Oid extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "oid");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Oids extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "oids", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.oid = new XFAObjectArray();
+  }
+}
+class Overflow extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "overflow");
+    this.id = attributes.id || "";
+    this.leader = attributes.leader || "";
+    this.target = attributes.target || "";
+    this.trailer = attributes.trailer || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$getExtra]() {
+    if (!this[$extra]) {
+      const parent = this[$getParent]();
+      const root = this[$getTemplateRoot]();
+      const target = root[$searchNode](this.target, parent);
+      const leader = root[$searchNode](this.leader, parent);
+      const trailer = root[$searchNode](this.trailer, parent);
+      this[$extra] = {
+        target: target?.[0] || null,
+        leader: leader?.[0] || null,
+        trailer: trailer?.[0] || null,
+        addLeader: false,
+        addTrailer: false
+      };
+    }
+    return this[$extra];
+  }
+}
+class PageArea extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "pageArea", true);
+    this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, ["any", "blank", "notBlank"]);
+    this.id = attributes.id || "";
+    this.initialNumber = getInteger({
+      data: attributes.initialNumber,
+      defaultValue: 1,
+      validate: x => true
+    });
+    this.name = attributes.name || "";
+    this.numbered = getInteger({
+      data: attributes.numbered,
+      defaultValue: 1,
+      validate: x => true
+    });
+    this.oddOrEven = getStringOption(attributes.oddOrEven, ["any", "even", "odd"]);
+    this.pagePosition = getStringOption(attributes.pagePosition, ["any", "first", "last", "only", "rest"]);
+    this.relevant = getRelevant(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.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();
+  }
+  [$isUsable]() {
+    if (!this[$extra]) {
+      this[$extra] = {
+        numberOfUse: 0
+      };
+      return true;
+    }
+    return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max;
+  }
+  [$cleanPage]() {
+    delete this[$extra];
+  }
+  [$getNextPage]() {
+    this[$extra] ||= {
+      numberOfUse: 0
+    };
+    const parent = this[$getParent]();
+    if (parent.relation === "orderedOccurrence") {
+      if (this[$isUsable]()) {
+        this[$extra].numberOfUse += 1;
+        return this;
+      }
+    }
+    return parent[$getNextPage]();
+  }
+  [$getAvailableSpace]() {
+    return this[$extra].space || {
+      width: 0,
+      height: 0
+    };
+  }
+  [$toHTML]() {
+    this[$extra] ||= {
+      numberOfUse: 1
+    };
+    const children = [];
+    this[$extra].children = children;
+    const style = Object.create(null);
+    if (this.medium && this.medium.short && this.medium.long) {
+      style.width = measureToString(this.medium.short);
+      style.height = measureToString(this.medium.long);
+      this[$extra].space = {
+        width: this.medium.short,
+        height: this.medium.long
+      };
+      if (this.medium.orientation === "landscape") {
+        const x = style.width;
+        style.width = style.height;
+        style.height = x;
+        this[$extra].space = {
+          width: this.medium.long,
+          height: this.medium.short
+        };
+      }
+    } else {
+      warn("XFA - No medium specified in pageArea: please file a bug.");
+    }
+    this[$childrenToHTML]({
+      filter: new Set(["area", "draw", "field", "subform"]),
+      include: true
+    });
+    this[$childrenToHTML]({
+      filter: new Set(["contentArea"]),
+      include: true
+    });
+    return HTMLResult.success({
+      name: "div",
+      children,
+      attributes: {
+        class: ["xfaPage"],
+        id: this[$uid],
+        style,
+        xfaName: this.name
+      }
+    });
+  }
+}
+class PageSet extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "pageSet", true);
+    this.duplexImposition = getStringOption(attributes.duplexImposition, ["longEdge", "shortEdge"]);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.relation = getStringOption(attributes.relation, ["orderedOccurrence", "duplexPaginated", "simplexPaginated"]);
+    this.relevant = getRelevant(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.occur = null;
+    this.pageArea = new XFAObjectArray();
+    this.pageSet = new XFAObjectArray();
+  }
+  [$cleanPage]() {
+    for (const page of this.pageArea.children) {
+      page[$cleanPage]();
+    }
+    for (const page of this.pageSet.children) {
+      page[$cleanPage]();
+    }
+  }
+  [$isUsable]() {
+    return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max;
+  }
+  [$getNextPage]() {
+    this[$extra] ||= {
+      numberOfUse: 1,
+      pageIndex: -1,
+      pageSetIndex: -1
+    };
+    if (this.relation === "orderedOccurrence") {
+      if (this[$extra].pageIndex + 1 < this.pageArea.children.length) {
+        this[$extra].pageIndex += 1;
+        const pageArea = this.pageArea.children[this[$extra].pageIndex];
+        return pageArea[$getNextPage]();
+      }
+      if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) {
+        this[$extra].pageSetIndex += 1;
+        return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage]();
+      }
+      if (this[$isUsable]()) {
+        this[$extra].numberOfUse += 1;
+        this[$extra].pageIndex = -1;
+        this[$extra].pageSetIndex = -1;
+        return this[$getNextPage]();
+      }
+      const parent = this[$getParent]();
+      if (parent instanceof PageSet) {
+        return parent[$getNextPage]();
+      }
+      this[$cleanPage]();
+      return this[$getNextPage]();
+    }
+    const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber;
+    const parity = pageNumber % 2 === 0 ? "even" : "odd";
+    const position = pageNumber === 0 ? "first" : "rest";
+    let page = this.pageArea.children.find(p => p.oddOrEven === parity && p.pagePosition === position);
+    if (page) {
+      return page;
+    }
+    page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position);
+    if (page) {
+      return page;
+    }
+    page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any");
+    if (page) {
+      return page;
+    }
+    return this.pageArea.children[0];
+  }
+}
+class Para extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "para", true);
+    this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
+    this.id = attributes.id || "";
+    this.lineHeight = attributes.lineHeight ? getMeasurement(attributes.lineHeight, "0pt") : "";
+    this.marginLeft = attributes.marginLeft ? getMeasurement(attributes.marginLeft, "0pt") : "";
+    this.marginRight = attributes.marginRight ? getMeasurement(attributes.marginRight, "0pt") : "";
+    this.orphans = getInteger({
+      data: attributes.orphans,
+      defaultValue: 0,
+      validate: x => x >= 0
+    });
+    this.preserve = attributes.preserve || "";
+    this.radixOffset = attributes.radixOffset ? getMeasurement(attributes.radixOffset, "0pt") : "";
+    this.spaceAbove = attributes.spaceAbove ? getMeasurement(attributes.spaceAbove, "0pt") : "";
+    this.spaceBelow = attributes.spaceBelow ? getMeasurement(attributes.spaceBelow, "0pt") : "";
+    this.tabDefault = attributes.tabDefault ? getMeasurement(this.tabDefault) : "";
+    this.tabStops = (attributes.tabStops || "").trim().split(/\s+/).map((x, i) => i % 2 === 1 ? getMeasurement(x) : x);
+    this.textIndent = attributes.textIndent ? getMeasurement(attributes.textIndent, "0pt") : "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.vAlign = getStringOption(attributes.vAlign, ["top", "bottom", "middle"]);
+    this.widows = getInteger({
+      data: attributes.widows,
+      defaultValue: 0,
+      validate: x => x >= 0
+    });
+    this.hyphenation = null;
+  }
+  [$toStyle]() {
+    const style = toStyle(this, "hAlign");
+    if (this.marginLeft !== "") {
+      style.paddingLeft = measureToString(this.marginLeft);
+    }
+    if (this.marginRight !== "") {
+      style.paddingRight = measureToString(this.marginRight);
+    }
+    if (this.spaceAbove !== "") {
+      style.paddingTop = measureToString(this.spaceAbove);
+    }
+    if (this.spaceBelow !== "") {
+      style.paddingBottom = measureToString(this.spaceBelow);
+    }
+    if (this.textIndent !== "") {
+      style.textIndent = measureToString(this.textIndent);
+      fixTextIndent(style);
+    }
+    if (this.lineHeight > 0) {
+      style.lineHeight = measureToString(this.lineHeight);
+    }
+    if (this.tabDefault !== "") {
+      style.tabSize = measureToString(this.tabDefault);
+    }
+    if (this.tabStops.length > 0) {}
+    if (this.hyphenatation) {
+      Object.assign(style, this.hyphenatation[$toStyle]());
+    }
+    return style;
+  }
+}
+class PasswordEdit extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "passwordEdit", true);
+    this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]);
+    this.id = attributes.id || "";
+    this.passwordChar = attributes.passwordChar || "*";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.margin = null;
+  }
+}
+class template_Pattern extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "pattern", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", "diagonalRight", "horizontal", "vertical"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+  [$toStyle](startColor) {
+    startColor = startColor ? startColor[$toStyle]() : "#FFFFFF";
+    const endColor = this.color ? this.color[$toStyle]() : "#000000";
+    const width = 5;
+    const cmd = "repeating-linear-gradient";
+    const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * width}px`;
+    switch (this.type) {
+      case "crossHatch":
+        return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`;
+      case "crossDiagonal":
+        return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`;
+      case "diagonalLeft":
+        return `${cmd}(45deg,${colors})`;
+      case "diagonalRight":
+        return `${cmd}(-45deg,${colors})`;
+      case "horizontal":
+        return `${cmd}(to top,${colors})`;
+      case "vertical":
+        return `${cmd}(to right,${colors})`;
+    }
+    return "";
+  }
+}
+class Picture extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "picture");
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Proto extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "proto", true);
+    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(attributes) {
+    super(TEMPLATE_NS_ID, "radial", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["toEdge", "toCenter"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+  [$toStyle](startColor) {
+    startColor = startColor ? startColor[$toStyle]() : "#FFFFFF";
+    const endColor = this.color ? this.color[$toStyle]() : "#000000";
+    const colors = this.type === "toEdge" ? `${startColor},${endColor}` : `${endColor},${startColor}`;
+    return `radial-gradient(circle at center, ${colors})`;
+  }
+}
+class Reason extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "reason");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Reasons extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "reasons", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.reason = new XFAObjectArray();
+  }
+}
+class Rectangle extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "rectangle", true);
+    this.hand = getStringOption(attributes.hand, ["even", "left", "right"]);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.corner = new XFAObjectArray(4);
+    this.edge = new XFAObjectArray(4);
+    this.fill = null;
+  }
+  [$toHTML]() {
+    const edge = this.edge.children.length ? this.edge.children[0] : new Edge({});
+    const edgeStyle = edge[$toStyle]();
+    const style = Object.create(null);
+    if (this.fill?.presence === "visible") {
+      Object.assign(style, this.fill[$toStyle]());
+    } else {
+      style.fill = "transparent";
+    }
+    style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0);
+    style.stroke = edgeStyle.color;
+    const corner = this.corner.children.length ? this.corner.children[0] : new Corner({});
+    const cornerStyle = corner[$toStyle]();
+    const rect = {
+      name: "rect",
+      attributes: {
+        xmlns: SVG_NS,
+        width: "100%",
+        height: "100%",
+        x: 0,
+        y: 0,
+        rx: cornerStyle.radius,
+        ry: cornerStyle.radius,
+        style
+      }
+    };
+    const svg = {
+      name: "svg",
+      children: [rect],
+      attributes: {
+        xmlns: SVG_NS,
+        style: {
+          overflow: "visible"
+        },
+        width: "100%",
+        height: "100%"
+      }
+    };
+    const parent = this[$getParent]()[$getParent]();
+    if (hasMargin(parent)) {
+      return HTMLResult.success({
+        name: "div",
+        attributes: {
+          style: {
+            display: "inline",
+            width: "100%",
+            height: "100%"
+          }
+        },
+        children: [svg]
+      });
+    }
+    svg.attributes.style.position = "absolute";
+    return HTMLResult.success(svg);
+  }
+}
+class RefElement extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "ref");
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Script extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "script");
+    this.binding = attributes.binding || "";
+    this.contentType = attributes.contentType || "";
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class SetProperty extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "setProperty");
+    this.connection = attributes.connection || "";
+    this.ref = attributes.ref || "";
+    this.target = attributes.target || "";
+  }
+}
+class SignData extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "signData", true);
+    this.id = attributes.id || "";
+    this.operation = getStringOption(attributes.operation, ["sign", "clear", "verify"]);
+    this.ref = attributes.ref || "";
+    this.target = attributes.target || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.filter = null;
+    this.manifest = null;
+  }
+}
+class Signature extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "signature", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["PDF1.3", "PDF1.6"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.border = null;
+    this.extras = null;
+    this.filter = null;
+    this.manifest = null;
+    this.margin = null;
+  }
+}
+class Signing extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "signing", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.certificate = new XFAObjectArray();
+  }
+}
+class Solid extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "solid", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+  }
+  [$toStyle](startColor) {
+    return startColor ? startColor[$toStyle]() : "#FFFFFF";
+  }
+}
+class Speak extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "speak");
+    this.disable = getInteger({
+      data: attributes.disable,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.id = attributes.id || "";
+    this.priority = getStringOption(attributes.priority, ["custom", "caption", "name", "toolTip"]);
+    this.rid = attributes.rid || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Stipple extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "stipple", true);
+    this.id = attributes.id || "";
+    this.rate = getInteger({
+      data: attributes.rate,
+      defaultValue: 50,
+      validate: x => x >= 0 && x <= 100
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.color = null;
+    this.extras = null;
+  }
+  [$toStyle](bgColor) {
+    const alpha = this.rate / 100;
+    return Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha));
+  }
+}
+class Subform extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "subform", true);
+    this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]);
+    this.allowMacro = getInteger({
+      data: attributes.allowMacro,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
+    this.colSpan = getInteger({
+      data: attributes.colSpan,
+      defaultValue: 1,
+      validate: n => n >= 1 || n === -1
+    });
+    this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : getMeasurement(x));
+    this.h = attributes.h ? getMeasurement(attributes.h) : "";
+    this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
+    this.id = attributes.id || "";
+    this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]);
+    this.locale = attributes.locale || "";
+    this.maxH = getMeasurement(attributes.maxH, "0pt");
+    this.maxW = getMeasurement(attributes.maxW, "0pt");
+    this.mergeMode = getStringOption(attributes.mergeMode, ["consumeData", "matchTemplate"]);
+    this.minH = getMeasurement(attributes.minH, "0pt");
+    this.minW = getMeasurement(attributes.minW, "0pt");
+    this.name = attributes.name || "";
+    this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
+    this.relevant = getRelevant(attributes.relevant);
+    this.restoreState = getStringOption(attributes.restoreState, ["manual", "auto"]);
+    this.scope = getStringOption(attributes.scope, ["name", "none"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.w = attributes.w ? getMeasurement(attributes.w) : "";
+    this.x = getMeasurement(attributes.x, "0pt");
+    this.y = getMeasurement(attributes.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();
+  }
+  [$getSubformParent]() {
+    const parent = this[$getParent]();
+    if (parent instanceof SubformSet) {
+      return parent[$getSubformParent]();
+    }
+    return parent;
+  }
+  [$isBindable]() {
+    return true;
+  }
+  [$isThereMoreWidth]() {
+    return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth]();
+  }
+  *[$getContainedChildren]() {
+    yield* getContainedChildren(this);
+  }
+  [$flushHTML]() {
+    return flushHTML(this);
+  }
+  [$addHTML](html, bbox) {
+    addHTML(this, html, bbox);
+  }
+  [$getAvailableSpace]() {
+    return getAvailableSpace(this);
+  }
+  [$isSplittable]() {
+    const parent = this[$getSubformParent]();
+    if (!parent[$isSplittable]()) {
+      return false;
+    }
+    if (this[$extra]._isSplittable !== undefined) {
+      return this[$extra]._isSplittable;
+    }
+    if (this.layout === "position" || this.layout.includes("row")) {
+      this[$extra]._isSplittable = false;
+      return false;
+    }
+    if (this.keep && this.keep.intact !== "none") {
+      this[$extra]._isSplittable = false;
+      return false;
+    }
+    if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) {
+      return false;
+    }
+    this[$extra]._isSplittable = true;
+    return true;
+  }
+  [$toHTML](availableSpace) {
+    setTabIndex(this);
+    if (this.break) {
+      if (this.break.after !== "auto" || this.break.afterTarget !== "") {
+        const node = new BreakAfter({
+          targetType: this.break.after,
+          target: this.break.afterTarget,
+          startNew: this.break.startNew.toString()
+        });
+        node[$globalData] = this[$globalData];
+        this[$appendChild](node);
+        this.breakAfter.push(node);
+      }
+      if (this.break.before !== "auto" || this.break.beforeTarget !== "") {
+        const node = new BreakBefore({
+          targetType: this.break.before,
+          target: this.break.beforeTarget,
+          startNew: this.break.startNew.toString()
+        });
+        node[$globalData] = this[$globalData];
+        this[$appendChild](node);
+        this.breakBefore.push(node);
+      }
+      if (this.break.overflowTarget !== "") {
+        const node = new Overflow({
+          target: this.break.overflowTarget,
+          leader: this.break.overflowLeader,
+          trailer: this.break.overflowTrailer
+        });
+        node[$globalData] = this[$globalData];
+        this[$appendChild](node);
+        this.overflow.push(node);
+      }
+      this[$removeChild](this.break);
+      this.break = null;
+    }
+    if (this.presence === "hidden" || this.presence === "inactive") {
+      return HTMLResult.EMPTY;
+    }
+    if (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 breakBefore = this.breakBefore.children[0];
+      if (handleBreak(breakBefore)) {
+        return HTMLResult.breakNode(breakBefore);
+      }
+    }
+    if (this[$extra]?.afterBreakAfter) {
+      return HTMLResult.EMPTY;
+    }
+    fixDimensions(this);
+    const children = [];
+    const attributes = {
+      id: this[$uid],
+      class: []
+    };
+    setAccess(this, attributes.class);
+    this[$extra] ||= Object.create(null);
+    Object.assign(this[$extra], {
+      children,
+      line: null,
+      attributes,
+      attempt: 0,
+      numberInLine: 0,
+      availableSpace: {
+        width: Math.min(this.w || Infinity, availableSpace.width),
+        height: Math.min(this.h || Infinity, availableSpace.height)
+      },
+      width: 0,
+      height: 0,
+      prevHeight: 0,
+      currentWidth: 0
+    });
+    const root = this[$getTemplateRoot]();
+    const savedNoLayoutFailure = root[$extra].noLayoutFailure;
+    const isSplittable = this[$isSplittable]();
+    if (!isSplittable) {
+      setFirstUnsplittable(this);
+    }
+    if (!checkDimensions(this, availableSpace)) {
+      return HTMLResult.FAILURE;
+    }
+    const filter = new Set(["area", "draw", "exclGroup", "field", "subform", "subformSet"]);
+    if (this.layout.includes("row")) {
+      const columnWidths = this[$getSubformParent]().columnWidths;
+      if (Array.isArray(columnWidths) && columnWidths.length > 0) {
+        this[$extra].columnWidths = columnWidths;
+        this[$extra].currentColumn = 0;
+      }
+    }
+    const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign");
+    const classNames = ["xfaSubform"];
+    const cl = layoutClass(this);
+    if (cl) {
+      classNames.push(cl);
+    }
+    attributes.style = style;
+    attributes.class = classNames;
+    if (this.name) {
+      attributes.xfaName = this.name;
+    }
+    if (this.overflow) {
+      const overflowExtra = this.overflow[$getExtra]();
+      if (overflowExtra.addLeader) {
+        overflowExtra.addLeader = false;
+        handleOverflow(this, overflowExtra.leader, availableSpace);
+      }
+    }
+    this[$pushPara]();
+    const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb";
+    const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;
+    for (; this[$extra].attempt < maxRun; this[$extra].attempt++) {
+      if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
+        this[$extra].numberInLine = 0;
+      }
+      const result = this[$childrenToHTML]({
+        filter,
+        include: true
+      });
+      if (result.success) {
+        break;
+      }
+      if (result.isBreak()) {
+        this[$popPara]();
+        return result;
+      }
+      if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !root[$extra].noLayoutFailure) {
+        this[$extra].attempt = maxRun;
+        break;
+      }
+    }
+    this[$popPara]();
+    if (!isSplittable) {
+      unsetFirstUnsplittable(this);
+    }
+    root[$extra].noLayoutFailure = savedNoLayoutFailure;
+    if (this[$extra].attempt === maxRun) {
+      if (this.overflow) {
+        this[$getTemplateRoot]()[$extra].overflowNode = this.overflow;
+      }
+      if (!isSplittable) {
+        delete this[$extra];
+      }
+      return HTMLResult.FAILURE;
+    }
+    if (this.overflow) {
+      const overflowExtra = this.overflow[$getExtra]();
+      if (overflowExtra.addTrailer) {
+        overflowExtra.addTrailer = false;
+        handleOverflow(this, overflowExtra.trailer, availableSpace);
+      }
+    }
+    let marginH = 0;
+    let marginV = 0;
+    if (this.margin) {
+      marginH = this.margin.leftInset + this.margin.rightInset;
+      marginV = this.margin.topInset + this.margin.bottomInset;
+    }
+    const width = Math.max(this[$extra].width + marginH, this.w || 0);
+    const height = Math.max(this[$extra].height + marginV, this.h || 0);
+    const bbox = [this.x, this.y, width, height];
+    if (this.w === "") {
+      style.width = measureToString(width);
+    }
+    if (this.h === "") {
+      style.height = measureToString(height);
+    }
+    if ((style.width === "0px" || style.height === "0px") && children.length === 0) {
+      return HTMLResult.EMPTY;
+    }
+    const html = {
+      name: "div",
+      attributes,
+      children
+    };
+    applyAssist(this, attributes);
+    const result = HTMLResult.success(createWrapper(this, html), bbox);
+    if (this.breakAfter.children.length >= 1) {
+      const breakAfter = this.breakAfter.children[0];
+      if (handleBreak(breakAfter)) {
+        this[$extra].afterBreakAfter = result;
+        return HTMLResult.breakNode(breakAfter);
+      }
+    }
+    delete this[$extra];
+    return result;
+  }
+}
+class SubformSet extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "subformSet", true);
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.relation = getStringOption(attributes.relation, ["ordered", "choice", "unordered"]);
+    this.relevant = getRelevant(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.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();
+  }
+  *[$getContainedChildren]() {
+    yield* getContainedChildren(this);
+  }
+  [$getSubformParent]() {
+    let parent = this[$getParent]();
+    while (!(parent instanceof Subform)) {
+      parent = parent[$getParent]();
+    }
+    return parent;
+  }
+  [$isBindable]() {
+    return true;
+  }
+}
+class SubjectDN extends ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "subjectDN");
+    this.delimiter = attributes.delimiter || ",";
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$finalize]() {
+    this[$content] = new Map(this[$content].split(this.delimiter).map(kv => {
+      kv = kv.split("=", 2);
+      kv[0] = kv[0].trim();
+      return kv;
+    }));
+  }
+}
+class SubjectDNs extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "subjectDNs", true);
+    this.id = attributes.id || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.subjectDN = new XFAObjectArray();
+  }
+}
+class Submit extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "submit", true);
+    this.embedPDF = getInteger({
+      data: attributes.embedPDF,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.format = getStringOption(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", "xfd", "xml"]);
+    this.id = attributes.id || "";
+    this.target = attributes.target || "";
+    this.textEncoding = getKeyword({
+      data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "",
+      defaultValue: "",
+      validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/)
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.xdpContent = attributes.xdpContent || "";
+    this.encrypt = null;
+    this.encryptData = new XFAObjectArray();
+    this.signData = new XFAObjectArray();
+  }
+}
+class Template extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "template", true);
+    this.baseProfile = getStringOption(attributes.baseProfile, ["full", "interactiveForms"]);
+    this.extras = null;
+    this.subform = new XFAObjectArray();
+  }
+  [$finalize]() {
+    if (this.subform.children.length === 0) {
+      warn("XFA - No subforms in template node.");
+    }
+    if (this.subform.children.length >= 2) {
+      warn("XFA - Several subforms in template node: please file a bug.");
+    }
+    this[$tabIndex] = DEFAULT_TAB_INDEX;
+  }
+  [$isSplittable]() {
+    return true;
+  }
+  [$searchNode](expr, container) {
+    if (expr.startsWith("#")) {
+      return [this[$ids].get(expr.slice(1))];
+    }
+    return searchNode(this, container, expr, true, true);
+  }
+  *[$toPages]() {
+    if (!this.subform.children.length) {
+      return HTMLResult.success({
+        name: "div",
+        children: []
+      });
+    }
+    this[$extra] = {
+      overflowNode: null,
+      firstUnsplittable: null,
+      currentContentArea: null,
+      currentPageArea: null,
+      noLayoutFailure: false,
+      pageNumber: 1,
+      pagePosition: "first",
+      oddOrEven: "odd",
+      blankOrNotBlank: "nonBlank",
+      paraStack: []
+    };
+    const root = this.subform.children[0];
+    root.pageSet[$cleanPage]();
+    const pageAreas = root.pageSet.pageArea.children;
+    const mainHtml = {
+      name: "div",
+      children: []
+    };
+    let pageArea = null;
+    let breakBefore = null;
+    let breakBeforeTarget = null;
+    if (root.breakBefore.children.length >= 1) {
+      breakBefore = root.breakBefore.children[0];
+      breakBeforeTarget = breakBefore.target;
+    } else if (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 1) {
+      breakBefore = root.subform.children[0].breakBefore.children[0];
+      breakBeforeTarget = breakBefore.target;
+    } else if (root.break?.beforeTarget) {
+      breakBefore = root.break;
+      breakBeforeTarget = breakBefore.beforeTarget;
+    } else if (root.subform.children.length >= 1 && root.subform.children[0].break?.beforeTarget) {
+      breakBefore = root.subform.children[0].break;
+      breakBeforeTarget = breakBefore.beforeTarget;
+    }
+    if (breakBefore) {
+      const target = this[$searchNode](breakBeforeTarget, breakBefore[$getParent]());
+      if (target instanceof PageArea) {
+        pageArea = target;
+        breakBefore[$extra] = {};
+      }
+    }
+    pageArea ||= pageAreas[0];
+    pageArea[$extra] = {
+      numberOfUse: 1
+    };
+    const pageAreaParent = pageArea[$getParent]();
+    pageAreaParent[$extra] = {
+      numberOfUse: 1,
+      pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea),
+      pageSetIndex: 0
+    };
+    let targetPageArea;
+    let leader = null;
+    let trailer = null;
+    let hasSomething = true;
+    let hasSomethingCounter = 0;
+    let startIndex = 0;
+    while (true) {
+      if (!hasSomething) {
+        mainHtml.children.pop();
+        if (++hasSomethingCounter === MAX_EMPTY_PAGES) {
+          warn("XFA - Something goes wrong: please file a bug.");
+          return mainHtml;
+        }
+      } else {
+        hasSomethingCounter = 0;
+      }
+      targetPageArea = null;
+      this[$extra].currentPageArea = pageArea;
+      const page = pageArea[$toHTML]().html;
+      mainHtml.children.push(page);
+      if (leader) {
+        this[$extra].noLayoutFailure = true;
+        page.children.push(leader[$toHTML](pageArea[$extra].space).html);
+        leader = null;
+      }
+      if (trailer) {
+        this[$extra].noLayoutFailure = true;
+        page.children.push(trailer[$toHTML](pageArea[$extra].space).html);
+        trailer = null;
+      }
+      const contentAreas = pageArea.contentArea.children;
+      const htmlContentAreas = page.children.filter(node => node.attributes.class.includes("xfaContentarea"));
+      hasSomething = false;
+      this[$extra].firstUnsplittable = null;
+      this[$extra].noLayoutFailure = false;
+      const flush = index => {
+        const html = root[$flushHTML]();
+        if (html) {
+          hasSomething ||= html.children?.length > 0;
+          htmlContentAreas[index].children.push(html);
+        }
+      };
+      for (let i = startIndex, ii = contentAreas.length; i < ii; i++) {
+        const contentArea = this[$extra].currentContentArea = contentAreas[i];
+        const space = {
+          width: contentArea.w,
+          height: contentArea.h
+        };
+        startIndex = 0;
+        if (leader) {
+          htmlContentAreas[i].children.push(leader[$toHTML](space).html);
+          leader = null;
+        }
+        if (trailer) {
+          htmlContentAreas[i].children.push(trailer[$toHTML](space).html);
+          trailer = null;
+        }
+        const html = root[$toHTML](space);
+        if (html.success) {
+          if (html.html) {
+            hasSomething ||= html.html.children?.length > 0;
+            htmlContentAreas[i].children.push(html.html);
+          } else if (!hasSomething && mainHtml.children.length > 1) {
+            mainHtml.children.pop();
+          }
+          return mainHtml;
+        }
+        if (html.isBreak()) {
+          const node = html.breakNode;
+          flush(i);
+          if (node.targetType === "auto") {
+            continue;
+          }
+          if (node.leader) {
+            leader = this[$searchNode](node.leader, node[$getParent]());
+            leader = leader ? leader[0] : null;
+          }
+          if (node.trailer) {
+            trailer = this[$searchNode](node.trailer, node[$getParent]());
+            trailer = trailer ? trailer[0] : null;
+          }
+          if (node.targetType === "pageArea") {
+            targetPageArea = node[$extra].target;
+            i = Infinity;
+          } else if (!node[$extra].target) {
+            i = node[$extra].index;
+          } else {
+            targetPageArea = node[$extra].target;
+            startIndex = node[$extra].index + 1;
+            i = Infinity;
+          }
+          continue;
+        }
+        if (this[$extra].overflowNode) {
+          const node = this[$extra].overflowNode;
+          this[$extra].overflowNode = null;
+          const overflowExtra = node[$getExtra]();
+          const target = overflowExtra.target;
+          overflowExtra.addLeader = overflowExtra.leader !== null;
+          overflowExtra.addTrailer = overflowExtra.trailer !== null;
+          flush(i);
+          const currentIndex = i;
+          i = Infinity;
+          if (target instanceof PageArea) {
+            targetPageArea = target;
+          } else if (target instanceof ContentArea) {
+            const index = contentAreas.indexOf(target);
+            if (index !== -1) {
+              if (index > currentIndex) {
+                i = index - 1;
+              } else {
+                startIndex = index;
+              }
+            } else {
+              targetPageArea = target[$getParent]();
+              startIndex = targetPageArea.contentArea.children.indexOf(target);
+            }
+          }
+          continue;
+        }
+        flush(i);
+      }
+      this[$extra].pageNumber += 1;
+      if (targetPageArea) {
+        if (targetPageArea[$isUsable]()) {
+          targetPageArea[$extra].numberOfUse += 1;
+        } else {
+          targetPageArea = null;
+        }
+      }
+      pageArea = targetPageArea || pageArea[$getNextPage]();
+      yield null;
+    }
+  }
+}
+class Text extends ContentObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "text");
+    this.id = attributes.id || "";
+    this.maxChars = getInteger({
+      data: attributes.maxChars,
+      defaultValue: 0,
+      validate: x => x >= 0
+    });
+    this.name = attributes.name || "";
+    this.rid = attributes.rid || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$acceptWhitespace]() {
+    return true;
+  }
+  [$onChild](child) {
+    if (child[$namespaceId] === NamespaceIds.xhtml.id) {
+      this[$content] = child;
+      return true;
+    }
+    warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`);
+    return false;
+  }
+  [$onText](str) {
+    if (this[$content] instanceof XFAObject) {
+      return;
+    }
+    super[$onText](str);
+  }
+  [$finalize]() {
+    if (typeof this[$content] === "string") {
+      this[$content] = this[$content].replaceAll("\r\n", "\n");
+    }
+  }
+  [$getExtra]() {
+    if (typeof this[$content] === "string") {
+      return this[$content].split(/[\u2029\u2028\n]/).filter(line => !!line).join("\n");
+    }
+    return this[$content][$text]();
+  }
+  [$toHTML](availableSpace) {
+    if (typeof this[$content] === "string") {
+      const html = valueToHtml(this[$content]).html;
+      if (this[$content].includes("\u2029")) {
+        html.name = "div";
+        html.children = [];
+        this[$content].split("\u2029").map(para => para.split(/[\u2028\n]/).flatMap(line => [{
+          name: "span",
+          value: line
+        }, {
+          name: "br"
+        }])).forEach(lines => {
+          html.children.push({
+            name: "p",
+            children: lines
+          });
+        });
+      } else if (/[\u2028\n]/.test(this[$content])) {
+        html.name = "div";
+        html.children = [];
+        this[$content].split(/[\u2028\n]/).forEach(line => {
+          html.children.push({
+            name: "span",
+            value: line
+          }, {
+            name: "br"
+          });
+        });
+      }
+      return HTMLResult.success(html);
+    }
+    return this[$content][$toHTML](availableSpace);
+  }
+}
+class TextEdit extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "textEdit", true);
+    this.allowRichText = getInteger({
+      data: attributes.allowRichText,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]);
+    this.id = attributes.id || "";
+    this.multiLine = getInteger({
+      data: attributes.multiLine,
+      defaultValue: "",
+      validate: x => x === 0 || x === 1
+    });
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, ["auto", "off", "on"]);
+    this.border = null;
+    this.comb = null;
+    this.extras = null;
+    this.margin = null;
+  }
+  [$toHTML](availableSpace) {
+    const style = toStyle(this, "border", "font", "margin");
+    let html;
+    const field = this[$getParent]()[$getParent]();
+    if (this.multiLine === "") {
+      this.multiLine = field instanceof Draw ? 1 : 0;
+    }
+    if (this.multiLine === 1) {
+      html = {
+        name: "textarea",
+        attributes: {
+          dataId: field[$data]?.[$uid] || field[$uid],
+          fieldId: field[$uid],
+          class: ["xfaTextfield"],
+          style,
+          "aria-label": ariaLabel(field),
+          "aria-required": false
+        }
+      };
+    } else {
+      html = {
+        name: "input",
+        attributes: {
+          type: "text",
+          dataId: field[$data]?.[$uid] || field[$uid],
+          fieldId: field[$uid],
+          class: ["xfaTextfield"],
+          style,
+          "aria-label": ariaLabel(field),
+          "aria-required": false
+        }
+      };
+    }
+    if (isRequired(field)) {
+      html.attributes["aria-required"] = true;
+      html.attributes.required = true;
+    }
+    return HTMLResult.success({
+      name: "label",
+      attributes: {
+        class: ["xfaLabel"]
+      },
+      children: [html]
+    });
+  }
+}
+class Time extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "time");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+  [$finalize]() {
+    const date = this[$content].trim();
+    this[$content] = date ? new Date(date) : null;
+  }
+  [$toHTML](availableSpace) {
+    return valueToHtml(this[$content] ? this[$content].toString() : "");
+  }
+}
+class TimeStamp extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "timeStamp");
+    this.id = attributes.id || "";
+    this.server = attributes.server || "";
+    this.type = getStringOption(attributes.type, ["optional", "required"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class ToolTip extends StringObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "toolTip");
+    this.id = attributes.id || "";
+    this.rid = attributes.rid || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Traversal extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "traversal", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.traverse = new XFAObjectArray();
+  }
+}
+class Traverse extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "traverse", true);
+    this.id = attributes.id || "";
+    this.operation = getStringOption(attributes.operation, ["next", "back", "down", "first", "left", "right", "up"]);
+    this.ref = attributes.ref || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.script = null;
+  }
+  get name() {
+    return this.operation;
+  }
+  [$isTransparent]() {
+    return false;
+  }
+}
+class Ui extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "ui", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.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;
+  }
+  [$getExtra]() {
+    if (this[$extra] === undefined) {
+      for (const name of Object.getOwnPropertyNames(this)) {
+        if (name === "extras" || name === "picture") {
+          continue;
+        }
+        const obj = this[name];
+        if (!(obj instanceof XFAObject)) {
+          continue;
+        }
+        this[$extra] = obj;
+        return obj;
+      }
+      this[$extra] = null;
+    }
+    return this[$extra];
+  }
+  [$toHTML](availableSpace) {
+    const obj = this[$getExtra]();
+    if (obj) {
+      return obj[$toHTML](availableSpace);
+    }
+    return HTMLResult.EMPTY;
+  }
+}
+class Validate extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "validate", true);
+    this.formatTest = getStringOption(attributes.formatTest, ["warning", "disabled", "error"]);
+    this.id = attributes.id || "";
+    this.nullTest = getStringOption(attributes.nullTest, ["disabled", "error", "warning"]);
+    this.scriptTest = getStringOption(attributes.scriptTest, ["error", "disabled", "warning"]);
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+    this.extras = null;
+    this.message = null;
+    this.picture = null;
+    this.script = null;
+  }
+}
+class Value extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "value", true);
+    this.id = attributes.id || "";
+    this.override = getInteger({
+      data: attributes.override,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.relevant = getRelevant(attributes.relevant);
+    this.use = attributes.use || "";
+    this.usehref = attributes.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;
+  }
+  [$setValue](value) {
+    const parent = this[$getParent]();
+    if (parent instanceof Field) {
+      if (parent.ui?.imageEdit) {
+        if (!this.image) {
+          this.image = new Image({});
+          this[$appendChild](this.image);
+        }
+        this.image[$content] = value[$content];
+        return;
+      }
+    }
+    const valueName = value[$nodeName];
+    if (this[valueName] !== null) {
+      this[valueName][$content] = value[$content];
+      return;
+    }
+    for (const name of Object.getOwnPropertyNames(this)) {
+      const obj = this[name];
+      if (obj instanceof XFAObject) {
+        this[name] = null;
+        this[$removeChild](obj);
+      }
+    }
+    this[value[$nodeName]] = value;
+    this[$appendChild](value);
+  }
+  [$text]() {
+    if (this.exData) {
+      if (typeof this.exData[$content] === "string") {
+        return this.exData[$content].trim();
+      }
+      return this.exData[$content][$text]().trim();
+    }
+    for (const name of Object.getOwnPropertyNames(this)) {
+      if (name === "image") {
+        continue;
+      }
+      const obj = this[name];
+      if (obj instanceof XFAObject) {
+        return (obj[$content] || "").toString().trim();
+      }
+    }
+    return null;
+  }
+  [$toHTML](availableSpace) {
+    for (const name of Object.getOwnPropertyNames(this)) {
+      const obj = this[name];
+      if (!(obj instanceof XFAObject)) {
+        continue;
+      }
+      return obj[$toHTML](availableSpace);
+    }
+    return HTMLResult.EMPTY;
+  }
+}
+class Variables extends XFAObject {
+  constructor(attributes) {
+    super(TEMPLATE_NS_ID, "variables", true);
+    this.id = attributes.id || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.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();
+  }
+  [$isTransparent]() {
+    return true;
+  }
+}
+class TemplateNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(TemplateNamespace, name)) {
+      const node = TemplateNamespace[name](attributes);
+      node[$setSetAttributes](attributes);
+      return node;
+    }
+    return undefined;
+  }
+  static appearanceFilter(attrs) {
+    return new AppearanceFilter(attrs);
+  }
+  static arc(attrs) {
+    return new Arc(attrs);
+  }
+  static area(attrs) {
+    return new Area(attrs);
+  }
+  static assist(attrs) {
+    return new Assist(attrs);
+  }
+  static barcode(attrs) {
+    return new Barcode(attrs);
+  }
+  static bind(attrs) {
+    return new Bind(attrs);
+  }
+  static bindItems(attrs) {
+    return new BindItems(attrs);
+  }
+  static bookend(attrs) {
+    return new Bookend(attrs);
+  }
+  static boolean(attrs) {
+    return new BooleanElement(attrs);
+  }
+  static border(attrs) {
+    return new Border(attrs);
+  }
+  static break(attrs) {
+    return new Break(attrs);
+  }
+  static breakAfter(attrs) {
+    return new BreakAfter(attrs);
+  }
+  static breakBefore(attrs) {
+    return new BreakBefore(attrs);
+  }
+  static button(attrs) {
+    return new Button(attrs);
+  }
+  static calculate(attrs) {
+    return new Calculate(attrs);
+  }
+  static caption(attrs) {
+    return new Caption(attrs);
+  }
+  static certificate(attrs) {
+    return new Certificate(attrs);
+  }
+  static certificates(attrs) {
+    return new Certificates(attrs);
+  }
+  static checkButton(attrs) {
+    return new CheckButton(attrs);
+  }
+  static choiceList(attrs) {
+    return new ChoiceList(attrs);
+  }
+  static color(attrs) {
+    return new Color(attrs);
+  }
+  static comb(attrs) {
+    return new Comb(attrs);
+  }
+  static connect(attrs) {
+    return new Connect(attrs);
+  }
+  static contentArea(attrs) {
+    return new ContentArea(attrs);
+  }
+  static corner(attrs) {
+    return new Corner(attrs);
+  }
+  static date(attrs) {
+    return new DateElement(attrs);
+  }
+  static dateTime(attrs) {
+    return new DateTime(attrs);
+  }
+  static dateTimeEdit(attrs) {
+    return new DateTimeEdit(attrs);
+  }
+  static decimal(attrs) {
+    return new Decimal(attrs);
+  }
+  static defaultUi(attrs) {
+    return new DefaultUi(attrs);
+  }
+  static desc(attrs) {
+    return new Desc(attrs);
+  }
+  static digestMethod(attrs) {
+    return new DigestMethod(attrs);
+  }
+  static digestMethods(attrs) {
+    return new DigestMethods(attrs);
+  }
+  static draw(attrs) {
+    return new Draw(attrs);
+  }
+  static edge(attrs) {
+    return new Edge(attrs);
+  }
+  static encoding(attrs) {
+    return new Encoding(attrs);
+  }
+  static encodings(attrs) {
+    return new Encodings(attrs);
+  }
+  static encrypt(attrs) {
+    return new Encrypt(attrs);
+  }
+  static encryptData(attrs) {
+    return new EncryptData(attrs);
+  }
+  static encryption(attrs) {
+    return new Encryption(attrs);
+  }
+  static encryptionMethod(attrs) {
+    return new EncryptionMethod(attrs);
+  }
+  static encryptionMethods(attrs) {
+    return new EncryptionMethods(attrs);
+  }
+  static event(attrs) {
+    return new Event(attrs);
+  }
+  static exData(attrs) {
+    return new ExData(attrs);
+  }
+  static exObject(attrs) {
+    return new ExObject(attrs);
+  }
+  static exclGroup(attrs) {
+    return new ExclGroup(attrs);
+  }
+  static execute(attrs) {
+    return new Execute(attrs);
+  }
+  static extras(attrs) {
+    return new Extras(attrs);
+  }
+  static field(attrs) {
+    return new Field(attrs);
+  }
+  static fill(attrs) {
+    return new Fill(attrs);
+  }
+  static filter(attrs) {
+    return new Filter(attrs);
+  }
+  static float(attrs) {
+    return new Float(attrs);
+  }
+  static font(attrs) {
+    return new template_Font(attrs);
+  }
+  static format(attrs) {
+    return new Format(attrs);
+  }
+  static handler(attrs) {
+    return new Handler(attrs);
+  }
+  static hyphenation(attrs) {
+    return new Hyphenation(attrs);
+  }
+  static image(attrs) {
+    return new Image(attrs);
+  }
+  static imageEdit(attrs) {
+    return new ImageEdit(attrs);
+  }
+  static integer(attrs) {
+    return new Integer(attrs);
+  }
+  static issuers(attrs) {
+    return new Issuers(attrs);
+  }
+  static items(attrs) {
+    return new Items(attrs);
+  }
+  static keep(attrs) {
+    return new Keep(attrs);
+  }
+  static keyUsage(attrs) {
+    return new KeyUsage(attrs);
+  }
+  static line(attrs) {
+    return new Line(attrs);
+  }
+  static linear(attrs) {
+    return new Linear(attrs);
+  }
+  static lockDocument(attrs) {
+    return new LockDocument(attrs);
+  }
+  static manifest(attrs) {
+    return new Manifest(attrs);
+  }
+  static margin(attrs) {
+    return new Margin(attrs);
+  }
+  static mdp(attrs) {
+    return new Mdp(attrs);
+  }
+  static medium(attrs) {
+    return new Medium(attrs);
+  }
+  static message(attrs) {
+    return new Message(attrs);
+  }
+  static numericEdit(attrs) {
+    return new NumericEdit(attrs);
+  }
+  static occur(attrs) {
+    return new Occur(attrs);
+  }
+  static oid(attrs) {
+    return new Oid(attrs);
+  }
+  static oids(attrs) {
+    return new Oids(attrs);
+  }
+  static overflow(attrs) {
+    return new Overflow(attrs);
+  }
+  static pageArea(attrs) {
+    return new PageArea(attrs);
+  }
+  static pageSet(attrs) {
+    return new PageSet(attrs);
+  }
+  static para(attrs) {
+    return new Para(attrs);
+  }
+  static passwordEdit(attrs) {
+    return new PasswordEdit(attrs);
+  }
+  static pattern(attrs) {
+    return new template_Pattern(attrs);
+  }
+  static picture(attrs) {
+    return new Picture(attrs);
+  }
+  static proto(attrs) {
+    return new Proto(attrs);
+  }
+  static radial(attrs) {
+    return new Radial(attrs);
+  }
+  static reason(attrs) {
+    return new Reason(attrs);
+  }
+  static reasons(attrs) {
+    return new Reasons(attrs);
+  }
+  static rectangle(attrs) {
+    return new Rectangle(attrs);
+  }
+  static ref(attrs) {
+    return new RefElement(attrs);
+  }
+  static script(attrs) {
+    return new Script(attrs);
+  }
+  static setProperty(attrs) {
+    return new SetProperty(attrs);
+  }
+  static signData(attrs) {
+    return new SignData(attrs);
+  }
+  static signature(attrs) {
+    return new Signature(attrs);
+  }
+  static signing(attrs) {
+    return new Signing(attrs);
+  }
+  static solid(attrs) {
+    return new Solid(attrs);
+  }
+  static speak(attrs) {
+    return new Speak(attrs);
+  }
+  static stipple(attrs) {
+    return new Stipple(attrs);
+  }
+  static subform(attrs) {
+    return new Subform(attrs);
+  }
+  static subformSet(attrs) {
+    return new SubformSet(attrs);
+  }
+  static subjectDN(attrs) {
+    return new SubjectDN(attrs);
+  }
+  static subjectDNs(attrs) {
+    return new SubjectDNs(attrs);
+  }
+  static submit(attrs) {
+    return new Submit(attrs);
+  }
+  static template(attrs) {
+    return new Template(attrs);
+  }
+  static text(attrs) {
+    return new Text(attrs);
+  }
+  static textEdit(attrs) {
+    return new TextEdit(attrs);
+  }
+  static time(attrs) {
+    return new Time(attrs);
+  }
+  static timeStamp(attrs) {
+    return new TimeStamp(attrs);
+  }
+  static toolTip(attrs) {
+    return new ToolTip(attrs);
+  }
+  static traversal(attrs) {
+    return new Traversal(attrs);
+  }
+  static traverse(attrs) {
+    return new Traverse(attrs);
+  }
+  static ui(attrs) {
+    return new Ui(attrs);
+  }
+  static validate(attrs) {
+    return new Validate(attrs);
+  }
+  static value(attrs) {
+    return new Value(attrs);
+  }
+  static variables(attrs) {
+    return new Variables(attrs);
+  }
+}
+
+;// ./src/core/xfa/bind.js
+
+
+
+
+
+
+const bind_NS_DATASETS = NamespaceIds.datasets.id;
+function createText(content) {
+  const node = new Text({});
+  node[$content] = content;
+  return node;
+}
+class Binder {
+  constructor(root) {
+    this.root = root;
+    this.datasets = root.datasets;
+    this.data = root.datasets?.data || new XmlObject(NamespaceIds.datasets.id, "data");
+    this.emptyMerge = this.data[$getChildren]().length === 0;
+    this.root.form = this.form = root.template[$clone]();
+  }
+  _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(formNode, data, picture) {
+    formNode[$data] = data;
+    if (formNode[$hasSettableValue]()) {
+      if (data[$isDataValue]()) {
+        const value = data[$getDataValue]();
+        formNode[$setValue](createText(value));
+      } else if (formNode instanceof Field && formNode.ui?.choiceList?.open === "multiSelect") {
+        const value = data[$getChildren]().map(child => child[$content].trim()).join("\n");
+        formNode[$setValue](createText(value));
+      } else if (this._isConsumeData()) {
+        warn(`XFA - Nodes haven't the same type.`);
+      }
+    } else if (!data[$isDataValue]() || this._isMatchTemplate()) {
+      this._bindElement(formNode, data);
+    } else {
+      warn(`XFA - Nodes haven't the same type.`);
+    }
+  }
+  _findDataByNameToConsume(name, isValue, dataNode, global) {
+    if (!name) {
+      return null;
+    }
+    let generator, match;
+    for (let i = 0; i < 3; i++) {
+      generator = dataNode[$getRealChildrenByNameIt](name, false, true);
+      while (true) {
+        match = generator.next().value;
+        if (!match) {
+          break;
+        }
+        if (isValue === match[$isDataValue]()) {
+          return match;
+        }
+      }
+      if (dataNode[$namespaceId] === NamespaceIds.datasets.id && dataNode[$nodeName] === "data") {
+        break;
+      }
+      dataNode = dataNode[$getParent]();
+    }
+    if (!global) {
+      return null;
+    }
+    generator = this.data[$getRealChildrenByNameIt](name, true, false);
+    match = generator.next().value;
+    if (match) {
+      return match;
+    }
+    generator = this.data[$getAttributeIt](name, true);
+    match = generator.next().value;
+    if (match?.[$isDataValue]()) {
+      return match;
+    }
+    return null;
+  }
+  _setProperties(formNode, dataNode) {
+    if (!Object.hasOwn(formNode, "setProperty")) {
+      return;
+    }
+    for (const {
+      ref,
+      target,
+      connection
+    } of formNode.setProperty.children) {
+      if (connection) {
+        continue;
+      }
+      if (!ref) {
+        continue;
+      }
+      const nodes = searchNode(this.root, dataNode, ref, false, false);
+      if (!nodes) {
+        warn(`XFA - Invalid reference: ${ref}.`);
+        continue;
+      }
+      const [node] = nodes;
+      if (!node[$isDescendent](this.data)) {
+        warn(`XFA - Invalid node: must be a data node.`);
+        continue;
+      }
+      const targetNodes = searchNode(this.root, formNode, target, false, false);
+      if (!targetNodes) {
+        warn(`XFA - Invalid target: ${target}.`);
+        continue;
+      }
+      const [targetNode] = targetNodes;
+      if (!targetNode[$isDescendent](formNode)) {
+        warn(`XFA - Invalid target: must be a property or subproperty.`);
+        continue;
+      }
+      const targetParent = targetNode[$getParent]();
+      if (targetNode instanceof SetProperty || targetParent instanceof SetProperty) {
+        warn(`XFA - Invalid target: cannot be a setProperty or one of its properties.`);
+        continue;
+      }
+      if (targetNode instanceof BindItems || targetParent instanceof BindItems) {
+        warn(`XFA - Invalid target: cannot be a bindItems or one of its properties.`);
+        continue;
+      }
+      const content = node[$text]();
+      const name = targetNode[$nodeName];
+      if (targetNode instanceof XFAAttribute) {
+        const attrs = Object.create(null);
+        attrs[name] = content;
+        const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]);
+        targetParent[name] = obj[name];
+        continue;
+      }
+      if (!Object.hasOwn(targetNode, $content)) {
+        warn(`XFA - Invalid node to use in setProperty`);
+        continue;
+      }
+      targetNode[$data] = node;
+      targetNode[$content] = content;
+      targetNode[$finalize]();
+    }
+  }
+  _bindItems(formNode, dataNode) {
+    if (!Object.hasOwn(formNode, "items") || !Object.hasOwn(formNode, "bindItems") || formNode.bindItems.isEmpty()) {
+      return;
+    }
+    for (const item of formNode.items.children) {
+      formNode[$removeChild](item);
+    }
+    formNode.items.clear();
+    const labels = new Items({});
+    const values = new Items({});
+    formNode[$appendChild](labels);
+    formNode.items.push(labels);
+    formNode[$appendChild](values);
+    formNode.items.push(values);
+    for (const {
+      ref,
+      labelRef,
+      valueRef,
+      connection
+    } of formNode.bindItems.children) {
+      if (connection) {
+        continue;
+      }
+      if (!ref) {
+        continue;
+      }
+      const nodes = searchNode(this.root, dataNode, ref, false, false);
+      if (!nodes) {
+        warn(`XFA - Invalid reference: ${ref}.`);
+        continue;
+      }
+      for (const node of nodes) {
+        if (!node[$isDescendent](this.datasets)) {
+          warn(`XFA - Invalid ref (${ref}): must be a datasets child.`);
+          continue;
+        }
+        const labelNodes = searchNode(this.root, node, labelRef, true, false);
+        if (!labelNodes) {
+          warn(`XFA - Invalid label: ${labelRef}.`);
+          continue;
+        }
+        const [labelNode] = labelNodes;
+        if (!labelNode[$isDescendent](this.datasets)) {
+          warn(`XFA - Invalid label: must be a datasets child.`);
+          continue;
+        }
+        const valueNodes = searchNode(this.root, node, valueRef, true, false);
+        if (!valueNodes) {
+          warn(`XFA - Invalid value: ${valueRef}.`);
+          continue;
+        }
+        const [valueNode] = valueNodes;
+        if (!valueNode[$isDescendent](this.datasets)) {
+          warn(`XFA - Invalid value: must be a datasets child.`);
+          continue;
+        }
+        const label = createText(labelNode[$text]());
+        const value = createText(valueNode[$text]());
+        labels[$appendChild](label);
+        labels.text.push(label);
+        values[$appendChild](value);
+        values.text.push(value);
+      }
+    }
+  }
+  _bindOccurrences(formNode, matches, picture) {
+    let baseClone;
+    if (matches.length > 1) {
+      baseClone = formNode[$clone]();
+      baseClone[$removeChild](baseClone.occur);
+      baseClone.occur = null;
+    }
+    this._bindValue(formNode, matches[0], picture);
+    this._setProperties(formNode, matches[0]);
+    this._bindItems(formNode, matches[0]);
+    if (matches.length === 1) {
+      return;
+    }
+    const parent = formNode[$getParent]();
+    const name = formNode[$nodeName];
+    const pos = parent[$indexOf](formNode);
+    for (let i = 1, ii = matches.length; i < ii; i++) {
+      const match = matches[i];
+      const clone = baseClone[$clone]();
+      parent[name].push(clone);
+      parent[$insertAt](pos + i, clone);
+      this._bindValue(clone, match, picture);
+      this._setProperties(clone, match);
+      this._bindItems(clone, match);
+    }
+  }
+  _createOccurrences(formNode) {
+    if (!this.emptyMerge) {
+      return;
+    }
+    const {
+      occur
+    } = formNode;
+    if (!occur || occur.initial <= 1) {
+      return;
+    }
+    const parent = formNode[$getParent]();
+    const name = formNode[$nodeName];
+    if (!(parent[name] instanceof XFAObjectArray)) {
+      return;
+    }
+    let currentNumber;
+    if (formNode.name) {
+      currentNumber = parent[name].children.filter(e => e.name === formNode.name).length;
+    } else {
+      currentNumber = parent[name].children.length;
+    }
+    const pos = parent[$indexOf](formNode) + 1;
+    const ii = occur.initial - currentNumber;
+    if (ii) {
+      const nodeClone = formNode[$clone]();
+      nodeClone[$removeChild](nodeClone.occur);
+      nodeClone.occur = null;
+      parent[name].push(nodeClone);
+      parent[$insertAt](pos, nodeClone);
+      for (let i = 1; i < ii; i++) {
+        const clone = nodeClone[$clone]();
+        parent[name].push(clone);
+        parent[$insertAt](pos + i, clone);
+      }
+    }
+  }
+  _getOccurInfo(formNode) {
+    const {
+      name,
+      occur
+    } = formNode;
+    if (!occur || !name) {
+      return [1, 1];
+    }
+    const max = occur.max === -1 ? Infinity : occur.max;
+    return [occur.min, max];
+  }
+  _setAndBind(formNode, dataNode) {
+    this._setProperties(formNode, dataNode);
+    this._bindItems(formNode, dataNode);
+    this._bindElement(formNode, dataNode);
+  }
+  _bindElement(formNode, dataNode) {
+    const uselessNodes = [];
+    this._createOccurrences(formNode);
+    for (const child of formNode[$getChildren]()) {
+      if (child[$data]) {
+        continue;
+      }
+      if (this._mergeMode === undefined && child[$nodeName] === "subform") {
+        this._mergeMode = child.mergeMode === "consumeData";
+        const dataChildren = dataNode[$getChildren]();
+        if (dataChildren.length > 0) {
+          this._bindOccurrences(child, [dataChildren[0]], null);
+        } else if (this.emptyMerge) {
+          const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId];
+          const dataChild = child[$data] = new XmlObject(nsId, child.name || "root");
+          dataNode[$appendChild](dataChild);
+          this._bindElement(child, dataChild);
+        }
+        continue;
+      }
+      if (!child[$isBindable]()) {
+        continue;
+      }
+      let global = false;
+      let picture = null;
+      let ref = null;
+      let match = null;
+      if (child.bind) {
+        switch (child.bind.match) {
+          case "none":
+            this._setAndBind(child, dataNode);
+            continue;
+          case "global":
+            global = true;
+            break;
+          case "dataRef":
+            if (!child.bind.ref) {
+              warn(`XFA - ref is empty in node ${child[$nodeName]}.`);
+              this._setAndBind(child, dataNode);
+              continue;
+            }
+            ref = child.bind.ref;
+            break;
+          default:
+            break;
+        }
+        if (child.bind.picture) {
+          picture = child.bind.picture[$content];
+        }
+      }
+      const [min, max] = this._getOccurInfo(child);
+      if (ref) {
+        match = searchNode(this.root, dataNode, ref, true, false);
+        if (match === null) {
+          match = createDataNode(this.data, dataNode, ref);
+          if (!match) {
+            continue;
+          }
+          if (this._isConsumeData()) {
+            match[$consumed] = true;
+          }
+          this._setAndBind(child, match);
+          continue;
+        } else {
+          if (this._isConsumeData()) {
+            match = match.filter(node => !node[$consumed]);
+          }
+          if (match.length > max) {
+            match = match.slice(0, max);
+          } else if (match.length === 0) {
+            match = null;
+          }
+          if (match && this._isConsumeData()) {
+            match.forEach(node => {
+              node[$consumed] = true;
+            });
+          }
+        }
+      } else {
+        if (!child.name) {
+          this._setAndBind(child, dataNode);
+          continue;
+        }
+        if (this._isConsumeData()) {
+          const matches = [];
+          while (matches.length < max) {
+            const found = this._findDataByNameToConsume(child.name, child[$hasSettableValue](), dataNode, global);
+            if (!found) {
+              break;
+            }
+            found[$consumed] = true;
+            matches.push(found);
+          }
+          match = matches.length > 0 ? matches : null;
+        } else {
+          match = dataNode[$getRealChildrenByNameIt](child.name, false, this.emptyMerge).next().value;
+          if (!match) {
+            if (min === 0) {
+              uselessNodes.push(child);
+              continue;
+            }
+            const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId];
+            match = child[$data] = new XmlObject(nsId, child.name);
+            if (this.emptyMerge) {
+              match[$consumed] = true;
+            }
+            dataNode[$appendChild](match);
+            this._setAndBind(child, match);
+            continue;
+          }
+          if (this.emptyMerge) {
+            match[$consumed] = true;
+          }
+          match = [match];
+        }
+      }
+      if (match) {
+        this._bindOccurrences(child, match, picture);
+      } else if (min > 0) {
+        this._setAndBind(child, dataNode);
+      } else {
+        uselessNodes.push(child);
+      }
+    }
+    uselessNodes.forEach(node => node[$getParent]()[$removeChild](node));
+  }
+}
+
+;// ./src/core/xfa/data.js
+
+class DataHandler {
+  constructor(root, data) {
+    this.data = data;
+    this.dataset = root.datasets || null;
+  }
+  serialize(storage) {
+    const stack = [[-1, this.data[$getChildren]()]];
+    while (stack.length > 0) {
+      const last = stack.at(-1);
+      const [i, children] = last;
+      if (i + 1 === children.length) {
+        stack.pop();
+        continue;
+      }
+      const child = children[++last[0]];
+      const storageEntry = storage.get(child[$uid]);
+      if (storageEntry) {
+        child[$setValue](storageEntry);
+      } else {
+        const attributes = child[$getAttributes]();
+        for (const value of attributes.values()) {
+          const entry = storage.get(value[$uid]);
+          if (entry) {
+            value[$setValue](entry);
+            break;
+          }
+        }
+      }
+      const nodes = child[$getChildren]();
+      if (nodes.length > 0) {
+        stack.push([-1, nodes]);
+      }
+    }
+    const buf = [`<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">`];
+    if (this.dataset) {
+      for (const child of this.dataset[$getChildren]()) {
+        if (child[$nodeName] !== "data") {
+          child[$toString](buf);
+        }
+      }
+    }
+    this.data[$toString](buf);
+    buf.push("</xfa:datasets>");
+    return buf.join("");
+  }
+}
+
+;// ./src/core/xfa/config.js
+
+
+
+
+
+const CONFIG_NS_ID = NamespaceIds.config.id;
+class Acrobat extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "acrobat", true);
+    this.acrobat7 = null;
+    this.autoSave = null;
+    this.common = null;
+    this.validate = null;
+    this.validateApprovalSignatures = null;
+    this.submitUrl = new XFAObjectArray();
+  }
+}
+class Acrobat7 extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "acrobat7", true);
+    this.dynamicRender = null;
+  }
+}
+class ADBE_JSConsole extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]);
+  }
+}
+class ADBE_JSDebugger extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]);
+  }
+}
+class AddSilentPrint extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "addSilentPrint");
+  }
+}
+class AddViewerPreferences extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "addViewerPreferences");
+  }
+}
+class AdjustData extends Option10 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "adjustData");
+  }
+}
+class AdobeExtensionLevel extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8);
+  }
+}
+class Agent extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "agent", true);
+    this.name = attributes.name ? attributes.name.trim() : "";
+    this.common = new XFAObjectArray();
+  }
+}
+class AlwaysEmbed extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "alwaysEmbed");
+  }
+}
+class Amd extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "amd");
+  }
+}
+class config_Area extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "area");
+    this.level = getInteger({
+      data: attributes.level,
+      defaultValue: 0,
+      validate: n => n >= 1 && n <= 3
+    });
+    this.name = getStringOption(attributes.name, ["", "barcode", "coreinit", "deviceDriver", "font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]);
+  }
+}
+class Attributes extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]);
+  }
+}
+class AutoSave extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]);
+  }
+}
+class Base extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "base");
+  }
+}
+class BatchOutput extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "batchOutput");
+    this.format = getStringOption(attributes.format, ["none", "concat", "zip", "zipCompress"]);
+  }
+}
+class BehaviorOverride extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "behaviorOverride");
+  }
+  [$finalize]() {
+    this[$content] = new Map(this[$content].trim().split(/\s+/).filter(x => x.includes(":")).map(x => x.split(":", 2)));
+  }
+}
+class Cache extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "cache", true);
+    this.templateCache = null;
+  }
+}
+class Change extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "change");
+  }
+}
+class Common extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "common", true);
+    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(attributes) {
+    super(CONFIG_NS_ID, "compress");
+    this.scope = getStringOption(attributes.scope, ["imageOnly", "document"]);
+  }
+}
+class CompressLogicalStructure extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "compressLogicalStructure");
+  }
+}
+class CompressObjectStream extends Option10 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "compressObjectStream");
+  }
+}
+class Compression extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "compression", true);
+    this.compressLogicalStructure = null;
+    this.compressObjectStream = null;
+    this.level = null;
+    this.type = null;
+  }
+}
+class Config extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "config", true);
+    this.acrobat = null;
+    this.present = null;
+    this.trace = null;
+    this.agent = new XFAObjectArray();
+  }
+}
+class Conformance extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "conformance", ["A", "B"]);
+  }
+}
+class ContentCopy extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "contentCopy");
+  }
+}
+class Copies extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "copies", 1, n => n >= 1);
+  }
+}
+class Creator extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "creator");
+  }
+}
+class CurrentPage extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0);
+  }
+}
+class Data extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "data", true);
+    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(attributes) {
+    super(CONFIG_NS_ID, "debug", true);
+    this.uri = null;
+  }
+}
+class DefaultTypeface extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "defaultTypeface");
+    this.writingScript = getStringOption(attributes.writingScript, ["*", "Arabic", "Cyrillic", "EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", "TraditionalChinese", "Vietnamese"]);
+  }
+}
+class Destination extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]);
+  }
+}
+class DocumentAssembly extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "documentAssembly");
+  }
+}
+class Driver extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "driver", true);
+    this.name = attributes.name ? attributes.name.trim() : "";
+    this.fontInfo = null;
+    this.xdc = null;
+  }
+}
+class DuplexOption extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]);
+  }
+}
+class DynamicRender extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]);
+  }
+}
+class Embed extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "embed");
+  }
+}
+class config_Encrypt extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "encrypt");
+  }
+}
+class config_Encryption extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "encryption", true);
+    this.encrypt = null;
+    this.encryptionLevel = null;
+    this.permissions = null;
+  }
+}
+class EncryptionLevel extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]);
+  }
+}
+class Enforce extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "enforce");
+  }
+}
+class Equate extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "equate");
+    this.force = getInteger({
+      data: attributes.force,
+      defaultValue: 1,
+      validate: n => n === 0
+    });
+    this.from = attributes.from || "";
+    this.to = attributes.to || "";
+  }
+}
+class EquateRange extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "equateRange");
+    this.from = attributes.from || "";
+    this.to = attributes.to || "";
+    this._unicodeRange = attributes.unicodeRange || "";
+  }
+  get unicodeRange() {
+    const ranges = [];
+    const unicodeRegex = /U\+([0-9a-fA-F]+)/;
+    const unicodeRange = this._unicodeRange;
+    for (let range of unicodeRange.split(",").map(x => x.trim()).filter(x => !!x)) {
+      range = range.split("-", 2).map(x => {
+        const found = x.match(unicodeRegex);
+        if (!found) {
+          return 0;
+        }
+        return parseInt(found[1], 16);
+      });
+      if (range.length === 1) {
+        range.push(range[0]);
+      }
+      ranges.push(range);
+    }
+    return shadow(this, "unicodeRange", ranges);
+  }
+}
+class Exclude extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "exclude");
+  }
+  [$finalize]() {
+    this[$content] = this[$content].trim().split(/\s+/).filter(x => x && ["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x));
+  }
+}
+class ExcludeNS extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "excludeNS");
+  }
+}
+class FlipLabel extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]);
+  }
+}
+class config_FontInfo extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "fontInfo", true);
+    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(attributes) {
+    super(CONFIG_NS_ID, "formFieldFilling");
+  }
+}
+class GroupParent extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "groupParent");
+  }
+}
+class IfEmpty extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]);
+  }
+}
+class IncludeXDPContent extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "includeXDPContent");
+  }
+}
+class IncrementalLoad extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]);
+  }
+}
+class IncrementalMerge extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "incrementalMerge");
+  }
+}
+class Interactive extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "interactive");
+  }
+}
+class Jog extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]);
+  }
+}
+class LabelPrinter extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "labelPrinter", true);
+    this.name = getStringOption(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]);
+    this.batchOutput = null;
+    this.flipLabel = null;
+    this.fontInfo = null;
+    this.xdc = null;
+  }
+}
+class Layout extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "layout", ["paginate", "panel"]);
+  }
+}
+class Level extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "level", 0, n => n > 0);
+  }
+}
+class Linearized extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "linearized");
+  }
+}
+class Locale extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "locale");
+  }
+}
+class LocaleSet extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "localeSet");
+  }
+}
+class Log extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "log", true);
+    this.mode = null;
+    this.threshold = null;
+    this.to = null;
+    this.uri = null;
+  }
+}
+class MapElement extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "map", true);
+    this.equate = new XFAObjectArray();
+    this.equateRange = new XFAObjectArray();
+  }
+}
+class MediumInfo extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "mediumInfo", true);
+    this.map = null;
+  }
+}
+class config_Message extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "message", true);
+    this.msgId = null;
+    this.severity = null;
+  }
+}
+class Messaging extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "messaging", true);
+    this.message = new XFAObjectArray();
+  }
+}
+class Mode extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "mode", ["append", "overwrite"]);
+  }
+}
+class ModifyAnnots extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "modifyAnnots");
+  }
+}
+class MsgId extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "msgId", 1, n => n >= 1);
+  }
+}
+class NameAttr extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "nameAttr");
+  }
+}
+class NeverEmbed extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "neverEmbed");
+  }
+}
+class NumberOfCopies extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5);
+  }
+}
+class OpenAction extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "openAction", true);
+    this.destination = null;
+  }
+}
+class Output extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "output", true);
+    this.to = null;
+    this.type = null;
+    this.uri = null;
+  }
+}
+class OutputBin extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "outputBin");
+  }
+}
+class OutputXSL extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "outputXSL", true);
+    this.uri = null;
+  }
+}
+class Overprint extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]);
+  }
+}
+class Packets extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "packets");
+  }
+  [$finalize]() {
+    if (this[$content] === "*") {
+      return;
+    }
+    this[$content] = this[$content].trim().split(/\s+/).filter(x => ["config", "datasets", "template", "xfdf", "xslt"].includes(x));
+  }
+}
+class PageOffset extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pageOffset");
+    this.x = getInteger({
+      data: attributes.x,
+      defaultValue: "useXDCSetting",
+      validate: n => true
+    });
+    this.y = getInteger({
+      data: attributes.y,
+      defaultValue: "useXDCSetting",
+      validate: n => true
+    });
+  }
+}
+class PageRange extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pageRange");
+  }
+  [$finalize]() {
+    const numbers = this[$content].trim().split(/\s+/).map(x => parseInt(x, 10));
+    const ranges = [];
+    for (let i = 0, ii = numbers.length; i < ii; i += 2) {
+      ranges.push(numbers.slice(i, i + 2));
+    }
+    this[$content] = ranges;
+  }
+}
+class Pagination extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]);
+  }
+}
+class PaginationOverride extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", "forceDuplexShortEdge", "forceSimplex"]);
+  }
+}
+class Part extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "part", 1, n => false);
+  }
+}
+class Pcl extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "pcl", true);
+    this.name = attributes.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(attributes) {
+    super(CONFIG_NS_ID, "pdf", true);
+    this.name = attributes.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(attributes) {
+    super(CONFIG_NS_ID, "pdfa", true);
+    this.amd = null;
+    this.conformance = null;
+    this.includeXDPContent = null;
+    this.part = null;
+  }
+}
+class Permissions extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "permissions", true);
+    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(attributes) {
+    super(CONFIG_NS_ID, "pickTrayByPDFSize");
+  }
+}
+class config_Picture extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "picture");
+  }
+}
+class PlaintextMetadata extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "plaintextMetadata");
+  }
+}
+class Presence extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]);
+  }
+}
+class Present extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "present", true);
+    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(attributes) {
+    super(CONFIG_NS_ID, "print");
+  }
+}
+class PrintHighQuality extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "printHighQuality");
+  }
+}
+class PrintScaling extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]);
+  }
+}
+class PrinterName extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "printerName");
+  }
+}
+class Producer extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "producer");
+  }
+}
+class Ps extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "ps", true);
+    this.name = attributes.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(attributes) {
+    super(CONFIG_NS_ID, "range");
+  }
+  [$finalize]() {
+    this[$content] = this[$content].split(",", 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => {
+      if (range.length === 1) {
+        range.push(range[0]);
+      }
+      return range;
+    });
+  }
+}
+class Record extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "record");
+  }
+  [$finalize]() {
+    this[$content] = this[$content].trim();
+    const n = parseInt(this[$content], 10);
+    if (!isNaN(n) && n >= 0) {
+      this[$content] = n;
+    }
+  }
+}
+class Relevant extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "relevant");
+  }
+  [$finalize]() {
+    this[$content] = this[$content].trim().split(/\s+/);
+  }
+}
+class Rename extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "rename");
+  }
+  [$finalize]() {
+    this[$content] = this[$content].trim();
+    if (this[$content].toLowerCase().startsWith("xml") || /[\p{L}_][\p{L}\d._\p{M}-]*/u.test(this[$content])) {
+      warn("XFA - Rename: invalid XFA name");
+    }
+  }
+}
+class RenderPolicy extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]);
+  }
+}
+class RunScripts extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]);
+  }
+}
+class config_Script extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "script", true);
+    this.currentPage = null;
+    this.exclude = null;
+    this.runScripts = null;
+  }
+}
+class ScriptModel extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]);
+  }
+}
+class Severity extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]);
+  }
+}
+class SilentPrint extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "silentPrint", true);
+    this.addSilentPrint = null;
+    this.printerName = null;
+  }
+}
+class Staple extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "staple");
+    this.mode = getStringOption(attributes.mode, ["usePrinterSetting", "on", "off"]);
+  }
+}
+class StartNode extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "startNode");
+  }
+}
+class StartPage extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "startPage", 0, n => true);
+  }
+}
+class SubmitFormat extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]);
+  }
+}
+class SubmitUrl extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "submitUrl");
+  }
+}
+class SubsetBelow extends IntegerObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100);
+  }
+}
+class SuppressBanner extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "suppressBanner");
+  }
+}
+class Tagged extends Option01 {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "tagged");
+  }
+}
+class config_Template extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "template", true);
+    this.base = null;
+    this.relevant = null;
+    this.startPage = null;
+    this.uri = null;
+    this.xsl = null;
+  }
+}
+class Threshold extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]);
+  }
+}
+class To extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]);
+  }
+}
+class TemplateCache extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "templateCache");
+    this.maxEntries = getInteger({
+      data: attributes.maxEntries,
+      defaultValue: 5,
+      validate: n => n >= 0
+    });
+  }
+}
+class Trace extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "trace", true);
+    this.area = new XFAObjectArray();
+  }
+}
+class Transform extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "transform", true);
+    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(attributes) {
+    super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", "native", "xdp", "mergedXDP"]);
+  }
+}
+class Uri extends StringObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "uri");
+  }
+}
+class config_Validate extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]);
+  }
+}
+class ValidateApprovalSignatures extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "validateApprovalSignatures");
+  }
+  [$finalize]() {
+    this[$content] = this[$content].trim().split(/\s+/).filter(x => ["docReady", "postSign"].includes(x));
+  }
+}
+class ValidationMessaging extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", "noMessages"]);
+  }
+}
+class Version extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]);
+  }
+}
+class VersionControl extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "VersionControl");
+    this.outputBelow = getStringOption(attributes.outputBelow, ["warn", "error", "update"]);
+    this.sourceAbove = getStringOption(attributes.sourceAbove, ["warn", "error"]);
+    this.sourceBelow = getStringOption(attributes.sourceBelow, ["update", "maintain"]);
+  }
+}
+class ViewerPreferences extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "viewerPreferences", true);
+    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(attributes) {
+    super(CONFIG_NS_ID, "webClient", true);
+    this.name = attributes.name ? attributes.name.trim() : "";
+    this.fontInfo = null;
+    this.xdc = null;
+  }
+}
+class Whitespace extends OptionObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]);
+  }
+}
+class Window extends ContentObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "window");
+  }
+  [$finalize]() {
+    const pair = this[$content].split(",", 2).map(x => parseInt(x.trim(), 10));
+    if (pair.some(x => isNaN(x))) {
+      this[$content] = [0, 0];
+      return;
+    }
+    if (pair.length === 1) {
+      pair.push(pair[0]);
+    }
+    this[$content] = pair;
+  }
+}
+class Xdc extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "xdc", true);
+    this.uri = new XFAObjectArray();
+    this.xsl = new XFAObjectArray();
+  }
+}
+class Xdp extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "xdp", true);
+    this.packets = null;
+  }
+}
+class Xsl extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "xsl", true);
+    this.debug = null;
+    this.uri = null;
+  }
+}
+class Zpl extends XFAObject {
+  constructor(attributes) {
+    super(CONFIG_NS_ID, "zpl", true);
+    this.name = attributes.name ? attributes.name.trim() : "";
+    this.batchOutput = null;
+    this.flipLabel = null;
+    this.fontInfo = null;
+    this.xdc = null;
+  }
+}
+class ConfigNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(ConfigNamespace, name)) {
+      return ConfigNamespace[name](attributes);
+    }
+    return undefined;
+  }
+  static acrobat(attrs) {
+    return new Acrobat(attrs);
+  }
+  static acrobat7(attrs) {
+    return new Acrobat7(attrs);
+  }
+  static ADBE_JSConsole(attrs) {
+    return new ADBE_JSConsole(attrs);
+  }
+  static ADBE_JSDebugger(attrs) {
+    return new ADBE_JSDebugger(attrs);
+  }
+  static addSilentPrint(attrs) {
+    return new AddSilentPrint(attrs);
+  }
+  static addViewerPreferences(attrs) {
+    return new AddViewerPreferences(attrs);
+  }
+  static adjustData(attrs) {
+    return new AdjustData(attrs);
+  }
+  static adobeExtensionLevel(attrs) {
+    return new AdobeExtensionLevel(attrs);
+  }
+  static agent(attrs) {
+    return new Agent(attrs);
+  }
+  static alwaysEmbed(attrs) {
+    return new AlwaysEmbed(attrs);
+  }
+  static amd(attrs) {
+    return new Amd(attrs);
+  }
+  static area(attrs) {
+    return new config_Area(attrs);
+  }
+  static attributes(attrs) {
+    return new Attributes(attrs);
+  }
+  static autoSave(attrs) {
+    return new AutoSave(attrs);
+  }
+  static base(attrs) {
+    return new Base(attrs);
+  }
+  static batchOutput(attrs) {
+    return new BatchOutput(attrs);
+  }
+  static behaviorOverride(attrs) {
+    return new BehaviorOverride(attrs);
+  }
+  static cache(attrs) {
+    return new Cache(attrs);
+  }
+  static change(attrs) {
+    return new Change(attrs);
+  }
+  static common(attrs) {
+    return new Common(attrs);
+  }
+  static compress(attrs) {
+    return new Compress(attrs);
+  }
+  static compressLogicalStructure(attrs) {
+    return new CompressLogicalStructure(attrs);
+  }
+  static compressObjectStream(attrs) {
+    return new CompressObjectStream(attrs);
+  }
+  static compression(attrs) {
+    return new Compression(attrs);
+  }
+  static config(attrs) {
+    return new Config(attrs);
+  }
+  static conformance(attrs) {
+    return new Conformance(attrs);
+  }
+  static contentCopy(attrs) {
+    return new ContentCopy(attrs);
+  }
+  static copies(attrs) {
+    return new Copies(attrs);
+  }
+  static creator(attrs) {
+    return new Creator(attrs);
+  }
+  static currentPage(attrs) {
+    return new CurrentPage(attrs);
+  }
+  static data(attrs) {
+    return new Data(attrs);
+  }
+  static debug(attrs) {
+    return new Debug(attrs);
+  }
+  static defaultTypeface(attrs) {
+    return new DefaultTypeface(attrs);
+  }
+  static destination(attrs) {
+    return new Destination(attrs);
+  }
+  static documentAssembly(attrs) {
+    return new DocumentAssembly(attrs);
+  }
+  static driver(attrs) {
+    return new Driver(attrs);
+  }
+  static duplexOption(attrs) {
+    return new DuplexOption(attrs);
+  }
+  static dynamicRender(attrs) {
+    return new DynamicRender(attrs);
+  }
+  static embed(attrs) {
+    return new Embed(attrs);
+  }
+  static encrypt(attrs) {
+    return new config_Encrypt(attrs);
+  }
+  static encryption(attrs) {
+    return new config_Encryption(attrs);
+  }
+  static encryptionLevel(attrs) {
+    return new EncryptionLevel(attrs);
+  }
+  static enforce(attrs) {
+    return new Enforce(attrs);
+  }
+  static equate(attrs) {
+    return new Equate(attrs);
+  }
+  static equateRange(attrs) {
+    return new EquateRange(attrs);
+  }
+  static exclude(attrs) {
+    return new Exclude(attrs);
+  }
+  static excludeNS(attrs) {
+    return new ExcludeNS(attrs);
+  }
+  static flipLabel(attrs) {
+    return new FlipLabel(attrs);
+  }
+  static fontInfo(attrs) {
+    return new config_FontInfo(attrs);
+  }
+  static formFieldFilling(attrs) {
+    return new FormFieldFilling(attrs);
+  }
+  static groupParent(attrs) {
+    return new GroupParent(attrs);
+  }
+  static ifEmpty(attrs) {
+    return new IfEmpty(attrs);
+  }
+  static includeXDPContent(attrs) {
+    return new IncludeXDPContent(attrs);
+  }
+  static incrementalLoad(attrs) {
+    return new IncrementalLoad(attrs);
+  }
+  static incrementalMerge(attrs) {
+    return new IncrementalMerge(attrs);
+  }
+  static interactive(attrs) {
+    return new Interactive(attrs);
+  }
+  static jog(attrs) {
+    return new Jog(attrs);
+  }
+  static labelPrinter(attrs) {
+    return new LabelPrinter(attrs);
+  }
+  static layout(attrs) {
+    return new Layout(attrs);
+  }
+  static level(attrs) {
+    return new Level(attrs);
+  }
+  static linearized(attrs) {
+    return new Linearized(attrs);
+  }
+  static locale(attrs) {
+    return new Locale(attrs);
+  }
+  static localeSet(attrs) {
+    return new LocaleSet(attrs);
+  }
+  static log(attrs) {
+    return new Log(attrs);
+  }
+  static map(attrs) {
+    return new MapElement(attrs);
+  }
+  static mediumInfo(attrs) {
+    return new MediumInfo(attrs);
+  }
+  static message(attrs) {
+    return new config_Message(attrs);
+  }
+  static messaging(attrs) {
+    return new Messaging(attrs);
+  }
+  static mode(attrs) {
+    return new Mode(attrs);
+  }
+  static modifyAnnots(attrs) {
+    return new ModifyAnnots(attrs);
+  }
+  static msgId(attrs) {
+    return new MsgId(attrs);
+  }
+  static nameAttr(attrs) {
+    return new NameAttr(attrs);
+  }
+  static neverEmbed(attrs) {
+    return new NeverEmbed(attrs);
+  }
+  static numberOfCopies(attrs) {
+    return new NumberOfCopies(attrs);
+  }
+  static openAction(attrs) {
+    return new OpenAction(attrs);
+  }
+  static output(attrs) {
+    return new Output(attrs);
+  }
+  static outputBin(attrs) {
+    return new OutputBin(attrs);
+  }
+  static outputXSL(attrs) {
+    return new OutputXSL(attrs);
+  }
+  static overprint(attrs) {
+    return new Overprint(attrs);
+  }
+  static packets(attrs) {
+    return new Packets(attrs);
+  }
+  static pageOffset(attrs) {
+    return new PageOffset(attrs);
+  }
+  static pageRange(attrs) {
+    return new PageRange(attrs);
+  }
+  static pagination(attrs) {
+    return new Pagination(attrs);
+  }
+  static paginationOverride(attrs) {
+    return new PaginationOverride(attrs);
+  }
+  static part(attrs) {
+    return new Part(attrs);
+  }
+  static pcl(attrs) {
+    return new Pcl(attrs);
+  }
+  static pdf(attrs) {
+    return new Pdf(attrs);
+  }
+  static pdfa(attrs) {
+    return new Pdfa(attrs);
+  }
+  static permissions(attrs) {
+    return new Permissions(attrs);
+  }
+  static pickTrayByPDFSize(attrs) {
+    return new PickTrayByPDFSize(attrs);
+  }
+  static picture(attrs) {
+    return new config_Picture(attrs);
+  }
+  static plaintextMetadata(attrs) {
+    return new PlaintextMetadata(attrs);
+  }
+  static presence(attrs) {
+    return new Presence(attrs);
+  }
+  static present(attrs) {
+    return new Present(attrs);
+  }
+  static print(attrs) {
+    return new Print(attrs);
+  }
+  static printHighQuality(attrs) {
+    return new PrintHighQuality(attrs);
+  }
+  static printScaling(attrs) {
+    return new PrintScaling(attrs);
+  }
+  static printerName(attrs) {
+    return new PrinterName(attrs);
+  }
+  static producer(attrs) {
+    return new Producer(attrs);
+  }
+  static ps(attrs) {
+    return new Ps(attrs);
+  }
+  static range(attrs) {
+    return new Range(attrs);
+  }
+  static record(attrs) {
+    return new Record(attrs);
+  }
+  static relevant(attrs) {
+    return new Relevant(attrs);
+  }
+  static rename(attrs) {
+    return new Rename(attrs);
+  }
+  static renderPolicy(attrs) {
+    return new RenderPolicy(attrs);
+  }
+  static runScripts(attrs) {
+    return new RunScripts(attrs);
+  }
+  static script(attrs) {
+    return new config_Script(attrs);
+  }
+  static scriptModel(attrs) {
+    return new ScriptModel(attrs);
+  }
+  static severity(attrs) {
+    return new Severity(attrs);
+  }
+  static silentPrint(attrs) {
+    return new SilentPrint(attrs);
+  }
+  static staple(attrs) {
+    return new Staple(attrs);
+  }
+  static startNode(attrs) {
+    return new StartNode(attrs);
+  }
+  static startPage(attrs) {
+    return new StartPage(attrs);
+  }
+  static submitFormat(attrs) {
+    return new SubmitFormat(attrs);
+  }
+  static submitUrl(attrs) {
+    return new SubmitUrl(attrs);
+  }
+  static subsetBelow(attrs) {
+    return new SubsetBelow(attrs);
+  }
+  static suppressBanner(attrs) {
+    return new SuppressBanner(attrs);
+  }
+  static tagged(attrs) {
+    return new Tagged(attrs);
+  }
+  static template(attrs) {
+    return new config_Template(attrs);
+  }
+  static templateCache(attrs) {
+    return new TemplateCache(attrs);
+  }
+  static threshold(attrs) {
+    return new Threshold(attrs);
+  }
+  static to(attrs) {
+    return new To(attrs);
+  }
+  static trace(attrs) {
+    return new Trace(attrs);
+  }
+  static transform(attrs) {
+    return new Transform(attrs);
+  }
+  static type(attrs) {
+    return new Type(attrs);
+  }
+  static uri(attrs) {
+    return new Uri(attrs);
+  }
+  static validate(attrs) {
+    return new config_Validate(attrs);
+  }
+  static validateApprovalSignatures(attrs) {
+    return new ValidateApprovalSignatures(attrs);
+  }
+  static validationMessaging(attrs) {
+    return new ValidationMessaging(attrs);
+  }
+  static version(attrs) {
+    return new Version(attrs);
+  }
+  static versionControl(attrs) {
+    return new VersionControl(attrs);
+  }
+  static viewerPreferences(attrs) {
+    return new ViewerPreferences(attrs);
+  }
+  static webClient(attrs) {
+    return new WebClient(attrs);
+  }
+  static whitespace(attrs) {
+    return new Whitespace(attrs);
+  }
+  static window(attrs) {
+    return new Window(attrs);
+  }
+  static xdc(attrs) {
+    return new Xdc(attrs);
+  }
+  static xdp(attrs) {
+    return new Xdp(attrs);
+  }
+  static xsl(attrs) {
+    return new Xsl(attrs);
+  }
+  static zpl(attrs) {
+    return new Zpl(attrs);
+  }
+}
+
+;// ./src/core/xfa/connection_set.js
+
+
+const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id;
+class ConnectionSet extends XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "connectionSet", true);
+    this.wsdlConnection = new XFAObjectArray();
+    this.xmlConnection = new XFAObjectArray();
+    this.xsdConnection = new XFAObjectArray();
+  }
+}
+class EffectiveInputPolicy extends XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "effectiveInputPolicy");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class EffectiveOutputPolicy extends XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "effectiveOutputPolicy");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class Operation extends StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "operation");
+    this.id = attributes.id || "";
+    this.input = attributes.input || "";
+    this.name = attributes.name || "";
+    this.output = attributes.output || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class RootElement extends StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "rootElement");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class SoapAction extends StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "soapAction");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class SoapAddress extends StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "soapAddress");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class connection_set_Uri extends StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "uri");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class WsdlAddress extends StringObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "wsdlAddress");
+    this.id = attributes.id || "";
+    this.name = attributes.name || "";
+    this.use = attributes.use || "";
+    this.usehref = attributes.usehref || "";
+  }
+}
+class WsdlConnection extends XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "wsdlConnection", true);
+    this.dataDescription = attributes.dataDescription || "";
+    this.name = attributes.name || "";
+    this.effectiveInputPolicy = null;
+    this.effectiveOutputPolicy = null;
+    this.operation = null;
+    this.soapAction = null;
+    this.soapAddress = null;
+    this.wsdlAddress = null;
+  }
+}
+class XmlConnection extends XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "xmlConnection", true);
+    this.dataDescription = attributes.dataDescription || "";
+    this.name = attributes.name || "";
+    this.uri = null;
+  }
+}
+class XsdConnection extends XFAObject {
+  constructor(attributes) {
+    super(CONNECTION_SET_NS_ID, "xsdConnection", true);
+    this.dataDescription = attributes.dataDescription || "";
+    this.name = attributes.name || "";
+    this.rootElement = null;
+    this.uri = null;
+  }
+}
+class ConnectionSetNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(ConnectionSetNamespace, name)) {
+      return ConnectionSetNamespace[name](attributes);
+    }
+    return undefined;
+  }
+  static connectionSet(attrs) {
+    return new ConnectionSet(attrs);
+  }
+  static effectiveInputPolicy(attrs) {
+    return new EffectiveInputPolicy(attrs);
+  }
+  static effectiveOutputPolicy(attrs) {
+    return new EffectiveOutputPolicy(attrs);
+  }
+  static operation(attrs) {
+    return new Operation(attrs);
+  }
+  static rootElement(attrs) {
+    return new RootElement(attrs);
+  }
+  static soapAction(attrs) {
+    return new SoapAction(attrs);
+  }
+  static soapAddress(attrs) {
+    return new SoapAddress(attrs);
+  }
+  static uri(attrs) {
+    return new connection_set_Uri(attrs);
+  }
+  static wsdlAddress(attrs) {
+    return new WsdlAddress(attrs);
+  }
+  static wsdlConnection(attrs) {
+    return new WsdlConnection(attrs);
+  }
+  static xmlConnection(attrs) {
+    return new XmlConnection(attrs);
+  }
+  static xsdConnection(attrs) {
+    return new XsdConnection(attrs);
+  }
+}
+
+;// ./src/core/xfa/datasets.js
+
+
+
+const DATASETS_NS_ID = NamespaceIds.datasets.id;
+class datasets_Data extends XmlObject {
+  constructor(attributes) {
+    super(DATASETS_NS_ID, "data", attributes);
+  }
+  [$isNsAgnostic]() {
+    return true;
+  }
+}
+class Datasets extends XFAObject {
+  constructor(attributes) {
+    super(DATASETS_NS_ID, "datasets", true);
+    this.data = null;
+    this.Signature = null;
+  }
+  [$onChild](child) {
+    const name = child[$nodeName];
+    if (name === "data" && child[$namespaceId] === DATASETS_NS_ID || name === "Signature" && child[$namespaceId] === NamespaceIds.signature.id) {
+      this[name] = child;
+    }
+    this[$appendChild](child);
+  }
+}
+class DatasetsNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(DatasetsNamespace, name)) {
+      return DatasetsNamespace[name](attributes);
+    }
+    return undefined;
+  }
+  static datasets(attributes) {
+    return new Datasets(attributes);
+  }
+  static data(attributes) {
+    return new datasets_Data(attributes);
+  }
+}
+
+;// ./src/core/xfa/locale_set.js
+
+
+
+const LOCALE_SET_NS_ID = NamespaceIds.localeSet.id;
+class CalendarSymbols extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "calendarSymbols", true);
+    this.name = "gregorian";
+    this.dayNames = new XFAObjectArray(2);
+    this.eraNames = null;
+    this.meridiemNames = null;
+    this.monthNames = new XFAObjectArray(2);
+  }
+}
+class CurrencySymbol extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "currencySymbol");
+    this.name = getStringOption(attributes.name, ["symbol", "isoname", "decimal"]);
+  }
+}
+class CurrencySymbols extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "currencySymbols", true);
+    this.currencySymbol = new XFAObjectArray(3);
+  }
+}
+class DatePattern extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "datePattern");
+    this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]);
+  }
+}
+class DatePatterns extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "datePatterns", true);
+    this.datePattern = new XFAObjectArray(4);
+  }
+}
+class DateTimeSymbols extends ContentObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "dateTimeSymbols");
+  }
+}
+class Day extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "day");
+  }
+}
+class DayNames extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "dayNames", true);
+    this.abbr = getInteger({
+      data: attributes.abbr,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.day = new XFAObjectArray(7);
+  }
+}
+class Era extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "era");
+  }
+}
+class EraNames extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "eraNames", true);
+    this.era = new XFAObjectArray(2);
+  }
+}
+class locale_set_Locale extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "locale", true);
+    this.desc = attributes.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(attributes) {
+    super(LOCALE_SET_NS_ID, "localeSet", true);
+    this.locale = new XFAObjectArray();
+  }
+}
+class Meridiem extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "meridiem");
+  }
+}
+class MeridiemNames extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "meridiemNames", true);
+    this.meridiem = new XFAObjectArray(2);
+  }
+}
+class Month extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "month");
+  }
+}
+class MonthNames extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "monthNames", true);
+    this.abbr = getInteger({
+      data: attributes.abbr,
+      defaultValue: 0,
+      validate: x => x === 1
+    });
+    this.month = new XFAObjectArray(12);
+  }
+}
+class NumberPattern extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "numberPattern");
+    this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]);
+  }
+}
+class NumberPatterns extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "numberPatterns", true);
+    this.numberPattern = new XFAObjectArray(4);
+  }
+}
+class NumberSymbol extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "numberSymbol");
+    this.name = getStringOption(attributes.name, ["decimal", "grouping", "percent", "minus", "zero"]);
+  }
+}
+class NumberSymbols extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "numberSymbols", true);
+    this.numberSymbol = new XFAObjectArray(5);
+  }
+}
+class TimePattern extends StringObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "timePattern");
+    this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]);
+  }
+}
+class TimePatterns extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "timePatterns", true);
+    this.timePattern = new XFAObjectArray(4);
+  }
+}
+class TypeFace extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "typeFace", true);
+    this.name = attributes.name | "";
+  }
+}
+class TypeFaces extends XFAObject {
+  constructor(attributes) {
+    super(LOCALE_SET_NS_ID, "typeFaces", true);
+    this.typeFace = new XFAObjectArray();
+  }
+}
+class LocaleSetNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(LocaleSetNamespace, name)) {
+      return LocaleSetNamespace[name](attributes);
+    }
+    return undefined;
+  }
+  static calendarSymbols(attrs) {
+    return new CalendarSymbols(attrs);
+  }
+  static currencySymbol(attrs) {
+    return new CurrencySymbol(attrs);
+  }
+  static currencySymbols(attrs) {
+    return new CurrencySymbols(attrs);
+  }
+  static datePattern(attrs) {
+    return new DatePattern(attrs);
+  }
+  static datePatterns(attrs) {
+    return new DatePatterns(attrs);
+  }
+  static dateTimeSymbols(attrs) {
+    return new DateTimeSymbols(attrs);
+  }
+  static day(attrs) {
+    return new Day(attrs);
+  }
+  static dayNames(attrs) {
+    return new DayNames(attrs);
+  }
+  static era(attrs) {
+    return new Era(attrs);
+  }
+  static eraNames(attrs) {
+    return new EraNames(attrs);
+  }
+  static locale(attrs) {
+    return new locale_set_Locale(attrs);
+  }
+  static localeSet(attrs) {
+    return new locale_set_LocaleSet(attrs);
+  }
+  static meridiem(attrs) {
+    return new Meridiem(attrs);
+  }
+  static meridiemNames(attrs) {
+    return new MeridiemNames(attrs);
+  }
+  static month(attrs) {
+    return new Month(attrs);
+  }
+  static monthNames(attrs) {
+    return new MonthNames(attrs);
+  }
+  static numberPattern(attrs) {
+    return new NumberPattern(attrs);
+  }
+  static numberPatterns(attrs) {
+    return new NumberPatterns(attrs);
+  }
+  static numberSymbol(attrs) {
+    return new NumberSymbol(attrs);
+  }
+  static numberSymbols(attrs) {
+    return new NumberSymbols(attrs);
+  }
+  static timePattern(attrs) {
+    return new TimePattern(attrs);
+  }
+  static timePatterns(attrs) {
+    return new TimePatterns(attrs);
+  }
+  static typeFace(attrs) {
+    return new TypeFace(attrs);
+  }
+  static typeFaces(attrs) {
+    return new TypeFaces(attrs);
+  }
+}
+
+;// ./src/core/xfa/signature.js
+
+
+const SIGNATURE_NS_ID = NamespaceIds.signature.id;
+class signature_Signature extends XFAObject {
+  constructor(attributes) {
+    super(SIGNATURE_NS_ID, "signature", true);
+  }
+}
+class SignatureNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(SignatureNamespace, name)) {
+      return SignatureNamespace[name](attributes);
+    }
+    return undefined;
+  }
+  static signature(attributes) {
+    return new signature_Signature(attributes);
+  }
+}
+
+;// ./src/core/xfa/stylesheet.js
+
+
+const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id;
+class Stylesheet extends XFAObject {
+  constructor(attributes) {
+    super(STYLESHEET_NS_ID, "stylesheet", true);
+  }
+}
+class StylesheetNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(StylesheetNamespace, name)) {
+      return StylesheetNamespace[name](attributes);
+    }
+    return undefined;
+  }
+  static stylesheet(attributes) {
+    return new Stylesheet(attributes);
+  }
+}
+
+;// ./src/core/xfa/xdp.js
+
+
+
+const XDP_NS_ID = NamespaceIds.xdp.id;
+class xdp_Xdp extends XFAObject {
+  constructor(attributes) {
+    super(XDP_NS_ID, "xdp", true);
+    this.uuid = attributes.uuid || "";
+    this.timeStamp = attributes.timeStamp || "";
+    this.config = null;
+    this.connectionSet = null;
+    this.datasets = null;
+    this.localeSet = null;
+    this.stylesheet = new XFAObjectArray();
+    this.template = null;
+  }
+  [$onChildCheck](child) {
+    const ns = NamespaceIds[child[$nodeName]];
+    return ns && child[$namespaceId] === ns.id;
+  }
+}
+class XdpNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(XdpNamespace, name)) {
+      return XdpNamespace[name](attributes);
+    }
+    return undefined;
+  }
+  static xdp(attributes) {
+    return new xdp_Xdp(attributes);
+  }
+}
+
+;// ./src/core/xfa/xhtml.js
+
+
+
+
+
+const XHTML_NS_ID = NamespaceIds.xhtml.id;
+const $richText = Symbol();
+const VALID_STYLES = 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"]);
+const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], ["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], ["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, parseInt(value, 10) / 100).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, parseInt(value, 10) / 100).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => {
+  value = original.fontSize = Math.abs(getMeasurement(value));
+  return measureToString(0.99 * value);
+}], ["letter-spacing", value => measureToString(getMeasurement(value))], ["line-height", value => measureToString(getMeasurement(value))], ["margin", value => measureToString(getMeasurement(value))], ["margin-bottom", value => measureToString(getMeasurement(value))], ["margin-left", value => measureToString(getMeasurement(value))], ["margin-right", value => measureToString(getMeasurement(value))], ["margin-top", value => measureToString(getMeasurement(value))], ["text-indent", value => measureToString(getMeasurement(value))], ["font-family", value => value], ["vertical-align", value => measureToString(getMeasurement(value))]]);
+const spacesRegExp = /\s+/g;
+const crlfRegExp = /[\r\n]+/g;
+const crlfForRichTextRegExp = /\r\n?/g;
+function mapStyle(styleStr, node, richText) {
+  const style = Object.create(null);
+  if (!styleStr) {
+    return style;
+  }
+  const original = Object.create(null);
+  for (const [key, value] of styleStr.split(";").map(s => s.split(":", 2))) {
+    const mapping = StyleMapping.get(key);
+    if (mapping === "") {
+      continue;
+    }
+    let newValue = value;
+    if (mapping) {
+      newValue = typeof mapping === "string" ? mapping : mapping(value, original);
+    }
+    if (key.endsWith("scale")) {
+      style.transform = style.transform ? `${style[key]} ${newValue}` : newValue;
+    } else {
+      style[key.replaceAll(/-([a-z])/gi, (_, x) => x.toUpperCase())] = newValue;
+    }
+  }
+  if (style.fontFamily) {
+    setFontFamily({
+      typeface: style.fontFamily,
+      weight: style.fontWeight || "normal",
+      posture: style.fontStyle || "normal",
+      size: original.fontSize || 0
+    }, node, node[$globalData].fontFinder, style);
+  }
+  if (richText && style.verticalAlign && style.verticalAlign !== "0px" && style.fontSize) {
+    const SUB_SUPER_SCRIPT_FACTOR = 0.583;
+    const VERTICAL_FACTOR = 0.333;
+    const fontSize = getMeasurement(style.fontSize);
+    style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR);
+    style.verticalAlign = measureToString(Math.sign(getMeasurement(style.verticalAlign)) * fontSize * VERTICAL_FACTOR);
+  }
+  if (richText && style.fontSize) {
+    style.fontSize = `calc(${style.fontSize} * var(--total-scale-factor))`;
+  }
+  fixTextIndent(style);
+  return style;
+}
+function checkStyle(node) {
+  if (!node.style) {
+    return "";
+  }
+  return node.style.split(";").filter(s => !!s.trim()).map(s => s.split(":", 2).map(t => t.trim())).filter(([key, value]) => {
+    if (key === "font-family") {
+      node[$globalData].usedTypefaces.add(value);
+    }
+    return VALID_STYLES.has(key);
+  }).map(kv => kv.join(":")).join(";");
+}
+const NoWhites = new Set(["body", "html"]);
+class XhtmlObject extends XmlObject {
+  constructor(attributes, name) {
+    super(XHTML_NS_ID, name);
+    this[$richText] = false;
+    this.style = attributes.style || "";
+  }
+  [$clean](builder) {
+    super[$clean](builder);
+    this.style = checkStyle(this);
+  }
+  [$acceptWhitespace]() {
+    return !NoWhites.has(this[$nodeName]);
+  }
+  [$onText](str, richText = false) {
+    if (!richText) {
+      str = str.replaceAll(crlfRegExp, "");
+      if (!this.style.includes("xfa-spacerun:yes")) {
+        str = str.replaceAll(spacesRegExp, " ");
+      }
+    } else {
+      this[$richText] = true;
+    }
+    if (str) {
+      this[$content] += str;
+    }
+  }
+  [$pushGlyphs](measure, mustPop = true) {
+    const xfaFont = Object.create(null);
+    const margin = {
+      top: NaN,
+      bottom: NaN,
+      left: NaN,
+      right: NaN
+    };
+    let lineHeight = null;
+    for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) {
+      switch (key) {
+        case "font-family":
+          xfaFont.typeface = stripQuotes(value);
+          break;
+        case "font-size":
+          xfaFont.size = getMeasurement(value);
+          break;
+        case "font-weight":
+          xfaFont.weight = value;
+          break;
+        case "font-style":
+          xfaFont.posture = value;
+          break;
+        case "letter-spacing":
+          xfaFont.letterSpacing = getMeasurement(value);
+          break;
+        case "margin":
+          const values = value.split(/ \t/).map(x => getMeasurement(x));
+          switch (values.length) {
+            case 1:
+              margin.top = margin.bottom = margin.left = margin.right = values[0];
+              break;
+            case 2:
+              margin.top = margin.bottom = values[0];
+              margin.left = margin.right = values[1];
+              break;
+            case 3:
+              margin.top = values[0];
+              margin.bottom = values[2];
+              margin.left = margin.right = values[1];
+              break;
+            case 4:
+              margin.top = values[0];
+              margin.left = values[1];
+              margin.bottom = values[2];
+              margin.right = values[3];
+              break;
+          }
+          break;
+        case "margin-top":
+          margin.top = getMeasurement(value);
+          break;
+        case "margin-bottom":
+          margin.bottom = getMeasurement(value);
+          break;
+        case "margin-left":
+          margin.left = getMeasurement(value);
+          break;
+        case "margin-right":
+          margin.right = getMeasurement(value);
+          break;
+        case "line-height":
+          lineHeight = getMeasurement(value);
+          break;
+      }
+    }
+    measure.pushData(xfaFont, margin, lineHeight);
+    if (this[$content]) {
+      measure.addString(this[$content]);
+    } else {
+      for (const child of this[$getChildren]()) {
+        if (child[$nodeName] === "#text") {
+          measure.addString(child[$content]);
+          continue;
+        }
+        child[$pushGlyphs](measure);
+      }
+    }
+    if (mustPop) {
+      measure.popFont();
+    }
+  }
+  [$toHTML](availableSpace) {
+    const children = [];
+    this[$extra] = {
+      children
+    };
+    this[$childrenToHTML]({});
+    if (children.length === 0 && !this[$content]) {
+      return HTMLResult.EMPTY;
+    }
+    let value;
+    if (this[$richText]) {
+      value = this[$content] ? this[$content].replaceAll(crlfForRichTextRegExp, "\n") : undefined;
+    } else {
+      value = this[$content] || undefined;
+    }
+    return HTMLResult.success({
+      name: this[$nodeName],
+      attributes: {
+        href: this.href,
+        style: mapStyle(this.style, this, this[$richText])
+      },
+      children,
+      value
+    });
+  }
+}
+class A extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "a");
+    this.href = fixURL(attributes.href) || "";
+  }
+}
+class B extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "b");
+  }
+  [$pushGlyphs](measure) {
+    measure.pushFont({
+      weight: "bold"
+    });
+    super[$pushGlyphs](measure);
+    measure.popFont();
+  }
+}
+class Body extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "body");
+  }
+  [$toHTML](availableSpace) {
+    const res = super[$toHTML](availableSpace);
+    const {
+      html
+    } = res;
+    if (!html) {
+      return HTMLResult.EMPTY;
+    }
+    html.name = "div";
+    html.attributes.class = ["xfaRich"];
+    return res;
+  }
+}
+class Br extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "br");
+  }
+  [$text]() {
+    return "\n";
+  }
+  [$pushGlyphs](measure) {
+    measure.addString("\n");
+  }
+  [$toHTML](availableSpace) {
+    return HTMLResult.success({
+      name: "br"
+    });
+  }
+}
+class Html extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "html");
+  }
+  [$toHTML](availableSpace) {
+    const children = [];
+    this[$extra] = {
+      children
+    };
+    this[$childrenToHTML]({});
+    if (children.length === 0) {
+      return HTMLResult.success({
+        name: "div",
+        attributes: {
+          class: ["xfaRich"],
+          style: {}
+        },
+        value: this[$content] || ""
+      });
+    }
+    if (children.length === 1) {
+      const child = children[0];
+      if (child.attributes?.class.includes("xfaRich")) {
+        return HTMLResult.success(child);
+      }
+    }
+    return HTMLResult.success({
+      name: "div",
+      attributes: {
+        class: ["xfaRich"],
+        style: {}
+      },
+      children
+    });
+  }
+}
+class I extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "i");
+  }
+  [$pushGlyphs](measure) {
+    measure.pushFont({
+      posture: "italic"
+    });
+    super[$pushGlyphs](measure);
+    measure.popFont();
+  }
+}
+class Li extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "li");
+  }
+}
+class Ol extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "ol");
+  }
+}
+class P extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "p");
+  }
+  [$pushGlyphs](measure) {
+    super[$pushGlyphs](measure, false);
+    measure.addString("\n");
+    measure.addPara();
+    measure.popFont();
+  }
+  [$text]() {
+    const siblings = this[$getParent]()[$getChildren]();
+    if (siblings.at(-1) === this) {
+      return super[$text]();
+    }
+    return super[$text]() + "\n";
+  }
+}
+class Span extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "span");
+  }
+}
+class Sub extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "sub");
+  }
+}
+class Sup extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "sup");
+  }
+}
+class Ul extends XhtmlObject {
+  constructor(attributes) {
+    super(attributes, "ul");
+  }
+}
+class XhtmlNamespace {
+  static [$buildXFAObject](name, attributes) {
+    if (Object.hasOwn(XhtmlNamespace, name)) {
+      return XhtmlNamespace[name](attributes);
+    }
+    return undefined;
+  }
+  static a(attributes) {
+    return new A(attributes);
+  }
+  static b(attributes) {
+    return new B(attributes);
+  }
+  static body(attributes) {
+    return new Body(attributes);
+  }
+  static br(attributes) {
+    return new Br(attributes);
+  }
+  static html(attributes) {
+    return new Html(attributes);
+  }
+  static i(attributes) {
+    return new I(attributes);
+  }
+  static li(attributes) {
+    return new Li(attributes);
+  }
+  static ol(attributes) {
+    return new Ol(attributes);
+  }
+  static p(attributes) {
+    return new P(attributes);
+  }
+  static span(attributes) {
+    return new Span(attributes);
+  }
+  static sub(attributes) {
+    return new Sub(attributes);
+  }
+  static sup(attributes) {
+    return new Sup(attributes);
+  }
+  static ul(attributes) {
+    return new Ul(attributes);
+  }
+}
+
+;// ./src/core/xfa/setup.js
+
+
+
+
+
+
+
+
+
+const NamespaceSetUp = {
+  config: ConfigNamespace,
+  connection: ConnectionSetNamespace,
+  datasets: DatasetsNamespace,
+  localeSet: LocaleSetNamespace,
+  signature: SignatureNamespace,
+  stylesheet: StylesheetNamespace,
+  template: TemplateNamespace,
+  xdp: XdpNamespace,
+  xhtml: XhtmlNamespace
+};
+
+;// ./src/core/xfa/unknown.js
+
+
+class UnknownNamespace {
+  constructor(nsId) {
+    this.namespaceId = nsId;
+  }
+  [$buildXFAObject](name, attributes) {
+    return new XmlObject(this.namespaceId, name, attributes);
+  }
+}
+
+;// ./src/core/xfa/builder.js
+
+
+
+
+
+
+
+class Root extends XFAObject {
+  constructor(ids) {
+    super(-1, "root", Object.create(null));
+    this.element = null;
+    this[$ids] = ids;
+  }
+  [$onChild](child) {
+    this.element = child;
+    return true;
+  }
+  [$finalize]() {
+    super[$finalize]();
+    if (this.element.template instanceof Template) {
+      this[$ids].set($root, this.element);
+      this.element.template[$resolvePrototypes](this[$ids]);
+      this.element.template[$ids] = this[$ids];
+    }
+  }
+}
+class Empty extends XFAObject {
+  constructor() {
+    super(-1, "", Object.create(null));
+  }
+  [$onChild](_) {
+    return false;
+  }
+}
+class Builder {
+  constructor(rootNameSpace = null) {
+    this._namespaceStack = [];
+    this._nsAgnosticLevel = 0;
+    this._namespacePrefixes = new Map();
+    this._namespaces = new Map();
+    this._nextNsId = Math.max(...Object.values(NamespaceIds).map(({
+      id
+    }) => id));
+    this._currentNamespace = rootNameSpace || new UnknownNamespace(++this._nextNsId);
+  }
+  buildRoot(ids) {
+    return new Root(ids);
+  }
+  build({
+    nsPrefix,
+    name,
+    attributes,
+    namespace,
+    prefixes
+  }) {
+    const hasNamespaceDef = namespace !== null;
+    if (hasNamespaceDef) {
+      this._namespaceStack.push(this._currentNamespace);
+      this._currentNamespace = this._searchNamespace(namespace);
+    }
+    if (prefixes) {
+      this._addNamespacePrefix(prefixes);
+    }
+    if (Object.hasOwn(attributes, $nsAttributes)) {
+      const dataTemplate = NamespaceSetUp.datasets;
+      const nsAttrs = attributes[$nsAttributes];
+      let xfaAttrs = null;
+      for (const [ns, attrs] of Object.entries(nsAttrs)) {
+        const nsToUse = this._getNamespaceToUse(ns);
+        if (nsToUse === dataTemplate) {
+          xfaAttrs = {
+            xfa: attrs
+          };
+          break;
+        }
+      }
+      if (xfaAttrs) {
+        attributes[$nsAttributes] = xfaAttrs;
+      } else {
+        delete attributes[$nsAttributes];
+      }
+    }
+    const namespaceToUse = this._getNamespaceToUse(nsPrefix);
+    const node = namespaceToUse?.[$buildXFAObject](name, attributes) || new Empty();
+    if (node[$isNsAgnostic]()) {
+      this._nsAgnosticLevel++;
+    }
+    if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) {
+      node[$cleanup] = {
+        hasNamespace: hasNamespaceDef,
+        prefixes,
+        nsAgnostic: node[$isNsAgnostic]()
+      };
+    }
+    return node;
+  }
+  isNsAgnostic() {
+    return this._nsAgnosticLevel > 0;
+  }
+  _searchNamespace(nsName) {
+    let ns = this._namespaces.get(nsName);
+    if (ns) {
+      return ns;
+    }
+    for (const [name, {
+      check
+    }] of Object.entries(NamespaceIds)) {
+      if (check(nsName)) {
+        ns = NamespaceSetUp[name];
+        if (ns) {
+          this._namespaces.set(nsName, ns);
+          return ns;
+        }
+        break;
+      }
+    }
+    ns = new UnknownNamespace(++this._nextNsId);
+    this._namespaces.set(nsName, ns);
+    return ns;
+  }
+  _addNamespacePrefix(prefixes) {
+    for (const {
+      prefix,
+      value
+    } of prefixes) {
+      const namespace = this._searchNamespace(value);
+      this._namespacePrefixes.getOrInsertComputed(prefix, makeArr).push(namespace);
+    }
+  }
+  _getNamespaceToUse(prefix) {
+    if (!prefix) {
+      return this._currentNamespace;
+    }
+    const prefixStack = this._namespacePrefixes.get(prefix);
+    if (prefixStack?.length > 0) {
+      return prefixStack.at(-1);
+    }
+    warn(`Unknown namespace prefix: ${prefix}.`);
+    return null;
+  }
+  clean(data) {
+    const {
+      hasNamespace,
+      prefixes,
+      nsAgnostic
+    } = data;
+    if (hasNamespace) {
+      this._currentNamespace = this._namespaceStack.pop();
+    }
+    if (prefixes) {
+      prefixes.forEach(({
+        prefix
+      }) => {
+        this._namespacePrefixes.get(prefix).pop();
+      });
+    }
+    if (nsAgnostic) {
+      this._nsAgnosticLevel--;
+    }
+  }
+}
+
+;// ./src/core/xfa/parser.js
+
+
+
+
+class XFAParser extends XMLParserBase {
+  constructor(rootNameSpace = null, richText = false) {
+    super();
+    this._builder = new Builder(rootNameSpace);
+    this._stack = [];
+    this._globalData = {
+      usedTypefaces: new Set()
+    };
+    this._ids = new Map();
+    this._current = this._builder.buildRoot(this._ids);
+    this._errorCode = XMLParserErrorCode.NoError;
+    this._whiteRegex = /^\s+$/;
+    this._nbsps = /\xa0+/g;
+    this._richText = richText;
+  }
+  parse(data) {
+    this.parseXml(data);
+    if (this._errorCode !== XMLParserErrorCode.NoError) {
+      return undefined;
+    }
+    this._current[$finalize]();
+    return this._current.element;
+  }
+  onText(text) {
+    text = text.replace(this._nbsps, match => match.slice(1) + " ");
+    if (this._richText || this._current[$acceptWhitespace]()) {
+      this._current[$onText](text, this._richText);
+      return;
+    }
+    if (this._whiteRegex.test(text)) {
+      return;
+    }
+    this._current[$onText](text.trim());
+  }
+  onCdata(text) {
+    this._current[$onText](text);
+  }
+  _mkAttributes(attributes, tagName) {
+    let namespace = null;
+    let prefixes = null;
+    const attributeObj = Object.create({});
+    for (const {
+      name,
+      value
+    } of attributes) {
+      if (name === "xmlns") {
+        if (!namespace) {
+          namespace = value;
+        } else {
+          warn(`XFA - multiple namespace definition in <${tagName}>`);
+        }
+      } else if (name.startsWith("xmlns:")) {
+        const prefix = name.substring("xmlns:".length);
+        prefixes ??= [];
+        prefixes.push({
+          prefix,
+          value
+        });
+      } else {
+        const i = name.indexOf(":");
+        if (i === -1) {
+          attributeObj[name] = value;
+        } else {
+          const nsAttrs = attributeObj[$nsAttributes] ??= Object.create(null);
+          const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)];
+          const attrs = nsAttrs[ns] ||= Object.create(null);
+          attrs[attrName] = value;
+        }
+      }
+    }
+    return [namespace, prefixes, attributeObj];
+  }
+  _getNameAndPrefix(name, nsAgnostic) {
+    const i = name.indexOf(":");
+    if (i === -1) {
+      return [name, null];
+    }
+    return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)];
+  }
+  onBeginElement(tagName, attributes, isEmpty) {
+    const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName);
+    const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic());
+    const node = this._builder.build({
+      nsPrefix,
+      name,
+      attributes: attributesObj,
+      namespace,
+      prefixes
+    });
+    node[$globalData] = this._globalData;
+    if (isEmpty) {
+      node[$finalize]();
+      if (this._current[$onChild](node)) {
+        node[$setId](this._ids);
+      }
+      node[$clean](this._builder);
+      return;
+    }
+    this._stack.push(this._current);
+    this._current = node;
+  }
+  onEndElement(name) {
+    const node = this._current;
+    if (node[$isCDATAXml]() && typeof node[$content] === "string") {
+      const parser = new XFAParser();
+      parser._globalData = this._globalData;
+      const root = parser.parse(node[$content]);
+      node[$content] = null;
+      node[$onChild](root);
+    }
+    node[$finalize]();
+    this._current = this._stack.pop();
+    if (this._current[$onChild](node)) {
+      node[$setId](this._ids);
+    }
+    node[$clean](this._builder);
+  }
+  onError(code) {
+    this._errorCode = code;
+  }
+}
+
+;// ./src/core/xfa/factory.js
+
+
+
+
+
+
+
+
+class XFAFactory {
+  constructor(data) {
+    try {
+      this.root = new XFAParser().parse(XFAFactory._createDocument(data));
+      const binder = new Binder(this.root);
+      this.form = binder.bind();
+      this.dataHandler = new DataHandler(this.root, binder.getData());
+      this.form[$globalData].template = this.form;
+    } catch (e) {
+      warn(`XFA - an error occurred during parsing and binding: ${e}`);
+    }
+  }
+  isValid() {
+    return !!(this.root && this.form);
+  }
+  _createPagesHelper() {
+    const iterator = this.form[$toPages]();
+    return new Promise((resolve, reject) => {
+      const nextIteration = () => {
+        try {
+          const value = iterator.next();
+          if (value.done) {
+            resolve(value.value);
+          } else {
+            setTimeout(nextIteration, 0);
+          }
+        } catch (e) {
+          reject(e);
+        }
+      };
+      setTimeout(nextIteration, 0);
+    });
+  }
+  async _createPages() {
+    try {
+      this.pages = await this._createPagesHelper();
+      this.dims = this.pages.children.map(c => {
+        const {
+          width,
+          height
+        } = c.attributes.style;
+        return [0, 0, parseInt(width, 10), parseInt(height, 10)];
+      });
+    } catch (e) {
+      warn(`XFA - an error occurred during layout: ${e}`);
+    }
+  }
+  getBoundingBox(pageIndex) {
+    return this.dims[pageIndex];
+  }
+  async getNumPages() {
+    if (!this.pages) {
+      await this._createPages();
+    }
+    return this.dims.length;
+  }
+  setImages(images) {
+    this.form[$globalData].images = images;
+  }
+  setFonts(fonts) {
+    this.form[$globalData].fontFinder = new FontFinder(fonts);
+    const missingFonts = [];
+    for (let typeface of this.form[$globalData].usedTypefaces) {
+      typeface = stripQuotes(typeface);
+      const font = this.form[$globalData].fontFinder.find(typeface);
+      if (!font) {
+        missingFonts.push(typeface);
+      }
+    }
+    if (missingFonts.length > 0) {
+      return missingFonts;
+    }
+    return null;
+  }
+  appendFonts(fonts, reallyMissingFonts) {
+    this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts);
+  }
+  async getPages() {
+    if (!this.pages) {
+      await this._createPages();
+    }
+    const pages = this.pages;
+    this.pages = null;
+    return pages;
+  }
+  serializeData(storage) {
+    return this.dataHandler.serialize(storage);
+  }
+  static _createDocument(data) {
+    if (!data["/xdp:xdp"]) {
+      return data["xdp:xdp"];
+    }
+    return Object.values(data).join("");
+  }
+  static getRichTextAsHtml(rc) {
+    if (!rc || typeof rc !== "string") {
+      return null;
+    }
+    try {
+      let root = new XFAParser(XhtmlNamespace, true).parse(rc);
+      if (!["body", "xhtml"].includes(root[$nodeName])) {
+        const newRoot = XhtmlNamespace.body({});
+        newRoot[$appendChild](root);
+        root = newRoot;
+      }
+      const result = root[$toHTML]();
+      if (!result.success) {
+        return null;
+      }
+      const {
+        html
+      } = result;
+      const {
+        attributes
+      } = html;
+      if (attributes) {
+        if (attributes.class) {
+          attributes.class = attributes.class.filter(attr => !attr.startsWith("xfa"));
+        }
+        attributes.dir = "auto";
+      }
+      return {
+        html,
+        str: root[$text]()
+      };
+    } catch (e) {
+      warn(`XFA - an error occurred during parsing of rich text: ${e}`);
+    }
+    return null;
+  }
+}
+
+;// ./src/core/annotation.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+class AnnotationFactory {
+  static createGlobals(pdfManager) {
+    return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments"), pdfManager.ensureCatalog("globalColorSpaceCache")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments, globalColorSpaceCache]) => ({
+      pdfManager,
+      catalog: pdfManager.pdfDocument.catalog,
+      acroForm: acroForm instanceof Dict ? acroForm : Dict.empty,
+      xfaDatasets,
+      structTreeRoot,
+      baseUrl,
+      attachments,
+      globalColorSpaceCache
+    }), reason => {
+      warn(`createGlobals: "${reason}".`);
+      return null;
+    });
+  }
+  static async create(xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, collectByType, pageRef) {
+    const pageIndex = collectFields ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) : null;
+    return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, collectByType, pageIndex, pageRef]);
+  }
+  static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, orphanFields = null, collectByType = null, pageIndex = null, pageRef = null) {
+    const dict = xref.fetchIfRef(ref);
+    if (!(dict instanceof Dict)) {
+      return undefined;
+    }
+    let subtype = dict.get("Subtype");
+    subtype = subtype instanceof Name ? subtype.name : null;
+    if (collectByType && !collectByType.has(AnnotationType[subtype?.toUpperCase()])) {
+      return null;
+    }
+    const {
+      acroForm,
+      pdfManager
+    } = annotationGlobals;
+    const id = ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`;
+    const parameters = {
+      xref,
+      ref,
+      dict,
+      subtype,
+      id,
+      annotationGlobals,
+      collectFields,
+      orphanFields,
+      needAppearances: !collectFields && acroForm.get("NeedAppearances") === true,
+      pageIndex,
+      evaluatorOptions: pdfManager.evaluatorOptions,
+      pageRef
+    };
+    switch (subtype) {
+      case "Link":
+        return new LinkAnnotation(parameters);
+      case "Text":
+        return new TextAnnotation(parameters);
+      case "Widget":
+        let fieldType = getInheritableProperty({
+          dict,
+          key: "FT"
+        });
+        fieldType = fieldType instanceof Name ? fieldType.name : null;
+        switch (fieldType) {
+          case "Tx":
+            return new TextWidgetAnnotation(parameters);
+          case "Btn":
+            return new ButtonWidgetAnnotation(parameters);
+          case "Ch":
+            return new ChoiceWidgetAnnotation(parameters);
+          case "Sig":
+            return new SignatureWidgetAnnotation(parameters);
+        }
+        warn(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field type.");
+        return new WidgetAnnotation(parameters);
+      case "Popup":
+        return new PopupAnnotation(parameters);
+      case "FreeText":
+        return new FreeTextAnnotation(parameters);
+      case "Line":
+        return new LineAnnotation(parameters);
+      case "Square":
+        return new SquareAnnotation(parameters);
+      case "Circle":
+        return new CircleAnnotation(parameters);
+      case "PolyLine":
+        return new PolylineAnnotation(parameters);
+      case "Polygon":
+        return new PolygonAnnotation(parameters);
+      case "Caret":
+        return new CaretAnnotation(parameters);
+      case "Ink":
+        return new InkAnnotation(parameters);
+      case "Highlight":
+        return new HighlightAnnotation(parameters);
+      case "Underline":
+        return new UnderlineAnnotation(parameters);
+      case "Squiggly":
+        return new SquigglyAnnotation(parameters);
+      case "StrikeOut":
+        return new StrikeOutAnnotation(parameters);
+      case "Stamp":
+        return new StampAnnotation(parameters);
+      case "FileAttachment":
+        return new FileAttachmentAnnotation(parameters);
+      case "RichMedia":
+        return new RichMediaAnnotation(parameters);
+      case "Screen":
+        return new ScreenAnnotation(parameters);
+      default:
+        if (!collectFields) {
+          if (!subtype) {
+            warn("Annotation is missing the required /Subtype.");
+          } else {
+            warn(`Unimplemented annotation type "${subtype}", ` + "falling back to base annotation.");
+          }
+        }
+        return new Annotation(parameters);
+    }
+  }
+  static async _getPageIndex(xref, ref, pdfManager) {
+    try {
+      const annotDict = await xref.fetchIfRefAsync(ref);
+      if (!(annotDict instanceof Dict)) {
+        return -1;
+      }
+      const pageRef = annotDict.getRaw("P");
+      if (pageRef instanceof Ref) {
+        try {
+          const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [pageRef]);
+          return pageIndex;
+        } catch (ex) {
+          info(`_getPageIndex -- not a valid page reference: "${ex}".`);
+        }
+      }
+      if (annotDict.has("Kids")) {
+        return -1;
+      }
+      const numPages = await pdfManager.ensureDoc("numPages");
+      for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {
+        const page = await pdfManager.getPage(pageIndex);
+        const annotations = await pdfManager.ensure(page, "annotations");
+        for (const annotRef of annotations) {
+          if (annotRef instanceof Ref && isRefsEqual(annotRef, ref)) {
+            return pageIndex;
+          }
+        }
+      }
+    } catch (ex) {
+      warn(`_getPageIndex: "${ex}".`);
+    }
+    return -1;
+  }
+  static generateImages(annotations, xref, isOffscreenCanvasSupported) {
+    if (!isOffscreenCanvasSupported) {
+      warn("generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images.");
+      return null;
+    }
+    let imagePromises;
+    for (const {
+      bitmapId,
+      bitmap
+    } of annotations) {
+      if (!bitmap) {
+        continue;
+      }
+      imagePromises ||= new Map();
+      imagePromises.set(bitmapId, createImage(bitmap, xref));
+    }
+    return imagePromises;
+  }
+  static async saveNewAnnotations(evaluator, xref, task, annotations, imagePromises, changes) {
+    let baseFontRef;
+    const promises = [];
+    const {
+      isOffscreenCanvasSupported
+    } = evaluator.options;
+    for (const annotation of annotations) {
+      if (annotation.deleted) {
+        continue;
+      }
+      switch (annotation.annotationType) {
+        case AnnotationEditorType.FREETEXT:
+          if (!baseFontRef) {
+            const baseFont = new Dict(xref);
+            baseFont.setIfName("BaseFont", "Helvetica");
+            baseFont.setIfName("Type", "Font");
+            baseFont.setIfName("Subtype", "Type1");
+            baseFont.setIfName("Encoding", "WinAnsiEncoding");
+            baseFontRef = xref.getNewTemporaryRef();
+            changes.put(baseFontRef, {
+              data: baseFont
+            });
+          }
+          promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, {
+            evaluator,
+            task,
+            baseFontRef
+          }));
+          break;
+        case AnnotationEditorType.HIGHLIGHT:
+          if (annotation.quadPoints) {
+            promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, changes));
+          } else {
+            promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes));
+          }
+          break;
+        case AnnotationEditorType.INK:
+          promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes));
+          break;
+        case AnnotationEditorType.STAMP:
+          const image = isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null;
+          if (image?.imageStream) {
+            const {
+              imageStream,
+              smaskStream
+            } = image;
+            if (smaskStream) {
+              const smaskRef = xref.getNewTemporaryRef();
+              changes.put(smaskRef, {
+                data: smaskStream
+              });
+              imageStream.dict.set("SMask", smaskRef);
+            }
+            const imageRef = image.imageRef = xref.getNewTemporaryRef();
+            changes.put(imageRef, {
+              data: imageStream
+            });
+            image.imageStream = null;
+            image.imageRenderStream = null;
+            image.smaskStream = null;
+            image.smaskRenderStream = null;
+          }
+          promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, {
+            image
+          }));
+          break;
+        case AnnotationEditorType.SIGNATURE:
+          promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, {}));
+          break;
+      }
+    }
+    return {
+      annotations: (await Promise.all(promises)).flat()
+    };
+  }
+  static async printNewAnnotations(annotationGlobals, evaluator, task, annotations, imagePromises) {
+    if (!annotations) {
+      return null;
+    }
+    const {
+      options,
+      xref
+    } = evaluator;
+    const promises = [];
+    for (const annotation of annotations) {
+      if (annotation.deleted) {
+        continue;
+      }
+      switch (annotation.annotationType) {
+        case AnnotationEditorType.FREETEXT:
+          promises.push(FreeTextAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
+            evaluator,
+            task,
+            evaluatorOptions: options
+          }));
+          break;
+        case AnnotationEditorType.HIGHLIGHT:
+          if (annotation.quadPoints) {
+            promises.push(HighlightAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
+              evaluatorOptions: options
+            }));
+          } else {
+            promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
+              evaluatorOptions: options
+            }));
+          }
+          break;
+        case AnnotationEditorType.INK:
+          promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
+            evaluatorOptions: options
+          }));
+          break;
+        case AnnotationEditorType.STAMP:
+          const image = options.isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null;
+          if (image?.imageStream) {
+            const {
+              imageStream,
+              imageRenderStream,
+              smaskStream,
+              smaskRenderStream
+            } = image;
+            const imageRef = imageRenderStream || new JpegStream(imageStream, imageStream.length);
+            if (smaskStream || smaskRenderStream) {
+              imageRef.dict.set("SMask", smaskRenderStream || smaskStream);
+            }
+            image.imageRef = imageRef;
+            image.imageStream = null;
+            image.imageRenderStream = null;
+            image.smaskStream = null;
+            image.smaskRenderStream = null;
+          }
+          promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
+            image,
+            evaluatorOptions: options
+          }));
+          break;
+        case AnnotationEditorType.SIGNATURE:
+          promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
+            evaluatorOptions: options
+          }));
+          break;
+      }
+    }
+    return Promise.all(promises);
+  }
+}
+function getRgbColor(color, defaultColor = new Uint8ClampedArray(3)) {
+  if (!Array.isArray(color)) {
+    return defaultColor;
+  }
+  const rgbColor = defaultColor || new Uint8ClampedArray(3);
+  switch (color.length) {
+    case 0:
+      return null;
+    case 1:
+      ColorSpaceUtils.gray.getRgbItem(color, 0, rgbColor, 0);
+      return rgbColor;
+    case 3:
+      ColorSpaceUtils.rgb.getRgbItem(color, 0, rgbColor, 0);
+      return rgbColor;
+    case 4:
+      ColorSpaceUtils.cmyk.getRgbItem(color, 0, rgbColor, 0);
+      return rgbColor;
+    default:
+      return defaultColor;
+  }
+}
+function getPdfColorArray(color, defaultValue = null) {
+  return color && Array.from(color, c => c / 255) || defaultValue;
+}
+function getQuadPoints(dict, rect) {
+  const quadPoints = dict.getArray("QuadPoints");
+  if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) {
+    return null;
+  }
+  const newQuadPoints = new Float32Array(quadPoints.length);
+  for (let i = 0, ii = quadPoints.length; i < ii; i += 8) {
+    const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8);
+    const minX = Math.min(x1, x2, x3, x4);
+    const maxX = Math.max(x1, x2, x3, x4);
+    const minY = Math.min(y1, y2, y3, y4);
+    const maxY = Math.max(y1, y2, y3, y4);
+    if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) {
+      return null;
+    }
+    newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i);
+  }
+  return newQuadPoints;
+}
+function getTransformMatrix(rect, bbox, matrix) {
+  const minMax = F32_BBOX_INIT.slice();
+  Util.axialAlignedBoundingBox(bbox, matrix, minMax);
+  const [minX, minY, maxX, maxY] = minMax;
+  if (minX === maxX || minY === maxY) {
+    return [1, 0, 0, 1, rect[0], rect[1]];
+  }
+  const xRatio = (rect[2] - rect[0]) / (maxX - minX);
+  const yRatio = (rect[3] - rect[1]) / (maxY - minY);
+  return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];
+}
+class Annotation {
+  appearance = null;
+  _oc = undefined;
+  constructor(params) {
+    const {
+      annotationGlobals,
+      dict,
+      orphanFields,
+      ref,
+      subtype,
+      xref
+    } = params;
+    const parentRef = orphanFields?.get(ref);
+    if (parentRef) {
+      dict.set("Parent", parentRef);
+    }
+    this.setTitle(dict.get("T"));
+    this.setContents(dict.get("Contents"));
+    this.setModificationDate(dict.get("M"));
+    this.setFlags(dict.get("F"));
+    this.setRectangle(dict.getArray("Rect"));
+    this.setColor(dict.getArray("C"));
+    this.setBorderStyle(dict);
+    this.setAppearance(dict);
+    this.#setOptionalContent(xref, dict);
+    const MK = dict.get("MK");
+    this.setBorderAndBackgroundColors(MK);
+    this.setRotation(MK, dict);
+    this.ref = params.ref instanceof Ref ? params.ref : null;
+    this._streams = [];
+    if (this.appearance) {
+      this._streams.push(this.appearance);
+    }
+    const isLocked = !!(this.flags & AnnotationFlag.LOCKED);
+    const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS);
+    this.data = {
+      annotationType: AnnotationType[subtype?.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: params.id,
+      modificationDate: this.modificationDate,
+      oc: this._oc,
+      rect: this.rectangle,
+      subtype,
+      hasOwnCanvas: false,
+      noRotate: !!(this.flags & AnnotationFlag.NOROTATE),
+      noHTML: isLocked && isContentLocked,
+      isEditable: false,
+      structParent: -1
+    };
+    if (annotationGlobals.structTreeRoot) {
+      let structParent = dict.get("StructParent");
+      this.data.structParent = structParent = Number.isInteger(structParent) && structParent >= 0 ? structParent : -1;
+      annotationGlobals.structTreeRoot.addAnnotationIdToPage(params.pageRef, structParent);
+    }
+    if (params.collectFields) {
+      const kids = dict.get("Kids");
+      if (Array.isArray(kids)) {
+        const kidIds = [];
+        for (const kid of kids) {
+          if (kid instanceof Ref) {
+            kidIds.push(kid.toString());
+          }
+        }
+        if (kidIds.length !== 0) {
+          this.data.kidIds = kidIds;
+        }
+      }
+      this.data.actions = collectActions(xref, dict, AnnotationActionEventType);
+      this.data.fieldName = this._constructFieldName(dict);
+      this.data.pageIndex = params.pageIndex;
+    }
+    const it = dict.get("IT");
+    if (it instanceof Name) {
+      this.data.it = it.name;
+    }
+    this._isOffscreenCanvasSupported = params.evaluatorOptions.isOffscreenCanvasSupported;
+    this._fallbackFontDict = null;
+    this._needAppearances = false;
+  }
+  _getOperatorListNoAppearance() {
+    return {
+      opList: new OperatorList(),
+      separateForm: false,
+      separateCanvas: false
+    };
+  }
+  _hasFlag(flags, flag) {
+    return !!(flags & flag);
+  }
+  _buildFlags(noView, noPrint) {
+    let {
+      flags
+    } = this;
+    if (noView === undefined) {
+      if (noPrint === undefined) {
+        return undefined;
+      }
+      if (noPrint) {
+        return flags & ~AnnotationFlag.PRINT;
+      }
+      return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.PRINT;
+    }
+    if (noView) {
+      flags |= AnnotationFlag.PRINT;
+      if (noPrint) {
+        return flags & ~AnnotationFlag.NOVIEW | AnnotationFlag.HIDDEN;
+      }
+      return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW;
+    }
+    flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW);
+    if (noPrint) {
+      return flags & ~AnnotationFlag.PRINT;
+    }
+    return flags | AnnotationFlag.PRINT;
+  }
+  _isViewable(flags) {
+    return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.NOVIEW);
+  }
+  _isPrintable(flags) {
+    return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE);
+  }
+  mustBeViewed(annotationStorage, _renderForms) {
+    const noView = annotationStorage?.get(this.data.id)?.noView;
+    if (noView !== undefined) {
+      return !noView;
+    }
+    return this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN);
+  }
+  mustBePrinted(annotationStorage) {
+    const noPrint = annotationStorage?.get(this.data.id)?.noPrint;
+    if (noPrint !== undefined) {
+      return !noPrint;
+    }
+    return this.printable;
+  }
+  mustBeViewedWhenEditing(isEditing, modifiedIds = null) {
+    return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id);
+  }
+  get viewable() {
+    if (this.data.quadPoints === null) {
+      return false;
+    }
+    if (this.flags === 0) {
+      return true;
+    }
+    return this._isViewable(this.flags);
+  }
+  get printable() {
+    if (this.data.quadPoints === null) {
+      return false;
+    }
+    if (this.flags === 0) {
+      return false;
+    }
+    return this._isPrintable(this.flags);
+  }
+  _parseStringHelper(data) {
+    const str = typeof data === "string" ? stringToPDFString(data) : "";
+    const dir = str && bidi(str).dir === "rtl" ? "rtl" : "ltr";
+    return {
+      str,
+      dir
+    };
+  }
+  setDefaultAppearance(params) {
+    const {
+      dict,
+      annotationGlobals
+    } = params;
+    const defaultAppearance = getInheritableProperty({
+      dict,
+      key: "DA"
+    }) || annotationGlobals.acroForm.get("DA");
+    this._defaultAppearance = typeof defaultAppearance === "string" ? defaultAppearance : "";
+    this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance);
+  }
+  setTitle(title) {
+    this._title = this._parseStringHelper(title);
+  }
+  setContents(contents) {
+    this._contents = this._parseStringHelper(contents);
+  }
+  setModificationDate(modificationDate) {
+    this.modificationDate = typeof modificationDate === "string" ? modificationDate : null;
+  }
+  setFlags(flags) {
+    this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0;
+    if (this.flags & AnnotationFlag.INVISIBLE && this.constructor.name !== "Annotation") {
+      this.flags ^= AnnotationFlag.INVISIBLE;
+    }
+  }
+  hasFlag(flag) {
+    return this._hasFlag(this.flags, flag);
+  }
+  setRectangle(rectangle) {
+    this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]);
+  }
+  setColor(color) {
+    this.color = getRgbColor(color);
+  }
+  setLineEndings(lineEndings) {
+    this.lineEndings = ["None", "None"];
+    if (Array.isArray(lineEndings) && lineEndings.length === 2) {
+      for (let i = 0; i < 2; i++) {
+        const obj = lineEndings[i];
+        if (obj instanceof Name) {
+          switch (obj.name) {
+            case "None":
+              continue;
+            case "Square":
+            case "Circle":
+            case "Diamond":
+            case "OpenArrow":
+            case "ClosedArrow":
+            case "Butt":
+            case "ROpenArrow":
+            case "RClosedArrow":
+            case "Slash":
+              this.lineEndings[i] = obj.name;
+              continue;
+          }
+        }
+        warn(`Ignoring invalid lineEnding: ${obj}`);
+      }
+    }
+  }
+  setRotation(mk, dict) {
+    this.rotation = 0;
+    let angle = mk instanceof Dict ? mk.get("R") || 0 : dict.get("Rotate") || 0;
+    if (Number.isInteger(angle) && angle !== 0) {
+      angle %= 360;
+      if (angle < 0) {
+        angle += 360;
+      }
+      if (angle % 90 === 0) {
+        this.rotation = angle;
+      }
+    }
+  }
+  setBorderAndBackgroundColors(mk) {
+    if (mk instanceof Dict) {
+      this.borderColor = getRgbColor(mk.getArray("BC"), null);
+      this.backgroundColor = getRgbColor(mk.getArray("BG"), null);
+    } else {
+      this.borderColor = this.backgroundColor = null;
+    }
+  }
+  setBorderStyle(borderStyle) {
+    this.borderStyle = new AnnotationBorderStyle();
+    if (!(borderStyle instanceof Dict)) {
+      return;
+    }
+    if (borderStyle.has("BS")) {
+      const dict = borderStyle.get("BS");
+      if (dict instanceof Dict) {
+        const dictType = dict.get("Type");
+        if (!dictType || isName(dictType, "Border")) {
+          this.borderStyle.setWidth(dict.get("W"), this.rectangle);
+          this.borderStyle.setStyle(dict.get("S"));
+          this.borderStyle.setDashArray(dict.getArray("D"));
+        }
+      }
+    } else if (borderStyle.has("Border")) {
+      const array = borderStyle.getArray("Border");
+      if (Array.isArray(array)) {
+        if (array.length >= 3) {
+          this.borderStyle.setHorizontalCornerRadius(array[0]);
+          this.borderStyle.setVerticalCornerRadius(array[1]);
+          this.borderStyle.setWidth(array[2], this.rectangle);
+          if (array.length === 4) {
+            this.borderStyle.setDashArray(array[3], true);
+          }
+        } else if (array.length === 0) {
+          this.borderStyle.setWidth(0);
+        }
+      }
+    } else {
+      this.borderStyle.setWidth(0);
+    }
+  }
+  setAppearance(dict) {
+    const appearanceStates = dict.get("AP");
+    if (!(appearanceStates instanceof Dict)) {
+      return;
+    }
+    const normalAppearanceState = appearanceStates.get("N");
+    if (normalAppearanceState instanceof BaseStream) {
+      this.appearance = normalAppearanceState;
+      return;
+    }
+    if (!(normalAppearanceState instanceof Dict)) {
+      return;
+    }
+    const as = dict.get("AS");
+    if (!(as instanceof Name)) {
+      return;
+    }
+    const appearance = normalAppearanceState.get(as.name);
+    if (appearance instanceof BaseStream) {
+      this.appearance = appearance;
+    }
+  }
+  #setOptionalContent(xref, dict) {
+    if (dict.has("OC")) {
+      try {
+        this._oc = parseMarkedContentProps(xref, dict.get("OC"), null);
+      } catch (ex) {
+        if (ex instanceof MissingDataException) {
+          throw ex;
+        }
+        warn(`#setOptionalContent: ${ex}`);
+      }
+    }
+  }
+  async loadResources(keys, appearance) {
+    const resources = await appearance.dict.getAsync("Resources");
+    if (resources) {
+      await ObjectLoader.load(resources, keys, resources.xref);
+    }
+    return resources;
+  }
+  get _ownCanvasRequiresForms() {
+    return false;
+  }
+  async getOperatorList(evaluator, task, intent, annotationStorage) {
+    const {
+      hasOwnCanvas,
+      id,
+      rect
+    } = this.data;
+    let appearance = this.appearance;
+    const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY && (!this._ownCanvasRequiresForms || intent & RenderingIntentFlag.ANNOTATIONS_FORMS));
+    if (isUsingOwnCanvas && (this.width === 0 || this.height === 0)) {
+      this.data.hasOwnCanvas = false;
+      return this._getOperatorListNoAppearance();
+    }
+    if (!appearance) {
+      if (!isUsingOwnCanvas) {
+        return this._getOperatorListNoAppearance();
+      }
+      appearance = new StringStream("", new Dict());
+    }
+    const appearanceDict = appearance.dict;
+    const resources = await this.loadResources(RESOURCES_KEYS_OPERATOR_LIST, appearance);
+    const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, this.width, this.height]);
+    const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), IDENTITY_MATRIX);
+    const transform = getTransformMatrix(rect, bbox, matrix);
+    const opList = new OperatorList();
+    const optionalContent = this._oc;
+    if (optionalContent !== undefined) {
+      opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]);
+    }
+    opList.addOp(OPS.beginAnnotation, [id, rect, transform, matrix, isUsingOwnCanvas]);
+    await evaluator.getOperatorList({
+      stream: appearance,
+      task,
+      resources,
+      operatorList: opList,
+      fallbackFontDict: this._fallbackFontDict
+    });
+    opList.addOp(OPS.endAnnotation, []);
+    if (optionalContent !== undefined) {
+      opList.addOp(OPS.endMarkedContent, []);
+    }
+    this.reset();
+    return {
+      opList,
+      separateForm: false,
+      separateCanvas: isUsingOwnCanvas
+    };
+  }
+  async save(evaluator, task, annotationStorage, changes) {
+    return null;
+  }
+  get overlaysTextContent() {
+    return false;
+  }
+  get hasTextContent() {
+    return false;
+  }
+  async extractTextContent(evaluator, task, viewBox) {
+    if (!this.appearance) {
+      return;
+    }
+    const resources = await this.loadResources(RESOURCES_KEYS_TEXT_CONTENT, this.appearance);
+    const text = [];
+    const buffer = [];
+    let firstPosition = null;
+    const sink = {
+      desiredSize: Math.Infinity,
+      ready: true,
+      enqueue(chunk, size) {
+        for (const item of chunk.items) {
+          if (item.str === undefined) {
+            continue;
+          }
+          firstPosition ||= item.transform.slice(-2);
+          buffer.push(item.str);
+          if (item.hasEOL) {
+            text.push(buffer.join("").trimEnd());
+            buffer.length = 0;
+          }
+        }
+      }
+    };
+    await evaluator.getTextContent({
+      stream: this.appearance,
+      task,
+      resources,
+      includeMarkedContent: true,
+      keepWhiteSpace: true,
+      sink,
+      viewBox
+    });
+    this.reset();
+    if (buffer.length) {
+      text.push(buffer.join("").trimEnd());
+    }
+    if (text.length > 1 || text[0]) {
+      const appearanceDict = this.appearance.dict;
+      const bbox = lookupRect(appearanceDict.getArray("BBox"), null);
+      const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), null);
+      this.data.textPosition = this._transformPoint(firstPosition, bbox, matrix);
+      this.data.textContent = text;
+    }
+  }
+  _transformPoint(coords, bbox, matrix) {
+    const {
+      rect
+    } = this.data;
+    bbox ||= [0, 0, 1, 1];
+    matrix ||= [1, 0, 0, 1, 0, 0];
+    const transform = getTransformMatrix(rect, bbox, matrix);
+    transform[4] -= rect[0];
+    transform[5] -= rect[1];
+    const p = coords.slice();
+    Util.applyTransform(p, transform);
+    Util.applyTransform(p, matrix);
+    return p;
+  }
+  getFieldObject() {
+    if (this.data.kidIds) {
+      return {
+        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
+      };
+    }
+    return null;
+  }
+  reset() {
+    for (const stream of this._streams) {
+      stream.reset();
+    }
+  }
+  _constructFieldName(dict) {
+    if (!dict.has("T") && !dict.has("Parent")) {
+      warn("Unknown field name, falling back to empty field name.");
+      return "";
+    }
+    if (!dict.has("Parent")) {
+      return stringToPDFString(dict.get("T"));
+    }
+    const fieldName = [];
+    if (dict.has("T")) {
+      fieldName.unshift(stringToPDFString(dict.get("T")));
+    }
+    let loopDict = dict;
+    const visited = new RefSet();
+    if (dict.objId) {
+      visited.put(dict.objId);
+    }
+    while (loopDict.has("Parent")) {
+      loopDict = loopDict.get("Parent");
+      if (!(loopDict instanceof Dict) || loopDict.objId && visited.has(loopDict.objId)) {
+        break;
+      }
+      if (loopDict.objId) {
+        visited.put(loopDict.objId);
+      }
+      if (loopDict.has("T")) {
+        fieldName.unshift(stringToPDFString(loopDict.get("T")));
+      }
+    }
+    return fieldName.join(".");
+  }
+  _getAttachmentId(fsDict, fsRef, annotationGlobals) {
+    if (!(fsDict instanceof Dict)) {
+      return undefined;
+    }
+    if (!(fsRef instanceof Ref)) {
+      fsRef = FileSpec.pickPlatformItem(fsDict.get("EF"), true);
+    }
+    return fsRef instanceof Ref ? annotationGlobals.catalog.getAttachmentIdForAnnotation(fsRef) : undefined;
+  }
+  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 = AnnotationBorderStyleType.SOLID;
+  dashArray = [3];
+  horizontalCornerRadius = 0;
+  verticalCornerRadius = 0;
+  setWidth(width, rect = [0, 0, 0, 0]) {
+    if (width instanceof Name) {
+      this.width = 0;
+      return;
+    }
+    if (typeof width === "number") {
+      if (width > 0) {
+        this.rawWidth = width;
+        const maxWidth = (rect[2] - rect[0]) / 2;
+        const maxHeight = (rect[3] - rect[1]) / 2;
+        if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) {
+          warn(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`);
+          width = 1;
+        }
+      }
+      this.width = width;
+    }
+  }
+  setStyle(style) {
+    if (!(style instanceof Name)) {
+      return;
+    }
+    switch (style.name) {
+      case "S":
+        this.style = AnnotationBorderStyleType.SOLID;
+        break;
+      case "D":
+        this.style = AnnotationBorderStyleType.DASHED;
+        break;
+      case "B":
+        this.style = AnnotationBorderStyleType.BEVELED;
+        break;
+      case "I":
+        this.style = AnnotationBorderStyleType.INSET;
+        break;
+      case "U":
+        this.style = AnnotationBorderStyleType.UNDERLINE;
+        break;
+      default:
+        break;
+    }
+  }
+  setDashArray(dashArray, forceStyle = false) {
+    if (Array.isArray(dashArray)) {
+      let isValid = true;
+      let allZeros = true;
+      for (const element of dashArray) {
+        const validNumber = +element >= 0;
+        if (!validNumber) {
+          isValid = false;
+          break;
+        } else if (element > 0) {
+          allZeros = false;
+        }
+      }
+      if (dashArray.length === 0 || isValid && !allZeros) {
+        this.dashArray = dashArray;
+        if (forceStyle) {
+          this.setStyle(Name.get("D"));
+        }
+      } else {
+        this.width = 0;
+      }
+    } else if (dashArray) {
+      this.width = 0;
+    }
+  }
+  setHorizontalCornerRadius(radius) {
+    if (Number.isInteger(radius)) {
+      this.horizontalCornerRadius = radius;
+    }
+  }
+  setVerticalCornerRadius(radius) {
+    if (Number.isInteger(radius)) {
+      this.verticalCornerRadius = radius;
+    }
+  }
+}
+class MarkupAnnotation extends Annotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict
+    } = params;
+    if (dict.has("IRT")) {
+      const rawIRT = dict.getRaw("IRT");
+      this.data.inReplyTo = rawIRT instanceof Ref ? rawIRT.toString() : null;
+      const rt = dict.get("RT");
+      this.data.replyType = rt instanceof Name ? rt.name : AnnotationReplyType.REPLY;
+    }
+    let popupRef = null;
+    if (this.data.replyType === AnnotationReplyType.GROUP) {
+      const parent = dict.get("IRT");
+      this.setTitle(parent.get("T"));
+      this.data.titleObj = this._title;
+      this.setContents(parent.get("Contents"));
+      this.data.contentsObj = this._contents;
+      if (!parent.has("CreationDate")) {
+        this.data.creationDate = null;
+      } else {
+        this.setCreationDate(parent.get("CreationDate"));
+        this.data.creationDate = this.creationDate;
+      }
+      if (!parent.has("M")) {
+        this.data.modificationDate = null;
+      } else {
+        this.setModificationDate(parent.get("M"));
+        this.data.modificationDate = this.modificationDate;
+      }
+      popupRef = parent.getRaw("Popup");
+      if (!parent.has("C")) {
+        this.data.color = null;
+      } else {
+        this.setColor(parent.getArray("C"));
+        this.data.color = this.color;
+      }
+    } else {
+      this.data.titleObj = this._title;
+      this.setCreationDate(dict.get("CreationDate"));
+      this.data.creationDate = this.creationDate;
+      popupRef = dict.getRaw("Popup");
+      if (!dict.has("C")) {
+        this.data.color = null;
+      }
+    }
+    this.data.popupRef = popupRef instanceof Ref ? popupRef.toString() : null;
+    if (dict.has("RC")) {
+      this.data.richText = XFAFactory.getRichTextAsHtml(dict.get("RC"));
+    }
+  }
+  setCreationDate(creationDate) {
+    this.creationDate = typeof creationDate === "string" ? creationDate : null;
+  }
+  _setDefaultAppearance({
+    xref,
+    extra,
+    strokeColor,
+    fillColor,
+    blendMode,
+    strokeAlpha,
+    fillAlpha,
+    pointsCallback
+  }) {
+    const bbox = this.data.rect = BBOX_INIT.slice();
+    const buffer = ["q"];
+    if (extra) {
+      buffer.push(extra);
+    }
+    if (strokeColor) {
+      buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`);
+    }
+    if (fillColor) {
+      buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`);
+    }
+    const pointsArray = 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 i = 0, ii = pointsArray.length; i < ii; i += 8) {
+      const points = pointsCallback(buffer, pointsArray.subarray(i, i + 8));
+      Util.rectBoundingBox(...points, bbox);
+    }
+    buffer.push("Q");
+    const formDict = new Dict(xref);
+    const appearanceStreamDict = new Dict(xref);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    const appearanceStream = new StringStream(buffer.join(" "), appearanceStreamDict);
+    formDict.set("Fm0", appearanceStream);
+    const gsDict = new Dict(xref);
+    if (blendMode) {
+      gsDict.setIfName("BM", blendMode);
+    }
+    gsDict.setIfNumber("CA", strokeAlpha);
+    gsDict.setIfNumber("ca", fillAlpha);
+    const stateDict = new Dict(xref);
+    stateDict.set("GS0", gsDict);
+    const resources = new Dict(xref);
+    resources.set("ExtGState", stateDict);
+    resources.set("XObject", formDict);
+    const appearanceDict = new Dict(xref);
+    appearanceDict.set("Resources", resources);
+    appearanceDict.set("BBox", bbox);
+    this.appearance = new StringStream("/GS0 gs /Fm0 Do", appearanceDict);
+    this._streams.push(this.appearance, appearanceStream);
+  }
+  static async createNewAnnotation(xref, annotation, changes, params) {
+    const annotationRef = annotation.ref ||= xref.getNewTemporaryRef();
+    const ap = await this.createNewAppearanceStream(annotation, xref, params);
+    let annotationDict;
+    if (ap) {
+      const apRef = xref.getNewTemporaryRef();
+      annotationDict = this.createNewDict(annotation, xref, {
+        apRef
+      });
+      changes.put(apRef, {
+        data: ap
+      });
+    } else {
+      annotationDict = this.createNewDict(annotation, xref, {});
+    }
+    if (Number.isInteger(annotation.parentTreeId)) {
+      annotationDict.set("StructParent", annotation.parentTreeId);
+    }
+    changes.put(annotationRef, {
+      data: annotationDict
+    });
+    const retRef = {
+      ref: annotationRef
+    };
+    const {
+      popup
+    } = annotation;
+    if (popup) {
+      if (popup.deleted) {
+        annotationDict.delete("Popup");
+        annotationDict.delete("Contents");
+        annotationDict.delete("RC");
+        return retRef;
+      }
+      const popupRef = popup.ref ||= xref.getNewTemporaryRef();
+      popup.parent = annotationRef;
+      const popupDict = PopupAnnotation.createNewDict(popup, xref);
+      changes.put(popupRef, {
+        data: popupDict
+      });
+      annotationDict.setIfDefined("Contents", stringToAsciiOrUTF16BE(popup.contents));
+      annotationDict.set("Popup", popupRef);
+      return [retRef, {
+        ref: popupRef
+      }];
+    }
+    return retRef;
+  }
+  static async createNewPrintAnnotation(annotationGlobals, xref, annotation, params) {
+    const ap = await this.createNewAppearanceStream(annotation, xref, params);
+    const annotationDict = this.createNewDict(annotation, xref, ap ? {
+      ap
+    } : {});
+    const newAnnotation = new this.prototype.constructor({
+      dict: annotationDict,
+      xref,
+      annotationGlobals,
+      evaluatorOptions: params.evaluatorOptions
+    });
+    if (annotation.ref) {
+      newAnnotation.ref = newAnnotation.refToReplace = annotation.ref;
+    }
+    return newAnnotation;
+  }
+}
+class WidgetAnnotation extends Annotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref,
+      annotationGlobals
+    } = params;
+    const data = this.data;
+    this._needAppearances = params.needAppearances;
+    if (data.fieldName === undefined) {
+      data.fieldName = this._constructFieldName(dict);
+    }
+    if (data.actions === undefined) {
+      data.actions = collectActions(xref, dict, AnnotationActionEventType);
+    }
+    let fieldValue = getInheritableProperty({
+      dict,
+      key: "V",
+      getArray: true
+    });
+    data.fieldValue = this._decodeFormValue(fieldValue);
+    const defaultFieldValue = getInheritableProperty({
+      dict,
+      key: "DV",
+      getArray: true
+    });
+    data.defaultFieldValue = this._decodeFormValue(defaultFieldValue);
+    if (fieldValue === undefined && annotationGlobals.xfaDatasets) {
+      const path = this._title.str;
+      if (path) {
+        this._hasValueFromXFA = true;
+        data.fieldValue = fieldValue = annotationGlobals.xfaDatasets.getValue(path);
+      }
+    }
+    if (fieldValue === undefined && data.defaultFieldValue !== null) {
+      data.fieldValue = data.defaultFieldValue;
+    }
+    data.alternativeText = stringToPDFString(dict.get("TU") || "");
+    this.setDefaultAppearance(params);
+    data.hasAppearance ||= this._needAppearances && data.fieldValue !== undefined && data.fieldValue !== null;
+    const fieldType = getInheritableProperty({
+      dict,
+      key: "FT"
+    });
+    data.fieldType = fieldType instanceof Name ? fieldType.name : null;
+    const localResources = getInheritableProperty({
+      dict,
+      key: "DR"
+    });
+    const acroFormResources = annotationGlobals.acroForm.get("DR");
+    const appearanceResources = this.appearance?.dict.get("Resources");
+    this._fieldResources = {
+      localResources,
+      acroFormResources,
+      appearanceResources,
+      mergedResources: Dict.merge({
+        xref,
+        dictArray: [localResources, appearanceResources, acroFormResources],
+        mergeSubDicts: true
+      })
+    };
+    data.fieldFlags = getInheritableProperty({
+      dict,
+      key: "Ff"
+    });
+    if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {
+      data.fieldFlags = 0;
+    }
+    data.password = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD);
+    data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY);
+    data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED);
+    data.hidden = this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) || this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW);
+  }
+  _decodeFormValue(formValue) {
+    if (Array.isArray(formValue)) {
+      const arr = formValue.map(item => this._decodeFormValue(item)).filter(item => item !== null);
+      return arr.length > 0 ? arr : null;
+    } else if (formValue instanceof Name) {
+      return formValue.name;
+    } else if (typeof formValue === "string") {
+      return stringToPDFString(formValue);
+    }
+    return null;
+  }
+  hasFieldFlag(flag) {
+    return !!(this.data.fieldFlags & flag);
+  }
+  _isViewable(flags) {
+    return true;
+  }
+  mustBeViewed(annotationStorage, renderForms) {
+    if (renderForms) {
+      return this.viewable;
+    }
+    return super.mustBeViewed(annotationStorage, renderForms) && !this._hasFlag(this.flags, AnnotationFlag.NOVIEW);
+  }
+  getRotationMatrix(annotationStorage) {
+    let rotation = annotationStorage?.get(this.data.id)?.rotation;
+    if (rotation === undefined) {
+      rotation = this.rotation;
+    }
+    return rotation === 0 ? IDENTITY_MATRIX : getRotationMatrix(rotation, this.width, this.height);
+  }
+  getBorderAndBackgroundAppearances(annotationStorage) {
+    let rotation = annotationStorage?.get(this.data.id)?.rotation;
+    if (rotation === undefined) {
+      rotation = this.rotation;
+    }
+    if (!this.backgroundColor && !this.borderColor) {
+      return "";
+    }
+    const rect = rotation === 0 || rotation === 180 ? `0 0 ${this.width} ${this.height} re` : `0 0 ${this.height} ${this.width} re`;
+    let str = "";
+    if (this.backgroundColor) {
+      str = `${getPdfColor(this.backgroundColor, true)} ${rect} f `;
+    }
+    if (this.borderColor) {
+      const borderWidth = this.borderStyle.width || 1;
+      str += `${borderWidth} w ${getPdfColor(this.borderColor, false)} ${rect} S `;
+    }
+    return str;
+  }
+  async getOperatorList(evaluator, task, intent, annotationStorage) {
+    if (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) {
+      const list = this._getOperatorListNoAppearance();
+      list.separateForm = true;
+      return list;
+    }
+    if (!this._hasText) {
+      return super.getOperatorList(evaluator, task, intent, annotationStorage);
+    }
+    const content = await this._getAppearance(evaluator, task, intent, annotationStorage);
+    if (this.appearance && content === null) {
+      return super.getOperatorList(evaluator, task, intent, annotationStorage);
+    }
+    const opList = new OperatorList();
+    if (!this._defaultAppearance || content === null) {
+      return {
+        opList,
+        separateForm: false,
+        separateCanvas: false
+      };
+    }
+    const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY);
+    const matrix = [1, 0, 0, 1, 0, 0];
+    const bbox = [0, 0, this.width, this.height];
+    const transform = getTransformMatrix(this.data.rect, bbox, matrix);
+    const optionalContent = this._oc;
+    if (optionalContent !== undefined) {
+      opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]);
+    }
+    opList.addOp(OPS.beginAnnotation, [this.data.id, this.data.rect, transform, this.getRotationMatrix(annotationStorage), isUsingOwnCanvas]);
+    const stream = new StringStream(content);
+    await evaluator.getOperatorList({
+      stream,
+      task,
+      resources: this._fieldResources.mergedResources,
+      operatorList: opList
+    });
+    opList.addOp(OPS.endAnnotation, []);
+    if (optionalContent !== undefined) {
+      opList.addOp(OPS.endMarkedContent, []);
+    }
+    return {
+      opList,
+      separateForm: false,
+      separateCanvas: isUsingOwnCanvas
+    };
+  }
+  _getMKDict(rotation) {
+    const mk = new Dict(null);
+    if (rotation) {
+      mk.set("R", rotation);
+    }
+    mk.setIfArray("BC", getPdfColorArray(this.borderColor));
+    mk.setIfArray("BG", getPdfColorArray(this.backgroundColor));
+    return mk.size > 0 ? mk : null;
+  }
+  amendSavedDict(annotationStorage, dict) {}
+  setValue(dict, value, xref, changes) {
+    const {
+      dict: parentDict,
+      ref: parentRef
+    } = getParentToUpdate(dict, this.ref, xref);
+    if (!parentDict) {
+      dict.set("V", value);
+    } else if (!changes.has(parentRef)) {
+      const newParentDict = parentDict.clone();
+      newParentDict.set("V", value);
+      changes.put(parentRef, {
+        data: newParentDict
+      });
+      return newParentDict;
+    }
+    return null;
+  }
+  async save(evaluator, task, annotationStorage, changes) {
+    const storageEntry = annotationStorage?.get(this.data.id);
+    const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);
+    let value = storageEntry?.value,
+      rotation = storageEntry?.rotation;
+    if (value === this.data.fieldValue || value === undefined) {
+      if (!this._hasValueFromXFA && rotation === undefined && flags === undefined) {
+        return;
+      }
+      value ||= this.data.fieldValue;
+    }
+    if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && isArrayEqual(value, this.data.fieldValue) && flags === undefined) {
+      return;
+    }
+    if (rotation === undefined) {
+      rotation = this.rotation;
+    }
+    let appearance = null;
+    if (!this._needAppearances) {
+      appearance = await this._getAppearance(evaluator, task, RenderingIntentFlag.SAVE, annotationStorage);
+      if (appearance === null && flags === undefined) {
+        return;
+      }
+    } else {}
+    let needAppearances = false;
+    if (appearance?.needAppearances) {
+      needAppearances = true;
+      appearance = null;
+    }
+    const {
+      xref
+    } = evaluator;
+    const originalDict = xref.fetchIfRef(this.ref);
+    if (!(originalDict instanceof Dict)) {
+      return;
+    }
+    const dict = new Dict(xref);
+    for (const [key, rawVal] of originalDict.getRawEntries()) {
+      if (key !== "AP") {
+        dict.set(key, rawVal);
+      }
+    }
+    if (flags !== undefined) {
+      dict.set("F", flags);
+      if (appearance === null && !needAppearances) {
+        const ap = originalDict.getRaw("AP");
+        if (ap) {
+          dict.set("AP", ap);
+        }
+      }
+    }
+    const xfa = {
+      path: this.data.fieldName,
+      value
+    };
+    const newParentDict = this.setValue(dict, Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value), xref, changes);
+    this.amendSavedDict(annotationStorage, newParentDict || dict);
+    const maybeMK = this._getMKDict(rotation);
+    if (maybeMK) {
+      dict.set("MK", maybeMK);
+    }
+    changes.put(this.ref, {
+      data: dict,
+      xfa,
+      needAppearances
+    });
+    if (appearance !== null) {
+      const newRef = xref.getNewTemporaryRef();
+      const AP = new Dict(xref);
+      dict.set("AP", AP);
+      AP.set("N", newRef);
+      const resources = this._getSaveFieldResources(xref),
+        appearanceDict = new Dict(xref);
+      appearanceDict.setIfName("Subtype", "Form");
+      appearanceDict.set("Resources", resources);
+      const bbox = rotation % 180 === 0 ? [0, 0, this.width, this.height] : [0, 0, this.height, this.width];
+      appearanceDict.set("BBox", bbox);
+      const appearanceStream = new StringStream(appearance, appearanceDict);
+      const rotationMatrix = this.getRotationMatrix(annotationStorage);
+      if (rotationMatrix !== IDENTITY_MATRIX) {
+        appearanceDict.set("Matrix", rotationMatrix);
+      }
+      changes.put(newRef, {
+        data: appearanceStream,
+        xfa: null,
+        needAppearances: false
+      });
+    }
+    dict.set("M", `D:${getModificationDate()}`);
+  }
+  async _getAppearance(evaluator, task, intent, annotationStorage) {
+    if (this.data.password) {
+      return null;
+    }
+    const storageEntry = annotationStorage?.get(this.data.id);
+    let value, rotation;
+    if (storageEntry) {
+      value = storageEntry.formattedValue || storageEntry.value;
+      rotation = storageEntry.rotation;
+    }
+    if (rotation === undefined && value === undefined && !this._needAppearances) {
+      if (!this._hasValueFromXFA || this.appearance) {
+        return null;
+      }
+    }
+    const colors = this.getBorderAndBackgroundAppearances(annotationStorage);
+    if (value === undefined) {
+      value = this.data.fieldValue;
+      if (!value) {
+        return `/Tx BMC q ${colors}Q EMC`;
+      }
+    }
+    if (Array.isArray(value) && value.length === 1) {
+      value = value[0];
+    }
+    assert(typeof value === "string", "Expected `value` to be a string.");
+    value = value.trimEnd();
+    if (this.data.combo) {
+      const option = this.data.options.find(({
+        exportValue
+      }) => value === exportValue);
+      value = option?.displayValue || value;
+    }
+    if (value === "") {
+      return `/Tx BMC q ${colors}Q EMC`;
+    }
+    if (rotation === undefined) {
+      rotation = this.rotation;
+    }
+    let lineCount = -1;
+    let lines;
+    if (this.data.multiLine) {
+      lines = value.split(/\r\n?|\n/).map(line => line.normalize("NFC"));
+      lineCount = lines.length;
+    } else {
+      lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")];
+    }
+    const defaultPadding = 1;
+    const defaultHPadding = 2;
+    let {
+      width: totalWidth,
+      height: totalHeight
+    } = this;
+    if (rotation === 90 || rotation === 270) {
+      [totalWidth, totalHeight] = [totalHeight, totalWidth];
+    }
+    if (!this._defaultAppearance) {
+      this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g");
+    }
+    let font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources);
+    let defaultAppearance, fontSize, lineHeight;
+    const encodedLines = [];
+    let encodingError = false;
+    for (const line of lines) {
+      const encodedString = font.encodeString(line);
+      if (encodedString.length > 1) {
+        encodingError = true;
+      }
+      encodedLines.push(encodedString.join(""));
+    }
+    if (encodingError && intent & RenderingIntentFlag.SAVE) {
+      return {
+        needAppearances: true
+      };
+    }
+    if (encodingError && this._isOffscreenCanvasSupported) {
+      const fontFamily = this.data.comb ? "monospace" : "sans-serif";
+      const fakeUnicodeFont = new FakeUnicodeFont(evaluator.xref, fontFamily);
+      const resources = fakeUnicodeFont.createFontResources(lines.join(""));
+      const newFont = resources.getRaw("Font");
+      if (this._fieldResources.mergedResources.has("Font")) {
+        const oldFont = this._fieldResources.mergedResources.get("Font");
+        for (const [key, rawVal] of newFont.getRawEntries()) {
+          oldFont.set(key, rawVal);
+        }
+      } else {
+        this._fieldResources.mergedResources.set("Font", newFont);
+      }
+      const fontName = fakeUnicodeFont.fontName.name;
+      font = await WidgetAnnotation._getFontData(evaluator, task, {
+        fontName,
+        fontSize: 0
+      }, resources);
+      for (let i = 0, ii = encodedLines.length; i < ii; i++) {
+        encodedLines[i] = stringToUTF16String(lines[i]);
+      }
+      const savedDefaultAppearance = Object.assign(Object.create(null), this.data.defaultAppearanceData);
+      this.data.defaultAppearanceData.fontSize = 0;
+      this.data.defaultAppearanceData.fontName = fontName;
+      [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount);
+      this.data.defaultAppearanceData = savedDefaultAppearance;
+    } else {
+      if (!this._isOffscreenCanvasSupported) {
+        warn("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly.");
+      }
+      [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount);
+    }
+    let descent = font.descent;
+    if (isNaN(descent)) {
+      descent = BASELINE_FACTOR * lineHeight;
+    } else {
+      descent = Math.max(BASELINE_FACTOR * lineHeight, Math.abs(descent) * fontSize);
+    }
+    const defaultVPadding = Math.min(Math.floor((totalHeight - fontSize) / 2), defaultPadding);
+    const alignment = this.data.textAlignment;
+    if (this.data.multiLine) {
+      return this._getMultilineAppearance(defaultAppearance, encodedLines, font, fontSize, totalWidth, totalHeight, alignment, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage);
+    }
+    if (this.data.comb) {
+      return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, alignment, bidi(lines[0]).dir === "rtl", annotationStorage);
+    }
+    const bottomPadding = defaultVPadding + descent;
+    if (alignment === 0 || alignment > 2) {
+      return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(defaultHPadding)} ${numberToString(bottomPadding)} Tm (${escapeString(encodedLines[0])}) Tj` + " ET Q EMC";
+    }
+    const prevInfo = {
+      shift: 0
+    };
+    const renderedText = this._renderText(encodedLines[0], font, fontSize, totalWidth, alignment, prevInfo, defaultHPadding, bottomPadding);
+    return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC";
+  }
+  static async _getFontData(evaluator, task, appearanceData, resources) {
+    const operatorList = new OperatorList();
+    const initialState = {
+      font: null,
+      clone() {
+        return this;
+      }
+    };
+    const {
+      fontName,
+      fontSize
+    } = appearanceData;
+    await evaluator.handleSetFont(resources, [fontName && Name.get(fontName), fontSize], null, operatorList, task, initialState, null);
+    return initialState.font;
+  }
+  _getTextWidth(text, font) {
+    return Math.sumPrecise(font.charsToGlyphs(text).map(g => g.width)) / 1000;
+  }
+  _computeFontSize(height, width, text, font, lineCount) {
+    let {
+      fontSize
+    } = this.data.defaultAppearanceData;
+    let lineHeight = (fontSize || 12) * LINE_FACTOR,
+      numberOfLines = Math.round(height / lineHeight);
+    if (!fontSize) {
+      const roundWithTwoDigits = x => Math.floor(x * 100) / 100;
+      if (lineCount === -1) {
+        const textWidth = this._getTextWidth(text, font);
+        fontSize = roundWithTwoDigits(Math.min(height / LINE_FACTOR, width / textWidth));
+        numberOfLines = 1;
+      } else {
+        const lines = text.split(/\r\n?|\n/);
+        const cachedLines = [];
+        for (const line of lines) {
+          const encoded = font.encodeString(line).join("");
+          const glyphs = font.charsToGlyphs(encoded);
+          const positions = font.getCharPositions(encoded);
+          cachedLines.push({
+            line: encoded,
+            glyphs,
+            positions
+          });
+        }
+        const isTooBig = fsize => {
+          let totalHeight = 0;
+          for (const cache of cachedLines) {
+            const chunks = this._splitLine(null, font, fsize, width, cache);
+            totalHeight += chunks.length * fsize;
+            if (totalHeight > height) {
+              return true;
+            }
+          }
+          return false;
+        };
+        numberOfLines = Math.max(numberOfLines, lineCount);
+        while (true) {
+          lineHeight = height / numberOfLines;
+          fontSize = roundWithTwoDigits(lineHeight / LINE_FACTOR);
+          if (isTooBig(fontSize)) {
+            numberOfLines++;
+            continue;
+          }
+          break;
+        }
+      }
+      const {
+        fontName,
+        fontColor
+      } = this.data.defaultAppearanceData;
+      this._defaultAppearance = createDefaultAppearance({
+        fontSize,
+        fontName,
+        fontColor
+      });
+    }
+    return [this._defaultAppearance, fontSize, height / numberOfLines];
+  }
+  _renderText(text, font, fontSize, totalWidth, alignment, prevInfo, hPadding, vPadding) {
+    let shift;
+    if (alignment === 1) {
+      const width = this._getTextWidth(text, font) * fontSize;
+      shift = (totalWidth - width) / 2;
+    } else if (alignment === 2) {
+      const width = this._getTextWidth(text, font) * fontSize;
+      shift = totalWidth - width - hPadding;
+    } else {
+      shift = hPadding;
+    }
+    const shiftStr = numberToString(shift - prevInfo.shift);
+    prevInfo.shift = shift;
+    vPadding = numberToString(vPadding);
+    return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`;
+  }
+  _getSaveFieldResources(xref) {
+    const {
+      localResources,
+      appearanceResources,
+      acroFormResources
+    } = this._fieldResources;
+    const fontName = this.data.defaultAppearanceData?.fontName;
+    if (!fontName) {
+      return localResources || Dict.empty;
+    }
+    for (const resources of [localResources, appearanceResources]) {
+      if (resources instanceof Dict) {
+        const localFont = resources.get("Font");
+        if (localFont instanceof Dict && localFont.has(fontName)) {
+          return resources;
+        }
+      }
+    }
+    if (acroFormResources instanceof Dict) {
+      const acroFormFont = acroFormResources.get("Font");
+      if (acroFormFont instanceof Dict && acroFormFont.has(fontName)) {
+        const subFontDict = new Dict(xref);
+        subFontDict.set(fontName, acroFormFont.getRaw(fontName));
+        const subResourcesDict = new Dict(xref);
+        subResourcesDict.set("Font", subFontDict);
+        return Dict.merge({
+          xref,
+          dictArray: [subResourcesDict, localResources],
+          mergeSubDicts: true
+        });
+      }
+    }
+    return localResources || Dict.empty;
+  }
+  getFieldObject() {
+    return null;
+  }
+}
+class TextWidgetAnnotation extends WidgetAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict
+    } = params;
+    if (dict.has("PMD")) {
+      this.flags |= AnnotationFlag.HIDDEN;
+      this.data.hidden = true;
+      warn("Barcodes are not supported");
+    }
+    this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML;
+    this._hasText = true;
+    if (typeof this.data.fieldValue !== "string") {
+      this.data.fieldValue = "";
+    }
+    let alignment = getInheritableProperty({
+      dict,
+      key: "Q"
+    });
+    if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {
+      alignment = null;
+    }
+    this.data.textAlignment = alignment;
+    let maximumLength = getInheritableProperty({
+      dict,
+      key: "MaxLen"
+    });
+    if (!Number.isInteger(maximumLength) || maximumLength < 0) {
+      maximumLength = 0;
+    }
+    this.data.maxLen = maximumLength;
+    this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE);
+    this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.data.multiLine && !this.data.password && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0;
+    this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL);
+    const {
+      data: {
+        actions
+      }
+    } = this;
+    if (!actions) {
+      return;
+    }
+    const AFDateTime = /^AF(Date|Time)_(?:Keystroke|Format)(?:Ex)?\(['"]?([^'"]+)['"]?\);$/;
+    let canUseHTMLDateTime = false;
+    if (actions.Format?.length === 1 && actions.Keystroke?.length === 1 && AFDateTime.test(actions.Format[0]) && AFDateTime.test(actions.Keystroke[0]) || actions.Format?.length === 0 && actions.Keystroke?.length === 1 && AFDateTime.test(actions.Keystroke[0]) || actions.Keystroke?.length === 0 && actions.Format?.length === 1 && AFDateTime.test(actions.Format[0])) {
+      canUseHTMLDateTime = true;
+    }
+    const actionsToVisit = [];
+    if (actions.Format) {
+      actionsToVisit.push(...actions.Format);
+    }
+    if (actions.Keystroke) {
+      actionsToVisit.push(...actions.Keystroke);
+    }
+    if (canUseHTMLDateTime) {
+      delete actions.Keystroke;
+      actions.Format = actionsToVisit;
+    }
+    for (const formatAction of actionsToVisit) {
+      const m = formatAction.match(AFDateTime);
+      if (!m) {
+        continue;
+      }
+      const isDate = m[1] === "Date";
+      let format = m[2];
+      const num = parseInt(format, 10);
+      if (!isNaN(num) && Math.floor(Math.log10(num)) + 1 === m[2].length) {
+        format = (isDate ? DateFormats : TimeFormats)[num] ?? format;
+      }
+      this.data.datetimeFormat = format;
+      if (!canUseHTMLDateTime) {
+        break;
+      }
+      if (isDate) {
+        if (/HH|MM|ss|h/.test(format)) {
+          this.data.datetimeType = "datetime-local";
+          this.data.timeStep = /ss/.test(format) ? 1 : 60;
+        } else {
+          this.data.datetimeType = "date";
+        }
+        break;
+      }
+      this.data.datetimeType = "time";
+      this.data.timeStep = /ss/.test(format) ? 1 : 60;
+      break;
+    }
+  }
+  get hasTextContent() {
+    return !!this.appearance && !this._needAppearances;
+  }
+  _getCombAppearance(defaultAppearance, font, text, fontSize, width, height, alignment, isRTL, annotationStorage) {
+    const combWidth = width / this.data.maxLen;
+    const colors = this.getBorderAndBackgroundAppearances(annotationStorage);
+    const cells = font.getCharPositions(text).map(([start, end]) => {
+      const glyph = text.substring(start, end);
+      return {
+        glyph,
+        width: this._getTextWidth(glyph, font) * fontSize
+      };
+    });
+    if (isRTL) {
+      cells.reverse();
+    }
+    const textWidth = combWidth * cells.length;
+    let hShift = 0;
+    if (alignment === 1) {
+      hShift += Math.floor((width - textWidth) / (2 * combWidth)) * combWidth;
+    } else if (alignment === 2) {
+      hShift += width - textWidth;
+    }
+    const buf = [];
+    let previousWidth = 0;
+    for (let i = 0, ii = cells.length; i < ii; i++) {
+      const {
+        glyph,
+        width: glyphWidth
+      } = cells[i];
+      const shift = i === 0 ? (combWidth - glyphWidth) / 2 : combWidth + (previousWidth - glyphWidth) / 2;
+      buf.push(`${numberToString(shift)} 0 Td (${escapeString(glyph)}) Tj`);
+      previousWidth = glyphWidth;
+    }
+    const renderedComb = buf.join(" ");
+    const vShift = (height - (font.capHeight || font.ascent || 1) * fontSize) / 2;
+    return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(hShift)} ${numberToString(vShift)} Tm ${renderedComb}` + " ET Q EMC";
+  }
+  _getMultilineAppearance(defaultAppearance, lines, font, fontSize, width, height, alignment, hPadding, vPadding, descent, lineHeight, annotationStorage) {
+    const buf = [];
+    const totalWidth = width - 2 * hPadding;
+    const prevInfo = {
+      shift: 0
+    };
+    for (let i = 0, ii = lines.length; i < ii; i++) {
+      const line = lines[i];
+      const chunks = this._splitLine(line, font, fontSize, totalWidth);
+      for (let j = 0, jj = chunks.length; j < jj; j++) {
+        const chunk = chunks[j];
+        const vShift = i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight;
+        buf.push(this._renderText(chunk, font, fontSize, width, alignment, prevInfo, hPadding, vShift));
+      }
+    }
+    const colors = this.getBorderAndBackgroundAppearances(annotationStorage);
+    const renderedText = buf.join("\n");
+    return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 ${numberToString(height)} Tm ${renderedText}` + " ET Q EMC";
+  }
+  _splitLine(line, font, fontSize, width, cache = {}) {
+    line = cache.line || line;
+    const glyphs = cache.glyphs || font.charsToGlyphs(line);
+    if (glyphs.length <= 1) {
+      return [line];
+    }
+    const positions = cache.positions || font.getCharPositions(line);
+    const scale = fontSize / 1000;
+    const chunks = [];
+    let lastSpacePosInStringStart = -1,
+      lastSpacePosInStringEnd = -1,
+      lastSpacePos = -1,
+      startChunk = 0,
+      currentWidth = 0;
+    for (let i = 0, ii = glyphs.length; i < ii; i++) {
+      const [start, end] = positions[i];
+      const glyph = glyphs[i];
+      const glyphWidth = glyph.width * scale;
+      if (glyph.unicode === " ") {
+        if (currentWidth + glyphWidth > width) {
+          chunks.push(line.substring(startChunk, start));
+          startChunk = start;
+          currentWidth = glyphWidth;
+          lastSpacePosInStringStart = -1;
+          lastSpacePos = -1;
+        } else {
+          currentWidth += glyphWidth;
+          lastSpacePosInStringStart = start;
+          lastSpacePosInStringEnd = end;
+          lastSpacePos = i;
+        }
+      } else if (currentWidth + glyphWidth > width) {
+        if (lastSpacePosInStringStart !== -1) {
+          chunks.push(line.substring(startChunk, lastSpacePosInStringEnd));
+          startChunk = lastSpacePosInStringEnd;
+          i = lastSpacePos + 1;
+          lastSpacePosInStringStart = -1;
+          currentWidth = 0;
+        } else {
+          chunks.push(line.substring(startChunk, start));
+          startChunk = start;
+          currentWidth = glyphWidth;
+        }
+      } else {
+        currentWidth += glyphWidth;
+      }
+    }
+    if (startChunk < line.length) {
+      chunks.push(line.substring(startChunk));
+    }
+    return chunks;
+  }
+  async extractTextContent(evaluator, task, viewBox) {
+    await super.extractTextContent(evaluator, task, viewBox);
+    const text = this.data.textContent;
+    if (!text) {
+      return;
+    }
+    const allText = text.join("\n");
+    if (allText === this.data.fieldValue) {
+      return;
+    }
+    const regex = allText.replaceAll(/([.*+?^${}()|[\]\\])|(\s+)/g, (_m, p1) => p1 ? `\\${p1}` : "\\s+");
+    if (new RegExp(`^\\s*${regex}\\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(params) {
+    super(params);
+    this.checkedAppearance = null;
+    this.uncheckedAppearance = null;
+    const isRadio = this.hasFieldFlag(AnnotationFieldFlag.RADIO),
+      isPushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);
+    this.data.checkBox = !isRadio && !isPushButton;
+    this.data.radioButton = isRadio && !isPushButton;
+    this.data.pushButton = isPushButton;
+    this.data.isTooltipOnly = false;
+    this.data.hasOwnCanvas = true;
+    this.data.noHTML = false;
+    if (this.data.checkBox) {
+      this._processCheckBox(params);
+    } else if (this.data.radioButton) {
+      this._processRadioButton(params);
+    } else if (this.data.pushButton) {
+      this._processPushButton(params);
+    } else {
+      warn("Invalid field flags for button widget annotation");
+    }
+  }
+  get _ownCanvasRequiresForms() {
+    return this.data.checkBox || this.data.radioButton;
+  }
+  #getOperatorListForAppearance(evaluator, task, intent, annotationStorage, rotation, appearance) {
+    if (!appearance) {
+      return this._getOperatorListNoAppearance();
+    }
+    const savedAppearance = this.appearance;
+    const savedMatrix = lookupMatrix(appearance.dict.getArray("Matrix"), IDENTITY_MATRIX);
+    if (rotation) {
+      appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage));
+    }
+    this.appearance = appearance;
+    const operatorList = super.getOperatorList(evaluator, task, intent, annotationStorage);
+    this.appearance = savedAppearance;
+    appearance.dict.set("Matrix", savedMatrix);
+    return operatorList;
+  }
+  async getOperatorList(evaluator, task, intent, annotationStorage) {
+    if (this.data.pushButton) {
+      return super.getOperatorList(evaluator, task, intent, false, annotationStorage);
+    }
+    if (intent & RenderingIntentFlag.DISPLAY && intent & RenderingIntentFlag.ANNOTATIONS_FORMS && (this.data.checkBox || this.data.radioButton)) {
+      const setCanvasName = (operatorList, name) => {
+        const index = operatorList.fnArray.indexOf(OPS.beginAnnotation);
+        if (index !== -1) {
+          operatorList.argsArray[index].push(name);
+        }
+      };
+      const checked = await this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, null, this.checkedAppearance);
+      setCanvasName(checked.opList, "checked");
+      const unchecked = await this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, null, this.uncheckedAppearance);
+      setCanvasName(unchecked.opList, "unchecked");
+      checked.opList.addOpList(unchecked.opList);
+      checked.separateForm ||= unchecked.separateForm;
+      checked.separateCanvas ||= unchecked.separateCanvas;
+      return checked;
+    }
+    let value = null;
+    let rotation = null;
+    if (annotationStorage) {
+      const storageEntry = annotationStorage.get(this.data.id);
+      value = storageEntry ? storageEntry.value : null;
+      rotation = storageEntry ? storageEntry.rotation : null;
+    }
+    if (value === null && this.appearance) {
+      return super.getOperatorList(evaluator, task, intent, annotationStorage);
+    }
+    if (value === null || value === undefined) {
+      value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue;
+    }
+    return this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, rotation, value ? this.checkedAppearance : this.uncheckedAppearance);
+  }
+  async save(evaluator, task, annotationStorage, changes) {
+    if (this.data.checkBox) {
+      this._saveCheckbox(evaluator, task, annotationStorage, changes);
+      return;
+    }
+    if (this.data.radioButton) {
+      this._saveRadioButton(evaluator, task, annotationStorage, changes);
+    }
+  }
+  async _saveCheckbox(evaluator, task, annotationStorage, changes) {
+    if (!annotationStorage) {
+      return;
+    }
+    const storageEntry = annotationStorage.get(this.data.id);
+    const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);
+    let rotation = storageEntry?.rotation,
+      value = storageEntry?.value;
+    if (rotation === undefined && flags === undefined) {
+      if (value === undefined) {
+        return;
+      }
+      const defaultValue = this.data.fieldValue === this.data.exportValue;
+      if (defaultValue === value) {
+        return;
+      }
+    }
+    let dict = evaluator.xref.fetchIfRef(this.ref);
+    if (!(dict instanceof Dict)) {
+      return;
+    }
+    dict = dict.clone();
+    if (rotation === undefined) {
+      rotation = this.rotation;
+    }
+    if (value === undefined) {
+      value = this.data.fieldValue === this.data.exportValue;
+    }
+    const xfa = {
+      path: this.data.fieldName,
+      value: value ? this.data.exportValue : ""
+    };
+    const name = Name.get(value ? this._onStateName : "Off");
+    this.setValue(dict, name, evaluator.xref, changes);
+    dict.set("AS", name);
+    dict.set("M", `D:${getModificationDate()}`);
+    if (flags !== undefined) {
+      dict.set("F", flags);
+    }
+    const maybeMK = this._getMKDict(rotation);
+    if (maybeMK) {
+      dict.set("MK", maybeMK);
+    }
+    changes.put(this.ref, {
+      data: dict,
+      xfa,
+      needAppearances: false
+    });
+  }
+  async _saveRadioButton(evaluator, task, annotationStorage, changes) {
+    if (!annotationStorage) {
+      return;
+    }
+    const storageEntry = annotationStorage.get(this.data.id);
+    const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);
+    let rotation = storageEntry?.rotation,
+      value = storageEntry?.value;
+    if (rotation === undefined && flags === undefined) {
+      if (value === undefined) {
+        return;
+      }
+      const defaultValue = this.data.fieldValue === this.data.buttonValue;
+      if (defaultValue === value) {
+        return;
+      }
+    }
+    let dict = evaluator.xref.fetchIfRef(this.ref);
+    if (!(dict instanceof Dict)) {
+      return;
+    }
+    dict = dict.clone();
+    if (value === undefined) {
+      value = this.data.fieldValue === this.data.buttonValue;
+    }
+    if (rotation === undefined) {
+      rotation = this.rotation;
+    }
+    const xfa = {
+      path: this.data.fieldName,
+      value: value ? this.data.buttonValue : ""
+    };
+    const name = Name.get(value ? this._onStateName : "Off");
+    if (value) {
+      this.setValue(dict, name, evaluator.xref, changes);
+    }
+    dict.set("AS", name);
+    dict.set("M", `D:${getModificationDate()}`);
+    if (flags !== undefined) {
+      dict.set("F", flags);
+    }
+    const maybeMK = this._getMKDict(rotation);
+    if (maybeMK) {
+      dict.set("MK", maybeMK);
+    }
+    changes.put(this.ref, {
+      data: dict,
+      xfa,
+      needAppearances: false
+    });
+  }
+  _getDefaultCheckedAppearance(params, type) {
+    const {
+      width,
+      height
+    } = this;
+    const bbox = [0, 0, width, height];
+    const FONT_RATIO = 0.8;
+    const fontSize = Math.min(width, height) * FONT_RATIO;
+    let metrics, char;
+    if (type === "check") {
+      metrics = {
+        width: 0.755 * fontSize,
+        height: 0.705 * fontSize
+      };
+      char = "\x33";
+    } else if (type === "disc") {
+      metrics = {
+        width: 0.791 * fontSize,
+        height: 0.705 * fontSize
+      };
+      char = "\x6C";
+    } else {
+      unreachable(`_getDefaultCheckedAppearance - unsupported type: ${type}`);
+    }
+    const xShift = numberToString((width - metrics.width) / 2);
+    const yShift = numberToString((height - metrics.height) / 2);
+    const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`;
+    const appearanceStreamDict = new Dict(params.xref);
+    appearanceStreamDict.set("FormType", 1);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    appearanceStreamDict.setIfName("Type", "XObject");
+    appearanceStreamDict.set("BBox", bbox);
+    appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]);
+    appearanceStreamDict.set("Length", appearance.length);
+    const resources = new Dict(params.xref);
+    const font = new Dict(params.xref);
+    font.set("PdfJsZaDb", this.fallbackFontDict);
+    resources.set("Font", font);
+    appearanceStreamDict.set("Resources", resources);
+    this.checkedAppearance = new StringStream(appearance, appearanceStreamDict);
+    this._streams.push(this.checkedAppearance);
+  }
+  _getOnStateName(dict) {
+    const appearanceStates = dict.get("AP");
+    if (!(appearanceStates instanceof Dict)) {
+      return null;
+    }
+    const normalAppearance = appearanceStates.get("N");
+    if (!(normalAppearance instanceof Dict)) {
+      return null;
+    }
+    for (const key of normalAppearance.getKeys()) {
+      if (key !== "Off") {
+        return key;
+      }
+    }
+    return null;
+  }
+  _getExportValueForOptIndex(index, opt, xref) {
+    if (Number.isInteger(index) && index >= 0 && index < opt.length) {
+      const value = this._decodeFormValue(xref.fetchIfRef(opt[index]));
+      if (typeof value === "string") {
+        return value;
+      }
+    }
+    return null;
+  }
+  _getOptInfo(dict, onState, opt, xref) {
+    if (!Array.isArray(opt)) {
+      return null;
+    }
+    const stateToIndex = new Map();
+    let currentIndex = null;
+    const fieldParent = dict.get("Parent");
+    const kids = fieldParent instanceof Dict ? fieldParent.get("Kids") : null;
+    if (Array.isArray(kids)) {
+      for (let i = 0, ii = Math.min(kids.length, opt.length); i < ii; i++) {
+        const kid = kids[i];
+        if (kid instanceof Ref && isRefsEqual(kid, this.ref)) {
+          currentIndex = i;
+        }
+        const kidDict = xref.fetchIfRef(kid);
+        if (!(kidDict instanceof Dict)) {
+          continue;
+        }
+        if (kidDict === dict) {
+          currentIndex = i;
+        }
+        const kidOnState = this._getOnStateName(kidDict);
+        if (typeof kidOnState === "string" && !stateToIndex.has(kidOnState)) {
+          stateToIndex.set(kidOnState, i);
+        }
+      }
+    } else if (opt.length === 1 && typeof onState === "string") {
+      currentIndex = 0;
+      stateToIndex.set(onState, 0);
+    }
+    return {
+      currentIndex,
+      opt,
+      stateToIndex
+    };
+  }
+  _getExportValue(state, optInfo, xref) {
+    if (!optInfo || typeof state !== "string" || state === "Off") {
+      return state;
+    }
+    if (state === this._onStateName) {
+      const exportValue = this._getExportValueForOptIndex(optInfo.currentIndex, optInfo.opt, xref);
+      if (exportValue !== null) {
+        return exportValue;
+      }
+    }
+    if (optInfo.stateToIndex.has(state)) {
+      const exportValue = this._getExportValueForOptIndex(optInfo.stateToIndex.get(state), optInfo.opt, xref);
+      if (exportValue !== null) {
+        return exportValue;
+      }
+    }
+    const index = parseInt(state, 10);
+    if (Number.isInteger(index) && String(index) === state) {
+      return this._getExportValueForOptIndex(index, optInfo.opt, xref) || state;
+    }
+    return state;
+  }
+  _processCheckBox(params) {
+    const customAppearance = params.dict.get("AP");
+    let normalAppearance = customAppearance instanceof Dict ? customAppearance.get("N") : null;
+    if (!(normalAppearance instanceof Dict)) {
+      normalAppearance = null;
+    }
+    const asValue = this._decodeFormValue(params.dict.get("AS"));
+    if (typeof asValue === "string") {
+      this.data.fieldValue = asValue;
+    }
+    const yes = this.data.fieldValue !== null && this.data.fieldValue !== "Off" ? this.data.fieldValue : "Yes";
+    const exportValues = normalAppearance ? [...normalAppearance.getKeys()] : [];
+    if (exportValues.length === 0) {
+      exportValues.push("Off", yes);
+    } else if (exportValues.length === 1) {
+      if (exportValues[0] === "Off") {
+        exportValues.push(yes);
+      } else {
+        exportValues.unshift("Off");
+      }
+    } else if (exportValues.includes(yes)) {
+      exportValues.length = 0;
+      exportValues.push("Off", yes);
+    } else {
+      const otherYes = exportValues.find(v => v !== "Off");
+      exportValues.length = 0;
+      exportValues.push("Off", otherYes);
+    }
+    const onState = exportValues[1];
+    this._onStateName = onState;
+    const opt = getInheritableProperty({
+      dict: params.dict,
+      key: "Opt"
+    });
+    const optInfo = this._getOptInfo(params.dict, onState, opt, params.xref);
+    this.data.exportValue = this._getExportValue(onState, optInfo, params.xref);
+    if (!exportValues.includes(this.data.fieldValue) && this.data.fieldValue !== this.data.exportValue) {
+      this.data.fieldValue = "Off";
+    }
+    this.data.fieldValue = this._getExportValue(this.data.fieldValue, optInfo, params.xref);
+    this.data.defaultFieldValue = this._getExportValue(this.data.defaultFieldValue, optInfo, params.xref);
+    const checkedAppearance = normalAppearance?.get(onState);
+    this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null;
+    const uncheckedAppearance = normalAppearance?.get("Off");
+    this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null;
+    if (this.checkedAppearance) {
+      this._streams.push(this.checkedAppearance);
+    } else {
+      this._getDefaultCheckedAppearance(params, "check");
+    }
+    if (this.uncheckedAppearance) {
+      this._streams.push(this.uncheckedAppearance);
+    }
+    this._fallbackFontDict = this.fallbackFontDict;
+    if (this.data.defaultFieldValue === null) {
+      this.data.defaultFieldValue = "Off";
+    }
+  }
+  _processRadioButton(params) {
+    this.data.buttonValue = null;
+    const fieldParent = params.dict.get("Parent");
+    if (fieldParent instanceof Dict) {
+      this.parent = params.dict.getRaw("Parent");
+      const fieldParentValue = fieldParent.get("V");
+      if (fieldParentValue instanceof Name) {
+        this.data.fieldValue = this._decodeFormValue(fieldParentValue);
+      }
+    }
+    const appearanceStates = params.dict.get("AP");
+    if (!(appearanceStates instanceof Dict)) {
+      return;
+    }
+    const normalAppearance = appearanceStates.get("N");
+    if (!(normalAppearance instanceof Dict)) {
+      return;
+    }
+    let onState = null;
+    for (const key of normalAppearance.getKeys()) {
+      if (key !== "Off") {
+        onState = key;
+        break;
+      }
+    }
+    this._onStateName = onState;
+    const opt = getInheritableProperty({
+      dict: params.dict,
+      key: "Opt"
+    });
+    const optInfo = this._getOptInfo(params.dict, onState, opt, params.xref);
+    this.data.buttonValue = this._getExportValue(onState, optInfo, params.xref);
+    this.data.fieldValue = this._getExportValue(this.data.fieldValue, optInfo, params.xref);
+    this.data.defaultFieldValue = this._getExportValue(this.data.defaultFieldValue, optInfo, params.xref);
+    const checkedAppearance = normalAppearance.get(onState);
+    this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null;
+    const uncheckedAppearance = normalAppearance.get("Off");
+    this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null;
+    if (this.checkedAppearance) {
+      this._streams.push(this.checkedAppearance);
+    } else {
+      this._getDefaultCheckedAppearance(params, "disc");
+    }
+    if (this.uncheckedAppearance) {
+      this._streams.push(this.uncheckedAppearance);
+    }
+    this._fallbackFontDict = this.fallbackFontDict;
+    if (this.data.defaultFieldValue === null) {
+      this.data.defaultFieldValue = "Off";
+    }
+  }
+  _processPushButton(params) {
+    const {
+      dict,
+      annotationGlobals
+    } = params;
+    if (!dict.has("A") && !dict.has("AA") && !this.data.alternativeText) {
+      warn("Push buttons without action dictionaries are not supported");
+      return;
+    }
+    this.data.isTooltipOnly = !dict.has("A") && !dict.has("AA");
+    Catalog.parseDestDictionary({
+      destDict: dict,
+      resultObj: this.data,
+      docBaseUrl: annotationGlobals.baseUrl,
+      docAttachments: annotationGlobals.attachments
+    });
+  }
+  getFieldObject() {
+    let type = "button";
+    let exportValues;
+    if (this.data.checkBox) {
+      type = "checkbox";
+      exportValues = this.data.exportValue;
+    } else if (this.data.radioButton) {
+      type = "radiobutton";
+      exportValues = this.data.buttonValue;
+    }
+    return {
+      id: this.data.id,
+      value: this.data.fieldValue || "Off",
+      defaultValue: this.data.defaultFieldValue,
+      exportValues,
+      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
+    };
+  }
+  get fallbackFontDict() {
+    const dict = new Dict();
+    dict.setIfName("BaseFont", "ZapfDingbats");
+    dict.setIfName("Type", "FallbackType");
+    dict.setIfName("Subtype", "FallbackType");
+    dict.setIfName("Encoding", "ZapfDingbatsEncoding");
+    return shadow(this, "fallbackFontDict", dict);
+  }
+}
+class ChoiceWidgetAnnotation extends WidgetAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    this.indices = dict.getArray("I");
+    this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0;
+    this.data.options = [];
+    const options = getInheritableProperty({
+      dict,
+      key: "Opt"
+    });
+    if (Array.isArray(options)) {
+      for (let i = 0, ii = options.length; i < ii; i++) {
+        const option = xref.fetchIfRef(options[i]);
+        const isOptionArray = Array.isArray(option);
+        this.data.options[i] = {
+          exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option),
+          displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option)
+        };
+      }
+    }
+    if (!this.hasIndices) {
+      if (typeof this.data.fieldValue === "string") {
+        this.data.fieldValue = [this.data.fieldValue];
+      } else {
+        this.data.fieldValue ||= [];
+      }
+    } else {
+      this.data.fieldValue = [];
+      const ii = this.data.options.length;
+      for (const i of this.indices) {
+        if (Number.isInteger(i) && i >= 0 && i < ii) {
+          this.data.fieldValue.push(this.data.options[i].exportValue);
+        }
+      }
+    }
+    if (this.data.options.length === 0 && this.data.fieldValue.length > 0) {
+      this.data.options = this.data.fieldValue.map(value => ({
+        exportValue: value,
+        displayValue: value
+      }));
+    }
+    this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO);
+    this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT);
+    this._hasText = true;
+  }
+  getFieldObject() {
+    const type = this.data.combo ? "combobox" : "listbox";
+    const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null;
+    return {
+      id: this.data.id,
+      value,
+      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
+    };
+  }
+  amendSavedDict(annotationStorage, dict) {
+    if (!this.hasIndices) {
+      return;
+    }
+    let values = annotationStorage?.get(this.data.id)?.value;
+    if (!Array.isArray(values)) {
+      values = [values];
+    }
+    const indices = [];
+    const {
+      options
+    } = this.data;
+    for (let i = 0, j = 0, ii = options.length; i < ii; i++) {
+      if (options[i].exportValue === values[j]) {
+        indices.push(i);
+        j += 1;
+      }
+    }
+    dict.set("I", indices);
+  }
+  async _getAppearance(evaluator, task, intent, annotationStorage) {
+    if (this.data.combo) {
+      return super._getAppearance(evaluator, task, intent, annotationStorage);
+    }
+    let exportedValue, rotation;
+    const storageEntry = annotationStorage?.get(this.data.id);
+    if (storageEntry) {
+      rotation = storageEntry.rotation;
+      exportedValue = storageEntry.value;
+    }
+    if (rotation === undefined && exportedValue === undefined && !this._needAppearances) {
+      return null;
+    }
+    if (exportedValue === undefined) {
+      exportedValue = this.data.fieldValue;
+    } else if (!Array.isArray(exportedValue)) {
+      exportedValue = [exportedValue];
+    }
+    const defaultPadding = 1;
+    const defaultHPadding = 2;
+    let {
+      width: totalWidth,
+      height: totalHeight
+    } = this;
+    if (rotation === 90 || rotation === 270) {
+      [totalWidth, totalHeight] = [totalHeight, totalWidth];
+    }
+    const lineCount = this.data.options.length;
+    const valueIndices = [];
+    for (let i = 0; i < lineCount; i++) {
+      const {
+        exportValue
+      } = this.data.options[i];
+      if (exportedValue.includes(exportValue)) {
+        valueIndices.push(i);
+      }
+    }
+    if (!this._defaultAppearance) {
+      this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g");
+    }
+    const font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources);
+    let defaultAppearance;
+    let {
+      fontSize
+    } = this.data.defaultAppearanceData;
+    if (!fontSize) {
+      const lineHeight = (totalHeight - defaultPadding) / lineCount;
+      let lineWidth = -1;
+      let value;
+      for (const {
+        displayValue
+      } of this.data.options) {
+        const width = this._getTextWidth(displayValue, font);
+        if (width > lineWidth) {
+          lineWidth = width;
+          value = displayValue;
+        }
+      }
+      [defaultAppearance, fontSize] = this._computeFontSize(lineHeight, totalWidth - 2 * defaultHPadding, value, font, -1);
+    } else {
+      defaultAppearance = this._defaultAppearance;
+    }
+    const lineHeight = fontSize * LINE_FACTOR;
+    const vPadding = (lineHeight - fontSize) / 2;
+    const numberOfVisibleLines = Math.floor(totalHeight / lineHeight);
+    let firstIndex = 0;
+    if (valueIndices.length > 0) {
+      const minIndex = Math.min(...valueIndices);
+      const maxIndex = Math.max(...valueIndices);
+      firstIndex = Math.max(0, maxIndex - numberOfVisibleLines + 1);
+      if (firstIndex > minIndex) {
+        firstIndex = minIndex;
+      }
+    }
+    const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount);
+    const buf = ["/Tx BMC q", `1 1 ${totalWidth} ${totalHeight} re W n`];
+    if (valueIndices.length) {
+      buf.push("0.600006 0.756866 0.854904 rg");
+      for (const index of valueIndices) {
+        if (firstIndex <= index && index < end) {
+          buf.push(`1 ${totalHeight - (index - firstIndex + 1) * lineHeight} ${totalWidth} ${lineHeight} re f`);
+        }
+      }
+    }
+    buf.push("BT", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`);
+    const prevInfo = {
+      shift: 0
+    };
+    for (let i = firstIndex; i < end; i++) {
+      const {
+        displayValue
+      } = this.data.options[i];
+      const vpadding = i === firstIndex ? vPadding : 0;
+      buf.push(this._renderText(displayValue, font, fontSize, totalWidth, 0, prevInfo, defaultHPadding, -lineHeight + vpadding));
+    }
+    buf.push("ET Q EMC");
+    return buf.join("\n");
+  }
+}
+class SignatureWidgetAnnotation extends WidgetAnnotation {
+  constructor(params) {
+    super(params);
+    this.data.fieldValue = null;
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.noHTML = !this.data.hasOwnCanvas;
+  }
+  getFieldObject() {
+    return {
+      id: this.data.id,
+      value: null,
+      page: this.data.pageIndex,
+      type: "signature"
+    };
+  }
+}
+class TextAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    const DEFAULT_ICON_SIZE = 22;
+    super(params);
+    this.data.noRotate = true;
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.noHTML = false;
+    const {
+      dict
+    } = params;
+    if (this.data.hasAppearance) {
+      this.data.name = "NoIcon";
+    } else {
+      this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;
+      this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;
+      this.data.name = dict.has("Name") ? dict.get("Name").name : "Note";
+    }
+    if (dict.has("State")) {
+      this.data.state = dict.get("State") || null;
+      this.data.stateModel = dict.get("StateModel") || null;
+    } else {
+      this.data.state = null;
+      this.data.stateModel = null;
+    }
+  }
+}
+class LinkAnnotation extends Annotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      annotationGlobals
+    } = params;
+    this.data.noHTML = false;
+    const quadPoints = getQuadPoints(dict, this.rectangle);
+    if (quadPoints) {
+      this.data.quadPoints = quadPoints;
+    }
+    this.data.borderColor ||= this.data.color;
+    Catalog.parseDestDictionary({
+      destDict: dict,
+      resultObj: this.data,
+      docBaseUrl: annotationGlobals.baseUrl,
+      docAttachments: annotationGlobals.attachments
+    });
+  }
+  get overlaysTextContent() {
+    return true;
+  }
+}
+class PopupAnnotation extends Annotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict
+    } = params;
+    this.data.noHTML = false;
+    if (this.width === 0 || this.height === 0) {
+      this.data.rect = null;
+    }
+    let parentItem = dict.get("Parent");
+    if (!parentItem) {
+      warn("Popup annotation has a missing or invalid parent annotation.");
+      return;
+    }
+    this.data.parentRect = lookupNormalRect(parentItem.getArray("Rect"), null);
+    this.data.creationDate = parentItem.get("CreationDate") || "";
+    const rt = parentItem.get("RT");
+    if (isName(rt, AnnotationReplyType.GROUP)) {
+      parentItem = parentItem.get("IRT");
+    }
+    if (!parentItem.has("M")) {
+      this.data.modificationDate = null;
+    } else {
+      this.setModificationDate(parentItem.get("M"));
+      this.data.modificationDate = this.modificationDate;
+    }
+    if (!parentItem.has("C")) {
+      this.data.color = null;
+    } else {
+      this.setColor(parentItem.getArray("C"));
+      this.data.color = this.color;
+    }
+    if (!this.viewable) {
+      const parentFlags = parentItem.get("F");
+      if (this._isViewable(parentFlags)) {
+        this.setFlags(parentFlags);
+      }
+    }
+    this.setTitle(parentItem.get("T"));
+    this.data.titleObj = this._title;
+    this.setContents(parentItem.get("Contents"));
+    this.data.contentsObj = this._contents;
+    if (parentItem.has("RC")) {
+      this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get("RC"));
+    }
+    this.data.open = !!dict.get("Open");
+  }
+  static createNewDict(annotation, xref, _params) {
+    const {
+      oldAnnotation,
+      rect,
+      parent
+    } = annotation;
+    const popup = oldAnnotation || new Dict(xref);
+    popup.setIfNotExists("Type", Name.get("Annot"));
+    popup.setIfNotExists("Subtype", Name.get("Popup"));
+    popup.setIfNotExists("Open", false);
+    popup.setIfArray("Rect", rect);
+    popup.set("Parent", parent);
+    return popup;
+  }
+  static async createNewAppearanceStream(annotation, xref, params) {
+    return null;
+  }
+}
+class FreeTextAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.isEditable = !this.data.noHTML;
+    this.data.noHTML = false;
+    const {
+      annotationGlobals,
+      xref
+    } = params;
+    this.setDefaultAppearance(params);
+    this._hasAppearance = !!this.appearance;
+    if (this._hasAppearance) {
+      const {
+        fontColor,
+        fontSize
+      } = parseAppearanceStream(this.appearance, xref, annotationGlobals.globalColorSpaceCache);
+      this.data.defaultAppearanceData.fontColor = fontColor;
+      this.data.defaultAppearanceData.fontSize = fontSize || 10;
+    } else {
+      this.data.defaultAppearanceData.fontSize ||= 10;
+      const {
+        fontColor,
+        fontSize
+      } = this.data.defaultAppearanceData;
+      if (this._contents.str) {
+        this.data.textContent = this._contents.str.split(/\r\n?|\n/).map(line => line.trimEnd());
+        const {
+          coords,
+          bbox,
+          matrix
+        } = FakeUnicodeFont.getFirstPositionInfo(this.rectangle, this.rotation, fontSize);
+        this.data.textPosition = this._transformPoint(coords, bbox, matrix);
+      }
+      if (this._isOffscreenCanvasSupported) {
+        const strokeAlpha = params.dict.get("CA");
+        const fakeUnicodeFont = new FakeUnicodeFont(xref, "sans-serif");
+        this.appearance = fakeUnicodeFont.createAppearance(this._contents.str, this.rectangle, this.rotation, fontSize, fontColor, strokeAlpha);
+        this._streams.push(this.appearance);
+      } else {
+        warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly.");
+      }
+    }
+  }
+  get hasTextContent() {
+    return this._hasAppearance;
+  }
+  static createNewDict(annotation, xref, {
+    apRef,
+    ap
+  }) {
+    const {
+      color,
+      date,
+      fontSize,
+      oldAnnotation,
+      rect,
+      rotation,
+      user,
+      value
+    } = annotation;
+    const freetext = oldAnnotation || new Dict(xref);
+    freetext.setIfNotExists("Type", Name.get("Annot"));
+    freetext.setIfNotExists("Subtype", Name.get("FreeText"));
+    freetext.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`);
+    if (oldAnnotation) {
+      freetext.delete("RC");
+    }
+    freetext.setIfArray("Rect", rect);
+    const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`;
+    freetext.set("DA", da);
+    freetext.setIfDefined("Contents", stringToAsciiOrUTF16BE(value));
+    freetext.setIfNotExists("F", 4);
+    freetext.setIfNotExists("Border", [0, 0, 0]);
+    freetext.setIfNumber("Rotate", rotation);
+    freetext.setIfDefined("T", stringToAsciiOrUTF16BE(user));
+    if (apRef || ap) {
+      const n = new Dict(xref);
+      freetext.set("AP", n);
+      n.set("N", apRef || ap);
+    }
+    return freetext;
+  }
+  static async createNewAppearanceStream(annotation, xref, params) {
+    const {
+      baseFontRef,
+      evaluator,
+      task
+    } = params;
+    const {
+      color,
+      fontSize,
+      rect,
+      rotation,
+      value
+    } = annotation;
+    if (!color) {
+      return null;
+    }
+    const resources = new Dict(xref);
+    const font = new Dict(xref);
+    if (baseFontRef) {
+      font.set("Helv", baseFontRef);
+    } else {
+      const baseFont = new Dict(xref);
+      baseFont.setIfName("BaseFont", "Helvetica");
+      baseFont.setIfName("Type", "Font");
+      baseFont.setIfName("Subtype", "Type1");
+      baseFont.setIfName("Encoding", "WinAnsiEncoding");
+      font.set("Helv", baseFont);
+    }
+    resources.set("Font", font);
+    const helv = await WidgetAnnotation._getFontData(evaluator, task, {
+      fontName: "Helv",
+      fontSize
+    }, resources);
+    const [x1, y1, x2, y2] = rect;
+    let w = x2 - x1;
+    let h = y2 - y1;
+    if (rotation % 180 !== 0) {
+      [w, h] = [h, w];
+    }
+    const lines = value.split("\n");
+    const scale = fontSize / 1000;
+    let totalWidth = -Infinity;
+    const encodedLines = [];
+    for (let line of lines) {
+      const encoded = helv.encodeString(line);
+      if (encoded.length > 1) {
+        return null;
+      }
+      line = encoded.join("");
+      encodedLines.push(line);
+      let lineWidth = 0;
+      const glyphs = helv.charsToGlyphs(line);
+      for (const glyph of glyphs) {
+        lineWidth += glyph.width * scale;
+      }
+      totalWidth = Math.max(totalWidth, lineWidth);
+    }
+    const hscale = totalWidth > w ? w / totalWidth : 1;
+    let vscale = 1;
+    const lineHeight = LINE_FACTOR * fontSize;
+    const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize;
+    const totalHeight = lineHeight * lines.length;
+    if (totalHeight > h) {
+      vscale = h / totalHeight;
+    }
+    const fscale = Math.min(hscale, vscale);
+    const newFontSize = fontSize * fscale;
+    let firstPoint, clipBox, matrix;
+    switch (rotation) {
+      case 0:
+        matrix = [1, 0, 0, 1];
+        clipBox = [rect[0], rect[1], w, h];
+        firstPoint = [rect[0], rect[3] - lineAscent];
+        break;
+      case 90:
+        matrix = [0, 1, -1, 0];
+        clipBox = [rect[1], -rect[2], w, h];
+        firstPoint = [rect[1], -rect[0] - lineAscent];
+        break;
+      case 180:
+        matrix = [-1, 0, 0, -1];
+        clipBox = [-rect[2], -rect[3], w, h];
+        firstPoint = [-rect[2], -rect[1] - lineAscent];
+        break;
+      case 270:
+        matrix = [0, -1, 1, 0];
+        clipBox = [-rect[3], rect[0], w, h];
+        firstPoint = [-rect[3], rect[2] - lineAscent];
+        break;
+    }
+    const buffer = ["q", `${matrix.join(" ")} 0 0 cm`, `${clipBox.join(" ")} re W n`, `BT`, `${getPdfColor(color, true)}`, `0 Tc /Helv ${numberToString(newFontSize)} Tf`];
+    buffer.push(`${firstPoint.join(" ")} Td (${escapeString(encodedLines[0])}) Tj`);
+    const vShift = numberToString(lineHeight);
+    for (let i = 1, ii = encodedLines.length; i < ii; i++) {
+      const line = encodedLines[i];
+      buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`);
+    }
+    buffer.push("ET", "Q");
+    const appearance = buffer.join("\n");
+    const appearanceStreamDict = new Dict(xref);
+    appearanceStreamDict.set("FormType", 1);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    appearanceStreamDict.setIfName("Type", "XObject");
+    appearanceStreamDict.set("BBox", rect);
+    appearanceStreamDict.set("Resources", resources);
+    appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]);
+    return new StringStream(appearance, appearanceStreamDict);
+  }
+}
+class LineAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.noHTML = false;
+    const lineCoordinates = lookupRect(dict.getArray("L"), [0, 0, 0, 0]);
+    this.data.lineCoordinates = Util.normalizeRect(lineCoordinates);
+    this.setLineEndings(dict.getArray("LE"));
+    this.data.lineEndings = this.lineEndings;
+    if (!this.appearance) {
+      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);
+      const strokeAlpha = dict.get("CA");
+      const interiorColor = getRgbColor(dict.getArray("IC"), null);
+      const fillColor = getPdfColorArray(interiorColor);
+      const fillAlpha = fillColor ? strokeAlpha : null;
+      const borderWidth = this.borderStyle.width || 1,
+        borderAdjust = 2 * borderWidth;
+      const bbox = [this.data.lineCoordinates[0] - borderAdjust, this.data.lineCoordinates[1] - borderAdjust, this.data.lineCoordinates[2] + borderAdjust, this.data.lineCoordinates[3] + borderAdjust];
+      if (!Util.intersect(this.rectangle, bbox)) {
+        this.rectangle = bbox;
+      }
+      this._setDefaultAppearance({
+        xref,
+        extra: `${borderWidth} w`,
+        strokeColor,
+        fillColor,
+        strokeAlpha,
+        fillAlpha,
+        pointsCallback: (buffer, points) => {
+          buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S");
+          return [points[0] - borderWidth, points[7] - borderWidth, points[2] + borderWidth, points[3] + borderWidth];
+        }
+      });
+    }
+  }
+}
+class SquareAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.noHTML = false;
+    if (!this.appearance) {
+      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);
+      const strokeAlpha = dict.get("CA");
+      const interiorColor = getRgbColor(dict.getArray("IC"), null);
+      const fillColor = getPdfColorArray(interiorColor);
+      const fillAlpha = fillColor ? strokeAlpha : null;
+      if (this.borderStyle.width === 0 && !fillColor) {
+        return;
+      }
+      this._setDefaultAppearance({
+        xref,
+        extra: `${this.borderStyle.width} w`,
+        strokeColor,
+        fillColor,
+        strokeAlpha,
+        fillAlpha,
+        pointsCallback: (buffer, points) => {
+          const x = points[4] + this.borderStyle.width / 2;
+          const y = points[5] + this.borderStyle.width / 2;
+          const width = points[6] - points[4] - this.borderStyle.width;
+          const height = points[3] - points[7] - this.borderStyle.width;
+          buffer.push(`${x} ${y} ${width} ${height} re`);
+          if (fillColor) {
+            buffer.push("B");
+          } else {
+            buffer.push("S");
+          }
+          return [points[0], points[7], points[2], points[3]];
+        }
+      });
+    }
+  }
+}
+class CircleAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    if (!this.appearance) {
+      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);
+      const strokeAlpha = dict.get("CA");
+      const interiorColor = getRgbColor(dict.getArray("IC"), null);
+      const fillColor = getPdfColorArray(interiorColor);
+      const fillAlpha = fillColor ? strokeAlpha : null;
+      if (this.borderStyle.width === 0 && !fillColor) {
+        return;
+      }
+      const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4));
+      this._setDefaultAppearance({
+        xref,
+        extra: `${this.borderStyle.width} w`,
+        strokeColor,
+        fillColor,
+        strokeAlpha,
+        fillAlpha,
+        pointsCallback: (buffer, points) => {
+          const x0 = points[0] + this.borderStyle.width / 2;
+          const y0 = points[1] - this.borderStyle.width / 2;
+          const x1 = points[6] - this.borderStyle.width / 2;
+          const y1 = points[7] + this.borderStyle.width / 2;
+          const xMid = x0 + (x1 - x0) / 2;
+          const yMid = y0 + (y1 - y0) / 2;
+          const xOffset = (x1 - x0) / 2 * controlPointsDistance;
+          const yOffset = (y1 - y0) / 2 * controlPointsDistance;
+          buffer.push(`${xMid} ${y1} m`, `${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`, `${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`, `${xMid - xOffset} ${y0} ${x0} ${yMid - yOffset} ${x0} ${yMid} c`, `${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`, "h");
+          if (fillColor) {
+            buffer.push("B");
+          } else {
+            buffer.push("S");
+          }
+          return [points[0], points[7], points[2], points[3]];
+        }
+      });
+    }
+  }
+}
+class PolylineAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.noHTML = false;
+    this.data.vertices = null;
+    if (!(this instanceof PolygonAnnotation)) {
+      this.setLineEndings(dict.getArray("LE"));
+      this.data.lineEndings = this.lineEndings;
+    }
+    const rawVertices = dict.getArray("Vertices");
+    if (!isNumberArray(rawVertices, null)) {
+      return;
+    }
+    const vertices = this.data.vertices = Float32Array.from(rawVertices);
+    if (!this.appearance) {
+      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);
+      const strokeAlpha = dict.get("CA");
+      let fillColor = getRgbColor(dict.getArray("IC"), null);
+      if (fillColor) {
+        fillColor = getPdfColorArray(fillColor);
+      }
+      let operator;
+      if (fillColor) {
+        if (this.color) {
+          operator = fillColor.every((c, i) => c === strokeColor[i]) ? "f" : "B";
+        } else {
+          operator = "f";
+        }
+      } else {
+        operator = "S";
+      }
+      const borderWidth = this.borderStyle.width || 1,
+        borderAdjust = 2 * borderWidth;
+      const bbox = BBOX_INIT.slice();
+      for (let i = 0, ii = vertices.length; i < ii; i += 2) {
+        Util.rectBoundingBox(vertices[i] - borderAdjust, vertices[i + 1] - borderAdjust, vertices[i] + borderAdjust, vertices[i + 1] + borderAdjust, bbox);
+      }
+      if (!Util.intersect(this.rectangle, bbox)) {
+        this.rectangle = bbox;
+      }
+      this._setDefaultAppearance({
+        xref,
+        extra: `${borderWidth} w`,
+        strokeColor,
+        strokeAlpha,
+        fillColor,
+        fillAlpha: fillColor ? strokeAlpha : null,
+        pointsCallback: (buffer, points) => {
+          for (let i = 0, ii = vertices.length; i < ii; i += 2) {
+            buffer.push(`${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`);
+          }
+          buffer.push(operator);
+          return [points[0], points[7], points[2], points[3]];
+        }
+      });
+    }
+  }
+}
+class PolygonAnnotation extends PolylineAnnotation {}
+class CaretAnnotation extends MarkupAnnotation {}
+class InkAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.noHTML = false;
+    const {
+      dict,
+      xref
+    } = params;
+    this.data.inkLists = [];
+    this.data.isEditable = !this.data.noHTML;
+    this.data.noHTML = false;
+    this.data.opacity = dict.get("CA") || 1;
+    const rawInkLists = dict.getArray("InkList");
+    if (!Array.isArray(rawInkLists)) {
+      return;
+    }
+    for (let i = 0, ii = rawInkLists.length; i < ii; ++i) {
+      if (!Array.isArray(rawInkLists[i])) {
+        continue;
+      }
+      const inkList = new Float32Array(rawInkLists[i].length);
+      this.data.inkLists.push(inkList);
+      for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) {
+        const x = xref.fetchIfRef(rawInkLists[i][j]),
+          y = xref.fetchIfRef(rawInkLists[i][j + 1]);
+        if (typeof x === "number" && typeof y === "number") {
+          inkList[j] = x;
+          inkList[j + 1] = y;
+        }
+      }
+    }
+    if (!this.appearance) {
+      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);
+      const strokeAlpha = dict.get("CA");
+      const borderWidth = this.borderStyle.width || 1,
+        borderAdjust = 2 * borderWidth;
+      const bbox = BBOX_INIT.slice();
+      for (const inkList of this.data.inkLists) {
+        for (let i = 0, ii = inkList.length; i < ii; i += 2) {
+          Util.rectBoundingBox(inkList[i] - borderAdjust, inkList[i + 1] - borderAdjust, inkList[i] + borderAdjust, inkList[i + 1] + borderAdjust, bbox);
+        }
+      }
+      if (!Util.intersect(this.rectangle, bbox)) {
+        this.rectangle = bbox;
+      }
+      this._setDefaultAppearance({
+        xref,
+        extra: `${borderWidth} w`,
+        strokeColor,
+        strokeAlpha,
+        pointsCallback: (buffer, points) => {
+          for (const inkList of this.data.inkLists) {
+            for (let i = 0, ii = inkList.length; i < ii; i += 2) {
+              buffer.push(`${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`);
+            }
+            buffer.push("S");
+          }
+          return [points[0], points[7], points[2], points[3]];
+        }
+      });
+    }
+  }
+  static createNewDict(annotation, xref, {
+    apRef,
+    ap
+  }) {
+    const {
+      oldAnnotation,
+      color,
+      date,
+      opacity,
+      paths,
+      outlines,
+      rect,
+      rotation,
+      thickness,
+      user
+    } = annotation;
+    const ink = oldAnnotation || new Dict(xref);
+    ink.setIfNotExists("Type", Name.get("Annot"));
+    ink.setIfNotExists("Subtype", Name.get("Ink"));
+    ink.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`);
+    ink.setIfArray("Rect", rect);
+    ink.setIfArray("InkList", outlines?.points || paths?.points);
+    ink.setIfNotExists("F", 4);
+    ink.setIfNumber("Rotate", rotation);
+    ink.setIfDefined("T", stringToAsciiOrUTF16BE(user));
+    if (outlines) {
+      ink.setIfName("IT", "InkHighlight");
+    }
+    if (thickness > 0) {
+      const bs = new Dict(xref);
+      ink.set("BS", bs);
+      bs.set("W", thickness);
+    }
+    ink.setIfArray("C", getPdfColorArray(color));
+    ink.setIfNumber("CA", opacity);
+    if (ap || apRef) {
+      const n = new Dict(xref);
+      ink.set("AP", n);
+      n.set("N", apRef || ap);
+    }
+    return ink;
+  }
+  static async createNewAppearanceStream(annotation, xref, params) {
+    if (annotation.outlines) {
+      return this.createNewAppearanceStreamForHighlight(annotation, xref, params);
+    }
+    const {
+      color,
+      rect,
+      paths,
+      thickness,
+      opacity
+    } = annotation;
+    if (!color) {
+      return null;
+    }
+    const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, false)}`];
+    if (opacity !== 1) {
+      appearanceBuffer.push("/R0 gs");
+    }
+    for (const outline of paths.lines) {
+      appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`);
+      for (let i = 6, ii = outline.length; i < ii; i += 6) {
+        if (isNaN(outline[i])) {
+          appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`);
+        } else {
+          const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6);
+          appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c");
+        }
+      }
+      if (outline.length === 6) {
+        appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} l`);
+      }
+    }
+    appearanceBuffer.push("S");
+    const appearance = appearanceBuffer.join("\n");
+    const appearanceStreamDict = new Dict(xref);
+    appearanceStreamDict.set("FormType", 1);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    appearanceStreamDict.setIfName("Type", "XObject");
+    appearanceStreamDict.set("BBox", rect);
+    appearanceStreamDict.set("Length", appearance.length);
+    if (opacity !== 1) {
+      const resources = new Dict(xref);
+      const extGState = new Dict(xref);
+      const r0 = new Dict(xref);
+      r0.set("CA", opacity);
+      r0.setIfName("Type", "ExtGState");
+      extGState.set("R0", r0);
+      resources.set("ExtGState", extGState);
+      appearanceStreamDict.set("Resources", resources);
+    }
+    return new StringStream(appearance, appearanceStreamDict);
+  }
+  static async createNewAppearanceStreamForHighlight(annotation, xref, params) {
+    const {
+      color,
+      rect,
+      outlines: {
+        outline
+      },
+      opacity
+    } = annotation;
+    if (!color) {
+      return null;
+    }
+    const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"];
+    appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`);
+    for (let i = 6, ii = outline.length; i < ii; i += 6) {
+      if (isNaN(outline[i])) {
+        appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`);
+      } else {
+        const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6);
+        appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c");
+      }
+    }
+    appearanceBuffer.push("h f");
+    const appearance = appearanceBuffer.join("\n");
+    const appearanceStreamDict = new Dict(xref);
+    appearanceStreamDict.set("FormType", 1);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    appearanceStreamDict.setIfName("Type", "XObject");
+    appearanceStreamDict.set("BBox", rect);
+    appearanceStreamDict.set("Length", appearance.length);
+    const resources = new Dict(xref);
+    const extGState = new Dict(xref);
+    resources.set("ExtGState", extGState);
+    appearanceStreamDict.set("Resources", resources);
+    const r0 = new Dict(xref);
+    extGState.set("R0", r0);
+    r0.setIfName("BM", "Multiply");
+    if (opacity !== 1) {
+      r0.set("ca", opacity);
+      r0.setIfName("Type", "ExtGState");
+    }
+    return new StringStream(appearance, appearanceStreamDict);
+  }
+}
+class HighlightAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    this.data.isEditable = !this.data.noHTML;
+    this.data.noHTML = false;
+    this.data.opacity = dict.get("CA") || 1;
+    const quadPoints = this.data.quadPoints = getQuadPoints(dict, null);
+    if (quadPoints) {
+      if (!this.appearance) {
+        const fillColor = getPdfColorArray(this.color, [1, 1, 0]);
+        const fillAlpha = dict.get("CA");
+        this._setDefaultAppearance({
+          xref,
+          fillColor,
+          blendMode: "Multiply",
+          fillAlpha,
+          pointsCallback: (buffer, points) => {
+            buffer.push(`${points[0]} ${points[1]} m`, `${points[2]} ${points[3]} l`, `${points[6]} ${points[7]} l`, `${points[4]} ${points[5]} l`, "f");
+            return [points[0], points[7], points[2], points[3]];
+          }
+        });
+      }
+    } else {
+      this.data.popupRef = null;
+    }
+  }
+  get overlaysTextContent() {
+    return true;
+  }
+  static createNewDict(annotation, xref, {
+    apRef,
+    ap
+  }) {
+    const {
+      color,
+      date,
+      oldAnnotation,
+      opacity,
+      rect,
+      rotation,
+      user,
+      quadPoints
+    } = annotation;
+    const highlight = oldAnnotation || new Dict(xref);
+    highlight.setIfNotExists("Type", Name.get("Annot"));
+    highlight.setIfNotExists("Subtype", Name.get("Highlight"));
+    highlight.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`);
+    highlight.setIfArray("Rect", rect);
+    highlight.setIfNotExists("F", 4);
+    highlight.setIfNotExists("Border", [0, 0, 0]);
+    highlight.setIfNumber("Rotate", rotation);
+    highlight.setIfArray("QuadPoints", quadPoints);
+    highlight.setIfArray("C", getPdfColorArray(color));
+    highlight.setIfNumber("CA", opacity);
+    highlight.setIfDefined("T", stringToAsciiOrUTF16BE(user));
+    if (apRef || ap) {
+      const n = new Dict(xref);
+      highlight.set("AP", n);
+      n.set("N", apRef || ap);
+    }
+    return highlight;
+  }
+  static async createNewAppearanceStream(annotation, xref, params) {
+    const {
+      color,
+      rect,
+      outlines,
+      opacity
+    } = annotation;
+    if (!color) {
+      return null;
+    }
+    const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"];
+    const buffer = [];
+    for (const outline of outlines) {
+      buffer.length = 0;
+      buffer.push(`${numberToString(outline[0])} ${numberToString(outline[1])} m`);
+      for (let i = 2, ii = outline.length; i < ii; i += 2) {
+        buffer.push(`${numberToString(outline[i])} ${numberToString(outline[i + 1])} l`);
+      }
+      buffer.push("h");
+      appearanceBuffer.push(buffer.join("\n"));
+    }
+    appearanceBuffer.push("f*");
+    const appearance = appearanceBuffer.join("\n");
+    const appearanceStreamDict = new Dict(xref);
+    appearanceStreamDict.set("FormType", 1);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    appearanceStreamDict.setIfName("Type", "XObject");
+    appearanceStreamDict.set("BBox", rect);
+    appearanceStreamDict.set("Length", appearance.length);
+    const resources = new Dict(xref);
+    const extGState = new Dict(xref);
+    resources.set("ExtGState", extGState);
+    appearanceStreamDict.set("Resources", resources);
+    const r0 = new Dict(xref);
+    extGState.set("R0", r0);
+    r0.setIfName("BM", "Multiply");
+    if (opacity !== 1) {
+      r0.set("ca", opacity);
+      r0.setIfName("Type", "ExtGState");
+    }
+    return new StringStream(appearance, appearanceStreamDict);
+  }
+}
+class UnderlineAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    const quadPoints = this.data.quadPoints = getQuadPoints(dict, null);
+    if (quadPoints) {
+      if (!this.appearance) {
+        const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);
+        const strokeAlpha = dict.get("CA");
+        this._setDefaultAppearance({
+          xref,
+          extra: "[] 0 d 0.571 w",
+          strokeColor,
+          strokeAlpha,
+          pointsCallback: (buffer, points) => {
+            buffer.push(`${points[4]} ${points[5] + 1.3} m`, `${points[6]} ${points[7] + 1.3} l`, "S");
+            return [points[0], points[7], points[2], points[3]];
+          }
+        });
+      }
+    } else {
+      this.data.popupRef = null;
+    }
+  }
+  get overlaysTextContent() {
+    return true;
+  }
+}
+class SquigglyAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    const quadPoints = this.data.quadPoints = getQuadPoints(dict, null);
+    if (quadPoints) {
+      if (!this.appearance) {
+        const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);
+        const strokeAlpha = dict.get("CA");
+        this._setDefaultAppearance({
+          xref,
+          extra: "[] 0 d 1 w",
+          strokeColor,
+          strokeAlpha,
+          pointsCallback: (buffer, points) => {
+            const dy = (points[1] - points[5]) / 6;
+            let shift = dy;
+            let x = points[4];
+            const y = points[5];
+            const xEnd = points[6];
+            buffer.push(`${x} ${y + shift} m`);
+            do {
+              x += 2;
+              shift = shift === 0 ? dy : 0;
+              buffer.push(`${x} ${y + shift} l`);
+            } while (x < xEnd);
+            buffer.push("S");
+            return [points[4], y - 2 * dy, xEnd, y + 2 * dy];
+          }
+        });
+      }
+    } else {
+      this.data.popupRef = null;
+    }
+  }
+  get overlaysTextContent() {
+    return true;
+  }
+}
+class StrikeOutAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref
+    } = params;
+    const quadPoints = this.data.quadPoints = getQuadPoints(dict, null);
+    if (quadPoints) {
+      if (!this.appearance) {
+        const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);
+        const strokeAlpha = dict.get("CA");
+        this._setDefaultAppearance({
+          xref,
+          extra: "[] 0 d 1 w",
+          strokeColor,
+          strokeAlpha,
+          pointsCallback: (buffer, points) => {
+            buffer.push(`${(points[0] + points[4]) / 2} ` + `${(points[1] + points[5]) / 2} m`, `${(points[2] + points[6]) / 2} ` + `${(points[3] + points[7]) / 2} l`, "S");
+            return [points[0], points[7], points[2], points[3]];
+          }
+        });
+      }
+    } else {
+      this.data.popupRef = null;
+    }
+  }
+  get overlaysTextContent() {
+    return true;
+  }
+}
+class StampAnnotation extends MarkupAnnotation {
+  #savedHasOwnCanvas = null;
+  constructor(params) {
+    super(params);
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.isEditable = !this.data.noHTML;
+    this.data.noHTML = false;
+  }
+  mustBeViewedWhenEditing(isEditing, modifiedIds = null) {
+    if (isEditing) {
+      if (!this.data.isEditable) {
+        return true;
+      }
+      this.#savedHasOwnCanvas ??= this.data.hasOwnCanvas;
+      this.data.hasOwnCanvas = true;
+      return true;
+    }
+    if (this.#savedHasOwnCanvas !== null) {
+      this.data.hasOwnCanvas = this.#savedHasOwnCanvas;
+      this.#savedHasOwnCanvas = null;
+    }
+    return !modifiedIds?.has(this.data.id);
+  }
+  static createNewDict(annotation, xref, {
+    apRef,
+    ap
+  }) {
+    const {
+      date,
+      oldAnnotation,
+      rect,
+      rotation,
+      user
+    } = annotation;
+    const stamp = oldAnnotation || new Dict(xref);
+    stamp.setIfNotExists("Type", Name.get("Annot"));
+    stamp.setIfNotExists("Subtype", Name.get("Stamp"));
+    stamp.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`);
+    stamp.setIfArray("Rect", rect);
+    stamp.setIfNotExists("F", 4);
+    stamp.setIfNotExists("Border", [0, 0, 0]);
+    stamp.setIfNumber("Rotate", rotation);
+    stamp.setIfDefined("T", stringToAsciiOrUTF16BE(user));
+    if (apRef || ap) {
+      const n = new Dict(xref);
+      stamp.set("AP", n);
+      n.set("N", apRef || ap);
+    }
+    return stamp;
+  }
+  static async #createNewAppearanceStreamForDrawing(annotation, xref) {
+    const {
+      areContours,
+      color,
+      rect,
+      lines,
+      thickness
+    } = annotation;
+    if (!color) {
+      return null;
+    }
+    const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, areContours)}`];
+    for (const line of lines) {
+      appearanceBuffer.push(`${numberToString(line[4])} ${numberToString(line[5])} m`);
+      for (let i = 6, ii = line.length; i < ii; i += 6) {
+        if (isNaN(line[i])) {
+          appearanceBuffer.push(`${numberToString(line[i + 4])} ${numberToString(line[i + 5])} l`);
+        } else {
+          const [c1x, c1y, c2x, c2y, x, y] = line.slice(i, i + 6);
+          appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c");
+        }
+      }
+      if (line.length === 6) {
+        appearanceBuffer.push(`${numberToString(line[4])} ${numberToString(line[5])} l`);
+      }
+    }
+    appearanceBuffer.push(areContours ? "F" : "S");
+    const appearance = appearanceBuffer.join("\n");
+    const appearanceStreamDict = new Dict(xref);
+    appearanceStreamDict.set("FormType", 1);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    appearanceStreamDict.setIfName("Type", "XObject");
+    appearanceStreamDict.set("BBox", rect);
+    appearanceStreamDict.set("Length", appearance.length);
+    return new StringStream(appearance, appearanceStreamDict);
+  }
+  static async createNewAppearanceStream(annotation, xref, params) {
+    if (annotation.oldAnnotation) {
+      return null;
+    }
+    if (annotation.isSignature) {
+      return this.#createNewAppearanceStreamForDrawing(annotation, xref);
+    }
+    const {
+      rotation
+    } = annotation;
+    const {
+      imageRef,
+      width,
+      height
+    } = params.image;
+    const resources = new Dict(xref);
+    const xobject = new Dict(xref);
+    resources.set("XObject", xobject);
+    xobject.set("Im0", imageRef);
+    const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`;
+    const appearanceStreamDict = new Dict(xref);
+    appearanceStreamDict.set("FormType", 1);
+    appearanceStreamDict.setIfName("Subtype", "Form");
+    appearanceStreamDict.setIfName("Type", "XObject");
+    appearanceStreamDict.set("BBox", [0, 0, width, height]);
+    appearanceStreamDict.set("Resources", resources);
+    if (rotation) {
+      const matrix = getRotationMatrix(rotation, width, height);
+      appearanceStreamDict.set("Matrix", matrix);
+    }
+    return new StringStream(appearance, appearanceStreamDict);
+  }
+}
+class FileAttachmentAnnotation extends MarkupAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      annotationGlobals,
+      dict
+    } = params;
+    const fsDict = dict.get("FS");
+    this.data.hasOwnCanvas = this.data.noRotate;
+    this.data.noHTML = false;
+    this.data.fileId = this._getAttachmentId(fsDict, dict.getRaw("FS"), annotationGlobals);
+    this.data.file = new FileSpec(fsDict).serializable;
+    const name = dict.get("Name");
+    this.data.name = name instanceof Name ? stringToPDFString(name.name) : "PushPin";
+    const fillAlpha = dict.get("ca");
+    this.data.fillAlpha = typeof fillAlpha === "number" && fillAlpha >= 0 && fillAlpha <= 1 ? fillAlpha : null;
+  }
+}
+class MediaAnnotation extends Annotation {
+  static #MEDIA_MIME_TYPE_RE = /^(?:video|audio)\//;
+  constructor(params) {
+    super(params);
+    this.data.noHTML = true;
+  }
+  _setMediaData({
+    assetRef,
+    assetDict,
+    filename,
+    contentType
+  }, annotationGlobals) {
+    this.data.noHTML = false;
+    this.data.richMedia = {
+      fileId: this._getAttachmentId(assetDict, assetRef, annotationGlobals),
+      filename,
+      contentType
+    };
+  }
+  static _getContentType(assetDict, filename, contentType = null) {
+    if (typeof contentType === "string" && MediaAnnotation.#MEDIA_MIME_TYPE_RE.test(contentType)) {
+      return contentType;
+    }
+    const stream = FileSpec.pickPlatformItem(assetDict.get("EF"));
+    const subtype = stream instanceof BaseStream ? stream.dict?.get("Subtype") : null;
+    if (subtype instanceof Name && MediaAnnotation.#MEDIA_MIME_TYPE_RE.test(subtype.name)) {
+      return subtype.name;
+    }
+    const ext = filename.split(".").at(-1)?.toLowerCase();
+    switch (ext) {
+      case "mp4":
+      case "m4v":
+        return "video/mp4";
+      case "webm":
+        return "video/webm";
+      case "ogv":
+        return "video/ogg";
+      case "mov":
+        return "video/quicktime";
+      case "mp3":
+        return "audio/mpeg";
+      case "m4a":
+        return "audio/mp4";
+      case "wav":
+        return "audio/wav";
+      case "oga":
+      case "ogg":
+        return "audio/ogg";
+      default:
+        return null;
+    }
+  }
+}
+class RichMediaAnnotation extends MediaAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref,
+      annotationGlobals
+    } = params;
+    const content = dict.get("RichMediaContent");
+    if (!(content instanceof Dict)) {
+      return;
+    }
+    const asset = RichMediaAnnotation.#findAsset(content, xref);
+    if (!asset) {
+      warn("RichMedia annotation has no playable asset.");
+      return;
+    }
+    this._setMediaData(asset, annotationGlobals);
+  }
+  static #findAsset(content, xref) {
+    const configurations = content.get("Configurations");
+    if (!Array.isArray(configurations)) {
+      return null;
+    }
+    for (const configRef of configurations) {
+      const config = xref.fetchIfRef(configRef);
+      if (!(config instanceof Dict)) {
+        continue;
+      }
+      const instances = config.get("Instances");
+      if (!Array.isArray(instances)) {
+        continue;
+      }
+      for (const instanceRef of instances) {
+        const instance = xref.fetchIfRef(instanceRef);
+        if (!(instance instanceof Dict)) {
+          continue;
+        }
+        if (isName(instance.get("Subtype"), "Flash")) {
+          continue;
+        }
+        const rawAsset = instance.getRaw("Asset");
+        const asset = xref.fetchIfRef(rawAsset);
+        if (!(asset instanceof Dict)) {
+          continue;
+        }
+        if (!FileSpec.hasEmbeddedFile(asset)) {
+          continue;
+        }
+        const {
+          filename
+        } = new FileSpec(asset).serializable;
+        const contentType = MediaAnnotation._getContentType(asset, filename);
+        if (!contentType) {
+          continue;
+        }
+        return {
+          assetRef: rawAsset instanceof Ref ? rawAsset : null,
+          assetDict: asset,
+          filename,
+          contentType
+        };
+      }
+    }
+    return null;
+  }
+}
+class ScreenAnnotation extends MediaAnnotation {
+  constructor(params) {
+    super(params);
+    const {
+      dict,
+      xref,
+      annotationGlobals
+    } = params;
+    const asset = ScreenAnnotation.#findAsset(dict, xref);
+    if (!asset) {
+      return;
+    }
+    this._setMediaData(asset, annotationGlobals);
+  }
+  static #findAsset(dict, xref) {
+    for (const action of this.#renditionActions(dict)) {
+      const asset = this.#findRenditionAsset(action.get("R"), xref, new RefSet());
+      if (asset) {
+        return asset;
+      }
+    }
+    return null;
+  }
+  static *#renditionActions(dict) {
+    const action = dict.get("A");
+    if (action instanceof Dict && isName(action.get("S"), "Rendition") && this.#isPlayAction(action)) {
+      yield action;
+    }
+    const additionalActions = dict.get("AA");
+    if (additionalActions instanceof Dict) {
+      for (const [, aa] of additionalActions) {
+        if (aa instanceof Dict && isName(aa.get("S"), "Rendition") && this.#isPlayAction(aa)) {
+          yield aa;
+        }
+      }
+    }
+  }
+  static #isPlayAction(action) {
+    const operation = action.get("OP");
+    return operation === undefined || operation === AnnotationRenditionOperation.PLAY_OR_RESUME || operation === AnnotationRenditionOperation.PLAY;
+  }
+  static #findRenditionAsset(rendition, xref, seen) {
+    if (!(rendition instanceof Dict)) {
+      return null;
+    }
+    const subtype = rendition.get("S");
+    if (isName(subtype, "MR")) {
+      return this.#findClipAsset(rendition.get("C"), xref);
+    }
+    if (isName(subtype, "SR")) {
+      const renditions = rendition.get("R");
+      if (Array.isArray(renditions)) {
+        for (const ref of renditions) {
+          if (ref instanceof Ref) {
+            if (seen.has(ref)) {
+              continue;
+            }
+            seen.put(ref);
+          }
+          const asset = this.#findRenditionAsset(xref.fetchIfRef(ref), xref, seen);
+          if (asset) {
+            return asset;
+          }
+        }
+      }
+    }
+    return null;
+  }
+  static #findClipAsset(clip, xref) {
+    if (!(clip instanceof Dict) || !isName(clip.get("S"), "MCD")) {
+      return null;
+    }
+    const rawData = clip.getRaw("D");
+    const data = xref.fetchIfRef(rawData);
+    const contentTypeHint = clip.get("CT");
+    let explicitType = typeof contentTypeHint === "string" ? contentTypeHint : null;
+    let assetDict, filename;
+    if (data instanceof BaseStream) {
+      assetDict = data.dict;
+      const name = clip.get("N");
+      filename = typeof name === "string" ? stringToPDFString(name) : "";
+      if (!explicitType) {
+        const subtype = data.dict.get("Subtype");
+        if (subtype instanceof Name) {
+          explicitType = subtype.name;
+        }
+      }
+    } else if (data instanceof Dict) {
+      if (!FileSpec.hasEmbeddedFile(data)) {
+        return null;
+      }
+      assetDict = data;
+      ({
+        filename
+      } = new FileSpec(data).serializable);
+    } else {
+      return null;
+    }
+    const contentType = MediaAnnotation._getContentType(assetDict, filename, explicitType);
+    if (!contentType) {
+      return null;
+    }
+    return {
+      assetRef: rawData instanceof Ref ? rawData : null,
+      assetDict,
+      filename,
+      contentType
+    };
+  }
+}
+
+;// ./src/core/calculate_md5.js
+
+const PARAMS = {
+  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(data, offset, length) {
+  let h0 = 1732584193,
+    h1 = -271733879,
+    h2 = -1732584194,
+    h3 = 271733878;
+  const paddedLength = length + 72 & ~63;
+  const padded = new Uint8Array(paddedLength);
+  let i, j;
+  for (i = 0; i < length; ++i) {
+    padded[i] = data[offset++];
+  }
+  padded[i++] = 0x80;
+  const n = paddedLength - 8;
+  if (i < n) {
+    i = n;
+  }
+  padded[i++] = length << 3 & 0xff;
+  padded[i++] = length >> 5 & 0xff;
+  padded[i++] = length >> 13 & 0xff;
+  padded[i++] = length >> 21 & 0xff;
+  padded[i++] = length >>> 29 & 0xff;
+  i += 3;
+  const w = new Int32Array(16);
+  const {
+    k,
+    r
+  } = PARAMS;
+  for (i = 0; i < paddedLength;) {
+    for (j = 0; j < 16; ++j, i += 4) {
+      w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;
+    }
+    let a = h0,
+      b = h1,
+      c = h2,
+      d = h3,
+      f,
+      g;
+    for (j = 0; j < 64; ++j) {
+      if (j < 16) {
+        f = b & c | ~b & d;
+        g = j;
+      } else if (j < 32) {
+        f = d & b | ~d & c;
+        g = 5 * j + 1 & 15;
+      } else if (j < 48) {
+        f = b ^ c ^ d;
+        g = 3 * j + 5 & 15;
+      } else {
+        f = c ^ (b | ~d);
+        g = 7 * j & 15;
+      }
+      const tmp = d,
+        rotateArg = a + f + k[j] + w[g] | 0,
+        rotate = r[j];
+      d = c;
+      c = b;
+      b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;
+      a = tmp;
+    }
+    h0 = h0 + a | 0;
+    h1 = h1 + b | 0;
+    h2 = h2 + c | 0;
+    h3 = h3 + d | 0;
+  }
+  return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);
+}
+
+;// ./src/core/dataset_reader.js
+
+
+
+function decodeString(str) {
+  try {
+    return stringToUTF8String(str);
+  } catch (ex) {
+    warn(`UTF-8 decoding failed: "${ex}".`);
+    return str;
+  }
+}
+class DatasetXMLParser extends SimpleXMLParser {
+  node = null;
+  onEndElement(name) {
+    const node = super.onEndElement(name);
+    if (node && name === "xfa:datasets") {
+      this.node = node;
+      throw new Error("Aborting DatasetXMLParser.");
+    }
+  }
+}
+class DatasetReader {
+  constructor(data) {
+    if (data.datasets) {
+      this.node = new SimpleXMLParser({
+        hasAttributes: true
+      }).parseFromString(data.datasets).documentElement;
+    } else {
+      const parser = new DatasetXMLParser({
+        hasAttributes: true
+      });
+      try {
+        parser.parseFromString(data["xdp:xdp"]);
+      } catch {}
+      this.node = parser.node;
+    }
+  }
+  getValue(path) {
+    if (!this.node || !path) {
+      return "";
+    }
+    const node = this.node.searchNode(parseXFAPath(path), 0);
+    if (!node) {
+      return "";
+    }
+    const first = node.firstChild;
+    if (first?.nodeName === "value") {
+      return node.children.map(child => decodeString(child.textContent));
+    }
+    return decodeString(node.textContent);
+  }
+}
+
+;// ./src/core/intersector.js
+class SingleIntersector {
+  #annotation;
+  minX = Infinity;
+  minY = Infinity;
+  maxX = -Infinity;
+  maxY = -Infinity;
+  #quadPoints = null;
+  #text = [];
+  #extraChars = [];
+  #lastIntersectingQuadIndex = -1;
+  #canTakeExtraChars = false;
+  constructor(annotation) {
+    this.#annotation = annotation;
+    const quadPoints = annotation.data.quadPoints;
+    if (!quadPoints) {
+      [this.minX, this.minY, this.maxX, this.maxY] = annotation.data.rect;
+      return;
+    }
+    for (let i = 0, ii = quadPoints.length; i < ii; i += 8) {
+      this.minX = Math.min(this.minX, quadPoints[i]);
+      this.maxX = Math.max(this.maxX, quadPoints[i + 2]);
+      this.minY = Math.min(this.minY, quadPoints[i + 5]);
+      this.maxY = Math.max(this.maxY, quadPoints[i + 1]);
+    }
+    if (quadPoints.length > 8) {
+      this.#quadPoints = quadPoints;
+    }
+  }
+  #intersects(x, y) {
+    if (this.minX >= x || this.maxX <= x || this.minY >= y || this.maxY <= y) {
+      return false;
+    }
+    const quadPoints = this.#quadPoints;
+    if (!quadPoints) {
+      return true;
+    }
+    if (this.#lastIntersectingQuadIndex >= 0) {
+      const i = this.#lastIntersectingQuadIndex;
+      if (!(quadPoints[i] >= x || quadPoints[i + 2] <= x || quadPoints[i + 5] >= y || quadPoints[i + 1] <= y)) {
+        return true;
+      }
+      this.#lastIntersectingQuadIndex = -1;
+    }
+    for (let i = 0, ii = quadPoints.length; i < ii; i += 8) {
+      if (!(quadPoints[i] >= x || quadPoints[i + 2] <= x || quadPoints[i + 5] >= y || quadPoints[i + 1] <= y)) {
+        this.#lastIntersectingQuadIndex = i;
+        return true;
+      }
+    }
+    return false;
+  }
+  addGlyph(x, y, glyph) {
+    if (!this.#intersects(x, y)) {
+      this.disableExtraChars();
+      return false;
+    }
+    if (this.#extraChars.length > 0) {
+      this.#text.push(this.#extraChars.join(""));
+      this.#extraChars.length = 0;
+    }
+    this.#text.push(glyph);
+    this.#canTakeExtraChars = true;
+    return true;
+  }
+  addExtraChar(char) {
+    if (this.#canTakeExtraChars) {
+      this.#extraChars.push(char);
+    }
+  }
+  disableExtraChars() {
+    if (!this.#canTakeExtraChars) {
+      return;
+    }
+    this.#canTakeExtraChars = false;
+    this.#extraChars.length = 0;
+  }
+  setText() {
+    this.#annotation.data.overlaidText = this.#text.join("");
+  }
+}
+const STEPS = 64;
+class Intersector {
+  #intersectors = [];
+  #grid = [];
+  #minX;
+  #maxX;
+  #minY;
+  #maxY;
+  #invXRatio;
+  #invYRatio;
+  constructor(annotations) {
+    let minX = Infinity;
+    let minY = Infinity;
+    let maxX = -Infinity;
+    let maxY = -Infinity;
+    const intersectors = this.#intersectors;
+    for (const annotation of annotations) {
+      if (!annotation.data.quadPoints && !annotation.data.rect) {
+        continue;
+      }
+      const intersector = new SingleIntersector(annotation);
+      intersectors.push(intersector);
+      minX = Math.min(minX, intersector.minX);
+      minY = Math.min(minY, intersector.minY);
+      maxX = Math.max(maxX, intersector.maxX);
+      maxY = Math.max(maxY, intersector.maxY);
+    }
+    this.#minX = minX;
+    this.#minY = minY;
+    this.#maxX = maxX;
+    this.#maxY = maxY;
+    this.#invXRatio = (STEPS - 1) / (maxX - minX);
+    this.#invYRatio = (STEPS - 1) / (maxY - minY);
+    for (const intersector of intersectors) {
+      const iMin = this.#getGridIndex(intersector.minX, intersector.minY);
+      const iMax = this.#getGridIndex(intersector.maxX, intersector.maxY);
+      const w = (iMax - iMin) % STEPS;
+      const h = Math.floor((iMax - iMin) / STEPS);
+      for (let i = iMin; i <= iMin + h * STEPS; i += STEPS) {
+        for (let j = 0; j <= w; j++) {
+          (this.#grid[i + j] ??= []).push(intersector);
+        }
+      }
+    }
+  }
+  #getGridIndex(x, y) {
+    const i = Math.floor((x - this.#minX) * this.#invXRatio);
+    const j = Math.floor((y - this.#minY) * this.#invYRatio);
+    return i + j * STEPS;
+  }
+  addGlyph(transform, width, height, glyph) {
+    const x = transform[4] + width / 2;
+    const y = transform[5] + height / 2;
+    if (x < this.#minX || y < this.#minY || x > this.#maxX || y > this.#maxY) {
+      return;
+    }
+    const intersectors = this.#grid[this.#getGridIndex(x, y)];
+    if (!intersectors) {
+      return;
+    }
+    for (const intersector of intersectors) {
+      intersector.addGlyph(x, y, glyph);
+    }
+  }
+  addExtraChar(char) {
+    for (const intersector of this.#intersectors) {
+      intersector.addExtraChar(char);
+    }
+  }
+  setText() {
+    for (const intersector of this.#intersectors) {
+      intersector.setText();
+    }
+  }
+}
+
+;// ./src/core/calculate_sha_other.js
+
+class Word64 {
+  constructor(highInteger, lowInteger) {
+    this.high = highInteger | 0;
+    this.low = lowInteger | 0;
+  }
+  and(word) {
+    this.high &= word.high;
+    this.low &= word.low;
+  }
+  xor(word) {
+    this.high ^= word.high;
+    this.low ^= word.low;
+  }
+  shiftRight(places) {
+    if (places >= 32) {
+      this.low = this.high >>> places - 32 | 0;
+      this.high = 0;
+    } else {
+      this.low = this.low >>> places | this.high << 32 - places;
+      this.high = this.high >>> places | 0;
+    }
+  }
+  rotateRight(places) {
+    let low, high;
+    if (places & 32) {
+      high = this.low;
+      low = this.high;
+    } else {
+      low = this.low;
+      high = this.high;
+    }
+    places &= 31;
+    this.low = low >>> places | high << 32 - places;
+    this.high = high >>> places | low << 32 - places;
+  }
+  not() {
+    this.high = ~this.high;
+    this.low = ~this.low;
+  }
+  add(word) {
+    const lowAdd = (this.low >>> 0) + (word.low >>> 0);
+    let highAdd = (this.high >>> 0) + (word.high >>> 0);
+    if (lowAdd > 0xffffffff) {
+      highAdd += 1;
+    }
+    this.low = lowAdd | 0;
+    this.high = highAdd | 0;
+  }
+  copyTo(bytes, offset) {
+    bytes[offset] = this.high >>> 24 & 0xff;
+    bytes[offset + 1] = this.high >> 16 & 0xff;
+    bytes[offset + 2] = this.high >> 8 & 0xff;
+    bytes[offset + 3] = this.high & 0xff;
+    bytes[offset + 4] = this.low >>> 24 & 0xff;
+    bytes[offset + 5] = this.low >> 16 & 0xff;
+    bytes[offset + 6] = this.low >> 8 & 0xff;
+    bytes[offset + 7] = this.low & 0xff;
+  }
+  assign(word) {
+    this.high = word.high;
+    this.low = word.low;
+  }
+}
+const calculate_sha_other_PARAMS = {
+  get k() {
+    return shadow(this, "k", [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]);
+  }
+};
+function ch(result, x, y, z, tmp) {
+  result.assign(x);
+  result.and(y);
+  tmp.assign(x);
+  tmp.not();
+  tmp.and(z);
+  result.xor(tmp);
+}
+function maj(result, x, y, z, tmp) {
+  result.assign(x);
+  result.and(y);
+  tmp.assign(x);
+  tmp.and(z);
+  result.xor(tmp);
+  tmp.assign(y);
+  tmp.and(z);
+  result.xor(tmp);
+}
+function sigma(result, x, tmp) {
+  result.assign(x);
+  result.rotateRight(28);
+  tmp.assign(x);
+  tmp.rotateRight(34);
+  result.xor(tmp);
+  tmp.assign(x);
+  tmp.rotateRight(39);
+  result.xor(tmp);
+}
+function sigmaPrime(result, x, tmp) {
+  result.assign(x);
+  result.rotateRight(14);
+  tmp.assign(x);
+  tmp.rotateRight(18);
+  result.xor(tmp);
+  tmp.assign(x);
+  tmp.rotateRight(41);
+  result.xor(tmp);
+}
+function littleSigma(result, x, tmp) {
+  result.assign(x);
+  result.rotateRight(1);
+  tmp.assign(x);
+  tmp.rotateRight(8);
+  result.xor(tmp);
+  tmp.assign(x);
+  tmp.shiftRight(7);
+  result.xor(tmp);
+}
+function littleSigmaPrime(result, x, tmp) {
+  result.assign(x);
+  result.rotateRight(19);
+  tmp.assign(x);
+  tmp.rotateRight(61);
+  result.xor(tmp);
+  tmp.assign(x);
+  tmp.shiftRight(6);
+  result.xor(tmp);
+}
+function calculateSHA512(data, offset, length, mode384 = false) {
+  let h0, h1, h2, h3, h4, h5, h6, h7;
+  if (!mode384) {
+    h0 = new Word64(0x6a09e667, 0xf3bcc908);
+    h1 = new Word64(0xbb67ae85, 0x84caa73b);
+    h2 = new Word64(0x3c6ef372, 0xfe94f82b);
+    h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
+    h4 = new Word64(0x510e527f, 0xade682d1);
+    h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
+    h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
+    h7 = new Word64(0x5be0cd19, 0x137e2179);
+  } else {
+    h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
+    h1 = new Word64(0x629a292a, 0x367cd507);
+    h2 = new Word64(0x9159015a, 0x3070dd17);
+    h3 = new Word64(0x152fecd8, 0xf70e5939);
+    h4 = new Word64(0x67332667, 0xffc00b31);
+    h5 = new Word64(0x8eb44a87, 0x68581511);
+    h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
+    h7 = new Word64(0x47b5481d, 0xbefa4fa4);
+  }
+  const paddedLength = Math.ceil((length + 17) / 128) * 128;
+  const padded = new Uint8Array(paddedLength);
+  let i, j;
+  for (i = 0; i < length; ++i) {
+    padded[i] = data[offset++];
+  }
+  padded[i++] = 0x80;
+  const n = paddedLength - 16;
+  if (i < n) {
+    i = n;
+  }
+  i += 11;
+  padded[i++] = length >>> 29 & 0xff;
+  padded[i++] = length >> 21 & 0xff;
+  padded[i++] = length >> 13 & 0xff;
+  padded[i++] = length >> 5 & 0xff;
+  padded[i++] = length << 3 & 0xff;
+  const w = new Array(80);
+  for (i = 0; i < 80; i++) {
+    w[i] = new Word64(0, 0);
+  }
+  const {
+    k
+  } = calculate_sha_other_PARAMS;
+  let a = new Word64(0, 0),
+    b = new Word64(0, 0),
+    c = new Word64(0, 0);
+  let d = new Word64(0, 0),
+    e = new Word64(0, 0),
+    f = new Word64(0, 0);
+  let g = new Word64(0, 0),
+    h = new Word64(0, 0);
+  const t1 = new Word64(0, 0),
+    t2 = new Word64(0, 0);
+  const tmp1 = new Word64(0, 0),
+    tmp2 = new Word64(0, 0);
+  let tmp3;
+  for (i = 0; i < paddedLength;) {
+    for (j = 0; j < 16; ++j) {
+      w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
+      w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];
+      i += 8;
+    }
+    for (j = 16; j < 80; ++j) {
+      tmp3 = w[j];
+      littleSigmaPrime(tmp3, w[j - 2], tmp2);
+      tmp3.add(w[j - 7]);
+      littleSigma(tmp1, w[j - 15], tmp2);
+      tmp3.add(tmp1);
+      tmp3.add(w[j - 16]);
+    }
+    a.assign(h0);
+    b.assign(h1);
+    c.assign(h2);
+    d.assign(h3);
+    e.assign(h4);
+    f.assign(h5);
+    g.assign(h6);
+    h.assign(h7);
+    for (j = 0; j < 80; ++j) {
+      t1.assign(h);
+      sigmaPrime(tmp1, e, tmp2);
+      t1.add(tmp1);
+      ch(tmp1, e, f, g, tmp2);
+      t1.add(tmp1);
+      t1.add(k[j]);
+      t1.add(w[j]);
+      sigma(t2, a, tmp2);
+      maj(tmp1, a, b, c, tmp2);
+      t2.add(tmp1);
+      tmp3 = h;
+      h = g;
+      g = f;
+      f = e;
+      d.add(t1);
+      e = d;
+      d = c;
+      c = b;
+      b = a;
+      tmp3.assign(t1);
+      tmp3.add(t2);
+      a = tmp3;
+    }
+    h0.add(a);
+    h1.add(b);
+    h2.add(c);
+    h3.add(d);
+    h4.add(e);
+    h5.add(f);
+    h6.add(g);
+    h7.add(h);
+  }
+  let result;
+  if (!mode384) {
+    result = new Uint8Array(64);
+    h0.copyTo(result, 0);
+    h1.copyTo(result, 8);
+    h2.copyTo(result, 16);
+    h3.copyTo(result, 24);
+    h4.copyTo(result, 32);
+    h5.copyTo(result, 40);
+    h6.copyTo(result, 48);
+    h7.copyTo(result, 56);
+  } else {
+    result = new Uint8Array(48);
+    h0.copyTo(result, 0);
+    h1.copyTo(result, 8);
+    h2.copyTo(result, 16);
+    h3.copyTo(result, 24);
+    h4.copyTo(result, 32);
+    h5.copyTo(result, 40);
+  }
+  return result;
+}
+function calculateSHA384(data, offset, length) {
+  return calculateSHA512(data, offset, length, true);
+}
+
+;// ./src/core/calculate_sha256.js
+
+const calculate_sha256_PARAMS = {
+  get k() {
+    return shadow(this, "k", [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]);
+  }
+};
+function rotr(x, n) {
+  return x >>> n | x << 32 - n;
+}
+function calculate_sha256_ch(x, y, z) {
+  return x & y ^ ~x & z;
+}
+function calculate_sha256_maj(x, y, z) {
+  return x & y ^ x & z ^ y & z;
+}
+function calculate_sha256_sigma(x) {
+  return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
+}
+function calculate_sha256_sigmaPrime(x) {
+  return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
+}
+function calculate_sha256_littleSigma(x) {
+  return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
+}
+function calculate_sha256_littleSigmaPrime(x) {
+  return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
+}
+function calculateSHA256(data, offset, length) {
+  let h0 = 0x6a09e667,
+    h1 = 0xbb67ae85,
+    h2 = 0x3c6ef372,
+    h3 = 0xa54ff53a,
+    h4 = 0x510e527f,
+    h5 = 0x9b05688c,
+    h6 = 0x1f83d9ab,
+    h7 = 0x5be0cd19;
+  const paddedLength = Math.ceil((length + 9) / 64) * 64;
+  const padded = new Uint8Array(paddedLength);
+  let i, j;
+  for (i = 0; i < length; ++i) {
+    padded[i] = data[offset++];
+  }
+  padded[i++] = 0x80;
+  const n = paddedLength - 8;
+  if (i < n) {
+    i = n;
+  }
+  i += 3;
+  padded[i++] = length >>> 29 & 0xff;
+  padded[i++] = length >> 21 & 0xff;
+  padded[i++] = length >> 13 & 0xff;
+  padded[i++] = length >> 5 & 0xff;
+  padded[i++] = length << 3 & 0xff;
+  const w = new Uint32Array(64);
+  const {
+    k
+  } = calculate_sha256_PARAMS;
+  for (i = 0; i < paddedLength;) {
+    for (j = 0; j < 16; ++j) {
+      w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
+      i += 4;
+    }
+    for (j = 16; j < 64; ++j) {
+      w[j] = calculate_sha256_littleSigmaPrime(w[j - 2]) + w[j - 7] + calculate_sha256_littleSigma(w[j - 15]) + w[j - 16] | 0;
+    }
+    let a = h0,
+      b = h1,
+      c = h2,
+      d = h3,
+      e = h4,
+      f = h5,
+      g = h6,
+      h = h7,
+      t1,
+      t2;
+    for (j = 0; j < 64; ++j) {
+      t1 = h + calculate_sha256_sigmaPrime(e) + calculate_sha256_ch(e, f, g) + k[j] + w[j];
+      t2 = calculate_sha256_sigma(a) + calculate_sha256_maj(a, b, c);
+      h = g;
+      g = f;
+      f = e;
+      e = d + t1 | 0;
+      d = c;
+      c = b;
+      b = a;
+      a = t1 + t2 | 0;
+    }
+    h0 = h0 + a | 0;
+    h1 = h1 + b | 0;
+    h2 = h2 + c | 0;
+    h3 = h3 + d | 0;
+    h4 = h4 + e | 0;
+    h5 = h5 + f | 0;
+    h6 = h6 + g | 0;
+    h7 = h7 + h | 0;
+  }
+  return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);
+}
+
+;// ./src/core/decrypt_stream.js
+
+const chunkSize = 512;
+class DecryptStream extends DecodeStream {
+  #nextChunk = null;
+  constructor(str, maybeLength, decrypt) {
+    super(maybeLength);
+    this.stream = str;
+    this.dict = str.dict;
+    this.decrypt = decrypt;
+  }
+  readBlock() {
+    let chunk = this.#nextChunk ?? this.stream.getBytes(chunkSize);
+    if (!chunk?.length) {
+      this.eof = true;
+      return;
+    }
+    this.#nextChunk = this.stream.getBytes(chunkSize);
+    const hasMoreData = this.#nextChunk?.length > 0;
+    const decrypt = this.decrypt;
+    chunk = decrypt(chunk, !hasMoreData);
+    const bufferLength = this.bufferLength,
+      newLength = bufferLength + chunk.length,
+      buffer = this.ensureBuffer(newLength);
+    buffer.set(chunk, bufferLength);
+    this.bufferLength = newLength;
+  }
+  getOriginalStream() {
+    return this;
+  }
+}
+
+;// ./src/core/crypto.js
+
+
+
+
+
+
+class ARCFourCipher {
+  a = 0;
+  b = 0;
+  constructor(key) {
+    const s = new Uint8Array(256);
+    const keyLength = key.length;
+    for (let i = 0; i < 256; ++i) {
+      s[i] = i;
+    }
+    for (let i = 0, j = 0; i < 256; ++i) {
+      const tmp = s[i];
+      j = j + tmp + key[i % keyLength] & 0xff;
+      s[i] = s[j];
+      s[j] = tmp;
+    }
+    this.s = s;
+  }
+  encryptBlock(data) {
+    let a = this.a,
+      b = this.b;
+    const s = this.s;
+    const n = data.length;
+    const output = new Uint8Array(n);
+    for (let i = 0; i < n; ++i) {
+      a = a + 1 & 0xff;
+      const tmp = s[a];
+      b = b + tmp & 0xff;
+      const tmp2 = s[b];
+      s[a] = tmp2;
+      s[b] = tmp;
+      output[i] = data[i] ^ s[tmp + tmp2 & 0xff];
+    }
+    this.a = a;
+    this.b = b;
+    return output;
+  }
+  decryptBlock(data) {
+    return this.encryptBlock(data);
+  }
+  encrypt(data) {
+    return this.encryptBlock(data);
+  }
+}
+class NullCipher {
+  decryptBlock(data) {
+    return data;
+  }
+  encrypt(data) {
+    return data;
+  }
+}
+class AESBaseCipher {
+  _s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);
+  _inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);
+  _mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
+  _mixCol = new Uint8Array(256).map((_, i) => i < 128 ? i << 1 : i << 1 ^ 0x1b);
+  constructor() {
+    this.buffer = new Uint8Array(16);
+    this.bufferPosition = 0;
+  }
+  _expandKey(cipherKey) {
+    unreachable("Cannot call `_expandKey` on the base class");
+  }
+  _decrypt(input, key) {
+    let t, u, v;
+    const state = new Uint8Array(16);
+    state.set(input);
+    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {
+      state[j] ^= key[k];
+    }
+    for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) {
+      t = state[13];
+      state[13] = state[9];
+      state[9] = state[5];
+      state[5] = state[1];
+      state[1] = t;
+      t = state[14];
+      u = state[10];
+      state[14] = state[6];
+      state[10] = state[2];
+      state[6] = t;
+      state[2] = u;
+      t = state[15];
+      u = state[11];
+      v = state[7];
+      state[15] = state[3];
+      state[11] = t;
+      state[7] = u;
+      state[3] = v;
+      for (let j = 0; j < 16; ++j) {
+        state[j] = this._inv_s[state[j]];
+      }
+      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {
+        state[j] ^= key[k];
+      }
+      for (let j = 0; j < 16; j += 4) {
+        const s0 = this._mix[state[j]];
+        const s1 = this._mix[state[j + 1]];
+        const s2 = this._mix[state[j + 2]];
+        const s3 = this._mix[state[j + 3]];
+        t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;
+        state[j] = t >>> 24 & 0xff;
+        state[j + 1] = t >> 16 & 0xff;
+        state[j + 2] = t >> 8 & 0xff;
+        state[j + 3] = t & 0xff;
+      }
+    }
+    t = state[13];
+    state[13] = state[9];
+    state[9] = state[5];
+    state[5] = state[1];
+    state[1] = t;
+    t = state[14];
+    u = state[10];
+    state[14] = state[6];
+    state[10] = state[2];
+    state[6] = t;
+    state[2] = u;
+    t = state[15];
+    u = state[11];
+    v = state[7];
+    state[15] = state[3];
+    state[11] = t;
+    state[7] = u;
+    state[3] = v;
+    for (let j = 0; j < 16; ++j) {
+      state[j] = this._inv_s[state[j]];
+      state[j] ^= key[j];
+    }
+    return state;
+  }
+  _encrypt(input, key) {
+    const s = this._s;
+    let t, u, v;
+    const state = new Uint8Array(16);
+    state.set(input);
+    for (let j = 0; j < 16; ++j) {
+      state[j] ^= key[j];
+    }
+    for (let i = 1; i < this._cyclesOfRepetition; i++) {
+      for (let j = 0; j < 16; ++j) {
+        state[j] = s[state[j]];
+      }
+      v = state[1];
+      state[1] = state[5];
+      state[5] = state[9];
+      state[9] = state[13];
+      state[13] = v;
+      v = state[2];
+      u = state[6];
+      state[2] = state[10];
+      state[6] = state[14];
+      state[10] = v;
+      state[14] = u;
+      v = state[3];
+      u = state[7];
+      t = state[11];
+      state[3] = state[15];
+      state[7] = v;
+      state[11] = u;
+      state[15] = t;
+      for (let j = 0; j < 16; j += 4) {
+        const s0 = state[j];
+        const s1 = state[j + 1];
+        const s2 = state[j + 2];
+        const s3 = state[j + 3];
+        t = s0 ^ s1 ^ s2 ^ s3;
+        state[j] ^= t ^ this._mixCol[s0 ^ s1];
+        state[j + 1] ^= t ^ this._mixCol[s1 ^ s2];
+        state[j + 2] ^= t ^ this._mixCol[s2 ^ s3];
+        state[j + 3] ^= t ^ this._mixCol[s3 ^ s0];
+      }
+      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {
+        state[j] ^= key[k];
+      }
+    }
+    for (let j = 0; j < 16; ++j) {
+      state[j] = s[state[j]];
+    }
+    v = state[1];
+    state[1] = state[5];
+    state[5] = state[9];
+    state[9] = state[13];
+    state[13] = v;
+    v = state[2];
+    u = state[6];
+    state[2] = state[10];
+    state[6] = state[14];
+    state[10] = v;
+    state[14] = u;
+    v = state[3];
+    u = state[7];
+    t = state[11];
+    state[3] = state[15];
+    state[7] = v;
+    state[11] = u;
+    state[15] = t;
+    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {
+      state[j] ^= key[k];
+    }
+    return state;
+  }
+  _decryptBlock2(data, finalize) {
+    const sourceLength = data.length;
+    let buffer = this.buffer,
+      bufferLength = this.bufferPosition;
+    const result = [];
+    let iv = this.iv;
+    for (let i = 0; i < sourceLength; ++i) {
+      buffer[bufferLength] = data[i];
+      ++bufferLength;
+      if (bufferLength < 16) {
+        continue;
+      }
+      const plain = this._decrypt(buffer, this._key);
+      for (let j = 0; j < 16; ++j) {
+        plain[j] ^= iv[j];
+      }
+      iv = buffer;
+      result.push(plain);
+      buffer = new Uint8Array(16);
+      bufferLength = 0;
+    }
+    this.buffer = buffer;
+    this.bufferLength = bufferLength;
+    this.iv = iv;
+    if (result.length === 0) {
+      return new Uint8Array(0);
+    }
+    let outputLength = 16 * result.length;
+    if (finalize) {
+      const lastBlock = result.at(-1);
+      let psLen = lastBlock[15];
+      if (psLen <= 16) {
+        for (let i = 15, ii = 16 - psLen; i >= ii; --i) {
+          if (lastBlock[i] !== psLen) {
+            psLen = 0;
+            break;
+          }
+        }
+        outputLength -= psLen;
+        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
+      }
+    }
+    const output = new Uint8Array(outputLength);
+    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+      output.set(result[i], j);
+    }
+    return output;
+  }
+  decryptBlock(data, finalize, iv = null) {
+    const sourceLength = data.length;
+    const buffer = this.buffer;
+    let bufferLength = this.bufferPosition;
+    if (iv) {
+      this.iv = iv;
+    } else {
+      for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
+        buffer[bufferLength] = data[i];
+      }
+      if (bufferLength < 16) {
+        this.bufferLength = bufferLength;
+        return new Uint8Array(0);
+      }
+      this.iv = buffer;
+      data = data.subarray(16);
+    }
+    this.buffer = new Uint8Array(16);
+    this.bufferLength = 0;
+    this.decryptBlock = this._decryptBlock2;
+    return this.decryptBlock(data, finalize);
+  }
+  encrypt(data, iv) {
+    const sourceLength = data.length;
+    let buffer = this.buffer,
+      bufferLength = this.bufferPosition;
+    const result = [];
+    iv ||= new Uint8Array(16);
+    for (let i = 0; i < sourceLength; ++i) {
+      buffer[bufferLength] = data[i];
+      ++bufferLength;
+      if (bufferLength < 16) {
+        continue;
+      }
+      for (let j = 0; j < 16; ++j) {
+        buffer[j] ^= iv[j];
+      }
+      const cipher = this._encrypt(buffer, this._key);
+      iv = cipher;
+      result.push(cipher);
+      buffer = new Uint8Array(16);
+      bufferLength = 0;
+    }
+    this.buffer = buffer;
+    this.bufferLength = bufferLength;
+    this.iv = iv;
+    if (result.length === 0) {
+      return new Uint8Array(0);
+    }
+    const outputLength = 16 * result.length;
+    const output = new Uint8Array(outputLength);
+    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+      output.set(result[i], j);
+    }
+    return output;
+  }
+}
+class AES128Cipher extends AESBaseCipher {
+  _rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);
+  constructor(key) {
+    super();
+    this._cyclesOfRepetition = 10;
+    this._keySize = 160;
+    this._key = this._expandKey(key);
+  }
+  _expandKey(cipherKey) {
+    const b = 176;
+    const s = this._s;
+    const rcon = this._rcon;
+    const result = new Uint8Array(b);
+    result.set(cipherKey);
+    for (let j = 16, i = 1; j < b; ++i) {
+      let t1 = result[j - 3];
+      let t2 = result[j - 2];
+      let t3 = result[j - 1];
+      let t4 = result[j - 4];
+      t1 = s[t1];
+      t2 = s[t2];
+      t3 = s[t3];
+      t4 = s[t4];
+      t1 ^= rcon[i];
+      for (let n = 0; n < 4; ++n) {
+        result[j] = t1 ^= result[j - 16];
+        j++;
+        result[j] = t2 ^= result[j - 16];
+        j++;
+        result[j] = t3 ^= result[j - 16];
+        j++;
+        result[j] = t4 ^= result[j - 16];
+        j++;
+      }
+    }
+    return result;
+  }
+}
+class AES256Cipher extends AESBaseCipher {
+  constructor(key) {
+    super();
+    this._cyclesOfRepetition = 14;
+    this._keySize = 224;
+    this._key = this._expandKey(key);
+  }
+  _expandKey(cipherKey) {
+    const b = 240;
+    const s = this._s;
+    const result = new Uint8Array(b);
+    result.set(cipherKey);
+    let r = 1;
+    let t1, t2, t3, t4;
+    for (let j = 32, i = 1; j < b; ++i) {
+      if (j % 32 === 16) {
+        t1 = s[t1];
+        t2 = s[t2];
+        t3 = s[t3];
+        t4 = s[t4];
+      } else if (j % 32 === 0) {
+        t1 = result[j - 3];
+        t2 = result[j - 2];
+        t3 = result[j - 1];
+        t4 = result[j - 4];
+        t1 = s[t1];
+        t2 = s[t2];
+        t3 = s[t3];
+        t4 = s[t4];
+        t1 ^= r;
+        if ((r <<= 1) >= 256) {
+          r = (r ^ 0x1b) & 0xff;
+        }
+      }
+      for (let n = 0; n < 4; ++n) {
+        result[j] = t1 ^= result[j - 32];
+        j++;
+        result[j] = t2 ^= result[j - 32];
+        j++;
+        result[j] = t3 ^= result[j - 32];
+        j++;
+        result[j] = t4 ^= result[j - 32];
+        j++;
+      }
+    }
+    return result;
+  }
+}
+class PDFBase {
+  _hash(password, input, userBytes) {
+    unreachable("Abstract method `_hash` called");
+  }
+  checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
+    const hashData = new Uint8Array(password.length + 56);
+    hashData.set(password, 0);
+    hashData.set(ownerValidationSalt, password.length);
+    hashData.set(userBytes, password.length + ownerValidationSalt.length);
+    const result = this._hash(password, hashData, userBytes);
+    return isArrayEqual(result, ownerPassword);
+  }
+  checkUserPassword(password, userValidationSalt, userPassword) {
+    const hashData = new Uint8Array(password.length + 8);
+    hashData.set(password, 0);
+    hashData.set(userValidationSalt, password.length);
+    const result = this._hash(password, hashData, []);
+    return isArrayEqual(result, userPassword);
+  }
+  getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
+    const hashData = new Uint8Array(password.length + 56);
+    hashData.set(password, 0);
+    hashData.set(ownerKeySalt, password.length);
+    hashData.set(userBytes, password.length + ownerKeySalt.length);
+    const key = this._hash(password, hashData, userBytes);
+    const cipher = new AES256Cipher(key);
+    return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
+  }
+  getUserKey(password, userKeySalt, userEncryption) {
+    const hashData = new Uint8Array(password.length + 8);
+    hashData.set(password, 0);
+    hashData.set(userKeySalt, password.length);
+    const key = this._hash(password, hashData, []);
+    const cipher = new AES256Cipher(key);
+    return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
+  }
+}
+class PDF17 extends PDFBase {
+  _hash(password, input, userBytes) {
+    return calculateSHA256(input, 0, input.length);
+  }
+}
+class PDF20 extends PDFBase {
+  _hash(password, input, userBytes) {
+    let k = calculateSHA256(input, 0, input.length).subarray(0, 32);
+    let e = [0];
+    let i = 0;
+    while (i < 64 || e.at(-1) > i - 32) {
+      const combinedLength = password.length + k.length + userBytes.length,
+        combinedArray = new Uint8Array(combinedLength);
+      let writeOffset = 0;
+      combinedArray.set(password, writeOffset);
+      writeOffset += password.length;
+      combinedArray.set(k, writeOffset);
+      writeOffset += k.length;
+      combinedArray.set(userBytes, writeOffset);
+      const k1 = new Uint8Array(combinedLength * 64);
+      for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) {
+        k1.set(combinedArray, pos);
+      }
+      const cipher = new AES128Cipher(k.subarray(0, 16));
+      e = cipher.encrypt(k1, k.subarray(16, 32));
+      const remainder = Math.sumPrecise(e.slice(0, 16)) % 3;
+      if (remainder === 0) {
+        k = calculateSHA256(e, 0, e.length);
+      } else if (remainder === 1) {
+        k = calculateSHA384(e, 0, e.length);
+      } else if (remainder === 2) {
+        k = calculateSHA512(e, 0, e.length);
+      }
+      i++;
+    }
+    return k.subarray(0, 32);
+  }
+}
+class CipherTransform {
+  #cipherCache = new Map();
+  embeddedFilterName = null;
+  constructor(resolveCipher, stringFilterName = null, streamFilterName = null) {
+    this.resolveCipher = resolveCipher;
+    this.streamFilterName = streamFilterName;
+    this.stringFilterName = stringFilterName;
+  }
+  #getCipher(filterName = null) {
+    const key = filterName instanceof Name ? filterName.name : "__default__";
+    return this.#cipherCache.getOrInsertComputed(key, () => this.resolveCipher(filterName));
+  }
+  createStream(stream, length, cryptFilterName = null) {
+    const defaultFilterName = this.embeddedFilterName && isDict(stream.dict, "EmbeddedFile") ? this.embeddedFilterName : this.streamFilterName;
+    const Cipher = this.#getCipher(cryptFilterName || defaultFilterName);
+    const cipher = new Cipher();
+    return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) {
+      return cipher.decryptBlock(data, finalize);
+    });
+  }
+  decryptString(s) {
+    const Cipher = this.#getCipher(this.stringFilterName);
+    const cipher = new Cipher();
+    let data = stringToBytes(s);
+    data = cipher.decryptBlock(data, true);
+    return bytesToString(data);
+  }
+  encryptString(s) {
+    const Cipher = this.#getCipher(this.stringFilterName);
+    const cipher = new Cipher();
+    if (cipher instanceof AESBaseCipher) {
+      const strLen = s.length;
+      const pad = 16 - strLen % 16;
+      s += String.fromCharCode(pad).repeat(pad);
+      const iv = new Uint8Array(16);
+      crypto.getRandomValues(iv);
+      let data = stringToBytes(s);
+      data = cipher.encrypt(data, iv);
+      const buf = new Uint8Array(16 + data.length);
+      buf.set(iv);
+      buf.set(data, 16);
+      return bytesToString(buf);
+    }
+    let data = stringToBytes(s);
+    data = cipher.encrypt(data);
+    return bytesToString(data);
+  }
+}
+class CipherTransformFactory {
+  #fileId;
+  static get _defaultPasswordBytes() {
+    return shadow(this, "_defaultPasswordBytes", new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a]));
+  }
+  #createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {
+    if (password) {
+      const passwordLength = Math.min(127, password.length);
+      password = password.subarray(0, passwordLength);
+    } else {
+      password = [];
+    }
+    const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17();
+    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {
+      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
+    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) {
+      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);
+    }
+    return null;
+  }
+  #prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) {
+    const hashDataSize = 40 + ownerPassword.length + fileId.length;
+    const hashData = new Uint8Array(hashDataSize);
+    let i = 0,
+      j,
+      n;
+    if (password) {
+      n = Math.min(32, password.length);
+      for (; i < n; ++i) {
+        hashData[i] = password[i];
+      }
+    }
+    j = 0;
+    while (i < 32) {
+      hashData[i++] = CipherTransformFactory._defaultPasswordBytes[j++];
+    }
+    hashData.set(ownerPassword, i);
+    i += ownerPassword.length;
+    hashData[i++] = flags & 0xff;
+    hashData[i++] = flags >> 8 & 0xff;
+    hashData[i++] = flags >> 16 & 0xff;
+    hashData[i++] = flags >>> 24 & 0xff;
+    hashData.set(fileId, i);
+    i += fileId.length;
+    if (revision >= 4 && !encryptMetadata) {
+      hashData.fill(0xff, i, i + 4);
+      i += 4;
+    }
+    let hash = calculateMD5(hashData, 0, i);
+    const keyLengthInBytes = keyLength >> 3;
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+        hash = calculateMD5(hash, 0, keyLengthInBytes);
+      }
+    }
+    const encryptionKey = hash.subarray(0, keyLengthInBytes);
+    let cipher, checkData;
+    if (revision >= 3) {
+      i = 0;
+      hashData.set(CipherTransformFactory._defaultPasswordBytes, i);
+      i += 32;
+      hashData.set(fileId, i);
+      i += fileId.length;
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
+      n = encryptionKey.length;
+      const derivedKey = new Uint8Array(n);
+      for (j = 1; j <= 19; ++j) {
+        for (let k = 0; k < n; ++k) {
+          derivedKey[k] = encryptionKey[k] ^ j;
+        }
+        cipher = new ARCFourCipher(derivedKey);
+        checkData = cipher.encryptBlock(checkData);
+      }
+    } else {
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(CipherTransformFactory._defaultPasswordBytes);
+    }
+    return checkData.every((data, k) => userPassword[k] === data) ? encryptionKey : null;
+  }
+  #decodeUserPassword(password, ownerPassword, revision, keyLength) {
+    const hashData = new Uint8Array(32);
+    let i = 0;
+    const n = Math.min(32, password.length);
+    for (; i < n; ++i) {
+      hashData[i] = password[i];
+    }
+    let j = 0;
+    while (i < 32) {
+      hashData[i++] = CipherTransformFactory._defaultPasswordBytes[j++];
+    }
+    let hash = calculateMD5(hashData, 0, i);
+    const keyLengthInBytes = keyLength >> 3;
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+        hash = calculateMD5(hash, 0, hash.length);
+      }
+    }
+    let cipher, userPassword;
+    if (revision >= 3) {
+      userPassword = ownerPassword;
+      const derivedKey = new Uint8Array(keyLengthInBytes);
+      for (j = 19; j >= 0; j--) {
+        for (let k = 0; k < keyLengthInBytes; ++k) {
+          derivedKey[k] = hash[k] ^ j;
+        }
+        cipher = new ARCFourCipher(derivedKey);
+        userPassword = cipher.encryptBlock(userPassword);
+      }
+    } else {
+      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
+      userPassword = cipher.encryptBlock(ownerPassword);
+    }
+    return userPassword;
+  }
+  #buildObjectKey(num, gen, encryptionKey, isAes = false) {
+    const n = encryptionKey.length;
+    const key = new Uint8Array(n + 9);
+    key.set(encryptionKey);
+    let i = n;
+    key[i++] = num & 0xff;
+    key[i++] = num >> 8 & 0xff;
+    key[i++] = num >> 16 & 0xff;
+    key[i++] = gen & 0xff;
+    key[i++] = gen >> 8 & 0xff;
+    if (isAes) {
+      key[i++] = 0x73;
+      key[i++] = 0x41;
+      key[i++] = 0x6c;
+      key[i++] = 0x54;
+    }
+    const hash = calculateMD5(key, 0, i);
+    return hash.subarray(0, Math.min(n + 5, 16));
+  }
+  constructor(dict, fileId, password) {
+    const filter = dict.get("Filter");
+    if (!isName(filter, "Standard")) {
+      throw new FormatError("unknown encryption method");
+    }
+    this.filterName = filter.name;
+    this.dict = dict;
+    this.#fileId = fileId;
+    const algorithm = dict.get("V");
+    if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) {
+      throw new FormatError("unsupported encryption algorithm");
+    }
+    this.algorithm = algorithm;
+    let keyLength = dict.get("Length");
+    if (!keyLength) {
+      if (algorithm <= 3) {
+        keyLength = 40;
+      } else {
+        const cfDict = dict.get("CF");
+        const streamCryptoName = dict.get("StmF");
+        if (cfDict instanceof Dict && streamCryptoName instanceof Name) {
+          cfDict.suppressEncryption = true;
+          const handlerDict = cfDict.get(streamCryptoName.name);
+          keyLength = handlerDict?.get("Length") || 128;
+          if (keyLength < 40) {
+            keyLength <<= 3;
+          }
+        }
+      }
+    }
+    if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {
+      throw new FormatError("invalid key length");
+    }
+    let cf = null;
+    let stmf = Name.get("Identity");
+    let strf = Name.get("Identity");
+    let eff = stmf;
+    if (algorithm >= 4) {
+      cf = dict.get("CF");
+      if (cf instanceof Dict) {
+        cf.suppressEncryption = true;
+      }
+      stmf = dict.get("StmF") || Name.get("Identity");
+      strf = dict.get("StrF") || Name.get("Identity");
+      eff = dict.get("EFF") || stmf;
+    }
+    this.cf = cf;
+    this.stmf = stmf;
+    this.strf = strf;
+    this.eff = eff;
+    const ownerBytes = stringToBytes(dict.get("O")),
+      userBytes = stringToBytes(dict.get("U"));
+    const ownerPassword = ownerBytes.subarray(0, 32);
+    const userPassword = userBytes.subarray(0, 32);
+    const flags = dict.get("P");
+    const revision = dict.get("R");
+    const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false;
+    this.encryptMetadata = encryptMetadata;
+    const fileIdBytes = stringToBytes(fileId);
+    let passwordBytes;
+    if (password) {
+      if (revision === 6) {
+        try {
+          password = utf8StringToString(password);
+        } catch {
+          warn("CipherTransformFactory: Unable to convert UTF8 encoded password.");
+        }
+      }
+      passwordBytes = stringToBytes(password);
+    }
+    let encryptionKey;
+    if (algorithm !== 5) {
+      encryptionKey = this.#prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
+    } else {
+      const ownerValidationSalt = ownerBytes.subarray(32, 40);
+      const ownerKeySalt = ownerBytes.subarray(40, 48);
+      const uBytes = userBytes.subarray(0, 48);
+      const userValidationSalt = userBytes.subarray(32, 40);
+      const userKeySalt = userBytes.subarray(40, 48);
+      const ownerEncryption = stringToBytes(dict.get("OE"));
+      const userEncryption = stringToBytes(dict.get("UE"));
+      const perms = stringToBytes(dict.get("Perms"));
+      encryptionKey = this.#createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);
+    }
+    if (!encryptionKey) {
+      if (!password) {
+        if (this.algorithm >= 4 && isName(this.stmf, "Identity") && isName(this.strf, "Identity")) {
+          const effCF = this.cf?.get(this.eff.name);
+          const authEvent = effCF?.get("AuthEvent");
+          if (isName(authEvent, "EFOpen")) {
+            this.encryptionKey = null;
+            return;
+          }
+        }
+        throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD);
+      }
+      const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);
+      encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
+    }
+    if (!encryptionKey) {
+      throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD);
+    }
+    if (algorithm === 4 && encryptionKey.length < 16) {
+      this.encryptionKey = new Uint8Array(16);
+      this.encryptionKey.set(encryptionKey);
+    } else {
+      this.encryptionKey = encryptionKey;
+    }
+  }
+  setPassword(password) {
+    const transform = new CipherTransformFactory(this.dict, this.#fileId, password);
+    this.encryptionKey = transform.encryptionKey;
+  }
+  createCipherTransform(num, gen) {
+    if (this.algorithm === 4 || this.algorithm === 5) {
+      const resolveCipher = filterName => {
+        if (!(filterName instanceof Name)) {
+          throw new FormatError("Invalid crypt filter name.");
+        }
+        const cryptFilter = this.cf.get(filterName.name);
+        const cfm = cryptFilter?.get("CFM");
+        if (!cfm || cfm.name === "None") {
+          return NullCipher;
+        }
+        if (!this.encryptionKey) {
+          throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD);
+        }
+        if (this.algorithm === 5) {
+          return AES256Cipher.bind(null, this.encryptionKey);
+        }
+        if (cfm.name === "V2") {
+          return ARCFourCipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, false));
+        }
+        if (cfm.name === "AESV2") {
+          return AES128Cipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, true));
+        }
+        if (cfm.name === "AESV3") {
+          return AES256Cipher.bind(null, this.encryptionKey);
+        }
+        throw new FormatError("Unknown crypto method");
+      };
+      const transform = new CipherTransform(resolveCipher, this.strf, this.stmf);
+      transform.embeddedFilterName = this.eff;
+      return transform;
+    }
+    const resolveCipher = () => ARCFourCipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, false));
+    return new CipherTransform(resolveCipher);
+  }
+}
+
+;// ./src/core/xref.js
+
+
+
+
+
+
+class XRef {
+  constructor(stream, pdfManager) {
+    this.stream = stream;
+    this.pdfManager = pdfManager;
+    this.entries = [];
+    this._xrefStms = new Set();
+    this._cacheMap = new Map();
+    this._pendingRefs = new RefSet();
+    this._newPersistentRefNum = null;
+    this._newTemporaryRefNum = null;
+    this._persistentRefsCache = null;
+  }
+  getNewPersistentRef(obj) {
+    if (this._newPersistentRefNum === null) {
+      this._newPersistentRefNum = this.entries.length || 1;
+    }
+    const num = this._newPersistentRefNum++;
+    this._cacheMap.set(num, obj);
+    return Ref.get(num, 0);
+  }
+  getNewTemporaryRef() {
+    if (this._newTemporaryRefNum === null) {
+      this._newTemporaryRefNum = this.entries.length || 1;
+      if (this._newPersistentRefNum) {
+        this._persistentRefsCache = new Map();
+        for (let i = this._newTemporaryRefNum; i < this._newPersistentRefNum; i++) {
+          this._persistentRefsCache.set(i, this._cacheMap.get(i));
+          this._cacheMap.delete(i);
+        }
+      }
+    }
+    return Ref.get(this._newTemporaryRefNum++, 0);
+  }
+  resetNewTemporaryRef() {
+    this._newTemporaryRefNum = null;
+    if (this._persistentRefsCache) {
+      for (const [num, obj] of this._persistentRefsCache) {
+        this._cacheMap.set(num, obj);
+      }
+    }
+    this._persistentRefsCache = null;
+  }
+  setStartXRef(startXRef) {
+    this.startXRefQueue = [startXRef];
+  }
+  parse(recoveryMode = false) {
+    let trailerDict;
+    if (!recoveryMode) {
+      trailerDict = this.readXRef();
+    } else {
+      warn("Indexing all PDF objects");
+      trailerDict = this.indexObjects();
+    }
+    trailerDict.assignXref(this);
+    this.trailer = trailerDict;
+    let encrypt;
+    try {
+      encrypt = trailerDict.get("Encrypt");
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`);
+    }
+    if (encrypt instanceof Dict) {
+      const ids = trailerDict.get("ID");
+      const fileId = ids?.length ? ids[0] : "";
+      encrypt.suppressEncryption = true;
+      this.encrypt = new CipherTransformFactory(encrypt, fileId, this.pdfManager.password);
+    }
+    let root;
+    try {
+      root = trailerDict.get("Root");
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn(`XRef.parse - Invalid "Root" reference: "${ex}".`);
+    }
+    if (root instanceof Dict) {
+      try {
+        const pages = root.get("Pages");
+        if (pages instanceof Dict) {
+          this.root = root;
+          return;
+        }
+      } catch (ex) {
+        if (ex instanceof MissingDataException) {
+          throw ex;
+        }
+        warn(`XRef.parse - Invalid "Pages" reference: "${ex}".`);
+      }
+    }
+    if (!recoveryMode) {
+      throw new XRefParseException();
+    }
+    throw new InvalidPDFException("Invalid Root reference.");
+  }
+  processXRefTable(parser) {
+    if (!("tableState" in this)) {
+      this.tableState = {
+        entryNum: 0,
+        streamPos: parser.lexer.stream.pos,
+        parserBuf1: parser.buf1,
+        parserBuf2: parser.buf2
+      };
+    }
+    const obj = this.readXRefTable(parser);
+    if (!isCmd(obj, "trailer")) {
+      throw new FormatError("Invalid XRef table: could not find trailer dictionary");
+    }
+    let dict = parser.getObj();
+    if (!(dict instanceof Dict) && dict.dict) {
+      dict = dict.dict;
+    }
+    if (!(dict instanceof Dict)) {
+      throw new FormatError("Invalid XRef table: could not parse trailer dictionary");
+    }
+    delete this.tableState;
+    return dict;
+  }
+  readXRefTable(parser) {
+    const stream = parser.lexer.stream;
+    const tableState = this.tableState;
+    stream.pos = tableState.streamPos;
+    parser.buf1 = tableState.parserBuf1;
+    parser.buf2 = tableState.parserBuf2;
+    let obj;
+    while (true) {
+      if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) {
+        if (isCmd(obj = parser.getObj(), "trailer")) {
+          break;
+        }
+        tableState.firstEntryNum = obj;
+        tableState.entryCount = parser.getObj();
+      }
+      let first = tableState.firstEntryNum;
+      const count = tableState.entryCount;
+      if (!Number.isInteger(first) || !Number.isInteger(count)) {
+        throw new FormatError("Invalid XRef table: wrong types in subsection header");
+      }
+      for (let i = tableState.entryNum; i < count; i++) {
+        tableState.streamPos = stream.pos;
+        tableState.entryNum = i;
+        tableState.parserBuf1 = parser.buf1;
+        tableState.parserBuf2 = parser.buf2;
+        const entry = {};
+        entry.offset = parser.getObj();
+        entry.gen = parser.getObj();
+        const type = parser.getObj();
+        if (type instanceof Cmd) {
+          switch (type.cmd) {
+            case "f":
+              entry.free = true;
+              break;
+            case "n":
+              entry.uncompressed = true;
+              break;
+          }
+        }
+        if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) {
+          throw new FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`);
+        }
+        if (i === 0 && entry.free && first === 1) {
+          first = 0;
+        }
+        if (!this.entries[i + first]) {
+          this.entries[i + first] = entry;
+        }
+      }
+      tableState.entryNum = 0;
+      tableState.streamPos = stream.pos;
+      tableState.parserBuf1 = parser.buf1;
+      tableState.parserBuf2 = parser.buf2;
+      delete tableState.firstEntryNum;
+      delete tableState.entryCount;
+    }
+    if (this.entries[0] && !this.entries[0].free) {
+      throw new FormatError("Invalid XRef table: unexpected first object");
+    }
+    return obj;
+  }
+  processXRefStream(stream) {
+    if (!("streamState" in this)) {
+      const {
+        dict,
+        pos
+      } = stream;
+      const byteWidths = dict.get("W");
+      const range = dict.get("Index") || [0, dict.get("Size")];
+      this.streamState = {
+        entryRanges: range,
+        byteWidths,
+        entryNum: 0,
+        streamPos: pos
+      };
+    }
+    this.readXRefStream(stream);
+    delete this.streamState;
+    return stream.dict;
+  }
+  readXRefStream(stream) {
+    const streamState = this.streamState;
+    stream.pos = streamState.streamPos;
+    const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] = streamState.byteWidths;
+    const entryRanges = streamState.entryRanges;
+    while (entryRanges.length > 0) {
+      const [first, n] = entryRanges;
+      if (!Number.isInteger(first) || !Number.isInteger(n)) {
+        throw new FormatError(`Invalid XRef range fields: ${first}, ${n}`);
+      }
+      if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) {
+        throw new FormatError(`Invalid XRef entry fields length: ${first}, ${n}`);
+      }
+      for (let i = streamState.entryNum; i < n; ++i) {
+        streamState.entryNum = i;
+        streamState.streamPos = stream.pos;
+        let type = 0,
+          offset = 0,
+          generation = 0;
+        for (let j = 0; j < typeFieldWidth; ++j) {
+          const typeByte = stream.getByte();
+          if (typeByte === -1) {
+            throw new FormatError("Invalid XRef byteWidths 'type'.");
+          }
+          type = type << 8 | typeByte;
+        }
+        if (typeFieldWidth === 0) {
+          type = 1;
+        }
+        for (let j = 0; j < offsetFieldWidth; ++j) {
+          const offsetByte = stream.getByte();
+          if (offsetByte === -1) {
+            throw new FormatError("Invalid XRef byteWidths 'offset'.");
+          }
+          offset = offset << 8 | offsetByte;
+        }
+        for (let j = 0; j < generationFieldWidth; ++j) {
+          const generationByte = stream.getByte();
+          if (generationByte === -1) {
+            throw new FormatError("Invalid XRef byteWidths 'generation'.");
+          }
+          generation = generation << 8 | generationByte;
+        }
+        const entry = {};
+        entry.offset = offset;
+        entry.gen = generation;
+        switch (type) {
+          case 0:
+            entry.free = true;
+            break;
+          case 1:
+            entry.uncompressed = true;
+            break;
+          case 2:
+            break;
+          default:
+            throw new FormatError(`Invalid XRef entry type: ${type}`);
+        }
+        if (!this.entries[first + i]) {
+          this.entries[first + i] = entry;
+        }
+      }
+      streamState.entryNum = 0;
+      streamState.streamPos = stream.pos;
+      entryRanges.splice(0, 2);
+    }
+  }
+  indexObjects() {
+    const TAB = 0x9,
+      LF = 0xa,
+      CR = 0xd,
+      SPACE = 0x20;
+    const PERCENT = 0x25,
+      LT = 0x3c;
+    function readToken(data, offset) {
+      let token = "",
+        ch = data[offset];
+      while (ch !== LF && ch !== CR && ch !== LT) {
+        if (++offset >= data.length) {
+          break;
+        }
+        token += String.fromCharCode(ch);
+        ch = data[offset];
+      }
+      return token;
+    }
+    function skipUntil(data, offset, what) {
+      const length = what.length,
+        dataLength = data.length;
+      let skipped = 0;
+      while (offset < dataLength) {
+        let i = 0;
+        while (i < length && data[offset + i] === what[i]) {
+          ++i;
+        }
+        if (i >= length) {
+          break;
+        }
+        offset++;
+        skipped++;
+      }
+      return skipped;
+    }
+    const gEndobjRegExp = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g;
+    const gStartxrefRegExp = /\b(startxref|\d+\s+\d+\s+obj)\b/g;
+    const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/;
+    const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
+    const startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);
+    const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
+    this.entries.length = 0;
+    this._cacheMap.clear();
+    const stream = this.stream;
+    stream.pos = 0;
+    const buffer = stream.getBytes(),
+      bufferStr = bytesToString(buffer),
+      length = buffer.length;
+    let position = stream.start;
+    const trailers = [],
+      xrefStms = [];
+    while (position < length) {
+      let ch = buffer[position];
+      if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {
+        ++position;
+        continue;
+      }
+      if (ch === PERCENT) {
+        do {
+          ++position;
+          if (position >= length) {
+            break;
+          }
+          ch = buffer[position];
+        } while (ch !== LF && ch !== CR);
+        continue;
+      }
+      const token = readToken(buffer, position);
+      let m;
+      if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) {
+        position += skipUntil(buffer, position, trailerBytes);
+        trailers.push(position);
+        position += skipUntil(buffer, position, startxrefBytes);
+      } else if (m = objRegExp.exec(token)) {
+        const num = m[1] | 0,
+          gen = m[2] | 0;
+        const startPos = position + token.length;
+        let contentLength,
+          updateEntries = false;
+        if (!this.entries[num]) {
+          updateEntries = true;
+        } else if (this.entries[num].gen === gen) {
+          try {
+            const parser = new Parser({
+              lexer: new Lexer(stream.makeSubStream(startPos))
+            });
+            parser.getObj();
+            updateEntries = true;
+          } catch (ex) {
+            if (ex instanceof ParserEOFException) {
+              warn(`indexObjects -- checking object (${token}): "${ex}".`);
+            } else {
+              updateEntries = true;
+            }
+          }
+        }
+        if (updateEntries) {
+          this.entries[num] = {
+            offset: position - stream.start,
+            gen,
+            uncompressed: true
+          };
+        }
+        gEndobjRegExp.lastIndex = startPos;
+        const match = gEndobjRegExp.exec(bufferStr);
+        if (match) {
+          const endPos = gEndobjRegExp.lastIndex + 1;
+          contentLength = endPos - position;
+          if (match[1] !== "endobj") {
+            warn(`indexObjects: Found "${match[1]}" inside of another "obj", ` + 'caused by missing "endobj" -- trying to recover.');
+            contentLength -= match[1].length + 1;
+          }
+        } else {
+          contentLength = length - position;
+        }
+        const content = buffer.subarray(position, position + contentLength);
+        const xrefTagOffset = skipUntil(content, 0, xrefBytes);
+        if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {
+          xrefStms.push(position - stream.start);
+          this._xrefStms.add(position - stream.start);
+        }
+        position += contentLength;
+      } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) {
+        trailers.push(position);
+        const startPos = position + token.length;
+        let contentLength;
+        gStartxrefRegExp.lastIndex = startPos;
+        const match = gStartxrefRegExp.exec(bufferStr);
+        if (match) {
+          const endPos = gStartxrefRegExp.lastIndex + 1;
+          contentLength = endPos - position;
+          if (match[1] !== "startxref") {
+            warn(`indexObjects: Found "${match[1]}" after "trailer", ` + 'caused by missing "startxref" -- trying to recover.');
+            contentLength -= match[1].length + 1;
+          }
+        } else {
+          contentLength = length - position;
+        }
+        position += contentLength;
+      } else {
+        position += token.length + 1;
+      }
+    }
+    for (const xrefStm of xrefStms) {
+      this.startXRefQueue.push(xrefStm);
+      this.readXRef(true);
+    }
+    const trailerDicts = [];
+    let isEncrypted = false;
+    for (const trailer of trailers) {
+      stream.pos = trailer;
+      const parser = new Parser({
+        lexer: new Lexer(stream),
+        xref: this,
+        allowStreams: true,
+        recoveryMode: true
+      });
+      const obj = parser.getObj();
+      if (!isCmd(obj, "trailer")) {
+        continue;
+      }
+      const dict = parser.getObj();
+      if (!(dict instanceof Dict)) {
+        continue;
+      }
+      trailerDicts.push(dict);
+      if (dict.has("Encrypt")) {
+        isEncrypted = true;
+      }
+    }
+    let trailerDict, trailerError;
+    for (const dict of [...trailerDicts, "genFallback", ...trailerDicts]) {
+      if (dict === "genFallback") {
+        if (!trailerError) {
+          break;
+        }
+        this._generationFallback = true;
+        continue;
+      }
+      let validPagesDict = false;
+      try {
+        const rootDict = dict.get("Root");
+        if (!(rootDict instanceof Dict)) {
+          continue;
+        }
+        const pagesDict = rootDict.get("Pages");
+        if (!(pagesDict instanceof Dict)) {
+          continue;
+        }
+        const pagesCount = pagesDict.get("Count");
+        if (Number.isInteger(pagesCount)) {
+          validPagesDict = true;
+        }
+      } catch (ex) {
+        trailerError = ex;
+        continue;
+      }
+      if (validPagesDict && (!isEncrypted || dict.has("Encrypt")) && dict.has("ID")) {
+        return dict;
+      }
+      trailerDict = dict;
+    }
+    if (trailerDict) {
+      return trailerDict;
+    }
+    if (this.topDict) {
+      return this.topDict;
+    }
+    if (!trailerDicts.length) {
+      for (const num in this.entries) {
+        const entry = this.entries[num];
+        if (!entry) {
+          continue;
+        }
+        const ref = Ref.get(parseInt(num, 10), entry.gen);
+        let obj;
+        try {
+          obj = this.fetch(ref);
+        } catch {
+          continue;
+        }
+        if (obj instanceof BaseStream) {
+          obj = obj.dict;
+        }
+        if (obj instanceof Dict && obj.has("Root")) {
+          return obj;
+        }
+      }
+    }
+    throw new InvalidPDFException("Invalid PDF structure.");
+  }
+  readXRef(recoveryMode = false) {
+    const stream = this.stream;
+    const startXRefParsedCache = new Set();
+    while (this.startXRefQueue.length) {
+      try {
+        const startXRef = this.startXRefQueue[0];
+        if (startXRefParsedCache.has(startXRef)) {
+          warn("readXRef - skipping XRef table since it was already parsed.");
+          this.startXRefQueue.shift();
+          continue;
+        }
+        startXRefParsedCache.add(startXRef);
+        stream.pos = startXRef + stream.start;
+        const parser = new Parser({
+          lexer: new Lexer(stream),
+          xref: this,
+          allowStreams: true
+        });
+        let obj = parser.getObj();
+        let dict;
+        if (isCmd(obj, "xref")) {
+          dict = this.processXRefTable(parser);
+          if (!this.topDict) {
+            this.topDict = dict;
+          }
+          obj = dict.get("XRefStm");
+          if (Number.isInteger(obj) && !this._xrefStms.has(obj)) {
+            this._xrefStms.add(obj);
+            this.startXRefQueue.push(obj);
+          }
+        } else if (Number.isInteger(obj)) {
+          if (!Number.isInteger(parser.getObj()) || !isCmd(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof BaseStream)) {
+            throw new FormatError("Invalid XRef stream");
+          }
+          dict = this.processXRefStream(obj);
+          if (!this.topDict) {
+            this.topDict = dict;
+          }
+          if (!dict) {
+            throw new FormatError("Failed to read XRef stream");
+          }
+        } else {
+          throw new FormatError("Invalid XRef stream header");
+        }
+        obj = dict.get("Prev");
+        if (Number.isInteger(obj)) {
+          this.startXRefQueue.push(obj);
+        } else if (obj instanceof Ref) {
+          this.startXRefQueue.push(obj.num);
+        }
+      } catch (e) {
+        if (e instanceof MissingDataException) {
+          throw e;
+        }
+        info("(while reading XRef): " + e);
+      }
+      this.startXRefQueue.shift();
+    }
+    if (this.topDict) {
+      return this.topDict;
+    }
+    if (recoveryMode) {
+      return undefined;
+    }
+    throw new XRefParseException();
+  }
+  getEntry(i) {
+    const xrefEntry = this.entries[i];
+    if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
+      return xrefEntry;
+    }
+    return null;
+  }
+  fetchIfRef(obj, suppressEncryption = false) {
+    if (obj instanceof Ref) {
+      return this.fetch(obj, suppressEncryption);
+    }
+    return obj;
+  }
+  fetch(ref, suppressEncryption = false) {
+    if (!(ref instanceof Ref)) {
+      throw new Error("ref object is not a reference");
+    }
+    const num = ref.num;
+    const cacheEntry = this._cacheMap.get(num);
+    if (cacheEntry !== undefined) {
+      if (cacheEntry instanceof Dict && !cacheEntry.objId) {
+        cacheEntry.objId = ref.toString();
+      }
+      return cacheEntry;
+    }
+    let xrefEntry = this.getEntry(num);
+    if (xrefEntry === null) {
+      return xrefEntry;
+    }
+    if (this._pendingRefs.has(ref)) {
+      this._pendingRefs.remove(ref);
+      warn(`Ignoring circular reference: ${ref}.`);
+      return CIRCULAR_REF;
+    }
+    this._pendingRefs.put(ref);
+    try {
+      xrefEntry = xrefEntry.uncompressed ? this.fetchUncompressed(ref, xrefEntry, suppressEncryption) : this.fetchCompressed(ref, xrefEntry, suppressEncryption);
+      this._pendingRefs.remove(ref);
+    } catch (ex) {
+      this._pendingRefs.remove(ref);
+      throw ex;
+    }
+    if (xrefEntry instanceof Dict) {
+      xrefEntry.objId = ref.toString();
+    } else if (xrefEntry instanceof BaseStream) {
+      xrefEntry.dict.objId = ref.toString();
+    }
+    return xrefEntry;
+  }
+  fetchUncompressed(ref, xrefEntry, suppressEncryption = false) {
+    const gen = ref.gen;
+    let num = ref.num;
+    if (xrefEntry.gen !== gen) {
+      const msg = `Inconsistent generation in XRef: ${ref}`;
+      if (this._generationFallback && xrefEntry.gen < gen) {
+        warn(msg);
+        return this.fetchUncompressed(Ref.get(num, xrefEntry.gen), xrefEntry, suppressEncryption);
+      }
+      throw new XRefEntryException(msg);
+    }
+    const stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);
+    const parser = new Parser({
+      lexer: new Lexer(stream),
+      xref: this,
+      allowStreams: true
+    });
+    const obj1 = parser.getObj();
+    const obj2 = parser.getObj();
+    const obj3 = parser.getObj();
+    if (obj1 !== num || obj2 !== gen || !(obj3 instanceof Cmd)) {
+      throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);
+    }
+    if (obj3.cmd !== "obj") {
+      if (obj3.cmd.startsWith("obj")) {
+        num = parseInt(obj3.cmd.substring(3), 10);
+        if (!Number.isNaN(num)) {
+          return num;
+        }
+      }
+      throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);
+    }
+    xrefEntry = this.encrypt && !suppressEncryption ? parser.getObj(this.encrypt.createCipherTransform(num, gen)) : parser.getObj();
+    if (!(xrefEntry instanceof BaseStream)) {
+      this._cacheMap.set(num, xrefEntry);
+    }
+    return xrefEntry;
+  }
+  fetchCompressed(ref, xrefEntry, suppressEncryption = false) {
+    const tableOffset = xrefEntry.offset;
+    const stream = this.fetch(Ref.get(tableOffset, 0));
+    if (!(stream instanceof BaseStream)) {
+      throw new FormatError("bad ObjStm stream");
+    }
+    const first = stream.dict.get("First");
+    const n = stream.dict.get("N");
+    if (!Number.isInteger(first) || !Number.isInteger(n)) {
+      throw new FormatError("invalid first and n parameters for ObjStm stream");
+    }
+    let parser = new Parser({
+      lexer: new Lexer(stream),
+      xref: this,
+      allowStreams: true
+    });
+    const nums = new Array(n);
+    const offsets = new Array(n);
+    for (let i = 0; i < n; ++i) {
+      const num = parser.getObj();
+      if (!Number.isInteger(num)) {
+        throw new FormatError(`invalid object number in the ObjStm stream: ${num}`);
+      }
+      const offset = parser.getObj();
+      if (!Number.isInteger(offset)) {
+        throw new FormatError(`invalid object offset in the ObjStm stream: ${offset}`);
+      }
+      nums[i] = num;
+      const entry = this.getEntry(num);
+      if (entry?.offset === tableOffset && entry.gen !== i) {
+        entry.gen = i;
+      }
+      offsets[i] = offset;
+    }
+    const start = (stream.start || 0) + first;
+    const entries = new Array(n);
+    for (let i = 0; i < n; ++i) {
+      const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined;
+      if (length < 0) {
+        throw new FormatError("Invalid offset in the ObjStm stream.");
+      }
+      parser = new Parser({
+        lexer: new Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)),
+        xref: this,
+        allowStreams: true
+      });
+      const obj = parser.getObj();
+      entries[i] = obj;
+      if (obj instanceof BaseStream) {
+        continue;
+      }
+      const num = nums[i],
+        entry = this.entries[num];
+      if (entry && entry.offset === tableOffset && entry.gen === i) {
+        this._cacheMap.set(num, obj);
+      }
+    }
+    xrefEntry = entries[xrefEntry.gen];
+    if (xrefEntry === undefined) {
+      throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`);
+    }
+    return xrefEntry;
+  }
+  async fetchIfRefAsync(obj, suppressEncryption) {
+    if (obj instanceof Ref) {
+      return this.fetchAsync(obj, suppressEncryption);
+    }
+    return obj;
+  }
+  async fetchAsync(ref, suppressEncryption) {
+    try {
+      return this.fetch(ref, suppressEncryption);
+    } catch (ex) {
+      if (!(ex instanceof MissingDataException)) {
+        throw ex;
+      }
+      await this.pdfManager.requestRange(ex.begin, ex.end);
+      return this.fetchAsync(ref, suppressEncryption);
+    }
+  }
+  getCatalogObj() {
+    return this.root;
+  }
+}
+
+;// ./src/core/document.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
+class Page {
+  #resourcesPromise = null;
+  constructor({
+    pdfManager,
+    xref,
+    pageIndex,
+    pageDict,
+    ref,
+    globalIdFactory,
+    fontCache,
+    builtInCMapCache,
+    standardFontDataCache,
+    globalColorSpaceCache,
+    globalImageCache,
+    systemFontCache,
+    nonBlendModesSet,
+    xfaFactory
+  }) {
+    this.pdfManager = pdfManager;
+    this.pageIndex = pageIndex;
+    this.pageDict = pageDict;
+    this.xref = xref;
+    this.ref = ref;
+    this.fontCache = fontCache;
+    this.builtInCMapCache = builtInCMapCache;
+    this.standardFontDataCache = standardFontDataCache;
+    this.globalColorSpaceCache = globalColorSpaceCache;
+    this.globalImageCache = globalImageCache;
+    this.systemFontCache = systemFontCache;
+    this.nonBlendModesSet = nonBlendModesSet;
+    this.evaluatorOptions = pdfManager.evaluatorOptions;
+    this.xfaFactory = xfaFactory;
+    const idCounters = {
+      obj: 0
+    };
+    this._localIdFactory = class extends globalIdFactory {
+      static createObjId() {
+        return `p${pageIndex}_${++idCounters.obj}`;
+      }
+      static getPageObjId() {
+        return `p${ref.toString()}`;
+      }
+    };
+  }
+  #createPartialEvaluator(handler, pageIndex = this.pageIndex) {
+    return new PartialEvaluator({
+      xref: this.xref,
+      handler,
+      pageIndex,
+      idFactory: this._localIdFactory,
+      fontCache: this.fontCache,
+      builtInCMapCache: this.builtInCMapCache,
+      standardFontDataCache: this.standardFontDataCache,
+      globalColorSpaceCache: this.globalColorSpaceCache,
+      globalImageCache: this.globalImageCache,
+      systemFontCache: this.systemFontCache,
+      options: this.evaluatorOptions
+    });
+  }
+  createAnnotationEvaluator(handler) {
+    return this.#createPartialEvaluator(handler);
+  }
+  #getInheritableProperty(key, getArray = false) {
+    const value = getInheritableProperty({
+      dict: this.pageDict,
+      key,
+      getArray,
+      stopWhenFound: false
+    });
+    if (!Array.isArray(value)) {
+      return value;
+    }
+    if (value.length === 1 || !(value[0] instanceof Dict)) {
+      return value[0];
+    }
+    return Dict.merge({
+      xref: this.xref,
+      dictArray: value
+    });
+  }
+  get content() {
+    return this.pageDict.getArray("Contents");
+  }
+  get resources() {
+    const resources = this.#getInheritableProperty("Resources");
+    return shadow(this, "resources", resources instanceof Dict ? resources : Dict.empty);
+  }
+  getBoundingBox(name) {
+    if (this.xfaData) {
+      return this.xfaData.bbox;
+    }
+    const box = lookupNormalRect(this.#getInheritableProperty(name, true), null);
+    if (box) {
+      if (box[2] - box[0] > 0 && box[3] - box[1] > 0) {
+        return box;
+      }
+      warn(`Empty, or invalid, /${name} entry.`);
+    }
+    return null;
+  }
+  get mediaBox() {
+    return shadow(this, "mediaBox", this.getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX);
+  }
+  get cropBox() {
+    return shadow(this, "cropBox", this.getBoundingBox("CropBox") || this.mediaBox);
+  }
+  get userUnit() {
+    const obj = this.pageDict.get("UserUnit");
+    return shadow(this, "userUnit", typeof obj === "number" && obj > 0 ? obj : 1.0);
+  }
+  get view() {
+    const {
+      cropBox,
+      mediaBox
+    } = this;
+    if (cropBox !== mediaBox && !isArrayEqual(cropBox, mediaBox)) {
+      const box = Util.intersect(cropBox, mediaBox);
+      if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) {
+        return shadow(this, "view", box);
+      }
+      warn("Empty /CropBox and /MediaBox intersection.");
+    }
+    return shadow(this, "view", mediaBox);
+  }
+  get rotate() {
+    let rotate = this.#getInheritableProperty("Rotate") || 0;
+    if (rotate % 90 !== 0) {
+      rotate = 0;
+    } else if (rotate >= 360) {
+      rotate %= 360;
+    } else if (rotate < 0) {
+      rotate = (rotate % 360 + 360) % 360;
+    }
+    return shadow(this, "rotate", rotate);
+  }
+  #onSubStreamError(reason, objId) {
+    if (this.evaluatorOptions.ignoreErrors) {
+      warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`);
+      return;
+    }
+    throw reason;
+  }
+  async getContentStream() {
+    const content = await this.pdfManager.ensure(this, "content");
+    if (content instanceof BaseStream && !content.isImageStream) {
+      if (content.isAsync) {
+        const bytes = await content.asyncGetBytes();
+        if (bytes) {
+          return new Stream(bytes, 0, bytes.length, content.dict);
+        }
+      }
+      return content;
+    }
+    if (Array.isArray(content)) {
+      const promises = [];
+      for (let i = 0, ii = content.length; i < ii; i++) {
+        const item = content[i];
+        if (item instanceof BaseStream && item.isAsync) {
+          promises.push(item.asyncGetBytes().then(bytes => {
+            if (bytes) {
+              content[i] = new Stream(bytes, 0, bytes.length, item.dict);
+            }
+          }));
+        }
+      }
+      if (promises.length > 0) {
+        await Promise.all(promises);
+      }
+      return new StreamsSequenceStream(content, this.#onSubStreamError.bind(this));
+    }
+    return new NullStream();
+  }
+  get xfaData() {
+    return shadow(this, "xfaData", this.xfaFactory ? {
+      bbox: this.xfaFactory.getBoundingBox(this.pageIndex)
+    } : null);
+  }
+  async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) {
+    const promises = [];
+    for (const annotation of annotations) {
+      if (annotation.id) {
+        const ref = Ref.fromString(annotation.id);
+        if (!ref) {
+          warn(`A non-linked annotation cannot be modified: ${annotation.id}`);
+          continue;
+        }
+        if (annotation.deleted) {
+          deletedAnnotations.put(ref, ref);
+          if (annotation.popupRef) {
+            const popupRef = Ref.fromString(annotation.popupRef);
+            if (popupRef) {
+              deletedAnnotations.put(popupRef, popupRef);
+            }
+          }
+          continue;
+        }
+        if (annotation.popup?.deleted) {
+          const popupRef = Ref.fromString(annotation.popupRef);
+          if (popupRef) {
+            deletedAnnotations.put(popupRef, popupRef);
+          }
+        }
+        existingAnnotations?.put(ref);
+        annotation.ref = ref;
+        promises.push(this.xref.fetchAsync(ref).then(obj => {
+          if (obj instanceof Dict) {
+            annotation.oldAnnotation = obj.clone();
+          }
+        }, () => {
+          warn(`Cannot fetch \`oldAnnotation\` for: ${ref}.`);
+        }));
+        delete annotation.id;
+      }
+    }
+    await Promise.all(promises);
+  }
+  async saveNewAnnotations(handler, task, annotations, imagePromises, changes) {
+    if (this.xfaFactory) {
+      throw new Error("XFA: Cannot save new annotations.");
+    }
+    const partialEvaluator = this.#createPartialEvaluator(handler);
+    const deletedAnnotations = new RefSetCache();
+    const existingAnnotations = new RefSet();
+    await this.#replaceIdByRef(annotations, deletedAnnotations, existingAnnotations);
+    const pageDict = this.pageDict;
+    const annotationsArray = this.annotations.filter(a => !(a instanceof Ref && deletedAnnotations.has(a)));
+    const newData = await AnnotationFactory.saveNewAnnotations(partialEvaluator, this.xref, task, annotations, imagePromises, changes);
+    for (const {
+      ref
+    } of newData.annotations) {
+      if (ref instanceof Ref && !existingAnnotations.has(ref)) {
+        annotationsArray.push(ref);
+      }
+    }
+    const dict = pageDict.clone();
+    dict.set("Annots", annotationsArray);
+    changes.put(this.ref, {
+      data: dict
+    });
+    for (const deletedRef of deletedAnnotations) {
+      changes.put(deletedRef, {
+        data: null
+      });
+    }
+  }
+  async save(handler, task, annotationStorage, changes) {
+    const partialEvaluator = this.#createPartialEvaluator(handler);
+    const annotations = await this._parsedAnnotations;
+    const promises = [];
+    for (const annotation of annotations) {
+      promises.push(annotation.save(partialEvaluator, task, annotationStorage, changes).catch(function (reason) {
+        warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`);
+        return null;
+      }));
+    }
+    return Promise.all(promises);
+  }
+  async loadResources(keys) {
+    await (this.#resourcesPromise ??= this.pdfManager.ensure(this, "resources"));
+    await ObjectLoader.load(this.resources, keys, this.xref);
+  }
+  async #getMergedResources(streamDict, keys) {
+    const localResources = streamDict?.get("Resources");
+    if (!(localResources instanceof Dict && localResources.size)) {
+      return this.resources;
+    }
+    await ObjectLoader.load(localResources, keys, this.xref);
+    return Dict.merge({
+      xref: this.xref,
+      dictArray: [localResources, this.resources],
+      mergeSubDicts: true
+    });
+  }
+  async getOperatorList({
+    handler,
+    sink,
+    task,
+    intent,
+    cacheKey,
+    pageIndex = this.pageIndex,
+    annotationStorage = null,
+    modifiedIds = null
+  }) {
+    const contentStreamPromise = this.getContentStream();
+    const resourcesPromise = this.loadResources(RESOURCES_KEYS_OPERATOR_LIST);
+    const partialEvaluator = this.#createPartialEvaluator(handler, pageIndex);
+    const newAnnotsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null;
+    const newAnnots = newAnnotsByPage?.get(this.pageIndex);
+    let newAnnotationsPromise = Promise.resolve(null);
+    let deletedAnnotations = null;
+    if (newAnnots) {
+      const annotationGlobalsPromise = this.pdfManager.ensureDoc("annotationGlobals");
+      let imagePromises;
+      const missingBitmaps = new Set();
+      for (const {
+        bitmapId,
+        bitmap
+      } of newAnnots) {
+        if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) {
+          missingBitmaps.add(bitmapId);
+        }
+      }
+      const {
+        isOffscreenCanvasSupported
+      } = this.evaluatorOptions;
+      if (missingBitmaps.size > 0) {
+        const annotationWithBitmaps = newAnnots.slice();
+        for (const [key, annotation] of annotationStorage) {
+          if (!key.startsWith(AnnotationEditorPrefix)) {
+            continue;
+          }
+          if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) {
+            annotationWithBitmaps.push(annotation);
+          }
+        }
+        imagePromises = AnnotationFactory.generateImages(annotationWithBitmaps, this.xref, isOffscreenCanvasSupported);
+      } else {
+        imagePromises = AnnotationFactory.generateImages(newAnnots, this.xref, isOffscreenCanvasSupported);
+      }
+      deletedAnnotations = new RefSet();
+      newAnnotationsPromise = Promise.all([annotationGlobalsPromise, this.#replaceIdByRef(newAnnots, deletedAnnotations, null)]).then(([annotationGlobals]) => {
+        if (!annotationGlobals) {
+          return null;
+        }
+        return AnnotationFactory.printNewAnnotations(annotationGlobals, partialEvaluator, task, newAnnots, imagePromises);
+      });
+    }
+    const pageListPromise = Promise.all([contentStreamPromise, resourcesPromise]).then(async ([contentStream]) => {
+      const resources = await this.#getMergedResources(contentStream.dict, RESOURCES_KEYS_OPERATOR_LIST);
+      const opList = new OperatorList(intent, sink);
+      handler.send("StartRenderPage", {
+        transparency: partialEvaluator.hasBlendModes(resources, this.nonBlendModesSet),
+        pageIndex,
+        cacheKey
+      });
+      await partialEvaluator.getOperatorList({
+        stream: contentStream,
+        task,
+        resources,
+        operatorList: opList
+      });
+      return opList;
+    });
+    let [pageOpList, annotations, newAnnotations] = await Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]);
+    if (newAnnotations) {
+      annotations = annotations.filter(a => !(a.ref && deletedAnnotations.has(a.ref)));
+      for (let i = 0, ii = newAnnotations.length; i < ii; i++) {
+        const newAnnotation = newAnnotations[i];
+        if (newAnnotation.refToReplace) {
+          const j = annotations.findIndex(a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace));
+          if (j >= 0) {
+            annotations.splice(j, 1, newAnnotation);
+            newAnnotations.splice(i--, 1);
+            ii--;
+          }
+        }
+      }
+      annotations = annotations.concat(newAnnotations);
+    }
+    if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) {
+      pageOpList.flush(true);
+      return {
+        length: pageOpList.totalLength
+      };
+    }
+    const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS),
+      isEditing = !!(intent & RenderingIntentFlag.IS_EDITING),
+      intentAny = !!(intent & RenderingIntentFlag.ANY),
+      intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY),
+      intentPrint = !!(intent & RenderingIntentFlag.PRINT);
+    const opListPromises = [];
+    for (const annotation of annotations) {
+      if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) && annotation.mustBeViewedWhenEditing(isEditing, modifiedIds) || intentPrint && annotation.mustBePrinted(annotationStorage)) {
+        opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, annotationStorage).catch(function (reason) {
+          warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`);
+          return {
+            opList: null,
+            separateForm: false,
+            separateCanvas: false
+          };
+        }));
+      }
+    }
+    const opLists = await Promise.all(opListPromises);
+    let form = false,
+      canvas = false;
+    for (const {
+      opList,
+      separateForm,
+      separateCanvas
+    } of opLists) {
+      pageOpList.addOpList(opList);
+      form ||= separateForm;
+      canvas ||= separateCanvas;
+    }
+    pageOpList.flush(true, {
+      form,
+      canvas
+    });
+    return {
+      length: pageOpList.totalLength
+    };
+  }
+  async extractTextContent({
+    handler,
+    task,
+    includeMarkedContent,
+    disableNormalization,
+    sink,
+    intersector = null
+  }) {
+    const contentStreamPromise = this.getContentStream();
+    const resourcesPromise = this.loadResources(RESOURCES_KEYS_TEXT_CONTENT);
+    const langPromise = this.pdfManager.ensureCatalog("lang");
+    const [contentStream,, lang] = await Promise.all([contentStreamPromise, resourcesPromise, langPromise]);
+    const resources = await this.#getMergedResources(contentStream.dict, RESOURCES_KEYS_TEXT_CONTENT);
+    const partialEvaluator = this.#createPartialEvaluator(handler);
+    return partialEvaluator.getTextContent({
+      stream: contentStream,
+      task,
+      resources,
+      includeMarkedContent,
+      disableNormalization,
+      sink,
+      viewBox: this.view,
+      lang,
+      intersector
+    });
+  }
+  async getStructTree() {
+    const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot");
+    if (!structTreeRoot) {
+      return null;
+    }
+    await this._parsedAnnotations;
+    try {
+      const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]);
+      return await this.pdfManager.ensure(structTree, "serializable");
+    } catch (ex) {
+      warn(`getStructTree: "${ex}".`);
+      return null;
+    }
+  }
+  _parseStructTree(structTreeRoot) {
+    const tree = new StructTreePage(structTreeRoot, this.pageDict);
+    tree.parse(this.ref);
+    return tree;
+  }
+  async getAnnotationsData(handler, task, intent) {
+    const annotations = await this._parsedAnnotations;
+    if (annotations.length === 0) {
+      return annotations;
+    }
+    const annotationsData = [],
+      textContentPromises = [];
+    let partialEvaluator;
+    const intentAny = !!(intent & RenderingIntentFlag.ANY),
+      intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY),
+      intentPrint = !!(intent & RenderingIntentFlag.PRINT);
+    const highlightedAnnotations = [];
+    for (const annotation of annotations) {
+      const isVisible = intentAny || intentDisplay && annotation.viewable;
+      if (isVisible || intentPrint && annotation.printable) {
+        annotationsData.push(annotation.data);
+      }
+      if (annotation.hasTextContent && isVisible) {
+        partialEvaluator ??= this.#createPartialEvaluator(handler);
+        textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]).catch(function (reason) {
+          warn(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`);
+        }));
+      } else if (annotation.overlaysTextContent && isVisible) {
+        highlightedAnnotations.push(annotation);
+      }
+    }
+    if (highlightedAnnotations.length > 0) {
+      const intersector = new Intersector(highlightedAnnotations);
+      textContentPromises.push(this.extractTextContent({
+        handler,
+        task,
+        includeMarkedContent: false,
+        disableNormalization: false,
+        sink: null,
+        intersector
+      }).then(() => {
+        intersector.setText();
+      }));
+    }
+    await Promise.all(textContentPromises);
+    return annotationsData;
+  }
+  get annotations() {
+    const annots = this.#getInheritableProperty("Annots");
+    return shadow(this, "annotations", Array.isArray(annots) ? annots : []);
+  }
+  get _parsedAnnotations() {
+    const promise = this.pdfManager.ensure(this, "annotations").then(async annots => {
+      if (annots.length === 0) {
+        return annots;
+      }
+      const [annotationGlobals, fieldObjects] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureDoc("fieldObjects")]);
+      if (!annotationGlobals) {
+        return [];
+      }
+      const orphanFields = fieldObjects?.orphanFields;
+      const annotationPromises = [];
+      for (const annotationRef of annots) {
+        annotationPromises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, orphanFields, null, this.ref).catch(function (reason) {
+          warn(`_parsedAnnotations: "${reason}".`);
+          return null;
+        }));
+      }
+      const sortedAnnotations = [];
+      let popupAnnotations, widgetAnnotations;
+      for (const annotation of await Promise.all(annotationPromises)) {
+        if (!annotation) {
+          continue;
+        }
+        if (annotation instanceof WidgetAnnotation) {
+          (widgetAnnotations ||= []).push(annotation);
+          continue;
+        }
+        if (annotation instanceof PopupAnnotation) {
+          (popupAnnotations ||= []).push(annotation);
+          continue;
+        }
+        sortedAnnotations.push(annotation);
+      }
+      if (widgetAnnotations) {
+        sortedAnnotations.push(...widgetAnnotations);
+      }
+      if (popupAnnotations) {
+        sortedAnnotations.push(...popupAnnotations);
+      }
+      return sortedAnnotations;
+    });
+    return shadow(this, "_parsedAnnotations", promise);
+  }
+  get jsActions() {
+    const actions = collectActions(this.xref, this.pageDict, PageActionEventType);
+    return shadow(this, "jsActions", actions);
+  }
+  async collectAnnotationsByType(handler, task, types, promises, annotationGlobals) {
+    const {
+      pageIndex
+    } = this;
+    if (Object.hasOwn(this, "_parsedAnnotations")) {
+      const cachedAnnotations = await this._parsedAnnotations;
+      for (const {
+        data
+      } of cachedAnnotations) {
+        if (!types || types.has(data.annotationType)) {
+          data.pageIndex = pageIndex;
+          promises.push(Promise.resolve(data));
+        }
+      }
+      return;
+    }
+    const annots = await this.pdfManager.ensure(this, "annotations");
+    let partialEvaluator;
+    for (const annotationRef of annots) {
+      promises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, null, types, this.ref).then(async annotation => {
+        if (!annotation) {
+          return null;
+        }
+        annotation.data.pageIndex = pageIndex;
+        if (annotation.hasTextContent && annotation.viewable) {
+          partialEvaluator ??= this.#createPartialEvaluator(handler);
+          await annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]);
+        }
+        return annotation.data;
+      }).catch(function (reason) {
+        warn(`collectAnnotationsByType: "${reason}".`);
+        return null;
+      }));
+    }
+  }
+}
+const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]);
+const STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]);
+const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]);
+function find(stream, signature, limit = 1024, backwards = false) {
+  const signatureLength = signature.length;
+  const scanBytes = stream.peekBytes(limit);
+  const scanLength = scanBytes.length - signatureLength;
+  if (scanLength <= 0) {
+    return false;
+  }
+  if (backwards) {
+    const signatureEnd = signatureLength - 1;
+    let pos = scanBytes.length - 1;
+    while (pos >= signatureEnd) {
+      let j = 0;
+      while (j < signatureLength && scanBytes[pos - j] === signature[signatureEnd - j]) {
+        j++;
+      }
+      if (j >= signatureLength) {
+        stream.pos += pos - signatureEnd;
+        return true;
+      }
+      pos--;
+    }
+  } else {
+    let pos = 0;
+    while (pos <= scanLength) {
+      let j = 0;
+      while (j < signatureLength && scanBytes[pos + j] === signature[j]) {
+        j++;
+      }
+      if (j >= signatureLength) {
+        stream.pos += pos;
+        return true;
+      }
+      pos++;
+    }
+  }
+  return false;
+}
+class PDFDocument {
+  #pagePromises = new Map();
+  #version = null;
+  constructor(pdfManager, stream) {
+    if (stream.length <= 0) {
+      throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes.");
+    }
+    this.pdfManager = pdfManager;
+    this.stream = stream;
+    this.xref = new XRef(stream, pdfManager);
+    const idCounters = {
+      font: 0
+    };
+    this._globalIdFactory = class {
+      static getDocId() {
+        return `g_${pdfManager.docId}`;
+      }
+      static createFontId() {
+        return `f${++idCounters.font}`;
+      }
+      static createObjId() {
+        unreachable("Abstract method `createObjId` called.");
+      }
+      static getPageObjId() {
+        unreachable("Abstract method `getPageObjId` called.");
+      }
+    };
+  }
+  parse(recoveryMode) {
+    this.xref.parse(recoveryMode);
+    this.catalog = new Catalog(this.pdfManager, this.xref);
+  }
+  get linearization() {
+    let linearization = null;
+    try {
+      linearization = Linearization.create(this.stream);
+    } catch (err) {
+      if (err instanceof MissingDataException) {
+        throw err;
+      }
+      info(err);
+    }
+    return shadow(this, "linearization", linearization);
+  }
+  get startXRef() {
+    const stream = this.stream;
+    let startXRef = 0;
+    if (this.linearization) {
+      stream.reset();
+      if (find(stream, ENDOBJ_SIGNATURE)) {
+        stream.skip(6);
+        let ch = stream.peekByte();
+        while (isWhiteSpace(ch)) {
+          stream.pos++;
+          ch = stream.peekByte();
+        }
+        startXRef = stream.pos - stream.start;
+      }
+    } else {
+      const step = 1024;
+      const startXRefLength = STARTXREF_SIGNATURE.length;
+      let found = false,
+        pos = stream.end;
+      while (!found && pos > 0) {
+        pos -= step - startXRefLength;
+        if (pos < 0) {
+          pos = 0;
+        }
+        stream.pos = pos;
+        found = find(stream, STARTXREF_SIGNATURE, step, true);
+      }
+      if (found) {
+        stream.skip(9);
+        let ch;
+        do {
+          ch = stream.getByte();
+        } while (isWhiteSpace(ch));
+        let str = "";
+        while (ch >= 0x20 && ch <= 0x39) {
+          str += String.fromCharCode(ch);
+          ch = stream.getByte();
+        }
+        startXRef = parseInt(str, 10);
+        if (isNaN(startXRef)) {
+          startXRef = 0;
+        }
+      }
+    }
+    return shadow(this, "startXRef", startXRef);
+  }
+  checkHeader() {
+    const stream = this.stream;
+    stream.reset();
+    if (!find(stream, PDF_HEADER_SIGNATURE)) {
+      return;
+    }
+    stream.moveStart();
+    stream.skip(PDF_HEADER_SIGNATURE.length);
+    let version = "",
+      ch;
+    while ((ch = stream.getByte()) > 0x20 && version.length < 7) {
+      version += String.fromCharCode(ch);
+    }
+    if (PDF_VERSION_REGEXP.test(version)) {
+      this.#version = version;
+    } else {
+      warn(`Invalid PDF header version: ${version}`);
+    }
+  }
+  parseStartXRef() {
+    this.xref.setStartXRef(this.startXRef);
+  }
+  get numPages() {
+    let num = 0;
+    if (this.catalog.hasActualNumPages) {
+      num = this.catalog.numPages;
+    } else if (this.xfaFactory) {
+      num = this.xfaFactory.getNumPages();
+    } else if (this.linearization) {
+      num = this.linearization.numPages;
+    } else {
+      num = this.catalog.numPages;
+    }
+    return shadow(this, "numPages", num);
+  }
+  #hasOnlyDocumentSignatures(fields, recursionDepth = 0) {
+    const RECURSION_LIMIT = 10;
+    if (!Array.isArray(fields)) {
+      return false;
+    }
+    return fields.every(field => {
+      field = this.xref.fetchIfRef(field);
+      if (!(field instanceof Dict)) {
+        return false;
+      }
+      if (field.has("Kids")) {
+        if (++recursionDepth > RECURSION_LIMIT) {
+          warn("#hasOnlyDocumentSignatures: maximum recursion depth reached");
+          return false;
+        }
+        return this.#hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth);
+      }
+      const isSignature = isName(field.get("FT"), "Sig");
+      const rectangle = field.get("Rect");
+      const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0);
+      return isSignature && isInvisible;
+    });
+  }
+  get _xfaStreams() {
+    const {
+      acroForm
+    } = this.catalog;
+    if (!acroForm) {
+      return null;
+    }
+    const xfa = acroForm.get("XFA");
+    const entries = new Map(["xdp:xdp", "template", "datasets", "config", "connectionSet", "localeSet", "stylesheet", "/xdp:xdp"].map(e => [e, null]));
+    if (xfa instanceof BaseStream && !xfa.isEmpty) {
+      entries.set("xdp:xdp", xfa);
+      return entries;
+    }
+    if (!Array.isArray(xfa) || xfa.length === 0) {
+      return null;
+    }
+    for (let i = 0, ii = xfa.length; i < ii; i += 2) {
+      let name;
+      if (i === 0) {
+        name = "xdp:xdp";
+      } else if (i === ii - 2) {
+        name = "/xdp:xdp";
+      } else {
+        name = xfa[i];
+      }
+      if (!entries.has(name)) {
+        continue;
+      }
+      const data = this.xref.fetchIfRef(xfa[i + 1]);
+      if (!(data instanceof BaseStream) || data.isEmpty) {
+        continue;
+      }
+      entries.set(name, data);
+    }
+    return entries;
+  }
+  get xfaDatasets() {
+    const streams = this._xfaStreams;
+    if (!streams) {
+      return shadow(this, "xfaDatasets", null);
+    }
+    for (const key of ["datasets", "xdp:xdp"]) {
+      const stream = streams.get(key);
+      if (!stream) {
+        continue;
+      }
+      try {
+        const str = stringToUTF8String(stream.getString());
+        const data = {
+          [key]: str
+        };
+        return shadow(this, "xfaDatasets", new DatasetReader(data));
+      } catch {
+        warn("XFA - Invalid utf-8 string.");
+        break;
+      }
+    }
+    return shadow(this, "xfaDatasets", null);
+  }
+  get xfaData() {
+    const streams = this._xfaStreams;
+    if (!streams) {
+      return null;
+    }
+    const data = Object.create(null);
+    for (const [key, stream] of streams) {
+      if (!stream) {
+        continue;
+      }
+      try {
+        data[key] = stringToUTF8String(stream.getString());
+      } catch {
+        warn("XFA - Invalid utf-8 string.");
+        return null;
+      }
+    }
+    return data;
+  }
+  get xfaFactory() {
+    let data;
+    if (this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) {
+      data = this.xfaData;
+    }
+    return shadow(this, "xfaFactory", data ? new XFAFactory(data) : null);
+  }
+  get isPureXfa() {
+    return this.xfaFactory ? this.xfaFactory.isValid() : false;
+  }
+  get htmlForXfa() {
+    return this.xfaFactory ? this.xfaFactory.getPages() : null;
+  }
+  async #loadXfaImages() {
+    const xfaImages = await this.pdfManager.ensureCatalog("xfaImages");
+    if (!xfaImages) {
+      return;
+    }
+    this.xfaFactory.setImages(xfaImages);
+  }
+  async #loadXfaFonts(handler, task) {
+    const acroForm = await this.pdfManager.ensureCatalog("acroForm");
+    if (!acroForm) {
+      return;
+    }
+    const resources = await acroForm.getAsync("DR");
+    if (!(resources instanceof Dict)) {
+      return;
+    }
+    await ObjectLoader.load(resources, ["Font"], this.xref);
+    const fontRes = resources.get("Font");
+    if (!(fontRes instanceof Dict)) {
+      return;
+    }
+    const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions, {
+      useSystemFonts: false
+    });
+    const {
+      builtInCMapCache,
+      fontCache,
+      standardFontDataCache
+    } = this.catalog;
+    const partialEvaluator = new PartialEvaluator({
+      xref: this.xref,
+      handler,
+      pageIndex: -1,
+      idFactory: this._globalIdFactory,
+      fontCache,
+      builtInCMapCache,
+      standardFontDataCache,
+      options
+    });
+    const operatorList = new OperatorList();
+    const pdfFonts = [];
+    const initialState = {
+      get font() {
+        return pdfFonts.at(-1);
+      },
+      set font(font) {
+        pdfFonts.push(font);
+      },
+      clone() {
+        return this;
+      }
+    };
+    const parseFont = (fontName, fallbackFontDict, cssFontInfo) => partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, fallbackFontDict, cssFontInfo).catch(reason => {
+      warn(`loadXfaFonts: "${reason}".`);
+      return null;
+    });
+    const promises = [];
+    for (const [fontName, font] of fontRes) {
+      const descriptor = font.get("FontDescriptor");
+      if (!(descriptor instanceof Dict)) {
+        continue;
+      }
+      let fontFamily = descriptor.get("FontFamily");
+      fontFamily = fontFamily.replaceAll(/ +(\d)/g, "$1");
+      const fontWeight = descriptor.get("FontWeight");
+      const italicAngle = -descriptor.get("ItalicAngle");
+      const cssFontInfo = {
+        fontFamily,
+        fontWeight,
+        italicAngle
+      };
+      if (!validateCSSFont(cssFontInfo)) {
+        continue;
+      }
+      promises.push(parseFont(fontName, null, cssFontInfo));
+    }
+    await Promise.all(promises);
+    const missingFonts = this.xfaFactory.setFonts(pdfFonts);
+    if (!missingFonts) {
+      return;
+    }
+    options.ignoreErrors = true;
+    promises.length = 0;
+    pdfFonts.length = 0;
+    const reallyMissingFonts = new Set();
+    for (const missing of missingFonts) {
+      if (!getXfaFontName(`${missing}-Regular`)) {
+        reallyMissingFonts.add(missing);
+      }
+    }
+    if (reallyMissingFonts.size) {
+      missingFonts.push("PdfJS-Fallback");
+    }
+    for (const missing of missingFonts) {
+      if (reallyMissingFonts.has(missing)) {
+        continue;
+      }
+      for (const fontInfo 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 name = `${missing}-${fontInfo.name}`;
+        promises.push(parseFont(name, getXfaFontDict(name), {
+          fontFamily: missing,
+          fontWeight: fontInfo.fontWeight,
+          italicAngle: fontInfo.italicAngle
+        }));
+      }
+    }
+    await Promise.all(promises);
+    this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts);
+  }
+  loadXfaResources(handler, task) {
+    return Promise.all([this.#loadXfaFonts(handler, task).catch(() => {}), this.#loadXfaImages()]);
+  }
+  serializeXfaData(annotationStorage) {
+    return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null;
+  }
+  get version() {
+    return this.catalog.version || this.#version;
+  }
+  get formInfo() {
+    const formInfo = {
+      hasFields: false,
+      hasAcroForm: false,
+      hasXfa: false,
+      hasSignatures: false
+    };
+    const {
+      acroForm
+    } = this.catalog;
+    if (!acroForm) {
+      return shadow(this, "formInfo", formInfo);
+    }
+    try {
+      const fields = acroForm.get("Fields");
+      const hasFields = Array.isArray(fields) && fields.length > 0;
+      formInfo.hasFields = hasFields;
+      const xfa = acroForm.get("XFA");
+      formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || xfa instanceof BaseStream && !xfa.isEmpty;
+      const sigFlags = acroForm.get("SigFlags");
+      const hasSignatures = !!(sigFlags & 0x1);
+      const hasOnlyDocumentSignatures = hasSignatures && this.#hasOnlyDocumentSignatures(fields);
+      formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures;
+      formInfo.hasSignatures = hasSignatures;
+    } catch (ex) {
+      if (ex instanceof MissingDataException) {
+        throw ex;
+      }
+      warn(`Cannot fetch form information: "${ex}".`);
+    }
+    return shadow(this, "formInfo", formInfo);
+  }
+  get documentInfo() {
+    const {
+      catalog,
+      formInfo,
+      xref
+    } = this;
+    const docInfo = {
+      PDFFormatVersion: this.version,
+      Language: catalog.lang,
+      EncryptFilterName: xref.encrypt?.filterName ?? null,
+      IsLinearized: !!this.linearization,
+      IsAcroFormPresent: formInfo.hasAcroForm,
+      IsXFAPresent: formInfo.hasXfa,
+      IsCollectionPresent: !!catalog.collection,
+      IsSignaturesPresent: formInfo.hasSignatures
+    };
+    let infoDict;
+    try {
+      infoDict = xref.trailer.get("Info");
+    } catch (err) {
+      if (err instanceof MissingDataException) {
+        throw err;
+      }
+      info("The document information dictionary is invalid.");
+    }
+    if (!(infoDict instanceof Dict)) {
+      return shadow(this, "documentInfo", docInfo);
+    }
+    for (const [key, value] of infoDict) {
+      switch (key) {
+        case "Title":
+        case "Author":
+        case "Subject":
+        case "Keywords":
+        case "Creator":
+        case "Producer":
+        case "CreationDate":
+        case "ModDate":
+          if (typeof value === "string") {
+            docInfo[key] = stringToPDFString(value);
+            continue;
+          }
+          break;
+        case "Trapped":
+          if (value instanceof Name) {
+            docInfo[key] = value;
+            continue;
+          }
+          break;
+        default:
+          let customValue;
+          switch (typeof value) {
+            case "string":
+              customValue = stringToPDFString(value);
+              break;
+            case "number":
+            case "boolean":
+              customValue = value;
+              break;
+            default:
+              if (value instanceof Name) {
+                customValue = value;
+              }
+              break;
+          }
+          if (customValue === undefined) {
+            warn(`Bad value, for custom key "${key}", in Info: ${value}.`);
+            continue;
+          }
+          docInfo.Custom ??= Object.create(null);
+          docInfo.Custom[key] = customValue;
+          continue;
+      }
+      warn(`Bad value, for key "${key}", in Info: ${value}.`);
+    }
+    return shadow(this, "documentInfo", docInfo);
+  }
+  get fingerprints() {
+    const FINGERPRINT_FIRST_BYTES = 1024;
+    const EMPTY_FINGERPRINT = "\x00".repeat(16);
+    function validate(data) {
+      return typeof data === "string" && data.length === 16 && data !== EMPTY_FINGERPRINT;
+    }
+    const id = this.xref.trailer.get("ID");
+    let hashOriginal, hashModified;
+    if (Array.isArray(id) && validate(id[0])) {
+      hashOriginal = stringToBytes(id[0]);
+      if (id[1] !== id[0] && validate(id[1])) {
+        hashModified = stringToBytes(id[1]);
+      }
+    } else {
+      hashOriginal = calculateMD5(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);
+    }
+    return shadow(this, "fingerprints", [hashOriginal.toHex(), hashModified?.toHex() ?? null]);
+  }
+  async #getLinearizationPage(pageIndex) {
+    const {
+      catalog,
+      linearization,
+      xref
+    } = this;
+    const ref = Ref.get(linearization.objectNumberFirst, 0);
+    try {
+      const obj = await xref.fetchAsync(ref);
+      if (obj instanceof Dict) {
+        let type = obj.getRaw("Type");
+        if (type instanceof Ref) {
+          type = await xref.fetchAsync(type);
+        }
+        if (isName(type, "Page") || !obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) {
+          if (!catalog.pageKidsCountCache.has(ref)) {
+            catalog.pageKidsCountCache.put(ref, 1);
+          }
+          if (!catalog.pageIndexCache.has(ref)) {
+            catalog.pageIndexCache.put(ref, 0);
+          }
+          return [obj, ref];
+        }
+      }
+      throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary.");
+    } catch (reason) {
+      warn(`_getLinearizationPage: "${reason.message}".`);
+      return catalog.getPageDict(pageIndex);
+    }
+  }
+  getPage(pageIndex) {
+    const cachedPromise = this.#pagePromises.get(pageIndex);
+    if (cachedPromise) {
+      return cachedPromise;
+    }
+    const {
+      catalog,
+      linearization,
+      xfaFactory
+    } = this;
+    let promise;
+    if (xfaFactory) {
+      promise = Promise.resolve([Dict.empty, null]);
+    } else if (linearization?.pageFirst === pageIndex) {
+      promise = this.#getLinearizationPage(pageIndex);
+    } else {
+      promise = catalog.getPageDict(pageIndex);
+    }
+    promise = promise.then(([pageDict, ref]) => new Page({
+      pdfManager: this.pdfManager,
+      xref: this.xref,
+      pageIndex,
+      pageDict,
+      ref,
+      globalIdFactory: this._globalIdFactory,
+      fontCache: catalog.fontCache,
+      builtInCMapCache: catalog.builtInCMapCache,
+      standardFontDataCache: catalog.standardFontDataCache,
+      globalColorSpaceCache: catalog.globalColorSpaceCache,
+      globalImageCache: catalog.globalImageCache,
+      systemFontCache: catalog.systemFontCache,
+      nonBlendModesSet: catalog.nonBlendModesSet,
+      xfaFactory
+    }));
+    this.#pagePromises.set(pageIndex, promise);
+    return promise;
+  }
+  async checkFirstPage(recoveryMode = false) {
+    if (recoveryMode) {
+      return;
+    }
+    try {
+      await this.getPage(0);
+    } catch (reason) {
+      if (reason instanceof XRefEntryException) {
+        this.#pagePromises.delete(0);
+        await this.cleanup();
+        throw new XRefParseException();
+      }
+    }
+  }
+  async checkLastPage(recoveryMode = false) {
+    const {
+      catalog,
+      pdfManager
+    } = this;
+    catalog.setActualNumPages();
+    let numPages;
+    try {
+      await Promise.all([pdfManager.ensureDoc("xfaFactory"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("numPages")]);
+      if (this.xfaFactory) {
+        return;
+      } else if (this.linearization) {
+        numPages = this.linearization.numPages;
+      } else {
+        numPages = catalog.numPages;
+      }
+      if (!Number.isInteger(numPages)) {
+        throw new FormatError("Page count is not an integer.");
+      } else if (numPages <= 1) {
+        return;
+      }
+      await this.getPage(numPages - 1);
+    } catch (reason) {
+      this.#pagePromises.delete(numPages - 1);
+      await this.cleanup();
+      if (reason instanceof XRefEntryException && !recoveryMode) {
+        throw new XRefParseException();
+      }
+      warn(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`);
+      let pagesTree;
+      try {
+        pagesTree = await catalog.getAllPageDicts(recoveryMode);
+      } catch (reasonAll) {
+        if (reasonAll instanceof XRefEntryException && !recoveryMode) {
+          throw new XRefParseException();
+        }
+        catalog.setActualNumPages(1);
+        return;
+      }
+      for (const [pageIndex, [pageDict, ref]] of pagesTree) {
+        let promise;
+        if (pageDict instanceof Error) {
+          promise = Promise.reject(pageDict);
+          promise.catch(() => {});
+        } else {
+          promise = Promise.resolve(new Page({
+            pdfManager,
+            xref: this.xref,
+            pageIndex,
+            pageDict,
+            ref,
+            globalIdFactory: this._globalIdFactory,
+            fontCache: catalog.fontCache,
+            builtInCMapCache: catalog.builtInCMapCache,
+            standardFontDataCache: catalog.standardFontDataCache,
+            globalColorSpaceCache: this.globalColorSpaceCache,
+            globalImageCache: catalog.globalImageCache,
+            systemFontCache: catalog.systemFontCache,
+            nonBlendModesSet: catalog.nonBlendModesSet,
+            xfaFactory: null
+          }));
+        }
+        this.#pagePromises.set(pageIndex, promise);
+      }
+      catalog.setActualNumPages(pagesTree.size);
+    }
+  }
+  async fontFallback(id, handler) {
+    const {
+      catalog,
+      pdfManager
+    } = this;
+    for (const translatedFont of await Promise.all(catalog.fontCache)) {
+      if (translatedFont.loadedName === id) {
+        translatedFont.fallback(handler, pdfManager.evaluatorOptions);
+        return;
+      }
+    }
+  }
+  async cleanup(manuallyTriggered = false) {
+    return this.catalog ? this.catalog.cleanup(manuallyTriggered) : clearGlobalCaches();
+  }
+  async #collectFieldObjects(name, parentRef, fieldRef, promises, annotationGlobals, visitedRefs, orphanFields) {
+    const {
+      xref
+    } = this;
+    if (!(fieldRef instanceof Ref) || visitedRefs.has(fieldRef)) {
+      return;
+    }
+    visitedRefs.put(fieldRef);
+    const field = await xref.fetchAsync(fieldRef);
+    if (!(field instanceof Dict)) {
+      return;
+    }
+    let subtype = await field.getAsync("Subtype");
+    subtype = subtype instanceof Name ? subtype.name : null;
+    switch (subtype) {
+      case "Link":
+        return;
+    }
+    if (field.has("T")) {
+      const partName = stringToPDFString(await field.getAsync("T"));
+      name = name === "" ? partName : `${name}.${partName}`;
+    } else {
+      let obj = field;
+      while (true) {
+        obj = obj.getRaw("Parent") || parentRef;
+        if (obj instanceof Ref) {
+          if (visitedRefs.has(obj)) {
+            break;
+          }
+          obj = await xref.fetchAsync(obj);
+        }
+        if (!(obj instanceof Dict)) {
+          break;
+        }
+        if (obj.has("T")) {
+          const partName = stringToPDFString(await obj.getAsync("T"));
+          name = name === "" ? partName : `${name}.${partName}`;
+          break;
+        }
+      }
+    }
+    if (parentRef && !field.has("Parent") && isName(field.get("Subtype"), "Widget")) {
+      orphanFields.put(fieldRef, parentRef);
+    }
+    promises.getOrInsertComputed(name, makeArr).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, orphanFields, null, null).then(annotation => annotation?.getFieldObject()).catch(function (reason) {
+      warn(`#collectFieldObjects: "${reason}".`);
+      return null;
+    }));
+    if (!field.has("Kids")) {
+      return;
+    }
+    const kids = await field.getAsync("Kids");
+    if (Array.isArray(kids)) {
+      for (const kid of kids) {
+        await this.#collectFieldObjects(name, fieldRef, kid, promises, annotationGlobals, visitedRefs, orphanFields);
+      }
+    }
+  }
+  get fieldObjects() {
+    const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => {
+      if (!formInfo.hasFields) {
+        return null;
+      }
+      const annotationGlobals = await this.annotationGlobals;
+      if (!annotationGlobals) {
+        return null;
+      }
+      const {
+        acroForm
+      } = annotationGlobals;
+      const visitedRefs = new RefSet();
+      const allFields = Object.create(null);
+      const fieldPromises = new Map();
+      const orphanFields = new RefSetCache();
+      for (const fieldRef of acroForm.get("Fields")) {
+        await this.#collectFieldObjects("", null, fieldRef, fieldPromises, annotationGlobals, visitedRefs, orphanFields);
+      }
+      const allPromises = [];
+      for (const [name, promises] of fieldPromises) {
+        allPromises.push(Promise.all(promises).then(fields => {
+          fields = fields.filter(field => !!field);
+          if (fields.length > 0) {
+            allFields[name] = fields;
+          }
+        }));
+      }
+      await Promise.all(allPromises);
+      return {
+        allFields: objectSize(allFields) > 0 ? allFields : null,
+        orphanFields
+      };
+    });
+    return shadow(this, "fieldObjects", promise);
+  }
+  get hasJSActions() {
+    const promise = this.pdfManager.ensureDoc("_parseHasJSActions");
+    return shadow(this, "hasJSActions", promise);
+  }
+  async _parseHasJSActions() {
+    const [catalogJsActions, fieldObjects] = await Promise.all([this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects")]);
+    if (catalogJsActions) {
+      return true;
+    }
+    if (fieldObjects?.allFields) {
+      return Object.values(fieldObjects.allFields).some(fieldObject => fieldObject.some(object => object.actions !== null));
+    }
+    return false;
+  }
+  get calculationOrderIds() {
+    const calculationOrder = this.catalog.acroForm?.get("CO");
+    if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) {
+      return shadow(this, "calculationOrderIds", null);
+    }
+    const ids = [];
+    for (const id of calculationOrder) {
+      if (id instanceof Ref) {
+        ids.push(id.toString());
+      }
+    }
+    return shadow(this, "calculationOrderIds", ids.length ? ids : null);
+  }
+  get annotationGlobals() {
+    return shadow(this, "annotationGlobals", AnnotationFactory.createGlobals(this.pdfManager));
+  }
+  async toJSObject(value, firstCall = true) {
+    throw new Error("Not implemented: toJSObject");
+  }
+}
+
+;// ./src/core/pdf_manager.js
+
+
+
+
+
+
+
+
+
+
+
+
+function parseDocBaseUrl(url) {
+  if (url) {
+    const absoluteUrl = createValidAbsoluteUrl(url);
+    if (absoluteUrl) {
+      return absoluteUrl.href;
+    }
+    warn(`Invalid absolute docBaseUrl: "${url}".`);
+  }
+  return null;
+}
+class BasePdfManager {
+  constructor({
+    docBaseUrl,
+    docId,
+    enableXfa,
+    evaluatorOptions,
+    handler,
+    password
+  }) {
+    this._docBaseUrl = parseDocBaseUrl(docBaseUrl);
+    this._docId = docId;
+    this._password = password;
+    this.enableXfa = enableXfa;
+    evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported;
+    evaluatorOptions.isImageDecoderSupported &&= FeatureTest.isImageDecoderSupported;
+    this.evaluatorOptions = Object.freeze(evaluatorOptions);
+    ImageResizer.setOptions(evaluatorOptions);
+    JpegStream.setOptions(evaluatorOptions);
+    OperatorList.setOptions(evaluatorOptions);
+    const options = {
+      ...evaluatorOptions,
+      handler
+    };
+    IccColorSpace.setOptions(options);
+    CmykICCBasedCS.setOptions(options);
+    PDFFunctionFactory.setOptions(options);
+    Pattern.setOptions(options);
+    WasmImage.setOptions(options);
+  }
+  get docId() {
+    return this._docId;
+  }
+  get password() {
+    return this._password;
+  }
+  get docBaseUrl() {
+    return this._docBaseUrl;
+  }
+  ensureDoc(prop, args) {
+    return this.ensure(this.pdfDocument, prop, args);
+  }
+  ensureXRef(prop, args) {
+    return this.ensure(this.pdfDocument.xref, prop, args);
+  }
+  ensureCatalog(prop, args) {
+    return this.ensure(this.pdfDocument.catalog, prop, args);
+  }
+  async initDocument(recoveryMode) {
+    await this.ensureDoc("checkHeader");
+    await this.ensureDoc("parseStartXRef");
+    await this.ensureDoc("parse", [recoveryMode]);
+    await this.ensureDoc("checkFirstPage", [recoveryMode]);
+    await this.ensureDoc("checkLastPage", [recoveryMode]);
+  }
+  getPage(pageIndex) {
+    return this.pdfDocument.getPage(pageIndex);
+  }
+  fontFallback(id, handler) {
+    return this.pdfDocument.fontFallback(id, handler);
+  }
+  cleanup(manuallyTriggered = false) {
+    return this.pdfDocument.cleanup(manuallyTriggered);
+  }
+  async ensure(obj, prop, args) {
+    unreachable("Abstract method `ensure` called");
+  }
+  requestRange(begin, end) {
+    unreachable("Abstract method `requestRange` called");
+  }
+  requestLoadedStream(noFetch = false) {
+    unreachable("Abstract method `requestLoadedStream` called");
+  }
+  sendProgressiveData(chunk) {
+    unreachable("Abstract method `sendProgressiveData` called");
+  }
+  updatePassword(password) {
+    this._password = password;
+    this.pdfDocument.xref.encrypt?.setPassword(password);
+  }
+  terminate(reason) {
+    unreachable("Abstract method `terminate` called");
+  }
+}
+class LocalPdfManager extends BasePdfManager {
+  constructor(args) {
+    super(args);
+    const stream = new Stream(args.source);
+    this.pdfDocument = new PDFDocument(this, stream);
+    this._loadedStreamPromise = Promise.resolve(stream);
+  }
+  async ensure(obj, prop, args) {
+    const value = obj[prop];
+    if (typeof value === "function") {
+      return value.apply(obj, args);
+    }
+    return value;
+  }
+  requestRange(begin, end) {
+    return Promise.resolve();
+  }
+  requestLoadedStream(noFetch = false) {
+    return this._loadedStreamPromise;
+  }
+  terminate(reason) {}
+}
+class NetworkPdfManager extends BasePdfManager {
+  constructor(args) {
+    super(args);
+    this.streamManager = new ChunkedStreamManager(args.source, {
+      msgHandler: args.handler,
+      length: args.length,
+      disableAutoFetch: args.disableAutoFetch,
+      rangeChunkSize: args.rangeChunkSize
+    });
+    this.pdfDocument = new PDFDocument(this, this.streamManager.getStream());
+  }
+  async ensure(obj, prop, args) {
+    try {
+      const value = obj[prop];
+      if (typeof value === "function") {
+        return await value.apply(obj, args);
+      }
+      return value;
+    } catch (ex) {
+      if (!(ex instanceof MissingDataException)) {
+        throw ex;
+      }
+      await this.requestRange(ex.begin, ex.end);
+      return this.ensure(obj, prop, args);
+    }
+  }
+  requestRange(begin, end) {
+    return this.streamManager.requestRange(begin, end);
+  }
+  requestLoadedStream(noFetch = false) {
+    return this.streamManager.requestAllChunks(noFetch);
+  }
+  sendProgressiveData(chunk) {
+    this.streamManager.onReceiveData({
+      chunk
+    });
+  }
+  terminate(reason) {
+    this.streamManager.abort(reason);
+  }
+}
+
+;// ./src/shared/message_handler.js
+
+const CallbackKind = {
+  DATA: 1,
+  ERROR: 2
+};
+const StreamKind = {
+  CANCEL: 1,
+  CANCEL_COMPLETE: 2,
+  CLOSE: 3,
+  ENQUEUE: 4,
+  ERROR: 5,
+  PULL: 6,
+  PULL_COMPLETE: 7,
+  START_COMPLETE: 8
+};
+function onFn() {}
+function wrapReason(ex) {
+  if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) {
+    return ex;
+  }
+  if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) {
+    unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');
+  }
+  switch (ex.name) {
+    case "AbortException":
+      return new AbortException(ex.message);
+    case "InvalidPDFException":
+      return new InvalidPDFException(ex.message);
+    case "PasswordException":
+      return new PasswordException(ex.message, ex.code);
+    case "ResponseException":
+      return new ResponseException(ex.message, ex.status, ex.missing);
+    case "UnknownErrorException":
+      return new UnknownErrorException(ex.message, ex.details);
+  }
+  return new UnknownErrorException(ex.message, ex.toString());
+}
+class MessageHandler {
+  #messageAC = new AbortController();
+  constructor(sourceName, targetName, comObj) {
+    this.sourceName = sourceName;
+    this.targetName = targetName;
+    this.comObj = comObj;
+    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);
+    comObj.addEventListener("message", this.#onMessage.bind(this), {
+      signal: this.#messageAC.signal
+    });
+  }
+  #onMessage({
+    data
+  }) {
+    if (data.targetName !== this.sourceName) {
+      return;
+    }
+    if (data.stream) {
+      this.#processStreamMessage(data);
+      return;
+    }
+    if (data.callback) {
+      const callbackId = data.callbackId;
+      const capability = this.callbackCapabilities[callbackId];
+      if (!capability) {
+        throw new Error(`Cannot resolve callback ${callbackId}`);
+      }
+      delete this.callbackCapabilities[callbackId];
+      if (data.callback === CallbackKind.DATA) {
+        capability.resolve(data.data);
+      } else if (data.callback === CallbackKind.ERROR) {
+        capability.reject(wrapReason(data.reason));
+      } else {
+        throw new Error("Unexpected callback case");
+      }
+      return;
+    }
+    const action = this.actionHandler[data.action];
+    if (!action) {
+      throw new Error(`Unknown action from worker: ${data.action}`);
+    }
+    if (data.callbackId) {
+      const sourceName = this.sourceName,
+        targetName = data.sourceName,
+        comObj = this.comObj;
+      Promise.try(action, data.data).then(function (result) {
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          callback: CallbackKind.DATA,
+          callbackId: data.callbackId,
+          data: result
+        });
+      }, function (reason) {
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          callback: CallbackKind.ERROR,
+          callbackId: data.callbackId,
+          reason: wrapReason(reason)
+        });
+      });
+      return;
+    }
+    if (data.streamId) {
+      this.#createStreamSink(data);
+      return;
+    }
+    action(data.data);
+  }
+  on(actionName, handler) {
+    const ah = this.actionHandler;
+    if (ah[actionName]) {
+      throw new Error(`There is already an actionName called "${actionName}"`);
+    }
+    ah[actionName] = handler;
+  }
+  send(actionName, data, transfers) {
+    this.comObj.postMessage({
+      sourceName: this.sourceName,
+      targetName: this.targetName,
+      action: actionName,
+      data
+    }, transfers);
+  }
+  sendWithPromise(actionName, data, transfers) {
+    const callbackId = this.callbackId++;
+    const capability = Promise.withResolvers();
+    this.callbackCapabilities[callbackId] = capability;
+    try {
+      this.comObj.postMessage({
+        sourceName: this.sourceName,
+        targetName: this.targetName,
+        action: actionName,
+        callbackId,
+        data
+      }, transfers);
+    } catch (ex) {
+      capability.reject(ex);
+    }
+    return capability.promise;
+  }
+  sendWithStream(actionName, data, queueingStrategy, transfers) {
+    const streamId = this.streamId++,
+      sourceName = this.sourceName,
+      targetName = this.targetName,
+      comObj = this.comObj;
+    return new ReadableStream({
+      start: controller => {
+        const startCapability = Promise.withResolvers();
+        this.streamControllers[streamId] = {
+          controller,
+          startCall: startCapability,
+          pullCall: null,
+          cancelCall: null,
+          isClosed: false
+        };
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          action: actionName,
+          streamId,
+          data,
+          desiredSize: controller.desiredSize
+        }, transfers);
+        return startCapability.promise;
+      },
+      pull: controller => {
+        const pullCapability = Promise.withResolvers();
+        this.streamControllers[streamId].pullCall = pullCapability;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.PULL,
+          streamId,
+          desiredSize: controller.desiredSize
+        });
+        return pullCapability.promise;
+      },
+      cancel: reason => {
+        assert(reason instanceof Error, "cancel must have a valid reason");
+        const cancelCapability = Promise.withResolvers();
+        this.streamControllers[streamId].cancelCall = cancelCapability;
+        this.streamControllers[streamId].isClosed = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.CANCEL,
+          streamId,
+          reason: wrapReason(reason)
+        });
+        return cancelCapability.promise;
+      }
+    }, queueingStrategy);
+  }
+  #createStreamSink(data) {
+    const streamId = data.streamId,
+      sourceName = this.sourceName,
+      targetName = data.sourceName,
+      comObj = this.comObj;
+    const self = this,
+      action = this.actionHandler[data.action];
+    const streamSink = {
+      enqueue(chunk, size = 1, transfers) {
+        if (this.isCancelled) {
+          return;
+        }
+        const lastDesiredSize = this.desiredSize;
+        this.desiredSize -= size;
+        if (lastDesiredSize > 0 && this.desiredSize <= 0) {
+          this.sinkCapability = Promise.withResolvers();
+          this.ready = this.sinkCapability.promise;
+        }
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.ENQUEUE,
+          streamId,
+          chunk
+        }, transfers);
+      },
+      close() {
+        if (this.isCancelled) {
+          return;
+        }
+        this.isCancelled = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.CLOSE,
+          streamId
+        });
+        delete self.streamSinks[streamId];
+      },
+      error(reason) {
+        assert(reason instanceof Error, "error must have a valid reason");
+        if (this.isCancelled) {
+          return;
+        }
+        this.isCancelled = true;
+        comObj.postMessage({
+          sourceName,
+          targetName,
+          stream: StreamKind.ERROR,
+          streamId,
+          reason: wrapReason(reason)
+        });
+      },
+      sinkCapability: Promise.withResolvers(),
+      onPull: null,
+      onCancel: null,
+      isCancelled: false,
+      desiredSize: data.desiredSize,
+      ready: null
+    };
+    streamSink.sinkCapability.resolve();
+    streamSink.ready = streamSink.sinkCapability.promise;
+    this.streamSinks[streamId] = streamSink;
+    Promise.try(action, data.data, streamSink).then(function () {
+      comObj.postMessage({
+        sourceName,
+        targetName,
+        stream: StreamKind.START_COMPLETE,
+        streamId,
+        success: true
+      });
+    }, function (reason) {
+      comObj.postMessage({
+        sourceName,
+        targetName,
+        stream: StreamKind.START_COMPLETE,
+        streamId,
+        reason: wrapReason(reason)
+      });
+    });
+  }
+  #processStreamMessage(data) {
+    const streamId = data.streamId,
+      sourceName = this.sourceName,
+      targetName = data.sourceName,
+      comObj = this.comObj;
+    const streamController = this.streamControllers[streamId],
+      streamSink = this.streamSinks[streamId];
+    switch (data.stream) {
+      case StreamKind.START_COMPLETE:
+        if (data.success) {
+          streamController.startCall.resolve();
+        } else {
+          streamController.startCall.reject(wrapReason(data.reason));
+        }
+        break;
+      case StreamKind.PULL_COMPLETE:
+        if (data.success) {
+          streamController.pullCall.resolve();
+        } else {
+          streamController.pullCall.reject(wrapReason(data.reason));
+        }
+        break;
+      case StreamKind.PULL:
+        if (!streamSink) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            success: true
+          });
+          break;
+        }
+        if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {
+          streamSink.sinkCapability.resolve();
+        }
+        streamSink.desiredSize = data.desiredSize;
+        Promise.try(streamSink.onPull || onFn).then(function () {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            success: true
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.PULL_COMPLETE,
+            streamId,
+            reason: wrapReason(reason)
+          });
+        });
+        break;
+      case StreamKind.ENQUEUE:
+        assert(streamController, "enqueue should have stream controller");
+        if (streamController.isClosed) {
+          break;
+        }
+        streamController.controller.enqueue(data.chunk);
+        break;
+      case StreamKind.CLOSE:
+        assert(streamController, "close should have stream controller");
+        if (streamController.isClosed) {
+          break;
+        }
+        streamController.isClosed = true;
+        streamController.controller.close();
+        this.#deleteStreamController(streamController, streamId);
+        break;
+      case StreamKind.ERROR:
+        assert(streamController, "error should have stream controller");
+        streamController.controller.error(wrapReason(data.reason));
+        this.#deleteStreamController(streamController, streamId);
+        break;
+      case StreamKind.CANCEL_COMPLETE:
+        if (data.success) {
+          streamController.cancelCall.resolve();
+        } else {
+          streamController.cancelCall.reject(wrapReason(data.reason));
+        }
+        this.#deleteStreamController(streamController, streamId);
+        break;
+      case StreamKind.CANCEL:
+        if (!streamSink) {
+          break;
+        }
+        const dataReason = wrapReason(data.reason);
+        Promise.try(streamSink.onCancel || onFn, dataReason).then(function () {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.CANCEL_COMPLETE,
+            streamId,
+            success: true
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName,
+            targetName,
+            stream: StreamKind.CANCEL_COMPLETE,
+            streamId,
+            reason: wrapReason(reason)
+          });
+        });
+        streamSink.sinkCapability.reject(dataReason);
+        streamSink.isCancelled = true;
+        delete this.streamSinks[streamId];
+        break;
+      default:
+        throw new Error("Unexpected stream case");
+    }
+  }
+  async #deleteStreamController(streamController, streamId) {
+    await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]);
+    delete this.streamControllers[streamId];
+  }
+  destroy() {
+    this.#messageAC?.abort();
+    this.#messageAC = null;
+  }
+}
+
+;// ./src/core/writer.js
+
+
+
+
+
+
+
+async function writeObject(ref, obj, buffer, {
+  encrypt = null,
+  encryptRef = null
+}) {
+  const transform = encrypt && encryptRef !== ref ? encrypt.createCipherTransform(ref.num, ref.gen) : null;
+  buffer.push(`${ref.num} ${ref.gen} obj\n`);
+  await writeValue(obj, buffer, transform);
+  buffer.push("\nendobj\n");
+}
+async function writeDict(dict, buffer, transform) {
+  buffer.push("<<");
+  for (const [key, rawObj] of dict.getRawEntries()) {
+    buffer.push(` /${escapePDFName(key)} `);
+    await writeValue(rawObj, buffer, transform);
+  }
+  buffer.push(">>");
+}
+async function writeStream(stream, buffer, transform) {
+  stream = stream.getOriginalStream();
+  stream.reset();
+  let bytes = stream.getBytes();
+  const {
+    dict
+  } = stream;
+  const [filter, params] = await Promise.all([dict.getAsync("Filter"), dict.getAsync("DecodeParms")]);
+  const filterZero = Array.isArray(filter) ? await dict.xref.fetchIfRefAsync(filter[0]) : filter;
+  const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode");
+  const isFilterZeroImageDecode = isName(filterZero, "DCTDecode") || isName(filterZero, "JPXDecode") || isName(filterZero, "JBIG2Decode") || isName(filterZero, "CCITTFaxDecode") || isName(filterZero, "LZWDecode");
+  const isFilterZeroCompressedObject = isFilterZeroFlateDecode || isFilterZeroImageDecode || isName(filterZero, "BrotliDecode");
+  const MIN_LENGTH_FOR_COMPRESSING = 256;
+  if (!isFilterZeroCompressedObject && bytes.length >= MIN_LENGTH_FOR_COMPRESSING) {
+    try {
+      const cs = new CompressionStream("deflate");
+      const writer = cs.writable.getWriter();
+      await writer.ready;
+      writer.write(bytes).then(async () => {
+        await writer.ready;
+        await writer.close();
+      }).catch(() => {});
+      bytes = await new Response(cs.readable).bytes();
+      let newFilter, newParams;
+      if (!filter) {
+        newFilter = Name.get("FlateDecode");
+      } else if (!isFilterZeroFlateDecode) {
+        newFilter = Array.isArray(filter) ? [Name.get("FlateDecode"), ...filter] : [Name.get("FlateDecode"), filter];
+        if (params) {
+          newParams = Array.isArray(params) ? [null, ...params] : [null, params];
+        }
+      }
+      if (newFilter) {
+        dict.set("Filter", newFilter);
+      }
+      if (newParams) {
+        dict.set("DecodeParms", newParams);
+      }
+    } catch (ex) {
+      info(`writeStream - cannot compress data: "${ex}".`);
+    }
+  }
+  let string = bytesToString(bytes);
+  if (transform) {
+    string = transform.encryptString(string);
+  }
+  dict.set("Length", string.length);
+  await writeDict(dict, buffer, transform);
+  buffer.push(" stream\n", string, "\nendstream");
+}
+async function writeArray(array, buffer, transform) {
+  buffer.push("[");
+  for (let i = 0, ii = array.length; i < ii; i++) {
+    await writeValue(array[i], buffer, transform);
+    if (i < ii - 1) {
+      buffer.push(" ");
+    }
+  }
+  buffer.push("]");
+}
+async function writeValue(value, buffer, transform) {
+  if (value instanceof Name) {
+    buffer.push(`/${escapePDFName(value.name)}`);
+  } else if (value instanceof Ref) {
+    buffer.push(`${value.num} ${value.gen} R`);
+  } else if (Array.isArray(value) || ArrayBuffer.isView(value)) {
+    await writeArray(value, buffer, transform);
+  } else if (typeof value === "string") {
+    if (transform) {
+      value = transform.encryptString(value);
+    }
+    buffer.push(`(${escapeString(value)})`);
+  } else if (typeof value === "number") {
+    buffer.push(value.toFixed(10).replace(/\.?0+$/, ""));
+  } else if (typeof value === "boolean") {
+    buffer.push(value.toString());
+  } else if (value instanceof Dict) {
+    await writeDict(value, buffer, transform);
+  } else if (value instanceof BaseStream) {
+    await writeStream(value, buffer, transform);
+  } else if (value === null) {
+    buffer.push("null");
+  } else {
+    warn(`Unhandled value in writer: ${typeof value}, please file a bug.`);
+  }
+}
+function writeInt(number, size, offset, buffer) {
+  for (let i = size + offset - 1; i > offset - 1; i--) {
+    buffer[i] = number & 0xff;
+    number >>= 8;
+  }
+  return offset + size;
+}
+function writeString(string, offset, buffer) {
+  const ii = string.length;
+  for (let i = 0; i < ii; i++) {
+    buffer[offset + i] = string.charCodeAt(i) & 0xff;
+  }
+  return offset + ii;
+}
+function computeMD5(filesize, xrefInfo) {
+  const time = Math.floor(Date.now() / 1000);
+  const filename = xrefInfo.filename || "";
+  const md5Buffer = [time.toString(), filename, filesize.toString(), ...xrefInfo.infoMap.values()];
+  const md5BufferLen = Math.sumPrecise(md5Buffer.map(str => str.length));
+  const array = new Uint8Array(md5BufferLen);
+  let offset = 0;
+  for (const str of md5Buffer) {
+    offset = writeString(str, offset, array);
+  }
+  return bytesToString(calculateMD5(array, 0, array.length));
+}
+function writeXFADataForAcroform(str, changes) {
+  const xml = new SimpleXMLParser({
+    hasAttributes: true
+  }).parseFromString(str);
+  for (const {
+    xfa
+  } of changes) {
+    if (!xfa) {
+      continue;
+    }
+    const {
+      path,
+      value
+    } = xfa;
+    if (!path) {
+      continue;
+    }
+    const nodePath = parseXFAPath(path);
+    let node = xml.documentElement.searchNode(nodePath, 0);
+    if (!node && nodePath.length > 1) {
+      node = xml.documentElement.searchNode([nodePath.at(-1)], 0);
+    }
+    if (node) {
+      node.childNodes = Array.isArray(value) ? value.map(val => new SimpleDOMNode("value", val)) : [new SimpleDOMNode("#text", value)];
+    } else {
+      warn(`Node not found for path: ${path}`);
+    }
+  }
+  const buffer = [];
+  xml.documentElement.dump(buffer);
+  return buffer.join("");
+}
+async function updateAcroform({
+  xref,
+  acroForm,
+  acroFormRef,
+  hasXfa,
+  hasXfaDatasetsEntry,
+  xfaDatasetsRef,
+  needAppearances,
+  changes
+}) {
+  if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) {
+    warn("XFA - Cannot save it");
+  }
+  if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) {
+    return;
+  }
+  const dict = acroForm.clone();
+  if (hasXfa && !hasXfaDatasetsEntry) {
+    const newXfa = acroForm.get("XFA").slice();
+    newXfa.splice(2, 0, "datasets");
+    newXfa.splice(3, 0, xfaDatasetsRef);
+    dict.set("XFA", newXfa);
+  }
+  if (needAppearances) {
+    dict.set("NeedAppearances", true);
+  }
+  changes.put(acroFormRef, {
+    data: dict
+  });
+}
+function updateXFA({
+  xfaData,
+  xfaDatasetsRef,
+  changes,
+  xref
+}) {
+  if (xfaData === null) {
+    const datasets = xref.fetchIfRef(xfaDatasetsRef);
+    xfaData = writeXFADataForAcroform(datasets.getString(), changes);
+  }
+  const xfaDataStream = new StringStream(xfaData, new Dict(xref));
+  xfaDataStream.dict.setIfName("Type", "EmbeddedFile");
+  changes.put(xfaDatasetsRef, {
+    data: xfaDataStream
+  });
+}
+async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) {
+  buffer.push("xref\n");
+  const indexes = getIndexes(newRefs);
+  let indexesPosition = 0;
+  for (const {
+    ref,
+    data
+  } of newRefs) {
+    if (ref.num === indexes[indexesPosition]) {
+      buffer.push(`${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`);
+      indexesPosition += 2;
+    }
+    if (data !== null) {
+      buffer.push(`${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`);
+      baseOffset += data.length;
+    } else {
+      buffer.push(`0000000000 ${Math.min(ref.gen + 1, 0xffff).toString().padStart(5, "0")} f\r\n`);
+    }
+  }
+  computeIDs(baseOffset, xrefInfo, newXref);
+  buffer.push("trailer\n");
+  await writeDict(newXref, buffer, null);
+  buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n");
+}
+function getIndexes(newRefs) {
+  const indexes = [];
+  for (const {
+    ref
+  } of newRefs) {
+    if (ref.num === indexes.at(-2) + indexes.at(-1)) {
+      indexes[indexes.length - 1] += 1;
+    } else {
+      indexes.push(ref.num, 1);
+    }
+  }
+  return indexes;
+}
+async function getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) {
+  const xrefTableData = [];
+  let maxOffset = 0;
+  let maxGen = 0;
+  for (const {
+    ref,
+    data,
+    objStreamRef,
+    index
+  } of newRefs) {
+    let gen;
+    maxOffset = Math.max(maxOffset, baseOffset);
+    if (objStreamRef) {
+      gen = index;
+      xrefTableData.push([2, objStreamRef.num, gen]);
+    } else if (data !== null) {
+      gen = Math.min(ref.gen, 0xffff);
+      xrefTableData.push([1, baseOffset, gen]);
+      baseOffset += data.length;
+    } else {
+      gen = Math.min(ref.gen + 1, 0xffff);
+      xrefTableData.push([0, 0, gen]);
+    }
+    maxGen = Math.max(maxGen, gen);
+  }
+  newXref.set("Index", getIndexes(newRefs));
+  const offsetSize = getSizeInBytes(maxOffset);
+  const maxGenSize = getSizeInBytes(maxGen);
+  const sizes = [1, offsetSize, maxGenSize];
+  newXref.set("W", sizes);
+  computeIDs(baseOffset, xrefInfo, newXref);
+  const structSize = Math.sumPrecise(sizes);
+  const data = new Uint8Array(structSize * xrefTableData.length);
+  const stream = new Stream(data);
+  stream.dict = newXref;
+  let offset = 0;
+  for (const [type, objOffset, gen] of xrefTableData) {
+    offset = writeInt(type, sizes[0], offset, data);
+    offset = writeInt(objOffset, sizes[1], offset, data);
+    offset = writeInt(gen, sizes[2], offset, data);
+  }
+  await writeObject(xrefInfo.newRef, stream, buffer, {});
+  buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n");
+}
+function computeIDs(baseOffset, xrefInfo, newXref) {
+  if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) {
+    const md5 = computeMD5(baseOffset, xrefInfo);
+    newXref.set("ID", [xrefInfo.fileIds[0] || md5, md5]);
+  }
+}
+function getTrailerDict(xrefInfo, changes, useXrefStream) {
+  const newXref = new Dict(null);
+  newXref.setIfDefined("Prev", xrefInfo?.startXRef);
+  const refForXrefTable = xrefInfo.newRef;
+  if (useXrefStream) {
+    changes.put(refForXrefTable, {
+      data: ""
+    });
+    newXref.set("Size", refForXrefTable.num + 1);
+    newXref.setIfName("Type", "XRef");
+  } else {
+    newXref.set("Size", refForXrefTable.num);
+  }
+  newXref.setIfDefined("Root", xrefInfo?.rootRef);
+  newXref.setIfDefined("Info", xrefInfo?.infoRef);
+  newXref.setIfDefined("Encrypt", xrefInfo?.encryptRef);
+  return newXref;
+}
+async function writeChanges(changes, xref, buffer = []) {
+  const newRefs = [];
+  for (const [ref, {
+    data,
+    objStreamRef,
+    index
+  }] of changes.items()) {
+    if (objStreamRef) {
+      newRefs.push({
+        ref,
+        data,
+        objStreamRef,
+        index
+      });
+      continue;
+    }
+    if (data === null || typeof data === "string") {
+      newRefs.push({
+        ref,
+        data
+      });
+      continue;
+    }
+    await writeObject(ref, data, buffer, xref);
+    newRefs.push({
+      ref,
+      data: buffer.join("")
+    });
+    buffer.length = 0;
+  }
+  return newRefs.sort((a, b) => a.ref.num - b.ref.num);
+}
+async function incrementalUpdate({
+  originalData,
+  xrefInfo,
+  changes,
+  xref = null,
+  hasXfa = false,
+  xfaDatasetsRef = null,
+  hasXfaDatasetsEntry = false,
+  needAppearances,
+  acroFormRef = null,
+  acroForm = null,
+  xfaData = null,
+  useXrefStream = false
+}) {
+  await updateAcroform({
+    xref,
+    acroForm,
+    acroFormRef,
+    hasXfa,
+    hasXfaDatasetsEntry,
+    xfaDatasetsRef,
+    needAppearances,
+    changes
+  });
+  if (hasXfa) {
+    updateXFA({
+      xfaData,
+      xfaDatasetsRef,
+      changes,
+      xref
+    });
+  }
+  const newXref = getTrailerDict(xrefInfo, changes, useXrefStream);
+  const buffer = [];
+  const newRefs = await writeChanges(changes, xref, buffer);
+  let baseOffset = originalData.length;
+  const lastByte = originalData.at(-1);
+  if (lastByte !== 0x0a && lastByte !== 0x0d) {
+    buffer.push("\n");
+    baseOffset += 1;
+  }
+  for (const {
+    data
+  } of newRefs) {
+    if (data !== null) {
+      buffer.push(data);
+    }
+  }
+  await (useXrefStream ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer));
+  const totalLength = originalData.length + Math.sumPrecise(buffer.map(str => str.length));
+  const array = new Uint8Array(totalLength);
+  array.set(originalData);
+  let offset = originalData.length;
+  for (const str of buffer) {
+    offset = writeString(str, offset, array);
+  }
+  return array;
+}
+
+;// ./src/core/editor/pdf_editor.js
+
+
+
+
+
+
+
+
+
+
+
+
+const MAX_LEAVES_PER_PAGES_NODE = 16;
+const MAX_IN_NAME_TREE_NODE = 64;
+class PageData {
+  constructor(page, documentData) {
+    this.page = page;
+    this.documentData = documentData;
+    this.annotations = null;
+    this.pointingNamedDestinations = null;
+    documentData.pagesMap.put(page.ref, this);
+  }
+}
+class DocumentData {
+  constructor(document) {
+    this.document = document;
+    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.resourceStreamPromises = new Map();
+    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 = false;
+    this.fieldToParent = new RefSetCache();
+    this.outline = null;
+    this.embeddedFiles = null;
+  }
+}
+class XRefWrapper {
+  constructor(entries, getNewRef) {
+    this.entries = entries;
+    this._getNewRef = getNewRef;
+  }
+  getNewTemporaryRef() {
+    return this._getNewRef();
+  }
+  fetchIfRef(obj) {
+    return obj instanceof Ref ? this.fetch(obj) : obj;
+  }
+  fetch(ref) {
+    if (!(ref instanceof Ref)) {
+      throw new Error("ref object is not a reference");
+    }
+    return this.entries[ref.num];
+  }
+  async fetchIfRefAsync(obj) {
+    return obj instanceof Ref ? this.fetchAsync(obj) : obj;
+  }
+  async fetchAsync(ref) {
+    return this.fetch(ref);
+  }
+}
+class PDFEditor {
+  isSingleFile = false;
+  #newAnnotationsParams = null;
+  #primaryDocument = null;
+  #resourceStreamCache = new Map();
+  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 = false;
+  acroFormSigFlags = 0;
+  acroFormCalculationOrder = null;
+  acroFormQ = 0;
+  outlineItems = null;
+  embeddedFiles = new Map();
+  constructor({
+    useObjectStreams = true,
+    title = "",
+    author = ""
+  } = {}) {
+    [this.rootRef, this.rootDict] = this.newDict;
+    [this.infoRef, this.infoDict] = this.newDict;
+    [this.pagesRef, this.pagesDict] = this.newDict;
+    this.useObjectStreams = useObjectStreams;
+    this.objStreamRefs = useObjectStreams ? new Set() : null;
+    this.title = title;
+    this.author = author;
+  }
+  get newRef() {
+    return Ref.get(this.newRefCount++, 0);
+  }
+  get newDict() {
+    const ref = this.newRef;
+    const dict = this.xref[ref.num] = new Dict();
+    return [ref, dict];
+  }
+  async #cloneObject(obj, xref) {
+    const ref = this.newRef;
+    this.xref[ref.num] = await this.#collectDependencies(obj, true, xref);
+    return ref;
+  }
+  cloneDict(dict) {
+    const newDict = dict.clone();
+    newDict.xref = this.xrefWrapper;
+    return newDict;
+  }
+  async #collectDependencies(obj, mustClone, xref, resourceStreamPath = new RefSet()) {
+    if (obj instanceof Ref) {
+      const {
+        currentDocument: {
+          oldRefMapping
+        }
+      } = this;
+      const existingRef = oldRefMapping.get(obj);
+      if (existingRef) {
+        return existingRef;
+      }
+      const oldRef = obj;
+      obj = await xref.fetchAsync(oldRef);
+      if (typeof obj === "number") {
+        return obj;
+      }
+      if (obj instanceof BaseStream && this.#isResourceStream(obj.dict)) {
+        return this.#collectResourceStream(oldRef, obj, xref, resourceStreamPath);
+      }
+      const newRef = this.newRef;
+      oldRefMapping.put(oldRef, newRef);
+      this.xref[newRef.num] = await this.#collectDependencies(obj, true, xref, resourceStreamPath);
+      return newRef;
+    }
+    const promises = [];
+    const {
+      currentDocument: {
+        postponedRefCopies
+      }
+    } = this;
+    if (Array.isArray(obj)) {
+      if (mustClone) {
+        obj = obj.slice();
+      }
+      for (let i = 0, ii = obj.length; i < ii; i++) {
+        const postponedActions = obj[i] instanceof Ref && postponedRefCopies.get(obj[i]);
+        if (postponedActions) {
+          postponedActions.push(ref => obj[i] = ref);
+          continue;
+        }
+        promises.push(this.#collectDependencies(obj[i], true, xref, resourceStreamPath).then(newObj => obj[i] = newObj));
+      }
+      await Promise.all(promises);
+      return obj;
+    }
+    let dict;
+    if (obj instanceof BaseStream) {
+      ({
+        dict
+      } = obj = obj.getOriginalStream().clone());
+      dict.xref = this.xrefWrapper;
+    } else if (obj instanceof Dict) {
+      if (mustClone) {
+        obj = obj.clone();
+        obj.xref = this.xrefWrapper;
+      }
+      dict = obj;
+    }
+    if (dict) {
+      for (const [key, rawObj] of dict.getRawEntries()) {
+        const postponedActions = rawObj instanceof Ref && postponedRefCopies.get(rawObj);
+        if (postponedActions) {
+          postponedActions.push(ref => dict.set(key, ref));
+          continue;
+        }
+        promises.push(this.#collectDependencies(rawObj, true, xref, resourceStreamPath).then(newObj => dict.set(key, newObj)));
+      }
+      await Promise.all(promises);
+    }
+    return obj;
+  }
+  #isResourceStream(dict) {
+    const subtype = dict.get("Subtype");
+    return isName(subtype, "Image") || dict.has("Length1") || isName(subtype, "Type1C") || isName(subtype, "CIDFontType0C") || isName(subtype, "OpenType");
+  }
+  #rawStreamBytes(stream) {
+    const original = stream.getOriginalStream();
+    original.reset();
+    return original.getBytes();
+  }
+  async #serializeDict(dict) {
+    const buffer = [];
+    await writeValue(dict, buffer, null);
+    return buffer.join("");
+  }
+  #resourceStreamKey(dictStr, bytes) {
+    const SAMPLE_SIZE = 256;
+    const SAMPLE_COUNT = 4;
+    const {
+      length
+    } = bytes;
+    const hash = new MurmurHash3_64();
+    hash.update(dictStr);
+    hash.update(`#${length}`);
+    if (length <= SAMPLE_SIZE * SAMPLE_COUNT) {
+      hash.update(bytes);
+    } else {
+      const step = Math.floor((length - SAMPLE_SIZE) / (SAMPLE_COUNT - 1));
+      for (let i = 0; i < SAMPLE_COUNT; i++) {
+        const start = Math.min(i * step, length - SAMPLE_SIZE);
+        hash.update(bytes.subarray(start, start + SAMPLE_SIZE));
+      }
+    }
+    return hash.hexdigest();
+  }
+  async #collectResourceStream(oldRef, stream, xref, resourceStreamPath) {
+    const {
+      currentDocument: {
+        oldRefMapping,
+        resourceStreamPromises
+      }
+    } = this;
+    if (resourceStreamPath.has(oldRef)) {
+      let ref = oldRefMapping.get(oldRef);
+      if (!ref) {
+        ref = this.newRef;
+        oldRefMapping.put(oldRef, ref);
+      }
+      return ref;
+    }
+    const key = oldRef.toString();
+    const pending = resourceStreamPromises.get(key);
+    if (pending) {
+      return pending;
+    }
+    const childPath = new RefSet(resourceStreamPath);
+    childPath.put(oldRef);
+    const promise = Promise.resolve().then(async () => {
+      const collected = await this.#collectDependencies(stream, true, xref, childPath);
+      const cycleRef = oldRefMapping.get(oldRef);
+      if (cycleRef) {
+        this.xref[cycleRef.num] = collected;
+        return cycleRef;
+      }
+      const ref = await this.#dedupResourceStream(collected);
+      oldRefMapping.put(oldRef, ref);
+      return ref;
+    });
+    resourceStreamPromises.set(key, promise);
+    try {
+      return await promise;
+    } finally {
+      if (resourceStreamPromises.get(key) === promise) {
+        resourceStreamPromises.delete(key);
+      }
+    }
+  }
+  async #dedupResourceStream(stream) {
+    const dictStr = await this.#serializeDict(stream.dict);
+    const bytes = this.#rawStreamBytes(stream);
+    const key = this.#resourceStreamKey(dictStr, bytes);
+    const bucket = this.#resourceStreamCache.getOrInsertComputed(key, makeArr);
+    for (const entry of bucket) {
+      if (entry.dictStr === dictStr && isArrayEqual(this.#rawStreamBytes(entry.stream), bytes)) {
+        return entry.ref;
+      }
+    }
+    const ref = this.newRef;
+    this.xref[ref.num] = stream;
+    bucket.push({
+      ref,
+      dictStr,
+      stream
+    });
+    return ref;
+  }
+  async #cloneStructTreeNode(parentStructRef, node, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles, visited = new RefSet()) {
+    const {
+      currentDocument: {
+        pagesMap,
+        oldRefMapping
+      }
+    } = this;
+    const pg = node.getRaw("Pg");
+    if (pg instanceof Ref && !pagesMap.has(pg)) {
+      return null;
+    }
+    let kids;
+    const k = kids = node.getRaw("K");
+    if (k instanceof Ref) {
+      if (visited.has(k)) {
+        return null;
+      }
+      kids = await xref.fetchAsync(k);
+      if (!Array.isArray(kids)) {
+        kids = [k];
+      }
+    }
+    kids = Array.isArray(kids) ? kids : [kids];
+    const newKids = [];
+    const structElemIndices = [];
+    for (let kid of kids) {
+      const kidRef = kid instanceof Ref ? kid : null;
+      if (kidRef) {
+        if (visited.has(kidRef)) {
+          continue;
+        }
+        visited.put(kidRef);
+        kid = await xref.fetchAsync(kidRef);
+      }
+      if (typeof kid === "number") {
+        newKids.push(kid);
+        continue;
+      }
+      if (!(kid instanceof Dict)) {
+        continue;
+      }
+      const pgRef = kid.getRaw("Pg");
+      if (pgRef instanceof Ref && !pagesMap.has(pgRef)) {
+        continue;
+      }
+      const type = kid.get("Type");
+      if (!type || isName(type, "StructElem")) {
+        let setAsSpan = false;
+        if (kidRef && removedStructElements.has(kidRef)) {
+          if (!isName(kid.get("S"), "Link")) {
+            continue;
+          }
+          setAsSpan = true;
+        }
+        const newKidRef = await this.#cloneStructTreeNode(kidRef, kid, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles, visited);
+        if (newKidRef) {
+          structElemIndices.push(newKids.length);
+          newKids.push(newKidRef);
+          if (kidRef) {
+            oldRefMapping.put(kidRef, newKidRef);
+          }
+          if (setAsSpan) {
+            this.xref[newKidRef.num].setIfName("S", "Span");
+          }
+        }
+        continue;
+      }
+      if (isName(type, "OBJR")) {
+        if (!kidRef) {
+          continue;
+        }
+        const newKidRef = oldRefMapping.get(kidRef);
+        if (!newKidRef) {
+          continue;
+        }
+        const newKid = this.xref[newKidRef.num];
+        const objRef = newKid.getRaw("Obj");
+        if (objRef instanceof Ref) {
+          const obj = this.xref[objRef.num];
+          if (obj instanceof Dict && !obj.has("StructParent") && parentStructRef) {
+            const structParent = this.parentTree.size;
+            this.parentTree.set(structParent, [oldRefMapping, parentStructRef]);
+            obj.set("StructParent", structParent);
+          }
+        }
+        newKids.push(newKidRef);
+        continue;
+      }
+      if (isName(type, "MCR")) {
+        const newKid = await this.#collectDependencies(kidRef || kid, true, xref);
+        newKids.push(newKid);
+        continue;
+      }
+      if (kidRef) {
+        const newKidRef = await this.#collectDependencies(kidRef, true, xref);
+        newKids.push(newKidRef);
+      }
+    }
+    if (kids.length !== 0 && newKids.length === 0) {
+      return null;
+    }
+    const newNodeRef = this.newRef;
+    const newNode = this.xref[newNodeRef.num] = this.cloneDict(node);
+    newNode.delete("ID");
+    newNode.delete("C");
+    newNode.delete("K");
+    newNode.delete("P");
+    newNode.delete("S");
+    await this.#collectDependencies(newNode, false, xref);
+    const classNames = node.get("C");
+    if (classNames instanceof Name) {
+      const newClassName = dedupClasses.get(classNames.name);
+      newNode.set("C", newClassName ? Name.get(newClassName) : classNames);
+    } else if (Array.isArray(classNames)) {
+      const newClassNames = [];
+      for (const className of classNames) {
+        if (className instanceof Name) {
+          const newClassName = dedupClasses.get(className.name);
+          newClassNames.push(newClassName ? Name.get(newClassName) : className);
+        }
+      }
+      newNode.set("C", newClassNames);
+    }
+    const roleName = node.get("S");
+    if (roleName instanceof Name) {
+      const newRoleName = dedupRoles.get(roleName.name);
+      newNode.set("S", newRoleName ? Name.get(newRoleName) : roleName);
+    }
+    const id = node.get("ID");
+    if (typeof id === "string") {
+      const stringId = stringToPDFString(id, false);
+      const newId = dedupIDs.get(stringId);
+      newNode.set("ID", newId ? stringToAsciiOrUTF16BE(newId) : id);
+    }
+    let attributes = newNode.get("A");
+    if (attributes) {
+      if (!Array.isArray(attributes)) {
+        attributes = [attributes];
+      }
+      for (let attr of attributes) {
+        attr = this.xrefWrapper.fetchIfRef(attr);
+        if (isName(attr.get("O"), "Table") && attr.has("Headers")) {
+          const headers = this.xrefWrapper.fetchIfRef(attr.getRaw("Headers"));
+          if (Array.isArray(headers)) {
+            for (let i = 0, ii = headers.length; i < ii; i++) {
+              const newId = dedupIDs.get(stringToPDFString(headers[i], false));
+              if (newId) {
+                headers[i] = newId;
+              }
+            }
+          }
+        }
+      }
+    }
+    for (const index of structElemIndices) {
+      const structElemRef = newKids[index];
+      const structElem = this.xref[structElemRef.num];
+      structElem.set("P", newNodeRef);
+    }
+    if (newKids.length === 1) {
+      newNode.set("K", newKids[0]);
+    } else if (newKids.length > 1) {
+      newNode.set("K", newKids);
+    }
+    return newNodeRef;
+  }
+  #getFilteredPageIndices({
+    document,
+    includePages,
+    excludePages
+  }) {
+    if (!document) {
+      return [];
+    }
+    const compile = list => {
+      if (!list?.length) {
+        return null;
+      }
+      const indices = new Set();
+      const ranges = [];
+      for (const item of list) {
+        if (Array.isArray(item)) {
+          ranges.push(item);
+        } else {
+          indices.add(item);
+        }
+      }
+      return {
+        indices,
+        ranges
+      };
+    };
+    const matches = (index, {
+      indices,
+      ranges
+    }) => indices.has(index) || ranges.some(([start, end]) => index >= start && index <= end);
+    const inc = compile(includePages);
+    const exc = compile(excludePages);
+    const result = [];
+    for (let i = 0, ii = document.numPages; i < ii; i++) {
+      if (exc && matches(i, exc)) {
+        continue;
+      }
+      if (!inc || matches(i, inc)) {
+        result.push(i);
+      }
+    }
+    return result;
+  }
+  #resolveInsertAfterIndices(pageInfos) {
+    const counts = new Array(pageInfos.length);
+    const sequence = [];
+    const insertAfterList = [];
+    for (let i = 0; i < pageInfos.length; i++) {
+      const info = pageInfos[i];
+      let count;
+      if (info.image) {
+        count = counts[i] = 1;
+      } else if (!info.document) {
+        counts[i] = 0;
+        continue;
+      } else {
+        count = counts[i] = this.#getFilteredPageIndices(info).length;
+      }
+      if (info.pageIndices) {
+        continue;
+      }
+      if (info.insertAfter === undefined) {
+        for (let j = 0; j < count; j++) {
+          sequence.push(i);
+        }
+      } else {
+        insertAfterList.push({
+          i,
+          insertAfter: info.insertAfter,
+          count
+        });
+      }
+    }
+    if (insertAfterList.length === 0) {
+      return pageInfos;
+    }
+    const hasContent = info => !!(info.document || info.image);
+    for (let i = 0; i < pageInfos.length; i++) {
+      const info = pageInfos[i];
+      if (hasContent(info) && info.pageIndices && info.pageIndices.length < counts[i]) {
+        throw new Error("extractPages: partial pageIndices cannot be combined with insertAfter entries.");
+      }
+    }
+    insertAfterList.sort((a, b) => a.insertAfter - b.insertAfter || a.i - b.i);
+    if (sequence.length === 0 && pageInfos.some(info => hasContent(info) && info.pageIndices)) {
+      const updatedPageInfos = pageInfos.slice();
+      let maxExistingPos = -1;
+      for (const info of pageInfos) {
+        if (!hasContent(info) || !info.pageIndices) {
+          continue;
+        }
+        for (const idx of info.pageIndices) {
+          if (idx > maxExistingPos) {
+            maxExistingPos = idx;
+          }
+        }
+      }
+      let offset = 0;
+      for (const {
+        i,
+        insertAfter,
+        count
+      } of insertAfterList) {
+        const threshold = Math.min(Math.max(insertAfter, -1) + offset, maxExistingPos);
+        for (let j = 0; j < updatedPageInfos.length; j++) {
+          const existingInfo = updatedPageInfos[j];
+          if (!hasContent(existingInfo) || !existingInfo.pageIndices || existingInfo.pageIndices.every(idx => idx <= threshold)) {
+            continue;
+          }
+          updatedPageInfos[j] = {
+            ...existingInfo,
+            pageIndices: existingInfo.pageIndices.map(idx => idx > threshold ? idx + count : idx)
+          };
+        }
+        const pageIndices = [];
+        for (let k = 0; k < count; k++) {
+          pageIndices.push(threshold + 1 + k);
+        }
+        const result = {
+          ...updatedPageInfos[i],
+          pageIndices
+        };
+        delete result.insertAfter;
+        updatedPageInfos[i] = result;
+        offset += count;
+        maxExistingPos += count;
+      }
+      return updatedPageInfos;
+    }
+    let offset = 0;
+    for (const {
+      i,
+      insertAfter,
+      count
+    } of insertAfterList) {
+      const insertPos = Math.max(insertAfter, -1) + 1 + offset;
+      sequence.splice(insertPos, 0, ...new Array(count).fill(i));
+      offset += count;
+    }
+    const pageIndicesArr = new Array(pageInfos.length);
+    for (let pos = 0; pos < sequence.length; pos++) {
+      const infoIdx = sequence[pos];
+      (pageIndicesArr[infoIdx] ||= []).push(pos);
+    }
+    return pageInfos.map((info, i) => {
+      if (!hasContent(info) || info.pageIndices) {
+        return info;
+      }
+      const result = {
+        ...info,
+        pageIndices: pageIndicesArr[i] || []
+      };
+      delete result.insertAfter;
+      return result;
+    });
+  }
+  async extractPages(pageInfos, annotationStorage, primaryDocument, handler, task) {
+    this.#primaryDocument = primaryDocument;
+    pageInfos = this.#resolveInsertAfterIndices(pageInfos);
+    const promises = [];
+    let newIndex = 0;
+    const reservePageSlot = newPageIndex => {
+      if (!Number.isInteger(newPageIndex) || newPageIndex < 0) {
+        throw new Error("extractPages: invalid page index.");
+      }
+      if (this.oldPages[newPageIndex] !== undefined) {
+        throw new Error("extractPages: overlapping pageIndices.");
+      }
+      this.oldPages[newPageIndex] = null;
+    };
+    const docPageInfos = pageInfos.filter(info => !!info.document);
+    this.isSingleFile = docPageInfos.length === 1 || docPageInfos.length > 0 && docPageInfos.every(info => info.document === docPageInfos[0].document);
+    const allDocumentData = [];
+    if (annotationStorage) {
+      this.#newAnnotationsParams = {
+        handler,
+        task,
+        newAnnotationsByPage: getNewAnnotationsMap(annotationStorage),
+        imagesPromises: AnnotationFactory.generateImages(annotationStorage.values(), this.xrefWrapper, true)
+      };
+    }
+    const imageEntries = [];
+    for (const pageInfo of pageInfos) {
+      const {
+        document,
+        image,
+        includePages,
+        excludePages,
+        pageIndices
+      } = pageInfo;
+      if (image) {
+        if (pageIndices) {
+          newIndex = -1;
+          if (pageIndices.length > 1) {
+            throw new Error("extractPages: too many pageIndices.");
+          }
+        }
+        let newPageIndex;
+        if (pageIndices?.length) {
+          newPageIndex = pageIndices[0];
+        } else if (newIndex !== -1) {
+          newPageIndex = newIndex++;
+        } else {
+          for (newPageIndex = 0; this.oldPages[newPageIndex] !== undefined; newPageIndex++) {}
+        }
+        reservePageSlot(newPageIndex);
+        imageEntries.push({
+          image,
+          slot: newPageIndex
+        });
+        continue;
+      }
+      if (!document) {
+        continue;
+      }
+      if (pageIndices) {
+        newIndex = -1;
+      }
+      const filteredPageIndices = this.#getFilteredPageIndices({
+        document,
+        includePages,
+        excludePages
+      });
+      if (pageIndices && pageIndices.length > filteredPageIndices.length) {
+        throw new Error("extractPages: too many pageIndices.");
+      }
+      const documentData = new DocumentData(document);
+      allDocumentData.push(documentData);
+      promises.push(this.#collectDocumentData(documentData));
+      let pageIndex = 0;
+      for (const i of filteredPageIndices) {
+        let newPageIndex;
+        if (pageIndices) {
+          newPageIndex = pageIndices[pageIndex++];
+        }
+        if (newPageIndex === undefined) {
+          if (newIndex !== -1) {
+            newPageIndex = newIndex++;
+          } else {
+            for (newPageIndex = 0; this.oldPages[newPageIndex] !== undefined; newPageIndex++) {}
+          }
+        }
+        reservePageSlot(newPageIndex);
+        promises.push(document.getPage(i).then(page => {
+          this.oldPages[newPageIndex] = new PageData(page, documentData);
+        }));
+      }
+    }
+    await Promise.all(promises);
+    for (let i = 0, ii = this.oldPages.length; i < ii; i++) {
+      if (this.oldPages[i] === undefined) {
+        throw new Error("extractPages: sparse pageIndices.");
+      }
+    }
+    promises.length = 0;
+    this.#collectValidDestinations(allDocumentData);
+    this.#collectOutlineDestinations(allDocumentData);
+    this.#collectPageLabels();
+    for (const page of this.oldPages) {
+      if (page) {
+        promises.push(this.#postCollectPageData(page));
+      }
+    }
+    await Promise.all(promises);
+    this.#findDuplicateNamedDestinations();
+    this.#setPostponedRefCopies(allDocumentData);
+    const imageSlots = new Map();
+    for (const entry of imageEntries) {
+      imageSlots.set(entry.slot, entry);
+    }
+    const modalPageSize = imageSlots.size > 0 ? this.#modalPageSize() : null;
+    for (let i = 0, ii = this.oldPages.length; i < ii; i++) {
+      const imageEntry = imageSlots.get(i);
+      if (imageEntry) {
+        this.newPages[i] = await this.#makeImagePage(imageEntry.image, modalPageSize);
+      } else {
+        this.newPages[i] = await this.#makePageCopy(i, null);
+      }
+    }
+    this.#fixPostponedRefCopies(allDocumentData);
+    await this.#mergeStructTrees(allDocumentData);
+    await this.#mergeAcroForms(allDocumentData);
+    this.#buildOutline(allDocumentData);
+    await this.#collectEmbeddedFiles(allDocumentData);
+    return this.writePDF();
+  }
+  async #collectDocumentData(documentData) {
+    const {
+      document: {
+        pdfManager,
+        xref
+      }
+    } = documentData;
+    await Promise.all([pdfManager.ensureCatalog("destinations").then(destinations => documentData.destinations = destinations), pdfManager.ensureCatalog("rawPageLabels").then(pageLabels => documentData.pageLabels = pageLabels), pdfManager.ensureCatalog("structTreeRoot").then(structTreeRoot => documentData.structTreeRoot = structTreeRoot), pdfManager.ensureCatalog("acroForm").then(acroForm => documentData.acroForm = acroForm), pdfManager.ensureCatalog("documentOutlineForEditor").then(outline => documentData.outline = outline), pdfManager.ensureCatalog("rawEmbeddedFiles").then(ef => documentData.embeddedFiles = ef)]);
+    const structTreeRoot = documentData.structTreeRoot;
+    if (structTreeRoot) {
+      const rootDict = structTreeRoot.dict;
+      const parentTree = rootDict.get("ParentTree");
+      if (parentTree) {
+        const numberTree = new NumberTree(parentTree, xref);
+        documentData.parentTree = numberTree.getAll(true);
+      }
+      const idTree = rootDict.get("IDTree");
+      if (idTree) {
+        const nameTree = new NameTree(idTree, xref);
+        documentData.idTree = nameTree.getAll(true);
+      }
+      documentData.roleMap = rootDict.get("RoleMap") || null;
+      documentData.classMap = rootDict.get("ClassMap") || null;
+      let namespaces = rootDict.get("Namespaces") || null;
+      if (namespaces && !Array.isArray(namespaces)) {
+        namespaces = [namespaces];
+      }
+      documentData.namespaces = namespaces;
+      documentData.structTreeAF = rootDict.get("AF") || null;
+      documentData.structTreePronunciationLexicon = rootDict.get("PronunciationLexicon") || null;
+    }
+  }
+  async #postCollectPageData(pageData) {
+    const {
+      page: {
+        xref,
+        annotations
+      },
+      documentData: {
+        pagesMap,
+        destinations,
+        usedNamedDestinations,
+        fieldToParent
+      }
+    } = pageData;
+    if (!annotations) {
+      return;
+    }
+    const promises = [];
+    let newAnnotations = [];
+    let newIndex = 0;
+    let {
+      hasSignatureAnnotations
+    } = pageData.documentData;
+    for (const annotationRef of annotations) {
+      const newAnnotationIndex = newIndex++;
+      promises.push(xref.fetchIfRefAsync(annotationRef).then(async annotationDict => {
+        if (!isName(annotationDict.get("Subtype"), "Link")) {
+          if (isName(annotationDict.get("Subtype"), "Widget")) {
+            hasSignatureAnnotations ||= isName(annotationDict.get("FT"), "Sig");
+            const parentRef = annotationDict.get("Parent") || null;
+            annotationDict.delete("Parent");
+            fieldToParent.put(annotationRef, parentRef);
+          }
+          newAnnotations[newAnnotationIndex] = annotationRef;
+          return;
+        }
+        const action = annotationDict.get("A");
+        const dest = action instanceof Dict ? action.get("D") : annotationDict.get("Dest");
+        if (!dest || Array.isArray(dest) && (!(dest[0] instanceof Ref) || pagesMap.has(dest[0]))) {
+          newAnnotations[newAnnotationIndex] = annotationRef;
+        } else if (typeof dest === "string") {
+          const destString = stringToPDFString(dest, true);
+          if (destinations.has(destString)) {
+            newAnnotations[newAnnotationIndex] = annotationRef;
+            usedNamedDestinations.add(destString);
+          }
+        }
+      }));
+    }
+    await Promise.all(promises);
+    newAnnotations = newAnnotations.filter(annot => !!annot);
+    pageData.annotations = newAnnotations.length > 0 ? newAnnotations : null;
+    pageData.documentData.hasSignatureAnnotations ||= hasSignatureAnnotations;
+  }
+  #setPostponedRefCopies(allDocumentData) {
+    for (const {
+      postponedRefCopies,
+      pagesMap
+    } of allDocumentData) {
+      for (const oldPageRef of pagesMap.keys()) {
+        postponedRefCopies.put(oldPageRef, []);
+      }
+    }
+  }
+  #fixPostponedRefCopies(allDocumentData) {
+    for (const {
+      postponedRefCopies,
+      oldRefMapping
+    } of allDocumentData) {
+      for (const [oldRef, actions] of postponedRefCopies.items()) {
+        const newRef = oldRefMapping.get(oldRef);
+        for (const action of actions) {
+          action(newRef);
+        }
+      }
+      postponedRefCopies.clear();
+    }
+  }
+  #visitObject(obj, callback, visited = new RefSet()) {
+    if (obj instanceof Ref) {
+      if (!visited.has(obj)) {
+        visited.put(obj);
+        this.#visitObject(this.xref[obj.num], callback, visited);
+      }
+      return;
+    }
+    if (Array.isArray(obj)) {
+      for (const item of obj) {
+        this.#visitObject(item, callback, visited);
+      }
+      return;
+    }
+    let dict;
+    if (obj instanceof BaseStream) {
+      ({
+        dict
+      } = obj);
+    } else if (obj instanceof Dict) {
+      dict = obj;
+    }
+    if (dict) {
+      callback(dict);
+      for (const value of dict.getRawValues()) {
+        this.#visitObject(value, callback, visited);
+      }
+    }
+  }
+  async #mergeStructTrees(allDocumentData) {
+    let newStructParentId = 0;
+    const {
+      parentTree: newParentTree
+    } = this;
+    for (let i = 0, ii = this.newPages.length; i < ii; i++) {
+      if (!this.oldPages[i]) {
+        continue;
+      }
+      const {
+        documentData: {
+          parentTree,
+          oldRefMapping,
+          oldStructParentMapping,
+          usedStructParents,
+          document: {
+            xref
+          }
+        }
+      } = this.oldPages[i];
+      if (!parentTree) {
+        continue;
+      }
+      const pageRef = this.newPages[i];
+      const pageDict = this.xref[pageRef.num];
+      const visited = new RefSet();
+      visited.put(pageRef);
+      this.#visitObject(pageDict, dict => {
+        const structParent = dict.get("StructParent") ?? dict.get("StructParents");
+        if (typeof structParent !== "number") {
+          return;
+        }
+        usedStructParents.add(structParent);
+        let parent = parentTree.get(structParent);
+        const parentRef = parent instanceof Ref ? parent : null;
+        if (parentRef) {
+          const array = xref.fetch(parentRef);
+          if (Array.isArray(array)) {
+            parent = array;
+          }
+        }
+        if (Array.isArray(parent) && parent.every(ref => ref === null)) {
+          parent = null;
+        }
+        if (!parent) {
+          if (dict.has("StructParent")) {
+            dict.delete("StructParent");
+          } else {
+            dict.delete("StructParents");
+          }
+          return;
+        }
+        let newStructParent = oldStructParentMapping.get(structParent);
+        if (newStructParent === undefined) {
+          newStructParent = newStructParentId++;
+          oldStructParentMapping.set(structParent, newStructParent);
+          newParentTree.set(newStructParent, [oldRefMapping, parent]);
+        }
+        if (dict.has("StructParent")) {
+          dict.set("StructParent", newStructParent);
+        } else {
+          dict.set("StructParents", newStructParent);
+        }
+      }, visited);
+    }
+    const {
+      structTreeKids,
+      idTree: newIdTree,
+      classMap: newClassMap,
+      roleMap: newRoleMap,
+      namespaces: newNamespaces,
+      structTreeAF: newStructTreeAF,
+      structTreePronunciationLexicon: newStructTreePronunciationLexicon
+    } = this;
+    for (const documentData of allDocumentData) {
+      const {
+        document: {
+          xref
+        },
+        oldRefMapping,
+        parentTree,
+        usedStructParents,
+        structTreeRoot,
+        idTree,
+        classMap,
+        roleMap,
+        namespaces,
+        structTreeAF,
+        structTreePronunciationLexicon
+      } = documentData;
+      if (!structTreeRoot) {
+        continue;
+      }
+      this.currentDocument = documentData;
+      const removedStructElements = new RefSet();
+      for (const [key, value] of parentTree || []) {
+        if (!usedStructParents.has(key) && value instanceof Ref) {
+          removedStructElements.put(value);
+        }
+      }
+      const dedupIDs = new Map();
+      for (const [id, nodeRef] of idTree || []) {
+        let _id = id;
+        if (newIdTree.has(id)) {
+          for (let i = 1;; i++) {
+            const newId = `${id}_${i}`;
+            if (!newIdTree.has(newId)) {
+              dedupIDs.set(id, newId);
+              _id = newId;
+              break;
+            }
+          }
+        }
+        newIdTree.set(_id, nodeRef);
+      }
+      const dedupClasses = new Map();
+      if (classMap?.size > 0) {
+        for (let [className, classDict] of classMap) {
+          classDict = await this.#collectDependencies(classDict, true, xref);
+          if (newClassMap.has(className)) {
+            for (let i = 1;; i++) {
+              const newClassName = `${className}_${i}`;
+              if (!newClassMap.has(newClassName)) {
+                dedupClasses.set(className, newClassName);
+                className = newClassName;
+                break;
+              }
+            }
+          }
+          newClassMap.set(className, classDict);
+        }
+      }
+      const dedupRoles = new Map();
+      if (roleMap?.size > 0) {
+        for (const [roleName, mappedName] of roleMap) {
+          const newMappedName = newRoleMap.get(roleName);
+          if (!newMappedName) {
+            newRoleMap.set(roleName, mappedName);
+            continue;
+          }
+          if (newMappedName === mappedName) {
+            continue;
+          }
+          for (let i = 1;; i++) {
+            const newRoleName = `${roleName}_${i}`;
+            if (!newRoleMap.has(newRoleName)) {
+              dedupRoles.set(roleName, newRoleName);
+              newRoleMap.set(newRoleName, mappedName);
+              break;
+            }
+          }
+        }
+      }
+      if (namespaces?.length > 0) {
+        for (const namespaceRef of namespaces) {
+          const namespace = await xref.fetchIfRefAsync(namespaceRef);
+          let ns = namespace.get("NS");
+          if (!ns || newNamespaces.has(ns)) {
+            continue;
+          }
+          ns = stringToPDFString(ns, false);
+          const newNamespace = await this.#collectDependencies(namespace, true, xref);
+          newNamespaces.set(ns, newNamespace);
+        }
+      }
+      if (structTreeAF) {
+        for (const afRef of structTreeAF) {
+          newStructTreeAF.push(await this.#collectDependencies(afRef, true, xref));
+        }
+      }
+      if (structTreePronunciationLexicon) {
+        for (const lexiconRef of structTreePronunciationLexicon) {
+          newStructTreePronunciationLexicon.push(await this.#collectDependencies(lexiconRef, true, xref));
+        }
+      }
+      let kids = structTreeRoot.dict.get("K");
+      if (!kids) {
+        continue;
+      }
+      kids = Array.isArray(kids) ? kids : [kids];
+      for (let kid of kids) {
+        const kidRef = kid instanceof Ref ? kid : null;
+        if (kidRef && removedStructElements.has(kidRef)) {
+          continue;
+        }
+        kid = await xref.fetchIfRefAsync(kid);
+        const newKidRef = await this.#cloneStructTreeNode(kidRef, kid, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles);
+        if (newKidRef) {
+          structTreeKids.push(newKidRef);
+        }
+      }
+      for (const [id, nodeRef] of idTree || []) {
+        const newNodeRef = nodeRef instanceof Ref && oldRefMapping.get(nodeRef);
+        const newId = dedupIDs.get(id) || id;
+        if (newNodeRef) {
+          newIdTree.set(newId, newNodeRef);
+        } else {
+          newIdTree.delete(newId);
+        }
+      }
+    }
+    for (const [key, [oldRefMapping, parent]] of newParentTree) {
+      if (!parent) {
+        newParentTree.delete(key);
+        continue;
+      }
+      if (!Array.isArray(parent)) {
+        const newParent = oldRefMapping.get(parent);
+        if (newParent === undefined) {
+          newParentTree.delete(key);
+        } else {
+          newParentTree.set(key, newParent);
+        }
+        continue;
+      }
+      const newParents = parent.map(ref => ref instanceof Ref && oldRefMapping.get(ref) || null);
+      if (newParents.length === 0 || newParents.every(ref => ref === null)) {
+        newParentTree.delete(key);
+        continue;
+      }
+      newParentTree.set(key, newParents);
+    }
+    this.currentDocument = null;
+  }
+  #collectValidDestinations(allDocumentData) {
+    for (const documentData of allDocumentData) {
+      if (!documentData.destinations) {
+        continue;
+      }
+      const {
+        destinations,
+        pagesMap
+      } = documentData;
+      const newDestinations = documentData.destinations = new Map();
+      for (const [key, dest] of Object.entries(destinations)) {
+        const pageRef = dest[0];
+        const pageData = pageRef instanceof Ref && pagesMap.get(pageRef);
+        if (!pageData) {
+          continue;
+        }
+        (pageData.pointingNamedDestinations ||= new Set()).add(key);
+        newDestinations.set(key, dest);
+      }
+    }
+  }
+  #findDuplicateNamedDestinations() {
+    const {
+      namedDestinations
+    } = this;
+    const getUniqueDestinationName = name => {
+      if (!namedDestinations.has(name)) {
+        return name;
+      }
+      for (let i = 1;; i++) {
+        const dedupedName = `${name}_${i}`;
+        if (!namedDestinations.has(dedupedName)) {
+          return dedupedName;
+        }
+      }
+    };
+    for (let i = 0, ii = this.oldPages.length; i < ii; i++) {
+      const page = this.oldPages[i];
+      if (!page) {
+        continue;
+      }
+      const {
+        documentData: {
+          destinations,
+          dedupNamedDestinations,
+          usedNamedDestinations
+        }
+      } = page;
+      let {
+        pointingNamedDestinations
+      } = page;
+      if (!pointingNamedDestinations) {
+        continue;
+      }
+      page.pointingNamedDestinations = pointingNamedDestinations = pointingNamedDestinations.intersection(usedNamedDestinations);
+      for (const pointingDest of pointingNamedDestinations) {
+        if (!usedNamedDestinations.has(pointingDest)) {
+          continue;
+        }
+        const dest = destinations.get(pointingDest).slice();
+        if (!namedDestinations.has(pointingDest)) {
+          namedDestinations.set(pointingDest, dest);
+          continue;
+        }
+        const newName = getUniqueDestinationName(`${pointingDest}_p${i + 1}`);
+        dedupNamedDestinations.set(pointingDest, newName);
+        namedDestinations.set(newName, dest);
+      }
+    }
+  }
+  #fixNamedDestinations(annotations, dedupNamedDestinations) {
+    if (dedupNamedDestinations.size === 0) {
+      return;
+    }
+    const fixDestination = (dict, key, dest) => {
+      if (typeof dest === "string") {
+        dict.set(key, dedupNamedDestinations.get(stringToPDFString(dest, true)) || dest);
+      }
+    };
+    for (const annotRef of annotations) {
+      const annotDict = this.xref[annotRef.num];
+      if (!isName(annotDict.get("Subtype"), "Link")) {
+        continue;
+      }
+      const action = annotDict.get("A");
+      if (action instanceof Dict && action.has("D")) {
+        const dest = action.get("D");
+        fixDestination(action, "D", dest);
+        continue;
+      }
+      const dest = annotDict.get("Dest");
+      fixDestination(annotDict, "Dest", dest);
+    }
+  }
+  #collectOutlineDestinations(allDocumentData) {
+    const collect = (items, destinations, usedNamedDestinations) => {
+      for (const item of items) {
+        if (typeof item.dest === "string" && destinations?.has(item.dest)) {
+          usedNamedDestinations.add(item.dest);
+        }
+        if (item.items.length > 0) {
+          collect(item.items, destinations, usedNamedDestinations);
+        }
+      }
+    };
+    for (const documentData of allDocumentData) {
+      const {
+        outline,
+        destinations,
+        usedNamedDestinations
+      } = documentData;
+      if (outline?.length) {
+        collect(outline, destinations, usedNamedDestinations);
+      }
+    }
+  }
+  #isValidOutlineDest(item, documentData) {
+    const {
+      dest,
+      action,
+      url,
+      unsafeUrl,
+      attachment,
+      setOCGState
+    } = item;
+    if (action || url || unsafeUrl || attachment || setOCGState) {
+      return true;
+    }
+    if (!dest) {
+      return false;
+    }
+    if (typeof dest === "string") {
+      const name = documentData.dedupNamedDestinations.get(dest) || dest;
+      return this.namedDestinations.has(name);
+    }
+    if (Array.isArray(dest) && dest[0] instanceof Ref) {
+      return !!documentData.oldRefMapping.get(dest[0]);
+    }
+    return false;
+  }
+  #filterOutlineItems(items, documentData) {
+    const result = [];
+    for (const item of items) {
+      const filteredChildren = this.#filterOutlineItems(item.items, documentData);
+      const hasValidOwnDest = this.#isValidOutlineDest(item, documentData);
+      if (hasValidOwnDest || filteredChildren.length > 0) {
+        result.push({
+          ...item,
+          dest: hasValidOwnDest ? item.dest : null,
+          rawDict: hasValidOwnDest ? item.rawDict : null,
+          items: filteredChildren,
+          _documentData: documentData
+        });
+      }
+    }
+    return result;
+  }
+  #buildOutline(allDocumentData) {
+    const outlineItems = [];
+    for (const documentData of allDocumentData) {
+      const {
+        outline
+      } = documentData;
+      if (!outline?.length) {
+        continue;
+      }
+      outlineItems.push(...this.#filterOutlineItems(outline, documentData));
+    }
+    this.outlineItems = outlineItems.length > 0 ? outlineItems : null;
+  }
+  async #setOutlineItemDest(itemDict, item) {
+    const {
+      dest,
+      rawDict
+    } = item;
+    const documentData = item._documentData;
+    if (dest) {
+      if (typeof dest === "string") {
+        const name = documentData.dedupNamedDestinations.get(dest) || dest;
+        itemDict.set("Dest", stringToAsciiOrUTF16BE(name));
+      } else if (Array.isArray(dest)) {
+        const newDest = dest.slice();
+        if (newDest[0] instanceof Ref) {
+          newDest[0] = documentData.oldRefMapping.get(newDest[0]) || newDest[0];
+        }
+        itemDict.set("Dest", newDest);
+      }
+      return;
+    }
+    const actionDict = rawDict?.get("A");
+    if (actionDict instanceof Dict) {
+      this.currentDocument = documentData;
+      const actionRef = await this.#cloneObject(actionDict, documentData.document.xref);
+      this.currentDocument = null;
+      itemDict.set("A", actionRef);
+    }
+  }
+  async #makeOutline() {
+    const {
+      outlineItems
+    } = this;
+    if (!outlineItems?.length) {
+      return;
+    }
+    const [outlineRootRef, outlineRootDict] = this.newDict;
+    outlineRootDict.setIfName("Type", "Outlines");
+    const assignRefs = items => {
+      for (const item of items) {
+        [item._ref] = this.newDict;
+        if (item.items.length > 0) {
+          assignRefs(item.items);
+        }
+      }
+    };
+    assignRefs(outlineItems);
+    const fillItems = async (items, parentRef) => {
+      let totalCount = 0;
+      for (let i = 0; i < items.length; i++) {
+        const item = items[i];
+        const dict = this.xref[item._ref.num];
+        dict.set("Title", stringToAsciiOrUTF16BE(item.title));
+        dict.set("Parent", parentRef);
+        if (i > 0) {
+          dict.set("Prev", items[i - 1]._ref);
+        }
+        if (i < items.length - 1) {
+          dict.set("Next", items[i + 1]._ref);
+        }
+        if (item.items.length > 0) {
+          dict.set("First", item.items[0]._ref);
+          dict.set("Last", item.items.at(-1)._ref);
+          const childCount = await fillItems(item.items, item._ref);
+          if (item.count !== undefined) {
+            dict.set("Count", item.count < 0 ? -childCount : childCount);
+          }
+          totalCount += item.count !== undefined && item.count < 0 ? 1 : childCount + 1;
+        } else {
+          totalCount += 1;
+        }
+        await this.#setOutlineItemDest(dict, item);
+        const flags = (item.bold ? 2 : 0) | (item.italic ? 1 : 0);
+        if (flags !== 0) {
+          dict.set("F", flags);
+        }
+        if (item.color && (item.color[0] !== 0 || item.color[1] !== 0 || item.color[2] !== 0)) {
+          dict.set("C", [item.color[0] / 255, item.color[1] / 255, item.color[2] / 255]);
+        }
+      }
+      return totalCount;
+    };
+    const totalCount = await fillItems(outlineItems, outlineRootRef);
+    outlineRootDict.set("First", outlineItems[0]._ref);
+    outlineRootDict.set("Last", outlineItems.at(-1)._ref);
+    outlineRootDict.set("Count", totalCount);
+    this.rootDict.set("Outlines", outlineRootRef);
+  }
+  async #mergeAcroForms(allDocumentData) {
+    this.#setAcroFormDefaultBasicValues(allDocumentData);
+    this.#setAcroFormDefaultAppearance(allDocumentData);
+    this.#setAcroFormQ(allDocumentData);
+    await this.#setAcroFormDefaultResources(allDocumentData);
+    const newFields = this.fields;
+    for (const documentData of allDocumentData) {
+      let fields = documentData.acroForm?.get("Fields") || null;
+      if (!fields && documentData.fieldToParent.size > 0) {
+        fields = this.#fixFields(documentData.fieldToParent, documentData.document.xref);
+      }
+      if (Array.isArray(fields) && fields.length > 0) {
+        this.currentDocument = documentData;
+        await this.#cloneFields(newFields, fields);
+        this.currentDocument = null;
+      }
+    }
+    this.#setAcroFormCalculationOrder(allDocumentData);
+  }
+  #setAcroFormQ(allDocumentData) {
+    let firstQ = 0;
+    let firstDocData = null;
+    for (const documentData of allDocumentData) {
+      const q = documentData.acroForm?.get("Q");
+      if (typeof q !== "number" || q === 0) {
+        continue;
+      }
+      if (firstDocData?.acroFormQ > 0) {
+        documentData.acroFormQ = q;
+        continue;
+      }
+      if (firstQ === 0) {
+        firstQ = q;
+        firstDocData = documentData;
+        continue;
+      }
+      if (q === firstQ) {
+        continue;
+      }
+      firstDocData.acroFormQ ||= firstQ;
+      documentData.acroFormQ = q;
+      firstQ = 0;
+    }
+    if (firstQ > 0) {
+      this.acroFormQ = firstQ;
+    }
+  }
+  #setAcroFormDefaultBasicValues(allDocumentData) {
+    let sigFlags = 0;
+    let needAppearances = false;
+    for (const documentData of allDocumentData) {
+      if (!documentData.acroForm) {
+        continue;
+      }
+      const sf = documentData.acroForm.get("SigFlags");
+      if (typeof sf === "number" && documentData.hasSignatureAnnotations) {
+        sigFlags |= sf;
+      }
+      if (documentData.acroForm.get("NeedAppearances") === true) {
+        needAppearances = true;
+      }
+    }
+    this.acroFormSigFlags = sigFlags;
+    this.acroFormNeedAppearances = needAppearances;
+  }
+  #setAcroFormCalculationOrder(allDocumentData) {
+    const calculationOrder = [];
+    for (const documentData of allDocumentData) {
+      const co = documentData.acroForm?.get("CO") || null;
+      if (!Array.isArray(co)) {
+        continue;
+      }
+      const {
+        oldRefMapping
+      } = documentData;
+      for (const coRef of co) {
+        const newCoRef = coRef instanceof Ref && oldRefMapping.get(coRef);
+        if (newCoRef) {
+          calculationOrder.push(newCoRef);
+        }
+      }
+    }
+    this.acroFormCalculationOrder = calculationOrder.length > 0 ? calculationOrder : null;
+  }
+  #setAcroFormDefaultAppearance(allDocumentData) {
+    let firstDA = null;
+    let firstDocData = null;
+    for (const documentData of allDocumentData) {
+      const da = documentData.acroForm?.get("DA") || null;
+      if (!da || typeof da !== "string") {
+        continue;
+      }
+      if (firstDocData?.acroFormDefaultAppearance) {
+        documentData.acroFormDefaultAppearance = da;
+        continue;
+      }
+      if (!firstDA) {
+        firstDA = da;
+        firstDocData = documentData;
+        continue;
+      }
+      if (da === firstDA) {
+        continue;
+      }
+      firstDocData.acroFormDefaultAppearance ||= firstDA;
+      documentData.acroFormDefaultAppearance = da;
+      firstDA = null;
+    }
+    if (firstDA) {
+      this.acroFormDefaultAppearance = firstDA;
+    }
+  }
+  async #setAcroFormDefaultResources(allDocumentData) {
+    let firstDR = null;
+    let firstDRRef = null;
+    let firstDocData = null;
+    for (const documentData of allDocumentData) {
+      const dr = documentData.acroForm?.get("DR") || null;
+      if (!dr || !(dr instanceof Dict)) {
+        continue;
+      }
+      if (firstDocData?.acroFormDefaultResources) {
+        documentData.acroFormDefaultResources = dr;
+        continue;
+      }
+      if (!firstDR) {
+        firstDR = dr;
+        firstDRRef = documentData.acroForm.getRaw("DR");
+        firstDocData = documentData;
+        continue;
+      }
+      if (deepCompare(firstDR, dr)) {
+        continue;
+      }
+      firstDocData.acroFormDefaultResources ||= firstDR;
+      documentData.acroFormDefaultResources = dr;
+      firstDR = null;
+      firstDRRef = null;
+    }
+    if (firstDR) {
+      this.currentDocument = firstDocData;
+      this.acroFormDefaultResources = await this.#collectDependencies(firstDRRef, true, firstDocData.document.xref);
+      this.currentDocument = null;
+    }
+  }
+  #fixFields(fieldToParent, xref) {
+    const newFields = [];
+    const processed = new RefSet();
+    for (const [fieldRef, parentRef] of fieldToParent) {
+      if (!parentRef) {
+        newFields.push(fieldRef);
+        continue;
+      }
+      let parent = parentRef;
+      let lastNonNullParent = parentRef;
+      while (true) {
+        parent = xref.fetchIfRef(parent)?.getRaw("Parent") || null;
+        if (!parent) {
+          break;
+        }
+        lastNonNullParent = parent;
+      }
+      if (lastNonNullParent instanceof Ref && !processed.has(lastNonNullParent)) {
+        newFields.push(lastNonNullParent);
+        processed.put(lastNonNullParent);
+      }
+    }
+    return newFields;
+  }
+  async #cloneFields(newFields, fields) {
+    const processed = new RefSet();
+    const stack = [{
+      kids: fields,
+      newKids: newFields,
+      pos: 0,
+      oldParentRef: null,
+      parentRef: null,
+      parent: null
+    }];
+    const {
+      document: {
+        xref
+      },
+      oldRefMapping,
+      fieldToParent,
+      acroFormDefaultAppearance,
+      acroFormDefaultResources,
+      acroFormQ
+    } = this.currentDocument;
+    const daToFix = [];
+    const drToFix = [];
+    while (stack.length > 0) {
+      const data = stack.at(-1);
+      const {
+        kids,
+        newKids,
+        parent,
+        pos
+      } = data;
+      if (pos === kids.length) {
+        stack.pop();
+        if (newKids.length === 0 || !parent) {
+          continue;
+        }
+        const parentDict = this.xref[data.parentRef.num] = this.cloneDict(parent);
+        parentDict.delete("Parent");
+        parentDict.delete("Kids");
+        await this.#collectDependencies(parentDict, false, xref);
+        parentDict.set("Kids", newKids);
+        if (stack.length > 0) {
+          const lastData = stack.at(-1);
+          if (!lastData.parentRef && lastData.oldParentRef) {
+            const parentRef = lastData.parentRef = this.newRef;
+            parentDict.set("Parent", parentRef);
+            oldRefMapping.put(lastData.oldParentRef, parentRef);
+          }
+          lastData.newKids.push(data.parentRef);
+        }
+        continue;
+      }
+      const oldKidRef = kids[data.pos++];
+      if (!(oldKidRef instanceof Ref) || processed.has(oldKidRef)) {
+        continue;
+      }
+      processed.put(oldKidRef);
+      const kid = xref.fetchIfRef(oldKidRef);
+      if (kid.has("Kids")) {
+        const kidsArray = kid.get("Kids");
+        if (!Array.isArray(kidsArray)) {
+          continue;
+        }
+        stack.push({
+          kids: kidsArray,
+          newKids: [],
+          pos: 0,
+          oldParentRef: oldKidRef,
+          parentRef: null,
+          parent: kid
+        });
+        continue;
+      }
+      if (!fieldToParent.has(oldKidRef)) {
+        continue;
+      }
+      const newRef = oldRefMapping.get(oldKidRef);
+      if (!newRef) {
+        continue;
+      }
+      newKids.push(newRef);
+      if (!data.parentRef && data.oldParentRef) {
+        data.parentRef = this.newRef;
+        oldRefMapping.put(data.oldParentRef, data.parentRef);
+      }
+      const newKid = this.xref[newRef.num];
+      if (data.parentRef) {
+        newKid.set("Parent", data.parentRef);
+      }
+      if (acroFormDefaultAppearance && isName(newKid.get("FT"), "Tx") && !newKid.has("DA")) {
+        daToFix.push(newKid);
+      }
+      if (acroFormDefaultResources && !newKid.has("Kids") && newKid.get("AP") instanceof Dict) {
+        drToFix.push(newKid);
+      }
+      if (acroFormQ && !newKid.has("Q")) {
+        newKid.set("Q", acroFormQ);
+      }
+    }
+    for (const field of daToFix) {
+      const da = getInheritableProperty({
+        dict: field,
+        key: "DA"
+      });
+      if (!da) {
+        field.set("DA", acroFormDefaultAppearance);
+      }
+    }
+    const resourcesValuesCache = new Map();
+    for (const field of drToFix) {
+      const ap = field.get("AP");
+      for (const [, value] of ap) {
+        if (!(value instanceof BaseStream)) {
+          continue;
+        }
+        let resources = value.dict.getRaw("Resources");
+        if (!resources) {
+          const newResourcesRef = await resourcesValuesCache.getOrInsertComputed(acroFormDefaultResources, () => this.#cloneObject(acroFormDefaultResources, xref));
+          value.dict.set("Resources", newResourcesRef);
+          continue;
+        }
+        resources = xref.fetchIfRef(resources);
+        for (const [resKey, resValue] of acroFormDefaultResources.getRawEntries()) {
+          if (!resources.has(resKey)) {
+            let newResValue = resValue;
+            if (resValue instanceof Ref) {
+              newResValue = await this.#collectDependencies(resValue, true, xref);
+            } else if (resValue instanceof Dict || resValue instanceof BaseStream || Array.isArray(resValue)) {
+              newResValue = await resourcesValuesCache.getOrInsertComputed(resValue, () => this.#cloneObject(resValue, xref));
+            }
+            resources.set(resKey, newResValue);
+          }
+        }
+      }
+    }
+  }
+  async #collectPageLabels() {
+    if (!this.isSingleFile) {
+      return;
+    }
+    const firstRealPage = this.oldPages.find(p => !!p);
+    if (!firstRealPage) {
+      return;
+    }
+    const {
+      documentData: {
+        document,
+        pageLabels
+      }
+    } = firstRealPage;
+    if (!pageLabels) {
+      return;
+    }
+    const numPages = document.numPages;
+    const labelsByPageIndex = new Map();
+    const oldPageIndices = new Set(this.oldPages.filter(p => !!p).map(({
+      page: {
+        pageIndex
+      }
+    }) => pageIndex));
+    let currentLabel = null;
+    let stFirstIndex = -1;
+    for (let i = 0; i < numPages; i++) {
+      const newLabel = pageLabels.get(i);
+      if (newLabel) {
+        currentLabel = newLabel;
+        stFirstIndex = currentLabel.has("St") ? i : -1;
+      }
+      if (!oldPageIndices.has(i)) {
+        continue;
+      }
+      if (stFirstIndex !== -1) {
+        const st = currentLabel.get("St");
+        currentLabel = this.cloneDict(currentLabel);
+        currentLabel.set("St", st + (i - stFirstIndex));
+        stFirstIndex = -1;
+      }
+      labelsByPageIndex.set(i, currentLabel);
+    }
+    const defaultLabel = index => {
+      const label = new Dict();
+      label.setIfName("S", "D");
+      label.set("St", index + 1);
+      return label;
+    };
+    currentLabel = null;
+    const newPageLabels = this.pageLabels = [];
+    for (let i = 0, ii = this.oldPages.length; i < ii; i++) {
+      const pageData = this.oldPages[i];
+      const label = pageData ? labelsByPageIndex.get(pageData.page.pageIndex) || defaultLabel(i) : defaultLabel(i);
+      if (label === currentLabel) {
+        continue;
+      }
+      currentLabel = label;
+      newPageLabels.push([i, currentLabel]);
+    }
+  }
+  async #makePageCopy(pageIndex) {
+    const {
+      page,
+      documentData,
+      annotations,
+      pointingNamedDestinations
+    } = this.oldPages[pageIndex];
+    this.currentDocument = documentData;
+    const {
+      dedupNamedDestinations,
+      oldRefMapping
+    } = documentData;
+    const {
+      xref,
+      rotate,
+      mediaBox,
+      resources,
+      ref: oldPageRef
+    } = page;
+    const pageRef = this.newRef;
+    const pageDict = this.xref[pageRef.num] = this.cloneDict(page.pageDict);
+    oldRefMapping.put(oldPageRef, pageRef);
+    if (pointingNamedDestinations) {
+      for (const pointingDest of pointingNamedDestinations) {
+        const name = dedupNamedDestinations.get(pointingDest) || pointingDest;
+        const dest = this.namedDestinations.get(name);
+        dest[0] = pageRef;
+      }
+    }
+    for (const key of ["Rotate", "MediaBox", "CropBox", "BleedBox", "TrimBox", "ArtBox", "Resources", "Annots", "Parent", "UserUnit"]) {
+      pageDict.delete(key);
+    }
+    const lastRef = this.newRefCount;
+    await this.#collectDependencies(pageDict, false, xref);
+    pageDict.set("Rotate", rotate);
+    pageDict.set("MediaBox", mediaBox);
+    for (const boxName of ["CropBox", "BleedBox", "TrimBox", "ArtBox"]) {
+      const box = page.getBoundingBox(boxName);
+      if (box?.some((value, index) => value !== mediaBox[index])) {
+        pageDict.set(boxName, box);
+      }
+    }
+    const userUnit = page.userUnit;
+    if (userUnit !== 1) {
+      pageDict.set("UserUnit", userUnit);
+    }
+    pageDict.setIfDict("Resources", await this.#collectDependencies(resources, true, xref));
+    let newAnnots = null;
+    if (annotations) {
+      const newAnnotations = await this.#collectDependencies(annotations, true, xref);
+      this.#fixNamedDestinations(newAnnotations, dedupNamedDestinations);
+      if (Array.isArray(newAnnotations) && newAnnotations.length > 0) {
+        newAnnots = newAnnotations;
+      }
+    }
+    const newAnnotations = documentData.document === this.#primaryDocument ? this.#newAnnotationsParams?.newAnnotationsByPage?.get(page.pageIndex) : null;
+    if (newAnnotations) {
+      const {
+        handler,
+        task,
+        imagesPromises
+      } = this.#newAnnotationsParams;
+      const changes = new RefSetCache();
+      const newData = await AnnotationFactory.saveNewAnnotations(page.createAnnotationEvaluator(handler), this.xrefWrapper, task, newAnnotations, imagesPromises, changes);
+      for (const [ref, {
+        data
+      }] of changes.items()) {
+        this.xref[ref.num] = data;
+      }
+      newAnnots ||= [];
+      for (const {
+        ref
+      } of newData.annotations) {
+        newAnnots.push(ref);
+      }
+    }
+    pageDict.setIfArray("Annots", newAnnots);
+    if (this.useObjectStreams) {
+      const newLastRef = this.newRefCount;
+      const pageObjectRefs = [];
+      for (let i = lastRef; i < newLastRef; i++) {
+        const obj = this.xref[i];
+        if (obj instanceof BaseStream) {
+          continue;
+        }
+        pageObjectRefs.push(Ref.get(i, 0));
+      }
+      for (let i = 0; i < pageObjectRefs.length; i += 0xffff) {
+        const objStreamRef = this.newRef;
+        this.objStreamRefs.add(objStreamRef.num);
+        this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff);
+      }
+    }
+    this.currentDocument = null;
+    return pageRef;
+  }
+  #modalPageSize() {
+    const counts = new Map();
+    for (const pageData of this.oldPages) {
+      if (!pageData) {
+        continue;
+      }
+      const {
+        page
+      } = pageData;
+      const [x0, y0, x1, y1] = page.view;
+      let width = x1 - x0;
+      let height = y1 - y0;
+      if (width <= 0 || height <= 0) {
+        continue;
+      }
+      if (page.rotate % 180 !== 0) {
+        [width, height] = [height, width];
+      }
+      const key = `${width}x${height}`;
+      const entry = counts.get(key);
+      if (entry) {
+        entry.count++;
+      } else {
+        counts.set(key, {
+          width,
+          height,
+          count: 1
+        });
+      }
+    }
+    if (counts.size === 0) {
+      const [,, width, height] = LETTER_SIZE_MEDIABOX;
+      return {
+        width,
+        height
+      };
+    }
+    let best = null;
+    for (const entry of counts.values()) {
+      if (!best || entry.count > best.count || entry.count === best.count && entry.width * entry.height > best.width * best.height) {
+        best = entry;
+      }
+    }
+    return {
+      width: best.width,
+      height: best.height
+    };
+  }
+  async #makeImagePage(bitmap, pageSize) {
+    const {
+      width: pageW,
+      height: pageH
+    } = pageSize;
+    const DEFAULT_MARGIN_RATIO = 0.1;
+    const margin = pageW * DEFAULT_MARGIN_RATIO;
+    const availW = Math.max(1, pageW - 2 * margin);
+    const availH = Math.max(1, pageH - 2 * margin);
+    const lastRef = this.newRefCount;
+    const {
+      imageStream,
+      smaskStream,
+      width: imgW,
+      height: imgH
+    } = await createImage(bitmap, this.xrefWrapper, {
+      closeBitmap: true
+    });
+    const scale = Math.min(availW / imgW, availH / imgH);
+    const drawW = imgW * scale;
+    const drawH = imgH * scale;
+    const tx = (pageW - drawW) / 2;
+    const ty = (pageH - drawH) / 2;
+    if (smaskStream) {
+      const smaskRef = this.newRef;
+      this.xref[smaskRef.num] = smaskStream;
+      imageStream.dict.set("SMask", smaskRef);
+    }
+    const imageRef = this.newRef;
+    this.xref[imageRef.num] = imageStream;
+    const xobjectDict = new Dict(this.xrefWrapper);
+    xobjectDict.set("Im0", imageRef);
+    const resourcesDict = new Dict(this.xrefWrapper);
+    resourcesDict.set("XObject", xobjectDict);
+    resourcesDict.set("ProcSet", [Name.get("PDF"), Name.get("ImageC")]);
+    const content = `q ${numberToString(drawW)} 0 0 ${numberToString(drawH)} ` + `${numberToString(tx)} ${numberToString(ty)} cm /Im0 Do Q`;
+    const contentsStream = new StringStream(content, new Dict(this.xrefWrapper));
+    const contentsRef = this.newRef;
+    this.xref[contentsRef.num] = contentsStream;
+    const pageRef = this.newRef;
+    const pageDict = this.xref[pageRef.num] = new Dict(this.xrefWrapper);
+    pageDict.setIfName("Type", "Page");
+    pageDict.set("MediaBox", [0, 0, pageW, pageH]);
+    pageDict.set("Resources", resourcesDict);
+    pageDict.set("Contents", contentsRef);
+    if (this.useObjectStreams) {
+      const newLastRef = this.newRefCount;
+      const pageObjectRefs = [];
+      for (let i = lastRef; i < newLastRef; i++) {
+        const obj = this.xref[i];
+        if (obj instanceof BaseStream) {
+          continue;
+        }
+        pageObjectRefs.push(Ref.get(i, 0));
+      }
+      for (let i = 0; i < pageObjectRefs.length; i += 0xffff) {
+        const objStreamRef = this.newRef;
+        this.objStreamRefs.add(objStreamRef.num);
+        this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff);
+      }
+    }
+    return pageRef;
+  }
+  #makePageTree() {
+    const {
+      newPages: pages,
+      rootDict,
+      pagesRef,
+      pagesDict
+    } = this;
+    rootDict.set("Pages", pagesRef);
+    pagesDict.setIfName("Type", "Pages");
+    pagesDict.set("Count", pages.length);
+    const maxLeaves = MAX_LEAVES_PER_PAGES_NODE <= 1 ? pages.length : MAX_LEAVES_PER_PAGES_NODE;
+    const stack = [{
+      dict: pagesDict,
+      kids: pages,
+      parentRef: pagesRef
+    }];
+    while (stack.length > 0) {
+      const {
+        dict,
+        kids,
+        parentRef
+      } = stack.pop();
+      if (kids.length <= maxLeaves) {
+        dict.set("Kids", kids);
+        for (const ref of kids) {
+          this.xref[ref.num].set("Parent", parentRef);
+        }
+        continue;
+      }
+      const chunkSize = Math.max(maxLeaves, Math.ceil(kids.length / maxLeaves));
+      const kidsChunks = [];
+      for (let i = 0; i < kids.length; i += chunkSize) {
+        kidsChunks.push(kids.slice(i, i + chunkSize));
+      }
+      const kidsRefs = [];
+      dict.set("Kids", kidsRefs);
+      for (const chunk of kidsChunks) {
+        const [kidRef, kidDict] = this.newDict;
+        kidsRefs.push(kidRef);
+        kidDict.setIfName("Type", "Pages");
+        kidDict.set("Parent", parentRef);
+        kidDict.set("Count", chunk.length);
+        stack.push({
+          dict: kidDict,
+          kids: chunk,
+          parentRef: kidRef
+        });
+      }
+    }
+  }
+  #makeNameNumTree(map, areNames) {
+    const allEntries = map.sort(areNames ? ([keyA], [keyB]) => keyA.localeCompare(keyB) : ([keyA], [keyB]) => keyA - keyB);
+    const maxLeaves = MAX_IN_NAME_TREE_NODE <= 1 ? allEntries.length : MAX_IN_NAME_TREE_NODE;
+    const [treeRef, treeDict] = this.newDict;
+    const stack = [{
+      dict: treeDict,
+      entries: allEntries,
+      isRoot: true
+    }];
+    const valueType = areNames ? "Names" : "Nums";
+    while (stack.length > 0) {
+      const {
+        dict,
+        entries,
+        isRoot
+      } = stack.pop();
+      if (entries.length <= maxLeaves) {
+        if (!isRoot) {
+          dict.set("Limits", [entries[0][0], entries.at(-1)[0]]);
+        }
+        dict.set(valueType, entries.flat());
+        continue;
+      }
+      const entriesChunks = [];
+      const chunkSize = Math.max(maxLeaves, Math.ceil(entries.length / maxLeaves));
+      for (let i = 0; i < entries.length; i += chunkSize) {
+        entriesChunks.push(entries.slice(i, i + chunkSize));
+      }
+      const entriesRefs = [];
+      dict.set("Kids", entriesRefs);
+      for (const chunk of entriesChunks) {
+        const [entriesRef, entriesDict] = this.newDict;
+        entriesRefs.push(entriesRef);
+        entriesDict.set("Limits", [chunk[0][0], chunk.at(-1)[0]]);
+        stack.push({
+          dict: entriesDict,
+          entries: chunk
+        });
+      }
+    }
+    return treeRef;
+  }
+  #makePageLabelsTree() {
+    const {
+      pageLabels
+    } = this;
+    if (!pageLabels?.length) {
+      return;
+    }
+    const {
+      rootDict
+    } = this;
+    const pageLabelsRef = this.#makeNameNumTree(this.pageLabels, false);
+    rootDict.set("PageLabels", pageLabelsRef);
+  }
+  async #collectEmbeddedFiles(allDocumentData) {
+    const {
+      embeddedFiles
+    } = this;
+    for (const documentData of allDocumentData) {
+      const {
+        embeddedFiles: docEmbeddedFiles,
+        document: {
+          xref
+        }
+      } = documentData;
+      if (!docEmbeddedFiles?.size) {
+        continue;
+      }
+      this.currentDocument = documentData;
+      for (const [key, valueRef] of docEmbeddedFiles) {
+        let name = key;
+        if (embeddedFiles.has(name)) {
+          const displayName = stringToPDFString(key, true);
+          for (let i = 1;; i++) {
+            const deduped = `${displayName}_${i}`;
+            if (!embeddedFiles.has(deduped)) {
+              name = deduped;
+              break;
+            }
+          }
+        }
+        embeddedFiles.set(name, await this.#collectDependencies(valueRef, true, xref));
+      }
+      this.currentDocument = null;
+    }
+  }
+  #makeEmbeddedFilesTree() {
+    const {
+      embeddedFiles
+    } = this;
+    if (embeddedFiles.size === 0) {
+      return;
+    }
+    if (!this.namesDict) {
+      [this.namesRef, this.namesDict] = this.newDict;
+      this.rootDict.set("Names", this.namesRef);
+    }
+    this.namesDict.set("EmbeddedFiles", this.#makeNameNumTree(Array.from(embeddedFiles.entries()), true));
+  }
+  #makeDestinationsTree() {
+    const {
+      namedDestinations
+    } = this;
+    if (namedDestinations.size === 0) {
+      return;
+    }
+    if (!this.namesDict) {
+      [this.namesRef, this.namesDict] = this.newDict;
+      this.rootDict.set("Names", this.namesRef);
+    }
+    this.namesDict.set("Dests", this.#makeNameNumTree(Array.from(namedDestinations.entries()), true));
+  }
+  #makeStructTree() {
+    const {
+      structTreeKids
+    } = this;
+    if (!structTreeKids?.length) {
+      return;
+    }
+    const {
+      rootDict
+    } = this;
+    const structTreeRef = this.newRef;
+    const structTree = this.xref[structTreeRef.num] = new Dict();
+    structTree.setIfName("Type", "StructTreeRoot");
+    structTree.setIfArray("K", structTreeKids);
+    for (const kidRef of structTreeKids) {
+      const kid = this.xref[kidRef.num];
+      const type = kid.get("Type");
+      if (!type || isName(type, "StructElem")) {
+        kid.set("P", structTreeRef);
+      }
+    }
+    if (this.parentTree.size > 0) {
+      const parentTreeRef = this.#makeNameNumTree(Array.from(this.parentTree.entries()), false);
+      const parentTree = this.xref[parentTreeRef.num];
+      parentTree.setIfName("Type", "ParentTree");
+      structTree.set("ParentTree", parentTreeRef);
+      structTree.set("ParentTreeNextKey", this.parentTree.size);
+    }
+    if (this.idTree.size > 0) {
+      const idTreeRef = this.#makeNameNumTree(Array.from(this.idTree.entries()), true);
+      const idTree = this.xref[idTreeRef.num];
+      idTree.setIfName("Type", "IDTree");
+      structTree.set("IDTree", idTreeRef);
+    }
+    if (this.classMap.size > 0) {
+      const classMapRef = this.newRef;
+      this.xref[classMapRef.num] = this.classMap;
+      structTree.set("ClassMap", classMapRef);
+    }
+    if (this.roleMap.size > 0) {
+      const roleMapRef = this.newRef;
+      this.xref[roleMapRef.num] = this.roleMap;
+      structTree.set("RoleMap", roleMapRef);
+    }
+    if (this.namespaces.size > 0) {
+      const namespacesRef = this.newRef;
+      this.xref[namespacesRef.num] = Array.from(this.namespaces.values());
+      structTree.set("Namespaces", namespacesRef);
+    }
+    if (this.structTreeAF.length > 0) {
+      const structTreeAFRef = this.newRef;
+      this.xref[structTreeAFRef.num] = this.structTreeAF;
+      structTree.set("AF", structTreeAFRef);
+    }
+    if (this.structTreePronunciationLexicon.length > 0) {
+      const structTreePronunciationLexiconRef = this.newRef;
+      this.xref[structTreePronunciationLexiconRef.num] = this.structTreePronunciationLexicon;
+      structTree.set("PronunciationLexicon", structTreePronunciationLexiconRef);
+    }
+    rootDict.set("StructTreeRoot", structTreeRef);
+  }
+  #makeAcroForm() {
+    if (this.fields.length === 0) {
+      return;
+    }
+    const {
+      rootDict
+    } = this;
+    const acroFormRef = this.newRef;
+    const acroForm = this.xref[acroFormRef.num] = new Dict();
+    rootDict.set("AcroForm", acroFormRef);
+    acroForm.set("Fields", this.fields);
+    if (this.acroFormNeedAppearances) {
+      acroForm.set("NeedAppearances", true);
+    }
+    if (this.acroFormSigFlags > 0) {
+      acroForm.set("SigFlags", this.acroFormSigFlags);
+    }
+    acroForm.setIfArray("CO", this.acroFormCalculationOrder);
+    acroForm.setIfDict("DR", this.acroFormDefaultResources);
+    if (this.acroFormDefaultAppearance) {
+      acroForm.set("DA", this.acroFormDefaultAppearance);
+    }
+    if (this.acroFormQ > 0) {
+      acroForm.set("Q", this.acroFormQ);
+    }
+  }
+  async #makeRoot() {
+    const {
+      rootDict
+    } = this;
+    rootDict.setIfName("Type", "Catalog");
+    rootDict.setIfName("Version", this.version);
+    this.#makeAcroForm();
+    this.#makePageTree();
+    this.#makePageLabelsTree();
+    this.#makeEmbeddedFilesTree();
+    this.#makeDestinationsTree();
+    this.#makeStructTree();
+    await this.#makeOutline();
+  }
+  #makeInfo() {
+    const infoMap = new Map();
+    if (this.isSingleFile) {
+      const firstRealPage = this.oldPages.find(p => !!p);
+      const {
+        xref: {
+          trailer
+        }
+      } = firstRealPage.documentData.document;
+      const oldInfoDict = trailer.get("Info");
+      for (const [key, value] of oldInfoDict || []) {
+        if (typeof value === "string") {
+          infoMap.set(key, stringToPDFString(value));
+        }
+      }
+    }
+    infoMap.delete("ModDate");
+    infoMap.set("CreationDate", getModificationDate());
+    infoMap.set("Creator", "PDF.js");
+    infoMap.set("Producer", "Firefox");
+    if (this.author) {
+      infoMap.set("Author", this.author);
+    }
+    if (this.title) {
+      infoMap.set("Title", this.title);
+    }
+    for (const [key, value] of infoMap) {
+      this.infoDict.set(key, stringToAsciiOrUTF16BE(value));
+    }
+    return infoMap;
+  }
+  async #makeEncrypt() {
+    if (!this.isSingleFile) {
+      return [null, null, null];
+    }
+    const firstRealPage = this.oldPages.find(p => !!p);
+    const {
+      documentData
+    } = firstRealPage;
+    const {
+      document: {
+        xref: {
+          trailer,
+          encrypt
+        }
+      }
+    } = documentData;
+    if (!trailer.has("Encrypt")) {
+      return [null, null, null];
+    }
+    const encryptDict = trailer.get("Encrypt");
+    if (!(encryptDict instanceof Dict)) {
+      return [null, null, null];
+    }
+    this.currentDocument = documentData;
+    const result = [await this.#cloneObject(encryptDict, trailer.xref), encrypt, trailer.get("ID")];
+    this.currentDocument = null;
+    return result;
+  }
+  async #createChanges() {
+    const changes = new RefSetCache();
+    changes.put(Ref.get(0, 0xffff), {
+      data: null
+    });
+    for (let i = 1, ii = this.xref.length; i < ii; i++) {
+      if (this.objStreamRefs?.has(i)) {
+        await this.#createObjectStream(Ref.get(i, 0), this.xref[i], changes);
+      } else {
+        changes.put(Ref.get(i, 0), {
+          data: this.xref[i]
+        });
+      }
+    }
+    return [changes, this.newRef];
+  }
+  async #createObjectStream(objStreamRef, objRefs, changes) {
+    const streamBuffer = [""];
+    const objOffsets = [];
+    let offset = 0;
+    const buffer = [];
+    for (let i = 0, ii = objRefs.length; i < ii; i++) {
+      const objRef = objRefs[i];
+      changes.put(objRef, {
+        data: null,
+        objStreamRef,
+        index: i
+      });
+      objOffsets.push(`${objRef.num} ${offset}`);
+      const data = this.xref[objRef.num];
+      await writeValue(data, buffer, null);
+      const obj = buffer.join("");
+      buffer.length = 0;
+      streamBuffer.push(obj);
+      offset += obj.length + 1;
+    }
+    streamBuffer[0] = objOffsets.join("\n");
+    const dict = new Dict();
+    dict.setIfName("Type", "ObjStm");
+    dict.set("N", objRefs.length);
+    dict.set("First", streamBuffer[0].length + 1);
+    const objStream = new StringStream(streamBuffer.join("\n"), dict);
+    changes.put(objStreamRef, {
+      data: objStream
+    });
+  }
+  async writePDF() {
+    await this.#makeRoot();
+    const infoMap = this.#makeInfo();
+    const [encryptRef, encrypt, fileIds] = await this.#makeEncrypt();
+    const [changes, xrefTableRef] = await this.#createChanges();
+    const header = stringToBytes(`%PDF-${this.version}\n%\xfa\xde\xfa\xce`);
+    return incrementalUpdate({
+      originalData: header,
+      changes,
+      xrefInfo: {
+        startXRef: null,
+        rootRef: this.rootRef,
+        infoRef: this.infoRef,
+        encryptRef,
+        newRef: xrefTableRef,
+        fileIds: fileIds || [null, null],
+        infoMap
+      },
+      useXrefStream: this.useObjectStreams,
+      xref: {
+        encrypt,
+        encryptRef
+      }
+    });
+  }
+}
+
+;// ./src/shared/base_pdf_stream.js
+
+class BasePDFStream {
+  #PDFStreamReader = null;
+  #PDFStreamRangeReader = null;
+  _fullReader = null;
+  _rangeReaders = new Set();
+  _source = null;
+  constructor(source, PDFStreamReader, PDFStreamRangeReader) {
+    this._source = source;
+    this.#PDFStreamReader = PDFStreamReader;
+    this.#PDFStreamRangeReader = PDFStreamRangeReader;
+  }
+  get _progressiveDataLength() {
+    return this._fullReader?._loaded ?? 0;
+  }
+  getFullReader() {
+    assert(!this._fullReader, "BasePDFStream.getFullReader can only be called once.");
+    return this._fullReader = new this.#PDFStreamReader(this);
+  }
+  getRangeReader(begin, end) {
+    if (end <= this._progressiveDataLength) {
+      return null;
+    }
+    const reader = new this.#PDFStreamRangeReader(this, begin, end);
+    this._rangeReaders.add(reader);
+    return reader;
+  }
+  cancelAllRequests(reason) {
+    this._fullReader?.cancel(reason);
+    for (const reader of new Set(this._rangeReaders)) {
+      reader.cancel(reason);
+    }
+  }
+}
+class BasePDFStreamReader {
+  onProgress = null;
+  _contentLength = 0;
+  _filename = null;
+  _headersCapability = Promise.withResolvers();
+  _isRangeSupported = false;
+  _isStreamingSupported = false;
+  _loaded = 0;
+  _stream = null;
+  constructor(stream) {
+    this._stream = stream;
+  }
+  _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(reason) {
+    unreachable("Abstract method `cancel` called");
+  }
+}
+class BasePDFStreamRangeReader {
+  _stream = null;
+  constructor(stream, begin, end) {
+    this._stream = stream;
+  }
+  async read() {
+    unreachable("Abstract method `read` called");
+  }
+  cancel(reason) {
+    unreachable("Abstract method `cancel` called");
+  }
+}
+
+;// ./src/core/worker_stream.js
+
+class PDFWorkerStream extends BasePDFStream {
+  constructor(source) {
+    super(source, PDFWorkerStreamReader, PDFWorkerStreamRangeReader);
+  }
+}
+class PDFWorkerStreamReader extends BasePDFStreamReader {
+  _reader = null;
+  constructor(stream) {
+    super(stream);
+    const {
+      msgHandler
+    } = stream._source;
+    const readableStream = msgHandler.sendWithStream("GetReader");
+    this._reader = readableStream.getReader();
+    msgHandler.sendWithPromise("ReaderHeadersReady").then(data => {
+      this._contentLength = data.contentLength;
+      this._isStreamingSupported = data.isStreamingSupported;
+      this._isRangeSupported = data.isRangeSupported;
+      this._headersCapability.resolve();
+    }, this._headersCapability.reject);
+  }
+  async read() {
+    const {
+      value,
+      done
+    } = await this._reader.read();
+    if (done) {
+      return {
+        value: undefined,
+        done: true
+      };
+    }
+    return {
+      value: value.buffer,
+      done: false
+    };
+  }
+  cancel(reason) {
+    this._reader.cancel(reason);
+  }
+}
+class PDFWorkerStreamRangeReader extends BasePDFStreamRangeReader {
+  _reader = null;
+  constructor(stream, begin, end) {
+    super(stream, begin, end);
+    const {
+      msgHandler
+    } = stream._source;
+    const readableStream = msgHandler.sendWithStream("GetRangeReader", {
+      begin,
+      end
+    });
+    this._reader = readableStream.getReader();
+  }
+  async read() {
+    const {
+      value,
+      done
+    } = await this._reader.read();
+    if (done) {
+      return {
+        value: undefined,
+        done: true
+      };
+    }
+    return {
+      value: value.buffer,
+      done: false
+    };
+  }
+  cancel(reason) {
+    this._reader.cancel(reason);
+  }
+}
+
+;// ./src/core/worker.js
+
+
+
+
+
+
+
+
+
+
+
+
+class WorkerTask {
+  constructor(name) {
+    this.name = name;
+    this.terminated = false;
+    this._capability = Promise.withResolvers();
+  }
+  get finished() {
+    return this._capability.promise;
+  }
+  finish() {
+    this._capability.resolve();
+  }
+  terminate() {
+    this.terminated = true;
+  }
+  ensureNotTerminated() {
+    if (this.terminated) {
+      throw new Error("Worker task was terminated");
+    }
+  }
+}
+class WorkerMessageHandler {
+  static {
+    if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && typeof self.postMessage === "function" && "onmessage" in self) {
+      this.initializeFromPort(self);
+    }
+  }
+  static setup(handler, port) {
+    let testMessageProcessed = false;
+    handler.on("test", data => {
+      if (testMessageProcessed) {
+        return;
+      }
+      testMessageProcessed = true;
+      handler.send("test", data instanceof Uint8Array);
+    });
+    handler.on("configure", data => {
+      setVerbosityLevel(data.verbosity);
+    });
+    handler.on("GetDocRequest", data => this.createDocumentHandler(data, port));
+  }
+  static createDocumentHandler(docParams, port) {
+    let pdfManager;
+    let terminated = false;
+    let cancelXHRs = null;
+    const WorkerTasks = new Set();
+    const verbosity = getVerbosityLevel();
+    const {
+      docId,
+      apiVersion
+    } = docParams;
+    const workerVersion = "6.1.200";
+    if (apiVersion !== workerVersion) {
+      throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`);
+    }
+    const buildMsg = (type, prop) => `The \`${type}.prototype\` contains unexpected enumerable property ` + `"${prop}", thus breaking e.g. \`for...in\` iteration of ${type}s.`;
+    for (const prop in {}) {
+      throw new Error(buildMsg("Object", prop));
+    }
+    for (const prop in []) {
+      throw new Error(buildMsg("Array", prop));
+    }
+    const workerHandlerName = docId + "_worker";
+    let handler = new MessageHandler(workerHandlerName, docId, port);
+    function ensureNotTerminated() {
+      if (terminated) {
+        throw new Error("Worker was terminated");
+      }
+    }
+    function startWorkerTask(task) {
+      WorkerTasks.add(task);
+    }
+    function finishWorkerTask(task) {
+      task.finish();
+      WorkerTasks.delete(task);
+    }
+    async function loadDocument(recoveryMode) {
+      await pdfManager.initDocument(recoveryMode);
+      const isPureXfa = await pdfManager.ensureDoc("isPureXfa");
+      if (isPureXfa) {
+        const task = new WorkerTask("loadXfaResources");
+        startWorkerTask(task);
+        await pdfManager.ensureDoc("loadXfaResources", [handler, task]);
+        finishWorkerTask(task);
+      }
+      const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]);
+      const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null;
+      return {
+        numPages,
+        fingerprints,
+        htmlForXfa
+      };
+    }
+    async function getPdfManager({
+      data,
+      password,
+      disableAutoFetch,
+      rangeChunkSize,
+      docBaseUrl,
+      enableXfa,
+      evaluatorOptions
+    }) {
+      const pdfManagerArgs = {
+        source: null,
+        disableAutoFetch,
+        docBaseUrl,
+        docId,
+        enableXfa,
+        evaluatorOptions,
+        handler,
+        length: 0,
+        password,
+        rangeChunkSize
+      };
+      if (data) {
+        pdfManagerArgs.source = data;
+        return new LocalPdfManager(pdfManagerArgs);
+      }
+      const pdfStream = new PDFWorkerStream({
+          msgHandler: handler
+        }),
+        fullReader = pdfStream.getFullReader();
+      const {
+        promise,
+        resolve,
+        reject
+      } = Promise.withResolvers();
+      let newPdfManager,
+        cachedChunks = [];
+      cancelXHRs = reason => pdfStream.cancelAllRequests(reason);
+      fullReader.headersReady.then(() => {
+        if (!fullReader.isRangeSupported) {
+          return;
+        }
+        pdfManagerArgs.source = pdfStream;
+        pdfManagerArgs.length = fullReader.contentLength;
+        pdfManagerArgs.disableAutoFetch ||= fullReader.isStreamingSupported;
+        newPdfManager = new NetworkPdfManager(pdfManagerArgs);
+        for (const chunk of cachedChunks) {
+          newPdfManager.sendProgressiveData(chunk);
+        }
+        cachedChunks = null;
+        resolve(newPdfManager);
+        cancelXHRs = null;
+      }).catch(reason => {
+        reject(reason);
+        cancelXHRs = null;
+      });
+      async function readData() {
+        let loaded = 0;
+        while (true) {
+          const {
+            value,
+            done
+          } = await fullReader.read();
+          ensureNotTerminated();
+          if (done) {
+            break;
+          }
+          loaded += value.byteLength;
+          if (!fullReader.isStreamingSupported) {
+            handler.send("DocProgress", {
+              loaded,
+              total: fullReader.contentLength
+            });
+          }
+          if (newPdfManager) {
+            newPdfManager.sendProgressiveData(value);
+          } else {
+            cachedChunks.push(value);
+          }
+        }
+        if (!newPdfManager) {
+          pdfManagerArgs.source = arrayBuffersToBytes(cachedChunks);
+          cachedChunks = null;
+          newPdfManager = new LocalPdfManager(pdfManagerArgs);
+          resolve(newPdfManager);
+        }
+        cancelXHRs = null;
+      }
+      readData().catch(reason => {
+        reject(reason);
+        cancelXHRs = null;
+      });
+      return promise;
+    }
+    async function getPassword(ex) {
+      const task = new WorkerTask(`PasswordException: response ${ex.code}`);
+      startWorkerTask(task);
+      try {
+        const res = await handler.sendWithPromise("PasswordRequest", ex);
+        return res.password;
+      } finally {
+        Promise.resolve().then(() => {
+          finishWorkerTask(task);
+        });
+      }
+    }
+    function setupDoc(data) {
+      function onSuccess(doc) {
+        ensureNotTerminated();
+        handler.send("GetDoc", {
+          pdfInfo: doc
+        });
+      }
+      function onFailure(ex) {
+        if (terminated) {
+          return;
+        }
+        if (ex instanceof PasswordException) {
+          getPassword(ex).then(password => {
+            pdfManager.updatePassword(password);
+            pdfManagerReady();
+          }).catch(() => {
+            handler.send("DocException", ex);
+          });
+        } else {
+          handler.send("DocException", wrapReason(ex));
+        }
+      }
+      function pdfManagerReady() {
+        ensureNotTerminated();
+        loadDocument(false).then(onSuccess, function (reason) {
+          ensureNotTerminated();
+          if (!(reason instanceof XRefParseException)) {
+            onFailure(reason);
+            return;
+          }
+          pdfManager.requestLoadedStream().then(function () {
+            ensureNotTerminated();
+            loadDocument(true).then(onSuccess, onFailure);
+          }, onFailure);
+        });
+      }
+      ensureNotTerminated();
+      getPdfManager(data).then(function (newPdfManager) {
+        if (terminated) {
+          newPdfManager.terminate(new AbortException("Worker was terminated."));
+          throw new Error("Worker was terminated");
+        }
+        pdfManager = newPdfManager;
+        pdfManager.requestLoadedStream(true).then(stream => {
+          handler.send("DataLoaded", {
+            length: stream.bytes.byteLength
+          });
+        }, () => {});
+      }).then(pdfManagerReady, onFailure);
+    }
+    handler.on("GetPage", function (data) {
+      return pdfManager.getPage(data.pageIndex).then(function (page) {
+        return Promise.all([pdfManager.ensure(page, "rotate"), pdfManager.ensure(page, "ref"), pdfManager.ensure(page, "userUnit"), pdfManager.ensure(page, "view")]).then(function ([rotate, ref, userUnit, view]) {
+          return {
+            rotate,
+            ref,
+            refStr: ref?.toString() ?? null,
+            userUnit,
+            view
+          };
+        });
+      });
+    });
+    handler.on("GetPageIndex", function (data) {
+      const pageRef = Ref.get(data.num, data.gen);
+      return pdfManager.ensureCatalog("getPageIndex", [pageRef]);
+    });
+    handler.on("GetDestinations", function (data) {
+      return pdfManager.ensureCatalog("destinations");
+    });
+    handler.on("GetDestination", function (data) {
+      return pdfManager.ensureCatalog("getDestination", [data.id]);
+    });
+    handler.on("GetPageLabels", function (data) {
+      return pdfManager.ensureCatalog("pageLabels");
+    });
+    handler.on("GetPageLayout", function (data) {
+      return pdfManager.ensureCatalog("pageLayout");
+    });
+    handler.on("GetPageMode", function (data) {
+      return pdfManager.ensureCatalog("pageMode");
+    });
+    handler.on("GetViewerPreferences", function (data) {
+      return pdfManager.ensureCatalog("viewerPreferences");
+    });
+    handler.on("GetOpenAction", function (data) {
+      return pdfManager.ensureCatalog("openAction");
+    });
+    handler.on("GetAttachments", function (data) {
+      return pdfManager.ensureCatalog("attachments");
+    });
+    handler.on("GetAttachmentContent", async function (id) {
+      let passwordEx;
+      while (true) {
+        const password = passwordEx ? await getPassword(passwordEx) : null;
+        try {
+          if (password) {
+            pdfManager.updatePassword(password);
+          }
+          return await pdfManager.ensureCatalog("attachmentContent", [id]);
+        } catch (ex) {
+          if (ex instanceof PasswordException) {
+            passwordEx = ex;
+            continue;
+          }
+          throw ex;
+        }
+      }
+    });
+    handler.on("GetDocJSActions", function (data) {
+      return pdfManager.ensureCatalog("jsActions");
+    });
+    handler.on("GetPageJSActions", function ({
+      pageIndex
+    }) {
+      return pdfManager.getPage(pageIndex).then(page => pdfManager.ensure(page, "jsActions"));
+    });
+    handler.on("GetAnnotationsByType", async function ({
+      types,
+      pageIndexesToSkip
+    }) {
+      const [numPages, annotationGlobals] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("annotationGlobals")]);
+      if (!annotationGlobals) {
+        return null;
+      }
+      const pagePromises = [];
+      const annotationPromises = [];
+      let task = null;
+      try {
+        for (let i = 0, ii = numPages; i < ii; i++) {
+          if (pageIndexesToSkip?.has(i)) {
+            continue;
+          }
+          if (!task) {
+            task = new WorkerTask("GetAnnotationsByType");
+            startWorkerTask(task);
+          }
+          pagePromises.push(pdfManager.getPage(i).then(page => page.collectAnnotationsByType(handler, task, types, annotationPromises, annotationGlobals)));
+        }
+        await Promise.all(pagePromises);
+        const annotations = await Promise.all(annotationPromises);
+        return annotations.filter(a => !!a);
+      } finally {
+        if (task) {
+          finishWorkerTask(task);
+        }
+      }
+    });
+    handler.on("GetOutline", function (data) {
+      return pdfManager.ensureCatalog("documentOutline");
+    });
+    handler.on("GetOptionalContentConfig", function (data) {
+      return pdfManager.ensureCatalog("optionalContentConfig");
+    });
+    handler.on("GetPermissions", function (data) {
+      return pdfManager.ensureCatalog("permissions");
+    });
+    handler.on("GetMetadata", function (data) {
+      return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata"), pdfManager.ensureCatalog("hasStructTree")]);
+    });
+    handler.on("GetMarkInfo", function (data) {
+      return pdfManager.ensureCatalog("markInfo");
+    });
+    handler.on("GetData", function (data) {
+      return pdfManager.requestLoadedStream().then(stream => stream.bytes);
+    });
+    handler.on("GetAnnotations", function ({
+      pageIndex,
+      intent
+    }) {
+      return pdfManager.getPage(pageIndex).then(function (page) {
+        const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`);
+        startWorkerTask(task);
+        return page.getAnnotationsData(handler, task, intent).finally(() => {
+          finishWorkerTask(task);
+        });
+      });
+    });
+    handler.on("GetFieldObjects", function (data) {
+      return pdfManager.ensureDoc("fieldObjects").then(fieldObjects => fieldObjects?.allFields || null);
+    });
+    handler.on("HasJSActions", function (data) {
+      return pdfManager.ensureDoc("hasJSActions");
+    });
+    handler.on("GetCalculationOrderIds", function (data) {
+      return pdfManager.ensureDoc("calculationOrderIds");
+    });
+    handler.on("ExtractPages", async function ({
+      pageInfos,
+      annotationStorage
+    }) {
+      if (!pageInfos) {
+        warn("extractPages: nothing to extract.");
+        return null;
+      }
+      if (!Array.isArray(pageInfos)) {
+        pageInfos = [pageInfos];
+      }
+      let newDocumentId = 0;
+      for (const pageInfo of pageInfos) {
+        if (pageInfo.image) {
+          continue;
+        }
+        if (pageInfo.document === null) {
+          pageInfo.document = pdfManager.pdfDocument;
+        } else if (ArrayBuffer.isView(pageInfo.document)) {
+          const manager = new LocalPdfManager({
+            source: pageInfo.document,
+            docId: `${docId}_extractPages_${newDocumentId++}`,
+            handler,
+            password: pageInfo.password ?? null,
+            evaluatorOptions: Object.assign({}, pdfManager.evaluatorOptions)
+          });
+          let recoveryMode = false;
+          let isValid = true;
+          while (true) {
+            try {
+              await manager.requestLoadedStream();
+              await manager.initDocument(recoveryMode);
+              break;
+            } catch (e) {
+              if (e instanceof XRefParseException) {
+                if (recoveryMode === false) {
+                  recoveryMode = true;
+                  continue;
+                } else {
+                  isValid = false;
+                  warn("extractPages: XRefParseException.");
+                }
+              } else if (e instanceof PasswordException) {
+                try {
+                  const password = await getPassword(e);
+                  manager.updatePassword(password);
+                } catch {
+                  isValid = false;
+                  warn("extractPages: invalid password.");
+                }
+              } else {
+                isValid = false;
+                warn("extractPages: invalid document.");
+              }
+              if (!isValid) {
+                break;
+              }
+            }
+          }
+          if (!isValid) {
+            pageInfo.document = null;
+          }
+          const isPureXfa = await manager.ensureDoc("isPureXfa");
+          if (isPureXfa) {
+            pageInfo.document = null;
+            warn("extractPages does not support pure XFA documents.");
+          } else {
+            pageInfo.document = manager.pdfDocument;
+          }
+        } else {
+          warn("extractPages: invalid document.");
+        }
+      }
+      let task;
+      try {
+        const pdfEditor = new PDFEditor();
+        task = new WorkerTask(`ExtractPages: ${pageInfos.length} page(s)`);
+        startWorkerTask(task);
+        const buffer = await pdfEditor.extractPages(pageInfos, annotationStorage, pdfManager.pdfDocument, handler, task);
+        return buffer;
+      } catch (reason) {
+        warn(`extractPages: "${reason}".`);
+        return null;
+      } finally {
+        if (task) {
+          finishWorkerTask(task);
+        }
+      }
+    });
+    handler.on("SaveDocument", async function ({
+      isPureXfa,
+      numPages,
+      annotationStorage,
+      filename
+    }) {
+      const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureCatalog("structTreeRoot")];
+      const changes = new RefSetCache();
+      const promises = [];
+      const newAnnotationsByPage = !isPureXfa ? getNewAnnotationsMap(annotationStorage) : null;
+      const [stream, acroForm, acroFormRef, startXRef, xref, _structTreeRoot] = await Promise.all(globalPromises);
+      const catalogRef = xref.trailer.getRaw("Root") || null;
+      let structTreeRoot;
+      if (newAnnotationsByPage) {
+        if (!_structTreeRoot) {
+          if (await StructTreeRoot.canCreateStructureTree({
+            catalogRef,
+            pdfManager,
+            newAnnotationsByPage
+          })) {
+            structTreeRoot = null;
+          }
+        } else if (await _structTreeRoot.canUpdateStructTree({
+          pdfManager,
+          newAnnotationsByPage
+        })) {
+          structTreeRoot = _structTreeRoot;
+        }
+        const imagePromises = AnnotationFactory.generateImages(annotationStorage.values(), xref, pdfManager.evaluatorOptions.isOffscreenCanvasSupported);
+        const newAnnotationPromises = structTreeRoot === undefined ? promises : [];
+        for (const [pageIndex, annotations] of newAnnotationsByPage) {
+          newAnnotationPromises.push(pdfManager.getPage(pageIndex).then(page => {
+            const task = new WorkerTask(`Save (editor): page ${pageIndex}`);
+            startWorkerTask(task);
+            return page.saveNewAnnotations(handler, task, annotations, imagePromises, changes).finally(() => {
+              finishWorkerTask(task);
+            });
+          }));
+        }
+        if (structTreeRoot === null) {
+          promises.push(Promise.all(newAnnotationPromises).then(async () => {
+            await StructTreeRoot.createStructureTree({
+              newAnnotationsByPage,
+              xref,
+              catalogRef,
+              pdfManager,
+              changes
+            });
+          }));
+        } else if (structTreeRoot) {
+          promises.push(Promise.all(newAnnotationPromises).then(async () => {
+            await structTreeRoot.updateStructureTree({
+              newAnnotationsByPage,
+              pdfManager,
+              changes
+            });
+          }));
+        }
+      }
+      if (isPureXfa) {
+        promises.push(pdfManager.ensureDoc("serializeXfaData", [annotationStorage]));
+      } else {
+        for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {
+          promises.push(pdfManager.getPage(pageIndex).then(function (page) {
+            const task = new WorkerTask(`Save: page ${pageIndex}`);
+            startWorkerTask(task);
+            return page.save(handler, task, annotationStorage, changes).finally(() => {
+              finishWorkerTask(task);
+            });
+          }));
+        }
+      }
+      const refs = await Promise.all(promises);
+      let xfaData = null;
+      if (isPureXfa) {
+        xfaData = refs[0];
+        if (!xfaData) {
+          return stream.bytes;
+        }
+      } else if (changes.size === 0) {
+        return stream.bytes;
+      }
+      const needAppearances = acroFormRef && acroForm instanceof Dict && changes.values().some(ref => ref.needAppearances);
+      const xfa = acroForm instanceof Dict && acroForm.get("XFA") || null;
+      let xfaDatasetsRef = null;
+      let hasXfaDatasetsEntry = false;
+      if (Array.isArray(xfa)) {
+        for (let i = 0, ii = xfa.length; i < ii; i += 2) {
+          if (xfa[i] === "datasets") {
+            xfaDatasetsRef = xfa[i + 1];
+            hasXfaDatasetsEntry = true;
+          }
+        }
+        if (xfaDatasetsRef === null) {
+          xfaDatasetsRef = xref.getNewTemporaryRef();
+        }
+      } else if (xfa) {
+        warn("Unsupported XFA type.");
+      }
+      let newXrefInfo = Object.create(null);
+      if (xref.trailer) {
+        const infoMap = new Map();
+        const xrefInfo = xref.trailer.get("Info") || null;
+        if (xrefInfo instanceof Dict) {
+          for (const [key, value] of xrefInfo) {
+            if (typeof value === "string") {
+              infoMap.set(key, stringToPDFString(value));
+            }
+          }
+        }
+        newXrefInfo = {
+          rootRef: catalogRef,
+          encryptRef: xref.trailer.getRaw("Encrypt") || null,
+          newRef: xref.getNewTemporaryRef(),
+          infoRef: xref.trailer.getRaw("Info") || null,
+          infoMap,
+          fileIds: xref.trailer.get("ID") || null,
+          startXRef,
+          filename
+        };
+      }
+      return incrementalUpdate({
+        originalData: stream.bytes,
+        xrefInfo: newXrefInfo,
+        changes,
+        xref,
+        hasXfa: !!xfa,
+        xfaDatasetsRef,
+        hasXfaDatasetsEntry,
+        needAppearances,
+        acroFormRef,
+        acroForm,
+        xfaData,
+        useXrefStream: isDict(xref.topDict, "XRef")
+      }).finally(() => {
+        xref.resetNewTemporaryRef();
+      });
+    });
+    handler.on("GetOperatorList", function (data, sink) {
+      const {
+        pageId,
+        pageIndex
+      } = data;
+      pdfManager.getPage(pageId).then(function (page) {
+        const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`);
+        startWorkerTask(task);
+        const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0;
+        page.getOperatorList({
+          handler,
+          sink,
+          task,
+          intent: data.intent,
+          cacheKey: data.cacheKey,
+          annotationStorage: data.annotationStorage,
+          modifiedIds: data.modifiedIds,
+          pageIndex
+        }).then(operatorListInfo => {
+          if (start) {
+            info(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`);
+          }
+          sink.close();
+        }, reason => {
+          if (task.terminated) {
+            return;
+          }
+          sink.error(reason);
+        }).finally(() => {
+          finishWorkerTask(task);
+        });
+      });
+    });
+    handler.on("GetTextContent", function (data, sink) {
+      const {
+        pageId,
+        pageIndex,
+        includeMarkedContent,
+        disableNormalization
+      } = data;
+      pdfManager.getPage(pageId).then(function (page) {
+        const task = new WorkerTask("GetTextContent: page " + pageIndex);
+        startWorkerTask(task);
+        const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0;
+        page.extractTextContent({
+          handler,
+          task,
+          sink,
+          includeMarkedContent,
+          disableNormalization
+        }).then(() => {
+          if (start) {
+            info(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}ms`);
+          }
+          sink.close();
+        }, reason => {
+          if (task.terminated) {
+            return;
+          }
+          sink.error(reason);
+        }).finally(() => {
+          finishWorkerTask(task);
+        });
+      });
+    });
+    handler.on("GetStructTree", function (data) {
+      return pdfManager.getPage(data.pageIndex).then(page => pdfManager.ensure(page, "getStructTree"));
+    });
+    handler.on("FontFallback", function (data) {
+      return pdfManager.fontFallback(data.id, handler);
+    });
+    handler.on("Cleanup", function (data) {
+      return pdfManager.cleanup(true);
+    });
+    handler.on("Terminate", async function (data) {
+      terminated = true;
+      const waitOn = [];
+      if (pdfManager) {
+        pdfManager.terminate(new AbortException("Worker was terminated."));
+        const cleanupPromise = pdfManager.cleanup();
+        waitOn.push(cleanupPromise);
+        pdfManager = null;
+      } else {
+        clearGlobalCaches();
+      }
+      cancelXHRs?.(new AbortException("Worker was terminated."));
+      for (const task of WorkerTasks) {
+        waitOn.push(task.finished);
+        task.terminate();
+      }
+      await Promise.all(waitOn);
+      handler.destroy();
+      handler = null;
+    });
+    handler.on("Ready", function (data) {
+      setupDoc(docParams);
+      docParams = null;
+    });
+    return workerHandlerName;
+  }
+  static initializeFromPort(port) {
+    const handler = new MessageHandler("worker", "main", port);
+    this.setup(handler, port);
+    handler.send("ready", null);
+  }
+}
+
+;// ./src/pdf.worker.js
+
+globalThis.pdfjsWorker = {
+  WorkerMessageHandler: WorkerMessageHandler
+};
+
+export { WorkerMessageHandler };
+
+//# sourceMappingURL=pdf.worker.mjs.map
\ No newline at end of file
diff --git a/public/pdfjs/build/pdf.worker.mjs.map b/public/pdfjs/build/pdf.worker.mjs.map
new file mode 100644
index 0000000..34d68d9
--- /dev/null
+++ b/public/pdfjs/build/pdf.worker.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"pdf.worker.mjs","mappings":"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,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAC7E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAC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pxB,UAAU,CAAC,CACb,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OA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AAC,EAAE,CAAC,EAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9C,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAA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AAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EACrE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAC1E,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACxE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC1E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,MAAM,EAAE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CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChD,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChC,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChE,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChC,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CACE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EACtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CACzC,EACD,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAClD,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChD,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChE,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EACtD,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAClC,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EACtD,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EACpC,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EACtD,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CACrC;AAED,SAASC,kBAAkBA,CAACzuN,KAAK,EAAE0uN,YAAY,GAAG,CAAC,CAAC,EAAE;EAGpD,IAAIA,YAAY,KAAK,CAAC,CAAC,EAAE;IACvB,MAAM7gM,KAAK,GAAG2gM,aAAa,CAACE,YAAY,CAAC;IACzC,KAAK,IAAI3sN,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAG4iB,KAAK,CAAChvB,MAAM,EAAEkD,CAAC,GAAGkJ,EAAE,EAAElJ,CAAC,IAAI,CAAC,EAAE;MACjD,IAAI/B,KAAK,IAAI6tB,KAAK,CAAC9rB,CAAC,CAAC,IAAI/B,KAAK,IAAI6tB,KAAK,CAAC9rB,CAAC,GAAG,CAAC,CAAC,EAAE;QAC9C,OAAO2sN,YAAY;MACrB;IACF;EACF;EACA,KAAK,IAAI3sN,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAGujN,aAAa,CAAC3vN,MAAM,EAAEkD,CAAC,GAAGkJ,EAAE,EAAElJ,CAAC,EAAE,EAAE;IACtD,MAAM8rB,KAAK,GAAG2gM,aAAa,CAACzsN,CAAC,CAAC;IAC9B,KAAK,IAAIic,CAAC,GAAG,CAAC,EAAEuY,EAAE,GAAG1I,KAAK,CAAChvB,MAAM,EAAEmf,CAAC,GAAGuY,EAAE,EAAEvY,CAAC,IAAI,CAAC,EAAE;MACjD,IAAIhe,KAAK,IAAI6tB,KAAK,CAAC7P,CAAC,CAAC,IAAIhe,KAAK,IAAI6tB,KAAK,CAAC7P,CAAC,GAAG,CAAC,CAAC,EAAE;QAC9C,OAAOjc,CAAC;MACV;IACF;EACF;EACA,OAAO,CAAC,CAAC;AACX;AAEA,MAAM4sN,iBAAiB,GAAG,2BAA2B;AACrD,MAAMC,aAAa,GAAG,IAAIvjN,GAAG,CAAC,CAAC;AAE/B,SAASwjN,sBAAsBA,CAACp6M,IAAI,EAAE;EACpC,MAAMq6M,cAAc,GAAGF,aAAa,CAACljN,GAAG,CAAC+I,IAAI,CAAC;EAC9C,IAAIq6M,cAAc,EAAE;IAClB,OAAOA,cAAc;EACvB;EACA,MAAMC,MAAM,GAAGt6M,IAAI,CAAC7V,KAAK,CAAC+vN,iBAAiB,CAAC;EAC5C,MAAMK,QAAQ,GAAG;IACfC,YAAY,EAAE,CAAC,CAACF,MAAM,GAAG,CAAC,CAAC;IAC3BG,oBAAoB,EAAE,CAAC,CAACH,MAAM,GAAG,CAAC,CAAC;IACnCI,qBAAqB,EAAE,CAAC,CAACJ,MAAM,GAAG,CAAC;EACrC,CAAC;EACDH,aAAa,CAACv/M,GAAG,CAACoF,IAAI,EAAEu6M,QAAQ,CAAC;EACjC,OAAOA,QAAQ;AACjB;AAEA,SAASI,kBAAkBA,CAAA,EAAG;EAC5BR,aAAa,CAACj+M,KAAK,CAAC,CAAC;AACvB;;;ACzPuD;AACQ;AACb;AACM;AACN;AASlD,MAAM0+M,qBAAqB,GAAG,IAAI;AAElC,MAAMC,SAAS,GAAG;EAChBC,UAAU,EAAE,CAAC;EACbC,KAAK,EAAE,CAAC;EACRC,QAAQ,EAAE,CAAC;EACXC,MAAM,EAAE,CAAC;EACTC,WAAW,EAAE,EAAE;EACfC,MAAM,EAAE,EAAE;EACVC,MAAM,EAAE,KAAK;EACbC,QAAQ,EAAE,MAAM;EAChBC,SAAS,EAAE;AACb,CAAC;AAGD,MAAMC,wBAAwB,GAAG,CAC/B,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EACrE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAC1E,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EACtE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,EACpE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAC7E,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAClE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EACxE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAC7E,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAC5E,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EACvE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EACxE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAC1E,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAC5E,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EACxE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAClE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAC/D,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EACrE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EACtE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EACpE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EACrE,eAAe,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAC5E,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAC9D,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EACvE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAC3E,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EACpE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAC1E,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EACvE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EACvE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EACtE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EACtE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;AAI/D,SAASC,gBAAgBA,CAACvvN,IAAI,EAAE0tN,gBAAgB,EAAE;EAChD,IAAIA,gBAAgB,CAAC1tN,IAAI,CAAC,KAAKe,SAAS,EAAE;IACxC,OAAOf,IAAI;EACb;EAEA,MAAM2tN,OAAO,GAAGF,kBAAkB,CAACztN,IAAI,EAAE0tN,gBAAgB,CAAC;EAC1D,IAAIC,OAAO,KAAK,CAAC,CAAC,EAAE;IAClB,KAAK,MAAMt/M,GAAG,IAAIq/M,gBAAgB,EAAE;MAClC,IAAIA,gBAAgB,CAACr/M,GAAG,CAAC,KAAKs/M,OAAO,EAAE;QACrC,OAAOt/M,GAAG;MACZ;IACF;EACF;EACApR,IAAI,CAAC,+CAA+C,GAAG+C,IAAI,CAAC;EAC5D,OAAOA,IAAI;AACb;AAYA,SAASwvN,qBAAqBA,CAAC5/M,UAAU,EAAE6/M,eAAe,EAAEC,UAAU,EAAE;EACtE,MAAMC,iBAAiB,GAAGnwN,MAAM,CAAC4M,MAAM,CAAC,IAAI,CAAC;EAC7C,IAAIwjN,OAAO,EAAEj7M,QAAQ,EAAEk7M,YAAY;EACnC,MAAMC,cAAc,GAAG,CAAC,EAAElgN,UAAU,CAACmgN,KAAK,GAAGnB,SAAS,CAACG,QAAQ,CAAC;EAEhE,IAAIn/M,UAAU,CAACogN,cAAc,EAAE;IAC7BH,YAAY,GAAGJ,eAAe;IAC9B,KAAK96M,QAAQ,GAAG,CAAC,EAAEA,QAAQ,GAAGk7M,YAAY,CAAC1xN,MAAM,EAAEwW,QAAQ,EAAE,EAAE;MAC7Di7M,OAAO,GAAGF,UAAU,CAAC5/I,OAAO,CAAC+/I,YAAY,CAACl7M,QAAQ,CAAC,CAAC;MACpDg7M,iBAAiB,CAACh7M,QAAQ,CAAC,GAAGi7M,OAAO,IAAI,CAAC,GAAGA,OAAO,GAAkB,CAAC;IACzE;EACF,CAAC,MAAM,IAAIhgN,UAAU,CAACqgN,gBAAgB,EAAE;IAGtCJ,YAAY,GAAG95I,WAAW,CAACnmE,UAAU,CAACqgN,gBAAgB,CAAC;IACvD,KAAKt7M,QAAQ,GAAG,CAAC,EAAEA,QAAQ,GAAGk7M,YAAY,CAAC1xN,MAAM,EAAEwW,QAAQ,EAAE,EAAE;MAC7Di7M,OAAO,GAAGF,UAAU,CAAC5/I,OAAO,CAAC+/I,YAAY,CAACl7M,QAAQ,CAAC,CAAC;MACpDg7M,iBAAiB,CAACh7M,QAAQ,CAAC,GAAGi7M,OAAO,IAAI,CAAC,GAAGA,OAAO,GAAkB,CAAC;IACzE;EACF,CAAC,MAAM,IAAIE,cAAc,EAAE;IAEzB,KAAKn7M,QAAQ,IAAI86M,eAAe,EAAE;MAChCE,iBAAiB,CAACh7M,QAAQ,CAAC,GAAG86M,eAAe,CAAC96M,QAAQ,CAAC;IACzD;EACF,CAAC,MAAM;IAGLk7M,YAAY,GAAGl6I,gBAAgB;IAC/B,KAAKhhE,QAAQ,GAAG,CAAC,EAAEA,QAAQ,GAAGk7M,YAAY,CAAC1xN,MAAM,EAAEwW,QAAQ,EAAE,EAAE;MAC7Di7M,OAAO,GAAGF,UAAU,CAAC5/I,OAAO,CAAC+/I,YAAY,CAACl7M,QAAQ,CAAC,CAAC;MACpDg7M,iBAAiB,CAACh7M,QAAQ,CAAC,GAAGi7M,OAAO,IAAI,CAAC,GAAGA,OAAO,GAAkB,CAAC;IACzE;EACF;EAGA,MAAMM,WAAW,GAAGtgN,UAAU,CAACsgN,WAAW;EAC1C,IAAIxC,gBAAgB;EACpB,IAAIwC,WAAW,EAAE;IACf,KAAKv7M,QAAQ,IAAIu7M,WAAW,EAAE;MAC5B,MAAMC,SAAS,GAAGD,WAAW,CAACv7M,QAAQ,CAAC;MACvCi7M,OAAO,GAAGF,UAAU,CAAC5/I,OAAO,CAACqgJ,SAAS,CAAC;MAEvC,IAAIP,OAAO,KAAK,CAAC,CAAC,EAAE;QAClB,IAAI,CAAClC,gBAAgB,EAAE;UACrBA,gBAAgB,GAAGz3I,gBAAgB,CAAC,CAAC;QACvC;QACA,MAAMm6I,iBAAiB,GAAGb,gBAAgB,CAACY,SAAS,EAAEzC,gBAAgB,CAAC;QACvE,IAAI0C,iBAAiB,KAAKD,SAAS,EAAE;UACnCP,OAAO,GAAGF,UAAU,CAAC5/I,OAAO,CAACsgJ,iBAAiB,CAAC;QACjD;MACF;MACAT,iBAAiB,CAACh7M,QAAQ,CAAC,GAAGi7M,OAAO,IAAI,CAAC,GAAGA,OAAO,GAAkB,CAAC;IACzE;EACF;EACA,OAAOD,iBAAiB;AAC1B;AAEA,SAASU,iBAAiBA,CAACrwN,IAAI,EAAE;EAC/B,OAAOA,IAAI,CAAC4K,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAACA,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;AAC5D;AAEA,MAAM0lN,2BAA2B,GAAGp7M,qBAAqB,CAAC7L,CAAC,IAAI;EAG7DA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;EAClBA,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM;AACpB,CAAC,CAAC;AAGF,MAAMknN,mBAAmB,GAAG,IAAI;AAEhC,SAASC,iBAAiBA,CAAC;EAAE36M,IAAI,EAAE+3B,GAAG;EAAExxB,KAAK;EAAEC;AAAO,CAAC,EAAE;EACvD,IAAID,KAAK,GAAGm0M,mBAAmB,IAAIl0M,MAAM,GAAGk0M,mBAAmB,EAAE;IAC/D,OAAO,IAAI;EACb;EAEA,MAAME,sBAAsB,GAAG,IAAI;EACnC,MAAMC,WAAW,GAAG,IAAI5uN,UAAU,CAAC,CACjC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAChD,CAAC;EAEF,MAAM6uN,MAAM,GAAGv0M,KAAK,GAAG,CAAC;EACxB,MAAMw0M,MAAM,GAAG,IAAI9uN,UAAU,CAAC6uN,MAAM,IAAIt0M,MAAM,GAAG,CAAC,CAAC,CAAC;EACpD,IAAIhb,CAAC,EAAEic,CAAC,EAAEuzM,EAAE;EAGZ,MAAMC,QAAQ,GAAI10M,KAAK,GAAG,CAAC,GAAI,CAAC,CAAC;EACjC,MAAMvG,IAAI,GAAG,IAAI/T,UAAU,CAACgvN,QAAQ,GAAGz0M,MAAM,CAAC;EAC9C,IAAI7W,GAAG,GAAG,CAAC;EACX,KAAK,MAAM+vB,IAAI,IAAIqY,GAAG,EAAE;IACtB,IAAI6V,IAAI,GAAG,GAAG;IACd,OAAOA,IAAI,GAAG,CAAC,EAAE;MACf5tC,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAG+vB,IAAI,GAAGkuB,IAAI,GAAG,CAAC,GAAG,GAAG;MACnCA,IAAI,KAAK,CAAC;IACZ;EACF;EAYA,IAAIz+B,KAAK,GAAG,CAAC;EACbxf,GAAG,GAAG,CAAC;EACP,IAAIqQ,IAAI,CAACrQ,GAAG,CAAC,KAAK,CAAC,EAAE;IACnBorN,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IACb,EAAE5rM,KAAK;EACT;EACA,KAAK1H,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGlB,KAAK,EAAEkB,CAAC,EAAE,EAAE;IAC1B,IAAIzH,IAAI,CAACrQ,GAAG,CAAC,KAAKqQ,IAAI,CAACrQ,GAAG,GAAG,CAAC,CAAC,EAAE;MAC/BorN,MAAM,CAACtzM,CAAC,CAAC,GAAGzH,IAAI,CAACrQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;MAC7B,EAAEwf,KAAK;IACT;IACAxf,GAAG,EAAE;EACP;EACA,IAAIqQ,IAAI,CAACrQ,GAAG,CAAC,KAAK,CAAC,EAAE;IACnBorN,MAAM,CAACtzM,CAAC,CAAC,GAAG,CAAC;IACb,EAAE0H,KAAK;EACT;EACA,KAAK3jB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgb,MAAM,EAAEhb,CAAC,EAAE,EAAE;IAC3BmE,GAAG,GAAGnE,CAAC,GAAGyvN,QAAQ;IAClBD,EAAE,GAAGxvN,CAAC,GAAGsvN,MAAM;IACf,IAAI96M,IAAI,CAACrQ,GAAG,GAAGsrN,QAAQ,CAAC,KAAKj7M,IAAI,CAACrQ,GAAG,CAAC,EAAE;MACtCorN,MAAM,CAACC,EAAE,CAAC,GAAGh7M,IAAI,CAACrQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;MAC9B,EAAEwf,KAAK;IACT;IAGA,IAAImiD,GAAG,GAAG,CAACtxD,IAAI,CAACrQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAKqQ,IAAI,CAACrQ,GAAG,GAAGsrN,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9D,KAAKxzM,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGlB,KAAK,EAAEkB,CAAC,EAAE,EAAE;MAC1B6pD,GAAG,GACD,CAACA,GAAG,IAAI,CAAC,KACRtxD,IAAI,CAACrQ,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IACtBqQ,IAAI,CAACrQ,GAAG,GAAGsrN,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MACpC,IAAIJ,WAAW,CAACvpJ,GAAG,CAAC,EAAE;QACpBypJ,MAAM,CAACC,EAAE,GAAGvzM,CAAC,CAAC,GAAGozM,WAAW,CAACvpJ,GAAG,CAAC;QACjC,EAAEniD,KAAK;MACT;MACAxf,GAAG,EAAE;IACP;IACA,IAAIqQ,IAAI,CAACrQ,GAAG,GAAGsrN,QAAQ,CAAC,KAAKj7M,IAAI,CAACrQ,GAAG,CAAC,EAAE;MACtCorN,MAAM,CAACC,EAAE,GAAGvzM,CAAC,CAAC,GAAGzH,IAAI,CAACrQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;MAClC,EAAEwf,KAAK;IACT;IAEA,IAAIA,KAAK,GAAGyrM,sBAAsB,EAAE;MAClC,OAAO,IAAI;IACb;EACF;EAEAjrN,GAAG,GAAGsrN,QAAQ,IAAIz0M,MAAM,GAAG,CAAC,CAAC;EAC7Bw0M,EAAE,GAAGxvN,CAAC,GAAGsvN,MAAM;EACf,IAAI96M,IAAI,CAACrQ,GAAG,CAAC,KAAK,CAAC,EAAE;IACnBorN,MAAM,CAACC,EAAE,CAAC,GAAG,CAAC;IACd,EAAE7rM,KAAK;EACT;EACA,KAAK1H,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGlB,KAAK,EAAEkB,CAAC,EAAE,EAAE;IAC1B,IAAIzH,IAAI,CAACrQ,GAAG,CAAC,KAAKqQ,IAAI,CAACrQ,GAAG,GAAG,CAAC,CAAC,EAAE;MAC/BorN,MAAM,CAACC,EAAE,GAAGvzM,CAAC,CAAC,GAAGzH,IAAI,CAACrQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;MAClC,EAAEwf,KAAK;IACT;IACAxf,GAAG,EAAE;EACP;EACA,IAAIqQ,IAAI,CAACrQ,GAAG,CAAC,KAAK,CAAC,EAAE;IACnBorN,MAAM,CAACC,EAAE,GAAGvzM,CAAC,CAAC,GAAG,CAAC;IAClB,EAAE0H,KAAK;EACT;EACA,IAAIA,KAAK,GAAGyrM,sBAAsB,EAAE;IAClC,OAAO,IAAI;EACb;EAGA,MAAM/3L,KAAK,GAAG,IAAI8S,UAAU,CAAC,CAAC,CAAC,EAAEmlL,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAACA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;EACrE,MAAMI,OAAO,GAAG,EAAE;EAGlB,MAAM;IAAE9rN,CAAC;IAAEN,CAAC;IAAEO,CAAC;IAAEC,CAAC;IAAEC,CAAC;IAAEC;EAAE,CAAC,GAAG,IAAI2rN,SAAS,CAAC,CAAC,CACzCC,SAAS,CAAC,CAAC,GAAG70M,KAAK,EAAE,CAAC,CAAC,GAAGC,MAAM,CAAC,CACjC60M,aAAa,CAAC,CAAC,EAAE,CAAC70M,MAAM,CAAC;EAE5B,KAAKhb,CAAC,GAAG,CAAC,EAAE2jB,KAAK,IAAI3jB,CAAC,IAAIgb,MAAM,EAAEhb,CAAC,EAAE,EAAE;IACrC,IAAIkE,CAAC,GAAGlE,CAAC,GAAGsvN,MAAM;IAClB,MAAM39M,GAAG,GAAGzN,CAAC,GAAG6W,KAAK;IACrB,OAAO7W,CAAC,GAAGyN,GAAG,IAAI,CAAC49M,MAAM,CAACrrN,CAAC,CAAC,EAAE;MAC5BA,CAAC,EAAE;IACL;IACA,IAAIA,CAAC,KAAKyN,GAAG,EAAE;MACb;IACF;IACA,IAAIzK,CAAC,GAAGhD,CAAC,GAAGorN,MAAM;IAClB,IAAInoN,CAAC,GAAGnH,CAAC;IACT0vN,OAAO,CAACpvN,IAAI,CAACrF,OAAO,CAAC/E,MAAM,EAAE0N,CAAC,GAAGsD,CAAC,GAAGrD,CAAC,GAAGsD,CAAC,GAAGpD,CAAC,EAAET,CAAC,GAAG4D,CAAC,GAAGpD,CAAC,GAAGqD,CAAC,GAAGnD,CAAC,CAAC;IAElE,MAAMI,EAAE,GAAGF,CAAC;IACZ,IAAIvZ,IAAI,GAAG4kO,MAAM,CAACrrN,CAAC,CAAC;IACpB,GAAG;MACD,MAAMyzB,IAAI,GAAGN,KAAK,CAAC1sC,IAAI,CAAC;MACxB,GAAG;QACDuZ,CAAC,IAAIyzB,IAAI;MACX,CAAC,QAAQ,CAAC43L,MAAM,CAACrrN,CAAC,CAAC;MAEnB,MAAM4rN,EAAE,GAAGP,MAAM,CAACrrN,CAAC,CAAC;MACpB,IAAI4rN,EAAE,KAAK,CAAC,IAAIA,EAAE,KAAK,EAAE,EAAE;QAEzBnlO,IAAI,GAAGmlO,EAAE;QAETP,MAAM,CAACrrN,CAAC,CAAC,GAAG,CAAC;MACf,CAAC,MAAM;QAGLvZ,IAAI,GAAGmlO,EAAE,GAAK,IAAI,GAAGnlO,IAAI,IAAK,CAAE;QAEhC4kO,MAAM,CAACrrN,CAAC,CAAC,IAAKvZ,IAAI,IAAI,CAAC,GAAKA,IAAI,IAAI,CAAE;MACxC;MACAuc,CAAC,GAAGhD,CAAC,GAAGorN,MAAM;MACdnoN,CAAC,GAAIjD,CAAC,GAAGorN,MAAM,GAAI,CAAC;MACpBI,OAAO,CAACpvN,IAAI,CAACrF,OAAO,CAAC9E,MAAM,EAAEyN,CAAC,GAAGsD,CAAC,GAAGrD,CAAC,GAAGsD,CAAC,GAAGpD,CAAC,EAAET,CAAC,GAAG4D,CAAC,GAAGpD,CAAC,GAAGqD,CAAC,GAAGnD,CAAC,CAAC;MAElE,IAAI,CAACurN,MAAM,CAACrrN,CAAC,CAAC,EAAE;QACd,EAAEyf,KAAK;MACT;IACF,CAAC,QAAQvf,EAAE,KAAKF,CAAC;IACjB,EAAElE,CAAC;EACL;EAEA,OAAO,CACL3K,GAAG,CAAC2F,WAAW,EACf,CAAC,IAAIjQ,YAAY,CAAC2kO,OAAO,CAAC,CAAC,EAC3B,IAAI3kO,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAEgwB,KAAK,EAAEC,MAAM,CAAC,CAAC,CACxC;AACH;;;ACxWA,MAAM+0M,eAAe,GAAG,CACtB,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAChE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAC/D,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAChE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAC9D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EACpE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACrE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC/D,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EACvE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACvE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACpE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EACpE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAC9D,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAC/D,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAC7D,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EACzD,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAC7D,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EACtE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAC7D,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAChE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EACpE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAC/D,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EACjE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EACxE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EACtE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EACjE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EACpE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EACvE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAClE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAChE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EACnE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EACvE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EACrE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAClE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAC1C;AAGD,MAAMC,aAAa,GAAG,CACpB,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,EACxE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EACrE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EACjE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAC7D,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAC9D,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAC/D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAC5D,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAC3D,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAClE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAC/D,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAChE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EACvE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EACpE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EACpE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EACpE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EACjE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EACtE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAC5D,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAC3D,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAC1D,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EACxD,mBAAmB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAC/D,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EACtE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAC9D,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAC/D,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAC7D,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAC9D,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EACjE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAC/D,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EACjE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EACxD,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAClE,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAC/D,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,EAC/D,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EACxE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EACjE,gBAAgB,CACjB;AAGD,MAAMC,mBAAmB,GAAG,CAC1B,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EACtD,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAC3D,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EACzD,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAC7D,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAC9D,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EACtE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EACjE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAClE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAC/D,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAChE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EACpE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EACtE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EACtE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EACtE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAC9D,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAC/D,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAC7D,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAC9D,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EACjE,gBAAgB,EAAE,eAAe,CAClC;;;ACrG0C;AACS;AAEpD,MAAMC,WAAW,CAAC;EAChB,CAACnmN,GAAG;EAEJ,CAAComN,SAAS,GAAG,IAAI;EAEjB,CAACC,cAAc,GAAG,KAAK;EAEvB,CAACjsN,GAAG,GAAG,CAAC;EAER,CAACi1B,IAAI;EAELv6B,WAAWA,CAAC;IAAEwxN,WAAW,GAAG,CAAC;IAAEC,SAAS,GAAG;EAAE,CAAC,EAAE;IAC9C,IAAI,CAAC,CAACF,cAAc,GAAG,CAAC,CAACC,WAAW;IACpC,IAAI,CAAC,CAACE,OAAO,CAACF,WAAW,IAAIC,SAAS,CAAC;EACzC;EAEA,CAACC,OAAOC,CAACF,SAAS,EAAE;IAClB,IAAI,IAAI,CAAC,CAACF,cAAc,EAAE;MACxB,IAAI,CAAC,CAACD,SAAS,GAAGG,SAAS;IAC7B,CAAC,MAAM;MAEL,OAAO,IAAI,CAAC,CAACH,SAAS,GAAGG,SAAS,EAAE;QAClC,IAAI,CAAC,CAACH,SAAS,IAAI,CAAC;MACtB;IACF;IACA,MAAMM,MAAM,GAAG,IAAIhwN,UAAU,CAAC,IAAI,CAAC,CAAC0vN,SAAS,CAAC;IAE9C,IAAI,IAAI,CAAC,CAACpmN,GAAG,EAAE;MACb0mN,MAAM,CAACnjN,GAAG,CAAC,IAAI,CAAC,CAACvD,GAAG,EAAE,CAAC,CAAC;IAC1B;IACA,IAAI,CAAC,CAACA,GAAG,GAAG0mN,MAAM;IAClB,IAAI,CAAC,CAACr3L,IAAI,GAAG,IAAIC,QAAQ,CAACo3L,MAAM,CAACvvN,MAAM,CAAC;EAC1C;EAEA,IAAIsT,IAAIA,CAAA,EAAG;IACT,OAAO,IAAI,CAAC,CAACzK,GAAG,CAAC1J,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC8D,GAAG,CAAC;EACzC;EAEA,IAAIrH,MAAMA,CAAA,EAAG;IACX,OAAO,IAAI,CAAC,CAACqH,GAAG;EAClB;EAEA0N,IAAIA,CAAC7O,CAAC,EAAE;IACN,IAAI,CAAC,CAACmB,GAAG,IAAInB,CAAC;EAChB;EAEA0tN,QAAQA,CAACr8M,GAAG,EAAE;IACZ,MAAM2vB,MAAM,GAAG,IAAI,CAAC,CAAC7/B,GAAG,GAAGkQ,GAAG,CAACvX,MAAM;IAErC,IAAI,CAAC,IAAI,CAAC,CAACszN,cAAc,IAAIpsL,MAAM,GAAG,IAAI,CAAC,CAACmsL,SAAS,EAAE;MACrD,IAAI,CAAC,CAACI,OAAO,CAACvsL,MAAM,CAAC;IACvB;IACA,IAAI,CAAC,CAACj6B,GAAG,CAACuD,GAAG,CAAC+G,GAAG,EAAE,IAAI,CAAC,CAAClQ,GAAG,CAAC;IAC7B,IAAI,CAAC,CAACA,GAAG,GAAG6/B,MAAM;EACpB;EAEAmvC,QAAQA,CAAC9rD,GAAG,EAAE;IAOZ,MAAM2c,MAAM,GAAG,IAAI,CAAC,CAAC7/B,GAAG,GAAG,CAAC;IAE5B,IAAI,CAAC,IAAI,CAAC,CAACisN,cAAc,IAAIpsL,MAAM,GAAG,IAAI,CAAC,CAACmsL,SAAS,EAAE;MACrD,IAAI,CAAC,CAACI,OAAO,CAACvsL,MAAM,CAAC;IACvB;IACA,IAAI,CAAC,CAAC5K,IAAI,CAAC+5C,QAAQ,CAAC,IAAI,CAAC,CAAChvE,GAAG,EAAEkjB,GAAG,CAAC;IACnC,IAAI,CAAC,CAACljB,GAAG,GAAG6/B,MAAM;EACpB;EAEA2sL,YAAYA,CAACtpM,GAAG,EAAE;IAOhB,MAAM2c,MAAM,GAAG,IAAI,CAAC,CAAC7/B,GAAG,GAAG,CAAC;IAE5B,IAAI,CAAC,IAAI,CAAC,CAACisN,cAAc,IAAIpsL,MAAM,GAAG,IAAI,CAAC,CAACmsL,SAAS,EAAE;MACrD,IAAI,CAAC,CAACI,OAAO,CAACvsL,MAAM,CAAC;IACvB;IAEA,IAAI,CAAC,CAAC5K,IAAI,CAAC+5C,QAAQ,CAAC,IAAI,CAAC,CAAChvE,GAAG,EAAEqd,SAAS,CAAC6F,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,CAACljB,GAAG,GAAG6/B,MAAM;EACpB;EAEArK,QAAQA,CAACtS,GAAG,EAAE;IAOZ,MAAM2c,MAAM,GAAG,IAAI,CAAC,CAAC7/B,GAAG,GAAG,CAAC;IAE5B,IAAI,CAAC,IAAI,CAAC,CAACisN,cAAc,IAAIpsL,MAAM,GAAG,IAAI,CAAC,CAACmsL,SAAS,EAAE;MACrD,IAAI,CAAC,CAACI,OAAO,CAACvsL,MAAM,CAAC;IACvB;IACA,IAAI,CAAC,CAAC5K,IAAI,CAACO,QAAQ,CAAC,IAAI,CAAC,CAACx1B,GAAG,EAAEkjB,GAAG,CAAC;IACnC,IAAI,CAAC,CAACljB,GAAG,GAAG6/B,MAAM;EACpB;AACF;;;AClG2B;AAKJ;AAC2C;AAClB;AACI;AAGpD,MAAM4sL,gBAAgB,GAAG,EAAE;AAE3B,SAASC,8BAA8BA,CAACl3K,KAAK,EAAE;EAC7C,OAAOA,KAAK,GAAG,MAAM,IAAIA,KAAK,IAAI,MAAM;AAC1C;AAEA,SAASm3K,sBAAsBA,CAAC7/K,IAAI,EAAE8/K,aAAa,GAAG,KAAK,EAAE;EAC3D,OAAOnuN,IAAI,CAAC4D,aAAa,CACvByqC,IAAI,CAACplC,GAAG,CAAC,CAAC8tC,KAAK,EAAE35C,CAAC,KAChB,CAAC,CAAC+wN,aAAa,IAAI/wN,CAAC,GAAG,CAAC,KAAK6wN,8BAA8B,CAACl3K,KAAK,CAAC,GAC9DA,KAAK,GAAG,OAAO,GACfA,KACN,CACF,CAAC;AACH;AAOA,MAAMq3K,kBAAkB,GAAG,CACzB,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAC3E,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EACxE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAC3E,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EACrE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EACxE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EACzE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAC9D,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAC/D,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAC7D,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EACzE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAC5E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EACvE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAC1E,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EACnE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EACjE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EACvE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EACvE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EACxE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EACpE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EACpE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAClE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAClE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EACrE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EACjE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EACpE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EACvE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAClE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EACrE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EACzE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EACzE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAC9D,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAC9D,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EACjE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EACrE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAClE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAC5E,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAC1E,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EACrE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EACpE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EACpE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EACpE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EACpE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAC9D,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EACzE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAC/D,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,WAAW,EAC5E,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EACtE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAC7D,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAChE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAC7D,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAC/D,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAClE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EACjE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EACzE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAClE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAClE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAC3E,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EACxE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAClE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAC3E;AAED,MAAMC,wBAAwB,GAAG,GAAG;AAEpC,MAAMC,kBAAkB,GAAG,QAAQ;AACnC,MAAMC,kBAAkB,GAAG,CAAC;AAC5B,MAAMC,iBAAiB,GAAG,CAAC;AAC3B,MAAMC,wBAAwB,GAAG,IAAI;AAErC,MAAMC,wBAAwB,GAAG,CACtB,IAAI,EACJ;EAAEt6J,EAAE,EAAE,OAAO;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE,IAAI;EAAEC,IAAI,EAAE;AAAK,CAAC,EACxD,IAAI,EACJ;EAAEx6J,EAAE,EAAE,OAAO;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE,IAAI;EAAEC,IAAI,EAAE;AAAK,CAAC,EACxD;EAAEx6J,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE;AAAK,CAAC,EAC9C;EAAEv6J,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC3C;EAAEz6J,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC3C;EAAEz6J,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC3C;EAAEz6J,EAAE,EAAE,WAAW;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC7C,IAAI,EACJ;EAAEz6J,EAAE,EAAE,UAAU;EAAE72D,GAAG,EAAE;AAAE,CAAC,EAC1B;EAAE62D,EAAE,EAAE,QAAQ;EAAE72D,GAAG,EAAE;AAAE,CAAC,EACxB,IAAI,EACJ,IAAI,EACJ;EAAE62D,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE;AAAK,CAAC,EAC9C,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ;EAAEv6J,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE,IAAI;EAAEC,IAAI,EAAE;AAAK,CAAC,EAC1D;EAAEx6J,EAAE,EAAE,UAAU;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE;AAAK,CAAC,EAC/C;EAAEv6J,EAAE,EAAE,UAAU;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE;AAAK,CAAC,EAC/C;EAAEv6J,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE;AAAK,CAAC,EAC9C;EAAEv6J,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE;AAAK,CAAC,EAC9C;EAAEv6J,EAAE,EAAE,SAAS;EAAE72D,GAAG,EAAE,CAAC;EAAEoxN,aAAa,EAAE,IAAI;EAAEC,IAAI,EAAE;AAAK,CAAC,EAC1D;EAAEx6J,EAAE,EAAE,YAAY;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC9C;EAAEz6J,EAAE,EAAE,YAAY;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC9C;EAAEz6J,EAAE,EAAE,WAAW;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC7C;EAAEz6J,EAAE,EAAE,WAAW;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC7C,IAAI,EACJ;EAAEz6J,EAAE,EAAE,WAAW;EAAE72D,GAAG,EAAE;AAAE,CAAC,EAC3B;EAAE62D,EAAE,EAAE,WAAW;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC7C;EAAEz6J,EAAE,EAAE,WAAW;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,CACvD;AAED,MAAMC,0BAA0B,GAAG,CACjC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ;EAAE16J,EAAE,EAAE,KAAK;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE,CAAC;AAAE,CAAC,EACrC;EAAE36J,EAAE,EAAE,IAAI;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE,CAAC;AAAE,CAAC,EACpC;EAAE36J,EAAE,EAAE,KAAK;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE;AAAE,CAAC,EACpC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ;EAAE36J,EAAE,EAAE,KAAK;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE;AAAE,CAAC,EACpC;EACE36J,EAAE,EAAE,KAAK;EACT72D,GAAG,EAAE,CAAC;EACNwxN,UAAU,EAAE,CAAC,CAAC;EACdC,OAAOA,CAACz1K,KAAK,EAAExd,KAAK,EAAE;IACpBwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAGwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAGwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC;EACxD;AACF,CAAC,EACD;EACEq4B,EAAE,EAAE,KAAK;EACT72D,GAAG,EAAE,CAAC;EACNwxN,UAAU,EAAE,CAAC,CAAC;EACdC,OAAOA,CAACz1K,KAAK,EAAExd,KAAK,EAAE;IACpBwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAGwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAGwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC;EACxD;AACF,CAAC,EACD;EACEq4B,EAAE,EAAE,KAAK;EACT72D,GAAG,EAAE,CAAC;EACNwxN,UAAU,EAAE,CAAC,CAAC;EACdC,OAAOA,CAACz1K,KAAK,EAAExd,KAAK,EAAE;IACpBwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAGwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAGwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC;EACxD;AACF,CAAC,EACD,IAAI,EACJ;EACEq4B,EAAE,EAAE,KAAK;EACT72D,GAAG,EAAE,CAAC;EACNwxN,UAAU,EAAE,CAAC;EACbC,OAAOA,CAACz1K,KAAK,EAAExd,KAAK,EAAE;IACpBwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAG,CAACwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC;EACtC;AACF,CAAC,EACD;EAAEq4B,EAAE,EAAE,IAAI;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE,CAAC;AAAE,CAAC,EACpC,IAAI,EACJ,IAAI,EACJ;EAAE36J,EAAE,EAAE,MAAM;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE,CAAC;AAAE,CAAC,EACtC,IAAI,EACJ;EAAE36J,EAAE,EAAE,KAAK;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE,CAAC;AAAE,CAAC,EACrC;EAAE36J,EAAE,EAAE,KAAK;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE;AAAE,CAAC,EACpC;EAAE36J,EAAE,EAAE,QAAQ;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE,CAAC;AAAE,CAAC,EACxC;EAAE36J,EAAE,EAAE,QAAQ;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE;AAAE,CAAC,EACvC;EACE36J,EAAE,EAAE,KAAK;EACT72D,GAAG,EAAE,CAAC;EACNwxN,UAAU,EAAE,CAAC,CAAC;EACdC,OAAOA,CAACz1K,KAAK,EAAExd,KAAK,EAAE;IACpBwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAGwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC,GAAGwd,KAAK,CAACxd,KAAK,GAAG,CAAC,CAAC;EACxD;AACF,CAAC,EACD,IAAI,EACJ;EAAEq4B,EAAE,EAAE,MAAM;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE;AAAE,CAAC,EACrC;EAAE36J,EAAE,EAAE,KAAK;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE;AAAE,CAAC,EACpC;EAAE36J,EAAE,EAAE,MAAM;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE;AAAE,CAAC,EACrC;EAAE36J,EAAE,EAAE,OAAO;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE;AAAE,CAAC,EACtC;EAAE36J,EAAE,EAAE,MAAM;EAAE72D,GAAG,EAAE,CAAC;EAAEwxN,UAAU,EAAE,CAAC;AAAE,CAAC,EACtC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ;EAAE36J,EAAE,EAAE,OAAO;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EACzC;EAAEz6J,EAAE,EAAE,MAAM;EAAE72D,GAAG,EAAE,EAAE;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EACzC;EAAEz6J,EAAE,EAAE,QAAQ;EAAE72D,GAAG,EAAE,CAAC;EAAEsxN,UAAU,EAAE;AAAK,CAAC,EAC1C;EAAEz6J,EAAE,EAAE,OAAO;EAAE72D,GAAG,EAAE,EAAE;EAAEsxN,UAAU,EAAE;AAAK,CAAC,CAC3C;AAED,MAAMI,SAAS,CAAC;EACdhzN,WAAWA,CAACizN,IAAI,EAAEvjN,UAAU,EAAEwjN,mBAAmB,EAAE;IACjD,IAAI,CAACtyN,KAAK,GAAGqyN,IAAI,CAAClhN,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAACrC,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACwjN,mBAAmB,GAAG,CAAC,CAACA,mBAAmB;EAClD;EAEA50N,KAAKA,CAAA,EAAG;IACN,MAAMoR,UAAU,GAAG,IAAI,CAACA,UAAU;IAClC,MAAMyjN,GAAG,GAAG,IAAIC,GAAG,CAAC,IAAI,CAACxyN,KAAK,CAAC3C,MAAM,CAAC;IACtC,IAAI,CAACk1N,GAAG,GAAGA,GAAG;IAId,MAAMr1K,MAAM,GAAG,IAAI,CAACu1K,WAAW,CAAC,CAAC;IACjC,MAAMC,SAAS,GAAG,IAAI,CAACC,UAAU,CAACz1K,MAAM,CAACruB,MAAM,CAAC;IAChD,MAAM+jM,YAAY,GAAG,IAAI,CAACD,UAAU,CAACD,SAAS,CAAC7jM,MAAM,CAAC;IACtD,MAAMgkM,WAAW,GAAG,IAAI,CAACF,UAAU,CAACC,YAAY,CAAC/jM,MAAM,CAAC;IACxD,MAAMikM,eAAe,GAAG,IAAI,CAACH,UAAU,CAACE,WAAW,CAAChkM,MAAM,CAAC;IAE3D,MAAMkkM,aAAa,GAAG,IAAI,CAACC,SAAS,CAACJ,YAAY,CAACt0N,GAAG,CAAC4L,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM+oN,OAAO,GAAG,IAAI,CAACC,UAAU,CAACC,UAAU,EAAEJ,aAAa,EAAER,GAAG,CAACnzJ,OAAO,CAAC;IAEvEmzJ,GAAG,CAACr1K,MAAM,GAAGA,MAAM,CAAC5+C,GAAG;IACvBi0N,GAAG,CAACa,KAAK,GAAG,IAAI,CAACC,cAAc,CAACX,SAAS,CAACp0N,GAAG,CAAC;IAC9Ci0N,GAAG,CAACnzJ,OAAO,GAAG,IAAI,CAACk0J,gBAAgB,CAACT,WAAW,CAACv0N,GAAG,CAAC;IACpDi0N,GAAG,CAACU,OAAO,GAAGA,OAAO;IACrBV,GAAG,CAACO,eAAe,GAAGA,eAAe,CAACx0N,GAAG;IAEzC,IAAI,CAACi1N,gBAAgB,CAAChB,GAAG,CAACU,OAAO,CAAC;IAElCV,GAAG,CAACiB,SAAS,GAAGP,OAAO,CAACQ,OAAO,CAAC,KAAK,CAAC;IAEtC,MAAMC,gBAAgB,GAAGT,OAAO,CAACh2L,SAAS,CAAC,aAAa,CAAC;IACzD,MAAM02L,eAAe,GAAG,IAAI,CAAChB,UAAU,CAACe,gBAAgB,CAAC,CAACp1N,GAAG;IAE7Di0N,GAAG,CAACqB,eAAe,GAAGD,eAAe,CAACzvM,KAAK;IAE3C,MAAMyvD,UAAU,GAAGs/I,OAAO,CAACh2L,SAAS,CAAC,YAAY,CAAC;IAClD,IAAI02C,UAAU,EAAE;MACd7kE,UAAU,CAAC6kE,UAAU,GAAGA,UAAU;IACpC;IAEA,IAAIkgJ,QAAQ,GAAGZ,OAAO,CAACh2L,SAAS,CAAC,UAAU,CAAC;IAC5C,MAAM62L,cAAc,GAAGhlN,UAAU,CAAC0iC,IAAI,EAAEuiL,IAAI,CAAC75K,KAAK,IAAIA,KAAK,KAAK,CAAC,CAAC,GAC9Dm3K,sBAAsB,CAACviN,UAAU,CAAC0iC,IAAI,CAAC,GACvC,IAAI;IACR,MAAMwiL,2BAA2B,GAAGH,QAAQ,EACxC7sN,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CACZ+sN,IAAI,CAAC3C,8BAA8B,CAAC;IACvC,MAAM6C,wBAAwB,GAAGJ,QAAQ,EAAEE,IAAI,CAC7C3C,8BACF,CAAC;IACD,IAAIyC,QAAQ,EAAEp9M,KAAK,CAACyjC,KAAK,IAAIA,KAAK,KAAK,CAAC,CAAC,IAAI45K,cAAc,EAAE;MAE3DD,QAAQ,GAAGC,cAAc;MACzBb,OAAO,CAACiB,SAAS,CAAC,UAAU,EAAEL,QAAQ,CAAC;IACzC,CAAC,MAAM,IAAII,wBAAwB,EAAE;MACnC,MAAME,iBAAiB,GAAG9C,sBAAsB,CAACwC,QAAQ,CAAC;MAC1D,MAAMO,sBAAsB,GAC1BN,cAAc,IACdhlN,UAAU,CAAC0iC,IAAI,CAACuiL,IAAI,CAAC75K,KAAK,IAAIA,KAAK,GAAG,CAAC,CAAC,IACxC,CAACprC,UAAU,CAAC0iC,IAAI,CAACuiL,IAAI,CAAC3C,8BAA8B,CAAC,IACrD9nN,YAAY,CAAC6qN,iBAAiB,EAAEL,cAAc,CAAC;MAEjD,IAAIM,sBAAsB,IAAIJ,2BAA2B,EAAE;QAIzDH,QAAQ,GAAGO,sBAAsB,GAC7BD,iBAAiB,GACjB9C,sBAAsB,CAACwC,QAAQ,EAAwB,IAAI,CAAC;QAChEZ,OAAO,CAACiB,SAAS,CAAC,UAAU,EAAEL,QAAQ,CAAC;MACzC;IACF;IACA,IAAIA,QAAQ,EAAEE,IAAI,CAAC75K,KAAK,IAAIA,KAAK,KAAK,CAAC,CAAC,EAAE;MAExCprC,UAAU,CAACulN,MAAM,GAAG5zN,IAAI,CAAC+F,GAAG,CAACqtN,QAAQ,CAAC,CAAC,CAAC,EAAEA,QAAQ,CAAC,CAAC,CAAC,CAAC;MACtD/kN,UAAU,CAACwlN,OAAO,GAAG7zN,IAAI,CAACC,GAAG,CAACmzN,QAAQ,CAAC,CAAC,CAAC,EAAEA,QAAQ,CAAC,CAAC,CAAC,CAAC;MACvD/kN,UAAU,CAACylN,YAAY,GAAG,IAAI;IAChC;IAEA,IAAIC,OAAO,EAAElhN,QAAQ;IACrB,IAAIi/M,GAAG,CAACiB,SAAS,EAAE;MACjB,MAAMiB,YAAY,GAAG,IAAI,CAAC9B,UAAU,CAACM,OAAO,CAACh2L,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC3+B,GAAG;MACtE,KAAK,IAAIiC,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAGgrN,YAAY,CAACvwM,KAAK,EAAE3jB,CAAC,GAAGkJ,EAAE,EAAE,EAAElJ,CAAC,EAAE;QACpD,MAAMm0N,OAAO,GAAGD,YAAY,CAACvqN,GAAG,CAAC3J,CAAC,CAAC;QACnC,MAAMo0N,QAAQ,GAAG,IAAI,CAACzB,UAAU,CAC9BC,UAAU,EACV,IAAI,CAACH,SAAS,CAAC0B,OAAO,CAAC,EACvBnC,GAAG,CAACnzJ,OACN,CAAC;QACD,IAAI,CAACm0J,gBAAgB,CAACoB,QAAQ,CAAC;QAC/BpC,GAAG,CAACqC,OAAO,CAAC/zN,IAAI,CAAC8zN,QAAQ,CAAC;MAC5B;MAEArhN,QAAQ,GAAG,IAAI;MACfkhN,OAAO,GAAG,IAAI,CAACK,aAAa,CAC1B5B,OAAO,CAACh2L,SAAS,CAAC,SAAS,CAAC,EAC5B02L,eAAe,CAACzvM,KAAK,EACrBquM,GAAG,CAACnzJ,OAAO,EACX,IACF,CAAC;MACDmzJ,GAAG,CAACuC,QAAQ,GAAG,IAAI,CAACC,aAAa,CAC/B9B,OAAO,CAACh2L,SAAS,CAAC,UAAU,CAAC,EAC7B02L,eAAe,CAACzvM,KAClB,CAAC;IACH,CAAC,MAAM;MACLswM,OAAO,GAAG,IAAI,CAACK,aAAa,CAC1B5B,OAAO,CAACh2L,SAAS,CAAC,SAAS,CAAC,EAC5B02L,eAAe,CAACzvM,KAAK,EACrBquM,GAAG,CAACnzJ,OAAO,EACX,KACF,CAAC;MACD9rD,QAAQ,GAAG,IAAI,CAAC0hN,aAAa,CAC3B/B,OAAO,CAACh2L,SAAS,CAAC,UAAU,CAAC,EAC7BnuB,UAAU,EACVyjN,GAAG,CAACnzJ,OAAO,EACXo1J,OAAO,CAACA,OACV,CAAC;IACH;IAEAjC,GAAG,CAACiC,OAAO,GAAGA,OAAO;IACrBjC,GAAG,CAACj/M,QAAQ,GAAGA,QAAQ;IAEvB,MAAM2hN,mBAAmB,GAAG,IAAI,CAACC,gBAAgB,CAAC;MAChDC,WAAW,EAAExB,eAAe;MAC5ByB,cAAc,EAAEnC,OAAO,CAACoC,WAAW,CAACC,UAAU;MAC9CxC,eAAe,EAAEA,eAAe,CAACx0N,GAAG;MACpCw2N,QAAQ,EAAEvC,GAAG,CAACuC,QAAQ;MACtBF,OAAO,EAAErC,GAAG,CAACqC,OAAO;MACpBS,WAAW,EAAEpC,OAAO,CAACoC;IACvB,CAAC,CAAC;IACF9C,GAAG,CAAC4C,WAAW,GAAGF,mBAAmB,CAACE,WAAW;IACjD5C,GAAG,CAACgD,KAAK,GAAGN,mBAAmB,CAACM,KAAK;IACrChD,GAAG,CAACiD,MAAM,GAAGP,mBAAmB,CAACO,MAAM;IAEvC,OAAOjD,GAAG;EACZ;EAEAE,WAAWA,CAAA,EAAG;IACZ,IAAIzyN,KAAK,GAAG,IAAI,CAACA,KAAK;IACtB,MAAMy1N,WAAW,GAAGz1N,KAAK,CAAC3C,MAAM;IAChC,IAAIuiB,MAAM,GAAG,CAAC;IAId,OAAOA,MAAM,GAAG61M,WAAW,IAAIz1N,KAAK,CAAC4f,MAAM,CAAC,KAAK,CAAC,EAAE;MAClD,EAAEA,MAAM;IACV;IACA,IAAIA,MAAM,IAAI61M,WAAW,EAAE;MACzB,MAAM,IAAI51N,WAAW,CAAC,oBAAoB,CAAC;IAC7C;IACA,IAAI+f,MAAM,KAAK,CAAC,EAAE;MAChBzjB,IAAI,CAAC,qBAAqB,CAAC;MAC3B6D,KAAK,GAAGA,KAAK,CAACY,QAAQ,CAACgf,MAAM,CAAC;MAC9B,IAAI,CAAC5f,KAAK,GAAGA,KAAK;IACpB;IACA,MAAM4mC,KAAK,GAAG5mC,KAAK,CAAC,CAAC,CAAC;IACtB,MAAM6mC,KAAK,GAAG7mC,KAAK,CAAC,CAAC,CAAC;IACtB,MAAM01N,OAAO,GAAG11N,KAAK,CAAC,CAAC,CAAC;IACxB,MAAM21N,OAAO,GAAG31N,KAAK,CAAC,CAAC,CAAC;IACxB,MAAMk9C,MAAM,GAAG,IAAI04K,SAAS,CAAChvL,KAAK,EAAEC,KAAK,EAAE6uL,OAAO,EAAEC,OAAO,CAAC;IAC5D,OAAO;MAAEr3N,GAAG,EAAE4+C,MAAM;MAAEruB,MAAM,EAAE6mM;IAAQ,CAAC;EACzC;EAEA1C,SAASA,CAACjkN,IAAI,EAAE;IACd,MAAM4qB,IAAI,GAAG,IAAIC,QAAQ,CAAC7qB,IAAI,CAACtN,MAAM,EAAEsN,IAAI,CAAC62B,UAAU,EAAE72B,IAAI,CAAC0mN,WAAW,CAAC;IACzE,IAAI/wN,GAAG,GAAG,CAAC;IAEX,SAASmxN,YAAYA,CAAA,EAAG;MACtB,IAAIr3N,KAAK,GAAGuQ,IAAI,CAACrK,GAAG,EAAE,CAAC;MACvB,IAAIlG,KAAK,KAAK,EAAE,EAAE;QAChB,OAAOs3N,iBAAiB,CAAC,CAAC;MAC5B,CAAC,MAAM,IAAIt3N,KAAK,KAAK,EAAE,EAAE;QACvBA,KAAK,GAAGm7B,IAAI,CAACo8L,QAAQ,CAACrxN,GAAG,CAAC;QAC1BA,GAAG,IAAI,CAAC;QACR,OAAOlG,KAAK;MACd,CAAC,MAAM,IAAIA,KAAK,KAAK,EAAE,EAAE;QACvBA,KAAK,GAAGm7B,IAAI,CAAC5nB,QAAQ,CAACrN,GAAG,CAAC;QAC1BA,GAAG,IAAI,CAAC;QACR,OAAOlG,KAAK;MACd,CAAC,MAAM,IAAIA,KAAK,IAAI,EAAE,IAAIA,KAAK,IAAI,GAAG,EAAE;QACtC,OAAOA,KAAK,GAAG,GAAG;MACpB,CAAC,MAAM,IAAIA,KAAK,IAAI,GAAG,IAAIA,KAAK,IAAI,GAAG,EAAE;QACvC,OAAO,CAACA,KAAK,GAAG,GAAG,IAAI,GAAG,GAAGuQ,IAAI,CAACrK,GAAG,EAAE,CAAC,GAAG,GAAG;MAChD,CAAC,MAAM,IAAIlG,KAAK,IAAI,GAAG,IAAIA,KAAK,IAAI,GAAG,EAAE;QACvC,OAAO,EAAE,CAACA,KAAK,GAAG,GAAG,IAAI,GAAG,CAAC,GAAGuQ,IAAI,CAACrK,GAAG,EAAE,CAAC,GAAG,GAAG;MACnD;MACApI,IAAI,CAAC,yBAAyBkC,KAAK,0BAA0B,CAAC;MAC9D,OAAOuwB,GAAG;IACZ;IAEA,SAAS+mM,iBAAiBA,CAAA,EAAG;MAC3B,IAAI53N,GAAG,GAAG,EAAE;MACZ,MAAMo8B,GAAG,GAAG,EAAE;MAEd,MAAMhmB,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3C,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;MAC/C,MAAMjX,MAAM,GAAG0R,IAAI,CAAC1R,MAAM;MAC1B,OAAOqH,GAAG,GAAGrH,MAAM,EAAE;QACnB,MAAMwG,CAAC,GAAGkL,IAAI,CAACrK,GAAG,EAAE,CAAC;QACrB,MAAMwB,EAAE,GAAGrC,CAAC,IAAI,CAAC;QACjB,MAAMoC,EAAE,GAAGpC,CAAC,GAAG,EAAE;QAEjB,IAAIqC,EAAE,KAAKo0B,GAAG,EAAE;UACd;QACF;QACAp8B,GAAG,IAAIoW,MAAM,CAACpO,EAAE,CAAC;QAEjB,IAAID,EAAE,KAAKq0B,GAAG,EAAE;UACd;QACF;QACAp8B,GAAG,IAAIoW,MAAM,CAACrO,EAAE,CAAC;MACnB;MACA,OAAO2T,UAAU,CAAC1b,GAAG,CAAC;IACxB;IAEA,IAAI83N,QAAQ,GAAG,EAAE;IACjB,MAAMpoN,OAAO,GAAG,EAAE;IAElBlJ,GAAG,GAAG,CAAC;IACP,MAAMwN,GAAG,GAAGnD,IAAI,CAAC1R,MAAM;IACvB,OAAOqH,GAAG,GAAGwN,GAAG,EAAE;MAChB,IAAIrO,CAAC,GAAGkL,IAAI,CAACrK,GAAG,CAAC;MACjB,IAAIb,CAAC,IAAI,EAAE,EAAE;QACX,IAAIA,CAAC,KAAK,EAAE,EAAE;UACZA,CAAC,GAAIA,CAAC,IAAI,CAAC,GAAIkL,IAAI,CAAC,EAAErK,GAAG,CAAC;QAC5B;QACAkJ,OAAO,CAAC/M,IAAI,CAAC,CAACgD,CAAC,EAAEmyN,QAAQ,CAAC,CAAC;QAC3BA,QAAQ,GAAG,EAAE;QACb,EAAEtxN,GAAG;MACP,CAAC,MAAM;QACLsxN,QAAQ,CAACn1N,IAAI,CAACg1N,YAAY,CAAC,CAAC,CAAC;MAC/B;IACF;IACA,OAAOjoN,OAAO;EAChB;EAEA+kN,UAAUA,CAACjuN,GAAG,EAAE;IACd,MAAMuxN,QAAQ,GAAG,IAAIC,QAAQ,CAAC,CAAC;IAC/B,MAAMl2N,KAAK,GAAG,IAAI,CAACA,KAAK;IACxB,MAAMkkB,KAAK,GAAIlkB,KAAK,CAAC0E,GAAG,EAAE,CAAC,IAAI,CAAC,GAAI1E,KAAK,CAAC0E,GAAG,EAAE,CAAC;IAChD,MAAM2lD,OAAO,GAAG,EAAE;IAClB,IAAIn4C,GAAG,GAAGxN,GAAG;IACb,IAAInE,CAAC,EAAEkJ,EAAE;IAET,IAAIya,KAAK,KAAK,CAAC,EAAE;MACf,MAAMiyM,UAAU,GAAGn2N,KAAK,CAAC0E,GAAG,EAAE,CAAC;MAE/B,MAAM2/B,QAAQ,GAAG3/B,GAAG,GAAG,CAACwf,KAAK,GAAG,CAAC,IAAIiyM,UAAU,GAAG,CAAC;MAEnD,KAAK51N,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAGya,KAAK,GAAG,CAAC,EAAE3jB,CAAC,GAAGkJ,EAAE,EAAE,EAAElJ,CAAC,EAAE;QACvC,IAAIqf,MAAM,GAAG,CAAC;QACd,KAAK,IAAIpD,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG25M,UAAU,EAAE,EAAE35M,CAAC,EAAE;UACnCoD,MAAM,KAAK,CAAC;UACZA,MAAM,IAAI5f,KAAK,CAAC0E,GAAG,EAAE,CAAC;QACxB;QACA2lD,OAAO,CAACxpD,IAAI,CAACwjC,QAAQ,GAAGzkB,MAAM,CAAC;MACjC;MACA1N,GAAG,GAAGm4C,OAAO,CAACnmC,KAAK,CAAC;IACtB;IACA,KAAK3jB,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAG4gD,OAAO,CAAChtD,MAAM,GAAG,CAAC,EAAEkD,CAAC,GAAGkJ,EAAE,EAAE,EAAElJ,CAAC,EAAE;MAChD,MAAM61N,WAAW,GAAG/rK,OAAO,CAAC9pD,CAAC,CAAC;MAC9B,MAAM81N,SAAS,GAAGhsK,OAAO,CAAC9pD,CAAC,GAAG,CAAC,CAAC;MAChC01N,QAAQ,CAAChmN,GAAG,CAACjQ,KAAK,CAACY,QAAQ,CAACw1N,WAAW,EAAEC,SAAS,CAAC,CAAC;IACtD;IACA,OAAO;MAAE/3N,GAAG,EAAE23N,QAAQ;MAAEpnM,MAAM,EAAE3c;IAAI,CAAC;EACvC;EAEAmhN,cAAcA,CAACn0L,KAAK,EAAE;IACpB,MAAMk0L,KAAK,GAAG,EAAE;IAChB,KAAK,IAAI7yN,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAGy1B,KAAK,CAAChb,KAAK,EAAE3jB,CAAC,GAAGkJ,EAAE,EAAE,EAAElJ,CAAC,EAAE;MAC7C,MAAMrB,IAAI,GAAGggC,KAAK,CAACh1B,GAAG,CAAC3J,CAAC,CAAC;MACzB6yN,KAAK,CAACvyN,IAAI,CAACd,aAAa,CAACb,IAAI,CAAC,CAAC;IACjC;IACA,OAAOk0N,KAAK;EACd;EAEAE,gBAAgBA,CAACp0L,KAAK,EAAE;IACtB,MAAMkgC,OAAO,GAAG,IAAIk3J,UAAU,CAAC,CAAC;IAChC,KAAK,IAAI/1N,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAGy1B,KAAK,CAAChb,KAAK,EAAE3jB,CAAC,GAAGkJ,EAAE,EAAE,EAAElJ,CAAC,EAAE;MAC7C,MAAMwU,IAAI,GAAGmqB,KAAK,CAACh1B,GAAG,CAAC3J,CAAC,CAAC;MACzB6+D,OAAO,CAACnvD,GAAG,CAAClQ,aAAa,CAACgV,IAAI,CAAC,CAAC;IAClC;IACA,OAAOqqD,OAAO;EAChB;EAEA8zJ,UAAUA,CAACqD,IAAI,EAAExnN,IAAI,EAAEqwD,OAAO,EAAE;IAC9B,MAAMo3J,OAAO,GAAG,IAAID,IAAI,CAACn3J,OAAO,CAAC;IACjC,KAAK,MAAM,CAAC7xD,GAAG,EAAE/O,KAAK,CAAC,IAAIuQ,IAAI,EAAE;MAC/BynN,OAAO,CAACC,QAAQ,CAAClpN,GAAG,EAAE/O,KAAK,CAAC;IAC9B;IACA,OAAOg4N,OAAO;EAChB;EAEAE,eAAeA,CAACjrL,KAAK,EAAE12B,IAAI,EAAEqgN,cAAc,EAAEtC,eAAe,EAAE;IAC5D,IAAI,CAAC/9M,IAAI,IAAI02B,KAAK,CAACkrL,SAAS,GAAGxF,gBAAgB,EAAE;MAC/C,OAAO,KAAK;IACd;IACA,MAAMx3L,IAAI,GAAG,IAAIC,QAAQ,CAAC7kB,IAAI,CAACtT,MAAM,EAAEsT,IAAI,CAAC6wB,UAAU,EAAE7wB,IAAI,CAAC0gN,WAAW,CAAC;IACzE,IAAImB,SAAS,GAAGnrL,KAAK,CAACmrL,SAAS;IAC/B,MAAMl6K,KAAK,GAAGjR,KAAK,CAACiR,KAAK;IAEzB,IAAIr/C,MAAM,GAAG0X,IAAI,CAAC1X,MAAM;IAExB,KAAK,IAAImf,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGnf,MAAM,GAAI;MAC5B,MAAMmB,KAAK,GAAGuW,IAAI,CAACyH,CAAC,EAAE,CAAC;MACvB,IAAIq6M,iBAAiB,GAAG,IAAI;MAC5B,IAAIr4N,KAAK,KAAK,EAAE,EAAE;QAChB,MAAM6nB,CAAC,GAAGtR,IAAI,CAACyH,CAAC,EAAE,CAAC;QACnB,IAAI6J,CAAC,KAAK,CAAC,EAAE;UAMXtR,IAAI,CAACyH,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG;UACjBzH,IAAI,CAACyH,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;UAChBo6M,SAAS,GAAG,CAAC;QACf,CAAC,MAAM;UACLC,iBAAiB,GAAG5E,0BAA0B,CAAC5rM,CAAC,CAAC;QACnD;MACF,CAAC,MAAM,IAAI7nB,KAAK,KAAK,EAAE,EAAE;QAEvBk+C,KAAK,CAACk6K,SAAS,CAAC,GAAGj9L,IAAI,CAACo8L,QAAQ,CAACv5M,CAAC,CAAC;QACnCA,CAAC,IAAI,CAAC;QACNo6M,SAAS,EAAE;MACb,CAAC,MAAM,IAAIp4N,KAAK,KAAK,EAAE,EAAE;QACvB,IAAIo4N,SAAS,IAAI,CAAC,EAAE;UAClBA,SAAS,IAAI,CAAC;UACd,IAAI,IAAI,CAACtE,mBAAmB,EAAE;YAC5B7mL,KAAK,CAACqrL,IAAI,GAAGp6K,KAAK,CAAC11C,KAAK,CAAC4vN,SAAS,EAAEA,SAAS,GAAG,CAAC,CAAC;YAClD,OAAO,KAAK;UACd;QACF;QACAC,iBAAiB,GAAGhF,wBAAwB,CAACrzN,KAAK,CAAC;MACrD,CAAC,MAAM,IAAIA,KAAK,IAAI,EAAE,IAAIA,KAAK,IAAI,GAAG,EAAE;QAEtCk+C,KAAK,CAACk6K,SAAS,CAAC,GAAGp4N,KAAK,GAAG,GAAG;QAC9Bo4N,SAAS,EAAE;MACb,CAAC,MAAM,IAAIp4N,KAAK,IAAI,GAAG,IAAIA,KAAK,IAAI,GAAG,EAAE;QAEvCk+C,KAAK,CAACk6K,SAAS,CAAC,GACdp4N,KAAK,GAAG,GAAG,GACP,CAAEA,KAAK,GAAG,GAAG,IAAK,CAAC,IAAIuW,IAAI,CAACyH,CAAC,CAAC,GAAG,GAAG,GACpC,EAAGhe,KAAK,GAAG,GAAG,IAAK,CAAC,CAAC,GAAGuW,IAAI,CAACyH,CAAC,CAAC,GAAG,GAAG;QAC3CA,CAAC,EAAE;QACHo6M,SAAS,EAAE;MACb,CAAC,MAAM,IAAIp4N,KAAK,KAAK,GAAG,EAAE;QAExBk+C,KAAK,CAACk6K,SAAS,CAAC,GAAGj9L,IAAI,CAAC5nB,QAAQ,CAACyK,CAAC,CAAC,GAAG,KAAK;QAC3CA,CAAC,IAAI,CAAC;QACNo6M,SAAS,EAAE;MACb,CAAC,MAAM,IAAIp4N,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAK,EAAE,EAAE;QACvCitC,KAAK,CAAC6hC,KAAK,IAAIspJ,SAAS,IAAI,CAAC;QAC7B,IAAInrL,KAAK,CAAC6hC,KAAK,KAAK,CAAC,EAAE;UAErBv4D,IAAI,CAAC23C,UAAU,CAAClwC,CAAC,GAAG,CAAC,EAAEA,CAAC,EAAE,CAAC,CAAC,CAAC;UAC7BA,CAAC,IAAI,CAAC;UACNnf,MAAM,IAAI,CAAC;UACX;QACF;QAEAmf,CAAC,IAAKivB,KAAK,CAAC6hC,KAAK,GAAG,CAAC,IAAK,CAAC;QAC3BspJ,SAAS,IAAI,CAAC;QACdC,iBAAiB,GAAGhF,wBAAwB,CAACrzN,KAAK,CAAC;MACrD,CAAC,MAAM,IAAIA,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAK,EAAE,EAAE;QACvC,MAAM82N,UAAU,GAAG92N,KAAK,KAAK,EAAE,GAAG42N,cAAc,GAAGtC,eAAe;QAClE,IAAI,CAACwC,UAAU,EAAE;UACfuB,iBAAiB,GAAGhF,wBAAwB,CAACrzN,KAAK,CAAC;UACnDlC,IAAI,CAAC,yBAAyB,GAAGu6N,iBAAiB,CAACt/J,EAAE,CAAC;UACtD,OAAO,KAAK;QACd;QACA,IAAIw/J,IAAI,GAAG,KAAK;QAChB,IAAIzB,UAAU,CAACpxM,KAAK,GAAG,IAAI,EAAE;UAC3B6yM,IAAI,GAAG,GAAG;QACZ,CAAC,MAAM,IAAIzB,UAAU,CAACpxM,KAAK,GAAG,KAAK,EAAE;UACnC6yM,IAAI,GAAG,IAAI;QACb;QACA,MAAMC,UAAU,GAAGt6K,KAAK,CAAC,EAAEk6K,SAAS,CAAC,GAAGG,IAAI;QAC5C,IACEC,UAAU,GAAG,CAAC,IACdA,UAAU,IAAI1B,UAAU,CAACpxM,KAAK,IAC9BrK,KAAK,CAACm9M,UAAU,CAAC,EACjB;UACAH,iBAAiB,GAAGhF,wBAAwB,CAACrzN,KAAK,CAAC;UACnDlC,IAAI,CAAC,8BAA8B,GAAGu6N,iBAAiB,CAACt/J,EAAE,CAAC;UAC3D,OAAO,KAAK;QACd;QACA9rB,KAAK,CAACmrL,SAAS,GAAGA,SAAS;QAC3BnrL,KAAK,CAACkrL,SAAS,EAAE;QACjB,MAAMM,KAAK,GAAG,IAAI,CAACP,eAAe,CAChCjrL,KAAK,EACL6pL,UAAU,CAACprN,GAAG,CAAC8sN,UAAU,CAAC,EAC1B5B,cAAc,EACdtC,eACF,CAAC;QACD,IAAI,CAACmE,KAAK,EAAE;UACV,OAAO,KAAK;QACd;QACAxrL,KAAK,CAACkrL,SAAS,EAAE;QACjBC,SAAS,GAAGnrL,KAAK,CAACmrL,SAAS;QAC3B;MACF,CAAC,MAAM,IAAIp4N,KAAK,KAAK,EAAE,EAAE;QACvBitC,KAAK,CAACmrL,SAAS,GAAGA,SAAS;QAC3B,OAAO,IAAI;MACb,CAAC,MAAM,IAAIp4N,KAAK,KAAK,CAAC,IAAIge,CAAC,KAAKzH,IAAI,CAAC1X,MAAM,EAAE;QAI3C0X,IAAI,CAACyH,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;QAChBq6M,iBAAiB,GAAGhF,wBAAwB,CAAC,EAAE,CAAC;MAClD,CAAC,MAAM,IAAIrzN,KAAK,KAAK,CAAC,EAAE;QAEtBuW,IAAI,CAAC23C,UAAU,CAAClwC,CAAC,GAAG,CAAC,EAAEA,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7BA,CAAC,IAAI,CAAC;QACNnf,MAAM,IAAI,CAAC;QACX;MACF,CAAC,MAAM;QACLw5N,iBAAiB,GAAGhF,wBAAwB,CAACrzN,KAAK,CAAC;MACrD;MACA,IAAIq4N,iBAAiB,EAAE;QACrB,IAAIA,iBAAiB,CAAC9E,IAAI,EAAE;UAC1BtmL,KAAK,CAAC6hC,KAAK,IAAIspJ,SAAS,IAAI,CAAC;UAC7B,IAAIp4N,KAAK,KAAK,CAAC,IAAIA,KAAK,KAAK,EAAE,EAAE;YAE/BitC,KAAK,CAACyrL,SAAS,GAAG,IAAI;UACxB,CAAC,MAAM,IAAIzrL,KAAK,CAACyrL,SAAS,KAAK14N,KAAK,KAAK,CAAC,IAAIA,KAAK,KAAK,EAAE,CAAC,EAAE;YAI3DlC,IAAI,CAAC,mCAAmC,CAAC;YACzCyY,IAAI,CAACyH,CAAC,GAAG,CAAC,CAAC,GAAGhe,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;UACpC;QACF;QACA,IAAIo4N,SAAS,GAAGC,iBAAiB,CAACn2N,GAAG,EAAE;UACrCpE,IAAI,CACF,4BAA4B,GAC1Bu6N,iBAAiB,CAACt/J,EAAE,GACpB,YAAY,GACZq/J,SAAS,GACT,cAAc,GACdC,iBAAiB,CAACn2N,GACtB,CAAC;UAED,IAAIk2N,SAAS,KAAK,CAAC,EAAE;YAInB7hN,IAAI,CAACyH,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;YAChB,OAAO,IAAI;UACb;UACA,OAAO,KAAK;QACd;QACA,IAAIivB,KAAK,CAAC0rL,kBAAkB,IAAIN,iBAAiB,CAAC/E,aAAa,EAAE;UAC/DrmL,KAAK,CAAC0rL,kBAAkB,GAAG,KAAK;UAGhCP,SAAS,IAAIC,iBAAiB,CAACn2N,GAAG;UAClC,IAAIk2N,SAAS,IAAI,CAAC,IAAIC,iBAAiB,CAAC9E,IAAI,EAAE;YAE5C6E,SAAS,IAAI,CAAC;UAChB,CAAC,MAAM,IAAIA,SAAS,GAAG,CAAC,EAAE;YACxBt6N,IAAI,CAAC,sDAAsD,CAAC;UAC9D;UACA,IAAIs6N,SAAS,GAAG,CAAC,EAAE;YAGjBnrL,KAAK,CAACnwB,KAAK,GAAGohC,KAAK,CAACk6K,SAAS,GAAG,CAAC,CAAC;UACpC;QACF;QACA,IAAI,YAAY,IAAIC,iBAAiB,EAAE;UACrC,IAAI,SAAS,IAAIA,iBAAiB,EAAE;YAClCA,iBAAiB,CAAC1E,OAAO,CAACz1K,KAAK,EAAEk6K,SAAS,CAAC;UAC7C;UACAA,SAAS,IAAIC,iBAAiB,CAAC3E,UAAU;QAC3C,CAAC,MAAM,IACL2E,iBAAiB,CAAC/E,aAAa,IAC/B+E,iBAAiB,CAAC7E,UAAU,EAC5B;UACA4E,SAAS,GAAG,CAAC;QACf;MACF;IACF;IACA,IAAIv5N,MAAM,GAAG0X,IAAI,CAAC1X,MAAM,EAAE;MACxB0X,IAAI,CAAC7d,IAAI,CAAiB,EAAE,EAAEmG,MAAM,CAAC;IACvC;IACAouC,KAAK,CAACmrL,SAAS,GAAGA,SAAS;IAC3B,OAAO,IAAI;EACb;EAEA1B,gBAAgBA,CAAC;IACfC,WAAW;IACXC,cAAc;IACdtC,eAAe;IACfgC,QAAQ;IACRF,OAAO;IACPS;EACF,CAAC,EAAE;IACD,MAAME,KAAK,GAAG,EAAE;IAChB,MAAMC,MAAM,GAAG,EAAE;IACjB,MAAMtxM,KAAK,GAAGixM,WAAW,CAACjxM,KAAK;IAC/B,KAAK,IAAI3jB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2jB,KAAK,EAAE3jB,CAAC,EAAE,EAAE;MAC9B,MAAM62N,UAAU,GAAGjC,WAAW,CAACjrN,GAAG,CAAC3J,CAAC,CAAC;MACrC,MAAMkrC,KAAK,GAAG;QACZkrL,SAAS,EAAE,CAAC;QACZC,SAAS,EAAE,CAAC;QACZl6K,KAAK,EAAE,EAAE;QACT4wB,KAAK,EAAE,CAAC;QACR6pJ,kBAAkB,EAAE,IAAI;QACxBL,IAAI,EAAE,IAAI;QACVx7M,KAAK,EAAE,IAAI;QACX47M,SAAS,EAAE;MACb,CAAC;MACD,IAAID,KAAK,GAAG,IAAI;MAChB,IAAII,cAAc,GAAG,IAAI;MACzB,IAAIC,gBAAgB,GAAGjC,WAAW;MAClC,IAAIP,QAAQ,IAAIF,OAAO,CAACv3N,MAAM,EAAE;QAC9B,MAAMk6N,OAAO,GAAGzC,QAAQ,CAAC0C,UAAU,CAACj3N,CAAC,CAAC;QACtC,IAAIg3N,OAAO,KAAK,CAAC,CAAC,EAAE;UAClBj7N,IAAI,CAAC,kCAAkC,CAAC;UACxC26N,KAAK,GAAG,KAAK;QACf;QACA,IAAIM,OAAO,IAAI3C,OAAO,CAACv3N,MAAM,EAAE;UAC7Bf,IAAI,CAAC,mCAAmC,CAAC;UACzC26N,KAAK,GAAG,KAAK;QACf;QACA,IAAIA,KAAK,EAAE;UACTK,gBAAgB,GAAG1C,OAAO,CAAC2C,OAAO,CAAC,CAAClC,WAAW;UAC/CgC,cAAc,GAAGC,gBAAgB,CAAChC,UAAU;QAC9C;MACF,CAAC,MAAM,IAAIF,cAAc,EAAE;QACzBiC,cAAc,GAAGjC,cAAc;MACjC;MACA,IAAI6B,KAAK,EAAE;QACTA,KAAK,GAAG,IAAI,CAACP,eAAe,CAC1BjrL,KAAK,EACL2rL,UAAU,EACVC,cAAc,EACdvE,eACF,CAAC;MACH;MACA,IAAIrnL,KAAK,CAACnwB,KAAK,KAAK,IAAI,EAAE;QACxB,MAAMm8M,YAAY,GAAGH,gBAAgB,CAACr6L,SAAS,CAAC,eAAe,CAAC;QAChEu4L,MAAM,CAACj1N,CAAC,CAAC,GAAGk3N,YAAY,GAAGhsL,KAAK,CAACnwB,KAAK;MACxC,CAAC,MAAM;QACL,MAAMo8M,YAAY,GAAGJ,gBAAgB,CAACr6L,SAAS,CAAC,eAAe,CAAC;QAChEu4L,MAAM,CAACj1N,CAAC,CAAC,GAAGm3N,YAAY;MAC1B;MACA,IAAIjsL,KAAK,CAACqrL,IAAI,KAAK,IAAI,EAAE;QACvBvB,KAAK,CAACh1N,CAAC,CAAC,GAAGkrC,KAAK,CAACqrL,IAAI;MACvB;MACA,IAAI,CAACG,KAAK,EAAE;QAEV9B,WAAW,CAACtnN,GAAG,CAACtN,CAAC,EAAE,IAAIS,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;MAC1C;IACF;IACA,OAAO;MAAEm0N,WAAW;MAAEI,KAAK;MAAEC;IAAO,CAAC;EACvC;EAEAmC,sBAAsBA,CAACC,UAAU,EAAE;IACjC,MAAMvC,WAAW,GAAG,IAAI,CAACnC,UAAU,CAAC2E,cAAc,EAAE,EAAE,EAAED,UAAU,CAACx4J,OAAO,CAAC;IAC3Ew4J,UAAU,CAACnB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/BmB,UAAU,CAACvC,WAAW,GAAGA,WAAW;EACtC;EAEA9B,gBAAgBA,CAACqE,UAAU,EAAE;IAE3B,IAAI,CAACA,UAAU,CAACnE,OAAO,CAAC,SAAS,CAAC,EAAE;MAClC,IAAI,CAACkE,sBAAsB,CAACC,UAAU,CAAC;MACvC;IACF;IACA,MAAME,aAAa,GAAGF,UAAU,CAAC36L,SAAS,CAAC,SAAS,CAAC;IAErD,IAAI,CAAC55B,KAAK,CAACuH,OAAO,CAACktN,aAAa,CAAC,IAAIA,aAAa,CAACz6N,MAAM,KAAK,CAAC,EAAE;MAC/Du6N,UAAU,CAACG,YAAY,CAAC,SAAS,CAAC;MAClC;IACF;IACA,MAAMrrN,IAAI,GAAGorN,aAAa,CAAC,CAAC,CAAC;IAC7B,MAAMl4M,MAAM,GAAGk4M,aAAa,CAAC,CAAC,CAAC;IAE/B,IAAIprN,IAAI,KAAK,CAAC,IAAIkT,MAAM,IAAI,IAAI,CAAC5f,KAAK,CAAC3C,MAAM,EAAE;MAC7C,IAAI,CAACs6N,sBAAsB,CAACC,UAAU,CAAC;MACvC;IACF;IAIA,IAAIh4M,MAAM,GAAGlT,IAAI,GAAG,IAAI,CAAC1M,KAAK,CAAC3C,MAAM,EAAE;MACrC,MAAM,IAAIwC,WAAW,CAAC,2CAA2C,CAAC;IACpE;IAEA,MAAMm4N,cAAc,GAAGp4M,MAAM,GAAGlT,IAAI;IACpC,MAAMurN,QAAQ,GAAG,IAAI,CAACj4N,KAAK,CAACY,QAAQ,CAACgf,MAAM,EAAEo4M,cAAc,CAAC;IAC5D,MAAMjpN,IAAI,GAAG,IAAI,CAACikN,SAAS,CAACiF,QAAQ,CAAC;IACrC,MAAM5C,WAAW,GAAG,IAAI,CAACnC,UAAU,CACjC2E,cAAc,EACd9oN,IAAI,EACJ6oN,UAAU,CAACx4J,OACb,CAAC;IACDw4J,UAAU,CAACvC,WAAW,GAAGA,WAAW;IAEpC,MAAM6C,SAAS,GAAG7C,WAAW,CAACp4L,SAAS,CAAC,WAAW,CAAC;IACpD,MAAMk7L,SAAS,GAAG9C,WAAW,CAACp4L,SAAS,CAAC,WAAW,CAAC;IACpD,MAAMm7L,QAAQ,GAAG/C,WAAW,CAACp4L,SAAS,CAAC,UAAU,CAAC;IAClD,MAAMo7L,eAAe,GAAGhD,WAAW,CAACp4L,SAAS,CAAC,iBAAiB,CAAC;IAChE,IACEi7L,SAAS,KAAK,CAAC,IACfC,SAAS,KAAK,CAAC,IACfC,QAAQ,KAAK,CAAC,IACdC,eAAe,KAAK,CAAC,EACrB;MAIAhD,WAAW,CAACnB,SAAS,CAAC,WAAW,EAAEzC,kBAAkB,CAAC;MACtD4D,WAAW,CAACnB,SAAS,CAAC,WAAW,EAAExC,kBAAkB,CAAC;MACtD2D,WAAW,CAACnB,SAAS,CAAC,UAAU,EAAEvC,iBAAiB,CAAC;IACtD;IAEA,IAAI0G,eAAe,KAAK,CAAC,EAAE;MAGzBhD,WAAW,CAACnB,SAAS,CAAC,iBAAiB,EAAEtC,wBAAwB,CAAC;IACpE;IACA,IAAIsG,SAAS,GAAG,CAAC,EAAE;MAWjB,IAAII,aAAa,GAAG,CAAC;MACrB,KAAK,MAAMC,KAAK,IAAI,CAClBlD,WAAW,CAACp4L,SAAS,CAAC,YAAY,CAAC,EACnCo4L,WAAW,CAACp4L,SAAS,CAAC,YAAY,CAAC,CACpC,EAAE;QACD,IAAI,CAACs7L,KAAK,EAAE;UACV;QACF;QAGA,KAAK,IAAIh4N,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGg4N,KAAK,CAACl7N,MAAM,EAAEkD,CAAC,IAAI,CAAC,EAAE;UACxC,IAAIg4N,KAAK,CAACh4N,CAAC,CAAC,GAAG+3N,aAAa,EAAE;YAC5BA,aAAa,GAAGC,KAAK,CAACh4N,CAAC,CAAC;UAC1B;QACF;MACF;MACA,IAAI+3N,aAAa,GAAG,CAAC,EAAE;QAUrB,MAAME,SAAS,GAAG,GAAG;QACrB,MAAMC,UAAU,GAAG,GAAG,GAAGH,aAAa;QACtC,MAAMI,YAAY,GAChBD,UAAU,IAAIhH,kBAAkB,GAC5BhxN,IAAI,CAACgb,IAAI,CAACg9M,UAAU,GAAGD,SAAS,CAAC,GAAGA,SAAS,GAC7C,CAACptO,QAAQ;QACf,MAAMutO,YAAY,GAAGl4N,IAAI,CAACqiB,KAAK,CAAC01M,SAAS,GAAGF,aAAa,CAAC,GAAGE,SAAS;QACtE,MAAMI,OAAO,GAAG72M,SAAS,CAACm2M,SAAS,EAAEQ,YAAY,EAAEC,YAAY,CAAC;QAChE,IAAIC,OAAO,KAAKV,SAAS,EAAE;UACzB7C,WAAW,CAACnB,SAAS,CAAC,WAAW,EAAE0E,OAAO,CAAC;QAC7C;MACF;IACF;IAGA,IAAI,CAACvD,WAAW,CAACp4L,SAAS,CAAC,OAAO,CAAC,EAAE;MACnC;IACF;IACA,MAAM47L,WAAW,GAAGxD,WAAW,CAACp4L,SAAS,CAAC,OAAO,CAAC;IAClD,MAAM67L,cAAc,GAAGl5M,MAAM,GAAGi5M,WAAW;IAE3C,IAAIA,WAAW,KAAK,CAAC,IAAIC,cAAc,IAAI,IAAI,CAAC94N,KAAK,CAAC3C,MAAM,EAAE;MAC5D,IAAI,CAACs6N,sBAAsB,CAACC,UAAU,CAAC;MACvC;IACF;IACA,MAAMtC,UAAU,GAAG,IAAI,CAAC3C,UAAU,CAACmG,cAAc,CAAC;IAClDzD,WAAW,CAACC,UAAU,GAAGA,UAAU,CAACh3N,GAAG;EACzC;EAEAu2N,aAAaA,CAACnwN,GAAG,EAAErH,MAAM,EAAE+hE,OAAO,EAAE25J,GAAG,EAAE;IACvC,IAAIr0N,GAAG,KAAK,CAAC,EAAE;MACb,OAAO,IAAIs0N,UAAU,CACnB,IAAI,EACJC,yBAAyB,CAACC,SAAS,EACnC5I,eACF,CAAC;IACH,CAAC,MAAM,IAAI5rN,GAAG,KAAK,CAAC,EAAE;MACpB,OAAO,IAAIs0N,UAAU,CACnB,IAAI,EACJC,yBAAyB,CAACE,MAAM,EAChC5I,aACF,CAAC;IACH,CAAC,MAAM,IAAI7rN,GAAG,KAAK,CAAC,EAAE;MACpB,OAAO,IAAIs0N,UAAU,CACnB,IAAI,EACJC,yBAAyB,CAACG,aAAa,EACvC5I,mBACF,CAAC;IACH;IAEA,MAAM;MAAExwN;IAAM,CAAC,GAAG,IAAI;IACtB,MAAMq5N,MAAM,GAAGr5N,KAAK,CAAC0E,GAAG,EAAE,CAAC;IAC3B,MAAM8vN,OAAO,GAAG,CAACuE,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC;IACrC,IAAIxhK,EAAE,EAAErzC,KAAK,EAAE3jB,CAAC;IAGhBlD,MAAM,IAAI,CAAC;IAEX,QAAQg8N,MAAM;MACZ,KAAK,CAAC;QACJ,KAAK94N,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGlD,MAAM,EAAEkD,CAAC,EAAE,EAAE;UAC3Bg3D,EAAE,GAAIv3D,KAAK,CAAC0E,GAAG,EAAE,CAAC,IAAI,CAAC,GAAI1E,KAAK,CAAC0E,GAAG,EAAE,CAAC;UACvC8vN,OAAO,CAAC3zN,IAAI,CAACk4N,GAAG,GAAGxhK,EAAE,GAAG6H,OAAO,CAACl1D,GAAG,CAACqtD,EAAE,CAAC,CAAC;QAC1C;QACA;MACF,KAAK,CAAC;QACJ,OAAOi9J,OAAO,CAACn3N,MAAM,IAAIA,MAAM,EAAE;UAC/Bk6D,EAAE,GAAIv3D,KAAK,CAAC0E,GAAG,EAAE,CAAC,IAAI,CAAC,GAAI1E,KAAK,CAAC0E,GAAG,EAAE,CAAC;UACvCwf,KAAK,GAAGlkB,KAAK,CAAC0E,GAAG,EAAE,CAAC;UACpB,KAAKnE,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI2jB,KAAK,EAAE3jB,CAAC,EAAE,EAAE;YAC3Bi0N,OAAO,CAAC3zN,IAAI,CAACk4N,GAAG,GAAGxhK,EAAE,EAAE,GAAG6H,OAAO,CAACl1D,GAAG,CAACqtD,EAAE,EAAE,CAAC,CAAC;UAC9C;QACF;QACA;MACF,KAAK,CAAC;QACJ,OAAOi9J,OAAO,CAACn3N,MAAM,IAAIA,MAAM,EAAE;UAC/Bk6D,EAAE,GAAIv3D,KAAK,CAAC0E,GAAG,EAAE,CAAC,IAAI,CAAC,GAAI1E,KAAK,CAAC0E,GAAG,EAAE,CAAC;UACvCwf,KAAK,GAAIlkB,KAAK,CAAC0E,GAAG,EAAE,CAAC,IAAI,CAAC,GAAI1E,KAAK,CAAC0E,GAAG,EAAE,CAAC;UAC1C,KAAKnE,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI2jB,KAAK,EAAE3jB,CAAC,EAAE,EAAE;YAC3Bi0N,OAAO,CAAC3zN,IAAI,CAACk4N,GAAG,GAAGxhK,EAAE,EAAE,GAAG6H,OAAO,CAACl1D,GAAG,CAACqtD,EAAE,EAAE,CAAC,CAAC;UAC9C;QACF;QACA;MACF;QACE,MAAM,IAAI13D,WAAW,CAAC,wBAAwB,CAAC;IACnD;IAEA,OAAO,IAAIm5N,UAAU,CAAC,KAAK,EAAEK,MAAM,EAAE7E,OAAO,CAAC;EAC/C;EAEAQ,aAAaA,CAACtwN,GAAG,EAAEoK,UAAU,EAAEswD,OAAO,EAAEo1J,OAAO,EAAE;IAC/C,MAAMlhN,QAAQ,GAAG5U,MAAM,CAAC4M,MAAM,CAAC,IAAI,CAAC;IACpC,MAAMtL,KAAK,GAAG,IAAI,CAACA,KAAK;IACxB,IAAIs5N,UAAU,GAAG,KAAK;IACtB,IAAID,MAAM,EAAE94N,CAAC,EAAEkJ,EAAE;IACjB,IAAI8vN,GAAG,GAAG,IAAI;IAEd,SAASC,cAAcA,CAAA,EAAG;MACxB,MAAMC,gBAAgB,GAAGz5N,KAAK,CAAC0E,GAAG,EAAE,CAAC;MACrC,KAAKnE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGk5N,gBAAgB,EAAEl5N,CAAC,EAAE,EAAE;QACrC,MAAMjB,IAAI,GAAGU,KAAK,CAAC0E,GAAG,EAAE,CAAC;QACzB,MAAMg1N,GAAG,GAAG,CAAC15N,KAAK,CAAC0E,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK1E,KAAK,CAAC0E,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;QACvD4O,QAAQ,CAAChU,IAAI,CAAC,GAAGk1N,OAAO,CAACxlJ,OAAO,CAAC5P,OAAO,CAACl1D,GAAG,CAACwvN,GAAG,CAAC,CAAC;MACpD;IACF;IAEA,IAAIh1N,GAAG,KAAK,CAAC,IAAIA,GAAG,KAAK,CAAC,EAAE;MAC1B40N,UAAU,GAAG,IAAI;MACjBD,MAAM,GAAG30N,GAAG;MACZ,MAAMqqN,YAAY,GAAGrqN,GAAG,GAAGgwE,cAAc,GAAGG,gBAAgB;MAC5D,KAAKt0E,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAG+qN,OAAO,CAACn3N,MAAM,EAAEkD,CAAC,GAAGkJ,EAAE,EAAElJ,CAAC,EAAE,EAAE;QAC5C,MAAM2+B,KAAK,GAAG6vL,YAAY,CAAC//I,OAAO,CAACwlJ,OAAO,CAACj0N,CAAC,CAAC,CAAC;QAC9C,IAAI2+B,KAAK,KAAK,CAAC,CAAC,EAAE;UAChB5rB,QAAQ,CAAC4rB,KAAK,CAAC,GAAG3+B,CAAC;QACrB;MACF;IACF,CAAC,MAAM;MACL,MAAMo5N,SAAS,GAAGj1N,GAAG;MACrB20N,MAAM,GAAGr5N,KAAK,CAAC0E,GAAG,EAAE,CAAC;MACrB,QAAQ20N,MAAM,GAAG,IAAI;QACnB,KAAK,CAAC;UACJ,MAAMO,WAAW,GAAG55N,KAAK,CAAC0E,GAAG,EAAE,CAAC;UAChC,KAAKnE,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIq5N,WAAW,EAAEr5N,CAAC,EAAE,EAAE;YACjC+S,QAAQ,CAACtT,KAAK,CAAC0E,GAAG,EAAE,CAAC,CAAC,GAAGnE,CAAC;UAC5B;UACA;QAEF,KAAK,CAAC;UACJ,MAAMs5N,WAAW,GAAG75N,KAAK,CAAC0E,GAAG,EAAE,CAAC;UAChC,IAAIo1N,GAAG,GAAG,CAAC;UACX,KAAKv5N,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGs5N,WAAW,EAAEt5N,CAAC,EAAE,EAAE;YAChC,MAAMiS,KAAK,GAAGxS,KAAK,CAAC0E,GAAG,EAAE,CAAC;YAC1B,MAAMoqD,IAAI,GAAG9uD,KAAK,CAAC0E,GAAG,EAAE,CAAC;YACzB,KAAK,IAAI8X,CAAC,GAAGhK,KAAK,EAAEgK,CAAC,IAAIhK,KAAK,GAAGs8C,IAAI,EAAEtyC,CAAC,EAAE,EAAE;cAC1ClJ,QAAQ,CAACkJ,CAAC,CAAC,GAAGs9M,GAAG,EAAE;YACrB;UACF;UACA;QAEF;UACE,MAAM,IAAIj6N,WAAW,CAAC,4BAA4Bw5N,MAAM,SAAS,CAAC;MACtE;MACA,MAAMU,OAAO,GAAGr1N,GAAG;MACnB,IAAI20N,MAAM,GAAG,IAAI,EAAE;QAOjBr5N,KAAK,CAAC25N,SAAS,CAAC,IAAI,IAAI;QACxBH,cAAc,CAAC,CAAC;MAClB;MACAD,GAAG,GAAGv5N,KAAK,CAACY,QAAQ,CAAC+4N,SAAS,EAAEI,OAAO,CAAC;IAC1C;IACAV,MAAM,IAAI,IAAI;IACd,OAAO,IAAIW,WAAW,CAACV,UAAU,EAAED,MAAM,EAAE/lN,QAAQ,EAAEimN,GAAG,CAAC;EAC3D;EAEAxE,aAAaA,CAACrwN,GAAG,EAAErH,MAAM,EAAE;IACzB,MAAM2C,KAAK,GAAG,IAAI,CAACA,KAAK;IACxB,MAAMq5N,MAAM,GAAGr5N,KAAK,CAAC0E,GAAG,EAAE,CAAC;IAC3B,MAAMowN,QAAQ,GAAG,EAAE;IACnB,IAAIv0N,CAAC;IAEL,QAAQ84N,MAAM;MACZ,KAAK,CAAC;QACJ,KAAK94N,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGlD,MAAM,EAAE,EAAEkD,CAAC,EAAE;UAC3B,MAAMg3D,EAAE,GAAGv3D,KAAK,CAAC0E,GAAG,EAAE,CAAC;UACvBowN,QAAQ,CAACj0N,IAAI,CAAC02D,EAAE,CAAC;QACnB;QACA;MACF,KAAK,CAAC;QACJ,MAAMsiK,WAAW,GAAI75N,KAAK,CAAC0E,GAAG,EAAE,CAAC,IAAI,CAAC,GAAI1E,KAAK,CAAC0E,GAAG,EAAE,CAAC;QACtD,KAAKnE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGs5N,WAAW,EAAE,EAAEt5N,CAAC,EAAE;UAChC,IAAIqG,KAAK,GAAI5G,KAAK,CAAC0E,GAAG,EAAE,CAAC,IAAI,CAAC,GAAI1E,KAAK,CAAC0E,GAAG,EAAE,CAAC;UAC9C,IAAInE,CAAC,KAAK,CAAC,IAAIqG,KAAK,KAAK,CAAC,EAAE;YAC1BtK,IAAI,CACF,2DAA2D,GACzD,wBACJ,CAAC;YACDsK,KAAK,GAAG,CAAC;UACX;UACA,MAAM2wN,OAAO,GAAGv3N,KAAK,CAAC0E,GAAG,EAAE,CAAC;UAC5B,MAAM06C,IAAI,GAAIp/C,KAAK,CAAC0E,GAAG,CAAC,IAAI,CAAC,GAAI1E,KAAK,CAAC0E,GAAG,GAAG,CAAC,CAAC;UAC/C,KAAK,IAAI8X,CAAC,GAAG5V,KAAK,EAAE4V,CAAC,GAAG4iC,IAAI,EAAE,EAAE5iC,CAAC,EAAE;YACjCs4M,QAAQ,CAACj0N,IAAI,CAAC02N,OAAO,CAAC;UACxB;QACF;QAEA7yN,GAAG,IAAI,CAAC;QACR;MACF;QACE,MAAM,IAAI7E,WAAW,CAAC,kCAAkCw5N,MAAM,IAAI,CAAC;IACvE;IACA,IAAIvE,QAAQ,CAACz3N,MAAM,KAAKA,MAAM,EAAE;MAC9B,MAAM,IAAIwC,WAAW,CAAC,mCAAmC,CAAC;IAC5D;IAEA,OAAO,IAAIo6N,WAAW,CAACZ,MAAM,EAAEvE,QAAQ,CAAC;EAC1C;AACF;AAGA,MAAMtC,GAAG,CAAC;EACRt1K,MAAM,GAAG,IAAI;EAEbk2K,KAAK,GAAG,EAAE;EAEVH,OAAO,GAAG,IAAI;EAEd7zJ,OAAO,GAAG,IAAIk3J,UAAU,CAAC,CAAC;EAE1BxD,eAAe,GAAG,IAAI;EAItBx/M,QAAQ,GAAG,IAAI;EAEfkhN,OAAO,GAAG,IAAI;EAEdW,WAAW,GAAG,IAAI;EAElBP,OAAO,GAAG,EAAE;EAEZE,QAAQ,GAAG,IAAI;EAEftB,SAAS,GAAG,KAAK;EAEjBI,eAAe,GAAG,CAAC;EAEnBx0N,WAAWA,CAAC86N,aAAa,GAAG,CAAC,EAAE;IAC7B,IAAI,CAACA,aAAa,GAAGA,aAAa;EACpC;EAEAC,mBAAmBA,CAAA,EAAG;IAIpB,IAAI,IAAI,CAAChF,WAAW,CAACjxM,KAAK,IAAI,KAAK,EAAE;MACnC5nB,IAAI,CAAC,2DAA2D,CAAC;MACjE;IACF;IACA,MAAM89N,SAAS,GAAG,IAAI,CAACjF,WAAW,CAACjrN,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,CAACirN,WAAW,CAACllN,GAAG,CAACmqN,SAAS,CAAC;IAC/B,IAAI,IAAI,CAAC5G,SAAS,EAAE;MAClB,IAAI,CAACsB,QAAQ,CAACA,QAAQ,CAACj0N,IAAI,CAAC,IAAI,CAACi0N,QAAQ,CAACA,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxD;EACF;EAEAuF,UAAUA,CAAC9iK,EAAE,EAAE;IACb,IAAIA,EAAE,GAAG,CAAC,IAAIA,EAAE,IAAI,IAAI,CAAC49J,WAAW,CAACjxM,KAAK,EAAE;MAC1C,OAAO,KAAK;IACd;IACA,MAAMo2M,KAAK,GAAG,IAAI,CAACnF,WAAW,CAACjrN,GAAG,CAACqtD,EAAE,CAAC;IACtC,OAAO+iK,KAAK,CAACj9N,MAAM,GAAG,CAAC;EACzB;AACF;AAEA,MAAMu4N,SAAS,CAAC;EACdx2N,WAAWA,CAACwnC,KAAK,EAAEC,KAAK,EAAE6uL,OAAO,EAAEC,OAAO,EAAE;IAC1C,IAAI,CAAC/uL,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,KAAK,GAAGA,KAAK;IAClB,IAAI,CAAC6uL,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,OAAO,GAAGA,OAAO;EACxB;AACF;AAEA,MAAMW,UAAU,CAAC;EACfl3J,OAAO,GAAG,EAAE;EAEZl1D,GAAGA,CAACg1B,KAAK,EAAE;IACT,IAAIA,KAAK,IAAI,CAAC,IAAIA,KAAK,IAAIsyL,wBAAwB,GAAG,CAAC,EAAE;MACvD,OAAOD,kBAAkB,CAACryL,KAAK,CAAC;IAClC;IACA,IAAIA,KAAK,GAAGsyL,wBAAwB,IAAI,IAAI,CAACpyJ,OAAO,CAAC/hE,MAAM,EAAE;MAC3D,OAAO,IAAI,CAAC+hE,OAAO,CAAClgC,KAAK,GAAGsyL,wBAAwB,CAAC;IACvD;IACA,OAAOD,kBAAkB,CAAC,CAAC,CAAC;EAC9B;EAEAgJ,MAAMA,CAACr8N,GAAG,EAAE;IACV,IAAIghC,KAAK,GAAGqyL,kBAAkB,CAACviJ,OAAO,CAAC9wE,GAAG,CAAC;IAC3C,IAAIghC,KAAK,KAAK,CAAC,CAAC,EAAE;MAChB,OAAOA,KAAK;IACd;IACAA,KAAK,GAAG,IAAI,CAACkgC,OAAO,CAAC4P,OAAO,CAAC9wE,GAAG,CAAC;IACjC,IAAIghC,KAAK,KAAK,CAAC,CAAC,EAAE;MAChB,OAAOA,KAAK,GAAGsyL,wBAAwB;IACzC;IACA,OAAO,CAAC,CAAC;EACX;EAEAvhN,GAAGA,CAACzR,KAAK,EAAE;IACT,IAAI,CAAC4gE,OAAO,CAACv+D,IAAI,CAACrC,KAAK,CAAC;EAC1B;EAEA,IAAI0lB,KAAKA,CAAA,EAAG;IACV,OAAO,IAAI,CAACk7C,OAAO,CAAC/hE,MAAM;EAC5B;AACF;AAEA,MAAM64N,QAAQ,CAAC;EACbsE,OAAO,GAAG,EAAE;EAEZn9N,MAAM,GAAG,CAAC;EAEV4S,GAAGA,CAAC8E,IAAI,EAAE;IACR,IAAI,CAAC1X,MAAM,IAAI0X,IAAI,CAAC1X,MAAM;IAC1B,IAAI,CAACm9N,OAAO,CAAC35N,IAAI,CAACkU,IAAI,CAAC;EACzB;EAEAlH,GAAGA,CAACqxB,KAAK,EAAEnqB,IAAI,EAAE;IACf,IAAI,CAAC1X,MAAM,IAAI0X,IAAI,CAAC1X,MAAM,GAAG,IAAI,CAACm9N,OAAO,CAACt7L,KAAK,CAAC,CAAC7hC,MAAM;IACvD,IAAI,CAACm9N,OAAO,CAACt7L,KAAK,CAAC,GAAGnqB,IAAI;EAC5B;EAEA7K,GAAGA,CAACg1B,KAAK,EAAE;IACT,OAAO,IAAI,CAACs7L,OAAO,CAACt7L,KAAK,CAAC;EAC5B;EAEA,IAAIhb,KAAKA,CAAA,EAAG;IACV,OAAO,IAAI,CAACs2M,OAAO,CAACn9N,MAAM;EAC5B;AACF;AAEA,MAAMo9N,OAAO,CAAC;EACZr7N,WAAWA,CAACs7N,MAAM,EAAEt7J,OAAO,EAAE;IAC3B,IAAI,CAACu7J,YAAY,GAAGD,MAAM,CAACC,YAAY;IACvC,IAAI,CAACC,YAAY,GAAGF,MAAM,CAACE,YAAY;IACvC,IAAI,CAACC,QAAQ,GAAGH,MAAM,CAACG,QAAQ;IAC/B,IAAI,CAACC,KAAK,GAAGJ,MAAM,CAACI,KAAK;IACzB,IAAI,CAACC,OAAO,GAAGL,MAAM,CAACK,OAAO;IAC7B,IAAI,CAACC,KAAK,GAAGN,MAAM,CAACM,KAAK;IACzB,IAAI,CAAC57J,OAAO,GAAGA,OAAO;IACtB,IAAI,CAAC1xD,MAAM,GAAGhP,MAAM,CAAC4M,MAAM,CAAC,IAAI,CAAC;EACnC;EAGAmrN,QAAQA,CAAClpN,GAAG,EAAE/O,KAAK,EAAE;IACnB,IAAI,EAAE+O,GAAG,IAAI,IAAI,CAACotN,YAAY,CAAC,EAAE;MAC/B,OAAO,KAAK;IACd;IAEA,IAAIn8N,KAAK,CAACnB,MAAM,KAAK,CAAC,EAAE;MACtB,OAAO,IAAI;IACb;IAEA,KAAK,MAAMuqB,GAAG,IAAIppB,KAAK,EAAE;MACvB,IAAIqb,KAAK,CAAC+N,GAAG,CAAC,EAAE;QACdtrB,IAAI,CAAC,2BAA2BkC,KAAK,cAAc+O,GAAG,IAAI,CAAC;QAC3D,OAAO,IAAI;MACb;IACF;IACA,MAAMriB,IAAI,GAAG,IAAI,CAAC4vO,KAAK,CAACvtN,GAAG,CAAC;IAE5B,IAAIriB,IAAI,KAAK,KAAK,IAAIA,IAAI,KAAK,KAAK,IAAIA,IAAI,KAAK,QAAQ,EAAE;MACzDsT,KAAK,GAAGA,KAAK,CAAC,CAAC,CAAC;IAClB;IACA,IAAI,CAACkP,MAAM,CAACH,GAAG,CAAC,GAAG/O,KAAK;IACxB,OAAO,IAAI;EACb;EAEA01N,SAASA,CAACh1N,IAAI,EAAEV,KAAK,EAAE;IACrB,IAAI,EAAEU,IAAI,IAAI,IAAI,CAAC07N,YAAY,CAAC,EAAE;MAChC,MAAM,IAAI/6N,WAAW,CAAC,4BAA4BX,IAAI,GAAG,CAAC;IAC5D;IACA,IAAI,CAACwO,MAAM,CAAC,IAAI,CAACktN,YAAY,CAAC17N,IAAI,CAAC,CAAC,GAAGV,KAAK;EAC9C;EAEAi1N,OAAOA,CAACv0N,IAAI,EAAE;IACZ,OAAO,IAAI,CAAC07N,YAAY,CAAC17N,IAAI,CAAC,IAAI,IAAI,CAACwO,MAAM;EAC/C;EAEAuvB,SAASA,CAAC/9B,IAAI,EAAE;IACd,IAAI,EAAEA,IAAI,IAAI,IAAI,CAAC07N,YAAY,CAAC,EAAE;MAChC,MAAM,IAAI/6N,WAAW,CAAC,2BAA2BX,IAAI,GAAG,CAAC;IAC3D;IACA,MAAMqO,GAAG,GAAG,IAAI,CAACqtN,YAAY,CAAC17N,IAAI,CAAC;IACnC,IAAI,EAAEqO,GAAG,IAAI,IAAI,CAACG,MAAM,CAAC,EAAE;MACzB,OAAO,IAAI,CAACmtN,QAAQ,CAACttN,GAAG,CAAC;IAC3B;IACA,OAAO,IAAI,CAACG,MAAM,CAACH,GAAG,CAAC;EACzB;EAEAwqN,YAAYA,CAAC74N,IAAI,EAAE;IACjB,OAAO,IAAI,CAACwO,MAAM,CAAC,IAAI,CAACktN,YAAY,CAAC17N,IAAI,CAAC,CAAC;EAC7C;EAEA,OAAO+7N,YAAYA,CAACC,MAAM,EAAE;IAC1B,MAAMR,MAAM,GAAG;MACbC,YAAY,EAAE,CAAC,CAAC;MAChBC,YAAY,EAAE,CAAC,CAAC;MAChBC,QAAQ,EAAE,CAAC,CAAC;MACZC,KAAK,EAAE,CAAC,CAAC;MACTC,OAAO,EAAE,CAAC,CAAC;MACXC,KAAK,EAAE;IACT,CAAC;IACD,KAAK,MAAMxjN,KAAK,IAAI0jN,MAAM,EAAE;MAC1B,MAAM3tN,GAAG,GAAGlK,KAAK,CAACuH,OAAO,CAAC4M,KAAK,CAAC,CAAC,CAAC,CAAC,GAC/B,CAACA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAIA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAChCA,KAAK,CAAC,CAAC,CAAC;MACZkjN,MAAM,CAACC,YAAY,CAACptN,GAAG,CAAC,GAAGiK,KAAK,CAAC,CAAC,CAAC;MACnCkjN,MAAM,CAACE,YAAY,CAACpjN,KAAK,CAAC,CAAC,CAAC,CAAC,GAAGjK,GAAG;MACnCmtN,MAAM,CAACI,KAAK,CAACvtN,GAAG,CAAC,GAAGiK,KAAK,CAAC,CAAC,CAAC;MAC5BkjN,MAAM,CAACG,QAAQ,CAACttN,GAAG,CAAC,GAAGiK,KAAK,CAAC,CAAC,CAAC;MAC/BkjN,MAAM,CAACK,OAAO,CAACxtN,GAAG,CAAC,GAAGlK,KAAK,CAACuH,OAAO,CAAC4M,KAAK,CAAC,CAAC,CAAC,CAAC,GAAGA,KAAK,CAAC,CAAC,CAAC,GAAG,CAACA,KAAK,CAAC,CAAC,CAAC,CAAC;MACrEkjN,MAAM,CAACM,KAAK,CAACn6N,IAAI,CAAC0M,GAAG,CAAC;IACxB;IACA,OAAOmtN,MAAM;EACf;AACF;AAEA,MAAMS,gBAAgB,GAAG,CACvB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAC9C,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,EACxC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,EAC3B,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,EACnC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EAC5B,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,EAC9B,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,EACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,EAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,CAAC,EAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,EAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC,EAErC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAC1C,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACnD,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EAC7B,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,EAClC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAC3B,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,EAC5B,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,EAC7B,CAAC,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,EAChC,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,EAC3C,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,EACrC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,EACvC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,EAC1C,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC,EACtC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,EACvC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,EACnC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EACnC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,EAGlC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,EACtC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,EACrC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CACpC;AAED,MAAMhI,UAAU,SAASsH,OAAO,CAAC;EAC/B,WAAWC,MAAMA,CAAA,EAAG;IAClB,OAAOr8N,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC48N,YAAY,CAACE,gBAAgB,CAAC,CAAC;EACpE;EAEA/7N,WAAWA,CAACggE,OAAO,EAAE;IACnB,KAAK,CAAC+zJ,UAAU,CAACuH,MAAM,EAAEt7J,OAAO,CAAC;IACjC,IAAI,CAACi2J,WAAW,GAAG,IAAI;EACzB;AACF;AAEA,MAAM+F,oBAAoB,GAAG,CAC3B,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAChC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAChC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EACjC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,EACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE3J,kBAAkB,CAAC,EACjD,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAEC,kBAAkB,CAAC,EAClD,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAEC,iBAAiB,CAAC,EAChD,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAC1B,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAC1B,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EACtC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EACtC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,EACjC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,EACrC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAEC,wBAAwB,CAAC,EAC9D,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,EACzC,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,EAC/B,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,EAC/B,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAC9B;AAED,MAAMiG,cAAc,SAAS4C,OAAO,CAAC;EACnC,WAAWC,MAAMA,CAAA,EAAG;IAClB,OAAOr8N,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC48N,YAAY,CAACG,oBAAoB,CAAC,CAAC;EACxE;EAEAh8N,WAAWA,CAACggE,OAAO,EAAE;IACnB,KAAK,CAACy4J,cAAc,CAAC6C,MAAM,EAAEt7J,OAAO,CAAC;IACrC,IAAI,CAACk2J,UAAU,GAAG,IAAI;EACxB;AACF;AAEA,MAAM2D,yBAAyB,GAAG;EAChCC,SAAS,EAAE,CAAC;EACZC,MAAM,EAAE,CAAC;EACTC,aAAa,EAAE;AACjB,CAAC;AAED,MAAMJ,UAAU,CAAC;EACf55N,WAAWA,CAACk6N,UAAU,EAAED,MAAM,EAAE7E,OAAO,EAAE;IACvC,IAAI,CAAC8E,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAAC7E,OAAO,GAAGA,OAAO;EACxB;AACF;AAEA,MAAMwF,WAAW,CAAC;EAChB56N,WAAWA,CAACk6N,UAAU,EAAED,MAAM,EAAE/lN,QAAQ,EAAEimN,GAAG,EAAE;IAC7C,IAAI,CAACD,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAAC/lN,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACimN,GAAG,GAAGA,GAAG;EAChB;AACF;AAEA,MAAMU,WAAW,CAAC;EAChB76N,WAAWA,CAACi6N,MAAM,EAAEvE,QAAQ,EAAE;IAC5B,IAAI,CAACuE,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACvE,QAAQ,GAAGA,QAAQ;EAC1B;EAEA0C,UAAUA,CAAC6D,UAAU,EAAE;IACrB,IAAIA,UAAU,GAAG,CAAC,IAAIA,UAAU,IAAI,IAAI,CAACvG,QAAQ,CAACz3N,MAAM,EAAE;MACxD,OAAO,CAAC,CAAC;IACX;IACA,OAAO,IAAI,CAACy3N,QAAQ,CAACuG,UAAU,CAAC;EAClC;AACF;AAIA,MAAMC,gBAAgB,CAAC;EACrBjxK,OAAO,GAAG3rD,MAAM,CAAC4M,MAAM,CAAC,IAAI,CAAC;EAE7BiwN,UAAUA,CAAChuN,GAAG,EAAE;IACd,OAAOA,GAAG,IAAI,IAAI,CAAC88C,OAAO;EAC5B;EAEAmxK,KAAKA,CAACjuN,GAAG,EAAEkuN,QAAQ,EAAE;IACnB,IAAIluN,GAAG,IAAI,IAAI,CAAC88C,OAAO,EAAE;MACvB,MAAM,IAAIxqD,WAAW,CAAC,gCAAgC0N,GAAG,EAAE,CAAC;IAC9D;IACA,IAAI,CAAC88C,OAAO,CAAC98C,GAAG,CAAC,GAAGkuN,QAAQ;EAC9B;EAEA77M,MAAMA,CAACphB,KAAK,EAAE;IACZ,KAAK,MAAM+O,GAAG,IAAI,IAAI,CAAC88C,OAAO,EAAE;MAC9B,IAAI,CAACA,OAAO,CAAC98C,GAAG,CAAC,IAAI/O,KAAK;IAC5B;EACF;EAEAk9N,gBAAgBA,CAACnuN,GAAG,EAAEG,MAAM,EAAEnI,MAAM,EAAE;IACpC,IAAI,EAAEgI,GAAG,IAAI,IAAI,CAAC88C,OAAO,CAAC,EAAE;MAC1B,MAAM,IAAIxqD,WAAW,CAAC,4BAA4B0N,GAAG,EAAE,CAAC;IAC1D;IACA,MAAMwH,IAAI,GAAGxP,MAAM,CAACwP,IAAI;IACxB,MAAMo4B,UAAU,GAAG,IAAI,CAACkd,OAAO,CAAC98C,GAAG,CAAC;IACpC,MAAMb,IAAI,GAAG,CAAC;IACd,KAAK,IAAInM,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAGiE,MAAM,CAACrQ,MAAM,EAAEkD,CAAC,GAAGkJ,EAAE,EAAE,EAAElJ,CAAC,EAAE;MAC/C,MAAMo7N,OAAO,GAAGp7N,CAAC,GAAGmM,IAAI,GAAGygC,UAAU;MACrC,MAAMyuL,OAAO,GAAGD,OAAO,GAAG,CAAC;MAC3B,MAAME,OAAO,GAAGF,OAAO,GAAG,CAAC;MAC3B,MAAMG,OAAO,GAAGH,OAAO,GAAG,CAAC;MAC3B,MAAMI,OAAO,GAAGJ,OAAO,GAAG,CAAC;MAE3B,IACE5mN,IAAI,CAAC4mN,OAAO,CAAC,KAAK,IAAI,IACtB5mN,IAAI,CAAC6mN,OAAO,CAAC,KAAK,CAAC,IACnB7mN,IAAI,CAAC8mN,OAAO,CAAC,KAAK,CAAC,IACnB9mN,IAAI,CAAC+mN,OAAO,CAAC,KAAK,CAAC,IACnB/mN,IAAI,CAACgnN,OAAO,CAAC,KAAK,CAAC,EACnB;QACA,MAAM,IAAIl8N,WAAW,CAAC,wCAAwC,CAAC;MACjE;MACA,MAAMrB,KAAK,GAAGkP,MAAM,CAACnN,CAAC,CAAC;MACvBwU,IAAI,CAAC4mN,OAAO,CAAC,GAAG,IAAI;MACpB5mN,IAAI,CAAC6mN,OAAO,CAAC,GAAIp9N,KAAK,IAAI,EAAE,GAAI,IAAI;MACpCuW,IAAI,CAAC8mN,OAAO,CAAC,GAAIr9N,KAAK,IAAI,EAAE,GAAI,IAAI;MACpCuW,IAAI,CAAC+mN,OAAO,CAAC,GAAIt9N,KAAK,IAAI,CAAC,GAAI,IAAI;MACnCuW,IAAI,CAACgnN,OAAO,CAAC,GAAGv9N,KAAK,GAAG,IAAI;IAC9B;EACF;AACF;AAGA,MAAMw9N,WAAW,CAAC;EAChB58N,WAAWA,CAACmzN,GAAG,EAAE;IACf,IAAI,CAACA,GAAG,GAAGA,GAAG;EAChB;EAEA0J,OAAOA,CAAA,EAAG;IACR,MAAM1J,GAAG,GAAG,IAAI,CAACA,GAAG;IACpB,MAAMhtN,MAAM,GAAG,IAAIkrN,WAAW,CAAC;MAAEI,SAAS,EAAE0B,GAAG,CAAC2H;IAAc,CAAC,CAAC;IAGhE,MAAMh9K,MAAM,GAAG,IAAI,CAACg/K,aAAa,CAAC3J,GAAG,CAACr1K,MAAM,CAAC;IAC7C33C,MAAM,CAAC0rN,QAAQ,CAAC/zK,MAAM,CAAC;IAEvB,MAAMw1K,SAAS,GAAG,IAAI,CAACyJ,gBAAgB,CAAC5J,GAAG,CAACa,KAAK,CAAC;IAClD7tN,MAAM,CAAC0rN,QAAQ,CAACyB,SAAS,CAAC;IAE1B,IAAIH,GAAG,CAACiB,SAAS,EAAE;MAajB,IAAIjB,GAAG,CAACU,OAAO,CAACQ,OAAO,CAAC,YAAY,CAAC,EAAE;QACrC,MAAMnuM,IAAI,GAAGitM,GAAG,CAACU,OAAO,CAACh2L,SAAS,CAAC,YAAY,CAAC;QAChDs1L,GAAG,CAACU,OAAO,CAAC8E,YAAY,CAAC,YAAY,CAAC;QACtC,KAAK,MAAM7oN,OAAO,IAAIqjN,GAAG,CAACqC,OAAO,EAAE;UACjC,IAAIjuN,MAAM,GAAG2e,IAAI,CAACte,KAAK,CAAC,CAAC,CAAC;UAC1B,IAAIkI,OAAO,CAACukN,OAAO,CAAC,YAAY,CAAC,EAAE;YACjC9sN,MAAM,GAAGxD,IAAI,CAAC3M,SAAS,CAACmQ,MAAM,EAAEuI,OAAO,CAAC+tB,SAAS,CAAC,YAAY,CAAC,CAAC;UAClE;UACA/tB,OAAO,CAACglN,SAAS,CAAC,YAAY,EAAEvtN,MAAM,CAAC;QACzC;MACF;IACF;IAEA,MAAMy1N,IAAI,GAAG7J,GAAG,CAACU,OAAO,CAACh2L,SAAS,CAAC,MAAM,CAAC;IAC1C,IAAIm/L,IAAI,EAAE/+N,MAAM,GAAG,EAAE,EAAE;MAErBk1N,GAAG,CAACU,OAAO,CAAC8E,YAAY,CAAC,MAAM,CAAC;IAClC;IAEAxF,GAAG,CAACU,OAAO,CAACiB,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IACnC,IAAImI,QAAQ,GAAG,IAAI,CAACC,eAAe,CACjC,CAAC/J,GAAG,CAACU,OAAO,CAAC,EACb1tN,MAAM,CAAClI,MAAM,EACbk1N,GAAG,CAACiB,SACN,CAAC;IACDjuN,MAAM,CAAC0rN,QAAQ,CAACoL,QAAQ,CAAC92N,MAAM,CAAC;IAChC,MAAMg3N,cAAc,GAAGF,QAAQ,CAACG,QAAQ,CAAC,CAAC,CAAC;IAE3C,MAAM3J,WAAW,GAAG,IAAI,CAAC4J,kBAAkB,CAAClK,GAAG,CAACnzJ,OAAO,CAACA,OAAO,CAAC;IAChE75D,MAAM,CAAC0rN,QAAQ,CAAC4B,WAAW,CAAC;IAE5B,MAAMC,eAAe,GAAG,IAAI,CAAC4J,YAAY,CAACnK,GAAG,CAACO,eAAe,CAAC;IAC9DvtN,MAAM,CAAC0rN,QAAQ,CAAC6B,eAAe,CAAC;IAGhC,IAAIP,GAAG,CAACj/M,QAAQ,IAAIi/M,GAAG,CAACU,OAAO,CAACQ,OAAO,CAAC,UAAU,CAAC,EAAE;MACnD,IAAIlB,GAAG,CAACj/M,QAAQ,CAACgmN,UAAU,EAAE;QAC3BiD,cAAc,CAACb,gBAAgB,CAC7B,UAAU,EACV,CAACnJ,GAAG,CAACj/M,QAAQ,CAAC+lN,MAAM,CAAC,EACrB9zN,MACF,CAAC;MACH,CAAC,MAAM;QACL,MAAM+N,QAAQ,GAAG,IAAI,CAACqpN,eAAe,CAACpK,GAAG,CAACj/M,QAAQ,CAAC;QACnDipN,cAAc,CAACb,gBAAgB,CAAC,UAAU,EAAE,CAACn2N,MAAM,CAAClI,MAAM,CAAC,EAAEkI,MAAM,CAAC;QACpEA,MAAM,CAAC0rN,QAAQ,CAAC39M,QAAQ,CAAC;MAC3B;IACF;IACA,MAAMkhN,OAAO,GAAG,IAAI,CAACoI,cAAc,CACjCrK,GAAG,CAACiC,OAAO,EACXjC,GAAG,CAAC4C,WAAW,CAACjxM,KAAK,EACrBquM,GAAG,CAACnzJ,OAAO,EACXmzJ,GAAG,CAACiB,SACN,CAAC;IACD+I,cAAc,CAACb,gBAAgB,CAAC,SAAS,EAAE,CAACn2N,MAAM,CAAClI,MAAM,CAAC,EAAEkI,MAAM,CAAC;IACnEA,MAAM,CAAC0rN,QAAQ,CAACuD,OAAO,CAAC;IAExB,MAAMW,WAAW,GAAG,IAAI,CAAC0H,kBAAkB,CAACtK,GAAG,CAAC4C,WAAW,CAAC;IAC5DoH,cAAc,CAACb,gBAAgB,CAAC,aAAa,EAAE,CAACn2N,MAAM,CAAClI,MAAM,CAAC,EAAEkI,MAAM,CAAC;IACvEA,MAAM,CAAC0rN,QAAQ,CAACkE,WAAW,CAAC;IAE5B,IAAI5C,GAAG,CAACiB,SAAS,EAAE;MAGjB+I,cAAc,CAACb,gBAAgB,CAAC,UAAU,EAAE,CAACn2N,MAAM,CAAClI,MAAM,CAAC,EAAEkI,MAAM,CAAC;MACpE,MAAMuvN,QAAQ,GAAG,IAAI,CAACgI,eAAe,CAACvK,GAAG,CAACuC,QAAQ,CAAC;MACnDvvN,MAAM,CAAC0rN,QAAQ,CAAC6D,QAAQ,CAAC;MAGzBuH,QAAQ,GAAG,IAAI,CAACC,eAAe,CAAC/J,GAAG,CAACqC,OAAO,EAAErvN,MAAM,CAAClI,MAAM,EAAE,IAAI,CAAC;MACjEk/N,cAAc,CAACb,gBAAgB,CAAC,SAAS,EAAE,CAACn2N,MAAM,CAAClI,MAAM,CAAC,EAAEkI,MAAM,CAAC;MACnEA,MAAM,CAAC0rN,QAAQ,CAACoL,QAAQ,CAAC92N,MAAM,CAAC;MAChC,MAAMw3N,gBAAgB,GAAGV,QAAQ,CAACG,QAAQ;MAE1C,IAAI,CAACQ,mBAAmB,CAACzK,GAAG,CAACqC,OAAO,EAAEmI,gBAAgB,EAAEx3N,MAAM,CAAC;IACjE;IAEA,IAAI,CAACy3N,mBAAmB,CAAC,CAACzK,GAAG,CAACU,OAAO,CAAC,EAAE,CAACsJ,cAAc,CAAC,EAAEh3N,MAAM,CAAC;IAIjEA,MAAM,CAAC0rN,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpB,OAAO1rN,MAAM,CAACwP,IAAI;EACpB;EAEAkoN,YAAYA,CAACz+N,KAAK,EAAE;IAClB,IAAIxC,MAAM,CAACC,SAAS,CAACuC,KAAK,CAAC,EAAE;MAC3B,OAAO,IAAI,CAAC0+N,aAAa,CAAC1+N,KAAK,CAAC;IAClC;IACA,OAAO,IAAI,CAAC2+N,WAAW,CAAC3+N,KAAK,CAAC;EAChC;EAEA,WAAW4+N,iBAAiBA,CAAA,EAAG;IAC7B,OAAO/+N,MAAM,CACX,IAAI,EACJ,mBAAmB,EACnB,+CACF,CAAC;EACH;EAEA8+N,WAAWA,CAAC7tN,GAAG,EAAE;IACf,IAAI9Q,KAAK,GAAG8Q,GAAG,CAAC9L,QAAQ,CAAC,CAAC;IAG1B,MAAMS,CAAC,GAAG+3N,WAAW,CAACoB,iBAAiB,CAAC1tN,IAAI,CAAClR,KAAK,CAAC;IACnD,IAAIyF,CAAC,EAAE;MACL,MAAMg8H,OAAO,GAAGrmH,UAAU,CAAC,IAAI,IAAI,CAAC3V,CAAC,CAAC,CAAC,CAAC,GAAG,CAACA,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAIA,CAAC,CAAC,CAAC,CAAC,CAAC5G,MAAM,CAAC,CAAC;MACrEmB,KAAK,GAAG,CAACiC,IAAI,CAAC4Z,KAAK,CAAC/K,GAAG,GAAG2wH,OAAO,CAAC,GAAGA,OAAO,EAAEz8H,QAAQ,CAAC,CAAC;IAC1D;IAEA,IAAI65N,OAAO,GAAG,EAAE;IAChB,IAAI98N,CAAC,EAAEkJ,EAAE;IACT,KAAKlJ,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAGjL,KAAK,CAACnB,MAAM,EAAEkD,CAAC,GAAGkJ,EAAE,EAAE,EAAElJ,CAAC,EAAE;MAC1C,MAAM4D,CAAC,GAAG3F,KAAK,CAAC+B,CAAC,CAAC;MAClB,IAAI4D,CAAC,KAAK,GAAG,EAAE;QACbk5N,OAAO,IAAI7+N,KAAK,CAAC,EAAE+B,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG;MAC3C,CAAC,MAAM,IAAI4D,CAAC,KAAK,GAAG,EAAE;QACpBk5N,OAAO,IAAI,GAAG;MAChB,CAAC,MAAM,IAAIl5N,CAAC,KAAK,GAAG,EAAE;QACpBk5N,OAAO,IAAI,GAAG;MAChB,CAAC,MAAM;QACLA,OAAO,IAAIl5N,CAAC;MACd;IACF;IACAk5N,OAAO,IAAIA,OAAO,CAAChgO,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI;IAC1C,MAAMssC,GAAG,GAAG,CAAC,EAAE,CAAC;IAChB,KAAKppC,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAG4zN,OAAO,CAAChgO,MAAM,EAAEkD,CAAC,GAAGkJ,EAAE,EAAElJ,CAAC,IAAI,CAAC,EAAE;MAC/CopC,GAAG,CAAC9oC,IAAI,CAAC8O,QAAQ,CAAC0tN,OAAO,CAACl/N,SAAS,CAACoC,CAAC,EAAEA,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD;IACA,OAAOopC,GAAG;EACZ;EAEAuzL,aAAaA,CAAC1+N,KAAK,EAAE;IACnB,IAAIc,IAAI;IACR,IAAId,KAAK,IAAI,CAAC,GAAG,IAAIA,KAAK,IAAI,GAAG,EAAE;MACjCc,IAAI,GAAG,CAACd,KAAK,GAAG,GAAG,CAAC;IACtB,CAAC,MAAM,IAAIA,KAAK,IAAI,GAAG,IAAIA,KAAK,IAAI,IAAI,EAAE;MACxCA,KAAK,IAAI,GAAG;MACZc,IAAI,GAAG,CAAC,CAACd,KAAK,IAAI,CAAC,IAAI,GAAG,EAAEA,KAAK,GAAG,IAAI,CAAC;IAC3C,CAAC,MAAM,IAAIA,KAAK,IAAI,CAAC,IAAI,IAAIA,KAAK,IAAI,CAAC,GAAG,EAAE;MAC1CA,KAAK,GAAG,CAACA,KAAK,GAAG,GAAG;MACpBc,IAAI,GAAG,CAAC,CAACd,KAAK,IAAI,CAAC,IAAI,GAAG,EAAEA,KAAK,GAAG,IAAI,CAAC;IAC3C,CAAC,MAAM,IAAIA,KAAK,IAAI,CAAC,KAAK,IAAIA,KAAK,IAAI,KAAK,EAAE;MAC5Cc,IAAI,GAAG,CAAC,IAAI,EAAGd,KAAK,IAAI,CAAC,GAAI,IAAI,EAAEA,KAAK,GAAG,IAAI,CAAC;IAClD,CAAC,MAAM;MACLc,IAAI,GAAG,CACL,IAAI,EACHd,KAAK,IAAI,EAAE,GAAI,IAAI,EACnBA,KAAK,IAAI,EAAE,GAAI,IAAI,EACnBA,KAAK,IAAI,CAAC,GAAI,IAAI,EACnBA,KAAK,GAAG,IAAI,CACb;IACH;IACA,OAAOc,IAAI;EACb;EAEA48N,aAAaA,CAACh/K,MAAM,EAAE;IAGpB,OAAO,CAACA,MAAM,CAACtW,KAAK,EAAEsW,MAAM,CAACrW,KAAK,EAAE,CAAC,EAAEqW,MAAM,CAACy4K,OAAO,CAAC;EACxD;EAEAwG,gBAAgBA,CAAC/I,KAAK,EAAE;IACtB,MAAMV,SAAS,GAAG,IAAIwD,QAAQ,CAAC,CAAC;IAChC,KAAK,MAAMh3N,IAAI,IAAIk0N,KAAK,EAAE;MAExB,MAAM/1N,MAAM,GAAGoD,IAAI,CAACC,GAAG,CAACxB,IAAI,CAAC7B,MAAM,EAAE,GAAG,CAAC;MACzC,IAAIigO,aAAa,GAAG,IAAIj6N,KAAK,CAAChG,MAAM,CAAC;MACrC,KAAK,IAAImf,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGnf,MAAM,EAAEmf,CAAC,EAAE,EAAE;QAG/B,IAAIvJ,IAAI,GAAG/T,IAAI,CAACsd,CAAC,CAAC;QAClB,IACEvJ,IAAI,GAAG,GAAG,IACVA,IAAI,GAAG,GAAG,IACVA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,IACZA,IAAI,KAAK,GAAG,EACZ;UACAA,IAAI,GAAG,GAAG;QACZ;QACAqqN,aAAa,CAAC9gN,CAAC,CAAC,GAAGvJ,IAAI;MACzB;MACAqqN,aAAa,GAAGA,aAAa,CAACx8N,IAAI,CAAC,EAAE,CAAC;MAEtC,IAAIw8N,aAAa,KAAK,EAAE,EAAE;QACxBA,aAAa,GAAG,eAAe;MACjC;MACA5K,SAAS,CAACziN,GAAG,CAAClP,aAAa,CAACu8N,aAAa,CAAC,CAAC;IAC7C;IACA,OAAO,IAAI,CAACZ,YAAY,CAAChK,SAAS,CAAC;EACrC;EAEA4J,eAAeA,CAACiB,KAAK,EAAElgO,MAAM,EAAEmgO,aAAa,EAAE;IAC5C,MAAMT,gBAAgB,GAAG,EAAE;IAC3B,IAAItI,YAAY,GAAG,IAAIyB,QAAQ,CAAC,CAAC;IACjC,KAAK,MAAMvB,QAAQ,IAAI4I,KAAK,EAAE;MAC5B,IAAIC,aAAa,EAAE;QACjB7I,QAAQ,CAACoD,YAAY,CAAC,gBAAgB,CAAC;QACvCpD,QAAQ,CAACoD,YAAY,CAAC,iBAAiB,CAAC;QACxCpD,QAAQ,CAACoD,YAAY,CAAC,aAAa,CAAC;QACpCpD,QAAQ,CAACoD,YAAY,CAAC,UAAU,CAAC;QACjCpD,QAAQ,CAACoD,YAAY,CAAC,SAAS,CAAC;MAClC;MACA,MAAM0F,eAAe,GAAG,IAAInC,gBAAgB,CAAC,CAAC;MAC9C,MAAMoC,YAAY,GAAG,IAAI,CAACC,WAAW,CAAChJ,QAAQ,EAAE8I,eAAe,CAAC;MAChEV,gBAAgB,CAACl8N,IAAI,CAAC48N,eAAe,CAAC;MACtChJ,YAAY,CAACxkN,GAAG,CAACytN,YAAY,CAAC;MAC9BD,eAAe,CAAC79M,MAAM,CAACviB,MAAM,CAAC;IAChC;IACAo3N,YAAY,GAAG,IAAI,CAACiI,YAAY,CAACjI,YAAY,EAAEsI,gBAAgB,CAAC;IAChE,OAAO;MACLP,QAAQ,EAAEO,gBAAgB;MAC1Bx3N,MAAM,EAAEkvN;IACV,CAAC;EACH;EAEAuI,mBAAmBA,CAACO,KAAK,EAAEf,QAAQ,EAAEj3N,MAAM,EAAE;IAC3C,KAAK,IAAIhF,CAAC,GAAG,CAAC,EAAEkJ,EAAE,GAAG8zN,KAAK,CAAClgO,MAAM,EAAEkD,CAAC,GAAGkJ,EAAE,EAAE,EAAElJ,CAAC,EAAE;MAC9C,MAAMo0N,QAAQ,GAAG4I,KAAK,CAACh9N,CAAC,CAAC;MACzB,MAAM80N,WAAW,GAAGV,QAAQ,CAACU,WAAW;MACxC,IAAI,CAACA,WAAW,IAAI,CAACV,QAAQ,CAAClB,OAAO,CAAC,SAAS,CAAC,EAAE;QAChD,MAAM,IAAI5zN,WAAW,CAAC,qCAAqC,CAAC;MAC9D;MACA,MAAM+9N,kBAAkB,GAAG,IAAItC,gBAAgB,CAAC,CAAC;MACjD,MAAMuC,eAAe,GAAG,IAAI,CAACF,WAAW,CAACtI,WAAW,EAAEuI,kBAAkB,CAAC;MAEzE,IAAIx0K,YAAY,GAAG7jD,MAAM,CAAClI,MAAM;MAChCugO,kBAAkB,CAACh+M,MAAM,CAACwpC,YAAY,CAAC;MACvC,IAAI,CAACy0K,eAAe,CAACxgO,MAAM,EAAE;QAI3B+rD,YAAY,GAAG,CAAC;MAClB;MAEAozK,QAAQ,CAACj8N,CAAC,CAAC,CAACm7N,gBAAgB,CAC1B,SAAS,EACT,CAACmC,eAAe,CAACxgO,MAAM,EAAE+rD,YAAY,CAAC,EACtC7jD,MACF,CAAC;MACDA,MAAM,CAAC0rN,QAAQ,CAAC4M,eAAe,CAAC;MAEhC,IAAIxI,WAAW,CAACC,UAAU,IAAID,WAAW,CAAC5B,OAAO,CAAC,OAAO,CAAC,EAAE;QAC1D,MAAMqK,KAAK,GAAG,IAAI,CAACpB,YAAY,CAACrH,WAAW,CAACC,UAAU,CAAC;QACvDsI,kBAAkB,CAAClC,gBAAgB,CACjC,OAAO,EACP,CAACmC,eAAe,CAACxgO,MAAM,CAAC,EACxBkI,MACF,CAAC;QACDA,MAAM,CAAC0rN,QAAQ,CAAC6M,KAAK,CAAC;MACxB;IACF;EACF;EAEAH,WAAWA,CAAC5uN,IAAI,EAAEgvN,aAAa,EAAE;IAC/B,MAAMp0L,GAAG,GAAG,EAAE;IAEd,KAAK,MAAMp8B,GAAG,IAAIwB,IAAI,CAACisN,KAAK,EAAE;MAC5B,IAAI,EAAEztN,GAAG,IAAIwB,IAAI,CAACrB,MAAM,CAAC,EAAE;QACzB;MACF;MACA,IAAIA,MAAM,GAAGqB,IAAI,CAACrB,MAAM,CAACH,GAAG,CAAC;MAC7B,IAAIutN,KAAK,GAAG/rN,IAAI,CAAC+rN,KAAK,CAACvtN,GAAG,CAAC;MAC3B,IAAI,CAAClK,KAAK,CAACuH,OAAO,CAACkwN,KAAK,CAAC,EAAE;QACzBA,KAAK,GAAG,CAACA,KAAK,CAAC;MACjB;MACA,IAAI,CAACz3N,KAAK,CAACuH,OAAO,CAAC8C,MAAM,CAAC,EAAE;QAC1BA,MAAM,GAAG,CAACA,MAAM,CAAC;MACnB;MAGA,IAAIA,MAAM,CAACrQ,MAAM,KAAK,CAAC,EAAE;QACvB;MACF;MAEA,KAAK,IAAImf,CAAC,GAAG,CAAC,EAAEuY,EAAE,GAAG+lM,KAAK,CAACz9N,MAAM,EAAEmf,CAAC,GAAGuY,EAAE,EAAE,EAAEvY,CAAC,EAAE;QAC9C,MAAMtxB,IAAI,GAAG4vO,KAAK,CAACt+M,CAAC,CAAC;QACrB,MAAMhe,KAAK,GAAGkP,MAAM,CAAC8O,CAAC,CAAC;QACvB,QAAQtxB,IAAI;UACV,KAAK,KAAK;UACV,KAAK,KAAK;YACRy+C,GAAG,CAAC9oC,IAAI,CAAC,GAAG,IAAI,CAACo8N,YAAY,CAACz+N,KAAK,CAAC,CAAC;YACrC;UACF,KAAK,QAAQ;YAIX,MAAMU,IAAI,GAAG6P,IAAI,CAAC4rN,YAAY,CAACptN,GAAG,CAAC;YAGnC,IAAI,CAACwwN,aAAa,CAACxC,UAAU,CAACr8N,IAAI,CAAC,EAAE;cACnC6+N,aAAa,CAACvC,KAAK,CAACt8N,IAAI,EAAEyqC,GAAG,CAACtsC,MAAM,CAAC;YACvC;YACAssC,GAAG,CAAC9oC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1B;UACF,KAAK,OAAO;UACZ,KAAK,OAAO;YACV8oC,GAAG,CAAC9oC,IAAI,CAAC,GAAG,IAAI,CAACo8N,YAAY,CAACz+N,KAAK,CAAC,CAAC;YACrC,KAAK,IAAIqoB,CAAC,GAAG,CAAC,EAAEumB,EAAE,GAAG1/B,MAAM,CAACrQ,MAAM,EAAEwpB,CAAC,GAAGumB,EAAE,EAAE,EAAEvmB,CAAC,EAAE;cAC/C8iB,GAAG,CAAC9oC,IAAI,CAAC,GAAG,IAAI,CAACo8N,YAAY,CAACvvN,MAAM,CAACmZ,CAAC,CAAC,CAAC,CAAC;YAC3C;YACA;UACF;YACE,MAAM,IAAIhnB,WAAW,CAAC,wBAAwB3U,IAAI,EAAE,CAAC;QACzD;MACF;MACAy+C,GAAG,CAAC9oC,IAAI,CAAC,GAAGkO,IAAI,CAACgsN,OAAO,CAACxtN,GAAG,CAAC,CAAC;IAChC;IACA,OAAOo8B,GAAG;EACZ;EAEA8yL,kBAAkBA,CAACr9J,OAAO,EAAE;IAC1B,MAAMyzJ,WAAW,GAAG,IAAIqD,QAAQ,CAAC,CAAC;IAClC,KAAK,MAAMp1J,MAAM,IAAI1B,OAAO,EAAE;MAC5ByzJ,WAAW,CAAC5iN,GAAG,CAAClP,aAAa,CAAC+/D,MAAM,CAAC,CAAC;IACxC;IACA,OAAO,IAAI,CAAC47J,YAAY,CAAC7J,WAAW,CAAC;EACvC;EAEAgK,kBAAkBA,CAAC1H,WAAW,EAAE;IAC9B,MAAM6I,gBAAgB,GAAG,IAAI9H,QAAQ,CAAC,CAAC;IACvC,KAAK,IAAI31N,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG40N,WAAW,CAACjxM,KAAK,EAAE3jB,CAAC,EAAE,EAAE;MAC1C,MAAM+5N,KAAK,GAAGnF,WAAW,CAACjrN,GAAG,CAAC3J,CAAC,CAAC;MAGhC,IAAI+5N,KAAK,CAACj9N,MAAM,KAAK,CAAC,EAAE;QACtB2gO,gBAAgB,CAAC/tN,GAAG,CAAC,IAAIjP,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAClD;MACF;MACAg9N,gBAAgB,CAAC/tN,GAAG,CAACqqN,KAAK,CAAC;IAC7B;IACA,OAAO,IAAI,CAACoC,YAAY,CAACsB,gBAAgB,CAAC;EAC5C;EAEApB,cAAcA,CAACpI,OAAO,EAAEyJ,SAAS,EAAE7+J,OAAO,EAAEo0J,SAAS,EAAE;IAGrD,IAAI7pL,GAAG;IACP,MAAMu0L,mBAAmB,GAAGD,SAAS,GAAG,CAAC;IACzC,IAAIzK,SAAS,EAAE;MAMb,MAAM2K,KAAK,GAAGD,mBAAmB,GAAG,CAAC;MACrCv0L,GAAG,GAAG,IAAI3oC,UAAU,CAAC,CACnB,CAAC,EACD,CAAC,EACD,CAAC,EACAm9N,KAAK,IAAI,CAAC,GAAI,IAAI,EACnBA,KAAK,GAAG,IAAI,CACb,CAAC;IACJ,CAAC,MAAM;MACL,MAAM9gO,MAAM,GAAG,CAAC,GAAG6gO,mBAAmB,GAAG,CAAC;MAC1Cv0L,GAAG,GAAG,IAAI3oC,UAAU,CAAC3D,MAAM,CAAC;MAE5B,IAAI+gO,YAAY,GAAG,CAAC;MACpB,MAAMC,WAAW,GAAG7J,OAAO,CAACA,OAAO,CAACn3N,MAAM;MAC1C,IAAIihO,MAAM,GAAG,KAAK;MAClB,KAAK,IAAI/9N,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGopC,GAAG,CAACtsC,MAAM,EAAEkD,CAAC,IAAI,CAAC,EAAE;QACtC,IAAIm5N,GAAG,GAAG,CAAC;QACX,IAAI0E,YAAY,GAAGC,WAAW,EAAE;UAC9B,MAAMn/N,IAAI,GAAGs1N,OAAO,CAACA,OAAO,CAAC4J,YAAY,EAAE,CAAC;UAC5C1E,GAAG,GAAGt6J,OAAO,CAACm7J,MAAM,CAACr7N,IAAI,CAAC;UAC1B,IAAIw6N,GAAG,KAAK,CAAC,CAAC,EAAE;YACdA,GAAG,GAAG,CAAC;YACP,IAAI,CAAC4E,MAAM,EAAE;cACXA,MAAM,GAAG,IAAI;cACbhiO,IAAI,CAAC,iBAAiB4C,IAAI,iBAAiB,CAAC;YAC9C;UACF;QACF;QACAyqC,GAAG,CAACppC,CAAC,CAAC,GAAIm5N,GAAG,IAAI,CAAC,GAAI,IAAI;QAC1B/vL,GAAG,CAACppC,CAAC,GAAG,CAAC,CAAC,GAAGm5N,GAAG,GAAG,IAAI;MACzB;IACF;IACA,OAAO/vL,GAAG;EACZ;EAEAgzL,eAAeA,CAACrpN,QAAQ,EAAE;IACxB,OAAOA,QAAQ,CAACimN,GAAG;EACrB;EAEAuD,eAAeA,CAAChI,QAAQ,EAAE;IACxB,MAAMuE,MAAM,GAAGvE,QAAQ,CAACuE,MAAM;IAC9B,IAAI1vL,GAAG,EAAEppC,CAAC;IACV,QAAQ84N,MAAM;MACZ,KAAK,CAAC;QACJ1vL,GAAG,GAAG,IAAI3oC,UAAU,CAAC,CAAC,GAAG8zN,QAAQ,CAACA,QAAQ,CAACz3N,MAAM,CAAC;QAClDssC,GAAG,CAAC,CAAC,CAAC,GAAG0vL,MAAM;QACf1vL,GAAG,CAAC97B,GAAG,CAACinN,QAAQ,CAACA,QAAQ,EAAE,CAAC,CAAC;QAC7B;MACF,KAAK,CAAC;QACJ,MAAMtiN,KAAK,GAAG,CAAC;QACf,IAAI+rN,MAAM,GAAGzJ,QAAQ,CAACA,QAAQ,CAAC,CAAC,CAAC;QACjC,MAAM/hM,MAAM,GAAG,CACbsmM,MAAM,EACN,CAAC,EACD,CAAC,EACA7mN,KAAK,IAAI,CAAC,GAAI,IAAI,EACnBA,KAAK,GAAG,IAAI,EACZ+rN,MAAM,CACP;QACD,KAAKh+N,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGu0N,QAAQ,CAACA,QAAQ,CAACz3N,MAAM,EAAEkD,CAAC,EAAE,EAAE;UAC7C,MAAMi+N,SAAS,GAAG1J,QAAQ,CAACA,QAAQ,CAACv0N,CAAC,CAAC;UACtC,IAAIi+N,SAAS,KAAKD,MAAM,EAAE;YACxBxrM,MAAM,CAAClyB,IAAI,CAAEN,CAAC,IAAI,CAAC,GAAI,IAAI,EAAEA,CAAC,GAAG,IAAI,EAAEi+N,SAAS,CAAC;YACjDD,MAAM,GAAGC,SAAS;UACpB;QACF;QAEA,MAAMC,SAAS,GAAG,CAAC1rM,MAAM,CAAC11B,MAAM,GAAG,CAAC,IAAI,CAAC;QACzC01B,MAAM,CAAC,CAAC,CAAC,GAAI0rM,SAAS,IAAI,CAAC,GAAI,IAAI;QACnC1rM,MAAM,CAAC,CAAC,CAAC,GAAG0rM,SAAS,GAAG,IAAI;QAE5B1rM,MAAM,CAAClyB,IAAI,CAAEN,CAAC,IAAI,CAAC,GAAI,IAAI,EAAEA,CAAC,GAAG,IAAI,CAAC;QACtCopC,GAAG,GAAG,IAAI3oC,UAAU,CAAC+xB,MAAM,CAAC;QAC5B;IACJ;IACA,OAAO4W,GAAG;EACZ;EAEA+yL,YAAYA,CAACx9L,KAAK,EAAEs9L,QAAQ,GAAG,EAAE,EAAE;IACjC,MAAMhC,OAAO,GAAGt7L,KAAK,CAACs7L,OAAO;IAE7B,MAAMt2M,KAAK,GAAGs2M,OAAO,CAACn9N,MAAM;IAG5B,IAAI6mB,KAAK,KAAK,CAAC,EAAE;MACf,OAAO,IAAIljB,UAAU,CAAC,CAAC,CAAC;IAC1B;IAEA,IAAI09N,UAAU,GAAG,CAAC;MAChBn+N,CAAC;IACH,KAAKA,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2jB,KAAK,EAAE,EAAE3jB,CAAC,EAAE;MAC1Bm+N,UAAU,IAAIlE,OAAO,CAACj6N,CAAC,CAAC,CAAClD,MAAM;IACjC;IAEA,IAAI84N,UAAU;IACd,IAAIuI,UAAU,GAAG,KAAK,EAAE;MACtBvI,UAAU,GAAG,CAAC;IAChB,CAAC,MAAM,IAAIuI,UAAU,GAAG,OAAO,EAAE;MAC/BvI,UAAU,GAAG,CAAC;IAChB,CAAC,MAAM,IAAIuI,UAAU,GAAG,SAAS,EAAE;MACjCvI,UAAU,GAAG,CAAC;IAChB,CAAC,MAAM;MACLA,UAAU,GAAG,CAAC;IAChB;IAEA,MAAMphN,IAAI,GAAG,IAAI/T,UAAU,CAAC,CAAC,GAAGm1N,UAAU,IAAIjyM,KAAK,GAAG,CAAC,CAAC,GAAGw6M,UAAU,CAAC;IACtE,IAAIh6N,GAAG,GAAG,CAAC;IAEXqQ,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAIwf,KAAK,IAAI,CAAC,GAAI,IAAI;IACjCnP,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAGwf,KAAK,GAAG,IAAI;IAG1BnP,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAGyxN,UAAU;IAGxB,IAAI2C,cAAc,GAAG,CAAC;IACtB,KAAKv4N,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2jB,KAAK,GAAG,CAAC,EAAE3jB,CAAC,EAAE,EAAE;MAC9B,IAAI41N,UAAU,KAAK,CAAC,EAAE;QACpBphN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAGo0N,cAAc,GAAG,IAAI;MACrC,CAAC,MAAM,IAAI3C,UAAU,KAAK,CAAC,EAAE;QAC3BphN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAIo0N,cAAc,IAAI,CAAC,GAAI,IAAI;QAC1C/jN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAGo0N,cAAc,GAAG,IAAI;MACrC,CAAC,MAAM,IAAI3C,UAAU,KAAK,CAAC,EAAE;QAC3BphN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAIo0N,cAAc,IAAI,EAAE,GAAI,IAAI;QAC3C/jN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAIo0N,cAAc,IAAI,CAAC,GAAI,IAAI;QAC1C/jN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAGo0N,cAAc,GAAG,IAAI;MACrC,CAAC,MAAM;QACL/jN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAIo0N,cAAc,KAAK,EAAE,GAAI,IAAI;QAC5C/jN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAIo0N,cAAc,IAAI,EAAE,GAAI,IAAI;QAC3C/jN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAIo0N,cAAc,IAAI,CAAC,GAAI,IAAI;QAC1C/jN,IAAI,CAACrQ,GAAG,EAAE,CAAC,GAAGo0N,cAAc,GAAG,IAAI;MACrC;MAEA,IAAI0B,OAAO,CAACj6N,CAAC,CAAC,EAAE;QACdu4N,cAAc,IAAI0B,OAAO,CAACj6N,CAAC,CAAC,CAAClD,MAAM;MACrC;IACF;IAEA,KAAKkD,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2jB,KAAK,EAAE3jB,CAAC,EAAE,EAAE;MAE1Bi8N,QAAQ,CAACj8N,CAAC,CAAC,EAAEqf,MAAM,CAAClb,GAAG,CAAC;MAExBqQ,IAAI,CAAClH,GAAG,CAAC2sN,OAAO,CAACj6N,CAAC,CAAC,EAAEmE,GAAG,CAAC;MACzBA,GAAG,IAAI81N,OAAO,CAACj6N,CAAC,CAAC,CAAClD,MAAM;IAC1B;IACA,OAAO0X,IAAI;EACb;AACF;;;AC19DwD;AACH;AAMrD,MAAM4pN,aAAa,GAAGvqN,qBAAqB,CAAC,UAAU7L,CAAC,EAAE;EAEvDA,CAAC,CAAC,aAAa,CAAC,GAAG,aAAa;EAChCA,CAAC,CAACq2N,SAAS,GAAG,WAAW;EACzBr2N,CAAC,CAACs2N,OAAO,GAAG,SAAS;EACrBt2N,CAAC,CAACiD,MAAM,GAAG,QAAQ;EACnBjD,CAAC,CAAC,YAAY,CAAC,GAAG,YAAY;EAC9BA,CAAC,CAAC,gBAAgB,CAAC,GAAG,gBAAgB;EACtCA,CAAC,CAAC,cAAc,CAAC,GAAG,cAAc;EAClCA,CAAC,CAACu2N,YAAY,GAAG,cAAc;EAC/Bv2N,CAAC,CAAC,cAAc,CAAC,GAAG,cAAc;EAClCA,CAAC,CAAC,mBAAmB,CAAC,GAAG,mBAAmB;EAC5CA,CAAC,CAAC,iBAAiB,CAAC,GAAG,iBAAiB;EACxCA,CAAC,CAAC,kBAAkB,CAAC,GAAG,kBAAkB;EAC1CA,CAAC,CAAC,uBAAuB,CAAC,GAAG,uBAAuB;EACpDA,CAAC,CAAC,qBAAqB,CAAC,GAAG,qBAAqB;EAGhDA,CAAC,CAACw2N,WAAW,GAAG,WAAW;EAC3Bx2N,CAAC,CAAC,kBAAkB,CAAC,GAAG,gBAAgB;EACxCA,CAAC,CAAC,wBAAwB,CAAC,GAAG,uBAAuB;EACrDA,CAAC,CAAC,oBAAoB,CAAC,GAAG,mBAAmB;EAC7CA,CAAC,CAACy2N,UAAU,GAAG,WAAW;EAC1Bz2N,CAAC,CAAC,iBAAiB,CAAC,GAAG,gBAAgB;EACvCA,CAAC,CAAC,uBAAuB,CAAC,GAAG,uBAAuB;EACpDA,CAAC,CAAC,mBAAmB,CAAC,GAAG,mBAAmB;EAC5CA,CAAC,CAAC,aAAa,CAAC,GAAG,WAAW;EAC9BA,CAAC,CAAC,kBAAkB,CAAC,GAAG,gBAAgB;EACxCA,CAAC,CAAC,wBAAwB,CAAC,GAAG,uBAAuB;EACrDA,CAAC,CAAC,oBAAoB,CAAC,GAAG,mBAAmB;EAC7CA,CAAC,CAAC02N,KAAK,GAAG,WAAW;EACrB12N,CAAC,CAAC,YAAY,CAAC,GAAG,gBAAgB;EAClCA,CAAC,CAAC,kBAAkB,CAAC,GAAG,uBAAuB;EAC/CA,CAAC,CAAC,cAAc,CAAC,GAAG,mBAAmB;EACvCA,CAAC,CAAC22N,OAAO,GAAG,WAAW;EACvB32N,CAAC,CAAC,oBAAoB,CAAC,GAAG,uBAAuB;EACjDA,CAAC,CAAC,cAAc,CAAC,GAAG,gBAAgB;EACpCA,CAAC,CAAC,gBAAgB,CAAC,GAAG,mBAAmB;EACzCA,CAAC,CAAC,+BAA+B,CAAC,GAAG,uBAAuB;EAC5DA,CAAC,CAAC,mBAAmB,CAAC,GAAG,gBAAgB;EACzCA,CAAC,CAAC,uBAAuB,CAAC,GAAG,mBAAmB;EAChDA,CAAC,CAAC42N,cAAc,GAAG,WAAW;EAC9B52N,CAAC,CAAC,qBAAqB,CAAC,GAAG,gBAAgB;EAC3CA,CAAC,CAAC,2BAA2B,CAAC,GAAG,uBAAuB;EACxDA,CAAC,CAAC,uBAAuB,CAAC,GAAG,mBAAmB;EAChDA,CAAC,CAAC,oBAAoB,CAAC,GAAG,qBAAqB;EAC/CA,CAAC,CAAC,gBAAgB,CAAC,GAAG,iBAAiB;EACvCA,CAAC,CAAC62N,UAAU,GAAG,SAAS;EACxB72N,CAAC,CAAC,iBAAiB,CAAC,GAAG,cAAc;EACrCA,CAAC,CAAC,uBAAuB,CAAC,GAAG,qBAAqB;EAClDA,CAAC,CAAC,mBAAmB,CAAC,GAAG,iBAAiB;EAC1CA,CAAC,CAAC,2BAA2B,CAAC,GAAG,qBAAqB;EACtDA,CAAC,CAAC,qBAAqB,CAAC,GAAG,cAAc;EACzCA,CAAC,CAAC,uBAAuB,CAAC,GAAG,iBAAiB;EAC9CA,CAAC,CAAC82N,cAAc,GAAG,SAAS;EAC5B92N,CAAC,CAAC,sBAAsB,CAAC,GAAG,uBAAuB;EACnDA,CAAC,CAAC,kBAAkB,CAAC,GAAG,mBAAmB;EAC3CA,CAAC,CAAC,qBAAqB,CAAC,GAAG,gBAAgB;EAC3CA,CAAC,CAAC,aAAa,CAAC,GAAG,QAAQ;EAC3BA,CAAC,CAAC,mBAAmB,CAAC,GAAG,QAAQ;EACjCA,CAAC,CAAC,eAAe,CAAC,GAAG,QAAQ;EAC7BA,CAAC,CAAC+2N,aAAa,GAAG,aAAa;EAC/B/2N,CAAC,CAAC,oBAAoB,CAAC,GAAG,YAAY;EACtCA,CAAC,CAAC,0BAA0B,CAAC,GAAG,kBAAkB;EAClDA,CAAC,CAAC,sBAAsB,CAAC,GAAG,cAAc;EAC1CA,CAAC,CAACg3N,eAAe,GAAG,aAAa;EACjCh3N,CAAC,CAAC,sBAAsB,CAAC,GAAG,YAAY;EACxCA,CAAC,CAAC,4BAA4B,CAAC,GAAG,kBAAkB;EACpDA,CAAC,CAAC,8BAA8B,CAAC,GAAG,kBAAkB;EACtDA,CAAC,CAAC,wBAAwB,CAAC,GAAG,YAAY;EAC1CA,CAAC,CAAC,wBAAwB,CAAC,GAAG,cAAc;EAC5CA,CAAC,CAAC,0BAA0B,CAAC,GAAG,cAAc;EAC9CA,CAAC,CAACi3N,iBAAiB,GAAG,aAAa;EACnCj3N,CAAC,CAAC,wBAAwB,CAAC,GAAG,YAAY;EAC1CA,CAAC,CAAC,8BAA8B,CAAC,GAAG,kBAAkB;EACtDA,CAAC,CAAC,0BAA0B,CAAC,GAAG,cAAc;AAChD,CAAC,CAAC;AAGF,MAAMk3N,oBAAoB,GAAGrrN,qBAAqB,CAAC,UAAU7L,CAAC,EAAE;EAC9DA,CAAC,CAACs2N,OAAO,GAAG,gBAAgB;EAC5Bt2N,CAAC,CAAC,cAAc,CAAC,GAAG,oBAAoB;EACxCA,CAAC,CAAC,qBAAqB,CAAC,GAAG,0BAA0B;EACrDA,CAAC,CAAC,iBAAiB,CAAC,GAAG,sBAAsB;EAC7CA,CAAC,CAACq2N,SAAS,GAAG,4BAA4B;EAC1Cr2N,CAAC,CAAC,gBAAgB,CAAC,GAAG,yBAAyB;EAC/CA,CAAC,CAAC,uBAAuB,CAAC,GAAG,+BAA+B;EAC5DA,CAAC,CAAC,mBAAmB,CAAC,GAAG,2BAA2B;EACpDA,CAAC,CAAC,aAAa,CAAC,GAAG,gBAAgB;EACnCA,CAAC,CAAC,YAAY,CAAC,GAAG,oBAAoB;EACtCA,CAAC,CAAC,kBAAkB,CAAC,GAAG,0BAA0B;EAClDA,CAAC,CAAC,cAAc,CAAC,GAAG,sBAAsB;EAC1CA,CAAC,CAACiD,MAAM,GAAG,iBAAiB;EAC5BjD,CAAC,CAACu2N,YAAY,GAAG,mBAAmB;EACpCv2N,CAAC,CAAC,wBAAwB,CAAC,GAAG,4BAA4B;EAC1DA,CAAC,CAAC,qBAAqB,CAAC,GAAG,yBAAyB;EACpDA,CAAC,CAAC,uBAAuB,CAAC,GAAG,2BAA2B;EACxDA,CAAC,CAAC,2BAA2B,CAAC,GAAG,+BAA+B;AAClE,CAAC,CAAC;AAMF,MAAMm3N,gBAAgB,GAAGtrN,qBAAqB,CAAC,UAAU7L,CAAC,EAAE;EAC1DA,CAAC,CAACo3N,OAAO,GAAG,WAAW;EACvBp3N,CAAC,CAAC,cAAc,CAAC,GAAG,gBAAgB;EACpCA,CAAC,CAAC,oBAAoB,CAAC,GAAG,uBAAuB;EACjDA,CAAC,CAAC,gBAAgB,CAAC,GAAG,mBAAmB;EACzCA,CAAC,CAACq3N,aAAa,GAAG,WAAW;EAC7Br3N,CAAC,CAAC,oBAAoB,CAAC,GAAG,gBAAgB;EAC1CA,CAAC,CAAC,0BAA0B,CAAC,GAAG,uBAAuB;EACvDA,CAAC,CAAC,sBAAsB,CAAC,GAAG,mBAAmB;EAC/CA,CAAC,CAACs3N,WAAW,GAAG,eAAe;EAC/Bt3N,CAAC,CAAC,kBAAkB,CAAC,GAAG,oBAAoB;EAC5CA,CAAC,CAAC,wBAAwB,CAAC,GAAG,0BAA0B;EACxDA,CAAC,CAAC,oBAAoB,CAAC,GAAG,sBAAsB;EAChDA,CAAC,CAACu3N,UAAU,GAAG,WAAW;EAC1Bv3N,CAAC,CAAC,iBAAiB,CAAC,GAAG,gBAAgB;EACvCA,CAAC,CAAC,uBAAuB,CAAC,GAAG,uBAAuB;EACpDA,CAAC,CAAC,mBAAmB,CAAC,GAAG,mBAAmB;EAC5CA,CAAC,CAACw3N,MAAM,GAAG,WAAW;EACtBx3N,CAAC,CAAC,gBAAgB,CAAC,GAAG,gBAAgB;EACtCA,CAAC,CAAC,sBAAsB,CAAC,GAAG,uBAAuB;EACnDA,CAAC,CAAC,gBAAgB,CAAC,GAAG,WAAW;EACjCA,CAAC,CAAC,sBAAsB,CAAC,GAAG,mBAAmB;EAC/CA,CAAC,CAAC,kBAAkB,CAAC,GAAG,WAAW;EACnCA,CAAC,CAAC,wBAAwB,CAAC,GAAG,mBAAmB;EACjDA,CAAC,CAACy3N,aAAa,GAAG,SAAS;EAC3Bz3N,CAAC,CAAC,oBAAoB,CAAC,GAAG,cAAc;EACxCA,CAAC,CAAC,0BAA0B,CAAC,GAAG,qBAAqB;EACrDA,CAAC,CAAC,sBAAsB,CAAC,GAAG,iBAAiB;EAC7CA,CAAC,CAAC,iBAAiB,CAAC,GAAG,gBAAgB;EACvCA,CAAC,CAAC,WAAW,CAAC,GAAG,WAAW;EAC5BA,CAAC,CAAC,gBAAgB,CAAC,GAAG,gBAAgB;EACtCA,CAAC,CAAC,sBAAsB,CAAC,GAAG,sBAAsB;EAClDA,CAAC,CAAC,kBAAkB,CAAC,GAAG,kBAAkB;EAC1CA,CAAC,CAAC,WAAW,CAAC,GAAG,WAAW;EAC5BA,CAAC,CAAC,gBAAgB,CAAC,GAAG,gBAAgB;EACtCA,CAAC,CAAC,sBAAsB,CAAC,GAAG,sBAAsB;EAClDA,CAAC,CAAC,kBAAkB,CAAC,GAAG,kBAAkB;EAC1CA,CAAC,CAAC,YAAY,CAAC,GAAG,YAAY;EAC9BA,CAAC,CAAC,iBAAiB,CAAC,GAAG,iBAAiB;EACxCA,CAAC,CAAC,uBAAuB,CAAC,GAAG,uBAAuB;EACpDA,CAAC,CAAC,mBAAmB,CAAC,GAAG,mBAAmB;EAC5CA,CAAC,CAAC,YAAY,CAAC,GAAG,YAAY;EAC9BA,CAAC,CAAC,iBAAiB,CAAC,GAAG,iBAAiB;EACxCA,CAAC,CAAC,uBAAuB,CAAC,GAAG,uBAAuB;EACpDA,CAAC,CAAC,mBAAmB,CAAC,GAAG,mBAAmB;EAC5CA,CAAC,CAAC03N,aAAa,GAAG,cAAc;EAChC13N,CAAC,CAAC23N,aAAa,GAAG,WAAW;AAC/B,CAAC,CAAC;AAEF,MAAMC,aAAa,GAAG/rN,qBAAqB,CAAC,UAAU7L,CAAC,EAAE;EACvDA,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI;EACxBA,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI;EACtBA,CAAC,CAAC63N,QAAQ,GAAG,IAAI;EACjB73N,CAAC,CAAC83N,KAAK,GAAG,IAAI;EACd93N,CAAC,CAAC+3N,UAAU,GAAG,IAAI;EACnB/3N,CAAC,CAACg4N,QAAQ,GAAG,IAAI;EACjBh4N,CAAC,CAAC,qBAAqB,CAAC,GAAG,IAAI;EAC/BA,CAAC,CAACi4N,OAAO,GAAG,IAAI;EAChBj4N,CAAC,CAACk4N,IAAI,GAAG,IAAI;EACbl4N,CAAC,CAACm4N,IAAI,GAAG,IAAI;EACbn4N,CAAC,CAACo4N,KAAK,GAAG,IAAI;EACdp4N,CAAC,CAACq4N,MAAM,GAAG,IAAI;EACfr4N,CAAC,CAACs4N,WAAW,GAAG,IAAI;EACpBt4N,CAAC,CAACu4N,IAAI,GAAG,IAAI;EACbv4N,CAAC,CAACw4N,KAAK,GAAG,IAAI;EACdx4N,CAAC,CAAC,kBAAkB,CAAC,GAAG,IAAI;EAC5BA,CAAC,CAACy4N,QAAQ,GAAG,IAAI;EACjBz4N,CAAC,CAAC,oBAAoB,CAAC,GAAG,IAAI;EAC9BA,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;EAC3BA,CAAC,CAAC,eAAe,CAAC,GAAG,IAAI;EACzBA,CAAC,CAAC04N,MAAM,GAAG,IAAI;EACf14N,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI;EACxBA,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI;EACxBA,CAAC,CAAC24N,OAAO,GAAG,IAAI;EAChB34N,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI;EAC1BA,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI;EAC1BA,CAAC,CAAC44N,OAAO,GAAG,IAAI;EAChB54N,CAAC,CAAC64N,OAAO,GAAG,IAAI;EAChB74N,CAAC,CAAC84N,QAAQ,GAAG,IAAI;EACjB94N,CAAC,CAAC+4N,OAAO,GAAG,IAAI;EAChB/4N,CAAC,CAACg5N,OAAO,GAAG,IAAI;EAChBh5N,CAAC,CAACi5N,MAAM,GAAG,IAAI;EACfj5N,CAAC,CAACk5N,MAAM,GAAG,IAAI;EACfl5N,CAAC,CAACm5N,OAAO,GAAG,IAAI;EAChBn5N,CAAC,CAAC,mBAAmB,CAAC,GAAG,IAAI;EAC7BA,CAAC,CAAC,oBAAoB,CAAC,GAAG,IAAI;EAC9BA,CAAC,CAACo5N,SAAS,GAAG,IAAI;EAClBp5N,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI;EACtBA,CAAC,CAACq5N,UAAU,GAAG,IAAI;EACnBr5N,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI;EACvBA,CAAC,CAACs5N,SAAS,GAAG,IAAI;EAClBt5N,CAAC,CAACu5N,SAAS,GAAG,IAAI;EAClBv5N,CAAC,CAACw5N,MAAM,GAAG,IAAI;EACfx5N,CAAC,CAACy5N,OAAO,GAAG,IAAI;EAChBz5N,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;EAC3BA,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI;EAC1BA,CAAC,CAAC05N,UAAU,GAAG,IAAI;EACnB15N,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI;EACxBA,CAAC,CAAC25N,MAAM,GAAG,IAAI;EACf35N,CAAC,CAAC45N,OAAO,GAAG,IAAI;EAChB55N,CAAC,CAAC65N,UAAU,GAAG,IAAI;EACnB75N,CAAC,CAAC85N,QAAQ,GAAG,IAAI;EACjB95N,CAAC,CAAC+5N,SAAS,GAAG,IAAI;EAClB/5N,CAAC,CAACg6N,SAAS,GAAG,IAAI;EAClBh6N,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI;EACpBA,CAAC,CAACi6N,OAAO,GAAG,IAAI;EAChBj6N,CAAC,CAACk6N,SAAS,GAAG,IAAI;EAClBl6N,CAAC,CAACm6N,SAAS,GAAG,IAAI;EAClBn6N,CAAC,CAAC,eAAe,CAAC,GAAG,IAAI;EACzBA,CAAC,CAACo6N,QAAQ,GAAG,IAAI;EACjBp6N,CAAC,CAACq6N,OAAO,GAAG,IAAI;EAChBr6N,CAAC,CAACs6N,OAAO,GAAG,IAAI;EAChBt6N,CAAC,CAACu6N,UAAU,GAAG,IAAI;EACnBv6N,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;EAC3BA,CAAC,CAAC,kBAAkB,CAAC,GAAG,IAAI;EAC5BA,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI;EAC1BA,CAAC,CAACw6N,OAAO,GAAG,IAAI;EAChBx6N,CAAC,CAAC,mBAAmB,CAAC,GAAG,IAAI;EAC7BA,CAAC,CAACy6N,OAAO,GAAG,IAAI;EAChBz6N,CAAC,CAAC06N,QAAQ,GAAG,IAAI;EACjB16N,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;EAC3BA,CAAC,CAAC26N,SAAS,GAAG,IAAI;EAClB36N,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI;EACxBA,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI;EACxBA,CAAC,CAAC46N,OAAO,GAAG,IAAI;EAChB56N,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI;EACvBA,CAAC,CAAC66N,MAAM,GAAG,IAAI;EACf76N,CAAC,CAAC86N,MAAM,GAAG,IAAI;EACf96N,CAAC,CAAC+6N,OAAO,GAAG,IAAI;EAChB/6N,CAAC,CAACg7N,OAAO,GAAG,IAAI;EAChBh7N,CAAC,CAACi7N,eAAe,GAAG,IAAI;EACxBj7N,CAAC,CAAC,kBAAkB,CAAC,GAAG,IAAI;EAC5BA,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;EAC3BA,CAAC,CAACk7N,aAAa,GAAG,IAAI;EACtBl7N,CAAC,CAACm7N,MAAM,GAAG,IAAI;EACfn7N,CAAC,CAAC,eAAe,CAAC,GAAG,IAAI;EACzBA,CAAC,CAACo7N,MAAM,GAAG,IAAI;EACfp7N,CAAC,CAACq7N,OAAO,GAAG,IAAI;EAChBr7N,CAAC,CAACs7N,MAAM,GAAG,IAAI;EACft7N,CAAC,CAACu7N,MAAM,GAAG,IAAI;EACfv7N,CAAC,CAACw7N,MAAM,GAAG,IAAI;EACfx7N,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI;EACrBA,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI;EACrBA,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI;EACpBA,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI;EACtBA,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI;EACpBA,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI;EACxBA,CAAC,CAAC,uBAAuB,CAAC,GAAG,IAAI;EACjCA,CAAC,CAAC03N,aAAa,GAAG,IAAI;EACtB13N,CAAC,CAACy7N,QAAQ,GAAG,IAAI;EACjBz7N,CAAC,CAAC07N,QAAQ,GAAG,IAAI;EACjB17N,CAAC,CAAC27N,OAAO,GAAG,IAAI;EAChB37N,CAAC,CAAC,oBAAoB,CAAC,GAAG,IAAI;EAC9BA,CAAC,CAAC47N,QAAQ,GAAG,IAAI;EACjB57N,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI;EACxBA,CAAC,CAAC,mBAAmB,CAAC,GAAG,IAAI;EAC7BA,CAAC,CAAC67N,OAAO,GAAG,IAAI;EAChB77N,CAAC,CAAC87N,OAAO,GAAG,IAAI;EAChB97N,CAAC,CAAC+7N,QAAQ,GAAG,IAAI;EACjB/7N,CAAC,CAACg8N,KAAK,GAAG,IAAI;EACdh8N,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI;EACvBA,CAAC,CAACi8N,KAAK,GAAG,IAAI;EACdj8N,CAAC,CAACk8N,KAAK,GAAG,IAAI;EACdl8N,CAAC,CAACm8N,OAAO,GAAG,IAAI;EAChBn8N,CAAC,CAACo8N,OAAO,GAAG,IAAI;EAChBp8N,CAAC,CAACq8N,QAAQ,GAAG,IAAI;EACjBr8N,CAAC,CAACs8N,IAAI,GAAG,IAAI;EACbt8N,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI;EAC1BA,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI;EACvBA,CAAC,CAACu8N,OAAO,GAAG,IAAI;EAChBv8N,CAAC,CAACw8N,KAAK,GAAG,IAAI;EACdx8N,CAAC,CAACy8N,MAAM,GAAG,IAAI;EACfz8N,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI;EACnBA,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI;EAC3BA,CAAC,CAAC08N,MAAM,GAAG,IAAI;EACf18N,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI;EACrBA,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI;EAC1BA,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI;EACtBA,CAAC,CAAC28N,UAAU,GAAG,IAAI;EACnB38N,CAAC,CAAC48N,MAAM,GAAG,IAAI;EACf58N,CAAC,CAAC68N,KAAK,GAAG,IAAI;EACd78N,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI;EACtBA,CAAC,CAAC88N,OAAO,GAAG,IAAI;EAChB98N,CAAC,CAAC+8N,IAAI,GAAG,IAAI;AACf,CAAC,CAAC;AAEF,MAAMC,eAAe,GAAGnxN,qBAAqB,CAAC,UAAU7L,CAAC,EAAE;EACzDA,CAAC,CAACi9N,QAAQ,GAAG,IAAI;EACjBj9N,CAAC,CAACiD,MAAM,GAAG,IAAI;EACfjD,CAAC,CAACu2N,YAAY,GAAG,IAAI;EACrBv2N,CAAC,CAACk9N,SAAS,GAAG,IAAI;EAClBl9N,CAAC,CAAC,gBAAgB,CAAC,GAAG,IAAI;EAC1BA,CAAC,CAAC,mBAAmB,CAAC,GAAG,IAAI;AAC/B,CAAC,CAAC;AAKF,MAAMm9N,2BAA2B,GAAGtxN,qBAAqB,CAAC,UAAU7L,CAAC,EAAE;EACrEA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;EACbA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;EACfA,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;EACfA,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;EACfA,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;EACfA,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;EACfA,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;EACfA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;EACfA,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;EACbA,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;EACfA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;EACdA,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;AAChB,CAAC,CAAC;AAKF,MAAMo9N,oCAAoC,GAAGvxN,qBAAqB,CAChE,UAAU7L,CAAC,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;AACd,CACF,CAAC;AAKD,MAAMq9N,iCAAiC,GAAGxxN,qBAAqB,CAAC,UAAU7L,CAAC,EAAE;EAC3EA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;EACTA,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;EACVA,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;EACVA,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;EACVA,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;EACXA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;EACZA,CAAC,CAAC,GAAG,CA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,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAC3E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAC7E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EACxE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACvE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC1E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC1E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAC1E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACtE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,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,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,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AO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAC3E,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EACvE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EACzE,OAAO,EAAE,MAAM,EAAE,OAAO,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E,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,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E,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EACrE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC1E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EACvE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,E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MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EACrE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC1E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAC3E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EACzE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO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AE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAC7E,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAC5E,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAC3E,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EACzE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAClD;AACD,MAAMC,uBAAuB,GAAG;EAAEhP,UAAU,EAAE,GAAG;EAAEgL,OAAO,EAAE;AAAI,CAAC;;;ACpUjE,MAAMiE,wBAAwB,GAAG,CAC/B,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CACxB;AAGD,MAAMC,yBAAyB,GAAG,CAChC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC3E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAC3E,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAC3D;AAGD,MAAMC,8BAA8B,GAAG,CACrC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CACxB;AAGD,MAAMC,+BAA+B,GAAG,CACtC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC3E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAC3E,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAC3D;AAGD,MAAMC,0BAA0B,GAAG,CACjC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CACxB;AAGD,MAAMC,2BAA2B,GAAG,CAClC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC3E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAC3E,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAC3D;AAGD,MAAMC,2BAA2B,GAAG,CAClC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC5E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC3E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CACxB;AAGD,MAAMC,4BAA4B,GAAG,CACnC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC1E,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAC1E,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACzE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC3E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC5E,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAA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AAO,EAAE,OAAO,EACvE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,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EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACzE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EACtE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC7E,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC1E,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAC7B;AACD,MAAMC,0BAA0B,GAAG;EAAE5P,UAAU,EAAE,GAAG;EAAEgL,OAAO,EAAE;AAAI,CAAC;AAIpE,MAAM6E,sBAAsB,GAAG,CAC7B,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAC5E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EACxE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC3E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC7E,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAC7E,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACvE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC1E,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC3E,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAC7E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC5E,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC3E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAC5E,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAC7E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7E,OAAO,EAAE,CAAC,EAAE,OAAO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AAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC7E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC3E,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAC7E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EACvE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,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AAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC5E,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EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAC3E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACtE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,O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E,MAAM,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACxE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAC7E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EACvE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EACtE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACtE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC3E,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACvE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EACzE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CACvE;AACD,MAAMC,oBAAoB,GAAG;EAAEtQ,UAAU,EAAE,OAAO;EAAEgL,OAAO,EAAE;AAAE,CAAC;AAIhE,MAAMuF,qBAAqB,GAAG,CAC5B,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EACvE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAA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,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAC3E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EACxE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACzE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EACrE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACtE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACrE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAA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I,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACnE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACrE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAClE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACpE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACpE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACrE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACpE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACnE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACrE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACrE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EACpE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACpE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACpE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACrE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EACpE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CACtE;AASD,MAAMC,WAAW,GAAG,CAClB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EACvE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACxE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EACvE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EACpE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACpE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EACvE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EACvE,IAAI,EA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AAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAClC,IAAIA,M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AAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CACvB,CAAC;EAEF+6V,MAAM,GAAG,IAAI/6V,UAAU,CAAC,CACtB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CACvB,CAAC;EAEFg7V,IAAI,GAAG,IAAIx6V,WAAW,CAAC,CACrB,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EACtE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UA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AE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CACvB,CAAC;EAEF5B,WAAWA,CAACmO,G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","sources":["webpack://pdf.js/./src/shared/util.js","webpack://pdf.js/./src/core/primitives.js","webpack://pdf.js/./src/core/base_stream.js","webpack://pdf.js/./src/core/string_utils.js","webpack://pdf.js/./src/core/core_utils.js","webpack://pdf.js/./external/qcms/qcms_utils.js","webpack://pdf.js/./external/qcms/qcms.js","webpack://pdf.js/./src/shared/math_clamp.js","webpack://pdf.js/./src/core/colorspace.js","webpack://pdf.js/./src/core/icc_colorspace.js","webpack://pdf.js/./src/core/stream.js","webpack://pdf.js/./src/core/chunked_stream.js","webpack://pdf.js/./src/shared/image_utils.js","webpack://pdf.js/./src/core/image_resizer.js","webpack://pdf.js/./src/core/decode_stream.js","webpack://pdf.js/./src/core/colorspace_utils.js","webpack://pdf.js/./src/core/jpg.js","webpack://pdf.js/./src/core/jpeg_stream.js","webpack://pdf.js/./src/core/operator_list.js","webpack://pdf.js/./src/core/pattern.js","webpack://pdf.js/./src/core/binary_cmap.js","webpack://pdf.js/./src/core/ascii_85_stream.js","webpack://pdf.js/./src/core/ascii_hex_stream.js","webpack://pdf.js/./external/brotli/decode.js","webpack://pdf.js/./src/core/brotli_stream.js","webpack://pdf.js/./external/jbig2/jbig2.js","webpack://pdf.js/./src/core/wasm_image.js","webpack://pdf.js/./src/core/jbig2_ccittFax.js","webpack://pdf.js/./src/core/ccitt_stream.js","webpack://pdf.js/./src/core/flate_stream.js","webpack://pdf.js/./src/core/jbig2_stream.js","webpack://pdf.js/./external/openjpeg/openjpeg.js","webpack://pdf.js/./src/core/jpx.js","webpack://pdf.js/./src/core/jpx_stream.js","webpack://pdf.js/./src/core/lzw_stream.js","webpack://pdf.js/./src/core/predictor_stream.js","webpack://pdf.js/./src/core/run_length_stream.js","webpack://pdf.js/./src/core/parser.js","webpack://pdf.js/./src/core/cmap.js","webpack://pdf.js/./src/shared/obj_bin_transform_utils.js","webpack://pdf.js/./src/core/obj_bin_transform_core.js","webpack://pdf.js/./src/core/encodings.js","webpack://pdf.js/./src/core/glyphlist.js","webpack://pdf.js/./src/core/unicode.js","webpack://pdf.js/./src/core/fonts_utils.js","webpack://pdf.js/./src/core/charsets.js","webpack://pdf.js/./src/core/data_builder.js","webpack://pdf.js/./src/core/cff_parser.js","webpack://pdf.js/./src/core/standard_fonts.js","webpack://pdf.js/./src/core/glyf.js","webpack://pdf.js/./src/core/to_unicode_map.js","webpack://pdf.js/./src/core/cff_font.js","webpack://pdf.js/./src/core/font_renderer.js","webpack://pdf.js/./src/core/metrics.js","webpack://pdf.js/./src/core/opentype_file_builder.js","webpack://pdf.js/./src/core/type1_parser.js","webpack://pdf.js/./src/core/type1_font.js","webpack://pdf.js/./src/core/fonts.js","webpack://pdf.js/./src/core/calibri_factors.js","webpack://pdf.js/./src/core/helvetica_factors.js","webpack://pdf.js/./src/core/liberationsans_widths.js","webpack://pdf.js/./src/core/myriadpro_factors.js","webpack://pdf.js/./src/core/segoeui_factors.js","webpack://pdf.js/./src/core/xfa_fonts.js","webpack://pdf.js/./src/core/postscript/lexer.js","webpack://pdf.js/./src/core/postscript/ast.js","webpack://pdf.js/./src/core/postscript/js_evaluator.js","webpack://pdf.js/./src/core/postscript/wasm_compiler.js","webpack://pdf.js/./src/core/image_utils.js","webpack://pdf.js/./src/core/function.js","webpack://pdf.js/./src/core/evaluator_utils.js","webpack://pdf.js/./src/core/bidi.js","webpack://pdf.js/./src/core/font_substitutions.js","webpack://pdf.js/./src/shared/murmurhash3.js","webpack://pdf.js/./src/core/image.js","webpack://pdf.js/./src/core/evaluator.js","webpack://pdf.js/./src/core/default_appearance.js","webpack://pdf.js/./src/shared/scripting_utils.js","webpack://pdf.js/./src/core/name_number_tree.js","webpack://pdf.js/./src/core/cleanup_helper.js","webpack://pdf.js/./src/core/file_spec.js","webpack://pdf.js/./src/core/xml_parser.js","webpack://pdf.js/./src/core/metadata_parser.js","webpack://pdf.js/./src/core/struct_tree.js","webpack://pdf.js/./src/core/catalog.js","webpack://pdf.js/./src/core/editor/pdf_images.js","webpack://pdf.js/./src/core/object_loader.js","webpack://pdf.js/./src/core/xfa/symbol_utils.js","webpack://pdf.js/./src/core/xfa/namespaces.js","webpack://pdf.js/./src/core/xfa/utils.js","webpack://pdf.js/./src/core/xfa/fonts.js","webpack://pdf.js/./src/core/xfa/text.js","webpack://pdf.js/./src/core/xfa/som.js","webpack://pdf.js/./src/core/xfa/xfa_object.js","webpack://pdf.js/./src/core/xfa/html_utils.js","webpack://pdf.js/./src/core/xfa/layout.js","webpack://pdf.js/./src/core/xfa/template.js","webpack://pdf.js/./src/core/xfa/bind.js","webpack://pdf.js/./src/core/xfa/data.js","webpack://pdf.js/./src/core/xfa/config.js","webpack://pdf.js/./src/core/xfa/connection_set.js","webpack://pdf.js/./src/core/xfa/datasets.js","webpack://pdf.js/./src/core/xfa/locale_set.js","webpack://pdf.js/./src/core/xfa/signature.js","webpack://pdf.js/./src/core/xfa/stylesheet.js","webpack://pdf.js/./src/core/xfa/xdp.js","webpack://pdf.js/./src/core/xfa/xhtml.js","webpack://pdf.js/./src/core/xfa/setup.js","webpack://pdf.js/./src/core/xfa/unknown.js","webpack://pdf.js/./src/core/xfa/builder.js","webpack://pdf.js/./src/core/xfa/parser.js","webpack://pdf.js/./src/core/xfa/factory.js","webpack://pdf.js/./src/core/annotation.js","webpack://pdf.js/./src/core/calculate_md5.js","webpack://pdf.js/./src/core/dataset_reader.js","webpack://pdf.js/./src/core/intersector.js","webpack://pdf.js/./src/core/calculate_sha_other.js","webpack://pdf.js/./src/core/calculate_sha256.js","webpack://pdf.js/./src/core/decrypt_stream.js","webpack://pdf.js/./src/core/crypto.js","webpack://pdf.js/./src/core/xref.js","webpack://pdf.js/./src/core/document.js","webpack://pdf.js/./src/core/pdf_manager.js","webpack://pdf.js/./src/shared/message_handler.js","webpack://pdf.js/./src/core/writer.js","webpack://pdf.js/./src/core/editor/pdf_editor.js","webpack://pdf.js/./src/shared/base_pdf_stream.js","webpack://pdf.js/./src/core/worker_stream.js","webpack://pdf.js/./src/core/worker.js","webpack://pdf.js/./src/pdf.worker.js"],"sourcesContent":["/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals process */\n\n// NW.js / Electron is a browser context, but copies some Node.js objects; see\n// http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/#access-nodejs-and-nwjs-api-in-browser-context\n// https://www.electronjs.org/docs/api/process#processversionselectron-readonly\n// https://www.electronjs.org/docs/api/process#processtype-readonly\nconst isNodeJS =\n  (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n  typeof process === \"object\" &&\n  process + \"\" === \"[object process]\" &&\n  !process.versions.nw &&\n  !(process.versions.electron && process.type && process.type !== \"browser\");\n\nconst BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity];\nconst F32_BBOX_INIT = new Float32Array(BBOX_INIT);\n\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\n// Represent the percentage of the height of a single-line field over\n// the font size. Acrobat seems to use this value.\nconst LINE_FACTOR = 1.35;\nconst LINE_DESCENT_FACTOR = 0.35;\nconst BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/**\n * Refer to the `WorkerTransport.getRenderingIntent`-method in the API, to see\n * how these flags are being used:\n *  - ANY, DISPLAY, and PRINT are the normal rendering intents, note the\n *    `PDFPageProxy.{render, getOperatorList, getAnnotations}`-methods.\n *  - SAVE is used, on the worker-thread, when saving modified annotations.\n *  - ANNOTATIONS_FORMS, ANNOTATIONS_STORAGE, ANNOTATIONS_DISABLE control which\n *    annotations are rendered onto the canvas (i.e. by being included in the\n *    operatorList), note the `PDFPageProxy.{render, getOperatorList}`-methods\n *    and their `annotationMode`-option.\n *  - IS_EDITING is used when editing is active in the viewer.\n *  - OPLIST is used with the `PDFPageProxy.getOperatorList`-method, note the\n *    `OperatorList`-constructor (on the worker-thread).\n */\nconst RenderingIntentFlag = {\n  ANY: 0x01,\n  DISPLAY: 0x02,\n  PRINT: 0x04,\n  SAVE: 0x08,\n  ANNOTATIONS_FORMS: 0x10,\n  ANNOTATIONS_STORAGE: 0x20,\n  ANNOTATIONS_DISABLE: 0x40,\n  IS_EDITING: 0x80,\n  OPLIST: 0x100,\n};\n\nconst AnnotationMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_FORMS: 2,\n  ENABLE_STORAGE: 3,\n};\n\nconst AnnotationPrefix = \"pdfjs_internal_id_\";\nconst AnnotationEditorPrefix = \"pdfjs_internal_editor_\";\n\nconst AnnotationEditorType = {\n  DISABLE: -1,\n  NONE: 0,\n  FREETEXT: 3,\n  HIGHLIGHT: 9,\n  STAMP: 13,\n  INK: 15,\n  POPUP: 16,\n  SIGNATURE: 101,\n  COMMENT: 102,\n};\n\nconst AnnotationEditorParamsType = {\n  RESIZE: 1,\n  CREATE: 2,\n  FREETEXT_SIZE: 11,\n  FREETEXT_COLOR: 12,\n  FREETEXT_OPACITY: 13,\n  INK_COLOR: 21,\n  INK_THICKNESS: 22,\n  INK_OPACITY: 23,\n  INK_COLOR_AND_OPACITY: 24,\n  HIGHLIGHT_COLOR: 31,\n  HIGHLIGHT_THICKNESS: 32,\n  HIGHLIGHT_FREE: 33,\n  HIGHLIGHT_SHOW_ALL: 34,\n  DRAW_STEP: 41,\n};\n\n// Permission flags from Table 22, Section 7.6.3.2 of the PDF specification.\nconst PermissionFlag = {\n  PRINT: 0x04,\n  MODIFY_CONTENTS: 0x08,\n  COPY: 0x10,\n  MODIFY_ANNOTATIONS: 0x20,\n  FILL_INTERACTIVE_FORMS: 0x100,\n  COPY_FOR_ACCESSIBILITY: 0x200,\n  ASSEMBLE: 0x400,\n  PRINT_HIGH_QUALITY: 0x800,\n};\n\nconst MeshFigureType = {\n  TRIANGLES: 1,\n  LATTICE: 2,\n  PATCH: 3,\n};\n\nconst TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4,\n};\n\nconst ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3,\n};\n\nconst AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26,\n  RICHMEDIA: 27,\n};\n\nconst AnnotationReplyType = {\n  GROUP: \"Group\",\n  REPLY: \"R\",\n};\n\n// Rendition action operations from Table 214, Section 12.6.4.13 of the PDF\n// specification (ISO 32000-1).\nconst AnnotationRenditionOperation = {\n  PLAY_OR_RESUME: 0,\n  STOP: 1,\n  PAUSE: 2,\n  RESUME: 3,\n  PLAY: 4,\n};\n\nconst AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200,\n};\n\nconst AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000,\n};\n\nconst AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5,\n};\n\nconst AnnotationActionEventType = {\n  E: \"Mouse Enter\",\n  X: \"Mouse Exit\",\n  D: \"Mouse Down\",\n  U: \"Mouse Up\",\n  Fo: \"Focus\",\n  Bl: \"Blur\",\n  PO: \"PageOpen\",\n  PC: \"PageClose\",\n  PV: \"PageVisible\",\n  PI: \"PageInvisible\",\n  K: \"Keystroke\",\n  F: \"Format\",\n  V: \"Validate\",\n  C: \"Calculate\",\n};\n\nconst DocumentActionEventType = {\n  WC: \"WillClose\",\n  WS: \"WillSave\",\n  DS: \"DidSave\",\n  WP: \"WillPrint\",\n  DP: \"DidPrint\",\n};\n\nconst PageActionEventType = {\n  O: \"PageOpen\",\n  C: \"PageClose\",\n};\n\nconst VerbosityLevel = {\n  ERRORS: 0,\n  WARNINGS: 1,\n  INFOS: 5,\n};\n\n// All the possible operations for an operator list.\nconst OPS = {\n  // Intentionally start from 1 so it is easy to spot bad operators that will be\n  // 0's.\n  // PLEASE NOTE: We purposely keep any removed operators commented out, since\n  //              re-numbering the list would risk breaking third-party users.\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  // beginAnnotations: 78,\n  // endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  // paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91,\n  setStrokeTransparent: 92,\n  setFillTransparent: 93,\n  rawFillPath: 94,\n};\n\n// In order to have a switch statement that is fast (i.e. which use a jump\n// table), we need to have the OPS in a contiguous range.\nconst DrawOPS = {\n  moveTo: 0,\n  lineTo: 1,\n  curveTo: 2,\n  quadraticCurveTo: 3,\n  closePath: 4,\n};\n\nconst PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2,\n};\n\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n  if (Number.isInteger(level)) {\n    verbosity = level;\n  }\n}\n\nfunction getVerbosityLevel() {\n  return verbosity;\n}\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n  if (verbosity >= VerbosityLevel.INFOS) {\n    // eslint-disable-next-line no-console\n    console.info(`Info: ${msg}`);\n  }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n  if (verbosity >= VerbosityLevel.WARNINGS) {\n    // eslint-disable-next-line no-console\n    console.warn(`Warning: ${msg}`);\n  }\n}\n\n/**\n * @param {string} msg\n * @returns {never}\n */\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\n\n// Checks if URLs use one of the allowed protocols, e.g. to avoid XSS.\nfunction _isValidProtocol(url) {\n  switch (url?.protocol) {\n    case \"http:\":\n    case \"https:\":\n    case \"ftp:\":\n    case \"mailto:\":\n    case \"tel:\":\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Attempts to create a valid absolute URL.\n *\n * @param {URL|string} url - An absolute, or relative, URL.\n * @param {URL|string} [baseUrl] - An absolute URL.\n * @param {Object} [options]\n * @returns Either a valid {URL}, or `null` otherwise.\n */\nfunction createValidAbsoluteUrl(url, baseUrl = null, options = null) {\n  if (!url) {\n    return null;\n  }\n  if (options && typeof url === \"string\") {\n    // Let URLs beginning with \"www.\" default to using the \"http://\" protocol.\n    if (options.addDefaultProtocol && url.startsWith(\"www.\")) {\n      const dots = url.match(/\\./g);\n      // Avoid accidentally matching a *relative* URL pointing to a file named\n      // e.g. \"www.pdf\" or similar.\n      if (dots?.length >= 2) {\n        url = `http://${url}`;\n      }\n    }\n\n    // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded\n    // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding; see bug 1122280.\n    if (options.tryConvertEncoding) {\n      try {\n        url = stringToUTF8String(url);\n      } catch {}\n    }\n  }\n\n  const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n  return _isValidProtocol(absoluteUrl) ? absoluteUrl : null;\n}\n\n/**\n * Remove, or replace, the hash property of the URL.\n *\n * @param {URL|string} url - The absolute, or relative, URL.\n * @param {string} hash - The hash property (use an empty string to remove it).\n * @param {boolean} [allowRel] - Allow relative URLs.\n * @returns {string} The resulting URL string.\n */\nfunction updateUrlHash(url, hash, allowRel = false) {\n  const res = URL.parse(url);\n  if (res) {\n    res.hash = hash;\n    return res.href;\n  }\n  // Support well-formed relative URLs, necessary for `web/app.js` in GENERIC\n  // builds, by optionally falling back to string parsing.\n  if (allowRel && createValidAbsoluteUrl(url, \"http://example.com\")) {\n    return url.split(\"#\", 1)[0] + `${hash ? `#${hash}` : \"\"}`;\n  }\n  return \"\";\n}\n\n// Extract the final component from a path string.\nfunction stripPath(str) {\n  return str.substring(str.lastIndexOf(\"/\") + 1);\n}\n\nfunction shadow(obj, prop, value, nonSerializable = false) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      prop in obj,\n      `shadow: Property \"${prop && prop.toString()}\" not found in object.`\n    );\n  }\n  Object.defineProperty(obj, prop, {\n    value,\n    enumerable: !nonSerializable,\n    configurable: true,\n    writable: false,\n  });\n  return value;\n}\n\n/**\n * @type {any}\n */\nconst BaseException = (function BaseExceptionClosure() {\n  // eslint-disable-next-line no-shadow\n  function BaseException(message, name) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseException\n    ) {\n      unreachable(\"Cannot initialize BaseException.\");\n    }\n    this.message = message;\n    this.name = name;\n  }\n  BaseException.prototype = new Error();\n  BaseException.constructor = BaseException;\n\n  return BaseException;\n})();\n\nclass PasswordException extends BaseException {\n  constructor(msg, code) {\n    super(msg, \"PasswordException\");\n    this.code = code;\n  }\n}\n\nclass UnknownErrorException extends BaseException {\n  constructor(msg, details) {\n    super(msg, \"UnknownErrorException\");\n    this.details = details;\n  }\n}\n\nclass InvalidPDFException extends BaseException {\n  constructor(msg) {\n    super(msg, \"InvalidPDFException\");\n  }\n}\n\nclass ResponseException extends BaseException {\n  constructor(msg, status, missing) {\n    super(msg, \"ResponseException\");\n    this.status = status;\n    this.missing = missing;\n  }\n}\n\n/**\n * Error caused during parsing PDF data.\n */\nclass FormatError extends BaseException {\n  constructor(msg) {\n    super(msg, \"FormatError\");\n  }\n}\n\n/**\n * Error used to indicate task cancellation.\n */\nclass AbortException extends BaseException {\n  constructor(msg) {\n    super(msg, \"AbortException\");\n  }\n}\n\nfunction bytesToString(bytes) {\n  if (typeof bytes !== \"object\" || bytes?.length === undefined) {\n    unreachable(\"Invalid argument for bytesToString\");\n  }\n  const length = bytes.length;\n  const MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  const strBuf = [];\n  for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    const chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join(\"\");\n}\n\nfunction stringToBytes(str) {\n  if (typeof str !== \"string\") {\n    unreachable(\"Invalid argument for stringToBytes\");\n  }\n  const length = str.length;\n  const bytes = new Uint8Array(length);\n  for (let i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xff;\n  }\n  return bytes;\n}\n\nfunction objectSize(obj) {\n  return Object.keys(obj).length;\n}\n\nclass FeatureTest {\n  static get isLittleEndian() {\n    const buffer8 = new Uint8Array(4);\n    buffer8[0] = 1;\n    const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n\n    return shadow(this, \"isLittleEndian\", view32[0] === 1);\n  }\n\n  static get isOffscreenCanvasSupported() {\n    return shadow(\n      this,\n      \"isOffscreenCanvasSupported\",\n      typeof OffscreenCanvas !== \"undefined\"\n    );\n  }\n\n  static get isImageDecoderSupported() {\n    return shadow(\n      this,\n      \"isImageDecoderSupported\",\n      typeof ImageDecoder !== \"undefined\"\n    );\n  }\n\n  static get isFloat16ArraySupported() {\n    return shadow(\n      this,\n      \"isFloat16ArraySupported\",\n      typeof Float16Array !== \"undefined\"\n    );\n  }\n\n  static get isSanitizerSupported() {\n    return shadow(\n      this,\n      \"isSanitizerSupported\",\n      typeof Sanitizer !== \"undefined\"\n    );\n  }\n\n  static get platform() {\n    const { platform, userAgent } = navigator;\n\n    return shadow(this, \"platform\", {\n      isAndroid: userAgent.includes(\"Android\"),\n      isLinux: platform.includes(\"Linux\"),\n      isMac: platform.includes(\"Mac\"),\n      isWindows: platform.includes(\"Win\"),\n      isFirefox:\n        (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n        userAgent.includes(\"Firefox\"),\n    });\n  }\n\n  static get isCanvasFilterSupported() {\n    let ctx;\n    if (this.isOffscreenCanvasSupported) {\n      ctx = new OffscreenCanvas(1, 1).getContext(\"2d\");\n    } else if (\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"WORKER_THREAD\")) &&\n      typeof document !== \"undefined\"\n    ) {\n      ctx = document.createElement(\"canvas\").getContext(\"2d\");\n    }\n    // Spec-compliant Canvas2D defaults `ctx.filter` to \"none\". On\n    // browsers without filter support (Safari) the property is absent\n    // until you assign to it, after which it behaves like an ordinary\n    // JS property and stores whatever string you set without applying\n    // it. Probing the default lets us detect the difference reliably.\n    return shadow(this, \"isCanvasFilterSupported\", ctx?.filter !== undefined);\n  }\n\n  static get isAlphaColorInputSupported() {\n    if (\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"WORKER_THREAD\")) ||\n      typeof document === \"undefined\"\n    ) {\n      return shadow(this, \"isAlphaColorInputSupported\", false);\n    }\n    const input = document.createElement(\"input\");\n    input.type = \"color\";\n    input.setAttribute(\"alpha\", \"\");\n    input.value = \"#ff000080\";\n    // If alpha is supported the color picker retains the alpha channel, so\n    // the value won't be a plain opaque color (7-char #rrggbb).\n    return shadow(\n      this,\n      \"isAlphaColorInputSupported\",\n      input.value !== \"#ff0000\"\n    );\n  }\n\n  static get isBackdropFilterSupported() {\n    return shadow(\n      this,\n      \"isBackdropFilterSupported\",\n      typeof CSS !== \"undefined\" && CSS.supports(\"backdrop-filter\", \"blur(1px)\")\n    );\n  }\n}\n\nclass Util {\n  static get hexNums() {\n    return shadow(\n      this,\n      \"hexNums\",\n      Array.from(Array(256).keys(), n => n.toString(16).padStart(2, \"0\"))\n    );\n  }\n\n  static makeHexColor(r, g, b) {\n    return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`;\n  }\n\n  // Concatenates two transformation matrices together and returns the result.\n  static transform(m1, m2) {\n    return [\n      m1[0] * m2[0] + m1[2] * m2[1],\n      m1[1] * m2[0] + m1[3] * m2[1],\n      m1[0] * m2[2] + m1[2] * m2[3],\n      m1[1] * m2[2] + m1[3] * m2[3],\n      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n      m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n    ];\n  }\n\n  // Multiplies m (an array-based transform) by md (a DOMMatrix transform).\n  static multiplyByDOMMatrix(m, md) {\n    return [\n      m[0] * md.a + m[2] * md.b,\n      m[1] * md.a + m[3] * md.b,\n      m[0] * md.c + m[2] * md.d,\n      m[1] * md.c + m[3] * md.d,\n      m[0] * md.e + m[2] * md.f + m[4],\n      m[1] * md.e + m[3] * md.f + m[5],\n    ];\n  }\n\n  // For 2d affine transforms\n  static applyTransform(p, m, pos = 0) {\n    const p0 = p[pos];\n    const p1 = p[pos + 1];\n    p[pos] = p0 * m[0] + p1 * m[2] + m[4];\n    p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5];\n  }\n\n  static applyTransformToBezier(p, transform, pos = 0) {\n    const m0 = transform[0];\n    const m1 = transform[1];\n    const m2 = transform[2];\n    const m3 = transform[3];\n    const m4 = transform[4];\n    const m5 = transform[5];\n    for (let i = 0; i < 6; i += 2) {\n      const pI = p[pos + i];\n      const pI1 = p[pos + i + 1];\n      p[pos + i] = pI * m0 + pI1 * m2 + m4;\n      p[pos + i + 1] = pI * m1 + pI1 * m3 + m5;\n    }\n  }\n\n  static applyInverseTransform(p, m) {\n    const p0 = p[0];\n    const p1 = p[1];\n    const d = m[0] * m[3] - m[1] * m[2];\n    p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n  }\n\n  // Applies the transform to the rectangle and finds the minimum axially\n  // aligned bounding box.\n  static axialAlignedBoundingBox(rect, transform, output) {\n    const m0 = transform[0];\n    const m1 = transform[1];\n    const m2 = transform[2];\n    const m3 = transform[3];\n    const m4 = transform[4];\n    const m5 = transform[5];\n    const r0 = rect[0];\n    const r1 = rect[1];\n    const r2 = rect[2];\n    const r3 = rect[3];\n\n    let a0 = m0 * r0 + m4;\n    let a2 = a0;\n    let a1 = m0 * r2 + m4;\n    let a3 = a1;\n    let b0 = m3 * r1 + m5;\n    let b2 = b0;\n    let b1 = m3 * r3 + m5;\n    let b3 = b1;\n\n    if (m1 !== 0 || m2 !== 0) {\n      // Non-scaling matrix: shouldn't be frequent.\n      const m1r0 = m1 * r0;\n      const m1r2 = m1 * r2;\n      const m2r1 = m2 * r1;\n      const m2r3 = m2 * r3;\n      a0 += m2r1;\n      a3 += m2r1;\n      a1 += m2r3;\n      a2 += m2r3;\n      b0 += m1r0;\n      b3 += m1r0;\n      b1 += m1r2;\n      b2 += m1r2;\n    }\n\n    output[0] = Math.min(output[0], a0, a1, a2, a3);\n    output[1] = Math.min(output[1], b0, b1, b2, b3);\n    output[2] = Math.max(output[2], a0, a1, a2, a3);\n    output[3] = Math.max(output[3], b0, b1, b2, b3);\n  }\n\n  static inverseTransform(m) {\n    const d = m[0] * m[3] - m[1] * m[2];\n    return [\n      m[3] / d,\n      -m[1] / d,\n      -m[2] / d,\n      m[0] / d,\n      (m[2] * m[5] - m[4] * m[3]) / d,\n      (m[4] * m[1] - m[5] * m[0]) / d,\n    ];\n  }\n\n  // This calculation uses Singular Value Decomposition.\n  // The SVD can be represented with formula A = USV. We are interested in the\n  // matrix S here because it represents the scale values.\n  static singularValueDecompose2dScale(matrix, output) {\n    const m0 = matrix[0];\n    const m1 = matrix[1];\n    const m2 = matrix[2];\n    const m3 = matrix[3];\n    // Multiply matrix m with its transpose.\n    const a = m0 ** 2 + m1 ** 2;\n    const b = m0 * m2 + m1 * m3;\n    const c = m2 ** 2 + m3 ** 2;\n\n    // Solve the second degree polynomial to get roots.\n    const first = (a + c) / 2;\n    const second = Math.sqrt(first ** 2 - (a * c - b ** 2));\n    output[0] = Math.sqrt(first + second || 1);\n    output[1] = Math.sqrt(first - second || 1);\n  }\n\n  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n  // For coordinate systems whose origin lies in the bottom-left, this\n  // means normalization to (BL,TR) ordering. For systems with origin in the\n  // top-left, this means (TL,BR) ordering.\n  static normalizeRect(rect) {\n    const r = rect.slice(0); // clone rect\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  }\n\n  // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n  // intersection of rect1 and rect2. If no intersection, returns 'null'\n  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n  static intersect(rect1, rect2) {\n    const xLow = Math.max(\n      Math.min(rect1[0], rect1[2]),\n      Math.min(rect2[0], rect2[2])\n    );\n    const xHigh = Math.min(\n      Math.max(rect1[0], rect1[2]),\n      Math.max(rect2[0], rect2[2])\n    );\n    if (xLow > xHigh) {\n      return null;\n    }\n    const yLow = Math.max(\n      Math.min(rect1[1], rect1[3]),\n      Math.min(rect2[1], rect2[3])\n    );\n    const yHigh = Math.min(\n      Math.max(rect1[1], rect1[3]),\n      Math.max(rect2[1], rect2[3])\n    );\n    if (yLow > yHigh) {\n      return null;\n    }\n\n    return [xLow, yLow, xHigh, yHigh];\n  }\n\n  static pointBoundingBox(x, y, minMax) {\n    minMax[0] = Math.min(minMax[0], x);\n    minMax[1] = Math.min(minMax[1], y);\n    minMax[2] = Math.max(minMax[2], x);\n    minMax[3] = Math.max(minMax[3], y);\n  }\n\n  static rectBoundingBox(x0, y0, x1, y1, minMax) {\n    minMax[0] = Math.min(minMax[0], x0, x1);\n    minMax[1] = Math.min(minMax[1], y0, y1);\n    minMax[2] = Math.max(minMax[2], x0, x1);\n    minMax[3] = Math.max(minMax[3], y0, y1);\n  }\n\n  static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {\n    if (t <= 0 || t >= 1) {\n      return;\n    }\n    const mt = 1 - t;\n    const tt = t * t;\n    const ttt = tt * t;\n    const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;\n    const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;\n    minMax[0] = Math.min(minMax[0], x);\n    minMax[1] = Math.min(minMax[1], y);\n    minMax[2] = Math.max(minMax[2], x);\n    minMax[3] = Math.max(minMax[3], y);\n  }\n\n  static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {\n    if (Math.abs(a) < 1e-12) {\n      if (Math.abs(b) >= 1e-12) {\n        this.#getExtremumOnCurve(\n          x0,\n          x1,\n          x2,\n          x3,\n          y0,\n          y1,\n          y2,\n          y3,\n          -c / b,\n          minMax\n        );\n      }\n      return;\n    }\n\n    const delta = b ** 2 - 4 * c * a;\n    if (delta < 0) {\n      return;\n    }\n    const sqrtDelta = Math.sqrt(delta);\n    const a2 = 2 * a;\n    this.#getExtremumOnCurve(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      (-b + sqrtDelta) / a2,\n      minMax\n    );\n    this.#getExtremumOnCurve(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      (-b - sqrtDelta) / a2,\n      minMax\n    );\n  }\n\n  // From https://github.com/adobe-webplatform/Snap.svg/blob/b365287722a72526000ac4bfcf0ce4cac2faa015/src/path.js#L852\n  static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {\n    minMax[0] = Math.min(minMax[0], x0, x3);\n    minMax[1] = Math.min(minMax[1], y0, y3);\n    minMax[2] = Math.max(minMax[2], x0, x3);\n    minMax[3] = Math.max(minMax[3], y0, y3);\n\n    this.#getExtremum(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      3 * (-x0 + 3 * (x1 - x2) + x3),\n      6 * (x0 - 2 * x1 + x2),\n      3 * (x1 - x0),\n      minMax\n    );\n    this.#getExtremum(\n      x0,\n      x1,\n      x2,\n      x3,\n      y0,\n      y1,\n      y2,\n      y3,\n      3 * (-y0 + 3 * (y1 - y2) + y3),\n      6 * (y0 - 2 * y1 + y2),\n      3 * (y1 - y0),\n      minMax\n    );\n  }\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isArrayEqual(arr1, arr2) {\n  if (arr1.length !== arr2.length) {\n    return false;\n  }\n  for (let i = 0, ii = arr1.length; i < ii; i++) {\n    if (arr1[i] !== arr2[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\nlet NormalizeRegex = null;\nlet NormalizationMap = null;\nfunction normalizeUnicode(str) {\n  if (!NormalizeRegex) {\n    // In order to generate the following regex:\n    //  - create a PDF containing all the chars in the range 0000-FFFF with\n    //    a NFKC which is different of the char.\n    //  - copy and paste all those chars and get the ones where NFKC is\n    //    required.\n    // It appears that most the chars here contain some ligatures.\n    NormalizeRegex =\n      /([\\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;\n    NormalizationMap = new Map([[\"铿匼", \"趴t\"]]);\n  }\n  return str.replaceAll(NormalizeRegex, (_, p1, p2) =>\n    p1 ? p1.normalize(\"NFKC\") : NormalizationMap.get(p2)\n  );\n}\n\nfunction getUuid() {\n  if (\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n    typeof crypto.randomUUID === \"function\"\n  ) {\n    return crypto.randomUUID();\n  }\n  const buf = new Uint8Array(32);\n  crypto.getRandomValues(buf);\n  return bytesToString(buf);\n}\n\nfunction _isValidExplicitDest(validRef, validName, dest) {\n  if (!Array.isArray(dest) || dest.length < 2) {\n    return false;\n  }\n  const [page, zoom, ...args] = dest;\n  if (!validRef(page) && !Number.isInteger(page)) {\n    return false;\n  }\n  if (!validName(zoom)) {\n    return false;\n  }\n  const argsLen = args.length;\n  let allowNull = true;\n  switch (zoom.name) {\n    case \"XYZ\":\n      if (argsLen < 2 || argsLen > 3) {\n        return false;\n      }\n      break;\n    case \"Fit\":\n    case \"FitB\":\n      return argsLen === 0;\n    case \"FitH\":\n    case \"FitBH\":\n    case \"FitV\":\n    case \"FitBV\":\n      if (argsLen > 1) {\n        return false;\n      }\n      break;\n    case \"FitR\":\n      if (argsLen !== 4) {\n        return false;\n      }\n      allowNull = false;\n      break;\n    default:\n      return false;\n  }\n  for (const arg of args) {\n    if (typeof arg === \"number\" || (allowNull && arg === null)) {\n      continue;\n    }\n    return false;\n  }\n  return true;\n}\n\n// Helpers for simple `Map.prototype.getOrInsertComputed()` invocations,\n// to avoid duplicate function creation.\nconst makeArr = () => [];\nconst makeMap = () => new Map();\nconst makeObj = () => Object.create(null);\n\n// See https://developer.mozilla.org/en-US/docs/Web/API/Blob/bytes#browser_compatibility\nif (\n  typeof PDFJSDev !== \"undefined\" &&\n  !PDFJSDev.test(\"SKIP_BABEL\") &&\n  typeof Blob.prototype.bytes !== \"function\"\n) {\n  Blob.prototype.bytes = async function () {\n    return new Uint8Array(await this.arrayBuffer());\n  };\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/API/Response/bytes#browser_compatibility\nif (\n  typeof PDFJSDev !== \"undefined\" &&\n  !PDFJSDev.test(\"SKIP_BABEL\") &&\n  typeof Response.prototype.bytes !== \"function\"\n) {\n  Response.prototype.bytes = async function () {\n    return new Uint8Array(await this.arrayBuffer());\n  };\n}\n\nexport {\n  _isValidExplicitDest,\n  AbortException,\n  AnnotationActionEventType,\n  AnnotationBorderStyleType,\n  AnnotationEditorParamsType,\n  AnnotationEditorPrefix,\n  AnnotationEditorType,\n  AnnotationFieldFlag,\n  AnnotationFlag,\n  AnnotationMode,\n  AnnotationPrefix,\n  AnnotationRenditionOperation,\n  AnnotationReplyType,\n  AnnotationType,\n  assert,\n  BaseException,\n  BASELINE_FACTOR,\n  BBOX_INIT,\n  bytesToString,\n  createValidAbsoluteUrl,\n  DocumentActionEventType,\n  DrawOPS,\n  F32_BBOX_INIT,\n  FeatureTest,\n  FONT_IDENTITY_MATRIX,\n  FormatError,\n  getUuid,\n  getVerbosityLevel,\n  ImageKind,\n  info,\n  InvalidPDFException,\n  isArrayEqual,\n  isNodeJS,\n  LINE_DESCENT_FACTOR,\n  LINE_FACTOR,\n  makeArr,\n  makeMap,\n  makeObj,\n  MeshFigureType,\n  normalizeUnicode,\n  objectSize,\n  OPS,\n  PageActionEventType,\n  PasswordException,\n  PasswordResponses,\n  PermissionFlag,\n  RenderingIntentFlag,\n  ResponseException,\n  setVerbosityLevel,\n  shadow,\n  stringToBytes,\n  stringToUTF8String,\n  stripPath,\n  SVG_NS,\n  TextRenderingMode,\n  UnknownErrorException,\n  unreachable,\n  updateUrlHash,\n  utf8StringToString,\n  Util,\n  VerbosityLevel,\n  warn,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, makeArr, shadow, unreachable } from \"../shared/util.js\";\n\nconst CIRCULAR_REF = Symbol(\"CIRCULAR_REF\");\nconst EOF = Symbol(\"EOF\");\n\nlet CmdCache = Object.create(null);\nlet NameCache = Object.create(null);\nlet RefCache = Object.create(null);\n\nfunction clearPrimitiveCaches() {\n  CmdCache = Object.create(null);\n  NameCache = Object.create(null);\n  RefCache = Object.create(null);\n}\n\nclass Name {\n  constructor(name) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      typeof name !== \"string\"\n    ) {\n      unreachable('Name: The \"name\" must be a string.');\n    }\n    this.name = name;\n  }\n\n  static get(name) {\n    // eslint-disable-next-line no-restricted-syntax\n    return (NameCache[name] ||= new Name(name));\n  }\n}\n\nclass Cmd {\n  constructor(cmd) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      typeof cmd !== \"string\"\n    ) {\n      unreachable('Cmd: The \"cmd\" must be a string.');\n    }\n    this.cmd = cmd;\n  }\n\n  static get(cmd) {\n    // eslint-disable-next-line no-restricted-syntax\n    return (CmdCache[cmd] ||= new Cmd(cmd));\n  }\n}\n\nconst nonSerializable = function nonSerializableClosure() {\n  return nonSerializable; // Creating closure on some variable.\n};\n\nclass Dict {\n  __nonSerializable__ = nonSerializable; // Disable cloning of the Dict.\n\n  #map = new Map();\n\n  objId = null;\n\n  suppressEncryption = false;\n\n  xref;\n\n  constructor(xref = null) {\n    this.xref = xref;\n  }\n\n  assignXref(newXref) {\n    this.xref = newXref;\n  }\n\n  get size() {\n    return this.#map.size;\n  }\n\n  #getValue(isAsync, key1, key2, key3) {\n    let value = this.#map.get(key1);\n    if (value === undefined && key2 !== undefined) {\n      if (\n        (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n        key2.length < key1.length\n      ) {\n        unreachable(\"Dict.#getValue: Expected keys to be ordered by length.\");\n      }\n      value = this.#map.get(key2);\n      if (value === undefined && key3 !== undefined) {\n        if (\n          (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n          key3.length < key2.length\n        ) {\n          unreachable(\"Dict.#getValue: Expected keys to be ordered by length.\");\n        }\n        value = this.#map.get(key3);\n      }\n    }\n    if (value instanceof Ref && this.xref) {\n      return isAsync\n        ? this.xref.fetchAsync(value, this.suppressEncryption)\n        : this.xref.fetch(value, this.suppressEncryption);\n    }\n    return value;\n  }\n\n  // Automatically dereferences Ref objects.\n  get(key1, key2, key3) {\n    return this.#getValue(/* isAsync = */ false, key1, key2, key3);\n  }\n\n  // Same as get(), but returns a promise and uses fetchIfRefAsync().\n  async getAsync(key1, key2, key3) {\n    return this.#getValue(/* isAsync = */ true, key1, key2, key3);\n  }\n\n  // Same as get(), but dereferences all elements if the result is an Array.\n  getArray(key1, key2, key3) {\n    let value = this.#getValue(/* isAsync = */ false, key1, key2, key3);\n\n    if (Array.isArray(value)) {\n      value = value.slice(); // Ensure that we don't modify the Dict data.\n      for (let i = 0, ii = value.length; i < ii; i++) {\n        if (value[i] instanceof Ref && this.xref) {\n          value[i] = this.xref.fetch(value[i], this.suppressEncryption);\n        }\n      }\n    }\n    return value;\n  }\n\n  // No dereferencing.\n  getRaw(key) {\n    return this.#map.get(key);\n  }\n\n  getKeys() {\n    return this.#map.keys();\n  }\n\n  // No dereferencing.\n  getRawValues() {\n    return this.#map.values();\n  }\n\n  getRawEntries() {\n    return this.#map.entries();\n  }\n\n  set(key, value) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      if (typeof key !== \"string\") {\n        unreachable('Dict.set: The \"key\" must be a string.');\n      } else if (value === undefined) {\n        unreachable('Dict.set: The \"value\" cannot be undefined.');\n      }\n    }\n    this.#map.set(key, value);\n  }\n\n  setIfNotExists(key, value) {\n    if (!this.has(key)) {\n      this.set(key, value);\n    }\n  }\n\n  setIfNumber(key, value) {\n    if (typeof value === \"number\") {\n      this.set(key, value);\n    }\n  }\n\n  setIfArray(key, value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n      this.set(key, value);\n    }\n  }\n\n  setIfDefined(key, value) {\n    if (value !== undefined && value !== null) {\n      this.set(key, value);\n    }\n  }\n\n  setIfName(key, value) {\n    if (typeof value === \"string\") {\n      this.set(key, Name.get(value));\n    } else if (value instanceof Name) {\n      this.set(key, value);\n    }\n  }\n\n  setIfDict(key, value) {\n    if (value instanceof Dict) {\n      this.set(key, value);\n    }\n  }\n\n  has(key) {\n    return this.#map.has(key);\n  }\n\n  *[Symbol.iterator]() {\n    for (const [key, value] of this.#map) {\n      yield [\n        key,\n        value instanceof Ref && this.xref\n          ? this.xref.fetch(value, this.suppressEncryption)\n          : value,\n      ];\n    }\n  }\n\n  static get empty() {\n    const emptyDict = new Dict(null);\n\n    emptyDict.set = (key, value) => {\n      unreachable(\"Should not call `set` on the empty dictionary.\");\n    };\n    return shadow(this, \"empty\", emptyDict);\n  }\n\n  static merge({ xref, dictArray, mergeSubDicts = false }) {\n    const mergedDict = new Dict(xref),\n      properties = new Map();\n\n    for (const dict of dictArray) {\n      if (!(dict instanceof Dict)) {\n        continue;\n      }\n      for (const [key, value] of dict.getRawEntries()) {\n        const property = properties.getOrInsertComputed(key, makeArr);\n\n        if (property.length && !(mergeSubDicts && value instanceof Dict)) {\n          // Ignore additional entries, if either:\n          //  - This is a \"shallow\" merge, where only the first element matters.\n          //  - The value is *not* a `Dict`, since other types cannot be merged.\n          continue;\n        }\n        property.push(value);\n      }\n    }\n    for (const [name, values] of properties) {\n      if (values.length === 1 || !(values[0] instanceof Dict)) {\n        mergedDict.set(name, values[0]);\n        continue;\n      }\n      const subDict = new Dict(xref);\n\n      for (const dict of values) {\n        for (const [key, value] of dict.getRawEntries()) {\n          subDict.setIfNotExists(key, value);\n        }\n      }\n      if (subDict.size > 0) {\n        mergedDict.set(name, subDict);\n      }\n    }\n    properties.clear();\n\n    return mergedDict.size > 0 ? mergedDict : Dict.empty;\n  }\n\n  clone() {\n    const dict = new Dict(this.xref);\n    for (const [key, value] of this.#map) {\n      dict.set(key, value);\n    }\n    return dict;\n  }\n\n  delete(key) {\n    this.#map.delete(key);\n  }\n}\n\nclass Ref {\n  constructor(num, gen) {\n    this.num = num;\n    this.gen = gen;\n  }\n\n  toString() {\n    // This function is hot, so we make the string as compact as possible.\n    // |this.gen| is almost always zero, so we treat that case specially.\n    if (this.gen === 0) {\n      return `${this.num}R`;\n    }\n    return `${this.num}R${this.gen}`;\n  }\n\n  static fromString(str) {\n    const ref = RefCache[str];\n    if (ref) {\n      return ref;\n    }\n    const m = /^(\\d+)R(\\d*)$/.exec(str);\n    if (!m || m[1] === \"0\") {\n      return null;\n    }\n\n    // eslint-disable-next-line no-restricted-syntax\n    return (RefCache[str] = new Ref(\n      parseInt(m[1], 10),\n      !m[2] ? 0 : parseInt(m[2], 10)\n    ));\n  }\n\n  static get(num, gen) {\n    const key = gen === 0 ? `${num}R` : `${num}R${gen}`;\n    // eslint-disable-next-line no-restricted-syntax\n    return (RefCache[key] ||= new Ref(num, gen));\n  }\n}\n\n// The reference is identified by number and generation.\n// This structure stores only one instance of the reference.\nclass RefSet {\n  constructor(parent = null) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      parent &&\n      !(parent instanceof RefSet)\n    ) {\n      unreachable('RefSet: Invalid \"parent\" value.');\n    }\n    this._set = new Set(parent?._set);\n  }\n\n  has(ref) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      !(ref instanceof Ref) &&\n      typeof ref !== \"string\"\n    ) {\n      unreachable('RefSet: Invalid \"ref\" value in has.');\n    }\n    return this._set.has(ref.toString());\n  }\n\n  put(ref) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      !(ref instanceof Ref) &&\n      typeof ref !== \"string\"\n    ) {\n      unreachable('RefSet: Invalid \"ref\" value in put.');\n    }\n    this._set.add(ref.toString());\n  }\n\n  remove(ref) {\n    this._set.delete(ref.toString());\n  }\n\n  [Symbol.iterator]() {\n    return this._set.values();\n  }\n\n  clear() {\n    this._set.clear();\n  }\n}\n\nclass RefSetCache {\n  _map = new Map();\n\n  get size() {\n    return this._map.size;\n  }\n\n  get(ref) {\n    return this._map.get(ref.toString());\n  }\n\n  has(ref) {\n    return this._map.has(ref.toString());\n  }\n\n  put(ref, obj) {\n    this._map.set(ref.toString(), obj);\n  }\n\n  putAlias(ref, aliasRef) {\n    this._map.set(ref.toString(), this.get(aliasRef));\n  }\n\n  [Symbol.iterator]() {\n    return this._map.values();\n  }\n\n  clear() {\n    this._map.clear();\n  }\n\n  *values() {\n    yield* this._map.values();\n  }\n\n  *items() {\n    for (const [ref, value] of this._map) {\n      yield [Ref.fromString(ref), value];\n    }\n  }\n\n  *keys() {\n    for (const ref of this._map.keys()) {\n      yield Ref.fromString(ref);\n    }\n  }\n}\n\nfunction isName(v, name) {\n  return v instanceof Name && (name === undefined || v.name === name);\n}\n\nfunction isCmd(v, cmd) {\n  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);\n}\n\nfunction isDict(v, type) {\n  return (\n    v instanceof Dict && (type === undefined || isName(v.get(\"Type\"), type))\n  );\n}\n\nfunction isRefsEqual(v1, v2) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      v1 instanceof Ref && v2 instanceof Ref,\n      \"isRefsEqual: Both parameters should be `Ref`s.\"\n    );\n  }\n  return v1.num === v2.num && v1.gen === v2.gen;\n}\n\nexport {\n  CIRCULAR_REF,\n  clearPrimitiveCaches,\n  Cmd,\n  Dict,\n  EOF,\n  isCmd,\n  isDict,\n  isName,\n  isRefsEqual,\n  Name,\n  Ref,\n  RefSet,\n  RefSetCache,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bytesToString, shadow, unreachable } from \"../shared/util.js\";\n\nclass BaseStream {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseStream\n    ) {\n      unreachable(\"Cannot initialize BaseStream.\");\n    }\n  }\n\n  /**\n   * @returns {number}\n   */\n  // eslint-disable-next-line getter-return\n  get length() {\n    unreachable(\"Abstract getter `length` accessed\");\n  }\n\n  /**\n   * @returns {boolean}\n   */\n  // eslint-disable-next-line getter-return\n  get isEmpty() {\n    unreachable(\"Abstract getter `isEmpty` accessed\");\n  }\n\n  get isDataLoaded() {\n    return shadow(this, \"isDataLoaded\", true);\n  }\n\n  getByte() {\n    unreachable(\"Abstract method `getByte` called\");\n  }\n\n  /**\n   * @param {number | undefined} [length]\n   * @returns {Uint8Array}\n   */\n  getBytes(length) {\n    unreachable(\"Abstract method `getBytes` called\");\n  }\n\n  /**\n   * NOTE: This method can only be used to get image-data that is guaranteed\n   *       to be fully loaded, since otherwise intermittent errors may occur;\n   *       note the `ObjectLoader` class.\n   */\n  async getImageData(length, decoderOptions) {\n    return this.getBytes(length, decoderOptions);\n  }\n\n  async asyncGetBytes() {\n    unreachable(\"Abstract method `asyncGetBytes` called\");\n  }\n\n  get isAsync() {\n    return false;\n  }\n\n  get isAsyncDecoder() {\n    return false;\n  }\n\n  get isImageStream() {\n    return false;\n  }\n\n  get canAsyncDecodeImageFromBuffer() {\n    return false;\n  }\n\n  async getTransferableImage() {\n    return null;\n  }\n\n  peekByte() {\n    const peekedByte = this.getByte();\n    if (peekedByte !== -1) {\n      this.pos--;\n    }\n    return peekedByte;\n  }\n\n  peekBytes(length) {\n    const bytes = this.getBytes(length);\n    this.pos -= bytes.length;\n    return bytes;\n  }\n\n  getUint16() {\n    const b0 = this.getByte();\n    const b1 = this.getByte();\n    if (b0 === -1 || b1 === -1) {\n      return -1;\n    }\n    return (b0 << 8) + b1;\n  }\n\n  getInt32() {\n    const b0 = this.getByte();\n    const b1 = this.getByte();\n    const b2 = this.getByte();\n    const b3 = this.getByte();\n    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n  }\n\n  getByteRange(begin, end) {\n    unreachable(\"Abstract method `getByteRange` called\");\n  }\n\n  getString(length) {\n    return bytesToString(this.getBytes(length));\n  }\n\n  skip(n) {\n    this.pos += n || 1;\n  }\n\n  reset() {\n    unreachable(\"Abstract method `reset` called\");\n  }\n\n  moveStart() {\n    unreachable(\"Abstract method `moveStart` called\");\n  }\n\n  makeSubStream(start, length, dict = null) {\n    unreachable(\"Abstract method `makeSubStream` called\");\n  }\n\n  clone() {\n    unreachable(\"Abstract method `clone` called\");\n  }\n\n  /**\n   * @returns {Array | null}\n   */\n  getBaseStreams() {\n    return null;\n  }\n\n  getOriginalStream() {\n    return this.stream?.getOriginalStream() || this;\n  }\n}\n\nexport { BaseStream };\n","/* Copyright 2019 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes, Util, warn } from \"../shared/util.js\";\n\nfunction isAscii(str) {\n  return (\n    typeof str === \"string\" &&\n    // eslint-disable-next-line no-control-regex\n    (!str || /^[\\x00-\\x7F]*$/.test(str))\n  );\n}\n\n// If the string is null or undefined then it is returned as is.\nfunction stringToAsciiOrUTF16BE(str) {\n  if (str === null || str === undefined) {\n    return str;\n  }\n  return isAscii(str) ? str : stringToUTF16String(str, /* bigEndian = */ true);\n}\n\nfunction stringToUTF16HexString(str) {\n  const buf = [];\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.charCodeAt(i);\n    buf.push(Util.hexNums[(char >> 8) & 0xff], Util.hexNums[char & 0xff]);\n  }\n  return buf.join(\"\");\n}\n\nfunction stringToUTF16String(str, bigEndian = false) {\n  const buf = [];\n  if (bigEndian) {\n    buf.push(\"\\xFE\\xFF\");\n  }\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.charCodeAt(i);\n    buf.push(\n      String.fromCharCode((char >> 8) & 0xff),\n      String.fromCharCode(char & 0xff)\n    );\n  }\n  return buf.join(\"\");\n}\n\nconst PDFStringTranslateTable = [\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8,\n  0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  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,\n  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,\n  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,\n  0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192,\n  0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,\n  0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d,\n  0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac,\n];\n\nfunction stringToPDFString(str, keepEscapeSequence = false) {\n  // See section 7.9.2.2 Text String Type.\n  // The string can contain some language codes bracketed with 0x1b,\n  // so we must remove them.\n  if (str[0] >= \"\\xEF\") {\n    let encoding;\n    if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n      encoding = \"utf-16be\";\n      if (str.length % 2 === 1) {\n        str = str.slice(0, -1);\n      }\n    } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n      encoding = \"utf-16le\";\n      if (str.length % 2 === 1) {\n        str = str.slice(0, -1);\n      }\n    } else if (str[0] === \"\\xEF\" && str[1] === \"\\xBB\" && str[2] === \"\\xBF\") {\n      encoding = \"utf-8\";\n    }\n\n    if (encoding) {\n      try {\n        const decoder = new TextDecoder(encoding, { fatal: true });\n        const buffer = stringToBytes(str);\n        const decoded = decoder.decode(buffer);\n        if (keepEscapeSequence || !decoded.includes(\"\\x1b\")) {\n          return decoded;\n        }\n        // eslint-disable-next-line no-control-regex\n        return decoded.replaceAll(/\\x1b[^\\x1b]*(?:\\x1b|$)/g, \"\");\n      } catch (ex) {\n        warn(`stringToPDFString: \"${ex}\".`);\n      }\n    }\n  }\n  // ISO Latin 1\n  const strBuf = [];\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const charCode = str.charCodeAt(i);\n    if (!keepEscapeSequence && charCode === 0x1b) {\n      // eslint-disable-next-line no-empty\n      while (++i < ii && str.charCodeAt(i) !== 0x1b) {}\n      continue;\n    }\n    const code = PDFStringTranslateTable[charCode];\n    strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n  }\n  return strBuf.join(\"\");\n}\n\nexport {\n  isAscii,\n  stringToAsciiOrUTF16BE,\n  stringToPDFString,\n  stringToUTF16HexString,\n  stringToUTF16String,\n};\n","/* Copyright 2019 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorPrefix,\n  assert,\n  BaseException,\n  makeArr,\n  objectSize,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { Dict, isName, isRefsEqual, Name, Ref, RefSet } from \"./primitives.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { stringToPDFString } from \"./string_utils.js\";\n\nconst PDF_VERSION_REGEXP = /^[1-9]\\.\\d$/;\nconst MAX_INT_32 = 2 ** 31 - 1;\n\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\n\nconst RESOURCES_KEYS_OPERATOR_LIST = [\n  \"ColorSpace\",\n  \"ExtGState\",\n  \"Font\",\n  \"Pattern\",\n  \"Properties\",\n  \"Shading\",\n  \"XObject\",\n];\n\nconst RESOURCES_KEYS_TEXT_CONTENT = [\n  \"ExtGState\",\n  \"Font\",\n  \"Properties\",\n  \"XObject\",\n];\n\nfunction getLookupTableFactory(initializer) {\n  let lookup;\n  return function () {\n    if (initializer) {\n      lookup = Object.create(null);\n      initializer(lookup);\n      initializer = null;\n    }\n    return lookup;\n  };\n}\n\nclass MissingDataException extends BaseException {\n  constructor(begin, end) {\n    super(`Missing data [${begin}, ${end})`, \"MissingDataException\");\n    this.begin = begin;\n    this.end = end;\n  }\n}\n\nclass ParserEOFException extends BaseException {\n  constructor(msg) {\n    super(msg, \"ParserEOFException\");\n  }\n}\n\nclass XRefEntryException extends BaseException {\n  constructor(msg) {\n    super(msg, \"XRefEntryException\");\n  }\n}\n\nclass XRefParseException extends BaseException {\n  constructor(msg) {\n    super(msg, \"XRefParseException\");\n  }\n}\n\n/**\n * Combines multiple ArrayBuffers into a single Uint8Array.\n * @param {Array<ArrayBuffer>} arr - An array of ArrayBuffers.\n * @returns {Uint8Array}\n */\nfunction arrayBuffersToBytes(arr) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    for (const item of arr) {\n      assert(\n        item instanceof ArrayBuffer,\n        \"arrayBuffersToBytes - expected an ArrayBuffer.\"\n      );\n    }\n  }\n  const length = arr.length;\n  if (length === 0) {\n    return new Uint8Array(0);\n  }\n  if (length === 1) {\n    return new Uint8Array(arr[0]);\n  }\n  let dataLength = 0;\n  for (let i = 0; i < length; i++) {\n    dataLength += arr[i].byteLength;\n  }\n  const data = new Uint8Array(dataLength);\n  let pos = 0;\n  for (let i = 0; i < length; i++) {\n    const item = new Uint8Array(arr[i]);\n    data.set(item, pos);\n    pos += item.byteLength;\n  }\n  return data;\n}\n\nasync function fetchBinaryData(url) {\n  const response = await fetch(url);\n  if (!response.ok) {\n    throw new Error(\n      `Failed to fetch file \"${url}\" with \"${response.statusText}\".`\n    );\n  }\n  return response.bytes();\n}\n\n/**\n * Get the value of an inheritable property.\n *\n * If the PDF specification explicitly lists a property in a dictionary as\n * inheritable, then the value of the property may be present in the dictionary\n * itself or in one or more parents of the dictionary.\n *\n * If the key is not found in the tree, `undefined` is returned. Otherwise,\n * the value for the key is returned or, if `stopWhenFound` is `false`, a list\n * of values is returned.\n *\n * @param {Dict} dict - Dictionary from where to start the traversal.\n * @param {string} key - The key of the property to find the value for.\n * @param {boolean} getArray - Whether or not the value should be fetched as an\n *   array. The default value is `false`.\n * @param {boolean} stopWhenFound - Whether or not to stop the traversal when\n *   the key is found. If set to `false`, we always walk up the entire parent\n *   chain, for example to be able to find `\\Resources` placed on multiple\n *   levels of the tree. The default value is `true`.\n */\nfunction getInheritableProperty({\n  dict,\n  key,\n  getArray = false,\n  stopWhenFound = true,\n}) {\n  let values;\n  const visited = new RefSet();\n\n  while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) {\n    if (dict.objId) {\n      visited.put(dict.objId);\n    }\n    const value = getArray ? dict.getArray(key) : dict.get(key);\n    if (value !== undefined) {\n      if (stopWhenFound) {\n        return value;\n      }\n      (values ||= []).push(value);\n    }\n    dict = dict.get(\"Parent\");\n  }\n  return values;\n}\n\n/**\n * Get the parent dictionary to update when a property is set.\n *\n * @param {Dict} dict - Dictionary from where to start the traversal.\n * @param {Ref} ref - The reference to the dictionary.\n * @param {XRef} xref - The `XRef` instance.\n */\nfunction getParentToUpdate(dict, ref, xref) {\n  const visited = new RefSet();\n  const firstDict = dict;\n  const result = { dict: null, ref: null };\n\n  while (dict instanceof Dict && !visited.has(ref)) {\n    visited.put(ref);\n    if (dict.has(\"T\")) {\n      break;\n    }\n    ref = dict.getRaw(\"Parent\");\n    if (!(ref instanceof Ref)) {\n      return result;\n    }\n    dict = xref.fetch(ref);\n  }\n  if (dict instanceof Dict && dict !== firstDict) {\n    result.dict = dict;\n    result.ref = ref;\n  }\n  return result;\n}\n\nfunction deepCompare(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (a instanceof Ref && b instanceof Ref) {\n    return isRefsEqual(a, b);\n  }\n  if (a instanceof Name && b instanceof Name) {\n    return a.name === b.name;\n  }\n\n  if (a instanceof Dict && b instanceof Dict) {\n    if (a.size !== b.size) {\n      return false;\n    }\n    for (const [key, value1] of a.getRawEntries()) {\n      const value2 = b.getRaw(key);\n      if (value2 === undefined || !deepCompare(value1, value2)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  if (Array.isArray(a) && Array.isArray(b)) {\n    if (a.length !== b.length) {\n      return false;\n    }\n    for (let i = 0, ii = a.length; i < ii; i++) {\n      if (!deepCompare(a[i], b[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  return false;\n}\n\n// prettier-ignore\nconst ROMAN_NUMBER_MAP = [\n  \"\", \"C\", \"CC\", \"CCC\", \"CD\", \"D\", \"DC\", \"DCC\", \"DCCC\", \"CM\",\n  \"\", \"X\", \"XX\", \"XXX\", \"XL\", \"L\", \"LX\", \"LXX\", \"LXXX\", \"XC\",\n  \"\", \"I\", \"II\", \"III\", \"IV\", \"V\", \"VI\", \"VII\", \"VIII\", \"IX\"\n];\n\n/**\n * Converts positive integers to (upper case) Roman numerals.\n * @param {number} number - The number that should be converted.\n * @param {boolean} lowerCase - Indicates if the result should be converted\n *   to lower case letters. The default value is `false`.\n * @returns {string} The resulting Roman number.\n */\nfunction toRomanNumerals(number, lowerCase = false) {\n  assert(\n    Number.isInteger(number) && number > 0,\n    \"The number should be a positive integer.\"\n  );\n\n  const roman =\n    \"M\".repeat((number / 1000) | 0) +\n    ROMAN_NUMBER_MAP[((number % 1000) / 100) | 0] +\n    ROMAN_NUMBER_MAP[10 + (((number % 100) / 10) | 0)] +\n    ROMAN_NUMBER_MAP[20 + (number % 10)];\n  return lowerCase ? roman.toLowerCase() : roman;\n}\n\n// Checks if ch is one of the following characters: SPACE, TAB, CR or LF.\nfunction isWhiteSpace(ch) {\n  return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a;\n}\n\n/**\n * Checks if something is an Array containing only boolean values,\n * and (optionally) checks its length.\n * @param {any} arr\n * @param {number | null} len\n * @returns {boolean}\n */\nfunction isBooleanArray(arr, len) {\n  return (\n    Array.isArray(arr) &&\n    (len === null || arr.length === len) &&\n    arr.every(x => typeof x === \"boolean\")\n  );\n}\n\n/**\n * Checks if something is an Array containing only numbers,\n * and (optionally) checks its length.\n * @param {any} arr\n * @param {number | null} len\n * @returns {boolean}\n */\nfunction isNumberArray(arr, len) {\n  if (Array.isArray(arr)) {\n    return (\n      (len === null || arr.length === len) &&\n      arr.every(x => typeof x === \"number\")\n    );\n  }\n\n  // This check allows us to have typed arrays but not the\n  // BigInt64Array/BigUint64Array types (their elements aren't \"number\").\n  return (\n    ArrayBuffer.isView(arr) &&\n    !(arr instanceof BigInt64Array || arr instanceof BigUint64Array) &&\n    (len === null || arr.length === len)\n  );\n}\n\n// Returns the matrix, or the fallback value if it's invalid.\nfunction lookupMatrix(arr, fallback) {\n  return isNumberArray(arr, 6) ? arr : fallback;\n}\n\n// Returns the rectangle, or the fallback value if it's invalid.\nfunction lookupRect(arr, fallback) {\n  return isNumberArray(arr, 4) ? arr : fallback;\n}\n\n// Returns the normalized rectangle, or the fallback value if it's invalid.\nfunction lookupNormalRect(arr, fallback) {\n  return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback;\n}\n\n/**\n * AcroForm field names use an array like notation to refer to\n * repeated XFA elements e.g. foo.bar[nnn].\n * see: XFA Spec Chapter 3 - Repeated Elements\n *\n * @param {string} path - XFA path name.\n * @returns {Array} - Array of Objects with the name and pos of\n * each part of the path.\n */\nfunction parseXFAPath(path) {\n  const positionPattern = /(.+)\\[(\\d+)\\]$/;\n  return path.split(\".\").map(component => {\n    const m = component.match(positionPattern);\n    if (m) {\n      return { name: m[1], pos: parseInt(m[2], 10) };\n    }\n    return { name: component, pos: 0 };\n  });\n}\n\nfunction escapePDFName(str) {\n  const buffer = [];\n  let start = 0;\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.charCodeAt(i);\n    // Whitespace or delimiters aren't regular chars, so escape them.\n    if (\n      char < 0x21 ||\n      char > 0x7e ||\n      char === 0x23 /* # */ ||\n      char === 0x28 /* ( */ ||\n      char === 0x29 /* ) */ ||\n      char === 0x3c /* < */ ||\n      char === 0x3e /* > */ ||\n      char === 0x5b /* [ */ ||\n      char === 0x5d /* ] */ ||\n      char === 0x7b /* { */ ||\n      char === 0x7d /* } */ ||\n      char === 0x2f /* / */ ||\n      char === 0x25 /* % */\n    ) {\n      if (start < i) {\n        buffer.push(str.substring(start, i));\n      }\n      buffer.push(`#${char.toString(16)}`);\n      start = i + 1;\n    }\n  }\n\n  if (buffer.length === 0) {\n    return str;\n  }\n\n  if (start < str.length) {\n    buffer.push(str.substring(start));\n  }\n\n  return buffer.join(\"\");\n}\n\n// Replace \"(\", \")\", \"\\n\", \"\\r\" and \"\\\" by \"\\(\", \"\\)\", \"\\\\n\", \"\\\\r\" and \"\\\\\"\n// in order to write it in a PDF file.\nfunction escapeString(str) {\n  return str.replaceAll(/([()\\\\\\n\\r])/g, match => {\n    if (match === \"\\n\") {\n      return \"\\\\n\";\n    } else if (match === \"\\r\") {\n      return \"\\\\r\";\n    }\n    return `\\\\${match}`;\n  });\n}\n\nfunction _collectJS(entry, xref, list, parents) {\n  if (!entry) {\n    return;\n  }\n\n  let parent = null;\n  if (entry instanceof Ref) {\n    if (parents.has(entry)) {\n      // If we've already found entry then we've a cycle.\n      return;\n    }\n    parent = entry;\n    parents.put(parent);\n    entry = xref.fetch(entry);\n  }\n  if (Array.isArray(entry)) {\n    for (const element of entry) {\n      _collectJS(element, xref, list, parents);\n    }\n  } else if (entry instanceof Dict) {\n    if (isName(entry.get(\"S\"), \"JavaScript\")) {\n      const js = entry.get(\"JS\");\n      let code;\n      if (js instanceof BaseStream) {\n        code = js.getString();\n      } else if (typeof js === \"string\") {\n        code = js;\n      }\n      code &&= stringToPDFString(\n        code,\n        /* keepEscapeSequence = */ true\n      ).replaceAll(\"\\x00\", \"\");\n      if (code) {\n        list.push(code.trim());\n      }\n    }\n    _collectJS(entry.getRaw(\"Next\"), xref, list, parents);\n  }\n\n  if (parent) {\n    parents.remove(parent);\n  }\n}\n\nfunction collectActions(xref, dict, eventType) {\n  const actions = Object.create(null);\n  const additionalActionsDicts = getInheritableProperty({\n    dict,\n    key: \"AA\",\n    stopWhenFound: false,\n  });\n  if (additionalActionsDicts) {\n    // additionalActionsDicts contains dicts from ancestors\n    // as they're found in the tree from bottom to top.\n    // So the dicts are visited in reverse order to guarantee\n    // that actions from elder ancestors will be overwritten\n    // by ones from younger ancestors.\n    for (let i = additionalActionsDicts.length - 1; i >= 0; i--) {\n      const additionalActions = additionalActionsDicts[i];\n      if (!(additionalActions instanceof Dict)) {\n        continue;\n      }\n      for (const [key, rawActionDict] of additionalActions.getRawEntries()) {\n        const action = eventType[key];\n        if (!action) {\n          continue;\n        }\n        const parents = new RefSet();\n        const list = [];\n        _collectJS(rawActionDict, xref, list, parents);\n        if (list.length > 0) {\n          actions[action] = list;\n        }\n      }\n    }\n  }\n  // Collect the Action if any (we may have one on pushbutton).\n  if (dict.has(\"A\")) {\n    const actionDict = dict.get(\"A\");\n    const parents = new RefSet();\n    const list = [];\n    _collectJS(actionDict, xref, list, parents);\n    if (list.length > 0) {\n      actions.Action = list;\n    }\n  }\n  return objectSize(actions) > 0 ? actions : null;\n}\n\nconst XMLEntities = {\n  /* < */ 0x3c: \"&lt;\",\n  /* > */ 0x3e: \"&gt;\",\n  /* & */ 0x26: \"&amp;\",\n  /* \" */ 0x22: \"&quot;\",\n  /* ' */ 0x27: \"&apos;\",\n};\n\nfunction* codePointIter(str) {\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.codePointAt(i);\n    if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {\n      // char is represented by two u16\n      i++;\n    }\n    yield char;\n  }\n}\n\nfunction encodeToXmlString(str) {\n  const buffer = [];\n  let start = 0;\n  for (let i = 0, ii = str.length; i < ii; i++) {\n    const char = str.codePointAt(i);\n    if (0x20 <= char && char <= 0x7e) {\n      // ascii\n      const entity = XMLEntities[char];\n      if (entity) {\n        if (start < i) {\n          buffer.push(str.substring(start, i));\n        }\n        buffer.push(entity);\n        start = i + 1;\n      }\n    } else {\n      if (start < i) {\n        buffer.push(str.substring(start, i));\n      }\n      buffer.push(`&#x${char.toString(16).toUpperCase()};`);\n      if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {\n        // char is represented by two u16\n        i++;\n      }\n      start = i + 1;\n    }\n  }\n\n  if (buffer.length === 0) {\n    return str;\n  }\n  if (start < str.length) {\n    buffer.push(str.substring(start));\n  }\n  return buffer.join(\"\");\n}\n\nfunction validateFontName(fontFamily, mustWarn = false) {\n  // See https://developer.mozilla.org/en-US/docs/Web/CSS/string.\n  const m = /^(\"|').*(\"|')$/.exec(fontFamily);\n  if (m && m[1] === m[2]) {\n    const re = new RegExp(`[^\\\\\\\\]${m[1]}`);\n    if (re.test(fontFamily.slice(1, -1))) {\n      if (mustWarn) {\n        warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`);\n      }\n      return false;\n    }\n  } else {\n    // See https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident.\n    for (const ident of fontFamily.split(/[ \\t]+/)) {\n      if (/^(?:\\d|-[\\d-])/.test(ident) || !/^[\\w\\\\-]+$/.test(ident)) {\n        if (mustWarn) {\n          warn(`FontFamily contains invalid <custom-ident>: ${fontFamily}.`);\n        }\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nfunction validateCSSFont(cssFontInfo) {\n  // See https://developer.mozilla.org/en-US/docs/Web/CSS/font-style.\n  const DEFAULT_CSS_FONT_OBLIQUE = \"14\";\n  // See https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight.\n  const DEFAULT_CSS_FONT_WEIGHT = \"400\";\n  const CSS_FONT_WEIGHT_VALUES = new Set([\n    \"100\",\n    \"200\",\n    \"300\",\n    \"400\",\n    \"500\",\n    \"600\",\n    \"700\",\n    \"800\",\n    \"900\",\n    \"1000\",\n    \"normal\",\n    \"bold\",\n    \"bolder\",\n    \"lighter\",\n  ]);\n\n  const { fontFamily, fontWeight, italicAngle } = cssFontInfo;\n\n  if (!validateFontName(fontFamily, true)) {\n    return false;\n  }\n\n  const weight = fontWeight ? fontWeight.toString() : \"\";\n  cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight)\n    ? weight\n    : DEFAULT_CSS_FONT_WEIGHT;\n\n  const angle = parseFloat(italicAngle);\n  cssFontInfo.italicAngle =\n    isNaN(angle) || angle < -90 || angle > 90\n      ? DEFAULT_CSS_FONT_OBLIQUE\n      : italicAngle.toString();\n\n  return true;\n}\n\nfunction recoverJsURL(str) {\n  // Attempt to recover valid URLs from `JS` entries with certain\n  // white-listed formats:\n  //  - window.open('http://example.com')\n  //  - app.launchURL('http://example.com', true)\n  //  - xfa.host.gotoURL('http://example.com')\n  const URL_OPEN_METHODS = [\"app.launchURL\", \"window.open\", \"xfa.host.gotoURL\"];\n  const regex = new RegExp(\n    \"^\\\\s*(\" +\n      URL_OPEN_METHODS.join(\"|\").replaceAll(\".\", \"\\\\.\") +\n      \")\\\\((?:'|\\\")([^'\\\"]*)(?:'|\\\")(?:,\\\\s*(\\\\w+)\\\\)|\\\\))\",\n    \"i\"\n  );\n\n  const jsUrl = regex.exec(str);\n  if (jsUrl?.[2]) {\n    return {\n      url: jsUrl[2],\n      newWindow: jsUrl[1] === \"app.launchURL\" && jsUrl[3] === \"true\",\n    };\n  }\n\n  return null;\n}\n\nfunction numberToString(value) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      typeof value === \"number\",\n      `numberToString - the value (${value}) should be a number.`\n    );\n  }\n\n  if (Number.isInteger(value)) {\n    return value.toString();\n  }\n\n  const roundedValue = Math.round(value * 100);\n  if (roundedValue % 100 === 0) {\n    return (roundedValue / 100).toString();\n  }\n\n  if (roundedValue % 10 === 0) {\n    return value.toFixed(1);\n  }\n\n  return value.toFixed(2);\n}\n\nfunction getNewAnnotationsMap(annotationStorage) {\n  if (!annotationStorage) {\n    return null;\n  }\n  const newAnnotationsByPage = new Map();\n  // The concept of page in a XFA is very different, so\n  // editing is just not implemented.\n  for (const [key, value] of annotationStorage) {\n    if (!key.startsWith(AnnotationEditorPrefix)) {\n      continue;\n    }\n    newAnnotationsByPage\n      .getOrInsertComputed(value.pageIndex, makeArr)\n      .push(value);\n  }\n  return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null;\n}\n\nfunction getModificationDate(date = new Date()) {\n  if (!(date instanceof Date)) {\n    date = new Date(date);\n  }\n  const buffer = [\n    date.getUTCFullYear().toString(),\n    (date.getUTCMonth() + 1).toString().padStart(2, \"0\"),\n    date.getUTCDate().toString().padStart(2, \"0\"),\n    date.getUTCHours().toString().padStart(2, \"0\"),\n    date.getUTCMinutes().toString().padStart(2, \"0\"),\n    date.getUTCSeconds().toString().padStart(2, \"0\"),\n  ];\n\n  return buffer.join(\"\");\n}\n\nfunction getRotationMatrix(rotation, width, height) {\n  switch (rotation) {\n    case 90:\n      return [0, 1, -1, 0, width, 0];\n    case 180:\n      return [-1, 0, 0, -1, width, height];\n    case 270:\n      return [0, -1, 1, 0, 0, height];\n    default:\n      throw new Error(\"Invalid rotation\");\n  }\n}\n\n/**\n * Get the number of bytes to use to represent the given positive integer.\n * If n is zero, the function returns 0 which means that we don't need to waste\n * a byte to represent it.\n * @param {number} x - a positive integer.\n * @returns {number}\n */\nfunction getSizeInBytes(x) {\n  // n bits are required for numbers up to 2^n - 1.\n  // So for a number x, we need ceil(log2(1 + x)) bits.\n  return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8);\n}\n\nexport {\n  arrayBuffersToBytes,\n  codePointIter,\n  collectActions,\n  deepCompare,\n  encodeToXmlString,\n  escapePDFName,\n  escapeString,\n  fetchBinaryData,\n  getInheritableProperty,\n  getLookupTableFactory,\n  getModificationDate,\n  getNewAnnotationsMap,\n  getParentToUpdate,\n  getRotationMatrix,\n  getSizeInBytes,\n  IDENTITY_MATRIX,\n  isBooleanArray,\n  isNumberArray,\n  isWhiteSpace,\n  lookupMatrix,\n  lookupNormalRect,\n  lookupRect,\n  MAX_INT_32,\n  MissingDataException,\n  numberToString,\n  ParserEOFException,\n  parseXFAPath,\n  PDF_VERSION_REGEXP,\n  recoverJsURL,\n  RESOURCES_KEYS_OPERATOR_LIST,\n  RESOURCES_KEYS_TEXT_CONTENT,\n  toRomanNumerals,\n  validateCSSFont,\n  validateFontName,\n  XRefEntryException,\n  XRefParseException,\n};\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass QCMS {\n  static #memoryArray = null;\n\n  static _memory = null;\n\n  static _mustAddAlpha = false;\n\n  static _destBuffer = null;\n\n  static _destOffset = 0;\n\n  static _destLength = 0;\n\n  static _cssColor = \"\";\n\n  static _makeHexColor = null;\n\n  static get _memoryArray() {\n    const array = this.#memoryArray;\n    if (array?.byteLength) {\n      return array;\n    }\n    return (this.#memoryArray = new Uint8Array(this._memory.buffer));\n  }\n}\n\nfunction copy_result(ptr, len) {\n  // This function is called from the wasm module (it's an external\n  // \"C\" function). Its goal is to copy the result from the wasm memory\n  // to the destination buffer without any intermediate copies.\n  const { _mustAddAlpha, _destBuffer, _destOffset, _destLength, _memoryArray } =\n    QCMS;\n  if (len === _destLength) {\n    _destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset);\n    return;\n  }\n  if (_mustAddAlpha) {\n    for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) {\n      _destBuffer[j] = _memoryArray[i];\n      _destBuffer[j + 1] = _memoryArray[i + 1];\n      _destBuffer[j + 2] = _memoryArray[i + 2];\n      _destBuffer[j + 3] = 255;\n    }\n  } else {\n    for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) {\n      _destBuffer[j] = _memoryArray[i];\n      _destBuffer[j + 1] = _memoryArray[i + 1];\n      _destBuffer[j + 2] = _memoryArray[i + 2];\n    }\n  }\n}\n\nfunction copy_rgb(ptr) {\n  const { _destBuffer, _destOffset, _memoryArray } = QCMS;\n  _destBuffer[_destOffset] = _memoryArray[ptr];\n  _destBuffer[_destOffset + 1] = _memoryArray[ptr + 1];\n  _destBuffer[_destOffset + 2] = _memoryArray[ptr + 2];\n}\n\nfunction make_cssRGB(ptr) {\n  const { _memoryArray } = QCMS;\n  QCMS._cssColor = QCMS._makeHexColor(\n    _memoryArray[ptr],\n    _memoryArray[ptr + 1],\n    _memoryArray[ptr + 2]\n  );\n}\n\nexport { copy_result, copy_rgb, make_cssRGB, QCMS };\n","/* THIS FILE IS GENERATED - DO NOT EDIT */\nimport { copy_result, copy_rgb, make_cssRGB } from './qcms_utils.js';\n\n\n/**\n * @enum {0 | 1 | 2 | 3 | 4 | 5}\n */\nexport const DataType = Object.freeze({\n    RGB8: 0, \"0\": \"RGB8\",\n    RGBA8: 1, \"1\": \"RGBA8\",\n    BGRA8: 2, \"2\": \"BGRA8\",\n    Gray8: 3, \"3\": \"Gray8\",\n    GrayA8: 4, \"4\": \"GrayA8\",\n    CMYK: 5, \"5\": \"CMYK\",\n});\n\n/**\n * @enum {0 | 1 | 2 | 3}\n */\nexport const Intent = Object.freeze({\n    Perceptual: 0, \"0\": \"Perceptual\",\n    RelativeColorimetric: 1, \"1\": \"RelativeColorimetric\",\n    Saturation: 2, \"2\": \"Saturation\",\n    AbsoluteColorimetric: 3, \"3\": \"AbsoluteColorimetric\",\n});\n\n/**\n * # Safety\n *\n * This function is called directly from JavaScript.\n * @param {number} transformer\n * @param {Uint8Array} src\n */\nexport function qcms_convert_array(transformer, src) {\n    const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc);\n    const len0 = WASM_VECTOR_LEN;\n    wasm.qcms_convert_array(transformer, ptr0, len0);\n}\n\n/**\n * # Safety\n *\n * This function is called directly from JavaScript.\n * @param {number} transformer\n * @param {number} src1\n * @param {number} src2\n * @param {number} src3\n * @param {number} src4\n * @param {boolean} css\n */\nexport function qcms_convert_four(transformer, src1, src2, src3, src4, css) {\n    wasm.qcms_convert_four(transformer, src1, src2, src3, src4, css);\n}\n\n/**\n * # Safety\n *\n * This function is called directly from JavaScript.\n * @param {number} transformer\n * @param {number} src\n * @param {boolean} css\n */\nexport function qcms_convert_one(transformer, src, css) {\n    wasm.qcms_convert_one(transformer, src, css);\n}\n\n/**\n * # Safety\n *\n * This function is called directly from JavaScript.\n * @param {number} transformer\n * @param {number} src1\n * @param {number} src2\n * @param {number} src3\n * @param {boolean} css\n */\nexport function qcms_convert_three(transformer, src1, src2, src3, css) {\n    wasm.qcms_convert_three(transformer, src1, src2, src3, css);\n}\n\n/**\n * # Safety\n *\n * This function is called directly from JavaScript.\n * @param {number} transformer\n */\nexport function qcms_drop_transformer(transformer) {\n    wasm.qcms_drop_transformer(transformer);\n}\n\n/**\n * # Safety\n *\n * This function is called directly from JavaScript.\n * @param {Uint8Array} mem\n * @param {DataType} in_type\n * @param {Intent} intent\n * @returns {number}\n */\nexport function qcms_transformer_from_memory(mem, in_type, intent) {\n    const ptr0 = passArray8ToWasm0(mem, wasm.__wbindgen_malloc);\n    const len0 = WASM_VECTOR_LEN;\n    const ret = wasm.qcms_transformer_from_memory(ptr0, len0, in_type, intent);\n    return ret >>> 0;\n}\nfunction __wbg_get_imports() {\n    const import0 = {\n        __proto__: null,\n        __wbg___wbindgen_throw_6b64449b9b9ed33c: function(arg0, arg1) {\n            throw new Error(getStringFromWasm0(arg0, arg1));\n        },\n        __wbg_copy_result_0d15f3bf9d9012ae: function(arg0, arg1) {\n            copy_result(arg0 >>> 0, arg1 >>> 0);\n        },\n        __wbg_copy_rgb_0106d9d9464fce43: function(arg0) {\n            copy_rgb(arg0 >>> 0);\n        },\n        __wbg_make_cssRGB_8e24b34f71f5363e: function(arg0) {\n            make_cssRGB(arg0 >>> 0);\n        },\n        __wbindgen_init_externref_table: function() {\n            const table = wasm.__wbindgen_externrefs;\n            const offset = table.grow(4);\n            table.set(0, undefined);\n            table.set(offset + 0, undefined);\n            table.set(offset + 1, null);\n            table.set(offset + 2, true);\n            table.set(offset + 3, false);\n        },\n    };\n    return {\n        __proto__: null,\n        \"./qcms_bg.js\": import0,\n    };\n}\n\nfunction getStringFromWasm0(ptr, len) {\n    ptr = ptr >>> 0;\n    return decodeText(ptr, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n    if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n        cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n    }\n    return cachedUint8ArrayMemory0;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n    const ptr = malloc(arg.length * 1, 1) >>> 0;\n    getUint8ArrayMemory0().set(arg, ptr / 1);\n    WASM_VECTOR_LEN = arg.length;\n    return ptr;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n    numBytesDecoded += len;\n    if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n        cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n        cachedTextDecoder.decode();\n        numBytesDecoded = len;\n    }\n    return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasm;\nfunction __wbg_finalize_init(instance, module) {\n    wasm = instance.exports;\n    wasmModule = module;\n    cachedUint8ArrayMemory0 = null;\n    wasm.__wbindgen_start();\n    return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n    if (typeof Response === 'function' && module instanceof Response) {\n        if (typeof WebAssembly.instantiateStreaming === 'function') {\n            try {\n                return await WebAssembly.instantiateStreaming(module, imports);\n            } catch (e) {\n                const validResponse = module.ok && expectedResponseType(module.type);\n\n                if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n                    console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n                } else { throw e; }\n            }\n        }\n\n        const bytes = await module.arrayBuffer();\n        return await WebAssembly.instantiate(bytes, imports);\n    } else {\n        const instance = await WebAssembly.instantiate(module, imports);\n\n        if (instance instanceof WebAssembly.Instance) {\n            return { instance, module };\n        } else {\n            return instance;\n        }\n    }\n\n    function expectedResponseType(type) {\n        switch (type) {\n            case 'basic': case 'cors': case 'default': return true;\n        }\n        return false;\n    }\n}\n\nfunction initSync(module) {\n    if (wasm !== undefined) return wasm;\n\n\n    if (module !== undefined) {\n        if (Object.getPrototypeOf(module) === Object.prototype) {\n            ({module} = module)\n        } else {\n            console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n        }\n    }\n\n    const imports = __wbg_get_imports();\n    if (!(module instanceof WebAssembly.Module)) {\n        module = new WebAssembly.Module(module);\n    }\n    const instance = new WebAssembly.Instance(module, imports);\n    return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n    if (wasm !== undefined) return wasm;\n\n\n    if (module_or_path !== undefined) {\n        if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n            ({module_or_path} = module_or_path)\n        } else {\n            console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n        }\n    }\n\n\n    const imports = __wbg_get_imports();\n\n    if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n        module_or_path = fetch(module_or_path);\n    }\n\n    const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n    return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// TODO: Replace all occurrences of this function, and remove the file, once\n//       https://github.com/tc39/proposal-math-clamp/ is generally available.\nfunction MathClamp(v, min, max) {\n  // eslint-disable-next-line prefer-math-clamp/prefer-math-clamp\n  return Math.min(Math.max(v, min), max);\n}\n\nexport { MathClamp };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  FeatureTest,\n  FormatError,\n  info,\n  shadow,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\n/**\n * Resizes an RGB image with 3 components.\n * @param {TypedArray} src - The source buffer.\n * @param {TypedArray} dest - The destination buffer.\n * @param {number} w1 - Original width.\n * @param {number} h1 - Original height.\n * @param {number} w2 - New width.\n * @param {number} h2 - New height.\n * @param {number} alpha01 - Size reserved for the alpha channel.\n */\nfunction resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {\n  const COMPONENTS = 3;\n  alpha01 = alpha01 !== 1 ? 0 : alpha01;\n  const xRatio = w1 / w2;\n  const yRatio = h1 / h2;\n  let newIndex = 0,\n    oldIndex;\n  const xScaled = new Uint16Array(w2);\n  const w1Scanline = w1 * COMPONENTS;\n\n  for (let i = 0; i < w2; i++) {\n    xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;\n  }\n  for (let i = 0; i < h2; i++) {\n    const py = Math.floor(i * yRatio) * w1Scanline;\n    for (let j = 0; j < w2; j++) {\n      oldIndex = py + xScaled[j];\n      dest[newIndex++] = src[oldIndex++];\n      dest[newIndex++] = src[oldIndex++];\n      dest[newIndex++] = src[oldIndex++];\n      newIndex += alpha01;\n    }\n  }\n}\n\nfunction resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) {\n  const xRatio = w1 / w2;\n  const yRatio = h1 / h2;\n  let newIndex = 0;\n  const xScaled = new Uint16Array(w2);\n\n  if (alpha01 === 1) {\n    for (let i = 0; i < w2; i++) {\n      xScaled[i] = Math.floor(i * xRatio);\n    }\n    const src32 = new Uint32Array(src.buffer);\n    const dest32 = new Uint32Array(dest.buffer);\n    const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00;\n    for (let i = 0; i < h2; i++) {\n      const buf = src32.subarray(Math.floor(i * yRatio) * w1);\n      for (let j = 0; j < w2; j++) {\n        dest32[newIndex++] |= buf[xScaled[j]] & rgbMask;\n      }\n    }\n  } else {\n    const COMPONENTS = 4;\n    const w1Scanline = w1 * COMPONENTS;\n    for (let i = 0; i < w2; i++) {\n      xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;\n    }\n    for (let i = 0; i < h2; i++) {\n      const buf = src.subarray(Math.floor(i * yRatio) * w1Scanline);\n      for (let j = 0; j < w2; j++) {\n        const oldIndex = xScaled[j];\n        dest[newIndex++] = buf[oldIndex];\n        dest[newIndex++] = buf[oldIndex + 1];\n        dest[newIndex++] = buf[oldIndex + 2];\n      }\n    }\n  }\n}\n\nfunction copyRgbaImage(src, dest, alpha01) {\n  if (alpha01 === 1) {\n    const src32 = new Uint32Array(src.buffer);\n    const dest32 = new Uint32Array(dest.buffer);\n    const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00;\n    for (let i = 0, ii = src32.length; i < ii; i++) {\n      dest32[i] |= src32[i] & rgbMask;\n    }\n  } else {\n    let j = 0;\n    for (let i = 0, ii = src.length; i < ii; i += 4) {\n      dest[j++] = src[i];\n      dest[j++] = src[i + 1];\n      dest[j++] = src[i + 2];\n    }\n  }\n}\n\nfunction isDefaultDecodeHelper(decode, expectedLen) {\n  if (!Array.isArray(decode)) {\n    return true;\n  }\n  const decodeLen = decode.length;\n\n  if (decodeLen < expectedLen) {\n    warn(\"Decode map length is too short.\");\n    return true;\n  }\n  if (decodeLen > expectedLen) {\n    info(\"Truncating too long decode map.\");\n    decode.length = expectedLen;\n  }\n  return false;\n}\n\nclass ColorSpace {\n  static #rgbBuf = new Uint8ClampedArray(3);\n\n  constructor(name, numComps) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === ColorSpace\n    ) {\n      unreachable(\"Cannot initialize ColorSpace.\");\n    }\n    this.name = name;\n    this.numComps = numComps;\n  }\n\n  /**\n   * Converts the color value to the RGB color. The color components are\n   * located in the src array starting from the srcOffset. Returns the array\n   * of the rgb components, each value ranging from [0,255].\n   */\n  getRgb(src, srcOffset, output = new Uint8ClampedArray(3)) {\n    this.getRgbItem(src, srcOffset, output, 0);\n    return output;\n  }\n\n  getRgbHex(src, srcOffset) {\n    const buffer = this.getRgb(src, srcOffset, ColorSpace.#rgbBuf);\n    return Util.makeHexColor(buffer[0], buffer[1], buffer[2]);\n  }\n\n  /**\n   * Converts the color value to the RGB color, similar to the getRgb method.\n   * The result placed into the dest array starting from the destOffset.\n   */\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    unreachable(\"Should not call ColorSpace.getRgbItem\");\n  }\n\n  /**\n   * Converts the specified number of the color values to the RGB colors.\n   * The colors are located in the src array starting from the srcOffset.\n   * The result is placed into the dest array starting from the destOffset.\n   * The src array items shall be in [0,2^bits) range, the dest array items\n   * will be in [0,255] range. alpha01 indicates how many alpha components\n   * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA\n   * array).\n   */\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    unreachable(\"Should not call ColorSpace.getRgbBuffer\");\n  }\n\n  /**\n   * Determines the number of bytes required to store the result of the\n   * conversion done by the getRgbBuffer method. As in getRgbBuffer,\n   * |alpha01| is either 0 (RGB output) or 1 (RGBA output).\n   */\n  getOutputLength(inputLength, alpha01) {\n    unreachable(\"Should not call ColorSpace.getOutputLength\");\n  }\n\n  /**\n   * Returns true if source data will be equal the result/output data.\n   */\n  isPassthrough(bits) {\n    return false;\n  }\n\n  /**\n   * Refer to the static `ColorSpace.isDefaultDecode` method below.\n   */\n  isDefaultDecode(decode, bpc) {\n    return ColorSpace.isDefaultDecode(decode, this.numComps);\n  }\n\n  /**\n   * Fills in the RGB colors in the destination buffer.  alpha01 indicates\n   * how many alpha components there are in the dest array; it will be either\n   * 0 (RGB array) or 1 (RGBA array).\n   */\n  fillRgb(\n    dest,\n    originalWidth,\n    originalHeight,\n    width,\n    height,\n    actualHeight,\n    bpc,\n    comps,\n    alpha01\n  ) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'ColorSpace.fillRgb: Unsupported \"dest\" type.'\n      );\n    }\n    const count = originalWidth * originalHeight;\n    let rgbBuf = null;\n    const numComponentColors = 1 << bpc;\n    const needsResizing = originalHeight !== height || originalWidth !== width;\n\n    if (this.isPassthrough(bpc)) {\n      rgbBuf = comps;\n    } else if (\n      this.numComps === 1 &&\n      count > numComponentColors &&\n      this.name !== \"DeviceGray\" &&\n      this.name !== \"DeviceRGB\"\n    ) {\n      // Optimization: create a color map when there is just one component and\n      // we are converting more colors than the size of the color map. We\n      // don't build the map if the colorspace is gray or rgb since those\n      // methods are faster than building a map. This mainly offers big speed\n      // ups for indexed and alternate colorspaces.\n      //\n      // TODO it may be worth while to cache the color map. While running\n      // testing I never hit a cache so I will leave that out for now (perhaps\n      // we are reparsing colorspaces too much?).\n      const allColors =\n        bpc <= 8\n          ? new Uint8Array(numComponentColors)\n          : new Uint16Array(numComponentColors);\n      for (let i = 0; i < numComponentColors; i++) {\n        allColors[i] = i;\n      }\n      const colorMap = new Uint8ClampedArray(numComponentColors * 3);\n      this.getRgbBuffer(\n        allColors,\n        0,\n        numComponentColors,\n        colorMap,\n        0,\n        bpc,\n        /* alpha01 = */ 0\n      );\n\n      if (!needsResizing) {\n        // Fill in the RGB values directly into |dest|.\n        let destPos = 0;\n        for (let i = 0; i < count; ++i) {\n          const key = comps[i] * 3;\n          dest[destPos++] = colorMap[key];\n          dest[destPos++] = colorMap[key + 1];\n          dest[destPos++] = colorMap[key + 2];\n          destPos += alpha01;\n        }\n      } else {\n        rgbBuf = new Uint8Array(count * 3);\n        let rgbPos = 0;\n        for (let i = 0; i < count; ++i) {\n          const key = comps[i] * 3;\n          rgbBuf[rgbPos++] = colorMap[key];\n          rgbBuf[rgbPos++] = colorMap[key + 1];\n          rgbBuf[rgbPos++] = colorMap[key + 2];\n        }\n      }\n    } else if (!needsResizing) {\n      // Fill in the RGB values directly into |dest|.\n      this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);\n    } else {\n      rgbBuf = new Uint8ClampedArray(count * 3);\n      this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, /* alpha01 = */ 0);\n    }\n\n    if (rgbBuf) {\n      if (needsResizing) {\n        resizeRgbImage(\n          rgbBuf,\n          dest,\n          originalWidth,\n          originalHeight,\n          width,\n          height,\n          alpha01\n        );\n      } else {\n        let destPos = 0,\n          rgbPos = 0;\n        for (let i = 0, ii = width * actualHeight; i < ii; i++) {\n          dest[destPos++] = rgbBuf[rgbPos++];\n          dest[destPos++] = rgbBuf[rgbPos++];\n          dest[destPos++] = rgbBuf[rgbPos++];\n          destPos += alpha01;\n        }\n      }\n    }\n  }\n\n  /**\n   * True if the colorspace has components in the default range of [0, 1].\n   * This should be true for all colorspaces except for lab color spaces\n   * which are [0,100], [-128, 127], [-128, 127].\n   */\n  get usesZeroToOneRange() {\n    return shadow(this, \"usesZeroToOneRange\", true);\n  }\n\n  /**\n   * Checks if a decode map matches the default decode map for a color space.\n   * This handles the general decode maps where there are two values per\n   * component, e.g. [0, 1, 0, 1, 0, 1] for a RGB color.\n   * This does not handle Lab, Indexed, or Pattern decode maps since they are\n   * slightly different.\n   * @param {Array} decode - Decode map (usually from an image).\n   * @param {number} numComps - Number of components the color space has.\n   */\n  static isDefaultDecode(decode, numComps) {\n    if (isDefaultDecodeHelper(decode, numComps * 2)) {\n      return true;\n    }\n    for (let i = 0, ii = decode.length; i < ii; i += 2) {\n      if (decode[i] !== 0 || decode[i + 1] !== 1) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\n/**\n * Alternate color space handles both Separation and DeviceN color spaces.  A\n * Separation color space is actually just a DeviceN with one color component.\n * Both color spaces use a tinting function to convert colors to a base color\n * space.\n *\n * The default color is `new Float32Array(new Array(numComps).fill(1))`.\n */\nclass AlternateCS extends ColorSpace {\n  constructor(numComps, base, tintFn) {\n    super(\"Alternate\", numComps);\n    this.base = base;\n    this.tintFn = tintFn;\n    this.tmpBuf = new Float32Array(base.numComps);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'AlternateCS.getRgbItem: Unsupported \"dest\" type.'\n      );\n    }\n    const tmpBuf = this.tmpBuf;\n    this.tintFn(src, srcOffset, tmpBuf, 0);\n    this.base.getRgbItem(tmpBuf, 0, dest, destOffset);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'AlternateCS.getRgbBuffer: Unsupported \"dest\" type.'\n      );\n    }\n    const tintFn = this.tintFn;\n    const base = this.base;\n    const scale = 1 / ((1 << bits) - 1);\n    const baseNumComps = base.numComps;\n    const usesZeroToOneRange = base.usesZeroToOneRange;\n    const isPassthrough =\n      (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;\n    let pos = isPassthrough ? destOffset : 0;\n    const baseBuf = isPassthrough\n      ? dest\n      : new Uint8ClampedArray(baseNumComps * count);\n    const numComps = this.numComps;\n\n    const scaled = new Float32Array(numComps);\n    const tinted = new Float32Array(baseNumComps);\n    let i, j;\n\n    for (i = 0; i < count; i++) {\n      for (j = 0; j < numComps; j++) {\n        scaled[j] = src[srcOffset++] * scale;\n      }\n      tintFn(scaled, 0, tinted, 0);\n      if (usesZeroToOneRange) {\n        for (j = 0; j < baseNumComps; j++) {\n          baseBuf[pos++] = tinted[j] * 255;\n        }\n      } else {\n        base.getRgbItem(tinted, 0, baseBuf, pos);\n        pos += baseNumComps;\n      }\n    }\n\n    if (!isPassthrough) {\n      base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return this.base.getOutputLength(\n      (inputLength * this.base.numComps) / this.numComps,\n      alpha01\n    );\n  }\n}\n\nclass PatternCS extends ColorSpace {\n  constructor(baseCS) {\n    super(\"Pattern\", null);\n    this.base = baseCS;\n  }\n\n  isDefaultDecode(decode, bpc) {\n    unreachable(\"Should not call PatternCS.isDefaultDecode\");\n  }\n}\n\n/**\n * The default color is `new Uint8Array([0])`.\n */\nclass IndexedCS extends ColorSpace {\n  constructor(base, highVal, lookup) {\n    super(\"Indexed\", 1);\n    this.base = base;\n    this.highVal = highVal;\n\n    const length = base.numComps * (highVal + 1);\n    this.lookup = new Uint8Array(length);\n\n    if (lookup instanceof BaseStream) {\n      const bytes = lookup.getBytes(length);\n      this.lookup.set(bytes);\n    } else if (typeof lookup === \"string\") {\n      for (let i = 0; i < length; ++i) {\n        this.lookup[i] = lookup.charCodeAt(i) & 0xff;\n      }\n    } else {\n      throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`);\n    }\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'IndexedCS.getRgbItem: Unsupported \"dest\" type.'\n      );\n    }\n    const { base, highVal, lookup } = this;\n    const start =\n      MathClamp(Math.round(src[srcOffset]), 0, highVal) * base.numComps;\n    base.getRgbBuffer(lookup, start, 1, dest, destOffset, 8, 0);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'IndexedCS.getRgbBuffer: Unsupported \"dest\" type.'\n      );\n    }\n    const { base, highVal, lookup } = this;\n    const { numComps } = base;\n    const outputDelta = base.getOutputLength(numComps, alpha01);\n\n    for (let i = 0; i < count; ++i) {\n      const lookupPos =\n        MathClamp(Math.round(src[srcOffset++]), 0, highVal) * numComps;\n      base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);\n      destOffset += outputDelta;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);\n  }\n\n  isDefaultDecode(decode, bpc) {\n    if (isDefaultDecodeHelper(decode, 2)) {\n      return true;\n    }\n    if (!Number.isInteger(bpc) || bpc < 1) {\n      warn(\"Bits per component is not correct\");\n      return true;\n    }\n    return decode[0] === 0 && decode[1] === (1 << bpc) - 1;\n  }\n}\n\n/**\n * The default color is `new Float32Array([0])`.\n */\nclass DeviceGrayCS extends ColorSpace {\n  constructor() {\n    super(\"DeviceGray\", 1);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'DeviceGrayCS.getRgbItem: Unsupported \"dest\" type.'\n      );\n    }\n    const c = src[srcOffset] * 255;\n    dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'DeviceGrayCS.getRgbBuffer: Unsupported \"dest\" type.'\n      );\n    }\n    const scale = 255 / ((1 << bits) - 1);\n    let j = srcOffset,\n      q = destOffset;\n    for (let i = 0; i < count; ++i) {\n      const c = scale * src[j++];\n      dest[q++] = c;\n      dest[q++] = c;\n      dest[q++] = c;\n      q += alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return inputLength * (3 + alpha01);\n  }\n}\n\n/**\n * The default color is `new Float32Array([0, 0, 0])`.\n */\nclass DeviceRgbCS extends ColorSpace {\n  constructor() {\n    super(\"DeviceRGB\", 3);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'DeviceRgbCS.getRgbItem: Unsupported \"dest\" type.'\n      );\n    }\n    dest[destOffset] = src[srcOffset] * 255;\n    dest[destOffset + 1] = src[srcOffset + 1] * 255;\n    dest[destOffset + 2] = src[srcOffset + 2] * 255;\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'DeviceRgbCS.getRgbBuffer: Unsupported \"dest\" type.'\n      );\n    }\n    if (bits === 8 && alpha01 === 0) {\n      dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);\n      return;\n    }\n    const scale = 255 / ((1 << bits) - 1);\n    let j = srcOffset,\n      q = destOffset;\n    for (let i = 0; i < count; ++i) {\n      dest[q++] = scale * src[j++];\n      dest[q++] = scale * src[j++];\n      dest[q++] = scale * src[j++];\n      q += alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return ((inputLength * (3 + alpha01)) / 3) | 0;\n  }\n\n  isPassthrough(bits) {\n    return bits === 8;\n  }\n}\n\n/**\n * The default color is `new Float32Array([0, 0, 0, 1])`.\n */\nclass DeviceRgbaCS extends ColorSpace {\n  constructor() {\n    super(\"DeviceRGBA\", 4);\n  }\n\n  getOutputLength(inputLength, _alpha01) {\n    return inputLength * 4;\n  }\n\n  isPassthrough(bits) {\n    return bits === 8;\n  }\n\n  fillRgb(\n    dest,\n    originalWidth,\n    originalHeight,\n    width,\n    height,\n    actualHeight,\n    bpc,\n    comps,\n    alpha01\n  ) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'DeviceRgbaCS.fillRgb: Unsupported \"dest\" type.'\n      );\n    }\n    if (originalHeight !== height || originalWidth !== width) {\n      resizeRgbaImage(\n        comps,\n        dest,\n        originalWidth,\n        originalHeight,\n        width,\n        height,\n        alpha01\n      );\n    } else {\n      copyRgbaImage(comps, dest, alpha01);\n    }\n  }\n}\n\n/**\n * The default color is `new Float32Array([0, 0, 0, 1])`.\n */\nclass DeviceCmykCS extends ColorSpace {\n  constructor() {\n    super(\"DeviceCMYK\", 4);\n  }\n\n  // The coefficients below was found using numerical analysis: the method of\n  // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors,\n  // where color_value is the tabular value from the table of sampled RGB colors\n  // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding\n  // CMYK color conversion using the estimation below:\n  //   f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255\n  #toRgb(src, srcOffset, srcScale, dest, destOffset) {\n    const c = src[srcOffset] * srcScale;\n    const m = src[srcOffset + 1] * srcScale;\n    const y = src[srcOffset + 2] * srcScale;\n    const k = src[srcOffset + 3] * srcScale;\n\n    dest[destOffset] =\n      255 +\n      c *\n        (-4.387332384609988 * c +\n          54.48615194189176 * m +\n          18.82290502165302 * y +\n          212.25662451639585 * k +\n          -285.2331026137004) +\n      m *\n        (1.7149763477362134 * m -\n          5.6096736904047315 * y +\n          -17.873870861415444 * k -\n          5.497006427196366) +\n      y *\n        (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) +\n      k * (-21.86122147463605 * k - 189.48180835922747);\n\n    dest[destOffset + 1] =\n      255 +\n      c *\n        (8.841041422036149 * c +\n          60.118027045597366 * m +\n          6.871425592049007 * y +\n          31.159100130055922 * k +\n          -79.2970844816548) +\n      m *\n        (-15.310361306967817 * m +\n          17.575251261109482 * y +\n          131.35250912493976 * k -\n          190.9453302588951) +\n      y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) +\n      k * (-20.737325471181034 * k - 187.80453709719578);\n\n    dest[destOffset + 2] =\n      255 +\n      c *\n        (0.8842522430003296 * c +\n          8.078677503112928 * m +\n          30.89978309703729 * y -\n          0.23883238689178934 * k +\n          -14.183576799673286) +\n      m *\n        (10.49593273432072 * m +\n          63.02378494754052 * y +\n          50.606957656360734 * k -\n          112.23884253719248) +\n      y *\n        (0.03296041114873217 * y +\n          115.60384449646641 * k +\n          -193.58209356861505) +\n      k * (-22.33816807309886 * k - 180.12613974708367);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'DeviceCmykCS.getRgbItem: Unsupported \"dest\" type.'\n      );\n    }\n    this.#toRgb(src, srcOffset, 1, dest, destOffset);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'DeviceCmykCS.getRgbBuffer: Unsupported \"dest\" type.'\n      );\n    }\n    const scale = 1 / ((1 << bits) - 1);\n    for (let i = 0; i < count; i++) {\n      this.#toRgb(src, srcOffset, scale, dest, destOffset);\n      srcOffset += 4;\n      destOffset += 3 + alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return ((inputLength / 4) * (3 + alpha01)) | 0;\n  }\n}\n\n/**\n * CalGrayCS: Based on \"PDF Reference, Sixth Ed\", p.245\n *\n * The default color is `new Float32Array([0])`.\n */\nclass CalGrayCS extends ColorSpace {\n  constructor(whitePoint, blackPoint, gamma) {\n    super(\"CalGray\", 1);\n\n    if (!whitePoint) {\n      throw new FormatError(\n        \"WhitePoint missing - required for color space CalGray\"\n      );\n    }\n    // Translate arguments to spec variables.\n    [this.XW, this.YW, this.ZW] = whitePoint;\n    [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0];\n    this.G = gamma || 1;\n\n    // Validate variables as per spec.\n    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n      throw new FormatError(\n        `Invalid WhitePoint components for ${this.name}, no fallback available`\n      );\n    }\n\n    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n      info(`Invalid BlackPoint for ${this.name}, falling back to default.`);\n      this.XB = this.YB = this.ZB = 0;\n    }\n\n    if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {\n      warn(\n        `${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` +\n          `ZB: ${this.ZB}, only default values are supported.`\n      );\n    }\n\n    if (this.G < 1) {\n      info(\n        `Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`\n      );\n      this.G = 1;\n    }\n  }\n\n  #toRgb(src, srcOffset, dest, destOffset, scale) {\n    // A represents a gray component of a calibrated gray space.\n    // A <---> AG in the spec\n    const A = src[srcOffset] * scale;\n    const AG = A ** this.G;\n\n    // Computes L as per spec. ( = this.YW * AG )\n    // Except if other than default BlackPoint values are used.\n    const L = this.YW * AG;\n    // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.\n    // Convert values to rgb range [0, 255].\n    const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0);\n    dest[destOffset] = val;\n    dest[destOffset + 1] = val;\n    dest[destOffset + 2] = val;\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'CalGrayCS.getRgbItem: Unsupported \"dest\" type.'\n      );\n    }\n    this.#toRgb(src, srcOffset, dest, destOffset, 1);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'CalGrayCS.getRgbBuffer: Unsupported \"dest\" type.'\n      );\n    }\n    const scale = 1 / ((1 << bits) - 1);\n\n    for (let i = 0; i < count; ++i) {\n      this.#toRgb(src, srcOffset, dest, destOffset, scale);\n      srcOffset += 1;\n      destOffset += 3 + alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return inputLength * (3 + alpha01);\n  }\n}\n\n/**\n * CalRGBCS: Based on \"PDF Reference, Sixth Ed\", p.247\n *\n * The default color is `new Float32Array([0, 0, 0])`.\n */\nclass CalRGBCS extends ColorSpace {\n  // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these\n  // matrices.\n  // prettier-ignore\n  static #BRADFORD_SCALE_MATRIX = new Float32Array([\n    0.8951, 0.2664, -0.1614,\n    -0.7502, 1.7135, 0.0367,\n    0.0389, -0.0685, 1.0296]);\n\n  // prettier-ignore\n  static #BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([\n    0.9869929, -0.1470543, 0.1599627,\n    0.4323053, 0.5183603, 0.0492912,\n    -0.0085287, 0.0400428, 0.9684867]);\n\n  // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html.\n  // prettier-ignore\n  static #SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([\n    3.2404542, -1.5371385, -0.4985314,\n    -0.9692660, 1.8760108, 0.0415560,\n    0.0556434, -0.2040259, 1.0572252]);\n\n  static #FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);\n\n  static #tempNormalizeMatrix = new Float32Array(3);\n\n  static #tempConvertMatrix1 = new Float32Array(3);\n\n  static #tempConvertMatrix2 = new Float32Array(3);\n\n  static #DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0;\n\n  constructor(whitePoint, blackPoint, gamma, matrix) {\n    super(\"CalRGB\", 3);\n\n    if (!whitePoint) {\n      throw new FormatError(\n        \"WhitePoint missing - required for color space CalRGB\"\n      );\n    }\n    // Translate arguments to spec variables.\n    const [XW, YW, ZW] = (this.whitePoint = whitePoint);\n    const [XB, YB, ZB] = (this.blackPoint = blackPoint || new Float32Array(3));\n\n    [this.GR, this.GG, this.GB] = gamma || new Float32Array([1, 1, 1]);\n    [\n      this.MXA,\n      this.MYA,\n      this.MZA,\n      this.MXB,\n      this.MYB,\n      this.MZB,\n      this.MXC,\n      this.MYC,\n      this.MZC,\n    ] = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n\n    // Validate variables as per spec.\n    if (XW < 0 || ZW < 0 || YW !== 1) {\n      throw new FormatError(\n        `Invalid WhitePoint components for ${this.name}, no fallback available`\n      );\n    }\n\n    if (XB < 0 || YB < 0 || ZB < 0) {\n      info(\n        `Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` +\n          \"falling back to default.\"\n      );\n      this.blackPoint = new Float32Array(3);\n    }\n\n    if (this.GR < 0 || this.GG < 0 || this.GB < 0) {\n      info(\n        `Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` +\n          `${this.name}, falling back to default.`\n      );\n      this.GR = this.GG = this.GB = 1;\n    }\n  }\n\n  #matrixProduct(a, b, result) {\n    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];\n    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];\n  }\n\n  #toFlat(sourceWhitePoint, LMS, result) {\n    result[0] = (LMS[0] * 1) / sourceWhitePoint[0];\n    result[1] = (LMS[1] * 1) / sourceWhitePoint[1];\n    result[2] = (LMS[2] * 1) / sourceWhitePoint[2];\n  }\n\n  #toD65(sourceWhitePoint, LMS, result) {\n    const D65X = 0.95047;\n    const D65Y = 1;\n    const D65Z = 1.08883;\n\n    result[0] = (LMS[0] * D65X) / sourceWhitePoint[0];\n    result[1] = (LMS[1] * D65Y) / sourceWhitePoint[1];\n    result[2] = (LMS[2] * D65Z) / sourceWhitePoint[2];\n  }\n\n  #sRGBTransferFunction(color) {\n    // See http://en.wikipedia.org/wiki/SRGB.\n    if (color <= 0.0031308) {\n      return MathClamp(12.92 * color, 0, 1);\n    }\n    // Optimization:\n    // If color is close enough to 1, skip calling the following transform\n    // since calling Math.pow is expensive. If color is larger than\n    // the threshold, the final result is larger than 254.5 since\n    // ((1 + 0.055) * 0.99554525 ** (1 / 2.4) - 0.055) * 255 ===\n    // 254.50000003134699\n    if (color >= 0.99554525) {\n      return 1;\n    }\n    return MathClamp((1 + 0.055) * color ** (1 / 2.4) - 0.055, 0, 1);\n  }\n\n  #decodeL(L) {\n    if (L < 0) {\n      return -this.#decodeL(-L);\n    }\n    if (L > 8.0) {\n      return ((L + 16) / 116) ** 3;\n    }\n    return L * CalRGBCS.#DECODE_L_CONSTANT;\n  }\n\n  #compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {\n    // In case the blackPoint is already the default blackPoint then there is\n    // no need to do compensation.\n    if (\n      sourceBlackPoint[0] === 0 &&\n      sourceBlackPoint[1] === 0 &&\n      sourceBlackPoint[2] === 0\n    ) {\n      result[0] = XYZ_Flat[0];\n      result[1] = XYZ_Flat[1];\n      result[2] = XYZ_Flat[2];\n      return;\n    }\n\n    // For the blackPoint calculation details, please see\n    // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/\n    // AdobeBPC.pdf.\n    // The destination blackPoint is the default blackPoint [0, 0, 0].\n    const zeroDecodeL = this.#decodeL(0);\n\n    const X_DST = zeroDecodeL;\n    const X_SRC = this.#decodeL(sourceBlackPoint[0]);\n\n    const Y_DST = zeroDecodeL;\n    const Y_SRC = this.#decodeL(sourceBlackPoint[1]);\n\n    const Z_DST = zeroDecodeL;\n    const Z_SRC = this.#decodeL(sourceBlackPoint[2]);\n\n    const X_Scale = (1 - X_DST) / (1 - X_SRC);\n    const X_Offset = 1 - X_Scale;\n\n    const Y_Scale = (1 - Y_DST) / (1 - Y_SRC);\n    const Y_Offset = 1 - Y_Scale;\n\n    const Z_Scale = (1 - Z_DST) / (1 - Z_SRC);\n    const Z_Offset = 1 - Z_Scale;\n\n    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;\n    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;\n    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;\n  }\n\n  #normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {\n    // In case the whitePoint is already flat then there is no need to do\n    // normalization.\n    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {\n      result[0] = XYZ_In[0];\n      result[1] = XYZ_In[1];\n      result[2] = XYZ_In[2];\n      return;\n    }\n\n    const LMS = result;\n    this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n\n    const LMS_Flat = CalRGBCS.#tempNormalizeMatrix;\n    this.#toFlat(sourceWhitePoint, LMS, LMS_Flat);\n\n    this.#matrixProduct(\n      CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX,\n      LMS_Flat,\n      result\n    );\n  }\n\n  #normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {\n    const LMS = result;\n    this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n\n    const LMS_D65 = CalRGBCS.#tempNormalizeMatrix;\n    this.#toD65(sourceWhitePoint, LMS, LMS_D65);\n\n    this.#matrixProduct(\n      CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX,\n      LMS_D65,\n      result\n    );\n  }\n\n  #toRgb(src, srcOffset, dest, destOffset, scale) {\n    // A, B and C represent a red, green and blue components of a calibrated\n    // rgb space.\n    const A = MathClamp(src[srcOffset] * scale, 0, 1);\n    const B = MathClamp(src[srcOffset + 1] * scale, 0, 1);\n    const C = MathClamp(src[srcOffset + 2] * scale, 0, 1);\n\n    // A <---> AGR in the spec\n    // B <---> BGG in the spec\n    // C <---> CGB in the spec\n    const AGR = A === 1 ? 1 : A ** this.GR;\n    const BGG = B === 1 ? 1 : B ** this.GG;\n    const CGB = C === 1 ? 1 : C ** this.GB;\n\n    // Computes intermediate variables L, M, N as per spec.\n    // To decode X, Y, Z values map L, M, N directly to them.\n    const X = this.MXA * AGR + this.MXB * BGG + this.MXC * CGB;\n    const Y = this.MYA * AGR + this.MYB * BGG + this.MYC * CGB;\n    const Z = this.MZA * AGR + this.MZB * BGG + this.MZC * CGB;\n\n    // The following calculations are based on this document:\n    // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/\n    // AdobeBPC.pdf.\n    const XYZ = CalRGBCS.#tempConvertMatrix1;\n    XYZ[0] = X;\n    XYZ[1] = Y;\n    XYZ[2] = Z;\n    const XYZ_Flat = CalRGBCS.#tempConvertMatrix2;\n\n    this.#normalizeWhitePointToFlat(this.whitePoint, XYZ, XYZ_Flat);\n\n    const XYZ_Black = CalRGBCS.#tempConvertMatrix1;\n    this.#compensateBlackPoint(this.blackPoint, XYZ_Flat, XYZ_Black);\n\n    const XYZ_D65 = CalRGBCS.#tempConvertMatrix2;\n    this.#normalizeWhitePointToD65(\n      CalRGBCS.#FLAT_WHITEPOINT_MATRIX,\n      XYZ_Black,\n      XYZ_D65\n    );\n\n    const SRGB = CalRGBCS.#tempConvertMatrix1;\n    this.#matrixProduct(CalRGBCS.#SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);\n\n    // Convert the values to rgb range [0, 255].\n    dest[destOffset] = this.#sRGBTransferFunction(SRGB[0]) * 255;\n    dest[destOffset + 1] = this.#sRGBTransferFunction(SRGB[1]) * 255;\n    dest[destOffset + 2] = this.#sRGBTransferFunction(SRGB[2]) * 255;\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'CalRGBCS.getRgbItem: Unsupported \"dest\" type.'\n      );\n    }\n    this.#toRgb(src, srcOffset, dest, destOffset, 1);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'CalRGBCS.getRgbBuffer: Unsupported \"dest\" type.'\n      );\n    }\n    const scale = 1 / ((1 << bits) - 1);\n\n    for (let i = 0; i < count; ++i) {\n      this.#toRgb(src, srcOffset, dest, destOffset, scale);\n      srcOffset += 3;\n      destOffset += 3 + alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return ((inputLength * (3 + alpha01)) / 3) | 0;\n  }\n}\n\n/**\n * LabCS: Based on \"PDF Reference, Sixth Ed\", p.250\n *\n * The default color is `new Float32Array([0, 0, 0])`.\n */\nclass LabCS extends ColorSpace {\n  constructor(whitePoint, blackPoint, range) {\n    super(\"Lab\", 3);\n\n    if (!whitePoint) {\n      throw new FormatError(\n        \"WhitePoint missing - required for color space Lab\"\n      );\n    }\n    // Translate args to spec variables\n    [this.XW, this.YW, this.ZW] = whitePoint;\n    [this.amin, this.amax, this.bmin, this.bmax] = range || [\n      -100, 100, -100, 100,\n    ];\n\n    // These are here just for completeness - the spec doesn't offer any\n    // formulas that use BlackPoint in Lab\n    [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0];\n\n    // Validate vars as per spec\n    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n      throw new FormatError(\n        \"Invalid WhitePoint components, no fallback available\"\n      );\n    }\n\n    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n      info(\"Invalid BlackPoint, falling back to default\");\n      this.XB = this.YB = this.ZB = 0;\n    }\n\n    if (this.amin > this.amax || this.bmin > this.bmax) {\n      info(\"Invalid Range, falling back to defaults\");\n      this.amin = -100;\n      this.amax = 100;\n      this.bmin = -100;\n      this.bmax = 100;\n    }\n  }\n\n  // Function g(x) from spec\n  #fn_g(x) {\n    return x >= 6 / 29 ? x ** 3 : (108 / 841) * (x - 4 / 29);\n  }\n\n  #decode(value, high1, low2, high2) {\n    return low2 + (value * (high2 - low2)) / high1;\n  }\n\n  // If decoding is needed maxVal should be 2^bits per component - 1.\n  #toRgb(src, srcOffset, maxVal, dest, destOffset) {\n    // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax]\n    // not the usual [0, 1]. If a command like setFillColor is used the src\n    // values will already be within the correct range. However, if we are\n    // converting an image we have to map the values to the correct range given\n    // above.\n    // Ls,as,bs <---> L*,a*,b* in the spec\n    let Ls = src[srcOffset];\n    let as = src[srcOffset + 1];\n    let bs = src[srcOffset + 2];\n    if (maxVal !== false) {\n      Ls = this.#decode(Ls, maxVal, 0, 100);\n      as = this.#decode(as, maxVal, this.amin, this.amax);\n      bs = this.#decode(bs, maxVal, this.bmin, this.bmax);\n    }\n\n    // Adjust limits of 'as' and 'bs'\n    if (as > this.amax) {\n      as = this.amax;\n    } else if (as < this.amin) {\n      as = this.amin;\n    }\n    if (bs > this.bmax) {\n      bs = this.bmax;\n    } else if (bs < this.bmin) {\n      bs = this.bmin;\n    }\n\n    // Computes intermediate variables X,Y,Z as per spec\n    const M = (Ls + 16) / 116;\n    const L = M + as / 500;\n    const N = M - bs / 200;\n\n    const X = this.XW * this.#fn_g(L);\n    const Y = this.YW * this.#fn_g(M);\n    const Z = this.ZW * this.#fn_g(N);\n\n    let r, g, b;\n    // Using different conversions for D50 and D65 white points,\n    // per http://www.color.org/srgb.pdf\n    if (this.ZW < 1) {\n      // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249)\n      r = X * 3.1339 + Y * -1.617 + Z * -0.4906;\n      g = X * -0.9785 + Y * 1.916 + Z * 0.0333;\n      b = X * 0.072 + Y * -0.229 + Z * 1.4057;\n    } else {\n      // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888)\n      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;\n      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;\n      b = X * 0.0557 + Y * -0.204 + Z * 1.057;\n    }\n    // Convert the color values to the [0,255] range (clamping is automatic).\n    dest[destOffset] = Math.sqrt(r) * 255;\n    dest[destOffset + 1] = Math.sqrt(g) * 255;\n    dest[destOffset + 2] = Math.sqrt(b) * 255;\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'LabCS.getRgbItem: Unsupported \"dest\" type.'\n      );\n    }\n    this.#toRgb(src, srcOffset, false, dest, destOffset);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        dest instanceof Uint8ClampedArray,\n        'LabCS.getRgbBuffer: Unsupported \"dest\" type.'\n      );\n    }\n    const maxVal = (1 << bits) - 1;\n    for (let i = 0; i < count; i++) {\n      this.#toRgb(src, srcOffset, maxVal, dest, destOffset);\n      srcOffset += 3;\n      destOffset += 3 + alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return ((inputLength * (3 + alpha01)) / 3) | 0;\n  }\n\n  isDefaultDecode(decode, bpc) {\n    // XXX: Decoding is handled with the lab conversion because of the strange\n    // ranges that are used.\n    return true;\n  }\n\n  get usesZeroToOneRange() {\n    return shadow(this, \"usesZeroToOneRange\", false);\n  }\n}\n\nexport {\n  AlternateCS,\n  CalGrayCS,\n  CalRGBCS,\n  ColorSpace,\n  DeviceCmykCS,\n  DeviceGrayCS,\n  DeviceRgbaCS,\n  DeviceRgbCS,\n  IndexedCS,\n  LabCS,\n  PatternCS,\n};\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  DataType,\n  initSync,\n  Intent,\n  qcms_convert_array,\n  qcms_convert_four,\n  qcms_convert_one,\n  qcms_convert_three,\n  qcms_drop_transformer,\n  qcms_transformer_from_memory,\n} from \"../../external/qcms/qcms.js\";\nimport { shadow, Util, warn } from \"../shared/util.js\";\nimport { ColorSpace } from \"./colorspace.js\";\nimport { QCMS } from \"../../external/qcms/qcms_utils.js\";\n\nfunction fetchSync(url) {\n  // Parsing and using color spaces is still synchronous,\n  // so we must load the wasm module synchronously.\n  // TODO: Make the color space stuff asynchronous and use fetch.\n  const xhr = new XMLHttpRequest();\n  xhr.open(\"GET\", url, false);\n  xhr.responseType = \"arraybuffer\";\n  xhr.send(null);\n  return xhr.response;\n}\n\nclass IccColorSpace extends ColorSpace {\n  #transformer;\n\n  #convertPixel;\n\n  static #useWasm = true;\n\n  static #wasmUrl = null;\n\n  static #finalizer = null;\n\n  constructor(iccProfile, name, numComps) {\n    if (!IccColorSpace.isUsable) {\n      throw new Error(\"No ICC color space support\");\n    }\n\n    super(name, numComps);\n\n    let inType;\n    switch (numComps) {\n      case 1:\n        inType = DataType.Gray8;\n        this.#convertPixel = (src, srcOffset, css) =>\n          qcms_convert_one(this.#transformer, src[srcOffset] * 255, css);\n        break;\n      case 3:\n        inType = DataType.RGB8;\n        this.#convertPixel = (src, srcOffset, css) =>\n          qcms_convert_three(\n            this.#transformer,\n            src[srcOffset] * 255,\n            src[srcOffset + 1] * 255,\n            src[srcOffset + 2] * 255,\n            css\n          );\n        break;\n      case 4:\n        inType = DataType.CMYK;\n        this.#convertPixel = (src, srcOffset, css) =>\n          qcms_convert_four(\n            this.#transformer,\n            src[srcOffset] * 255,\n            src[srcOffset + 1] * 255,\n            src[srcOffset + 2] * 255,\n            src[srcOffset + 3] * 255,\n            css\n          );\n        break;\n      default:\n        throw new Error(`Unsupported number of components: ${numComps}`);\n    }\n    this.#transformer = qcms_transformer_from_memory(\n      iccProfile,\n      inType,\n      Intent.Perceptual\n    );\n    if (!this.#transformer) {\n      throw new Error(\"Failed to create ICC color space\");\n    }\n    IccColorSpace.#finalizer ||= new FinalizationRegistry(transformer => {\n      qcms_drop_transformer(transformer);\n    });\n    IccColorSpace.#finalizer.register(this, this.#transformer);\n  }\n\n  getRgbHex(src, srcOffset) {\n    this.#convertPixel(src, srcOffset, /* css */ true);\n    return QCMS._cssColor;\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    QCMS._destBuffer = dest;\n    QCMS._destOffset = destOffset;\n    QCMS._destLength = 3;\n    this.#convertPixel(src, srcOffset, /* css */ false);\n    QCMS._destBuffer = null;\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    src = src.subarray(srcOffset, srcOffset + count * this.numComps);\n    if (bits !== 8) {\n      const scale = 255 / ((1 << bits) - 1);\n      for (let i = 0, ii = src.length; i < ii; i++) {\n        src[i] *= scale;\n      }\n    }\n    QCMS._mustAddAlpha = alpha01 && dest.buffer === src.buffer;\n    QCMS._destBuffer = dest;\n    QCMS._destOffset = destOffset;\n    QCMS._destLength = count * (3 + alpha01);\n    qcms_convert_array(this.#transformer, src);\n    QCMS._mustAddAlpha = false;\n    QCMS._destBuffer = null;\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return ((inputLength / this.numComps) * (3 + alpha01)) | 0;\n  }\n\n  static setOptions({ useWasm, useWorkerFetch, wasmUrl }) {\n    if (!useWorkerFetch) {\n      this.#useWasm = false;\n      return;\n    }\n    this.#useWasm = useWasm;\n    this.#wasmUrl = wasmUrl;\n  }\n\n  static get isUsable() {\n    let isUsable = false;\n    if (this.#useWasm) {\n      if (this.#wasmUrl) {\n        try {\n          this._module = initSync({\n            module: fetchSync(`${this.#wasmUrl}qcms_bg.wasm`),\n          });\n          isUsable = !!this._module;\n          QCMS._memory = this._module.memory;\n          QCMS._makeHexColor = Util.makeHexColor.bind(Util);\n        } catch (e) {\n          warn(`ICCBased color space: \"${e}\".`);\n        }\n      } else {\n        warn(\"No ICC color space support due to missing `wasmUrl` API option\");\n      }\n    }\n\n    return shadow(this, \"isUsable\", isUsable);\n  }\n}\n\nclass CmykICCBasedCS extends IccColorSpace {\n  static #iccUrl;\n\n  constructor() {\n    const iccProfile = new Uint8Array(\n      fetchSync(`${CmykICCBasedCS.#iccUrl}CGATS001Compat-v2-micro.icc`)\n    );\n    super(iccProfile, \"DeviceCMYK\", 4);\n  }\n\n  static setOptions({ iccUrl }) {\n    this.#iccUrl = iccUrl;\n  }\n\n  static get isUsable() {\n    let isUsable = false;\n    if (IccColorSpace.isUsable) {\n      if (this.#iccUrl) {\n        isUsable = true;\n      } else {\n        warn(\"No CMYK ICC profile support due to missing `iccUrl` API option\");\n      }\n    }\n\n    return shadow(this, \"isUsable\", isUsable);\n  }\n}\n\nexport { CmykICCBasedCS, IccColorSpace };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseStream } from \"./base_stream.js\";\nimport { stringToBytes } from \"../shared/util.js\";\n\nclass Stream extends BaseStream {\n  constructor(arrayBuffer, start, length, dict) {\n    super();\n\n    this.bytes =\n      arrayBuffer instanceof Uint8Array\n        ? arrayBuffer\n        : new Uint8Array(arrayBuffer);\n    this.start = start || 0;\n    this.pos = this.start;\n    this.end = start + length || this.bytes.length;\n    this.dict = dict;\n  }\n\n  get length() {\n    return this.end - this.start;\n  }\n\n  get isEmpty() {\n    return this.length === 0;\n  }\n\n  getByte() {\n    if (this.pos >= this.end) {\n      return -1;\n    }\n    return this.bytes[this.pos++];\n  }\n\n  getBytes(length) {\n    const pos = this.pos;\n    const endPos = !length ? this.end : Math.min(pos + length, this.end);\n\n    this.pos = endPos;\n    return this.bytes.subarray(pos, endPos);\n  }\n\n  getByteRange(begin, end) {\n    if (begin < 0) {\n      begin = 0;\n    }\n    if (end > this.end) {\n      end = this.end;\n    }\n    return this.bytes.subarray(begin, end);\n  }\n\n  reset() {\n    this.pos = this.start;\n  }\n\n  moveStart() {\n    this.start = this.pos;\n  }\n\n  makeSubStream(start, length, dict = null) {\n    return new Stream(this.bytes.buffer, start, length, dict);\n  }\n\n  clone() {\n    return new Stream(\n      this.bytes.buffer,\n      this.start,\n      this.length,\n      this.dict?.clone()\n    );\n  }\n}\n\nclass StringStream extends Stream {\n  constructor(str, dict = null) {\n    super(stringToBytes(str), NaN, NaN, dict);\n  }\n}\n\nclass NullStream extends Stream {\n  constructor() {\n    super(new Uint8Array(0));\n  }\n}\n\nexport { NullStream, Stream, StringStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { arrayBuffersToBytes, MissingDataException } from \"./core_utils.js\";\nimport { assert } from \"../shared/util.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\nimport { Stream } from \"./stream.js\";\n\nclass ChunkedStream extends Stream {\n  progressiveDataLength = 0;\n\n  _lastSuccessfulEnsureByteChunk = -1; // Single-entry cache\n\n  _loadedChunks = new Set();\n\n  constructor(length, chunkSize, manager) {\n    super(\n      /* arrayBuffer = */ new Uint8Array(length),\n      /* start = */ 0,\n      /* length = */ length,\n      /* dict = */ null\n    );\n\n    this.chunkSize = chunkSize;\n    this.numChunks = Math.ceil(length / chunkSize);\n    this.manager = manager;\n  }\n\n  // If a particular stream does not implement one or more of these methods,\n  // an error should be thrown.\n  getMissingChunks() {\n    const chunks = [];\n    for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) {\n      if (!this._loadedChunks.has(chunk)) {\n        chunks.push(chunk);\n      }\n    }\n    return chunks;\n  }\n\n  get numChunksLoaded() {\n    return this._loadedChunks.size;\n  }\n\n  get isDataLoaded() {\n    return this.numChunksLoaded === this.numChunks;\n  }\n\n  onReceiveData(begin, chunk) {\n    const chunkSize = this.chunkSize;\n    if (begin % chunkSize !== 0) {\n      throw new Error(`Bad begin offset: ${begin}`);\n    }\n\n    // Using `this.length` is inaccurate here since `this.start` can be moved\n    // (see the `moveStart` method).\n    const end = begin + chunk.byteLength;\n    if (end % chunkSize !== 0 && end !== this.bytes.length) {\n      throw new Error(`Bad end offset: ${end}`);\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        chunk instanceof ArrayBuffer,\n        \"onReceiveData - expected an ArrayBuffer.\"\n      );\n    }\n    this.bytes.set(new Uint8Array(chunk), begin);\n    const beginChunk = Math.floor(begin / chunkSize);\n    const endChunk = Math.floor((end - 1) / chunkSize) + 1;\n\n    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n      // Since a value can only occur *once* in a `Set`, there's no need to\n      // manually check `Set.prototype.has()` before adding the value here.\n      this._loadedChunks.add(curChunk);\n    }\n  }\n\n  onReceiveProgressiveData(data) {\n    let position = this.progressiveDataLength;\n    const beginChunk = Math.floor(position / this.chunkSize);\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        data instanceof ArrayBuffer,\n        \"onReceiveProgressiveData - expected an ArrayBuffer.\"\n      );\n    }\n    this.bytes.set(new Uint8Array(data), position);\n    position += data.byteLength;\n    this.progressiveDataLength = position;\n    const endChunk =\n      position >= this.end\n        ? this.numChunks\n        : Math.floor(position / this.chunkSize);\n\n    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n      // Since a value can only occur *once* in a `Set`, there's no need to\n      // manually check `Set.prototype.has()` before adding the value here.\n      this._loadedChunks.add(curChunk);\n    }\n  }\n\n  ensureByte(pos) {\n    if (pos < this.progressiveDataLength) {\n      return;\n    }\n\n    const chunk = Math.floor(pos / this.chunkSize);\n    if (chunk > this.numChunks) {\n      return;\n    }\n    if (chunk === this._lastSuccessfulEnsureByteChunk) {\n      return;\n    }\n\n    if (!this._loadedChunks.has(chunk)) {\n      throw new MissingDataException(pos, pos + 1);\n    }\n    this._lastSuccessfulEnsureByteChunk = chunk;\n  }\n\n  ensureRange(begin, end) {\n    if (begin >= end) {\n      return;\n    }\n    if (end <= this.progressiveDataLength) {\n      return;\n    }\n\n    const beginChunk = Math.floor(begin / this.chunkSize);\n    if (beginChunk > this.numChunks) {\n      return;\n    }\n    const endChunk = Math.min(\n      Math.floor((end - 1) / this.chunkSize) + 1,\n      this.numChunks\n    );\n    for (let chunk = beginChunk; chunk < endChunk; ++chunk) {\n      if (!this._loadedChunks.has(chunk)) {\n        throw new MissingDataException(begin, end);\n      }\n    }\n  }\n\n  nextEmptyChunk(beginChunk) {\n    const numChunks = this.numChunks;\n    for (let i = 0; i < numChunks; ++i) {\n      const chunk = (beginChunk + i) % numChunks; // Wrap around to beginning.\n      if (!this._loadedChunks.has(chunk)) {\n        return chunk;\n      }\n    }\n    return null;\n  }\n\n  hasChunk(chunk) {\n    return this._loadedChunks.has(chunk);\n  }\n\n  getByte() {\n    const pos = this.pos;\n    if (pos >= this.end) {\n      return -1;\n    }\n    if (pos >= this.progressiveDataLength) {\n      this.ensureByte(pos);\n    }\n    return this.bytes[this.pos++];\n  }\n\n  getBytes(length) {\n    const pos = this.pos;\n    const endPos = !length ? this.end : Math.min(pos + length, this.end);\n\n    if (endPos > this.progressiveDataLength) {\n      this.ensureRange(pos, endPos);\n    }\n    this.pos = endPos;\n    return this.bytes.subarray(pos, endPos);\n  }\n\n  getByteRange(begin, end) {\n    if (begin < 0) {\n      begin = 0;\n    }\n    if (end > this.end) {\n      end = this.end;\n    }\n    if (end > this.progressiveDataLength) {\n      this.ensureRange(begin, end);\n    }\n    return this.bytes.subarray(begin, end);\n  }\n\n  makeSubStream(start, length, dict = null) {\n    if (length) {\n      if (start + length > this.progressiveDataLength) {\n        this.ensureRange(start, start + length);\n      }\n    } else if (start >= this.progressiveDataLength) {\n      // When the `length` is undefined you do *not*, under any circumstances,\n      // want to fallback on calling `this.ensureRange(start, this.end)` since\n      // that would force the *entire* PDF file to be loaded, thus completely\n      // breaking the whole purpose of using streaming and/or range requests.\n      //\n      // However, not doing any checking here could very easily lead to wasted\n      // time/resources during e.g. parsing, since `MissingDataException`s will\n      // require data to be re-parsed, which we attempt to minimize by at least\n      // checking that the *beginning* of the data is available here.\n      this.ensureByte(start);\n    }\n\n    function ChunkedStreamSubstream() {}\n    ChunkedStreamSubstream.prototype = Object.create(this);\n    ChunkedStreamSubstream.prototype.getMissingChunks = function () {\n      const chunkSize = this.chunkSize;\n      const beginChunk = Math.floor(this.start / chunkSize);\n      const endChunk = Math.floor((this.end - 1) / chunkSize) + 1;\n      const missingChunks = [];\n      for (let chunk = beginChunk; chunk < endChunk; ++chunk) {\n        if (!this._loadedChunks.has(chunk)) {\n          missingChunks.push(chunk);\n        }\n      }\n      return missingChunks;\n    };\n    Object.defineProperty(ChunkedStreamSubstream.prototype, \"isDataLoaded\", {\n      get() {\n        if (this.numChunksLoaded === this.numChunks) {\n          return true;\n        }\n        return this.getMissingChunks().length === 0;\n      },\n      configurable: true,\n    });\n\n    const subStream = new ChunkedStreamSubstream();\n    subStream.pos = subStream.start = start;\n    subStream.end = start + length || this.end;\n    subStream.dict = dict;\n    return subStream;\n  }\n\n  getBaseStreams() {\n    return [this];\n  }\n}\n\nclass ChunkedStreamManager {\n  #aborted = false;\n\n  currRequestId = 0;\n\n  _chunksNeededByRequest = new Map();\n\n  #loadedStreamCapability = Promise.withResolvers();\n\n  _promisesByRequest = new Map();\n\n  _requestsByChunk = new Map();\n\n  constructor(pdfStream, args) {\n    this.length = args.length;\n    this.chunkSize = args.rangeChunkSize;\n    this.stream = new ChunkedStream(this.length, this.chunkSize, this);\n    this.pdfStream = pdfStream;\n    this.disableAutoFetch = args.disableAutoFetch;\n    this.msgHandler = args.msgHandler;\n  }\n\n  async sendRequest(begin, end) {\n    const rangeReader = this.pdfStream.getRangeReader(begin, end);\n    let chunks = [];\n\n    while (true) {\n      const { value, done } = await rangeReader.read();\n\n      if (this.#aborted) {\n        chunks = null;\n        return; // Ignoring any data after abort.\n      }\n      if (done) {\n        break;\n      }\n      if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n        assert(\n          value instanceof ArrayBuffer,\n          \"sendRequest - expected an ArrayBuffer.\"\n        );\n      }\n      chunks.push(value);\n    }\n\n    if (chunks.length === 0 && this.disableAutoFetch) {\n      // The range request wasn't dispatched, see the \"GetRangeReader\" handler\n      // in the `src/display/api.js` file.\n      return;\n    }\n    const data = arrayBuffersToBytes(chunks);\n    chunks = null;\n    this.onReceiveData({ chunk: data.buffer, begin });\n  }\n\n  /**\n   * Get all the chunks that are not yet loaded and group them into\n   * contiguous ranges to load in as few requests as possible.\n   */\n  requestAllChunks(noFetch = false) {\n    if (!noFetch) {\n      const missingChunks = this.stream.getMissingChunks();\n      this._requestChunks(missingChunks);\n    }\n    return this.#loadedStreamCapability.promise;\n  }\n\n  _requestChunks(chunks) {\n    const requestId = this.currRequestId++;\n\n    const chunksNeeded = new Set();\n    this._chunksNeededByRequest.set(requestId, chunksNeeded);\n    for (const chunk of chunks) {\n      if (!this.stream.hasChunk(chunk)) {\n        chunksNeeded.add(chunk);\n      }\n    }\n\n    if (chunksNeeded.size === 0) {\n      return Promise.resolve();\n    }\n\n    const capability = Promise.withResolvers();\n    this._promisesByRequest.set(requestId, capability);\n\n    const chunksToRequest = [];\n    for (const chunk of chunksNeeded) {\n      const requestIds = this._requestsByChunk.getOrInsertComputed(\n        chunk,\n        () => {\n          chunksToRequest.push(chunk);\n          return [];\n        }\n      );\n      requestIds.push(requestId);\n    }\n\n    if (chunksToRequest.length > 0) {\n      const groupedChunksToRequest = this.groupChunks(chunksToRequest);\n      for (const groupedChunk of groupedChunksToRequest) {\n        const begin = groupedChunk.beginChunk * this.chunkSize;\n        const end = Math.min(\n          groupedChunk.endChunk * this.chunkSize,\n          this.length\n        );\n        this.sendRequest(begin, end).catch(capability.reject);\n      }\n    }\n\n    return capability.promise.catch(reason => {\n      if (this.#aborted) {\n        return; // Ignoring any pending requests after abort.\n      }\n      throw reason;\n    });\n  }\n\n  getStream() {\n    return this.stream;\n  }\n\n  /**\n   * Loads any chunks in the requested range that are not yet loaded.\n   */\n  requestRange(begin, end) {\n    end = Math.min(end, this.length);\n\n    const beginChunk = this.getBeginChunk(begin);\n    const endChunk = this.getEndChunk(end);\n\n    const chunks = [];\n    for (let chunk = beginChunk; chunk < endChunk; ++chunk) {\n      chunks.push(chunk);\n    }\n    return this._requestChunks(chunks);\n  }\n\n  requestRanges(ranges = []) {\n    const chunksToRequest = [];\n    for (const range of ranges) {\n      const beginChunk = this.getBeginChunk(range.begin);\n      const endChunk = this.getEndChunk(range.end);\n      for (let chunk = beginChunk; chunk < endChunk; ++chunk) {\n        if (!chunksToRequest.includes(chunk)) {\n          chunksToRequest.push(chunk);\n        }\n      }\n    }\n\n    chunksToRequest.sort((a, b) => a - b);\n    return this._requestChunks(chunksToRequest);\n  }\n\n  /**\n   * Groups a sorted array of chunks into as few contiguous larger\n   * chunks as possible.\n   */\n  groupChunks(chunks) {\n    const groupedChunks = [];\n    let beginChunk = -1;\n    let prevChunk = -1;\n\n    for (let i = 0, ii = chunks.length; i < ii; ++i) {\n      const chunk = chunks[i];\n      if (beginChunk < 0) {\n        beginChunk = chunk;\n      }\n\n      if (prevChunk >= 0 && prevChunk + 1 !== chunk) {\n        groupedChunks.push({ beginChunk, endChunk: prevChunk + 1 });\n        beginChunk = chunk;\n      }\n      if (i + 1 === chunks.length) {\n        groupedChunks.push({ beginChunk, endChunk: chunk + 1 });\n      }\n\n      prevChunk = chunk;\n    }\n    return groupedChunks;\n  }\n\n  onReceiveData(args) {\n    const { chunkSize, length, stream } = this;\n\n    const chunk = args.chunk;\n    const isProgressive = args.begin === undefined;\n    const begin = isProgressive ? stream.progressiveDataLength : args.begin;\n    const end = begin + chunk.byteLength;\n\n    const beginChunk = Math.floor(begin / chunkSize);\n    const endChunk =\n      end < length ? Math.floor(end / chunkSize) : Math.ceil(end / chunkSize);\n\n    if (isProgressive) {\n      stream.onReceiveProgressiveData(chunk);\n    } else {\n      stream.onReceiveData(begin, chunk);\n    }\n\n    if (stream.isDataLoaded) {\n      this.#loadedStreamCapability.resolve(stream);\n    }\n\n    const loadedRequests = [];\n    for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n      // The server might return more chunks than requested.\n      const requestIds = this._requestsByChunk.get(curChunk);\n      if (!requestIds) {\n        continue;\n      }\n      this._requestsByChunk.delete(curChunk);\n\n      for (const requestId of requestIds) {\n        const chunksNeeded = this._chunksNeededByRequest.get(requestId);\n        if (chunksNeeded.has(curChunk)) {\n          chunksNeeded.delete(curChunk);\n        }\n\n        if (chunksNeeded.size > 0) {\n          continue;\n        }\n        loadedRequests.push(requestId);\n      }\n    }\n\n    // If there are no pending requests, automatically fetch the next\n    // unfetched chunk of the PDF file.\n    if (!this.disableAutoFetch && this._requestsByChunk.size === 0) {\n      let nextEmptyChunk;\n      if (stream.numChunksLoaded === 1) {\n        // This is a special optimization so that after fetching the first\n        // chunk, rather than fetching the second chunk, we fetch the last\n        // chunk.\n        const lastChunk = stream.numChunks - 1;\n        if (!stream.hasChunk(lastChunk)) {\n          nextEmptyChunk = lastChunk;\n        }\n      } else {\n        nextEmptyChunk = stream.nextEmptyChunk(endChunk);\n      }\n      if (Number.isInteger(nextEmptyChunk)) {\n        this._requestChunks([nextEmptyChunk]);\n      }\n    }\n\n    for (const requestId of loadedRequests) {\n      const capability = this._promisesByRequest.get(requestId);\n      this._promisesByRequest.delete(requestId);\n      capability.resolve();\n    }\n\n    this.msgHandler.send(\"DocProgress\", {\n      loaded: MathClamp(\n        stream.numChunksLoaded * chunkSize,\n        stream.progressiveDataLength,\n        length\n      ),\n      total: length,\n    });\n  }\n\n  getBeginChunk(begin) {\n    return Math.floor(begin / this.chunkSize);\n  }\n\n  getEndChunk(end) {\n    return Math.floor((end - 1) / this.chunkSize) + 1;\n  }\n\n  abort(reason) {\n    this.#aborted = true;\n    this.pdfStream?.cancelAllRequests(reason);\n\n    for (const capability of this._promisesByRequest.values()) {\n      capability.reject(reason);\n    }\n    this.#loadedStreamCapability.reject(reason);\n  }\n}\n\nexport { ChunkedStream, ChunkedStreamManager };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, ImageKind } from \"./util.js\";\n\nfunction convertToRGBA(params) {\n  switch (params.kind) {\n    case ImageKind.GRAYSCALE_1BPP:\n      return convertBlackAndWhiteToRGBA(params);\n    case ImageKind.RGB_24BPP:\n      return convertRGBToRGBA(params);\n  }\n\n  return null;\n}\n\nfunction convertBlackAndWhiteToRGBA({\n  src,\n  srcPos = 0,\n  dest,\n  width,\n  height,\n  nonBlackColor = 0xffffffff,\n  inverseDecode = false,\n}) {\n  const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n  const [zeroMapping, oneMapping] = inverseDecode\n    ? [nonBlackColor, black]\n    : [black, nonBlackColor];\n  const widthInSource = width >> 3;\n  const widthRemainder = width & 7;\n  const xorMask = zeroMapping ^ oneMapping;\n  const srcLength = src.length;\n  dest = new Uint32Array(dest.buffer);\n  let destPos = 0;\n\n  for (let i = 0; i < height; ++i) {\n    for (\n      const max = srcPos + widthInSource;\n      srcPos < max;\n      ++srcPos, destPos += 8\n    ) {\n      const elem = src[srcPos];\n      dest[destPos] = zeroMapping ^ (-((elem >> 7) & 1) & xorMask);\n      dest[destPos + 1] = zeroMapping ^ (-((elem >> 6) & 1) & xorMask);\n      dest[destPos + 2] = zeroMapping ^ (-((elem >> 5) & 1) & xorMask);\n      dest[destPos + 3] = zeroMapping ^ (-((elem >> 4) & 1) & xorMask);\n      dest[destPos + 4] = zeroMapping ^ (-((elem >> 3) & 1) & xorMask);\n      dest[destPos + 5] = zeroMapping ^ (-((elem >> 2) & 1) & xorMask);\n      dest[destPos + 6] = zeroMapping ^ (-((elem >> 1) & 1) & xorMask);\n      dest[destPos + 7] = zeroMapping ^ (-(elem & 1) & xorMask);\n    }\n    if (widthRemainder === 0) {\n      continue;\n    }\n    const elem = srcPos < srcLength ? src[srcPos++] : 255;\n    for (let j = 0; j < widthRemainder; ++j, ++destPos) {\n      dest[destPos] = zeroMapping ^ (-((elem >> (7 - j)) & 1) & xorMask);\n    }\n  }\n\n  return { srcPos, destPos };\n}\n\nfunction convertRGBToRGBA({\n  src,\n  srcPos = 0,\n  dest,\n  destPos = 0,\n  width,\n  height,\n}) {\n  let i = 0;\n  const len = width * height * 3;\n  const len32 = len >> 2;\n  const src32 = new Uint32Array(src.buffer, srcPos, len32);\n  const alphaMask = FeatureTest.isLittleEndian ? 0xff000000 : 0xff;\n\n  if (FeatureTest.isLittleEndian) {\n    // It's a way faster to do the shuffle manually instead of working\n    // component by component with some Uint8 arrays.\n    for (; i < len32 - 2; i += 3, destPos += 4) {\n      const s1 = src32[i], // R2B1G1R1\n        s2 = src32[i + 1], // G3R3B2G2\n        s3 = src32[i + 2]; // B4G4R4B3\n\n      dest[destPos] = s1 | alphaMask;\n      dest[destPos + 1] = (s1 >>> 24) | (s2 << 8) | alphaMask;\n      dest[destPos + 2] = (s2 >>> 16) | (s3 << 16) | alphaMask;\n      dest[destPos + 3] = (s3 >>> 8) | alphaMask;\n    }\n\n    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n      dest[destPos++] =\n        src[j] | (src[j + 1] << 8) | (src[j + 2] << 16) | alphaMask;\n    }\n  } else {\n    for (; i < len32 - 2; i += 3, destPos += 4) {\n      const s1 = src32[i], // R1G1B1R2\n        s2 = src32[i + 1], // G2B2R3G3\n        s3 = src32[i + 2]; // B3R4G4B4\n\n      dest[destPos] = s1 | alphaMask;\n      dest[destPos + 1] = (s1 << 24) | (s2 >>> 8) | alphaMask;\n      dest[destPos + 2] = (s2 << 16) | (s3 >>> 16) | alphaMask;\n      dest[destPos + 3] = (s3 << 8) | alphaMask;\n    }\n\n    for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n      dest[destPos++] =\n        (src[j] << 24) | (src[j + 1] << 16) | (src[j + 2] << 8) | alphaMask;\n    }\n  }\n\n  return { srcPos: srcPos + len, destPos };\n}\n\nfunction grayToRGBA(src, dest) {\n  if (FeatureTest.isLittleEndian) {\n    for (let i = 0, ii = src.length; i < ii; i++) {\n      dest[i] = (src[i] * 0x10101) | 0xff000000;\n    }\n  } else {\n    for (let i = 0, ii = src.length; i < ii; i++) {\n      dest[i] = (src[i] * 0x1010100) | 0x000000ff;\n    }\n  }\n}\n\nexport {\n  convertBlackAndWhiteToRGBA,\n  convertRGBToRGBA,\n  convertToRGBA,\n  grayToRGBA,\n};\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, ImageKind, shadow, warn } from \"../shared/util.js\";\nimport { convertToRGBA } from \"../shared/image_utils.js\";\nimport { MAX_INT_32 } from \"./core_utils.js\";\n\nconst MIN_IMAGE_DIM = 2048;\n\n// In Chrome, there aren't max dimensions but only a max area. So an image with\n// a very large dimensions is acceptable but it probably doesn't hurt to reduce\n// it when considering that it will finally rendered on a small canvas.\nconst MAX_IMAGE_DIM = 32768;\nconst MAX_ERROR = 128;\n\n// Large images are encoded in using the BMP format (it's a way faster than\n// encoding in PNG because there are no checksums to compute).\n// Unfortunately, createImageBitmap will create a task in the main thread in\n// order to build the bitmap, hence the main thread is blocked during the\n// decoding which can be a bit long (see bug 1817244).\n// When bug 1759728 is fixed we can remove the BMP workaround and at least it\n// should be a way faster to create the bitmap.\n\nclass ImageResizer {\n  static #goodSquareLength = MIN_IMAGE_DIM;\n\n  static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported;\n\n  constructor(imgData, isMask) {\n    this._imgData = imgData;\n    this._isMask = isMask;\n  }\n\n  static get canUseImageDecoder() {\n    return shadow(\n      this,\n      \"canUseImageDecoder\",\n      this.#isImageDecoderSupported\n        ? ImageDecoder.isTypeSupported(\"image/bmp\")\n        : Promise.resolve(false)\n    );\n  }\n\n  static needsToBeResized(width, height) {\n    if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) {\n      return false;\n    }\n\n    const { MAX_DIM } = this;\n    if (width > MAX_DIM || height > MAX_DIM) {\n      return true;\n    }\n\n    const area = width * height;\n    if (this._hasMaxArea) {\n      return area > this.MAX_AREA;\n    }\n\n    if (area < this.#goodSquareLength ** 2) {\n      return false;\n    }\n\n    // We try as much as possible to avoid to compute the max area.\n    if (this._areGoodDims(width, height)) {\n      this.#goodSquareLength = Math.max(\n        this.#goodSquareLength,\n        Math.floor(Math.sqrt(width * height))\n      );\n      return false;\n    }\n\n    // TODO: the computation can be a bit long because we potentially allocate\n    // some large canvas, so in the Firefox case this value (and MAX_DIM) can be\n    // inferred from prefs (MAX_AREA = gfx.max-alloc-size / 4, 4 is because of\n    // RGBA).\n    this.#goodSquareLength = this._guessMax(\n      this.#goodSquareLength,\n      MAX_DIM,\n      MAX_ERROR,\n      0\n    );\n    const maxArea = (this.MAX_AREA = this.#goodSquareLength ** 2);\n\n    return area > maxArea;\n  }\n\n  static getReducePowerForJPX(width, height, componentsCount) {\n    const area = width * height;\n    // The maximum memory we've in the wasm runtime is 2GB.\n    // Each component is 4 bytes and we can't allocate all the memory just for\n    // the buffers so we limit the size to 1GB / (componentsCount * 4).\n    // We could use more than 2GB by setting MAXIMUM_MEMORY but it would take\n    // too much time to decode a big image.\n    const maxJPXArea = 2 ** 30 / (componentsCount * 4);\n    if (!this.needsToBeResized(width, height)) {\n      if (area > maxJPXArea) {\n        // The image is too large, we need to rescale it.\n        return Math.ceil(Math.log2(area / maxJPXArea));\n      }\n      return 0;\n    }\n    const { MAX_DIM, MAX_AREA } = this;\n    const minFactor = Math.max(\n      width / MAX_DIM,\n      height / MAX_DIM,\n      Math.sqrt(area / Math.min(maxJPXArea, MAX_AREA))\n    );\n    return Math.ceil(Math.log2(minFactor));\n  }\n\n  static get MAX_DIM() {\n    return shadow(\n      this,\n      \"MAX_DIM\",\n      this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)\n    );\n  }\n\n  static get MAX_AREA() {\n    this._hasMaxArea = true;\n    return shadow(\n      this,\n      \"MAX_AREA\",\n      this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2\n    );\n  }\n\n  static set MAX_AREA(area) {\n    if (area >= 0) {\n      this._hasMaxArea = true;\n      shadow(this, \"MAX_AREA\", area);\n    }\n  }\n\n  static setOptions({\n    canvasMaxAreaInBytes = -1,\n    isImageDecoderSupported = false,\n  }) {\n    if (!this._hasMaxArea) {\n      // Divide by 4 to have the value in pixels.\n      this.MAX_AREA = canvasMaxAreaInBytes >> 2;\n    }\n    this.#isImageDecoderSupported = isImageDecoderSupported;\n  }\n\n  static _areGoodDims(width, height) {\n    try {\n      // This code is working in either Firefox or Chrome.\n      // There is a faster solution using transferToImageBitmap which is faster\n      // in Firefox (when the dimensions are wrong the resulting bitmap has its\n      // dimensions equal to 1) but it doesn't find the correct values in\n      // Chrome.\n      const canvas = new OffscreenCanvas(width, height);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.fillRect(0, 0, 1, 1);\n      const opacity = ctx.getImageData(0, 0, 1, 1).data[3];\n      canvas.width = canvas.height = 1;\n      return opacity !== 0;\n    } catch {\n      return false;\n    }\n  }\n\n  static _guessMax(start, end, tolerance, defaultHeight) {\n    // We don't really need to have exact values.\n    // When we're here then we're in a corner case: we've a very large image.\n    // So we could potentially downscale an image which fits in the canvas,\n    // it's maybe a pity in term of perfs but we'll reduce the memory use.\n    // The tolerance is the acceptable error we can make on the limit we want.\n    // On Chrome, when the tolerance 0 then it can take ~5s to compute the max\n    // area... and having a tolerance of 128 divides the time by 2.\n    while (start + tolerance + 1 < end) {\n      const middle = Math.floor((start + end) / 2);\n      const height = defaultHeight || middle;\n      if (this._areGoodDims(middle, height)) {\n        start = middle;\n      } else {\n        end = middle;\n      }\n    }\n    return start;\n  }\n\n  static async createImage(imgData, isMask = false) {\n    return new ImageResizer(imgData, isMask)._createImage();\n  }\n\n  async _createImage() {\n    const { _imgData: imgData } = this;\n    const { width, height } = imgData;\n\n    if (width * height * 4 > MAX_INT_32) {\n      // The resulting RGBA image is too large.\n      // We just rescale the data.\n      const result = this.#rescaleImageData();\n      if (result) {\n        return result;\n      }\n    }\n\n    const data = this._encodeBMP();\n    let decoder, imagePromise;\n\n    if (await ImageResizer.canUseImageDecoder) {\n      decoder = new ImageDecoder({\n        data,\n        type: \"image/bmp\",\n        preferAnimation: false,\n        transfer: [data.buffer],\n      });\n      imagePromise = decoder\n        .decode()\n        .catch(reason => {\n          warn(`BMP image decoding failed: ${reason}`);\n          // It's a bit unfortunate to create the BMP twice but we shouldn't be\n          // here in the first place.\n          return createImageBitmap(\n            new Blob([this._encodeBMP().buffer], {\n              type: \"image/bmp\",\n            })\n          );\n        })\n        .finally(() => {\n          decoder.close();\n        });\n    } else {\n      imagePromise = createImageBitmap(\n        new Blob([data.buffer], {\n          type: \"image/bmp\",\n        })\n      );\n    }\n\n    const { MAX_AREA, MAX_DIM } = ImageResizer;\n    const minFactor = Math.max(\n      width / MAX_DIM,\n      height / MAX_DIM,\n      Math.sqrt((width * height) / MAX_AREA)\n    );\n\n    const firstFactor = Math.max(minFactor, 2);\n\n    // Add 1 to the ratio and round it with 1 digit.\n    // We add 1.25 in order to have a final image under the limits\n    // (and not just at the limits) to reduce memory use.\n    const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor;\n\n    const N = Math.floor(Math.log2(factor));\n    const steps = new Array(N + 2).fill(2);\n    steps[0] = firstFactor;\n    steps.splice(-1, 1, factor / (1 << N));\n\n    let newWidth = width;\n    let newHeight = height;\n    const result = await imagePromise;\n    let bitmap = result.image || result;\n\n    for (const step of steps) {\n      const prevWidth = newWidth;\n      const prevHeight = newHeight;\n\n      newWidth = Math.floor(newWidth / step);\n      newHeight = Math.floor(newHeight / step);\n\n      const canvas = new OffscreenCanvas(newWidth, newHeight);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.drawImage(\n        bitmap,\n        0,\n        0,\n        prevWidth,\n        prevHeight,\n        0,\n        0,\n        newWidth,\n        newHeight\n      );\n\n      // Release the resources associated with the bitmap.\n      bitmap.close();\n      bitmap = canvas.transferToImageBitmap();\n    }\n\n    imgData.data = null;\n    imgData.bitmap = bitmap;\n    imgData.width = newWidth;\n    imgData.height = newHeight;\n\n    return imgData;\n  }\n\n  #rescaleImageData() {\n    const { _imgData: imgData } = this;\n    const { data, width, height, kind } = imgData;\n    const rgbaSize = width * height * 4;\n    // K is such as width * height * 4 / 2 ** K <= 2 ** 31 - 1\n    const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32));\n    const newWidth = width >> K;\n    const newHeight = height >> K;\n    let rgbaData;\n    let maxHeight = height;\n\n    // We try to allocate the buffer with the maximum size but it can fail.\n    try {\n      rgbaData = new Uint8Array(rgbaSize);\n    } catch {\n      // n is such as 2 ** n - 1 > width * height * 4\n      let n = Math.floor(Math.log2(rgbaSize + 1));\n\n      while (true) {\n        try {\n          rgbaData = new Uint8Array(2 ** n - 1);\n          break;\n        } catch {\n          n -= 1;\n        }\n      }\n\n      maxHeight = Math.floor((2 ** n - 1) / (width * 4));\n      const newSize = width * maxHeight * 4;\n      if (newSize < rgbaData.length) {\n        rgbaData = new Uint8Array(newSize);\n      }\n    }\n\n    const src32 = new Uint32Array(rgbaData.buffer);\n    const dest32 = new Uint32Array(newWidth * newHeight);\n\n    let srcPos = 0;\n    let newIndex = 0;\n    const step = Math.ceil(height / maxHeight);\n    const remainder = height % maxHeight === 0 ? height : height % maxHeight;\n    for (let k = 0; k < step; k++) {\n      const h = k < step - 1 ? maxHeight : remainder;\n      ({ srcPos } = convertToRGBA({\n        kind,\n        src: data,\n        dest: src32,\n        width,\n        height: h,\n        inverseDecode: this._isMask,\n        srcPos,\n      }));\n\n      for (let i = 0, ii = h >> K; i < ii; i++) {\n        const buf = src32.subarray((i << K) * width);\n        for (let j = 0; j < newWidth; j++) {\n          dest32[newIndex++] = buf[j << K];\n        }\n      }\n    }\n\n    if (ImageResizer.needsToBeResized(newWidth, newHeight)) {\n      imgData.data = dest32;\n      imgData.width = newWidth;\n      imgData.height = newHeight;\n      imgData.kind = ImageKind.RGBA_32BPP;\n\n      return null;\n    }\n\n    const canvas = new OffscreenCanvas(newWidth, newHeight);\n    const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n    ctx.putImageData(\n      new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight),\n      0,\n      0\n    );\n    imgData.data = null;\n    imgData.bitmap = canvas.transferToImageBitmap();\n    imgData.width = newWidth;\n    imgData.height = newHeight;\n\n    return imgData;\n  }\n\n  _encodeBMP() {\n    const { width, height, kind } = this._imgData;\n    let data = this._imgData.data;\n    let bitPerPixel;\n    let colorTable = new Uint8Array(0);\n    let maskTable = colorTable;\n    let compression = 0;\n\n    // Each row of the image must be padded in order to have a final size which\n    // is a multiple of 4.\n\n    switch (kind) {\n      case ImageKind.GRAYSCALE_1BPP: {\n        bitPerPixel = 1;\n        colorTable = new Uint8Array(\n          this._isMask\n            ? [255, 255, 255, 255, 0, 0, 0, 0]\n            : [0, 0, 0, 0, 255, 255, 255, 255]\n        );\n        const rowLen = (width + 7) >> 3;\n        const rowSize = (rowLen + 3) & -4;\n        if (rowLen !== rowSize) {\n          const newData = new Uint8Array(rowSize * height);\n          let k = 0;\n          for (\n            let i = 0, ii = height * rowLen;\n            i < ii;\n            i += rowLen, k += rowSize\n          ) {\n            newData.set(data.subarray(i, i + rowLen), k);\n          }\n          data = newData;\n        }\n        break;\n      }\n      case ImageKind.RGB_24BPP: {\n        bitPerPixel = 24;\n        if (width & 3) {\n          const rowLen = 3 * width;\n          const rowSize = (rowLen + 3) & -4;\n          const extraLen = rowSize - rowLen;\n          const newData = new Uint8Array(rowSize * height);\n          let k = 0;\n          for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) {\n            const row = data.subarray(i, i + rowLen);\n            for (let j = 0; j < rowLen; j += 3) {\n              newData[k++] = row[j + 2];\n              newData[k++] = row[j + 1];\n              newData[k++] = row[j];\n            }\n            k += extraLen;\n          }\n          data = newData;\n        } else {\n          for (let i = 0, ii = data.length; i < ii; i += 3) {\n            // Just swap R and B.\n            const tmp = data[i];\n            data[i] = data[i + 2];\n            data[i + 2] = tmp;\n          }\n        }\n        break;\n      }\n      case ImageKind.RGBA_32BPP:\n        bitPerPixel = 32;\n        compression = 3;\n        maskTable = new Uint8Array(\n          4 /* R mask */ +\n            4 /* G mask */ +\n            4 /* B mask */ +\n            4 /* A mask */ +\n            52 /* Windows color space stuff */\n        );\n        const view = new DataView(maskTable.buffer);\n        if (FeatureTest.isLittleEndian) {\n          view.setUint32(0, 0x000000ff, true);\n          view.setUint32(4, 0x0000ff00, true);\n          view.setUint32(8, 0x00ff0000, true);\n          view.setUint32(12, 0xff000000, true);\n        } else {\n          view.setUint32(0, 0xff000000, true);\n          view.setUint32(4, 0x00ff0000, true);\n          view.setUint32(8, 0x0000ff00, true);\n          view.setUint32(12, 0x000000ff, true);\n        }\n        break;\n      default:\n        throw new Error(\"invalid format\");\n    }\n\n    let i = 0;\n    const headerLength = 40 + maskTable.length;\n    const fileLength = 14 + headerLength + colorTable.length + data.length;\n    const bmpData = new Uint8Array(fileLength);\n    const view = new DataView(bmpData.buffer);\n\n    // Signature.\n    view.setUint16(i, 0x4d42, true);\n    i += 2;\n\n    // File size.\n    view.setUint32(i, fileLength, true);\n    i += 4;\n\n    // Reserved.\n    view.setUint32(i, 0, true);\n    i += 4;\n\n    // Data offset.\n    view.setUint32(i, 14 + headerLength + colorTable.length, true);\n    i += 4;\n\n    // Header size.\n    view.setUint32(i, headerLength, true);\n    i += 4;\n\n    // Width.\n    view.setInt32(i, width, true);\n    i += 4;\n\n    // Height.\n    // Negative height indicates that the image is stored from top to bottom.\n    view.setInt32(i, -height, true);\n    i += 4;\n\n    // Number of planes (must be 1).\n    view.setUint16(i, 1, true);\n    i += 2;\n\n    // Number of bit per pixel.\n    view.setUint16(i, bitPerPixel, true);\n    i += 2;\n\n    // Compression method.\n    view.setUint32(i, compression, true);\n    i += 4;\n\n    // The image size.\n    view.setUint32(i, 0, true);\n    i += 4;\n\n    // Horizontal resolution.\n    view.setInt32(i, 0, true);\n    i += 4;\n\n    // Vertical resolution.\n    view.setInt32(i, 0, true);\n    i += 4;\n\n    // Number of colors in the palette (0 to default).\n    view.setUint32(i, colorTable.length / 4, true);\n    i += 4;\n\n    // Number of important colors used (0 to default).\n    view.setUint32(i, 0, true);\n    i += 4;\n\n    bmpData.set(maskTable, i);\n    i += maskTable.length;\n\n    bmpData.set(colorTable, i);\n    i += colorTable.length;\n\n    bmpData.set(data, i);\n\n    return bmpData;\n  }\n}\n\nexport { ImageResizer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseStream } from \"./base_stream.js\";\nimport { Stream } from \"./stream.js\";\nimport { unreachable } from \"../shared/util.js\";\n\n// Lots of DecodeStreams are created whose buffers are never used.  For these\n// we share a single empty buffer. This is (a) space-efficient and (b) avoids\n// having special cases that would be required if we used |null| for an empty\n// buffer.\nconst emptyBuffer = new Uint8Array(0);\n\n// Super class for the decoding streams.\nclass DecodeStream extends BaseStream {\n  buffer = emptyBuffer;\n\n  bufferLength = 0;\n\n  eof = false;\n\n  minBufferLength = 512;\n\n  pos = 0;\n\n  constructor(maybeMinBufferLength) {\n    super();\n    this._rawMinBufferLength = maybeMinBufferLength || 0;\n\n    if (maybeMinBufferLength) {\n      // Compute the first power of two that is as big as maybeMinBufferLength.\n      while (this.minBufferLength < maybeMinBufferLength) {\n        this.minBufferLength *= 2;\n      }\n    }\n  }\n\n  readBlock() {\n    unreachable(\"Abstract method `readBlock` called\");\n  }\n\n  get isEmpty() {\n    while (!this.eof && this.bufferLength === 0) {\n      this.readBlock();\n    }\n    return this.bufferLength === 0;\n  }\n\n  ensureBuffer(requested) {\n    const buffer = this.buffer;\n    if (requested <= buffer.byteLength) {\n      return buffer;\n    }\n    let size = this.minBufferLength;\n    while (size < requested) {\n      size *= 2;\n    }\n    const buffer2 = new Uint8Array(size);\n    buffer2.set(buffer);\n    return (this.buffer = buffer2);\n  }\n\n  getByte() {\n    const pos = this.pos;\n    while (this.bufferLength <= pos) {\n      if (this.eof) {\n        return -1;\n      }\n      this.readBlock();\n    }\n    return this.buffer[this.pos++];\n  }\n\n  getBytes(length, decoderOptions = null) {\n    const pos = this.pos;\n    let end;\n\n    if (length) {\n      this.ensureBuffer(pos + length);\n      end = pos + length;\n\n      while (!this.eof && this.bufferLength < end) {\n        this.readBlock(decoderOptions);\n      }\n      const bufEnd = this.bufferLength;\n      if (end > bufEnd) {\n        end = bufEnd;\n      }\n    } else {\n      while (!this.eof) {\n        this.readBlock(decoderOptions);\n      }\n      end = this.bufferLength;\n    }\n\n    this.pos = end;\n    return this.buffer.subarray(pos, end);\n  }\n\n  async getImageData(length, decoderOptions) {\n    if (!this.canAsyncDecodeImageFromBuffer) {\n      if (this.isAsyncDecoder) {\n        return this.decodeImage(null, length, decoderOptions);\n      }\n      return this.getBytes(length, decoderOptions);\n    }\n    const data = await this.stream.asyncGetBytes();\n    return this.decodeImage(data, length, decoderOptions);\n  }\n\n  async asyncGetBytesFromDecompressionStream(name) {\n    this.stream.reset();\n    const bytes = this.stream.isAsync\n      ? await this.stream.asyncGetBytes()\n      : this.stream.getBytes();\n\n    try {\n      const { readable, writable } = new DecompressionStream(name);\n      const writer = writable.getWriter();\n      await writer.ready;\n\n      // We can't await writer.write() because it'll block until the reader\n      // starts which happens few lines below.\n      writer\n        .write(bytes)\n        .then(async () => {\n          await writer.ready;\n          await writer.close();\n        })\n        .catch(() => {});\n\n      const chunks = [];\n      let totalLength = 0;\n\n      for await (const chunk of readable) {\n        chunks.push(chunk);\n        totalLength += chunk.byteLength;\n      }\n      const data = new Uint8Array(totalLength);\n      let offset = 0;\n      for (const chunk of chunks) {\n        data.set(chunk, offset);\n        offset += chunk.byteLength;\n      }\n      return { decompressed: data, compressed: bytes };\n    } catch {\n      return { decompressed: null, compressed: bytes };\n    }\n  }\n\n  reset() {\n    this.pos = 0;\n  }\n\n  makeSubStream(start, length, dict = null) {\n    if (length === undefined) {\n      while (!this.eof) {\n        this.readBlock();\n      }\n    } else {\n      const end = start + length;\n      while (this.bufferLength <= end && !this.eof) {\n        this.readBlock();\n      }\n    }\n    return new Stream(this.buffer, start, length, dict);\n  }\n\n  clone() {\n    // Make sure it has been fully read.\n    while (!this.eof) {\n      this.readBlock();\n    }\n    return new Stream(this.buffer, 0, this.bufferLength, this.dict?.clone());\n  }\n\n  getBaseStreams() {\n    return this.stream ? this.stream.getBaseStreams() : null;\n  }\n}\n\nclass StreamsSequenceStream extends DecodeStream {\n  constructor(streams, onError = null) {\n    streams = streams.filter(s => s instanceof BaseStream && !s.isImageStream);\n\n    let maybeLength = 0;\n    for (const stream of streams) {\n      maybeLength +=\n        stream instanceof DecodeStream\n          ? stream._rawMinBufferLength\n          : stream.length;\n    }\n    super(maybeLength);\n\n    this.streams = streams;\n    this._onError = onError;\n  }\n\n  readBlock() {\n    const streams = this.streams;\n    if (streams.length === 0) {\n      this.eof = true;\n      return;\n    }\n    const stream = streams.shift();\n    let chunk;\n    try {\n      chunk = stream.getBytes();\n    } catch (reason) {\n      if (this._onError) {\n        this._onError(reason, stream.dict?.objId);\n        return;\n      }\n      throw reason;\n    }\n    const bufferLength = this.bufferLength;\n    const newLength = bufferLength + chunk.length;\n    const buffer = this.ensureBuffer(newLength);\n    buffer.set(chunk, bufferLength);\n    this.bufferLength = newLength;\n  }\n\n  getBaseStreams() {\n    const baseStreamsBuf = [];\n    for (const stream of this.streams) {\n      const baseStreams = stream.getBaseStreams();\n      if (baseStreams) {\n        baseStreamsBuf.push(...baseStreams);\n      }\n    }\n    return baseStreamsBuf.length > 0 ? baseStreamsBuf : null;\n  }\n}\n\nexport { DecodeStream, StreamsSequenceStream };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AlternateCS,\n  CalGrayCS,\n  CalRGBCS,\n  DeviceCmykCS,\n  DeviceGrayCS,\n  DeviceRgbaCS,\n  DeviceRgbCS,\n  IndexedCS,\n  LabCS,\n  PatternCS,\n} from \"./colorspace.js\";\nimport { CmykICCBasedCS, IccColorSpace } from \"./icc_colorspace.js\";\nimport { Dict, Name, Ref } from \"./primitives.js\";\nimport { shadow, unreachable, warn } from \"../shared/util.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\nimport { MissingDataException } from \"./core_utils.js\";\n\nclass ColorSpaceUtils {\n  static parse({\n    cs,\n    xref,\n    resources = null,\n    pdfFunctionFactory,\n    globalColorSpaceCache,\n    localColorSpaceCache,\n    asyncIfNotCached = false,\n  }) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      (!globalColorSpaceCache || !localColorSpaceCache)\n    ) {\n      unreachable(\n        'ColorSpaceUtils.parse - expected \"globalColorSpaceCache\"/\"localColorSpaceCache\" argument.'\n      );\n    }\n    const options = {\n      xref,\n      resources,\n      pdfFunctionFactory,\n      globalColorSpaceCache,\n      localColorSpaceCache,\n    };\n    let csName, csRef, parsedCS;\n\n    // Check if the ColorSpace is cached first, to avoid re-parsing it.\n    if (cs instanceof Ref) {\n      csRef = cs;\n\n      const cachedCS =\n        globalColorSpaceCache.getByRef(csRef) ||\n        localColorSpaceCache.getByRef(csRef);\n      if (cachedCS) {\n        return cachedCS;\n      }\n      cs = xref.fetch(cs);\n    }\n    if (cs instanceof Name) {\n      csName = cs.name;\n\n      const cachedCS = localColorSpaceCache.getByName(csName);\n      if (cachedCS) {\n        return cachedCS;\n      }\n    }\n\n    try {\n      parsedCS = this.#parse(cs, options);\n    } catch (ex) {\n      if (asyncIfNotCached && !(ex instanceof MissingDataException)) {\n        return Promise.reject(ex);\n      }\n      throw ex;\n    }\n\n    // Attempt to cache the parsed ColorSpace, by name and/or reference.\n    if (csName || csRef) {\n      localColorSpaceCache.set(csName, csRef, parsedCS);\n\n      if (csRef) {\n        globalColorSpaceCache.set(/* name = */ null, csRef, parsedCS);\n      }\n    }\n    return asyncIfNotCached ? Promise.resolve(parsedCS) : parsedCS;\n  }\n\n  /**\n   * NOTE: This method should *only* be invoked from `this.#parse`,\n   *       when parsing \"sub\" ColorSpaces.\n   */\n  static #subParse(cs, options) {\n    const { globalColorSpaceCache } = options;\n    let csRef;\n\n    // Check if the ColorSpace is cached first, to avoid re-parsing it.\n    if (cs instanceof Ref) {\n      csRef = cs;\n\n      const cachedCS = globalColorSpaceCache.getByRef(csRef);\n      if (cachedCS) {\n        return cachedCS;\n      }\n    }\n    const parsedCS = this.#parse(cs, options);\n\n    // Only cache the parsed ColorSpace globally, by reference.\n    if (csRef) {\n      globalColorSpaceCache.set(/* name = */ null, csRef, parsedCS);\n    }\n    return parsedCS;\n  }\n\n  static #parse(cs, options) {\n    const { xref, resources, pdfFunctionFactory, globalColorSpaceCache } =\n      options;\n\n    cs = xref.fetchIfRef(cs);\n    if (cs instanceof Name) {\n      switch (cs.name) {\n        case \"G\":\n        case \"DeviceGray\":\n          return this.gray;\n        case \"RGB\":\n        case \"DeviceRGB\":\n          return this.rgb;\n        case \"DeviceRGBA\":\n          return this.rgba;\n        case \"CMYK\":\n        case \"DeviceCMYK\":\n          return this.cmyk;\n        case \"Pattern\":\n          return new PatternCS(/* baseCS = */ null);\n        default:\n          if (resources instanceof Dict) {\n            const colorSpaces = resources.get(\"ColorSpace\");\n            if (colorSpaces instanceof Dict) {\n              const resourcesCS = colorSpaces.get(cs.name);\n              if (resourcesCS) {\n                if (resourcesCS instanceof Name) {\n                  return this.#parse(resourcesCS, options);\n                }\n                cs = resourcesCS;\n                break;\n              }\n            }\n          }\n          // Fallback to the default gray color space.\n          warn(`Unrecognized ColorSpace: ${cs.name}`);\n          return this.gray;\n      }\n    }\n    if (Array.isArray(cs)) {\n      const mode = xref.fetchIfRef(cs[0]).name;\n      let params, numComps, baseCS, whitePoint, blackPoint, gamma;\n\n      switch (mode) {\n        case \"G\":\n        case \"DeviceGray\":\n          return this.gray;\n        case \"RGB\":\n        case \"DeviceRGB\":\n          return this.rgb;\n        case \"CMYK\":\n        case \"DeviceCMYK\":\n          return this.cmyk;\n        case \"CalGray\":\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray(\"WhitePoint\");\n          blackPoint = params.getArray(\"BlackPoint\");\n          gamma = params.get(\"Gamma\");\n          return new CalGrayCS(whitePoint, blackPoint, gamma);\n        case \"CalRGB\":\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray(\"WhitePoint\");\n          blackPoint = params.getArray(\"BlackPoint\");\n          gamma = params.getArray(\"Gamma\");\n          const matrix = params.getArray(\"Matrix\");\n          return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);\n        case \"ICCBased\":\n          const isRef = cs[1] instanceof Ref;\n          if (isRef) {\n            const cachedCS = globalColorSpaceCache.getByRef(cs[1]);\n            if (cachedCS) {\n              return cachedCS;\n            }\n          }\n\n          const stream = xref.fetchIfRef(cs[1]);\n          const dict = stream.dict;\n          numComps = dict.get(\"N\");\n\n          if (IccColorSpace.isUsable) {\n            try {\n              const iccCS = new IccColorSpace(\n                stream.getBytes(),\n                \"ICCBased\",\n                numComps\n              );\n              if (isRef) {\n                globalColorSpaceCache.set(/* name = */ null, cs[1], iccCS);\n              }\n              return iccCS;\n            } catch (ex) {\n              if (ex instanceof MissingDataException) {\n                throw ex;\n              }\n              warn(`ICCBased color space (${cs[1]}): \"${ex}\".`);\n            }\n          }\n\n          const altRaw = dict.getRaw(\"Alternate\");\n          if (altRaw) {\n            const altCS = this.#subParse(altRaw, options);\n            // Ensure that the number of components are correct,\n            // and also (indirectly) that it is not a PatternCS.\n            if (altCS.numComps === numComps) {\n              return altCS;\n            }\n            warn(\"ICCBased color space: Ignoring incorrect /Alternate entry.\");\n          }\n          if (numComps === 1) {\n            return this.gray;\n          } else if (numComps === 3) {\n            return this.rgb;\n          } else if (numComps === 4) {\n            return this.cmyk;\n          }\n          break;\n        case \"Pattern\":\n          baseCS = cs[1] || null;\n          if (baseCS) {\n            baseCS = this.#subParse(baseCS, options);\n          }\n          return new PatternCS(baseCS);\n        case \"I\":\n        case \"Indexed\":\n          baseCS = this.#subParse(cs[1], options);\n          const hiVal = MathClamp(xref.fetchIfRef(cs[2]), 0, 255);\n          const lookup = xref.fetchIfRef(cs[3]);\n          return new IndexedCS(baseCS, hiVal, lookup);\n        case \"Separation\":\n        case \"DeviceN\":\n          const name = xref.fetchIfRef(cs[1]);\n          numComps = Array.isArray(name) ? name.length : 1;\n          baseCS = this.#subParse(cs[2], options);\n          const tintFn = pdfFunctionFactory.create(cs[3]);\n          return new AlternateCS(numComps, baseCS, tintFn);\n        case \"Lab\":\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray(\"WhitePoint\");\n          blackPoint = params.getArray(\"BlackPoint\");\n          const range = params.getArray(\"Range\");\n          return new LabCS(whitePoint, blackPoint, range);\n        default:\n          // Fallback to the default gray color space.\n          warn(`Unimplemented ColorSpace object: ${mode}`);\n          return this.gray;\n      }\n    }\n    // Fallback to the default gray color space.\n    warn(`Unrecognized ColorSpace object: ${cs}`);\n    return this.gray;\n  }\n\n  static get gray() {\n    return shadow(this, \"gray\", new DeviceGrayCS());\n  }\n\n  static get rgb() {\n    return shadow(this, \"rgb\", new DeviceRgbCS());\n  }\n\n  static get rgba() {\n    return shadow(this, \"rgba\", new DeviceRgbaCS());\n  }\n\n  static get cmyk() {\n    if (CmykICCBasedCS.isUsable) {\n      try {\n        return shadow(this, \"cmyk\", new CmykICCBasedCS());\n      } catch {\n        warn(\"CMYK fallback: DeviceCMYK\");\n      }\n    }\n    return shadow(this, \"cmyk\", new DeviceCmykCS());\n  }\n}\n\nexport { ColorSpaceUtils };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseException, warn } from \"../shared/util.js\";\nimport { ColorSpaceUtils } from \"./colorspace_utils.js\";\nimport { DeviceCmykCS } from \"./colorspace.js\";\nimport { grayToRGBA } from \"../shared/image_utils.js\";\n\nclass JpegError extends BaseException {\n  constructor(msg) {\n    super(msg, \"JpegError\");\n  }\n}\n\nclass DNLMarkerError extends BaseException {\n  constructor(message, scanLines) {\n    super(message, \"DNLMarkerError\");\n    this.scanLines = scanLines;\n  }\n}\n\nclass EOIMarkerError extends BaseException {\n  constructor(msg) {\n    super(msg, \"EOIMarkerError\");\n  }\n}\n\n/**\n * This code was forked from https://github.com/notmasteryet/jpgjs.\n * The original version was created by GitHub user notmasteryet.\n *\n * - The JPEG specification can be found in the ITU CCITT Recommendation T.81\n *   (www.w3.org/Graphics/JPEG/itu-t81.pdf)\n * - The JFIF specification can be found in the JPEG File Interchange Format\n *   (www.w3.org/Graphics/JPEG/jfif3.pdf)\n * - The Adobe Application-Specific JPEG markers in the\n *   Supporting the DCT Filters in PostScript Level 2, Technical Note #5116\n *   (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)\n */\n\n// prettier-ignore\nconst dctZigZag = new Uint8Array([\n   0,\n   1,  8,\n  16,  9,  2,\n   3, 10, 17, 24,\n  32, 25, 18, 11, 4,\n   5, 12, 19, 26, 33, 40,\n  48, 41, 34, 27, 20, 13,  6,\n   7, 14, 21, 28, 35, 42, 49, 56,\n  57, 50, 43, 36, 29, 22, 15,\n  23, 30, 37, 44, 51, 58,\n  59, 52, 45, 38, 31,\n  39, 46, 53, 60,\n  61, 54, 47,\n  55, 62,\n  63\n]);\n\nconst dctCos1 = 4017; // cos(pi/16)\nconst dctSin1 = 799; // sin(pi/16)\nconst dctCos3 = 3406; // cos(3*pi/16)\nconst dctSin3 = 2276; // sin(3*pi/16)\nconst dctCos6 = 1567; // cos(6*pi/16)\nconst dctSin6 = 3784; // sin(6*pi/16)\nconst dctSqrt2 = 5793; // sqrt(2)\nconst dctSqrt1d2 = 2896; // sqrt(2) / 2\n\nfunction buildHuffmanTable(codeLengths, values) {\n  let k = 0,\n    i,\n    j,\n    length = 16;\n  while (length > 0 && !codeLengths[length - 1]) {\n    length--;\n  }\n  const code = [{ children: [], index: 0 }];\n  let p = code[0],\n    q;\n  for (i = 0; i < length; i++) {\n    for (j = 0; j < codeLengths[i]; j++) {\n      p = code.pop();\n      p.children[p.index] = values[k];\n      while (p.index > 0) {\n        p = code.pop();\n      }\n      p.index++;\n      code.push(p);\n      while (code.length <= i) {\n        code.push((q = { children: [], index: 0 }));\n        p.children[p.index] = q.children;\n        p = q;\n      }\n      k++;\n    }\n    if (i + 1 < length) {\n      // p here points to last code\n      code.push((q = { children: [], index: 0 }));\n      p.children[p.index] = q.children;\n      p = q;\n    }\n  }\n  return code[0].children;\n}\n\nfunction getBlockBufferOffset(component, row, col) {\n  return 64 * ((component.blocksPerLine + 1) * row + col);\n}\n\nfunction decodeScan(\n  data,\n  view,\n  offset,\n  frame,\n  components,\n  resetInterval,\n  spectralStart,\n  spectralEnd,\n  successivePrev,\n  successive,\n  parseDNLMarker = false\n) {\n  const mcusPerLine = frame.mcusPerLine;\n  const progressive = frame.progressive;\n\n  const startOffset = offset;\n  let bitsData = 0,\n    bitsCount = 0;\n\n  function readBit() {\n    if (bitsCount > 0) {\n      bitsCount--;\n      return (bitsData >> bitsCount) & 1;\n    }\n    bitsData = data[offset++];\n    if (bitsData === 0xff) {\n      const nextByte = data[offset++];\n      if (nextByte) {\n        if (nextByte === /* DNL = */ 0xdc && parseDNLMarker) {\n          offset += 2; // Skip marker length.\n\n          const scanLines = view.getUint16(offset);\n          offset += 2;\n          if (scanLines > 0 && scanLines !== frame.scanLines) {\n            throw new DNLMarkerError(\n              \"Found DNL marker (0xFFDC) while parsing scan data\",\n              scanLines\n            );\n          }\n        } else if (nextByte === /* EOI = */ 0xd9) {\n          if (parseDNLMarker) {\n            // NOTE: only 8-bit JPEG images are supported in this decoder.\n            const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0);\n            // Heuristic to attempt to handle corrupt JPEG images with too\n            // large `scanLines` parameter, by falling back to the currently\n            // parsed number of scanLines when it's at least (approximately)\n            // one \"half\" order of magnitude smaller than expected (fixes\n            // issue10880.pdf, issue10989.pdf, issue15492.pdf).\n            if (\n              maybeScanLines > 0 &&\n              Math.round(frame.scanLines / maybeScanLines) >= 5\n            ) {\n              throw new DNLMarkerError(\n                \"Found EOI marker (0xFFD9) while parsing scan data, \" +\n                  \"possibly caused by incorrect `scanLines` parameter\",\n                maybeScanLines\n              );\n            }\n          }\n          throw new EOIMarkerError(\n            \"Found EOI marker (0xFFD9) while parsing scan data\"\n          );\n        }\n        throw new JpegError(\n          `unexpected marker ${((bitsData << 8) | nextByte).toString(16)}`\n        );\n      }\n      // unstuff 0\n    }\n    bitsCount = 7;\n    return bitsData >>> 7;\n  }\n\n  function decodeHuffman(tree) {\n    let node = tree;\n    while (true) {\n      node = node[readBit()];\n      switch (typeof node) {\n        case \"number\":\n          return node;\n        case \"object\":\n          continue;\n      }\n      throw new JpegError(\"invalid huffman sequence\");\n    }\n  }\n\n  function receive(length) {\n    let n = 0;\n    while (length > 0) {\n      n = (n << 1) | readBit();\n      length--;\n    }\n    return n;\n  }\n\n  function receiveAndExtend(length) {\n    if (length === 1) {\n      return readBit() === 1 ? 1 : -1;\n    }\n    const n = receive(length);\n    if (n >= 1 << (length - 1)) {\n      return n;\n    }\n    return n + (-1 << length) + 1;\n  }\n\n  function decodeBaseline(component, blockOffset) {\n    const t = decodeHuffman(component.huffmanTableDC);\n    const diff = t === 0 ? 0 : receiveAndExtend(t);\n    component.blockData[blockOffset] = component.pred += diff;\n    let k = 1;\n    while (k < 64) {\n      const rs = decodeHuffman(component.huffmanTableAC);\n      const s = rs & 15,\n        r = rs >> 4;\n      if (s === 0) {\n        if (r < 15) {\n          break;\n        }\n        k += 16;\n        continue;\n      }\n      k += r;\n      const z = dctZigZag[k];\n      component.blockData[blockOffset + z] = receiveAndExtend(s);\n      k++;\n    }\n  }\n\n  function decodeDCFirst(component, blockOffset) {\n    const t = decodeHuffman(component.huffmanTableDC);\n    const diff = t === 0 ? 0 : receiveAndExtend(t) << successive;\n    component.blockData[blockOffset] = component.pred += diff;\n  }\n\n  function decodeDCSuccessive(component, blockOffset) {\n    component.blockData[blockOffset] |= readBit() << successive;\n  }\n\n  let eobrun = 0;\n  function decodeACFirst(component, blockOffset) {\n    if (eobrun > 0) {\n      eobrun--;\n      return;\n    }\n    let k = spectralStart;\n    const e = spectralEnd;\n    while (k <= e) {\n      const rs = decodeHuffman(component.huffmanTableAC);\n      const s = rs & 15,\n        r = rs >> 4;\n      if (s === 0) {\n        if (r < 15) {\n          eobrun = receive(r) + (1 << r) - 1;\n          break;\n        }\n        k += 16;\n        continue;\n      }\n      k += r;\n      const z = dctZigZag[k];\n      component.blockData[blockOffset + z] =\n        receiveAndExtend(s) * (1 << successive);\n      k++;\n    }\n  }\n\n  let successiveACState = 0,\n    successiveACNextValue;\n  function decodeACSuccessive(component, blockOffset) {\n    let k = spectralStart;\n    const e = spectralEnd;\n    let r = 0;\n    let s;\n    let rs;\n    while (k <= e) {\n      const offsetZ = blockOffset + dctZigZag[k];\n      const sign = component.blockData[offsetZ] < 0 ? -1 : 1;\n      switch (successiveACState) {\n        case 0: // initial state\n          rs = decodeHuffman(component.huffmanTableAC);\n          s = rs & 15;\n          r = rs >> 4;\n          if (s === 0) {\n            if (r < 15) {\n              eobrun = receive(r) + (1 << r);\n              successiveACState = 4;\n            } else {\n              r = 16;\n              successiveACState = 1;\n            }\n          } else {\n            if (s !== 1) {\n              throw new JpegError(\"invalid ACn encoding\");\n            }\n            successiveACNextValue = receiveAndExtend(s);\n            successiveACState = r ? 2 : 3;\n          }\n          continue;\n        case 1: // skipping r zero items\n        case 2:\n          if (component.blockData[offsetZ]) {\n            component.blockData[offsetZ] += sign * (readBit() << successive);\n          } else {\n            r--;\n            if (r === 0) {\n              successiveACState = successiveACState === 2 ? 3 : 0;\n            }\n          }\n          break;\n        case 3: // set value for a zero item\n          if (component.blockData[offsetZ]) {\n            component.blockData[offsetZ] += sign * (readBit() << successive);\n          } else {\n            component.blockData[offsetZ] = successiveACNextValue << successive;\n            successiveACState = 0;\n          }\n          break;\n        case 4: // eob\n          if (component.blockData[offsetZ]) {\n            component.blockData[offsetZ] += sign * (readBit() << successive);\n          }\n          break;\n      }\n      k++;\n    }\n    if (successiveACState === 4) {\n      eobrun--;\n      if (eobrun === 0) {\n        successiveACState = 0;\n      }\n    }\n  }\n\n  let blockRow = 0;\n  function decodeMcu(component, decode, mcu, row, col) {\n    const mcuRow = (mcu / mcusPerLine) | 0;\n    const mcuCol = mcu % mcusPerLine;\n    blockRow = mcuRow * component.v + row;\n    const blockCol = mcuCol * component.h + col;\n    const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);\n    decode(component, blockOffset);\n  }\n\n  function decodeBlock(component, decode, mcu) {\n    blockRow = (mcu / component.blocksPerLine) | 0;\n    const blockCol = mcu % component.blocksPerLine;\n    const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);\n    decode(component, blockOffset);\n  }\n\n  const componentsLength = components.length;\n  let component, i, j, k, n;\n  let decodeFn;\n  if (progressive) {\n    if (spectralStart === 0) {\n      decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\n    } else {\n      decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\n    }\n  } else {\n    decodeFn = decodeBaseline;\n  }\n\n  let mcu = 0,\n    fileMarker;\n  const mcuExpected =\n    componentsLength === 1\n      ? components[0].blocksPerLine * components[0].blocksPerColumn\n      : mcusPerLine * frame.mcusPerColumn;\n\n  let h, v;\n  while (mcu <= mcuExpected) {\n    // reset interval stuff\n    const mcuToRead = resetInterval\n      ? Math.min(mcuExpected - mcu, resetInterval)\n      : mcuExpected;\n\n    // The `mcuToRead === 0` case should only occur when all of the expected\n    // MCU data has been already parsed, i.e. when `mcu === mcuExpected`, but\n    // some corrupt JPEG images contain more data than intended and we thus\n    // want to skip over any extra RSTx markers below (fixes issue11794.pdf).\n    if (mcuToRead > 0) {\n      for (i = 0; i < componentsLength; i++) {\n        components[i].pred = 0;\n      }\n      eobrun = 0;\n\n      if (componentsLength === 1) {\n        component = components[0];\n        for (n = 0; n < mcuToRead; n++) {\n          decodeBlock(component, decodeFn, mcu);\n          mcu++;\n        }\n      } else {\n        for (n = 0; n < mcuToRead; n++) {\n          for (i = 0; i < componentsLength; i++) {\n            component = components[i];\n            h = component.h;\n            v = component.v;\n            for (j = 0; j < v; j++) {\n              for (k = 0; k < h; k++) {\n                decodeMcu(component, decodeFn, mcu, j, k);\n              }\n            }\n          }\n          mcu++;\n        }\n      }\n    }\n\n    // find marker\n    bitsCount = 0;\n    fileMarker = findNextFileMarker(data, view, offset);\n    if (!fileMarker) {\n      break; // Reached the end of the image data without finding any marker.\n    }\n    if (fileMarker.invalid) {\n      // Some bad images seem to pad Scan blocks with e.g. zero bytes, skip\n      // past those to attempt to find a valid marker (fixes issue4090.pdf).\n      const partialMsg = mcuToRead > 0 ? \"unexpected\" : \"excessive\";\n      warn(\n        `decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`\n      );\n      offset = fileMarker.offset;\n    }\n    if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) {\n      // RSTx\n      offset += 2;\n    } else {\n      break;\n    }\n  }\n\n  return offset - startOffset;\n}\n\n// A port of poppler's IDCT method which in turn is taken from:\n//   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,\n//   'Practical Fast 1-D DCT Algorithms with 11 Multiplications',\n//   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,\n//   988-991.\nfunction quantizeAndInverse(component, blockBufferOffset, p) {\n  const qt = component.quantizationTable,\n    blockData = component.blockData;\n  let v0, v1, v2, v3, v4, v5, v6, v7;\n  let p0, p1, p2, p3, p4, p5, p6, p7;\n  let t;\n\n  if (!qt) {\n    throw new JpegError(\"missing required Quantization Table.\");\n  }\n\n  // inverse DCT on rows\n  for (let row = 0; row < 64; row += 8) {\n    // gather block data\n    p0 = blockData[blockBufferOffset + row];\n    p1 = blockData[blockBufferOffset + row + 1];\n    p2 = blockData[blockBufferOffset + row + 2];\n    p3 = blockData[blockBufferOffset + row + 3];\n    p4 = blockData[blockBufferOffset + row + 4];\n    p5 = blockData[blockBufferOffset + row + 5];\n    p6 = blockData[blockBufferOffset + row + 6];\n    p7 = blockData[blockBufferOffset + row + 7];\n\n    // dequant p0\n    p0 *= qt[row];\n\n    // check for all-zero AC coefficients\n    if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n      t = (dctSqrt2 * p0 + 512) >> 10;\n      p[row] = t;\n      p[row + 1] = t;\n      p[row + 2] = t;\n      p[row + 3] = t;\n      p[row + 4] = t;\n      p[row + 5] = t;\n      p[row + 6] = t;\n      p[row + 7] = t;\n      continue;\n    }\n    // dequant p1 ... p7\n    p1 *= qt[row + 1];\n    p2 *= qt[row + 2];\n    p3 *= qt[row + 3];\n    p4 *= qt[row + 4];\n    p5 *= qt[row + 5];\n    p6 *= qt[row + 6];\n    p7 *= qt[row + 7];\n\n    // stage 4\n    v0 = (dctSqrt2 * p0 + 128) >> 8;\n    v1 = (dctSqrt2 * p4 + 128) >> 8;\n    v2 = p2;\n    v3 = p6;\n    v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8;\n    v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8;\n    v5 = p3 << 4;\n    v6 = p5 << 4;\n\n    // stage 3\n    v0 = (v0 + v1 + 1) >> 1;\n    v1 = v0 - v1;\n    t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;\n    v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;\n    v3 = t;\n    v4 = (v4 + v6 + 1) >> 1;\n    v6 = v4 - v6;\n    v7 = (v7 + v5 + 1) >> 1;\n    v5 = v7 - v5;\n\n    // stage 2\n    v0 = (v0 + v3 + 1) >> 1;\n    v3 = v0 - v3;\n    v1 = (v1 + v2 + 1) >> 1;\n    v2 = v1 - v2;\n    t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\n    v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\n    v7 = t;\n    t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\n    v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\n    v6 = t;\n\n    // stage 1\n    p[row] = v0 + v7;\n    p[row + 7] = v0 - v7;\n    p[row + 1] = v1 + v6;\n    p[row + 6] = v1 - v6;\n    p[row + 2] = v2 + v5;\n    p[row + 5] = v2 - v5;\n    p[row + 3] = v3 + v4;\n    p[row + 4] = v3 - v4;\n  }\n\n  // inverse DCT on columns\n  for (let col = 0; col < 8; ++col) {\n    p0 = p[col];\n    p1 = p[col + 8];\n    p2 = p[col + 16];\n    p3 = p[col + 24];\n    p4 = p[col + 32];\n    p5 = p[col + 40];\n    p6 = p[col + 48];\n    p7 = p[col + 56];\n\n    // check for all-zero AC coefficients\n    if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n      t = (dctSqrt2 * p0 + 8192) >> 14;\n      // Convert to 8-bit.\n      if (t < -2040) {\n        t = 0;\n      } else if (t >= 2024) {\n        t = 255;\n      } else {\n        t = (t + 2056) >> 4;\n      }\n      blockData[blockBufferOffset + col] = t;\n      blockData[blockBufferOffset + col + 8] = t;\n      blockData[blockBufferOffset + col + 16] = t;\n      blockData[blockBufferOffset + col + 24] = t;\n      blockData[blockBufferOffset + col + 32] = t;\n      blockData[blockBufferOffset + col + 40] = t;\n      blockData[blockBufferOffset + col + 48] = t;\n      blockData[blockBufferOffset + col + 56] = t;\n      continue;\n    }\n\n    // stage 4\n    v0 = (dctSqrt2 * p0 + 2048) >> 12;\n    v1 = (dctSqrt2 * p4 + 2048) >> 12;\n    v2 = p2;\n    v3 = p6;\n    v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12;\n    v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12;\n    v5 = p3;\n    v6 = p5;\n\n    // stage 3\n    // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when\n    // converting to UInt8 range later.\n    v0 = ((v0 + v1 + 1) >> 1) + 4112;\n    v1 = v0 - v1;\n    t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;\n    v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;\n    v3 = t;\n    v4 = (v4 + v6 + 1) >> 1;\n    v6 = v4 - v6;\n    v7 = (v7 + v5 + 1) >> 1;\n    v5 = v7 - v5;\n\n    // stage 2\n    v0 = (v0 + v3 + 1) >> 1;\n    v3 = v0 - v3;\n    v1 = (v1 + v2 + 1) >> 1;\n    v2 = v1 - v2;\n    t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\n    v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\n    v7 = t;\n    t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\n    v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\n    v6 = t;\n\n    // stage 1\n    p0 = v0 + v7;\n    p7 = v0 - v7;\n    p1 = v1 + v6;\n    p6 = v1 - v6;\n    p2 = v2 + v5;\n    p5 = v2 - v5;\n    p3 = v3 + v4;\n    p4 = v3 - v4;\n\n    // Convert to 8-bit integers.\n    if (p0 < 16) {\n      p0 = 0;\n    } else if (p0 >= 4080) {\n      p0 = 255;\n    } else {\n      p0 >>= 4;\n    }\n    if (p1 < 16) {\n      p1 = 0;\n    } else if (p1 >= 4080) {\n      p1 = 255;\n    } else {\n      p1 >>= 4;\n    }\n    if (p2 < 16) {\n      p2 = 0;\n    } else if (p2 >= 4080) {\n      p2 = 255;\n    } else {\n      p2 >>= 4;\n    }\n    if (p3 < 16) {\n      p3 = 0;\n    } else if (p3 >= 4080) {\n      p3 = 255;\n    } else {\n      p3 >>= 4;\n    }\n    if (p4 < 16) {\n      p4 = 0;\n    } else if (p4 >= 4080) {\n      p4 = 255;\n    } else {\n      p4 >>= 4;\n    }\n    if (p5 < 16) {\n      p5 = 0;\n    } else if (p5 >= 4080) {\n      p5 = 255;\n    } else {\n      p5 >>= 4;\n    }\n    if (p6 < 16) {\n      p6 = 0;\n    } else if (p6 >= 4080) {\n      p6 = 255;\n    } else {\n      p6 >>= 4;\n    }\n    if (p7 < 16) {\n      p7 = 0;\n    } else if (p7 >= 4080) {\n      p7 = 255;\n    } else {\n      p7 >>= 4;\n    }\n\n    // store block data\n    blockData[blockBufferOffset + col] = p0;\n    blockData[blockBufferOffset + col + 8] = p1;\n    blockData[blockBufferOffset + col + 16] = p2;\n    blockData[blockBufferOffset + col + 24] = p3;\n    blockData[blockBufferOffset + col + 32] = p4;\n    blockData[blockBufferOffset + col + 40] = p5;\n    blockData[blockBufferOffset + col + 48] = p6;\n    blockData[blockBufferOffset + col + 56] = p7;\n  }\n}\n\nfunction buildComponentData(frame, component) {\n  const blocksPerLine = component.blocksPerLine;\n  const blocksPerColumn = component.blocksPerColumn;\n  const computationBuffer = new Int16Array(64);\n\n  for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\n    for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) {\n      const offset = getBlockBufferOffset(component, blockRow, blockCol);\n      quantizeAndInverse(component, offset, computationBuffer);\n    }\n  }\n  return component.blockData;\n}\n\nfunction findNextFileMarker(data, view, currentPos, startPos = currentPos) {\n  const maxPos = data.length - 1;\n  let newPos = startPos < currentPos ? startPos : currentPos;\n\n  if (currentPos >= maxPos) {\n    return null; // Don't attempt to read non-existent data and just return.\n  }\n  const currentMarker = view.getUint16(currentPos);\n  if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {\n    return {\n      invalid: null,\n      marker: currentMarker,\n      offset: currentPos,\n    };\n  }\n  let newMarker = view.getUint16(newPos);\n  while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {\n    if (++newPos >= maxPos) {\n      return null; // Don't attempt to read non-existent data and just return.\n    }\n    newMarker = view.getUint16(newPos);\n  }\n  return {\n    invalid: currentMarker.toString(16),\n    marker: newMarker,\n    offset: newPos,\n  };\n}\n\nfunction prepareComponents(frame) {\n  const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);\n  const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);\n  for (const component of frame.components) {\n    const blocksPerLine = Math.ceil(\n      (Math.ceil(frame.samplesPerLine / 8) * component.h) / frame.maxH\n    );\n    const blocksPerColumn = Math.ceil(\n      (Math.ceil(frame.scanLines / 8) * component.v) / frame.maxV\n    );\n    const blocksPerLineForMcu = mcusPerLine * component.h;\n    const blocksPerColumnForMcu = mcusPerColumn * component.v;\n\n    const blocksBufferSize =\n      64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);\n    component.blockData = new Int16Array(blocksBufferSize);\n    component.blocksPerLine = blocksPerLine;\n    component.blocksPerColumn = blocksPerColumn;\n  }\n  frame.mcusPerLine = mcusPerLine;\n  frame.mcusPerColumn = mcusPerColumn;\n}\n\nfunction readDataBlock(data, view, offset) {\n  const length = view.getUint16(offset);\n  offset += 2;\n  let endOffset = offset + length - 2;\n\n  const fileMarker = findNextFileMarker(data, view, endOffset, offset);\n  if (fileMarker?.invalid) {\n    warn(\n      \"readDataBlock - incorrect length, current marker is: \" +\n        fileMarker.invalid\n    );\n    endOffset = fileMarker.offset;\n  }\n\n  const array = data.subarray(offset, endOffset);\n  return {\n    appData: array,\n    oldOffset: offset,\n    newOffset: offset + array.length,\n  };\n}\n\nfunction skipData(data, view, offset) {\n  const length = view.getUint16(offset);\n  offset += 2;\n  const endOffset = offset + length - 2;\n\n  const fileMarker = findNextFileMarker(data, view, endOffset, offset);\n  if (fileMarker?.invalid) {\n    return fileMarker.offset;\n  }\n  return endOffset;\n}\n\nclass JpegImage {\n  constructor({ decodeTransform = null, colorTransform = -1 } = {}) {\n    this._decodeTransform = decodeTransform;\n    this._colorTransform = colorTransform;\n  }\n\n  static canUseImageDecoder(data, colorTransform = -1) {\n    const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n    let exifOffsets = null;\n    let offset = 0;\n    let numComponents = null;\n    let fileMarker = view.getUint16(offset);\n    offset += 2;\n    if (fileMarker !== /* SOI (Start of Image) = */ 0xffd8) {\n      throw new JpegError(\"SOI not found\");\n    }\n    fileMarker = view.getUint16(offset);\n    offset += 2;\n\n    markerLoop: while (fileMarker !== /* EOI (End of Image) = */ 0xffd9) {\n      switch (fileMarker) {\n        case 0xffe1: // APP1 - Exif\n          // TODO: Remove this once https://github.com/w3c/webcodecs/issues/870\n          //       is fixed.\n          const { appData, oldOffset, newOffset } = readDataBlock(\n            data,\n            view,\n            offset\n          );\n          offset = newOffset;\n\n          // 'Exif\\x00\\x00'\n          if (\n            appData[0] === 0x45 &&\n            appData[1] === 0x78 &&\n            appData[2] === 0x69 &&\n            appData[3] === 0x66 &&\n            appData[4] === 0 &&\n            appData[5] === 0\n          ) {\n            if (exifOffsets) {\n              throw new JpegError(\"Duplicate EXIF-blocks found.\");\n            }\n            // Don't do the EXIF-block replacement here, see `JpegStream`,\n            // since that can modify the original PDF document.\n            exifOffsets = { exifStart: oldOffset + 6, exifEnd: newOffset };\n          }\n          fileMarker = view.getUint16(offset);\n          offset += 2;\n          continue;\n        case 0xffc0: // SOF0 (Start of Frame, Baseline DCT)\n        case 0xffc1: // SOF1 (Start of Frame, Extended DCT)\n        case 0xffc2: // SOF2 (Start of Frame, Progressive DCT)\n          // Skip marker length.\n          // Skip precision.\n          // Skip scanLines.\n          // Skip samplesPerLine.\n          numComponents = data[offset + (2 + 1 + 2 + 2)];\n          break markerLoop;\n        case 0xffff: // Fill bytes\n          if (data[offset] !== 0xff) {\n            // Avoid skipping a valid marker.\n            offset--;\n          }\n          break;\n      }\n      offset = skipData(data, view, offset);\n      fileMarker = view.getUint16(offset);\n      offset += 2;\n    }\n    if (numComponents === 4) {\n      return null;\n    }\n    if (numComponents === 3 && colorTransform === 0) {\n      return null;\n    }\n    return exifOffsets || {};\n  }\n\n  parse(data, { dnlScanLines = null } = {}) {\n    const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n    const maxOffset = data.length - 1;\n    let offset = 0;\n    let jfif = null;\n    let adobe = null;\n    let frame, resetInterval;\n    let numSOSMarkers = 0;\n    const quantizationTables = [];\n    const huffmanTablesAC = [],\n      huffmanTablesDC = [];\n\n    let fileMarker = view.getUint16(offset);\n    offset += 2;\n    if (fileMarker !== /* SOI (Start of Image) = */ 0xffd8) {\n      throw new JpegError(\"SOI not found\");\n    }\n    fileMarker = view.getUint16(offset);\n    offset += 2;\n\n    markerLoop: while (fileMarker !== /* EOI (End of Image) = */ 0xffd9) {\n      let i, j, l;\n      switch (fileMarker) {\n        case 0xffe0: // APP0 (Application Specific)\n        case 0xffe1: // APP1\n        case 0xffe2: // APP2\n        case 0xffe3: // APP3\n        case 0xffe4: // APP4\n        case 0xffe5: // APP5\n        case 0xffe6: // APP6\n        case 0xffe7: // APP7\n        case 0xffe8: // APP8\n        case 0xffe9: // APP9\n        case 0xffea: // APP10\n        case 0xffeb: // APP11\n        case 0xffec: // APP12\n        case 0xffed: // APP13\n        case 0xffee: // APP14\n        case 0xffef: // APP15\n        case 0xfffe: // COM (Comment)\n          const { appData, newOffset } = readDataBlock(data, view, offset);\n          offset = newOffset;\n\n          if (fileMarker === 0xffe0) {\n            // 'JFIF\\x00'\n            if (\n              appData[0] === 0x4a &&\n              appData[1] === 0x46 &&\n              appData[2] === 0x49 &&\n              appData[3] === 0x46 &&\n              appData[4] === 0\n            ) {\n              jfif = {\n                version: { major: appData[5], minor: appData[6] },\n                densityUnits: appData[7],\n                xDensity: (appData[8] << 8) | appData[9],\n                yDensity: (appData[10] << 8) | appData[11],\n                thumbWidth: appData[12],\n                thumbHeight: appData[13],\n                thumbData: appData.subarray(\n                  14,\n                  14 + 3 * appData[12] * appData[13]\n                ),\n              };\n            }\n          }\n          // TODO APP1 - Exif\n          if (fileMarker === 0xffee) {\n            // 'Adobe'\n            if (\n              appData[0] === 0x41 &&\n              appData[1] === 0x64 &&\n              appData[2] === 0x6f &&\n              appData[3] === 0x62 &&\n              appData[4] === 0x65\n            ) {\n              adobe = {\n                version: (appData[5] << 8) | appData[6],\n                flags0: (appData[7] << 8) | appData[8],\n                flags1: (appData[9] << 8) | appData[10],\n                transformCode: appData[11],\n              };\n            }\n          }\n          break;\n\n        case 0xffdb: // DQT (Define Quantization Tables)\n          const quantizationTablesLength = view.getUint16(offset);\n          offset += 2;\n          const quantizationTablesEnd = quantizationTablesLength + offset - 2;\n          let z;\n          while (offset < quantizationTablesEnd) {\n            const quantizationTableSpec = data[offset++];\n            const tableData = new Uint16Array(64);\n            if (quantizationTableSpec >> 4 === 0) {\n              // 8 bit values\n              for (j = 0; j < 64; j++) {\n                z = dctZigZag[j];\n                tableData[z] = data[offset++];\n              }\n            } else if (quantizationTableSpec >> 4 === 1) {\n              // 16 bit values\n              for (j = 0; j < 64; j++) {\n                z = dctZigZag[j];\n                tableData[z] = view.getUint16(offset);\n                offset += 2;\n              }\n            } else {\n              throw new JpegError(\"DQT - invalid table spec\");\n            }\n            quantizationTables[quantizationTableSpec & 15] = tableData;\n          }\n          break;\n\n        case 0xffc0: // SOF0 (Start of Frame, Baseline DCT)\n        case 0xffc1: // SOF1 (Start of Frame, Extended DCT)\n        case 0xffc2: // SOF2 (Start of Frame, Progressive DCT)\n          if (frame) {\n            throw new JpegError(\"Only single frame JPEGs supported\");\n          }\n          offset += 2; // Skip marker length.\n\n          frame = {};\n          frame.extended = fileMarker === 0xffc1;\n          frame.progressive = fileMarker === 0xffc2;\n          frame.precision = data[offset++];\n          const sofScanLines = view.getUint16(offset);\n          offset += 2;\n          frame.scanLines = dnlScanLines || sofScanLines;\n          frame.samplesPerLine = view.getUint16(offset);\n          offset += 2;\n          frame.components = [];\n          frame.componentIds = {};\n          const componentsCount = data[offset++];\n          let maxH = 0,\n            maxV = 0;\n          for (i = 0; i < componentsCount; i++) {\n            const componentId = data[offset];\n            const h = data[offset + 1] >> 4;\n            const v = data[offset + 1] & 15;\n            if (maxH < h) {\n              maxH = h;\n            }\n            if (maxV < v) {\n              maxV = v;\n            }\n            const qId = data[offset + 2];\n            l = frame.components.push({\n              h,\n              v,\n              quantizationId: qId,\n              quantizationTable: null, // See comment below.\n            });\n            frame.componentIds[componentId] = l - 1;\n            offset += 3;\n          }\n          frame.maxH = maxH;\n          frame.maxV = maxV;\n          prepareComponents(frame);\n          break;\n\n        case 0xffc4: // DHT (Define Huffman Tables)\n          const huffmanLength = view.getUint16(offset);\n          offset += 2;\n          for (i = 2; i < huffmanLength; ) {\n            const huffmanTableSpec = data[offset++];\n            const codeLengths = new Uint8Array(16);\n            let codeLengthSum = 0;\n            for (j = 0; j < 16; j++, offset++) {\n              codeLengthSum += codeLengths[j] = data[offset];\n            }\n            const huffmanValues = new Uint8Array(codeLengthSum);\n            for (j = 0; j < codeLengthSum; j++, offset++) {\n              huffmanValues[j] = data[offset];\n            }\n            i += 17 + codeLengthSum;\n\n            (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[\n              huffmanTableSpec & 15\n            ] = buildHuffmanTable(codeLengths, huffmanValues);\n          }\n          break;\n\n        case 0xffdd: // DRI (Define Restart Interval)\n          offset += 2; // Skip marker length.\n\n          resetInterval = view.getUint16(offset);\n          offset += 2;\n          break;\n\n        case 0xffda: // SOS (Start of Scan)\n          // A DNL marker (0xFFDC), if it exists, is only allowed at the end\n          // of the first scan segment and may only occur once in an image.\n          // Furthermore, to prevent an infinite loop, do *not* attempt to\n          // parse DNL markers during re-parsing of the JPEG scan data.\n          const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;\n\n          offset += 2; // Skip marker length.\n\n          const selectorsCount = data[offset++],\n            components = [];\n          for (i = 0; i < selectorsCount; i++) {\n            const index = data[offset++];\n            const componentIndex = frame.componentIds[index];\n            const component = frame.components[componentIndex];\n            component.index = index;\n            const tableSpec = data[offset++];\n            component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];\n            component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];\n            components.push(component);\n          }\n          const spectralStart = data[offset++],\n            spectralEnd = data[offset++],\n            successiveApproximation = data[offset++];\n          try {\n            const processed = decodeScan(\n              data,\n              view,\n              offset,\n              frame,\n              components,\n              resetInterval,\n              spectralStart,\n              spectralEnd,\n              successiveApproximation >> 4,\n              successiveApproximation & 15,\n              parseDNLMarker\n            );\n            offset += processed;\n          } catch (ex) {\n            if (ex instanceof DNLMarkerError) {\n              warn(`${ex.message} -- attempting to re-parse the JPEG image.`);\n              return this.parse(data, { dnlScanLines: ex.scanLines });\n            } else if (ex instanceof EOIMarkerError) {\n              warn(`${ex.message} -- ignoring the rest of the image data.`);\n              break markerLoop;\n            }\n            throw ex;\n          }\n          break;\n\n        case 0xffdc: // DNL (Define Number of Lines)\n          // Ignore the marker, since it's being handled in `decodeScan`.\n          offset += 4;\n          break;\n\n        case 0xffff: // Fill bytes\n          if (data[offset] !== 0xff) {\n            // Avoid skipping a valid marker.\n            offset--;\n          }\n          break;\n\n        default:\n          // Could be incorrect encoding -- the last 0xFF byte of the previous\n          // block could have been eaten by the encoder, hence we fallback to\n          // `startPos = offset - 3` when looking for the next valid marker.\n          const nextFileMarker = findNextFileMarker(\n            data,\n            view,\n            /* currentPos = */ offset - 2,\n            /* startPos = */ offset - 3\n          );\n          if (nextFileMarker?.invalid) {\n            warn(\n              \"JpegImage.parse - unexpected data, current marker is: \" +\n                nextFileMarker.invalid\n            );\n            offset = nextFileMarker.offset;\n            break;\n          }\n          if (!nextFileMarker || offset >= maxOffset) {\n            warn(\n              \"JpegImage.parse - reached the end of the image data \" +\n                \"without finding an EOI marker (0xFFD9).\"\n            );\n            break markerLoop;\n          }\n          throw new JpegError(\n            \"JpegImage.parse - unknown marker: \" + fileMarker.toString(16)\n          );\n      }\n\n      if (offset < maxOffset) {\n        fileMarker = view.getUint16(offset);\n        offset += 2;\n      } else {\n        fileMarker = 0;\n      }\n    }\n\n    if (!frame) {\n      throw new JpegError(\"JpegImage.parse - no frame data found.\");\n    }\n    this.width = frame.samplesPerLine;\n    this.height = frame.scanLines;\n    this.jfif = jfif;\n    this.adobe = adobe;\n    this.components = [];\n    for (const component of frame.components) {\n      // Prevent errors when DQT markers are placed after SOF{n} markers,\n      // by assigning the `quantizationTable` entry after the entire image\n      // has been parsed (fixes issue7406.pdf).\n      const quantizationTable = quantizationTables[component.quantizationId];\n      if (quantizationTable) {\n        component.quantizationTable = quantizationTable;\n      }\n\n      this.components.push({\n        index: component.index,\n        output: buildComponentData(frame, component),\n        scaleX: component.h / frame.maxH,\n        scaleY: component.v / frame.maxV,\n        blocksPerLine: component.blocksPerLine,\n        blocksPerColumn: component.blocksPerColumn,\n      });\n    }\n    this.numComponents = this.components.length;\n    return undefined;\n  }\n\n  #getLinearizedBlockData(width, height, isSourcePDF) {\n    const scaleX = this.width / width,\n      scaleY = this.height / height;\n\n    let component, componentScaleX, componentScaleY, blocksPerScanline;\n    let x, y, i, j, k;\n    let index;\n    let offset = 0;\n    let output;\n    const numComponents = this.components.length;\n    const dataLength = width * height * numComponents;\n    const data = new Uint8ClampedArray(dataLength);\n    const xScaleBlockOffset = new Uint32Array(width);\n    const mask3LSB = 0xfffffff8; // used to clear the 3 LSBs\n    let lastComponentScaleX;\n\n    for (i = 0; i < numComponents; i++) {\n      component = this.components[i];\n      componentScaleX = component.scaleX * scaleX;\n      componentScaleY = component.scaleY * scaleY;\n      offset = i;\n      output = component.output;\n      blocksPerScanline = (component.blocksPerLine + 1) << 3;\n      // Precalculate the `xScaleBlockOffset`. Since it doesn't depend on the\n      // component data, that's only necessary when `componentScaleX` changes.\n      if (componentScaleX !== lastComponentScaleX) {\n        for (x = 0; x < width; x++) {\n          j = 0 | (x * componentScaleX);\n          xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7);\n        }\n        lastComponentScaleX = componentScaleX;\n      }\n      // linearize the blocks of the component\n      for (y = 0; y < height; y++) {\n        j = 0 | (y * componentScaleY);\n        index = (blocksPerScanline * (j & mask3LSB)) | ((j & 7) << 3);\n        for (x = 0; x < width; x++) {\n          data[offset] = output[index + xScaleBlockOffset[x]];\n          offset += numComponents;\n        }\n      }\n    }\n\n    // decodeTransform contains pairs of multiplier (-256..256) and additive\n    let transform = this._decodeTransform;\n\n    // In PDF files, JPEG images with CMYK colour spaces are usually inverted\n    // (this can be observed by extracting the raw image data).\n    // Since the conversion algorithms (see below) were written primarily for\n    // the PDF use-cases, attempting to use `JpegImage` to parse standalone\n    // JPEG (CMYK) images may thus result in inverted images (see issue 9513).\n    //\n    // Unfortunately it's not (always) possible to tell, from the image data\n    // alone, if it needs to be inverted. Thus in an attempt to provide better\n    // out-of-the-box behaviour when `JpegImage` is used standalone, default to\n    // inverting JPEG (CMYK) images if and only if the image data does *not*\n    // come from a PDF file and no `decodeTransform` was passed by the user.\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"IMAGE_DECODERS\") &&\n      !isSourcePDF &&\n      numComponents === 4\n    ) {\n      transform ||= new Int32Array([\n        -256, 255, -256, 255, -256, 255, -256, 255,\n      ]);\n    }\n\n    if (transform) {\n      for (i = 0; i < dataLength; ) {\n        for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {\n          data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1];\n        }\n      }\n    }\n    return data;\n  }\n\n  get _isColorConversionNeeded() {\n    if (this.adobe) {\n      // The adobe transform marker overrides any previous setting.\n      return !!this.adobe.transformCode;\n    }\n    if (this.numComponents === 3) {\n      if (this._colorTransform === 0) {\n        // If the Adobe transform marker is not present and the image\n        // dictionary has a 'ColorTransform' entry, explicitly set to `0`,\n        // then the colours should *not* be transformed.\n        return false;\n      } else if (\n        this.components[0].index === /* \"R\" = */ 0x52 &&\n        this.components[1].index === /* \"G\" = */ 0x47 &&\n        this.components[2].index === /* \"B\" = */ 0x42\n      ) {\n        // If the three components are indexed as RGB in ASCII\n        // then the colours should *not* be transformed.\n        return false;\n      }\n      return true;\n    }\n    // `this.numComponents !== 3`\n    if (this._colorTransform === 1) {\n      // If the Adobe transform marker is not present and the image\n      // dictionary has a 'ColorTransform' entry, explicitly set to `1`,\n      // then the colours should be transformed.\n      return true;\n    }\n    return false;\n  }\n\n  _convertYccToRgb(data) {\n    let Y, Cb, Cr;\n    for (let i = 0, ii = data.length; i < ii; i += 3) {\n      Y = data[i];\n      Cb = data[i + 1];\n      Cr = data[i + 2];\n      data[i] = Y - 179.456 + 1.402 * Cr;\n      data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;\n      data[i + 2] = Y - 226.816 + 1.772 * Cb;\n    }\n    return data;\n  }\n\n  _convertYccToRgba(data, out) {\n    for (let i = 0, j = 0, ii = data.length; i < ii; i += 3, j += 4) {\n      const Y = data[i];\n      const Cb = data[i + 1];\n      const Cr = data[i + 2];\n      out[j] = Y - 179.456 + 1.402 * Cr;\n      out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;\n      out[j + 2] = Y - 226.816 + 1.772 * Cb;\n      out[j + 3] = 255;\n    }\n    return out;\n  }\n\n  _convertYcckToRgb(data) {\n    this._convertYcckToCmyk(data);\n    return this._convertCmykToRgb(data);\n  }\n\n  _convertYcckToRgba(data) {\n    this._convertYcckToCmyk(data);\n    return this._convertCmykToRgba(data);\n  }\n\n  _convertYcckToCmyk(data) {\n    let Y, Cb, Cr;\n    for (let i = 0, ii = data.length; i < ii; i += 4) {\n      Y = data[i];\n      Cb = data[i + 1];\n      Cr = data[i + 2];\n      data[i] = 434.456 - Y - 1.402 * Cr;\n      data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;\n      data[i + 2] = 481.816 - Y - 1.772 * Cb;\n      // K in data[i + 3] is unchanged\n    }\n    return data;\n  }\n\n  _convertCmykToRgb(data) {\n    const count = data.length / 4;\n    ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, count, data, 0, 8, 0);\n    return data.subarray(0, count * 3);\n  }\n\n  _convertCmykToRgba(data) {\n    ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, data.length / 4, data, 0, 8, 1);\n\n    if (ColorSpaceUtils.cmyk instanceof DeviceCmykCS) {\n      // The alpha-component isn't updated by `DeviceCmykCS`, doing it manually.\n      for (let i = 3, ii = data.length; i < ii; i += 4) {\n        data[i] = 255;\n      }\n    }\n    return data;\n  }\n\n  getData({\n    width,\n    height,\n    forceRGBA = false,\n    forceRGB = false,\n    isSourcePDF = typeof PDFJSDev === \"undefined\" ||\n      !PDFJSDev.test(\"IMAGE_DECODERS\"),\n  }) {\n    if (this.numComponents > 4) {\n      throw new JpegError(\"Unsupported color mode\");\n    }\n    // Type of data: Uint8ClampedArray(width * height * numComponents)\n    const data = this.#getLinearizedBlockData(width, height, isSourcePDF);\n\n    if (this.numComponents === 1 && (forceRGBA || forceRGB)) {\n      const len = data.length * (forceRGBA ? 4 : 3);\n      const rgbaData = new Uint8ClampedArray(len);\n      let offset = 0;\n      if (forceRGBA) {\n        grayToRGBA(data, new Uint32Array(rgbaData.buffer));\n      } else {\n        for (const grayColor of data) {\n          rgbaData[offset++] = grayColor;\n          rgbaData[offset++] = grayColor;\n          rgbaData[offset++] = grayColor;\n        }\n      }\n      return rgbaData;\n    } else if (this.numComponents === 3 && this._isColorConversionNeeded) {\n      if (forceRGBA) {\n        const rgbaData = new Uint8ClampedArray((data.length / 3) * 4);\n        return this._convertYccToRgba(data, rgbaData);\n      }\n      return this._convertYccToRgb(data);\n    } else if (this.numComponents === 4) {\n      if (this._isColorConversionNeeded) {\n        if (forceRGBA) {\n          return this._convertYcckToRgba(data);\n        }\n        if (forceRGB) {\n          return this._convertYcckToRgb(data);\n        }\n        return this._convertYcckToCmyk(data);\n      } else if (forceRGBA) {\n        return this._convertCmykToRgba(data);\n      } else if (forceRGB) {\n        return this._convertCmykToRgb(data);\n      }\n    }\n    return data;\n  }\n}\n\nexport { JpegError, JpegImage };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, shadow, warn } from \"../shared/util.js\";\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { Dict } from \"./primitives.js\";\nimport { JpegImage } from \"./jpg.js\";\n\n/**\n * For JPEG's we use a library to decode these images and the stream behaves\n * like all the other DecodeStreams.\n */\nclass JpegStream extends DecodeStream {\n  static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported;\n\n  constructor(stream, maybeLength, params) {\n    super(maybeLength);\n\n    this.stream = stream;\n    this.dict = stream.dict;\n    this.maybeLength = maybeLength;\n    this.params = params;\n  }\n\n  static get canUseImageDecoder() {\n    return shadow(\n      this,\n      \"canUseImageDecoder\",\n      this.#isImageDecoderSupported\n        ? ImageDecoder.isTypeSupported(\"image/jpeg\")\n        : Promise.resolve(false)\n    );\n  }\n\n  static setOptions({ isImageDecoderSupported = false }) {\n    this.#isImageDecoderSupported = isImageDecoderSupported;\n  }\n\n  get bytes() {\n    // If `this.maybeLength` is null, we'll get the entire stream.\n    return shadow(this, \"bytes\", this.stream.getBytes(this.maybeLength));\n  }\n\n  ensureBuffer(requested) {\n    // No-op, since `this.readBlock` will always parse the entire image and\n    // directly insert all of its data into `this.buffer`.\n  }\n\n  readBlock() {\n    this.decodeImage();\n  }\n\n  get jpegOptions() {\n    const jpegOptions = {\n      decodeTransform: undefined,\n      colorTransform: undefined,\n    };\n\n    // Checking if values need to be transformed before conversion.\n    const decodeArr = this.dict.getArray(\"D\", \"Decode\");\n    if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) {\n      const bitsPerComponent = this.dict.get(\"BPC\", \"BitsPerComponent\") || 8;\n      const decodeArrLength = decodeArr.length;\n      const transform = new Int32Array(decodeArrLength);\n      let transformNeeded = false;\n      const maxValue = (1 << bitsPerComponent) - 1;\n      for (let i = 0; i < decodeArrLength; i += 2) {\n        transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;\n        transform[i + 1] = (decodeArr[i] * maxValue) | 0;\n        if (transform[i] !== 256 || transform[i + 1] !== 0) {\n          transformNeeded = true;\n        }\n      }\n      if (transformNeeded) {\n        jpegOptions.decodeTransform = transform;\n      }\n    }\n    // Fetching the 'ColorTransform' entry, if it exists.\n    if (this.params instanceof Dict) {\n      const colorTransform = this.params.get(\"ColorTransform\");\n      if (Number.isInteger(colorTransform)) {\n        jpegOptions.colorTransform = colorTransform;\n      }\n    }\n    return shadow(this, \"jpegOptions\", jpegOptions);\n  }\n\n  #skipUselessBytes(data) {\n    // Some images may contain 'junk' before the SOI (start-of-image) marker.\n    // Note: this seems to mainly affect inline images.\n    for (let i = 0, ii = data.length - 1; i < ii; i++) {\n      if (data[i] === 0xff && data[i + 1] === 0xd8) {\n        if (i > 0) {\n          data = data.subarray(i);\n        }\n        break;\n      }\n    }\n    return data;\n  }\n\n  decodeImage(bytes) {\n    if (this.eof) {\n      return this.buffer;\n    }\n    bytes = this.#skipUselessBytes(bytes || this.bytes);\n\n    // TODO: if an image has a mask we need to combine the data.\n    // So ideally get a VideoFrame from getTransferableImage and then use\n    // copyTo.\n\n    const jpegImage = new JpegImage(this.jpegOptions);\n    jpegImage.parse(bytes);\n    const data = jpegImage.getData({\n      width: this.drawWidth,\n      height: this.drawHeight,\n      forceRGBA: this.forceRGBA,\n      forceRGB: this.forceRGB,\n    });\n    this.buffer = data;\n    this.bufferLength = data.length;\n    this.eof = true;\n\n    return this.buffer;\n  }\n\n  get canAsyncDecodeImageFromBuffer() {\n    return this.stream.isAsync;\n  }\n\n  async getTransferableImage() {\n    if (!(await JpegStream.canUseImageDecoder)) {\n      return null;\n    }\n    const jpegOptions = this.jpegOptions;\n    if (jpegOptions.decodeTransform) {\n      // TODO: We could decode the image thanks to ImageDecoder and then\n      // get the pixels with copyTo and apply the decodeTransform.\n      return null;\n    }\n    let decoder;\n    try {\n      // TODO: If the stream is Flate & DCT we could try to just pipe the\n      // the DecompressionStream into the ImageDecoder: it'll avoid the\n      // intermediate ArrayBuffer.\n      const bytes =\n        (this.canAsyncDecodeImageFromBuffer &&\n          (await this.stream.asyncGetBytes())) ||\n        this.bytes;\n      if (!bytes) {\n        return null;\n      }\n      let data = this.#skipUselessBytes(bytes);\n      const useImageDecoder = JpegImage.canUseImageDecoder(\n        data,\n        jpegOptions.colorTransform\n      );\n      if (!useImageDecoder) {\n        return null;\n      }\n      if (useImageDecoder.exifStart) {\n        // Replace the entire EXIF-block with dummy data, to ensure that a\n        // non-default EXIF orientation won't cause the image to be rotated\n        // when using `ImageDecoder` (fixes bug1942064.pdf).\n        //\n        // Copy the data first, to avoid modifying the original PDF document.\n        data = data.slice();\n        data.fill(0x00, useImageDecoder.exifStart, useImageDecoder.exifEnd);\n      }\n      decoder = new ImageDecoder({\n        data,\n        type: \"image/jpeg\",\n        preferAnimation: false,\n      });\n\n      return (await decoder.decode()).image;\n    } catch (reason) {\n      warn(`getTransferableImage - failed: \"${reason}\".`);\n      return null;\n    } finally {\n      decoder?.close();\n    }\n  }\n\n  get isImageStream() {\n    return true;\n  }\n}\n\nexport { JpegStream };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  DrawOPS,\n  F32_BBOX_INIT,\n  ImageKind,\n  OPS,\n  RenderingIntentFlag,\n  Util,\n  warn,\n} from \"../shared/util.js\";\n\nfunction addState(parentState, pattern, checkFn, iterateFn, processFn) {\n  let state = parentState;\n  for (let i = 0, ii = pattern.length - 1; i < ii; i++) {\n    const item = pattern[i];\n    state = state[item] ||= [];\n  }\n  state[pattern.at(-1)] = {\n    checkFn,\n    iterateFn,\n    processFn,\n  };\n}\n\nconst InitialState = [];\n\n// This replaces (save, transform, paintInlineImageXObject, restore)+\n// sequences with one |paintInlineImageXObjectGroup| operation.\naddState(\n  InitialState,\n  [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore],\n  null,\n  function iterateInlineImageGroup(context, i) {\n    const fnArray = context.fnArray;\n    const iFirstSave = context.iCurr - 3;\n    const pos = (i - iFirstSave) % 4;\n    switch (pos) {\n      case 0:\n        return fnArray[i] === OPS.save;\n      case 1:\n        return fnArray[i] === OPS.transform;\n      case 2:\n        return fnArray[i] === OPS.paintInlineImageXObject;\n      case 3:\n        return fnArray[i] === OPS.restore;\n    }\n    throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`);\n  },\n  function foundInlineImageGroup(context, i) {\n    const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;\n    const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;\n    const MAX_WIDTH = 1000;\n    const IMAGE_PADDING = 1;\n\n    const fnArray = context.fnArray,\n      argsArray = context.argsArray;\n    const curr = context.iCurr;\n    const iFirstSave = curr - 3;\n    const iFirstTransform = curr - 2;\n    const iFirstPIIXO = curr - 1;\n\n    const count = Math.min(\n      Math.floor((i - iFirstSave) / 4),\n      MAX_IMAGES_IN_INLINE_IMAGES_BLOCK\n    );\n    if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {\n      return i - ((i - iFirstSave) % 4);\n    }\n\n    // assuming that heights of those image is too small (~1 pixel)\n    // packing as much as possible by lines\n    let maxX = 0;\n    const map = [];\n    let maxLineHeight = 0;\n    let currentX = IMAGE_PADDING,\n      currentY = IMAGE_PADDING;\n    for (let q = 0; q < count; q++) {\n      const transform = argsArray[iFirstTransform + (q << 2)];\n      const img = argsArray[iFirstPIIXO + (q << 2)][0];\n      if (currentX + img.width > MAX_WIDTH) {\n        // starting new line\n        maxX = Math.max(maxX, currentX);\n        currentY += maxLineHeight + 2 * IMAGE_PADDING;\n        currentX = 0;\n        maxLineHeight = 0;\n      }\n      map.push({\n        transform,\n        x: currentX,\n        y: currentY,\n        w: img.width,\n        h: img.height,\n      });\n      currentX += img.width + 2 * IMAGE_PADDING;\n      maxLineHeight = Math.max(maxLineHeight, img.height);\n    }\n    const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;\n    const imgHeight = currentY + maxLineHeight + IMAGE_PADDING;\n    const imgData = new Uint8Array(imgWidth * imgHeight * 4);\n    const imgRowSize = imgWidth << 2;\n    for (let q = 0; q < count; q++) {\n      const data = argsArray[iFirstPIIXO + (q << 2)][0].data;\n      // Copy image by lines and extends pixels into padding.\n      const rowSize = map[q].w << 2;\n      let dataOffset = 0;\n      let offset = (map[q].x + map[q].y * imgWidth) << 2;\n      imgData.set(data.subarray(0, rowSize), offset - imgRowSize);\n      for (let k = 0, kk = map[q].h; k < kk; k++) {\n        imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);\n        dataOffset += rowSize;\n        offset += imgRowSize;\n      }\n      imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);\n      while (offset >= 0) {\n        data[offset - 4] = data[offset];\n        data[offset - 3] = data[offset + 1];\n        data[offset - 2] = data[offset + 2];\n        data[offset - 1] = data[offset + 3];\n        data[offset + rowSize] = data[offset + rowSize - 4];\n        data[offset + rowSize + 1] = data[offset + rowSize - 3];\n        data[offset + rowSize + 2] = data[offset + rowSize - 2];\n        data[offset + rowSize + 3] = data[offset + rowSize - 1];\n        offset -= imgRowSize;\n      }\n    }\n\n    const img = {\n      width: imgWidth,\n      height: imgHeight,\n    };\n    if (context.isOffscreenCanvasSupported) {\n      const canvas = new OffscreenCanvas(imgWidth, imgHeight);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.putImageData(\n        new ImageData(\n          new Uint8ClampedArray(imgData.buffer),\n          imgWidth,\n          imgHeight\n        ),\n        0,\n        0\n      );\n      img.bitmap = canvas.transferToImageBitmap();\n      img.data = null;\n    } else {\n      img.kind = ImageKind.RGBA_32BPP;\n      img.data = imgData;\n    }\n\n    // Replace queue items.\n    fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);\n    argsArray.splice(iFirstSave, count * 4, [img, map]);\n\n    return iFirstSave + 1;\n  }\n);\n\n// This replaces (save, transform, paintImageMaskXObject, restore)+\n// sequences with one |paintImageMaskXObjectGroup| or one\n// |paintImageMaskXObjectRepeat| operation.\naddState(\n  InitialState,\n  [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore],\n  null,\n  function iterateImageMaskGroup(context, i) {\n    const fnArray = context.fnArray;\n    const iFirstSave = context.iCurr - 3;\n    const pos = (i - iFirstSave) % 4;\n    switch (pos) {\n      case 0:\n        return fnArray[i] === OPS.save;\n      case 1:\n        return fnArray[i] === OPS.transform;\n      case 2:\n        return fnArray[i] === OPS.paintImageMaskXObject;\n      case 3:\n        return fnArray[i] === OPS.restore;\n    }\n    throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`);\n  },\n  function foundImageMaskGroup(context, i) {\n    const MIN_IMAGES_IN_MASKS_BLOCK = 10;\n    const MAX_IMAGES_IN_MASKS_BLOCK = 100;\n    const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;\n\n    const fnArray = context.fnArray,\n      argsArray = context.argsArray;\n    const curr = context.iCurr;\n    const iFirstSave = curr - 3;\n    const iFirstTransform = curr - 2;\n    const iFirstPIMXO = curr - 1;\n\n    // At this point, i is the index of the first op past the last valid\n    // quartet.\n    let count = Math.floor((i - iFirstSave) / 4);\n    if (count < MIN_IMAGES_IN_MASKS_BLOCK) {\n      return i - ((i - iFirstSave) % 4);\n    }\n\n    let isSameImage = false;\n    let iTransform, transformArgs;\n    const firstPIMXOArg0 = argsArray[iFirstPIMXO][0];\n    const firstTransformArg0 = argsArray[iFirstTransform][0],\n      firstTransformArg1 = argsArray[iFirstTransform][1],\n      firstTransformArg2 = argsArray[iFirstTransform][2],\n      firstTransformArg3 = argsArray[iFirstTransform][3];\n\n    if (firstTransformArg1 === firstTransformArg2) {\n      isSameImage = true;\n      iTransform = iFirstTransform + 4;\n      let iPIMXO = iFirstPIMXO + 4;\n      for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {\n        transformArgs = argsArray[iTransform];\n        if (\n          argsArray[iPIMXO][0] !== firstPIMXOArg0 ||\n          transformArgs[0] !== firstTransformArg0 ||\n          transformArgs[1] !== firstTransformArg1 ||\n          transformArgs[2] !== firstTransformArg2 ||\n          transformArgs[3] !== firstTransformArg3\n        ) {\n          if (q < MIN_IMAGES_IN_MASKS_BLOCK) {\n            isSameImage = false;\n          } else {\n            count = q;\n          }\n          break; // different image or transform\n        }\n      }\n    }\n\n    if (isSameImage) {\n      count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);\n      const positions = new Float32Array(count * 2);\n      iTransform = iFirstTransform;\n      for (let q = 0; q < count; q++, iTransform += 4) {\n        transformArgs = argsArray[iTransform];\n        positions[q << 1] = transformArgs[4];\n        positions[(q << 1) + 1] = transformArgs[5];\n      }\n\n      // Replace queue items.\n      fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);\n      argsArray.splice(iFirstSave, count * 4, [\n        firstPIMXOArg0,\n        firstTransformArg0,\n        firstTransformArg1,\n        firstTransformArg2,\n        firstTransformArg3,\n        positions,\n      ]);\n    } else {\n      count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);\n      const images = [];\n      for (let q = 0; q < count; q++) {\n        transformArgs = argsArray[iFirstTransform + (q << 2)];\n        const maskParams = argsArray[iFirstPIMXO + (q << 2)][0];\n        images.push({\n          data: maskParams.data,\n          width: maskParams.width,\n          height: maskParams.height,\n          interpolate: maskParams.interpolate,\n          count: maskParams.count,\n          transform: transformArgs,\n        });\n      }\n\n      // Replace queue items.\n      fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);\n      argsArray.splice(iFirstSave, count * 4, [images]);\n    }\n\n    return iFirstSave + 1;\n  }\n);\n\n// This replaces (save, transform, paintImageXObject, restore)+ sequences\n// with one paintImageXObjectRepeat operation, if the |transform| and\n// |paintImageXObjectRepeat| ops are appropriate.\naddState(\n  InitialState,\n  [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore],\n  function (context) {\n    const argsArray = context.argsArray;\n    const iFirstTransform = context.iCurr - 2;\n    return (\n      argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0\n    );\n  },\n  function iterateImageGroup(context, i) {\n    const fnArray = context.fnArray,\n      argsArray = context.argsArray;\n    const iFirstSave = context.iCurr - 3;\n    const pos = (i - iFirstSave) % 4;\n    switch (pos) {\n      case 0:\n        return fnArray[i] === OPS.save;\n      case 1:\n        if (fnArray[i] !== OPS.transform) {\n          return false;\n        }\n        const iFirstTransform = context.iCurr - 2;\n        const firstTransformArg0 = argsArray[iFirstTransform][0];\n        const firstTransformArg3 = argsArray[iFirstTransform][3];\n        if (\n          argsArray[i][0] !== firstTransformArg0 ||\n          argsArray[i][1] !== 0 ||\n          argsArray[i][2] !== 0 ||\n          argsArray[i][3] !== firstTransformArg3\n        ) {\n          return false; // transforms don't match\n        }\n        return true;\n      case 2:\n        if (fnArray[i] !== OPS.paintImageXObject) {\n          return false;\n        }\n        const iFirstPIXO = context.iCurr - 1;\n        const firstPIXOArg0 = argsArray[iFirstPIXO][0];\n        if (argsArray[i][0] !== firstPIXOArg0) {\n          return false; // images don't match\n        }\n        return true;\n      case 3:\n        return fnArray[i] === OPS.restore;\n    }\n    throw new Error(`iterateImageGroup - invalid pos: ${pos}`);\n  },\n  function (context, i) {\n    const MIN_IMAGES_IN_BLOCK = 3;\n    const MAX_IMAGES_IN_BLOCK = 1000;\n\n    const fnArray = context.fnArray,\n      argsArray = context.argsArray;\n    const curr = context.iCurr;\n    const iFirstSave = curr - 3;\n    const iFirstTransform = curr - 2;\n    const iFirstPIXO = curr - 1;\n    const firstPIXOArg0 = argsArray[iFirstPIXO][0];\n    const firstTransformArg0 = argsArray[iFirstTransform][0];\n    const firstTransformArg3 = argsArray[iFirstTransform][3];\n\n    // At this point, i is the index of the first op past the last valid\n    // quartet.\n    const count = Math.min(\n      Math.floor((i - iFirstSave) / 4),\n      MAX_IMAGES_IN_BLOCK\n    );\n    if (count < MIN_IMAGES_IN_BLOCK) {\n      return i - ((i - iFirstSave) % 4);\n    }\n\n    // Extract the (x,y) positions from all of the matching transforms.\n    const positions = new Float32Array(count * 2);\n    let iTransform = iFirstTransform;\n    for (let q = 0; q < count; q++, iTransform += 4) {\n      const transformArgs = argsArray[iTransform];\n      positions[q << 1] = transformArgs[4];\n      positions[(q << 1) + 1] = transformArgs[5];\n    }\n\n    // Replace queue items.\n    const args = [\n      firstPIXOArg0,\n      firstTransformArg0,\n      firstTransformArg3,\n      positions,\n    ];\n    fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);\n    argsArray.splice(iFirstSave, count * 4, args);\n\n    return iFirstSave + 1;\n  }\n);\n\n// This replaces (beginText, setFont, setTextMatrix, showText, endText)+\n// sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+\n// sequences, if the font for each one is the same.\naddState(\n  InitialState,\n  [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],\n  null,\n  function iterateShowTextGroup(context, i) {\n    const fnArray = context.fnArray,\n      argsArray = context.argsArray;\n    const iFirstSave = context.iCurr - 4;\n    const pos = (i - iFirstSave) % 5;\n    switch (pos) {\n      case 0:\n        return fnArray[i] === OPS.beginText;\n      case 1:\n        return fnArray[i] === OPS.setFont;\n      case 2:\n        return fnArray[i] === OPS.setTextMatrix;\n      case 3:\n        if (fnArray[i] !== OPS.showText) {\n          return false;\n        }\n        const iFirstSetFont = context.iCurr - 3;\n        const firstSetFontArg0 = argsArray[iFirstSetFont][0];\n        const firstSetFontArg1 = argsArray[iFirstSetFont][1];\n        if (\n          argsArray[i][0] !== firstSetFontArg0 ||\n          argsArray[i][1] !== firstSetFontArg1\n        ) {\n          return false; // fonts don't match\n        }\n        return true;\n      case 4:\n        return fnArray[i] === OPS.endText;\n    }\n    throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`);\n  },\n  function (context, i) {\n    const MIN_CHARS_IN_BLOCK = 3;\n    const MAX_CHARS_IN_BLOCK = 1000;\n\n    const fnArray = context.fnArray,\n      argsArray = context.argsArray;\n    const curr = context.iCurr;\n    const iFirstBeginText = curr - 4;\n    const iFirstSetFont = curr - 3;\n    const iFirstSetTextMatrix = curr - 2;\n    const iFirstShowText = curr - 1;\n    const iFirstEndText = curr;\n    const firstSetFontArg0 = argsArray[iFirstSetFont][0];\n    const firstSetFontArg1 = argsArray[iFirstSetFont][1];\n\n    // At this point, i is the index of the first op past the last valid\n    // quintet.\n    let count = Math.min(\n      Math.floor((i - iFirstBeginText) / 5),\n      MAX_CHARS_IN_BLOCK\n    );\n    if (count < MIN_CHARS_IN_BLOCK) {\n      return i - ((i - iFirstBeginText) % 5);\n    }\n\n    // If the preceding quintet is (<something>, setFont, setTextMatrix,\n    // showText, endText), include that as well. (E.g. <something> might be\n    // |dependency|.)\n    let iFirst = iFirstBeginText;\n    if (\n      iFirstBeginText >= 4 &&\n      fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] &&\n      fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] &&\n      fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] &&\n      fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] &&\n      argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 &&\n      argsArray[iFirstBeginText - 4][1] === firstSetFontArg1\n    ) {\n      count++;\n      iFirst -= 5;\n    }\n\n    // Remove (endText, beginText, setFont) trios.\n    let iEndText = iFirst + 4;\n    for (let q = 1; q < count; q++) {\n      fnArray.splice(iEndText, 3);\n      argsArray.splice(iEndText, 3);\n      iEndText += 2;\n    }\n\n    return iEndText + 1;\n  }\n);\n\n// This replaces (save, transform, constructPath, restore)\n// sequences with |constructPath| operation.\naddState(\n  InitialState,\n  [OPS.save, OPS.transform, OPS.constructPath, OPS.restore],\n  context => {\n    const argsArray = context.argsArray;\n    const iFirstConstructPath = context.iCurr - 1;\n    const op = argsArray[iFirstConstructPath][0];\n\n    // When stroking the transform has to be applied to the line width too.\n    // So we can only optimize if the transform is an identity.\n    if (\n      op !== OPS.stroke &&\n      op !== OPS.closeStroke &&\n      op !== OPS.fillStroke &&\n      op !== OPS.eoFillStroke &&\n      op !== OPS.closeFillStroke &&\n      op !== OPS.closeEOFillStroke\n    ) {\n      return true;\n    }\n    const iFirstTransform = context.iCurr - 2;\n    const transform = argsArray[iFirstTransform];\n    return (\n      transform[0] === 1 &&\n      transform[1] === 0 &&\n      transform[2] === 0 &&\n      transform[3] === 1\n    );\n  },\n  () => false,\n  (context, i) => {\n    const { fnArray, argsArray } = context;\n    const curr = context.iCurr;\n    const iFirstSave = curr - 3;\n    const iFirstTransform = curr - 2;\n    const iFirstConstructPath = curr - 1;\n    const args = argsArray[iFirstConstructPath];\n    const transform = argsArray[iFirstTransform];\n    const [, [buffer], minMax] = args;\n\n    if (minMax) {\n      const newBBox = F32_BBOX_INIT.slice();\n      Util.axialAlignedBoundingBox(minMax, transform, newBBox);\n      minMax.set(newBBox);\n      for (let k = 0, kk = buffer.length; k < kk; ) {\n        switch (buffer[k++]) {\n          case DrawOPS.moveTo:\n          case DrawOPS.lineTo:\n            Util.applyTransform(buffer, transform, k);\n            k += 2;\n            break;\n          case DrawOPS.curveTo:\n            Util.applyTransformToBezier(buffer, transform, k);\n            k += 6;\n            break;\n        }\n      }\n    }\n    // Replace queue items.\n    fnArray.splice(iFirstSave, 4, OPS.constructPath);\n    argsArray.splice(iFirstSave, 4, args);\n\n    return iFirstSave + 1;\n  }\n);\n\nclass NullOptimizer {\n  constructor(queue) {\n    this.queue = queue;\n  }\n\n  _optimize() {}\n\n  push(fn, args) {\n    this.queue.fnArray.push(fn);\n    this.queue.argsArray.push(args);\n    this._optimize();\n  }\n\n  flush() {}\n\n  reset() {}\n}\n\nclass QueueOptimizer extends NullOptimizer {\n  constructor(queue) {\n    super(queue);\n    this.state = null;\n    this.context = {\n      iCurr: 0,\n      fnArray: queue.fnArray,\n      argsArray: queue.argsArray,\n      isOffscreenCanvasSupported: OperatorList.isOffscreenCanvasSupported,\n    };\n    this.match = null;\n    this.lastProcessed = 0;\n  }\n\n  _optimize() {\n    // Process new fnArray item(s) chunk.\n    const fnArray = this.queue.fnArray;\n    let i = this.lastProcessed,\n      ii = fnArray.length;\n    let state = this.state;\n    let match = this.match;\n    if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {\n      // Micro-optimization for the common case: last item is not\n      // optimizable, just skipping it.\n      this.lastProcessed = ii;\n      return;\n    }\n\n    const context = this.context;\n    while (i < ii) {\n      if (match) {\n        // Already find a block of potentially optimizable items, iterating...\n        const iterate = (0, match.iterateFn)(context, i);\n        if (iterate) {\n          i++;\n          continue;\n        }\n        // Found last items for the block, processing...\n        i = (0, match.processFn)(context, i + 1);\n        ii = fnArray.length;\n        match = null;\n        state = null;\n        if (i >= ii) {\n          break;\n        }\n      }\n      // Find the potentially optimizable items.\n      state = (state || InitialState)[fnArray[i]];\n      if (!state || Array.isArray(state)) {\n        i++;\n        continue;\n      }\n      // Found a start of the block based on addState rules.\n      context.iCurr = i;\n      i++;\n      if (state.checkFn && !(0, state.checkFn)(context)) {\n        // Check failed, continue search...\n        state = null;\n        continue;\n      }\n      match = state;\n      state = null;\n    }\n    this.state = state;\n    this.match = match;\n    this.lastProcessed = i;\n  }\n\n  flush() {\n    while (this.match) {\n      const length = this.queue.fnArray.length;\n      this.lastProcessed = (0, this.match.processFn)(this.context, length);\n      this.match = null;\n      this.state = null;\n      // Repeat optimization until all chunks are exhausted.\n      this._optimize();\n    }\n  }\n\n  reset() {\n    this.state = null;\n    this.match = null;\n    this.lastProcessed = 0;\n  }\n}\n\nclass OperatorList {\n  static CHUNK_SIZE = 1000;\n\n  // Close to chunk size.\n  static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5;\n\n  static isOffscreenCanvasSupported = false;\n\n  constructor(intent = 0, streamSink) {\n    this._streamSink = streamSink;\n    this.fnArray = [];\n    this.argsArray = [];\n    this.optimizer =\n      streamSink && !(intent & RenderingIntentFlag.OPLIST)\n        ? new QueueOptimizer(this)\n        : new NullOptimizer(this);\n    this.dependencies = new Set();\n    this._totalLength = 0;\n    this.weight = 0;\n    this._resolved = streamSink ? null : Promise.resolve();\n  }\n\n  static setOptions({ isOffscreenCanvasSupported }) {\n    this.isOffscreenCanvasSupported = isOffscreenCanvasSupported;\n  }\n\n  get length() {\n    return this.argsArray.length;\n  }\n\n  get ready() {\n    return this._resolved || this._streamSink.ready;\n  }\n\n  /**\n   * @type {number} The total length of the entire operator list, since\n   *                `this.length === 0` after flushing.\n   */\n  get totalLength() {\n    return this._totalLength + this.length;\n  }\n\n  addOp(fn, args) {\n    this.optimizer.push(fn, args);\n    this.weight++;\n    if (this._streamSink) {\n      if (this.weight >= OperatorList.CHUNK_SIZE) {\n        this.flush();\n      } else if (\n        this.weight >= OperatorList.CHUNK_SIZE_ABOUT &&\n        (fn === OPS.restore || fn === OPS.endText)\n      ) {\n        // Heuristic to flush on boundary of restore or endText.\n        this.flush();\n      }\n    }\n  }\n\n  addImageOps(fn, args, optionalContent, hasMask = false) {\n    if (hasMask) {\n      this.addOp(OPS.save);\n      this.addOp(OPS.setGState, [[[\"SMask\", false]]]);\n    }\n    if (optionalContent !== undefined) {\n      this.addOp(OPS.beginMarkedContentProps, [\"OC\", optionalContent]);\n    }\n\n    this.addOp(fn, args);\n\n    if (optionalContent !== undefined) {\n      this.addOp(OPS.endMarkedContent, []);\n    }\n    if (hasMask) {\n      this.addOp(OPS.restore);\n    }\n  }\n\n  addDependency(dependency) {\n    if (this.dependencies.has(dependency)) {\n      return;\n    }\n    this.dependencies.add(dependency);\n    this.addOp(OPS.dependency, [dependency]);\n  }\n\n  addDependencies(dependencies) {\n    for (const dependency of dependencies) {\n      this.addDependency(dependency);\n    }\n  }\n\n  addOpList(opList) {\n    if (!(opList instanceof OperatorList)) {\n      warn('addOpList - ignoring invalid \"opList\" parameter.');\n      return;\n    }\n    for (const dependency of opList.dependencies) {\n      this.dependencies.add(dependency);\n    }\n    for (let i = 0, ii = opList.length; i < ii; i++) {\n      this.addOp(opList.fnArray[i], opList.argsArray[i]);\n    }\n  }\n\n  getIR() {\n    return {\n      fnArray: this.fnArray,\n      argsArray: this.argsArray,\n      length: this.length,\n    };\n  }\n\n  get _transfers() {\n    const transfers = [];\n    const { fnArray, argsArray, length } = this;\n    for (let i = 0; i < length; i++) {\n      switch (fnArray[i]) {\n        case OPS.paintInlineImageXObject:\n        case OPS.paintInlineImageXObjectGroup:\n        case OPS.paintImageMaskXObject: {\n          const { bitmap, data } = argsArray[i][0]; // First parameter in imgData.\n          if (bitmap || data?.buffer) {\n            transfers.push(bitmap || data.buffer);\n          }\n          break;\n        }\n        case OPS.constructPath: {\n          const [, [data], minMax] = argsArray[i];\n          if (data) {\n            transfers.push(data.buffer, minMax.buffer);\n          }\n          break;\n        }\n        case OPS.paintFormXObjectBegin:\n          const [matrix, bbox] = argsArray[i];\n          if (matrix) {\n            transfers.push(matrix.buffer);\n          }\n          if (bbox) {\n            transfers.push(bbox.buffer);\n          }\n          break;\n        case OPS.setTextMatrix:\n          transfers.push(argsArray[i][0].buffer);\n          break;\n      }\n    }\n    return transfers;\n  }\n\n  flush(lastChunk = false, separateAnnots = null) {\n    this.optimizer.flush();\n    const length = this.length;\n    this._totalLength += length;\n\n    this._streamSink.enqueue(\n      {\n        fnArray: this.fnArray,\n        argsArray: this.argsArray,\n        lastChunk,\n        separateAnnots,\n        length,\n      },\n      1,\n      this._transfers\n    );\n\n    this.dependencies.clear();\n    this.fnArray.length = 0;\n    this.argsArray.length = 0;\n    this.weight = 0;\n    this.optimizer.reset();\n  }\n}\n\n/**\n * A subclass of OperatorList that checks whether added group or pattern\n * operations require being drawn in isolation (i.e. on a separate canvas).\n * A group/pattern needs isolation when it uses non-default compositing\n * (blend mode) or a soft mask. The result is exposed via `needsIsolation`.\n *\n * `hasSoftMask` separately flags the use of a soft mask: unlike a plain blend\n * mode, which a non-isolated group can apply directly against its backdrop, a\n * soft mask always requires a real intermediate canvas (see bug 1873345).\n */\nclass CheckedOperatorList extends OperatorList {\n  needsIsolation = false;\n\n  hasSoftMask = false;\n\n  addOp(fn, args) {\n    if (!this.needsIsolation || !this.hasSoftMask) {\n      if (fn === OPS.beginGroup) {\n        // Propagate isolation only if the nested group itself needs it.\n        this.needsIsolation ||= args[0].needsIsolation;\n        this.hasSoftMask ||= args[0].hasSoftMask;\n      } else if (fn === OPS.setGState) {\n        for (const [key, val] of args[0]) {\n          if (key === \"BM\" && val !== \"source-over\") {\n            this.needsIsolation = true;\n          } else if (key === \"SMask\" && val !== false) {\n            this.needsIsolation = true;\n            this.hasSoftMask = true;\n          }\n        }\n      }\n    }\n    super.addOp(fn, args);\n  }\n}\n\nexport { CheckedOperatorList, OperatorList };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  BBOX_INIT,\n  FormatError,\n  info,\n  MeshFigureType,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  IDENTITY_MATRIX,\n  isBooleanArray,\n  isNumberArray,\n  lookupMatrix,\n  lookupNormalRect,\n  lookupRect,\n  MissingDataException,\n} from \"./core_utils.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { ColorSpaceUtils } from \"./colorspace_utils.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\nconst ShadingType = {\n  FUNCTION_BASED: 1,\n  AXIAL: 2,\n  RADIAL: 3,\n  FREE_FORM_MESH: 4,\n  LATTICE_FORM_MESH: 5,\n  COONS_PATCH_MESH: 6,\n  TENSOR_PATCH_MESH: 7,\n};\n\nclass Pattern {\n  // eslint-disable-next-line no-unused-private-class-members\n  static #hasGPU = false;\n\n  constructor() {\n    unreachable(\"Cannot initialize Pattern.\");\n  }\n\n  static setOptions({ hasGPU }) {\n    this.#hasGPU = hasGPU;\n  }\n\n  static parseShading(\n    shading,\n    xref,\n    res,\n    pdfFunctionFactory,\n    globalColorSpaceCache,\n    localColorSpaceCache\n  ) {\n    const dict = shading instanceof BaseStream ? shading.dict : shading;\n    const type = dict.get(\"ShadingType\");\n\n    try {\n      switch (type) {\n        case ShadingType.FUNCTION_BASED:\n          return new FunctionBasedShading(\n            dict,\n            xref,\n            res,\n            pdfFunctionFactory,\n            globalColorSpaceCache,\n            localColorSpaceCache\n          );\n        case ShadingType.AXIAL:\n        case ShadingType.RADIAL:\n          return new RadialAxialShading(\n            dict,\n            xref,\n            res,\n            pdfFunctionFactory,\n            globalColorSpaceCache,\n            localColorSpaceCache\n          );\n        case ShadingType.FREE_FORM_MESH:\n        case ShadingType.LATTICE_FORM_MESH:\n        case ShadingType.COONS_PATCH_MESH:\n        case ShadingType.TENSOR_PATCH_MESH:\n          return new MeshShading(\n            shading,\n            xref,\n            res,\n            pdfFunctionFactory,\n            globalColorSpaceCache,\n            localColorSpaceCache\n          );\n        default:\n          throw new FormatError(\"Unsupported ShadingType: \" + type);\n      }\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(ex);\n      return new DummyShading();\n    }\n  }\n}\n\nclass BaseShading {\n  // A small number to offset the first/last color stops so we can insert ones\n  // to support extend. Number.MIN_VALUE is too small and breaks the extend.\n  static SMALL_NUMBER = 1e-6;\n\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseShading\n    ) {\n      unreachable(\"Cannot initialize BaseShading.\");\n    }\n  }\n\n  getIR() {\n    unreachable(\"Abstract method `getIR` called.\");\n  }\n}\n\n// Radial and axial shading have very similar implementations\n// If needed, the implementations can be broken into two classes.\nclass RadialAxialShading extends BaseShading {\n  constructor(\n    dict,\n    xref,\n    resources,\n    pdfFunctionFactory,\n    globalColorSpaceCache,\n    localColorSpaceCache\n  ) {\n    super();\n    this.shadingType = dict.get(\"ShadingType\");\n    let coordsLen = 0;\n    if (this.shadingType === ShadingType.AXIAL) {\n      coordsLen = 4;\n    } else if (this.shadingType === ShadingType.RADIAL) {\n      coordsLen = 6;\n    }\n    this.coordsArr = dict.getArray(\"Coords\");\n    if (!isNumberArray(this.coordsArr, coordsLen)) {\n      throw new FormatError(\"RadialAxialShading: Invalid /Coords array.\");\n    }\n    const cs = ColorSpaceUtils.parse({\n      cs: dict.getRaw(\"CS\") || dict.getRaw(\"ColorSpace\"),\n      xref,\n      resources,\n      pdfFunctionFactory,\n      globalColorSpaceCache,\n      localColorSpaceCache,\n    });\n    this.bbox = lookupNormalRect(dict.getArray(\"BBox\"), null);\n\n    let t0 = 0.0,\n      t1 = 1.0;\n    const domainArr = dict.getArray(\"Domain\");\n    if (isNumberArray(domainArr, 2)) {\n      [t0, t1] = domainArr;\n    }\n\n    let extendStart = false,\n      extendEnd = false;\n    const extendArr = dict.getArray(\"Extend\");\n    if (isBooleanArray(extendArr, 2)) {\n      [extendStart, extendEnd] = extendArr;\n    }\n\n    this.extendStart = extendStart;\n    this.extendEnd = extendEnd;\n\n    const fnObj = dict.getRaw(\"Function\");\n    const fn = pdfFunctionFactory.create(fnObj, /* parseArray = */ true);\n\n    // Use lcm(1,2,3,4,5,6,7,8,10) = 840 (including 9 increases this to 2520)\n    // to catch evenly spaced stops. oeis.org/A003418\n    const NUMBER_OF_SAMPLES = 840;\n    const step = (t1 - t0) / NUMBER_OF_SAMPLES;\n\n    const colorStops = (this.colorStops = []);\n\n    // Protect against bad domains.\n    if (t0 >= t1 || step <= 0) {\n      // Acrobat doesn't seem to handle these cases so we'll ignore for\n      // now.\n      info(\"Bad shading domain.\");\n      return;\n    }\n\n    const color = new Float32Array(cs.numComps),\n      ratio = new Float32Array(1);\n\n    let iBase = 0;\n    ratio[0] = t0;\n    fn(ratio, 0, color, 0);\n    const rgbBuffer = new Uint8ClampedArray(3);\n    cs.getRgb(color, 0, rgbBuffer);\n    let [rBase, gBase, bBase] = rgbBuffer;\n    colorStops.push([0, Util.makeHexColor(rBase, gBase, bBase)]);\n\n    let iPrev = 1;\n    ratio[0] = t0 + step;\n    fn(ratio, 0, color, 0);\n    cs.getRgb(color, 0, rgbBuffer);\n    let [rPrev, gPrev, bPrev] = rgbBuffer;\n\n    // Slopes are rise / run.\n    // A max slope is from the least value the base component could have been\n    // to the greatest value the current component could have been.\n    // A min slope is from the greatest value the base component could have been\n    // to the least value the current component could have been.\n    // Each component could have been rounded up to .5 from its original value\n    // so the conservative deltas are +-1 (+-.5 for base and -+.5 for current).\n\n    // The run is iPrev - iBase = 1, so omitted.\n    let maxSlopeR = rPrev - rBase + 1;\n    let maxSlopeG = gPrev - gBase + 1;\n    let maxSlopeB = bPrev - bBase + 1;\n    let minSlopeR = rPrev - rBase - 1;\n    let minSlopeG = gPrev - gBase - 1;\n    let minSlopeB = bPrev - bBase - 1;\n\n    for (let i = 2; i < NUMBER_OF_SAMPLES; i++) {\n      ratio[0] = t0 + i * step;\n      fn(ratio, 0, color, 0);\n      cs.getRgb(color, 0, rgbBuffer);\n      const [r, g, b] = rgbBuffer;\n\n      // Keep going if the maximum minimum slope <= the minimum maximum slope.\n      // Otherwise add a rgbPrev color stop and make it the new base.\n\n      const run = i - iBase;\n      maxSlopeR = Math.min(maxSlopeR, (r - rBase + 1) / run);\n      maxSlopeG = Math.min(maxSlopeG, (g - gBase + 1) / run);\n      maxSlopeB = Math.min(maxSlopeB, (b - bBase + 1) / run);\n      minSlopeR = Math.max(minSlopeR, (r - rBase - 1) / run);\n      minSlopeG = Math.max(minSlopeG, (g - gBase - 1) / run);\n      minSlopeB = Math.max(minSlopeB, (b - bBase - 1) / run);\n\n      const slopesExist =\n        minSlopeR <= maxSlopeR &&\n        minSlopeG <= maxSlopeG &&\n        minSlopeB <= maxSlopeB;\n\n      if (!slopesExist) {\n        const cssColor = Util.makeHexColor(rPrev, gPrev, bPrev);\n        colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]);\n\n        // TODO: When fn frequency is high (iPrev - iBase === 1 twice in a row),\n        // send the color space and function to do the sampling display side.\n\n        // The run is i - iPrev = 1, so omitted.\n        maxSlopeR = r - rPrev + 1;\n        maxSlopeG = g - gPrev + 1;\n        maxSlopeB = b - bPrev + 1;\n        minSlopeR = r - rPrev - 1;\n        minSlopeG = g - gPrev - 1;\n        minSlopeB = b - bPrev - 1;\n\n        iBase = iPrev;\n        rBase = rPrev;\n        gBase = gPrev;\n        bBase = bPrev;\n      }\n\n      iPrev = i;\n      rPrev = r;\n      gPrev = g;\n      bPrev = b;\n    }\n    colorStops.push([1, Util.makeHexColor(rPrev, gPrev, bPrev)]);\n\n    const background = dict.has(\"Background\")\n      ? cs.getRgbHex(dict.get(\"Background\"), 0)\n      : \"transparent\";\n\n    if (!extendStart) {\n      // Insert a color stop at the front and offset the first real color stop\n      // so it doesn't conflict with the one we insert.\n      colorStops.unshift([0, background]);\n      colorStops[1][0] += BaseShading.SMALL_NUMBER;\n    }\n    if (!extendEnd) {\n      // Same idea as above in extendStart but for the end.\n      colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER;\n      colorStops.push([1, background]);\n    }\n\n    this.colorStops = colorStops;\n  }\n\n  getIR() {\n    const { coordsArr, shadingType } = this;\n    let type, p0, p1, r0, r1;\n    if (shadingType === ShadingType.AXIAL) {\n      p0 = [coordsArr[0], coordsArr[1]];\n      p1 = [coordsArr[2], coordsArr[3]];\n      r0 = null;\n      r1 = null;\n      type = \"axial\";\n    } else if (shadingType === ShadingType.RADIAL) {\n      p0 = [coordsArr[0], coordsArr[1]];\n      p1 = [coordsArr[3], coordsArr[4]];\n      r0 = coordsArr[2];\n      r1 = coordsArr[5];\n      type = \"radial\";\n    } else {\n      unreachable(`getPattern type unknown: ${shadingType}`);\n    }\n\n    return [\"RadialAxial\", type, this.bbox, this.colorStops, p0, p1, r0, r1];\n  }\n}\n\n// Helpers for MeshShading, which builds its mesh from a stream.\nfunction meshUpdateBounds(self) {\n  let minX = self.coords[0][0],\n    minY = self.coords[0][1],\n    maxX = minX,\n    maxY = minY;\n  for (let i = 1, ii = self.coords.length; i < ii; i++) {\n    const x = self.coords[i][0],\n      y = self.coords[i][1];\n    minX = minX > x ? x : minX;\n    minY = minY > y ? y : minY;\n    maxX = maxX < x ? x : maxX;\n    maxY = maxY < y ? y : maxY;\n  }\n  self.bounds = [minX, minY, maxX, maxY];\n}\n\nfunction meshPackData(self) {\n  let i, j, ii;\n\n  const coords = self.coords;\n  const coordsPacked = new Float32Array(coords.length * 2);\n  for (i = 0, j = 0, ii = coords.length; i < ii; i++) {\n    const xy = coords[i];\n    coordsPacked[j++] = xy[0];\n    coordsPacked[j++] = xy[1];\n  }\n  self.coords = coordsPacked;\n\n  // Stride 4 (RGB + 1 padding byte) so each color fits in one u32, letting\n  // the WebGPU vertex shader read colors as array<u32> without repacking.\n  const colors = self.colors;\n  const colorsPacked = new Uint8Array(colors.length * 4);\n  for (i = 0, j = 0, ii = colors.length; i < ii; i++) {\n    const c = colors[i];\n    colorsPacked[j++] = c[0];\n    colorsPacked[j++] = c[1];\n    colorsPacked[j++] = c[2];\n    j++; // alpha 鈥� unused, stays 0\n  }\n  self.colors = colorsPacked;\n\n  // Store raw vertex indices (not byte offsets) so the GPU shader can\n  // address coords / colors without knowing their strides, and so the\n  // arrays are transferable Uint32Arrays.\n  for (const figure of self.figures) {\n    figure.coords = new Uint32Array(figure.coords);\n    figure.colors = new Uint32Array(figure.colors);\n  }\n}\n\nfunction buildMeshVertexData(coords, colors, figures) {\n  // Count the total expanded vertex count first for a single allocation.\n  let vertexCount = 0;\n  for (const figure of figures) {\n    if (figure.type === MeshFigureType.TRIANGLES) {\n      vertexCount += figure.coords.length;\n    } else if (figure.type === MeshFigureType.LATTICE) {\n      const vpr = figure.verticesPerRow;\n      vertexCount +=\n        (Math.floor(figure.coords.length / vpr) - 1) * (vpr - 1) * 6;\n    }\n  }\n\n  // posData: 2 脳 float32 per vertex (raw PDF content-space x, y).\n  // colData: 4 脳 uint8 per vertex (r, g, b, unused).\n  const posData = new Float32Array(vertexCount * 2);\n  const colData = new Uint8Array(vertexCount * 4);\n  let pOff = 0,\n    cOff = 0;\n\n  const addVertex = (pi, ci) => {\n    posData[pOff++] = coords[pi * 2];\n    posData[pOff++] = coords[pi * 2 + 1];\n    colData[cOff++] = colors[ci * 4];\n    colData[cOff++] = colors[ci * 4 + 1];\n    colData[cOff++] = colors[ci * 4 + 2];\n    cOff++; // alpha padding\n  };\n\n  for (const figure of figures) {\n    const ps = figure.coords;\n    const cs = figure.colors;\n    if (figure.type === MeshFigureType.TRIANGLES) {\n      for (let i = 0, ii = ps.length; i < ii; i++) {\n        addVertex(ps[i], cs[i]);\n      }\n    } else if (figure.type === MeshFigureType.LATTICE) {\n      const vpr = figure.verticesPerRow;\n      const rows = Math.floor(ps.length / vpr) - 1;\n      const cols = vpr - 1;\n      for (let i = 0; i < rows; i++) {\n        let q = i * vpr;\n        for (let j = 0; j < cols; j++, q++) {\n          addVertex(ps[q], cs[q]);\n          addVertex(ps[q + 1], cs[q + 1]);\n          addVertex(ps[q + vpr], cs[q + vpr]);\n          addVertex(ps[q + vpr + 1], cs[q + vpr + 1]);\n          addVertex(ps[q + 1], cs[q + 1]);\n          addVertex(ps[q + vpr], cs[q + vpr]);\n        }\n      }\n    }\n  }\n\n  return { posData, colData, vertexCount };\n}\n\n// Type 1 shading: a 2-in, n-out function sampled over a rectangular domain.\nclass FunctionBasedShading extends BaseShading {\n  // Maximum grid steps per axis to avoid huge meshes.\n  static MAX_STEP_COUNT = 512;\n\n  constructor(\n    dict,\n    xref,\n    resources,\n    pdfFunctionFactory,\n    globalColorSpaceCache,\n    localColorSpaceCache\n  ) {\n    super();\n    this.bbox = lookupNormalRect(dict.getArray(\"BBox\"), null);\n\n    const cs = ColorSpaceUtils.parse({\n      cs: dict.getRaw(\"CS\") || dict.getRaw(\"ColorSpace\"),\n      xref,\n      resources,\n      pdfFunctionFactory,\n      globalColorSpaceCache,\n      localColorSpaceCache,\n    });\n    this.background = dict.has(\"Background\")\n      ? cs.getRgb(dict.get(\"Background\"), 0)\n      : null;\n\n    const fnObj = dict.getRaw(\"Function\");\n    if (!fnObj) {\n      throw new FormatError(\"FunctionBasedShading: missing /Function\");\n    }\n    const fn = pdfFunctionFactory.create(fnObj, /* parseArray = */ true);\n\n    // Domain [x0, x1, y0, y1]; defaults to [0, 1, 0, 1].\n    const [x0, x1, y0, y1] = lookupRect(dict.getArray(\"Domain\"), [0, 1, 0, 1]);\n\n    // Matrix maps shading (domain) space to user space; defaults to identity.\n    const matrix = lookupMatrix(dict.getArray(\"Matrix\"), IDENTITY_MATRIX);\n\n    // Transform the four domain corners to find the user-space bounding box.\n    this.bounds = BBOX_INIT.slice();\n    Util.axialAlignedBoundingBox([x0, y0, x1, y1], matrix, this.bounds);\n\n    const bboxW = this.bounds[2] - this.bounds[0];\n    const bboxH = this.bounds[3] - this.bounds[1];\n\n    // 1 step per user-space unit, capped for performance.\n    const stepsX = MathClamp(\n      Math.ceil(bboxW),\n      1,\n      FunctionBasedShading.MAX_STEP_COUNT\n    );\n    const stepsY = MathClamp(\n      Math.ceil(bboxH),\n      1,\n      FunctionBasedShading.MAX_STEP_COUNT\n    );\n\n    const verticesPerRow = stepsX + 1;\n    const totalVertices = (stepsY + 1) * verticesPerRow;\n    const coords = (this.coords = new Float32Array(totalVertices * 2));\n    const colors = (this.colors = new Uint8ClampedArray(totalVertices * 4));\n\n    const xyBuf = new Float32Array(2);\n    const colorBuf = new Float32Array(cs.numComps);\n    const rangeX = (x1 - x0) / stepsX;\n    const rangeY = (y1 - y0) / stepsY;\n    const halfStepX = rangeX / 2;\n    const halfStepY = rangeY / 2;\n    let coordOffset = 0;\n    let colorOffset = 0;\n    for (let row = 0; row <= stepsY; row++) {\n      const yDomain = y0 + rangeY * row;\n      // Evaluate half a step inside at boundary vertices to avoid a spurious\n      // strip for discontinuous functions; vertex positions stay unchanged.\n      xyBuf[1] = row === stepsY ? yDomain - halfStepY : yDomain;\n      for (let col = 0; col <= stepsX; col++) {\n        const xDomain = x0 + rangeX * col;\n        xyBuf[0] = col === stepsX ? xDomain - halfStepX : xDomain;\n        fn(xyBuf, 0, colorBuf, 0);\n        coords[coordOffset] = xDomain;\n        coords[coordOffset + 1] = yDomain;\n        Util.applyTransform(coords, matrix, coordOffset);\n        coordOffset += 2;\n\n        cs.getRgbItem(colorBuf, 0, colors, colorOffset);\n        colorOffset += 4; // alpha 鈥� unused, stays 0\n      }\n    }\n\n    const ps = new Uint32Array(totalVertices);\n    for (let i = 0; i < totalVertices; i++) {\n      ps[i] = i;\n    }\n    this.figures = [\n      {\n        type: MeshFigureType.LATTICE,\n        coords: ps,\n        colors: new Uint32Array(ps),\n        verticesPerRow,\n      },\n    ];\n  }\n\n  getIR() {\n    const { posData, colData, vertexCount } = buildMeshVertexData(\n      this.coords,\n      this.colors,\n      this.figures\n    );\n    return [\n      \"Mesh\",\n      ShadingType.FUNCTION_BASED,\n      posData,\n      colData,\n      vertexCount,\n      this.bounds,\n      this.bbox,\n      this.background,\n    ];\n  }\n}\n\n// All mesh shadings. For now, they will be presented as set of the triangles\n// to be drawn on the canvas and rgb color for each vertex.\nclass MeshStreamReader {\n  constructor(stream, context) {\n    this.stream = stream;\n    this.context = context;\n    this.buffer = 0;\n    this.bufferLength = 0;\n\n    const numComps = context.numComps;\n    this.tmpCompsBuf = new Float32Array(numComps);\n    const csNumComps = context.colorSpace.numComps;\n    this.tmpCsCompsBuf = context.colorFn\n      ? new Float32Array(csNumComps)\n      : this.tmpCompsBuf;\n  }\n\n  get hasData() {\n    if (this.stream.end) {\n      return this.stream.pos < this.stream.end;\n    }\n    if (this.bufferLength > 0) {\n      return true;\n    }\n    const nextByte = this.stream.getByte();\n    if (nextByte < 0) {\n      return false;\n    }\n    this.buffer = nextByte;\n    this.bufferLength = 8;\n    return true;\n  }\n\n  readBits(n) {\n    const { stream } = this;\n    let { buffer, bufferLength } = this;\n\n    if (n === 32) {\n      if (bufferLength === 0) {\n        return stream.getInt32() >>> 0;\n      }\n      buffer =\n        (buffer << 24) |\n        (stream.getByte() << 16) |\n        (stream.getByte() << 8) |\n        stream.getByte();\n      const nextByte = stream.getByte();\n      this.buffer = nextByte & ((1 << bufferLength) - 1);\n      return (\n        ((buffer << (8 - bufferLength)) |\n          ((nextByte & 0xff) >> bufferLength)) >>>\n        0\n      );\n    }\n    if (n === 8 && bufferLength === 0) {\n      return stream.getByte();\n    }\n    while (bufferLength < n) {\n      buffer = (buffer << 8) | stream.getByte();\n      bufferLength += 8;\n    }\n    bufferLength -= n;\n    this.bufferLength = bufferLength;\n    this.buffer = buffer & ((1 << bufferLength) - 1);\n    return buffer >> bufferLength;\n  }\n\n  align() {\n    this.buffer = 0;\n    this.bufferLength = 0;\n  }\n\n  readFlag() {\n    return this.readBits(this.context.bitsPerFlag);\n  }\n\n  readCoordinate() {\n    const { bitsPerCoordinate, decode } = this.context;\n    const xi = this.readBits(bitsPerCoordinate);\n    const yi = this.readBits(bitsPerCoordinate);\n    const scale =\n      bitsPerCoordinate < 32\n        ? 1 / ((1 << bitsPerCoordinate) - 1)\n        : 2.3283064365386963e-10; // 2 ^ -32\n    return [\n      xi * scale * (decode[1] - decode[0]) + decode[0],\n      yi * scale * (decode[3] - decode[2]) + decode[2],\n    ];\n  }\n\n  readComponents() {\n    const { bitsPerComponent, colorFn, colorSpace, decode, numComps } =\n      this.context;\n    const scale =\n      bitsPerComponent < 32\n        ? 1 / ((1 << bitsPerComponent) - 1)\n        : 2.3283064365386963e-10; // 2 ^ -32\n    const components = this.tmpCompsBuf;\n    for (let i = 0, j = 4; i < numComps; i++, j += 2) {\n      const ci = this.readBits(bitsPerComponent);\n      components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];\n    }\n    const color = this.tmpCsCompsBuf;\n    colorFn?.(components, 0, color, 0);\n    return colorSpace.getRgb(color, 0);\n  }\n}\n\nlet bCache = Object.create(null);\n\nfunction buildB(count) {\n  const lut = [];\n  for (let i = 0; i <= count; i++) {\n    const t = i / count,\n      t_ = 1 - t;\n    lut.push(\n      new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3])\n    );\n  }\n  return lut;\n}\nfunction getB(count) {\n  return (bCache[count] ||= buildB(count));\n}\n\nfunction clearPatternCaches() {\n  bCache = Object.create(null);\n}\n\nclass MeshShading extends BaseShading {\n  static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;\n\n  static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;\n\n  // Count of triangles per entire mesh bounds.\n  static TRIANGLE_DENSITY = 20;\n\n  constructor(\n    stream,\n    xref,\n    resources,\n    pdfFunctionFactory,\n    globalColorSpaceCache,\n    localColorSpaceCache\n  ) {\n    super();\n    if (!(stream instanceof BaseStream)) {\n      throw new FormatError(\"Mesh data is not a stream\");\n    }\n    const dict = stream.dict;\n    this.shadingType = dict.get(\"ShadingType\");\n    this.bbox = lookupNormalRect(dict.getArray(\"BBox\"), null);\n    const cs = ColorSpaceUtils.parse({\n      cs: dict.getRaw(\"CS\") || dict.getRaw(\"ColorSpace\"),\n      xref,\n      resources,\n      pdfFunctionFactory,\n      globalColorSpaceCache,\n      localColorSpaceCache,\n    });\n    this.background = dict.has(\"Background\")\n      ? cs.getRgb(dict.get(\"Background\"), 0)\n      : null;\n\n    const fnObj = dict.getRaw(\"Function\");\n    const fn = fnObj\n      ? pdfFunctionFactory.create(fnObj, /* parseArray = */ true)\n      : null;\n\n    this.coords = [];\n    this.colors = [];\n    this.figures = [];\n\n    const decodeContext = {\n      bitsPerCoordinate: dict.get(\"BitsPerCoordinate\"),\n      bitsPerComponent: dict.get(\"BitsPerComponent\"),\n      bitsPerFlag: dict.get(\"BitsPerFlag\"),\n      decode: dict.getArray(\"Decode\"),\n      colorFn: fn,\n      colorSpace: cs,\n      numComps: fn ? 1 : cs.numComps,\n    };\n    const reader = new MeshStreamReader(stream, decodeContext);\n\n    let patchMesh = false;\n    switch (this.shadingType) {\n      case ShadingType.FREE_FORM_MESH:\n        this._decodeType4Shading(reader);\n        break;\n      case ShadingType.LATTICE_FORM_MESH:\n        const verticesPerRow = dict.get(\"VerticesPerRow\") | 0;\n        if (verticesPerRow < 2) {\n          throw new FormatError(\"Invalid VerticesPerRow\");\n        }\n        this._decodeType5Shading(reader, verticesPerRow);\n        break;\n      case ShadingType.COONS_PATCH_MESH:\n        this._decodeType6Shading(reader);\n        patchMesh = true;\n        break;\n      case ShadingType.TENSOR_PATCH_MESH:\n        this._decodeType7Shading(reader);\n        patchMesh = true;\n        break;\n      default:\n        unreachable(\"Unsupported mesh type.\");\n        break;\n    }\n\n    if (patchMesh) {\n      // Dirty bounds calculation, to determine how dense the triangles will be.\n      this._updateBounds();\n      for (let i = 0, ii = this.figures.length; i < ii; i++) {\n        this._buildFigureFromPatch(i);\n      }\n    }\n    // Calculate bounds.\n    this._updateBounds();\n\n    this._packData();\n  }\n\n  _decodeType4Shading(reader) {\n    const coords = this.coords;\n    const colors = this.colors;\n    const operators = [];\n    const ps = []; // not maintaining cs since that will match ps\n    let verticesLeft = 0; // assuming we have all data to start a new triangle\n    while (reader.hasData) {\n      const f = reader.readFlag();\n      const coord = reader.readCoordinate();\n      const color = reader.readComponents();\n      if (verticesLeft === 0) {\n        // ignoring flags if we started a triangle\n        if (!(0 <= f && f <= 2)) {\n          throw new FormatError(\"Unknown type4 flag\");\n        }\n        switch (f) {\n          case 0:\n            verticesLeft = 3;\n            break;\n          case 1:\n            ps.push(ps.at(-2), ps.at(-1));\n            verticesLeft = 1;\n            break;\n          case 2:\n            ps.push(ps.at(-3), ps.at(-1));\n            verticesLeft = 1;\n            break;\n        }\n        operators.push(f);\n      }\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n      verticesLeft--;\n\n      reader.align();\n    }\n    this.figures.push({\n      type: MeshFigureType.TRIANGLES,\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps),\n    });\n  }\n\n  _decodeType5Shading(reader, verticesPerRow) {\n    const coords = this.coords;\n    const colors = this.colors;\n    const ps = []; // not maintaining cs since that will match ps\n    while (reader.hasData) {\n      const coord = reader.readCoordinate();\n      const color = reader.readComponents();\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n    }\n    this.figures.push({\n      type: MeshFigureType.LATTICE,\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps),\n      verticesPerRow,\n    });\n  }\n\n  _decodeType6Shading(reader) {\n    // A special case of Type 7. The p11, p12, p21, p22 automatically filled\n    const coords = this.coords;\n    const colors = this.colors;\n    const ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33\n    const cs = new Int32Array(4); // c00, c30, c03, c33\n    while (reader.hasData) {\n      const f = reader.readFlag();\n      if (!(0 <= f && f <= 3)) {\n        throw new FormatError(\"Unknown type6 flag\");\n      }\n      const pi = coords.length;\n      for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      const ci = colors.length;\n      for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      let tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        // prettier-ignore\n        case 0:\n          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;\n          ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 7;\n          ps[ 4] = pi + 1; /* calculated below              */ ps[ 7] = pi + 8;\n          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;\n          cs[2] = ci + 1; cs[3] = ci + 2;\n          cs[0] = ci;     cs[1] = ci + 3;\n          break;\n        // prettier-ignore\n        case 1:\n          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];\n          ps[12] = tmp4; ps[13] = pi + 0;  ps[14] = pi + 1;  ps[15] = pi + 2;\n          ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 3;\n          ps[ 4] = tmp2; /* calculated below              */ ps[ 7] = pi + 4;\n          ps[ 0] = tmp1; ps[ 1] = pi + 7;   ps[ 2] = pi + 6; ps[ 3] = pi + 5;\n          tmp1 = cs[2]; tmp2 = cs[3];\n          cs[2] = tmp2;   cs[3] = ci;\n          cs[0] = tmp1;   cs[1] = ci + 1;\n          break;\n        // prettier-ignore\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3];  ps[13] = pi + 0; ps[14] = pi + 1;   ps[15] = pi + 2;\n          ps[ 8] = ps[7];  /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 3;\n          ps[ 4] = tmp2;   /* calculated below              */ ps[ 7] = pi + 4;\n          ps[ 0] = tmp1;  ps[ 1] = pi + 7;   ps[ 2] = pi + 6;  ps[ 3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1]; cs[3] = ci;\n          cs[0] = tmp1;  cs[1] = ci + 1;\n          break;\n        // prettier-ignore\n        case 3:\n          ps[12] = ps[0];  ps[13] = pi + 0;   ps[14] = pi + 1; ps[15] = pi + 2;\n          ps[ 8] = ps[1];  /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 3;\n          ps[ 4] = ps[2];  /* calculated below              */ ps[ 7] = pi + 4;\n          ps[ 0] = ps[3];  ps[ 1] = pi + 7;   ps[ 2] = pi + 6; ps[ 3] = pi + 5;\n          cs[2] = cs[0]; cs[3] = ci;\n          cs[0] = cs[1]; cs[1] = ci + 1;\n          break;\n      }\n      // set p11, p12, p21, p22\n      ps[5] = coords.length;\n      coords.push([\n        (-4 * coords[ps[0]][0] -\n          coords[ps[15]][0] +\n          6 * (coords[ps[4]][0] + coords[ps[1]][0]) -\n          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +\n          3 * (coords[ps[13]][0] + coords[ps[7]][0])) /\n          9,\n        (-4 * coords[ps[0]][1] -\n          coords[ps[15]][1] +\n          6 * (coords[ps[4]][1] + coords[ps[1]][1]) -\n          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +\n          3 * (coords[ps[13]][1] + coords[ps[7]][1])) /\n          9,\n      ]);\n      ps[6] = coords.length;\n      coords.push([\n        (-4 * coords[ps[3]][0] -\n          coords[ps[12]][0] +\n          6 * (coords[ps[2]][0] + coords[ps[7]][0]) -\n          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +\n          3 * (coords[ps[4]][0] + coords[ps[14]][0])) /\n          9,\n        (-4 * coords[ps[3]][1] -\n          coords[ps[12]][1] +\n          6 * (coords[ps[2]][1] + coords[ps[7]][1]) -\n          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +\n          3 * (coords[ps[4]][1] + coords[ps[14]][1])) /\n          9,\n      ]);\n      ps[9] = coords.length;\n      coords.push([\n        (-4 * coords[ps[12]][0] -\n          coords[ps[3]][0] +\n          6 * (coords[ps[8]][0] + coords[ps[13]][0]) -\n          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +\n          3 * (coords[ps[11]][0] + coords[ps[1]][0])) /\n          9,\n        (-4 * coords[ps[12]][1] -\n          coords[ps[3]][1] +\n          6 * (coords[ps[8]][1] + coords[ps[13]][1]) -\n          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +\n          3 * (coords[ps[11]][1] + coords[ps[1]][1])) /\n          9,\n      ]);\n      ps[10] = coords.length;\n      coords.push([\n        (-4 * coords[ps[15]][0] -\n          coords[ps[0]][0] +\n          6 * (coords[ps[11]][0] + coords[ps[14]][0]) -\n          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +\n          3 * (coords[ps[2]][0] + coords[ps[8]][0])) /\n          9,\n        (-4 * coords[ps[15]][1] -\n          coords[ps[0]][1] +\n          6 * (coords[ps[11]][1] + coords[ps[14]][1]) -\n          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +\n          3 * (coords[ps[2]][1] + coords[ps[8]][1])) /\n          9,\n      ]);\n      this.figures.push({\n        type: MeshFigureType.PATCH,\n        coords: new Int32Array(ps), // making copies of ps and cs\n        colors: new Int32Array(cs),\n      });\n    }\n  }\n\n  _decodeType7Shading(reader) {\n    const coords = this.coords;\n    const colors = this.colors;\n    const ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33\n    const cs = new Int32Array(4); // c00, c30, c03, c33\n    while (reader.hasData) {\n      const f = reader.readFlag();\n      if (!(0 <= f && f <= 3)) {\n        throw new FormatError(\"Unknown type7 flag\");\n      }\n      const pi = coords.length;\n      for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      const ci = colors.length;\n      for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      let tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        // prettier-ignore\n        case 0:\n          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;\n          ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7;\n          ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8;\n          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;\n          cs[2] = ci + 1; cs[3] = ci + 2;\n          cs[0] = ci;     cs[1] = ci + 3;\n          break;\n        // prettier-ignore\n        case 1:\n          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];\n          ps[12] = tmp4;   ps[13] = pi + 0;  ps[14] = pi + 1;  ps[15] = pi + 2;\n          ps[ 8] = tmp3;   ps[ 9] = pi + 9;  ps[10] = pi + 10; ps[11] = pi + 3;\n          ps[ 4] = tmp2;   ps[ 5] = pi + 8;  ps[ 6] = pi + 11; ps[ 7] = pi + 4;\n          ps[ 0] = tmp1;   ps[ 1] = pi + 7;  ps[ 2] = pi + 6;  ps[ 3] = pi + 5;\n          tmp1 = cs[2]; tmp2 = cs[3];\n          cs[2] = tmp2;   cs[3] = ci;\n          cs[0] = tmp1;   cs[1] = ci + 1;\n          break;\n        // prettier-ignore\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1;  ps[15] = pi + 2;\n          ps[ 8] = ps[7]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3;\n          ps[ 4] = tmp2;  ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4;\n          ps[ 0] = tmp1;  ps[ 1] = pi + 7; ps[ 2] = pi + 6;  ps[ 3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1]; cs[3] = ci;\n          cs[0] = tmp1;  cs[1] = ci + 1;\n          break;\n        // prettier-ignore\n        case 3:\n          ps[12] = ps[0];  ps[13] = pi + 0;  ps[14] = pi + 1;  ps[15] = pi + 2;\n          ps[ 8] = ps[1];  ps[ 9] = pi + 9;  ps[10] = pi + 10; ps[11] = pi + 3;\n          ps[ 4] = ps[2];  ps[ 5] = pi + 8;  ps[ 6] = pi + 11; ps[ 7] = pi + 4;\n          ps[ 0] = ps[3];  ps[ 1] = pi + 7;  ps[ 2] = pi + 6;  ps[ 3] = pi + 5;\n          cs[2] = cs[0]; cs[3] = ci;\n          cs[0] = cs[1]; cs[1] = ci + 1;\n          break;\n      }\n      this.figures.push({\n        type: MeshFigureType.PATCH,\n        coords: new Int32Array(ps), // making copies of ps and cs\n        colors: new Int32Array(cs),\n      });\n    }\n  }\n\n  _buildFigureFromPatch(index) {\n    const figure = this.figures[index];\n    assert(\n      figure.type === MeshFigureType.PATCH,\n      \"Unexpected patch mesh figure\"\n    );\n\n    const coords = this.coords,\n      colors = this.colors;\n    const pi = figure.coords;\n    const ci = figure.colors;\n\n    const figureMinX = Math.min(\n      coords[pi[0]][0],\n      coords[pi[3]][0],\n      coords[pi[12]][0],\n      coords[pi[15]][0]\n    );\n    const figureMinY = Math.min(\n      coords[pi[0]][1],\n      coords[pi[3]][1],\n      coords[pi[12]][1],\n      coords[pi[15]][1]\n    );\n    const figureMaxX = Math.max(\n      coords[pi[0]][0],\n      coords[pi[3]][0],\n      coords[pi[12]][0],\n      coords[pi[15]][0]\n    );\n    const figureMaxY = Math.max(\n      coords[pi[0]][1],\n      coords[pi[3]][1],\n      coords[pi[12]][1],\n      coords[pi[15]][1]\n    );\n    let splitXBy = Math.ceil(\n      ((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY) /\n        (this.bounds[2] - this.bounds[0])\n    );\n    splitXBy = MathClamp(\n      splitXBy,\n      MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT,\n      MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT\n    );\n    let splitYBy = Math.ceil(\n      ((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY) /\n        (this.bounds[3] - this.bounds[1])\n    );\n    splitYBy = MathClamp(\n      splitYBy,\n      MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT,\n      MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT\n    );\n\n    const verticesPerRow = splitXBy + 1;\n    const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);\n    const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);\n    let k = 0;\n    const cl = new Uint8Array(3),\n      cr = new Uint8Array(3);\n    const c0 = colors[ci[0]],\n      c1 = colors[ci[1]],\n      c2 = colors[ci[2]],\n      c3 = colors[ci[3]];\n    const bRow = getB(splitYBy),\n      bCol = getB(splitXBy);\n    for (let row = 0; row <= splitYBy; row++) {\n      cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0;\n      cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0;\n      cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0;\n\n      cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0;\n      cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0;\n      cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0;\n\n      for (let col = 0; col <= splitXBy; col++, k++) {\n        if (\n          (row === 0 || row === splitYBy) &&\n          (col === 0 || col === splitXBy)\n        ) {\n          continue;\n        }\n        let x = 0,\n          y = 0;\n        let q = 0;\n        for (let i = 0; i <= 3; i++) {\n          for (let j = 0; j <= 3; j++, q++) {\n            const m = bRow[row][i] * bCol[col][j];\n            x += coords[pi[q]][0] * m;\n            y += coords[pi[q]][1] * m;\n          }\n        }\n        figureCoords[k] = coords.length;\n        coords.push([x, y]);\n        figureColors[k] = colors.length;\n        const newColor = new Uint8Array(3);\n        newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0;\n        newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0;\n        newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0;\n        colors.push(newColor);\n      }\n    }\n    figureCoords[0] = pi[0];\n    figureColors[0] = ci[0];\n    figureCoords[splitXBy] = pi[3];\n    figureColors[splitXBy] = ci[1];\n    figureCoords[verticesPerRow * splitYBy] = pi[12];\n    figureColors[verticesPerRow * splitYBy] = ci[2];\n    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];\n    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];\n\n    this.figures[index] = {\n      type: MeshFigureType.LATTICE,\n      coords: figureCoords,\n      colors: figureColors,\n      verticesPerRow,\n    };\n  }\n\n  _updateBounds() {\n    meshUpdateBounds(this);\n  }\n\n  _packData() {\n    meshPackData(this);\n  }\n\n  getIR() {\n    const { posData, colData, vertexCount } = buildMeshVertexData(\n      this.coords,\n      this.colors,\n      this.figures\n    );\n    return [\n      \"Mesh\",\n      this.shadingType,\n      posData,\n      colData,\n      vertexCount,\n      this.bounds,\n      this.bbox,\n      this.background,\n    ];\n  }\n}\n\nclass DummyShading extends BaseShading {\n  getIR() {\n    return [\"Dummy\"];\n  }\n}\n\nfunction getTilingPatternIR(operatorList, dict, color, needsIsolation = true) {\n  const matrix = lookupMatrix(dict.getArray(\"Matrix\"), IDENTITY_MATRIX);\n  const bbox = lookupNormalRect(dict.getArray(\"BBox\"), null);\n  // Ensure that the pattern has a non-zero width and height, to prevent errors\n  // in `pattern_helper.js` (fixes issue8330.pdf).\n  if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {\n    throw new FormatError(`Invalid getTilingPatternIR /BBox array.`);\n  }\n  const xstep = dict.get(\"XStep\");\n  if (typeof xstep !== \"number\") {\n    throw new FormatError(`Invalid getTilingPatternIR /XStep value.`);\n  }\n  const ystep = dict.get(\"YStep\");\n  if (typeof ystep !== \"number\") {\n    throw new FormatError(`Invalid getTilingPatternIR /YStep value.`);\n  }\n  const paintType = dict.get(\"PaintType\");\n  if (!Number.isInteger(paintType)) {\n    throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`);\n  }\n  const tilingType = dict.get(\"TilingType\");\n  if (!Number.isInteger(tilingType)) {\n    throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`);\n  }\n\n  return [\n    \"TilingPattern\",\n    color,\n    operatorList,\n    matrix,\n    bbox,\n    xstep,\n    ystep,\n    paintType,\n    tilingType,\n    needsIsolation,\n  ];\n}\n\nexport { clearPatternCaches, getTilingPatternIR, Pattern };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormatError } from \"../shared/util.js\";\nimport { Stream } from \"./stream.js\";\n\nfunction hexToInt(a, size) {\n  let n = 0;\n  for (let i = 0; i <= size; i++) {\n    n = (n << 8) | a[i];\n  }\n  return n >>> 0;\n}\n\nfunction hexToStr(a, size) {\n  // This code is hot. Special-case some common values to avoid creating an\n  // object with subarray().\n  if (size === 1) {\n    return String.fromCharCode(a[0], a[1]);\n  }\n  if (size === 3) {\n    return String.fromCharCode(a[0], a[1], a[2], a[3]);\n  }\n  return String.fromCharCode(...a.subarray(0, size + 1));\n}\n\nfunction addHex(a, b, size) {\n  let c = 0;\n  for (let i = size; i >= 0; i--) {\n    c += a[i] + b[i];\n    a[i] = c & 255;\n    c >>= 8;\n  }\n}\n\nfunction incHex(a, size) {\n  let c = 1;\n  for (let i = size; i >= 0 && c > 0; i--) {\n    c += a[i];\n    a[i] = c & 255;\n    c >>= 8;\n  }\n}\n\nconst MAX_NUM_SIZE = 16;\nconst MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8)\n\nclass BinaryCMapStream extends Stream {\n  tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);\n\n  constructor(data) {\n    super(\n      /* arrayBuffer = */ data,\n      /* start = */ 0,\n      /* length = */ data.length,\n      /* dict = */ null\n    );\n  }\n\n  readNumber() {\n    let n = 0;\n    let last;\n    do {\n      const b = this.getByte();\n      if (b < 0) {\n        throw new FormatError(\"unexpected EOF in bcmap\");\n      }\n      last = !(b & 0x80);\n      n = (n << 7) | (b & 0x7f);\n    } while (!last);\n    return n;\n  }\n\n  readSigned() {\n    const n = this.readNumber();\n    return n & 1 ? ~(n >>> 1) : n >>> 1;\n  }\n\n  readHex(num, size) {\n    num.set(this.getBytes(size + 1));\n  }\n\n  readHexNumber(num, size) {\n    let last;\n    const stack = this.tmpBuf;\n    let sp = 0;\n    do {\n      const b = this.getByte();\n      if (b < 0) {\n        throw new FormatError(\"unexpected EOF in bcmap\");\n      }\n      last = !(b & 0x80);\n      stack[sp++] = b & 0x7f;\n    } while (!last);\n    let i = size,\n      buffer = 0,\n      bufferSize = 0;\n    while (i >= 0) {\n      while (bufferSize < 8 && stack.length > 0) {\n        buffer |= stack[--sp] << bufferSize;\n        bufferSize += 7;\n      }\n      num[i] = buffer & 255;\n      i--;\n      buffer >>= 8;\n      bufferSize -= 8;\n    }\n  }\n\n  readHexSigned(num, size) {\n    this.readHexNumber(num, size);\n    const sign = num[size] & 1 ? 255 : 0;\n    let c = 0;\n    for (let i = 0; i <= size; i++) {\n      c = ((c & 1) << 8) | num[i];\n      num[i] = (c >> 1) ^ sign;\n    }\n  }\n\n  readString() {\n    const len = this.readNumber(),\n      buf = new Array(len);\n    for (let i = 0; i < len; i++) {\n      buf[i] = this.readNumber();\n    }\n    return String.fromCharCode(...buf);\n  }\n}\n\nclass BinaryCMapReader {\n  async process(data, cMap, extend) {\n    const stream = new BinaryCMapStream(data);\n    const header = stream.getByte();\n    cMap.vertical = !!(header & 1);\n\n    let useCMap = null;\n    const start = new Uint8Array(MAX_NUM_SIZE);\n    const end = new Uint8Array(MAX_NUM_SIZE);\n    const char = new Uint8Array(MAX_NUM_SIZE);\n    const charCode = new Uint8Array(MAX_NUM_SIZE);\n    const tmp = new Uint8Array(MAX_NUM_SIZE);\n    let code;\n\n    let b;\n    while ((b = stream.getByte()) >= 0) {\n      const type = b >> 5;\n      if (type === 7) {\n        // metadata, e.g. comment or usecmap\n        switch (b & 0x1f) {\n          case 0:\n            stream.readString(); // skipping comment\n            break;\n          case 1:\n            useCMap = stream.readString();\n            break;\n        }\n        continue;\n      }\n      const sequence = !!(b & 0x10);\n      const dataSize = b & 15;\n\n      if (dataSize + 1 > MAX_NUM_SIZE) {\n        throw new Error(\"BinaryCMapReader.process: Invalid dataSize.\");\n      }\n\n      const ucs2DataSize = 1;\n      const subitemsCount = stream.readNumber();\n      switch (type) {\n        case 0: // codespacerange\n          stream.readHex(start, dataSize);\n          stream.readHexNumber(end, dataSize);\n          addHex(end, start, dataSize);\n          cMap.addCodespaceRange(\n            dataSize + 1,\n            hexToInt(start, dataSize),\n            hexToInt(end, dataSize)\n          );\n          for (let i = 1; i < subitemsCount; i++) {\n            incHex(end, dataSize);\n            stream.readHexNumber(start, dataSize);\n            addHex(start, end, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            cMap.addCodespaceRange(\n              dataSize + 1,\n              hexToInt(start, dataSize),\n              hexToInt(end, dataSize)\n            );\n          }\n          break;\n        case 1: // notdefrange\n          stream.readHex(start, dataSize);\n          stream.readHexNumber(end, dataSize);\n          addHex(end, start, dataSize);\n          stream.readNumber(); // code\n          // undefined range, skipping\n          for (let i = 1; i < subitemsCount; i++) {\n            incHex(end, dataSize);\n            stream.readHexNumber(start, dataSize);\n            addHex(start, end, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            stream.readNumber(); // code\n            // nop\n          }\n          break;\n        case 2: // cidchar\n          stream.readHex(char, dataSize);\n          code = stream.readNumber();\n          cMap.mapOne(hexToInt(char, dataSize), code);\n          for (let i = 1; i < subitemsCount; i++) {\n            incHex(char, dataSize);\n            if (!sequence) {\n              stream.readHexNumber(tmp, dataSize);\n              addHex(char, tmp, dataSize);\n            }\n            code = stream.readSigned() + (code + 1);\n            cMap.mapOne(hexToInt(char, dataSize), code);\n          }\n          break;\n        case 3: // cidrange\n          stream.readHex(start, dataSize);\n          stream.readHexNumber(end, dataSize);\n          addHex(end, start, dataSize);\n          code = stream.readNumber();\n          cMap.mapCidRange(\n            hexToInt(start, dataSize),\n            hexToInt(end, dataSize),\n            code\n          );\n          for (let i = 1; i < subitemsCount; i++) {\n            incHex(end, dataSize);\n            if (!sequence) {\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n            } else {\n              start.set(end);\n            }\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            cMap.mapCidRange(\n              hexToInt(start, dataSize),\n              hexToInt(end, dataSize),\n              code\n            );\n          }\n          break;\n        case 4: // bfchar\n          stream.readHex(char, ucs2DataSize);\n          stream.readHex(charCode, dataSize);\n          cMap.mapOne(\n            hexToInt(char, ucs2DataSize),\n            hexToStr(charCode, dataSize)\n          );\n          for (let i = 1; i < subitemsCount; i++) {\n            incHex(char, ucs2DataSize);\n            if (!sequence) {\n              stream.readHexNumber(tmp, ucs2DataSize);\n              addHex(char, tmp, ucs2DataSize);\n            }\n            incHex(charCode, dataSize);\n            stream.readHexSigned(tmp, dataSize);\n            addHex(charCode, tmp, dataSize);\n            cMap.mapOne(\n              hexToInt(char, ucs2DataSize),\n              hexToStr(charCode, dataSize)\n            );\n          }\n          break;\n        case 5: // bfrange\n          stream.readHex(start, ucs2DataSize);\n          stream.readHexNumber(end, ucs2DataSize);\n          addHex(end, start, ucs2DataSize);\n          stream.readHex(charCode, dataSize);\n          cMap.mapBfRange(\n            hexToInt(start, ucs2DataSize),\n            hexToInt(end, ucs2DataSize),\n            hexToStr(charCode, dataSize)\n          );\n          for (let i = 1; i < subitemsCount; i++) {\n            incHex(end, ucs2DataSize);\n            if (!sequence) {\n              stream.readHexNumber(start, ucs2DataSize);\n              addHex(start, end, ucs2DataSize);\n            } else {\n              start.set(end);\n            }\n            stream.readHexNumber(end, ucs2DataSize);\n            addHex(end, start, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapBfRange(\n              hexToInt(start, ucs2DataSize),\n              hexToInt(end, ucs2DataSize),\n              hexToStr(charCode, dataSize)\n            );\n          }\n          break;\n        default:\n          throw new Error(`BinaryCMapReader.process - unknown type: ${type}`);\n      }\n    }\n\n    if (useCMap) {\n      return extend(useCMap);\n    }\n    return cMap;\n  }\n}\n\nexport { BinaryCMapReader };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { isWhiteSpace } from \"./core_utils.js\";\n\nclass Ascii85Stream extends DecodeStream {\n  #input = new Uint8Array(5);\n\n  constructor(str, maybeLength) {\n    // Most streams increase in size when decoded, but Ascii85 streams\n    // typically shrink by ~20%.\n    if (maybeLength) {\n      maybeLength *= 0.8;\n    }\n    super(maybeLength);\n\n    this.stream = str;\n    this.dict = str.dict;\n  }\n\n  readBlock() {\n    const TILDA_CHAR = 0x7e; // '~'\n    const Z_LOWER_CHAR = 0x7a; // 'z'\n    const EOF = -1;\n\n    const str = this.stream;\n\n    let c = str.getByte();\n    while (isWhiteSpace(c)) {\n      c = str.getByte();\n    }\n\n    if (c === EOF || c === TILDA_CHAR) {\n      this.eof = true;\n      return;\n    }\n\n    const bufferLength = this.bufferLength;\n    let buffer, i;\n\n    // special code for z\n    if (c === Z_LOWER_CHAR) {\n      buffer = this.ensureBuffer(bufferLength + 4);\n      buffer.fill(0, bufferLength, bufferLength + 4);\n      this.bufferLength += 4;\n    } else {\n      const input = this.#input;\n      input[0] = c;\n      for (i = 1; i < 5; ++i) {\n        c = str.getByte();\n        while (isWhiteSpace(c)) {\n          c = str.getByte();\n        }\n\n        input[i] = c;\n\n        if (c === EOF || c === TILDA_CHAR) {\n          break;\n        }\n      }\n      buffer = this.ensureBuffer(bufferLength + i - 1);\n      this.bufferLength += i - 1;\n\n      // partial ending;\n      if (i < 5) {\n        input.fill(0x21 + 84, i, 5);\n        this.eof = true;\n      }\n      let t = 0;\n      for (i = 0; i < 5; ++i) {\n        t = t * 85 + (input[i] - 0x21);\n      }\n\n      for (i = 3; i >= 0; --i) {\n        buffer[bufferLength + i] = t & 0xff;\n        t >>= 8;\n      }\n    }\n  }\n}\n\nexport { Ascii85Stream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from \"./decode_stream.js\";\n\nclass AsciiHexStream extends DecodeStream {\n  constructor(str, maybeLength) {\n    // Most streams increase in size when decoded, but AsciiHex streams shrink\n    // by 50%.\n    if (maybeLength) {\n      maybeLength *= 0.5;\n    }\n    super(maybeLength);\n\n    this.stream = str;\n    this.dict = str.dict;\n\n    this.firstDigit = -1;\n  }\n\n  readBlock() {\n    const UPSTREAM_BLOCK_SIZE = 8000;\n    const bytes = this.stream.getBytes(UPSTREAM_BLOCK_SIZE);\n    if (!bytes.length) {\n      this.eof = true;\n      return;\n    }\n\n    const maxDecodeLength = (bytes.length + 1) >> 1;\n    const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);\n    let bufferLength = this.bufferLength;\n\n    let firstDigit = this.firstDigit;\n    for (const ch of bytes) {\n      let digit;\n      if (ch >= /* '0' = */ 0x30 && ch <= /* '9' = */ 0x39) {\n        digit = ch & 0x0f;\n      } else if (\n        (ch >= /* 'A' = */ 0x41 && ch <= /* 'Z' = */ 0x46) ||\n        (ch >= /* 'a' = */ 0x61 && ch <= /* 'z' = */ 0x66)\n      ) {\n        digit = (ch & 0x0f) + 9;\n      } else if (ch === /* '>' = */ 0x3e) {\n        this.eof = true;\n        break;\n      } else {\n        // Probably whitespace, ignoring.\n        continue;\n      }\n      if (firstDigit < 0) {\n        firstDigit = digit;\n      } else {\n        buffer[bufferLength++] = (firstDigit << 4) | digit;\n        firstDigit = -1;\n      }\n    }\n    if (firstDigit >= 0 && this.eof) {\n      // incomplete byte\n      buffer[bufferLength++] = firstDigit << 4;\n      firstDigit = -1;\n    }\n    this.firstDigit = firstDigit;\n    this.bufferLength = bufferLength;\n  }\n}\n\nexport { AsciiHexStream };\n","/* Copyright 2017 Google Inc. All Rights Reserved.\n\n   Distributed under MIT license.\n   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT\n*/\n\n/**\n * @typedef {!Object} Options\n * @property {?Int8Array} customDictionary\n */\nlet Options;\n\n/**\n * Private scope / static initializer for decoder.\n *\n * @return {function(!Int8Array, ?Options=):!Int8Array}\n */\nlet makeBrotliDecode = () => {\n/* GENERATED CODE BEGIN */\n  /** @type {!Int32Array} */\n  const MAX_HUFFMAN_TABLE_SIZE = 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]);\n  /** @type {!Int32Array} */\n  const CODE_LENGTH_CODE_ORDER = Int32Array.from([1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15]);\n  /** @type {!Int32Array} */\n  const DISTANCE_SHORT_CODE_INDEX_OFFSET = Int32Array.from([0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3]);\n  /** @type {!Int32Array} */\n  const DISTANCE_SHORT_CODE_VALUE_OFFSET = Int32Array.from([0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3]);\n  /** @type {!Int32Array} */\n  const FIXED_TABLE = Int32Array.from([0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040001, 0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040005]);\n  /** @type {!Int32Array} */\n  const BLOCK_LENGTH_OFFSET = 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]);\n  /** @type {!Int32Array} */\n  const BLOCK_LENGTH_N_BITS = 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]);\n  /** @type {!Int16Array} */\n  const INSERT_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18]);\n  /** @type {!Int16Array} */\n  const COPY_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18]);\n  /** @type {!Int16Array} */\n  const CMD_LOOKUP = new Int16Array(2816);\n  {\n    unpackCommandLookupTable(CMD_LOOKUP);\n  }\n  /**\n   * @param {number} i\n   * @return {number}\n   */\n  function log2floor(i) {\n    let /** @type {number} */ result = -1;\n    let /** @type {number} */ step = 16;\n    let /** @type {number} */ v = i;\n    while (step > 0) {\n      let /** @type {number} */ next = v >> step;\n      if (next !== 0) {\n        result += step;\n        v = next;\n      }\n      step = step >> 1;\n    }\n    return result + v;\n  }\n  /**\n   * @param {number} npostfix\n   * @param {number} ndirect\n   * @param {number} maxndistbits\n   * @return {number}\n   */\n  function calculateDistanceAlphabetSize(npostfix, ndirect, maxndistbits) {\n    return 16 + ndirect + 2 * (maxndistbits << npostfix);\n  }\n  /**\n   * @param {!State} s\n   * @param {number} maxDistance\n   * @param {number} npostfix\n   * @param {number} ndirect\n   * @return {number}\n   */\n  function calculateDistanceAlphabetLimit(s, maxDistance, npostfix, ndirect) {\n    if (maxDistance < ndirect + (2 << npostfix)) {\n      return makeError(s, -23);\n    }\n    const /** @type {number} */ offset = ((maxDistance - ndirect) >> npostfix) + 4;\n    const /** @type {number} */ ndistbits = log2floor(offset) - 1;\n    const /** @type {number} */ group = ((ndistbits - 1) << 1) | ((offset >> ndistbits) & 1);\n    return ((group - 1) << npostfix) + (1 << npostfix) + ndirect + 16;\n  }\n  /**\n   * @param {!Int16Array} cmdLookup\n   * @return {void}\n   */\n  function unpackCommandLookupTable(cmdLookup) {\n    const /** @type {!Int32Array} */ insertLengthOffsets = new Int32Array(24);\n    const /** @type {!Int32Array} */ copyLengthOffsets = new Int32Array(24);\n    copyLengthOffsets[0] = 2;\n    for (let /** @type {number} */ i = 0; i < 23; ++i) {\n      insertLengthOffsets[i + 1] = insertLengthOffsets[i] + (1 << INSERT_LENGTH_N_BITS[i]);\n      copyLengthOffsets[i + 1] = copyLengthOffsets[i] + (1 << COPY_LENGTH_N_BITS[i]);\n    }\n    for (let /** @type {number} */ cmdCode = 0; cmdCode < 704; ++cmdCode) {\n      let /** @type {number} */ rangeIdx = cmdCode >> 6;\n      let /** @type {number} */ distanceContextOffset = -4;\n      if (rangeIdx >= 2) {\n        rangeIdx -= 2;\n        distanceContextOffset = 0;\n      }\n      const /** @type {number} */ insertCode = (((0x29850 >> (rangeIdx * 2)) & 0x3) << 3) | ((cmdCode >> 3) & 7);\n      const /** @type {number} */ copyCode = (((0x26244 >> (rangeIdx * 2)) & 0x3) << 3) | (cmdCode & 7);\n      const /** @type {number} */ copyLengthOffset = copyLengthOffsets[copyCode];\n      const /** @type {number} */ distanceContext = distanceContextOffset + Math.min(copyLengthOffset, 5) - 2;\n      const /** @type {number} */ index = cmdCode * 4;\n      cmdLookup[index] = INSERT_LENGTH_N_BITS[insertCode] | (COPY_LENGTH_N_BITS[copyCode] << 8);\n      cmdLookup[index + 1] = insertLengthOffsets[insertCode];\n      cmdLookup[index + 2] = copyLengthOffsets[copyCode];\n      cmdLookup[index + 3] = distanceContext;\n    }\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function decodeWindowBits(s) {\n    const /** @type {number} */ largeWindowEnabled = s.isLargeWindow;\n    s.isLargeWindow = 0;\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    if (readFewBits(s, 1) === 0) {\n      return 16;\n    }\n    let /** @type {number} */ n = readFewBits(s, 3);\n    if (n !== 0) {\n      return 17 + n;\n    }\n    n = readFewBits(s, 3);\n    if (n !== 0) {\n      if (n === 1) {\n        if (largeWindowEnabled === 0) {\n          return -1;\n        }\n        s.isLargeWindow = 1;\n        if (readFewBits(s, 1) === 1) {\n          return -1;\n        }\n        n = readFewBits(s, 6);\n        if (n < 10 || n > 30) {\n          return -1;\n        }\n        return n;\n      }\n      return 8 + n;\n    }\n    return 17;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function enableEagerOutput(s) {\n    if (s.runningState !== 1) {\n      return makeError(s, -24);\n    }\n    s.isEager = 1;\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function enableLargeWindow(s) {\n    if (s.runningState !== 1) {\n      return makeError(s, -24);\n    }\n    s.isLargeWindow = 1;\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @param {!Int8Array} data\n   * @return {number}\n   */\n  function attachDictionaryChunk(s, data) {\n    if (s.runningState !== 1) {\n      return makeError(s, -24);\n    }\n    if (s.cdNumChunks === 0) {\n      s.cdChunks = new Array(16);\n      s.cdChunkOffsets = new Int32Array(16);\n      s.cdBlockBits = -1;\n    }\n    if (s.cdNumChunks === 15) {\n      return makeError(s, -27);\n    }\n    s.cdChunks[s.cdNumChunks] = data;\n    s.cdNumChunks++;\n    s.cdTotalSize += data.length;\n    s.cdChunkOffsets[s.cdNumChunks] = s.cdTotalSize;\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function initState(s) {\n    if (s.runningState !== 0) {\n      return makeError(s, -26);\n    }\n    s.blockTrees = new Int32Array(3091);\n    s.blockTrees[0] = 7;\n    s.distRbIdx = 3;\n    let /** @type {number} */ result = calculateDistanceAlphabetLimit(s, 0x7FFFFFFC, 3, 120);\n    if (result < 0) {\n      return result;\n    }\n    const /** @type {number} */ maxDistanceAlphabetLimit = result;\n    s.distExtraBits = new Int8Array(maxDistanceAlphabetLimit);\n    s.distOffset = new Int32Array(maxDistanceAlphabetLimit);\n    result = initBitReader(s);\n    if (result < 0) {\n      return result;\n    }\n    s.runningState = 1;\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function close(s) {\n    if (s.runningState === 0) {\n      return makeError(s, -25);\n    }\n    if (s.runningState > 0) {\n      s.runningState = 11;\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function decodeVarLenUnsignedByte(s) {\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    if (readFewBits(s, 1) !== 0) {\n      const /** @type {number} */ n = readFewBits(s, 3);\n      if (n === 0) {\n        return 1;\n      }\n      return readFewBits(s, n) + (1 << n);\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function decodeMetaBlockLength(s) {\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    s.inputEnd = readFewBits(s, 1);\n    s.metaBlockLength = 0;\n    s.isUncompressed = 0;\n    s.isMetadata = 0;\n    if ((s.inputEnd !== 0) && readFewBits(s, 1) !== 0) {\n      return 0;\n    }\n    const /** @type {number} */ sizeNibbles = readFewBits(s, 2) + 4;\n    if (sizeNibbles === 7) {\n      s.isMetadata = 1;\n      if (readFewBits(s, 1) !== 0) {\n        return makeError(s, -6);\n      }\n      const /** @type {number} */ sizeBytes = readFewBits(s, 2);\n      if (sizeBytes === 0) {\n        return 0;\n      }\n      for (let /** @type {number} */ i = 0; i < sizeBytes; ++i) {\n        if (s.bitOffset >= 16) {\n          s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n          s.bitOffset -= 16;\n        }\n        const /** @type {number} */ bits = readFewBits(s, 8);\n        if (bits === 0 && i + 1 === sizeBytes && sizeBytes > 1) {\n          return makeError(s, -8);\n        }\n        s.metaBlockLength += bits << (i * 8);\n      }\n    } else {\n      for (let /** @type {number} */ i = 0; i < sizeNibbles; ++i) {\n        if (s.bitOffset >= 16) {\n          s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n          s.bitOffset -= 16;\n        }\n        const /** @type {number} */ bits = readFewBits(s, 4);\n        if (bits === 0 && i + 1 === sizeNibbles && sizeNibbles > 4) {\n          return makeError(s, -8);\n        }\n        s.metaBlockLength += bits << (i * 4);\n      }\n    }\n    s.metaBlockLength++;\n    if (s.inputEnd === 0) {\n      s.isUncompressed = readFewBits(s, 1);\n    }\n    return 0;\n  }\n  /**\n   * @param {!Int32Array} tableGroup\n   * @param {number} tableIdx\n   * @param {!State} s\n   * @return {number}\n   */\n  function readSymbol(tableGroup, tableIdx, s) {\n    let /** @type {number} */ offset = tableGroup[tableIdx];\n    const /** @type {number} */ v = s.accumulator32 >>> s.bitOffset;\n    offset += v & 0xFF;\n    const /** @type {number} */ bits = tableGroup[offset] >> 16;\n    const /** @type {number} */ sym = tableGroup[offset] & 0xFFFF;\n    if (bits <= 8) {\n      s.bitOffset += bits;\n      return sym;\n    }\n    offset += sym;\n    const /** @type {number} */ mask = (1 << bits) - 1;\n    offset += (v & mask) >>> 8;\n    s.bitOffset += (tableGroup[offset] >> 16) + 8;\n    return tableGroup[offset] & 0xFFFF;\n  }\n  /**\n   * @param {!Int32Array} tableGroup\n   * @param {number} tableIdx\n   * @param {!State} s\n   * @return {number}\n   */\n  function readBlockLength(tableGroup, tableIdx, s) {\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    const /** @type {number} */ code = readSymbol(tableGroup, tableIdx, s);\n    const /** @type {number} */ n = BLOCK_LENGTH_N_BITS[code];\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    return BLOCK_LENGTH_OFFSET[code] + ((n <= 16) ? readFewBits(s, n) : readManyBits(s, n));\n  }\n  /**\n   * @param {!Int32Array} v\n   * @param {number} index\n   * @return {void}\n   */\n  function moveToFront(v, index) {\n    let /** @type {number} */ i = index;\n    const /** @type {number} */ value = v[i];\n    while (i > 0) {\n      v[i] = v[i - 1];\n      i--;\n    }\n    v[0] = value;\n  }\n  /**\n   * @param {!Int8Array} v\n   * @param {number} vLen\n   * @return {void}\n   */\n  function inverseMoveToFrontTransform(v, vLen) {\n    const /** @type {!Int32Array} */ mtf = new Int32Array(256);\n    for (let /** @type {number} */ i = 0; i < 256; ++i) {\n      mtf[i] = i;\n    }\n    for (let /** @type {number} */ i = 0; i < vLen; ++i) {\n      const /** @type {number} */ index = v[i] & 0xFF;\n      v[i] = mtf[index];\n      if (index !== 0) {\n        moveToFront(mtf, index);\n      }\n    }\n  }\n  /**\n   * @param {!Int32Array} codeLengthCodeLengths\n   * @param {number} numSymbols\n   * @param {!Int32Array} codeLengths\n   * @param {!State} s\n   * @return {number}\n   */\n  function readHuffmanCodeLengths(codeLengthCodeLengths, numSymbols, codeLengths, s) {\n    let /** @type {number} */ symbol = 0;\n    let /** @type {number} */ prevCodeLen = 8;\n    let /** @type {number} */ repeat = 0;\n    let /** @type {number} */ repeatCodeLen = 0;\n    let /** @type {number} */ space = 32768;\n    const /** @type {!Int32Array} */ table = new Int32Array(33);\n    const /** @type {number} */ tableIdx = table.length - 1;\n    buildHuffmanTable(table, tableIdx, 5, codeLengthCodeLengths, 18);\n    while (symbol < numSymbols && space > 0) {\n      if (s.halfOffset > 2030) {\n        const /** @type {number} */ result = readMoreInput(s);\n        if (result < 0) {\n          return result;\n        }\n      }\n      if (s.bitOffset >= 16) {\n        s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n        s.bitOffset -= 16;\n      }\n      const /** @type {number} */ p = (s.accumulator32 >>> s.bitOffset) & 31;\n      s.bitOffset += table[p] >> 16;\n      const /** @type {number} */ codeLen = table[p] & 0xFFFF;\n      if (codeLen < 16) {\n        repeat = 0;\n        codeLengths[symbol++] = codeLen;\n        if (codeLen !== 0) {\n          prevCodeLen = codeLen;\n          space -= 32768 >> codeLen;\n        }\n      } else {\n        const /** @type {number} */ extraBits = codeLen - 14;\n        let /** @type {number} */ newLen = 0;\n        if (codeLen === 16) {\n          newLen = prevCodeLen;\n        }\n        if (repeatCodeLen !== newLen) {\n          repeat = 0;\n          repeatCodeLen = newLen;\n        }\n        const /** @type {number} */ oldRepeat = repeat;\n        if (repeat > 0) {\n          repeat -= 2;\n          repeat = repeat << extraBits;\n        }\n        if (s.bitOffset >= 16) {\n          s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n          s.bitOffset -= 16;\n        }\n        repeat += readFewBits(s, extraBits) + 3;\n        const /** @type {number} */ repeatDelta = repeat - oldRepeat;\n        if (symbol + repeatDelta > numSymbols) {\n          return makeError(s, -2);\n        }\n        for (let /** @type {number} */ i = 0; i < repeatDelta; ++i) {\n          codeLengths[symbol++] = repeatCodeLen;\n        }\n        if (repeatCodeLen !== 0) {\n          space -= repeatDelta << (15 - repeatCodeLen);\n        }\n      }\n    }\n    if (space !== 0) {\n      return makeError(s, -18);\n    }\n    codeLengths.fill(0, symbol, numSymbols);\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @param {!Int32Array} symbols\n   * @param {number} length\n   * @return {number}\n   */\n  function checkDupes(s, symbols, length) {\n    for (let /** @type {number} */ i = 0; i < length - 1; ++i) {\n      for (let /** @type {number} */ j = i + 1; j < length; ++j) {\n        if (symbols[i] === symbols[j]) {\n          return makeError(s, -7);\n        }\n      }\n    }\n    return 0;\n  }\n  /**\n   * @param {number} alphabetSizeMax\n   * @param {number} alphabetSizeLimit\n   * @param {!Int32Array} tableGroup\n   * @param {number} tableIdx\n   * @param {!State} s\n   * @return {number}\n   */\n  function readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) {\n    const /** @type {!Int32Array} */ codeLengths = new Int32Array(alphabetSizeLimit);\n    const /** @type {!Int32Array} */ symbols = new Int32Array(4);\n    const /** @type {number} */ maxBits = 1 + log2floor(alphabetSizeMax - 1);\n    const /** @type {number} */ numSymbols = readFewBits(s, 2) + 1;\n    for (let /** @type {number} */ i = 0; i < numSymbols; ++i) {\n      if (s.bitOffset >= 16) {\n        s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n        s.bitOffset -= 16;\n      }\n      const /** @type {number} */ symbol = readFewBits(s, maxBits);\n      if (symbol >= alphabetSizeLimit) {\n        return makeError(s, -15);\n      }\n      symbols[i] = symbol;\n    }\n    const /** @type {number} */ result = checkDupes(s, symbols, numSymbols);\n    if (result < 0) {\n      return result;\n    }\n    let /** @type {number} */ histogramId = numSymbols;\n    if (numSymbols === 4) {\n      histogramId += readFewBits(s, 1);\n    }\n    switch(histogramId) {\n      case 1:\n        codeLengths[symbols[0]] = 1;\n        break;\n      case 2:\n        codeLengths[symbols[0]] = 1;\n        codeLengths[symbols[1]] = 1;\n        break;\n      case 3:\n        codeLengths[symbols[0]] = 1;\n        codeLengths[symbols[1]] = 2;\n        codeLengths[symbols[2]] = 2;\n        break;\n      case 4:\n        codeLengths[symbols[0]] = 2;\n        codeLengths[symbols[1]] = 2;\n        codeLengths[symbols[2]] = 2;\n        codeLengths[symbols[3]] = 2;\n        break;\n      case 5:\n        codeLengths[symbols[0]] = 1;\n        codeLengths[symbols[1]] = 2;\n        codeLengths[symbols[2]] = 3;\n        codeLengths[symbols[3]] = 3;\n        break;\n      default:\n        break;\n    }\n    return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit);\n  }\n  /**\n   * @param {number} alphabetSizeLimit\n   * @param {number} skip\n   * @param {!Int32Array} tableGroup\n   * @param {number} tableIdx\n   * @param {!State} s\n   * @return {number}\n   */\n  function readComplexHuffmanCode(alphabetSizeLimit, skip, tableGroup, tableIdx, s) {\n    const /** @type {!Int32Array} */ codeLengths = new Int32Array(alphabetSizeLimit);\n    const /** @type {!Int32Array} */ codeLengthCodeLengths = new Int32Array(18);\n    let /** @type {number} */ space = 32;\n    let /** @type {number} */ numCodes = 0;\n    for (let /** @type {number} */ i = skip; i < 18; ++i) {\n      const /** @type {number} */ codeLenIdx = CODE_LENGTH_CODE_ORDER[i];\n      if (s.bitOffset >= 16) {\n        s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n        s.bitOffset -= 16;\n      }\n      const /** @type {number} */ p = (s.accumulator32 >>> s.bitOffset) & 15;\n      s.bitOffset += FIXED_TABLE[p] >> 16;\n      const /** @type {number} */ v = FIXED_TABLE[p] & 0xFFFF;\n      codeLengthCodeLengths[codeLenIdx] = v;\n      if (v !== 0) {\n        space -= 32 >> v;\n        numCodes++;\n        if (space <= 0) {\n          break;\n        }\n      }\n    }\n    if (space !== 0 && numCodes !== 1) {\n      return makeError(s, -4);\n    }\n    const /** @type {number} */ result = readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSizeLimit, codeLengths, s);\n    if (result < 0) {\n      return result;\n    }\n    return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit);\n  }\n  /**\n   * @param {number} alphabetSizeMax\n   * @param {number} alphabetSizeLimit\n   * @param {!Int32Array} tableGroup\n   * @param {number} tableIdx\n   * @param {!State} s\n   * @return {number}\n   */\n  function readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) {\n    if (s.halfOffset > 2030) {\n      const /** @type {number} */ result = readMoreInput(s);\n      if (result < 0) {\n        return result;\n      }\n    }\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    const /** @type {number} */ simpleCodeOrSkip = readFewBits(s, 2);\n    if (simpleCodeOrSkip === 1) {\n      return readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s);\n    }\n    return readComplexHuffmanCode(alphabetSizeLimit, simpleCodeOrSkip, tableGroup, tableIdx, s);\n  }\n  /**\n   * @param {number} contextMapSize\n   * @param {!Int8Array} contextMap\n   * @param {!State} s\n   * @return {number}\n   */\n  function decodeContextMap(contextMapSize, contextMap, s) {\n    let /** @type {number} */ result;\n    if (s.halfOffset > 2030) {\n      result = readMoreInput(s);\n      if (result < 0) {\n        return result;\n      }\n    }\n    const /** @type {number} */ numTrees = decodeVarLenUnsignedByte(s) + 1;\n    if (numTrees === 1) {\n      contextMap.fill(0, 0, contextMapSize);\n      return numTrees;\n    }\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    const /** @type {number} */ useRleForZeros = readFewBits(s, 1);\n    let /** @type {number} */ maxRunLengthPrefix = 0;\n    if (useRleForZeros !== 0) {\n      maxRunLengthPrefix = readFewBits(s, 4) + 1;\n    }\n    const /** @type {number} */ alphabetSize = numTrees + maxRunLengthPrefix;\n    const /** @type {number} */ tableSize = MAX_HUFFMAN_TABLE_SIZE[(alphabetSize + 31) >> 5];\n    const /** @type {!Int32Array} */ table = new Int32Array(tableSize + 1);\n    const /** @type {number} */ tableIdx = table.length - 1;\n    result = readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s);\n    if (result < 0) {\n      return result;\n    }\n    let /** @type {number} */ i = 0;\n    while (i < contextMapSize) {\n      if (s.halfOffset > 2030) {\n        result = readMoreInput(s);\n        if (result < 0) {\n          return result;\n        }\n      }\n      if (s.bitOffset >= 16) {\n        s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n        s.bitOffset -= 16;\n      }\n      const /** @type {number} */ code = readSymbol(table, tableIdx, s);\n      if (code === 0) {\n        contextMap[i] = 0;\n        i++;\n      } else if (code <= maxRunLengthPrefix) {\n        if (s.bitOffset >= 16) {\n          s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n          s.bitOffset -= 16;\n        }\n        let /** @type {number} */ reps = (1 << code) + readFewBits(s, code);\n        while (reps !== 0) {\n          if (i >= contextMapSize) {\n            return makeError(s, -3);\n          }\n          contextMap[i] = 0;\n          i++;\n          reps--;\n        }\n      } else {\n        contextMap[i] = code - maxRunLengthPrefix;\n        i++;\n      }\n    }\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    if (readFewBits(s, 1) === 1) {\n      inverseMoveToFrontTransform(contextMap, contextMapSize);\n    }\n    return numTrees;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} treeType\n   * @param {number} numBlockTypes\n   * @return {number}\n   */\n  function decodeBlockTypeAndLength(s, treeType, numBlockTypes) {\n    const /** @type {!Int32Array} */ ringBuffers = s.rings;\n    const /** @type {number} */ offset = 4 + treeType * 2;\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    let /** @type {number} */ blockType = readSymbol(s.blockTrees, 2 * treeType, s);\n    const /** @type {number} */ result = readBlockLength(s.blockTrees, 2 * treeType + 1, s);\n    if (blockType === 1) {\n      blockType = ringBuffers[offset + 1] + 1;\n    } else if (blockType === 0) {\n      blockType = ringBuffers[offset];\n    } else {\n      blockType -= 2;\n    }\n    if (blockType >= numBlockTypes) {\n      blockType -= numBlockTypes;\n    }\n    ringBuffers[offset] = ringBuffers[offset + 1];\n    ringBuffers[offset + 1] = blockType;\n    return result;\n  }\n  /**\n   * @param {!State} s\n   * @return {void}\n   */\n  function decodeLiteralBlockSwitch(s) {\n    s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes);\n    const /** @type {number} */ literalBlockType = s.rings[5];\n    s.contextMapSlice = literalBlockType << 6;\n    s.literalTreeIdx = s.contextMap[s.contextMapSlice] & 0xFF;\n    const /** @type {number} */ contextMode = s.contextModes[literalBlockType];\n    s.contextLookupOffset1 = contextMode << 9;\n    s.contextLookupOffset2 = s.contextLookupOffset1 + 256;\n  }\n  /**\n   * @param {!State} s\n   * @return {void}\n   */\n  function decodeCommandBlockSwitch(s) {\n    s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes);\n    s.commandTreeIdx = s.rings[7];\n  }\n  /**\n   * @param {!State} s\n   * @return {void}\n   */\n  function decodeDistanceBlockSwitch(s) {\n    s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes);\n    s.distContextMapSlice = s.rings[9] << 2;\n  }\n  /**\n   * @param {!State} s\n   * @return {void}\n   */\n  function maybeReallocateRingBuffer(s) {\n    let /** @type {number} */ newSize = s.maxRingBufferSize;\n    if (newSize > s.expectedTotalSize) {\n      const /** @type {number} */ minimalNewSize = s.expectedTotalSize;\n      while ((newSize >> 1) > minimalNewSize) {\n        newSize = newSize >> 1;\n      }\n      if ((s.inputEnd === 0) && newSize < 16384 && s.maxRingBufferSize >= 16384) {\n        newSize = 16384;\n      }\n    }\n    if (newSize <= s.ringBufferSize) {\n      return;\n    }\n    const /** @type {number} */ ringBufferSizeWithSlack = newSize + 37;\n    const /** @type {!Int8Array} */ newBuffer = new Int8Array(ringBufferSizeWithSlack);\n    const /** @type {!Int8Array} */ oldBuffer = s.ringBuffer;\n    if (oldBuffer.length !== 0) {\n      newBuffer.set(oldBuffer.subarray(0, s.ringBufferSize), 0);\n    }\n    s.ringBuffer = newBuffer;\n    s.ringBufferSize = newSize;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function readNextMetablockHeader(s) {\n    if (s.inputEnd !== 0) {\n      s.nextRunningState = 10;\n      s.runningState = 12;\n      return 0;\n    }\n    s.literalTreeGroup = new Int32Array(0);\n    s.commandTreeGroup = new Int32Array(0);\n    s.distanceTreeGroup = new Int32Array(0);\n    let /** @type {number} */ result;\n    if (s.halfOffset > 2030) {\n      result = readMoreInput(s);\n      if (result < 0) {\n        return result;\n      }\n    }\n    result = decodeMetaBlockLength(s);\n    if (result < 0) {\n      return result;\n    }\n    if ((s.metaBlockLength === 0) && (s.isMetadata === 0)) {\n      return 0;\n    }\n    if ((s.isUncompressed !== 0) || (s.isMetadata !== 0)) {\n      result = jumpToByteBoundary(s);\n      if (result < 0) {\n        return result;\n      }\n      if (s.isMetadata === 0) {\n        s.runningState = 6;\n      } else {\n        s.runningState = 5;\n      }\n    } else {\n      s.runningState = 3;\n    }\n    if (s.isMetadata !== 0) {\n      return 0;\n    }\n    s.expectedTotalSize += s.metaBlockLength;\n    if (s.expectedTotalSize > 1 << 30) {\n      s.expectedTotalSize = 1 << 30;\n    }\n    if (s.ringBufferSize < s.maxRingBufferSize) {\n      maybeReallocateRingBuffer(s);\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} treeType\n   * @param {number} numBlockTypes\n   * @return {number}\n   */\n  function readMetablockPartition(s, treeType, numBlockTypes) {\n    let /** @type {number} */ offset = s.blockTrees[2 * treeType];\n    if (numBlockTypes <= 1) {\n      s.blockTrees[2 * treeType + 1] = offset;\n      s.blockTrees[2 * treeType + 2] = offset;\n      return 1 << 28;\n    }\n    const /** @type {number} */ blockTypeAlphabetSize = numBlockTypes + 2;\n    let /** @type {number} */ result = readHuffmanCode(blockTypeAlphabetSize, blockTypeAlphabetSize, s.blockTrees, 2 * treeType, s);\n    if (result < 0) {\n      return result;\n    }\n    offset += result;\n    s.blockTrees[2 * treeType + 1] = offset;\n    const /** @type {number} */ blockLengthAlphabetSize = 26;\n    result = readHuffmanCode(blockLengthAlphabetSize, blockLengthAlphabetSize, s.blockTrees, 2 * treeType + 1, s);\n    if (result < 0) {\n      return result;\n    }\n    offset += result;\n    s.blockTrees[2 * treeType + 2] = offset;\n    return readBlockLength(s.blockTrees, 2 * treeType + 1, s);\n  }\n  /**\n   * @param {!State} s\n   * @param {number} alphabetSizeLimit\n   * @return {void}\n   */\n  function calculateDistanceLut(s, alphabetSizeLimit) {\n    const /** @type {!Int8Array} */ distExtraBits = s.distExtraBits;\n    const /** @type {!Int32Array} */ distOffset = s.distOffset;\n    const /** @type {number} */ npostfix = s.distancePostfixBits;\n    const /** @type {number} */ ndirect = s.numDirectDistanceCodes;\n    const /** @type {number} */ postfix = 1 << npostfix;\n    let /** @type {number} */ bits = 1;\n    let /** @type {number} */ half = 0;\n    let /** @type {number} */ i = 16;\n    for (let /** @type {number} */ j = 0; j < ndirect; ++j) {\n      distExtraBits[i] = 0;\n      distOffset[i] = j + 1;\n      ++i;\n    }\n    while (i < alphabetSizeLimit) {\n      const /** @type {number} */ base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;\n      for (let /** @type {number} */ j = 0; j < postfix; ++j) {\n        distExtraBits[i] = bits;\n        distOffset[i] = base + j;\n        ++i;\n      }\n      bits = bits + half;\n      half = half ^ 1;\n    }\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function readMetablockHuffmanCodesAndContextMaps(s) {\n    s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1;\n    let /** @type {number} */ result = readMetablockPartition(s, 0, s.numLiteralBlockTypes);\n    if (result < 0) {\n      return result;\n    }\n    s.literalBlockLength = result;\n    s.numCommandBlockTypes = decodeVarLenUnsignedByte(s) + 1;\n    result = readMetablockPartition(s, 1, s.numCommandBlockTypes);\n    if (result < 0) {\n      return result;\n    }\n    s.commandBlockLength = result;\n    s.numDistanceBlockTypes = decodeVarLenUnsignedByte(s) + 1;\n    result = readMetablockPartition(s, 2, s.numDistanceBlockTypes);\n    if (result < 0) {\n      return result;\n    }\n    s.distanceBlockLength = result;\n    if (s.halfOffset > 2030) {\n      result = readMoreInput(s);\n      if (result < 0) {\n        return result;\n      }\n    }\n    if (s.bitOffset >= 16) {\n      s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n      s.bitOffset -= 16;\n    }\n    s.distancePostfixBits = readFewBits(s, 2);\n    s.numDirectDistanceCodes = readFewBits(s, 4) << s.distancePostfixBits;\n    s.contextModes = new Int8Array(s.numLiteralBlockTypes);\n    let /** @type {number} */ i = 0;\n    while (i < s.numLiteralBlockTypes) {\n      const /** @type {number} */ limit = Math.min(i + 96, s.numLiteralBlockTypes);\n      while (i < limit) {\n        if (s.bitOffset >= 16) {\n          s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n          s.bitOffset -= 16;\n        }\n        s.contextModes[i] = readFewBits(s, 2);\n        i++;\n      }\n      if (s.halfOffset > 2030) {\n        result = readMoreInput(s);\n        if (result < 0) {\n          return result;\n        }\n      }\n    }\n    const /** @type {number} */ contextMapLength = s.numLiteralBlockTypes << 6;\n    s.contextMap = new Int8Array(contextMapLength);\n    result = decodeContextMap(contextMapLength, s.contextMap, s);\n    if (result < 0) {\n      return result;\n    }\n    const /** @type {number} */ numLiteralTrees = result;\n    s.trivialLiteralContext = 1;\n    for (let /** @type {number} */ j = 0; j < contextMapLength; ++j) {\n      if (s.contextMap[j] !== j >> 6) {\n        s.trivialLiteralContext = 0;\n        break;\n      }\n    }\n    s.distContextMap = new Int8Array(s.numDistanceBlockTypes << 2);\n    result = decodeContextMap(s.numDistanceBlockTypes << 2, s.distContextMap, s);\n    if (result < 0) {\n      return result;\n    }\n    const /** @type {number} */ numDistTrees = result;\n    s.literalTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(256, numLiteralTrees));\n    result = decodeHuffmanTreeGroup(256, 256, numLiteralTrees, s, s.literalTreeGroup);\n    if (result < 0) {\n      return result;\n    }\n    s.commandTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(704, s.numCommandBlockTypes));\n    result = decodeHuffmanTreeGroup(704, 704, s.numCommandBlockTypes, s, s.commandTreeGroup);\n    if (result < 0) {\n      return result;\n    }\n    let /** @type {number} */ distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 24);\n    let /** @type {number} */ distanceAlphabetSizeLimit = distanceAlphabetSizeMax;\n    if (s.isLargeWindow === 1) {\n      distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 62);\n      result = calculateDistanceAlphabetLimit(s, 0x7FFFFFFC, s.distancePostfixBits, s.numDirectDistanceCodes);\n      if (result < 0) {\n        return result;\n      }\n      distanceAlphabetSizeLimit = result;\n    }\n    s.distanceTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(distanceAlphabetSizeLimit, numDistTrees));\n    result = decodeHuffmanTreeGroup(distanceAlphabetSizeMax, distanceAlphabetSizeLimit, numDistTrees, s, s.distanceTreeGroup);\n    if (result < 0) {\n      return result;\n    }\n    calculateDistanceLut(s, distanceAlphabetSizeLimit);\n    s.contextMapSlice = 0;\n    s.distContextMapSlice = 0;\n    s.contextLookupOffset1 = s.contextModes[0] * 512;\n    s.contextLookupOffset2 = s.contextLookupOffset1 + 256;\n    s.literalTreeIdx = 0;\n    s.commandTreeIdx = 0;\n    s.rings[4] = 1;\n    s.rings[5] = 0;\n    s.rings[6] = 1;\n    s.rings[7] = 0;\n    s.rings[8] = 1;\n    s.rings[9] = 0;\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function copyUncompressedData(s) {\n    const /** @type {!Int8Array} */ ringBuffer = s.ringBuffer;\n    let /** @type {number} */ result;\n    if (s.metaBlockLength <= 0) {\n      result = reload(s);\n      if (result < 0) {\n        return result;\n      }\n      s.runningState = 2;\n      return 0;\n    }\n    const /** @type {number} */ chunkLength = Math.min(s.ringBufferSize - s.pos, s.metaBlockLength);\n    result = copyRawBytes(s, ringBuffer, s.pos, chunkLength);\n    if (result < 0) {\n      return result;\n    }\n    s.metaBlockLength -= chunkLength;\n    s.pos += chunkLength;\n    if (s.pos === s.ringBufferSize) {\n      s.nextRunningState = 6;\n      s.runningState = 12;\n      return 0;\n    }\n    result = reload(s);\n    if (result < 0) {\n      return result;\n    }\n    s.runningState = 2;\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function writeRingBuffer(s) {\n    const /** @type {number} */ toWrite = Math.min(s.outputLength - s.outputUsed, s.ringBufferBytesReady - s.ringBufferBytesWritten);\n    if (toWrite !== 0) {\n      s.output.set(s.ringBuffer.subarray(s.ringBufferBytesWritten, s.ringBufferBytesWritten + toWrite), s.outputOffset + s.outputUsed);\n      s.outputUsed += toWrite;\n      s.ringBufferBytesWritten += toWrite;\n    }\n    if (s.outputUsed < s.outputLength) {\n      return 0;\n    }\n    return 2;\n  }\n  /**\n   * @param {number} alphabetSizeLimit\n   * @param {number} n\n   * @return {number}\n   */\n  function huffmanTreeGroupAllocSize(alphabetSizeLimit, n) {\n    const /** @type {number} */ maxTableSize = MAX_HUFFMAN_TABLE_SIZE[(alphabetSizeLimit + 31) >> 5];\n    return n + n * maxTableSize;\n  }\n  /**\n   * @param {number} alphabetSizeMax\n   * @param {number} alphabetSizeLimit\n   * @param {number} n\n   * @param {!State} s\n   * @param {!Int32Array} group\n   * @return {number}\n   */\n  function decodeHuffmanTreeGroup(alphabetSizeMax, alphabetSizeLimit, n, s, group) {\n    let /** @type {number} */ next = n;\n    for (let /** @type {number} */ i = 0; i < n; ++i) {\n      group[i] = next;\n      const /** @type {number} */ result = readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, group, i, s);\n      if (result < 0) {\n        return result;\n      }\n      next += result;\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function calculateFence(s) {\n    let /** @type {number} */ result = s.ringBufferSize;\n    if (s.isEager !== 0) {\n      result = Math.min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed);\n    }\n    return result;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} fence\n   * @return {number}\n   */\n  function doUseDictionary(s, fence) {\n    if (s.distance > 0x7FFFFFFC) {\n      return makeError(s, -9);\n    }\n    const /** @type {number} */ address = s.distance - s.maxDistance - 1 - s.cdTotalSize;\n    if (address < 0) {\n      const /** @type {number} */ result = initializeCompoundDictionaryCopy(s, -address - 1, s.copyLength);\n      if (result < 0) {\n        return result;\n      }\n      s.runningState = 14;\n    } else {\n      const /** @type {!ByteBuffer} */ dictionaryData = data;\n      const /** @type {number} */ wordLength = s.copyLength;\n      if (wordLength > 31) {\n        return makeError(s, -9);\n      }\n      const /** @type {number} */ shift = sizeBits[wordLength];\n      if (shift === 0) {\n        return makeError(s, -9);\n      }\n      let /** @type {number} */ offset = offsets[wordLength];\n      const /** @type {number} */ mask = (1 << shift) - 1;\n      const /** @type {number} */ wordIdx = address & mask;\n      const /** @type {number} */ transformIdx = address >> shift;\n      offset += wordIdx * wordLength;\n      const /** @type {!Transforms} */ transforms = RFC_TRANSFORMS;\n      if (transformIdx >= transforms.numTransforms) {\n        return makeError(s, -9);\n      }\n      const /** @type {number} */ len = transformDictionaryWord(s.ringBuffer, s.pos, dictionaryData, offset, wordLength, transforms, transformIdx);\n      s.pos += len;\n      s.metaBlockLength -= len;\n      if (s.pos >= fence) {\n        s.nextRunningState = 4;\n        s.runningState = 12;\n        return 0;\n      }\n      s.runningState = 4;\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {void}\n   */\n  function initializeCompoundDictionary(s) {\n    s.cdBlockMap = new Int8Array(256);\n    let /** @type {number} */ blockBits = 8;\n    while (((s.cdTotalSize - 1) >> blockBits) !== 0) {\n      blockBits++;\n    }\n    blockBits -= 8;\n    s.cdBlockBits = blockBits;\n    let /** @type {number} */ cursor = 0;\n    let /** @type {number} */ index = 0;\n    while (cursor < s.cdTotalSize) {\n      while (s.cdChunkOffsets[index + 1] < cursor) {\n        index++;\n      }\n      s.cdBlockMap[cursor >> blockBits] = index;\n      cursor += 1 << blockBits;\n    }\n  }\n  /**\n   * @param {!State} s\n   * @param {number} address\n   * @param {number} length\n   * @return {number}\n   */\n  function initializeCompoundDictionaryCopy(s, address, length) {\n    if (s.cdBlockBits === -1) {\n      initializeCompoundDictionary(s);\n    }\n    let /** @type {number} */ index = s.cdBlockMap[address >> s.cdBlockBits];\n    while (address >= s.cdChunkOffsets[index + 1]) {\n      index++;\n    }\n    if (s.cdTotalSize > address + length) {\n      return makeError(s, -9);\n    }\n    s.distRbIdx = (s.distRbIdx + 1) & 0x3;\n    s.rings[s.distRbIdx] = s.distance;\n    s.metaBlockLength -= length;\n    s.cdBrIndex = index;\n    s.cdBrOffset = address - s.cdChunkOffsets[index];\n    s.cdBrLength = length;\n    s.cdBrCopied = 0;\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} fence\n   * @return {number}\n   */\n  function copyFromCompoundDictionary(s, fence) {\n    let /** @type {number} */ pos = s.pos;\n    const /** @type {number} */ origPos = pos;\n    while (s.cdBrLength !== s.cdBrCopied) {\n      const /** @type {number} */ space = fence - pos;\n      const /** @type {number} */ chunkLength = s.cdChunkOffsets[s.cdBrIndex + 1] - s.cdChunkOffsets[s.cdBrIndex];\n      const /** @type {number} */ remChunkLength = chunkLength - s.cdBrOffset;\n      let /** @type {number} */ length = s.cdBrLength - s.cdBrCopied;\n      if (length > remChunkLength) {\n        length = remChunkLength;\n      }\n      if (length > space) {\n        length = space;\n      }\n      s.ringBuffer.set(s.cdChunks[s.cdBrIndex].subarray(s.cdBrOffset, s.cdBrOffset + length), pos);\n      pos += length;\n      s.cdBrOffset += length;\n      s.cdBrCopied += length;\n      if (length === remChunkLength) {\n        s.cdBrIndex++;\n        s.cdBrOffset = 0;\n      }\n      if (pos >= fence) {\n        break;\n      }\n    }\n    return pos - origPos;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function decompress(s) {\n    let /** @type {number} */ result;\n    if (s.runningState === 0) {\n      return makeError(s, -25);\n    }\n    if (s.runningState < 0) {\n      return makeError(s, -28);\n    }\n    if (s.runningState === 11) {\n      return makeError(s, -22);\n    }\n    if (s.runningState === 1) {\n      const /** @type {number} */ windowBits = decodeWindowBits(s);\n      if (windowBits === -1) {\n        return makeError(s, -11);\n      }\n      s.maxRingBufferSize = 1 << windowBits;\n      s.maxBackwardDistance = s.maxRingBufferSize - 16;\n      s.runningState = 2;\n    }\n    let /** @type {number} */ fence = calculateFence(s);\n    let /** @type {number} */ ringBufferMask = s.ringBufferSize - 1;\n    let /** @type {!Int8Array} */ ringBuffer = s.ringBuffer;\n    while (s.runningState !== 10) {\n      switch(s.runningState) {\n        case 2:\n          if (s.metaBlockLength < 0) {\n            return makeError(s, -10);\n          }\n          result = readNextMetablockHeader(s);\n          if (result < 0) {\n            return result;\n          }\n          fence = calculateFence(s);\n          ringBufferMask = s.ringBufferSize - 1;\n          ringBuffer = s.ringBuffer;\n          continue;\n        case 3:\n          result = readMetablockHuffmanCodesAndContextMaps(s);\n          if (result < 0) {\n            return result;\n          }\n          s.runningState = 4;\n          continue;\n        case 4:\n          if (s.metaBlockLength <= 0) {\n            s.runningState = 2;\n            continue;\n          }\n          if (s.halfOffset > 2030) {\n            result = readMoreInput(s);\n            if (result < 0) {\n              return result;\n            }\n          }\n          if (s.commandBlockLength === 0) {\n            decodeCommandBlockSwitch(s);\n          }\n          s.commandBlockLength--;\n          if (s.bitOffset >= 16) {\n            s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n            s.bitOffset -= 16;\n          }\n          const /** @type {number} */ cmdCode = readSymbol(s.commandTreeGroup, s.commandTreeIdx, s) << 2;\n          const /** @type {number} */ insertAndCopyExtraBits = CMD_LOOKUP[cmdCode];\n          const /** @type {number} */ insertLengthOffset = CMD_LOOKUP[cmdCode + 1];\n          const /** @type {number} */ copyLengthOffset = CMD_LOOKUP[cmdCode + 2];\n          s.distanceCode = CMD_LOOKUP[cmdCode + 3];\n          if (s.bitOffset >= 16) {\n            s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n            s.bitOffset -= 16;\n          }\n          const /** @type {number} */ insertLengthExtraBits = insertAndCopyExtraBits & 0xFF;\n          s.insertLength = insertLengthOffset + ((insertLengthExtraBits <= 16) ? readFewBits(s, insertLengthExtraBits) : readManyBits(s, insertLengthExtraBits));\n          if (s.bitOffset >= 16) {\n            s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n            s.bitOffset -= 16;\n          }\n          const /** @type {number} */ copyLengthExtraBits = insertAndCopyExtraBits >> 8;\n          s.copyLength = copyLengthOffset + ((copyLengthExtraBits <= 16) ? readFewBits(s, copyLengthExtraBits) : readManyBits(s, copyLengthExtraBits));\n          s.j = 0;\n          s.runningState = 7;\n          continue;\n        case 7:\n          if (s.trivialLiteralContext !== 0) {\n            while (s.j < s.insertLength) {\n              if (s.halfOffset > 2030) {\n                result = readMoreInput(s);\n                if (result < 0) {\n                  return result;\n                }\n              }\n              if (s.literalBlockLength === 0) {\n                decodeLiteralBlockSwitch(s);\n              }\n              s.literalBlockLength--;\n              if (s.bitOffset >= 16) {\n                s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n                s.bitOffset -= 16;\n              }\n              ringBuffer[s.pos] = readSymbol(s.literalTreeGroup, s.literalTreeIdx, s);\n              s.pos++;\n              s.j++;\n              if (s.pos >= fence) {\n                s.nextRunningState = 7;\n                s.runningState = 12;\n                break;\n              }\n            }\n          } else {\n            let /** @type {number} */ prevByte1 = ringBuffer[(s.pos - 1) & ringBufferMask] & 0xFF;\n            let /** @type {number} */ prevByte2 = ringBuffer[(s.pos - 2) & ringBufferMask] & 0xFF;\n            while (s.j < s.insertLength) {\n              if (s.halfOffset > 2030) {\n                result = readMoreInput(s);\n                if (result < 0) {\n                  return result;\n                }\n              }\n              if (s.literalBlockLength === 0) {\n                decodeLiteralBlockSwitch(s);\n              }\n              const /** @type {number} */ literalContext = LOOKUP[s.contextLookupOffset1 + prevByte1] | LOOKUP[s.contextLookupOffset2 + prevByte2];\n              const /** @type {number} */ literalTreeIdx = s.contextMap[s.contextMapSlice + literalContext] & 0xFF;\n              s.literalBlockLength--;\n              prevByte2 = prevByte1;\n              if (s.bitOffset >= 16) {\n                s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n                s.bitOffset -= 16;\n              }\n              prevByte1 = readSymbol(s.literalTreeGroup, literalTreeIdx, s);\n              ringBuffer[s.pos] = prevByte1;\n              s.pos++;\n              s.j++;\n              if (s.pos >= fence) {\n                s.nextRunningState = 7;\n                s.runningState = 12;\n                break;\n              }\n            }\n          }\n          if (s.runningState !== 7) {\n            continue;\n          }\n          s.metaBlockLength -= s.insertLength;\n          if (s.metaBlockLength <= 0) {\n            s.runningState = 4;\n            continue;\n          }\n          let /** @type {number} */ distanceCode = s.distanceCode;\n          if (distanceCode < 0) {\n            s.distance = s.rings[s.distRbIdx];\n          } else {\n            if (s.halfOffset > 2030) {\n              result = readMoreInput(s);\n              if (result < 0) {\n                return result;\n              }\n            }\n            if (s.distanceBlockLength === 0) {\n              decodeDistanceBlockSwitch(s);\n            }\n            s.distanceBlockLength--;\n            if (s.bitOffset >= 16) {\n              s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n              s.bitOffset -= 16;\n            }\n            const /** @type {number} */ distTreeIdx = s.distContextMap[s.distContextMapSlice + distanceCode] & 0xFF;\n            distanceCode = readSymbol(s.distanceTreeGroup, distTreeIdx, s);\n            if (distanceCode < 16) {\n              const /** @type {number} */ index = (s.distRbIdx + DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode]) & 0x3;\n              s.distance = s.rings[index] + DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode];\n              if (s.distance < 0) {\n                return makeError(s, -12);\n              }\n            } else {\n              const /** @type {number} */ extraBits = s.distExtraBits[distanceCode];\n              let /** @type {number} */ bits;\n              if (s.bitOffset + extraBits <= 32) {\n                bits = readFewBits(s, extraBits);\n              } else {\n                if (s.bitOffset >= 16) {\n                  s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n                  s.bitOffset -= 16;\n                }\n                bits = (extraBits <= 16) ? readFewBits(s, extraBits) : readManyBits(s, extraBits);\n              }\n              s.distance = s.distOffset[distanceCode] + (bits << s.distancePostfixBits);\n            }\n          }\n          if (s.maxDistance !== s.maxBackwardDistance && s.pos < s.maxBackwardDistance) {\n            s.maxDistance = s.pos;\n          } else {\n            s.maxDistance = s.maxBackwardDistance;\n          }\n          if (s.distance > s.maxDistance) {\n            s.runningState = 9;\n            continue;\n          }\n          if (distanceCode > 0) {\n            s.distRbIdx = (s.distRbIdx + 1) & 0x3;\n            s.rings[s.distRbIdx] = s.distance;\n          }\n          if (s.copyLength > s.metaBlockLength) {\n            return makeError(s, -9);\n          }\n          s.j = 0;\n          s.runningState = 8;\n          continue;\n        case 8:\n          let /** @type {number} */ src = (s.pos - s.distance) & ringBufferMask;\n          let /** @type {number} */ dst = s.pos;\n          const /** @type {number} */ copyLength = s.copyLength - s.j;\n          const /** @type {number} */ srcEnd = src + copyLength;\n          const /** @type {number} */ dstEnd = dst + copyLength;\n          if ((srcEnd < ringBufferMask) && (dstEnd < ringBufferMask)) {\n            if (copyLength < 12 || (srcEnd > dst && dstEnd > src)) {\n              const /** @type {number} */ numQuads = (copyLength + 3) >> 2;\n              for (let /** @type {number} */ k = 0; k < numQuads; ++k) {\n                ringBuffer[dst++] = ringBuffer[src++];\n                ringBuffer[dst++] = ringBuffer[src++];\n                ringBuffer[dst++] = ringBuffer[src++];\n                ringBuffer[dst++] = ringBuffer[src++];\n              }\n            } else {\n              ringBuffer.copyWithin(dst, src, srcEnd);\n            }\n            s.j += copyLength;\n            s.metaBlockLength -= copyLength;\n            s.pos += copyLength;\n          } else {\n            while (s.j < s.copyLength) {\n              ringBuffer[s.pos] = ringBuffer[(s.pos - s.distance) & ringBufferMask];\n              s.metaBlockLength--;\n              s.pos++;\n              s.j++;\n              if (s.pos >= fence) {\n                s.nextRunningState = 8;\n                s.runningState = 12;\n                break;\n              }\n            }\n          }\n          if (s.runningState === 8) {\n            s.runningState = 4;\n          }\n          continue;\n        case 9:\n          result = doUseDictionary(s, fence);\n          if (result < 0) {\n            return result;\n          }\n          continue;\n        case 14:\n          s.pos += copyFromCompoundDictionary(s, fence);\n          if (s.pos >= fence) {\n            s.nextRunningState = 14;\n            s.runningState = 12;\n            return 2;\n          }\n          s.runningState = 4;\n          continue;\n        case 5:\n          while (s.metaBlockLength > 0) {\n            if (s.halfOffset > 2030) {\n              result = readMoreInput(s);\n              if (result < 0) {\n                return result;\n              }\n            }\n            if (s.bitOffset >= 16) {\n              s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n              s.bitOffset -= 16;\n            }\n            readFewBits(s, 8);\n            s.metaBlockLength--;\n          }\n          s.runningState = 2;\n          continue;\n        case 6:\n          result = copyUncompressedData(s);\n          if (result < 0) {\n            return result;\n          }\n          continue;\n        case 12:\n          s.ringBufferBytesReady = Math.min(s.pos, s.ringBufferSize);\n          s.runningState = 13;\n          continue;\n        case 13:\n          result = writeRingBuffer(s);\n          if (result !== 0) {\n            return result;\n          }\n          if (s.pos >= s.maxBackwardDistance) {\n            s.maxDistance = s.maxBackwardDistance;\n          }\n          if (s.pos >= s.ringBufferSize) {\n            if (s.pos > s.ringBufferSize) {\n              ringBuffer.copyWithin(0, s.ringBufferSize, s.pos);\n            }\n            s.pos = s.pos & ringBufferMask;\n            s.ringBufferBytesWritten = 0;\n          }\n          s.runningState = s.nextRunningState;\n          continue;\n        default:\n          return makeError(s, -28);\n      }\n    }\n    if (s.runningState !== 10) {\n      return makeError(s, -29);\n    }\n    if (s.metaBlockLength < 0) {\n      return makeError(s, -10);\n    }\n    result = jumpToByteBoundary(s);\n    if (result !== 0) {\n      return result;\n    }\n    result = checkHealth(s, 1);\n    if (result !== 0) {\n      return result;\n    }\n    return 1;\n  }\n\n  /**\n   * @constructor\n   * @param {number} numTransforms\n   * @param {number} prefixSuffixLen\n   * @param {number} prefixSuffixCount\n   * @struct\n   */\n  function Transforms(numTransforms, prefixSuffixLen, prefixSuffixCount) {\n    /** @type {number} */\n    this.numTransforms = 0;\n    /** @type {!Int32Array} */\n    this.triplets = new Int32Array(0);\n    /** @type {!Int8Array} */\n    this.prefixSuffixStorage = new Int8Array(0);\n    /** @type {!Int32Array} */\n    this.prefixSuffixHeads = new Int32Array(0);\n    /** @type {!Int16Array} */\n    this.params = new Int16Array(0);\n    this.numTransforms = numTransforms;\n    this.triplets = new Int32Array(numTransforms * 3);\n    this.params = new Int16Array(numTransforms);\n    this.prefixSuffixStorage = new Int8Array(prefixSuffixLen);\n    this.prefixSuffixHeads = new Int32Array(prefixSuffixCount + 1);\n  }\n\n  /** @type {!Transforms} */\n  const RFC_TRANSFORMS = new Transforms(121, 167, 50);\n  /**\n   * @param {!Int8Array} prefixSuffix\n   * @param {!Int32Array} prefixSuffixHeads\n   * @param {!Int32Array} transforms\n   * @param {string} prefixSuffixSrc\n   * @param {string} transformsSrc\n   * @return {void}\n   */\n  function unpackTransforms(prefixSuffix, prefixSuffixHeads, transforms, prefixSuffixSrc, transformsSrc) {\n    const /** @type {!Int32Array} */ prefixSuffixBytes = toUtf8Runes(prefixSuffixSrc);\n    const /** @type {number} */ n = prefixSuffixBytes.length;\n    let /** @type {number} */ index = 1;\n    let /** @type {number} */ j = 0;\n    for (let /** @type {number} */ i = 0; i < n; ++i) {\n      const /** @type {number} */ c = prefixSuffixBytes[i];\n      if (c === 35) {\n        prefixSuffixHeads[index++] = j;\n      } else {\n        prefixSuffix[j++] = c;\n      }\n    }\n    for (let /** @type {number} */ i = 0; i < 363; ++i) {\n      transforms[i] = transformsSrc.charCodeAt(i) - 32;\n    }\n  }\n  {\n    // typo:off\n    unpackTransforms(RFC_TRANSFORMS.prefixSuffixStorage, RFC_TRANSFORMS.prefixSuffixHeads, RFC_TRANSFORMS.triplets, \"# #s #, #e #.# the #.com/#\\xC2\\xA0# of # and # in # to #\\\"#\\\">#\\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\");\n    // typo:on\n  }\n  /**\n   * @param {!Int8Array} dst\n   * @param {number} dstOffset\n   * @param {!Int8Array} src\n   * @param {number} srcOffset\n   * @param {number} wordLen\n   * @param {!Transforms} transforms\n   * @param {number} transformIndex\n   * @return {number}\n   */\n  function transformDictionaryWord(dst, dstOffset, src, srcOffset, wordLen, transforms, transformIndex) {\n    let /** @type {number} */ offset = dstOffset;\n    const /** @type {!Int32Array} */ triplets = transforms.triplets;\n    const /** @type {!Int8Array} */ prefixSuffixStorage = transforms.prefixSuffixStorage;\n    const /** @type {!Int32Array} */ prefixSuffixHeads = transforms.prefixSuffixHeads;\n    const /** @type {number} */ transformOffset = 3 * transformIndex;\n    const /** @type {number} */ prefixIdx = triplets[transformOffset];\n    const /** @type {number} */ transformType = triplets[transformOffset + 1];\n    const /** @type {number} */ suffixIdx = triplets[transformOffset + 2];\n    let /** @type {number} */ prefix = prefixSuffixHeads[prefixIdx];\n    const /** @type {number} */ prefixEnd = prefixSuffixHeads[prefixIdx + 1];\n    let /** @type {number} */ suffix = prefixSuffixHeads[suffixIdx];\n    const /** @type {number} */ suffixEnd = prefixSuffixHeads[suffixIdx + 1];\n    let /** @type {number} */ omitFirst = transformType - 11;\n    let /** @type {number} */ omitLast = transformType;\n    if (omitFirst < 1 || omitFirst > 9) {\n      omitFirst = 0;\n    }\n    if (omitLast < 1 || omitLast > 9) {\n      omitLast = 0;\n    }\n    while (prefix !== prefixEnd) {\n      dst[offset++] = prefixSuffixStorage[prefix++];\n    }\n    let /** @type {number} */ len = wordLen;\n    if (omitFirst > len) {\n      omitFirst = len;\n    }\n    let /** @type {number} */ dictOffset = srcOffset + omitFirst;\n    len -= omitFirst;\n    len -= omitLast;\n    let /** @type {number} */ i = len;\n    while (i > 0) {\n      dst[offset++] = src[dictOffset++];\n      i--;\n    }\n    if (transformType === 10 || transformType === 11) {\n      let /** @type {number} */ uppercaseOffset = offset - len;\n      if (transformType === 10) {\n        len = 1;\n      }\n      while (len > 0) {\n        const /** @type {number} */ c0 = dst[uppercaseOffset] & 0xFF;\n        if (c0 < 0xC0) {\n          if (c0 >= 97 && c0 <= 122) {\n            dst[uppercaseOffset] = dst[uppercaseOffset] ^ 32;\n          }\n          uppercaseOffset += 1;\n          len -= 1;\n        } else if (c0 < 0xE0) {\n          dst[uppercaseOffset + 1] = dst[uppercaseOffset + 1] ^ 32;\n          uppercaseOffset += 2;\n          len -= 2;\n        } else {\n          dst[uppercaseOffset + 2] = dst[uppercaseOffset + 2] ^ 5;\n          uppercaseOffset += 3;\n          len -= 3;\n        }\n      }\n    } else if (transformType === 21 || transformType === 22) {\n      let /** @type {number} */ shiftOffset = offset - len;\n      const /** @type {number} */ param = transforms.params[transformIndex];\n      let /** @type {number} */ scalar = (param & 0x7FFF) + (0x1000000 - (param & 0x8000));\n      while (len > 0) {\n        let /** @type {number} */ step = 1;\n        const /** @type {number} */ c0 = dst[shiftOffset] & 0xFF;\n        if (c0 < 0x80) {\n          scalar += c0;\n          dst[shiftOffset] = scalar & 0x7F;\n        } else if (c0 < 0xC0) {\n        } else if (c0 < 0xE0) {\n          if (len >= 2) {\n            const /** @type {number} */ c1 = dst[shiftOffset + 1];\n            scalar += (c1 & 0x3F) | ((c0 & 0x1F) << 6);\n            dst[shiftOffset] = 0xC0 | ((scalar >> 6) & 0x1F);\n            dst[shiftOffset + 1] = (c1 & 0xC0) | (scalar & 0x3F);\n            step = 2;\n          } else {\n            step = len;\n          }\n        } else if (c0 < 0xF0) {\n          if (len >= 3) {\n            const /** @type {number} */ c1 = dst[shiftOffset + 1];\n            const /** @type {number} */ c2 = dst[shiftOffset + 2];\n            scalar += (c2 & 0x3F) | ((c1 & 0x3F) << 6) | ((c0 & 0x0F) << 12);\n            dst[shiftOffset] = 0xE0 | ((scalar >> 12) & 0x0F);\n            dst[shiftOffset + 1] = (c1 & 0xC0) | ((scalar >> 6) & 0x3F);\n            dst[shiftOffset + 2] = (c2 & 0xC0) | (scalar & 0x3F);\n            step = 3;\n          } else {\n            step = len;\n          }\n        } else if (c0 < 0xF8) {\n          if (len >= 4) {\n            const /** @type {number} */ c1 = dst[shiftOffset + 1];\n            const /** @type {number} */ c2 = dst[shiftOffset + 2];\n            const /** @type {number} */ c3 = dst[shiftOffset + 3];\n            scalar += (c3 & 0x3F) | ((c2 & 0x3F) << 6) | ((c1 & 0x3F) << 12) | ((c0 & 0x07) << 18);\n            dst[shiftOffset] = 0xF0 | ((scalar >> 18) & 0x07);\n            dst[shiftOffset + 1] = (c1 & 0xC0) | ((scalar >> 12) & 0x3F);\n            dst[shiftOffset + 2] = (c2 & 0xC0) | ((scalar >> 6) & 0x3F);\n            dst[shiftOffset + 3] = (c3 & 0xC0) | (scalar & 0x3F);\n            step = 4;\n          } else {\n            step = len;\n          }\n        }\n        shiftOffset += step;\n        len -= step;\n        if (transformType === 21) {\n          len = 0;\n        }\n      }\n    }\n    while (suffix !== suffixEnd) {\n      dst[offset++] = prefixSuffixStorage[suffix++];\n    }\n    return offset - dstOffset;\n  }\n\n  /**\n   * @param {number} key\n   * @param {number} len\n   * @return {number}\n   */\n  function getNextKey(key, len) {\n    let /** @type {number} */ step = 1 << (len - 1);\n    while ((key & step) !== 0) {\n      step = step >> 1;\n    }\n    return (key & (step - 1)) + step;\n  }\n  /**\n   * @param {!Int32Array} table\n   * @param {number} offset\n   * @param {number} step\n   * @param {number} end\n   * @param {number} item\n   * @return {void}\n   */\n  function replicateValue(table, offset, step, end, item) {\n    let /** @type {number} */ pos = end;\n    while (pos > 0) {\n      pos -= step;\n      table[offset + pos] = item;\n    }\n  }\n  /**\n   * @param {!Int32Array} count\n   * @param {number} len\n   * @param {number} rootBits\n   * @return {number}\n   */\n  function nextTableBitSize(count, len, rootBits) {\n    let /** @type {number} */ bits = len;\n    let /** @type {number} */ left = 1 << (bits - rootBits);\n    while (bits < 15) {\n      left -= count[bits];\n      if (left <= 0) {\n        break;\n      }\n      bits++;\n      left = left << 1;\n    }\n    return bits - rootBits;\n  }\n  /**\n   * @param {!Int32Array} tableGroup\n   * @param {number} tableIdx\n   * @param {number} rootBits\n   * @param {!Int32Array} codeLengths\n   * @param {number} codeLengthsSize\n   * @return {number}\n   */\n  function buildHuffmanTable(tableGroup, tableIdx, rootBits, codeLengths, codeLengthsSize) {\n    const /** @type {number} */ tableOffset = tableGroup[tableIdx];\n    const /** @type {!Int32Array} */ sorted = new Int32Array(codeLengthsSize);\n    const /** @type {!Int32Array} */ count = new Int32Array(16);\n    const /** @type {!Int32Array} */ offset = new Int32Array(16);\n    for (let /** @type {number} */ sym = 0; sym < codeLengthsSize; ++sym) {\n      count[codeLengths[sym]]++;\n    }\n    offset[1] = 0;\n    for (let /** @type {number} */ len = 1; len < 15; ++len) {\n      offset[len + 1] = offset[len] + count[len];\n    }\n    for (let /** @type {number} */ sym = 0; sym < codeLengthsSize; ++sym) {\n      if (codeLengths[sym] !== 0) {\n        sorted[offset[codeLengths[sym]]++] = sym;\n      }\n    }\n    let /** @type {number} */ tableBits = rootBits;\n    let /** @type {number} */ tableSize = 1 << tableBits;\n    let /** @type {number} */ totalSize = tableSize;\n    if (offset[15] === 1) {\n      for (let /** @type {number} */ k = 0; k < totalSize; ++k) {\n        tableGroup[tableOffset + k] = sorted[0];\n      }\n      return totalSize;\n    }\n    let /** @type {number} */ key = 0;\n    let /** @type {number} */ symbol = 0;\n    let /** @type {number} */ step = 1;\n    for (let /** @type {number} */ len = 1; len <= rootBits; ++len) {\n      step = step << 1;\n      while (count[len] > 0) {\n        replicateValue(tableGroup, tableOffset + key, step, tableSize, len << 16 | sorted[symbol++]);\n        key = getNextKey(key, len);\n        count[len]--;\n      }\n    }\n    const /** @type {number} */ mask = totalSize - 1;\n    let /** @type {number} */ low = -1;\n    let /** @type {number} */ currentOffset = tableOffset;\n    step = 1;\n    for (let /** @type {number} */ len = rootBits + 1; len <= 15; ++len) {\n      step = step << 1;\n      while (count[len] > 0) {\n        if ((key & mask) !== low) {\n          currentOffset += tableSize;\n          tableBits = nextTableBitSize(count, len, rootBits);\n          tableSize = 1 << tableBits;\n          totalSize += tableSize;\n          low = key & mask;\n          tableGroup[tableOffset + low] = (tableBits + rootBits) << 16 | (currentOffset - tableOffset - low);\n        }\n        replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize, (len - rootBits) << 16 | sorted[symbol++]);\n        key = getNextKey(key, len);\n        count[len]--;\n      }\n    }\n    return totalSize;\n  }\n\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function readMoreInput(s) {\n    if (s.endOfStreamReached !== 0) {\n      if (halfAvailable(s) >= -2) {\n        return 0;\n      }\n      return makeError(s, -16);\n    }\n    const /** @type {number} */ readOffset = s.halfOffset << 1;\n    let /** @type {number} */ bytesInBuffer = 4096 - readOffset;\n    s.byteBuffer.copyWithin(0, readOffset, 4096);\n    s.halfOffset = 0;\n    while (bytesInBuffer < 4096) {\n      const /** @type {number} */ spaceLeft = 4096 - bytesInBuffer;\n      const /** @type {number} */ len = readInput(s, s.byteBuffer, bytesInBuffer, spaceLeft);\n      if (len < -1) {\n        return len;\n      }\n      if (len <= 0) {\n        s.endOfStreamReached = 1;\n        s.tailBytes = bytesInBuffer;\n        bytesInBuffer += 1;\n        break;\n      }\n      bytesInBuffer += len;\n    }\n    bytesToNibbles(s, bytesInBuffer);\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} endOfStream\n   * @return {number}\n   */\n  function checkHealth(s, endOfStream) {\n    if (s.endOfStreamReached === 0) {\n      return 0;\n    }\n    const /** @type {number} */ byteOffset = (s.halfOffset << 1) + ((s.bitOffset + 7) >> 3) - 4;\n    if (byteOffset > s.tailBytes) {\n      return makeError(s, -13);\n    }\n    if ((endOfStream !== 0) && (byteOffset !== s.tailBytes)) {\n      return makeError(s, -17);\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} n\n   * @return {number}\n   */\n  function readFewBits(s, n) {\n    const /** @type {number} */ v = (s.accumulator32 >>> s.bitOffset) & ((1 << n) - 1);\n    s.bitOffset += n;\n    return v;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} n\n   * @return {number}\n   */\n  function readManyBits(s, n) {\n    const /** @type {number} */ low = readFewBits(s, 16);\n    s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n    s.bitOffset -= 16;\n    return low | (readFewBits(s, n - 16) << 16);\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function initBitReader(s) {\n    s.byteBuffer = new Int8Array(4160);\n    s.accumulator32 = 0;\n    s.shortBuffer = new Int16Array(2080);\n    s.bitOffset = 32;\n    s.halfOffset = 2048;\n    s.endOfStreamReached = 0;\n    return prepare(s);\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function prepare(s) {\n    if (s.halfOffset > 2030) {\n      const /** @type {number} */ result = readMoreInput(s);\n      if (result !== 0) {\n        return result;\n      }\n    }\n    let /** @type {number} */ health = checkHealth(s, 0);\n    if (health !== 0) {\n      return health;\n    }\n    s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n    s.bitOffset -= 16;\n    s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n    s.bitOffset -= 16;\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function reload(s) {\n    if (s.bitOffset === 32) {\n      return prepare(s);\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function jumpToByteBoundary(s) {\n    const /** @type {number} */ padding = (32 - s.bitOffset) & 7;\n    if (padding !== 0) {\n      const /** @type {number} */ paddingBits = readFewBits(s, padding);\n      if (paddingBits !== 0) {\n        return makeError(s, -5);\n      }\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @return {number}\n   */\n  function halfAvailable(s) {\n    let /** @type {number} */ limit = 2048;\n    if (s.endOfStreamReached !== 0) {\n      limit = (s.tailBytes + 1) >> 1;\n    }\n    return limit - s.halfOffset;\n  }\n  /**\n   * @param {!State} s\n   * @param {!Int8Array} data\n   * @param {number} offset\n   * @param {number} length\n   * @return {number}\n   */\n  function copyRawBytes(s, data, offset, length) {\n    let /** @type {number} */ pos = offset;\n    let /** @type {number} */ len = length;\n    if ((s.bitOffset & 7) !== 0) {\n      return makeError(s, -30);\n    }\n    while ((s.bitOffset !== 32) && (len !== 0)) {\n      data[pos++] = s.accumulator32 >>> s.bitOffset;\n      s.bitOffset += 8;\n      len--;\n    }\n    if (len === 0) {\n      return 0;\n    }\n    const /** @type {number} */ copyNibbles = Math.min(halfAvailable(s), len >> 1);\n    if (copyNibbles > 0) {\n      const /** @type {number} */ readOffset = s.halfOffset << 1;\n      const /** @type {number} */ delta = copyNibbles << 1;\n      data.set(s.byteBuffer.subarray(readOffset, readOffset + delta), pos);\n      pos += delta;\n      len -= delta;\n      s.halfOffset += copyNibbles;\n    }\n    if (len === 0) {\n      return 0;\n    }\n    if (halfAvailable(s) > 0) {\n      if (s.bitOffset >= 16) {\n        s.accumulator32 = (s.shortBuffer[s.halfOffset++] << 16) | (s.accumulator32 >>> 16);\n        s.bitOffset -= 16;\n      }\n      while (len !== 0) {\n        data[pos++] = s.accumulator32 >>> s.bitOffset;\n        s.bitOffset += 8;\n        len--;\n      }\n      return checkHealth(s, 0);\n    }\n    while (len > 0) {\n      const /** @type {number} */ chunkLen = readInput(s, data, pos, len);\n      if (chunkLen < -1) {\n        return chunkLen;\n      }\n      if (chunkLen <= 0) {\n        return makeError(s, -16);\n      }\n      pos += chunkLen;\n      len -= chunkLen;\n    }\n    return 0;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} byteLen\n   * @return {void}\n   */\n  function bytesToNibbles(s, byteLen) {\n    const /** @type {!Int8Array} */ byteBuffer = s.byteBuffer;\n    const /** @type {number} */ halfLen = byteLen >> 1;\n    const /** @type {!Int16Array} */ shortBuffer = s.shortBuffer;\n    for (let /** @type {number} */ i = 0; i < halfLen; ++i) {\n      shortBuffer[i] = (byteBuffer[i * 2] & 0xFF) | ((byteBuffer[(i * 2) + 1] & 0xFF) << 8);\n    }\n  }\n\n  /** @type {!Int32Array} */\n  const LOOKUP = new Int32Array(2048);\n  /**\n   * @param {!Int32Array} lookup\n   * @param {string} utfMap\n   * @param {string} utfRle\n   * @return {void}\n   */\n  function unpackLookupTable(lookup, utfMap, utfRle) {\n    for (let /** @type {number} */ i = 0; i < 256; ++i) {\n      lookup[i] = i & 0x3F;\n      lookup[512 + i] = i >> 2;\n      lookup[1792 + i] = 2 + (i >> 6);\n    }\n    for (let /** @type {number} */ i = 0; i < 128; ++i) {\n      lookup[1024 + i] = 4 * (utfMap.charCodeAt(i) - 32);\n    }\n    for (let /** @type {number} */ i = 0; i < 64; ++i) {\n      lookup[1152 + i] = i & 1;\n      lookup[1216 + i] = 2 + (i & 1);\n    }\n    let /** @type {number} */ offset = 1280;\n    for (let /** @type {number} */ k = 0; k < 19; ++k) {\n      const /** @type {number} */ value = k & 3;\n      const /** @type {number} */ rep = utfRle.charCodeAt(k) - 32;\n      for (let /** @type {number} */ i = 0; i < rep; ++i) {\n        lookup[offset++] = value;\n      }\n    }\n    for (let /** @type {number} */ i = 0; i < 16; ++i) {\n      lookup[1792 + i] = 1;\n      lookup[2032 + i] = 6;\n    }\n    lookup[1792] = 0;\n    lookup[2047] = 7;\n    for (let /** @type {number} */ i = 0; i < 256; ++i) {\n      lookup[1536 + i] = lookup[1792 + i] << 3;\n    }\n  }\n  {\n    unpackLookupTable(LOOKUP, \"         !!  !                  \\\"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# \", \"A/*  ':  & : $  \\x81 @\");\n  }\n\n  /**\n   * @constructor\n   * @struct\n   */\n  function State() {\n    /** @type {!Int8Array} */\n    this.ringBuffer = new Int8Array(0);\n    /** @type {!Int8Array} */\n    this.contextModes = new Int8Array(0);\n    /** @type {!Int8Array} */\n    this.contextMap = new Int8Array(0);\n    /** @type {!Int8Array} */\n    this.distContextMap = new Int8Array(0);\n    /** @type {!Int8Array} */\n    this.distExtraBits = new Int8Array(0);\n    /** @type {!Int8Array} */\n    this.output = new Int8Array(0);\n    /** @type {!Int8Array} */\n    this.byteBuffer = new Int8Array(0);\n    /** @type {!Int16Array} */\n    this.shortBuffer = new Int16Array(0);\n    /** @type {!Int32Array} */\n    this.intBuffer = new Int32Array(0);\n    /** @type {!Int32Array} */\n    this.rings = new Int32Array(0);\n    /** @type {!Int32Array} */\n    this.blockTrees = new Int32Array(0);\n    /** @type {!Int32Array} */\n    this.literalTreeGroup = new Int32Array(0);\n    /** @type {!Int32Array} */\n    this.commandTreeGroup = new Int32Array(0);\n    /** @type {!Int32Array} */\n    this.distanceTreeGroup = new Int32Array(0);\n    /** @type {!Int32Array} */\n    this.distOffset = new Int32Array(0);\n    /** @type {number} */\n    this.accumulator64 = 0;\n    /** @type {number} */\n    this.runningState = 0;\n    /** @type {number} */\n    this.nextRunningState = 0;\n    /** @type {number} */\n    this.accumulator32 = 0;\n    /** @type {number} */\n    this.bitOffset = 0;\n    /** @type {number} */\n    this.halfOffset = 0;\n    /** @type {number} */\n    this.tailBytes = 0;\n    /** @type {number} */\n    this.endOfStreamReached = 0;\n    /** @type {number} */\n    this.metaBlockLength = 0;\n    /** @type {number} */\n    this.inputEnd = 0;\n    /** @type {number} */\n    this.isUncompressed = 0;\n    /** @type {number} */\n    this.isMetadata = 0;\n    /** @type {number} */\n    this.literalBlockLength = 0;\n    /** @type {number} */\n    this.numLiteralBlockTypes = 0;\n    /** @type {number} */\n    this.commandBlockLength = 0;\n    /** @type {number} */\n    this.numCommandBlockTypes = 0;\n    /** @type {number} */\n    this.distanceBlockLength = 0;\n    /** @type {number} */\n    this.numDistanceBlockTypes = 0;\n    /** @type {number} */\n    this.pos = 0;\n    /** @type {number} */\n    this.maxDistance = 0;\n    /** @type {number} */\n    this.distRbIdx = 0;\n    /** @type {number} */\n    this.trivialLiteralContext = 0;\n    /** @type {number} */\n    this.literalTreeIdx = 0;\n    /** @type {number} */\n    this.commandTreeIdx = 0;\n    /** @type {number} */\n    this.j = 0;\n    /** @type {number} */\n    this.insertLength = 0;\n    /** @type {number} */\n    this.contextMapSlice = 0;\n    /** @type {number} */\n    this.distContextMapSlice = 0;\n    /** @type {number} */\n    this.contextLookupOffset1 = 0;\n    /** @type {number} */\n    this.contextLookupOffset2 = 0;\n    /** @type {number} */\n    this.distanceCode = 0;\n    /** @type {number} */\n    this.numDirectDistanceCodes = 0;\n    /** @type {number} */\n    this.distancePostfixBits = 0;\n    /** @type {number} */\n    this.distance = 0;\n    /** @type {number} */\n    this.copyLength = 0;\n    /** @type {number} */\n    this.maxBackwardDistance = 0;\n    /** @type {number} */\n    this.maxRingBufferSize = 0;\n    /** @type {number} */\n    this.ringBufferSize = 0;\n    /** @type {number} */\n    this.expectedTotalSize = 0;\n    /** @type {number} */\n    this.outputOffset = 0;\n    /** @type {number} */\n    this.outputLength = 0;\n    /** @type {number} */\n    this.outputUsed = 0;\n    /** @type {number} */\n    this.ringBufferBytesWritten = 0;\n    /** @type {number} */\n    this.ringBufferBytesReady = 0;\n    /** @type {number} */\n    this.isEager = 0;\n    /** @type {number} */\n    this.isLargeWindow = 0;\n    /** @type {number} */\n    this.cdNumChunks = 0;\n    /** @type {number} */\n    this.cdTotalSize = 0;\n    /** @type {number} */\n    this.cdBrIndex = 0;\n    /** @type {number} */\n    this.cdBrOffset = 0;\n    /** @type {number} */\n    this.cdBrLength = 0;\n    /** @type {number} */\n    this.cdBrCopied = 0;\n    /** @type {!Array<?Int8Array>} */\n    this.cdChunks = new Array(0);\n    /** @type {!Int32Array} */\n    this.cdChunkOffsets = new Int32Array(0);\n    /** @type {number} */\n    this.cdBlockBits = 0;\n    /** @type {!Int8Array} */\n    this.cdBlockMap = new Int8Array(0);\n    /** @type {!InputStream} */\n    this.input = new InputStream(new Int8Array(0));\n    this.ringBuffer = new Int8Array(0);\n    this.rings = new Int32Array(10);\n    this.rings[0] = 16;\n    this.rings[1] = 15;\n    this.rings[2] = 11;\n    this.rings[3] = 4;\n  }\n\n  /** @type {!ByteBuffer} */\n  let data = new Int8Array(0);\n  /** @type {!Int32Array} */\n  const offsets = new Int32Array(32);\n  /** @type {!Int32Array} */\n  const sizeBits = new Int32Array(32);\n  /**\n   * @param {!Int8Array} newData\n   * @param {!Int32Array} newSizeBits\n   * @return {void}\n   */\n  function setData(newData, newSizeBits) {\n    const /** @type {!Int32Array} */ dictionaryOffsets = offsets;\n    const /** @type {!Int32Array} */ dictionarySizeBits = sizeBits;\n    for (let /** @type {number} */ i = 0; i < newSizeBits.length; ++i) {\n      dictionarySizeBits[i] = newSizeBits[i];\n    }\n    let /** @type {number} */ pos = 0;\n    for (let /** @type {number} */ i = 0; i < newSizeBits.length; ++i) {\n      dictionaryOffsets[i] = pos;\n      const /** @type {number} */ bits = dictionarySizeBits[i];\n      if (bits !== 0) {\n        pos += i << (bits & 31);\n      }\n    }\n    for (let /** @type {number} */ i = newSizeBits.length; i < 32; ++i) {\n      dictionaryOffsets[i] = pos;\n    }\n    data = newData;\n  }\n\n  /**\n   * @param {!Int8Array} dictionary\n   * @param {string} data0\n   * @param {string} data1\n   * @param {string} skipFlip\n   * @param {!Int32Array} sizeBits\n   * @param {string} sizeBitsData\n   * @return {void}\n   */\n  function unpackDictionaryData(dictionary, data0, data1, skipFlip, sizeBits, sizeBitsData) {\n    const /** @type {!Int8Array} */ dict = toUsAsciiBytes(data0 + data1);\n    const /** @type {!Int32Array} */ skipFlipRunes = toUtf8Runes(skipFlip);\n    let /** @type {number} */ offset = 0;\n    const /** @type {number} */ n = skipFlipRunes.length >> 1;\n    for (let /** @type {number} */ i = 0; i < n; ++i) {\n      const /** @type {number} */ skip = skipFlipRunes[2 * i] - 36;\n      const /** @type {number} */ flip = skipFlipRunes[2 * i + 1] - 36;\n      for (let /** @type {number} */ j = 0; j < skip; ++j) {\n        dict[offset] = dict[offset] ^ 3;\n        offset++;\n      }\n      for (let /** @type {number} */ j = 0; j < flip; ++j) {\n        dict[offset] = dict[offset] ^ 236;\n        offset++;\n      }\n    }\n    for (let /** @type {number} */ i = 0; i < sizeBitsData.length; ++i) {\n      sizeBits[i] = sizeBitsData.charCodeAt(i) - 65;\n    }\n    dictionary.set(dict);\n  }\n  {\n    const /** @type {!ByteBuffer} */ dictionaryData = new Int8Array(122784);\n    const /** @type {!Int32Array} */ dictionarySizeBits = new Int32Array(25);\n    // typo:off\n    unpackDictionaryData(dictionaryData, \"wjnfgltmojefofewab`h`lgfgbwbpkltlmozpjwf`jwzlsfmivpwojhfeqfftlqhwf{wzfbqlufqalgzolufelqnallhsobzojufojmfkfosklnfpjgfnlqftlqgolmdwkfnujftejmgsbdfgbzpevookfbgwfqnfb`kbqfbeqlnwqvfnbqhbaofvslmkjdkgbwfobmgmftpfufmmf{w`bpfalwkslpwvpfgnbgfkbmgkfqftkbwmbnfOjmhaoldpjyfabpfkfognbhfnbjmvpfq$*#(klogfmgptjwkMftpqfbgtfqfpjdmwbhfkbufdbnfpffm`boosbwktfoosovpnfmvejonsbqwiljmwkjpojpwdllgmffgtbzptfpwilapnjmgboploldlqj`kvpfpobpwwfbnbqnzellghjmdtjoofbpwtbqgafpwejqfSbdfhmltbtbz-smdnlufwkbmolbgdjufpfoemlwfnv`keffgnbmzql`hj`lmlm`follhkjgfgjfgKlnfqvofklpwbib{jmel`ovaobtpofppkboeplnfpv`kylmf233&lmfp`bqfWjnfqb`faovfelvqtffheb`fklsfdbufkbqgolpwtkfmsbqhhfswsbpppkjsqllnKWNOsobmWzsfglmfpbufhffseobdojmhplogejufwllhqbwfwltmivnswkvpgbqh`bqgejofefbqpwbzhjoowkbweboobvwlfufq-`lnwbohpklsulwfgffsnlgfqfpwwvqmalqmabmgefooqlpfvqo+phjmqlof`lnfb`wpbdfpnffwdlog-isdjwfnubqzefowwkfmpfmggqlsUjft`lsz2-3!?,b=pwlsfopfojfpwlvqsb`h-djesbpw`pp<dqbznfbm%dw8qjgfpklwobwfpbjgqlbgubq#effoilkmqj`hslqwebpw$VB.gfbg?,a=sllqajoowzsfV-P-tllgnvpw1s{8JmelqbmhtjgftbmwtbooofbgX3^8sbvotbufpvqf'+$ tbjwnbppbqnpdlfpdbjmobmdsbjg\\\"..#ol`hvmjwqllwtbohejqntjef{no!plmdwfpw13s{hjmgqltpwlloelmwnbjopbefpwbqnbsp`lqfqbjmeoltabazpsbmpbzp7s{85s{8bqwpellwqfbotjhjkfbwpwfswqjslqd,obhftfbhwlogElqn`bpwebmpabmhufqzqvmpivozwbph2s{8dlbodqftpoltfgdfjg>!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#~sks<kfoowbootklnyk9\\t),\\x0E\\t#233kboo-\\t\\tB4s{8svpk`kbw3s{8`qft),?,kbpk46s{eobwqbqf#%%#wfoo`bnslmwlobjgnjppphjswfmwejmfnbofdfwpsolw733/\\x0E\\t\\x0E\\t`lloeffw-sks?aq=fqj`nlpwdvjgafoogfp`kbjqnbwkbwln,jnd% ;1ov`h`fmw3338wjmzdlmfkwnopfoogqvdEQFFmlgfmj`h<jg>olpfmvooubpwtjmgQPP#tfbqqfozaffmpbnfgvhfmbpb`bsftjpkdvoeW109kjwppolwdbwfhj`haovqwkfz26s{$$*8*8!=npjftjmpajqgplqwafwbpffhW2;9lqgpwqffnboo53s{ebqn\\x0ElupalzpX3^-$*8!SLPWafbqhjgp*8~~nbqzwfmg+VH*rvbgyk9\\n.pjy....sqls$*8\\x0EojewW2:9uj`fbmgzgfaw=QPPsllomf`haoltW259gllqfuboW249ofwpebjolqbosloomlub`lopdfmf#\\x0Elxplewqlnfwjooqlpp?k0=slvqebgfsjmh?wq=njmj*\\x7F\\\"+njmfyk9\\x04abqpkfbq33*8njoh#..=jqlmeqfggjphtfmwpljosvwp,ip,klozW119JPAMW139bgbnpffp?k1=iplm$/#$`lmwW129#QPPollsbpjbnllm?,s=plvoOJMFelqw`bqwW279?k2=;3s{\\\"..?:s{8W379njhf975Ymj`fjm`kZlqhqj`fyk9\\b$**8svqfnbdfsbqbwlmfalmg904Y\\\\le\\\\$^*8333/yk9\\x0Bwbmhzbqgaltoavpk965YIbub03s{\\t\\x7F~\\t&@0&907YifeeF[SJ`bpkujpbdloepmltyk9\\x05rvfq-`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~\\x0E\\tKFBGX3^*baaqivbm+2:;ofpkwtjm?,j=plmzdvzpev`hsjsf\\x7F.\\t\\\"331*mgltX2^8X^8\\tOld#pbow\\x0E\\t\\n\\nabmdwqjnabwk*x\\x0E\\t33s{\\t~*8hl9\\0effpbg=\\x0Ep9,,#X^8wloosovd+*x\\tx\\x0E\\t#-ip$133sgvboalbw-ISD*8\\t~rvlw*8\\t\\t$*8\\t\\x0E\\t~\\x0E1327132613251324132;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<[<\\\\<Q<\\\\<R<P=l<\\\\=l=o=n<\\\\<Q<Y<S<R<R=n<T<[<Q<R<X<R=n<R<Z<Y<R<Q<T=i<q<\\\\<Y<Y<]=g<P=g<~=g=m<R<^=g<^<R<q<R<R<]<s<R<W<T<Q<T<L<H<q<Y<p=g=n=g<r<Q<T<P<X<\\\\<{<\\\\<x<\\\\<q=o<r<]=n<Y<t<[<Y<U<Q=o<P<P<N=g=o<Z5m5f4O5j5i4K5i4U5o5h4O5d4]4C5f4K5m5e5k5d5h5i5h5o4K5d5h5k4D4_4K5h4I5j5k5f4O5f5n4C5k5h4G5i4D5k5h5d5h5f4D5h4K5f4D5o4X5f4K5i4O5i5j4F4D5f5h5j4A4D5k5i5i4X5d4Xejqpwujgflojdkwtlqognfgjbtkjwf`olpfaob`hqjdkwpnbooallhpsob`fnvpj`ejfoglqgfqsljmwubovfofufowbaofalbqgklvpfdqlvstlqhpzfbqppwbwfwlgbztbwfqpwbqwpwzofgfbwksltfqsklmfmjdkwfqqlqjmsvwbalvwwfqnpwjwofwllopfufmwol`bowjnfpobqdftlqgpdbnfppklqwpsb`fel`vp`ofbqnlgfoaol`hdvjgfqbgjlpkbqftlnfmbdbjmnlmfzjnbdfmbnfpzlvmdojmfpobwfq`lolqdqffmeqlmw%bns8tbw`kelq`fsqj`fqvofpafdjmbewfqujpjwjppvfbqfbpafoltjmgf{wlwboklvqpobafosqjmwsqfppavjowojmhppsffgpwvgzwqbgfelvmgpfmpfvmgfqpkltmelqnpqbmdfbggfgpwjoonlufgwbhfmbalufeobpkej{fglewfmlwkfqujftp`kf`hofdboqjufqjwfnprvj`hpkbsfkvnbmf{jpwdljmdnlujfwkjqgabpj`sfb`fpwbdftjgwkoldjmjgfbptqlwfsbdfpvpfqpgqjufpwlqfaqfbhplvwkulj`fpjwfpnlmwktkfqfavjogtkj`kfbqwkelqvnwkqffpslqwsbqwz@oj`holtfqojufp`obppobzfqfmwqzpwlqzvpbdfplvmg`lvqwzlvq#ajqwkslsvswzsfpbssozJnbdfafjmdvssfqmlwfpfufqzpkltpnfbmpf{wqbnbw`kwqb`hhmltmfbqozafdbmpvsfqsbsfqmlqwkofbqmdjufmmbnfgfmgfgWfqnpsbqwpDqlvsaqbmgvpjmdtlnbmebopfqfbgzbvgjlwbhfptkjof-`ln,ojufg`bpfpgbjoz`kjogdqfbwivgdfwklpfvmjwpmfufqaqlbg`lbpw`lufqbssofejofp`z`ofp`fmfsobmp`oj`htqjwfrvffmsjf`ffnbjoeqbnflogfqsklwlojnjw`b`kf`jujop`boffmwfqwkfnfwkfqfwlv`kalvmgqlzbobphfgtklofpjm`fpwl`h#mbnfebjwkkfbqwfnswzleefqp`lsfltmfgnjdkwboavnwkjmhaollgbqqbznbilqwqvpw`bmlmvmjlm`lvmwubojgpwlmfPwzofOldjmkbsszl``vqofew9eqfpkrvjwfejonpdqbgfmffgpvqabmejdkwabpjpklufqbvwl8qlvwf-kwnonj{fgejmboZlvq#pojgfwlsj`aqltmbolmfgqbtmpsojwqfb`kQjdkwgbwfpnbq`krvlwfdllgpOjmhpglvawbpzm`wkvnaboolt`kjfezlvwkmlufo23s{8pfqufvmwjokbmgp@kf`hPsb`frvfqzibnfpfrvbowtj`f3/333Pwbqwsbmfoplmdpqlvmgfjdkwpkjewtlqwkslpwpofbgptffhpbuljgwkfpfnjofpsobmfpnbqwboskbsobmwnbqhpqbwfpsobzp`objnpbofpwf{wppwbqptqlmd?,k0=wkjmd-lqd,nvowjkfbqgSltfqpwbmgwlhfmplojg+wkjpaqjmdpkjsppwbeewqjfg`boopevoozeb`wpbdfmwWkjp#,,..=bgnjmfdzswFufmw26s{8Fnbjowqvf!`qlpppsfmwaoldpal{!=mlwfgofbuf`kjmbpjyfpdvfpw?,k7=qlalwkfbuzwqvf/pfufmdqbmg`qjnfpjdmpbtbqfgbm`fskbpf=?\\\"..fm\\\\VP% 0:8133s{\\\\mbnfobwjmfmilzbib{-bwjlmpnjwkV-P-#klogpsfwfqjmgjbmbu!=`kbjmp`lqf`lnfpgljmdsqjlqPkbqf2::3pqlnbmojpwpibsbmeboopwqjboltmfqbdqff?,k1=bavpfbofqwlsfqb!.,,T`bqgpkjoopwfbnpSklwlwqvwk`ofbm-sks<pbjmwnfwboolvjpnfbmwsqlleaqjfeqlt!=dfmqfwqv`hollhpUbovfEqbnf-mfw,..=\\t?wqz#x\\tubq#nbhfp`lpwpsobjmbgvowrvfpwwqbjmobalqkfosp`bvpfnbdj`nlwlqwkfjq163s{ofbpwpwfsp@lvmw`lvogdobpppjgfpevmgpklwfobtbqgnlvwknlufpsbqjpdjufpgvw`kwf{bpeqvjwmvoo/\\x7F\\x7FX^8wls!=\\t?\\\"..SLPW!l`fbm?aq,=eollqpsfbhgfswk#pjyfabmhp`bw`k`kbqw13s{8bojdmgfboptlvog63s{8vqo>!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\\x0E\\tabmgprvfvf>#x~8;3s{8`hjmdx\\x0E\\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*#\\x7F\\x7F#oftjppkboo 30:8#elq#olufgtbpwf33s{8ib9\\x0Fnpjnlm?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*(-isd\\x7Fpvjwfpoj`fkbqqz213!#ptffwwq=\\x0E\\tmbnf>gjfdlsbdf#ptjpp..=\\t\\t eee8!=Old-`ln!wqfbwpkffw*#%%#27s{8poffsmwfmwejofgib9\\x0Fojg>!`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=\\x0E\\t?\\\"pwffo#zlv#k1=\\x0E\\telqn#ifpvp233&#nfmv-\\x0E\\t\\n\\x0E\\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{\\x7F`bmbgbbdfm`zp`kfnfqfnbjmAqbyjopbnsofoldl!=afzlmg.p`bofb``fswpfqufgnbqjmfEllwfq`bnfqb?,k2=\\t\\\\elqn!ofbufppwqfpp!#,=\\x0E\\t-dje!#lmolbgolbgfqL{elqgpjpwfqpvqujuojpwfmefnbofGfpjdmpjyf>!bssfbowf{w!=ofufopwkbmhpkjdkfqelq`fgbmjnbobmzlmfBeqj`bbdqffgqf`fmwSflsof?aq#,=tlmgfqsqj`fpwvqmfg\\x7F\\x7F#x~8nbjm!=jmojmfpvmgbztqbs!=ebjofg`fmpvpnjmvwfafb`lmrvlwfp263s{\\x7Ffpwbwfqfnlwffnbjo!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#\\x7F\\x7F#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=\\x0Evpjmd#\\t\\nubq#=$*8\\t\\n?,wg=\\t?,wq=\\tabkbpbaqbpjodbofdlnbdzbqslophjpqsphj4]4C5d\\bTA\\nzk\\x0BBl\\bQ\\x7F\\x0BUm\\x05Gx\\bSM\\nmC\\bTA\\twQ\\nd}\\bW@\\bTl\\bTF\\ti@\\tcT\\x0BBM\\x0B|j\\x04BV\\tqw\\tcC\\bWI\\npa\\tfM\\n{Z\\x05{X\\bTF\\bVV\\bVK\\t\\x7Fm\\x04kF\\t[]\\bPm\\bTv\\nsI\\x0Bpg\\t[I\\bQp\\x04mx\\x0B_W\\n^M\\npe\\x0BQ}\\x0BGu\\nel\\npe\\x04Ch\\x04BV\\bTA\\tSo\\nzk\\x0BGL\\x0BxD\\nd[\\x05Jz\\x05MY\\bQp\\x04li\\nfl\\npC\\x05{B\\x05Nt\\x0BwT\\ti_\\bTg\\x04QQ\\n|p\\x0BXN\\bQS\\x0BxD\\x04QC\\bWZ\\tpD\\x0BVS\\bTW\\x05Nt\\x04Yh\\nzu\\x04Kj\\x05N}\\twr\\tHa\\n_D\\tj`\\x0BQ}\\x0BWp\\nxZ\\x04{c\\tji\\tBU\\nbD\\x04a|\\tTn\\tpV\\nZd\\nmC\\x0BEV\\x05{X\\tc}\\tTo\\bWl\\bUd\\tIQ\\tcg\\x0Bxs\\nXW\\twR\\x0Bek\\tc}\\t]y\\tJn\\nrp\\neg\\npV\\nz\\\\\\x05{W\\npl\\nz\\\\\\nzU\\tPc\\t`{\\bV@\\nc|\\bRw\\ti_\\bVb\\nwX\\tHv\\x04Su\\bTF\\x0B_W\\x0BWs\\x0BsI\\x05m\\x7F\\nTT\\ndc\\tUS\\t}f\\tiZ\\bWz\\tc}\\x04MD\\tBe\\tiD\\x0B@@\\bTl\\bPv\\t}t\\x04Sw\\x04M`\\x0BnU\\tkW\\x0Bed\\nqo\\x0BxY\\tA|\\bTz\\x0By`\\x04BR\\x04BM\\tia\\x04XU\\nyu\\x04n^\\tfL\\tiI\\nXW\\tfD\\bWz\\bW@\\tyj\\t\\x7Fm\\tav\\tBN\\x0Bb\\\\\\tpD\\bTf\\nY[\\tJn\\bQy\\t[^\\x0BWc\\x0Byu\\x04Dl\\x04CJ\\x0BWj\\x0BHR\\t`V\\x0BuW\\tQy\\np@\\x0BGu\\x05pl\\x04Jm\\bW[\\nLP\\nxC\\n`m\\twQ\\x05ui\\x05\\x7FR\\nbI\\twQ\\tBZ\\tWV\\x04BR\\npg\\tcg\\x05ti\\x04CW\\n_y\\tRg\\bQa\\x0BQB\\x0BWc\\nYb\\x05le\\ngE\\x04Su\\nL[\\tQ\\x7F\\tea\\tdj\\x0B]W\\nb~\\x04M`\\twL\\bTV\\bVH\\nt\\x7F\\npl\\t|b\\x05s_\\bU|\\bTa\\x04oQ\\x05lv\\x04Sk\\x04M`\\bTv\\x0BK}\\nfl\\tcC\\x04oQ\\x04BR\\tHk\\t|d\\bQp\\tHK\\tBZ\\x0BHR\\bPv\\x0BLx\\x0BEZ\\bT\\x7F\\bTv\\tiD\\x05oD\\x05MU\\x0BwB\\x04Su\\x05k`\\x04St\\ntC\\tPl\\tKg\\noi\\tjY\\x0BxY\\x04h}\\nzk\\bWZ\\t\\x7Fm\\x0Be`\\tTB\\tfE\\nzk\\t`z\\x04Yh\\nV|\\tHK\\tAJ\\tAJ\\bUL\\tp\\\\\\tql\\nYc\\x04Kd\\nfy\\x04Yh\\t[I\\x0BDg\\x04Jm\\n]n\\nlb\\bUd\\n{Z\\tlu\\tfs\\x04oQ\\bTW\\x04Jm\\x0BwB\\tea\\x04Yh\\x04BC\\tsb\\tTn\\nzU\\n_y\\x0BxY\\tQ]\\ngw\\x04mt\\tO\\\\\\ntb\\bWW\\bQy\\tmI\\tV[\\ny\\\\\\naB\\x0BRb\\twQ\\n]Q\\x04QJ\\bWg\\x0BWa\\bQj\\ntC\\bVH\\nYm\\x0Bxs\\bVK\\nel\\bWI\\x0BxY\\x04Cq\\ntR\\x0BHV\\bTl\\bVw\\tay\\bQa\\bVV\\t}t\\tdj\\nr|\\tp\\\\\\twR\\n{i\\nTT\\t[I\\ti[\\tAJ\\x0Bxs\\x0B_W\\td{\\x0BQ}\\tcg\\tTz\\tA|\\tCj\\x0BLm\\x05N}\\x05m\\x7F\\nbK\\tdZ\\tp\\\\\\t`V\\tsV\\np@\\tiD\\twQ\\x0BQ}\\bTf\\x05ka\\x04Jm\\x0B@@\\bV`\\tzp\\n@N\\x04Sw\\tiI\\tcg\\noi\\x04Su\\bVw\\x04lo\\x04Cy\\tc}\\x0Bb\\\\\\tsU\\x04BA\\bWI\\bTf\\nxS\\tVp\\nd|\\bTV\\x0BbC\\tNo\\x05Ju\\nTC\\t|`\\n{Z\\tD]\\bU|\\tc}\\x05lm\\bTl\\tBv\\tPl\\tc}\\bQp\\t\\x7Fm\\nLk\\tkj\\n@N\\x04Sb\\x04KO\\tj_\\tp\\\\\\nzU\\bTl\\bTg\\bWI\\tcf\\x04XO\\bWW\\ndz\\x04li\\tBN\\nd[\\bWO\\x04MD\\x0BKC\\tdj\\tI_\\bVV\\ny\\\\\\x0BLm\\x05xl\\txB\\tkV\\x0Bb\\\\\\x0BJW\\x0BVS\\tVx\\x0BxD\\td{\\x04MD\\bTa\\t|`\\x0BPz\\x04R}\\x0BWs\\x04BM\\nsI\\x04CN\\bTa\\x04Jm\\npe\\ti_\\npV\\nrh\\tRd\\tHv\\n~A\\nxR\\x0BWh\\x0BWk\\nxS\\x0BAz\\x0BwX\\nbI\\x04oQ\\tfw\\nqI\\nV|\\nun\\x05z\\x7F\\x0Bpg\\td\\\\\\x0BoA\\x05{D\\ti_\\x05xB\\bT\\x7F\\t`V\\x05qr\\tTT\\x04g]\\x04CA\\x0BuR\\tVJ\\tT`\\npw\\x0BRb\\tI_\\nCx\\x04Ro\\x0BsI\\x04Cj\\x04Kh\\tBv\\tWV\\x04BB\\x05oD\\x05{D\\nhc\\x04Km\\x0B^R\\tQE\\n{I\\np@\\nc|\\x05Gt\\tc}\\x04Dl\\nzU\\x05qN\\tsV\\x05k}\\tHh\\x0B|j\\nqo\\x05u|\\tQ]\\x0Bek\\x05\\x7FZ\\x04M`\\x04St\\npe\\tdj\\bVG\\x0BeE\\t\\x7Fm\\x0BWc\\x04|I\\n[W\\tfL\\bT\\x7F\\tBZ\\x04Su\\x0BKa\\x04Cq\\x05Nt\\x04Y[\\nqI\\bTv\\tfM\\ti@\\t}f\\x04B\\\\\\tQy\\x0BBl\\bWg\\x04XD\\x05kc\\x0Bx[\\bVV\\tQ]\\t\\x7Fa\\tPy\\x0BxD\\nfI\\t}f\\x05oD\\tdj\\tSG\\x05ls\\t~D\\x04CN\\n{Z\\t\\\\v\\n_D\\nhc\\x0Bx_\\x04C[\\tAJ\\nLM\\tVx\\x04CI\\tbj\\tc^\\tcF\\ntC\\x04Sx\\twr\\x04XA\\bU\\\\\\t|a\\x0BK\\\\\\bTV\\bVj\\nd|\\tfs\\x04CX\\ntb\\bRw\\tVx\\tAE\\tA|\\bT\\x7F\\x05Nt\\x0BDg\\tVc\\bTl\\x04d@\\npo\\t\\x7FM\\tcF\\npe\\tiZ\\tBo\\bSq\\nfH\\x04l`\\bTx\\bWf\\tHE\\x0BF{\\tcO\\tfD\\nlm\\x0BfZ\\nlm\\x0BeU\\tdG\\x04BH\\bTV\\tSi\\x05MW\\nwX\\nz\\\\\\t\\\\c\\x04CX\\nd}\\tl}\\bQp\\bTV\\tF~\\bQ\\x7F\\t`i\\ng@\\x05nO\\bUd\\bTl\\nL[\\twQ\\tji\\ntC\\t|J\\nLU\\naB\\x0BxY\\x04Kj\\tAJ\\x05uN\\ti[\\npe\\x04Sk\\x0BDg\\x0Bx]\\bVb\\bVV\\nea\\tkV\\nqI\\bTa\\x04Sk\\nAO\\tpD\\ntb\\nts\\nyi\\bVg\\ti_\\x0B_W\\nLk\\x05Nt\\tyj\\tfM\\x04R\\x7F\\tiI\\bTl\\x0BwX\\tsV\\x0BMl\\nyu\\tAJ\\bVj\\x04KO\\tWV\\x0BA}\\x0BW\\x7F\\nrp\\tiD\\x0B|o\\x05lv\\x0BsI\\x04BM\\td~\\tCU\\bVb\\x04eV\\npC\\x0BwT\\tj`\\tc}\\x0Bxs\\x0Bps\\x0Bvh\\tWV\\x0BGg\\x0BAe\\x0BVK\\x0B]W\\trg\\x0BWc\\x05F`\\tBr\\x0Bb\\\\\\tdZ\\bQp\\nqI\\x04kF\\nLk\\x0BAR\\bWI\\bTg\\tbs\\tdw\\n{L\\n_y\\tiZ\\bTA\\tlg\\bVV\\bTl\\tdk\\n`k\\ta{\\ti_\\x05{A\\x05wj\\twN\\x0B@@\\bTe\\ti_\\n_D\\twL\\nAH\\x0BiK\\x0Bek\\n[]\\tp_\\tyj\\bTv\\tUS\\t[r\\n{I\\nps\\x05Gt\\x0BVK\\npl\\x04S}\\x0BWP\\t|d\\x04MD\\x0BHV\\bT\\x7F\\x04R}\\x04M`\\bTV\\bVH\\x05lv\\x04Ch\\bW[\\x04Ke\\tR{\\x0B^R\\tab\\tBZ\\tVA\\tB`\\nd|\\nhs\\x04Ke\\tBe\\x04Oi\\tR{\\td\\\\\\x05nB\\bWZ\\tdZ\\tVJ\\x05Os\\t\\x7Fm\\x04uQ\\x0BhZ\\x04Q@\\x04QQ\\nfI\\bW[\\x04B\\\\\\x04li\\nzU\\nMd\\x04M`\\nxS\\bVV\\n\\\\}\\x0BxD\\t\\x7Fm\\bTp\\x04IS\\nc|\\tkV\\x05i~\\tV{\\x0BhZ\\t|b\\bWt\\n@R\\x0BoA\\x0BnU\\bWI\\tea\\tB`\\tiD\\tc}\\tTz\\x04BR\\x0BQB\\x05Nj\\tCP\\t[I\\bTv\\t`W\\x05uN\\x0Bpg\\x0Bpg\\x0BWc\\tiT\\tbs\\twL\\tU_\\tc\\\\\\t|h\\x0BKa\\tNr\\tfL\\nq|\\nzu\\nz\\\\\\tNr\\bUg\\t|b\\x04m`\\bTv\\nyd\\nrp\\bWf\\tUX\\x04BV\\nzk\\nd}\\twQ\\t}f\\x04Ce\\x0Bed\\bTW\\bSB\\nxU\\tcn\\bTb\\ne\\x7F\\ta\\\\\\tSG\\bU|\\npV\\nN\\\\\\x04Kn\\x0BnU\\tAt\\tpD\\x0B^R\\x0BIr\\x04b[\\tR{\\tdE\\x0BxD\\x0BWK\\x0BWA\\bQL\\bW@\\x04Su\\bUd\\nDM\\tPc\\x04CA\\x04Dl\\x04oQ\\tHs\\x05wi\\x04ub\\n\\x7Fa\\bQp\\x05Ob\\nLP\\bTl\\x04Y[\\x0BK}\\tAJ\\bQ\\x7F\\x04n^\\x0BsA\\bSM\\nqM\\bWZ\\n^W\\x0Bz{\\x04S|\\tfD\\bVK\\bTv\\bPv\\x04BB\\tCP\\x04dF\\tid\\x0Bxs\\x04mx\\x0Bws\\tcC\\ntC\\tyc\\x05M`\\x0BW\\x7F\\nrh\\bQp\\x0BxD\\x04\\\\o\\nsI\\x04_k\\nzu\\x04kF\\tfD\\x04Xs\\x04XO\\tjp\\bTv\\x04BS\\x05{B\\tBr\\nzQ\\nbI\\tc{\\x04BD\\x04BV\\x05nO\\bTF\\tca\\x05Jd\\tfL\\tPV\\tI_\\nlK\\x04`o\\twX\\npa\\tgu\\bP}\\x05{^\\bWf\\n{I\\tBN\\npa\\x04Kl\\x0Bpg\\tcn\\tfL\\x0Bvh\\x04Cq\\bTl\\x0BnU\\bSq\\x04Cm\\twR\\bUJ\\npe\\nyd\\nYg\\x04Cy\\x0BKW\\tfD\\nea\\x04oQ\\tj_\\tBv\\x04nM\\x0BID\\bTa\\nzA\\x05pl\\n]n\\bTa\\tR{\\tfr\\n_y\\bUg\\x05{X\\x05kk\\x0BxD\\x04|I\\x05xl\\nfy\\x04Ce\\x0BwB\\nLk\\x0Bd]\\noi\\n}h\\tQ]\\npe\\bVw\\x04Hk\\x04OQ\\nzk\\tAJ\\npV\\bPv\\ny\\\\\\tA{\\x04Oi\\bSB\\x04XA\\x0BeE\\tjp\\nq}\\tiD\\x05qN\\x0B^R\\t\\x7Fm\\tiZ\\tBr\\bVg\\noi\\n\\\\X\\tU_\\nc|\\x0BHV\\bTf\\tTn\\x04\\\\N\\x04\\\\N\\nuB\\x05lv\\nyu\\tTd\\bTf\\bPL\\x0B]W\\tdG\\nA`\\nw^\\ngI\\npe\\tdw\\nz\\\\\\x05ia\\bWZ\\tcF\\x04Jm\\n{Z\\bWO\\x04_k\\x04Df\\x04RR\\td\\\\\\bVV\\x0Bxs\\x04BN\\x05ti\\x04lm\\tTd\\t]y\\x0BHV\\tSo\\x0B|j\\x04XX\\tA|\\x0BZ^\\x0BGu\\bTW\\x05M`\\x04kF\\x0BhZ\\x0BVK\\tdG\\x0BBl\\tay\\nxU\\x05qE\\x05nO\\bVw\\nqI\\x04CX\\ne\\x7F\\tPl\\bWO\\x0BLm\\tdL\\x05uH\\x04Cm\\tdT\\x04fn\\x0BwB\\x05ka\\x0BnU\\n@M\\nyT\\tHv\\t\\\\}\\x04Kh\\td~\\x04Yh\\x05k}\\neR\\td\\\\\\bWI\\t|b\\tHK\\tiD\\bTW\\x05MY\\npl\\bQ_\\twr\\x0BAx\\tHE\\bTg\\bSq\\x05vp\\x0Bb\\\\\\bWO\\nOl\\nsI\\nfy\\x0BID\\t\\\\c\\n{Z\\n^~\\npe\\nAO\\tTT\\x0Bxv\\x04k_\\bWO\\x0B|j\\x0BwB\\tQy\\ti@\\tPl\\tHa\\tdZ\\x05k}\\x04ra\\tUT\\x0BJc\\x0Bed\\np@\\tQN\\nd|\\tkj\\tHk\\x04M`\\noi\\twr\\td\\\\\\nlq\\no_\\nlb\\nL[\\tac\\x04BB\\x04BH\\x04Cm\\npl\\tIQ\\bVK\\x0Bxs\\n`e\\x0BiK\\npa\\x04Oi\\tUS\\bTp\\tfD\\nPG\\x05kk\\x04XA\\nz\\\\\\neg\\x0BWh\\twR\\x05qN\\nqS\\tcn\\x04lo\\nxS\\n^W\\tBU\\nt\\x7F\\tHE\\tp\\\\\\tfF\\tfw\\bVV\\bW@\\tak\\x0BVK\\x05ls\\tVJ\\bVV\\x0BeE\\x04\\\\o\\nyX\\nYm\\x04M`\\x05lL\\nd|\\nzk\\tA{\\x05sE\\twQ\\x04XT\\nt\\x7F\\tPl\\t]y\\x0BwT\\x05{p\\x04MD\\x0Bb\\\\\\tQ]\\x04Kj\\tJn\\nAH\\x0BRb\\tBU\\tHK\\t\\\\c\\nfI\\x05m\\x7F\\nqM\\n@R\\tSo\\noi\\x04BT\\tHv\\n_y\\x04Kh\\tBZ\\t]i\\bUJ\\tV{\\x04Sr\\nbI\\x0BGg\\ta_\\bTR\\nfI\\nfl\\t[K\\tII\\x04S|\\x0BuW\\tiI\\bWI\\nqI\\x0B|j\\x04BV\\bVg\\bWZ\\x04kF\\x0Bx]\\bTA\\tab\\tfr\\ti@\\tJd\\tJd\\x0Bps\\nAO\\bTa\\x05xu\\tiD\\nzk\\t|d\\t|`\\bW[\\tlP\\tdG\\bVV\\x0Bw}\\x0BqO\\ti[\\bQ\\x7F\\bTz\\x0BVF\\twN\\x05ts\\tdw\\bTv\\neS\\ngi\\tNr\\x05yS\\npe\\bVV\\bSq\\n`m\\tyj\\tBZ\\x0BWX\\bSB\\tc\\\\\\nUR\\t[J\\tc_\\x04nM\\bWQ\\x0BAx\\nMd\\tBr\\x05ui\\x0BxY\\bSM\\x0BWc\\x0B|j\\x0Bxs\\t}Q\\tBO\\bPL\\bWW\\tfM\\nAO\\tPc\\x0BeU\\x04e^\\bTg\\nqI\\tac\\bPv\\tcF\\x04oQ\\tQ\\x7F\\x0BhZ\\x05ka\\nz\\\\\\tiK\\tBU\\n`k\\tCP\\x04S|\\x04M`\\n{I\\tS{\\x04_O\\tBZ\\x04Zi\\x04Sk\\tps\\tp\\\\\\nYu\\n]s\\nxC\\bWt\\nbD\\tkV\\x0BGu\\x05yS\\nqA\\t[r\\neK\\x04M`\\tdZ\\x05lL\\bUg\\bTl\\nbD\\tUS\\x0Bb\\\\\\tpV\\ncc\\x04S\\\\\\tct\\t`z\\bPL\\x0BWs\\nA`\\neg\\bSq\\x05uE\\x04CR\\x0BDg\\t`W\\x0Bz{\\x0BWc\\x04Sk\\x04Sk\\tbW\\bUg\\tea\\nxZ\\tiI\\tUX\\tVJ\\nqn\\tS{\\x0BRb\\bTQ\\npl\\x05Gt\\x0BuW\\x05uj\\npF\\nqI\\tfL\\t[I\\tia\\x04XO\\nyu\\x0BDg\\x0Bed\\tq{\\x04VG\\bQ\\x7F\\x05ka\\tVj\\tkV\\txB\\nd|\\np@\\tQN\\tPc\\tps\\x04]j\\tkV\\toU\\bTp\\nzU\\x05nB\\x0BB]\\ta{\\bV@\\n]n\\x04m`\\tcz\\tR{\\x04m`\\bQa\\x0BwT\\bSM\\x05MY\\x05qN\\tdj\\x05~s\\x0BQ}\\x05MY\\x0BMB\\tBv\\twR\\bRg\\x0BQ}\\tql\\x0BKC\\nrm\\x05xu\\x04CC\\x0BwB\\x0Bvh\\tBq\\x04Xq\\npV\\ti_\\x05Ob\\x05uE\\nbd\\nqo\\x0B{i\\nC~\\tBL\\x0BeE\\x05uH\\bVj\\x04Ey\\x04Gz\\x0BzR\\x0B{i\\tcf\\n{Z\\n]n\\x04XA\\x0BGu\\x0BnU\\thS\\x0BGI\\nCc\\tHE\\bTA\\tHB\\x04BH\\x04Cj\\nCc\\bTF\\tHE\\nXI\\tA{\\bQ\\x7F\\tc\\\\\\x0BmO\\x0BWX\\nfH\\np@\\x05MY\\bTF\\nlK\\tBt\\nzU\\tTT\\x04Km\\x0BwT\\npV\\ndt\\x0ByI\\tVx\\tQ\\x7F\\tRg\\tTd\\nzU\\bRS\\nLM\\twA\\x04nM\\tTn\\ndS\\t]g\\nLc\\x0BwB\\t}t\\t[I\\tCP\\x04kX\\x0BFm\\x0BhZ\\x05m\\x7F\\ti[\\np@\\x0BQ}\\x0BW\\x7F\\t|d\\nMO\\nMd\\tf_\\tfD\\tcJ\\tHz\\x0BRb\\tio\\tPy\\x04Y[\\nxU\\tct\\x0B@@\\tww\\bPv\\x04BM\\x04FF\\ntb\\x05v|\\x0BKm\\tBq\\tBq\\x04Kh\\x04`o\\nZd\\x04XU\\ti]\\t|`\\tSt\\x04B\\\\\\bQ\\x7F\\x0B_W\\tTJ\\nqI\\t|a\\tA{\\x0BuP\\x04MD\\tPl\\nxR\\tfL\\x0Bws\\tc{\\td\\\\\\bV`\\neg\\tHK\\x05kc\\nd|\\bVV\\ny\\\\\\x05kc\\ti]\\bVG\\t`V\\tss\\tI_\\tAE\\tbs\\tdu\\nel\\tpD\\x0BW\\x7F\\nqs\\x05lv\\bSM\\x04Zi\\x0BVK\\x05ia\\x0BQB\\tQ\\x7F\\n{Z\\bPt\\x0BKl\\nlK\\nhs\\ndS\\bVK\\x05mf\\nd^\\tkV\\tcO\\nc|\\bVH\\t\\\\]\\bTv\\bSq\\tmI\\x0BDg\\tVJ\\tcn\\ny\\\\\\bVg\\bTv\\nyX\\bTF\\t]]\\bTp\\noi\\nhs\\x0BeU\\nBf\\tdj\\x05Mr\\n|p\\t\\\\g\\t]r\\bVb\\x05{D\\nd[\\x04XN\\tfM\\tO\\\\\\x05s_\\tcf\\tiZ\\x04XN\\x0BWc\\tqv\\n`m\\tU^\\x05oD\\nd|\\x0BGg\\tdE\\x0Bwf\\x04lo\\x04u}\\nd|\\x05oQ\\t`i\\x04Oi\\x0BxD\\ndZ\\nCx\\x04Yw\\nzk\\ntb\\ngw\\tyj\\tB`\\nyX\\x0Bps\\ntC\\x0BpP\\x0Bqw\\bPu\\bPX\\tDm\\npw\\x05Nj\\tss\\taG\\x0Bxs\\bPt\\noL\\x04Gz\\tOk\\ti@\\ti]\\x04eC\\tIQ\\tii\\tdj\\x0B@J\\t|d\\x05uh\\bWZ\\x0BeU\\x0BnU\\bTa\\tcC\\x04g]\\nzk\\x04Yh\\bVK\\nLU\\np@\\ntb\\ntR\\tCj\\x0BNP\\ti@\\bP{\\n\\\\}\\n{c\\nwX\\tfL\\bVG\\tc{\\t|`\\tAJ\\t|C\\tfD\\x05ln\\t|d\\tbs\\nqI\\x05{B\\x0BAx\\np@\\nzk\\x0BRb\\x05Os\\x0BWS\\x04e^\\x0BD_\\tBv\\x0BWd\\bVb\\x0Bxs\\x0BeE\\bRw\\n]n\\n|p\\x0Bg|\\tfw\\x05kc\\bTI\\x05ka\\n\\\\T\\x04Sp\\tju\\x0Bps\\npe\\x05u|\\x0BGr\\bVe\\tCU\\x04]M\\x04XU\\x0BxD\\bTa\\tIQ\\x0BWq\\tCU\\tam\\tdj\\bSo\\x04Sw\\x0BnU\\x04Ch\\tQ]\\x05s_\\bPt\\tfS\\bTa\\t\\\\}\\n@O\\x04Yc\\tUZ\\bTx\\npe\\x0BnU\\nzU\\t|}\\tiD\\nz\\\\\\bSM\\x0BxD\\x04BR\\nzQ\\tQN\\x04]M\\x04Yh\\nLP\\x0BFm\\x0BLX\\x05vc\\x0Bql\\x05ka\\tHK\\bVb\\ntC\\nCy\\bTv\\nuV\\x04oQ\\t`z\\t[I\\tB`\\x0BRb\\tyj\\tsb\\x0BWs\\bTl\\tkV\\x0Bed\\ne\\x7F\\x05lL\\x0BxN\\t\\x7Fm\\nJn\\tjY\\x0BxD\\bVb\\bSq\\x0Byu\\twL\\x0BXL\\bTA\\tpg\\tAt\\tnD\\x04XX\\twR\\npl\\nhw\\x05yS\\nps\\tcO\\bW[\\x0B|j\\x04XN\\tsV\\tp\\\\\\tBe\\nb~\\nAJ\\n]e\\x05k`\\x05qN\\tdw\\tWV\\tHE\\x0BEV\\x05Jz\\tid\\tB`\\tzh\\x05E]\\tfD\\bTg\\x05qN\\bTa\\tja\\x04Cv\\bSM\\nhc\\bUe\\x05t_\\tie\\x04g]\\twQ\\nPn\\bVB\\tjw\\bVg\\x0BbE\\tBZ\\x0BRH\\bP{\\tjp\\n\\\\}\\ta_\\tcC\\t|a\\x0BD]\\tBZ\\ti[\\tfD\\x0BxW\\no_\\td\\\\\\n_D\\ntb\\t\\\\c\\tAJ\\nlK\\x04oQ\\x04lo\\x0BLx\\x0BM@\\bWZ\\x04Kn\\x0Bpg\\nTi\\nIv\\n|r\\x0B@}\\x05Jz\\x05Lm\\x05Wh\\x05k}\\x05ln\\x0BxD\\n]s\\x04gc\\x0Bps\\tBr\\bTW\\x0BBM\\x05tZ\\nBY\\x04DW\\tjf\\x0BSW\\x04C}\\nqo\\tdE\\tmv\\tIQ\\bPP\\bUb\\x05lv\\x04BC\\nzQ\\t[I\\x0Bgl\\nig\\bUs\\x04BT\\x0BbC\\bSq\\tsU\\tiW\\nJn\\tSY\\tHK\\trg\\npV\\x0BID\\x0B|j\\x04KO\\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`qfbgl<X<W=c=k=n<R<V<\\\\<V<T<W<T=a=n<R<^=m<Y<Y<_<R<S=l<T=n<\\\\<V<Y=e<Y=o<Z<Y<v<\\\\<V<]<Y<[<]=g<W<R<Q<T<~=m<Y<S<R<X<A=n<R=n<R<P=k<Y<P<Q<Y=n<W<Y=n=l<\\\\<[<R<Q<\\\\<_<X<Y<P<Q<Y<x<W=c<s=l<T<Q<\\\\=m<Q<T=i=n<Y<P<V=n<R<_<R<X<^<R=n=n<\\\\<P<M<D<|<P<\\\\=c<K=n<R<^<\\\\=m<^<\\\\<P<Y<P=o<N<\\\\<V<X<^<\\\\<Q<\\\\<P=a=n<T=a=n=o<~<\\\\<P=n<Y=i<S=l<R=n=o=n<Q<\\\\<X<X<Q=c<~<R=n=n=l<T<Q<Y<U<~<\\\\=m<Q<T<P=m<\\\\<P=n<R=n=l=o<]<r<Q<T<P<T=l<Q<Y<Y<r<r<r<W<T=j=a=n<\\\\<r<Q<\\\\<Q<Y<P<X<R<P<P<R<U<X<^<Y<R<Q<R=m=o<X\\fHy\\fIk\\fHU\\fId\\fHy\\fIl\\fHT\\fIk\\fHy\\fHR\\fHy\\fIg\\fHx\\fH\\\\\\fHF\\fH\\\\\\fHD\\fIk\\fHc\\fHy\\fHy\\fHS\\fHA\\fIl\\fHk\\fHT\\fHy\\fH\\\\\\fHH\\fIg\\fHU\\fIg\\fHj\\fHF\\fHU\\fIl\\fHC\\fHU\\fHC\\fHR\\fHH\\fHy\\fHI\\fHRibdqbm\\fHj\\fHp\\fHp\\fIg\\fHi\\fH@\\fHJ\\fIg\\fH{\\fHd\\fHp\\fHR\\fH{\\fHc\\fHU\\fHB\\fHk\\fHD\\fHY\\fHU\\fHC\\fIk\\fHI\\fIk\\fHI\\fIl\\fHt\\fH\\\\\\fHp\\fH@\\fHJ\\fIl\\fHy\\fHd\\fHp\\fIl\\fHY\\fIk\\fHD\\fHd\\fHD\\fHc\\fHU\\fH\\\\\\fHe\\fHT\\fHB\\fIk\\fHy\\fHB\\fHY\\fIg\\fH^\\fIk\\fHT\\fH@\\fHB\\fHd\\fHJ\\fIk\\fH\\x7F\\fH\\\\\\fHj\\fHB\\fH@\\fHT\\fHA\\fH\\\\\\fH@\\fHD\\fHv\\fH^\\fHB\\fHD\\fHj\\fH{\\fHT\\fIl\\fH^\\fIl4U5h5e4I5h5e5k4\\\\4K4N4B4]4U4C4C4K5h5e5k4\\\\5k4Y5d4]4V5f4]5o4K5j5d5h4K4D5f5j4U4]4Z4\\\\5h5o5k5j4K5f5d5i5n4K5h4U5h5f4K5j4K5h5o5j4A4F5e5n4D5h5d4A4E4K4B4]5m5n4[4U4D4C4]5o5j4I4\\\\4K5o5i4K4K4A4C4I5h4K5m5f5k4D4U4Z5o5f5m4D4A4G5d5i5j5d5k5d4O5j4K4@4C4K5h5k4K4_5h5i4U5j4C5h5f4_4U4D4]4Y5h5e5i5j4\\\\4D5k4K4O5j5k5i4G5h5o5j4F4K5h4K4A5f4G5i4Y4]4X4]4A4A5d5h5d5m5f4K4\\\\4K5h5o5h5i4]4E4K5j4F4K5h5m4O4D5d4B4K4Y4O5j4F4K5j5k4K5h5f4U4Z5d5d5n4C4K4D5j4B5f4]4D5j4F5h5o5i4X4K4M5d5k5f4K4D5d5n4Y4Y5d5i4K4]5n5i4O4A4C5j4A5j4U4C5i4]4O5f4K4A4E5o4F4D4C5d5j5f4@4D5i5j5k4F4A4F4@5k4E4_5j4E5f4F5i5o4]4E4V4^4E5j5m4_4D5f4F5h5h5k5h5j4K4F5h5o5n5h4D5h5i4K4U5j5k4O5d5h4X5f4M5j5d4]4O5i4K5m5f5o4D5o5h4\\\\4K4F4]4F4D4D4O5j5k5i4_4K5j5o4D5f4U5m5n4C4A4_5j5h5k5i4X4U4]4O5k5h4X5k4]5n4[4]4[5h4Dsqlejofpfquj`fgfebvowkjnpfoegfwbjop`lmwfmwpvsslqwpwbqwfgnfppbdfpv``fppebpkjlm?wjwof=`lvmwqzb``lvmw`qfbwfgpwlqjfpqfpvowpqvmmjmdsql`fpptqjwjmdlaif`wpujpjaoftfo`lnfbqwj`ofvmhmltmmfwtlqh`lnsbmzgzmbnj`aqltpfqsqjub`zsqlaofnPfquj`fqfpsf`wgjpsobzqfrvfpwqfpfquftfapjwfkjpwlqzeqjfmgplswjlmptlqhjmdufqpjlmnjoojlm`kbmmfotjmglt-bggqfppujpjwfgtfbwkfq`lqqf`wsqlgv`wfgjqf`welqtbqgzlv#`bmqfnlufgpvaif`w`lmwqlobq`kjuf`vqqfmwqfbgjmdojaqbqzojnjwfgnbmbdfqevqwkfqpvnnbqznb`kjmfnjmvwfpsqjubwf`lmwf{wsqldqbnpl`jfwzmvnafqptqjwwfmfmbaofgwqjddfqplvq`fpolbgjmdfofnfmwsbqwmfqejmboozsfqef`wnfbmjmdpzpwfnphffsjmd`vowvqf%rvlw8/ilvqmbosqlif`wpvqeb`fp%rvlw8f{sjqfpqfujftpabobm`fFmdojpk@lmwfmwwkqlvdkSofbpf#lsjmjlm`lmwb`wbufqbdfsqjnbqzujoobdfPsbmjpkdboofqzgf`ojmfnffwjmdnjppjlmslsvobqrvbojwznfbpvqfdfmfqbopsf`jfppfppjlmpf`wjlmtqjwfqp`lvmwfqjmjwjboqfslqwpejdvqfpnfnafqpklogjmdgjpsvwffbqojfqf{sqfppgjdjwbosj`wvqfBmlwkfqnbqqjfgwqbeej`ofbgjmd`kbmdfg`fmwqbouj`wlqzjnbdfp,qfbplmppwvgjfpefbwvqfojpwjmdnvpw#afp`kllopUfqpjlmvpvboozfsjplgfsobzjmddqltjmdlaujlvplufqobzsqfpfmwb`wjlmp?,vo=\\x0E\\ttqbssfqboqfbgz`fqwbjmqfbojwzpwlqbdfbmlwkfqgfphwlsleefqfgsbwwfqmvmvpvboGjdjwbo`bsjwboTfapjwfebjovqf`lmmf`wqfgv`fgBmgqljggf`bgfpqfdvobq#%bns8#bmjnbopqfofbpfBvwlnbwdfwwjmdnfwklgpmlwkjmdSlsvobq`bswjlmofwwfqp`bswvqfp`jfm`foj`fmpf`kbmdfpFmdobmg>2%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\\x0E\\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=\\x0E\\tNlgfqm#sqlujgf!#bow>!alqgfqp-\\t\\tElq#\\t\\tNbmz#bqwjpwpsltfqfgsfqelqnej`wjlmwzsf#lenfgj`bowj`hfwplsslpfg@lvm`jotjwmfppivpwj`fDflqdf#Afodjvn---?,b=wtjwwfqmlwbaoztbjwjmdtbqebqf#Lwkfq#qbmhjmdskqbpfpnfmwjlmpvqujufp`klobq?,s=\\x0E\\t#@lvmwqzjdmlqfgolpp#leivpw#bpDflqdjbpwqbmdf?kfbg=?pwlssfg2$^*8\\x0E\\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=\\x0E\\t`lolq9 vo#jg>!slppfppqloojmdskzpj`pebjojmdf{f`vwf`lmwfpwojmh#wlGfebvow?aq#,=\\t9#wqvf/`kbqwfqwlvqjpn`obppj`sql`ffgf{sobjm?,k2=\\x0E\\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+\\x7F\\x7F#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`ovpwfqsks<jg>bo`lklo*8~*+*8vpjmd#b=?psbm=ufppfopqfujuboBggqfppbnbwfvqbmgqljgboofdfgjoomfpptbohjmd`fmwfqprvbojeznbw`kfpvmjejfgf{wjm`wGfefmpfgjfg#jm\\t\\n?\\\"..#`vpwlnpojmhjmdOjwwof#Allh#lefufmjmdnjm-ip<bqf#wkfhlmwbhwwlgbz$p-kwno!#wbqdfw>tfbqjmdBoo#Qjd8\\t~*+*8qbjpjmd#Bopl/#`qv`jbobalvw!=gf`obqf..=\\t?p`ejqfel{bp#nv`kbssojfpjmgf{/#p/#avw#wzsf#>#\\t\\x0E\\t?\\\"..wltbqgpQf`lqgpSqjubwfElqfjdmSqfnjfq`klj`fpUjqwvboqfwvqmp@lnnfmwSltfqfgjmojmf8slufqwz`kbnafqOjujmd#ulovnfpBmwklmzoldjm!#QfobwfgF`lmlnzqfb`kfp`vwwjmddqbujwzojef#jm@kbswfq.pkbgltMlwbaof?,wg=\\x0E\\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#`bqqjfp\\x7F\\x7Fx~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=\\x0E\\t##bwwfnswsbjq#lenbhf#jwHlmwbhwBmwlmjlkbujmd#qbwjmdp#b`wjufpwqfbnpwqbssfg!*-`pp+klpwjofofbg#wlojwwof#dqlvsp/Sj`wvqf..=\\x0E\\t\\x0E\\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\\x0E\\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\\x0E\\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!=\\x0E\\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#,=\\x0E\\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#=\\x0E\\t\\x0E\\t\\x0E\\tnbqhfw-kjdktbzglmf#jm`wjujwz!obpw!=laojdfgqjpf#wl!vmgfejnbgf#wl#Fbqoz#sqbjpfgjm#jwp#elq#kjpbwkofwfIvsjwfqZbkll\\\"#wfqnfg#pl#nbmzqfbooz#p-#Wkf#b#tlnbm<ubovf>gjqf`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=\\x0E\\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=\\x0E\\t?vpwlnUb8%dw8?,jnslqwplq#wkbwnlpwoz#%bns8qf#pjyf>!?,b=?,kb#`obppsbppjufKlpw#>#TkfwkfqefqwjofUbqjlvp>X^8+ev`bnfqbp,=?,wg=b`wp#bpJm#plnf=\\x0E\\t\\x0E\\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=\\x0E\\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#,=\\x0E\\t\\\\slsvsp\\x7Fp`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=\\x0E\\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+\\x0BBl\\bQ\\x7F*+\\x0BUm\\x05Gx*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<_<R<X<\\\\<Y=m<W<T<Y=m=n=`<]=g<W<R<]=g=n=`=a=n<R<P<y=m<W<T=n<R<_<R<P<Y<Q=c<^=m<Y=i=a=n<R<U<X<\\\\<Z<Y<]=g<W<T<_<R<X=o<X<Y<Q=`=a=n<R=n<]=g<W<\\\\=m<Y<]=c<R<X<T<Q=m<Y<]<Y<Q<\\\\<X<R=m<\\\\<U=n=h<R=n<R<Q<Y<_<R=m<^<R<T=m<^<R<U<T<_=l=g=n<R<Z<Y<^=m<Y<P=m<^<R=b<W<T=d=`=a=n<T=i<S<R<V<\\\\<X<Q<Y<U<X<R<P<\\\\<P<T=l<\\\\<W<T<]<R=n<Y<P=o=i<R=n=c<X<^=o=i=m<Y=n<T<W=b<X<T<X<Y<W<R<P<T=l<Y=n<Y<]=c=m<^<R<Y<^<T<X<Y=k<Y<_<R=a=n<T<P=m=k<Y=n=n<Y<P=g=j<Y<Q=g=m=n<\\\\<W<^<Y<X=`=n<Y<P<Y<^<R<X=g=n<Y<]<Y<^=g=d<Y<Q<\\\\<P<T=n<T<S<\\\\=n<R<P=o<S=l<\\\\<^<W<T=j<\\\\<R<X<Q<\\\\<_<R<X=g<[<Q<\\\\=b<P<R<_=o<X=l=o<_<^=m<Y<U<T<X<Y=n<V<T<Q<R<R<X<Q<R<X<Y<W<\\\\<X<Y<W<Y=m=l<R<V<T=b<Q=c<^<Y=m=`<y=m=n=`=l<\\\\<[<\\\\<Q<\\\\=d<T4K5h5h5k4K5h4F5f4@5i5f4U4B4K4Y4E4K5h4\\\\5f4U5h5f5k4@4C5f4C4K5h4N5j4K5h4]4C4F4A5o5i4Y5m4A4E5o4K5j4F4K5h5h5f5f5o5d5j4X4D5o4E5m5f5k4K4D5j4K4F4A5d4K4M4O5o4G4]4B5h4K5h4K5h4A4D4C5h5f5h4C4]5d4_4K4Z4V4[4F5o5d5j5k5j4K5o4_4K4A4E5j4K4C5f4K5h4[4D4U5h5f5o4X5o4]4K5f5i5o5j5i5j5k4K4X4]5o4E4]4J5f4_5j4X5f4[5i4K4\\\\4K4K5h5m5j4X4D4K4D4F4U4D4]4]4A5i4E5o4K5m4E5f5n5d5h5i4]5o4^5o5h5i4E4O4A5i4C5n5h4D5f5f4U5j5f4Y5d4]4E4[4]5f5n4X4K4]5o4@5d4K5h4O4B4]5e5i4U5j4K4K4D4A4G4U4]5d4Z4D4X5o5h5i4_4@5h4D5j4K5j4B4K5h4C5o4F4K4D5o5h5f4E4D4C5d5j4O5f4Z4K5f5d4@4C5m4]5f5n5o4F4D4F4O5m4Z5h5i4[4D4B4K5o4G4]4D4K4]5o4K5m4Z5h4K4A5h5e5j5m4_5k4O5f4K5i4]4C5d4C4O5j5k4K4C5f5j4K4K5h4K5j5i4U4]4Z4F4U5h5i4C4K4B5h5i5i5o5j\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x02\\x03\\x02\\x03\\x02\\x03\\x02\\x03\\x01\\x03\\x01\\x03\\x01\\x03\\x01\\x03\\x07\\x03\\x07\\x03\\x07\\x03\\x07\\x03\\x03\\x02\\x01\\0\\x07\\x06\\x05\\x04\\x04\\x05\\x06\\x07\\0\\x01\\x02\\x03\\x0B\\n\\t\\b\\x0F\\x0E\\r\\f\\f\\r\\x0E\\x0F\\b\\t\\n\\x0B\\x13\\x12\\x11\\x10\\x17\\x16\\x15\\x14\\x14\\x15\\x16\\x17\\x10\\x11\\x12\\x13\\x1B\\x1A\\x19\\x18\\x1F\\x1E\\x1D\\x1C\\x1C\\x1D\\x1E\\x1F\\x18\\x19\\x1A\\x1B\\x13\\x13\\x13\\x13\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x03\\x13\\x13\\x13\\x13\\x02\\x03\\x03\\x03\\x01\\x03\\x03\\x03\\x01\\x03\\x03\\x03\\x02\\x03\\x03\\x03\\x02\\x03\\x03\\x03\\0\\x03\\x03\\x03\\x13\\x13\\x03\\x02\\x03\\x03\\x03\\x02\\x03\\x03\\x13\\x13\\x03\\x02\\x03\\x03\\x03\\x0B\\x03\\x0B\\x03\\x0B\\x03\\x0B\\x03\\x03\\x03\\x02\\x03\\x01\\x03\\0\\x03\\x07\\x03\\x06\\x03\\x05\\x03\\x04qfplvq`fp`lvmwqjfprvfpwjlmpfrvjsnfmw`lnnvmjwzbubjobaofkjdkojdkwGWG,{kwnonbqhfwjmdhmltofgdfplnfwkjmd`lmwbjmfqgjqf`wjlmpvap`qjafbgufqwjpf`kbqb`wfq!#ubovf>!?,pfof`w=Bvpwqbojb!#`obpp>!pjwvbwjlmbvwklqjwzelooltjmdsqjnbqjozlsfqbwjlm`kboofmdfgfufolsfgbmlmznlvpevm`wjlm#evm`wjlmp`lnsbmjfppwqv`wvqfbdqffnfmw!#wjwof>!slwfmwjbofgv`bwjlmbqdvnfmwppf`lmgbqz`lszqjdkwobmdvbdfpf{`ovpjuf`lmgjwjlm?,elqn=\\x0E\\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..=\\x0E\\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!=\\x0E\\tqfpjgfm`fofbuf#wkf`lmwfmw!=bqf#lewfm##~*+*8\\x0E\\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{\\x7Fqjdknbgf#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\\x0E\\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@\\x04Fr\\x0BBl\\bQ\\x7F\\tA{\\x0BUm\\x05Gx\\tA{\\x01yp\\x06YA\\0zX\\bTV\\bWl\\bUd\\x04BM\\x0BB{\\npV\\x0B@x\\x04B\\\\\\np@\\x04Db\\x04Gz\\tal\\npa\\tfM\\tuD\\bV~\\x04mx\\x0BQ}\\ndS\\tp\\\\\\bVK\\bS]\\bU|\\x05oD\\tkV\\x0Bed\\x0BHR\\nb~\\x04M`\\nJp\\x05oD\\x04|Q\\nLP\\x04Sw\\bTl\\nAI\\nxC\\bWt\\tBq\\x05F`\\x04Cm\\x0BLm\\tKx\\t}t\\bPv\\ny\\\\\\naB\\tV\\x7F\\nZd\\x04XU\\x04li\\tfr\\ti@\\tBH\\x04BD\\x04BV\\t`V\\n[]\\tp_\\tTn\\n~A\\nxR\\tuD\\t`{\\bV@\\tTn\\tHK\\tAJ\\x0Bxs\\x04Zf\\nqI\\x04Zf\\x0BBM\\x0B|j\\t}t\\bSM\\nmC\\x0BQ}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=\\x0E\\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=\\x0E\\tbaplovwf8#pvsslqwjmdf{wqfnfoz#nbjmpwqfbn?,pwqlmd=#slsvobqjwzfnsolznfmw?,wbaof=\\x0E\\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\\x0E\\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=\\x0E\\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..=\\x0E\\t?gju#?ejfogpfw=Bq`kajpkls#`obpp>!mlafjmd#vpfgbssqlb`kfpsqjujofdfpmlp`qjsw=\\tqfpvowp#jmnbz#af#wkfFbpwfq#fddnf`kbmjpnpqfbplmbaofSlsvobwjlm@loof`wjlmpfof`wfg!=mlp`qjsw=\\x0E,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<?,avwwlm=\\tsfq`fmwbdfafpw.hmltm`qfbwjmd#b!#gjq>!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!=\\x0E?p`qjsw=+ewvqmfg#lvwkbujmd#wkf?,psbm=\\x0E\\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<P<R<Z<Q<R<]=o<X<Y=n<P<R<Z<Y=n<^=l<Y<P=c=n<\\\\<V<Z<Y=k=n<R<]=g<]<R<W<Y<Y<R=k<Y<Q=`=a=n<R<_<R<V<R<_<X<\\\\<S<R=m<W<Y<^=m<Y<_<R=m<\\\\<U=n<Y=k<Y=l<Y<[<P<R<_=o=n=m<\\\\<U=n<\\\\<Z<T<[<Q<T<P<Y<Z<X=o<]=o<X=o=n<s<R<T=m<V<[<X<Y=m=`<^<T<X<Y<R=m<^=c<[<T<Q=o<Z<Q<R=m<^<R<Y<U<W=b<X<Y<U<S<R=l<Q<R<P<Q<R<_<R<X<Y=n<Y<U=m<^<R<T=i<S=l<\\\\<^<\\\\=n<\\\\<V<R<U<P<Y=m=n<R<T<P<Y<Y=n<Z<T<[<Q=`<R<X<Q<R<U<W=o=k=d<Y<S<Y=l<Y<X=k<\\\\=m=n<T=k<\\\\=m=n=`=l<\\\\<]<R=n<Q<R<^=g=i<S=l<\\\\<^<R=m<R<]<R<U<S<R=n<R<P<P<Y<Q<Y<Y=k<T=m<W<Y<Q<R<^=g<Y=o=m<W=o<_<R<V<R<W<R<Q<\\\\<[<\\\\<X=n<\\\\<V<R<Y=n<R<_<X<\\\\<S<R=k=n<T<s<R=m<W<Y=n<\\\\<V<T<Y<Q<R<^=g<U=m=n<R<T=n=n<\\\\<V<T=i=m=l<\\\\<[=o<M<\\\\<Q<V=n=h<R=l=o<P<v<R<_<X<\\\\<V<Q<T<_<T=m<W<R<^<\\\\<Q<\\\\=d<Y<U<Q<\\\\<U=n<T=m<^<R<T<P=m<^=c<[=`<W=b<]<R<U=k<\\\\=m=n<R=m=l<Y<X<T<v=l<R<P<Y<H<R=l=o<P=l=g<Q<V<Y=m=n<\\\\<W<T<S<R<T=m<V=n=g=m=c=k<P<Y=m=c=j=j<Y<Q=n=l=n=l=o<X<\\\\=m<\\\\<P=g=i=l=g<Q<V<\\\\<q<R<^=g<U=k<\\\\=m<R<^<P<Y=m=n<\\\\=h<T<W=`<P<P<\\\\=l=n<\\\\=m=n=l<\\\\<Q<P<Y=m=n<Y=n<Y<V=m=n<Q<\\\\=d<T=i<P<T<Q=o=n<T<P<Y<Q<T<T<P<Y=b=n<Q<R<P<Y=l<_<R=l<R<X=m<\\\\<P<R<P=a=n<R<P=o<V<R<Q=j<Y=m<^<R<Y<P<V<\\\\<V<R<U<|=l=i<T<^5i5j4F4C5e4I4]4_4K5h4]4_4K5h4E4K5h4U4K5i5o4F4D5k4K4D4]4K5i4@4K5h5f5d5i4K5h4Y5d4]4@4C5f4C4E4K5h4U4Z5d4I4Z4K5m4E4K5h5n4_5i4K5h4U4K4D4F4A5i5f5h5i5h5m4K4F5i5h4F5n5e4F4U4C5f5h4K5h4X4U4]4O4B4D4K4]4F4[5d5f4]4U5h5f5o5i4I4]5m4K5n4[5h4D4K4F4K5h5h4V4E4F4]4F5f4D4K5h5j4K4_4K5h4X5f4B5i5j4F4C5f4K5h4U4]4D4K5h5n4Y4Y4K5m5h4K5i4U5h5f5k4K4F4A4C5f4G4K5h5h5k5i4K5h4U5i5h5i5o4F4D4E5f5i5o5j5o4K5h4[5m5h5m5f4C5f5d4I4C4K4]4E4F4K4]5f4B4K5h4Y4A4E4F4_4@5f5h4K5h5d5n4F4U5j4C5i4K5i4C5f5j4E4F4Y5i5f5i4O4]4X5f5m4K5h4\\\\5f5j4U4]4D5f4E4D5d4K4D4E4O5h4U4K4D4K5h4_5m4]5i4X4K5o5h4F4U4K5h5e4K5h4O5d5h4K5h4_5j4E4@4K5i4U4E4K5h4Y4A5m4K5h4C5f5j5o5h5i4K4F4K5h4B4K4Y4K5h5i5h5m4O4U4Z4K4M5o4F4K4D4E4K5h4B5f4]4]4_4K4J5h4K5h5n5h4D4K5h4O4C4D5i5n4K4[4U5i4]4K4_5h5i5j4[5n4E4K5h5o4F4D4K5h4]4@5h4K4X4F4]5o4K5h5n4C5i5f4U4[5f5opAzWbdMbnf+-isd!#bow>!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-ISD\\x7Fwkvna\\x7Fsbqwj`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\\x0E\\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\\x0E\\t?kfbg=\\x0E\\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=\\x0E\\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<qfnbjmfg#jmwqbmpelqnfgKf#tbp#bopltbp#boqfbgzpwbwjpwj`bojm#ebulq#leNjmjpwqz#lenlufnfmw#leelqnvobwjlmjp#qfrvjqfg?ojmh#qfo>!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\\x0E\\t?,kfbg=\\x0E\\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\\x0E\\t\\n?,gju=\\x0E\\t\\x0E\\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=\\x0E\\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#\\x7Fpklqw#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!=\\x0E\\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=\\x0E\\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#=\\x0E\\t?kfbg=\\x0E\\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=\\x0Epbjg#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=\\x0E\\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(\\x7F_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*<p<R<Q<_<R<W<M=l<S=m<V<T=m=l<S=m<V<T=m=l<S=m<V<R5h4U4]4D5f4E\\nAO\\x05Gx\\bTA\\nzk\\x0BBl\\bQ\\x7F\\bTA\\nzk\\x0BUm\\bQ\\x7F\\bTA\\nzk\\npe\\x05u|\\ti@\\tcT\\bVV\\n\\\\}\\nxS\\tVp\\x05tS\\x05k`\\t[X\\t[X\\x0BHR\\bPv\\bTW\\bUe\\n\\x7Fa\\bQp\\x0B_W\\x0BWs\\nxS\\x0BAz\\n_y\\x04Khjmelqnb`j/_mkfqqbnjfmwbpfof`wq/_mj`lgfp`qjs`j/_m`obpjej`bglp`lml`jnjfmwlsvaoj`b`j/_mqfob`jlmbgbpjmelqn/Mwj`bqfob`jlmbglpgfsbqwbnfmwlwqbabibglqfpgjqf`wbnfmwfbzvmwbnjfmwlnfq`bglOjaqf`lmw/M`wfmlpkbajwb`jlmfp`vnsojnjfmwlqfpwbvqbmwfpgjpslpj`j/_m`lmpf`vfm`jbfof`wq/_mj`bbsoj`b`jlmfpgfp`lmf`wbgljmpwbob`j/_mqfbojyb`j/_mvwjojyb`j/_mfm`j`olsfgjbfmefqnfgbgfpjmpwqvnfmwlpf{sfqjfm`jbpjmpwjwv`j/_msbqwj`vobqfppva`bwfdlqjb=n<R<W=`<V<R<L<R=m=m<T<T=l<\\\\<]<R=n=g<]<R<W=`=d<Y<S=l<R=m=n<R<P<R<Z<Y=n<Y<X=l=o<_<T=i=m<W=o=k<\\\\<Y=m<Y<U=k<\\\\=m<^=m<Y<_<X<\\\\<L<R=m=m<T=c<p<R=m<V<^<Y<X=l=o<_<T<Y<_<R=l<R<X<\\\\<^<R<S=l<R=m<X<\\\\<Q<Q=g=i<X<R<W<Z<Q=g<T<P<Y<Q<Q<R<p<R=m<V<^=g=l=o<]<W<Y<U<p<R=m<V<^<\\\\=m=n=l<\\\\<Q=g<Q<T=k<Y<_<R=l<\\\\<]<R=n<Y<X<R<W<Z<Y<Q=o=m<W=o<_<T=n<Y<S<Y=l=`<r<X<Q<\\\\<V<R<S<R=n<R<P=o=l<\\\\<]<R=n=o<\\\\<S=l<Y<W=c<^<R<R<]=e<Y<R<X<Q<R<_<R=m<^<R<Y<_<R=m=n<\\\\=n=`<T<X=l=o<_<R<U=h<R=l=o<P<Y=i<R=l<R=d<R<S=l<R=n<T<^=m=m=g<W<V<\\\\<V<\\\\<Z<X=g<U<^<W<\\\\=m=n<T<_=l=o<S<S=g<^<P<Y=m=n<Y=l<\\\\<]<R=n<\\\\=m<V<\\\\<[<\\\\<W<S<Y=l<^=g<U<X<Y<W<\\\\=n=`<X<Y<Q=`<_<T<S<Y=l<T<R<X<]<T<[<Q<Y=m<R=m<Q<R<^<Y<P<R<P<Y<Q=n<V=o<S<T=n=`<X<R<W<Z<Q<\\\\=l<\\\\<P<V<\\\\=i<Q<\\\\=k<\\\\<W<R<L<\\\\<]<R=n<\\\\<N<R<W=`<V<R=m<R<^=m<Y<P<^=n<R=l<R<U<Q<\\\\=k<\\\\<W<\\\\=m<S<T=m<R<V=m<W=o<Z<]=g=m<T=m=n<Y<P<S<Y=k<\\\\=n<T<Q<R<^<R<_<R<S<R<P<R=e<T=m<\\\\<U=n<R<^<S<R=k<Y<P=o<S<R<P<R=e=`<X<R<W<Z<Q<R=m=m=g<W<V<T<]=g=m=n=l<R<X<\\\\<Q<Q=g<Y<P<Q<R<_<T<Y<S=l<R<Y<V=n<M<Y<U=k<\\\\=m<P<R<X<Y<W<T=n<\\\\<V<R<_<R<R<Q<W<\\\\<U<Q<_<R=l<R<X<Y<^<Y=l=m<T=c=m=n=l<\\\\<Q<Y=h<T<W=`<P=g=o=l<R<^<Q=c=l<\\\\<[<Q=g=i<T=m<V<\\\\=n=`<Q<Y<X<Y<W=b=c<Q<^<\\\\=l=c<P<Y<Q=`=d<Y<P<Q<R<_<T=i<X<\\\\<Q<Q<R<U<[<Q<\\\\=k<T=n<Q<Y<W=`<[=c=h<R=l=o<P<\\\\<N<Y<S<Y=l=`<P<Y=m=c=j<\\\\<[<\\\\=e<T=n=g<w=o=k=d<T<Y\\fHD\\fHU\\fIl\\fHn\\fHy\\fH\\\\\\fHD\\fIk\\fHi\\fHF\\fHD\\fIk\\fHy\\fHS\\fHC\\fHR\\fHy\\fH\\\\\\fIk\\fHn\\fHi\\fHD\\fIa\\fHC\\fHy\\fIa\\fHC\\fHR\\fH{\\fHR\\fHk\\fHM\\fH@\\fHR\\fH\\\\\\fIk\\fHy\\fHS\\fHT\\fIl\\fHJ\\fHS\\fHC\\fHR\\fHF\\fHU\\fH^\\fIk\\fHT\\fHS\\fHn\\fHU\\fHA\\fHR\\fH\\\\\\fHH\\fHi\\fHF\\fHD\\fIl\\fHY\\fHR\\fH^\\fIk\\fHT\\fIk\\fHY\\fHR\\fHy\\fH\\\\\\fHH\\fIk\\fHB\\fIk\\fH\\\\\\fIk\\fHU\\fIg\\fHD\\fIk\\fHT\\fHy\\fHH\\fIk\\fH@\\fHU\\fIm\\fHH\\fHT\\fHR\\fHk\\fHs\\fHU\\fIg\\fH{\\fHR\\fHp\\fHR\\fHD\\fIk\\fHB\\fHS\\fHD\\fHs\\fHy\\fH\\\\\\fHH\\fHR\\fHy\\fH\\\\\\fHD\\fHR\\fHe\\fHD\\fHy\\fIk\\fHC\\fHU\\fHR\\fHm\\fHT\\fH@\\fHT\\fIk\\fHA\\fHR\\fH[\\fHR\\fHj\\fHF\\fHy\\fIk\\fH^\\fHS\\fHC\\fIk\\fHZ\\fIm\\fH\\\\\\fIn\\fHk\\fHT\\fHy\\fIk\\fHt\\fHn\\fHs\\fIk\\fHB\\fIk\\fH\\\\\\fIl\\fHT\\fHy\\fHH\\fHR\\fHB\\fIk\\fH\\\\\\fHR\\fH^\\fIk\\fHy\\fH\\\\\\fHi\\fHK\\fHS\\fHy\\fHi\\fHF\\fHD\\fHR\\fHT\\fHB\\fHR\\fHp\\fHB\\fIm\\fHq\\fIk\\fHy\\fHR\\fH\\\\\\fHO\\fHU\\fIg\\fHH\\fHR\\fHy\\fHM\\fHP\\fIl\\fHC\\fHU\\fHR\\fHn\\fHU\\fIg\\fHs\\fH^\\fHZ\\fH@\\fIa\\fHJ\\fH^\\fHS\\fHC\\fHR\\fHp\\fIl\\fHY\\fHD\\fHp\\fHR\\fHH\\fHR\\fHy\\fId\\fHT\\fIk\\fHj\\fHF\\fHy\\fHR\\fHY\\fHR\\fH^\\fIl\\fHJ\\fIk\\fHD\\fIk\\fHF\\fIn\\fH\\\\\\fIl\\fHF\\fHR\\fHD\\fIl\\fHe\\fHT\\fHy\\fIk\\fHU\\fIg\\fH{\\fIl\\fH@\\fId\\fHL\\fHy\\fHj\\fHF\\fHy\\fIl\\fHY\\fH\\\\\\fIa\\fH[\\fH{\\fHR\\fHn\\fHY\\fHj\\fHF\\fHy\\fIg\\fHp\\fHS\\fH^\\fHR\\fHp\\fHR\\fHD\\fHR\\fHT\\fHU\\fHB\\fHH\\fHU\\fHB\\fIk\\fHn\\fHe\\fHD\\fHy\\fIl\\fHC\\fHR\\fHU\\fIn\\fHJ\\fH\\\\\\fIa\\fHp\\fHT\\fIn\\fHv\\fIl\\fHF\\fHT\\fHn\\fHJ\\fHT\\fHY\\fHR\\fH^\\fHU\\fIg\\fHD\\fHR\\fHU\\fIg\\fHH\\fIl\\fHp\\fId\\fHT\\fIk\\fHY\\fHR\\fHF\\fHT\\fHp\\fHD\\fHH\\fHR\\fHD\\fIk\\fHH\\fHR\\fHp\\fHR\\fH\\\\\\fIl\\fHt\\fHR\\fHC\\fH^\\fHp\\fHS\\fH^\\fIk\\fHD\\fIl\\fHv\\fIk\\fHp\\fHR\\fHn\\fHv\\fHF\\fHH\\fIa\\fH\\\\\\fH{\\fIn\\fH{\\fH^\\fHp\\fHR\\fHH\\fIk\\fH@\\fHR\\fHU\\fH\\\\\\fHj\\fHF\\fHD\\fIk\\fHY\\fHR\\fHU\\fHD\\fHk\\fHT\\fHy\\fHR\\fHT\\fIm\\fH@\\fHU\\fH\\\\\\fHU\\fHD\\fIk\\fHk\\fHT\\fHT\\fIk\\fHT\\fHU\\fHS\\fHH\\fH@\\fHM\\fHP\\fIk\\fHt\\fHs\\fHD\\fHR\\fHH\\fH^\\fHR\\fHZ\\fHF\\fHR\\fHn\\fHv\\fHZ\\fIa\\fH\\\\\\fIl\\fH@\\fHM\\fHP\\fIl\\fHU\\fIg\\fHH\\fIk\\fHT\\fHR\\fHd\\fHs\\fHZ\\fHR\\fHC\\fHJ\\fHT\\fHy\\fHH\\fIl\\fHp\\fHR\\fHH\\fIl\\fHY\\fHR\\fH^\\fHR\\fHU\\fHp\\fHR\\fH\\\\\\fHF\\fHs\\fHD\\fHR\\fH\\\\\\fHz\\fHD\\fIk\\fHT\\fHM\\fHP\\fHy\\fHB\\fHS\\fH^\\fHR\\fHe\\fHT\\fHy\\fIl\\fHy\\fIk\\fHY\\fH^\\fH^\\fH{\\fHH\\fHR\\fHz\\fHR\\fHD\\fHR\\fHi\\fH\\\\\\fIa\\fHI\\fHp\\fHU\\fHR\\fHn\\fHJ\\fIk\\fHz\\fHR\\fHF\\fHU\\fH^\\fIl\\fHD\\fHS\\fHC\\fHB\\fH@\\fHS\\fHD\\fHR\\fH@\\fId\\fHn\\fHy\\fHy\\fHU\\fIl\\fHn\\fHy\\fHU\\fHD\\fHR\\fHJ\\fIk\\fHH\\fHR\\fHU\\fHB\\fH^\\fIk\\fHy\\fHR\\fHG\\fIl\\fHp\\fH@\\fHy\\fHS\\fHH\\fIm\\fH\\\\\\fHH\\fHB\\fHR\\fHn\\fH{\\fHY\\fHU\\fIl\\fHn\\fH\\\\\\fIg\\fHp\\fHP\\fHB\\fHS\\fH^\\fIl\\fHj\\fH\\\\\\fIg\\fHF\\fHT\\fIk\\fHD\\fHR\\fHC\\fHR\\fHJ\\fHY\\fH^\\fIk\\fHD\\fIk\\fHz\\fHR\\fHH\\fHR\\fHy\\fH\\\\\\fIl\\fH@\\fHe\\fHD\\fHy\\fHR\\fHp\\fHY\\fHR\\fH@\\fHF\\fIn\\fH\\\\\\fHR\\fH@\\fHM\\fHP\\fHR\\fHT\\fI`\\fHJ\\fHR\\fHZ\\fIk\\fHC\\fH\\\\\\fHy\\fHS\\fHC\\fIk\\fHy\\fHU\\fHR\\fHn\\fHi\\fHy\\fHT\\fH\\\\\\fH@\\fHD\\fHR\\fHc\\fHY\\fHU\\fHR\\fHn\\fHT\\fIa\\fHI\\fH^\\fHB\\fHS\\fH^\\fIk\\fH^\\fIk\\fHz\\fHy\\fHY\\fHS\\fH[\\fHC\\fHy\\fIa\\fH\\\\\\fHn\\fHT\\fHB\\fIn\\fHU\\fHI\\fHR\\fHD\\fHR4F4_4F4[5f4U5i4X4K4]5o4E4D5d4K4_4[4E4K5h4Y5m4A4E5i5d4K4Z5f4U4K5h4B4K4Y4E4K5h5i4^5f4C4K5h4U4K5i4E4K5h5o4K4F4D4K5h4]4C5d4C4D4]5j4K5i4@4K5h4C5d5h4E4K5h4U4K5h5i4K5h5i5d5n4U4K5h4U4]4D5f4K5h4_4]5f4U4K5h4@5d4K5h4K5h4\\\\5k4K4D4K5h4A5f4K4E4K5h4A5n5d5n4K5h5o4]5f5i4K5h4U4]4K5n5i4A5m5d4T4E4K5h4G4K5j5f5i4X4K5k4C4E4K5h5i4]4O4E4K5h5n4]4N5j4K5h4X4D4K4D4K5h4A5d4K4]4K5h4@4C5f4C4K5h4O4_4]4E4K5h4U5h5d5i5i4@5i5d4U4E4K5h4]4A5i5j4K5h5j5n4K4[5m5h4_4[5f5j4K5h5o5d5f4F4K5h4C5j5f4K4D4]5o4K4F5k4K5h4]5f4K4Z4F4A5f4K4F5f4D4F5d5n5f4F4K5h4O5d5h5e4K5h4D4]5f4C4K5h5o5h4K5i4K5h4]4K4D4[4K5h4X4B4Y5f4_5f4K4]4K4F4K5h4G4K5h4G4K5h4Y5h4K4E4K5h4A4C5f4G4K5h4^5d4K4]4K5h4B5h5f4@4K5h4@5i5f4U4K5h4U4K5i5k4K5h4@5i4K5h4K5h4_4K4U4E5i4X4K5k4C5k4K5h4]4J5f4_4K5h4C4B5d5h4K5h5m5j5f4E4K5h5o4F4K4D4K5h4C5d4]5f4K5h4C4]5d4_4K4_4F4V4]5n4F4Y4K5i5f5i4K5h4D5j4K4F4K5h4U4T5f5ifmwfqwbjmnfmwvmgfqpwbmgjmd#>#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=\\x0E\\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\\x7F%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^..=\\x0E\\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,<plqw>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^..=\\x0E\\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=\\x0E\\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=\\x0E#ubojdm>!wls!#jmkbajwbmwp#leelooltjmd#zfbq\\x0E\\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\\x0E\\t?,p`qjsw=\\x0E\\t?tbp#elvmgfg#jmjmwfqujft#tjwk\\\\jg!#`lmwfmw>!`bsjwbo#le#wkf\\x0E\\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+*#x\\x0Eje#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=\\x0E\\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=\\x0E\\t\\x0E\\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<L=o=m=m<V<T<U=l=o=m=m<V<T<Ujmufpwjdb`j/_msbqwj`jsb`j/_m<V<R=n<R=l=g<Y<R<]<W<\\\\=m=n<T<V<R=n<R=l=g<U=k<Y<W<R<^<Y<V=m<T=m=n<Y<P=g<q<R<^<R=m=n<T<V<R=n<R=l=g=i<R<]<W<\\\\=m=n=`<^=l<Y<P<Y<Q<T<V<R=n<R=l<\\\\=c=m<Y<_<R<X<Q=c=m<V<\\\\=k<\\\\=n=`<Q<R<^<R=m=n<T<O<V=l<\\\\<T<Q=g<^<R<S=l<R=m=g<V<R=n<R=l<R<U=m<X<Y<W<\\\\=n=`<S<R<P<R=e=`=b=m=l<Y<X=m=n<^<R<]=l<\\\\<[<R<P=m=n<R=l<R<Q=g=o=k<\\\\=m=n<T<Y=n<Y=k<Y<Q<T<Y<\\x7F<W<\\\\<^<Q<\\\\=c<T=m=n<R=l<T<T=m<T=m=n<Y<P<\\\\=l<Y=d<Y<Q<T=c<M<V<\\\\=k<\\\\=n=`<S<R=a=n<R<P=o=m<W<Y<X=o<Y=n=m<V<\\\\<[<\\\\=n=`=n<R<^<\\\\=l<R<^<V<R<Q<Y=k<Q<R=l<Y=d<Y<Q<T<Y<V<R=n<R=l<R<Y<R=l<_<\\\\<Q<R<^<V<R=n<R=l<R<P<L<Y<V<W<\\\\<P<\\\\4K5h5i5j4F4C5e5i5j4F4C5f4K4F4K5h5i5d4Z5d4U4K5h4D4]4K5i4@4K5h5i5d4K5n4U4K5h4]4_4K4J5h5i4X4K4]5o4K4F4K5h4O4U4Z4K4M4K5h4]5f4K4Z4E4K5h4F4Y5i5f5i4K5h4K4U4Z4K4M4K5h5j4F4K4J4@4K5h4O5h4U4K4D4K5h4F4_4@5f5h4K5h4O5n4_4K5i4K5h4Z4V4[4K4F4K5h5m5f4C5f5d4K5h4F4]4A5f4D4K5h4@4C5f4C4E4K5h4F4U5h5f5i4K5h4O4B4D4K4]4K5h4K5m5h4K5i4K5h4O5m5h4K5i4K5h4F4K4]5f4B4K5h4F5n5j5f4E4K5h4K5h4U4K4D4K5h4B5d4K4[4]4K5h5i4@4F5i4U4K5h4C5f5o5d4]4K5h4_5f4K4A4E4U4D4C4K5h5h5k4K5h4F4]4D5f4E4K5h4]5d4K4D4[4K5h4O4C4D5f4E4K5h4K4B4D4K4]4K5h5i4F4A4C4E4K5h4K4V4K5j5f`vqplq9sljmwfq8?,wjwof=\\t?nfwb#!#kqfe>!kwws9,,!=?psbm#`obpp>!nfnafqp#le#wkf#tjmglt-ol`bwjlmufqwj`bo.bojdm9,b=#\\x7F#?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\\x0E\\t?,p`qjsw=\\x0E\\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\\x0E\\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=\\x0E\\tvo=?,gju=?,gju=bewfq#wkf#gfbwktjwk#qfpsf`w#wlpwzof>!sbggjmd9jp#sbqwj`vobqozgjpsobz9jmojmf8#wzsf>!pvanjw!#jp#gjujgfg#jmwl\\bTA\\nzk#+\\x0BBl\\bQ\\x7F*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\\x0E\\t?,p`qjsw=\\x0E\\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-isd\\x7Fwkvna\\x7Fofew\\x7Fubpw#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=\\x0E\\t?-ip!=?,p`qjsw=\\x0E\\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<V<T<V<R<P<S<\\\\<Q<T<T=c<^<W=c<Y=n=m=c<x<R<]<\\\\<^<T=n=`=k<Y<W<R<^<Y<V<\\\\=l<\\\\<[<^<T=n<T=c<t<Q=n<Y=l<Q<Y=n<r=n<^<Y=n<T=n=`<Q<\\\\<S=l<T<P<Y=l<T<Q=n<Y=l<Q<Y=n<V<R=n<R=l<R<_<R=m=n=l<\\\\<Q<T=j=g<V<\\\\=k<Y=m=n<^<Y=o=m<W<R<^<T=c=i<S=l<R<]<W<Y<P=g<S<R<W=o=k<T=n=`=c<^<W=c=b=n=m=c<Q<\\\\<T<]<R<W<Y<Y<V<R<P<S<\\\\<Q<T=c<^<Q<T<P<\\\\<Q<T<Y=m=l<Y<X=m=n<^<\\\\4K5h5i5d4K4Z5f4U4K5h4]4J5f4_5f4E4K5h4K5j4F5n4K5h5i4X4K4]5o4K4F5o4K5h4_5f4K4]4K4F4K5h5i5o4F5d4D4E4K5h4_4U5d4C5f4E4K4A4Y4K4J5f4K4F4K5h4U4K5h5i5f4E4K5h4Y5d4F5f4K4F4K5h4K5j4F4]5j4F4K5h4F4Y4K5i5f5i4K5h4I4_5h4K5i5f4K5h5i4X4K4]5o4E4K5h5i4]4J5f4K4Fqlalwp!#`lmwfmw>!?gju#jg>!ellwfq!=wkf#Vmjwfg#Pwbwfp?jnd#pq`>!kwws9,,-isd\\x7Fqjdkw\\x7Fwkvna\\x7F-ip!=?,p`qjsw=\\x0E\\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\\x0E\\tjmelqnbwjlm#balvw?gju#jg>!kfbgfq!=!#b`wjlm>!kwws9,,?b#kqfe>!kwwsp9,,?gju#jg>!`lmwfmw!?,gju=\\x0E\\t?,gju=\\x0E\\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=\\x0E\\t?,gju=\\x0E\\t\\x0E\\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=\\x0E\\t?,kwno=\\x0E\\\"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/-isd\\x7Fwkvna\\x7Fqjdkw\\x7F1?,gju=?gju#`obpp>!?gju#pwzof>!eolbw9mjmfwffmwk#`fmwvqz?,algz=\\x0E\\t?,kwno=\\x0E\\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=\\x0E\\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\\x7F#?b#kqfe>!kwws9,,Jm#sbqwj`vobq/#wkfNvowjsof#ellwmlwfplq#lwkfq#pvapwbm`fwklvpbmgp#le#zfbqpwqbmpobwjlm#le#wkf?,gju=\\x0E\\t?,gju=\\x0E\\t\\x0E\\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<W<_<\\\\=l=m<V<T<]=f<W<_<\\\\=l=m<V<T<H<Y<X<Y=l<\\\\=j<T<T<Q<Y=m<V<R<W=`<V<R=m<R<R<]=e<Y<Q<T<Y=m<R<R<]=e<Y<Q<T=c<S=l<R<_=l<\\\\<P<P=g<r=n<S=l<\\\\<^<T=n=`<]<Y=m<S<W<\\\\=n<Q<R<P<\\\\=n<Y=l<T<\\\\<W=g<S<R<[<^<R<W=c<Y=n<S<R=m<W<Y<X<Q<T<Y=l<\\\\<[<W<T=k<Q=g=i<S=l<R<X=o<V=j<T<T<S=l<R<_=l<\\\\<P<P<\\\\<S<R<W<Q<R=m=n=`=b<Q<\\\\=i<R<X<T=n=m=c<T<[<]=l<\\\\<Q<Q<R<Y<Q<\\\\=m<Y<W<Y<Q<T=c<T<[<P<Y<Q<Y<Q<T=c<V<\\\\=n<Y<_<R=l<T<T<|<W<Y<V=m<\\\\<Q<X=l\\fHJ\\fIa\\fHY\\fHR\\fH\\\\\\fHR\\fHB\\fId\\fHD\\fIm\\fHi\\fH^\\fHF\\fIa\\fH\\\\\\fHJ\\fHR\\fHD\\fHA\\fHR\\fH\\\\\\fHH\\fIl\\fHC\\fHi\\fHD\\fIm\\fHJ\\fIk\\fHZ\\fHU\\fHS\\fHD\\fIa\\fHJ\\fIl\\fHk\\fHn\\fHM\\fHS\\fHC\\fHR\\fHJ\\fHS\\fH^\\fIa\\fH^\\fIl\\fHi\\fHK\\fHS\\fHy\\fHR\\fH\\\\\\fHY\\fIl\\fHM\\fHS\\fHC\\fIg\\fHv\\fHS\\fHs\\fIa\\fHL\\fIk\\fHT\\fHB\\fHR\\fHv\\fHR\\fH\\\\\\fHp\\fHn\\fHy\\fIa\\fHZ\\fHD\\fHJ\\fIm\\fHD\\fHS\\fHC\\fHR\\fHF\\fIa\\fH\\\\\\fHC\\fIg\\fH{\\fHi\\fHD\\fIm\\fHT\\fHR\\fH\\\\\\fH}\\fHD\\fH^\\fHR\\fHk\\fHD\\fHF\\fHR\\fH\\\\\\fIa\\fHs\\fIl\\fHZ\\fH\\\\\\fIa\\fHH\\fIg\\fHn\\fH^\\fIg\\fHy\\fHT\\fHA\\fHR\\fHG\\fHP\\fIa\\fH^\\fId\\fHZ\\fHZ\\fH\\\\\\fIa\\fHH\\fIk\\fHn\\fHF\\fIa\\fH\\\\\\fHJ\\fIk\\fHZ\\fHF\\fIa\\fH^\\fIk\\fHC\\fH\\\\\\fHy\\fIk\\fHn\\fHJ\\fIa\\fH\\\\\\fHT\\fIa\\fHI\\fHS\\fHH\\fHS\\fHe\\fHH\\fIa\\fHF\\fHR\\fHJ\\fHe\\fHD\\fIa\\fHU\\fIk\\fHn\\fHv\\fHS\\fHs\\fIa\\fHL\\fHR\\fHC\\fHR\\fHH\\fIa\\fH\\\\\\fHR\\fHp\\fIa\\fHC\\fHR\\fHJ\\fHR\\fHF\\fIm\\fH\\\\\\fHR\\fHD\\fIk\\fHp\\fIg\\fHM\\fHP\\fIk\\fHn\\fHi\\fHD\\fIm\\fHY\\fHR\\fHJ\\fHZ\\fIa\\fH\\\\\\fIk\\fHO\\fIl\\fHZ\\fHS\\fHy\\fIa\\fH[\\fHR\\fHT\\fH\\\\\\fHy\\fHR\\fH\\\\\\fIl\\fHT\\fHn\\fH{\\fIa\\fH\\\\\\fHU\\fHF\\fH\\\\\\fHS\\fHO\\fHR\\fHB\\fH@\\fIa\\fH\\\\\\fHR\\fHn\\fHM\\fH@\\fHv\\fIa\\fHv\\fIg\\fHn\\fHe\\fHF\\fH^\\fH@\\fIa\\fHK\\fHB\\fHn\\fHH\\fIa\\fH\\\\\\fIl\\fHT\\fHn\\fHF\\fH\\\\\\fIa\\fHy\\fHe\\fHB\\fIa\\fHB\\fIl\\fHJ\\fHB\\fHR\\fHK\\fIa\\fHC\\fHB\\fHT\\fHU\\fHR\\fHC\\fHH\\fHR\\fHZ\\fH@\\fIa\\fHJ\\fIg\\fHn\\fHB\\fIl\\fHM\\fHS\\fHC\\fHR\\fHj\\fHd\\fHF\\fIl\\fHc\\fH^\\fHB\\fIg\\fH@\\fHR\\fHk\\fH^\\fHT\\fHn\\fHz\\fIa\\fHC\\fHR\\fHj\\fHF\\fH\\\\\\fIk\\fHZ\\fHD\\fHi\\fHD\\fIm\\fH@\\fHn\\fHK\\fH@\\fHR\\fHp\\fHP\\fHR\\fH\\\\\\fHD\\fHY\\fIl\\fHD\\fHH\\fHB\\fHF\\fIa\\fH\\\\\\fHB\\fIm\\fHz\\fHF\\fIa\\fH\\\\\\fHZ\\fIa\\fHD\\fHF\\fH\\\\\\fHS\\fHY\\fHR\\fH\\\\\\fHD\\fIm\\fHy\\fHT\\fHR\\fHD\\fHT\\fHB\\fH\\\\\\fIa\\fHI\\fHD\\fHj\\fHC\\fIg\\fHp\\fHS\\fHH\\fHT\\fIg\\fHB\\fHY\\fHR\\fH\\\\4K5h5i4X4K4]5o4K4F4K5h5i5j4F4C5f4K4F4K5h5o5i4D5f5d4F4]4K5h5i4X4K5k4C4K4F4U4C4C4K5h4^5d4K4]4U4C4C4K5h4]4C5d4C4K5h4I4_5h4K5i5f4E4K5h5m5d4F5d4X5d4D4K5h5i4_4K4D5n4K4F4K5h5i4U5h5d5i4K4F4K5h5i4_5h4_5h4K4F4K5h4@4]4K5m5f5o4_4K5h4K4_5h4K5i5f4E4K5h4K4F4Y4K5h4K4Fhfztlqgp!#`lmwfmw>!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\\x0E\\t?,algz=\\x0E\\t?,kwno=gjpwjm`wjlm#afwtffm,!#wbqdfw>!\\\\aobmh!=?ojmh#kqfe>!kwws9,,fm`lgjmd>!vwe.;!<=\\tt-bggFufmwOjpwfmfq<b`wjlm>!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<W<_<\\\\=l=m<V<T\\t#wzsf>!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..=\\x0E\\t?p`qjsw#wzsf>!w?b#kqfe>$kwws9,,ttt-klqw`vw#j`lm!#kqfe>!?,gju=\\x0E\\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=\\x0E\\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\\x0E\\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=\\x0E\\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*<O<V=l<\\\\={<Q=m=`<V<\\\\=o<V=l<\\\\={<Q=m=`<V<\\\\<L<R=m=m<T<U=m<V<R<U<P<\\\\=n<Y=l<T<\\\\<W<R<^<T<Q=h<R=l<P<\\\\=j<T<T=o<S=l<\\\\<^<W<Y<Q<T=c<Q<Y<R<]=i<R<X<T<P<R<T<Q=h<R=l<P<\\\\=j<T=c<t<Q=h<R=l<P<\\\\=j<T=c<L<Y=m<S=o<]<W<T<V<T<V<R<W<T=k<Y=m=n<^<R<T<Q=h<R=l<P<\\\\=j<T=b=n<Y=l=l<T=n<R=l<T<T<X<R=m=n<\\\\=n<R=k<Q<R4K5h5i4F5d4K4@4C5d5j4K5h4K4X4F4]4K5o4K4F4K5h4K5n4F4]4K4A4K4Fkwno8#`kbqpfw>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!#\\x0E\\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\\nAO\\x05Gx\\bTA\\nzk#+\\x0BUm\\x05Gx*\\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*<R=l<_<\\\\<Q<T<[<\\\\=j<T<T<^<R<[<P<R<Z<Q<R=m=n=`<R<]=l<\\\\<[<R<^<\\\\<Q<T=c=l<Y<_<T=m=n=l<\\\\=j<T<T<^<R<[<P<R<Z<Q<R=m=n<T<R<]=c<[<\\\\=n<Y<W=`<Q<\\\\?\\\"GL@WZSF#kwno#SVAOJ@#!mw.Wzsf!#`lmwfmw>!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$=<X<Y=c=n<Y<W=`<Q<R=m=n<T=m<R<R=n<^<Y=n=m=n<^<T<T<S=l<R<T<[<^<R<X=m=n<^<\\\\<]<Y<[<R<S<\\\\=m<Q<R=m=n<T\\fHF\\fIm\\fHT\\fIa\\fHH\\fHS\\fHy\\fHR\\fHy\\fHR\\fHn\\fH{\\fIa\\fH\\\\\\fIk\\fHT\\fHe\\fHD\\fIa\\fHU\\fIg\\fHn\\fHD\\fIk\\fHY\\fHS\\fHK\\fHR\\fHD\\fHT\\fHA\\fHR\\fHG\\fHS\\fHy\\fIa\\fHT\\fHS\\fHn\\fH{\\fHT\\fIm\\fH\\\\\\fHy\\fIa\\fH[\\fHS\\fHH\\fHy\\fIe\\fHF\\fIl\\fH\\\\\\fHR\\fHk\\fHs\\fHY\\fHS\\fHp\\fIa\\fHr\\fHR\\fHF\\fHD\\fHy\\fHR\\fH\\\\\\fIa\\fH\\\\\\fHY\\fHR\\fHd\\fHT\\fHy\\fIa\\fH\\\\\\fHS\\fHC\\fHH\\fHR\", \"\\u06F7%\\u018C'T%\\x85'W%\\xD7%O%g%\\xA6&\\u0193%\\u01E5&>&*&'&^&\\x88\\u0178\\u0C3E&\\u01AD&\\u0192&)&^&%&'&\\x82&P&1&\\xB1&3&]&m&u&E&t&C&\\xCF&V&V&/&>&6&\\u0F76\\u177Co&p&@&E&M&P&x&@&F&e&\\xCC&7&:&(&D&0&C&)&.&F&-&1&(&L&F&1\\u025E*\\u03EA\\u21F3&\\u1372&K&;&)&E&H&P&0&?&9&V&\\x81&-&v&a&,&E&)&?&=&'&'&B&\\u0D2E&\\u0503&\\u0316*&*8&%&%&&&%,)&\\x9A&>&\\x86&7&]&F&2&>&J&6&n&2&%&?&\\x8E&2&6&J&g&-&0&,&*&J&*&O&)&6&(&<&B&N&.&P&@&2&.&W&M&%\\u053C\\x84(,(<&,&\\u03DA&\\u18C7&-&,(%&(&%&(\\u013B0&X&D&\\x81&j&'&J&(&.&B&3&Z&R&h&3&E&E&<\\xC6-\\u0360\\u1EF3&%8?&@&,&Z&@&0&J&,&^&x&_&6&C&6&C\\u072C\\u2A25&f&-&-&-&-&,&J&2&8&z&8&C&Y&8&-&d&\\u1E78\\xCC-&7&1&F&7&t&W&7&I&.&.&^&=\\u0F9C\\u19D3&8(>&/&/&\\u077B')'\\u1065')'%@/&0&%\\u043E\\u09C0*&*@&C\\u053D\\u05D4\\u0274\\u05EB4\\u0DD7\\u071A\\u04D16\\u0D84&/\\u0178\\u0303Z&*%\\u0246\\u03FF&\\u0134&1\\xA8\\u04B4\\u0174\", dictionarySizeBits, \"AAAAKKLLKKKKKJJIHHIHHGGFF\");\n    // typo:on\n    setData(dictionaryData, dictionarySizeBits);\n  }\n\n  /**\n   * @constructor\n   * @param {!Int8Array} data\n   * @struct\n   */\n  function InputStream(data) {\n    /** @type {!Int8Array} */\n    this.data = new Int8Array(0);\n    /** @type {number} */\n    this.offset = 0;\n    this.data = data;\n  }\n\n  /**\n   * @param {number} x\n   * @return {string}\n   */\n  function valueOf(x) {\n    return x.toString();\n  }\n\n  /**\n   * @param {!State} s\n   * @param {!Int8Array} dst\n   * @param {number} offset\n   * @param {number} length\n   * @return {number}\n   */\n  function readInput(s, dst, offset, length) {\n    if (s.input === null) {\n      return -1;\n    }\n    const /** @type {!InputStream} */ src = s.input;\n    const /** @type {number} */ end = Math.min(src.offset + length, src.data.length);\n    const /** @type {number} */ bytesRead = end - src.offset;\n    dst.set(src.data.subarray(src.offset, end), offset);\n    src.offset += bytesRead;\n    return bytesRead;\n  }\n  /**\n   * @param {!State} s\n   * @return {void}\n   */\n  function closeInput(s) {\n    s.input = new InputStream(new Int8Array(0));\n  }\n  /**\n   * @param {string} src\n   * @return {!Int8Array}\n   */\n  function toUsAsciiBytes(src) {\n    const /** @type {number} */ n = src.length;\n    const /** @type {!Int8Array} */ result = new Int8Array(n);\n    for (let /** @type {number} */ i = 0; i < n; ++i) {\n      result[i] = src.charCodeAt(i);\n    }\n    return result;\n  }\n  /**\n   * @param {string} src\n   * @return {!Int32Array}\n   */\n  function toUtf8Runes(src) {\n    const /** @type {number} */ n = src.length;\n    const /** @type {!Int32Array} */ result = new Int32Array(n);\n    for (let /** @type {number} */ i = 0; i < n; ++i) {\n      result[i] = src.charCodeAt(i);\n    }\n    return result;\n  }\n  /**\n   * @param {!State} s\n   * @param {number} code\n   * @return {number}\n   */\n  function makeError(s, code) {\n    if (code >= 0) {\n      return code;\n    }\n    if (s.runningState >= 0) {\n      s.runningState = code;\n    }\n    throw new Error(\"Brotli error code: \" + code);\n  }\n\n/* GENERATED CODE END */\n\n  /** @typedef {!Int8Array} */\n  let ByteBuffer;\n\n  /**\n   * @param {!Int8Array} bytes\n   * @param {?Options=} options\n   * @return {!Int8Array}\n   */\n  function decode(bytes, options) {\n    let /** @type {!State} */ s = new State();\n    s.input = new InputStream(bytes);\n    initState(s);\n    if (options) {\n      let customDictionary =\n          /** @type {?Int8Array} */ (options[\"customDictionary\"]);\n      if (customDictionary) attachDictionaryChunk(s, customDictionary);\n    }\n    let /** @type {number} */ totalOutput = 0;\n    let /** @type {!Array<!Int8Array>} */ chunks = [];\n    while (true) {\n      let /** @type {!Int8Array} */ chunk = new Int8Array(16384);\n      chunks.push(chunk);\n      s.output = chunk;\n      s.outputOffset = 0;\n      s.outputLength = 16384;\n      s.outputUsed = 0;\n      decompress(s);\n      totalOutput += s.outputUsed;\n      if (s.outputUsed < 16384) break;\n    }\n    close(s);\n    closeInput(s);\n    let /** @type {!Int8Array} */ result = new Int8Array(totalOutput);\n    let /** @type {number} */ offset = 0;\n    for (let /** @type {number} */ i = 0; i < chunks.length; ++i) {\n      let /** @type {!Int8Array} */ chunk = chunks[i];\n      let /** @type {number} */ end = Math.min(totalOutput, offset + 16384);\n      let /** @type {number} */ len = end - offset;\n      if (len < 16384) {\n        result.set(chunk.subarray(0, len), offset);\n      } else {\n        result.set(chunk, offset);\n      }\n      offset += len;\n    }\n    return result;\n  }\n\n  return decode;\n};\n\n/**\n * @type {function(!Int8Array, ?Options=):!Int8Array}\n */\nexport let BrotliDecode = makeBrotliDecode();\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BrotliDecode } from \"../../external/brotli/decode.js\";\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { Stream } from \"./stream.js\";\n\nclass BrotliStream extends DecodeStream {\n  #isAsync = true;\n\n  constructor(stream, maybeLength) {\n    super(maybeLength);\n\n    this.stream = stream;\n    this.dict = stream.dict;\n  }\n\n  readBlock() {\n    // TODO: add some telemetry to measure how often we fallback here.\n    // Get all bytes from the input stream\n    const bytes = this.stream.getBytes();\n    const decodedData = BrotliDecode(\n      new Int8Array(bytes.buffer, bytes.byteOffset, bytes.length)\n    );\n\n    this.buffer = new Uint8Array(\n      decodedData.buffer,\n      decodedData.byteOffset,\n      decodedData.length\n    );\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n  }\n\n  async getImageData(length, _decoderOptions) {\n    const data = await this.asyncGetBytes();\n    if (!data) {\n      return this.getBytes(length);\n    }\n    if (data.length <= length) {\n      return data;\n    }\n    return data.subarray(0, length);\n  }\n\n  async asyncGetBytes() {\n    const { decompressed, compressed } =\n      await this.asyncGetBytesFromDecompressionStream(\"brotli\");\n    if (decompressed) {\n      return decompressed;\n    }\n    // DecompressionStream failed (for example because there are some extra\n    // bytes after the end of the compressed data), so we fallback to our\n    // decoder.\n    // We already get the bytes from the underlying stream, so we just reuse\n    // them to avoid get them again.\n\n    this.#isAsync = false;\n    this.stream = new Stream(\n      compressed,\n      0,\n      compressed.length,\n      this.stream.dict\n    );\n    this.reset();\n    return null;\n  }\n\n  get isAsync() {\n    return this.#isAsync;\n  }\n}\n\nexport { BrotliStream };\n","/* THIS FILE IS GENERATED - DO NOT EDIT */\nasync 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=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;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 ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports[\"j\"]()}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module[\"onAbort\"]?.(what);what=\"Aborted(\"+what+\")\";err(what);ABORT=true;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module[\"locateFile\"]){return locateFile(\"jbig2.wasm\")}return new URL(\"jbig2.wasm\",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw\"both async and sync fetching of the wasm failed\"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:\"same-origin\"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err(\"falling back to ArrayBuffer instantiation\")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result[\"instance\"])}var info=getWasmImports();if(Module[\"instantiateWasm\"]){return new Promise((resolve,reject)=>{Module[\"instantiateWasm\"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name=\"ExitStatus\";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}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 _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<destSize;srcStart+=pitch32,destStart+=pitch8){imageData.set(HEAPU8.subarray(srcStart,srcStart+pitch8),destStart)}}function _setLineData(line_ptr,pitch8,offset){Module.imageData.set(HEAPU8.subarray(line_ptr,line_ptr+pitch8),offset)}var writeArrayToMemory=(array,buffer)=>{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[\"k\"];_free=Module[\"_free\"]=wasmExports[\"l\"];_jbig2_decode=Module[\"_jbig2_decode\"]=wasmExports[\"m\"];_ccitt_decode=Module[\"_ccitt_decode\"]=wasmExports[\"n\"];__emscripten_timeout=wasmExports[\"o\"];memory=wasmMemory=wasmExports[\"i\"];__indirect_function_table=wasmExports[\"__indirect_function_table\"]}var wasmImports={e:__abort_js,b:__emscripten_runtime_keepalive_clear,c:__setitimer_js,g:_createImageData,d:_emscripten_resize_heap,a:_proc_exit,h:_setImageData,f:_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=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})}\n;return moduleRtn}export default JBig2;\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { unreachable, warn } from \"../shared/util.js\";\nimport { fetchBinaryData } from \"./core_utils.js\";\n\nclass WasmImage {\n  static #handler = null;\n\n  static #instances = new Set();\n\n  static #useWasm = true;\n\n  static #useWorkerFetch = true;\n\n  static #wasmUrl = null;\n\n  #buffer = null;\n\n  #modulePromise = null;\n\n  _filename = null;\n\n  _noWasmFilename = null;\n\n  static setOptions({ handler, useWasm, useWorkerFetch, wasmUrl }) {\n    WasmImage.#useWasm = useWasm;\n    WasmImage.#useWorkerFetch = useWorkerFetch;\n    WasmImage.#wasmUrl = wasmUrl;\n\n    if (!useWorkerFetch) {\n      WasmImage.#handler = handler;\n    }\n  }\n\n  // eslint-disable-next-line getter-return\n  static get instance() {\n    unreachable(\"Abstract getter `instance` accessed\");\n  }\n\n  static cleanup() {\n    for (const instance of WasmImage.#instances) {\n      instance.#modulePromise = null;\n    }\n  }\n\n  constructor(trackInstance = false) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === WasmImage\n    ) {\n      unreachable(\"Cannot initialize WasmImage.\");\n    }\n\n    if (trackInstance) {\n      // Keep track of the instances for `cleanup` purposes.\n      WasmImage.#instances.add(this);\n    }\n  }\n\n  async #getJsModule(fallbackCallback) {\n    let instance = null;\n    try {\n      const mod = await (typeof PDFJSDev === \"undefined\"\n        ? // eslint-disable-next-line no-unsanitized/method\n          import(`../${WasmImage.#wasmUrl}${this._noWasmFilename}`)\n        : __raw_import__(`${WasmImage.#wasmUrl}${this._noWasmFilename}`));\n      instance = mod.default();\n    } catch (ex) {\n      warn(`#getJsModule: ${ex}`);\n    }\n    fallbackCallback(instance);\n  }\n\n  async #instantiateWasm(fallbackCallback, imports, successCallback) {\n    try {\n      if (!this.#buffer) {\n        if (WasmImage.#useWorkerFetch) {\n          this.#buffer = await fetchBinaryData(\n            `${WasmImage.#wasmUrl}${this._filename}`\n          );\n        } else {\n          if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n            throw new Error(\"Only worker-thread fetching supported.\");\n          }\n          this.#buffer = await WasmImage.#handler.sendWithPromise(\n            \"FetchBinaryData\",\n            { kind: \"wasmUrl\", filename: this._filename }\n          );\n        }\n      }\n      const results = await WebAssembly.instantiate(this.#buffer, imports);\n      return successCallback(results.instance);\n    } catch (ex) {\n      warn(`#instantiateWasm: ${ex}`);\n\n      this.#getJsModule(fallbackCallback);\n      return null;\n    }\n  }\n\n  _getModule(ImageDecoder) {\n    if (!this.#modulePromise) {\n      const { promise, resolve } = Promise.withResolvers();\n      const promises = [promise];\n      if (!WasmImage.#useWasm) {\n        this.#getJsModule(resolve);\n      } else {\n        promises.push(\n          ImageDecoder({\n            warn,\n            instantiateWasm: this.#instantiateWasm.bind(this, resolve),\n          })\n        );\n      }\n      this.#modulePromise = Promise.race(promises);\n    }\n    return this.#modulePromise;\n  }\n\n  async decode(bytes, _params) {\n    unreachable(\"Abstract method `decode` called\");\n  }\n}\n\nexport { WasmImage };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseException, shadow } from \"../shared/util.js\";\nimport JBig2 from \"../../external/jbig2/jbig2.js\";\nimport { WasmImage } from \"./wasm_image.js\";\n\nclass Jbig2Error extends BaseException {\n  constructor(msg) {\n    super(msg, \"Jbig2Error\");\n  }\n}\n\nclass JBig2CCITTFaxImage extends WasmImage {\n  _filename = \"jbig2.wasm\";\n\n  _noWasmFilename = \"jbig2_nowasm_fallback.js\";\n\n  static get instance() {\n    return shadow(\n      this,\n      \"instance\",\n      new JBig2CCITTFaxImage(/* trackInstance = */ true)\n    );\n  }\n\n  async decode(bytes, width, height, globals, CCITTOptions) {\n    const module = await this._getModule(JBig2);\n\n    if (!module) {\n      throw new Jbig2Error(\"JBig2 failed to initialize\");\n    }\n    let ptr, globalsPtr;\n\n    try {\n      const size = bytes.length;\n      ptr = module._malloc(size);\n      module.writeArrayToMemory(bytes, ptr);\n\n      if (CCITTOptions) {\n        module._ccitt_decode(\n          ptr,\n          size,\n          width,\n          height,\n          CCITTOptions.K,\n          CCITTOptions.EndOfLine ? 1 : 0,\n          CCITTOptions.EncodedByteAlign ? 1 : 0,\n          CCITTOptions.BlackIs1 ? 1 : 0,\n          CCITTOptions.Columns,\n          CCITTOptions.Rows\n        );\n      } else {\n        const globalsSize = globals ? globals.length : 0;\n        if (globalsSize > 0) {\n          globalsPtr = module._malloc(globalsSize);\n          module.writeArrayToMemory(globals, globalsPtr);\n        }\n        module._jbig2_decode(ptr, size, width, height, globalsPtr, globalsSize);\n      }\n      if (!module.imageData) {\n        throw new Jbig2Error(\"Unknown error\");\n      }\n      const { imageData } = module;\n      module.imageData = null;\n\n      return imageData;\n    } finally {\n      if (ptr) {\n        module._free(ptr);\n      }\n      if (globalsPtr) {\n        module._free(globalsPtr);\n      }\n    }\n  }\n}\n\nexport { JBig2CCITTFaxImage, Jbig2Error };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { Dict } from \"./primitives.js\";\nimport { JBig2CCITTFaxImage } from \"./jbig2_ccittFax.js\";\nimport { shadow } from \"../shared/util.js\";\n\nclass CCITTFaxStream extends DecodeStream {\n  constructor(str, maybeLength, params) {\n    super(maybeLength);\n\n    this.stream = str;\n    this.maybeLength = maybeLength;\n    this.dict = str.dict;\n\n    if (!(params instanceof Dict)) {\n      params = Dict.empty;\n    }\n\n    this.params = {\n      K: params.get(\"K\") || 0,\n      EndOfLine: !!params.get(\"EndOfLine\"),\n      EncodedByteAlign: !!params.get(\"EncodedByteAlign\"),\n      Columns: params.get(\"Columns\") || 1728,\n      Rows: params.get(\"Rows\") || 0,\n      EndOfBlock: !!(params.get(\"EndOfBlock\") ?? true),\n      BlackIs1: !!params.get(\"BlackIs1\"),\n    };\n  }\n\n  get bytes() {\n    // If `this.maybeLength` is null, we'll get the entire stream.\n    return shadow(this, \"bytes\", this.stream.getBytes(this.maybeLength));\n  }\n\n  get isImageStream() {\n    return true;\n  }\n\n  get isAsyncDecoder() {\n    return true;\n  }\n\n  async decodeImage(bytes, length, _decoderOptions) {\n    if (this.eof) {\n      return this.buffer;\n    }\n    if (!bytes) {\n      bytes = this.stream.isAsync\n        ? (await this.stream.asyncGetBytes()) || this.bytes\n        : this.bytes;\n    }\n\n    this.buffer = await JBig2CCITTFaxImage.instance.decode(\n      bytes,\n      this.dict.get(\"W\", \"Width\"),\n      this.dict.get(\"H\", \"Height\"),\n      null,\n      this.params\n    );\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n\n    return this.buffer;\n  }\n}\n\nexport { CCITTFaxStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* Copyright 1996-2003 Glyph & Cog, LLC\n *\n * The flate stream implementation contained in this file is a JavaScript port\n * of XPDF's implementation, made available under the Apache 2.0 open source\n * license.\n */\n\nimport { FormatError, info } from \"../shared/util.js\";\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { Stream } from \"./stream.js\";\n\nconst codeLenCodeMap = new Int32Array([\n  16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15,\n]);\n\nconst lengthDecode = new Int32Array([\n  0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,\n  0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,\n  0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,\n  0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102,\n]);\n\nconst distDecode = new Int32Array([\n  0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,\n  0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,\n  0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,\n  0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001,\n]);\n\nconst fixedLitCodeTab = [\n  new Int32Array([\n    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,\n    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,\n    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,\n    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,\n    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,\n    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,\n    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,\n    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,\n    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,\n    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,\n    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,\n    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,\n    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,\n    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,\n    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,\n    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,\n    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,\n    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,\n    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,\n    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,\n    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,\n    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,\n    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,\n    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,\n    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,\n    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,\n    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,\n    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,\n    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,\n    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,\n    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,\n    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,\n    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,\n    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,\n    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,\n    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,\n    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,\n    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,\n    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,\n    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,\n    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,\n    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,\n    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,\n    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,\n    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,\n    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,\n    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,\n    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,\n    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,\n    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,\n    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,\n    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,\n    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,\n    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,\n    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,\n    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,\n    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,\n    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,\n    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,\n    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,\n    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,\n    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,\n    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,\n    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff,\n  ]),\n  9,\n];\n\nconst fixedDistCodeTab = [\n  new Int32Array([\n    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,\n    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,\n    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,\n    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000,\n  ]),\n  5,\n];\n\nclass FlateStream extends DecodeStream {\n  #isAsync = true;\n\n  constructor(str, maybeLength) {\n    super(maybeLength);\n\n    this.stream = str;\n    this.dict = str.dict;\n\n    const cmf = str.getByte();\n    const flg = str.getByte();\n    if (cmf === -1 || flg === -1) {\n      throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`);\n    }\n    if ((cmf & 0x0f) !== 0x08) {\n      throw new FormatError(\n        `Unknown compression method in flate stream: ${cmf}, ${flg}`\n      );\n    }\n    if (((cmf << 8) + flg) % 31 !== 0) {\n      throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`);\n    }\n    if (flg & 0x20) {\n      throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`);\n    }\n\n    this.codeSize = 0;\n    this.codeBuf = 0;\n  }\n\n  async getImageData(length, _decoderOptions) {\n    const data = await this.asyncGetBytes();\n    if (!data) {\n      return this.getBytes(length);\n    }\n    if (data.length <= length) {\n      return data;\n    }\n    return data.subarray(0, length);\n  }\n\n  async asyncGetBytes() {\n    const { decompressed, compressed } =\n      await this.asyncGetBytesFromDecompressionStream(\"deflate\");\n    if (decompressed) {\n      return decompressed;\n    }\n    // DecompressionStream failed (for example because there are some extra\n    // bytes after the end of the compressed data), so we fallback to our\n    // decoder.\n    // We already get the bytes from the underlying stream, so we just reuse\n    // them to avoid get them again.\n\n    this.#isAsync = false;\n    this.stream = new Stream(\n      compressed,\n      2 /* = header size (see ctor) */,\n      compressed.length,\n      this.stream.dict\n    );\n    this.reset();\n    return null;\n  }\n\n  get isAsync() {\n    return this.#isAsync;\n  }\n\n  getBits(bits) {\n    const str = this.stream;\n    let codeSize = this.codeSize;\n    let codeBuf = this.codeBuf;\n\n    let b;\n    while (codeSize < bits) {\n      if ((b = str.getByte()) === -1) {\n        throw new FormatError(\"Bad encoding in flate stream\");\n      }\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n    b = codeBuf & ((1 << bits) - 1);\n    this.codeBuf = codeBuf >> bits;\n    this.codeSize = codeSize -= bits;\n\n    return b;\n  }\n\n  getCode(table) {\n    const str = this.stream;\n    const codes = table[0];\n    const maxLen = table[1];\n    let codeSize = this.codeSize;\n    let codeBuf = this.codeBuf;\n\n    let b;\n    while (codeSize < maxLen) {\n      if ((b = str.getByte()) === -1) {\n        // premature end of stream. code might however still be valid.\n        // codeSize < codeLen check below guards against incomplete codeVal.\n        break;\n      }\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n    const code = codes[codeBuf & ((1 << maxLen) - 1)];\n    const codeLen = code >> 16;\n    const codeVal = code & 0xffff;\n    if (codeLen < 1 || codeSize < codeLen) {\n      throw new FormatError(\"Bad encoding in flate stream\");\n    }\n    this.codeBuf = codeBuf >> codeLen;\n    this.codeSize = codeSize - codeLen;\n    return codeVal;\n  }\n\n  generateHuffmanTable(lengths) {\n    const n = lengths.length;\n\n    // find max code length\n    let maxLen = 0;\n    let i;\n    for (i = 0; i < n; ++i) {\n      if (lengths[i] > maxLen) {\n        maxLen = lengths[i];\n      }\n    }\n\n    // build the table\n    const size = 1 << maxLen;\n    const codes = new Int32Array(size);\n    for (\n      let len = 1, code = 0, skip = 2;\n      len <= maxLen;\n      ++len, code <<= 1, skip <<= 1\n    ) {\n      for (let val = 0; val < n; ++val) {\n        if (lengths[val] === len) {\n          // bit-reverse the code\n          let code2 = 0;\n          let t = code;\n          for (i = 0; i < len; ++i) {\n            code2 = (code2 << 1) | (t & 1);\n            t >>= 1;\n          }\n\n          // fill the table entries\n          for (i = code2; i < size; i += skip) {\n            codes[i] = (len << 16) | val;\n          }\n          ++code;\n        }\n      }\n    }\n\n    return [codes, maxLen];\n  }\n\n  #endsStreamOnError(err) {\n    info(err);\n    this.eof = true;\n  }\n\n  readBlock() {\n    let buffer, hdr, len;\n    const str = this.stream;\n    // read block header\n    try {\n      hdr = this.getBits(3);\n    } catch (ex) {\n      this.#endsStreamOnError(ex.message);\n      return;\n    }\n    if (hdr & 1) {\n      this.eof = true;\n    }\n    hdr >>= 1;\n\n    if (hdr === 0) {\n      // uncompressed block\n      let b;\n\n      if ((b = str.getByte()) === -1) {\n        this.#endsStreamOnError(\"Bad block header in flate stream\");\n        return;\n      }\n      let blockLen = b;\n      if ((b = str.getByte()) === -1) {\n        this.#endsStreamOnError(\"Bad block header in flate stream\");\n        return;\n      }\n      blockLen |= b << 8;\n      if ((b = str.getByte()) === -1) {\n        this.#endsStreamOnError(\"Bad block header in flate stream\");\n        return;\n      }\n      let check = b;\n      if ((b = str.getByte()) === -1) {\n        this.#endsStreamOnError(\"Bad block header in flate stream\");\n        return;\n      }\n      check |= b << 8;\n      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {\n        // Ignoring error for bad \"empty\" block (see issue 1277)\n        throw new FormatError(\"Bad uncompressed block length in flate stream\");\n      }\n\n      this.codeBuf = 0;\n      this.codeSize = 0;\n\n      const bufferLength = this.bufferLength,\n        end = bufferLength + blockLen;\n      buffer = this.ensureBuffer(end);\n      this.bufferLength = end;\n\n      if (blockLen === 0) {\n        if (str.peekByte() === -1) {\n          this.eof = true;\n        }\n      } else {\n        const block = str.getBytes(blockLen);\n        buffer.set(block, bufferLength);\n        if (block.length < blockLen) {\n          this.eof = true;\n        }\n      }\n      return;\n    }\n\n    let litCodeTable;\n    let distCodeTable;\n    if (hdr === 1) {\n      // compressed block, fixed codes\n      litCodeTable = fixedLitCodeTab;\n      distCodeTable = fixedDistCodeTab;\n    } else if (hdr === 2) {\n      // compressed block, dynamic codes\n      const numLitCodes = this.getBits(5) + 257;\n      const numDistCodes = this.getBits(5) + 1;\n      const numCodeLenCodes = this.getBits(4) + 4;\n\n      // build the code lengths code table\n      const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);\n\n      let i;\n      for (i = 0; i < numCodeLenCodes; ++i) {\n        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);\n      }\n      const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);\n\n      // build the literal and distance code tables\n      len = 0;\n      i = 0;\n      const codes = numLitCodes + numDistCodes;\n      const codeLengths = new Uint8Array(codes);\n      let bitsLength, bitsOffset, what;\n      while (i < codes) {\n        const code = this.getCode(codeLenCodeTab);\n        if (code === 16) {\n          bitsLength = 2;\n          bitsOffset = 3;\n          what = len;\n        } else if (code === 17) {\n          bitsLength = 3;\n          bitsOffset = 3;\n          what = len = 0;\n        } else if (code === 18) {\n          bitsLength = 7;\n          bitsOffset = 11;\n          what = len = 0;\n        } else {\n          codeLengths[i++] = len = code;\n          continue;\n        }\n\n        let repeatLength = this.getBits(bitsLength) + bitsOffset;\n        while (repeatLength-- > 0) {\n          codeLengths[i++] = what;\n        }\n      }\n\n      litCodeTable = this.generateHuffmanTable(\n        codeLengths.subarray(0, numLitCodes)\n      );\n      distCodeTable = this.generateHuffmanTable(\n        codeLengths.subarray(numLitCodes, codes)\n      );\n    } else {\n      throw new FormatError(\"Unknown block type in flate stream\");\n    }\n\n    buffer = this.buffer;\n    let limit = buffer ? buffer.length : 0;\n    let pos = this.bufferLength;\n    while (true) {\n      let code1 = this.getCode(litCodeTable);\n      if (code1 < 256) {\n        if (pos + 1 >= limit) {\n          buffer = this.ensureBuffer(pos + 1);\n          limit = buffer.length;\n        }\n        buffer[pos++] = code1;\n        continue;\n      }\n      if (code1 === 256) {\n        this.bufferLength = pos;\n        return;\n      }\n      code1 -= 257;\n      code1 = lengthDecode[code1];\n      let code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      len = (code1 & 0xffff) + code2;\n      code1 = this.getCode(distCodeTable);\n      code1 = distDecode[code1];\n      code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      const dist = (code1 & 0xffff) + code2;\n      if (pos + len >= limit) {\n        buffer = this.ensureBuffer(pos + len);\n        limit = buffer.length;\n      }\n      for (let k = 0; k < len; ++k, ++pos) {\n        buffer[pos] = buffer[pos - dist];\n      }\n    }\n  }\n}\n\nexport { FlateStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseStream } from \"./base_stream.js\";\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { Dict } from \"./primitives.js\";\nimport { JBig2CCITTFaxImage } from \"./jbig2_ccittFax.js\";\nimport { shadow } from \"../shared/util.js\";\n\n/**\n * For JBIG2's we use a library to decode these images and\n * the stream behaves like all the other DecodeStreams.\n */\nclass Jbig2Stream extends DecodeStream {\n  constructor(stream, maybeLength, params) {\n    super(maybeLength);\n\n    this.stream = stream;\n    this.dict = stream.dict;\n    this.maybeLength = maybeLength;\n    this.params = params;\n  }\n\n  get bytes() {\n    // If `this.maybeLength` is null, we'll get the entire stream.\n    return shadow(this, \"bytes\", this.stream.getBytes(this.maybeLength));\n  }\n\n  ensureBuffer(requested) {\n    // No-op, since `this.readBlock` will always parse the entire image and\n    // directly insert all of its data into `this.buffer`.\n  }\n\n  get isAsyncDecoder() {\n    return true;\n  }\n\n  get isImageStream() {\n    return true;\n  }\n\n  // The JBIG2 file header is defined in ITU-T T.88, Annex D.4:\n  // https://www.itu.int/rec/T-REC-T.88\n  static stripFileHeader(bytes) {\n    if (\n      bytes.length >= 9 &&\n      bytes[0] === 0x97 &&\n      bytes[1] === 0x4a &&\n      bytes[2] === 0x42 &&\n      bytes[3] === 0x32 &&\n      bytes[4] === 0x0d &&\n      bytes[5] === 0x0a &&\n      bytes[6] === 0x1a &&\n      bytes[7] === 0x0a\n    ) {\n      const headerLength = (bytes[8] & 2) === 0 ? 13 : 9;\n      return bytes.subarray(headerLength);\n    }\n    return bytes;\n  }\n\n  async decodeImage(bytes, length, _decoderOptions) {\n    if (this.eof) {\n      return this.buffer;\n    }\n    bytes = Jbig2Stream.stripFileHeader(bytes || this.bytes);\n\n    let globals = null;\n    if (this.params instanceof Dict) {\n      const globalsStream = this.params.get(\"JBIG2Globals\");\n      if (globalsStream instanceof BaseStream) {\n        globals = Jbig2Stream.stripFileHeader(globalsStream.getBytes());\n      }\n    }\n    this.buffer = await JBig2CCITTFaxImage.instance.decode(\n      bytes,\n      this.dict.get(\"Width\"),\n      this.dict.get(\"Height\"),\n      globals\n    );\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n\n    return this.buffer;\n  }\n\n  get canAsyncDecodeImageFromBuffer() {\n    return this.stream.isAsync;\n  }\n}\n\nexport { Jbig2Stream };\n","/* THIS FILE IS GENERATED - DO NOT EDIT */\nasync 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=\"\";function locateFile(path){if(Module[\"locateFile\"]){return Module[\"locateFile\"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;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 ABORT=false;var EXITSTATUS;class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}var readyPromiseResolve,readyPromiseReject;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module[\"preRun\"]){if(typeof Module[\"preRun\"]==\"function\")Module[\"preRun\"]=[Module[\"preRun\"]];while(Module[\"preRun\"].length){addOnPreRun(Module[\"preRun\"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports[\"s\"]()}function postRun(){if(Module[\"postRun\"]){if(typeof Module[\"postRun\"]==\"function\")Module[\"postRun\"]=[Module[\"postRun\"]];while(Module[\"postRun\"].length){addOnPostRun(Module[\"postRun\"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module[\"onAbort\"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){if(Module[\"locateFile\"]){return locateFile(\"openjpeg.wasm\")}return new URL(\"openjpeg.wasm\",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw\"both async and sync fetching of the wasm failed\"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary){try{var response=fetch(binaryFile,{credentials:\"same-origin\"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err(\"falling back to ArrayBuffer instantiation\")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result[\"instance\"])}var info=getWasmImports();if(Module[\"instantiateWasm\"]){return new Promise((resolve,reject)=>{Module[\"instantiateWasm\"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name=\"ExitStatus\";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP64;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU64;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<nb_pixels;i++){imageData[3*i]=compR[i];imageData[3*i+1]=compG[i];imageData[3*i+2]=compB[i]}}function _copy_pixels_4(compR_ptr,compG_ptr,compB_ptr,compA_ptr,nb_pixels){compR_ptr>>=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;i<nb_pixels;i++){imageData[4*i]=compR[i];imageData[4*i+1]=compG[i];imageData[4*i+2]=compB[i];imageData[4*i+3]=compA[i]}}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};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<str.length;++i){var u=str.codePointAt(i);if(u<=127){if(outIdx>=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<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=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 INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>num<INT53_MIN||num>INT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=globalThis.TextDecoder&&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);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str=\"\";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};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)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):\"\";var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>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<nb_pixels;i++){imageData[4*i]=imageData[4*i+1]=imageData[4*i+2]=compG[i];imageData[4*i+3]=255}}function _graya_to_rgba(compG_ptr,compA_ptr,nb_pixels){compG_ptr>>=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<nb_pixels;i++){imageData[4*i]=imageData[4*i+1]=imageData[4*i+2]=compG[i];imageData[4*i+3]=compA[i]}}function _jsPrintWarning(message_ptr){const message=UTF8ToString(message_ptr);(Module.warn||console.warn)(`OpenJPEG: ${message}`)}function _rgb_to_rgba(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*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<nb_pixels;i++){imageData[4*i]=compR[i];imageData[4*i+1]=compG[i];imageData[4*i+2]=compB[i];imageData[4*i+3]=255}}function _storeErrorMessage(message_ptr){const message=UTF8ToString(message_ptr);if(!Module.errorMessages){Module.errorMessages=message}else{Module.errorMessages+=\"\\n\"+message}}var writeArrayToMemory=(array,buffer)=>{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,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\"];memory=wasmMemory=wasmExports[\"r\"];__indirect_function_table=wasmExports[\"__indirect_function_table\"]}var wasmImports={m:__abort_js,l:__emscripten_runtime_keepalive_clear,i:__setitimer_js,f:_copy_pixels_1,e:_copy_pixels_3,d:_copy_pixels_4,j:_emscripten_resize_heap,o:_environ_get,p:_environ_sizes_get,n:_fd_seek,b:_fd_write,q:_gray_to_rgba,h:_graya_to_rgba,c:_jsPrintWarning,k:_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=await (createWasm());run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})}\n;return moduleRtn}export default OpenJPEG;\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseException, shadow } from \"../shared/util.js\";\nimport OpenJPEG from \"../../external/openjpeg/openjpeg.js\";\nimport { Stream } from \"./stream.js\";\nimport { WasmImage } from \"./wasm_image.js\";\n\nclass JpxError extends BaseException {\n  constructor(msg) {\n    super(msg, \"JpxError\");\n  }\n}\n\nclass JpxImage extends WasmImage {\n  _filename = \"openjpeg.wasm\";\n\n  _noWasmFilename = \"openjpeg_nowasm_fallback.js\";\n\n  static get instance() {\n    return shadow(this, \"instance\", new JpxImage(/* trackInstance = */ true));\n  }\n\n  async decode(\n    bytes,\n    {\n      numComponents = 4,\n      isIndexedColormap = false,\n      smaskInData = false,\n      reducePower = 0,\n    } = {}\n  ) {\n    const module = await this._getModule(OpenJPEG);\n\n    if (!module) {\n      throw new JpxError(\"OpenJPEG failed to initialize\");\n    }\n    let ptr;\n\n    try {\n      const size = bytes.length;\n      ptr = module._malloc(size);\n      module.writeArrayToMemory(bytes, ptr);\n      const ret = module._jp2_decode(\n        ptr,\n        size,\n        numComponents > 0 ? numComponents : 0,\n        !!isIndexedColormap,\n        !!smaskInData,\n        reducePower\n      );\n      if (ret) {\n        const { errorMessages } = module;\n        if (errorMessages) {\n          delete module.errorMessages;\n          throw new JpxError(errorMessages);\n        }\n        throw new JpxError(\"Unknown error\");\n      }\n      const { imageData } = module;\n      module.imageData = null;\n\n      return imageData;\n    } finally {\n      if (ptr) {\n        module._free(ptr);\n      }\n    }\n  }\n\n  static parseImageProperties(stream) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"IMAGE_DECODERS\")) {\n      if (stream instanceof ArrayBuffer || ArrayBuffer.isView(stream)) {\n        stream = new Stream(stream);\n      } else {\n        throw new JpxError(\"Invalid data format, must be a TypedArray.\");\n      }\n    }\n    // No need to use OpenJPEG here since we're only getting very basic\n    // information which are located in the first bytes of the file.\n    let newByte = stream.getByte();\n    while (newByte >= 0) {\n      const oldByte = newByte;\n      newByte = stream.getByte();\n      const code = (oldByte << 8) | newByte;\n      // Image and tile size (SIZ)\n      if (code === 0xff51) {\n        stream.skip(4);\n        const Xsiz = stream.getInt32() >>> 0; // Byte 4\n        const Ysiz = stream.getInt32() >>> 0; // Byte 8\n        const XOsiz = stream.getInt32() >>> 0; // Byte 12\n        const YOsiz = stream.getInt32() >>> 0; // Byte 16\n        stream.skip(16);\n        const Csiz = stream.getUint16(); // Byte 36\n        return {\n          width: Xsiz - XOsiz,\n          height: Ysiz - YOsiz,\n          // Results are always returned as `Uint8ClampedArray`s.\n          bitsPerComponent: 8,\n          componentsCount: Csiz,\n        };\n      }\n    }\n    throw new JpxError(\"No size marker found in JPX stream\");\n  }\n}\n\nexport { JpxError, JpxImage };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { JpxImage } from \"./jpx.js\";\nimport { shadow } from \"../shared/util.js\";\n\n/**\n * For JPEG 2000's we use a library to decode these images and\n * the stream behaves like all the other DecodeStreams.\n */\nclass JpxStream extends DecodeStream {\n  constructor(stream, maybeLength) {\n    super(maybeLength);\n\n    this.stream = stream;\n    this.dict = stream.dict;\n    this.maybeLength = maybeLength;\n  }\n\n  get bytes() {\n    // If `this.maybeLength` is null, we'll get the entire stream.\n    return shadow(this, \"bytes\", this.stream.getBytes(this.maybeLength));\n  }\n\n  ensureBuffer(requested) {\n    // No-op, since `this.readBlock` will always parse the entire image and\n    // directly insert all of its data into `this.buffer`.\n  }\n\n  get isAsyncDecoder() {\n    return true;\n  }\n\n  async decodeImage(bytes, _length, decoderOptions) {\n    if (this.eof) {\n      return this.buffer;\n    }\n    bytes ||= this.bytes;\n    this.buffer = await JpxImage.instance.decode(bytes, decoderOptions);\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n\n    return this.buffer;\n  }\n\n  get canAsyncDecodeImageFromBuffer() {\n    return this.stream.isAsync;\n  }\n\n  get isImageStream() {\n    return true;\n  }\n}\n\nexport { JpxStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from \"./decode_stream.js\";\n\nclass LZWStream extends DecodeStream {\n  constructor(str, maybeLength, earlyChange) {\n    super(maybeLength);\n\n    this.stream = str;\n    this.dict = str.dict;\n    this.cachedData = 0;\n    this.bitsCached = 0;\n\n    const maxLzwDictionarySize = 4096;\n    const lzwState = {\n      earlyChange,\n      codeLength: 9,\n      nextCode: 258,\n      dictionaryValues: new Uint8Array(maxLzwDictionarySize),\n      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),\n      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),\n      currentSequence: new Uint8Array(maxLzwDictionarySize),\n      currentSequenceLength: 0,\n    };\n    for (let i = 0; i < 256; ++i) {\n      lzwState.dictionaryValues[i] = i;\n      lzwState.dictionaryLengths[i] = 1;\n    }\n    this.lzwState = lzwState;\n  }\n\n  readBits(n) {\n    let bitsCached = this.bitsCached;\n    let cachedData = this.cachedData;\n    while (bitsCached < n) {\n      const c = this.stream.getByte();\n      if (c === -1) {\n        this.eof = true;\n        return null;\n      }\n      cachedData = (cachedData << 8) | c;\n      bitsCached += 8;\n    }\n    this.bitsCached = bitsCached -= n;\n    this.cachedData = cachedData;\n    return (cachedData >>> bitsCached) & ((1 << n) - 1);\n  }\n\n  readBlock() {\n    const blockSize = 512,\n      decodedSizeDelta = blockSize;\n    let estimatedDecodedSize = blockSize * 2;\n    let i, j, q;\n\n    const lzwState = this.lzwState;\n    if (!lzwState) {\n      return; // eof was found\n    }\n\n    const earlyChange = lzwState.earlyChange;\n    let nextCode = lzwState.nextCode;\n    const dictionaryValues = lzwState.dictionaryValues;\n    const dictionaryLengths = lzwState.dictionaryLengths;\n    const dictionaryPrevCodes = lzwState.dictionaryPrevCodes;\n    let codeLength = lzwState.codeLength;\n    let prevCode = lzwState.prevCode;\n    const currentSequence = lzwState.currentSequence;\n    let currentSequenceLength = lzwState.currentSequenceLength;\n\n    let decodedLength = 0;\n    let currentBufferLength = this.bufferLength;\n    let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n\n    for (i = 0; i < blockSize; i++) {\n      const code = this.readBits(codeLength);\n      const hasPrev = currentSequenceLength > 0;\n      if (code < 256) {\n        currentSequence[0] = code;\n        currentSequenceLength = 1;\n      } else if (code >= 258) {\n        if (code < nextCode) {\n          currentSequenceLength = dictionaryLengths[code];\n          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {\n            currentSequence[j] = dictionaryValues[q];\n            q = dictionaryPrevCodes[q];\n          }\n        } else {\n          currentSequence[currentSequenceLength++] = currentSequence[0];\n        }\n      } else if (code === 256) {\n        codeLength = 9;\n        nextCode = 258;\n        currentSequenceLength = 0;\n        continue;\n      } else {\n        this.eof = true;\n        delete this.lzwState;\n        break;\n      }\n\n      if (hasPrev) {\n        dictionaryPrevCodes[nextCode] = prevCode;\n        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;\n        dictionaryValues[nextCode] = currentSequence[0];\n        nextCode++;\n        codeLength =\n          (nextCode + earlyChange) & (nextCode + earlyChange - 1)\n            ? codeLength\n            : Math.min(\n                Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1,\n                12\n              ) | 0;\n      }\n      prevCode = code;\n\n      decodedLength += currentSequenceLength;\n      if (estimatedDecodedSize < decodedLength) {\n        do {\n          estimatedDecodedSize += decodedSizeDelta;\n        } while (estimatedDecodedSize < decodedLength);\n        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n      }\n      for (j = 0; j < currentSequenceLength; j++) {\n        buffer[currentBufferLength++] = currentSequence[j];\n      }\n    }\n    lzwState.nextCode = nextCode;\n    lzwState.codeLength = codeLength;\n    lzwState.prevCode = prevCode;\n    lzwState.currentSequenceLength = currentSequenceLength;\n\n    this.bufferLength = currentBufferLength;\n  }\n}\n\nexport { LZWStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { Dict } from \"./primitives.js\";\nimport { FormatError } from \"../shared/util.js\";\n\nclass PredictorStream extends DecodeStream {\n  constructor(str, maybeLength, params) {\n    super(maybeLength);\n\n    if (!(params instanceof Dict)) {\n      return str; // no prediction\n    }\n    const predictor = (this.predictor = params.get(\"Predictor\") || 1);\n\n    if (predictor <= 1) {\n      return str; // no prediction\n    }\n    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {\n      throw new FormatError(`Unsupported predictor: ${predictor}`);\n    }\n\n    this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng;\n\n    this.stream = str;\n    this.dict = str.dict;\n\n    const colors = (this.colors = params.get(\"Colors\") || 1);\n    const bits = (this.bits = params.get(\"BPC\", \"BitsPerComponent\") || 8);\n    const columns = (this.columns = params.get(\"Columns\") || 1);\n\n    this.pixBytes = (colors * bits + 7) >> 3;\n    this.rowBytes = (columns * colors * bits + 7) >> 3;\n\n    return this;\n  }\n\n  readBlockTiff() {\n    const rowBytes = this.rowBytes;\n\n    const bufferLength = this.bufferLength;\n    const buffer = this.ensureBuffer(bufferLength + rowBytes);\n\n    const bits = this.bits;\n    const colors = this.colors;\n\n    const rawBytes = this.stream.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n\n    let inbuf = 0,\n      outbuf = 0;\n    let inbits = 0,\n      outbits = 0;\n    let pos = bufferLength;\n    let i;\n\n    if (bits === 1 && colors === 1) {\n      // Optimized version of the loop in the \"else\"-branch\n      // for 1 bit-per-component and 1 color TIFF images.\n      for (i = 0; i < rowBytes; ++i) {\n        let c = rawBytes[i] ^ inbuf;\n        c ^= c >> 1;\n        c ^= c >> 2;\n        c ^= c >> 4;\n        inbuf = (c & 1) << 7;\n        buffer[pos++] = c;\n      }\n    } else if (bits === 8) {\n      for (i = 0; i < colors; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n      for (; i < rowBytes; ++i) {\n        buffer[pos] = buffer[pos - colors] + rawBytes[i];\n        pos++;\n      }\n    } else if (bits === 16) {\n      const bytesPerPixel = colors * 2;\n      for (i = 0; i < bytesPerPixel; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n      for (; i < rowBytes; i += 2) {\n        const sum =\n          ((rawBytes[i] & 0xff) << 8) +\n          (rawBytes[i + 1] & 0xff) +\n          ((buffer[pos - bytesPerPixel] & 0xff) << 8) +\n          (buffer[pos - bytesPerPixel + 1] & 0xff);\n        buffer[pos++] = (sum >> 8) & 0xff;\n        buffer[pos++] = sum & 0xff;\n      }\n    } else {\n      const compArray = new Uint8Array(colors + 1);\n      const bitMask = (1 << bits) - 1;\n      let j = 0,\n        k = bufferLength;\n      const columns = this.columns;\n      for (i = 0; i < columns; ++i) {\n        for (let kk = 0; kk < colors; ++kk) {\n          if (inbits < bits) {\n            inbuf = (inbuf << 8) | (rawBytes[j++] & 0xff);\n            inbits += 8;\n          }\n          compArray[kk] =\n            (compArray[kk] + (inbuf >> (inbits - bits))) & bitMask;\n          inbits -= bits;\n          outbuf = (outbuf << bits) | compArray[kk];\n          outbits += bits;\n          if (outbits >= 8) {\n            buffer[k++] = (outbuf >> (outbits - 8)) & 0xff;\n            outbits -= 8;\n          }\n        }\n      }\n      if (outbits > 0) {\n        buffer[k++] =\n          (outbuf << (8 - outbits)) + (inbuf & ((1 << (8 - outbits)) - 1));\n      }\n    }\n    this.bufferLength += rowBytes;\n  }\n\n  readBlockPng() {\n    const rowBytes = this.rowBytes;\n    const pixBytes = this.pixBytes;\n\n    const predictor = this.stream.getByte();\n    const rawBytes = this.stream.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n\n    const bufferLength = this.bufferLength;\n    const buffer = this.ensureBuffer(bufferLength + rowBytes);\n\n    let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);\n    if (prevRow.length === 0) {\n      prevRow = new Uint8Array(rowBytes);\n    }\n\n    let i,\n      j = bufferLength,\n      up,\n      c;\n    switch (predictor) {\n      case 0:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        break;\n      case 1:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xff;\n          j++;\n        }\n        break;\n      case 2:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xff;\n        }\n        break;\n      case 3:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] =\n            (((prevRow[i] + buffer[j - pixBytes]) >> 1) + rawBytes[i]) & 0xff;\n          j++;\n        }\n        break;\n      case 4:\n        // we need to save the up left pixels values. the simplest way\n        // is to create a new buffer\n        for (i = 0; i < pixBytes; ++i) {\n          up = prevRow[i];\n          c = rawBytes[i];\n          buffer[j++] = up + c;\n        }\n        for (; i < rowBytes; ++i) {\n          up = prevRow[i];\n          const upLeft = prevRow[i - pixBytes];\n          const left = buffer[j - pixBytes];\n          const p = left + up - upLeft;\n\n          let pa = p - left;\n          if (pa < 0) {\n            pa = -pa;\n          }\n          let pb = p - up;\n          if (pb < 0) {\n            pb = -pb;\n          }\n          let pc = p - upLeft;\n          if (pc < 0) {\n            pc = -pc;\n          }\n\n          c = rawBytes[i];\n          if (pa <= pb && pa <= pc) {\n            buffer[j++] = left + c;\n          } else if (pb <= pc) {\n            buffer[j++] = up + c;\n          } else {\n            buffer[j++] = upLeft + c;\n          }\n        }\n        break;\n      default:\n        throw new FormatError(`Unsupported predictor: ${predictor}`);\n    }\n    this.bufferLength += rowBytes;\n  }\n}\n\nexport { PredictorStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from \"./decode_stream.js\";\n\nclass RunLengthStream extends DecodeStream {\n  constructor(str, maybeLength) {\n    super(maybeLength);\n\n    this.stream = str;\n    this.dict = str.dict;\n  }\n\n  readBlock() {\n    // The repeatHeader has following format. The first byte defines type of run\n    // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes\n    // (in addition to the second byte from the header), n = 129 through 255 -\n    // duplicate the second byte from the header (257 - n) times, n = 128 - end.\n    const repeatHeader = this.stream.getBytes(2);\n    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {\n      this.eof = true;\n      return;\n    }\n\n    let buffer;\n    let bufferLength = this.bufferLength;\n    let n = repeatHeader[0];\n    if (n < 128) {\n      // copy n bytes\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      buffer[bufferLength++] = repeatHeader[1];\n      if (n > 0) {\n        const source = this.stream.getBytes(n);\n        buffer.set(source, bufferLength);\n        bufferLength += n;\n      }\n    } else {\n      n = 257 - n;\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      buffer.fill(repeatHeader[1], bufferLength, bufferLength + n);\n      bufferLength += n;\n    }\n    this.bufferLength = bufferLength;\n  }\n}\n\nexport { RunLengthStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  bytesToString,\n  FormatError,\n  info,\n  warn,\n} from \"../shared/util.js\";\nimport { Cmd, Dict, EOF, isCmd, isName, Name, Ref } from \"./primitives.js\";\nimport {\n  isWhiteSpace,\n  MissingDataException,\n  ParserEOFException,\n} from \"./core_utils.js\";\nimport { NullStream, Stream } from \"./stream.js\";\nimport { Ascii85Stream } from \"./ascii_85_stream.js\";\nimport { AsciiHexStream } from \"./ascii_hex_stream.js\";\nimport { BrotliStream } from \"./brotli_stream.js\";\nimport { CCITTFaxStream } from \"./ccitt_stream.js\";\nimport { FlateStream } from \"./flate_stream.js\";\nimport { Jbig2Stream } from \"./jbig2_stream.js\";\nimport { JpegStream } from \"./jpeg_stream.js\";\nimport { JpxStream } from \"./jpx_stream.js\";\nimport { LZWStream } from \"./lzw_stream.js\";\nimport { PredictorStream } from \"./predictor_stream.js\";\nimport { RunLengthStream } from \"./run_length_stream.js\";\n\n/**\n * @import { BaseStream } from \"./base_stream.js\"\n * @import { CipherTransform } from \"./crypto.js\"\n */\n\n/**\n * @typedef {Ascii85Stream | AsciiHexStream | BaseStream | BrotliStream\n * | CCITTFaxStream | FlateStream | Jbig2Stream | JpegStream | JpxStream\n * | LZWStream | NullStream | PredictorStream | RunLengthStream} Streams\n */\n\nconst MAX_LENGTH_TO_CACHE = 1000;\n\nfunction getInlineImageCacheKey(bytes) {\n  const strBuf = [],\n    ii = bytes.length;\n  let i = 0;\n  while (i < ii - 1) {\n    strBuf.push((bytes[i++] << 8) | bytes[i++]);\n  }\n  // Handle an odd number of elements.\n  if (i < ii) {\n    strBuf.push(bytes[i]);\n  }\n  // We purposely include the \"raw\" length in the cacheKey, to prevent any\n  // possible issues with hash collisions in the inline image cache.\n  // Here we also assume that `strBuf` is never larger than 8192 elements,\n  // please refer to the `bytesToString` implementation.\n  return ii + \"_\" + String.fromCharCode.apply(null, strBuf);\n}\n\nclass Parser {\n  constructor({ lexer, xref, allowStreams = false, recoveryMode = false }) {\n    this.lexer = lexer;\n    this.xref = xref;\n    this.allowStreams = allowStreams;\n    this.recoveryMode = recoveryMode;\n\n    this.imageCache = Object.create(null);\n    this._imageId = 0;\n    this.refill();\n  }\n\n  refill() {\n    this.buf1 = this.lexer.getObj();\n    this.buf2 = this.lexer.getObj();\n  }\n\n  shift() {\n    if (this.buf2 instanceof Cmd && this.buf2.cmd === \"ID\") {\n      this.buf1 = this.buf2;\n      this.buf2 = null;\n    } else {\n      this.buf1 = this.buf2;\n      this.buf2 = this.lexer.getObj();\n    }\n  }\n\n  tryShift() {\n    try {\n      this.shift();\n      return true;\n    } catch (e) {\n      if (e instanceof MissingDataException) {\n        throw e;\n      }\n      // Upon failure, the caller should reset this.lexer.pos to a known good\n      // state and call this.shift() twice to reset the buffers.\n      return false;\n    }\n  }\n\n  /**\n   * @param {CipherTransform | null} cipherTransform\n   *   Cipher transform for decryption.\n   * @returns {unknown}\n   */\n  getObj(cipherTransform = null) {\n    const buf1 = this.buf1;\n    this.shift();\n\n    if (buf1 instanceof Cmd) {\n      switch (buf1.cmd) {\n        case \"BI\": // inline image\n          return this.makeInlineImage(cipherTransform);\n        case \"[\": // array\n          const array = [];\n          while (!isCmd(this.buf1, \"]\") && this.buf1 !== EOF) {\n            array.push(this.getObj(cipherTransform));\n          }\n          if (this.buf1 === EOF) {\n            if (this.recoveryMode) {\n              return array;\n            }\n            throw new ParserEOFException(\"End of file inside array.\");\n          }\n          this.shift();\n          return array;\n        case \"<<\": // dictionary or stream\n          const dict = new Dict(this.xref);\n          while (!isCmd(this.buf1, \">>\") && this.buf1 !== EOF) {\n            if (!(this.buf1 instanceof Name)) {\n              info(\"Malformed dictionary: key must be a name object\");\n              this.shift();\n              continue;\n            }\n\n            const key = this.buf1.name;\n            this.shift();\n            if (this.buf1 === EOF) {\n              break;\n            }\n            dict.set(key, this.getObj(cipherTransform));\n          }\n          if (this.buf1 === EOF) {\n            if (this.recoveryMode) {\n              return dict;\n            }\n            throw new ParserEOFException(\"End of file inside dictionary.\");\n          }\n\n          // Stream objects are not allowed inside content streams or\n          // object streams.\n          if (isCmd(this.buf2, \"stream\")) {\n            return this.allowStreams\n              ? this.makeStream(dict, cipherTransform)\n              : dict;\n          }\n          this.shift();\n          return dict;\n        default: // simple object\n          return buf1;\n      }\n    }\n\n    if (Number.isInteger(buf1)) {\n      // indirect reference or integer\n      if (Number.isInteger(this.buf1) && isCmd(this.buf2, \"R\")) {\n        const ref = Ref.get(buf1, this.buf1);\n        this.shift();\n        this.shift();\n        return ref;\n      }\n      return buf1;\n    }\n\n    if (typeof buf1 === \"string\") {\n      if (cipherTransform) {\n        return cipherTransform.decryptString(buf1);\n      }\n      return buf1;\n    }\n\n    // simple object\n    return buf1;\n  }\n\n  /**\n   * Find the end of the stream by searching for the /EI\\s/.\n   * @returns {number} The inline stream length.\n   */\n  findDefaultInlineStreamEnd(stream) {\n    const E = 0x45,\n      I = 0x49,\n      SPACE = 0x20,\n      LF = 0xa,\n      CR = 0xd,\n      NUL = 0x0;\n    const { knownCommands } = this.lexer,\n      startPos = stream.pos,\n      n = 15;\n    let state = 0,\n      ch,\n      maybeEIPos;\n    while ((ch = stream.getByte()) !== -1) {\n      if (state === 0) {\n        state = ch === E ? 1 : 0;\n      } else if (state === 1) {\n        state = ch === I ? 2 : 0;\n      } else {\n        if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n          assert(state === 2, \"findDefaultInlineStreamEnd - invalid state.\");\n        }\n        if (ch === SPACE || ch === LF || ch === CR) {\n          maybeEIPos = stream.pos;\n          // Let's check that the next `n` bytes are ASCII... just to be sure.\n          const followingBytes = stream.peekBytes(n);\n\n          const ii = followingBytes.length;\n          if (ii === 0) {\n            break; // The end of the stream was reached, nothing to check.\n          }\n          for (let i = 0; i < ii; i++) {\n            ch = followingBytes[i];\n            if (ch === NUL && followingBytes[i + 1] !== NUL) {\n              // NUL bytes are not supposed to occur *outside* of inline\n              // images, but some PDF generators violate that assumption,\n              // thus breaking the EI detection heuristics used below.\n              //\n              // However, we can't unconditionally treat NUL bytes as \"ASCII\",\n              // since that *could* result in inline images being truncated.\n              //\n              // To attempt to address this, we'll still treat any *sequence*\n              // of NUL bytes as non-ASCII, but for a *single* NUL byte we'll\n              // continue checking the `followingBytes` (fixes issue8823.pdf).\n              continue;\n            }\n            if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) {\n              // Not a LF, CR, SPACE or any visible ASCII character, i.e.\n              // it's binary stuff. Resetting the state.\n              state = 0;\n              break;\n            }\n          }\n\n          if (state !== 2) {\n            continue;\n          }\n          if (!knownCommands) {\n            warn(\n              \"findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.\"\n            );\n            continue;\n          }\n          // Check that the \"EI\" sequence isn't part of the image data, since\n          // that would cause the image to be truncated (fixes issue11124.pdf).\n          //\n          // Check more than the `followingBytes` to be able to find operators\n          // with multiple arguments, e.g. transform (cm) with decimal arguments\n          // (fixes issue19494.pdf).\n          const tmpLexer = new Lexer(\n            new Stream(stream.peekBytes(5 * n)),\n            knownCommands\n          );\n          // Reduce the number of (potential) warning messages.\n          tmpLexer._hexStringWarn = () => {};\n          let numArgs = 0;\n\n          while (true) {\n            const nextObj = tmpLexer.getObj();\n\n            if (nextObj === EOF) {\n              state = 0; // No valid command found, resetting the state.\n              break;\n            }\n            if (nextObj instanceof Cmd) {\n              const knownCommand = knownCommands[nextObj.cmd];\n              if (!knownCommand) {\n                // Not a valid command, i.e. the inline image data *itself*\n                // contains an \"EI\" sequence. Resetting the state.\n                state = 0;\n                break;\n              } else if (\n                knownCommand.variableArgs\n                  ? numArgs <= knownCommand.numArgs\n                  : numArgs === knownCommand.numArgs\n              ) {\n                break; // Valid command found.\n              }\n              numArgs = 0;\n              continue;\n            }\n            numArgs++;\n          }\n\n          if (state === 2) {\n            break; // Finished!\n          }\n        } else {\n          state = 0;\n        }\n      }\n    }\n\n    if (ch === -1) {\n      warn(\n        \"findDefaultInlineStreamEnd: \" +\n          \"Reached the end of the stream without finding a valid EI marker\"\n      );\n      if (maybeEIPos) {\n        warn('... trying to recover by using the last \"EI\" occurrence.');\n        stream.skip(-(stream.pos - maybeEIPos)); // Reset the stream position.\n      }\n    }\n\n    let endOffset = 4;\n    stream.skip(-endOffset); // Set the stream position to just before \"EI\".\n    ch = stream.peekByte();\n    stream.skip(endOffset); // ... and remember to reset the stream position.\n\n    // Ensure that we don't accidentally truncate the inline image, when the\n    // data is immediately followed by the \"EI\" marker (fixes issue10388.pdf).\n    if (!isWhiteSpace(ch)) {\n      endOffset--;\n    }\n    return stream.pos - endOffset - startPos;\n  }\n\n  /**\n   * Find the EOI (end-of-image) marker 0xFFD9 of the stream.\n   * @returns {number} The inline stream length.\n   */\n  findDCTDecodeInlineStreamEnd(stream) {\n    const startPos = stream.pos;\n    let foundEOI = false,\n      b,\n      markerLength;\n    while ((b = stream.getByte()) !== -1) {\n      if (b !== 0xff) {\n        // Not a valid marker.\n        continue;\n      }\n      switch (stream.getByte()) {\n        case 0x00: // Byte stuffing.\n          // 0xFF00 appears to be a very common byte sequence in JPEG images.\n          break;\n\n        case 0xff: // Fill byte.\n          // Avoid skipping a valid marker, resetting the stream position.\n          stream.skip(-1);\n          break;\n\n        case 0xd9: // EOI\n          foundEOI = true;\n          break;\n\n        case 0xc0: // SOF0\n        case 0xc1: // SOF1\n        case 0xc2: // SOF2\n        case 0xc3: // SOF3\n        /* falls through */\n        case 0xc5: // SOF5\n        case 0xc6: // SOF6\n        case 0xc7: // SOF7\n        /* falls through */\n        case 0xc9: // SOF9\n        case 0xca: // SOF10\n        case 0xcb: // SOF11\n        /* falls through */\n        case 0xcd: // SOF13\n        case 0xce: // SOF14\n        case 0xcf: // SOF15\n        /* falls through */\n        case 0xc4: // DHT\n        case 0xcc: // DAC\n        /* falls through */\n        case 0xda: // SOS\n        case 0xdb: // DQT\n        case 0xdc: // DNL\n        case 0xdd: // DRI\n        case 0xde: // DHP\n        case 0xdf: // EXP\n        /* falls through */\n        case 0xe0: // APP0\n        case 0xe1: // APP1\n        case 0xe2: // APP2\n        case 0xe3: // APP3\n        case 0xe4: // APP4\n        case 0xe5: // APP5\n        case 0xe6: // APP6\n        case 0xe7: // APP7\n        case 0xe8: // APP8\n        case 0xe9: // APP9\n        case 0xea: // APP10\n        case 0xeb: // APP11\n        case 0xec: // APP12\n        case 0xed: // APP13\n        case 0xee: // APP14\n        case 0xef: // APP15\n        /* falls through */\n        case 0xfe: // COM\n          // The marker should be followed by the length of the segment.\n          markerLength = stream.getUint16();\n          if (markerLength > 2) {\n            // |markerLength| contains the byte length of the marker segment,\n            // including its own length (2 bytes) and excluding the marker.\n            stream.skip(markerLength - 2); // Jump to the next marker.\n          } else {\n            // The marker length is invalid, resetting the stream position.\n            stream.skip(-2);\n          }\n          break;\n      }\n      if (foundEOI) {\n        break;\n      }\n    }\n    const length = stream.pos - startPos;\n    if (b === -1) {\n      warn(\n        \"Inline DCTDecode image stream: \" +\n          \"EOI marker not found, searching for /EI/ instead.\"\n      );\n      stream.skip(-length); // Reset the stream position.\n      return this.findDefaultInlineStreamEnd(stream);\n    }\n    this.inlineStreamSkipEI(stream);\n    return length;\n  }\n\n  /**\n   * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream.\n   * @returns {number} The inline stream length.\n   */\n  findASCII85DecodeInlineStreamEnd(stream) {\n    const TILDE = 0x7e,\n      GT = 0x3e;\n    const startPos = stream.pos;\n    let ch;\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === TILDE) {\n        const tildePos = stream.pos;\n\n        ch = stream.peekByte();\n        // Handle corrupt PDF documents which contains whitespace \"inside\" of\n        // the EOD marker (fixes issue10614.pdf).\n        while (isWhiteSpace(ch)) {\n          stream.skip();\n          ch = stream.peekByte();\n        }\n        if (ch === GT) {\n          stream.skip();\n          break;\n        }\n        // Handle corrupt PDF documents which contains truncated EOD markers,\n        // where the '>' character is missing (fixes issue11385.pdf).\n        if (stream.pos > tildePos) {\n          const maybeEI = stream.peekBytes(2);\n          if (maybeEI[0] === /* E = */ 0x45 && maybeEI[1] === /* I = */ 0x49) {\n            break;\n          }\n        }\n      }\n    }\n    const length = stream.pos - startPos;\n    if (ch === -1) {\n      warn(\n        \"Inline ASCII85Decode image stream: \" +\n          \"EOD marker not found, searching for /EI/ instead.\"\n      );\n      stream.skip(-length); // Reset the stream position.\n      return this.findDefaultInlineStreamEnd(stream);\n    }\n    this.inlineStreamSkipEI(stream);\n    return length;\n  }\n\n  /**\n   * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream.\n   * @returns {number} The inline stream length.\n   */\n  findASCIIHexDecodeInlineStreamEnd(stream) {\n    const GT = 0x3e;\n    const startPos = stream.pos;\n    let ch;\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === GT) {\n        break;\n      }\n    }\n    const length = stream.pos - startPos;\n    if (ch === -1) {\n      warn(\n        \"Inline ASCIIHexDecode image stream: \" +\n          \"EOD marker not found, searching for /EI/ instead.\"\n      );\n      stream.skip(-length); // Reset the stream position.\n      return this.findDefaultInlineStreamEnd(stream);\n    }\n    this.inlineStreamSkipEI(stream);\n    return length;\n  }\n\n  /**\n   * Skip over the /EI/ for streams where we search for an EOD marker.\n   */\n  inlineStreamSkipEI(stream) {\n    const E = 0x45,\n      I = 0x49;\n    let state = 0,\n      ch;\n    while ((ch = stream.getByte()) !== -1) {\n      if (state === 0) {\n        state = ch === E ? 1 : 0;\n      } else if (state === 1) {\n        state = ch === I ? 2 : 0;\n      } else if (state === 2) {\n        break;\n      }\n    }\n  }\n\n  /**\n   * @param {CipherTransform | null} cipherTransform\n   * @returns {Streams}\n   */\n  makeInlineImage(cipherTransform) {\n    const lexer = this.lexer;\n    const stream = lexer.stream;\n\n    // Parse dictionary, but initialize it lazily to improve performance with\n    // cached inline images (see issue 2618).\n    const dictMap = Object.create(null);\n    let dictLength;\n    while (!isCmd(this.buf1, \"ID\") && this.buf1 !== EOF) {\n      if (!(this.buf1 instanceof Name)) {\n        throw new FormatError(\"Dictionary key must be a name object\");\n      }\n      const key = this.buf1.name;\n      this.shift();\n      if (this.buf1 === EOF) {\n        break;\n      }\n      dictMap[key] = this.getObj(cipherTransform);\n    }\n    if (lexer.beginInlineImagePos !== -1) {\n      dictLength = stream.pos - lexer.beginInlineImagePos;\n    }\n\n    // Extract the name of the first (i.e. the current) image filter.\n    const filter = this.#fetchIfRef(dictMap.F || dictMap.Filter);\n    let filterName;\n    if (filter instanceof Name) {\n      filterName = filter.name;\n    } else if (Array.isArray(filter)) {\n      const filterZero = this.#fetchIfRef(filter[0]);\n      if (filterZero instanceof Name) {\n        filterName = filterZero.name;\n      }\n    }\n\n    // Parse image stream.\n    const startPos = stream.pos;\n    let length;\n    switch (filterName) {\n      case \"DCT\":\n      case \"DCTDecode\":\n        length = this.findDCTDecodeInlineStreamEnd(stream);\n        break;\n      case \"A85\":\n      case \"ASCII85Decode\":\n        length = this.findASCII85DecodeInlineStreamEnd(stream);\n        break;\n      case \"AHx\":\n      case \"ASCIIHexDecode\":\n        length = this.findASCIIHexDecodeInlineStreamEnd(stream);\n        break;\n      default:\n        length = this.findDefaultInlineStreamEnd(stream);\n    }\n\n    // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their\n    // stringified content, to prevent possible hash collisions.\n    let cacheKey;\n    if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) {\n      const initialStreamPos = stream.pos;\n      // Set the stream position to the beginning of the dictionary data...\n      stream.pos = lexer.beginInlineImagePos;\n      // ... and fetch the bytes of the dictionary *and* the inline image.\n      cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length));\n      // Finally, don't forget to reset the stream position.\n      stream.pos = initialStreamPos;\n\n      const cacheEntry = this.imageCache[cacheKey];\n      if (cacheEntry !== undefined) {\n        this.buf2 = Cmd.get(\"EI\");\n        this.shift();\n\n        cacheEntry.reset();\n        return cacheEntry;\n      }\n    }\n\n    const dict = new Dict(this.xref);\n    for (const key in dictMap) {\n      dict.set(key, dictMap[key]);\n    }\n    let imageStream = stream.makeSubStream(startPos, length, dict);\n    if (cipherTransform && !this.#hasCryptFilter(filter)) {\n      imageStream = cipherTransform.createStream(imageStream, length);\n    }\n\n    imageStream = this.filter(imageStream, dict, length, cipherTransform);\n    imageStream.dict = dict;\n    if (cacheKey !== undefined) {\n      imageStream.cacheKey = `inline_img_${++this._imageId}`;\n      this.imageCache[cacheKey] = imageStream;\n    }\n\n    this.buf2 = Cmd.get(\"EI\");\n    this.shift();\n\n    return imageStream;\n  }\n\n  /**\n   * Resolve indirect objects when `xref` is available.\n   *\n   * @param {unknown} obj\n   * @returns {unknown}\n   */\n  #fetchIfRef(obj) {\n    return this.xref ? this.xref.fetchIfRef(obj) : obj;\n  }\n\n  /**\n   * Check if a stream filter chain contains `/Crypt`.\n   *\n   * @param {unknown} [filter]\n   *   Object, probably a name or an array of names.\n   * @returns {boolean}\n   *   Whether the filter chain contains `/Crypt`.\n   */\n  #hasCryptFilter(filter) {\n    if (!Array.isArray(filter)) {\n      return isName(filter, \"Crypt\");\n    }\n\n    for (const f of filter) {\n      if (isName(this.#fetchIfRef(f), \"Crypt\")) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  #findStreamLength(startPos) {\n    const { stream } = this.lexer;\n    stream.pos = startPos;\n\n    const SCAN_BLOCK_LENGTH = 2048;\n    const signatureLength = \"endstream\".length;\n\n    const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]);\n    const endLength = END_SIGNATURE.length;\n\n    // Ideally we'd directly search for \"endstream\", however there are corrupt\n    // PDF documents where the command is incomplete; hence we search for:\n    //  1. The normal case.\n    //  2. The misspelled case (fixes issue18122.pdf).\n    //  3. The truncated case (fixes issue10004.pdf).\n    const PARTIAL_SIGNATURE = [\n      new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]), // \"stream\"\n      new Uint8Array([0x73, 0x74, 0x65, 0x61, 0x6d]), // \"steam\",\n      new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61]), // \"strea\"\n    ];\n    const normalLength = signatureLength - endLength;\n\n    while (stream.pos < stream.end) {\n      const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);\n      const scanLength = scanBytes.length - signatureLength;\n\n      if (scanLength <= 0) {\n        break;\n      }\n      let pos = 0;\n      while (pos < scanLength) {\n        let j = 0;\n        while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) {\n          j++;\n        }\n        if (j >= endLength) {\n          // \"end\" found, find the complete command.\n          let found = false;\n          for (const part of PARTIAL_SIGNATURE) {\n            const partLen = part.length;\n            let k = 0;\n            while (k < partLen && scanBytes[pos + j + k] === part[k]) {\n              k++;\n            }\n            if (k >= normalLength) {\n              // Found \"endstream\" command.\n              found = true;\n              break;\n            }\n            if (k >= partLen) {\n              // Found \"endsteam\" or \"endstea\" command.\n              // Ensure that the byte immediately following the corrupt\n              // endstream command is a space, to prevent false positives.\n              const lastByte = scanBytes[pos + j + k];\n              if (isWhiteSpace(lastByte)) {\n                info(\n                  `Found \"${bytesToString([...END_SIGNATURE, ...part])}\" when ` +\n                    \"searching for endstream command.\"\n                );\n                found = true;\n              }\n              break;\n            }\n          }\n\n          if (found) {\n            stream.pos += pos;\n            return stream.pos - startPos;\n          }\n        }\n        pos++;\n      }\n      stream.pos += scanLength;\n    }\n    return -1;\n  }\n\n  makeStream(dict, cipherTransform) {\n    const lexer = this.lexer;\n    let stream = lexer.stream;\n\n    // Get the stream's start position.\n    lexer.skipToNextLine();\n    const startPos = stream.pos - 1;\n\n    // Get the length.\n    let length = dict.get(\"Length\");\n    if (!Number.isInteger(length)) {\n      info(`Bad length \"${length && length.toString()}\" in stream.`);\n      length = 0;\n    }\n\n    // Skip over the stream data.\n    stream.pos = startPos + length;\n    lexer.nextChar();\n\n    // Shift '>>' and check whether the new object marks the end of the stream.\n    if (this.tryShift() && isCmd(this.buf2, \"endstream\")) {\n      this.shift(); // 'stream'\n    } else {\n      // Bad stream length, scanning for endstream command.\n      length = this.#findStreamLength(startPos);\n      if (length < 0) {\n        throw new FormatError(\"Missing endstream command.\");\n      }\n\n      lexer.nextChar();\n      this.shift();\n      this.shift();\n    }\n    this.shift(); // 'endstream'\n\n    stream = stream.makeSubStream(startPos, length, dict);\n    const filter = dict.get(\"F\", \"Filter\");\n    // Streams that explicitly use `/Crypt` are decrypted in the filter chain,\n    // so avoid applying the default stream cipher up-front.\n    if (cipherTransform && !this.#hasCryptFilter(filter)) {\n      stream = cipherTransform.createStream(stream, length);\n    }\n    stream = this.filter(stream, dict, length, cipherTransform);\n    stream.dict = dict;\n    return stream;\n  }\n\n  /**\n   * @param {Streams} stream\n   * @param {Dict} dict\n   * @param {number | null} length\n   * @param {CipherTransform | null} cipherTransform\n   * @returns {Streams}\n   */\n  filter(stream, dict, length, cipherTransform = null) {\n    let filter = dict.get(\"F\", \"Filter\");\n    let params = dict.get(\"DP\", \"DecodeParms\");\n\n    if (filter instanceof Name) {\n      if (Array.isArray(params)) {\n        warn(\"/DecodeParms should not be an Array, when /Filter is a Name.\");\n      }\n      return this.makeFilter(\n        stream,\n        filter.name,\n        length,\n        params,\n        cipherTransform\n      );\n    }\n\n    let maybeLength = length;\n    if (Array.isArray(filter)) {\n      const filterArray = filter;\n      const paramsArray = params;\n      for (let i = 0, ii = filterArray.length; i < ii; ++i) {\n        filter = this.#fetchIfRef(filterArray[i]);\n        if (!(filter instanceof Name)) {\n          throw new FormatError(`Bad filter name \"${filter}\"`);\n        }\n\n        params = null;\n        if (Array.isArray(paramsArray) && i in paramsArray) {\n          params = this.#fetchIfRef(paramsArray[i]);\n        }\n        stream = this.makeFilter(\n          stream,\n          filter.name,\n          maybeLength,\n          params,\n          cipherTransform\n        );\n        // After the first stream the `length` variable is invalid.\n        maybeLength = null;\n      }\n    }\n    return stream;\n  }\n\n  /**\n   * @param {Streams} stream\n   * @param {string} name\n   * @param {number | null} maybeLength\n   * @param {Dict | null} params\n   * @param {CipherTransform | null | undefined} [cipherTransform]\n   * @returns {Streams}\n   */\n  makeFilter(stream, name, maybeLength, params, cipherTransform = null) {\n    // Since the 'Length' entry in the stream dictionary can be completely\n    // wrong, e.g. zero for non-empty streams, only skip parsing the stream\n    // when we can be absolutely certain that it actually is empty.\n    if (maybeLength === 0) {\n      warn(`Empty \"${name}\" stream.`);\n      return new NullStream();\n    }\n\n    try {\n      switch (name) {\n        case \"Fl\":\n        case \"FlateDecode\":\n          if (params) {\n            return new PredictorStream(\n              new FlateStream(stream, maybeLength),\n              maybeLength,\n              params\n            );\n          }\n          return new FlateStream(stream, maybeLength);\n        case \"LZW\":\n        case \"LZWDecode\":\n          let earlyChange = 1;\n          if (params) {\n            if (params.has(\"EarlyChange\")) {\n              earlyChange = params.get(\"EarlyChange\");\n            }\n            return new PredictorStream(\n              new LZWStream(stream, maybeLength, earlyChange),\n              maybeLength,\n              params\n            );\n          }\n          return new LZWStream(stream, maybeLength, earlyChange);\n        case \"DCT\":\n        case \"DCTDecode\":\n          return new JpegStream(stream, maybeLength, params);\n        case \"JPX\":\n        case \"JPXDecode\":\n          return new JpxStream(stream, maybeLength);\n        case \"A85\":\n        case \"ASCII85Decode\":\n          return new Ascii85Stream(stream, maybeLength);\n        case \"AHx\":\n        case \"ASCIIHexDecode\":\n          return new AsciiHexStream(stream, maybeLength);\n        case \"CCF\":\n        case \"CCITTFaxDecode\":\n          return new CCITTFaxStream(stream, maybeLength, params);\n        case \"RL\":\n        case \"RunLengthDecode\":\n          return new RunLengthStream(stream, maybeLength);\n        case \"JBIG2Decode\":\n          return new Jbig2Stream(stream, maybeLength, params);\n        case \"BrotliDecode\":\n          return new BrotliStream(stream, maybeLength);\n        case \"Crypt\": {\n          if (!cipherTransform) {\n            warn('Filter \"Crypt\" is missing a cipher transform.');\n            return stream;\n          }\n          const param = params instanceof Dict ? params.get(\"Name\") : null;\n          // Default to \"Identity\" (PDF 7.4.10).\n          const cryptName =\n            param instanceof Name ? param : Name.get(\"Identity\");\n          return cipherTransform.createStream(stream, maybeLength, cryptName);\n        }\n      }\n      warn(`Filter \"${name}\" is not supported.`);\n      return stream;\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(`Invalid stream: \"${ex}\"`);\n      return new NullStream();\n    }\n  }\n}\n\n// A '1' in this array means the character is white space. A '1' or\n// '2' means the character ends a name or command.\n// prettier-ignore\nconst specialChars = [\n  1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x\n  1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  // fx\n];\n\nfunction toHexDigit(ch) {\n  if (ch >= /* '0' = */ 0x30 && ch /* '9' = */ <= 0x39) {\n    return ch & 0x0f;\n  }\n  if (\n    (ch >= /* 'A' = */ 0x41 && ch <= /* 'F' = */ 0x46) ||\n    (ch >= /* 'a' = */ 0x61 && ch <= /* 'f' = */ 0x66)\n  ) {\n    return (ch & 0x0f) + 9;\n  }\n  return -1;\n}\n\nclass Lexer {\n  constructor(stream, knownCommands = null) {\n    this.stream = stream;\n    this.nextChar();\n\n    // While lexing, we build up many strings one char at a time. Using += for\n    // this can result in lots of garbage strings. It's better to build an\n    // array of single-char strings and then join() them together at the end.\n    // And reusing a single array (i.e. |this.strBuf|) over and over for this\n    // purpose uses less memory than using a new array for each string.\n    this.strBuf = [];\n\n    // The PDFs might have \"glued\" commands with other commands, operands or\n    // literals, e.g. \"q1\". The knownCommands is a dictionary of the valid\n    // commands and their prefixes. The prefixes are built the following way:\n    // if there a command that is a prefix of the other valid command or\n    // literal (e.g. 'f' and 'false') the following prefixes must be included,\n    // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no\n    // other commands or literals as a prefix. The knowCommands is optional.\n    this.knownCommands = knownCommands;\n\n    this._hexStringNumWarn = 0;\n    this.beginInlineImagePos = -1;\n  }\n\n  nextChar() {\n    return (this.currentChar = this.stream.getByte());\n  }\n\n  peekChar() {\n    return this.stream.peekByte();\n  }\n\n  getNumber() {\n    let ch = this.currentChar;\n    let divideBy = 0; // Different from 0 if it's a floating point value.\n    let sign = 1;\n\n    if (ch === /* '-' = */ 0x2d) {\n      sign = -1;\n      ch = this.nextChar();\n\n      if (ch === /* '-' = */ 0x2d) {\n        // Ignore double negative (this is consistent with Adobe Reader).\n        ch = this.nextChar();\n      }\n    } else if (ch === /* '+' = */ 0x2b) {\n      ch = this.nextChar();\n    }\n    if (ch === /* LF = */ 0x0a || ch === /* CR = */ 0x0d) {\n      // Ignore line-breaks (this is consistent with Adobe Reader).\n      do {\n        ch = this.nextChar();\n      } while (ch === 0x0a || ch === 0x0d);\n    }\n    if (ch === /* '.' = */ 0x2e) {\n      divideBy = 10;\n      ch = this.nextChar();\n    }\n    if (ch < /* '0' = */ 0x30 || ch > /* '9' = */ 0x39) {\n      const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`;\n\n      if (\n        isWhiteSpace(ch) ||\n        /* '(' = */ ch === 0x28 ||\n        /* '<' = */ ch === 0x3c ||\n        ch === /* EOF = */ -1\n      ) {\n        // This is consistent with Adobe Reader (fixes issue9252.pdf,\n        // issue15604.pdf, bug1753983.pdf, bug1953099.pdf).\n        info(`Lexer.getNumber - \"${msg}\".`);\n        return 0;\n      }\n      throw new FormatError(msg);\n    }\n\n    let baseValue = ch - 0x30; // '0'\n\n    while ((ch = this.nextChar()) >= 0) {\n      if (ch >= /* '0' = */ 0x30 && ch <= /* '9' = */ 0x39) {\n        const currentDigit = ch - 0x30; // '0'\n        if (divideBy !== 0) {\n          // We are after a point.\n          divideBy *= 10;\n        }\n        baseValue = baseValue * 10 + currentDigit;\n      } else if (ch === /* '.' = */ 0x2e) {\n        if (divideBy === 0) {\n          divideBy = 1;\n        } else {\n          // A number can have only one dot.\n          break;\n        }\n      } else if (ch === /* '-' = */ 0x2d) {\n        // Ignore minus signs in the middle of numbers to match\n        // Adobe's behavior.\n        warn(\"Badly formatted number: minus sign in the middle\");\n      } else {\n        // The last character doesn't belong to us.\n        break;\n      }\n    }\n\n    if (divideBy !== 0) {\n      baseValue /= divideBy;\n    }\n    return sign * baseValue;\n  }\n\n  getString() {\n    let numParen = 1;\n    let done = false;\n    const strBuf = this.strBuf;\n    strBuf.length = 0;\n\n    let ch = this.nextChar();\n    while (true) {\n      let charBuffered = false;\n      switch (ch | 0) {\n        case -1:\n          warn(\"Unterminated string\");\n          done = true;\n          break;\n        case 0x28: // '('\n          ++numParen;\n          strBuf.push(\"(\");\n          break;\n        case 0x29: // ')'\n          if (--numParen === 0) {\n            this.nextChar(); // consume strings ')'\n            done = true;\n          } else {\n            strBuf.push(\")\");\n          }\n          break;\n        case 0x5c: // '\\\\'\n          ch = this.nextChar();\n          switch (ch) {\n            case -1:\n              warn(\"Unterminated string\");\n              done = true;\n              break;\n            case 0x6e: // 'n'\n              strBuf.push(\"\\n\");\n              break;\n            case 0x72: // 'r'\n              strBuf.push(\"\\r\");\n              break;\n            case 0x74: // 't'\n              strBuf.push(\"\\t\");\n              break;\n            case 0x62: // 'b'\n              strBuf.push(\"\\b\");\n              break;\n            case 0x66: // 'f'\n              strBuf.push(\"\\f\");\n              break;\n            case 0x5c: // '\\'\n            case 0x28: // '('\n            case 0x29: // ')'\n              strBuf.push(String.fromCharCode(ch));\n              break;\n            case 0x30: // '0'\n            case 0x31: // '1'\n            case 0x32: // '2'\n            case 0x33: // '3'\n            case 0x34: // '4'\n            case 0x35: // '5'\n            case 0x36: // '6'\n            case 0x37: // '7'\n              let x = ch & 0x0f;\n              ch = this.nextChar();\n              charBuffered = true;\n              if (ch >= /* '0' = */ 0x30 && ch <= /* '7' = */ 0x37) {\n                x = (x << 3) + (ch & 0x0f);\n                ch = this.nextChar();\n                if (ch >= /* '0' = */ 0x30 && ch /* '7' = */ <= 0x37) {\n                  charBuffered = false;\n                  x = (x << 3) + (ch & 0x0f);\n                }\n              }\n              strBuf.push(String.fromCharCode(x));\n              break;\n            case 0x0d: // CR\n              if (this.peekChar() === /* LF = */ 0x0a) {\n                this.nextChar();\n              }\n              break;\n            case 0x0a: // LF\n              break;\n            default:\n              strBuf.push(String.fromCharCode(ch));\n              break;\n          }\n          break;\n        default:\n          strBuf.push(String.fromCharCode(ch));\n          break;\n      }\n      if (done) {\n        break;\n      }\n      if (!charBuffered) {\n        ch = this.nextChar();\n      }\n    }\n    return strBuf.join(\"\");\n  }\n\n  getName() {\n    let ch, previousCh;\n    const strBuf = this.strBuf;\n    strBuf.length = 0;\n\n    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n      if (ch === /* '#' = */ 0x23) {\n        ch = this.nextChar();\n        if (specialChars[ch]) {\n          warn(\n            \"Lexer_getName: \" +\n              \"NUMBER SIGN (#) should be followed by a hexadecimal number.\"\n          );\n          strBuf.push(\"#\");\n          break;\n        }\n        const x = toHexDigit(ch);\n        if (x !== -1) {\n          previousCh = ch;\n          ch = this.nextChar();\n          const x2 = toHexDigit(ch);\n          if (x2 === -1) {\n            warn(\n              `Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` +\n                \"in hexadecimal number.\"\n            );\n            strBuf.push(\"#\", String.fromCharCode(previousCh));\n            if (specialChars[ch]) {\n              break;\n            }\n            strBuf.push(String.fromCharCode(ch));\n            continue;\n          }\n          strBuf.push(String.fromCharCode((x << 4) | x2));\n        } else {\n          strBuf.push(\"#\", String.fromCharCode(ch));\n        }\n      } else {\n        strBuf.push(String.fromCharCode(ch));\n      }\n    }\n    if (strBuf.length > 127) {\n      warn(`Name token is longer than allowed by the spec: ${strBuf.length}`);\n    }\n    return Name.get(strBuf.join(\"\"));\n  }\n\n  /**\n   * @private\n   */\n  _hexStringWarn(ch) {\n    const MAX_HEX_STRING_NUM_WARN = 5;\n\n    if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) {\n      warn(\"getHexString - ignoring additional invalid characters.\");\n      return;\n    }\n    if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) {\n      // Limit the number of warning messages printed for a `this.getHexString`\n      // invocation, since corrupt PDF documents may otherwise spam the console\n      // enough to affect general performance negatively.\n      return;\n    }\n    warn(`getHexString - ignoring invalid character: ${ch}`);\n  }\n\n  getHexString() {\n    const strBuf = this.strBuf;\n    strBuf.length = 0;\n    let ch = this.currentChar;\n    let firstDigit = -1,\n      digit = -1;\n    this._hexStringNumWarn = 0;\n\n    while (true) {\n      if (ch < 0) {\n        warn(\"Unterminated hex string\");\n        break;\n      } else if (ch === /* '>' = */ 0x3e) {\n        this.nextChar();\n        break;\n      } else if (specialChars[ch] === 1) {\n        ch = this.nextChar();\n        continue;\n      } else {\n        digit = toHexDigit(ch);\n        if (digit === -1) {\n          this._hexStringWarn(ch);\n        } else if (firstDigit === -1) {\n          firstDigit = digit;\n        } else {\n          strBuf.push(String.fromCharCode((firstDigit << 4) | digit));\n          firstDigit = -1;\n        }\n        ch = this.nextChar();\n      }\n    }\n\n    // According to the PDF spec, section \"7.3.4.3 Hexadecimal Strings\":\n    //  \"If the final digit of a hexadecimal string is missing鈥攖hat is, if there\n    //   is an odd number of digits鈥攖he final digit shall be assumed to be 0.\"\n    if (firstDigit !== -1) {\n      strBuf.push(String.fromCharCode(firstDigit << 4));\n    }\n    return strBuf.join(\"\");\n  }\n\n  getObj() {\n    // Skip whitespace and comments.\n    let comment = false;\n    let ch = this.currentChar;\n    while (true) {\n      if (ch < 0) {\n        return EOF;\n      }\n      if (comment) {\n        if (ch === /* LF = */ 0x0a || ch === /* CR = */ 0x0d) {\n          comment = false;\n        }\n      } else if (ch === /* '%' = */ 0x25) {\n        comment = true;\n      } else if (specialChars[ch] !== 1) {\n        break;\n      }\n      ch = this.nextChar();\n    }\n\n    // Start reading a token.\n    switch (ch | 0) {\n      case 0x30: // '0'\n      case 0x31: // '1'\n      case 0x32: // '2'\n      case 0x33: // '3'\n      case 0x34: // '4'\n      case 0x35: // '5'\n      case 0x36: // '6'\n      case 0x37: // '7'\n      case 0x38: // '8'\n      case 0x39: // '9'\n      case 0x2b: // '+'\n      case 0x2d: // '-'\n      case 0x2e: // '.'\n        return this.getNumber();\n      case 0x28: // '('\n        return this.getString();\n      case 0x2f: // '/'\n        return this.getName();\n      // array punctuation\n      case 0x5b: // '['\n        this.nextChar();\n        return Cmd.get(\"[\");\n      case 0x5d: // ']'\n        this.nextChar();\n        return Cmd.get(\"]\");\n      // hex string or dict punctuation\n      case 0x3c: // '<'\n        ch = this.nextChar();\n        if (ch === 0x3c) {\n          // dict punctuation\n          this.nextChar();\n          return Cmd.get(\"<<\");\n        }\n        return this.getHexString();\n      // dict punctuation\n      case 0x3e: // '>'\n        ch = this.nextChar();\n        if (ch === 0x3e) {\n          this.nextChar();\n          return Cmd.get(\">>\");\n        }\n        return Cmd.get(\">\");\n      case 0x7b: // '{'\n        this.nextChar();\n        return Cmd.get(\"{\");\n      case 0x7d: // '}'\n        this.nextChar();\n        return Cmd.get(\"}\");\n      case 0x29: // ')'\n        // Consume the current character in order to avoid permanently hanging\n        // the worker thread if `Lexer.getObj` is called from within a loop\n        // containing try-catch statements, since we would otherwise attempt\n        // to parse the *same* character over and over (fixes issue8061.pdf).\n        this.nextChar();\n        throw new FormatError(`Illegal character: ${ch}`);\n    }\n\n    // Start reading a command.\n    let str = String.fromCharCode(ch);\n    // A valid command cannot start with a non-visible ASCII character,\n    // and the next character may be (the start of) a valid command.\n    if (ch < 0x20 || ch > 0x7f) {\n      const nextCh = this.peekChar();\n      if (nextCh >= 0x20 && nextCh <= 0x7f) {\n        this.nextChar();\n        return Cmd.get(str);\n      }\n    }\n    const knownCommands = this.knownCommands;\n    let knownCommandFound = knownCommands?.[str] !== undefined;\n    while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n      // Stop if a known command is found and next character does not make\n      // the string a command.\n      const possibleCommand = str + String.fromCharCode(ch);\n      if (knownCommandFound && knownCommands[possibleCommand] === undefined) {\n        break;\n      }\n      if (str.length === 128) {\n        throw new FormatError(`Command token too long: ${str.length}`);\n      }\n      str = possibleCommand;\n      knownCommandFound = knownCommands?.[str] !== undefined;\n    }\n    if (str === \"true\") {\n      return true;\n    }\n    if (str === \"false\") {\n      return false;\n    }\n    if (str === \"null\") {\n      return null;\n    }\n\n    if (str === \"BI\") {\n      // Keep track of the current stream position, since it's needed in order\n      // to correctly cache inline images; see `Parser.makeInlineImage`.\n      this.beginInlineImagePos = this.stream.pos;\n    }\n\n    return Cmd.get(str);\n  }\n\n  skipToNextLine() {\n    let ch = this.currentChar;\n    while (ch >= 0) {\n      if (ch === /* CR = */ 0x0d) {\n        ch = this.nextChar();\n        if (ch === /* LF = */ 0x0a) {\n          this.nextChar();\n        }\n        break;\n      } else if (ch === /* LF = */ 0x0a) {\n        this.nextChar();\n        break;\n      }\n      ch = this.nextChar();\n    }\n  }\n}\n\nclass Linearization {\n  static create(stream) {\n    function getInt(linDict, name, allowZeroValue = false) {\n      const obj = linDict.get(name);\n      if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {\n        return obj;\n      }\n      throw new Error(\n        `The \"${name}\" parameter in the linearization ` +\n          \"dictionary is invalid.\"\n      );\n    }\n\n    function getHints(linDict) {\n      const hints = linDict.get(\"H\");\n      let hintsLength;\n\n      if (\n        Array.isArray(hints) &&\n        ((hintsLength = hints.length) === 2 || hintsLength === 4)\n      ) {\n        for (let index = 0; index < hintsLength; index++) {\n          const hint = hints[index];\n          if (!(Number.isInteger(hint) && hint > 0)) {\n            throw new Error(\n              `Hint (${index}) in the linearization dictionary is invalid.`\n            );\n          }\n        }\n        return hints;\n      }\n      throw new Error(\"Hint array in the linearization dictionary is invalid.\");\n    }\n\n    const parser = new Parser({\n      lexer: new Lexer(stream),\n      xref: null,\n    });\n    const obj1 = parser.getObj();\n    const obj2 = parser.getObj();\n    const obj3 = parser.getObj();\n    const linDict = parser.getObj();\n    let obj, length;\n    if (\n      !(\n        Number.isInteger(obj1) &&\n        Number.isInteger(obj2) &&\n        isCmd(obj3, \"obj\") &&\n        linDict instanceof Dict &&\n        typeof (obj = linDict.get(\"Linearized\")) === \"number\" &&\n        obj > 0\n      )\n    ) {\n      return null; // No valid linearization dictionary found.\n    } else if ((length = getInt(linDict, \"L\")) !== stream.length) {\n      throw new Error(\n        'The \"L\" parameter in the linearization dictionary ' +\n          \"does not equal the stream length.\"\n      );\n    }\n    return {\n      length,\n      hints: getHints(linDict),\n      objectNumberFirst: getInt(linDict, \"O\"),\n      endFirst: getInt(linDict, \"E\"),\n      numPages: getInt(linDict, \"N\"),\n      mainXRefEntriesOffset: getInt(linDict, \"T\"),\n      pageFirst: linDict.has(\"P\")\n        ? getInt(linDict, \"P\", /* allowZeroValue = */ true)\n        : 0,\n    };\n  }\n}\n\nexport { Lexer, Linearization, Parser };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Cmd, EOF, isCmd, Name } from \"./primitives.js\";\nimport { FormatError, unreachable, warn } from \"../shared/util.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { BinaryCMapReader } from \"./binary_cmap.js\";\nimport { Lexer } from \"./parser.js\";\nimport { MissingDataException } from \"./core_utils.js\";\nimport { Stream } from \"./stream.js\";\n\nconst BUILT_IN_CMAPS = [\n  // << Start unicode maps.\n  \"Adobe-GB1-UCS2\",\n  \"Adobe-CNS1-UCS2\",\n  \"Adobe-Japan1-UCS2\",\n  \"Adobe-Korea1-UCS2\",\n  // >> End unicode maps.\n  \"78-EUC-H\",\n  \"78-EUC-V\",\n  \"78-H\",\n  \"78-RKSJ-H\",\n  \"78-RKSJ-V\",\n  \"78-V\",\n  \"78ms-RKSJ-H\",\n  \"78ms-RKSJ-V\",\n  \"83pv-RKSJ-H\",\n  \"90ms-RKSJ-H\",\n  \"90ms-RKSJ-V\",\n  \"90msp-RKSJ-H\",\n  \"90msp-RKSJ-V\",\n  \"90pv-RKSJ-H\",\n  \"90pv-RKSJ-V\",\n  \"Add-H\",\n  \"Add-RKSJ-H\",\n  \"Add-RKSJ-V\",\n  \"Add-V\",\n  \"Adobe-CNS1-0\",\n  \"Adobe-CNS1-1\",\n  \"Adobe-CNS1-2\",\n  \"Adobe-CNS1-3\",\n  \"Adobe-CNS1-4\",\n  \"Adobe-CNS1-5\",\n  \"Adobe-CNS1-6\",\n  \"Adobe-GB1-0\",\n  \"Adobe-GB1-1\",\n  \"Adobe-GB1-2\",\n  \"Adobe-GB1-3\",\n  \"Adobe-GB1-4\",\n  \"Adobe-GB1-5\",\n  \"Adobe-Japan1-0\",\n  \"Adobe-Japan1-1\",\n  \"Adobe-Japan1-2\",\n  \"Adobe-Japan1-3\",\n  \"Adobe-Japan1-4\",\n  \"Adobe-Japan1-5\",\n  \"Adobe-Japan1-6\",\n  \"Adobe-Korea1-0\",\n  \"Adobe-Korea1-1\",\n  \"Adobe-Korea1-2\",\n  \"B5-H\",\n  \"B5-V\",\n  \"B5pc-H\",\n  \"B5pc-V\",\n  \"CNS-EUC-H\",\n  \"CNS-EUC-V\",\n  \"CNS1-H\",\n  \"CNS1-V\",\n  \"CNS2-H\",\n  \"CNS2-V\",\n  \"ETHK-B5-H\",\n  \"ETHK-B5-V\",\n  \"ETen-B5-H\",\n  \"ETen-B5-V\",\n  \"ETenms-B5-H\",\n  \"ETenms-B5-V\",\n  \"EUC-H\",\n  \"EUC-V\",\n  \"Ext-H\",\n  \"Ext-RKSJ-H\",\n  \"Ext-RKSJ-V\",\n  \"Ext-V\",\n  \"GB-EUC-H\",\n  \"GB-EUC-V\",\n  \"GB-H\",\n  \"GB-V\",\n  \"GBK-EUC-H\",\n  \"GBK-EUC-V\",\n  \"GBK2K-H\",\n  \"GBK2K-V\",\n  \"GBKp-EUC-H\",\n  \"GBKp-EUC-V\",\n  \"GBT-EUC-H\",\n  \"GBT-EUC-V\",\n  \"GBT-H\",\n  \"GBT-V\",\n  \"GBTpc-EUC-H\",\n  \"GBTpc-EUC-V\",\n  \"GBpc-EUC-H\",\n  \"GBpc-EUC-V\",\n  \"H\",\n  \"HKdla-B5-H\",\n  \"HKdla-B5-V\",\n  \"HKdlb-B5-H\",\n  \"HKdlb-B5-V\",\n  \"HKgccs-B5-H\",\n  \"HKgccs-B5-V\",\n  \"HKm314-B5-H\",\n  \"HKm314-B5-V\",\n  \"HKm471-B5-H\",\n  \"HKm471-B5-V\",\n  \"HKscs-B5-H\",\n  \"HKscs-B5-V\",\n  \"Hankaku\",\n  \"Hiragana\",\n  \"KSC-EUC-H\",\n  \"KSC-EUC-V\",\n  \"KSC-H\",\n  \"KSC-Johab-H\",\n  \"KSC-Johab-V\",\n  \"KSC-V\",\n  \"KSCms-UHC-H\",\n  \"KSCms-UHC-HW-H\",\n  \"KSCms-UHC-HW-V\",\n  \"KSCms-UHC-V\",\n  \"KSCpc-EUC-H\",\n  \"KSCpc-EUC-V\",\n  \"Katakana\",\n  \"NWP-H\",\n  \"NWP-V\",\n  \"RKSJ-H\",\n  \"RKSJ-V\",\n  \"Roman\",\n  \"UniCNS-UCS2-H\",\n  \"UniCNS-UCS2-V\",\n  \"UniCNS-UTF16-H\",\n  \"UniCNS-UTF16-V\",\n  \"UniCNS-UTF32-H\",\n  \"UniCNS-UTF32-V\",\n  \"UniCNS-UTF8-H\",\n  \"UniCNS-UTF8-V\",\n  \"UniGB-UCS2-H\",\n  \"UniGB-UCS2-V\",\n  \"UniGB-UTF16-H\",\n  \"UniGB-UTF16-V\",\n  \"UniGB-UTF32-H\",\n  \"UniGB-UTF32-V\",\n  \"UniGB-UTF8-H\",\n  \"UniGB-UTF8-V\",\n  \"UniJIS-UCS2-H\",\n  \"UniJIS-UCS2-HW-H\",\n  \"UniJIS-UCS2-HW-V\",\n  \"UniJIS-UCS2-V\",\n  \"UniJIS-UTF16-H\",\n  \"UniJIS-UTF16-V\",\n  \"UniJIS-UTF32-H\",\n  \"UniJIS-UTF32-V\",\n  \"UniJIS-UTF8-H\",\n  \"UniJIS-UTF8-V\",\n  \"UniJIS2004-UTF16-H\",\n  \"UniJIS2004-UTF16-V\",\n  \"UniJIS2004-UTF32-H\",\n  \"UniJIS2004-UTF32-V\",\n  \"UniJIS2004-UTF8-H\",\n  \"UniJIS2004-UTF8-V\",\n  \"UniJISPro-UCS2-HW-V\",\n  \"UniJISPro-UCS2-V\",\n  \"UniJISPro-UTF8-V\",\n  \"UniJISX0213-UTF32-H\",\n  \"UniJISX0213-UTF32-V\",\n  \"UniJISX02132004-UTF32-H\",\n  \"UniJISX02132004-UTF32-V\",\n  \"UniKS-UCS2-H\",\n  \"UniKS-UCS2-V\",\n  \"UniKS-UTF16-H\",\n  \"UniKS-UTF16-V\",\n  \"UniKS-UTF32-H\",\n  \"UniKS-UTF32-V\",\n  \"UniKS-UTF8-H\",\n  \"UniKS-UTF8-V\",\n  \"V\",\n  \"WP-Symbol\",\n];\n\n// Heuristic to avoid hanging the worker-thread for CMap data with ridiculously\n// large ranges, such as e.g. 0xFFFFFFFF (fixes issue11922_reduced.pdf).\nconst MAX_MAP_RANGE = 2 ** 24 - 1; // = 0xFFFFFF\n\n// CMap, not to be confused with TrueType's cmap.\nclass CMap {\n  constructor(builtInCMap = false) {\n    // Codespace ranges are stored as follows:\n    // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]]\n    // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...]\n    this.codespaceRanges = [[], [], [], []];\n    this.numCodespaceRanges = 0;\n    // Map entries have one of two forms.\n    // - cid chars are 16-bit unsigned integers, stored as integers.\n    // - bf chars are variable-length byte sequences, stored as strings, with\n    //   one byte per character.\n    this._map = [];\n    this.name = \"\";\n    this.vertical = false;\n    this.useCMap = null;\n    this.builtInCMap = builtInCMap;\n  }\n\n  addCodespaceRange(n, low, high) {\n    this.codespaceRanges[n - 1].push(low, high);\n    this.numCodespaceRanges++;\n  }\n\n  mapCidRange(low, high, dstLow) {\n    if (high - low > MAX_MAP_RANGE) {\n      throw new Error(\"mapCidRange - ignoring data above MAX_MAP_RANGE.\");\n    }\n    while (low <= high) {\n      this._map[low++] = dstLow++;\n    }\n  }\n\n  mapBfRange(low, high, dstLow) {\n    if (high - low > MAX_MAP_RANGE) {\n      throw new Error(\"mapBfRange - ignoring data above MAX_MAP_RANGE.\");\n    }\n    const lastByte = dstLow.length - 1;\n    while (low <= high) {\n      this._map[low++] = dstLow;\n      // Only the last byte has to be incremented (in the normal case).\n      const nextCharCode = dstLow.charCodeAt(lastByte) + 1;\n      if (nextCharCode > 0xff) {\n        dstLow =\n          dstLow.substring(0, lastByte - 1) +\n          String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) +\n          \"\\x00\";\n        continue;\n      }\n      dstLow =\n        dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode);\n    }\n  }\n\n  mapBfRangeToArray(low, high, array) {\n    if (high - low > MAX_MAP_RANGE) {\n      throw new Error(\"mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.\");\n    }\n    const ii = array.length;\n    let i = 0;\n    while (low <= high && i < ii) {\n      this._map[low] = array[i++];\n      ++low;\n    }\n  }\n\n  // This is used for both bf and cid chars.\n  mapOne(src, dst) {\n    this._map[src] = dst;\n  }\n\n  lookup(code) {\n    return this._map[code];\n  }\n\n  contains(code) {\n    return this._map[code] !== undefined;\n  }\n\n  forEach(callback) {\n    // Most maps have fewer than 65536 entries, and for those we use normal\n    // array iteration. But really sparse tables are possible -- e.g. with\n    // indices in the *billions*. For such tables we use for..in, which isn't\n    // ideal because it stringifies the indices for all present elements, but\n    // it does avoid iterating over every undefined entry.\n    const map = this._map;\n    const length = map.length;\n    if (length <= 0x10000) {\n      for (let i = 0; i < length; i++) {\n        if (map[i] !== undefined) {\n          callback(i, map[i]);\n        }\n      }\n    } else {\n      for (const i in map) {\n        callback(i, map[i]);\n      }\n    }\n  }\n\n  charCodeOf(value) {\n    // `Array.prototype.indexOf` is *extremely* inefficient for arrays which\n    // are both very sparse and very large (see issue8372.pdf).\n    const map = this._map;\n    if (map.length <= 0x10000) {\n      return map.indexOf(value);\n    }\n    for (const charCode in map) {\n      if (map[charCode] === value) {\n        return charCode | 0;\n      }\n    }\n    return -1;\n  }\n\n  getMap() {\n    return this._map;\n  }\n\n  readCharCode(str, offset, out) {\n    let c = 0;\n    const codespaceRanges = this.codespaceRanges;\n    // 9.7.6.2 CMap Mapping\n    // The code length is at most 4.\n    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {\n      c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0;\n      // Check each codespace range to see if it falls within.\n      const codespaceRange = codespaceRanges[n];\n      for (let k = 0, kk = codespaceRange.length; k < kk; ) {\n        const low = codespaceRange[k++];\n        const high = codespaceRange[k++];\n        if (c >= low && c <= high) {\n          out.charcode = c;\n          out.length = n + 1;\n          return;\n        }\n      }\n    }\n    out.charcode = 0;\n    out.length = 1;\n  }\n\n  getCharCodeLength(charCode) {\n    const codespaceRanges = this.codespaceRanges;\n    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {\n      // Check each codespace range to see if it falls within.\n      const codespaceRange = codespaceRanges[n];\n      for (let k = 0, kk = codespaceRange.length; k < kk; ) {\n        const low = codespaceRange[k++];\n        const high = codespaceRange[k++];\n        if (charCode >= low && charCode <= high) {\n          return n + 1;\n        }\n      }\n    }\n    return 1;\n  }\n\n  get length() {\n    return this._map.length;\n  }\n\n  get isIdentityCMap() {\n    if (!(this.name === \"Identity-H\" || this.name === \"Identity-V\")) {\n      return false;\n    }\n    if (this._map.length !== 0x10000) {\n      return false;\n    }\n    for (let i = 0; i < 0x10000; i++) {\n      if (this._map[i] !== i) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\n// A special case of CMap, where the _map array implicitly has a length of\n// 65536 and each element is equal to its index.\nclass IdentityCMap extends CMap {\n  constructor(vertical, n) {\n    super();\n\n    this.vertical = vertical;\n    this.addCodespaceRange(n, 0, 0xffff);\n  }\n\n  mapCidRange(low, high, dstLow) {\n    unreachable(\"should not call mapCidRange\");\n  }\n\n  mapBfRange(low, high, dstLow) {\n    unreachable(\"should not call mapBfRange\");\n  }\n\n  mapBfRangeToArray(low, high, array) {\n    unreachable(\"should not call mapBfRangeToArray\");\n  }\n\n  mapOne(src, dst) {\n    unreachable(\"should not call mapCidOne\");\n  }\n\n  lookup(code) {\n    return Number.isInteger(code) && code <= 0xffff ? code : undefined;\n  }\n\n  contains(code) {\n    return Number.isInteger(code) && code <= 0xffff;\n  }\n\n  forEach(callback) {\n    for (let i = 0; i <= 0xffff; i++) {\n      callback(i, i);\n    }\n  }\n\n  charCodeOf(value) {\n    return Number.isInteger(value) && value <= 0xffff ? value : -1;\n  }\n\n  getMap() {\n    // Sometimes identity maps must be instantiated, but it's rare.\n    const map = new Array(0x10000);\n    for (let i = 0; i <= 0xffff; i++) {\n      map[i] = i;\n    }\n    return map;\n  }\n\n  get length() {\n    return 0x10000;\n  }\n\n  // eslint-disable-next-line getter-return\n  get isIdentityCMap() {\n    unreachable(\"should not access .isIdentityCMap\");\n  }\n}\n\nfunction strToInt(str) {\n  let a = 0;\n  for (let i = 0; i < str.length; i++) {\n    a = (a << 8) | str.charCodeAt(i);\n  }\n  return a >>> 0;\n}\n\nfunction expectString(obj) {\n  if (typeof obj !== \"string\") {\n    throw new FormatError(\"Malformed CMap: expected string.\");\n  }\n}\n\nfunction expectInt(obj) {\n  if (!Number.isInteger(obj)) {\n    throw new FormatError(\"Malformed CMap: expected int.\");\n  }\n}\n\nfunction parseBfChar(cMap, lexer) {\n  while (true) {\n    let obj = lexer.getObj();\n    if (obj === EOF) {\n      break;\n    }\n    if (isCmd(obj, \"endbfchar\")) {\n      return;\n    }\n    expectString(obj);\n    const src = strToInt(obj);\n    obj = lexer.getObj();\n    // TODO are /dstName used?\n    expectString(obj);\n    const dst = obj;\n    cMap.mapOne(src, dst);\n  }\n}\n\nfunction parseBfRange(cMap, lexer) {\n  while (true) {\n    let obj = lexer.getObj();\n    if (obj === EOF) {\n      break;\n    }\n    if (isCmd(obj, \"endbfrange\")) {\n      return;\n    }\n    expectString(obj);\n    const low = strToInt(obj);\n    obj = lexer.getObj();\n    expectString(obj);\n    const high = strToInt(obj);\n    obj = lexer.getObj();\n    if (Number.isInteger(obj) || typeof obj === \"string\") {\n      const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;\n      cMap.mapBfRange(low, high, dstLow);\n    } else if (isCmd(obj, \"[\")) {\n      obj = lexer.getObj();\n      const array = [];\n      while (!isCmd(obj, \"]\") && obj !== EOF) {\n        array.push(obj);\n        obj = lexer.getObj();\n      }\n      cMap.mapBfRangeToArray(low, high, array);\n    } else {\n      break;\n    }\n  }\n  throw new FormatError(\"Invalid bf range.\");\n}\n\nfunction parseCidChar(cMap, lexer) {\n  while (true) {\n    let obj = lexer.getObj();\n    if (obj === EOF) {\n      break;\n    }\n    if (isCmd(obj, \"endcidchar\")) {\n      return;\n    }\n    expectString(obj);\n    const src = strToInt(obj);\n    obj = lexer.getObj();\n    expectInt(obj);\n    const dst = obj;\n    cMap.mapOne(src, dst);\n  }\n}\n\nfunction parseCidRange(cMap, lexer) {\n  while (true) {\n    let obj = lexer.getObj();\n    if (obj === EOF) {\n      break;\n    }\n    if (isCmd(obj, \"endcidrange\")) {\n      return;\n    }\n    expectString(obj);\n    const low = strToInt(obj);\n    obj = lexer.getObj();\n    expectString(obj);\n    const high = strToInt(obj);\n    obj = lexer.getObj();\n    expectInt(obj);\n    const dstLow = obj;\n    cMap.mapCidRange(low, high, dstLow);\n  }\n}\n\nfunction parseCodespaceRange(cMap, lexer) {\n  while (true) {\n    let obj = lexer.getObj();\n    if (obj === EOF) {\n      break;\n    }\n    if (isCmd(obj, \"endcodespacerange\")) {\n      return;\n    }\n    if (typeof obj !== \"string\") {\n      break;\n    }\n    const low = strToInt(obj);\n    obj = lexer.getObj();\n    if (typeof obj !== \"string\") {\n      break;\n    }\n    const high = strToInt(obj);\n    cMap.addCodespaceRange(obj.length, low, high);\n  }\n  throw new FormatError(\"Invalid codespace range.\");\n}\n\nfunction parseWMode(cMap, lexer) {\n  const obj = lexer.getObj();\n  if (Number.isInteger(obj)) {\n    cMap.vertical = !!obj;\n  }\n}\n\nfunction parseCMapName(cMap, lexer) {\n  const obj = lexer.getObj();\n  if (obj instanceof Name) {\n    cMap.name = obj.name;\n  }\n}\n\nasync function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {\n  let previous, embeddedUseCMap;\n  objLoop: while (true) {\n    try {\n      const obj = lexer.getObj();\n      if (obj === EOF) {\n        break;\n      } else if (obj instanceof Name) {\n        if (obj.name === \"WMode\") {\n          parseWMode(cMap, lexer);\n        } else if (obj.name === \"CMapName\") {\n          parseCMapName(cMap, lexer);\n        }\n        previous = obj;\n      } else if (obj instanceof Cmd) {\n        switch (obj.cmd) {\n          case \"endcmap\":\n            break objLoop;\n          case \"usecmap\":\n            if (previous instanceof Name) {\n              embeddedUseCMap = previous.name;\n            }\n            break;\n          case \"begincodespacerange\":\n            parseCodespaceRange(cMap, lexer);\n            break;\n          case \"beginbfchar\":\n            parseBfChar(cMap, lexer);\n            break;\n          case \"begincidchar\":\n            parseCidChar(cMap, lexer);\n            break;\n          case \"beginbfrange\":\n            parseBfRange(cMap, lexer);\n            break;\n          case \"begincidrange\":\n            parseCidRange(cMap, lexer);\n            break;\n        }\n      }\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(\"Invalid cMap data: \" + ex);\n      continue;\n    }\n  }\n\n  if (!useCMap && embeddedUseCMap) {\n    // Load the useCMap definition from the file only if there wasn't one\n    // specified.\n    useCMap = embeddedUseCMap;\n  }\n  if (useCMap) {\n    return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n  }\n  return cMap;\n}\n\nasync function extendCMap(cMap, fetchBuiltInCMap, useCMap) {\n  cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap);\n  // If there aren't any code space ranges defined clone all the parent ones\n  // into this cMap.\n  if (cMap.numCodespaceRanges === 0) {\n    const useCodespaceRanges = cMap.useCMap.codespaceRanges;\n    for (let i = 0; i < useCodespaceRanges.length; i++) {\n      cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();\n    }\n    cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;\n  }\n  // Merge the map into the current one, making sure not to override\n  // any previously defined entries.\n  cMap.useCMap.forEach(function (key, value) {\n    if (!cMap.contains(key)) {\n      cMap.mapOne(key, value);\n    }\n  });\n\n  return cMap;\n}\n\nasync function createBuiltInCMap(name, fetchBuiltInCMap) {\n  if (name === \"Identity-H\") {\n    return new IdentityCMap(false, 2);\n  } else if (name === \"Identity-V\") {\n    return new IdentityCMap(true, 2);\n  }\n  if (!BUILT_IN_CMAPS.includes(name)) {\n    throw new Error(\"Unknown CMap name: \" + name);\n  }\n  if (!fetchBuiltInCMap) {\n    throw new Error(\"Built-in CMap parameters are not provided.\");\n  }\n\n  const { cMapData, isCompressed } = await fetchBuiltInCMap(name);\n  const cMap = new CMap(true);\n\n  if (isCompressed) {\n    return new BinaryCMapReader().process(cMapData, cMap, useCMap =>\n      extendCMap(cMap, fetchBuiltInCMap, useCMap)\n    );\n  }\n  const lexer = new Lexer(new Stream(cMapData));\n  return parseCMap(cMap, lexer, fetchBuiltInCMap, null);\n}\n\nclass CMapFactory {\n  static async create({ encoding, fetchBuiltInCMap, useCMap }) {\n    if (encoding instanceof Name) {\n      return createBuiltInCMap(encoding.name, fetchBuiltInCMap);\n    } else if (encoding instanceof BaseStream) {\n      if (encoding.isAsync) {\n        const bytes = await encoding.asyncGetBytes();\n        if (bytes) {\n          encoding = new Stream(bytes, 0, bytes.length, encoding.dict);\n        }\n      }\n      const parsedCMap = await parseCMap(\n        /* cMap = */ new CMap(),\n        /* lexer = */ new Lexer(encoding),\n        fetchBuiltInCMap,\n        useCMap\n      );\n\n      if (parsedCMap.isIdentityCMap) {\n        return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);\n      }\n      return parsedCMap;\n    }\n    throw new Error(\"Encoding required.\");\n  }\n}\n\nexport { CMap, CMapFactory, IdentityCMap };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass CSS_FONT_INFO {\n  static strings = [\"fontFamily\", \"fontWeight\", \"italicAngle\"];\n}\n\nclass SYSTEM_FONT_INFO {\n  static strings = [\"css\", \"loadedName\", \"baseFontName\", \"src\"];\n}\n\nclass FONT_INFO {\n  static bools = [\n    \"black\",\n    \"bold\",\n    \"disableFontFace\",\n    \"fontExtraProperties\",\n    \"isInvalidPDFjsFont\",\n    \"isType3Font\",\n    \"italic\",\n    \"missingFile\",\n    \"remeasure\",\n    \"vertical\",\n  ];\n\n  static numbers = [\"ascent\", \"defaultWidth\", \"descent\"];\n\n  static strings = [\"fallbackName\", \"loadedName\", \"mimetype\", \"name\"];\n\n  static OFFSET_NUMBERS = Math.ceil((this.bools.length * 2) / 8);\n\n  static OFFSET_BBOX = this.OFFSET_NUMBERS + this.numbers.length * 8;\n\n  static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4;\n\n  static OFFSET_DEFAULT_VMETRICS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6;\n\n  static OFFSET_STRINGS = this.OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3;\n}\n\nclass PATTERN_INFO {\n  static KIND = 0; // 1=axial, 2=radial, 3=mesh\n\n  static HAS_BBOX = 1; // 0/1\n\n  static HAS_BACKGROUND = 2; // 0/1 (background for mesh patterns)\n\n  static SHADING_TYPE = 3; // shadingType (only for mesh patterns)\n\n  static N_COORD = 4; // number of coordinate pairs\n\n  static N_COLOR = 8; // number of RGBA-stride color entries\n\n  static N_STOP = 12; // number of gradient stops\n\n  static N_FIGURES = 16; // number of figures\n}\n\nexport { CSS_FONT_INFO, FONT_INFO, PATTERN_INFO, SYSTEM_FONT_INFO };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, FeatureTest } from \"../shared/util.js\";\nimport {\n  CSS_FONT_INFO,\n  FONT_INFO,\n  PATTERN_INFO,\n  SYSTEM_FONT_INFO,\n} from \"../shared/obj_bin_transform_utils.js\";\n\nfunction compileCssFontInfo(info) {\n  const encoder = new TextEncoder();\n  const encodedStrings = {};\n  let stringsLength = 0;\n  for (const prop of CSS_FONT_INFO.strings) {\n    const encoded = encoder.encode(info[prop]);\n    encodedStrings[prop] = encoded;\n    stringsLength += 4 + encoded.length;\n  }\n\n  const buffer = new ArrayBuffer(stringsLength);\n  const data = new Uint8Array(buffer);\n  const view = new DataView(buffer);\n  let offset = 0;\n\n  for (const prop of CSS_FONT_INFO.strings) {\n    const encoded = encodedStrings[prop];\n    const length = encoded.length;\n    view.setUint32(offset, length);\n    data.set(encoded, offset + 4);\n    offset += 4 + length;\n  }\n  assert(offset === buffer.byteLength, \"compileCssFontInfo: Buffer overflow\");\n  return buffer;\n}\n\nfunction compileSystemFontInfo(info) {\n  const encoder = new TextEncoder();\n  const encodedStrings = {};\n  let stringsLength = 0;\n  for (const prop of SYSTEM_FONT_INFO.strings) {\n    const encoded = encoder.encode(info[prop]);\n    encodedStrings[prop] = encoded;\n    stringsLength += 4 + encoded.length;\n  }\n  stringsLength += 4;\n  let encodedStyleStyle,\n    encodedStyleWeight,\n    lengthEstimate = 1 + stringsLength;\n  if (info.style) {\n    encodedStyleStyle = encoder.encode(info.style.style);\n    encodedStyleWeight = encoder.encode(info.style.weight);\n    lengthEstimate +=\n      4 + encodedStyleStyle.length + 4 + encodedStyleWeight.length;\n  }\n\n  const buffer = new ArrayBuffer(lengthEstimate);\n  const data = new Uint8Array(buffer);\n  const view = new DataView(buffer);\n  let offset = 0;\n\n  view.setUint8(offset++, info.guessFallback ? 1 : 0);\n  view.setUint32(offset, 0);\n  offset += 4;\n  stringsLength = 0;\n  for (const prop of SYSTEM_FONT_INFO.strings) {\n    const encoded = encodedStrings[prop];\n    const length = encoded.length;\n    stringsLength += 4 + length;\n    view.setUint32(offset, length);\n    data.set(encoded, offset + 4);\n    offset += 4 + length;\n  }\n  view.setUint32(offset - stringsLength - 4, stringsLength);\n\n  if (info.style) {\n    view.setUint32(offset, encodedStyleStyle.length);\n    data.set(encodedStyleStyle, offset + 4);\n    offset += 4 + encodedStyleStyle.length;\n    view.setUint32(offset, encodedStyleWeight.length);\n    data.set(encodedStyleWeight, offset + 4);\n    offset += 4 + encodedStyleWeight.length;\n  }\n  assert(offset <= buffer.byteLength, \"compileSystemFontInfo: Buffer overflow\");\n  return buffer.transferToFixedLength(offset);\n}\n\nfunction compileFontInfo(font) {\n  const systemFontInfoBuffer = font.systemFontInfo\n    ? compileSystemFontInfo(font.systemFontInfo)\n    : null;\n  const cssFontInfoBuffer = font.cssFontInfo\n    ? compileCssFontInfo(font.cssFontInfo)\n    : null;\n\n  const encoder = new TextEncoder();\n  const encodedStrings = {};\n  let stringsLength = 0;\n  for (const prop of FONT_INFO.strings) {\n    encodedStrings[prop] = encoder.encode(font[prop]);\n    stringsLength += 4 + encodedStrings[prop].length;\n  }\n\n  const lengthEstimate =\n    FONT_INFO.OFFSET_STRINGS +\n    4 +\n    stringsLength +\n    4 +\n    (systemFontInfoBuffer?.byteLength ?? 0) +\n    4 +\n    (cssFontInfoBuffer?.byteLength ?? 0) +\n    4 +\n    (font.data?.length ?? 0);\n\n  const buffer = new ArrayBuffer(lengthEstimate);\n  const data = new Uint8Array(buffer);\n  const view = new DataView(buffer);\n  let offset = 0;\n\n  const numBools = FONT_INFO.bools.length;\n  let boolByte = 0,\n    boolBit = 0;\n  for (let i = 0; i < numBools; i++) {\n    const value = font[FONT_INFO.bools[i]];\n    // eslint-disable-next-line no-nested-ternary\n    const bits = value === undefined ? 0x00 : value ? 0x02 : 0x01;\n    boolByte |= bits << boolBit;\n    boolBit += 2;\n    if (boolBit === 8 || i === numBools - 1) {\n      view.setUint8(offset++, boolByte);\n      boolByte = 0;\n      boolBit = 0;\n    }\n  }\n  assert(\n    offset === FONT_INFO.OFFSET_NUMBERS,\n    \"compileFontInfo: Boolean properties offset mismatch\"\n  );\n\n  for (const prop of FONT_INFO.numbers) {\n    view.setFloat64(offset, font[prop]);\n    offset += 8;\n  }\n  assert(\n    offset === FONT_INFO.OFFSET_BBOX,\n    \"compileFontInfo: Number properties offset mismatch\"\n  );\n\n  if (font.bbox) {\n    view.setUint8(offset++, 4);\n    for (const coord of font.bbox) {\n      view.setInt16(offset, coord, true);\n      offset += 2;\n    }\n  } else {\n    view.setUint8(offset++, 0);\n    offset += 2 * 4; // TODO: optimize this padding away\n  }\n  assert(\n    offset === FONT_INFO.OFFSET_FONT_MATRIX,\n    \"compileFontInfo: BBox properties offset mismatch\"\n  );\n\n  if (font.fontMatrix) {\n    view.setUint8(offset++, 6);\n    for (const point of font.fontMatrix) {\n      view.setFloat64(offset, point, true);\n      offset += 8;\n    }\n  } else {\n    view.setUint8(offset++, 0);\n    offset += 8 * 6; // TODO: optimize this padding away\n  }\n  assert(\n    offset === FONT_INFO.OFFSET_DEFAULT_VMETRICS,\n    \"compileFontInfo: FontMatrix properties offset mismatch\"\n  );\n\n  if (font.defaultVMetrics) {\n    view.setUint8(offset++, 3);\n    for (const metric of font.defaultVMetrics) {\n      view.setInt16(offset, metric, true);\n      offset += 2;\n    }\n  } else {\n    view.setUint8(offset++, 0);\n    offset += 3 * 2; // TODO: optimize this padding away\n  }\n  assert(\n    offset === FONT_INFO.OFFSET_STRINGS,\n    \"compileFontInfo: DefaultVMetrics properties offset mismatch\"\n  );\n\n  view.setUint32(FONT_INFO.OFFSET_STRINGS, 0);\n  offset += 4;\n  for (const prop of FONT_INFO.strings) {\n    const encoded = encodedStrings[prop];\n    const length = encoded.length;\n    view.setUint32(offset, length);\n    data.set(encoded, offset + 4);\n    offset += 4 + length;\n  }\n  view.setUint32(\n    FONT_INFO.OFFSET_STRINGS,\n    offset - FONT_INFO.OFFSET_STRINGS - 4\n  );\n\n  if (!systemFontInfoBuffer) {\n    view.setUint32(offset, 0);\n    offset += 4;\n  } else {\n    const length = systemFontInfoBuffer.byteLength;\n    view.setUint32(offset, length);\n    assert(\n      offset + 4 + length <= buffer.byteLength,\n      \"compileFontInfo: Buffer overflow at systemFontInfo\"\n    );\n    data.set(new Uint8Array(systemFontInfoBuffer), offset + 4);\n    offset += 4 + length;\n  }\n\n  if (!cssFontInfoBuffer) {\n    view.setUint32(offset, 0);\n    offset += 4;\n  } else {\n    const length = cssFontInfoBuffer.byteLength;\n    view.setUint32(offset, length);\n    assert(\n      offset + 4 + length <= buffer.byteLength,\n      \"compileFontInfo: Buffer overflow at cssFontInfo\"\n    );\n    data.set(new Uint8Array(cssFontInfoBuffer), offset + 4);\n    offset += 4 + length;\n  }\n\n  if (font.data === undefined) {\n    view.setUint32(offset, 0);\n    offset += 4;\n  } else {\n    view.setUint32(offset, font.data.length);\n    data.set(font.data, offset + 4);\n    offset += 4 + font.data.length;\n  }\n\n  assert(offset <= buffer.byteLength, \"compileFontInfo: Buffer overflow\");\n  return buffer.transferToFixedLength(offset);\n}\n\nfunction compilePatternInfo(ir) {\n  let kind,\n    bbox = null,\n    coords = [],\n    colors = [],\n    colorStops = [],\n    shadingType = null, // only needed for mesh patterns\n    background = null; // background for mesh patterns\n\n  switch (ir[0]) {\n    case \"RadialAxial\":\n      kind = ir[1] === \"axial\" ? 1 : 2;\n      bbox = ir[2];\n      colorStops = ir[3];\n      if (kind === 1) {\n        coords.push(...ir[4], ...ir[5]);\n      } else {\n        coords.push(ir[4][0], ir[4][1], ir[6], ir[5][0], ir[5][1], ir[7]);\n      }\n      break;\n    case \"Mesh\":\n      kind = 3;\n      shadingType = ir[1];\n      coords = ir[2];\n      colors = ir[3];\n      bbox = ir[6];\n      background = ir[7];\n      break;\n    default:\n      throw new Error(`Unsupported pattern type: ${ir[0]}`);\n  }\n\n  const nCoord = Math.floor(coords.length / 2);\n  const nColor = Math.floor(colors.length / 4);\n  const nStop = colorStops.length;\n\n  const byteLen =\n    20 +\n    nCoord * 8 +\n    nColor * 4 +\n    nStop * 8 +\n    (bbox ? 16 : 0) +\n    (background ? 3 : 0);\n  const buffer = new ArrayBuffer(byteLen);\n  const dataView = new DataView(buffer);\n  const u8data = new Uint8Array(buffer);\n\n  dataView.setUint8(PATTERN_INFO.KIND, kind);\n  dataView.setUint8(PATTERN_INFO.HAS_BBOX, bbox ? 1 : 0);\n  dataView.setUint8(PATTERN_INFO.HAS_BACKGROUND, background ? 1 : 0);\n  dataView.setUint8(PATTERN_INFO.SHADING_TYPE, shadingType); // Only for mesh pattern, null otherwise\n  dataView.setUint32(PATTERN_INFO.N_COORD, nCoord, true);\n  dataView.setUint32(PATTERN_INFO.N_COLOR, nColor, true);\n  dataView.setUint32(PATTERN_INFO.N_STOP, nStop, true);\n  dataView.setUint32(PATTERN_INFO.N_FIGURES, 0, true);\n\n  let offset = 20;\n  const coordsView = new Float32Array(buffer, offset, nCoord * 2);\n  coordsView.set(coords);\n  offset += nCoord * 8;\n\n  u8data.set(colors, offset);\n  offset += nColor * 4;\n\n  for (const [pos, hex] of colorStops) {\n    dataView.setFloat32(offset, pos, true);\n    offset += 4;\n    dataView.setUint32(offset, parseInt(hex.slice(1), 16), true);\n    offset += 4;\n  }\n  if (bbox) {\n    for (const v of bbox) {\n      dataView.setFloat32(offset, v, true);\n      offset += 4;\n    }\n  }\n\n  if (background) {\n    u8data.set(background, offset);\n  }\n  return buffer;\n}\n\nfunction compileFontPathInfo(path) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(\n      FeatureTest.isFloat16ArraySupported\n        ? path instanceof Float16Array\n        : path instanceof Float32Array,\n      \"compileFontPathInfo: Unexpected path format.\"\n    );\n  }\n  return path.slice().buffer;\n}\n\nexport {\n  compileCssFontInfo,\n  compileFontInfo,\n  compileFontPathInfo,\n  compilePatternInfo,\n  compileSystemFontInfo,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// prettier-ignore\nconst ExpertEncoding = [\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"space\", \"exclamsmall\", \"Hungarumlautsmall\", \"\", \"dollaroldstyle\",\n  \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\", \"parenleftsuperior\",\n  \"parenrightsuperior\", \"twodotenleader\", \"onedotenleader\", \"comma\",\n  \"hyphen\", \"period\", \"fraction\", \"zerooldstyle\", \"oneoldstyle\",\n  \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\",\n  \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\", \"colon\",\n  \"semicolon\", \"commasuperior\", \"threequartersemdash\", \"periodsuperior\",\n  \"questionsmall\", \"\", \"asuperior\", \"bsuperior\", \"centsuperior\", \"dsuperior\",\n  \"esuperior\", \"\", \"\", \"\", \"isuperior\", \"\", \"\", \"lsuperior\", \"msuperior\",\n  \"nsuperior\", \"osuperior\", \"\", \"\", \"rsuperior\", \"ssuperior\", \"tsuperior\",\n  \"\", \"ff\", \"fi\", \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\", \"\",\n  \"parenrightinferior\", \"Circumflexsmall\", \"hyphensuperior\", \"Gravesmall\",\n  \"Asmall\", \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\",\n  \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\",\n  \"Osmall\", \"Psmall\", \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\",\n  \"Vsmall\", \"Wsmall\", \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\",\n  \"onefitted\", \"rupiah\", \"Tildesmall\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"exclamdownsmall\", \"centoldstyle\", \"Lslashsmall\",\n  \"\", \"\", \"Scaronsmall\", \"Zcaronsmall\", \"Dieresissmall\", \"Brevesmall\",\n  \"Caronsmall\", \"\", \"Dotaccentsmall\", \"\", \"\", \"Macronsmall\", \"\", \"\",\n  \"figuredash\", \"hypheninferior\", \"\", \"\", \"Ogoneksmall\", \"Ringsmall\",\n  \"Cedillasmall\", \"\", \"\", \"\", \"onequarter\", \"onehalf\", \"threequarters\",\n  \"questiondownsmall\", \"oneeighth\", \"threeeighths\", \"fiveeighths\",\n  \"seveneighths\", \"onethird\", \"twothirds\", \"\", \"\", \"zerosuperior\",\n  \"onesuperior\", \"twosuperior\", \"threesuperior\", \"foursuperior\",\n  \"fivesuperior\", \"sixsuperior\", \"sevensuperior\", \"eightsuperior\",\n  \"ninesuperior\", \"zeroinferior\", \"oneinferior\", \"twoinferior\",\n  \"threeinferior\", \"fourinferior\", \"fiveinferior\", \"sixinferior\",\n  \"seveninferior\", \"eightinferior\", \"nineinferior\", \"centinferior\",\n  \"dollarinferior\", \"periodinferior\", \"commainferior\", \"Agravesmall\",\n  \"Aacutesmall\", \"Acircumflexsmall\", \"Atildesmall\", \"Adieresissmall\",\n  \"Aringsmall\", \"AEsmall\", \"Ccedillasmall\", \"Egravesmall\", \"Eacutesmall\",\n  \"Ecircumflexsmall\", \"Edieresissmall\", \"Igravesmall\", \"Iacutesmall\",\n  \"Icircumflexsmall\", \"Idieresissmall\", \"Ethsmall\", \"Ntildesmall\",\n  \"Ogravesmall\", \"Oacutesmall\", \"Ocircumflexsmall\", \"Otildesmall\",\n  \"Odieresissmall\", \"OEsmall\", \"Oslashsmall\", \"Ugravesmall\", \"Uacutesmall\",\n  \"Ucircumflexsmall\", \"Udieresissmall\", \"Yacutesmall\", \"Thornsmall\",\n  \"Ydieresissmall\"];\n\n// prettier-ignore\nconst MacExpertEncoding = [\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"space\", \"exclamsmall\", \"Hungarumlautsmall\", \"centoldstyle\",\n  \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\",\n  \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\",\n  \"onedotenleader\", \"comma\", \"hyphen\", \"period\", \"fraction\", \"zerooldstyle\",\n  \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\",\n  \"fiveoldstyle\", \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\",\n  \"nineoldstyle\", \"colon\", \"semicolon\", \"\", \"threequartersemdash\", \"\",\n  \"questionsmall\", \"\", \"\", \"\", \"\", \"Ethsmall\", \"\", \"\", \"onequarter\",\n  \"onehalf\", \"threequarters\", \"oneeighth\", \"threeeighths\", \"fiveeighths\",\n  \"seveneighths\", \"onethird\", \"twothirds\", \"\", \"\", \"\", \"\", \"\", \"\", \"ff\",\n  \"fi\", \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\", \"\", \"parenrightinferior\",\n  \"Circumflexsmall\", \"hypheninferior\", \"Gravesmall\", \"Asmall\", \"Bsmall\",\n  \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\", \"Hsmall\", \"Ismall\",\n  \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\", \"Osmall\", \"Psmall\",\n  \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\", \"Vsmall\", \"Wsmall\",\n  \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\", \"onefitted\", \"rupiah\",\n  \"Tildesmall\", \"\", \"\", \"asuperior\", \"centsuperior\", \"\", \"\", \"\", \"\",\n  \"Aacutesmall\", \"Agravesmall\", \"Acircumflexsmall\", \"Adieresissmall\",\n  \"Atildesmall\", \"Aringsmall\", \"Ccedillasmall\", \"Eacutesmall\", \"Egravesmall\",\n  \"Ecircumflexsmall\", \"Edieresissmall\", \"Iacutesmall\", \"Igravesmall\",\n  \"Icircumflexsmall\", \"Idieresissmall\", \"Ntildesmall\", \"Oacutesmall\",\n  \"Ogravesmall\", \"Ocircumflexsmall\", \"Odieresissmall\", \"Otildesmall\",\n  \"Uacutesmall\", \"Ugravesmall\", \"Ucircumflexsmall\", \"Udieresissmall\", \"\",\n  \"eightsuperior\", \"fourinferior\", \"threeinferior\", \"sixinferior\",\n  \"eightinferior\", \"seveninferior\", \"Scaronsmall\", \"\", \"centinferior\",\n  \"twoinferior\", \"\", \"Dieresissmall\", \"\", \"Caronsmall\", \"osuperior\",\n  \"fiveinferior\", \"\", \"commainferior\", \"periodinferior\", \"Yacutesmall\", \"\",\n  \"dollarinferior\", \"\", \"\", \"Thornsmall\", \"\", \"nineinferior\", \"zeroinferior\",\n  \"Zcaronsmall\", \"AEsmall\", \"Oslashsmall\", \"questiondownsmall\",\n  \"oneinferior\", \"Lslashsmall\", \"\", \"\", \"\", \"\", \"\", \"\", \"Cedillasmall\", \"\",\n  \"\", \"\", \"\", \"\", \"OEsmall\", \"figuredash\", \"hyphensuperior\", \"\", \"\", \"\", \"\",\n  \"exclamdownsmall\", \"\", \"Ydieresissmall\", \"\", \"onesuperior\", \"twosuperior\",\n  \"threesuperior\", \"foursuperior\", \"fivesuperior\", \"sixsuperior\",\n  \"sevensuperior\", \"ninesuperior\", \"zerosuperior\", \"\", \"esuperior\",\n  \"rsuperior\", \"tsuperior\", \"\", \"\", \"isuperior\", \"ssuperior\", \"dsuperior\",\n  \"\", \"\", \"\", \"\", \"\", \"lsuperior\", \"Ogoneksmall\", \"Brevesmall\",\n  \"Macronsmall\", \"bsuperior\", \"nsuperior\", \"msuperior\", \"commasuperior\",\n  \"periodsuperior\", \"Dotaccentsmall\", \"Ringsmall\", \"\", \"\", \"\", \"\"];\n\n// prettier-ignore\nconst MacRomanEncoding = [\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\",\n  \"ampersand\", \"quotesingle\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\",\n  \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\",\n  \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\",\n  \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\",\n  \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\",\n  \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\",\n  \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",\n  \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\",\n  \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"\",\n  \"Adieresis\", \"Aring\", \"Ccedilla\", \"Eacute\", \"Ntilde\", \"Odieresis\",\n  \"Udieresis\", \"aacute\", \"agrave\", \"acircumflex\", \"adieresis\", \"atilde\",\n  \"aring\", \"ccedilla\", \"eacute\", \"egrave\", \"ecircumflex\", \"edieresis\",\n  \"iacute\", \"igrave\", \"icircumflex\", \"idieresis\", \"ntilde\", \"oacute\",\n  \"ograve\", \"ocircumflex\", \"odieresis\", \"otilde\", \"uacute\", \"ugrave\",\n  \"ucircumflex\", \"udieresis\", \"dagger\", \"degree\", \"cent\", \"sterling\",\n  \"section\", \"bullet\", \"paragraph\", \"germandbls\", \"registered\", \"copyright\",\n  \"trademark\", \"acute\", \"dieresis\", \"notequal\", \"AE\", \"Oslash\", \"infinity\",\n  \"plusminus\", \"lessequal\", \"greaterequal\", \"yen\", \"mu\", \"partialdiff\",\n  \"summation\", \"product\", \"pi\", \"integral\", \"ordfeminine\", \"ordmasculine\",\n  \"Omega\", \"ae\", \"oslash\", \"questiondown\", \"exclamdown\", \"logicalnot\",\n  \"radical\", \"florin\", \"approxequal\", \"Delta\", \"guillemotleft\",\n  \"guillemotright\", \"ellipsis\", \"space\", \"Agrave\", \"Atilde\", \"Otilde\", \"OE\",\n  \"oe\", \"endash\", \"emdash\", \"quotedblleft\", \"quotedblright\", \"quoteleft\",\n  \"quoteright\", \"divide\", \"lozenge\", \"ydieresis\", \"Ydieresis\", \"fraction\",\n  \"currency\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"daggerdbl\",\n  \"periodcentered\", \"quotesinglbase\", \"quotedblbase\", \"perthousand\",\n  \"Acircumflex\", \"Ecircumflex\", \"Aacute\", \"Edieresis\", \"Egrave\", \"Iacute\",\n  \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Oacute\", \"Ocircumflex\", \"apple\",\n  \"Ograve\", \"Uacute\", \"Ucircumflex\", \"Ugrave\", \"dotlessi\", \"circumflex\",\n  \"tilde\", \"macron\", \"breve\", \"dotaccent\", \"ring\", \"cedilla\", \"hungarumlaut\",\n  \"ogonek\", \"caron\"];\n\n// prettier-ignore\nconst StandardEncoding = [\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\",\n  \"ampersand\", \"quoteright\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\",\n  \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\",\n  \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\",\n  \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\",\n  \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\",\n  \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\",\n  \"asciicircum\", \"underscore\", \"quoteleft\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\",\n  \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\",\n  \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"exclamdown\",\n  \"cent\", \"sterling\", \"fraction\", \"yen\", \"florin\", \"section\", \"currency\",\n  \"quotesingle\", \"quotedblleft\", \"guillemotleft\", \"guilsinglleft\",\n  \"guilsinglright\", \"fi\", \"fl\", \"\", \"endash\", \"dagger\", \"daggerdbl\",\n  \"periodcentered\", \"\", \"paragraph\", \"bullet\", \"quotesinglbase\",\n  \"quotedblbase\", \"quotedblright\", \"guillemotright\", \"ellipsis\",\n  \"perthousand\", \"\", \"questiondown\", \"\", \"grave\", \"acute\", \"circumflex\",\n  \"tilde\", \"macron\", \"breve\", \"dotaccent\", \"dieresis\", \"\", \"ring\", \"cedilla\",\n  \"\", \"hungarumlaut\", \"ogonek\", \"caron\", \"emdash\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"AE\", \"\", \"ordfeminine\", \"\", \"\",\n  \"\", \"\", \"Lslash\", \"Oslash\", \"OE\", \"ordmasculine\", \"\", \"\", \"\", \"\", \"\", \"ae\",\n  \"\", \"\", \"\", \"dotlessi\", \"\", \"\", \"lslash\", \"oslash\", \"oe\", \"germandbls\", \"\",\n  \"\", \"\", \"\"];\n\n// prettier-ignore\nconst WinAnsiEncoding = [\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\",\n  \"ampersand\", \"quotesingle\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\",\n  \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\",\n  \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\",\n  \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\",\n  \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\",\n  \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\",\n  \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",\n  \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\",\n  \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\",\n  \"bullet\", \"Euro\", \"bullet\", \"quotesinglbase\", \"florin\", \"quotedblbase\",\n  \"ellipsis\", \"dagger\", \"daggerdbl\", \"circumflex\", \"perthousand\", \"Scaron\",\n  \"guilsinglleft\", \"OE\", \"bullet\", \"Zcaron\", \"bullet\", \"bullet\", \"quoteleft\",\n  \"quoteright\", \"quotedblleft\", \"quotedblright\", \"bullet\", \"endash\",\n  \"emdash\", \"tilde\", \"trademark\", \"scaron\", \"guilsinglright\", \"oe\", \"bullet\",\n  \"zcaron\", \"Ydieresis\", \"space\", \"exclamdown\", \"cent\", \"sterling\",\n  \"currency\", \"yen\", \"brokenbar\", \"section\", \"dieresis\", \"copyright\",\n  \"ordfeminine\", \"guillemotleft\", \"logicalnot\", \"hyphen\", \"registered\",\n  \"macron\", \"degree\", \"plusminus\", \"twosuperior\", \"threesuperior\", \"acute\",\n  \"mu\", \"paragraph\", \"periodcentered\", \"cedilla\", \"onesuperior\",\n  \"ordmasculine\", \"guillemotright\", \"onequarter\", \"onehalf\", \"threequarters\",\n  \"questiondown\", \"Agrave\", \"Aacute\", \"Acircumflex\", \"Atilde\", \"Adieresis\",\n  \"Aring\", \"AE\", \"Ccedilla\", \"Egrave\", \"Eacute\", \"Ecircumflex\", \"Edieresis\",\n  \"Igrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\", \"Eth\", \"Ntilde\", \"Ograve\",\n  \"Oacute\", \"Ocircumflex\", \"Otilde\", \"Odieresis\", \"multiply\", \"Oslash\",\n  \"Ugrave\", \"Uacute\", \"Ucircumflex\", \"Udieresis\", \"Yacute\", \"Thorn\",\n  \"germandbls\", \"agrave\", \"aacute\", \"acircumflex\", \"atilde\", \"adieresis\",\n  \"aring\", \"ae\", \"ccedilla\", \"egrave\", \"eacute\", \"ecircumflex\", \"edieresis\",\n  \"igrave\", \"iacute\", \"icircumflex\", \"idieresis\", \"eth\", \"ntilde\", \"ograve\",\n  \"oacute\", \"ocircumflex\", \"otilde\", \"odieresis\", \"divide\", \"oslash\",\n  \"ugrave\", \"uacute\", \"ucircumflex\", \"udieresis\", \"yacute\", \"thorn\",\n  \"ydieresis\"];\n\n// prettier-ignore\nconst SymbolSetEncoding = [\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"space\", \"exclam\", \"universal\", \"numbersign\", \"existential\", \"percent\",\n  \"ampersand\", \"suchthat\", \"parenleft\", \"parenright\", \"asteriskmath\", \"plus\",\n  \"comma\", \"minus\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\",\n  \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\",\n  \"equal\", \"greater\", \"question\", \"congruent\", \"Alpha\", \"Beta\", \"Chi\",\n  \"Delta\", \"Epsilon\", \"Phi\", \"Gamma\", \"Eta\", \"Iota\", \"theta1\", \"Kappa\",\n  \"Lambda\", \"Mu\", \"Nu\", \"Omicron\", \"Pi\", \"Theta\", \"Rho\", \"Sigma\", \"Tau\",\n  \"Upsilon\", \"sigma1\", \"Omega\", \"Xi\", \"Psi\", \"Zeta\", \"bracketleft\",\n  \"therefore\", \"bracketright\", \"perpendicular\", \"underscore\", \"radicalex\",\n  \"alpha\", \"beta\", \"chi\", \"delta\", \"epsilon\", \"phi\", \"gamma\", \"eta\", \"iota\",\n  \"phi1\", \"kappa\", \"lambda\", \"mu\", \"nu\", \"omicron\", \"pi\", \"theta\", \"rho\",\n  \"sigma\", \"tau\", \"upsilon\", \"omega1\", \"omega\", \"xi\", \"psi\", \"zeta\",\n  \"braceleft\", \"bar\", \"braceright\", \"similar\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"Euro\", \"Upsilon1\", \"minute\", \"lessequal\",\n  \"fraction\", \"infinity\", \"florin\", \"club\", \"diamond\", \"heart\", \"spade\",\n  \"arrowboth\", \"arrowleft\", \"arrowup\", \"arrowright\", \"arrowdown\", \"degree\",\n  \"plusminus\", \"second\", \"greaterequal\", \"multiply\", \"proportional\",\n  \"partialdiff\", \"bullet\", \"divide\", \"notequal\", \"equivalence\",\n  \"approxequal\", \"ellipsis\", \"arrowvertex\", \"arrowhorizex\", \"carriagereturn\",\n  \"aleph\", \"Ifraktur\", \"Rfraktur\", \"weierstrass\", \"circlemultiply\",\n  \"circleplus\", \"emptyset\", \"intersection\", \"union\", \"propersuperset\",\n  \"reflexsuperset\", \"notsubset\", \"propersubset\", \"reflexsubset\", \"element\",\n  \"notelement\", \"angle\", \"gradient\", \"registerserif\", \"copyrightserif\",\n  \"trademarkserif\", \"product\", \"radical\", \"dotmath\", \"logicalnot\",\n  \"logicaland\", \"logicalor\", \"arrowdblboth\", \"arrowdblleft\", \"arrowdblup\",\n  \"arrowdblright\", \"arrowdbldown\", \"lozenge\", \"angleleft\", \"registersans\",\n  \"copyrightsans\", \"trademarksans\", \"summation\", \"parenlefttp\",\n  \"parenleftex\", \"parenleftbt\", \"bracketlefttp\", \"bracketleftex\",\n  \"bracketleftbt\", \"bracelefttp\", \"braceleftmid\", \"braceleftbt\", \"braceex\",\n  \"\", \"angleright\", \"integral\", \"integraltp\", \"integralex\", \"integralbt\",\n  \"parenrighttp\", \"parenrightex\", \"parenrightbt\", \"bracketrighttp\",\n  \"bracketrightex\", \"bracketrightbt\", \"bracerighttp\", \"bracerightmid\",\n  \"bracerightbt\", \"\"];\n\n// prettier-ignore\nconst ZapfDingbatsEncoding = [\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"space\", \"a1\", \"a2\", \"a202\", \"a3\", \"a4\", \"a5\", \"a119\", \"a118\", \"a117\",\n  \"a11\", \"a12\", \"a13\", \"a14\", \"a15\", \"a16\", \"a105\", \"a17\", \"a18\", \"a19\",\n  \"a20\", \"a21\", \"a22\", \"a23\", \"a24\", \"a25\", \"a26\", \"a27\", \"a28\", \"a6\", \"a7\",\n  \"a8\", \"a9\", \"a10\", \"a29\", \"a30\", \"a31\", \"a32\", \"a33\", \"a34\", \"a35\", \"a36\",\n  \"a37\", \"a38\", \"a39\", \"a40\", \"a41\", \"a42\", \"a43\", \"a44\", \"a45\", \"a46\",\n  \"a47\", \"a48\", \"a49\", \"a50\", \"a51\", \"a52\", \"a53\", \"a54\", \"a55\", \"a56\",\n  \"a57\", \"a58\", \"a59\", \"a60\", \"a61\", \"a62\", \"a63\", \"a64\", \"a65\", \"a66\",\n  \"a67\", \"a68\", \"a69\", \"a70\", \"a71\", \"a72\", \"a73\", \"a74\", \"a203\", \"a75\",\n  \"a204\", \"a76\", \"a77\", \"a78\", \"a79\", \"a81\", \"a82\", \"a83\", \"a84\", \"a97\",\n  \"a98\", \"a99\", \"a100\", \"\", \"a89\", \"a90\", \"a93\", \"a94\", \"a91\", \"a92\", \"a205\",\n  \"a85\", \"a206\", \"a86\", \"a87\", \"a88\", \"a95\", \"a96\", \"\", \"\", \"\", \"\", \"\", \"\",\n  \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"a101\", \"a102\", \"a103\",\n  \"a104\", \"a106\", \"a107\", \"a108\", \"a112\", \"a111\", \"a110\", \"a109\", \"a120\",\n  \"a121\", \"a122\", \"a123\", \"a124\", \"a125\", \"a126\", \"a127\", \"a128\", \"a129\",\n  \"a130\", \"a131\", \"a132\", \"a133\", \"a134\", \"a135\", \"a136\", \"a137\", \"a138\",\n  \"a139\", \"a140\", \"a141\", \"a142\", \"a143\", \"a144\", \"a145\", \"a146\", \"a147\",\n  \"a148\", \"a149\", \"a150\", \"a151\", \"a152\", \"a153\", \"a154\", \"a155\", \"a156\",\n  \"a157\", \"a158\", \"a159\", \"a160\", \"a161\", \"a163\", \"a164\", \"a196\", \"a165\",\n  \"a192\", \"a166\", \"a167\", \"a168\", \"a169\", \"a170\", \"a171\", \"a172\", \"a173\",\n  \"a162\", \"a174\", \"a175\", \"a176\", \"a177\", \"a178\", \"a179\", \"a193\", \"a180\",\n  \"a199\", \"a181\", \"a200\", \"a182\", \"\", \"a201\", \"a183\", \"a184\", \"a197\", \"a185\",\n  \"a194\", \"a198\", \"a186\", \"a195\", \"a187\", \"a188\", \"a189\", \"a190\", \"a191\", \"\"];\n\nfunction getEncoding(encodingName) {\n  switch (encodingName) {\n    case \"WinAnsiEncoding\":\n      return WinAnsiEncoding;\n    case \"StandardEncoding\":\n      return StandardEncoding;\n    case \"MacRomanEncoding\":\n      return MacRomanEncoding;\n    case \"SymbolSetEncoding\":\n      return SymbolSetEncoding;\n    case \"ZapfDingbatsEncoding\":\n      return ZapfDingbatsEncoding;\n    case \"ExpertEncoding\":\n      return ExpertEncoding;\n    case \"MacExpertEncoding\":\n      return MacExpertEncoding;\n    default:\n      return null;\n  }\n}\n\nexport {\n  ExpertEncoding,\n  getEncoding,\n  MacRomanEncoding,\n  StandardEncoding,\n  SymbolSetEncoding,\n  WinAnsiEncoding,\n  ZapfDingbatsEncoding,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getLookupTableFactory } from \"./core_utils.js\";\n\nconst getGlyphsUnicode = getLookupTableFactory(function (t) {\n  t.A = 0x0041;\n  t.AE = 0x00c6;\n  t.AEacute = 0x01fc;\n  t.AEmacron = 0x01e2;\n  t.AEsmall = 0xf7e6;\n  t.Aacute = 0x00c1;\n  t.Aacutesmall = 0xf7e1;\n  t.Abreve = 0x0102;\n  t.Abreveacute = 0x1eae;\n  t.Abrevecyrillic = 0x04d0;\n  t.Abrevedotbelow = 0x1eb6;\n  t.Abrevegrave = 0x1eb0;\n  t.Abrevehookabove = 0x1eb2;\n  t.Abrevetilde = 0x1eb4;\n  t.Acaron = 0x01cd;\n  t.Acircle = 0x24b6;\n  t.Acircumflex = 0x00c2;\n  t.Acircumflexacute = 0x1ea4;\n  t.Acircumflexdotbelow = 0x1eac;\n  t.Acircumflexgrave = 0x1ea6;\n  t.Acircumflexhookabove = 0x1ea8;\n  t.Acircumflexsmall = 0xf7e2;\n  t.Acircumflextilde = 0x1eaa;\n  t.Acute = 0xf6c9;\n  t.Acutesmall = 0xf7b4;\n  t.Acyrillic = 0x0410;\n  t.Adblgrave = 0x0200;\n  t.Adieresis = 0x00c4;\n  t.Adieresiscyrillic = 0x04d2;\n  t.Adieresismacron = 0x01de;\n  t.Adieresissmall = 0xf7e4;\n  t.Adotbelow = 0x1ea0;\n  t.Adotmacron = 0x01e0;\n  t.Agrave = 0x00c0;\n  t.Agravesmall = 0xf7e0;\n  t.Ahookabove = 0x1ea2;\n  t.Aiecyrillic = 0x04d4;\n  t.Ainvertedbreve = 0x0202;\n  t.Alpha = 0x0391;\n  t.Alphatonos = 0x0386;\n  t.Amacron = 0x0100;\n  t.Amonospace = 0xff21;\n  t.Aogonek = 0x0104;\n  t.Aring = 0x00c5;\n  t.Aringacute = 0x01fa;\n  t.Aringbelow = 0x1e00;\n  t.Aringsmall = 0xf7e5;\n  t.Asmall = 0xf761;\n  t.Atilde = 0x00c3;\n  t.Atildesmall = 0xf7e3;\n  t.Aybarmenian = 0x0531;\n  t.B = 0x0042;\n  t.Bcircle = 0x24b7;\n  t.Bdotaccent = 0x1e02;\n  t.Bdotbelow = 0x1e04;\n  t.Becyrillic = 0x0411;\n  t.Benarmenian = 0x0532;\n  t.Beta = 0x0392;\n  t.Bhook = 0x0181;\n  t.Blinebelow = 0x1e06;\n  t.Bmonospace = 0xff22;\n  t.Brevesmall = 0xf6f4;\n  t.Bsmall = 0xf762;\n  t.Btopbar = 0x0182;\n  t.C = 0x0043;\n  t.Caarmenian = 0x053e;\n  t.Cacute = 0x0106;\n  t.Caron = 0xf6ca;\n  t.Caronsmall = 0xf6f5;\n  t.Ccaron = 0x010c;\n  t.Ccedilla = 0x00c7;\n  t.Ccedillaacute = 0x1e08;\n  t.Ccedillasmall = 0xf7e7;\n  t.Ccircle = 0x24b8;\n  t.Ccircumflex = 0x0108;\n  t.Cdot = 0x010a;\n  t.Cdotaccent = 0x010a;\n  t.Cedillasmall = 0xf7b8;\n  t.Chaarmenian = 0x0549;\n  t.Cheabkhasiancyrillic = 0x04bc;\n  t.Checyrillic = 0x0427;\n  t.Chedescenderabkhasiancyrillic = 0x04be;\n  t.Chedescendercyrillic = 0x04b6;\n  t.Chedieresiscyrillic = 0x04f4;\n  t.Cheharmenian = 0x0543;\n  t.Chekhakassiancyrillic = 0x04cb;\n  t.Cheverticalstrokecyrillic = 0x04b8;\n  t.Chi = 0x03a7;\n  t.Chook = 0x0187;\n  t.Circumflexsmall = 0xf6f6;\n  t.Cmonospace = 0xff23;\n  t.Coarmenian = 0x0551;\n  t.Csmall = 0xf763;\n  t.D = 0x0044;\n  t.DZ = 0x01f1;\n  t.DZcaron = 0x01c4;\n  t.Daarmenian = 0x0534;\n  t.Dafrican = 0x0189;\n  t.Dcaron = 0x010e;\n  t.Dcedilla = 0x1e10;\n  t.Dcircle = 0x24b9;\n  t.Dcircumflexbelow = 0x1e12;\n  t.Dcroat = 0x0110;\n  t.Ddotaccent = 0x1e0a;\n  t.Ddotbelow = 0x1e0c;\n  t.Decyrillic = 0x0414;\n  t.Deicoptic = 0x03ee;\n  t.Delta = 0x2206;\n  t.Deltagreek = 0x0394;\n  t.Dhook = 0x018a;\n  t.Dieresis = 0xf6cb;\n  t.DieresisAcute = 0xf6cc;\n  t.DieresisGrave = 0xf6cd;\n  t.Dieresissmall = 0xf7a8;\n  t.Digammagreek = 0x03dc;\n  t.Djecyrillic = 0x0402;\n  t.Dlinebelow = 0x1e0e;\n  t.Dmonospace = 0xff24;\n  t.Dotaccentsmall = 0xf6f7;\n  t.Dslash = 0x0110;\n  t.Dsmall = 0xf764;\n  t.Dtopbar = 0x018b;\n  t.Dz = 0x01f2;\n  t.Dzcaron = 0x01c5;\n  t.Dzeabkhasiancyrillic = 0x04e0;\n  t.Dzecyrillic = 0x0405;\n  t.Dzhecyrillic = 0x040f;\n  t.E = 0x0045;\n  t.Eacute = 0x00c9;\n  t.Eacutesmall = 0xf7e9;\n  t.Ebreve = 0x0114;\n  t.Ecaron = 0x011a;\n  t.Ecedillabreve = 0x1e1c;\n  t.Echarmenian = 0x0535;\n  t.Ecircle = 0x24ba;\n  t.Ecircumflex = 0x00ca;\n  t.Ecircumflexacute = 0x1ebe;\n  t.Ecircumflexbelow = 0x1e18;\n  t.Ecircumflexdotbelow = 0x1ec6;\n  t.Ecircumflexgrave = 0x1ec0;\n  t.Ecircumflexhookabove = 0x1ec2;\n  t.Ecircumflexsmall = 0xf7ea;\n  t.Ecircumflextilde = 0x1ec4;\n  t.Ecyrillic = 0x0404;\n  t.Edblgrave = 0x0204;\n  t.Edieresis = 0x00cb;\n  t.Edieresissmall = 0xf7eb;\n  t.Edot = 0x0116;\n  t.Edotaccent = 0x0116;\n  t.Edotbelow = 0x1eb8;\n  t.Efcyrillic = 0x0424;\n  t.Egrave = 0x00c8;\n  t.Egravesmall = 0xf7e8;\n  t.Eharmenian = 0x0537;\n  t.Ehookabove = 0x1eba;\n  t.Eightroman = 0x2167;\n  t.Einvertedbreve = 0x0206;\n  t.Eiotifiedcyrillic = 0x0464;\n  t.Elcyrillic = 0x041b;\n  t.Elevenroman = 0x216a;\n  t.Emacron = 0x0112;\n  t.Emacronacute = 0x1e16;\n  t.Emacrongrave = 0x1e14;\n  t.Emcyrillic = 0x041c;\n  t.Emonospace = 0xff25;\n  t.Encyrillic = 0x041d;\n  t.Endescendercyrillic = 0x04a2;\n  t.Eng = 0x014a;\n  t.Enghecyrillic = 0x04a4;\n  t.Enhookcyrillic = 0x04c7;\n  t.Eogonek = 0x0118;\n  t.Eopen = 0x0190;\n  t.Epsilon = 0x0395;\n  t.Epsilontonos = 0x0388;\n  t.Ercyrillic = 0x0420;\n  t.Ereversed = 0x018e;\n  t.Ereversedcyrillic = 0x042d;\n  t.Escyrillic = 0x0421;\n  t.Esdescendercyrillic = 0x04aa;\n  t.Esh = 0x01a9;\n  t.Esmall = 0xf765;\n  t.Eta = 0x0397;\n  t.Etarmenian = 0x0538;\n  t.Etatonos = 0x0389;\n  t.Eth = 0x00d0;\n  t.Ethsmall = 0xf7f0;\n  t.Etilde = 0x1ebc;\n  t.Etildebelow = 0x1e1a;\n  t.Euro = 0x20ac;\n  t.Ezh = 0x01b7;\n  t.Ezhcaron = 0x01ee;\n  t.Ezhreversed = 0x01b8;\n  t.F = 0x0046;\n  t.Fcircle = 0x24bb;\n  t.Fdotaccent = 0x1e1e;\n  t.Feharmenian = 0x0556;\n  t.Feicoptic = 0x03e4;\n  t.Fhook = 0x0191;\n  t.Fitacyrillic = 0x0472;\n  t.Fiveroman = 0x2164;\n  t.Fmonospace = 0xff26;\n  t.Fourroman = 0x2163;\n  t.Fsmall = 0xf766;\n  t.G = 0x0047;\n  t.GBsquare = 0x3387;\n  t.Gacute = 0x01f4;\n  t.Gamma = 0x0393;\n  t.Gammaafrican = 0x0194;\n  t.Gangiacoptic = 0x03ea;\n  t.Gbreve = 0x011e;\n  t.Gcaron = 0x01e6;\n  t.Gcedilla = 0x0122;\n  t.Gcircle = 0x24bc;\n  t.Gcircumflex = 0x011c;\n  t.Gcommaaccent = 0x0122;\n  t.Gdot = 0x0120;\n  t.Gdotaccent = 0x0120;\n  t.Gecyrillic = 0x0413;\n  t.Ghadarmenian = 0x0542;\n  t.Ghemiddlehookcyrillic = 0x0494;\n  t.Ghestrokecyrillic = 0x0492;\n  t.Gheupturncyrillic = 0x0490;\n  t.Ghook = 0x0193;\n  t.Gimarmenian = 0x0533;\n  t.Gjecyrillic = 0x0403;\n  t.Gmacron = 0x1e20;\n  t.Gmonospace = 0xff27;\n  t.Grave = 0xf6ce;\n  t.Gravesmall = 0xf760;\n  t.Gsmall = 0xf767;\n  t.Gsmallhook = 0x029b;\n  t.Gstroke = 0x01e4;\n  t.H = 0x0048;\n  t.H18533 = 0x25cf;\n  t.H18543 = 0x25aa;\n  t.H18551 = 0x25ab;\n  t.H22073 = 0x25a1;\n  t.HPsquare = 0x33cb;\n  t.Haabkhasiancyrillic = 0x04a8;\n  t.Hadescendercyrillic = 0x04b2;\n  t.Hardsigncyrillic = 0x042a;\n  t.Hbar = 0x0126;\n  t.Hbrevebelow = 0x1e2a;\n  t.Hcedilla = 0x1e28;\n  t.Hcircle = 0x24bd;\n  t.Hcircumflex = 0x0124;\n  t.Hdieresis = 0x1e26;\n  t.Hdotaccent = 0x1e22;\n  t.Hdotbelow = 0x1e24;\n  t.Hmonospace = 0xff28;\n  t.Hoarmenian = 0x0540;\n  t.Horicoptic = 0x03e8;\n  t.Hsmall = 0xf768;\n  t.Hungarumlaut = 0xf6cf;\n  t.Hungarumlautsmall = 0xf6f8;\n  t.Hzsquare = 0x3390;\n  t.I = 0x0049;\n  t.IAcyrillic = 0x042f;\n  t.IJ = 0x0132;\n  t.IUcyrillic = 0x042e;\n  t.Iacute = 0x00cd;\n  t.Iacutesmall = 0xf7ed;\n  t.Ibreve = 0x012c;\n  t.Icaron = 0x01cf;\n  t.Icircle = 0x24be;\n  t.Icircumflex = 0x00ce;\n  t.Icircumflexsmall = 0xf7ee;\n  t.Icyrillic = 0x0406;\n  t.Idblgrave = 0x0208;\n  t.Idieresis = 0x00cf;\n  t.Idieresisacute = 0x1e2e;\n  t.Idieresiscyrillic = 0x04e4;\n  t.Idieresissmall = 0xf7ef;\n  t.Idot = 0x0130;\n  t.Idotaccent = 0x0130;\n  t.Idotbelow = 0x1eca;\n  t.Iebrevecyrillic = 0x04d6;\n  t.Iecyrillic = 0x0415;\n  t.Ifraktur = 0x2111;\n  t.Igrave = 0x00cc;\n  t.Igravesmall = 0xf7ec;\n  t.Ihookabove = 0x1ec8;\n  t.Iicyrillic = 0x0418;\n  t.Iinvertedbreve = 0x020a;\n  t.Iishortcyrillic = 0x0419;\n  t.Imacron = 0x012a;\n  t.Imacroncyrillic = 0x04e2;\n  t.Imonospace = 0xff29;\n  t.Iniarmenian = 0x053b;\n  t.Iocyrillic = 0x0401;\n  t.Iogonek = 0x012e;\n  t.Iota = 0x0399;\n  t.Iotaafrican = 0x0196;\n  t.Iotadieresis = 0x03aa;\n  t.Iotatonos = 0x038a;\n  t.Ismall = 0xf769;\n  t.Istroke = 0x0197;\n  t.Itilde = 0x0128;\n  t.Itildebelow = 0x1e2c;\n  t.Izhitsacyrillic = 0x0474;\n  t.Izhitsadblgravecyrillic = 0x0476;\n  t.J = 0x004a;\n  t.Jaarmenian = 0x0541;\n  t.Jcircle = 0x24bf;\n  t.Jcircumflex = 0x0134;\n  t.Jecyrillic = 0x0408;\n  t.Jheharmenian = 0x054b;\n  t.Jmonospace = 0xff2a;\n  t.Jsmall = 0xf76a;\n  t.K = 0x004b;\n  t.KBsquare = 0x3385;\n  t.KKsquare = 0x33cd;\n  t.Kabashkircyrillic = 0x04a0;\n  t.Kacute = 0x1e30;\n  t.Kacyrillic = 0x041a;\n  t.Kadescendercyrillic = 0x049a;\n  t.Kahookcyrillic = 0x04c3;\n  t.Kappa = 0x039a;\n  t.Kastrokecyrillic = 0x049e;\n  t.Kaverticalstrokecyrillic = 0x049c;\n  t.Kcaron = 0x01e8;\n  t.Kcedilla = 0x0136;\n  t.Kcircle = 0x24c0;\n  t.Kcommaaccent = 0x0136;\n  t.Kdotbelow = 0x1e32;\n  t.Keharmenian = 0x0554;\n  t.Kenarmenian = 0x053f;\n  t.Khacyrillic = 0x0425;\n  t.Kheicoptic = 0x03e6;\n  t.Khook = 0x0198;\n  t.Kjecyrillic = 0x040c;\n  t.Klinebelow = 0x1e34;\n  t.Kmonospace = 0xff2b;\n  t.Koppacyrillic = 0x0480;\n  t.Koppagreek = 0x03de;\n  t.Ksicyrillic = 0x046e;\n  t.Ksmall = 0xf76b;\n  t.L = 0x004c;\n  t.LJ = 0x01c7;\n  t.LL = 0xf6bf;\n  t.Lacute = 0x0139;\n  t.Lambda = 0x039b;\n  t.Lcaron = 0x013d;\n  t.Lcedilla = 0x013b;\n  t.Lcircle = 0x24c1;\n  t.Lcircumflexbelow = 0x1e3c;\n  t.Lcommaaccent = 0x013b;\n  t.Ldot = 0x013f;\n  t.Ldotaccent = 0x013f;\n  t.Ldotbelow = 0x1e36;\n  t.Ldotbelowmacron = 0x1e38;\n  t.Liwnarmenian = 0x053c;\n  t.Lj = 0x01c8;\n  t.Ljecyrillic = 0x0409;\n  t.Llinebelow = 0x1e3a;\n  t.Lmonospace = 0xff2c;\n  t.Lslash = 0x0141;\n  t.Lslashsmall = 0xf6f9;\n  t.Lsmall = 0xf76c;\n  t.M = 0x004d;\n  t.MBsquare = 0x3386;\n  t.Macron = 0xf6d0;\n  t.Macronsmall = 0xf7af;\n  t.Macute = 0x1e3e;\n  t.Mcircle = 0x24c2;\n  t.Mdotaccent = 0x1e40;\n  t.Mdotbelow = 0x1e42;\n  t.Menarmenian = 0x0544;\n  t.Mmonospace = 0xff2d;\n  t.Msmall = 0xf76d;\n  t.Mturned = 0x019c;\n  t.Mu = 0x039c;\n  t.N = 0x004e;\n  t.NJ = 0x01ca;\n  t.Nacute = 0x0143;\n  t.Ncaron = 0x0147;\n  t.Ncedilla = 0x0145;\n  t.Ncircle = 0x24c3;\n  t.Ncircumflexbelow = 0x1e4a;\n  t.Ncommaaccent = 0x0145;\n  t.Ndotaccent = 0x1e44;\n  t.Ndotbelow = 0x1e46;\n  t.Nhookleft = 0x019d;\n  t.Nineroman = 0x2168;\n  t.Nj = 0x01cb;\n  t.Njecyrillic = 0x040a;\n  t.Nlinebelow = 0x1e48;\n  t.Nmonospace = 0xff2e;\n  t.Nowarmenian = 0x0546;\n  t.Nsmall = 0xf76e;\n  t.Ntilde = 0x00d1;\n  t.Ntildesmall = 0xf7f1;\n  t.Nu = 0x039d;\n  t.O = 0x004f;\n  t.OE = 0x0152;\n  t.OEsmall = 0xf6fa;\n  t.Oacute = 0x00d3;\n  t.Oacutesmall = 0xf7f3;\n  t.Obarredcyrillic = 0x04e8;\n  t.Obarreddieresiscyrillic = 0x04ea;\n  t.Obreve = 0x014e;\n  t.Ocaron = 0x01d1;\n  t.Ocenteredtilde = 0x019f;\n  t.Ocircle = 0x24c4;\n  t.Ocircumflex = 0x00d4;\n  t.Ocircumflexacute = 0x1ed0;\n  t.Ocircumflexdotbelow = 0x1ed8;\n  t.Ocircumflexgrave = 0x1ed2;\n  t.Ocircumflexhookabove = 0x1ed4;\n  t.Ocircumflexsmall = 0xf7f4;\n  t.Ocircumflextilde = 0x1ed6;\n  t.Ocyrillic = 0x041e;\n  t.Odblacute = 0x0150;\n  t.Odblgrave = 0x020c;\n  t.Odieresis = 0x00d6;\n  t.Odieresiscyrillic = 0x04e6;\n  t.Odieresissmall = 0xf7f6;\n  t.Odotbelow = 0x1ecc;\n  t.Ogoneksmall = 0xf6fb;\n  t.Ograve = 0x00d2;\n  t.Ogravesmall = 0xf7f2;\n  t.Oharmenian = 0x0555;\n  t.Ohm = 0x2126;\n  t.Ohookabove = 0x1ece;\n  t.Ohorn = 0x01a0;\n  t.Ohornacute = 0x1eda;\n  t.Ohorndotbelow = 0x1ee2;\n  t.Ohorngrave = 0x1edc;\n  t.Ohornhookabove = 0x1ede;\n  t.Ohorntilde = 0x1ee0;\n  t.Ohungarumlaut = 0x0150;\n  t.Oi = 0x01a2;\n  t.Oinvertedbreve = 0x020e;\n  t.Omacron = 0x014c;\n  t.Omacronacute = 0x1e52;\n  t.Omacrongrave = 0x1e50;\n  t.Omega = 0x2126;\n  t.Omegacyrillic = 0x0460;\n  t.Omegagreek = 0x03a9;\n  t.Omegaroundcyrillic = 0x047a;\n  t.Omegatitlocyrillic = 0x047c;\n  t.Omegatonos = 0x038f;\n  t.Omicron = 0x039f;\n  t.Omicrontonos = 0x038c;\n  t.Omonospace = 0xff2f;\n  t.Oneroman = 0x2160;\n  t.Oogonek = 0x01ea;\n  t.Oogonekmacron = 0x01ec;\n  t.Oopen = 0x0186;\n  t.Oslash = 0x00d8;\n  t.Oslashacute = 0x01fe;\n  t.Oslashsmall = 0xf7f8;\n  t.Osmall = 0xf76f;\n  t.Ostrokeacute = 0x01fe;\n  t.Otcyrillic = 0x047e;\n  t.Otilde = 0x00d5;\n  t.Otildeacute = 0x1e4c;\n  t.Otildedieresis = 0x1e4e;\n  t.Otildesmall = 0xf7f5;\n  t.P = 0x0050;\n  t.Pacute = 0x1e54;\n  t.Pcircle = 0x24c5;\n  t.Pdotaccent = 0x1e56;\n  t.Pecyrillic = 0x041f;\n  t.Peharmenian = 0x054a;\n  t.Pemiddlehookcyrillic = 0x04a6;\n  t.Phi = 0x03a6;\n  t.Phook = 0x01a4;\n  t.Pi = 0x03a0;\n  t.Piwrarmenian = 0x0553;\n  t.Pmonospace = 0xff30;\n  t.Psi = 0x03a8;\n  t.Psicyrillic = 0x0470;\n  t.Psmall = 0xf770;\n  t.Q = 0x0051;\n  t.Qcircle = 0x24c6;\n  t.Qmonospace = 0xff31;\n  t.Qsmall = 0xf771;\n  t.R = 0x0052;\n  t.Raarmenian = 0x054c;\n  t.Racute = 0x0154;\n  t.Rcaron = 0x0158;\n  t.Rcedilla = 0x0156;\n  t.Rcircle = 0x24c7;\n  t.Rcommaaccent = 0x0156;\n  t.Rdblgrave = 0x0210;\n  t.Rdotaccent = 0x1e58;\n  t.Rdotbelow = 0x1e5a;\n  t.Rdotbelowmacron = 0x1e5c;\n  t.Reharmenian = 0x0550;\n  t.Rfraktur = 0x211c;\n  t.Rho = 0x03a1;\n  t.Ringsmall = 0xf6fc;\n  t.Rinvertedbreve = 0x0212;\n  t.Rlinebelow = 0x1e5e;\n  t.Rmonospace = 0xff32;\n  t.Rsmall = 0xf772;\n  t.Rsmallinverted = 0x0281;\n  t.Rsmallinvertedsuperior = 0x02b6;\n  t.S = 0x0053;\n  t.SF010000 = 0x250c;\n  t.SF020000 = 0x2514;\n  t.SF030000 = 0x2510;\n  t.SF040000 = 0x2518;\n  t.SF050000 = 0x253c;\n  t.SF060000 = 0x252c;\n  t.SF070000 = 0x2534;\n  t.SF080000 = 0x251c;\n  t.SF090000 = 0x2524;\n  t.SF100000 = 0x2500;\n  t.SF110000 = 0x2502;\n  t.SF190000 = 0x2561;\n  t.SF200000 = 0x2562;\n  t.SF210000 = 0x2556;\n  t.SF220000 = 0x2555;\n  t.SF230000 = 0x2563;\n  t.SF240000 = 0x2551;\n  t.SF250000 = 0x2557;\n  t.SF260000 = 0x255d;\n  t.SF270000 = 0x255c;\n  t.SF280000 = 0x255b;\n  t.SF360000 = 0x255e;\n  t.SF370000 = 0x255f;\n  t.SF380000 = 0x255a;\n  t.SF390000 = 0x2554;\n  t.SF400000 = 0x2569;\n  t.SF410000 = 0x2566;\n  t.SF420000 = 0x2560;\n  t.SF430000 = 0x2550;\n  t.SF440000 = 0x256c;\n  t.SF450000 = 0x2567;\n  t.SF460000 = 0x2568;\n  t.SF470000 = 0x2564;\n  t.SF480000 = 0x2565;\n  t.SF490000 = 0x2559;\n  t.SF500000 = 0x2558;\n  t.SF510000 = 0x2552;\n  t.SF520000 = 0x2553;\n  t.SF530000 = 0x256b;\n  t.SF540000 = 0x256a;\n  t.Sacute = 0x015a;\n  t.Sacutedotaccent = 0x1e64;\n  t.Sampigreek = 0x03e0;\n  t.Scaron = 0x0160;\n  t.Scarondotaccent = 0x1e66;\n  t.Scaronsmall = 0xf6fd;\n  t.Scedilla = 0x015e;\n  t.Schwa = 0x018f;\n  t.Schwacyrillic = 0x04d8;\n  t.Schwadieresiscyrillic = 0x04da;\n  t.Scircle = 0x24c8;\n  t.Scircumflex = 0x015c;\n  t.Scommaaccent = 0x0218;\n  t.Sdotaccent = 0x1e60;\n  t.Sdotbelow = 0x1e62;\n  t.Sdotbelowdotaccent = 0x1e68;\n  t.Seharmenian = 0x054d;\n  t.Sevenroman = 0x2166;\n  t.Shaarmenian = 0x0547;\n  t.Shacyrillic = 0x0428;\n  t.Shchacyrillic = 0x0429;\n  t.Sheicoptic = 0x03e2;\n  t.Shhacyrillic = 0x04ba;\n  t.Shimacoptic = 0x03ec;\n  t.Sigma = 0x03a3;\n  t.Sixroman = 0x2165;\n  t.Smonospace = 0xff33;\n  t.Softsigncyrillic = 0x042c;\n  t.Ssmall = 0xf773;\n  t.Stigmagreek = 0x03da;\n  t.T = 0x0054;\n  t.Tau = 0x03a4;\n  t.Tbar = 0x0166;\n  t.Tcaron = 0x0164;\n  t.Tcedilla = 0x0162;\n  t.Tcircle = 0x24c9;\n  t.Tcircumflexbelow = 0x1e70;\n  t.Tcommaaccent = 0x0162;\n  t.Tdotaccent = 0x1e6a;\n  t.Tdotbelow = 0x1e6c;\n  t.Tecyrillic = 0x0422;\n  t.Tedescendercyrillic = 0x04ac;\n  t.Tenroman = 0x2169;\n  t.Tetsecyrillic = 0x04b4;\n  t.Theta = 0x0398;\n  t.Thook = 0x01ac;\n  t.Thorn = 0x00de;\n  t.Thornsmall = 0xf7fe;\n  t.Threeroman = 0x2162;\n  t.Tildesmall = 0xf6fe;\n  t.Tiwnarmenian = 0x054f;\n  t.Tlinebelow = 0x1e6e;\n  t.Tmonospace = 0xff34;\n  t.Toarmenian = 0x0539;\n  t.Tonefive = 0x01bc;\n  t.Tonesix = 0x0184;\n  t.Tonetwo = 0x01a7;\n  t.Tretroflexhook = 0x01ae;\n  t.Tsecyrillic = 0x0426;\n  t.Tshecyrillic = 0x040b;\n  t.Tsmall = 0xf774;\n  t.Twelveroman = 0x216b;\n  t.Tworoman = 0x2161;\n  t.U = 0x0055;\n  t.Uacute = 0x00da;\n  t.Uacutesmall = 0xf7fa;\n  t.Ubreve = 0x016c;\n  t.Ucaron = 0x01d3;\n  t.Ucircle = 0x24ca;\n  t.Ucircumflex = 0x00db;\n  t.Ucircumflexbelow = 0x1e76;\n  t.Ucircumflexsmall = 0xf7fb;\n  t.Ucyrillic = 0x0423;\n  t.Udblacute = 0x0170;\n  t.Udblgrave = 0x0214;\n  t.Udieresis = 0x00dc;\n  t.Udieresisacute = 0x01d7;\n  t.Udieresisbelow = 0x1e72;\n  t.Udieresiscaron = 0x01d9;\n  t.Udieresiscyrillic = 0x04f0;\n  t.Udieresisgrave = 0x01db;\n  t.Udieresismacron = 0x01d5;\n  t.Udieresissmall = 0xf7fc;\n  t.Udotbelow = 0x1ee4;\n  t.Ugrave = 0x00d9;\n  t.Ugravesmall = 0xf7f9;\n  t.Uhookabove = 0x1ee6;\n  t.Uhorn = 0x01af;\n  t.Uhornacute = 0x1ee8;\n  t.Uhorndotbelow = 0x1ef0;\n  t.Uhorngrave = 0x1eea;\n  t.Uhornhookabove = 0x1eec;\n  t.Uhorntilde = 0x1eee;\n  t.Uhungarumlaut = 0x0170;\n  t.Uhungarumlautcyrillic = 0x04f2;\n  t.Uinvertedbreve = 0x0216;\n  t.Ukcyrillic = 0x0478;\n  t.Umacron = 0x016a;\n  t.Umacroncyrillic = 0x04ee;\n  t.Umacrondieresis = 0x1e7a;\n  t.Umonospace = 0xff35;\n  t.Uogonek = 0x0172;\n  t.Upsilon = 0x03a5;\n  t.Upsilon1 = 0x03d2;\n  t.Upsilonacutehooksymbolgreek = 0x03d3;\n  t.Upsilonafrican = 0x01b1;\n  t.Upsilondieresis = 0x03ab;\n  t.Upsilondieresishooksymbolgreek = 0x03d4;\n  t.Upsilonhooksymbol = 0x03d2;\n  t.Upsilontonos = 0x038e;\n  t.Uring = 0x016e;\n  t.Ushortcyrillic = 0x040e;\n  t.Usmall = 0xf775;\n  t.Ustraightcyrillic = 0x04ae;\n  t.Ustraightstrokecyrillic = 0x04b0;\n  t.Utilde = 0x0168;\n  t.Utildeacute = 0x1e78;\n  t.Utildebelow = 0x1e74;\n  t.V = 0x0056;\n  t.Vcircle = 0x24cb;\n  t.Vdotbelow = 0x1e7e;\n  t.Vecyrillic = 0x0412;\n  t.Vewarmenian = 0x054e;\n  t.Vhook = 0x01b2;\n  t.Vmonospace = 0xff36;\n  t.Voarmenian = 0x0548;\n  t.Vsmall = 0xf776;\n  t.Vtilde = 0x1e7c;\n  t.W = 0x0057;\n  t.Wacute = 0x1e82;\n  t.Wcircle = 0x24cc;\n  t.Wcircumflex = 0x0174;\n  t.Wdieresis = 0x1e84;\n  t.Wdotaccent = 0x1e86;\n  t.Wdotbelow = 0x1e88;\n  t.Wgrave = 0x1e80;\n  t.Wmonospace = 0xff37;\n  t.Wsmall = 0xf777;\n  t.X = 0x0058;\n  t.Xcircle = 0x24cd;\n  t.Xdieresis = 0x1e8c;\n  t.Xdotaccent = 0x1e8a;\n  t.Xeharmenian = 0x053d;\n  t.Xi = 0x039e;\n  t.Xmonospace = 0xff38;\n  t.Xsmall = 0xf778;\n  t.Y = 0x0059;\n  t.Yacute = 0x00dd;\n  t.Yacutesmall = 0xf7fd;\n  t.Yatcyrillic = 0x0462;\n  t.Ycircle = 0x24ce;\n  t.Ycircumflex = 0x0176;\n  t.Ydieresis = 0x0178;\n  t.Ydieresissmall = 0xf7ff;\n  t.Ydotaccent = 0x1e8e;\n  t.Ydotbelow = 0x1ef4;\n  t.Yericyrillic = 0x042b;\n  t.Yerudieresiscyrillic = 0x04f8;\n  t.Ygrave = 0x1ef2;\n  t.Yhook = 0x01b3;\n  t.Yhookabove = 0x1ef6;\n  t.Yiarmenian = 0x0545;\n  t.Yicyrillic = 0x0407;\n  t.Yiwnarmenian = 0x0552;\n  t.Ymonospace = 0xff39;\n  t.Ysmall = 0xf779;\n  t.Ytilde = 0x1ef8;\n  t.Yusbigcyrillic = 0x046a;\n  t.Yusbigiotifiedcyrillic = 0x046c;\n  t.Yuslittlecyrillic = 0x0466;\n  t.Yuslittleiotifiedcyrillic = 0x0468;\n  t.Z = 0x005a;\n  t.Zaarmenian = 0x0536;\n  t.Zacute = 0x0179;\n  t.Zcaron = 0x017d;\n  t.Zcaronsmall = 0xf6ff;\n  t.Zcircle = 0x24cf;\n  t.Zcircumflex = 0x1e90;\n  t.Zdot = 0x017b;\n  t.Zdotaccent = 0x017b;\n  t.Zdotbelow = 0x1e92;\n  t.Zecyrillic = 0x0417;\n  t.Zedescendercyrillic = 0x0498;\n  t.Zedieresiscyrillic = 0x04de;\n  t.Zeta = 0x0396;\n  t.Zhearmenian = 0x053a;\n  t.Zhebrevecyrillic = 0x04c1;\n  t.Zhecyrillic = 0x0416;\n  t.Zhedescendercyrillic = 0x0496;\n  t.Zhedieresiscyrillic = 0x04dc;\n  t.Zlinebelow = 0x1e94;\n  t.Zmonospace = 0xff3a;\n  t.Zsmall = 0xf77a;\n  t.Zstroke = 0x01b5;\n  t.a = 0x0061;\n  t.aabengali = 0x0986;\n  t.aacute = 0x00e1;\n  t.aadeva = 0x0906;\n  t.aagujarati = 0x0a86;\n  t.aagurmukhi = 0x0a06;\n  t.aamatragurmukhi = 0x0a3e;\n  t.aarusquare = 0x3303;\n  t.aavowelsignbengali = 0x09be;\n  t.aavowelsigndeva = 0x093e;\n  t.aavowelsigngujarati = 0x0abe;\n  t.abbreviationmarkarmenian = 0x055f;\n  t.abbreviationsigndeva = 0x0970;\n  t.abengali = 0x0985;\n  t.abopomofo = 0x311a;\n  t.abreve = 0x0103;\n  t.abreveacute = 0x1eaf;\n  t.abrevecyrillic = 0x04d1;\n  t.abrevedotbelow = 0x1eb7;\n  t.abrevegrave = 0x1eb1;\n  t.abrevehookabove = 0x1eb3;\n  t.abrevetilde = 0x1eb5;\n  t.acaron = 0x01ce;\n  t.acircle = 0x24d0;\n  t.acircumflex = 0x00e2;\n  t.acircumflexacute = 0x1ea5;\n  t.acircumflexdotbelow = 0x1ead;\n  t.acircumflexgrave = 0x1ea7;\n  t.acircumflexhookabove = 0x1ea9;\n  t.acircumflextilde = 0x1eab;\n  t.acute = 0x00b4;\n  t.acutebelowcmb = 0x0317;\n  t.acutecmb = 0x0301;\n  t.acutecomb = 0x0301;\n  t.acutedeva = 0x0954;\n  t.acutelowmod = 0x02cf;\n  t.acutetonecmb = 0x0341;\n  t.acyrillic = 0x0430;\n  t.adblgrave = 0x0201;\n  t.addakgurmukhi = 0x0a71;\n  t.adeva = 0x0905;\n  t.adieresis = 0x00e4;\n  t.adieresiscyrillic = 0x04d3;\n  t.adieresismacron = 0x01df;\n  t.adotbelow = 0x1ea1;\n  t.adotmacron = 0x01e1;\n  t.ae = 0x00e6;\n  t.aeacute = 0x01fd;\n  t.aekorean = 0x3150;\n  t.aemacron = 0x01e3;\n  t.afii00208 = 0x2015;\n  t.afii08941 = 0x20a4;\n  t.afii10017 = 0x0410;\n  t.afii10018 = 0x0411;\n  t.afii10019 = 0x0412;\n  t.afii10020 = 0x0413;\n  t.afii10021 = 0x0414;\n  t.afii10022 = 0x0415;\n  t.afii10023 = 0x0401;\n  t.afii10024 = 0x0416;\n  t.afii10025 = 0x0417;\n  t.afii10026 = 0x0418;\n  t.afii10027 = 0x0419;\n  t.afii10028 = 0x041a;\n  t.afii10029 = 0x041b;\n  t.afii10030 = 0x041c;\n  t.afii10031 = 0x041d;\n  t.afii10032 = 0x041e;\n  t.afii10033 = 0x041f;\n  t.afii10034 = 0x0420;\n  t.afii10035 = 0x0421;\n  t.afii10036 = 0x0422;\n  t.afii10037 = 0x0423;\n  t.afii10038 = 0x0424;\n  t.afii10039 = 0x0425;\n  t.afii10040 = 0x0426;\n  t.afii10041 = 0x0427;\n  t.afii10042 = 0x0428;\n  t.afii10043 = 0x0429;\n  t.afii10044 = 0x042a;\n  t.afii10045 = 0x042b;\n  t.afii10046 = 0x042c;\n  t.afii10047 = 0x042d;\n  t.afii10048 = 0x042e;\n  t.afii10049 = 0x042f;\n  t.afii10050 = 0x0490;\n  t.afii10051 = 0x0402;\n  t.afii10052 = 0x0403;\n  t.afii10053 = 0x0404;\n  t.afii10054 = 0x0405;\n  t.afii10055 = 0x0406;\n  t.afii10056 = 0x0407;\n  t.afii10057 = 0x0408;\n  t.afii10058 = 0x0409;\n  t.afii10059 = 0x040a;\n  t.afii10060 = 0x040b;\n  t.afii10061 = 0x040c;\n  t.afii10062 = 0x040e;\n  t.afii10063 = 0xf6c4;\n  t.afii10064 = 0xf6c5;\n  t.afii10065 = 0x0430;\n  t.afii10066 = 0x0431;\n  t.afii10067 = 0x0432;\n  t.afii10068 = 0x0433;\n  t.afii10069 = 0x0434;\n  t.afii10070 = 0x0435;\n  t.afii10071 = 0x0451;\n  t.afii10072 = 0x0436;\n  t.afii10073 = 0x0437;\n  t.afii10074 = 0x0438;\n  t.afii10075 = 0x0439;\n  t.afii10076 = 0x043a;\n  t.afii10077 = 0x043b;\n  t.afii10078 = 0x043c;\n  t.afii10079 = 0x043d;\n  t.afii10080 = 0x043e;\n  t.afii10081 = 0x043f;\n  t.afii10082 = 0x0440;\n  t.afii10083 = 0x0441;\n  t.afii10084 = 0x0442;\n  t.afii10085 = 0x0443;\n  t.afii10086 = 0x0444;\n  t.afii10087 = 0x0445;\n  t.afii10088 = 0x0446;\n  t.afii10089 = 0x0447;\n  t.afii10090 = 0x0448;\n  t.afii10091 = 0x0449;\n  t.afii10092 = 0x044a;\n  t.afii10093 = 0x044b;\n  t.afii10094 = 0x044c;\n  t.afii10095 = 0x044d;\n  t.afii10096 = 0x044e;\n  t.afii10097 = 0x044f;\n  t.afii10098 = 0x0491;\n  t.afii10099 = 0x0452;\n  t.afii10100 = 0x0453;\n  t.afii10101 = 0x0454;\n  t.afii10102 = 0x0455;\n  t.afii10103 = 0x0456;\n  t.afii10104 = 0x0457;\n  t.afii10105 = 0x0458;\n  t.afii10106 = 0x0459;\n  t.afii10107 = 0x045a;\n  t.afii10108 = 0x045b;\n  t.afii10109 = 0x045c;\n  t.afii10110 = 0x045e;\n  t.afii10145 = 0x040f;\n  t.afii10146 = 0x0462;\n  t.afii10147 = 0x0472;\n  t.afii10148 = 0x0474;\n  t.afii10192 = 0xf6c6;\n  t.afii10193 = 0x045f;\n  t.afii10194 = 0x0463;\n  t.afii10195 = 0x0473;\n  t.afii10196 = 0x0475;\n  t.afii10831 = 0xf6c7;\n  t.afii10832 = 0xf6c8;\n  t.afii10846 = 0x04d9;\n  t.afii299 = 0x200e;\n  t.afii300 = 0x200f;\n  t.afii301 = 0x200d;\n  t.afii57381 = 0x066a;\n  t.afii57388 = 0x060c;\n  t.afii57392 = 0x0660;\n  t.afii57393 = 0x0661;\n  t.afii57394 = 0x0662;\n  t.afii57395 = 0x0663;\n  t.afii57396 = 0x0664;\n  t.afii57397 = 0x0665;\n  t.afii57398 = 0x0666;\n  t.afii57399 = 0x0667;\n  t.afii57400 = 0x0668;\n  t.afii57401 = 0x0669;\n  t.afii57403 = 0x061b;\n  t.afii57407 = 0x061f;\n  t.afii57409 = 0x0621;\n  t.afii57410 = 0x0622;\n  t.afii57411 = 0x0623;\n  t.afii57412 = 0x0624;\n  t.afii57413 = 0x0625;\n  t.afii57414 = 0x0626;\n  t.afii57415 = 0x0627;\n  t.afii57416 = 0x0628;\n  t.afii57417 = 0x0629;\n  t.afii57418 = 0x062a;\n  t.afii57419 = 0x062b;\n  t.afii57420 = 0x062c;\n  t.afii57421 = 0x062d;\n  t.afii57422 = 0x062e;\n  t.afii57423 = 0x062f;\n  t.afii57424 = 0x0630;\n  t.afii57425 = 0x0631;\n  t.afii57426 = 0x0632;\n  t.afii57427 = 0x0633;\n  t.afii57428 = 0x0634;\n  t.afii57429 = 0x0635;\n  t.afii57430 = 0x0636;\n  t.afii57431 = 0x0637;\n  t.afii57432 = 0x0638;\n  t.afii57433 = 0x0639;\n  t.afii57434 = 0x063a;\n  t.afii57440 = 0x0640;\n  t.afii57441 = 0x0641;\n  t.afii57442 = 0x0642;\n  t.afii57443 = 0x0643;\n  t.afii57444 = 0x0644;\n  t.afii57445 = 0x0645;\n  t.afii57446 = 0x0646;\n  t.afii57448 = 0x0648;\n  t.afii57449 = 0x0649;\n  t.afii57450 = 0x064a;\n  t.afii57451 = 0x064b;\n  t.afii57452 = 0x064c;\n  t.afii57453 = 0x064d;\n  t.afii57454 = 0x064e;\n  t.afii57455 = 0x064f;\n  t.afii57456 = 0x0650;\n  t.afii57457 = 0x0651;\n  t.afii57458 = 0x0652;\n  t.afii57470 = 0x0647;\n  t.afii57505 = 0x06a4;\n  t.afii57506 = 0x067e;\n  t.afii57507 = 0x0686;\n  t.afii57508 = 0x0698;\n  t.afii57509 = 0x06af;\n  t.afii57511 = 0x0679;\n  t.afii57512 = 0x0688;\n  t.afii57513 = 0x0691;\n  t.afii57514 = 0x06ba;\n  t.afii57519 = 0x06d2;\n  t.afii57534 = 0x06d5;\n  t.afii57636 = 0x20aa;\n  t.afii57645 = 0x05be;\n  t.afii57658 = 0x05c3;\n  t.afii57664 = 0x05d0;\n  t.afii57665 = 0x05d1;\n  t.afii57666 = 0x05d2;\n  t.afii57667 = 0x05d3;\n  t.afii57668 = 0x05d4;\n  t.afii57669 = 0x05d5;\n  t.afii57670 = 0x05d6;\n  t.afii57671 = 0x05d7;\n  t.afii57672 = 0x05d8;\n  t.afii57673 = 0x05d9;\n  t.afii57674 = 0x05da;\n  t.afii57675 = 0x05db;\n  t.afii57676 = 0x05dc;\n  t.afii57677 = 0x05dd;\n  t.afii57678 = 0x05de;\n  t.afii57679 = 0x05df;\n  t.afii57680 = 0x05e0;\n  t.afii57681 = 0x05e1;\n  t.afii57682 = 0x05e2;\n  t.afii57683 = 0x05e3;\n  t.afii57684 = 0x05e4;\n  t.afii57685 = 0x05e5;\n  t.afii57686 = 0x05e6;\n  t.afii57687 = 0x05e7;\n  t.afii57688 = 0x05e8;\n  t.afii57689 = 0x05e9;\n  t.afii57690 = 0x05ea;\n  t.afii57694 = 0xfb2a;\n  t.afii57695 = 0xfb2b;\n  t.afii57700 = 0xfb4b;\n  t.afii57705 = 0xfb1f;\n  t.afii57716 = 0x05f0;\n  t.afii57717 = 0x05f1;\n  t.afii57718 = 0x05f2;\n  t.afii57723 = 0xfb35;\n  t.afii57793 = 0x05b4;\n  t.afii57794 = 0x05b5;\n  t.afii57795 = 0x05b6;\n  t.afii57796 = 0x05bb;\n  t.afii57797 = 0x05b8;\n  t.afii57798 = 0x05b7;\n  t.afii57799 = 0x05b0;\n  t.afii57800 = 0x05b2;\n  t.afii57801 = 0x05b1;\n  t.afii57802 = 0x05b3;\n  t.afii57803 = 0x05c2;\n  t.afii57804 = 0x05c1;\n  t.afii57806 = 0x05b9;\n  t.afii57807 = 0x05bc;\n  t.afii57839 = 0x05bd;\n  t.afii57841 = 0x05bf;\n  t.afii57842 = 0x05c0;\n  t.afii57929 = 0x02bc;\n  t.afii61248 = 0x2105;\n  t.afii61289 = 0x2113;\n  t.afii61352 = 0x2116;\n  t.afii61573 = 0x202c;\n  t.afii61574 = 0x202d;\n  t.afii61575 = 0x202e;\n  t.afii61664 = 0x200c;\n  t.afii63167 = 0x066d;\n  t.afii64937 = 0x02bd;\n  t.agrave = 0x00e0;\n  t.agujarati = 0x0a85;\n  t.agurmukhi = 0x0a05;\n  t.ahiragana = 0x3042;\n  t.ahookabove = 0x1ea3;\n  t.aibengali = 0x0990;\n  t.aibopomofo = 0x311e;\n  t.aideva = 0x0910;\n  t.aiecyrillic = 0x04d5;\n  t.aigujarati = 0x0a90;\n  t.aigurmukhi = 0x0a10;\n  t.aimatragurmukhi = 0x0a48;\n  t.ainarabic = 0x0639;\n  t.ainfinalarabic = 0xfeca;\n  t.aininitialarabic = 0xfecb;\n  t.ainmedialarabic = 0xfecc;\n  t.ainvertedbreve = 0x0203;\n  t.aivowelsignbengali = 0x09c8;\n  t.aivowelsigndeva = 0x0948;\n  t.aivowelsigngujarati = 0x0ac8;\n  t.akatakana = 0x30a2;\n  t.akatakanahalfwidth = 0xff71;\n  t.akorean = 0x314f;\n  t.alef = 0x05d0;\n  t.alefarabic = 0x0627;\n  t.alefdageshhebrew = 0xfb30;\n  t.aleffinalarabic = 0xfe8e;\n  t.alefhamzaabovearabic = 0x0623;\n  t.alefhamzaabovefinalarabic = 0xfe84;\n  t.alefhamzabelowarabic = 0x0625;\n  t.alefhamzabelowfinalarabic = 0xfe88;\n  t.alefhebrew = 0x05d0;\n  t.aleflamedhebrew = 0xfb4f;\n  t.alefmaddaabovearabic = 0x0622;\n  t.alefmaddaabovefinalarabic = 0xfe82;\n  t.alefmaksuraarabic = 0x0649;\n  t.alefmaksurafinalarabic = 0xfef0;\n  t.alefmaksurainitialarabic = 0xfef3;\n  t.alefmaksuramedialarabic = 0xfef4;\n  t.alefpatahhebrew = 0xfb2e;\n  t.alefqamatshebrew = 0xfb2f;\n  t.aleph = 0x2135;\n  t.allequal = 0x224c;\n  t.alpha = 0x03b1;\n  t.alphatonos = 0x03ac;\n  t.amacron = 0x0101;\n  t.amonospace = 0xff41;\n  t.ampersand = 0x0026;\n  t.ampersandmonospace = 0xff06;\n  t.ampersandsmall = 0xf726;\n  t.amsquare = 0x33c2;\n  t.anbopomofo = 0x3122;\n  t.angbopomofo = 0x3124;\n  t.angbracketleft = 0x3008; // Glyph is missing from Adobe's original list.\n  t.angbracketright = 0x3009; // Glyph is missing from Adobe's original list.\n  t.angkhankhuthai = 0x0e5a;\n  t.angle = 0x2220;\n  t.anglebracketleft = 0x3008;\n  t.anglebracketleftvertical = 0xfe3f;\n  t.anglebracketright = 0x3009;\n  t.anglebracketrightvertical = 0xfe40;\n  t.angleleft = 0x2329;\n  t.angleright = 0x232a;\n  t.angstrom = 0x212b;\n  t.anoteleia = 0x0387;\n  t.anudattadeva = 0x0952;\n  t.anusvarabengali = 0x0982;\n  t.anusvaradeva = 0x0902;\n  t.anusvaragujarati = 0x0a82;\n  t.aogonek = 0x0105;\n  t.apaatosquare = 0x3300;\n  t.aparen = 0x249c;\n  t.apostrophearmenian = 0x055a;\n  t.apostrophemod = 0x02bc;\n  t.apple = 0xf8ff;\n  t.approaches = 0x2250;\n  t.approxequal = 0x2248;\n  t.approxequalorimage = 0x2252;\n  t.approximatelyequal = 0x2245;\n  t.araeaekorean = 0x318e;\n  t.araeakorean = 0x318d;\n  t.arc = 0x2312;\n  t.arighthalfring = 0x1e9a;\n  t.aring = 0x00e5;\n  t.aringacute = 0x01fb;\n  t.aringbelow = 0x1e01;\n  t.arrowboth = 0x2194;\n  t.arrowdashdown = 0x21e3;\n  t.arrowdashleft = 0x21e0;\n  t.arrowdashright = 0x21e2;\n  t.arrowdashup = 0x21e1;\n  t.arrowdblboth = 0x21d4;\n  t.arrowdbldown = 0x21d3;\n  t.arrowdblleft = 0x21d0;\n  t.arrowdblright = 0x21d2;\n  t.arrowdblup = 0x21d1;\n  t.arrowdown = 0x2193;\n  t.arrowdownleft = 0x2199;\n  t.arrowdownright = 0x2198;\n  t.arrowdownwhite = 0x21e9;\n  t.arrowheaddownmod = 0x02c5;\n  t.arrowheadleftmod = 0x02c2;\n  t.arrowheadrightmod = 0x02c3;\n  t.arrowheadupmod = 0x02c4;\n  t.arrowhorizex = 0xf8e7;\n  t.arrowleft = 0x2190;\n  t.arrowleftdbl = 0x21d0;\n  t.arrowleftdblstroke = 0x21cd;\n  t.arrowleftoverright = 0x21c6;\n  t.arrowleftwhite = 0x21e6;\n  t.arrowright = 0x2192;\n  t.arrowrightdblstroke = 0x21cf;\n  t.arrowrightheavy = 0x279e;\n  t.arrowrightoverleft = 0x21c4;\n  t.arrowrightwhite = 0x21e8;\n  t.arrowtableft = 0x21e4;\n  t.arrowtabright = 0x21e5;\n  t.arrowup = 0x2191;\n  t.arrowupdn = 0x2195;\n  t.arrowupdnbse = 0x21a8;\n  t.arrowupdownbase = 0x21a8;\n  t.arrowupleft = 0x2196;\n  t.arrowupleftofdown = 0x21c5;\n  t.arrowupright = 0x2197;\n  t.arrowupwhite = 0x21e7;\n  t.arrowvertex = 0xf8e6;\n  t.asciicircum = 0x005e;\n  t.asciicircummonospace = 0xff3e;\n  t.asciitilde = 0x007e;\n  t.asciitildemonospace = 0xff5e;\n  t.ascript = 0x0251;\n  t.ascriptturned = 0x0252;\n  t.asmallhiragana = 0x3041;\n  t.asmallkatakana = 0x30a1;\n  t.asmallkatakanahalfwidth = 0xff67;\n  t.asterisk = 0x002a;\n  t.asteriskaltonearabic = 0x066d;\n  t.asteriskarabic = 0x066d;\n  t.asteriskmath = 0x2217;\n  t.asteriskmonospace = 0xff0a;\n  t.asterisksmall = 0xfe61;\n  t.asterism = 0x2042;\n  t.asuperior = 0xf6e9;\n  t.asymptoticallyequal = 0x2243;\n  t.at = 0x0040;\n  t.atilde = 0x00e3;\n  t.atmonospace = 0xff20;\n  t.atsmall = 0xfe6b;\n  t.aturned = 0x0250;\n  t.aubengali = 0x0994;\n  t.aubopomofo = 0x3120;\n  t.audeva = 0x0914;\n  t.augujarati = 0x0a94;\n  t.augurmukhi = 0x0a14;\n  t.aulengthmarkbengali = 0x09d7;\n  t.aumatragurmukhi = 0x0a4c;\n  t.auvowelsignbengali = 0x09cc;\n  t.auvowelsigndeva = 0x094c;\n  t.auvowelsigngujarati = 0x0acc;\n  t.avagrahadeva = 0x093d;\n  t.aybarmenian = 0x0561;\n  t.ayin = 0x05e2;\n  t.ayinaltonehebrew = 0xfb20;\n  t.ayinhebrew = 0x05e2;\n  t.b = 0x0062;\n  t.babengali = 0x09ac;\n  t.backslash = 0x005c;\n  t.backslashmonospace = 0xff3c;\n  t.badeva = 0x092c;\n  t.bagujarati = 0x0aac;\n  t.bagurmukhi = 0x0a2c;\n  t.bahiragana = 0x3070;\n  t.bahtthai = 0x0e3f;\n  t.bakatakana = 0x30d0;\n  t.bar = 0x007c;\n  t.barmonospace = 0xff5c;\n  t.bbopomofo = 0x3105;\n  t.bcircle = 0x24d1;\n  t.bdotaccent = 0x1e03;\n  t.bdotbelow = 0x1e05;\n  t.beamedsixteenthnotes = 0x266c;\n  t.because = 0x2235;\n  t.becyrillic = 0x0431;\n  t.beharabic = 0x0628;\n  t.behfinalarabic = 0xfe90;\n  t.behinitialarabic = 0xfe91;\n  t.behiragana = 0x3079;\n  t.behmedialarabic = 0xfe92;\n  t.behmeeminitialarabic = 0xfc9f;\n  t.behmeemisolatedarabic = 0xfc08;\n  t.behnoonfinalarabic = 0xfc6d;\n  t.bekatakana = 0x30d9;\n  t.benarmenian = 0x0562;\n  t.bet = 0x05d1;\n  t.beta = 0x03b2;\n  t.betasymbolgreek = 0x03d0;\n  t.betdagesh = 0xfb31;\n  t.betdageshhebrew = 0xfb31;\n  t.bethebrew = 0x05d1;\n  t.betrafehebrew = 0xfb4c;\n  t.bhabengali = 0x09ad;\n  t.bhadeva = 0x092d;\n  t.bhagujarati = 0x0aad;\n  t.bhagurmukhi = 0x0a2d;\n  t.bhook = 0x0253;\n  t.bihiragana = 0x3073;\n  t.bikatakana = 0x30d3;\n  t.bilabialclick = 0x0298;\n  t.bindigurmukhi = 0x0a02;\n  t.birusquare = 0x3331;\n  t.blackcircle = 0x25cf;\n  t.blackdiamond = 0x25c6;\n  t.blackdownpointingtriangle = 0x25bc;\n  t.blackleftpointingpointer = 0x25c4;\n  t.blackleftpointingtriangle = 0x25c0;\n  t.blacklenticularbracketleft = 0x3010;\n  t.blacklenticularbracketleftvertical = 0xfe3b;\n  t.blacklenticularbracketright = 0x3011;\n  t.blacklenticularbracketrightvertical = 0xfe3c;\n  t.blacklowerlefttriangle = 0x25e3;\n  t.blacklowerrighttriangle = 0x25e2;\n  t.blackrectangle = 0x25ac;\n  t.blackrightpointingpointer = 0x25ba;\n  t.blackrightpointingtriangle = 0x25b6;\n  t.blacksmallsquare = 0x25aa;\n  t.blacksmilingface = 0x263b;\n  t.blacksquare = 0x25a0;\n  t.blackstar = 0x2605;\n  t.blackupperlefttriangle = 0x25e4;\n  t.blackupperrighttriangle = 0x25e5;\n  t.blackuppointingsmalltriangle = 0x25b4;\n  t.blackuppointingtriangle = 0x25b2;\n  t.blank = 0x2423;\n  t.blinebelow = 0x1e07;\n  t.block = 0x2588;\n  t.bmonospace = 0xff42;\n  t.bobaimaithai = 0x0e1a;\n  t.bohiragana = 0x307c;\n  t.bokatakana = 0x30dc;\n  t.bparen = 0x249d;\n  t.bqsquare = 0x33c3;\n  t.braceex = 0xf8f4;\n  t.braceleft = 0x007b;\n  t.braceleftbt = 0xf8f3;\n  t.braceleftmid = 0xf8f2;\n  t.braceleftmonospace = 0xff5b;\n  t.braceleftsmall = 0xfe5b;\n  t.bracelefttp = 0xf8f1;\n  t.braceleftvertical = 0xfe37;\n  t.braceright = 0x007d;\n  t.bracerightbt = 0xf8fe;\n  t.bracerightmid = 0xf8fd;\n  t.bracerightmonospace = 0xff5d;\n  t.bracerightsmall = 0xfe5c;\n  t.bracerighttp = 0xf8fc;\n  t.bracerightvertical = 0xfe38;\n  t.bracketleft = 0x005b;\n  t.bracketleftbt = 0xf8f0;\n  t.bracketleftex = 0xf8ef;\n  t.bracketleftmonospace = 0xff3b;\n  t.bracketlefttp = 0xf8ee;\n  t.bracketright = 0x005d;\n  t.bracketrightbt = 0xf8fb;\n  t.bracketrightex = 0xf8fa;\n  t.bracketrightmonospace = 0xff3d;\n  t.bracketrighttp = 0xf8f9;\n  t.breve = 0x02d8;\n  t.brevebelowcmb = 0x032e;\n  t.brevecmb = 0x0306;\n  t.breveinvertedbelowcmb = 0x032f;\n  t.breveinvertedcmb = 0x0311;\n  t.breveinverteddoublecmb = 0x0361;\n  t.bridgebelowcmb = 0x032a;\n  t.bridgeinvertedbelowcmb = 0x033a;\n  t.brokenbar = 0x00a6;\n  t.bstroke = 0x0180;\n  t.bsuperior = 0xf6ea;\n  t.btopbar = 0x0183;\n  t.buhiragana = 0x3076;\n  t.bukatakana = 0x30d6;\n  t.bullet = 0x2022;\n  t.bulletinverse = 0x25d8;\n  t.bulletoperator = 0x2219;\n  t.bullseye = 0x25ce;\n  t.c = 0x0063;\n  t.caarmenian = 0x056e;\n  t.cabengali = 0x099a;\n  t.cacute = 0x0107;\n  t.cadeva = 0x091a;\n  t.cagujarati = 0x0a9a;\n  t.cagurmukhi = 0x0a1a;\n  t.calsquare = 0x3388;\n  t.candrabindubengali = 0x0981;\n  t.candrabinducmb = 0x0310;\n  t.candrabindudeva = 0x0901;\n  t.candrabindugujarati = 0x0a81;\n  t.capslock = 0x21ea;\n  t.careof = 0x2105;\n  t.caron = 0x02c7;\n  t.caronbelowcmb = 0x032c;\n  t.caroncmb = 0x030c;\n  t.carriagereturn = 0x21b5;\n  t.cbopomofo = 0x3118;\n  t.ccaron = 0x010d;\n  t.ccedilla = 0x00e7;\n  t.ccedillaacute = 0x1e09;\n  t.ccircle = 0x24d2;\n  t.ccircumflex = 0x0109;\n  t.ccurl = 0x0255;\n  t.cdot = 0x010b;\n  t.cdotaccent = 0x010b;\n  t.cdsquare = 0x33c5;\n  t.cedilla = 0x00b8;\n  t.cedillacmb = 0x0327;\n  t.cent = 0x00a2;\n  t.centigrade = 0x2103;\n  t.centinferior = 0xf6df;\n  t.centmonospace = 0xffe0;\n  t.centoldstyle = 0xf7a2;\n  t.centsuperior = 0xf6e0;\n  t.chaarmenian = 0x0579;\n  t.chabengali = 0x099b;\n  t.chadeva = 0x091b;\n  t.chagujarati = 0x0a9b;\n  t.chagurmukhi = 0x0a1b;\n  t.chbopomofo = 0x3114;\n  t.cheabkhasiancyrillic = 0x04bd;\n  t.checkmark = 0x2713;\n  t.checyrillic = 0x0447;\n  t.chedescenderabkhasiancyrillic = 0x04bf;\n  t.chedescendercyrillic = 0x04b7;\n  t.chedieresiscyrillic = 0x04f5;\n  t.cheharmenian = 0x0573;\n  t.chekhakassiancyrillic = 0x04cc;\n  t.cheverticalstrokecyrillic = 0x04b9;\n  t.chi = 0x03c7;\n  t.chieuchacirclekorean = 0x3277;\n  t.chieuchaparenkorean = 0x3217;\n  t.chieuchcirclekorean = 0x3269;\n  t.chieuchkorean = 0x314a;\n  t.chieuchparenkorean = 0x3209;\n  t.chochangthai = 0x0e0a;\n  t.chochanthai = 0x0e08;\n  t.chochingthai = 0x0e09;\n  t.chochoethai = 0x0e0c;\n  t.chook = 0x0188;\n  t.cieucacirclekorean = 0x3276;\n  t.cieucaparenkorean = 0x3216;\n  t.cieuccirclekorean = 0x3268;\n  t.cieuckorean = 0x3148;\n  t.cieucparenkorean = 0x3208;\n  t.cieucuparenkorean = 0x321c;\n  t.circle = 0x25cb;\n  t.circlecopyrt = 0x00a9; // Glyph is missing from Adobe's original list.\n  t.circlemultiply = 0x2297;\n  t.circleot = 0x2299;\n  t.circleplus = 0x2295;\n  t.circlepostalmark = 0x3036;\n  t.circlewithlefthalfblack = 0x25d0;\n  t.circlewithrighthalfblack = 0x25d1;\n  t.circumflex = 0x02c6;\n  t.circumflexbelowcmb = 0x032d;\n  t.circumflexcmb = 0x0302;\n  t.clear = 0x2327;\n  t.clickalveolar = 0x01c2;\n  t.clickdental = 0x01c0;\n  t.clicklateral = 0x01c1;\n  t.clickretroflex = 0x01c3;\n  t.club = 0x2663;\n  t.clubsuitblack = 0x2663;\n  t.clubsuitwhite = 0x2667;\n  t.cmcubedsquare = 0x33a4;\n  t.cmonospace = 0xff43;\n  t.cmsquaredsquare = 0x33a0;\n  t.coarmenian = 0x0581;\n  t.colon = 0x003a;\n  t.colonmonetary = 0x20a1;\n  t.colonmonospace = 0xff1a;\n  t.colonsign = 0x20a1;\n  t.colonsmall = 0xfe55;\n  t.colontriangularhalfmod = 0x02d1;\n  t.colontriangularmod = 0x02d0;\n  t.comma = 0x002c;\n  t.commaabovecmb = 0x0313;\n  t.commaaboverightcmb = 0x0315;\n  t.commaaccent = 0xf6c3;\n  t.commaarabic = 0x060c;\n  t.commaarmenian = 0x055d;\n  t.commainferior = 0xf6e1;\n  t.commamonospace = 0xff0c;\n  t.commareversedabovecmb = 0x0314;\n  t.commareversedmod = 0x02bd;\n  t.commasmall = 0xfe50;\n  t.commasuperior = 0xf6e2;\n  t.commaturnedabovecmb = 0x0312;\n  t.commaturnedmod = 0x02bb;\n  t.compass = 0x263c;\n  t.congruent = 0x2245;\n  t.contourintegral = 0x222e;\n  t.control = 0x2303;\n  t.controlACK = 0x0006;\n  t.controlBEL = 0x0007;\n  t.controlBS = 0x0008;\n  t.controlCAN = 0x0018;\n  t.controlCR = 0x000d;\n  t.controlDC1 = 0x0011;\n  t.controlDC2 = 0x0012;\n  t.controlDC3 = 0x0013;\n  t.controlDC4 = 0x0014;\n  t.controlDEL = 0x007f;\n  t.controlDLE = 0x0010;\n  t.controlEM = 0x0019;\n  t.controlENQ = 0x0005;\n  t.controlEOT = 0x0004;\n  t.controlESC = 0x001b;\n  t.controlETB = 0x0017;\n  t.controlETX = 0x0003;\n  t.controlFF = 0x000c;\n  t.controlFS = 0x001c;\n  t.controlGS = 0x001d;\n  t.controlHT = 0x0009;\n  t.controlLF = 0x000a;\n  t.controlNAK = 0x0015;\n  t.controlNULL = 0x0000; // Glyph is missing from Adobe's original list.\n  t.controlRS = 0x001e;\n  t.controlSI = 0x000f;\n  t.controlSO = 0x000e;\n  t.controlSOT = 0x0002;\n  t.controlSTX = 0x0001;\n  t.controlSUB = 0x001a;\n  t.controlSYN = 0x0016;\n  t.controlUS = 0x001f;\n  t.controlVT = 0x000b;\n  t.copyright = 0x00a9;\n  t.copyrightsans = 0xf8e9;\n  t.copyrightserif = 0xf6d9;\n  t.cornerbracketleft = 0x300c;\n  t.cornerbracketlefthalfwidth = 0xff62;\n  t.cornerbracketleftvertical = 0xfe41;\n  t.cornerbracketright = 0x300d;\n  t.cornerbracketrighthalfwidth = 0xff63;\n  t.cornerbracketrightvertical = 0xfe42;\n  t.corporationsquare = 0x337f;\n  t.cosquare = 0x33c7;\n  t.coverkgsquare = 0x33c6;\n  t.cparen = 0x249e;\n  t.cruzeiro = 0x20a2;\n  t.cstretched = 0x0297;\n  t.curlyand = 0x22cf;\n  t.curlyor = 0x22ce;\n  t.currency = 0x00a4;\n  t.cyrBreve = 0xf6d1;\n  t.cyrFlex = 0xf6d2;\n  t.cyrbreve = 0xf6d4;\n  t.cyrflex = 0xf6d5;\n  t.d = 0x0064;\n  t.daarmenian = 0x0564;\n  t.dabengali = 0x09a6;\n  t.dadarabic = 0x0636;\n  t.dadeva = 0x0926;\n  t.dadfinalarabic = 0xfebe;\n  t.dadinitialarabic = 0xfebf;\n  t.dadmedialarabic = 0xfec0;\n  t.dagesh = 0x05bc;\n  t.dageshhebrew = 0x05bc;\n  t.dagger = 0x2020;\n  t.daggerdbl = 0x2021;\n  t.dagujarati = 0x0aa6;\n  t.dagurmukhi = 0x0a26;\n  t.dahiragana = 0x3060;\n  t.dakatakana = 0x30c0;\n  t.dalarabic = 0x062f;\n  t.dalet = 0x05d3;\n  t.daletdagesh = 0xfb33;\n  t.daletdageshhebrew = 0xfb33;\n  t.dalethebrew = 0x05d3;\n  t.dalfinalarabic = 0xfeaa;\n  t.dammaarabic = 0x064f;\n  t.dammalowarabic = 0x064f;\n  t.dammatanaltonearabic = 0x064c;\n  t.dammatanarabic = 0x064c;\n  t.danda = 0x0964;\n  t.dargahebrew = 0x05a7;\n  t.dargalefthebrew = 0x05a7;\n  t.dasiapneumatacyrilliccmb = 0x0485;\n  t.dblGrave = 0xf6d3;\n  t.dblanglebracketleft = 0x300a;\n  t.dblanglebracketleftvertical = 0xfe3d;\n  t.dblanglebracketright = 0x300b;\n  t.dblanglebracketrightvertical = 0xfe3e;\n  t.dblarchinvertedbelowcmb = 0x032b;\n  t.dblarrowleft = 0x21d4;\n  t.dblarrowright = 0x21d2;\n  t.dbldanda = 0x0965;\n  t.dblgrave = 0xf6d6;\n  t.dblgravecmb = 0x030f;\n  t.dblintegral = 0x222c;\n  t.dbllowline = 0x2017;\n  t.dbllowlinecmb = 0x0333;\n  t.dbloverlinecmb = 0x033f;\n  t.dblprimemod = 0x02ba;\n  t.dblverticalbar = 0x2016;\n  t.dblverticallineabovecmb = 0x030e;\n  t.dbopomofo = 0x3109;\n  t.dbsquare = 0x33c8;\n  t.dcaron = 0x010f;\n  t.dcedilla = 0x1e11;\n  t.dcircle = 0x24d3;\n  t.dcircumflexbelow = 0x1e13;\n  t.dcroat = 0x0111;\n  t.ddabengali = 0x09a1;\n  t.ddadeva = 0x0921;\n  t.ddagujarati = 0x0aa1;\n  t.ddagurmukhi = 0x0a21;\n  t.ddalarabic = 0x0688;\n  t.ddalfinalarabic = 0xfb89;\n  t.dddhadeva = 0x095c;\n  t.ddhabengali = 0x09a2;\n  t.ddhadeva = 0x0922;\n  t.ddhagujarati = 0x0aa2;\n  t.ddhagurmukhi = 0x0a22;\n  t.ddotaccent = 0x1e0b;\n  t.ddotbelow = 0x1e0d;\n  t.decimalseparatorarabic = 0x066b;\n  t.decimalseparatorpersian = 0x066b;\n  t.decyrillic = 0x0434;\n  t.degree = 0x00b0;\n  t.dehihebrew = 0x05ad;\n  t.dehiragana = 0x3067;\n  t.deicoptic = 0x03ef;\n  t.dekatakana = 0x30c7;\n  t.deleteleft = 0x232b;\n  t.deleteright = 0x2326;\n  t.delta = 0x03b4;\n  t.deltaturned = 0x018d;\n  t.denominatorminusonenumeratorbengali = 0x09f8;\n  t.dezh = 0x02a4;\n  t.dhabengali = 0x09a7;\n  t.dhadeva = 0x0927;\n  t.dhagujarati = 0x0aa7;\n  t.dhagurmukhi = 0x0a27;\n  t.dhook = 0x0257;\n  t.dialytikatonos = 0x0385;\n  t.dialytikatonoscmb = 0x0344;\n  t.diamond = 0x2666;\n  t.diamondsuitwhite = 0x2662;\n  t.dieresis = 0x00a8;\n  t.dieresisacute = 0xf6d7;\n  t.dieresisbelowcmb = 0x0324;\n  t.dieresiscmb = 0x0308;\n  t.dieresisgrave = 0xf6d8;\n  t.dieresistonos = 0x0385;\n  t.dihiragana = 0x3062;\n  t.dikatakana = 0x30c2;\n  t.dittomark = 0x3003;\n  t.divide = 0x00f7;\n  t.divides = 0x2223;\n  t.divisionslash = 0x2215;\n  t.djecyrillic = 0x0452;\n  t.dkshade = 0x2593;\n  t.dlinebelow = 0x1e0f;\n  t.dlsquare = 0x3397;\n  t.dmacron = 0x0111;\n  t.dmonospace = 0xff44;\n  t.dnblock = 0x2584;\n  t.dochadathai = 0x0e0e;\n  t.dodekthai = 0x0e14;\n  t.dohiragana = 0x3069;\n  t.dokatakana = 0x30c9;\n  t.dollar = 0x0024;\n  t.dollarinferior = 0xf6e3;\n  t.dollarmonospace = 0xff04;\n  t.dollaroldstyle = 0xf724;\n  t.dollarsmall = 0xfe69;\n  t.dollarsuperior = 0xf6e4;\n  t.dong = 0x20ab;\n  t.dorusquare = 0x3326;\n  t.dotaccent = 0x02d9;\n  t.dotaccentcmb = 0x0307;\n  t.dotbelowcmb = 0x0323;\n  t.dotbelowcomb = 0x0323;\n  t.dotkatakana = 0x30fb;\n  t.dotlessi = 0x0131;\n  t.dotlessj = 0xf6be;\n  t.dotlessjstrokehook = 0x0284;\n  t.dotmath = 0x22c5;\n  t.dottedcircle = 0x25cc;\n  t.doubleyodpatah = 0xfb1f;\n  t.doubleyodpatahhebrew = 0xfb1f;\n  t.downtackbelowcmb = 0x031e;\n  t.downtackmod = 0x02d5;\n  t.dparen = 0x249f;\n  t.dsuperior = 0xf6eb;\n  t.dtail = 0x0256;\n  t.dtopbar = 0x018c;\n  t.duhiragana = 0x3065;\n  t.dukatakana = 0x30c5;\n  t.dz = 0x01f3;\n  t.dzaltone = 0x02a3;\n  t.dzcaron = 0x01c6;\n  t.dzcurl = 0x02a5;\n  t.dzeabkhasiancyrillic = 0x04e1;\n  t.dzecyrillic = 0x0455;\n  t.dzhecyrillic = 0x045f;\n  t.e = 0x0065;\n  t.eacute = 0x00e9;\n  t.earth = 0x2641;\n  t.ebengali = 0x098f;\n  t.ebopomofo = 0x311c;\n  t.ebreve = 0x0115;\n  t.ecandradeva = 0x090d;\n  t.ecandragujarati = 0x0a8d;\n  t.ecandravowelsigndeva = 0x0945;\n  t.ecandravowelsigngujarati = 0x0ac5;\n  t.ecaron = 0x011b;\n  t.ecedillabreve = 0x1e1d;\n  t.echarmenian = 0x0565;\n  t.echyiwnarmenian = 0x0587;\n  t.ecircle = 0x24d4;\n  t.ecircumflex = 0x00ea;\n  t.ecircumflexacute = 0x1ebf;\n  t.ecircumflexbelow = 0x1e19;\n  t.ecircumflexdotbelow = 0x1ec7;\n  t.ecircumflexgrave = 0x1ec1;\n  t.ecircumflexhookabove = 0x1ec3;\n  t.ecircumflextilde = 0x1ec5;\n  t.ecyrillic = 0x0454;\n  t.edblgrave = 0x0205;\n  t.edeva = 0x090f;\n  t.edieresis = 0x00eb;\n  t.edot = 0x0117;\n  t.edotaccent = 0x0117;\n  t.edotbelow = 0x1eb9;\n  t.eegurmukhi = 0x0a0f;\n  t.eematragurmukhi = 0x0a47;\n  t.efcyrillic = 0x0444;\n  t.egrave = 0x00e8;\n  t.egujarati = 0x0a8f;\n  t.eharmenian = 0x0567;\n  t.ehbopomofo = 0x311d;\n  t.ehiragana = 0x3048;\n  t.ehookabove = 0x1ebb;\n  t.eibopomofo = 0x311f;\n  t.eight = 0x0038;\n  t.eightarabic = 0x0668;\n  t.eightbengali = 0x09ee;\n  t.eightcircle = 0x2467;\n  t.eightcircleinversesansserif = 0x2791;\n  t.eightdeva = 0x096e;\n  t.eighteencircle = 0x2471;\n  t.eighteenparen = 0x2485;\n  t.eighteenperiod = 0x2499;\n  t.eightgujarati = 0x0aee;\n  t.eightgurmukhi = 0x0a6e;\n  t.eighthackarabic = 0x0668;\n  t.eighthangzhou = 0x3028;\n  t.eighthnotebeamed = 0x266b;\n  t.eightideographicparen = 0x3227;\n  t.eightinferior = 0x2088;\n  t.eightmonospace = 0xff18;\n  t.eightoldstyle = 0xf738;\n  t.eightparen = 0x247b;\n  t.eightperiod = 0x248f;\n  t.eightpersian = 0x06f8;\n  t.eightroman = 0x2177;\n  t.eightsuperior = 0x2078;\n  t.eightthai = 0x0e58;\n  t.einvertedbreve = 0x0207;\n  t.eiotifiedcyrillic = 0x0465;\n  t.ekatakana = 0x30a8;\n  t.ekatakanahalfwidth = 0xff74;\n  t.ekonkargurmukhi = 0x0a74;\n  t.ekorean = 0x3154;\n  t.elcyrillic = 0x043b;\n  t.element = 0x2208;\n  t.elevencircle = 0x246a;\n  t.elevenparen = 0x247e;\n  t.elevenperiod = 0x2492;\n  t.elevenroman = 0x217a;\n  t.ellipsis = 0x2026;\n  t.ellipsisvertical = 0x22ee;\n  t.emacron = 0x0113;\n  t.emacronacute = 0x1e17;\n  t.emacrongrave = 0x1e15;\n  t.emcyrillic = 0x043c;\n  t.emdash = 0x2014;\n  t.emdashvertical = 0xfe31;\n  t.emonospace = 0xff45;\n  t.emphasismarkarmenian = 0x055b;\n  t.emptyset = 0x2205;\n  t.enbopomofo = 0x3123;\n  t.encyrillic = 0x043d;\n  t.endash = 0x2013;\n  t.endashvertical = 0xfe32;\n  t.endescendercyrillic = 0x04a3;\n  t.eng = 0x014b;\n  t.engbopomofo = 0x3125;\n  t.enghecyrillic = 0x04a5;\n  t.enhookcyrillic = 0x04c8;\n  t.enspace = 0x2002;\n  t.eogonek = 0x0119;\n  t.eokorean = 0x3153;\n  t.eopen = 0x025b;\n  t.eopenclosed = 0x029a;\n  t.eopenreversed = 0x025c;\n  t.eopenreversedclosed = 0x025e;\n  t.eopenreversedhook = 0x025d;\n  t.eparen = 0x24a0;\n  t.epsilon = 0x03b5;\n  t.epsilontonos = 0x03ad;\n  t.equal = 0x003d;\n  t.equalmonospace = 0xff1d;\n  t.equalsmall = 0xfe66;\n  t.equalsuperior = 0x207c;\n  t.equivalence = 0x2261;\n  t.erbopomofo = 0x3126;\n  t.ercyrillic = 0x0440;\n  t.ereversed = 0x0258;\n  t.ereversedcyrillic = 0x044d;\n  t.escyrillic = 0x0441;\n  t.esdescendercyrillic = 0x04ab;\n  t.esh = 0x0283;\n  t.eshcurl = 0x0286;\n  t.eshortdeva = 0x090e;\n  t.eshortvowelsigndeva = 0x0946;\n  t.eshreversedloop = 0x01aa;\n  t.eshsquatreversed = 0x0285;\n  t.esmallhiragana = 0x3047;\n  t.esmallkatakana = 0x30a7;\n  t.esmallkatakanahalfwidth = 0xff6a;\n  t.estimated = 0x212e;\n  t.esuperior = 0xf6ec;\n  t.eta = 0x03b7;\n  t.etarmenian = 0x0568;\n  t.etatonos = 0x03ae;\n  t.eth = 0x00f0;\n  t.etilde = 0x1ebd;\n  t.etildebelow = 0x1e1b;\n  t.etnahtafoukhhebrew = 0x0591;\n  t.etnahtafoukhlefthebrew = 0x0591;\n  t.etnahtahebrew = 0x0591;\n  t.etnahtalefthebrew = 0x0591;\n  t.eturned = 0x01dd;\n  t.eukorean = 0x3161;\n  t.euro = 0x20ac;\n  t.evowelsignbengali = 0x09c7;\n  t.evowelsigndeva = 0x0947;\n  t.evowelsigngujarati = 0x0ac7;\n  t.exclam = 0x0021;\n  t.exclamarmenian = 0x055c;\n  t.exclamdbl = 0x203c;\n  t.exclamdown = 0x00a1;\n  t.exclamdownsmall = 0xf7a1;\n  t.exclammonospace = 0xff01;\n  t.exclamsmall = 0xf721;\n  t.existential = 0x2203;\n  t.ezh = 0x0292;\n  t.ezhcaron = 0x01ef;\n  t.ezhcurl = 0x0293;\n  t.ezhreversed = 0x01b9;\n  t.ezhtail = 0x01ba;\n  t.f = 0x0066;\n  t.fadeva = 0x095e;\n  t.fagurmukhi = 0x0a5e;\n  t.fahrenheit = 0x2109;\n  t.fathaarabic = 0x064e;\n  t.fathalowarabic = 0x064e;\n  t.fathatanarabic = 0x064b;\n  t.fbopomofo = 0x3108;\n  t.fcircle = 0x24d5;\n  t.fdotaccent = 0x1e1f;\n  t.feharabic = 0x0641;\n  t.feharmenian = 0x0586;\n  t.fehfinalarabic = 0xfed2;\n  t.fehinitialarabic = 0xfed3;\n  t.fehmedialarabic = 0xfed4;\n  t.feicoptic = 0x03e5;\n  t.female = 0x2640;\n  t.ff = 0xfb00;\n  t.f_f = 0xfb00;\n  t.ffi = 0xfb03;\n  t.f_f_i = 0xfb03;\n  t.ffl = 0xfb04;\n  t.f_f_l = 0xfb04;\n  t.fi = 0xfb01;\n  t.f_i = 0xfb01;\n  t.fifteencircle = 0x246e;\n  t.fifteenparen = 0x2482;\n  t.fifteenperiod = 0x2496;\n  t.figuredash = 0x2012;\n  t.filledbox = 0x25a0;\n  t.filledrect = 0x25ac;\n  t.finalkaf = 0x05da;\n  t.finalkafdagesh = 0xfb3a;\n  t.finalkafdageshhebrew = 0xfb3a;\n  t.finalkafhebrew = 0x05da;\n  t.finalmem = 0x05dd;\n  t.finalmemhebrew = 0x05dd;\n  t.finalnun = 0x05df;\n  t.finalnunhebrew = 0x05df;\n  t.finalpe = 0x05e3;\n  t.finalpehebrew = 0x05e3;\n  t.finaltsadi = 0x05e5;\n  t.finaltsadihebrew = 0x05e5;\n  t.firsttonechinese = 0x02c9;\n  t.fisheye = 0x25c9;\n  t.fitacyrillic = 0x0473;\n  t.five = 0x0035;\n  t.fivearabic = 0x0665;\n  t.fivebengali = 0x09eb;\n  t.fivecircle = 0x2464;\n  t.fivecircleinversesansserif = 0x278e;\n  t.fivedeva = 0x096b;\n  t.fiveeighths = 0x215d;\n  t.fivegujarati = 0x0aeb;\n  t.fivegurmukhi = 0x0a6b;\n  t.fivehackarabic = 0x0665;\n  t.fivehangzhou = 0x3025;\n  t.fiveideographicparen = 0x3224;\n  t.fiveinferior = 0x2085;\n  t.fivemonospace = 0xff15;\n  t.fiveoldstyle = 0xf735;\n  t.fiveparen = 0x2478;\n  t.fiveperiod = 0x248c;\n  t.fivepersian = 0x06f5;\n  t.fiveroman = 0x2174;\n  t.fivesuperior = 0x2075;\n  t.fivethai = 0x0e55;\n  t.fl = 0xfb02;\n  t.f_l = 0xfb02;\n  t.florin = 0x0192;\n  t.fmonospace = 0xff46;\n  t.fmsquare = 0x3399;\n  t.fofanthai = 0x0e1f;\n  t.fofathai = 0x0e1d;\n  t.fongmanthai = 0x0e4f;\n  t.forall = 0x2200;\n  t.four = 0x0034;\n  t.fourarabic = 0x0664;\n  t.fourbengali = 0x09ea;\n  t.fourcircle = 0x2463;\n  t.fourcircleinversesansserif = 0x278d;\n  t.fourdeva = 0x096a;\n  t.fourgujarati = 0x0aea;\n  t.fourgurmukhi = 0x0a6a;\n  t.fourhackarabic = 0x0664;\n  t.fourhangzhou = 0x3024;\n  t.fourideographicparen = 0x3223;\n  t.fourinferior = 0x2084;\n  t.fourmonospace = 0xff14;\n  t.fournumeratorbengali = 0x09f7;\n  t.fouroldstyle = 0xf734;\n  t.fourparen = 0x2477;\n  t.fourperiod = 0x248b;\n  t.fourpersian = 0x06f4;\n  t.fourroman = 0x2173;\n  t.foursuperior = 0x2074;\n  t.fourteencircle = 0x246d;\n  t.fourteenparen = 0x2481;\n  t.fourteenperiod = 0x2495;\n  t.fourthai = 0x0e54;\n  t.fourthtonechinese = 0x02cb;\n  t.fparen = 0x24a1;\n  t.fraction = 0x2044;\n  t.franc = 0x20a3;\n  t.g = 0x0067;\n  t.gabengali = 0x0997;\n  t.gacute = 0x01f5;\n  t.gadeva = 0x0917;\n  t.gafarabic = 0x06af;\n  t.gaffinalarabic = 0xfb93;\n  t.gafinitialarabic = 0xfb94;\n  t.gafmedialarabic = 0xfb95;\n  t.gagujarati = 0x0a97;\n  t.gagurmukhi = 0x0a17;\n  t.gahiragana = 0x304c;\n  t.gakatakana = 0x30ac;\n  t.gamma = 0x03b3;\n  t.gammalatinsmall = 0x0263;\n  t.gammasuperior = 0x02e0;\n  t.gangiacoptic = 0x03eb;\n  t.gbopomofo = 0x310d;\n  t.gbreve = 0x011f;\n  t.gcaron = 0x01e7;\n  t.gcedilla = 0x0123;\n  t.gcircle = 0x24d6;\n  t.gcircumflex = 0x011d;\n  t.gcommaaccent = 0x0123;\n  t.gdot = 0x0121;\n  t.gdotaccent = 0x0121;\n  t.gecyrillic = 0x0433;\n  t.gehiragana = 0x3052;\n  t.gekatakana = 0x30b2;\n  t.geometricallyequal = 0x2251;\n  t.gereshaccenthebrew = 0x059c;\n  t.gereshhebrew = 0x05f3;\n  t.gereshmuqdamhebrew = 0x059d;\n  t.germandbls = 0x00df;\n  t.gershayimaccenthebrew = 0x059e;\n  t.gershayimhebrew = 0x05f4;\n  t.getamark = 0x3013;\n  t.ghabengali = 0x0998;\n  t.ghadarmenian = 0x0572;\n  t.ghadeva = 0x0918;\n  t.ghagujarati = 0x0a98;\n  t.ghagurmukhi = 0x0a18;\n  t.ghainarabic = 0x063a;\n  t.ghainfinalarabic = 0xfece;\n  t.ghaininitialarabic = 0xfecf;\n  t.ghainmedialarabic = 0xfed0;\n  t.ghemiddlehookcyrillic = 0x0495;\n  t.ghestrokecyrillic = 0x0493;\n  t.gheupturncyrillic = 0x0491;\n  t.ghhadeva = 0x095a;\n  t.ghhagurmukhi = 0x0a5a;\n  t.ghook = 0x0260;\n  t.ghzsquare = 0x3393;\n  t.gihiragana = 0x304e;\n  t.gikatakana = 0x30ae;\n  t.gimarmenian = 0x0563;\n  t.gimel = 0x05d2;\n  t.gimeldagesh = 0xfb32;\n  t.gimeldageshhebrew = 0xfb32;\n  t.gimelhebrew = 0x05d2;\n  t.gjecyrillic = 0x0453;\n  t.glottalinvertedstroke = 0x01be;\n  t.glottalstop = 0x0294;\n  t.glottalstopinverted = 0x0296;\n  t.glottalstopmod = 0x02c0;\n  t.glottalstopreversed = 0x0295;\n  t.glottalstopreversedmod = 0x02c1;\n  t.glottalstopreversedsuperior = 0x02e4;\n  t.glottalstopstroke = 0x02a1;\n  t.glottalstopstrokereversed = 0x02a2;\n  t.gmacron = 0x1e21;\n  t.gmonospace = 0xff47;\n  t.gohiragana = 0x3054;\n  t.gokatakana = 0x30b4;\n  t.gparen = 0x24a2;\n  t.gpasquare = 0x33ac;\n  t.gradient = 0x2207;\n  t.grave = 0x0060;\n  t.gravebelowcmb = 0x0316;\n  t.gravecmb = 0x0300;\n  t.gravecomb = 0x0300;\n  t.gravedeva = 0x0953;\n  t.gravelowmod = 0x02ce;\n  t.gravemonospace = 0xff40;\n  t.gravetonecmb = 0x0340;\n  t.greater = 0x003e;\n  t.greaterequal = 0x2265;\n  t.greaterequalorless = 0x22db;\n  t.greatermonospace = 0xff1e;\n  t.greaterorequivalent = 0x2273;\n  t.greaterorless = 0x2277;\n  t.greateroverequal = 0x2267;\n  t.greatersmall = 0xfe65;\n  t.gscript = 0x0261;\n  t.gstroke = 0x01e5;\n  t.guhiragana = 0x3050;\n  t.guillemotleft = 0x00ab;\n  t.guillemotright = 0x00bb;\n  t.guilsinglleft = 0x2039;\n  t.guilsinglright = 0x203a;\n  t.gukatakana = 0x30b0;\n  t.guramusquare = 0x3318;\n  t.gysquare = 0x33c9;\n  t.h = 0x0068;\n  t.haabkhasiancyrillic = 0x04a9;\n  t.haaltonearabic = 0x06c1;\n  t.habengali = 0x09b9;\n  t.hadescendercyrillic = 0x04b3;\n  t.hadeva = 0x0939;\n  t.hagujarati = 0x0ab9;\n  t.hagurmukhi = 0x0a39;\n  t.haharabic = 0x062d;\n  t.hahfinalarabic = 0xfea2;\n  t.hahinitialarabic = 0xfea3;\n  t.hahiragana = 0x306f;\n  t.hahmedialarabic = 0xfea4;\n  t.haitusquare = 0x332a;\n  t.hakatakana = 0x30cf;\n  t.hakatakanahalfwidth = 0xff8a;\n  t.halantgurmukhi = 0x0a4d;\n  t.hamzaarabic = 0x0621;\n  t.hamzalowarabic = 0x0621;\n  t.hangulfiller = 0x3164;\n  t.hardsigncyrillic = 0x044a;\n  t.harpoonleftbarbup = 0x21bc;\n  t.harpoonrightbarbup = 0x21c0;\n  t.hasquare = 0x33ca;\n  t.hatafpatah = 0x05b2;\n  t.hatafpatah16 = 0x05b2;\n  t.hatafpatah23 = 0x05b2;\n  t.hatafpatah2f = 0x05b2;\n  t.hatafpatahhebrew = 0x05b2;\n  t.hatafpatahnarrowhebrew = 0x05b2;\n  t.hatafpatahquarterhebrew = 0x05b2;\n  t.hatafpatahwidehebrew = 0x05b2;\n  t.hatafqamats = 0x05b3;\n  t.hatafqamats1b = 0x05b3;\n  t.hatafqamats28 = 0x05b3;\n  t.hatafqamats34 = 0x05b3;\n  t.hatafqamatshebrew = 0x05b3;\n  t.hatafqamatsnarrowhebrew = 0x05b3;\n  t.hatafqamatsquarterhebrew = 0x05b3;\n  t.hatafqamatswidehebrew = 0x05b3;\n  t.hatafsegol = 0x05b1;\n  t.hatafsegol17 = 0x05b1;\n  t.hatafsegol24 = 0x05b1;\n  t.hatafsegol30 = 0x05b1;\n  t.hatafsegolhebrew = 0x05b1;\n  t.hatafsegolnarrowhebrew = 0x05b1;\n  t.hatafsegolquarterhebrew = 0x05b1;\n  t.hatafsegolwidehebrew = 0x05b1;\n  t.hbar = 0x0127;\n  t.hbopomofo = 0x310f;\n  t.hbrevebelow = 0x1e2b;\n  t.hcedilla = 0x1e29;\n  t.hcircle = 0x24d7;\n  t.hcircumflex = 0x0125;\n  t.hdieresis = 0x1e27;\n  t.hdotaccent = 0x1e23;\n  t.hdotbelow = 0x1e25;\n  t.he = 0x05d4;\n  t.heart = 0x2665;\n  t.heartsuitblack = 0x2665;\n  t.heartsuitwhite = 0x2661;\n  t.hedagesh = 0xfb34;\n  t.hedageshhebrew = 0xfb34;\n  t.hehaltonearabic = 0x06c1;\n  t.heharabic = 0x0647;\n  t.hehebrew = 0x05d4;\n  t.hehfinalaltonearabic = 0xfba7;\n  t.hehfinalalttwoarabic = 0xfeea;\n  t.hehfinalarabic = 0xfeea;\n  t.hehhamzaabovefinalarabic = 0xfba5;\n  t.hehhamzaaboveisolatedarabic = 0xfba4;\n  t.hehinitialaltonearabic = 0xfba8;\n  t.hehinitialarabic = 0xfeeb;\n  t.hehiragana = 0x3078;\n  t.hehmedialaltonearabic = 0xfba9;\n  t.hehmedialarabic = 0xfeec;\n  t.heiseierasquare = 0x337b;\n  t.hekatakana = 0x30d8;\n  t.hekatakanahalfwidth = 0xff8d;\n  t.hekutaarusquare = 0x3336;\n  t.henghook = 0x0267;\n  t.herutusquare = 0x3339;\n  t.het = 0x05d7;\n  t.hethebrew = 0x05d7;\n  t.hhook = 0x0266;\n  t.hhooksuperior = 0x02b1;\n  t.hieuhacirclekorean = 0x327b;\n  t.hieuhaparenkorean = 0x321b;\n  t.hieuhcirclekorean = 0x326d;\n  t.hieuhkorean = 0x314e;\n  t.hieuhparenkorean = 0x320d;\n  t.hihiragana = 0x3072;\n  t.hikatakana = 0x30d2;\n  t.hikatakanahalfwidth = 0xff8b;\n  t.hiriq = 0x05b4;\n  t.hiriq14 = 0x05b4;\n  t.hiriq21 = 0x05b4;\n  t.hiriq2d = 0x05b4;\n  t.hiriqhebrew = 0x05b4;\n  t.hiriqnarrowhebrew = 0x05b4;\n  t.hiriqquarterhebrew = 0x05b4;\n  t.hiriqwidehebrew = 0x05b4;\n  t.hlinebelow = 0x1e96;\n  t.hmonospace = 0xff48;\n  t.hoarmenian = 0x0570;\n  t.hohipthai = 0x0e2b;\n  t.hohiragana = 0x307b;\n  t.hokatakana = 0x30db;\n  t.hokatakanahalfwidth = 0xff8e;\n  t.holam = 0x05b9;\n  t.holam19 = 0x05b9;\n  t.holam26 = 0x05b9;\n  t.holam32 = 0x05b9;\n  t.holamhebrew = 0x05b9;\n  t.holamnarrowhebrew = 0x05b9;\n  t.holamquarterhebrew = 0x05b9;\n  t.holamwidehebrew = 0x05b9;\n  t.honokhukthai = 0x0e2e;\n  t.hookabovecomb = 0x0309;\n  t.hookcmb = 0x0309;\n  t.hookpalatalizedbelowcmb = 0x0321;\n  t.hookretroflexbelowcmb = 0x0322;\n  t.hoonsquare = 0x3342;\n  t.horicoptic = 0x03e9;\n  t.horizontalbar = 0x2015;\n  t.horncmb = 0x031b;\n  t.hotsprings = 0x2668;\n  t.house = 0x2302;\n  t.hparen = 0x24a3;\n  t.hsuperior = 0x02b0;\n  t.hturned = 0x0265;\n  t.huhiragana = 0x3075;\n  t.huiitosquare = 0x3333;\n  t.hukatakana = 0x30d5;\n  t.hukatakanahalfwidth = 0xff8c;\n  t.hungarumlaut = 0x02dd;\n  t.hungarumlautcmb = 0x030b;\n  t.hv = 0x0195;\n  t.hyphen = 0x002d;\n  t.hypheninferior = 0xf6e5;\n  t.hyphenmonospace = 0xff0d;\n  t.hyphensmall = 0xfe63;\n  t.hyphensuperior = 0xf6e6;\n  t.hyphentwo = 0x2010;\n  t.i = 0x0069;\n  t.iacute = 0x00ed;\n  t.iacyrillic = 0x044f;\n  t.ibengali = 0x0987;\n  t.ibopomofo = 0x3127;\n  t.ibreve = 0x012d;\n  t.icaron = 0x01d0;\n  t.icircle = 0x24d8;\n  t.icircumflex = 0x00ee;\n  t.icyrillic = 0x0456;\n  t.idblgrave = 0x0209;\n  t.ideographearthcircle = 0x328f;\n  t.ideographfirecircle = 0x328b;\n  t.ideographicallianceparen = 0x323f;\n  t.ideographiccallparen = 0x323a;\n  t.ideographiccentrecircle = 0x32a5;\n  t.ideographicclose = 0x3006;\n  t.ideographiccomma = 0x3001;\n  t.ideographiccommaleft = 0xff64;\n  t.ideographiccongratulationparen = 0x3237;\n  t.ideographiccorrectcircle = 0x32a3;\n  t.ideographicearthparen = 0x322f;\n  t.ideographicenterpriseparen = 0x323d;\n  t.ideographicexcellentcircle = 0x329d;\n  t.ideographicfestivalparen = 0x3240;\n  t.ideographicfinancialcircle = 0x3296;\n  t.ideographicfinancialparen = 0x3236;\n  t.ideographicfireparen = 0x322b;\n  t.ideographichaveparen = 0x3232;\n  t.ideographichighcircle = 0x32a4;\n  t.ideographiciterationmark = 0x3005;\n  t.ideographiclaborcircle = 0x3298;\n  t.ideographiclaborparen = 0x3238;\n  t.ideographicleftcircle = 0x32a7;\n  t.ideographiclowcircle = 0x32a6;\n  t.ideographicmedicinecircle = 0x32a9;\n  t.ideographicmetalparen = 0x322e;\n  t.ideographicmoonparen = 0x322a;\n  t.ideographicnameparen = 0x3234;\n  t.ideographicperiod = 0x3002;\n  t.ideographicprintcircle = 0x329e;\n  t.ideographicreachparen = 0x3243;\n  t.ideographicrepresentparen = 0x3239;\n  t.ideographicresourceparen = 0x323e;\n  t.ideographicrightcircle = 0x32a8;\n  t.ideographicsecretcircle = 0x3299;\n  t.ideographicselfparen = 0x3242;\n  t.ideographicsocietyparen = 0x3233;\n  t.ideographicspace = 0x3000;\n  t.ideographicspecialparen = 0x3235;\n  t.ideographicstockparen = 0x3231;\n  t.ideographicstudyparen = 0x323b;\n  t.ideographicsunparen = 0x3230;\n  t.ideographicsuperviseparen = 0x323c;\n  t.ideographicwaterparen = 0x322c;\n  t.ideographicwoodparen = 0x322d;\n  t.ideographiczero = 0x3007;\n  t.ideographmetalcircle = 0x328e;\n  t.ideographmooncircle = 0x328a;\n  t.ideographnamecircle = 0x3294;\n  t.ideographsuncircle = 0x3290;\n  t.ideographwatercircle = 0x328c;\n  t.ideographwoodcircle = 0x328d;\n  t.ideva = 0x0907;\n  t.idieresis = 0x00ef;\n  t.idieresisacute = 0x1e2f;\n  t.idieresiscyrillic = 0x04e5;\n  t.idotbelow = 0x1ecb;\n  t.iebrevecyrillic = 0x04d7;\n  t.iecyrillic = 0x0435;\n  t.ieungacirclekorean = 0x3275;\n  t.ieungaparenkorean = 0x3215;\n  t.ieungcirclekorean = 0x3267;\n  t.ieungkorean = 0x3147;\n  t.ieungparenkorean = 0x3207;\n  t.igrave = 0x00ec;\n  t.igujarati = 0x0a87;\n  t.igurmukhi = 0x0a07;\n  t.ihiragana = 0x3044;\n  t.ihookabove = 0x1ec9;\n  t.iibengali = 0x0988;\n  t.iicyrillic = 0x0438;\n  t.iideva = 0x0908;\n  t.iigujarati = 0x0a88;\n  t.iigurmukhi = 0x0a08;\n  t.iimatragurmukhi = 0x0a40;\n  t.iinvertedbreve = 0x020b;\n  t.iishortcyrillic = 0x0439;\n  t.iivowelsignbengali = 0x09c0;\n  t.iivowelsigndeva = 0x0940;\n  t.iivowelsigngujarati = 0x0ac0;\n  t.ij = 0x0133;\n  t.ikatakana = 0x30a4;\n  t.ikatakanahalfwidth = 0xff72;\n  t.ikorean = 0x3163;\n  t.ilde = 0x02dc;\n  t.iluyhebrew = 0x05ac;\n  t.imacron = 0x012b;\n  t.imacroncyrillic = 0x04e3;\n  t.imageorapproximatelyequal = 0x2253;\n  t.imatragurmukhi = 0x0a3f;\n  t.imonospace = 0xff49;\n  t.increment = 0x2206;\n  t.infinity = 0x221e;\n  t.iniarmenian = 0x056b;\n  t.integral = 0x222b;\n  t.integralbottom = 0x2321;\n  t.integralbt = 0x2321;\n  t.integralex = 0xf8f5;\n  t.integraltop = 0x2320;\n  t.integraltp = 0x2320;\n  t.intersection = 0x2229;\n  t.intisquare = 0x3305;\n  t.invbullet = 0x25d8;\n  t.invcircle = 0x25d9;\n  t.invsmileface = 0x263b;\n  t.iocyrillic = 0x0451;\n  t.iogonek = 0x012f;\n  t.iota = 0x03b9;\n  t.iotadieresis = 0x03ca;\n  t.iotadieresistonos = 0x0390;\n  t.iotalatin = 0x0269;\n  t.iotatonos = 0x03af;\n  t.iparen = 0x24a4;\n  t.irigurmukhi = 0x0a72;\n  t.ismallhiragana = 0x3043;\n  t.ismallkatakana = 0x30a3;\n  t.ismallkatakanahalfwidth = 0xff68;\n  t.issharbengali = 0x09fa;\n  t.istroke = 0x0268;\n  t.isuperior = 0xf6ed;\n  t.iterationhiragana = 0x309d;\n  t.iterationkatakana = 0x30fd;\n  t.itilde = 0x0129;\n  t.itildebelow = 0x1e2d;\n  t.iubopomofo = 0x3129;\n  t.iucyrillic = 0x044e;\n  t.ivowelsignbengali = 0x09bf;\n  t.ivowelsigndeva = 0x093f;\n  t.ivowelsigngujarati = 0x0abf;\n  t.izhitsacyrillic = 0x0475;\n  t.izhitsadblgravecyrillic = 0x0477;\n  t.j = 0x006a;\n  t.jaarmenian = 0x0571;\n  t.jabengali = 0x099c;\n  t.jadeva = 0x091c;\n  t.jagujarati = 0x0a9c;\n  t.jagurmukhi = 0x0a1c;\n  t.jbopomofo = 0x3110;\n  t.jcaron = 0x01f0;\n  t.jcircle = 0x24d9;\n  t.jcircumflex = 0x0135;\n  t.jcrossedtail = 0x029d;\n  t.jdotlessstroke = 0x025f;\n  t.jecyrillic = 0x0458;\n  t.jeemarabic = 0x062c;\n  t.jeemfinalarabic = 0xfe9e;\n  t.jeeminitialarabic = 0xfe9f;\n  t.jeemmedialarabic = 0xfea0;\n  t.jeharabic = 0x0698;\n  t.jehfinalarabic = 0xfb8b;\n  t.jhabengali = 0x099d;\n  t.jhadeva = 0x091d;\n  t.jhagujarati = 0x0a9d;\n  t.jhagurmukhi = 0x0a1d;\n  t.jheharmenian = 0x057b;\n  t.jis = 0x3004;\n  t.jmonospace = 0xff4a;\n  t.jparen = 0x24a5;\n  t.jsuperior = 0x02b2;\n  t.k = 0x006b;\n  t.kabashkircyrillic = 0x04a1;\n  t.kabengali = 0x0995;\n  t.kacute = 0x1e31;\n  t.kacyrillic = 0x043a;\n  t.kadescendercyrillic = 0x049b;\n  t.kadeva = 0x0915;\n  t.kaf = 0x05db;\n  t.kafarabic = 0x0643;\n  t.kafdagesh = 0xfb3b;\n  t.kafdageshhebrew = 0xfb3b;\n  t.kaffinalarabic = 0xfeda;\n  t.kafhebrew = 0x05db;\n  t.kafinitialarabic = 0xfedb;\n  t.kafmedialarabic = 0xfedc;\n  t.kafrafehebrew = 0xfb4d;\n  t.kagujarati = 0x0a95;\n  t.kagurmukhi = 0x0a15;\n  t.kahiragana = 0x304b;\n  t.kahookcyrillic = 0x04c4;\n  t.kakatakana = 0x30ab;\n  t.kakatakanahalfwidth = 0xff76;\n  t.kappa = 0x03ba;\n  t.kappasymbolgreek = 0x03f0;\n  t.kapyeounmieumkorean = 0x3171;\n  t.kapyeounphieuphkorean = 0x3184;\n  t.kapyeounpieupkorean = 0x3178;\n  t.kapyeounssangpieupkorean = 0x3179;\n  t.karoriisquare = 0x330d;\n  t.kashidaautoarabic = 0x0640;\n  t.kashidaautonosidebearingarabic = 0x0640;\n  t.kasmallkatakana = 0x30f5;\n  t.kasquare = 0x3384;\n  t.kasraarabic = 0x0650;\n  t.kasratanarabic = 0x064d;\n  t.kastrokecyrillic = 0x049f;\n  t.katahiraprolongmarkhalfwidth = 0xff70;\n  t.kaverticalstrokecyrillic = 0x049d;\n  t.kbopomofo = 0x310e;\n  t.kcalsquare = 0x3389;\n  t.kcaron = 0x01e9;\n  t.kcedilla = 0x0137;\n  t.kcircle = 0x24da;\n  t.kcommaaccent = 0x0137;\n  t.kdotbelow = 0x1e33;\n  t.keharmenian = 0x0584;\n  t.kehiragana = 0x3051;\n  t.kekatakana = 0x30b1;\n  t.kekatakanahalfwidth = 0xff79;\n  t.kenarmenian = 0x056f;\n  t.kesmallkatakana = 0x30f6;\n  t.kgreenlandic = 0x0138;\n  t.khabengali = 0x0996;\n  t.khacyrillic = 0x0445;\n  t.khadeva = 0x0916;\n  t.khagujarati = 0x0a96;\n  t.khagurmukhi = 0x0a16;\n  t.khaharabic = 0x062e;\n  t.khahfinalarabic = 0xfea6;\n  t.khahinitialarabic = 0xfea7;\n  t.khahmedialarabic = 0xfea8;\n  t.kheicoptic = 0x03e7;\n  t.khhadeva = 0x0959;\n  t.khhagurmukhi = 0x0a59;\n  t.khieukhacirclekorean = 0x3278;\n  t.khieukhaparenkorean = 0x3218;\n  t.khieukhcirclekorean = 0x326a;\n  t.khieukhkorean = 0x314b;\n  t.khieukhparenkorean = 0x320a;\n  t.khokhaithai = 0x0e02;\n  t.khokhonthai = 0x0e05;\n  t.khokhuatthai = 0x0e03;\n  t.khokhwaithai = 0x0e04;\n  t.khomutthai = 0x0e5b;\n  t.khook = 0x0199;\n  t.khorakhangthai = 0x0e06;\n  t.khzsquare = 0x3391;\n  t.kihiragana = 0x304d;\n  t.kikatakana = 0x30ad;\n  t.kikatakanahalfwidth = 0xff77;\n  t.kiroguramusquare = 0x3315;\n  t.kiromeetorusquare = 0x3316;\n  t.kirosquare = 0x3314;\n  t.kiyeokacirclekorean = 0x326e;\n  t.kiyeokaparenkorean = 0x320e;\n  t.kiyeokcirclekorean = 0x3260;\n  t.kiyeokkorean = 0x3131;\n  t.kiyeokparenkorean = 0x3200;\n  t.kiyeoksioskorean = 0x3133;\n  t.kjecyrillic = 0x045c;\n  t.klinebelow = 0x1e35;\n  t.klsquare = 0x3398;\n  t.kmcubedsquare = 0x33a6;\n  t.kmonospace = 0xff4b;\n  t.kmsquaredsquare = 0x33a2;\n  t.kohiragana = 0x3053;\n  t.kohmsquare = 0x33c0;\n  t.kokaithai = 0x0e01;\n  t.kokatakana = 0x30b3;\n  t.kokatakanahalfwidth = 0xff7a;\n  t.kooposquare = 0x331e;\n  t.koppacyrillic = 0x0481;\n  t.koreanstandardsymbol = 0x327f;\n  t.koroniscmb = 0x0343;\n  t.kparen = 0x24a6;\n  t.kpasquare = 0x33aa;\n  t.ksicyrillic = 0x046f;\n  t.ktsquare = 0x33cf;\n  t.kturned = 0x029e;\n  t.kuhiragana = 0x304f;\n  t.kukatakana = 0x30af;\n  t.kukatakanahalfwidth = 0xff78;\n  t.kvsquare = 0x33b8;\n  t.kwsquare = 0x33be;\n  t.l = 0x006c;\n  t.labengali = 0x09b2;\n  t.lacute = 0x013a;\n  t.ladeva = 0x0932;\n  t.lagujarati = 0x0ab2;\n  t.lagurmukhi = 0x0a32;\n  t.lakkhangyaothai = 0x0e45;\n  t.lamaleffinalarabic = 0xfefc;\n  t.lamalefhamzaabovefinalarabic = 0xfef8;\n  t.lamalefhamzaaboveisolatedarabic = 0xfef7;\n  t.lamalefhamzabelowfinalarabic = 0xfefa;\n  t.lamalefhamzabelowisolatedarabic = 0xfef9;\n  t.lamalefisolatedarabic = 0xfefb;\n  t.lamalefmaddaabovefinalarabic = 0xfef6;\n  t.lamalefmaddaaboveisolatedarabic = 0xfef5;\n  t.lamarabic = 0x0644;\n  t.lambda = 0x03bb;\n  t.lambdastroke = 0x019b;\n  t.lamed = 0x05dc;\n  t.lameddagesh = 0xfb3c;\n  t.lameddageshhebrew = 0xfb3c;\n  t.lamedhebrew = 0x05dc;\n  t.lamfinalarabic = 0xfede;\n  t.lamhahinitialarabic = 0xfcca;\n  t.laminitialarabic = 0xfedf;\n  t.lamjeeminitialarabic = 0xfcc9;\n  t.lamkhahinitialarabic = 0xfccb;\n  t.lamlamhehisolatedarabic = 0xfdf2;\n  t.lammedialarabic = 0xfee0;\n  t.lammeemhahinitialarabic = 0xfd88;\n  t.lammeeminitialarabic = 0xfccc;\n  t.largecircle = 0x25ef;\n  t.lbar = 0x019a;\n  t.lbelt = 0x026c;\n  t.lbopomofo = 0x310c;\n  t.lcaron = 0x013e;\n  t.lcedilla = 0x013c;\n  t.lcircle = 0x24db;\n  t.lcircumflexbelow = 0x1e3d;\n  t.lcommaaccent = 0x013c;\n  t.ldot = 0x0140;\n  t.ldotaccent = 0x0140;\n  t.ldotbelow = 0x1e37;\n  t.ldotbelowmacron = 0x1e39;\n  t.leftangleabovecmb = 0x031a;\n  t.lefttackbelowcmb = 0x0318;\n  t.less = 0x003c;\n  t.lessequal = 0x2264;\n  t.lessequalorgreater = 0x22da;\n  t.lessmonospace = 0xff1c;\n  t.lessorequivalent = 0x2272;\n  t.lessorgreater = 0x2276;\n  t.lessoverequal = 0x2266;\n  t.lesssmall = 0xfe64;\n  t.lezh = 0x026e;\n  t.lfblock = 0x258c;\n  t.lhookretroflex = 0x026d;\n  t.lira = 0x20a4;\n  t.liwnarmenian = 0x056c;\n  t.lj = 0x01c9;\n  t.ljecyrillic = 0x0459;\n  t.ll = 0xf6c0;\n  t.lladeva = 0x0933;\n  t.llagujarati = 0x0ab3;\n  t.llinebelow = 0x1e3b;\n  t.llladeva = 0x0934;\n  t.llvocalicbengali = 0x09e1;\n  t.llvocalicdeva = 0x0961;\n  t.llvocalicvowelsignbengali = 0x09e3;\n  t.llvocalicvowelsigndeva = 0x0963;\n  t.lmiddletilde = 0x026b;\n  t.lmonospace = 0xff4c;\n  t.lmsquare = 0x33d0;\n  t.lochulathai = 0x0e2c;\n  t.logicaland = 0x2227;\n  t.logicalnot = 0x00ac;\n  t.logicalnotreversed = 0x2310;\n  t.logicalor = 0x2228;\n  t.lolingthai = 0x0e25;\n  t.longs = 0x017f;\n  t.lowlinecenterline = 0xfe4e;\n  t.lowlinecmb = 0x0332;\n  t.lowlinedashed = 0xfe4d;\n  t.lozenge = 0x25ca;\n  t.lparen = 0x24a7;\n  t.lslash = 0x0142;\n  t.lsquare = 0x2113;\n  t.lsuperior = 0xf6ee;\n  t.ltshade = 0x2591;\n  t.luthai = 0x0e26;\n  t.lvocalicbengali = 0x098c;\n  t.lvocalicdeva = 0x090c;\n  t.lvocalicvowelsignbengali = 0x09e2;\n  t.lvocalicvowelsigndeva = 0x0962;\n  t.lxsquare = 0x33d3;\n  t.m = 0x006d;\n  t.mabengali = 0x09ae;\n  t.macron = 0x00af;\n  t.macronbelowcmb = 0x0331;\n  t.macroncmb = 0x0304;\n  t.macronlowmod = 0x02cd;\n  t.macronmonospace = 0xffe3;\n  t.macute = 0x1e3f;\n  t.madeva = 0x092e;\n  t.magujarati = 0x0aae;\n  t.magurmukhi = 0x0a2e;\n  t.mahapakhhebrew = 0x05a4;\n  t.mahapakhlefthebrew = 0x05a4;\n  t.mahiragana = 0x307e;\n  t.maichattawalowleftthai = 0xf895;\n  t.maichattawalowrightthai = 0xf894;\n  t.maichattawathai = 0x0e4b;\n  t.maichattawaupperleftthai = 0xf893;\n  t.maieklowleftthai = 0xf88c;\n  t.maieklowrightthai = 0xf88b;\n  t.maiekthai = 0x0e48;\n  t.maiekupperleftthai = 0xf88a;\n  t.maihanakatleftthai = 0xf884;\n  t.maihanakatthai = 0x0e31;\n  t.maitaikhuleftthai = 0xf889;\n  t.maitaikhuthai = 0x0e47;\n  t.maitholowleftthai = 0xf88f;\n  t.maitholowrightthai = 0xf88e;\n  t.maithothai = 0x0e49;\n  t.maithoupperleftthai = 0xf88d;\n  t.maitrilowleftthai = 0xf892;\n  t.maitrilowrightthai = 0xf891;\n  t.maitrithai = 0x0e4a;\n  t.maitriupperleftthai = 0xf890;\n  t.maiyamokthai = 0x0e46;\n  t.makatakana = 0x30de;\n  t.makatakanahalfwidth = 0xff8f;\n  t.male = 0x2642;\n  t.mansyonsquare = 0x3347;\n  t.maqafhebrew = 0x05be;\n  t.mars = 0x2642;\n  t.masoracirclehebrew = 0x05af;\n  t.masquare = 0x3383;\n  t.mbopomofo = 0x3107;\n  t.mbsquare = 0x33d4;\n  t.mcircle = 0x24dc;\n  t.mcubedsquare = 0x33a5;\n  t.mdotaccent = 0x1e41;\n  t.mdotbelow = 0x1e43;\n  t.meemarabic = 0x0645;\n  t.meemfinalarabic = 0xfee2;\n  t.meeminitialarabic = 0xfee3;\n  t.meemmedialarabic = 0xfee4;\n  t.meemmeeminitialarabic = 0xfcd1;\n  t.meemmeemisolatedarabic = 0xfc48;\n  t.meetorusquare = 0x334d;\n  t.mehiragana = 0x3081;\n  t.meizierasquare = 0x337e;\n  t.mekatakana = 0x30e1;\n  t.mekatakanahalfwidth = 0xff92;\n  t.mem = 0x05de;\n  t.memdagesh = 0xfb3e;\n  t.memdageshhebrew = 0xfb3e;\n  t.memhebrew = 0x05de;\n  t.menarmenian = 0x0574;\n  t.merkhahebrew = 0x05a5;\n  t.merkhakefulahebrew = 0x05a6;\n  t.merkhakefulalefthebrew = 0x05a6;\n  t.merkhalefthebrew = 0x05a5;\n  t.mhook = 0x0271;\n  t.mhzsquare = 0x3392;\n  t.middledotkatakanahalfwidth = 0xff65;\n  t.middot = 0x00b7;\n  t.mieumacirclekorean = 0x3272;\n  t.mieumaparenkorean = 0x3212;\n  t.mieumcirclekorean = 0x3264;\n  t.mieumkorean = 0x3141;\n  t.mieumpansioskorean = 0x3170;\n  t.mieumparenkorean = 0x3204;\n  t.mieumpieupkorean = 0x316e;\n  t.mieumsioskorean = 0x316f;\n  t.mihiragana = 0x307f;\n  t.mikatakana = 0x30df;\n  t.mikatakanahalfwidth = 0xff90;\n  t.minus = 0x2212;\n  t.minusbelowcmb = 0x0320;\n  t.minuscircle = 0x2296;\n  t.minusmod = 0x02d7;\n  t.minusplus = 0x2213;\n  t.minute = 0x2032;\n  t.miribaarusquare = 0x334a;\n  t.mirisquare = 0x3349;\n  t.mlonglegturned = 0x0270;\n  t.mlsquare = 0x3396;\n  t.mmcubedsquare = 0x33a3;\n  t.mmonospace = 0xff4d;\n  t.mmsquaredsquare = 0x339f;\n  t.mohiragana = 0x3082;\n  t.mohmsquare = 0x33c1;\n  t.mokatakana = 0x30e2;\n  t.mokatakanahalfwidth = 0xff93;\n  t.molsquare = 0x33d6;\n  t.momathai = 0x0e21;\n  t.moverssquare = 0x33a7;\n  t.moverssquaredsquare = 0x33a8;\n  t.mparen = 0x24a8;\n  t.mpasquare = 0x33ab;\n  t.mssquare = 0x33b3;\n  t.msuperior = 0xf6ef;\n  t.mturned = 0x026f;\n  t.mu = 0x00b5;\n  t.mu1 = 0x00b5;\n  t.muasquare = 0x3382;\n  t.muchgreater = 0x226b;\n  t.muchless = 0x226a;\n  t.mufsquare = 0x338c;\n  t.mugreek = 0x03bc;\n  t.mugsquare = 0x338d;\n  t.muhiragana = 0x3080;\n  t.mukatakana = 0x30e0;\n  t.mukatakanahalfwidth = 0xff91;\n  t.mulsquare = 0x3395;\n  t.multiply = 0x00d7;\n  t.mumsquare = 0x339b;\n  t.munahhebrew = 0x05a3;\n  t.munahlefthebrew = 0x05a3;\n  t.musicalnote = 0x266a;\n  t.musicalnotedbl = 0x266b;\n  t.musicflatsign = 0x266d;\n  t.musicsharpsign = 0x266f;\n  t.mussquare = 0x33b2;\n  t.muvsquare = 0x33b6;\n  t.muwsquare = 0x33bc;\n  t.mvmegasquare = 0x33b9;\n  t.mvsquare = 0x33b7;\n  t.mwmegasquare = 0x33bf;\n  t.mwsquare = 0x33bd;\n  t.n = 0x006e;\n  t.nabengali = 0x09a8;\n  t.nabla = 0x2207;\n  t.nacute = 0x0144;\n  t.nadeva = 0x0928;\n  t.nagujarati = 0x0aa8;\n  t.nagurmukhi = 0x0a28;\n  t.nahiragana = 0x306a;\n  t.nakatakana = 0x30ca;\n  t.nakatakanahalfwidth = 0xff85;\n  t.napostrophe = 0x0149;\n  t.nasquare = 0x3381;\n  t.nbopomofo = 0x310b;\n  t.nbspace = 0x00a0;\n  t.ncaron = 0x0148;\n  t.ncedilla = 0x0146;\n  t.ncircle = 0x24dd;\n  t.ncircumflexbelow = 0x1e4b;\n  t.ncommaaccent = 0x0146;\n  t.ndotaccent = 0x1e45;\n  t.ndotbelow = 0x1e47;\n  t.nehiragana = 0x306d;\n  t.nekatakana = 0x30cd;\n  t.nekatakanahalfwidth = 0xff88;\n  t.newsheqelsign = 0x20aa;\n  t.nfsquare = 0x338b;\n  t.ngabengali = 0x0999;\n  t.ngadeva = 0x0919;\n  t.ngagujarati = 0x0a99;\n  t.ngagurmukhi = 0x0a19;\n  t.ngonguthai = 0x0e07;\n  t.nhiragana = 0x3093;\n  t.nhookleft = 0x0272;\n  t.nhookretroflex = 0x0273;\n  t.nieunacirclekorean = 0x326f;\n  t.nieunaparenkorean = 0x320f;\n  t.nieuncieuckorean = 0x3135;\n  t.nieuncirclekorean = 0x3261;\n  t.nieunhieuhkorean = 0x3136;\n  t.nieunkorean = 0x3134;\n  t.nieunpansioskorean = 0x3168;\n  t.nieunparenkorean = 0x3201;\n  t.nieunsioskorean = 0x3167;\n  t.nieuntikeutkorean = 0x3166;\n  t.nihiragana = 0x306b;\n  t.nikatakana = 0x30cb;\n  t.nikatakanahalfwidth = 0xff86;\n  t.nikhahitleftthai = 0xf899;\n  t.nikhahitthai = 0x0e4d;\n  t.nine = 0x0039;\n  t.ninearabic = 0x0669;\n  t.ninebengali = 0x09ef;\n  t.ninecircle = 0x2468;\n  t.ninecircleinversesansserif = 0x2792;\n  t.ninedeva = 0x096f;\n  t.ninegujarati = 0x0aef;\n  t.ninegurmukhi = 0x0a6f;\n  t.ninehackarabic = 0x0669;\n  t.ninehangzhou = 0x3029;\n  t.nineideographicparen = 0x3228;\n  t.nineinferior = 0x2089;\n  t.ninemonospace = 0xff19;\n  t.nineoldstyle = 0xf739;\n  t.nineparen = 0x247c;\n  t.nineperiod = 0x2490;\n  t.ninepersian = 0x06f9;\n  t.nineroman = 0x2178;\n  t.ninesuperior = 0x2079;\n  t.nineteencircle = 0x2472;\n  t.nineteenparen = 0x2486;\n  t.nineteenperiod = 0x249a;\n  t.ninethai = 0x0e59;\n  t.nj = 0x01cc;\n  t.njecyrillic = 0x045a;\n  t.nkatakana = 0x30f3;\n  t.nkatakanahalfwidth = 0xff9d;\n  t.nlegrightlong = 0x019e;\n  t.nlinebelow = 0x1e49;\n  t.nmonospace = 0xff4e;\n  t.nmsquare = 0x339a;\n  t.nnabengali = 0x09a3;\n  t.nnadeva = 0x0923;\n  t.nnagujarati = 0x0aa3;\n  t.nnagurmukhi = 0x0a23;\n  t.nnnadeva = 0x0929;\n  t.nohiragana = 0x306e;\n  t.nokatakana = 0x30ce;\n  t.nokatakanahalfwidth = 0xff89;\n  t.nonbreakingspace = 0x00a0;\n  t.nonenthai = 0x0e13;\n  t.nonuthai = 0x0e19;\n  t.noonarabic = 0x0646;\n  t.noonfinalarabic = 0xfee6;\n  t.noonghunnaarabic = 0x06ba;\n  t.noonghunnafinalarabic = 0xfb9f;\n  t.nooninitialarabic = 0xfee7;\n  t.noonjeeminitialarabic = 0xfcd2;\n  t.noonjeemisolatedarabic = 0xfc4b;\n  t.noonmedialarabic = 0xfee8;\n  t.noonmeeminitialarabic = 0xfcd5;\n  t.noonmeemisolatedarabic = 0xfc4e;\n  t.noonnoonfinalarabic = 0xfc8d;\n  t.notcontains = 0x220c;\n  t.notelement = 0x2209;\n  t.notelementof = 0x2209;\n  t.notequal = 0x2260;\n  t.notgreater = 0x226f;\n  t.notgreaternorequal = 0x2271;\n  t.notgreaternorless = 0x2279;\n  t.notidentical = 0x2262;\n  t.notless = 0x226e;\n  t.notlessnorequal = 0x2270;\n  t.notparallel = 0x2226;\n  t.notprecedes = 0x2280;\n  t.notsubset = 0x2284;\n  t.notsucceeds = 0x2281;\n  t.notsuperset = 0x2285;\n  t.nowarmenian = 0x0576;\n  t.nparen = 0x24a9;\n  t.nssquare = 0x33b1;\n  t.nsuperior = 0x207f;\n  t.ntilde = 0x00f1;\n  t.nu = 0x03bd;\n  t.nuhiragana = 0x306c;\n  t.nukatakana = 0x30cc;\n  t.nukatakanahalfwidth = 0xff87;\n  t.nuktabengali = 0x09bc;\n  t.nuktadeva = 0x093c;\n  t.nuktagujarati = 0x0abc;\n  t.nuktagurmukhi = 0x0a3c;\n  t.numbersign = 0x0023;\n  t.numbersignmonospace = 0xff03;\n  t.numbersignsmall = 0xfe5f;\n  t.numeralsigngreek = 0x0374;\n  t.numeralsignlowergreek = 0x0375;\n  t.numero = 0x2116;\n  t.nun = 0x05e0;\n  t.nundagesh = 0xfb40;\n  t.nundageshhebrew = 0xfb40;\n  t.nunhebrew = 0x05e0;\n  t.nvsquare = 0x33b5;\n  t.nwsquare = 0x33bb;\n  t.nyabengali = 0x099e;\n  t.nyadeva = 0x091e;\n  t.nyagujarati = 0x0a9e;\n  t.nyagurmukhi = 0x0a1e;\n  t.o = 0x006f;\n  t.oacute = 0x00f3;\n  t.oangthai = 0x0e2d;\n  t.obarred = 0x0275;\n  t.obarredcyrillic = 0x04e9;\n  t.obarreddieresiscyrillic = 0x04eb;\n  t.obengali = 0x0993;\n  t.obopomofo = 0x311b;\n  t.obreve = 0x014f;\n  t.ocandradeva = 0x0911;\n  t.ocandragujarati = 0x0a91;\n  t.ocandravowelsigndeva = 0x0949;\n  t.ocandravowelsigngujarati = 0x0ac9;\n  t.ocaron = 0x01d2;\n  t.ocircle = 0x24de;\n  t.ocircumflex = 0x00f4;\n  t.ocircumflexacute = 0x1ed1;\n  t.ocircumflexdotbelow = 0x1ed9;\n  t.ocircumflexgrave = 0x1ed3;\n  t.ocircumflexhookabove = 0x1ed5;\n  t.ocircumflextilde = 0x1ed7;\n  t.ocyrillic = 0x043e;\n  t.odblacute = 0x0151;\n  t.odblgrave = 0x020d;\n  t.odeva = 0x0913;\n  t.odieresis = 0x00f6;\n  t.odieresiscyrillic = 0x04e7;\n  t.odotbelow = 0x1ecd;\n  t.oe = 0x0153;\n  t.oekorean = 0x315a;\n  t.ogonek = 0x02db;\n  t.ogonekcmb = 0x0328;\n  t.ograve = 0x00f2;\n  t.ogujarati = 0x0a93;\n  t.oharmenian = 0x0585;\n  t.ohiragana = 0x304a;\n  t.ohookabove = 0x1ecf;\n  t.ohorn = 0x01a1;\n  t.ohornacute = 0x1edb;\n  t.ohorndotbelow = 0x1ee3;\n  t.ohorngrave = 0x1edd;\n  t.ohornhookabove = 0x1edf;\n  t.ohorntilde = 0x1ee1;\n  t.ohungarumlaut = 0x0151;\n  t.oi = 0x01a3;\n  t.oinvertedbreve = 0x020f;\n  t.okatakana = 0x30aa;\n  t.okatakanahalfwidth = 0xff75;\n  t.okorean = 0x3157;\n  t.olehebrew = 0x05ab;\n  t.omacron = 0x014d;\n  t.omacronacute = 0x1e53;\n  t.omacrongrave = 0x1e51;\n  t.omdeva = 0x0950;\n  t.omega = 0x03c9;\n  t.omega1 = 0x03d6;\n  t.omegacyrillic = 0x0461;\n  t.omegalatinclosed = 0x0277;\n  t.omegaroundcyrillic = 0x047b;\n  t.omegatitlocyrillic = 0x047d;\n  t.omegatonos = 0x03ce;\n  t.omgujarati = 0x0ad0;\n  t.omicron = 0x03bf;\n  t.omicrontonos = 0x03cc;\n  t.omonospace = 0xff4f;\n  t.one = 0x0031;\n  t.onearabic = 0x0661;\n  t.onebengali = 0x09e7;\n  t.onecircle = 0x2460;\n  t.onecircleinversesansserif = 0x278a;\n  t.onedeva = 0x0967;\n  t.onedotenleader = 0x2024;\n  t.oneeighth = 0x215b;\n  t.onefitted = 0xf6dc;\n  t.onegujarati = 0x0ae7;\n  t.onegurmukhi = 0x0a67;\n  t.onehackarabic = 0x0661;\n  t.onehalf = 0x00bd;\n  t.onehangzhou = 0x3021;\n  t.oneideographicparen = 0x3220;\n  t.oneinferior = 0x2081;\n  t.onemonospace = 0xff11;\n  t.onenumeratorbengali = 0x09f4;\n  t.oneoldstyle = 0xf731;\n  t.oneparen = 0x2474;\n  t.oneperiod = 0x2488;\n  t.onepersian = 0x06f1;\n  t.onequarter = 0x00bc;\n  t.oneroman = 0x2170;\n  t.onesuperior = 0x00b9;\n  t.onethai = 0x0e51;\n  t.onethird = 0x2153;\n  t.oogonek = 0x01eb;\n  t.oogonekmacron = 0x01ed;\n  t.oogurmukhi = 0x0a13;\n  t.oomatragurmukhi = 0x0a4b;\n  t.oopen = 0x0254;\n  t.oparen = 0x24aa;\n  t.openbullet = 0x25e6;\n  t.option = 0x2325;\n  t.ordfeminine = 0x00aa;\n  t.ordmasculine = 0x00ba;\n  t.orthogonal = 0x221f;\n  t.oshortdeva = 0x0912;\n  t.oshortvowelsigndeva = 0x094a;\n  t.oslash = 0x00f8;\n  t.oslashacute = 0x01ff;\n  t.osmallhiragana = 0x3049;\n  t.osmallkatakana = 0x30a9;\n  t.osmallkatakanahalfwidth = 0xff6b;\n  t.ostrokeacute = 0x01ff;\n  t.osuperior = 0xf6f0;\n  t.otcyrillic = 0x047f;\n  t.otilde = 0x00f5;\n  t.otildeacute = 0x1e4d;\n  t.otildedieresis = 0x1e4f;\n  t.oubopomofo = 0x3121;\n  t.overline = 0x203e;\n  t.overlinecenterline = 0xfe4a;\n  t.overlinecmb = 0x0305;\n  t.overlinedashed = 0xfe49;\n  t.overlinedblwavy = 0xfe4c;\n  t.overlinewavy = 0xfe4b;\n  t.overscore = 0x00af;\n  t.ovowelsignbengali = 0x09cb;\n  t.ovowelsigndeva = 0x094b;\n  t.ovowelsigngujarati = 0x0acb;\n  t.p = 0x0070;\n  t.paampssquare = 0x3380;\n  t.paasentosquare = 0x332b;\n  t.pabengali = 0x09aa;\n  t.pacute = 0x1e55;\n  t.padeva = 0x092a;\n  t.pagedown = 0x21df;\n  t.pageup = 0x21de;\n  t.pagujarati = 0x0aaa;\n  t.pagurmukhi = 0x0a2a;\n  t.pahiragana = 0x3071;\n  t.paiyannoithai = 0x0e2f;\n  t.pakatakana = 0x30d1;\n  t.palatalizationcyrilliccmb = 0x0484;\n  t.palochkacyrillic = 0x04c0;\n  t.pansioskorean = 0x317f;\n  t.paragraph = 0x00b6;\n  t.parallel = 0x2225;\n  t.parenleft = 0x0028;\n  t.parenleftaltonearabic = 0xfd3e;\n  t.parenleftbt = 0xf8ed;\n  t.parenleftex = 0xf8ec;\n  t.parenleftinferior = 0x208d;\n  t.parenleftmonospace = 0xff08;\n  t.parenleftsmall = 0xfe59;\n  t.parenleftsuperior = 0x207d;\n  t.parenlefttp = 0xf8eb;\n  t.parenleftvertical = 0xfe35;\n  t.parenright = 0x0029;\n  t.parenrightaltonearabic = 0xfd3f;\n  t.parenrightbt = 0xf8f8;\n  t.parenrightex = 0xf8f7;\n  t.parenrightinferior = 0x208e;\n  t.parenrightmonospace = 0xff09;\n  t.parenrightsmall = 0xfe5a;\n  t.parenrightsuperior = 0x207e;\n  t.parenrighttp = 0xf8f6;\n  t.parenrightvertical = 0xfe36;\n  t.partialdiff = 0x2202;\n  t.paseqhebrew = 0x05c0;\n  t.pashtahebrew = 0x0599;\n  t.pasquare = 0x33a9;\n  t.patah = 0x05b7;\n  t.patah11 = 0x05b7;\n  t.patah1d = 0x05b7;\n  t.patah2a = 0x05b7;\n  t.patahhebrew = 0x05b7;\n  t.patahnarrowhebrew = 0x05b7;\n  t.patahquarterhebrew = 0x05b7;\n  t.patahwidehebrew = 0x05b7;\n  t.pazerhebrew = 0x05a1;\n  t.pbopomofo = 0x3106;\n  t.pcircle = 0x24df;\n  t.pdotaccent = 0x1e57;\n  t.pe = 0x05e4;\n  t.pecyrillic = 0x043f;\n  t.pedagesh = 0xfb44;\n  t.pedageshhebrew = 0xfb44;\n  t.peezisquare = 0x333b;\n  t.pefinaldageshhebrew = 0xfb43;\n  t.peharabic = 0x067e;\n  t.peharmenian = 0x057a;\n  t.pehebrew = 0x05e4;\n  t.pehfinalarabic = 0xfb57;\n  t.pehinitialarabic = 0xfb58;\n  t.pehiragana = 0x307a;\n  t.pehmedialarabic = 0xfb59;\n  t.pekatakana = 0x30da;\n  t.pemiddlehookcyrillic = 0x04a7;\n  t.perafehebrew = 0xfb4e;\n  t.percent = 0x0025;\n  t.percentarabic = 0x066a;\n  t.percentmonospace = 0xff05;\n  t.percentsmall = 0xfe6a;\n  t.period = 0x002e;\n  t.periodarmenian = 0x0589;\n  t.periodcentered = 0x00b7;\n  t.periodhalfwidth = 0xff61;\n  t.periodinferior = 0xf6e7;\n  t.periodmonospace = 0xff0e;\n  t.periodsmall = 0xfe52;\n  t.periodsuperior = 0xf6e8;\n  t.perispomenigreekcmb = 0x0342;\n  t.perpendicular = 0x22a5;\n  t.perthousand = 0x2030;\n  t.peseta = 0x20a7;\n  t.pfsquare = 0x338a;\n  t.phabengali = 0x09ab;\n  t.phadeva = 0x092b;\n  t.phagujarati = 0x0aab;\n  t.phagurmukhi = 0x0a2b;\n  t.phi = 0x03c6;\n  t.phi1 = 0x03d5;\n  t.phieuphacirclekorean = 0x327a;\n  t.phieuphaparenkorean = 0x321a;\n  t.phieuphcirclekorean = 0x326c;\n  t.phieuphkorean = 0x314d;\n  t.phieuphparenkorean = 0x320c;\n  t.philatin = 0x0278;\n  t.phinthuthai = 0x0e3a;\n  t.phisymbolgreek = 0x03d5;\n  t.phook = 0x01a5;\n  t.phophanthai = 0x0e1e;\n  t.phophungthai = 0x0e1c;\n  t.phosamphaothai = 0x0e20;\n  t.pi = 0x03c0;\n  t.pieupacirclekorean = 0x3273;\n  t.pieupaparenkorean = 0x3213;\n  t.pieupcieuckorean = 0x3176;\n  t.pieupcirclekorean = 0x3265;\n  t.pieupkiyeokkorean = 0x3172;\n  t.pieupkorean = 0x3142;\n  t.pieupparenkorean = 0x3205;\n  t.pieupsioskiyeokkorean = 0x3174;\n  t.pieupsioskorean = 0x3144;\n  t.pieupsiostikeutkorean = 0x3175;\n  t.pieupthieuthkorean = 0x3177;\n  t.pieuptikeutkorean = 0x3173;\n  t.pihiragana = 0x3074;\n  t.pikatakana = 0x30d4;\n  t.pisymbolgreek = 0x03d6;\n  t.piwrarmenian = 0x0583;\n  t.planckover2pi = 0x210f;\n  t.planckover2pi1 = 0x210f;\n  t.plus = 0x002b;\n  t.plusbelowcmb = 0x031f;\n  t.pluscircle = 0x2295;\n  t.plusminus = 0x00b1;\n  t.plusmod = 0x02d6;\n  t.plusmonospace = 0xff0b;\n  t.plussmall = 0xfe62;\n  t.plussuperior = 0x207a;\n  t.pmonospace = 0xff50;\n  t.pmsquare = 0x33d8;\n  t.pohiragana = 0x307d;\n  t.pointingindexdownwhite = 0x261f;\n  t.pointingindexleftwhite = 0x261c;\n  t.pointingindexrightwhite = 0x261e;\n  t.pointingindexupwhite = 0x261d;\n  t.pokatakana = 0x30dd;\n  t.poplathai = 0x0e1b;\n  t.postalmark = 0x3012;\n  t.postalmarkface = 0x3020;\n  t.pparen = 0x24ab;\n  t.precedes = 0x227a;\n  t.prescription = 0x211e;\n  t.primemod = 0x02b9;\n  t.primereversed = 0x2035;\n  t.product = 0x220f;\n  t.projective = 0x2305;\n  t.prolongedkana = 0x30fc;\n  t.propellor = 0x2318;\n  t.propersubset = 0x2282;\n  t.propersuperset = 0x2283;\n  t.proportion = 0x2237;\n  t.proportional = 0x221d;\n  t.psi = 0x03c8;\n  t.psicyrillic = 0x0471;\n  t.psilipneumatacyrilliccmb = 0x0486;\n  t.pssquare = 0x33b0;\n  t.puhiragana = 0x3077;\n  t.pukatakana = 0x30d7;\n  t.pvsquare = 0x33b4;\n  t.pwsquare = 0x33ba;\n  t.q = 0x0071;\n  t.qadeva = 0x0958;\n  t.qadmahebrew = 0x05a8;\n  t.qafarabic = 0x0642;\n  t.qaffinalarabic = 0xfed6;\n  t.qafinitialarabic = 0xfed7;\n  t.qafmedialarabic = 0xfed8;\n  t.qamats = 0x05b8;\n  t.qamats10 = 0x05b8;\n  t.qamats1a = 0x05b8;\n  t.qamats1c = 0x05b8;\n  t.qamats27 = 0x05b8;\n  t.qamats29 = 0x05b8;\n  t.qamats33 = 0x05b8;\n  t.qamatsde = 0x05b8;\n  t.qamatshebrew = 0x05b8;\n  t.qamatsnarrowhebrew = 0x05b8;\n  t.qamatsqatanhebrew = 0x05b8;\n  t.qamatsqatannarrowhebrew = 0x05b8;\n  t.qamatsqatanquarterhebrew = 0x05b8;\n  t.qamatsqatanwidehebrew = 0x05b8;\n  t.qamatsquarterhebrew = 0x05b8;\n  t.qamatswidehebrew = 0x05b8;\n  t.qarneyparahebrew = 0x059f;\n  t.qbopomofo = 0x3111;\n  t.qcircle = 0x24e0;\n  t.qhook = 0x02a0;\n  t.qmonospace = 0xff51;\n  t.qof = 0x05e7;\n  t.qofdagesh = 0xfb47;\n  t.qofdageshhebrew = 0xfb47;\n  t.qofhebrew = 0x05e7;\n  t.qparen = 0x24ac;\n  t.quarternote = 0x2669;\n  t.qubuts = 0x05bb;\n  t.qubuts18 = 0x05bb;\n  t.qubuts25 = 0x05bb;\n  t.qubuts31 = 0x05bb;\n  t.qubutshebrew = 0x05bb;\n  t.qubutsnarrowhebrew = 0x05bb;\n  t.qubutsquarterhebrew = 0x05bb;\n  t.qubutswidehebrew = 0x05bb;\n  t.question = 0x003f;\n  t.questionarabic = 0x061f;\n  t.questionarmenian = 0x055e;\n  t.questiondown = 0x00bf;\n  t.questiondownsmall = 0xf7bf;\n  t.questiongreek = 0x037e;\n  t.questionmonospace = 0xff1f;\n  t.questionsmall = 0xf73f;\n  t.quotedbl = 0x0022;\n  t.quotedblbase = 0x201e;\n  t.quotedblleft = 0x201c;\n  t.quotedblmonospace = 0xff02;\n  t.quotedblprime = 0x301e;\n  t.quotedblprimereversed = 0x301d;\n  t.quotedblright = 0x201d;\n  t.quoteleft = 0x2018;\n  t.quoteleftreversed = 0x201b;\n  t.quotereversed = 0x201b;\n  t.quoteright = 0x2019;\n  t.quoterightn = 0x0149;\n  t.quotesinglbase = 0x201a;\n  t.quotesingle = 0x0027;\n  t.quotesinglemonospace = 0xff07;\n  t.r = 0x0072;\n  t.raarmenian = 0x057c;\n  t.rabengali = 0x09b0;\n  t.racute = 0x0155;\n  t.radeva = 0x0930;\n  t.radical = 0x221a;\n  t.radicalex = 0xf8e5;\n  t.radoverssquare = 0x33ae;\n  t.radoverssquaredsquare = 0x33af;\n  t.radsquare = 0x33ad;\n  t.rafe = 0x05bf;\n  t.rafehebrew = 0x05bf;\n  t.ragujarati = 0x0ab0;\n  t.ragurmukhi = 0x0a30;\n  t.rahiragana = 0x3089;\n  t.rakatakana = 0x30e9;\n  t.rakatakanahalfwidth = 0xff97;\n  t.ralowerdiagonalbengali = 0x09f1;\n  t.ramiddlediagonalbengali = 0x09f0;\n  t.ramshorn = 0x0264;\n  t.ratio = 0x2236;\n  t.rbopomofo = 0x3116;\n  t.rcaron = 0x0159;\n  t.rcedilla = 0x0157;\n  t.rcircle = 0x24e1;\n  t.rcommaaccent = 0x0157;\n  t.rdblgrave = 0x0211;\n  t.rdotaccent = 0x1e59;\n  t.rdotbelow = 0x1e5b;\n  t.rdotbelowmacron = 0x1e5d;\n  t.referencemark = 0x203b;\n  t.reflexsubset = 0x2286;\n  t.reflexsuperset = 0x2287;\n  t.registered = 0x00ae;\n  t.registersans = 0xf8e8;\n  t.registerserif = 0xf6da;\n  t.reharabic = 0x0631;\n  t.reharmenian = 0x0580;\n  t.rehfinalarabic = 0xfeae;\n  t.rehiragana = 0x308c;\n  t.rekatakana = 0x30ec;\n  t.rekatakanahalfwidth = 0xff9a;\n  t.resh = 0x05e8;\n  t.reshdageshhebrew = 0xfb48;\n  t.reshhebrew = 0x05e8;\n  t.reversedtilde = 0x223d;\n  t.reviahebrew = 0x0597;\n  t.reviamugrashhebrew = 0x0597;\n  t.revlogicalnot = 0x2310;\n  t.rfishhook = 0x027e;\n  t.rfishhookreversed = 0x027f;\n  t.rhabengali = 0x09dd;\n  t.rhadeva = 0x095d;\n  t.rho = 0x03c1;\n  t.rhook = 0x027d;\n  t.rhookturned = 0x027b;\n  t.rhookturnedsuperior = 0x02b5;\n  t.rhosymbolgreek = 0x03f1;\n  t.rhotichookmod = 0x02de;\n  t.rieulacirclekorean = 0x3271;\n  t.rieulaparenkorean = 0x3211;\n  t.rieulcirclekorean = 0x3263;\n  t.rieulhieuhkorean = 0x3140;\n  t.rieulkiyeokkorean = 0x313a;\n  t.rieulkiyeoksioskorean = 0x3169;\n  t.rieulkorean = 0x3139;\n  t.rieulmieumkorean = 0x313b;\n  t.rieulpansioskorean = 0x316c;\n  t.rieulparenkorean = 0x3203;\n  t.rieulphieuphkorean = 0x313f;\n  t.rieulpieupkorean = 0x313c;\n  t.rieulpieupsioskorean = 0x316b;\n  t.rieulsioskorean = 0x313d;\n  t.rieulthieuthkorean = 0x313e;\n  t.rieultikeutkorean = 0x316a;\n  t.rieulyeorinhieuhkorean = 0x316d;\n  t.rightangle = 0x221f;\n  t.righttackbelowcmb = 0x0319;\n  t.righttriangle = 0x22bf;\n  t.rihiragana = 0x308a;\n  t.rikatakana = 0x30ea;\n  t.rikatakanahalfwidth = 0xff98;\n  t.ring = 0x02da;\n  t.ringbelowcmb = 0x0325;\n  t.ringcmb = 0x030a;\n  t.ringhalfleft = 0x02bf;\n  t.ringhalfleftarmenian = 0x0559;\n  t.ringhalfleftbelowcmb = 0x031c;\n  t.ringhalfleftcentered = 0x02d3;\n  t.ringhalfright = 0x02be;\n  t.ringhalfrightbelowcmb = 0x0339;\n  t.ringhalfrightcentered = 0x02d2;\n  t.rinvertedbreve = 0x0213;\n  t.rittorusquare = 0x3351;\n  t.rlinebelow = 0x1e5f;\n  t.rlongleg = 0x027c;\n  t.rlonglegturned = 0x027a;\n  t.rmonospace = 0xff52;\n  t.rohiragana = 0x308d;\n  t.rokatakana = 0x30ed;\n  t.rokatakanahalfwidth = 0xff9b;\n  t.roruathai = 0x0e23;\n  t.rparen = 0x24ad;\n  t.rrabengali = 0x09dc;\n  t.rradeva = 0x0931;\n  t.rragurmukhi = 0x0a5c;\n  t.rreharabic = 0x0691;\n  t.rrehfinalarabic = 0xfb8d;\n  t.rrvocalicbengali = 0x09e0;\n  t.rrvocalicdeva = 0x0960;\n  t.rrvocalicgujarati = 0x0ae0;\n  t.rrvocalicvowelsignbengali = 0x09c4;\n  t.rrvocalicvowelsigndeva = 0x0944;\n  t.rrvocalicvowelsigngujarati = 0x0ac4;\n  t.rsuperior = 0xf6f1;\n  t.rtblock = 0x2590;\n  t.rturned = 0x0279;\n  t.rturnedsuperior = 0x02b4;\n  t.ruhiragana = 0x308b;\n  t.rukatakana = 0x30eb;\n  t.rukatakanahalfwidth = 0xff99;\n  t.rupeemarkbengali = 0x09f2;\n  t.rupeesignbengali = 0x09f3;\n  t.rupiah = 0xf6dd;\n  t.ruthai = 0x0e24;\n  t.rvocalicbengali = 0x098b;\n  t.rvocalicdeva = 0x090b;\n  t.rvocalicgujarati = 0x0a8b;\n  t.rvocalicvowelsignbengali = 0x09c3;\n  t.rvocalicvowelsigndeva = 0x0943;\n  t.rvocalicvowelsigngujarati = 0x0ac3;\n  t.s = 0x0073;\n  t.sabengali = 0x09b8;\n  t.sacute = 0x015b;\n  t.sacutedotaccent = 0x1e65;\n  t.sadarabic = 0x0635;\n  t.sadeva = 0x0938;\n  t.sadfinalarabic = 0xfeba;\n  t.sadinitialarabic = 0xfebb;\n  t.sadmedialarabic = 0xfebc;\n  t.sagujarati = 0x0ab8;\n  t.sagurmukhi = 0x0a38;\n  t.sahiragana = 0x3055;\n  t.sakatakana = 0x30b5;\n  t.sakatakanahalfwidth = 0xff7b;\n  t.sallallahoualayhewasallamarabic = 0xfdfa;\n  t.samekh = 0x05e1;\n  t.samekhdagesh = 0xfb41;\n  t.samekhdageshhebrew = 0xfb41;\n  t.samekhhebrew = 0x05e1;\n  t.saraaathai = 0x0e32;\n  t.saraaethai = 0x0e41;\n  t.saraaimaimalaithai = 0x0e44;\n  t.saraaimaimuanthai = 0x0e43;\n  t.saraamthai = 0x0e33;\n  t.saraathai = 0x0e30;\n  t.saraethai = 0x0e40;\n  t.saraiileftthai = 0xf886;\n  t.saraiithai = 0x0e35;\n  t.saraileftthai = 0xf885;\n  t.saraithai = 0x0e34;\n  t.saraothai = 0x0e42;\n  t.saraueeleftthai = 0xf888;\n  t.saraueethai = 0x0e37;\n  t.saraueleftthai = 0xf887;\n  t.sarauethai = 0x0e36;\n  t.sarauthai = 0x0e38;\n  t.sarauuthai = 0x0e39;\n  t.sbopomofo = 0x3119;\n  t.scaron = 0x0161;\n  t.scarondotaccent = 0x1e67;\n  t.scedilla = 0x015f;\n  t.schwa = 0x0259;\n  t.schwacyrillic = 0x04d9;\n  t.schwadieresiscyrillic = 0x04db;\n  t.schwahook = 0x025a;\n  t.scircle = 0x24e2;\n  t.scircumflex = 0x015d;\n  t.scommaaccent = 0x0219;\n  t.sdotaccent = 0x1e61;\n  t.sdotbelow = 0x1e63;\n  t.sdotbelowdotaccent = 0x1e69;\n  t.seagullbelowcmb = 0x033c;\n  t.second = 0x2033;\n  t.secondtonechinese = 0x02ca;\n  t.section = 0x00a7;\n  t.seenarabic = 0x0633;\n  t.seenfinalarabic = 0xfeb2;\n  t.seeninitialarabic = 0xfeb3;\n  t.seenmedialarabic = 0xfeb4;\n  t.segol = 0x05b6;\n  t.segol13 = 0x05b6;\n  t.segol1f = 0x05b6;\n  t.segol2c = 0x05b6;\n  t.segolhebrew = 0x05b6;\n  t.segolnarrowhebrew = 0x05b6;\n  t.segolquarterhebrew = 0x05b6;\n  t.segoltahebrew = 0x0592;\n  t.segolwidehebrew = 0x05b6;\n  t.seharmenian = 0x057d;\n  t.sehiragana = 0x305b;\n  t.sekatakana = 0x30bb;\n  t.sekatakanahalfwidth = 0xff7e;\n  t.semicolon = 0x003b;\n  t.semicolonarabic = 0x061b;\n  t.semicolonmonospace = 0xff1b;\n  t.semicolonsmall = 0xfe54;\n  t.semivoicedmarkkana = 0x309c;\n  t.semivoicedmarkkanahalfwidth = 0xff9f;\n  t.sentisquare = 0x3322;\n  t.sentosquare = 0x3323;\n  t.seven = 0x0037;\n  t.sevenarabic = 0x0667;\n  t.sevenbengali = 0x09ed;\n  t.sevencircle = 0x2466;\n  t.sevencircleinversesansserif = 0x2790;\n  t.sevendeva = 0x096d;\n  t.seveneighths = 0x215e;\n  t.sevengujarati = 0x0aed;\n  t.sevengurmukhi = 0x0a6d;\n  t.sevenhackarabic = 0x0667;\n  t.sevenhangzhou = 0x3027;\n  t.sevenideographicparen = 0x3226;\n  t.seveninferior = 0x2087;\n  t.sevenmonospace = 0xff17;\n  t.sevenoldstyle = 0xf737;\n  t.sevenparen = 0x247a;\n  t.sevenperiod = 0x248e;\n  t.sevenpersian = 0x06f7;\n  t.sevenroman = 0x2176;\n  t.sevensuperior = 0x2077;\n  t.seventeencircle = 0x2470;\n  t.seventeenparen = 0x2484;\n  t.seventeenperiod = 0x2498;\n  t.seventhai = 0x0e57;\n  t.sfthyphen = 0x00ad;\n  t.shaarmenian = 0x0577;\n  t.shabengali = 0x09b6;\n  t.shacyrillic = 0x0448;\n  t.shaddaarabic = 0x0651;\n  t.shaddadammaarabic = 0xfc61;\n  t.shaddadammatanarabic = 0xfc5e;\n  t.shaddafathaarabic = 0xfc60;\n  t.shaddakasraarabic = 0xfc62;\n  t.shaddakasratanarabic = 0xfc5f;\n  t.shade = 0x2592;\n  t.shadedark = 0x2593;\n  t.shadelight = 0x2591;\n  t.shademedium = 0x2592;\n  t.shadeva = 0x0936;\n  t.shagujarati = 0x0ab6;\n  t.shagurmukhi = 0x0a36;\n  t.shalshelethebrew = 0x0593;\n  t.shbopomofo = 0x3115;\n  t.shchacyrillic = 0x0449;\n  t.sheenarabic = 0x0634;\n  t.sheenfinalarabic = 0xfeb6;\n  t.sheeninitialarabic = 0xfeb7;\n  t.sheenmedialarabic = 0xfeb8;\n  t.sheicoptic = 0x03e3;\n  t.sheqel = 0x20aa;\n  t.sheqelhebrew = 0x20aa;\n  t.sheva = 0x05b0;\n  t.sheva115 = 0x05b0;\n  t.sheva15 = 0x05b0;\n  t.sheva22 = 0x05b0;\n  t.sheva2e = 0x05b0;\n  t.shevahebrew = 0x05b0;\n  t.shevanarrowhebrew = 0x05b0;\n  t.shevaquarterhebrew = 0x05b0;\n  t.shevawidehebrew = 0x05b0;\n  t.shhacyrillic = 0x04bb;\n  t.shimacoptic = 0x03ed;\n  t.shin = 0x05e9;\n  t.shindagesh = 0xfb49;\n  t.shindageshhebrew = 0xfb49;\n  t.shindageshshindot = 0xfb2c;\n  t.shindageshshindothebrew = 0xfb2c;\n  t.shindageshsindot = 0xfb2d;\n  t.shindageshsindothebrew = 0xfb2d;\n  t.shindothebrew = 0x05c1;\n  t.shinhebrew = 0x05e9;\n  t.shinshindot = 0xfb2a;\n  t.shinshindothebrew = 0xfb2a;\n  t.shinsindot = 0xfb2b;\n  t.shinsindothebrew = 0xfb2b;\n  t.shook = 0x0282;\n  t.sigma = 0x03c3;\n  t.sigma1 = 0x03c2;\n  t.sigmafinal = 0x03c2;\n  t.sigmalunatesymbolgreek = 0x03f2;\n  t.sihiragana = 0x3057;\n  t.sikatakana = 0x30b7;\n  t.sikatakanahalfwidth = 0xff7c;\n  t.siluqhebrew = 0x05bd;\n  t.siluqlefthebrew = 0x05bd;\n  t.similar = 0x223c;\n  t.sindothebrew = 0x05c2;\n  t.siosacirclekorean = 0x3274;\n  t.siosaparenkorean = 0x3214;\n  t.sioscieuckorean = 0x317e;\n  t.sioscirclekorean = 0x3266;\n  t.sioskiyeokkorean = 0x317a;\n  t.sioskorean = 0x3145;\n  t.siosnieunkorean = 0x317b;\n  t.siosparenkorean = 0x3206;\n  t.siospieupkorean = 0x317d;\n  t.siostikeutkorean = 0x317c;\n  t.six = 0x0036;\n  t.sixarabic = 0x0666;\n  t.sixbengali = 0x09ec;\n  t.sixcircle = 0x2465;\n  t.sixcircleinversesansserif = 0x278f;\n  t.sixdeva = 0x096c;\n  t.sixgujarati = 0x0aec;\n  t.sixgurmukhi = 0x0a6c;\n  t.sixhackarabic = 0x0666;\n  t.sixhangzhou = 0x3026;\n  t.sixideographicparen = 0x3225;\n  t.sixinferior = 0x2086;\n  t.sixmonospace = 0xff16;\n  t.sixoldstyle = 0xf736;\n  t.sixparen = 0x2479;\n  t.sixperiod = 0x248d;\n  t.sixpersian = 0x06f6;\n  t.sixroman = 0x2175;\n  t.sixsuperior = 0x2076;\n  t.sixteencircle = 0x246f;\n  t.sixteencurrencydenominatorbengali = 0x09f9;\n  t.sixteenparen = 0x2483;\n  t.sixteenperiod = 0x2497;\n  t.sixthai = 0x0e56;\n  t.slash = 0x002f;\n  t.slashmonospace = 0xff0f;\n  t.slong = 0x017f;\n  t.slongdotaccent = 0x1e9b;\n  t.smileface = 0x263a;\n  t.smonospace = 0xff53;\n  t.sofpasuqhebrew = 0x05c3;\n  t.softhyphen = 0x00ad;\n  t.softsigncyrillic = 0x044c;\n  t.sohiragana = 0x305d;\n  t.sokatakana = 0x30bd;\n  t.sokatakanahalfwidth = 0xff7f;\n  t.soliduslongoverlaycmb = 0x0338;\n  t.solidusshortoverlaycmb = 0x0337;\n  t.sorusithai = 0x0e29;\n  t.sosalathai = 0x0e28;\n  t.sosothai = 0x0e0b;\n  t.sosuathai = 0x0e2a;\n  t.space = 0x0020;\n  t.spacehackarabic = 0x0020;\n  t.spade = 0x2660;\n  t.spadesuitblack = 0x2660;\n  t.spadesuitwhite = 0x2664;\n  t.sparen = 0x24ae;\n  t.squarebelowcmb = 0x033b;\n  t.squarecc = 0x33c4;\n  t.squarecm = 0x339d;\n  t.squarediagonalcrosshatchfill = 0x25a9;\n  t.squarehorizontalfill = 0x25a4;\n  t.squarekg = 0x338f;\n  t.squarekm = 0x339e;\n  t.squarekmcapital = 0x33ce;\n  t.squareln = 0x33d1;\n  t.squarelog = 0x33d2;\n  t.squaremg = 0x338e;\n  t.squaremil = 0x33d5;\n  t.squaremm = 0x339c;\n  t.squaremsquared = 0x33a1;\n  t.squareorthogonalcrosshatchfill = 0x25a6;\n  t.squareupperlefttolowerrightfill = 0x25a7;\n  t.squareupperrighttolowerleftfill = 0x25a8;\n  t.squareverticalfill = 0x25a5;\n  t.squarewhitewithsmallblack = 0x25a3;\n  t.srsquare = 0x33db;\n  t.ssabengali = 0x09b7;\n  t.ssadeva = 0x0937;\n  t.ssagujarati = 0x0ab7;\n  t.ssangcieuckorean = 0x3149;\n  t.ssanghieuhkorean = 0x3185;\n  t.ssangieungkorean = 0x3180;\n  t.ssangkiyeokkorean = 0x3132;\n  t.ssangnieunkorean = 0x3165;\n  t.ssangpieupkorean = 0x3143;\n  t.ssangsioskorean = 0x3146;\n  t.ssangtikeutkorean = 0x3138;\n  t.ssuperior = 0xf6f2;\n  t.sterling = 0x00a3;\n  t.sterlingmonospace = 0xffe1;\n  t.strokelongoverlaycmb = 0x0336;\n  t.strokeshortoverlaycmb = 0x0335;\n  t.subset = 0x2282;\n  t.subsetnotequal = 0x228a;\n  t.subsetorequal = 0x2286;\n  t.succeeds = 0x227b;\n  t.suchthat = 0x220b;\n  t.suhiragana = 0x3059;\n  t.sukatakana = 0x30b9;\n  t.sukatakanahalfwidth = 0xff7d;\n  t.sukunarabic = 0x0652;\n  t.summation = 0x2211;\n  t.sun = 0x263c;\n  t.superset = 0x2283;\n  t.supersetnotequal = 0x228b;\n  t.supersetorequal = 0x2287;\n  t.svsquare = 0x33dc;\n  t.syouwaerasquare = 0x337c;\n  t.t = 0x0074;\n  t.tabengali = 0x09a4;\n  t.tackdown = 0x22a4;\n  t.tackleft = 0x22a3;\n  t.tadeva = 0x0924;\n  t.tagujarati = 0x0aa4;\n  t.tagurmukhi = 0x0a24;\n  t.taharabic = 0x0637;\n  t.tahfinalarabic = 0xfec2;\n  t.tahinitialarabic = 0xfec3;\n  t.tahiragana = 0x305f;\n  t.tahmedialarabic = 0xfec4;\n  t.taisyouerasquare = 0x337d;\n  t.takatakana = 0x30bf;\n  t.takatakanahalfwidth = 0xff80;\n  t.tatweelarabic = 0x0640;\n  t.tau = 0x03c4;\n  t.tav = 0x05ea;\n  t.tavdages = 0xfb4a;\n  t.tavdagesh = 0xfb4a;\n  t.tavdageshhebrew = 0xfb4a;\n  t.tavhebrew = 0x05ea;\n  t.tbar = 0x0167;\n  t.tbopomofo = 0x310a;\n  t.tcaron = 0x0165;\n  t.tccurl = 0x02a8;\n  t.tcedilla = 0x0163;\n  t.tcheharabic = 0x0686;\n  t.tchehfinalarabic = 0xfb7b;\n  t.tchehinitialarabic = 0xfb7c;\n  t.tchehmedialarabic = 0xfb7d;\n  t.tcircle = 0x24e3;\n  t.tcircumflexbelow = 0x1e71;\n  t.tcommaaccent = 0x0163;\n  t.tdieresis = 0x1e97;\n  t.tdotaccent = 0x1e6b;\n  t.tdotbelow = 0x1e6d;\n  t.tecyrillic = 0x0442;\n  t.tedescendercyrillic = 0x04ad;\n  t.teharabic = 0x062a;\n  t.tehfinalarabic = 0xfe96;\n  t.tehhahinitialarabic = 0xfca2;\n  t.tehhahisolatedarabic = 0xfc0c;\n  t.tehinitialarabic = 0xfe97;\n  t.tehiragana = 0x3066;\n  t.tehjeeminitialarabic = 0xfca1;\n  t.tehjeemisolatedarabic = 0xfc0b;\n  t.tehmarbutaarabic = 0x0629;\n  t.tehmarbutafinalarabic = 0xfe94;\n  t.tehmedialarabic = 0xfe98;\n  t.tehmeeminitialarabic = 0xfca4;\n  t.tehmeemisolatedarabic = 0xfc0e;\n  t.tehnoonfinalarabic = 0xfc73;\n  t.tekatakana = 0x30c6;\n  t.tekatakanahalfwidth = 0xff83;\n  t.telephone = 0x2121;\n  t.telephoneblack = 0x260e;\n  t.telishagedolahebrew = 0x05a0;\n  t.telishaqetanahebrew = 0x05a9;\n  t.tencircle = 0x2469;\n  t.tenideographicparen = 0x3229;\n  t.tenparen = 0x247d;\n  t.tenperiod = 0x2491;\n  t.tenroman = 0x2179;\n  t.tesh = 0x02a7;\n  t.tet = 0x05d8;\n  t.tetdagesh = 0xfb38;\n  t.tetdageshhebrew = 0xfb38;\n  t.tethebrew = 0x05d8;\n  t.tetsecyrillic = 0x04b5;\n  t.tevirhebrew = 0x059b;\n  t.tevirlefthebrew = 0x059b;\n  t.thabengali = 0x09a5;\n  t.thadeva = 0x0925;\n  t.thagujarati = 0x0aa5;\n  t.thagurmukhi = 0x0a25;\n  t.thalarabic = 0x0630;\n  t.thalfinalarabic = 0xfeac;\n  t.thanthakhatlowleftthai = 0xf898;\n  t.thanthakhatlowrightthai = 0xf897;\n  t.thanthakhatthai = 0x0e4c;\n  t.thanthakhatupperleftthai = 0xf896;\n  t.theharabic = 0x062b;\n  t.thehfinalarabic = 0xfe9a;\n  t.thehinitialarabic = 0xfe9b;\n  t.thehmedialarabic = 0xfe9c;\n  t.thereexists = 0x2203;\n  t.therefore = 0x2234;\n  t.theta = 0x03b8;\n  t.theta1 = 0x03d1;\n  t.thetasymbolgreek = 0x03d1;\n  t.thieuthacirclekorean = 0x3279;\n  t.thieuthaparenkorean = 0x3219;\n  t.thieuthcirclekorean = 0x326b;\n  t.thieuthkorean = 0x314c;\n  t.thieuthparenkorean = 0x320b;\n  t.thirteencircle = 0x246c;\n  t.thirteenparen = 0x2480;\n  t.thirteenperiod = 0x2494;\n  t.thonangmonthothai = 0x0e11;\n  t.thook = 0x01ad;\n  t.thophuthaothai = 0x0e12;\n  t.thorn = 0x00fe;\n  t.thothahanthai = 0x0e17;\n  t.thothanthai = 0x0e10;\n  t.thothongthai = 0x0e18;\n  t.thothungthai = 0x0e16;\n  t.thousandcyrillic = 0x0482;\n  t.thousandsseparatorarabic = 0x066c;\n  t.thousandsseparatorpersian = 0x066c;\n  t.three = 0x0033;\n  t.threearabic = 0x0663;\n  t.threebengali = 0x09e9;\n  t.threecircle = 0x2462;\n  t.threecircleinversesansserif = 0x278c;\n  t.threedeva = 0x0969;\n  t.threeeighths = 0x215c;\n  t.threegujarati = 0x0ae9;\n  t.threegurmukhi = 0x0a69;\n  t.threehackarabic = 0x0663;\n  t.threehangzhou = 0x3023;\n  t.threeideographicparen = 0x3222;\n  t.threeinferior = 0x2083;\n  t.threemonospace = 0xff13;\n  t.threenumeratorbengali = 0x09f6;\n  t.threeoldstyle = 0xf733;\n  t.threeparen = 0x2476;\n  t.threeperiod = 0x248a;\n  t.threepersian = 0x06f3;\n  t.threequarters = 0x00be;\n  t.threequartersemdash = 0xf6de;\n  t.threeroman = 0x2172;\n  t.threesuperior = 0x00b3;\n  t.threethai = 0x0e53;\n  t.thzsquare = 0x3394;\n  t.tihiragana = 0x3061;\n  t.tikatakana = 0x30c1;\n  t.tikatakanahalfwidth = 0xff81;\n  t.tikeutacirclekorean = 0x3270;\n  t.tikeutaparenkorean = 0x3210;\n  t.tikeutcirclekorean = 0x3262;\n  t.tikeutkorean = 0x3137;\n  t.tikeutparenkorean = 0x3202;\n  t.tilde = 0x02dc;\n  t.tildebelowcmb = 0x0330;\n  t.tildecmb = 0x0303;\n  t.tildecomb = 0x0303;\n  t.tildedoublecmb = 0x0360;\n  t.tildeoperator = 0x223c;\n  t.tildeoverlaycmb = 0x0334;\n  t.tildeverticalcmb = 0x033e;\n  t.timescircle = 0x2297;\n  t.tipehahebrew = 0x0596;\n  t.tipehalefthebrew = 0x0596;\n  t.tippigurmukhi = 0x0a70;\n  t.titlocyrilliccmb = 0x0483;\n  t.tiwnarmenian = 0x057f;\n  t.tlinebelow = 0x1e6f;\n  t.tmonospace = 0xff54;\n  t.toarmenian = 0x0569;\n  t.tohiragana = 0x3068;\n  t.tokatakana = 0x30c8;\n  t.tokatakanahalfwidth = 0xff84;\n  t.tonebarextrahighmod = 0x02e5;\n  t.tonebarextralowmod = 0x02e9;\n  t.tonebarhighmod = 0x02e6;\n  t.tonebarlowmod = 0x02e8;\n  t.tonebarmidmod = 0x02e7;\n  t.tonefive = 0x01bd;\n  t.tonesix = 0x0185;\n  t.tonetwo = 0x01a8;\n  t.tonos = 0x0384;\n  t.tonsquare = 0x3327;\n  t.topatakthai = 0x0e0f;\n  t.tortoiseshellbracketleft = 0x3014;\n  t.tortoiseshellbracketleftsmall = 0xfe5d;\n  t.tortoiseshellbracketleftvertical = 0xfe39;\n  t.tortoiseshellbracketright = 0x3015;\n  t.tortoiseshellbracketrightsmall = 0xfe5e;\n  t.tortoiseshellbracketrightvertical = 0xfe3a;\n  t.totaothai = 0x0e15;\n  t.tpalatalhook = 0x01ab;\n  t.tparen = 0x24af;\n  t.trademark = 0x2122;\n  t.trademarksans = 0xf8ea;\n  t.trademarkserif = 0xf6db;\n  t.tretroflexhook = 0x0288;\n  t.triagdn = 0x25bc;\n  t.triaglf = 0x25c4;\n  t.triagrt = 0x25ba;\n  t.triagup = 0x25b2;\n  t.ts = 0x02a6;\n  t.tsadi = 0x05e6;\n  t.tsadidagesh = 0xfb46;\n  t.tsadidageshhebrew = 0xfb46;\n  t.tsadihebrew = 0x05e6;\n  t.tsecyrillic = 0x0446;\n  t.tsere = 0x05b5;\n  t.tsere12 = 0x05b5;\n  t.tsere1e = 0x05b5;\n  t.tsere2b = 0x05b5;\n  t.tserehebrew = 0x05b5;\n  t.tserenarrowhebrew = 0x05b5;\n  t.tserequarterhebrew = 0x05b5;\n  t.tserewidehebrew = 0x05b5;\n  t.tshecyrillic = 0x045b;\n  t.tsuperior = 0xf6f3;\n  t.ttabengali = 0x099f;\n  t.ttadeva = 0x091f;\n  t.ttagujarati = 0x0a9f;\n  t.ttagurmukhi = 0x0a1f;\n  t.tteharabic = 0x0679;\n  t.ttehfinalarabic = 0xfb67;\n  t.ttehinitialarabic = 0xfb68;\n  t.ttehmedialarabic = 0xfb69;\n  t.tthabengali = 0x09a0;\n  t.tthadeva = 0x0920;\n  t.tthagujarati = 0x0aa0;\n  t.tthagurmukhi = 0x0a20;\n  t.tturned = 0x0287;\n  t.tuhiragana = 0x3064;\n  t.tukatakana = 0x30c4;\n  t.tukatakanahalfwidth = 0xff82;\n  t.tusmallhiragana = 0x3063;\n  t.tusmallkatakana = 0x30c3;\n  t.tusmallkatakanahalfwidth = 0xff6f;\n  t.twelvecircle = 0x246b;\n  t.twelveparen = 0x247f;\n  t.twelveperiod = 0x2493;\n  t.twelveroman = 0x217b;\n  t.twentycircle = 0x2473;\n  t.twentyhangzhou = 0x5344;\n  t.twentyparen = 0x2487;\n  t.twentyperiod = 0x249b;\n  t.two = 0x0032;\n  t.twoarabic = 0x0662;\n  t.twobengali = 0x09e8;\n  t.twocircle = 0x2461;\n  t.twocircleinversesansserif = 0x278b;\n  t.twodeva = 0x0968;\n  t.twodotenleader = 0x2025;\n  t.twodotleader = 0x2025;\n  t.twodotleadervertical = 0xfe30;\n  t.twogujarati = 0x0ae8;\n  t.twogurmukhi = 0x0a68;\n  t.twohackarabic = 0x0662;\n  t.twohangzhou = 0x3022;\n  t.twoideographicparen = 0x3221;\n  t.twoinferior = 0x2082;\n  t.twomonospace = 0xff12;\n  t.twonumeratorbengali = 0x09f5;\n  t.twooldstyle = 0xf732;\n  t.twoparen = 0x2475;\n  t.twoperiod = 0x2489;\n  t.twopersian = 0x06f2;\n  t.tworoman = 0x2171;\n  t.twostroke = 0x01bb;\n  t.twosuperior = 0x00b2;\n  t.twothai = 0x0e52;\n  t.twothirds = 0x2154;\n  t.u = 0x0075;\n  t.uacute = 0x00fa;\n  t.ubar = 0x0289;\n  t.ubengali = 0x0989;\n  t.ubopomofo = 0x3128;\n  t.ubreve = 0x016d;\n  t.ucaron = 0x01d4;\n  t.ucircle = 0x24e4;\n  t.ucircumflex = 0x00fb;\n  t.ucircumflexbelow = 0x1e77;\n  t.ucyrillic = 0x0443;\n  t.udattadeva = 0x0951;\n  t.udblacute = 0x0171;\n  t.udblgrave = 0x0215;\n  t.udeva = 0x0909;\n  t.udieresis = 0x00fc;\n  t.udieresisacute = 0x01d8;\n  t.udieresisbelow = 0x1e73;\n  t.udieresiscaron = 0x01da;\n  t.udieresiscyrillic = 0x04f1;\n  t.udieresisgrave = 0x01dc;\n  t.udieresismacron = 0x01d6;\n  t.udotbelow = 0x1ee5;\n  t.ugrave = 0x00f9;\n  t.ugujarati = 0x0a89;\n  t.ugurmukhi = 0x0a09;\n  t.uhiragana = 0x3046;\n  t.uhookabove = 0x1ee7;\n  t.uhorn = 0x01b0;\n  t.uhornacute = 0x1ee9;\n  t.uhorndotbelow = 0x1ef1;\n  t.uhorngrave = 0x1eeb;\n  t.uhornhookabove = 0x1eed;\n  t.uhorntilde = 0x1eef;\n  t.uhungarumlaut = 0x0171;\n  t.uhungarumlautcyrillic = 0x04f3;\n  t.uinvertedbreve = 0x0217;\n  t.ukatakana = 0x30a6;\n  t.ukatakanahalfwidth = 0xff73;\n  t.ukcyrillic = 0x0479;\n  t.ukorean = 0x315c;\n  t.umacron = 0x016b;\n  t.umacroncyrillic = 0x04ef;\n  t.umacrondieresis = 0x1e7b;\n  t.umatragurmukhi = 0x0a41;\n  t.umonospace = 0xff55;\n  t.underscore = 0x005f;\n  t.underscoredbl = 0x2017;\n  t.underscoremonospace = 0xff3f;\n  t.underscorevertical = 0xfe33;\n  t.underscorewavy = 0xfe4f;\n  t.union = 0x222a;\n  t.universal = 0x2200;\n  t.uogonek = 0x0173;\n  t.uparen = 0x24b0;\n  t.upblock = 0x2580;\n  t.upperdothebrew = 0x05c4;\n  t.upsilon = 0x03c5;\n  t.upsilondieresis = 0x03cb;\n  t.upsilondieresistonos = 0x03b0;\n  t.upsilonlatin = 0x028a;\n  t.upsilontonos = 0x03cd;\n  t.uptackbelowcmb = 0x031d;\n  t.uptackmod = 0x02d4;\n  t.uragurmukhi = 0x0a73;\n  t.uring = 0x016f;\n  t.ushortcyrillic = 0x045e;\n  t.usmallhiragana = 0x3045;\n  t.usmallkatakana = 0x30a5;\n  t.usmallkatakanahalfwidth = 0xff69;\n  t.ustraightcyrillic = 0x04af;\n  t.ustraightstrokecyrillic = 0x04b1;\n  t.utilde = 0x0169;\n  t.utildeacute = 0x1e79;\n  t.utildebelow = 0x1e75;\n  t.uubengali = 0x098a;\n  t.uudeva = 0x090a;\n  t.uugujarati = 0x0a8a;\n  t.uugurmukhi = 0x0a0a;\n  t.uumatragurmukhi = 0x0a42;\n  t.uuvowelsignbengali = 0x09c2;\n  t.uuvowelsigndeva = 0x0942;\n  t.uuvowelsigngujarati = 0x0ac2;\n  t.uvowelsignbengali = 0x09c1;\n  t.uvowelsigndeva = 0x0941;\n  t.uvowelsigngujarati = 0x0ac1;\n  t.v = 0x0076;\n  t.vadeva = 0x0935;\n  t.vagujarati = 0x0ab5;\n  t.vagurmukhi = 0x0a35;\n  t.vakatakana = 0x30f7;\n  t.vav = 0x05d5;\n  t.vavdagesh = 0xfb35;\n  t.vavdagesh65 = 0xfb35;\n  t.vavdageshhebrew = 0xfb35;\n  t.vavhebrew = 0x05d5;\n  t.vavholam = 0xfb4b;\n  t.vavholamhebrew = 0xfb4b;\n  t.vavvavhebrew = 0x05f0;\n  t.vavyodhebrew = 0x05f1;\n  t.vcircle = 0x24e5;\n  t.vdotbelow = 0x1e7f;\n  t.vecyrillic = 0x0432;\n  t.veharabic = 0x06a4;\n  t.vehfinalarabic = 0xfb6b;\n  t.vehinitialarabic = 0xfb6c;\n  t.vehmedialarabic = 0xfb6d;\n  t.vekatakana = 0x30f9;\n  t.venus = 0x2640;\n  t.verticalbar = 0x007c;\n  t.verticallineabovecmb = 0x030d;\n  t.verticallinebelowcmb = 0x0329;\n  t.verticallinelowmod = 0x02cc;\n  t.verticallinemod = 0x02c8;\n  t.vewarmenian = 0x057e;\n  t.vhook = 0x028b;\n  t.vikatakana = 0x30f8;\n  t.viramabengali = 0x09cd;\n  t.viramadeva = 0x094d;\n  t.viramagujarati = 0x0acd;\n  t.visargabengali = 0x0983;\n  t.visargadeva = 0x0903;\n  t.visargagujarati = 0x0a83;\n  t.vmonospace = 0xff56;\n  t.voarmenian = 0x0578;\n  t.voicediterationhiragana = 0x309e;\n  t.voicediterationkatakana = 0x30fe;\n  t.voicedmarkkana = 0x309b;\n  t.voicedmarkkanahalfwidth = 0xff9e;\n  t.vokatakana = 0x30fa;\n  t.vparen = 0x24b1;\n  t.vtilde = 0x1e7d;\n  t.vturned = 0x028c;\n  t.vuhiragana = 0x3094;\n  t.vukatakana = 0x30f4;\n  t.w = 0x0077;\n  t.wacute = 0x1e83;\n  t.waekorean = 0x3159;\n  t.wahiragana = 0x308f;\n  t.wakatakana = 0x30ef;\n  t.wakatakanahalfwidth = 0xff9c;\n  t.wakorean = 0x3158;\n  t.wasmallhiragana = 0x308e;\n  t.wasmallkatakana = 0x30ee;\n  t.wattosquare = 0x3357;\n  t.wavedash = 0x301c;\n  t.wavyunderscorevertical = 0xfe34;\n  t.wawarabic = 0x0648;\n  t.wawfinalarabic = 0xfeee;\n  t.wawhamzaabovearabic = 0x0624;\n  t.wawhamzaabovefinalarabic = 0xfe86;\n  t.wbsquare = 0x33dd;\n  t.wcircle = 0x24e6;\n  t.wcircumflex = 0x0175;\n  t.wdieresis = 0x1e85;\n  t.wdotaccent = 0x1e87;\n  t.wdotbelow = 0x1e89;\n  t.wehiragana = 0x3091;\n  t.weierstrass = 0x2118;\n  t.wekatakana = 0x30f1;\n  t.wekorean = 0x315e;\n  t.weokorean = 0x315d;\n  t.wgrave = 0x1e81;\n  t.whitebullet = 0x25e6;\n  t.whitecircle = 0x25cb;\n  t.whitecircleinverse = 0x25d9;\n  t.whitecornerbracketleft = 0x300e;\n  t.whitecornerbracketleftvertical = 0xfe43;\n  t.whitecornerbracketright = 0x300f;\n  t.whitecornerbracketrightvertical = 0xfe44;\n  t.whitediamond = 0x25c7;\n  t.whitediamondcontainingblacksmalldiamond = 0x25c8;\n  t.whitedownpointingsmalltriangle = 0x25bf;\n  t.whitedownpointingtriangle = 0x25bd;\n  t.whiteleftpointingsmalltriangle = 0x25c3;\n  t.whiteleftpointingtriangle = 0x25c1;\n  t.whitelenticularbracketleft = 0x3016;\n  t.whitelenticularbracketright = 0x3017;\n  t.whiterightpointingsmalltriangle = 0x25b9;\n  t.whiterightpointingtriangle = 0x25b7;\n  t.whitesmallsquare = 0x25ab;\n  t.whitesmilingface = 0x263a;\n  t.whitesquare = 0x25a1;\n  t.whitestar = 0x2606;\n  t.whitetelephone = 0x260f;\n  t.whitetortoiseshellbracketleft = 0x3018;\n  t.whitetortoiseshellbracketright = 0x3019;\n  t.whiteuppointingsmalltriangle = 0x25b5;\n  t.whiteuppointingtriangle = 0x25b3;\n  t.wihiragana = 0x3090;\n  t.wikatakana = 0x30f0;\n  t.wikorean = 0x315f;\n  t.wmonospace = 0xff57;\n  t.wohiragana = 0x3092;\n  t.wokatakana = 0x30f2;\n  t.wokatakanahalfwidth = 0xff66;\n  t.won = 0x20a9;\n  t.wonmonospace = 0xffe6;\n  t.wowaenthai = 0x0e27;\n  t.wparen = 0x24b2;\n  t.wring = 0x1e98;\n  t.wsuperior = 0x02b7;\n  t.wturned = 0x028d;\n  t.wynn = 0x01bf;\n  t.x = 0x0078;\n  t.xabovecmb = 0x033d;\n  t.xbopomofo = 0x3112;\n  t.xcircle = 0x24e7;\n  t.xdieresis = 0x1e8d;\n  t.xdotaccent = 0x1e8b;\n  t.xeharmenian = 0x056d;\n  t.xi = 0x03be;\n  t.xmonospace = 0xff58;\n  t.xparen = 0x24b3;\n  t.xsuperior = 0x02e3;\n  t.y = 0x0079;\n  t.yaadosquare = 0x334e;\n  t.yabengali = 0x09af;\n  t.yacute = 0x00fd;\n  t.yadeva = 0x092f;\n  t.yaekorean = 0x3152;\n  t.yagujarati = 0x0aaf;\n  t.yagurmukhi = 0x0a2f;\n  t.yahiragana = 0x3084;\n  t.yakatakana = 0x30e4;\n  t.yakatakanahalfwidth = 0xff94;\n  t.yakorean = 0x3151;\n  t.yamakkanthai = 0x0e4e;\n  t.yasmallhiragana = 0x3083;\n  t.yasmallkatakana = 0x30e3;\n  t.yasmallkatakanahalfwidth = 0xff6c;\n  t.yatcyrillic = 0x0463;\n  t.ycircle = 0x24e8;\n  t.ycircumflex = 0x0177;\n  t.ydieresis = 0x00ff;\n  t.ydotaccent = 0x1e8f;\n  t.ydotbelow = 0x1ef5;\n  t.yeharabic = 0x064a;\n  t.yehbarreearabic = 0x06d2;\n  t.yehbarreefinalarabic = 0xfbaf;\n  t.yehfinalarabic = 0xfef2;\n  t.yehhamzaabovearabic = 0x0626;\n  t.yehhamzaabovefinalarabic = 0xfe8a;\n  t.yehhamzaaboveinitialarabic = 0xfe8b;\n  t.yehhamzaabovemedialarabic = 0xfe8c;\n  t.yehinitialarabic = 0xfef3;\n  t.yehmedialarabic = 0xfef4;\n  t.yehmeeminitialarabic = 0xfcdd;\n  t.yehmeemisolatedarabic = 0xfc58;\n  t.yehnoonfinalarabic = 0xfc94;\n  t.yehthreedotsbelowarabic = 0x06d1;\n  t.yekorean = 0x3156;\n  t.yen = 0x00a5;\n  t.yenmonospace = 0xffe5;\n  t.yeokorean = 0x3155;\n  t.yeorinhieuhkorean = 0x3186;\n  t.yerahbenyomohebrew = 0x05aa;\n  t.yerahbenyomolefthebrew = 0x05aa;\n  t.yericyrillic = 0x044b;\n  t.yerudieresiscyrillic = 0x04f9;\n  t.yesieungkorean = 0x3181;\n  t.yesieungpansioskorean = 0x3183;\n  t.yesieungsioskorean = 0x3182;\n  t.yetivhebrew = 0x059a;\n  t.ygrave = 0x1ef3;\n  t.yhook = 0x01b4;\n  t.yhookabove = 0x1ef7;\n  t.yiarmenian = 0x0575;\n  t.yicyrillic = 0x0457;\n  t.yikorean = 0x3162;\n  t.yinyang = 0x262f;\n  t.yiwnarmenian = 0x0582;\n  t.ymonospace = 0xff59;\n  t.yod = 0x05d9;\n  t.yoddagesh = 0xfb39;\n  t.yoddageshhebrew = 0xfb39;\n  t.yodhebrew = 0x05d9;\n  t.yodyodhebrew = 0x05f2;\n  t.yodyodpatahhebrew = 0xfb1f;\n  t.yohiragana = 0x3088;\n  t.yoikorean = 0x3189;\n  t.yokatakana = 0x30e8;\n  t.yokatakanahalfwidth = 0xff96;\n  t.yokorean = 0x315b;\n  t.yosmallhiragana = 0x3087;\n  t.yosmallkatakana = 0x30e7;\n  t.yosmallkatakanahalfwidth = 0xff6e;\n  t.yotgreek = 0x03f3;\n  t.yoyaekorean = 0x3188;\n  t.yoyakorean = 0x3187;\n  t.yoyakthai = 0x0e22;\n  t.yoyingthai = 0x0e0d;\n  t.yparen = 0x24b4;\n  t.ypogegrammeni = 0x037a;\n  t.ypogegrammenigreekcmb = 0x0345;\n  t.yr = 0x01a6;\n  t.yring = 0x1e99;\n  t.ysuperior = 0x02b8;\n  t.ytilde = 0x1ef9;\n  t.yturned = 0x028e;\n  t.yuhiragana = 0x3086;\n  t.yuikorean = 0x318c;\n  t.yukatakana = 0x30e6;\n  t.yukatakanahalfwidth = 0xff95;\n  t.yukorean = 0x3160;\n  t.yusbigcyrillic = 0x046b;\n  t.yusbigiotifiedcyrillic = 0x046d;\n  t.yuslittlecyrillic = 0x0467;\n  t.yuslittleiotifiedcyrillic = 0x0469;\n  t.yusmallhiragana = 0x3085;\n  t.yusmallkatakana = 0x30e5;\n  t.yusmallkatakanahalfwidth = 0xff6d;\n  t.yuyekorean = 0x318b;\n  t.yuyeokorean = 0x318a;\n  t.yyabengali = 0x09df;\n  t.yyadeva = 0x095f;\n  t.z = 0x007a;\n  t.zaarmenian = 0x0566;\n  t.zacute = 0x017a;\n  t.zadeva = 0x095b;\n  t.zagurmukhi = 0x0a5b;\n  t.zaharabic = 0x0638;\n  t.zahfinalarabic = 0xfec6;\n  t.zahinitialarabic = 0xfec7;\n  t.zahiragana = 0x3056;\n  t.zahmedialarabic = 0xfec8;\n  t.zainarabic = 0x0632;\n  t.zainfinalarabic = 0xfeb0;\n  t.zakatakana = 0x30b6;\n  t.zaqefgadolhebrew = 0x0595;\n  t.zaqefqatanhebrew = 0x0594;\n  t.zarqahebrew = 0x0598;\n  t.zayin = 0x05d6;\n  t.zayindagesh = 0xfb36;\n  t.zayindageshhebrew = 0xfb36;\n  t.zayinhebrew = 0x05d6;\n  t.zbopomofo = 0x3117;\n  t.zcaron = 0x017e;\n  t.zcircle = 0x24e9;\n  t.zcircumflex = 0x1e91;\n  t.zcurl = 0x0291;\n  t.zdot = 0x017c;\n  t.zdotaccent = 0x017c;\n  t.zdotbelow = 0x1e93;\n  t.zecyrillic = 0x0437;\n  t.zedescendercyrillic = 0x0499;\n  t.zedieresiscyrillic = 0x04df;\n  t.zehiragana = 0x305c;\n  t.zekatakana = 0x30bc;\n  t.zero = 0x0030;\n  t.zeroarabic = 0x0660;\n  t.zerobengali = 0x09e6;\n  t.zerodeva = 0x0966;\n  t.zerogujarati = 0x0ae6;\n  t.zerogurmukhi = 0x0a66;\n  t.zerohackarabic = 0x0660;\n  t.zeroinferior = 0x2080;\n  t.zeromonospace = 0xff10;\n  t.zerooldstyle = 0xf730;\n  t.zeropersian = 0x06f0;\n  t.zerosuperior = 0x2070;\n  t.zerothai = 0x0e50;\n  t.zerowidthjoiner = 0xfeff;\n  t.zerowidthnonjoiner = 0x200c;\n  t.zerowidthspace = 0x200b;\n  t.zeta = 0x03b6;\n  t.zhbopomofo = 0x3113;\n  t.zhearmenian = 0x056a;\n  t.zhebrevecyrillic = 0x04c2;\n  t.zhecyrillic = 0x0436;\n  t.zhedescendercyrillic = 0x0497;\n  t.zhedieresiscyrillic = 0x04dd;\n  t.zihiragana = 0x3058;\n  t.zikatakana = 0x30b8;\n  t.zinorhebrew = 0x05ae;\n  t.zlinebelow = 0x1e95;\n  t.zmonospace = 0xff5a;\n  t.zohiragana = 0x305e;\n  t.zokatakana = 0x30be;\n  t.zparen = 0x24b5;\n  t.zretroflexhook = 0x0290;\n  t.zstroke = 0x01b6;\n  t.zuhiragana = 0x305a;\n  t.zukatakana = 0x30ba;\n  t[\".notdef\"] = 0x0000;\n\n  // TeX-specific glyph names.\n  t.angbracketleftbig = 0x2329;\n  t.angbracketleftBig = 0x2329;\n  t.angbracketleftbigg = 0x2329;\n  t.angbracketleftBigg = 0x2329;\n  t.angbracketrightBig = 0x232a;\n  t.angbracketrightbig = 0x232a;\n  t.angbracketrightBigg = 0x232a;\n  t.angbracketrightbigg = 0x232a;\n  t.arrowhookleft = 0x21aa;\n  t.arrowhookright = 0x21a9;\n  t.arrowlefttophalf = 0x21bc;\n  t.arrowleftbothalf = 0x21bd;\n  t.arrownortheast = 0x2197;\n  t.arrownorthwest = 0x2196;\n  t.arrowrighttophalf = 0x21c0;\n  t.arrowrightbothalf = 0x21c1;\n  t.arrowsoutheast = 0x2198;\n  t.arrowsouthwest = 0x2199;\n  t.backslashbig = 0x2216;\n  t.backslashBig = 0x2216;\n  t.backslashBigg = 0x2216;\n  t.backslashbigg = 0x2216;\n  t.bardbl = 0x2016;\n  t.bracehtipdownleft = 0xfe37;\n  t.bracehtipdownright = 0xfe37;\n  t.bracehtipupleft = 0xfe38;\n  t.bracehtipupright = 0xfe38;\n  t.braceleftBig = 0x007b;\n  t.braceleftbig = 0x007b;\n  t.braceleftbigg = 0x007b;\n  t.braceleftBigg = 0x007b;\n  t.bracerightBig = 0x007d;\n  t.bracerightbig = 0x007d;\n  t.bracerightbigg = 0x007d;\n  t.bracerightBigg = 0x007d;\n  t.bracketleftbig = 0x005b;\n  t.bracketleftBig = 0x005b;\n  t.bracketleftbigg = 0x005b;\n  t.bracketleftBigg = 0x005b;\n  t.bracketrightBig = 0x005d;\n  t.bracketrightbig = 0x005d;\n  t.bracketrightbigg = 0x005d;\n  t.bracketrightBigg = 0x005d;\n  t.ceilingleftbig = 0x2308;\n  t.ceilingleftBig = 0x2308;\n  t.ceilingleftBigg = 0x2308;\n  t.ceilingleftbigg = 0x2308;\n  t.ceilingrightbig = 0x2309;\n  t.ceilingrightBig = 0x2309;\n  t.ceilingrightbigg = 0x2309;\n  t.ceilingrightBigg = 0x2309;\n  t.circledotdisplay = 0x2299;\n  t.circledottext = 0x2299;\n  t.circlemultiplydisplay = 0x2297;\n  t.circlemultiplytext = 0x2297;\n  t.circleplusdisplay = 0x2295;\n  t.circleplustext = 0x2295;\n  t.contintegraldisplay = 0x222e;\n  t.contintegraltext = 0x222e;\n  t.coproductdisplay = 0x2210;\n  t.coproducttext = 0x2210;\n  t.floorleftBig = 0x230a;\n  t.floorleftbig = 0x230a;\n  t.floorleftbigg = 0x230a;\n  t.floorleftBigg = 0x230a;\n  t.floorrightbig = 0x230b;\n  t.floorrightBig = 0x230b;\n  t.floorrightBigg = 0x230b;\n  t.floorrightbigg = 0x230b;\n  t.hatwide = 0x0302;\n  t.hatwider = 0x0302;\n  t.hatwidest = 0x0302;\n  t.intercal = 0x1d40;\n  t.integraldisplay = 0x222b;\n  t.integraltext = 0x222b;\n  t.intersectiondisplay = 0x22c2;\n  t.intersectiontext = 0x22c2;\n  t.logicalanddisplay = 0x2227;\n  t.logicalandtext = 0x2227;\n  t.logicalordisplay = 0x2228;\n  t.logicalortext = 0x2228;\n  t.parenleftBig = 0x0028;\n  t.parenleftbig = 0x0028;\n  t.parenleftBigg = 0x0028;\n  t.parenleftbigg = 0x0028;\n  t.parenrightBig = 0x0029;\n  t.parenrightbig = 0x0029;\n  t.parenrightBigg = 0x0029;\n  t.parenrightbigg = 0x0029;\n  t.prime = 0x2032;\n  t.productdisplay = 0x220f;\n  t.producttext = 0x220f;\n  t.radicalbig = 0x221a;\n  t.radicalBig = 0x221a;\n  t.radicalBigg = 0x221a;\n  t.radicalbigg = 0x221a;\n  t.radicalbt = 0x221a;\n  t.radicaltp = 0x221a;\n  t.radicalvertex = 0x221a;\n  t.slashbig = 0x002f;\n  t.slashBig = 0x002f;\n  t.slashBigg = 0x002f;\n  t.slashbigg = 0x002f;\n  t.summationdisplay = 0x2211;\n  t.summationtext = 0x2211;\n  t.tildewide = 0x02dc;\n  t.tildewider = 0x02dc;\n  t.tildewidest = 0x02dc;\n  t.uniondisplay = 0x22c3;\n  t.unionmultidisplay = 0x228e;\n  t.unionmultitext = 0x228e;\n  t.unionsqdisplay = 0x2294;\n  t.unionsqtext = 0x2294;\n  t.uniontext = 0x22c3;\n  t.vextenddouble = 0x2225;\n  t.vextendsingle = 0x2223;\n});\n\nconst getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {\n  t.space = 0x0020;\n  t.a1 = 0x2701;\n  t.a2 = 0x2702;\n  t.a202 = 0x2703;\n  t.a3 = 0x2704;\n  t.a4 = 0x260e;\n  t.a5 = 0x2706;\n  t.a119 = 0x2707;\n  t.a118 = 0x2708;\n  t.a117 = 0x2709;\n  t.a11 = 0x261b;\n  t.a12 = 0x261e;\n  t.a13 = 0x270c;\n  t.a14 = 0x270d;\n  t.a15 = 0x270e;\n  t.a16 = 0x270f;\n  t.a105 = 0x2710;\n  t.a17 = 0x2711;\n  t.a18 = 0x2712;\n  t.a19 = 0x2713;\n  t.a20 = 0x2714;\n  t.a21 = 0x2715;\n  t.a22 = 0x2716;\n  t.a23 = 0x2717;\n  t.a24 = 0x2718;\n  t.a25 = 0x2719;\n  t.a26 = 0x271a;\n  t.a27 = 0x271b;\n  t.a28 = 0x271c;\n  t.a6 = 0x271d;\n  t.a7 = 0x271e;\n  t.a8 = 0x271f;\n  t.a9 = 0x2720;\n  t.a10 = 0x2721;\n  t.a29 = 0x2722;\n  t.a30 = 0x2723;\n  t.a31 = 0x2724;\n  t.a32 = 0x2725;\n  t.a33 = 0x2726;\n  t.a34 = 0x2727;\n  t.a35 = 0x2605;\n  t.a36 = 0x2729;\n  t.a37 = 0x272a;\n  t.a38 = 0x272b;\n  t.a39 = 0x272c;\n  t.a40 = 0x272d;\n  t.a41 = 0x272e;\n  t.a42 = 0x272f;\n  t.a43 = 0x2730;\n  t.a44 = 0x2731;\n  t.a45 = 0x2732;\n  t.a46 = 0x2733;\n  t.a47 = 0x2734;\n  t.a48 = 0x2735;\n  t.a49 = 0x2736;\n  t.a50 = 0x2737;\n  t.a51 = 0x2738;\n  t.a52 = 0x2739;\n  t.a53 = 0x273a;\n  t.a54 = 0x273b;\n  t.a55 = 0x273c;\n  t.a56 = 0x273d;\n  t.a57 = 0x273e;\n  t.a58 = 0x273f;\n  t.a59 = 0x2740;\n  t.a60 = 0x2741;\n  t.a61 = 0x2742;\n  t.a62 = 0x2743;\n  t.a63 = 0x2744;\n  t.a64 = 0x2745;\n  t.a65 = 0x2746;\n  t.a66 = 0x2747;\n  t.a67 = 0x2748;\n  t.a68 = 0x2749;\n  t.a69 = 0x274a;\n  t.a70 = 0x274b;\n  t.a71 = 0x25cf;\n  t.a72 = 0x274d;\n  t.a73 = 0x25a0;\n  t.a74 = 0x274f;\n  t.a203 = 0x2750;\n  t.a75 = 0x2751;\n  t.a204 = 0x2752;\n  t.a76 = 0x25b2;\n  t.a77 = 0x25bc;\n  t.a78 = 0x25c6;\n  t.a79 = 0x2756;\n  t.a81 = 0x25d7;\n  t.a82 = 0x2758;\n  t.a83 = 0x2759;\n  t.a84 = 0x275a;\n  t.a97 = 0x275b;\n  t.a98 = 0x275c;\n  t.a99 = 0x275d;\n  t.a100 = 0x275e;\n  t.a101 = 0x2761;\n  t.a102 = 0x2762;\n  t.a103 = 0x2763;\n  t.a104 = 0x2764;\n  t.a106 = 0x2765;\n  t.a107 = 0x2766;\n  t.a108 = 0x2767;\n  t.a112 = 0x2663;\n  t.a111 = 0x2666;\n  t.a110 = 0x2665;\n  t.a109 = 0x2660;\n  t.a120 = 0x2460;\n  t.a121 = 0x2461;\n  t.a122 = 0x2462;\n  t.a123 = 0x2463;\n  t.a124 = 0x2464;\n  t.a125 = 0x2465;\n  t.a126 = 0x2466;\n  t.a127 = 0x2467;\n  t.a128 = 0x2468;\n  t.a129 = 0x2469;\n  t.a130 = 0x2776;\n  t.a131 = 0x2777;\n  t.a132 = 0x2778;\n  t.a133 = 0x2779;\n  t.a134 = 0x277a;\n  t.a135 = 0x277b;\n  t.a136 = 0x277c;\n  t.a137 = 0x277d;\n  t.a138 = 0x277e;\n  t.a139 = 0x277f;\n  t.a140 = 0x2780;\n  t.a141 = 0x2781;\n  t.a142 = 0x2782;\n  t.a143 = 0x2783;\n  t.a144 = 0x2784;\n  t.a145 = 0x2785;\n  t.a146 = 0x2786;\n  t.a147 = 0x2787;\n  t.a148 = 0x2788;\n  t.a149 = 0x2789;\n  t.a150 = 0x278a;\n  t.a151 = 0x278b;\n  t.a152 = 0x278c;\n  t.a153 = 0x278d;\n  t.a154 = 0x278e;\n  t.a155 = 0x278f;\n  t.a156 = 0x2790;\n  t.a157 = 0x2791;\n  t.a158 = 0x2792;\n  t.a159 = 0x2793;\n  t.a160 = 0x2794;\n  t.a161 = 0x2192;\n  t.a163 = 0x2194;\n  t.a164 = 0x2195;\n  t.a196 = 0x2798;\n  t.a165 = 0x2799;\n  t.a192 = 0x279a;\n  t.a166 = 0x279b;\n  t.a167 = 0x279c;\n  t.a168 = 0x279d;\n  t.a169 = 0x279e;\n  t.a170 = 0x279f;\n  t.a171 = 0x27a0;\n  t.a172 = 0x27a1;\n  t.a173 = 0x27a2;\n  t.a162 = 0x27a3;\n  t.a174 = 0x27a4;\n  t.a175 = 0x27a5;\n  t.a176 = 0x27a6;\n  t.a177 = 0x27a7;\n  t.a178 = 0x27a8;\n  t.a179 = 0x27a9;\n  t.a193 = 0x27aa;\n  t.a180 = 0x27ab;\n  t.a199 = 0x27ac;\n  t.a181 = 0x27ad;\n  t.a200 = 0x27ae;\n  t.a182 = 0x27af;\n  t.a201 = 0x27b1;\n  t.a183 = 0x27b2;\n  t.a184 = 0x27b3;\n  t.a197 = 0x27b4;\n  t.a185 = 0x27b5;\n  t.a194 = 0x27b6;\n  t.a198 = 0x27b7;\n  t.a186 = 0x27b8;\n  t.a195 = 0x27b9;\n  t.a187 = 0x27ba;\n  t.a188 = 0x27bb;\n  t.a189 = 0x27bc;\n  t.a190 = 0x27bd;\n  t.a191 = 0x27be;\n  t.a89 = 0x2768; // 0xF8D7\n  t.a90 = 0x2769; // 0xF8D8\n  t.a93 = 0x276a; // 0xF8D9\n  t.a94 = 0x276b; // 0xF8DA\n  t.a91 = 0x276c; // 0xF8DB\n  t.a92 = 0x276d; // 0xF8DC\n  t.a205 = 0x276e; // 0xF8DD\n  t.a85 = 0x276f; // 0xF8DE\n  t.a206 = 0x2770; // 0xF8DF\n  t.a86 = 0x2771; // 0xF8E0\n  t.a87 = 0x2772; // 0xF8E1\n  t.a88 = 0x2773; // 0xF8E2\n  t.a95 = 0x2774; // 0xF8E3\n  t.a96 = 0x2775; // 0xF8E4\n  t[\".notdef\"] = 0x0000;\n});\n\nexport { getDingbatsGlyphsUnicode, getGlyphsUnicode };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getLookupTableFactory } from \"./core_utils.js\";\n\n// Some characters, e.g. copyrightserif, are mapped to the private use area\n// and might not be displayed using standard fonts. Mapping/hacking well-known\n// chars to the similar equivalents in the normal characters range.\nconst getSpecialPUASymbols = getLookupTableFactory(function (t) {\n  t[63721] = 0x00a9; // copyrightsans (0xF8E9) => copyright\n  t[63193] = 0x00a9; // copyrightserif (0xF6D9) => copyright\n  t[63720] = 0x00ae; // registersans (0xF8E8) => registered\n  t[63194] = 0x00ae; // registerserif (0xF6DA) => registered\n  t[63722] = 0x2122; // trademarksans (0xF8EA) => trademark\n  t[63195] = 0x2122; // trademarkserif (0xF6DB) => trademark\n  t[63729] = 0x23a7; // bracelefttp (0xF8F1)\n  t[63730] = 0x23a8; // braceleftmid (0xF8F2)\n  t[63731] = 0x23a9; // braceleftbt (0xF8F3)\n  t[63740] = 0x23ab; // bracerighttp (0xF8FC)\n  t[63741] = 0x23ac; // bracerightmid (0xF8FD)\n  t[63742] = 0x23ad; // bracerightbt (0xF8FE)\n  t[63726] = 0x23a1; // bracketlefttp (0xF8EE)\n  t[63727] = 0x23a2; // bracketleftex (0xF8EF)\n  t[63728] = 0x23a3; // bracketleftbt (0xF8F0)\n  t[63737] = 0x23a4; // bracketrighttp (0xF8F9)\n  t[63738] = 0x23a5; // bracketrightex (0xF8FA)\n  t[63739] = 0x23a6; // bracketrightbt (0xF8FB)\n  t[63723] = 0x239b; // parenlefttp (0xF8EB)\n  t[63724] = 0x239c; // parenleftex (0xF8EC)\n  t[63725] = 0x239d; // parenleftbt (0xF8ED)\n  t[63734] = 0x239e; // parenrighttp (0xF8F6)\n  t[63735] = 0x239f; // parenrightex (0xF8F7)\n  t[63736] = 0x23a0; // parenrightbt (0xF8F8)\n});\n\nfunction mapSpecialUnicodeValues(code) {\n  if (code >= 0xfff0 && code <= 0xffff) {\n    // Specials unicode block.\n    return 0;\n  } else if (code >= 0xf600 && code <= 0xf8ff) {\n    return getSpecialPUASymbols()[code] || code;\n  } else if (code === /* softhyphen = */ 0x00ad) {\n    return 0x002d; // hyphen\n  }\n  return code;\n}\n\nfunction getUnicodeForGlyph(name, glyphsUnicodeMap) {\n  let unicode = glyphsUnicodeMap[name];\n  if (unicode !== undefined) {\n    return unicode;\n  }\n  if (!name) {\n    return -1;\n  }\n  // Try to recover valid Unicode values from 'uniXXXX'/'uXXXX{XX}' glyphs.\n  if (name[0] === \"u\") {\n    const nameLen = name.length;\n    let hexStr;\n\n    if (nameLen === 7 && name[1] === \"n\" && name[2] === \"i\") {\n      // 'uniXXXX'\n      hexStr = name.substring(3);\n    } else if (nameLen >= 5 && nameLen <= 7) {\n      // 'uXXXX{XX}'\n      hexStr = name.substring(1);\n    } else {\n      return -1;\n    }\n    // Check for upper-case hexadecimal characters, to avoid false positives.\n    if (hexStr === hexStr.toUpperCase()) {\n      unicode = parseInt(hexStr, 16);\n      if (unicode >= 0) {\n        return unicode;\n      }\n    }\n  }\n  return -1;\n}\n\n// See https://learn.microsoft.com/en-us/typography/opentype/spec/os2#ulunicoderange1-bits-031ulunicoderange2-bits-3263ulunicoderange3-bits-6495ulunicoderange4-bits-96127\nconst UnicodeRanges = [\n  [0x0000, 0x007f], // 0 - Basic Latin\n  [0x0080, 0x00ff], // 1 - Latin-1 Supplement\n  [0x0100, 0x017f], // 2 - Latin Extended-A\n  [0x0180, 0x024f], // 3 - Latin Extended-B\n  [0x0250, 0x02af, 0x1d00, 0x1d7f, 0x1d80, 0x1dbf], // 4 - IPA Extensions - Phonetic Extensions - Phonetic Extensions Supplement\n  [0x02b0, 0x02ff, 0xa700, 0xa71f], // 5 - Spacing Modifier Letters - Modifier Tone Letters\n  [0x0300, 0x036f, 0x1dc0, 0x1dff], // 6 - Combining Diacritical Marks - Combining Diacritical Marks Supplement\n  [0x0370, 0x03ff], // 7 - Greek and Coptic\n  [0x2c80, 0x2cff], // 8 - Coptic\n  [0x0400, 0x04ff, 0x0500, 0x052f, 0x2de0, 0x2dff, 0xa640, 0xa69f], // 9 - Cyrillic - Cyrillic Supplement - Cyrillic Extended-A - Cyrillic Extended-B\n  [0x0530, 0x058f], // 10 - Armenian\n  [0x0590, 0x05ff], // 11 - Hebrew\n  [0xa500, 0xa63f], // 12 - Vai\n  [0x0600, 0x06ff, 0x0750, 0x077f], // 13 - Arabic - Arabic Supplement\n  [0x07c0, 0x07ff], // 14 - NKo\n  [0x0900, 0x097f], // 15 - Devanagari\n  [0x0980, 0x09ff], // 16 - Bengali\n  [0x0a00, 0x0a7f], // 17 - Gurmukhi\n  [0x0a80, 0x0aff], // 18 - Gujarati\n  [0x0b00, 0x0b7f], // 19 - Oriya\n  [0x0b80, 0x0bff], // 20 - Tamil\n  [0x0c00, 0x0c7f], // 21 - Telugu\n  [0x0c80, 0x0cff], // 22 - Kannada\n  [0x0d00, 0x0d7f], // 23 - Malayalam\n  [0x0e00, 0x0e7f], // 24 - Thai\n  [0x0e80, 0x0eff], // 25 - Lao\n  [0x10a0, 0x10ff, 0x2d00, 0x2d2f], // 26 - Georgian - Georgian Supplement\n  [0x1b00, 0x1b7f], // 27 - Balinese\n  [0x1100, 0x11ff], // 28 - Hangul Jamo\n  [0x1e00, 0x1eff, 0x2c60, 0x2c7f, 0xa720, 0xa7ff], // 29 - Latin Extended Additional - Latin Extended-C - Latin Extended-D\n  [0x1f00, 0x1fff], // 30 - Greek Extended\n  [0x2000, 0x206f, 0x2e00, 0x2e7f], // 31 - General Punctuation - Supplemental Punctuation\n  [0x2070, 0x209f], // 32 - Superscripts And Subscripts\n  [0x20a0, 0x20cf], // 33 - Currency Symbol\n  [0x20d0, 0x20ff], // 34 - Combining Diacritical Marks\n  [0x2100, 0x214f], // 35 - Letterlike Symbols\n  [0x2150, 0x218f], // 36 - Number Forms\n  [0x2190, 0x21ff, 0x27f0, 0x27ff, 0x2900, 0x297f, 0x2b00, 0x2bff], // 37 - Arrows - Supplemental Arrows-A - Supplemental Arrows-B - Miscellaneous Symbols and Arrows\n  [0x2200, 0x22ff, 0x2a00, 0x2aff, 0x27c0, 0x27ef, 0x2980, 0x29ff], // 38 - Mathematical Operators - Supplemental Mathematical Operators - Miscellaneous Mathematical Symbols-A - Miscellaneous Mathematical Symbols-B\n  [0x2300, 0x23ff], // 39 - Miscellaneous Technical\n  [0x2400, 0x243f], // 40 - Control Pictures\n  [0x2440, 0x245f], // 41 - Optical Character Recognition\n  [0x2460, 0x24ff], // 42 - Enclosed Alphanumerics\n  [0x2500, 0x257f], // 43 - Box Drawing\n  [0x2580, 0x259f], // 44 - Block Elements\n  [0x25a0, 0x25ff], // 45 - Geometric Shapes\n  [0x2600, 0x26ff], // 46 - Miscellaneous Symbols\n  [0x2700, 0x27bf], // 47 - Dingbats\n  [0x3000, 0x303f], // 48 - CJK Symbols And Punctuation\n  [0x3040, 0x309f], // 49 - Hiragana\n  [0x30a0, 0x30ff, 0x31f0, 0x31ff], // 50 - Katakana - Katakana Phonetic Extensions\n  [0x3100, 0x312f, 0x31a0, 0x31bf], // 51 - Bopomofo - Bopomofo Extended\n  [0x3130, 0x318f], // 52 - Hangul Compatibility Jamo\n  [0xa840, 0xa87f], // 53 - Phags-pa\n  [0x3200, 0x32ff], // 54 - Enclosed CJK Letters And Months\n  [0x3300, 0x33ff], // 55 - CJK Compatibility\n  [0xac00, 0xd7af], // 56 - Hangul Syllables\n  [0xd800, 0xdfff], // 57 - Non-Plane 0 *\n  [0x10900, 0x1091f], // 58 - Phoenicia\n  [\n    0x4e00, 0x9fff, 0x2e80, 0x2eff, 0x2f00, 0x2fdf, 0x2ff0, 0x2fff, 0x3400,\n    0x4dbf, 0x20000, 0x2a6df, 0x3190, 0x319f,\n  ], // 59 - CJK Unified Ideographs - CJK Radicals Supplement - Kangxi Radicals - Ideographic Description Characters - CJK Unified Ideographs Extension A - CJK Unified Ideographs Extension B - Kanbun\n  [0xe000, 0xf8ff], // 60 - Private Use Area (plane 0)\n  [0x31c0, 0x31ef, 0xf900, 0xfaff, 0x2f800, 0x2fa1f], // 61 - CJK Strokes - CJK Compatibility Ideographs - CJK Compatibility Ideographs Supplement\n  [0xfb00, 0xfb4f], // 62 - Alphabetic Presentation Forms\n  [0xfb50, 0xfdff], // 63 - Arabic Presentation Forms-A\n  [0xfe20, 0xfe2f], // 64 - Combining Half Marks\n  [0xfe10, 0xfe1f], // 65 - Vertical Forms\n  [0xfe50, 0xfe6f], // 66 - Small Form Variants\n  [0xfe70, 0xfeff], // 67 - Arabic Presentation Forms-B\n  [0xff00, 0xffef], // 68 - Halfwidth And Fullwidth Forms\n  [0xfff0, 0xffff], // 69 - Specials\n  [0x0f00, 0x0fff], // 70 - Tibetan\n  [0x0700, 0x074f], // 71 - Syriac\n  [0x0780, 0x07bf], // 72 - Thaana\n  [0x0d80, 0x0dff], // 73 - Sinhala\n  [0x1000, 0x109f], // 74 - Myanmar\n  [0x1200, 0x137f, 0x1380, 0x139f, 0x2d80, 0x2ddf], // 75 - Ethiopic - Ethiopic Supplement - Ethiopic Extended\n  [0x13a0, 0x13ff], // 76 - Cherokee\n  [0x1400, 0x167f], // 77 - Unified Canadian Aboriginal Syllabics\n  [0x1680, 0x169f], // 78 - Ogham\n  [0x16a0, 0x16ff], // 79 - Runic\n  [0x1780, 0x17ff], // 80 - Khmer\n  [0x1800, 0x18af], // 81 - Mongolian\n  [0x2800, 0x28ff], // 82 - Braille Patterns\n  [0xa000, 0xa48f], // 83 - Yi Syllables\n  [0x1700, 0x171f, 0x1720, 0x173f, 0x1740, 0x175f, 0x1760, 0x177f], // 84 - Tagalog - Hanunoo - Buhid - Tagbanwa\n  [0x10300, 0x1032f], // 85 - Old Italic\n  [0x10330, 0x1034f], // 86 - Gothic\n  [0x10400, 0x1044f], // 87 - Deseret\n  [0x1d000, 0x1d0ff, 0x1d100, 0x1d1ff, 0x1d200, 0x1d24f], // 88 - Byzantine Musical Symbols - Musical Symbols - Ancient Greek Musical Notation\n  [0x1d400, 0x1d7ff], // 89 - Mathematical Alphanumeric Symbols\n  [0xff000, 0xffffd], // 90 - Private Use (plane 15)\n  [0xfe00, 0xfe0f, 0xe0100, 0xe01ef], // 91 - Variation Selectors - Variation Selectors Supplement\n  [0xe0000, 0xe007f], // 92 - Tags\n  [0x1900, 0x194f], // 93 - Limbu\n  [0x1950, 0x197f], // 94 - Tai Le\n  [0x1980, 0x19df], // 95 - New Tai Lue\n  [0x1a00, 0x1a1f], // 96 - Buginese\n  [0x2c00, 0x2c5f], // 97 - Glagolitic\n  [0x2d30, 0x2d7f], // 98 - Tifinagh\n  [0x4dc0, 0x4dff], // 99 - Yijing Hexagram Symbols\n  [0xa800, 0xa82f], // 100 - Syloti Nagri\n  [0x10000, 0x1007f, 0x10080, 0x100ff, 0x10100, 0x1013f], // 101 - Linear B Syllabary - Linear B Ideograms - Aegean Numbers\n  [0x10140, 0x1018f], // 102 - Ancient Greek Numbers\n  [0x10380, 0x1039f], // 103 - Ugaritic\n  [0x103a0, 0x103df], // 104 - Old Persian\n  [0x10450, 0x1047f], // 105 - Shavian\n  [0x10480, 0x104af], // 106 - Osmanya\n  [0x10800, 0x1083f], // 107 - Cypriot Syllabary\n  [0x10a00, 0x10a5f], // 108 - Kharoshthi\n  [0x1d300, 0x1d35f], // 109 - Tai Xuan Jing Symbols\n  [0x12000, 0x123ff, 0x12400, 0x1247f], // 110 - Cuneiform - Cuneiform Numbers and Punctuation\n  [0x1d360, 0x1d37f], // 111 - Counting Rod Numerals\n  [0x1b80, 0x1bbf], // 112 - Sundanese\n  [0x1c00, 0x1c4f], // 113 - Lepcha\n  [0x1c50, 0x1c7f], // 114 - Ol Chiki\n  [0xa880, 0xa8df], // 115 - Saurashtra\n  [0xa900, 0xa92f], // 116 - Kayah Li\n  [0xa930, 0xa95f], // 117 - Rejang\n  [0xaa00, 0xaa5f], // 118 - Cham\n  [0x10190, 0x101cf], // 119 - Ancient Symbols\n  [0x101d0, 0x101ff], // 120 - Phaistos Disc\n  [0x102a0, 0x102df, 0x10280, 0x1029f, 0x10920, 0x1093f], // 121 - Carian - Lycian - Lydian\n  [0x1f030, 0x1f09f, 0x1f000, 0x1f02f], // 122 - Domino Tiles - Mahjong Tiles\n];\n\nfunction getUnicodeRangeFor(value, lastPosition = -1) {\n  // TODO: create a map range => position, sort the ranges and cache it.\n  // Then we can make a binary search for finding a range for a given unicode.\n  if (lastPosition !== -1) {\n    const range = UnicodeRanges[lastPosition];\n    for (let i = 0, ii = range.length; i < ii; i += 2) {\n      if (value >= range[i] && value <= range[i + 1]) {\n        return lastPosition;\n      }\n    }\n  }\n  for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) {\n    const range = UnicodeRanges[i];\n    for (let j = 0, jj = range.length; j < jj; j += 2) {\n      if (value >= range[j] && value <= range[j + 1]) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n\nconst SpecialCharRegExp = /^(\\s)|(\\p{Mn})|(\\p{Cf})$/u;\nconst CategoryCache = new Map();\n\nfunction getCharUnicodeCategory(char) {\n  const cachedCategory = CategoryCache.get(char);\n  if (cachedCategory) {\n    return cachedCategory;\n  }\n  const groups = char.match(SpecialCharRegExp);\n  const category = {\n    isWhitespace: !!groups?.[1],\n    isZeroWidthDiacritic: !!groups?.[2],\n    isInvisibleFormatMark: !!groups?.[3],\n  };\n  CategoryCache.set(char, category);\n  return category;\n}\n\nfunction clearUnicodeCaches() {\n  CategoryCache.clear();\n}\n\nexport {\n  clearUnicodeCaches,\n  getCharUnicodeCategory,\n  getUnicodeForGlyph,\n  getUnicodeRangeFor,\n  mapSpecialUnicodeValues,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DrawOPS, info, OPS } from \"../shared/util.js\";\nimport { getEncoding, StandardEncoding } from \"./encodings.js\";\nimport { getGlyphsUnicode } from \"./glyphlist.js\";\nimport { getLookupTableFactory } from \"./core_utils.js\";\nimport { getUnicodeForGlyph } from \"./unicode.js\";\n\n// Accented characters have issues on Windows and Linux. When this flag is\n// enabled glyphs that use seac and seac style endchar operators are truncated\n// and we instead just store the glyph id's of the base glyph and its accent to\n// be drawn individually.\n// Linux (freetype) requires that when a seac style endchar is used\n// that the charset must be a predefined one, however we build a\n// custom one. Windows just refuses to draw glyphs with seac operators.\nconst SEAC_ANALYSIS_ENABLED = true;\n\nconst FontFlags = {\n  FixedPitch: 1,\n  Serif: 2,\n  Symbolic: 4,\n  Script: 8,\n  Nonsymbolic: 32,\n  Italic: 64,\n  AllCap: 65536,\n  SmallCap: 131072,\n  ForceBold: 262144,\n};\n\n// prettier-ignore\nconst MacStandardGlyphOrdering = [\n  \".notdef\", \".null\", \"nonmarkingreturn\", \"space\", \"exclam\", \"quotedbl\",\n  \"numbersign\", \"dollar\", \"percent\", \"ampersand\", \"quotesingle\", \"parenleft\",\n  \"parenright\", \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\",\n  \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\",\n  \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"at\",\n  \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\",\n  \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\",\n  \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\", \"grave\", \"a\", \"b\",\n  \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\",\n  \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\",\n  \"asciitilde\", \"Adieresis\", \"Aring\", \"Ccedilla\", \"Eacute\", \"Ntilde\",\n  \"Odieresis\", \"Udieresis\", \"aacute\", \"agrave\", \"acircumflex\", \"adieresis\",\n  \"atilde\", \"aring\", \"ccedilla\", \"eacute\", \"egrave\", \"ecircumflex\", \"edieresis\",\n  \"iacute\", \"igrave\", \"icircumflex\", \"idieresis\", \"ntilde\", \"oacute\", \"ograve\",\n  \"ocircumflex\", \"odieresis\", \"otilde\", \"uacute\", \"ugrave\", \"ucircumflex\",\n  \"udieresis\", \"dagger\", \"degree\", \"cent\", \"sterling\", \"section\", \"bullet\",\n  \"paragraph\", \"germandbls\", \"registered\", \"copyright\", \"trademark\", \"acute\",\n  \"dieresis\", \"notequal\", \"AE\", \"Oslash\", \"infinity\", \"plusminus\", \"lessequal\",\n  \"greaterequal\", \"yen\", \"mu\", \"partialdiff\", \"summation\", \"product\", \"pi\",\n  \"integral\", \"ordfeminine\", \"ordmasculine\", \"Omega\", \"ae\", \"oslash\",\n  \"questiondown\", \"exclamdown\", \"logicalnot\", \"radical\", \"florin\",\n  \"approxequal\", \"Delta\", \"guillemotleft\", \"guillemotright\", \"ellipsis\",\n  \"nonbreakingspace\", \"Agrave\", \"Atilde\", \"Otilde\", \"OE\", \"oe\", \"endash\",\n  \"emdash\", \"quotedblleft\", \"quotedblright\", \"quoteleft\", \"quoteright\",\n  \"divide\", \"lozenge\", \"ydieresis\", \"Ydieresis\", \"fraction\", \"currency\",\n  \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"daggerdbl\", \"periodcentered\",\n  \"quotesinglbase\", \"quotedblbase\", \"perthousand\", \"Acircumflex\",\n  \"Ecircumflex\", \"Aacute\", \"Edieresis\", \"Egrave\", \"Iacute\", \"Icircumflex\",\n  \"Idieresis\", \"Igrave\", \"Oacute\", \"Ocircumflex\", \"apple\", \"Ograve\", \"Uacute\",\n  \"Ucircumflex\", \"Ugrave\", \"dotlessi\", \"circumflex\", \"tilde\", \"macron\",\n  \"breve\", \"dotaccent\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\", \"caron\",\n  \"Lslash\", \"lslash\", \"Scaron\", \"scaron\", \"Zcaron\", \"zcaron\", \"brokenbar\",\n  \"Eth\", \"eth\", \"Yacute\", \"yacute\", \"Thorn\", \"thorn\", \"minus\", \"multiply\",\n  \"onesuperior\", \"twosuperior\", \"threesuperior\", \"onehalf\", \"onequarter\",\n  \"threequarters\", \"franc\", \"Gbreve\", \"gbreve\", \"Idotaccent\", \"Scedilla\",\n  \"scedilla\", \"Cacute\", \"cacute\", \"Ccaron\", \"ccaron\", \"dcroat\"];\n\n// Some bad PDF generators, e.g. Scribus PDF, include glyph names\n// in a 'uniXXXX' format -- attempting to recover proper ones.\nfunction recoverGlyphName(name, glyphsUnicodeMap) {\n  if (glyphsUnicodeMap[name] !== undefined) {\n    return name;\n  }\n  // The glyph name is non-standard, trying to recover.\n  const unicode = getUnicodeForGlyph(name, glyphsUnicodeMap);\n  if (unicode !== -1) {\n    for (const key in glyphsUnicodeMap) {\n      if (glyphsUnicodeMap[key] === unicode) {\n        return key;\n      }\n    }\n  }\n  info(\"Unable to recover a standard glyph name for: \" + name);\n  return name;\n}\n\n/**\n * Shared logic for building a char code to glyph id mapping for Type1 and\n * simple CFF fonts. See section 9.6.6.2 of the spec.\n * @param {Object} properties Font properties object.\n * @param {Object} builtInEncoding The encoding contained within the actual font\n *   data.\n * @param {Array} glyphNames Array of glyph names where the index is the\n *   glyph ID.\n * @returns {Object} A char code to glyph ID map.\n */\nfunction type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {\n  const charCodeToGlyphId = Object.create(null);\n  let glyphId, charCode, baseEncoding;\n  const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n\n  if (properties.isInternalFont) {\n    baseEncoding = builtInEncoding;\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : /* notdef = */ 0;\n    }\n  } else if (properties.baseEncodingName) {\n    // If a valid base encoding name was used, the mapping is initialized with\n    // that.\n    baseEncoding = getEncoding(properties.baseEncodingName);\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : /* notdef = */ 0;\n    }\n  } else if (isSymbolicFont) {\n    // For a symbolic font the encoding should be the fonts built-in encoding.\n    for (charCode in builtInEncoding) {\n      charCodeToGlyphId[charCode] = builtInEncoding[charCode];\n    }\n  } else {\n    // For non-symbolic fonts that don't have a base encoding the standard\n    // encoding should be used.\n    baseEncoding = StandardEncoding;\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : /* notdef = */ 0;\n    }\n  }\n\n  // Lastly, merge in the differences.\n  const differences = properties.differences;\n  let glyphsUnicodeMap;\n  if (differences) {\n    for (charCode in differences) {\n      const glyphName = differences[charCode];\n      glyphId = glyphNames.indexOf(glyphName);\n\n      if (glyphId === -1) {\n        if (!glyphsUnicodeMap) {\n          glyphsUnicodeMap = getGlyphsUnicode();\n        }\n        const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n        if (standardGlyphName !== glyphName) {\n          glyphId = glyphNames.indexOf(standardGlyphName);\n        }\n      }\n      charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : /* notdef = */ 0;\n    }\n  }\n  return charCodeToGlyphId;\n}\n\nfunction normalizeFontName(name) {\n  return name.replaceAll(/[,_]/g, \"-\").replaceAll(/\\s/g, \"\");\n}\n\nconst getVerticalPresentationForm = getLookupTableFactory(t => {\n  // This table has been found at\n  // https://searchfox.org/mozilla-central/rev/cbdfa503a87597b20719aae5f6a1efccd6cb3b7b/gfx/thebes/gfxHarfBuzzShaper.cpp#251-294\n  t[0x2013] = 0xfe32; // EN DASH\n  t[0x2014] = 0xfe31; // EM DASH\n  t[0x2025] = 0xfe30; // TWO DOT LEADER\n  t[0x2026] = 0xfe19; // HORIZONTAL ELLIPSIS\n  t[0x3001] = 0xfe11; // IDEOGRAPHIC COMMA\n  t[0x3002] = 0xfe12; // IDEOGRAPHIC FULL STOP\n  t[0x3008] = 0xfe3f; // LEFT ANGLE BRACKET\n  t[0x3009] = 0xfe40; // RIGHT ANGLE BRACKET\n  t[0x300a] = 0xfe3d; // LEFT DOUBLE ANGLE BRACKET\n  t[0x300b] = 0xfe3e; // RIGHT DOUBLE ANGLE BRACKET\n  t[0x300c] = 0xfe41; // LEFT CORNER BRACKET\n  t[0x300d] = 0xfe42; // RIGHT CORNER BRACKET\n  t[0x300e] = 0xfe43; // LEFT WHITE CORNER BRACKET\n  t[0x300f] = 0xfe44; // RIGHT WHITE CORNER BRACKET\n  t[0x3010] = 0xfe3b; // LEFT BLACK LENTICULAR BRACKET\n  t[0x3011] = 0xfe3c; // RIGHT BLACK LENTICULAR BRACKET\n  t[0x3014] = 0xfe39; // LEFT TORTOISE SHELL BRACKET\n  t[0x3015] = 0xfe3a; // RIGHT TORTOISE SHELL BRACKET\n  t[0x3016] = 0xfe17; // LEFT WHITE LENTICULAR BRACKET\n  t[0x3017] = 0xfe18; // RIGHT WHITE LENTICULAR BRACKET\n  t[0xfe4f] = 0xfe34; // WAVY LOW LINE\n  t[0xff01] = 0xfe15; // FULLWIDTH EXCLAMATION MARK\n  t[0xff08] = 0xfe35; // FULLWIDTH LEFT PARENTHESIS\n  t[0xff09] = 0xfe36; // FULLWIDTH RIGHT PARENTHESIS\n  t[0xff0c] = 0xfe10; // FULLWIDTH COMMA\n  t[0xff1a] = 0xfe13; // FULLWIDTH COLON\n  t[0xff1b] = 0xfe14; // FULLWIDTH SEMICOLON\n  t[0xff1f] = 0xfe16; // FULLWIDTH QUESTION MARK\n  t[0xff3b] = 0xfe47; // FULLWIDTH LEFT SQUARE BRACKET\n  t[0xff3d] = 0xfe48; // FULLWIDTH RIGHT SQUARE BRACKET\n  t[0xff3f] = 0xfe33; // FULLWIDTH LOW LINE\n  t[0xff5b] = 0xfe37; // FULLWIDTH LEFT CURLY BRACKET\n  t[0xff5d] = 0xfe38; // FULLWIDTH RIGHT CURLY BRACKET\n});\n\n// To disable Type3 compilation, set the value to `-1`.\nconst MAX_SIZE_TO_COMPILE = 1000;\n\nfunction compileType3Glyph({ data: img, width, height }) {\n  if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) {\n    return null;\n  }\n\n  const POINT_TO_PROCESS_LIMIT = 1000;\n  const POINT_TYPES = new Uint8Array([\n    0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0,\n  ]);\n\n  const width1 = width + 1;\n  const points = new Uint8Array(width1 * (height + 1));\n  let i, j, j0;\n\n  // decodes bit-packed mask data\n  const lineSize = (width + 7) & ~7;\n  const data = new Uint8Array(lineSize * height);\n  let pos = 0;\n  for (const elem of img) {\n    let mask = 128;\n    while (mask > 0) {\n      data[pos++] = elem & mask ? 0 : 255;\n      mask >>= 1;\n    }\n  }\n\n  // finding interesting points: every point is located between mask pixels,\n  // so there will be points of the (width + 1)x(height + 1) grid. Every point\n  // will have flags assigned based on neighboring mask pixels:\n  //   4 | 8\n  //   --P--\n  //   2 | 1\n  // We are interested only in points with the flags:\n  //   - outside corners: 1, 2, 4, 8;\n  //   - inside corners: 7, 11, 13, 14;\n  //   - and, intersections: 5, 10.\n  let count = 0;\n  pos = 0;\n  if (data[pos] !== 0) {\n    points[0] = 1;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j] = data[pos] ? 2 : 1;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j] = 2;\n    ++count;\n  }\n  for (i = 1; i < height; i++) {\n    pos = i * lineSize;\n    j0 = i * width1;\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0] = data[pos] ? 1 : 8;\n      ++count;\n    }\n    // 'sum' is the position of the current pixel configuration in the 'TYPES'\n    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).\n    let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n    for (j = 1; j < width; j++) {\n      sum =\n        (sum >> 2) +\n        (data[pos + 1] ? 4 : 0) +\n        (data[pos - lineSize + 1] ? 8 : 0);\n      if (POINT_TYPES[sum]) {\n        points[j0 + j] = POINT_TYPES[sum];\n        ++count;\n      }\n      pos++;\n    }\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0 + j] = data[pos] ? 2 : 4;\n      ++count;\n    }\n\n    if (count > POINT_TO_PROCESS_LIMIT) {\n      return null;\n    }\n  }\n\n  pos = lineSize * (height - 1);\n  j0 = i * width1;\n  if (data[pos] !== 0) {\n    points[j0] = 8;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j0 + j] = data[pos] ? 4 : 8;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j0 + j] = 4;\n    ++count;\n  }\n  if (count > POINT_TO_PROCESS_LIMIT) {\n    return null;\n  }\n\n  // building outlines\n  const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n  const pathBuf = [];\n\n  // the path shall be painted in [0..1]x[0..1] space\n  const { a, b, c, d, e, f } = new DOMMatrix()\n    .scaleSelf(1 / width, -1 / height)\n    .translateSelf(0, -height);\n\n  for (i = 0; count && i <= height; i++) {\n    let p = i * width1;\n    const end = p + width;\n    while (p < end && !points[p]) {\n      p++;\n    }\n    if (p === end) {\n      continue;\n    }\n    let x = p % width1;\n    let y = i;\n    pathBuf.push(DrawOPS.moveTo, a * x + c * y + e, b * x + d * y + f);\n\n    const p0 = p;\n    let type = points[p];\n    do {\n      const step = steps[type];\n      do {\n        p += step;\n      } while (!points[p]);\n\n      const pp = points[p];\n      if (pp !== 5 && pp !== 10) {\n        // set new direction\n        type = pp;\n        // delete mark\n        points[p] = 0;\n      } else {\n        // type is 5 or 10, ie, a crossing\n        // set new direction\n        type = pp & ((0x33 * type) >> 4);\n        // set new type for \"future hit\"\n        points[p] &= (type >> 2) | (type << 2);\n      }\n      x = p % width1;\n      y = (p / width1) | 0;\n      pathBuf.push(DrawOPS.lineTo, a * x + c * y + e, b * x + d * y + f);\n\n      if (!points[p]) {\n        --count;\n      }\n    } while (p0 !== p);\n    --i;\n  }\n\n  return [\n    OPS.rawFillPath,\n    [new Float32Array(pathBuf)],\n    new Float32Array([0, 0, width, height]),\n  ];\n}\n\nexport {\n  compileType3Glyph,\n  FontFlags,\n  getVerticalPresentationForm,\n  MacStandardGlyphOrdering,\n  normalizeFontName,\n  recoverGlyphName,\n  SEAC_ANALYSIS_ENABLED,\n  type1FontGlyphMapping,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// prettier-ignore\nconst ISOAdobeCharset = [\n  \".notdef\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\",\n  \"percent\", \"ampersand\", \"quoteright\", \"parenleft\", \"parenright\",\n  \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\",\n  \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\",\n  \"nine\", \"colon\", \"semicolon\", \"less\", \"equal\", \"greater\", \"question\",\n  \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\",\n  \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\",\n  \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\", \"underscore\",\n  \"quoteleft\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\",\n  \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\",\n  \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"exclamdown\", \"cent\",\n  \"sterling\", \"fraction\", \"yen\", \"florin\", \"section\", \"currency\",\n  \"quotesingle\", \"quotedblleft\", \"guillemotleft\", \"guilsinglleft\",\n  \"guilsinglright\", \"fi\", \"fl\", \"endash\", \"dagger\", \"daggerdbl\",\n  \"periodcentered\", \"paragraph\", \"bullet\", \"quotesinglbase\",\n  \"quotedblbase\", \"quotedblright\", \"guillemotright\", \"ellipsis\",\n  \"perthousand\", \"questiondown\", \"grave\", \"acute\", \"circumflex\", \"tilde\",\n  \"macron\", \"breve\", \"dotaccent\", \"dieresis\", \"ring\", \"cedilla\",\n  \"hungarumlaut\", \"ogonek\", \"caron\", \"emdash\", \"AE\", \"ordfeminine\",\n  \"Lslash\", \"Oslash\", \"OE\", \"ordmasculine\", \"ae\", \"dotlessi\", \"lslash\",\n  \"oslash\", \"oe\", \"germandbls\", \"onesuperior\", \"logicalnot\", \"mu\",\n  \"trademark\", \"Eth\", \"onehalf\", \"plusminus\", \"Thorn\", \"onequarter\",\n  \"divide\", \"brokenbar\", \"degree\", \"thorn\", \"threequarters\", \"twosuperior\",\n  \"registered\", \"minus\", \"eth\", \"multiply\", \"threesuperior\", \"copyright\",\n  \"Aacute\", \"Acircumflex\", \"Adieresis\", \"Agrave\", \"Aring\", \"Atilde\",\n  \"Ccedilla\", \"Eacute\", \"Ecircumflex\", \"Edieresis\", \"Egrave\", \"Iacute\",\n  \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Ntilde\", \"Oacute\", \"Ocircumflex\",\n  \"Odieresis\", \"Ograve\", \"Otilde\", \"Scaron\", \"Uacute\", \"Ucircumflex\",\n  \"Udieresis\", \"Ugrave\", \"Yacute\", \"Ydieresis\", \"Zcaron\", \"aacute\",\n  \"acircumflex\", \"adieresis\", \"agrave\", \"aring\", \"atilde\", \"ccedilla\",\n  \"eacute\", \"ecircumflex\", \"edieresis\", \"egrave\", \"iacute\", \"icircumflex\",\n  \"idieresis\", \"igrave\", \"ntilde\", \"oacute\", \"ocircumflex\", \"odieresis\",\n  \"ograve\", \"otilde\", \"scaron\", \"uacute\", \"ucircumflex\", \"udieresis\",\n  \"ugrave\", \"yacute\", \"ydieresis\", \"zcaron\"\n];\n\n// prettier-ignore\nconst ExpertCharset = [\n  \".notdef\", \"space\", \"exclamsmall\", \"Hungarumlautsmall\", \"dollaroldstyle\",\n  \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\", \"parenleftsuperior\",\n  \"parenrightsuperior\", \"twodotenleader\", \"onedotenleader\", \"comma\",\n  \"hyphen\", \"period\", \"fraction\", \"zerooldstyle\", \"oneoldstyle\",\n  \"twooldstyle\", \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\",\n  \"sixoldstyle\", \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\",\n  \"colon\", \"semicolon\", \"commasuperior\", \"threequartersemdash\",\n  \"periodsuperior\", \"questionsmall\", \"asuperior\", \"bsuperior\",\n  \"centsuperior\", \"dsuperior\", \"esuperior\", \"isuperior\", \"lsuperior\",\n  \"msuperior\", \"nsuperior\", \"osuperior\", \"rsuperior\", \"ssuperior\",\n  \"tsuperior\", \"ff\", \"fi\", \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\",\n  \"parenrightinferior\", \"Circumflexsmall\", \"hyphensuperior\", \"Gravesmall\",\n  \"Asmall\", \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\",\n  \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\",\n  \"Osmall\", \"Psmall\", \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\",\n  \"Vsmall\", \"Wsmall\", \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\",\n  \"onefitted\", \"rupiah\", \"Tildesmall\", \"exclamdownsmall\", \"centoldstyle\",\n  \"Lslashsmall\", \"Scaronsmall\", \"Zcaronsmall\", \"Dieresissmall\",\n  \"Brevesmall\", \"Caronsmall\", \"Dotaccentsmall\", \"Macronsmall\",\n  \"figuredash\", \"hypheninferior\", \"Ogoneksmall\", \"Ringsmall\",\n  \"Cedillasmall\", \"onequarter\", \"onehalf\", \"threequarters\",\n  \"questiondownsmall\", \"oneeighth\", \"threeeighths\", \"fiveeighths\",\n  \"seveneighths\", \"onethird\", \"twothirds\", \"zerosuperior\", \"onesuperior\",\n  \"twosuperior\", \"threesuperior\", \"foursuperior\", \"fivesuperior\",\n  \"sixsuperior\", \"sevensuperior\", \"eightsuperior\", \"ninesuperior\",\n  \"zeroinferior\", \"oneinferior\", \"twoinferior\", \"threeinferior\",\n  \"fourinferior\", \"fiveinferior\", \"sixinferior\", \"seveninferior\",\n  \"eightinferior\", \"nineinferior\", \"centinferior\", \"dollarinferior\",\n  \"periodinferior\", \"commainferior\", \"Agravesmall\", \"Aacutesmall\",\n  \"Acircumflexsmall\", \"Atildesmall\", \"Adieresissmall\", \"Aringsmall\",\n  \"AEsmall\", \"Ccedillasmall\", \"Egravesmall\", \"Eacutesmall\",\n  \"Ecircumflexsmall\", \"Edieresissmall\", \"Igravesmall\", \"Iacutesmall\",\n  \"Icircumflexsmall\", \"Idieresissmall\", \"Ethsmall\", \"Ntildesmall\",\n  \"Ogravesmall\", \"Oacutesmall\", \"Ocircumflexsmall\", \"Otildesmall\",\n  \"Odieresissmall\", \"OEsmall\", \"Oslashsmall\", \"Ugravesmall\", \"Uacutesmall\",\n  \"Ucircumflexsmall\", \"Udieresissmall\", \"Yacutesmall\", \"Thornsmall\",\n  \"Ydieresissmall\"\n];\n\n// prettier-ignore\nconst ExpertSubsetCharset = [\n  \".notdef\", \"space\", \"dollaroldstyle\", \"dollarsuperior\",\n  \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\",\n  \"onedotenleader\", \"comma\", \"hyphen\", \"period\", \"fraction\",\n  \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\", \"threeoldstyle\",\n  \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\", \"sevenoldstyle\",\n  \"eightoldstyle\", \"nineoldstyle\", \"colon\", \"semicolon\", \"commasuperior\",\n  \"threequartersemdash\", \"periodsuperior\", \"asuperior\", \"bsuperior\",\n  \"centsuperior\", \"dsuperior\", \"esuperior\", \"isuperior\", \"lsuperior\",\n  \"msuperior\", \"nsuperior\", \"osuperior\", \"rsuperior\", \"ssuperior\",\n  \"tsuperior\", \"ff\", \"fi\", \"fl\", \"ffi\", \"ffl\", \"parenleftinferior\",\n  \"parenrightinferior\", \"hyphensuperior\", \"colonmonetary\", \"onefitted\",\n  \"rupiah\", \"centoldstyle\", \"figuredash\", \"hypheninferior\", \"onequarter\",\n  \"onehalf\", \"threequarters\", \"oneeighth\", \"threeeighths\", \"fiveeighths\",\n  \"seveneighths\", \"onethird\", \"twothirds\", \"zerosuperior\", \"onesuperior\",\n  \"twosuperior\", \"threesuperior\", \"foursuperior\", \"fivesuperior\",\n  \"sixsuperior\", \"sevensuperior\", \"eightsuperior\", \"ninesuperior\",\n  \"zeroinferior\", \"oneinferior\", \"twoinferior\", \"threeinferior\",\n  \"fourinferior\", \"fiveinferior\", \"sixinferior\", \"seveninferior\",\n  \"eightinferior\", \"nineinferior\", \"centinferior\", \"dollarinferior\",\n  \"periodinferior\", \"commainferior\"\n];\n\nexport { ExpertCharset, ExpertSubsetCharset, ISOAdobeCharset };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from \"../shared/util.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\nclass DataBuilder {\n  #buf;\n\n  #bufLength = 1024;\n\n  #hasExactLength = false;\n\n  #pos = 0;\n\n  #view;\n\n  constructor({ exactLength = 0, minLength = 0 }) {\n    this.#hasExactLength = !!exactLength;\n    this.#initBuf(exactLength || minLength);\n  }\n\n  #initBuf(minLength) {\n    if (this.#hasExactLength) {\n      this.#bufLength = minLength;\n    } else {\n      // Compute the first power of two that is as big as the `minLength`.\n      while (this.#bufLength < minLength) {\n        this.#bufLength *= 2;\n      }\n    }\n    const newBuf = new Uint8Array(this.#bufLength);\n\n    if (this.#buf) {\n      newBuf.set(this.#buf, 0);\n    }\n    this.#buf = newBuf;\n    this.#view = new DataView(newBuf.buffer);\n  }\n\n  get data() {\n    return this.#buf.subarray(0, this.#pos);\n  }\n\n  get length() {\n    return this.#pos;\n  }\n\n  skip(n) {\n    this.#pos += n;\n  }\n\n  setArray(arr) {\n    const newPos = this.#pos + arr.length;\n\n    if (!this.#hasExactLength && newPos > this.#bufLength) {\n      this.#initBuf(newPos);\n    }\n    this.#buf.set(arr, this.#pos);\n    this.#pos = newPos;\n  }\n\n  setInt16(val) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        typeof val === \"number\" && Math.abs(val) < 2 ** 16,\n        `setInt16: Unexpected input \"${val}\".`\n      );\n    }\n    const newPos = this.#pos + 2;\n\n    if (!this.#hasExactLength && newPos > this.#bufLength) {\n      this.#initBuf(newPos);\n    }\n    this.#view.setInt16(this.#pos, val);\n    this.#pos = newPos;\n  }\n\n  setSafeInt16(val) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        typeof val === \"number\" && !Number.isNaN(val),\n        `safeString16: Unexpected input \"${val}\".`\n      );\n    }\n    const newPos = this.#pos + 2;\n\n    if (!this.#hasExactLength && newPos > this.#bufLength) {\n      this.#initBuf(newPos);\n    }\n    // clamp value to the 16-bit int range\n    this.#view.setInt16(this.#pos, MathClamp(val, -0x8000, 0x7fff));\n    this.#pos = newPos;\n  }\n\n  setInt32(val) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        typeof val === \"number\" && Math.abs(val) < 2 ** 32,\n        `setInt32: Unexpected input \"${val}\".`\n      );\n    }\n    const newPos = this.#pos + 4;\n\n    if (!this.#hasExactLength && newPos > this.#bufLength) {\n      this.#initBuf(newPos);\n    }\n    this.#view.setInt32(this.#pos, val);\n    this.#pos = newPos;\n  }\n}\n\nexport { DataBuilder };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  bytesToString,\n  FormatError,\n  info,\n  isArrayEqual,\n  shadow,\n  stringToBytes,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  ExpertCharset,\n  ExpertSubsetCharset,\n  ISOAdobeCharset,\n} from \"./charsets.js\";\nimport { ExpertEncoding, StandardEncoding } from \"./encodings.js\";\nimport { DataBuilder } from \"./data_builder.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\n// Maximum subroutine call depth of type 2 charstrings. Matches OTS.\nconst MAX_SUBR_NESTING = 10;\n\nfunction looksLikeUnsigned16BitNegative(coord) {\n  return coord > 0x7fff && coord <= 0xffff;\n}\n\nfunction recoverSigned16BitBBox(bbox, onlyLowerLeft = false) {\n  return Util.normalizeRect(\n    bbox.map((coord, i) =>\n      (!onlyLowerLeft || i < 2) && looksLikeUnsigned16BitNegative(coord)\n        ? coord - 0x10000\n        : coord\n    )\n  );\n}\n\n/**\n * The CFF class takes a Type1 file and wrap it into a\n * 'Compact Font Format' which itself embed Type2 charstrings.\n */\n// prettier-ignore\nconst CFFStandardStrings = [\n  \".notdef\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\", \"percent\",\n  \"ampersand\", \"quoteright\", \"parenleft\", \"parenright\", \"asterisk\", \"plus\",\n  \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\", \"two\", \"three\", \"four\",\n  \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\", \"semicolon\", \"less\",\n  \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\",\n  \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\",\n  \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\", \"bracketright\", \"asciicircum\",\n  \"underscore\", \"quoteleft\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\",\n  \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\",\n  \"z\", \"braceleft\", \"bar\", \"braceright\", \"asciitilde\", \"exclamdown\", \"cent\",\n  \"sterling\", \"fraction\", \"yen\", \"florin\", \"section\", \"currency\",\n  \"quotesingle\", \"quotedblleft\", \"guillemotleft\", \"guilsinglleft\",\n  \"guilsinglright\", \"fi\", \"fl\", \"endash\", \"dagger\", \"daggerdbl\",\n  \"periodcentered\", \"paragraph\", \"bullet\", \"quotesinglbase\", \"quotedblbase\",\n  \"quotedblright\", \"guillemotright\", \"ellipsis\", \"perthousand\", \"questiondown\",\n  \"grave\", \"acute\", \"circumflex\", \"tilde\", \"macron\", \"breve\", \"dotaccent\",\n  \"dieresis\", \"ring\", \"cedilla\", \"hungarumlaut\", \"ogonek\", \"caron\", \"emdash\",\n  \"AE\", \"ordfeminine\", \"Lslash\", \"Oslash\", \"OE\", \"ordmasculine\", \"ae\",\n  \"dotlessi\", \"lslash\", \"oslash\", \"oe\", \"germandbls\", \"onesuperior\",\n  \"logicalnot\", \"mu\", \"trademark\", \"Eth\", \"onehalf\", \"plusminus\", \"Thorn\",\n  \"onequarter\", \"divide\", \"brokenbar\", \"degree\", \"thorn\", \"threequarters\",\n  \"twosuperior\", \"registered\", \"minus\", \"eth\", \"multiply\", \"threesuperior\",\n  \"copyright\", \"Aacute\", \"Acircumflex\", \"Adieresis\", \"Agrave\", \"Aring\",\n  \"Atilde\", \"Ccedilla\", \"Eacute\", \"Ecircumflex\", \"Edieresis\", \"Egrave\",\n  \"Iacute\", \"Icircumflex\", \"Idieresis\", \"Igrave\", \"Ntilde\", \"Oacute\",\n  \"Ocircumflex\", \"Odieresis\", \"Ograve\", \"Otilde\", \"Scaron\", \"Uacute\",\n  \"Ucircumflex\", \"Udieresis\", \"Ugrave\", \"Yacute\", \"Ydieresis\", \"Zcaron\",\n  \"aacute\", \"acircumflex\", \"adieresis\", \"agrave\", \"aring\", \"atilde\",\n  \"ccedilla\", \"eacute\", \"ecircumflex\", \"edieresis\", \"egrave\", \"iacute\",\n  \"icircumflex\", \"idieresis\", \"igrave\", \"ntilde\", \"oacute\", \"ocircumflex\",\n  \"odieresis\", \"ograve\", \"otilde\", \"scaron\", \"uacute\", \"ucircumflex\",\n  \"udieresis\", \"ugrave\", \"yacute\", \"ydieresis\", \"zcaron\", \"exclamsmall\",\n  \"Hungarumlautsmall\", \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\",\n  \"Acutesmall\", \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\",\n  \"onedotenleader\", \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\",\n  \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\",\n  \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\", \"commasuperior\",\n  \"threequartersemdash\", \"periodsuperior\", \"questionsmall\", \"asuperior\",\n  \"bsuperior\", \"centsuperior\", \"dsuperior\", \"esuperior\", \"isuperior\",\n  \"lsuperior\", \"msuperior\", \"nsuperior\", \"osuperior\", \"rsuperior\", \"ssuperior\",\n  \"tsuperior\", \"ff\", \"ffi\", \"ffl\", \"parenleftinferior\", \"parenrightinferior\",\n  \"Circumflexsmall\", \"hyphensuperior\", \"Gravesmall\", \"Asmall\", \"Bsmall\",\n  \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\", \"Hsmall\", \"Ismall\",\n  \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\", \"Osmall\", \"Psmall\",\n  \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\", \"Vsmall\", \"Wsmall\",\n  \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\", \"onefitted\", \"rupiah\",\n  \"Tildesmall\", \"exclamdownsmall\", \"centoldstyle\", \"Lslashsmall\",\n  \"Scaronsmall\", \"Zcaronsmall\", \"Dieresissmall\", \"Brevesmall\", \"Caronsmall\",\n  \"Dotaccentsmall\", \"Macronsmall\", \"figuredash\", \"hypheninferior\",\n  \"Ogoneksmall\", \"Ringsmall\", \"Cedillasmall\", \"questiondownsmall\", \"oneeighth\",\n  \"threeeighths\", \"fiveeighths\", \"seveneighths\", \"onethird\", \"twothirds\",\n  \"zerosuperior\", \"foursuperior\", \"fivesuperior\", \"sixsuperior\",\n  \"sevensuperior\", \"eightsuperior\", \"ninesuperior\", \"zeroinferior\",\n  \"oneinferior\", \"twoinferior\", \"threeinferior\", \"fourinferior\",\n  \"fiveinferior\", \"sixinferior\", \"seveninferior\", \"eightinferior\",\n  \"nineinferior\", \"centinferior\", \"dollarinferior\", \"periodinferior\",\n  \"commainferior\", \"Agravesmall\", \"Aacutesmall\", \"Acircumflexsmall\",\n  \"Atildesmall\", \"Adieresissmall\", \"Aringsmall\", \"AEsmall\", \"Ccedillasmall\",\n  \"Egravesmall\", \"Eacutesmall\", \"Ecircumflexsmall\", \"Edieresissmall\",\n  \"Igravesmall\", \"Iacutesmall\", \"Icircumflexsmall\", \"Idieresissmall\",\n  \"Ethsmall\", \"Ntildesmall\", \"Ogravesmall\", \"Oacutesmall\", \"Ocircumflexsmall\",\n  \"Otildesmall\", \"Odieresissmall\", \"OEsmall\", \"Oslashsmall\", \"Ugravesmall\",\n  \"Uacutesmall\", \"Ucircumflexsmall\", \"Udieresissmall\", \"Yacutesmall\",\n  \"Thornsmall\", \"Ydieresissmall\", \"001.000\", \"001.001\", \"001.002\", \"001.003\",\n  \"Black\", \"Bold\", \"Book\", \"Light\", \"Medium\", \"Regular\", \"Roman\", \"Semibold\"\n];\n\nconst NUM_STANDARD_CFF_STRINGS = 391;\n\nconst DEFAULT_BLUE_SCALE = 0.039625;\nconst DEFAULT_BLUE_SHIFT = 7;\nconst DEFAULT_BLUE_FUZZ = 1;\nconst DEFAULT_EXPANSION_FACTOR = 0.06;\n\nconst CharstringValidationData = [\n  /*  0 */ null,\n  /*  1 */ { id: \"hstem\", min: 2, stackClearing: true, stem: true },\n  /*  2 */ null,\n  /*  3 */ { id: \"vstem\", min: 2, stackClearing: true, stem: true },\n  /*  4 */ { id: \"vmoveto\", min: 1, stackClearing: true },\n  /*  5 */ { id: \"rlineto\", min: 2, resetStack: true },\n  /*  6 */ { id: \"hlineto\", min: 1, resetStack: true },\n  /*  7 */ { id: \"vlineto\", min: 1, resetStack: true },\n  /*  8 */ { id: \"rrcurveto\", min: 6, resetStack: true },\n  /*  9 */ null,\n  /* 10 */ { id: \"callsubr\", min: 1 },\n  /* 11 */ { id: \"return\", min: 0 },\n  /* 12 */ null,\n  /* 13 */ null,\n  /* 14 */ { id: \"endchar\", min: 0, stackClearing: true },\n  /* 15 */ null,\n  /* 16 */ null,\n  /* 17 */ null,\n  /* 18 */ { id: \"hstemhm\", min: 2, stackClearing: true, stem: true },\n  /* 19 */ { id: \"hintmask\", min: 0, stackClearing: true },\n  /* 20 */ { id: \"cntrmask\", min: 0, stackClearing: true },\n  /* 21 */ { id: \"rmoveto\", min: 2, stackClearing: true },\n  /* 22 */ { id: \"hmoveto\", min: 1, stackClearing: true },\n  /* 23 */ { id: \"vstemhm\", min: 2, stackClearing: true, stem: true },\n  /* 24 */ { id: \"rcurveline\", min: 8, resetStack: true },\n  /* 25 */ { id: \"rlinecurve\", min: 8, resetStack: true },\n  /* 26 */ { id: \"vvcurveto\", min: 4, resetStack: true },\n  /* 27 */ { id: \"hhcurveto\", min: 4, resetStack: true },\n  /* 28 */ null, // shortint\n  /* 29 */ { id: \"callgsubr\", min: 1 },\n  /* 30 */ { id: \"vhcurveto\", min: 4, resetStack: true },\n  /* 31 */ { id: \"hvcurveto\", min: 4, resetStack: true },\n];\n\nconst CharstringValidationData12 = [\n  null,\n  null,\n  null,\n  { id: \"and\", min: 2, stackDelta: -1 },\n  { id: \"or\", min: 2, stackDelta: -1 },\n  { id: \"not\", min: 1, stackDelta: 0 },\n  null,\n  null,\n  null,\n  { id: \"abs\", min: 1, stackDelta: 0 },\n  {\n    id: \"add\",\n    min: 2,\n    stackDelta: -1,\n    stackFn(stack, index) {\n      stack[index - 2] = stack[index - 2] + stack[index - 1];\n    },\n  },\n  {\n    id: \"sub\",\n    min: 2,\n    stackDelta: -1,\n    stackFn(stack, index) {\n      stack[index - 2] = stack[index - 2] - stack[index - 1];\n    },\n  },\n  {\n    id: \"div\",\n    min: 2,\n    stackDelta: -1,\n    stackFn(stack, index) {\n      stack[index - 2] = stack[index - 2] / stack[index - 1];\n    },\n  },\n  null,\n  {\n    id: \"neg\",\n    min: 1,\n    stackDelta: 0,\n    stackFn(stack, index) {\n      stack[index - 1] = -stack[index - 1];\n    },\n  },\n  { id: \"eq\", min: 2, stackDelta: -1 },\n  null,\n  null,\n  { id: \"drop\", min: 1, stackDelta: -1 },\n  null,\n  { id: \"put\", min: 2, stackDelta: -2 },\n  { id: \"get\", min: 1, stackDelta: 0 },\n  { id: \"ifelse\", min: 4, stackDelta: -3 },\n  { id: \"random\", min: 0, stackDelta: 1 },\n  {\n    id: \"mul\",\n    min: 2,\n    stackDelta: -1,\n    stackFn(stack, index) {\n      stack[index - 2] = stack[index - 2] * stack[index - 1];\n    },\n  },\n  null,\n  { id: \"sqrt\", min: 1, stackDelta: 0 },\n  { id: \"dup\", min: 1, stackDelta: 1 },\n  { id: \"exch\", min: 2, stackDelta: 0 },\n  { id: \"index\", min: 2, stackDelta: 0 },\n  { id: \"roll\", min: 3, stackDelta: -2 },\n  null,\n  null,\n  null,\n  { id: \"hflex\", min: 7, resetStack: true },\n  { id: \"flex\", min: 13, resetStack: true },\n  { id: \"hflex1\", min: 9, resetStack: true },\n  { id: \"flex1\", min: 11, resetStack: true },\n];\n\nclass CFFParser {\n  constructor(file, properties, seacAnalysisEnabled) {\n    this.bytes = file.getBytes();\n    this.properties = properties;\n    this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n  }\n\n  parse() {\n    const properties = this.properties;\n    const cff = new CFF(this.bytes.length);\n    this.cff = cff;\n\n    // The first five sections must be in order, all the others are reached\n    // via offsets contained in one of the below.\n    const header = this.parseHeader();\n    const nameIndex = this.parseIndex(header.endPos);\n    const topDictIndex = this.parseIndex(nameIndex.endPos);\n    const stringIndex = this.parseIndex(topDictIndex.endPos);\n    const globalSubrIndex = this.parseIndex(stringIndex.endPos);\n\n    const topDictParsed = this.parseDict(topDictIndex.obj.get(0));\n    const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);\n\n    cff.header = header.obj;\n    cff.names = this.parseNameIndex(nameIndex.obj);\n    cff.strings = this.parseStringIndex(stringIndex.obj);\n    cff.topDict = topDict;\n    cff.globalSubrIndex = globalSubrIndex.obj;\n\n    this.parsePrivateDict(cff.topDict);\n\n    cff.isCIDFont = topDict.hasName(\"ROS\");\n\n    const charStringOffset = topDict.getByName(\"CharStrings\");\n    const charStringIndex = this.parseIndex(charStringOffset).obj;\n\n    cff.charStringCount = charStringIndex.count;\n\n    const fontMatrix = topDict.getByName(\"FontMatrix\");\n    if (fontMatrix) {\n      properties.fontMatrix = fontMatrix;\n    }\n\n    let fontBBox = topDict.getByName(\"FontBBox\");\n    const descriptorBBox = properties.bbox?.some(coord => coord !== 0)\n      ? recoverSigned16BitBBox(properties.bbox)\n      : null;\n    const cffBBoxHasUnsignedLowerLeft = fontBBox\n      ?.slice(0, 2)\n      .some(looksLikeUnsigned16BitNegative);\n    const cffBBoxHasUnsignedCoords = fontBBox?.some(\n      looksLikeUnsigned16BitNegative\n    );\n    if (fontBBox?.every(coord => coord === 0) && descriptorBBox) {\n      // The CFF FontBBox is empty, hence fall back to the FontDescriptor bbox.\n      fontBBox = descriptorBBox;\n      topDict.setByName(\"FontBBox\", fontBBox);\n    } else if (cffBBoxHasUnsignedCoords) {\n      const recoveredFontBBox = recoverSigned16BitBBox(fontBBox);\n      const descriptorCorroborates =\n        descriptorBBox &&\n        properties.bbox.some(coord => coord < 0) &&\n        !properties.bbox.some(looksLikeUnsigned16BitNegative) &&\n        isArrayEqual(recoveredFontBBox, descriptorBBox);\n\n      if (descriptorCorroborates || cffBBoxHasUnsignedLowerLeft) {\n        // Some Ghostscript-generated CFF fonts encode negative lower-left\n        // coordinates as unsigned 16-bit values. Preserve large upper-right\n        // coordinates unless the descriptor independently confirms the repair.\n        fontBBox = descriptorCorroborates\n          ? recoveredFontBBox\n          : recoverSigned16BitBBox(fontBBox, /* onlyLowerLeft = */ true);\n        topDict.setByName(\"FontBBox\", fontBBox);\n      }\n    }\n    if (fontBBox?.some(coord => coord !== 0)) {\n      // adjusting ascent/descent\n      properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n      properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n      properties.ascentScaled = true;\n    }\n\n    let charset, encoding;\n    if (cff.isCIDFont) {\n      const fdArrayIndex = this.parseIndex(topDict.getByName(\"FDArray\")).obj;\n      for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) {\n        const dictRaw = fdArrayIndex.get(i);\n        const fontDict = this.createDict(\n          CFFTopDict,\n          this.parseDict(dictRaw),\n          cff.strings\n        );\n        this.parsePrivateDict(fontDict);\n        cff.fdArray.push(fontDict);\n      }\n      // cid fonts don't have an encoding\n      encoding = null;\n      charset = this.parseCharsets(\n        topDict.getByName(\"charset\"),\n        charStringIndex.count,\n        cff.strings,\n        true\n      );\n      cff.fdSelect = this.parseFDSelect(\n        topDict.getByName(\"FDSelect\"),\n        charStringIndex.count\n      );\n    } else {\n      charset = this.parseCharsets(\n        topDict.getByName(\"charset\"),\n        charStringIndex.count,\n        cff.strings,\n        false\n      );\n      encoding = this.parseEncoding(\n        topDict.getByName(\"Encoding\"),\n        properties,\n        cff.strings,\n        charset.charset\n      );\n    }\n\n    cff.charset = charset;\n    cff.encoding = encoding;\n\n    const charStringsAndSeacs = this.parseCharStrings({\n      charStrings: charStringIndex,\n      localSubrIndex: topDict.privateDict.subrsIndex,\n      globalSubrIndex: globalSubrIndex.obj,\n      fdSelect: cff.fdSelect,\n      fdArray: cff.fdArray,\n      privateDict: topDict.privateDict,\n    });\n    cff.charStrings = charStringsAndSeacs.charStrings;\n    cff.seacs = charStringsAndSeacs.seacs;\n    cff.widths = charStringsAndSeacs.widths;\n\n    return cff;\n  }\n\n  parseHeader() {\n    let bytes = this.bytes;\n    const bytesLength = bytes.length;\n    let offset = 0;\n\n    // Prevent an infinite loop, by checking that the offset is within the\n    // bounds of the bytes array. Necessary in empty, or invalid, font files.\n    while (offset < bytesLength && bytes[offset] !== 1) {\n      ++offset;\n    }\n    if (offset >= bytesLength) {\n      throw new FormatError(\"Invalid CFF header\");\n    }\n    if (offset !== 0) {\n      info(\"cff data is shifted\");\n      bytes = bytes.subarray(offset);\n      this.bytes = bytes;\n    }\n    const major = bytes[0];\n    const minor = bytes[1];\n    const hdrSize = bytes[2];\n    const offSize = bytes[3];\n    const header = new CFFHeader(major, minor, hdrSize, offSize);\n    return { obj: header, endPos: hdrSize };\n  }\n\n  parseDict(dict) {\n    const view = new DataView(dict.buffer, dict.byteOffset, dict.bytesLength);\n    let pos = 0;\n\n    function parseOperand() {\n      let value = dict[pos++];\n      if (value === 30) {\n        return parseFloatOperand();\n      } else if (value === 28) {\n        value = view.getInt16(pos);\n        pos += 2;\n        return value;\n      } else if (value === 29) {\n        value = view.getInt32(pos);\n        pos += 4;\n        return value;\n      } else if (value >= 32 && value <= 246) {\n        return value - 139;\n      } else if (value >= 247 && value <= 250) {\n        return (value - 247) * 256 + dict[pos++] + 108;\n      } else if (value >= 251 && value <= 254) {\n        return -((value - 251) * 256) - dict[pos++] - 108;\n      }\n      warn(`CFFParser.parseDict: \"${value}\" is a reserved command.`);\n      return NaN;\n    }\n\n    function parseFloatOperand() {\n      let str = \"\";\n      const eof = 15;\n      // prettier-ignore\n      const lookup = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\",\n                      \"9\", \".\", \"E\", \"E-\", null, \"-\"];\n      const length = dict.length;\n      while (pos < length) {\n        const b = dict[pos++];\n        const b1 = b >> 4;\n        const b2 = b & 15;\n\n        if (b1 === eof) {\n          break;\n        }\n        str += lookup[b1];\n\n        if (b2 === eof) {\n          break;\n        }\n        str += lookup[b2];\n      }\n      return parseFloat(str);\n    }\n\n    let operands = [];\n    const entries = [];\n\n    pos = 0;\n    const end = dict.length;\n    while (pos < end) {\n      let b = dict[pos];\n      if (b <= 21) {\n        if (b === 12) {\n          b = (b << 8) | dict[++pos];\n        }\n        entries.push([b, operands]);\n        operands = [];\n        ++pos;\n      } else {\n        operands.push(parseOperand());\n      }\n    }\n    return entries;\n  }\n\n  parseIndex(pos) {\n    const cffIndex = new CFFIndex();\n    const bytes = this.bytes;\n    const count = (bytes[pos++] << 8) | bytes[pos++];\n    const offsets = [];\n    let end = pos;\n    let i, ii;\n\n    if (count !== 0) {\n      const offsetSize = bytes[pos++];\n      // add 1 for offset to determine size of last object\n      const startPos = pos + (count + 1) * offsetSize - 1;\n\n      for (i = 0, ii = count + 1; i < ii; ++i) {\n        let offset = 0;\n        for (let j = 0; j < offsetSize; ++j) {\n          offset <<= 8;\n          offset += bytes[pos++];\n        }\n        offsets.push(startPos + offset);\n      }\n      end = offsets[count];\n    }\n    for (i = 0, ii = offsets.length - 1; i < ii; ++i) {\n      const offsetStart = offsets[i];\n      const offsetEnd = offsets[i + 1];\n      cffIndex.add(bytes.subarray(offsetStart, offsetEnd));\n    }\n    return { obj: cffIndex, endPos: end };\n  }\n\n  parseNameIndex(index) {\n    const names = [];\n    for (let i = 0, ii = index.count; i < ii; ++i) {\n      const name = index.get(i);\n      names.push(bytesToString(name));\n    }\n    return names;\n  }\n\n  parseStringIndex(index) {\n    const strings = new CFFStrings();\n    for (let i = 0, ii = index.count; i < ii; ++i) {\n      const data = index.get(i);\n      strings.add(bytesToString(data));\n    }\n    return strings;\n  }\n\n  createDict(Type, dict, strings) {\n    const cffDict = new Type(strings);\n    for (const [key, value] of dict) {\n      cffDict.setByKey(key, value);\n    }\n    return cffDict;\n  }\n\n  parseCharString(state, data, localSubrIndex, globalSubrIndex) {\n    if (!data || state.callDepth > MAX_SUBR_NESTING) {\n      return false;\n    }\n    const view = new DataView(data.buffer, data.byteOffset, data.bytesLength);\n    let stackSize = state.stackSize;\n    const stack = state.stack;\n\n    let length = data.length;\n\n    for (let j = 0; j < length; ) {\n      const value = data[j++];\n      let validationCommand = null;\n      if (value === 12) {\n        const q = data[j++];\n        if (q === 0) {\n          // The CFF specification state that the 'dotsection' command\n          // (12, 0) is deprecated and treated as a no-op, but all Type2\n          // charstrings processors should support them. Unfortunately\n          // the font sanitizer don't. As a workaround the sequence (12, 0)\n          // is replaced by a useless (0, hmoveto).\n          data[j - 2] = 139;\n          data[j - 1] = 22;\n          stackSize = 0;\n        } else {\n          validationCommand = CharstringValidationData12[q];\n        }\n      } else if (value === 28) {\n        // number (16 bit)\n        stack[stackSize] = view.getInt16(j);\n        j += 2;\n        stackSize++;\n      } else if (value === 14) {\n        if (stackSize >= 4) {\n          stackSize -= 4;\n          if (this.seacAnalysisEnabled) {\n            state.seac = stack.slice(stackSize, stackSize + 4);\n            return false;\n          }\n        }\n        validationCommand = CharstringValidationData[value];\n      } else if (value >= 32 && value <= 246) {\n        // number\n        stack[stackSize] = value - 139;\n        stackSize++;\n      } else if (value >= 247 && value <= 254) {\n        // number (+1 bytes)\n        stack[stackSize] =\n          value < 251\n            ? ((value - 247) << 8) + data[j] + 108\n            : -((value - 251) << 8) - data[j] - 108;\n        j++;\n        stackSize++;\n      } else if (value === 255) {\n        // number (32 bit)\n        stack[stackSize] = view.getInt32(j) / 65536;\n        j += 4;\n        stackSize++;\n      } else if (value === 19 || value === 20) {\n        state.hints += stackSize >> 1;\n        if (state.hints === 0) {\n          // Not a valid value (see bug 1529502): just remove it.\n          data.copyWithin(j - 1, j, -1);\n          j -= 1;\n          length -= 1;\n          continue;\n        }\n        // skipping right amount of hints flag data\n        j += (state.hints + 7) >> 3;\n        stackSize %= 2;\n        validationCommand = CharstringValidationData[value];\n      } else if (value === 10 || value === 29) {\n        const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex;\n        if (!subrsIndex) {\n          validationCommand = CharstringValidationData[value];\n          warn(\"Missing subrsIndex for \" + validationCommand.id);\n          return false;\n        }\n        let bias = 32768;\n        if (subrsIndex.count < 1240) {\n          bias = 107;\n        } else if (subrsIndex.count < 33900) {\n          bias = 1131;\n        }\n        const subrNumber = stack[--stackSize] + bias;\n        if (\n          subrNumber < 0 ||\n          subrNumber >= subrsIndex.count ||\n          isNaN(subrNumber)\n        ) {\n          validationCommand = CharstringValidationData[value];\n          warn(\"Out of bounds subrIndex for \" + validationCommand.id);\n          return false;\n        }\n        state.stackSize = stackSize;\n        state.callDepth++;\n        const valid = this.parseCharString(\n          state,\n          subrsIndex.get(subrNumber),\n          localSubrIndex,\n          globalSubrIndex\n        );\n        if (!valid) {\n          return false;\n        }\n        state.callDepth--;\n        stackSize = state.stackSize;\n        continue;\n      } else if (value === 11) {\n        state.stackSize = stackSize;\n        return true;\n      } else if (value === 0 && j === data.length) {\n        // Operator 0 is not used according to the current spec and\n        // it's the last char and consequently it's likely a terminator.\n        // So just replace it by endchar command to make OTS happy.\n        data[j - 1] = 14;\n        validationCommand = CharstringValidationData[14];\n      } else if (value === 9) {\n        // Not a valid value.\n        data.copyWithin(j - 1, j, -1);\n        j -= 1;\n        length -= 1;\n        continue;\n      } else {\n        validationCommand = CharstringValidationData[value];\n      }\n      if (validationCommand) {\n        if (validationCommand.stem) {\n          state.hints += stackSize >> 1;\n          if (value === 3 || value === 23) {\n            // vstem or vstemhm.\n            state.hasVStems = true;\n          } else if (state.hasVStems && (value === 1 || value === 18)) {\n            // Some browsers don't draw glyphs that specify vstems before\n            // hstems. As a workaround, replace hstem (1) and hstemhm (18)\n            // with a pointless vstem (3) or vstemhm (23).\n            warn(\"CFF stem hints are in wrong order\");\n            data[j - 1] = value === 1 ? 3 : 23;\n          }\n        }\n        if (stackSize < validationCommand.min) {\n          warn(\n            \"Not enough parameters for \" +\n              validationCommand.id +\n              \"; actual: \" +\n              stackSize +\n              \", expected: \" +\n              validationCommand.min\n          );\n\n          if (stackSize === 0) {\n            // Just \"fix\" the outline in replacing command by a endchar:\n            // it could lead to wrong rendering of some glyphs or not.\n            // For example, the pdf in #6132 is well-rendered.\n            data[j - 1] = 14;\n            return true;\n          }\n          return false;\n        }\n        if (state.firstStackClearing && validationCommand.stackClearing) {\n          state.firstStackClearing = false;\n          // the optional character width can be found before the first\n          // stack-clearing command arguments\n          stackSize -= validationCommand.min;\n          if (stackSize >= 2 && validationCommand.stem) {\n            // there are even amount of arguments for stem commands\n            stackSize %= 2;\n          } else if (stackSize > 1) {\n            warn(\"Found too many parameters for stack-clearing command\");\n          }\n          if (stackSize > 0) {\n            // Width can be any number since its the difference\n            // from nominalWidthX.\n            state.width = stack[stackSize - 1];\n          }\n        }\n        if (\"stackDelta\" in validationCommand) {\n          if (\"stackFn\" in validationCommand) {\n            validationCommand.stackFn(stack, stackSize);\n          }\n          stackSize += validationCommand.stackDelta;\n        } else if (\n          validationCommand.stackClearing ||\n          validationCommand.resetStack\n        ) {\n          stackSize = 0;\n        }\n      }\n    }\n    if (length < data.length) {\n      data.fill(/* endchar = */ 14, length);\n    }\n    state.stackSize = stackSize;\n    return true;\n  }\n\n  parseCharStrings({\n    charStrings,\n    localSubrIndex,\n    globalSubrIndex,\n    fdSelect,\n    fdArray,\n    privateDict,\n  }) {\n    const seacs = [];\n    const widths = [];\n    const count = charStrings.count;\n    for (let i = 0; i < count; i++) {\n      const charstring = charStrings.get(i);\n      const state = {\n        callDepth: 0,\n        stackSize: 0,\n        stack: [],\n        hints: 0,\n        firstStackClearing: true,\n        seac: null,\n        width: null,\n        hasVStems: false,\n      };\n      let valid = true;\n      let localSubrToUse = null;\n      let privateDictToUse = privateDict;\n      if (fdSelect && fdArray.length) {\n        const fdIndex = fdSelect.getFDIndex(i);\n        if (fdIndex === -1) {\n          warn(\"Glyph index is not in fd select.\");\n          valid = false;\n        }\n        if (fdIndex >= fdArray.length) {\n          warn(\"Invalid fd index for glyph index.\");\n          valid = false;\n        }\n        if (valid) {\n          privateDictToUse = fdArray[fdIndex].privateDict;\n          localSubrToUse = privateDictToUse.subrsIndex;\n        }\n      } else if (localSubrIndex) {\n        localSubrToUse = localSubrIndex;\n      }\n      if (valid) {\n        valid = this.parseCharString(\n          state,\n          charstring,\n          localSubrToUse,\n          globalSubrIndex\n        );\n      }\n      if (state.width !== null) {\n        const nominalWidth = privateDictToUse.getByName(\"nominalWidthX\");\n        widths[i] = nominalWidth + state.width;\n      } else {\n        const defaultWidth = privateDictToUse.getByName(\"defaultWidthX\");\n        widths[i] = defaultWidth;\n      }\n      if (state.seac !== null) {\n        seacs[i] = state.seac;\n      }\n      if (!valid) {\n        // resetting invalid charstring to single 'endchar'\n        charStrings.set(i, new Uint8Array([14]));\n      }\n    }\n    return { charStrings, seacs, widths };\n  }\n\n  emptyPrivateDictionary(parentDict) {\n    const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);\n    parentDict.setByKey(18, [0, 0]);\n    parentDict.privateDict = privateDict;\n  }\n\n  parsePrivateDict(parentDict) {\n    // no private dict, do nothing\n    if (!parentDict.hasName(\"Private\")) {\n      this.emptyPrivateDictionary(parentDict);\n      return;\n    }\n    const privateOffset = parentDict.getByName(\"Private\");\n    // make sure the params are formatted correctly\n    if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {\n      parentDict.removeByName(\"Private\");\n      return;\n    }\n    const size = privateOffset[0];\n    const offset = privateOffset[1];\n    // remove empty dicts or ones that refer to invalid location\n    if (size === 0 || offset >= this.bytes.length) {\n      this.emptyPrivateDictionary(parentDict);\n      return;\n    }\n    // The Private DICT extends past the end of the font data, which means\n    // the embedded font is truncated; abort so the caller can substitute a\n    // system font instead of rendering blank glyphs (issue 7625).\n    if (offset + size > this.bytes.length) {\n      throw new FormatError(\"CFF Private DICT extends past end of font\");\n    }\n\n    const privateDictEnd = offset + size;\n    const dictData = this.bytes.subarray(offset, privateDictEnd);\n    const dict = this.parseDict(dictData);\n    const privateDict = this.createDict(\n      CFFPrivateDict,\n      dict,\n      parentDict.strings\n    );\n    parentDict.privateDict = privateDict;\n\n    const blueScale = privateDict.getByName(\"BlueScale\");\n    const blueShift = privateDict.getByName(\"BlueShift\");\n    const blueFuzz = privateDict.getByName(\"BlueFuzz\");\n    const expansionFactor = privateDict.getByName(\"ExpansionFactor\");\n    if (\n      blueScale === 0 &&\n      blueShift === 0 &&\n      blueFuzz === 0 &&\n      expansionFactor === 0\n    ) {\n      // Ghostscript can fail to initialize Private DICT defaults before\n      // writing them, which leaves omitted blue zone values as explicit\n      // zeroes. This has been seen in FDArray entries.\n      privateDict.setByName(\"BlueScale\", DEFAULT_BLUE_SCALE);\n      privateDict.setByName(\"BlueShift\", DEFAULT_BLUE_SHIFT);\n      privateDict.setByName(\"BlueFuzz\", DEFAULT_BLUE_FUZZ);\n    }\n\n    if (expansionFactor === 0) {\n      // Firefox doesn't render correctly such a font on Windows (see issue\n      // 15289), hence we just reset it to its default value.\n      privateDict.setByName(\"ExpansionFactor\", DEFAULT_EXPANSION_FACTOR);\n    }\n    if (blueScale > 0) {\n      // Adobe's font validator (AFDKO, see `absfont.cpp`) flags BlueScale as\n      // out-of-range when `BlueScale * maxZoneHeight` is below 0.5 or above 1.\n      // The Type 2 hinting engine in coretype/FreeType disables the lower\n      // clamp at render time because library fonts with small zones and a\n      // default BlueScale (0.039625) trip the threshold even though they\n      // render correctly. To avoid changing those fonts here, only apply\n      // the lower clamp when BlueScale is also smaller than the default,\n      // i.e. when the font genuinely deviates from the standard value.\n      // The upper clamp matches what FreeType already enforces (psblues.c)\n      // and is safe to apply unconditionally.\n      let maxZoneHeight = 0;\n      for (const zones of [\n        privateDict.getByName(\"BlueValues\"),\n        privateDict.getByName(\"OtherBlues\"),\n      ]) {\n        if (!zones) {\n          continue;\n        }\n        // BlueValues/OtherBlues are stored as deltas where the odd-indexed\n        // entries are the heights of each zone.\n        for (let i = 1; i < zones.length; i += 2) {\n          if (zones[i] > maxZoneHeight) {\n            maxZoneHeight = zones[i];\n          }\n        }\n      }\n      if (maxZoneHeight > 0) {\n        // The lower bound of AFDKO's valid window is `0.5 / maxZoneHeight`.\n        // When that bound is itself above the default BlueScale the font simply\n        // has small zones (e.g. Eurostile LT Std, or the SofiaPro fonts shipped\n        // with a near-default 0.037): even the default 0.039625 would be\n        // flagged as out-of-range, so this is the rendered intent and forcing\n        // BlueScale up only misaligns/collapses overshooting glyphs (notably\n        // with macOS's Core Text rasterizer). Only apply the lower clamp when\n        // its target does not exceed the default.\n        // Round the bound in order to avoid too long operand (issue 21466).\n        const PRECISION = 1e5;\n        const lowerBound = 0.5 / maxZoneHeight;\n        const minBlueScale =\n          lowerBound <= DEFAULT_BLUE_SCALE\n            ? Math.ceil(lowerBound * PRECISION) / PRECISION\n            : -Infinity;\n        const maxBlueScale = Math.floor(PRECISION / maxZoneHeight) / PRECISION;\n        const clamped = MathClamp(blueScale, minBlueScale, maxBlueScale);\n        if (clamped !== blueScale) {\n          privateDict.setByName(\"BlueScale\", clamped);\n        }\n      }\n    }\n\n    // Parse the Subrs index also since it's relative to the private dict.\n    if (!privateDict.getByName(\"Subrs\")) {\n      return;\n    }\n    const subrsOffset = privateDict.getByName(\"Subrs\");\n    const relativeOffset = offset + subrsOffset;\n    // Validate the offset.\n    if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {\n      this.emptyPrivateDictionary(parentDict);\n      return;\n    }\n    const subrsIndex = this.parseIndex(relativeOffset);\n    privateDict.subrsIndex = subrsIndex.obj;\n  }\n\n  parseCharsets(pos, length, strings, cid) {\n    if (pos === 0) {\n      return new CFFCharset(\n        true,\n        CFFCharsetPredefinedTypes.ISO_ADOBE,\n        ISOAdobeCharset\n      );\n    } else if (pos === 1) {\n      return new CFFCharset(\n        true,\n        CFFCharsetPredefinedTypes.EXPERT,\n        ExpertCharset\n      );\n    } else if (pos === 2) {\n      return new CFFCharset(\n        true,\n        CFFCharsetPredefinedTypes.EXPERT_SUBSET,\n        ExpertSubsetCharset\n      );\n    }\n\n    const { bytes } = this;\n    const format = bytes[pos++];\n    const charset = [cid ? 0 : \".notdef\"];\n    let id, count, i;\n\n    // subtract 1 for the .notdef glyph\n    length -= 1;\n\n    switch (format) {\n      case 0:\n        for (i = 0; i < length; i++) {\n          id = (bytes[pos++] << 8) | bytes[pos++];\n          charset.push(cid ? id : strings.get(id));\n        }\n        break;\n      case 1:\n        while (charset.length <= length) {\n          id = (bytes[pos++] << 8) | bytes[pos++];\n          count = bytes[pos++];\n          for (i = 0; i <= count; i++) {\n            charset.push(cid ? id++ : strings.get(id++));\n          }\n        }\n        break;\n      case 2:\n        while (charset.length <= length) {\n          id = (bytes[pos++] << 8) | bytes[pos++];\n          count = (bytes[pos++] << 8) | bytes[pos++];\n          for (i = 0; i <= count; i++) {\n            charset.push(cid ? id++ : strings.get(id++));\n          }\n        }\n        break;\n      default:\n        throw new FormatError(\"Unknown charset format\");\n    }\n\n    return new CFFCharset(false, format, charset);\n  }\n\n  parseEncoding(pos, properties, strings, charset) {\n    const encoding = Object.create(null);\n    const bytes = this.bytes;\n    let predefined = false;\n    let format, i, ii;\n    let raw = null;\n\n    function readSupplement() {\n      const supplementsCount = bytes[pos++];\n      for (i = 0; i < supplementsCount; i++) {\n        const code = bytes[pos++];\n        const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);\n        encoding[code] = charset.indexOf(strings.get(sid));\n      }\n    }\n\n    if (pos === 0 || pos === 1) {\n      predefined = true;\n      format = pos;\n      const baseEncoding = pos ? ExpertEncoding : StandardEncoding;\n      for (i = 0, ii = charset.length; i < ii; i++) {\n        const index = baseEncoding.indexOf(charset[i]);\n        if (index !== -1) {\n          encoding[index] = i;\n        }\n      }\n    } else {\n      const dataStart = pos;\n      format = bytes[pos++];\n      switch (format & 0x7f) {\n        case 0:\n          const glyphsCount = bytes[pos++];\n          for (i = 1; i <= glyphsCount; i++) {\n            encoding[bytes[pos++]] = i;\n          }\n          break;\n\n        case 1:\n          const rangesCount = bytes[pos++];\n          let gid = 1;\n          for (i = 0; i < rangesCount; i++) {\n            const start = bytes[pos++];\n            const left = bytes[pos++];\n            for (let j = start; j <= start + left; j++) {\n              encoding[j] = gid++;\n            }\n          }\n          break;\n\n        default:\n          throw new FormatError(`Unknown encoding format: ${format} in CFF`);\n      }\n      const dataEnd = pos;\n      if (format & 0x80) {\n        // hasSupplement\n        // The font sanitizer does not support CFF encoding with a\n        // supplement, since the encoding is not really used to map\n        // between gid to glyph, let's overwrite what is declared in\n        // the top dictionary to let the sanitizer think the font use\n        // StandardEncoding, that's a lie but that's ok.\n        bytes[dataStart] &= 0x7f;\n        readSupplement();\n      }\n      raw = bytes.subarray(dataStart, dataEnd);\n    }\n    format &= 0x7f;\n    return new CFFEncoding(predefined, format, encoding, raw);\n  }\n\n  parseFDSelect(pos, length) {\n    const bytes = this.bytes;\n    const format = bytes[pos++];\n    const fdSelect = [];\n    let i;\n\n    switch (format) {\n      case 0:\n        for (i = 0; i < length; ++i) {\n          const id = bytes[pos++];\n          fdSelect.push(id);\n        }\n        break;\n      case 3:\n        const rangesCount = (bytes[pos++] << 8) | bytes[pos++];\n        for (i = 0; i < rangesCount; ++i) {\n          let first = (bytes[pos++] << 8) | bytes[pos++];\n          if (i === 0 && first !== 0) {\n            warn(\n              \"parseFDSelect: The first range must have a first GID of 0\" +\n                \" -- trying to recover.\"\n            );\n            first = 0;\n          }\n          const fdIndex = bytes[pos++];\n          const next = (bytes[pos] << 8) | bytes[pos + 1];\n          for (let j = first; j < next; ++j) {\n            fdSelect.push(fdIndex);\n          }\n        }\n        // Advance past the sentinel(next).\n        pos += 2;\n        break;\n      default:\n        throw new FormatError(`parseFDSelect: Unknown format \"${format}\".`);\n    }\n    if (fdSelect.length !== length) {\n      throw new FormatError(\"parseFDSelect: Invalid font data.\");\n    }\n\n    return new CFFFDSelect(format, fdSelect);\n  }\n}\n\n// Compact Font Format\nclass CFF {\n  header = null;\n\n  names = [];\n\n  topDict = null;\n\n  strings = new CFFStrings();\n\n  globalSubrIndex = null;\n\n  // The following could really be per font, but since we only have one font\n  // store them here.\n  encoding = null;\n\n  charset = null;\n\n  charStrings = null;\n\n  fdArray = [];\n\n  fdSelect = null;\n\n  isCIDFont = false;\n\n  charStringCount = 0;\n\n  constructor(rawFileLength = 0) {\n    this.rawFileLength = rawFileLength;\n  }\n\n  duplicateFirstGlyph() {\n    // Browsers will not display a glyph at position 0. Typically glyph 0 is\n    // notdef, but a number of fonts put a valid glyph there so it must be\n    // duplicated and appended.\n    if (this.charStrings.count >= 65535) {\n      warn(\"Not enough space in charstrings to duplicate first glyph.\");\n      return;\n    }\n    const glyphZero = this.charStrings.get(0);\n    this.charStrings.add(glyphZero);\n    if (this.isCIDFont) {\n      this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);\n    }\n  }\n\n  hasGlyphId(id) {\n    if (id < 0 || id >= this.charStrings.count) {\n      return false;\n    }\n    const glyph = this.charStrings.get(id);\n    return glyph.length > 0;\n  }\n}\n\nclass CFFHeader {\n  constructor(major, minor, hdrSize, offSize) {\n    this.major = major;\n    this.minor = minor;\n    this.hdrSize = hdrSize;\n    this.offSize = offSize;\n  }\n}\n\nclass CFFStrings {\n  strings = [];\n\n  get(index) {\n    if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) {\n      return CFFStandardStrings[index];\n    }\n    if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) {\n      return this.strings[index - NUM_STANDARD_CFF_STRINGS];\n    }\n    return CFFStandardStrings[0];\n  }\n\n  getSID(str) {\n    let index = CFFStandardStrings.indexOf(str);\n    if (index !== -1) {\n      return index;\n    }\n    index = this.strings.indexOf(str);\n    if (index !== -1) {\n      return index + NUM_STANDARD_CFF_STRINGS;\n    }\n    return -1;\n  }\n\n  add(value) {\n    this.strings.push(value);\n  }\n\n  get count() {\n    return this.strings.length;\n  }\n}\n\nclass CFFIndex {\n  objects = [];\n\n  length = 0;\n\n  add(data) {\n    this.length += data.length;\n    this.objects.push(data);\n  }\n\n  set(index, data) {\n    this.length += data.length - this.objects[index].length;\n    this.objects[index] = data;\n  }\n\n  get(index) {\n    return this.objects[index];\n  }\n\n  get count() {\n    return this.objects.length;\n  }\n}\n\nclass CFFDict {\n  constructor(tables, strings) {\n    this.keyToNameMap = tables.keyToNameMap;\n    this.nameToKeyMap = tables.nameToKeyMap;\n    this.defaults = tables.defaults;\n    this.types = tables.types;\n    this.opcodes = tables.opcodes;\n    this.order = tables.order;\n    this.strings = strings;\n    this.values = Object.create(null);\n  }\n\n  // value should always be an array\n  setByKey(key, value) {\n    if (!(key in this.keyToNameMap)) {\n      return false;\n    }\n    // ignore empty values\n    if (value.length === 0) {\n      return true;\n    }\n    // Ignore invalid values (fixes bug1068432.pdf and bug1308536.pdf).\n    for (const val of value) {\n      if (isNaN(val)) {\n        warn(`Invalid CFFDict value: \"${value}\" for key \"${key}\".`);\n        return true;\n      }\n    }\n    const type = this.types[key];\n    // remove the array wrapping these types of values\n    if (type === \"num\" || type === \"sid\" || type === \"offset\") {\n      value = value[0];\n    }\n    this.values[key] = value;\n    return true;\n  }\n\n  setByName(name, value) {\n    if (!(name in this.nameToKeyMap)) {\n      throw new FormatError(`Invalid dictionary name \"${name}\"`);\n    }\n    this.values[this.nameToKeyMap[name]] = value;\n  }\n\n  hasName(name) {\n    return this.nameToKeyMap[name] in this.values;\n  }\n\n  getByName(name) {\n    if (!(name in this.nameToKeyMap)) {\n      throw new FormatError(`Invalid dictionary name ${name}\"`);\n    }\n    const key = this.nameToKeyMap[name];\n    if (!(key in this.values)) {\n      return this.defaults[key];\n    }\n    return this.values[key];\n  }\n\n  removeByName(name) {\n    delete this.values[this.nameToKeyMap[name]];\n  }\n\n  static createTables(layout) {\n    const tables = {\n      keyToNameMap: {},\n      nameToKeyMap: {},\n      defaults: {},\n      types: {},\n      opcodes: {},\n      order: [],\n    };\n    for (const entry of layout) {\n      const key = Array.isArray(entry[0])\n        ? (entry[0][0] << 8) + entry[0][1]\n        : entry[0];\n      tables.keyToNameMap[key] = entry[1];\n      tables.nameToKeyMap[entry[1]] = key;\n      tables.types[key] = entry[2];\n      tables.defaults[key] = entry[3];\n      tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];\n      tables.order.push(key);\n    }\n    return tables;\n  }\n}\n\nconst CFFTopDictLayout = [\n  [[12, 30], \"ROS\", [\"sid\", \"sid\", \"num\"], null],\n  [[12, 20], \"SyntheticBase\", \"num\", null],\n  [0, \"version\", \"sid\", null],\n  [1, \"Notice\", \"sid\", null],\n  [[12, 0], \"Copyright\", \"sid\", null],\n  [2, \"FullName\", \"sid\", null],\n  [3, \"FamilyName\", \"sid\", null],\n  [4, \"Weight\", \"sid\", null],\n  [[12, 1], \"isFixedPitch\", \"num\", 0],\n  [[12, 2], \"ItalicAngle\", \"num\", 0],\n  [[12, 3], \"UnderlinePosition\", \"num\", -100],\n  [[12, 4], \"UnderlineThickness\", \"num\", 50],\n  [[12, 5], \"PaintType\", \"num\", 0],\n  [[12, 6], \"CharstringType\", \"num\", 2],\n  // prettier-ignore\n  [[12, 7], \"FontMatrix\", [\"num\", \"num\", \"num\", \"num\", \"num\", \"num\"],\n                          [0.001, 0, 0, 0.001, 0, 0]],\n  [13, \"UniqueID\", \"num\", null],\n  [5, \"FontBBox\", [\"num\", \"num\", \"num\", \"num\"], [0, 0, 0, 0]],\n  [[12, 8], \"StrokeWidth\", \"num\", 0],\n  [14, \"XUID\", \"array\", null],\n  [15, \"charset\", \"offset\", 0],\n  [16, \"Encoding\", \"offset\", 0],\n  [17, \"CharStrings\", \"offset\", 0],\n  [18, \"Private\", [\"offset\", \"offset\"], null],\n  [[12, 21], \"PostScript\", \"sid\", null],\n  [[12, 22], \"BaseFontName\", \"sid\", null],\n  [[12, 23], \"BaseFontBlend\", \"delta\", null],\n  [[12, 31], \"CIDFontVersion\", \"num\", 0],\n  [[12, 32], \"CIDFontRevision\", \"num\", 0],\n  [[12, 33], \"CIDFontType\", \"num\", 0],\n  [[12, 34], \"CIDCount\", \"num\", 8720],\n  [[12, 35], \"UIDBase\", \"num\", null],\n  // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes\n  // before FDArray.\n  [[12, 37], \"FDSelect\", \"offset\", null],\n  [[12, 36], \"FDArray\", \"offset\", null],\n  [[12, 38], \"FontName\", \"sid\", null],\n];\n\nclass CFFTopDict extends CFFDict {\n  static get tables() {\n    return shadow(this, \"tables\", this.createTables(CFFTopDictLayout));\n  }\n\n  constructor(strings) {\n    super(CFFTopDict.tables, strings);\n    this.privateDict = null;\n  }\n}\n\nconst CFFPrivateDictLayout = [\n  [6, \"BlueValues\", \"delta\", null],\n  [7, \"OtherBlues\", \"delta\", null],\n  [8, \"FamilyBlues\", \"delta\", null],\n  [9, \"FamilyOtherBlues\", \"delta\", null],\n  [[12, 9], \"BlueScale\", \"num\", DEFAULT_BLUE_SCALE],\n  [[12, 10], \"BlueShift\", \"num\", DEFAULT_BLUE_SHIFT],\n  [[12, 11], \"BlueFuzz\", \"num\", DEFAULT_BLUE_FUZZ],\n  [10, \"StdHW\", \"num\", null],\n  [11, \"StdVW\", \"num\", null],\n  [[12, 12], \"StemSnapH\", \"delta\", null],\n  [[12, 13], \"StemSnapV\", \"delta\", null],\n  [[12, 14], \"ForceBold\", \"num\", 0],\n  [[12, 17], \"LanguageGroup\", \"num\", 0],\n  [[12, 18], \"ExpansionFactor\", \"num\", DEFAULT_EXPANSION_FACTOR],\n  [[12, 19], \"initialRandomSeed\", \"num\", 0],\n  [20, \"defaultWidthX\", \"num\", 0],\n  [21, \"nominalWidthX\", \"num\", 0],\n  [19, \"Subrs\", \"offset\", null],\n];\n\nclass CFFPrivateDict extends CFFDict {\n  static get tables() {\n    return shadow(this, \"tables\", this.createTables(CFFPrivateDictLayout));\n  }\n\n  constructor(strings) {\n    super(CFFPrivateDict.tables, strings);\n    this.subrsIndex = null;\n  }\n}\n\nconst CFFCharsetPredefinedTypes = {\n  ISO_ADOBE: 0,\n  EXPERT: 1,\n  EXPERT_SUBSET: 2,\n};\n\nclass CFFCharset {\n  constructor(predefined, format, charset) {\n    this.predefined = predefined;\n    this.format = format;\n    this.charset = charset;\n  }\n}\n\nclass CFFEncoding {\n  constructor(predefined, format, encoding, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.encoding = encoding;\n    this.raw = raw;\n  }\n}\n\nclass CFFFDSelect {\n  constructor(format, fdSelect) {\n    this.format = format;\n    this.fdSelect = fdSelect;\n  }\n\n  getFDIndex(glyphIndex) {\n    if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {\n      return -1;\n    }\n    return this.fdSelect[glyphIndex];\n  }\n}\n\n// Helper class to keep track of where an offset is within the data and helps\n// filling in that offset once it's known.\nclass CFFOffsetTracker {\n  offsets = Object.create(null);\n\n  isTracking(key) {\n    return key in this.offsets;\n  }\n\n  track(key, location) {\n    if (key in this.offsets) {\n      throw new FormatError(`Already tracking location of ${key}`);\n    }\n    this.offsets[key] = location;\n  }\n\n  offset(value) {\n    for (const key in this.offsets) {\n      this.offsets[key] += value;\n    }\n  }\n\n  setEntryLocation(key, values, output) {\n    if (!(key in this.offsets)) {\n      throw new FormatError(`Not tracking location of ${key}`);\n    }\n    const data = output.data;\n    const dataOffset = this.offsets[key];\n    const size = 5;\n    for (let i = 0, ii = values.length; i < ii; ++i) {\n      const offset0 = i * size + dataOffset;\n      const offset1 = offset0 + 1;\n      const offset2 = offset0 + 2;\n      const offset3 = offset0 + 3;\n      const offset4 = offset0 + 4;\n      // It's easy to screw up offsets so perform this sanity check.\n      if (\n        data[offset0] !== 0x1d ||\n        data[offset1] !== 0 ||\n        data[offset2] !== 0 ||\n        data[offset3] !== 0 ||\n        data[offset4] !== 0\n      ) {\n        throw new FormatError(\"writing to an offset that is not empty\");\n      }\n      const value = values[i];\n      data[offset0] = 0x1d;\n      data[offset1] = (value >> 24) & 0xff;\n      data[offset2] = (value >> 16) & 0xff;\n      data[offset3] = (value >> 8) & 0xff;\n      data[offset4] = value & 0xff;\n    }\n  }\n}\n\n// Takes a CFF and converts it to the binary representation.\nclass CFFCompiler {\n  constructor(cff) {\n    this.cff = cff;\n  }\n\n  compile() {\n    const cff = this.cff;\n    const output = new DataBuilder({ minLength: cff.rawFileLength });\n\n    // Compile the five entries that must be in order.\n    const header = this.compileHeader(cff.header);\n    output.setArray(header);\n\n    const nameIndex = this.compileNameIndex(cff.names);\n    output.setArray(nameIndex);\n\n    if (cff.isCIDFont) {\n      // The spec is unclear on how font matrices should relate to each other\n      // when there is one in the main top dict and the sub top dicts.\n      // Windows handles this differently than linux and osx so we have to\n      // normalize to work on all.\n      // Rules based off of some mailing list discussions:\n      // - If main font has a matrix and subfont doesn't, use the main matrix.\n      // - If no main font matrix and there is a subfont matrix, use the\n      //   subfont matrix.\n      // - If both have matrices, concat together.\n      // - If neither have matrices, use default.\n      // To make this work on all platforms we move the top matrix into each\n      // sub top dict and concat if necessary.\n      if (cff.topDict.hasName(\"FontMatrix\")) {\n        const base = cff.topDict.getByName(\"FontMatrix\");\n        cff.topDict.removeByName(\"FontMatrix\");\n        for (const subDict of cff.fdArray) {\n          let matrix = base.slice(0);\n          if (subDict.hasName(\"FontMatrix\")) {\n            matrix = Util.transform(matrix, subDict.getByName(\"FontMatrix\"));\n          }\n          subDict.setByName(\"FontMatrix\", matrix);\n        }\n      }\n    }\n\n    const xuid = cff.topDict.getByName(\"XUID\");\n    if (xuid?.length > 16) {\n      // Length of XUID array must not be greater than 16 (issue #12399).\n      cff.topDict.removeByName(\"XUID\");\n    }\n\n    cff.topDict.setByName(\"charset\", 0);\n    let compiled = this.compileTopDicts(\n      [cff.topDict],\n      output.length,\n      cff.isCIDFont\n    );\n    output.setArray(compiled.output);\n    const topDictTracker = compiled.trackers[0];\n\n    const stringIndex = this.compileStringIndex(cff.strings.strings);\n    output.setArray(stringIndex);\n\n    const globalSubrIndex = this.compileIndex(cff.globalSubrIndex);\n    output.setArray(globalSubrIndex);\n\n    // Now start on the other entries that have no specific order.\n    if (cff.encoding && cff.topDict.hasName(\"Encoding\")) {\n      if (cff.encoding.predefined) {\n        topDictTracker.setEntryLocation(\n          \"Encoding\",\n          [cff.encoding.format],\n          output\n        );\n      } else {\n        const encoding = this.compileEncoding(cff.encoding);\n        topDictTracker.setEntryLocation(\"Encoding\", [output.length], output);\n        output.setArray(encoding);\n      }\n    }\n    const charset = this.compileCharset(\n      cff.charset,\n      cff.charStrings.count,\n      cff.strings,\n      cff.isCIDFont\n    );\n    topDictTracker.setEntryLocation(\"charset\", [output.length], output);\n    output.setArray(charset);\n\n    const charStrings = this.compileCharStrings(cff.charStrings);\n    topDictTracker.setEntryLocation(\"CharStrings\", [output.length], output);\n    output.setArray(charStrings);\n\n    if (cff.isCIDFont) {\n      // For some reason FDSelect must be in front of FDArray on windows. OSX\n      // and linux don't seem to care.\n      topDictTracker.setEntryLocation(\"FDSelect\", [output.length], output);\n      const fdSelect = this.compileFDSelect(cff.fdSelect);\n      output.setArray(fdSelect);\n      // It is unclear if the sub font dictionary can have CID related\n      // dictionary keys, but the sanitizer doesn't like them so remove them.\n      compiled = this.compileTopDicts(cff.fdArray, output.length, true);\n      topDictTracker.setEntryLocation(\"FDArray\", [output.length], output);\n      output.setArray(compiled.output);\n      const fontDictTrackers = compiled.trackers;\n\n      this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);\n    }\n\n    this.compilePrivateDicts([cff.topDict], [topDictTracker], output);\n\n    // If the font data ends with INDEX whose object data is zero-length,\n    // the sanitizer will bail out. Add a dummy byte to avoid that.\n    output.setArray([0]);\n\n    return output.data;\n  }\n\n  encodeNumber(value) {\n    if (Number.isInteger(value)) {\n      return this.encodeInteger(value);\n    }\n    return this.encodeFloat(value);\n  }\n\n  static get EncodeFloatRegExp() {\n    return shadow(\n      this,\n      \"EncodeFloatRegExp\",\n      /\\.(\\d*?)(?:9{5,20}|0{5,20})\\d{0,2}(?:e(.+)|$)/\n    );\n  }\n\n  encodeFloat(num) {\n    let value = num.toString();\n\n    // Rounding inaccurate doubles.\n    const m = CFFCompiler.EncodeFloatRegExp.exec(value);\n    if (m) {\n      const epsilon = parseFloat(\"1e\" + ((m[2] ? +m[2] : 0) + m[1].length));\n      value = (Math.round(num * epsilon) / epsilon).toString();\n    }\n\n    let nibbles = \"\";\n    let i, ii;\n    for (i = 0, ii = value.length; i < ii; ++i) {\n      const a = value[i];\n      if (a === \"e\") {\n        nibbles += value[++i] === \"-\" ? \"c\" : \"b\";\n      } else if (a === \".\") {\n        nibbles += \"a\";\n      } else if (a === \"-\") {\n        nibbles += \"e\";\n      } else {\n        nibbles += a;\n      }\n    }\n    nibbles += nibbles.length & 1 ? \"f\" : \"ff\";\n    const out = [30];\n    for (i = 0, ii = nibbles.length; i < ii; i += 2) {\n      out.push(parseInt(nibbles.substring(i, i + 2), 16));\n    }\n    return out;\n  }\n\n  encodeInteger(value) {\n    let code;\n    if (value >= -107 && value <= 107) {\n      code = [value + 139];\n    } else if (value >= 108 && value <= 1131) {\n      value -= 108;\n      code = [(value >> 8) + 247, value & 0xff];\n    } else if (value >= -1131 && value <= -108) {\n      value = -value - 108;\n      code = [(value >> 8) + 251, value & 0xff];\n    } else if (value >= -32768 && value <= 32767) {\n      code = [0x1c, (value >> 8) & 0xff, value & 0xff];\n    } else {\n      code = [\n        0x1d,\n        (value >> 24) & 0xff,\n        (value >> 16) & 0xff,\n        (value >> 8) & 0xff,\n        value & 0xff,\n      ];\n    }\n    return code;\n  }\n\n  compileHeader(header) {\n    // `header.hdrSize` can be any value but we only write 4 values\n    // so header size is 4 (prevents OTS from rejecting the font).\n    return [header.major, header.minor, 4, header.offSize];\n  }\n\n  compileNameIndex(names) {\n    const nameIndex = new CFFIndex();\n    for (const name of names) {\n      // OTS doesn't allow names to be over 127 characters.\n      const length = Math.min(name.length, 127);\n      let sanitizedName = new Array(length);\n      for (let j = 0; j < length; j++) {\n        // OTS requires chars to be between a range and not certain other\n        // chars.\n        let char = name[j];\n        if (\n          char < \"!\" ||\n          char > \"~\" ||\n          char === \"[\" ||\n          char === \"]\" ||\n          char === \"(\" ||\n          char === \")\" ||\n          char === \"{\" ||\n          char === \"}\" ||\n          char === \"<\" ||\n          char === \">\" ||\n          char === \"/\" ||\n          char === \"%\"\n        ) {\n          char = \"_\";\n        }\n        sanitizedName[j] = char;\n      }\n      sanitizedName = sanitizedName.join(\"\");\n\n      if (sanitizedName === \"\") {\n        sanitizedName = \"Bad_Font_Name\";\n      }\n      nameIndex.add(stringToBytes(sanitizedName));\n    }\n    return this.compileIndex(nameIndex);\n  }\n\n  compileTopDicts(dicts, length, removeCidKeys) {\n    const fontDictTrackers = [];\n    let fdArrayIndex = new CFFIndex();\n    for (const fontDict of dicts) {\n      if (removeCidKeys) {\n        fontDict.removeByName(\"CIDFontVersion\");\n        fontDict.removeByName(\"CIDFontRevision\");\n        fontDict.removeByName(\"CIDFontType\");\n        fontDict.removeByName(\"CIDCount\");\n        fontDict.removeByName(\"UIDBase\");\n      }\n      const fontDictTracker = new CFFOffsetTracker();\n      const fontDictData = this.compileDict(fontDict, fontDictTracker);\n      fontDictTrackers.push(fontDictTracker);\n      fdArrayIndex.add(fontDictData);\n      fontDictTracker.offset(length);\n    }\n    fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);\n    return {\n      trackers: fontDictTrackers,\n      output: fdArrayIndex,\n    };\n  }\n\n  compilePrivateDicts(dicts, trackers, output) {\n    for (let i = 0, ii = dicts.length; i < ii; ++i) {\n      const fontDict = dicts[i];\n      const privateDict = fontDict.privateDict;\n      if (!privateDict || !fontDict.hasName(\"Private\")) {\n        throw new FormatError(\"There must be a private dictionary.\");\n      }\n      const privateDictTracker = new CFFOffsetTracker();\n      const privateDictData = this.compileDict(privateDict, privateDictTracker);\n\n      let outputLength = output.length;\n      privateDictTracker.offset(outputLength);\n      if (!privateDictData.length) {\n        // The private dictionary was empty, set the output length to zero to\n        // ensure the offset length isn't out of bounds in the eyes of the\n        // sanitizer.\n        outputLength = 0;\n      }\n\n      trackers[i].setEntryLocation(\n        \"Private\",\n        [privateDictData.length, outputLength],\n        output\n      );\n      output.setArray(privateDictData);\n\n      if (privateDict.subrsIndex && privateDict.hasName(\"Subrs\")) {\n        const subrs = this.compileIndex(privateDict.subrsIndex);\n        privateDictTracker.setEntryLocation(\n          \"Subrs\",\n          [privateDictData.length],\n          output\n        );\n        output.setArray(subrs);\n      }\n    }\n  }\n\n  compileDict(dict, offsetTracker) {\n    const out = [];\n    // The dictionary keys must be in a certain order.\n    for (const key of dict.order) {\n      if (!(key in dict.values)) {\n        continue;\n      }\n      let values = dict.values[key];\n      let types = dict.types[key];\n      if (!Array.isArray(types)) {\n        types = [types];\n      }\n      if (!Array.isArray(values)) {\n        values = [values];\n      }\n\n      // Remove any empty dict values.\n      if (values.length === 0) {\n        continue;\n      }\n\n      for (let j = 0, jj = types.length; j < jj; ++j) {\n        const type = types[j];\n        const value = values[j];\n        switch (type) {\n          case \"num\":\n          case \"sid\":\n            out.push(...this.encodeNumber(value));\n            break;\n          case \"offset\":\n            // For offsets we just insert a 32bit integer so we don't have to\n            // deal with figuring out the length of the offset when it gets\n            // replaced later on by the compiler.\n            const name = dict.keyToNameMap[key];\n            // Some offsets have the offset and the length, so just record the\n            // position of the first one.\n            if (!offsetTracker.isTracking(name)) {\n              offsetTracker.track(name, out.length);\n            }\n            out.push(0x1d, 0, 0, 0, 0);\n            break;\n          case \"array\":\n          case \"delta\":\n            out.push(...this.encodeNumber(value));\n            for (let k = 1, kk = values.length; k < kk; ++k) {\n              out.push(...this.encodeNumber(values[k]));\n            }\n            break;\n          default:\n            throw new FormatError(`Unknown data type of ${type}`);\n        }\n      }\n      out.push(...dict.opcodes[key]);\n    }\n    return out;\n  }\n\n  compileStringIndex(strings) {\n    const stringIndex = new CFFIndex();\n    for (const string of strings) {\n      stringIndex.add(stringToBytes(string));\n    }\n    return this.compileIndex(stringIndex);\n  }\n\n  compileCharStrings(charStrings) {\n    const charStringsIndex = new CFFIndex();\n    for (let i = 0; i < charStrings.count; i++) {\n      const glyph = charStrings.get(i);\n      // If the CharString outline is empty, replace it with .notdef to\n      // prevent OTS from rejecting the font (fixes bug1252420.pdf).\n      if (glyph.length === 0) {\n        charStringsIndex.add(new Uint8Array([0x8b, 0x0e]));\n        continue;\n      }\n      charStringsIndex.add(glyph);\n    }\n    return this.compileIndex(charStringsIndex);\n  }\n\n  compileCharset(charset, numGlyphs, strings, isCIDFont) {\n    // Freetype requires the number of charset strings be correct and MacOS\n    // requires a valid mapping for printing.\n    let out;\n    const numGlyphsLessNotDef = numGlyphs - 1;\n    if (isCIDFont) {\n      // In a CID font, the charset is a mapping of CIDs not SIDs so just\n      // create an identity mapping.\n      // nLeft: Glyphs left in range (excluding first) (see the CFF specs).\n      // The first CID must be 1 in order to avoid a print issue on mac (see\n      // https://bugzilla.mozilla.org/1961423).\n      const nLeft = numGlyphsLessNotDef - 1;\n      out = new Uint8Array([\n        2, // format\n        0, // first CID upper byte\n        1, // first CID lower byte\n        (nLeft >> 8) & 0xff,\n        nLeft & 0xff,\n      ]);\n    } else {\n      const length = 1 + numGlyphsLessNotDef * 2;\n      out = new Uint8Array(length);\n      // format 0, skip redundant `out[0] = 0;` assignment.\n      let charsetIndex = 0;\n      const numCharsets = charset.charset.length;\n      let warned = false;\n      for (let i = 1; i < out.length; i += 2) {\n        let sid = 0;\n        if (charsetIndex < numCharsets) {\n          const name = charset.charset[charsetIndex++];\n          sid = strings.getSID(name);\n          if (sid === -1) {\n            sid = 0;\n            if (!warned) {\n              warned = true;\n              warn(`Couldn't find ${name} in CFF strings`);\n            }\n          }\n        }\n        out[i] = (sid >> 8) & 0xff;\n        out[i + 1] = sid & 0xff;\n      }\n    }\n    return out;\n  }\n\n  compileEncoding(encoding) {\n    return encoding.raw;\n  }\n\n  compileFDSelect(fdSelect) {\n    const format = fdSelect.format;\n    let out, i;\n    switch (format) {\n      case 0:\n        out = new Uint8Array(1 + fdSelect.fdSelect.length);\n        out[0] = format;\n        out.set(fdSelect.fdSelect, 1);\n        break;\n      case 3:\n        const start = 0;\n        let lastFD = fdSelect.fdSelect[0];\n        const ranges = [\n          format,\n          0, // nRanges place holder\n          0, // nRanges place holder\n          (start >> 8) & 0xff,\n          start & 0xff,\n          lastFD,\n        ];\n        for (i = 1; i < fdSelect.fdSelect.length; i++) {\n          const currentFD = fdSelect.fdSelect[i];\n          if (currentFD !== lastFD) {\n            ranges.push((i >> 8) & 0xff, i & 0xff, currentFD);\n            lastFD = currentFD;\n          }\n        }\n        // 3 bytes are pushed for every range and there are 3 header bytes.\n        const numRanges = (ranges.length - 3) / 3;\n        ranges[1] = (numRanges >> 8) & 0xff;\n        ranges[2] = numRanges & 0xff;\n        // sentinel\n        ranges.push((i >> 8) & 0xff, i & 0xff);\n        out = new Uint8Array(ranges);\n        break;\n    }\n    return out;\n  }\n\n  compileIndex(index, trackers = []) {\n    const objects = index.objects;\n    // First 2 bytes contains the number of objects contained into this index\n    const count = objects.length;\n\n    // If there is no object, just create an index.\n    if (count === 0) {\n      return new Uint8Array(2);\n    }\n\n    let lastOffset = 1,\n      i;\n    for (i = 0; i < count; ++i) {\n      lastOffset += objects[i].length;\n    }\n\n    let offsetSize;\n    if (lastOffset < 0x100) {\n      offsetSize = 1;\n    } else if (lastOffset < 0x10000) {\n      offsetSize = 2;\n    } else if (lastOffset < 0x1000000) {\n      offsetSize = 3;\n    } else {\n      offsetSize = 4;\n    }\n\n    const data = new Uint8Array(2 + offsetSize * (count + 1) + lastOffset);\n    let pos = 0;\n\n    data[pos++] = (count >> 8) & 0xff;\n    data[pos++] = count & 0xff;\n\n    // Next byte contains the offset size use to reference object in the file\n    data[pos++] = offsetSize;\n\n    // Add another offset after this one because we need a new offset\n    let relativeOffset = 1;\n    for (i = 0; i < count + 1; i++) {\n      if (offsetSize === 1) {\n        data[pos++] = relativeOffset & 0xff;\n      } else if (offsetSize === 2) {\n        data[pos++] = (relativeOffset >> 8) & 0xff;\n        data[pos++] = relativeOffset & 0xff;\n      } else if (offsetSize === 3) {\n        data[pos++] = (relativeOffset >> 16) & 0xff;\n        data[pos++] = (relativeOffset >> 8) & 0xff;\n        data[pos++] = relativeOffset & 0xff;\n      } else {\n        data[pos++] = (relativeOffset >>> 24) & 0xff;\n        data[pos++] = (relativeOffset >> 16) & 0xff;\n        data[pos++] = (relativeOffset >> 8) & 0xff;\n        data[pos++] = relativeOffset & 0xff;\n      }\n\n      if (objects[i]) {\n        relativeOffset += objects[i].length;\n      }\n    }\n\n    for (i = 0; i < count; i++) {\n      // Notify the tracker where the object will be offset in the data.\n      trackers[i]?.offset(pos);\n\n      data.set(objects[i], pos);\n      pos += objects[i].length;\n    }\n    return data;\n  }\n}\n\nexport {\n  CFF,\n  CFFCharset,\n  CFFCompiler,\n  CFFFDSelect,\n  CFFHeader,\n  CFFIndex,\n  CFFParser,\n  CFFPrivateDict,\n  CFFStandardStrings,\n  CFFStrings,\n  CFFTopDict,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getLookupTableFactory } from \"./core_utils.js\";\nimport { normalizeFontName } from \"./fonts_utils.js\";\n\n/**\n * Hold a map of decoded fonts and of the standard fourteen Type1\n * fonts and their acronyms.\n */\nconst getStdFontMap = getLookupTableFactory(function (t) {\n  // The standard 14 fonts:\n  t[\"Times-Roman\"] = \"Times-Roman\";\n  t.Helvetica = \"Helvetica\";\n  t.Courier = \"Courier\";\n  t.Symbol = \"Symbol\";\n  t[\"Times-Bold\"] = \"Times-Bold\";\n  t[\"Helvetica-Bold\"] = \"Helvetica-Bold\";\n  t[\"Courier-Bold\"] = \"Courier-Bold\";\n  t.ZapfDingbats = \"ZapfDingbats\";\n  t[\"Times-Italic\"] = \"Times-Italic\";\n  t[\"Helvetica-Oblique\"] = \"Helvetica-Oblique\";\n  t[\"Courier-Oblique\"] = \"Courier-Oblique\";\n  t[\"Times-BoldItalic\"] = \"Times-BoldItalic\";\n  t[\"Helvetica-BoldOblique\"] = \"Helvetica-BoldOblique\";\n  t[\"Courier-BoldOblique\"] = \"Courier-BoldOblique\";\n\n  // Extra mappings\n  t.ArialNarrow = \"Helvetica\";\n  t[\"ArialNarrow-Bold\"] = \"Helvetica-Bold\";\n  t[\"ArialNarrow-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"ArialNarrow-Italic\"] = \"Helvetica-Oblique\";\n  t.ArialBlack = \"Helvetica\";\n  t[\"ArialBlack-Bold\"] = \"Helvetica-Bold\";\n  t[\"ArialBlack-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"ArialBlack-Italic\"] = \"Helvetica-Oblique\";\n  t[\"Arial-Black\"] = \"Helvetica\";\n  t[\"Arial-Black-Bold\"] = \"Helvetica-Bold\";\n  t[\"Arial-Black-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Arial-Black-Italic\"] = \"Helvetica-Oblique\";\n  t.Arial = \"Helvetica\";\n  t[\"Arial-Bold\"] = \"Helvetica-Bold\";\n  t[\"Arial-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Arial-Italic\"] = \"Helvetica-Oblique\";\n  t.ArialMT = \"Helvetica\";\n  t[\"Arial-BoldItalicMT\"] = \"Helvetica-BoldOblique\";\n  t[\"Arial-BoldMT\"] = \"Helvetica-Bold\";\n  t[\"Arial-ItalicMT\"] = \"Helvetica-Oblique\";\n  t[\"Arial-BoldItalicMT-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Arial-BoldMT-Bold\"] = \"Helvetica-Bold\";\n  t[\"Arial-ItalicMT-Italic\"] = \"Helvetica-Oblique\";\n  t.ArialUnicodeMS = \"Helvetica\";\n  t[\"ArialUnicodeMS-Bold\"] = \"Helvetica-Bold\";\n  t[\"ArialUnicodeMS-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"ArialUnicodeMS-Italic\"] = \"Helvetica-Oblique\";\n  t[\"Courier-BoldItalic\"] = \"Courier-BoldOblique\";\n  t[\"Courier-Italic\"] = \"Courier-Oblique\";\n  t.CourierNew = \"Courier\";\n  t[\"CourierNew-Bold\"] = \"Courier-Bold\";\n  t[\"CourierNew-BoldItalic\"] = \"Courier-BoldOblique\";\n  t[\"CourierNew-Italic\"] = \"Courier-Oblique\";\n  t[\"CourierNewPS-BoldItalicMT\"] = \"Courier-BoldOblique\";\n  t[\"CourierNewPS-BoldMT\"] = \"Courier-Bold\";\n  t[\"CourierNewPS-ItalicMT\"] = \"Courier-Oblique\";\n  t.CourierNewPSMT = \"Courier\";\n  t[\"Helvetica-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Helvetica-Italic\"] = \"Helvetica-Oblique\";\n  t[\"HelveticaLTStd-Bold\"] = \"Helvetica-Bold\";\n  t[\"Symbol-Bold\"] = \"Symbol\";\n  t[\"Symbol-BoldItalic\"] = \"Symbol\";\n  t[\"Symbol-Italic\"] = \"Symbol\";\n  t.TimesNewRoman = \"Times-Roman\";\n  t[\"TimesNewRoman-Bold\"] = \"Times-Bold\";\n  t[\"TimesNewRoman-BoldItalic\"] = \"Times-BoldItalic\";\n  t[\"TimesNewRoman-Italic\"] = \"Times-Italic\";\n  t.TimesNewRomanPS = \"Times-Roman\";\n  t[\"TimesNewRomanPS-Bold\"] = \"Times-Bold\";\n  t[\"TimesNewRomanPS-BoldItalic\"] = \"Times-BoldItalic\";\n  t[\"TimesNewRomanPS-BoldItalicMT\"] = \"Times-BoldItalic\";\n  t[\"TimesNewRomanPS-BoldMT\"] = \"Times-Bold\";\n  t[\"TimesNewRomanPS-Italic\"] = \"Times-Italic\";\n  t[\"TimesNewRomanPS-ItalicMT\"] = \"Times-Italic\";\n  t.TimesNewRomanPSMT = \"Times-Roman\";\n  t[\"TimesNewRomanPSMT-Bold\"] = \"Times-Bold\";\n  t[\"TimesNewRomanPSMT-BoldItalic\"] = \"Times-BoldItalic\";\n  t[\"TimesNewRomanPSMT-Italic\"] = \"Times-Italic\";\n});\n\n// Contains mapping for standard fonts and xfa fonts.\nconst getFontNameToFileMap = getLookupTableFactory(function (t) {\n  t.Courier = \"FoxitFixed.pfb\";\n  t[\"Courier-Bold\"] = \"FoxitFixedBold.pfb\";\n  t[\"Courier-BoldOblique\"] = \"FoxitFixedBoldItalic.pfb\";\n  t[\"Courier-Oblique\"] = \"FoxitFixedItalic.pfb\";\n  t.Helvetica = \"LiberationSans-Regular.ttf\";\n  t[\"Helvetica-Bold\"] = \"LiberationSans-Bold.ttf\";\n  t[\"Helvetica-BoldOblique\"] = \"LiberationSans-BoldItalic.ttf\";\n  t[\"Helvetica-Oblique\"] = \"LiberationSans-Italic.ttf\";\n  t[\"Times-Roman\"] = \"FoxitSerif.pfb\";\n  t[\"Times-Bold\"] = \"FoxitSerifBold.pfb\";\n  t[\"Times-BoldItalic\"] = \"FoxitSerifBoldItalic.pfb\";\n  t[\"Times-Italic\"] = \"FoxitSerifItalic.pfb\";\n  t.Symbol = \"FoxitSymbol.pfb\";\n  t.ZapfDingbats = \"FoxitDingbats.pfb\";\n  t[\"LiberationSans-Regular\"] = \"LiberationSans-Regular.ttf\";\n  t[\"LiberationSans-Bold\"] = \"LiberationSans-Bold.ttf\";\n  t[\"LiberationSans-Italic\"] = \"LiberationSans-Italic.ttf\";\n  t[\"LiberationSans-BoldItalic\"] = \"LiberationSans-BoldItalic.ttf\";\n});\n\n/**\n * Holds the map of the non-standard fonts that might be included as\n * a standard fonts without glyph data.\n */\nconst getNonStdFontMap = getLookupTableFactory(function (t) {\n  t.Calibri = \"Helvetica\";\n  t[\"Calibri-Bold\"] = \"Helvetica-Bold\";\n  t[\"Calibri-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"Calibri-Italic\"] = \"Helvetica-Oblique\";\n  t.CenturyGothic = \"Helvetica\";\n  t[\"CenturyGothic-Bold\"] = \"Helvetica-Bold\";\n  t[\"CenturyGothic-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"CenturyGothic-Italic\"] = \"Helvetica-Oblique\";\n  t.ComicSansMS = \"Comic Sans MS\";\n  t[\"ComicSansMS-Bold\"] = \"Comic Sans MS-Bold\";\n  t[\"ComicSansMS-BoldItalic\"] = \"Comic Sans MS-BoldItalic\";\n  t[\"ComicSansMS-Italic\"] = \"Comic Sans MS-Italic\";\n  t.GillSansMT = \"Helvetica\";\n  t[\"GillSansMT-Bold\"] = \"Helvetica-Bold\";\n  t[\"GillSansMT-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"GillSansMT-Italic\"] = \"Helvetica-Oblique\";\n  t.Impact = \"Helvetica\";\n  t[\"ItcSymbol-Bold\"] = \"Helvetica-Bold\";\n  t[\"ItcSymbol-BoldItalic\"] = \"Helvetica-BoldOblique\";\n  t[\"ItcSymbol-Book\"] = \"Helvetica\";\n  t[\"ItcSymbol-BookItalic\"] = \"Helvetica-Oblique\";\n  t[\"ItcSymbol-Medium\"] = \"Helvetica\";\n  t[\"ItcSymbol-MediumItalic\"] = \"Helvetica-Oblique\";\n  t.LucidaConsole = \"Courier\";\n  t[\"LucidaConsole-Bold\"] = \"Courier-Bold\";\n  t[\"LucidaConsole-BoldItalic\"] = \"Courier-BoldOblique\";\n  t[\"LucidaConsole-Italic\"] = \"Courier-Oblique\";\n  t[\"LucidaSans-Demi\"] = \"Helvetica-Bold\";\n  t[\"MS-Gothic\"] = \"MS Gothic\";\n  t[\"MS-Gothic-Bold\"] = \"MS Gothic-Bold\";\n  t[\"MS-Gothic-BoldItalic\"] = \"MS Gothic-BoldItalic\";\n  t[\"MS-Gothic-Italic\"] = \"MS Gothic-Italic\";\n  t[\"MS-Mincho\"] = \"MS Mincho\";\n  t[\"MS-Mincho-Bold\"] = \"MS Mincho-Bold\";\n  t[\"MS-Mincho-BoldItalic\"] = \"MS Mincho-BoldItalic\";\n  t[\"MS-Mincho-Italic\"] = \"MS Mincho-Italic\";\n  t[\"MS-PGothic\"] = \"MS PGothic\";\n  t[\"MS-PGothic-Bold\"] = \"MS PGothic-Bold\";\n  t[\"MS-PGothic-BoldItalic\"] = \"MS PGothic-BoldItalic\";\n  t[\"MS-PGothic-Italic\"] = \"MS PGothic-Italic\";\n  t[\"MS-PMincho\"] = \"MS PMincho\";\n  t[\"MS-PMincho-Bold\"] = \"MS PMincho-Bold\";\n  t[\"MS-PMincho-BoldItalic\"] = \"MS PMincho-BoldItalic\";\n  t[\"MS-PMincho-Italic\"] = \"MS PMincho-Italic\";\n  t.NuptialScript = \"Times-Italic\";\n  t.SegoeUISymbol = \"Helvetica\";\n});\n\nconst getSerifFonts = getLookupTableFactory(function (t) {\n  t[\"Adobe Jenson\"] = true;\n  t[\"Adobe Text\"] = true;\n  t.Albertus = true;\n  t.Aldus = true;\n  t.Alexandria = true;\n  t.Algerian = true;\n  t[\"American Typewriter\"] = true;\n  t.Antiqua = true;\n  t.Apex = true;\n  t.Arno = true;\n  t.Aster = true;\n  t.Aurora = true;\n  t.Baskerville = true;\n  t.Bell = true;\n  t.Bembo = true;\n  t[\"Bembo Schoolbook\"] = true;\n  t.Benguiat = true;\n  t[\"Berkeley Old Style\"] = true;\n  t[\"Bernhard Modern\"] = true;\n  t[\"Berthold City\"] = true;\n  t.Bodoni = true;\n  t[\"Bauer Bodoni\"] = true;\n  t[\"Book Antiqua\"] = true;\n  t.Bookman = true;\n  t[\"Bordeaux Roman\"] = true;\n  t[\"Californian FB\"] = true;\n  t.Calisto = true;\n  t.Calvert = true;\n  t.Capitals = true;\n  t.Cambria = true;\n  t.Cartier = true;\n  t.Caslon = true;\n  t.Catull = true;\n  t.Centaur = true;\n  t[\"Century Old Style\"] = true;\n  t[\"Century Schoolbook\"] = true;\n  t.Chaparral = true;\n  t[\"Charis SIL\"] = true;\n  t.Cheltenham = true;\n  t[\"Cholla Slab\"] = true;\n  t.Clarendon = true;\n  t.Clearface = true;\n  t.Cochin = true;\n  t.Colonna = true;\n  t[\"Computer Modern\"] = true;\n  t[\"Concrete Roman\"] = true;\n  t.Constantia = true;\n  t[\"Cooper Black\"] = true;\n  t.Corona = true;\n  t.Ecotype = true;\n  t.Egyptienne = true;\n  t.Elephant = true;\n  t.Excelsior = true;\n  t.Fairfield = true;\n  t[\"FF Scala\"] = true;\n  t.Folkard = true;\n  t.Footlight = true;\n  t.FreeSerif = true;\n  t[\"Friz Quadrata\"] = true;\n  t.Garamond = true;\n  t.Gentium = true;\n  t.Georgia = true;\n  t.Gloucester = true;\n  t[\"Goudy Old Style\"] = true;\n  t[\"Goudy Schoolbook\"] = true;\n  t[\"Goudy Pro Font\"] = true;\n  t.Granjon = true;\n  t[\"Guardian Egyptian\"] = true;\n  t.Heather = true;\n  t.Hercules = true;\n  t[\"High Tower Text\"] = true;\n  t.Hiroshige = true;\n  t[\"Hoefler Text\"] = true;\n  t[\"Humana Serif\"] = true;\n  t.Imprint = true;\n  t[\"Ionic No. 5\"] = true;\n  t.Janson = true;\n  t.Joanna = true;\n  t.Korinna = true;\n  t.Lexicon = true;\n  t.LiberationSerif = true;\n  t[\"Liberation Serif\"] = true;\n  t[\"Linux Libertine\"] = true;\n  t.Literaturnaya = true;\n  t.Lucida = true;\n  t[\"Lucida Bright\"] = true;\n  t.Melior = true;\n  t.Memphis = true;\n  t.Miller = true;\n  t.Minion = true;\n  t.Modern = true;\n  t[\"Mona Lisa\"] = true;\n  t[\"Mrs Eaves\"] = true;\n  t[\"MS Serif\"] = true;\n  t[\"Museo Slab\"] = true;\n  t[\"New York\"] = true;\n  t[\"Nimbus Roman\"] = true;\n  t[\"NPS Rawlinson Roadway\"] = true;\n  t.NuptialScript = true;\n  t.Palatino = true;\n  t.Perpetua = true;\n  t.Plantin = true;\n  t[\"Plantin Schoolbook\"] = true;\n  t.Playbill = true;\n  t[\"Poor Richard\"] = true;\n  t[\"Rawlinson Roadway\"] = true;\n  t.Renault = true;\n  t.Requiem = true;\n  t.Rockwell = true;\n  t.Roman = true;\n  t[\"Rotis Serif\"] = true;\n  t.Sabon = true;\n  t.Scala = true;\n  t.Seagull = true;\n  t.Sistina = true;\n  t.Souvenir = true;\n  t.STIX = true;\n  t[\"Stone Informal\"] = true;\n  t[\"Stone Serif\"] = true;\n  t.Sylfaen = true;\n  t.Times = true;\n  t.Trajan = true;\n  t[\"Trinit茅\"] = true;\n  t[\"Trump Mediaeval\"] = true;\n  t.Utopia = true;\n  t[\"Vale Type\"] = true;\n  t[\"Bitstream Vera\"] = true;\n  t[\"Vera Serif\"] = true;\n  t.Versailles = true;\n  t.Wanted = true;\n  t.Weiss = true;\n  t[\"Wide Latin\"] = true;\n  t.Windsor = true;\n  t.XITS = true;\n});\n\nconst getSymbolsFonts = getLookupTableFactory(function (t) {\n  t.Dingbats = true;\n  t.Symbol = true;\n  t.ZapfDingbats = true;\n  t.Wingdings = true;\n  t[\"Wingdings-Bold\"] = true;\n  t[\"Wingdings-Regular\"] = true;\n});\n\n// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID\n// fonts, but does not embed the CID to GID mapping. The mapping is incomplete\n// for all glyphs, but common for some set of the standard fonts.\nconst getGlyphMapForStandardFonts = getLookupTableFactory(function (t) {\n  t[2] = 10;\n  t[3] = 32;\n  t[4] = 33;\n  t[5] = 34;\n  t[6] = 35;\n  t[7] = 36;\n  t[8] = 37;\n  t[9] = 38;\n  t[10] = 39;\n  t[11] = 40;\n  t[12] = 41;\n  t[13] = 42;\n  t[14] = 43;\n  t[15] = 44;\n  t[16] = 45;\n  t[17] = 46;\n  t[18] = 47;\n  t[19] = 48;\n  t[20] = 49;\n  t[21] = 50;\n  t[22] = 51;\n  t[23] = 52;\n  t[24] = 53;\n  t[25] = 54;\n  t[26] = 55;\n  t[27] = 56;\n  t[28] = 57;\n  t[29] = 58;\n  t[30] = 894;\n  t[31] = 60;\n  t[32] = 61;\n  t[33] = 62;\n  t[34] = 63;\n  t[35] = 64;\n  t[36] = 65;\n  t[37] = 66;\n  t[38] = 67;\n  t[39] = 68;\n  t[40] = 69;\n  t[41] = 70;\n  t[42] = 71;\n  t[43] = 72;\n  t[44] = 73;\n  t[45] = 74;\n  t[46] = 75;\n  t[47] = 76;\n  t[48] = 77;\n  t[49] = 78;\n  t[50] = 79;\n  t[51] = 80;\n  t[52] = 81;\n  t[53] = 82;\n  t[54] = 83;\n  t[55] = 84;\n  t[56] = 85;\n  t[57] = 86;\n  t[58] = 87;\n  t[59] = 88;\n  t[60] = 89;\n  t[61] = 90;\n  t[62] = 91;\n  t[63] = 92;\n  t[64] = 93;\n  t[65] = 94;\n  t[66] = 95;\n  t[67] = 96;\n  t[68] = 97;\n  t[69] = 98;\n  t[70] = 99;\n  t[71] = 100;\n  t[72] = 101;\n  t[73] = 102;\n  t[74] = 103;\n  t[75] = 104;\n  t[76] = 105;\n  t[77] = 106;\n  t[78] = 107;\n  t[79] = 108;\n  t[80] = 109;\n  t[81] = 110;\n  t[82] = 111;\n  t[83] = 112;\n  t[84] = 113;\n  t[85] = 114;\n  t[86] = 115;\n  t[87] = 116;\n  t[88] = 117;\n  t[89] = 118;\n  t[90] = 119;\n  t[91] = 120;\n  t[92] = 121;\n  t[93] = 122;\n  t[94] = 123;\n  t[95] = 124;\n  t[96] = 125;\n  t[97] = 126;\n  t[98] = 196;\n  t[99] = 197;\n  t[100] = 199;\n  t[101] = 201;\n  t[102] = 209;\n  t[103] = 214;\n  t[104] = 220;\n  t[105] = 225;\n  t[106] = 224;\n  t[107] = 226;\n  t[108] = 228;\n  t[109] = 227;\n  t[110] = 229;\n  t[111] = 231;\n  t[112] = 233;\n  t[113] = 232;\n  t[114] = 234;\n  t[115] = 235;\n  t[116] = 237;\n  t[117] = 236;\n  t[118] = 238;\n  t[119] = 239;\n  t[120] = 241;\n  t[121] = 243;\n  t[122] = 242;\n  t[123] = 244;\n  t[124] = 246;\n  t[125] = 245;\n  t[126] = 250;\n  t[127] = 249;\n  t[128] = 251;\n  t[129] = 252;\n  t[130] = 8224;\n  t[131] = 176;\n  t[132] = 162;\n  t[133] = 163;\n  t[134] = 167;\n  t[135] = 8226;\n  t[136] = 182;\n  t[137] = 223;\n  t[138] = 174;\n  t[139] = 169;\n  t[140] = 8482;\n  t[141] = 180;\n  t[142] = 168;\n  t[143] = 8800;\n  t[144] = 198;\n  t[145] = 216;\n  t[146] = 8734;\n  t[147] = 177;\n  t[148] = 8804;\n  t[149] = 8805;\n  t[150] = 165;\n  t[151] = 181;\n  t[152] = 8706;\n  t[153] = 8721;\n  t[154] = 8719;\n  t[156] = 8747;\n  t[157] = 170;\n  t[158] = 186;\n  t[159] = 8486;\n  t[160] = 230;\n  t[161] = 248;\n  t[162] = 191;\n  t[163] = 161;\n  t[164] = 172;\n  t[165] = 8730;\n  t[166] = 402;\n  t[167] = 8776;\n  t[168] = 8710;\n  t[169] = 171;\n  t[170] = 187;\n  t[171] = 8230;\n  t[179] = 8220;\n  t[180] = 8221;\n  t[181] = 8216;\n  t[182] = 8217;\n  t[200] = 193;\n  t[203] = 205;\n  t[207] = 211;\n  t[210] = 218;\n  t[223] = 711;\n  t[224] = 321;\n  t[225] = 322;\n  t[226] = 352;\n  t[227] = 353;\n  t[228] = 381;\n  t[229] = 382;\n  t[233] = 221;\n  t[234] = 253;\n  t[252] = 263;\n  t[253] = 268;\n  t[254] = 269;\n  t[258] = 258;\n  t[260] = 260;\n  t[261] = 261;\n  t[265] = 280;\n  t[266] = 281;\n  t[267] = 282;\n  t[268] = 283;\n  t[269] = 313;\n  t[275] = 323;\n  t[276] = 324;\n  t[278] = 328;\n  t[283] = 344;\n  t[284] = 345;\n  t[285] = 346;\n  t[286] = 347;\n  t[292] = 367;\n  t[295] = 377;\n  t[296] = 378;\n  t[298] = 380;\n  t[305] = 963;\n  t[306] = 964;\n  t[307] = 966;\n  t[308] = 8215;\n  t[309] = 8252;\n  t[310] = 8319;\n  t[311] = 8359;\n  t[312] = 8592;\n  t[313] = 8593;\n  t[337] = 9552;\n  t[493] = 1039;\n  t[494] = 1040;\n  t[570] = 1040;\n  t[571] = 1041;\n  t[572] = 1042;\n  t[573] = 1043;\n  t[574] = 1044;\n  t[575] = 1045;\n  t[576] = 1046;\n  t[577] = 1047;\n  t[578] = 1048;\n  t[579] = 1049;\n  t[580] = 1050;\n  t[581] = 1051;\n  t[582] = 1052;\n  t[583] = 1053;\n  t[584] = 1054;\n  t[585] = 1055;\n  t[586] = 1056;\n  t[587] = 1057;\n  t[588] = 1058;\n  t[589] = 1059;\n  t[590] = 1060;\n  t[591] = 1061;\n  t[592] = 1062;\n  t[593] = 1063;\n  t[594] = 1064;\n  t[595] = 1065;\n  t[596] = 1066;\n  t[597] = 1067;\n  t[598] = 1068;\n  t[599] = 1069;\n  t[600] = 1070;\n  t[601] = 1071;\n  t[602] = 1072;\n  t[603] = 1073;\n  t[604] = 1074;\n  t[605] = 1075;\n  t[606] = 1076;\n  t[607] = 1077;\n  t[608] = 1078;\n  t[609] = 1079;\n  t[610] = 1080;\n  t[611] = 1081;\n  t[612] = 1082;\n  t[613] = 1083;\n  t[614] = 1084;\n  t[615] = 1085;\n  t[616] = 1086;\n  t[617] = 1087;\n  t[618] = 1088;\n  t[619] = 1089;\n  t[620] = 1090;\n  t[621] = 1091;\n  t[622] = 1092;\n  t[623] = 1093;\n  t[624] = 1094;\n  t[625] = 1095;\n  t[626] = 1096;\n  t[627] = 1097;\n  t[628] = 1098;\n  t[629] = 1099;\n  t[630] = 1100;\n  t[631] = 1101;\n  t[632] = 1102;\n  t[633] = 1103;\n  t[672] = 1488;\n  t[673] = 1489;\n  t[674] = 1490;\n  t[675] = 1491;\n  t[676] = 1492;\n  t[677] = 1493;\n  t[678] = 1494;\n  t[679] = 1495;\n  t[680] = 1496;\n  t[681] = 1497;\n  t[682] = 1498;\n  t[683] = 1499;\n  t[684] = 1500;\n  t[685] = 1501;\n  t[686] = 1502;\n  t[687] = 1503;\n  t[688] = 1504;\n  t[689] = 1505;\n  t[690] = 1506;\n  t[691] = 1507;\n  t[692] = 1508;\n  t[693] = 1509;\n  t[694] = 1510;\n  t[695] = 1511;\n  t[696] = 1512;\n  t[697] = 1513;\n  t[698] = 1514;\n  t[705] = 1524;\n  t[706] = 8362;\n  t[710] = 64288;\n  t[711] = 64298;\n  t[759] = 1617;\n  t[761] = 1776;\n  t[763] = 1778;\n  t[775] = 1652;\n  t[777] = 1764;\n  t[778] = 1780;\n  t[779] = 1781;\n  t[780] = 1782;\n  t[782] = 771;\n  t[783] = 64726;\n  t[786] = 8363;\n  t[788] = 8532;\n  t[790] = 768;\n  t[791] = 769;\n  t[792] = 768;\n  t[795] = 803;\n  t[797] = 64336;\n  t[798] = 64337;\n  t[799] = 64342;\n  t[800] = 64343;\n  t[801] = 64344;\n  t[802] = 64345;\n  t[803] = 64362;\n  t[804] = 64363;\n  t[805] = 64364;\n  t[2424] = 7821;\n  t[2425] = 7822;\n  t[2426] = 7823;\n  t[2427] = 7824;\n  t[2428] = 7825;\n  t[2429] = 7826;\n  t[2430] = 7827;\n  t[2433] = 7682;\n  t[2678] = 8045;\n  t[2679] = 8046;\n  t[2830] = 1552;\n  t[2838] = 686;\n  t[2840] = 751;\n  t[2842] = 753;\n  t[2843] = 754;\n  t[2844] = 755;\n  t[2846] = 757;\n  t[2856] = 767;\n  t[2857] = 848;\n  t[2858] = 849;\n  t[2862] = 853;\n  t[2863] = 854;\n  t[2864] = 855;\n  t[2865] = 861;\n  t[2866] = 862;\n  t[2906] = 7460;\n  t[2908] = 7462;\n  t[2909] = 7463;\n  t[2910] = 7464;\n  t[2912] = 7466;\n  t[2913] = 7467;\n  t[2914] = 7468;\n  t[2916] = 7470;\n  t[2917] = 7471;\n  t[2918] = 7472;\n  t[2920] = 7474;\n  t[2921] = 7475;\n  t[2922] = 7476;\n  t[2924] = 7478;\n  t[2925] = 7479;\n  t[2926] = 7480;\n  t[2928] = 7482;\n  t[2929] = 7483;\n  t[2930] = 7484;\n  t[2932] = 7486;\n  t[2933] = 7487;\n  t[2934] = 7488;\n  t[2936] = 7490;\n  t[2937] = 7491;\n  t[2938] = 7492;\n  t[2940] = 7494;\n  t[2941] = 7495;\n  t[2942] = 7496;\n  t[2944] = 7498;\n  t[2946] = 7500;\n  t[2948] = 7502;\n  t[2950] = 7504;\n  t[2951] = 7505;\n  t[2952] = 7506;\n  t[2954] = 7508;\n  t[2955] = 7509;\n  t[2956] = 7510;\n  t[2958] = 7512;\n  t[2959] = 7513;\n  t[2960] = 7514;\n  t[2962] = 7516;\n  t[2963] = 7517;\n  t[2964] = 7518;\n  t[2966] = 7520;\n  t[2967] = 7521;\n  t[2968] = 7522;\n  t[2970] = 7524;\n  t[2971] = 7525;\n  t[2972] = 7526;\n  t[2974] = 7528;\n  t[2975] = 7529;\n  t[2976] = 7530;\n  t[2978] = 1537;\n  t[2979] = 1538;\n  t[2980] = 1539;\n  t[2982] = 1549;\n  t[2983] = 1551;\n  t[2984] = 1552;\n  t[2986] = 1554;\n  t[2987] = 1555;\n  t[2988] = 1556;\n  t[2990] = 1623;\n  t[2991] = 1624;\n  t[2995] = 1775;\n  t[2999] = 1791;\n  t[3002] = 64290;\n  t[3003] = 64291;\n  t[3004] = 64292;\n  t[3006] = 64294;\n  t[3007] = 64295;\n  t[3008] = 64296;\n  t[3011] = 1900;\n  t[3014] = 8223;\n  t[3015] = 8244;\n  t[3017] = 7532;\n  t[3018] = 7533;\n  t[3019] = 7534;\n  t[3075] = 7590;\n  t[3076] = 7591;\n  t[3079] = 7594;\n  t[3080] = 7595;\n  t[3083] = 7598;\n  t[3084] = 7599;\n  t[3087] = 7602;\n  t[3088] = 7603;\n  t[3091] = 7606;\n  t[3092] = 7607;\n  t[3095] = 7610;\n  t[3096] = 7611;\n  t[3099] = 7614;\n  t[3100] = 7615;\n  t[3103] = 7618;\n  t[3104] = 7619;\n  t[3107] = 8337;\n  t[3108] = 8338;\n  t[3116] = 1884;\n  t[3119] = 1885;\n  t[3120] = 1885;\n  t[3123] = 1886;\n  t[3124] = 1886;\n  t[3127] = 1887;\n  t[3128] = 1887;\n  t[3131] = 1888;\n  t[3132] = 1888;\n  t[3135] = 1889;\n  t[3136] = 1889;\n  t[3139] = 1890;\n  t[3140] = 1890;\n  t[3143] = 1891;\n  t[3144] = 1891;\n  t[3147] = 1892;\n  t[3148] = 1892;\n  t[3153] = 580;\n  t[3154] = 581;\n  t[3157] = 584;\n  t[3158] = 585;\n  t[3161] = 588;\n  t[3162] = 589;\n  t[3165] = 891;\n  t[3166] = 892;\n  t[3169] = 1274;\n  t[3170] = 1275;\n  t[3173] = 1278;\n  t[3174] = 1279;\n  t[3181] = 7622;\n  t[3182] = 7623;\n  t[3282] = 11799;\n  t[3316] = 578;\n  t[3379] = 42785;\n  t[3393] = 1159;\n  t[3416] = 8377;\n});\n\n// The glyph map for ArialBlack differs slightly from the glyph map used for\n// other well-known standard fonts. Hence we use this (incomplete) CID to GID\n// mapping to adjust the glyph map for non-embedded ArialBlack fonts.\nconst getSupplementalGlyphMapForArialBlack = getLookupTableFactory(\n  function (t) {\n    t[227] = 322;\n    t[264] = 261;\n    t[291] = 346;\n  }\n);\n\n// The glyph map for Calibri (a Windows font) differs from the glyph map used\n// in the standard fonts. Hence we use this (incomplete) CID to GID mapping to\n// adjust the glyph map for non-embedded Calibri fonts.\nconst getSupplementalGlyphMapForCalibri = getLookupTableFactory(function (t) {\n  t[1] = 32;\n  t[4] = 65;\n  t[5] = 192;\n  t[6] = 193;\n  t[9] = 196;\n  t[17] = 66;\n  t[18] = 67;\n  t[21] = 268;\n  t[24] = 68;\n  t[28] = 69;\n  t[29] = 200;\n  t[30] = 201;\n  t[32] = 282;\n  t[38] = 70;\n  t[39] = 71;\n  t[44] = 72;\n  t[47] = 73;\n  t[48] = 204;\n  t[49] = 205;\n  t[58] = 74;\n  t[60] = 75;\n  t[62] = 76;\n  t[68] = 77;\n  t[69] = 78;\n  t[75] = 79;\n  t[76] = 210;\n  t[80] = 214;\n  t[87] = 80;\n  t[89] = 81;\n  t[90] = 82;\n  t[92] = 344;\n  t[94] = 83;\n  t[97] = 352;\n  t[100] = 84;\n  t[104] = 85;\n  t[109] = 220;\n  t[115] = 86;\n  t[116] = 87;\n  t[121] = 88;\n  t[122] = 89;\n  t[124] = 221;\n  t[127] = 90;\n  t[129] = 381;\n  t[258] = 97;\n  t[259] = 224;\n  t[260] = 225;\n  t[263] = 228;\n  t[268] = 261;\n  t[271] = 98;\n  t[272] = 99;\n  t[273] = 263;\n  t[275] = 269;\n  t[282] = 100;\n  t[286] = 101;\n  t[287] = 232;\n  t[288] = 233;\n  t[290] = 283;\n  t[295] = 281;\n  t[296] = 102;\n  t[336] = 103;\n  t[346] = 104;\n  t[349] = 105;\n  t[350] = 236;\n  t[351] = 237;\n  t[361] = 106;\n  t[364] = 107;\n  t[367] = 108;\n  t[371] = 322;\n  t[373] = 109;\n  t[374] = 110;\n  t[381] = 111;\n  t[382] = 242;\n  t[383] = 243;\n  t[386] = 246;\n  t[393] = 112;\n  t[395] = 113;\n  t[396] = 114;\n  t[398] = 345;\n  t[400] = 115;\n  t[401] = 347;\n  t[403] = 353;\n  t[410] = 116;\n  t[437] = 117;\n  t[442] = 252;\n  t[448] = 118;\n  t[449] = 119;\n  t[454] = 120;\n  t[455] = 121;\n  t[457] = 253;\n  t[460] = 122;\n  t[462] = 382;\n  t[463] = 380;\n  t[853] = 44;\n  t[855] = 58;\n  t[856] = 46;\n  t[876] = 47;\n  t[878] = 45;\n  t[882] = 45;\n  t[894] = 40;\n  t[895] = 41;\n  t[896] = 91;\n  t[897] = 93;\n  t[923] = 64;\n  t[940] = 163;\n  t[1004] = 48;\n  t[1005] = 49;\n  t[1006] = 50;\n  t[1007] = 51;\n  t[1008] = 52;\n  t[1009] = 53;\n  t[1010] = 54;\n  t[1011] = 55;\n  t[1012] = 56;\n  t[1013] = 57;\n  t[1081] = 37;\n  t[1085] = 43;\n  t[1086] = 45;\n});\n\nfunction getStandardFontName(name) {\n  const fontName = normalizeFontName(name);\n  const stdFontMap = getStdFontMap();\n  return stdFontMap[fontName];\n}\n\nfunction isKnownFontName(name) {\n  const fontName = normalizeFontName(name);\n  return !!(\n    getStdFontMap()[fontName] ||\n    getNonStdFontMap()[fontName] ||\n    getSerifFonts()[fontName] ||\n    getSymbolsFonts()[fontName]\n  );\n}\n\nexport {\n  getFontNameToFileMap,\n  getGlyphMapForStandardFonts,\n  getNonStdFontMap,\n  getSerifFonts,\n  getStandardFontName,\n  getStdFontMap,\n  getSupplementalGlyphMapForArialBlack,\n  getSupplementalGlyphMapForCalibri,\n  getSymbolsFonts,\n  isKnownFontName,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst ON_CURVE_POINT = 1 << 0;\nconst X_SHORT_VECTOR = 1 << 1;\nconst Y_SHORT_VECTOR = 1 << 2;\nconst REPEAT_FLAG = 1 << 3;\nconst X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4;\nconst Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5;\nconst OVERLAP_SIMPLE = 1 << 6;\n\nconst ARG_1_AND_2_ARE_WORDS = 1 << 0;\nconst ARGS_ARE_XY_VALUES = 1 << 1;\n// const ROUND_XY_TO_GRID = 1 << 2;\nconst WE_HAVE_A_SCALE = 1 << 3;\nconst MORE_COMPONENTS = 1 << 5;\nconst WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;\nconst WE_HAVE_A_TWO_BY_TWO = 1 << 7;\nconst WE_HAVE_INSTRUCTIONS = 1 << 8;\n// const USE_MY_METRICS = 1 << 9;\n// const OVERLAP_COMPOUND = 1 << 10;\n// const SCALED_COMPONENT_OFFSET = 1 << 11;\n// const UNSCALED_COMPONENT_OFFSET = 1 << 12;\n\nconst GLYPH_HEADER_SIZE = 10;\n\n/**\n * GlyfTable object represents a glyf table containing glyph information:\n *  - glyph header (xMin, yMin, xMax, yMax);\n *  - contours if any;\n *  - components if the glyph is a composite.\n *\n * It's possible to re-scale each glyph in order to have a new font which\n * exactly fits an other one: the goal is to be able to build some substitution\n * font for well-known fonts (Myriad, Arial, ...).\n *\n * A full description of glyf table can be found here\n * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html\n */\nclass GlyfTable {\n  constructor({ glyfTable, isGlyphLocationsLong, locaTable, numGlyphs }) {\n    this.glyphs = [];\n    const loca = new DataView(\n      locaTable.buffer,\n      locaTable.byteOffset,\n      locaTable.byteLength\n    );\n    const glyf = new DataView(\n      glyfTable.buffer,\n      glyfTable.byteOffset,\n      glyfTable.byteLength\n    );\n    const offsetSize = isGlyphLocationsLong ? 4 : 2;\n    let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0);\n    let pos = 0;\n    for (let i = 0; i < numGlyphs; i++) {\n      pos += offsetSize;\n      const next = isGlyphLocationsLong\n        ? loca.getUint32(pos)\n        : 2 * loca.getUint16(pos);\n      if (next === prev) {\n        this.glyphs.push(new Glyph({}));\n        continue;\n      }\n\n      const glyph = Glyph.parse(prev, glyf);\n      this.glyphs.push(glyph);\n\n      prev = next;\n    }\n  }\n\n  getSize() {\n    return Math.sumPrecise(\n      // Round to next multiple of 4 if needed.\n      this.glyphs.map(g => (g.getSize() + 3) & ~3)\n    );\n  }\n\n  write() {\n    const totalSize = this.getSize();\n    const glyfTable = new DataView(new ArrayBuffer(totalSize));\n    const isLocationLong = totalSize > /* 0xffff * 2 */ 0x1fffe;\n    const offsetSize = isLocationLong ? 4 : 2;\n    const locaTable = new DataView(\n      new ArrayBuffer((this.glyphs.length + 1) * offsetSize)\n    );\n\n    if (isLocationLong) {\n      locaTable.setUint32(0, 0);\n    } else {\n      locaTable.setUint16(0, 0);\n    }\n\n    let pos = 0;\n    let locaIndex = 0;\n    for (const glyph of this.glyphs) {\n      pos += glyph.write(pos, glyfTable);\n      // Round to next multiple of 4 if needed.\n      pos = (pos + 3) & ~3;\n\n      locaIndex += offsetSize;\n      if (isLocationLong) {\n        locaTable.setUint32(locaIndex, pos);\n      } else {\n        locaTable.setUint16(locaIndex, pos >> 1);\n      }\n    }\n\n    return {\n      isLocationLong,\n      loca: new Uint8Array(locaTable.buffer),\n      glyf: new Uint8Array(glyfTable.buffer),\n    };\n  }\n\n  scale(factors) {\n    for (let i = 0, ii = this.glyphs.length; i < ii; i++) {\n      this.glyphs[i].scale(factors[i]);\n    }\n  }\n}\n\nclass Glyph {\n  constructor({ header = null, simple = null, composites = null }) {\n    this.header = header;\n    this.simple = simple;\n    this.composites = composites;\n  }\n\n  static parse(pos, glyf) {\n    const [read, header] = GlyphHeader.parse(pos, glyf);\n    pos += read;\n\n    if (header.numberOfContours < 0) {\n      // Composite glyph.\n      const composites = [];\n      while (true) {\n        const [n, composite] = CompositeGlyph.parse(pos, glyf);\n        pos += n;\n        composites.push(composite);\n        if (!(composite.flags & MORE_COMPONENTS)) {\n          break;\n        }\n      }\n\n      return new Glyph({ header, composites });\n    }\n\n    const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours);\n\n    return new Glyph({ header, simple });\n  }\n\n  getSize() {\n    if (!this.header) {\n      return 0;\n    }\n    const size = this.simple\n      ? this.simple.getSize()\n      : Math.sumPrecise(this.composites.map(c => c.getSize()));\n    return this.header.getSize() + size;\n  }\n\n  write(pos, buf) {\n    if (!this.header) {\n      return 0;\n    }\n\n    const spos = pos;\n    pos += this.header.write(pos, buf);\n    if (this.simple) {\n      pos += this.simple.write(pos, buf);\n    } else {\n      for (const composite of this.composites) {\n        pos += composite.write(pos, buf);\n      }\n    }\n\n    return pos - spos;\n  }\n\n  scale(factor) {\n    if (!this.header) {\n      return;\n    }\n\n    const xMiddle = (this.header.xMin + this.header.xMax) / 2;\n    this.header.scale(xMiddle, factor);\n    if (this.simple) {\n      this.simple.scale(xMiddle, factor);\n    } else {\n      for (const composite of this.composites) {\n        composite.scale(xMiddle, factor);\n      }\n    }\n  }\n}\n\nclass GlyphHeader {\n  constructor({ numberOfContours, xMin, yMin, xMax, yMax }) {\n    this.numberOfContours = numberOfContours;\n    this.xMin = xMin;\n    this.yMin = yMin;\n    this.xMax = xMax;\n    this.yMax = yMax;\n  }\n\n  static parse(pos, glyf) {\n    return [\n      GLYPH_HEADER_SIZE,\n      new GlyphHeader({\n        numberOfContours: glyf.getInt16(pos),\n        xMin: glyf.getInt16(pos + 2),\n        yMin: glyf.getInt16(pos + 4),\n        xMax: glyf.getInt16(pos + 6),\n        yMax: glyf.getInt16(pos + 8),\n      }),\n    ];\n  }\n\n  getSize() {\n    return GLYPH_HEADER_SIZE;\n  }\n\n  write(pos, buf) {\n    buf.setInt16(pos, this.numberOfContours);\n    buf.setInt16(pos + 2, this.xMin);\n    buf.setInt16(pos + 4, this.yMin);\n    buf.setInt16(pos + 6, this.xMax);\n    buf.setInt16(pos + 8, this.yMax);\n\n    return GLYPH_HEADER_SIZE;\n  }\n\n  scale(x, factor) {\n    this.xMin = Math.round(x + (this.xMin - x) * factor);\n    this.xMax = Math.round(x + (this.xMax - x) * factor);\n  }\n}\n\nclass Contour {\n  constructor({ flags, xCoordinates, yCoordinates }) {\n    this.xCoordinates = xCoordinates;\n    this.yCoordinates = yCoordinates;\n    this.flags = flags;\n  }\n}\n\nclass SimpleGlyph {\n  constructor({ contours, instructions }) {\n    this.contours = contours;\n    this.instructions = instructions;\n  }\n\n  static parse(pos, glyf, numberOfContours) {\n    const endPtsOfContours = [];\n    for (let i = 0; i < numberOfContours; i++) {\n      const endPt = glyf.getUint16(pos);\n      pos += 2;\n      endPtsOfContours.push(endPt);\n    }\n    const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1;\n    const instructionLength = glyf.getUint16(pos);\n    pos += 2;\n    const instructions = new Uint8Array(glyf).slice(\n      pos,\n      pos + instructionLength\n    );\n    pos += instructionLength;\n\n    const flags = [];\n    for (let i = 0; i < numberOfPt; pos++, i++) {\n      let flag = glyf.getUint8(pos);\n      flags.push(flag);\n      if (flag & REPEAT_FLAG) {\n        const count = glyf.getUint8(++pos);\n        flag ^= REPEAT_FLAG;\n        for (let m = 0; m < count; m++) {\n          flags.push(flag);\n        }\n        i += count;\n      }\n    }\n\n    const allXCoordinates = [];\n    let xCoordinates = [];\n    let yCoordinates = [];\n    let pointFlags = [];\n    const contours = [];\n    let endPtsOfContoursIndex = 0;\n    let lastCoordinate = 0;\n\n    // Get x coordinates.\n    for (let i = 0; i < numberOfPt; i++) {\n      const flag = flags[i];\n      if (flag & X_SHORT_VECTOR) {\n        // 8-bits unsigned value.\n        const x = glyf.getUint8(pos++);\n        lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x;\n        xCoordinates.push(lastCoordinate);\n      } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) {\n        // IS_SAME.\n        xCoordinates.push(lastCoordinate);\n      } else {\n        lastCoordinate += glyf.getInt16(pos);\n        pos += 2;\n        xCoordinates.push(lastCoordinate);\n      }\n\n      if (endPtsOfContours[endPtsOfContoursIndex] === i) {\n        // Next entry is the first one of a new contour.\n        endPtsOfContoursIndex++;\n        allXCoordinates.push(xCoordinates);\n        xCoordinates = [];\n      }\n    }\n\n    lastCoordinate = 0;\n    endPtsOfContoursIndex = 0;\n    for (let i = 0; i < numberOfPt; i++) {\n      const flag = flags[i];\n      if (flag & Y_SHORT_VECTOR) {\n        // 8-bits unsigned value.\n        const y = glyf.getUint8(pos++);\n        lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y;\n        yCoordinates.push(lastCoordinate);\n      } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) {\n        // IS_SAME.\n        yCoordinates.push(lastCoordinate);\n      } else {\n        lastCoordinate += glyf.getInt16(pos);\n        pos += 2;\n        yCoordinates.push(lastCoordinate);\n      }\n\n      pointFlags.push((flag & ON_CURVE_POINT) | (flag & OVERLAP_SIMPLE));\n\n      if (endPtsOfContours[endPtsOfContoursIndex] === i) {\n        // Next entry is the first one of a new contour.\n        xCoordinates = allXCoordinates[endPtsOfContoursIndex];\n        endPtsOfContoursIndex++;\n        contours.push(\n          new Contour({\n            flags: pointFlags,\n            xCoordinates,\n            yCoordinates,\n          })\n        );\n        yCoordinates = [];\n        pointFlags = [];\n      }\n    }\n\n    return new SimpleGlyph({\n      contours,\n      instructions,\n    });\n  }\n\n  getSize() {\n    let size = this.contours.length * 2 + 2 + this.instructions.length;\n    let lastX = 0;\n    let lastY = 0;\n    for (const contour of this.contours) {\n      size += contour.flags.length;\n      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {\n        const x = contour.xCoordinates[i];\n        const y = contour.yCoordinates[i];\n        let abs = Math.abs(x - lastX);\n        if (abs > 255) {\n          size += 2;\n        } else if (abs > 0) {\n          size += 1;\n        }\n        lastX = x;\n\n        abs = Math.abs(y - lastY);\n        if (abs > 255) {\n          size += 2;\n        } else if (abs > 0) {\n          size += 1;\n        }\n        lastY = y;\n      }\n    }\n    return size;\n  }\n\n  write(pos, buf) {\n    const spos = pos;\n    const xCoordinates = [];\n    const yCoordinates = [];\n    const flags = [];\n    let lastX = 0;\n    let lastY = 0;\n\n    for (const contour of this.contours) {\n      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {\n        let flag = contour.flags[i];\n        const x = contour.xCoordinates[i];\n        let delta = x - lastX;\n        if (delta === 0) {\n          flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR;\n          xCoordinates.push(0);\n        } else {\n          const abs = Math.abs(delta);\n          if (abs <= 255) {\n            flag |=\n              delta >= 0\n                ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR\n                : X_SHORT_VECTOR;\n            xCoordinates.push(abs);\n          } else {\n            xCoordinates.push(delta);\n          }\n        }\n        lastX = x;\n\n        const y = contour.yCoordinates[i];\n        delta = y - lastY;\n        if (delta === 0) {\n          flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR;\n          yCoordinates.push(0);\n        } else {\n          const abs = Math.abs(delta);\n          if (abs <= 255) {\n            flag |=\n              delta >= 0\n                ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR\n                : Y_SHORT_VECTOR;\n            yCoordinates.push(abs);\n          } else {\n            yCoordinates.push(delta);\n          }\n        }\n        lastY = y;\n\n        flags.push(flag);\n      }\n\n      // Write endPtsOfContours entry.\n      buf.setUint16(pos, xCoordinates.length - 1);\n      pos += 2;\n    }\n\n    // Write instructionLength.\n    buf.setUint16(pos, this.instructions.length);\n    pos += 2;\n    if (this.instructions.length) {\n      // Write instructions.\n      new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(\n        this.instructions,\n        pos\n      );\n      pos += this.instructions.length;\n    }\n\n    // Write flags.\n    for (const flag of flags) {\n      buf.setUint8(pos++, flag);\n    }\n\n    // Write xCoordinates.\n    for (let i = 0, ii = xCoordinates.length; i < ii; i++) {\n      const x = xCoordinates[i];\n      const flag = flags[i];\n      if (flag & X_SHORT_VECTOR) {\n        buf.setUint8(pos++, x);\n      } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) {\n        buf.setInt16(pos, x);\n        pos += 2;\n      }\n    }\n\n    // Write yCoordinates.\n    for (let i = 0, ii = yCoordinates.length; i < ii; i++) {\n      const y = yCoordinates[i];\n      const flag = flags[i];\n      if (flag & Y_SHORT_VECTOR) {\n        buf.setUint8(pos++, y);\n      } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) {\n        buf.setInt16(pos, y);\n        pos += 2;\n      }\n    }\n\n    return pos - spos;\n  }\n\n  scale(x, factor) {\n    for (const contour of this.contours) {\n      if (contour.xCoordinates.length === 0) {\n        continue;\n      }\n\n      for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {\n        contour.xCoordinates[i] = Math.round(\n          x + (contour.xCoordinates[i] - x) * factor\n        );\n      }\n    }\n  }\n}\n\nclass CompositeGlyph {\n  constructor({\n    flags,\n    glyphIndex,\n    argument1,\n    argument2,\n    transf,\n    instructions,\n  }) {\n    this.flags = flags;\n    this.glyphIndex = glyphIndex;\n    this.argument1 = argument1;\n    this.argument2 = argument2;\n    this.transf = transf;\n    this.instructions = instructions;\n  }\n\n  static parse(pos, glyf) {\n    const spos = pos;\n    const transf = [];\n    let flags = glyf.getUint16(pos);\n    const glyphIndex = glyf.getUint16(pos + 2);\n    pos += 4;\n\n    let argument1, argument2;\n    if (flags & ARG_1_AND_2_ARE_WORDS) {\n      if (flags & ARGS_ARE_XY_VALUES) {\n        argument1 = glyf.getInt16(pos);\n        argument2 = glyf.getInt16(pos + 2);\n      } else {\n        argument1 = glyf.getUint16(pos);\n        argument2 = glyf.getUint16(pos + 2);\n      }\n      pos += 4;\n      flags ^= ARG_1_AND_2_ARE_WORDS;\n    } else {\n      if (flags & ARGS_ARE_XY_VALUES) {\n        argument1 = glyf.getInt8(pos);\n        argument2 = glyf.getInt8(pos + 1);\n      } else {\n        argument1 = glyf.getUint8(pos);\n        argument2 = glyf.getUint8(pos + 1);\n      }\n      pos += 2;\n    }\n\n    if (flags & WE_HAVE_A_SCALE) {\n      // Single F2.14.\n      transf.push(glyf.getUint16(pos));\n      pos += 2;\n    } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {\n      // Two F2.14.\n      transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2));\n      pos += 4;\n    } else if (flags & WE_HAVE_A_TWO_BY_TWO) {\n      // Four F2.14.\n      transf.push(\n        glyf.getUint16(pos),\n        glyf.getUint16(pos + 2),\n        glyf.getUint16(pos + 4),\n        glyf.getUint16(pos + 6)\n      );\n      pos += 8;\n    }\n\n    let instructions = null;\n    if (flags & WE_HAVE_INSTRUCTIONS) {\n      const instructionLength = glyf.getUint16(pos);\n      pos += 2;\n      instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength);\n      pos += instructionLength;\n    }\n\n    return [\n      pos - spos,\n      new CompositeGlyph({\n        flags,\n        glyphIndex,\n        argument1,\n        argument2,\n        transf,\n        instructions,\n      }),\n    ];\n  }\n\n  getSize() {\n    let size = 2 + 2 + this.transf.length * 2;\n    if (this.flags & WE_HAVE_INSTRUCTIONS) {\n      size += 2 + this.instructions.length;\n    }\n\n    size += 2;\n    if (this.flags & 2) {\n      // Arguments are signed.\n      if (\n        !(\n          this.argument1 >= -128 &&\n          this.argument1 <= 127 &&\n          this.argument2 >= -128 &&\n          this.argument2 <= 127\n        )\n      ) {\n        size += 2;\n      }\n    } else if (\n      !(\n        this.argument1 >= 0 &&\n        this.argument1 <= 255 &&\n        this.argument2 >= 0 &&\n        this.argument2 <= 255\n      )\n    ) {\n      size += 2;\n    }\n\n    return size;\n  }\n\n  write(pos, buf) {\n    const spos = pos;\n\n    if (this.flags & ARGS_ARE_XY_VALUES) {\n      // Arguments are signed.\n      if (\n        !(\n          this.argument1 >= -128 &&\n          this.argument1 <= 127 &&\n          this.argument2 >= -128 &&\n          this.argument2 <= 127\n        )\n      ) {\n        this.flags |= ARG_1_AND_2_ARE_WORDS;\n      }\n    } else if (\n      !(\n        this.argument1 >= 0 &&\n        this.argument1 <= 255 &&\n        this.argument2 >= 0 &&\n        this.argument2 <= 255\n      )\n    ) {\n      this.flags |= ARG_1_AND_2_ARE_WORDS;\n    }\n\n    buf.setUint16(pos, this.flags);\n    buf.setUint16(pos + 2, this.glyphIndex);\n    pos += 4;\n\n    if (this.flags & ARG_1_AND_2_ARE_WORDS) {\n      if (this.flags & ARGS_ARE_XY_VALUES) {\n        buf.setInt16(pos, this.argument1);\n        buf.setInt16(pos + 2, this.argument2);\n      } else {\n        buf.setUint16(pos, this.argument1);\n        buf.setUint16(pos + 2, this.argument2);\n      }\n      pos += 4;\n    } else {\n      buf.setUint8(pos, this.argument1);\n      buf.setUint8(pos + 1, this.argument2);\n      pos += 2;\n    }\n\n    if (this.flags & WE_HAVE_INSTRUCTIONS) {\n      buf.setUint16(pos, this.instructions.length);\n      pos += 2;\n      // Write instructions.\n      if (this.instructions.length) {\n        new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(\n          this.instructions,\n          pos\n        );\n        pos += this.instructions.length;\n      }\n    }\n\n    return pos - spos;\n  }\n\n  scale(x, factor) {}\n}\n\nfunction pruneCompositeGlyphCycles(glyfTable, locaEntries, numGlyphs) {\n  const glyf = new DataView(\n    glyfTable.buffer,\n    glyfTable.byteOffset,\n    glyfTable.byteLength\n  );\n  const components = new Array(numGlyphs);\n  for (let i = 0; i < numGlyphs; i++) {\n    const offset = locaEntries[i].offset;\n    const endOffset = Math.min(locaEntries[i].endOffset, glyf.byteLength);\n    if (endOffset - offset <= GLYPH_HEADER_SIZE || glyf.getInt16(offset) >= 0) {\n      continue;\n    }\n    const comps = [];\n    let p = offset + GLYPH_HEADER_SIZE;\n    while (p + 4 <= endOffset) {\n      const flags = glyf.getUint16(p);\n      const gid = glyf.getUint16(p + 2);\n      let size = 4 + (flags & ARG_1_AND_2_ARE_WORDS ? 4 : 2);\n      if (flags & WE_HAVE_A_SCALE) {\n        size += 2;\n      } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {\n        size += 4;\n      } else if (flags & WE_HAVE_A_TWO_BY_TWO) {\n        size += 8;\n      }\n      comps.push({ gid, offset: p, size, flags });\n      p += size;\n      if (!(flags & MORE_COMPONENTS)) {\n        break;\n      }\n    }\n    if (comps.length) {\n      components[i] = comps;\n    }\n  }\n\n  const WHITE = 0,\n    GRAY = 1,\n    BLACK = 2;\n  const state = new Uint8Array(numGlyphs);\n  const backEdges = new Map();\n  for (let start = 0; start < numGlyphs; start++) {\n    if (state[start] !== WHITE || !components[start]) {\n      continue;\n    }\n    const stack = [{ node: start, idx: 0 }];\n    state[start] = GRAY;\n    while (stack.length > 0) {\n      const top = stack.at(-1);\n      const comps = components[top.node];\n      if (!comps || top.idx >= comps.length) {\n        state[top.node] = BLACK;\n        stack.pop();\n        continue;\n      }\n      const compIdx = top.idx++;\n      const next = comps[compIdx].gid;\n      if (next >= numGlyphs || state[next] === BLACK) {\n        continue;\n      }\n      if (state[next] === WHITE) {\n        state[next] = GRAY;\n        stack.push({ node: next, idx: 0 });\n        continue;\n      }\n\n      let removeSet = backEdges.get(top.node);\n      if (!removeSet) {\n        removeSet = new Set();\n        backEdges.set(top.node, removeSet);\n      }\n      removeSet.add(compIdx);\n    }\n  }\n\n  const droppedGlyphs = new Set();\n  for (const [gIdx, removeSet] of backEdges) {\n    const comps = components[gIdx];\n    const remaining = [];\n    for (let ci = 0; ci < comps.length; ci++) {\n      if (!removeSet.has(ci)) {\n        remaining.push(comps[ci]);\n      }\n    }\n    if (remaining.length === 0) {\n      droppedGlyphs.add(gIdx);\n      continue;\n    }\n    const start = locaEntries[gIdx].offset;\n    const endOffset = Math.min(locaEntries[gIdx].endOffset, glyf.byteLength);\n    let writePos = start + GLYPH_HEADER_SIZE;\n    for (let ci = 0; ci < remaining.length; ci++) {\n      const c = remaining[ci];\n      const isLast = ci === remaining.length - 1;\n      let newFlags = c.flags & ~WE_HAVE_INSTRUCTIONS;\n      newFlags = isLast\n        ? newFlags & ~MORE_COMPONENTS\n        : newFlags | MORE_COMPONENTS;\n      if (writePos !== c.offset) {\n        glyfTable.copyWithin(writePos, c.offset, c.offset + c.size);\n      }\n      glyf.setUint16(writePos, newFlags);\n      writePos += c.size;\n    }\n    if (writePos < endOffset) {\n      glyfTable.fill(0, writePos, endOffset);\n    }\n  }\n  return droppedGlyphs;\n}\n\nexport { GlyfTable, pruneCompositeGlyphCycles };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { unreachable } from \"../shared/util.js\";\n\nclass ToUnicodeMap {\n  constructor(cmap = []) {\n    // The elements of this._map can be integers or strings, depending on how\n    // `cmap` was created.\n    this._map = cmap;\n  }\n\n  get length() {\n    return this._map.length;\n  }\n\n  forEach(callback) {\n    for (const charCode in this._map) {\n      callback(charCode, this._map[charCode].codePointAt(0));\n    }\n  }\n\n  has(i) {\n    return this._map[i] !== undefined;\n  }\n\n  get(i) {\n    return this._map[i];\n  }\n\n  charCodeOf(value) {\n    // `Array.prototype.indexOf` is *extremely* inefficient for arrays which\n    // are both very sparse and very large (see issue8372.pdf).\n    const map = this._map;\n    if (map.length <= 0x10000) {\n      return map.indexOf(value);\n    }\n    for (const charCode in map) {\n      if (map[charCode] === value) {\n        return charCode | 0;\n      }\n    }\n    return -1;\n  }\n\n  amend(map) {\n    for (const charCode in map) {\n      this._map[charCode] = map[charCode];\n    }\n  }\n}\n\nclass IdentityToUnicodeMap {\n  constructor(firstChar, lastChar) {\n    this.firstChar = firstChar;\n    this.lastChar = lastChar;\n  }\n\n  get length() {\n    return this.lastChar + 1 - this.firstChar;\n  }\n\n  forEach(callback) {\n    for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) {\n      callback(i, i);\n    }\n  }\n\n  has(i) {\n    return this.firstChar <= i && i <= this.lastChar;\n  }\n\n  get(i) {\n    if (this.firstChar <= i && i <= this.lastChar) {\n      return String.fromCharCode(i);\n    }\n    return undefined;\n  }\n\n  charCodeOf(v) {\n    return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar\n      ? v\n      : -1;\n  }\n\n  amend(map) {\n    unreachable(\"Should not call amend()\");\n  }\n}\n\nexport { IdentityToUnicodeMap, ToUnicodeMap };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CFFCompiler, CFFParser } from \"./cff_parser.js\";\nimport { SEAC_ANALYSIS_ENABLED, type1FontGlyphMapping } from \"./fonts_utils.js\";\nimport { warn } from \"../shared/util.js\";\n\nclass CFFFont {\n  constructor(file, properties) {\n    this.properties = properties;\n\n    const parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);\n    this.cff = parser.parse();\n    this.cff.duplicateFirstGlyph();\n    const compiler = new CFFCompiler(this.cff);\n    this.seacs = this.cff.seacs;\n    try {\n      this.data = compiler.compile();\n    } catch (ex) {\n      warn(`Failed to compile font \"${properties.loadedName}\": \"${ex}\".`);\n      // There may have just been an issue with the compiler, set the data\n      // anyway and hope the font loaded.\n      file.reset();\n      this.data = file.getBytes();\n    }\n    this._createBuiltInEncoding();\n  }\n\n  get numGlyphs() {\n    return this.cff.charStrings.count;\n  }\n\n  getCharset() {\n    return this.cff.charset.charset;\n  }\n\n  getGlyphMapping() {\n    const cff = this.cff;\n    const properties = this.properties;\n    const { cidToGidMap, cMap } = properties;\n    const charsets = cff.charset.charset;\n    let charCodeToGlyphId;\n    let glyphId;\n\n    if (properties.composite) {\n      let invCidToGidMap;\n      if (cidToGidMap?.length > 0) {\n        invCidToGidMap = Object.create(null);\n        for (let i = 0, ii = cidToGidMap.length; i < ii; i++) {\n          const gid = cidToGidMap[i];\n          if (gid !== undefined) {\n            invCidToGidMap[gid] = i;\n          }\n        }\n      }\n\n      charCodeToGlyphId = Object.create(null);\n      let charCode;\n      if (cff.isCIDFont) {\n        // If the font is actually a CID font then we should use the charset\n        // to map CIDs to GIDs.\n        for (glyphId = 0; glyphId < charsets.length; glyphId++) {\n          const cid = charsets[glyphId];\n          charCode = cMap.charCodeOf(cid);\n\n          if (invCidToGidMap?.[charCode] !== undefined) {\n            // According to the PDF specification, see Table 117, it's not clear\n            // that a /CIDToGIDMap should be used with any non-TrueType fonts,\n            // however it's necessary to do so in order to fix issue 15559.\n            //\n            // It seems, in the CFF-case, that the /CIDToGIDMap needs to be used\n            // \"inverted\" compared to the TrueType-case. Here it thus seem to be\n            // a charCode mapping, rather than the normal CID to GID mapping.\n            charCode = invCidToGidMap[charCode];\n          }\n          charCodeToGlyphId[charCode] = glyphId;\n        }\n      } else {\n        // If it is NOT actually a CID font then CIDs should be mapped\n        // directly to GIDs.\n        for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {\n          charCode = cMap.charCodeOf(glyphId);\n          charCodeToGlyphId[charCode] = glyphId;\n        }\n      }\n      return charCodeToGlyphId;\n    }\n\n    let encoding = cff.encoding ? cff.encoding.encoding : null;\n    if (properties.isInternalFont) {\n      encoding = properties.defaultEncoding;\n    }\n    charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);\n    return charCodeToGlyphId;\n  }\n\n  hasGlyphId(id) {\n    return this.cff.hasGlyphId(id);\n  }\n\n  /**\n   * @private\n   */\n  _createBuiltInEncoding() {\n    const { charset, encoding } = this.cff;\n    if (!charset || !encoding) {\n      return;\n    }\n    const charsets = charset.charset,\n      encodings = encoding.encoding;\n    const map = [];\n\n    for (const charCode in encodings) {\n      const glyphId = encodings[charCode];\n      if (glyphId >= 0) {\n        const glyphName = charsets[glyphId];\n        if (glyphName) {\n          map[charCode] = glyphName;\n        }\n      }\n    }\n    if (map.length > 0) {\n      this.properties.builtInEncoding = map;\n    }\n  }\n}\n\nexport { CFFFont };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  bytesToString,\n  DrawOPS,\n  FeatureTest,\n  FONT_IDENTITY_MATRIX,\n  FormatError,\n  shadow,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { CFFParser } from \"./cff_parser.js\";\nimport { getGlyphsUnicode } from \"./glyphlist.js\";\nimport { isNumberArray } from \"./core_utils.js\";\nimport { StandardEncoding } from \"./encodings.js\";\nimport { Stream } from \"./stream.js\";\n\nfunction getFloat214(view, offset) {\n  return view.getInt16(offset) / 16384;\n}\n\nfunction getSubroutineBias(subrs) {\n  const numSubrs = subrs.length;\n  if (numSubrs >= 33900) {\n    return 32768;\n  }\n  return numSubrs < 1240 ? 107 : 1131;\n}\n\nfunction parseCmap(data, start, end) {\n  const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n  const offset =\n    view.getUint16(start + 2) === 1\n      ? view.getUint32(start + 8)\n      : view.getUint32(start + 16);\n  const format = view.getUint16(start + offset);\n  let ranges, p, i;\n  if (format === 4) {\n    // Skip length, at `start + offset + 2`.\n    const segCount = view.getUint16(start + offset + 6) >> 1;\n    p = start + offset + 14;\n    ranges = [];\n    for (i = 0; i < segCount; i++, p += 2) {\n      ranges[i] = { end: view.getUint16(p) };\n    }\n    p += 2;\n    for (i = 0; i < segCount; i++, p += 2) {\n      ranges[i].start = view.getUint16(p);\n    }\n    for (i = 0; i < segCount; i++, p += 2) {\n      ranges[i].idDelta = view.getUint16(p);\n    }\n    for (i = 0; i < segCount; i++, p += 2) {\n      let idOffset = view.getUint16(p);\n      if (idOffset === 0) {\n        continue;\n      }\n      ranges[i].ids = [];\n      for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {\n        ranges[i].ids[j] = view.getUint16(p + idOffset);\n        idOffset += 2;\n      }\n    }\n    return ranges;\n  } else if (format === 12) {\n    const groups = view.getUint32(start + offset + 12);\n    p = start + offset + 16;\n    ranges = [];\n    for (i = 0; i < groups; i++) {\n      start = view.getUint32(p);\n      ranges.push({\n        start,\n        end: view.getUint32(p + 4),\n        idDelta: view.getUint32(p + 8) - start,\n      });\n      p += 12;\n    }\n    return ranges;\n  }\n  throw new FormatError(`unsupported cmap: ${format}`);\n}\n\nfunction parseCff(data, start, end, seacAnalysisEnabled) {\n  const properties = {};\n  const parser = new CFFParser(\n    new Stream(data, start, end - start),\n    properties,\n    seacAnalysisEnabled\n  );\n  const cff = parser.parse();\n  return {\n    glyphs: cff.charStrings.objects,\n    subrs: cff.topDict.privateDict?.subrsIndex?.objects,\n    gsubrs: cff.globalSubrIndex?.objects,\n    isCFFCIDFont: cff.isCIDFont,\n    fdSelect: cff.fdSelect,\n    fdArray: cff.fdArray,\n  };\n}\n\nfunction parseGlyfTable(glyf, loca, isGlyphLocationsLong) {\n  const view = new DataView(loca.buffer, loca.byteOffset, loca.byteLength);\n  let itemSize, itemDecode;\n  if (isGlyphLocationsLong) {\n    itemSize = 4;\n    itemDecode = (dv, offset) => dv.getUint32(offset);\n  } else {\n    itemSize = 2;\n    itemDecode = (dv, offset) => 2 * dv.getUint16(offset);\n  }\n  const glyphs = [];\n  let startOffset = itemDecode(view, 0);\n  for (let j = itemSize; j < loca.length; j += itemSize) {\n    const endOffset = itemDecode(view, j);\n    glyphs.push(glyf.subarray(startOffset, endOffset));\n    startOffset = endOffset;\n  }\n  return glyphs;\n}\n\nfunction lookupCmap(ranges, unicode) {\n  const code = unicode.codePointAt(0);\n  let gid = 0,\n    l = 0,\n    r = ranges.length - 1;\n  while (l < r) {\n    const c = (l + r + 1) >> 1;\n    if (code < ranges[c].start) {\n      r = c - 1;\n    } else {\n      l = c;\n    }\n  }\n  if (ranges[l].start <= code && code <= ranges[l].end) {\n    gid =\n      (ranges[l].idDelta +\n        (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code)) &\n      0xffff;\n  }\n  return {\n    charCode: code,\n    glyphId: gid,\n  };\n}\n\nfunction compileGlyf(code, cmds, font, visitedGlyphs = new Set()) {\n  if (!code?.length) {\n    return;\n  }\n  if (visitedGlyphs.has(code)) {\n    warn(\"compileGlyf: skipping recursive composite glyph reference.\");\n    return;\n  }\n  visitedGlyphs.add(code);\n\n  function moveTo(x, y) {\n    if (firstPoint) {\n      // Close the current subpath in adding a straight line to the first point.\n      cmds.add(DrawOPS.lineTo, firstPoint);\n    }\n    firstPoint = [x, y];\n    cmds.add(DrawOPS.moveTo, [x, y]);\n  }\n  function lineTo(x, y) {\n    cmds.add(DrawOPS.lineTo, [x, y]);\n  }\n  function quadraticCurveTo(xa, ya, x, y) {\n    cmds.add(DrawOPS.quadraticCurveTo, [xa, ya, x, y]);\n  }\n\n  const view = new DataView(code.buffer, code.byteOffset, code.byteLength);\n  let i = 0;\n  const numberOfContours = view.getInt16(i);\n  let flags;\n  let firstPoint = null;\n  let x = 0,\n    y = 0;\n  i += 10;\n  if (numberOfContours < 0) {\n    // composite glyph\n    do {\n      flags = view.getUint16(i);\n      const glyphIndex = view.getUint16(i + 2);\n      i += 4;\n      let arg1, arg2;\n      if (flags & 0x01) {\n        if (flags & 0x02) {\n          arg1 = view.getInt16(i);\n          arg2 = view.getInt16(i + 2);\n        } else {\n          arg1 = view.getUint16(i);\n          arg2 = view.getUint16(i + 2);\n        }\n        i += 4;\n      } else if (flags & 0x02) {\n        arg1 = view.getInt8(i++);\n        arg2 = view.getInt8(i++);\n      } else {\n        arg1 = code[i++];\n        arg2 = code[i++];\n      }\n      if (flags & 0x02) {\n        x = arg1;\n        y = arg2;\n      } else {\n        x = 0;\n        y = 0;\n      }\n      let scaleX = 1,\n        scaleY = 1,\n        scale01 = 0,\n        scale10 = 0;\n      if (flags & 0x08) {\n        scaleX = scaleY = getFloat214(view, i);\n        i += 2;\n      } else if (flags & 0x40) {\n        scaleX = getFloat214(view, i);\n        scaleY = getFloat214(view, i + 2);\n        i += 4;\n      } else if (flags & 0x80) {\n        scaleX = getFloat214(view, i);\n        scale01 = getFloat214(view, i + 2);\n        scale10 = getFloat214(view, i + 4);\n        scaleY = getFloat214(view, i + 6);\n        i += 8;\n      }\n      const subglyph = font.glyphs[glyphIndex];\n      if (subglyph) {\n        // TODO: the transform should be applied only if there is a scale:\n        // https://github.com/freetype/freetype/blob/edd4fedc5427cf1cf1f4b045e53ff91eb282e9d4/src/truetype/ttgload.c#L1205\n        cmds.save();\n        cmds.transform([scaleX, scale01, scale10, scaleY, x, y]);\n\n        if (!(flags & 0x02)) {\n          // TODO: we must use arg1 and arg2 to make something similar to:\n          // https://github.com/freetype/freetype/blob/edd4fedc5427cf1cf1f4b045e53ff91eb282e9d4/src/truetype/ttgload.c#L1209\n        }\n        compileGlyf(subglyph, cmds, font, visitedGlyphs);\n        cmds.restore();\n      }\n    } while (flags & 0x20);\n  } else {\n    // simple glyph\n    const endPtsOfContours = [];\n    let j, jj;\n    for (j = 0; j < numberOfContours; j++) {\n      endPtsOfContours.push(view.getUint16(i));\n      i += 2;\n    }\n    const instructionLength = view.getUint16(i);\n    i += 2 + instructionLength; // skipping the instructions\n    const numberOfPoints = endPtsOfContours.at(-1) + 1;\n    const points = [];\n    while (points.length < numberOfPoints) {\n      flags = code[i++];\n      let repeat = 1;\n      if (flags & 0x08) {\n        repeat += code[i++];\n      }\n      while (repeat-- > 0) {\n        points.push({ flags });\n      }\n    }\n    for (j = 0; j < numberOfPoints; j++) {\n      switch (points[j].flags & 0x12) {\n        case 0x00:\n          x += view.getInt16(i);\n          i += 2;\n          break;\n        case 0x02:\n          x -= code[i++];\n          break;\n        case 0x12:\n          x += code[i++];\n          break;\n      }\n      points[j].x = x;\n    }\n    for (j = 0; j < numberOfPoints; j++) {\n      switch (points[j].flags & 0x24) {\n        case 0x00:\n          y += view.getInt16(i);\n          i += 2;\n          break;\n        case 0x04:\n          y -= code[i++];\n          break;\n        case 0x24:\n          y += code[i++];\n          break;\n      }\n      points[j].y = y;\n    }\n\n    let startPoint = 0;\n    for (i = 0; i < numberOfContours; i++) {\n      const endPoint = endPtsOfContours[i];\n      // contours might have implicit points, which is located in the middle\n      // between two neighboring off-curve points\n      const contour = points.slice(startPoint, endPoint + 1);\n      if (contour[0].flags & 1) {\n        contour.push(contour[0]); // using start point at the contour end\n      } else if (contour.at(-1).flags & 1) {\n        // first is off-curve point, trying to use one from the end\n        contour.unshift(contour.at(-1));\n      } else {\n        // start and end are off-curve points, creating implicit one\n        const p = {\n          flags: 1,\n          x: (contour[0].x + contour.at(-1).x) / 2,\n          y: (contour[0].y + contour.at(-1).y) / 2,\n        };\n        contour.unshift(p);\n        contour.push(p);\n      }\n      moveTo(contour[0].x, contour[0].y);\n      for (j = 1, jj = contour.length; j < jj; j++) {\n        if (contour[j].flags & 1) {\n          lineTo(contour[j].x, contour[j].y);\n        } else if (contour[j + 1].flags & 1) {\n          quadraticCurveTo(\n            contour[j].x,\n            contour[j].y,\n            contour[j + 1].x,\n            contour[j + 1].y\n          );\n          j++;\n        } else {\n          quadraticCurveTo(\n            contour[j].x,\n            contour[j].y,\n            (contour[j].x + contour[j + 1].x) / 2,\n            (contour[j].y + contour[j + 1].y) / 2\n          );\n        }\n      }\n      startPoint = endPoint + 1;\n    }\n  }\n  visitedGlyphs.delete(code);\n}\n\nfunction compileCharString(charStringCode, cmds, font, glyphId) {\n  function moveTo(x, y) {\n    if (firstPoint) {\n      // Close the current subpath in adding a straight line to the first point.\n      cmds.add(DrawOPS.lineTo, firstPoint);\n    }\n    firstPoint = [x, y];\n    cmds.add(DrawOPS.moveTo, [x, y]);\n  }\n  function lineTo(x, y) {\n    cmds.add(DrawOPS.lineTo, [x, y]);\n  }\n  function bezierCurveTo(x1, y1, x2, y2, x, y) {\n    cmds.add(DrawOPS.curveTo, [x1, y1, x2, y2, x, y]);\n  }\n\n  const stack = [];\n  let x = 0,\n    y = 0;\n  let stems = 0;\n  let firstPoint = null;\n\n  function parse(code) {\n    const view = new DataView(code.buffer, code.byteOffset, code.byteLength);\n    let i = 0;\n    while (i < code.length) {\n      let stackClean = false;\n      let v = code[i++];\n      let xa, xb, ya, yb, y1, y2, y3, n, subrCode;\n      switch (v) {\n        case 1: // hstem\n          stems += stack.length >> 1;\n          stackClean = true;\n          break;\n        case 3: // vstem\n          stems += stack.length >> 1;\n          stackClean = true;\n          break;\n        case 4: // vmoveto\n          y += stack.pop();\n          moveTo(x, y);\n          stackClean = true;\n          break;\n        case 5: // rlineto\n          while (stack.length > 0) {\n            x += stack.shift();\n            y += stack.shift();\n            lineTo(x, y);\n          }\n          break;\n        case 6: // hlineto\n          while (stack.length > 0) {\n            x += stack.shift();\n            lineTo(x, y);\n            if (stack.length === 0) {\n              break;\n            }\n            y += stack.shift();\n            lineTo(x, y);\n          }\n          break;\n        case 7: // vlineto\n          while (stack.length > 0) {\n            y += stack.shift();\n            lineTo(x, y);\n            if (stack.length === 0) {\n              break;\n            }\n            x += stack.shift();\n            lineTo(x, y);\n          }\n          break;\n        case 8: // rrcurveto\n          while (stack.length > 0) {\n            xa = x + stack.shift();\n            ya = y + stack.shift();\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb + stack.shift();\n            y = yb + stack.shift();\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n          }\n          break;\n        case 10: // callsubr\n          n = stack.pop();\n          subrCode = null;\n          if (font.isCFFCIDFont) {\n            const fdIndex = font.fdSelect.getFDIndex(glyphId);\n            if (fdIndex >= 0 && fdIndex < font.fdArray.length) {\n              const fontDict = font.fdArray[fdIndex];\n              let subrs;\n              if (fontDict.privateDict?.subrsIndex) {\n                subrs = fontDict.privateDict.subrsIndex.objects;\n              }\n              if (subrs) {\n                // Add subroutine bias.\n                n += getSubroutineBias(subrs);\n                subrCode = subrs[n];\n              }\n            } else {\n              warn(\"Invalid fd index for glyph index.\");\n            }\n          } else {\n            subrCode = font.subrs[n + font.subrsBias];\n          }\n          if (subrCode) {\n            parse(subrCode);\n          }\n          break;\n        case 11: // return\n          return;\n        case 12:\n          v = code[i++];\n          switch (v) {\n            case 34: // flex\n              xa = x + stack.shift();\n              xb = xa + stack.shift();\n              y1 = y + stack.shift();\n              x = xb + stack.shift();\n              bezierCurveTo(xa, y, xb, y1, x, y1);\n              xa = x + stack.shift();\n              xb = xa + stack.shift();\n              x = xb + stack.shift();\n              bezierCurveTo(xa, y1, xb, y, x, y);\n              break;\n            case 35: // flex\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              stack.pop(); // fd\n              break;\n            case 36: // hflex1\n              xa = x + stack.shift();\n              y1 = y + stack.shift();\n              xb = xa + stack.shift();\n              y2 = y1 + stack.shift();\n              x = xb + stack.shift();\n              bezierCurveTo(xa, y1, xb, y2, x, y2);\n              xa = x + stack.shift();\n              xb = xa + stack.shift();\n              y3 = y2 + stack.shift();\n              x = xb + stack.shift();\n              bezierCurveTo(xa, y2, xb, y3, x, y);\n              break;\n            case 37: // flex1\n              const x0 = x,\n                y0 = y;\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              xa = x + stack.shift();\n              ya = y + stack.shift();\n              xb = xa + stack.shift();\n              yb = ya + stack.shift();\n              x = xb;\n              y = yb;\n              if (Math.abs(x - x0) > Math.abs(y - y0)) {\n                x += stack.shift();\n              } else {\n                y += stack.shift();\n              }\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              break;\n            default:\n              throw new FormatError(`unknown operator: 12 ${v}`);\n          }\n          break;\n        case 14: // endchar\n          if (stack.length >= 4) {\n            const achar = stack.pop();\n            const bchar = stack.pop();\n            y = stack.pop();\n            x = stack.pop();\n            cmds.save();\n            cmds.translate(x, y);\n            let cmap = lookupCmap(\n              font.cmap,\n              String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]])\n            );\n            compileCharString(\n              font.glyphs[cmap.glyphId],\n              cmds,\n              font,\n              cmap.glyphId\n            );\n            cmds.restore();\n\n            cmap = lookupCmap(\n              font.cmap,\n              String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]])\n            );\n            compileCharString(\n              font.glyphs[cmap.glyphId],\n              cmds,\n              font,\n              cmap.glyphId\n            );\n          }\n          return;\n        case 18: // hstemhm\n          stems += stack.length >> 1;\n          stackClean = true;\n          break;\n        case 19: // hintmask\n          stems += stack.length >> 1;\n          i += (stems + 7) >> 3;\n          stackClean = true;\n          break;\n        case 20: // cntrmask\n          stems += stack.length >> 1;\n          i += (stems + 7) >> 3;\n          stackClean = true;\n          break;\n        case 21: // rmoveto\n          y += stack.pop();\n          x += stack.pop();\n          moveTo(x, y);\n          stackClean = true;\n          break;\n        case 22: // hmoveto\n          x += stack.pop();\n          moveTo(x, y);\n          stackClean = true;\n          break;\n        case 23: // vstemhm\n          stems += stack.length >> 1;\n          stackClean = true;\n          break;\n        case 24: // rcurveline\n          while (stack.length > 2) {\n            xa = x + stack.shift();\n            ya = y + stack.shift();\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb + stack.shift();\n            y = yb + stack.shift();\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n          }\n          x += stack.shift();\n          y += stack.shift();\n          lineTo(x, y);\n          break;\n        case 25: // rlinecurve\n          while (stack.length > 6) {\n            x += stack.shift();\n            y += stack.shift();\n            lineTo(x, y);\n          }\n          xa = x + stack.shift();\n          ya = y + stack.shift();\n          xb = xa + stack.shift();\n          yb = ya + stack.shift();\n          x = xb + stack.shift();\n          y = yb + stack.shift();\n          bezierCurveTo(xa, ya, xb, yb, x, y);\n          break;\n        case 26: // vvcurveto\n          if (stack.length % 2) {\n            x += stack.shift();\n          }\n          while (stack.length > 0) {\n            xa = x;\n            ya = y + stack.shift();\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb;\n            y = yb + stack.shift();\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n          }\n          break;\n        case 27: // hhcurveto\n          if (stack.length % 2) {\n            y += stack.shift();\n          }\n          while (stack.length > 0) {\n            xa = x + stack.shift();\n            ya = y;\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb + stack.shift();\n            y = yb;\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n          }\n          break;\n        case 28:\n          stack.push(view.getInt16(i));\n          i += 2;\n          break;\n        case 29: // callgsubr\n          n = stack.pop() + font.gsubrsBias;\n          subrCode = font.gsubrs[n];\n          if (subrCode) {\n            parse(subrCode);\n          }\n          break;\n        case 30: // vhcurveto\n          while (stack.length > 0) {\n            xa = x;\n            ya = y + stack.shift();\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb + stack.shift();\n            y = yb + (stack.length === 1 ? stack.shift() : 0);\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n            if (stack.length === 0) {\n              break;\n            }\n\n            xa = x + stack.shift();\n            ya = y;\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            y = yb + stack.shift();\n            x = xb + (stack.length === 1 ? stack.shift() : 0);\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n          }\n          break;\n        case 31: // hvcurveto\n          while (stack.length > 0) {\n            xa = x + stack.shift();\n            ya = y;\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            y = yb + stack.shift();\n            x = xb + (stack.length === 1 ? stack.shift() : 0);\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n            if (stack.length === 0) {\n              break;\n            }\n\n            xa = x;\n            ya = y + stack.shift();\n            xb = xa + stack.shift();\n            yb = ya + stack.shift();\n            x = xb + stack.shift();\n            y = yb + (stack.length === 1 ? stack.shift() : 0);\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n          }\n          break;\n        default:\n          if (v < 32) {\n            throw new FormatError(`unknown operator: ${v}`);\n          }\n          if (v < 247) {\n            stack.push(v - 139);\n          } else if (v < 251) {\n            stack.push((v - 247) * 256 + code[i++] + 108);\n          } else if (v < 255) {\n            stack.push(-(v - 251) * 256 - code[i++] - 108);\n          } else {\n            stack.push(view.getInt32(i) / 65536);\n            i += 4;\n          }\n          break;\n      }\n      if (stackClean) {\n        stack.length = 0;\n      }\n    }\n  }\n  parse(charStringCode);\n}\n\nclass Commands {\n  cmds = [];\n\n  transformStack = [];\n\n  currentTransform = [1, 0, 0, 1, 0, 0];\n\n  add(cmd, args) {\n    if (args) {\n      const { currentTransform } = this;\n      for (let i = 0, ii = args.length; i < ii; i += 2) {\n        Util.applyTransform(args, currentTransform, i);\n      }\n      this.cmds.push(cmd, ...args);\n    } else {\n      this.cmds.push(cmd);\n    }\n  }\n\n  transform(transf) {\n    this.currentTransform = Util.transform(this.currentTransform, transf);\n  }\n\n  translate(x, y) {\n    this.transform([1, 0, 0, 1, x, y]);\n  }\n\n  save() {\n    this.transformStack.push(this.currentTransform.slice());\n  }\n\n  restore() {\n    this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0];\n  }\n\n  getPath() {\n    if (\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n      FeatureTest.isFloat16ArraySupported\n    ) {\n      return new Float16Array(this.cmds);\n    }\n    return new Float32Array(this.cmds);\n  }\n}\n\nclass CompiledFont {\n  constructor(fontMatrix) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === CompiledFont\n    ) {\n      unreachable(\"Cannot initialize CompiledFont.\");\n    }\n    this.fontMatrix = fontMatrix;\n\n    this.compiledGlyphs = Object.create(null);\n    this.compiledCharCodeToGlyphId = Object.create(null);\n  }\n\n  static get NOOP() {\n    return shadow(\n      this,\n      \"NOOP\",\n      (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n        FeatureTest.isFloat16ArraySupported\n        ? new Float16Array(0)\n        : new Float32Array(0)\n    );\n  }\n\n  getPathJs(unicode) {\n    const { charCode, glyphId } = lookupCmap(this.cmap, unicode);\n    let fn = this.compiledGlyphs[glyphId],\n      compileEx;\n    if (fn === undefined) {\n      try {\n        fn = this.compileGlyph(this.glyphs[glyphId], glyphId);\n      } catch (ex) {\n        fn = CompiledFont.NOOP; // Avoid attempting to re-compile a corrupt glyph.\n\n        compileEx = ex;\n      }\n      this.compiledGlyphs[glyphId] = fn;\n    }\n    this.compiledCharCodeToGlyphId[charCode] ??= glyphId;\n\n    if (compileEx) {\n      throw compileEx;\n    }\n    return fn;\n  }\n\n  compileGlyph(code, glyphId) {\n    if (!code?.length || code[0] === 14) {\n      return CompiledFont.NOOP;\n    }\n\n    let fontMatrix = this.fontMatrix;\n    if (this.isCFFCIDFont) {\n      // Top DICT's FontMatrix can be ignored because CFFCompiler always\n      // removes it and copies to FDArray DICTs.\n      const fdIndex = this.fdSelect.getFDIndex(glyphId);\n      if (fdIndex >= 0 && fdIndex < this.fdArray.length) {\n        const fontDict = this.fdArray[fdIndex];\n        fontMatrix = fontDict.getByName(\"FontMatrix\") || FONT_IDENTITY_MATRIX;\n      } else {\n        warn(\"Invalid fd index for glyph index.\");\n      }\n    }\n    assert(isNumberArray(fontMatrix, 6), \"Expected a valid fontMatrix.\");\n\n    const cmds = new Commands();\n    cmds.transform(fontMatrix.slice());\n    this.compileGlyphImpl(code, cmds, glyphId);\n    cmds.add(DrawOPS.closePath);\n\n    return cmds.getPath();\n  }\n\n  compileGlyphImpl() {\n    unreachable(\"Children classes should implement this.\");\n  }\n\n  hasBuiltPath(unicode) {\n    const { charCode, glyphId } = lookupCmap(this.cmap, unicode);\n    return (\n      this.compiledGlyphs[glyphId] !== undefined &&\n      this.compiledCharCodeToGlyphId[charCode] !== undefined\n    );\n  }\n}\n\nclass TrueTypeCompiled extends CompiledFont {\n  constructor(glyphs, cmap, fontMatrix) {\n    super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]);\n\n    this.glyphs = glyphs;\n    this.cmap = cmap;\n  }\n\n  compileGlyphImpl(code, cmds) {\n    compileGlyf(code, cmds, this);\n  }\n}\n\nclass Type2Compiled extends CompiledFont {\n  constructor(cffInfo, cmap, fontMatrix) {\n    super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]);\n\n    this.glyphs = cffInfo.glyphs;\n    this.gsubrs = cffInfo.gsubrs || [];\n    this.subrs = cffInfo.subrs || [];\n    this.cmap = cmap;\n    this.glyphNameMap = getGlyphsUnicode();\n\n    this.gsubrsBias = getSubroutineBias(this.gsubrs);\n    this.subrsBias = getSubroutineBias(this.subrs);\n\n    this.isCFFCIDFont = cffInfo.isCFFCIDFont;\n    this.fdSelect = cffInfo.fdSelect;\n    this.fdArray = cffInfo.fdArray;\n  }\n\n  compileGlyphImpl(code, cmds, glyphId) {\n    compileCharString(code, cmds, this, glyphId);\n  }\n}\n\nclass FontRendererFactory {\n  static create(font, seacAnalysisEnabled) {\n    const data = new Uint8Array(font.data),\n      view = new DataView(data.buffer);\n    let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;\n    const numTables = view.getUint16(4);\n    for (let i = 0, p = 12; i < numTables; i++, p += 16) {\n      const tag = bytesToString(data.subarray(p, p + 4));\n      const offset = view.getUint32(p + 8);\n      const length = view.getUint32(p + 12);\n      switch (tag) {\n        case \"cmap\":\n          cmap = parseCmap(data, offset, offset + length);\n          break;\n        case \"glyf\":\n          glyf = data.subarray(offset, offset + length);\n          break;\n        case \"loca\":\n          loca = data.subarray(offset, offset + length);\n          break;\n        case \"head\":\n          unitsPerEm = view.getUint16(offset + 18);\n          indexToLocFormat = view.getUint16(offset + 50);\n          break;\n        case \"CFF \":\n          cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);\n          break;\n      }\n    }\n\n    if (glyf) {\n      const fontMatrix = !unitsPerEm\n        ? font.fontMatrix\n        : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];\n      return new TrueTypeCompiled(\n        parseGlyfTable(glyf, loca, indexToLocFormat),\n        cmap,\n        fontMatrix\n      );\n    }\n    return new Type2Compiled(cff, cmap, font.fontMatrix);\n  }\n}\n\nexport { FontRendererFactory };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getLookupTableFactory } from \"./core_utils.js\";\n\n// The Metrics object contains glyph widths (in glyph space units).\n// As per PDF spec, for most fonts (Type 3 being an exception) a glyph\n// space unit corresponds to 1/1000th of text space unit.\nconst getMetrics = getLookupTableFactory(function (t) {\n  t.Courier = 600;\n  t[\"Courier-Bold\"] = 600;\n  t[\"Courier-BoldOblique\"] = 600;\n  t[\"Courier-Oblique\"] = 600;\n  // eslint-disable-next-line no-shadow\n  t.Helvetica = getLookupTableFactory(function (t) {\n    t.space = 278;\n    t.exclam = 278;\n    t.quotedbl = 355;\n    t.numbersign = 556;\n    t.dollar = 556;\n    t.percent = 889;\n    t.ampersand = 667;\n    t.quoteright = 222;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 389;\n    t.plus = 584;\n    t.comma = 278;\n    t.hyphen = 333;\n    t.period = 278;\n    t.slash = 278;\n    t.zero = 556;\n    t.one = 556;\n    t.two = 556;\n    t.three = 556;\n    t.four = 556;\n    t.five = 556;\n    t.six = 556;\n    t.seven = 556;\n    t.eight = 556;\n    t.nine = 556;\n    t.colon = 278;\n    t.semicolon = 278;\n    t.less = 584;\n    t.equal = 584;\n    t.greater = 584;\n    t.question = 556;\n    t.at = 1015;\n    t.A = 667;\n    t.B = 667;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 722;\n    t.I = 278;\n    t.J = 500;\n    t.K = 667;\n    t.L = 556;\n    t.M = 833;\n    t.N = 722;\n    t.O = 778;\n    t.P = 667;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 667;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 944;\n    t.X = 667;\n    t.Y = 667;\n    t.Z = 611;\n    t.bracketleft = 278;\n    t.backslash = 278;\n    t.bracketright = 278;\n    t.asciicircum = 469;\n    t.underscore = 556;\n    t.quoteleft = 222;\n    t.a = 556;\n    t.b = 556;\n    t.c = 500;\n    t.d = 556;\n    t.e = 556;\n    t.f = 278;\n    t.g = 556;\n    t.h = 556;\n    t.i = 222;\n    t.j = 222;\n    t.k = 500;\n    t.l = 222;\n    t.m = 833;\n    t.n = 556;\n    t.o = 556;\n    t.p = 556;\n    t.q = 556;\n    t.r = 333;\n    t.s = 500;\n    t.t = 278;\n    t.u = 556;\n    t.v = 500;\n    t.w = 722;\n    t.x = 500;\n    t.y = 500;\n    t.z = 500;\n    t.braceleft = 334;\n    t.bar = 260;\n    t.braceright = 334;\n    t.asciitilde = 584;\n    t.exclamdown = 333;\n    t.cent = 556;\n    t.sterling = 556;\n    t.fraction = 167;\n    t.yen = 556;\n    t.florin = 556;\n    t.section = 556;\n    t.currency = 556;\n    t.quotesingle = 191;\n    t.quotedblleft = 333;\n    t.guillemotleft = 556;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 500;\n    t.fl = 500;\n    t.endash = 556;\n    t.dagger = 556;\n    t.daggerdbl = 556;\n    t.periodcentered = 278;\n    t.paragraph = 537;\n    t.bullet = 350;\n    t.quotesinglbase = 222;\n    t.quotedblbase = 333;\n    t.quotedblright = 333;\n    t.guillemotright = 556;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 611;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 370;\n    t.Lslash = 556;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 365;\n    t.ae = 889;\n    t.dotlessi = 278;\n    t.lslash = 222;\n    t.oslash = 611;\n    t.oe = 944;\n    t.germandbls = 611;\n    t.Idieresis = 278;\n    t.eacute = 556;\n    t.abreve = 556;\n    t.uhungarumlaut = 556;\n    t.ecaron = 556;\n    t.Ydieresis = 667;\n    t.divide = 584;\n    t.Yacute = 667;\n    t.Acircumflex = 667;\n    t.aacute = 556;\n    t.Ucircumflex = 722;\n    t.yacute = 500;\n    t.scommaaccent = 500;\n    t.ecircumflex = 556;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 556;\n    t.Uacute = 722;\n    t.uogonek = 556;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 737;\n    t.Emacron = 667;\n    t.ccaron = 500;\n    t.aring = 556;\n    t.Ncommaaccent = 722;\n    t.lacute = 222;\n    t.agrave = 556;\n    t.Tcommaaccent = 611;\n    t.Cacute = 722;\n    t.atilde = 556;\n    t.Edotaccent = 667;\n    t.scaron = 500;\n    t.scedilla = 500;\n    t.iacute = 278;\n    t.lozenge = 471;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 556;\n    t.acircumflex = 556;\n    t.Amacron = 667;\n    t.rcaron = 333;\n    t.ccedilla = 500;\n    t.Zdotaccent = 611;\n    t.Thorn = 667;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 667;\n    t.dcaron = 643;\n    t.Umacron = 722;\n    t.uring = 556;\n    t.threesuperior = 333;\n    t.Ograve = 778;\n    t.Agrave = 667;\n    t.Abreve = 667;\n    t.multiply = 584;\n    t.uacute = 556;\n    t.Tcaron = 611;\n    t.partialdiff = 476;\n    t.ydieresis = 500;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 556;\n    t.edieresis = 556;\n    t.cacute = 500;\n    t.nacute = 556;\n    t.umacron = 556;\n    t.Ncaron = 722;\n    t.Iacute = 278;\n    t.plusminus = 584;\n    t.brokenbar = 260;\n    t.registered = 737;\n    t.Gbreve = 778;\n    t.Idotaccent = 278;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 333;\n    t.omacron = 556;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 222;\n    t.tcaron = 317;\n    t.eogonek = 556;\n    t.Uogonek = 722;\n    t.Aacute = 667;\n    t.Adieresis = 667;\n    t.egrave = 556;\n    t.zacute = 500;\n    t.iogonek = 222;\n    t.Oacute = 778;\n    t.oacute = 556;\n    t.amacron = 556;\n    t.sacute = 500;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 556;\n    t.twosuperior = 333;\n    t.Odieresis = 778;\n    t.mu = 556;\n    t.igrave = 278;\n    t.ohungarumlaut = 556;\n    t.Eogonek = 667;\n    t.dcroat = 556;\n    t.threequarters = 834;\n    t.Scedilla = 667;\n    t.lcaron = 299;\n    t.Kcommaaccent = 667;\n    t.Lacute = 556;\n    t.trademark = 1000;\n    t.edotaccent = 556;\n    t.Igrave = 278;\n    t.Imacron = 278;\n    t.Lcaron = 556;\n    t.onehalf = 834;\n    t.lessequal = 549;\n    t.ocircumflex = 556;\n    t.ntilde = 556;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 556;\n    t.gbreve = 556;\n    t.onequarter = 834;\n    t.Scaron = 667;\n    t.Scommaaccent = 667;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 556;\n    t.Ccaron = 722;\n    t.ugrave = 556;\n    t.radical = 453;\n    t.Dcaron = 722;\n    t.rcommaaccent = 333;\n    t.Ntilde = 722;\n    t.otilde = 556;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 556;\n    t.Atilde = 667;\n    t.Aogonek = 667;\n    t.Aring = 667;\n    t.Otilde = 778;\n    t.zdotaccent = 500;\n    t.Ecaron = 667;\n    t.Iogonek = 278;\n    t.kcommaaccent = 500;\n    t.minus = 584;\n    t.Icircumflex = 278;\n    t.ncaron = 556;\n    t.tcommaaccent = 278;\n    t.logicalnot = 584;\n    t.odieresis = 556;\n    t.udieresis = 556;\n    t.notequal = 549;\n    t.gcommaaccent = 556;\n    t.eth = 556;\n    t.zcaron = 500;\n    t.ncommaaccent = 556;\n    t.onesuperior = 333;\n    t.imacron = 278;\n    t.Euro = 556;\n  });\n  // eslint-disable-next-line no-shadow\n  t[\"Helvetica-Bold\"] = getLookupTableFactory(function (t) {\n    t.space = 278;\n    t.exclam = 333;\n    t.quotedbl = 474;\n    t.numbersign = 556;\n    t.dollar = 556;\n    t.percent = 889;\n    t.ampersand = 722;\n    t.quoteright = 278;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 389;\n    t.plus = 584;\n    t.comma = 278;\n    t.hyphen = 333;\n    t.period = 278;\n    t.slash = 278;\n    t.zero = 556;\n    t.one = 556;\n    t.two = 556;\n    t.three = 556;\n    t.four = 556;\n    t.five = 556;\n    t.six = 556;\n    t.seven = 556;\n    t.eight = 556;\n    t.nine = 556;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 584;\n    t.equal = 584;\n    t.greater = 584;\n    t.question = 611;\n    t.at = 975;\n    t.A = 722;\n    t.B = 722;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 722;\n    t.I = 278;\n    t.J = 556;\n    t.K = 722;\n    t.L = 611;\n    t.M = 833;\n    t.N = 722;\n    t.O = 778;\n    t.P = 667;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 667;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 944;\n    t.X = 667;\n    t.Y = 667;\n    t.Z = 611;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 584;\n    t.underscore = 556;\n    t.quoteleft = 278;\n    t.a = 556;\n    t.b = 611;\n    t.c = 556;\n    t.d = 611;\n    t.e = 556;\n    t.f = 333;\n    t.g = 611;\n    t.h = 611;\n    t.i = 278;\n    t.j = 278;\n    t.k = 556;\n    t.l = 278;\n    t.m = 889;\n    t.n = 611;\n    t.o = 611;\n    t.p = 611;\n    t.q = 611;\n    t.r = 389;\n    t.s = 556;\n    t.t = 333;\n    t.u = 611;\n    t.v = 556;\n    t.w = 778;\n    t.x = 556;\n    t.y = 556;\n    t.z = 500;\n    t.braceleft = 389;\n    t.bar = 280;\n    t.braceright = 389;\n    t.asciitilde = 584;\n    t.exclamdown = 333;\n    t.cent = 556;\n    t.sterling = 556;\n    t.fraction = 167;\n    t.yen = 556;\n    t.florin = 556;\n    t.section = 556;\n    t.currency = 556;\n    t.quotesingle = 238;\n    t.quotedblleft = 500;\n    t.guillemotleft = 556;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 611;\n    t.fl = 611;\n    t.endash = 556;\n    t.dagger = 556;\n    t.daggerdbl = 556;\n    t.periodcentered = 278;\n    t.paragraph = 556;\n    t.bullet = 350;\n    t.quotesinglbase = 278;\n    t.quotedblbase = 500;\n    t.quotedblright = 500;\n    t.guillemotright = 556;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 611;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 370;\n    t.Lslash = 611;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 365;\n    t.ae = 889;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 611;\n    t.oe = 944;\n    t.germandbls = 611;\n    t.Idieresis = 278;\n    t.eacute = 556;\n    t.abreve = 556;\n    t.uhungarumlaut = 611;\n    t.ecaron = 556;\n    t.Ydieresis = 667;\n    t.divide = 584;\n    t.Yacute = 667;\n    t.Acircumflex = 722;\n    t.aacute = 556;\n    t.Ucircumflex = 722;\n    t.yacute = 556;\n    t.scommaaccent = 556;\n    t.ecircumflex = 556;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 556;\n    t.Uacute = 722;\n    t.uogonek = 611;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 737;\n    t.Emacron = 667;\n    t.ccaron = 556;\n    t.aring = 556;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 556;\n    t.Tcommaaccent = 611;\n    t.Cacute = 722;\n    t.atilde = 556;\n    t.Edotaccent = 667;\n    t.scaron = 556;\n    t.scedilla = 556;\n    t.iacute = 278;\n    t.lozenge = 494;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 611;\n    t.acircumflex = 556;\n    t.Amacron = 722;\n    t.rcaron = 389;\n    t.ccedilla = 556;\n    t.Zdotaccent = 611;\n    t.Thorn = 667;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 667;\n    t.dcaron = 743;\n    t.Umacron = 722;\n    t.uring = 611;\n    t.threesuperior = 333;\n    t.Ograve = 778;\n    t.Agrave = 722;\n    t.Abreve = 722;\n    t.multiply = 584;\n    t.uacute = 611;\n    t.Tcaron = 611;\n    t.partialdiff = 494;\n    t.ydieresis = 556;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 556;\n    t.edieresis = 556;\n    t.cacute = 556;\n    t.nacute = 611;\n    t.umacron = 611;\n    t.Ncaron = 722;\n    t.Iacute = 278;\n    t.plusminus = 584;\n    t.brokenbar = 280;\n    t.registered = 737;\n    t.Gbreve = 778;\n    t.Idotaccent = 278;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 389;\n    t.omacron = 611;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 278;\n    t.tcaron = 389;\n    t.eogonek = 556;\n    t.Uogonek = 722;\n    t.Aacute = 722;\n    t.Adieresis = 722;\n    t.egrave = 556;\n    t.zacute = 500;\n    t.iogonek = 278;\n    t.Oacute = 778;\n    t.oacute = 611;\n    t.amacron = 556;\n    t.sacute = 556;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 611;\n    t.twosuperior = 333;\n    t.Odieresis = 778;\n    t.mu = 611;\n    t.igrave = 278;\n    t.ohungarumlaut = 611;\n    t.Eogonek = 667;\n    t.dcroat = 611;\n    t.threequarters = 834;\n    t.Scedilla = 667;\n    t.lcaron = 400;\n    t.Kcommaaccent = 722;\n    t.Lacute = 611;\n    t.trademark = 1000;\n    t.edotaccent = 556;\n    t.Igrave = 278;\n    t.Imacron = 278;\n    t.Lcaron = 611;\n    t.onehalf = 834;\n    t.lessequal = 549;\n    t.ocircumflex = 611;\n    t.ntilde = 611;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 556;\n    t.gbreve = 611;\n    t.onequarter = 834;\n    t.Scaron = 667;\n    t.Scommaaccent = 667;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 611;\n    t.Ccaron = 722;\n    t.ugrave = 611;\n    t.radical = 549;\n    t.Dcaron = 722;\n    t.rcommaaccent = 389;\n    t.Ntilde = 722;\n    t.otilde = 611;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 611;\n    t.Atilde = 722;\n    t.Aogonek = 722;\n    t.Aring = 722;\n    t.Otilde = 778;\n    t.zdotaccent = 500;\n    t.Ecaron = 667;\n    t.Iogonek = 278;\n    t.kcommaaccent = 556;\n    t.minus = 584;\n    t.Icircumflex = 278;\n    t.ncaron = 611;\n    t.tcommaaccent = 333;\n    t.logicalnot = 584;\n    t.odieresis = 611;\n    t.udieresis = 611;\n    t.notequal = 549;\n    t.gcommaaccent = 611;\n    t.eth = 611;\n    t.zcaron = 500;\n    t.ncommaaccent = 611;\n    t.onesuperior = 333;\n    t.imacron = 278;\n    t.Euro = 556;\n  });\n  // eslint-disable-next-line no-shadow\n  t[\"Helvetica-BoldOblique\"] = getLookupTableFactory(function (t) {\n    t.space = 278;\n    t.exclam = 333;\n    t.quotedbl = 474;\n    t.numbersign = 556;\n    t.dollar = 556;\n    t.percent = 889;\n    t.ampersand = 722;\n    t.quoteright = 278;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 389;\n    t.plus = 584;\n    t.comma = 278;\n    t.hyphen = 333;\n    t.period = 278;\n    t.slash = 278;\n    t.zero = 556;\n    t.one = 556;\n    t.two = 556;\n    t.three = 556;\n    t.four = 556;\n    t.five = 556;\n    t.six = 556;\n    t.seven = 556;\n    t.eight = 556;\n    t.nine = 556;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 584;\n    t.equal = 584;\n    t.greater = 584;\n    t.question = 611;\n    t.at = 975;\n    t.A = 722;\n    t.B = 722;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 722;\n    t.I = 278;\n    t.J = 556;\n    t.K = 722;\n    t.L = 611;\n    t.M = 833;\n    t.N = 722;\n    t.O = 778;\n    t.P = 667;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 667;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 944;\n    t.X = 667;\n    t.Y = 667;\n    t.Z = 611;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 584;\n    t.underscore = 556;\n    t.quoteleft = 278;\n    t.a = 556;\n    t.b = 611;\n    t.c = 556;\n    t.d = 611;\n    t.e = 556;\n    t.f = 333;\n    t.g = 611;\n    t.h = 611;\n    t.i = 278;\n    t.j = 278;\n    t.k = 556;\n    t.l = 278;\n    t.m = 889;\n    t.n = 611;\n    t.o = 611;\n    t.p = 611;\n    t.q = 611;\n    t.r = 389;\n    t.s = 556;\n    t.t = 333;\n    t.u = 611;\n    t.v = 556;\n    t.w = 778;\n    t.x = 556;\n    t.y = 556;\n    t.z = 500;\n    t.braceleft = 389;\n    t.bar = 280;\n    t.braceright = 389;\n    t.asciitilde = 584;\n    t.exclamdown = 333;\n    t.cent = 556;\n    t.sterling = 556;\n    t.fraction = 167;\n    t.yen = 556;\n    t.florin = 556;\n    t.section = 556;\n    t.currency = 556;\n    t.quotesingle = 238;\n    t.quotedblleft = 500;\n    t.guillemotleft = 556;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 611;\n    t.fl = 611;\n    t.endash = 556;\n    t.dagger = 556;\n    t.daggerdbl = 556;\n    t.periodcentered = 278;\n    t.paragraph = 556;\n    t.bullet = 350;\n    t.quotesinglbase = 278;\n    t.quotedblbase = 500;\n    t.quotedblright = 500;\n    t.guillemotright = 556;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 611;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 370;\n    t.Lslash = 611;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 365;\n    t.ae = 889;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 611;\n    t.oe = 944;\n    t.germandbls = 611;\n    t.Idieresis = 278;\n    t.eacute = 556;\n    t.abreve = 556;\n    t.uhungarumlaut = 611;\n    t.ecaron = 556;\n    t.Ydieresis = 667;\n    t.divide = 584;\n    t.Yacute = 667;\n    t.Acircumflex = 722;\n    t.aacute = 556;\n    t.Ucircumflex = 722;\n    t.yacute = 556;\n    t.scommaaccent = 556;\n    t.ecircumflex = 556;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 556;\n    t.Uacute = 722;\n    t.uogonek = 611;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 737;\n    t.Emacron = 667;\n    t.ccaron = 556;\n    t.aring = 556;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 556;\n    t.Tcommaaccent = 611;\n    t.Cacute = 722;\n    t.atilde = 556;\n    t.Edotaccent = 667;\n    t.scaron = 556;\n    t.scedilla = 556;\n    t.iacute = 278;\n    t.lozenge = 494;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 611;\n    t.acircumflex = 556;\n    t.Amacron = 722;\n    t.rcaron = 389;\n    t.ccedilla = 556;\n    t.Zdotaccent = 611;\n    t.Thorn = 667;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 667;\n    t.dcaron = 743;\n    t.Umacron = 722;\n    t.uring = 611;\n    t.threesuperior = 333;\n    t.Ograve = 778;\n    t.Agrave = 722;\n    t.Abreve = 722;\n    t.multiply = 584;\n    t.uacute = 611;\n    t.Tcaron = 611;\n    t.partialdiff = 494;\n    t.ydieresis = 556;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 556;\n    t.edieresis = 556;\n    t.cacute = 556;\n    t.nacute = 611;\n    t.umacron = 611;\n    t.Ncaron = 722;\n    t.Iacute = 278;\n    t.plusminus = 584;\n    t.brokenbar = 280;\n    t.registered = 737;\n    t.Gbreve = 778;\n    t.Idotaccent = 278;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 389;\n    t.omacron = 611;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 278;\n    t.tcaron = 389;\n    t.eogonek = 556;\n    t.Uogonek = 722;\n    t.Aacute = 722;\n    t.Adieresis = 722;\n    t.egrave = 556;\n    t.zacute = 500;\n    t.iogonek = 278;\n    t.Oacute = 778;\n    t.oacute = 611;\n    t.amacron = 556;\n    t.sacute = 556;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 611;\n    t.twosuperior = 333;\n    t.Odieresis = 778;\n    t.mu = 611;\n    t.igrave = 278;\n    t.ohungarumlaut = 611;\n    t.Eogonek = 667;\n    t.dcroat = 611;\n    t.threequarters = 834;\n    t.Scedilla = 667;\n    t.lcaron = 400;\n    t.Kcommaaccent = 722;\n    t.Lacute = 611;\n    t.trademark = 1000;\n    t.edotaccent = 556;\n    t.Igrave = 278;\n    t.Imacron = 278;\n    t.Lcaron = 611;\n    t.onehalf = 834;\n    t.lessequal = 549;\n    t.ocircumflex = 611;\n    t.ntilde = 611;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 556;\n    t.gbreve = 611;\n    t.onequarter = 834;\n    t.Scaron = 667;\n    t.Scommaaccent = 667;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 611;\n    t.Ccaron = 722;\n    t.ugrave = 611;\n    t.radical = 549;\n    t.Dcaron = 722;\n    t.rcommaaccent = 389;\n    t.Ntilde = 722;\n    t.otilde = 611;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 611;\n    t.Atilde = 722;\n    t.Aogonek = 722;\n    t.Aring = 722;\n    t.Otilde = 778;\n    t.zdotaccent = 500;\n    t.Ecaron = 667;\n    t.Iogonek = 278;\n    t.kcommaaccent = 556;\n    t.minus = 584;\n    t.Icircumflex = 278;\n    t.ncaron = 611;\n    t.tcommaaccent = 333;\n    t.logicalnot = 584;\n    t.odieresis = 611;\n    t.udieresis = 611;\n    t.notequal = 549;\n    t.gcommaaccent = 611;\n    t.eth = 611;\n    t.zcaron = 500;\n    t.ncommaaccent = 611;\n    t.onesuperior = 333;\n    t.imacron = 278;\n    t.Euro = 556;\n  });\n  // eslint-disable-next-line no-shadow\n  t[\"Helvetica-Oblique\"] = getLookupTableFactory(function (t) {\n    t.space = 278;\n    t.exclam = 278;\n    t.quotedbl = 355;\n    t.numbersign = 556;\n    t.dollar = 556;\n    t.percent = 889;\n    t.ampersand = 667;\n    t.quoteright = 222;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 389;\n    t.plus = 584;\n    t.comma = 278;\n    t.hyphen = 333;\n    t.period = 278;\n    t.slash = 278;\n    t.zero = 556;\n    t.one = 556;\n    t.two = 556;\n    t.three = 556;\n    t.four = 556;\n    t.five = 556;\n    t.six = 556;\n    t.seven = 556;\n    t.eight = 556;\n    t.nine = 556;\n    t.colon = 278;\n    t.semicolon = 278;\n    t.less = 584;\n    t.equal = 584;\n    t.greater = 584;\n    t.question = 556;\n    t.at = 1015;\n    t.A = 667;\n    t.B = 667;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 722;\n    t.I = 278;\n    t.J = 500;\n    t.K = 667;\n    t.L = 556;\n    t.M = 833;\n    t.N = 722;\n    t.O = 778;\n    t.P = 667;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 667;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 944;\n    t.X = 667;\n    t.Y = 667;\n    t.Z = 611;\n    t.bracketleft = 278;\n    t.backslash = 278;\n    t.bracketright = 278;\n    t.asciicircum = 469;\n    t.underscore = 556;\n    t.quoteleft = 222;\n    t.a = 556;\n    t.b = 556;\n    t.c = 500;\n    t.d = 556;\n    t.e = 556;\n    t.f = 278;\n    t.g = 556;\n    t.h = 556;\n    t.i = 222;\n    t.j = 222;\n    t.k = 500;\n    t.l = 222;\n    t.m = 833;\n    t.n = 556;\n    t.o = 556;\n    t.p = 556;\n    t.q = 556;\n    t.r = 333;\n    t.s = 500;\n    t.t = 278;\n    t.u = 556;\n    t.v = 500;\n    t.w = 722;\n    t.x = 500;\n    t.y = 500;\n    t.z = 500;\n    t.braceleft = 334;\n    t.bar = 260;\n    t.braceright = 334;\n    t.asciitilde = 584;\n    t.exclamdown = 333;\n    t.cent = 556;\n    t.sterling = 556;\n    t.fraction = 167;\n    t.yen = 556;\n    t.florin = 556;\n    t.section = 556;\n    t.currency = 556;\n    t.quotesingle = 191;\n    t.quotedblleft = 333;\n    t.guillemotleft = 556;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 500;\n    t.fl = 500;\n    t.endash = 556;\n    t.dagger = 556;\n    t.daggerdbl = 556;\n    t.periodcentered = 278;\n    t.paragraph = 537;\n    t.bullet = 350;\n    t.quotesinglbase = 222;\n    t.quotedblbase = 333;\n    t.quotedblright = 333;\n    t.guillemotright = 556;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 611;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 370;\n    t.Lslash = 556;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 365;\n    t.ae = 889;\n    t.dotlessi = 278;\n    t.lslash = 222;\n    t.oslash = 611;\n    t.oe = 944;\n    t.germandbls = 611;\n    t.Idieresis = 278;\n    t.eacute = 556;\n    t.abreve = 556;\n    t.uhungarumlaut = 556;\n    t.ecaron = 556;\n    t.Ydieresis = 667;\n    t.divide = 584;\n    t.Yacute = 667;\n    t.Acircumflex = 667;\n    t.aacute = 556;\n    t.Ucircumflex = 722;\n    t.yacute = 500;\n    t.scommaaccent = 500;\n    t.ecircumflex = 556;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 556;\n    t.Uacute = 722;\n    t.uogonek = 556;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 737;\n    t.Emacron = 667;\n    t.ccaron = 500;\n    t.aring = 556;\n    t.Ncommaaccent = 722;\n    t.lacute = 222;\n    t.agrave = 556;\n    t.Tcommaaccent = 611;\n    t.Cacute = 722;\n    t.atilde = 556;\n    t.Edotaccent = 667;\n    t.scaron = 500;\n    t.scedilla = 500;\n    t.iacute = 278;\n    t.lozenge = 471;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 556;\n    t.acircumflex = 556;\n    t.Amacron = 667;\n    t.rcaron = 333;\n    t.ccedilla = 500;\n    t.Zdotaccent = 611;\n    t.Thorn = 667;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 667;\n    t.dcaron = 643;\n    t.Umacron = 722;\n    t.uring = 556;\n    t.threesuperior = 333;\n    t.Ograve = 778;\n    t.Agrave = 667;\n    t.Abreve = 667;\n    t.multiply = 584;\n    t.uacute = 556;\n    t.Tcaron = 611;\n    t.partialdiff = 476;\n    t.ydieresis = 500;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 556;\n    t.edieresis = 556;\n    t.cacute = 500;\n    t.nacute = 556;\n    t.umacron = 556;\n    t.Ncaron = 722;\n    t.Iacute = 278;\n    t.plusminus = 584;\n    t.brokenbar = 260;\n    t.registered = 737;\n    t.Gbreve = 778;\n    t.Idotaccent = 278;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 333;\n    t.omacron = 556;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 222;\n    t.tcaron = 317;\n    t.eogonek = 556;\n    t.Uogonek = 722;\n    t.Aacute = 667;\n    t.Adieresis = 667;\n    t.egrave = 556;\n    t.zacute = 500;\n    t.iogonek = 222;\n    t.Oacute = 778;\n    t.oacute = 556;\n    t.amacron = 556;\n    t.sacute = 500;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 556;\n    t.twosuperior = 333;\n    t.Odieresis = 778;\n    t.mu = 556;\n    t.igrave = 278;\n    t.ohungarumlaut = 556;\n    t.Eogonek = 667;\n    t.dcroat = 556;\n    t.threequarters = 834;\n    t.Scedilla = 667;\n    t.lcaron = 299;\n    t.Kcommaaccent = 667;\n    t.Lacute = 556;\n    t.trademark = 1000;\n    t.edotaccent = 556;\n    t.Igrave = 278;\n    t.Imacron = 278;\n    t.Lcaron = 556;\n    t.onehalf = 834;\n    t.lessequal = 549;\n    t.ocircumflex = 556;\n    t.ntilde = 556;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 556;\n    t.gbreve = 556;\n    t.onequarter = 834;\n    t.Scaron = 667;\n    t.Scommaaccent = 667;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 556;\n    t.Ccaron = 722;\n    t.ugrave = 556;\n    t.radical = 453;\n    t.Dcaron = 722;\n    t.rcommaaccent = 333;\n    t.Ntilde = 722;\n    t.otilde = 556;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 556;\n    t.Atilde = 667;\n    t.Aogonek = 667;\n    t.Aring = 667;\n    t.Otilde = 778;\n    t.zdotaccent = 500;\n    t.Ecaron = 667;\n    t.Iogonek = 278;\n    t.kcommaaccent = 500;\n    t.minus = 584;\n    t.Icircumflex = 278;\n    t.ncaron = 556;\n    t.tcommaaccent = 278;\n    t.logicalnot = 584;\n    t.odieresis = 556;\n    t.udieresis = 556;\n    t.notequal = 549;\n    t.gcommaaccent = 556;\n    t.eth = 556;\n    t.zcaron = 500;\n    t.ncommaaccent = 556;\n    t.onesuperior = 333;\n    t.imacron = 278;\n    t.Euro = 556;\n  });\n  // eslint-disable-next-line no-shadow\n  t.Symbol = getLookupTableFactory(function (t) {\n    t.space = 250;\n    t.exclam = 333;\n    t.universal = 713;\n    t.numbersign = 500;\n    t.existential = 549;\n    t.percent = 833;\n    t.ampersand = 778;\n    t.suchthat = 439;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asteriskmath = 500;\n    t.plus = 549;\n    t.comma = 250;\n    t.minus = 549;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 278;\n    t.semicolon = 278;\n    t.less = 549;\n    t.equal = 549;\n    t.greater = 549;\n    t.question = 444;\n    t.congruent = 549;\n    t.Alpha = 722;\n    t.Beta = 667;\n    t.Chi = 722;\n    t.Delta = 612;\n    t.Epsilon = 611;\n    t.Phi = 763;\n    t.Gamma = 603;\n    t.Eta = 722;\n    t.Iota = 333;\n    t.theta1 = 631;\n    t.Kappa = 722;\n    t.Lambda = 686;\n    t.Mu = 889;\n    t.Nu = 722;\n    t.Omicron = 722;\n    t.Pi = 768;\n    t.Theta = 741;\n    t.Rho = 556;\n    t.Sigma = 592;\n    t.Tau = 611;\n    t.Upsilon = 690;\n    t.sigma1 = 439;\n    t.Omega = 768;\n    t.Xi = 645;\n    t.Psi = 795;\n    t.Zeta = 611;\n    t.bracketleft = 333;\n    t.therefore = 863;\n    t.bracketright = 333;\n    t.perpendicular = 658;\n    t.underscore = 500;\n    t.radicalex = 500;\n    t.alpha = 631;\n    t.beta = 549;\n    t.chi = 549;\n    t.delta = 494;\n    t.epsilon = 439;\n    t.phi = 521;\n    t.gamma = 411;\n    t.eta = 603;\n    t.iota = 329;\n    t.phi1 = 603;\n    t.kappa = 549;\n    t.lambda = 549;\n    t.mu = 576;\n    t.nu = 521;\n    t.omicron = 549;\n    t.pi = 549;\n    t.theta = 521;\n    t.rho = 549;\n    t.sigma = 603;\n    t.tau = 439;\n    t.upsilon = 576;\n    t.omega1 = 713;\n    t.omega = 686;\n    t.xi = 493;\n    t.psi = 686;\n    t.zeta = 494;\n    t.braceleft = 480;\n    t.bar = 200;\n    t.braceright = 480;\n    t.similar = 549;\n    t.Euro = 750;\n    t.Upsilon1 = 620;\n    t.minute = 247;\n    t.lessequal = 549;\n    t.fraction = 167;\n    t.infinity = 713;\n    t.florin = 500;\n    t.club = 753;\n    t.diamond = 753;\n    t.heart = 753;\n    t.spade = 753;\n    t.arrowboth = 1042;\n    t.arrowleft = 987;\n    t.arrowup = 603;\n    t.arrowright = 987;\n    t.arrowdown = 603;\n    t.degree = 400;\n    t.plusminus = 549;\n    t.second = 411;\n    t.greaterequal = 549;\n    t.multiply = 549;\n    t.proportional = 713;\n    t.partialdiff = 494;\n    t.bullet = 460;\n    t.divide = 549;\n    t.notequal = 549;\n    t.equivalence = 549;\n    t.approxequal = 549;\n    t.ellipsis = 1000;\n    t.arrowvertex = 603;\n    t.arrowhorizex = 1000;\n    t.carriagereturn = 658;\n    t.aleph = 823;\n    t.Ifraktur = 686;\n    t.Rfraktur = 795;\n    t.weierstrass = 987;\n    t.circlemultiply = 768;\n    t.circleplus = 768;\n    t.emptyset = 823;\n    t.intersection = 768;\n    t.union = 768;\n    t.propersuperset = 713;\n    t.reflexsuperset = 713;\n    t.notsubset = 713;\n    t.propersubset = 713;\n    t.reflexsubset = 713;\n    t.element = 713;\n    t.notelement = 713;\n    t.angle = 768;\n    t.gradient = 713;\n    t.registerserif = 790;\n    t.copyrightserif = 790;\n    t.trademarkserif = 890;\n    t.product = 823;\n    t.radical = 549;\n    t.dotmath = 250;\n    t.logicalnot = 713;\n    t.logicaland = 603;\n    t.logicalor = 603;\n    t.arrowdblboth = 1042;\n    t.arrowdblleft = 987;\n    t.arrowdblup = 603;\n    t.arrowdblright = 987;\n    t.arrowdbldown = 603;\n    t.lozenge = 494;\n    t.angleleft = 329;\n    t.registersans = 790;\n    t.copyrightsans = 790;\n    t.trademarksans = 786;\n    t.summation = 713;\n    t.parenlefttp = 384;\n    t.parenleftex = 384;\n    t.parenleftbt = 384;\n    t.bracketlefttp = 384;\n    t.bracketleftex = 384;\n    t.bracketleftbt = 384;\n    t.bracelefttp = 494;\n    t.braceleftmid = 494;\n    t.braceleftbt = 494;\n    t.braceex = 494;\n    t.angleright = 329;\n    t.integral = 274;\n    t.integraltp = 686;\n    t.integralex = 686;\n    t.integralbt = 686;\n    t.parenrighttp = 384;\n    t.parenrightex = 384;\n    t.parenrightbt = 384;\n    t.bracketrighttp = 384;\n    t.bracketrightex = 384;\n    t.bracketrightbt = 384;\n    t.bracerighttp = 494;\n    t.bracerightmid = 494;\n    t.bracerightbt = 494;\n    t.apple = 790;\n  });\n  // eslint-disable-next-line no-shadow\n  t[\"Times-Roman\"] = getLookupTableFactory(function (t) {\n    t.space = 250;\n    t.exclam = 333;\n    t.quotedbl = 408;\n    t.numbersign = 500;\n    t.dollar = 500;\n    t.percent = 833;\n    t.ampersand = 778;\n    t.quoteright = 333;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 500;\n    t.plus = 564;\n    t.comma = 250;\n    t.hyphen = 333;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 278;\n    t.semicolon = 278;\n    t.less = 564;\n    t.equal = 564;\n    t.greater = 564;\n    t.question = 444;\n    t.at = 921;\n    t.A = 722;\n    t.B = 667;\n    t.C = 667;\n    t.D = 722;\n    t.E = 611;\n    t.F = 556;\n    t.G = 722;\n    t.H = 722;\n    t.I = 333;\n    t.J = 389;\n    t.K = 722;\n    t.L = 611;\n    t.M = 889;\n    t.N = 722;\n    t.O = 722;\n    t.P = 556;\n    t.Q = 722;\n    t.R = 667;\n    t.S = 556;\n    t.T = 611;\n    t.U = 722;\n    t.V = 722;\n    t.W = 944;\n    t.X = 722;\n    t.Y = 722;\n    t.Z = 611;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 469;\n    t.underscore = 500;\n    t.quoteleft = 333;\n    t.a = 444;\n    t.b = 500;\n    t.c = 444;\n    t.d = 500;\n    t.e = 444;\n    t.f = 333;\n    t.g = 500;\n    t.h = 500;\n    t.i = 278;\n    t.j = 278;\n    t.k = 500;\n    t.l = 278;\n    t.m = 778;\n    t.n = 500;\n    t.o = 500;\n    t.p = 500;\n    t.q = 500;\n    t.r = 333;\n    t.s = 389;\n    t.t = 278;\n    t.u = 500;\n    t.v = 500;\n    t.w = 722;\n    t.x = 500;\n    t.y = 500;\n    t.z = 444;\n    t.braceleft = 480;\n    t.bar = 200;\n    t.braceright = 480;\n    t.asciitilde = 541;\n    t.exclamdown = 333;\n    t.cent = 500;\n    t.sterling = 500;\n    t.fraction = 167;\n    t.yen = 500;\n    t.florin = 500;\n    t.section = 500;\n    t.currency = 500;\n    t.quotesingle = 180;\n    t.quotedblleft = 444;\n    t.guillemotleft = 500;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 556;\n    t.fl = 556;\n    t.endash = 500;\n    t.dagger = 500;\n    t.daggerdbl = 500;\n    t.periodcentered = 250;\n    t.paragraph = 453;\n    t.bullet = 350;\n    t.quotesinglbase = 333;\n    t.quotedblbase = 444;\n    t.quotedblright = 444;\n    t.guillemotright = 500;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 444;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 889;\n    t.ordfeminine = 276;\n    t.Lslash = 611;\n    t.Oslash = 722;\n    t.OE = 889;\n    t.ordmasculine = 310;\n    t.ae = 667;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 500;\n    t.oe = 722;\n    t.germandbls = 500;\n    t.Idieresis = 333;\n    t.eacute = 444;\n    t.abreve = 444;\n    t.uhungarumlaut = 500;\n    t.ecaron = 444;\n    t.Ydieresis = 722;\n    t.divide = 564;\n    t.Yacute = 722;\n    t.Acircumflex = 722;\n    t.aacute = 444;\n    t.Ucircumflex = 722;\n    t.yacute = 500;\n    t.scommaaccent = 389;\n    t.ecircumflex = 444;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 444;\n    t.Uacute = 722;\n    t.uogonek = 500;\n    t.Edieresis = 611;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 760;\n    t.Emacron = 611;\n    t.ccaron = 444;\n    t.aring = 444;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 444;\n    t.Tcommaaccent = 611;\n    t.Cacute = 667;\n    t.atilde = 444;\n    t.Edotaccent = 611;\n    t.scaron = 389;\n    t.scedilla = 389;\n    t.iacute = 278;\n    t.lozenge = 471;\n    t.Rcaron = 667;\n    t.Gcommaaccent = 722;\n    t.ucircumflex = 500;\n    t.acircumflex = 444;\n    t.Amacron = 722;\n    t.rcaron = 333;\n    t.ccedilla = 444;\n    t.Zdotaccent = 611;\n    t.Thorn = 556;\n    t.Omacron = 722;\n    t.Racute = 667;\n    t.Sacute = 556;\n    t.dcaron = 588;\n    t.Umacron = 722;\n    t.uring = 500;\n    t.threesuperior = 300;\n    t.Ograve = 722;\n    t.Agrave = 722;\n    t.Abreve = 722;\n    t.multiply = 564;\n    t.uacute = 500;\n    t.Tcaron = 611;\n    t.partialdiff = 476;\n    t.ydieresis = 500;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 611;\n    t.adieresis = 444;\n    t.edieresis = 444;\n    t.cacute = 444;\n    t.nacute = 500;\n    t.umacron = 500;\n    t.Ncaron = 722;\n    t.Iacute = 333;\n    t.plusminus = 564;\n    t.brokenbar = 200;\n    t.registered = 760;\n    t.Gbreve = 722;\n    t.Idotaccent = 333;\n    t.summation = 600;\n    t.Egrave = 611;\n    t.racute = 333;\n    t.omacron = 500;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 667;\n    t.lcommaaccent = 278;\n    t.tcaron = 326;\n    t.eogonek = 444;\n    t.Uogonek = 722;\n    t.Aacute = 722;\n    t.Adieresis = 722;\n    t.egrave = 444;\n    t.zacute = 444;\n    t.iogonek = 278;\n    t.Oacute = 722;\n    t.oacute = 500;\n    t.amacron = 444;\n    t.sacute = 389;\n    t.idieresis = 278;\n    t.Ocircumflex = 722;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 500;\n    t.twosuperior = 300;\n    t.Odieresis = 722;\n    t.mu = 500;\n    t.igrave = 278;\n    t.ohungarumlaut = 500;\n    t.Eogonek = 611;\n    t.dcroat = 500;\n    t.threequarters = 750;\n    t.Scedilla = 556;\n    t.lcaron = 344;\n    t.Kcommaaccent = 722;\n    t.Lacute = 611;\n    t.trademark = 980;\n    t.edotaccent = 444;\n    t.Igrave = 333;\n    t.Imacron = 333;\n    t.Lcaron = 611;\n    t.onehalf = 750;\n    t.lessequal = 549;\n    t.ocircumflex = 500;\n    t.ntilde = 500;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 611;\n    t.emacron = 444;\n    t.gbreve = 500;\n    t.onequarter = 750;\n    t.Scaron = 556;\n    t.Scommaaccent = 556;\n    t.Ohungarumlaut = 722;\n    t.degree = 400;\n    t.ograve = 500;\n    t.Ccaron = 667;\n    t.ugrave = 500;\n    t.radical = 453;\n    t.Dcaron = 722;\n    t.rcommaaccent = 333;\n    t.Ntilde = 722;\n    t.otilde = 500;\n    t.Rcommaaccent = 667;\n    t.Lcommaaccent = 611;\n    t.Atilde = 722;\n    t.Aogonek = 722;\n    t.Aring = 722;\n    t.Otilde = 722;\n    t.zdotaccent = 444;\n    t.Ecaron = 611;\n    t.Iogonek = 333;\n    t.kcommaaccent = 500;\n    t.minus = 564;\n    t.Icircumflex = 333;\n    t.ncaron = 500;\n    t.tcommaaccent = 278;\n    t.logicalnot = 564;\n    t.odieresis = 500;\n    t.udieresis = 500;\n    t.notequal = 549;\n    t.gcommaaccent = 500;\n    t.eth = 500;\n    t.zcaron = 444;\n    t.ncommaaccent = 500;\n    t.onesuperior = 300;\n    t.imacron = 278;\n    t.Euro = 500;\n  });\n  // eslint-disable-next-line no-shadow\n  t[\"Times-Bold\"] = getLookupTableFactory(function (t) {\n    t.space = 250;\n    t.exclam = 333;\n    t.quotedbl = 555;\n    t.numbersign = 500;\n    t.dollar = 500;\n    t.percent = 1000;\n    t.ampersand = 833;\n    t.quoteright = 333;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 500;\n    t.plus = 570;\n    t.comma = 250;\n    t.hyphen = 333;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 570;\n    t.equal = 570;\n    t.greater = 570;\n    t.question = 500;\n    t.at = 930;\n    t.A = 722;\n    t.B = 667;\n    t.C = 722;\n    t.D = 722;\n    t.E = 667;\n    t.F = 611;\n    t.G = 778;\n    t.H = 778;\n    t.I = 389;\n    t.J = 500;\n    t.K = 778;\n    t.L = 667;\n    t.M = 944;\n    t.N = 722;\n    t.O = 778;\n    t.P = 611;\n    t.Q = 778;\n    t.R = 722;\n    t.S = 556;\n    t.T = 667;\n    t.U = 722;\n    t.V = 722;\n    t.W = 1000;\n    t.X = 722;\n    t.Y = 722;\n    t.Z = 667;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 581;\n    t.underscore = 500;\n    t.quoteleft = 333;\n    t.a = 500;\n    t.b = 556;\n    t.c = 444;\n    t.d = 556;\n    t.e = 444;\n    t.f = 333;\n    t.g = 500;\n    t.h = 556;\n    t.i = 278;\n    t.j = 333;\n    t.k = 556;\n    t.l = 278;\n    t.m = 833;\n    t.n = 556;\n    t.o = 500;\n    t.p = 556;\n    t.q = 556;\n    t.r = 444;\n    t.s = 389;\n    t.t = 333;\n    t.u = 556;\n    t.v = 500;\n    t.w = 722;\n    t.x = 500;\n    t.y = 500;\n    t.z = 444;\n    t.braceleft = 394;\n    t.bar = 220;\n    t.braceright = 394;\n    t.asciitilde = 520;\n    t.exclamdown = 333;\n    t.cent = 500;\n    t.sterling = 500;\n    t.fraction = 167;\n    t.yen = 500;\n    t.florin = 500;\n    t.section = 500;\n    t.currency = 500;\n    t.quotesingle = 278;\n    t.quotedblleft = 500;\n    t.guillemotleft = 500;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 556;\n    t.fl = 556;\n    t.endash = 500;\n    t.dagger = 500;\n    t.daggerdbl = 500;\n    t.periodcentered = 250;\n    t.paragraph = 540;\n    t.bullet = 350;\n    t.quotesinglbase = 333;\n    t.quotedblbase = 500;\n    t.quotedblright = 500;\n    t.guillemotright = 500;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 500;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 1000;\n    t.ordfeminine = 300;\n    t.Lslash = 667;\n    t.Oslash = 778;\n    t.OE = 1000;\n    t.ordmasculine = 330;\n    t.ae = 722;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 500;\n    t.oe = 722;\n    t.germandbls = 556;\n    t.Idieresis = 389;\n    t.eacute = 444;\n    t.abreve = 500;\n    t.uhungarumlaut = 556;\n    t.ecaron = 444;\n    t.Ydieresis = 722;\n    t.divide = 570;\n    t.Yacute = 722;\n    t.Acircumflex = 722;\n    t.aacute = 500;\n    t.Ucircumflex = 722;\n    t.yacute = 500;\n    t.scommaaccent = 389;\n    t.ecircumflex = 444;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 500;\n    t.Uacute = 722;\n    t.uogonek = 556;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 747;\n    t.Emacron = 667;\n    t.ccaron = 444;\n    t.aring = 500;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 500;\n    t.Tcommaaccent = 667;\n    t.Cacute = 722;\n    t.atilde = 500;\n    t.Edotaccent = 667;\n    t.scaron = 389;\n    t.scedilla = 389;\n    t.iacute = 278;\n    t.lozenge = 494;\n    t.Rcaron = 722;\n    t.Gcommaaccent = 778;\n    t.ucircumflex = 556;\n    t.acircumflex = 500;\n    t.Amacron = 722;\n    t.rcaron = 444;\n    t.ccedilla = 444;\n    t.Zdotaccent = 667;\n    t.Thorn = 611;\n    t.Omacron = 778;\n    t.Racute = 722;\n    t.Sacute = 556;\n    t.dcaron = 672;\n    t.Umacron = 722;\n    t.uring = 556;\n    t.threesuperior = 300;\n    t.Ograve = 778;\n    t.Agrave = 722;\n    t.Abreve = 722;\n    t.multiply = 570;\n    t.uacute = 556;\n    t.Tcaron = 667;\n    t.partialdiff = 494;\n    t.ydieresis = 500;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 500;\n    t.edieresis = 444;\n    t.cacute = 444;\n    t.nacute = 556;\n    t.umacron = 556;\n    t.Ncaron = 722;\n    t.Iacute = 389;\n    t.plusminus = 570;\n    t.brokenbar = 220;\n    t.registered = 747;\n    t.Gbreve = 778;\n    t.Idotaccent = 389;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 444;\n    t.omacron = 500;\n    t.Zacute = 667;\n    t.Zcaron = 667;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 722;\n    t.lcommaaccent = 278;\n    t.tcaron = 416;\n    t.eogonek = 444;\n    t.Uogonek = 722;\n    t.Aacute = 722;\n    t.Adieresis = 722;\n    t.egrave = 444;\n    t.zacute = 444;\n    t.iogonek = 278;\n    t.Oacute = 778;\n    t.oacute = 500;\n    t.amacron = 500;\n    t.sacute = 389;\n    t.idieresis = 278;\n    t.Ocircumflex = 778;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 556;\n    t.twosuperior = 300;\n    t.Odieresis = 778;\n    t.mu = 556;\n    t.igrave = 278;\n    t.ohungarumlaut = 500;\n    t.Eogonek = 667;\n    t.dcroat = 556;\n    t.threequarters = 750;\n    t.Scedilla = 556;\n    t.lcaron = 394;\n    t.Kcommaaccent = 778;\n    t.Lacute = 667;\n    t.trademark = 1000;\n    t.edotaccent = 444;\n    t.Igrave = 389;\n    t.Imacron = 389;\n    t.Lcaron = 667;\n    t.onehalf = 750;\n    t.lessequal = 549;\n    t.ocircumflex = 500;\n    t.ntilde = 556;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 444;\n    t.gbreve = 500;\n    t.onequarter = 750;\n    t.Scaron = 556;\n    t.Scommaaccent = 556;\n    t.Ohungarumlaut = 778;\n    t.degree = 400;\n    t.ograve = 500;\n    t.Ccaron = 722;\n    t.ugrave = 556;\n    t.radical = 549;\n    t.Dcaron = 722;\n    t.rcommaaccent = 444;\n    t.Ntilde = 722;\n    t.otilde = 500;\n    t.Rcommaaccent = 722;\n    t.Lcommaaccent = 667;\n    t.Atilde = 722;\n    t.Aogonek = 722;\n    t.Aring = 722;\n    t.Otilde = 778;\n    t.zdotaccent = 444;\n    t.Ecaron = 667;\n    t.Iogonek = 389;\n    t.kcommaaccent = 556;\n    t.minus = 570;\n    t.Icircumflex = 389;\n    t.ncaron = 556;\n    t.tcommaaccent = 333;\n    t.logicalnot = 570;\n    t.odieresis = 500;\n    t.udieresis = 556;\n    t.notequal = 549;\n    t.gcommaaccent = 500;\n    t.eth = 500;\n    t.zcaron = 444;\n    t.ncommaaccent = 556;\n    t.onesuperior = 300;\n    t.imacron = 278;\n    t.Euro = 500;\n  });\n  // eslint-disable-next-line no-shadow\n  t[\"Times-BoldItalic\"] = getLookupTableFactory(function (t) {\n    t.space = 250;\n    t.exclam = 389;\n    t.quotedbl = 555;\n    t.numbersign = 500;\n    t.dollar = 500;\n    t.percent = 833;\n    t.ampersand = 778;\n    t.quoteright = 333;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 500;\n    t.plus = 570;\n    t.comma = 250;\n    t.hyphen = 333;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 570;\n    t.equal = 570;\n    t.greater = 570;\n    t.question = 500;\n    t.at = 832;\n    t.A = 667;\n    t.B = 667;\n    t.C = 667;\n    t.D = 722;\n    t.E = 667;\n    t.F = 667;\n    t.G = 722;\n    t.H = 778;\n    t.I = 389;\n    t.J = 500;\n    t.K = 667;\n    t.L = 611;\n    t.M = 889;\n    t.N = 722;\n    t.O = 722;\n    t.P = 611;\n    t.Q = 722;\n    t.R = 667;\n    t.S = 556;\n    t.T = 611;\n    t.U = 722;\n    t.V = 667;\n    t.W = 889;\n    t.X = 667;\n    t.Y = 611;\n    t.Z = 611;\n    t.bracketleft = 333;\n    t.backslash = 278;\n    t.bracketright = 333;\n    t.asciicircum = 570;\n    t.underscore = 500;\n    t.quoteleft = 333;\n    t.a = 500;\n    t.b = 500;\n    t.c = 444;\n    t.d = 500;\n    t.e = 444;\n    t.f = 333;\n    t.g = 500;\n    t.h = 556;\n    t.i = 278;\n    t.j = 278;\n    t.k = 500;\n    t.l = 278;\n    t.m = 778;\n    t.n = 556;\n    t.o = 500;\n    t.p = 500;\n    t.q = 500;\n    t.r = 389;\n    t.s = 389;\n    t.t = 278;\n    t.u = 556;\n    t.v = 444;\n    t.w = 667;\n    t.x = 500;\n    t.y = 444;\n    t.z = 389;\n    t.braceleft = 348;\n    t.bar = 220;\n    t.braceright = 348;\n    t.asciitilde = 570;\n    t.exclamdown = 389;\n    t.cent = 500;\n    t.sterling = 500;\n    t.fraction = 167;\n    t.yen = 500;\n    t.florin = 500;\n    t.section = 500;\n    t.currency = 500;\n    t.quotesingle = 278;\n    t.quotedblleft = 500;\n    t.guillemotleft = 500;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 556;\n    t.fl = 556;\n    t.endash = 500;\n    t.dagger = 500;\n    t.daggerdbl = 500;\n    t.periodcentered = 250;\n    t.paragraph = 500;\n    t.bullet = 350;\n    t.quotesinglbase = 333;\n    t.quotedblbase = 500;\n    t.quotedblright = 500;\n    t.guillemotright = 500;\n    t.ellipsis = 1000;\n    t.perthousand = 1000;\n    t.questiondown = 500;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 1000;\n    t.AE = 944;\n    t.ordfeminine = 266;\n    t.Lslash = 611;\n    t.Oslash = 722;\n    t.OE = 944;\n    t.ordmasculine = 300;\n    t.ae = 722;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 500;\n    t.oe = 722;\n    t.germandbls = 500;\n    t.Idieresis = 389;\n    t.eacute = 444;\n    t.abreve = 500;\n    t.uhungarumlaut = 556;\n    t.ecaron = 444;\n    t.Ydieresis = 611;\n    t.divide = 570;\n    t.Yacute = 611;\n    t.Acircumflex = 667;\n    t.aacute = 500;\n    t.Ucircumflex = 722;\n    t.yacute = 444;\n    t.scommaaccent = 389;\n    t.ecircumflex = 444;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 500;\n    t.Uacute = 722;\n    t.uogonek = 556;\n    t.Edieresis = 667;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 747;\n    t.Emacron = 667;\n    t.ccaron = 444;\n    t.aring = 500;\n    t.Ncommaaccent = 722;\n    t.lacute = 278;\n    t.agrave = 500;\n    t.Tcommaaccent = 611;\n    t.Cacute = 667;\n    t.atilde = 500;\n    t.Edotaccent = 667;\n    t.scaron = 389;\n    t.scedilla = 389;\n    t.iacute = 278;\n    t.lozenge = 494;\n    t.Rcaron = 667;\n    t.Gcommaaccent = 722;\n    t.ucircumflex = 556;\n    t.acircumflex = 500;\n    t.Amacron = 667;\n    t.rcaron = 389;\n    t.ccedilla = 444;\n    t.Zdotaccent = 611;\n    t.Thorn = 611;\n    t.Omacron = 722;\n    t.Racute = 667;\n    t.Sacute = 556;\n    t.dcaron = 608;\n    t.Umacron = 722;\n    t.uring = 556;\n    t.threesuperior = 300;\n    t.Ograve = 722;\n    t.Agrave = 667;\n    t.Abreve = 667;\n    t.multiply = 570;\n    t.uacute = 556;\n    t.Tcaron = 611;\n    t.partialdiff = 494;\n    t.ydieresis = 444;\n    t.Nacute = 722;\n    t.icircumflex = 278;\n    t.Ecircumflex = 667;\n    t.adieresis = 500;\n    t.edieresis = 444;\n    t.cacute = 444;\n    t.nacute = 556;\n    t.umacron = 556;\n    t.Ncaron = 722;\n    t.Iacute = 389;\n    t.plusminus = 570;\n    t.brokenbar = 220;\n    t.registered = 747;\n    t.Gbreve = 722;\n    t.Idotaccent = 389;\n    t.summation = 600;\n    t.Egrave = 667;\n    t.racute = 389;\n    t.omacron = 500;\n    t.Zacute = 611;\n    t.Zcaron = 611;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 667;\n    t.lcommaaccent = 278;\n    t.tcaron = 366;\n    t.eogonek = 444;\n    t.Uogonek = 722;\n    t.Aacute = 667;\n    t.Adieresis = 667;\n    t.egrave = 444;\n    t.zacute = 389;\n    t.iogonek = 278;\n    t.Oacute = 722;\n    t.oacute = 500;\n    t.amacron = 500;\n    t.sacute = 389;\n    t.idieresis = 278;\n    t.Ocircumflex = 722;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 500;\n    t.twosuperior = 300;\n    t.Odieresis = 722;\n    t.mu = 576;\n    t.igrave = 278;\n    t.ohungarumlaut = 500;\n    t.Eogonek = 667;\n    t.dcroat = 500;\n    t.threequarters = 750;\n    t.Scedilla = 556;\n    t.lcaron = 382;\n    t.Kcommaaccent = 667;\n    t.Lacute = 611;\n    t.trademark = 1000;\n    t.edotaccent = 444;\n    t.Igrave = 389;\n    t.Imacron = 389;\n    t.Lcaron = 611;\n    t.onehalf = 750;\n    t.lessequal = 549;\n    t.ocircumflex = 500;\n    t.ntilde = 556;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 667;\n    t.emacron = 444;\n    t.gbreve = 500;\n    t.onequarter = 750;\n    t.Scaron = 556;\n    t.Scommaaccent = 556;\n    t.Ohungarumlaut = 722;\n    t.degree = 400;\n    t.ograve = 500;\n    t.Ccaron = 667;\n    t.ugrave = 556;\n    t.radical = 549;\n    t.Dcaron = 722;\n    t.rcommaaccent = 389;\n    t.Ntilde = 722;\n    t.otilde = 500;\n    t.Rcommaaccent = 667;\n    t.Lcommaaccent = 611;\n    t.Atilde = 667;\n    t.Aogonek = 667;\n    t.Aring = 667;\n    t.Otilde = 722;\n    t.zdotaccent = 389;\n    t.Ecaron = 667;\n    t.Iogonek = 389;\n    t.kcommaaccent = 500;\n    t.minus = 606;\n    t.Icircumflex = 389;\n    t.ncaron = 556;\n    t.tcommaaccent = 278;\n    t.logicalnot = 606;\n    t.odieresis = 500;\n    t.udieresis = 556;\n    t.notequal = 549;\n    t.gcommaaccent = 500;\n    t.eth = 500;\n    t.zcaron = 389;\n    t.ncommaaccent = 556;\n    t.onesuperior = 300;\n    t.imacron = 278;\n    t.Euro = 500;\n  });\n  // eslint-disable-next-line no-shadow\n  t[\"Times-Italic\"] = getLookupTableFactory(function (t) {\n    t.space = 250;\n    t.exclam = 333;\n    t.quotedbl = 420;\n    t.numbersign = 500;\n    t.dollar = 500;\n    t.percent = 833;\n    t.ampersand = 778;\n    t.quoteright = 333;\n    t.parenleft = 333;\n    t.parenright = 333;\n    t.asterisk = 500;\n    t.plus = 675;\n    t.comma = 250;\n    t.hyphen = 333;\n    t.period = 250;\n    t.slash = 278;\n    t.zero = 500;\n    t.one = 500;\n    t.two = 500;\n    t.three = 500;\n    t.four = 500;\n    t.five = 500;\n    t.six = 500;\n    t.seven = 500;\n    t.eight = 500;\n    t.nine = 500;\n    t.colon = 333;\n    t.semicolon = 333;\n    t.less = 675;\n    t.equal = 675;\n    t.greater = 675;\n    t.question = 500;\n    t.at = 920;\n    t.A = 611;\n    t.B = 611;\n    t.C = 667;\n    t.D = 722;\n    t.E = 611;\n    t.F = 611;\n    t.G = 722;\n    t.H = 722;\n    t.I = 333;\n    t.J = 444;\n    t.K = 667;\n    t.L = 556;\n    t.M = 833;\n    t.N = 667;\n    t.O = 722;\n    t.P = 611;\n    t.Q = 722;\n    t.R = 611;\n    t.S = 500;\n    t.T = 556;\n    t.U = 722;\n    t.V = 611;\n    t.W = 833;\n    t.X = 611;\n    t.Y = 556;\n    t.Z = 556;\n    t.bracketleft = 389;\n    t.backslash = 278;\n    t.bracketright = 389;\n    t.asciicircum = 422;\n    t.underscore = 500;\n    t.quoteleft = 333;\n    t.a = 500;\n    t.b = 500;\n    t.c = 444;\n    t.d = 500;\n    t.e = 444;\n    t.f = 278;\n    t.g = 500;\n    t.h = 500;\n    t.i = 278;\n    t.j = 278;\n    t.k = 444;\n    t.l = 278;\n    t.m = 722;\n    t.n = 500;\n    t.o = 500;\n    t.p = 500;\n    t.q = 500;\n    t.r = 389;\n    t.s = 389;\n    t.t = 278;\n    t.u = 500;\n    t.v = 444;\n    t.w = 667;\n    t.x = 444;\n    t.y = 444;\n    t.z = 389;\n    t.braceleft = 400;\n    t.bar = 275;\n    t.braceright = 400;\n    t.asciitilde = 541;\n    t.exclamdown = 389;\n    t.cent = 500;\n    t.sterling = 500;\n    t.fraction = 167;\n    t.yen = 500;\n    t.florin = 500;\n    t.section = 500;\n    t.currency = 500;\n    t.quotesingle = 214;\n    t.quotedblleft = 556;\n    t.guillemotleft = 500;\n    t.guilsinglleft = 333;\n    t.guilsinglright = 333;\n    t.fi = 500;\n    t.fl = 500;\n    t.endash = 500;\n    t.dagger = 500;\n    t.daggerdbl = 500;\n    t.periodcentered = 250;\n    t.paragraph = 523;\n    t.bullet = 350;\n    t.quotesinglbase = 333;\n    t.quotedblbase = 556;\n    t.quotedblright = 556;\n    t.guillemotright = 500;\n    t.ellipsis = 889;\n    t.perthousand = 1000;\n    t.questiondown = 500;\n    t.grave = 333;\n    t.acute = 333;\n    t.circumflex = 333;\n    t.tilde = 333;\n    t.macron = 333;\n    t.breve = 333;\n    t.dotaccent = 333;\n    t.dieresis = 333;\n    t.ring = 333;\n    t.cedilla = 333;\n    t.hungarumlaut = 333;\n    t.ogonek = 333;\n    t.caron = 333;\n    t.emdash = 889;\n    t.AE = 889;\n    t.ordfeminine = 276;\n    t.Lslash = 556;\n    t.Oslash = 722;\n    t.OE = 944;\n    t.ordmasculine = 310;\n    t.ae = 667;\n    t.dotlessi = 278;\n    t.lslash = 278;\n    t.oslash = 500;\n    t.oe = 667;\n    t.germandbls = 500;\n    t.Idieresis = 333;\n    t.eacute = 444;\n    t.abreve = 500;\n    t.uhungarumlaut = 500;\n    t.ecaron = 444;\n    t.Ydieresis = 556;\n    t.divide = 675;\n    t.Yacute = 556;\n    t.Acircumflex = 611;\n    t.aacute = 500;\n    t.Ucircumflex = 722;\n    t.yacute = 444;\n    t.scommaaccent = 389;\n    t.ecircumflex = 444;\n    t.Uring = 722;\n    t.Udieresis = 722;\n    t.aogonek = 500;\n    t.Uacute = 722;\n    t.uogonek = 500;\n    t.Edieresis = 611;\n    t.Dcroat = 722;\n    t.commaaccent = 250;\n    t.copyright = 760;\n    t.Emacron = 611;\n    t.ccaron = 444;\n    t.aring = 500;\n    t.Ncommaaccent = 667;\n    t.lacute = 278;\n    t.agrave = 500;\n    t.Tcommaaccent = 556;\n    t.Cacute = 667;\n    t.atilde = 500;\n    t.Edotaccent = 611;\n    t.scaron = 389;\n    t.scedilla = 389;\n    t.iacute = 278;\n    t.lozenge = 471;\n    t.Rcaron = 611;\n    t.Gcommaaccent = 722;\n    t.ucircumflex = 500;\n    t.acircumflex = 500;\n    t.Amacron = 611;\n    t.rcaron = 389;\n    t.ccedilla = 444;\n    t.Zdotaccent = 556;\n    t.Thorn = 611;\n    t.Omacron = 722;\n    t.Racute = 611;\n    t.Sacute = 500;\n    t.dcaron = 544;\n    t.Umacron = 722;\n    t.uring = 500;\n    t.threesuperior = 300;\n    t.Ograve = 722;\n    t.Agrave = 611;\n    t.Abreve = 611;\n    t.multiply = 675;\n    t.uacute = 500;\n    t.Tcaron = 556;\n    t.partialdiff = 476;\n    t.ydieresis = 444;\n    t.Nacute = 667;\n    t.icircumflex = 278;\n    t.Ecircumflex = 611;\n    t.adieresis = 500;\n    t.edieresis = 444;\n    t.cacute = 444;\n    t.nacute = 500;\n    t.umacron = 500;\n    t.Ncaron = 667;\n    t.Iacute = 333;\n    t.plusminus = 675;\n    t.brokenbar = 275;\n    t.registered = 760;\n    t.Gbreve = 722;\n    t.Idotaccent = 333;\n    t.summation = 600;\n    t.Egrave = 611;\n    t.racute = 389;\n    t.omacron = 500;\n    t.Zacute = 556;\n    t.Zcaron = 556;\n    t.greaterequal = 549;\n    t.Eth = 722;\n    t.Ccedilla = 667;\n    t.lcommaaccent = 278;\n    t.tcaron = 300;\n    t.eogonek = 444;\n    t.Uogonek = 722;\n    t.Aacute = 611;\n    t.Adieresis = 611;\n    t.egrave = 444;\n    t.zacute = 389;\n    t.iogonek = 278;\n    t.Oacute = 722;\n    t.oacute = 500;\n    t.amacron = 500;\n    t.sacute = 389;\n    t.idieresis = 278;\n    t.Ocircumflex = 722;\n    t.Ugrave = 722;\n    t.Delta = 612;\n    t.thorn = 500;\n    t.twosuperior = 300;\n    t.Odieresis = 722;\n    t.mu = 500;\n    t.igrave = 278;\n    t.ohungarumlaut = 500;\n    t.Eogonek = 611;\n    t.dcroat = 500;\n    t.threequarters = 750;\n    t.Scedilla = 500;\n    t.lcaron = 300;\n    t.Kcommaaccent = 667;\n    t.Lacute = 556;\n    t.trademark = 980;\n    t.edotaccent = 444;\n    t.Igrave = 333;\n    t.Imacron = 333;\n    t.Lcaron = 611;\n    t.onehalf = 750;\n    t.lessequal = 549;\n    t.ocircumflex = 500;\n    t.ntilde = 500;\n    t.Uhungarumlaut = 722;\n    t.Eacute = 611;\n    t.emacron = 444;\n    t.gbreve = 500;\n    t.onequarter = 750;\n    t.Scaron = 500;\n    t.Scommaaccent = 500;\n    t.Ohungarumlaut = 722;\n    t.degree = 400;\n    t.ograve = 500;\n    t.Ccaron = 667;\n    t.ugrave = 500;\n    t.radical = 453;\n    t.Dcaron = 722;\n    t.rcommaaccent = 389;\n    t.Ntilde = 667;\n    t.otilde = 500;\n    t.Rcommaaccent = 611;\n    t.Lcommaaccent = 556;\n    t.Atilde = 611;\n    t.Aogonek = 611;\n    t.Aring = 611;\n    t.Otilde = 722;\n    t.zdotaccent = 389;\n    t.Ecaron = 611;\n    t.Iogonek = 333;\n    t.kcommaaccent = 444;\n    t.minus = 675;\n    t.Icircumflex = 333;\n    t.ncaron = 500;\n    t.tcommaaccent = 278;\n    t.logicalnot = 675;\n    t.odieresis = 500;\n    t.udieresis = 500;\n    t.notequal = 549;\n    t.gcommaaccent = 500;\n    t.eth = 500;\n    t.zcaron = 389;\n    t.ncommaaccent = 500;\n    t.onesuperior = 300;\n    t.imacron = 278;\n    t.Euro = 500;\n  });\n  // eslint-disable-next-line no-shadow\n  t.ZapfDingbats = getLookupTableFactory(function (t) {\n    t.space = 278;\n    t.a1 = 974;\n    t.a2 = 961;\n    t.a202 = 974;\n    t.a3 = 980;\n    t.a4 = 719;\n    t.a5 = 789;\n    t.a119 = 790;\n    t.a118 = 791;\n    t.a117 = 690;\n    t.a11 = 960;\n    t.a12 = 939;\n    t.a13 = 549;\n    t.a14 = 855;\n    t.a15 = 911;\n    t.a16 = 933;\n    t.a105 = 911;\n    t.a17 = 945;\n    t.a18 = 974;\n    t.a19 = 755;\n    t.a20 = 846;\n    t.a21 = 762;\n    t.a22 = 761;\n    t.a23 = 571;\n    t.a24 = 677;\n    t.a25 = 763;\n    t.a26 = 760;\n    t.a27 = 759;\n    t.a28 = 754;\n    t.a6 = 494;\n    t.a7 = 552;\n    t.a8 = 537;\n    t.a9 = 577;\n    t.a10 = 692;\n    t.a29 = 786;\n    t.a30 = 788;\n    t.a31 = 788;\n    t.a32 = 790;\n    t.a33 = 793;\n    t.a34 = 794;\n    t.a35 = 816;\n    t.a36 = 823;\n    t.a37 = 789;\n    t.a38 = 841;\n    t.a39 = 823;\n    t.a40 = 833;\n    t.a41 = 816;\n    t.a42 = 831;\n    t.a43 = 923;\n    t.a44 = 744;\n    t.a45 = 723;\n    t.a46 = 749;\n    t.a47 = 790;\n    t.a48 = 792;\n    t.a49 = 695;\n    t.a50 = 776;\n    t.a51 = 768;\n    t.a52 = 792;\n    t.a53 = 759;\n    t.a54 = 707;\n    t.a55 = 708;\n    t.a56 = 682;\n    t.a57 = 701;\n    t.a58 = 826;\n    t.a59 = 815;\n    t.a60 = 789;\n    t.a61 = 789;\n    t.a62 = 707;\n    t.a63 = 687;\n    t.a64 = 696;\n    t.a65 = 689;\n    t.a66 = 786;\n    t.a67 = 787;\n    t.a68 = 713;\n    t.a69 = 791;\n    t.a70 = 785;\n    t.a71 = 791;\n    t.a72 = 873;\n    t.a73 = 761;\n    t.a74 = 762;\n    t.a203 = 762;\n    t.a75 = 759;\n    t.a204 = 759;\n    t.a76 = 892;\n    t.a77 = 892;\n    t.a78 = 788;\n    t.a79 = 784;\n    t.a81 = 438;\n    t.a82 = 138;\n    t.a83 = 277;\n    t.a84 = 415;\n    t.a97 = 392;\n    t.a98 = 392;\n    t.a99 = 668;\n    t.a100 = 668;\n    t.a89 = 390;\n    t.a90 = 390;\n    t.a93 = 317;\n    t.a94 = 317;\n    t.a91 = 276;\n    t.a92 = 276;\n    t.a205 = 509;\n    t.a85 = 509;\n    t.a206 = 410;\n    t.a86 = 410;\n    t.a87 = 234;\n    t.a88 = 234;\n    t.a95 = 334;\n    t.a96 = 334;\n    t.a101 = 732;\n    t.a102 = 544;\n    t.a103 = 544;\n    t.a104 = 910;\n    t.a106 = 667;\n    t.a107 = 760;\n    t.a108 = 760;\n    t.a112 = 776;\n    t.a111 = 595;\n    t.a110 = 694;\n    t.a109 = 626;\n    t.a120 = 788;\n    t.a121 = 788;\n    t.a122 = 788;\n    t.a123 = 788;\n    t.a124 = 788;\n    t.a125 = 788;\n    t.a126 = 788;\n    t.a127 = 788;\n    t.a128 = 788;\n    t.a129 = 788;\n    t.a130 = 788;\n    t.a131 = 788;\n    t.a132 = 788;\n    t.a133 = 788;\n    t.a134 = 788;\n    t.a135 = 788;\n    t.a136 = 788;\n    t.a137 = 788;\n    t.a138 = 788;\n    t.a139 = 788;\n    t.a140 = 788;\n    t.a141 = 788;\n    t.a142 = 788;\n    t.a143 = 788;\n    t.a144 = 788;\n    t.a145 = 788;\n    t.a146 = 788;\n    t.a147 = 788;\n    t.a148 = 788;\n    t.a149 = 788;\n    t.a150 = 788;\n    t.a151 = 788;\n    t.a152 = 788;\n    t.a153 = 788;\n    t.a154 = 788;\n    t.a155 = 788;\n    t.a156 = 788;\n    t.a157 = 788;\n    t.a158 = 788;\n    t.a159 = 788;\n    t.a160 = 894;\n    t.a161 = 838;\n    t.a163 = 1016;\n    t.a164 = 458;\n    t.a196 = 748;\n    t.a165 = 924;\n    t.a192 = 748;\n    t.a166 = 918;\n    t.a167 = 927;\n    t.a168 = 928;\n    t.a169 = 928;\n    t.a170 = 834;\n    t.a171 = 873;\n    t.a172 = 828;\n    t.a173 = 924;\n    t.a162 = 924;\n    t.a174 = 917;\n    t.a175 = 930;\n    t.a176 = 931;\n    t.a177 = 463;\n    t.a178 = 883;\n    t.a179 = 836;\n    t.a193 = 836;\n    t.a180 = 867;\n    t.a199 = 867;\n    t.a181 = 696;\n    t.a200 = 696;\n    t.a182 = 874;\n    t.a201 = 874;\n    t.a183 = 760;\n    t.a184 = 946;\n    t.a197 = 771;\n    t.a185 = 865;\n    t.a194 = 771;\n    t.a198 = 888;\n    t.a186 = 967;\n    t.a195 = 888;\n    t.a187 = 831;\n    t.a188 = 873;\n    t.a189 = 927;\n    t.a190 = 970;\n    t.a191 = 918;\n  });\n});\n\nconst getFontBasicMetrics = getLookupTableFactory(function (t) {\n  t.Courier = {\n    ascent: 629,\n    descent: -157,\n    capHeight: 562,\n    xHeight: -426,\n  };\n  t[\"Courier-Bold\"] = {\n    ascent: 629,\n    descent: -157,\n    capHeight: 562,\n    xHeight: 439,\n  };\n  t[\"Courier-Oblique\"] = {\n    ascent: 629,\n    descent: -157,\n    capHeight: 562,\n    xHeight: 426,\n  };\n  t[\"Courier-BoldOblique\"] = {\n    ascent: 629,\n    descent: -157,\n    capHeight: 562,\n    xHeight: 426,\n  };\n  t.Helvetica = {\n    ascent: 718,\n    descent: -207,\n    capHeight: 718,\n    xHeight: 523,\n  };\n  t[\"Helvetica-Bold\"] = {\n    ascent: 718,\n    descent: -207,\n    capHeight: 718,\n    xHeight: 532,\n  };\n  t[\"Helvetica-Oblique\"] = {\n    ascent: 718,\n    descent: -207,\n    capHeight: 718,\n    xHeight: 523,\n  };\n  t[\"Helvetica-BoldOblique\"] = {\n    ascent: 718,\n    descent: -207,\n    capHeight: 718,\n    xHeight: 532,\n  };\n  t[\"Times-Roman\"] = {\n    ascent: 683,\n    descent: -217,\n    capHeight: 662,\n    xHeight: 450,\n  };\n  t[\"Times-Bold\"] = {\n    ascent: 683,\n    descent: -217,\n    capHeight: 676,\n    xHeight: 461,\n  };\n  t[\"Times-Italic\"] = {\n    ascent: 683,\n    descent: -217,\n    capHeight: 653,\n    xHeight: 441,\n  };\n  t[\"Times-BoldItalic\"] = {\n    ascent: 683,\n    descent: -217,\n    capHeight: 669,\n    xHeight: 462,\n  };\n  t.Symbol = {\n    ascent: Math.NaN,\n    descent: Math.NaN,\n    capHeight: Math.NaN,\n    xHeight: Math.NaN,\n  };\n  t.ZapfDingbats = {\n    ascent: Math.NaN,\n    descent: Math.NaN,\n    capHeight: Math.NaN,\n    xHeight: Math.NaN,\n  };\n});\n\nexport { getFontBasicMetrics, getMetrics };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToBytes } from \"../shared/util.js\";\n\nconst OTF_HEADER_SIZE = 12;\nconst OTF_TABLE_ENTRY_SIZE = 16;\n\nclass OpenTypeFileBuilder {\n  #tables = new Map();\n\n  constructor(sfnt) {\n    this.sfnt = sfnt;\n  }\n\n  static getSearchParams(entriesCount, entrySize) {\n    let maxPower2 = 1,\n      log2 = 0;\n    while ((maxPower2 ^ entriesCount) > maxPower2) {\n      maxPower2 <<= 1;\n      log2++;\n    }\n    const searchRange = maxPower2 * entrySize;\n    return {\n      range: searchRange,\n      entry: log2,\n      rangeShift: entrySize * entriesCount - searchRange,\n    };\n  }\n\n  toArray() {\n    let sfnt = this.sfnt;\n\n    // Tables needs to be written by ascendant alphabetic order\n    const tables = this.#tables;\n    const tablesNames = [...tables.keys()].sort();\n    const numTables = tablesNames.length;\n\n    // layout the tables data\n    let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;\n    const tableOffsets = [offset];\n    for (let i = 0; i < numTables; i++) {\n      const table = tables.get(tablesNames[i]);\n      const paddedLength = ((table.length + 3) & ~3) >>> 0;\n      offset += paddedLength;\n      tableOffsets.push(offset);\n    }\n\n    const file = new Uint8Array(offset),\n      view = new DataView(file.buffer);\n    // write the table data first (mostly for checksum)\n    for (let i = 0; i < numTables; i++) {\n      const table = tables.get(tablesNames[i]);\n      file.set(table, tableOffsets[i]);\n    }\n\n    // sfnt version (4 bytes)\n    if (sfnt === \"true\") {\n      // Windows hates the Mac TrueType sfnt version number\n      sfnt = \"\\x00\\x01\\x00\\x00\";\n    }\n    file.set(stringToBytes(sfnt), 0);\n\n    // numTables (2 bytes)\n    view.setInt16(4, numTables);\n\n    const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);\n\n    // searchRange (2 bytes)\n    view.setInt16(6, searchParams.range);\n    // entrySelector (2 bytes)\n    view.setInt16(8, searchParams.entry);\n    // rangeShift (2 bytes)\n    view.setInt16(10, searchParams.rangeShift);\n\n    offset = OTF_HEADER_SIZE;\n    // writing table entries\n    for (let i = 0; i < numTables; i++) {\n      const tableName = tablesNames[i];\n      file.set(stringToBytes(tableName), offset);\n\n      // checksum\n      let checksum = 0;\n      for (let j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {\n        const quad = view.getUint32(j);\n        checksum = (checksum + quad) >>> 0;\n      }\n      view.setInt32(offset + 4, checksum);\n\n      // offset\n      view.setInt32(offset + 8, tableOffsets[i]);\n      // length\n      view.setInt32(offset + 12, tables.get(tableName).length);\n\n      offset += OTF_TABLE_ENTRY_SIZE;\n    }\n\n    this.#tables.clear();\n    return file;\n  }\n\n  addTable(tag, data) {\n    if (this.#tables.has(tag)) {\n      throw new Error(`Table ${tag} already exists`);\n    }\n    this.#tables.set(tag, data);\n  }\n}\n\nexport { OpenTypeFileBuilder };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getEncoding } from \"./encodings.js\";\nimport { isWhiteSpace } from \"./core_utils.js\";\nimport { Stream } from \"./stream.js\";\nimport { warn } from \"../shared/util.js\";\n\n// Hinting is currently disabled due to unknown problems on windows\n// in tracemonkey and various other pdfs with type1 fonts.\nconst HINTING_ENABLED = false;\n\nconst COMMAND_MAP = {\n  hstem: [1],\n  vstem: [3],\n  vmoveto: [4],\n  rlineto: [5],\n  hlineto: [6],\n  vlineto: [7],\n  rrcurveto: [8],\n  callsubr: [10],\n  flex: [12, 35],\n  drop: [12, 18],\n  endchar: [14],\n  rmoveto: [21],\n  hmoveto: [22],\n  vhcurveto: [30],\n  hvcurveto: [31],\n};\n\n/**\n * CharStrings are encoded following the CharString Encoding sequence\n * describe in Chapter 6 of the \"Adobe Type1 Font Format\" specification.\n * The value in a byte indicates a command, a number, or subsequent bytes\n * that are to be interpreted in a special way.\n *\n * CharString Number Encoding:\n *  A CharString byte containing the values from 32 through 255 inclusive\n *  indicate an integer. These values are decoded in four ranges.\n *\n * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,\n * indicate the integer v - 139. Thus, the integer values from -107 through\n * 107 inclusive may be encoded in single byte.\n *\n * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,\n * indicates an integer involving the next byte, w, according to the formula:\n * [(v - 247) x 256] + w + 108\n *\n * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,\n * indicates an integer involving the next byte, w, according to the formula:\n * -[(v - 251) * 256] - w - 108\n *\n * 4. A CharString containing the value 255 indicates that the next 4 bytes\n * are a two complement signed integer. The first of these bytes contains the\n * highest order bits, the second byte contains the next higher order bits\n * and the fourth byte contain the lowest order bits.\n *\n *\n * CharString Command Encoding:\n *  CharStrings commands are encoded in 1 or 2 bytes.\n *\n *  Single byte commands are encoded in 1 byte that contains a value between\n *  0 and 31 inclusive.\n *  If a command byte contains the value 12, then the value in the next byte\n *  indicates a command. This \"escape\" mechanism allows many extra commands\n *  to be encoded and this encoding technique helps to minimize the length of\n *  the charStrings.\n */\nclass Type1CharString {\n  width = 0;\n\n  lsb = 0;\n\n  flexing = false;\n\n  output = [];\n\n  stack = [];\n\n  convert(encoded, subrs, seacAnalysisEnabled) {\n    const count = encoded.length;\n    let error = false;\n    let wx, sbx, subrNumber;\n    for (let i = 0; i < count; i++) {\n      let value = encoded[i];\n      if (value < 32) {\n        if (value === 12) {\n          value = (value << 8) + encoded[++i];\n        }\n        switch (value) {\n          case 1: // hstem\n            if (!HINTING_ENABLED) {\n              this.stack = [];\n              break;\n            }\n            error = this.executeCommand(2, COMMAND_MAP.hstem);\n            break;\n          case 3: // vstem\n            if (!HINTING_ENABLED) {\n              this.stack = [];\n              break;\n            }\n            error = this.executeCommand(2, COMMAND_MAP.vstem);\n            break;\n          case 4: // vmoveto\n            if (this.flexing) {\n              if (this.stack.length < 1) {\n                error = true;\n                break;\n              }\n              // Add the dx for flex and but also swap the values so they are\n              // the right order.\n              const dy = this.stack.pop();\n              this.stack.push(0, dy);\n              break;\n            }\n            error = this.executeCommand(1, COMMAND_MAP.vmoveto);\n            break;\n          case 5: // rlineto\n            error = this.executeCommand(2, COMMAND_MAP.rlineto);\n            break;\n          case 6: // hlineto\n            error = this.executeCommand(1, COMMAND_MAP.hlineto);\n            break;\n          case 7: // vlineto\n            error = this.executeCommand(1, COMMAND_MAP.vlineto);\n            break;\n          case 8: // rrcurveto\n            error = this.executeCommand(6, COMMAND_MAP.rrcurveto);\n            break;\n          case 9: // closepath\n            // closepath is a Type1 command that does not take argument and is\n            // useless in Type2 and it can simply be ignored.\n            this.stack = [];\n            break;\n          case 10: // callsubr\n            if (this.stack.length < 1) {\n              error = true;\n              break;\n            }\n            subrNumber = this.stack.pop();\n            if (!subrs[subrNumber]) {\n              error = true;\n              break;\n            }\n            error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);\n            break;\n          case 11: // return\n            return error;\n          case 13: // hsbw\n            if (this.stack.length < 2) {\n              error = true;\n              break;\n            }\n            // To convert to type2 we have to move the width value to the\n            // first part of the charstring and then use hmoveto with lsb.\n            wx = this.stack.pop();\n            sbx = this.stack.pop();\n            this.lsb = sbx;\n            this.width = wx;\n            this.stack.push(wx, sbx);\n            error = this.executeCommand(2, COMMAND_MAP.hmoveto);\n            break;\n          case 14: // endchar\n            this.output.push(COMMAND_MAP.endchar[0]);\n            break;\n          case 21: // rmoveto\n            if (this.flexing) {\n              break;\n            }\n            error = this.executeCommand(2, COMMAND_MAP.rmoveto);\n            break;\n          case 22: // hmoveto\n            if (this.flexing) {\n              // Add the dy for flex.\n              this.stack.push(0);\n              break;\n            }\n            error = this.executeCommand(1, COMMAND_MAP.hmoveto);\n            break;\n          case 30: // vhcurveto\n            error = this.executeCommand(4, COMMAND_MAP.vhcurveto);\n            break;\n          case 31: // hvcurveto\n            error = this.executeCommand(4, COMMAND_MAP.hvcurveto);\n            break;\n          case (12 << 8) + 0: // dotsection\n            // dotsection is a Type1 command to specify some hinting feature\n            // for dots that do not take a parameter and it can safely be\n            // ignored for Type2.\n            this.stack = [];\n            break;\n          case (12 << 8) + 1: // vstem3\n            if (!HINTING_ENABLED) {\n              this.stack = [];\n              break;\n            }\n            // [vh]stem3 are Type1 only and Type2 supports [vh]stem with\n            // multiple parameters, so instead of returning [vh]stem3 take a\n            // shortcut and return [vhstem] instead.\n            error = this.executeCommand(2, COMMAND_MAP.vstem);\n            break;\n          case (12 << 8) + 2: // hstem3\n            if (!HINTING_ENABLED) {\n              this.stack = [];\n              break;\n            }\n            // See vstem3.\n            error = this.executeCommand(2, COMMAND_MAP.hstem);\n            break;\n          case (12 << 8) + 6: // seac\n            // seac is like type 2's special endchar but it doesn't use the\n            // first argument asb, so remove it.\n            if (seacAnalysisEnabled) {\n              const asb = this.stack.at(-5);\n              this.seac = this.stack.splice(-4, 4);\n              this.seac[0] += this.lsb - asb;\n              error = this.executeCommand(0, COMMAND_MAP.endchar);\n            } else {\n              error = this.executeCommand(4, COMMAND_MAP.endchar);\n            }\n            break;\n          case (12 << 8) + 7: // sbw\n            if (this.stack.length < 4) {\n              error = true;\n              break;\n            }\n            // To convert to type2 we have to move the width value to the\n            // first part of the charstring and then use rmoveto with\n            // (dx, dy). The height argument will not be used for vmtx and\n            // vhea tables reconstruction -- ignoring it.\n            this.stack.pop(); // wy\n            wx = this.stack.pop();\n            const sby = this.stack.pop();\n            sbx = this.stack.pop();\n            this.lsb = sbx;\n            this.width = wx;\n            this.stack.push(wx, sbx, sby);\n            error = this.executeCommand(3, COMMAND_MAP.rmoveto);\n            break;\n          case (12 << 8) + 12: // div\n            if (this.stack.length < 2) {\n              error = true;\n              break;\n            }\n            const num2 = this.stack.pop();\n            const num1 = this.stack.pop();\n            this.stack.push(num1 / num2);\n            break;\n          case (12 << 8) + 16: // callothersubr\n            if (this.stack.length < 2) {\n              error = true;\n              break;\n            }\n            subrNumber = this.stack.pop();\n            const numArgs = this.stack.pop();\n            if (subrNumber === 0 && numArgs === 3) {\n              const flexArgs = this.stack.splice(-17, 17);\n              this.stack.push(\n                flexArgs[2] + flexArgs[0], // bcp1x + rpx\n                flexArgs[3] + flexArgs[1], // bcp1y + rpy\n                flexArgs[4], // bcp2x\n                flexArgs[5], // bcp2y\n                flexArgs[6], // p2x\n                flexArgs[7], // p2y\n                flexArgs[8], // bcp3x\n                flexArgs[9], // bcp3y\n                flexArgs[10], // bcp4x\n                flexArgs[11], // bcp4y\n                flexArgs[12], // p3x\n                flexArgs[13], // p3y\n                flexArgs[14] // flexDepth\n                // 15 = finalx unused by flex\n                // 16 = finaly unused by flex\n              );\n              error = this.executeCommand(13, COMMAND_MAP.flex, true);\n              this.flexing = false;\n              this.stack.push(flexArgs[15], flexArgs[16]);\n            } else if (subrNumber === 1 && numArgs === 0) {\n              this.flexing = true;\n            }\n            break;\n          case (12 << 8) + 17: // pop\n            // Ignore this since it is only used with othersubr.\n            break;\n          case (12 << 8) + 33: // setcurrentpoint\n            // Ignore for now.\n            this.stack = [];\n            break;\n          default:\n            warn('Unknown type 1 charstring command of \"' + value + '\"');\n            break;\n        }\n        if (error) {\n          break;\n        }\n        continue;\n      } else if (value <= 246) {\n        value -= 139;\n      } else if (value <= 250) {\n        value = (value - 247) * 256 + encoded[++i] + 108;\n      } else if (value <= 254) {\n        value = -((value - 251) * 256) - encoded[++i] - 108;\n      } else {\n        value =\n          ((encoded[++i] & 0xff) << 24) |\n          ((encoded[++i] & 0xff) << 16) |\n          ((encoded[++i] & 0xff) << 8) |\n          ((encoded[++i] & 0xff) << 0);\n      }\n      this.stack.push(value);\n    }\n    return error;\n  }\n\n  executeCommand(howManyArgs, command, keepStack) {\n    const stackLength = this.stack.length;\n    if (howManyArgs > stackLength) {\n      return true;\n    }\n    const start = stackLength - howManyArgs;\n    for (let i = start; i < stackLength; i++) {\n      let value = this.stack[i];\n      if (Number.isInteger(value)) {\n        this.output.push(28, (value >> 8) & 0xff, value & 0xff);\n      } else {\n        // fixed point\n        value = (65536 * value) | 0;\n        this.output.push(\n          255,\n          (value >> 24) & 0xff,\n          (value >> 16) & 0xff,\n          (value >> 8) & 0xff,\n          value & 0xff\n        );\n      }\n    }\n    this.output.push(...command);\n    if (keepStack) {\n      this.stack.splice(start, howManyArgs);\n    } else {\n      this.stack.length = 0;\n    }\n    return false;\n  }\n}\n\n/**\n * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence\n * of Plaintext Bytes. The function takes a key as a parameter which can be\n * for decrypting the eexec block or for decoding charStrings.\n */\nconst EEXEC_ENCRYPT_KEY = 55665;\nconst CHAR_STRS_ENCRYPT_KEY = 4330;\n\nfunction isHexDigit(code) {\n  return (\n    (code >= 48 && code <= 57) || // '0'-'9'\n    (code >= 65 && code <= 70) || // 'A'-'F'\n    (code >= 97 && code <= 102) // 'a'-'f'\n  );\n}\n\nfunction decrypt(data, key, discardNumber) {\n  if (discardNumber >= data.length) {\n    return new Uint8Array(0);\n  }\n  const c1 = 52845,\n    c2 = 22719;\n  let r = key | 0,\n    i,\n    j;\n  for (i = 0; i < discardNumber; i++) {\n    r = ((data[i] + r) * c1 + c2) & ((1 << 16) - 1);\n  }\n  const count = data.length - discardNumber;\n  const decrypted = new Uint8Array(count);\n  for (i = discardNumber, j = 0; j < count; i++, j++) {\n    const value = data[i];\n    decrypted[j] = value ^ (r >> 8);\n    r = ((value + r) * c1 + c2) & ((1 << 16) - 1);\n  }\n  return decrypted;\n}\n\nfunction decryptAscii(data, key, discardNumber) {\n  const c1 = 52845,\n    c2 = 22719;\n  let r = key | 0;\n  const count = data.length,\n    maybeLength = count >>> 1;\n  const decrypted = new Uint8Array(maybeLength);\n  let i, j;\n  for (i = 0, j = 0; i < count; i++) {\n    const digit1 = data[i];\n    if (!isHexDigit(digit1)) {\n      continue;\n    }\n    i++;\n    let digit2;\n    while (i < count && !isHexDigit((digit2 = data[i]))) {\n      i++;\n    }\n    if (i < count) {\n      const value = parseInt(String.fromCharCode(digit1, digit2), 16);\n      decrypted[j++] = value ^ (r >> 8);\n      r = ((value + r) * c1 + c2) & ((1 << 16) - 1);\n    }\n  }\n  return decrypted.slice(discardNumber, j);\n}\n\nfunction isSpecial(c) {\n  return (\n    c === /* '/' = */ 0x2f ||\n    c === /* '[' = */ 0x5b ||\n    c === /* ']' = */ 0x5d ||\n    c === /* '{' = */ 0x7b ||\n    c === /* '}' = */ 0x7d ||\n    c === /* '(' = */ 0x28 ||\n    c === /* ')' = */ 0x29\n  );\n}\n\n/**\n * Type1Parser encapsulate the needed code for parsing a Type1 font program.\n * Some of its logic depends on the Type2 charstrings structure.\n * NOTE: This doesn't really parse the font since that would require evaluation\n *       of PostScript, but it is possible in most cases to extract what we need\n *       without a full parse.\n */\nclass Type1Parser {\n  constructor(stream, encrypted, seacAnalysisEnabled) {\n    if (encrypted) {\n      const data = stream.getBytes();\n      const isBinary = !(\n        (isHexDigit(data[0]) || isWhiteSpace(data[0])) &&\n        isHexDigit(data[1]) &&\n        isHexDigit(data[2]) &&\n        isHexDigit(data[3]) &&\n        isHexDigit(data[4]) &&\n        isHexDigit(data[5]) &&\n        isHexDigit(data[6]) &&\n        isHexDigit(data[7])\n      );\n      stream = new Stream(\n        isBinary\n          ? decrypt(data, EEXEC_ENCRYPT_KEY, 4)\n          : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)\n      );\n    }\n    this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n\n    this.stream = stream;\n    this.nextChar();\n  }\n\n  readNumberArray() {\n    this.getToken(); // read '[' or '{' (arrays can start with either)\n    const array = [];\n    while (true) {\n      const token = this.getToken();\n      if (token === null || token === \"]\" || token === \"}\") {\n        break;\n      }\n      array.push(parseFloat(token || 0));\n    }\n    return array;\n  }\n\n  readNumber() {\n    const token = this.getToken();\n    return parseFloat(token || 0);\n  }\n\n  readInt() {\n    // Use '| 0' to prevent setting a double into length such as the double\n    // does not flow into the loop variable.\n    const token = this.getToken();\n    return parseInt(token || 0, 10) | 0;\n  }\n\n  readBoolean() {\n    const token = this.getToken();\n    // Use 1 and 0 since that's what type2 charstrings use.\n    return token === \"true\" ? 1 : 0;\n  }\n\n  nextChar() {\n    return (this.currentChar = this.stream.getByte());\n  }\n\n  prevChar() {\n    this.stream.skip(-2);\n    return (this.currentChar = this.stream.getByte());\n  }\n\n  getToken() {\n    // Eat whitespace and comments.\n    let comment = false;\n    let ch = this.currentChar;\n    while (true) {\n      if (ch === -1) {\n        return null;\n      }\n\n      if (comment) {\n        if (ch === 0x0a || ch === 0x0d) {\n          comment = false;\n        }\n      } else if (ch === /* '%' = */ 0x25) {\n        comment = true;\n      } else if (!isWhiteSpace(ch)) {\n        break;\n      }\n      ch = this.nextChar();\n    }\n    if (isSpecial(ch)) {\n      this.nextChar();\n      return String.fromCharCode(ch);\n    }\n    let token = \"\";\n    do {\n      token += String.fromCharCode(ch);\n      ch = this.nextChar();\n    } while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch));\n    return token;\n  }\n\n  readCharStrings(bytes, lenIV) {\n    if (lenIV === -1) {\n      // This isn't in the spec, but Adobe's tx program handles -1\n      // as plain text.\n      return bytes;\n    }\n    return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);\n  }\n\n  /*\n   * Returns an object containing a Subrs array and a CharStrings\n   * array extracted from and eexec encrypted block of data\n   */\n  extractFontProgram(properties) {\n    const stream = this.stream;\n\n    const subrs = [],\n      charstrings = [];\n    const privateData = new Map([[\"lenIV\", 4]]);\n    const program = {\n      subrs: [],\n      charstrings: [],\n      properties: {\n        privateData,\n      },\n    };\n    let token, length, data, lenIV;\n    // Some fonts (e.g. those embedded in issue18548.pdf) define a second\n    // `/Subrs` and `/CharStrings` block that the PostScript runtime selects\n    // conditionally (e.g. high-resolution variants). Testing with other\n    // viewers shows that none of them actually use these conditional blocks,\n    // so we can \"safely\" ignore them.\n    let subrsParsed = false;\n    let charStringsParsed = false;\n    while ((token = this.getToken()) !== null) {\n      if (token !== \"/\") {\n        continue;\n      }\n      token = this.getToken();\n      switch (token) {\n        case \"CharStrings\":\n          if (charStringsParsed) {\n            break;\n          }\n          charStringsParsed = true;\n          // The number immediately following CharStrings must be greater or\n          // equal to the number of CharStrings.\n          this.getToken();\n          this.getToken(); // read in 'dict'\n          this.getToken(); // read in 'dup'\n          this.getToken(); // read in 'begin'\n          while (true) {\n            token = this.getToken();\n            if (token === null || token === \"end\") {\n              break;\n            }\n\n            if (token !== \"/\") {\n              continue;\n            }\n            const glyph = this.getToken();\n            length = this.readInt();\n            this.getToken(); // read in 'RD' or '-|'\n            data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);\n            lenIV = privateData.get(\"lenIV\");\n            const encoded = this.readCharStrings(data, lenIV);\n            this.nextChar();\n            token = this.getToken(); // read in 'ND' or '|-'\n            if (token === \"noaccess\") {\n              this.getToken(); // read in 'def'\n            } else if (token === \"/\") {\n              // The expected 'ND' or '|-' token is missing, avoid swallowing\n              // the start of the next glyph (fixes issue14462_reduced.pdf).\n              this.prevChar();\n            }\n            charstrings.push({\n              glyph,\n              encoded,\n            });\n          }\n          break;\n        case \"Subrs\":\n          if (subrsParsed) {\n            break;\n          }\n          subrsParsed = true;\n          this.readInt(); // num\n          this.getToken(); // read in 'array'\n          while (this.getToken() === \"dup\") {\n            const index = this.readInt();\n            length = this.readInt();\n            this.getToken(); // read in 'RD' or '-|'\n            data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);\n            lenIV = privateData.get(\"lenIV\");\n            const encoded = this.readCharStrings(data, lenIV);\n            this.nextChar();\n            token = this.getToken(); // read in 'NP' or '|'\n            if (token === \"noaccess\") {\n              this.getToken(); // read in 'put'\n            }\n            subrs[index] = encoded;\n          }\n          break;\n        case \"BlueValues\":\n        case \"OtherBlues\":\n        case \"FamilyBlues\":\n        case \"FamilyOtherBlues\":\n          const blueArray = this.readNumberArray();\n          // *Blue* values may contain invalid data: disables reading of\n          // those values when hinting is disabled.\n          if (\n            blueArray.length > 0 &&\n            blueArray.length % 2 === 0 &&\n            HINTING_ENABLED\n          ) {\n            privateData.set(token, blueArray);\n          }\n          break;\n        case \"StemSnapH\":\n        case \"StemSnapV\":\n          privateData.set(token, this.readNumberArray());\n          break;\n        case \"StdHW\":\n        case \"StdVW\":\n          privateData.set(token, this.readNumberArray()[0]);\n          break;\n        case \"BlueShift\":\n        case \"lenIV\":\n        case \"BlueFuzz\":\n        case \"BlueScale\":\n        case \"LanguageGroup\":\n          privateData.set(token, this.readNumber());\n          break;\n        case \"ExpansionFactor\":\n          // Firefox doesn't render correctly a font with a null factor on\n          // Windows (see issue 15289), hence we just reset it to its default\n          // value (0.06).\n          privateData.set(token, this.readNumber() || 0.06);\n          break;\n        case \"ForceBold\":\n          privateData.set(token, this.readBoolean());\n          break;\n      }\n    }\n\n    for (const { encoded, glyph } of charstrings) {\n      const charString = new Type1CharString();\n      const error = charString.convert(\n        encoded,\n        subrs,\n        this.seacAnalysisEnabled\n      );\n      // It seems when FreeType encounters an error while evaluating a glyph\n      // that it completely ignores the glyph so we'll mimic that behaviour\n      // here and put an endchar to make the validator happy.\n      const output = !error ? charString.output : [14];\n      const charStringObject = {\n        glyphName: glyph,\n        charstring: output,\n        width: charString.width,\n        lsb: charString.lsb,\n        seac: charString.seac,\n      };\n      if (glyph === \".notdef\") {\n        // Make sure .notdef is at index zero (issue #11477).\n        program.charstrings.unshift(charStringObject);\n      } else {\n        program.charstrings.push(charStringObject);\n      }\n\n      // Attempt to replace missing widths, from the font dictionary /Widths\n      // entry, with ones from the font data (fixes issue11150_reduced.pdf).\n      if (properties.builtInEncoding) {\n        const index = properties.builtInEncoding.indexOf(glyph);\n        if (\n          index > -1 &&\n          properties.widths[index] === undefined &&\n          index >= properties.firstChar &&\n          index <= properties.lastChar\n        ) {\n          properties.widths[index] = charString.width;\n        }\n      }\n    }\n\n    return program;\n  }\n\n  /*\n   * Returns an object containing a Subrs array and a CharStrings array\n   * extracted from a CID-keyed Type 1 font program (Adobe TechNote 5014,\n   * CIDFontType 0). The stream must start at the PostScript header.\n   *\n   * The binary section that follows the \"StartData\" marker contains:\n   *  - CIDMap at CIDMapOffset, with (CIDCount + 1) entries; each entry is\n   *    FDBytes (FD-index) + GDBytes (glyph data offset) bytes.\n   *  - SubrMap at SubrMapOffset, with (SubrCount + 1) entries of SDBytes\n   *    each, holding subr data offsets.\n   *  - The charstring/subr data, each encrypted with the Type 1 charstring\n   *    cipher and prefixed by `lenIV` random bytes.\n   *\n   * Only single-FDArray fonts are supported.\n   */\n  extractCidKeyedFontProgram(properties) {\n    const stream = this.stream;\n    const privateData = new Map([[\"lenIV\", 4]]);\n    const program = {\n      subrs: [],\n      charstrings: [],\n      properties: { privateData },\n    };\n\n    let cidCount = 0;\n    let cidMapOffset = -1;\n    let fdBytes = 1;\n    let gdBytes = 0;\n    let subrMapOffset = -1;\n    let sdBytes = 0;\n    let subrCount = 0;\n    let startDataLength = 0;\n    let startDataIsHex = false;\n    let foundStartData = false;\n    const previousTokens = [];\n\n    function rememberToken(value) {\n      previousTokens.push(value);\n      if (previousTokens.length > 4) {\n        previousTokens.shift();\n      }\n    }\n\n    let token;\n    while ((token = this.getToken()) !== null) {\n      if (token === \"StartData\") {\n        const dataType = previousTokens.at(-3);\n        const dataLength = previousTokens.at(-1);\n        if (\n          previousTokens.at(-4) !== \"(\" ||\n          previousTokens.at(-2) !== \")\" ||\n          (dataType !== \"Binary\" && dataType !== \"Hex\") ||\n          !/^\\d+$/.test(dataLength)\n        ) {\n          return null;\n        }\n        startDataLength = parseInt(dataLength, 10);\n        if (startDataLength <= 0) {\n          return null;\n        }\n        startDataIsHex = dataType === \"Hex\";\n        foundStartData = true;\n        break;\n      }\n      rememberToken(token);\n      if (token !== \"/\") {\n        continue;\n      }\n      token = this.getToken();\n      rememberToken(token);\n      switch (token) {\n        case \"FontMatrix\":\n          properties.fontMatrix = this.readNumberArray();\n          break;\n        case \"FontBBox\":\n          const fontBBox = this.readNumberArray();\n          properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n          properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n          properties.ascentScaled = true;\n          break;\n        case \"CIDCount\":\n          cidCount = this.readInt();\n          break;\n        case \"CIDMapOffset\":\n          cidMapOffset = this.readInt();\n          break;\n        case \"FDBytes\":\n          fdBytes = this.readInt();\n          break;\n        case \"GDBytes\":\n          gdBytes = this.readInt();\n          break;\n        case \"SubrMapOffset\":\n          subrMapOffset = this.readInt();\n          break;\n        case \"SDBytes\":\n          sdBytes = this.readInt();\n          break;\n        case \"SubrCount\":\n          subrCount = this.readInt();\n          break;\n        case \"BlueValues\":\n        case \"OtherBlues\":\n        case \"FamilyBlues\":\n        case \"FamilyOtherBlues\":\n          // *Blue* values are skipped while hinting is disabled.\n          this.readNumberArray();\n          break;\n        case \"StemSnapH\":\n        case \"StemSnapV\":\n          privateData.set(token, this.readNumberArray());\n          break;\n        case \"StdHW\":\n        case \"StdVW\":\n          privateData.set(token, this.readNumberArray()[0]);\n          break;\n        case \"BlueShift\":\n        case \"lenIV\":\n        case \"BlueFuzz\":\n        case \"BlueScale\":\n        case \"LanguageGroup\":\n          privateData.set(token, this.readNumber());\n          break;\n        case \"ExpansionFactor\":\n          privateData.set(token, this.readNumber() || 0.06);\n          break;\n        case \"ForceBold\":\n          privateData.set(token, this.readBoolean());\n          break;\n      }\n    }\n\n    if (\n      !foundStartData ||\n      cidCount <= 0 ||\n      cidMapOffset < 0 ||\n      fdBytes < 0 ||\n      fdBytes > 4 ||\n      gdBytes < 1 ||\n      gdBytes > 4\n    ) {\n      return null;\n    }\n\n    // After \"StartData\", currentChar is the single separator byte (typically\n    // a space); the next byte starts the binary block. `startDataLength` is\n    // only an upper bound: some generators (see issue 15292) write a wrong\n    // value, and the buffer is also untrusted PostScript input -- cap to the\n    // stream's remaining bytes before allocating.\n    const maxLength = stream.end - stream.pos;\n    if (startDataLength > maxLength) {\n      if (!startDataIsHex) {\n        startDataLength = maxLength;\n      } else if (startDataLength > 2 * maxLength) {\n        // Hex needs ~2 chars per output byte; anything larger is impossible.\n        return null;\n      }\n    }\n    let binary = stream.getBytes(startDataIsHex ? undefined : startDataLength);\n    if (startDataIsHex) {\n      const decoded = new Uint8Array(startDataLength);\n      let digit1 = -1,\n        j = 0;\n      for (let i = 0, ii = binary.length; i < ii && j < startDataLength; i++) {\n        const digit = binary[i];\n        if (!isHexDigit(digit)) {\n          continue;\n        }\n        if (digit1 < 0) {\n          digit1 = digit;\n          continue;\n        }\n        decoded[j++] = parseInt(String.fromCharCode(digit1, digit), 16);\n        digit1 = -1;\n      }\n      if (j !== startDataLength) {\n        return null;\n      }\n      binary = decoded;\n    }\n    const lenIV = privateData.get(\"lenIV\");\n    const cidEntrySize = fdBytes + gdBytes;\n    const subrs = [];\n\n    function readUint(offset, byteCount) {\n      let n = 0;\n      for (let i = 0; i < byteCount; i++) {\n        n = (n << 8) | binary[offset + i];\n      }\n      return n >>> 0;\n    }\n\n    if (\n      cidMapOffset + (cidCount + 1) * cidEntrySize > binary.length ||\n      (subrCount > 0 &&\n        (subrMapOffset < 0 ||\n          sdBytes < 1 ||\n          sdBytes > 4 ||\n          subrMapOffset + (subrCount + 1) * sdBytes > binary.length))\n    ) {\n      return null;\n    }\n\n    if (fdBytes > 0) {\n      // Only single-FDArray fonts are supported here. Reject CID-keyed fonts\n      // that actually select multiple font dictionaries, since each FD can\n      // define different private data and subroutines.\n      for (let cid = 0; cid < cidCount; cid++) {\n        if (readUint(cidMapOffset + cid * cidEntrySize, fdBytes) !== 0) {\n          return null;\n        }\n      }\n    }\n\n    if (subrCount > 0) {\n      const subrOffsets = new Array(subrCount + 1);\n      for (let i = 0; i <= subrCount; i++) {\n        subrOffsets[i] = readUint(subrMapOffset + i * sdBytes, sdBytes);\n      }\n      for (let i = 0; i < subrCount; i++) {\n        const start = subrOffsets[i];\n        const end = subrOffsets[i + 1];\n        if (end > binary.length || end < start) {\n          subrs[i] = new Uint8Array(0);\n          continue;\n        }\n        subrs[i] = this.readCharStrings(binary.subarray(start, end), lenIV);\n      }\n    }\n\n    const charstrings = [];\n    let prevOffset = readUint(cidMapOffset + fdBytes, gdBytes);\n    for (let cid = 0; cid < cidCount; cid++) {\n      const nextOffset = readUint(\n        cidMapOffset + (cid + 1) * cidEntrySize + fdBytes,\n        gdBytes\n      );\n      const glyphName = cid === 0 ? \".notdef\" : `cid${cid}`;\n      if (nextOffset > prevOffset && nextOffset <= binary.length) {\n        const encoded = this.readCharStrings(\n          binary.subarray(prevOffset, nextOffset),\n          lenIV\n        );\n        const charString = new Type1CharString();\n        const error = charString.convert(\n          encoded,\n          subrs,\n          this.seacAnalysisEnabled\n        );\n        charstrings.push({\n          glyphName,\n          charstring: error ? [14] : charString.output,\n          width: charString.width,\n          lsb: charString.lsb,\n          seac: charString.seac,\n        });\n      } else {\n        // Empty intervals should select CID 0's notdef glyph, while still\n        // keeping the slot so the CID-to-GID mapping stays aligned.\n        const notDef = charstrings[0];\n        charstrings.push({\n          glyphName,\n          charstring: notDef?.charstring.slice() || [0x8b, 0x0e], // 0 endchar\n          width: notDef?.width || 0,\n          lsb: notDef?.lsb || 0,\n        });\n      }\n      prevOffset = nextOffset;\n    }\n    program.subrs = subrs;\n    program.charstrings = charstrings;\n    return program;\n  }\n\n  extractFontHeader(properties) {\n    let token;\n    while ((token = this.getToken()) !== null) {\n      if (token !== \"/\") {\n        continue;\n      }\n      token = this.getToken();\n      switch (token) {\n        case \"FontMatrix\":\n          const matrix = this.readNumberArray();\n          properties.fontMatrix = matrix;\n          break;\n        case \"Encoding\":\n          const encodingArg = this.getToken();\n          let encoding;\n          if (!/^\\d+$/.test(encodingArg)) {\n            // encoding name is specified\n            encoding = getEncoding(encodingArg);\n          } else {\n            encoding = [];\n            const size = parseInt(encodingArg, 10) | 0;\n            this.getToken(); // read in 'array'\n\n            for (let j = 0; j < size; j++) {\n              token = this.getToken();\n              // skipping till first dup or def (e.g. ignoring for statement)\n              while (token !== \"dup\" && token !== \"def\") {\n                token = this.getToken();\n                if (token === null) {\n                  return; // invalid header\n                }\n              }\n              if (token === \"def\") {\n                break; // read all array data\n              }\n              const index = this.readInt();\n              this.getToken(); // read in '/'\n              const glyph = this.getToken();\n              encoding[index] = glyph;\n              this.getToken(); // read the in 'put'\n            }\n          }\n          properties.builtInEncoding = encoding;\n          break;\n        case \"FontBBox\":\n          const fontBBox = this.readNumberArray();\n          // adjusting ascent/descent\n          properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n          properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n          properties.ascentScaled = true;\n          break;\n      }\n    }\n  }\n}\n\nexport { Type1Parser };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bytesToString, FormatError, warn } from \"../shared/util.js\";\nimport {\n  CFF,\n  CFFCharset,\n  CFFCompiler,\n  CFFHeader,\n  CFFIndex,\n  CFFPrivateDict,\n  CFFStandardStrings,\n  CFFStrings,\n  CFFTopDict,\n} from \"./cff_parser.js\";\nimport { SEAC_ANALYSIS_ENABLED, type1FontGlyphMapping } from \"./fonts_utils.js\";\nimport { isWhiteSpace } from \"./core_utils.js\";\nimport { Stream } from \"./stream.js\";\nimport { Type1Parser } from \"./type1_parser.js\";\n\nfunction findBlock(streamBytes, signature, startIndex) {\n  const streamBytesLength = streamBytes.length;\n  const signatureLength = signature.length;\n  const scanLength = streamBytesLength - signatureLength;\n\n  let i = startIndex,\n    found = false;\n  while (i < scanLength) {\n    let j = 0;\n    while (j < signatureLength && streamBytes[i + j] === signature[j]) {\n      j++;\n    }\n    if (j >= signatureLength) {\n      // `signature` found, skip over whitespace.\n      i += j;\n      while (i < streamBytesLength && isWhiteSpace(streamBytes[i])) {\n        i++;\n      }\n      found = true;\n      break;\n    }\n    i++;\n  }\n  return {\n    found,\n    length: i,\n  };\n}\n\nfunction getHeaderBlock(stream, suggestedLength) {\n  const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];\n\n  const streamStartPos = stream.pos; // Save the initial stream position.\n  let headerBytes, headerBytesLength, block;\n  try {\n    headerBytes = stream.getBytes(suggestedLength);\n    headerBytesLength = headerBytes.length;\n  } catch {\n    // Ignore errors if the `suggestedLength` is huge enough that a Uint8Array\n    // cannot hold the result of `getBytes`, and fallback to simply checking\n    // the entire stream (fixes issue3928.pdf).\n  }\n\n  if (headerBytesLength === suggestedLength) {\n    // Most of the time `suggestedLength` is correct, so to speed things up we\n    // initially only check the last few bytes to see if the header was found.\n    // Otherwise we (potentially) check the entire stream to prevent errors in\n    // `Type1Parser` (fixes issue5686.pdf).\n    block = findBlock(\n      headerBytes,\n      EEXEC_SIGNATURE,\n      suggestedLength - 2 * EEXEC_SIGNATURE.length\n    );\n\n    if (block.found && block.length === suggestedLength) {\n      return {\n        stream: new Stream(headerBytes),\n        length: suggestedLength,\n      };\n    }\n  }\n  warn('Invalid \"Length1\" property in Type1 font -- trying to recover.');\n  stream.pos = streamStartPos; // Reset the stream position.\n\n  const SCAN_BLOCK_LENGTH = 2048;\n  let actualLength;\n  while (true) {\n    const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);\n    block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);\n\n    if (block.length === 0) {\n      break;\n    }\n    stream.pos += block.length; // Update the stream position.\n\n    if (block.found) {\n      actualLength = stream.pos - streamStartPos;\n      break;\n    }\n  }\n  stream.pos = streamStartPos; // Reset the stream position.\n\n  if (actualLength) {\n    return {\n      stream: new Stream(stream.getBytes(actualLength)),\n      length: actualLength,\n    };\n  }\n  warn('Unable to recover \"Length1\" property in Type1 font -- using as is.');\n  return {\n    stream: new Stream(stream.getBytes(suggestedLength)),\n    length: suggestedLength,\n  };\n}\n\nfunction getEexecBlock(stream, suggestedLength) {\n  // We should ideally parse the eexec block to ensure that `suggestedLength`\n  // is correct, so we don't truncate the block data if it's too small.\n  // However, this would also require checking if the fixed-content portion\n  // exists (using the 'Length3' property), and ensuring that it's valid.\n  //\n  // Given that `suggestedLength` almost always is correct, all the validation\n  // would require a great deal of unnecessary parsing for most fonts.\n  // To save time, we always fetch the entire stream instead, which also avoid\n  // issues if `suggestedLength` is huge (see comment in `getHeaderBlock`).\n  //\n  // NOTE: This means that the function can include the fixed-content portion\n  // in the returned eexec block. In practice this does *not* seem to matter,\n  // since `Type1Parser_extractFontProgram` will skip over any non-commands.\n  const eexecBytes = stream.getBytes();\n  if (eexecBytes.length === 0) {\n    throw new FormatError(\"getEexecBlock - no font program found.\");\n  }\n  return {\n    stream: new Stream(eexecBytes),\n    length: eexecBytes.length,\n  };\n}\n\n// Detects the CID-keyed Type 1 format (Adobe TechNote 5014, CIDFontType 0).\n// Caller must additionally check `properties.composite`, since only composite\n// fonts are wrapped as CIDFontType0 in PDF.\nfunction isCidKeyedType1File(file) {\n  const sample = file.peekBytes(2048);\n  if (sample.length < 2 || sample[0] !== 0x25 || sample[1] !== 0x21) {\n    return false;\n  }\n  const text = bytesToString(sample);\n  return text.includes(\"Resource-CIDFont\") || /\\/CIDFontType\\s+0\\b/.test(text);\n}\n\n/**\n * Type1Font is also a CIDFontType0.\n */\nclass Type1Font {\n  #rawFileLength;\n\n  constructor(name, file, properties) {\n    let data;\n    if (properties.composite && isCidKeyedType1File(file)) {\n      data = this.#parseCidKeyedType1(file, properties);\n    }\n    data ||= this.#parseType1(file, properties);\n    for (const key in data.properties) {\n      properties[key] = data.properties[key];\n    }\n\n    const charstrings = data.charstrings;\n    const type2Charstrings = this.getType2Charstrings(charstrings);\n    const subrs = this.getType2Subrs(data.subrs);\n\n    this.charstrings = charstrings;\n    this.data = this.wrap(\n      name,\n      type2Charstrings,\n      this.charstrings,\n      subrs,\n      properties\n    );\n    this.seacs = this.getSeacs(data.charstrings);\n  }\n\n  #parseType1(file, properties) {\n    // Some bad generators embed pfb file as is, we have to strip 6-byte header.\n    // Also, length1 and length2 might be off by 6 bytes as well.\n    // http://www.math.ubc.ca/~cass/piscript/type1.pdf\n    const PFB_HEADER_SIZE = 6;\n    let headerBlockLength = properties.length1;\n    let eexecBlockLength = properties.length2;\n    let pfbHeader = file.peekBytes(PFB_HEADER_SIZE);\n    const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;\n    if (pfbHeaderPresent) {\n      file.skip(PFB_HEADER_SIZE);\n      headerBlockLength =\n        (pfbHeader[5] << 24) |\n        (pfbHeader[4] << 16) |\n        (pfbHeader[3] << 8) |\n        pfbHeader[2];\n    }\n\n    const headerBlock = getHeaderBlock(file, headerBlockLength);\n    const headerBlockParser = new Type1Parser(\n      headerBlock.stream,\n      false,\n      SEAC_ANALYSIS_ENABLED\n    );\n    headerBlockParser.extractFontHeader(properties);\n\n    if (pfbHeaderPresent) {\n      pfbHeader = file.getBytes(PFB_HEADER_SIZE);\n      eexecBlockLength =\n        (pfbHeader[5] << 24) |\n        (pfbHeader[4] << 16) |\n        (pfbHeader[3] << 8) |\n        pfbHeader[2];\n    }\n\n    const eexecBlock = getEexecBlock(file, eexecBlockLength);\n    const eexecBlockParser = new Type1Parser(\n      eexecBlock.stream,\n      true,\n      SEAC_ANALYSIS_ENABLED\n    );\n    const data = eexecBlockParser.extractFontProgram(properties);\n    this.#rawFileLength = headerBlock.length + eexecBlock.length;\n    return data;\n  }\n\n  #parseCidKeyedType1(file, properties) {\n    const fileStart = file.pos;\n    const length = file.end - fileStart;\n    const parser = new Type1Parser(file, false, SEAC_ANALYSIS_ENABLED);\n    const data = parser.extractCidKeyedFontProgram(properties);\n    if (!data) {\n      // Reset the stream so the regular Type 1 path can re-try.\n      file.pos = fileStart;\n      warn(\"Type1Font: unable to parse CID-keyed Type 1 font.\");\n      return null;\n    }\n    this.#rawFileLength = length;\n    return data;\n  }\n\n  get numGlyphs() {\n    return this.charstrings.length + 1;\n  }\n\n  getCharset() {\n    const charset = [\".notdef\"];\n    for (const { glyphName } of this.charstrings) {\n      charset.push(glyphName);\n    }\n    return charset;\n  }\n\n  getGlyphMapping(properties) {\n    const charstrings = this.charstrings;\n\n    if (properties.composite) {\n      const charCodeToGlyphId = Object.create(null);\n      // Map CIDs directly to GIDs.\n      for (\n        let glyphId = 0, charstringsLen = charstrings.length;\n        glyphId < charstringsLen;\n        glyphId++\n      ) {\n        const charCode = properties.cMap.charCodeOf(glyphId);\n        // Add 1 because glyph 0 is duplicated.\n        charCodeToGlyphId[charCode] = glyphId + 1;\n      }\n      return charCodeToGlyphId;\n    }\n\n    const glyphNames = [\".notdef\"];\n    let builtInEncoding, glyphId;\n    for (glyphId = 0; glyphId < charstrings.length; glyphId++) {\n      glyphNames.push(charstrings[glyphId].glyphName);\n    }\n    const encoding = properties.builtInEncoding;\n    if (encoding) {\n      builtInEncoding = Object.create(null);\n      for (const charCode in encoding) {\n        glyphId = glyphNames.indexOf(encoding[charCode]);\n        if (glyphId >= 0) {\n          builtInEncoding[charCode] = glyphId;\n        }\n      }\n    }\n\n    return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);\n  }\n\n  hasGlyphId(id) {\n    if (id < 0 || id >= this.numGlyphs) {\n      return false;\n    }\n    if (id === 0) {\n      // notdef is always defined.\n      return true;\n    }\n    const glyph = this.charstrings[id - 1];\n    return glyph.charstring.length > 0;\n  }\n\n  getSeacs(charstrings) {\n    const seacMap = [];\n    for (let i = 0, ii = charstrings.length; i < ii; i++) {\n      const charstring = charstrings[i];\n      if (charstring.seac) {\n        // Offset by 1 for .notdef\n        seacMap[i + 1] = charstring.seac;\n      }\n    }\n    return seacMap;\n  }\n\n  getType2Charstrings(type1Charstrings) {\n    const type2Charstrings = [];\n    for (const type1Charstring of type1Charstrings) {\n      type2Charstrings.push(type1Charstring.charstring);\n    }\n    return type2Charstrings;\n  }\n\n  getType2Subrs(type1Subrs) {\n    let bias = 0;\n    const count = type1Subrs.length;\n    if (count < 1133) {\n      bias = 107;\n    } else if (count < 33769) {\n      bias = 1131;\n    } else {\n      bias = 32768;\n    }\n\n    // Add a bunch of empty subrs to deal with the Type2 bias\n    const type2Subrs = [];\n    let i;\n    for (i = 0; i < bias; i++) {\n      type2Subrs.push([0x0b]);\n    }\n\n    for (i = 0; i < count; i++) {\n      type2Subrs.push(type1Subrs[i]);\n    }\n\n    return type2Subrs;\n  }\n\n  wrap(name, glyphs, charstrings, subrs, properties) {\n    const cff = new CFF(this.#rawFileLength);\n    cff.header = new CFFHeader(1, 0, 4, 4);\n\n    cff.names = [name];\n\n    const topDict = new CFFTopDict();\n    // CFF strings IDs 0...390 are predefined names, so refering\n    // to entries in our own String INDEX starts at SID 391.\n    topDict.setByName(\"version\", 391);\n    topDict.setByName(\"Notice\", 392);\n    topDict.setByName(\"FullName\", 393);\n    topDict.setByName(\"FamilyName\", 394);\n    topDict.setByName(\"Weight\", 395);\n    topDict.setByName(\"Encoding\", null); // placeholder\n    topDict.setByName(\"FontMatrix\", properties.fontMatrix);\n    topDict.setByName(\"FontBBox\", properties.bbox);\n    topDict.setByName(\"charset\", null); // placeholder\n    topDict.setByName(\"CharStrings\", null); // placeholder\n    topDict.setByName(\"Private\", null); // placeholder\n    cff.topDict = topDict;\n\n    const strings = new CFFStrings();\n    strings.add(\"Version 0.11\"); // Version\n    strings.add(\"See original notice\"); // Notice\n    strings.add(name); // FullName\n    strings.add(name); // FamilyName\n    strings.add(\"Medium\"); // Weight\n    cff.strings = strings;\n\n    cff.globalSubrIndex = new CFFIndex();\n\n    const count = glyphs.length;\n    const charsetArray = [\".notdef\"];\n    for (let i = 0; i < count; i++) {\n      const { glyphName } = charstrings[i];\n      const index = CFFStandardStrings.indexOf(glyphName);\n      if (index === -1) {\n        strings.add(glyphName);\n      }\n      charsetArray.push(glyphName);\n    }\n    cff.charset = new CFFCharset(false, 0, charsetArray);\n\n    const charStringsIndex = new CFFIndex();\n    charStringsIndex.add([0x8b, 0x0e]); // .notdef\n    for (let i = 0; i < count; i++) {\n      charStringsIndex.add(glyphs[i]);\n    }\n    cff.charStrings = charStringsIndex;\n\n    const privateDict = new CFFPrivateDict();\n    privateDict.setByName(\"Subrs\", null); // placeholder\n    const fields = [\n      \"BlueValues\",\n      \"OtherBlues\",\n      \"FamilyBlues\",\n      \"FamilyOtherBlues\",\n      \"StemSnapH\",\n      \"StemSnapV\",\n      \"BlueShift\",\n      \"BlueFuzz\",\n      \"BlueScale\",\n      \"LanguageGroup\",\n      \"ExpansionFactor\",\n      \"ForceBold\",\n      \"StdHW\",\n      \"StdVW\",\n    ];\n    for (const field of fields) {\n      if (!properties.privateData.has(field)) {\n        continue;\n      }\n      const value = properties.privateData.get(field);\n      if (Array.isArray(value)) {\n        // All of the private dictionary array data in CFF must be stored as\n        // \"delta-encoded\" numbers.\n        for (let j = value.length - 1; j > 0; j--) {\n          value[j] -= value[j - 1]; // ... difference from previous value\n        }\n      }\n      privateDict.setByName(field, value);\n    }\n    cff.topDict.privateDict = privateDict;\n\n    const subrIndex = new CFFIndex();\n    for (const subr of subrs) {\n      subrIndex.add(subr);\n    }\n    privateDict.subrsIndex = subrIndex;\n\n    const compiler = new CFFCompiler(cff);\n    return compiler.compile();\n  }\n}\n\nexport { Type1Font };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  bytesToString,\n  FONT_IDENTITY_MATRIX,\n  FormatError,\n  info,\n  shadow,\n  stringToBytes,\n  warn,\n} from \"../shared/util.js\";\nimport { CFFCompiler, CFFParser } from \"./cff_parser.js\";\nimport {\n  FontFlags,\n  getVerticalPresentationForm,\n  MacStandardGlyphOrdering,\n  normalizeFontName,\n  recoverGlyphName,\n  SEAC_ANALYSIS_ENABLED,\n} from \"./fonts_utils.js\";\nimport {\n  getCharUnicodeCategory,\n  getUnicodeForGlyph,\n  getUnicodeRangeFor,\n  mapSpecialUnicodeValues,\n} from \"./unicode.js\";\nimport { getDingbatsGlyphsUnicode, getGlyphsUnicode } from \"./glyphlist.js\";\nimport {\n  getEncoding,\n  MacRomanEncoding,\n  StandardEncoding,\n  SymbolSetEncoding,\n  WinAnsiEncoding,\n  ZapfDingbatsEncoding,\n} from \"./encodings.js\";\nimport {\n  getGlyphMapForStandardFonts,\n  getNonStdFontMap,\n  getSerifFonts,\n  getStdFontMap,\n  getSupplementalGlyphMapForArialBlack,\n  getSupplementalGlyphMapForCalibri,\n} from \"./standard_fonts.js\";\nimport { GlyfTable, pruneCompositeGlyphCycles } from \"./glyf.js\";\nimport { IdentityToUnicodeMap, ToUnicodeMap } from \"./to_unicode_map.js\";\nimport { CFFFont } from \"./cff_font.js\";\nimport { compileFontInfo } from \"./obj_bin_transform_core.js\";\nimport { DataBuilder } from \"./data_builder.js\";\nimport { FontRendererFactory } from \"./font_renderer.js\";\nimport { getFontBasicMetrics } from \"./metrics.js\";\nimport { OpenTypeFileBuilder } from \"./opentype_file_builder.js\";\nimport { Stream } from \"./stream.js\";\nimport { Type1Font } from \"./type1_font.js\";\n\n// Unicode Private Use Areas:\nconst PRIVATE_USE_AREAS = [\n  [0xe000, 0xf8ff], // BMP (0)\n  [0x100000, 0x10fffd], // PUP (16)\n];\n\n// PDF Glyph Space Units are one Thousandth of a TextSpace Unit\n// except for Type 3 fonts\nconst PDF_GLYPH_SPACE_UNITS = 1000;\n\nconst EXPORT_DATA_PROPERTIES = [\n  \"ascent\",\n  \"bbox\",\n  \"black\",\n  \"bold\",\n  // \"charProcOperatorList\" is handled separately, since it's not compiled.\n  \"cssFontInfo\",\n  \"data\",\n  \"defaultVMetrics\",\n  \"defaultWidth\",\n  \"descent\",\n  \"disableFontFace\",\n  \"fallbackName\",\n  \"fontExtraProperties\",\n  \"fontMatrix\",\n  \"isInvalidPDFjsFont\",\n  \"isType3Font\",\n  \"italic\",\n  \"loadedName\",\n  \"mimetype\",\n  \"missingFile\",\n  \"name\",\n  \"remeasure\",\n  \"systemFontInfo\",\n  \"vertical\",\n];\n\nconst EXPORT_DATA_EXTRA_PROPERTIES = [\n  \"cMap\",\n  \"composite\",\n  \"defaultEncoding\",\n  \"differences\",\n  \"isMonospace\",\n  \"isSerifFont\",\n  \"isSymbolicFont\",\n  \"seacMap\",\n  \"subtype\",\n  \"toFontChar\",\n  \"toUnicode\",\n  \"type\",\n  \"vmetrics\",\n  \"widths\",\n];\n\nfunction adjustWidths(properties) {\n  if (!properties.fontMatrix) {\n    return;\n  }\n  if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) {\n    return;\n  }\n  // adjusting width to fontMatrix scale\n  const scale = 0.001 / properties.fontMatrix[0];\n  const glyphsWidths = properties.widths;\n  for (const glyph in glyphsWidths) {\n    glyphsWidths[glyph] *= scale;\n  }\n  properties.defaultWidth *= scale;\n}\n\nfunction adjustTrueTypeToUnicode(properties, isSymbolicFont, nameRecords) {\n  if (properties.isInternalFont) {\n    return;\n  }\n  if (properties.hasIncludedToUnicodeMap) {\n    return; // The font dictionary has a `ToUnicode` entry.\n  }\n  if (properties.hasEncoding) {\n    return; // The font dictionary has an `Encoding` entry.\n  }\n  if (properties.toUnicode instanceof IdentityToUnicodeMap) {\n    return;\n  }\n  if (!isSymbolicFont) {\n    return; // A non-symbolic font should default to `StandardEncoding`.\n  }\n  if (nameRecords.length === 0) {\n    return;\n  }\n\n  // Try to infer if the fallback encoding should really be `WinAnsiEncoding`.\n  if (properties.defaultEncoding === WinAnsiEncoding) {\n    return;\n  }\n  for (const r of nameRecords) {\n    if (!isWinNameRecord(r)) {\n      return; // Not Windows, hence `WinAnsiEncoding` wouldn't make sense.\n    }\n  }\n  const encoding = WinAnsiEncoding;\n\n  const toUnicode = [],\n    glyphsUnicodeMap = getGlyphsUnicode();\n  for (const charCode in encoding) {\n    const glyphName = encoding[charCode];\n    if (glyphName === \"\") {\n      continue;\n    }\n    const unicode = glyphsUnicodeMap[glyphName];\n    if (unicode === undefined) {\n      continue;\n    }\n    toUnicode[charCode] = String.fromCharCode(unicode);\n  }\n  if (toUnicode.length > 0) {\n    properties.toUnicode.amend(toUnicode);\n  }\n}\n\nfunction adjustType1ToUnicode(properties, builtInEncoding) {\n  if (properties.isInternalFont) {\n    return;\n  }\n  if (properties.hasIncludedToUnicodeMap) {\n    return; // The font dictionary has a `ToUnicode` entry.\n  }\n  if (builtInEncoding === properties.defaultEncoding) {\n    return; // No point in trying to adjust `toUnicode` if the encodings match.\n  }\n  if (properties.toUnicode instanceof IdentityToUnicodeMap) {\n    return;\n  }\n  const toUnicode = [],\n    glyphsUnicodeMap = getGlyphsUnicode();\n  for (const charCode in builtInEncoding) {\n    if (properties.hasEncoding) {\n      if (\n        properties.baseEncodingName ||\n        properties.differences[charCode] !== undefined\n      ) {\n        continue; // The font dictionary has an `Encoding`/`Differences` entry.\n      }\n    }\n    const glyphName = builtInEncoding[charCode];\n    const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);\n    if (unicode !== -1) {\n      toUnicode[charCode] = String.fromCharCode(unicode);\n    }\n  }\n  if (toUnicode.length > 0) {\n    properties.toUnicode.amend(toUnicode);\n  }\n}\n\n/**\n * NOTE: This function should only be called at the *end* of font-parsing,\n *       after e.g. `adjustType1ToUnicode` has run, to prevent any issues.\n */\nfunction amendFallbackToUnicode(properties) {\n  if (!properties.fallbackToUnicode) {\n    return;\n  }\n  if (properties.toUnicode instanceof IdentityToUnicodeMap) {\n    return;\n  }\n  const toUnicode = [];\n  for (const charCode in properties.fallbackToUnicode) {\n    if (properties.toUnicode.has(charCode)) {\n      continue; // The font dictionary has a `ToUnicode` entry.\n    }\n    toUnicode[charCode] = properties.fallbackToUnicode[charCode];\n  }\n  if (toUnicode.length > 0) {\n    properties.toUnicode.amend(toUnicode);\n  }\n}\n\nclass Glyph {\n  constructor(\n    originalCharCode,\n    fontChar,\n    unicode,\n    accent,\n    width,\n    vmetric,\n    operatorListId,\n    isSpace,\n    isInFont\n  ) {\n    this.originalCharCode = originalCharCode;\n    this.fontChar = fontChar;\n    this.unicode = unicode;\n    this.accent = accent;\n    this.width = width;\n    this.vmetric = vmetric;\n    this.operatorListId = operatorListId;\n    this.isSpace = isSpace;\n    this.isInFont = isInFont;\n  }\n\n  /**\n   * This property, which is only used by `PartialEvaluator.getTextContent`,\n   * is purposely made non-serializable.\n   * @type {Object}\n   */\n  get category() {\n    return shadow(\n      this,\n      \"category\",\n      getCharUnicodeCategory(this.unicode),\n      /* nonSerializable = */ true\n    );\n  }\n}\n\nfunction int16(b0, b1) {\n  return (b0 << 8) + b1;\n}\n\nfunction writeSignedInt16(bytes, index, value) {\n  bytes[index + 1] = value;\n  bytes[index] = value >>> 8;\n}\n\nfunction signedInt16(b0, b1) {\n  const value = (b0 << 8) + b1;\n  return value & (1 << 15) ? value - 0x10000 : value;\n}\n\nfunction writeUint32(bytes, index, value) {\n  bytes[index + 3] = value & 0xff;\n  bytes[index + 2] = value >>> 8;\n  bytes[index + 1] = value >>> 16;\n  bytes[index] = value >>> 24;\n}\n\nfunction isTrueTypeFile(file) {\n  const header = file.peekBytes(4),\n    str = bytesToString(header);\n  return str === \"\\x00\\x01\\x00\\x00\" || str === \"true\";\n}\n\nfunction isTrueTypeCollectionFile(file) {\n  const header = file.peekBytes(4);\n  return bytesToString(header) === \"ttcf\";\n}\n\nfunction isOpenTypeFile(file) {\n  const header = file.peekBytes(4);\n  return bytesToString(header) === \"OTTO\";\n}\n\nfunction isType1File(file) {\n  const header = file.peekBytes(2);\n  // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21).\n  if (header[0] === 0x25 && header[1] === 0x21) {\n    return true;\n  }\n  // ... obviously some fonts violate that part of the specification,\n  // please refer to the comment in |Type1Font| below (pfb file header).\n  if (header[0] === 0x80 && header[1] === 0x01) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Compared to other font formats, the header in CFF files is not constant\n * but contains version numbers. To reduce the possibility of misclassifying\n * font files as CFF, it's recommended to check for other font formats first.\n */\nfunction isCFFFile(file) {\n  const header = file.peekBytes(4);\n  if (\n    /* major version, [1, 255] */ header[0] >= 1 &&\n    /* minor version, [0, 255]; header[1] */\n    /* header size, [0, 255]; header[2] */\n    /* offset(0) size, [1, 4] */ header[3] >= 1 &&\n    header[3] <= 4\n  ) {\n    return true;\n  }\n  return false;\n}\n\nfunction getFontFileType(file, { type, subtype, composite }) {\n  let fileType, fileSubtype;\n\n  if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {\n    fileType = composite ? \"CIDFontType2\" : \"TrueType\";\n  } else if (isOpenTypeFile(file)) {\n    fileType = composite ? \"CIDFontType2\" : \"OpenType\";\n  } else if (isType1File(file)) {\n    if (composite) {\n      fileType = \"CIDFontType0\";\n    } else {\n      fileType = type === \"MMType1\" ? \"MMType1\" : \"Type1\";\n    }\n  } else if (isCFFFile(file)) {\n    if (composite) {\n      fileType = \"CIDFontType0\";\n      fileSubtype = \"CIDFontType0C\";\n    } else {\n      fileType = type === \"MMType1\" ? \"MMType1\" : \"Type1\";\n      fileSubtype = \"Type1C\";\n    }\n  } else {\n    warn(\"getFontFileType: Unable to detect correct font file Type/Subtype.\");\n    fileType = type;\n    fileSubtype = subtype;\n  }\n\n  return [fileType, fileSubtype];\n}\n\nfunction applyStandardFontGlyphMap(map, glyphMap) {\n  for (const charCode in glyphMap) {\n    map[+charCode] = glyphMap[charCode];\n  }\n}\n\nfunction buildToFontChar(encoding, glyphsUnicodeMap, differences) {\n  const toFontChar = [];\n  let unicode;\n  for (let i = 0, ii = encoding.length; i < ii; i++) {\n    unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap);\n    if (unicode !== -1) {\n      toFontChar[i] = unicode;\n    }\n  }\n  for (const charCode in differences) {\n    unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap);\n    if (unicode !== -1) {\n      toFontChar[+charCode] = unicode;\n    }\n  }\n  return toFontChar;\n}\n\n// Please refer to:\n//  - https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html\nfunction isMacNameRecord(r) {\n  return r.platform === 1 && r.encoding === 0 && r.language === 0;\n}\n\n// Please refer to:\n//  - https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html\n//  - https://learn.microsoft.com/en-us/typography/opentype/spec/name#windows-language-ids\nfunction isWinNameRecord(r) {\n  return r.platform === 3 && r.encoding === 1 && r.language === 0x409;\n}\n\nfunction convertCidString(charCode, cid, shouldThrow = false) {\n  switch (cid.length) {\n    case 1:\n      return cid.charCodeAt(0);\n    case 2:\n      return (cid.charCodeAt(0) << 8) | cid.charCodeAt(1);\n  }\n  const msg = `Unsupported CID string (charCode ${charCode}): \"${cid}\".`;\n  if (shouldThrow) {\n    throw new FormatError(msg);\n  }\n  warn(msg);\n  return cid;\n}\n\n/**\n * Rebuilds the char code to glyph ID map by moving all char codes to the\n * private use area. This is done to avoid issues with various problematic\n * unicode areas where either a glyph won't be drawn or is deformed by a\n * shaper.\n * @returns {Object} Two properties:\n * 'toFontChar' - maps original char codes(the value that will be read\n * from commands such as show text) to the char codes that will be used in the\n * font that we build\n * 'charCodeToGlyphId' - maps the new font char codes to glyph ids\n */\nfunction adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) {\n  const newMap = Object.create(null);\n  const toUnicodeExtraMap = new Map();\n  const toFontChar = [];\n  const usedGlyphIds = new Set();\n  let privateUseAreaIndex = 0;\n  const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0];\n  let nextAvailableFontCharCode = privateUseOffetStart;\n  let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];\n  const isInPrivateArea = code =>\n    (PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1]) ||\n    (PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1]);\n  let LIGATURE_TO_UNICODE = null;\n\n  for (const originalCharCode in charCodeToGlyphId) {\n    let glyphId = charCodeToGlyphId[originalCharCode];\n    // For missing glyphs don't create the mappings so the glyph isn't\n    // drawn.\n    if (!hasGlyph(glyphId)) {\n      continue;\n    }\n    if (nextAvailableFontCharCode > privateUseOffetEnd) {\n      privateUseAreaIndex++;\n      if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {\n        warn(\"Ran out of space in font private use area.\");\n        break;\n      }\n      nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];\n      privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];\n    }\n    const fontCharCode = nextAvailableFontCharCode++;\n    if (glyphId === 0) {\n      glyphId = newGlyphZeroId;\n    }\n\n    // Fix for bug 1778484:\n    // The charcodes are moved into a private use area to fix some rendering\n    // issues (https://github.com/mozilla/pdf.js/pull/9340) but when printing\n    // to PDF the generated font will contain wrong chars. We can avoid that by\n    // adding the unicode to the cmap and the print backend will then map the\n    // glyph ids to the correct unicode.\n    let unicode = toUnicode.get(originalCharCode);\n    if (typeof unicode === \"string\") {\n      if (unicode.length === 1) {\n        unicode = unicode.codePointAt(0);\n      } else {\n        if (!LIGATURE_TO_UNICODE) {\n          LIGATURE_TO_UNICODE = new Map();\n          // The code range [0xfb00, 0xfb4f] contains some ligature characters\n          // but not all.\n          // See https://www.compart.com/en/unicode/block/U+FB00.\n          for (let i = 0xfb00; i <= 0xfb4f; i++) {\n            const normalized = String.fromCharCode(i).normalize(\"NFKD\");\n            if (normalized.length > 1) {\n              LIGATURE_TO_UNICODE.set(normalized, i);\n            }\n          }\n        }\n        unicode = LIGATURE_TO_UNICODE.get(unicode) || unicode.codePointAt(0);\n      }\n    }\n    if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) {\n      toUnicodeExtraMap.set(unicode, glyphId);\n      usedGlyphIds.add(glyphId);\n    }\n\n    newMap[fontCharCode] = glyphId;\n    toFontChar[originalCharCode] = fontCharCode;\n  }\n  return {\n    toFontChar,\n    charCodeToGlyphId: newMap,\n    toUnicodeExtraMap,\n    nextAvailableFontCharCode,\n  };\n}\n\nfunction getRanges(glyphs, toUnicodeExtraMap, numGlyphs) {\n  // Array.sort() sorts by characters, not numerically, so convert to an\n  // array of characters.\n  const codes = [];\n  for (const charCode in glyphs) {\n    // Remove an invalid glyph ID mappings to make OTS happy.\n    if (glyphs[charCode] >= numGlyphs) {\n      continue;\n    }\n    codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] });\n  }\n  if (toUnicodeExtraMap) {\n    for (const [unicode, glyphId] of toUnicodeExtraMap) {\n      if (glyphId >= numGlyphs) {\n        continue;\n      }\n      codes.push({ fontCharCode: unicode, glyphId });\n    }\n  }\n  // Some fonts have zero glyphs and are used only for text selection, but\n  // there needs to be at least one to build a valid cmap table.\n  if (codes.length === 0) {\n    codes.push({ fontCharCode: 0, glyphId: 0 });\n  }\n  codes.sort((a, b) => a.fontCharCode - b.fontCharCode);\n\n  // Split the sorted codes into ranges.\n  const ranges = [];\n  const length = codes.length;\n  for (let n = 0; n < length; ) {\n    const start = codes[n].fontCharCode;\n    const codeIndices = [codes[n].glyphId];\n    ++n;\n    let end = start;\n    while (n < length && end + 1 === codes[n].fontCharCode) {\n      codeIndices.push(codes[n].glyphId);\n      ++end;\n      ++n;\n      if (end === 0xffff) {\n        break;\n      }\n    }\n    ranges.push([start, end, codeIndices]);\n  }\n\n  return ranges;\n}\n\nfunction createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) {\n  const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs);\n  const hasNonBmp = ranges.at(-1)[1] > 0xffff;\n\n  let i, ii, j, jj;\n  for (i = ranges.length - 1; i >= 0; --i) {\n    if (ranges[i][0] <= 0xffff) {\n      break;\n    }\n  }\n  const bmpLength = i + 1;\n\n  if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) {\n    ranges[i][1] = 0xfffe;\n  }\n  const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0;\n  const segCount = bmpLength + trailingRangesCount;\n  const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);\n\n  // Fill up the 4 parallel arrays describing the segments.\n  const segmentsLength = bmpLength * 2 + trailingRangesCount * 2;\n  const startCount = new DataBuilder({ exactLength: segmentsLength }),\n    endCount = new DataBuilder({ exactLength: segmentsLength }),\n    idDeltas = new DataBuilder({ exactLength: segmentsLength }),\n    idRangeOffsets = new DataBuilder({ exactLength: segmentsLength }),\n    glyphsIds = new DataBuilder({});\n  let bias = 0;\n  // The \"length\" and \"idRangeOffset\" fields of a format 4 sub-table are\n  // 16-bit, hence fonts with a large/sparse glyph mapping cannot be encoded\n  // that way; when that happens we rely on the format 12 sub-table instead\n  // (see below) and skip the format 4 one altogether.\n  let format4Overflow = false;\n\n  for (i = 0, ii = bmpLength; i < ii; i++) {\n    const [start, end, codes] = ranges[i];\n    startCount.setInt16(start);\n    endCount.setInt16(end);\n    let contiguous = true;\n    for (j = 1, jj = codes.length; j < jj; ++j) {\n      if (codes[j] !== codes[j - 1] + 1) {\n        contiguous = false;\n        break;\n      }\n    }\n    if (!contiguous) {\n      const offset = (segCount - i) * 2 + bias * 2;\n      bias += end - start + 1;\n\n      idDeltas.skip(2); // Skip redundant \"\\x00\\x00\"\n      if (offset > 0xffff) {\n        // The sub-table is discarded below, so just write a placeholder that\n        // fits in the 16-bit \"idRangeOffset\" field.\n        format4Overflow = true;\n        idRangeOffsets.skip(2);\n      } else {\n        idRangeOffsets.setInt16(offset);\n      }\n\n      for (j = 0, jj = codes.length; j < jj; ++j) {\n        glyphsIds.setInt16(codes[j]);\n      }\n    } else {\n      const startCode = codes[0];\n\n      idDeltas.setInt16((startCode - start) & 0xffff);\n      idRangeOffsets.skip(2); // Skip redundant \"\\x00\\x00\"\n    }\n  }\n\n  if (trailingRangesCount > 0) {\n    endCount.setArray([0xff, 0xff]);\n    startCount.setArray([0xff, 0xff]);\n    idDeltas.setArray([0x00, 0x01]);\n    idRangeOffsets.skip(2); // Skip redundant \"\\x00\\x00\"\n  }\n\n  const format314 = new DataBuilder({\n    exactLength:\n      12 +\n      startCount.length +\n      endCount.length +\n      idDeltas.length +\n      idRangeOffsets.length +\n      glyphsIds.length,\n  });\n  format314.skip(2); // language, skip redundant \"\\x00\\x00\"\n  format314.setInt16(2 * segCount);\n  format314.setInt16(searchParams.range);\n  format314.setInt16(searchParams.entry);\n  format314.setInt16(searchParams.rangeShift);\n  format314.setArray(endCount.data);\n  format314.skip(2); // Skip redundant \"\\x00\\x00\"\n  format314.setArray(startCount.data);\n  format314.setArray(idDeltas.data);\n  format314.setArray(idRangeOffsets.data);\n  format314.setArray(glyphsIds.data);\n\n  // The format 4 (3, 1) sub-table can only be used when it fits within its\n  // 16-bit \"length\"/\"idRangeOffset\" fields. A format 12 (3, 10) sub-table is\n  // required for characters outside the BMP, and also acts as a fallback when\n  // the format 4 one overflows (note that format 12 covers the whole mapping,\n  // so dropping the redundant format 4 sub-table is fine).\n  const useFormat4 = !format4Overflow && format314.length + 4 <= 0xffff;\n  const useFormat12 = hasNonBmp || !useFormat4;\n  const numTables = (useFormat4 ? 1 : 0) + (useFormat12 ? 1 : 0);\n\n  let format31012 = null,\n    header31012 = null;\n  if (useFormat12) {\n    format31012 = new DataBuilder({});\n    for (const range of ranges) {\n      let start = range[0];\n      const codes = range[2];\n      let code = codes[0];\n      for (j = 1, jj = codes.length; j < jj; ++j) {\n        if (codes[j] !== codes[j - 1] + 1) {\n          const end = range[0] + j - 1;\n          format31012.setInt32(start); // startCharCode\n          format31012.setInt32(end); // endCharCode\n          format31012.setInt32(code); // startGlyphID\n          start = end + 1;\n          code = codes[j];\n        }\n      }\n      format31012.setInt32(start); // startCharCode\n      format31012.setInt32(range[1]); // endCharCode\n      format31012.setInt32(code); // startGlyphID\n    }\n\n    header31012 = new DataBuilder({ exactLength: 16 });\n    header31012.setArray([0x00, 0x0c]); // format\n    header31012.skip(2); // reserved, skip redundant \"\\x00\\x00\"\n    header31012.setInt32(format31012.length + 16); // length\n    header31012.skip(4); // language, skip redundant \"\\x00\\x00\\x00\\x00\"\n    header31012.setInt32(format31012.length / 12); // nGroups\n  }\n\n  // Header (\"version\" + \"numTables\") followed by one encoding record per\n  // sub-table; the sub-tables themselves are appended afterwards.\n  const headerLength = 4 + numTables * 8;\n  const format4Length = useFormat4 ? 4 + format314.length : 0;\n\n  const cmap = new DataBuilder({ exactLength: headerLength });\n  cmap.skip(2); // version, skip redundant \"\\x00\\x00\"\n  cmap.setInt16(numTables); // numTables\n  let tableOffset = headerLength;\n  if (useFormat4) {\n    cmap.setArray([0x00, 0x03]); // platformID\n    cmap.setArray([0x00, 0x01]); // encodingID\n    cmap.setInt32(tableOffset); // start of the (3, 1) sub-table\n    tableOffset += format4Length;\n  }\n  if (useFormat12) {\n    cmap.setArray([0x00, 0x03]); // platformID\n    cmap.setArray([0x00, 0x0a]); // encodingID\n    cmap.setInt32(tableOffset); // start of the (3, 10) sub-table\n  }\n\n  const table = new DataBuilder({\n    exactLength:\n      cmap.length +\n      format4Length +\n      (header31012?.length ?? 0) +\n      (format31012?.length ?? 0),\n  });\n  table.setArray(cmap.data);\n  if (useFormat4) {\n    table.setArray([0x00, 0x04]); // format\n    table.setInt16(format314.length + 4); // length\n    table.setArray(format314.data);\n  }\n  if (useFormat12) {\n    table.setArray(header31012.data);\n    table.setArray(format31012.data);\n  }\n  return table.data;\n}\n\nfunction validateOS2Table(os2, file) {\n  file.pos = (file.start || 0) + os2.offset;\n  const version = file.getUint16();\n  // https://learn.microsoft.com/en-us/typography/opentype/spec/os2\n  const minLength = [78, 86, 96, 96, 96, 100][version];\n  if (minLength === undefined || os2.length < minLength) {\n    return false;\n  }\n  // TODO verify all OS/2 tables fields, but currently we validate only those\n  // that give us issues\n  file.skip(60); // skipping type, misc sizes, panose, unicode ranges\n  const selection = file.getUint16();\n  if (version < 4 && selection & 0x0300) {\n    return false;\n  }\n  const firstChar = file.getUint16();\n  const lastChar = file.getUint16();\n  if (firstChar > lastChar) {\n    return false;\n  }\n  file.skip(6); // skipping sTypoAscender/Descender/LineGap\n  const usWinAscent = file.getUint16();\n  if (usWinAscent === 0) {\n    // makes font unreadable by windows\n    return false;\n  }\n\n  // OS/2 appears to be valid, resetting some fields\n  os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0\n  return true;\n}\n\nfunction createOS2Table(properties, charstrings, override) {\n  override ||= {\n    unitsPerEm: 0,\n    yMax: 0,\n    yMin: 0,\n    ascent: 0,\n    descent: 0,\n  };\n\n  let ulUnicodeRange1 = 0;\n  let ulUnicodeRange2 = 0;\n  let ulUnicodeRange3 = 0;\n  let ulUnicodeRange4 = 0;\n\n  let firstCharIndex = null;\n  let lastCharIndex = 0;\n  let position = -1;\n\n  if (charstrings) {\n    for (let code in charstrings) {\n      code |= 0;\n      if (firstCharIndex > code || !firstCharIndex) {\n        firstCharIndex = code;\n      }\n      if (lastCharIndex < code) {\n        lastCharIndex = code;\n      }\n\n      position = getUnicodeRangeFor(code, position);\n      if (position < 32) {\n        ulUnicodeRange1 |= 1 << position;\n      } else if (position < 64) {\n        ulUnicodeRange2 |= 1 << (position - 32);\n      } else if (position < 96) {\n        ulUnicodeRange3 |= 1 << (position - 64);\n      } else if (position < 123) {\n        ulUnicodeRange4 |= 1 << (position - 96);\n      } else {\n        throw new FormatError(\n          \"Unicode ranges Bits > 123 are reserved for internal usage\"\n        );\n      }\n    }\n    if (lastCharIndex > 0xffff) {\n      // OS2 only supports a 16 bit int. The spec says if supplementary\n      // characters are used the field should just be set to 0xFFFF.\n      lastCharIndex = 0xffff;\n    }\n  } else {\n    // TODO\n    firstCharIndex = 0;\n    lastCharIndex = 255;\n  }\n\n  const bbox = properties.bbox || [0, 0, 0, 0];\n  const unitsPerEm =\n    override.unitsPerEm ||\n    (properties.fontMatrix\n      ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs))\n      : 1000);\n\n  // if the font units differ to the PDF glyph space units\n  // then scale up the values\n  const scale = properties.ascentScaled\n    ? 1.0\n    : unitsPerEm / PDF_GLYPH_SPACE_UNITS;\n\n  const typoAscent =\n    override.ascent || Math.round(scale * (properties.ascent || bbox[3]));\n  let typoDescent =\n    override.descent || Math.round(scale * (properties.descent || bbox[1]));\n  if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {\n    typoDescent = -typoDescent; // fixing incorrect descent\n  }\n  const winAscent = override.yMax || typoAscent;\n  const winDescent = -override.yMin || -typoDescent;\n\n  const os2 = new DataBuilder({ exactLength: 96 });\n  os2.setArray([0x00, 0x03]); // version\n  os2.setArray([0x02, 0x24]); // xAvgCharWidth\n  os2.setArray([0x01, 0xf4]); // usWeightClass\n  os2.setArray([0x00, 0x05]); // usWidthClass\n  os2.skip(2); // fstype (0 to improve browser compatibility), skip redundant \"\\x00\\x00\"\n  os2.setArray([0x02, 0x8a]); // ySubscriptXSize\n  os2.setArray([0x02, 0xbb]); // ySubscriptYSize\n  os2.skip(2); // ySubscriptXOffset, skip redundant \"\\x00\\x00\"\n  os2.setArray([0x00, 0x8c]); // ySubscriptYOffset\n  os2.setArray([0x02, 0x8a]); // ySuperScriptXSize\n  os2.setArray([0x02, 0xbb]); // ySuperScriptYSize\n  os2.skip(2); // ySuperScriptXOffset, skip redundant \"\\x00\\x00\"\n  os2.setArray([0x01, 0xdf]); // ySuperScriptYOffset\n  os2.setArray([0x00, 0x31]); // yStrikeOutSize\n  os2.setArray([0x01, 0x02]); // yStrikeOutPosition\n  os2.skip(2); // sFamilyClass, skip redundant \"\\x00\\x00\"\n  os2.setArray([\n    0x00,\n    0x00,\n    0x06,\n    properties.fixedPitch ? 0x09 : 0x00,\n    0x00,\n    0x00,\n    0x00,\n    0x00,\n    0x00,\n    0x00,\n  ]); // Panose\n  os2.setInt32(ulUnicodeRange1); // ulUnicodeRange1 (Bits 0-31)\n  os2.setInt32(ulUnicodeRange2); // ulUnicodeRange2 (Bits 32-63)\n  os2.setInt32(ulUnicodeRange3); // ulUnicodeRange3 (Bits 64-95)\n  os2.setInt32(ulUnicodeRange4); // ulUnicodeRange4 (Bits 96-127)\n  os2.setArray([0x2a, 0x32, 0x31, 0x2a]); // achVendID\n  os2.setInt16(properties.italicAngle ? 1 : 0); // fsSelection\n  os2.setInt16(firstCharIndex || properties.firstChar); // usFirstCharIndex\n  os2.setInt16(lastCharIndex || properties.lastChar); // usLastCharIndex\n  os2.setInt16(typoAscent); // sTypoAscender\n  os2.setInt16(typoDescent); // sTypoDescender\n  os2.setArray([0x00, 0x64]); // sTypoLineGap (7%-10% of the unitsPerEM value)\n  os2.setInt16(winAscent); // usWinAscent\n  os2.setInt16(winDescent); // usWinDescent\n  os2.skip(\n    4 + // ulCodePageRange1 (Bits 0-31), skip redundant \"\\x00\\x00\\x00\\x00\"\n      4 // ulCodePageRange2 (Bits 32-63), skip redundant \"\\x00\\x00\\x00\\x00\"\n  );\n  os2.setInt16(properties.xHeight); // sxHeight\n  os2.setInt16(properties.capHeight); // sCapHeight\n  os2.skip(2); // usDefaultChar, skip redundant \"\\x00\\x00\"\n  os2.setInt16(firstCharIndex || properties.firstChar); // usBreakChar\n  os2.setArray([0x00, 0x03]); // usMaxContext\n  return os2.data;\n}\n\nfunction createPostTable(properties) {\n  const post = new DataBuilder({ exactLength: 32 });\n  post.setArray([0x00, 0x03, 0x00, 0x00]); // Version number\n  post.setInt32(Math.floor(properties.italicAngle * 2 ** 16)); // italicAngle\n  post.skip(\n    2 + // underlinePosition, skip redundant \"\\x00\\x00\"\n      2 // underlineThickness, skip redundant \"\\x00\\x00\"\n  );\n  post.setInt32(properties.fixedPitch ? 1 : 0); // isFixedPitch\n  post.skip(\n    4 + // minMemType42, skip redundant \"\\x00\\x00\\x00\\x00\"\n      4 + // maxMemType42, skip redundant \"\\x00\\x00\\x00\\x00\"\n      4 + // minMemType1, skip redundant \"\\x00\\x00\\x00\\x00\"\n      4 // maxMemType1, skip redundant \"\\x00\\x00\\x00\\x00\"\n  );\n  return post.data;\n}\n\nfunction createPostscriptName(name) {\n  // See https://docs.microsoft.com/en-us/typography/opentype/spec/recom#name.\n  return name.replaceAll(/[^\\x21-\\x7E]|[[\\](){}<>/%]/g, \"\").slice(0, 63);\n}\n\nfunction createNameTable(name, proto) {\n  proto ||= [[], []]; // no strings and unicode strings\n\n  const strings = [\n    proto[0][0] || \"Original licence\", // 0.Copyright\n    proto[0][1] || name, // 1.Font family\n    proto[0][2] || \"Unknown\", // 2.Font subfamily (font weight)\n    proto[0][3] || \"uniqueID\", // 3.Unique ID\n    proto[0][4] || name, // 4.Full font name\n    proto[0][5] || \"Version 0.11\", // 5.Version\n    proto[0][6] || createPostscriptName(name), // 6.Postscript name\n    proto[0][7] || \"Unknown\", // 7.Trademark\n    proto[0][8] || \"Unknown\", // 8.Manufacturer\n    proto[0][9] || \"Unknown\", // 9.Designer\n  ];\n  const stringsBytes = strings.map(s => stringToBytes(s));\n\n  // Mac want 1-byte per character strings while Windows want\n  // 2-bytes per character, so duplicate the names table\n  const stringsUnicodeBytes = new Array(strings.length);\n  let i, ii, j, jj, str;\n  for (i = 0, ii = strings.length; i < ii; i++) {\n    str = proto[1][i] || strings[i];\n\n    const strUnicode = new DataBuilder({\n      exactLength: str.length * 2,\n    });\n    for (j = 0, jj = str.length; j < jj; j++) {\n      strUnicode.setInt16(str.charCodeAt(j));\n    }\n    stringsUnicodeBytes[i] = strUnicode.data;\n  }\n\n  const namesBytes = [stringsBytes, stringsUnicodeBytes];\n  const platformsBytes = [\n    [0x00, 0x01],\n    [0x00, 0x03],\n  ];\n  const encodingsBytes = [\n    [0x00, 0x00],\n    [0x00, 0x01],\n  ];\n  const languagesBytes = [\n    [0x00, 0x00],\n    [0x04, 0x09],\n  ];\n\n  // Build the name records field\n  const nameRecords = [];\n  let strOffset = 0;\n  for (i = 0, ii = platformsBytes.length; i < ii; i++) {\n    const strs = namesBytes[i];\n    for (j = 0, jj = strs.length; j < jj; j++) {\n      str = strs[j];\n      const nameRecord = new DataBuilder({\n        exactLength:\n          6 +\n          platformsBytes[i].length +\n          encodingsBytes[i].length +\n          languagesBytes[i].length,\n      });\n      nameRecord.setArray(platformsBytes[i]); // platform ID\n      nameRecord.setArray(encodingsBytes[i]); // encoding ID\n      nameRecord.setArray(languagesBytes[i]); // language ID\n      nameRecord.setInt16(j); // name ID\n      nameRecord.setInt16(str.length);\n      nameRecord.setInt16(strOffset);\n\n      nameRecords.push(nameRecord.data);\n      strOffset += str.length;\n    }\n  }\n\n  const namesRecordCount = stringsBytes.length * platformsBytes.length;\n  const nameTable = new DataBuilder({\n    exactLength:\n      6 +\n      Math.sumPrecise(nameRecords.map(arr => arr.length)) +\n      Math.sumPrecise(stringsBytes.map(arr => arr.length)) +\n      Math.sumPrecise(stringsUnicodeBytes.map(arr => arr.length)),\n  });\n  nameTable.skip(2); // format, skip redundant \"\\x00\\x00\"\n  nameTable.setInt16(namesRecordCount); // Number of names Record\n  nameTable.setInt16(namesRecordCount * 12 + 6); // Storage\n  for (const arr of nameRecords) {\n    nameTable.setArray(arr);\n  }\n  for (const arr of stringsBytes) {\n    nameTable.setArray(arr);\n  }\n  for (const arr of stringsUnicodeBytes) {\n    nameTable.setArray(arr);\n  }\n  return nameTable.data;\n}\n\n/**\n * 'Font' is the class the outside world should use, it encapsulate all the font\n * decoding logics whatever type it is (assuming the font type is supported).\n */\nclass Font {\n  #charsCache = new Map();\n\n  #glyphCache = new Map();\n\n  charProcOperatorList;\n\n  constructor(name, file, properties, evaluatorOptions) {\n    this.name = name;\n    this.psName = null;\n    this.mimetype = null;\n    this.disableFontFace = evaluatorOptions.disableFontFace;\n    this.fontExtraProperties = evaluatorOptions.fontExtraProperties;\n\n    this.loadedName = properties.loadedName;\n    this.isType3Font = properties.isType3Font;\n    this.missingFile = false;\n    this.cssFontInfo = properties.cssFontInfo;\n\n    let isSerifFont = !!(properties.flags & FontFlags.Serif);\n    // Fallback to checking the font name, in order to improve text-selection,\n    // since the /Flags-entry is often wrong (fixes issue13845.pdf).\n    if (!isSerifFont && !properties.isSimulatedFlags) {\n      const stdFontMap = getStdFontMap(),\n        nonStdFontMap = getNonStdFontMap(),\n        serifFonts = getSerifFonts();\n      for (const namePart of name.split(\"+\")) {\n        let fontName = normalizeFontName(namePart);\n        fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;\n        fontName = fontName.split(\"-\", 1)[0];\n        if (serifFonts[fontName]) {\n          isSerifFont = true;\n          break;\n        }\n      }\n    }\n    this.isSerifFont = isSerifFont;\n\n    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);\n\n    let { type, subtype } = properties;\n    this.type = type;\n    this.subtype = subtype;\n    this.systemFontInfo = properties.systemFontInfo;\n\n    const matches = name.match(/^InvalidPDFjsFont_(.*)_\\d+$/);\n    this.isInvalidPDFjsFont = !!matches;\n    if (this.isInvalidPDFjsFont) {\n      this.fallbackName = matches[1];\n    } else if (this.isMonospace) {\n      this.fallbackName = \"monospace\";\n    } else if (this.isSerifFont) {\n      this.fallbackName = \"serif\";\n    } else {\n      this.fallbackName = \"sans-serif\";\n    }\n\n    if (this.systemFontInfo?.guessFallback) {\n      // Once the fallback name is guessed, we don't want to guess it again.\n      this.systemFontInfo.guessFallback = false;\n      this.systemFontInfo.css += `,${this.fallbackName}`;\n    }\n\n    this.differences = properties.differences;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.composite = properties.composite;\n    this.cMap = properties.cMap;\n    this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS;\n    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;\n    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;\n    this.lineHeight = this.ascent - this.descent;\n    this.fontMatrix = properties.fontMatrix;\n    this.bbox = properties.bbox;\n    this.defaultEncoding = properties.defaultEncoding;\n\n    this.toUnicode = properties.toUnicode;\n    this.toFontChar = [];\n\n    if (properties.type === \"Type3\") {\n      for (let charCode = 0; charCode < 256; charCode++) {\n        this.toFontChar[charCode] =\n          this.differences[charCode] || properties.defaultEncoding[charCode];\n      }\n      return;\n    }\n\n    this.cidEncoding = properties.cidEncoding || \"\";\n    this.vertical = !!properties.vertical;\n    if (this.vertical) {\n      this.vmetrics = properties.vmetrics;\n      this.defaultVMetrics = properties.defaultVMetrics;\n    }\n\n    if (!file || file.isEmpty) {\n      if (file) {\n        // Some bad PDF generators will include empty font files,\n        // attempting to recover by assuming that no file exists.\n        warn('Font file is empty in \"' + name + '\" (' + this.loadedName + \")\");\n      }\n      this.fallbackToSystemFont(properties);\n      return;\n    }\n\n    // Parse the font file to determine the correct type/subtype, rather than\n    // relying on the (often incorrect) data in the font dictionary; (see e.g.\n    //  issue6782.pdf, issue7598.pdf, and issue9949.pdf).\n    [type, subtype] = getFontFileType(file, properties);\n\n    if (type !== this.type || subtype !== this.subtype) {\n      info(\n        \"Inconsistent font file Type/SubType, expected: \" +\n          `${this.type}/${this.subtype} but found: ${type}/${subtype}.`\n      );\n    }\n\n    let data;\n    try {\n      switch (type) {\n        case \"MMType1\":\n          info(\"MMType1 font (\" + name + \"), falling back to Type1.\");\n        /* falls through */\n        case \"Type1\":\n        case \"CIDFontType0\":\n          this.mimetype = \"font/opentype\";\n\n          const cff =\n            subtype === \"Type1C\" || subtype === \"CIDFontType0C\"\n              ? new CFFFont(file, properties)\n              : new Type1Font(name, file, properties);\n\n          adjustWidths(properties);\n\n          // Wrap the CFF data inside an OTF font file\n          data = this.convert(name, cff, properties);\n          break;\n\n        case \"OpenType\":\n        case \"TrueType\":\n        case \"CIDFontType2\":\n          this.mimetype = \"font/opentype\";\n\n          // Repair the TrueType file. It is can be damaged in the point of\n          // view of the sanitizer\n          data = this.checkAndRepair(name, file, properties);\n\n          adjustWidths(properties);\n\n          if (this.isOpenType) {\n            type = \"OpenType\";\n          }\n          break;\n\n        default:\n          throw new FormatError(`Font ${type} is not supported`);\n      }\n    } catch (e) {\n      warn(e);\n      this.fallbackToSystemFont(properties);\n      return;\n    }\n\n    amendFallbackToUnicode(properties);\n    this.data = data;\n\n    // Transfer some properties again that could change during font conversion\n    this.type = type;\n    this.subtype = subtype;\n    this.fontMatrix = properties.fontMatrix;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.toUnicode = properties.toUnicode;\n    this.seacMap = properties.seacMap;\n  }\n\n  get renderer() {\n    const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);\n    return shadow(this, \"renderer\", renderer);\n  }\n\n  #getExportData(props) {\n    const data = Object.create(null);\n    for (const prop of props) {\n      const value = this[prop];\n      // Ignore properties that haven't been explicitly set.\n      if (value !== undefined) {\n        data[prop] = value;\n      }\n    }\n    return data;\n  }\n\n  exportData() {\n    return {\n      buffer: compileFontInfo(this.#getExportData(EXPORT_DATA_PROPERTIES)),\n      charProcOperatorList: this.charProcOperatorList,\n      extra: this.fontExtraProperties\n        ? this.#getExportData(EXPORT_DATA_EXTRA_PROPERTIES)\n        : undefined,\n    };\n  }\n\n  fallbackToSystemFont(properties) {\n    this.missingFile = true;\n    // The file data is not specified. Trying to fix the font name\n    // to be used with the canvas.font.\n    const { name, type } = this;\n    let fontName = normalizeFontName(name);\n    const stdFontMap = getStdFontMap(),\n      nonStdFontMap = getNonStdFontMap();\n    const isStandardFont = !!stdFontMap[fontName];\n    const isMappedToStandardFont = !!(\n      nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]\n    );\n\n    fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;\n\n    const fontBasicMetricsMap = getFontBasicMetrics();\n    const metrics = fontBasicMetricsMap[fontName];\n    if (metrics) {\n      if (isNaN(this.ascent)) {\n        this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS;\n      }\n      if (isNaN(this.descent)) {\n        this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS;\n      }\n      if (isNaN(this.capHeight)) {\n        this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS;\n      }\n    }\n\n    this.bold = /bold/i.test(fontName);\n    this.italic = /oblique|italic/i.test(fontName);\n\n    // Use 'name' instead of 'fontName' here because the original\n    // name ArialBlack for example will be replaced by Helvetica.\n    this.black = /Black/.test(name);\n\n    // Use 'name' instead of 'fontName' here because the original\n    // name ArialNarrow for example will be replaced by Helvetica.\n    const isNarrow = /Narrow/.test(name);\n\n    // if at least one width is present, remeasure all chars when exists\n    this.remeasure =\n      (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0;\n    if (\n      (isStandardFont || isMappedToStandardFont) &&\n      type === \"CIDFontType2\" &&\n      this.cidEncoding.startsWith(\"Identity-\")\n    ) {\n      const cidToGidMap = properties.cidToGidMap;\n      // Standard fonts might be embedded as CID font without glyph mapping.\n      // Building one based on GlyphMapForStandardFonts.\n      const map = [];\n      applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts());\n\n      if (/Arial-?Black/i.test(name)) {\n        applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack());\n      } else if (/Calibri/i.test(name)) {\n        applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri());\n      }\n\n      // Always update the glyph mapping with the `cidToGidMap` when it exists\n      // (fixes issue12418_reduced.pdf).\n      if (cidToGidMap) {\n        for (const charCode in map) {\n          const cid = map[charCode];\n          if (cidToGidMap[cid] !== undefined) {\n            map[+charCode] = cidToGidMap[cid];\n          }\n        }\n        // When the /CIDToGIDMap is \"incomplete\", fallback to the included\n        // /ToUnicode-map regardless of its encoding (fixes issue11915.pdf).\n        if (\n          cidToGidMap.length !== this.toUnicode.length &&\n          properties.hasIncludedToUnicodeMap &&\n          this.toUnicode instanceof IdentityToUnicodeMap\n        ) {\n          this.toUnicode.forEach(function (charCode, unicodeCharCode) {\n            const cid = map[charCode];\n            if (cidToGidMap[cid] === undefined) {\n              map[+charCode] = unicodeCharCode;\n            }\n          });\n        }\n      }\n\n      if (!(this.toUnicode instanceof IdentityToUnicodeMap)) {\n        this.toUnicode.forEach(function (charCode, unicodeCharCode) {\n          map[+charCode] = unicodeCharCode;\n        });\n      }\n      this.toFontChar = map;\n      this.toUnicode = new ToUnicodeMap(map);\n    } else if (/Symbol/i.test(fontName)) {\n      this.toFontChar = buildToFontChar(\n        SymbolSetEncoding,\n        getGlyphsUnicode(),\n        this.differences\n      );\n    } else if (/Dingbats/i.test(fontName)) {\n      this.toFontChar = buildToFontChar(\n        ZapfDingbatsEncoding,\n        getDingbatsGlyphsUnicode(),\n        this.differences\n      );\n    } else if (isStandardFont || isMappedToStandardFont) {\n      const map = buildToFontChar(\n        this.defaultEncoding,\n        getGlyphsUnicode(),\n        this.differences\n      );\n\n      if (\n        type === \"CIDFontType2\" &&\n        !this.cidEncoding.startsWith(\"Identity-\") &&\n        !(this.toUnicode instanceof IdentityToUnicodeMap)\n      ) {\n        this.toUnicode.forEach(function (charCode, unicodeCharCode) {\n          map[+charCode] = unicodeCharCode;\n        });\n      }\n      this.toFontChar = map;\n    } else {\n      const glyphsUnicodeMap = getGlyphsUnicode();\n      const map = [];\n      this.toUnicode.forEach((charCode, unicodeCharCode) => {\n        if (!this.composite) {\n          const glyphName =\n            this.differences[charCode] || this.defaultEncoding[charCode];\n          const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);\n          if (unicode !== -1) {\n            unicodeCharCode = unicode;\n          }\n        }\n        map[+charCode] = unicodeCharCode;\n      });\n\n      // Attempt to improve the glyph mapping for (some) composite fonts that\n      // appear to lack meaningful ToUnicode data.\n      if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) {\n        if (/Tahoma|Verdana/i.test(name)) {\n          // Fixes issue15719.pdf and issue11242_reduced.pdf.\n          applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts());\n        }\n      }\n      this.toFontChar = map;\n    }\n\n    amendFallbackToUnicode(properties);\n    this.loadedName = fontName.split(\"-\", 1)[0];\n  }\n\n  checkAndRepair(name, font, properties) {\n    const VALID_TABLES = [\n      \"OS/2\",\n      \"cmap\",\n      \"head\",\n      \"hhea\",\n      \"hmtx\",\n      \"maxp\",\n      \"name\",\n      \"post\",\n      \"loca\",\n      \"glyf\",\n      \"fpgm\",\n      \"prep\",\n      \"cvt \",\n      \"CFF \",\n    ];\n\n    function readTables(file, numTables) {\n      const tables = Object.create(null);\n      tables[\"OS/2\"] = null;\n      tables.cmap = null;\n      tables.head = null;\n      tables.hhea = null;\n      tables.hmtx = null;\n      tables.maxp = null;\n      tables.name = null;\n      tables.post = null;\n\n      for (let i = 0; i < numTables; i++) {\n        const table = readTableEntry(file);\n        if (!VALID_TABLES.includes(table.tag)) {\n          continue; // skipping table if it's not a required or optional table\n        }\n        if (table.length === 0) {\n          continue; // skipping empty tables\n        }\n        tables[table.tag] = table;\n      }\n      return tables;\n    }\n\n    function readTableEntry(file) {\n      const tag = file.getString(4);\n\n      const checksum = file.getInt32() >>> 0;\n      const offset = file.getInt32() >>> 0;\n      const length = file.getInt32() >>> 0;\n\n      // Read the table associated data\n      const previousPosition = file.pos;\n      file.pos = file.start || 0;\n      file.skip(offset);\n      const data = file.getBytes(length);\n      file.pos = previousPosition;\n\n      if (tag === \"head\") {\n        // clearing checksum adjustment\n        data[8] = data[9] = data[10] = data[11] = 0;\n        data[17] |= 0x20; // Set font optimized for cleartype flag.\n      }\n      // The \"CFF \" table may be replaced completely, hence its data shouldn't\n      // need to be read and/or modified piecewise through a `DataView`.\n      const view =\n        tag === \"CFF \"\n          ? null\n          : new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n      return {\n        tag,\n        checksum,\n        length,\n        offset,\n        data,\n        view,\n      };\n    }\n\n    function readOpenTypeHeader(ttf) {\n      return {\n        version: ttf.getString(4),\n        numTables: ttf.getUint16(),\n        searchRange: ttf.getUint16(),\n        entrySelector: ttf.getUint16(),\n        rangeShift: ttf.getUint16(),\n      };\n    }\n\n    function readTrueTypeCollectionHeader(ttc) {\n      const ttcTag = ttc.getString(4);\n      assert(ttcTag === \"ttcf\", \"Must be a TrueType Collection font.\");\n\n      const majorVersion = ttc.getUint16();\n      const minorVersion = ttc.getUint16();\n      const numFonts = ttc.getInt32() >>> 0;\n      const offsetTable = [];\n      for (let i = 0; i < numFonts; i++) {\n        offsetTable.push(ttc.getInt32() >>> 0);\n      }\n\n      const header = {\n        ttcTag,\n        majorVersion,\n        minorVersion,\n        numFonts,\n        offsetTable,\n      };\n      switch (majorVersion) {\n        case 1:\n          return header;\n        case 2:\n          header.dsigTag = ttc.getInt32() >>> 0;\n          header.dsigLength = ttc.getInt32() >>> 0;\n          header.dsigOffset = ttc.getInt32() >>> 0;\n          return header;\n      }\n      throw new FormatError(\n        `Invalid TrueType Collection majorVersion: ${majorVersion}.`\n      );\n    }\n\n    function readTrueTypeCollectionData(ttc, fontName) {\n      const { numFonts, offsetTable } = readTrueTypeCollectionHeader(ttc);\n      const fontNameParts = fontName.split(\"+\");\n      let fallbackData;\n\n      for (let i = 0; i < numFonts; i++) {\n        ttc.pos = (ttc.start || 0) + offsetTable[i];\n        const potentialHeader = readOpenTypeHeader(ttc);\n        const potentialTables = readTables(ttc, potentialHeader.numTables);\n\n        if (!potentialTables.name) {\n          throw new FormatError(\n            'TrueType Collection font must contain a \"name\" table.'\n          );\n        }\n        const [nameTable] = readNameTable(potentialTables.name);\n\n        for (let j = 0, jj = nameTable.length; j < jj; j++) {\n          for (let k = 0, kk = nameTable[j].length; k < kk; k++) {\n            const nameEntry = nameTable[j][k]?.replaceAll(/\\s/g, \"\");\n            if (!nameEntry) {\n              continue;\n            }\n            if (nameEntry === fontName) {\n              return {\n                header: potentialHeader,\n                tables: potentialTables,\n              };\n            }\n            if (fontNameParts.length < 2) {\n              continue;\n            }\n            for (const part of fontNameParts) {\n              if (nameEntry === part) {\n                fallbackData = {\n                  name: part,\n                  header: potentialHeader,\n                  tables: potentialTables,\n                };\n              }\n            }\n          }\n        }\n      }\n      if (fallbackData) {\n        warn(\n          `TrueType Collection does not contain \"${fontName}\" font, ` +\n            `falling back to \"${fallbackData.name}\" font instead.`\n        );\n        return {\n          header: fallbackData.header,\n          tables: fallbackData.tables,\n        };\n      }\n      throw new FormatError(\n        `TrueType Collection does not contain \"${fontName}\" font.`\n      );\n    }\n\n    /**\n     * Read the appropriate subtable from the cmap according to 9.6.6.4 from\n     * PDF spec\n     */\n    function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) {\n      if (!cmap) {\n        warn(\"No cmap table available.\");\n        return {\n          platformId: -1,\n          encodingId: -1,\n          mappings: [],\n          hasShortCmap: false,\n        };\n      }\n      let segment;\n      let start = (file.start || 0) + cmap.offset;\n      file.pos = start;\n\n      file.skip(2); // version\n      const numTables = file.getUint16();\n\n      let potentialTable;\n      let canBreak = false;\n      // There's an order of preference in terms of which cmap subtable to\n      // use:\n      // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table\n      // - symbolic fonts the preference is a 3,0 table then a 1,0 table\n      // The following takes advantage of the fact that the tables are sorted\n      // to work.\n      for (let i = 0; i < numTables; i++) {\n        const platformId = file.getUint16();\n        const encodingId = file.getUint16();\n        const offset = file.getInt32() >>> 0;\n        let useTable = false;\n\n        // Sometimes there are multiple of the same type of table. Default\n        // to choosing the first table and skip the rest.\n        if (\n          potentialTable?.platformId === platformId &&\n          potentialTable?.encodingId === encodingId\n        ) {\n          continue;\n        }\n\n        if (\n          platformId === 0 &&\n          (encodingId === /* Unicode Default */ 0 ||\n            encodingId === /* Unicode 1.1 */ 1 ||\n            encodingId === /* Unicode BMP */ 3)\n        ) {\n          useTable = true;\n          // Continue the loop since there still may be a higher priority\n          // table.\n        } else if (platformId === 1 && encodingId === 0) {\n          useTable = true;\n          // Continue the loop since there still may be a higher priority\n          // table.\n        } else if (\n          platformId === 3 &&\n          encodingId === 1 &&\n          (hasEncoding || !potentialTable)\n        ) {\n          useTable = true;\n          if (!isSymbolicFont) {\n            canBreak = true;\n          }\n        } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {\n          useTable = true;\n\n          let correctlySorted = true;\n          if (i < numTables - 1) {\n            const nextBytes = file.peekBytes(2),\n              nextPlatformId = int16(nextBytes[0], nextBytes[1]);\n            if (nextPlatformId < platformId) {\n              correctlySorted = false;\n            }\n          }\n          if (correctlySorted) {\n            canBreak = true;\n          }\n        }\n\n        if (useTable) {\n          potentialTable = {\n            platformId,\n            encodingId,\n            offset,\n          };\n        }\n        if (canBreak) {\n          break;\n        }\n      }\n\n      if (potentialTable) {\n        file.pos = start + potentialTable.offset;\n      }\n      if (!potentialTable || file.peekByte() === -1) {\n        warn(\"Could not find a preferred cmap table.\");\n        return {\n          platformId: -1,\n          encodingId: -1,\n          mappings: [],\n          hasShortCmap: false,\n        };\n      }\n\n      const format = file.getUint16();\n      let hasShortCmap = false;\n      const mappings = [];\n      let j, glyphId;\n\n      // TODO(mack): refactor this cmap subtable reading logic out\n      if (format === 0) {\n        file.skip(2 + 2); // length + language\n\n        for (j = 0; j < 256; j++) {\n          const index = file.getByte();\n          if (!index) {\n            continue;\n          }\n          mappings.push({\n            charCode: j,\n            glyphId: index,\n          });\n        }\n        hasShortCmap = true;\n      } else if (format === 2) {\n        file.skip(2 + 2); // length + language\n\n        const subHeaderKeys = [];\n        let maxSubHeaderKey = 0;\n        // Read subHeaderKeys. If subHeaderKeys[i] === 0, then i is a\n        // single-byte character. Otherwise, i is the first byte of a\n        // multi-byte character, and the value is 8*index into\n        // subHeaders.\n        for (let i = 0; i < 256; i++) {\n          const subHeaderKey = file.getUint16() >> 3;\n          subHeaderKeys.push(subHeaderKey);\n          maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey);\n        }\n        // Read subHeaders. The number of entries is determined\n        // dynamically based on the subHeaderKeys found above.\n        const subHeaders = [];\n        for (let i = 0; i <= maxSubHeaderKey; i++) {\n          subHeaders.push({\n            firstCode: file.getUint16(),\n            entryCount: file.getUint16(),\n            idDelta: signedInt16(file.getByte(), file.getByte()),\n            idRangePos: file.pos + file.getUint16(),\n          });\n        }\n        for (let i = 0; i < 256; i++) {\n          if (subHeaderKeys[i] === 0) {\n            // i is a single-byte code.\n            file.pos = subHeaders[0].idRangePos + 2 * i;\n            glyphId = file.getUint16();\n            mappings.push({\n              charCode: i,\n              glyphId,\n            });\n          } else {\n            // i is the first byte of a two-byte code.\n            const s = subHeaders[subHeaderKeys[i]];\n            for (j = 0; j < s.entryCount; j++) {\n              const charCode = (i << 8) + j + s.firstCode;\n              file.pos = s.idRangePos + 2 * j;\n              glyphId = file.getUint16();\n              if (glyphId !== 0) {\n                glyphId = (glyphId + s.idDelta) % 65536;\n              }\n              mappings.push({\n                charCode,\n                glyphId,\n              });\n            }\n          }\n        }\n      } else if (format === 4) {\n        file.skip(2 + 2); // length + language\n\n        // re-creating the table in format 4 since the encoding\n        // might be changed\n        const segCount = file.getUint16() >> 1;\n        file.skip(6); // skipping range fields\n        const segments = [];\n        let segIndex;\n        for (segIndex = 0; segIndex < segCount; segIndex++) {\n          segments.push({ end: file.getUint16() });\n        }\n        file.skip(2);\n        for (segIndex = 0; segIndex < segCount; segIndex++) {\n          segments[segIndex].start = file.getUint16();\n        }\n\n        for (segIndex = 0; segIndex < segCount; segIndex++) {\n          segments[segIndex].delta = file.getUint16();\n        }\n\n        let offsetsCount = 0,\n          offsetIndex;\n        for (segIndex = 0; segIndex < segCount; segIndex++) {\n          segment = segments[segIndex];\n          const rangeOffset = file.getUint16();\n          if (!rangeOffset) {\n            segment.offsetIndex = -1;\n            continue;\n          }\n\n          offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);\n          segment.offsetIndex = offsetIndex;\n          offsetsCount = Math.max(\n            offsetsCount,\n            offsetIndex + segment.end - segment.start + 1\n          );\n        }\n\n        const offsets = [];\n        for (j = 0; j < offsetsCount; j++) {\n          offsets.push(file.getUint16());\n        }\n\n        for (segIndex = 0; segIndex < segCount; segIndex++) {\n          segment = segments[segIndex];\n          start = segment.start;\n          const end = segment.end;\n          const delta = segment.delta;\n          offsetIndex = segment.offsetIndex;\n\n          for (j = start; j <= end; j++) {\n            if (j === 0xffff) {\n              continue;\n            }\n\n            glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];\n            glyphId = (glyphId + delta) & 0xffff;\n            mappings.push({\n              charCode: j,\n              glyphId,\n            });\n          }\n        }\n      } else if (format === 6) {\n        file.skip(2 + 2); // length + language\n\n        // Format 6 is a 2-bytes dense mapping, which means the font data\n        // lives glue together even if they are pretty far in the unicode\n        // table. (This looks weird, so I can have missed something), this\n        // works on Linux but seems to fails on Mac so let's rewrite the\n        // cmap table to a 3-1-4 style\n        const firstCode = file.getUint16();\n        const entryCount = file.getUint16();\n\n        for (j = 0; j < entryCount; j++) {\n          glyphId = file.getUint16();\n          const charCode = firstCode + j;\n\n          mappings.push({\n            charCode,\n            glyphId,\n          });\n        }\n      } else if (format === 12) {\n        file.skip(2 + 4 + 4); // reserved + length + language\n\n        const nGroups = file.getInt32() >>> 0;\n        for (j = 0; j < nGroups; j++) {\n          const startCharCode = file.getInt32() >>> 0;\n          const endCharCode = file.getInt32() >>> 0;\n          let glyphCode = file.getInt32() >>> 0;\n\n          for (\n            let charCode = startCharCode;\n            charCode <= endCharCode;\n            charCode++\n          ) {\n            mappings.push({\n              charCode,\n              glyphId: glyphCode++,\n            });\n          }\n        }\n      } else {\n        warn(\"cmap table has unsupported format: \" + format);\n        return {\n          platformId: -1,\n          encodingId: -1,\n          mappings: [],\n          hasShortCmap: false,\n        };\n      }\n\n      // removing duplicate entries\n      const finalMappings = [],\n        seenCharCodes = new Set();\n      for (const map of mappings) {\n        const { charCode } = map;\n\n        if (seenCharCodes.has(charCode)) {\n          continue;\n        }\n        seenCharCodes.add(charCode);\n        finalMappings.push(map);\n      }\n\n      return {\n        platformId: potentialTable.platformId,\n        encodingId: potentialTable.encodingId,\n        mappings: finalMappings.sort((a, b) => a.charCode - b.charCode),\n        hasShortCmap,\n      };\n    }\n\n    function sanitizeMetrics(\n      file,\n      header,\n      metrics,\n      headTable,\n      numGlyphs,\n      dupFirstEntry\n    ) {\n      if (!header) {\n        if (metrics) {\n          metrics.data = null;\n        }\n        return;\n      }\n\n      file.pos = (file.start || 0) + header.offset;\n      file.pos += 4; // version\n      file.pos += 2; // ascent\n      file.pos += 2; // descent\n      file.pos += 2; // linegap\n      file.pos += 2; // adv_width_max\n      file.pos += 2; // min_sb1\n      file.pos += 2; // min_sb2\n      file.pos += 2; // max_extent\n      file.pos += 2; // caret_slope_rise\n      file.pos += 2; // caret_slope_run\n      const caretOffset = file.getUint16();\n      file.pos += 8; // reserved\n      file.pos += 2; // format\n      let numOfMetrics = file.getUint16();\n\n      if (caretOffset !== 0) {\n        const macStyle = int16(headTable.data[44], headTable.data[45]);\n        if (!(macStyle & 2)) {\n          // Suppress OTS warnings about the `caretOffset` in the hhea-table.\n          header.data[22] = 0;\n          header.data[23] = 0;\n        }\n      }\n\n      if (numOfMetrics > numGlyphs) {\n        info(\n          `The numOfMetrics (${numOfMetrics}) should not be ` +\n            `greater than the numGlyphs (${numGlyphs}).`\n        );\n        // Reduce numOfMetrics if it is greater than numGlyphs\n        numOfMetrics = numGlyphs;\n        header.data[34] = (numOfMetrics & 0xff00) >> 8;\n        header.data[35] = numOfMetrics & 0x00ff;\n      }\n\n      const numOfSidebearings = numGlyphs - numOfMetrics;\n      const numMissing =\n        numOfSidebearings - ((metrics.length - numOfMetrics * 4) >> 1);\n\n      if (numMissing > 0) {\n        // For each missing glyph, we set both the width and lsb to 0 (zero).\n        // Since we need to add two properties for each glyph, this explains\n        // the use of |numMissing * 2| when initializing the typed array.\n        const entries = new Uint8Array(metrics.length + numMissing * 2);\n        entries.set(metrics.data);\n        if (dupFirstEntry) {\n          // Set the sidebearing value of the duplicated glyph.\n          entries[metrics.length] = metrics.data[2];\n          entries[metrics.length + 1] = metrics.data[3];\n        }\n        metrics.data = entries;\n      }\n    }\n\n    function sanitizeGlyph(\n      source,\n      sourceStart,\n      sourceEnd,\n      dest,\n      destStart,\n      hintsValid\n    ) {\n      const glyphProfile = {\n        length: 0,\n        sizeOfInstructions: 0,\n      };\n      if (\n        sourceStart < 0 ||\n        sourceStart >= source.length ||\n        sourceEnd > source.length ||\n        sourceEnd - sourceStart <= 12\n      ) {\n        // If the offsets are wrong or the glyph is too small, remove it.\n        return glyphProfile;\n      }\n      const glyf = source.subarray(sourceStart, sourceEnd);\n\n      // Sanitize the glyph bounding box.\n      const xMin = signedInt16(glyf[2], glyf[3]);\n      const yMin = signedInt16(glyf[4], glyf[5]);\n      const xMax = signedInt16(glyf[6], glyf[7]);\n      const yMax = signedInt16(glyf[8], glyf[9]);\n\n      if (xMin > xMax) {\n        writeSignedInt16(glyf, 2, xMax);\n        writeSignedInt16(glyf, 6, xMin);\n      }\n      if (yMin > yMax) {\n        writeSignedInt16(glyf, 4, yMax);\n        writeSignedInt16(glyf, 8, yMin);\n      }\n\n      const contoursCount = signedInt16(glyf[0], glyf[1]);\n      if (contoursCount < 0) {\n        if (contoursCount < -1) {\n          // OTS doesn't like contour count to be less than -1.\n          // The glyph data offsets are very likely wrong and\n          // having something lower than -1, very likely, implies\n          // to have some garbage data.\n          return glyphProfile;\n        }\n        // complex glyph, writing as is\n        dest.set(glyf, destStart);\n        glyphProfile.length = glyf.length;\n        return glyphProfile;\n      }\n\n      let i,\n        j = 10,\n        flagsCount = 0;\n      for (i = 0; i < contoursCount; i++) {\n        const endPoint = (glyf[j] << 8) | glyf[j + 1];\n        flagsCount = endPoint + 1;\n        j += 2;\n      }\n      // skipping instructions\n      const instructionsStart = j;\n      const instructionsLength = (glyf[j] << 8) | glyf[j + 1];\n      glyphProfile.sizeOfInstructions = instructionsLength;\n      j += 2 + instructionsLength;\n      const instructionsEnd = j;\n      // validating flags\n      let coordinatesLength = 0;\n      for (i = 0; i < flagsCount; i++) {\n        const flag = glyf[j++];\n        if (flag & 0xc0) {\n          // reserved flags must be zero, cleaning up\n          glyf[j - 1] = flag & 0x3f;\n        }\n        let xLength = 2;\n        if (flag & 2) {\n          xLength = 1;\n        } else if (flag & 16) {\n          xLength = 0;\n        }\n        let yLength = 2;\n        if (flag & 4) {\n          yLength = 1;\n        } else if (flag & 32) {\n          yLength = 0;\n        }\n        const xyLength = xLength + yLength;\n        coordinatesLength += xyLength;\n        if (flag & 8) {\n          const repeat = glyf[j++];\n          if (repeat === 0) {\n            // The repeat count should be non-zero when the repeat flag is set.\n            glyf[j - 1] ^= 8;\n          }\n          i += repeat;\n          coordinatesLength += repeat * xyLength;\n        }\n      }\n      // glyph without coordinates will be rejected\n      if (coordinatesLength === 0) {\n        return glyphProfile;\n      }\n      let glyphDataLength = j + coordinatesLength;\n      if (glyphDataLength > glyf.length) {\n        // not enough data for coordinates\n        return glyphProfile;\n      }\n      if (!hintsValid && instructionsLength > 0) {\n        dest.set(glyf.subarray(0, instructionsStart), destStart);\n        dest.set([0, 0], destStart + instructionsStart);\n        dest.set(\n          glyf.subarray(instructionsEnd, glyphDataLength),\n          destStart + instructionsStart + 2\n        );\n        glyphDataLength -= instructionsLength;\n        if (glyf.length - glyphDataLength > 3) {\n          glyphDataLength = (glyphDataLength + 3) & ~3;\n        }\n        glyphProfile.length = glyphDataLength;\n        return glyphProfile;\n      }\n      if (glyf.length - glyphDataLength > 3) {\n        // truncating and aligning to 4 bytes the long glyph data\n        glyphDataLength = (glyphDataLength + 3) & ~3;\n        dest.set(glyf.subarray(0, glyphDataLength), destStart);\n        glyphProfile.length = glyphDataLength;\n        return glyphProfile;\n      }\n      // glyph data is fine\n      dest.set(glyf, destStart);\n      glyphProfile.length = glyf.length;\n      return glyphProfile;\n    }\n\n    function sanitizeHead(head, numGlyphs, locaLength) {\n      const { data, view } = head;\n\n      // Validate version:\n      // Should always be 0x00010000\n      const version = view.getInt32(0);\n      if (version >> 16 !== 1) {\n        info(\"Attempting to fix invalid version in head table: \" + version);\n        view.setInt32(0, 0x00010000);\n      }\n\n      const indexToLocFormat = signedInt16(data[50], data[51]);\n      if (indexToLocFormat < 0 || indexToLocFormat > 1) {\n        info(\n          \"Attempting to fix invalid indexToLocFormat in head table: \" +\n            indexToLocFormat\n        );\n\n        // The value of indexToLocFormat should be 0 if the loca table\n        // consists of short offsets, and should be 1 if the loca table\n        // consists of long offsets.\n        //\n        // The number of entries in the loca table should be numGlyphs + 1.\n        //\n        // Using this information, we can work backwards to deduce if the\n        // size of each offset in the loca table, and thus figure out the\n        // appropriate value for indexToLocFormat.\n\n        const numGlyphsPlusOne = numGlyphs + 1;\n        if (locaLength === numGlyphsPlusOne << 1) {\n          // 0x0000 indicates the loca table consists of short offsets\n          data[50] = 0;\n          data[51] = 0;\n        } else if (locaLength === numGlyphsPlusOne << 2) {\n          // 0x0001 indicates the loca table consists of long offsets\n          data[50] = 0;\n          data[51] = 1;\n        } else {\n          throw new FormatError(\n            \"Could not fix indexToLocFormat: \" + indexToLocFormat\n          );\n        }\n      }\n    }\n\n    function sanitizeGlyphLocations(\n      loca,\n      glyf,\n      numGlyphs,\n      isGlyphLocationsLong,\n      hintsValid,\n      dupFirstEntry,\n      maxSizeOfInstructions\n    ) {\n      let itemSize, itemDecode, itemEncode;\n      if (isGlyphLocationsLong) {\n        itemSize = 4;\n        itemDecode = function fontItemDecodeLong(data, offset) {\n          return (\n            (data[offset] << 24) |\n            (data[offset + 1] << 16) |\n            (data[offset + 2] << 8) |\n            data[offset + 3]\n          );\n        };\n        itemEncode = function fontItemEncodeLong(data, offset, value) {\n          data[offset] = (value >>> 24) & 0xff;\n          data[offset + 1] = (value >> 16) & 0xff;\n          data[offset + 2] = (value >> 8) & 0xff;\n          data[offset + 3] = value & 0xff;\n        };\n      } else {\n        itemSize = 2;\n        itemDecode = function fontItemDecode(data, offset) {\n          return (data[offset] << 9) | (data[offset + 1] << 1);\n        };\n        itemEncode = function fontItemEncode(data, offset, value) {\n          data[offset] = (value >> 9) & 0xff;\n          data[offset + 1] = (value >> 1) & 0xff;\n        };\n      }\n      // The first glyph is duplicated.\n      const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;\n      const locaDataSize = itemSize * (1 + numGlyphsOut);\n      // Resize loca table to account for duplicated glyph.\n      const locaData = new Uint8Array(locaDataSize);\n      locaData.set(loca.data.subarray(0, locaDataSize));\n      loca.data = locaData;\n      // removing the invalid glyphs\n      const oldGlyfData = glyf.data;\n      const oldGlyfDataLength = oldGlyfData.length;\n      const newGlyfData = new Uint8Array(oldGlyfDataLength);\n\n      // The spec says the offsets should be in ascending order, however\n      // this is not true for some fonts or they use the offset of 0 to mark a\n      // glyph as missing. OTS requires the offsets to be in order and not to\n      // be zero, so we must sort and rebuild the loca table and potentially\n      // re-arrange the glyf data.\n      let i, j;\n      const locaEntries = [];\n      // There are numGlyphs + 1 loca table entries.\n      for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) {\n        let offset = itemDecode(locaData, j);\n        if (offset > oldGlyfDataLength) {\n          offset = oldGlyfDataLength;\n        }\n        locaEntries.push({\n          index: i,\n          offset,\n          endOffset: 0,\n        });\n      }\n      locaEntries.sort((a, b) => a.offset - b.offset);\n      // Now the offsets are sorted, calculate the end offset of each glyph.\n      // The last loca entry's endOffset is not calculated since it's the end\n      // of the data and will be stored on the previous entry's endOffset.\n      for (i = 0; i < numGlyphs; i++) {\n        locaEntries[i].endOffset = locaEntries[i + 1].offset;\n      }\n      // Re-sort so glyphs aren't out of order.\n      locaEntries.sort((a, b) => a.index - b.index);\n      // Calculate the endOffset of the \"first\" glyph correctly when there are\n      // *multiple* empty ones at the start of the data (fixes issue14618.pdf).\n      for (i = 0; i < numGlyphs; i++) {\n        const { offset, endOffset } = locaEntries[i];\n        if (offset !== 0 || endOffset !== 0) {\n          break;\n        }\n        const nextOffset = locaEntries[i + 1].offset;\n        if (nextOffset === 0) {\n          continue;\n        }\n        locaEntries[i].endOffset = nextOffset;\n        break;\n      }\n\n      // If the last offset is 0 in the loca table then we can't compute the\n      // endOffset for the last glyph. So in such a case we set the endOffset\n      // to the end of the data (fixes issue #17671).\n      const last = locaEntries.at(-2);\n      if (last.offset !== 0 && last.endOffset === 0) {\n        last.endOffset = oldGlyfDataLength;\n      }\n\n      const droppedGlyphs = pruneCompositeGlyphCycles(\n        oldGlyfData,\n        locaEntries,\n        numGlyphs\n      );\n      const missingGlyphs = Object.create(null);\n      let writeOffset = 0;\n      itemEncode(locaData, 0, writeOffset);\n      for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {\n        const glyphProfile = droppedGlyphs.has(i)\n          ? { length: 0, sizeOfInstructions: 0 }\n          : sanitizeGlyph(\n              oldGlyfData,\n              locaEntries[i].offset,\n              locaEntries[i].endOffset,\n              newGlyfData,\n              writeOffset,\n              hintsValid\n            );\n        const newLength = glyphProfile.length;\n        if (newLength === 0) {\n          missingGlyphs[i] = true;\n        }\n        if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {\n          maxSizeOfInstructions = glyphProfile.sizeOfInstructions;\n        }\n        writeOffset += newLength;\n        itemEncode(locaData, j, writeOffset);\n      }\n\n      if (writeOffset === 0) {\n        // glyf table cannot be empty -- redoing the glyf and loca tables\n        // to have single glyph with one point\n        const simpleGlyph = new Uint8Array([\n          0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0,\n        ]);\n        for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {\n          itemEncode(locaData, j, simpleGlyph.length);\n        }\n        glyf.data = simpleGlyph;\n      } else if (dupFirstEntry) {\n        // Browsers will not display a glyph at position 0. Typically glyph 0\n        // is notdef, but a number of fonts put a valid glyph there so it must\n        // be duplicated and appended.\n        const firstEntryLength = itemDecode(locaData, itemSize);\n        if (newGlyfData.length > firstEntryLength + writeOffset) {\n          glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);\n        } else {\n          glyf.data = new Uint8Array(firstEntryLength + writeOffset);\n          glyf.data.set(newGlyfData.subarray(0, writeOffset));\n        }\n        glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);\n        itemEncode(\n          loca.data,\n          locaData.length - itemSize,\n          writeOffset + firstEntryLength\n        );\n      } else {\n        glyf.data = newGlyfData.subarray(0, writeOffset);\n      }\n      return {\n        missingGlyphs,\n        maxSizeOfInstructions,\n      };\n    }\n\n    function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) {\n      const start = (font.start || 0) + post.offset;\n      font.pos = start;\n\n      const length = post.length,\n        end = start + length;\n      const version = font.getInt32();\n      // skip rest to the tables\n      font.skip(28);\n\n      let glyphNames;\n      let valid = true;\n      let i;\n\n      switch (version) {\n        case 0x00010000:\n          glyphNames = MacStandardGlyphOrdering;\n          break;\n        case 0x00020000:\n          const numGlyphs = font.getUint16();\n          if (numGlyphs !== maxpNumGlyphs) {\n            valid = false;\n            break;\n          }\n          const glyphNameIndexes = [];\n          for (i = 0; i < numGlyphs; ++i) {\n            const index = font.getUint16();\n            if (index >= 32768) {\n              valid = false;\n              break;\n            }\n            glyphNameIndexes.push(index);\n          }\n          if (!valid) {\n            break;\n          }\n          const customNames = [];\n          while (font.pos < end) {\n            const strLen = font.getByte(),\n              str = font.getString(strLen);\n            customNames.push(str);\n          }\n          glyphNames = [];\n          for (i = 0; i < numGlyphs; ++i) {\n            const j = glyphNameIndexes[i];\n            if (j < 258) {\n              glyphNames.push(MacStandardGlyphOrdering[j]);\n              continue;\n            }\n            glyphNames.push(customNames[j - 258]);\n          }\n          break;\n        case 0x00030000:\n          break;\n        default:\n          warn(\"Unknown/unsupported post table version \" + version);\n          valid = false;\n          if (propertiesObj.defaultEncoding) {\n            glyphNames = propertiesObj.defaultEncoding;\n          }\n          break;\n      }\n      propertiesObj.glyphNames = glyphNames;\n      return valid;\n    }\n\n    function readNameTable(nameTable) {\n      const start = (font.start || 0) + nameTable.offset;\n      font.pos = start;\n\n      const names = [[], []],\n        records = [];\n      const length = nameTable.length,\n        end = start + length;\n      const format = font.getUint16();\n      const FORMAT_0_HEADER_LENGTH = 6;\n      if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {\n        // unsupported name table format or table \"too\" small\n        return [names, records];\n      }\n      const numRecords = font.getUint16();\n      const stringsStart = font.getUint16();\n      const NAME_RECORD_LENGTH = 12;\n      let i, ii;\n\n      for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {\n        const r = {\n          platform: font.getUint16(),\n          encoding: font.getUint16(),\n          language: font.getUint16(),\n          name: font.getUint16(),\n          length: font.getUint16(),\n          offset: font.getUint16(),\n        };\n        // using only Macintosh and Windows platform/encoding names\n        if (isMacNameRecord(r) || isWinNameRecord(r)) {\n          records.push(r);\n        }\n      }\n      for (i = 0, ii = records.length; i < ii; i++) {\n        const record = records[i];\n        if (record.length <= 0) {\n          continue; // Nothing to process, ignoring.\n        }\n        const pos = start + stringsStart + record.offset;\n        if (pos + record.length > end) {\n          continue; // outside of name table, ignoring\n        }\n        font.pos = pos;\n        const nameIndex = record.name;\n        if (record.encoding) {\n          // unicode\n          let str = \"\";\n          for (let j = 0, jj = record.length; j < jj; j += 2) {\n            str += String.fromCharCode(font.getUint16());\n          }\n          names[1][nameIndex] = str;\n        } else {\n          names[0][nameIndex] = font.getString(record.length);\n        }\n      }\n      return [names, records];\n    }\n\n    // prettier-ignore\n    const TTOpsStackDeltas = [\n      0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5,\n      -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1,\n      1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1,\n      0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2,\n      0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1,\n      -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1,\n      -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1,\n      -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];\n    // 0xC0-DF == -1 and 0xE0-FF == -2\n\n    function sanitizeTTProgram(table, ttContext) {\n      let data = table.data;\n      let i = 0,\n        j,\n        n,\n        b,\n        funcId,\n        pc,\n        lastEndf = 0,\n        lastDeff = 0;\n      const stack = [];\n      const callstack = [];\n      const functionsCalled = [];\n      let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;\n      let inFDEF = false,\n        ifLevel = 0,\n        inELSE = 0;\n      for (let ii = data.length; i < ii; ) {\n        const op = data[i++];\n        // The TrueType instruction set docs can be found at\n        // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html\n        if (op === 0x40) {\n          // NPUSHB - pushes n bytes\n          n = data[i++];\n          if (inFDEF || inELSE) {\n            i += n;\n          } else {\n            for (j = 0; j < n; j++) {\n              stack.push(data[i++]);\n            }\n          }\n        } else if (op === 0x41) {\n          // NPUSHW - pushes n words\n          n = data[i++];\n          if (inFDEF || inELSE) {\n            i += n * 2;\n          } else {\n            for (j = 0; j < n; j++) {\n              b = data[i++];\n              stack.push(signedInt16(b, data[i++]));\n            }\n          }\n        } else if ((op & 0xf8) === 0xb0) {\n          // PUSHB - pushes bytes\n          n = op - 0xb0 + 1;\n          if (inFDEF || inELSE) {\n            i += n;\n          } else {\n            for (j = 0; j < n; j++) {\n              stack.push(data[i++]);\n            }\n          }\n        } else if ((op & 0xf8) === 0xb8) {\n          // PUSHW - pushes words\n          n = op - 0xb8 + 1;\n          if (inFDEF || inELSE) {\n            i += n * 2;\n          } else {\n            for (j = 0; j < n; j++) {\n              b = data[i++];\n              stack.push(signedInt16(b, data[i++]));\n            }\n          }\n        } else if (op === 0x2b && !tooComplexToFollowFunctions) {\n          // CALL\n          if (!inFDEF && !inELSE) {\n            // collecting information about which functions are used\n            funcId = stack.at(-1);\n            if (isNaN(funcId)) {\n              info(\"TT: CALL empty stack (or invalid entry).\");\n            } else {\n              ttContext.functionsUsed[funcId] = true;\n              if (funcId in ttContext.functionsStackDeltas) {\n                const newStackLength =\n                  stack.length + ttContext.functionsStackDeltas[funcId];\n                if (newStackLength < 0) {\n                  warn(\"TT: CALL invalid functions stack delta.\");\n                  ttContext.hintsValid = false;\n                  return;\n                }\n                stack.length = newStackLength;\n              } else if (\n                funcId in ttContext.functionsDefined &&\n                !functionsCalled.includes(funcId)\n              ) {\n                callstack.push({ data, i, stackTop: stack.length - 1 });\n                functionsCalled.push(funcId);\n                pc = ttContext.functionsDefined[funcId];\n                if (!pc) {\n                  warn(\"TT: CALL non-existent function\");\n                  ttContext.hintsValid = false;\n                  return;\n                }\n                data = pc.data;\n                i = pc.i;\n              }\n            }\n          }\n        } else if (op === 0x2c && !tooComplexToFollowFunctions) {\n          // FDEF\n          if (inFDEF || inELSE) {\n            warn(\"TT: nested FDEFs not allowed\");\n            tooComplexToFollowFunctions = true;\n          }\n          inFDEF = true;\n          // collecting information about which functions are defined\n          lastDeff = i;\n          funcId = stack.pop();\n          ttContext.functionsDefined[funcId] = { data, i };\n        } else if (op === 0x2d) {\n          // ENDF - end of function\n          if (inFDEF) {\n            inFDEF = false;\n            lastEndf = i;\n          } else {\n            pc = callstack.pop();\n            if (!pc) {\n              warn(\"TT: ENDF bad stack\");\n              ttContext.hintsValid = false;\n              return;\n            }\n            funcId = functionsCalled.pop();\n            data = pc.data;\n            i = pc.i;\n            ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;\n          }\n        } else if (op === 0x89) {\n          // IDEF - instruction definition\n          if (inFDEF || inELSE) {\n            warn(\"TT: nested IDEFs not allowed\");\n            tooComplexToFollowFunctions = true;\n          }\n          inFDEF = true;\n          // recording it as a function to track ENDF\n          lastDeff = i;\n        } else if (op === 0x58) {\n          // IF\n          ++ifLevel;\n        } else if (op === 0x1b) {\n          // ELSE\n          inELSE = ifLevel;\n        } else if (op === 0x59) {\n          // EIF\n          if (inELSE === ifLevel) {\n            inELSE = 0;\n          }\n          --ifLevel;\n        } else if (op === 0x1c) {\n          // JMPR\n          if (!inFDEF && !inELSE) {\n            const offset = stack.at(-1);\n            // only jumping forward to prevent infinite loop\n            if (offset > 0) {\n              i += offset - 1;\n            }\n          }\n        }\n        // Adjusting stack not exactly, but just enough to get function id\n        if (!inFDEF && !inELSE) {\n          let stackDelta = 0;\n          if (op <= 0x8e) {\n            stackDelta = TTOpsStackDeltas[op];\n          } else if (op >= 0xc0 && op <= 0xdf) {\n            stackDelta = -1;\n          } else if (op >= 0xe0) {\n            stackDelta = -2;\n          }\n          if (op >= 0x71 && op <= 0x75) {\n            n = stack.pop();\n            if (!isNaN(n)) {\n              stackDelta = -n * 2;\n            }\n          }\n          while (stackDelta < 0 && stack.length > 0) {\n            stack.pop();\n            stackDelta++;\n          }\n          while (stackDelta > 0) {\n            stack.push(NaN); // pushing any number into stack\n            stackDelta--;\n          }\n        }\n      }\n      ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;\n      const content = [data];\n      if (i > data.length) {\n        content.push(new Uint8Array(i - data.length));\n      }\n      if (lastDeff > lastEndf) {\n        warn(\"TT: complementing a missing function tail\");\n        // new function definition started, but not finished\n        // complete function by [CLEAR, ENDF]\n        content.push(new Uint8Array([0x22, 0x2d]));\n      }\n      foldTTTable(table, content);\n    }\n\n    function checkInvalidFunctions(ttContext, maxFunctionDefs) {\n      if (ttContext.tooComplexToFollowFunctions) {\n        return;\n      }\n      if (ttContext.functionsDefined.length > maxFunctionDefs) {\n        warn(\"TT: more functions defined than expected\");\n        ttContext.hintsValid = false;\n        return;\n      }\n      for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {\n        if (j > maxFunctionDefs) {\n          warn(\"TT: invalid function id: \" + j);\n          ttContext.hintsValid = false;\n          return;\n        }\n        if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {\n          warn(\"TT: undefined function: \" + j);\n          ttContext.hintsValid = false;\n          return;\n        }\n      }\n    }\n\n    function foldTTTable(table, content) {\n      if (content.length > 1) {\n        // concatenating the content items\n        let newLength = 0;\n        let j, jj;\n        for (j = 0, jj = content.length; j < jj; j++) {\n          newLength += content[j].length;\n        }\n        newLength = (newLength + 3) & ~3;\n        const result = new Uint8Array(newLength);\n        let pos = 0;\n        for (j = 0, jj = content.length; j < jj; j++) {\n          result.set(content[j], pos);\n          pos += content[j].length;\n        }\n        table.data = result;\n        table.length = newLength;\n      }\n    }\n\n    function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {\n      const ttContext = {\n        functionsDefined: [],\n        functionsUsed: [],\n        functionsStackDeltas: [],\n        tooComplexToFollowFunctions: false,\n        hintsValid: true,\n      };\n      if (fpgm) {\n        sanitizeTTProgram(fpgm, ttContext);\n      }\n      if (prep) {\n        sanitizeTTProgram(prep, ttContext);\n      }\n      if (fpgm) {\n        checkInvalidFunctions(ttContext, maxFunctionDefs);\n      }\n      if (cvt && cvt.length & 1) {\n        const cvtData = new Uint8Array(cvt.length + 1);\n        cvtData.set(cvt.data);\n        cvt.data = cvtData;\n      }\n      return ttContext.hintsValid;\n    }\n\n    // The following steps modify the original font data, making copy\n    font = new Stream(new Uint8Array(font.getBytes()));\n\n    let header, tables;\n    if (isTrueTypeCollectionFile(font)) {\n      const ttcData = readTrueTypeCollectionData(font, this.name);\n      header = ttcData.header;\n      tables = ttcData.tables;\n    } else {\n      header = readOpenTypeHeader(font);\n      tables = readTables(font, header.numTables);\n    }\n\n    const isTrueType = !tables[\"CFF \"];\n    let parsedCff = null;\n    if (!isTrueType) {\n      try {\n        parsedCff = new CFFParser(\n          new Stream(tables[\"CFF \"].data),\n          properties,\n          SEAC_ANALYSIS_ENABLED\n        ).parse();\n      } catch {\n        warn(\"Failed to parse font \" + properties.loadedName);\n      }\n\n      // OpenType font (skip composite fonts with non-default glyph mapping).\n      if (\n        (header.version === \"OTTO\" &&\n          (!properties.composite ||\n            (properties.fontFileN === \"FontFile3\" && parsedCff?.isCIDFont))) ||\n        !tables.head ||\n        !tables.hhea ||\n        !tables.maxp ||\n        !tables.post\n      ) {\n        // No major tables: throwing everything at `CFFFont`.\n        return this.convert(\n          name,\n          new CFFFont(new Stream(tables[\"CFF \"].data), properties),\n          properties\n        );\n      }\n\n      delete tables.glyf;\n      delete tables.loca;\n      delete tables.fpgm;\n      delete tables.prep;\n      delete tables[\"cvt \"];\n      this.isOpenType = true;\n    } else {\n      if (!tables.loca) {\n        throw new FormatError('Required \"loca\" table is not found');\n      }\n      if (!tables.glyf) {\n        warn('Required \"glyf\" table is not found -- trying to recover.');\n        // Note: We use `sanitizeGlyphLocations` to add dummy glyf data below.\n        tables.glyf = {\n          tag: \"glyf\",\n          data: new Uint8Array(0),\n        };\n      }\n      this.isOpenType = false;\n    }\n\n    if (!tables.maxp) {\n      throw new FormatError('Required \"maxp\" table is not found');\n    }\n\n    let numGlyphsFromCFF;\n    if (parsedCff) {\n      try {\n        parsedCff.duplicateFirstGlyph();\n        tables[\"CFF \"].data = new CFFCompiler(parsedCff).compile();\n        numGlyphsFromCFF = parsedCff.charStringCount;\n      } catch {\n        warn(\"Failed to compile font \" + properties.loadedName);\n      }\n    }\n\n    font.pos = (font.start || 0) + tables.maxp.offset;\n    let version = font.getInt32();\n    const numGlyphs = numGlyphsFromCFF ?? font.getUint16();\n    if (version === 0x00005000 && tables.maxp.length !== 6) {\n      tables.maxp.data = tables.maxp.data.subarray(0, 6);\n      tables.maxp.length = 6;\n    }\n\n    if (version !== 0x00010000 && version !== 0x00005000) {\n      // https://learn.microsoft.com/en-us/typography/opentype/spec/maxp\n      if (tables.maxp.length === 6) {\n        version = 0x0005000;\n      } else if (tables.maxp.length >= 32) {\n        version = 0x00010000;\n      } else {\n        throw new FormatError(`\"maxp\" table has a wrong version number`);\n      }\n      writeUint32(tables.maxp.data, 0, version);\n    }\n\n    let isGlyphLocationsLong = int16(\n      tables.head.data[50],\n      tables.head.data[51]\n    );\n    if (tables.loca) {\n      const locaLength = isGlyphLocationsLong\n        ? (numGlyphs + 1) * 4\n        : (numGlyphs + 1) * 2;\n      if (tables.loca.length !== locaLength) {\n        warn(\"Incorrect 'loca' table length -- attempting to fix it.\");\n        // The length of the loca table is wrong (see #13425), so we check if we\n        // have enough space to fix it.\n        const sortedTables = Object.values(tables)\n          .filter(Boolean)\n          .sort((a, b) => a.offset - b.offset);\n        const locaIndex = sortedTables.indexOf(tables.loca);\n        const nextTable = sortedTables[locaIndex + 1] || null;\n        if (nextTable && tables.loca.offset + locaLength < nextTable.offset) {\n          const previousPos = font.pos;\n          font.pos = font.start || 0;\n          font.skip(tables.loca.offset);\n          tables.loca.data = font.getBytes(locaLength);\n          tables.loca.length = locaLength;\n          font.pos = previousPos;\n        }\n      }\n    }\n\n    if (properties.scaleFactors?.length === numGlyphs && isTrueType) {\n      const { scaleFactors } = properties;\n      const glyphs = new GlyfTable({\n        glyfTable: tables.glyf.data,\n        isGlyphLocationsLong,\n        locaTable: tables.loca.data,\n        numGlyphs,\n      });\n      glyphs.scale(scaleFactors);\n\n      const { glyf, loca, isLocationLong } = glyphs.write();\n      tables.glyf.data = glyf;\n      tables.loca.data = loca;\n\n      if (isLocationLong !== !!isGlyphLocationsLong) {\n        tables.head.data[50] = 0;\n        isGlyphLocationsLong = tables.head.data[51] = isLocationLong ? 1 : 0;\n      }\n\n      const metrics = tables.hmtx.data;\n\n      for (let i = 0; i < numGlyphs; i++) {\n        const j = 4 * i;\n        const advanceWidth = Math.round(\n          scaleFactors[i] * int16(metrics[j], metrics[j + 1])\n        );\n        metrics[j] = (advanceWidth >> 8) & 0xff;\n        metrics[j + 1] = advanceWidth & 0xff;\n        const lsb = Math.round(\n          scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3])\n        );\n        writeSignedInt16(metrics, j + 2, lsb);\n      }\n    }\n\n    // Glyph 0 is duplicated and appended.\n    let numGlyphsOut = numGlyphs + 1;\n    let dupFirstEntry = true;\n    if (numGlyphsOut > 0xffff) {\n      dupFirstEntry = false;\n      numGlyphsOut = numGlyphs;\n      warn(\"Not enough space in glyfs to duplicate first glyph.\");\n    }\n    let maxFunctionDefs = 0;\n    let maxSizeOfInstructions = 0;\n    if (version >= 0x00010000 && tables.maxp.length >= 32) {\n      // maxZones can be invalid\n      font.pos += 8;\n      const maxZones = font.getUint16();\n      if (maxZones > 2) {\n        // reset to 2 if font has invalid maxZones\n        tables.maxp.data[14] = 0;\n        tables.maxp.data[15] = 2;\n      }\n      font.pos += 4;\n      maxFunctionDefs = font.getUint16();\n      font.pos += 4;\n      maxSizeOfInstructions = font.getUint16();\n    } else if (isTrueType && version === 0x00005000) {\n      const newMaxp = new Uint8Array(32);\n      writeUint32(newMaxp, 0, 0x00010000);\n      newMaxp[4] = (numGlyphs >> 8) & 0xff;\n      newMaxp[5] = numGlyphs & 0xff;\n      newMaxp.fill(0xff, 6, 14);\n      newMaxp[15] = 2;\n      newMaxp[28] = 0xff;\n      newMaxp[29] = 0xff;\n      newMaxp[31] = 0x10;\n      tables.maxp.data = newMaxp;\n      tables.maxp.length = 32;\n      version = 0x00010000;\n    }\n\n    tables.maxp.data[4] = numGlyphsOut >> 8;\n    tables.maxp.data[5] = numGlyphsOut & 255;\n\n    const hintsValid = sanitizeTTPrograms(\n      tables.fpgm,\n      tables.prep,\n      tables[\"cvt \"],\n      maxFunctionDefs\n    );\n    if (!hintsValid) {\n      delete tables.fpgm;\n      delete tables.prep;\n      delete tables[\"cvt \"];\n    }\n\n    // Ensure the hmtx table contains the advance width and\n    // sidebearings information for numGlyphs in the maxp table\n    sanitizeMetrics(\n      font,\n      tables.hhea,\n      tables.hmtx,\n      tables.head,\n      numGlyphsOut,\n      dupFirstEntry\n    );\n\n    if (!tables.head) {\n      throw new FormatError('Required \"head\" table is not found');\n    }\n\n    sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);\n\n    let missingGlyphs = Object.create(null);\n    if (isTrueType) {\n      const glyphsInfo = sanitizeGlyphLocations(\n        tables.loca,\n        tables.glyf,\n        numGlyphs,\n        isGlyphLocationsLong,\n        hintsValid,\n        dupFirstEntry,\n        maxSizeOfInstructions\n      );\n      missingGlyphs = glyphsInfo.missingGlyphs;\n\n      // Some fonts have incorrect maxSizeOfInstructions values, so we use\n      // the computed value instead.\n      if (version >= 0x00010000 && tables.maxp.length >= 32) {\n        tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8;\n        tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255;\n      }\n    }\n    if (!tables.hhea) {\n      throw new FormatError('Required \"hhea\" table is not found');\n    }\n\n    // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth\n    // Sometimes it's 0. That needs to be fixed\n    if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {\n      tables.hhea.data[10] = 0xff;\n      tables.hhea.data[11] = 0xff;\n    }\n\n    // Extract some more font properties from the OpenType head and\n    // hhea tables; yMin and descent value are always negative.\n    const metricsOverride = {\n      unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),\n      yMax: signedInt16(tables.head.data[42], tables.head.data[43]),\n      yMin: signedInt16(tables.head.data[38], tables.head.data[39]),\n      ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]),\n      descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]),\n      lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9]),\n    };\n\n    // PDF FontDescriptor metrics lie -- using data from actual font.\n    this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;\n    this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;\n    this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm;\n\n    if (this.cssFontInfo?.lineHeight) {\n      this.lineHeight = this.cssFontInfo.metrics.lineHeight;\n      this.lineGap = this.cssFontInfo.metrics.lineGap;\n    } else {\n      this.lineHeight = this.ascent - this.descent + this.lineGap;\n    }\n\n    // The 'post' table has glyphs names.\n    if (tables.post) {\n      readPostScriptTable(tables.post, properties, numGlyphs);\n    }\n\n    // The original 'post' table is not needed, replace it.\n    tables.post = {\n      tag: \"post\",\n      data: createPostTable(properties),\n    };\n\n    const charCodeToGlyphId = Object.create(null);\n\n    // Helper function to try to skip mapping of empty glyphs.\n    function hasGlyph(glyphId) {\n      return !missingGlyphs[glyphId];\n    }\n\n    if (properties.composite) {\n      const cidToGidMap = properties.cidToGidMap || [];\n      const isCidToGidMapEmpty = cidToGidMap.length === 0;\n\n      properties.cMap.forEach(function (charCode, cid) {\n        if (typeof cid === \"string\") {\n          cid = convertCidString(charCode, cid, /* shouldThrow = */ true);\n        }\n        if (cid > 0xffff) {\n          throw new FormatError(\"Max size of CID is 65,535\");\n        }\n        let glyphId = -1;\n        if (isCidToGidMapEmpty) {\n          glyphId = cid;\n        } else if (cidToGidMap[cid] !== undefined) {\n          glyphId = cidToGidMap[cid];\n        }\n\n        if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {\n          charCodeToGlyphId[charCode] = glyphId;\n        }\n      });\n    } else {\n      // Most of the following logic in this code branch is based on the\n      // 9.6.6.4 of the PDF spec.\n      const cmapTable = readCmapTable(\n        tables.cmap,\n        font,\n        this.isSymbolicFont,\n        properties.hasEncoding\n      );\n      const cmapPlatformId = cmapTable.platformId;\n      const cmapEncodingId = cmapTable.encodingId;\n      const cmapMappings = cmapTable.mappings;\n      let baseEncoding = [],\n        forcePostTable = false;\n      if (\n        properties.hasEncoding &&\n        (properties.baseEncodingName === \"MacRomanEncoding\" ||\n          properties.baseEncodingName === \"WinAnsiEncoding\")\n      ) {\n        baseEncoding = getEncoding(properties.baseEncodingName);\n      }\n\n      // If the font has an encoding and is not symbolic then follow the rules\n      // in section 9.6.6.4 of the spec on how to map 3,1 and 1,0 cmaps.\n      if (\n        properties.hasEncoding &&\n        !this.isSymbolicFont &&\n        ((cmapPlatformId === 3 && cmapEncodingId === 1) ||\n          (cmapPlatformId === 1 && cmapEncodingId === 0))\n      ) {\n        const glyphsUnicodeMap = getGlyphsUnicode();\n        for (let charCode = 0; charCode < 256; charCode++) {\n          let glyphName;\n          if (this.differences[charCode] !== undefined) {\n            glyphName = this.differences[charCode];\n          } else if (baseEncoding.length && baseEncoding[charCode] !== \"\") {\n            glyphName = baseEncoding[charCode];\n          } else {\n            glyphName = StandardEncoding[charCode];\n          }\n          if (!glyphName) {\n            continue;\n          }\n          // Ensure that non-standard glyph names are resolved to valid ones.\n          const standardGlyphName = recoverGlyphName(\n            glyphName,\n            glyphsUnicodeMap\n          );\n\n          let unicodeOrCharCode;\n          if (cmapPlatformId === 3 && cmapEncodingId === 1) {\n            unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];\n          } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {\n            // TODO: the encoding needs to be updated with mac os table.\n            unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName);\n          }\n\n          if (unicodeOrCharCode === undefined) {\n            // Not a valid glyph name, fallback to using the /ToUnicode map\n            // when no post-table exists (fixes issue13316_reduced.pdf).\n            if (\n              !properties.glyphNames &&\n              properties.hasIncludedToUnicodeMap &&\n              !(this.toUnicode instanceof IdentityToUnicodeMap)\n            ) {\n              const unicode = this.toUnicode.get(charCode);\n              if (unicode) {\n                unicodeOrCharCode = unicode.codePointAt(0);\n              }\n            }\n\n            if (unicodeOrCharCode === undefined) {\n              continue; // No valid glyph mapping found.\n            }\n          }\n\n          for (const mapping of cmapMappings) {\n            if (mapping.charCode !== unicodeOrCharCode) {\n              continue;\n            }\n            charCodeToGlyphId[charCode] = mapping.glyphId;\n            break;\n          }\n        }\n      } else if (cmapPlatformId === 0) {\n        // Default Unicode semantics, use the charcodes as is.\n        for (const mapping of cmapMappings) {\n          charCodeToGlyphId[mapping.charCode] = mapping.glyphId;\n        }\n        // Always prefer the BaseEncoding/Differences arrays, when they exist\n        // (fixes issue13433.pdf).\n        forcePostTable = true;\n      } else if (cmapPlatformId === 3 && cmapEncodingId === 0) {\n        // When a (3, 0) cmap table is present, it is used instead but the\n        // spec has special rules for char codes in the range of 0xF000 to\n        // 0xF0FF and it says the (3, 0) table should map the values from\n        // the (1, 0) table by prepending 0xF0 to the char codes. To reverse\n        // this, the upper bits of the char code are cleared, but only for the\n        // special range since some PDFs have char codes outside of this range\n        // (e.g. 0x2013) which when masked would overwrite other values in the\n        // cmap.\n        for (const mapping of cmapMappings) {\n          let charCode = mapping.charCode;\n          if (charCode >= 0xf000 && charCode <= 0xf0ff) {\n            charCode &= 0xff;\n          }\n          charCodeToGlyphId[charCode] = mapping.glyphId;\n        }\n      } else {\n        // When there is only a (1, 0) cmap table, the char code is a single\n        // byte and it is used directly as the char code.\n        for (const mapping of cmapMappings) {\n          charCodeToGlyphId[mapping.charCode] = mapping.glyphId;\n        }\n      }\n\n      // Last, try to map any missing charcodes using the post table.\n      if (\n        properties.glyphNames &&\n        (baseEncoding.length || this.differences.length)\n      ) {\n        for (let i = 0; i < 256; ++i) {\n          if (!forcePostTable && charCodeToGlyphId[i] !== undefined) {\n            continue;\n          }\n          const glyphName = this.differences[i] || baseEncoding[i];\n          if (!glyphName) {\n            continue;\n          }\n          const glyphId = properties.glyphNames.indexOf(glyphName);\n          if (glyphId > 0 && hasGlyph(glyphId)) {\n            charCodeToGlyphId[i] = glyphId;\n          }\n        }\n      }\n\n      // The char code 0 isn't associated with any glyph name in the standard\n      // encodings, hence it can only refer to glyph 0 (i.e. the \".notdef\"\n      // glyph). Some embedded fonts use a non-empty glyph 0 (e.g. a checkbox\n      // in a symbol font) and the page content draws it with the char code 0,\n      // so map it explicitly when it would otherwise be left unmapped, but\n      // only when the glyph is non-empty to avoid displaying a \".notdef\" box\n      // for fonts that don't (issue 17333). This is restricted to embedded\n      // fonts since the \".notdef\" glyph of a standard substitution font must\n      // never be rendered.\n      if (\n        !properties.isInternalFont &&\n        charCodeToGlyphId[0] === undefined &&\n        hasGlyph(0)\n      ) {\n        charCodeToGlyphId[0] = 0;\n      }\n    }\n\n    if (charCodeToGlyphId.length === 0) {\n      // defines at least one glyph\n      charCodeToGlyphId[0] = 0;\n    }\n\n    // Typically glyph 0 is duplicated and the mapping must be updated, but if\n    // there isn't enough room to duplicate, the glyph id is left the same. In\n    // this case, glyph 0 may not work correctly, but that is better than\n    // having the whole font fail.\n    const glyphZeroId = dupFirstEntry ? numGlyphsOut - 1 : 0;\n\n    // When `cssFontInfo` is set, the font is used to render text in the HTML\n    // view (e.g. with Xfa) so nothing must be moved in the private use area.\n    if (!properties.cssFontInfo) {\n      // Converting glyphs and ids into font's cmap table\n      const newMapping = adjustMapping(\n        charCodeToGlyphId,\n        hasGlyph,\n        glyphZeroId,\n        this.toUnicode\n      );\n      this.toFontChar = newMapping.toFontChar;\n      tables.cmap = {\n        tag: \"cmap\",\n        data: createCmapTable(\n          newMapping.charCodeToGlyphId,\n          newMapping.toUnicodeExtraMap,\n          numGlyphsOut\n        ),\n      };\n\n      if (!tables[\"OS/2\"] || !validateOS2Table(tables[\"OS/2\"], font)) {\n        tables[\"OS/2\"] = {\n          tag: \"OS/2\",\n          data: createOS2Table(\n            properties,\n            newMapping.charCodeToGlyphId,\n            metricsOverride\n          ),\n        };\n      }\n    }\n\n    // Re-creating 'name' table\n    if (!tables.name) {\n      tables.name = {\n        tag: \"name\",\n        data: createNameTable(this.name),\n      };\n    } else {\n      // ... using existing 'name' table as prototype\n      const [namePrototype, nameRecords] = readNameTable(tables.name);\n\n      tables.name.data = createNameTable(name, namePrototype);\n      this.psName = namePrototype[0][6] || null;\n\n      if (!properties.composite) {\n        // For TrueType fonts that do not include `ToUnicode` or `Encoding`\n        // data, attempt to use the name-table to improve text selection.\n        adjustTrueTypeToUnicode(properties, this.isSymbolicFont, nameRecords);\n      }\n    }\n\n    const builder = new OpenTypeFileBuilder(header.version);\n    for (const tableTag in tables) {\n      builder.addTable(tableTag, tables[tableTag].data);\n    }\n    return builder.toArray();\n  }\n\n  convert(fontName, font, properties) {\n    // TODO: Check the charstring widths to determine this.\n    properties.fixedPitch = false;\n\n    if (properties.builtInEncoding) {\n      // For Type1 fonts that do not include either `ToUnicode` or `Encoding`\n      // data, attempt to use the `builtInEncoding` to improve text selection.\n      adjustType1ToUnicode(properties, properties.builtInEncoding);\n    }\n\n    // Type 1 fonts have a notdef inserted at the beginning, so glyph 0\n    // becomes glyph 1. In a CFF font glyph 0 is appended to the end of the\n    // char strings.\n    const glyphZeroId = font instanceof CFFFont ? font.numGlyphs - 1 : 1;\n    const mapping = font.getGlyphMapping(properties);\n    let newMapping = null;\n    let newCharCodeToGlyphId = mapping;\n    let toUnicodeExtraMap = null;\n\n    // When `cssFontInfo` is set, the font is used to render text in the HTML\n    // view (e.g. with Xfa) so nothing must be moved in the private use area.\n    if (!properties.cssFontInfo) {\n      newMapping = adjustMapping(\n        mapping,\n        font.hasGlyphId.bind(font),\n        glyphZeroId,\n        this.toUnicode\n      );\n      this.toFontChar = newMapping.toFontChar;\n      newCharCodeToGlyphId = newMapping.charCodeToGlyphId;\n      toUnicodeExtraMap = newMapping.toUnicodeExtraMap;\n    }\n    const numGlyphs = font.numGlyphs;\n\n    function getCharCodes(charCodeToGlyphId, glyphId) {\n      let charCodes = null;\n      for (const charCode in charCodeToGlyphId) {\n        if (glyphId === charCodeToGlyphId[charCode]) {\n          (charCodes ||= []).push(charCode | 0);\n        }\n      }\n      return charCodes;\n    }\n\n    function createCharCode(charCodeToGlyphId, glyphId) {\n      for (const charCode in charCodeToGlyphId) {\n        if (glyphId === charCodeToGlyphId[charCode]) {\n          return charCode | 0;\n        }\n      }\n      newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] =\n        glyphId;\n      return newMapping.nextAvailableFontCharCode++;\n    }\n\n    const seacs = font.seacs;\n    if (newMapping && SEAC_ANALYSIS_ENABLED && seacs?.length) {\n      const matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX;\n      const charset = font.getCharset();\n      const seacMap = Object.create(null);\n      for (let glyphId in seacs) {\n        glyphId |= 0;\n        const seac = seacs[glyphId];\n        const baseGlyphName = StandardEncoding[seac[2]];\n        const accentGlyphName = StandardEncoding[seac[3]];\n        const baseGlyphId = charset.indexOf(baseGlyphName);\n        const accentGlyphId = charset.indexOf(accentGlyphName);\n        if (baseGlyphId < 0 || accentGlyphId < 0) {\n          continue;\n        }\n        const accentOffset = {\n          x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],\n          y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5],\n        };\n\n        const charCodes = getCharCodes(mapping, glyphId);\n        if (!charCodes) {\n          // There's no point in mapping it if the char code was never mapped\n          // to begin with.\n          continue;\n        }\n        for (const charCode of charCodes) {\n          // Find a fontCharCode that maps to the base and accent glyphs.\n          // If one doesn't exists, create it.\n          const charCodeToGlyphId = newMapping.charCodeToGlyphId;\n          const baseFontCharCode = createCharCode(\n            charCodeToGlyphId,\n            baseGlyphId\n          );\n          const accentFontCharCode = createCharCode(\n            charCodeToGlyphId,\n            accentGlyphId\n          );\n          seacMap[charCode] = {\n            baseFontCharCode,\n            accentFontCharCode,\n            accentOffset,\n          };\n        }\n      }\n      properties.seacMap = seacMap;\n    }\n\n    const unitsPerEm = properties.fontMatrix\n      ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs))\n      : 1000;\n\n    const builder = new OpenTypeFileBuilder(\"\\x4F\\x54\\x54\\x4F\");\n    // PostScript Font Program\n    builder.addTable(\"CFF \", font.data);\n    // OS/2 and Windows Specific metrics\n    builder.addTable(\"OS/2\", createOS2Table(properties, newCharCodeToGlyphId));\n    // Character to glyphs mapping\n    builder.addTable(\n      \"cmap\",\n      createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs)\n    );\n    // Font header\n    builder.addTable(\n      \"head\",\n      (function fontTableHead() {\n        const dateArr = [0x00, 0x00, 0x00, 0x00, 0x9e, 0x0b, 0x7e, 0x27];\n\n        const head = new DataBuilder({ exactLength: 54 });\n        head.setArray([0x00, 0x01, 0x00, 0x00]); // Version number\n        head.setArray([0x00, 0x00, 0x10, 0x00]); // fontRevision\n        head.skip(4); // checksumAdjustement, skip redundant \"\\x00\\x00\\x00\\x00\"\n        head.setArray([0x5f, 0x0f, 0x3c, 0xf5]); // magicNumber\n        head.skip(2); // Flags, skip redundant \"\\x00\\x00\"\n        head.setSafeInt16(unitsPerEm); // unitsPerEM\n        head.setArray(dateArr); // creation date\n        head.setArray(dateArr); // modifification date\n        head.skip(2); // xMin, skip redundant \"\\x00\\x00\"\n        head.setSafeInt16(properties.descent); // yMin\n        head.setArray([0x0f, 0xff]); // xMax\n        head.setSafeInt16(properties.ascent); // yMax\n        head.setInt16(properties.italicAngle ? 2 : 0); // macStyle\n        head.setArray([0x00, 0x11]); // lowestRecPPEM\n        head.skip(\n          2 + // fontDirectionHint, skip redundant \"\\x00\\x00\"\n            2 + // indexToLocFormat, skip redundant \"\\x00\\x00\"\n            2 // glyphDataFormat, skip redundant \"\\x00\\x00\"\n        );\n        return head.data;\n      })()\n    );\n\n    // Horizontal header\n    builder.addTable(\n      \"hhea\",\n      (function fontTableHhea() {\n        const hhea = new DataBuilder({ exactLength: 36 });\n        hhea.setArray([0x00, 0x01, 0x00, 0x00]); // Version number\n        hhea.setSafeInt16(properties.ascent); // Typographic Ascent\n        hhea.setSafeInt16(properties.descent); // Typographic Descent\n        hhea.skip(2); // Line Gap, skip redundant \"\\x00\\x00\"\n        hhea.setArray([0xff, 0xff]); // advanceWidthMax\n        hhea.skip(\n          2 + // minLeftSidebearing, skip redundant \"\\x00\\x00\"\n            2 + // minRightSidebearing, skip redundant \"\\x00\\x00\"\n            2 // xMaxExtent, skip redundant \"\\x00\\x00\"\n        );\n        hhea.setSafeInt16(properties.capHeight); // caretSlopeRise\n        hhea.setSafeInt16(\n          Math.tan(properties.italicAngle) * properties.xHeight\n        ); // caretSlopeRun\n        hhea.skip(\n          2 + // caretOffset, skip redundant \"\\x00\\x00\"\n            2 + // -reserved-, skip redundant \"\\x00\\x00\"\n            2 + // -reserved-, skip redundant \"\\x00\\x00\"\n            2 + // -reserved-, skip redundant \"\\x00\\x00\"\n            2 + // -reserved-, skip redundant \"\\x00\\x00\"\n            2 // metricDataFormat, skip redundant \"\\x00\\x00\"\n        );\n        hhea.setInt16(numGlyphs); // Number of HMetrics\n        return hhea.data;\n      })()\n    );\n\n    // Horizontal metrics\n    builder.addTable(\n      \"hmtx\",\n      (function fontTableHmtx() {\n        const charstrings = font.charstrings;\n        const cffWidths = font.cff?.widths ?? null;\n\n        const hmtx = new DataBuilder({ exactLength: numGlyphs * 4 });\n        // Fake .notdef (width=0 and lsb=0) first, skip redundant assignment.\n        hmtx.skip(4);\n\n        for (let i = 1, ii = numGlyphs; i < ii; i++) {\n          let width = 0;\n          if (charstrings) {\n            width = charstrings[i - 1].width || 0;\n          } else if (cffWidths) {\n            width = Math.ceil(cffWidths[i] || 0);\n          }\n          hmtx.setInt16(width);\n          hmtx.skip(2); // Use lsb=0, skip redundant assignment.\n        }\n        return hmtx.data;\n      })()\n    );\n\n    // Maximum profile\n    builder.addTable(\n      \"maxp\",\n      (function fontTableMaxp() {\n        const maxp = new DataBuilder({ exactLength: 6 });\n        maxp.setArray([0x00, 0x00, 0x50, 0x00]); // Version number\n        maxp.setInt16(numGlyphs); // Num of glyphs\n        return maxp.data;\n      })()\n    );\n\n    // Naming tables\n    builder.addTable(\"name\", createNameTable(fontName));\n\n    // PostScript information\n    builder.addTable(\"post\", createPostTable(properties));\n\n    return builder.toArray();\n  }\n\n  /**\n   * @private\n   */\n  get _spaceWidth() {\n    // trying to estimate space character width\n    const possibleSpaceReplacements = [\"space\", \"minus\", \"one\", \"i\", \"I\"];\n    let width;\n    for (const glyphName of possibleSpaceReplacements) {\n      // if possible, getting width by glyph name\n      if (glyphName in this.widths) {\n        width = this.widths[glyphName];\n        break;\n      }\n      const glyphsUnicodeMap = getGlyphsUnicode();\n      const glyphUnicode = glyphsUnicodeMap[glyphName];\n      // finding the charcode via unicodeToCID map\n      let charcode = 0;\n      if (this.composite && this.cMap.contains(glyphUnicode)) {\n        charcode = this.cMap.lookup(glyphUnicode);\n\n        if (typeof charcode === \"string\") {\n          charcode = convertCidString(glyphUnicode, charcode);\n        }\n      }\n      // ... via toUnicode map\n      if (!charcode && this.toUnicode) {\n        charcode = this.toUnicode.charCodeOf(glyphUnicode);\n      }\n      // setting it to unicode if negative or undefined\n      if (charcode <= 0) {\n        charcode = glyphUnicode;\n      }\n      // trying to get width via charcode\n      width = this.widths[charcode];\n      if (width) {\n        break; // the non-zero width found\n      }\n    }\n    return shadow(this, \"_spaceWidth\", width || this.defaultWidth);\n  }\n\n  /**\n   * @private\n   */\n  _charToGlyph(charcode, isSpace = false) {\n    let glyph = this.#glyphCache.get(charcode);\n    // All `Glyph`-properties, except `isSpace` in multi-byte strings,\n    // depend indirectly on the `charcode`.\n    if (glyph?.isSpace === isSpace) {\n      return glyph;\n    }\n    let fontCharCode, width, operatorListId;\n\n    let widthCode = charcode;\n    if (this.cMap?.contains(charcode)) {\n      widthCode = this.cMap.lookup(charcode);\n\n      if (typeof widthCode === \"string\") {\n        widthCode = convertCidString(charcode, widthCode);\n      }\n    }\n    width = this.widths[widthCode];\n    if (typeof width !== \"number\") {\n      width = this.defaultWidth;\n    }\n    const vmetric = this.vmetrics?.[widthCode] || this.defaultVMetrics;\n\n    let unicode = this.toUnicode.get(charcode) || charcode;\n    if (typeof unicode === \"number\") {\n      unicode = String.fromCharCode(unicode);\n    }\n\n    let isInFont = this.toFontChar[charcode] !== undefined;\n    // First try the toFontChar map, if it's not there then try falling\n    // back to the char code.\n    fontCharCode = this.toFontChar[charcode] || charcode;\n    if (this.missingFile) {\n      const glyphName =\n        this.differences[charcode] || this.defaultEncoding[charcode];\n      if (\n        (glyphName === \".notdef\" || glyphName === \"\") &&\n        this.type === \"Type1\"\n      ) {\n        // .notdef glyphs should be invisible in non-embedded Type1 fonts, so\n        // replace them with spaces.\n        fontCharCode = 0x20;\n\n        if (glyphName === \"\") {\n          // Ensure that other relevant glyph properties are also updated\n          // (fixes issue18059.pdf).\n          width ||= this._spaceWidth;\n          unicode = String.fromCharCode(fontCharCode);\n        }\n      }\n      fontCharCode = mapSpecialUnicodeValues(fontCharCode);\n    }\n\n    if (this.isType3Font) {\n      // Font char code in this case is actually a glyph name.\n      operatorListId = fontCharCode;\n    }\n\n    let accent = null;\n    if (this.seacMap?.[charcode]) {\n      isInFont = true;\n      const seac = this.seacMap[charcode];\n      fontCharCode = seac.baseFontCharCode;\n      accent = {\n        fontChar: String.fromCodePoint(seac.accentFontCharCode),\n        offset: seac.accentOffset,\n      };\n    }\n\n    let fontChar = \"\";\n    if (typeof fontCharCode === \"number\") {\n      if (fontCharCode <= 0x10ffff) {\n        fontChar = String.fromCodePoint(fontCharCode);\n      } else {\n        warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`);\n      }\n    }\n\n    if (this.missingFile && this.vertical && fontChar.length === 1) {\n      const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)];\n      if (vertical) {\n        fontChar = unicode = String.fromCharCode(vertical);\n      }\n    }\n\n    glyph = new Glyph(\n      charcode,\n      fontChar,\n      unicode,\n      accent,\n      width,\n      vmetric,\n      operatorListId,\n      isSpace,\n      isInFont\n    );\n    this.#glyphCache.set(charcode, glyph);\n    return glyph;\n  }\n\n  charsToGlyphs(chars) {\n    // If we translated this string before, just grab it from the cache.\n    let glyphs = this.#charsCache.get(chars);\n    if (glyphs) {\n      return glyphs;\n    }\n    glyphs = [];\n\n    if (this.cMap) {\n      // Composite fonts have multi-byte strings, convert the string from\n      // single-byte to multi-byte.\n      const c = Object.create(null),\n        ii = chars.length;\n      let i = 0;\n      while (i < ii) {\n        this.cMap.readCharCode(chars, i, c);\n        const { charcode, length } = c;\n        i += length;\n        // Space is char with code 0x20 and length 1 in multiple-byte codes.\n        const glyph = this._charToGlyph(\n          charcode,\n          length === 1 && chars.charCodeAt(i - 1) === 0x20\n        );\n        glyphs.push(glyph);\n      }\n    } else {\n      for (let i = 0, ii = chars.length; i < ii; ++i) {\n        const charcode = chars.charCodeAt(i);\n        const glyph = this._charToGlyph(charcode, charcode === 0x20);\n        glyphs.push(glyph);\n      }\n    }\n\n    // Enter the translated string into the cache.\n    this.#charsCache.set(chars, glyphs);\n    return glyphs;\n  }\n\n  /**\n   * Chars can have different sizes (depends on the encoding).\n   * @param {String} a string encoded with font encoding.\n   * @returns {Array<Array<number>>} the positions of each char in the string.\n   */\n  getCharPositions(chars) {\n    // This function doesn't use a cache because\n    // it's called only when saving or printing.\n    const positions = [];\n\n    if (this.cMap) {\n      const c = Object.create(null);\n      let i = 0;\n      while (i < chars.length) {\n        this.cMap.readCharCode(chars, i, c);\n        const length = c.length;\n        positions.push([i, i + length]);\n        i += length;\n      }\n    } else {\n      for (let i = 0, ii = chars.length; i < ii; ++i) {\n        positions.push([i, i + 1]);\n      }\n    }\n\n    return positions;\n  }\n\n  get glyphCacheValues() {\n    return this.#glyphCache.values();\n  }\n\n  /**\n   * Encode a js string using font encoding.\n   * The resulting array contains an encoded string at even positions\n   * (can be empty) and a non-encoded one at odd positions.\n   * @param {String} a js string.\n   * @returns {Array<String>} an array of encoded strings or non-encoded ones.\n   */\n  encodeString(str) {\n    const buffers = [];\n    const currentBuf = [];\n\n    // buffers will contain: encoded, non-encoded, encoded, ...\n    // currentBuf is pushed in buffers each time there is a change.\n    // So when buffers.length is odd then the last string is an encoded one\n    // and currentBuf contains non-encoded chars.\n    const hasCurrentBufErrors = () => buffers.length % 2 === 1;\n\n    const getCharCode =\n      this.toUnicode instanceof IdentityToUnicodeMap\n        ? unicode => this.toUnicode.charCodeOf(unicode)\n        : unicode => this.toUnicode.charCodeOf(String.fromCodePoint(unicode));\n\n    for (let i = 0, ii = str.length; i < ii; i++) {\n      const unicode = str.codePointAt(i);\n      if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) {\n        // unicode is represented by two uint16\n        i++;\n      }\n      if (this.toUnicode) {\n        const charCode = getCharCode(unicode);\n        if (charCode !== -1) {\n          if (hasCurrentBufErrors()) {\n            buffers.push(currentBuf.join(\"\"));\n            currentBuf.length = 0;\n          }\n          const charCodeLength = this.cMap\n            ? this.cMap.getCharCodeLength(charCode)\n            : 1;\n          for (let j = charCodeLength - 1; j >= 0; j--) {\n            currentBuf.push(String.fromCharCode((charCode >> (8 * j)) & 0xff));\n          }\n          continue;\n        }\n      }\n\n      // unicode can't be encoded\n      if (!hasCurrentBufErrors()) {\n        buffers.push(currentBuf.join(\"\"));\n        currentBuf.length = 0;\n      }\n      currentBuf.push(String.fromCodePoint(unicode));\n    }\n\n    buffers.push(currentBuf.join(\"\"));\n\n    return buffers;\n  }\n}\n\nclass ErrorFont {\n  constructor(error) {\n    this.error = error;\n    this.loadedName = \"g_font_error\";\n    this.missingFile = true;\n  }\n\n  charsToGlyphs() {\n    return [];\n  }\n\n  encodeString(chars) {\n    return [chars];\n  }\n\n  exportData() {\n    return { error: this.error };\n  }\n}\n\nexport { ErrorFont, Font };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Factors to rescale LiberationSans-Bold.ttf to have the same\n// metrics as calibrib.ttf.\nconst CalibriBoldFactors = [\n  1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566,\n  0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657,\n  0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133,\n  0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859,\n  0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356,\n  0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795,\n  0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577,\n  0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176,\n  0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401,\n  0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343,\n  0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331,\n  1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133,\n  1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787,\n  0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056,\n  0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908,\n  0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133,\n  0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506,\n  0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508,\n  0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762,\n  0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518,\n  0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785,\n  0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785,\n  0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762,\n  0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241,\n  0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518,\n  0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518,\n  0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785,\n  0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401,\n  0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1,\n  0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823,\n  0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785,\n  0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958,\n  0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864,\n  0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399,\n  0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785,\n  0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257,\n  0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908,\n  0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528,\n  1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161,\n  1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029,\n  0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257,\n  0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943,\n  0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819,\n  0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211,\n  0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813,\n  1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638,\n  0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926,\n  0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  0.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1,\n  0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1,\n  0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012,\n  0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372,\n  1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133,\n  1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527,\n  1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018,\n  0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747,\n  0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572,\n  0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1,\n  0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst CalibriBoldMetrics = { lineHeight: 1.2207, lineGap: 0.2207 };\n\n// Factors to rescale LiberationSans-BoldItalic.ttf to have the same\n// metrics as calibriz.ttf.\nconst CalibriBoldItalicFactors = [\n  1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566,\n  0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239,\n  0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133,\n  0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859,\n  0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356,\n  0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, 0.79795,\n  0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, 0.82577,\n  0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, 0.90176, 0.94908,\n  0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, 0.86331, 0.88401,\n  0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, 0.86411, 0.86411,\n  0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, 0.82616, 0.84548,\n  0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133,\n  0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.19129, 0.96839,\n  0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1,\n  1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133,\n  0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539,\n  0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958,\n  0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938,\n  0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795,\n  0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.85887,\n  0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, 0.88401, 0.88401,\n  0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331,\n  0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, 0.84548, 0.86411,\n  0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, 0.94908, 0.71805,\n  0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.87289,\n  0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133,\n  0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, 0.86411, 0.81921,\n  0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, 0.91075, 0.8777, 0.95958,\n  0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958,\n  0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401,\n  1, 1, 0.70424, 0.77312, 0.91926, 0.88175, 0.70823, 0.94903, 0.90872, 0.86331,\n  1, 1, 0.90872, 0.86331, 0.86906, 0.88116, 0.86331, 0.85938, 0.86331, 0.85938,\n  0.86331, 0.85938, 0.86331, 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958,\n  0.90464, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766,\n  0.70852, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399,\n  0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399,\n  0.86331, 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492,\n  0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908,\n  0.77539, 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528,\n  1, 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387,\n  0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346,\n  1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356,\n  0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938,\n  0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466,\n  0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733,\n  0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, 1.02988,\n  0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, 0.87581,\n  0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, 0.86015,\n  1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 0.90631, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88323, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, 1, 0.96068, 0.95794,\n  0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, 1, 1, 0.89552, 0.90527,\n  1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, 0.87012, 0.87012, 0.87012,\n  0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171,\n  1.4956, 2.2807, 0.92972, 0.83406, 0.91133, 0.83326, 0.91133, 1, 1, 1, 0.72021,\n  1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90616, 1.81055, 0.90527,\n  1.81055, 1.3107, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284,\n  0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356,\n  0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572,\n  0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst CalibriBoldItalicMetrics = { lineHeight: 1.2207, lineGap: 0.2207 };\n\n// Factors to rescale LiberationSans-Italic.ttf to have the same\n// metrics as calibrii.ttf.\nconst CalibriItalicFactors = [\n  1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601,\n  0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, 0.91133,\n  0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133,\n  0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071,\n  0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685,\n  0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, 0.77452, 0.85374,\n  0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, 0.77818, 0.7306,\n  0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, 0.8739, 0.9245, 0.9245,\n  0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, 1.03297, 1.07692, 0.90918,\n  1.03297, 0.94959, 0.9245, 0.92274, 0.9245, 0.9245, 1.02933, 0.77832, 1.20562,\n  0.9245, 0.8916, 0.98986, 0.86621, 0.89453, 0.79004, 0.94152, 1.77256, 0.94152,\n  0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552,\n  1.17889, 1.13254, 1.16359, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737,\n  0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642,\n  0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675,\n  0.8675, 0.8675, 0.76318, 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685,\n  0.90685, 0.90685, 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118,\n  0.84118, 0.84118, 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844,\n  0.7306, 0.77452, 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245,\n  0.84843, 0.83203, 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601,\n  0.82601, 0.82601, 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274,\n  0.92274, 0.90747, 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245,\n  0.89453, 0.8675, 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203,\n  0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875,\n  0.86477, 0.99034, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865,\n  0.73206, 0.85865, 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105,\n  0.9245, 1, 1, 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685,\n  0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896,\n  1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032,\n  0.9375, 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249,\n  0.9245, 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118,\n  0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789,\n  0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, 0.79776,\n  0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245,\n  0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, 0.98986, 0.7306,\n  0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004,\n  1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, 0.84557, 0.86651, 1, 1,\n  0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67009, 0.96334, 0.93695,\n  1.35191, 1.40909, 0.95161, 1.48387, 0.8675, 0.90861, 0.6192, 0.7363, 0.64824,\n  0.82411, 0.56321, 0.85696, 1.23516, 0.8675, 0.81552, 0.7286, 0.84134, 0.73206,\n  0.76659, 0.86275, 0.84369, 0.90685, 0.77892, 0.85871, 1.02638, 0.89249,\n  0.75828, 0.84118, 0.85984, 0.77452, 0.76466, 0.79776, 0.7306, 0.90782,\n  0.77818, 0.903, 0.87291, 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516,\n  0.9849, 0.99058, 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297,\n  1.23516, 0.90918, 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507,\n  0.88832, 0.84438, 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248,\n  0.89404, 1.23516, 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 0.89693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85865,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309,\n  0.98986, 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552,\n  0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566,\n  1.2566, 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176,\n  1.11523, 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1,\n  1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055,\n  0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589,\n  0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747,\n  0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8,\n  0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1,\n  0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst CalibriItalicMetrics = { lineHeight: 1.2207, lineGap: 0.2207 };\n\n// Factors to rescale LiberationSans-Regular.ttf to have the same\n// metrics as calibri.ttf.\nconst CalibriRegularFactors = [\n  1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601,\n  0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, 0.91133,\n  0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133,\n  0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071,\n  0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685,\n  0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, 0.77452, 0.86503,\n  0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, 0.77818, 0.7306,\n  0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, 0.8739, 0.86128,\n  0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, 0.94469, 1.03297,\n  1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, 0.94469, 0.94469,\n  1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, 0.86621, 0.90527,\n  0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133,\n  0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.08707, 0.92098,\n  0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1,\n  1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972,\n  0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.73834,\n  0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685,\n  0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85284,\n  0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331,\n  0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.8693, 0.8457, 0.89464,\n  0.89464, 0.89464, 0.89464, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469,\n  0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90747, 0.86651, 0.94469,\n  0.94469, 0.94469, 0.94469, 0.90527, 0.94469, 0.90527, 0.8675, 0.86128, 0.8675,\n  0.86128, 0.8675, 0.86128, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457,\n  0.73834, 0.8457, 0.85193, 0.92454, 0.86477, 0.9921, 0.73206, 0.89464, 0.73206,\n  0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.81105,\n  0.84636, 0.81105, 0.84636, 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872,\n  0.95786, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685,\n  1.03297, 0.90685, 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918,\n  0.75593, 1.03297, 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429,\n  0.89385, 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122,\n  0.9482, 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692,\n  1, 1, 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223,\n  0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, 0.94469,\n  0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469,\n  0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, 0.76659, 0.79004,\n  0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.86128,\n  0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622,\n  1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387,\n  0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, 0.56963, 0.88254,\n  1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, 0.76659, 0.86275,\n  0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, 0.75657, 0.85122,\n  0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, 0.77818, 0.89772,\n  0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, 1.23516, 0.99018,\n  0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, 0.96576, 0.9561, 1.23516,\n  0.90918, 0.92578, 0.95424, 0.89746, 0.83969, 0.9482, 0.80113, 0.89442,\n  0.85208, 0.86155, 0.98022, 0.99018, 1.00452, 0.81209, 0.99247, 0.89181,\n  1.23516, 0.99018, 0.9482, 0.99018, 0.89181, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 0.88844, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89464, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986,\n  0.94258, 0.98986, 0.94258, 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527,\n  1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566,\n  0.89552, 0.89552, 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523,\n  1.4956, 2.01462, 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1,\n  0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055,\n  0.90527, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589,\n  0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747,\n  0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8,\n  0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1,\n  0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1,\n  1.07185, 0.99413, 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst CalibriRegularMetrics = { lineHeight: 1.2207, lineGap: 0.2207 };\n\nexport {\n  CalibriBoldFactors,\n  CalibriBoldItalicFactors,\n  CalibriBoldItalicMetrics,\n  CalibriBoldMetrics,\n  CalibriItalicFactors,\n  CalibriItalicMetrics,\n  CalibriRegularFactors,\n  CalibriRegularMetrics,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Factors to rescale LiberationSans-Bold.ttf to have the same\n// metrics as NimbusSans-Bold.otf.\nconst HelveticaBoldFactors = [\n  0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977,\n  1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006,\n  0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973,\n  0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999,\n  0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977,\n  1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001,\n  1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001,\n  1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998,\n  0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026,\n  1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026,\n  0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1,\n  0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973,\n  0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003,\n  1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006,\n  0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977,\n  0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001,\n  1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022,\n  1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977,\n  0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973,\n  0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973,\n  0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026,\n  1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026,\n  1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973,\n  0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973,\n  0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973,\n  1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973,\n  1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026,\n  0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006,\n  1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, 0.99973, 0.99973, 1.0006,\n  0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828,\n  1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026,\n  0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026,\n  1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977,\n  0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001,\n  0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977,\n  1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977,\n  1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001,\n  1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1,\n  0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998,\n  0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998,\n  0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973,\n  1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026,\n  0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069,\n  1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001,\n  0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995,\n  1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087,\n  1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056,\n  1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006,\n  0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019,\n  0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942,\n  0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944,\n  1.00001, 1.00021, 0.99926, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999,\n  0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.99989, 1.00057,\n  1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994,\n  0.99976, 1.00035, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973,\n  1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 0.9996, 1.00034, 0.99999,\n  1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041,\n  1.00075, 0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 0.99973,\n  0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026,\n  0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005,\n  1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1,\n  0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973,\n  0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998,\n  1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1,\n  0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1,\n  0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027,\n  1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999,\n  0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625,\n  0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972,\n  0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1,\n  0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998,\n  0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst HelveticaBoldMetrics = { lineHeight: 1.2, lineGap: 0.2 };\n\n// Factors to rescale LiberationSans-BoldItalic.ttf to have the same\n// metrics as NimbusSans-BoldItalic.otf.\nconst HelveticaBoldItalicFactors = [\n  0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977,\n  1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006,\n  0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973,\n  0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999,\n  0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977,\n  1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001,\n  1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001,\n  1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998,\n  0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026,\n  1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026,\n  0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1,\n  0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973,\n  0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003,\n  1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006,\n  0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977,\n  0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001,\n  1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022,\n  1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977,\n  0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973,\n  0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973,\n  0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026,\n  1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026,\n  1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973,\n  0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973,\n  0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, 1.00001, 0.99973,\n  1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973,\n  1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026,\n  0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006,\n  1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, 0.99973, 0.99973, 1.0006,\n  0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.01011,\n  1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026,\n  0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026,\n  1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977,\n  0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001,\n  0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977,\n  1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977,\n  1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001,\n  1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1,\n  0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998,\n  0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998,\n  0.99998, 0.99998, 0.99977, 1, 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998,\n  1.0006, 0.99977, 0.99977, 1.00022, 0.91155, 1.00001, 1.00026, 0.99977,\n  1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 0.99966, 1.00022,\n  1.00032, 1.00001, 0.99944, 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1,\n  1.0006, 1.00001, 0.99981, 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064,\n  0.99973, 0.99942, 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014,\n  0.99973, 1.01322, 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064,\n  1.00076, 0.99948, 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948,\n  1.00026, 0.99948, 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035,\n  1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967,\n  0.99964, 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001,\n  0.99973, 1.00066, 0.99967, 0.99967, 1.00041, 0.99998, 0.99999, 0.99977,\n  1.00022, 0.99967, 1.00001, 0.99977, 1.00026, 0.99964, 1.00031, 1.00001,\n  0.99999, 0.99999, 1, 1.00023, 1, 1, 0.99999, 1.00035, 1.00001, 0.99999,\n  0.99973, 0.99977, 0.99999, 1.00058, 0.99973, 0.99973, 0.99955, 0.9995,\n  1.00026, 1.00026, 1.00032, 0.99989, 1.00034, 0.99999, 1.00026, 1.00026,\n  1.00026, 0.99973, 0.45998, 0.99973, 1.00026, 0.99973, 1.00001, 0.99999,\n  0.99982, 0.99994, 0.99996, 1, 1.00042, 1.00044, 1.00029, 1.00023, 0.99973,\n  0.99973, 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975,\n  1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, 1.00044,\n  1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1,\n  0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973,\n  0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998,\n  1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, 0.99978, 1, 1, 0.99991,\n  0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00098, 1, 1, 1, 1.00049, 1, 1,\n  0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027,\n  1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999,\n  0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625,\n  0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972,\n  0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1,\n  0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998,\n  0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst HelveticaBoldItalicMetrics = { lineHeight: 1.35, lineGap: 0.2 };\n\n// Factors to rescale LiberationSans-Italic.ttf to have the same\n// metrics as NimbusSans-Italic.otf.\nconst HelveticaItalicFactors = [\n  0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001,\n  1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006,\n  0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973,\n  0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987,\n  1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977,\n  1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022,\n  0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001,\n  1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973,\n  1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924,\n  0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1,\n  0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973,\n  0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968,\n  0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1,\n  0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002,\n  1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977,\n  1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977,\n  0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022,\n  0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973,\n  0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973,\n  0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973,\n  0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973,\n  0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001,\n  0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288,\n  0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973,\n  1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973,\n  1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973,\n  1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006,\n  1.0006, 0.99946, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924,\n  0.99973, 0.99924, 0.99973, 1.06311, 0.99973, 1.00024, 0.99973, 0.99924,\n  0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00041, 0.9998,\n  0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016,\n  0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1,\n  1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006,\n  0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973,\n  0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001,\n  1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1,\n  0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998,\n  0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998,\n  0.99998, 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013,\n  0.99924, 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977,\n  1.00022, 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022,\n  1.00054, 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1,\n  1.0006, 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945,\n  0.99949, 1, 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962,\n  1.01487, 1, 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036,\n  0.99947, 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036,\n  1.00025, 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006,\n  1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001,\n  1.00019, 1.00001, 1.0001, 0.99986, 1.00001, 1.00001, 1.00038, 0.99954,\n  0.99954, 0.9994, 1.00066, 0.99999, 0.99977, 1.00022, 1.00054, 1.00001,\n  0.99977, 1.00026, 0.99975, 1.0001, 1.00001, 0.99993, 0.9995, 0.99955, 1.00016,\n  0.99978, 0.99974, 1.00019, 1.00022, 0.99955, 1.00053, 0.99973, 1.00089,\n  1.00005, 0.99967, 1.00048, 0.99973, 1.00002, 1.00034, 0.99973, 0.99973,\n  0.99964, 1.00006, 1.00066, 0.99947, 0.99973, 0.98894, 0.99973, 1, 0.44898, 1,\n  0.99946, 1, 1.00039, 1.00082, 0.99991, 0.99991, 0.99985, 1.00022, 1.00023,\n  1.00061, 1.00006, 0.99966, 0.99973, 0.99973, 0.99973, 1.00019, 1.0008, 1,\n  0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 0.98332, 1,\n  0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016,\n  0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924,\n  0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267,\n  0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023,\n  0.99973, 1.00423, 0.99925, 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002,\n  1.00002, 1.00002, 1.00049, 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985,\n  1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031,\n  1.00003, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861,\n  0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999,\n  0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962,\n  1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst HelveticaItalicMetrics = { lineHeight: 1.35, lineGap: 0.2 };\n\n// Factors to rescale LiberationSans-Regular.ttf to have the same\n// metrics as NimbusSans-Regular.otf.\nconst HelveticaRegularFactors = [\n  0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001,\n  1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006,\n  0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973,\n  0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987,\n  1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977,\n  1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022,\n  0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001,\n  1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973,\n  1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924,\n  0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1,\n  0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973,\n  0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968,\n  0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1,\n  0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002,\n  1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977,\n  1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977,\n  0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022,\n  0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973,\n  0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973,\n  0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973,\n  0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973,\n  0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001,\n  0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596,\n  0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973,\n  1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973,\n  1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973,\n  1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006,\n  1.0006, 1.00019, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924,\n  0.99973, 0.99924, 0.99973, 1.02572, 0.99973, 1.00005, 0.99973, 0.99924,\n  0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99999, 0.9998,\n  0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016,\n  0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1,\n  1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006,\n  0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973,\n  0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001,\n  1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1,\n  0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998,\n  0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998,\n  0.99998, 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941,\n  0.99924, 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977,\n  1.00022, 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022,\n  0.99977, 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1,\n  1.0006, 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978,\n  0.99966, 1, 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1,\n  0.96499, 1, 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023,\n  0.99933, 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023,\n  1.00031, 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006,\n  1, 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962,\n  1.00001, 1.00092, 0.99964, 1.00001, 0.99963, 0.99999, 1.00035, 1.00035,\n  1.00082, 0.99962, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977,\n  1.00026, 0.9996, 0.99967, 1.00001, 1.00034, 1.00074, 1.00054, 1.00053,\n  1.00063, 0.99971, 0.99962, 1.00035, 0.99975, 0.99977, 0.99973, 1.00043,\n  0.99953, 1.0007, 0.99915, 0.99973, 1.00008, 0.99892, 1.00073, 1.00073,\n  1.00114, 0.99915, 1.00073, 0.99955, 0.99973, 1.00092, 0.99973, 1, 0.99998, 1,\n  1.0003, 1, 1.00043, 1.00001, 0.99969, 1.0003, 1, 1.00035, 1.00001, 0.9995, 1,\n  1.00092, 0.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006,\n  0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, 1,\n  1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977,\n  1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924,\n  0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999,\n  0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973,\n  0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002,\n  1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254,\n  1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031,\n  0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144,\n  1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026,\n  1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1,\n  0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst HelveticaRegularMetrics = { lineHeight: 1.2, lineGap: 0.2 };\n\nexport {\n  HelveticaBoldFactors,\n  HelveticaBoldItalicFactors,\n  HelveticaBoldItalicMetrics,\n  HelveticaBoldMetrics,\n  HelveticaItalicFactors,\n  HelveticaItalicMetrics,\n  HelveticaRegularFactors,\n  HelveticaRegularMetrics,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Widths of glyphs in LiberationSans-Bold.ttf.\nconst LiberationSansBoldWidths = [\n  365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278,\n  333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333,\n  584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556,\n  722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667,\n  611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611,\n  278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778,\n  556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333,\n  737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333,\n  333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722,\n  667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778,\n  584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556,\n  889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611,\n  611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556,\n  722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, 667,\n  556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611,\n  778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278,\n  278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, 611,\n  479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778,\n  611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556,\n  667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722,\n  611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611,\n  500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333,\n  333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, 906,\n  474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, 722,\n  667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, 278,\n  667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, 278,\n  558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, 753,\n  845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, 556,\n  1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 904, 626,\n  719, 719, 610, 702, 833, 722, 778, 719, 667, 722, 611, 622, 854, 667, 730,\n  703, 1005, 1019, 870, 979, 719, 711, 1031, 719, 556, 618, 615, 417, 635, 556,\n  709, 497, 615, 615, 500, 635, 740, 604, 611, 604, 611, 556, 490, 556, 875,\n  556, 615, 581, 833, 844, 729, 854, 615, 552, 854, 583, 556, 556, 611, 417,\n  552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, 611, 487,\n  447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552,\n  278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333,\n  333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600,\n  834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713,\n  584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604,\n  708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604,\n  604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750,\n  611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333,\n  333, 333, 333, 333, 333,\n];\n\n// Char code of glyphs in LiberationSans-Bold.ttf.\nconst LiberationSansBoldMapping = [\n  -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,\n  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,\n  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,\n  104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,\n  119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167,\n  168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,\n  184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,\n  199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,\n  214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228,\n  229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243,\n  244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258,\n  259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,\n  274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,\n  289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,\n  304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,\n  319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333,\n  334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348,\n  349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,\n  364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,\n  379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538,\n  539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904,\n  905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921,\n  922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937,\n  938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952,\n  953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967,\n  968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030,\n  1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043,\n  1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056,\n  1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069,\n  1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,\n  1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,\n  1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108,\n  1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139,\n  1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211,\n  8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226,\n  8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359,\n  8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593,\n  8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735,\n  8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474,\n  9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555,\n  9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568,\n  9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600,\n  9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650,\n  9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792,\n  9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n];\n\n// Widths of glyphs in LiberationSans-BoldItalic.ttf.\nconst LiberationSansBoldItalicWidths = [\n  365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278,\n  333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333,\n  584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556,\n  722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667,\n  611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611,\n  278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778,\n  556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333,\n  737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333,\n  333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722,\n  667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778,\n  584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556,\n  889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611,\n  611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556,\n  722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, 667,\n  556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611,\n  778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278,\n  278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, 611,\n  479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778,\n  611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556,\n  667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722,\n  611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611,\n  500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333,\n  333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, 906,\n  473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, 722,\n  667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, 278,\n  667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, 278,\n  566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, 773,\n  834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, 556,\n  1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 667, 927, 643,\n  719, 719, 615, 687, 833, 722, 778, 719, 667, 722, 611, 677, 781, 667, 729,\n  708, 979, 989, 854, 1000, 708, 719, 1042, 729, 556, 619, 604, 534, 618, 556,\n  736, 510, 611, 611, 507, 622, 740, 604, 611, 611, 611, 556, 889, 556, 885,\n  556, 646, 583, 889, 935, 707, 854, 594, 552, 865, 589, 556, 556, 611, 469,\n  563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, 575,\n  467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552,\n  278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333,\n  333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600,\n  834, 834, 834, 834, 999, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713,\n  584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604,\n  708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604,\n  604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750,\n  611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333,\n  333, 333, 333, 333, 333,\n];\n\n// Char code of glyphs in LiberationSans-BoldItalic.ttf.\nconst LiberationSansBoldItalicMapping = [\n  -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,\n  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,\n  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,\n  104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,\n  119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167,\n  168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,\n  184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,\n  199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,\n  214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228,\n  229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243,\n  244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258,\n  259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,\n  274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,\n  289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,\n  304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,\n  319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333,\n  334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348,\n  349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,\n  364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,\n  379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538,\n  539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904,\n  905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921,\n  922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937,\n  938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952,\n  953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967,\n  968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030,\n  1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043,\n  1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056,\n  1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069,\n  1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,\n  1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,\n  1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108,\n  1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139,\n  1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211,\n  8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226,\n  8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359,\n  8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593,\n  8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735,\n  8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474,\n  9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555,\n  9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568,\n  9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600,\n  9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650,\n  9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792,\n  9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n];\n\n// Widths of glyphs in LiberationSans-Italic.ttf.\nconst LiberationSansItalicWidths = [\n  365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278,\n  333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278,\n  584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500,\n  667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667,\n  611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556,\n  222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722,\n  500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333,\n  737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333,\n  333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722,\n  667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778,\n  584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556,\n  889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556,\n  556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556,\n  667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 625, 722, 556, 667,\n  556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556,\n  778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278,\n  278, 733, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 281, 556,\n  400, 556, 222, 722, 556, 722, 556, 722, 556, 615, 723, 556, 778, 556, 778,\n  556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500,\n  667, 500, 667, 500, 611, 278, 611, 354, 611, 278, 722, 556, 722, 556, 722,\n  556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611,\n  500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278,\n  333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 789, 846,\n  389, 794, 865, 775, 222, 667, 667, 570, 671, 667, 611, 722, 778, 278, 667,\n  667, 833, 722, 648, 778, 725, 667, 600, 611, 667, 837, 667, 831, 761, 278,\n  667, 570, 439, 555, 222, 550, 570, 571, 500, 556, 439, 463, 555, 542, 222,\n  500, 492, 548, 500, 447, 556, 670, 573, 486, 603, 374, 550, 652, 546, 728,\n  779, 222, 550, 556, 550, 779, 667, 667, 843, 544, 708, 667, 278, 278, 500,\n  1066, 982, 844, 589, 715, 639, 724, 667, 651, 667, 544, 704, 667, 917, 614,\n  715, 715, 589, 686, 833, 722, 778, 725, 667, 722, 611, 639, 795, 667, 727,\n  673, 920, 923, 805, 886, 651, 694, 1022, 682, 556, 562, 522, 493, 553, 556,\n  688, 465, 556, 556, 472, 564, 686, 550, 556, 556, 556, 500, 833, 500, 835,\n  500, 572, 518, 830, 851, 621, 736, 526, 492, 752, 534, 556, 556, 556, 378,\n  496, 500, 222, 222, 222, 910, 828, 556, 472, 565, 500, 556, 778, 556, 492,\n  339, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552,\n  222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333,\n  333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1000, 768, 600,\n  834, 834, 834, 834, 1000, 500, 998, 500, 1000, 500, 500, 494, 612, 823, 713,\n  584, 549, 713, 979, 719, 274, 549, 549, 584, 549, 549, 604, 584, 604, 604,\n  708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604,\n  604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750,\n  500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324,\n  324, 316, 328, 398, 285,\n];\n\n// Char code of glyphs in LiberationSans-Italic.ttf.\nconst LiberationSansItalicMapping = [\n  -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,\n  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,\n  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,\n  104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,\n  119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167,\n  168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,\n  184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,\n  199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,\n  214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228,\n  229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243,\n  244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258,\n  259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,\n  274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,\n  289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,\n  304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,\n  319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333,\n  334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348,\n  349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,\n  364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,\n  379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538,\n  539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904,\n  905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921,\n  922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937,\n  938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952,\n  953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967,\n  968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030,\n  1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043,\n  1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056,\n  1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069,\n  1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,\n  1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,\n  1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108,\n  1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139,\n  1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211,\n  8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226,\n  8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359,\n  8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593,\n  8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735,\n  8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474,\n  9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555,\n  9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568,\n  9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600,\n  9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650,\n  9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792,\n  9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n];\n\n// Widths of glyphs in LiberationSans-Regular.ttf.\nconst LiberationSansRegularWidths = [\n  365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278,\n  333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278,\n  584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500,\n  667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667,\n  611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556,\n  222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722,\n  500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333,\n  737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333,\n  333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722,\n  667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778,\n  584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556,\n  889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556,\n  556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556,\n  667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, 667,\n  556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556,\n  778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278,\n  278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, 556,\n  334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, 778,\n  556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500,\n  667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, 722,\n  556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611,\n  500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278,\n  333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, 838,\n  384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, 667,\n  668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, 278,\n  667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, 222,\n  500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, 713,\n  781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, 500,\n  1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 667, 923, 604,\n  719, 719, 583, 656, 833, 722, 778, 719, 667, 722, 611, 635, 760, 667, 740,\n  667, 917, 938, 792, 885, 656, 719, 1010, 722, 556, 573, 531, 365, 583, 556,\n  669, 458, 559, 559, 438, 583, 688, 552, 556, 542, 556, 500, 458, 500, 823,\n  500, 573, 521, 802, 823, 625, 719, 521, 510, 750, 542, 556, 556, 556, 365,\n  510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, 489,\n  411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552,\n  222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333,\n  333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600,\n  834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713,\n  584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604,\n  708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708,\n  708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604,\n  604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750,\n  500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324,\n  324, 316, 328, 398, 285,\n];\n\n// Char code of glyphs in LiberationSans-Regular.ttf.\nconst LiberationSansRegularMapping = [\n  -1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,\n  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,\n  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,\n  104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,\n  119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167,\n  168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,\n  184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,\n  199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,\n  214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228,\n  229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243,\n  244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258,\n  259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,\n  274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,\n  289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,\n  304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,\n  319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333,\n  334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348,\n  349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,\n  364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,\n  379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538,\n  539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904,\n  905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921,\n  922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937,\n  938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952,\n  953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967,\n  968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030,\n  1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043,\n  1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056,\n  1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069,\n  1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,\n  1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095,\n  1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108,\n  1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139,\n  1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211,\n  8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226,\n  8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359,\n  8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593,\n  8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735,\n  8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474,\n  9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555,\n  9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568,\n  9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600,\n  9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650,\n  9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792,\n  9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1,\n  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n];\n\nexport {\n  LiberationSansBoldItalicMapping,\n  LiberationSansBoldItalicWidths,\n  LiberationSansBoldMapping,\n  LiberationSansBoldWidths,\n  LiberationSansItalicMapping,\n  LiberationSansItalicWidths,\n  LiberationSansRegularMapping,\n  LiberationSansRegularWidths,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Factors to rescale LiberationSans-Bold.ttf to have the same\n// metrics as MyriadPro-Bold.otf.\nconst MyriadProBoldFactors = [\n  1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884,\n  0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582,\n  1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793,\n  0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058,\n  0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275,\n  0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179,\n  0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083,\n  0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903,\n  0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933,\n  0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407,\n  0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938,\n  0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793,\n  0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295,\n  0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1,\n  1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838,\n  0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061,\n  0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179,\n  0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438,\n  0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938,\n  0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938,\n  0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446,\n  0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039,\n  0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938,\n  0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093,\n  0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938,\n  0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768,\n  0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258,\n  0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621,\n  0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1,\n  0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1,\n  0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446,\n  0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646,\n  0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713,\n  0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438,\n  0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083,\n  0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446,\n  0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1,\n  0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088,\n  0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261,\n  0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019,\n  0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156,\n  0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704,\n  0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933,\n  1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933,\n  1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367,\n  0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774,\n  1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.94083, 0.97579, 0.94083, 0.97579, 0.94083,\n  0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582,\n  0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1,\n  0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1,\n  1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.76169,\n  1.02058, 1.0732, 1.05486, 1, 1, 1.30692, 1.08595, 1.08595, 1, 1.08595,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst MyriadProBoldMetrics = { lineHeight: 1.2, lineGap: 0.2 };\n\n// Factors to rescale LiberationSans-BoldItalic.ttf to have the same\n// metrics as MyriadPro-BoldIt.otf.\nconst MyriadProBoldItalicFactors = [\n  1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, 0.92222,\n  0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, 0.93582,\n  1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276,\n  0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058,\n  0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, 0.83655,\n  0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, 0.92222,\n  0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, 0.91605,\n  0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, 1.02058,\n  0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, 0.98796,\n  0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, 0.92168,\n  0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, 0.92061, 0.94236,\n  0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, 0.80779, 0.97276,\n  0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, 0.91339, 1.08074,\n  0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, 1, 1.18616, 1,\n  0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, 0.99043, 0.99043,\n  0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.845, 0.80729,\n  0.77512, 0.77512, 0.77512, 0.77512, 0.98621, 0.98621, 0.98621, 0.98621,\n  0.95961, 0.92222, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 1.02058,\n  0.90251, 0.90699, 0.90699, 0.90699, 0.90699, 0.85458, 0.83659, 0.94951,\n  0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.85811, 0.78216,\n  0.90083, 0.90083, 0.90083, 0.90083, 0.95381, 0.95381, 0.95381, 0.95381,\n  0.9135, 0.92168, 0.91513, 0.91513, 0.91513, 0.91513, 0.91513, 1.08595,\n  0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.89364, 0.92332, 0.89364,\n  0.85576, 0.99613, 0.85576, 0.99613, 0.85576, 0.99613, 0.80729, 0.78216,\n  0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.94299, 0.76783,\n  0.95961, 0.91677, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083,\n  0.77512, 0.90083, 0.77512, 0.90083, 0.86523, 0.9135, 0.86523, 0.9135, 0.86523,\n  0.9135, 1, 1, 0.92222, 0.92168, 0.92222, 0.92168, 0.98621, 0.95381, 0.98621,\n  0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.86036,\n  0.97096, 0.71743, 0.98981, 1, 1, 0.95298, 0.79726, 0.95381, 1, 1, 0.79726,\n  0.6894, 0.79726, 0.74321, 0.81691, 1.0006, 0.92222, 0.92168, 1, 1, 0.92222,\n  0.92168, 0.79464, 0.92098, 0.92168, 0.90637, 0.91513, 0.90637, 0.91513,\n  0.90637, 0.91513, 0.909, 0.87514, 0.80729, 0.95077, 1, 1, 0.80729, 0.95077,\n  0.76463, 0.748, 0.76463, 0.748, 1, 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651,\n  0.86275, 1.04502, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677,\n  0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.9154, 0.94236,\n  0.85458, 0.89364, 0.85458, 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1,\n  0.97276, 0.85576, 0.99613, 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.86275,\n  1.04502, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616,\n  1.18616, 1.18616, 1.00899, 1.30628, 0.85576, 0.80178, 0.66862, 0.7927,\n  0.69323, 0.88127, 0.72459, 0.89711, 0.95381, 0.85576, 0.80591, 0.7805,\n  0.94729, 0.77512, 0.90531, 0.92222, 0.90637, 0.98621, 0.81698, 0.92655,\n  0.98558, 0.92222, 0.85359, 0.90637, 0.90976, 0.83809, 0.94523, 0.86275,\n  0.83509, 0.93157, 0.85308, 0.83392, 0.92346, 0.98621, 0.83509, 0.92886,\n  0.91324, 0.92168, 0.95381, 0.90646, 0.92886, 0.90557, 0.86847, 0.90276,\n  0.91324, 0.86842, 0.92168, 0.99531, 0.95381, 0.9224, 0.85408, 0.92699,\n  0.86847, 1.0051, 0.91513, 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646,\n  0.97355, 0.81539, 0.89398, 0.85923, 0.95381, 0.90646, 0.91513, 0.90646,\n  0.85923, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  0.9154, 0.94236, 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694,\n  1, 0.89903, 1, 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896,\n  0.9332, 0.9332, 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1,\n  1, 1, 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1.14542, 1, 0.79199, 0.78694, 1.02058, 1.03493, 1.05486, 1, 1, 1.23026,\n  1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst MyriadProBoldItalicMetrics = { lineHeight: 1.2, lineGap: 0.2 };\n\n// Factors to rescale LiberationSans-Italic.ttf to have the same\n// metrics as MyriadPro-It.otf.\nconst MyriadProItalicFactors = [\n  1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, 0.88307,\n  0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, 0.75945,\n  1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465,\n  0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, 1.02058,\n  0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, 0.76125,\n  0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, 0.87514, 0.8588,\n  0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, 0.80811, 0.87832,\n  0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, 1.27014, 0.89903, 1.15012,\n  0.93859, 0.94399, 0.846, 0.94399, 0.81453, 1.0186, 0.94219, 0.96017, 1.03075,\n  1.02175, 0.912, 1.03075, 0.96998, 0.96017, 0.93859, 0.94399, 0.94399, 0.95493,\n  0.746, 1.12658, 0.94578, 0.91, 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537,\n  0.85034, 1.02058, 0.70869, 0.88465, 0.88465, 0.88465, 0.88465, 0.83537,\n  0.90083, 1.15012, 0.9161, 0.94565, 0.73541, 1.02058, 0.53609, 0.69353,\n  0.79519, 1.08595, 1, 1, 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446,\n  0.73361, 0.9005, 0.9005, 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158,\n  0.85158, 0.85158, 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864,\n  0.83864, 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588,\n  0.8588, 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512,\n  0.76013, 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859,\n  0.8075, 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424,\n  0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859,\n  1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882,\n  0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, 0.76852,\n  0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, 0.94399,\n  0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453,\n  0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, 0.94219, 1, 1,\n  0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, 0.83864, 0.82424,\n  0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, 0.81402, 1.02738, 0.728,\n  1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, 0.79475, 0.83911, 0.79475,\n  0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, 1, 0.87514, 0.96017, 0.86865,\n  0.87396, 0.96017, 0.8588, 0.93859, 0.8588, 0.93859, 0.8588, 0.93859, 0.867,\n  0.84759, 0.72421, 0.95493, 1, 1, 0.72421, 0.95493, 0.69866, 0.746, 0.69866,\n  0.746, 1, 1, 0.69866, 0.746, 1, 1, 0.77598, 0.88417, 0.77598, 1.12658,\n  0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578,\n  0.85991, 0.94578, 0.85991, 0.94578, 0.87832, 0.979, 0.77512, 0.882, 0.77512,\n  0.8562, 0.83, 0.8562, 0.83, 0.8562, 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773,\n  0.8075, 0.85751, 0.8562, 1, 1, 0.77598, 1.12658, 1.15012, 1.15012, 1.15012,\n  1.15012, 1.15012, 1.15313, 1.15012, 1.15012, 1.15012, 1.08106, 1.03901,\n  0.85158, 0.77025, 0.62264, 0.7646, 0.65351, 0.86026, 0.69461, 0.89947,\n  1.03075, 0.85158, 0.77812, 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588,\n  0.83864, 0.77212, 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701,\n  0.76013, 0.89058, 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386,\n  0.83864, 0.8156, 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298,\n  0.878, 0.93942, 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787,\n  0.95829, 0.88, 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737,\n  0.91123, 0.93969, 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859,\n  0.91123, 0.86799, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 0.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219,\n  1, 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027,\n  0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, 1,\n  1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1.04828, 1, 0.74948, 0.75187, 1.02058, 0.98391, 1.02119, 1, 1, 1.06233,\n  1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst MyriadProItalicMetrics = { lineHeight: 1.2, lineGap: 0.2 };\n\n// Factors to rescale LiberationSans-Regular.ttf to have the same\n// metrics as MyriadPro-Regular.otf.\nconst MyriadProRegularFactors = [\n  1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, 0.90706,\n  0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, 0.74505, 1.23456,\n  0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241,\n  0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, 1.02058, 0.73002,\n  0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, 0.79726, 0.83051,\n  0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, 0.8858, 0.79761,\n  0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, 0.89633, 0.85608, 0.8111,\n  0.90531, 1.0222, 1.22736, 1.0222, 1.27014, 0.89903, 0.90088, 0.86667, 1.0231,\n  0.896, 1.01411, 0.90083, 1.05099, 1.00512, 0.99793, 1.05326, 1.09377, 0.938,\n  1.06226, 1.00119, 0.99793, 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137,\n  0.99074, 0.962, 1.01915, 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034,\n  1.02058, 0.69067, 0.92241, 0.92241, 0.92241, 0.92241, 0.92006, 0.9332,\n  0.90088, 0.91882, 0.93484, 0.75339, 1.02058, 0.56866, 0.54324, 0.79519,\n  1.08595, 1, 1, 0.90088, 1, 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339,\n  0.91009, 0.91009, 0.91009, 0.66466, 0.91755, 0.91755, 0.91755, 0.91755,\n  0.91755, 0.91755, 0.788, 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023,\n  0.86023, 0.86023, 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858,\n  0.8858, 1.02058, 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611,\n  0.89713, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896,\n  0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224,\n  0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595,\n  0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755,\n  0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896,\n  0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764,\n  0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764,\n  0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, 0.90284,\n  0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023,\n  0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, 0.74, 1.09377,\n  1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, 0.84869, 0.81441,\n  0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, 0.99793, 0.91887, 0.90991,\n  0.99793, 0.8858, 0.98714, 0.8858, 0.98714, 0.8858, 0.98714, 0.894, 0.91434,\n  0.74498, 0.98196, 1, 1, 0.74498, 0.98196, 0.73914, 0.792, 0.73914, 0.792, 1,\n  1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, 0.81363, 1.19137, 0.89591, 0.99074,\n  0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074,\n  0.89591, 0.99074, 0.89633, 1.01915, 0.8111, 0.942, 0.8111, 0.90531, 0.856,\n  0.90531, 0.856, 0.90531, 0.856, 1, 0.92241, 0.91755, 0.86667, 0.788, 0.86936,\n  0.8858, 0.89876, 1, 1, 0.81363, 1.19137, 0.90088, 0.90088, 0.90088, 0.90088,\n  0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90388, 1.03901, 0.92138,\n  0.78105, 0.7154, 0.86169, 0.80513, 0.94007, 0.82528, 0.98612, 1.06226,\n  0.91755, 0.8126, 0.81884, 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023,\n  0.8126, 0.91172, 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297,\n  0.81363, 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157,\n  0.95308, 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088,\n  0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938,\n  0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007,\n  0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.88888, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89633, 1.01915,\n  0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, 1, 0.89903, 1, 1,\n  1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, 1.06904, 0.89903, 0.89903,\n  0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, 0.72458, 1, 1, 1, 1, 0.92241,\n  1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.07257, 1,\n  0.74705, 0.71119, 1.02058, 1.024, 1.02119, 1, 1, 1.1536, 1.08595, 1.08595, 1,\n  1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1,\n];\nconst MyriadProRegularMetrics = { lineHeight: 1.2, lineGap: 0.2 };\n\nexport {\n  MyriadProBoldFactors,\n  MyriadProBoldItalicFactors,\n  MyriadProBoldItalicMetrics,\n  MyriadProBoldMetrics,\n  MyriadProItalicFactors,\n  MyriadProItalicMetrics,\n  MyriadProRegularFactors,\n  MyriadProRegularMetrics,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Factors to rescale LiberationSans-Bold.ttf to have the same\n// metrics as segoeuib.ttf.\nconst SegoeuiBoldFactors = [\n  1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647,\n  1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578,\n  1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424,\n  1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847,\n  0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406,\n  0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489,\n  0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361,\n  1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304,\n  1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527,\n  1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862,\n  0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579,\n  0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727,\n  1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826,\n  1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866,\n  1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363,\n  0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795,\n  0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426,\n  0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135,\n  1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752,\n  0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278,\n  1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826,\n  1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752,\n  0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641,\n  0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517,\n  0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278,\n  0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1,\n  1.06085, 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406,\n  1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, 1.02285,\n  1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418,\n  0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251,\n  0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931,\n  0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104,\n  0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862,\n  1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041,\n  1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752,\n  0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733,\n  1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923,\n  1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912,\n  1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167,\n  1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134,\n  0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889,\n  1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996,\n  0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008,\n  1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008,\n  1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434,\n  0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439,\n  1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, 1, 1, 1,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.97278, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, 1.06467, 1.02511,\n  1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1,\n  1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633,\n  0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372,\n  0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1,\n  0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279,\n  0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416,\n  1.13973, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21172, 1.29004,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025,\n  1.18874, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886,\n  1.04315, 1.15296, 1.34163, 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst SegoeuiBoldMetrics = { lineHeight: 1.33008, lineGap: 0 };\n\n// Factors to rescale LiberationSans-BoldItalic.ttf to have the same\n// metrics as segoeuiz.ttf.\nconst SegoeuiBoldItalicFactors = [\n  1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953,\n  1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, 1.59754,\n  1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 0.81378,\n  0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, 0.97363, 0.89723,\n  0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, 1.1406, 0.79631, 0.90128,\n  0.83853, 1.04396, 1.10615, 0.97552, 0.94436, 0.97552, 0.88641, 0.80527,\n  0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, 0.99361, 1.11144, 1.57293,\n  1.11144, 1.21237, 0.74627, 1.31818, 1.06585, 0.97042, 0.83055, 0.97042,\n  0.93503, 1.1261, 0.97042, 0.97922, 1.14236, 0.94552, 1.01054, 1.14236,\n  1.02471, 0.97922, 0.94165, 0.97042, 0.97042, 1.0276, 0.78929, 1.1261, 0.97922,\n  0.95874, 1.02197, 0.98507, 0.96752, 0.97168, 0.95107, 1.16579, 0.95107,\n  1.21237, 1.03959, 1.036, 1.036, 1, 1.036, 1.16579, 0.87357, 1.31818, 1.18754,\n  1.26781, 1.05356, 1.21237, 1.18622, 0.79487, 0.94994, 1.29004, 1.24047,\n  1.24047, 1.31818, 1, 0.91484, 0.9754, 1.31818, 1.1349, 1.24866, 1.05356,\n  1.13934, 1.15574, 1.17389, 0.73541, 0.97363, 0.97363, 0.97363, 0.97363,\n  0.97363, 0.97363, 0.94385, 0.87897, 0.79429, 0.79429, 0.79429, 0.79429,\n  1.1406, 1.1406, 1.1406, 1.1406, 1.0426, 1.10615, 0.97552, 0.97552, 0.97552,\n  0.97552, 0.97552, 1.21237, 0.97552, 1.00135, 1.00135, 1.00135, 1.00135,\n  0.91142, 0.94436, 0.98721, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585,\n  1.06585, 0.96705, 0.83055, 0.93503, 0.93503, 0.93503, 0.93503, 1.14236,\n  1.14236, 1.14236, 1.14236, 0.93125, 0.97922, 0.94165, 0.94165, 0.94165,\n  0.94165, 0.94165, 1.29004, 0.94165, 0.97922, 0.97922, 0.97922, 0.97922,\n  0.96752, 0.97042, 0.96752, 0.97363, 1.06585, 0.97363, 1.06585, 0.97363,\n  1.06585, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897,\n  0.83055, 1.0426, 1.0033, 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503,\n  0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042,\n  0.91149, 0.97042, 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922,\n  1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406,\n  1.14236, 0.97441, 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236,\n  1, 1, 0.83853, 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 1.10615, 0.97922,\n  1, 1, 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552,\n  0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641,\n  1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527,\n  0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, 1.00135,\n  0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135,\n  0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, 0.97168,\n  0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, 1.06585, 0.94385,\n  0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, 1.31818, 1.31818,\n  1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 0.95161, 1.27126,\n  1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, 0.86142, 1.07205,\n  1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, 0.99361, 1.05815,\n  0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, 0.84918, 0.97552,\n  1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, 0.9817, 1.01945,\n  0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, 1.14236, 1.07514, 1.04961,\n  0.99607, 1.02897, 1.008, 0.9898, 0.95134, 1.00639, 1.11121, 1.14236, 1.00518,\n  0.97981, 1.02186, 1, 1.08578, 0.94165, 0.99314, 0.98387, 0.93028, 0.93377,\n  1.35125, 1.07514, 1.10687, 0.93491, 1.04232, 1.00351, 1.14236, 1.07514,\n  0.94165, 1.07514, 1.00351, 0.79429, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.93503, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 0.96609, 1, 1, 1, 1, 1, 1, 1.06777, 1.02197, 1.06777,\n  1.02197, 1.06777, 1.02197, 0.91142, 0.96752, 1, 1.21261, 0.89903, 1, 1,\n  0.75155, 1.04745, 1.04745, 1.04745, 1.04394, 0.98633, 0.98633, 0.98633,\n  0.72959, 0.72959, 1.20502, 0.91406, 1.26514, 1.222, 1.02956, 1.03372, 1.03372,\n  0.96039, 1.24633, 1, 1.09125, 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1,\n  0.771, 1, 1, 1.15574, 1.15574, 1.15574, 1.15574, 0.86364, 0.94434, 0.86279,\n  0.94434, 0.86224, 1, 1, 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416,\n  1.13904, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21339, 1.29004,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025,\n  1.18775, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886,\n  1.04315, 1.15296, 1.34163, 1, 1, 1, 1.13269, 1.13269, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst SegoeuiBoldItalicMetrics = { lineHeight: 1.33008, lineGap: 0 };\n\n// Factors to rescale LiberationSans-Italic.ttf to have the same\n// metrics as segoeuii.ttf.\nconst SegoeuiItalicFactors = [\n  1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, 1.15373,\n  1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, 0.78383,\n  1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927,\n  0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, 1.17308,\n  0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, 0.80016,\n  0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, 1.03989,\n  0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, 0.94143,\n  0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, 1.45994, 0.74627,\n  1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, 1.06151, 0.97454,\n  1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, 1.01054, 0.96225,\n  0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, 0.94629, 0.9973,\n  0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, 1.17308, 0.95748,\n  0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, 1.23393, 1.1781,\n  0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, 1.09971, 1.09971,\n  1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, 0.9245, 1.09836,\n  1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729,\n  0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, 0.74817, 0.95782,\n  0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, 0.96924, 0.96924,\n  0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, 0.95402, 0.95402,\n  0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454,\n  0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, 0.87533, 0.93146,\n  0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, 0.96225, 0.96225,\n  0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, 1.00351, 1.00351,\n  0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, 0.97454, 0.94729,\n  0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506,\n  0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, 0.87533, 0.74817, 0.87533,\n  0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.88449, 0.97454,\n  0.88449, 0.97454, 0.88449, 0.97454, 1, 1, 0.98039, 1.00176, 0.98039, 1.00176,\n  0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 1.16484,\n  0.95782, 0.93146, 0.84421, 1.12761, 0.69238, 1.08132, 1, 1, 0.98047, 0.83231,\n  1.16484, 1, 1, 0.84723, 1.04861, 0.84723, 0.78755, 0.83231, 1.23736, 1.03989,\n  1.01054, 1, 1, 1.03989, 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225,\n  0.96924, 0.96225, 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1,\n  0.80595, 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004,\n  0.74524, 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351,\n  0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351,\n  0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, 0.9043,\n  0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, 0.97454, 0.85498,\n  0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, 1.04839, 1.04839,\n  1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 0.81965, 0.81965,\n  0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, 0.77596, 1.05734, 1.2,\n  0.94729, 0.85944, 0.82791, 0.9607, 0.74817, 0.93285, 0.98039, 0.96924,\n  0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, 0.96924, 0.97642,\n  0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, 0.97296, 1.01284,\n  0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, 1.0976, 0.98205,\n  1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, 1.02148, 1.0119,\n  1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, 0.93574, 0.94818, 1.30679,\n  1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, 1.0675, 0.96225, 1.0675,\n  1.0326, 0.74817, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03754, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87533, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, 0.98448, 0.9973, 0.98448, 0.9973,\n  0.83089, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 0.94945, 0.94945,\n  0.94945, 0.94945, 1.12317, 1.12317, 1.12317, 0.67603, 0.67603, 1.15621,\n  0.73584, 1.21191, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1,\n  1.07497, 0.87709, 0.96927, 1.01473, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.09836,\n  1.09836, 1.09836, 1.01522, 0.86321, 0.94434, 0.8649, 0.94434, 0.86182, 1, 1,\n  1.083, 1, 0.91578, 0.86438, 1.17308, 1.18416, 1.14589, 0.69825, 0.97622,\n  1.96791, 1.24822, 1.24822, 1.17308, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862,\n  0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603,\n  1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1,\n  1.10742, 1.10742, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst SegoeuiItalicMetrics = { lineHeight: 1.33008, lineGap: 0 };\n\n// Factors to rescale LiberationSans-Regular.ttf to have the same\n// metrics as segoeui.ttf.\nconst SegoeuiRegularFactors = [\n  1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, 1.19985,\n  1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, 0.78032, 1.40246,\n  0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927,\n  0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, 1.1714, 0.80597, 0.94084,\n  0.96706, 0.85944, 0.85734, 0.97093, 0.75842, 0.79936, 0.88198, 0.9831,\n  0.95782, 0.71387, 0.86969, 0.84636, 1.07796, 1.03584, 0.96924, 0.83968,\n  0.96924, 0.82826, 0.79649, 0.85771, 0.95132, 0.93119, 0.98965, 0.88433,\n  0.8287, 0.93365, 1.08612, 1.3638, 1.08612, 1.45786, 0.74627, 0.80499, 0.91484,\n  1.05707, 0.92383, 1.05882, 0.9403, 1.12654, 1.05882, 1.01756, 1.09011,\n  1.09011, 0.99414, 1.09011, 1.034, 1.01756, 1.05356, 1.05707, 1.05882, 1.04399,\n  0.84863, 1.21968, 1.01756, 0.95801, 1.00068, 0.91797, 0.96777, 0.9043,\n  0.90351, 0.92105, 0.90351, 1.1714, 0.85337, 0.96927, 0.96927, 0.99912,\n  0.96927, 0.92105, 0.80597, 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808,\n  0.75155, 0.94261, 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032,\n  0.61584, 1.05425, 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381,\n  0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734,\n  0.75842, 0.75842, 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782,\n  0.97093, 1.03584, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714,\n  0.96924, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049,\n  0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383,\n  0.9403, 0.9403, 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527,\n  1.01756, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923,\n  1.01756, 1.01756, 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706,\n  0.91484, 0.96706, 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734,\n  0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093,\n  1.05882, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403,\n  0.75842, 0.9403, 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1,\n  0.9831, 1.01756, 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782,\n  0.8717, 0.95782, 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011,\n  1, 1, 0.99414, 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298,\n  0.84636, 1.23297, 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444,\n  1.01756, 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066,\n  0.98293, 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649,\n  0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, 0.85771,\n  1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132,\n  1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, 0.8287,\n  0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, 1.08571,\n  0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, 1, 0.85771,\n  1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, 0.55572,\n  1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, 0.92366,\n  0.98601, 1.03405, 0.77968, 1.09799, 1.2, 0.96706, 0.85944, 0.85638, 0.96491,\n  0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, 1.07796,\n  1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, 0.8287,\n  0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, 1.03424,\n  1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, 1.03424,\n  1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, 0.9087,\n  1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, 1.05205,\n  1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.75842, 1, 1, 1, 1, 1, 1,\n  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,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9403,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, 1, 0.98965,\n  1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, 1.20088,\n  0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, 1.13196, 1.13196,\n  1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, 1.22135, 1.06483,\n  0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, 0.96927, 1.01518,\n  0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, 1.11358, 1.06967, 0.86279,\n  0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86507, 1.1714,\n  1.18416, 1.14589, 0.69825, 0.97622, 1.9697, 1.24822, 1.24822, 1.17238,\n  1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025,\n  0.87025, 1.18083, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1,\n  1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10938, 1.10938, 1, 1, 1,\n  1.05425, 1.09971, 1.09971, 1.09971, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n];\nconst SegoeuiRegularMetrics = { lineHeight: 1.33008, lineGap: 0 };\n\nexport {\n  SegoeuiBoldFactors,\n  SegoeuiBoldItalicFactors,\n  SegoeuiBoldItalicMetrics,\n  SegoeuiBoldMetrics,\n  SegoeuiItalicFactors,\n  SegoeuiItalicMetrics,\n  SegoeuiRegularFactors,\n  SegoeuiRegularMetrics,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  CalibriBoldFactors,\n  CalibriBoldItalicFactors,\n  CalibriBoldItalicMetrics,\n  CalibriBoldMetrics,\n  CalibriItalicFactors,\n  CalibriItalicMetrics,\n  CalibriRegularFactors,\n  CalibriRegularMetrics,\n} from \"./calibri_factors.js\";\nimport { Dict, Name } from \"./primitives.js\";\nimport {\n  HelveticaBoldFactors,\n  HelveticaBoldItalicFactors,\n  HelveticaBoldItalicMetrics,\n  HelveticaBoldMetrics,\n  HelveticaItalicFactors,\n  HelveticaItalicMetrics,\n  HelveticaRegularFactors,\n  HelveticaRegularMetrics,\n} from \"./helvetica_factors.js\";\nimport {\n  LiberationSansBoldItalicMapping,\n  LiberationSansBoldItalicWidths,\n  LiberationSansBoldMapping,\n  LiberationSansBoldWidths,\n  LiberationSansItalicMapping,\n  LiberationSansItalicWidths,\n  LiberationSansRegularMapping,\n  LiberationSansRegularWidths,\n} from \"./liberationsans_widths.js\";\nimport {\n  MyriadProBoldFactors,\n  MyriadProBoldItalicFactors,\n  MyriadProBoldItalicMetrics,\n  MyriadProBoldMetrics,\n  MyriadProItalicFactors,\n  MyriadProItalicMetrics,\n  MyriadProRegularFactors,\n  MyriadProRegularMetrics,\n} from \"./myriadpro_factors.js\";\nimport {\n  SegoeuiBoldFactors,\n  SegoeuiBoldItalicFactors,\n  SegoeuiBoldItalicMetrics,\n  SegoeuiBoldMetrics,\n  SegoeuiItalicFactors,\n  SegoeuiItalicMetrics,\n  SegoeuiRegularFactors,\n  SegoeuiRegularMetrics,\n} from \"./segoeui_factors.js\";\nimport { getLookupTableFactory } from \"./core_utils.js\";\nimport { normalizeFontName } from \"./fonts_utils.js\";\n\nconst getXFAFontMap = getLookupTableFactory(function (t) {\n  t[\"MyriadPro-Regular\"] = t[\"PdfJS-Fallback-Regular\"] = {\n    name: \"LiberationSans-Regular\",\n    factors: MyriadProRegularFactors,\n    baseWidths: LiberationSansRegularWidths,\n    baseMapping: LiberationSansRegularMapping,\n    metrics: MyriadProRegularMetrics,\n  };\n  t[\"MyriadPro-Bold\"] = t[\"PdfJS-Fallback-Bold\"] = {\n    name: \"LiberationSans-Bold\",\n    factors: MyriadProBoldFactors,\n    baseWidths: LiberationSansBoldWidths,\n    baseMapping: LiberationSansBoldMapping,\n    metrics: MyriadProBoldMetrics,\n  };\n  t[\"MyriadPro-It\"] =\n    t[\"MyriadPro-Italic\"] =\n    t[\"PdfJS-Fallback-Italic\"] =\n      {\n        name: \"LiberationSans-Italic\",\n        factors: MyriadProItalicFactors,\n        baseWidths: LiberationSansItalicWidths,\n        baseMapping: LiberationSansItalicMapping,\n        metrics: MyriadProItalicMetrics,\n      };\n  t[\"MyriadPro-BoldIt\"] =\n    t[\"MyriadPro-BoldItalic\"] =\n    t[\"PdfJS-Fallback-BoldItalic\"] =\n      {\n        name: \"LiberationSans-BoldItalic\",\n        factors: MyriadProBoldItalicFactors,\n        baseWidths: LiberationSansBoldItalicWidths,\n        baseMapping: LiberationSansBoldItalicMapping,\n        metrics: MyriadProBoldItalicMetrics,\n      };\n  t.ArialMT =\n    t.Arial =\n    t[\"Arial-Regular\"] =\n      {\n        name: \"LiberationSans-Regular\",\n        baseWidths: LiberationSansRegularWidths,\n        baseMapping: LiberationSansRegularMapping,\n      };\n  t[\"Arial-BoldMT\"] = t[\"Arial-Bold\"] = {\n    name: \"LiberationSans-Bold\",\n    baseWidths: LiberationSansBoldWidths,\n    baseMapping: LiberationSansBoldMapping,\n  };\n  t[\"Arial-ItalicMT\"] = t[\"Arial-Italic\"] = {\n    name: \"LiberationSans-Italic\",\n    baseWidths: LiberationSansItalicWidths,\n    baseMapping: LiberationSansItalicMapping,\n  };\n  t[\"Arial-BoldItalicMT\"] = t[\"Arial-BoldItalic\"] = {\n    name: \"LiberationSans-BoldItalic\",\n    baseWidths: LiberationSansBoldItalicWidths,\n    baseMapping: LiberationSansBoldItalicMapping,\n  };\n  t[\"Calibri-Regular\"] = {\n    name: \"LiberationSans-Regular\",\n    factors: CalibriRegularFactors,\n    baseWidths: LiberationSansRegularWidths,\n    baseMapping: LiberationSansRegularMapping,\n    metrics: CalibriRegularMetrics,\n  };\n  t[\"Calibri-Bold\"] = {\n    name: \"LiberationSans-Bold\",\n    factors: CalibriBoldFactors,\n    baseWidths: LiberationSansBoldWidths,\n    baseMapping: LiberationSansBoldMapping,\n    metrics: CalibriBoldMetrics,\n  };\n  t[\"Calibri-Italic\"] = {\n    name: \"LiberationSans-Italic\",\n    factors: CalibriItalicFactors,\n    baseWidths: LiberationSansItalicWidths,\n    baseMapping: LiberationSansItalicMapping,\n    metrics: CalibriItalicMetrics,\n  };\n  t[\"Calibri-BoldItalic\"] = {\n    name: \"LiberationSans-BoldItalic\",\n    factors: CalibriBoldItalicFactors,\n    baseWidths: LiberationSansBoldItalicWidths,\n    baseMapping: LiberationSansBoldItalicMapping,\n    metrics: CalibriBoldItalicMetrics,\n  };\n  t[\"Segoeui-Regular\"] = {\n    name: \"LiberationSans-Regular\",\n    factors: SegoeuiRegularFactors,\n    baseWidths: LiberationSansRegularWidths,\n    baseMapping: LiberationSansRegularMapping,\n    metrics: SegoeuiRegularMetrics,\n  };\n  t[\"Segoeui-Bold\"] = {\n    name: \"LiberationSans-Bold\",\n    factors: SegoeuiBoldFactors,\n    baseWidths: LiberationSansBoldWidths,\n    baseMapping: LiberationSansBoldMapping,\n    metrics: SegoeuiBoldMetrics,\n  };\n  t[\"Segoeui-Italic\"] = {\n    name: \"LiberationSans-Italic\",\n    factors: SegoeuiItalicFactors,\n    baseWidths: LiberationSansItalicWidths,\n    baseMapping: LiberationSansItalicMapping,\n    metrics: SegoeuiItalicMetrics,\n  };\n  t[\"Segoeui-BoldItalic\"] = {\n    name: \"LiberationSans-BoldItalic\",\n    factors: SegoeuiBoldItalicFactors,\n    baseWidths: LiberationSansBoldItalicWidths,\n    baseMapping: LiberationSansBoldItalicMapping,\n    metrics: SegoeuiBoldItalicMetrics,\n  };\n  t[\"Helvetica-Regular\"] = t.Helvetica = {\n    name: \"LiberationSans-Regular\",\n    factors: HelveticaRegularFactors,\n    baseWidths: LiberationSansRegularWidths,\n    baseMapping: LiberationSansRegularMapping,\n    metrics: HelveticaRegularMetrics,\n  };\n  t[\"Helvetica-Bold\"] = {\n    name: \"LiberationSans-Bold\",\n    factors: HelveticaBoldFactors,\n    baseWidths: LiberationSansBoldWidths,\n    baseMapping: LiberationSansBoldMapping,\n    metrics: HelveticaBoldMetrics,\n  };\n  t[\"Helvetica-Italic\"] = {\n    name: \"LiberationSans-Italic\",\n    factors: HelveticaItalicFactors,\n    baseWidths: LiberationSansItalicWidths,\n    baseMapping: LiberationSansItalicMapping,\n    metrics: HelveticaItalicMetrics,\n  };\n  t[\"Helvetica-BoldItalic\"] = {\n    name: \"LiberationSans-BoldItalic\",\n    factors: HelveticaBoldItalicFactors,\n    baseWidths: LiberationSansBoldItalicWidths,\n    baseMapping: LiberationSansBoldItalicMapping,\n    metrics: HelveticaBoldItalicMetrics,\n  };\n});\n\nfunction getXfaFontName(name) {\n  const fontName = normalizeFontName(name);\n  const fontMap = getXFAFontMap();\n  return fontMap[fontName];\n}\n\nfunction getXfaFontWidths(name) {\n  const info = getXfaFontName(name);\n  if (!info) {\n    return null;\n  }\n\n  const { baseWidths, baseMapping, factors } = info;\n  const rescaledBaseWidths = !factors\n    ? baseWidths\n    : baseWidths.map((w, i) => w * factors[i]);\n\n  let currentCode = -2;\n  let currentArray;\n\n  // Widths array for composite font is:\n  // CharCode1 [10, 20, 30] ...\n  // which means:\n  //   - CharCode1 has a width equal to 10\n  //   - CharCode1+1 has a width equal to 20\n  //   - CharCode1+2 has a width equal to 30\n  //\n  // The baseMapping array contains a map for glyph index to unicode.\n  // So from baseMapping we'll get sorted unicodes and their positions\n  // (i.e. glyph indices) and then we put widths in an array for the\n  // the consecutive unicodes.\n  const newWidths = [];\n  for (const [unicode, glyphIndex] of baseMapping\n    .map(\n      (charUnicode, index) => [\n        charUnicode,\n        index,\n      ] /* collect unicode and glyph index */\n    )\n    .sort(\n      ([unicode1], [unicode2]) =>\n        unicode1 - unicode2 /* order by unicode only */\n    )) {\n    if (unicode === -1) {\n      continue;\n    }\n\n    if (unicode === currentCode + 1) {\n      currentArray.push(rescaledBaseWidths[glyphIndex]);\n      currentCode += 1;\n    } else {\n      currentCode = unicode;\n      currentArray = [rescaledBaseWidths[glyphIndex]];\n      newWidths.push(unicode, currentArray);\n    }\n  }\n\n  return newWidths;\n}\n\nfunction getXfaFontDict(name) {\n  const widths = getXfaFontWidths(name);\n  const dict = new Dict(null);\n  dict.set(\"BaseFont\", Name.get(name));\n  dict.set(\"Type\", Name.get(\"Font\"));\n  dict.set(\"Subtype\", Name.get(\"CIDFontType2\"));\n  dict.set(\"Encoding\", Name.get(\"Identity-H\"));\n  dict.set(\"CIDToGIDMap\", Name.get(\"Identity\"));\n  dict.set(\"W\", widths);\n  dict.set(\"FirstChar\", widths[0]);\n  dict.set(\"LastChar\", widths.at(-2) + widths.at(-1).length - 1);\n  const descriptor = new Dict(null);\n  dict.set(\"FontDescriptor\", descriptor);\n  const systemInfo = new Dict(null);\n  systemInfo.set(\"Ordering\", \"Identity\");\n  systemInfo.set(\"Registry\", \"Adobe\");\n  systemInfo.set(\"Supplement\", 0);\n  dict.set(\"CIDSystemInfo\", systemInfo);\n\n  return dict;\n}\n\nexport { getXfaFontDict, getXfaFontName };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst TOKEN = {\n  // Structural tokens 鈥� not keyword operators\n  number: 0,\n  lbrace: 1,\n  rbrace: 2,\n\n  // Boolean literals\n  true: 3,\n  false: 4,\n\n  // Arithmetic binary operators\n  add: 5,\n  sub: 6,\n  mul: 7,\n  div: 8,\n  idiv: 9,\n  mod: 10,\n  exp: 11,\n\n  // Comparison binary operators\n  eq: 12,\n  ne: 13,\n  gt: 14,\n  ge: 15,\n  lt: 16,\n  le: 17,\n\n  // Bitwise / boolean binary operators\n  and: 18,\n  or: 19,\n  xor: 20,\n  bitshift: 21,\n\n  // Unary arithmetic operators\n  abs: 22,\n  neg: 23,\n  ceiling: 24,\n  floor: 25,\n  round: 26,\n  truncate: 27,\n\n  // Unary boolean / bitwise operator\n  not: 28,\n\n  // Mathematical functions 鈥� unary\n  sqrt: 29,\n  sin: 30,\n  cos: 31,\n  ln: 32,\n  log: 33,\n\n  // Mathematical function 鈥� binary\n  atan: 34,\n\n  // Type conversion operators\n  cvi: 35,\n  cvr: 36,\n\n  // Stack operators\n  dup: 37,\n  exch: 38,\n  pop: 39,\n  copy: 40,\n  index: 41,\n  roll: 42,\n\n  // Control flow\n  if: 43,\n  ifelse: 44,\n\n  // End of input\n  eof: 45,\n\n  // Synthetic: produced by the optimizer, never emitted by the lexer.\n  min: 46,\n  max: 47,\n};\n\nclass Token {\n  constructor(id, value = null) {\n    this.id = id;\n    this.value = value;\n  }\n}\n\nclass Lexer {\n  // Singletons for every non-number token, built lazily on first construction.\n  // Keyword operator tokens carry their name as `value`; structural tokens\n  // (lbrace, rbrace, eof) carry null.\n  static #singletons = null;\n\n  static #operatorSingletons = null;\n\n  static #initSingletons() {\n    const singletons = Object.create(null);\n    const operatorSingletons = Object.create(null);\n    for (const [name, id] of Object.entries(TOKEN)) {\n      if (name === \"number\") {\n        continue;\n      }\n      const isOperator = id >= TOKEN.true && id <= TOKEN.ifelse;\n      const token = new Token(id, isOperator ? name : null);\n      singletons[name] = token;\n      if (isOperator) {\n        operatorSingletons[name] = token;\n      }\n    }\n    this.#singletons = singletons;\n    this.#operatorSingletons = operatorSingletons;\n  }\n\n  constructor(data) {\n    if (!Lexer.#singletons) {\n      Lexer.#initSingletons();\n    }\n    this.data = data;\n    this.pos = 0;\n    this.len = data.length;\n    // Sticky regexes: set lastIndex before exec() to match at an exact offset.\n    this._numberPattern = /[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/iy;\n    this._identifierPattern = /[a-z]+/y;\n  }\n\n  // Skip a % comment, advancing past the next \\n or \\r (or to EOF).\n  _skipComment() {\n    const lf = this.data.indexOf(\"\\n\", this.pos);\n    const cr = this.data.indexOf(\"\\r\", this.pos);\n    // Treat a missing EOL as this.len so Math.min picks the one that exists.\n    const eol = Math.min(lf < 0 ? this.len : lf, cr < 0 ? this.len : cr);\n    this.pos = Math.min(eol + 1, this.len);\n  }\n\n  _getNumber() {\n    this._numberPattern.lastIndex = this.pos;\n    const match = this._numberPattern.exec(this.data);\n    if (!match) {\n      return new Token(TOKEN.number, 0);\n    }\n    const number = parseFloat(match[0]);\n    if (!Number.isFinite(number)) {\n      return new Token(TOKEN.number, 0);\n    }\n    this.pos = this._numberPattern.lastIndex;\n    return new Token(TOKEN.number, number);\n  }\n\n  _getOperator() {\n    this._identifierPattern.lastIndex = this.pos;\n    const match = this._identifierPattern.exec(this.data);\n    if (!match) {\n      return new Token(TOKEN.number, 0);\n    }\n    this.pos = this._identifierPattern.lastIndex;\n    const op = match[0];\n    const token = Lexer.#operatorSingletons[op];\n    if (!token) {\n      return new Token(TOKEN.number, 0);\n    }\n    return token;\n  }\n\n  // Return the next token, or Lexer.#singletons.eof at end of input.\n  next() {\n    while (this.pos < this.len) {\n      const ch = this.data.charCodeAt(this.pos++);\n      switch (ch) {\n        // PostScript white-space characters (PDF32000 搂7.2.2)\n        case 0x00 /* NUL */:\n        case 0x09 /* HT */:\n        case 0x0a /* LF */:\n        case 0x0c /* FF */:\n        case 0x0d /* CR */:\n        case 0x20 /* SP */:\n          break;\n\n        case 0x25 /* % 鈥� comment */:\n          this._skipComment();\n          break;\n\n        case 0x7b /* { */:\n          return Lexer.#singletons.lbrace;\n        case 0x7d /* } */:\n          return Lexer.#singletons.rbrace;\n\n        case 0x2b /* + */:\n        case 0x2d /* - */:\n          this.pos--;\n          return this._getNumber();\n\n        case 0x2e /* . */:\n          this.pos--;\n          return this._getNumber();\n\n        default:\n          if (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) {\n            this.pos--;\n            return this._getNumber();\n          }\n          if (ch >= 0x61 /* a */ && ch <= 0x7a /* z */) {\n            this.pos--;\n            return this._getOperator();\n          }\n          return new Token(TOKEN.number, 0);\n      }\n    }\n    return Lexer.#singletons.eof;\n  }\n}\n\nexport { Lexer, Token, TOKEN };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormatError, warn } from \"../../shared/util.js\";\nimport { Lexer, TOKEN } from \"./lexer.js\";\n\n// Value types for tree nodes 鈥� used to select the correct code-generation\n// path for type-sensitive operators (currently `not`).\nconst PS_VALUE_TYPE = {\n  numeric: 0, // known to be a number (f64 in Wasm)\n  boolean: 1, // known to be a boolean (0.0 = false, 1.0 = true in f64)\n  unknown: 2, // indeterminate at compile time\n};\n\n// AST node type constants\n\nconst PS_NODE = {\n  // Parser AST node types (produced by Parser / parsePostScriptFunction)\n  program: 0,\n  block: 1,\n  number: 2,\n  operator: 3,\n  if: 4,\n  ifelse: 5,\n  // Tree AST node types (produced by PSStackToTree)\n  arg: 6,\n  const: 7,\n  unary: 8,\n  binary: 9,\n  ternary: 10,\n};\n\n// AST node classes\n\nclass PsNode {\n  constructor(type) {\n    this.type = type;\n  }\n}\n\n/**\n * The root node.  Wraps the outermost `{ 鈥� }` of a Type 4 function body.\n */\nclass PsProgram extends PsNode {\n  constructor(body) {\n    super(PS_NODE.program);\n    /** @type {PsBlock} */\n    this.body = body;\n  }\n}\n\nclass PsBlock extends PsNode {\n  constructor(instructions) {\n    super(PS_NODE.block);\n    /** @type {Array<PsNumber|PsOperator|PsIf|PsIfElse>} */\n    this.instructions = instructions;\n  }\n}\n\nclass PsNumber extends PsNode {\n  /** @param {number} value */\n  constructor(value) {\n    super(PS_NODE.number);\n    this.value = value;\n  }\n}\n\n/** A regular PS operator (not `if` / `ifelse`). */\nclass PsOperator extends PsNode {\n  /** @param {number} op 鈥� one of the TOKEN.* constants from lexer.js */\n  constructor(op) {\n    super(PS_NODE.operator);\n    this.op = op;\n  }\n}\n\n/**\n * `<cond> { thenBlock } if`\n *\n * The condition value is consumed from the operand stack at runtime.\n */\nclass PsIf extends PsNode {\n  /** @param {PsBlock} then */\n  constructor(then) {\n    super(PS_NODE.if);\n    this.then = then;\n  }\n}\n\n/**\n * `<cond> { thenBlock } { elseBlock } ifelse`\n *\n * The condition value is consumed from the operand stack at runtime.\n */\nclass PsIfElse extends PsNode {\n  /**\n   * @param {PsBlock} then\n   * @param {PsBlock} otherwise\n   */\n  constructor(then, otherwise) {\n    super(PS_NODE.ifelse);\n    this.then = then;\n    this.otherwise = otherwise;\n  }\n}\n\n// Tree AST node classes  (produced by PSStackToTree)\n\n/**\n * A function input argument.  `index` is the zero-based position in the\n * domain 鈥� in0 has index 0, in1 has index 1, etc.\n */\nclass PsArgNode extends PsNode {\n  /** @param {number} index */\n  constructor(index) {\n    super(PS_NODE.arg);\n    this.index = index;\n    this.valueType = PS_VALUE_TYPE.numeric;\n  }\n}\n\n/**\n * A folded constant 鈥� a numeric or boolean literal that is known at\n * compile time.\n */\nclass PsConstNode extends PsNode {\n  /** @param {number|boolean} value */\n  constructor(value) {\n    super(PS_NODE.const);\n    this.value = value;\n    this.valueType =\n      typeof value === \"boolean\"\n        ? PS_VALUE_TYPE.boolean\n        : PS_VALUE_TYPE.numeric;\n  }\n}\n\n/**\n * A unary operation.\n */\nclass PsUnaryNode extends PsNode {\n  /**\n   * @param {number} op 鈥� TOKEN.* constant\n   * @param {PsNode} operand\n   * @param {number} [valueType]\n   */\n  constructor(op, operand, valueType = PS_VALUE_TYPE.unknown) {\n    super(PS_NODE.unary);\n    this.op = op;\n    this.operand = operand;\n    this.valueType = valueType;\n  }\n}\n\n/**\n * A binary operation.\n *\n * `first` was the top-of-stack operand (popped first);\n * `second` was the operand just below it (popped second).\n *\n * For non-commutative operators the mathematical meaning is\n *   second OP first\n * e.g. `a b sub` 鈫� second = a, first = b 鈫� a 鈭� b.\n */\nclass PsBinaryNode extends PsNode {\n  /**\n   * @param {number} op 鈥� TOKEN.* constant\n   * @param {PsNode} first 鈥� was on top of stack\n   * @param {PsNode} second 鈥� was below top\n   * @param {number} [valueType]\n   */\n  constructor(op, first, second, valueType = PS_VALUE_TYPE.unknown) {\n    super(PS_NODE.binary);\n    this.op = op;\n    this.first = first;\n    this.second = second;\n    this.valueType = valueType;\n  }\n}\n\n/**\n * A conditional expression: `cond ? then : otherwise`.\n *\n * Represents both PostScript `if` (where `otherwise` is the pre-existing\n * stack value that would remain unchanged when the condition is false) and\n * `ifelse` constructs, after the stack-to-tree conversion.\n */\nclass PsTernaryNode extends PsNode {\n  /**\n   * @param {PsNode} cond\n   * @param {PsNode} then\n   * @param {PsNode} otherwise\n   * @param {number} [valueType]\n   */\n  constructor(cond, then, otherwise, valueType = PS_VALUE_TYPE.unknown) {\n    super(PS_NODE.ternary);\n    this.cond = cond;\n    this.then = then;\n    this.otherwise = otherwise;\n    this.valueType = valueType;\n  }\n}\n\nclass Parser {\n  constructor(lexer) {\n    this.lexer = lexer;\n    this._token = null;\n  }\n\n  static _isRegularOperator(id) {\n    return id >= TOKEN.true && id < TOKEN.if;\n  }\n\n  // Fetch the next token from the lexer.\n  _advance() {\n    this._token = this.lexer.next();\n  }\n\n  // Assert that the current token has the given id, consume it, and return it.\n  _expect(id) {\n    if (this._token.id !== id) {\n      throw new FormatError(\n        `PostScript function: expected token id ${id}, got ${this._token.id}.`\n      );\n    }\n    const tok = this._token;\n    this._advance();\n    return tok;\n  }\n\n  /**\n   * Parse the full Type 4 function body.\n   *\n   * Grammar (simplified):\n   *   program   ::= '{' block '}'\n   *   block     ::= instruction*\n   *   instruction ::= number\n   *                 | operator          (any PS_OPERATOR except if / ifelse)\n   *                 | '{' block '}' 'if'\n   *                 | '{' block '}' '{' block '}' 'ifelse'\n   *\n   * @returns {PsProgram}\n   */\n  parse() {\n    this._advance();\n    this._expect(TOKEN.lbrace);\n    const block = this._parseBlock();\n    this._expect(TOKEN.rbrace);\n    if (this._token.id !== TOKEN.eof) {\n      warn(\"PostScript function: unexpected content after closing brace.\");\n    }\n    return new PsProgram(block);\n  }\n\n  _parseBlock() {\n    const instructions = [];\n\n    while (true) {\n      const tok = this._token;\n      switch (tok.id) {\n        case TOKEN.number:\n          instructions.push(new PsNumber(tok.value));\n          this._advance();\n          break;\n\n        case TOKEN.lbrace: {\n          // Start of a sub-procedure: must be followed by 'if' or '{ } ifelse'.\n          this._advance();\n          const thenBlock = this._parseBlock();\n          this._expect(TOKEN.rbrace);\n\n          if (this._token.id === TOKEN.if) {\n            this._advance();\n            instructions.push(new PsIf(thenBlock));\n          } else if (this._token.id === TOKEN.lbrace) {\n            this._advance();\n            const elseBlock = this._parseBlock();\n            this._expect(TOKEN.rbrace);\n            this._expect(TOKEN.ifelse);\n            instructions.push(new PsIfElse(thenBlock, elseBlock));\n          } else {\n            throw new FormatError(\n              \"PostScript function: a procedure block must be followed by 'if' or '{鈥 ifelse'.\"\n            );\n          }\n          break;\n        }\n\n        case TOKEN.rbrace:\n        case TOKEN.eof:\n          // End of this block; let the caller consume the '}'.\n          return new PsBlock(instructions);\n\n        case TOKEN.if:\n        case TOKEN.ifelse:\n          // 'if'/'ifelse' without a preceding block.\n          throw new FormatError(\n            `PostScript function: unexpected '${tok.value}' operator.`\n          );\n\n        default:\n          if (Parser._isRegularOperator(tok.id)) {\n            instructions.push(new PsOperator(tok.id));\n            this._advance();\n            break;\n          }\n          throw new FormatError(\n            `PostScript function: unexpected token id ${tok.id}.`\n          );\n      }\n    }\n  }\n}\n\n/**\n * Convenience function: tokenize and parse a PostScript Type 4 function body\n * given as a plain string (already decoded from the PDF stream).\n *\n * @param {string} source\n * @returns {PsProgram}\n */\nfunction parsePostScriptFunction(source) {\n  return new Parser(new Lexer(source)).parse();\n}\n\n// Stack-to-tree transformation\n\n/**\n * Structural equality for tree nodes.\n * Returns true when `a` and `b` represent the same sub-expression.\n * Reference equality (`a === b`) is checked first, so shared nodes\n * produced by `dup` are handled in O(1).\n */\nfunction _nodesEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (a.type !== b.type) {\n    return false;\n  }\n  switch (a.type) {\n    case PS_NODE.arg:\n      return a.index === b.index;\n    case PS_NODE.const:\n      return a.value === b.value;\n    case PS_NODE.unary:\n      return a.op === b.op && _nodesEqual(a.operand, b.operand);\n    case PS_NODE.binary:\n      return (\n        a.op === b.op &&\n        _nodesEqual(a.first, b.first) &&\n        _nodesEqual(a.second, b.second)\n      );\n    case PS_NODE.ternary:\n      return (\n        _nodesEqual(a.cond, b.cond) &&\n        _nodesEqual(a.then, b.then) &&\n        _nodesEqual(a.otherwise, b.otherwise)\n      );\n    default:\n      return false;\n  }\n}\n\n/**\n * Evaluate a binary PostScript operator on two compile-time-known values.\n * `a` is the second operand (was below top); `b` is the first (was on top).\n * Returns `undefined` when the operation cannot be safely folded.\n */\nfunction _evalBinaryConst(op, a, b) {\n  switch (op) {\n    case TOKEN.add:\n      return a + b;\n    case TOKEN.sub:\n      return a - b;\n    case TOKEN.mul:\n      return a * b;\n    case TOKEN.div:\n      return b !== 0 ? a / b : 0; // div by zero 鈫� 0\n    case TOKEN.idiv:\n      return b !== 0 ? Math.trunc(a / b) : 0; // div by zero 鈫� 0\n    case TOKEN.mod:\n      return b !== 0 ? a - Math.trunc(a / b) * b : 0; // div by zero 鈫� 0\n    case TOKEN.exp: {\n      const r = a ** b;\n      return Number.isFinite(r) ? r : undefined;\n    }\n    case TOKEN.atan: {\n      // PostScript: dy dx atan 鈫� angle in degrees in [0, 360)\n      let deg = Math.atan2(a, b) * (180 / Math.PI);\n      if (deg < 0) {\n        deg += 360;\n      }\n      return deg;\n    }\n    case TOKEN.eq:\n      return a === b;\n    case TOKEN.ne:\n      return a !== b;\n    case TOKEN.gt:\n      return a > b;\n    case TOKEN.ge:\n      return a >= b;\n    case TOKEN.lt:\n      return a < b;\n    case TOKEN.le:\n      return a <= b;\n    case TOKEN.and:\n      return typeof a === \"boolean\" ? a && b : (a & b) | 0;\n    case TOKEN.or:\n      return typeof a === \"boolean\" ? a || b : a | b | 0;\n    case TOKEN.xor:\n      return typeof a === \"boolean\" ? a !== b : (a ^ b) | 0;\n    case TOKEN.bitshift:\n      return b >= 0 ? (a << b) | 0 : (a >> -b) | 0;\n    case TOKEN.min:\n      return Math.min(a, b);\n    case TOKEN.max:\n      return Math.max(a, b);\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Evaluate a unary PostScript operator on a compile-time-known value.\n * Returns `undefined` when the operation cannot be safely folded.\n */\nfunction _evalUnaryConst(op, v) {\n  switch (op) {\n    case TOKEN.abs:\n      return Math.abs(v);\n    case TOKEN.neg:\n      return -v;\n    case TOKEN.ceiling:\n      return Math.ceil(v);\n    case TOKEN.floor:\n      return Math.floor(v);\n    case TOKEN.round:\n      return Math.round(v);\n    case TOKEN.truncate:\n      return Math.trunc(v);\n    case TOKEN.sqrt: {\n      const r = Math.sqrt(v);\n      return Number.isFinite(r) ? r : undefined;\n    }\n    case TOKEN.sin:\n      return Math.sin(((v % 360) * Math.PI) / 180);\n    case TOKEN.cos:\n      return Math.cos(((v % 360) * Math.PI) / 180);\n    case TOKEN.ln: {\n      const r = Math.log(v);\n      return Number.isFinite(r) ? r : undefined;\n    }\n    case TOKEN.log: {\n      const r = Math.log10(v);\n      return Number.isFinite(r) ? r : undefined;\n    }\n    case TOKEN.cvi:\n      return Math.trunc(v);\n    case TOKEN.cvr:\n      return v;\n    case TOKEN.not:\n      return typeof v === \"boolean\" ? !v : ~v;\n    default:\n      return undefined;\n  }\n}\n\n// Maximum number of nodes allowed on the virtual stack at any point during\n// the stack-to-tree conversion.  Programs that exceed this are rejected.\nconst MAX_STACK_SIZE = 100;\n\n// Determine the PS_VALUE_TYPE of a unary operation's result.\n// `not` propagates its operand's type (boolean not 鈫� boolean, integer not 鈫抃n// numeric); every other unary op always yields a numeric result.\nfunction _unaryValueType(op, operandType) {\n  return op === TOKEN.not ? operandType : PS_VALUE_TYPE.numeric;\n}\n\n// Determine the PS_VALUE_TYPE of a binary operation's result.\nfunction _binaryValueType(op, firstType, secondType) {\n  switch (op) {\n    // Comparison operators always produce a boolean.\n    case TOKEN.eq:\n    case TOKEN.ne:\n    case TOKEN.gt:\n    case TOKEN.ge:\n    case TOKEN.lt:\n    case TOKEN.le:\n      return PS_VALUE_TYPE.boolean;\n    // and / or / xor preserve the type when both operands are the same known\n    // type (both boolean or both numeric); otherwise the type is unknown.\n    case TOKEN.and:\n    case TOKEN.or:\n    case TOKEN.xor:\n      return firstType === secondType && firstType !== PS_VALUE_TYPE.unknown\n        ? firstType\n        : PS_VALUE_TYPE.unknown;\n    // All arithmetic / bitshift operators produce a numeric result.\n    default:\n      return PS_VALUE_TYPE.numeric;\n  }\n}\n\n/**\n * Converts a stack-based PostScript parser AST (PsProgram) into a stack-free\n * expression tree.\n *\n * The virtual operand stack is initialized with one PsArgNode per function\n * input; each instruction then manipulates the stack just as it would at\n * runtime, but instead of numbers the stack holds tree nodes.\n *\n * Algebraic optimizations are applied eagerly as each node is constructed:\n * constant folding, identity/absorbing elements, and double-negation\n * elimination.\n *\n * When the program finishes the remaining stack entries are the output\n * expressions 鈥� one per function output channel.\n *\n * Usage:\n *   const outputs = new PSStackToTree().evaluate(program, numInputs);\n */\nclass PSStackToTree {\n  static #binaryOps = null;\n\n  static #unaryOps = null;\n\n  static #idempotentUnary = null;\n\n  static #negatedComparison = null;\n\n  static #init() {\n    // Binary operator ids 鈥� used by _evalOp.\n    this.#binaryOps = new Set([\n      TOKEN.add,\n      TOKEN.sub,\n      TOKEN.mul,\n      TOKEN.div,\n      TOKEN.idiv,\n      TOKEN.mod,\n      TOKEN.exp,\n      TOKEN.atan,\n      TOKEN.eq,\n      TOKEN.ne,\n      TOKEN.gt,\n      TOKEN.ge,\n      TOKEN.lt,\n      TOKEN.le,\n      TOKEN.and,\n      TOKEN.or,\n      TOKEN.xor,\n      TOKEN.bitshift,\n    ]);\n    // Unary operator ids.\n    this.#unaryOps = new Set([\n      TOKEN.abs,\n      TOKEN.neg,\n      TOKEN.ceiling,\n      TOKEN.floor,\n      TOKEN.round,\n      TOKEN.truncate,\n      TOKEN.sqrt,\n      TOKEN.sin,\n      TOKEN.cos,\n      TOKEN.ln,\n      TOKEN.log,\n      TOKEN.cvi,\n      TOKEN.cvr,\n      TOKEN.not,\n    ]);\n    // Unary operators where f(f(x)) = f(x) 鈥� applying them twice is the same\n    // as applying them once.\n    this.#idempotentUnary = new Set([\n      TOKEN.abs,\n      TOKEN.ceiling,\n      TOKEN.cvi,\n      TOKEN.cvr,\n      TOKEN.floor,\n      TOKEN.round,\n      TOKEN.truncate,\n    ]);\n    // Maps each comparison operator to its logical negation.\n    // Used to simplify not(comparison) 鈫� negated-comparison.\n    this.#negatedComparison = new Map([\n      [TOKEN.eq, TOKEN.ne],\n      [TOKEN.ne, TOKEN.eq],\n      [TOKEN.lt, TOKEN.ge],\n      [TOKEN.le, TOKEN.gt],\n      [TOKEN.gt, TOKEN.le],\n      [TOKEN.ge, TOKEN.lt],\n    ]);\n  }\n\n  /**\n   * @param {PsProgram} program\n   * @param {number} numInputs 鈥� number of domain values placed on the stack\n   *   before the program runs (i.e. the length of the domain array / 2).\n   * @returns {Array<PsNode>} 鈥� one tree node per output value.\n   */\n  evaluate(program, numInputs) {\n    if (!PSStackToTree.#binaryOps) {\n      PSStackToTree.#init();\n    }\n    this._failed = false;\n    if (numInputs > MAX_STACK_SIZE) {\n      return null;\n    }\n    const stack = [];\n    for (let i = 0; i < numInputs; i++) {\n      stack.push(new PsArgNode(i));\n    }\n    this._evalBlock(program.body, stack);\n    if (this._failed) {\n      return null;\n    }\n    PSStackToTree.#markShared(stack);\n    return stack;\n  }\n\n  // Set node.shared / sharedCount on non-atomic nodes referenced more than\n  // once.  arg/const are excluded 鈥� they are cheap to re-emit inline.\n  static #markShared(outputs) {\n    const refCount = new Map();\n    const visit = node => {\n      if (!node || node.type === PS_NODE.arg || node.type === PS_NODE.const) {\n        return;\n      }\n      const prev = refCount.get(node) ?? 0;\n      refCount.set(node, prev + 1);\n      if (prev > 0) {\n        return;\n      }\n      switch (node.type) {\n        case PS_NODE.unary:\n          visit(node.operand);\n          break;\n        case PS_NODE.binary:\n          visit(node.first);\n          visit(node.second);\n          break;\n        case PS_NODE.ternary:\n          visit(node.cond);\n          visit(node.then);\n          visit(node.otherwise);\n          break;\n      }\n    };\n    for (const output of outputs) {\n      visit(output);\n    }\n    for (const [node, count] of refCount) {\n      if (count > 1) {\n        node.shared = true;\n        node.sharedCount = count;\n      }\n    }\n  }\n\n  _evalBlock(block, stack) {\n    this._evalBlockFrom(block.instructions, 0, stack);\n  }\n\n  /**\n   * Core evaluation loop.  Processes `instructions[startIdx鈥` in order,\n   * mutating `stack` as each instruction executes.\n   *\n   * When a `{ body } if` instruction grows the stack (the PostScript \"early\n   * exit / guard\" idiom), the remaining instructions in the current array are\n   * evaluated on **both** the true-branch stack and the false-branch stack,\n   * then the two results are merged into PsTernaryNodes.  This handles\n   * patterns like:\n   *\n   *   cond { pop R G B sentinel } if\n   *   鈥� more guards 鈥n   *   sentinel 0 gt { defaultR defaultG defaultB } if\n   */\n  _evalBlockFrom(instructions, startIdx, stack) {\n    for (let idx = startIdx; idx < instructions.length; idx++) {\n      if (this._failed) {\n        break;\n      }\n      const instr = instructions[idx];\n      switch (instr.type) {\n        case PS_NODE.number:\n          stack.push(new PsConstNode(instr.value));\n          if (stack.length > MAX_STACK_SIZE) {\n            this._failed = true;\n          }\n          break;\n\n        case PS_NODE.operator:\n          this._evalOp(instr.op, stack);\n          break;\n\n        case PS_NODE.if: {\n          // Pop condition, snapshot the stack, run the then-block on a copy,\n          // then merge.\n          if (stack.length < 1) {\n            this._failed = true;\n            break;\n          }\n          const cond = stack.pop();\n          const saved = stack.slice();\n          this._evalBlock(instr.then, stack);\n          if (this._failed) {\n            break;\n          }\n          if (stack.length === saved.length) {\n            // Normal case: depth preserved 鈥� positions that changed become\n            // PsTernaryNode(cond, thenValue, originalValue).\n            for (let i = 0; i < stack.length; i++) {\n              if (stack[i] !== saved[i]) {\n                stack[i] = this._makeTernary(cond, stack[i], saved[i]);\n              }\n            }\n          } else if (stack.length > saved.length) {\n            // \"Guard / early-exit\" pattern: the if-body pushed extra values.\n            if (cond.type === PS_NODE.const) {\n              // Condition is a compile-time constant: short-circuit without\n              // forking.  For a false condition restore the saved stack; for a\n              // true condition keep the body result already on `stack`.\n              if (!cond.value) {\n                stack.length = 0;\n                stack.push(...saved);\n              }\n              break;\n            }\n            // Non-constant condition: evaluate the *rest* of this block on\n            // both the true-branch stack and the false-branch stack, then\n            // merge the two results into PsTernaryNodes.\n            const trueStack = stack.slice();\n            this._evalBlockFrom(instructions, idx + 1, trueStack);\n            if (this._failed) {\n              break;\n            }\n            const falseStack = saved;\n            this._evalBlockFrom(instructions, idx + 1, falseStack);\n            if (this._failed) {\n              break;\n            }\n            if (trueStack.length !== falseStack.length) {\n              // The two paths produced different stack depths.  For\n              // well-formed PostScript functions this happens when the\n              // remaining code still has a \"default value\" guard that fires\n              // unconditionally for one path but not the other.  Pad the\n              // shorter result with PsConstNode(0) so both have the same\n              // length; the padding zeros end up in ternary branches that\n              // are never selected at runtime.\n              const zero = new PsConstNode(0);\n              while (trueStack.length < falseStack.length) {\n                trueStack.push(zero);\n              }\n              while (falseStack.length < trueStack.length) {\n                falseStack.push(zero);\n              }\n            }\n            stack.length = 0;\n            for (let i = 0; i < trueStack.length; i++) {\n              stack.push(this._makeTernary(cond, trueStack[i], falseStack[i]));\n            }\n            return; // Remaining instructions already consumed above.\n          } else {\n            // Stack-shrinking if 鈥� cannot represent as a tree.\n            this._failed = true;\n          }\n          break;\n        }\n\n        case PS_NODE.ifelse: {\n          // Pop condition; run each branch on an independent copy of the\n          // current stack; zip the two resulting stacks into PsTernaryNodes\n          // wherever the branches disagree.\n          if (stack.length < 1) {\n            this._failed = true;\n            break;\n          }\n          const cond = stack.pop();\n          const snapshot = stack.slice();\n\n          const thenStack = snapshot.slice();\n          this._evalBlock(instr.then, thenStack);\n          if (this._failed) {\n            break;\n          }\n\n          const elseStack = snapshot.slice();\n          this._evalBlock(instr.otherwise, elseStack);\n          if (this._failed) {\n            break;\n          }\n\n          if (thenStack.length !== elseStack.length) {\n            // Pad the shorter branch with zeros so both have the same depth.\n            // For well-formed functions the extra zeros land in branches that\n            // are never selected at runtime.\n            const zero = new PsConstNode(0);\n            while (thenStack.length < elseStack.length) {\n              thenStack.push(zero);\n            }\n            while (elseStack.length < thenStack.length) {\n              elseStack.push(zero);\n            }\n          }\n          stack.length = 0;\n          for (let i = 0; i < thenStack.length; i++) {\n            stack.push(this._makeTernary(cond, thenStack[i], elseStack[i]));\n          }\n          break;\n        }\n      }\n    }\n  }\n\n  _evalOp(op, stack) {\n    if (PSStackToTree.#binaryOps.has(op)) {\n      if (stack.length < 2) {\n        this._failed = true;\n        return;\n      }\n      const first = stack.pop();\n      const second = stack.pop();\n      stack.push(this._makeBinary(op, first, second));\n      return;\n    }\n\n    if (PSStackToTree.#unaryOps.has(op)) {\n      if (stack.length < 1) {\n        this._failed = true;\n        return;\n      }\n      stack.push(this._makeUnary(op, stack.pop()));\n      return;\n    }\n\n    switch (op) {\n      case TOKEN.true:\n        stack.push(new PsConstNode(true));\n        if (stack.length > MAX_STACK_SIZE) {\n          this._failed = true;\n        }\n        break;\n\n      case TOKEN.false:\n        stack.push(new PsConstNode(false));\n        if (stack.length > MAX_STACK_SIZE) {\n          this._failed = true;\n        }\n        break;\n\n      case TOKEN.dup:\n        if (stack.length < 1) {\n          this._failed = true;\n          break;\n        }\n        stack.push(stack.at(-1));\n        if (stack.length > MAX_STACK_SIZE) {\n          this._failed = true;\n        }\n        break;\n\n      case TOKEN.exch: {\n        if (stack.length < 2) {\n          this._failed = true;\n          break;\n        }\n        const a = stack.pop();\n        const b = stack.pop();\n        stack.push(a, b);\n        break;\n      }\n\n      case TOKEN.pop:\n        if (stack.length < 1) {\n          this._failed = true;\n          break;\n        }\n        stack.pop();\n        break;\n\n      case TOKEN.copy: {\n        if (stack.length < 1) {\n          this._failed = true;\n          break;\n        }\n        const nNode = stack.pop();\n        if (nNode.type === PS_NODE.const) {\n          const n = nNode.value | 0;\n          if (n === 0) {\n            // n === 0 is a no-op\n          } else if (n < 0 || n > stack.length) {\n            this._failed = true;\n          } else {\n            stack.push(...stack.slice(-n));\n            if (stack.length > MAX_STACK_SIZE) {\n              this._failed = true;\n            }\n          }\n        } else {\n          // Runtime n 鈥� cannot resolve at compile time.\n          this._failed = true;\n        }\n        break;\n      }\n\n      case TOKEN.index: {\n        if (stack.length < 1) {\n          this._failed = true;\n          break;\n        }\n        const nNode = stack.pop();\n        if (nNode.type === PS_NODE.const) {\n          const n = nNode.value | 0;\n          if (n < 0 || n >= stack.length) {\n            this._failed = true;\n          } else {\n            // 0 index = dup of top; n index = copy of nth element from top\n            stack.push(stack.at(-n - 1));\n          }\n        } else {\n          // Runtime n 鈥� cannot resolve at compile time.\n          this._failed = true;\n        }\n        break;\n      }\n\n      case TOKEN.roll: {\n        if (stack.length < 2) {\n          this._failed = true;\n          break;\n        }\n        const jNode = stack.pop();\n        const nNode = stack.pop();\n        if (nNode.type === PS_NODE.const && jNode.type === PS_NODE.const) {\n          const n = nNode.value | 0;\n          if (n === 0) {\n            // n === 0 is a no-op\n          } else if (n < 0 || n > stack.length) {\n            this._failed = true;\n          } else {\n            // Normalize j into [0, n): positive j moves the top element(s) to\n            // the bottom of the window.\n            const j = (((jNode.value | 0) % n) + n) % n;\n            if (j > 0) {\n              const slice = stack.splice(-n, n);\n              // slice[n-j鈥-1] 鈫� new bottom; slice[0鈥-j-1] 鈫� new top.\n              stack.push(...slice.slice(n - j), ...slice.slice(0, n - j));\n            }\n          }\n        } else {\n          // Runtime n or j 鈥� cannot resolve at compile time.\n          this._failed = true;\n        }\n        break;\n      }\n\n      default:\n        this._failed = true;\n        break;\n    }\n  }\n\n  /**\n   * Create a binary tree node, applying optimizations eagerly:\n   *\n   * 1. Constant folding 鈥� both operands are PsConstNode 鈫� fold to PsConstNode.\n   * 2. Reflexive simplifications 鈥� x鈭抶鈫�0, x xor x鈫�0, x eq x鈫抰rue, etc.\n   * 3. Algebraic simplifications with one known operand 鈥� identity elements\n   *    (x+0鈫抶, x*1鈫抶, 鈥�), absorbing elements (x*0鈫�0, x and false鈫抐alse, 鈥�),\n   *    and strength reductions (x*-1鈫抧eg(x), x^0.5鈫抯qrt(x), x^2鈫抶*x, 鈥�).\n   *\n   * Recall: `first` was on top of the stack (right operand for non-commutative\n   * ops), `second` was below (left operand). So `a b sub` 鈫� second=a, first=b\n   * 鈫� a 鈭� b.\n   */\n  _makeBinary(op, first, second) {\n    // 1. Constant folding\n    if (first.type === PS_NODE.const && second.type === PS_NODE.const) {\n      const v = _evalBinaryConst(op, second.value, first.value);\n      if (v !== undefined) {\n        return new PsConstNode(v);\n      }\n    }\n\n    // 2. Reflexive simplifications: both operands are the same expression.\n    if (_nodesEqual(first, second)) {\n      switch (op) {\n        case TOKEN.sub:\n          return new PsConstNode(0); // x 鈭� x 鈫� 0\n        case TOKEN.xor:\n          // Boolean operands: true xor true = false xor false = false.\n          // Integer operands: n xor n = 0.\n          return new PsConstNode(\n            first.valueType === PS_VALUE_TYPE.boolean ? false : 0\n          );\n        // TOKEN.mod, TOKEN.div, TOKEN.idiv are NOT simplified here:\n        // x op x is undefined when x = 0, so we cannot fold without knowing\n        // that x is non-zero.\n        case TOKEN.and:\n        case TOKEN.or:\n          return first; // x and x 鈫� x; x or x 鈫� x\n        case TOKEN.min:\n        case TOKEN.max:\n          return first; // min(x,x) 鈫� x; max(x,x) 鈫� x\n        case TOKEN.eq:\n        case TOKEN.ge:\n        case TOKEN.le:\n          return new PsConstNode(true);\n        case TOKEN.ne:\n        case TOKEN.gt:\n        case TOKEN.lt:\n          return new PsConstNode(false);\n      }\n    }\n\n    // 3. Algebraic simplifications 鈥� b = first.value, a = second.value.\n    if (first.type === PS_NODE.const) {\n      const b = first.value;\n      switch (op) {\n        case TOKEN.add:\n          if (b === 0) {\n            return second; // x + 0 鈫� x\n          }\n          break;\n        case TOKEN.sub:\n          if (b === 0) {\n            return second; // x 鈭� 0 鈫� x\n          }\n          break;\n        case TOKEN.mul:\n          if (b === 1) {\n            return second; // x * 1 鈫� x\n          }\n          if (b === 0) {\n            return first; // x * 0 鈫� 0  (reuse the PsConstNode(0))\n          }\n          if (b === -1) {\n            return this._makeUnary(TOKEN.neg, second); // x * -1 鈫� neg(x)\n          }\n          break;\n        case TOKEN.div:\n          // x / c 鈫� x * (1/c): replace division by a constant with the\n          // equivalent multiplication (1/1=1 is caught by the mul identity).\n          if (b !== 0) {\n            return this._makeBinary(TOKEN.mul, new PsConstNode(1 / b), second);\n          }\n          break;\n        case TOKEN.idiv:\n          if (b === 1) {\n            return second; // x idiv 1 鈫� x\n          }\n          break;\n        case TOKEN.exp:\n          if (b === 1) {\n            return second; // x ^ 1 鈫� x\n          }\n          if (b === -1) {\n            return this._makeBinary(TOKEN.div, second, new PsConstNode(1));\n          }\n          if (b === 0.5) {\n            return this._makeUnary(TOKEN.sqrt, second); // x ^ 0.5 鈫� sqrt(x)\n          }\n          if (b === 0.25) {\n            // x ^ 0.25 鈫� sqrt(sqrt(x)): two native f64.sqrt calls instead\n            // of the pow() import.\n            const sqrtOnce = this._makeUnary(TOKEN.sqrt, second);\n            return this._makeUnary(TOKEN.sqrt, sqrtOnce);\n          }\n          if (b === 2) {\n            // x ^ 2 鈫� x * x: avoids the pow() import call entirely.\n            return this._makeBinary(TOKEN.mul, second, second);\n          }\n          if (b === 3) {\n            // x ^ 3 鈫� (x * x) * x: avoids the pow() import call entirely.\n            return this._makeBinary(\n              TOKEN.mul,\n              this._makeBinary(TOKEN.mul, second, second),\n              second\n            );\n          }\n          if (b === 4) {\n            // x ^ 4 鈫� (x * x) * (x * x): avoids the pow() import call entirely.\n            const square = this._makeBinary(TOKEN.mul, second, second);\n            return this._makeBinary(TOKEN.mul, square, square);\n          }\n          if (b === 0) {\n            return new PsConstNode(1); // x ^ 0 鈫� 1\n          }\n          break;\n        case TOKEN.and:\n          if (b === true) {\n            return second; // x and true 鈫� x\n          }\n          if (b === false) {\n            return first; // x and false 鈫� false\n          }\n          break;\n        case TOKEN.or:\n          if (b === false) {\n            return second; // x or false 鈫� x\n          }\n          if (b === true) {\n            return first; // x or true 鈫� true\n          }\n          break;\n        case TOKEN.min:\n          // min(max(x, c2), c1) where c2 鈮� c1 鈫� c1:\n          // max(x, c2) 鈮� c2 鈮� c1, so min with c1 always returns c1.\n          if (\n            second.type === PS_NODE.binary &&\n            second.op === TOKEN.max &&\n            second.first.type === PS_NODE.const &&\n            second.first.value >= b\n          ) {\n            return first;\n          }\n          break;\n        case TOKEN.max:\n          // max(min(x, c1), c2) where c2 鈮� c1 鈫� c2:\n          // min(x, c1) 鈮� c1 鈮� c2, so max with c2 always returns c2.\n          if (\n            second.type === PS_NODE.binary &&\n            second.op === TOKEN.min &&\n            second.first.type === PS_NODE.const &&\n            second.first.value <= b\n          ) {\n            return first;\n          }\n          break;\n      }\n    }\n\n    if (second.type === PS_NODE.const) {\n      const a = second.value;\n      switch (op) {\n        case TOKEN.add:\n          if (a === 0) {\n            return first; // 0 + x 鈫� x\n          }\n          break;\n        case TOKEN.sub:\n          if (a === 0) {\n            return this._makeUnary(TOKEN.neg, first); // 0 鈭� x 鈫� neg(x)\n          }\n          break;\n        case TOKEN.mul:\n          if (a === 1) {\n            return first; // 1 * x 鈫� x\n          }\n          if (a === 0) {\n            return second; // 0 * x 鈫� 0  (reuse the PsConstNode(0))\n          }\n          if (a === -1) {\n            return this._makeUnary(TOKEN.neg, first); // -1 * x 鈫� neg(x)\n          }\n          break;\n        case TOKEN.and:\n          if (a === true) {\n            return first; // true and x 鈫� x\n          }\n          if (a === false) {\n            return second; // false and x 鈫� false\n          }\n          break;\n        case TOKEN.or:\n          if (a === false) {\n            return first; // false or x 鈫� x\n          }\n          if (a === true) {\n            return second; // true or x 鈫� true\n          }\n          break;\n      }\n    }\n\n    return new PsBinaryNode(\n      op,\n      first,\n      second,\n      _binaryValueType(op, first.valueType, second.valueType)\n    );\n  }\n\n  /**\n   * Create a unary tree node, applying optimizations eagerly:\n   *\n   * 1. Constant folding.\n   * 2. not(comparison) 鈫� negated comparison: not(a eq b) 鈫� a ne b, etc.\n   * 3. neg(a 鈭� b) 鈫� b 鈭� a.\n   * 4. Double-negation: neg(neg(x)) 鈫� x, not(not(x)) 鈫� x.\n   * 5. abs(neg(x)) 鈫� abs(x).\n   * 6. Idempotent: f(f(x)) 鈫� f(x) for abs, ceiling, floor, round, etc.\n   */\n  _makeUnary(op, operand) {\n    // 1. Constant folding\n    if (operand.type === PS_NODE.const) {\n      const v = _evalUnaryConst(op, operand.value);\n      if (v !== undefined) {\n        return new PsConstNode(v);\n      }\n    }\n\n    // 2.\n    if (op === TOKEN.not && operand.type === PS_NODE.binary) {\n      const negated = PSStackToTree.#negatedComparison.get(operand.op);\n      if (negated !== undefined) {\n        return new PsBinaryNode(\n          negated,\n          operand.first,\n          operand.second,\n          PS_VALUE_TYPE.boolean\n        );\n      }\n    }\n\n    // 3. (_makeBinary may fold further if one operand is 0)\n    if (\n      op === TOKEN.neg &&\n      operand.type === PS_NODE.binary &&\n      operand.op === TOKEN.sub\n    ) {\n      return this._makeBinary(TOKEN.sub, operand.second, operand.first);\n    }\n\n    if (operand.type === PS_NODE.unary) {\n      // 4. (not(not(x)) only reachable when x is not a comparison)\n      if (\n        (op === TOKEN.neg && operand.op === TOKEN.neg) ||\n        (op === TOKEN.not && operand.op === TOKEN.not)\n      ) {\n        return operand.operand;\n      }\n      // 5.\n      if (op === TOKEN.abs && operand.op === TOKEN.neg) {\n        return this._makeUnary(TOKEN.abs, operand.operand);\n      }\n      // 6.\n      if (PSStackToTree.#idempotentUnary.has(op) && op === operand.op) {\n        return operand;\n      }\n    }\n\n    return new PsUnaryNode(op, operand, _unaryValueType(op, operand.valueType));\n  }\n\n  /**\n   * Create a ternary node, applying optimizations eagerly:\n   *\n   * 1. Constant condition 鈥� fold to the live branch.\n   * 2. Identical branches 鈥� the condition is irrelevant, return either branch.\n   * 3. Boolean branch constants 鈥� `cond ? true : false` 鈫� cond,\n   *    `cond ? false : true` 鈫� not(cond).\n   * 4. Ternary 鈫� branchless min/max when the condition compares two numeric\n   *    expressions that are also the two branches.\n   */\n  _makeTernary(cond, then, otherwise) {\n    // 1. Constant condition\n    if (cond.type === PS_NODE.const) {\n      return cond.value ? then : otherwise;\n    }\n    // 2. Both branches are the same expression\n    if (_nodesEqual(then, otherwise)) {\n      return then;\n    }\n    // 3. Boolean branch constants\n    if (then.type === PS_NODE.const && otherwise.type === PS_NODE.const) {\n      if (then.value === true && otherwise.value === false) {\n        return cond; // cond ? true : false 鈫� cond\n      }\n      if (then.value === false && otherwise.value === true) {\n        return this._makeUnary(TOKEN.not, cond); // cond ? false : true 鈫� !cond\n      }\n    }\n\n    // 4. Ternary 鈫� branchless min/max folding.\n    //\n    // When the condition is a numeric comparison between two expressions A and\n    // B, and the two branches are exactly those two expressions (in some\n    // order), the ternary collapses to a single f64.min / f64.max instruction:\n    //\n    //   (A gt B) ? B : A  鈫�  min(A, B)   (A ge B) ? B : A  鈫�  min(A, B)\n    //   (A lt B) ? B : A  鈫�  max(A, B)   (A le B) ? B : A  鈫�  max(A, B)\n    //   (A gt B) ? A : B  鈫�  max(A, B)   (A ge B) ? A : B  鈫�  max(A, B)\n    //   (A lt B) ? A : B  鈫�  min(A, B)   (A le B) ? A : B  鈫�  min(A, B)\n    //\n    // Here A = cond.second (left operand) and B = cond.first (right operand),\n    // following the PS stack convention: `A B gt` 鈫� second=A, first=B.\n    if (cond.type === PS_NODE.binary) {\n      const { op: cop, first: cf, second: cs } = cond;\n      if (cop === TOKEN.gt || cop === TOKEN.ge) {\n        // cond: cs > cf\n        if (_nodesEqual(then, cf) && _nodesEqual(otherwise, cs)) {\n          return this._makeBinary(TOKEN.min, cf, cs); // cs>cf ? cf:cs 鈫� min\n        }\n        if (_nodesEqual(then, cs) && _nodesEqual(otherwise, cf)) {\n          return this._makeBinary(TOKEN.max, cf, cs); // cs>cf ? cs:cf 鈫� max\n        }\n      } else if (cop === TOKEN.lt || cop === TOKEN.le) {\n        // cond: cs < cf\n        if (_nodesEqual(then, cf) && _nodesEqual(otherwise, cs)) {\n          return this._makeBinary(TOKEN.max, cf, cs); // cs<cf ? cf:cs 鈫� max\n        }\n        if (_nodesEqual(then, cs) && _nodesEqual(otherwise, cf)) {\n          return this._makeBinary(TOKEN.min, cf, cs); // cs<cf ? cs:cf 鈫� min\n        }\n      }\n    }\n\n    return new PsTernaryNode(\n      cond,\n      then,\n      otherwise,\n      then.valueType === otherwise.valueType\n        ? then.valueType\n        : PS_VALUE_TYPE.unknown\n    );\n  }\n}\n\nexport {\n  parsePostScriptFunction,\n  Parser,\n  PS_NODE,\n  PS_VALUE_TYPE,\n  PsArgNode,\n  PsBinaryNode,\n  PsBlock,\n  PsConstNode,\n  PsIf,\n  PsIfElse,\n  PsNode,\n  PsNumber,\n  PsOperator,\n  PsProgram,\n  PSStackToTree,\n  PsTernaryNode,\n  PsUnaryNode,\n};\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  parsePostScriptFunction,\n  PS_NODE,\n  PS_VALUE_TYPE,\n  PSStackToTree,\n} from \"./ast.js\";\nimport { MathClamp } from \"../../shared/math_clamp.js\";\nimport { TOKEN } from \"./lexer.js\";\n\n// Consecutive integers for a dense jump table in _execute.\n// 2-slot: ARG, CONST, IF, JUMP, SHIFT. 4-slot: STORE. All others: 1 slot.\nconst OP = {\n  ARG: 0, // [ARG, idx]\n  CONST: 1, // [CONST, val]\n  STORE: 2, // [STORE, slot, min, max]  clamp(pop()) 鈫� mem[slot]\n  IF: 3, // [IF, target]  jump when top-of-stack === 0\n  JUMP: 4, // [JUMP, target]  unconditional\n  ABS: 5,\n  NEG: 6,\n  CEIL: 7,\n  FLOOR: 8,\n  ROUND: 9, // floor(x + 0.5)\n  TRUNC: 10,\n  NOT_B: 11, // boolean NOT\n  NOT_N: 12, // bitwise NOT\n  SQRT: 13,\n  SIN: 14, // degrees in/out\n  COS: 15,\n  LN: 16,\n  LOG10: 17,\n  CVI: 18,\n  SHIFT: 19, // [SHIFT, amount]  +ve = left, 鈭抳e = right\n  // Binary ops: second below, first on top; result = second OP first.\n  ADD: 20,\n  SUB: 21,\n  MUL: 22,\n  DIV: 23, // 0 when divisor is 0\n  IDIV: 24, // 0 when divisor is 0\n  MOD: 25, // 0 when divisor is 0\n  POW: 26,\n  EQ: 27,\n  NE: 28,\n  GT: 29,\n  GE: 30,\n  LT: 31,\n  LE: 32,\n  AND: 33,\n  OR: 34,\n  XOR: 35,\n  ATAN: 36, // atan2(second, first) 鈫� degrees [0, 360)\n  MIN: 37,\n  MAX: 38,\n  TEE_TMP: 39, // [TEE_TMP, slot]  peek top of stack 鈫� tmp[slot], leave on stack\n  LOAD_TMP: 40, // [LOAD_TMP, slot]  push tmp[slot]\n};\n\nconst _DEG_TO_RAD = Math.PI / 180;\nconst _RAD_TO_DEG = 180 / Math.PI;\n\nclass PsJsCompiler {\n  // Safe because JS is single-threaded.\n  static #stack = new Float64Array(64);\n\n  static #tmp = new Float64Array(64);\n\n  constructor(domain, range) {\n    this.nIn = domain.length >> 1;\n    this.nOut = range.length >> 1;\n    this.range = range;\n    this.ir = [];\n    this._tmpMap = new Map(); // node 鈫� tmp slot index (CSE)\n    this._nextTmp = 0;\n  }\n\n  _compileNode(node) {\n    if (node.shared) {\n      const cached = this._tmpMap.get(node);\n      if (cached !== undefined) {\n        this.ir.push(OP.LOAD_TMP, cached);\n        return true;\n      }\n      if (!this._compileNodeImpl(node)) {\n        return false;\n      }\n      const slot = this._nextTmp++;\n      this._tmpMap.set(node, slot);\n      this.ir.push(OP.TEE_TMP, slot);\n      return true;\n    }\n    return this._compileNodeImpl(node);\n  }\n\n  _compileNodeImpl(node) {\n    switch (node.type) {\n      case PS_NODE.arg:\n        this.ir.push(OP.ARG, node.index);\n        return true;\n\n      case PS_NODE.const: {\n        const v = node.value;\n        this.ir.push(OP.CONST, typeof v === \"boolean\" ? Number(v) : v);\n        return true;\n      }\n\n      case PS_NODE.unary:\n        return this._compileUnary(node);\n\n      case PS_NODE.binary:\n        return this._compileBinary(node);\n\n      case PS_NODE.ternary:\n        return this._compileTernary(node);\n\n      default:\n        return false;\n    }\n  }\n\n  _compileUnary(node) {\n    const { op, operand, valueType } = node;\n\n    // cvr is a no-op 鈥� values are already f64.\n    if (op === TOKEN.cvr) {\n      return this._compileNode(operand);\n    }\n\n    if (!this._compileNode(operand)) {\n      return false;\n    }\n\n    switch (op) {\n      case TOKEN.abs:\n        this.ir.push(OP.ABS);\n        break;\n      case TOKEN.neg:\n        this.ir.push(OP.NEG);\n        break;\n      case TOKEN.ceiling:\n        this.ir.push(OP.CEIL);\n        break;\n      case TOKEN.floor:\n        this.ir.push(OP.FLOOR);\n        break;\n      case TOKEN.round:\n        this.ir.push(OP.ROUND);\n        break;\n      case TOKEN.truncate:\n        this.ir.push(OP.TRUNC);\n        break;\n      case TOKEN.sqrt:\n        this.ir.push(OP.SQRT);\n        break;\n      case TOKEN.sin:\n        this.ir.push(OP.SIN);\n        break;\n      case TOKEN.cos:\n        this.ir.push(OP.COS);\n        break;\n      case TOKEN.ln:\n        this.ir.push(OP.LN);\n        break;\n      case TOKEN.log:\n        this.ir.push(OP.LOG10);\n        break;\n      case TOKEN.cvi:\n        this.ir.push(OP.CVI);\n        break;\n      case TOKEN.not:\n        if (valueType === PS_VALUE_TYPE.boolean) {\n          this.ir.push(OP.NOT_B);\n        } else if (valueType === PS_VALUE_TYPE.numeric) {\n          this.ir.push(OP.NOT_N);\n        } else {\n          return false;\n        }\n        break;\n      default:\n        return false;\n    }\n    return true;\n  }\n\n  _compileBinary(node) {\n    const { op, first, second } = node;\n\n    // bitshift requires a constant shift amount.\n    if (op === TOKEN.bitshift) {\n      if (first.type !== PS_NODE.const || !Number.isInteger(first.value)) {\n        return false;\n      }\n      if (!this._compileNode(second)) {\n        return false;\n      }\n      this.ir.push(OP.SHIFT, first.value);\n      return true;\n    }\n\n    if (!this._compileNode(second)) {\n      return false;\n    }\n    if (!this._compileNode(first)) {\n      return false;\n    }\n\n    switch (op) {\n      case TOKEN.add:\n        this.ir.push(OP.ADD);\n        break;\n      case TOKEN.sub:\n        this.ir.push(OP.SUB);\n        break;\n      case TOKEN.mul:\n        this.ir.push(OP.MUL);\n        break;\n      case TOKEN.div:\n        this.ir.push(OP.DIV);\n        break;\n      case TOKEN.idiv:\n        this.ir.push(OP.IDIV);\n        break;\n      case TOKEN.mod:\n        this.ir.push(OP.MOD);\n        break;\n      case TOKEN.exp:\n        this.ir.push(OP.POW);\n        break;\n      case TOKEN.eq:\n        this.ir.push(OP.EQ);\n        break;\n      case TOKEN.ne:\n        this.ir.push(OP.NE);\n        break;\n      case TOKEN.gt:\n        this.ir.push(OP.GT);\n        break;\n      case TOKEN.ge:\n        this.ir.push(OP.GE);\n        break;\n      case TOKEN.lt:\n        this.ir.push(OP.LT);\n        break;\n      case TOKEN.le:\n        this.ir.push(OP.LE);\n        break;\n      case TOKEN.and:\n        this.ir.push(OP.AND);\n        break;\n      case TOKEN.or:\n        this.ir.push(OP.OR);\n        break;\n      case TOKEN.xor:\n        this.ir.push(OP.XOR);\n        break;\n      case TOKEN.atan:\n        this.ir.push(OP.ATAN);\n        break;\n      case TOKEN.min:\n        this.ir.push(OP.MIN);\n        break;\n      case TOKEN.max:\n        this.ir.push(OP.MAX);\n        break;\n      default:\n        return false;\n    }\n    return true;\n  }\n\n  _compileTernary(node) {\n    if (!this._compileNode(node.cond)) {\n      return false;\n    }\n\n    this.ir.push(OP.IF, 0);\n    const ifPatch = this.ir.length - 1;\n\n    if (!this._compileNode(node.then)) {\n      return false;\n    }\n\n    this.ir.push(OP.JUMP, 0);\n    const jumpPatch = this.ir.length - 1;\n\n    this.ir[ifPatch] = this.ir.length; // IF jumps here on false\n    if (!this._compileNode(node.otherwise)) {\n      return false;\n    }\n\n    this.ir[jumpPatch] = this.ir.length; // JUMP lands here\n    return true;\n  }\n\n  compile(program) {\n    const outputs = new PSStackToTree().evaluate(program, this.nIn);\n    if (!outputs || outputs.length < this.nOut) {\n      return null;\n    }\n\n    for (let i = 0; i < this.nOut; i++) {\n      if (!this._compileNode(outputs[i])) {\n        return null;\n      }\n      const min = this.range[i * 2];\n      const max = this.range[i * 2 + 1];\n      this.ir.push(OP.STORE, i, min, max);\n    }\n\n    return new Float64Array(this.ir);\n  }\n\n  static execute(ir, src, srcOffset, dest, destOffset) {\n    let ip = 0,\n      sp = 0;\n    const n = ir.length;\n    const stack = this.#stack;\n    const tmp = this.#tmp;\n\n    while (ip < n) {\n      switch (ir[ip++] | 0) {\n        case OP.ARG:\n          stack[sp++] = src[srcOffset + (ir[ip++] | 0)];\n          break;\n        case OP.CONST:\n          stack[sp++] = ir[ip++];\n          break;\n        case OP.STORE: {\n          const slot = ir[ip++] | 0;\n          const min = ir[ip++];\n          const max = ir[ip++];\n          dest[destOffset + slot] = MathClamp(stack[--sp], min, max);\n          break;\n        }\n        case OP.IF: {\n          const tgt = ir[ip++];\n          if (stack[--sp] === 0) {\n            ip = tgt;\n          }\n          break;\n        }\n        case OP.JUMP:\n          ip = ir[ip];\n          break;\n        case OP.ABS:\n          stack[sp - 1] = Math.abs(stack[sp - 1]);\n          break;\n        case OP.NEG:\n          stack[sp - 1] = -stack[sp - 1];\n          break;\n        case OP.CEIL:\n          stack[sp - 1] = Math.ceil(stack[sp - 1]);\n          break;\n        case OP.FLOOR:\n          stack[sp - 1] = Math.floor(stack[sp - 1]);\n          break;\n        case OP.ROUND:\n          stack[sp - 1] = Math.floor(stack[sp - 1] + 0.5);\n          break;\n        case OP.TRUNC:\n          stack[sp - 1] = Math.trunc(stack[sp - 1]);\n          break;\n        case OP.NOT_B:\n          stack[sp - 1] = stack[sp - 1] !== 0 ? 0 : 1;\n          break;\n        case OP.NOT_N:\n          stack[sp - 1] = ~(stack[sp - 1] | 0);\n          break;\n        case OP.SQRT:\n          stack[sp - 1] = Math.sqrt(stack[sp - 1]);\n          break;\n        case OP.SIN:\n          stack[sp - 1] = Math.sin((stack[sp - 1] % 360) * _DEG_TO_RAD);\n          break;\n        case OP.COS:\n          stack[sp - 1] = Math.cos((stack[sp - 1] % 360) * _DEG_TO_RAD);\n          break;\n        case OP.LN:\n          stack[sp - 1] = Math.log(stack[sp - 1]);\n          break;\n        case OP.LOG10:\n          stack[sp - 1] = Math.log10(stack[sp - 1]);\n          break;\n        case OP.CVI:\n          stack[sp - 1] = Math.trunc(stack[sp - 1]) | 0;\n          break;\n        case OP.SHIFT: {\n          const amt = ir[ip++];\n          const v = stack[sp - 1] | 0;\n          if (amt > 0) {\n            stack[sp - 1] = v << amt;\n          } else if (amt < 0) {\n            stack[sp - 1] = v >> -amt;\n          } else {\n            stack[sp - 1] = v;\n          }\n          break;\n        }\n        case OP.ADD: {\n          const b = stack[--sp];\n          stack[sp - 1] += b;\n          break;\n        }\n        case OP.SUB: {\n          const b = stack[--sp];\n          stack[sp - 1] -= b;\n          break;\n        }\n        case OP.MUL: {\n          const b = stack[--sp];\n          stack[sp - 1] *= b;\n          break;\n        }\n        case OP.DIV: {\n          const b = stack[--sp];\n          stack[sp - 1] = b !== 0 ? stack[sp - 1] / b : 0;\n          break;\n        }\n        case OP.IDIV: {\n          const b = stack[--sp];\n          stack[sp - 1] = b !== 0 ? Math.trunc(stack[sp - 1] / b) : 0;\n          break;\n        }\n        case OP.MOD: {\n          const b = stack[--sp];\n          stack[sp - 1] = b !== 0 ? stack[sp - 1] % b : 0;\n          break;\n        }\n        case OP.POW: {\n          const b = stack[--sp];\n          stack[sp - 1] **= b;\n          break;\n        }\n        case OP.EQ: {\n          const b = stack[--sp];\n          stack[sp - 1] = stack[sp - 1] === b ? 1 : 0;\n          break;\n        }\n        case OP.NE: {\n          const b = stack[--sp];\n          stack[sp - 1] = stack[sp - 1] !== b ? 1 : 0;\n          break;\n        }\n        case OP.GT: {\n          const b = stack[--sp];\n          stack[sp - 1] = stack[sp - 1] > b ? 1 : 0;\n          break;\n        }\n        case OP.GE: {\n          const b = stack[--sp];\n          stack[sp - 1] = stack[sp - 1] >= b ? 1 : 0;\n          break;\n        }\n        case OP.LT: {\n          const b = stack[--sp];\n          stack[sp - 1] = stack[sp - 1] < b ? 1 : 0;\n          break;\n        }\n        case OP.LE: {\n          const b = stack[--sp];\n          stack[sp - 1] = stack[sp - 1] <= b ? 1 : 0;\n          break;\n        }\n        case OP.AND: {\n          const b = stack[--sp] | 0;\n          stack[sp - 1] = (stack[sp - 1] | 0) & b;\n          break;\n        }\n        case OP.OR: {\n          const b = stack[--sp] | 0;\n          stack[sp - 1] = stack[sp - 1] | 0 | b;\n          break;\n        }\n        case OP.XOR: {\n          const b = stack[--sp] | 0;\n          stack[sp - 1] = (stack[sp - 1] | 0) ^ b;\n          break;\n        }\n        case OP.ATAN: {\n          const b = stack[--sp];\n          const deg = Math.atan2(stack[sp - 1], b) * _RAD_TO_DEG;\n          stack[sp - 1] = deg < 0 ? deg + 360 : deg;\n          break;\n        }\n        case OP.MIN: {\n          const b = stack[--sp];\n          stack[sp - 1] = Math.min(stack[sp - 1], b);\n          break;\n        }\n        case OP.MAX: {\n          const b = stack[--sp];\n          stack[sp - 1] = Math.max(stack[sp - 1], b);\n          break;\n        }\n        case OP.TEE_TMP:\n          tmp[ir[ip++] | 0] = stack[sp - 1];\n          break;\n        case OP.LOAD_TMP:\n          stack[sp++] = tmp[ir[ip++] | 0];\n          break;\n      }\n    }\n  }\n}\n\n/**\n * Direct stack-based interpreter for a parsed PsProgram.\n * Used when PSStackToTree fails to optimize the AST.\n */\nclass PSStackBasedInterpreter {\n  // Safe: JS is single-threaded.\n  static #stack = new Float64Array(100);\n\n  static #sp = 0;\n\n  static #push(v) {\n    if (this.#sp < this.#stack.length) {\n      this.#stack[this.#sp++] = v;\n    }\n  }\n\n  static #execOp(op) {\n    const stack = this.#stack;\n    switch (op) {\n      case TOKEN.true:\n        this.#push(1);\n        break;\n      case TOKEN.false:\n        this.#push(0);\n        break;\n      case TOKEN.abs:\n        stack[this.#sp - 1] = Math.abs(stack[this.#sp - 1]);\n        break;\n      case TOKEN.neg:\n        stack[this.#sp - 1] = -stack[this.#sp - 1];\n        break;\n      case TOKEN.ceiling:\n        stack[this.#sp - 1] = Math.ceil(stack[this.#sp - 1]);\n        break;\n      case TOKEN.floor:\n        stack[this.#sp - 1] = Math.floor(stack[this.#sp - 1]);\n        break;\n      case TOKEN.round:\n        stack[this.#sp - 1] = Math.floor(stack[this.#sp - 1] + 0.5);\n        break;\n      case TOKEN.truncate:\n        stack[this.#sp - 1] = Math.trunc(stack[this.#sp - 1]);\n        break;\n      case TOKEN.sqrt:\n        stack[this.#sp - 1] = Math.sqrt(stack[this.#sp - 1]);\n        break;\n      case TOKEN.sin:\n        stack[this.#sp - 1] = Math.sin(\n          (stack[this.#sp - 1] % 360) * _DEG_TO_RAD\n        );\n        break;\n      case TOKEN.cos:\n        stack[this.#sp - 1] = Math.cos(\n          (stack[this.#sp - 1] % 360) * _DEG_TO_RAD\n        );\n        break;\n      case TOKEN.ln:\n        stack[this.#sp - 1] = Math.log(stack[this.#sp - 1]);\n        break;\n      case TOKEN.log:\n        stack[this.#sp - 1] = Math.log10(stack[this.#sp - 1]);\n        break;\n      case TOKEN.cvi:\n        stack[this.#sp - 1] = Math.trunc(stack[this.#sp - 1]) | 0;\n        break;\n      case TOKEN.cvr:\n        break; // values are already f64\n      case TOKEN.not: {\n        const v = stack[this.#sp - 1];\n        stack[this.#sp - 1] = v === 0 || v === 1 ? 1 - v : ~(v | 0);\n        break;\n      }\n      case TOKEN.add: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] += b;\n        break;\n      }\n      case TOKEN.sub: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] -= b;\n        break;\n      }\n      case TOKEN.mul: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] *= b;\n        break;\n      }\n      case TOKEN.div: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = b !== 0 ? stack[this.#sp - 1] / b : 0;\n        break;\n      }\n      case TOKEN.idiv: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = b !== 0 ? Math.trunc(stack[this.#sp - 1] / b) : 0;\n        break;\n      }\n      case TOKEN.mod: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = b !== 0 ? stack[this.#sp - 1] % b : 0;\n        break;\n      }\n      case TOKEN.exp: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] **= b;\n        break;\n      }\n      case TOKEN.atan: {\n        // Stack: [..., dy, dx] 鈥� dx on top.\n        const dx = stack[--this.#sp];\n        const deg = Math.atan2(stack[this.#sp - 1], dx) * _RAD_TO_DEG;\n        stack[this.#sp - 1] = deg < 0 ? deg + 360 : deg;\n        break;\n      }\n      case TOKEN.eq: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = stack[this.#sp - 1] === b ? 1 : 0;\n        break;\n      }\n      case TOKEN.ne: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = stack[this.#sp - 1] !== b ? 1 : 0;\n        break;\n      }\n      case TOKEN.gt: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = stack[this.#sp - 1] > b ? 1 : 0;\n        break;\n      }\n      case TOKEN.ge: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = stack[this.#sp - 1] >= b ? 1 : 0;\n        break;\n      }\n      case TOKEN.lt: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = stack[this.#sp - 1] < b ? 1 : 0;\n        break;\n      }\n      case TOKEN.le: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = stack[this.#sp - 1] <= b ? 1 : 0;\n        break;\n      }\n      case TOKEN.and: {\n        const b = stack[--this.#sp] | 0;\n        stack[this.#sp - 1] = (stack[this.#sp - 1] | 0) & b;\n        break;\n      }\n      case TOKEN.or: {\n        const b = stack[--this.#sp] | 0;\n        stack[this.#sp - 1] = stack[this.#sp - 1] | 0 | b;\n        break;\n      }\n      case TOKEN.xor: {\n        const b = stack[--this.#sp] | 0;\n        stack[this.#sp - 1] = (stack[this.#sp - 1] | 0) ^ b;\n        break;\n      }\n      case TOKEN.bitshift: {\n        const amt = stack[--this.#sp] | 0;\n        const v = stack[this.#sp - 1] | 0;\n        stack[this.#sp - 1] = amt > 0 ? v << amt : v >> -amt;\n        break;\n      }\n      case TOKEN.min: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = Math.min(stack[this.#sp - 1], b);\n        break;\n      }\n      case TOKEN.max: {\n        const b = stack[--this.#sp];\n        stack[this.#sp - 1] = Math.max(stack[this.#sp - 1], b);\n        break;\n      }\n      case TOKEN.dup:\n        this.#push(stack[this.#sp - 1]);\n        break;\n      case TOKEN.exch: {\n        const a = stack[--this.#sp];\n        const b = stack[--this.#sp];\n        this.#push(a);\n        this.#push(b);\n        break;\n      }\n      case TOKEN.pop:\n        this.#sp--;\n        break;\n      case TOKEN.copy: {\n        const n = Math.trunc(stack[--this.#sp]);\n        const base = this.#sp - n;\n        for (let k = 0; k < n; k++) {\n          this.#push(stack[base + k]);\n        }\n        break;\n      }\n      case TOKEN.index: {\n        const i = Math.trunc(stack[--this.#sp]);\n        this.#push(stack[this.#sp - 1 - i]);\n        break;\n      }\n      case TOKEN.roll: {\n        // Rotate top n elements by j positions toward the top.\n        const j = Math.trunc(stack[--this.#sp]);\n        const n = Math.trunc(stack[--this.#sp]);\n        if (n > 1 && j !== 0) {\n          const mod = ((j % n) + n) % n;\n          if (mod !== 0) {\n            const base = this.#sp - n;\n            const sub = stack.slice(base, this.#sp);\n            for (let k = 0; k < n; k++) {\n              stack[base + k] = sub[(k - mod + n) % n];\n            }\n          }\n        }\n        break;\n      }\n    }\n  }\n\n  static #execBlock(instructions) {\n    for (const instr of instructions) {\n      switch (instr.type) {\n        case PS_NODE.number:\n          this.#push(instr.value);\n          break;\n        case PS_NODE.operator:\n          this.#execOp(instr.op);\n          break;\n        case PS_NODE.if:\n          if (this.#stack[--this.#sp] !== 0) {\n            this.#execBlock(instr.then.instructions);\n          }\n          break;\n        case PS_NODE.ifelse:\n          if (this.#stack[--this.#sp] !== 0) {\n            this.#execBlock(instr.then.instructions);\n          } else {\n            this.#execBlock(instr.otherwise.instructions);\n          }\n          break;\n      }\n    }\n  }\n\n  /**\n   * @param {import(\"./ast.js\").PsProgram} program\n   * @param {number[]} domain  鈥� flat [min0,max0, 鈥\n   * @param {number[]} range   鈥� flat [min0,max0, 鈥\n   * @returns {Function}  鈥� `(src, srcOffset, dest, destOffset) => void`\n   */\n  static build(program, domain, range) {\n    const nIn = domain.length >> 1;\n    const nOut = range.length >> 1;\n    const { instructions } = program.body;\n    return (src, srcOffset, dest, destOffset) => {\n      this.#sp = 0;\n      for (let i = 0; i < nIn; i++) {\n        this.#push(src[srcOffset + i]);\n      }\n      this.#execBlock(instructions);\n      // Outputs: first at bottom, last at top.\n      const base = this.#sp - nOut;\n      for (let i = 0; i < nOut; i++) {\n        const v = base + i >= 0 ? this.#stack[base + i] : 0;\n        dest[destOffset + i] = MathClamp(range[i * 2 + 1], range[i * 2], v);\n      }\n    };\n  }\n}\n\n/**\n * Tries PSStackToTree-optimized IR first; falls back to direct interpreter.\n *\n * @param {string}   source\n * @param {number[]} domain  鈥� flat [min0,max0, 鈥\n * @param {number[]} range   鈥� flat [min0,max0, 鈥\n * @returns {Function}  鈥� `(src, srcOffset, dest, destOffset) => void`\n */\nfunction buildPostScriptJsFunction(\n  source,\n  domain,\n  range,\n  forceInterpreter = false\n) {\n  const program = parsePostScriptFunction(source);\n  const ir =\n    !forceInterpreter && new PsJsCompiler(domain, range).compile(program);\n  if (ir) {\n    return (src, srcOffset, dest, destOffset) => {\n      PsJsCompiler.execute(ir, src, srcOffset, dest, destOffset);\n    };\n  }\n  // Fall back to direct interpreter.\n  return PSStackBasedInterpreter.build(program, domain, range);\n}\n\nexport { buildPostScriptJsFunction };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  parsePostScriptFunction,\n  PS_NODE,\n  PS_VALUE_TYPE,\n  PSStackToTree,\n} from \"./ast.js\";\nimport { TOKEN } from \"./lexer.js\";\n\n// Wasm opcodes 鈥� https://webassembly.github.io/spec/core/binary/instructions.html\nconst OP = {\n  if: 0x04,\n  else: 0x05,\n  end: 0x0b,\n  select: 0x1b,\n  call: 0x10,\n  local_get: 0x20,\n  local_set: 0x21,\n  local_tee: 0x22,\n  i32_const: 0x41,\n  i32_eqz: 0x45,\n  i32_and: 0x71,\n  i32_or: 0x72,\n  i32_xor: 0x73,\n  i32_shl: 0x74,\n  i32_shr_s: 0x75,\n  i32_trunc_f64_s: 0xaa,\n  f64_const: 0x44,\n  f64_eq: 0x61,\n  f64_ne: 0x62,\n  f64_lt: 0x63,\n  f64_gt: 0x64,\n  f64_le: 0x65,\n  f64_ge: 0x66,\n  f64_abs: 0x99,\n  f64_neg: 0x9a,\n  f64_ceil: 0x9b,\n  f64_floor: 0x9c,\n  f64_trunc: 0x9d,\n  f64_nearest: 0x9e,\n  f64_sqrt: 0x9f,\n  f64_add: 0xa0,\n  f64_sub: 0xa1,\n  f64_mul: 0xa2,\n  f64_div: 0xa3,\n  f64_min: 0xa4,\n  f64_max: 0xa5,\n  f64_convert_i32_s: 0xb7,\n  f64_store: 0x39,\n};\n\n// https://webassembly.github.io/spec/core/binary/types.html#binary-comptype\nconst FUNC_TYPE = 0x60;\n// https://webassembly.github.io/spec/core/binary/types.html#binary-valtype\nconst F64 = 0x7c;\n\n// https://webassembly.github.io/spec/core/binary/modules.html\nconst SECTION = {\n  type: 0x01,\n  import: 0x02,\n  function: 0x03,\n  memory: 0x05,\n  export: 0x07,\n  code: 0x0a,\n};\n\n// https://webassembly.github.io/spec/core/binary/modules.html#binary-importdesc\nconst EXTERN_FUNC = 0x00;\n// https://webassembly.github.io/spec/core/binary/modules.html#binary-exportdesc\nconst EXTERN_MEM = 0x02;\n\n// https://webassembly.github.io/spec/core/binary/values.html#binary-int (unsigned LEB128)\nfunction unsignedLEB128(n) {\n  const out = [];\n  do {\n    let byte = n & 0x7f;\n    n >>>= 7;\n    if (n !== 0) {\n      byte |= 0x80;\n    }\n    out.push(byte);\n  } while (n !== 0);\n  return out;\n}\n\nfunction encodeASCIIString(s) {\n  return [...unsignedLEB128(s.length), ...Array.from(s, c => c.charCodeAt(0))];\n}\n\nfunction section(id, data) {\n  return [id, ...unsignedLEB128(data.length), ...data];\n}\n\nfunction vec(items) {\n  const out = unsignedLEB128(items.length);\n  for (const item of items) {\n    if (typeof item === \"number\") {\n      out.push(item);\n      continue;\n    }\n    for (const byte of item) {\n      out.push(byte);\n    }\n  }\n  return out;\n}\n\n// Math functions unavailable as Wasm instructions 鈥� imported from JS.\nconst MATH_IMPORTS = [\n  // name | module | field | params | results\n  [\"sin\", \"Math\", \"sin\", [F64], [F64]],\n  [\"cos\", \"Math\", \"cos\", [F64], [F64]],\n  // atan2(dy, dx) 鈥� PS atan takes (dy dx) in that order\n  [\"atan2\", \"Math\", \"atan2\", [F64, F64], [F64]],\n  [\"log\", \"Math\", \"log\", [F64], [F64]], // natural log\n  [\"log10\", \"Math\", \"log10\", [F64], [F64]],\n  // pow(base, exp)\n  [\"pow\", \"Math\", \"pow\", [F64, F64], [F64]],\n];\n\n// Import object for WebAssembly instantiation 鈥� only the functions declared\n// in MATH_IMPORTS, keyed by their field name.\nconst _mathImportObject = {\n  Math: Object.fromEntries(MATH_IMPORTS.map(([name]) => [name, Math[name]])),\n};\n\n// Walks each PSStackToTree output node and emits Wasm, leaving one f64 per\n// output on the Wasm operand stack.  Ternary nodes compile to if/else/end.\nclass PsWasmCompiler {\n  static #initialized = false;\n\n  static #comparisonToOp = null;\n\n  static #importIdx = null;\n\n  static #degToRad = 0;\n\n  static #radToDeg = 0;\n\n  static #importTypeEntries = null;\n\n  static #importSection = null;\n\n  static #functionSection = null;\n\n  static #memorySection = null;\n\n  static #exportSection = null;\n\n  static #wasmMagicVersion = null;\n\n  // Shared buffer for f64 encoding 鈥� avoids per-call allocation.\n  static #f64View = null;\n\n  static #f64Arr = null;\n\n  static #init() {\n    // TOKEN comparison ids 鈫� Wasm f64 comparison opcodes (leave i32 on stack).\n    this.#comparisonToOp = new Map([\n      [TOKEN.eq, OP.f64_eq],\n      [TOKEN.ne, OP.f64_ne],\n      [TOKEN.lt, OP.f64_lt],\n      [TOKEN.le, OP.f64_le],\n      [TOKEN.gt, OP.f64_gt],\n      [TOKEN.ge, OP.f64_ge],\n    ]);\n    // Index of each import function by name.\n    this.#importIdx = Object.create(null);\n    for (let i = 0; i < MATH_IMPORTS.length; i++) {\n      this.#importIdx[MATH_IMPORTS[i][0]] = i;\n    }\n    this.#degToRad = Math.PI / 180;\n    this.#radToDeg = 180 / Math.PI;\n    // Import type entries are identical on every compilation 鈥� compute once.\n    this.#importTypeEntries = MATH_IMPORTS.map(([, , , params, results]) => [\n      FUNC_TYPE,\n      ...vec(params),\n      ...vec(results),\n    ]);\n    // Static Wasm sections that never change between compilations.\n    this.#importSection = new Uint8Array(\n      section(\n        SECTION.import,\n        vec(\n          MATH_IMPORTS.map(([, mod, field], i) => [\n            ...encodeASCIIString(mod),\n            ...encodeASCIIString(field),\n            EXTERN_FUNC, // import kind: function\n            ...unsignedLEB128(i + 1), // type index (0 = main func type)\n          ])\n        )\n      )\n    );\n    // One function, type index 0.\n    this.#functionSection = new Uint8Array(\n      section(SECTION.function, vec([[0]]))\n    );\n    // Min 1 page (64 KiB), no max.\n    // https://webassembly.github.io/spec/core/binary/types.html#binary-limits\n    this.#memorySection = new Uint8Array(\n      section(SECTION.memory, vec([[0x00, 0x01]]))\n    );\n    // Export \"fn\" (func index = nImports) and \"mem\" (memory) for the wrapper.\n    this.#exportSection = new Uint8Array(\n      section(\n        SECTION.export,\n        vec([\n          [\n            ...encodeASCIIString(\"fn\"),\n            EXTERN_FUNC,\n            ...unsignedLEB128(MATH_IMPORTS.length),\n          ],\n          [...encodeASCIIString(\"mem\"), EXTERN_MEM, 0x00],\n        ])\n      )\n    );\n    // Wasm binary magic + version (constant).\n    // https://webassembly.github.io/spec/core/binary/modules.html#binary-magic\n    this.#wasmMagicVersion = new Uint8Array([\n      0x00,\n      0x61,\n      0x73,\n      0x6d, // \\0asm\n      0x01,\n      0x00,\n      0x00,\n      0x00, // version 1\n    ]);\n    const f64Buf = new ArrayBuffer(8);\n    this.#f64View = new DataView(f64Buf);\n    this.#f64Arr = new Uint8Array(f64Buf);\n    this.#initialized = true;\n  }\n\n  constructor(domain, range) {\n    if (!PsWasmCompiler.#initialized) {\n      PsWasmCompiler.#init();\n    }\n    this._nIn = domain.length >> 1;\n    this._nOut = range.length >> 1;\n    this._range = range;\n    this._code = [];\n\n    // Params 0..nIn-1 are locals; extra locals start at _nextLocal.\n    this._nextLocal = this._nIn;\n\n    this._freeLocals = [];\n    this._sharedLocals = new Map(); // node 鈫� {local, remaining} for CSE\n  }\n\n  // Wasm emit helpers\n\n  _allocLocal() {\n    return this._freeLocals.pop() ?? this._nextLocal++;\n  }\n\n  _releaseLocal(idx) {\n    this._freeLocals.push(idx);\n  }\n\n  _emitULEB128(n) {\n    do {\n      let b = n & 0x7f;\n      n >>>= 7;\n      if (n !== 0) {\n        b |= 0x80;\n      }\n      this._code.push(b);\n    } while (n !== 0);\n  }\n\n  _emitF64Const(value) {\n    this._code.push(OP.f64_const);\n    PsWasmCompiler.#f64View.setFloat64(0, value, true /* little-endian */);\n    for (let i = 0; i < 8; i++) {\n      this._code.push(PsWasmCompiler.#f64Arr[i]);\n    }\n  }\n\n  _emitLocalGet(idx) {\n    this._code.push(OP.local_get);\n    this._emitULEB128(idx);\n  }\n\n  _emitLocalSet(idx) {\n    this._code.push(OP.local_set);\n    this._emitULEB128(idx);\n  }\n\n  _emitLocalTee(idx) {\n    this._code.push(OP.local_tee);\n    this._emitULEB128(idx);\n  }\n\n  // Tree node compilation\n\n  /**\n   * Emit Wasm instructions for `node`, leaving exactly one f64 on the Wasm\n   * operand stack. Returns false if the node cannot be compiled.\n   */\n  _compileNode(node) {\n    if (node.shared) {\n      const entry = this._sharedLocals.get(node);\n      if (entry !== undefined) {\n        this._emitLocalGet(entry.local);\n        if (--entry.remaining === 0) {\n          this._releaseLocal(entry.local);\n        }\n        return true;\n      }\n      if (!this._compileNodeImpl(node)) {\n        return false;\n      }\n      const local = this._allocLocal();\n      this._sharedLocals.set(node, { local, remaining: node.sharedCount - 1 });\n      this._emitLocalTee(local);\n      return true;\n    }\n    return this._compileNodeImpl(node);\n  }\n\n  _compileNodeImpl(node) {\n    switch (node.type) {\n      case PS_NODE.arg:\n        this._emitLocalGet(node.index);\n        return true;\n\n      case PS_NODE.const: {\n        let v = node.value;\n        if (typeof v === \"boolean\") {\n          v = v ? 1 : 0;\n        }\n        this._emitF64Const(v);\n        return true;\n      }\n\n      case PS_NODE.unary:\n        return this._compileUnaryNode(node);\n\n      case PS_NODE.binary:\n        return this._compileBinaryNode(node);\n\n      case PS_NODE.ternary:\n        return this._compileTernaryNode(node);\n\n      default:\n        return false;\n    }\n  }\n\n  _compileSinCosNode(node) {\n    // PS sin/cos take degrees; normalize mod 360 before converting to radians\n    // so that e.g. sin(360掳) = 0, not Math.sin(2蟺) 鈮� -2.4e-16.\n    const local = this._allocLocal();\n    try {\n      if (!this._compileNode(node.operand)) {\n        return false;\n      }\n      const code = this._code;\n      this._emitLocalSet(local);\n      this._emitLocalGet(local);\n      this._emitLocalGet(local);\n      this._emitF64Const(360);\n      code.push(OP.f64_div, OP.f64_trunc);\n      this._emitF64Const(360);\n      code.push(OP.f64_mul, OP.f64_sub); // a mod 360\n      this._emitF64Const(PsWasmCompiler.#degToRad);\n      code.push(OP.f64_mul, OP.call);\n      this._emitULEB128(\n        PsWasmCompiler.#importIdx[node.op === TOKEN.sin ? \"sin\" : \"cos\"]\n      );\n      return true;\n    } finally {\n      this._releaseLocal(local);\n    }\n  }\n\n  _compileUnaryNode(node) {\n    const code = this._code;\n    if (node.op === TOKEN.sin || node.op === TOKEN.cos) {\n      return this._compileSinCosNode(node);\n    }\n\n    // `not` needs i32, not f64 鈥� handle before the generic compilation below.\n    if (node.op === TOKEN.not) {\n      if (node.valueType === PS_VALUE_TYPE.boolean) {\n        if (!this._compileNodeAsBoolI32(node.operand)) {\n          return false;\n        }\n        code.push(OP.i32_eqz, OP.f64_convert_i32_s);\n        return true;\n      }\n      if (node.valueType === PS_VALUE_TYPE.numeric) {\n        // Bitwise NOT: ~n, implemented as n XOR -1.\n        // i32.const -1 encodes as the single signed-LEB128 byte 0x7f.\n        if (!this._compileNode(node.operand)) {\n          return false;\n        }\n        code.push(\n          OP.i32_trunc_f64_s,\n          OP.i32_const,\n          0x7f,\n          OP.i32_xor,\n          OP.f64_convert_i32_s\n        );\n        return true;\n      }\n      // Unknown type 鈥� cannot safely choose boolean or bitwise NOT.\n      return false;\n    }\n\n    if (!this._compileNode(node.operand)) {\n      return false;\n    }\n    switch (node.op) {\n      case TOKEN.abs:\n        code.push(OP.f64_abs);\n        break;\n      case TOKEN.neg:\n        code.push(OP.f64_neg);\n        break;\n      case TOKEN.sqrt:\n        code.push(OP.f64_sqrt);\n        break;\n      case TOKEN.floor:\n        code.push(OP.f64_floor);\n        break;\n      case TOKEN.ceiling:\n        code.push(OP.f64_ceil);\n        break;\n      case TOKEN.round:\n        // PostScript `round` uses round-half-up (floor(x+0.5)), not the\n        // banker's rounding that Wasm f64.nearest implements.\n        this._emitF64Const(0.5);\n        code.push(OP.f64_add, OP.f64_floor);\n        break;\n      case TOKEN.truncate:\n        code.push(OP.f64_trunc);\n        break;\n      case TOKEN.cvi:\n        // Truncate toward zero, keep as f64.\n        code.push(OP.i32_trunc_f64_s, OP.f64_convert_i32_s);\n        break;\n      case TOKEN.cvr:\n        // No-op: already f64.\n        break;\n      case TOKEN.ln:\n        code.push(OP.call);\n        this._emitULEB128(PsWasmCompiler.#importIdx.log);\n        break;\n      case TOKEN.log:\n        code.push(OP.call);\n        this._emitULEB128(PsWasmCompiler.#importIdx.log10);\n        break;\n      default:\n        return false;\n    }\n    return true;\n  }\n\n  _compileSafeDivNode(first, second) {\n    // Returns 0 when divisor == 0 (IEEE 754 gives 卤Inf/NaN; pdfium returns 0).\n    const tmp = this._allocLocal();\n    try {\n      if (!this._compileNode(second)) {\n        return false;\n      }\n      if (!this._compileNode(first)) {\n        return false;\n      }\n      const code = this._code;\n      this._emitLocalTee(tmp);\n      code.push(OP.f64_div);\n      this._emitF64Const(0);\n      this._emitLocalGet(tmp);\n      this._emitF64Const(0);\n      code.push(OP.f64_ne, OP.select);\n      return true;\n    } finally {\n      this._releaseLocal(tmp);\n    }\n  }\n\n  _compileSafeIdivNode(first, second) {\n    // `trunc(second / first)` returning 0 when first == 0, matching pdfium.\n    // Same select pattern as _compileSafeDivNode with an extra f64_trunc.\n    const tmp = this._allocLocal();\n    try {\n      if (!this._compileNode(second)) {\n        return false;\n      }\n      if (!this._compileNode(first)) {\n        return false;\n      }\n      const code = this._code;\n      this._emitLocalTee(tmp);\n      code.push(OP.f64_div, OP.f64_trunc);\n      this._emitF64Const(0);\n      this._emitLocalGet(tmp);\n      this._emitF64Const(0);\n      code.push(OP.f64_ne, OP.select);\n      return true;\n    } finally {\n      this._releaseLocal(tmp);\n    }\n  }\n\n  _compileBitshiftNode(first, second) {\n    if (first.type !== PS_NODE.const || !Number.isInteger(first.value)) {\n      return false;\n    }\n    if (!this._compileNode(second)) {\n      return false;\n    }\n\n    const code = this._code;\n    code.push(OP.i32_trunc_f64_s);\n    const shift = first.value;\n    if (shift > 0) {\n      code.push(OP.i32_const);\n      this._emitULEB128(shift);\n      code.push(OP.i32_shl);\n    } else if (shift < 0) {\n      code.push(OP.i32_const);\n      this._emitULEB128(-shift);\n      code.push(OP.i32_shr_s);\n    }\n    code.push(OP.f64_convert_i32_s);\n    return true;\n  }\n\n  _compileModNode(first, second) {\n    // a mod 0 鈫� 0, matching pdfium. Const b=0: a is computed but discarded.\n    if (first.type === PS_NODE.const && first.value === 0) {\n      if (!this._compileNode(second)) {\n        return false;\n      }\n      this._code.push(OP.drop);\n      this._emitF64Const(0);\n      return true;\n    }\n\n    const localA = this._allocLocal();\n    try {\n      if (!this._compileNode(second)) {\n        return false;\n      }\n      this._emitLocalTee(localA);\n\n      const code = this._code;\n      if (first.type === PS_NODE.const) {\n        // b鈮�0 guaranteed (b=0 handled above).\n        this._emitLocalGet(localA);\n        this._emitF64Const(first.value);\n        code.push(OP.f64_div, OP.f64_trunc);\n        this._emitF64Const(first.value);\n        code.push(OP.f64_mul, OP.f64_sub);\n      } else {\n        const localB = this._allocLocal();\n        try {\n          if (!this._compileNode(first)) {\n            return false;\n          }\n          this._emitLocalSet(localB);\n          this._emitLocalGet(localA);\n          this._emitLocalGet(localB);\n          code.push(OP.f64_div, OP.f64_trunc);\n          this._emitLocalGet(localB);\n          code.push(OP.f64_mul, OP.f64_sub);\n          // Guard: if b=0, return 0 instead of NaN.\n          this._emitF64Const(0);\n          this._emitLocalGet(localB);\n          this._emitF64Const(0);\n          code.push(OP.f64_ne, OP.select);\n        } finally {\n          this._releaseLocal(localB);\n        }\n      }\n      return true;\n    } finally {\n      this._releaseLocal(localA);\n    }\n  }\n\n  _compileAtanNode(first, second) {\n    const localR = this._allocLocal();\n    try {\n      if (!this._compileNode(second)) {\n        return false;\n      }\n      if (!this._compileNode(first)) {\n        return false;\n      }\n\n      const code = this._code;\n      code.push(OP.call);\n      this._emitULEB128(PsWasmCompiler.#importIdx.atan2);\n      this._emitF64Const(PsWasmCompiler.#radToDeg);\n      code.push(OP.f64_mul);\n\n      this._emitLocalTee(localR);\n      this._emitF64Const(0);\n      code.push(OP.f64_lt, OP.if, F64);\n      this._emitLocalGet(localR);\n      this._emitF64Const(360);\n      code.push(OP.f64_add, OP.else);\n      this._emitLocalGet(localR);\n      code.push(OP.end);\n      return true;\n    } finally {\n      this._releaseLocal(localR);\n    }\n  }\n\n  _compileBitwiseNode(op, first, second) {\n    if (!this._compileBitwiseOperandI32(second)) {\n      return false;\n    }\n    if (!this._compileBitwiseOperandI32(first)) {\n      return false;\n    }\n    const code = this._code;\n    switch (op) {\n      case TOKEN.and:\n        code.push(OP.i32_and);\n        break;\n      case TOKEN.or:\n        code.push(OP.i32_or);\n        break;\n      case TOKEN.xor:\n        code.push(OP.i32_xor);\n        break;\n      default:\n        return false;\n    }\n    code.push(OP.f64_convert_i32_s);\n    return true;\n  }\n\n  _compileBitwiseOperandI32(node) {\n    if (node.valueType === PS_VALUE_TYPE.boolean) {\n      return this._compileNodeAsBoolI32(node);\n    }\n    if (!this._compileNode(node)) {\n      return false;\n    }\n    this._code.push(OP.i32_trunc_f64_s);\n    return true;\n  }\n\n  _compileStandardBinaryNode(op, first, second) {\n    // Identical non-atomic operands: compile once, tee/get.\n    // Skip when shared 鈥� _compileNode already handles that case.\n    if (\n      first === second &&\n      first.type !== PS_NODE.arg &&\n      first.type !== PS_NODE.const &&\n      !first.shared\n    ) {\n      const tmp = this._allocLocal();\n      try {\n        if (!this._compileNode(first)) {\n          return false;\n        }\n        this._emitLocalTee(tmp); // [x]  (also stores to tmp)\n        this._emitLocalGet(tmp); // [x, x]\n      } finally {\n        this._releaseLocal(tmp);\n      }\n    } else {\n      if (!this._compileNode(second)) {\n        return false;\n      }\n      if (!this._compileNode(first)) {\n        return false;\n      }\n    }\n\n    const code = this._code;\n    switch (op) {\n      case TOKEN.add:\n        code.push(OP.f64_add);\n        break;\n      case TOKEN.sub:\n        code.push(OP.f64_sub);\n        break;\n      case TOKEN.mul:\n        code.push(OP.f64_mul);\n        break;\n      case TOKEN.exp:\n        code.push(OP.call);\n        this._emitULEB128(PsWasmCompiler.#importIdx.pow);\n        break;\n      case TOKEN.eq:\n        code.push(OP.f64_eq, OP.f64_convert_i32_s);\n        break;\n      case TOKEN.ne:\n        code.push(OP.f64_ne, OP.f64_convert_i32_s);\n        break;\n      case TOKEN.lt:\n        code.push(OP.f64_lt, OP.f64_convert_i32_s);\n        break;\n      case TOKEN.le:\n        code.push(OP.f64_le, OP.f64_convert_i32_s);\n        break;\n      case TOKEN.gt:\n        code.push(OP.f64_gt, OP.f64_convert_i32_s);\n        break;\n      case TOKEN.ge:\n        code.push(OP.f64_ge, OP.f64_convert_i32_s);\n        break;\n      case TOKEN.min:\n        code.push(OP.f64_min);\n        break;\n      case TOKEN.max:\n        code.push(OP.f64_max);\n        break;\n      default:\n        return false;\n    }\n    return true;\n  }\n\n  _compileBinaryNode(node) {\n    const { op, first, second } = node;\n    if (op === TOKEN.bitshift) {\n      return this._compileBitshiftNode(first, second);\n    }\n\n    if (op === TOKEN.div) {\n      return this._compileSafeDivNode(first, second);\n    }\n\n    if (op === TOKEN.idiv) {\n      return this._compileSafeIdivNode(first, second);\n    }\n\n    if (op === TOKEN.mod) {\n      return this._compileModNode(first, second);\n    }\n\n    if (op === TOKEN.atan) {\n      return this._compileAtanNode(first, second);\n    }\n\n    if (op === TOKEN.and || op === TOKEN.or || op === TOKEN.xor) {\n      return this._compileBitwiseNode(op, first, second);\n    }\n\n    return this._compileStandardBinaryNode(op, first, second);\n  }\n\n  /**\n   * Compile `node` leaving an i32 (0 or 1) on the stack, short-circuiting\n   * f64/i32 round-trips for comparisons, boolean and/or/xor, and boolean `not`.\n   */\n  _compileNodeAsBoolI32(node) {\n    if (node.type === PS_NODE.binary) {\n      // Comparison: leaves i32 directly.\n      const wasmOp = PsWasmCompiler.#comparisonToOp.get(node.op);\n      if (wasmOp !== undefined) {\n        if (!this._compileNode(node.second)) {\n          return false;\n        }\n        if (!this._compileNode(node.first)) {\n          return false;\n        }\n        this._code.push(wasmOp);\n        return true;\n      }\n      // Boolean and/or/xor: compile as i32, skipping f64.convert_i32_s.\n      if (\n        node.valueType === PS_VALUE_TYPE.boolean &&\n        (node.op === TOKEN.and || node.op === TOKEN.or || node.op === TOKEN.xor)\n      ) {\n        if (!this._compileNodeAsBoolI32(node.second)) {\n          return false;\n        }\n        if (!this._compileNodeAsBoolI32(node.first)) {\n          return false;\n        }\n        switch (node.op) {\n          case TOKEN.and:\n            this._code.push(OP.i32_and);\n            break;\n          case TOKEN.or:\n            this._code.push(OP.i32_or);\n            break;\n          case TOKEN.xor:\n            this._code.push(OP.i32_xor);\n            break;\n        }\n        return true;\n      }\n    }\n    // Boolean not: i32.eqz.\n    if (\n      node.type === PS_NODE.unary &&\n      node.op === TOKEN.not &&\n      node.valueType === PS_VALUE_TYPE.boolean\n    ) {\n      if (!this._compileNodeAsBoolI32(node.operand)) {\n        return false;\n      }\n      this._code.push(OP.i32_eqz);\n      return true;\n    }\n    // Fallback: f64 then truncate (safe 鈥� boolean f64 is always 0.0 or 1.0).\n    if (!this._compileNode(node)) {\n      return false;\n    }\n    if (node.valueType === PS_VALUE_TYPE.boolean) {\n      this._code.push(OP.i32_trunc_f64_s);\n    } else {\n      // Unknown type: f64.ne treats NaN as truthy (NaN != 0 鈫� 1).\n      this._emitF64Const(0);\n      this._code.push(OP.f64_ne);\n    }\n    return true;\n  }\n\n  // Value-returning if/else/end; both branches leave one f64.\n  _compileTernaryNode(node) {\n    if (!this._compileNodeAsBoolI32(node.cond)) {\n      return false;\n    }\n    this._code.push(OP.if, F64);\n    if (!this._compileNode(node.then)) {\n      return false;\n    }\n    this._code.push(OP.else);\n    if (!this._compileNode(node.otherwise)) {\n      return false;\n    }\n    this._code.push(OP.end);\n    return true;\n  }\n\n  /**\n   * Convert the parser AST to a tree, compile each output expression, clamp\n   * results to the declared range, store to linear memory, and assemble the\n   * Wasm binary.\n   *\n   * @param {import(\"./ast.js\").PsProgram} program\n   * @returns {Uint8Array|null}  Wasm binary, or null if compilation failed.\n   */\n  compile(program) {\n    const outputs = new PSStackToTree().evaluate(program, this._nIn);\n    if (!outputs || outputs.length < this._nOut) {\n      return null;\n    }\n\n    // For each output: push memory offset, compile, clamp to [min, max], store.\n    const code = this._code;\n    for (let i = 0; i < this._nOut; i++) {\n      const min = this._range[i * 2];\n      const max = this._range[i * 2 + 1];\n      code.push(OP.i32_const);\n      this._emitULEB128(i * 8);\n      if (!this._compileNode(outputs[i])) {\n        return null;\n      }\n      this._emitF64Const(max);\n      code.push(OP.f64_min);\n      this._emitF64Const(min);\n      code.push(OP.f64_max, OP.f64_store, 0x03, 0x00);\n    }\n    code.push(OP.end); // end of function body\n\n    // Assemble the Wasm module binary\n\n    const nIn = this._nIn;\n    const nLocals = this._nextLocal - nIn;\n\n    // Type section: function type varies per compilation; imports precomputed.\n    const paramTypes = Array(nIn).fill(F64);\n    const resultTypes = []; // void: outputs are written to linear memory\n    const funcType = [FUNC_TYPE, ...vec(paramTypes), ...vec(resultTypes)];\n    const typeSectionBytes = new Uint8Array(\n      section(\n        SECTION.type,\n        vec([funcType, ...PsWasmCompiler.#importTypeEntries])\n      )\n    );\n\n    // Code section: local declarations + compiled body bytes.\n    const localDecls =\n      nLocals > 0\n        ? vec([[...unsignedLEB128(nLocals), F64]]) // one group of nLocals f64s\n        : vec([]);\n    const funcBodyLen = localDecls.length + code.length;\n    const codeSectionBytes = new Uint8Array(\n      section(\n        SECTION.code,\n        vec([[...unsignedLEB128(funcBodyLen), ...localDecls, ...code]])\n      )\n    );\n\n    // Section order per spec: type, import, function, memory, export, code.\n    const magicVersion = PsWasmCompiler.#wasmMagicVersion;\n    const importSection = PsWasmCompiler.#importSection;\n    const functionSection = PsWasmCompiler.#functionSection;\n    const memorySection = PsWasmCompiler.#memorySection;\n    const exportSection = PsWasmCompiler.#exportSection;\n    const totalLen =\n      magicVersion.length +\n      typeSectionBytes.length +\n      importSection.length +\n      functionSection.length +\n      memorySection.length +\n      exportSection.length +\n      codeSectionBytes.length;\n    const result = new Uint8Array(totalLen);\n    let off = 0;\n    result.set(magicVersion, off);\n    off += magicVersion.length;\n    result.set(typeSectionBytes, off);\n    off += typeSectionBytes.length;\n    result.set(importSection, off);\n    off += importSection.length;\n    result.set(functionSection, off);\n    off += functionSection.length;\n    result.set(memorySection, off);\n    off += memorySection.length;\n    result.set(exportSection, off);\n    off += exportSection.length;\n    result.set(codeSectionBytes, off);\n    return result;\n  }\n}\n\n/**\n * Parse and compile a PostScript Type 4 function source string into a Wasm\n * binary.  PSStackToTree handles constant folding and algebraic simplifications\n * during the parse-to-tree conversion, so no separate optimizer pass is needed.\n *\n * @param {string} source    鈥� raw PostScript source (decoded PDF stream)\n * @param {number[]} domain  鈥� flat [min0,max0, min1,max1, ...] array\n * @param {number[]} range   鈥� flat [min0,max0, min1,max1, ...] array\n * @returns {Uint8Array|null}  鈥� Wasm binary, or null if compilation failed\n */\nfunction compilePostScriptToWasm(source, domain, range) {\n  return new PsWasmCompiler(domain, range).compile(\n    parsePostScriptFunction(source)\n  );\n}\n\n/**\n * Build a JS wrapper around a compiled Wasm instance.\n *\n * The returned function has the signature `(src, srcOffset, dest, destOffset)`.\n * It reads nIn f64 inputs from `src` starting at `srcOffset`, and writes\n * nOut clamped f64 outputs to `dest` starting at `destOffset`.\n */\nfunction _makeWrapper(exports, nIn, nOut) {\n  const { fn, mem } = exports;\n  const outView = new Float64Array(mem.buffer, 0, nOut);\n\n  // Unrolled for common arities (1-4) to avoid loop overhead.\n  let writeOut;\n  switch (nOut) {\n    case 1:\n      writeOut = (dest, destOffset) => {\n        dest[destOffset] = outView[0];\n      };\n      break;\n    case 2:\n      writeOut = (dest, destOffset) => {\n        dest[destOffset] = outView[0];\n        dest[destOffset + 1] = outView[1];\n      };\n      break;\n    case 3:\n      writeOut = (dest, destOffset) => {\n        dest[destOffset] = outView[0];\n        dest[destOffset + 1] = outView[1];\n        dest[destOffset + 2] = outView[2];\n      };\n      break;\n    case 4:\n      writeOut = (dest, destOffset) => {\n        dest[destOffset] = outView[0];\n        dest[destOffset + 1] = outView[1];\n        dest[destOffset + 2] = outView[2];\n        dest[destOffset + 3] = outView[3];\n      };\n      break;\n    default:\n      writeOut = (dest, destOffset) => {\n        for (let i = 0; i < nOut; i++) {\n          dest[destOffset + i] = outView[i];\n        }\n      };\n  }\n\n  // Specialize the call site for each arity so that the engine sees a\n  // fixed-argument call rather than a spread 鈥� avoiding the per-call\n  // argument-array allocation that `fn(...inBuf)` would cause.\n  switch (nIn) {\n    case 1:\n      return (src, srcOffset, dest, destOffset) => {\n        fn(src[srcOffset]);\n        writeOut(dest, destOffset);\n      };\n    case 2:\n      return (src, srcOffset, dest, destOffset) => {\n        fn(src[srcOffset], src[srcOffset + 1]);\n        writeOut(dest, destOffset);\n      };\n    case 3:\n      return (src, srcOffset, dest, destOffset) => {\n        fn(src[srcOffset], src[srcOffset + 1], src[srcOffset + 2]);\n        writeOut(dest, destOffset);\n      };\n    case 4:\n      return (src, srcOffset, dest, destOffset) => {\n        fn(\n          src[srcOffset],\n          src[srcOffset + 1],\n          src[srcOffset + 2],\n          src[srcOffset + 3]\n        );\n        writeOut(dest, destOffset);\n      };\n    default: {\n      // Fallback for unusual arities: pre-allocate once, copy per call.\n      const inBuf = new Float64Array(nIn);\n      return (src, srcOffset, dest, destOffset) => {\n        for (let i = 0; i < nIn; i++) {\n          inBuf[i] = src[srcOffset + i];\n        }\n        fn(...inBuf);\n        writeOut(dest, destOffset);\n      };\n    }\n  }\n}\n\n/**\n * Parse, optimize, compile, and synchronously instantiate a PostScript Type 4\n * function source string as a callable JavaScript function backed by a Wasm\n * module.\n *\n * Note: synchronous Wasm compilation is only allowed for small modules\n * (< 4 KB in most browsers).  Type 4 functions always qualify.\n *\n * @param {string} source    鈥� raw PostScript source (decoded PDF stream)\n * @param {number[]} domain  鈥� flat [min0,max0, min1,max1, ...] array\n * @param {number[]} range   鈥� flat [min0,max0, min1,max1, ...] array\n * @returns {Function|null}  鈥� a `(src, srcOffset, dest, destOffset)` function\n *   that writes nOut clamped f64 outputs to `dest`, or null if compilation\n *   failed.\n */\nfunction buildPostScriptWasmFunction(source, domain, range) {\n  const bytes = compilePostScriptToWasm(source, domain, range);\n  if (!bytes) {\n    return null;\n  }\n  try {\n    const instance = new WebAssembly.Instance(\n      new WebAssembly.Module(bytes),\n      _mathImportObject\n    );\n    return _makeWrapper(\n      instance.exports,\n      domain.length >> 1,\n      range.length >> 1\n    );\n  } catch {\n    return null;\n  }\n}\n\nexport { buildPostScriptWasmFunction, compilePostScriptToWasm };\n","/* Copyright 2019 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, unreachable, warn } from \"../shared/util.js\";\nimport { RefSet, RefSetCache } from \"./primitives.js\";\n\nclass BaseLocalCache {\n  constructor(options) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseLocalCache\n    ) {\n      unreachable(\"Cannot initialize BaseLocalCache.\");\n    }\n    this._onlyRefs = options?.onlyRefs === true;\n\n    if (!this._onlyRefs) {\n      this._nameRefMap = new Map();\n      this._imageMap = new Map();\n    }\n    this._imageCache = new RefSetCache();\n  }\n\n  getByName(name) {\n    if (this._onlyRefs) {\n      unreachable(\"Should not call `getByName` method.\");\n    }\n    const ref = this._nameRefMap.get(name);\n    if (ref) {\n      return this.getByRef(ref);\n    }\n    return this._imageMap.get(name) || null;\n  }\n\n  getByRef(ref) {\n    return this._imageCache.get(ref) || null;\n  }\n\n  set(name, ref, data) {\n    unreachable(\"Abstract method `set` called.\");\n  }\n}\n\nclass LocalImageCache extends BaseLocalCache {\n  set(name, ref = null, data) {\n    if (typeof name !== \"string\") {\n      throw new Error('LocalImageCache.set - expected \"name\" argument.');\n    }\n    if (ref) {\n      if (this._imageCache.has(ref)) {\n        return;\n      }\n      this._nameRefMap.set(name, ref);\n      this._imageCache.put(ref, data);\n      return;\n    }\n    // name\n    if (this._imageMap.has(name)) {\n      return;\n    }\n    this._imageMap.set(name, data);\n  }\n}\n\nclass LocalColorSpaceCache extends BaseLocalCache {\n  set(name = null, ref = null, data) {\n    if (typeof name !== \"string\" && !ref) {\n      throw new Error(\n        'LocalColorSpaceCache.set - expected \"name\" and/or \"ref\" argument.'\n      );\n    }\n    if (ref) {\n      if (this._imageCache.has(ref)) {\n        return;\n      }\n      if (name !== null) {\n        // Optional when `ref` is defined.\n        this._nameRefMap.set(name, ref);\n      }\n      this._imageCache.put(ref, data);\n      return;\n    }\n    // name\n    if (this._imageMap.has(name)) {\n      return;\n    }\n    this._imageMap.set(name, data);\n  }\n}\n\nclass LocalFunctionCache extends BaseLocalCache {\n  constructor(options) {\n    super({ onlyRefs: true });\n  }\n\n  set(name = null, ref, data) {\n    if (!ref) {\n      throw new Error('LocalFunctionCache.set - expected \"ref\" argument.');\n    }\n    if (this._imageCache.has(ref)) {\n      return;\n    }\n    this._imageCache.put(ref, data);\n  }\n}\n\nclass LocalGStateCache extends BaseLocalCache {\n  set(name, ref = null, data) {\n    if (typeof name !== \"string\") {\n      throw new Error('LocalGStateCache.set - expected \"name\" argument.');\n    }\n    if (ref) {\n      if (this._imageCache.has(ref)) {\n        return;\n      }\n      this._nameRefMap.set(name, ref);\n      this._imageCache.put(ref, data);\n      return;\n    }\n    // name\n    if (this._imageMap.has(name)) {\n      return;\n    }\n    this._imageMap.set(name, data);\n  }\n}\n\nclass LocalTilingPatternCache extends BaseLocalCache {\n  constructor(options) {\n    super({ onlyRefs: true });\n  }\n\n  set(name = null, ref, data) {\n    if (!ref) {\n      throw new Error('LocalTilingPatternCache.set - expected \"ref\" argument.');\n    }\n    if (this._imageCache.has(ref)) {\n      return;\n    }\n    this._imageCache.put(ref, data);\n  }\n}\n\nclass RegionalImageCache extends BaseLocalCache {\n  constructor(options) {\n    super({ onlyRefs: true });\n  }\n\n  set(name = null, ref, data) {\n    if (!ref) {\n      throw new Error('RegionalImageCache.set - expected \"ref\" argument.');\n    }\n    if (this._imageCache.has(ref)) {\n      return;\n    }\n    this._imageCache.put(ref, data);\n  }\n}\n\nclass GlobalColorSpaceCache extends BaseLocalCache {\n  constructor(options) {\n    super({ onlyRefs: true });\n  }\n\n  set(name = null, ref, data) {\n    if (!ref) {\n      throw new Error('GlobalColorSpaceCache.set - expected \"ref\" argument.');\n    }\n    if (this._imageCache.has(ref)) {\n      return;\n    }\n    this._imageCache.put(ref, data);\n  }\n\n  clear() {\n    this._imageCache.clear();\n  }\n}\n\nclass GlobalImageCache {\n  static NUM_PAGES_THRESHOLD = 2;\n\n  static MIN_IMAGES_TO_CACHE = 10;\n\n  static MAX_BYTE_SIZE = 5e7; // Fifty megabytes.\n\n  #decodeFailedSet = new RefSet();\n\n  constructor() {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        GlobalImageCache.NUM_PAGES_THRESHOLD > 1,\n        \"GlobalImageCache - invalid NUM_PAGES_THRESHOLD constant.\"\n      );\n    }\n    this._refCache = new RefSetCache();\n    this._imageCache = new RefSetCache();\n  }\n\n  get #byteSize() {\n    let byteSize = 0;\n    for (const imageData of this._imageCache) {\n      byteSize += imageData.byteSize;\n    }\n    return byteSize;\n  }\n\n  get #cacheLimitReached() {\n    if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) {\n      return false;\n    }\n    if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) {\n      return false;\n    }\n    return true;\n  }\n\n  shouldCache(ref, pageIndex) {\n    let pageIndexSet = this._refCache.get(ref);\n    if (!pageIndexSet) {\n      pageIndexSet = new Set();\n      this._refCache.put(ref, pageIndexSet);\n    }\n    pageIndexSet.add(pageIndex);\n\n    if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {\n      return false;\n    }\n    if (!this._imageCache.has(ref) && this.#cacheLimitReached) {\n      return false;\n    }\n    return true;\n  }\n\n  addDecodeFailed(ref) {\n    this.#decodeFailedSet.put(ref);\n  }\n\n  hasDecodeFailed(ref) {\n    return this.#decodeFailedSet.has(ref);\n  }\n\n  /**\n   * PLEASE NOTE: Must be called *after* the `setData` method.\n   */\n  addByteSize(ref, byteSize) {\n    const imageData = this._imageCache.get(ref);\n    if (!imageData) {\n      return; // The image data isn't cached (the limit was reached).\n    }\n    if (imageData.byteSize) {\n      return; // The byte-size has already been set.\n    }\n    imageData.byteSize = byteSize;\n  }\n\n  getData(ref, pageIndex) {\n    const pageIndexSet = this._refCache.get(ref);\n    if (!pageIndexSet) {\n      return null;\n    }\n    if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {\n      return null;\n    }\n    const imageData = this._imageCache.get(ref);\n    if (!imageData) {\n      return null;\n    }\n    // Ensure that we keep track of all pages containing the image reference.\n    pageIndexSet.add(pageIndex);\n\n    return imageData;\n  }\n\n  setData(ref, data) {\n    if (!this._refCache.has(ref)) {\n      throw new Error(\n        'GlobalImageCache.setData - expected \"shouldCache\" to have been called.'\n      );\n    }\n    if (this._imageCache.has(ref)) {\n      return;\n    }\n    if (this.#cacheLimitReached) {\n      warn(\"GlobalImageCache.setData - cache limit reached.\");\n      return;\n    }\n    this._imageCache.put(ref, data);\n  }\n\n  clear(onlyData = false) {\n    if (!onlyData) {\n      this.#decodeFailedSet.clear();\n      this._refCache.clear();\n    }\n    this._imageCache.clear();\n  }\n}\n\nexport {\n  GlobalColorSpaceCache,\n  GlobalImageCache,\n  LocalColorSpaceCache,\n  LocalFunctionCache,\n  LocalGStateCache,\n  LocalImageCache,\n  LocalTilingPatternCache,\n  RegionalImageCache,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Dict, Ref } from \"./primitives.js\";\nimport { FormatError, info, shadow, warn } from \"../shared/util.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { buildPostScriptJsFunction } from \"./postscript/js_evaluator.js\";\nimport { buildPostScriptWasmFunction } from \"./postscript/wasm_compiler.js\";\nimport { isNumberArray } from \"./core_utils.js\";\nimport { LocalFunctionCache } from \"./image_utils.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\nconst FunctionType = {\n  SAMPLED: 0,\n  EXPONENTIAL_INTERPOLATION: 2,\n  STITCHING: 3,\n  POSTSCRIPT_CALCULATOR: 4,\n};\n\nclass PDFFunctionFactory {\n  static #useWasm = true;\n\n  static setOptions({ useWasm }) {\n    this.#useWasm = useWasm;\n  }\n\n  constructor({ xref }) {\n    this.xref = xref;\n  }\n\n  get useWasm() {\n    return PDFFunctionFactory.#useWasm;\n  }\n\n  create(fn, parseArray = false) {\n    let fnRef, parsedFn;\n\n    // Check if the Function is cached first, to avoid re-parsing it.\n    if (fn instanceof Ref) {\n      fnRef = fn;\n    } else if (fn instanceof Dict) {\n      fnRef = fn.objId;\n    } else if (fn instanceof BaseStream) {\n      fnRef = fn.dict?.objId;\n    }\n    if (fnRef) {\n      const cachedFn = this._localFunctionCache.getByRef(fnRef);\n      if (cachedFn) {\n        return cachedFn;\n      }\n    }\n\n    const fnObj = this.xref.fetchIfRef(fn);\n    if (Array.isArray(fnObj)) {\n      if (!parseArray) {\n        throw new Error(\n          'PDFFunctionFactory.create - expected \"parseArray\" argument.'\n        );\n      }\n      parsedFn = PDFFunction.parseArray(this, fnObj);\n    } else {\n      parsedFn = PDFFunction.parse(this, fnObj);\n    }\n\n    // Attempt to cache the parsed Function, by reference.\n    if (fnRef) {\n      this._localFunctionCache.set(/* name = */ null, fnRef, parsedFn);\n    }\n    return parsedFn;\n  }\n\n  /**\n   * @private\n   */\n  get _localFunctionCache() {\n    return shadow(this, \"_localFunctionCache\", new LocalFunctionCache());\n  }\n}\n\nfunction toNumberArray(arr) {\n  if (!Array.isArray(arr)) {\n    return null;\n  }\n  if (!isNumberArray(arr, null)) {\n    // Non-number is found -- convert all items to numbers.\n    return arr.map(x => +x);\n  }\n  return arr;\n}\n\nclass PDFFunction {\n  static getSampleArray(size, outputSize, bps, stream) {\n    let length = outputSize;\n    for (const s of size) {\n      length *= s;\n    }\n\n    const array = new Array(length);\n    let codeSize = 0;\n    let codeBuf = 0;\n    // 32 is a valid bps so shifting won't work\n    const sampleMul = 1.0 / (2.0 ** bps - 1);\n\n    const strBytes = stream.getBytes((length * bps + 7) / 8);\n    let strIdx = 0;\n    for (let i = 0; i < length; i++) {\n      while (codeSize < bps) {\n        codeBuf <<= 8;\n        codeBuf |= strBytes[strIdx++];\n        codeSize += 8;\n      }\n      codeSize -= bps;\n      array[i] = (codeBuf >> codeSize) * sampleMul;\n      codeBuf &= (1 << codeSize) - 1;\n    }\n    return array;\n  }\n\n  static parse(factory, fn) {\n    const dict = fn.dict || fn;\n    const typeNum = dict.get(\"FunctionType\");\n\n    switch (typeNum) {\n      case FunctionType.SAMPLED:\n        return this.constructSampled(factory, fn, dict);\n      case FunctionType.EXPONENTIAL_INTERPOLATION:\n        return this.constructInterpolated(factory, dict);\n      case FunctionType.STITCHING:\n        return this.constructStiched(factory, dict);\n      case FunctionType.POSTSCRIPT_CALCULATOR:\n        return this.constructPostScript(factory, fn, dict);\n    }\n    throw new FormatError(`Unknown function type: ${typeNum}`);\n  }\n\n  static parseArray(factory, fnObj) {\n    const { xref } = factory;\n\n    const fnArray = [];\n    for (const fn of fnObj) {\n      fnArray.push(this.parse(factory, xref.fetchIfRef(fn)));\n    }\n    return function (src, srcOffset, dest, destOffset) {\n      for (let i = 0, ii = fnArray.length; i < ii; i++) {\n        fnArray[i](src, srcOffset, dest, destOffset + i);\n      }\n    };\n  }\n\n  static constructSampled(factory, fn, dict) {\n    // See chapter 3, page 109 of the PDF reference\n    function interpolate(x, xmin, xmax, ymin, ymax) {\n      return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));\n    }\n\n    const domain = toNumberArray(dict.getArray(\"Domain\"));\n    const range = toNumberArray(dict.getArray(\"Range\"));\n\n    if (!domain || !range) {\n      throw new FormatError(\"No domain or range\");\n    }\n\n    const inputSize = domain.length / 2;\n    const outputSize = range.length / 2;\n\n    const size = toNumberArray(dict.getArray(\"Size\"));\n    const bps = dict.get(\"BitsPerSample\");\n    const order = dict.get(\"Order\") || 1;\n    if (order !== 1) {\n      // No description how cubic spline interpolation works in PDF32000:2008\n      // As in poppler, ignoring order, linear interpolation may work as good\n      info(\"No support for cubic spline interpolation: \" + order);\n    }\n\n    let encode = toNumberArray(dict.getArray(\"Encode\"));\n    if (!encode) {\n      encode = [];\n      for (let i = 0; i < inputSize; ++i) {\n        encode.push(0, size[i] - 1);\n      }\n    }\n\n    const decode = toNumberArray(dict.getArray(\"Decode\")) || range;\n\n    const samples = this.getSampleArray(size, outputSize, bps, fn);\n    // const mask = 2 ** bps - 1;\n\n    return function constructSampledFn(src, srcOffset, dest, destOffset) {\n      // See chapter 3, page 110 of the PDF reference.\n\n      // Building the cube vertices: its part and sample index\n      // http://rjwagner49.com/Mathematics/Interpolation.pdf\n      const cubeVertices = 1 << inputSize;\n      const cubeN = new Float64Array(cubeVertices).fill(1);\n      const cubeVertex = new Uint32Array(cubeVertices);\n      let i, j;\n\n      let k = outputSize,\n        pos = 1;\n      // Map x_i to y_j for 0 <= i < m using the sampled function.\n      for (i = 0; i < inputSize; ++i) {\n        // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)\n        const domain_2i = domain[2 * i];\n        const domain_2i_1 = domain[2 * i + 1];\n        const xi = MathClamp(src[srcOffset + i], domain_2i, domain_2i_1);\n\n        // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,\n        //                   Encode_2i, Encode_2i+1)\n        let e = interpolate(\n          xi,\n          domain_2i,\n          domain_2i_1,\n          encode[2 * i],\n          encode[2 * i + 1]\n        );\n\n        // e_i' = min(max(e_i, 0), Size_i - 1)\n        const size_i = size[i];\n        e = MathClamp(e, 0, size_i - 1);\n\n        // Adjusting the cube: N and vertex sample index\n        const e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;\n        const n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);\n        const n1 = e - e0; // (e - e0) / (e1 - e0);\n        const offset0 = e0 * k;\n        const offset1 = offset0 + k; // e1 * k\n        for (j = 0; j < cubeVertices; j++) {\n          if (j & pos) {\n            cubeN[j] *= n1;\n            cubeVertex[j] += offset1;\n          } else {\n            cubeN[j] *= n0;\n            cubeVertex[j] += offset0;\n          }\n        }\n\n        k *= size_i;\n        pos <<= 1;\n      }\n\n      for (j = 0; j < outputSize; ++j) {\n        // Sum all cube vertices' samples portions\n        let rj = 0;\n        for (i = 0; i < cubeVertices; i++) {\n          rj += samples[cubeVertex[i] + j] * cubeN[i];\n        }\n\n        // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,\n        //                    Decode_2j, Decode_2j+1)\n        rj = interpolate(rj, 0, 1, decode[2 * j], decode[2 * j + 1]);\n\n        // y_j = min(max(r_j, range_2j), range_2j+1)\n        dest[destOffset + j] = MathClamp(rj, range[2 * j], range[2 * j + 1]);\n      }\n    };\n  }\n\n  static constructInterpolated(factory, dict) {\n    const c0 = toNumberArray(dict.getArray(\"C0\")) || [0];\n    const c1 = toNumberArray(dict.getArray(\"C1\")) || [1];\n    const n = dict.get(\"N\");\n\n    const diff = [];\n    for (let i = 0, ii = c0.length; i < ii; ++i) {\n      diff.push(c1[i] - c0[i]);\n    }\n    const length = diff.length;\n\n    return function constructInterpolatedFn(src, srcOffset, dest, destOffset) {\n      const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n;\n\n      for (let j = 0; j < length; ++j) {\n        dest[destOffset + j] = c0[j] + x * diff[j];\n      }\n    };\n  }\n\n  static constructStiched(factory, dict) {\n    const domain = toNumberArray(dict.getArray(\"Domain\"));\n\n    if (!domain) {\n      throw new FormatError(\"No domain\");\n    }\n\n    const inputSize = domain.length / 2;\n    if (inputSize !== 1) {\n      throw new FormatError(\"Bad domain for stiched function\");\n    }\n    const { xref } = factory;\n\n    const fns = [];\n    for (const fn of dict.get(\"Functions\")) {\n      fns.push(this.parse(factory, xref.fetchIfRef(fn)));\n    }\n\n    const bounds = toNumberArray(dict.getArray(\"Bounds\"));\n    const encode = toNumberArray(dict.getArray(\"Encode\"));\n    const tmpBuf = new Float32Array(1);\n\n    return function constructStichedFn(src, srcOffset, dest, destOffset) {\n      // Clamp to domain.\n      const v = MathClamp(src[srcOffset], domain[0], domain[1]);\n      // calculate which bound the value is in\n      const length = bounds.length;\n      let i;\n      for (i = 0; i < length; ++i) {\n        if (v < bounds[i]) {\n          break;\n        }\n      }\n\n      // encode value into domain of function\n      const dmin = i > 0 ? bounds[i - 1] : domain[0];\n      const dmax = i < length ? bounds[i] : domain[1];\n\n      const rmin = encode[2 * i];\n      const rmax = encode[2 * i + 1];\n\n      // Prevent the value from becoming NaN as a result\n      // of division by zero (fixes issue6113.pdf).\n      tmpBuf[0] =\n        dmin === dmax\n          ? rmin\n          : rmin + ((v - dmin) * (rmax - rmin)) / (dmax - dmin);\n\n      // call the appropriate function\n      fns[i](tmpBuf, 0, dest, destOffset);\n    };\n  }\n\n  static constructPostScript(factory, fn, dict) {\n    const domain = toNumberArray(dict.getArray(\"Domain\"));\n    const range = toNumberArray(dict.getArray(\"Range\"));\n\n    if (!domain) {\n      throw new FormatError(\"No domain.\");\n    }\n\n    if (!range) {\n      throw new FormatError(\"No range.\");\n    }\n\n    const psCode = fn.getString();\n\n    try {\n      if (factory.useWasm) {\n        const wasmFn = buildPostScriptWasmFunction(psCode, domain, range);\n        if (wasmFn) {\n          return wasmFn; // (src, srcOffset, dest, destOffset) 鈫� void\n        }\n      }\n    } catch {}\n\n    warn(\"Failed to compile PostScript function to wasm, falling back to JS\");\n\n    return buildPostScriptJsFunction(psCode, domain, range);\n  }\n}\n\nfunction isPDFFunction(v) {\n  let fnDict;\n  if (v instanceof Dict) {\n    fnDict = v;\n  } else if (v instanceof BaseStream) {\n    fnDict = v.dict;\n  } else {\n    return false;\n  }\n  return fnDict.has(\"FunctionType\");\n}\n\nexport { FunctionType, isPDFFunction, PDFFunctionFactory };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Dict, Name, Ref } from \"./primitives.js\";\nimport { FormatError, warn } from \"../shared/util.js\";\n\nfunction textSinkWrapper(sink) {\n  const TEXT_CONTENT_CHUNK_SIZE = 100; // Same as in `src/display/api.js`.\n  const resolved = sink ? null : Promise.resolve();\n\n  return {\n    enqueueInvoked: false,\n\n    enqueue(chunk, size) {\n      this.enqueueInvoked = true;\n      sink?.enqueue(chunk, size);\n    },\n\n    get desiredSize() {\n      return sink?.desiredSize ?? TEXT_CONTENT_CHUNK_SIZE;\n    },\n\n    get ready() {\n      return sink?.ready ?? resolved;\n    },\n  };\n}\n\nfunction _parseVisibilityExpression(\n  xref,\n  array,\n  nestingCounter,\n  currentResult\n) {\n  const MAX_NESTING = 10;\n  if (++nestingCounter > MAX_NESTING) {\n    warn(\"Visibility expression is too deeply nested\");\n    return;\n  }\n  const length = array.length;\n  const operator = xref.fetchIfRef(array[0]);\n  if (length < 2 || !(operator instanceof Name)) {\n    warn(\"Invalid visibility expression\");\n    return;\n  }\n  switch (operator.name) {\n    case \"And\":\n    case \"Or\":\n    case \"Not\":\n      currentResult.push(operator.name);\n      break;\n    default:\n      warn(`Invalid operator ${operator.name} in visibility expression`);\n      return;\n  }\n  for (let i = 1; i < length; i++) {\n    const raw = array[i];\n    const object = xref.fetchIfRef(raw);\n    if (Array.isArray(object)) {\n      const nestedResult = [];\n      currentResult.push(nestedResult);\n      // Recursively parse a subarray.\n      _parseVisibilityExpression(xref, object, nestingCounter, nestedResult);\n    } else if (raw instanceof Ref) {\n      // Reference to an OCG dictionary.\n      currentResult.push(raw.toString());\n    }\n  }\n}\n\nfunction parseMarkedContentProps(xref, contentProperties, resources) {\n  let optionalContent;\n  if (contentProperties instanceof Name) {\n    const properties = resources.get(\"Properties\");\n    optionalContent = properties.get(contentProperties.name);\n  } else if (contentProperties instanceof Dict) {\n    optionalContent = contentProperties;\n  } else {\n    throw new FormatError(\"Optional content properties malformed.\");\n  }\n\n  const optionalContentType = optionalContent.get(\"Type\")?.name;\n  if (optionalContentType === \"OCG\") {\n    return {\n      type: optionalContentType,\n      id: optionalContent.objId,\n    };\n  } else if (optionalContentType === \"OCMD\") {\n    const expression = optionalContent.get(\"VE\");\n    if (Array.isArray(expression)) {\n      const result = [];\n      _parseVisibilityExpression(xref, expression, 0, result);\n      if (result.length > 0) {\n        return {\n          type: \"OCMD\",\n          expression: result,\n        };\n      }\n    }\n\n    const optionalContentGroups = optionalContent.get(\"OCGs\");\n    if (\n      Array.isArray(optionalContentGroups) ||\n      optionalContentGroups instanceof Dict\n    ) {\n      const groupIds = [];\n      if (Array.isArray(optionalContentGroups)) {\n        for (const ocg of optionalContentGroups) {\n          groupIds.push(ocg.toString());\n        }\n      } else {\n        // Dictionary, just use the obj id.\n        groupIds.push(optionalContentGroups.objId);\n      }\n      const p = optionalContent.get(\"P\");\n\n      return {\n        type: optionalContentType,\n        ids: groupIds,\n        policy: p instanceof Name ? p.name : null,\n        expression: null,\n      };\n    } else if (optionalContentGroups instanceof Ref) {\n      return {\n        type: optionalContentType,\n        id: optionalContentGroups.toString(),\n      };\n    }\n  }\n  return null;\n}\n\nexport { parseMarkedContentProps, textSinkWrapper };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { warn } from \"../shared/util.js\";\n\n// Implements a subset of the Unicode Bidirectional Algorithm (UBA).\n// Specification: https://www.unicode.org/reports/tr9/tr9-48.html\n\n// Character types for symbols from 0000 to 00FF.\n// Source: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt\n// prettier-ignore\nconst baseTypes = [\n  \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"S\", \"B\", \"S\",\n  \"WS\", \"B\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\",\n  \"BN\", \"BN\", \"BN\", \"BN\", \"B\", \"B\", \"B\", \"S\", \"WS\", \"ON\", \"ON\", \"ET\",\n  \"ET\", \"ET\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"ES\", \"CS\", \"ES\", \"CS\", \"CS\",\n  \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"CS\", \"ON\",\n  \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\",\n  \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\",\n  \"L\", \"L\", \"L\", \"L\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"L\", \"L\", \"L\",\n  \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\",\n  \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"ON\", \"ON\", \"ON\", \"ON\",\n  \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"B\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\",\n  \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\",\n  \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"BN\", \"CS\", \"ON\", \"ET\",\n  \"ET\", \"ET\", \"ET\", \"ON\", \"ON\", \"ON\", \"ON\", \"L\", \"ON\", \"ON\", \"BN\", \"ON\",\n  \"ON\", \"ET\", \"ET\", \"EN\", \"EN\", \"ON\", \"L\", \"ON\", \"ON\", \"ON\", \"EN\", \"L\",\n  \"ON\", \"ON\", \"ON\", \"ON\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\",\n  \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\",\n  \"L\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\",\n  \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\",\n  \"L\", \"L\", \"L\", \"L\", \"L\", \"ON\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\", \"L\"\n];\n\n// Character types for symbols from 0600 to 06FF.\n// Source: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt\n// Note that 061D does not exist in the Unicode standard (see\n// http://unicode.org/charts/PDF/U0600.pdf), so we replace it with an\n// empty string and issue a warning if we encounter this character. The\n// empty string is required to properly index the items after it.\n// prettier-ignore\nconst arabicTypes = [\n  \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"ON\", \"ON\", \"AL\", \"ET\", \"ET\", \"AL\",\n  \"CS\", \"AL\", \"ON\", \"ON\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\",\n  \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AL\", \"AL\", \"\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\",\n  \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\",\n  \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\", \"AN\",\n  \"AN\", \"AN\", \"AN\", \"ET\", \"AN\", \"AN\", \"AL\", \"AL\", \"AL\", \"NSM\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\",\n  \"AL\", \"AL\", \"AL\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AN\",\n  \"ON\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AL\", \"AL\", \"NSM\", \"NSM\",\n  \"ON\", \"NSM\", \"NSM\", \"NSM\", \"NSM\", \"AL\", \"AL\", \"EN\", \"EN\", \"EN\", \"EN\",\n  \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"EN\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\", \"AL\"\n];\n\nfunction isOdd(i) {\n  return (i & 1) !== 0;\n}\n\nfunction isEven(i) {\n  return (i & 1) === 0;\n}\n\nfunction findUnequal(arr, start, value) {\n  let j, jj;\n  for (j = start, jj = arr.length; j < jj; ++j) {\n    if (arr[j] !== value) {\n      return j;\n    }\n  }\n  return j;\n}\n\nfunction reverseValues(arr, start, end) {\n  for (let i = start, j = end - 1; i < j; ++i, --j) {\n    const temp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = temp;\n  }\n}\n\nfunction createBidiText(str, isLTR, vertical = false) {\n  let dir = \"ltr\";\n  if (vertical) {\n    dir = \"ttb\";\n  } else if (!isLTR) {\n    dir = \"rtl\";\n  }\n  return { str, dir };\n}\n\n// These are used in bidi(), which is called frequently. We re-use them on\n// each call to avoid unnecessary allocations.\nconst chars = [];\nconst types = [];\n\nfunction bidi(str, startLevel = -1, vertical = false) {\n  let isLTR = true;\n  const strLength = str.length;\n  if (strLength === 0 || vertical) {\n    return createBidiText(str, isLTR, vertical);\n  }\n\n  // Get types and fill arrays\n  chars.length = strLength;\n  types.length = strLength;\n  let numBidi = 0;\n\n  let i, ii;\n  for (i = 0; i < strLength; ++i) {\n    chars[i] = str.charAt(i);\n\n    const charCode = str.charCodeAt(i);\n    let charType = \"L\";\n    if (charCode <= 0x00ff) {\n      charType = baseTypes[charCode];\n    } else if (0x0590 <= charCode && charCode <= 0x05f4) {\n      charType = \"R\";\n    } else if (0x0600 <= charCode && charCode <= 0x06ff) {\n      charType = arabicTypes[charCode & 0xff];\n      if (!charType) {\n        warn(\"Bidi: invalid Unicode character \" + charCode.toString(16));\n      }\n    } else if (\n      (0x0700 <= charCode && charCode <= 0x08ac) ||\n      (0xfb50 <= charCode && charCode <= 0xfdff) ||\n      (0xfe70 <= charCode && charCode <= 0xfeff)\n    ) {\n      charType = \"AL\";\n    }\n    if (charType === \"R\" || charType === \"AL\" || charType === \"AN\") {\n      numBidi++;\n    }\n    types[i] = charType;\n  }\n\n  // Detect the bidi method\n  // - If there are no rtl characters then no bidi needed\n  // - If less than 30% chars are rtl then string is primarily ltr,\n  //   unless the string is very short.\n  // - If more than 30% chars are rtl then string is primarily rtl\n  if (numBidi === 0) {\n    isLTR = true;\n    return createBidiText(str, isLTR);\n  }\n\n  if (startLevel === -1) {\n    if (numBidi / strLength < 0.3 && strLength > 4) {\n      isLTR = true;\n      startLevel = 0;\n    } else {\n      isLTR = false;\n      startLevel = 1;\n    }\n  }\n\n  const levels = [];\n  for (i = 0; i < strLength; ++i) {\n    levels[i] = startLevel;\n  }\n\n  /*\n   X1-X10: skip most of this, since we are NOT doing the embeddings.\n   */\n  const e = isOdd(startLevel) ? \"R\" : \"L\";\n  const sor = e;\n  const eor = sor;\n\n  /*\n   W1. Examine each non-spacing mark (NSM) in the level run, and change the\n   type of the NSM to the type of the previous character. If the NSM is at the\n   start of the level run, it will get the type of sor.\n   */\n  let lastType = sor;\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === \"NSM\") {\n      types[i] = lastType;\n    } else {\n      lastType = types[i];\n    }\n  }\n\n  /*\n   W2. Search backwards from each instance of a European number until the\n   first strong type (R, L, AL, or sor) is found.  If an AL is found, change\n   the type of the European number to Arabic number.\n   */\n  lastType = sor;\n  let t;\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === \"EN\") {\n      types[i] = lastType === \"AL\" ? \"AN\" : \"EN\";\n    } else if (t === \"R\" || t === \"L\" || t === \"AL\") {\n      lastType = t;\n    }\n  }\n\n  /*\n   W3. Change all ALs to R.\n   */\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === \"AL\") {\n      types[i] = \"R\";\n    }\n  }\n\n  /*\n   W4. A single European separator between two European numbers changes to a\n   European number. A single common separator between two numbers of the same\n   type changes to that type:\n   */\n  for (i = 1; i < strLength - 1; ++i) {\n    if (types[i] === \"ES\" && types[i - 1] === \"EN\" && types[i + 1] === \"EN\") {\n      types[i] = \"EN\";\n    }\n    if (\n      types[i] === \"CS\" &&\n      (types[i - 1] === \"EN\" || types[i - 1] === \"AN\") &&\n      types[i + 1] === types[i - 1]\n    ) {\n      types[i] = types[i - 1];\n    }\n  }\n\n  /*\n   W5. A sequence of European terminators adjacent to European numbers changes\n   to all European numbers:\n   */\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === \"EN\") {\n      // do before\n      for (let j = i - 1; j >= 0; --j) {\n        if (types[j] !== \"ET\") {\n          break;\n        }\n        types[j] = \"EN\";\n      }\n      // do after\n      for (let j = i + 1; j < strLength; ++j) {\n        if (types[j] !== \"ET\") {\n          break;\n        }\n        types[j] = \"EN\";\n      }\n    }\n  }\n\n  /*\n   W6. Otherwise, separators and terminators change to Other Neutral:\n   */\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === \"WS\" || t === \"ES\" || t === \"ET\" || t === \"CS\") {\n      types[i] = \"ON\";\n    }\n  }\n\n  /*\n   W7. Search backwards from each instance of a European number until the\n   first strong type (R, L, or sor) is found. If an L is found,  then change\n   the type of the European number to L.\n   */\n  lastType = sor;\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === \"EN\") {\n      types[i] = lastType === \"L\" ? \"L\" : \"EN\";\n    } else if (t === \"R\" || t === \"L\") {\n      lastType = t;\n    }\n  }\n\n  /*\n   N1. A sequence of neutrals takes the direction of the surrounding strong\n   text if the text on both sides has the same direction. European and Arabic\n   numbers are treated as though they were R. Start-of-level-run (sor) and\n   end-of-level-run (eor) are used at level run boundaries.\n   See https://www.unicode.org/reports/tr9/tr9-48.html#N1\n   */\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === \"ON\") {\n      const end = findUnequal(types, i + 1, \"ON\");\n\n      // Scan left past non-strong types to find the nearest strong context\n      // (L, R, EN, or AN), falling back to sor at the level-run boundary.\n      let before = sor;\n      for (let j = i - 1; j >= 0; j--) {\n        const tt = types[j];\n        if (tt === \"L\") {\n          before = \"L\";\n          break;\n        }\n        if (tt === \"R\" || tt === \"EN\" || tt === \"AN\") {\n          before = \"R\";\n          break;\n        }\n      }\n\n      // Scan right past non-strong types to find the nearest strong context,\n      // falling back to eor at the level-run boundary.\n      let after = eor;\n      for (let j = end; j < strLength; j++) {\n        const tt = types[j];\n        if (tt === \"L\") {\n          after = \"L\";\n          break;\n        }\n        if (tt === \"R\" || tt === \"EN\" || tt === \"AN\") {\n          after = \"R\";\n          break;\n        }\n      }\n\n      if (before === after) {\n        types.fill(before, i, end);\n      }\n      i = end - 1; // reset to end (-1 so next iteration is ok)\n    }\n  }\n\n  /*\n   N2. Any remaining neutrals take the embedding direction.\n   */\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === \"ON\") {\n      types[i] = e;\n    }\n  }\n\n  /*\n   I1. For all characters with an even (left-to-right) embedding direction,\n   those of type R go up one level and those of type AN or EN go up two\n   levels.\n   I2. For all characters with an odd (right-to-left) embedding direction,\n   those of type L, EN or AN go up one level.\n   */\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (isEven(levels[i])) {\n      if (t === \"R\") {\n        levels[i] += 1;\n      } else if (t === \"AN\" || t === \"EN\") {\n        levels[i] += 2;\n      }\n    } else if (/* isOdd && */ t === \"L\" || t === \"AN\" || t === \"EN\") {\n      levels[i] += 1;\n    }\n  }\n\n  /*\n   L1. On each line, reset the embedding level of the following characters to\n   the paragraph embedding level:\n\n   segment separators,\n   paragraph separators,\n   any sequence of whitespace characters preceding a segment separator or\n   paragraph separator, and any sequence of white space characters at the end\n   of the line.\n   */\n\n  // don't bother as text is only single line\n\n  /*\n   L2. From the highest level found in the text to the lowest odd level on\n   each line, reverse any contiguous sequence of characters that are at that\n   level or higher.\n   */\n\n  // find highest level & lowest odd level\n  let highestLevel = -1;\n  let lowestOddLevel = 99;\n  let level;\n  for (i = 0, ii = levels.length; i < ii; ++i) {\n    level = levels[i];\n    if (highestLevel < level) {\n      highestLevel = level;\n    }\n    if (lowestOddLevel > level && isOdd(level)) {\n      lowestOddLevel = level;\n    }\n  }\n\n  // now reverse between those limits\n  for (level = highestLevel; level >= lowestOddLevel; --level) {\n    // find segments to reverse\n    let start = -1;\n    for (i = 0, ii = levels.length; i < ii; ++i) {\n      if (levels[i] < level) {\n        if (start >= 0) {\n          reverseValues(chars, start, i);\n          start = -1;\n        }\n      } else if (start < 0) {\n        start = i;\n      }\n    }\n    if (start >= 0) {\n      reverseValues(chars, start, levels.length);\n    }\n  }\n\n  /*\n   L3. Combining marks applied to a right-to-left base character will at this\n   point precede their base character. If the rendering engine expects them to\n   follow the base characters in the final display process, then the ordering\n   of the marks and the base character must be reversed.\n   */\n\n  // don't bother for now\n\n  /*\n   L4. A character that possesses the mirrored property as specified by\n   Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved\n   directionality of that character is R.\n   */\n\n  // don't mirror as characters are already mirrored in the pdf\n\n  // Finally, return string\n  for (i = 0, ii = chars.length; i < ii; ++i) {\n    const ch = chars[i];\n    if (ch === \"<\" || ch === \">\") {\n      chars[i] = \"\";\n    }\n  }\n  return createBidiText(chars.join(\"\"), isLTR);\n}\n\nexport { bidi };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { normalizeFontName } from \"./fonts_utils.js\";\nimport { validateFontName } from \"./core_utils.js\";\nimport { warn } from \"../shared/util.js\";\n\nconst NORMAL = {\n  style: \"normal\",\n  weight: \"normal\",\n};\nconst MEDIUM = {\n  style: \"normal\",\n  weight: \"500\",\n};\nconst BOLD = {\n  style: \"normal\",\n  weight: \"bold\",\n};\nconst ITALIC = {\n  style: \"italic\",\n  weight: \"normal\",\n};\nconst BOLDITALIC = {\n  style: \"italic\",\n  weight: \"bold\",\n};\n\nconst substitutionMap = new Map([\n  [\n    \"Times-Roman\",\n    {\n      local: [\n        \"Times New Roman\",\n        \"Times-Roman\",\n        \"Times\",\n        \"Liberation Serif\",\n        \"Nimbus Roman\",\n        \"Nimbus Roman L\",\n        \"Tinos\",\n        \"Thorndale\",\n        \"TeX Gyre Termes\",\n        \"FreeSerif\",\n        \"Linux Libertine O\",\n        \"Libertinus Serif\",\n        \"PT Astra Serif\",\n        \"DejaVu Serif\",\n        \"Bitstream Vera Serif\",\n        \"Ubuntu\",\n      ],\n      style: NORMAL,\n      ultimate: \"serif\",\n    },\n  ],\n  [\n    \"Times-Bold\",\n    {\n      alias: \"Times-Roman\",\n      style: BOLD,\n      ultimate: \"serif\",\n    },\n  ],\n  [\n    \"Times-Italic\",\n    {\n      alias: \"Times-Roman\",\n      style: ITALIC,\n      ultimate: \"serif\",\n    },\n  ],\n  [\n    \"Times-BoldItalic\",\n    {\n      alias: \"Times-Roman\",\n      style: BOLDITALIC,\n      ultimate: \"serif\",\n    },\n  ],\n  [\n    \"Helvetica\",\n    {\n      local: [\n        \"Helvetica\",\n        \"Helvetica Neue\",\n        \"Arial\",\n        \"Arial Nova\",\n        \"Liberation Sans\",\n        \"Arimo\",\n        \"Nimbus Sans\",\n        \"Nimbus Sans L\",\n        \"A030\",\n        \"TeX Gyre Heros\",\n        \"FreeSans\",\n        \"DejaVu Sans\",\n        \"Albany\",\n        \"Bitstream Vera Sans\",\n        \"Arial Unicode MS\",\n        \"Microsoft Sans Serif\",\n        \"Apple Symbols\",\n        \"Cantarell\",\n      ],\n      path: \"LiberationSans-Regular.ttf\",\n      style: NORMAL,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\n    \"Helvetica-Bold\",\n    {\n      alias: \"Helvetica\",\n      path: \"LiberationSans-Bold.ttf\",\n      style: BOLD,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\n    \"Helvetica-Oblique\",\n    {\n      alias: \"Helvetica\",\n      path: \"LiberationSans-Italic.ttf\",\n      style: ITALIC,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\n    \"Helvetica-BoldOblique\",\n    {\n      alias: \"Helvetica\",\n      path: \"LiberationSans-BoldItalic.ttf\",\n      style: BOLDITALIC,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\n    \"Courier\",\n    {\n      local: [\n        \"Courier\",\n        \"Courier New\",\n        \"Liberation Mono\",\n        \"Nimbus Mono\",\n        \"Nimbus Mono L\",\n        \"Cousine\",\n        \"Cumberland\",\n        \"TeX Gyre Cursor\",\n        \"FreeMono\",\n        \"Linux Libertine Mono O\",\n        \"Libertinus Mono\",\n      ],\n      style: NORMAL,\n      ultimate: \"monospace\",\n    },\n  ],\n  [\n    \"Courier-Bold\",\n    {\n      alias: \"Courier\",\n      style: BOLD,\n      ultimate: \"monospace\",\n    },\n  ],\n  [\n    \"Courier-Oblique\",\n    {\n      alias: \"Courier\",\n      style: ITALIC,\n      ultimate: \"monospace\",\n    },\n  ],\n  [\n    \"Courier-BoldOblique\",\n    {\n      alias: \"Courier\",\n      style: BOLDITALIC,\n      ultimate: \"monospace\",\n    },\n  ],\n  [\n    \"ArialBlack\",\n    {\n      local: [\"Arial Black\"],\n      style: {\n        style: \"normal\",\n        weight: \"900\",\n      },\n      fallback: \"Helvetica-Bold\",\n    },\n  ],\n  [\n    \"ArialBlack-Bold\",\n    {\n      alias: \"ArialBlack\",\n    },\n  ],\n  [\n    \"ArialBlack-Italic\",\n    {\n      alias: \"ArialBlack\",\n      style: {\n        style: \"italic\",\n        weight: \"900\",\n      },\n      fallback: \"Helvetica-BoldOblique\",\n    },\n  ],\n  [\n    \"ArialBlack-BoldItalic\",\n    {\n      alias: \"ArialBlack-Italic\",\n    },\n  ],\n  [\n    \"ArialNarrow\",\n    {\n      local: [\n        \"Arial Narrow\",\n        \"Liberation Sans Narrow\",\n        \"Helvetica Condensed\",\n        \"Nimbus Sans Narrow\",\n        \"TeX Gyre Heros Cn\",\n      ],\n      style: NORMAL,\n      fallback: \"Helvetica\",\n    },\n  ],\n  [\n    \"ArialNarrow-Bold\",\n    {\n      alias: \"ArialNarrow\",\n      style: BOLD,\n      fallback: \"Helvetica-Bold\",\n    },\n  ],\n  [\n    \"ArialNarrow-Italic\",\n    {\n      alias: \"ArialNarrow\",\n      style: ITALIC,\n      fallback: \"Helvetica-Oblique\",\n    },\n  ],\n  [\n    \"ArialNarrow-BoldItalic\",\n    {\n      alias: \"ArialNarrow\",\n      style: BOLDITALIC,\n      fallback: \"Helvetica-BoldOblique\",\n    },\n  ],\n  [\n    \"Calibri\",\n    {\n      local: [\"Calibri\", \"Carlito\"],\n      style: NORMAL,\n      fallback: \"Helvetica\",\n    },\n  ],\n  [\n    \"Calibri-Bold\",\n    {\n      alias: \"Calibri\",\n      style: BOLD,\n      fallback: \"Helvetica-Bold\",\n    },\n  ],\n  [\n    \"Calibri-Italic\",\n    {\n      alias: \"Calibri\",\n      style: ITALIC,\n      fallback: \"Helvetica-Oblique\",\n    },\n  ],\n  [\n    \"Calibri-BoldItalic\",\n    {\n      alias: \"Calibri\",\n      style: BOLDITALIC,\n      fallback: \"Helvetica-BoldOblique\",\n    },\n  ],\n  [\n    \"Wingdings\",\n    {\n      local: [\"Wingdings\", \"URW Dingbats\"],\n      style: NORMAL,\n    },\n  ],\n  [\n    \"Wingdings-Regular\",\n    {\n      alias: \"Wingdings\",\n    },\n  ],\n  [\n    \"Wingdings-Bold\",\n    {\n      alias: \"Wingdings\",\n    },\n  ],\n  [\n    \"\\xCB\\xCE\\xCC\\xE5\",\n    {\n      local: [\"SimSun\", \"SimSun Regular\", \"NSimSun\"],\n      style: NORMAL,\n      ultimate: \"serif\",\n    },\n  ],\n  [\n    \"\\xBA\\xDA\\xCC\\xE5\",\n    {\n      local: [\"SimHei\", \"SimHei Regular\"],\n      style: NORMAL,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\n    \"\\xBF\\xAC\\xCC\\xE5\",\n    {\n      local: [\"KaiTi\", \"SimKai\", \"SimKai Regular\"],\n      style: NORMAL,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\n    \"\\xB7\\xC2\\xCB\\xCE\",\n    {\n      local: [\"FangSong\", \"SimFang\", \"SimFang Regular\"],\n      style: NORMAL,\n      ultimate: \"serif\",\n    },\n  ],\n  [\n    \"\\xBF\\xAC\\xCC\\xE5_GB2312\",\n    {\n      alias: \"\\xBF\\xAC\\xCC\\xE5\",\n    },\n  ],\n  [\n    \"\\xB7\\xC2\\xCB\\xCE_GB2312\",\n    {\n      alias: \"\\xB7\\xC2\\xCB\\xCE\",\n    },\n  ],\n  [\n    \"\\xC1\\xA5\\xCA\\xE9\",\n    {\n      local: [\"SimLi\", \"SimLi Regular\"],\n      style: NORMAL,\n      ultimate: \"serif\",\n    },\n  ],\n  [\n    \"\\xD0\\xC2\\xCB\\xCE\",\n    {\n      alias: \"\\xCB\\xCE\\xCC\\xE5\",\n    },\n  ],\n  // Standard Acrobat CJK fonts. These BaseFont names appear in PDFs that\n  // don't embed a CJK font and rely on the reader having Acrobat's bundled\n  // CJK fonts installed.\n  // Adobe-Japan1 - Mincho (serif).\n  [\n    \"HeiseiMin-W3\",\n    {\n      local: [\n        \"Hiragino Mincho ProN\",\n        \"Hiragino Mincho Pro\",\n        \"Yu Mincho\",\n        \"YuMincho\",\n        \"Source Han Serif JP\",\n        \"Noto Serif JP\",\n        \"Noto Serif CJK JP\",\n        \"IPAexMincho\",\n        \"IPAMincho\",\n        \"Takao Mincho\",\n        \"MS Mincho\",\n        \"MS PMincho\",\n      ],\n      style: NORMAL,\n      ultimate: \"serif\",\n    },\n  ],\n  // Adobe-Japan1 - Gothic (sans-serif).\n  [\n    \"HeiseiKakuGo-W5\",\n    {\n      local: [\n        \"Hiragino Kaku Gothic ProN\",\n        \"Hiragino Kaku Gothic Pro\",\n        \"Hiragino Sans\",\n        \"Yu Gothic\",\n        \"YuGothic\",\n        \"Source Han Sans JP\",\n        \"Noto Sans JP\",\n        \"Noto Sans CJK JP\",\n        \"IPAexGothic\",\n        \"IPAGothic\",\n        \"Takao Gothic\",\n        \"Meiryo\",\n        \"MS Gothic\",\n        \"MS PGothic\",\n      ],\n      style: MEDIUM,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  // Common Adobe-Japan1 variants and Kozuka names.\n  [\"HeiseiMin-W3-Acro\", { alias: \"HeiseiMin-W3\" }],\n  [\"HeiseiKakuGo-W5-Acro\", { alias: \"HeiseiKakuGo-W5\" }],\n  [\"KozMinPro-Regular\", { alias: \"HeiseiMin-W3\" }],\n  [\"KozMinProVI-Regular\", { alias: \"HeiseiMin-W3\" }],\n  [\"KozMinPr6N-Regular\", { alias: \"HeiseiMin-W3\" }],\n  [\"KozGoPro-Regular\", { alias: \"HeiseiKakuGo-W5\" }],\n  [\"KozGoProVI-Regular\", { alias: \"HeiseiKakuGo-W5\" }],\n  [\"KozGoPr6N-Regular\", { alias: \"HeiseiKakuGo-W5\" }],\n\n  // Adobe-GB1 - Song (Simplified Chinese serif).\n  [\n    \"STSong-Light\",\n    {\n      local: [\n        \"STSong\",\n        \"Songti SC\",\n        \"Source Han Serif SC\",\n        \"Source Han Serif CN\",\n        \"Noto Serif SC\",\n        \"Noto Serif CJK SC\",\n        \"AR PL UMing CN\",\n        \"SimSun\",\n        \"NSimSun\",\n      ],\n      style: NORMAL,\n      ultimate: \"serif\",\n    },\n  ],\n  // Adobe-GB1 - Hei (Simplified Chinese sans-serif).\n  [\n    \"STHeiti-Regular\",\n    {\n      local: [\n        \"STHeiti\",\n        \"Heiti SC\",\n        \"PingFang SC\",\n        \"Source Han Sans SC\",\n        \"Source Han Sans CN\",\n        \"Noto Sans SC\",\n        \"Noto Sans CJK SC\",\n        \"Microsoft YaHei\",\n        \"SimHei\",\n        \"WenQuanYi Zen Hei\",\n      ],\n      style: NORMAL,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\"STSongStd-Light\", { alias: \"STSong-Light\" }],\n  [\"AdobeSongStd-Light\", { alias: \"STSong-Light\" }],\n  [\"AdobeHeitiStd-Regular\", { alias: \"STHeiti-Regular\" }],\n  // KaiTi (regular script) and FangSong (imitation Song) are different\n  // typographic styles; route to the existing GB2312-keyed entries above.\n  [\"AdobeKaitiStd-Regular\", { alias: \"\\xBF\\xAC\\xCC\\xE5\" }],\n  [\"AdobeFangsongStd-Regular\", { alias: \"\\xB7\\xC2\\xCB\\xCE\" }],\n\n  // Adobe-CNS1 - Sung (Traditional Chinese serif).\n  [\n    \"MSung-Light\",\n    {\n      local: [\n        \"Songti TC\",\n        \"LiSong Pro\",\n        \"Source Han Serif TC\",\n        \"Source Han Serif TW\",\n        \"Noto Serif TC\",\n        \"Noto Serif CJK TC\",\n        \"AR PL UMing TW\",\n        \"PMingLiU\",\n        \"MingLiU\",\n        \"MingLiU_HKSCS\",\n      ],\n      style: NORMAL,\n      ultimate: \"serif\",\n    },\n  ],\n  // Adobe-CNS1 - Hei (Traditional Chinese sans-serif).\n  [\n    \"MHei-Medium\",\n    {\n      local: [\n        \"Heiti TC\",\n        \"STHeiti\",\n        \"Source Han Sans TC\",\n        \"Source Han Sans TW\",\n        \"Noto Sans TC\",\n        \"Noto Sans CJK TC\",\n        \"PingFang TC\",\n        \"Microsoft JhengHei\",\n      ],\n      style: MEDIUM,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\"MSungStd-Light\", { alias: \"MSung-Light\" }],\n  [\"AdobeMingStd-Light\", { alias: \"MSung-Light\" }],\n\n  // Adobe-Korea1 - Myeongjo (Korean serif).\n  [\n    \"HYSMyeongJo-Medium\",\n    {\n      local: [\n        \"AppleMyungjo\",\n        \"Source Han Serif KR\",\n        \"Noto Serif KR\",\n        \"Noto Serif CJK KR\",\n        \"Nanum Myeongjo\",\n        \"Batang\",\n      ],\n      style: MEDIUM,\n      ultimate: \"serif\",\n    },\n  ],\n  // Adobe-Korea1 - Gothic (Korean sans-serif).\n  [\n    \"HYGoThic-Medium\",\n    {\n      local: [\n        \"Apple SD Gothic Neo\",\n        \"AppleGothic\",\n        \"Source Han Sans KR\",\n        \"Noto Sans KR\",\n        \"Noto Sans CJK KR\",\n        \"Nanum Gothic\",\n        \"Malgun Gothic\",\n        \"Dotum\",\n        \"Gulim\",\n      ],\n      style: MEDIUM,\n      ultimate: \"sans-serif\",\n    },\n  ],\n  [\"HYSMyeongJoStd-Medium\", { alias: \"HYSMyeongJo-Medium\" }],\n  [\"AdobeMyungjoStd-Medium\", { alias: \"HYSMyeongJo-Medium\" }],\n  // Bold variants reuse the same fallback list with a bold style override\n  // so the @font-face declaration requests a bold local() match.\n  [\"HYGoThic-Bold\", { alias: \"HYGoThic-Medium\", style: BOLD }],\n  [\"AdobeGothicStd-Bold\", { alias: \"HYGoThic-Medium\", style: BOLD }],\n]);\n\nconst fontAliases = new Map([[\"Arial-Black\", \"ArialBlack\"]]);\n\nfunction getStyleToAppend(style) {\n  switch (style) {\n    case BOLD:\n      return \"Bold\";\n    case ITALIC:\n      return \"Italic\";\n    case BOLDITALIC:\n      return \"Bold Italic\";\n    default:\n      if (style?.weight === \"bold\") {\n        return \"Bold\";\n      }\n      if (style?.style === \"italic\") {\n        return \"Italic\";\n      }\n  }\n  return \"\";\n}\n\nfunction getFamilyName(str) {\n  // See https://gitlab.freedesktop.org/fontconfig/fontconfig/-/blob/14d466b30a8ab4a9d789977ed94f2c30e7209267/src/fcname.c#L137.\n  const keywords = new Set([\n    \"thin\",\n    \"extralight\",\n    \"ultralight\",\n    \"demilight\",\n    \"semilight\",\n    \"light\",\n    \"book\",\n    \"regular\",\n    \"normal\",\n    \"medium\",\n    \"demibold\",\n    \"semibold\",\n    \"bold\",\n    \"extrabold\",\n    \"ultrabold\",\n    \"black\",\n    \"heavy\",\n    \"extrablack\",\n    \"ultrablack\",\n    \"roman\",\n    \"italic\",\n    \"oblique\",\n    \"ultracondensed\",\n    \"extracondensed\",\n    \"condensed\",\n    \"semicondensed\",\n    \"normal\",\n    \"semiexpanded\",\n    \"expanded\",\n    \"extraexpanded\",\n    \"ultraexpanded\",\n    \"bolditalic\",\n  ]);\n  return str\n    .split(/[- ,+]+/g)\n    .filter(tok => !keywords.has(tok.toLowerCase()))\n    .join(\" \");\n}\n\n/**\n * Generate font description.\n * @param {Object} param0, font substitution description.\n * @param {Array<String>} src, contains src values (local(...) or url(...)).\n * @param {String} localFontPath, path to local fonts.\n * @param {boolean} useFallback, whether to use fallback font.\n * @param {boolean} usePath, whether to use path to font.\n * @param {String} append, style (Bold, Italic, ...) to append to font name.\n * @return {Object} { style, ultimate }.\n */\nfunction generateFont(\n  { alias, local, path, fallback, style, ultimate },\n  src,\n  localFontPath,\n  useFallback = true,\n  usePath = true,\n  append = \"\"\n) {\n  const result = {\n    style: null,\n    ultimate: null,\n  };\n  if (local) {\n    const extra = append ? ` ${append}` : \"\";\n    for (const name of local) {\n      src.push(`local(${name}${extra})`);\n    }\n  }\n  if (alias) {\n    const substitution = substitutionMap.get(alias);\n    const aliasAppend = append || getStyleToAppend(style);\n    Object.assign(\n      result,\n      generateFont(\n        substitution,\n        src,\n        localFontPath,\n        /* useFallback = */ useFallback && !fallback,\n        /* usePath = */ usePath && !path,\n        aliasAppend\n      )\n    );\n  }\n  if (style) {\n    result.style = style;\n  }\n  if (ultimate) {\n    result.ultimate = ultimate;\n  }\n  if (useFallback && fallback) {\n    const fallbackInfo = substitutionMap.get(fallback);\n    const { ultimate: fallbackUltimate } = generateFont(\n      fallbackInfo,\n      src,\n      localFontPath,\n      useFallback,\n      /* usePath = */ usePath && !path,\n      append\n    );\n    result.ultimate ||= fallbackUltimate;\n  }\n  if (usePath && path && localFontPath) {\n    src.push(`url(${localFontPath}${path})`);\n  }\n\n  return result;\n}\n\n/**\n * Get a font substitution for a given font.\n * The general idea is to have enough information to create a CSS rule like\n * this:\n *   @font-face {\n *    font-family: 'Times';\n *    src: local('Times New Roman'), local('Subst1'), local('Subst2'),\n *         url(.../TimesNewRoman.ttf)\n *    font-weight: normal;\n *    font-style: normal;\n *   }\n * or use the FontFace API.\n *\n * @param {Map} systemFontCache The cache of local fonts.\n * @param {Object} idFactory The ids factory.\n * @param {String} localFontPath Path to the fonts directory.\n * @param {String} baseFontName The font name to be substituted.\n * @param {String|undefined} standardFontName The standard font name to use\n *   if the base font is not available.\n * @param {String} type The font type.\n * @returns an Object with the CSS, the loaded name, the src and the style.\n */\nfunction getFontSubstitution(\n  systemFontCache,\n  idFactory,\n  localFontPath,\n  baseFontName,\n  standardFontName,\n  type\n) {\n  if (baseFontName.startsWith(\"InvalidPDFjsFont_\")) {\n    return null;\n  }\n\n  if (\n    (type === \"TrueType\" || type === \"Type1\") &&\n    /^[A-Z]{6}\\+/.test(baseFontName)\n  ) {\n    // When the font is a subset, we need to remove the prefix (see 9.6.4).\n    baseFontName = baseFontName.slice(7);\n  }\n\n  // It's possible to have a font name with spaces, commas or dashes, hence we\n  // just replace them by a dash.\n  baseFontName = normalizeFontName(baseFontName);\n\n  const key = baseFontName;\n  let substitutionInfo = systemFontCache.get(key);\n  if (substitutionInfo) {\n    return substitutionInfo;\n  }\n\n  // First, check if we've a substitution for the base font.\n  let substitution = substitutionMap.get(baseFontName);\n  if (!substitution) {\n    // Check if we've an alias for the base font, Arial-Black is the same as\n    // ArialBlack\n    for (const [alias, subst] of fontAliases) {\n      if (baseFontName.startsWith(alias)) {\n        baseFontName = `${subst}${baseFontName.substring(alias.length)}`;\n        substitution = substitutionMap.get(baseFontName);\n        break;\n      }\n    }\n  }\n\n  let mustAddBaseFont = false;\n  if (!substitution) {\n    // If not, check if we've a substitution for the standard font.\n    substitution = substitutionMap.get(standardFontName);\n    mustAddBaseFont = true;\n  }\n\n  const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`;\n  if (!substitution) {\n    if (!validateFontName(baseFontName)) {\n      warn(`Cannot substitute the font because of its name: ${baseFontName}`);\n      systemFontCache.set(key, null);\n      // If the baseFontName is not valid we don't want to use it.\n      return null;\n    }\n    // Maybe we'll be lucky and the OS will have the font.\n    const bold = /bold/i.test(baseFontName);\n    const italic = /oblique|italic/i.test(baseFontName);\n    const style =\n      (bold && italic && BOLDITALIC) ||\n      (bold && BOLD) ||\n      (italic && ITALIC) ||\n      NORMAL;\n    substitutionInfo = {\n      css: `\"${getFamilyName(baseFontName)}\",${loadedName}`,\n      guessFallback: true,\n      loadedName,\n      baseFontName,\n      src: `local(${baseFontName})`,\n      style,\n    };\n    systemFontCache.set(key, substitutionInfo);\n    return substitutionInfo;\n  }\n\n  const src = [];\n  // Maybe the OS will have the exact font we want so just prepend it to the\n  // list.\n  if (mustAddBaseFont && validateFontName(baseFontName)) {\n    src.push(`local(${baseFontName})`);\n  }\n  const { style, ultimate } = generateFont(substitution, src, localFontPath);\n  const guessFallback = ultimate === null;\n  const fallback = guessFallback ? \"\" : `,${ultimate}`;\n\n  substitutionInfo = {\n    css: `\"${getFamilyName(baseFontName)}\",${loadedName}${fallback}`,\n    guessFallback,\n    loadedName,\n    baseFontName,\n    src: src.join(\",\"),\n    style,\n  };\n  systemFontCache.set(key, substitutionInfo);\n\n  return substitutionInfo;\n}\n\nexport { getFontSubstitution };\n","/* Copyright 2014 Opera Software ASA\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n *\n * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.\n * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.\n */\n\nconst SEED = 0xc3d2e1f0;\n// Workaround for missing math precision in JS.\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\n\nclass MurmurHash3_64 {\n  constructor(seed) {\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n\n  update(input) {\n    let data, length;\n    if (typeof input === \"string\") {\n      data = new Uint8Array(input.length * 2);\n      length = 0;\n      for (let i = 0, ii = input.length; i < ii; i++) {\n        const code = input.charCodeAt(i);\n        if (code <= 0xff) {\n          data[length++] = code;\n        } else {\n          data[length++] = code >>> 8;\n          data[length++] = code & 0xff;\n        }\n      }\n    } else if (ArrayBuffer.isView(input)) {\n      data = input.slice();\n      length = data.byteLength;\n    } else {\n      throw new Error(\"Invalid data format, must be a string or TypedArray.\");\n    }\n\n    const blockCounts = length >> 2;\n    const tailLength = length - blockCounts * 4;\n    // We don't care about endianness here.\n    const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n    let k1 = 0,\n      k2 = 0;\n    let h1 = this.h1,\n      h2 = this.h2;\n    const C1 = 0xcc9e2d51,\n      C2 = 0x1b873593;\n    const C1_LOW = C1 & MASK_LOW,\n      C2_LOW = C2 & MASK_LOW;\n\n    for (let i = 0; i < blockCounts; i++) {\n      if (i & 1) {\n        k1 = dataUint32[i];\n        k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n        k1 = (k1 << 15) | (k1 >>> 17);\n        k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n        h1 ^= k1;\n        h1 = (h1 << 13) | (h1 >>> 19);\n        h1 = h1 * 5 + 0xe6546b64;\n      } else {\n        k2 = dataUint32[i];\n        k2 = ((k2 * C1) & MASK_HIGH) | ((k2 * C1_LOW) & MASK_LOW);\n        k2 = (k2 << 15) | (k2 >>> 17);\n        k2 = ((k2 * C2) & MASK_HIGH) | ((k2 * C2_LOW) & MASK_LOW);\n        h2 ^= k2;\n        h2 = (h2 << 13) | (h2 >>> 19);\n        h2 = h2 * 5 + 0xe6546b64;\n      }\n    }\n\n    k1 = 0;\n\n    switch (tailLength) {\n      case 3:\n        k1 ^= data[blockCounts * 4 + 2] << 16;\n      /* falls through */\n      case 2:\n        k1 ^= data[blockCounts * 4 + 1] << 8;\n      /* falls through */\n      case 1:\n        k1 ^= data[blockCounts * 4];\n        /* falls through */\n\n        k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n        k1 = (k1 << 15) | (k1 >>> 17);\n        k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n        if (blockCounts & 1) {\n          h1 ^= k1;\n        } else {\n          h2 ^= k1;\n        }\n    }\n\n    this.h1 = h1;\n    this.h2 = h2;\n  }\n\n  hexdigest() {\n    let h1 = this.h1,\n      h2 = this.h2;\n\n    h1 ^= h2 >>> 1;\n    h1 = ((h1 * 0xed558ccd) & MASK_HIGH) | ((h1 * 0x8ccd) & MASK_LOW);\n    h2 =\n      ((h2 * 0xff51afd7) & MASK_HIGH) |\n      (((((h2 << 16) | (h1 >>> 16)) * 0xafd7ed55) & MASK_HIGH) >>> 16);\n    h1 ^= h2 >>> 1;\n    h1 = ((h1 * 0x1a85ec53) & MASK_HIGH) | ((h1 * 0xec53) & MASK_LOW);\n    h2 =\n      ((h2 * 0xc4ceb9fe) & MASK_HIGH) |\n      (((((h2 << 16) | (h1 >>> 16)) * 0xb9fe1a85) & MASK_HIGH) >>> 16);\n    h1 ^= h2 >>> 1;\n\n    return (\n      (h1 >>> 0).toString(16).padStart(8, \"0\") +\n      (h2 >>> 0).toString(16).padStart(8, \"0\")\n    );\n  }\n}\n\nexport { MurmurHash3_64 };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  FeatureTest,\n  FormatError,\n  ImageKind,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  convertBlackAndWhiteToRGBA,\n  convertToRGBA,\n} from \"../shared/image_utils.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { ColorSpace } from \"./colorspace.js\";\nimport { ColorSpaceUtils } from \"./colorspace_utils.js\";\nimport { DecodeStream } from \"./decode_stream.js\";\nimport { ImageResizer } from \"./image_resizer.js\";\nimport { JpegStream } from \"./jpeg_stream.js\";\nimport { JpxImage } from \"./jpx.js\";\nimport { MathClamp } from \"../shared/math_clamp.js\";\nimport { Name } from \"./primitives.js\";\n\n/**\n * Configuration for {@linkcode PDFImage.fillGrayBuffer}.\n *\n * @typedef FillGrayBufferOptions\n * @property {number} [destWidth]\n *   Destination width; defaults to the source image width (no resampling).\n * @property {number} [destHeight]\n *   Destination height; defaults to the source image height (no resampling).\n * @property {boolean} [invertOutput=false]\n *   Whether to invert the output values (as in `x = 255 - x`).\n * @property {number} [maxRows]\n *   Maximum number of destination rows to write.\n * @property {number} [offset=0]\n *   Where to start.\n * @property {number} [stride=1]\n *   Step size between consecutive elements.\n */\n\n/**\n * Configuration for {@linkcode FillMaskAlphaCallback} functions.\n *\n * @typedef FillMaskAlphaOptions\n * @property {number} maxRows\n *   Maximum number of image rows to write; defaults to the full image height.\n * @property {number} offset\n *   Where to start.\n * @property {number} stride\n *   Step size between consecutive elements.\n */\n\n/**\n * Fills the alpha values for the mask.\n *\n * @callback FillMaskAlphaCallback\n * @param {Uint8ClampedArray} buffer\n *   Buffer to write the alpha values to.\n * @param {FillMaskAlphaOptions} options\n *   Configuration for filling the alpha values.\n * @return {Promise<undefined> | undefined | void}\n *   Optional promise that resolves when the alpha values have been filled.\n */\n\nclass PDFImage {\n  constructor({\n    xref,\n    res,\n    image,\n    isInline = false,\n    smask = null,\n    mask = null,\n    isMask = false,\n    pdfFunctionFactory,\n    globalColorSpaceCache,\n    localColorSpaceCache,\n  }) {\n    this.image = image;\n    const dict = image.dict;\n\n    const filter = dict.get(\"F\", \"Filter\");\n    let filterName;\n    if (filter instanceof Name) {\n      filterName = filter.name;\n    } else if (Array.isArray(filter)) {\n      const filterZero = xref.fetchIfRef(filter[0]);\n      if (filterZero instanceof Name) {\n        filterName = filterZero.name;\n      }\n    }\n    switch (filterName) {\n      case \"JPXDecode\":\n        ({\n          width: image.width,\n          height: image.height,\n          componentsCount: image.numComps,\n          bitsPerComponent: image.bitsPerComponent,\n        } = JpxImage.parseImageProperties(image.stream));\n        image.stream.reset();\n        const reducePower = ImageResizer.getReducePowerForJPX(\n          image.width,\n          image.height,\n          image.numComps\n        );\n        this.jpxDecoderOptions = {\n          numComponents: 0,\n          isIndexedColormap: false,\n          smaskInData: dict.has(\"SMaskInData\"),\n          reducePower,\n        };\n        if (reducePower) {\n          const factor = 2 ** reducePower;\n          image.width = Math.ceil(image.width / factor);\n          image.height = Math.ceil(image.height / factor);\n        }\n        break;\n      case \"JBIG2Decode\":\n        image.bitsPerComponent = 1;\n        image.numComps = 1;\n        break;\n    }\n\n    let width = dict.get(\"W\", \"Width\");\n    let height = dict.get(\"H\", \"Height\");\n\n    if (\n      Number.isInteger(image.width) &&\n      image.width > 0 &&\n      Number.isInteger(image.height) &&\n      image.height > 0 &&\n      (image.width !== width || image.height !== height)\n    ) {\n      warn(\n        \"PDFImage - using the Width/Height of the image data, \" +\n          \"rather than the image dictionary.\"\n      );\n      width = image.width;\n      height = image.height;\n    } else {\n      const validWidth = typeof width === \"number\" && width > 0,\n        validHeight = typeof height === \"number\" && height > 0;\n\n      if (!validWidth || !validHeight) {\n        if (!image.fallbackDims) {\n          throw new FormatError(\n            `Invalid image width: ${width} or height: ${height}`\n          );\n        }\n        warn(\n          \"PDFImage - using the Width/Height of the parent image, for SMask/Mask data.\"\n        );\n        if (!validWidth) {\n          width = image.fallbackDims.width;\n        }\n        if (!validHeight) {\n          height = image.fallbackDims.height;\n        }\n      }\n    }\n    this.width = width;\n    this.height = height;\n\n    this.interpolate = dict.get(\"I\", \"Interpolate\");\n    this.imageMask = dict.get(\"IM\", \"ImageMask\") || false;\n    this.matte = dict.get(\"Matte\") || false;\n\n    let bitsPerComponent = image.bitsPerComponent;\n    if (!bitsPerComponent) {\n      bitsPerComponent = dict.get(\"BPC\", \"BitsPerComponent\");\n      if (!bitsPerComponent) {\n        if (this.imageMask) {\n          bitsPerComponent = 1;\n        } else {\n          throw new FormatError(\n            `Bits per component missing in image: ${this.imageMask}`\n          );\n        }\n      }\n    }\n    this.bpc = bitsPerComponent;\n\n    if (!this.imageMask) {\n      let colorSpace = dict.getRaw(\"CS\") || dict.getRaw(\"ColorSpace\");\n      const hasColorSpace = !!colorSpace;\n      if (!hasColorSpace) {\n        if (this.jpxDecoderOptions) {\n          colorSpace = Name.get(\"DeviceRGBA\");\n        } else {\n          switch (image.numComps) {\n            case 1:\n              colorSpace = Name.get(\"DeviceGray\");\n              break;\n            case 3:\n              colorSpace = Name.get(\"DeviceRGB\");\n              break;\n            case 4:\n              colorSpace = Name.get(\"DeviceCMYK\");\n              break;\n            default:\n              throw new Error(\n                `Images with ${image.numComps} color components not supported.`\n              );\n          }\n        }\n      } else if (this.jpxDecoderOptions?.smaskInData) {\n        // If the jpx image has a color space then it mustn't be used in order\n        // to be able to use the color space that comes from the pdf.\n        colorSpace = Name.get(\"DeviceRGBA\");\n      }\n\n      this.colorSpace = ColorSpaceUtils.parse({\n        cs: colorSpace,\n        xref,\n        resources: isInline ? res : null,\n        pdfFunctionFactory,\n        globalColorSpaceCache,\n        localColorSpaceCache,\n      });\n      this.numComps = this.colorSpace.numComps;\n\n      if (this.jpxDecoderOptions) {\n        this.jpxDecoderOptions.numComponents = hasColorSpace\n          ? this.numComps\n          : 0;\n        // If the jpx image has a color space then it mustn't be used in order\n        // to be able to use the color space that comes from the pdf.\n        this.jpxDecoderOptions.isIndexedColormap =\n          this.colorSpace.name === \"Indexed\";\n      }\n    } else {\n      this.numComps = 1;\n    }\n\n    this.decode = dict.getArray(\"D\", \"Decode\");\n    this.needsDecode = false;\n    if (\n      this.decode &&\n      ((this.colorSpace &&\n        !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent)) ||\n        (isMask &&\n          !ColorSpace.isDefaultDecode(this.decode, /* numComps = */ 1)))\n    ) {\n      this.needsDecode = true;\n      // Do some preprocessing to avoid more math.\n      const max = (1 << bitsPerComponent) - 1;\n      this.decodeCoefficients = [];\n      this.decodeAddends = [];\n      const isIndexed = this.colorSpace?.name === \"Indexed\";\n      for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) {\n        const dmin = this.decode[i];\n        const dmax = this.decode[i + 1];\n        this.decodeCoefficients[j] = isIndexed\n          ? (dmax - dmin) / max\n          : dmax - dmin;\n        this.decodeAddends[j] = isIndexed ? dmin : max * dmin;\n      }\n    }\n\n    if (smask) {\n      // Provide fallback width/height values for corrupt SMask images\n      // (see issue19611.pdf).\n      smask.fallbackDims ??= { width, height };\n\n      this.smask = new PDFImage({\n        xref,\n        res,\n        image: smask,\n        isInline,\n        pdfFunctionFactory,\n        globalColorSpaceCache,\n        localColorSpaceCache,\n      });\n    } else if (mask) {\n      if (mask instanceof BaseStream) {\n        const maskDict = mask.dict,\n          imageMask = maskDict.get(\"IM\", \"ImageMask\");\n        if (!imageMask) {\n          warn(\"Ignoring /Mask in image without /ImageMask.\");\n        } else {\n          // Provide fallback width/height values for corrupt Mask images\n          // (see issue19611.pdf).\n          mask.fallbackDims ??= { width, height };\n\n          this.mask = new PDFImage({\n            xref,\n            res,\n            image: mask,\n            isInline,\n            isMask: true,\n            pdfFunctionFactory,\n            globalColorSpaceCache,\n            localColorSpaceCache,\n          });\n        }\n      } else {\n        // Color key mask (just an array).\n        this.mask = mask;\n      }\n    }\n  }\n\n  /**\n   * Handles processing of image data and returns the Promise that is resolved\n   * with a PDFImage when the image is ready to be used.\n   */\n  static async buildImage({\n    xref,\n    res,\n    image,\n    isInline = false,\n    pdfFunctionFactory,\n    globalColorSpaceCache,\n    localColorSpaceCache,\n  }) {\n    const imageData = image;\n    let smaskData = null;\n    let maskData = null;\n\n    const smask = image.dict.get(\"SMask\");\n    const mask = image.dict.get(\"Mask\");\n\n    if (smask) {\n      if (smask instanceof BaseStream) {\n        smaskData = smask;\n      } else {\n        warn(\"Unsupported /SMask format.\");\n      }\n    } else if (mask) {\n      if (mask instanceof BaseStream || Array.isArray(mask)) {\n        maskData = mask;\n      } else {\n        warn(\"Unsupported /Mask format.\");\n      }\n    }\n\n    return new PDFImage({\n      xref,\n      res,\n      image: imageData,\n      isInline,\n      smask: smaskData,\n      mask: maskData,\n      pdfFunctionFactory,\n      globalColorSpaceCache,\n      localColorSpaceCache,\n    });\n  }\n\n  static async createMask({ image, isOffscreenCanvasSupported = false }) {\n    const { dict } = image;\n    const width = dict.get(\"W\", \"Width\");\n    const height = dict.get(\"H\", \"Height\");\n\n    const interpolate = dict.get(\"I\", \"Interpolate\");\n    const decode = dict.getArray(\"D\", \"Decode\");\n    const inverseDecode = decode?.[0] > 0;\n\n    const computedLength = ((width + 7) >> 3) * height;\n    const imgArray = await image.getImageData(computedLength);\n\n    const isSingleOpaquePixel =\n      width === 1 &&\n      height === 1 &&\n      inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128));\n\n    if (isSingleOpaquePixel) {\n      return { isSingleOpaquePixel };\n    }\n\n    if (isOffscreenCanvasSupported) {\n      if (ImageResizer.needsToBeResized(width, height)) {\n        const data = new Uint8ClampedArray(width * height * 4);\n        convertBlackAndWhiteToRGBA({\n          src: imgArray,\n          dest: data,\n          width,\n          height,\n          nonBlackColor: 0,\n          inverseDecode,\n        });\n        return ImageResizer.createImage({\n          kind: ImageKind.RGBA_32BPP,\n          data,\n          width,\n          height,\n          interpolate,\n        });\n      }\n\n      const canvas = new OffscreenCanvas(width, height);\n      const ctx = canvas.getContext(\"2d\");\n      const imgData = ctx.createImageData(width, height);\n      convertBlackAndWhiteToRGBA({\n        src: imgArray,\n        dest: imgData.data,\n        width,\n        height,\n        nonBlackColor: 0,\n        inverseDecode,\n      });\n\n      ctx.putImageData(imgData, 0, 0);\n      const bitmap = canvas.transferToImageBitmap();\n\n      return {\n        data: null,\n        width,\n        height,\n        interpolate,\n        bitmap,\n      };\n    }\n    // Fallback to get the data almost as they're and they'll be decoded\n    // just before being drawn.\n\n    // |imgArray| might not contain full data for every pixel of the mask, so\n    // we need to distinguish between |computedLength| and |actualLength|.\n    // In particular, if inverseDecode is true, then the array we return must\n    // have a length of |computedLength|.\n    const actualLength = imgArray.byteLength;\n    const haveFullData = computedLength === actualLength;\n    let data;\n\n    if (image instanceof DecodeStream && (!inverseDecode || haveFullData)) {\n      // imgArray came from a DecodeStream and its data is in an appropriate\n      // form, so we can just transfer it.\n      data = imgArray;\n    } else if (!inverseDecode) {\n      data = new Uint8Array(imgArray);\n    } else {\n      data = new Uint8Array(computedLength);\n      data.set(imgArray);\n      data.fill(0xff, actualLength);\n    }\n\n    // If necessary, invert the original mask data (but not any extra we might\n    // have added above). It's safe to modify the array -- whether it's the\n    // original or a copy, we're about to transfer it anyway, so nothing else\n    // in this thread can be relying on its contents.\n    if (inverseDecode) {\n      for (let i = 0; i < actualLength; i++) {\n        data[i] ^= 0xff;\n      }\n    }\n\n    return { data, width, height, interpolate };\n  }\n\n  get drawWidth() {\n    return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0);\n  }\n\n  get drawHeight() {\n    return Math.max(\n      this.height,\n      this.smask?.height || 0,\n      this.mask?.height || 0\n    );\n  }\n\n  decodeBuffer(buffer) {\n    const bpc = this.bpc;\n    const numComps = this.numComps;\n\n    const decodeAddends = this.decodeAddends;\n    const decodeCoefficients = this.decodeCoefficients;\n    const max = (1 << bpc) - 1;\n    let i, ii;\n\n    if (bpc === 1) {\n      // If the buffer needed decode that means it just needs to be inverted.\n      for (i = 0, ii = buffer.length; i < ii; i++) {\n        buffer[i] = +!buffer[i];\n      }\n      return;\n    }\n    let index = 0;\n    for (i = 0, ii = this.width * this.height; i < ii; i++) {\n      for (let j = 0; j < numComps; j++) {\n        // Decode and clamp. The formula is different from the spec because we\n        // don't decode to float range [0,1], we decode it in the [0,max] range.\n        buffer[index] = MathClamp(\n          decodeAddends[j] + buffer[index] * decodeCoefficients[j],\n          0,\n          max\n        );\n        index++;\n      }\n    }\n  }\n\n  getComponents(buffer) {\n    const bpc = this.bpc;\n\n    // This image doesn't require any extra work.\n    if (bpc === 8) {\n      return buffer;\n    }\n\n    const width = this.width;\n    const height = this.height;\n    const numComps = this.numComps;\n\n    const length = width * height * numComps;\n    let bufferPos = 0;\n    let output;\n    if (bpc <= 8) {\n      output = new Uint8Array(length);\n    } else if (bpc <= 16) {\n      output = new Uint16Array(length);\n    } else {\n      output = new Uint32Array(length);\n    }\n    const rowComps = width * numComps;\n\n    const max = (1 << bpc) - 1;\n    let i = 0,\n      ii,\n      buf;\n\n    if (bpc === 1) {\n      // Optimization for reading 1 bpc images.\n      let mask, loop1End, loop2End;\n      for (let j = 0; j < height; j++) {\n        loop1End = i + (rowComps & ~7);\n        loop2End = i + rowComps;\n\n        // unroll loop for all full bytes\n        while (i < loop1End) {\n          buf = buffer[bufferPos++];\n          output[i] = (buf >> 7) & 1;\n          output[i + 1] = (buf >> 6) & 1;\n          output[i + 2] = (buf >> 5) & 1;\n          output[i + 3] = (buf >> 4) & 1;\n          output[i + 4] = (buf >> 3) & 1;\n          output[i + 5] = (buf >> 2) & 1;\n          output[i + 6] = (buf >> 1) & 1;\n          output[i + 7] = buf & 1;\n          i += 8;\n        }\n\n        // handle remaining bits\n        if (i < loop2End) {\n          buf = buffer[bufferPos++];\n          mask = 128;\n          while (i < loop2End) {\n            output[i++] = +!!(buf & mask);\n            mask >>= 1;\n          }\n        }\n      }\n    } else {\n      // The general case that handles all other bpc values.\n      let bits = 0;\n      buf = 0;\n      for (i = 0, ii = length; i < ii; ++i) {\n        if (i % rowComps === 0) {\n          buf = 0;\n          bits = 0;\n        }\n\n        while (bits < bpc) {\n          buf = (buf << 8) | buffer[bufferPos++];\n          bits += 8;\n        }\n\n        const remainingBits = bits - bpc;\n        let value = buf >> remainingBits;\n        if (value < 0) {\n          value = 0;\n        } else if (value > max) {\n          value = max;\n        }\n        output[i] = value;\n        buf &= (1 << remainingBits) - 1;\n        bits = remainingBits;\n      }\n    }\n    return output;\n  }\n\n  async fillOpacity(rgbaBuf, width, height, actualHeight, image) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        rgbaBuf instanceof Uint8ClampedArray,\n        'PDFImage.fillOpacity: Unsupported \"rgbaBuf\" type.'\n      );\n    }\n    /** @type {FillMaskAlphaCallback} */\n    let apply;\n\n    if (this.smask) {\n      apply = (buffer, options) =>\n        this.smask.fillGrayBuffer(buffer, {\n          ...options,\n          destWidth: width,\n          destHeight: height,\n        });\n    } else if (this.mask) {\n      if (this.mask instanceof PDFImage) {\n        // Single mask.\n        apply = (buffer, options) =>\n          this.mask.fillGrayBuffer(buffer, {\n            ...options,\n            invertOutput: true,\n            destWidth: width,\n            destHeight: height,\n          });\n      } else if (Array.isArray(this.mask)) {\n        // Color key mask: if any of the components are outside the range\n        // then they should be painted.\n        apply = (buffer, { maxRows, offset, stride }) => {\n          for (let i = 0, ii = width * maxRows; i < ii; ++i) {\n            let opacity = 0;\n            const imageOffset = i * this.numComps;\n            for (let j = 0; j < this.numComps; ++j) {\n              const color = image[imageOffset + j];\n              const maskOffset = j * 2;\n              if (\n                color < this.mask[maskOffset] ||\n                color > this.mask[maskOffset + 1]\n              ) {\n                opacity = 255;\n                break;\n              }\n            }\n            buffer[i * stride + offset] = opacity;\n          }\n        };\n      } else {\n        throw new FormatError(\"Unknown mask format.\");\n      }\n    } else {\n      // No mask.\n      apply = (buffer, { maxRows, offset, stride }) => {\n        for (let i = 0, ii = width * maxRows; i < ii; ++i) {\n          buffer[i * stride + offset] = 255;\n        }\n      };\n    }\n\n    await apply(rgbaBuf, {\n      maxRows: actualHeight,\n      offset: 3,\n      stride: 4,\n    });\n  }\n\n  undoPreblend(buffer, width, height) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        buffer instanceof Uint8ClampedArray,\n        'PDFImage.undoPreblend: Unsupported \"buffer\" type.'\n      );\n    }\n    const matte = this.smask?.matte;\n    if (!matte) {\n      return;\n    }\n    const matteRgb = this.colorSpace.getRgb(matte, 0);\n    const matteR = matteRgb[0];\n    const matteG = matteRgb[1];\n    const matteB = matteRgb[2];\n    const length = width * height * 4;\n    for (let i = 0; i < length; i += 4) {\n      const alpha = buffer[i + 3];\n      if (alpha === 0) {\n        // according formula we have to get Infinity in all components\n        // making it white (typical paper color) should be okay\n        buffer[i] = 255;\n        buffer[i + 1] = 255;\n        buffer[i + 2] = 255;\n        continue;\n      }\n      const k = 255 / alpha;\n      buffer[i] = (buffer[i] - matteR) * k + matteR;\n      buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;\n      buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;\n    }\n  }\n\n  async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) {\n    const drawWidth = this.drawWidth;\n    const drawHeight = this.drawHeight;\n    const imgData = {\n      width: drawWidth,\n      height: drawHeight,\n      interpolate: this.interpolate,\n      kind: 0,\n      data: null,\n      // Other fields are filled in below.\n    };\n\n    const numComps = this.numComps;\n    const originalWidth = this.width;\n    const originalHeight = this.height;\n    const bpc = this.bpc;\n\n    // Rows start at byte boundary.\n    const rowBytes = (originalWidth * numComps * bpc + 7) >> 3;\n    const mustBeResized =\n      isOffscreenCanvasSupported &&\n      ImageResizer.needsToBeResized(drawWidth, drawHeight);\n\n    if (!this.smask && !this.mask && this.colorSpace.name === \"DeviceRGBA\") {\n      imgData.kind = ImageKind.RGBA_32BPP;\n      const imgArray = (imgData.data = await this.getImageBytes(\n        originalHeight * originalWidth * 4,\n        { internal: isOffscreenCanvasSupported && mustBeResized }\n      ));\n\n      if (isOffscreenCanvasSupported) {\n        if (!mustBeResized) {\n          return this.createBitmap(\n            ImageKind.RGBA_32BPP,\n            drawWidth,\n            drawHeight,\n            imgArray\n          );\n        }\n        return ImageResizer.createImage(imgData, false);\n      }\n\n      return imgData;\n    }\n\n    if (!forceRGBA) {\n      // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image\n      // without any complications, we pass a same-sized copy to the main\n      // thread rather than expanding by 32x to RGBA form. This saves *lots*\n      // of memory for many scanned documents. It's also much faster.\n      //\n      // Similarly, if it is a 24-bit-per pixel RGB image without any\n      // complications, we avoid expanding by 1.333x to RGBA form.\n      let kind;\n      if (this.colorSpace.name === \"DeviceGray\" && bpc === 1) {\n        kind = ImageKind.GRAYSCALE_1BPP;\n      } else if (\n        this.colorSpace.name === \"DeviceRGB\" &&\n        bpc === 8 &&\n        !this.needsDecode\n      ) {\n        kind = ImageKind.RGB_24BPP;\n      }\n      if (\n        kind &&\n        !this.smask &&\n        !this.mask &&\n        drawWidth === originalWidth &&\n        drawHeight === originalHeight\n      ) {\n        const image = await this.#getImage(originalWidth, originalHeight);\n        if (image) {\n          return image;\n        }\n        const data = await this.getImageBytes(originalHeight * rowBytes, {\n          internal: isOffscreenCanvasSupported && mustBeResized,\n        });\n        if (isOffscreenCanvasSupported) {\n          if (mustBeResized) {\n            return ImageResizer.createImage(\n              {\n                data,\n                kind,\n                width: drawWidth,\n                height: drawHeight,\n                interpolate: this.interpolate,\n              },\n              this.needsDecode\n            );\n          }\n          return this.createBitmap(kind, originalWidth, originalHeight, data);\n        }\n        imgData.kind = kind;\n        imgData.data = data;\n\n        if (this.needsDecode) {\n          // Invert the buffer (which must be grayscale if we reached here).\n          assert(\n            kind === ImageKind.GRAYSCALE_1BPP,\n            \"PDFImage.createImageData: The image must be grayscale.\"\n          );\n          const buffer = imgData.data;\n          for (let i = 0, ii = buffer.length; i < ii; i++) {\n            buffer[i] ^= 0xff;\n          }\n        }\n        return imgData;\n      }\n      if (\n        this.image instanceof JpegStream &&\n        !this.smask &&\n        !this.mask &&\n        !this.needsDecode\n      ) {\n        let imageLength = originalHeight * rowBytes;\n        if (isOffscreenCanvasSupported && !mustBeResized) {\n          let isHandled = false;\n          switch (this.colorSpace.name) {\n            case \"DeviceGray\":\n              // Avoid truncating the image, since `JpegImage.getData`\n              // will expand the image data when `forceRGB === true`.\n              imageLength *= 4;\n              isHandled = true;\n              break;\n            case \"DeviceRGB\":\n              imageLength = (imageLength / 3) * 4;\n              isHandled = true;\n              break;\n            case \"DeviceCMYK\":\n              isHandled = true;\n              break;\n          }\n\n          if (isHandled) {\n            const image = await this.#getImage(drawWidth, drawHeight);\n            if (image) {\n              return image;\n            }\n            const rgba = await this.getImageBytes(imageLength, {\n              drawWidth,\n              drawHeight,\n              forceRGBA: true,\n              internal: true,\n            });\n            return this.createBitmap(\n              ImageKind.RGBA_32BPP,\n              drawWidth,\n              drawHeight,\n              rgba\n            );\n          }\n        } else {\n          switch (this.colorSpace.name) {\n            case \"DeviceGray\":\n              imageLength *= 3;\n            /* falls through */\n            case \"DeviceRGB\":\n            case \"DeviceCMYK\":\n              imgData.kind = ImageKind.RGB_24BPP;\n              imgData.data = await this.getImageBytes(imageLength, {\n                drawWidth,\n                drawHeight,\n                forceRGB: true,\n                internal: mustBeResized,\n              });\n              if (mustBeResized) {\n                // The image is too big so we resize it.\n                return ImageResizer.createImage(imgData);\n              }\n              return imgData;\n          }\n        }\n      }\n    }\n\n    const imgArray = await this.getImageBytes(originalHeight * rowBytes, {\n      internal: true,\n    });\n    // imgArray can be incomplete (e.g. after CCITT fax encoding).\n    const actualHeight =\n      0 | (((imgArray.length / rowBytes) * drawHeight) / originalHeight);\n\n    const comps = this.getComponents(imgArray);\n\n    // If opacity data is present, use RGBA_32BPP form. Otherwise, use the\n    // more compact RGB_24BPP form if allowable.\n    let alpha01, maybeUndoPreblend;\n\n    let canvas, ctx, canvasImgData, data;\n    if (isOffscreenCanvasSupported && !mustBeResized) {\n      canvas = new OffscreenCanvas(drawWidth, drawHeight);\n      ctx = canvas.getContext(\"2d\");\n      canvasImgData = ctx.createImageData(drawWidth, drawHeight);\n      data = canvasImgData.data;\n    }\n\n    imgData.kind = ImageKind.RGBA_32BPP;\n\n    if (!forceRGBA && !this.smask && !this.mask) {\n      if (!isOffscreenCanvasSupported || mustBeResized) {\n        imgData.kind = ImageKind.RGB_24BPP;\n        data = new Uint8ClampedArray(drawWidth * drawHeight * 3);\n        alpha01 = 0;\n      } else {\n        const arr = new Uint32Array(data.buffer);\n        arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff);\n        alpha01 = 1;\n      }\n      maybeUndoPreblend = false;\n    } else {\n      if (!isOffscreenCanvasSupported || mustBeResized) {\n        data = new Uint8ClampedArray(drawWidth * drawHeight * 4);\n      }\n\n      alpha01 = 1;\n      maybeUndoPreblend = true;\n\n      // Color key masking (opacity) must be performed before decoding.\n      await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps);\n    }\n\n    if (this.needsDecode) {\n      this.decodeBuffer(comps);\n    }\n    this.colorSpace.fillRgb(\n      data,\n      originalWidth,\n      originalHeight,\n      drawWidth,\n      drawHeight,\n      actualHeight,\n      bpc,\n      comps,\n      alpha01\n    );\n    if (maybeUndoPreblend) {\n      this.undoPreblend(data, drawWidth, actualHeight);\n    }\n\n    if (isOffscreenCanvasSupported && !mustBeResized) {\n      ctx.putImageData(canvasImgData, 0, 0);\n      const bitmap = canvas.transferToImageBitmap();\n\n      return {\n        data: null,\n        width: drawWidth,\n        height: drawHeight,\n        bitmap,\n        interpolate: this.interpolate,\n      };\n    }\n\n    imgData.data = data;\n    if (mustBeResized) {\n      return ImageResizer.createImage(imgData);\n    }\n    return imgData;\n  }\n\n  /**\n   * Fills `buffer` with decoded grayscale values from the image.\n   *\n   * When `destWidth`/`destHeight` match the source image dimensions (or are\n   * omitted), pixels are sampled linearly with no extra allocation.\n   * When they differ, nearest-neighbour resampling is used, sampling decoded\n   * pixels directly from the `comps` array with no intermediate buffer.\n   *\n   * @param {Uint8ClampedArray} buffer\n   *   Buffer to fill with grayscale values.\n   * @param {FillGrayBufferOptions} [options]\n   *   Configuration (optional).\n   * @returns {Promise<undefined>}\n   *   Promise that resolves to `undefined`.\n   */\n  async fillGrayBuffer(\n    buffer,\n    {\n      destWidth,\n      destHeight,\n      invertOutput,\n      maxRows,\n      offset = 0,\n      stride = 1,\n    } = {}\n  ) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        buffer instanceof Uint8ClampedArray,\n        'PDFImage.fillGrayBuffer: Unsupported \"buffer\" type.'\n      );\n    }\n    const numComps = this.numComps;\n    if (numComps !== 1) {\n      throw new FormatError(\n        `Reading gray scale from a color image: ${numComps}`\n      );\n    }\n\n    const srcWidth = this.width;\n    const srcHeight = this.height;\n    const bpc = this.bpc;\n\n    // rows start at byte boundary\n    const rowBytes = (srcWidth * numComps * bpc + 7) >> 3;\n    const imgArray = await this.getImageBytes(srcHeight * rowBytes, {\n      internal: true,\n    });\n    const comps = this.getComponents(imgArray);\n\n    const resolvedDestWidth = destWidth ?? srcWidth;\n    const resolvedDestHeight = destHeight ?? srcHeight;\n    const needsResampling =\n      resolvedDestWidth !== srcWidth || resolvedDestHeight !== srcHeight;\n    const rows =\n      maxRows === undefined\n        ? resolvedDestHeight\n        : Math.min(resolvedDestHeight, maxRows);\n\n    let outputWidth = srcWidth;\n    let yRatio = 0;\n    let xScaled = null;\n    if (needsResampling) {\n      outputWidth = resolvedDestWidth;\n      yRatio = srcHeight / resolvedDestHeight;\n      const xRatio = srcWidth / resolvedDestWidth;\n      xScaled = new Uint32Array(resolvedDestWidth);\n      for (let i = 0; i < resolvedDestWidth; i++) {\n        xScaled[i] = Math.floor(i * xRatio);\n      }\n    }\n\n    const mask = invertOutput ? 0xff : 0;\n\n    if (bpc === 1) {\n      // inline decoding (= inversion) for 1 bpc images\n      if (xScaled) {\n        const xMap = xScaled;\n        let destIndex = offset;\n        if (this.needsDecode) {\n          for (let row = 0; row < rows; row++) {\n            const py = Math.floor(row * yRatio) * srcWidth;\n            for (let col = 0; col < outputWidth; col++) {\n              buffer[destIndex] = ((comps[py + xMap[col]] - 1) & 255) ^ mask;\n              destIndex += stride;\n            }\n          }\n        } else {\n          for (let row = 0; row < rows; row++) {\n            const py = Math.floor(row * yRatio) * srcWidth;\n            for (let col = 0; col < outputWidth; col++) {\n              buffer[destIndex] = (-comps[py + xMap[col]] & 255) ^ mask;\n              destIndex += stride;\n            }\n          }\n        }\n      } else {\n        const length = outputWidth * rows;\n        if (this.needsDecode) {\n          // invert and scale to {0, 255}\n          for (let i = 0; i < length; ++i) {\n            buffer[i * stride + offset] = ((comps[i] - 1) & 255) ^ mask;\n          }\n        } else {\n          // scale to {0, 255}\n          for (let i = 0; i < length; ++i) {\n            buffer[i * stride + offset] = (-comps[i] & 255) ^ mask;\n          }\n        }\n      }\n      return;\n    }\n\n    if (this.needsDecode) {\n      this.decodeBuffer(comps);\n    }\n    // we aren't using a colorspace so we need to scale the value\n    const scale = 255 / ((1 << bpc) - 1);\n    if (xScaled) {\n      const xMap = xScaled;\n      let destIndex = offset;\n      for (let row = 0; row < rows; row++) {\n        const py = Math.floor(row * yRatio) * srcWidth;\n        for (let col = 0; col < outputWidth; col++) {\n          buffer[destIndex] = (scale * comps[py + xMap[col]]) ^ mask;\n          destIndex += stride;\n        }\n      }\n    } else {\n      const length = outputWidth * rows;\n      for (let i = 0; i < length; ++i) {\n        buffer[i * stride + offset] = (scale * comps[i]) ^ mask;\n      }\n    }\n  }\n\n  createBitmap(kind, width, height, src) {\n    const canvas = new OffscreenCanvas(width, height);\n    const ctx = canvas.getContext(\"2d\");\n    let imgData;\n    if (kind === ImageKind.RGBA_32BPP) {\n      imgData = new ImageData(src, width, height);\n    } else {\n      imgData = ctx.createImageData(width, height);\n      convertToRGBA({\n        kind,\n        src,\n        dest: new Uint32Array(imgData.data.buffer),\n        width,\n        height,\n        inverseDecode: this.needsDecode,\n      });\n    }\n    ctx.putImageData(imgData, 0, 0);\n    const bitmap = canvas.transferToImageBitmap();\n\n    return {\n      data: null,\n      width,\n      height,\n      bitmap,\n      interpolate: this.interpolate,\n    };\n  }\n\n  async #getImage(width, height) {\n    const bitmap = await this.image.getTransferableImage();\n    if (!bitmap) {\n      return null;\n    }\n    return {\n      data: null,\n      width,\n      height,\n      bitmap,\n      interpolate: this.interpolate,\n    };\n  }\n\n  async getImageBytes(\n    length,\n    {\n      drawWidth,\n      drawHeight,\n      forceRGBA = false,\n      forceRGB = false,\n      internal = false,\n    }\n  ) {\n    this.image.reset();\n    this.image.drawWidth = drawWidth || this.width;\n    this.image.drawHeight = drawHeight || this.height;\n    this.image.forceRGBA = !!forceRGBA;\n    this.image.forceRGB = !!forceRGB;\n    const imageBytes = await this.image.getImageData(\n      length,\n      this.jpxDecoderOptions\n    );\n\n    if (internal || this.image instanceof DecodeStream) {\n      // Internal callers never transfer/return raw bytes out of the worker,\n      // and DecodeStream-backed bytes are self-contained for the decode.\n      return imageBytes;\n    }\n\n    // Stream-backed image data can be a subarray into shared stream storage,\n    // so returning it directly would risk detaching/mutating bytes that\n    // subsequent stream reads still need.\n    // Always return a fresh copy.\n    assert(\n      imageBytes instanceof Uint8Array,\n      'PDFImage.getImageBytes: Unsupported \"imageBytes\" type.'\n    );\n    return new Uint8Array(imageBytes);\n  }\n}\n\nexport { PDFImage };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException,\n  assert,\n  BBOX_INIT,\n  DrawOPS,\n  F32_BBOX_INIT,\n  FONT_IDENTITY_MATRIX,\n  FormatError,\n  info,\n  isArrayEqual,\n  normalizeUnicode,\n  OPS,\n  shadow,\n  TextRenderingMode,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport { CheckedOperatorList, OperatorList } from \"./operator_list.js\";\nimport { CMapFactory, IdentityCMap } from \"./cmap.js\";\nimport { Cmd, Dict, EOF, isName, Name, Ref, RefSet } from \"./primitives.js\";\nimport {\n  compileFontPathInfo,\n  compilePatternInfo,\n} from \"./obj_bin_transform_core.js\";\nimport {\n  compileType3Glyph,\n  FontFlags,\n  normalizeFontName,\n} from \"./fonts_utils.js\";\nimport { ErrorFont, Font } from \"./fonts.js\";\nimport {\n  fetchBinaryData,\n  IDENTITY_MATRIX,\n  isNumberArray,\n  lookupMatrix,\n  lookupNormalRect,\n} from \"./core_utils.js\";\nimport {\n  getEncoding,\n  MacRomanEncoding,\n  StandardEncoding,\n  SymbolSetEncoding,\n  WinAnsiEncoding,\n  ZapfDingbatsEncoding,\n} from \"./encodings.js\";\nimport {\n  getFontNameToFileMap,\n  getSerifFonts,\n  getStandardFontName,\n  getStdFontMap,\n  getSymbolsFonts,\n  isKnownFontName,\n} from \"./standard_fonts.js\";\nimport { getTilingPatternIR, Pattern } from \"./pattern.js\";\nimport { getXfaFontDict, getXfaFontName } from \"./xfa_fonts.js\";\nimport { IdentityToUnicodeMap, ToUnicodeMap } from \"./to_unicode_map.js\";\nimport { isPDFFunction, PDFFunctionFactory } from \"./function.js\";\nimport { Lexer, Parser } from \"./parser.js\";\nimport {\n  LocalColorSpaceCache,\n  LocalGStateCache,\n  LocalImageCache,\n  LocalTilingPatternCache,\n  RegionalImageCache,\n} from \"./image_utils.js\";\nimport { parseMarkedContentProps, textSinkWrapper } from \"./evaluator_utils.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { bidi } from \"./bidi.js\";\nimport { ColorSpace } from \"./colorspace.js\";\nimport { ColorSpaceUtils } from \"./colorspace_utils.js\";\nimport { getFontSubstitution } from \"./font_substitutions.js\";\nimport { getGlyphsUnicode } from \"./glyphlist.js\";\nimport { getMetrics } from \"./metrics.js\";\nimport { getUnicodeForGlyph } from \"./unicode.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\nimport { PDFImage } from \"./image.js\";\nimport { Stream } from \"./stream.js\";\nimport { stringToPDFString } from \"./string_utils.js\";\n\nconst DefaultPartialEvaluatorOptions = Object.freeze({\n  maxImageSize: -1,\n  disableFontFace: false,\n  ignoreErrors: false,\n  isOffscreenCanvasSupported: false,\n  isImageDecoderSupported: false,\n  canvasMaxAreaInBytes: -1,\n  fontExtraProperties: false,\n  useSystemFonts: true,\n  useWasm: true,\n  useWorkerFetch: true,\n  cMapUrl: null,\n  cMapPacked: true,\n  iccUrl: null,\n  standardFontDataUrl: null,\n  wasmUrl: null,\n  hasGPU: false,\n});\n\nconst PatternType = {\n  TILING: 1,\n  SHADING: 2,\n};\n\n// Optionally avoid sending individual, or very few, text chunks to reduce\n// `postMessage` overhead with ReadableStream (see issue 13962).\n//\n// PLEASE NOTE: This value should *not* be too large (it's used as a lower limit\n// in `enqueueChunk`), since that would cause streaming of textContent to become\n// essentially useless in practice by sending all (or most) chunks at once.\n// Also, a too large value would (indirectly) affect the main-thread `textLayer`\n// building negatively by forcing all textContent to be handled at once, which\n// could easily end up hurting *overall* performance (e.g. rendering as well).\nconst TEXT_CHUNK_BATCH_SIZE = 10;\n\nconst deferred = Promise.resolve();\n\n// Convert PDF blend mode names to HTML5 blend mode names.\nfunction normalizeBlendMode(value, parsingArray = false) {\n  if (Array.isArray(value)) {\n    // Use the first *supported* BM value in the Array (fixes issue11279.pdf).\n    for (const val of value) {\n      const maybeBM = normalizeBlendMode(val, /* parsingArray = */ true);\n      if (maybeBM) {\n        return maybeBM;\n      }\n    }\n    warn(`Unsupported blend mode Array: ${value}`);\n    return \"source-over\";\n  }\n\n  if (!(value instanceof Name)) {\n    if (parsingArray) {\n      return null;\n    }\n    return \"source-over\";\n  }\n  switch (value.name) {\n    case \"Normal\":\n    case \"Compatible\":\n      return \"source-over\";\n    case \"Multiply\":\n      return \"multiply\";\n    case \"Screen\":\n      return \"screen\";\n    case \"Overlay\":\n      return \"overlay\";\n    case \"Darken\":\n      return \"darken\";\n    case \"Lighten\":\n      return \"lighten\";\n    case \"ColorDodge\":\n      return \"color-dodge\";\n    case \"ColorBurn\":\n      return \"color-burn\";\n    case \"HardLight\":\n      return \"hard-light\";\n    case \"SoftLight\":\n      return \"soft-light\";\n    case \"Difference\":\n      return \"difference\";\n    case \"Exclusion\":\n      return \"exclusion\";\n    case \"Hue\":\n      return \"hue\";\n    case \"Saturation\":\n      return \"saturation\";\n    case \"Color\":\n      return \"color\";\n    case \"Luminosity\":\n      return \"luminosity\";\n  }\n  if (parsingArray) {\n    return null;\n  }\n  warn(`Unsupported blend mode: ${value.name}`);\n  return \"source-over\";\n}\n\nfunction addCachedImageOps(\n  opList,\n  { objId, fn, args, optionalContent, hasMask }\n) {\n  if (objId) {\n    opList.addDependency(objId);\n  }\n  opList.addImageOps(fn, args, optionalContent, hasMask);\n\n  if (fn === OPS.paintImageMaskXObject && args[0]?.count > 0) {\n    args[0].count++;\n  }\n}\n\n// Trying to minimize Date.now() usage and check every 100 time.\nclass TimeSlotManager {\n  static TIME_SLOT_DURATION_MS = 20;\n\n  static CHECK_TIME_EVERY = 100;\n\n  constructor() {\n    this.reset();\n  }\n\n  check() {\n    if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) {\n      return false;\n    }\n    this.checked = 0;\n    return this.endTime <= Date.now();\n  }\n\n  reset() {\n    this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS;\n    this.checked = 0;\n  }\n}\n\nclass PartialEvaluator {\n  constructor({\n    xref,\n    handler,\n    pageIndex,\n    idFactory,\n    fontCache,\n    builtInCMapCache,\n    standardFontDataCache,\n    globalColorSpaceCache,\n    globalImageCache,\n    systemFontCache,\n    options = null,\n  }) {\n    this.xref = xref;\n    this.handler = handler;\n    this.pageIndex = pageIndex;\n    this.idFactory = idFactory;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.standardFontDataCache = standardFontDataCache;\n    this.globalColorSpaceCache = globalColorSpaceCache;\n    this.globalImageCache = globalImageCache;\n    this.systemFontCache = systemFontCache;\n    this.options = options || DefaultPartialEvaluatorOptions;\n    this.type3FontRefs = null;\n\n    this._regionalImageCache = new RegionalImageCache();\n    this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this);\n  }\n\n  /**\n   * Since Functions are only cached (locally) by reference, we can share one\n   * `PDFFunctionFactory` instance within this `PartialEvaluator` instance.\n   */\n  get _pdfFunctionFactory() {\n    return shadow(\n      this,\n      \"_pdfFunctionFactory\",\n      new PDFFunctionFactory({ xref: this.xref })\n    );\n  }\n\n  get parsingType3Font() {\n    return !!this.type3FontRefs;\n  }\n\n  clone(newOptions = null) {\n    const newEvaluator = Object.create(this);\n    newEvaluator.options = Object.assign(\n      Object.create(null),\n      this.options,\n      newOptions\n    );\n    return newEvaluator;\n  }\n\n  hasBlendModes(resources, nonBlendModesSet) {\n    if (!(resources instanceof Dict)) {\n      return false;\n    }\n    if (resources.objId && nonBlendModesSet.has(resources.objId)) {\n      return false;\n    }\n\n    const processed = new RefSet(nonBlendModesSet);\n    if (resources.objId) {\n      processed.put(resources.objId);\n    }\n\n    const nodes = [resources],\n      xref = this.xref;\n    while (nodes.length) {\n      const node = nodes.shift();\n      // First check the current resources for blend modes.\n      const graphicStates = node.get(\"ExtGState\");\n      if (graphicStates instanceof Dict) {\n        for (let graphicState of graphicStates.getRawValues()) {\n          if (graphicState instanceof Ref) {\n            if (processed.has(graphicState)) {\n              continue; // The ExtGState has already been processed.\n            }\n            try {\n              graphicState = xref.fetch(graphicState);\n            } catch (ex) {\n              // Avoid parsing a corrupt ExtGState more than once.\n              processed.put(graphicState);\n\n              info(`hasBlendModes - ignoring ExtGState: \"${ex}\".`);\n              continue;\n            }\n          }\n          if (!(graphicState instanceof Dict)) {\n            continue;\n          }\n          if (graphicState.objId) {\n            processed.put(graphicState.objId);\n          }\n\n          const bm = graphicState.get(\"BM\");\n          if (bm instanceof Name) {\n            if (bm.name !== \"Normal\") {\n              return true;\n            }\n            continue;\n          }\n          if (bm !== undefined && Array.isArray(bm)) {\n            for (const element of bm) {\n              if (element instanceof Name && element.name !== \"Normal\") {\n                return true;\n              }\n            }\n          }\n        }\n      }\n      // Descend into the XObjects to look for more resources and blend modes.\n      const xObjects = node.get(\"XObject\");\n      if (!(xObjects instanceof Dict)) {\n        continue;\n      }\n      for (let xObject of xObjects.getRawValues()) {\n        if (xObject instanceof Ref) {\n          if (processed.has(xObject)) {\n            // The XObject has already been processed, and by avoiding a\n            // redundant `xref.fetch` we can *significantly* reduce the load\n            // time for badly generated PDF files (fixes issue6961.pdf).\n            continue;\n          }\n          try {\n            xObject = xref.fetch(xObject);\n          } catch (ex) {\n            // Avoid parsing a corrupt XObject more than once.\n            processed.put(xObject);\n\n            info(`hasBlendModes - ignoring XObject: \"${ex}\".`);\n            continue;\n          }\n        }\n        if (!(xObject instanceof BaseStream)) {\n          continue;\n        }\n        if (xObject.dict.objId) {\n          processed.put(xObject.dict.objId);\n        }\n        const xResources = xObject.dict.get(\"Resources\");\n        if (!(xResources instanceof Dict)) {\n          continue;\n        }\n        // Checking objId to detect an infinite loop.\n        if (xResources.objId && processed.has(xResources.objId)) {\n          continue;\n        }\n\n        nodes.push(xResources);\n        if (xResources.objId) {\n          processed.put(xResources.objId);\n        }\n      }\n    }\n\n    // When no blend modes exist, there's no need re-fetch/re-parse any of the\n    // processed `Ref`s again for subsequent pages. This helps reduce redundant\n    // `XRef.fetch` calls for some documents (e.g. issue6961.pdf).\n    for (const ref of processed) {\n      nonBlendModesSet.put(ref);\n    }\n    return false;\n  }\n\n  async fetchBuiltInCMap(name) {\n    const cachedData = this.builtInCMapCache.get(name);\n    if (cachedData) {\n      return cachedData;\n    }\n    let data;\n\n    if (this.options.useWorkerFetch) {\n      // Only compressed CMaps are (currently) supported here.\n      data = {\n        cMapData: await fetchBinaryData(`${this.options.cMapUrl}${name}.bcmap`),\n        isCompressed: true,\n      };\n    } else {\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n        throw new Error(\"Only worker-thread fetching supported.\");\n      }\n      // Get the data on the main-thread instead.\n      data = {\n        cMapData: await this.handler.sendWithPromise(\"FetchBinaryData\", {\n          kind: \"cMapUrl\",\n          filename: `${name}${this.options.cMapPacked ? \".bcmap\" : \"\"}`,\n        }),\n        isCompressed: this.options.cMapPacked,\n      };\n    }\n    // Cache the CMap data, to avoid fetching it repeatedly.\n    this.builtInCMapCache.set(name, data);\n\n    return data;\n  }\n\n  async fetchStandardFontData(name) {\n    const cachedData = this.standardFontDataCache.get(name);\n    if (cachedData) {\n      return new Stream(cachedData);\n    }\n\n    // The symbol fonts are not consistent across platforms, always load the\n    // standard font data for them.\n    if (\n      this.options.useSystemFonts &&\n      name !== \"Symbol\" &&\n      name !== \"ZapfDingbats\"\n    ) {\n      return null;\n    }\n\n    const standardFontNameToFileName = getFontNameToFileMap(),\n      filename = standardFontNameToFileName[name];\n    let data;\n\n    try {\n      if (this.options.useWorkerFetch) {\n        data = await fetchBinaryData(\n          `${this.options.standardFontDataUrl}${filename}`\n        );\n      } else {\n        if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n          throw new Error(\"Only worker-thread fetching supported.\");\n        }\n        // Get the data on the main-thread instead.\n        data = await this.handler.sendWithPromise(\"FetchBinaryData\", {\n          kind: \"standardFontDataUrl\",\n          filename,\n        });\n      }\n    } catch (ex) {\n      warn(ex);\n      return null;\n    }\n    // Cache the \"raw\" standard font data, to avoid fetching it repeatedly\n    // (see e.g. issue 11399).\n    this.standardFontDataCache.set(name, data);\n\n    return new Stream(data);\n  }\n\n  async buildFormXObject(\n    resources,\n    xobj,\n    smask,\n    operatorList,\n    task,\n    initialState,\n    localColorSpaceCache,\n    seenRefs\n  ) {\n    const { dict } = xobj;\n    const matrix = lookupMatrix(dict.getArray(\"Matrix\"), null);\n    const bbox = lookupNormalRect(dict.getArray(\"BBox\"), null);\n    let f32bbox = bbox && new Float32Array(bbox);\n    if (f32bbox?.some(x => !isFinite(x))) {\n      f32bbox = null;\n    }\n\n    let optionalContent, groupOptions;\n    if (dict.has(\"OC\")) {\n      optionalContent = await this.parseMarkedContentProps(\n        dict.get(\"OC\"),\n        resources\n      );\n    }\n    if (optionalContent !== undefined) {\n      operatorList.addOp(OPS.beginMarkedContentProps, [\"OC\", optionalContent]);\n    }\n\n    const group = dict.get(\"Group\");\n    let newOpList;\n\n    // If it's a group, a new canvas will be created that is the size of the\n    // bounding box and translated to the correct position so we don't need to\n    // apply the bounding box to it.\n    const f32matrix = matrix && new Float32Array(matrix);\n    const args = [f32matrix, (!group && f32bbox) || null];\n    const localResources = dict.get(\"Resources\");\n\n    if (group) {\n      groupOptions = {\n        matrix,\n        bbox: f32bbox,\n        smask,\n        isolated: false,\n        knockout: false,\n        needsIsolation: false,\n        hasSoftMask: false,\n        isGray: false,\n      };\n\n      const groupSubtype = group.get(\"S\");\n      let colorSpace = null;\n      if (isName(groupSubtype, \"Transparency\")) {\n        groupOptions.isolated = group.get(\"I\") || false;\n        groupOptions.knockout = group.get(\"K\") || false;\n        if (group.has(\"CS\")) {\n          const cs = this._getColorSpace(\n            group.getRaw(\"CS\"),\n            resources,\n            localColorSpaceCache\n          );\n          colorSpace =\n            cs instanceof ColorSpace ? cs : await this._handleColorSpace(cs);\n        }\n      }\n\n      // When the group color space is gray (a single component) the group's\n      // content must be rendered in grayscale, see issue 7998.\n      groupOptions.isGray = colorSpace?.numComps === 1;\n\n      if (smask?.backdrop) {\n        colorSpace ||= ColorSpaceUtils.rgb;\n        smask.backdrop = colorSpace.getRgbHex(smask.backdrop, 0);\n      } else if (smask?.subtype === \"Luminosity\") {\n        // Per PDF spec 11.6.5.2: when /BC is missing the backdrop is the\n        // initial value of the group colour space, which is black for all\n        // standard colour spaces.\n        smask.backdrop = \"#000000\";\n      }\n\n      newOpList = new CheckedOperatorList();\n    } else {\n      newOpList = operatorList;\n      operatorList.addOp(OPS.paintFormXObjectBegin, args);\n    }\n\n    await this.getOperatorList({\n      stream: xobj,\n      task,\n      resources: localResources instanceof Dict ? localResources : resources,\n      operatorList: newOpList,\n      initialState,\n      prevRefs: seenRefs,\n    });\n\n    if (group) {\n      groupOptions.needsIsolation = newOpList.needsIsolation || !!smask;\n      groupOptions.hasSoftMask = newOpList.hasSoftMask || !!smask;\n      operatorList.addOp(OPS.beginGroup, [groupOptions]);\n      operatorList.addOp(OPS.paintFormXObjectBegin, args);\n      operatorList.addOpList(newOpList);\n      operatorList.addOp(OPS.paintFormXObjectEnd, []);\n      operatorList.addOp(OPS.endGroup, [groupOptions]);\n    } else {\n      operatorList.addOp(OPS.paintFormXObjectEnd, []);\n    }\n\n    if (optionalContent !== undefined) {\n      operatorList.addOp(OPS.endMarkedContent, []);\n    }\n  }\n\n  _sendImgData(objId, imgData, cacheGlobally = false) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      imgData\n    ) {\n      assert(Number.isInteger(imgData.dataLen), \"Expected dataLen to be set.\");\n    }\n    const transfers = imgData ? [imgData.bitmap || imgData.data.buffer] : null;\n\n    if (this.parsingType3Font || cacheGlobally) {\n      return this.handler.send(\n        \"commonobj\",\n        [objId, \"Image\", imgData],\n        transfers\n      );\n    }\n    return this.handler.send(\n      \"obj\",\n      [objId, this.pageIndex, \"Image\", imgData],\n      transfers\n    );\n  }\n\n  async buildPaintImageXObject({\n    resources,\n    image,\n    isInline = false,\n    operatorList,\n    cacheKey,\n    localImageCache,\n    localColorSpaceCache,\n  }) {\n    const { maxImageSize, ignoreErrors, isOffscreenCanvasSupported } =\n      this.options;\n\n    const { dict } = image;\n    const imageRef = dict.objId;\n    const w = dict.get(\"W\", \"Width\");\n    const h = dict.get(\"H\", \"Height\");\n\n    if (!(w && typeof w === \"number\") || !(h && typeof h === \"number\")) {\n      warn(\"Image dimensions are missing, or not numbers.\");\n      return;\n    }\n    if (maxImageSize !== -1 && w * h > maxImageSize) {\n      const msg = \"Image exceeded maximum allowed size and was removed.\";\n\n      if (!ignoreErrors) {\n        throw new Error(msg);\n      }\n      warn(msg);\n      return;\n    }\n\n    let optionalContent;\n    if (dict.has(\"OC\")) {\n      optionalContent = await this.parseMarkedContentProps(\n        dict.get(\"OC\"),\n        resources\n      );\n    }\n\n    const imageMask = dict.get(\"IM\", \"ImageMask\") || false;\n    let imgData, fn, args;\n    if (imageMask) {\n      // This depends on a tmpCanvas being filled with the\n      // current fillStyle, such that processing the pixel\n      // data can't be done here. Instead of creating a\n      // complete PDFImage, only read the information needed\n      // for later.\n      imgData = await PDFImage.createMask({\n        image,\n        isOffscreenCanvasSupported:\n          isOffscreenCanvasSupported && !this.parsingType3Font,\n      });\n\n      if (imgData.isSingleOpaquePixel) {\n        // Handles special case of mainly LaTeX documents which use image\n        // masks to draw lines with the current fill style.\n        fn = OPS.paintSolidColorImageMask;\n        args = [];\n        operatorList.addImageOps(fn, args, optionalContent);\n\n        if (cacheKey) {\n          const cacheData = { fn, args, optionalContent };\n          localImageCache.set(cacheKey, imageRef, cacheData);\n\n          if (imageRef) {\n            this._regionalImageCache.set(\n              /* name = */ null,\n              imageRef,\n              cacheData\n            );\n          }\n        }\n        return;\n      }\n\n      if (this.parsingType3Font) {\n        // NOTE: Compared to other image resources we don't bother caching\n        // Type3-glyph image masks, since we've not come across any cases\n        // where that actually helps.\n        // In Type3-glyphs image masks are \"always\" inline resources,\n        // they're usually fairly small and aren't being re-used either.\n        if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n          assert(\n            imgData.data instanceof Uint8Array,\n            \"Type3 glyph image mask must be a TypedArray.\"\n          );\n        }\n        args = compileType3Glyph(imgData);\n\n        if (args) {\n          operatorList.addImageOps(OPS.constructPath, args, optionalContent);\n          return;\n        }\n        warn(\"Cannot compile Type3 glyph.\");\n\n        // If compilation failed, or was disabled, fallback to using an inline\n        // image mask; this case should be extremely rare.\n        operatorList.addImageOps(\n          OPS.paintImageMaskXObject,\n          [imgData],\n          optionalContent\n        );\n        return;\n      }\n\n      const objId = `mask_${this.idFactory.createObjId()}`;\n      operatorList.addDependency(objId);\n\n      imgData.dataLen = imgData.bitmap\n        ? imgData.width * imgData.height * 4\n        : imgData.data.length;\n      this._sendImgData(objId, imgData);\n\n      fn = OPS.paintImageMaskXObject;\n      args = [\n        {\n          data: objId,\n          width: imgData.width,\n          height: imgData.height,\n          interpolate: imgData.interpolate,\n          count: 1,\n        },\n      ];\n      operatorList.addImageOps(fn, args, optionalContent);\n\n      if (cacheKey) {\n        const cacheData = { objId, fn, args, optionalContent };\n        localImageCache.set(cacheKey, imageRef, cacheData);\n\n        if (imageRef) {\n          this._regionalImageCache.set(/* name = */ null, imageRef, cacheData);\n        }\n      }\n      return;\n    }\n\n    const SMALL_IMAGE_DIMENSIONS = 200;\n    const hasMask = dict.has(\"SMask\") || dict.has(\"Mask\");\n    // Inlining small images into the queue as RGB data\n    if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !hasMask) {\n      try {\n        const imageObj = new PDFImage({\n          xref: this.xref,\n          res: resources,\n          image,\n          isInline,\n          pdfFunctionFactory: this._pdfFunctionFactory,\n          globalColorSpaceCache: this.globalColorSpaceCache,\n          localColorSpaceCache,\n        });\n        // We force the use of RGBA_32BPP images here, because we can't handle\n        // any other kind.\n        imgData = await imageObj.createImageData(\n          /* forceRGBA = */ true,\n          /* isOffscreenCanvasSupported = */ false\n        );\n        operatorList.addImageOps(\n          OPS.paintInlineImageXObject,\n          [imgData],\n          optionalContent\n        );\n      } catch (reason) {\n        const msg = `Unable to decode inline image: \"${reason}\".`;\n\n        if (!ignoreErrors) {\n          throw new Error(msg);\n        }\n        warn(msg);\n      }\n      return;\n    }\n\n    // If there is no imageMask, create the PDFImage and a lot\n    // of image processing can be done here.\n    let objId = `img_${this.idFactory.createObjId()}`,\n      cacheGlobally = false,\n      globalCacheData = null;\n\n    if (this.parsingType3Font) {\n      objId = `${this.idFactory.getDocId()}_type3_${objId}`;\n    } else if (cacheKey && imageRef) {\n      cacheGlobally = this.globalImageCache.shouldCache(\n        imageRef,\n        this.pageIndex\n      );\n\n      if (cacheGlobally) {\n        assert(!isInline, \"Cannot cache an inline image globally.\");\n\n        objId = `${this.idFactory.getDocId()}_${objId}`;\n      }\n    }\n\n    // Ensure that the dependency is added before the image is decoded.\n    operatorList.addDependency(objId);\n\n    fn = OPS.paintImageXObject;\n    args = [objId, w, h];\n    operatorList.addImageOps(fn, args, optionalContent, hasMask);\n\n    if (cacheGlobally) {\n      globalCacheData = {\n        objId,\n        fn,\n        args,\n        optionalContent,\n        hasMask,\n        byteSize: 0, // Temporary entry, to avoid `setData` returning early.\n      };\n\n      if (this.globalImageCache.hasDecodeFailed(imageRef)) {\n        this.globalImageCache.setData(imageRef, globalCacheData);\n\n        this._sendImgData(objId, /* imgData = */ null, cacheGlobally);\n        return;\n      }\n\n      // For large (at least 500x500) or more complex images that we'll cache\n      // globally, check if the image is still cached locally on the main-thread\n      // to avoid having to re-parse the image (since that can be slow).\n      if (w * h > 250000 || hasMask) {\n        const localLength = await this.handler.sendWithPromise(\"commonobj\", [\n          objId,\n          \"CopyLocalImage\",\n          { imageRef },\n        ]);\n\n        if (localLength) {\n          this.globalImageCache.setData(imageRef, globalCacheData);\n          this.globalImageCache.addByteSize(imageRef, localLength);\n          return;\n        }\n      }\n    }\n\n    PDFImage.buildImage({\n      xref: this.xref,\n      res: resources,\n      image,\n      isInline,\n      pdfFunctionFactory: this._pdfFunctionFactory,\n      globalColorSpaceCache: this.globalColorSpaceCache,\n      localColorSpaceCache,\n    })\n      .then(async imageObj => {\n        imgData = await imageObj.createImageData(\n          /* forceRGBA = */ false,\n          isOffscreenCanvasSupported\n        );\n        imgData.dataLen = imgData.bitmap\n          ? imgData.width * imgData.height * 4\n          : imgData.data.length;\n        imgData.ref = imageRef;\n\n        if (cacheGlobally) {\n          this.globalImageCache.addByteSize(imageRef, imgData.dataLen);\n        }\n        return this._sendImgData(objId, imgData, cacheGlobally);\n      })\n      .catch(reason => {\n        warn(`Unable to decode image \"${objId}\": \"${reason}\".`);\n\n        if (imageRef) {\n          this.globalImageCache.addDecodeFailed(imageRef);\n        }\n        return this._sendImgData(objId, /* imgData = */ null, cacheGlobally);\n      });\n\n    if (cacheKey) {\n      const cacheData = { objId, fn, args, optionalContent, hasMask };\n      localImageCache.set(cacheKey, imageRef, cacheData);\n\n      if (imageRef) {\n        this._regionalImageCache.set(/* name = */ null, imageRef, cacheData);\n\n        if (cacheGlobally) {\n          assert(globalCacheData, \"The global cache-data must be available.\");\n          this.globalImageCache.setData(imageRef, globalCacheData);\n        }\n      }\n    }\n  }\n\n  handleSMask(\n    smask,\n    resources,\n    operatorList,\n    task,\n    stateManager,\n    localColorSpaceCache,\n    seenRefs\n  ) {\n    const smaskContent = smask.get(\"G\");\n    const smaskOptions = {\n      subtype: smask.get(\"S\").name,\n      backdrop: smask.get(\"BC\"),\n    };\n\n    // The SMask might have a alpha/luminosity value transfer function --\n    // we will build a map of integer values in range 0..255 to be fast.\n    const transferObj = smask.get(\"TR\");\n    if (isPDFFunction(transferObj)) {\n      const transferFn = this._pdfFunctionFactory.create(transferObj);\n      const transferMap = new Uint8Array(256);\n      const tmp = new Float32Array(1);\n      for (let i = 0; i < 256; i++) {\n        tmp[0] = i / 255;\n        transferFn(tmp, 0, tmp, 0);\n        transferMap[i] = (tmp[0] * 255) | 0;\n      }\n      smaskOptions.transferMap = transferMap;\n    }\n\n    return this.buildFormXObject(\n      resources,\n      smaskContent,\n      smaskOptions,\n      operatorList,\n      task,\n      stateManager.state.clone({ newPath: true }),\n      localColorSpaceCache,\n      seenRefs\n    );\n  }\n\n  handleTransferFunction(tr) {\n    let transferArray;\n    if (Array.isArray(tr)) {\n      transferArray = tr;\n      if (tr.length > 1 && tr.every(map => map === tr[0])) {\n        // All entries in the array are the same, so we can just use one of\n        // them.\n        transferArray = [tr[0]];\n      }\n    } else if (isPDFFunction(tr)) {\n      transferArray = [tr];\n    } else {\n      return null; // Not a valid transfer function entry.\n    }\n\n    const transferMaps = [];\n    let numFns = 0,\n      numEffectfulFns = 0;\n    for (const entry of transferArray) {\n      const transferObj = this.xref.fetchIfRef(entry);\n      numFns++;\n\n      if (isName(transferObj, \"Identity\")) {\n        transferMaps.push(null);\n        continue;\n      } else if (!isPDFFunction(transferObj)) {\n        return null; // Not a valid transfer function object.\n      }\n\n      const transferFn = this._pdfFunctionFactory.create(transferObj);\n      const transferMap = new Uint8Array(256),\n        tmp = new Float32Array(1);\n      for (let j = 0; j < 256; j++) {\n        tmp[0] = j / 255;\n        transferFn(tmp, 0, tmp, 0);\n        transferMap[j] = (tmp[0] * 255) | 0;\n      }\n      transferMaps.push(transferMap);\n      numEffectfulFns++;\n    }\n\n    if (!(numFns === 1 || numFns === 4)) {\n      return null; // Only 1 or 4 functions are supported, by the specification.\n    }\n    if (numEffectfulFns === 0) {\n      return null; // Only /Identity transfer functions found, which are no-ops.\n    }\n    return transferMaps;\n  }\n\n  handleTilingType(\n    fn,\n    color,\n    resources,\n    pattern,\n    patternDict,\n    operatorList,\n    task,\n    localTilingPatternCache,\n    seenRefs\n  ) {\n    // Create an IR of the pattern code.\n    const tilingOpList = new CheckedOperatorList();\n    // Merge the available resources, to prevent issues when the patternDict\n    // is missing some /Resources entries (fixes issue6541.pdf).\n    const patternResources = Dict.merge({\n      xref: this.xref,\n      dictArray: [patternDict.get(\"Resources\"), resources],\n    });\n\n    return this.getOperatorList({\n      stream: pattern,\n      task,\n      resources: patternResources,\n      operatorList: tilingOpList,\n      prevRefs: seenRefs,\n    })\n      .then(function () {\n        const operatorListIR = tilingOpList.getIR();\n        const { needsIsolation } = tilingOpList;\n        const tilingPatternIR = getTilingPatternIR(\n          operatorListIR,\n          patternDict,\n          color,\n          needsIsolation\n        );\n        // Add the dependencies to the parent operator list so they are\n        // resolved before the sub operator list is executed synchronously.\n        operatorList.addDependencies(tilingOpList.dependencies);\n        operatorList.addOp(fn, tilingPatternIR);\n\n        if (patternDict.objId) {\n          localTilingPatternCache.set(/* name = */ null, patternDict.objId, {\n            operatorListIR,\n            needsIsolation,\n            dict: patternDict,\n          });\n        }\n      })\n      .catch(reason => {\n        if (reason instanceof AbortException) {\n          return;\n        }\n        if (this.options.ignoreErrors) {\n          warn(`handleTilingType - ignoring pattern: \"${reason}\".`);\n          return;\n        }\n        throw reason;\n      });\n  }\n\n  async handleSetFont(\n    resources,\n    fontArgs,\n    fontRef,\n    operatorList,\n    task,\n    state,\n    fallbackFontDict = null,\n    cssFontInfo = null,\n    seenRefs = null\n  ) {\n    const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null;\n\n    const translated = await this.loadFont(\n      fontName,\n      fontRef,\n      resources,\n      task,\n      fallbackFontDict,\n      cssFontInfo,\n      seenRefs\n    );\n\n    if (translated.font.isType3Font) {\n      // Add the dependencies to the parent operatorList so they are\n      // resolved before Type3 operatorLists are executed synchronously.\n      operatorList.addDependencies(translated.type3Dependencies);\n    }\n\n    state.font = translated.font;\n    translated.send(this.handler);\n    return translated.loadedName;\n  }\n\n  handleText(chars, state) {\n    const font = state.font;\n    const glyphs = font.charsToGlyphs(chars);\n\n    if (font.data) {\n      const isAddToPathSet = !!(\n        state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG\n      );\n      if (\n        isAddToPathSet ||\n        state.fillColorSpace.name === \"Pattern\" ||\n        state.strokeColorSpace.name === \"Pattern\" ||\n        font.disableFontFace\n      ) {\n        PartialEvaluator.buildFontPaths(\n          font,\n          glyphs,\n          this.handler,\n          this.options\n        );\n      }\n    }\n    return glyphs;\n  }\n\n  ensureStateFont(state) {\n    if (state.font) {\n      return;\n    }\n    const reason = new FormatError(\n      \"Missing setFont (Tf) operator before text rendering operator.\"\n    );\n\n    if (this.options.ignoreErrors) {\n      warn(`ensureStateFont: \"${reason}\".`);\n      return;\n    }\n    throw reason;\n  }\n\n  async setGState({\n    resources,\n    gState,\n    operatorList,\n    cacheKey,\n    task,\n    stateManager,\n    localGStateCache,\n    localColorSpaceCache,\n    seenRefs,\n  }) {\n    const gStateRef = gState.objId;\n    let isSimpleGState = true;\n    // This array holds the converted/processed state data.\n    const gStateObj = [];\n    let promise = Promise.resolve();\n    for (const [key, value] of gState) {\n      switch (key) {\n        case \"Type\":\n          break;\n        case \"LW\":\n          if (typeof value !== \"number\") {\n            warn(`Invalid LW (line width): ${value}`);\n            break;\n          }\n          gStateObj.push([key, Math.abs(value)]);\n          break;\n        case \"LC\":\n        case \"LJ\":\n        case \"ML\":\n        case \"D\":\n        case \"RI\":\n        case \"FL\":\n        case \"CA\":\n        case \"ca\":\n          gStateObj.push([key, value]);\n          break;\n        case \"Font\":\n          isSimpleGState = false;\n\n          promise = promise.then(() =>\n            this.handleSetFont(\n              resources,\n              null,\n              value[0],\n              operatorList,\n              task,\n              stateManager.state,\n              /* fallbackFontDict = */ null,\n              /* cssFontInfo = */ null,\n              seenRefs\n            ).then(function (loadedName) {\n              operatorList.addDependency(loadedName);\n              gStateObj.push([key, [loadedName, value[1]]]);\n            })\n          );\n          break;\n        case \"BM\":\n          gStateObj.push([key, normalizeBlendMode(value)]);\n          break;\n        case \"SMask\":\n          if (isName(value, \"None\")) {\n            gStateObj.push([key, false]);\n            break;\n          }\n          if (value instanceof Dict) {\n            isSimpleGState = false;\n\n            promise = promise.then(() =>\n              this.handleSMask(\n                value,\n                resources,\n                operatorList,\n                task,\n                stateManager,\n                localColorSpaceCache,\n                seenRefs\n              )\n            );\n            gStateObj.push([key, true]);\n          } else {\n            warn(\"Unsupported SMask type\");\n          }\n          break;\n        case \"TR\":\n        case \"TR2\": {\n          // TR2 takes precedence over TR (see PDF 32000-1:2008, Table 58), so\n          // ignore TR when a TR2 entry is present in the same dictionary.\n          if (key === \"TR\" && gState.has(\"TR2\")) {\n            break;\n          }\n          // For TR2 the name /Default denotes \"the transfer function that was\n          // in effect at the start of the page\" (PDF 32000-1:2008, Table 58).\n          // A page always starts with the identity transfer function, hence\n          // /Default (and /Identity) means \"no transfer function\" here, which\n          // clears any filter previously set on the display side (issue 21406).\n          // `handleTransferFunction` returns `null` for those names.\n          const transferMaps = this.handleTransferFunction(value);\n          gStateObj.push([\"TR\", transferMaps]);\n          break;\n        }\n        // Only generate info log messages for the following since\n        // they are unlikely to have a big impact on the rendering.\n        case \"OP\":\n        case \"op\":\n        case \"OPM\":\n        case \"BG\":\n        case \"BG2\":\n        case \"UCR\":\n        case \"UCR2\":\n        case \"HT\":\n        case \"SM\":\n        case \"SA\":\n        case \"AIS\":\n        case \"TK\":\n          // TODO implement these operators.\n          info(\"graphic state operator \" + key);\n          break;\n        default:\n          info(\"Unknown graphic state operator \" + key);\n          break;\n      }\n    }\n    await promise;\n\n    if (gStateObj.length > 0) {\n      operatorList.addOp(OPS.setGState, [gStateObj]);\n    }\n\n    if (isSimpleGState) {\n      localGStateCache.set(cacheKey, gStateRef, gStateObj);\n    }\n  }\n\n  loadFont(\n    fontName,\n    font,\n    resources,\n    task,\n    fallbackFontDict = null,\n    cssFontInfo = null,\n    seenRefs = null\n  ) {\n    const errorFont = async () =>\n      new TranslatedFont({\n        loadedName: \"g_font_error\",\n        font: new ErrorFont(`Font \"${fontName}\" is not available.`),\n        dict: font,\n      });\n\n    let fontRef;\n    if (font) {\n      // Loading by ref.\n      if (font instanceof Ref) {\n        fontRef = font;\n      }\n    } else {\n      // Loading by name.\n      const fontRes = resources.get(\"Font\");\n      if (fontRes) {\n        fontRef = fontRes.getRaw(fontName);\n      }\n    }\n    if (fontRef) {\n      if (this.type3FontRefs?.has(fontRef)) {\n        return errorFont();\n      }\n\n      if (this.fontCache.has(fontRef)) {\n        return this.fontCache.get(fontRef);\n      }\n\n      try {\n        font = this.xref.fetchIfRef(fontRef);\n      } catch (ex) {\n        warn(`loadFont - lookup failed: \"${ex}\".`);\n      }\n    }\n\n    if (!(font instanceof Dict)) {\n      if (!this.options.ignoreErrors && !this.parsingType3Font) {\n        warn(`Font \"${fontName}\" is not available.`);\n        return errorFont();\n      }\n      warn(\n        `Font \"${fontName}\" is not available -- attempting to fallback to a default font.`\n      );\n\n      // Falling back to a default font to avoid completely broken rendering,\n      // but note that there're no guarantees that things will look \"correct\".\n      font = fallbackFontDict || PartialEvaluator.fallbackFontDict;\n    }\n\n    // We are holding `font.cacheKey` references only for `fontRef`s that\n    // are not actually `Ref`s, but rather `Dict`s. See explanation below.\n    if (font.cacheKey && this.fontCache.has(font.cacheKey)) {\n      return this.fontCache.get(font.cacheKey);\n    }\n\n    const { promise, resolve } = Promise.withResolvers();\n\n    let preEvaluatedFont;\n    try {\n      preEvaluatedFont = this.preEvaluateFont(font);\n      preEvaluatedFont.cssFontInfo = cssFontInfo;\n    } catch (reason) {\n      warn(`loadFont - preEvaluateFont failed: \"${reason}\".`);\n      return errorFont();\n    }\n    const { descriptor, hash } = preEvaluatedFont;\n\n    const fontRefIsRef = fontRef instanceof Ref;\n    let fontID;\n\n    if (hash && descriptor instanceof Dict) {\n      const fontAliases = (descriptor.fontAliases ||= Object.create(null));\n\n      if (fontAliases[hash]) {\n        const aliasFontRef = fontAliases[hash].aliasRef;\n        if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {\n          this.fontCache.putAlias(fontRef, aliasFontRef);\n          return this.fontCache.get(fontRef);\n        }\n      } else {\n        fontAliases[hash] = {\n          fontID: this.idFactory.createFontId(),\n        };\n      }\n\n      if (fontRefIsRef) {\n        fontAliases[hash].aliasRef = fontRef;\n      }\n      fontID = fontAliases[hash].fontID;\n    } else {\n      fontID = this.idFactory.createFontId();\n    }\n    assert(\n      fontID?.startsWith(\"f\"),\n      'The \"fontID\" must be (correctly) defined.'\n    );\n\n    // Workaround for bad PDF generators that reference fonts incorrectly,\n    // where `fontRef` is a `Dict` rather than a `Ref` (fixes bug946506.pdf).\n    // In this case we cannot put the font into `this.fontCache` (which is\n    // a `RefSetCache`), since it's not possible to use a `Dict` as a key.\n    //\n    // However, if we don't cache the font it's not possible to remove it\n    // when `cleanup` is triggered from the API, which causes issues on\n    // subsequent rendering operations (see issue7403.pdf) and would force us\n    // to unnecessarily load the same fonts over and over.\n    //\n    // Instead, we cheat a bit by using a modified `fontID` as a key in\n    // `this.fontCache`, to allow the font to be cached.\n    // NOTE: This works because `RefSetCache` calls `toString()` on provided\n    //       keys. Also, since `fontRef` is used when getting cached fonts,\n    //       we'll not accidentally match fonts cached with the `fontID`.\n    if (fontRefIsRef) {\n      this.fontCache.put(fontRef, promise);\n    } else {\n      font.cacheKey = `cacheKey_${fontID}`;\n      this.fontCache.put(font.cacheKey, promise);\n    }\n\n    // Keep track of each font we translated so the caller can\n    // load them asynchronously before calling display on a page.\n    font.loadedName = `${this.idFactory.getDocId()}_${fontID}`;\n\n    this.translateFont(preEvaluatedFont)\n      .then(async translatedFont => {\n        const translated = new TranslatedFont({\n          loadedName: font.loadedName,\n          font: translatedFont,\n          dict: font,\n        });\n\n        if (translatedFont.isType3Font) {\n          try {\n            await translated.loadType3Data(this, resources, task, seenRefs);\n          } catch (reason) {\n            throw new Error(`Type3 font load error: ${reason}`);\n          }\n        }\n        resolve(translated);\n      })\n      .catch(reason => {\n        // TODO reject?\n        warn(`loadFont - translateFont failed: \"${reason}\".`);\n\n        resolve(\n          new TranslatedFont({\n            loadedName: font.loadedName,\n            font: new ErrorFont(reason?.message),\n            dict: font,\n          })\n        );\n      });\n    return promise;\n  }\n\n  buildPath(fn, args, state) {\n    const { pathMinMax: minMax, pathBuffer } = state;\n    switch (fn | 0) {\n      case OPS.rectangle: {\n        const x = (state.currentPointX = args[0]);\n        const y = (state.currentPointY = args[1]);\n        const width = args[2];\n        const height = args[3];\n        const xw = x + width;\n        const yh = y + height;\n        if (width === 0 || height === 0) {\n          pathBuffer.push(\n            DrawOPS.moveTo,\n            x,\n            y,\n            DrawOPS.lineTo,\n            xw,\n            yh,\n            DrawOPS.closePath\n          );\n        } else {\n          pathBuffer.push(\n            DrawOPS.moveTo,\n            x,\n            y,\n            DrawOPS.lineTo,\n            xw,\n            y,\n            DrawOPS.lineTo,\n            xw,\n            yh,\n            DrawOPS.lineTo,\n            x,\n            yh,\n            DrawOPS.closePath\n          );\n        }\n        Util.rectBoundingBox(x, y, xw, yh, minMax);\n        break;\n      }\n      case OPS.moveTo: {\n        const x = (state.currentPointX = args[0]);\n        const y = (state.currentPointY = args[1]);\n        pathBuffer.push(DrawOPS.moveTo, x, y);\n        Util.pointBoundingBox(x, y, minMax);\n        break;\n      }\n      case OPS.lineTo: {\n        const x = (state.currentPointX = args[0]);\n        const y = (state.currentPointY = args[1]);\n        pathBuffer.push(DrawOPS.lineTo, x, y);\n        Util.pointBoundingBox(x, y, minMax);\n        break;\n      }\n      case OPS.curveTo: {\n        const startX = state.currentPointX;\n        const startY = state.currentPointY;\n        const [x1, y1, x2, y2, x, y] = args;\n        state.currentPointX = x;\n        state.currentPointY = y;\n        pathBuffer.push(DrawOPS.curveTo, x1, y1, x2, y2, x, y);\n        Util.bezierBoundingBox(startX, startY, x1, y1, x2, y2, x, y, minMax);\n        break;\n      }\n      case OPS.curveTo2: {\n        const startX = state.currentPointX;\n        const startY = state.currentPointY;\n        const [x1, y1, x, y] = args;\n        state.currentPointX = x;\n        state.currentPointY = y;\n        pathBuffer.push(DrawOPS.curveTo, startX, startY, x1, y1, x, y);\n        Util.bezierBoundingBox(\n          startX,\n          startY,\n          startX,\n          startY,\n          x1,\n          y1,\n          x,\n          y,\n          minMax\n        );\n        break;\n      }\n      case OPS.curveTo3: {\n        const startX = state.currentPointX;\n        const startY = state.currentPointY;\n        const [x1, y1, x, y] = args;\n        state.currentPointX = x;\n        state.currentPointY = y;\n        pathBuffer.push(DrawOPS.curveTo, x1, y1, x, y, x, y);\n        Util.bezierBoundingBox(startX, startY, x1, y1, x, y, x, y, minMax);\n        break;\n      }\n      case OPS.closePath:\n        pathBuffer.push(DrawOPS.closePath);\n        break;\n    }\n  }\n\n  _getColorSpace(cs, resources, localColorSpaceCache) {\n    return ColorSpaceUtils.parse({\n      cs,\n      xref: this.xref,\n      resources,\n      pdfFunctionFactory: this._pdfFunctionFactory,\n      globalColorSpaceCache: this.globalColorSpaceCache,\n      localColorSpaceCache,\n      asyncIfNotCached: true,\n    });\n  }\n\n  async _handleColorSpace(csPromise) {\n    try {\n      return await csPromise;\n    } catch (ex) {\n      if (ex instanceof AbortException) {\n        return null;\n      }\n      if (this.options.ignoreErrors) {\n        warn(`_handleColorSpace - ignoring ColorSpace: \"${ex}\".`);\n        return null;\n      }\n      throw ex;\n    }\n  }\n\n  parseShading({\n    shading,\n    resources,\n    localColorSpaceCache,\n    localShadingPatternCache,\n  }) {\n    // Shadings and patterns may be referenced by the same name but the resource\n    // dictionary could be different so we can't use the name for the cache key.\n    let id = localShadingPatternCache.get(shading);\n    if (id) {\n      return id;\n    }\n    let patternIR;\n\n    try {\n      const shadingFill = Pattern.parseShading(\n        shading,\n        this.xref,\n        resources,\n        this._pdfFunctionFactory,\n        this.globalColorSpaceCache,\n        localColorSpaceCache\n      );\n      patternIR = shadingFill.getIR();\n    } catch (reason) {\n      if (reason instanceof AbortException) {\n        return null;\n      }\n      if (this.options.ignoreErrors) {\n        warn(`parseShading - ignoring shading: \"${reason}\".`);\n\n        localShadingPatternCache.set(shading, null);\n        return null;\n      }\n      throw reason;\n    }\n\n    id = `pattern_${this.idFactory.createObjId()}`;\n    if (this.parsingType3Font) {\n      id = `${this.idFactory.getDocId()}_type3_${id}`;\n    }\n    localShadingPatternCache.set(shading, id);\n\n    if (this.parsingType3Font) {\n      const buffer = compilePatternInfo(patternIR);\n      this.handler.send(\"commonobj\", [id, \"Pattern\", buffer], [buffer]);\n    } else {\n      this.handler.send(\"obj\", [id, this.pageIndex, \"Pattern\", patternIR]);\n    }\n    return id;\n  }\n\n  handleColorN(\n    operatorList,\n    fn,\n    args,\n    cs,\n    patterns,\n    resources,\n    task,\n    localColorSpaceCache,\n    localTilingPatternCache,\n    localShadingPatternCache,\n    seenRefs\n  ) {\n    // compile tiling patterns\n    const patternName = args.pop();\n    // SCN/scn applies patterns along with normal colors\n    if (patternName instanceof Name) {\n      const rawPattern = patterns.getRaw(patternName.name);\n\n      const localTilingPattern =\n        rawPattern instanceof Ref &&\n        localTilingPatternCache.getByRef(rawPattern);\n      if (localTilingPattern) {\n        try {\n          const color = cs.base ? cs.base.getRgbHex(args, 0) : null;\n          const tilingPatternIR = getTilingPatternIR(\n            localTilingPattern.operatorListIR,\n            localTilingPattern.dict,\n            color,\n            localTilingPattern.needsIsolation\n          );\n          operatorList.addOp(fn, tilingPatternIR);\n          return undefined;\n        } catch {\n          // Handle any errors during normal TilingPattern parsing.\n        }\n      }\n\n      const pattern = this.xref.fetchIfRef(rawPattern);\n      if (pattern) {\n        const dict = pattern instanceof BaseStream ? pattern.dict : pattern;\n        const typeNum = dict.get(\"PatternType\");\n\n        if (typeNum === PatternType.TILING) {\n          const color = cs.base ? cs.base.getRgbHex(args, 0) : null;\n          return this.handleTilingType(\n            fn,\n            color,\n            resources,\n            pattern,\n            dict,\n            operatorList,\n            task,\n            localTilingPatternCache,\n            seenRefs\n          );\n        } else if (typeNum === PatternType.SHADING) {\n          const shading = dict.get(\"Shading\");\n          const objId = this.parseShading({\n            shading,\n            resources,\n            localColorSpaceCache,\n            localShadingPatternCache,\n          });\n          if (objId) {\n            const matrix = lookupMatrix(dict.getArray(\"Matrix\"), null);\n            operatorList.addOp(fn, [\"Shading\", objId, matrix]);\n          }\n          return undefined;\n        }\n        throw new FormatError(`Unknown PatternType: ${typeNum}`);\n      }\n    }\n    throw new FormatError(`Unknown PatternName: ${patternName}`);\n  }\n\n  async parseMarkedContentProps(contentProperties, resources) {\n    return parseMarkedContentProps(this.xref, contentProperties, resources);\n  }\n\n  async getOperatorList({\n    stream,\n    task,\n    resources,\n    operatorList,\n    initialState = null,\n    fallbackFontDict = null,\n    prevRefs = null,\n  }) {\n    if (stream.isAsync) {\n      const bytes = await stream.asyncGetBytes();\n      if (bytes) {\n        stream = new Stream(bytes, 0, bytes.length, stream.dict);\n      }\n    }\n\n    const objId = stream.dict?.objId;\n    const seenRefs = new RefSet(prevRefs);\n\n    if (objId) {\n      if (prevRefs?.has(objId)) {\n        throw new Error(\n          `getOperatorList - ignoring circular reference: ${objId}`\n        );\n      }\n      seenRefs.put(objId);\n    }\n    // Ensure that `resources`/`initialState` is correctly initialized,\n    // even if the provided parameter is e.g. `null`.\n    resources ||= Dict.empty;\n    initialState ||= new EvalState();\n\n    if (!operatorList) {\n      throw new Error('getOperatorList: missing \"operatorList\" parameter');\n    }\n\n    const self = this;\n    const xref = this.xref;\n    const localImageCache = new LocalImageCache();\n    const localColorSpaceCache = new LocalColorSpaceCache();\n    const localGStateCache = new LocalGStateCache();\n    const localTilingPatternCache = new LocalTilingPatternCache();\n    const localShadingPatternCache = new Map();\n\n    const xobjs = resources.get(\"XObject\") || Dict.empty;\n    const patterns = resources.get(\"Pattern\") || Dict.empty;\n    const stateManager = new StateManager(initialState);\n    const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n    const timeSlotManager = new TimeSlotManager();\n\n    function closePendingRestoreOPS(argument) {\n      for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {\n        operatorList.addOp(OPS.restore, []);\n      }\n    }\n\n    return new Promise(function promiseBody(resolve, reject) {\n      const next = function (promise) {\n        Promise.all([promise, operatorList.ready]).then(function () {\n          try {\n            promiseBody(resolve, reject);\n          } catch (ex) {\n            reject(ex);\n          }\n        }, reject);\n      };\n      task.ensureNotTerminated();\n      timeSlotManager.reset();\n\n      const operation = {};\n      let stop, i, ii, cs, name, isValidName;\n      while (!(stop = timeSlotManager.check())) {\n        // The arguments parsed by read() are used beyond this loop, so we\n        // cannot reuse the same array on each iteration. Therefore we pass\n        // in |null| as the initial value (see the comment on\n        // EvaluatorPreprocessor_read() for why).\n        operation.args = null;\n        if (!preprocessor.read(operation)) {\n          break;\n        }\n        let args = operation.args;\n        let fn = operation.fn;\n\n        switch (fn | 0) {\n          case OPS.paintXObject:\n            // eagerly compile XForm objects\n            isValidName = args[0] instanceof Name;\n            name = args[0].name;\n\n            if (isValidName) {\n              const localImage = localImageCache.getByName(name);\n              if (localImage) {\n                addCachedImageOps(operatorList, localImage);\n                args = null;\n                continue;\n              }\n            }\n\n            next(\n              new Promise(function (resolveXObject, rejectXObject) {\n                if (!isValidName) {\n                  throw new FormatError(\"XObject must be referred to by name.\");\n                }\n\n                let xobj = xobjs.getRaw(name);\n                if (xobj instanceof Ref) {\n                  const cachedImage =\n                    localImageCache.getByRef(xobj) ||\n                    self._regionalImageCache.getByRef(xobj) ||\n                    self.globalImageCache.getData(xobj, self.pageIndex);\n                  if (cachedImage) {\n                    addCachedImageOps(operatorList, cachedImage);\n                    resolveXObject();\n                    return;\n                  }\n\n                  xobj = xref.fetch(xobj);\n                }\n\n                if (!(xobj instanceof BaseStream)) {\n                  throw new FormatError(\"XObject should be a stream\");\n                }\n\n                const type = xobj.dict.get(\"Subtype\");\n                if (!(type instanceof Name)) {\n                  throw new FormatError(\"XObject should have a Name subtype\");\n                }\n\n                if (type.name === \"Form\") {\n                  stateManager.save();\n                  self\n                    .buildFormXObject(\n                      resources,\n                      xobj,\n                      null,\n                      operatorList,\n                      task,\n                      stateManager.state.clone({ newPath: true }),\n                      localColorSpaceCache,\n                      seenRefs\n                    )\n                    .then(function () {\n                      stateManager.restore();\n                      resolveXObject();\n                    }, rejectXObject);\n                  return;\n                } else if (type.name === \"Image\") {\n                  self\n                    .buildPaintImageXObject({\n                      resources,\n                      image: xobj,\n                      operatorList,\n                      cacheKey: name,\n                      localImageCache,\n                      localColorSpaceCache,\n                    })\n                    .then(resolveXObject, rejectXObject);\n                  return;\n                } else if (type.name === \"PS\") {\n                  // PostScript XObjects are unused when viewing documents.\n                  // See section 4.7.1 of Adobe's PDF reference.\n                  info(\"Ignored XObject subtype PS\");\n                } else {\n                  throw new FormatError(\n                    `Unhandled XObject subtype ${type.name}`\n                  );\n                }\n                resolveXObject();\n              }).catch(function (reason) {\n                if (reason instanceof AbortException) {\n                  return;\n                }\n                if (self.options.ignoreErrors) {\n                  warn(`getOperatorList - ignoring XObject: \"${reason}\".`);\n                  return;\n                }\n                throw reason;\n              })\n            );\n            return;\n          case OPS.setFont:\n            const fontSize = args[1];\n            // eagerly collect all fonts\n            next(\n              self\n                .handleSetFont(\n                  resources,\n                  args,\n                  null,\n                  operatorList,\n                  task,\n                  stateManager.state,\n                  fallbackFontDict,\n                  /* cssFontInfo = */ null,\n                  seenRefs\n                )\n                .then(function (loadedName) {\n                  operatorList.addDependency(loadedName);\n                  operatorList.addOp(OPS.setFont, [loadedName, fontSize]);\n                })\n            );\n            return;\n          case OPS.endInlineImage:\n            const cacheKey = args[0].cacheKey;\n            if (cacheKey) {\n              const localImage = localImageCache.getByName(cacheKey);\n              if (localImage) {\n                addCachedImageOps(operatorList, localImage);\n                args = null;\n                continue;\n              }\n            }\n            next(\n              self.buildPaintImageXObject({\n                resources,\n                image: args[0],\n                isInline: true,\n                operatorList,\n                cacheKey,\n                localImageCache,\n                localColorSpaceCache,\n              })\n            );\n            return;\n          case OPS.showText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n            args[0] = self.handleText(args[0], stateManager.state);\n            break;\n          case OPS.showSpacedText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n            const combinedGlyphs = [],\n              state = stateManager.state;\n            for (const arrItem of args[0]) {\n              if (typeof arrItem === \"string\") {\n                combinedGlyphs.push(...self.handleText(arrItem, state));\n              } else if (typeof arrItem === \"number\") {\n                combinedGlyphs.push(arrItem);\n              }\n            }\n            args[0] = combinedGlyphs;\n            fn = OPS.showText;\n            break;\n          case OPS.nextLineShowText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n            operatorList.addOp(OPS.nextLine);\n            args[0] = self.handleText(args[0], stateManager.state);\n            fn = OPS.showText;\n            break;\n          case OPS.nextLineSetSpacingShowText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n            operatorList.addOp(OPS.nextLine);\n            operatorList.addOp(OPS.setWordSpacing, [args.shift()]);\n            operatorList.addOp(OPS.setCharSpacing, [args.shift()]);\n            args[0] = self.handleText(args[0], stateManager.state);\n            fn = OPS.showText;\n            break;\n          case OPS.setTextRenderingMode:\n            stateManager.state.textRenderingMode = args[0];\n            break;\n\n          case OPS.setFillColorSpace: {\n            const fillCS = self._getColorSpace(\n              args[0],\n              resources,\n              localColorSpaceCache\n            );\n            if (fillCS instanceof ColorSpace) {\n              stateManager.state.fillColorSpace = fillCS;\n              continue;\n            }\n\n            next(\n              self._handleColorSpace(fillCS).then(colorSpace => {\n                stateManager.state.fillColorSpace =\n                  colorSpace || ColorSpaceUtils.gray;\n              })\n            );\n            return;\n          }\n          case OPS.setStrokeColorSpace: {\n            const strokeCS = self._getColorSpace(\n              args[0],\n              resources,\n              localColorSpaceCache\n            );\n            if (strokeCS instanceof ColorSpace) {\n              stateManager.state.strokeColorSpace = strokeCS;\n              continue;\n            }\n\n            next(\n              self._handleColorSpace(strokeCS).then(colorSpace => {\n                stateManager.state.strokeColorSpace =\n                  colorSpace || ColorSpaceUtils.gray;\n              })\n            );\n            return;\n          }\n          case OPS.setFillColor:\n            cs = stateManager.state.fillColorSpace;\n            args = [cs.getRgbHex(args, 0)];\n            fn = OPS.setFillRGBColor;\n            break;\n          case OPS.setStrokeColor:\n            cs = stateManager.state.strokeColorSpace;\n            args = [cs.getRgbHex(args, 0)];\n            fn = OPS.setStrokeRGBColor;\n            break;\n          case OPS.setFillGray:\n            stateManager.state.fillColorSpace = ColorSpaceUtils.gray;\n            args = [ColorSpaceUtils.gray.getRgbHex(args, 0)];\n            fn = OPS.setFillRGBColor;\n            break;\n          case OPS.setStrokeGray:\n            stateManager.state.strokeColorSpace = ColorSpaceUtils.gray;\n            args = [ColorSpaceUtils.gray.getRgbHex(args, 0)];\n            fn = OPS.setStrokeRGBColor;\n            break;\n          case OPS.setFillCMYKColor:\n            stateManager.state.fillColorSpace = ColorSpaceUtils.cmyk;\n            args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)];\n            fn = OPS.setFillRGBColor;\n            break;\n          case OPS.setStrokeCMYKColor:\n            stateManager.state.strokeColorSpace = ColorSpaceUtils.cmyk;\n            args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)];\n            fn = OPS.setStrokeRGBColor;\n            break;\n          case OPS.setFillRGBColor:\n            stateManager.state.fillColorSpace = ColorSpaceUtils.rgb;\n            args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)];\n            break;\n          case OPS.setStrokeRGBColor:\n            stateManager.state.strokeColorSpace = ColorSpaceUtils.rgb;\n            args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)];\n            break;\n          case OPS.setFillColorN:\n            cs = stateManager.state.patternFillColorSpace;\n            if (!cs) {\n              if (isNumberArray(args, null)) {\n                args = [ColorSpaceUtils.gray.getRgbHex(args, 0)];\n                fn = OPS.setFillRGBColor;\n                break;\n              }\n              args = [];\n              fn = OPS.setFillTransparent;\n              break;\n            }\n            if (cs.name === \"Pattern\") {\n              next(\n                self.handleColorN(\n                  operatorList,\n                  OPS.setFillColorN,\n                  args,\n                  cs,\n                  patterns,\n                  resources,\n                  task,\n                  localColorSpaceCache,\n                  localTilingPatternCache,\n                  localShadingPatternCache,\n                  seenRefs\n                )\n              );\n              return;\n            }\n            args = [cs.getRgbHex(args, 0)];\n            fn = OPS.setFillRGBColor;\n            break;\n          case OPS.setStrokeColorN:\n            cs = stateManager.state.patternStrokeColorSpace;\n            if (!cs) {\n              if (isNumberArray(args, null)) {\n                args = [ColorSpaceUtils.gray.getRgbHex(args, 0)];\n                fn = OPS.setStrokeRGBColor;\n                break;\n              }\n              args = [];\n              fn = OPS.setStrokeTransparent;\n              break;\n            }\n            if (cs.name === \"Pattern\") {\n              next(\n                self.handleColorN(\n                  operatorList,\n                  OPS.setStrokeColorN,\n                  args,\n                  cs,\n                  patterns,\n                  resources,\n                  task,\n                  localColorSpaceCache,\n                  localTilingPatternCache,\n                  localShadingPatternCache,\n                  seenRefs\n                )\n              );\n              return;\n            }\n            args = [cs.getRgbHex(args, 0)];\n            fn = OPS.setStrokeRGBColor;\n            break;\n\n          case OPS.shadingFill:\n            let shading;\n            try {\n              const shadingRes = resources.get(\"Shading\");\n              if (!shadingRes) {\n                throw new FormatError(\"No shading resource found\");\n              }\n\n              shading = shadingRes.get(args[0].name);\n              if (!shading) {\n                throw new FormatError(\"No shading object found\");\n              }\n            } catch (reason) {\n              if (reason instanceof AbortException) {\n                continue;\n              }\n              if (self.options.ignoreErrors) {\n                warn(`getOperatorList - ignoring Shading: \"${reason}\".`);\n                continue;\n              }\n              throw reason;\n            }\n            const patternId = self.parseShading({\n              shading,\n              resources,\n              localColorSpaceCache,\n              localShadingPatternCache,\n            });\n            if (!patternId) {\n              continue;\n            }\n            args = [patternId];\n            fn = OPS.shadingFill;\n            break;\n          case OPS.setGState:\n            isValidName = args[0] instanceof Name;\n            name = args[0].name;\n\n            if (isValidName) {\n              const localGStateObj = localGStateCache.getByName(name);\n              if (localGStateObj) {\n                if (localGStateObj.length > 0) {\n                  operatorList.addOp(OPS.setGState, [localGStateObj]);\n                }\n                args = null;\n                continue;\n              }\n            }\n\n            next(\n              new Promise(function (resolveGState, rejectGState) {\n                if (!isValidName) {\n                  throw new FormatError(\"GState must be referred to by name.\");\n                }\n\n                const extGState = resources.get(\"ExtGState\");\n                if (!(extGState instanceof Dict)) {\n                  throw new FormatError(\"ExtGState should be a dictionary.\");\n                }\n\n                const gState = extGState.get(name);\n                // TODO: Attempt to lookup cached GStates by reference as well,\n                //       if and only if there are PDF documents where doing so\n                //       would significantly improve performance.\n                if (!(gState instanceof Dict)) {\n                  throw new FormatError(\"GState should be a dictionary.\");\n                }\n\n                self\n                  .setGState({\n                    resources,\n                    gState,\n                    operatorList,\n                    cacheKey: name,\n                    task,\n                    stateManager,\n                    localGStateCache,\n                    localColorSpaceCache,\n                    seenRefs,\n                  })\n                  .then(resolveGState, rejectGState);\n              }).catch(function (reason) {\n                if (reason instanceof AbortException) {\n                  return;\n                }\n                if (self.options.ignoreErrors) {\n                  warn(`getOperatorList - ignoring ExtGState: \"${reason}\".`);\n                  return;\n                }\n                throw reason;\n              })\n            );\n            return;\n          case OPS.setLineWidth: {\n            // The thickness should be a non-negative number, as per spec.\n            // When the value is negative, Acrobat and Poppler take the absolute\n            // value while PDFium takes the max of 0 and the value.\n            const [thickness] = args;\n            if (typeof thickness !== \"number\") {\n              warn(`Invalid setLineWidth: ${thickness}`);\n              continue;\n            }\n            args[0] = Math.abs(thickness);\n            break;\n          }\n          case OPS.setDash: {\n            const dashPhase = args[1];\n            if (typeof dashPhase !== \"number\") {\n              warn(`Invalid setDash: ${dashPhase}`);\n              continue;\n            }\n            const dashArray = args[0];\n            if (!Array.isArray(dashArray)) {\n              warn(`Invalid setDash: ${dashArray}`);\n              continue;\n            }\n            if (dashArray.some(x => typeof x !== \"number\")) {\n              args[0] = dashArray.filter(x => typeof x === \"number\");\n            }\n            break;\n          }\n          case OPS.moveTo:\n          case OPS.lineTo:\n          case OPS.curveTo:\n          case OPS.curveTo2:\n          case OPS.curveTo3:\n          case OPS.closePath:\n          case OPS.rectangle:\n            self.buildPath(fn, args, stateManager.state);\n            continue;\n          case OPS.stroke:\n          case OPS.closeStroke:\n          case OPS.fill:\n          case OPS.eoFill:\n          case OPS.fillStroke:\n          case OPS.eoFillStroke:\n          case OPS.closeFillStroke:\n          case OPS.closeEOFillStroke:\n          case OPS.endPath: {\n            const {\n              state: { pathBuffer, pathMinMax },\n            } = stateManager;\n            if (\n              fn === OPS.closeStroke ||\n              fn === OPS.closeFillStroke ||\n              fn === OPS.closeEOFillStroke\n            ) {\n              pathBuffer.push(DrawOPS.closePath);\n            }\n            if (pathBuffer.length === 0) {\n              operatorList.addOp(OPS.constructPath, [fn, [null], null]);\n            } else {\n              operatorList.addOp(OPS.constructPath, [\n                fn,\n                [new Float32Array(pathBuffer)],\n                pathMinMax.slice(),\n              ]);\n              pathBuffer.length = 0;\n              pathMinMax.set(BBOX_INIT, 0);\n            }\n            continue;\n          }\n          case OPS.setTextMatrix:\n            operatorList.addOp(fn, [new Float32Array(args)]);\n            continue;\n          case OPS.markPoint:\n          case OPS.markPointProps:\n          case OPS.beginCompat:\n          case OPS.endCompat:\n            // Ignore operators where the corresponding handlers are known to\n            // be no-op in CanvasGraphics (display/canvas.js). This prevents\n            // serialization errors and is also a bit more efficient.\n            // We could also try to serialize all objects in a general way,\n            // e.g. as done in https://github.com/mozilla/pdf.js/pull/6266,\n            // but doing so is meaningless without knowing the semantics.\n            continue;\n          case OPS.beginMarkedContentProps:\n            if (!(args[0] instanceof Name)) {\n              warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`);\n              operatorList.addOp(OPS.beginMarkedContentProps, [\"OC\", null]);\n              continue;\n            }\n            if (args[0].name === \"OC\") {\n              next(\n                self\n                  .parseMarkedContentProps(args[1], resources)\n                  .then(data => {\n                    operatorList.addOp(OPS.beginMarkedContentProps, [\n                      \"OC\",\n                      data,\n                    ]);\n                  })\n                  .catch(reason => {\n                    if (reason instanceof AbortException) {\n                      return;\n                    }\n                    if (self.options.ignoreErrors) {\n                      warn(\n                        `getOperatorList - ignoring beginMarkedContentProps: \"${reason}\".`\n                      );\n                      operatorList.addOp(OPS.beginMarkedContentProps, [\n                        \"OC\",\n                        null,\n                      ]);\n                      return;\n                    }\n                    throw reason;\n                  })\n              );\n              return;\n            }\n            // Other marked content types aren't supported yet.\n            args = [\n              args[0].name,\n              args[1] instanceof Dict ? args[1].get(\"MCID\") : null,\n            ];\n\n            break;\n          case OPS.beginMarkedContent:\n          case OPS.endMarkedContent:\n          default:\n            // Note: Ignore the operator if it has `Dict` arguments, since\n            // those are non-serializable, otherwise postMessage will throw\n            // \"An object could not be cloned.\".\n            if (args !== null) {\n              for (i = 0, ii = args.length; i < ii; i++) {\n                if (args[i] instanceof Dict) {\n                  break;\n                }\n              }\n              if (i < ii) {\n                warn(\"getOperatorList - ignoring operator: \" + fn);\n                continue;\n              }\n            }\n        }\n        operatorList.addOp(fn, args);\n      }\n      if (stop) {\n        next(deferred);\n        return;\n      }\n      // Some PDFs don't close all restores inside object/form.\n      // Closing those for them.\n      closePendingRestoreOPS();\n      resolve();\n    }).catch(reason => {\n      if (reason instanceof AbortException) {\n        return;\n      }\n      if (this.options.ignoreErrors) {\n        warn(\n          `getOperatorList - ignoring errors during \"${task.name}\" ` +\n            `task: \"${reason}\".`\n        );\n\n        closePendingRestoreOPS();\n        return;\n      }\n      throw reason;\n    });\n  }\n\n  async getTextContent({\n    stream,\n    task,\n    resources,\n    stateManager = null,\n    includeMarkedContent = false,\n    sink,\n    seenStyles = new Set(),\n    viewBox,\n    lang = null,\n    markedContentData = null,\n    disableNormalization = false,\n    keepWhiteSpace = false,\n    prevRefs = null,\n    intersector = null,\n  }) {\n    if (stream.isAsync) {\n      const bytes = await stream.asyncGetBytes();\n      if (bytes) {\n        stream = new Stream(bytes, 0, bytes.length, stream.dict);\n      }\n    }\n    sink ??= textSinkWrapper(null);\n\n    const objId = stream.dict?.objId;\n    const seenRefs = new RefSet(prevRefs);\n\n    if (objId) {\n      if (prevRefs?.has(objId)) {\n        throw new Error(\n          `getTextContent - ignoring circular reference: ${objId}`\n        );\n      }\n      seenRefs.put(objId);\n    }\n    // Ensure that `resources`/`stateManager` is correctly initialized,\n    // even if the provided parameter is e.g. `null`.\n    resources ||= Dict.empty;\n    stateManager ||= new StateManager(new TextState());\n\n    if (includeMarkedContent) {\n      markedContentData ||= { level: 0 };\n    }\n\n    const textContent = {\n      items: [],\n      styles: Object.create(null),\n      lang,\n    };\n    const textContentItem = {\n      initialized: false,\n      str: [],\n      totalWidth: 0,\n      totalHeight: 0,\n      width: 0,\n      height: 0,\n      vertical: false,\n      prevTransform: null,\n      prevTextRise: 0,\n      textAdvanceScale: 0,\n      spaceInFlowMin: 0,\n      spaceInFlowMax: 0,\n      trackingSpaceMin: Infinity,\n      negativeSpaceMax: -Infinity,\n      notASpace: -Infinity,\n      transform: null,\n      fontName: null,\n      hasEOL: false,\n    };\n\n    // Use a circular buffer (length === 2) to save the last chars in the\n    // text stream.\n    // This implementation of the circular buffer is using a fixed array\n    // and the position of the next element:\n    // function addElement(x) {\n    //   buffer[pos] = x;\n    //   pos = (pos + 1) % buffer.length;\n    // }\n    // It's a way faster than:\n    // function addElement(x) {\n    //   buffer.push(x);\n    //   buffer.shift();\n    // }\n    //\n    // It's useful to know when we need to add a whitespace in the\n    // text chunk.\n    const twoLastChars = [\" \", \" \"];\n    let twoLastCharsPos = 0;\n\n    /**\n     * Save the last char.\n     * @param {string} char\n     * @returns {boolean} true when the two last chars before adding the new one\n     * are a non-whitespace followed by a whitespace.\n     */\n    function saveLastChar(char) {\n      const nextPos = (twoLastCharsPos + 1) % 2;\n      const ret =\n        twoLastChars[twoLastCharsPos] !== \" \" && twoLastChars[nextPos] === \" \";\n      twoLastChars[twoLastCharsPos] = char;\n      twoLastCharsPos = nextPos;\n\n      return !keepWhiteSpace && ret;\n    }\n\n    function shouldAddWhitepsace() {\n      return (\n        !keepWhiteSpace &&\n        twoLastChars[twoLastCharsPos] !== \" \" &&\n        twoLastChars[(twoLastCharsPos + 1) % 2] === \" \"\n      );\n    }\n\n    function resetLastChars() {\n      twoLastChars[0] = twoLastChars[1] = \" \";\n      twoLastCharsPos = 0;\n    }\n\n    // Used in addFakeSpaces.\n\n    // A white <= fontSize * TRACKING_SPACE_FACTOR is a tracking space\n    // so it doesn't count as a space.\n    const TRACKING_SPACE_FACTOR = 0.102;\n\n    // When a white <= fontSize * NOT_A_SPACE_FACTOR, there is no space\n    // even if one is present in the text stream.\n    const NOT_A_SPACE_FACTOR = 0.03;\n\n    // A negative white < fontSize * NEGATIVE_SPACE_FACTOR induces\n    // a break (a new chunk of text is created).\n    // It doesn't change anything when the text is copied but\n    // it improves potential mismatch between text layer and canvas.\n    const NEGATIVE_SPACE_FACTOR = -0.2;\n\n    // A white with a width in [fontSize * MIN_FACTOR; fontSize * MAX_FACTOR]\n    // is a space which will be inserted in the current flow of words.\n    // If the width is outside of this range then the flow is broken\n    // (which means a new span in the text layer).\n    // It's useful to adjust the best as possible the span in the layer\n    // to what is displayed in the canvas.\n    const SPACE_IN_FLOW_MIN_FACTOR = 0.102;\n    const SPACE_IN_FLOW_MAX_FACTOR = 0.6;\n\n    // If a char is too high/too low compared to the previous we just create\n    // a new chunk.\n    // If the advance isn't in the +/-VERTICAL_SHIFT_RATIO * height range then\n    // a new chunk is created.\n    const VERTICAL_SHIFT_RATIO = 0.25;\n\n    const self = this;\n    const xref = this.xref;\n    const showSpacedTextBuffer = [];\n\n    // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd.\n    let xobjs = null;\n    const emptyXObjectCache = new LocalImageCache();\n    const emptyGStateCache = new LocalGStateCache();\n\n    const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n\n    let textState, currentTextState;\n\n    function pushWhitespace({\n      width = 0,\n      height = 0,\n      transform = textContentItem.prevTransform,\n      fontName = textContentItem.fontName,\n    }) {\n      intersector?.addExtraChar(\" \");\n      textContent.items.push({\n        str: \" \",\n        dir: \"ltr\",\n        width,\n        height,\n        transform,\n        fontName,\n        hasEOL: false,\n      });\n    }\n\n    function getCurrentTextTransform() {\n      // 9.4.4 Text Space Details\n      const font = textState.font;\n      const tsm = [\n        textState.fontSize * textState.textHScale,\n        0,\n        0,\n        textState.fontSize,\n        0,\n        textState.textRise,\n      ];\n\n      if (\n        font.isType3Font &&\n        (textState.fontSize <= 1 || font.isCharBBox) &&\n        !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX)\n      ) {\n        const glyphHeight = font.bbox[3] - font.bbox[1];\n        if (glyphHeight > 0) {\n          tsm[3] *= glyphHeight * textState.fontMatrix[3];\n        }\n      }\n\n      return Util.transform(\n        textState.ctm,\n        Util.transform(textState.textMatrix, tsm)\n      );\n    }\n\n    function ensureTextContentItem() {\n      if (textContentItem.initialized) {\n        return textContentItem;\n      }\n      const { font, loadedName } = textState;\n      if (!seenStyles.has(loadedName)) {\n        seenStyles.add(loadedName);\n        textContent.styles[loadedName] = {\n          fontFamily: font.fallbackName,\n          ascent: font.ascent,\n          descent: font.descent,\n          vertical: font.vertical,\n        };\n        if (self.options.fontExtraProperties && font.systemFontInfo) {\n          const style = textContent.styles[loadedName];\n          style.fontSubstitution = font.systemFontInfo.css;\n          style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName;\n        }\n      }\n      textContentItem.fontName = loadedName;\n\n      const trm = (textContentItem.transform = getCurrentTextTransform());\n      if (!font.vertical) {\n        textContentItem.width = textContentItem.totalWidth = 0;\n        textContentItem.height = textContentItem.totalHeight = Math.hypot(\n          trm[2],\n          trm[3]\n        );\n        textContentItem.vertical = false;\n      } else {\n        textContentItem.width = textContentItem.totalWidth = Math.hypot(\n          trm[0],\n          trm[1]\n        );\n        textContentItem.height = textContentItem.totalHeight = 0;\n        textContentItem.vertical = true;\n      }\n\n      const scaleLineX = Math.hypot(\n        textState.textLineMatrix[0],\n        textState.textLineMatrix[1]\n      );\n      const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);\n      textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;\n\n      const { fontSize } = textState;\n      textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR;\n      textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR;\n      textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR;\n      textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR;\n      textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR;\n      textContentItem.hasEOL = false;\n\n      textContentItem.initialized = true;\n      return textContentItem;\n    }\n\n    function updateAdvanceScale() {\n      if (!textContentItem.initialized) {\n        return;\n      }\n\n      const scaleLineX = Math.hypot(\n        textState.textLineMatrix[0],\n        textState.textLineMatrix[1]\n      );\n      const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);\n      const scaleFactor = scaleCtmX * scaleLineX;\n      if (scaleFactor === textContentItem.textAdvanceScale) {\n        return;\n      }\n\n      if (!textContentItem.vertical) {\n        textContentItem.totalWidth +=\n          textContentItem.width * textContentItem.textAdvanceScale;\n        textContentItem.width = 0;\n      } else {\n        textContentItem.totalHeight +=\n          textContentItem.height * textContentItem.textAdvanceScale;\n        textContentItem.height = 0;\n      }\n\n      textContentItem.textAdvanceScale = scaleFactor;\n    }\n\n    function runBidiTransform(textChunk) {\n      let text = textChunk.str.join(\"\");\n      if (!disableNormalization) {\n        text = normalizeUnicode(text);\n      }\n      const bidiResult = bidi(text, -1, textChunk.vertical);\n      return {\n        str: bidiResult.str,\n        dir: bidiResult.dir,\n        width: Math.abs(textChunk.totalWidth),\n        height: Math.abs(textChunk.totalHeight),\n        transform: textChunk.transform,\n        fontName: textChunk.fontName,\n        hasEOL: textChunk.hasEOL,\n      };\n    }\n\n    async function handleSetFont(fontName, fontRef) {\n      const translated = await self.loadFont(\n        fontName,\n        fontRef,\n        resources,\n        task,\n        /* fallbackFontDict = */ null,\n        /* cssFontInfo = */ null,\n        seenRefs\n      );\n\n      textState.loadedName = translated.loadedName;\n      textState.font = translated.font;\n      textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX;\n    }\n\n    function applyInverseRotation(x, y, matrix) {\n      const scale = Math.hypot(matrix[0], matrix[1]);\n      return [\n        (matrix[0] * x + matrix[1] * y) / scale,\n        (matrix[2] * x + matrix[3] * y) / scale,\n      ];\n    }\n\n    function compareWithLastPosition(glyphWidth) {\n      const currentTransform = getCurrentTextTransform();\n      let posX = currentTransform[4];\n      let posY = currentTransform[5];\n\n      // Check if the glyph is in the viewbox.\n      if (textState.font?.vertical) {\n        if (\n          posX < viewBox[0] ||\n          posX > viewBox[2] ||\n          posY + glyphWidth < viewBox[1] ||\n          posY > viewBox[3]\n        ) {\n          return false;\n        }\n      } else if (\n        posX + glyphWidth < viewBox[0] ||\n        posX > viewBox[2] ||\n        posY < viewBox[1] ||\n        posY > viewBox[3]\n      ) {\n        return false;\n      }\n\n      if (!textState.font || !textContentItem.prevTransform) {\n        return true;\n      }\n\n      let lastPosX = textContentItem.prevTransform[4];\n      let lastPosY = textContentItem.prevTransform[5];\n\n      if (lastPosX === posX && lastPosY === posY) {\n        return true;\n      }\n\n      let rotate = -1;\n      // Take into account the rotation is the current transform.\n      if (\n        currentTransform[0] &&\n        currentTransform[1] === 0 &&\n        currentTransform[2] === 0\n      ) {\n        rotate = currentTransform[0] > 0 ? 0 : 180;\n      } else if (\n        currentTransform[1] &&\n        currentTransform[0] === 0 &&\n        currentTransform[3] === 0\n      ) {\n        rotate = currentTransform[1] > 0 ? 90 : 270;\n      }\n\n      switch (rotate) {\n        case 0:\n          break;\n        case 90:\n          [posX, posY] = [posY, posX];\n          [lastPosX, lastPosY] = [lastPosY, lastPosX];\n          break;\n        case 180:\n          [posX, posY, lastPosX, lastPosY] = [\n            -posX,\n            -posY,\n            -lastPosX,\n            -lastPosY,\n          ];\n          break;\n        case 270:\n          [posX, posY] = [-posY, -posX];\n          [lastPosX, lastPosY] = [-lastPosY, -lastPosX];\n          break;\n        default:\n          // This is not a 0, 90, 180, 270 rotation so:\n          //  - remove the scale factor from the matrix to get a rotation matrix\n          //  - apply the inverse (which is the transposed) to the positions\n          // and we can then compare positions of the glyphs to detect\n          // a whitespace.\n          [posX, posY] = applyInverseRotation(posX, posY, currentTransform);\n          [lastPosX, lastPosY] = applyInverseRotation(\n            lastPosX,\n            lastPosY,\n            textContentItem.prevTransform\n          );\n      }\n\n      if (textState.font.vertical) {\n        const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale;\n        const advanceX = posX - lastPosX;\n\n        // When the total height of the current chunk is negative\n        // then we're writing from bottom to top.\n        const textOrientation = Math.sign(\n          textContentItem.height || textContentItem.totalHeight\n        );\n        if (advanceY < textOrientation * textContentItem.negativeSpaceMax) {\n          if (\n            Math.abs(advanceX) >\n            0.5 * textContentItem.width /* not the same column */\n          ) {\n            appendEOL();\n            return true;\n          }\n\n          resetLastChars();\n          flushTextContentItem();\n          return true;\n        }\n\n        if (Math.abs(advanceX) > textContentItem.width) {\n          appendEOL();\n          return true;\n        }\n\n        if (advanceY <= textOrientation * textContentItem.notASpace) {\n          // The real spacing between 2 consecutive chars is thin enough to be\n          // considered a non-space.\n          resetLastChars();\n        }\n\n        if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) {\n          if (shouldAddWhitepsace()) {\n            // The space is very thin, hence it deserves to have its own span in\n            // order to avoid too much shift between the canvas and the text\n            // layer.\n            resetLastChars();\n            flushTextContentItem();\n            pushWhitespace({ height: Math.abs(advanceY) });\n          } else {\n            textContentItem.height += advanceY;\n          }\n        } else if (\n          !addFakeSpaces(\n            advanceY,\n            textContentItem.prevTransform,\n            textOrientation\n          )\n        ) {\n          if (textContentItem.str.length === 0) {\n            resetLastChars();\n            pushWhitespace({ height: Math.abs(advanceY) });\n          } else {\n            textContentItem.height += advanceY;\n          }\n        }\n\n        if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) {\n          flushTextContentItem();\n        }\n\n        return true;\n      }\n\n      const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale;\n      const advanceY = posY - lastPosY;\n\n      // When the total width of the current chunk is negative\n      // then we're writing from right to left.\n      const textOrientation = Math.sign(\n        textContentItem.width || textContentItem.totalWidth\n      );\n      if (advanceX < textOrientation * textContentItem.negativeSpaceMax) {\n        if (\n          Math.abs(advanceY) >\n          0.5 * textContentItem.height /* not the same line */\n        ) {\n          appendEOL();\n          return true;\n        }\n\n        // We're moving back so in case the last char was a whitespace\n        // we cancel it: it doesn't make sense to insert it.\n        resetLastChars();\n        flushTextContentItem();\n        return true;\n      }\n\n      // Compensate for a textRise change (e.g. superscript/subscript dropping\n      // back to baseline): textRise is baked into posY/lastPosY via tsm[5] in\n      // getCurrentTextTransform(), scaled by the Y component of the CTM脳TM\n      // product, which equals currentTransform[3] / textState.fontSize.\n      // Without this correction a superscript whose textRise exceeds the line\n      // height triggers a spurious EOL when the rise returns to 0.\n      const textRiseDelta = textState.textRise - textContentItem.prevTextRise;\n      const advanceYCorrected =\n        textRiseDelta === 0\n          ? advanceY\n          : advanceY -\n            (currentTransform[3] / textState.fontSize) * textRiseDelta;\n      if (Math.abs(advanceYCorrected) > textContentItem.height) {\n        appendEOL();\n        return true;\n      }\n\n      if (advanceX <= textOrientation * textContentItem.notASpace) {\n        // The real spacing between 2 consecutive chars is thin enough to be\n        // considered a non-space.\n        resetLastChars();\n      }\n\n      if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) {\n        if (shouldAddWhitepsace()) {\n          // The space is very thin, hence it deserves to have its own span in\n          // order to avoid too much shift between the canvas and the text\n          // layer.\n          resetLastChars();\n          flushTextContentItem();\n          pushWhitespace({ width: Math.abs(advanceX) });\n        } else {\n          textContentItem.width += advanceX;\n        }\n      } else if (\n        !addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation)\n      ) {\n        if (textContentItem.str.length === 0) {\n          resetLastChars();\n          pushWhitespace({ width: Math.abs(advanceX) });\n        } else {\n          textContentItem.width += advanceX;\n        }\n      }\n\n      if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) {\n        flushTextContentItem();\n      }\n\n      return true;\n    }\n\n    function buildTextContentItem({ chars, extraSpacing }) {\n      if (\n        currentTextState !== textState &&\n        (currentTextState.fontSize !== textState.fontSize ||\n          (currentTextState.fontName !== textState.fontName &&\n            (currentTextState.font.name !== textState.font.name ||\n              currentTextState.font.vertical !== textState.font.vertical)))\n      ) {\n        flushTextContentItem();\n        currentTextState = textState.clone();\n      }\n\n      const font = textState.font;\n      const baseCharSpacing = font.vertical\n        ? -textState.charSpacing\n        : textState.charSpacing;\n      if (!chars) {\n        // Just move according to the space we have.\n        const charSpacing = baseCharSpacing + extraSpacing;\n        if (charSpacing) {\n          if (!font.vertical) {\n            textState.translateTextMatrix(\n              charSpacing * textState.textHScale,\n              0\n            );\n          } else {\n            textState.translateTextMatrix(0, -charSpacing);\n          }\n        }\n\n        if (keepWhiteSpace) {\n          compareWithLastPosition(0);\n        }\n\n        return;\n      }\n\n      const glyphs = font.charsToGlyphs(chars);\n      const scale = textState.fontMatrix[0] * textState.fontSize;\n\n      for (let i = 0, ii = glyphs.length; i < ii; i++) {\n        const glyph = glyphs[i];\n        const { category, originalCharCode } = glyph;\n\n        if (category.isInvisibleFormatMark) {\n          continue;\n        }\n        let charSpacing = baseCharSpacing + (i + 1 === ii ? extraSpacing : 0);\n\n        let glyphWidth = glyph.width;\n        if (font.vertical) {\n          glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth;\n        }\n        let scaledDim = glyphWidth * scale;\n\n        if (originalCharCode === 0x20) {\n          charSpacing += textState.wordSpacing;\n        }\n\n        if (!keepWhiteSpace && category.isWhitespace) {\n          // Don't push a \" \" in the textContentItem\n          // (except when it's between two non-spaces chars),\n          // it will be done (if required) in next call to\n          // compareWithLastPosition.\n          // This way we can merge real spaces and spaces due to cursor moves.\n          if (!font.vertical) {\n            charSpacing += scaledDim;\n            textState.translateTextMatrix(\n              charSpacing * textState.textHScale,\n              0\n            );\n          } else {\n            charSpacing += -scaledDim;\n            textState.translateTextMatrix(0, -charSpacing);\n          }\n          saveLastChar(\" \");\n          continue;\n        }\n\n        if (\n          !category.isZeroWidthDiacritic &&\n          !compareWithLastPosition(scaledDim)\n        ) {\n          // The glyph is not in page so just skip it but move the cursor.\n          if (!font.vertical) {\n            textState.translateTextMatrix(scaledDim * textState.textHScale, 0);\n          } else {\n            textState.translateTextMatrix(0, scaledDim);\n          }\n          continue;\n        }\n\n        // Must be called after compareWithLastPosition because\n        // the textContentItem could have been flushed.\n        const textChunk = ensureTextContentItem();\n        if (category.isZeroWidthDiacritic) {\n          scaledDim = 0;\n        }\n\n        if (!font.vertical) {\n          scaledDim *= textState.textHScale;\n          intersector?.addGlyph(\n            getCurrentTextTransform(),\n            scaledDim,\n            0,\n            glyph.unicode\n          );\n          textState.translateTextMatrix(scaledDim, 0);\n          textChunk.width += scaledDim;\n        } else {\n          intersector?.addGlyph(\n            getCurrentTextTransform(),\n            0,\n            scaledDim,\n            glyph.unicode\n          );\n          textState.translateTextMatrix(0, scaledDim);\n          scaledDim = Math.abs(scaledDim);\n          textChunk.height += scaledDim;\n        }\n\n        if (scaledDim) {\n          // Save the position of the last visible character.\n          textChunk.prevTransform = getCurrentTextTransform();\n          textChunk.prevTextRise = textState.textRise;\n        }\n\n        const glyphUnicode = glyph.unicode;\n        if (saveLastChar(glyphUnicode)) {\n          // The two last chars are a non-whitespace followed by a whitespace\n          // and then this non-whitespace, so we insert a whitespace here.\n          // Replaces all whitespaces with standard spaces (0x20), to avoid\n          // alignment issues between the textLayer and the canvas if the text\n          // contains e.g. tabs (fixes issue6612.pdf).\n          textChunk.str.push(\" \");\n          intersector?.addExtraChar(\" \");\n        }\n\n        if (!intersector) {\n          textChunk.str.push(glyphUnicode);\n        }\n\n        if (charSpacing) {\n          if (!font.vertical) {\n            textState.translateTextMatrix(\n              charSpacing * textState.textHScale,\n              0\n            );\n          } else {\n            textState.translateTextMatrix(0, -charSpacing);\n          }\n        }\n      }\n    }\n\n    function appendEOL() {\n      intersector?.addExtraChar(\"\\n\");\n      resetLastChars();\n      if (textContentItem.initialized) {\n        textContentItem.hasEOL = true;\n        flushTextContentItem();\n      } else {\n        textContent.items.push({\n          str: \"\",\n          dir: \"ltr\",\n          width: 0,\n          height: 0,\n          transform: getCurrentTextTransform(),\n          fontName: textState.loadedName,\n          hasEOL: true,\n        });\n      }\n    }\n\n    function addFakeSpaces(width, transf, textOrientation) {\n      if (\n        textOrientation * textContentItem.spaceInFlowMin <= width &&\n        width <= textOrientation * textContentItem.spaceInFlowMax\n      ) {\n        if (textContentItem.initialized) {\n          resetLastChars();\n          textContentItem.str.push(\" \");\n          intersector?.addExtraChar(\" \");\n        }\n        return false;\n      }\n\n      const fontName = textContentItem.fontName;\n\n      let height = 0;\n      if (textContentItem.vertical) {\n        height = width;\n        width = 0;\n      }\n\n      flushTextContentItem();\n      resetLastChars();\n      pushWhitespace({\n        width: Math.abs(width),\n        height: Math.abs(height),\n        transform: transf || getCurrentTextTransform(),\n        fontName,\n      });\n\n      return true;\n    }\n\n    function flushTextContentItem() {\n      if (!textContentItem.initialized || !textContentItem.str) {\n        return;\n      }\n\n      // Do final text scaling.\n      if (!textContentItem.vertical) {\n        textContentItem.totalWidth +=\n          textContentItem.width * textContentItem.textAdvanceScale;\n      } else {\n        textContentItem.totalHeight +=\n          textContentItem.height * textContentItem.textAdvanceScale;\n      }\n\n      textContent.items.push(runBidiTransform(textContentItem));\n      textContentItem.initialized = false;\n      textContentItem.str.length = 0;\n    }\n\n    function enqueueChunk(batch = false) {\n      const length = textContent.items.length;\n      if (length === 0) {\n        return;\n      }\n      if (batch && length < TEXT_CHUNK_BATCH_SIZE) {\n        return;\n      }\n      sink.enqueue(textContent, length);\n      textContent.items = [];\n      textContent.styles = Object.create(null);\n    }\n\n    const timeSlotManager = new TimeSlotManager();\n\n    return new Promise(function promiseBody(resolve, reject) {\n      const next = function (promise) {\n        enqueueChunk(/* batch = */ true);\n        Promise.all([promise, sink.ready]).then(function () {\n          try {\n            promiseBody(resolve, reject);\n          } catch (ex) {\n            reject(ex);\n          }\n        }, reject);\n      };\n      task.ensureNotTerminated();\n      timeSlotManager.reset();\n\n      const operation = {};\n      let stop,\n        name,\n        isValidName,\n        args = [];\n      while (!(stop = timeSlotManager.check())) {\n        // The arguments parsed by read() are not used beyond this loop, so\n        // we can reuse the same array on every iteration, thus avoiding\n        // unnecessary allocations.\n        args.length = 0;\n        operation.args = args;\n        if (!preprocessor.read(operation)) {\n          break;\n        }\n\n        // preprocessor.read() already handles save, restore and transform\n        // operations, so we don't need to worry about them here.\n\n        textState = stateManager.state;\n        currentTextState ||= textState.clone();\n        const fn = operation.fn;\n        args = operation.args;\n\n        switch (fn | 0) {\n          case OPS.setFont:\n            // Optimization to ignore multiple identical Tf commands.\n            const fontNameArg = args[0].name,\n              fontSizeArg = args[1];\n            if (\n              textState.font &&\n              fontNameArg === textState.fontName &&\n              fontSizeArg === textState.fontSize\n            ) {\n              break;\n            }\n\n            textState.fontName = fontNameArg;\n            textState.fontSize = fontSizeArg;\n            next(handleSetFont(fontNameArg, null));\n            return;\n          case OPS.setTextRise:\n            textState.textRise = args[0];\n            break;\n          case OPS.setHScale:\n            textState.textHScale = args[0] / 100;\n            break;\n          case OPS.setLeading:\n            textState.leading = args[0];\n            break;\n          case OPS.moveText:\n            textState.translateTextLineMatrix(args[0], args[1]);\n            textState.textMatrix = textState.textLineMatrix.slice();\n            break;\n          case OPS.setLeadingMoveText:\n            textState.leading = -args[1];\n            textState.translateTextLineMatrix(args[0], args[1]);\n            textState.textMatrix = textState.textLineMatrix.slice();\n            break;\n          case OPS.nextLine:\n            textState.carriageReturn();\n            break;\n          case OPS.setTextMatrix:\n            textState.setTextMatrix(\n              args[0],\n              args[1],\n              args[2],\n              args[3],\n              args[4],\n              args[5]\n            );\n            textState.setTextLineMatrix(\n              args[0],\n              args[1],\n              args[2],\n              args[3],\n              args[4],\n              args[5]\n            );\n            updateAdvanceScale();\n            break;\n          case OPS.setCharSpacing:\n            textState.charSpacing = args[0];\n            break;\n          case OPS.setWordSpacing:\n            textState.wordSpacing = args[0];\n            break;\n          case OPS.beginText:\n            textState.textMatrix = IDENTITY_MATRIX.slice();\n            textState.textLineMatrix = IDENTITY_MATRIX.slice();\n            break;\n          case OPS.showSpacedText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n\n            const spaceFactor =\n              ((textState.font.vertical ? 1 : -1) * textState.fontSize) / 1000;\n            const elements = args[0];\n            for (let i = 0, ii = elements.length; i < ii; i++) {\n              const item = elements[i];\n              if (typeof item === \"string\") {\n                showSpacedTextBuffer.push(item);\n              } else if (typeof item === \"number\" && item !== 0) {\n                // PDF Specification 5.3.2 states:\n                // The number is expressed in thousandths of a unit of text\n                // space.\n                // This amount is subtracted from the current horizontal or\n                // vertical coordinate, depending on the writing mode.\n                // In the default coordinate system, a positive adjustment\n                // has the effect of moving the next glyph painted either to\n                // the left or down by the given amount.\n                const str = showSpacedTextBuffer.join(\"\");\n                showSpacedTextBuffer.length = 0;\n                buildTextContentItem({\n                  chars: str,\n                  extraSpacing: item * spaceFactor,\n                });\n              }\n            }\n\n            if (showSpacedTextBuffer.length > 0) {\n              const str = showSpacedTextBuffer.join(\"\");\n              showSpacedTextBuffer.length = 0;\n              buildTextContentItem({\n                chars: str,\n                extraSpacing: 0,\n              });\n            }\n            break;\n          case OPS.showText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n            buildTextContentItem({\n              chars: args[0],\n              extraSpacing: 0,\n            });\n            break;\n          case OPS.nextLineShowText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n            textState.carriageReturn();\n            buildTextContentItem({\n              chars: args[0],\n              extraSpacing: 0,\n            });\n            break;\n          case OPS.nextLineSetSpacingShowText:\n            if (!stateManager.state.font) {\n              self.ensureStateFont(stateManager.state);\n              continue;\n            }\n            textState.wordSpacing = args[0];\n            textState.charSpacing = args[1];\n            textState.carriageReturn();\n            buildTextContentItem({\n              chars: args[2],\n              extraSpacing: 0,\n            });\n            break;\n          case OPS.paintXObject:\n            flushTextContentItem();\n            xobjs ??= resources.get(\"XObject\") || Dict.empty;\n\n            isValidName = args[0] instanceof Name;\n            name = args[0].name;\n\n            if (isValidName && emptyXObjectCache.getByName(name)) {\n              break;\n            }\n\n            next(\n              new Promise(function (resolveXObject, rejectXObject) {\n                if (!isValidName) {\n                  throw new FormatError(\"XObject must be referred to by name.\");\n                }\n\n                let xobj = xobjs.getRaw(name);\n                if (xobj instanceof Ref) {\n                  if (emptyXObjectCache.getByRef(xobj)) {\n                    resolveXObject();\n                    return;\n                  }\n\n                  const globalImage = self.globalImageCache.getData(\n                    xobj,\n                    self.pageIndex\n                  );\n                  if (globalImage) {\n                    resolveXObject();\n                    return;\n                  }\n\n                  xobj = xref.fetch(xobj);\n                }\n\n                if (!(xobj instanceof BaseStream)) {\n                  throw new FormatError(\"XObject should be a stream\");\n                }\n                const { dict } = xobj;\n\n                const type = dict.get(\"Subtype\");\n                if (!(type instanceof Name)) {\n                  throw new FormatError(\"XObject should have a Name subtype\");\n                }\n\n                if (type.name !== \"Form\") {\n                  emptyXObjectCache.set(name, dict.objId, true);\n\n                  resolveXObject();\n                  return;\n                }\n\n                // Use a new `StateManager` to prevent incorrect positioning\n                // of textItems *after* the Form XObject, since errors in the\n                // data can otherwise prevent `restore` operators from\n                // executing.\n                // NOTE: Only an issue when `options.ignoreErrors === true`.\n                const currentState = stateManager.state.clone();\n                const xObjStateManager = new StateManager(currentState);\n\n                const matrix = lookupMatrix(dict.getArray(\"Matrix\"), null);\n                if (matrix) {\n                  xObjStateManager.transform(matrix);\n                }\n\n                const localResources = dict.get(\"Resources\");\n\n                // Enqueue the `textContent` chunk before parsing the /Form\n                // XObject.\n                enqueueChunk();\n                const sinkWrapper = textSinkWrapper(sink);\n\n                self\n                  .getTextContent({\n                    stream: xobj,\n                    task,\n                    resources:\n                      localResources instanceof Dict\n                        ? localResources\n                        : resources,\n                    stateManager: xObjStateManager,\n                    includeMarkedContent,\n                    sink: sinkWrapper,\n                    seenStyles,\n                    viewBox,\n                    lang,\n                    markedContentData,\n                    disableNormalization,\n                    keepWhiteSpace,\n                    prevRefs: seenRefs,\n                  })\n                  .then(function () {\n                    if (!sinkWrapper.enqueueInvoked) {\n                      emptyXObjectCache.set(name, dict.objId, true);\n                    }\n                    resolveXObject();\n                  }, rejectXObject);\n              }).catch(function (reason) {\n                if (reason instanceof AbortException) {\n                  return;\n                }\n                if (self.options.ignoreErrors) {\n                  // Error(s) in the XObject -- allow text-extraction to\n                  // continue.\n                  warn(`getTextContent - ignoring XObject: \"${reason}\".`);\n                  return;\n                }\n                throw reason;\n              })\n            );\n            return;\n          case OPS.setGState:\n            isValidName = args[0] instanceof Name;\n            name = args[0].name;\n\n            if (isValidName && emptyGStateCache.getByName(name)) {\n              break;\n            }\n\n            next(\n              new Promise(function (resolveGState, rejectGState) {\n                if (!isValidName) {\n                  throw new FormatError(\"GState must be referred to by name.\");\n                }\n\n                const extGState = resources.get(\"ExtGState\");\n                if (!(extGState instanceof Dict)) {\n                  throw new FormatError(\"ExtGState should be a dictionary.\");\n                }\n\n                const gState = extGState.get(name);\n                // TODO: Attempt to lookup cached GStates by reference as well,\n                //       if and only if there are PDF documents where doing so\n                //       would significantly improve performance.\n                if (!(gState instanceof Dict)) {\n                  throw new FormatError(\"GState should be a dictionary.\");\n                }\n\n                const gStateFont = gState.get(\"Font\");\n                if (!gStateFont) {\n                  emptyGStateCache.set(name, gState.objId, true);\n\n                  resolveGState();\n                  return;\n                }\n                flushTextContentItem();\n\n                textState.fontName = null;\n                textState.fontSize = gStateFont[1];\n                handleSetFont(null, gStateFont[0]).then(\n                  resolveGState,\n                  rejectGState\n                );\n              }).catch(function (reason) {\n                if (reason instanceof AbortException) {\n                  return;\n                }\n                if (self.options.ignoreErrors) {\n                  // Error(s) in the ExtGState -- allow text-extraction to\n                  // continue.\n                  warn(`getTextContent - ignoring ExtGState: \"${reason}\".`);\n                  return;\n                }\n                throw reason;\n              })\n            );\n            return;\n          case OPS.beginMarkedContent:\n            flushTextContentItem();\n            if (includeMarkedContent) {\n              markedContentData.level++;\n\n              textContent.items.push({\n                type: \"beginMarkedContent\",\n                tag: args[0] instanceof Name ? args[0].name : null,\n              });\n            }\n            break;\n          case OPS.beginMarkedContentProps:\n            flushTextContentItem();\n            if (includeMarkedContent) {\n              markedContentData.level++;\n\n              const mcid = args[1] instanceof Dict ? args[1].get(\"MCID\") : null;\n              textContent.items.push({\n                type: \"beginMarkedContentProps\",\n                id: Number.isInteger(mcid)\n                  ? `${self.idFactory.getPageObjId()}_mc${mcid}`\n                  : null,\n                tag: args[0] instanceof Name ? args[0].name : null,\n              });\n            }\n            break;\n          case OPS.endMarkedContent:\n            flushTextContentItem();\n            if (includeMarkedContent) {\n              if (markedContentData.level === 0) {\n                // Handle unbalanced beginMarkedContent/endMarkedContent\n                // operators (fixes issue15629.pdf).\n                break;\n              }\n              markedContentData.level--;\n\n              textContent.items.push({\n                type: \"endMarkedContent\",\n              });\n            }\n            break;\n        } // switch\n        if (textContent.items.length >= sink.desiredSize) {\n          // Wait for ready, if we reach highWaterMark.\n          stop = true;\n          break;\n        }\n      } // while\n      if (stop) {\n        next(deferred);\n        return;\n      }\n      flushTextContentItem();\n      enqueueChunk();\n      resolve();\n    }).catch(reason => {\n      if (reason instanceof AbortException) {\n        return;\n      }\n      if (this.options.ignoreErrors) {\n        // Error(s) in the TextContent -- allow text-extraction to continue.\n        warn(\n          `getTextContent - ignoring errors during \"${task.name}\" ` +\n            `task: \"${reason}\".`\n        );\n\n        flushTextContentItem();\n        enqueueChunk();\n        return;\n      }\n      throw reason;\n    });\n  }\n\n  async extractDataStructures(dict, properties) {\n    const xref = this.xref;\n    let cidToGidBytes;\n    // 9.10.2\n    const toUnicodePromise = this.readToUnicode(properties.toUnicode);\n\n    if (properties.composite) {\n      // CIDSystemInfo helps to match CID to glyphs\n      const cidSystemInfo = dict.get(\"CIDSystemInfo\");\n      if (cidSystemInfo instanceof Dict && !properties.cidSystemInfo) {\n        properties.cidSystemInfo = {\n          registry: stringToPDFString(cidSystemInfo.get(\"Registry\")),\n          ordering: stringToPDFString(cidSystemInfo.get(\"Ordering\")),\n          supplement: cidSystemInfo.get(\"Supplement\"),\n        };\n      }\n\n      try {\n        const cidToGidMap = dict.get(\"CIDToGIDMap\");\n        if (cidToGidMap instanceof BaseStream) {\n          cidToGidBytes = cidToGidMap.getBytes();\n        }\n      } catch (ex) {\n        if (!this.options.ignoreErrors) {\n          throw ex;\n        }\n        warn(`extractDataStructures - ignoring CIDToGIDMap data: \"${ex}\".`);\n      }\n    }\n\n    // Based on 9.6.6 of the spec the encoding can come from multiple places\n    // and depends on the font type. The base encoding and differences are\n    // read here, but the encoding that is actually used is chosen during\n    // glyph mapping in the font.\n    // TODO: Loading the built in encoding in the font would allow the\n    // differences to be merged in here not require us to hold on to it.\n    const differences = [];\n    let baseEncodingName = null;\n    let encoding;\n    if (dict.has(\"Encoding\")) {\n      encoding = dict.get(\"Encoding\");\n      if (encoding instanceof Dict) {\n        baseEncodingName = encoding.get(\"BaseEncoding\");\n        baseEncodingName =\n          baseEncodingName instanceof Name ? baseEncodingName.name : null;\n        // Load the differences between the base and original\n        if (encoding.has(\"Differences\")) {\n          const diffEncoding = encoding.get(\"Differences\");\n          let index = 0;\n          for (const entry of diffEncoding) {\n            const data = xref.fetchIfRef(entry);\n            if (typeof data === \"number\") {\n              index = data;\n            } else if (data instanceof Name) {\n              differences[index++] = data.name;\n            } else {\n              throw new FormatError(\n                `Invalid entry in 'Differences' array: ${data}`\n              );\n            }\n          }\n        }\n      } else if (encoding instanceof Name) {\n        baseEncodingName = encoding.name;\n      } else {\n        const msg = \"Encoding is not a Name nor a Dict\";\n\n        if (!this.options.ignoreErrors) {\n          throw new FormatError(msg);\n        }\n        warn(msg);\n      }\n      // According to table 114 if the encoding is a named encoding it must be\n      // one of these predefined encodings.\n      if (\n        baseEncodingName !== \"MacRomanEncoding\" &&\n        baseEncodingName !== \"MacExpertEncoding\" &&\n        baseEncodingName !== \"WinAnsiEncoding\"\n      ) {\n        baseEncodingName = null;\n      }\n    }\n\n    const nonEmbeddedFont = !properties.file || properties.isInternalFont,\n      isSymbolsFontName = getSymbolsFonts()[properties.name];\n    // Ignore an incorrectly specified named encoding for non-embedded\n    // symbol fonts (fixes issue16464.pdf).\n    if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) {\n      baseEncodingName = null;\n    }\n\n    // Ignore incorrectly specified WinAnsiEncoding for non-embedded CJK fonts\n    // (fixes issue20489). Some chinese fonts often have WinAnsiEncoding in the\n    // PDF even though they should use Identity-H or GB-EUC-H encoding.\n    if (\n      baseEncodingName === \"WinAnsiEncoding\" &&\n      nonEmbeddedFont &&\n      properties.name?.charCodeAt(0) >= 0xb7\n    ) {\n      const fontName = properties.name;\n      // This list is built from some names from Pdfium and mupdf:\n      //  - https://pdfium.googlesource.com/pdfium/+/master/core/fpdfapi/font/cpdf_font.cpp#41\n      //  - https://fossies.org/linux/mupdf/source/pdf/pdf-font.c#l_820\n      const chineseFontNames = [\n        \"\\xCB\\xCE\\xCC\\xE5\", // SimSun\n        \"\\xBA\\xDA\\xCC\\xE5\", // SimHei\n        \"\\xBF\\xAC\\xCC\\xE5\", // SimKai\n        \"\\xB7\\xC2\\xCB\\xCE\", // SimFang\n        \"\\xBF\\xAC\\xCC\\xE5_GB2312\", // SimKai\n        \"\\xB7\\xC2\\xCB\\xCE_GB2312\", // SimFang\n        \"\\xC1\\xA5\\xCA\\xE9\", // SimLi\n        \"\\xD0\\xC2\\xCB\\xCE\", // SimSun\n        \"\\xB7\\xC2\\xCB\\xCE\\xCC\\xE5\", // SimFang variant\n        \"\\xD0\\xA1\\xB1\\xEA\\xCB\\xCE\", // XiaoBiaoSong\n      ];\n\n      // Check for common Chinese font names and their GBK-encoded equivalents\n      // (which may appear as Latin-1 when incorrectly decoded).\n      if (chineseFontNames.includes(fontName)) {\n        baseEncodingName = null;\n        properties.defaultEncoding = \"Adobe-GB1-UCS2\";\n        properties.composite = true;\n        properties.cidEncoding = Name.get(\"GBK-EUC-H\");\n        const cMap = await CMapFactory.create({\n          encoding: properties.cidEncoding,\n          fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n          useCMap: null,\n        });\n        properties.cMap = cMap;\n        properties.vertical = properties.cMap.vertical;\n        properties.cidSystemInfo = {\n          registry: \"Adobe\",\n          ordering: \"GB1\",\n          supplement: 0,\n        };\n      }\n    }\n\n    if (baseEncodingName) {\n      properties.defaultEncoding = getEncoding(baseEncodingName);\n    } else {\n      let isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n      const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic);\n\n      // The PDF specs state that the flags Symbolic and Nonsymbolic must be\n      // mutually exclusive. However, some fonts are marked as both.\n      // In that case we ignore the Symbolic flag when there is a Differences\n      // entry (which indicates that the font is used as a non-symbolic\n      // font).\n      if (\n        properties.type === \"TrueType\" &&\n        isSymbolicFont &&\n        isNonsymbolicFont &&\n        differences.length !== 0\n      ) {\n        properties.flags &= ~FontFlags.Symbolic;\n        isSymbolicFont = false;\n      }\n\n      // According to \"Table 114\" in section \"9.6.6.1 General\" (under\n      // \"9.6.6 Character Encoding\") of the PDF specification, a Nonsymbolic\n      // font should use the `StandardEncoding` if no encoding is specified.\n      encoding = StandardEncoding;\n      if (properties.type === \"TrueType\" && !isNonsymbolicFont) {\n        encoding = WinAnsiEncoding;\n      }\n      // The Symbolic attribute can be misused for regular fonts\n      // Heuristic: we have to check if the font is a standard one also\n      if (isSymbolicFont || isSymbolsFontName) {\n        encoding = MacRomanEncoding;\n        if (nonEmbeddedFont) {\n          if (/Symbol/i.test(properties.name)) {\n            encoding = SymbolSetEncoding;\n          } else if (/Dingbats/i.test(properties.name)) {\n            encoding = ZapfDingbatsEncoding;\n          } else if (/Wingdings/i.test(properties.name)) {\n            encoding = WinAnsiEncoding;\n          }\n        }\n      }\n      properties.defaultEncoding = encoding;\n    }\n\n    properties.differences = differences;\n    properties.baseEncodingName = baseEncodingName;\n    properties.hasEncoding = !!baseEncodingName || differences.length > 0;\n    properties.dict = dict;\n\n    properties.toUnicode = await toUnicodePromise;\n\n    const builtToUnicode = await this.buildToUnicode(properties);\n    properties.toUnicode = builtToUnicode;\n\n    if (cidToGidBytes) {\n      properties.cidToGidMap = this.readCidToGidMap(\n        cidToGidBytes,\n        builtToUnicode\n      );\n    }\n    return properties;\n  }\n\n  /**\n   * @returns {Array}\n   * @private\n   */\n  _simpleFontToUnicode(properties, forceGlyphs = false) {\n    assert(!properties.composite, \"Must be a simple font.\");\n\n    const toUnicode = [];\n    const encoding = properties.defaultEncoding.slice();\n    const baseEncodingName = properties.baseEncodingName;\n    // Merge in the differences array.\n    const differences = properties.differences;\n    for (const charcode in differences) {\n      const glyphName = differences[charcode];\n      if (glyphName === \".notdef\") {\n        // Skip .notdef to prevent rendering errors, e.g. boxes appearing\n        // where there should be spaces (fixes issue5256.pdf).\n        continue;\n      }\n      encoding[charcode] = glyphName;\n    }\n    const glyphsUnicodeMap = getGlyphsUnicode();\n    for (const charcode in encoding) {\n      // a) Map the character code to a character name.\n      let glyphName = encoding[charcode];\n      if (glyphName === \"\") {\n        continue;\n      }\n      // b) Look up the character name in the Adobe Glyph List (see the\n      //    Bibliography) to obtain the corresponding Unicode value.\n      let unicode = glyphsUnicodeMap[glyphName];\n      if (unicode !== undefined) {\n        toUnicode[charcode] = String.fromCharCode(unicode);\n        continue;\n      }\n      // (undocumented) c) Few heuristics to recognize unknown glyphs\n      // NOTE: Adobe Reader does not do this step, but OSX Preview does\n      let code = 0;\n      switch (glyphName[0]) {\n        case \"G\": // Gxx glyph\n          if (glyphName.length === 3) {\n            code = parseInt(glyphName.substring(1), 16);\n          }\n          break;\n        case \"g\": // g00xx glyph\n          if (glyphName.length === 5) {\n            code = parseInt(glyphName.substring(1), 16);\n          }\n          break;\n        case \"C\": // Cdd{d} glyph\n        case \"c\": // cdd{d} glyph\n          if (glyphName.length >= 3 && glyphName.length <= 4) {\n            const codeStr = glyphName.substring(1);\n\n            if (forceGlyphs) {\n              code = parseInt(codeStr, 16);\n              break;\n            }\n            // Normally the Cdd{d}/cdd{d} glyphName format will contain\n            // regular, i.e. base 10, charCodes (see issue4550.pdf)...\n            code = +codeStr;\n\n            // ... however some PDF generators violate that assumption by\n            // containing glyph, i.e. base 16, codes instead.\n            // In that case we need to re-parse the *entire* encoding to\n            // prevent broken text-selection (fixes issue9655_reduced.pdf).\n            if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) {\n              return this._simpleFontToUnicode(\n                properties,\n                /* forceGlyphs */ true\n              );\n            }\n          }\n          break;\n        case \"u\": // 'uniXXXX'/'uXXXX{XX}' glyphs\n          unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);\n          if (unicode !== -1) {\n            code = unicode;\n          }\n          break;\n        default:\n          // Support (some) non-standard ligatures.\n          switch (glyphName) {\n            case \"f_h\":\n            case \"f_t\":\n            case \"T_h\":\n              toUnicode[charcode] = glyphName.replaceAll(\"_\", \"\");\n              continue;\n          }\n          break;\n      }\n      if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) {\n        // If `baseEncodingName` is one the predefined encodings, and `code`\n        // equals `charcode`, using the glyph defined in the baseEncoding\n        // seems to yield a better `toUnicode` mapping (fixes issue 5070).\n        if (baseEncodingName && code === +charcode) {\n          const baseEncoding = getEncoding(baseEncodingName);\n          if (baseEncoding && (glyphName = baseEncoding[charcode])) {\n            toUnicode[charcode] = String.fromCharCode(\n              glyphsUnicodeMap[glyphName]\n            );\n            continue;\n          }\n        }\n        toUnicode[charcode] = String.fromCodePoint(code);\n      }\n    }\n    return toUnicode;\n  }\n\n  /**\n   * Builds a char code to unicode map based on section 9.10 of the spec.\n   * @param {Object} properties Font properties object.\n   * @returns {Promise} A Promise that is resolved with a\n   *   {ToUnicodeMap|IdentityToUnicodeMap} object.\n   */\n  async buildToUnicode(properties) {\n    properties.hasIncludedToUnicodeMap = properties.toUnicode?.length > 0;\n\n    // Section 9.10.2 Mapping Character Codes to Unicode Values\n    if (properties.hasIncludedToUnicodeMap) {\n      // Some fonts contain incomplete ToUnicode data, causing issues with\n      // text-extraction. For simple fonts, containing encoding information,\n      // use a fallback ToUnicode map to improve this (fixes issue8229.pdf).\n      if (!properties.composite && properties.hasEncoding) {\n        properties.fallbackToUnicode = this._simpleFontToUnicode(properties);\n      }\n      return properties.toUnicode;\n    }\n\n    // According to the spec if the font is a simple font we should only map\n    // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or\n    // the differences array only contains adobe standard or symbol set names,\n    // in practice it seems better to always try to create a toUnicode map\n    // based of the default encoding.\n    if (!properties.composite /* is simple font */) {\n      return new ToUnicodeMap(this._simpleFontToUnicode(properties));\n    }\n\n    // If the font is a composite font that uses one of the predefined CMaps\n    // listed in Table 118 (except Identity鈥揌 and Identity鈥揤) or whose\n    // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or\n    // Adobe-Korea1 character collection:\n    if (\n      properties.composite &&\n      ((properties.cMap.builtInCMap &&\n        !(properties.cMap instanceof IdentityCMap)) ||\n        // The font is supposed to have a CIDSystemInfo dictionary, but some\n        // PDFs don't include it (fixes issue 17689), hence the `?'.\n        (properties.cidSystemInfo?.registry === \"Adobe\" &&\n          (properties.cidSystemInfo.ordering === \"GB1\" ||\n            properties.cidSystemInfo.ordering === \"CNS1\" ||\n            properties.cidSystemInfo.ordering === \"Japan1\" ||\n            properties.cidSystemInfo.ordering === \"Korea1\")))\n    ) {\n      // Then:\n      // a) Map the character code to a character identifier (CID) according\n      // to the font鈥檚 CMap.\n      // b) Obtain the registry and ordering of the character collection used\n      // by the font鈥檚 CMap (for example, Adobe and Japan1) from its\n      // CIDSystemInfo dictionary.\n      const { registry, ordering } = properties.cidSystemInfo;\n      // c) Construct a second CMap name by concatenating the registry and\n      // ordering obtained in step (b) in the format registry鈥搊rdering鈥揢CS2\n      // (for example, Adobe鈥揓apan1鈥揢CS2).\n      const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`);\n      // d) Obtain the CMap with the name constructed in step (c) (available\n      // from the ASN Web site; see the Bibliography).\n      const ucs2CMap = await CMapFactory.create({\n        encoding: ucs2CMapName,\n        fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n        useCMap: null,\n      });\n      const toUnicode = [],\n        buf = [];\n      properties.cMap.forEach(function (charcode, cid) {\n        if (cid > 0xffff) {\n          throw new FormatError(\"Max size of CID is 65,535\");\n        }\n        // e) Map the CID obtained in step (a) according to the CMap\n        // obtained in step (d), producing a Unicode value.\n        const ucs2 = ucs2CMap.lookup(cid);\n        if (ucs2) {\n          buf.length = 0;\n          // Support multi-byte entries (fixes issue16176.pdf).\n          for (let i = 0, ii = ucs2.length; i < ii; i += 2) {\n            buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1));\n          }\n          toUnicode[charcode] = String.fromCharCode(...buf);\n        }\n      });\n      return new ToUnicodeMap(toUnicode);\n    }\n\n    // The viewer's choice, just use an identity map.\n    return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar);\n  }\n\n  async readToUnicode(cmapObj) {\n    if (!cmapObj) {\n      return null;\n    }\n    if (cmapObj instanceof Name) {\n      const cmap = await CMapFactory.create({\n        encoding: cmapObj,\n        fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n        useCMap: null,\n      });\n\n      if (cmap instanceof IdentityCMap) {\n        return new IdentityToUnicodeMap(0, 0xffff);\n      }\n      return new ToUnicodeMap(cmap.getMap());\n    }\n    if (cmapObj instanceof BaseStream) {\n      try {\n        const cmap = await CMapFactory.create({\n          encoding: cmapObj,\n          fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n          useCMap: null,\n        });\n\n        if (cmap instanceof IdentityCMap) {\n          return new IdentityToUnicodeMap(0, 0xffff);\n        }\n        const map = new Array(cmap.length);\n        // Convert UTF-16BE\n        // NOTE: cmap can be a sparse array, so use forEach instead of\n        // `for(;;)` to iterate over all keys.\n        cmap.forEach(function (charCode, token) {\n          // Some cmaps contain *only* CID characters (fixes issue9367.pdf).\n          if (typeof token === \"number\") {\n            map[charCode] = String.fromCodePoint(token);\n            return;\n          }\n          // Add back omitted leading zeros on odd length tokens\n          // (fixes issue #18099)\n          if (token.length % 2 !== 0) {\n            token = \"\\u0000\" + token;\n          }\n          const str = [];\n          for (let k = 0; k < token.length; k += 2) {\n            const w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);\n            if ((w1 & 0xf800) !== 0xd800) {\n              // w1 < 0xD800 || w1 > 0xDFFF\n              str.push(w1);\n              continue;\n            }\n            k += 2;\n            const w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);\n            str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);\n          }\n          map[charCode] = String.fromCodePoint(...str);\n        });\n        return new ToUnicodeMap(map);\n      } catch (reason) {\n        if (reason instanceof AbortException) {\n          return null;\n        }\n        if (this.options.ignoreErrors) {\n          warn(`readToUnicode - ignoring ToUnicode data: \"${reason}\".`);\n          return null;\n        }\n        throw reason;\n      }\n    }\n    return null;\n  }\n\n  readCidToGidMap(glyphsData, toUnicode) {\n    // Extract the encoding from the CIDToGIDMap\n\n    // Set encoding 0 to later verify the font has an encoding\n    const result = [];\n    for (let j = 0, jj = glyphsData.length; j < jj; j++) {\n      const glyphID = (glyphsData[j++] << 8) | glyphsData[j];\n      const code = j >> 1;\n      if (glyphID === 0 && !toUnicode.has(code)) {\n        continue;\n      }\n      result[code] = glyphID;\n    }\n    return result;\n  }\n\n  extractWidths(dict, descriptor, properties) {\n    const xref = this.xref;\n    let glyphsWidths = [];\n    let defaultWidth = 0;\n    const glyphsVMetrics = [];\n    let defaultVMetrics;\n    if (properties.composite) {\n      const dw = dict.get(\"DW\");\n      defaultWidth = typeof dw === \"number\" ? Math.ceil(dw) : 1000;\n\n      const widths = dict.get(\"W\");\n      if (Array.isArray(widths)) {\n        for (let i = 0, ii = widths.length; i < ii; i++) {\n          let start = xref.fetchIfRef(widths[i++]);\n          if (!Number.isInteger(start)) {\n            break; // Invalid /W data.\n          }\n          const code = xref.fetchIfRef(widths[i]);\n\n          if (Array.isArray(code)) {\n            for (const c of code) {\n              const width = xref.fetchIfRef(c);\n              if (typeof width === \"number\") {\n                glyphsWidths[start] = width;\n              }\n              start++;\n            }\n          } else if (Number.isInteger(code)) {\n            const width = xref.fetchIfRef(widths[++i]);\n            if (typeof width !== \"number\") {\n              continue;\n            }\n            for (let j = start; j <= code; j++) {\n              glyphsWidths[j] = width;\n            }\n          } else {\n            break; // Invalid /W data.\n          }\n        }\n      }\n\n      if (properties.vertical) {\n        const dw2 = dict.getArray(\"DW2\");\n        let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000];\n        defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];\n        vmetrics = dict.get(\"W2\");\n        if (Array.isArray(vmetrics)) {\n          for (let i = 0, ii = vmetrics.length; i < ii; i++) {\n            let start = xref.fetchIfRef(vmetrics[i++]);\n            if (!Number.isInteger(start)) {\n              break; // Invalid /W2 data.\n            }\n            const code = xref.fetchIfRef(vmetrics[i]);\n\n            if (Array.isArray(code)) {\n              for (let j = 0, jj = code.length; j < jj; j++) {\n                const vmetric = [\n                  xref.fetchIfRef(code[j++]),\n                  xref.fetchIfRef(code[j++]),\n                  xref.fetchIfRef(code[j]),\n                ];\n                if (isNumberArray(vmetric, null)) {\n                  glyphsVMetrics[start] = vmetric;\n                }\n                start++;\n              }\n            } else if (Number.isInteger(code)) {\n              const vmetric = [\n                xref.fetchIfRef(vmetrics[++i]),\n                xref.fetchIfRef(vmetrics[++i]),\n                xref.fetchIfRef(vmetrics[++i]),\n              ];\n              if (!isNumberArray(vmetric, null)) {\n                continue;\n              }\n              for (let j = start; j <= code; j++) {\n                glyphsVMetrics[j] = vmetric;\n              }\n            } else {\n              break; // Invalid /W2 data.\n            }\n          }\n        }\n      }\n    } else {\n      const widths = dict.get(\"Widths\");\n      if (Array.isArray(widths)) {\n        let j = properties.firstChar;\n        for (const w of widths) {\n          const width = xref.fetchIfRef(w);\n          if (typeof width === \"number\") {\n            glyphsWidths[j] = width;\n          }\n          j++;\n        }\n        const missingWidth = descriptor.get(\"MissingWidth\");\n        defaultWidth = typeof missingWidth === \"number\" ? missingWidth : 0;\n      } else {\n        // Trying get the BaseFont metrics (see comment above).\n        const baseFontName = dict.get(\"BaseFont\");\n        if (baseFontName instanceof Name) {\n          const metrics = this.getBaseFontMetrics(baseFontName.name);\n\n          glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);\n          defaultWidth = metrics.defaultWidth;\n        }\n      }\n    }\n\n    // Heuristic: detection of monospace font by checking all non-zero widths\n    let isMonospace = true;\n    let firstWidth = defaultWidth;\n    for (const glyph in glyphsWidths) {\n      const glyphWidth = glyphsWidths[glyph];\n      if (!glyphWidth) {\n        continue;\n      }\n      if (!firstWidth) {\n        firstWidth = glyphWidth;\n        continue;\n      }\n      if (firstWidth !== glyphWidth) {\n        isMonospace = false;\n        break;\n      }\n    }\n    if (isMonospace) {\n      properties.flags |= FontFlags.FixedPitch;\n    } else {\n      // Clear the flag.\n      properties.flags &= ~FontFlags.FixedPitch;\n    }\n\n    properties.defaultWidth = defaultWidth;\n    properties.widths = glyphsWidths;\n    properties.defaultVMetrics = defaultVMetrics;\n    properties.vmetrics = glyphsVMetrics;\n  }\n\n  isSerifFont(baseFontName) {\n    // Simulating descriptor flags attribute\n    const fontNameWoStyle = baseFontName.split(\"-\", 1)[0];\n    return fontNameWoStyle in getSerifFonts() || /serif/i.test(fontNameWoStyle);\n  }\n\n  getBaseFontMetrics(name) {\n    let defaultWidth = 0;\n    let widths = Object.create(null);\n    let monospace = false;\n\n    let fontName = normalizeFontName(name);\n    const stdFontMap = getStdFontMap();\n    fontName = stdFontMap[fontName] || fontName;\n    const Metrics = getMetrics();\n\n    const glyphWidths =\n      Metrics[fontName] ??\n      // Use default fonts for looking up font metrics if the passed\n      // font is not a base font\n      Metrics[this.isSerifFont(name) ? \"Times-Roman\" : \"Helvetica\"];\n\n    if (typeof glyphWidths === \"number\") {\n      defaultWidth = glyphWidths;\n      monospace = true;\n    } else {\n      widths = glyphWidths(); // expand lazy widths array\n    }\n\n    return {\n      defaultWidth,\n      monospace,\n      widths,\n    };\n  }\n\n  buildCharCodeToWidth(widthsByGlyphName, properties) {\n    const widths = Object.create(null);\n    const differences = properties.differences;\n    const encoding = properties.defaultEncoding;\n    for (let charCode = 0; charCode < 256; charCode++) {\n      if (charCode in differences && widthsByGlyphName[differences[charCode]]) {\n        widths[charCode] = widthsByGlyphName[differences[charCode]];\n        continue;\n      }\n      if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {\n        widths[charCode] = widthsByGlyphName[encoding[charCode]];\n        continue;\n      }\n    }\n    return widths;\n  }\n\n  preEvaluateFont(dict) {\n    const baseDict = dict;\n    let type = dict.get(\"Subtype\");\n    if (!(type instanceof Name)) {\n      throw new FormatError(\"invalid font Subtype\");\n    }\n\n    let composite = false;\n    let hash;\n    if (type.name === \"Type0\") {\n      // If font is a composite\n      //  - get the descendant font\n      //  - set the type according to the descendant font\n      //  - get the FontDescriptor from the descendant font\n      const df = dict.get(\"DescendantFonts\");\n      if (!df) {\n        throw new FormatError(\"Descendant fonts are not specified\");\n      }\n      dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df;\n\n      if (!(dict instanceof Dict)) {\n        throw new FormatError(\"Descendant font is not a dictionary.\");\n      }\n      type = dict.get(\"Subtype\");\n      if (!(type instanceof Name)) {\n        throw new FormatError(\"invalid font Subtype\");\n      }\n      composite = true;\n    }\n\n    let firstChar = dict.get(\"FirstChar\");\n    if (!Number.isInteger(firstChar)) {\n      firstChar = 0;\n    }\n    let lastChar = dict.get(\"LastChar\");\n    if (!Number.isInteger(lastChar)) {\n      lastChar = composite ? 0xffff : 0xff;\n    }\n    const descriptor = dict.get(\"FontDescriptor\");\n    const toUnicode = dict.get(\"ToUnicode\") || baseDict.get(\"ToUnicode\");\n\n    if (descriptor) {\n      hash = new MurmurHash3_64();\n\n      const encoding = baseDict.getRaw(\"Encoding\");\n      if (encoding instanceof Name) {\n        hash.update(encoding.name);\n      } else if (encoding instanceof Ref) {\n        hash.update(encoding.toString());\n      } else if (encoding instanceof Dict) {\n        for (const entry of encoding.getRawValues()) {\n          if (entry instanceof Name) {\n            hash.update(entry.name);\n          } else if (entry instanceof Ref) {\n            hash.update(entry.toString());\n          } else if (Array.isArray(entry)) {\n            // 'Differences' array (fixes bug1157493.pdf).\n            const diffLength = entry.length,\n              diffBuf = new Array(diffLength);\n\n            for (let j = 0; j < diffLength; j++) {\n              const diffEntry = entry[j];\n              if (diffEntry instanceof Name) {\n                diffBuf[j] = diffEntry.name;\n              } else if (\n                typeof diffEntry === \"number\" ||\n                diffEntry instanceof Ref\n              ) {\n                diffBuf[j] = diffEntry.toString();\n              }\n            }\n            hash.update(diffBuf.join());\n          }\n        }\n      }\n\n      hash.update(`${firstChar}-${lastChar}`); // Fixes issue10665_reduced.pdf\n\n      if (toUnicode instanceof BaseStream) {\n        const stream = toUnicode.stream || toUnicode;\n        const uint8array = stream.buffer\n          ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength)\n          : new Uint8Array(\n              stream.bytes.buffer,\n              stream.start,\n              stream.end - stream.start\n            );\n        hash.update(uint8array);\n      } else if (toUnicode instanceof Name) {\n        hash.update(toUnicode.name);\n      }\n\n      const widths = dict.get(\"Widths\") || baseDict.get(\"Widths\");\n      if (Array.isArray(widths)) {\n        const widthsBuf = [];\n        for (const entry of widths) {\n          if (typeof entry === \"number\" || entry instanceof Ref) {\n            widthsBuf.push(entry.toString());\n          }\n        }\n        hash.update(widthsBuf.join());\n      }\n\n      if (composite) {\n        hash.update(\"compositeFont\");\n\n        const compositeWidths = dict.get(\"W\") || baseDict.get(\"W\");\n        if (Array.isArray(compositeWidths)) {\n          const widthsBuf = [];\n          for (const entry of compositeWidths) {\n            if (typeof entry === \"number\" || entry instanceof Ref) {\n              widthsBuf.push(entry.toString());\n            } else if (Array.isArray(entry)) {\n              const subWidthsBuf = [];\n              for (const element of entry) {\n                if (typeof element === \"number\" || element instanceof Ref) {\n                  subWidthsBuf.push(element.toString());\n                }\n              }\n              widthsBuf.push(`[${subWidthsBuf.join()}]`);\n            }\n          }\n          hash.update(widthsBuf.join());\n        }\n\n        const cidToGidMap =\n          dict.getRaw(\"CIDToGIDMap\") || baseDict.getRaw(\"CIDToGIDMap\");\n        if (cidToGidMap instanceof Name) {\n          hash.update(cidToGidMap.name);\n        } else if (cidToGidMap instanceof Ref) {\n          hash.update(cidToGidMap.toString());\n        } else if (cidToGidMap instanceof BaseStream) {\n          hash.update(cidToGidMap.peekBytes());\n        }\n      }\n\n      if (type.name === \"Type3\") {\n        // Type3 fonts with the same metrics/encoding but different CharProcs\n        // must not be aliased, since their glyphs may render completely\n        // differently (e.g. one font uses SMask glyph programs, another uses\n        // plain paths, see issue 19634).\n        const charProcs = baseDict.get(\"CharProcs\");\n        if (charProcs instanceof Dict) {\n          for (const [key, entry] of charProcs.getRawEntries()) {\n            hash.update(entry instanceof Ref ? `${key}\\0${entry}` : key);\n          }\n        }\n      }\n    }\n\n    return {\n      descriptor,\n      dict,\n      baseDict,\n      composite,\n      type: type.name,\n      firstChar,\n      lastChar,\n      toUnicode,\n      hash: hash ? hash.hexdigest() : \"\",\n    };\n  }\n\n  async translateFont({\n    descriptor,\n    dict,\n    baseDict,\n    composite,\n    type,\n    firstChar,\n    lastChar,\n    toUnicode,\n    cssFontInfo,\n  }) {\n    const isType3Font = type === \"Type3\";\n\n    if (!descriptor) {\n      if (isType3Font) {\n        // FontDescriptor is only required for Type3 fonts when the document\n        // is a tagged pdf.\n        descriptor = Dict.empty;\n      } else if (composite) {\n        // Some PDFs omit the FontDescriptor on the descendant CIDFont when\n        // referencing one of the standard Acrobat CJK fonts via a predefined\n        // CMap (e.g. /Encoding /90ms-RKSJ-H with /BaseFont /HeiseiMin-W3).\n        // Fall through so the CMap is loaded by the composite-font path\n        // below; otherwise multi-byte codes would be decoded byte-by-byte.\n        descriptor = Dict.empty;\n      } else {\n        // Before PDF 1.5 if the font was one of the base 14 fonts, having a\n        // FontDescriptor was not required.\n        // This case is here for compatibility.\n        let baseFontName = dict.get(\"BaseFont\");\n        if (!(baseFontName instanceof Name)) {\n          throw new FormatError(\"Base font is not specified\");\n        }\n\n        // Using base font name as a font name.\n        baseFontName = normalizeFontName(baseFontName.name);\n        const metrics = this.getBaseFontMetrics(baseFontName);\n\n        // Simulating descriptor flags attribute\n        const fontNameWoStyle = baseFontName.split(\"-\", 1)[0];\n        const flags =\n          (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) |\n          (metrics.monospace ? FontFlags.FixedPitch : 0) |\n          (getSymbolsFonts()[fontNameWoStyle]\n            ? FontFlags.Symbolic\n            : FontFlags.Nonsymbolic);\n\n        const properties = {\n          type,\n          name: baseFontName,\n          loadedName: baseDict.loadedName,\n          systemFontInfo: null,\n          widths: metrics.widths,\n          defaultWidth: metrics.defaultWidth,\n          isSimulatedFlags: true,\n          flags,\n          firstChar,\n          lastChar,\n          toUnicode,\n          xHeight: 0,\n          capHeight: 0,\n          italicAngle: 0,\n          isType3Font,\n        };\n        const widths = dict.get(\"Widths\");\n\n        const standardFontName = getStandardFontName(baseFontName);\n        let file = null;\n        if (standardFontName) {\n          file = await this.fetchStandardFontData(standardFontName);\n          properties.isInternalFont = !!file;\n        }\n        if (!properties.isInternalFont && this.options.useSystemFonts) {\n          properties.systemFontInfo = getFontSubstitution(\n            this.systemFontCache,\n            this.idFactory,\n            this.options.standardFontDataUrl,\n            baseFontName,\n            standardFontName,\n            type\n          );\n        }\n\n        const newProperties = await this.extractDataStructures(\n          dict,\n          properties\n        );\n        if (Array.isArray(widths)) {\n          const glyphWidths = [];\n          let j = firstChar;\n          for (const w of widths) {\n            const width = this.xref.fetchIfRef(w);\n            if (typeof width === \"number\") {\n              glyphWidths[j] = width;\n            }\n            j++;\n          }\n          newProperties.widths = glyphWidths;\n        } else {\n          newProperties.widths = this.buildCharCodeToWidth(\n            metrics.widths,\n            newProperties\n          );\n        }\n        return new Font(baseFontName, file, newProperties, this.options);\n      }\n    }\n\n    // According to the spec if 'FontDescriptor' is declared, 'FirstChar',\n    // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem\n    // to ignore this rule when a variant of a standard font is used.\n    // TODO Fill the width array depending on which of the base font this is\n    // a variant.\n\n    let fontName = descriptor.get(\"FontName\");\n    let baseFont = dict.get(\"BaseFont\");\n    // Some bad PDFs have a string as the font name.\n    if (typeof fontName === \"string\") {\n      fontName = Name.get(fontName);\n    }\n    if (typeof baseFont === \"string\") {\n      baseFont = Name.get(baseFont);\n    }\n\n    const fontNameStr = fontName?.name;\n    const baseFontStr = baseFont?.name;\n    if (isType3Font) {\n      if (!fontNameStr) {\n        // Since the /FontDescriptor is optional in Type3 fonts, ensure that we\n        // always have a \"valid\" /FontName (fixes issue19954.pdf).\n        fontName = Name.get(type);\n      }\n    } else if (fontNameStr !== baseFontStr) {\n      info(\n        `The FontDescriptor's FontName is \"${fontNameStr}\" but ` +\n          `should be the same as the Font's BaseFont \"${baseFontStr}\".`\n      );\n      // - Workaround for cases where e.g. fontNameStr = 'Arial' and\n      //   baseFontStr = 'Arial,Bold' (needed when no font file is embedded).\n      //\n      // - Workaround for cases where e.g. fontNameStr = 'wg09np' and\n      //   baseFontStr = 'Wingdings-Regular' (fixes issue7454.pdf).\n      if (\n        fontNameStr &&\n        baseFontStr &&\n        (baseFontStr.startsWith(fontNameStr) ||\n          (!isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr)))\n      ) {\n        fontName = null;\n      }\n      fontName ||= baseFont;\n    }\n\n    if (!(fontName instanceof Name)) {\n      throw new FormatError(\"invalid font name\");\n    }\n\n    let fontFile, fontFileN, subtype, length1, length2, length3;\n    try {\n      for (const n of [\"FontFile\", \"FontFile2\", \"FontFile3\"]) {\n        fontFile = descriptor.get(n);\n        if (fontFile) {\n          fontFileN = n;\n          break;\n        }\n      }\n\n      if (fontFile) {\n        if (!(fontFile instanceof BaseStream)) {\n          throw new FormatError(\"FontFile should be a stream\");\n        } else {\n          if (fontFile.isAsync) {\n            const bytes = await fontFile.asyncGetBytes();\n            if (bytes) {\n              fontFile = new Stream(bytes, 0, bytes.length, fontFile.dict);\n            }\n          }\n          if (fontFile.isEmpty) {\n            throw new FormatError(\"FontFile is empty\");\n          }\n        }\n      }\n    } catch (ex) {\n      if (!this.options.ignoreErrors) {\n        throw ex;\n      }\n      warn(`translateFont - fetching \"${fontName.name}\" font file: \"${ex}\".`);\n      fontFile = null;\n    }\n    let isInternalFont = false;\n    let glyphScaleFactors = null;\n    let systemFontInfo = null;\n    if (fontFile) {\n      if (fontFile.dict) {\n        const subtypeEntry = fontFile.dict.get(\"Subtype\");\n        if (subtypeEntry instanceof Name) {\n          subtype = subtypeEntry.name;\n        }\n        length1 = fontFile.dict.get(\"Length1\");\n        length2 = fontFile.dict.get(\"Length2\");\n        length3 = fontFile.dict.get(\"Length3\");\n      }\n    } else if (cssFontInfo) {\n      // We've a missing XFA font.\n      const standardFontName = getXfaFontName(fontName.name);\n      if (standardFontName) {\n        cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`;\n        cssFontInfo.metrics = standardFontName.metrics || null;\n        glyphScaleFactors = standardFontName.factors || null;\n        fontFile = await this.fetchStandardFontData(standardFontName.name);\n        isInternalFont = !!fontFile;\n\n        // We're using a substitution font but for example widths (if any)\n        // are related to the glyph positions in the font.\n        // So we overwrite everything here to be sure that widths are\n        // correct.\n        baseDict = dict = getXfaFontDict(fontName.name);\n        composite = true;\n      }\n    } else if (!isType3Font) {\n      const standardFontName = getStandardFontName(fontName.name);\n      if (standardFontName) {\n        fontFile = await this.fetchStandardFontData(standardFontName);\n        isInternalFont = !!fontFile;\n      }\n      if (!isInternalFont && this.options.useSystemFonts) {\n        systemFontInfo = getFontSubstitution(\n          this.systemFontCache,\n          this.idFactory,\n          this.options.standardFontDataUrl,\n          fontName.name,\n          standardFontName,\n          type\n        );\n      }\n    }\n\n    const fontMatrix = lookupMatrix(\n      dict.getArray(\"FontMatrix\"),\n      FONT_IDENTITY_MATRIX\n    );\n    const bbox = lookupNormalRect(\n      descriptor.getArray(\"FontBBox\") || dict.getArray(\"FontBBox\"),\n      isType3Font ? [0, 0, 0, 0] : undefined\n    );\n    let ascent = descriptor.get(\"Ascent\");\n    if (typeof ascent !== \"number\") {\n      ascent = undefined;\n    }\n    let descent = descriptor.get(\"Descent\");\n    if (typeof descent !== \"number\") {\n      descent = undefined;\n    }\n    let xHeight = descriptor.get(\"XHeight\");\n    if (typeof xHeight !== \"number\") {\n      xHeight = 0;\n    }\n    let capHeight = descriptor.get(\"CapHeight\");\n    if (typeof capHeight !== \"number\") {\n      capHeight = 0;\n    }\n    let flags = descriptor.get(\"Flags\");\n    if (!Number.isInteger(flags)) {\n      flags = 0;\n    }\n    let italicAngle = descriptor.get(\"ItalicAngle\");\n    if (typeof italicAngle !== \"number\") {\n      italicAngle = 0;\n    }\n\n    const properties = {\n      type,\n      name: fontName.name,\n      subtype,\n      file: fontFile,\n      fontFileN,\n      length1,\n      length2,\n      length3,\n      isInternalFont,\n      loadedName: baseDict.loadedName,\n      composite,\n      fixedPitch: false,\n      fontMatrix,\n      firstChar,\n      lastChar,\n      toUnicode,\n      bbox,\n      ascent,\n      descent,\n      xHeight,\n      capHeight,\n      flags,\n      italicAngle,\n      isType3Font,\n      cssFontInfo,\n      scaleFactors: glyphScaleFactors,\n      systemFontInfo,\n    };\n\n    if (composite) {\n      const cidEncoding = baseDict.get(\"Encoding\");\n      if (cidEncoding instanceof Name) {\n        properties.cidEncoding = cidEncoding.name;\n      }\n      const cMap = await CMapFactory.create({\n        encoding: cidEncoding,\n        fetchBuiltInCMap: this._fetchBuiltInCMapBound,\n        useCMap: null,\n      });\n      properties.cMap = cMap;\n      properties.vertical = properties.cMap.vertical;\n    }\n\n    const newProperties = await this.extractDataStructures(dict, properties);\n    this.extractWidths(dict, descriptor, newProperties);\n\n    const font = new Font(fontName.name, fontFile, newProperties, this.options);\n    // The embedded font may have been too corrupt to parse, in which case\n    // we ended up in the fallback path without a substitution selected.\n    // Try the substitution map now so text renders in a font close to what\n    // the document asked for (issue 7625).\n    if (\n      font.missingFile &&\n      !font.systemFontInfo &&\n      !isType3Font &&\n      this.options.useSystemFonts\n    ) {\n      const standardFontName = getStandardFontName(fontName.name);\n      const substitution = getFontSubstitution(\n        this.systemFontCache,\n        this.idFactory,\n        this.options.standardFontDataUrl,\n        fontName.name,\n        standardFontName,\n        type\n      );\n      if (substitution) {\n        if (substitution.guessFallback) {\n          substitution.guessFallback = false;\n          substitution.css += `,${font.fallbackName}`;\n        }\n        font.systemFontInfo = substitution;\n      }\n    }\n    return font;\n  }\n\n  static buildFontPaths(font, glyphs, handler, evaluatorOptions) {\n    function buildPath(fontChar) {\n      const glyphName = `${font.loadedName}_path_${fontChar}`;\n      try {\n        if (font.renderer.hasBuiltPath(fontChar)) {\n          return;\n        }\n        const buffer = compileFontPathInfo(font.renderer.getPathJs(fontChar));\n        handler.send(\"commonobj\", [glyphName, \"FontPath\", buffer], [buffer]);\n      } catch (reason) {\n        if (evaluatorOptions.ignoreErrors) {\n          warn(`buildFontPaths - ignoring ${glyphName} glyph: \"${reason}\".`);\n          return;\n        }\n        throw reason;\n      }\n    }\n\n    for (const glyph of glyphs) {\n      buildPath(glyph.fontChar);\n\n      // If the glyph has an accent we need to build a path for its\n      // fontChar too, otherwise CanvasGraphics_paintChar will fail.\n      const accent = glyph.accent;\n      if (accent?.fontChar) {\n        buildPath(accent.fontChar);\n      }\n    }\n  }\n\n  static get fallbackFontDict() {\n    const dict = new Dict();\n    dict.set(\"BaseFont\", Name.get(\"Helvetica\"));\n    dict.set(\"Type\", Name.get(\"FallbackType\"));\n    dict.set(\"Subtype\", Name.get(\"FallbackType\"));\n    dict.set(\"Encoding\", Name.get(\"WinAnsiEncoding\"));\n\n    return shadow(this, \"fallbackFontDict\", dict);\n  }\n}\n\nclass TranslatedFont {\n  #sent = false;\n\n  #type3Loaded = null;\n\n  constructor({ loadedName, font, dict }) {\n    this.loadedName = loadedName;\n    this.font = font;\n    this.dict = dict;\n    this.type3Dependencies = font.isType3Font ? new Set() : null;\n  }\n\n  send(handler) {\n    if (this.#sent) {\n      return;\n    }\n    this.#sent = true;\n\n    const fontData = this.font.exportData(),\n      transfers = fontData.buffer ? [fontData.buffer] : null;\n\n    handler.send(\"commonobj\", [this.loadedName, \"Font\", fontData], transfers);\n    // future path: switch to a SharedArrayBuffer\n    // const sab = new SharedArrayBuffer(data.byteLength);\n    // const view = new Uint8Array(sab);\n    // view.set(new Uint8Array(data));\n    // handler.send(\"commonobj\", [this.loadedName, \"Font\", sab]);\n  }\n\n  fallback(handler, evaluatorOptions) {\n    if (!this.font.data) {\n      return;\n    }\n    // When font loading failed, fall back to the built-in font renderer.\n    this.font.disableFontFace = true;\n    // An arbitrary number of text rendering operators could have been\n    // encountered between the point in time when the 'Font' message was sent\n    // to the main-thread, and the point in time when the 'FontFallback'\n    // message was received on the worker-thread.\n    // To ensure that all 'FontPath's are available on the main-thread, when\n    // font loading failed, attempt to resend *all* previously parsed glyphs.\n    PartialEvaluator.buildFontPaths(\n      this.font,\n      /* glyphs = */ this.font.glyphCacheValues,\n      handler,\n      evaluatorOptions\n    );\n  }\n\n  loadType3Data(evaluator, resources, task, seenRefs = null) {\n    if (this.#type3Loaded) {\n      return this.#type3Loaded;\n    }\n    const { font, type3Dependencies } = this;\n    assert(font.isType3Font, \"Must be a Type3 font.\");\n\n    // When parsing Type3 glyphs, always ignore them if there are errors.\n    // Compared to the parsing of e.g. an entire page, it doesn't really\n    // make sense to only be able to render a Type3 glyph partially.\n    const type3Evaluator = evaluator.clone({ ignoreErrors: false });\n    // Prevent circular references in Type3 fonts.\n    const type3FontRefs = new RefSet(evaluator.type3FontRefs);\n    if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) {\n      type3FontRefs.put(this.dict.objId);\n    }\n    type3Evaluator.type3FontRefs = type3FontRefs;\n\n    let loadCharProcsPromise = Promise.resolve();\n    const charProcs = this.dict.get(\"CharProcs\");\n    const fontResources = this.dict.get(\"Resources\") || resources;\n    const charProcOperatorList = Object.create(null);\n\n    const [x0, y0, x1, y1] = font.bbox,\n      width = x1 - x0,\n      height = y1 - y0;\n    const fontBBoxSize = Math.hypot(width, height);\n\n    for (const key of charProcs.getKeys()) {\n      loadCharProcsPromise = loadCharProcsPromise.then(() => {\n        const glyphStream = charProcs.get(key);\n        const operatorList = new OperatorList();\n        return type3Evaluator\n          .getOperatorList({\n            stream: glyphStream,\n            task,\n            resources: fontResources,\n            operatorList,\n            prevRefs: seenRefs,\n          })\n          .then(() => {\n            // According to the PDF specification, section \"9.6.5 Type 3 Fonts\"\n            // and \"Table 113\":\n            //  \"A glyph description that begins with the d1 operator should\n            //   not execute any operators that set the colour (or other\n            //   colour-related parameters) in the graphics state;\n            //   any use of such operators shall be ignored.\"\n            switch (operatorList.fnArray[0]) {\n              case OPS.setCharWidthAndBounds:\n                this.#removeType3ColorOperators(operatorList, fontBBoxSize);\n                break;\n              case OPS.setCharWidth:\n                if (!fontBBoxSize) {\n                  this.#guessType3FontBBox(operatorList);\n                }\n                break;\n            }\n            charProcOperatorList[key] = operatorList.getIR();\n\n            for (const dependency of operatorList.dependencies) {\n              type3Dependencies.add(dependency);\n            }\n          })\n          .catch(function (reason) {\n            warn(`Type3 font resource \"${key}\" is not available.`);\n            const dummyOperatorList = new OperatorList();\n            charProcOperatorList[key] = dummyOperatorList.getIR();\n          });\n      });\n    }\n    this.#type3Loaded = loadCharProcsPromise.then(() => {\n      font.charProcOperatorList = charProcOperatorList;\n      if (this._bbox) {\n        font.isCharBBox = true;\n        font.bbox = this._bbox;\n      }\n    });\n    return this.#type3Loaded;\n  }\n\n  #removeType3ColorOperators(operatorList, fontBBoxSize = NaN) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        operatorList.fnArray[0] === OPS.setCharWidthAndBounds,\n        \"Type3 glyph shall start with the d1 operator.\"\n      );\n    }\n    const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)),\n      width = charBBox[2] - charBBox[0],\n      height = charBBox[3] - charBBox[1];\n    const charBBoxSize = Math.hypot(width, height);\n\n    if (width === 0 || height === 0) {\n      // Skip the d1 operator when its bounds are bogus (fixes issue14953.pdf).\n      operatorList.fnArray.splice(0, 1);\n      operatorList.argsArray.splice(0, 1);\n    } else if (\n      fontBBoxSize === 0 ||\n      Math.round(charBBoxSize / fontBBoxSize) >= 10\n    ) {\n      // Override the fontBBox when it's undefined/empty, or when it's at least\n      // (approximately) one order of magnitude smaller than the charBBox\n      // (fixes issue14999_reduced.pdf).\n      this._bbox ??= BBOX_INIT.slice();\n      Util.rectBoundingBox(...charBBox, this._bbox);\n    }\n\n    let i = 0,\n      ii = operatorList.length;\n    while (i < ii) {\n      switch (operatorList.fnArray[i]) {\n        case OPS.setCharWidthAndBounds:\n          break; // Handled above.\n        case OPS.setStrokeColorSpace:\n        case OPS.setFillColorSpace:\n        case OPS.setStrokeColor:\n        case OPS.setStrokeColorN:\n        case OPS.setFillColor:\n        case OPS.setFillColorN:\n        case OPS.setStrokeGray:\n        case OPS.setFillGray:\n        case OPS.setStrokeRGBColor:\n        case OPS.setFillRGBColor:\n        case OPS.setStrokeCMYKColor:\n        case OPS.setFillCMYKColor:\n        case OPS.shadingFill:\n        case OPS.setRenderingIntent:\n          operatorList.fnArray.splice(i, 1);\n          operatorList.argsArray.splice(i, 1);\n          ii--;\n          continue;\n\n        case OPS.setGState:\n          const [gStateObj] = operatorList.argsArray[i];\n          let j = 0,\n            jj = gStateObj.length;\n          while (j < jj) {\n            const [gStateKey] = gStateObj[j];\n            switch (gStateKey) {\n              case \"TR\":\n              case \"TR2\":\n              case \"HT\":\n              case \"BG\":\n              case \"BG2\":\n              case \"UCR\":\n              case \"UCR2\":\n                gStateObj.splice(j, 1);\n                jj--;\n                continue;\n            }\n            j++;\n          }\n          break;\n      }\n      i++;\n    }\n  }\n\n  #guessType3FontBBox(operatorList) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        operatorList.fnArray[0] === OPS.setCharWidth,\n        \"Type3 glyph shall start with the d0 operator.\"\n      );\n    }\n\n    let i = 1;\n    const ii = operatorList.length;\n    while (i < ii) {\n      switch (operatorList.fnArray[i]) {\n        case OPS.constructPath:\n          const minMax = operatorList.argsArray[i][2];\n          // Override the fontBBox when it's undefined/empty (fixes 19624.pdf).\n          this._bbox ??= BBOX_INIT.slice();\n          Util.rectBoundingBox(...minMax, this._bbox);\n          break;\n      }\n      i++;\n    }\n  }\n}\n\nclass StateManager {\n  constructor(initialState = new EvalState()) {\n    this.state = initialState;\n    this.stateStack = [];\n  }\n\n  save() {\n    const old = this.state;\n    this.stateStack.push(this.state);\n    this.state = old.clone();\n  }\n\n  restore() {\n    const prev = this.stateStack.pop();\n    if (prev) {\n      this.state = prev;\n    }\n  }\n\n  transform(args) {\n    this.state.ctm = Util.transform(this.state.ctm, args);\n  }\n}\n\nclass TextState {\n  ctm = new Float32Array(IDENTITY_MATRIX);\n\n  fontName = null;\n\n  fontSize = 0;\n\n  loadedName = null;\n\n  font = null;\n\n  fontMatrix = FONT_IDENTITY_MATRIX;\n\n  textMatrix = IDENTITY_MATRIX.slice();\n\n  textLineMatrix = IDENTITY_MATRIX.slice();\n\n  charSpacing = 0;\n\n  wordSpacing = 0;\n\n  leading = 0;\n\n  textHScale = 1;\n\n  textRise = 0;\n\n  setTextMatrix(a, b, c, d, e, f) {\n    const m = this.textMatrix;\n    m[0] = a;\n    m[1] = b;\n    m[2] = c;\n    m[3] = d;\n    m[4] = e;\n    m[5] = f;\n  }\n\n  setTextLineMatrix(a, b, c, d, e, f) {\n    const m = this.textLineMatrix;\n    m[0] = a;\n    m[1] = b;\n    m[2] = c;\n    m[3] = d;\n    m[4] = e;\n    m[5] = f;\n  }\n\n  translateTextMatrix(x, y) {\n    const m = this.textMatrix;\n    m[4] = m[0] * x + m[2] * y + m[4];\n    m[5] = m[1] * x + m[3] * y + m[5];\n  }\n\n  translateTextLineMatrix(x, y) {\n    const m = this.textLineMatrix;\n    m[4] = m[0] * x + m[2] * y + m[4];\n    m[5] = m[1] * x + m[3] * y + m[5];\n  }\n\n  carriageReturn() {\n    this.translateTextLineMatrix(0, -this.leading);\n    this.textMatrix = this.textLineMatrix.slice();\n  }\n\n  clone() {\n    const clone = Object.assign(Object.create(this), this);\n    clone.textMatrix = this.textMatrix.slice();\n    clone.textLineMatrix = this.textLineMatrix.slice();\n    clone.fontMatrix = this.fontMatrix.slice();\n    return clone;\n  }\n}\n\nclass EvalState {\n  ctm = new Float32Array(IDENTITY_MATRIX);\n\n  font = null;\n\n  textRenderingMode = TextRenderingMode.FILL;\n\n  _fillColorSpace = ColorSpaceUtils.gray;\n\n  _strokeColorSpace = ColorSpaceUtils.gray;\n\n  patternFillColorSpace = null;\n\n  patternStrokeColorSpace = null;\n\n  // Path stuff.\n  currentPointX = 0;\n\n  currentPointY = 0;\n\n  pathMinMax = F32_BBOX_INIT.slice();\n\n  pathBuffer = [];\n\n  get fillColorSpace() {\n    return this._fillColorSpace;\n  }\n\n  set fillColorSpace(colorSpace) {\n    this._fillColorSpace = this.patternFillColorSpace = colorSpace;\n  }\n\n  get strokeColorSpace() {\n    return this._strokeColorSpace;\n  }\n\n  set strokeColorSpace(colorSpace) {\n    this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace;\n  }\n\n  clone({ newPath = false } = {}) {\n    const clone = Object.create(this);\n    if (newPath) {\n      clone.pathBuffer = [];\n      clone.pathMinMax = F32_BBOX_INIT.slice();\n    }\n    return clone;\n  }\n}\n\nclass EvaluatorPreprocessor {\n  static get opMap() {\n    // Specifies properties for each command\n    //\n    // If variableArgs === true: [0, `numArgs`] expected\n    // If variableArgs === false: exactly `numArgs` expected\n    return shadow(\n      this,\n      \"opMap\",\n      Object.assign(Object.create(null), {\n        // Graphic state\n        w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false },\n        J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false },\n        j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false },\n        M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false },\n        d: { id: OPS.setDash, numArgs: 2, variableArgs: false },\n        ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false },\n        i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false },\n        gs: { id: OPS.setGState, numArgs: 1, variableArgs: false },\n        q: { id: OPS.save, numArgs: 0, variableArgs: false },\n        Q: { id: OPS.restore, numArgs: 0, variableArgs: false },\n        cm: { id: OPS.transform, numArgs: 6, variableArgs: false },\n\n        // Path\n        m: { id: OPS.moveTo, numArgs: 2, variableArgs: false },\n        l: { id: OPS.lineTo, numArgs: 2, variableArgs: false },\n        c: { id: OPS.curveTo, numArgs: 6, variableArgs: false },\n        v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false },\n        y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false },\n        h: { id: OPS.closePath, numArgs: 0, variableArgs: false },\n        re: { id: OPS.rectangle, numArgs: 4, variableArgs: false },\n        S: { id: OPS.stroke, numArgs: 0, variableArgs: false },\n        s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false },\n        f: { id: OPS.fill, numArgs: 0, variableArgs: false },\n        F: { id: OPS.fill, numArgs: 0, variableArgs: false },\n        \"f*\": { id: OPS.eoFill, numArgs: 0, variableArgs: false },\n        B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false },\n        \"B*\": { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false },\n        b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false },\n        \"b*\": { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false },\n        n: { id: OPS.endPath, numArgs: 0, variableArgs: false },\n\n        // Clipping\n        W: { id: OPS.clip, numArgs: 0, variableArgs: false },\n        \"W*\": { id: OPS.eoClip, numArgs: 0, variableArgs: false },\n\n        // Text\n        BT: { id: OPS.beginText, numArgs: 0, variableArgs: false },\n        ET: { id: OPS.endText, numArgs: 0, variableArgs: false },\n        Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false },\n        Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false },\n        Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false },\n        TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false },\n        Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false },\n        Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false },\n        Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false },\n        Td: { id: OPS.moveText, numArgs: 2, variableArgs: false },\n        TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false },\n        Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false },\n        \"T*\": { id: OPS.nextLine, numArgs: 0, variableArgs: false },\n        Tj: { id: OPS.showText, numArgs: 1, variableArgs: false },\n        TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false },\n        \"'\": { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false },\n        '\"': {\n          id: OPS.nextLineSetSpacingShowText,\n          numArgs: 3,\n          variableArgs: false,\n        },\n\n        // Type3 fonts\n        d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false },\n        d1: {\n          id: OPS.setCharWidthAndBounds,\n          numArgs: 6,\n          variableArgs: false,\n        },\n\n        // Color\n        CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false },\n        cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false },\n        SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true },\n        SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true },\n        sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true },\n        scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true },\n        G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false },\n        g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false },\n        RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false },\n        rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false },\n        K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false },\n        k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false },\n\n        // Shading\n        sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false },\n\n        // Images\n        BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false },\n        ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false },\n        EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false },\n\n        // XObjects\n        Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false },\n        MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false },\n        DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false },\n        BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false },\n        BDC: {\n          id: OPS.beginMarkedContentProps,\n          numArgs: 2,\n          variableArgs: false,\n        },\n        EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false },\n\n        // Compatibility\n        BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false },\n        EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false },\n\n        // (reserved partial commands for the lexer)\n        BM: null,\n        BD: null,\n        true: null,\n        fa: null,\n        fal: null,\n        fals: null,\n        false: null,\n        nu: null,\n        nul: null,\n        null: null,\n      })\n    );\n  }\n\n  static MAX_INVALID_PATH_OPS = 10;\n\n  constructor(stream, xref, stateManager = new StateManager()) {\n    // TODO(mduan): pass array of knownCommands rather than this.opMap\n    // dictionary\n    this.parser = new Parser({\n      lexer: new Lexer(stream, EvaluatorPreprocessor.opMap),\n      xref,\n    });\n    this.stateManager = stateManager;\n    this.nonProcessedArgs = [];\n    this._isPathOp = false;\n    this._numInvalidPathOPS = 0;\n  }\n\n  get savedStatesDepth() {\n    return this.stateManager.stateStack.length;\n  }\n\n  // |operation| is an object with two fields:\n  //\n  // - |fn| is an out param.\n  //\n  // - |args| is an inout param. On entry, it should have one of two values.\n  //\n  //   - An empty array. This indicates that the caller is providing the\n  //     array in which the args will be stored in. The caller should use\n  //     this value if it can reuse a single array for each call to read().\n  //\n  //   - |null|. This indicates that the caller needs this function to create\n  //     the array in which any args are stored in. If there are zero args,\n  //     this function will leave |operation.args| as |null| (thus avoiding\n  //     allocations that would occur if we used an empty array to represent\n  //     zero arguments). Otherwise, it will replace |null| with a new array\n  //     containing the arguments. The caller should use this value if it\n  //     cannot reuse an array for each call to read().\n  //\n  // These two modes are present because this function is very hot and so\n  // avoiding allocations where possible is worthwhile.\n  //\n  read(operation) {\n    let args = operation.args;\n    while (true) {\n      const obj = this.parser.getObj();\n      if (obj instanceof Cmd) {\n        const cmd = obj.cmd;\n        // Check that the command is valid\n        const opSpec = EvaluatorPreprocessor.opMap[cmd];\n        if (!opSpec) {\n          warn(`Unknown command \"${cmd}\".`);\n          continue;\n        }\n\n        const fn = opSpec.id;\n        const numArgs = opSpec.numArgs;\n        let argsLength = args !== null ? args.length : 0;\n\n        // If the *previous* command wasn't a path operator, reset the heuristic\n        // used with incomplete path operators below (fixes issue14917.pdf).\n        if (!this._isPathOp) {\n          this._numInvalidPathOPS = 0;\n        }\n        this._isPathOp = fn >= OPS.moveTo && fn <= OPS.endPath;\n\n        if (!opSpec.variableArgs) {\n          // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf\n          if (argsLength !== numArgs) {\n            const nonProcessedArgs = this.nonProcessedArgs;\n            while (argsLength > numArgs) {\n              nonProcessedArgs.push(args.shift());\n              argsLength--;\n            }\n            while (argsLength < numArgs && nonProcessedArgs.length !== 0) {\n              if (args === null) {\n                args = [];\n              }\n              args.unshift(nonProcessedArgs.pop());\n              argsLength++;\n            }\n          }\n\n          if (argsLength < numArgs) {\n            const partialMsg =\n              `command ${cmd}: expected ${numArgs} args, ` +\n              `but received ${argsLength} args.`;\n\n            // Incomplete path operators, in particular, can result in fairly\n            // chaotic rendering artifacts. Hence the following heuristics is\n            // used to error, rather than just warn, once a number of invalid\n            // path operators have been encountered (fixes bug1443140.pdf).\n            if (\n              this._isPathOp &&\n              ++this._numInvalidPathOPS >\n                EvaluatorPreprocessor.MAX_INVALID_PATH_OPS\n            ) {\n              throw new FormatError(`Invalid ${partialMsg}`);\n            }\n            // If we receive too few arguments, it's not possible to execute\n            // the command, hence we skip the command.\n            warn(`Skipping ${partialMsg}`);\n            if (args !== null) {\n              args.length = 0;\n            }\n            continue;\n          }\n        } else if (argsLength > numArgs) {\n          info(\n            `Command ${cmd}: expected [0, ${numArgs}] args, ` +\n              `but received ${argsLength} args.`\n          );\n        }\n\n        // TODO figure out how to type-check vararg functions\n        this.preprocessCommand(fn, args);\n\n        operation.fn = fn;\n        operation.args = args;\n        return true;\n      }\n      if (obj === EOF) {\n        return false; // no more commands\n      }\n      // argument\n      if (obj !== null) {\n        if (args === null) {\n          args = [];\n        }\n        args.push(obj);\n        if (args.length > 33) {\n          throw new FormatError(\"Too many arguments\");\n        }\n      }\n    }\n  }\n\n  preprocessCommand(fn, args) {\n    switch (fn | 0) {\n      case OPS.save:\n        this.stateManager.save();\n        break;\n      case OPS.restore:\n        this.stateManager.restore();\n        break;\n      case OPS.transform:\n        this.stateManager.transform(args);\n        break;\n    }\n  }\n}\n\nexport { EvaluatorPreprocessor, PartialEvaluator };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  codePointIter,\n  escapePDFName,\n  getRotationMatrix,\n  numberToString,\n} from \"./core_utils.js\";\nimport { Dict, Name } from \"./primitives.js\";\nimport {\n  LINE_DESCENT_FACTOR,\n  LINE_FACTOR,\n  OPS,\n  shadow,\n  warn,\n} from \"../shared/util.js\";\nimport { ColorSpaceUtils } from \"./colorspace_utils.js\";\nimport { EvaluatorPreprocessor } from \"./evaluator.js\";\nimport { LocalColorSpaceCache } from \"./image_utils.js\";\nimport { PDFFunctionFactory } from \"./function.js\";\nimport { StringStream } from \"./stream.js\";\nimport { stringToUTF16HexString } from \"./string_utils.js\";\n\nclass DefaultAppearanceEvaluator extends EvaluatorPreprocessor {\n  constructor(str) {\n    super(new StringStream(str));\n  }\n\n  parse() {\n    const operation = {\n      fn: 0,\n      args: [],\n    };\n    const result = {\n      fontSize: 0,\n      fontName: \"\",\n      fontColor: /* black = */ new Uint8ClampedArray(3),\n    };\n\n    try {\n      while (true) {\n        operation.args.length = 0; // Ensure that `args` it's always reset.\n\n        if (!this.read(operation)) {\n          break;\n        }\n        if (this.savedStatesDepth !== 0) {\n          continue; // Don't get info in save/restore sections.\n        }\n        const { fn, args } = operation;\n\n        switch (fn | 0) {\n          case OPS.setFont:\n            const [fontName, fontSize] = args;\n            if (fontName instanceof Name) {\n              result.fontName = fontName.name;\n            }\n            if (typeof fontSize === \"number\" && fontSize > 0) {\n              result.fontSize = fontSize;\n            }\n            break;\n          case OPS.setFillRGBColor:\n            ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0);\n            break;\n          case OPS.setFillGray:\n            ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0);\n            break;\n          case OPS.setFillCMYKColor:\n            ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0);\n            break;\n        }\n      }\n    } catch (reason) {\n      warn(`parseDefaultAppearance - ignoring errors: \"${reason}\".`);\n    }\n\n    return result;\n  }\n}\n\n// Parse DA to extract font and color information.\nfunction parseDefaultAppearance(str) {\n  return new DefaultAppearanceEvaluator(str).parse();\n}\n\nclass AppearanceStreamEvaluator extends EvaluatorPreprocessor {\n  constructor(stream, xref, globalColorSpaceCache) {\n    super(stream);\n    this.stream = stream;\n    this.xref = xref;\n    this.globalColorSpaceCache = globalColorSpaceCache;\n\n    this.resources = stream.dict?.get(\"Resources\");\n  }\n\n  parse() {\n    const operation = {\n      fn: 0,\n      args: [],\n    };\n    let result = {\n      scaleFactor: 1,\n      fontSize: 0,\n      fontName: \"\",\n      fontColor: /* black = */ new Uint8ClampedArray(3),\n      fillColorSpace: ColorSpaceUtils.gray,\n    };\n    let breakLoop = false;\n    const stack = [];\n\n    try {\n      while (true) {\n        operation.args.length = 0; // Ensure that `args` it's always reset.\n\n        if (breakLoop || !this.read(operation)) {\n          break;\n        }\n        const { fn, args } = operation;\n\n        switch (fn | 0) {\n          case OPS.save:\n            stack.push({\n              scaleFactor: result.scaleFactor,\n              fontSize: result.fontSize,\n              fontName: result.fontName,\n              fontColor: result.fontColor.slice(),\n              fillColorSpace: result.fillColorSpace,\n            });\n            break;\n          case OPS.restore:\n            result = stack.pop() || result;\n            break;\n          case OPS.setTextMatrix:\n            result.scaleFactor *= Math.hypot(args[0], args[1]);\n            break;\n          case OPS.setFont:\n            const [fontName, fontSize] = args;\n            if (fontName instanceof Name) {\n              result.fontName = fontName.name;\n            }\n            if (typeof fontSize === \"number\" && fontSize > 0) {\n              result.fontSize = fontSize * result.scaleFactor;\n            }\n            break;\n          case OPS.setFillColorSpace:\n            result.fillColorSpace = ColorSpaceUtils.parse({\n              cs: args[0],\n              xref: this.xref,\n              resources: this.resources,\n              pdfFunctionFactory: this._pdfFunctionFactory,\n              globalColorSpaceCache: this.globalColorSpaceCache,\n              localColorSpaceCache: this._localColorSpaceCache,\n            });\n            break;\n          case OPS.setFillColor:\n            const cs = result.fillColorSpace;\n            cs.getRgbItem(args, 0, result.fontColor, 0);\n            break;\n          case OPS.setFillRGBColor:\n            ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0);\n            break;\n          case OPS.setFillGray:\n            ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0);\n            break;\n          case OPS.setFillCMYKColor:\n            ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0);\n            break;\n          case OPS.showText:\n          case OPS.showSpacedText:\n          case OPS.nextLineShowText:\n          case OPS.nextLineSetSpacingShowText:\n            breakLoop = true;\n            break;\n        }\n      }\n    } catch (reason) {\n      warn(`parseAppearanceStream - ignoring errors: \"${reason}\".`);\n    }\n    this.stream.reset();\n    delete result.scaleFactor;\n    delete result.fillColorSpace;\n\n    return result;\n  }\n\n  get _localColorSpaceCache() {\n    return shadow(this, \"_localColorSpaceCache\", new LocalColorSpaceCache());\n  }\n\n  get _pdfFunctionFactory() {\n    return shadow(\n      this,\n      \"_pdfFunctionFactory\",\n      new PDFFunctionFactory({ xref: this.xref })\n    );\n  }\n}\n\n// Parse appearance stream to extract font and color information.\n// It returns the font properties used to render the first text object.\nfunction parseAppearanceStream(stream, xref, globalColorSpaceCache) {\n  return new AppearanceStreamEvaluator(\n    stream,\n    xref,\n    globalColorSpaceCache\n  ).parse();\n}\n\nfunction getPdfColor(color, isFill) {\n  if (color[0] === color[1] && color[1] === color[2]) {\n    const gray = color[0] / 255;\n    return `${numberToString(gray)} ${isFill ? \"g\" : \"G\"}`;\n  }\n  return (\n    Array.from(color, c => numberToString(c / 255)).join(\" \") +\n    ` ${isFill ? \"rg\" : \"RG\"}`\n  );\n}\n\n// Create default appearance string from some information.\nfunction createDefaultAppearance({ fontSize, fontName, fontColor }) {\n  return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(\n    fontColor,\n    /* isFill */ true\n  )}`;\n}\n\nclass FakeUnicodeFont {\n  static #fontNameId = 1;\n\n  constructor(xref, fontFamily) {\n    this.xref = xref;\n    this.widths = null;\n    this.firstChar = Infinity;\n    this.lastChar = -Infinity;\n    this.fontFamily = fontFamily;\n\n    const canvas = new OffscreenCanvas(1, 1);\n    this.ctxMeasure = canvas.getContext(\"2d\", { willReadFrequently: true });\n\n    this.fontName = Name.get(\n      `InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont.#fontNameId++}`\n    );\n  }\n\n  get fontDescriptorRef() {\n    if (!FakeUnicodeFont._fontDescriptorRef) {\n      const fontDescriptor = new Dict(this.xref);\n      fontDescriptor.setIfName(\"Type\", \"FontDescriptor\");\n      fontDescriptor.set(\"FontName\", this.fontName);\n      fontDescriptor.set(\"FontFamily\", \"MyriadPro Regular\");\n      fontDescriptor.set(\"FontBBox\", [0, 0, 0, 0]);\n      fontDescriptor.setIfName(\"FontStretch\", \"Normal\");\n      fontDescriptor.set(\"FontWeight\", 400);\n      fontDescriptor.set(\"ItalicAngle\", 0);\n\n      FakeUnicodeFont._fontDescriptorRef =\n        this.xref.getNewPersistentRef(fontDescriptor);\n    }\n\n    return FakeUnicodeFont._fontDescriptorRef;\n  }\n\n  get descendantFontRef() {\n    const descendantFont = new Dict(this.xref);\n    descendantFont.set(\"BaseFont\", this.fontName);\n    descendantFont.setIfName(\"Type\", \"Font\");\n    descendantFont.setIfName(\"Subtype\", \"CIDFontType0\");\n    descendantFont.setIfName(\"CIDToGIDMap\", \"Identity\");\n    descendantFont.set(\"FirstChar\", this.firstChar);\n    descendantFont.set(\"LastChar\", this.lastChar);\n    descendantFont.set(\"FontDescriptor\", this.fontDescriptorRef);\n    descendantFont.set(\"DW\", 1000);\n\n    const widths = [];\n    const chars = [...this.widths].sort();\n    let currentChar = null;\n    let currentWidths = null;\n    for (const [char, width] of chars) {\n      if (!currentChar) {\n        currentChar = char;\n        currentWidths = [width];\n        continue;\n      }\n      if (char === currentChar + currentWidths.length) {\n        currentWidths.push(width);\n      } else {\n        widths.push(currentChar, currentWidths);\n        currentChar = char;\n        currentWidths = [width];\n      }\n    }\n\n    if (currentChar) {\n      widths.push(currentChar, currentWidths);\n    }\n\n    descendantFont.set(\"W\", widths);\n\n    const cidSystemInfo = new Dict(this.xref);\n    cidSystemInfo.set(\"Ordering\", \"Identity\");\n    cidSystemInfo.set(\"Registry\", \"Adobe\");\n    cidSystemInfo.set(\"Supplement\", 0);\n    descendantFont.set(\"CIDSystemInfo\", cidSystemInfo);\n\n    return this.xref.getNewPersistentRef(descendantFont);\n  }\n\n  get baseFontRef() {\n    const baseFont = new Dict(this.xref);\n    baseFont.set(\"BaseFont\", this.fontName);\n    baseFont.setIfName(\"Type\", \"Font\");\n    baseFont.setIfName(\"Subtype\", \"Type0\");\n    baseFont.setIfName(\"Encoding\", \"Identity-H\");\n    baseFont.set(\"DescendantFonts\", [this.descendantFontRef]);\n    baseFont.setIfName(\"ToUnicode\", \"Identity-H\");\n\n    return this.xref.getNewPersistentRef(baseFont);\n  }\n\n  get resources() {\n    const resources = new Dict(this.xref);\n    const font = new Dict(this.xref);\n    font.set(this.fontName.name, this.baseFontRef);\n    resources.set(\"Font\", font);\n\n    return resources;\n  }\n\n  _createContext() {\n    this.widths = new Map();\n    this.ctxMeasure.font = `1000px ${this.fontFamily}`;\n\n    return this.ctxMeasure;\n  }\n\n  createFontResources(text) {\n    const ctx = this._createContext();\n    for (const line of text.split(/\\r\\n?|\\n/)) {\n      for (const char of line.split(\"\")) {\n        const code = char.charCodeAt(0);\n        if (this.widths.has(code)) {\n          continue;\n        }\n        const metrics = ctx.measureText(char);\n        const width = Math.ceil(metrics.width);\n        this.widths.set(code, width);\n        this.firstChar = Math.min(code, this.firstChar);\n        this.lastChar = Math.max(code, this.lastChar);\n      }\n    }\n\n    return this.resources;\n  }\n\n  static getFirstPositionInfo(rect, rotation, fontSize) {\n    // Get the position of the first char in the rect.\n    const [x1, y1, x2, y2] = rect;\n    let w = x2 - x1;\n    let h = y2 - y1;\n\n    if (rotation % 180 !== 0) {\n      [w, h] = [h, w];\n    }\n    const lineHeight = LINE_FACTOR * fontSize;\n    const lineDescent = LINE_DESCENT_FACTOR * fontSize;\n\n    return {\n      coords: [0, h + lineDescent - lineHeight],\n      bbox: [0, 0, w, h],\n      matrix:\n        rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined,\n    };\n  }\n\n  createAppearance(text, rect, rotation, fontSize, bgColor, strokeAlpha) {\n    const ctx = this._createContext();\n    const lines = [];\n    let maxWidth = -Infinity;\n    for (const line of text.split(/\\r\\n?|\\n/)) {\n      lines.push(line);\n      // The line width isn't the sum of the char widths, because in some\n      // languages, like arabic, it'd be wrong because of ligatures.\n      const lineWidth = ctx.measureText(line).width;\n      maxWidth = Math.max(maxWidth, lineWidth);\n      for (const code of codePointIter(line)) {\n        const char = String.fromCodePoint(code);\n        let width = this.widths.get(code);\n        if (width === undefined) {\n          const metrics = ctx.measureText(char);\n          width = Math.ceil(metrics.width);\n          this.widths.set(code, width);\n          this.firstChar = Math.min(code, this.firstChar);\n          this.lastChar = Math.max(code, this.lastChar);\n        }\n      }\n    }\n    maxWidth *= fontSize / 1000;\n\n    const [x1, y1, x2, y2] = rect;\n    let w = x2 - x1;\n    let h = y2 - y1;\n\n    if (rotation % 180 !== 0) {\n      [w, h] = [h, w];\n    }\n\n    const hscale = maxWidth > w ? w / maxWidth : 1;\n    let vscale = 1;\n    const lineHeight = LINE_FACTOR * fontSize;\n    const lineDescent = LINE_DESCENT_FACTOR * fontSize;\n    const maxHeight = lineHeight * lines.length;\n    if (maxHeight > h) {\n      vscale = h / maxHeight;\n    }\n    const fscale = Math.min(hscale, vscale);\n    const newFontSize = fontSize * fscale;\n\n    const buffer = [\n      \"q\",\n      `0 0 ${numberToString(w)} ${numberToString(h)} re W n`,\n      `BT`,\n      `1 0 0 1 0 ${numberToString(h + lineDescent)} Tm 0 Tc ${getPdfColor(\n        bgColor,\n        /* isFill */ true\n      )}`,\n      `/${this.fontName.name} ${numberToString(newFontSize)} Tf`,\n    ];\n\n    const { resources } = this;\n    strokeAlpha =\n      typeof strokeAlpha === \"number\" && strokeAlpha >= 0 && strokeAlpha <= 1\n        ? strokeAlpha\n        : 1;\n\n    if (strokeAlpha !== 1) {\n      buffer.push(\"/R0 gs\");\n      const extGState = new Dict(this.xref);\n      const r0 = new Dict(this.xref);\n      r0.set(\"ca\", strokeAlpha);\n      r0.set(\"CA\", strokeAlpha);\n      r0.setIfName(\"Type\", \"ExtGState\");\n      extGState.set(\"R0\", r0);\n      resources.set(\"ExtGState\", extGState);\n    }\n\n    const vShift = numberToString(lineHeight);\n    for (const line of lines) {\n      buffer.push(`0 -${vShift} Td <${stringToUTF16HexString(line)}> Tj`);\n    }\n    buffer.push(\"ET\", \"Q\");\n    const appearance = buffer.join(\"\\n\");\n\n    const appearanceStreamDict = new Dict(this.xref);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n    appearanceStreamDict.setIfName(\"Type\", \"XObject\");\n    appearanceStreamDict.set(\"BBox\", [0, 0, w, h]);\n    appearanceStreamDict.set(\"Length\", appearance.length);\n    appearanceStreamDict.set(\"Resources\", resources);\n\n    if (rotation) {\n      const matrix = getRotationMatrix(rotation, w, h);\n      appearanceStreamDict.set(\"Matrix\", matrix);\n    }\n\n    return new StringStream(appearance, appearanceStreamDict);\n  }\n}\n\nexport {\n  createDefaultAppearance,\n  FakeUnicodeFont,\n  getPdfColor,\n  parseAppearanceStream,\n  parseDefaultAppearance,\n};\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * PLEASE NOTE: This file is currently imported in both the `../display/` and\n *              `../scripting_api/` folders, hence be EXTREMELY careful about\n *              introducing any dependencies here since that can lead to an\n *              unexpected/unnecessary size increase of the *built* files.\n */\n\nimport { MathClamp } from \"../shared/math_clamp.js\";\n\nfunction makeColorComp(n) {\n  return Math.floor(MathClamp(n, 0, 1) * 255)\n    .toString(16)\n    .padStart(2, \"0\");\n}\n\nfunction scaleAndClamp(x) {\n  return MathClamp(x, 0, 1) * 255;\n}\n\n// PDF specifications section 10.3\nclass ColorConverters {\n  static CMYK_G([c, y, m, k]) {\n    return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n  }\n\n  static G_CMYK([g]) {\n    return [\"CMYK\", 0, 0, 0, 1 - g];\n  }\n\n  static G_RGB([g]) {\n    return [\"RGB\", g, g, g];\n  }\n\n  static G_rgb([g]) {\n    g = scaleAndClamp(g);\n    return [g, g, g];\n  }\n\n  static G_HTML([g]) {\n    const G = makeColorComp(g);\n    return `#${G}${G}${G}`;\n  }\n\n  static RGB_G([r, g, b]) {\n    return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n  }\n\n  static RGB_rgb(color) {\n    return color.map(scaleAndClamp);\n  }\n\n  static RGB_HTML(color) {\n    return `#${color.map(makeColorComp).join(\"\")}`;\n  }\n\n  static T_HTML() {\n    return \"#00000000\";\n  }\n\n  static T_rgb() {\n    return [null];\n  }\n\n  static CMYK_RGB([c, y, m, k]) {\n    return [\n      \"RGB\",\n      1 - Math.min(1, c + k),\n      1 - Math.min(1, m + k),\n      1 - Math.min(1, y + k),\n    ];\n  }\n\n  static CMYK_rgb([c, y, m, k]) {\n    return [\n      scaleAndClamp(1 - Math.min(1, c + k)),\n      scaleAndClamp(1 - Math.min(1, m + k)),\n      scaleAndClamp(1 - Math.min(1, y + k)),\n    ];\n  }\n\n  static CMYK_HTML(components) {\n    const rgb = this.CMYK_RGB(components).slice(1);\n    return this.RGB_HTML(rgb);\n  }\n\n  static RGB_CMYK([r, g, b]) {\n    const c = 1 - r;\n    const m = 1 - g;\n    const y = 1 - b;\n    const k = Math.min(c, m, y);\n    return [\"CMYK\", c, m, y, k];\n  }\n}\n\nconst DateFormats = [\n  \"m/d\",\n  \"m/d/yy\",\n  \"mm/dd/yy\",\n  \"mm/yy\",\n  \"d-mmm\",\n  \"d-mmm-yy\",\n  \"dd-mmm-yy\",\n  \"yy-mm-dd\",\n  \"mmm-yy\",\n  \"mmmm-yy\",\n  \"mmm d, yyyy\",\n  \"mmmm d, yyyy\",\n  \"m/d/yy h:MM tt\",\n  \"m/d/yy HH:MM\",\n];\nconst TimeFormats = [\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"];\n\nexport { ColorConverters, DateFormats, TimeFormats };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Dict, Ref, RefSet } from \"./primitives.js\";\nimport { FormatError, unreachable, warn } from \"../shared/util.js\";\n\n/**\n * A NameTree/NumberTree is like a Dict but has some advantageous properties,\n * see the specification (7.9.6 and 7.9.7) for additional details.\n * TODO: implement all the Dict functions and make this more efficient.\n */\nclass NameOrNumberTree {\n  constructor(root, xref, type) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === NameOrNumberTree\n    ) {\n      unreachable(\"Cannot initialize NameOrNumberTree.\");\n    }\n    this.root = root;\n    this.xref = xref;\n    this._type = type;\n  }\n\n  getAll(isRaw = false) {\n    const map = new Map();\n    if (!this.root) {\n      return map;\n    }\n    const xref = this.xref;\n    // Reading Name/Number tree.\n    const processed = new RefSet();\n    if (this.root instanceof Ref) {\n      processed.put(this.root);\n    }\n    const queue = [this.root];\n    for (const node of queue) {\n      const obj = xref.fetchIfRef(node);\n      if (!(obj instanceof Dict)) {\n        continue;\n      }\n      if (obj.has(\"Kids\")) {\n        const kids = obj.get(\"Kids\");\n        if (!Array.isArray(kids)) {\n          continue;\n        }\n        for (const kid of kids) {\n          if (kid instanceof Ref) {\n            if (processed.has(kid)) {\n              throw new FormatError(`Duplicate entry in \"${this._type}\" tree.`);\n            }\n            processed.put(kid);\n          }\n          queue.push(kid);\n        }\n        continue;\n      }\n      const entries = obj.get(this._type);\n      if (!Array.isArray(entries)) {\n        continue;\n      }\n      for (let i = 0, ii = entries.length; i < ii; i += 2) {\n        map.set(\n          isRaw ? entries[i] : xref.fetchIfRef(entries[i]),\n          isRaw ? entries[i + 1] : xref.fetchIfRef(entries[i + 1])\n        );\n      }\n    }\n    return map;\n  }\n\n  getRaw(key) {\n    if (!this.root) {\n      return null;\n    }\n    const xref = this.xref;\n    let kidsOrEntries = xref.fetchIfRef(this.root);\n    let loopCount = 0;\n    const MAX_LEVELS = 10;\n\n    // Perform a binary search to quickly find the entry that\n    // contains the key we are looking for.\n    while (kidsOrEntries.has(\"Kids\")) {\n      if (++loopCount > MAX_LEVELS) {\n        warn(`Search depth limit reached for \"${this._type}\" tree.`);\n        return null;\n      }\n\n      const kids = kidsOrEntries.get(\"Kids\");\n      if (!Array.isArray(kids)) {\n        return null;\n      }\n\n      let l = 0,\n        r = kids.length - 1;\n      while (l <= r) {\n        const m = (l + r) >> 1;\n        const kid = xref.fetchIfRef(kids[m]);\n        const limits = kid.get(\"Limits\");\n\n        if (key < xref.fetchIfRef(limits[0])) {\n          r = m - 1;\n        } else if (key > xref.fetchIfRef(limits[1])) {\n          l = m + 1;\n        } else {\n          kidsOrEntries = kid;\n          break;\n        }\n      }\n      if (l > r) {\n        return null;\n      }\n    }\n\n    // If we get here, then we have found the right entry. Now go through the\n    // entries in the dictionary until we find the key we're looking for.\n    const entries = kidsOrEntries.get(this._type);\n    if (Array.isArray(entries)) {\n      // Perform a binary search to reduce the lookup time.\n      let l = 0,\n        r = entries.length - 2;\n      while (l <= r) {\n        // Check only even indices (0, 2, 4, ...) because the\n        // odd indices contain the actual data.\n        const tmp = (l + r) >> 1,\n          m = tmp + (tmp & 1);\n        const currentKey = xref.fetchIfRef(entries[m]);\n        if (key < currentKey) {\n          r = m - 2;\n        } else if (key > currentKey) {\n          l = m + 2;\n        } else {\n          return entries[m + 1];\n        }\n      }\n    }\n    return null;\n  }\n\n  get(key) {\n    return this.xref.fetchIfRef(this.getRaw(key));\n  }\n}\n\nclass NameTree extends NameOrNumberTree {\n  constructor(root, xref) {\n    super(root, xref, \"Names\");\n  }\n}\n\nclass NumberTree extends NameOrNumberTree {\n  constructor(root, xref) {\n    super(root, xref, \"Nums\");\n  }\n}\n\nexport { NameTree, NumberTree };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { clearPatternCaches } from \"./pattern.js\";\nimport { clearPrimitiveCaches } from \"./primitives.js\";\nimport { clearUnicodeCaches } from \"./unicode.js\";\nimport { WasmImage } from \"./wasm_image.js\";\n\nfunction clearGlobalCaches() {\n  clearPatternCaches();\n  clearPrimitiveCaches();\n  clearUnicodeCaches();\n\n  // Remove the global `WasmImage` instances,\n  // since they may hold references to the WebAssembly modules.\n  WasmImage.cleanup();\n}\n\nexport { clearGlobalCaches };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  PasswordException,\n  PasswordResponses,\n  stripPath,\n  warn,\n} from \"../shared/util.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { Dict } from \"./primitives.js\";\nimport { stringToPDFString } from \"./string_utils.js\";\n\n/**\n * @import { CatalogAttachmentContent } from \"./catalog.js\";\n */\n\n/**\n * \"A PDF file can refer to the contents of another file by using a File\n * Specification (PDF 1.1)\", see the spec (7.11) for more details.\n * NOTE: Only embedded files are supported (as part of the attachments support)\n * TODO: support the 'URL' file system (with caching if !/V), portable\n * collections attributes and related files (/RF)\n */\nclass FileSpec {\n  /**\n   * @param {Dict | null | undefined} root\n   *   File specification dictionary.\n   */\n  constructor(root) {\n    if (!(root instanceof Dict)) {\n      return;\n    }\n    this.root = root;\n    if (root.has(\"FS\")) {\n      this.fs = root.get(\"FS\");\n    }\n    if (root.has(\"RF\")) {\n      warn(\"Related file specifications are not supported\");\n    }\n  }\n\n  get filename() {\n    const item = FileSpec.pickPlatformItem(this.root);\n    if (item && typeof item === \"string\") {\n      // NOTE: The following replacement order is INTENTIONAL, regardless of\n      //       what some static code analysers (e.g. CodeQL) may claim.\n      return stringToPDFString(item, /* keepEscapeSequence = */ true)\n        .replaceAll(\"\\\\\\\\\", \"\\\\\")\n        .replaceAll(\"\\\\/\", \"/\")\n        .replaceAll(\"\\\\\", \"/\");\n    }\n    return \"\";\n  }\n\n  get description() {\n    const desc = this.root?.get(\"Desc\");\n    if (desc && typeof desc === \"string\") {\n      return stringToPDFString(desc);\n    }\n    return \"\";\n  }\n\n  get serializable() {\n    const { filename, description } = this;\n    return {\n      rawFilename: filename,\n      filename: stripPath(filename) || \"unnamed\",\n      description,\n    };\n  }\n\n  /**\n   * Get a platform-specific item from a file-spec dictionary.\n   *\n   * Search order follows the PDF platform keys: `UF`, `F`, `Unix`, `Mac`,\n   * `DOS`.\n   *\n   * @param {Dict | null | undefined} dict\n   *   Dictionary.\n   * @param {boolean} [raw]\n   *   Return the raw (possibly indirect) value rather than the resolved one.\n   * @returns {unknown}\n   *   Matching dictionary value or `null` when no key is found.\n   */\n  static pickPlatformItem(dict, raw = false) {\n    if (dict instanceof Dict) {\n      // Look for the filename in this order: UF, F, Unix, Mac, DOS\n      for (const key of [\"UF\", \"F\", \"Unix\", \"Mac\", \"DOS\"]) {\n        if (dict.has(key)) {\n          return raw ? dict.getRaw(key) : dict.get(key);\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Whether a file specification carries an embedded file we can read.\n   *\n   * @param {Dict} fileSpecDict\n   * @returns {boolean}\n   */\n  static hasEmbeddedFile(fileSpecDict) {\n    return this.pickPlatformItem(fileSpecDict.get(\"EF\")) instanceof BaseStream;\n  }\n\n  /**\n   * Read attachment bytes from a file-spec dictionary.\n   *\n   * @param {Dict | null | undefined} dict\n   *   File-spec dictionary containing an `EF` entry.\n   * @returns {CatalogAttachmentContent}\n   *   Attachment bytes when available; otherwise `null`.\n   * @throws {PasswordException}\n   *   When attachment bytes are encrypted and no key is available.\n   */\n  static readContent(dict) {\n    if (!(dict instanceof Dict)) {\n      return null;\n    }\n    const ef = this.pickPlatformItem(dict.get(\"EF\"));\n    if (!(ef instanceof BaseStream)) {\n      warn(\n        \"Embedded file specification points to non-existing/invalid content\"\n      );\n      return null;\n    }\n    return this.readStreamContent(ef);\n  }\n\n  /**\n   * Read the bytes of an embedded-file stream.\n   *\n   * @param {BaseStream} stream\n   *   Embedded-file stream.\n   * @returns {CatalogAttachmentContent}\n   *   Attachment bytes.\n   * @throws {PasswordException}\n   *   When the bytes are encrypted and no key is available.\n   */\n  static readStreamContent(stream) {\n    // Throw if we need a password but don鈥檛 have one.\n    const encrypt = stream.dict?.xref?.encrypt;\n    if (encrypt?.encryptionKey === null) {\n      throw new PasswordException(\n        \"No password given\",\n        PasswordResponses.NEED_PASSWORD\n      );\n    }\n    return stream.getBytes();\n  }\n}\n\nexport { FileSpec };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// The code for XMLParserBase copied from\n// https://github.com/mozilla/shumway/blob/16451d8836fa85f4b16eeda8b4bda2fa9e2b22b0/src/avm2/natives/xml.ts\n\nimport { encodeToXmlString } from \"./core_utils.js\";\nimport { shadow } from \"../shared/util.js\";\n\nconst XMLParserErrorCode = {\n  NoError: 0,\n  EndOfDocument: -1,\n  UnterminatedCdat: -2,\n  UnterminatedXmlDeclaration: -3,\n  UnterminatedDoctypeDeclaration: -4,\n  UnterminatedComment: -5,\n  MalformedElement: -6,\n  OutOfMemory: -7,\n  UnterminatedAttributeValue: -8,\n  UnterminatedElement: -9,\n  ElementNeverBegun: -10,\n};\n\nfunction isWhitespace(s, index) {\n  const ch = s[index];\n  return ch === \" \" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\";\n}\n\nfunction isWhitespaceString(s) {\n  for (let i = 0, ii = s.length; i < ii; i++) {\n    if (!isWhitespace(s, i)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nclass XMLParserBase {\n  static get _entityRegex() {\n    return shadow(this, \"_entityRegex\", /&(?:#x([^;]+)|#([^;]+)|([^;]+));/g);\n  }\n\n  _resolveEntities(s) {\n    return s.replaceAll(XMLParserBase._entityRegex, (_, hex, dec, entity) => {\n      if (hex) {\n        return String.fromCodePoint(parseInt(hex, 16));\n      }\n      if (dec) {\n        return String.fromCodePoint(parseInt(dec, 10));\n      }\n      switch (entity) {\n        case \"lt\":\n          return \"<\";\n        case \"gt\":\n          return \">\";\n        case \"amp\":\n          return \"&\";\n        case \"quot\":\n          return '\"';\n        case \"apos\":\n          return \"'\";\n      }\n      return this.onResolveEntity(entity);\n    });\n  }\n\n  _parseContent(s, start) {\n    const attributes = [];\n    let pos = start;\n\n    function skipWs() {\n      while (pos < s.length && isWhitespace(s, pos)) {\n        ++pos;\n      }\n    }\n\n    while (\n      pos < s.length &&\n      !isWhitespace(s, pos) &&\n      s[pos] !== \">\" &&\n      s[pos] !== \"/\"\n    ) {\n      ++pos;\n    }\n    const name = s.substring(start, pos);\n    skipWs();\n    while (\n      pos < s.length &&\n      s[pos] !== \">\" &&\n      s[pos] !== \"/\" &&\n      s[pos] !== \"?\"\n    ) {\n      skipWs();\n      let attrName = \"\",\n        attrValue = \"\";\n      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== \"=\") {\n        attrName += s[pos];\n        ++pos;\n      }\n      skipWs();\n      if (s[pos] !== \"=\") {\n        return null;\n      }\n      ++pos;\n      skipWs();\n      const attrEndChar = s[pos];\n      if (attrEndChar !== '\"' && attrEndChar !== \"'\") {\n        return null;\n      }\n      const attrEndIndex = s.indexOf(attrEndChar, ++pos);\n      if (attrEndIndex < 0) {\n        return null;\n      }\n      attrValue = s.substring(pos, attrEndIndex);\n      attributes.push({\n        name: attrName,\n        value: this._resolveEntities(attrValue),\n      });\n      pos = attrEndIndex + 1;\n      skipWs();\n    }\n    return {\n      name,\n      attributes,\n      parsed: pos - start,\n    };\n  }\n\n  _parseProcessingInstruction(s, start) {\n    let pos = start;\n\n    function skipWs() {\n      while (pos < s.length && isWhitespace(s, pos)) {\n        ++pos;\n      }\n    }\n\n    while (\n      pos < s.length &&\n      !isWhitespace(s, pos) &&\n      s[pos] !== \">\" &&\n      s[pos] !== \"?\" &&\n      s[pos] !== \"/\"\n    ) {\n      ++pos;\n    }\n    const name = s.substring(start, pos);\n    skipWs();\n    const attrStart = pos;\n    while (pos < s.length && (s[pos] !== \"?\" || s[pos + 1] !== \">\")) {\n      ++pos;\n    }\n    const value = s.substring(attrStart, pos);\n    return {\n      name,\n      value,\n      parsed: pos - start,\n    };\n  }\n\n  parseXml(s) {\n    let i = 0;\n    while (i < s.length) {\n      const ch = s[i];\n      let j = i;\n      if (ch === \"<\") {\n        ++j;\n        const ch2 = s[j];\n        let q;\n        switch (ch2) {\n          case \"/\":\n            ++j;\n            q = s.indexOf(\">\", j);\n            if (q < 0) {\n              this.onError(XMLParserErrorCode.UnterminatedElement);\n              return;\n            }\n            this.onEndElement(s.substring(j, q));\n            j = q + 1;\n            break;\n          case \"?\":\n            ++j;\n            const pi = this._parseProcessingInstruction(s, j);\n            if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== \"?>\") {\n              this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);\n              return;\n            }\n            this.onPi(pi.name, pi.value);\n            j += pi.parsed + 2;\n            break;\n          case \"!\":\n            if (s.substring(j + 1, j + 3) === \"--\") {\n              q = s.indexOf(\"-->\", j + 3);\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedComment);\n                return;\n              }\n              this.onComment(s.substring(j + 3, q));\n              j = q + 3;\n            } else if (s.substring(j + 1, j + 8) === \"[CDATA[\") {\n              q = s.indexOf(\"]]>\", j + 8);\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedCdat);\n                return;\n              }\n              this.onCdata(s.substring(j + 8, q));\n              j = q + 3;\n            } else if (s.substring(j + 1, j + 8) === \"DOCTYPE\") {\n              const q2 = s.indexOf(\"[\", j + 8);\n              let complexDoctype = false;\n              q = s.indexOf(\">\", j + 8);\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);\n                return;\n              }\n              if (q2 > 0 && q > q2) {\n                q = s.indexOf(\"]>\", j + 8);\n                if (q < 0) {\n                  this.onError(\n                    XMLParserErrorCode.UnterminatedDoctypeDeclaration\n                  );\n                  return;\n                }\n                complexDoctype = true;\n              }\n              const doctypeContent = s.substring(\n                j + 8,\n                q + (complexDoctype ? 1 : 0)\n              );\n              this.onDoctype(doctypeContent);\n              j = q + (complexDoctype ? 2 : 1);\n            } else {\n              this.onError(XMLParserErrorCode.MalformedElement);\n              return;\n            }\n            break;\n          default:\n            const content = this._parseContent(s, j);\n            if (content === null) {\n              this.onError(XMLParserErrorCode.MalformedElement);\n              return;\n            }\n            let isClosed = false;\n            if (\n              s.substring(j + content.parsed, j + content.parsed + 2) === \"/>\"\n            ) {\n              isClosed = true;\n            } else if (\n              s.substring(j + content.parsed, j + content.parsed + 1) !== \">\"\n            ) {\n              this.onError(XMLParserErrorCode.UnterminatedElement);\n              return;\n            }\n            this.onBeginElement(content.name, content.attributes, isClosed);\n            j += content.parsed + (isClosed ? 2 : 1);\n            break;\n        }\n      } else {\n        while (j < s.length && s[j] !== \"<\") {\n          j++;\n        }\n        const text = s.substring(i, j);\n        this.onText(this._resolveEntities(text));\n      }\n      i = j;\n    }\n  }\n\n  onResolveEntity(name) {\n    return `&${name};`;\n  }\n\n  onPi(name, value) {}\n\n  onComment(text) {}\n\n  onCdata(text) {}\n\n  onDoctype(doctypeContent) {}\n\n  onText(text) {}\n\n  onBeginElement(name, attributes, isEmpty) {}\n\n  onEndElement(name) {}\n\n  onError(code) {}\n}\n\nclass SimpleDOMNode {\n  constructor(nodeName, nodeValue) {\n    this.nodeName = nodeName;\n    this.nodeValue = nodeValue;\n\n    Object.defineProperty(this, \"parentNode\", { value: null, writable: true });\n  }\n\n  get firstChild() {\n    return this.childNodes?.[0];\n  }\n\n  get nextSibling() {\n    const childNodes = this.parentNode.childNodes;\n    if (!childNodes) {\n      return undefined;\n    }\n    const index = childNodes.indexOf(this);\n    if (index === -1) {\n      return undefined;\n    }\n    return childNodes[index + 1];\n  }\n\n  get textContent() {\n    if (!this.childNodes) {\n      return this.nodeValue || \"\";\n    }\n    return this.childNodes.map(child => child.textContent).join(\"\");\n  }\n\n  get children() {\n    return this.childNodes || [];\n  }\n\n  hasChildNodes() {\n    return this.childNodes?.length > 0;\n  }\n\n  /**\n   * Search a node in the tree with the given path\n   * foo.bar[nnn], i.e. find the nnn-th node named\n   * bar under a node named foo.\n   *\n   * @param {Array} paths - an array of objects as\n   * returned by {parseXFAPath}.\n   * @param {number} pos - the current position in\n   * the paths array.\n   * @returns {SimpleDOMNode} The node corresponding\n   * to the path or null if not found.\n   */\n  searchNode(paths, pos) {\n    if (pos >= paths.length) {\n      return this;\n    }\n\n    const component = paths[pos];\n    if (component.name.startsWith(\"#\") && pos < paths.length - 1) {\n      // If it starts with a # then it's a class which is not a concept for\n      // datasets elements (https://www.pdfa.org/norm-refs/XFA-3_3.pdf#page=96).\n      return this.searchNode(paths, pos + 1);\n    }\n    const stack = [];\n    let node = this;\n\n    while (true) {\n      if (component.name === node.nodeName) {\n        if (component.pos === 0) {\n          const res = node.searchNode(paths, pos + 1);\n          if (res !== null) {\n            return res;\n          }\n        } else if (stack.length === 0) {\n          return null;\n        } else {\n          const [parent] = stack.pop();\n          let siblingPos = 0;\n          for (const child of parent.childNodes) {\n            if (component.name === child.nodeName) {\n              if (siblingPos === component.pos) {\n                return child.searchNode(paths, pos + 1);\n              }\n              siblingPos++;\n            }\n          }\n          // We didn't find the correct sibling\n          // so just return the first found node\n          return node.searchNode(paths, pos + 1);\n        }\n      }\n\n      if (node.childNodes?.length > 0) {\n        stack.push([node, 0]);\n        node = node.childNodes[0];\n      } else if (stack.length === 0) {\n        return null;\n      } else {\n        while (stack.length !== 0) {\n          const [parent, currentPos] = stack.pop();\n          const newPos = currentPos + 1;\n          if (newPos < parent.childNodes.length) {\n            stack.push([parent, newPos]);\n            node = parent.childNodes[newPos];\n            break;\n          }\n        }\n        if (stack.length === 0) {\n          return null;\n        }\n      }\n    }\n  }\n\n  dump(buffer) {\n    if (this.nodeName === \"#text\") {\n      buffer.push(encodeToXmlString(this.nodeValue));\n      return;\n    }\n\n    buffer.push(`<${this.nodeName}`);\n    if (this.attributes) {\n      for (const attribute of this.attributes) {\n        buffer.push(\n          ` ${attribute.name}=\"${encodeToXmlString(attribute.value)}\"`\n        );\n      }\n    }\n    if (this.hasChildNodes()) {\n      buffer.push(\">\");\n      for (const child of this.childNodes) {\n        child.dump(buffer);\n      }\n      buffer.push(`</${this.nodeName}>`);\n    } else if (this.nodeValue) {\n      buffer.push(`>${encodeToXmlString(this.nodeValue)}</${this.nodeName}>`);\n    } else {\n      buffer.push(\"/>\");\n    }\n  }\n}\n\nclass SimpleXMLParser extends XMLParserBase {\n  constructor({ hasAttributes = false, lowerCaseName = false }) {\n    super();\n    this._currentFragment = null;\n    this._stack = null;\n    this._errorCode = XMLParserErrorCode.NoError;\n    this._hasAttributes = hasAttributes;\n    this._lowerCaseName = lowerCaseName;\n  }\n\n  parseFromString(data) {\n    this._currentFragment = [];\n    this._stack = [];\n    this._errorCode = XMLParserErrorCode.NoError;\n\n    this.parseXml(data);\n\n    if (this._errorCode !== XMLParserErrorCode.NoError) {\n      return undefined; // return undefined on error\n    }\n\n    // We should only have one root.\n    const [documentElement] = this._currentFragment;\n    if (!documentElement) {\n      return undefined; // Return undefined if no root was found.\n    }\n    return { documentElement };\n  }\n\n  onText(text) {\n    if (isWhitespaceString(text)) {\n      return;\n    }\n    const node = new SimpleDOMNode(\"#text\", text);\n    this._currentFragment.push(node);\n  }\n\n  onCdata(text) {\n    const node = new SimpleDOMNode(\"#text\", text);\n    this._currentFragment.push(node);\n  }\n\n  onBeginElement(name, attributes, isEmpty) {\n    if (this._lowerCaseName) {\n      name = name.toLowerCase();\n    }\n    const node = new SimpleDOMNode(name);\n    node.childNodes = [];\n    if (this._hasAttributes) {\n      node.attributes = attributes;\n    }\n    this._currentFragment.push(node);\n    if (isEmpty) {\n      return;\n    }\n    this._stack.push(this._currentFragment);\n    this._currentFragment = node.childNodes;\n  }\n\n  onEndElement(name) {\n    this._currentFragment = this._stack.pop() || [];\n    const lastElement = this._currentFragment.at(-1);\n    if (!lastElement) {\n      return null;\n    }\n    for (const childNode of lastElement.childNodes) {\n      childNode.parentNode = lastElement;\n    }\n    return lastElement;\n  }\n\n  onError(code) {\n    this._errorCode = code;\n  }\n}\n\nexport { SimpleDOMNode, SimpleXMLParser, XMLParserBase, XMLParserErrorCode };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SimpleXMLParser } from \"./xml_parser.js\";\n\nclass MetadataParser {\n  constructor(data) {\n    // Ghostscript may produce invalid metadata, so try to repair that first.\n    data = this._repair(data);\n\n    // Convert the string to an XML document.\n    const parser = new SimpleXMLParser({ lowerCaseName: true });\n    const xmlDocument = parser.parseFromString(data);\n\n    this._metadataMap = new Map();\n    this._data = data;\n\n    if (xmlDocument) {\n      this._parse(xmlDocument);\n    }\n  }\n\n  _repair(data) {\n    // Start by removing any \"junk\" before the first tag (see issue 10395).\n    return data\n      .replace(/^[^<]+/, \"\")\n      .replaceAll(/>\\\\376\\\\377([^<]+)/g, function (all, codes) {\n        const bytes = codes\n          .replaceAll(/\\\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {\n            return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);\n          })\n          .replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) {\n            switch (name) {\n              case \"amp\":\n                return \"&\";\n              case \"apos\":\n                return \"'\";\n              case \"gt\":\n                return \">\";\n              case \"lt\":\n                return \"<\";\n              case \"quot\":\n                return '\"';\n            }\n            throw new Error(`_repair: ${name} isn't defined.`);\n          });\n\n        const charBuf = [\">\"];\n        for (let i = 0, ii = bytes.length; i < ii; i += 2) {\n          const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);\n          if (\n            code >= /* Space = */ 32 &&\n            code < /* Delete = */ 127 &&\n            code !== /* '<' = */ 60 &&\n            code !== /* '>' = */ 62 &&\n            code !== /* '&' = */ 38\n          ) {\n            charBuf.push(String.fromCharCode(code));\n          } else {\n            charBuf.push(\n              \"&#x\" + (0x10000 + code).toString(16).substring(1) + \";\"\n            );\n          }\n        }\n        return charBuf.join(\"\");\n      });\n  }\n\n  _getSequence(entry) {\n    const name = entry.nodeName;\n    if (name !== \"rdf:bag\" && name !== \"rdf:seq\" && name !== \"rdf:alt\") {\n      return null;\n    }\n    return entry.childNodes.filter(node => node.nodeName === \"rdf:li\");\n  }\n\n  _parseArray(entry) {\n    if (!entry.hasChildNodes()) {\n      return;\n    }\n    // Child must be a Bag (unordered array) or a Seq.\n    const [seqNode] = entry.childNodes;\n    const sequence = this._getSequence(seqNode) || [];\n\n    this._metadataMap.set(\n      entry.nodeName,\n      sequence.map(node => node.textContent.trim())\n    );\n  }\n\n  _parse(xmlDocument) {\n    let rdf = xmlDocument.documentElement;\n\n    if (rdf.nodeName !== \"rdf:rdf\") {\n      // Wrapped in <xmpmeta>\n      rdf = rdf.firstChild;\n      while (rdf && rdf.nodeName !== \"rdf:rdf\") {\n        rdf = rdf.nextSibling;\n      }\n    }\n\n    if (!rdf || rdf.nodeName !== \"rdf:rdf\" || !rdf.hasChildNodes()) {\n      return;\n    }\n\n    for (const desc of rdf.childNodes) {\n      if (desc.nodeName !== \"rdf:description\") {\n        continue;\n      }\n\n      for (const entry of desc.childNodes) {\n        const name = entry.nodeName;\n        switch (name) {\n          case \"#text\":\n            continue;\n          case \"dc:creator\":\n          case \"dc:subject\":\n            this._parseArray(entry);\n            continue;\n        }\n        this._metadataMap.set(name, entry.textContent.trim());\n      }\n    }\n  }\n\n  get serializable() {\n    return {\n      parsedData: this._metadataMap,\n      rawData: this._data,\n    };\n  }\n}\n\nexport { MetadataParser };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationPrefix,\n  makeArr,\n  stringToUTF8String,\n  warn,\n} from \"../shared/util.js\";\nimport { Dict, isDict, isName, Name, Ref, RefSetCache } from \"./primitives.js\";\nimport { lookupNormalRect, MissingDataException } from \"./core_utils.js\";\nimport { stringToAsciiOrUTF16BE, stringToPDFString } from \"./string_utils.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { FileSpec } from \"./file_spec.js\";\nimport { NumberTree } from \"./name_number_tree.js\";\n\nconst MAX_DEPTH = 40;\n\nconst StructElementType = {\n  PAGE_CONTENT: 1,\n  STREAM_CONTENT: 2,\n  OBJECT: 3,\n  ANNOTATION: 4,\n  ELEMENT: 5,\n};\n\nclass StructTreeRoot {\n  kidRefToPosition = undefined;\n\n  parentTree = null;\n\n  roleMap = new Map();\n\n  structParentIds = null;\n\n  constructor(xref, rootDict, rootRef) {\n    this.xref = xref;\n    this.dict = rootDict;\n    this.ref = rootRef instanceof Ref ? rootRef : null;\n\n    const roleMap = rootDict.get(\"RoleMap\");\n    if (roleMap instanceof Dict) {\n      for (const [key, value] of roleMap) {\n        if (value instanceof Name) {\n          this.roleMap.set(key, value.name);\n        }\n      }\n    }\n    const parentTree = rootDict.getRaw(\"ParentTree\");\n    if (parentTree) {\n      this.parentTree = new NumberTree(parentTree, xref);\n    }\n  }\n\n  getKidPosition(kidRef) {\n    if (this.kidRefToPosition === undefined) {\n      const obj = this.dict.get(\"K\");\n      if (Array.isArray(obj)) {\n        const map = (this.kidRefToPosition = new Map());\n        for (let i = 0, ii = obj.length; i < ii; i++) {\n          const ref = obj[i];\n          if (ref) {\n            map.set(ref.toString(), i);\n          }\n        }\n      } else if (obj instanceof Dict) {\n        this.kidRefToPosition = new Map([[obj.objId, 0]]);\n      } else if (!obj) {\n        this.kidRefToPosition = new Map();\n      } else {\n        this.kidRefToPosition = null;\n      }\n    }\n    return this.kidRefToPosition\n      ? (this.kidRefToPosition.get(kidRef) ?? NaN)\n      : -1;\n  }\n\n  #addIdToPage(pageRef, id, type) {\n    if (!(pageRef instanceof Ref) || id < 0) {\n      return;\n    }\n    this.structParentIds ||= new RefSetCache();\n    let ids = this.structParentIds.get(pageRef);\n    if (!ids) {\n      ids = [];\n      this.structParentIds.put(pageRef, ids);\n    }\n    ids.push([id, type]);\n  }\n\n  addAnnotationIdToPage(pageRef, id) {\n    this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION);\n  }\n\n  static async canCreateStructureTree({\n    catalogRef,\n    pdfManager,\n    newAnnotationsByPage,\n  }) {\n    if (!(catalogRef instanceof Ref)) {\n      warn(\"Cannot save the struct tree: no catalog reference.\");\n      return false;\n    }\n\n    let nextKey = 0;\n    let hasNothingToUpdate = true;\n\n    for (const [pageIndex, elements] of newAnnotationsByPage) {\n      const { ref: pageRef } = await pdfManager.getPage(pageIndex);\n      if (!(pageRef instanceof Ref)) {\n        warn(`Cannot save the struct tree: page ${pageIndex} has no ref.`);\n        hasNothingToUpdate = true;\n        break;\n      }\n      for (const element of elements) {\n        if (element.accessibilityData?.type) {\n          // Each tag must have a structure type.\n          element.parentTreeId = nextKey++;\n          hasNothingToUpdate = false;\n        }\n      }\n    }\n\n    if (hasNothingToUpdate) {\n      for (const elements of newAnnotationsByPage.values()) {\n        for (const element of elements) {\n          delete element.parentTreeId;\n        }\n      }\n      return false;\n    }\n\n    return true;\n  }\n\n  static async createStructureTree({\n    newAnnotationsByPage,\n    xref,\n    catalogRef,\n    pdfManager,\n    changes,\n  }) {\n    const root = await pdfManager.ensureCatalog(\"cloneDict\");\n    const cache = new RefSetCache();\n    cache.put(catalogRef, root);\n\n    const structTreeRootRef = xref.getNewTemporaryRef();\n    root.set(\"StructTreeRoot\", structTreeRootRef);\n\n    const structTreeRoot = new Dict(xref);\n    structTreeRoot.set(\"Type\", Name.get(\"StructTreeRoot\"));\n    const parentTreeRef = xref.getNewTemporaryRef();\n    structTreeRoot.set(\"ParentTree\", parentTreeRef);\n    const kids = [];\n    structTreeRoot.set(\"K\", kids);\n    cache.put(structTreeRootRef, structTreeRoot);\n\n    const parentTree = new Dict(xref);\n    const nums = [];\n    parentTree.set(\"Nums\", nums);\n\n    const nextKey = await this.#writeKids({\n      newAnnotationsByPage,\n      structTreeRootRef,\n      structTreeRoot: null,\n      kids,\n      nums,\n      xref,\n      pdfManager,\n      changes,\n      cache,\n    });\n    structTreeRoot.set(\"ParentTreeNextKey\", nextKey);\n\n    cache.put(parentTreeRef, parentTree);\n\n    for (const [ref, obj] of cache.items()) {\n      changes.put(ref, {\n        data: obj,\n      });\n    }\n  }\n\n  async canUpdateStructTree({ pdfManager, newAnnotationsByPage }) {\n    if (!this.ref) {\n      warn(\"Cannot update the struct tree: no root reference.\");\n      return false;\n    }\n\n    let nextKey = this.dict.get(\"ParentTreeNextKey\");\n    if (!Number.isInteger(nextKey) || nextKey < 0) {\n      warn(\"Cannot update the struct tree: invalid next key.\");\n      return false;\n    }\n\n    const parentTree = this.dict.get(\"ParentTree\");\n    if (!(parentTree instanceof Dict)) {\n      warn(\"Cannot update the struct tree: ParentTree isn't a dict.\");\n      return false;\n    }\n    const nums = parentTree.get(\"Nums\");\n    if (!Array.isArray(nums)) {\n      warn(\"Cannot update the struct tree: nums isn't an array.\");\n      return false;\n    }\n    const numberTree = new NumberTree(parentTree, this.xref);\n\n    for (const pageIndex of newAnnotationsByPage.keys()) {\n      const { pageDict } = await pdfManager.getPage(pageIndex);\n      if (!pageDict.has(\"StructParents\")) {\n        // StructParents is required when the content stream has some tagged\n        // contents but a page can just have tagged annotations.\n        continue;\n      }\n      const id = pageDict.get(\"StructParents\");\n      if (!Number.isInteger(id) || !Array.isArray(numberTree.get(id))) {\n        warn(`Cannot save the struct tree: page ${pageIndex} has a wrong id.`);\n        return false;\n      }\n    }\n\n    let hasNothingToUpdate = true;\n    for (const [pageIndex, elements] of newAnnotationsByPage) {\n      const { pageDict } = await pdfManager.getPage(pageIndex);\n      StructTreeRoot.#collectParents({\n        elements,\n        xref: this.xref,\n        pageDict,\n        numberTree,\n      });\n\n      for (const element of elements) {\n        if (element.accessibilityData?.type) {\n          // structParent can be undefined and in this case the positivity check\n          // will fail (it's why the expression isn't equivalent to a `.<.`).\n          if (!(element.accessibilityData.structParent >= 0)) {\n            // Each tag must have a structure type.\n            element.parentTreeId = nextKey++;\n          }\n          hasNothingToUpdate = false;\n        }\n      }\n    }\n\n    if (hasNothingToUpdate) {\n      for (const elements of newAnnotationsByPage.values()) {\n        for (const element of elements) {\n          delete element.parentTreeId;\n          delete element.structTreeParent;\n        }\n      }\n      return false;\n    }\n\n    return true;\n  }\n\n  async updateStructureTree({ newAnnotationsByPage, pdfManager, changes }) {\n    const { ref: structTreeRootRef, xref } = this;\n    const structTreeRoot = this.dict.clone();\n    const cache = new RefSetCache();\n    cache.put(structTreeRootRef, structTreeRoot);\n\n    let parentTreeRef = structTreeRoot.getRaw(\"ParentTree\");\n    let parentTree;\n    if (parentTreeRef instanceof Ref) {\n      parentTree = xref.fetch(parentTreeRef);\n    } else {\n      parentTree = parentTreeRef;\n      parentTreeRef = xref.getNewTemporaryRef();\n      structTreeRoot.set(\"ParentTree\", parentTreeRef);\n    }\n    parentTree = parentTree.clone();\n    cache.put(parentTreeRef, parentTree);\n\n    let nums = parentTree.getRaw(\"Nums\");\n    let numsRef = null;\n    if (nums instanceof Ref) {\n      numsRef = nums;\n      nums = xref.fetch(numsRef);\n    }\n    nums = nums.slice();\n    if (!numsRef) {\n      parentTree.set(\"Nums\", nums);\n    }\n\n    const newNextKey = await StructTreeRoot.#writeKids({\n      newAnnotationsByPage,\n      structTreeRootRef,\n      structTreeRoot: this,\n      kids: null,\n      nums,\n      xref,\n      pdfManager,\n      changes,\n      cache,\n    });\n\n    if (newNextKey === -1) {\n      // No new tags were added.\n      return;\n    }\n\n    structTreeRoot.set(\"ParentTreeNextKey\", newNextKey);\n\n    if (numsRef) {\n      cache.put(numsRef, nums);\n    }\n\n    for (const [ref, obj] of cache.items()) {\n      changes.put(ref, {\n        data: obj,\n      });\n    }\n  }\n\n  static async #writeKids({\n    newAnnotationsByPage,\n    structTreeRootRef,\n    structTreeRoot,\n    kids,\n    nums,\n    xref,\n    pdfManager,\n    changes,\n    cache,\n  }) {\n    const objr = Name.get(\"OBJR\");\n    let nextKey = -1;\n    let structTreePageObjs;\n\n    for (const [pageIndex, elements] of newAnnotationsByPage) {\n      const page = await pdfManager.getPage(pageIndex);\n      const { ref: pageRef } = page;\n      const isPageRef = pageRef instanceof Ref;\n      for (const {\n        accessibilityData,\n        ref,\n        parentTreeId,\n        structTreeParent,\n      } of elements) {\n        if (!accessibilityData?.type) {\n          continue;\n        }\n\n        // We've some accessibility data, so we need to create a new tag or\n        // update an existing one.\n        const { structParent } = accessibilityData;\n\n        if (\n          structTreeRoot &&\n          Number.isInteger(structParent) &&\n          structParent >= 0\n        ) {\n          let objs = (structTreePageObjs ||= new Map()).get(pageIndex);\n          if (objs === undefined) {\n            // We need to collect the objects for the page.\n            const structTreePage = new StructTreePage(\n              structTreeRoot,\n              page.pageDict\n            );\n            objs = structTreePage.collectObjects(pageRef);\n            structTreePageObjs.set(pageIndex, objs);\n          }\n          const objRef = objs?.get(structParent);\n          if (objRef) {\n            // We update the existing tag.\n            const tagDict = xref.fetch(objRef).clone();\n            StructTreeRoot.#writeProperties(tagDict, accessibilityData);\n            changes.put(objRef, {\n              data: tagDict,\n            });\n            continue;\n          }\n        }\n        nextKey = Math.max(nextKey, parentTreeId);\n\n        const tagRef = xref.getNewTemporaryRef();\n        const tagDict = new Dict(xref);\n\n        StructTreeRoot.#writeProperties(tagDict, accessibilityData);\n\n        await this.#updateParentTag({\n          structTreeParent,\n          tagDict,\n          newTagRef: tagRef,\n          structTreeRootRef,\n          fallbackKids: kids,\n          xref,\n          cache,\n        });\n\n        const objDict = new Dict(xref);\n        tagDict.set(\"K\", objDict);\n        objDict.set(\"Type\", objr);\n        if (isPageRef) {\n          // Pg is optional.\n          objDict.set(\"Pg\", pageRef);\n        }\n        objDict.set(\"Obj\", ref);\n\n        cache.put(tagRef, tagDict);\n        nums.push(parentTreeId, tagRef);\n      }\n    }\n    return nextKey + 1;\n  }\n\n  static #writeProperties(\n    tagDict,\n    { type, title, lang, alt, expanded, actualText }\n  ) {\n    // The structure type is required.\n    tagDict.set(\"S\", Name.get(type));\n\n    if (title) {\n      tagDict.set(\"T\", stringToAsciiOrUTF16BE(title));\n    }\n    if (lang) {\n      tagDict.set(\"Lang\", stringToAsciiOrUTF16BE(lang));\n    }\n    if (alt) {\n      tagDict.set(\"Alt\", stringToAsciiOrUTF16BE(alt));\n    }\n    if (expanded) {\n      tagDict.set(\"E\", stringToAsciiOrUTF16BE(expanded));\n    }\n    if (actualText) {\n      tagDict.set(\"ActualText\", stringToAsciiOrUTF16BE(actualText));\n    }\n  }\n\n  static #collectParents({ elements, xref, pageDict, numberTree }) {\n    const idToElements = new Map();\n    for (const element of elements) {\n      if (element.structTreeParentId) {\n        const id = parseInt(element.structTreeParentId.split(\"_mc\")[1], 10);\n        idToElements.getOrInsertComputed(id, makeArr).push(element);\n      }\n    }\n\n    const id = pageDict.get(\"StructParents\");\n    if (!Number.isInteger(id)) {\n      return;\n    }\n    // The parentArray type has already been checked by the caller.\n    const parentArray = numberTree.get(id);\n\n    const updateElement = (kid, pageKid, kidRef) => {\n      const elems = idToElements.get(kid);\n      if (elems) {\n        const parentRef = pageKid.getRaw(\"P\");\n        const parentDict = xref.fetchIfRef(parentRef);\n        if (parentRef instanceof Ref && parentDict instanceof Dict) {\n          // It should always the case, but we check just in case.\n          const params = { ref: kidRef, dict: pageKid };\n          for (const element of elems) {\n            element.structTreeParent = params;\n          }\n        }\n        return true;\n      }\n      return false;\n    };\n    for (const kidRef of parentArray) {\n      if (!(kidRef instanceof Ref)) {\n        continue;\n      }\n      const pageKid = xref.fetch(kidRef);\n      const k = pageKid.get(\"K\");\n      if (Number.isInteger(k)) {\n        updateElement(k, pageKid, kidRef);\n        continue;\n      }\n\n      if (!Array.isArray(k)) {\n        continue;\n      }\n      for (let kid of k) {\n        kid = xref.fetchIfRef(kid);\n        if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) {\n          break;\n        }\n        if (!(kid instanceof Dict)) {\n          continue;\n        }\n        if (!isName(kid.get(\"Type\"), \"MCR\")) {\n          break;\n        }\n        const mcid = kid.get(\"MCID\");\n        if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) {\n          break;\n        }\n      }\n    }\n  }\n\n  static async #updateParentTag({\n    structTreeParent,\n    tagDict,\n    newTagRef,\n    structTreeRootRef,\n    fallbackKids,\n    xref,\n    cache,\n  }) {\n    let ref = null;\n    let parentRef;\n    if (structTreeParent) {\n      ({ ref } = structTreeParent);\n\n      // We get the parent of the tag.\n      parentRef = structTreeParent.dict.getRaw(\"P\") || structTreeRootRef;\n    } else {\n      parentRef = structTreeRootRef;\n    }\n\n    tagDict.set(\"P\", parentRef);\n\n    // We get the kids in order to insert a new tag at the right position.\n    const parentDict = xref.fetchIfRef(parentRef);\n    if (!parentDict) {\n      fallbackKids.push(newTagRef);\n      return;\n    }\n\n    let cachedParentDict = cache.get(parentRef);\n    if (!cachedParentDict) {\n      cachedParentDict = parentDict.clone();\n      cache.put(parentRef, cachedParentDict);\n    }\n    const parentKidsRaw = cachedParentDict.getRaw(\"K\");\n    let cachedParentKids =\n      parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null;\n    if (!cachedParentKids) {\n      cachedParentKids = xref.fetchIfRef(parentKidsRaw);\n      cachedParentKids = Array.isArray(cachedParentKids)\n        ? cachedParentKids.slice()\n        : [parentKidsRaw];\n      const parentKidsRef = xref.getNewTemporaryRef();\n      cachedParentDict.set(\"K\", parentKidsRef);\n      cache.put(parentKidsRef, cachedParentKids);\n    }\n\n    const index = cachedParentKids.indexOf(ref);\n    cachedParentKids.splice(\n      index >= 0 ? index + 1 : cachedParentKids.length,\n      0,\n      newTagRef\n    );\n  }\n}\n\n/**\n * Instead of loading the whole tree we load just the page's relevant structure\n * elements, which means we need a wrapper structure to represent the tree.\n */\nclass StructElementNode {\n  constructor(tree, dict) {\n    this.tree = tree;\n    this.xref = tree.xref;\n    this.dict = dict;\n    this.kids = [];\n    this.parseKids();\n  }\n\n  get role() {\n    const nameObj = this.dict.get(\"S\");\n    const name = nameObj instanceof Name ? nameObj.name : \"\";\n    const { root } = this.tree;\n    return root.roleMap.get(name) ?? name;\n  }\n\n  get mathML() {\n    let AFs = this.dict.get(\"AF\") || [];\n    if (!Array.isArray(AFs)) {\n      AFs = [AFs];\n    }\n    for (let af of AFs) {\n      af = this.xref.fetchIfRef(af);\n      if (\n        !isDict(af, \"Filespec\") ||\n        !isName(af.get(\"AFRelationship\"), \"Supplement\")\n      ) {\n        continue;\n      }\n      const fileStream = FileSpec.pickPlatformItem(af.get(\"EF\"));\n      if (\n        !(fileStream instanceof BaseStream) ||\n        !isDict(fileStream.dict, \"EmbeddedFile\") ||\n        !isName(fileStream.dict.get(\"Subtype\"), \"application/mathml+xml\")\n      ) {\n        continue;\n      }\n      // The default encoding for xml files is UTF-8.\n      return stringToUTF8String(fileStream.getString());\n    }\n    const A = this.dict.get(\"A\");\n    if (A instanceof Dict) {\n      // This stuff isn't in the spec, but MS Office seems to use it.\n      const O = A.get(\"O\");\n      if (isName(O, \"MSFT_Office\")) {\n        const mathml = A.get(\"MSFT_MathML\");\n        return mathml ? stringToPDFString(mathml) : null;\n      }\n    }\n    return null;\n  }\n\n  parseKids() {\n    let pageObjId = null;\n    const objRef = this.dict.getRaw(\"Pg\");\n    if (objRef instanceof Ref) {\n      pageObjId = objRef.toString();\n    }\n    const kids = this.dict.get(\"K\");\n    if (Array.isArray(kids)) {\n      for (const kid of kids) {\n        const element = this.parseKid(pageObjId, this.xref.fetchIfRef(kid));\n        if (element) {\n          this.kids.push(element);\n        }\n      }\n    } else {\n      const element = this.parseKid(pageObjId, kids);\n      if (element) {\n        this.kids.push(element);\n      }\n    }\n  }\n\n  parseKid(pageObjId, kid) {\n    // A direct link to content, the integer is an mcid.\n    if (Number.isInteger(kid)) {\n      if (this.tree.pageDict.objId !== pageObjId) {\n        return null;\n      }\n\n      return new StructElement({\n        type: StructElementType.PAGE_CONTENT,\n        mcid: kid,\n        pageObjId,\n      });\n    }\n\n    if (!(kid instanceof Dict)) {\n      return null;\n    }\n\n    const pageRef = kid.getRaw(\"Pg\");\n    if (pageRef instanceof Ref) {\n      pageObjId = pageRef.toString();\n    }\n\n    const type = kid.get(\"Type\") instanceof Name ? kid.get(\"Type\").name : null;\n    if (type === \"MCR\") {\n      if (this.tree.pageDict.objId !== pageObjId) {\n        return null;\n      }\n      const kidRef = kid.getRaw(\"Stm\");\n      return new StructElement({\n        type: StructElementType.STREAM_CONTENT,\n        refObjId: kidRef instanceof Ref ? kidRef.toString() : null,\n        pageObjId,\n        mcid: kid.get(\"MCID\"),\n      });\n    }\n\n    if (type === \"OBJR\") {\n      if (this.tree.pageDict.objId !== pageObjId) {\n        return null;\n      }\n      const kidRef = kid.getRaw(\"Obj\");\n      return new StructElement({\n        type: StructElementType.OBJECT,\n        refObjId: kidRef instanceof Ref ? kidRef.toString() : null,\n        pageObjId,\n      });\n    }\n\n    return new StructElement({\n      type: StructElementType.ELEMENT,\n      dict: kid,\n    });\n  }\n}\n\nclass StructElement {\n  constructor({\n    type,\n    dict = null,\n    mcid = null,\n    pageObjId = null,\n    refObjId = null,\n  }) {\n    this.type = type;\n    this.dict = dict;\n    this.mcid = mcid;\n    this.pageObjId = pageObjId;\n    this.refObjId = refObjId;\n    this.parentNode = null;\n  }\n}\n\nclass StructTreePage {\n  constructor(structTreeRoot, pageDict) {\n    this.root = structTreeRoot;\n    this.xref = structTreeRoot?.xref ?? null;\n    this.rootDict = structTreeRoot?.dict ?? null;\n    this.pageDict = pageDict;\n    this.nodes = [];\n  }\n\n  /**\n   * Collect all the objects (i.e. tag) that are part of the page and return a\n   * map of the structure element id to the object reference.\n   * @param {Ref} pageRef\n   * @returns {Map<number, Ref>}\n   */\n  collectObjects(pageRef) {\n    if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) {\n      return null;\n    }\n\n    const parentTree = this.rootDict.get(\"ParentTree\");\n    if (!parentTree) {\n      return null;\n    }\n    const ids = this.root.structParentIds?.get(pageRef);\n    if (!ids) {\n      return null;\n    }\n\n    const map = new Map();\n    const numberTree = new NumberTree(parentTree, this.xref);\n\n    for (const [elemId] of ids) {\n      const obj = numberTree.getRaw(elemId);\n      if (obj instanceof Ref) {\n        map.set(elemId, obj);\n      }\n    }\n    return map;\n  }\n\n  parse(pageRef) {\n    if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) {\n      return;\n    }\n\n    const { parentTree } = this.root;\n    if (!parentTree) {\n      return;\n    }\n    const id = this.pageDict.get(\"StructParents\");\n    const ids = this.root.structParentIds?.get(pageRef);\n    if (!Number.isInteger(id) && !ids) {\n      return;\n    }\n\n    const map = new Map();\n\n    if (Number.isInteger(id)) {\n      const parentArray = parentTree.get(id);\n      if (Array.isArray(parentArray)) {\n        for (const ref of parentArray) {\n          if (ref instanceof Ref) {\n            this.addNode(this.xref.fetch(ref), map);\n          }\n        }\n      }\n    }\n\n    if (!ids) {\n      return;\n    }\n    for (const [elemId, type] of ids) {\n      const obj = parentTree.get(elemId);\n      if (obj) {\n        const elem = this.addNode(this.xref.fetchIfRef(obj), map);\n        if (\n          elem?.kids?.length === 1 &&\n          elem.kids[0].type === StructElementType.OBJECT\n        ) {\n          // The node in the struct tree is wrapping an object (annotation\n          // or xobject), so we need to update the type of the node to match\n          // the type of the object.\n          elem.kids[0].type = type;\n        }\n      }\n    }\n  }\n\n  addNode(dict, map, level = 0) {\n    if (level > MAX_DEPTH) {\n      warn(\"StructTree MAX_DEPTH reached.\");\n      return null;\n    }\n    if (!(dict instanceof Dict)) {\n      return null;\n    }\n\n    if (map.has(dict)) {\n      return map.get(dict);\n    }\n\n    const element = new StructElementNode(this, dict);\n    map.set(dict, element);\n    switch (element.role) {\n      case \"L\":\n      case \"LBody\":\n      case \"LI\":\n      case \"Table\":\n      case \"THead\":\n      case \"TBody\":\n      case \"TFoot\":\n      case \"TR\": {\n        // Always collect all child nodes of lists and tables, even empty ones\n        for (const kid of element.kids) {\n          if (kid.type === StructElementType.ELEMENT) {\n            this.addNode(kid.dict, map, level - 1);\n          }\n        }\n      }\n    }\n\n    const parent = dict.get(\"P\");\n\n    if (\n      !(parent instanceof Dict) ||\n      isName(parent.get(\"Type\"), \"StructTreeRoot\")\n    ) {\n      if (!this.addTopLevelNode(dict, element)) {\n        map.delete(dict);\n      }\n      return element;\n    }\n\n    const parentNode = this.addNode(parent, map, level + 1);\n    if (!parentNode) {\n      return element;\n    }\n    let save = false;\n    for (const kid of parentNode.kids) {\n      if (kid.type === StructElementType.ELEMENT && kid.dict === dict) {\n        kid.parentNode = element;\n        save = true;\n      }\n    }\n    if (!save) {\n      map.delete(dict);\n    }\n    return element;\n  }\n\n  addTopLevelNode(dict, element) {\n    const index = this.root.getKidPosition(dict.objId);\n    if (isNaN(index)) {\n      return false;\n    }\n    if (index !== -1) {\n      this.nodes[index] = element;\n    }\n    return true;\n  }\n\n  /**\n   * Convert the tree structure into a simplified object literal that can\n   * be sent to the main thread.\n   * @returns {Object}\n   */\n  get serializable() {\n    function nodeToSerializable(node, parent, level = 0) {\n      if (level > MAX_DEPTH) {\n        warn(\"StructTree too deep to be fully serialized.\");\n        return;\n      }\n      const obj = Object.create(null);\n      obj.role = node.role;\n      obj.children = [];\n      parent.children.push(obj);\n      let alt = node.dict.get(\"Alt\");\n      if (typeof alt !== \"string\") {\n        alt = node.dict.get(\"ActualText\");\n      }\n      if (typeof alt === \"string\") {\n        obj.alt = stringToPDFString(alt);\n      }\n      if (obj.role === \"Formula\") {\n        try {\n          const { mathML } = node;\n          if (mathML) {\n            obj.mathML = mathML;\n          }\n        } catch (ex) {\n          if (ex instanceof MissingDataException) {\n            throw ex;\n          }\n          warn(`Ignoring mathML: \"${ex}\".`);\n        }\n      }\n\n      const a = node.dict.get(\"A\");\n      if (a instanceof Dict) {\n        const bbox = lookupNormalRect(a.getArray(\"BBox\"), null);\n        if (bbox) {\n          obj.bbox = bbox;\n        } else {\n          const width = a.get(\"Width\");\n          const height = a.get(\"Height\");\n          if (\n            typeof width === \"number\" &&\n            width > 0 &&\n            typeof height === \"number\" &&\n            height > 0\n          ) {\n            obj.bbox = [0, 0, width, height];\n          }\n        }\n        // TODO: If the bbox is not available, we should try to get it from\n        // the content stream.\n        // For example when rendering on the canvas the commands between the\n        // beginning and the end of the marked-content sequence, we can\n        // compute the overall bbox.\n      }\n\n      const lang = node.dict.get(\"Lang\");\n      if (typeof lang === \"string\") {\n        obj.lang = stringToPDFString(lang);\n      }\n\n      for (const kid of node.kids) {\n        const kidElement =\n          kid.type === StructElementType.ELEMENT ? kid.parentNode : null;\n        if (kidElement) {\n          nodeToSerializable(kidElement, obj, level + 1);\n          continue;\n        } else if (\n          kid.type === StructElementType.PAGE_CONTENT ||\n          kid.type === StructElementType.STREAM_CONTENT\n        ) {\n          obj.children.push({\n            type: \"content\",\n            id: `p${kid.pageObjId}_mc${kid.mcid}`,\n          });\n        } else if (kid.type === StructElementType.OBJECT) {\n          obj.children.push({\n            type: \"object\",\n            id: kid.refObjId,\n          });\n        } else if (kid.type === StructElementType.ANNOTATION) {\n          obj.children.push({\n            type: \"annotation\",\n            id: `${AnnotationPrefix}${kid.refObjId}`,\n          });\n        }\n      }\n    }\n\n    const root = Object.create(null);\n    root.children = [];\n    root.role = \"Root\";\n    for (const child of this.nodes) {\n      if (!child) {\n        continue;\n      }\n      nodeToSerializable(child, root);\n    }\n    return root;\n  }\n}\n\nexport { StructTreePage, StructTreeRoot };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  _isValidExplicitDest,\n  createValidAbsoluteUrl,\n  DocumentActionEventType,\n  FormatError,\n  info,\n  objectSize,\n  PermissionFlag,\n  shadow,\n  stringToUTF8String,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  collectActions,\n  isNumberArray,\n  lookupRect,\n  MissingDataException,\n  PDF_VERSION_REGEXP,\n  recoverJsURL,\n  toRomanNumerals,\n  XRefEntryException,\n} from \"./core_utils.js\";\nimport {\n  Dict,\n  isDict,\n  isName,\n  isRefsEqual,\n  Name,\n  Ref,\n  RefSet,\n  RefSetCache,\n} from \"./primitives.js\";\nimport { GlobalColorSpaceCache, GlobalImageCache } from \"./image_utils.js\";\nimport { NameTree, NumberTree } from \"./name_number_tree.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { clearGlobalCaches } from \"./cleanup_helper.js\";\nimport { ColorSpaceUtils } from \"./colorspace_utils.js\";\nimport { FileSpec } from \"./file_spec.js\";\nimport { MetadataParser } from \"./metadata_parser.js\";\nimport { stringToPDFString } from \"./string_utils.js\";\nimport { StructTreeRoot } from \"./struct_tree.js\";\n\n/**\n * @import {XRef} from \"./xref.js\";\n */\n\n/**\n * @callback GetAttachmentContent\n *   Callback used to lazily fetch attachment content.\n * @param {string} id\n *   Unique attachment identifier.\n * @returns {CatalogAttachmentContent}\n *   Result.\n */\n\n/**\n * @typedef {Uint8Array | null} CatalogAttachmentContent\n *   Attachment value.\n */\n\n/**\n * @typedef CatalogAttachment\n *   Attachment metadata.\n * @property {CatalogAttachmentContent | undefined} [content]\n *   Value, when already available.\n * @property {string} description\n *   Description.\n * @property {string} filename\n *   Filename (just the basename) for display.\n * @property {string} rawFilename\n *   File path.\n */\n\nconst isRef = v => v instanceof Ref;\n\nconst isValidExplicitDest = _isValidExplicitDest.bind(\n  null,\n  /* validRef = */ isRef,\n  /* validName = */ isName\n);\n\nfunction fetchDest(dest) {\n  if (dest instanceof Dict) {\n    dest = dest.get(\"D\");\n  }\n  return isValidExplicitDest(dest) ? dest : null;\n}\n\nfunction fetchRemoteDest(action) {\n  let dest = action.get(\"D\");\n  if (dest) {\n    if (dest instanceof Name) {\n      dest = dest.name;\n    }\n    if (typeof dest === \"string\") {\n      return stringToPDFString(dest, /* keepEscapeSequence = */ true);\n    } else if (isValidExplicitDest(dest)) {\n      return JSON.stringify(dest);\n    }\n  }\n  return null;\n}\n\nclass Catalog {\n  #actualNumPages = null;\n\n  #annotationAttachmentIdByRef = new RefSetCache();\n\n  #annotationAttachmentRefById = new Map();\n\n  #catDict = null;\n\n  builtInCMapCache = new Map();\n\n  fontCache = new RefSetCache();\n\n  globalColorSpaceCache = new GlobalColorSpaceCache();\n\n  globalImageCache = new GlobalImageCache();\n\n  nonBlendModesSet = new RefSet();\n\n  pageDictCache = new RefSetCache();\n\n  pageIndexCache = new RefSetCache();\n\n  pageKidsCountCache = new RefSetCache();\n\n  standardFontDataCache = new Map();\n\n  systemFontCache = new Map();\n\n  constructor(pdfManager, xref) {\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n\n    this.#catDict = xref.getCatalogObj();\n    if (!(this.#catDict instanceof Dict)) {\n      throw new FormatError(\"Catalog object is not a dictionary.\");\n    }\n    // Given that `XRef.parse` will both fetch *and* validate the /Pages-entry,\n    // the following call must always succeed here:\n    this.toplevelPagesDict; // eslint-disable-line no-unused-expressions\n  }\n\n  cloneDict() {\n    return this.#catDict.clone();\n  }\n\n  /**\n   * Create an id for an attachment from a FileAttachment annotation.\n   *\n   * The id is registered here rather than parsed from a public string prefix in\n   * `attachmentContent`, since catalog attachment names can be arbitrary PDF\n   * strings and may otherwise collide with annotation-local ids.\n   *\n   * @param {Ref} ref\n   *   File-spec or embedded-file stream reference.\n   * @returns {string}\n   *   Attachment id.\n   */\n  getAttachmentIdForAnnotation(ref) {\n    let id = this.#annotationAttachmentIdByRef.get(ref);\n    if (id) {\n      return id;\n    }\n\n    const baseId = `attachmentRef:${ref.toString()}`;\n    id = baseId;\n\n    let i = 1;\n    while (\n      this.#annotationAttachmentRefById.has(id) ||\n      this.attachments?.has(id)\n    ) {\n      id = `${baseId}-${i++}`;\n    }\n\n    this.#annotationAttachmentIdByRef.put(ref, id);\n    this.#annotationAttachmentRefById.set(id, ref);\n    return id;\n  }\n\n  get version() {\n    const version = this.#catDict.get(\"Version\");\n    if (version instanceof Name) {\n      if (PDF_VERSION_REGEXP.test(version.name)) {\n        return shadow(this, \"version\", version.name);\n      }\n      warn(`Invalid PDF catalog version: ${version.name}`);\n    }\n    return shadow(this, \"version\", null);\n  }\n\n  get lang() {\n    const lang = this.#catDict.get(\"Lang\");\n    return shadow(\n      this,\n      \"lang\",\n      lang && typeof lang === \"string\" ? stringToPDFString(lang) : null\n    );\n  }\n\n  /**\n   * @type {boolean} `true` for pure XFA documents,\n   *   `false` for XFA Foreground documents.\n   */\n  get needsRendering() {\n    const needsRendering = this.#catDict.get(\"NeedsRendering\");\n    return shadow(\n      this,\n      \"needsRendering\",\n      typeof needsRendering === \"boolean\" ? needsRendering : false\n    );\n  }\n\n  get collection() {\n    let collection = null;\n    try {\n      const obj = this.#catDict.get(\"Collection\");\n      if (obj instanceof Dict && obj.size > 0) {\n        collection = obj;\n      }\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      info(\"Cannot fetch Collection entry; assuming no collection is present.\");\n    }\n    return shadow(this, \"collection\", collection);\n  }\n\n  get acroForm() {\n    let acroForm = null;\n    try {\n      const obj = this.#catDict.get(\"AcroForm\");\n      if (obj instanceof Dict && obj.size > 0) {\n        acroForm = obj;\n      }\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      info(\"Cannot fetch AcroForm entry; assuming no forms are present.\");\n    }\n    return shadow(this, \"acroForm\", acroForm);\n  }\n\n  get acroFormRef() {\n    const value = this.#catDict.getRaw(\"AcroForm\");\n    return shadow(this, \"acroFormRef\", value instanceof Ref ? value : null);\n  }\n\n  get metadata() {\n    const streamRef = this.#catDict.getRaw(\"Metadata\");\n    if (!(streamRef instanceof Ref)) {\n      return shadow(this, \"metadata\", null);\n    }\n\n    let metadata = null;\n    try {\n      const stream = this.xref.fetch(\n        streamRef,\n        /* suppressEncryption = */ !this.xref.encrypt?.encryptMetadata\n      );\n\n      if (\n        stream instanceof BaseStream &&\n        isDict(stream.dict, \"Metadata\") &&\n        isName(stream.dict.get(\"Subtype\"), \"XML\")\n      ) {\n        // XXX: This should examine the charset the XML document defines,\n        // however since there are currently no real means to decode arbitrary\n        // charsets, let's just hope that the author of the PDF was reasonable\n        // enough to stick with the XML default charset, which is UTF-8.\n        const data = stringToUTF8String(stream.getString());\n        if (data) {\n          metadata = new MetadataParser(data).serializable;\n        }\n      }\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      info(`Skipping invalid Metadata: \"${ex}\".`);\n    }\n    return shadow(this, \"metadata\", metadata);\n  }\n\n  get markInfo() {\n    let markInfo = null;\n    try {\n      markInfo = this.#readMarkInfo();\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(\"Unable to read mark info.\");\n    }\n    return shadow(this, \"markInfo\", markInfo);\n  }\n\n  #readMarkInfo() {\n    const obj = this.#catDict.get(\"MarkInfo\");\n    if (!(obj instanceof Dict)) {\n      return null;\n    }\n\n    const markInfo = {\n      Marked: false,\n      UserProperties: false,\n      Suspects: false,\n    };\n    for (const key in markInfo) {\n      const value = obj.get(key);\n      if (typeof value === \"boolean\") {\n        markInfo[key] = value;\n      }\n    }\n\n    return markInfo;\n  }\n\n  get hasStructTree() {\n    return this.#catDict.has(\"StructTreeRoot\");\n  }\n\n  get structTreeRoot() {\n    let structTree = null;\n    try {\n      structTree = this.#readStructTreeRoot();\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(\"Unable read to structTreeRoot info.\");\n    }\n    return shadow(this, \"structTreeRoot\", structTree);\n  }\n\n  #readStructTreeRoot() {\n    const rawObj = this.#catDict.getRaw(\"StructTreeRoot\"),\n      obj = this.xref.fetchIfRef(rawObj);\n    return obj instanceof Dict\n      ? new StructTreeRoot(this.xref, obj, rawObj)\n      : null;\n  }\n\n  get toplevelPagesDict() {\n    const pagesObj = this.#catDict.get(\"Pages\");\n    if (!(pagesObj instanceof Dict)) {\n      throw new FormatError(\"Invalid top-level pages dictionary.\");\n    }\n    return shadow(this, \"toplevelPagesDict\", pagesObj);\n  }\n\n  get documentOutline() {\n    let obj = null;\n    try {\n      obj = this.#readDocumentOutline();\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(\"Unable to read document outline.\");\n    }\n    return shadow(this, \"documentOutline\", obj);\n  }\n\n  #readDocumentOutline(options = {}) {\n    let obj = this.#catDict.get(\"Outlines\");\n    if (!(obj instanceof Dict)) {\n      return null;\n    }\n    obj = obj.getRaw(\"First\");\n    if (!(obj instanceof Ref)) {\n      return null;\n    }\n\n    const root = { items: [] };\n    const queue = [{ obj, parent: root }];\n    // To avoid recursion, keep track of the already processed items.\n    const processed = new RefSet();\n    processed.put(obj);\n    const xref = this.xref,\n      blackColor = new Uint8ClampedArray(3);\n\n    while (queue.length > 0) {\n      const i = queue.shift();\n      const outlineDict = xref.fetchIfRef(i.obj);\n      if (outlineDict === null) {\n        continue;\n      }\n      if (!outlineDict.has(\"Title\")) {\n        warn(\"Invalid outline item encountered.\");\n      }\n\n      const data = { url: null, dest: null, action: null };\n      Catalog.parseDestDictionary({\n        destDict: outlineDict,\n        resultObj: data,\n        docBaseUrl: this.baseUrl,\n        docAttachments: this.attachments,\n      });\n      const title = outlineDict.get(\"Title\");\n      const flags = outlineDict.get(\"F\") || 0;\n      const color = outlineDict.getArray(\"C\");\n      const count = outlineDict.get(\"Count\");\n      let rgbColor = blackColor;\n\n      // We only need to parse the color when it's valid, and non-default.\n      if (\n        isNumberArray(color, 3) &&\n        (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)\n      ) {\n        rgbColor = ColorSpaceUtils.rgb.getRgb(color, 0);\n      }\n\n      const outlineItem = {\n        action: data.action,\n        attachmentId: data.attachmentId,\n        attachment: data.attachment,\n        dest: data.dest,\n        url: data.url,\n        unsafeUrl: data.unsafeUrl,\n        newWindow: data.newWindow,\n        setOCGState: data.setOCGState,\n        title: typeof title === \"string\" ? stringToPDFString(title) : \"\",\n        color: rgbColor,\n        count: Number.isInteger(count) ? count : undefined,\n        bold: !!(flags & 2),\n        italic: !!(flags & 1),\n        items: [],\n      };\n\n      if (options.keepRawDict) {\n        outlineItem.rawDict = outlineDict;\n      }\n\n      i.parent.items.push(outlineItem);\n      obj = outlineDict.getRaw(\"First\");\n      if (obj instanceof Ref && !processed.has(obj)) {\n        queue.push({ obj, parent: outlineItem });\n        processed.put(obj);\n      }\n      obj = outlineDict.getRaw(\"Next\");\n      if (obj instanceof Ref && !processed.has(obj)) {\n        queue.push({ obj, parent: i.parent });\n        processed.put(obj);\n      }\n    }\n    return root.items.length > 0 ? root.items : null;\n  }\n\n  get documentOutlineForEditor() {\n    let obj = null;\n    try {\n      obj = this.#readDocumentOutline({ keepRawDict: true });\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(\"Unable to read document outline.\");\n    }\n    return shadow(this, \"documentOutlineForEditor\", obj);\n  }\n\n  get permissions() {\n    let permissions = null;\n    try {\n      permissions = this.#readPermissions();\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(\"Unable to read permissions.\");\n    }\n    return shadow(this, \"permissions\", permissions);\n  }\n\n  #readPermissions() {\n    const encrypt = this.xref.trailer.get(\"Encrypt\");\n    if (!(encrypt instanceof Dict)) {\n      return null;\n    }\n\n    let flags = encrypt.get(\"P\");\n    if (typeof flags !== \"number\") {\n      return null;\n    }\n\n    // PDF integer objects are represented internally in signed 2's complement\n    // form. Therefore, convert the signed decimal integer to a signed 2's\n    // complement binary integer so we can use regular bitwise operations on it.\n    flags += 2 ** 32;\n\n    const permissions = [];\n    for (const key in PermissionFlag) {\n      const value = PermissionFlag[key];\n      if (flags & value) {\n        permissions.push(value);\n      }\n    }\n    return permissions;\n  }\n\n  get optionalContentConfig() {\n    let config = null;\n    try {\n      const properties = this.#catDict.get(\"OCProperties\");\n      if (!properties) {\n        return shadow(this, \"optionalContentConfig\", null);\n      }\n      const defaultConfig = properties.get(\"D\");\n      if (!defaultConfig) {\n        return shadow(this, \"optionalContentConfig\", null);\n      }\n      const groupsData = properties.get(\"OCGs\");\n      if (!Array.isArray(groupsData)) {\n        return shadow(this, \"optionalContentConfig\", null);\n      }\n      const groupRefCache = new RefSetCache();\n      // Ensure all the optional content groups are valid.\n      for (const groupRef of groupsData) {\n        if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) {\n          continue;\n        }\n        groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef));\n      }\n      config = this.#readOptionalContentConfig(defaultConfig, groupRefCache);\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(`Unable to read optional content config: ${ex}`);\n    }\n    return shadow(this, \"optionalContentConfig\", config);\n  }\n\n  #readOptionalContentGroup(groupRef) {\n    const group = this.xref.fetch(groupRef);\n    const obj = {\n      id: groupRef.toString(),\n      name: null,\n      intent: null,\n      usage: {\n        print: null,\n        view: null,\n      },\n      rbGroups: [],\n    };\n\n    const name = group.get(\"Name\");\n    if (typeof name === \"string\") {\n      obj.name = stringToPDFString(name);\n    }\n\n    let intent = group.getArray(\"Intent\");\n    if (!Array.isArray(intent)) {\n      intent = [intent];\n    }\n    if (intent.every(i => i instanceof Name)) {\n      obj.intent = intent.map(i => i.name);\n    }\n\n    const usage = group.get(\"Usage\");\n    if (!(usage instanceof Dict)) {\n      return obj;\n    }\n    const usageObj = obj.usage;\n\n    const print = usage.get(\"Print\");\n    if (print instanceof Dict) {\n      const printState = print.get(\"PrintState\");\n      if (printState instanceof Name) {\n        switch (printState.name) {\n          case \"ON\":\n          case \"OFF\":\n            usageObj.print = { printState: printState.name };\n        }\n      }\n    }\n\n    const view = usage.get(\"View\");\n    if (view instanceof Dict) {\n      const viewState = view.get(\"ViewState\");\n      if (viewState instanceof Name) {\n        switch (viewState.name) {\n          case \"ON\":\n          case \"OFF\":\n            usageObj.view = { viewState: viewState.name };\n        }\n      }\n    }\n\n    return obj;\n  }\n\n  #readOptionalContentConfig(config, groupRefCache) {\n    function parseOnOff(refs) {\n      const onParsed = [];\n      if (Array.isArray(refs)) {\n        for (const value of refs) {\n          if (value instanceof Ref && groupRefCache.has(value)) {\n            onParsed.push(value.toString());\n          }\n        }\n      }\n      return onParsed;\n    }\n\n    function parseOrder(refs, nestedLevels = 0) {\n      if (!Array.isArray(refs)) {\n        return null;\n      }\n      const order = [];\n\n      for (const value of refs) {\n        if (value instanceof Ref && groupRefCache.has(value)) {\n          parsedOrderRefs.put(value); // Handle \"hidden\" groups, see below.\n\n          order.push(value.toString());\n          continue;\n        }\n        // Handle nested /Order arrays (see e.g. issue 9462 and bug 1240641).\n        const nestedOrder = parseNestedOrder(value, nestedLevels);\n        if (nestedOrder) {\n          order.push(nestedOrder);\n        }\n      }\n\n      if (nestedLevels > 0) {\n        return order;\n      }\n      const hiddenGroups = [];\n      for (const [groupRef] of groupRefCache.items()) {\n        if (parsedOrderRefs.has(groupRef)) {\n          continue;\n        }\n        hiddenGroups.push(groupRef.toString());\n      }\n      if (hiddenGroups.length) {\n        order.push({ name: null, order: hiddenGroups });\n      }\n\n      return order;\n    }\n\n    function parseNestedOrder(ref, nestedLevels) {\n      if (++nestedLevels > MAX_NESTED_LEVELS) {\n        warn(\"parseNestedOrder - reached MAX_NESTED_LEVELS.\");\n        return null;\n      }\n      const value = xref.fetchIfRef(ref);\n      if (!Array.isArray(value)) {\n        return null;\n      }\n      const nestedName = xref.fetchIfRef(value[0]);\n      if (typeof nestedName !== \"string\") {\n        return null;\n      }\n      const nestedOrder = parseOrder(value.slice(1), nestedLevels);\n      if (!nestedOrder?.length) {\n        return null;\n      }\n      return { name: stringToPDFString(nestedName), order: nestedOrder };\n    }\n\n    function parseRBGroups(rbGroups) {\n      if (!Array.isArray(rbGroups)) {\n        return;\n      }\n\n      for (const value of rbGroups) {\n        const rbGroup = xref.fetchIfRef(value);\n        if (!Array.isArray(rbGroup) || !rbGroup.length) {\n          continue;\n        }\n        const parsedRbGroup = new Set();\n\n        for (const ref of rbGroup) {\n          if (\n            ref instanceof Ref &&\n            groupRefCache.has(ref) &&\n            !parsedRbGroup.has(ref.toString())\n          ) {\n            parsedRbGroup.add(ref.toString());\n            // Keep a record of which RB groups the current OCG belongs to.\n            groupRefCache.get(ref).rbGroups.push(parsedRbGroup);\n          }\n        }\n      }\n    }\n\n    const xref = this.xref,\n      parsedOrderRefs = new RefSet(),\n      MAX_NESTED_LEVELS = 10;\n\n    parseRBGroups(config.get(\"RBGroups\"));\n\n    return {\n      name:\n        typeof config.get(\"Name\") === \"string\"\n          ? stringToPDFString(config.get(\"Name\"))\n          : null,\n      creator:\n        typeof config.get(\"Creator\") === \"string\"\n          ? stringToPDFString(config.get(\"Creator\"))\n          : null,\n      baseState:\n        config.get(\"BaseState\") instanceof Name\n          ? config.get(\"BaseState\").name\n          : null,\n      on: parseOnOff(config.get(\"ON\")),\n      off: parseOnOff(config.get(\"OFF\")),\n      order: parseOrder(config.get(\"Order\")),\n      groups: [...groupRefCache],\n    };\n  }\n\n  setActualNumPages(num = null) {\n    this.#actualNumPages = num;\n  }\n\n  get hasActualNumPages() {\n    return this.#actualNumPages !== null;\n  }\n\n  get _pagesCount() {\n    const obj = this.toplevelPagesDict.get(\"Count\");\n    if (!Number.isInteger(obj)) {\n      throw new FormatError(\n        \"Page count in top-level pages dictionary is not an integer.\"\n      );\n    }\n    return shadow(this, \"_pagesCount\", obj);\n  }\n\n  get numPages() {\n    return this.#actualNumPages ?? this._pagesCount;\n  }\n\n  get destinations() {\n    const rawDests = this.#readDests(),\n      dests = Object.create(null);\n    for (const obj of rawDests) {\n      if (obj instanceof NameTree) {\n        for (const [key, value] of obj.getAll()) {\n          const dest = fetchDest(value);\n          if (dest) {\n            dests[stringToPDFString(key, /* keepEscapeSequence = */ true)] =\n              dest;\n          }\n        }\n      } else if (obj instanceof Dict) {\n        for (const [key, value] of obj) {\n          const dest = fetchDest(value);\n          if (dest) {\n            // Always let the NameTree take precedence.\n            dests[stringToPDFString(key, /* keepEscapeSequence = */ true)] ||=\n              dest;\n          }\n        }\n      }\n    }\n    return shadow(this, \"destinations\", dests);\n  }\n\n  getDestination(id) {\n    // Avoid extra lookup/parsing when all destinations are already available.\n    if (Object.hasOwn(this, \"destinations\")) {\n      return this.destinations[id] ?? null;\n    }\n\n    const rawDests = this.#readDests();\n    for (const obj of rawDests) {\n      if (obj instanceof NameTree || obj instanceof Dict) {\n        const dest = fetchDest(obj.get(id));\n        if (dest) {\n          return dest;\n        }\n      }\n    }\n\n    // Always fallback to checking all destinations, in order to support:\n    //  - PDF documents with out-of-order NameTrees (fixes issue 10272).\n    //  - Destination keys that use PDFDocEncoding (fixes issue 19835).\n    if (rawDests.length) {\n      const dest = this.destinations[id];\n      if (dest) {\n        return dest;\n      }\n    }\n    return null;\n  }\n\n  #readDests() {\n    const obj = this.#catDict.get(\"Names\");\n    const rawDests = [];\n    if (obj?.has(\"Dests\")) {\n      rawDests.push(new NameTree(obj.getRaw(\"Dests\"), this.xref));\n    }\n    if (this.#catDict.has(\"Dests\")) {\n      // Simple destination dictionary.\n      rawDests.push(this.#catDict.get(\"Dests\"));\n    }\n    return rawDests;\n  }\n\n  get rawPageLabels() {\n    const obj = this.#catDict.getRaw(\"PageLabels\");\n    if (!obj) {\n      return null;\n    }\n\n    const numberTree = new NumberTree(obj, this.xref);\n    return numberTree.getAll();\n  }\n\n  get pageLabels() {\n    let obj = null;\n    try {\n      obj = this.#readPageLabels();\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(\"Unable to read page labels.\");\n    }\n    return shadow(this, \"pageLabels\", obj);\n  }\n\n  #readPageLabels() {\n    const nums = this.rawPageLabels;\n    if (!nums) {\n      return null;\n    }\n\n    const pageLabels = new Array(this.numPages);\n    let style = null,\n      prefix = \"\";\n\n    let currentLabel = \"\",\n      currentIndex = 1;\n\n    for (let i = 0, ii = this.numPages; i < ii; i++) {\n      const labelDict = nums.get(i);\n\n      if (labelDict !== undefined) {\n        if (!(labelDict instanceof Dict)) {\n          throw new FormatError(\"PageLabel is not a dictionary.\");\n        }\n\n        if (\n          labelDict.has(\"Type\") &&\n          !isName(labelDict.get(\"Type\"), \"PageLabel\")\n        ) {\n          throw new FormatError(\"Invalid type in PageLabel dictionary.\");\n        }\n\n        if (labelDict.has(\"S\")) {\n          const s = labelDict.get(\"S\");\n          if (!(s instanceof Name)) {\n            throw new FormatError(\"Invalid style in PageLabel dictionary.\");\n          }\n          style = s.name;\n        } else {\n          style = null;\n        }\n\n        if (labelDict.has(\"P\")) {\n          const p = labelDict.get(\"P\");\n          if (typeof p !== \"string\") {\n            throw new FormatError(\"Invalid prefix in PageLabel dictionary.\");\n          }\n          prefix = stringToPDFString(p);\n        } else {\n          prefix = \"\";\n        }\n\n        if (labelDict.has(\"St\")) {\n          const st = labelDict.get(\"St\");\n          if (!(Number.isInteger(st) && st >= 1)) {\n            throw new FormatError(\"Invalid start in PageLabel dictionary.\");\n          }\n          currentIndex = st;\n        } else {\n          currentIndex = 1;\n        }\n      }\n\n      switch (style) {\n        case \"D\":\n          currentLabel = currentIndex;\n          break;\n        case \"R\":\n        case \"r\":\n          currentLabel = toRomanNumerals(currentIndex, style === \"r\");\n          break;\n        case \"A\":\n        case \"a\":\n          const LIMIT = 26; // Use only the characters A-Z, or a-z.\n          const A_UPPER_CASE = 0x41,\n            A_LOWER_CASE = 0x61;\n\n          const baseCharCode = style === \"a\" ? A_LOWER_CASE : A_UPPER_CASE;\n          const letterIndex = currentIndex - 1;\n          const character = String.fromCharCode(\n            baseCharCode + (letterIndex % LIMIT)\n          );\n          currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1);\n          break;\n        default:\n          if (style) {\n            throw new FormatError(\n              `Invalid style \"${style}\" in PageLabel dictionary.`\n            );\n          }\n          currentLabel = \"\";\n      }\n\n      pageLabels[i] = prefix + currentLabel;\n      currentIndex++;\n    }\n    return pageLabels;\n  }\n\n  get pageLayout() {\n    const obj = this.#catDict.get(\"PageLayout\");\n    // Purposely use a non-standard default value, rather than 'SinglePage', to\n    // allow differentiating between `undefined` and /SinglePage since that does\n    // affect the Scroll mode (continuous/non-continuous) used in Adobe Reader.\n    let pageLayout = \"\";\n\n    if (obj instanceof Name) {\n      switch (obj.name) {\n        case \"SinglePage\":\n        case \"OneColumn\":\n        case \"TwoColumnLeft\":\n        case \"TwoColumnRight\":\n        case \"TwoPageLeft\":\n        case \"TwoPageRight\":\n          pageLayout = obj.name;\n      }\n    }\n    return shadow(this, \"pageLayout\", pageLayout);\n  }\n\n  get pageMode() {\n    const obj = this.#catDict.get(\"PageMode\");\n    let pageMode = \"UseNone\"; // Default value.\n\n    if (obj instanceof Name) {\n      switch (obj.name) {\n        case \"UseNone\":\n        case \"UseOutlines\":\n        case \"UseThumbs\":\n        case \"FullScreen\":\n        case \"UseOC\":\n        case \"UseAttachments\":\n          pageMode = obj.name;\n      }\n    }\n    return shadow(this, \"pageMode\", pageMode);\n  }\n\n  get viewerPreferences() {\n    const obj = this.#catDict.get(\"ViewerPreferences\");\n    if (!(obj instanceof Dict)) {\n      return shadow(this, \"viewerPreferences\", null);\n    }\n    let prefs = null;\n\n    for (const [key, value] of obj) {\n      let prefValue;\n\n      switch (key) {\n        case \"HideToolbar\":\n        case \"HideMenubar\":\n        case \"HideWindowUI\":\n        case \"FitWindow\":\n        case \"CenterWindow\":\n        case \"DisplayDocTitle\":\n        case \"PickTrayByPDFSize\":\n          if (typeof value === \"boolean\") {\n            prefValue = value;\n          }\n          break;\n        case \"NonFullScreenPageMode\":\n          if (value instanceof Name) {\n            switch (value.name) {\n              case \"UseNone\":\n              case \"UseOutlines\":\n              case \"UseThumbs\":\n              case \"UseOC\":\n                prefValue = value.name;\n                break;\n              default:\n                prefValue = \"UseNone\";\n            }\n          }\n          break;\n        case \"Direction\":\n          if (value instanceof Name) {\n            switch (value.name) {\n              case \"L2R\":\n              case \"R2L\":\n                prefValue = value.name;\n                break;\n              default:\n                prefValue = \"L2R\";\n            }\n          }\n          break;\n        case \"ViewArea\":\n        case \"ViewClip\":\n        case \"PrintArea\":\n        case \"PrintClip\":\n          if (value instanceof Name) {\n            switch (value.name) {\n              case \"MediaBox\":\n              case \"CropBox\":\n              case \"BleedBox\":\n              case \"TrimBox\":\n              case \"ArtBox\":\n                prefValue = value.name;\n                break;\n              default:\n                prefValue = \"CropBox\";\n            }\n          }\n          break;\n        case \"PrintScaling\":\n          if (value instanceof Name) {\n            switch (value.name) {\n              case \"None\":\n              case \"AppDefault\":\n                prefValue = value.name;\n                break;\n              default:\n                prefValue = \"AppDefault\";\n            }\n          }\n          break;\n        case \"Duplex\":\n          if (value instanceof Name) {\n            switch (value.name) {\n              case \"Simplex\":\n              case \"DuplexFlipShortEdge\":\n              case \"DuplexFlipLongEdge\":\n                prefValue = value.name;\n                break;\n              default:\n                prefValue = \"None\";\n            }\n          }\n          break;\n        case \"PrintPageRange\":\n          // The number of elements must be even.\n          if (Array.isArray(value) && value.length % 2 === 0) {\n            const isValid = value.every(\n              (page, i, arr) =>\n                Number.isInteger(page) &&\n                page > 0 &&\n                (i === 0 || page >= arr[i - 1]) &&\n                page <= this.numPages\n            );\n            if (isValid) {\n              prefValue = value;\n            }\n          }\n          break;\n        case \"NumCopies\":\n          if (Number.isInteger(value) && value > 0) {\n            prefValue = value;\n          }\n          break;\n        default:\n          warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`);\n          continue;\n      }\n\n      if (prefValue === undefined) {\n        warn(`Bad value, for key \"${key}\", in ViewerPreferences: ${value}.`);\n        continue;\n      }\n      prefs ??= Object.create(null);\n      prefs[key] = prefValue;\n    }\n    return shadow(this, \"viewerPreferences\", prefs);\n  }\n\n  get openAction() {\n    const obj = this.#catDict.get(\"OpenAction\");\n    const openAction = Object.create(null);\n\n    if (obj instanceof Dict) {\n      // Convert the OpenAction dictionary into a format that works with\n      // `parseDestDictionary`, to avoid having to re-implement those checks.\n      const destDict = new Dict(this.xref);\n      destDict.set(\"A\", obj);\n\n      const resultObj = { url: null, dest: null, action: null };\n      Catalog.parseDestDictionary({ destDict, resultObj });\n\n      if (Array.isArray(resultObj.dest)) {\n        openAction.dest = resultObj.dest;\n      } else if (resultObj.action) {\n        openAction.action = resultObj.action;\n      }\n    } else if (isValidExplicitDest(obj)) {\n      openAction.dest = obj;\n    }\n    return shadow(\n      this,\n      \"openAction\",\n      objectSize(openAction) > 0 ? openAction : null\n    );\n  }\n\n  /**\n   * Get attachments.\n   *\n   * @returns {Map<string, CatalogAttachment> | null}\n   *   Attachments.\n   */\n  get attachments() {\n    const obj = this.#catDict.get(\"Names\");\n    /** @type {Map<string, CatalogAttachment> | null} */\n    let attachments = null;\n\n    if (obj instanceof Dict && obj.has(\"EmbeddedFiles\")) {\n      const nameTree = new NameTree(obj.getRaw(\"EmbeddedFiles\"), this.xref);\n      for (const [key, value] of nameTree.getAll()) {\n        (attachments ??= new Map()).set(\n          stringToPDFString(key, /* keepEscapeSequence = */ true),\n          new FileSpec(value).serializable\n        );\n      }\n    }\n    return shadow(this, \"attachments\", attachments);\n  }\n\n  /**\n   * @param {string} id\n   *   Unique attachment identifier.\n   * @returns {CatalogAttachmentContent | undefined}\n   *   Content, or `undefined` when no named attachment exists for the id.\n   */\n  #attachmentContentByName(id) {\n    const obj = this.#catDict.get(\"Names\");\n    if (obj instanceof Dict && obj.has(\"EmbeddedFiles\")) {\n      const nameTree = new NameTree(obj.getRaw(\"EmbeddedFiles\"), this.xref);\n      for (const [key, value] of nameTree.getAll()) {\n        if (stringToPDFString(key, /* keepEscapeSequence = */ true) === id) {\n          return FileSpec.readContent(value);\n        }\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Get content for an attachment.\n   *\n   * @param {string} id\n   *   Unique attachment identifier (required).\n   * @returns {CatalogAttachmentContent}\n   *   Content.\n   */\n  attachmentContent(id) {\n    const namedContent = this.#attachmentContentByName(id);\n    if (namedContent !== undefined) {\n      return namedContent;\n    }\n\n    // Annotation-local attachments register the reference of their embedded\n    // content in the catalog, so it's re-fetched from the xref on demand\n    // instead of being cached (which would then need to survive `cleanup`).\n    // The reference points either at the file-spec dictionary or, for an inline\n    // file-spec, straight at the embedded-file stream.\n    const ref = this.#annotationAttachmentRefById.get(id);\n    if (ref) {\n      const target = this.xref.fetch(ref);\n      if (target instanceof BaseStream) {\n        return FileSpec.readStreamContent(target);\n      }\n      return target instanceof Dict ? FileSpec.readContent(target) : null;\n    }\n    return null;\n  }\n\n  get rawEmbeddedFiles() {\n    const obj = this.#catDict.get(\"Names\");\n    if (!(obj instanceof Dict) || !obj.has(\"EmbeddedFiles\")) {\n      return null;\n    }\n    const nameTree = new NameTree(obj.getRaw(\"EmbeddedFiles\"), this.xref);\n    return nameTree.getAll(/* isRaw = */ true);\n  }\n\n  get xfaImages() {\n    const obj = this.#catDict.get(\"Names\");\n    let xfaImages = null;\n\n    if (obj instanceof Dict && obj.has(\"XFAImages\")) {\n      const nameTree = new NameTree(obj.getRaw(\"XFAImages\"), this.xref);\n      for (const [key, value] of nameTree.getAll()) {\n        if (value instanceof BaseStream) {\n          xfaImages ??= new Map();\n          xfaImages.set(\n            stringToPDFString(key, /* keepEscapeSequence = */ true),\n            value.getBytes()\n          );\n        }\n      }\n    }\n    return shadow(this, \"xfaImages\", xfaImages);\n  }\n\n  #collectJavaScript() {\n    const obj = this.#catDict.get(\"Names\");\n    let javaScript = null;\n\n    function appendIfJavaScriptDict(name, jsDict) {\n      if (!(jsDict instanceof Dict)) {\n        return;\n      }\n      if (!isName(jsDict.get(\"S\"), \"JavaScript\")) {\n        return;\n      }\n\n      let js = jsDict.get(\"JS\");\n      if (js instanceof BaseStream) {\n        js = js.getString();\n      } else if (typeof js !== \"string\") {\n        return;\n      }\n      js = stringToPDFString(js, /* keepEscapeSequence = */ true).replaceAll(\n        \"\\x00\",\n        \"\"\n      );\n      // Skip empty entries, similar to the `_collectJS` function.\n      if (js) {\n        (javaScript ||= new Map()).set(name, js);\n      }\n    }\n\n    if (obj instanceof Dict && obj.has(\"JavaScript\")) {\n      const nameTree = new NameTree(obj.getRaw(\"JavaScript\"), this.xref);\n      for (const [key, value] of nameTree.getAll()) {\n        appendIfJavaScriptDict(\n          stringToPDFString(key, /* keepEscapeSequence = */ true),\n          value\n        );\n      }\n    }\n    // Append OpenAction \"JavaScript\" actions, if any, to the JavaScript map.\n    const openAction = this.#catDict.get(\"OpenAction\");\n    if (openAction) {\n      appendIfJavaScriptDict(\"OpenAction\", openAction);\n    }\n\n    return javaScript;\n  }\n\n  get jsActions() {\n    const javaScript = this.#collectJavaScript();\n    let actions = collectActions(\n      this.xref,\n      this.#catDict,\n      DocumentActionEventType\n    );\n\n    if (javaScript) {\n      actions ||= Object.create(null);\n\n      for (const [key, val] of javaScript) {\n        if (key in actions) {\n          actions[key].push(val);\n        } else {\n          actions[key] = [val];\n        }\n      }\n    }\n    return shadow(this, \"jsActions\", actions);\n  }\n\n  async cleanup(manuallyTriggered = false) {\n    clearGlobalCaches();\n    this.globalColorSpaceCache.clear();\n    this.globalImageCache.clear(/* onlyData = */ manuallyTriggered);\n    this.pageKidsCountCache.clear();\n    this.pageIndexCache.clear();\n    this.pageDictCache.clear();\n    this.nonBlendModesSet.clear();\n\n    for (const { dict } of await Promise.all(this.fontCache)) {\n      delete dict.cacheKey;\n    }\n    this.fontCache.clear();\n    this.builtInCMapCache.clear();\n    this.standardFontDataCache.clear();\n    this.systemFontCache.clear();\n  }\n\n  async getPageDict(pageIndex) {\n    const nodesToVisit = [this.toplevelPagesDict];\n    const visitedNodes = new RefSet();\n\n    const pagesRef = this.#catDict.getRaw(\"Pages\");\n    if (pagesRef instanceof Ref) {\n      visitedNodes.put(pagesRef);\n    }\n    const xref = this.xref,\n      pageKidsCountCache = this.pageKidsCountCache,\n      pageIndexCache = this.pageIndexCache,\n      pageDictCache = this.pageDictCache;\n    let currentPageIndex = 0;\n\n    while (nodesToVisit.length) {\n      const currentNode = nodesToVisit.pop();\n\n      if (currentNode instanceof Ref) {\n        const count = pageKidsCountCache.get(currentNode);\n        // Skip nodes where the page can't be.\n        if (count >= 0 && currentPageIndex + count <= pageIndex) {\n          currentPageIndex += count;\n          continue;\n        }\n        // Prevent circular references in the /Pages tree.\n        if (visitedNodes.has(currentNode)) {\n          throw new FormatError(\"Pages tree contains circular reference.\");\n        }\n        visitedNodes.put(currentNode);\n\n        const obj = await (pageDictCache.get(currentNode) ||\n          xref.fetchAsync(currentNode));\n        if (obj instanceof Dict) {\n          let type = obj.getRaw(\"Type\");\n          if (type instanceof Ref) {\n            type = await xref.fetchAsync(type);\n          }\n          if (isName(type, \"Page\") || !obj.has(\"Kids\")) {\n            // Cache the Page reference, since it can *greatly* improve\n            // performance by reducing redundant lookups in long documents\n            // where all nodes are found at *one* level of the tree.\n            if (!pageKidsCountCache.has(currentNode)) {\n              pageKidsCountCache.put(currentNode, 1);\n            }\n            // Help improve performance of the `getPageIndex` method.\n            if (!pageIndexCache.has(currentNode)) {\n              pageIndexCache.put(currentNode, currentPageIndex);\n            }\n\n            if (currentPageIndex === pageIndex) {\n              return [obj, currentNode];\n            }\n            currentPageIndex++;\n            continue;\n          }\n        }\n        nodesToVisit.push(obj);\n        continue;\n      }\n\n      // Must be a child page dictionary.\n      if (!(currentNode instanceof Dict)) {\n        throw new FormatError(\n          \"Page dictionary kid reference points to wrong type of object.\"\n        );\n      }\n      const { objId } = currentNode;\n\n      let count = currentNode.getRaw(\"Count\");\n      if (count instanceof Ref) {\n        count = await xref.fetchAsync(count);\n      }\n      if (Number.isInteger(count) && count >= 0) {\n        // Cache the Kids count, since it can reduce redundant lookups in\n        // documents where all nodes are found at *one* level of the tree.\n        if (objId && !pageKidsCountCache.has(objId)) {\n          pageKidsCountCache.put(objId, count);\n        }\n\n        // Skip nodes where the page can't be.\n        if (currentPageIndex + count <= pageIndex) {\n          currentPageIndex += count;\n          continue;\n        }\n      }\n\n      let kids = currentNode.getRaw(\"Kids\");\n      if (kids instanceof Ref) {\n        kids = await xref.fetchAsync(kids);\n      }\n      if (!Array.isArray(kids)) {\n        // Prevent errors in corrupt PDF documents that violate the\n        // specification by *inlining* Page dicts directly in the Kids\n        // array, rather than using indirect objects (fixes issue9540.pdf).\n        let type = currentNode.getRaw(\"Type\");\n        if (type instanceof Ref) {\n          type = await xref.fetchAsync(type);\n        }\n        if (isName(type, \"Page\") || !currentNode.has(\"Kids\")) {\n          if (currentPageIndex === pageIndex) {\n            return [currentNode, null];\n          }\n          currentPageIndex++;\n          continue;\n        }\n\n        throw new FormatError(\"Page dictionary kids object is not an array.\");\n      }\n\n      // Always check all `Kids` nodes, to avoid getting stuck in an empty\n      // node further down in the tree (see issue5644.pdf, issue8088.pdf),\n      // and to ensure that we actually find the correct `Page` dict.\n      for (let last = kids.length - 1; last >= 0; last--) {\n        const lastKid = kids[last];\n        nodesToVisit.push(lastKid);\n\n        // Launch all requests in parallel so we don't wait for each one in turn\n        // when looking for a page near the end, if all the pages are top level.\n        if (\n          currentNode === this.toplevelPagesDict &&\n          lastKid instanceof Ref &&\n          !pageDictCache.has(lastKid)\n        ) {\n          pageDictCache.put(lastKid, xref.fetchAsync(lastKid));\n        }\n      }\n    }\n\n    throw new Error(`Page index ${pageIndex} not found.`);\n  }\n\n  /**\n   * Eagerly fetches the entire /Pages-tree; should ONLY be used as a fallback.\n   * @returns {Promise<Map>}\n   */\n  async getAllPageDicts(recoveryMode = false) {\n    const { ignoreErrors } = this.pdfManager.evaluatorOptions;\n\n    const queue = [{ currentNode: this.toplevelPagesDict, posInKids: 0 }];\n    const visitedNodes = new RefSet();\n\n    const pagesRef = this.#catDict.getRaw(\"Pages\");\n    if (pagesRef instanceof Ref) {\n      visitedNodes.put(pagesRef);\n    }\n    const map = new Map(),\n      xref = this.xref,\n      pageIndexCache = this.pageIndexCache;\n    let pageIndex = 0;\n\n    function addPageDict(pageDict, pageRef) {\n      // Help improve performance of the `getPageIndex` method.\n      if (pageRef && !pageIndexCache.has(pageRef)) {\n        pageIndexCache.put(pageRef, pageIndex);\n      }\n\n      map.set(pageIndex++, [pageDict, pageRef]);\n    }\n    function addPageError(error) {\n      if (error instanceof XRefEntryException && !recoveryMode) {\n        throw error;\n      }\n      if (recoveryMode && ignoreErrors && pageIndex === 0) {\n        // Ensure that the viewer will always load (fixes issue15590.pdf).\n        warn(`getAllPageDicts - Skipping invalid first page: \"${error}\".`);\n        error = Dict.empty;\n      }\n\n      map.set(pageIndex++, [error, null]);\n    }\n\n    while (queue.length > 0) {\n      const queueItem = queue.at(-1);\n      const { currentNode, posInKids } = queueItem;\n\n      let kids = currentNode.getRaw(\"Kids\");\n      if (kids instanceof Ref) {\n        try {\n          kids = await xref.fetchAsync(kids);\n        } catch (ex) {\n          addPageError(ex);\n          break;\n        }\n      }\n      if (!Array.isArray(kids)) {\n        // Prevent errors in corrupt PDF documents that violate the\n        // specification by *inlining* Page dicts (fixes issue21436.pdf).\n        let type = currentNode.getRaw(\"Type\");\n        if (type instanceof Ref) {\n          try {\n            type = await xref.fetchAsync(type);\n          } catch (ex) {\n            addPageError(ex);\n            break;\n          }\n        }\n        if (isName(type, \"Page\") || !currentNode.has(\"Kids\")) {\n          addPageDict(currentNode, null);\n          break;\n        }\n\n        addPageError(\n          new FormatError(\"Page dictionary kids object is not an array.\")\n        );\n        break;\n      }\n\n      if (posInKids >= kids.length) {\n        queue.pop();\n        continue;\n      }\n\n      const kidObj = kids[posInKids];\n      let obj;\n      if (kidObj instanceof Ref) {\n        // Prevent circular references in the /Pages tree.\n        if (visitedNodes.has(kidObj)) {\n          addPageError(\n            new FormatError(\"Pages tree contains circular reference.\")\n          );\n          break;\n        }\n        visitedNodes.put(kidObj);\n\n        try {\n          obj = await xref.fetchAsync(kidObj);\n        } catch (ex) {\n          addPageError(ex);\n          break;\n        }\n      } else {\n        // Prevent errors in corrupt PDF documents that violate the\n        // specification by *inlining* Page dicts directly in the Kids\n        // array, rather than using indirect objects (see issue9540.pdf).\n        obj = kidObj;\n      }\n      if (!(obj instanceof Dict)) {\n        addPageError(\n          new FormatError(\n            \"Page dictionary kid reference points to wrong type of object.\"\n          )\n        );\n        break;\n      }\n\n      let type = obj.getRaw(\"Type\");\n      if (type instanceof Ref) {\n        try {\n          type = await xref.fetchAsync(type);\n        } catch (ex) {\n          addPageError(ex);\n          break;\n        }\n      }\n      if (isName(type, \"Page\") || !obj.has(\"Kids\")) {\n        addPageDict(obj, kidObj instanceof Ref ? kidObj : null);\n      } else {\n        queue.push({ currentNode: obj, posInKids: 0 });\n      }\n      queueItem.posInKids++;\n    }\n    return map;\n  }\n\n  async getPageIndex(pageRef) {\n    const cachedPageIndex = this.pageIndexCache.get(pageRef);\n    if (cachedPageIndex !== undefined) {\n      return cachedPageIndex;\n    }\n\n    // The page tree nodes have the count of all the leaves below them. To get\n    // how many pages are before we just have to walk up the tree and keep\n    // adding the count of siblings to the left of the node.\n    const xref = this.xref;\n    let total = 0,\n      ref = pageRef;\n\n    while (true) {\n      const node = await xref.fetchAsync(ref);\n      if (\n        isRefsEqual(ref, pageRef) &&\n        !isDict(node, \"Page\") &&\n        !(node instanceof Dict && !node.has(\"Type\") && node.has(\"Contents\"))\n      ) {\n        throw new FormatError(\n          \"The reference does not point to a /Page dictionary.\"\n        );\n      }\n      if (!node) {\n        break;\n      }\n      if (!(node instanceof Dict)) {\n        throw new FormatError(\"Node must be a dictionary.\");\n      }\n      const parentRef = node.getRaw(\"Parent\");\n\n      const parent = await node.getAsync(\"Parent\");\n      if (!parent) {\n        break;\n      }\n      if (!(parent instanceof Dict)) {\n        throw new FormatError(\"Parent must be a dictionary.\");\n      }\n\n      const kids = await parent.getAsync(\"Kids\");\n      if (!kids) {\n        break;\n      }\n      if (!Array.isArray(kids)) {\n        throw new FormatError(\"Kids must be an array.\");\n      }\n\n      const kidPromises = [];\n      let found = false;\n      for (const kid of kids) {\n        if (!(kid instanceof Ref)) {\n          throw new FormatError(\"Kid must be a reference.\");\n        }\n        if (isRefsEqual(kid, ref)) {\n          found = true;\n          break;\n        }\n        kidPromises.push(\n          xref.fetchAsync(kid).then(obj => {\n            if (!(obj instanceof Dict)) {\n              throw new FormatError(\"Kid node must be a dictionary.\");\n            }\n            if (obj.has(\"Count\")) {\n              const count = obj.get(\"Count\");\n              if (Number.isInteger(count) && count >= 0) {\n                total += count;\n                return;\n              }\n              throw new FormatError(\"Count must be a (positive) integer.\");\n            }\n            // Page leaf node.\n            total++;\n          })\n        );\n      }\n      if (!found) {\n        throw new FormatError(\"Kid reference not found in parent's kids.\");\n      }\n      await Promise.all(kidPromises);\n      ref = parentRef;\n    }\n\n    this.pageIndexCache.put(pageRef, total);\n    return total;\n  }\n\n  get baseUrl() {\n    const uri = this.#catDict.get(\"URI\");\n    if (uri instanceof Dict) {\n      const base = uri.get(\"Base\");\n      if (typeof base === \"string\") {\n        const absoluteUrl = createValidAbsoluteUrl(base, null, {\n          tryConvertEncoding: true,\n        });\n        if (absoluteUrl) {\n          return shadow(this, \"baseUrl\", absoluteUrl.href);\n        }\n      }\n    }\n    return shadow(this, \"baseUrl\", this.pdfManager.docBaseUrl);\n  }\n\n  /**\n   * @typedef {Object} ParseDestDictionaryParameters\n   * @property {Dict} destDict - The dictionary containing the destination.\n   * @property {Object} resultObj - The object where the parsed destination\n   *   properties will be placed.\n   * @property {string} [docBaseUrl] - The document base URL that is used when\n   *   attempting to recover valid absolute URLs from relative ones.\n   * @property {Record<string, CatalogAttachment> | null} [docAttachments] - The\n   *   document attachments (may not exist in most PDF documents).\n   */\n\n  /**\n   * Derive a destination array from a Structure Element reference.\n   * Walks the SE dict to find its page (Pg) and optional bounding box (A.BBox),\n   * then returns an XYZ destination array that can be used for navigation.\n   * @param {XRef} xref\n   * @param {Ref} seRef\n   * @returns {Array|null}\n   */\n  static #getDestFromStructElement(xref, seRef) {\n    const seDict = xref.fetchIfRef(seRef);\n    if (!(seDict instanceof Dict)) {\n      return null;\n    }\n\n    // Try to find the page reference for this structure element.\n    // Search order: the element itself, its descendants down to leaf nodes,\n    // then ancestor elements via the P entry (up).\n    let pageRef = null;\n\n    // Check the element directly.\n    const directPg = seDict.getRaw(\"Pg\");\n    if (directPg instanceof Ref) {\n      pageRef = directPg;\n    }\n\n    // Walk down into descendants (BFS) until a Pg is found or leaves are\n    // reached (e.g. integer MCIDs or MCR/OBJR dicts without further K).\n    if (!pageRef) {\n      const queue = [seDict];\n      while (queue.length > 0 && !pageRef) {\n        const node = queue.shift();\n        const kids = node.get(\"K\");\n        let kidsArr;\n        if (Array.isArray(kids)) {\n          kidsArr = kids;\n        } else if (kids) {\n          kidsArr = [kids];\n        } else {\n          continue;\n        }\n        for (const kid of kidsArr) {\n          const kidObj = xref.fetchIfRef(kid);\n          if (!(kidObj instanceof Dict)) {\n            continue; // integer MCID 鈥� leaf node, no Pg here\n          }\n          const pg = kidObj.getRaw(\"Pg\");\n          if (pg instanceof Ref) {\n            pageRef = pg;\n            break;\n          }\n          queue.push(kidObj);\n        }\n      }\n    }\n\n    // Walk up the parent chain if still not found.\n    if (!pageRef) {\n      const MAX_DEPTH = 40;\n      let current = seDict;\n      for (let depth = 0; depth < MAX_DEPTH; depth++) {\n        const parentRaw = current.getRaw(\"P\");\n        if (!(parentRaw instanceof Ref)) {\n          break;\n        }\n        const parentDict = xref.fetch(parentRaw);\n        if (!(parentDict instanceof Dict)) {\n          break;\n        }\n        if (isName(parentDict.get(\"Type\"), \"StructTreeRoot\")) {\n          break;\n        }\n        const pg = parentDict.getRaw(\"Pg\");\n        if (pg instanceof Ref) {\n          pageRef = pg;\n          break;\n        }\n        current = parentDict;\n      }\n    }\n\n    if (!pageRef) {\n      return null;\n    }\n\n    // Try to obtain precise coordinates from the element's attribute BBox.\n    let x = null,\n      y = null;\n    const attrs = seDict.get(\"A\");\n    if (attrs instanceof Dict) {\n      const bbox = lookupRect(attrs.getArray(\"BBox\"), null);\n      if (bbox) {\n        x = bbox[0];\n        y = bbox[3]; // top of the bbox in PDF page coordinates\n      }\n    }\n\n    return [pageRef, { name: \"XYZ\" }, x, y, null];\n  }\n\n  /**\n   * Helper function used to parse the contents of destination dictionaries.\n   * @param {ParseDestDictionaryParameters} params\n   */\n  static parseDestDictionary({\n    destDict,\n    resultObj,\n    docBaseUrl = null,\n    docAttachments = null,\n  }) {\n    if (!(destDict instanceof Dict)) {\n      warn(\"parseDestDictionary: `destDict` must be a dictionary.\");\n      return;\n    }\n\n    let action = destDict.get(\"A\"),\n      url,\n      dest;\n    if (!(action instanceof Dict)) {\n      if (destDict.has(\"Dest\")) {\n        // A /Dest entry should *only* contain a Name or an Array, but some bad\n        // PDF generators ignore that and treat it as an /A entry.\n        action = destDict.get(\"Dest\");\n      } else {\n        action = destDict.get(\"AA\");\n        if (action instanceof Dict) {\n          if (action.has(\"D\")) {\n            // MouseDown\n            action = action.get(\"D\");\n          } else if (action.has(\"U\")) {\n            // MouseUp\n            action = action.get(\"U\");\n          }\n        }\n      }\n    }\n\n    if (action instanceof Dict) {\n      const actionType = action.get(\"S\");\n      if (!(actionType instanceof Name)) {\n        warn(\"parseDestDictionary: Invalid type in Action dictionary.\");\n        return;\n      }\n      const actionName = actionType.name;\n\n      switch (actionName) {\n        case \"ResetForm\":\n          const flags = action.get(\"Flags\");\n          const include = ((typeof flags === \"number\" ? flags : 0) & 1) === 0;\n          const fields = [];\n          const refs = [];\n          for (const obj of action.get(\"Fields\") || []) {\n            if (obj instanceof Ref) {\n              refs.push(obj.toString());\n            } else if (typeof obj === \"string\") {\n              fields.push(stringToPDFString(obj));\n            }\n          }\n          resultObj.resetForm = { fields, refs, include };\n          break;\n        case \"URI\":\n          url = action.get(\"URI\");\n          if (url instanceof Name) {\n            // Some bad PDFs do not put parentheses around relative URLs.\n            url = \"/\" + url.name;\n          }\n          break;\n\n        case \"GoTo\":\n          dest = action.get(\"D\");\n          break;\n\n        case \"Launch\":\n        // We neither want, nor can, support arbitrary 'Launch' actions.\n        // However, in practice they are mostly used for linking to other PDF\n        // files, which we thus attempt to support (utilizing `docBaseUrl`).\n        /* falls through */\n\n        case \"GoToR\":\n          const urlDict = action.get(\"F\");\n          if (urlDict instanceof Dict) {\n            url = new FileSpec(urlDict).filename;\n          } else if (typeof urlDict === \"string\") {\n            url = urlDict;\n          } else {\n            break;\n          }\n\n          // NOTE: the destination is relative to the *remote* document.\n          const remoteDest = fetchRemoteDest(action);\n          if (remoteDest) {\n            // NOTE: We don't use the `updateUrlHash` function here, since\n            // the `createValidAbsoluteUrl` function (see below) already handles\n            // parsing/validation of the final URL and manual splitting also\n            // ensures that the `unsafeUrl` property will be available/correct.\n            url = /* baseUrl = */ url.split(\"#\", 1)[0] + \"#\" + remoteDest;\n          }\n          // The 'NewWindow' property, equal to `LinkTarget.BLANK`.\n          const newWindow = action.get(\"NewWindow\");\n          if (typeof newWindow === \"boolean\") {\n            resultObj.newWindow = newWindow;\n          }\n          break;\n\n        case \"GoToE\":\n          const target = action.get(\"T\");\n          /** @type {string | null} */\n          let id = null;\n\n          if (target instanceof Dict) {\n            const relationship = target.get(\"R\");\n            const name = target.get(\"N\");\n\n            if (isName(relationship, \"C\") && typeof name === \"string\") {\n              id = stringToPDFString(name, /* keepEscapeSequence = */ true);\n            }\n          }\n\n          if (docAttachments && id) {\n            resultObj.attachmentId = id;\n            resultObj.attachment = docAttachments.get(id);\n\n            // NOTE: the destination is relative to the *attachment*.\n            const attachmentDest = fetchRemoteDest(action);\n            if (attachmentDest) {\n              resultObj.attachmentDest = attachmentDest;\n            }\n          } else {\n            warn(`parseDestDictionary - unimplemented \"GoToE\" action.`);\n          }\n          break;\n\n        case \"Named\":\n          const namedAction = action.get(\"N\");\n          if (namedAction instanceof Name) {\n            resultObj.action = namedAction.name;\n          }\n          break;\n\n        case \"SetOCGState\":\n          const state = action.get(\"State\");\n          const preserveRB = action.get(\"PreserveRB\");\n\n          if (!Array.isArray(state) || state.length === 0) {\n            break;\n          }\n          const stateArr = [];\n\n          for (const elem of state) {\n            if (elem instanceof Name) {\n              switch (elem.name) {\n                case \"ON\":\n                case \"OFF\":\n                case \"Toggle\":\n                  stateArr.push(elem.name);\n                  break;\n              }\n            } else if (elem instanceof Ref) {\n              stateArr.push(elem.toString());\n            }\n          }\n\n          if (stateArr.length !== state.length) {\n            break; // Some of the original entries are not valid.\n          }\n          resultObj.setOCGState = {\n            state: stateArr,\n            preserveRB: typeof preserveRB === \"boolean\" ? preserveRB : true,\n          };\n          break;\n\n        case \"JavaScript\":\n          const jsAction = action.get(\"JS\");\n          let js;\n\n          if (jsAction instanceof BaseStream) {\n            js = jsAction.getString();\n          } else if (typeof jsAction === \"string\") {\n            js = jsAction;\n          }\n\n          const jsURL =\n            js &&\n            recoverJsURL(\n              stringToPDFString(js, /* keepEscapeSequence = */ true)\n            );\n          if (jsURL) {\n            url = jsURL.url;\n            resultObj.newWindow = jsURL.newWindow;\n            break;\n          }\n        /* falls through */\n        default:\n          if (actionName === \"JavaScript\" || actionName === \"SubmitForm\") {\n            // Don't bother the user with a warning for actions that require\n            // scripting support, since those will be handled separately.\n            break;\n          }\n          warn(`parseDestDictionary - unsupported action: \"${actionName}\".`);\n          break;\n      }\n    } else if (destDict.has(\"Dest\")) {\n      // Simple destination.\n      dest = destDict.get(\"Dest\");\n    }\n\n    if (typeof url === \"string\") {\n      const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl, {\n        addDefaultProtocol: true,\n        tryConvertEncoding: true,\n      });\n      if (absoluteUrl) {\n        resultObj.url = absoluteUrl.href;\n      }\n      resultObj.unsafeUrl = url;\n    }\n    if (dest) {\n      if (dest instanceof Name) {\n        dest = dest.name;\n      }\n      if (typeof dest === \"string\") {\n        resultObj.dest = stringToPDFString(\n          dest,\n          /* keepEscapeSequence = */ true\n        );\n      } else if (isValidExplicitDest(dest)) {\n        resultObj.dest = dest;\n      }\n    }\n\n    // Handle SE (Structure Element) entry: when no other destination has been\n    // found, derive one from the structure element's page and optional bbox.\n    if (\n      !resultObj.dest &&\n      !resultObj.url &&\n      !resultObj.action &&\n      !resultObj.attachment &&\n      !resultObj.setOCGState &&\n      !resultObj.resetForm\n    ) {\n      const seRef = destDict.getRaw(\"SE\");\n      if (seRef instanceof Ref) {\n        try {\n          const seDest = Catalog.#getDestFromStructElement(\n            destDict.xref,\n            seRef\n          );\n          if (seDest) {\n            resultObj.dest = seDest;\n          }\n        } catch (ex) {\n          if (ex instanceof MissingDataException) {\n            throw ex;\n          }\n          info(\"SE parsing failed.\");\n        }\n      }\n    }\n  }\n}\n\nexport { Catalog };\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Dict, Name } from \"../primitives.js\";\nimport { FeatureTest } from \"../../shared/util.js\";\nimport { Stream } from \"../stream.js\";\n\n// Below this many distinct RGB triples, Flate+Predictor 15 (PNG-style) is\n// generally smaller than JPEG at visually equivalent quality, since the data\n// is dominated by flat regions and sharp edges where JPEG performs poorly.\nconst FLATE_COLOR_COUNT_THRESHOLD = 16384;\n\nfunction createImageDict(xref, width, height, colorSpace) {\n  const image = new Dict(xref);\n  image.set(\"Type\", Name.get(\"XObject\"));\n  image.set(\"Subtype\", Name.get(\"Image\"));\n  image.set(\"BitsPerComponent\", 8);\n  image.setIfName(\"ColorSpace\", colorSpace);\n  image.set(\"Width\", width);\n  image.set(\"Height\", height);\n\n  return image;\n}\n\nfunction createRawImage(buffer, dict) {\n  return new Stream(buffer, 0, buffer.length, dict);\n}\n\nfunction paethPredictor(left, above, upperLeft) {\n  const p = left + above - upperLeft;\n  const pa = Math.abs(p - left);\n  const pb = Math.abs(p - above);\n  const pc = Math.abs(p - upperLeft);\n  if (pa <= pb && pa <= pc) {\n    return left;\n  }\n  return pb <= pc ? above : upperLeft;\n}\n\nfunction applyPNGOptimumFilter(data, width, height, bytesPerPixel) {\n  const rowSize = width * bytesPerPixel;\n  const out = new Uint8Array(height * (rowSize + 1));\n  const candidates = [\n    new Uint8Array(rowSize), // 0: None\n    new Uint8Array(rowSize), // 1: Sub\n    new Uint8Array(rowSize), // 2: Up\n    new Uint8Array(rowSize), // 3: Average\n    new Uint8Array(rowSize), // 4: Paeth\n  ];\n\n  for (let y = 0; y < height; y++) {\n    const rowOffset = y * rowSize;\n    const prevRowOffset = rowOffset - rowSize;\n    const scores = [0, 0, 0, 0, 0];\n    for (let x = 0; x < rowSize; x++) {\n      const offset = rowOffset + x;\n      const cur = data[offset];\n      const left = x >= bytesPerPixel ? data[offset - bytesPerPixel] : 0;\n      const above = y > 0 ? data[prevRowOffset + x] : 0;\n      const upperLeft =\n        y > 0 && x >= bytesPerPixel\n          ? data[prevRowOffset + x - bytesPerPixel]\n          : 0;\n      candidates[0][x] = cur;\n      candidates[1][x] = (cur - left) & 0xff;\n      candidates[2][x] = (cur - above) & 0xff;\n      candidates[3][x] = (cur - ((left + above) >> 1)) & 0xff;\n      candidates[4][x] = (cur - paethPredictor(left, above, upperLeft)) & 0xff;\n      // Sum of absolute signed-byte values: the standard \"minimum sum\"\n      // heuristic for picking the best filter per row.\n      for (let f = 0; f < 5; f++) {\n        const v = candidates[f][x];\n        scores[f] += v < 128 ? v : 256 - v;\n      }\n    }\n\n    let bestFilter = 0;\n    for (let f = 1; f < 5; f++) {\n      if (scores[f] < scores[bestFilter]) {\n        bestFilter = f;\n      }\n    }\n\n    const outOffset = y * (rowSize + 1);\n    out[outOffset] = bestFilter;\n    out.set(candidates[bestFilter], outOffset + 1);\n  }\n\n  return out;\n}\n\nasync function deflate(bytes) {\n  const cs = new CompressionStream(\"deflate\");\n  const writer = cs.writable.getWriter();\n  const writePromise = (async () => {\n    try {\n      await writer.ready;\n      await writer.write(bytes);\n      await writer.ready;\n      await writer.close();\n    } catch (reason) {\n      await writer.abort(reason).catch(() => {});\n      throw reason;\n    }\n  })();\n  const [compressed] = await Promise.all([\n    new Response(cs.readable).bytes(),\n    writePromise.then(() => null),\n  ]);\n  return compressed;\n}\n\nasync function createPNGLikeImage(buffer, width, height, dict) {\n  const bytesPerPixel = buffer.length / (width * height);\n  let compressed;\n  if (typeof CompressionStream === \"function\") {\n    try {\n      const filtered = applyPNGOptimumFilter(\n        buffer,\n        width,\n        height,\n        bytesPerPixel\n      );\n      compressed = await deflate(filtered);\n    } catch {}\n  }\n\n  if (!compressed) {\n    return createRawImage(buffer, dict);\n  }\n\n  dict.setIfName(\"Filter\", \"FlateDecode\");\n  const decodeParms = new Dict(dict.xref);\n  decodeParms.set(\"Predictor\", 15);\n  decodeParms.set(\"Columns\", width);\n  decodeParms.set(\"Colors\", bytesPerPixel);\n  decodeParms.set(\"BitsPerComponent\", 8);\n  dict.set(\"DecodeParms\", decodeParms);\n\n  return createRawImage(compressed, dict);\n}\n\nasync function createImage(bitmap, xref, { closeBitmap = false } = {}) {\n  // TODO: when printing, we could have a specific internal colorspace\n  // (e.g. something like DeviceRGBA) in order avoid any conversion (i.e. no\n  // jpeg, no rgba to rgb conversion, etc...)\n\n  const { width, height } = bitmap;\n  if (\n    !Number.isInteger(width) ||\n    !Number.isInteger(height) ||\n    width <= 0 ||\n    height <= 0\n  ) {\n    if (closeBitmap) {\n      bitmap.close?.();\n    }\n    throw new Error(\n      `createImage: invalid bitmap dimensions ${width}x${height}`\n    );\n  }\n  const canvas = new OffscreenCanvas(width, height);\n  const ctx = canvas.getContext(\"2d\", {\n    alpha: true,\n    willReadFrequently: true,\n  });\n\n  let data;\n  try {\n    ctx.drawImage(bitmap, 0, 0);\n    data = ctx.getImageData(0, 0, width, height).data;\n  } finally {\n    if (closeBitmap) {\n      bitmap.close?.();\n    }\n  }\n  const buf32 = new Uint32Array(\n    data.buffer,\n    data.byteOffset,\n    data.byteLength >> 2\n  );\n\n  // Bitwise masks are signed in JS, so extracting alpha via `(v & 0xff000000)`\n  // would misclassify every opaque pixel as transparent on little-endian\n  // platforms 鈥� use the byte-level shift/mask instead.\n  const isLE = FeatureTest.isLittleEndian;\n  const rgbMask = isLE ? 0x00ffffff : 0xffffff00;\n  const colorCounter = new Set();\n  let hasAlpha = false;\n  let useFlate = true;\n  for (let i = 0, ii = buf32.length; i < ii; i++) {\n    const v = buf32[i];\n    if ((isLE ? v >>> 24 : v & 0xff) !== 0xff) {\n      hasAlpha = true;\n      break;\n    }\n    if (useFlate) {\n      colorCounter.add((v & rgbMask) >>> 0);\n      if (colorCounter.size > FLATE_COLOR_COUNT_THRESHOLD) {\n        useFlate = false;\n        colorCounter.clear();\n      }\n    }\n  }\n\n  if (hasAlpha) {\n    // JPEG can bleed hidden/edge RGB into semi-transparent pixels. Keep alpha\n    // images lossless instead.\n    useFlate = true;\n  }\n\n  const image = createImageDict(xref, width, height, \"DeviceRGB\");\n\n  let imageStreamPromise;\n  let imageRenderStream = null;\n  if (useFlate) {\n    // Pack RGB triples without compositing over white: the SMask carries the\n    // original alpha and the lossless RGB stream stays exact.\n    const rgbBuffer = new Uint8Array(width * height * 3);\n    for (let i = 0, j = 0, ii = data.length; i < ii; i += 4, j += 3) {\n      rgbBuffer[j] = data[i];\n      rgbBuffer[j + 1] = data[i + 1];\n      rgbBuffer[j + 2] = data[i + 2];\n    }\n    imageStreamPromise = createPNGLikeImage(rgbBuffer, width, height, image);\n    imageRenderStream = createRawImage(\n      rgbBuffer,\n      createImageDict(xref, width, height, \"DeviceRGB\")\n    );\n  } else {\n    image.setIfName(\"Filter\", \"DCTDecode\");\n    imageStreamPromise = canvas\n      .convertToBlob({ type: \"image/jpeg\", quality: 1 })\n      .then(blob => blob.bytes())\n      .then(bytes => createRawImage(bytes, image));\n  }\n\n  let smaskStreamPromise = Promise.resolve(null);\n  let smaskRenderStream = null;\n  if (hasAlpha) {\n    const alphaBuffer = new Uint8Array(buf32.length);\n    if (isLE) {\n      for (let i = 0, ii = buf32.length; i < ii; i++) {\n        alphaBuffer[i] = buf32[i] >>> 24;\n      }\n    } else {\n      for (let i = 0, ii = buf32.length; i < ii; i++) {\n        alphaBuffer[i] = buf32[i] & 0xff;\n      }\n    }\n\n    const smask = createImageDict(xref, width, height, \"DeviceGray\");\n    const smaskRenderDict = createImageDict(xref, width, height, \"DeviceGray\");\n\n    smaskStreamPromise = createPNGLikeImage(alphaBuffer, width, height, smask);\n    smaskRenderStream = createRawImage(alphaBuffer, smaskRenderDict);\n  }\n\n  const [imageStream, smaskStream] = await Promise.all([\n    imageStreamPromise,\n    smaskStreamPromise,\n  ]);\n\n  return {\n    imageStream,\n    imageRenderStream,\n    smaskStream,\n    smaskRenderStream,\n    width,\n    height,\n  };\n}\n\nexport { createImage };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Dict, Ref, RefSet } from \"./primitives.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { MissingDataException } from \"./core_utils.js\";\nimport { warn } from \"../shared/util.js\";\n\nfunction mayHaveChildren(value) {\n  return (\n    value instanceof Ref ||\n    value instanceof Dict ||\n    value instanceof BaseStream ||\n    Array.isArray(value)\n  );\n}\n\nfunction addChildren(node, nodesToVisit) {\n  if (node instanceof Dict) {\n    node = node.getRawValues();\n  } else if (node instanceof BaseStream) {\n    node = node.dict.getRawValues();\n  } else if (!Array.isArray(node)) {\n    return;\n  }\n  for (const rawValue of node) {\n    if (mayHaveChildren(rawValue)) {\n      nodesToVisit.push(rawValue);\n    }\n  }\n}\n\n/**\n * A helper for loading missing data in `Dict` graphs. It traverses the graph\n * depth first and queues up any objects that have missing data. Once it has\n * has traversed as many objects that are available it attempts to bundle the\n * missing data requests and then resume from the nodes that weren't ready.\n *\n * NOTE: It provides protection from circular references by keeping track of\n * loaded references. However, you must be careful not to load any graphs\n * that have references to the catalog or other pages since that will cause the\n * entire PDF document object graph to be traversed.\n */\nclass ObjectLoader {\n  refSet = new RefSet();\n\n  constructor(dict, keys, xref) {\n    this.dict = dict;\n    this.keys = keys;\n    this.xref = xref;\n  }\n\n  async load() {\n    const { keys, dict } = this;\n    // Setup the initial nodes to visit.\n    const nodesToVisit = [];\n    for (const key of keys) {\n      const rawValue = dict.getRaw(key);\n      // Skip nodes that are guaranteed to be empty.\n      if (rawValue !== undefined) {\n        nodesToVisit.push(rawValue);\n      }\n    }\n    await this.#walk(nodesToVisit);\n\n    this.refSet = null; // Everything is loaded, clear the cache.\n  }\n\n  async #walk(nodesToVisit) {\n    const nodesToRevisit = [];\n    const pendingRequests = [];\n    // DFS walk of the object graph.\n    while (nodesToVisit.length) {\n      let currentNode = nodesToVisit.pop();\n\n      // Only references or chunked streams can cause missing data exceptions.\n      if (currentNode instanceof Ref) {\n        // Skip nodes that have already been visited.\n        if (this.refSet.has(currentNode)) {\n          continue;\n        }\n        try {\n          this.refSet.put(currentNode);\n          currentNode = this.xref.fetch(currentNode);\n        } catch (ex) {\n          if (!(ex instanceof MissingDataException)) {\n            warn(`ObjectLoader.#walk - requesting all data: \"${ex}\".`);\n\n            await this.xref.stream.manager.requestAllChunks();\n            return;\n          }\n          nodesToRevisit.push(currentNode);\n          pendingRequests.push({ begin: ex.begin, end: ex.end });\n        }\n      }\n      if (currentNode instanceof BaseStream) {\n        const baseStreams = currentNode.getBaseStreams();\n        if (baseStreams) {\n          let foundMissingData = false;\n          for (const stream of baseStreams) {\n            if (stream.isDataLoaded) {\n              continue;\n            }\n            foundMissingData = true;\n            pendingRequests.push({ begin: stream.start, end: stream.end });\n          }\n          if (foundMissingData) {\n            nodesToRevisit.push(currentNode);\n          }\n        }\n      }\n\n      addChildren(currentNode, nodesToVisit);\n    }\n\n    if (pendingRequests.length) {\n      await this.xref.stream.manager.requestRanges(pendingRequests);\n\n      for (const node of nodesToRevisit) {\n        // Remove any reference nodes from the current `RefSet` so they\n        // aren't skipped when we revist them.\n        if (node instanceof Ref) {\n          this.refSet.remove(node);\n        }\n      }\n      await this.#walk(nodesToRevisit);\n    }\n  }\n\n  static async load(obj, keys, xref) {\n    // Don't walk the graph if all the data is already loaded.\n    if (xref.stream.isDataLoaded) {\n      return;\n    }\n    // eslint-disable-next-line no-restricted-syntax\n    const objLoader = new ObjectLoader(obj, keys, xref);\n    await objLoader.load();\n  }\n}\n\nexport { ObjectLoader };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// We use these symbols to avoid name conflict between tags\n// and properties/methods names.\nconst $acceptWhitespace = Symbol();\nconst $addHTML = Symbol();\nconst $appendChild = Symbol();\nconst $childrenToHTML = Symbol();\nconst $clean = Symbol();\nconst $cleanPage = Symbol();\nconst $cleanup = Symbol();\nconst $clone = Symbol();\nconst $consumed = Symbol();\nconst $content = Symbol(\"content\");\nconst $data = Symbol(\"data\");\nconst $dump = Symbol();\nconst $extra = Symbol(\"extra\");\nconst $finalize = Symbol();\nconst $flushHTML = Symbol();\nconst $getAttributeIt = Symbol();\nconst $getAttributes = Symbol();\nconst $getAvailableSpace = Symbol();\nconst $getChildrenByClass = Symbol();\nconst $getChildrenByName = Symbol();\nconst $getChildrenByNameIt = Symbol();\nconst $getDataValue = Symbol();\nconst $getExtra = Symbol();\nconst $getRealChildrenByNameIt = Symbol();\nconst $getChildren = Symbol();\nconst $getContainedChildren = Symbol();\nconst $getNextPage = Symbol();\nconst $getSubformParent = Symbol();\nconst $getParent = Symbol();\nconst $getTemplateRoot = Symbol();\nconst $globalData = Symbol();\nconst $hasSettableValue = Symbol();\nconst $ids = Symbol();\nconst $indexOf = Symbol();\nconst $insertAt = Symbol();\nconst $isCDATAXml = Symbol();\nconst $isBindable = Symbol();\nconst $isDataValue = Symbol();\nconst $isDescendent = Symbol();\nconst $isNsAgnostic = Symbol();\nconst $isSplittable = Symbol();\nconst $isThereMoreWidth = Symbol();\nconst $isTransparent = Symbol();\nconst $isUsable = Symbol();\nconst $lastAttribute = Symbol();\nconst $namespaceId = Symbol(\"namespaceId\");\nconst $nodeName = Symbol(\"nodeName\");\nconst $nsAttributes = Symbol();\nconst $onChild = Symbol();\nconst $onChildCheck = Symbol();\nconst $onText = Symbol();\nconst $pushGlyphs = Symbol();\nconst $popPara = Symbol();\nconst $pushPara = Symbol();\nconst $removeChild = Symbol();\nconst $root = Symbol(\"root\");\nconst $resolvePrototypes = Symbol();\nconst $searchNode = Symbol();\nconst $setId = Symbol();\nconst $setSetAttributes = Symbol();\nconst $setValue = Symbol();\nconst $tabIndex = Symbol();\nconst $text = Symbol();\nconst $toPages = Symbol();\nconst $toHTML = Symbol();\nconst $toString = Symbol();\nconst $toStyle = Symbol();\nconst $uid = Symbol(\"uid\");\n\nexport {\n  $acceptWhitespace,\n  $addHTML,\n  $appendChild,\n  $childrenToHTML,\n  $clean,\n  $cleanPage,\n  $cleanup,\n  $clone,\n  $consumed,\n  $content,\n  $data,\n  $dump,\n  $extra,\n  $finalize,\n  $flushHTML,\n  $getAttributeIt,\n  $getAttributes,\n  $getAvailableSpace,\n  $getChildren,\n  $getChildrenByClass,\n  $getChildrenByName,\n  $getChildrenByNameIt,\n  $getContainedChildren,\n  $getDataValue,\n  $getExtra,\n  $getNextPage,\n  $getParent,\n  $getRealChildrenByNameIt,\n  $getSubformParent,\n  $getTemplateRoot,\n  $globalData,\n  $hasSettableValue,\n  $ids,\n  $indexOf,\n  $insertAt,\n  $isBindable,\n  $isCDATAXml,\n  $isDataValue,\n  $isDescendent,\n  $isNsAgnostic,\n  $isSplittable,\n  $isThereMoreWidth,\n  $isTransparent,\n  $isUsable,\n  $lastAttribute,\n  $namespaceId,\n  $nodeName,\n  $nsAttributes,\n  $onChild,\n  $onChildCheck,\n  $onText,\n  $popPara,\n  $pushGlyphs,\n  $pushPara,\n  $removeChild,\n  $resolvePrototypes,\n  $root,\n  $searchNode,\n  $setId,\n  $setSetAttributes,\n  $setValue,\n  $tabIndex,\n  $text,\n  $toHTML,\n  $toPages,\n  $toString,\n  $toStyle,\n  $uid,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst $buildXFAObject = Symbol();\n\nconst NamespaceIds = {\n  config: {\n    id: 0,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xci/\"),\n  },\n  connectionSet: {\n    id: 1,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-connection-set/\"),\n  },\n  datasets: {\n    id: 2,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-data/\"),\n  },\n  form: {\n    id: 3,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-form/\"),\n  },\n  localeSet: {\n    id: 4,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-locale-set/\"),\n  },\n  pdf: {\n    id: 5,\n    check: ns => ns === \"http://ns.adobe.com/xdp/pdf/\",\n  },\n  signature: {\n    id: 6,\n    check: ns => ns === \"http://www.w3.org/2000/09/xmldsig#\",\n  },\n  sourceSet: {\n    id: 7,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-source-set/\"),\n  },\n  stylesheet: {\n    id: 8,\n    check: ns => ns === \"http://www.w3.org/1999/XSL/Transform\",\n  },\n  template: {\n    id: 9,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xfa-template/\"),\n  },\n  xdc: {\n    id: 10,\n    check: ns => ns.startsWith(\"http://www.xfa.org/schema/xdc/\"),\n  },\n  xdp: {\n    id: 11,\n    check: ns => ns === \"http://ns.adobe.com/xdp/\",\n  },\n  xfdf: {\n    id: 12,\n    check: ns => ns === \"http://ns.adobe.com/xfdf/\",\n  },\n  xhtml: {\n    id: 13,\n    check: ns => ns === \"http://www.w3.org/1999/xhtml\",\n  },\n  xmpmeta: {\n    id: 14,\n    check: ns => ns === \"http://ns.adobe.com/xmpmeta/\",\n  },\n};\n\nexport { $buildXFAObject, NamespaceIds };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MathClamp } from \"../../shared/math_clamp.js\";\nimport { shadow } from \"../../shared/util.js\";\n\nconst dimConverters = {\n  pt: x => x,\n  cm: x => (x / 2.54) * 72,\n  mm: x => (x / (10 * 2.54)) * 72,\n  in: x => x * 72,\n  px: x => x,\n};\nconst measurementPattern = /([+-]?\\d+\\.?\\d*)(.*)/;\n\nfunction stripQuotes(str) {\n  if (str.startsWith(\"'\") || str.startsWith('\"')) {\n    return str.slice(1, -1);\n  }\n  return str;\n}\n\nfunction getInteger({ data, defaultValue, validate }) {\n  if (!data) {\n    return defaultValue;\n  }\n  data = data.trim();\n  const n = parseInt(data, 10);\n  if (!isNaN(n) && validate(n)) {\n    return n;\n  }\n  return defaultValue;\n}\n\nfunction getFloat({ data, defaultValue, validate }) {\n  if (!data) {\n    return defaultValue;\n  }\n  data = data.trim();\n  const n = parseFloat(data);\n  if (!isNaN(n) && validate(n)) {\n    return n;\n  }\n  return defaultValue;\n}\n\nfunction getKeyword({ data, defaultValue, validate }) {\n  if (!data) {\n    return defaultValue;\n  }\n  data = data.trim();\n  if (validate(data)) {\n    return data;\n  }\n  return defaultValue;\n}\n\nfunction getStringOption(data, options) {\n  return getKeyword({\n    data,\n    defaultValue: options[0],\n    validate: k => options.includes(k),\n  });\n}\n\nfunction getMeasurement(str, def = \"0\") {\n  def ||= \"0\";\n  if (!str) {\n    return getMeasurement(def);\n  }\n  const match = str.trim().match(measurementPattern);\n  if (!match) {\n    return getMeasurement(def);\n  }\n  const [, valueStr, unit] = match;\n  const value = parseFloat(valueStr);\n  if (isNaN(value)) {\n    return getMeasurement(def);\n  }\n\n  if (value === 0) {\n    return 0;\n  }\n\n  const conv = dimConverters[unit];\n  if (conv) {\n    return conv(value);\n  }\n\n  return value;\n}\n\nfunction getRatio(data) {\n  if (!data) {\n    return { num: 1, den: 1 };\n  }\n  const ratio = data\n    .split(\":\", 2)\n    .map(x => parseFloat(x.trim()))\n    .filter(x => !isNaN(x));\n  if (ratio.length === 1) {\n    ratio.push(1);\n  }\n\n  if (ratio.length === 0) {\n    return { num: 1, den: 1 };\n  }\n\n  const [num, den] = ratio;\n  return { num, den };\n}\n\nfunction getRelevant(data) {\n  if (!data) {\n    return [];\n  }\n  return data\n    .trim()\n    .split(/\\s+/)\n    .map(e => ({\n      excluded: e[0] === \"-\",\n      viewname: e.substring(1),\n    }));\n}\n\nfunction getColor(data, def = [0, 0, 0]) {\n  let [r, g, b] = def;\n  if (!data) {\n    return { r, g, b };\n  }\n  const color = data\n    .split(\",\", 3)\n    .map(c => MathClamp(parseInt(c.trim(), 10), 0, 255))\n    .map(c => (isNaN(c) ? 0 : c));\n\n  if (color.length < 3) {\n    return { r, g, b };\n  }\n\n  [r, g, b] = color;\n  return { r, g, b };\n}\n\nfunction getBBox(data) {\n  const def = -1;\n  if (!data) {\n    return { x: def, y: def, width: def, height: def };\n  }\n  const bbox = data.split(\",\", 4).map(m => getMeasurement(m.trim(), \"-1\"));\n\n  if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) {\n    return { x: def, y: def, width: def, height: def };\n  }\n\n  const [x, y, width, height] = bbox;\n  return { x, y, width, height };\n}\n\nclass HTMLResult {\n  static get FAILURE() {\n    return shadow(this, \"FAILURE\", new HTMLResult(false, null, null, null));\n  }\n\n  static get EMPTY() {\n    return shadow(this, \"EMPTY\", new HTMLResult(true, null, null, null));\n  }\n\n  constructor(success, html, bbox, breakNode) {\n    this.success = success;\n    this.html = html;\n    this.bbox = bbox;\n    this.breakNode = breakNode;\n  }\n\n  isBreak() {\n    return !!this.breakNode;\n  }\n\n  static breakNode(node) {\n    return new HTMLResult(false, null, null, node);\n  }\n\n  static success(html, bbox = null) {\n    return new HTMLResult(true, html, bbox, null);\n  }\n}\n\nexport {\n  getBBox,\n  getColor,\n  getFloat,\n  getInteger,\n  getKeyword,\n  getMeasurement,\n  getRatio,\n  getRelevant,\n  getStringOption,\n  HTMLResult,\n  stripQuotes,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeObj, warn } from \"../../shared/util.js\";\nimport { $globalData } from \"./symbol_utils.js\";\nimport { stripQuotes } from \"./utils.js\";\n\nclass FontFinder {\n  constructor(pdfFonts) {\n    this.fonts = new Map();\n    this.cache = new Map();\n    this.warned = new Set();\n    this.defaultFont = null;\n    this.add(pdfFonts);\n  }\n\n  add(pdfFonts, reallyMissingFonts = null) {\n    for (const pdfFont of pdfFonts) {\n      this.addPdfFont(pdfFont);\n    }\n    for (const pdfFont of this.fonts.values()) {\n      if (!pdfFont.regular) {\n        pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic;\n      }\n    }\n\n    if (!reallyMissingFonts || reallyMissingFonts.size === 0) {\n      return;\n    }\n    const myriad = this.fonts.get(\"PdfJS-Fallback-PdfJS-XFA\");\n    for (const missing of reallyMissingFonts) {\n      this.fonts.set(missing, myriad);\n    }\n  }\n\n  addPdfFont(pdfFont) {\n    const cssFontInfo = pdfFont.cssFontInfo;\n    const name = cssFontInfo.fontFamily;\n    const font = this.fonts.getOrInsertComputed(name, makeObj);\n    this.defaultFont ??= font;\n\n    let property = \"\";\n    const fontWeight = parseFloat(cssFontInfo.fontWeight);\n    if (parseFloat(cssFontInfo.italicAngle) !== 0) {\n      property = fontWeight >= 700 ? \"bolditalic\" : \"italic\";\n    } else if (fontWeight >= 700) {\n      property = \"bold\";\n    }\n\n    if (!property) {\n      if (pdfFont.name.includes(\"Bold\") || pdfFont.psName?.includes(\"Bold\")) {\n        property = \"bold\";\n      }\n      if (\n        pdfFont.name.includes(\"Italic\") ||\n        pdfFont.name.endsWith(\"It\") ||\n        pdfFont.psName?.includes(\"Italic\") ||\n        pdfFont.psName?.endsWith(\"It\")\n      ) {\n        property += \"italic\";\n      }\n    }\n\n    if (!property) {\n      property = \"regular\";\n    }\n\n    font[property] = pdfFont;\n  }\n\n  getDefault() {\n    return this.defaultFont;\n  }\n\n  find(fontName, mustWarn = true) {\n    let font = this.fonts.get(fontName) || this.cache.get(fontName);\n    if (font) {\n      return font;\n    }\n\n    const pattern = /[,\\-_ ]|bolditalic|bold|italic|regular|it/gi;\n    let name = fontName.replaceAll(pattern, \"\");\n    font = this.fonts.get(name);\n    if (font) {\n      this.cache.set(fontName, font);\n      return font;\n    }\n    name = name.toLowerCase();\n\n    const maybe = [];\n    for (const [family, pdfFont] of this.fonts) {\n      if (family.replaceAll(pattern, \"\").toLowerCase().startsWith(name)) {\n        maybe.push(pdfFont);\n      }\n    }\n\n    if (maybe.length === 0) {\n      for (const pdfFont of this.fonts.values()) {\n        if (\n          pdfFont.regular.name\n            ?.replaceAll(pattern, \"\")\n            .toLowerCase()\n            .startsWith(name)\n        ) {\n          maybe.push(pdfFont);\n        }\n      }\n    }\n\n    if (maybe.length === 0) {\n      name = name.replaceAll(/psmt|mt/gi, \"\");\n      for (const [family, pdfFont] of this.fonts) {\n        if (family.replaceAll(pattern, \"\").toLowerCase().startsWith(name)) {\n          maybe.push(pdfFont);\n        }\n      }\n    }\n\n    if (maybe.length === 0) {\n      for (const pdfFont of this.fonts.values()) {\n        if (\n          pdfFont.regular.name\n            ?.replaceAll(pattern, \"\")\n            .toLowerCase()\n            .startsWith(name)\n        ) {\n          maybe.push(pdfFont);\n        }\n      }\n    }\n\n    if (maybe.length >= 1) {\n      if (maybe.length !== 1 && mustWarn) {\n        warn(`XFA - Too many choices to guess the correct font: ${fontName}`);\n      }\n      this.cache.set(fontName, maybe[0]);\n      return maybe[0];\n    }\n\n    if (mustWarn && !this.warned.has(fontName)) {\n      this.warned.add(fontName);\n      warn(`XFA - Cannot find the font: ${fontName}`);\n    }\n    return null;\n  }\n}\n\nfunction selectFont(xfaFont, typeface) {\n  if (xfaFont.posture === \"italic\") {\n    if (xfaFont.weight === \"bold\") {\n      return typeface.bolditalic;\n    }\n    return typeface.italic;\n  } else if (xfaFont.weight === \"bold\") {\n    return typeface.bold;\n  }\n\n  return typeface.regular;\n}\n\nfunction getMetrics(xfaFont, real = false) {\n  let pdfFont = null;\n  if (xfaFont) {\n    const name = stripQuotes(xfaFont.typeface);\n    const typeface = xfaFont[$globalData].fontFinder.find(name);\n    pdfFont = selectFont(xfaFont, typeface);\n  }\n\n  if (!pdfFont) {\n    return {\n      lineHeight: 12,\n      lineGap: 2,\n      lineNoGap: 10,\n    };\n  }\n\n  const size = xfaFont.size || 10;\n  const lineHeight = pdfFont.lineHeight\n    ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight)\n    : 1.2;\n  const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap;\n  return {\n    lineHeight: lineHeight * size,\n    lineGap: lineGap * size,\n    lineNoGap: Math.max(1, lineHeight - lineGap) * size,\n  };\n}\n\nexport { FontFinder, getMetrics, selectFont };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { selectFont } from \"./fonts.js\";\n\nconst WIDTH_FACTOR = 1.02;\n\nclass FontInfo {\n  constructor(xfaFont, margin, lineHeight, fontFinder) {\n    this.lineHeight = lineHeight;\n    this.paraMargin = margin || {\n      top: 0,\n      bottom: 0,\n      left: 0,\n      right: 0,\n    };\n\n    if (!xfaFont) {\n      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);\n      return;\n    }\n\n    this.xfaFont = {\n      typeface: xfaFont.typeface,\n      posture: xfaFont.posture,\n      weight: xfaFont.weight,\n      size: xfaFont.size,\n      letterSpacing: xfaFont.letterSpacing,\n    };\n    const typeface = fontFinder.find(xfaFont.typeface);\n    if (!typeface) {\n      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);\n      return;\n    }\n\n    this.pdfFont = selectFont(xfaFont, typeface);\n\n    if (!this.pdfFont) {\n      [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);\n    }\n  }\n\n  defaultFont(fontFinder) {\n    // TODO: Add a default font based on Liberation.\n    const font =\n      fontFinder.find(\"Helvetica\", false) ||\n      fontFinder.find(\"Myriad Pro\", false) ||\n      fontFinder.find(\"Arial\", false) ||\n      fontFinder.getDefault();\n    if (font?.regular) {\n      const pdfFont = font.regular;\n      const info = pdfFont.cssFontInfo;\n      const xfaFont = {\n        typeface: info.fontFamily,\n        posture: \"normal\",\n        weight: \"normal\",\n        size: 10,\n        letterSpacing: 0,\n      };\n      return [pdfFont, xfaFont];\n    }\n\n    const xfaFont = {\n      typeface: \"Courier\",\n      posture: \"normal\",\n      weight: \"normal\",\n      size: 10,\n      letterSpacing: 0,\n    };\n    return [null, xfaFont];\n  }\n}\n\nclass FontSelector {\n  constructor(\n    defaultXfaFont,\n    defaultParaMargin,\n    defaultLineHeight,\n    fontFinder\n  ) {\n    this.fontFinder = fontFinder;\n    this.stack = [\n      new FontInfo(\n        defaultXfaFont,\n        defaultParaMargin,\n        defaultLineHeight,\n        fontFinder\n      ),\n    ];\n  }\n\n  pushData(xfaFont, margin, lineHeight) {\n    const lastFont = this.stack.at(-1);\n    for (const name of [\n      \"typeface\",\n      \"posture\",\n      \"weight\",\n      \"size\",\n      \"letterSpacing\",\n    ]) {\n      xfaFont[name] ||= lastFont.xfaFont[name];\n    }\n\n    for (const name of [\"top\", \"bottom\", \"left\", \"right\"]) {\n      if (isNaN(margin[name])) {\n        margin[name] = lastFont.paraMargin[name];\n      }\n    }\n\n    const fontInfo = new FontInfo(\n      xfaFont,\n      margin,\n      lineHeight || lastFont.lineHeight,\n      this.fontFinder\n    );\n    fontInfo.pdfFont ||= lastFont.pdfFont;\n\n    this.stack.push(fontInfo);\n  }\n\n  popFont() {\n    this.stack.pop();\n  }\n\n  topFont() {\n    return this.stack.at(-1);\n  }\n}\n\n/**\n * Compute a text area dimensions based on font metrics.\n */\nclass TextMeasure {\n  constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) {\n    this.glyphs = [];\n    this.fontSelector = new FontSelector(\n      defaultXfaFont,\n      defaultParaMargin,\n      defaultLineHeight,\n      fonts\n    );\n    this.extraHeight = 0;\n  }\n\n  pushData(xfaFont, margin, lineHeight) {\n    this.fontSelector.pushData(xfaFont, margin, lineHeight);\n  }\n\n  popFont(xfaFont) {\n    return this.fontSelector.popFont();\n  }\n\n  addPara() {\n    const lastFont = this.fontSelector.topFont();\n    this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom;\n  }\n\n  addString(str) {\n    if (!str) {\n      return;\n    }\n\n    const lastFont = this.fontSelector.topFont();\n    const fontSize = lastFont.xfaFont.size;\n    if (lastFont.pdfFont) {\n      const letterSpacing = lastFont.xfaFont.letterSpacing;\n      const pdfFont = lastFont.pdfFont;\n      const fontLineHeight = pdfFont.lineHeight || 1.2;\n      const lineHeight =\n        lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize;\n      const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap;\n      const noGap = fontLineHeight - lineGap;\n      const firstLineHeight = Math.max(1, noGap) * fontSize;\n      const scale = fontSize / 1000;\n      const fallbackWidth =\n        pdfFont.defaultWidth || pdfFont.charsToGlyphs(\" \")[0].width;\n\n      for (const line of str.split(/[\\u2029\\n]/)) {\n        const encodedLine = pdfFont.encodeString(line).join(\"\");\n        const glyphs = pdfFont.charsToGlyphs(encodedLine);\n\n        for (const glyph of glyphs) {\n          const width = glyph.width || fallbackWidth;\n          this.glyphs.push([\n            width * scale + letterSpacing,\n            lineHeight,\n            firstLineHeight,\n            glyph.unicode,\n            false,\n          ]);\n        }\n\n        this.glyphs.push([0, 0, 0, \"\\n\", true]);\n      }\n      this.glyphs.pop();\n      return;\n    }\n\n    // When we have no font in the pdf, just use the font size as default width.\n    for (const line of str.split(/[\\u2029\\n]/)) {\n      for (const char of line.split(\"\")) {\n        this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]);\n      }\n\n      this.glyphs.push([0, 0, 0, \"\\n\", true]);\n    }\n    this.glyphs.pop();\n  }\n\n  compute(maxWidth) {\n    let lastSpacePos = -1,\n      lastSpaceWidth = 0,\n      width = 0,\n      height = 0,\n      currentLineWidth = 0,\n      currentLineHeight = 0;\n    let isBroken = false;\n    let isFirstLine = true;\n\n    for (let i = 0, ii = this.glyphs.length; i < ii; i++) {\n      const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] =\n        this.glyphs[i];\n      const isSpace = char === \" \";\n      const glyphHeight = isFirstLine ? firstLineHeight : lineHeight;\n      if (isEOL) {\n        width = Math.max(width, currentLineWidth);\n        currentLineWidth = 0;\n        height += currentLineHeight;\n        currentLineHeight = glyphHeight;\n        lastSpacePos = -1;\n        lastSpaceWidth = 0;\n        isFirstLine = false;\n        continue;\n      }\n\n      if (isSpace) {\n        if (currentLineWidth + glyphWidth > maxWidth) {\n          // We can break here but the space is not taken into account.\n          width = Math.max(width, currentLineWidth);\n          currentLineWidth = 0;\n          height += currentLineHeight;\n          currentLineHeight = glyphHeight;\n          lastSpacePos = -1;\n          lastSpaceWidth = 0;\n          isBroken = true;\n          isFirstLine = false;\n        } else {\n          currentLineHeight = Math.max(glyphHeight, currentLineHeight);\n          lastSpaceWidth = currentLineWidth;\n          currentLineWidth += glyphWidth;\n          lastSpacePos = i;\n        }\n        continue;\n      }\n\n      if (currentLineWidth + glyphWidth > maxWidth) {\n        // We must break to the last white position (if available)\n        height += currentLineHeight;\n        currentLineHeight = glyphHeight;\n        if (lastSpacePos !== -1) {\n          i = lastSpacePos;\n          width = Math.max(width, lastSpaceWidth);\n          currentLineWidth = 0;\n          lastSpacePos = -1;\n          lastSpaceWidth = 0;\n        } else {\n          // Just break in the middle of the word\n          width = Math.max(width, currentLineWidth);\n          currentLineWidth = glyphWidth;\n        }\n        isBroken = true;\n        isFirstLine = false;\n\n        continue;\n      }\n\n      currentLineWidth += glyphWidth;\n      currentLineHeight = Math.max(glyphHeight, currentLineHeight);\n    }\n\n    width = Math.max(width, currentLineWidth);\n    height += currentLineHeight + this.extraHeight;\n\n    return { width: WIDTH_FACTOR * width, height, isBroken };\n  }\n}\n\nexport { TextMeasure };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $getChildren,\n  $getChildrenByClass,\n  $getChildrenByName,\n  $getParent,\n} from \"./symbol_utils.js\";\nimport { makeMap, warn } from \"../../shared/util.js\";\n\nconst namePattern = /^[^.[]+/;\nconst indexPattern = /^[^\\]]+/;\nconst operators = {\n  dot: 0,\n  dotDot: 1,\n  dotHash: 2,\n  dotBracket: 3,\n  dotParen: 4,\n};\n\nconst shortcuts = new Map([\n  [\"$data\", (root, current) => (root.datasets ? root.datasets.data : root)],\n  [\n    \"$record\",\n    (root, current) =>\n      (root.datasets ? root.datasets.data : root)[$getChildren]()[0],\n  ],\n  [\"$template\", (root, current) => root.template],\n  [\"$connectionSet\", (root, current) => root.connectionSet],\n  [\"$form\", (root, current) => root.form],\n  [\"$layout\", (root, current) => root.layout],\n  [\"$host\", (root, current) => root.host],\n  [\"$dataWindow\", (root, current) => root.dataWindow],\n  [\"$event\", (root, current) => root.event],\n  [\"!\", (root, current) => root.datasets],\n  [\"$xfa\", (root, current) => root],\n  [\"xfa\", (root, current) => root],\n  [\"$\", (root, current) => current],\n]);\n\nconst somCache = new WeakMap();\n\nfunction parseIndex(index) {\n  index = index.trim();\n  if (index === \"*\") {\n    return Infinity;\n  }\n  return parseInt(index, 10) || 0;\n}\n\n// For now expressions containing .[...] or .(...) are not\n// evaluated so don't parse them.\n// TODO: implement that stuff and the remove the noExpr param.\nfunction parseExpression(expr, dotDotAllowed, noExpr = true) {\n  let match = expr.match(namePattern);\n  if (!match) {\n    return null;\n  }\n\n  let [name] = match;\n  const parsed = [\n    {\n      name,\n      cacheName: \".\" + name,\n      index: 0,\n      js: null,\n      formCalc: null,\n      operator: operators.dot,\n    },\n  ];\n\n  let pos = name.length;\n\n  while (pos < expr.length) {\n    const spos = pos;\n    const char = expr.charAt(pos++);\n    if (char === \"[\") {\n      match = expr.slice(pos).match(indexPattern);\n      if (!match) {\n        warn(\"XFA - Invalid index in SOM expression\");\n        return null;\n      }\n      parsed.at(-1).index = parseIndex(match[0]);\n      pos += match[0].length + 1;\n      continue;\n    }\n\n    let operator;\n    switch (expr.charAt(pos)) {\n      case \".\":\n        if (!dotDotAllowed) {\n          return null;\n        }\n        pos++;\n        operator = operators.dotDot;\n        break;\n      case \"#\":\n        pos++;\n        operator = operators.dotHash;\n        break;\n      case \"[\":\n        if (noExpr) {\n          warn(\n            \"XFA - SOM expression contains a FormCalc subexpression which is not supported for now.\"\n          );\n          return null;\n        }\n        // TODO: FormCalc expression so need to use the parser\n        operator = operators.dotBracket;\n        break;\n      case \"(\":\n        if (noExpr) {\n          warn(\n            \"XFA - SOM expression contains a JavaScript subexpression which is not supported for now.\"\n          );\n          return null;\n        }\n        // TODO:\n        // JavaScript expression: should be a boolean operation with a path\n        // so maybe we can have our own parser for that stuff or\n        // maybe use the formcalc one.\n        operator = operators.dotParen;\n        break;\n      default:\n        operator = operators.dot;\n        break;\n    }\n\n    match = expr.slice(pos).match(namePattern);\n    if (!match) {\n      break;\n    }\n\n    [name] = match;\n    pos += name.length;\n    parsed.push({\n      name,\n      cacheName: expr.slice(spos, pos),\n      operator,\n      index: 0,\n      js: null,\n      formCalc: null,\n    });\n  }\n  return parsed;\n}\n\nfunction searchNode(\n  root,\n  container,\n  expr,\n  dotDotAllowed = true,\n  useCache = true\n) {\n  const parsed = parseExpression(expr, dotDotAllowed);\n  if (!parsed) {\n    return null;\n  }\n\n  const fn = shortcuts.get(parsed[0].name);\n  let i = 0;\n  let isQualified;\n  if (fn) {\n    isQualified = true;\n    root = [fn(root, container)];\n    i = 1;\n  } else {\n    isQualified = container === null;\n    root = [container || root];\n  }\n\n  for (let ii = parsed.length; i < ii; i++) {\n    const { name, cacheName, operator, index } = parsed[i];\n    const nodes = [];\n    for (const node of root) {\n      if (!node.isXFAObject) {\n        continue;\n      }\n\n      let children, cached;\n\n      if (useCache) {\n        cached = somCache.getOrInsertComputed(node, makeMap);\n        children = cached.get(cacheName);\n      }\n\n      if (!children) {\n        switch (operator) {\n          case operators.dot:\n            children = node[$getChildrenByName](name, false);\n            break;\n          case operators.dotDot:\n            children = node[$getChildrenByName](name, true);\n            break;\n          case operators.dotHash:\n            children = node[$getChildrenByClass](name);\n            children = children.isXFAObjectArray\n              ? children.children\n              : [children];\n            break;\n          default:\n            break;\n        }\n        if (useCache) {\n          cached.set(cacheName, children);\n        }\n      }\n\n      if (children.length > 0) {\n        nodes.push(children);\n      }\n    }\n\n    if (nodes.length === 0 && !isQualified && i === 0) {\n      // We've an unqualified expression and we didn't find anything\n      // so look at container and siblings of container and so on.\n      // http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.364.2157&rep=rep1&type=pdf#page=114\n      const parent = container[$getParent]();\n      container = parent;\n      if (!container) {\n        return null;\n      }\n      i = -1;\n      root = [container];\n      continue;\n    }\n\n    root = isFinite(index)\n      ? nodes.filter(node => index < node.length).map(node => node[index])\n      : nodes.flat();\n  }\n\n  if (root.length === 0) {\n    return null;\n  }\n\n  return root;\n}\n\nfunction createDataNode(root, container, expr) {\n  const parsed = parseExpression(expr);\n  if (!parsed) {\n    return null;\n  }\n\n  if (parsed.some(x => x.operator === operators.dotDot)) {\n    return null;\n  }\n\n  const fn = shortcuts.get(parsed[0].name);\n  let i = 0;\n  if (fn) {\n    root = fn(root, container);\n    i = 1;\n  } else {\n    root = container || root;\n  }\n\n  for (let ii = parsed.length; i < ii; i++) {\n    const { name, operator, index } = parsed[i];\n    if (!isFinite(index)) {\n      parsed[i].index = 0;\n      return root.createNodes(parsed.slice(i));\n    }\n\n    let children;\n    switch (operator) {\n      case operators.dot:\n        children = root[$getChildrenByName](name, false);\n        break;\n      case operators.dotDot:\n        children = root[$getChildrenByName](name, true);\n        break;\n      case operators.dotHash:\n        children = root[$getChildrenByClass](name);\n        children = children.isXFAObjectArray ? children.children : [children];\n        break;\n      default:\n        break;\n    }\n\n    if (children.length === 0) {\n      return root.createNodes(parsed.slice(i));\n    }\n\n    if (index < children.length) {\n      const child = children[index];\n      if (!child.isXFAObject) {\n        warn(`XFA - Cannot create a node.`);\n        return null;\n      }\n      root = child;\n    } else {\n      parsed[i].index = index - children.length;\n      return root.createNodes(parsed.slice(i));\n    }\n  }\n  return null;\n}\n\nexport { createDataNode, searchNode };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $acceptWhitespace,\n  $addHTML,\n  $appendChild,\n  $childrenToHTML,\n  $clean,\n  $cleanup,\n  $clone,\n  $consumed,\n  $content,\n  $dump,\n  $extra,\n  $finalize,\n  $flushHTML,\n  $getAttributeIt,\n  $getAttributes,\n  $getAvailableSpace,\n  $getChildren,\n  $getChildrenByClass,\n  $getChildrenByName,\n  $getChildrenByNameIt,\n  $getContainedChildren,\n  $getDataValue,\n  $getParent,\n  $getRealChildrenByNameIt,\n  $getSubformParent,\n  $getTemplateRoot,\n  $globalData,\n  $hasSettableValue,\n  $indexOf,\n  $insertAt,\n  $isBindable,\n  $isCDATAXml,\n  $isDataValue,\n  $isDescendent,\n  $isNsAgnostic,\n  $isSplittable,\n  $isThereMoreWidth,\n  $isTransparent,\n  $lastAttribute,\n  $namespaceId,\n  $nodeName,\n  $nsAttributes,\n  $onChild,\n  $onChildCheck,\n  $onText,\n  $popPara,\n  $pushPara,\n  $removeChild,\n  $resolvePrototypes,\n  $root,\n  $setId,\n  $setSetAttributes,\n  $setValue,\n  $text,\n  $toHTML,\n  $toString,\n  $toStyle,\n  $uid,\n} from \"./symbol_utils.js\";\nimport { getInteger, getKeyword, HTMLResult } from \"./utils.js\";\nimport { shadow, utf8StringToString, warn } from \"../../shared/util.js\";\nimport { encodeToXmlString } from \"../core_utils.js\";\nimport { NamespaceIds } from \"./namespaces.js\";\nimport { searchNode } from \"./som.js\";\n\nconst _applyPrototype = Symbol();\nconst _attributes = Symbol();\nconst _attributeNames = Symbol();\nconst _children = Symbol(\"_children\");\nconst _cloneAttribute = Symbol();\nconst _dataValue = Symbol();\nconst _defaultValue = Symbol();\nconst _filteredChildrenGenerator = Symbol();\nconst _getPrototype = Symbol();\nconst _getUnsetAttributes = Symbol();\nconst _hasChildren = Symbol();\nconst _max = Symbol();\nconst _options = Symbol();\nconst _parent = Symbol(\"parent\");\nconst _resolvePrototypesHelper = Symbol();\nconst _setAttributes = Symbol();\nconst _validator = Symbol();\n\nlet uid = 0;\n\nconst NS_DATASETS = NamespaceIds.datasets.id;\n\nclass XFAObject {\n  constructor(nsId, name, hasChildren = false) {\n    this[$namespaceId] = nsId;\n    this[$nodeName] = name;\n    this[_hasChildren] = hasChildren;\n    this[_parent] = null;\n    this[_children] = [];\n    this[$uid] = `${name}${uid++}`;\n    this[$globalData] = null;\n  }\n\n  get isXFAObject() {\n    return true;\n  }\n\n  get isXFAObjectArray() {\n    return false;\n  }\n\n  createNodes(path) {\n    let root = this,\n      node = null;\n    for (const { name, index } of path) {\n      for (let i = 0, ii = isFinite(index) ? index : 0; i <= ii; i++) {\n        const nsId =\n          root[$namespaceId] === NS_DATASETS ? -1 : root[$namespaceId];\n        node = new XmlObject(nsId, name);\n        root[$appendChild](node);\n      }\n      root = node;\n    }\n    return node;\n  }\n\n  [$onChild](child) {\n    if (!this[_hasChildren] || !this[$onChildCheck](child)) {\n      return false;\n    }\n\n    const name = child[$nodeName];\n    const node = this[name];\n\n    if (node instanceof XFAObjectArray) {\n      if (node.push(child)) {\n        this[$appendChild](child);\n        return true;\n      }\n    } else {\n      // IRL it's possible to already have a node.\n      // So just replace it with the last version.\n      if (node !== null) {\n        this[$removeChild](node);\n      }\n      this[name] = child;\n      this[$appendChild](child);\n      return true;\n    }\n\n    let id = \"\";\n    if (this.id) {\n      id = ` (id: ${this.id})`;\n    } else if (this.name) {\n      id = ` (name: ${this.name} ${this.h.value})`;\n    }\n    warn(`XFA - node \"${this[$nodeName]}\"${id} has already enough \"${name}\"!`);\n    return false;\n  }\n\n  [$onChildCheck](child) {\n    return (\n      Object.hasOwn(this, child[$nodeName]) &&\n      child[$namespaceId] === this[$namespaceId]\n    );\n  }\n\n  [$isNsAgnostic]() {\n    return false;\n  }\n\n  [$acceptWhitespace]() {\n    return false;\n  }\n\n  [$isCDATAXml]() {\n    return false;\n  }\n\n  [$isBindable]() {\n    return false;\n  }\n\n  [$popPara]() {\n    if (this.para) {\n      this[$getTemplateRoot]()[$extra].paraStack.pop();\n    }\n  }\n\n  [$pushPara]() {\n    this[$getTemplateRoot]()[$extra].paraStack.push(this.para);\n  }\n\n  [$setId](ids) {\n    if (this.id && this[$namespaceId] === NamespaceIds.template.id) {\n      ids.set(this.id, this);\n    }\n  }\n\n  [$getTemplateRoot]() {\n    return this[$globalData].template;\n  }\n\n  [$isSplittable]() {\n    return false;\n  }\n\n  /**\n     Return true if this node (typically a container)\n     can provide more width during layout.\n     The goal is to help to know what a descendant must\n     do in case of horizontal overflow.\n   */\n  [$isThereMoreWidth]() {\n    return false;\n  }\n\n  [$appendChild](child) {\n    child[_parent] = this;\n    this[_children].push(child);\n    if (!child[$globalData] && this[$globalData]) {\n      child[$globalData] = this[$globalData];\n    }\n  }\n\n  [$removeChild](child) {\n    const i = this[_children].indexOf(child);\n    this[_children].splice(i, 1);\n  }\n\n  [$hasSettableValue]() {\n    return Object.hasOwn(this, \"value\");\n  }\n\n  [$setValue](_) {}\n\n  [$onText](_) {}\n\n  [$finalize]() {}\n\n  [$clean](builder) {\n    delete this[_hasChildren];\n    if (this[$cleanup]) {\n      builder.clean(this[$cleanup]);\n      delete this[$cleanup];\n    }\n  }\n\n  [$indexOf](child) {\n    return this[_children].indexOf(child);\n  }\n\n  [$insertAt](i, child) {\n    child[_parent] = this;\n    this[_children].splice(i, 0, child);\n    if (!child[$globalData] && this[$globalData]) {\n      child[$globalData] = this[$globalData];\n    }\n  }\n\n  /**\n   * If true the element is transparent when searching a node using\n   * a SOM expression which means that looking for \"foo.bar\" in\n   * <... name=\"foo\"><toto><titi><... name=\"bar\"></titi></toto>...\n   * is fine because toto and titi are transparent.\n   */\n  [$isTransparent]() {\n    return !this.name;\n  }\n\n  [$lastAttribute]() {\n    return \"\";\n  }\n\n  [$text]() {\n    if (this[_children].length === 0) {\n      return this[$content];\n    }\n    return this[_children].map(c => c[$text]()).join(\"\");\n  }\n\n  get [_attributeNames]() {\n    // Lazily get attributes names\n    const proto = Object.getPrototypeOf(this);\n    if (!proto._attributes) {\n      const attributes = (proto._attributes = new Set());\n      for (const name of Object.getOwnPropertyNames(this)) {\n        if (\n          this[name] === null ||\n          this[name] instanceof XFAObject ||\n          this[name] instanceof XFAObjectArray\n        ) {\n          break;\n        }\n        attributes.add(name);\n      }\n    }\n    return shadow(this, _attributeNames, proto._attributes);\n  }\n\n  [$isDescendent](parent) {\n    let node = this;\n    while (node) {\n      if (node === parent) {\n        return true;\n      }\n      node = node[$getParent]();\n    }\n    return false;\n  }\n\n  [$getParent]() {\n    return this[_parent];\n  }\n\n  [$getSubformParent]() {\n    return this[$getParent]();\n  }\n\n  [$getChildren](name = null) {\n    if (!name) {\n      return this[_children];\n    }\n\n    return this[name];\n  }\n\n  [$dump]() {\n    const dumped = Object.create(null);\n    if (this[$content]) {\n      dumped.$content = this[$content];\n    }\n\n    for (const name of Object.getOwnPropertyNames(this)) {\n      const value = this[name];\n      if (value === null) {\n        continue;\n      }\n      if (value instanceof XFAObject) {\n        dumped[name] = value[$dump]();\n      } else if (value instanceof XFAObjectArray) {\n        if (!value.isEmpty()) {\n          dumped[name] = value.dump();\n        }\n      } else {\n        dumped[name] = value;\n      }\n    }\n\n    return dumped;\n  }\n\n  [$toStyle]() {\n    return null;\n  }\n\n  [$toHTML]() {\n    return HTMLResult.EMPTY;\n  }\n\n  *[$getContainedChildren]() {\n    // This function is overriden in Subform and SubformSet.\n    for (const node of this[$getChildren]()) {\n      yield node;\n    }\n  }\n\n  *[_filteredChildrenGenerator](filter, include) {\n    for (const node of this[$getContainedChildren]()) {\n      if (!filter || include === filter.has(node[$nodeName])) {\n        const availableSpace = this[$getAvailableSpace]();\n        const res = node[$toHTML](availableSpace);\n        if (!res.success) {\n          this[$extra].failingNode = node;\n        }\n        yield res;\n      }\n    }\n  }\n\n  [$flushHTML]() {\n    return null;\n  }\n\n  [$addHTML](html, bbox) {\n    this[$extra].children.push(html);\n  }\n\n  [$getAvailableSpace]() {}\n\n  [$childrenToHTML]({ filter = null, include = true }) {\n    if (!this[$extra].generator) {\n      this[$extra].generator = this[_filteredChildrenGenerator](\n        filter,\n        include\n      );\n    } else {\n      const availableSpace = this[$getAvailableSpace]();\n      const res = this[$extra].failingNode[$toHTML](availableSpace);\n      if (!res.success) {\n        return res;\n      }\n      if (res.html) {\n        this[$addHTML](res.html, res.bbox);\n      }\n      delete this[$extra].failingNode;\n    }\n\n    while (true) {\n      const gen = this[$extra].generator.next();\n      if (gen.done) {\n        break;\n      }\n      const res = gen.value;\n      if (!res.success) {\n        return res;\n      }\n      if (res.html) {\n        this[$addHTML](res.html, res.bbox);\n      }\n    }\n\n    this[$extra].generator = null;\n\n    return HTMLResult.EMPTY;\n  }\n\n  [$setSetAttributes](attributes) {\n    // Just keep set attributes because it can be used in a proto.\n    this[_setAttributes] = new Set(Object.keys(attributes));\n  }\n\n  /**\n   * Get attribute names which have been set in the proto but not in this.\n   */\n  [_getUnsetAttributes](protoAttributes) {\n    const allAttr = this[_attributeNames];\n    const setAttr = this[_setAttributes];\n    return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x));\n  }\n\n  /**\n   * Update the node with properties coming from a prototype and apply\n   * this function recursively to all children.\n   */\n  [$resolvePrototypes](ids, ancestors = new Set()) {\n    for (const child of this[_children]) {\n      child[_resolvePrototypesHelper](ids, ancestors);\n    }\n  }\n\n  [_resolvePrototypesHelper](ids, ancestors) {\n    const proto = this[_getPrototype](ids, ancestors);\n    if (proto) {\n      // _applyPrototype will apply $resolvePrototypes with correct ancestors\n      // to avoid infinite loop.\n      this[_applyPrototype](proto, ids, ancestors);\n    } else {\n      this[$resolvePrototypes](ids, ancestors);\n    }\n  }\n\n  [_getPrototype](ids, ancestors) {\n    const { use, usehref } = this;\n    if (!use && !usehref) {\n      return null;\n    }\n\n    let proto = null;\n    let somExpression = null;\n    let id = null;\n    let ref = use;\n\n    // If usehref and use are non-empty then use usehref.\n    if (usehref) {\n      ref = usehref;\n      // Href can be one of the following:\n      // - #ID\n      // - URI#ID\n      // - #som(expression)\n      // - URI#som(expression)\n      // - URI\n      // For now we don't handle URI other than \".\" (current document).\n      if (usehref.startsWith(\"#som(\") && usehref.endsWith(\")\")) {\n        somExpression = usehref.slice(\"#som(\".length, -1);\n      } else if (usehref.startsWith(\".#som(\") && usehref.endsWith(\")\")) {\n        somExpression = usehref.slice(\".#som(\".length, -1);\n      } else if (usehref.startsWith(\"#\")) {\n        id = usehref.slice(1);\n      } else if (usehref.startsWith(\".#\")) {\n        id = usehref.slice(2);\n      }\n    } else if (use.startsWith(\"#\")) {\n      id = use.slice(1);\n    } else {\n      somExpression = use;\n    }\n\n    this.use = this.usehref = \"\";\n    if (id) {\n      proto = ids.get(id);\n    } else {\n      proto = searchNode(\n        ids.get($root),\n        this,\n        somExpression,\n        true /* = dotDotAllowed */,\n        false /* = useCache */\n      );\n      if (proto) {\n        proto = proto[0];\n      }\n    }\n\n    if (!proto) {\n      warn(`XFA - Invalid prototype reference: ${ref}.`);\n      return null;\n    }\n\n    if (proto[$nodeName] !== this[$nodeName]) {\n      warn(\n        `XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`\n      );\n      return null;\n    }\n\n    if (ancestors.has(proto)) {\n      // We've a cycle so break it.\n      warn(`XFA - Cycle detected in prototypes use.`);\n      return null;\n    }\n\n    ancestors.add(proto);\n\n    // The prototype can have a \"use\" attribute itself.\n    const protoProto = proto[_getPrototype](ids, ancestors);\n    if (protoProto) {\n      proto[_applyPrototype](protoProto, ids, ancestors);\n    }\n\n    // The prototype can have a child which itself has a \"use\" property.\n    proto[$resolvePrototypes](ids, ancestors);\n\n    ancestors.delete(proto);\n\n    return proto;\n  }\n\n  [_applyPrototype](proto, ids, ancestors) {\n    if (ancestors.has(proto)) {\n      // We've a cycle so break it.\n      warn(`XFA - Cycle detected in prototypes use.`);\n      return;\n    }\n\n    if (!this[$content] && proto[$content]) {\n      this[$content] = proto[$content];\n    }\n\n    const newAncestors = new Set(ancestors);\n    newAncestors.add(proto);\n\n    for (const unsetAttrName of this[_getUnsetAttributes](\n      proto[_setAttributes]\n    )) {\n      this[unsetAttrName] = proto[unsetAttrName];\n      if (this[_setAttributes]) {\n        this[_setAttributes].add(unsetAttrName);\n      }\n    }\n\n    for (const name of Object.getOwnPropertyNames(this)) {\n      if (this[_attributeNames].has(name)) {\n        continue;\n      }\n      const value = this[name];\n      const protoValue = proto[name];\n\n      if (value instanceof XFAObjectArray) {\n        for (const child of value[_children]) {\n          child[_resolvePrototypesHelper](ids, ancestors);\n        }\n\n        for (\n          let i = value[_children].length, ii = protoValue[_children].length;\n          i < ii;\n          i++\n        ) {\n          const child = proto[_children][i][$clone]();\n          if (value.push(child)) {\n            child[_parent] = this;\n            this[_children].push(child);\n            child[_resolvePrototypesHelper](ids, ancestors);\n          } else {\n            // No need to continue: other nodes will be rejected.\n            break;\n          }\n        }\n        continue;\n      }\n\n      if (value !== null) {\n        value[$resolvePrototypes](ids, ancestors);\n        if (protoValue) {\n          // protoValue must be treated as a prototype for value.\n          value[_applyPrototype](protoValue, ids, ancestors);\n        }\n        continue;\n      }\n\n      if (protoValue !== null) {\n        const child = protoValue[$clone]();\n        child[_parent] = this;\n        this[name] = child;\n        this[_children].push(child);\n        child[_resolvePrototypesHelper](ids, ancestors);\n      }\n    }\n  }\n\n  static [_cloneAttribute](obj) {\n    if (Array.isArray(obj)) {\n      return obj.map(x => XFAObject[_cloneAttribute](x));\n    }\n    if (typeof obj === \"object\" && obj !== null) {\n      return Object.assign({}, obj);\n    }\n    return obj;\n  }\n\n  [$clone]() {\n    const clone = Object.create(Object.getPrototypeOf(this));\n    for (const $symbol of Object.getOwnPropertySymbols(this)) {\n      try {\n        clone[$symbol] = this[$symbol];\n      } catch {\n        shadow(clone, $symbol, this[$symbol]);\n      }\n    }\n    clone[$uid] = `${clone[$nodeName]}${uid++}`;\n    clone[_children] = [];\n\n    for (const name of Object.getOwnPropertyNames(this)) {\n      if (this[_attributeNames].has(name)) {\n        clone[name] = XFAObject[_cloneAttribute](this[name]);\n        continue;\n      }\n      const value = this[name];\n      clone[name] =\n        value instanceof XFAObjectArray\n          ? new XFAObjectArray(value[_max])\n          : null;\n    }\n\n    for (const child of this[_children]) {\n      const name = child[$nodeName];\n      const clonedChild = child[$clone]();\n      clone[_children].push(clonedChild);\n      clonedChild[_parent] = clone;\n      if (clone[name] === null) {\n        clone[name] = clonedChild;\n      } else {\n        clone[name][_children].push(clonedChild);\n      }\n    }\n\n    return clone;\n  }\n\n  [$getChildren](name = null) {\n    if (!name) {\n      return this[_children];\n    }\n\n    return this[_children].filter(c => c[$nodeName] === name);\n  }\n\n  [$getChildrenByClass](name) {\n    return this[name];\n  }\n\n  [$getChildrenByName](name, allTransparent, first = true) {\n    return Array.from(this[$getChildrenByNameIt](name, allTransparent, first));\n  }\n\n  *[$getChildrenByNameIt](name, allTransparent, first = true) {\n    if (name === \"parent\") {\n      yield this[_parent];\n      return;\n    }\n\n    for (const child of this[_children]) {\n      if (child[$nodeName] === name) {\n        yield child;\n      }\n\n      if (child.name === name) {\n        yield child;\n      }\n\n      if (allTransparent || child[$isTransparent]()) {\n        yield* child[$getChildrenByNameIt](name, allTransparent, false);\n      }\n    }\n\n    if (first && this[_attributeNames].has(name)) {\n      yield new XFAAttribute(this, name, this[name]);\n    }\n  }\n}\n\nclass XFAObjectArray {\n  constructor(max = Infinity) {\n    this[_max] = max;\n    this[_children] = [];\n  }\n\n  get isXFAObject() {\n    return false;\n  }\n\n  get isXFAObjectArray() {\n    return true;\n  }\n\n  push(child) {\n    const len = this[_children].length;\n    if (len <= this[_max]) {\n      this[_children].push(child);\n      return true;\n    }\n    warn(\n      `XFA - node \"${child[$nodeName]}\" accepts no more than ${this[_max]} children`\n    );\n    return false;\n  }\n\n  isEmpty() {\n    return this[_children].length === 0;\n  }\n\n  dump() {\n    return this[_children].length === 1\n      ? this[_children][0][$dump]()\n      : this[_children].map(x => x[$dump]());\n  }\n\n  [$clone]() {\n    const clone = new XFAObjectArray(this[_max]);\n    clone[_children] = this[_children].map(c => c[$clone]());\n    return clone;\n  }\n\n  get children() {\n    return this[_children];\n  }\n\n  clear() {\n    this[_children].length = 0;\n  }\n}\n\nclass XFAAttribute {\n  constructor(node, name, value) {\n    this[_parent] = node;\n    this[$nodeName] = name;\n    this[$content] = value;\n    this[$consumed] = false;\n    this[$uid] = `attribute${uid++}`;\n  }\n\n  [$getParent]() {\n    return this[_parent];\n  }\n\n  [$isDataValue]() {\n    return true;\n  }\n\n  [$getDataValue]() {\n    return this[$content].trim();\n  }\n\n  [$setValue](value) {\n    value = value.value || \"\";\n    this[$content] = value.toString();\n  }\n\n  [$text]() {\n    return this[$content];\n  }\n\n  [$isDescendent](parent) {\n    return this[_parent] === parent || this[_parent][$isDescendent](parent);\n  }\n}\n\nclass XmlObject extends XFAObject {\n  constructor(nsId, name, attributes = {}) {\n    super(nsId, name);\n    this[$content] = \"\";\n    this[_dataValue] = null;\n    if (name !== \"#text\") {\n      const map = new Map();\n      this[_attributes] = map;\n      for (const [attrName, value] of Object.entries(attributes)) {\n        map.set(attrName, new XFAAttribute(this, attrName, value));\n      }\n      if (Object.hasOwn(attributes, $nsAttributes)) {\n        // XFA attributes.\n        const dataNode = attributes[$nsAttributes].xfa.dataNode;\n        if (dataNode !== undefined) {\n          if (dataNode === \"dataGroup\") {\n            this[_dataValue] = false;\n          } else if (dataNode === \"dataValue\") {\n            this[_dataValue] = true;\n          }\n        }\n      }\n    }\n    this[$consumed] = false;\n  }\n\n  [$toString](buf) {\n    const tagName = this[$nodeName];\n    if (tagName === \"#text\") {\n      buf.push(encodeToXmlString(this[$content]));\n      return;\n    }\n    const utf8TagName = utf8StringToString(tagName);\n    const prefix = this[$namespaceId] === NS_DATASETS ? \"xfa:\" : \"\";\n    buf.push(`<${prefix}${utf8TagName}`);\n    for (const [name, value] of this[_attributes]) {\n      const utf8Name = utf8StringToString(name);\n      buf.push(` ${utf8Name}=\"${encodeToXmlString(value[$content])}\"`);\n    }\n    if (this[_dataValue] !== null) {\n      if (this[_dataValue]) {\n        buf.push(` xfa:dataNode=\"dataValue\"`);\n      } else {\n        buf.push(` xfa:dataNode=\"dataGroup\"`);\n      }\n    }\n    if (!this[$content] && this[_children].length === 0) {\n      buf.push(\"/>\");\n      return;\n    }\n\n    buf.push(\">\");\n    if (this[$content]) {\n      if (typeof this[$content] === \"string\") {\n        buf.push(encodeToXmlString(this[$content]));\n      } else {\n        this[$content][$toString](buf);\n      }\n    } else {\n      for (const child of this[_children]) {\n        child[$toString](buf);\n      }\n    }\n    buf.push(`</${prefix}${utf8TagName}>`);\n  }\n\n  [$onChild](child) {\n    if (this[$content]) {\n      const node = new XmlObject(this[$namespaceId], \"#text\");\n      this[$appendChild](node);\n      node[$content] = this[$content];\n      this[$content] = \"\";\n    }\n    this[$appendChild](child);\n    return true;\n  }\n\n  [$onText](str) {\n    this[$content] += str;\n  }\n\n  [$finalize]() {\n    if (this[$content] && this[_children].length > 0) {\n      const node = new XmlObject(this[$namespaceId], \"#text\");\n      this[$appendChild](node);\n      node[$content] = this[$content];\n      delete this[$content];\n    }\n  }\n\n  [$toHTML]() {\n    if (this[$nodeName] === \"#text\") {\n      return HTMLResult.success({\n        name: \"#text\",\n        value: this[$content],\n      });\n    }\n\n    return HTMLResult.EMPTY;\n  }\n\n  [$getChildren](name = null) {\n    if (!name) {\n      return this[_children];\n    }\n\n    return this[_children].filter(c => c[$nodeName] === name);\n  }\n\n  [$getAttributes]() {\n    return this[_attributes];\n  }\n\n  [$getChildrenByClass](name) {\n    const value = this[_attributes].get(name);\n    if (value !== undefined) {\n      return value;\n    }\n    return this[$getChildren](name);\n  }\n\n  *[$getChildrenByNameIt](name, allTransparent) {\n    const value = this[_attributes].get(name);\n    if (value) {\n      yield value;\n    }\n\n    for (const child of this[_children]) {\n      if (child[$nodeName] === name) {\n        yield child;\n      }\n\n      if (allTransparent) {\n        yield* child[$getChildrenByNameIt](name, allTransparent);\n      }\n    }\n  }\n\n  *[$getAttributeIt](name, skipConsumed) {\n    const value = this[_attributes].get(name);\n    if (value && (!skipConsumed || !value[$consumed])) {\n      yield value;\n    }\n    for (const child of this[_children]) {\n      yield* child[$getAttributeIt](name, skipConsumed);\n    }\n  }\n\n  *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) {\n    for (const child of this[_children]) {\n      if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) {\n        yield child;\n      }\n\n      if (allTransparent) {\n        yield* child[$getRealChildrenByNameIt](\n          name,\n          allTransparent,\n          skipConsumed\n        );\n      }\n    }\n  }\n\n  [$isDataValue]() {\n    if (this[_dataValue] === null) {\n      return (\n        this[_children].length === 0 ||\n        this[_children][0][$namespaceId] === NamespaceIds.xhtml.id\n      );\n    }\n    return this[_dataValue];\n  }\n\n  [$getDataValue]() {\n    if (this[_dataValue] === null) {\n      if (this[_children].length === 0) {\n        return this[$content].trim();\n      }\n      if (this[_children][0][$namespaceId] === NamespaceIds.xhtml.id) {\n        return this[_children][0][$text]().trim();\n      }\n      return null;\n    }\n    return this[$content].trim();\n  }\n\n  [$setValue](value) {\n    value = value.value || \"\";\n    this[$content] = value.toString();\n  }\n\n  [$dump](hasNS = false) {\n    const dumped = Object.create(null);\n    if (hasNS) {\n      dumped.$ns = this[$namespaceId];\n    }\n    if (this[$content]) {\n      dumped.$content = this[$content];\n    }\n    dumped.$name = this[$nodeName];\n\n    dumped.children = [];\n    for (const child of this[_children]) {\n      dumped.children.push(child[$dump](hasNS));\n    }\n\n    dumped.attributes = Object.create(null);\n    for (const [name, value] of this[_attributes]) {\n      dumped.attributes[name] = value[$content];\n    }\n\n    return dumped;\n  }\n}\n\nclass ContentObject extends XFAObject {\n  constructor(nsId, name) {\n    super(nsId, name);\n    this[$content] = \"\";\n  }\n\n  [$onText](text) {\n    this[$content] += text;\n  }\n\n  [$finalize]() {}\n}\n\nclass OptionObject extends ContentObject {\n  constructor(nsId, name, options) {\n    super(nsId, name);\n    this[_options] = options;\n  }\n\n  [$finalize]() {\n    this[$content] = getKeyword({\n      data: this[$content],\n      defaultValue: this[_options][0],\n      validate: k => this[_options].includes(k),\n    });\n  }\n\n  [$clean](builder) {\n    super[$clean](builder);\n    delete this[_options];\n  }\n}\n\nclass StringObject extends ContentObject {\n  [$finalize]() {\n    this[$content] = this[$content].trim();\n  }\n}\n\nclass IntegerObject extends ContentObject {\n  constructor(nsId, name, defaultValue, validator) {\n    super(nsId, name);\n    this[_defaultValue] = defaultValue;\n    this[_validator] = validator;\n  }\n\n  [$finalize]() {\n    this[$content] = getInteger({\n      data: this[$content],\n      defaultValue: this[_defaultValue],\n      validate: this[_validator],\n    });\n  }\n\n  [$clean](builder) {\n    super[$clean](builder);\n    delete this[_defaultValue];\n    delete this[_validator];\n  }\n}\n\nclass Option01 extends IntegerObject {\n  constructor(nsId, name) {\n    super(nsId, name, 0, n => n === 1);\n  }\n}\n\nclass Option10 extends IntegerObject {\n  constructor(nsId, name) {\n    super(nsId, name, 1, n => n === 0);\n  }\n}\n\nexport {\n  ContentObject,\n  IntegerObject,\n  Option01,\n  Option10,\n  OptionObject,\n  StringObject,\n  XFAAttribute,\n  XFAObject,\n  XFAObjectArray,\n  XmlObject,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $content,\n  $extra,\n  $getParent,\n  $getSubformParent,\n  $getTemplateRoot,\n  $globalData,\n  $nodeName,\n  $pushGlyphs,\n  $text,\n  $toStyle,\n} from \"./symbol_utils.js\";\nimport { createValidAbsoluteUrl, warn } from \"../../shared/util.js\";\nimport { getMeasurement, stripQuotes } from \"./utils.js\";\nimport { selectFont } from \"./fonts.js\";\nimport { TextMeasure } from \"./text.js\";\nimport { XFAObject } from \"./xfa_object.js\";\n\nfunction measureToString(m) {\n  if (typeof m === \"string\") {\n    return \"0px\";\n  }\n\n  return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`;\n}\n\nconst converters = {\n  anchorType(node, style) {\n    const parent = node[$getSubformParent]();\n    if (!parent || (parent.layout && parent.layout !== \"position\")) {\n      // anchorType is only used in a positioned layout.\n      return;\n    }\n\n    if (!(\"transform\" in style)) {\n      style.transform = \"\";\n    }\n    switch (node.anchorType) {\n      case \"bottomCenter\":\n        style.transform += \"translate(-50%, -100%)\";\n        break;\n      case \"bottomLeft\":\n        style.transform += \"translate(0,-100%)\";\n        break;\n      case \"bottomRight\":\n        style.transform += \"translate(-100%,-100%)\";\n        break;\n      case \"middleCenter\":\n        style.transform += \"translate(-50%,-50%)\";\n        break;\n      case \"middleLeft\":\n        style.transform += \"translate(0,-50%)\";\n        break;\n      case \"middleRight\":\n        style.transform += \"translate(-100%,-50%)\";\n        break;\n      case \"topCenter\":\n        style.transform += \"translate(-50%,0)\";\n        break;\n      case \"topRight\":\n        style.transform += \"translate(-100%,0)\";\n        break;\n    }\n  },\n  dimensions(node, style) {\n    const parent = node[$getSubformParent]();\n    let width = node.w;\n    const height = node.h;\n    if (parent.layout?.includes(\"row\")) {\n      const extra = parent[$extra];\n      const colSpan = node.colSpan;\n      let w;\n      if (colSpan === -1) {\n        w = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn));\n        extra.currentColumn = 0;\n      } else {\n        w = Math.sumPrecise(\n          extra.columnWidths.slice(\n            extra.currentColumn,\n            extra.currentColumn + colSpan\n          )\n        );\n        extra.currentColumn =\n          (extra.currentColumn + node.colSpan) % extra.columnWidths.length;\n      }\n\n      if (!isNaN(w)) {\n        width = node.w = w;\n      }\n    }\n\n    style.width = width !== \"\" ? measureToString(width) : \"auto\";\n\n    style.height = height !== \"\" ? measureToString(height) : \"auto\";\n  },\n  position(node, style) {\n    const parent = node[$getSubformParent]();\n    if (parent?.layout && parent.layout !== \"position\") {\n      // IRL, we've some x/y in tb layout.\n      // Specs say x/y is only used in positioned layout.\n      return;\n    }\n\n    style.position = \"absolute\";\n    style.left = measureToString(node.x);\n    style.top = measureToString(node.y);\n  },\n  rotate(node, style) {\n    if (node.rotate) {\n      if (!(\"transform\" in style)) {\n        style.transform = \"\";\n      }\n      style.transform += `rotate(-${node.rotate}deg)`;\n      style.transformOrigin = \"top left\";\n    }\n  },\n  presence(node, style) {\n    switch (node.presence) {\n      case \"invisible\":\n        style.visibility = \"hidden\";\n        break;\n      case \"hidden\":\n      case \"inactive\":\n        style.display = \"none\";\n        break;\n    }\n  },\n  hAlign(node, style) {\n    if (node[$nodeName] === \"para\") {\n      switch (node.hAlign) {\n        case \"justifyAll\":\n          style.textAlign = \"justify-all\";\n          break;\n        case \"radix\":\n          // TODO: implement this correctly !\n          style.textAlign = \"left\";\n          break;\n        default:\n          style.textAlign = node.hAlign;\n      }\n    } else {\n      switch (node.hAlign) {\n        case \"left\":\n          style.alignSelf = \"start\";\n          break;\n        case \"center\":\n          style.alignSelf = \"center\";\n          break;\n        case \"right\":\n          style.alignSelf = \"end\";\n          break;\n      }\n    }\n  },\n  margin(node, style) {\n    if (node.margin) {\n      style.margin = node.margin[$toStyle]().margin;\n    }\n  },\n};\n\nfunction setMinMaxDimensions(node, style) {\n  const parent = node[$getSubformParent]();\n  if (parent.layout === \"position\") {\n    if (node.minW > 0) {\n      style.minWidth = measureToString(node.minW);\n    }\n    if (node.maxW > 0) {\n      style.maxWidth = measureToString(node.maxW);\n    }\n    if (node.minH > 0) {\n      style.minHeight = measureToString(node.minH);\n    }\n    if (node.maxH > 0) {\n      style.maxHeight = measureToString(node.maxH);\n    }\n  }\n}\n\nfunction layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) {\n  const measure = new TextMeasure(xfaFont, margin, lineHeight, fontFinder);\n  if (typeof text === \"string\") {\n    measure.addString(text);\n  } else {\n    text[$pushGlyphs](measure);\n  }\n\n  return measure.compute(width);\n}\n\nfunction layoutNode(node, availableSpace) {\n  let height = null;\n  let width = null;\n  let isBroken = false;\n\n  if ((!node.w || !node.h) && node.value) {\n    let marginH = 0;\n    let marginV = 0;\n    if (node.margin) {\n      marginH = node.margin.leftInset + node.margin.rightInset;\n      marginV = node.margin.topInset + node.margin.bottomInset;\n    }\n\n    let lineHeight = null;\n    let margin = null;\n    if (node.para) {\n      margin = Object.create(null);\n      lineHeight = node.para.lineHeight === \"\" ? null : node.para.lineHeight;\n      margin.top = node.para.spaceAbove === \"\" ? 0 : node.para.spaceAbove;\n      margin.bottom = node.para.spaceBelow === \"\" ? 0 : node.para.spaceBelow;\n      margin.left = node.para.marginLeft === \"\" ? 0 : node.para.marginLeft;\n      margin.right = node.para.marginRight === \"\" ? 0 : node.para.marginRight;\n    }\n\n    let font = node.font;\n    if (!font) {\n      const root = node[$getTemplateRoot]();\n      let parent = node[$getParent]();\n      while (parent && parent !== root) {\n        if (parent.font) {\n          font = parent.font;\n          break;\n        }\n        parent = parent[$getParent]();\n      }\n    }\n\n    const maxWidth = (node.w || availableSpace.width) - marginH;\n    const fontFinder = node[$globalData].fontFinder;\n    if (\n      node.value.exData &&\n      node.value.exData[$content] &&\n      node.value.exData.contentType === \"text/html\"\n    ) {\n      const res = layoutText(\n        node.value.exData[$content],\n        font,\n        margin,\n        lineHeight,\n        fontFinder,\n        maxWidth\n      );\n      width = res.width;\n      height = res.height;\n      isBroken = res.isBroken;\n    } else {\n      const text = node.value[$text]();\n      if (text) {\n        const res = layoutText(\n          text,\n          font,\n          margin,\n          lineHeight,\n          fontFinder,\n          maxWidth\n        );\n        width = res.width;\n        height = res.height;\n        isBroken = res.isBroken;\n      }\n    }\n\n    if (width !== null && !node.w) {\n      width += marginH;\n    }\n\n    if (height !== null && !node.h) {\n      height += marginV;\n    }\n  }\n  return { w: width, h: height, isBroken };\n}\n\nfunction computeBbox(node, html, availableSpace) {\n  let bbox;\n  if (node.w !== \"\" && node.h !== \"\") {\n    bbox = [node.x, node.y, node.w, node.h];\n  } else {\n    if (!availableSpace) {\n      return null;\n    }\n    let width = node.w;\n    if (width === \"\") {\n      if (node.maxW === 0) {\n        const parent = node[$getSubformParent]();\n        width = parent.layout === \"position\" && parent.w !== \"\" ? 0 : node.minW;\n      } else {\n        width = Math.min(node.maxW, availableSpace.width);\n      }\n      html.attributes.style.width = measureToString(width);\n    }\n\n    let height = node.h;\n    if (height === \"\") {\n      if (node.maxH === 0) {\n        const parent = node[$getSubformParent]();\n        height =\n          parent.layout === \"position\" && parent.h !== \"\" ? 0 : node.minH;\n      } else {\n        height = Math.min(node.maxH, availableSpace.height);\n      }\n      html.attributes.style.height = measureToString(height);\n    }\n\n    bbox = [node.x, node.y, width, height];\n  }\n  return bbox;\n}\n\nfunction fixDimensions(node) {\n  const parent = node[$getSubformParent]();\n  if (parent.layout?.includes(\"row\")) {\n    const extra = parent[$extra];\n    const colSpan = node.colSpan;\n    let width;\n    if (colSpan === -1) {\n      width = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn));\n    } else {\n      width = Math.sumPrecise(\n        extra.columnWidths.slice(\n          extra.currentColumn,\n          extra.currentColumn + colSpan\n        )\n      );\n    }\n    if (!isNaN(width)) {\n      node.w = width;\n    }\n  }\n\n  if (parent.layout && parent.layout !== \"position\") {\n    // Useless in this context.\n    node.x = node.y = 0;\n  }\n\n  if (node.layout === \"table\") {\n    if (node.w === \"\" && Array.isArray(node.columnWidths)) {\n      node.w = Math.sumPrecise(node.columnWidths);\n    }\n  }\n}\n\nfunction layoutClass(node) {\n  switch (node.layout) {\n    case \"position\":\n      return \"xfaPosition\";\n    case \"lr-tb\":\n      return \"xfaLrTb\";\n    case \"rl-row\":\n      return \"xfaRlRow\";\n    case \"rl-tb\":\n      return \"xfaRlTb\";\n    case \"row\":\n      return \"xfaRow\";\n    case \"table\":\n      return \"xfaTable\";\n    case \"tb\":\n      return \"xfaTb\";\n    default:\n      return \"xfaPosition\";\n  }\n}\n\nfunction toStyle(node, ...names) {\n  const style = Object.create(null);\n  for (const name of names) {\n    const value = node[name];\n    if (value === null) {\n      continue;\n    }\n    if (Object.hasOwn(converters, name)) {\n      converters[name](node, style);\n      continue;\n    }\n\n    if (value instanceof XFAObject) {\n      const newStyle = value[$toStyle]();\n      if (newStyle) {\n        Object.assign(style, newStyle);\n      } else {\n        warn(`(DEBUG) - XFA - style for ${name} not implemented yet`);\n      }\n    }\n  }\n  return style;\n}\n\nfunction createWrapper(node, html) {\n  const { attributes } = html;\n  const { style } = attributes;\n\n  const wrapper = {\n    name: \"div\",\n    attributes: {\n      class: [\"xfaWrapper\"],\n      style: Object.create(null),\n    },\n    children: [],\n  };\n\n  attributes.class.push(\"xfaWrapped\");\n\n  if (node.border) {\n    const { widths, insets } = node.border[$extra];\n    let width, height;\n    let top = insets[0];\n    let left = insets[3];\n    const insetsH = insets[0] + insets[2];\n    const insetsW = insets[1] + insets[3];\n    switch (node.border.hand) {\n      case \"even\":\n        top -= widths[0] / 2;\n        left -= widths[3] / 2;\n        width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`;\n        height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`;\n        break;\n      case \"left\":\n        top -= widths[0];\n        left -= widths[3];\n        width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`;\n        height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`;\n        break;\n      case \"right\":\n        width = insetsW ? `calc(100% - ${insetsW}px)` : \"100%\";\n        height = insetsH ? `calc(100% - ${insetsH}px)` : \"100%\";\n        break;\n    }\n    const classNames = [\"xfaBorder\"];\n    if (isPrintOnly(node.border)) {\n      classNames.push(\"xfaPrintOnly\");\n    }\n\n    const border = {\n      name: \"div\",\n      attributes: {\n        class: classNames,\n        style: {\n          top: `${top}px`,\n          left: `${left}px`,\n          width,\n          height,\n        },\n      },\n      children: [],\n    };\n\n    for (const key of [\n      \"border\",\n      \"borderWidth\",\n      \"borderColor\",\n      \"borderRadius\",\n      \"borderStyle\",\n    ]) {\n      if (style[key] !== undefined) {\n        border.attributes.style[key] = style[key];\n        delete style[key];\n      }\n    }\n    wrapper.children.push(border, html);\n  } else {\n    wrapper.children.push(html);\n  }\n\n  for (const key of [\n    \"background\",\n    \"backgroundClip\",\n    \"top\",\n    \"left\",\n    \"width\",\n    \"height\",\n    \"minWidth\",\n    \"minHeight\",\n    \"maxWidth\",\n    \"maxHeight\",\n    \"transform\",\n    \"transformOrigin\",\n    \"visibility\",\n  ]) {\n    if (style[key] !== undefined) {\n      wrapper.attributes.style[key] = style[key];\n      delete style[key];\n    }\n  }\n\n  wrapper.attributes.style.position =\n    style.position === \"absolute\" ? \"absolute\" : \"relative\";\n  delete style.position;\n\n  if (style.alignSelf) {\n    wrapper.attributes.style.alignSelf = style.alignSelf;\n    delete style.alignSelf;\n  }\n\n  return wrapper;\n}\n\nfunction fixTextIndent(styles) {\n  const indent = getMeasurement(styles.textIndent, \"0px\");\n  if (indent >= 0) {\n    return;\n  }\n\n  // If indent is negative then it's a hanging indent.\n  const align = styles.textAlign === \"right\" ? \"right\" : \"left\";\n  const name = \"padding\" + (align === \"left\" ? \"Left\" : \"Right\");\n  const padding = getMeasurement(styles[name], \"0px\");\n  styles[name] = `${padding - indent}px`;\n}\n\nfunction setAccess(node, classNames) {\n  switch (node.access) {\n    case \"nonInteractive\":\n      classNames.push(\"xfaNonInteractive\");\n      break;\n    case \"readOnly\":\n      classNames.push(\"xfaReadOnly\");\n      break;\n    case \"protected\":\n      classNames.push(\"xfaDisabled\");\n      break;\n  }\n}\n\nfunction isPrintOnly(node) {\n  return (\n    node.relevant.length > 0 &&\n    !node.relevant[0].excluded &&\n    node.relevant[0].viewname === \"print\"\n  );\n}\n\nfunction getCurrentPara(node) {\n  const stack = node[$getTemplateRoot]()[$extra].paraStack;\n  return stack.length ? stack.at(-1) : null;\n}\n\nfunction setPara(node, nodeStyle, value) {\n  if (value.attributes.class?.includes(\"xfaRich\")) {\n    if (nodeStyle) {\n      if (node.h === \"\") {\n        nodeStyle.height = \"auto\";\n      }\n      if (node.w === \"\") {\n        nodeStyle.width = \"auto\";\n      }\n    }\n\n    const para = getCurrentPara(node);\n    if (para) {\n      // By definition exData are external data so para\n      // has no effect on it.\n      const valueStyle = value.attributes.style;\n      valueStyle.display = \"flex\";\n      valueStyle.flexDirection = \"column\";\n      switch (para.vAlign) {\n        case \"top\":\n          valueStyle.justifyContent = \"start\";\n          break;\n        case \"bottom\":\n          valueStyle.justifyContent = \"end\";\n          break;\n        case \"middle\":\n          valueStyle.justifyContent = \"center\";\n          break;\n      }\n\n      const paraStyle = para[$toStyle]();\n      for (const [key, val] of Object.entries(paraStyle)) {\n        if (!(key in valueStyle)) {\n          valueStyle[key] = val;\n        }\n      }\n    }\n  }\n}\n\nfunction setFontFamily(xfaFont, node, fontFinder, style) {\n  if (!fontFinder) {\n    // The font cannot be found in the pdf so use the default one.\n    delete style.fontFamily;\n    return;\n  }\n\n  const name = stripQuotes(xfaFont.typeface);\n  style.fontFamily = `\"${name}\"`;\n\n  const typeface = fontFinder.find(name);\n  if (typeface) {\n    const { fontFamily } = typeface.regular.cssFontInfo;\n    if (fontFamily !== name) {\n      style.fontFamily = `\"${fontFamily}\"`;\n    }\n\n    const para = getCurrentPara(node);\n    if (para && para.lineHeight !== \"\") {\n      return;\n    }\n\n    if (style.lineHeight) {\n      // Already something so don't overwrite.\n      return;\n    }\n\n    const pdfFont = selectFont(xfaFont, typeface);\n    if (pdfFont) {\n      style.lineHeight = Math.max(1.2, pdfFont.lineHeight);\n    }\n  }\n}\n\nfunction fixURL(str) {\n  const absoluteUrl = createValidAbsoluteUrl(str, /* baseUrl = */ null, {\n    addDefaultProtocol: true,\n    tryConvertEncoding: true,\n  });\n  return absoluteUrl ? absoluteUrl.href : null;\n}\n\nexport {\n  computeBbox,\n  createWrapper,\n  fixDimensions,\n  fixTextIndent,\n  fixURL,\n  isPrintOnly,\n  layoutClass,\n  layoutNode,\n  measureToString,\n  setAccess,\n  setFontFamily,\n  setMinMaxDimensions,\n  setPara,\n  toStyle,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $extra,\n  $flushHTML,\n  $getSubformParent,\n  $getTemplateRoot,\n  $isSplittable,\n  $isThereMoreWidth,\n} from \"./symbol_utils.js\";\nimport { MathClamp } from \"../../shared/math_clamp.js\";\nimport { measureToString } from \"./html_utils.js\";\n\n// Subform and ExclGroup have a layout so they share these functions.\n\n/**\n * How layout works ?\n *\n * A container has an initial space (with a width and a height) to fit in,\n * which means that once all the children have been added then\n * the total width/height must be lower than the given ones in\n * the initial space.\n * So if the container has known dimensions and these ones are ok with the\n * space then continue else we return HTMLResult.FAILURE: it's up to the\n * parent to deal with this failure (e.g. if parent layout is lr-tb and\n * we fail to add a child at end of line (lr) then we try to add it on the\n * next line).\n * And then we run through the children, each child gets its initial space\n * in calling its parent $getAvailableSpace method\n * (see _filteredChildrenGenerator and $childrenToHTML in xfa_object.js)\n * then we try to layout child in its space. If everything is ok then we add\n * the result to its parent through $addHTML which will recompute the available\n * space in parent according to its layout property else we return\n * HTMLResult.Failure.\n * Before a failure some children may have been layed out: they've been saved in\n * [$extra].children and [$extra] has properties generator and failingNode\n * in order to save the state where we were before a failure.\n * This [$extra].children property is useful when a container has to be splited.\n * So if a container is unbreakable, we must delete its [$extra] property before\n * returning.\n */\n\nfunction createLine(node, children) {\n  return {\n    name: \"div\",\n    attributes: {\n      class: [node.layout === \"lr-tb\" ? \"xfaLr\" : \"xfaRl\"],\n    },\n    children,\n  };\n}\n\nfunction flushHTML(node) {\n  if (!node[$extra]) {\n    return null;\n  }\n\n  const attributes = node[$extra].attributes;\n  const html = {\n    name: \"div\",\n    attributes,\n    children: node[$extra].children,\n  };\n\n  if (node[$extra].failingNode) {\n    const htmlFromFailing = node[$extra].failingNode[$flushHTML]();\n    if (htmlFromFailing) {\n      if (node.layout.endsWith(\"-tb\")) {\n        html.children.push(createLine(node, [htmlFromFailing]));\n      } else {\n        html.children.push(htmlFromFailing);\n      }\n    }\n  }\n\n  if (html.children.length === 0) {\n    return null;\n  }\n\n  return html;\n}\n\nfunction addHTML(node, html, bbox) {\n  const extra = node[$extra];\n  const availableSpace = extra.availableSpace;\n\n  const [x, y, w, h] = bbox;\n  switch (node.layout) {\n    case \"position\": {\n      extra.width = Math.max(extra.width, x + w);\n      extra.height = Math.max(extra.height, y + h);\n      extra.children.push(html);\n      break;\n    }\n    case \"lr-tb\":\n    case \"rl-tb\":\n      if (!extra.line || extra.attempt === 1) {\n        extra.line = createLine(node, []);\n        extra.children.push(extra.line);\n        extra.numberInLine = 0;\n      }\n\n      extra.numberInLine += 1;\n      extra.line.children.push(html);\n\n      if (extra.attempt === 0) {\n        // Add the element on the line\n        extra.currentWidth += w;\n        extra.height = Math.max(extra.height, extra.prevHeight + h);\n      } else {\n        extra.currentWidth = w;\n        extra.prevHeight = extra.height;\n        extra.height += h;\n\n        // The element has been added on a new line so switch to line mode now.\n        extra.attempt = 0;\n      }\n      extra.width = Math.max(extra.width, extra.currentWidth);\n      break;\n    case \"rl-row\":\n    case \"row\": {\n      extra.children.push(html);\n      extra.width += w;\n      extra.height = Math.max(extra.height, h);\n      const height = measureToString(extra.height);\n      for (const child of extra.children) {\n        child.attributes.style.height = height;\n      }\n      break;\n    }\n    case \"table\": {\n      extra.width = MathClamp(w, extra.width, availableSpace.width);\n      extra.height += h;\n      extra.children.push(html);\n      break;\n    }\n    case \"tb\": {\n      // Even if the subform can possibly take all the available width,\n      // we must compute the final width as it is in order to be able\n      // for example to center the subform within its parent.\n      extra.width = MathClamp(w, extra.width, availableSpace.width);\n      extra.height += h;\n      extra.children.push(html);\n      break;\n    }\n  }\n}\n\nfunction getAvailableSpace(node) {\n  const availableSpace = node[$extra].availableSpace;\n  const marginV = node.margin\n    ? node.margin.topInset + node.margin.bottomInset\n    : 0;\n  const marginH = node.margin\n    ? node.margin.leftInset + node.margin.rightInset\n    : 0;\n\n  switch (node.layout) {\n    case \"lr-tb\":\n    case \"rl-tb\":\n      if (node[$extra].attempt === 0) {\n        return {\n          width: availableSpace.width - marginH - node[$extra].currentWidth,\n          height: availableSpace.height - marginV - node[$extra].prevHeight,\n        };\n      }\n      return {\n        width: availableSpace.width - marginH,\n        height: availableSpace.height - marginV - node[$extra].height,\n      };\n    case \"rl-row\":\n    case \"row\":\n      const width = Math.sumPrecise(\n        node[$extra].columnWidths.slice(node[$extra].currentColumn)\n      );\n      return { width, height: availableSpace.height - marginH };\n    case \"table\":\n    case \"tb\":\n      return {\n        width: availableSpace.width - marginH,\n        height: availableSpace.height - marginV - node[$extra].height,\n      };\n    case \"position\":\n    default:\n      return availableSpace;\n  }\n}\n\nfunction getTransformedBBox(node) {\n  // Take into account rotation and anchor to get the real bounding box.\n  let w = node.w === \"\" ? NaN : node.w;\n  let h = node.h === \"\" ? NaN : node.h;\n  let [centerX, centerY] = [0, 0];\n  switch (node.anchorType || \"\") {\n    case \"bottomCenter\":\n      [centerX, centerY] = [w / 2, h];\n      break;\n    case \"bottomLeft\":\n      [centerX, centerY] = [0, h];\n      break;\n    case \"bottomRight\":\n      [centerX, centerY] = [w, h];\n      break;\n    case \"middleCenter\":\n      [centerX, centerY] = [w / 2, h / 2];\n      break;\n    case \"middleLeft\":\n      [centerX, centerY] = [0, h / 2];\n      break;\n    case \"middleRight\":\n      [centerX, centerY] = [w, h / 2];\n      break;\n    case \"topCenter\":\n      [centerX, centerY] = [w / 2, 0];\n      break;\n    case \"topRight\":\n      [centerX, centerY] = [w, 0];\n      break;\n  }\n\n  let x, y;\n  switch (node.rotate || 0) {\n    case 0:\n      [x, y] = [-centerX, -centerY];\n      break;\n    case 90:\n      [x, y] = [-centerY, centerX];\n      [w, h] = [h, -w];\n      break;\n    case 180:\n      [x, y] = [centerX, centerY];\n      [w, h] = [-w, -h];\n      break;\n    case 270:\n      [x, y] = [centerY, -centerX];\n      [w, h] = [-h, w];\n      break;\n  }\n\n  return [\n    node.x + x + Math.min(0, w),\n    node.y + y + Math.min(0, h),\n    Math.abs(w),\n    Math.abs(h),\n  ];\n}\n\n/**\n * Returning true means that the node will be layed out\n * else the layout will go to its next step (changing of line\n * in case of lr-tb or changing content area...).\n */\nfunction checkDimensions(node, space) {\n  if (node[$getTemplateRoot]()[$extra].firstUnsplittable === null) {\n    return true;\n  }\n\n  if (node.w === 0 || node.h === 0) {\n    return true;\n  }\n\n  const ERROR = 2;\n  const parent = node[$getSubformParent]();\n  const attempt = parent[$extra]?.attempt || 0;\n\n  const [, y, w, h] = getTransformedBBox(node);\n  switch (parent.layout) {\n    case \"lr-tb\":\n    case \"rl-tb\":\n      if (attempt === 0) {\n        // Try to put an element in the line.\n\n        if (!node[$getTemplateRoot]()[$extra].noLayoutFailure) {\n          if (node.h !== \"\" && Math.round(h - space.height) > ERROR) {\n            // Not enough height.\n            return false;\n          }\n\n          if (node.w !== \"\") {\n            if (Math.round(w - space.width) <= ERROR) {\n              return true;\n            }\n            if (parent[$extra].numberInLine === 0) {\n              return space.height > ERROR;\n            }\n\n            return false;\n          }\n\n          return space.width > ERROR;\n        }\n\n        // No layout failure.\n\n        // Put the element on the line but we can fail\n        // and then in the second step (next line) we'll accept.\n        if (node.w !== \"\") {\n          return Math.round(w - space.width) <= ERROR;\n        }\n\n        return space.width > ERROR;\n      }\n\n      // Second attempt: try to put the element on the next line.\n\n      if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {\n        // We cannot fail.\n        return true;\n      }\n\n      if (node.h !== \"\" && Math.round(h - space.height) > ERROR) {\n        return false;\n      }\n\n      if (node.w === \"\" || Math.round(w - space.width) <= ERROR) {\n        return space.height > ERROR;\n      }\n\n      if (parent[$isThereMoreWidth]()) {\n        return false;\n      }\n\n      return space.height > ERROR;\n    case \"table\":\n    case \"tb\":\n      if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {\n        return true;\n      }\n\n      // If the node has a height then check if it's fine with available height.\n      // If the node is breakable then we can return true.\n      if (node.h !== \"\" && !node[$isSplittable]()) {\n        return Math.round(h - space.height) <= ERROR;\n      }\n      // Else wait and see: this node will be layed out itself\n      // in the provided space and maybe a children won't fit.\n\n      if (node.w === \"\" || Math.round(w - space.width) <= ERROR) {\n        return space.height > ERROR;\n      }\n\n      if (parent[$isThereMoreWidth]()) {\n        return false;\n      }\n\n      return space.height > ERROR;\n    case \"position\":\n      if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {\n        return true;\n      }\n\n      if (node.h === \"\" || Math.round(h + y - space.height) <= ERROR) {\n        return true;\n      }\n\n      const area = node[$getTemplateRoot]()[$extra].currentContentArea;\n      return h + y > area.h;\n    case \"rl-row\":\n    case \"row\":\n      if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {\n        return true;\n      }\n\n      if (node.h !== \"\") {\n        return Math.round(h - space.height) <= ERROR;\n      }\n      return true;\n    default:\n      // No layout, so accept everything.\n      return true;\n  }\n}\n\nexport { addHTML, checkDimensions, flushHTML, getAvailableSpace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $acceptWhitespace,\n  $addHTML,\n  $appendChild,\n  $childrenToHTML,\n  $clean,\n  $cleanPage,\n  $content,\n  $data,\n  $extra,\n  $finalize,\n  $flushHTML,\n  $getAvailableSpace,\n  $getChildren,\n  $getContainedChildren,\n  $getExtra,\n  $getNextPage,\n  $getParent,\n  $getSubformParent,\n  $getTemplateRoot,\n  $globalData,\n  $hasSettableValue,\n  $ids,\n  $isBindable,\n  $isCDATAXml,\n  $isSplittable,\n  $isThereMoreWidth,\n  $isTransparent,\n  $isUsable,\n  $namespaceId,\n  $nodeName,\n  $onChild,\n  $onText,\n  $popPara,\n  $pushPara,\n  $removeChild,\n  $searchNode,\n  $setSetAttributes,\n  $setValue,\n  $tabIndex,\n  $text,\n  $toHTML,\n  $toPages,\n  $toStyle,\n  $uid,\n} from \"./symbol_utils.js\";\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport {\n  addHTML,\n  checkDimensions,\n  flushHTML,\n  getAvailableSpace,\n} from \"./layout.js\";\nimport {\n  computeBbox,\n  createWrapper,\n  fixDimensions,\n  fixTextIndent,\n  fixURL,\n  isPrintOnly,\n  layoutClass,\n  layoutNode,\n  measureToString,\n  setAccess,\n  setFontFamily,\n  setMinMaxDimensions,\n  setPara,\n  toStyle,\n} from \"./html_utils.js\";\nimport {\n  ContentObject,\n  Option01,\n  OptionObject,\n  StringObject,\n  XFAObject,\n  XFAObjectArray,\n} from \"./xfa_object.js\";\nimport {\n  getBBox,\n  getColor,\n  getFloat,\n  getInteger,\n  getKeyword,\n  getMeasurement,\n  getRatio,\n  getRelevant,\n  getStringOption,\n  HTMLResult,\n} from \"./utils.js\";\nimport { SVG_NS, Util, warn } from \"../../shared/util.js\";\nimport { getMetrics } from \"./fonts.js\";\nimport { recoverJsURL } from \"../core_utils.js\";\nimport { searchNode } from \"./som.js\";\n\nconst TEMPLATE_NS_ID = NamespaceIds.template.id;\n\n// In case of lr-tb (and rl-tb) layouts, we try:\n//  - to put the container at the end of a line\n//  - and if it fails we try on the next line.\n// If both tries failed then it's up to the parent\n// to handle the situation.\nconst MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2;\n\n// It's possible to have a bug in the layout and so as\n// a consequence we could loop for ever in Template::toHTML()\n// so in order to avoid that (and avoid a OOM crash) we break\n// the loop after having MAX_EMPTY_PAGES empty pages.\nconst MAX_EMPTY_PAGES = 3;\n\n// Default value to start with for the tabIndex property.\nconst DEFAULT_TAB_INDEX = 5000;\n\nconst HEADING_PATTERN = /^H(\\d+)$/;\n\n// Allowed mime types for images\nconst MIMES = new Set([\n  \"image/gif\",\n  \"image/jpeg\",\n  \"image/jpg\",\n  \"image/pjpeg\",\n  \"image/png\",\n  \"image/apng\",\n  \"image/x-png\",\n  \"image/bmp\",\n  \"image/x-ms-bmp\",\n  \"image/tiff\",\n  \"image/tif\",\n  \"application/octet-stream\",\n]);\n\nconst IMAGES_HEADERS = [\n  [[0x42, 0x4d], \"image/bmp\"],\n  [[0xff, 0xd8, 0xff], \"image/jpeg\"],\n  [[0x49, 0x49, 0x2a, 0x00], \"image/tiff\"],\n  [[0x4d, 0x4d, 0x00, 0x2a], \"image/tiff\"],\n  [[0x47, 0x49, 0x46, 0x38, 0x39, 0x61], \"image/gif\"],\n  [[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], \"image/png\"],\n];\n\nfunction getBorderDims(node) {\n  if (!node || !node.border) {\n    return { w: 0, h: 0 };\n  }\n\n  const borderExtra = node.border[$getExtra]();\n  if (!borderExtra) {\n    return { w: 0, h: 0 };\n  }\n\n  return {\n    w:\n      borderExtra.widths[0] +\n      borderExtra.widths[2] +\n      borderExtra.insets[0] +\n      borderExtra.insets[2],\n    h:\n      borderExtra.widths[1] +\n      borderExtra.widths[3] +\n      borderExtra.insets[1] +\n      borderExtra.insets[3],\n  };\n}\n\nfunction hasMargin(node) {\n  return (\n    node.margin &&\n    (node.margin.topInset ||\n      node.margin.rightInset ||\n      node.margin.bottomInset ||\n      node.margin.leftInset)\n  );\n}\n\nfunction _setValue(templateNode, value) {\n  if (!templateNode.value) {\n    const nodeValue = new Value({});\n    templateNode[$appendChild](nodeValue);\n    templateNode.value = nodeValue;\n  }\n  templateNode.value[$setValue](value);\n}\n\nfunction* getContainedChildren(node) {\n  for (const child of node[$getChildren]()) {\n    if (child instanceof SubformSet) {\n      yield* child[$getContainedChildren]();\n      continue;\n    }\n    yield child;\n  }\n}\n\nfunction isRequired(node) {\n  return node.validate?.nullTest === \"error\";\n}\n\nfunction setTabIndex(node) {\n  while (node) {\n    if (!node.traversal) {\n      node[$tabIndex] = node[$getParent]()[$tabIndex];\n      return;\n    }\n\n    if (node[$tabIndex]) {\n      return;\n    }\n\n    let next = null;\n    for (const child of node.traversal[$getChildren]()) {\n      if (child.operation === \"next\") {\n        next = child;\n        break;\n      }\n    }\n\n    if (!next || !next.ref) {\n      node[$tabIndex] = node[$getParent]()[$tabIndex];\n      return;\n    }\n\n    const root = node[$getTemplateRoot]();\n    node[$tabIndex] = ++root[$tabIndex];\n\n    const ref = root[$searchNode](next.ref, node);\n    if (!ref) {\n      return;\n    }\n\n    node = ref[0];\n  }\n}\n\nfunction applyAssist(obj, attributes) {\n  const assist = obj.assist;\n  if (assist) {\n    const assistTitle = assist[$toHTML]();\n    if (assistTitle) {\n      attributes.title = assistTitle;\n    }\n    const role = assist.role;\n    const match = role.match(HEADING_PATTERN);\n    if (match) {\n      const ariaRole = \"heading\";\n      const ariaLevel = match[1];\n      attributes.role = ariaRole;\n      attributes[\"aria-level\"] = ariaLevel;\n    }\n  }\n  // XXX: We could end up in a situation where the obj has a heading role and\n  // is also a table. For now prioritize the table role.\n  if (obj.layout === \"table\") {\n    attributes.role = \"table\";\n  } else if (obj.layout === \"row\") {\n    attributes.role = \"row\";\n  } else {\n    const parent = obj[$getParent]();\n    if (parent.layout === \"row\") {\n      attributes.role = parent.assist?.role === \"TH\" ? \"columnheader\" : \"cell\";\n    }\n  }\n}\n\nfunction ariaLabel(obj) {\n  if (!obj.assist) {\n    return null;\n  }\n  const assist = obj.assist;\n  if (assist.speak && assist.speak[$content] !== \"\") {\n    return assist.speak[$content];\n  }\n  if (assist.toolTip) {\n    return assist.toolTip[$content];\n  }\n  // TODO: support finding the related caption element. See xfa_bug1718037.pdf\n  // for an example.\n  return null;\n}\n\nfunction valueToHtml(value) {\n  return HTMLResult.success({\n    name: \"div\",\n    attributes: {\n      class: [\"xfaRich\"],\n      style: Object.create(null),\n    },\n    children: [\n      {\n        name: \"span\",\n        attributes: {\n          style: Object.create(null),\n        },\n        value,\n      },\n    ],\n  });\n}\n\nfunction setFirstUnsplittable(node) {\n  const root = node[$getTemplateRoot]();\n  if (root[$extra].firstUnsplittable === null) {\n    root[$extra].firstUnsplittable = node;\n    root[$extra].noLayoutFailure = true;\n  }\n}\n\nfunction unsetFirstUnsplittable(node) {\n  const root = node[$getTemplateRoot]();\n  if (root[$extra].firstUnsplittable === node) {\n    root[$extra].noLayoutFailure = false;\n  }\n}\n\nfunction handleBreak(node) {\n  if (node[$extra]) {\n    return false;\n  }\n\n  node[$extra] = Object.create(null);\n\n  if (node.targetType === \"auto\") {\n    return false;\n  }\n\n  const root = node[$getTemplateRoot]();\n  let target = null;\n  if (node.target) {\n    target = root[$searchNode](node.target, node[$getParent]());\n    if (!target) {\n      return false;\n    }\n    target = target[0];\n  }\n\n  const { currentPageArea, currentContentArea } = root[$extra];\n\n  if (node.targetType === \"pageArea\") {\n    if (!(target instanceof PageArea)) {\n      target = null;\n    }\n\n    if (node.startNew) {\n      node[$extra].target = target || currentPageArea;\n      return true;\n    } else if (target && target !== currentPageArea) {\n      node[$extra].target = target;\n      return true;\n    }\n\n    return false;\n  }\n\n  if (!(target instanceof ContentArea)) {\n    target = null;\n  }\n\n  const pageArea = target && target[$getParent]();\n\n  let index;\n  let nextPageArea = pageArea;\n  if (node.startNew) {\n    // startNew === 1 so we must create a new container (pageArea or\n    // contentArea).\n    if (target) {\n      const contentAreas = pageArea.contentArea.children;\n      const indexForCurrent = contentAreas.indexOf(currentContentArea);\n      const indexForTarget = contentAreas.indexOf(target);\n      if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) {\n        // The next container is after the current container so\n        // we can stay on the same page.\n        nextPageArea = null;\n      }\n      index = indexForTarget - 1;\n    } else {\n      index = currentPageArea.contentArea.children.indexOf(currentContentArea);\n    }\n  } else if (target && target !== currentContentArea) {\n    const contentAreas = pageArea.contentArea.children;\n    index = contentAreas.indexOf(target) - 1;\n    nextPageArea = pageArea === currentPageArea ? null : pageArea;\n  } else {\n    return false;\n  }\n\n  node[$extra].target = nextPageArea;\n  node[$extra].index = index;\n  return true;\n}\n\nfunction handleOverflow(node, extraNode, space) {\n  const root = node[$getTemplateRoot]();\n  const saved = root[$extra].noLayoutFailure;\n  const savedMethod = extraNode[$getSubformParent];\n\n  // Replace $getSubformParent to emulate that extraNode is just\n  // under node.\n  extraNode[$getSubformParent] = () => node;\n\n  root[$extra].noLayoutFailure = true;\n  const res = extraNode[$toHTML](space);\n  node[$addHTML](res.html, res.bbox);\n  root[$extra].noLayoutFailure = saved;\n  extraNode[$getSubformParent] = savedMethod;\n}\n\nclass AppearanceFilter extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"appearanceFilter\");\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Arc extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"arc\", /* hasChildren = */ true);\n    this.circular = getInteger({\n      data: attributes.circular,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.hand = getStringOption(attributes.hand, [\"even\", \"left\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.startAngle = getFloat({\n      data: attributes.startAngle,\n      defaultValue: 0,\n      validate: x => true,\n    });\n    this.sweepAngle = getFloat({\n      data: attributes.sweepAngle,\n      defaultValue: 360,\n      validate: x => true,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.edge = null;\n    this.fill = null;\n  }\n\n  [$toHTML]() {\n    const edge = this.edge || new Edge({});\n    const edgeStyle = edge[$toStyle]();\n    const style = Object.create(null);\n    if (this.fill?.presence === \"visible\") {\n      Object.assign(style, this.fill[$toStyle]());\n    } else {\n      style.fill = \"transparent\";\n    }\n    style.strokeWidth = measureToString(\n      edge.presence === \"visible\" ? edge.thickness : 0\n    );\n    style.stroke = edgeStyle.color;\n    let arc;\n    const attributes = {\n      xmlns: SVG_NS,\n      style: {\n        width: \"100%\",\n        height: \"100%\",\n        overflow: \"visible\",\n      },\n    };\n\n    if (this.sweepAngle === 360) {\n      arc = {\n        name: \"ellipse\",\n        attributes: {\n          xmlns: SVG_NS,\n          cx: \"50%\",\n          cy: \"50%\",\n          rx: \"50%\",\n          ry: \"50%\",\n          style,\n        },\n      };\n    } else {\n      const startAngle = (this.startAngle * Math.PI) / 180;\n      const sweepAngle = (this.sweepAngle * Math.PI) / 180;\n      const largeArc = this.sweepAngle > 180 ? 1 : 0;\n      const [x1, y1, x2, y2] = [\n        50 * (1 + Math.cos(startAngle)),\n        50 * (1 - Math.sin(startAngle)),\n        50 * (1 + Math.cos(startAngle + sweepAngle)),\n        50 * (1 - Math.sin(startAngle + sweepAngle)),\n      ];\n\n      arc = {\n        name: \"path\",\n        attributes: {\n          xmlns: SVG_NS,\n          d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`,\n          vectorEffect: \"non-scaling-stroke\",\n          style,\n        },\n      };\n\n      Object.assign(attributes, {\n        viewBox: \"0 0 100 100\",\n        preserveAspectRatio: \"none\",\n      });\n    }\n\n    const svg = {\n      name: \"svg\",\n      children: [arc],\n      attributes,\n    };\n\n    const parent = this[$getParent]()[$getParent]();\n    if (hasMargin(parent)) {\n      return HTMLResult.success({\n        name: \"div\",\n        attributes: {\n          style: {\n            display: \"inline\",\n            width: \"100%\",\n            height: \"100%\",\n          },\n        },\n        children: [svg],\n      });\n    }\n\n    svg.attributes.style.position = \"absolute\";\n    return HTMLResult.success(svg);\n  }\n}\n\nclass Area extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"area\", /* hasChildren = */ true);\n    this.colSpan = getInteger({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: n => n >= 1 || n === -1,\n    });\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.relevant = getRelevant(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.x = getMeasurement(attributes.x, \"0pt\");\n    this.y = getMeasurement(attributes.y, \"0pt\");\n    this.desc = null;\n    this.extras = null;\n    this.area = new XFAObjectArray();\n    this.draw = new XFAObjectArray();\n    this.exObject = new XFAObjectArray();\n    this.exclGroup = new XFAObjectArray();\n    this.field = new XFAObjectArray();\n    this.subform = new XFAObjectArray();\n    this.subformSet = new XFAObjectArray();\n  }\n\n  *[$getContainedChildren]() {\n    // This function is overriden in order to fake that subforms under\n    // this set are in fact under parent subform.\n    yield* getContainedChildren(this);\n  }\n\n  [$isTransparent]() {\n    return true;\n  }\n\n  [$isBindable]() {\n    return true;\n  }\n\n  [$addHTML](html, bbox) {\n    const [x, y, w, h] = bbox;\n    this[$extra].width = Math.max(this[$extra].width, x + w);\n    this[$extra].height = Math.max(this[$extra].height, y + h);\n\n    this[$extra].children.push(html);\n  }\n\n  [$getAvailableSpace]() {\n    return this[$extra].availableSpace;\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: incomplete.\n    const style = toStyle(this, \"position\");\n    const attributes = {\n      style,\n      id: this[$uid],\n      class: [\"xfaArea\"],\n    };\n\n    if (isPrintOnly(this)) {\n      attributes.class.push(\"xfaPrintOnly\");\n    }\n\n    if (this.name) {\n      attributes.xfaName = this.name;\n    }\n\n    const children = [];\n    this[$extra] = {\n      children,\n      width: 0,\n      height: 0,\n      availableSpace,\n    };\n\n    const result = this[$childrenToHTML]({\n      filter: new Set([\n        \"area\",\n        \"draw\",\n        \"field\",\n        \"exclGroup\",\n        \"subform\",\n        \"subformSet\",\n      ]),\n      include: true,\n    });\n\n    if (!result.success) {\n      if (result.isBreak()) {\n        return result;\n      }\n      // Nothing to propose for the element which doesn't fit the\n      // available space.\n      delete this[$extra];\n      return HTMLResult.FAILURE;\n    }\n\n    style.width = measureToString(this[$extra].width);\n    style.height = measureToString(this[$extra].height);\n\n    const html = {\n      name: \"div\",\n      attributes,\n      children,\n    };\n\n    const bbox = [this.x, this.y, this[$extra].width, this[$extra].height];\n    delete this[$extra];\n\n    return HTMLResult.success(html, bbox);\n  }\n}\n\nclass Assist extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"assist\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.role = attributes.role || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.speak = null;\n    this.toolTip = null;\n  }\n\n  [$toHTML]() {\n    return this.toolTip?.[$content] || null;\n  }\n}\n\nclass Barcode extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"barcode\", /* hasChildren = */ true);\n    this.charEncoding = getKeyword({\n      data: attributes.charEncoding\n        ? attributes.charEncoding.toLowerCase()\n        : \"\",\n      defaultValue: \"\",\n      validate: k =>\n        [\n          \"utf-8\",\n          \"big-five\",\n          \"fontspecific\",\n          \"gbk\",\n          \"gb-18030\",\n          \"gb-2312\",\n          \"ksc-5601\",\n          \"none\",\n          \"shift-jis\",\n          \"ucs-2\",\n          \"utf-16\",\n        ].includes(k) || k.match(/iso-8859-\\d{2}/),\n    });\n    this.checksum = getStringOption(attributes.checksum, [\n      \"none\",\n      \"1mod10\",\n      \"1mod10_1mod11\",\n      \"2mod10\",\n      \"auto\",\n    ]);\n    this.dataColumnCount = getInteger({\n      data: attributes.dataColumnCount,\n      defaultValue: -1,\n      validate: x => x >= 0,\n    });\n    this.dataLength = getInteger({\n      data: attributes.dataLength,\n      defaultValue: -1,\n      validate: x => x >= 0,\n    });\n    this.dataPrep = getStringOption(attributes.dataPrep, [\n      \"none\",\n      \"flateCompress\",\n    ]);\n    this.dataRowCount = getInteger({\n      data: attributes.dataRowCount,\n      defaultValue: -1,\n      validate: x => x >= 0,\n    });\n    this.endChar = attributes.endChar || \"\";\n    this.errorCorrectionLevel = getInteger({\n      data: attributes.errorCorrectionLevel,\n      defaultValue: -1,\n      validate: x => x >= 0 && x <= 8,\n    });\n    this.id = attributes.id || \"\";\n    this.moduleHeight = getMeasurement(attributes.moduleHeight, \"5mm\");\n    this.moduleWidth = getMeasurement(attributes.moduleWidth, \"0.25mm\");\n    this.printCheckDigit = getInteger({\n      data: attributes.printCheckDigit,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.rowColumnRatio = getRatio(attributes.rowColumnRatio);\n    this.startChar = attributes.startChar || \"\";\n    this.textLocation = getStringOption(attributes.textLocation, [\n      \"below\",\n      \"above\",\n      \"aboveEmbedded\",\n      \"belowEmbedded\",\n      \"none\",\n    ]);\n    this.truncate = getInteger({\n      data: attributes.truncate,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.type = getStringOption(\n      attributes.type ? attributes.type.toLowerCase() : \"\",\n      [\n        \"aztec\",\n        \"codabar\",\n        \"code2of5industrial\",\n        \"code2of5interleaved\",\n        \"code2of5matrix\",\n        \"code2of5standard\",\n        \"code3of9\",\n        \"code3of9extended\",\n        \"code11\",\n        \"code49\",\n        \"code93\",\n        \"code128\",\n        \"code128a\",\n        \"code128b\",\n        \"code128c\",\n        \"code128sscc\",\n        \"datamatrix\",\n        \"ean8\",\n        \"ean8add2\",\n        \"ean8add5\",\n        \"ean13\",\n        \"ean13add2\",\n        \"ean13add5\",\n        \"ean13pwcd\",\n        \"fim\",\n        \"logmars\",\n        \"maxicode\",\n        \"msi\",\n        \"pdf417\",\n        \"pdf417macro\",\n        \"plessey\",\n        \"postauscust2\",\n        \"postauscust3\",\n        \"postausreplypaid\",\n        \"postausstandard\",\n        \"postukrm4scc\",\n        \"postusdpbc\",\n        \"postusimb\",\n        \"postusstandard\",\n        \"postus5zip\",\n        \"qrcode\",\n        \"rfid\",\n        \"rss14\",\n        \"rss14expanded\",\n        \"rss14limited\",\n        \"rss14stacked\",\n        \"rss14stackedomni\",\n        \"rss14truncated\",\n        \"telepen\",\n        \"ucc128\",\n        \"ucc128random\",\n        \"ucc128sscc\",\n        \"upca\",\n        \"upcaadd2\",\n        \"upcaadd5\",\n        \"upcapwcd\",\n        \"upce\",\n        \"upceadd2\",\n        \"upceadd5\",\n        \"upcean2\",\n        \"upcean5\",\n        \"upsmaxicode\",\n      ]\n    );\n    this.upsMode = getStringOption(attributes.upsMode, [\n      \"usCarrier\",\n      \"internationalCarrier\",\n      \"secureSymbol\",\n      \"standardSymbol\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio);\n    this.encrypt = null;\n    this.extras = null;\n  }\n}\n\nclass Bind extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"bind\", /* hasChildren = */ true);\n    this.match = getStringOption(attributes.match, [\n      \"once\",\n      \"dataRef\",\n      \"global\",\n      \"none\",\n    ]);\n    this.ref = attributes.ref || \"\";\n    this.picture = null;\n  }\n}\n\nclass BindItems extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"bindItems\");\n    this.connection = attributes.connection || \"\";\n    this.labelRef = attributes.labelRef || \"\";\n    this.ref = attributes.ref || \"\";\n    this.valueRef = attributes.valueRef || \"\";\n  }\n}\n\nclass Bookend extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"bookend\");\n    this.id = attributes.id || \"\";\n    this.leader = attributes.leader || \"\";\n    this.trailer = attributes.trailer || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass BooleanElement extends Option01 {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"boolean\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$toHTML](availableSpace) {\n    return valueToHtml(this[$content] === 1 ? \"1\" : \"0\");\n  }\n}\n\nclass Border extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"border\", /* hasChildren = */ true);\n    this.break = getStringOption(attributes.break, [\"close\", \"open\"]);\n    this.hand = getStringOption(attributes.hand, [\"even\", \"left\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.relevant = getRelevant(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.corner = new XFAObjectArray(4);\n    this.edge = new XFAObjectArray(4);\n    this.extras = null;\n    this.fill = null;\n    this.margin = null;\n  }\n\n  [$getExtra]() {\n    if (!this[$extra]) {\n      const edges = this.edge.children.slice();\n      if (edges.length < 4) {\n        const defaultEdge = edges.at(-1) || new Edge({});\n        for (let i = edges.length; i < 4; i++) {\n          edges.push(defaultEdge);\n        }\n      }\n\n      const widths = edges.map(edge => edge.thickness);\n      const insets = [0, 0, 0, 0];\n      if (this.margin) {\n        insets[0] = this.margin.topInset;\n        insets[1] = this.margin.rightInset;\n        insets[2] = this.margin.bottomInset;\n        insets[3] = this.margin.leftInset;\n      }\n      this[$extra] = { widths, insets, edges };\n    }\n    return this[$extra];\n  }\n\n  [$toStyle]() {\n    // TODO: incomplete (hand).\n    const { edges } = this[$getExtra]();\n    const edgeStyles = edges.map(node => {\n      const style = node[$toStyle]();\n      style.color ||= \"#000000\";\n      return style;\n    });\n\n    const style = Object.create(null);\n    if (this.margin) {\n      Object.assign(style, this.margin[$toStyle]());\n    }\n\n    if (this.fill?.presence === \"visible\") {\n      Object.assign(style, this.fill[$toStyle]());\n    }\n\n    if (this.corner.children.some(node => node.radius !== 0)) {\n      const cornerStyles = this.corner.children.map(node => node[$toStyle]());\n      if (cornerStyles.length === 2 || cornerStyles.length === 3) {\n        const last = cornerStyles.at(-1);\n        for (let i = cornerStyles.length; i < 4; i++) {\n          cornerStyles.push(last);\n        }\n      }\n\n      style.borderRadius = cornerStyles.map(s => s.radius).join(\" \");\n    }\n\n    switch (this.presence) {\n      case \"invisible\":\n      case \"hidden\":\n        style.borderStyle = \"\";\n        break;\n      case \"inactive\":\n        style.borderStyle = \"none\";\n        break;\n      default:\n        style.borderStyle = edgeStyles.map(s => s.style).join(\" \");\n        break;\n    }\n\n    style.borderWidth = edgeStyles.map(s => s.width).join(\" \");\n    style.borderColor = edgeStyles.map(s => s.color).join(\" \");\n\n    return style;\n  }\n}\n\nclass Break extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"break\", /* hasChildren = */ true);\n    this.after = getStringOption(attributes.after, [\n      \"auto\",\n      \"contentArea\",\n      \"pageArea\",\n      \"pageEven\",\n      \"pageOdd\",\n    ]);\n    this.afterTarget = attributes.afterTarget || \"\";\n    this.before = getStringOption(attributes.before, [\n      \"auto\",\n      \"contentArea\",\n      \"pageArea\",\n      \"pageEven\",\n      \"pageOdd\",\n    ]);\n    this.beforeTarget = attributes.beforeTarget || \"\";\n    this.bookendLeader = attributes.bookendLeader || \"\";\n    this.bookendTrailer = attributes.bookendTrailer || \"\";\n    this.id = attributes.id || \"\";\n    this.overflowLeader = attributes.overflowLeader || \"\";\n    this.overflowTarget = attributes.overflowTarget || \"\";\n    this.overflowTrailer = attributes.overflowTrailer || \"\";\n    this.startNew = getInteger({\n      data: attributes.startNew,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n}\n\nclass BreakAfter extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"breakAfter\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.leader = attributes.leader || \"\";\n    this.startNew = getInteger({\n      data: attributes.startNew,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.target = attributes.target || \"\";\n    this.targetType = getStringOption(attributes.targetType, [\n      \"auto\",\n      \"contentArea\",\n      \"pageArea\",\n    ]);\n    this.trailer = attributes.trailer || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.script = null;\n  }\n}\n\nclass BreakBefore extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"breakBefore\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.leader = attributes.leader || \"\";\n    this.startNew = getInteger({\n      data: attributes.startNew,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.target = attributes.target || \"\";\n    this.targetType = getStringOption(attributes.targetType, [\n      \"auto\",\n      \"contentArea\",\n      \"pageArea\",\n    ]);\n    this.trailer = attributes.trailer || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.script = null;\n  }\n\n  [$toHTML](availableSpace) {\n    this[$extra] = {};\n    return HTMLResult.FAILURE;\n  }\n}\n\nclass Button extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"button\", /* hasChildren = */ true);\n    this.highlight = getStringOption(attributes.highlight, [\n      \"inverted\",\n      \"none\",\n      \"outline\",\n      \"push\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: highlight.\n\n    const parent = this[$getParent]();\n    const grandpa = parent[$getParent]();\n    const htmlButton = {\n      name: \"button\",\n      attributes: {\n        id: this[$uid],\n        class: [\"xfaButton\"],\n        style: {},\n      },\n      children: [],\n    };\n\n    for (const event of grandpa.event.children) {\n      // if (true) break;\n      if (event.activity !== \"click\" || !event.script) {\n        continue;\n      }\n      const jsURL = recoverJsURL(event.script[$content]);\n      if (!jsURL) {\n        continue;\n      }\n      const href = fixURL(jsURL.url);\n      if (!href) {\n        continue;\n      }\n\n      // we've an url so generate a <a>\n      htmlButton.children.push({\n        name: \"a\",\n        attributes: {\n          id: \"link\" + this[$uid],\n          href,\n          newWindow: jsURL.newWindow,\n          class: [\"xfaLink\"],\n          style: {},\n        },\n        children: [],\n      });\n    }\n\n    return HTMLResult.success(htmlButton);\n  }\n}\n\nclass Calculate extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"calculate\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.override = getStringOption(attributes.override, [\n      \"disabled\",\n      \"error\",\n      \"ignore\",\n      \"warning\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.message = null;\n    this.script = null;\n  }\n}\n\nclass Caption extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"caption\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.placement = getStringOption(attributes.placement, [\n      \"left\",\n      \"bottom\",\n      \"inline\",\n      \"right\",\n      \"top\",\n    ]);\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.reserve = Math.ceil(getMeasurement(attributes.reserve));\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.font = null;\n    this.margin = null;\n    this.para = null;\n    this.value = null;\n  }\n\n  [$setValue](value) {\n    _setValue(this, value);\n  }\n\n  [$getExtra](availableSpace) {\n    if (!this[$extra]) {\n      let { width, height } = availableSpace;\n      switch (this.placement) {\n        case \"left\":\n        case \"right\":\n        case \"inline\":\n          width = this.reserve <= 0 ? width : this.reserve;\n          break;\n        case \"top\":\n        case \"bottom\":\n          height = this.reserve <= 0 ? height : this.reserve;\n          break;\n      }\n\n      this[$extra] = layoutNode(this, { width, height });\n    }\n    return this[$extra];\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: incomplete.\n    if (!this.value) {\n      return HTMLResult.EMPTY;\n    }\n\n    this[$pushPara]();\n    const value = this.value[$toHTML](availableSpace).html;\n\n    if (!value) {\n      this[$popPara]();\n      return HTMLResult.EMPTY;\n    }\n\n    const savedReserve = this.reserve;\n    if (this.reserve <= 0) {\n      const { w, h } = this[$getExtra](availableSpace);\n      switch (this.placement) {\n        case \"left\":\n        case \"right\":\n        case \"inline\":\n          this.reserve = w;\n          break;\n        case \"top\":\n        case \"bottom\":\n          this.reserve = h;\n          break;\n      }\n    }\n\n    const children = [];\n    if (typeof value === \"string\") {\n      children.push({\n        name: \"#text\",\n        value,\n      });\n    } else {\n      children.push(value);\n    }\n\n    const style = toStyle(this, \"font\", \"margin\", \"visibility\");\n    switch (this.placement) {\n      case \"left\":\n      case \"right\":\n        if (this.reserve > 0) {\n          style.width = measureToString(this.reserve);\n        }\n        break;\n      case \"top\":\n      case \"bottom\":\n        if (this.reserve > 0) {\n          style.height = measureToString(this.reserve);\n        }\n        break;\n    }\n\n    setPara(this, null, value);\n    this[$popPara]();\n\n    this.reserve = savedReserve;\n\n    return HTMLResult.success({\n      name: \"div\",\n      attributes: {\n        style,\n        class: [\"xfaCaption\"],\n      },\n      children,\n    });\n  }\n}\n\nclass Certificate extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"certificate\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Certificates extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"certificates\", /* hasChildren = */ true);\n    this.credentialServerPolicy = getStringOption(\n      attributes.credentialServerPolicy,\n      [\"optional\", \"required\"]\n    );\n    this.id = attributes.id || \"\";\n    this.url = attributes.url || \"\";\n    this.urlPolicy = attributes.urlPolicy || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.encryption = null;\n    this.issuers = null;\n    this.keyUsage = null;\n    this.oids = null;\n    this.signing = null;\n    this.subjectDNs = null;\n  }\n}\n\nclass CheckButton extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"checkButton\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.mark = getStringOption(attributes.mark, [\n      \"default\",\n      \"check\",\n      \"circle\",\n      \"cross\",\n      \"diamond\",\n      \"square\",\n      \"star\",\n    ]);\n    this.shape = getStringOption(attributes.shape, [\"square\", \"round\"]);\n    this.size = getMeasurement(attributes.size, \"10pt\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: border, shape and mark.\n\n    const style = toStyle(this, \"margin\");\n    const size = measureToString(this.size);\n\n    style.width = style.height = size;\n\n    let type;\n    let className;\n    let groupId;\n    const field = this[$getParent]()[$getParent]();\n    const items =\n      (field.items.children.length &&\n        field.items.children[0][$toHTML]().html) ||\n      [];\n    const exportedValue = {\n      on: (items[0] !== undefined ? items[0] : \"on\").toString(),\n      off: (items[1] !== undefined ? items[1] : \"off\").toString(),\n    };\n\n    const value = field.value?.[$text]() || \"off\";\n    const checked = value === exportedValue.on || undefined;\n    const container = field[$getSubformParent]();\n    const fieldId = field[$uid];\n    let dataId;\n\n    if (container instanceof ExclGroup) {\n      groupId = container[$uid];\n      type = \"radio\";\n      className = \"xfaRadio\";\n      dataId = container[$data]?.[$uid] || container[$uid];\n    } else {\n      type = \"checkbox\";\n      className = \"xfaCheckbox\";\n      dataId = field[$data]?.[$uid] || field[$uid];\n    }\n\n    const input = {\n      name: \"input\",\n      attributes: {\n        class: [className],\n        style,\n        fieldId,\n        dataId,\n        type,\n        checked,\n        xfaOn: exportedValue.on,\n        xfaOff: exportedValue.off,\n        \"aria-label\": ariaLabel(field),\n        \"aria-required\": false,\n      },\n    };\n\n    if (groupId) {\n      input.attributes.name = groupId;\n    }\n\n    if (isRequired(field)) {\n      input.attributes[\"aria-required\"] = true;\n      input.attributes.required = true;\n    }\n\n    return HTMLResult.success({\n      name: \"label\",\n      attributes: {\n        class: [\"xfaLabel\"],\n      },\n      children: [input],\n    });\n  }\n}\n\nclass ChoiceList extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"choiceList\", /* hasChildren = */ true);\n    this.commitOn = getStringOption(attributes.commitOn, [\"select\", \"exit\"]);\n    this.id = attributes.id || \"\";\n    this.open = getStringOption(attributes.open, [\n      \"userControl\",\n      \"always\",\n      \"multiSelect\",\n      \"onEntry\",\n    ]);\n    this.textEntry = getInteger({\n      data: attributes.textEntry,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: incomplete.\n    const style = toStyle(this, \"border\", \"margin\");\n    const ui = this[$getParent]();\n    const field = ui[$getParent]();\n    const fontSize = field.font?.size || 10;\n    const optionStyle = {\n      fontSize: `calc(${fontSize}px * var(--total-scale-factor))`,\n    };\n    const children = [];\n\n    if (field.items.children.length > 0) {\n      const items = field.items;\n      let displayedIndex = 0;\n      let saveIndex = 0;\n      if (items.children.length === 2) {\n        displayedIndex = items.children[0].save;\n        saveIndex = 1 - displayedIndex;\n      }\n      const displayed = items.children[displayedIndex][$toHTML]().html;\n      const values = items.children[saveIndex][$toHTML]().html;\n\n      let selected = false;\n      const value = field.value?.[$text]() || \"\";\n      for (let i = 0, ii = displayed.length; i < ii; i++) {\n        const option = {\n          name: \"option\",\n          attributes: {\n            value: values[i] || displayed[i],\n            style: optionStyle,\n          },\n          value: displayed[i],\n        };\n        if (values[i] === value) {\n          option.attributes.selected = selected = true;\n        }\n        children.push(option);\n      }\n\n      if (!selected) {\n        children.splice(0, 0, {\n          name: \"option\",\n          attributes: {\n            hidden: true,\n            selected: true,\n          },\n          value: \" \",\n        });\n      }\n    }\n\n    const selectAttributes = {\n      class: [\"xfaSelect\"],\n      fieldId: field[$uid],\n      dataId: field[$data]?.[$uid] || field[$uid],\n      style,\n      \"aria-label\": ariaLabel(field),\n      \"aria-required\": false,\n    };\n\n    if (isRequired(field)) {\n      selectAttributes[\"aria-required\"] = true;\n      selectAttributes.required = true;\n    }\n\n    if (this.open === \"multiSelect\") {\n      selectAttributes.multiple = true;\n    }\n\n    return HTMLResult.success({\n      name: \"label\",\n      attributes: {\n        class: [\"xfaLabel\"],\n      },\n      children: [\n        {\n          name: \"select\",\n          children,\n          attributes: selectAttributes,\n        },\n      ],\n    });\n  }\n}\n\nclass Color extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"color\", /* hasChildren = */ true);\n    this.cSpace = getStringOption(attributes.cSpace, [\"SRGB\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.value = attributes.value ? getColor(attributes.value) : \"\";\n    this.extras = null;\n  }\n\n  [$hasSettableValue]() {\n    return false;\n  }\n\n  [$toStyle]() {\n    return this.value\n      ? Util.makeHexColor(this.value.r, this.value.g, this.value.b)\n      : null;\n  }\n}\n\nclass Comb extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"comb\");\n    this.id = attributes.id || \"\";\n    this.numberOfCells = getInteger({\n      data: attributes.numberOfCells,\n      defaultValue: 0,\n      validate: x => x >= 0,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Connect extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"connect\", /* hasChildren = */ true);\n    this.connection = attributes.connection || \"\";\n    this.id = attributes.id || \"\";\n    this.ref = attributes.ref || \"\";\n    this.usage = getStringOption(attributes.usage, [\n      \"exportAndImport\",\n      \"exportOnly\",\n      \"importOnly\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.picture = null;\n  }\n}\n\nclass ContentArea extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"contentArea\", /* hasChildren = */ true);\n    this.h = getMeasurement(attributes.h);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.relevant = getRelevant(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = getMeasurement(attributes.w);\n    this.x = getMeasurement(attributes.x, \"0pt\");\n    this.y = getMeasurement(attributes.y, \"0pt\");\n    this.desc = null;\n    this.extras = null;\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: incomplete.\n    const left = measureToString(this.x);\n    const top = measureToString(this.y);\n\n    const style = {\n      left,\n      top,\n      width: measureToString(this.w),\n      height: measureToString(this.h),\n    };\n\n    const classNames = [\"xfaContentarea\"];\n\n    if (isPrintOnly(this)) {\n      classNames.push(\"xfaPrintOnly\");\n    }\n\n    return HTMLResult.success({\n      name: \"div\",\n      children: [],\n      attributes: {\n        style,\n        class: classNames,\n        id: this[$uid],\n      },\n    });\n  }\n}\n\nclass Corner extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"corner\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.inverted = getInteger({\n      data: attributes.inverted,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.join = getStringOption(attributes.join, [\"square\", \"round\"]);\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.radius = getMeasurement(attributes.radius);\n    this.stroke = getStringOption(attributes.stroke, [\n      \"solid\",\n      \"dashDot\",\n      \"dashDotDot\",\n      \"dashed\",\n      \"dotted\",\n      \"embossed\",\n      \"etched\",\n      \"lowered\",\n      \"raised\",\n    ]);\n    this.thickness = getMeasurement(attributes.thickness, \"0.5pt\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [$toStyle]() {\n    // In using CSS it's only possible to handle radius\n    // (at least with basic css).\n    // Is there a real use (interest ?) of all these properties ?\n    // Maybe it's possible to implement them using svg and border-image...\n    // TODO: implement all the missing properties.\n    const style = toStyle(this, \"visibility\");\n    style.radius = measureToString(this.join === \"square\" ? 0 : this.radius);\n    return style;\n  }\n}\n\nclass DateElement extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"date\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$finalize]() {\n    const date = this[$content].trim();\n    this[$content] = date ? new Date(date) : null;\n  }\n\n  [$toHTML](availableSpace) {\n    return valueToHtml(this[$content] ? this[$content].toString() : \"\");\n  }\n}\n\nclass DateTime extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"dateTime\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$finalize]() {\n    const date = this[$content].trim();\n    this[$content] = date ? new Date(date) : null;\n  }\n\n  [$toHTML](availableSpace) {\n    return valueToHtml(this[$content] ? this[$content].toString() : \"\");\n  }\n}\n\nclass DateTimeEdit extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"dateTimeEdit\", /* hasChildren = */ true);\n    this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, [\n      \"auto\",\n      \"off\",\n      \"on\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.picker = getStringOption(attributes.picker, [\"host\", \"none\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.comb = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: incomplete.\n    // When the picker is host we should use type=date for the input\n    // but we need to put the buttons outside the text-field.\n    const style = toStyle(this, \"border\", \"font\", \"margin\");\n    const field = this[$getParent]()[$getParent]();\n    const html = {\n      name: \"input\",\n      attributes: {\n        type: \"text\",\n        fieldId: field[$uid],\n        dataId: field[$data]?.[$uid] || field[$uid],\n        class: [\"xfaTextfield\"],\n        style,\n        \"aria-label\": ariaLabel(field),\n        \"aria-required\": false,\n      },\n    };\n\n    if (isRequired(field)) {\n      html.attributes[\"aria-required\"] = true;\n      html.attributes.required = true;\n    }\n\n    return HTMLResult.success({\n      name: \"label\",\n      attributes: {\n        class: [\"xfaLabel\"],\n      },\n      children: [html],\n    });\n  }\n}\n\nclass Decimal extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"decimal\");\n    this.fracDigits = getInteger({\n      data: attributes.fracDigits,\n      defaultValue: 2,\n      validate: x => true,\n    });\n    this.id = attributes.id || \"\";\n    this.leadDigits = getInteger({\n      data: attributes.leadDigits,\n      defaultValue: -1,\n      validate: x => true,\n    });\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$finalize]() {\n    const number = parseFloat(this[$content].trim());\n    this[$content] = isNaN(number) ? null : number;\n  }\n\n  [$toHTML](availableSpace) {\n    return valueToHtml(\n      this[$content] !== null ? this[$content].toString() : \"\"\n    );\n  }\n}\n\nclass DefaultUi extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"defaultUi\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n}\n\nclass Desc extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"desc\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.boolean = new XFAObjectArray();\n    this.date = new XFAObjectArray();\n    this.dateTime = new XFAObjectArray();\n    this.decimal = new XFAObjectArray();\n    this.exData = new XFAObjectArray();\n    this.float = new XFAObjectArray();\n    this.image = new XFAObjectArray();\n    this.integer = new XFAObjectArray();\n    this.text = new XFAObjectArray();\n    this.time = new XFAObjectArray();\n  }\n}\n\nclass DigestMethod extends OptionObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"digestMethod\", [\n      \"\",\n      \"SHA1\",\n      \"SHA256\",\n      \"SHA512\",\n      \"RIPEMD160\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass DigestMethods extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"digestMethods\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.digestMethod = new XFAObjectArray();\n  }\n}\n\nclass Draw extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"draw\", /* hasChildren = */ true);\n    this.anchorType = getStringOption(attributes.anchorType, [\n      \"topLeft\",\n      \"bottomCenter\",\n      \"bottomLeft\",\n      \"bottomRight\",\n      \"middleCenter\",\n      \"middleLeft\",\n      \"middleRight\",\n      \"topCenter\",\n      \"topRight\",\n    ]);\n    this.colSpan = getInteger({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: n => n >= 1 || n === -1,\n    });\n    this.h = attributes.h ? getMeasurement(attributes.h) : \"\";\n    this.hAlign = getStringOption(attributes.hAlign, [\n      \"left\",\n      \"center\",\n      \"justify\",\n      \"justifyAll\",\n      \"radix\",\n      \"right\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.locale = attributes.locale || \"\";\n    this.maxH = getMeasurement(attributes.maxH, \"0pt\");\n    this.maxW = getMeasurement(attributes.maxW, \"0pt\");\n    this.minH = getMeasurement(attributes.minH, \"0pt\");\n    this.minW = getMeasurement(attributes.minW, \"0pt\");\n    this.name = attributes.name || \"\";\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.relevant = getRelevant(attributes.relevant);\n    this.rotate = getInteger({\n      data: attributes.rotate,\n      defaultValue: 0,\n      validate: x => x % 90 === 0,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = attributes.w ? getMeasurement(attributes.w) : \"\";\n    this.x = getMeasurement(attributes.x, \"0pt\");\n    this.y = getMeasurement(attributes.y, \"0pt\");\n    this.assist = null;\n    this.border = null;\n    this.caption = null;\n    this.desc = null;\n    this.extras = null;\n    this.font = null;\n    this.keep = null;\n    this.margin = null;\n    this.para = null;\n    this.traversal = null;\n    this.ui = null;\n    this.value = null;\n    this.setProperty = new XFAObjectArray();\n  }\n\n  [$setValue](value) {\n    _setValue(this, value);\n  }\n\n  [$toHTML](availableSpace) {\n    setTabIndex(this);\n\n    if (this.presence === \"hidden\" || this.presence === \"inactive\") {\n      return HTMLResult.EMPTY;\n    }\n\n    fixDimensions(this);\n    this[$pushPara]();\n\n    // If at least one dimension is missing and we've a text\n    // then we can guess it in laying out the text.\n    const savedW = this.w;\n    const savedH = this.h;\n    const { w, h, isBroken } = layoutNode(this, availableSpace);\n    if (w && this.w === \"\") {\n      // If the parent layout is lr-tb with a w=100 and we already have a child\n      // which takes 90 on the current line.\n      // If we have a text with a length (in px) equal to 100 then it'll be\n      // splitted into almost 10 chunks: so it won't be nice.\n      // So if we've potentially more width to provide in some parent containers\n      // let's increase it to give a chance to have a better rendering.\n      if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) {\n        this[$popPara]();\n        return HTMLResult.FAILURE;\n      }\n\n      this.w = w;\n    }\n    if (h && this.h === \"\") {\n      this.h = h;\n    }\n\n    setFirstUnsplittable(this);\n    if (!checkDimensions(this, availableSpace)) {\n      this.w = savedW;\n      this.h = savedH;\n      this[$popPara]();\n      return HTMLResult.FAILURE;\n    }\n    unsetFirstUnsplittable(this);\n\n    const style = toStyle(\n      this,\n      \"font\",\n      \"hAlign\",\n      \"dimensions\",\n      \"position\",\n      \"presence\",\n      \"rotate\",\n      \"anchorType\",\n      \"border\",\n      \"margin\"\n    );\n\n    setMinMaxDimensions(this, style);\n\n    if (style.margin) {\n      style.padding = style.margin;\n      delete style.margin;\n    }\n\n    const classNames = [\"xfaDraw\"];\n    if (this.font) {\n      classNames.push(\"xfaFont\");\n    }\n    if (isPrintOnly(this)) {\n      classNames.push(\"xfaPrintOnly\");\n    }\n\n    const attributes = {\n      style,\n      id: this[$uid],\n      class: classNames,\n    };\n\n    if (this.name) {\n      attributes.xfaName = this.name;\n    }\n\n    const html = {\n      name: \"div\",\n      attributes,\n      children: [],\n    };\n\n    applyAssist(this, attributes);\n\n    const bbox = computeBbox(this, html, availableSpace);\n\n    const value = this.value ? this.value[$toHTML](availableSpace).html : null;\n    if (value === null) {\n      this.w = savedW;\n      this.h = savedH;\n      this[$popPara]();\n      return HTMLResult.success(createWrapper(this, html), bbox);\n    }\n\n    html.children.push(value);\n    setPara(this, style, value);\n\n    this.w = savedW;\n    this.h = savedH;\n\n    this[$popPara]();\n    return HTMLResult.success(createWrapper(this, html), bbox);\n  }\n}\n\nclass Edge extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"edge\", /* hasChildren = */ true);\n    this.cap = getStringOption(attributes.cap, [\"square\", \"butt\", \"round\"]);\n    this.id = attributes.id || \"\";\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.stroke = getStringOption(attributes.stroke, [\n      \"solid\",\n      \"dashDot\",\n      \"dashDotDot\",\n      \"dashed\",\n      \"dotted\",\n      \"embossed\",\n      \"etched\",\n      \"lowered\",\n      \"raised\",\n    ]);\n    this.thickness = getMeasurement(attributes.thickness, \"0.5pt\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [$toStyle]() {\n    // TODO: dashDot & dashDotDot.\n    const style = toStyle(this, \"visibility\");\n    Object.assign(style, {\n      linecap: this.cap,\n      width: measureToString(this.thickness),\n      color: this.color ? this.color[$toStyle]() : \"#000000\",\n      style: \"\",\n    });\n\n    if (this.presence !== \"visible\") {\n      style.style = \"none\";\n    } else {\n      switch (this.stroke) {\n        case \"solid\":\n          style.style = \"solid\";\n          break;\n        case \"dashDot\":\n          style.style = \"dashed\";\n          break;\n        case \"dashDotDot\":\n          style.style = \"dashed\";\n          break;\n        case \"dashed\":\n          style.style = \"dashed\";\n          break;\n        case \"dotted\":\n          style.style = \"dotted\";\n          break;\n        case \"embossed\":\n          style.style = \"ridge\";\n          break;\n        case \"etched\":\n          style.style = \"groove\";\n          break;\n        case \"lowered\":\n          style.style = \"inset\";\n          break;\n        case \"raised\":\n          style.style = \"outset\";\n          break;\n      }\n    }\n    return style;\n  }\n}\n\nclass Encoding extends OptionObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encoding\", [\n      \"adbe.x509.rsa_sha1\",\n      \"adbe.pkcs7.detached\",\n      \"adbe.pkcs7.sha1\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Encodings extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encodings\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.encoding = new XFAObjectArray();\n  }\n}\n\nclass Encrypt extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encrypt\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.certificate = null;\n  }\n}\n\nclass EncryptData extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encryptData\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.operation = getStringOption(attributes.operation, [\n      \"encrypt\",\n      \"decrypt\",\n    ]);\n    this.target = attributes.target || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.filter = null;\n    this.manifest = null;\n  }\n}\n\nclass Encryption extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encryption\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.certificate = new XFAObjectArray();\n  }\n}\n\nclass EncryptionMethod extends OptionObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encryptionMethod\", [\n      \"\",\n      \"AES256-CBC\",\n      \"TRIPLEDES-CBC\",\n      \"AES128-CBC\",\n      \"AES192-CBC\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass EncryptionMethods extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"encryptionMethods\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.encryptionMethod = new XFAObjectArray();\n  }\n}\n\nclass Event extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"event\", /* hasChildren = */ true);\n    this.activity = getStringOption(attributes.activity, [\n      \"click\",\n      \"change\",\n      \"docClose\",\n      \"docReady\",\n      \"enter\",\n      \"exit\",\n      \"full\",\n      \"indexChange\",\n      \"initialize\",\n      \"mouseDown\",\n      \"mouseEnter\",\n      \"mouseExit\",\n      \"mouseUp\",\n      \"postExecute\",\n      \"postOpen\",\n      \"postPrint\",\n      \"postSave\",\n      \"postSign\",\n      \"postSubmit\",\n      \"preExecute\",\n      \"preOpen\",\n      \"prePrint\",\n      \"preSave\",\n      \"preSign\",\n      \"preSubmit\",\n      \"ready\",\n      \"validationState\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.listen = getStringOption(attributes.listen, [\n      \"refOnly\",\n      \"refAndDescendents\",\n    ]);\n    this.name = attributes.name || \"\";\n    this.ref = attributes.ref || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n\n    // One-of properties\n    this.encryptData = null;\n    this.execute = null;\n    this.script = null;\n    this.signData = null;\n    this.submit = null;\n  }\n}\n\nclass ExData extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"exData\");\n    this.contentType = attributes.contentType || \"\";\n    this.href = attributes.href || \"\";\n    this.id = attributes.id || \"\";\n    this.maxLength = getInteger({\n      data: attributes.maxLength,\n      defaultValue: -1,\n      validate: x => x >= -1,\n    });\n    this.name = attributes.name || \"\";\n    this.rid = attributes.rid || \"\";\n    this.transferEncoding = getStringOption(attributes.transferEncoding, [\n      \"none\",\n      \"base64\",\n      \"package\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$isCDATAXml]() {\n    return this.contentType === \"text/html\";\n  }\n\n  [$onChild](child) {\n    if (\n      this.contentType === \"text/html\" &&\n      child[$namespaceId] === NamespaceIds.xhtml.id\n    ) {\n      this[$content] = child;\n      return true;\n    }\n\n    if (this.contentType === \"text/xml\") {\n      this[$content] = child;\n      return true;\n    }\n\n    return false;\n  }\n\n  [$toHTML](availableSpace) {\n    if (this.contentType !== \"text/html\" || !this[$content]) {\n      // TODO: fix other cases.\n      return HTMLResult.EMPTY;\n    }\n\n    return this[$content][$toHTML](availableSpace);\n  }\n}\n\nclass ExObject extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"exObject\", /* hasChildren = */ true);\n    this.archive = attributes.archive || \"\";\n    this.classId = attributes.classId || \"\";\n    this.codeBase = attributes.codeBase || \"\";\n    this.codeType = attributes.codeType || \"\";\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.boolean = new XFAObjectArray();\n    this.date = new XFAObjectArray();\n    this.dateTime = new XFAObjectArray();\n    this.decimal = new XFAObjectArray();\n    this.exData = new XFAObjectArray();\n    this.exObject = new XFAObjectArray();\n    this.float = new XFAObjectArray();\n    this.image = new XFAObjectArray();\n    this.integer = new XFAObjectArray();\n    this.text = new XFAObjectArray();\n    this.time = new XFAObjectArray();\n  }\n}\n\nclass ExclGroup extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"exclGroup\", /* hasChildren = */ true);\n    this.access = getStringOption(attributes.access, [\n      \"open\",\n      \"nonInteractive\",\n      \"protected\",\n      \"readOnly\",\n    ]);\n    this.accessKey = attributes.accessKey || \"\";\n    this.anchorType = getStringOption(attributes.anchorType, [\n      \"topLeft\",\n      \"bottomCenter\",\n      \"bottomLeft\",\n      \"bottomRight\",\n      \"middleCenter\",\n      \"middleLeft\",\n      \"middleRight\",\n      \"topCenter\",\n      \"topRight\",\n    ]);\n    this.colSpan = getInteger({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: n => n >= 1 || n === -1,\n    });\n    this.h = attributes.h ? getMeasurement(attributes.h) : \"\";\n    this.hAlign = getStringOption(attributes.hAlign, [\n      \"left\",\n      \"center\",\n      \"justify\",\n      \"justifyAll\",\n      \"radix\",\n      \"right\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.layout = getStringOption(attributes.layout, [\n      \"position\",\n      \"lr-tb\",\n      \"rl-row\",\n      \"rl-tb\",\n      \"row\",\n      \"table\",\n      \"tb\",\n    ]);\n    this.maxH = getMeasurement(attributes.maxH, \"0pt\");\n    this.maxW = getMeasurement(attributes.maxW, \"0pt\");\n    this.minH = getMeasurement(attributes.minH, \"0pt\");\n    this.minW = getMeasurement(attributes.minW, \"0pt\");\n    this.name = attributes.name || \"\";\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.relevant = getRelevant(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = attributes.w ? getMeasurement(attributes.w) : \"\";\n    this.x = getMeasurement(attributes.x, \"0pt\");\n    this.y = getMeasurement(attributes.y, \"0pt\");\n    this.assist = null;\n    this.bind = null;\n    this.border = null;\n    this.calculate = null;\n    this.caption = null;\n    this.desc = null;\n    this.extras = null;\n    this.margin = null;\n    this.para = null;\n    this.traversal = null;\n    this.validate = null;\n    this.connect = new XFAObjectArray();\n    this.event = new XFAObjectArray();\n    this.field = new XFAObjectArray();\n    this.setProperty = new XFAObjectArray();\n  }\n\n  [$isBindable]() {\n    return true;\n  }\n\n  [$hasSettableValue]() {\n    return true;\n  }\n\n  [$setValue](value) {\n    for (const field of this.field.children) {\n      if (!field.value) {\n        const nodeValue = new Value({});\n        field[$appendChild](nodeValue);\n        field.value = nodeValue;\n      }\n\n      field.value[$setValue](value);\n    }\n  }\n\n  [$isThereMoreWidth]() {\n    return (\n      (this.layout.endsWith(\"-tb\") &&\n        this[$extra].attempt === 0 &&\n        this[$extra].numberInLine > 0) ||\n      this[$getParent]()[$isThereMoreWidth]()\n    );\n  }\n\n  [$isSplittable]() {\n    // We cannot cache the result here because the contentArea\n    // can change.\n    const parent = this[$getSubformParent]();\n    if (!parent[$isSplittable]()) {\n      return false;\n    }\n\n    if (this[$extra]._isSplittable !== undefined) {\n      return this[$extra]._isSplittable;\n    }\n\n    if (this.layout === \"position\" || this.layout.includes(\"row\")) {\n      this[$extra]._isSplittable = false;\n      return false;\n    }\n\n    if (parent.layout?.endsWith(\"-tb\") && parent[$extra].numberInLine !== 0) {\n      // See comment in Subform::[$isSplittable] for an explanation.\n      return false;\n    }\n\n    this[$extra]._isSplittable = true;\n    return true;\n  }\n\n  [$flushHTML]() {\n    return flushHTML(this);\n  }\n\n  [$addHTML](html, bbox) {\n    addHTML(this, html, bbox);\n  }\n\n  [$getAvailableSpace]() {\n    return getAvailableSpace(this);\n  }\n\n  [$toHTML](availableSpace) {\n    setTabIndex(this);\n    if (\n      this.presence === \"hidden\" ||\n      this.presence === \"inactive\" ||\n      this.h === 0 ||\n      this.w === 0\n    ) {\n      return HTMLResult.EMPTY;\n    }\n\n    fixDimensions(this);\n\n    const children = [];\n    const attributes = {\n      id: this[$uid],\n      class: [],\n    };\n\n    setAccess(this, attributes.class);\n\n    this[$extra] ||= Object.create(null);\n\n    Object.assign(this[$extra], {\n      children,\n      attributes,\n      attempt: 0,\n      line: null,\n      numberInLine: 0,\n      availableSpace: {\n        width: Math.min(this.w || Infinity, availableSpace.width),\n        height: Math.min(this.h || Infinity, availableSpace.height),\n      },\n      width: 0,\n      height: 0,\n      prevHeight: 0,\n      currentWidth: 0,\n    });\n\n    const isSplittable = this[$isSplittable]();\n    if (!isSplittable) {\n      setFirstUnsplittable(this);\n    }\n\n    if (!checkDimensions(this, availableSpace)) {\n      return HTMLResult.FAILURE;\n    }\n    const filter = new Set([\"field\"]);\n\n    if (this.layout.includes(\"row\")) {\n      const columnWidths = this[$getSubformParent]().columnWidths;\n      if (Array.isArray(columnWidths) && columnWidths.length > 0) {\n        this[$extra].columnWidths = columnWidths;\n        this[$extra].currentColumn = 0;\n      }\n    }\n\n    const style = toStyle(\n      this,\n      \"anchorType\",\n      \"dimensions\",\n      \"position\",\n      \"presence\",\n      \"border\",\n      \"margin\",\n      \"hAlign\"\n    );\n    const classNames = [\"xfaExclgroup\"];\n    const cl = layoutClass(this);\n    if (cl) {\n      classNames.push(cl);\n    }\n\n    if (isPrintOnly(this)) {\n      classNames.push(\"xfaPrintOnly\");\n    }\n\n    attributes.style = style;\n    attributes.class = classNames;\n\n    if (this.name) {\n      attributes.xfaName = this.name;\n    }\n\n    this[$pushPara]();\n    const isLrTb = this.layout === \"lr-tb\" || this.layout === \"rl-tb\";\n    const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;\n    for (; this[$extra].attempt < maxRun; this[$extra].attempt++) {\n      if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {\n        // If the layout is lr-tb then having attempt equals to\n        // MAX_ATTEMPTS_FOR_LRTB_LAYOUT-1 means that we're trying to layout\n        // on the next line so this on is empty.\n        this[$extra].numberInLine = 0;\n      }\n      const result = this[$childrenToHTML]({\n        filter,\n        include: true,\n      });\n      if (result.success) {\n        break;\n      }\n      if (result.isBreak()) {\n        this[$popPara]();\n        return result;\n      }\n      if (\n        isLrTb &&\n        this[$extra].attempt === 0 &&\n        this[$extra].numberInLine === 0 &&\n        !this[$getTemplateRoot]()[$extra].noLayoutFailure\n      ) {\n        // See comment in Subform::[$toHTML].\n        this[$extra].attempt = maxRun;\n        break;\n      }\n    }\n\n    this[$popPara]();\n\n    if (!isSplittable) {\n      unsetFirstUnsplittable(this);\n    }\n\n    if (this[$extra].attempt === maxRun) {\n      if (!isSplittable) {\n        delete this[$extra];\n      }\n      return HTMLResult.FAILURE;\n    }\n\n    let marginH = 0;\n    let marginV = 0;\n    if (this.margin) {\n      marginH = this.margin.leftInset + this.margin.rightInset;\n      marginV = this.margin.topInset + this.margin.bottomInset;\n    }\n\n    const width = Math.max(this[$extra].width + marginH, this.w || 0);\n    const height = Math.max(this[$extra].height + marginV, this.h || 0);\n    const bbox = [this.x, this.y, width, height];\n\n    if (this.w === \"\") {\n      style.width = measureToString(width);\n    }\n    if (this.h === \"\") {\n      style.height = measureToString(height);\n    }\n\n    const html = {\n      name: \"div\",\n      attributes,\n      children,\n    };\n\n    applyAssist(this, attributes);\n\n    delete this[$extra];\n\n    return HTMLResult.success(createWrapper(this, html), bbox);\n  }\n}\n\nclass Execute extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"execute\");\n    this.connection = attributes.connection || \"\";\n    this.executeType = getStringOption(attributes.executeType, [\n      \"import\",\n      \"remerge\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.runAt = getStringOption(attributes.runAt, [\n      \"client\",\n      \"both\",\n      \"server\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Extras extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"extras\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.boolean = new XFAObjectArray();\n    this.date = new XFAObjectArray();\n    this.dateTime = new XFAObjectArray();\n    this.decimal = new XFAObjectArray();\n    this.exData = new XFAObjectArray();\n    this.extras = new XFAObjectArray();\n    this.float = new XFAObjectArray();\n    this.image = new XFAObjectArray();\n    this.integer = new XFAObjectArray();\n    this.text = new XFAObjectArray();\n    this.time = new XFAObjectArray();\n  }\n\n  // (Spec) The XFA template grammar defines the extras and desc elements,\n  // which can be used to add human-readable or machine-readable\n  // data to a template.\n}\n\nclass Field extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"field\", /* hasChildren = */ true);\n    this.access = getStringOption(attributes.access, [\n      \"open\",\n      \"nonInteractive\",\n      \"protected\",\n      \"readOnly\",\n    ]);\n    this.accessKey = attributes.accessKey || \"\";\n    this.anchorType = getStringOption(attributes.anchorType, [\n      \"topLeft\",\n      \"bottomCenter\",\n      \"bottomLeft\",\n      \"bottomRight\",\n      \"middleCenter\",\n      \"middleLeft\",\n      \"middleRight\",\n      \"topCenter\",\n      \"topRight\",\n    ]);\n    this.colSpan = getInteger({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: n => n >= 1 || n === -1,\n    });\n    this.h = attributes.h ? getMeasurement(attributes.h) : \"\";\n    this.hAlign = getStringOption(attributes.hAlign, [\n      \"left\",\n      \"center\",\n      \"justify\",\n      \"justifyAll\",\n      \"radix\",\n      \"right\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.locale = attributes.locale || \"\";\n    this.maxH = getMeasurement(attributes.maxH, \"0pt\");\n    this.maxW = getMeasurement(attributes.maxW, \"0pt\");\n    this.minH = getMeasurement(attributes.minH, \"0pt\");\n    this.minW = getMeasurement(attributes.minW, \"0pt\");\n    this.name = attributes.name || \"\";\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.relevant = getRelevant(attributes.relevant);\n    this.rotate = getInteger({\n      data: attributes.rotate,\n      defaultValue: 0,\n      validate: x => x % 90 === 0,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = attributes.w ? getMeasurement(attributes.w) : \"\";\n    this.x = getMeasurement(attributes.x, \"0pt\");\n    this.y = getMeasurement(attributes.y, \"0pt\");\n    this.assist = null;\n    this.bind = null;\n    this.border = null;\n    this.calculate = null;\n    this.caption = null;\n    this.desc = null;\n    this.extras = null;\n    this.font = null;\n    this.format = null;\n    // For a choice list, one list is used to have display entries\n    // and the other for the exported values\n    this.items = new XFAObjectArray(2);\n    this.keep = null;\n    this.margin = null;\n    this.para = null;\n    this.traversal = null;\n    this.ui = null;\n    this.validate = null;\n    this.value = null;\n    this.bindItems = new XFAObjectArray();\n    this.connect = new XFAObjectArray();\n    this.event = new XFAObjectArray();\n    this.setProperty = new XFAObjectArray();\n  }\n\n  [$isBindable]() {\n    return true;\n  }\n\n  [$setValue](value) {\n    _setValue(this, value);\n  }\n\n  [$toHTML](availableSpace) {\n    setTabIndex(this);\n\n    if (!this.ui) {\n      // It's allowed to not have an ui, specs say:\n      //   If the UI element contains no children or is not present,\n      //   the application chooses a default user interface for the\n      //   container, based on the type of the container's content.\n\n      this.ui = new Ui({});\n      this.ui[$globalData] = this[$globalData];\n      this[$appendChild](this.ui);\n      let node;\n\n      // The items element can have 2 element max and\n      // according to the items specs it's likely a good\n      // way to guess the correct ui type.\n      switch (this.items.children.length) {\n        case 0:\n          node = new TextEdit({});\n          this.ui.textEdit = node;\n          break;\n        case 1:\n          node = new CheckButton({});\n          this.ui.checkButton = node;\n          break;\n        case 2:\n          node = new ChoiceList({});\n          this.ui.choiceList = node;\n          break;\n      }\n      this.ui[$appendChild](node);\n    }\n\n    if (\n      !this.ui ||\n      this.presence === \"hidden\" ||\n      this.presence === \"inactive\" ||\n      this.h === 0 ||\n      this.w === 0\n    ) {\n      return HTMLResult.EMPTY;\n    }\n\n    if (this.caption) {\n      // Maybe we already tried to layout this field with\n      // another availableSpace, so to avoid to use the cached\n      // value just delete it.\n      delete this.caption[$extra];\n    }\n\n    this[$pushPara]();\n\n    const caption = this.caption\n      ? this.caption[$toHTML](availableSpace).html\n      : null;\n    const savedW = this.w;\n    const savedH = this.h;\n    let marginH = 0;\n    let marginV = 0;\n    if (this.margin) {\n      marginH = this.margin.leftInset + this.margin.rightInset;\n      marginV = this.margin.topInset + this.margin.bottomInset;\n    }\n\n    let borderDims = null;\n    if (this.w === \"\" || this.h === \"\") {\n      let width = null;\n      let height = null;\n\n      let uiW = 0;\n      let uiH = 0;\n      if (this.ui.checkButton) {\n        uiW = uiH = this.ui.checkButton.size;\n      } else {\n        const { w, h } = layoutNode(this, availableSpace);\n        if (w !== null) {\n          uiW = w;\n          uiH = h;\n        } else {\n          uiH = getMetrics(this.font, /* real = */ true).lineNoGap;\n        }\n      }\n\n      borderDims = getBorderDims(this.ui[$getExtra]());\n      uiW += borderDims.w;\n      uiH += borderDims.h;\n\n      if (this.caption) {\n        const { w, h, isBroken } = this.caption[$getExtra](availableSpace);\n        // See comment in Draw::[$toHTML] to have an explanation\n        // about this line.\n        if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) {\n          this[$popPara]();\n          return HTMLResult.FAILURE;\n        }\n\n        width = w;\n        height = h;\n\n        switch (this.caption.placement) {\n          case \"left\":\n          case \"right\":\n          case \"inline\":\n            width += uiW;\n            break;\n          case \"top\":\n          case \"bottom\":\n            height += uiH;\n            break;\n        }\n      } else {\n        width = uiW;\n        height = uiH;\n      }\n\n      if (width && this.w === \"\") {\n        width += marginH;\n        this.w = Math.min(\n          this.maxW <= 0 ? Infinity : this.maxW,\n          this.minW + 1 < width ? width : this.minW\n        );\n      }\n\n      if (height && this.h === \"\") {\n        height += marginV;\n        this.h = Math.min(\n          this.maxH <= 0 ? Infinity : this.maxH,\n          this.minH + 1 < height ? height : this.minH\n        );\n      }\n    }\n\n    this[$popPara]();\n\n    fixDimensions(this);\n\n    setFirstUnsplittable(this);\n    if (!checkDimensions(this, availableSpace)) {\n      this.w = savedW;\n      this.h = savedH;\n      this[$popPara]();\n      return HTMLResult.FAILURE;\n    }\n    unsetFirstUnsplittable(this);\n\n    const style = toStyle(\n      this,\n      \"font\",\n      \"dimensions\",\n      \"position\",\n      \"rotate\",\n      \"anchorType\",\n      \"presence\",\n      \"margin\",\n      \"hAlign\"\n    );\n\n    setMinMaxDimensions(this, style);\n\n    const classNames = [\"xfaField\"];\n    // If no font, font properties are inherited.\n    if (this.font) {\n      classNames.push(\"xfaFont\");\n    }\n\n    if (isPrintOnly(this)) {\n      classNames.push(\"xfaPrintOnly\");\n    }\n\n    const attributes = {\n      style,\n      id: this[$uid],\n      class: classNames,\n    };\n\n    if (style.margin) {\n      style.padding = style.margin;\n      delete style.margin;\n    }\n\n    setAccess(this, classNames);\n\n    if (this.name) {\n      attributes.xfaName = this.name;\n    }\n\n    const children = [];\n    const html = {\n      name: \"div\",\n      attributes,\n      children,\n    };\n\n    applyAssist(this, attributes);\n\n    const borderStyle = this.border ? this.border[$toStyle]() : null;\n    const bbox = computeBbox(this, html, availableSpace);\n    const ui = this.ui[$toHTML]().html;\n    if (!ui) {\n      Object.assign(style, borderStyle);\n      return HTMLResult.success(createWrapper(this, html), bbox);\n    }\n\n    if (this[$tabIndex]) {\n      if (ui.children?.[0]) {\n        ui.children[0].attributes.tabindex = this[$tabIndex];\n      } else {\n        ui.attributes.tabindex = this[$tabIndex];\n      }\n    }\n\n    ui.attributes.style ||= Object.create(null);\n\n    let aElement = null;\n\n    if (this.ui.button) {\n      if (ui.children.length === 1) {\n        [aElement] = ui.children.splice(0, 1);\n      }\n      Object.assign(ui.attributes.style, borderStyle);\n    } else {\n      Object.assign(style, borderStyle);\n    }\n\n    children.push(ui);\n\n    if (this.value) {\n      if (this.ui.imageEdit) {\n        ui.children.push(this.value[$toHTML]().html);\n      } else if (!this.ui.button) {\n        let value = \"\";\n        if (this.value.exData) {\n          value = this.value.exData[$text]();\n        } else if (this.value.text) {\n          value = this.value.text[$getExtra]();\n        } else {\n          const htmlValue = this.value[$toHTML]().html;\n          if (htmlValue !== null) {\n            value = htmlValue.children[0].value;\n          }\n        }\n        if (this.ui.textEdit && this.value.text?.maxChars) {\n          ui.children[0].attributes.maxLength = this.value.text.maxChars;\n        }\n\n        if (value) {\n          if (this.ui.numericEdit) {\n            value = parseFloat(value);\n            value = isNaN(value) ? \"\" : value.toString();\n          }\n\n          if (ui.children[0].name === \"textarea\") {\n            ui.children[0].attributes.textContent = value;\n          } else {\n            ui.children[0].attributes.value = value;\n          }\n        }\n      }\n    }\n\n    if (!this.ui.imageEdit && ui.children?.[0] && this.h) {\n      borderDims = borderDims || getBorderDims(this.ui[$getExtra]());\n\n      let captionHeight = 0;\n      if (this.caption && [\"top\", \"bottom\"].includes(this.caption.placement)) {\n        captionHeight = this.caption.reserve;\n        if (captionHeight <= 0) {\n          captionHeight = this.caption[$getExtra](availableSpace).h;\n        }\n        const inputHeight = this.h - captionHeight - marginV - borderDims.h;\n        ui.children[0].attributes.style.height = measureToString(inputHeight);\n      } else {\n        ui.children[0].attributes.style.height = \"100%\";\n      }\n    }\n\n    if (aElement) {\n      ui.children.push(aElement);\n    }\n\n    if (!caption) {\n      if (ui.attributes.class) {\n        // Even if no caption this class will help to center the ui.\n        ui.attributes.class.push(\"xfaLeft\");\n      }\n      this.w = savedW;\n      this.h = savedH;\n\n      return HTMLResult.success(createWrapper(this, html), bbox);\n    }\n\n    if (this.ui.button) {\n      if (style.padding) {\n        delete style.padding;\n      }\n      if (caption.name === \"div\") {\n        caption.name = \"span\";\n      }\n      ui.children.push(caption);\n      return HTMLResult.success(html, bbox);\n    } else if (this.ui.checkButton) {\n      caption.attributes.class[0] = \"xfaCaptionForCheckButton\";\n    }\n\n    ui.attributes.class ||= [];\n\n    ui.children.splice(0, 0, caption);\n\n    switch (this.caption.placement) {\n      case \"left\":\n        ui.attributes.class.push(\"xfaLeft\");\n        break;\n      case \"right\":\n        ui.attributes.class.push(\"xfaRight\");\n        break;\n      case \"top\":\n        ui.attributes.class.push(\"xfaTop\");\n        break;\n      case \"bottom\":\n        ui.attributes.class.push(\"xfaBottom\");\n        break;\n      case \"inline\":\n        // TODO;\n        ui.attributes.class.push(\"xfaLeft\");\n        break;\n    }\n\n    this.w = savedW;\n    this.h = savedH;\n    return HTMLResult.success(createWrapper(this, html), bbox);\n  }\n}\n\nclass Fill extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"fill\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n\n    // One-of properties or none\n    this.linear = null;\n    this.pattern = null;\n    this.radial = null;\n    this.solid = null;\n    this.stipple = null;\n  }\n\n  [$toStyle]() {\n    const parent = this[$getParent]();\n    const grandpa = parent[$getParent]();\n    const ggrandpa = grandpa[$getParent]();\n    const style = Object.create(null);\n\n    // Use for color, i.e. #...\n    let propName = \"color\";\n\n    // Use for non-color, i.e. gradient, radial-gradient...\n    let altPropName = propName;\n\n    if (parent instanceof Border) {\n      propName = \"background-color\";\n      altPropName = \"background\";\n      if (ggrandpa instanceof Ui) {\n        // The default fill color is white.\n        style.backgroundColor = \"white\";\n      }\n    }\n    if (parent instanceof Rectangle || parent instanceof Arc) {\n      propName = altPropName = \"fill\";\n      style.fill = \"white\";\n    }\n\n    for (const name of Object.getOwnPropertyNames(this)) {\n      if (name === \"extras\" || name === \"color\") {\n        continue;\n      }\n      const obj = this[name];\n      if (!(obj instanceof XFAObject)) {\n        continue;\n      }\n\n      const color = obj[$toStyle](this.color);\n      if (color) {\n        style[color.startsWith(\"#\") ? propName : altPropName] = color;\n      }\n      return style;\n    }\n\n    if (this.color?.value) {\n      const color = this.color[$toStyle]();\n      style[color.startsWith(\"#\") ? propName : altPropName] = color;\n    }\n\n    return style;\n  }\n}\n\nclass Filter extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"filter\", /* hasChildren = */ true);\n    this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, [\n      \"\",\n      \"required\",\n      \"optional\",\n      \"none\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.version = getInteger({\n      data: this.version,\n      defaultValue: 5,\n      validate: x => x >= 1 && x <= 5,\n    });\n    this.appearanceFilter = null;\n    this.certificates = null;\n    this.digestMethods = null;\n    this.encodings = null;\n    this.encryptionMethods = null;\n    this.handler = null;\n    this.lockDocument = null;\n    this.mdp = null;\n    this.reasons = null;\n    this.timeStamp = null;\n  }\n}\n\nclass Float extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"float\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$finalize]() {\n    const number = parseFloat(this[$content].trim());\n    this[$content] = isNaN(number) ? null : number;\n  }\n\n  [$toHTML](availableSpace) {\n    return valueToHtml(\n      this[$content] !== null ? this[$content].toString() : \"\"\n    );\n  }\n}\n\nclass Font extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"font\", /* hasChildren = */ true);\n    this.baselineShift = getMeasurement(attributes.baselineShift);\n    this.fontHorizontalScale = getFloat({\n      data: attributes.fontHorizontalScale,\n      defaultValue: 100,\n      validate: x => x >= 0,\n    });\n    this.fontVerticalScale = getFloat({\n      data: attributes.fontVerticalScale,\n      defaultValue: 100,\n      validate: x => x >= 0,\n    });\n    this.id = attributes.id || \"\";\n    this.kerningMode = getStringOption(attributes.kerningMode, [\n      \"none\",\n      \"pair\",\n    ]);\n    this.letterSpacing = getMeasurement(attributes.letterSpacing, \"0\");\n    this.lineThrough = getInteger({\n      data: attributes.lineThrough,\n      defaultValue: 0,\n      validate: x => x === 1 || x === 2,\n    });\n    this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, [\n      \"all\",\n      \"word\",\n    ]);\n    this.overline = getInteger({\n      data: attributes.overline,\n      defaultValue: 0,\n      validate: x => x === 1 || x === 2,\n    });\n    this.overlinePeriod = getStringOption(attributes.overlinePeriod, [\n      \"all\",\n      \"word\",\n    ]);\n    this.posture = getStringOption(attributes.posture, [\"normal\", \"italic\"]);\n    this.size = getMeasurement(attributes.size, \"10pt\");\n    this.typeface = attributes.typeface || \"Courier\";\n    this.underline = getInteger({\n      data: attributes.underline,\n      defaultValue: 0,\n      validate: x => x === 1 || x === 2,\n    });\n    this.underlinePeriod = getStringOption(attributes.underlinePeriod, [\n      \"all\",\n      \"word\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.weight = getStringOption(attributes.weight, [\"normal\", \"bold\"]);\n    this.extras = null;\n    this.fill = null;\n  }\n\n  [$clean](builder) {\n    super[$clean](builder);\n    this[$globalData].usedTypefaces.add(this.typeface);\n  }\n\n  [$toStyle]() {\n    const style = toStyle(this, \"fill\");\n    const color = style.color;\n    if (color) {\n      if (color === \"#000000\") {\n        // Default font color.\n        delete style.color;\n      } else if (!color.startsWith(\"#\")) {\n        // We've a gradient which is not possible for a font color\n        // so use a workaround.\n        style.background = color;\n        style.backgroundClip = \"text\";\n        style.color = \"transparent\";\n      }\n    }\n\n    if (this.baselineShift) {\n      style.verticalAlign = measureToString(this.baselineShift);\n    }\n\n    // TODO: fontHorizontalScale\n    // TODO: fontVerticalScale\n\n    style.fontKerning = this.kerningMode === \"none\" ? \"none\" : \"normal\";\n    style.letterSpacing = measureToString(this.letterSpacing);\n\n    if (this.lineThrough !== 0) {\n      style.textDecoration = \"line-through\";\n      if (this.lineThrough === 2) {\n        style.textDecorationStyle = \"double\";\n      }\n    }\n\n    // TODO: lineThroughPeriod\n\n    if (this.overline !== 0) {\n      style.textDecoration = \"overline\";\n      if (this.overline === 2) {\n        style.textDecorationStyle = \"double\";\n      }\n    }\n\n    // TODO: overlinePeriod\n\n    style.fontStyle = this.posture;\n    style.fontSize = measureToString(0.99 * this.size);\n\n    setFontFamily(this, this, this[$globalData].fontFinder, style);\n\n    if (this.underline !== 0) {\n      style.textDecoration = \"underline\";\n      if (this.underline === 2) {\n        style.textDecorationStyle = \"double\";\n      }\n    }\n\n    // TODO: underlinePeriod\n\n    style.fontWeight = this.weight;\n\n    return style;\n  }\n}\n\nclass Format extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"format\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.picture = null;\n  }\n}\n\nclass Handler extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"handler\");\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Hyphenation extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"hyphenation\");\n    this.excludeAllCaps = getInteger({\n      data: attributes.excludeAllCaps,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.excludeInitialCap = getInteger({\n      data: attributes.excludeInitialCap,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.hyphenate = getInteger({\n      data: attributes.hyphenate,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.id = attributes.id || \"\";\n    this.pushCharacterCount = getInteger({\n      data: attributes.pushCharacterCount,\n      defaultValue: 3,\n      validate: x => x >= 0,\n    });\n    this.remainCharacterCount = getInteger({\n      data: attributes.remainCharacterCount,\n      defaultValue: 3,\n      validate: x => x >= 0,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.wordCharacterCount = getInteger({\n      data: attributes.wordCharacterCount,\n      defaultValue: 7,\n      validate: x => x >= 0,\n    });\n  }\n}\n\nclass Image extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"image\");\n    this.aspect = getStringOption(attributes.aspect, [\n      \"fit\",\n      \"actual\",\n      \"height\",\n      \"none\",\n      \"width\",\n    ]);\n    this.contentType = attributes.contentType || \"\";\n    this.href = attributes.href || \"\";\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.transferEncoding = getStringOption(attributes.transferEncoding, [\n      \"base64\",\n      \"none\",\n      \"package\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$toHTML]() {\n    if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) {\n      return HTMLResult.EMPTY;\n    }\n\n    let buffer = this[$globalData].images?.get(this.href);\n    if (!buffer && (this.href || !this[$content])) {\n      // In general, we don't get remote data and use what we have\n      // in the pdf itself, so no picture for non null href.\n      return HTMLResult.EMPTY;\n    }\n\n    if (!buffer && this.transferEncoding === \"base64\") {\n      buffer = Uint8Array.fromBase64(this[$content]);\n    }\n\n    if (!buffer) {\n      return HTMLResult.EMPTY;\n    }\n\n    if (!this.contentType) {\n      for (const [header, type] of IMAGES_HEADERS) {\n        if (\n          buffer.length > header.length &&\n          header.every((x, i) => x === buffer[i])\n        ) {\n          this.contentType = type;\n          break;\n        }\n      }\n      if (!this.contentType) {\n        return HTMLResult.EMPTY;\n      }\n    }\n\n    // TODO: Firefox doesn't support natively tiff (and tif) format.\n    const blob = new Blob([buffer], { type: this.contentType });\n    let style;\n    switch (this.aspect) {\n      case \"fit\":\n      case \"actual\":\n        // TODO: check what to do with actual.\n        // Normally we should return {auto, auto} for it but\n        // it implies some wrong rendering (see xfa_bug1716816.pdf).\n        break;\n      case \"height\":\n        style = {\n          height: \"100%\",\n          objectFit: \"fill\",\n        };\n        break;\n      case \"none\":\n        style = {\n          width: \"100%\",\n          height: \"100%\",\n          objectFit: \"fill\",\n        };\n        break;\n      case \"width\":\n        style = {\n          width: \"100%\",\n          objectFit: \"fill\",\n        };\n        break;\n    }\n    const parent = this[$getParent]();\n    return HTMLResult.success({\n      name: \"img\",\n      attributes: {\n        class: [\"xfaImage\"],\n        style,\n        src: URL.createObjectURL(blob),\n        alt: parent ? ariaLabel(parent[$getParent]()) : null,\n      },\n    });\n  }\n}\n\nclass ImageEdit extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"imageEdit\", /* hasChildren = */ true);\n    this.data = getStringOption(attributes.data, [\"link\", \"embed\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [$toHTML](availableSpace) {\n    if (this.data === \"embed\") {\n      return HTMLResult.success({\n        name: \"div\",\n        children: [],\n        attributes: {},\n      });\n    }\n\n    return HTMLResult.EMPTY;\n  }\n}\n\nclass Integer extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"integer\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$finalize]() {\n    const number = parseInt(this[$content].trim(), 10);\n    this[$content] = isNaN(number) ? null : number;\n  }\n\n  [$toHTML](availableSpace) {\n    return valueToHtml(\n      this[$content] !== null ? this[$content].toString() : \"\"\n    );\n  }\n}\n\nclass Issuers extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"issuers\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.certificate = new XFAObjectArray();\n  }\n}\n\nclass Items extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"items\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.ref = attributes.ref || \"\";\n    this.save = getInteger({\n      data: attributes.save,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.boolean = new XFAObjectArray();\n    this.date = new XFAObjectArray();\n    this.dateTime = new XFAObjectArray();\n    this.decimal = new XFAObjectArray();\n    this.exData = new XFAObjectArray();\n    this.float = new XFAObjectArray();\n    this.image = new XFAObjectArray();\n    this.integer = new XFAObjectArray();\n    this.text = new XFAObjectArray();\n    this.time = new XFAObjectArray();\n  }\n\n  [$toHTML]() {\n    const output = [];\n    for (const child of this[$getChildren]()) {\n      output.push(child[$text]());\n    }\n    return HTMLResult.success(output);\n  }\n}\n\nclass Keep extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"keep\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    const options = [\"none\", \"contentArea\", \"pageArea\"];\n    this.intact = getStringOption(attributes.intact, options);\n    this.next = getStringOption(attributes.next, options);\n    this.previous = getStringOption(attributes.previous, options);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n}\n\nclass KeyUsage extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"keyUsage\");\n    const options = [\"\", \"yes\", \"no\"];\n    this.crlSign = getStringOption(attributes.crlSign, options);\n    this.dataEncipherment = getStringOption(\n      attributes.dataEncipherment,\n      options\n    );\n    this.decipherOnly = getStringOption(attributes.decipherOnly, options);\n    this.digitalSignature = getStringOption(\n      attributes.digitalSignature,\n      options\n    );\n    this.encipherOnly = getStringOption(attributes.encipherOnly, options);\n    this.id = attributes.id || \"\";\n    this.keyAgreement = getStringOption(attributes.keyAgreement, options);\n    this.keyCertSign = getStringOption(attributes.keyCertSign, options);\n    this.keyEncipherment = getStringOption(attributes.keyEncipherment, options);\n    this.nonRepudiation = getStringOption(attributes.nonRepudiation, options);\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Line extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"line\", /* hasChildren = */ true);\n    this.hand = getStringOption(attributes.hand, [\"even\", \"left\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.slope = getStringOption(attributes.slope, [\"\\\\\", \"/\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.edge = null;\n  }\n\n  [$toHTML]() {\n    const parent = this[$getParent]()[$getParent]();\n    const edge = this.edge || new Edge({});\n    const edgeStyle = edge[$toStyle]();\n    const style = Object.create(null);\n    const thickness = edge.presence === \"visible\" ? edge.thickness : 0;\n    style.strokeWidth = measureToString(thickness);\n    style.stroke = edgeStyle.color;\n    let x1, y1, x2, y2;\n    let width = \"100%\";\n    let height = \"100%\";\n\n    if (parent.w <= thickness) {\n      [x1, y1, x2, y2] = [\"50%\", 0, \"50%\", \"100%\"];\n      width = style.strokeWidth;\n    } else if (parent.h <= thickness) {\n      [x1, y1, x2, y2] = [0, \"50%\", \"100%\", \"50%\"];\n      height = style.strokeWidth;\n    } else if (this.slope === \"\\\\\") {\n      [x1, y1, x2, y2] = [0, 0, \"100%\", \"100%\"];\n    } else {\n      [x1, y1, x2, y2] = [0, \"100%\", \"100%\", 0];\n    }\n\n    const line = {\n      name: \"line\",\n      attributes: {\n        xmlns: SVG_NS,\n        x1,\n        y1,\n        x2,\n        y2,\n        style,\n      },\n    };\n\n    const svg = {\n      name: \"svg\",\n      children: [line],\n      attributes: {\n        xmlns: SVG_NS,\n        width,\n        height,\n        style: {\n          overflow: \"visible\",\n        },\n      },\n    };\n\n    if (hasMargin(parent)) {\n      return HTMLResult.success({\n        name: \"div\",\n        attributes: {\n          style: {\n            display: \"inline\",\n            width: \"100%\",\n            height: \"100%\",\n          },\n        },\n        children: [svg],\n      });\n    }\n\n    svg.attributes.style.position = \"absolute\";\n    return HTMLResult.success(svg);\n  }\n}\n\nclass Linear extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"linear\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\n      \"toRight\",\n      \"toBottom\",\n      \"toLeft\",\n      \"toTop\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [$toStyle](startColor) {\n    startColor = startColor ? startColor[$toStyle]() : \"#FFFFFF\";\n    const transf = this.type.replace(/([RBLT])/, \" $1\").toLowerCase();\n    const endColor = this.color ? this.color[$toStyle]() : \"#000000\";\n    return `linear-gradient(${transf}, ${startColor}, ${endColor})`;\n  }\n}\n\nclass LockDocument extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"lockDocument\");\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$finalize]() {\n    this[$content] = getStringOption(this[$content], [\"auto\", \"0\", \"1\"]);\n  }\n}\n\nclass Manifest extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"manifest\", /* hasChildren = */ true);\n    this.action = getStringOption(attributes.action, [\n      \"include\",\n      \"all\",\n      \"exclude\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.ref = new XFAObjectArray();\n  }\n}\n\nclass Margin extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"margin\", /* hasChildren = */ true);\n    this.bottomInset = getMeasurement(attributes.bottomInset, \"0\");\n    this.id = attributes.id || \"\";\n    this.leftInset = getMeasurement(attributes.leftInset, \"0\");\n    this.rightInset = getMeasurement(attributes.rightInset, \"0\");\n    this.topInset = getMeasurement(attributes.topInset, \"0\");\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n  [$toStyle]() {\n    return {\n      margin:\n        measureToString(this.topInset) +\n        \" \" +\n        measureToString(this.rightInset) +\n        \" \" +\n        measureToString(this.bottomInset) +\n        \" \" +\n        measureToString(this.leftInset),\n    };\n  }\n}\n\nclass Mdp extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"mdp\");\n    this.id = attributes.id || \"\";\n    this.permissions = getInteger({\n      data: attributes.permissions,\n      defaultValue: 2,\n      validate: x => x === 1 || x === 3,\n    });\n    this.signatureType = getStringOption(attributes.signatureType, [\n      \"filler\",\n      \"author\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Medium extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"medium\");\n    this.id = attributes.id || \"\";\n    this.imagingBBox = getBBox(attributes.imagingBBox);\n    this.long = getMeasurement(attributes.long);\n    this.orientation = getStringOption(attributes.orientation, [\n      \"portrait\",\n      \"landscape\",\n    ]);\n    this.short = getMeasurement(attributes.short);\n    this.stock = attributes.stock || \"\";\n    this.trayIn = getStringOption(attributes.trayIn, [\n      \"auto\",\n      \"delegate\",\n      \"pageFront\",\n    ]);\n    this.trayOut = getStringOption(attributes.trayOut, [\"auto\", \"delegate\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Message extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"message\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.text = new XFAObjectArray();\n  }\n}\n\nclass NumericEdit extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"numericEdit\", /* hasChildren = */ true);\n    this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, [\n      \"auto\",\n      \"off\",\n      \"on\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.comb = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: incomplete.\n    const style = toStyle(this, \"border\", \"font\", \"margin\");\n    const field = this[$getParent]()[$getParent]();\n    const html = {\n      name: \"input\",\n      attributes: {\n        type: \"text\",\n        fieldId: field[$uid],\n        dataId: field[$data]?.[$uid] || field[$uid],\n        class: [\"xfaTextfield\"],\n        style,\n        \"aria-label\": ariaLabel(field),\n        \"aria-required\": false,\n      },\n    };\n\n    if (isRequired(field)) {\n      html.attributes[\"aria-required\"] = true;\n      html.attributes.required = true;\n    }\n\n    return HTMLResult.success({\n      name: \"label\",\n      attributes: {\n        class: [\"xfaLabel\"],\n      },\n      children: [html],\n    });\n  }\n}\n\nclass Occur extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"occur\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.initial =\n      attributes.initial !== \"\"\n        ? getInteger({\n            data: attributes.initial,\n            defaultValue: \"\",\n            validate: x => true,\n          })\n        : \"\";\n    this.max =\n      attributes.max !== \"\"\n        ? getInteger({\n            data: attributes.max,\n            defaultValue: -1,\n            validate: x => true,\n          })\n        : \"\";\n    this.min =\n      attributes.min !== \"\"\n        ? getInteger({\n            data: attributes.min,\n            defaultValue: 1,\n            validate: x => true,\n          })\n        : \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n  [$clean]() {\n    const parent = this[$getParent]();\n    const originalMin = this.min;\n\n    if (this.min === \"\") {\n      this.min =\n        parent instanceof PageArea || parent instanceof PageSet ? 0 : 1;\n    }\n    if (this.max === \"\") {\n      if (originalMin === \"\") {\n        this.max =\n          parent instanceof PageArea || parent instanceof PageSet ? -1 : 1;\n      } else {\n        this.max = this.min;\n      }\n    }\n\n    if (this.max !== -1 && this.max < this.min) {\n      this.max = this.min;\n    }\n\n    if (this.initial === \"\") {\n      this.initial = parent instanceof Template ? 1 : this.min;\n    }\n  }\n}\n\nclass Oid extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"oid\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Oids extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"oids\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.oid = new XFAObjectArray();\n  }\n}\n\nclass Overflow extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"overflow\");\n    this.id = attributes.id || \"\";\n    this.leader = attributes.leader || \"\";\n    this.target = attributes.target || \"\";\n    this.trailer = attributes.trailer || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$getExtra]() {\n    if (!this[$extra]) {\n      const parent = this[$getParent]();\n      const root = this[$getTemplateRoot]();\n      const target = root[$searchNode](this.target, parent);\n      const leader = root[$searchNode](this.leader, parent);\n      const trailer = root[$searchNode](this.trailer, parent);\n      this[$extra] = {\n        target: target?.[0] || null,\n        leader: leader?.[0] || null,\n        trailer: trailer?.[0] || null,\n        addLeader: false,\n        addTrailer: false,\n      };\n    }\n    return this[$extra];\n  }\n}\n\nclass PageArea extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"pageArea\", /* hasChildren = */ true);\n    this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, [\n      \"any\",\n      \"blank\",\n      \"notBlank\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.initialNumber = getInteger({\n      data: attributes.initialNumber,\n      defaultValue: 1,\n      validate: x => true,\n    });\n    this.name = attributes.name || \"\";\n    this.numbered = getInteger({\n      data: attributes.numbered,\n      defaultValue: 1,\n      validate: x => true,\n    });\n    this.oddOrEven = getStringOption(attributes.oddOrEven, [\n      \"any\",\n      \"even\",\n      \"odd\",\n    ]);\n    this.pagePosition = getStringOption(attributes.pagePosition, [\n      \"any\",\n      \"first\",\n      \"last\",\n      \"only\",\n      \"rest\",\n    ]);\n    this.relevant = getRelevant(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.desc = null;\n    this.extras = null;\n    this.medium = null;\n    this.occur = null;\n    this.area = new XFAObjectArray();\n    this.contentArea = new XFAObjectArray();\n    this.draw = new XFAObjectArray();\n    this.exclGroup = new XFAObjectArray();\n    this.field = new XFAObjectArray();\n    this.subform = new XFAObjectArray();\n  }\n\n  [$isUsable]() {\n    if (!this[$extra]) {\n      this[$extra] = {\n        numberOfUse: 0,\n      };\n      return true;\n    }\n    return (\n      !this.occur ||\n      this.occur.max === -1 ||\n      this[$extra].numberOfUse < this.occur.max\n    );\n  }\n\n  [$cleanPage]() {\n    delete this[$extra];\n  }\n\n  [$getNextPage]() {\n    this[$extra] ||= {\n      numberOfUse: 0,\n    };\n\n    const parent = this[$getParent]();\n    if (parent.relation === \"orderedOccurrence\") {\n      if (this[$isUsable]()) {\n        this[$extra].numberOfUse += 1;\n        return this;\n      }\n    }\n\n    return parent[$getNextPage]();\n  }\n\n  [$getAvailableSpace]() {\n    return this[$extra].space || { width: 0, height: 0 };\n  }\n\n  [$toHTML]() {\n    // TODO: incomplete.\n    this[$extra] ||= {\n      numberOfUse: 1,\n    };\n\n    const children = [];\n    this[$extra].children = children;\n\n    const style = Object.create(null);\n    if (this.medium && this.medium.short && this.medium.long) {\n      style.width = measureToString(this.medium.short);\n      style.height = measureToString(this.medium.long);\n      this[$extra].space = {\n        width: this.medium.short,\n        height: this.medium.long,\n      };\n      if (this.medium.orientation === \"landscape\") {\n        const x = style.width;\n        style.width = style.height;\n        style.height = x;\n        this[$extra].space = {\n          width: this.medium.long,\n          height: this.medium.short,\n        };\n      }\n    } else {\n      warn(\"XFA - No medium specified in pageArea: please file a bug.\");\n    }\n\n    this[$childrenToHTML]({\n      filter: new Set([\"area\", \"draw\", \"field\", \"subform\"]),\n      include: true,\n    });\n\n    // contentarea must be the last container to be sure it is\n    // on top of the others.\n    this[$childrenToHTML]({\n      filter: new Set([\"contentArea\"]),\n      include: true,\n    });\n\n    return HTMLResult.success({\n      name: \"div\",\n      children,\n      attributes: {\n        class: [\"xfaPage\"],\n        id: this[$uid],\n        style,\n        xfaName: this.name,\n      },\n    });\n  }\n}\n\nclass PageSet extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"pageSet\", /* hasChildren = */ true);\n    this.duplexImposition = getStringOption(attributes.duplexImposition, [\n      \"longEdge\",\n      \"shortEdge\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.relation = getStringOption(attributes.relation, [\n      \"orderedOccurrence\",\n      \"duplexPaginated\",\n      \"simplexPaginated\",\n    ]);\n    this.relevant = getRelevant(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.occur = null;\n    this.pageArea = new XFAObjectArray();\n    this.pageSet = new XFAObjectArray();\n  }\n\n  [$cleanPage]() {\n    for (const page of this.pageArea.children) {\n      page[$cleanPage]();\n    }\n    for (const page of this.pageSet.children) {\n      page[$cleanPage]();\n    }\n  }\n\n  [$isUsable]() {\n    return (\n      !this.occur ||\n      this.occur.max === -1 ||\n      this[$extra].numberOfUse < this.occur.max\n    );\n  }\n\n  [$getNextPage]() {\n    this[$extra] ||= {\n      numberOfUse: 1,\n      pageIndex: -1,\n      pageSetIndex: -1,\n    };\n\n    if (this.relation === \"orderedOccurrence\") {\n      if (this[$extra].pageIndex + 1 < this.pageArea.children.length) {\n        this[$extra].pageIndex += 1;\n        const pageArea = this.pageArea.children[this[$extra].pageIndex];\n        return pageArea[$getNextPage]();\n      }\n\n      if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) {\n        this[$extra].pageSetIndex += 1;\n        return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage]();\n      }\n\n      if (this[$isUsable]()) {\n        this[$extra].numberOfUse += 1;\n        this[$extra].pageIndex = -1;\n        this[$extra].pageSetIndex = -1;\n        return this[$getNextPage]();\n      }\n\n      const parent = this[$getParent]();\n      if (parent instanceof PageSet) {\n        return parent[$getNextPage]();\n      }\n\n      this[$cleanPage]();\n      return this[$getNextPage]();\n    }\n    const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber;\n    const parity = pageNumber % 2 === 0 ? \"even\" : \"odd\";\n    const position = pageNumber === 0 ? \"first\" : \"rest\";\n\n    let page = this.pageArea.children.find(\n      p => p.oddOrEven === parity && p.pagePosition === position\n    );\n    if (page) {\n      return page;\n    }\n\n    page = this.pageArea.children.find(\n      p => p.oddOrEven === \"any\" && p.pagePosition === position\n    );\n    if (page) {\n      return page;\n    }\n\n    page = this.pageArea.children.find(\n      p => p.oddOrEven === \"any\" && p.pagePosition === \"any\"\n    );\n    if (page) {\n      return page;\n    }\n\n    return this.pageArea.children[0];\n  }\n}\n\nclass Para extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"para\", /* hasChildren = */ true);\n    this.hAlign = getStringOption(attributes.hAlign, [\n      \"left\",\n      \"center\",\n      \"justify\",\n      \"justifyAll\",\n      \"radix\",\n      \"right\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.lineHeight = attributes.lineHeight\n      ? getMeasurement(attributes.lineHeight, \"0pt\")\n      : \"\";\n    this.marginLeft = attributes.marginLeft\n      ? getMeasurement(attributes.marginLeft, \"0pt\")\n      : \"\";\n    this.marginRight = attributes.marginRight\n      ? getMeasurement(attributes.marginRight, \"0pt\")\n      : \"\";\n    this.orphans = getInteger({\n      data: attributes.orphans,\n      defaultValue: 0,\n      validate: x => x >= 0,\n    });\n    this.preserve = attributes.preserve || \"\";\n    this.radixOffset = attributes.radixOffset\n      ? getMeasurement(attributes.radixOffset, \"0pt\")\n      : \"\";\n    this.spaceAbove = attributes.spaceAbove\n      ? getMeasurement(attributes.spaceAbove, \"0pt\")\n      : \"\";\n    this.spaceBelow = attributes.spaceBelow\n      ? getMeasurement(attributes.spaceBelow, \"0pt\")\n      : \"\";\n    this.tabDefault = attributes.tabDefault\n      ? getMeasurement(this.tabDefault)\n      : \"\";\n    this.tabStops = (attributes.tabStops || \"\")\n      .trim()\n      .split(/\\s+/)\n      .map((x, i) => (i % 2 === 1 ? getMeasurement(x) : x));\n    this.textIndent = attributes.textIndent\n      ? getMeasurement(attributes.textIndent, \"0pt\")\n      : \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.vAlign = getStringOption(attributes.vAlign, [\n      \"top\",\n      \"bottom\",\n      \"middle\",\n    ]);\n    this.widows = getInteger({\n      data: attributes.widows,\n      defaultValue: 0,\n      validate: x => x >= 0,\n    });\n    this.hyphenation = null;\n  }\n\n  [$toStyle]() {\n    const style = toStyle(this, \"hAlign\");\n    if (this.marginLeft !== \"\") {\n      style.paddingLeft = measureToString(this.marginLeft);\n    }\n    if (this.marginRight !== \"\") {\n      style.paddingRight = measureToString(this.marginRight);\n    }\n    if (this.spaceAbove !== \"\") {\n      style.paddingTop = measureToString(this.spaceAbove);\n    }\n    if (this.spaceBelow !== \"\") {\n      style.paddingBottom = measureToString(this.spaceBelow);\n    }\n    if (this.textIndent !== \"\") {\n      style.textIndent = measureToString(this.textIndent);\n      fixTextIndent(style);\n    }\n\n    if (this.lineHeight > 0) {\n      style.lineHeight = measureToString(this.lineHeight);\n    }\n\n    if (this.tabDefault !== \"\") {\n      style.tabSize = measureToString(this.tabDefault);\n    }\n\n    if (this.tabStops.length > 0) {\n      // TODO\n    }\n\n    if (this.hyphenatation) {\n      Object.assign(style, this.hyphenatation[$toStyle]());\n    }\n\n    return style;\n  }\n}\n\nclass PasswordEdit extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"passwordEdit\", /* hasChildren = */ true);\n    this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, [\n      \"auto\",\n      \"off\",\n      \"on\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.passwordChar = attributes.passwordChar || \"*\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.margin = null;\n  }\n}\n\nclass Pattern extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"pattern\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\n      \"crossHatch\",\n      \"crossDiagonal\",\n      \"diagonalLeft\",\n      \"diagonalRight\",\n      \"horizontal\",\n      \"vertical\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [$toStyle](startColor) {\n    startColor = startColor ? startColor[$toStyle]() : \"#FFFFFF\";\n    const endColor = this.color ? this.color[$toStyle]() : \"#000000\";\n    const width = 5;\n    const cmd = \"repeating-linear-gradient\";\n    const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${\n      2 * width\n    }px`;\n    switch (this.type) {\n      case \"crossHatch\":\n        return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`;\n      case \"crossDiagonal\":\n        return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`;\n      case \"diagonalLeft\":\n        return `${cmd}(45deg,${colors})`;\n      case \"diagonalRight\":\n        return `${cmd}(-45deg,${colors})`;\n      case \"horizontal\":\n        return `${cmd}(to top,${colors})`;\n      case \"vertical\":\n        return `${cmd}(to right,${colors})`;\n    }\n\n    return \"\";\n  }\n}\n\nclass Picture extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"picture\");\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Proto extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"proto\", /* hasChildren = */ true);\n    this.appearanceFilter = new XFAObjectArray();\n    this.arc = new XFAObjectArray();\n    this.area = new XFAObjectArray();\n    this.assist = new XFAObjectArray();\n    this.barcode = new XFAObjectArray();\n    this.bindItems = new XFAObjectArray();\n    this.bookend = new XFAObjectArray();\n    this.boolean = new XFAObjectArray();\n    this.border = new XFAObjectArray();\n    this.break = new XFAObjectArray();\n    this.breakAfter = new XFAObjectArray();\n    this.breakBefore = new XFAObjectArray();\n    this.button = new XFAObjectArray();\n    this.calculate = new XFAObjectArray();\n    this.caption = new XFAObjectArray();\n    this.certificate = new XFAObjectArray();\n    this.certificates = new XFAObjectArray();\n    this.checkButton = new XFAObjectArray();\n    this.choiceList = new XFAObjectArray();\n    this.color = new XFAObjectArray();\n    this.comb = new XFAObjectArray();\n    this.connect = new XFAObjectArray();\n    this.contentArea = new XFAObjectArray();\n    this.corner = new XFAObjectArray();\n    this.date = new XFAObjectArray();\n    this.dateTime = new XFAObjectArray();\n    this.dateTimeEdit = new XFAObjectArray();\n    this.decimal = new XFAObjectArray();\n    this.defaultUi = new XFAObjectArray();\n    this.desc = new XFAObjectArray();\n    this.digestMethod = new XFAObjectArray();\n    this.digestMethods = new XFAObjectArray();\n    this.draw = new XFAObjectArray();\n    this.edge = new XFAObjectArray();\n    this.encoding = new XFAObjectArray();\n    this.encodings = new XFAObjectArray();\n    this.encrypt = new XFAObjectArray();\n    this.encryptData = new XFAObjectArray();\n    this.encryption = new XFAObjectArray();\n    this.encryptionMethod = new XFAObjectArray();\n    this.encryptionMethods = new XFAObjectArray();\n    this.event = new XFAObjectArray();\n    this.exData = new XFAObjectArray();\n    this.exObject = new XFAObjectArray();\n    this.exclGroup = new XFAObjectArray();\n    this.execute = new XFAObjectArray();\n    this.extras = new XFAObjectArray();\n    this.field = new XFAObjectArray();\n    this.fill = new XFAObjectArray();\n    this.filter = new XFAObjectArray();\n    this.float = new XFAObjectArray();\n    this.font = new XFAObjectArray();\n    this.format = new XFAObjectArray();\n    this.handler = new XFAObjectArray();\n    this.hyphenation = new XFAObjectArray();\n    this.image = new XFAObjectArray();\n    this.imageEdit = new XFAObjectArray();\n    this.integer = new XFAObjectArray();\n    this.issuers = new XFAObjectArray();\n    this.items = new XFAObjectArray();\n    this.keep = new XFAObjectArray();\n    this.keyUsage = new XFAObjectArray();\n    this.line = new XFAObjectArray();\n    this.linear = new XFAObjectArray();\n    this.lockDocument = new XFAObjectArray();\n    this.manifest = new XFAObjectArray();\n    this.margin = new XFAObjectArray();\n    this.mdp = new XFAObjectArray();\n    this.medium = new XFAObjectArray();\n    this.message = new XFAObjectArray();\n    this.numericEdit = new XFAObjectArray();\n    this.occur = new XFAObjectArray();\n    this.oid = new XFAObjectArray();\n    this.oids = new XFAObjectArray();\n    this.overflow = new XFAObjectArray();\n    this.pageArea = new XFAObjectArray();\n    this.pageSet = new XFAObjectArray();\n    this.para = new XFAObjectArray();\n    this.passwordEdit = new XFAObjectArray();\n    this.pattern = new XFAObjectArray();\n    this.picture = new XFAObjectArray();\n    this.radial = new XFAObjectArray();\n    this.reason = new XFAObjectArray();\n    this.reasons = new XFAObjectArray();\n    this.rectangle = new XFAObjectArray();\n    this.ref = new XFAObjectArray();\n    this.script = new XFAObjectArray();\n    this.setProperty = new XFAObjectArray();\n    this.signData = new XFAObjectArray();\n    this.signature = new XFAObjectArray();\n    this.signing = new XFAObjectArray();\n    this.solid = new XFAObjectArray();\n    this.speak = new XFAObjectArray();\n    this.stipple = new XFAObjectArray();\n    this.subform = new XFAObjectArray();\n    this.subformSet = new XFAObjectArray();\n    this.subjectDN = new XFAObjectArray();\n    this.subjectDNs = new XFAObjectArray();\n    this.submit = new XFAObjectArray();\n    this.text = new XFAObjectArray();\n    this.textEdit = new XFAObjectArray();\n    this.time = new XFAObjectArray();\n    this.timeStamp = new XFAObjectArray();\n    this.toolTip = new XFAObjectArray();\n    this.traversal = new XFAObjectArray();\n    this.traverse = new XFAObjectArray();\n    this.ui = new XFAObjectArray();\n    this.validate = new XFAObjectArray();\n    this.value = new XFAObjectArray();\n    this.variables = new XFAObjectArray();\n  }\n}\n\nclass Radial extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"radial\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"toEdge\", \"toCenter\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [$toStyle](startColor) {\n    startColor = startColor ? startColor[$toStyle]() : \"#FFFFFF\";\n    const endColor = this.color ? this.color[$toStyle]() : \"#000000\";\n    const colors =\n      this.type === \"toEdge\"\n        ? `${startColor},${endColor}`\n        : `${endColor},${startColor}`;\n    return `radial-gradient(circle at center, ${colors})`;\n  }\n}\n\nclass Reason extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"reason\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Reasons extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"reasons\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.reason = new XFAObjectArray();\n  }\n}\n\nclass Rectangle extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"rectangle\", /* hasChildren = */ true);\n    this.hand = getStringOption(attributes.hand, [\"even\", \"left\", \"right\"]);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.corner = new XFAObjectArray(4);\n    this.edge = new XFAObjectArray(4);\n    this.fill = null;\n  }\n\n  [$toHTML]() {\n    const edge = this.edge.children.length\n      ? this.edge.children[0]\n      : new Edge({});\n    const edgeStyle = edge[$toStyle]();\n    const style = Object.create(null);\n    if (this.fill?.presence === \"visible\") {\n      Object.assign(style, this.fill[$toStyle]());\n    } else {\n      style.fill = \"transparent\";\n    }\n    style.strokeWidth = measureToString(\n      edge.presence === \"visible\" ? edge.thickness : 0\n    );\n    style.stroke = edgeStyle.color;\n\n    const corner = this.corner.children.length\n      ? this.corner.children[0]\n      : new Corner({});\n    const cornerStyle = corner[$toStyle]();\n\n    const rect = {\n      name: \"rect\",\n      attributes: {\n        xmlns: SVG_NS,\n        width: \"100%\",\n        height: \"100%\",\n        x: 0,\n        y: 0,\n        rx: cornerStyle.radius,\n        ry: cornerStyle.radius,\n        style,\n      },\n    };\n\n    const svg = {\n      name: \"svg\",\n      children: [rect],\n      attributes: {\n        xmlns: SVG_NS,\n        style: {\n          overflow: \"visible\",\n        },\n        width: \"100%\",\n        height: \"100%\",\n      },\n    };\n\n    const parent = this[$getParent]()[$getParent]();\n    if (hasMargin(parent)) {\n      return HTMLResult.success({\n        name: \"div\",\n        attributes: {\n          style: {\n            display: \"inline\",\n            width: \"100%\",\n            height: \"100%\",\n          },\n        },\n        children: [svg],\n      });\n    }\n\n    svg.attributes.style.position = \"absolute\";\n    return HTMLResult.success(svg);\n  }\n}\n\nclass RefElement extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"ref\");\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Script extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"script\");\n    this.binding = attributes.binding || \"\";\n    this.contentType = attributes.contentType || \"\";\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.runAt = getStringOption(attributes.runAt, [\n      \"client\",\n      \"both\",\n      \"server\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass SetProperty extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"setProperty\");\n    this.connection = attributes.connection || \"\";\n    this.ref = attributes.ref || \"\";\n    this.target = attributes.target || \"\";\n  }\n}\n\nclass SignData extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"signData\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.operation = getStringOption(attributes.operation, [\n      \"sign\",\n      \"clear\",\n      \"verify\",\n    ]);\n    this.ref = attributes.ref || \"\";\n    this.target = attributes.target || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.filter = null;\n    this.manifest = null;\n  }\n}\n\nclass Signature extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"signature\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"PDF1.3\", \"PDF1.6\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.border = null;\n    this.extras = null;\n    this.filter = null;\n    this.manifest = null;\n    this.margin = null;\n  }\n}\n\nclass Signing extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"signing\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.certificate = new XFAObjectArray();\n  }\n}\n\nclass Solid extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"solid\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n  }\n\n  [$toStyle](startColor) {\n    return startColor ? startColor[$toStyle]() : \"#FFFFFF\";\n  }\n}\n\nclass Speak extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"speak\");\n    this.disable = getInteger({\n      data: attributes.disable,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.id = attributes.id || \"\";\n    this.priority = getStringOption(attributes.priority, [\n      \"custom\",\n      \"caption\",\n      \"name\",\n      \"toolTip\",\n    ]);\n    this.rid = attributes.rid || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Stipple extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"stipple\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.rate = getInteger({\n      data: attributes.rate,\n      defaultValue: 50,\n      validate: x => x >= 0 && x <= 100,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.color = null;\n    this.extras = null;\n  }\n\n  [$toStyle](bgColor) {\n    const alpha = this.rate / 100;\n    return Util.makeHexColor(\n      Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha),\n      Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha),\n      Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha)\n    );\n  }\n}\n\nclass Subform extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"subform\", /* hasChildren = */ true);\n    this.access = getStringOption(attributes.access, [\n      \"open\",\n      \"nonInteractive\",\n      \"protected\",\n      \"readOnly\",\n    ]);\n    this.allowMacro = getInteger({\n      data: attributes.allowMacro,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.anchorType = getStringOption(attributes.anchorType, [\n      \"topLeft\",\n      \"bottomCenter\",\n      \"bottomLeft\",\n      \"bottomRight\",\n      \"middleCenter\",\n      \"middleLeft\",\n      \"middleRight\",\n      \"topCenter\",\n      \"topRight\",\n    ]);\n    this.colSpan = getInteger({\n      data: attributes.colSpan,\n      defaultValue: 1,\n      validate: n => n >= 1 || n === -1,\n    });\n    this.columnWidths = (attributes.columnWidths || \"\")\n      .trim()\n      .split(/\\s+/)\n      .map(x => (x === \"-1\" ? -1 : getMeasurement(x)));\n    this.h = attributes.h ? getMeasurement(attributes.h) : \"\";\n    this.hAlign = getStringOption(attributes.hAlign, [\n      \"left\",\n      \"center\",\n      \"justify\",\n      \"justifyAll\",\n      \"radix\",\n      \"right\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.layout = getStringOption(attributes.layout, [\n      \"position\",\n      \"lr-tb\",\n      \"rl-row\",\n      \"rl-tb\",\n      \"row\",\n      \"table\",\n      \"tb\",\n    ]);\n    this.locale = attributes.locale || \"\";\n    this.maxH = getMeasurement(attributes.maxH, \"0pt\");\n    this.maxW = getMeasurement(attributes.maxW, \"0pt\");\n    this.mergeMode = getStringOption(attributes.mergeMode, [\n      \"consumeData\",\n      \"matchTemplate\",\n    ]);\n    this.minH = getMeasurement(attributes.minH, \"0pt\");\n    this.minW = getMeasurement(attributes.minW, \"0pt\");\n    this.name = attributes.name || \"\";\n    this.presence = getStringOption(attributes.presence, [\n      \"visible\",\n      \"hidden\",\n      \"inactive\",\n      \"invisible\",\n    ]);\n    this.relevant = getRelevant(attributes.relevant);\n    this.restoreState = getStringOption(attributes.restoreState, [\n      \"manual\",\n      \"auto\",\n    ]);\n    this.scope = getStringOption(attributes.scope, [\"name\", \"none\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.w = attributes.w ? getMeasurement(attributes.w) : \"\";\n    this.x = getMeasurement(attributes.x, \"0pt\");\n    this.y = getMeasurement(attributes.y, \"0pt\");\n    this.assist = null;\n    this.bind = null;\n    this.bookend = null;\n    this.border = null;\n    this.break = null;\n    this.calculate = null;\n    this.desc = null;\n    this.extras = null;\n    this.keep = null;\n    this.margin = null;\n    this.occur = null;\n    this.overflow = null;\n    this.pageSet = null;\n    this.para = null;\n    this.traversal = null;\n    this.validate = null;\n    this.variables = null;\n    this.area = new XFAObjectArray();\n    this.breakAfter = new XFAObjectArray();\n    this.breakBefore = new XFAObjectArray();\n    this.connect = new XFAObjectArray();\n    this.draw = new XFAObjectArray();\n    this.event = new XFAObjectArray();\n    this.exObject = new XFAObjectArray();\n    this.exclGroup = new XFAObjectArray();\n    this.field = new XFAObjectArray();\n    this.proto = new XFAObjectArray();\n    this.setProperty = new XFAObjectArray();\n    this.subform = new XFAObjectArray();\n    this.subformSet = new XFAObjectArray();\n  }\n\n  [$getSubformParent]() {\n    const parent = this[$getParent]();\n    if (parent instanceof SubformSet) {\n      return parent[$getSubformParent]();\n    }\n    return parent;\n  }\n\n  [$isBindable]() {\n    return true;\n  }\n\n  [$isThereMoreWidth]() {\n    return (\n      (this.layout.endsWith(\"-tb\") &&\n        this[$extra].attempt === 0 &&\n        this[$extra].numberInLine > 0) ||\n      this[$getParent]()[$isThereMoreWidth]()\n    );\n  }\n\n  *[$getContainedChildren]() {\n    // This function is overriden in order to fake that subforms under\n    // this set are in fact under parent subform.\n    yield* getContainedChildren(this);\n  }\n\n  [$flushHTML]() {\n    return flushHTML(this);\n  }\n\n  [$addHTML](html, bbox) {\n    addHTML(this, html, bbox);\n  }\n\n  [$getAvailableSpace]() {\n    return getAvailableSpace(this);\n  }\n\n  [$isSplittable]() {\n    // We cannot cache the result here because the contentArea\n    // can change.\n    const parent = this[$getSubformParent]();\n    if (!parent[$isSplittable]()) {\n      return false;\n    }\n\n    if (this[$extra]._isSplittable !== undefined) {\n      return this[$extra]._isSplittable;\n    }\n\n    if (this.layout === \"position\" || this.layout.includes(\"row\")) {\n      this[$extra]._isSplittable = false;\n      return false;\n    }\n\n    if (this.keep && this.keep.intact !== \"none\") {\n      this[$extra]._isSplittable = false;\n      return false;\n    }\n\n    if (parent.layout?.endsWith(\"-tb\") && parent[$extra].numberInLine !== 0) {\n      // If parent can fit in w=100 and there's already an element which takes\n      // 90 then we've 10 for this element. Suppose this element has a tb layout\n      // and 5 elements have a width of 7 and the 6th has a width of 20:\n      // then this element (and all its content) must move on the next line.\n      // If this element is splittable then the first 5 children will stay\n      // at the end of the line: we don't want that.\n      return false;\n    }\n\n    this[$extra]._isSplittable = true;\n\n    return true;\n  }\n\n  [$toHTML](availableSpace) {\n    setTabIndex(this);\n\n    if (this.break) {\n      // break element is deprecated so plug it on one of its replacement\n      // breakBefore or breakAfter.\n      if (this.break.after !== \"auto\" || this.break.afterTarget !== \"\") {\n        const node = new BreakAfter({\n          targetType: this.break.after,\n          target: this.break.afterTarget,\n          startNew: this.break.startNew.toString(),\n        });\n        node[$globalData] = this[$globalData];\n        this[$appendChild](node);\n        this.breakAfter.push(node);\n      }\n\n      if (this.break.before !== \"auto\" || this.break.beforeTarget !== \"\") {\n        const node = new BreakBefore({\n          targetType: this.break.before,\n          target: this.break.beforeTarget,\n          startNew: this.break.startNew.toString(),\n        });\n        node[$globalData] = this[$globalData];\n        this[$appendChild](node);\n        this.breakBefore.push(node);\n      }\n\n      if (this.break.overflowTarget !== \"\") {\n        const node = new Overflow({\n          target: this.break.overflowTarget,\n          leader: this.break.overflowLeader,\n          trailer: this.break.overflowTrailer,\n        });\n        node[$globalData] = this[$globalData];\n        this[$appendChild](node);\n        this.overflow.push(node);\n      }\n\n      this[$removeChild](this.break);\n      this.break = null;\n    }\n\n    if (this.presence === \"hidden\" || this.presence === \"inactive\") {\n      return HTMLResult.EMPTY;\n    }\n\n    if (\n      this.breakBefore.children.length > 1 ||\n      this.breakAfter.children.length > 1\n    ) {\n      // Specs are always talking about the breakBefore element\n      // and it doesn't really make sense to have several ones.\n      warn(\n        \"XFA - Several breakBefore or breakAfter in subforms: please file a bug.\"\n      );\n    }\n\n    if (this.breakBefore.children.length >= 1) {\n      const breakBefore = this.breakBefore.children[0];\n      if (handleBreak(breakBefore)) {\n        return HTMLResult.breakNode(breakBefore);\n      }\n    }\n\n    if (this[$extra]?.afterBreakAfter) {\n      return HTMLResult.EMPTY;\n    }\n\n    // TODO: incomplete.\n    fixDimensions(this);\n    const children = [];\n    const attributes = {\n      id: this[$uid],\n      class: [],\n    };\n\n    setAccess(this, attributes.class);\n\n    this[$extra] ||= Object.create(null);\n\n    Object.assign(this[$extra], {\n      children,\n      line: null,\n      attributes,\n      attempt: 0,\n      numberInLine: 0,\n      availableSpace: {\n        width: Math.min(this.w || Infinity, availableSpace.width),\n        height: Math.min(this.h || Infinity, availableSpace.height),\n      },\n      width: 0,\n      height: 0,\n      prevHeight: 0,\n      currentWidth: 0,\n    });\n\n    const root = this[$getTemplateRoot]();\n    const savedNoLayoutFailure = root[$extra].noLayoutFailure;\n\n    const isSplittable = this[$isSplittable]();\n    if (!isSplittable) {\n      setFirstUnsplittable(this);\n    }\n\n    if (!checkDimensions(this, availableSpace)) {\n      return HTMLResult.FAILURE;\n    }\n\n    const filter = new Set([\n      \"area\",\n      \"draw\",\n      \"exclGroup\",\n      \"field\",\n      \"subform\",\n      \"subformSet\",\n    ]);\n\n    if (this.layout.includes(\"row\")) {\n      const columnWidths = this[$getSubformParent]().columnWidths;\n      if (Array.isArray(columnWidths) && columnWidths.length > 0) {\n        this[$extra].columnWidths = columnWidths;\n        this[$extra].currentColumn = 0;\n      }\n    }\n\n    const style = toStyle(\n      this,\n      \"anchorType\",\n      \"dimensions\",\n      \"position\",\n      \"presence\",\n      \"border\",\n      \"margin\",\n      \"hAlign\"\n    );\n    const classNames = [\"xfaSubform\"];\n    const cl = layoutClass(this);\n    if (cl) {\n      classNames.push(cl);\n    }\n\n    attributes.style = style;\n    attributes.class = classNames;\n\n    if (this.name) {\n      attributes.xfaName = this.name;\n    }\n\n    if (this.overflow) {\n      const overflowExtra = this.overflow[$getExtra]();\n      if (overflowExtra.addLeader) {\n        overflowExtra.addLeader = false;\n        handleOverflow(this, overflowExtra.leader, availableSpace);\n      }\n    }\n\n    this[$pushPara]();\n    const isLrTb = this.layout === \"lr-tb\" || this.layout === \"rl-tb\";\n    const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;\n    for (; this[$extra].attempt < maxRun; this[$extra].attempt++) {\n      if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {\n        // If the layout is lr-tb then having attempt equals to\n        // MAX_ATTEMPTS_FOR_LRTB_LAYOUT-1 means that we're trying to layout\n        // on the next line so this on is empty.\n        this[$extra].numberInLine = 0;\n      }\n      const result = this[$childrenToHTML]({\n        filter,\n        include: true,\n      });\n      if (result.success) {\n        break;\n      }\n      if (result.isBreak()) {\n        this[$popPara]();\n        return result;\n      }\n      if (\n        isLrTb &&\n        this[$extra].attempt === 0 &&\n        this[$extra].numberInLine === 0 &&\n        !root[$extra].noLayoutFailure\n      ) {\n        // We're failing to put the first element on the line so no\n        // need to test on the next line.\n        // The goal is not only to avoid some useless checks but to avoid\n        // bugs too: if a descendant managed to put a node and failed\n        // on the next one, going to the next step here will imply to\n        // visit the descendant again, clear [$extra].children and restart\n        // on the failing node, consequently the first node just disappears\n        // because it has never been flushed.\n        this[$extra].attempt = maxRun;\n        break;\n      }\n    }\n\n    this[$popPara]();\n    if (!isSplittable) {\n      unsetFirstUnsplittable(this);\n    }\n    root[$extra].noLayoutFailure = savedNoLayoutFailure;\n\n    if (this[$extra].attempt === maxRun) {\n      if (this.overflow) {\n        this[$getTemplateRoot]()[$extra].overflowNode = this.overflow;\n      }\n\n      if (!isSplittable) {\n        // Since a new try will happen in a new container with maybe\n        // new dimensions, we invalidate already layed out components.\n        delete this[$extra];\n      }\n      return HTMLResult.FAILURE;\n    }\n\n    if (this.overflow) {\n      const overflowExtra = this.overflow[$getExtra]();\n      if (overflowExtra.addTrailer) {\n        overflowExtra.addTrailer = false;\n        handleOverflow(this, overflowExtra.trailer, availableSpace);\n      }\n    }\n\n    let marginH = 0;\n    let marginV = 0;\n    if (this.margin) {\n      marginH = this.margin.leftInset + this.margin.rightInset;\n      marginV = this.margin.topInset + this.margin.bottomInset;\n    }\n\n    const width = Math.max(this[$extra].width + marginH, this.w || 0);\n    const height = Math.max(this[$extra].height + marginV, this.h || 0);\n    const bbox = [this.x, this.y, width, height];\n\n    if (this.w === \"\") {\n      style.width = measureToString(width);\n    }\n    if (this.h === \"\") {\n      style.height = measureToString(height);\n    }\n\n    if (\n      (style.width === \"0px\" || style.height === \"0px\") &&\n      children.length === 0\n    ) {\n      return HTMLResult.EMPTY;\n    }\n\n    const html = {\n      name: \"div\",\n      attributes,\n      children,\n    };\n\n    applyAssist(this, attributes);\n\n    const result = HTMLResult.success(createWrapper(this, html), bbox);\n\n    if (this.breakAfter.children.length >= 1) {\n      const breakAfter = this.breakAfter.children[0];\n      if (handleBreak(breakAfter)) {\n        this[$extra].afterBreakAfter = result;\n        return HTMLResult.breakNode(breakAfter);\n      }\n    }\n\n    delete this[$extra];\n\n    return result;\n  }\n}\n\nclass SubformSet extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"subformSet\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.relation = getStringOption(attributes.relation, [\n      \"ordered\",\n      \"choice\",\n      \"unordered\",\n    ]);\n    this.relevant = getRelevant(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.bookend = null;\n    this.break = null;\n    this.desc = null;\n    this.extras = null;\n    this.occur = null;\n    this.overflow = null;\n    this.breakAfter = new XFAObjectArray();\n    this.breakBefore = new XFAObjectArray();\n    this.subform = new XFAObjectArray();\n    this.subformSet = new XFAObjectArray();\n\n    // TODO: need to handle break stuff and relation.\n  }\n\n  *[$getContainedChildren]() {\n    // This function is overriden in order to fake that subforms under\n    // this set are in fact under parent subform.\n    yield* getContainedChildren(this);\n  }\n\n  [$getSubformParent]() {\n    let parent = this[$getParent]();\n    while (!(parent instanceof Subform)) {\n      parent = parent[$getParent]();\n    }\n    return parent;\n  }\n\n  [$isBindable]() {\n    return true;\n  }\n}\n\nclass SubjectDN extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"subjectDN\");\n    this.delimiter = attributes.delimiter || \",\";\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$finalize]() {\n    this[$content] = new Map(\n      this[$content].split(this.delimiter).map(kv => {\n        kv = kv.split(\"=\", 2);\n        kv[0] = kv[0].trim();\n        return kv;\n      })\n    );\n  }\n}\n\nclass SubjectDNs extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"subjectDNs\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.subjectDN = new XFAObjectArray();\n  }\n}\n\nclass Submit extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"submit\", /* hasChildren = */ true);\n    this.embedPDF = getInteger({\n      data: attributes.embedPDF,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.format = getStringOption(attributes.format, [\n      \"xdp\",\n      \"formdata\",\n      \"pdf\",\n      \"urlencoded\",\n      \"xfd\",\n      \"xml\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.target = attributes.target || \"\";\n    this.textEncoding = getKeyword({\n      data: attributes.textEncoding\n        ? attributes.textEncoding.toLowerCase()\n        : \"\",\n      defaultValue: \"\",\n      validate: k =>\n        [\n          \"utf-8\",\n          \"big-five\",\n          \"fontspecific\",\n          \"gbk\",\n          \"gb-18030\",\n          \"gb-2312\",\n          \"ksc-5601\",\n          \"none\",\n          \"shift-jis\",\n          \"ucs-2\",\n          \"utf-16\",\n        ].includes(k) || k.match(/iso-8859-\\d{2}/),\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.xdpContent = attributes.xdpContent || \"\";\n    this.encrypt = null;\n    this.encryptData = new XFAObjectArray();\n    this.signData = new XFAObjectArray();\n  }\n}\n\nclass Template extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"template\", /* hasChildren = */ true);\n    this.baseProfile = getStringOption(attributes.baseProfile, [\n      \"full\",\n      \"interactiveForms\",\n    ]);\n    this.extras = null;\n\n    // Spec is unclear:\n    //  A container element that describes a single subform capable of\n    //  enclosing other containers.\n    // Can we have more than one subform ?\n    this.subform = new XFAObjectArray();\n  }\n\n  [$finalize]() {\n    if (this.subform.children.length === 0) {\n      warn(\"XFA - No subforms in template node.\");\n    }\n    if (this.subform.children.length >= 2) {\n      warn(\"XFA - Several subforms in template node: please file a bug.\");\n    }\n    this[$tabIndex] = DEFAULT_TAB_INDEX;\n  }\n\n  [$isSplittable]() {\n    return true;\n  }\n\n  [$searchNode](expr, container) {\n    if (expr.startsWith(\"#\")) {\n      // This is an id.\n      return [this[$ids].get(expr.slice(1))];\n    }\n    return searchNode(this, container, expr, true, true);\n  }\n\n  /**\n   * This function is a generator because the conversion into\n   * pages is done asynchronously and we want to save the state\n   * of the function where we were in the previous iteration.\n   */\n  *[$toPages]() {\n    if (!this.subform.children.length) {\n      return HTMLResult.success({\n        name: \"div\",\n        children: [],\n      });\n    }\n    this[$extra] = {\n      overflowNode: null,\n      firstUnsplittable: null,\n      currentContentArea: null,\n      currentPageArea: null,\n      noLayoutFailure: false,\n      pageNumber: 1,\n      pagePosition: \"first\",\n      oddOrEven: \"odd\",\n      blankOrNotBlank: \"nonBlank\",\n      paraStack: [],\n    };\n\n    const root = this.subform.children[0];\n    root.pageSet[$cleanPage]();\n\n    const pageAreas = root.pageSet.pageArea.children;\n    const mainHtml = {\n      name: \"div\",\n      children: [],\n    };\n\n    let pageArea = null;\n    let breakBefore = null;\n    let breakBeforeTarget = null;\n    if (root.breakBefore.children.length >= 1) {\n      breakBefore = root.breakBefore.children[0];\n      breakBeforeTarget = breakBefore.target;\n    } else if (\n      root.subform.children.length >= 1 &&\n      root.subform.children[0].breakBefore.children.length >= 1\n    ) {\n      breakBefore = root.subform.children[0].breakBefore.children[0];\n      breakBeforeTarget = breakBefore.target;\n    } else if (root.break?.beforeTarget) {\n      breakBefore = root.break;\n      breakBeforeTarget = breakBefore.beforeTarget;\n    } else if (\n      root.subform.children.length >= 1 &&\n      root.subform.children[0].break?.beforeTarget\n    ) {\n      breakBefore = root.subform.children[0].break;\n      breakBeforeTarget = breakBefore.beforeTarget;\n    }\n\n    if (breakBefore) {\n      const target = this[$searchNode](\n        breakBeforeTarget,\n        breakBefore[$getParent]()\n      );\n      if (target instanceof PageArea) {\n        pageArea = target;\n        // Consume breakBefore.\n        breakBefore[$extra] = {};\n      }\n    }\n\n    pageArea ||= pageAreas[0];\n\n    pageArea[$extra] = {\n      numberOfUse: 1,\n    };\n\n    const pageAreaParent = pageArea[$getParent]();\n    pageAreaParent[$extra] = {\n      numberOfUse: 1,\n      pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea),\n      pageSetIndex: 0,\n    };\n\n    let targetPageArea;\n    let leader = null;\n    let trailer = null;\n    let hasSomething = true;\n    let hasSomethingCounter = 0;\n    let startIndex = 0;\n\n    while (true) {\n      if (!hasSomething) {\n        mainHtml.children.pop();\n        // Nothing has been added in the previous page\n        if (++hasSomethingCounter === MAX_EMPTY_PAGES) {\n          warn(\"XFA - Something goes wrong: please file a bug.\");\n          return mainHtml;\n        }\n      } else {\n        hasSomethingCounter = 0;\n      }\n\n      targetPageArea = null;\n      this[$extra].currentPageArea = pageArea;\n      const page = pageArea[$toHTML]().html;\n      mainHtml.children.push(page);\n\n      if (leader) {\n        this[$extra].noLayoutFailure = true;\n        page.children.push(leader[$toHTML](pageArea[$extra].space).html);\n        leader = null;\n      }\n\n      if (trailer) {\n        this[$extra].noLayoutFailure = true;\n        page.children.push(trailer[$toHTML](pageArea[$extra].space).html);\n        trailer = null;\n      }\n\n      const contentAreas = pageArea.contentArea.children;\n      const htmlContentAreas = page.children.filter(node =>\n        node.attributes.class.includes(\"xfaContentarea\")\n      );\n\n      hasSomething = false;\n      this[$extra].firstUnsplittable = null;\n      this[$extra].noLayoutFailure = false;\n\n      const flush = index => {\n        const html = root[$flushHTML]();\n        if (html) {\n          hasSomething ||= html.children?.length > 0;\n          htmlContentAreas[index].children.push(html);\n        }\n      };\n\n      for (let i = startIndex, ii = contentAreas.length; i < ii; i++) {\n        const contentArea = (this[$extra].currentContentArea = contentAreas[i]);\n        const space = { width: contentArea.w, height: contentArea.h };\n        startIndex = 0;\n\n        if (leader) {\n          htmlContentAreas[i].children.push(leader[$toHTML](space).html);\n          leader = null;\n        }\n\n        if (trailer) {\n          htmlContentAreas[i].children.push(trailer[$toHTML](space).html);\n          trailer = null;\n        }\n\n        const html = root[$toHTML](space);\n        if (html.success) {\n          if (html.html) {\n            hasSomething ||= html.html.children?.length > 0;\n            htmlContentAreas[i].children.push(html.html);\n          } else if (!hasSomething && mainHtml.children.length > 1) {\n            mainHtml.children.pop();\n          }\n          return mainHtml;\n        }\n\n        if (html.isBreak()) {\n          const node = html.breakNode;\n          flush(i);\n\n          if (node.targetType === \"auto\") {\n            continue;\n          }\n\n          if (node.leader) {\n            leader = this[$searchNode](node.leader, node[$getParent]());\n            leader = leader ? leader[0] : null;\n          }\n\n          if (node.trailer) {\n            trailer = this[$searchNode](node.trailer, node[$getParent]());\n            trailer = trailer ? trailer[0] : null;\n          }\n\n          if (node.targetType === \"pageArea\") {\n            targetPageArea = node[$extra].target;\n            i = Infinity;\n          } else if (!node[$extra].target) {\n            // We stay on the same page.\n            i = node[$extra].index;\n          } else {\n            targetPageArea = node[$extra].target;\n            startIndex = node[$extra].index + 1;\n            i = Infinity;\n          }\n\n          continue;\n        }\n\n        if (this[$extra].overflowNode) {\n          const node = this[$extra].overflowNode;\n          this[$extra].overflowNode = null;\n\n          const overflowExtra = node[$getExtra]();\n          const target = overflowExtra.target;\n          overflowExtra.addLeader = overflowExtra.leader !== null;\n          overflowExtra.addTrailer = overflowExtra.trailer !== null;\n\n          flush(i);\n\n          const currentIndex = i;\n\n          i = Infinity;\n          if (target instanceof PageArea) {\n            // We must stop the contentAreas filling and go to the next page.\n            targetPageArea = target;\n          } else if (target instanceof ContentArea) {\n            const index = contentAreas.indexOf(target);\n            if (index !== -1) {\n              if (index > currentIndex) {\n                // In the next loop iteration `i` will be incremented, note the\n                // `continue` just below, hence we need to subtract one here.\n                i = index - 1;\n              } else {\n                // The targetted contentArea has already been filled\n                // so create a new page.\n                startIndex = index;\n              }\n            } else {\n              targetPageArea = target[$getParent]();\n              startIndex = targetPageArea.contentArea.children.indexOf(target);\n            }\n          }\n          continue;\n        }\n\n        flush(i);\n      }\n\n      this[$extra].pageNumber += 1;\n      if (targetPageArea) {\n        if (targetPageArea[$isUsable]()) {\n          targetPageArea[$extra].numberOfUse += 1;\n        } else {\n          targetPageArea = null;\n        }\n      }\n      pageArea = targetPageArea || pageArea[$getNextPage]();\n      yield null;\n    }\n  }\n}\n\nclass Text extends ContentObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"text\");\n    this.id = attributes.id || \"\";\n    this.maxChars = getInteger({\n      data: attributes.maxChars,\n      defaultValue: 0,\n      validate: x => x >= 0,\n    });\n    this.name = attributes.name || \"\";\n    this.rid = attributes.rid || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$acceptWhitespace]() {\n    return true;\n  }\n\n  [$onChild](child) {\n    if (child[$namespaceId] === NamespaceIds.xhtml.id) {\n      this[$content] = child;\n      return true;\n    }\n    warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`);\n    return false;\n  }\n\n  [$onText](str) {\n    if (this[$content] instanceof XFAObject) {\n      return;\n    }\n    super[$onText](str);\n  }\n\n  [$finalize]() {\n    if (typeof this[$content] === \"string\") {\n      this[$content] = this[$content].replaceAll(\"\\r\\n\", \"\\n\");\n    }\n  }\n\n  [$getExtra]() {\n    if (typeof this[$content] === \"string\") {\n      return this[$content]\n        .split(/[\\u2029\\u2028\\n]/)\n        .filter(line => !!line)\n        .join(\"\\n\");\n    }\n    return this[$content][$text]();\n  }\n\n  [$toHTML](availableSpace) {\n    if (typeof this[$content] === \"string\") {\n      // \\u2028 is a line separator.\n      // \\u2029 is a paragraph separator.\n      const html = valueToHtml(this[$content]).html;\n\n      if (this[$content].includes(\"\\u2029\")) {\n        // We've plain text containing a paragraph separator\n        // so convert it into a set of <p>.\n        html.name = \"div\";\n        html.children = [];\n        this[$content]\n          .split(\"\\u2029\")\n          .map(para =>\n            // Convert a paragraph into a set of <span> (for lines)\n            // separated by <br>.\n            para.split(/[\\u2028\\n]/).flatMap(line => [\n              {\n                name: \"span\",\n                value: line,\n              },\n              {\n                name: \"br\",\n              },\n            ])\n          )\n          .forEach(lines => {\n            html.children.push({\n              name: \"p\",\n              children: lines,\n            });\n          });\n      } else if (/[\\u2028\\n]/.test(this[$content])) {\n        html.name = \"div\";\n        html.children = [];\n        // Convert plain text into a set of <span> (for lines)\n        // separated by <br>.\n        this[$content].split(/[\\u2028\\n]/).forEach(line => {\n          html.children.push(\n            {\n              name: \"span\",\n              value: line,\n            },\n            {\n              name: \"br\",\n            }\n          );\n        });\n      }\n\n      return HTMLResult.success(html);\n    }\n\n    return this[$content][$toHTML](availableSpace);\n  }\n}\n\nclass TextEdit extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"textEdit\", /* hasChildren = */ true);\n    this.allowRichText = getInteger({\n      data: attributes.allowRichText,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, [\n      \"auto\",\n      \"off\",\n      \"on\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.multiLine = getInteger({\n      data: attributes.multiLine,\n      defaultValue: \"\",\n      validate: x => x === 0 || x === 1,\n    });\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, [\n      \"auto\",\n      \"off\",\n      \"on\",\n    ]);\n    this.border = null;\n    this.comb = null;\n    this.extras = null;\n    this.margin = null;\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: incomplete.\n    const style = toStyle(this, \"border\", \"font\", \"margin\");\n    let html;\n    const field = this[$getParent]()[$getParent]();\n    if (this.multiLine === \"\") {\n      this.multiLine = field instanceof Draw ? 1 : 0;\n    }\n    if (this.multiLine === 1) {\n      html = {\n        name: \"textarea\",\n        attributes: {\n          dataId: field[$data]?.[$uid] || field[$uid],\n          fieldId: field[$uid],\n          class: [\"xfaTextfield\"],\n          style,\n          \"aria-label\": ariaLabel(field),\n          \"aria-required\": false,\n        },\n      };\n    } else {\n      html = {\n        name: \"input\",\n        attributes: {\n          type: \"text\",\n          dataId: field[$data]?.[$uid] || field[$uid],\n          fieldId: field[$uid],\n          class: [\"xfaTextfield\"],\n          style,\n          \"aria-label\": ariaLabel(field),\n          \"aria-required\": false,\n        },\n      };\n    }\n\n    if (isRequired(field)) {\n      html.attributes[\"aria-required\"] = true;\n      html.attributes.required = true;\n    }\n\n    return HTMLResult.success({\n      name: \"label\",\n      attributes: {\n        class: [\"xfaLabel\"],\n      },\n      children: [html],\n    });\n  }\n}\n\nclass Time extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"time\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n\n  [$finalize]() {\n    // TODO: need to handle the string as a time and not as a date.\n    const date = this[$content].trim();\n    this[$content] = date ? new Date(date) : null;\n  }\n\n  [$toHTML](availableSpace) {\n    return valueToHtml(this[$content] ? this[$content].toString() : \"\");\n  }\n}\n\nclass TimeStamp extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"timeStamp\");\n    this.id = attributes.id || \"\";\n    this.server = attributes.server || \"\";\n    this.type = getStringOption(attributes.type, [\"optional\", \"required\"]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass ToolTip extends StringObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"toolTip\");\n    this.id = attributes.id || \"\";\n    this.rid = attributes.rid || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Traversal extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"traversal\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.traverse = new XFAObjectArray();\n  }\n}\n\nclass Traverse extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"traverse\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.operation = getStringOption(attributes.operation, [\n      \"next\",\n      \"back\",\n      \"down\",\n      \"first\",\n      \"left\",\n      \"right\",\n      \"up\",\n    ]);\n    this.ref = attributes.ref || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.script = null;\n  }\n\n  get name() {\n    // SOM expression: see page 94\n    return this.operation;\n  }\n\n  [$isTransparent]() {\n    return false;\n  }\n}\n\nclass Ui extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"ui\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.picture = null;\n\n    // One-of properties\n    this.barcode = null;\n    this.button = null;\n    this.checkButton = null;\n    this.choiceList = null;\n    this.dateTimeEdit = null;\n    this.defaultUi = null;\n    this.imageEdit = null;\n    this.numericEdit = null;\n    this.passwordEdit = null;\n    this.signature = null;\n    this.textEdit = null;\n  }\n\n  [$getExtra]() {\n    if (this[$extra] === undefined) {\n      for (const name of Object.getOwnPropertyNames(this)) {\n        if (name === \"extras\" || name === \"picture\") {\n          continue;\n        }\n        const obj = this[name];\n        if (!(obj instanceof XFAObject)) {\n          continue;\n        }\n\n        this[$extra] = obj;\n        return obj;\n      }\n      this[$extra] = null;\n    }\n    return this[$extra];\n  }\n\n  [$toHTML](availableSpace) {\n    // TODO: picture.\n    const obj = this[$getExtra]();\n    if (obj) {\n      return obj[$toHTML](availableSpace);\n    }\n    return HTMLResult.EMPTY;\n  }\n}\n\nclass Validate extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"validate\", /* hasChildren = */ true);\n    this.formatTest = getStringOption(attributes.formatTest, [\n      \"warning\",\n      \"disabled\",\n      \"error\",\n    ]);\n    this.id = attributes.id || \"\";\n    this.nullTest = getStringOption(attributes.nullTest, [\n      \"disabled\",\n      \"error\",\n      \"warning\",\n    ]);\n    this.scriptTest = getStringOption(attributes.scriptTest, [\n      \"error\",\n      \"disabled\",\n      \"warning\",\n    ]);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.extras = null;\n    this.message = null;\n    this.picture = null;\n    this.script = null;\n  }\n}\n\nclass Value extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"value\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.override = getInteger({\n      data: attributes.override,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.relevant = getRelevant(attributes.relevant);\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n\n    // One-of properties\n    this.arc = null;\n    this.boolean = null;\n    this.date = null;\n    this.dateTime = null;\n    this.decimal = null;\n    this.exData = null;\n    this.float = null;\n    this.image = null;\n    this.integer = null;\n    this.line = null;\n    this.rectangle = null;\n    this.text = null;\n    this.time = null;\n  }\n\n  [$setValue](value) {\n    const parent = this[$getParent]();\n    if (parent instanceof Field) {\n      if (parent.ui?.imageEdit) {\n        if (!this.image) {\n          this.image = new Image({});\n          this[$appendChild](this.image);\n        }\n        this.image[$content] = value[$content];\n        return;\n      }\n    }\n\n    const valueName = value[$nodeName];\n    if (this[valueName] !== null) {\n      this[valueName][$content] = value[$content];\n      return;\n    }\n\n    // Reset all the properties.\n    for (const name of Object.getOwnPropertyNames(this)) {\n      const obj = this[name];\n      if (obj instanceof XFAObject) {\n        this[name] = null;\n        this[$removeChild](obj);\n      }\n    }\n\n    this[value[$nodeName]] = value;\n    this[$appendChild](value);\n  }\n\n  [$text]() {\n    if (this.exData) {\n      if (typeof this.exData[$content] === \"string\") {\n        return this.exData[$content].trim();\n      }\n      return this.exData[$content][$text]().trim();\n    }\n    for (const name of Object.getOwnPropertyNames(this)) {\n      if (name === \"image\") {\n        continue;\n      }\n      const obj = this[name];\n      if (obj instanceof XFAObject) {\n        return (obj[$content] || \"\").toString().trim();\n      }\n    }\n    return null;\n  }\n\n  [$toHTML](availableSpace) {\n    for (const name of Object.getOwnPropertyNames(this)) {\n      const obj = this[name];\n      if (!(obj instanceof XFAObject)) {\n        continue;\n      }\n\n      return obj[$toHTML](availableSpace);\n    }\n\n    return HTMLResult.EMPTY;\n  }\n}\n\nclass Variables extends XFAObject {\n  constructor(attributes) {\n    super(TEMPLATE_NS_ID, \"variables\", /* hasChildren = */ true);\n    this.id = attributes.id || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n    this.boolean = new XFAObjectArray();\n    this.date = new XFAObjectArray();\n    this.dateTime = new XFAObjectArray();\n    this.decimal = new XFAObjectArray();\n    this.exData = new XFAObjectArray();\n    this.float = new XFAObjectArray();\n    this.image = new XFAObjectArray();\n    this.integer = new XFAObjectArray();\n    this.manifest = new XFAObjectArray();\n    this.script = new XFAObjectArray();\n    this.text = new XFAObjectArray();\n    this.time = new XFAObjectArray();\n  }\n\n  [$isTransparent]() {\n    return true;\n  }\n}\n\nclass TemplateNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(TemplateNamespace, name)) {\n      const node = TemplateNamespace[name](attributes);\n      node[$setSetAttributes](attributes);\n      return node;\n    }\n    return undefined;\n  }\n\n  static appearanceFilter(attrs) {\n    return new AppearanceFilter(attrs);\n  }\n\n  static arc(attrs) {\n    return new Arc(attrs);\n  }\n\n  static area(attrs) {\n    return new Area(attrs);\n  }\n\n  static assist(attrs) {\n    return new Assist(attrs);\n  }\n\n  static barcode(attrs) {\n    return new Barcode(attrs);\n  }\n\n  static bind(attrs) {\n    return new Bind(attrs);\n  }\n\n  static bindItems(attrs) {\n    return new BindItems(attrs);\n  }\n\n  static bookend(attrs) {\n    return new Bookend(attrs);\n  }\n\n  static boolean(attrs) {\n    return new BooleanElement(attrs);\n  }\n\n  static border(attrs) {\n    return new Border(attrs);\n  }\n\n  static break(attrs) {\n    return new Break(attrs);\n  }\n\n  static breakAfter(attrs) {\n    return new BreakAfter(attrs);\n  }\n\n  static breakBefore(attrs) {\n    return new BreakBefore(attrs);\n  }\n\n  static button(attrs) {\n    return new Button(attrs);\n  }\n\n  static calculate(attrs) {\n    return new Calculate(attrs);\n  }\n\n  static caption(attrs) {\n    return new Caption(attrs);\n  }\n\n  static certificate(attrs) {\n    return new Certificate(attrs);\n  }\n\n  static certificates(attrs) {\n    return new Certificates(attrs);\n  }\n\n  static checkButton(attrs) {\n    return new CheckButton(attrs);\n  }\n\n  static choiceList(attrs) {\n    return new ChoiceList(attrs);\n  }\n\n  static color(attrs) {\n    return new Color(attrs);\n  }\n\n  static comb(attrs) {\n    return new Comb(attrs);\n  }\n\n  static connect(attrs) {\n    return new Connect(attrs);\n  }\n\n  static contentArea(attrs) {\n    return new ContentArea(attrs);\n  }\n\n  static corner(attrs) {\n    return new Corner(attrs);\n  }\n\n  static date(attrs) {\n    return new DateElement(attrs);\n  }\n\n  static dateTime(attrs) {\n    return new DateTime(attrs);\n  }\n\n  static dateTimeEdit(attrs) {\n    return new DateTimeEdit(attrs);\n  }\n\n  static decimal(attrs) {\n    return new Decimal(attrs);\n  }\n\n  static defaultUi(attrs) {\n    return new DefaultUi(attrs);\n  }\n\n  static desc(attrs) {\n    return new Desc(attrs);\n  }\n\n  static digestMethod(attrs) {\n    return new DigestMethod(attrs);\n  }\n\n  static digestMethods(attrs) {\n    return new DigestMethods(attrs);\n  }\n\n  static draw(attrs) {\n    return new Draw(attrs);\n  }\n\n  static edge(attrs) {\n    return new Edge(attrs);\n  }\n\n  static encoding(attrs) {\n    return new Encoding(attrs);\n  }\n\n  static encodings(attrs) {\n    return new Encodings(attrs);\n  }\n\n  static encrypt(attrs) {\n    return new Encrypt(attrs);\n  }\n\n  static encryptData(attrs) {\n    return new EncryptData(attrs);\n  }\n\n  static encryption(attrs) {\n    return new Encryption(attrs);\n  }\n\n  static encryptionMethod(attrs) {\n    return new EncryptionMethod(attrs);\n  }\n\n  static encryptionMethods(attrs) {\n    return new EncryptionMethods(attrs);\n  }\n\n  static event(attrs) {\n    return new Event(attrs);\n  }\n\n  static exData(attrs) {\n    return new ExData(attrs);\n  }\n\n  static exObject(attrs) {\n    return new ExObject(attrs);\n  }\n\n  static exclGroup(attrs) {\n    return new ExclGroup(attrs);\n  }\n\n  static execute(attrs) {\n    return new Execute(attrs);\n  }\n\n  static extras(attrs) {\n    return new Extras(attrs);\n  }\n\n  static field(attrs) {\n    return new Field(attrs);\n  }\n\n  static fill(attrs) {\n    return new Fill(attrs);\n  }\n\n  static filter(attrs) {\n    return new Filter(attrs);\n  }\n\n  static float(attrs) {\n    return new Float(attrs);\n  }\n\n  static font(attrs) {\n    return new Font(attrs);\n  }\n\n  static format(attrs) {\n    return new Format(attrs);\n  }\n\n  static handler(attrs) {\n    return new Handler(attrs);\n  }\n\n  static hyphenation(attrs) {\n    return new Hyphenation(attrs);\n  }\n\n  static image(attrs) {\n    return new Image(attrs);\n  }\n\n  static imageEdit(attrs) {\n    return new ImageEdit(attrs);\n  }\n\n  static integer(attrs) {\n    return new Integer(attrs);\n  }\n\n  static issuers(attrs) {\n    return new Issuers(attrs);\n  }\n\n  static items(attrs) {\n    return new Items(attrs);\n  }\n\n  static keep(attrs) {\n    return new Keep(attrs);\n  }\n\n  static keyUsage(attrs) {\n    return new KeyUsage(attrs);\n  }\n\n  static line(attrs) {\n    return new Line(attrs);\n  }\n\n  static linear(attrs) {\n    return new Linear(attrs);\n  }\n\n  static lockDocument(attrs) {\n    return new LockDocument(attrs);\n  }\n\n  static manifest(attrs) {\n    return new Manifest(attrs);\n  }\n\n  static margin(attrs) {\n    return new Margin(attrs);\n  }\n\n  static mdp(attrs) {\n    return new Mdp(attrs);\n  }\n\n  static medium(attrs) {\n    return new Medium(attrs);\n  }\n\n  static message(attrs) {\n    return new Message(attrs);\n  }\n\n  static numericEdit(attrs) {\n    return new NumericEdit(attrs);\n  }\n\n  static occur(attrs) {\n    return new Occur(attrs);\n  }\n\n  static oid(attrs) {\n    return new Oid(attrs);\n  }\n\n  static oids(attrs) {\n    return new Oids(attrs);\n  }\n\n  static overflow(attrs) {\n    return new Overflow(attrs);\n  }\n\n  static pageArea(attrs) {\n    return new PageArea(attrs);\n  }\n\n  static pageSet(attrs) {\n    return new PageSet(attrs);\n  }\n\n  static para(attrs) {\n    return new Para(attrs);\n  }\n\n  static passwordEdit(attrs) {\n    return new PasswordEdit(attrs);\n  }\n\n  static pattern(attrs) {\n    return new Pattern(attrs);\n  }\n\n  static picture(attrs) {\n    return new Picture(attrs);\n  }\n\n  static proto(attrs) {\n    return new Proto(attrs);\n  }\n\n  static radial(attrs) {\n    return new Radial(attrs);\n  }\n\n  static reason(attrs) {\n    return new Reason(attrs);\n  }\n\n  static reasons(attrs) {\n    return new Reasons(attrs);\n  }\n\n  static rectangle(attrs) {\n    return new Rectangle(attrs);\n  }\n\n  static ref(attrs) {\n    return new RefElement(attrs);\n  }\n\n  static script(attrs) {\n    return new Script(attrs);\n  }\n\n  static setProperty(attrs) {\n    return new SetProperty(attrs);\n  }\n\n  static signData(attrs) {\n    return new SignData(attrs);\n  }\n\n  static signature(attrs) {\n    return new Signature(attrs);\n  }\n\n  static signing(attrs) {\n    return new Signing(attrs);\n  }\n\n  static solid(attrs) {\n    return new Solid(attrs);\n  }\n\n  static speak(attrs) {\n    return new Speak(attrs);\n  }\n\n  static stipple(attrs) {\n    return new Stipple(attrs);\n  }\n\n  static subform(attrs) {\n    return new Subform(attrs);\n  }\n\n  static subformSet(attrs) {\n    return new SubformSet(attrs);\n  }\n\n  static subjectDN(attrs) {\n    return new SubjectDN(attrs);\n  }\n\n  static subjectDNs(attrs) {\n    return new SubjectDNs(attrs);\n  }\n\n  static submit(attrs) {\n    return new Submit(attrs);\n  }\n\n  static template(attrs) {\n    return new Template(attrs);\n  }\n\n  static text(attrs) {\n    return new Text(attrs);\n  }\n\n  static textEdit(attrs) {\n    return new TextEdit(attrs);\n  }\n\n  static time(attrs) {\n    return new Time(attrs);\n  }\n\n  static timeStamp(attrs) {\n    return new TimeStamp(attrs);\n  }\n\n  static toolTip(attrs) {\n    return new ToolTip(attrs);\n  }\n\n  static traversal(attrs) {\n    return new Traversal(attrs);\n  }\n\n  static traverse(attrs) {\n    return new Traverse(attrs);\n  }\n\n  static ui(attrs) {\n    return new Ui(attrs);\n  }\n\n  static validate(attrs) {\n    return new Validate(attrs);\n  }\n\n  static value(attrs) {\n    return new Value(attrs);\n  }\n\n  static variables(attrs) {\n    return new Variables(attrs);\n  }\n}\n\nexport {\n  BindItems,\n  Field,\n  Items,\n  SetProperty,\n  Template,\n  TemplateNamespace,\n  Text,\n  Value,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $appendChild,\n  $clone,\n  $consumed,\n  $content,\n  $data,\n  $finalize,\n  $getAttributeIt,\n  $getChildren,\n  $getDataValue,\n  $getParent,\n  $getRealChildrenByNameIt,\n  $hasSettableValue,\n  $indexOf,\n  $insertAt,\n  $isBindable,\n  $isDataValue,\n  $isDescendent,\n  $namespaceId,\n  $nodeName,\n  $removeChild,\n  $setValue,\n  $text,\n} from \"./symbol_utils.js\";\nimport { BindItems, Field, Items, SetProperty, Text } from \"./template.js\";\nimport { createDataNode, searchNode } from \"./som.js\";\nimport { XFAAttribute, XFAObjectArray, XmlObject } from \"./xfa_object.js\";\nimport { NamespaceIds } from \"./namespaces.js\";\nimport { warn } from \"../../shared/util.js\";\n\nconst NS_DATASETS = NamespaceIds.datasets.id;\n\nfunction createText(content) {\n  const node = new Text({});\n  node[$content] = content;\n  return node;\n}\n\nclass Binder {\n  constructor(root) {\n    this.root = root;\n    this.datasets = root.datasets;\n    this.data =\n      root.datasets?.data || new XmlObject(NamespaceIds.datasets.id, \"data\");\n    this.emptyMerge = this.data[$getChildren]().length === 0;\n\n    this.root.form = this.form = root.template[$clone]();\n  }\n\n  _isConsumeData() {\n    return !this.emptyMerge && this._mergeMode;\n  }\n\n  _isMatchTemplate() {\n    return !this._isConsumeData();\n  }\n\n  bind() {\n    this._bindElement(this.form, this.data);\n    return this.form;\n  }\n\n  getData() {\n    return this.data;\n  }\n\n  _bindValue(formNode, data, picture) {\n    // Nodes must have the same \"type\": container or value.\n    // Here we make the link between form node and\n    // data node (through $data property): we'll use it\n    // to save form data.\n\n    formNode[$data] = data;\n    if (formNode[$hasSettableValue]()) {\n      if (data[$isDataValue]()) {\n        const value = data[$getDataValue]();\n        // TODO: use picture.\n        formNode[$setValue](createText(value));\n      } else if (\n        formNode instanceof Field &&\n        formNode.ui?.choiceList?.open === \"multiSelect\"\n      ) {\n        const value = data[$getChildren]()\n          .map(child => child[$content].trim())\n          .join(\"\\n\");\n        formNode[$setValue](createText(value));\n      } else if (this._isConsumeData()) {\n        warn(`XFA - Nodes haven't the same type.`);\n      }\n    } else if (!data[$isDataValue]() || this._isMatchTemplate()) {\n      this._bindElement(formNode, data);\n    } else {\n      warn(`XFA - Nodes haven't the same type.`);\n    }\n  }\n\n  _findDataByNameToConsume(name, isValue, dataNode, global) {\n    if (!name) {\n      return null;\n    }\n\n    // Firstly, we try to find a node with the given name:\n    //  - in dataNode;\n    //  - if not found, then in parent;\n    //  - and if not in found, then in grand-parent.\n    let generator, match;\n    for (let i = 0; i < 3; i++) {\n      generator = dataNode[$getRealChildrenByNameIt](\n        name,\n        /* allTransparent = */ false,\n        /* skipConsumed = */ true\n      );\n      // Try to find a match of the same kind.\n      while (true) {\n        match = generator.next().value;\n        if (!match) {\n          break;\n        }\n\n        if (isValue === match[$isDataValue]()) {\n          return match;\n        }\n      }\n      if (\n        dataNode[$namespaceId] === NamespaceIds.datasets.id &&\n        dataNode[$nodeName] === \"data\"\n      ) {\n        break;\n      }\n      dataNode = dataNode[$getParent]();\n    }\n\n    if (!global) {\n      return null;\n    }\n\n    // Secondly, if global try to find it just under the root of datasets\n    // (which is the location of global variables).\n    generator = this.data[$getRealChildrenByNameIt](\n      name,\n      /* allTransparent = */ true,\n      /* skipConsumed = */ false\n    );\n\n    match = generator.next().value;\n    if (match) {\n      return match;\n    }\n\n    // Thirdly, try to find it in attributes.\n    generator = this.data[$getAttributeIt](name, /* skipConsumed = */ true);\n    match = generator.next().value;\n    if (match?.[$isDataValue]()) {\n      return match;\n    }\n\n    return null;\n  }\n\n  _setProperties(formNode, dataNode) {\n    // For example:\n    // <field name=\"LastName\" ...>\n    //   <setProperty ref=\"$data.Main.Style.NameFont\" target=\"font.typeface\"/>\n    //   <setProperty ref=\"$data.Main.Style.NameSize\" target=\"font.size\"/>\n    //   <setProperty ref=\"$data.Main.Help.LastName\" target=\"assist.toolTip\"/>\n    // </field>\n\n    if (!Object.hasOwn(formNode, \"setProperty\")) {\n      return;\n    }\n\n    for (const { ref, target, connection } of formNode.setProperty.children) {\n      if (connection) {\n        // TODO: evaluate if we should implement this feature.\n        // Skip for security reasons.\n        continue;\n      }\n      if (!ref) {\n        continue;\n      }\n\n      const nodes = searchNode(\n        this.root,\n        dataNode,\n        ref,\n        false /* = dotDotAllowed */,\n        false /* = useCache */\n      );\n      if (!nodes) {\n        warn(`XFA - Invalid reference: ${ref}.`);\n        continue;\n      }\n      const [node] = nodes;\n\n      if (!node[$isDescendent](this.data)) {\n        warn(`XFA - Invalid node: must be a data node.`);\n        continue;\n      }\n\n      const targetNodes = searchNode(\n        this.root,\n        formNode,\n        target,\n        false /* = dotDotAllowed */,\n        false /* = useCache */\n      );\n      if (!targetNodes) {\n        warn(`XFA - Invalid target: ${target}.`);\n        continue;\n      }\n      const [targetNode] = targetNodes;\n\n      if (!targetNode[$isDescendent](formNode)) {\n        warn(`XFA - Invalid target: must be a property or subproperty.`);\n        continue;\n      }\n\n      const targetParent = targetNode[$getParent]();\n      if (\n        targetNode instanceof SetProperty ||\n        targetParent instanceof SetProperty\n      ) {\n        warn(\n          `XFA - Invalid target: cannot be a setProperty or one of its properties.`\n        );\n        continue;\n      }\n\n      if (\n        targetNode instanceof BindItems ||\n        targetParent instanceof BindItems\n      ) {\n        warn(\n          `XFA - Invalid target: cannot be a bindItems or one of its properties.`\n        );\n        continue;\n      }\n\n      const content = node[$text]();\n      const name = targetNode[$nodeName];\n\n      if (targetNode instanceof XFAAttribute) {\n        const attrs = Object.create(null);\n        attrs[name] = content;\n        const obj = Reflect.construct(\n          Object.getPrototypeOf(targetParent).constructor,\n          [attrs]\n        );\n        targetParent[name] = obj[name];\n        continue;\n      }\n\n      if (!Object.hasOwn(targetNode, $content)) {\n        warn(`XFA - Invalid node to use in setProperty`);\n        continue;\n      }\n\n      targetNode[$data] = node;\n      targetNode[$content] = content;\n      targetNode[$finalize]();\n    }\n  }\n\n  _bindItems(formNode, dataNode) {\n    // For example:\n    // <field name=\"CardName\"...>\n    //   <bindItems ref=\"$data.main.ccs.cc[*]\" labelRef=\"uiname\"\n    //              valueRef=\"token\"/>\n    //   <ui><choiceList/></ui>\n    // </field>\n\n    if (\n      !Object.hasOwn(formNode, \"items\") ||\n      !Object.hasOwn(formNode, \"bindItems\") ||\n      formNode.bindItems.isEmpty()\n    ) {\n      return;\n    }\n\n    for (const item of formNode.items.children) {\n      formNode[$removeChild](item);\n    }\n\n    formNode.items.clear();\n\n    const labels = new Items({});\n    const values = new Items({});\n\n    formNode[$appendChild](labels);\n    formNode.items.push(labels);\n\n    formNode[$appendChild](values);\n    formNode.items.push(values);\n\n    for (const { ref, labelRef, valueRef, connection } of formNode.bindItems\n      .children) {\n      if (connection) {\n        // TODO: evaluate if we should implement this feature.\n        // Skip for security reasons.\n        continue;\n      }\n      if (!ref) {\n        continue;\n      }\n\n      const nodes = searchNode(\n        this.root,\n        dataNode,\n        ref,\n        false /* = dotDotAllowed */,\n        false /* = useCache */\n      );\n      if (!nodes) {\n        warn(`XFA - Invalid reference: ${ref}.`);\n        continue;\n      }\n      for (const node of nodes) {\n        if (!node[$isDescendent](this.datasets)) {\n          warn(`XFA - Invalid ref (${ref}): must be a datasets child.`);\n          continue;\n        }\n\n        const labelNodes = searchNode(\n          this.root,\n          node,\n          labelRef,\n          true /* = dotDotAllowed */,\n          false /* = useCache */\n        );\n        if (!labelNodes) {\n          warn(`XFA - Invalid label: ${labelRef}.`);\n          continue;\n        }\n        const [labelNode] = labelNodes;\n\n        if (!labelNode[$isDescendent](this.datasets)) {\n          warn(`XFA - Invalid label: must be a datasets child.`);\n          continue;\n        }\n\n        const valueNodes = searchNode(\n          this.root,\n          node,\n          valueRef,\n          true /* = dotDotAllowed */,\n          false /* = useCache */\n        );\n        if (!valueNodes) {\n          warn(`XFA - Invalid value: ${valueRef}.`);\n          continue;\n        }\n        const [valueNode] = valueNodes;\n\n        if (!valueNode[$isDescendent](this.datasets)) {\n          warn(`XFA - Invalid value: must be a datasets child.`);\n          continue;\n        }\n\n        const label = createText(labelNode[$text]());\n        const value = createText(valueNode[$text]());\n\n        labels[$appendChild](label);\n        labels.text.push(label);\n\n        values[$appendChild](value);\n        values.text.push(value);\n      }\n    }\n  }\n\n  _bindOccurrences(formNode, matches, picture) {\n    // Insert nodes which are not in the template but reflect\n    // what we've in data tree.\n\n    let baseClone;\n    if (matches.length > 1) {\n      // Clone before binding to avoid bad state.\n      baseClone = formNode[$clone]();\n      baseClone[$removeChild](baseClone.occur);\n      baseClone.occur = null;\n    }\n\n    this._bindValue(formNode, matches[0], picture);\n    this._setProperties(formNode, matches[0]);\n    this._bindItems(formNode, matches[0]);\n\n    if (matches.length === 1) {\n      return;\n    }\n\n    const parent = formNode[$getParent]();\n    const name = formNode[$nodeName];\n    const pos = parent[$indexOf](formNode);\n\n    for (let i = 1, ii = matches.length; i < ii; i++) {\n      const match = matches[i];\n      const clone = baseClone[$clone]();\n      parent[name].push(clone);\n      parent[$insertAt](pos + i, clone);\n\n      this._bindValue(clone, match, picture);\n      this._setProperties(clone, match);\n      this._bindItems(clone, match);\n    }\n  }\n\n  _createOccurrences(formNode) {\n    if (!this.emptyMerge) {\n      return;\n    }\n\n    const { occur } = formNode;\n    if (!occur || occur.initial <= 1) {\n      return;\n    }\n\n    const parent = formNode[$getParent]();\n    const name = formNode[$nodeName];\n\n    if (!(parent[name] instanceof XFAObjectArray)) {\n      return;\n    }\n\n    let currentNumber;\n    if (formNode.name) {\n      currentNumber = parent[name].children.filter(\n        e => e.name === formNode.name\n      ).length;\n    } else {\n      currentNumber = parent[name].children.length;\n    }\n\n    const pos = parent[$indexOf](formNode) + 1;\n    const ii = occur.initial - currentNumber;\n    if (ii) {\n      const nodeClone = formNode[$clone]();\n      nodeClone[$removeChild](nodeClone.occur);\n      nodeClone.occur = null;\n      parent[name].push(nodeClone);\n      parent[$insertAt](pos, nodeClone);\n\n      for (let i = 1; i < ii; i++) {\n        const clone = nodeClone[$clone]();\n        parent[name].push(clone);\n        parent[$insertAt](pos + i, clone);\n      }\n    }\n  }\n\n  _getOccurInfo(formNode) {\n    const { name, occur } = formNode;\n    if (!occur || !name) {\n      return [1, 1];\n    }\n    const max = occur.max === -1 ? Infinity : occur.max;\n    return [occur.min, max];\n  }\n\n  _setAndBind(formNode, dataNode) {\n    this._setProperties(formNode, dataNode);\n    this._bindItems(formNode, dataNode);\n    this._bindElement(formNode, dataNode);\n  }\n\n  _bindElement(formNode, dataNode) {\n    // Some nodes can be useless because min=0 so remove them\n    // after the loop to avoid bad things.\n\n    const uselessNodes = [];\n\n    this._createOccurrences(formNode);\n\n    for (const child of formNode[$getChildren]()) {\n      if (child[$data]) {\n        // Already bound.\n        continue;\n      }\n\n      if (this._mergeMode === undefined && child[$nodeName] === \"subform\") {\n        this._mergeMode = child.mergeMode === \"consumeData\";\n\n        // XFA specs p. 182:\n        // The highest-level subform and the data node representing\n        // the current record are special; they are always\n        // bound even if their names don't match.\n        const dataChildren = dataNode[$getChildren]();\n        if (dataChildren.length > 0) {\n          this._bindOccurrences(child, [dataChildren[0]], null);\n        } else if (this.emptyMerge) {\n          const nsId =\n            dataNode[$namespaceId] === NS_DATASETS\n              ? -1\n              : dataNode[$namespaceId];\n          const dataChild = (child[$data] = new XmlObject(\n            nsId,\n            child.name || \"root\"\n          ));\n          dataNode[$appendChild](dataChild);\n          this._bindElement(child, dataChild);\n        }\n        continue;\n      }\n\n      if (!child[$isBindable]()) {\n        // The node cannot contain some new data so there is nothing\n        // to create in the data node.\n        continue;\n      }\n\n      let global = false;\n      let picture = null;\n      let ref = null;\n      let match = null;\n      if (child.bind) {\n        switch (child.bind.match) {\n          case \"none\":\n            this._setAndBind(child, dataNode);\n            continue;\n          case \"global\":\n            global = true;\n            break;\n          case \"dataRef\":\n            if (!child.bind.ref) {\n              warn(`XFA - ref is empty in node ${child[$nodeName]}.`);\n              this._setAndBind(child, dataNode);\n              continue;\n            }\n            ref = child.bind.ref;\n            break;\n          default:\n            break;\n        }\n        if (child.bind.picture) {\n          picture = child.bind.picture[$content];\n        }\n      }\n\n      const [min, max] = this._getOccurInfo(child);\n\n      if (ref) {\n        // Don't use a cache for searching: nodes can change during binding.\n        match = searchNode(\n          this.root,\n          dataNode,\n          ref,\n          true /* = dotDotAllowed */,\n          false /* = useCache */\n        );\n        if (match === null) {\n          // Nothing found: we must create some nodes in data in order\n          // to have something to match with the given expression.\n          // See http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.364.2157&rep=rep1&type=pdf#page=199\n          match = createDataNode(this.data, dataNode, ref);\n          if (!match) {\n            // For example if the node contains a .(...) then it isn't\n            // findable.\n            // TODO: remove this when .(...) is implemented.\n            continue;\n          }\n          if (this._isConsumeData()) {\n            match[$consumed] = true;\n          }\n\n          // Don't bind the value in newly created node because it's empty.\n          this._setAndBind(child, match);\n          continue;\n        } else {\n          if (this._isConsumeData()) {\n            // Filter out consumed nodes.\n            match = match.filter(node => !node[$consumed]);\n          }\n          if (match.length > max) {\n            match = match.slice(0, max);\n          } else if (match.length === 0) {\n            match = null;\n          }\n          if (match && this._isConsumeData()) {\n            match.forEach(node => {\n              node[$consumed] = true;\n            });\n          }\n        }\n      } else {\n        if (!child.name) {\n          this._setAndBind(child, dataNode);\n          continue;\n        }\n        if (this._isConsumeData()) {\n          // In consumeData mode, search for the next node with the given name.\n          // occurs.max gives us the max number of node to match.\n          const matches = [];\n          while (matches.length < max) {\n            const found = this._findDataByNameToConsume(\n              child.name,\n              child[$hasSettableValue](),\n              dataNode,\n              global\n            );\n\n            if (!found) {\n              break;\n            }\n            found[$consumed] = true;\n            matches.push(found);\n          }\n          match = matches.length > 0 ? matches : null;\n        } else {\n          // If we've an empty merge, there are no reason\n          // to make multiple bind so skip consumed nodes.\n          match = dataNode[$getRealChildrenByNameIt](\n            child.name,\n            /* allTransparent = */ false,\n            /* skipConsumed = */ this.emptyMerge\n          ).next().value;\n          if (!match) {\n            // If there is no match (no data) and `min === 0` then\n            // the container is entirely excluded.\n            // https://www.pdfa.org/norm-refs/XFA-3_3.pdf#G12.1428332\n            if (min === 0) {\n              uselessNodes.push(child);\n              continue;\n            }\n            // We're in matchTemplate mode so create a node in data to reflect\n            // what we've in template.\n            const nsId =\n              dataNode[$namespaceId] === NS_DATASETS\n                ? -1\n                : dataNode[$namespaceId];\n            match = child[$data] = new XmlObject(nsId, child.name);\n            if (this.emptyMerge) {\n              match[$consumed] = true;\n            }\n            dataNode[$appendChild](match);\n\n            // Don't bind the value in newly created node because it's empty.\n            this._setAndBind(child, match);\n            continue;\n          }\n          if (this.emptyMerge) {\n            match[$consumed] = true;\n          }\n          match = [match];\n        }\n      }\n\n      if (match) {\n        this._bindOccurrences(child, match, picture);\n      } else if (min > 0) {\n        this._setAndBind(child, dataNode);\n      } else {\n        uselessNodes.push(child);\n      }\n    }\n\n    uselessNodes.forEach(node => node[$getParent]()[$removeChild](node));\n  }\n}\n\nexport { Binder };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $getAttributes,\n  $getChildren,\n  $nodeName,\n  $setValue,\n  $toString,\n  $uid,\n} from \"./symbol_utils.js\";\n\nclass DataHandler {\n  constructor(root, data) {\n    this.data = data;\n    this.dataset = root.datasets || null;\n  }\n\n  serialize(storage) {\n    const stack = [[-1, this.data[$getChildren]()]];\n\n    while (stack.length > 0) {\n      const last = stack.at(-1);\n      const [i, children] = last;\n      if (i + 1 === children.length) {\n        stack.pop();\n        continue;\n      }\n\n      const child = children[++last[0]];\n      const storageEntry = storage.get(child[$uid]);\n      if (storageEntry) {\n        child[$setValue](storageEntry);\n      } else {\n        const attributes = child[$getAttributes]();\n        for (const value of attributes.values()) {\n          const entry = storage.get(value[$uid]);\n          if (entry) {\n            value[$setValue](entry);\n            break;\n          }\n        }\n      }\n\n      const nodes = child[$getChildren]();\n      if (nodes.length > 0) {\n        stack.push([-1, nodes]);\n      }\n    }\n\n    const buf = [\n      `<xfa:datasets xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\">`,\n    ];\n    if (this.dataset) {\n      // Dump nodes other than data: they can contains for example\n      // some data for choice lists.\n      for (const child of this.dataset[$getChildren]()) {\n        if (child[$nodeName] !== \"data\") {\n          child[$toString](buf);\n        }\n      }\n    }\n    this.data[$toString](buf);\n    buf.push(\"</xfa:datasets>\");\n\n    return buf.join(\"\");\n  }\n}\n\nexport { DataHandler };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport { $content, $finalize } from \"./symbol_utils.js\";\nimport {\n  ContentObject,\n  IntegerObject,\n  Option01,\n  Option10,\n  OptionObject,\n  StringObject,\n  XFAObject,\n  XFAObjectArray,\n} from \"./xfa_object.js\";\nimport { getInteger, getStringOption } from \"./utils.js\";\nimport { shadow, warn } from \"../../shared/util.js\";\n\nconst CONFIG_NS_ID = NamespaceIds.config.id;\n\nclass Acrobat extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"acrobat\", /* hasChildren = */ true);\n    this.acrobat7 = null;\n    this.autoSave = null;\n    this.common = null;\n    this.validate = null;\n    this.validateApprovalSignatures = null;\n    this.submitUrl = new XFAObjectArray();\n  }\n}\n\nclass Acrobat7 extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"acrobat7\", /* hasChildren = */ true);\n    this.dynamicRender = null;\n  }\n}\n\nclass ADBE_JSConsole extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"ADBE_JSConsole\", [\"delegate\", \"Enable\", \"Disable\"]);\n  }\n}\n\nclass ADBE_JSDebugger extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"ADBE_JSDebugger\", [\"delegate\", \"Enable\", \"Disable\"]);\n  }\n}\n\nclass AddSilentPrint extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"addSilentPrint\");\n  }\n}\n\nclass AddViewerPreferences extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"addViewerPreferences\");\n  }\n}\n\nclass AdjustData extends Option10 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"adjustData\");\n  }\n}\n\nclass AdobeExtensionLevel extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"adobeExtensionLevel\", 0, n => n >= 1 && n <= 8);\n  }\n}\n\nclass Agent extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"agent\", /* hasChildren = */ true);\n    this.name = attributes.name ? attributes.name.trim() : \"\";\n    this.common = new XFAObjectArray();\n  }\n}\n\nclass AlwaysEmbed extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"alwaysEmbed\");\n  }\n}\n\nclass Amd extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"amd\");\n  }\n}\n\nclass Area extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"area\");\n    this.level = getInteger({\n      data: attributes.level,\n      defaultValue: 0,\n      validate: n => n >= 1 && n <= 3,\n    });\n    this.name = getStringOption(attributes.name, [\n      \"\",\n      \"barcode\",\n      \"coreinit\",\n      \"deviceDriver\",\n      \"font\",\n      \"general\",\n      \"layout\",\n      \"merge\",\n      \"script\",\n      \"signature\",\n      \"sourceSet\",\n      \"templateCache\",\n    ]);\n  }\n}\n\nclass Attributes extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"attributes\", [\"preserve\", \"delegate\", \"ignore\"]);\n  }\n}\n\nclass AutoSave extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"autoSave\", [\"disabled\", \"enabled\"]);\n  }\n}\n\nclass Base extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"base\");\n  }\n}\n\nclass BatchOutput extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"batchOutput\");\n    this.format = getStringOption(attributes.format, [\n      \"none\",\n      \"concat\",\n      \"zip\",\n      \"zipCompress\",\n    ]);\n  }\n}\n\nclass BehaviorOverride extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"behaviorOverride\");\n  }\n\n  [$finalize]() {\n    this[$content] = new Map(\n      this[$content]\n        .trim()\n        .split(/\\s+/)\n        .filter(x => x.includes(\":\"))\n        .map(x => x.split(\":\", 2))\n    );\n  }\n}\n\nclass Cache extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"cache\", /* hasChildren = */ true);\n    this.templateCache = null;\n  }\n}\n\nclass Change extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"change\");\n  }\n}\n\nclass Common extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"common\", /* hasChildren = */ true);\n    this.data = null;\n    this.locale = null;\n    this.localeSet = null;\n    this.messaging = null;\n    this.suppressBanner = null;\n    this.template = null;\n    this.validationMessaging = null;\n    this.versionControl = null;\n    this.log = new XFAObjectArray();\n  }\n}\n\nclass Compress extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"compress\");\n    this.scope = getStringOption(attributes.scope, [\"imageOnly\", \"document\"]);\n  }\n}\n\nclass CompressLogicalStructure extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"compressLogicalStructure\");\n  }\n}\n\nclass CompressObjectStream extends Option10 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"compressObjectStream\");\n  }\n}\n\nclass Compression extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"compression\", /* hasChildren = */ true);\n    this.compressLogicalStructure = null;\n    this.compressObjectStream = null;\n    this.level = null;\n    this.type = null;\n  }\n}\n\nclass Config extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"config\", /* hasChildren = */ true);\n    this.acrobat = null;\n    this.present = null;\n    this.trace = null;\n    this.agent = new XFAObjectArray();\n  }\n}\n\nclass Conformance extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"conformance\", [\"A\", \"B\"]);\n  }\n}\n\nclass ContentCopy extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"contentCopy\");\n  }\n}\n\nclass Copies extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"copies\", 1, n => n >= 1);\n  }\n}\n\nclass Creator extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"creator\");\n  }\n}\n\nclass CurrentPage extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"currentPage\", 0, n => n >= 0);\n  }\n}\n\nclass Data extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"data\", /* hasChildren = */ true);\n    this.adjustData = null;\n    this.attributes = null;\n    this.incrementalLoad = null;\n    this.outputXSL = null;\n    this.range = null;\n    this.record = null;\n    this.startNode = null;\n    this.uri = null;\n    this.window = null;\n    this.xsl = null;\n    this.excludeNS = new XFAObjectArray();\n    this.transform = new XFAObjectArray();\n  }\n}\n\nclass Debug extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"debug\", /* hasChildren = */ true);\n    this.uri = null;\n  }\n}\n\nclass DefaultTypeface extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"defaultTypeface\");\n    this.writingScript = getStringOption(attributes.writingScript, [\n      \"*\",\n      \"Arabic\",\n      \"Cyrillic\",\n      \"EastEuropeanRoman\",\n      \"Greek\",\n      \"Hebrew\",\n      \"Japanese\",\n      \"Korean\",\n      \"Roman\",\n      \"SimplifiedChinese\",\n      \"Thai\",\n      \"TraditionalChinese\",\n      \"Vietnamese\",\n    ]);\n  }\n}\n\nclass Destination extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"destination\", [\n      \"pdf\",\n      \"pcl\",\n      \"ps\",\n      \"webClient\",\n      \"zpl\",\n    ]);\n  }\n}\n\nclass DocumentAssembly extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"documentAssembly\");\n  }\n}\n\nclass Driver extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"driver\", /* hasChildren = */ true);\n    this.name = attributes.name ? attributes.name.trim() : \"\";\n    this.fontInfo = null;\n    this.xdc = null;\n  }\n}\n\nclass DuplexOption extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"duplexOption\", [\n      \"simplex\",\n      \"duplexFlipLongEdge\",\n      \"duplexFlipShortEdge\",\n    ]);\n  }\n}\n\nclass DynamicRender extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"dynamicRender\", [\"forbidden\", \"required\"]);\n  }\n}\n\nclass Embed extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"embed\");\n  }\n}\n\nclass Encrypt extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"encrypt\");\n  }\n}\n\nclass Encryption extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"encryption\", /* hasChildren = */ true);\n    this.encrypt = null;\n    this.encryptionLevel = null;\n    this.permissions = null;\n  }\n}\n\nclass EncryptionLevel extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"encryptionLevel\", [\"40bit\", \"128bit\"]);\n  }\n}\n\nclass Enforce extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"enforce\");\n  }\n}\n\nclass Equate extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"equate\");\n\n    this.force = getInteger({\n      data: attributes.force,\n      defaultValue: 1,\n      validate: n => n === 0,\n    });\n\n    this.from = attributes.from || \"\";\n    this.to = attributes.to || \"\";\n  }\n}\n\nclass EquateRange extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"equateRange\");\n\n    this.from = attributes.from || \"\";\n    this.to = attributes.to || \"\";\n    this._unicodeRange = attributes.unicodeRange || \"\";\n  }\n\n  get unicodeRange() {\n    const ranges = [];\n    const unicodeRegex = /U\\+([0-9a-fA-F]+)/;\n    const unicodeRange = this._unicodeRange;\n    for (let range of unicodeRange\n      .split(\",\")\n      .map(x => x.trim())\n      .filter(x => !!x)) {\n      range = range.split(\"-\", 2).map(x => {\n        const found = x.match(unicodeRegex);\n        if (!found) {\n          return 0;\n        }\n        return parseInt(found[1], 16);\n      });\n      if (range.length === 1) {\n        range.push(range[0]);\n      }\n      ranges.push(range);\n    }\n    return shadow(this, \"unicodeRange\", ranges);\n  }\n}\n\nclass Exclude extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"exclude\");\n  }\n\n  [$finalize]() {\n    this[$content] = this[$content]\n      .trim()\n      .split(/\\s+/)\n      .filter(\n        x =>\n          x &&\n          [\n            \"calculate\",\n            \"close\",\n            \"enter\",\n            \"exit\",\n            \"initialize\",\n            \"ready\",\n            \"validate\",\n          ].includes(x)\n      );\n  }\n}\n\nclass ExcludeNS extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"excludeNS\");\n  }\n}\n\nclass FlipLabel extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"flipLabel\", [\"usePrinterSetting\", \"on\", \"off\"]);\n  }\n}\n\nclass FontInfo extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"fontInfo\", /* hasChildren = */ true);\n    this.embed = null;\n    this.map = null;\n    this.subsetBelow = null;\n    this.alwaysEmbed = new XFAObjectArray();\n    this.defaultTypeface = new XFAObjectArray();\n    this.neverEmbed = new XFAObjectArray();\n  }\n}\n\nclass FormFieldFilling extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"formFieldFilling\");\n  }\n}\n\nclass GroupParent extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"groupParent\");\n  }\n}\n\nclass IfEmpty extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"ifEmpty\", [\n      \"dataValue\",\n      \"dataGroup\",\n      \"ignore\",\n      \"remove\",\n    ]);\n  }\n}\n\nclass IncludeXDPContent extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"includeXDPContent\");\n  }\n}\n\nclass IncrementalLoad extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"incrementalLoad\", [\"none\", \"forwardOnly\"]);\n  }\n}\n\nclass IncrementalMerge extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"incrementalMerge\");\n  }\n}\n\nclass Interactive extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"interactive\");\n  }\n}\n\nclass Jog extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"jog\", [\"usePrinterSetting\", \"none\", \"pageSet\"]);\n  }\n}\n\nclass LabelPrinter extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"labelPrinter\", /* hasChildren = */ true);\n    this.name = getStringOption(attributes.name, [\"zpl\", \"dpl\", \"ipl\", \"tcpl\"]);\n    this.batchOutput = null;\n    this.flipLabel = null;\n    this.fontInfo = null;\n    this.xdc = null;\n  }\n}\n\nclass Layout extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"layout\", [\"paginate\", \"panel\"]);\n  }\n}\n\nclass Level extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"level\", 0, n => n > 0);\n  }\n}\n\nclass Linearized extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"linearized\");\n  }\n}\n\nclass Locale extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"locale\");\n  }\n}\n\nclass LocaleSet extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"localeSet\");\n  }\n}\n\nclass Log extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"log\", /* hasChildren = */ true);\n    this.mode = null;\n    this.threshold = null;\n    this.to = null;\n    this.uri = null;\n  }\n}\n\n// Renamed in MapElement to avoid confusion with usual js Map.\nclass MapElement extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"map\", /* hasChildren = */ true);\n    this.equate = new XFAObjectArray();\n    this.equateRange = new XFAObjectArray();\n  }\n}\n\nclass MediumInfo extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"mediumInfo\", /* hasChildren = */ true);\n    this.map = null;\n  }\n}\n\nclass Message extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"message\", /* hasChildren = */ true);\n    this.msgId = null;\n    this.severity = null;\n  }\n}\n\nclass Messaging extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"messaging\", /* hasChildren = */ true);\n    this.message = new XFAObjectArray();\n  }\n}\n\nclass Mode extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"mode\", [\"append\", \"overwrite\"]);\n  }\n}\n\nclass ModifyAnnots extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"modifyAnnots\");\n  }\n}\n\nclass MsgId extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"msgId\", 1, n => n >= 1);\n  }\n}\n\nclass NameAttr extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"nameAttr\");\n  }\n}\n\nclass NeverEmbed extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"neverEmbed\");\n  }\n}\n\nclass NumberOfCopies extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"numberOfCopies\", null, n => n >= 2 && n <= 5);\n  }\n}\n\nclass OpenAction extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"openAction\", /* hasChildren = */ true);\n    this.destination = null;\n  }\n}\n\nclass Output extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"output\", /* hasChildren = */ true);\n    this.to = null;\n    this.type = null;\n    this.uri = null;\n  }\n}\n\nclass OutputBin extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"outputBin\");\n  }\n}\n\nclass OutputXSL extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"outputXSL\", /* hasChildren = */ true);\n    this.uri = null;\n  }\n}\n\nclass Overprint extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"overprint\", [\"none\", \"both\", \"draw\", \"field\"]);\n  }\n}\n\nclass Packets extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"packets\");\n  }\n\n  [$finalize]() {\n    if (this[$content] === \"*\") {\n      return;\n    }\n    this[$content] = this[$content]\n      .trim()\n      .split(/\\s+/)\n      .filter(x =>\n        [\"config\", \"datasets\", \"template\", \"xfdf\", \"xslt\"].includes(x)\n      );\n  }\n}\n\nclass PageOffset extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pageOffset\");\n    this.x = getInteger({\n      data: attributes.x,\n      defaultValue: \"useXDCSetting\",\n      validate: n => true,\n    });\n    this.y = getInteger({\n      data: attributes.y,\n      defaultValue: \"useXDCSetting\",\n      validate: n => true,\n    });\n  }\n}\n\nclass PageRange extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pageRange\");\n  }\n\n  [$finalize]() {\n    const numbers = this[$content]\n      .trim()\n      .split(/\\s+/)\n      .map(x => parseInt(x, 10));\n    const ranges = [];\n    for (let i = 0, ii = numbers.length; i < ii; i += 2) {\n      ranges.push(numbers.slice(i, i + 2));\n    }\n    this[$content] = ranges;\n  }\n}\n\nclass Pagination extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pagination\", [\n      \"simplex\",\n      \"duplexShortEdge\",\n      \"duplexLongEdge\",\n    ]);\n  }\n}\n\nclass PaginationOverride extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"paginationOverride\", [\n      \"none\",\n      \"forceDuplex\",\n      \"forceDuplexLongEdge\",\n      \"forceDuplexShortEdge\",\n      \"forceSimplex\",\n    ]);\n  }\n}\n\nclass Part extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"part\", 1, n => false);\n  }\n}\n\nclass Pcl extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pcl\", /* hasChildren = */ true);\n    this.name = attributes.name || \"\";\n    this.batchOutput = null;\n    this.fontInfo = null;\n    this.jog = null;\n    this.mediumInfo = null;\n    this.outputBin = null;\n    this.pageOffset = null;\n    this.staple = null;\n    this.xdc = null;\n  }\n}\n\nclass Pdf extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pdf\", /* hasChildren = */ true);\n    this.name = attributes.name || \"\";\n    this.adobeExtensionLevel = null;\n    this.batchOutput = null;\n    this.compression = null;\n    this.creator = null;\n    this.encryption = null;\n    this.fontInfo = null;\n    this.interactive = null;\n    this.linearized = null;\n    this.openAction = null;\n    this.pdfa = null;\n    this.producer = null;\n    this.renderPolicy = null;\n    this.scriptModel = null;\n    this.silentPrint = null;\n    this.submitFormat = null;\n    this.tagged = null;\n    this.version = null;\n    this.viewerPreferences = null;\n    this.xdc = null;\n  }\n}\n\nclass Pdfa extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pdfa\", /* hasChildren = */ true);\n    this.amd = null;\n    this.conformance = null;\n    this.includeXDPContent = null;\n    this.part = null;\n  }\n}\n\nclass Permissions extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"permissions\", /* hasChildren = */ true);\n    this.accessibleContent = null;\n    this.change = null;\n    this.contentCopy = null;\n    this.documentAssembly = null;\n    this.formFieldFilling = null;\n    this.modifyAnnots = null;\n    this.plaintextMetadata = null;\n    this.print = null;\n    this.printHighQuality = null;\n  }\n}\n\nclass PickTrayByPDFSize extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"pickTrayByPDFSize\");\n  }\n}\n\nclass Picture extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"picture\");\n  }\n\n  // TODO: check the validity of the picture clause.\n  // See page 1150 in the spec.\n}\n\nclass PlaintextMetadata extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"plaintextMetadata\");\n  }\n}\n\nclass Presence extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"presence\", [\n      \"preserve\",\n      \"dissolve\",\n      \"dissolveStructure\",\n      \"ignore\",\n      \"remove\",\n    ]);\n  }\n}\n\nclass Present extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"present\", /* hasChildren = */ true);\n    this.behaviorOverride = null;\n    this.cache = null;\n    this.common = null;\n    this.copies = null;\n    this.destination = null;\n    this.incrementalMerge = null;\n    this.layout = null;\n    this.output = null;\n    this.overprint = null;\n    this.pagination = null;\n    this.paginationOverride = null;\n    this.script = null;\n    this.validate = null;\n    this.xdp = null;\n    this.driver = new XFAObjectArray();\n    this.labelPrinter = new XFAObjectArray();\n    this.pcl = new XFAObjectArray();\n    this.pdf = new XFAObjectArray();\n    this.ps = new XFAObjectArray();\n    this.submitUrl = new XFAObjectArray();\n    this.webClient = new XFAObjectArray();\n    this.zpl = new XFAObjectArray();\n  }\n}\n\nclass Print extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"print\");\n  }\n}\n\nclass PrintHighQuality extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"printHighQuality\");\n  }\n}\n\nclass PrintScaling extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"printScaling\", [\"appdefault\", \"noScaling\"]);\n  }\n}\n\nclass PrinterName extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"printerName\");\n  }\n}\n\nclass Producer extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"producer\");\n  }\n}\n\nclass Ps extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"ps\", /* hasChildren = */ true);\n    this.name = attributes.name || \"\";\n    this.batchOutput = null;\n    this.fontInfo = null;\n    this.jog = null;\n    this.mediumInfo = null;\n    this.outputBin = null;\n    this.staple = null;\n    this.xdc = null;\n  }\n}\n\nclass Range extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"range\");\n  }\n\n  [$finalize]() {\n    this[$content] = this[$content]\n      .split(\",\", 2)\n      .map(range => range.split(\"-\").map(x => parseInt(x.trim(), 10)))\n      .filter(range => range.every(x => !isNaN(x)))\n      .map(range => {\n        if (range.length === 1) {\n          range.push(range[0]);\n        }\n        return range;\n      });\n  }\n}\n\nclass Record extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"record\");\n  }\n\n  [$finalize]() {\n    this[$content] = this[$content].trim();\n    const n = parseInt(this[$content], 10);\n    if (!isNaN(n) && n >= 0) {\n      this[$content] = n;\n    }\n  }\n}\n\nclass Relevant extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"relevant\");\n  }\n\n  [$finalize]() {\n    this[$content] = this[$content].trim().split(/\\s+/);\n  }\n}\n\nclass Rename extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"rename\");\n  }\n\n  [$finalize]() {\n    this[$content] = this[$content].trim();\n    // String must be a XFA name: same as XML one except that there\n    // is no colon.\n    if (\n      this[$content].toLowerCase().startsWith(\"xml\") ||\n      /[\\p{L}_][\\p{L}\\d._\\p{M}-]*/u.test(this[$content])\n    ) {\n      warn(\"XFA - Rename: invalid XFA name\");\n    }\n  }\n}\n\nclass RenderPolicy extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"renderPolicy\", [\"server\", \"client\"]);\n  }\n}\n\nclass RunScripts extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"runScripts\", [\"both\", \"client\", \"none\", \"server\"]);\n  }\n}\n\nclass Script extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"script\", /* hasChildren = */ true);\n    this.currentPage = null;\n    this.exclude = null;\n    this.runScripts = null;\n  }\n}\n\nclass ScriptModel extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"scriptModel\", [\"XFA\", \"none\"]);\n  }\n}\n\nclass Severity extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"severity\", [\n      \"ignore\",\n      \"error\",\n      \"information\",\n      \"trace\",\n      \"warning\",\n    ]);\n  }\n}\n\nclass SilentPrint extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"silentPrint\", /* hasChildren = */ true);\n    this.addSilentPrint = null;\n    this.printerName = null;\n  }\n}\n\nclass Staple extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"staple\");\n    this.mode = getStringOption(attributes.mode, [\n      \"usePrinterSetting\",\n      \"on\",\n      \"off\",\n    ]);\n  }\n}\n\nclass StartNode extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"startNode\");\n  }\n}\n\nclass StartPage extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"startPage\", 0, n => true);\n  }\n}\n\nclass SubmitFormat extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"submitFormat\", [\n      \"html\",\n      \"delegate\",\n      \"fdf\",\n      \"xml\",\n      \"pdf\",\n    ]);\n  }\n}\n\nclass SubmitUrl extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"submitUrl\");\n  }\n}\n\nclass SubsetBelow extends IntegerObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"subsetBelow\", 100, n => n >= 0 && n <= 100);\n  }\n}\n\nclass SuppressBanner extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"suppressBanner\");\n  }\n}\n\nclass Tagged extends Option01 {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"tagged\");\n  }\n}\n\nclass Template extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"template\", /* hasChildren = */ true);\n    this.base = null;\n    this.relevant = null;\n    this.startPage = null;\n    this.uri = null;\n    this.xsl = null;\n  }\n}\n\nclass Threshold extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"threshold\", [\n      \"trace\",\n      \"error\",\n      \"information\",\n      \"warning\",\n    ]);\n  }\n}\n\nclass To extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"to\", [\n      \"null\",\n      \"memory\",\n      \"stderr\",\n      \"stdout\",\n      \"system\",\n      \"uri\",\n    ]);\n  }\n}\n\nclass TemplateCache extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"templateCache\");\n    this.maxEntries = getInteger({\n      data: attributes.maxEntries,\n      defaultValue: 5,\n      validate: n => n >= 0,\n    });\n  }\n}\n\nclass Trace extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"trace\", /* hasChildren = */ true);\n    this.area = new XFAObjectArray();\n  }\n}\n\nclass Transform extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"transform\", /* hasChildren = */ true);\n    this.groupParent = null;\n    this.ifEmpty = null;\n    this.nameAttr = null;\n    this.picture = null;\n    this.presence = null;\n    this.rename = null;\n    this.whitespace = null;\n  }\n}\n\nclass Type extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"type\", [\n      \"none\",\n      \"ascii85\",\n      \"asciiHex\",\n      \"ccittfax\",\n      \"flate\",\n      \"lzw\",\n      \"runLength\",\n      \"native\",\n      \"xdp\",\n      \"mergedXDP\",\n    ]);\n  }\n}\n\nclass Uri extends StringObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"uri\");\n  }\n}\n\nclass Validate extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"validate\", [\n      \"preSubmit\",\n      \"prePrint\",\n      \"preExecute\",\n      \"preSave\",\n    ]);\n  }\n}\n\nclass ValidateApprovalSignatures extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"validateApprovalSignatures\");\n  }\n\n  [$finalize]() {\n    this[$content] = this[$content]\n      .trim()\n      .split(/\\s+/)\n      .filter(x => [\"docReady\", \"postSign\"].includes(x));\n  }\n}\n\nclass ValidationMessaging extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"validationMessaging\", [\n      \"allMessagesIndividually\",\n      \"allMessagesTogether\",\n      \"firstMessageOnly\",\n      \"noMessages\",\n    ]);\n  }\n}\n\nclass Version extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"version\", [\"1.7\", \"1.6\", \"1.5\", \"1.4\", \"1.3\", \"1.2\"]);\n  }\n}\n\nclass VersionControl extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"VersionControl\");\n    this.outputBelow = getStringOption(attributes.outputBelow, [\n      \"warn\",\n      \"error\",\n      \"update\",\n    ]);\n    this.sourceAbove = getStringOption(attributes.sourceAbove, [\n      \"warn\",\n      \"error\",\n    ]);\n    this.sourceBelow = getStringOption(attributes.sourceBelow, [\n      \"update\",\n      \"maintain\",\n    ]);\n  }\n}\n\nclass ViewerPreferences extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"viewerPreferences\", /* hasChildren = */ true);\n    this.ADBE_JSConsole = null;\n    this.ADBE_JSDebugger = null;\n    this.addViewerPreferences = null;\n    this.duplexOption = null;\n    this.enforce = null;\n    this.numberOfCopies = null;\n    this.pageRange = null;\n    this.pickTrayByPDFSize = null;\n    this.printScaling = null;\n  }\n}\n\nclass WebClient extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"webClient\", /* hasChildren = */ true);\n    this.name = attributes.name ? attributes.name.trim() : \"\";\n    this.fontInfo = null;\n    this.xdc = null;\n  }\n}\n\nclass Whitespace extends OptionObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"whitespace\", [\n      \"preserve\",\n      \"ltrim\",\n      \"normalize\",\n      \"rtrim\",\n      \"trim\",\n    ]);\n  }\n}\n\nclass Window extends ContentObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"window\");\n  }\n\n  [$finalize]() {\n    const pair = this[$content].split(\",\", 2).map(x => parseInt(x.trim(), 10));\n    if (pair.some(x => isNaN(x))) {\n      this[$content] = [0, 0];\n      return;\n    }\n    if (pair.length === 1) {\n      pair.push(pair[0]);\n    }\n    this[$content] = pair;\n  }\n}\n\nclass Xdc extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"xdc\", /* hasChildren = */ true);\n    this.uri = new XFAObjectArray();\n    this.xsl = new XFAObjectArray();\n  }\n}\n\nclass Xdp extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"xdp\", /* hasChildren = */ true);\n    this.packets = null;\n  }\n}\n\nclass Xsl extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"xsl\", /* hasChildren = */ true);\n    this.debug = null;\n    this.uri = null;\n  }\n}\n\nclass Zpl extends XFAObject {\n  constructor(attributes) {\n    super(CONFIG_NS_ID, \"zpl\", /* hasChildren = */ true);\n    this.name = attributes.name ? attributes.name.trim() : \"\";\n    this.batchOutput = null;\n    this.flipLabel = null;\n    this.fontInfo = null;\n    this.xdc = null;\n  }\n}\n\nclass ConfigNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(ConfigNamespace, name)) {\n      return ConfigNamespace[name](attributes);\n    }\n    return undefined;\n  }\n\n  static acrobat(attrs) {\n    return new Acrobat(attrs);\n  }\n\n  static acrobat7(attrs) {\n    return new Acrobat7(attrs);\n  }\n\n  static ADBE_JSConsole(attrs) {\n    return new ADBE_JSConsole(attrs);\n  }\n\n  static ADBE_JSDebugger(attrs) {\n    return new ADBE_JSDebugger(attrs);\n  }\n\n  static addSilentPrint(attrs) {\n    return new AddSilentPrint(attrs);\n  }\n\n  static addViewerPreferences(attrs) {\n    return new AddViewerPreferences(attrs);\n  }\n\n  static adjustData(attrs) {\n    return new AdjustData(attrs);\n  }\n\n  static adobeExtensionLevel(attrs) {\n    return new AdobeExtensionLevel(attrs);\n  }\n\n  static agent(attrs) {\n    return new Agent(attrs);\n  }\n\n  static alwaysEmbed(attrs) {\n    return new AlwaysEmbed(attrs);\n  }\n\n  static amd(attrs) {\n    return new Amd(attrs);\n  }\n\n  static area(attrs) {\n    return new Area(attrs);\n  }\n\n  static attributes(attrs) {\n    return new Attributes(attrs);\n  }\n\n  static autoSave(attrs) {\n    return new AutoSave(attrs);\n  }\n\n  static base(attrs) {\n    return new Base(attrs);\n  }\n\n  static batchOutput(attrs) {\n    return new BatchOutput(attrs);\n  }\n\n  static behaviorOverride(attrs) {\n    return new BehaviorOverride(attrs);\n  }\n\n  static cache(attrs) {\n    return new Cache(attrs);\n  }\n\n  static change(attrs) {\n    return new Change(attrs);\n  }\n\n  static common(attrs) {\n    return new Common(attrs);\n  }\n\n  static compress(attrs) {\n    return new Compress(attrs);\n  }\n\n  static compressLogicalStructure(attrs) {\n    return new CompressLogicalStructure(attrs);\n  }\n\n  static compressObjectStream(attrs) {\n    return new CompressObjectStream(attrs);\n  }\n\n  static compression(attrs) {\n    return new Compression(attrs);\n  }\n\n  static config(attrs) {\n    return new Config(attrs);\n  }\n\n  static conformance(attrs) {\n    return new Conformance(attrs);\n  }\n\n  static contentCopy(attrs) {\n    return new ContentCopy(attrs);\n  }\n\n  static copies(attrs) {\n    return new Copies(attrs);\n  }\n\n  static creator(attrs) {\n    return new Creator(attrs);\n  }\n\n  static currentPage(attrs) {\n    return new CurrentPage(attrs);\n  }\n\n  static data(attrs) {\n    return new Data(attrs);\n  }\n\n  static debug(attrs) {\n    return new Debug(attrs);\n  }\n\n  static defaultTypeface(attrs) {\n    return new DefaultTypeface(attrs);\n  }\n\n  static destination(attrs) {\n    return new Destination(attrs);\n  }\n\n  static documentAssembly(attrs) {\n    return new DocumentAssembly(attrs);\n  }\n\n  static driver(attrs) {\n    return new Driver(attrs);\n  }\n\n  static duplexOption(attrs) {\n    return new DuplexOption(attrs);\n  }\n\n  static dynamicRender(attrs) {\n    return new DynamicRender(attrs);\n  }\n\n  static embed(attrs) {\n    return new Embed(attrs);\n  }\n\n  static encrypt(attrs) {\n    return new Encrypt(attrs);\n  }\n\n  static encryption(attrs) {\n    return new Encryption(attrs);\n  }\n\n  static encryptionLevel(attrs) {\n    return new EncryptionLevel(attrs);\n  }\n\n  static enforce(attrs) {\n    return new Enforce(attrs);\n  }\n\n  static equate(attrs) {\n    return new Equate(attrs);\n  }\n\n  static equateRange(attrs) {\n    return new EquateRange(attrs);\n  }\n\n  static exclude(attrs) {\n    return new Exclude(attrs);\n  }\n\n  static excludeNS(attrs) {\n    return new ExcludeNS(attrs);\n  }\n\n  static flipLabel(attrs) {\n    return new FlipLabel(attrs);\n  }\n\n  static fontInfo(attrs) {\n    return new FontInfo(attrs);\n  }\n\n  static formFieldFilling(attrs) {\n    return new FormFieldFilling(attrs);\n  }\n\n  static groupParent(attrs) {\n    return new GroupParent(attrs);\n  }\n\n  static ifEmpty(attrs) {\n    return new IfEmpty(attrs);\n  }\n\n  static includeXDPContent(attrs) {\n    return new IncludeXDPContent(attrs);\n  }\n\n  static incrementalLoad(attrs) {\n    return new IncrementalLoad(attrs);\n  }\n\n  static incrementalMerge(attrs) {\n    return new IncrementalMerge(attrs);\n  }\n\n  static interactive(attrs) {\n    return new Interactive(attrs);\n  }\n\n  static jog(attrs) {\n    return new Jog(attrs);\n  }\n\n  static labelPrinter(attrs) {\n    return new LabelPrinter(attrs);\n  }\n\n  static layout(attrs) {\n    return new Layout(attrs);\n  }\n\n  static level(attrs) {\n    return new Level(attrs);\n  }\n\n  static linearized(attrs) {\n    return new Linearized(attrs);\n  }\n\n  static locale(attrs) {\n    return new Locale(attrs);\n  }\n\n  static localeSet(attrs) {\n    return new LocaleSet(attrs);\n  }\n\n  static log(attrs) {\n    return new Log(attrs);\n  }\n\n  static map(attrs) {\n    return new MapElement(attrs);\n  }\n\n  static mediumInfo(attrs) {\n    return new MediumInfo(attrs);\n  }\n\n  static message(attrs) {\n    return new Message(attrs);\n  }\n\n  static messaging(attrs) {\n    return new Messaging(attrs);\n  }\n\n  static mode(attrs) {\n    return new Mode(attrs);\n  }\n\n  static modifyAnnots(attrs) {\n    return new ModifyAnnots(attrs);\n  }\n\n  static msgId(attrs) {\n    return new MsgId(attrs);\n  }\n\n  static nameAttr(attrs) {\n    return new NameAttr(attrs);\n  }\n\n  static neverEmbed(attrs) {\n    return new NeverEmbed(attrs);\n  }\n\n  static numberOfCopies(attrs) {\n    return new NumberOfCopies(attrs);\n  }\n\n  static openAction(attrs) {\n    return new OpenAction(attrs);\n  }\n\n  static output(attrs) {\n    return new Output(attrs);\n  }\n\n  static outputBin(attrs) {\n    return new OutputBin(attrs);\n  }\n\n  static outputXSL(attrs) {\n    return new OutputXSL(attrs);\n  }\n\n  static overprint(attrs) {\n    return new Overprint(attrs);\n  }\n\n  static packets(attrs) {\n    return new Packets(attrs);\n  }\n\n  static pageOffset(attrs) {\n    return new PageOffset(attrs);\n  }\n\n  static pageRange(attrs) {\n    return new PageRange(attrs);\n  }\n\n  static pagination(attrs) {\n    return new Pagination(attrs);\n  }\n\n  static paginationOverride(attrs) {\n    return new PaginationOverride(attrs);\n  }\n\n  static part(attrs) {\n    return new Part(attrs);\n  }\n\n  static pcl(attrs) {\n    return new Pcl(attrs);\n  }\n\n  static pdf(attrs) {\n    return new Pdf(attrs);\n  }\n\n  static pdfa(attrs) {\n    return new Pdfa(attrs);\n  }\n\n  static permissions(attrs) {\n    return new Permissions(attrs);\n  }\n\n  static pickTrayByPDFSize(attrs) {\n    return new PickTrayByPDFSize(attrs);\n  }\n\n  static picture(attrs) {\n    return new Picture(attrs);\n  }\n\n  static plaintextMetadata(attrs) {\n    return new PlaintextMetadata(attrs);\n  }\n\n  static presence(attrs) {\n    return new Presence(attrs);\n  }\n\n  static present(attrs) {\n    return new Present(attrs);\n  }\n\n  static print(attrs) {\n    return new Print(attrs);\n  }\n\n  static printHighQuality(attrs) {\n    return new PrintHighQuality(attrs);\n  }\n\n  static printScaling(attrs) {\n    return new PrintScaling(attrs);\n  }\n\n  static printerName(attrs) {\n    return new PrinterName(attrs);\n  }\n\n  static producer(attrs) {\n    return new Producer(attrs);\n  }\n\n  static ps(attrs) {\n    return new Ps(attrs);\n  }\n\n  static range(attrs) {\n    return new Range(attrs);\n  }\n\n  static record(attrs) {\n    return new Record(attrs);\n  }\n\n  static relevant(attrs) {\n    return new Relevant(attrs);\n  }\n\n  static rename(attrs) {\n    return new Rename(attrs);\n  }\n\n  static renderPolicy(attrs) {\n    return new RenderPolicy(attrs);\n  }\n\n  static runScripts(attrs) {\n    return new RunScripts(attrs);\n  }\n\n  static script(attrs) {\n    return new Script(attrs);\n  }\n\n  static scriptModel(attrs) {\n    return new ScriptModel(attrs);\n  }\n\n  static severity(attrs) {\n    return new Severity(attrs);\n  }\n\n  static silentPrint(attrs) {\n    return new SilentPrint(attrs);\n  }\n\n  static staple(attrs) {\n    return new Staple(attrs);\n  }\n\n  static startNode(attrs) {\n    return new StartNode(attrs);\n  }\n\n  static startPage(attrs) {\n    return new StartPage(attrs);\n  }\n\n  static submitFormat(attrs) {\n    return new SubmitFormat(attrs);\n  }\n\n  static submitUrl(attrs) {\n    return new SubmitUrl(attrs);\n  }\n\n  static subsetBelow(attrs) {\n    return new SubsetBelow(attrs);\n  }\n\n  static suppressBanner(attrs) {\n    return new SuppressBanner(attrs);\n  }\n\n  static tagged(attrs) {\n    return new Tagged(attrs);\n  }\n\n  static template(attrs) {\n    return new Template(attrs);\n  }\n\n  static templateCache(attrs) {\n    return new TemplateCache(attrs);\n  }\n\n  static threshold(attrs) {\n    return new Threshold(attrs);\n  }\n\n  static to(attrs) {\n    return new To(attrs);\n  }\n\n  static trace(attrs) {\n    return new Trace(attrs);\n  }\n\n  static transform(attrs) {\n    return new Transform(attrs);\n  }\n\n  static type(attrs) {\n    return new Type(attrs);\n  }\n\n  static uri(attrs) {\n    return new Uri(attrs);\n  }\n\n  static validate(attrs) {\n    return new Validate(attrs);\n  }\n\n  static validateApprovalSignatures(attrs) {\n    return new ValidateApprovalSignatures(attrs);\n  }\n\n  static validationMessaging(attrs) {\n    return new ValidationMessaging(attrs);\n  }\n\n  static version(attrs) {\n    return new Version(attrs);\n  }\n\n  static versionControl(attrs) {\n    return new VersionControl(attrs);\n  }\n\n  static viewerPreferences(attrs) {\n    return new ViewerPreferences(attrs);\n  }\n\n  static webClient(attrs) {\n    return new WebClient(attrs);\n  }\n\n  static whitespace(attrs) {\n    return new Whitespace(attrs);\n  }\n\n  static window(attrs) {\n    return new Window(attrs);\n  }\n\n  static xdc(attrs) {\n    return new Xdc(attrs);\n  }\n\n  static xdp(attrs) {\n    return new Xdp(attrs);\n  }\n\n  static xsl(attrs) {\n    return new Xsl(attrs);\n  }\n\n  static zpl(attrs) {\n    return new Zpl(attrs);\n  }\n}\n\nexport { ConfigNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport { StringObject, XFAObject, XFAObjectArray } from \"./xfa_object.js\";\n\nconst CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id;\n\nclass ConnectionSet extends XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"connectionSet\", /* hasChildren = */ true);\n    this.wsdlConnection = new XFAObjectArray();\n    this.xmlConnection = new XFAObjectArray();\n    this.xsdConnection = new XFAObjectArray();\n  }\n}\n\nclass EffectiveInputPolicy extends XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"effectiveInputPolicy\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass EffectiveOutputPolicy extends XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"effectiveOutputPolicy\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Operation extends StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"operation\");\n    this.id = attributes.id || \"\";\n    this.input = attributes.input || \"\";\n    this.name = attributes.name || \"\";\n    this.output = attributes.output || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass RootElement extends StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"rootElement\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass SoapAction extends StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"soapAction\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass SoapAddress extends StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"soapAddress\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass Uri extends StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"uri\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass WsdlAddress extends StringObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"wsdlAddress\");\n    this.id = attributes.id || \"\";\n    this.name = attributes.name || \"\";\n    this.use = attributes.use || \"\";\n    this.usehref = attributes.usehref || \"\";\n  }\n}\n\nclass WsdlConnection extends XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"wsdlConnection\", /* hasChildren = */ true);\n    this.dataDescription = attributes.dataDescription || \"\";\n    this.name = attributes.name || \"\";\n    this.effectiveInputPolicy = null;\n    this.effectiveOutputPolicy = null;\n    this.operation = null;\n    this.soapAction = null;\n    this.soapAddress = null;\n    this.wsdlAddress = null;\n  }\n}\n\nclass XmlConnection extends XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"xmlConnection\", /* hasChildren = */ true);\n    this.dataDescription = attributes.dataDescription || \"\";\n    this.name = attributes.name || \"\";\n    this.uri = null;\n  }\n}\n\nclass XsdConnection extends XFAObject {\n  constructor(attributes) {\n    super(CONNECTION_SET_NS_ID, \"xsdConnection\", /* hasChildren = */ true);\n    this.dataDescription = attributes.dataDescription || \"\";\n    this.name = attributes.name || \"\";\n    this.rootElement = null;\n    this.uri = null;\n  }\n}\n\nclass ConnectionSetNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(ConnectionSetNamespace, name)) {\n      return ConnectionSetNamespace[name](attributes);\n    }\n    return undefined;\n  }\n\n  static connectionSet(attrs) {\n    return new ConnectionSet(attrs);\n  }\n\n  static effectiveInputPolicy(attrs) {\n    return new EffectiveInputPolicy(attrs);\n  }\n\n  static effectiveOutputPolicy(attrs) {\n    return new EffectiveOutputPolicy(attrs);\n  }\n\n  static operation(attrs) {\n    return new Operation(attrs);\n  }\n\n  static rootElement(attrs) {\n    return new RootElement(attrs);\n  }\n\n  static soapAction(attrs) {\n    return new SoapAction(attrs);\n  }\n\n  static soapAddress(attrs) {\n    return new SoapAddress(attrs);\n  }\n\n  static uri(attrs) {\n    return new Uri(attrs);\n  }\n\n  static wsdlAddress(attrs) {\n    return new WsdlAddress(attrs);\n  }\n\n  static wsdlConnection(attrs) {\n    return new WsdlConnection(attrs);\n  }\n\n  static xmlConnection(attrs) {\n    return new XmlConnection(attrs);\n  }\n\n  static xsdConnection(attrs) {\n    return new XsdConnection(attrs);\n  }\n}\n\nexport { ConnectionSetNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $appendChild,\n  $isNsAgnostic,\n  $namespaceId,\n  $nodeName,\n  $onChild,\n} from \"./symbol_utils.js\";\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport { XFAObject, XmlObject } from \"./xfa_object.js\";\n\nconst DATASETS_NS_ID = NamespaceIds.datasets.id;\n\nclass Data extends XmlObject {\n  constructor(attributes) {\n    super(DATASETS_NS_ID, \"data\", attributes);\n  }\n\n  [$isNsAgnostic]() {\n    return true;\n  }\n}\n\nclass Datasets extends XFAObject {\n  constructor(attributes) {\n    super(DATASETS_NS_ID, \"datasets\", /* hasChildren = */ true);\n    this.data = null;\n    this.Signature = null;\n  }\n\n  [$onChild](child) {\n    const name = child[$nodeName];\n    if (\n      (name === \"data\" && child[$namespaceId] === DATASETS_NS_ID) ||\n      (name === \"Signature\" &&\n        child[$namespaceId] === NamespaceIds.signature.id)\n    ) {\n      this[name] = child;\n    }\n    this[$appendChild](child);\n  }\n}\n\nclass DatasetsNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(DatasetsNamespace, name)) {\n      return DatasetsNamespace[name](attributes);\n    }\n    return undefined;\n  }\n\n  static datasets(attributes) {\n    return new Datasets(attributes);\n  }\n\n  static data(attributes) {\n    return new Data(attributes);\n  }\n}\n\nexport { DatasetsNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport {\n  ContentObject,\n  StringObject,\n  XFAObject,\n  XFAObjectArray,\n} from \"./xfa_object.js\";\nimport { getInteger, getStringOption } from \"./utils.js\";\n\nconst LOCALE_SET_NS_ID = NamespaceIds.localeSet.id;\n\nclass CalendarSymbols extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"calendarSymbols\", /* hasChildren = */ true);\n    this.name = \"gregorian\";\n    this.dayNames = new XFAObjectArray(2);\n    this.eraNames = null;\n    this.meridiemNames = null;\n    this.monthNames = new XFAObjectArray(2);\n  }\n}\n\nclass CurrencySymbol extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"currencySymbol\");\n    this.name = getStringOption(attributes.name, [\n      \"symbol\",\n      \"isoname\",\n      \"decimal\",\n    ]);\n  }\n}\n\nclass CurrencySymbols extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"currencySymbols\", /* hasChildren = */ true);\n    this.currencySymbol = new XFAObjectArray(3);\n  }\n}\n\nclass DatePattern extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"datePattern\");\n    this.name = getStringOption(attributes.name, [\n      \"full\",\n      \"long\",\n      \"med\",\n      \"short\",\n    ]);\n  }\n}\n\nclass DatePatterns extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"datePatterns\", /* hasChildren = */ true);\n    this.datePattern = new XFAObjectArray(4);\n  }\n}\n\nclass DateTimeSymbols extends ContentObject {\n  // TODO: spec unclear about the format of the array.\n\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"dateTimeSymbols\");\n  }\n}\n\nclass Day extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"day\");\n  }\n}\n\nclass DayNames extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"dayNames\", /* hasChildren = */ true);\n    this.abbr = getInteger({\n      data: attributes.abbr,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.day = new XFAObjectArray(7);\n  }\n}\n\nclass Era extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"era\");\n  }\n}\n\nclass EraNames extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"eraNames\", /* hasChildren = */ true);\n    this.era = new XFAObjectArray(2);\n  }\n}\n\nclass Locale extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"locale\", /* hasChildren = */ true);\n    this.desc = attributes.desc || \"\";\n    this.name = \"isoname\";\n    this.calendarSymbols = null;\n    this.currencySymbols = null;\n    this.datePatterns = null;\n    this.dateTimeSymbols = null;\n    this.numberPatterns = null;\n    this.numberSymbols = null;\n    this.timePatterns = null;\n    this.typeFaces = null;\n  }\n}\n\nclass LocaleSet extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"localeSet\", /* hasChildren = */ true);\n    this.locale = new XFAObjectArray();\n  }\n}\n\nclass Meridiem extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"meridiem\");\n  }\n}\n\nclass MeridiemNames extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"meridiemNames\", /* hasChildren = */ true);\n    this.meridiem = new XFAObjectArray(2);\n  }\n}\n\nclass Month extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"month\");\n  }\n}\n\nclass MonthNames extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"monthNames\", /* hasChildren = */ true);\n    this.abbr = getInteger({\n      data: attributes.abbr,\n      defaultValue: 0,\n      validate: x => x === 1,\n    });\n    this.month = new XFAObjectArray(12);\n  }\n}\n\nclass NumberPattern extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"numberPattern\");\n    this.name = getStringOption(attributes.name, [\n      \"full\",\n      \"long\",\n      \"med\",\n      \"short\",\n    ]);\n  }\n}\n\nclass NumberPatterns extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"numberPatterns\", /* hasChildren = */ true);\n    this.numberPattern = new XFAObjectArray(4);\n  }\n}\n\nclass NumberSymbol extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"numberSymbol\");\n    this.name = getStringOption(attributes.name, [\n      \"decimal\",\n      \"grouping\",\n      \"percent\",\n      \"minus\",\n      \"zero\",\n    ]);\n  }\n}\n\nclass NumberSymbols extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"numberSymbols\", /* hasChildren = */ true);\n    this.numberSymbol = new XFAObjectArray(5);\n  }\n}\n\nclass TimePattern extends StringObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"timePattern\");\n    this.name = getStringOption(attributes.name, [\n      \"full\",\n      \"long\",\n      \"med\",\n      \"short\",\n    ]);\n  }\n}\n\nclass TimePatterns extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"timePatterns\", /* hasChildren = */ true);\n    this.timePattern = new XFAObjectArray(4);\n  }\n}\n\nclass TypeFace extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"typeFace\", /* hasChildren = */ true);\n    this.name = attributes.name | \"\";\n  }\n}\n\nclass TypeFaces extends XFAObject {\n  constructor(attributes) {\n    super(LOCALE_SET_NS_ID, \"typeFaces\", /* hasChildren = */ true);\n    this.typeFace = new XFAObjectArray();\n  }\n}\n\nclass LocaleSetNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(LocaleSetNamespace, name)) {\n      return LocaleSetNamespace[name](attributes);\n    }\n    return undefined;\n  }\n\n  static calendarSymbols(attrs) {\n    return new CalendarSymbols(attrs);\n  }\n\n  static currencySymbol(attrs) {\n    return new CurrencySymbol(attrs);\n  }\n\n  static currencySymbols(attrs) {\n    return new CurrencySymbols(attrs);\n  }\n\n  static datePattern(attrs) {\n    return new DatePattern(attrs);\n  }\n\n  static datePatterns(attrs) {\n    return new DatePatterns(attrs);\n  }\n\n  static dateTimeSymbols(attrs) {\n    return new DateTimeSymbols(attrs);\n  }\n\n  static day(attrs) {\n    return new Day(attrs);\n  }\n\n  static dayNames(attrs) {\n    return new DayNames(attrs);\n  }\n\n  static era(attrs) {\n    return new Era(attrs);\n  }\n\n  static eraNames(attrs) {\n    return new EraNames(attrs);\n  }\n\n  static locale(attrs) {\n    return new Locale(attrs);\n  }\n\n  static localeSet(attrs) {\n    return new LocaleSet(attrs);\n  }\n\n  static meridiem(attrs) {\n    return new Meridiem(attrs);\n  }\n\n  static meridiemNames(attrs) {\n    return new MeridiemNames(attrs);\n  }\n\n  static month(attrs) {\n    return new Month(attrs);\n  }\n\n  static monthNames(attrs) {\n    return new MonthNames(attrs);\n  }\n\n  static numberPattern(attrs) {\n    return new NumberPattern(attrs);\n  }\n\n  static numberPatterns(attrs) {\n    return new NumberPatterns(attrs);\n  }\n\n  static numberSymbol(attrs) {\n    return new NumberSymbol(attrs);\n  }\n\n  static numberSymbols(attrs) {\n    return new NumberSymbols(attrs);\n  }\n\n  static timePattern(attrs) {\n    return new TimePattern(attrs);\n  }\n\n  static timePatterns(attrs) {\n    return new TimePatterns(attrs);\n  }\n\n  static typeFace(attrs) {\n    return new TypeFace(attrs);\n  }\n\n  static typeFaces(attrs) {\n    return new TypeFaces(attrs);\n  }\n}\n\nexport { LocaleSetNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport { XFAObject } from \"./xfa_object.js\";\n\nconst SIGNATURE_NS_ID = NamespaceIds.signature.id;\n\nclass Signature extends XFAObject {\n  constructor(attributes) {\n    super(SIGNATURE_NS_ID, \"signature\", /* hasChildren = */ true);\n  }\n}\n\nclass SignatureNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(SignatureNamespace, name)) {\n      return SignatureNamespace[name](attributes);\n    }\n    return undefined;\n  }\n\n  static signature(attributes) {\n    return new Signature(attributes);\n  }\n}\n\nexport { SignatureNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport { XFAObject } from \"./xfa_object.js\";\n\nconst STYLESHEET_NS_ID = NamespaceIds.stylesheet.id;\n\nclass Stylesheet extends XFAObject {\n  constructor(attributes) {\n    super(STYLESHEET_NS_ID, \"stylesheet\", /* hasChildren = */ true);\n  }\n}\n\nclass StylesheetNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(StylesheetNamespace, name)) {\n      return StylesheetNamespace[name](attributes);\n    }\n    return undefined;\n  }\n\n  static stylesheet(attributes) {\n    return new Stylesheet(attributes);\n  }\n}\n\nexport { StylesheetNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport { $namespaceId, $nodeName, $onChildCheck } from \"./symbol_utils.js\";\nimport { XFAObject, XFAObjectArray } from \"./xfa_object.js\";\n\nconst XDP_NS_ID = NamespaceIds.xdp.id;\n\nclass Xdp extends XFAObject {\n  constructor(attributes) {\n    super(XDP_NS_ID, \"xdp\", /* hasChildren = */ true);\n    this.uuid = attributes.uuid || \"\";\n    this.timeStamp = attributes.timeStamp || \"\";\n    this.config = null;\n    this.connectionSet = null;\n    this.datasets = null;\n    this.localeSet = null;\n    this.stylesheet = new XFAObjectArray();\n    this.template = null;\n  }\n\n  [$onChildCheck](child) {\n    const ns = NamespaceIds[child[$nodeName]];\n    return ns && child[$namespaceId] === ns.id;\n  }\n}\n\nclass XdpNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(XdpNamespace, name)) {\n      return XdpNamespace[name](attributes);\n    }\n    return undefined;\n  }\n\n  static xdp(attributes) {\n    return new Xdp(attributes);\n  }\n}\n\nexport { XdpNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $acceptWhitespace,\n  $childrenToHTML,\n  $clean,\n  $content,\n  $extra,\n  $getChildren,\n  $getParent,\n  $globalData,\n  $nodeName,\n  $onText,\n  $pushGlyphs,\n  $text,\n  $toHTML,\n} from \"./symbol_utils.js\";\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport {\n  fixTextIndent,\n  fixURL,\n  measureToString,\n  setFontFamily,\n} from \"./html_utils.js\";\nimport { getMeasurement, HTMLResult, stripQuotes } from \"./utils.js\";\nimport { XmlObject } from \"./xfa_object.js\";\n\nconst XHTML_NS_ID = NamespaceIds.xhtml.id;\nconst $richText = Symbol();\n\nconst VALID_STYLES = new Set([\n  \"color\",\n  \"font\",\n  \"font-family\",\n  \"font-size\",\n  \"font-stretch\",\n  \"font-style\",\n  \"font-weight\",\n  \"margin\",\n  \"margin-bottom\",\n  \"margin-left\",\n  \"margin-right\",\n  \"margin-top\",\n  \"letter-spacing\",\n  \"line-height\",\n  \"orphans\",\n  \"page-break-after\",\n  \"page-break-before\",\n  \"page-break-inside\",\n  \"tab-interval\",\n  \"tab-stop\",\n  \"text-align\",\n  \"text-decoration\",\n  \"text-indent\",\n  \"vertical-align\",\n  \"widows\",\n  \"kerning-mode\",\n  \"xfa-font-horizontal-scale\",\n  \"xfa-font-vertical-scale\",\n  \"xfa-spacerun\",\n  \"xfa-tab-stops\",\n]);\n\nconst StyleMapping = new Map([\n  [\"page-break-after\", \"breakAfter\"],\n  [\"page-break-before\", \"breakBefore\"],\n  [\"page-break-inside\", \"breakInside\"],\n  [\"kerning-mode\", value => (value === \"none\" ? \"none\" : \"normal\")],\n  [\n    \"xfa-font-horizontal-scale\",\n    value => `scaleX(${Math.max(0, parseInt(value, 10) / 100).toFixed(2)})`,\n  ],\n  [\n    \"xfa-font-vertical-scale\",\n    value => `scaleY(${Math.max(0, parseInt(value, 10) / 100).toFixed(2)})`,\n  ],\n  [\"xfa-spacerun\", \"\"],\n  [\"xfa-tab-stops\", \"\"],\n  [\n    \"font-size\",\n    (value, original) => {\n      // The font size must be positive.\n      value = original.fontSize = Math.abs(getMeasurement(value));\n      return measureToString(0.99 * value);\n    },\n  ],\n  [\"letter-spacing\", value => measureToString(getMeasurement(value))],\n  [\"line-height\", value => measureToString(getMeasurement(value))],\n  [\"margin\", value => measureToString(getMeasurement(value))],\n  [\"margin-bottom\", value => measureToString(getMeasurement(value))],\n  [\"margin-left\", value => measureToString(getMeasurement(value))],\n  [\"margin-right\", value => measureToString(getMeasurement(value))],\n  [\"margin-top\", value => measureToString(getMeasurement(value))],\n  [\"text-indent\", value => measureToString(getMeasurement(value))],\n  [\"font-family\", value => value],\n  [\"vertical-align\", value => measureToString(getMeasurement(value))],\n]);\n\nconst spacesRegExp = /\\s+/g;\nconst crlfRegExp = /[\\r\\n]+/g;\nconst crlfForRichTextRegExp = /\\r\\n?/g;\n\nfunction mapStyle(styleStr, node, richText) {\n  const style = Object.create(null);\n  if (!styleStr) {\n    return style;\n  }\n  const original = Object.create(null);\n  for (const [key, value] of styleStr.split(\";\").map(s => s.split(\":\", 2))) {\n    const mapping = StyleMapping.get(key);\n    if (mapping === \"\") {\n      continue;\n    }\n    let newValue = value;\n    if (mapping) {\n      newValue =\n        typeof mapping === \"string\" ? mapping : mapping(value, original);\n    }\n    if (key.endsWith(\"scale\")) {\n      style.transform = style.transform\n        ? `${style[key]} ${newValue}`\n        : newValue;\n    } else {\n      style[key.replaceAll(/-([a-z])/gi, (_, x) => x.toUpperCase())] = newValue;\n    }\n  }\n\n  if (style.fontFamily) {\n    setFontFamily(\n      {\n        typeface: style.fontFamily,\n        weight: style.fontWeight || \"normal\",\n        posture: style.fontStyle || \"normal\",\n        size: original.fontSize || 0,\n      },\n      node,\n      node[$globalData].fontFinder,\n      style\n    );\n  }\n\n  if (\n    richText &&\n    style.verticalAlign &&\n    style.verticalAlign !== \"0px\" &&\n    style.fontSize\n  ) {\n    // A non-zero verticalAlign means that we've a sub/super-script and\n    // consequently the font size must be decreased.\n    // https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf#G11.2097514\n    // And the two following factors to position the scripts have been\n    // found here:\n    // https://en.wikipedia.org/wiki/Subscript_and_superscript#Desktop_publishing\n    const SUB_SUPER_SCRIPT_FACTOR = 0.583;\n    const VERTICAL_FACTOR = 0.333;\n    const fontSize = getMeasurement(style.fontSize);\n    style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR);\n    style.verticalAlign = measureToString(\n      Math.sign(getMeasurement(style.verticalAlign)) *\n        fontSize *\n        VERTICAL_FACTOR\n    );\n  }\n\n  if (richText && style.fontSize) {\n    style.fontSize = `calc(${style.fontSize} * var(--total-scale-factor))`;\n  }\n\n  fixTextIndent(style);\n  return style;\n}\n\nfunction checkStyle(node) {\n  if (!node.style) {\n    return \"\";\n  }\n\n  // Remove any non-allowed keys.\n  return node.style\n    .split(\";\")\n    .filter(s => !!s.trim())\n    .map(s => s.split(\":\", 2).map(t => t.trim()))\n    .filter(([key, value]) => {\n      if (key === \"font-family\") {\n        node[$globalData].usedTypefaces.add(value);\n      }\n      return VALID_STYLES.has(key);\n    })\n    .map(kv => kv.join(\":\"))\n    .join(\";\");\n}\n\nconst NoWhites = new Set([\"body\", \"html\"]);\n\nclass XhtmlObject extends XmlObject {\n  constructor(attributes, name) {\n    super(XHTML_NS_ID, name);\n    this[$richText] = false;\n    this.style = attributes.style || \"\";\n  }\n\n  [$clean](builder) {\n    super[$clean](builder);\n    this.style = checkStyle(this);\n  }\n\n  [$acceptWhitespace]() {\n    return !NoWhites.has(this[$nodeName]);\n  }\n\n  [$onText](str, richText = false) {\n    if (!richText) {\n      str = str.replaceAll(crlfRegExp, \"\");\n      if (!this.style.includes(\"xfa-spacerun:yes\")) {\n        str = str.replaceAll(spacesRegExp, \" \");\n      }\n    } else {\n      this[$richText] = true;\n    }\n\n    if (str) {\n      this[$content] += str;\n    }\n  }\n\n  [$pushGlyphs](measure, mustPop = true) {\n    const xfaFont = Object.create(null);\n    const margin = {\n      top: NaN,\n      bottom: NaN,\n      left: NaN,\n      right: NaN,\n    };\n    let lineHeight = null;\n    for (const [key, value] of this.style\n      .split(\";\")\n      .map(s => s.split(\":\", 2))) {\n      switch (key) {\n        case \"font-family\":\n          xfaFont.typeface = stripQuotes(value);\n          break;\n        case \"font-size\":\n          xfaFont.size = getMeasurement(value);\n          break;\n        case \"font-weight\":\n          xfaFont.weight = value;\n          break;\n        case \"font-style\":\n          xfaFont.posture = value;\n          break;\n        case \"letter-spacing\":\n          xfaFont.letterSpacing = getMeasurement(value);\n          break;\n        case \"margin\":\n          const values = value.split(/ \\t/).map(x => getMeasurement(x));\n          switch (values.length) {\n            case 1:\n              margin.top =\n                margin.bottom =\n                margin.left =\n                margin.right =\n                  values[0];\n              break;\n            case 2:\n              margin.top = margin.bottom = values[0];\n              margin.left = margin.right = values[1];\n              break;\n            case 3:\n              margin.top = values[0];\n              margin.bottom = values[2];\n              margin.left = margin.right = values[1];\n              break;\n            case 4:\n              margin.top = values[0];\n              margin.left = values[1];\n              margin.bottom = values[2];\n              margin.right = values[3];\n              break;\n          }\n          break;\n        case \"margin-top\":\n          margin.top = getMeasurement(value);\n          break;\n        case \"margin-bottom\":\n          margin.bottom = getMeasurement(value);\n          break;\n        case \"margin-left\":\n          margin.left = getMeasurement(value);\n          break;\n        case \"margin-right\":\n          margin.right = getMeasurement(value);\n          break;\n        case \"line-height\":\n          lineHeight = getMeasurement(value);\n          break;\n      }\n    }\n\n    measure.pushData(xfaFont, margin, lineHeight);\n\n    if (this[$content]) {\n      measure.addString(this[$content]);\n    } else {\n      for (const child of this[$getChildren]()) {\n        if (child[$nodeName] === \"#text\") {\n          measure.addString(child[$content]);\n          continue;\n        }\n        child[$pushGlyphs](measure);\n      }\n    }\n\n    if (mustPop) {\n      measure.popFont();\n    }\n  }\n\n  [$toHTML](availableSpace) {\n    const children = [];\n    this[$extra] = {\n      children,\n    };\n\n    this[$childrenToHTML]({});\n\n    if (children.length === 0 && !this[$content]) {\n      return HTMLResult.EMPTY;\n    }\n\n    let value;\n    if (this[$richText]) {\n      value = this[$content]\n        ? this[$content].replaceAll(crlfForRichTextRegExp, \"\\n\")\n        : undefined;\n    } else {\n      value = this[$content] || undefined;\n    }\n\n    return HTMLResult.success({\n      name: this[$nodeName],\n      attributes: {\n        href: this.href,\n        style: mapStyle(this.style, this, this[$richText]),\n      },\n      children,\n      value,\n    });\n  }\n}\n\nclass A extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"a\");\n    this.href = fixURL(attributes.href) || \"\";\n  }\n}\n\nclass B extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"b\");\n  }\n\n  [$pushGlyphs](measure) {\n    measure.pushFont({ weight: \"bold\" });\n    super[$pushGlyphs](measure);\n    measure.popFont();\n  }\n}\n\nclass Body extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"body\");\n  }\n\n  [$toHTML](availableSpace) {\n    const res = super[$toHTML](availableSpace);\n    const { html } = res;\n    if (!html) {\n      return HTMLResult.EMPTY;\n    }\n    html.name = \"div\";\n    html.attributes.class = [\"xfaRich\"];\n    return res;\n  }\n}\n\nclass Br extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"br\");\n  }\n\n  [$text]() {\n    return \"\\n\";\n  }\n\n  [$pushGlyphs](measure) {\n    measure.addString(\"\\n\");\n  }\n\n  [$toHTML](availableSpace) {\n    return HTMLResult.success({\n      name: \"br\",\n    });\n  }\n}\n\nclass Html extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"html\");\n  }\n\n  [$toHTML](availableSpace) {\n    const children = [];\n    this[$extra] = {\n      children,\n    };\n\n    this[$childrenToHTML]({});\n    if (children.length === 0) {\n      return HTMLResult.success({\n        name: \"div\",\n        attributes: {\n          class: [\"xfaRich\"],\n          style: {},\n        },\n        value: this[$content] || \"\",\n      });\n    }\n\n    if (children.length === 1) {\n      const child = children[0];\n      if (child.attributes?.class.includes(\"xfaRich\")) {\n        return HTMLResult.success(child);\n      }\n    }\n\n    return HTMLResult.success({\n      name: \"div\",\n      attributes: {\n        class: [\"xfaRich\"],\n        style: {},\n      },\n      children,\n    });\n  }\n}\n\nclass I extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"i\");\n  }\n\n  [$pushGlyphs](measure) {\n    measure.pushFont({ posture: \"italic\" });\n    super[$pushGlyphs](measure);\n    measure.popFont();\n  }\n}\n\nclass Li extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"li\");\n  }\n}\n\nclass Ol extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"ol\");\n  }\n}\n\nclass P extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"p\");\n  }\n\n  [$pushGlyphs](measure) {\n    super[$pushGlyphs](measure, /* mustPop = */ false);\n    measure.addString(\"\\n\");\n    measure.addPara();\n    measure.popFont();\n  }\n\n  [$text]() {\n    const siblings = this[$getParent]()[$getChildren]();\n    if (siblings.at(-1) === this) {\n      return super[$text]();\n    }\n    return super[$text]() + \"\\n\";\n  }\n}\n\nclass Span extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"span\");\n  }\n}\n\nclass Sub extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"sub\");\n  }\n}\n\nclass Sup extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"sup\");\n  }\n}\n\nclass Ul extends XhtmlObject {\n  constructor(attributes) {\n    super(attributes, \"ul\");\n  }\n}\n\nclass XhtmlNamespace {\n  static [$buildXFAObject](name, attributes) {\n    if (Object.hasOwn(XhtmlNamespace, name)) {\n      return XhtmlNamespace[name](attributes);\n    }\n    return undefined;\n  }\n\n  static a(attributes) {\n    return new A(attributes);\n  }\n\n  static b(attributes) {\n    return new B(attributes);\n  }\n\n  static body(attributes) {\n    return new Body(attributes);\n  }\n\n  static br(attributes) {\n    return new Br(attributes);\n  }\n\n  static html(attributes) {\n    return new Html(attributes);\n  }\n\n  static i(attributes) {\n    return new I(attributes);\n  }\n\n  static li(attributes) {\n    return new Li(attributes);\n  }\n\n  static ol(attributes) {\n    return new Ol(attributes);\n  }\n\n  static p(attributes) {\n    return new P(attributes);\n  }\n\n  static span(attributes) {\n    return new Span(attributes);\n  }\n\n  static sub(attributes) {\n    return new Sub(attributes);\n  }\n\n  static sup(attributes) {\n    return new Sup(attributes);\n  }\n\n  static ul(attributes) {\n    return new Ul(attributes);\n  }\n}\n\nexport { XhtmlNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConfigNamespace } from \"./config.js\";\nimport { ConnectionSetNamespace } from \"./connection_set.js\";\nimport { DatasetsNamespace } from \"./datasets.js\";\nimport { LocaleSetNamespace } from \"./locale_set.js\";\nimport { SignatureNamespace } from \"./signature.js\";\nimport { StylesheetNamespace } from \"./stylesheet.js\";\nimport { TemplateNamespace } from \"./template.js\";\nimport { XdpNamespace } from \"./xdp.js\";\nimport { XhtmlNamespace } from \"./xhtml.js\";\n\nconst NamespaceSetUp = {\n  config: ConfigNamespace,\n  connection: ConnectionSetNamespace,\n  datasets: DatasetsNamespace,\n  localeSet: LocaleSetNamespace,\n  signature: SignatureNamespace,\n  stylesheet: StylesheetNamespace,\n  template: TemplateNamespace,\n  xdp: XdpNamespace,\n  xhtml: XhtmlNamespace,\n};\n\nexport { NamespaceSetUp };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { $buildXFAObject } from \"./namespaces.js\";\nimport { XmlObject } from \"./xfa_object.js\";\n\nclass UnknownNamespace {\n  constructor(nsId) {\n    this.namespaceId = nsId;\n  }\n\n  [$buildXFAObject](name, attributes) {\n    return new XmlObject(this.namespaceId, name, attributes);\n  }\n}\n\nexport { UnknownNamespace };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { $buildXFAObject, NamespaceIds } from \"./namespaces.js\";\nimport {\n  $cleanup,\n  $finalize,\n  $ids,\n  $isNsAgnostic,\n  $nsAttributes,\n  $onChild,\n  $resolvePrototypes,\n  $root,\n} from \"./symbol_utils.js\";\nimport { makeArr, warn } from \"../../shared/util.js\";\nimport { NamespaceSetUp } from \"./setup.js\";\nimport { Template } from \"./template.js\";\nimport { UnknownNamespace } from \"./unknown.js\";\nimport { XFAObject } from \"./xfa_object.js\";\n\nclass Root extends XFAObject {\n  constructor(ids) {\n    super(-1, \"root\", Object.create(null));\n    this.element = null;\n    this[$ids] = ids;\n  }\n\n  [$onChild](child) {\n    this.element = child;\n    return true;\n  }\n\n  [$finalize]() {\n    super[$finalize]();\n    if (this.element.template instanceof Template) {\n      // Set the root element in $ids using a symbol in order\n      // to avoid conflict with real IDs.\n      this[$ids].set($root, this.element);\n\n      this.element.template[$resolvePrototypes](this[$ids]);\n      this.element.template[$ids] = this[$ids];\n    }\n  }\n}\n\nclass Empty extends XFAObject {\n  constructor() {\n    super(-1, \"\", Object.create(null));\n  }\n\n  [$onChild](_) {\n    return false;\n  }\n}\n\nclass Builder {\n  constructor(rootNameSpace = null) {\n    this._namespaceStack = [];\n    this._nsAgnosticLevel = 0;\n\n    // Each prefix has its own stack\n    this._namespacePrefixes = new Map();\n    this._namespaces = new Map();\n    this._nextNsId = Math.max(\n      ...Object.values(NamespaceIds).map(({ id }) => id)\n    );\n    this._currentNamespace =\n      rootNameSpace || new UnknownNamespace(++this._nextNsId);\n  }\n\n  buildRoot(ids) {\n    return new Root(ids);\n  }\n\n  build({ nsPrefix, name, attributes, namespace, prefixes }) {\n    const hasNamespaceDef = namespace !== null;\n    if (hasNamespaceDef) {\n      // Define the current namespace to use.\n      this._namespaceStack.push(this._currentNamespace);\n      this._currentNamespace = this._searchNamespace(namespace);\n    }\n\n    if (prefixes) {\n      // The xml node may have namespace prefix definitions\n      this._addNamespacePrefix(prefixes);\n    }\n\n    if (Object.hasOwn(attributes, $nsAttributes)) {\n      // Only support xfa-data namespace.\n      const dataTemplate = NamespaceSetUp.datasets;\n      const nsAttrs = attributes[$nsAttributes];\n      let xfaAttrs = null;\n      for (const [ns, attrs] of Object.entries(nsAttrs)) {\n        const nsToUse = this._getNamespaceToUse(ns);\n        if (nsToUse === dataTemplate) {\n          xfaAttrs = { xfa: attrs };\n          break;\n        }\n      }\n      if (xfaAttrs) {\n        attributes[$nsAttributes] = xfaAttrs;\n      } else {\n        delete attributes[$nsAttributes];\n      }\n    }\n\n    const namespaceToUse = this._getNamespaceToUse(nsPrefix);\n    const node =\n      namespaceToUse?.[$buildXFAObject](name, attributes) || new Empty();\n\n    if (node[$isNsAgnostic]()) {\n      this._nsAgnosticLevel++;\n    }\n\n    // In case the node has some namespace things,\n    // we must pop the different stacks.\n    if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) {\n      node[$cleanup] = {\n        hasNamespace: hasNamespaceDef,\n        prefixes,\n        nsAgnostic: node[$isNsAgnostic](),\n      };\n    }\n\n    return node;\n  }\n\n  isNsAgnostic() {\n    return this._nsAgnosticLevel > 0;\n  }\n\n  _searchNamespace(nsName) {\n    let ns = this._namespaces.get(nsName);\n    if (ns) {\n      return ns;\n    }\n    for (const [name, { check }] of Object.entries(NamespaceIds)) {\n      if (check(nsName)) {\n        ns = NamespaceSetUp[name];\n        if (ns) {\n          this._namespaces.set(nsName, ns);\n          return ns;\n        }\n        // The namespace is known but not handled.\n        break;\n      }\n    }\n\n    ns = new UnknownNamespace(++this._nextNsId);\n    this._namespaces.set(nsName, ns);\n    return ns;\n  }\n\n  _addNamespacePrefix(prefixes) {\n    for (const { prefix, value } of prefixes) {\n      const namespace = this._searchNamespace(value);\n      this._namespacePrefixes\n        .getOrInsertComputed(prefix, makeArr)\n        .push(namespace);\n    }\n  }\n\n  _getNamespaceToUse(prefix) {\n    if (!prefix) {\n      return this._currentNamespace;\n    }\n    const prefixStack = this._namespacePrefixes.get(prefix);\n    if (prefixStack?.length > 0) {\n      return prefixStack.at(-1);\n    }\n\n    warn(`Unknown namespace prefix: ${prefix}.`);\n    return null;\n  }\n\n  clean(data) {\n    const { hasNamespace, prefixes, nsAgnostic } = data;\n    if (hasNamespace) {\n      this._currentNamespace = this._namespaceStack.pop();\n    }\n    if (prefixes) {\n      prefixes.forEach(({ prefix }) => {\n        this._namespacePrefixes.get(prefix).pop();\n      });\n    }\n    if (nsAgnostic) {\n      this._nsAgnosticLevel--;\n    }\n  }\n}\n\nexport { Builder };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $acceptWhitespace,\n  $clean,\n  $content,\n  $finalize,\n  $globalData,\n  $isCDATAXml,\n  $nsAttributes,\n  $onChild,\n  $onText,\n  $setId,\n} from \"./symbol_utils.js\";\nimport { XMLParserBase, XMLParserErrorCode } from \"../xml_parser.js\";\nimport { Builder } from \"./builder.js\";\nimport { warn } from \"../../shared/util.js\";\n\nclass XFAParser extends XMLParserBase {\n  constructor(rootNameSpace = null, richText = false) {\n    super();\n    this._builder = new Builder(rootNameSpace);\n    this._stack = [];\n    this._globalData = {\n      usedTypefaces: new Set(),\n    };\n    this._ids = new Map();\n    this._current = this._builder.buildRoot(this._ids);\n    this._errorCode = XMLParserErrorCode.NoError;\n    this._whiteRegex = /^\\s+$/;\n    this._nbsps = /\\xa0+/g;\n    this._richText = richText;\n  }\n\n  parse(data) {\n    this.parseXml(data);\n\n    if (this._errorCode !== XMLParserErrorCode.NoError) {\n      return undefined;\n    }\n\n    this._current[$finalize]();\n\n    return this._current.element;\n  }\n\n  onText(text) {\n    // Normally by definition a &nbsp is unbreakable\n    // but in real life Acrobat can break strings on &nbsp.\n    text = text.replace(this._nbsps, match => match.slice(1) + \" \");\n    if (this._richText || this._current[$acceptWhitespace]()) {\n      this._current[$onText](text, this._richText);\n      return;\n    }\n\n    if (this._whiteRegex.test(text)) {\n      return;\n    }\n    this._current[$onText](text.trim());\n  }\n\n  onCdata(text) {\n    this._current[$onText](text);\n  }\n\n  _mkAttributes(attributes, tagName) {\n    // Transform attributes into an object and get out\n    // namespaces information.\n    let namespace = null;\n    let prefixes = null;\n    const attributeObj = Object.create({});\n    for (const { name, value } of attributes) {\n      if (name === \"xmlns\") {\n        if (!namespace) {\n          namespace = value;\n        } else {\n          warn(`XFA - multiple namespace definition in <${tagName}>`);\n        }\n      } else if (name.startsWith(\"xmlns:\")) {\n        const prefix = name.substring(\"xmlns:\".length);\n        prefixes ??= [];\n        prefixes.push({ prefix, value });\n      } else {\n        const i = name.indexOf(\":\");\n        if (i === -1) {\n          attributeObj[name] = value;\n        } else {\n          // Attributes can have their own namespace.\n          // For example in data, we can have <foo xfa:dataNode=\"dataGroup\"/>\n          const nsAttrs = (attributeObj[$nsAttributes] ??= Object.create(null));\n          const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)];\n          const attrs = (nsAttrs[ns] ||= Object.create(null));\n          attrs[attrName] = value;\n        }\n      }\n    }\n\n    return [namespace, prefixes, attributeObj];\n  }\n\n  _getNameAndPrefix(name, nsAgnostic) {\n    const i = name.indexOf(\":\");\n    if (i === -1) {\n      return [name, null];\n    }\n    return [name.substring(i + 1), nsAgnostic ? \"\" : name.substring(0, i)];\n  }\n\n  onBeginElement(tagName, attributes, isEmpty) {\n    const [namespace, prefixes, attributesObj] = this._mkAttributes(\n      attributes,\n      tagName\n    );\n    const [name, nsPrefix] = this._getNameAndPrefix(\n      tagName,\n      this._builder.isNsAgnostic()\n    );\n    const node = this._builder.build({\n      nsPrefix,\n      name,\n      attributes: attributesObj,\n      namespace,\n      prefixes,\n    });\n    node[$globalData] = this._globalData;\n\n    if (isEmpty) {\n      // No children: just push the node into its parent.\n      node[$finalize]();\n      if (this._current[$onChild](node)) {\n        node[$setId](this._ids);\n      }\n      node[$clean](this._builder);\n      return;\n    }\n\n    this._stack.push(this._current);\n    this._current = node;\n  }\n\n  onEndElement(name) {\n    const node = this._current;\n    if (node[$isCDATAXml]() && typeof node[$content] === \"string\") {\n      const parser = new XFAParser();\n      parser._globalData = this._globalData;\n      const root = parser.parse(node[$content]);\n      node[$content] = null;\n      node[$onChild](root);\n    }\n\n    node[$finalize]();\n    this._current = this._stack.pop();\n    if (this._current[$onChild](node)) {\n      node[$setId](this._ids);\n    }\n    node[$clean](this._builder);\n  }\n\n  onError(code) {\n    this._errorCode = code;\n  }\n}\n\nexport { XFAParser };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  $appendChild,\n  $globalData,\n  $nodeName,\n  $text,\n  $toHTML,\n  $toPages,\n} from \"./symbol_utils.js\";\nimport { Binder } from \"./bind.js\";\nimport { DataHandler } from \"./data.js\";\nimport { FontFinder } from \"./fonts.js\";\nimport { stripQuotes } from \"./utils.js\";\nimport { warn } from \"../../shared/util.js\";\nimport { XFAParser } from \"./parser.js\";\nimport { XhtmlNamespace } from \"./xhtml.js\";\n\nclass XFAFactory {\n  constructor(data) {\n    try {\n      this.root = new XFAParser().parse(XFAFactory._createDocument(data));\n      const binder = new Binder(this.root);\n      this.form = binder.bind();\n      this.dataHandler = new DataHandler(this.root, binder.getData());\n      this.form[$globalData].template = this.form;\n    } catch (e) {\n      warn(`XFA - an error occurred during parsing and binding: ${e}`);\n    }\n  }\n\n  isValid() {\n    return !!(this.root && this.form);\n  }\n\n  /**\n   * In order to avoid to block the event loop, the conversion\n   * into pages is made asynchronously.\n   */\n  _createPagesHelper() {\n    const iterator = this.form[$toPages]();\n    return new Promise((resolve, reject) => {\n      const nextIteration = () => {\n        try {\n          const value = iterator.next();\n          if (value.done) {\n            resolve(value.value);\n          } else {\n            setTimeout(nextIteration, 0);\n          }\n        } catch (e) {\n          reject(e);\n        }\n      };\n      setTimeout(nextIteration, 0);\n    });\n  }\n\n  async _createPages() {\n    try {\n      this.pages = await this._createPagesHelper();\n      this.dims = this.pages.children.map(c => {\n        const { width, height } = c.attributes.style;\n        return [0, 0, parseInt(width, 10), parseInt(height, 10)];\n      });\n    } catch (e) {\n      warn(`XFA - an error occurred during layout: ${e}`);\n    }\n  }\n\n  getBoundingBox(pageIndex) {\n    return this.dims[pageIndex];\n  }\n\n  async getNumPages() {\n    if (!this.pages) {\n      await this._createPages();\n    }\n    return this.dims.length;\n  }\n\n  setImages(images) {\n    this.form[$globalData].images = images;\n  }\n\n  setFonts(fonts) {\n    this.form[$globalData].fontFinder = new FontFinder(fonts);\n    const missingFonts = [];\n    for (let typeface of this.form[$globalData].usedTypefaces) {\n      typeface = stripQuotes(typeface);\n      const font = this.form[$globalData].fontFinder.find(typeface);\n      if (!font) {\n        missingFonts.push(typeface);\n      }\n    }\n\n    if (missingFonts.length > 0) {\n      return missingFonts;\n    }\n\n    return null;\n  }\n\n  appendFonts(fonts, reallyMissingFonts) {\n    this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts);\n  }\n\n  async getPages() {\n    if (!this.pages) {\n      await this._createPages();\n    }\n    const pages = this.pages;\n    this.pages = null;\n    return pages;\n  }\n\n  serializeData(storage) {\n    return this.dataHandler.serialize(storage);\n  }\n\n  static _createDocument(data) {\n    if (!data[\"/xdp:xdp\"]) {\n      return data[\"xdp:xdp\"];\n    }\n    return Object.values(data).join(\"\");\n  }\n\n  static getRichTextAsHtml(rc) {\n    if (!rc || typeof rc !== \"string\") {\n      return null;\n    }\n\n    try {\n      let root = new XFAParser(XhtmlNamespace, /* richText */ true).parse(rc);\n      if (![\"body\", \"xhtml\"].includes(root[$nodeName])) {\n        // No body, so create one.\n        const newRoot = XhtmlNamespace.body({});\n        newRoot[$appendChild](root);\n        root = newRoot;\n      }\n\n      const result = root[$toHTML]();\n      if (!result.success) {\n        return null;\n      }\n\n      const { html } = result;\n      const { attributes } = html;\n      if (attributes) {\n        if (attributes.class) {\n          attributes.class = attributes.class.filter(\n            attr => !attr.startsWith(\"xfa\")\n          );\n        }\n        attributes.dir = \"auto\";\n      }\n\n      return { html, str: root[$text]() };\n    } catch (e) {\n      warn(`XFA - an error occurred during parsing of rich text: ${e}`);\n    }\n    return null;\n  }\n}\n\nexport { XFAFactory };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationActionEventType,\n  AnnotationBorderStyleType,\n  AnnotationEditorType,\n  AnnotationFieldFlag,\n  AnnotationFlag,\n  AnnotationRenditionOperation,\n  AnnotationReplyType,\n  AnnotationType,\n  assert,\n  BASELINE_FACTOR,\n  BBOX_INIT,\n  F32_BBOX_INIT,\n  info,\n  isArrayEqual,\n  LINE_DESCENT_FACTOR,\n  LINE_FACTOR,\n  OPS,\n  RenderingIntentFlag,\n  shadow,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  collectActions,\n  escapeString,\n  getInheritableProperty,\n  getModificationDate,\n  getParentToUpdate,\n  getRotationMatrix,\n  IDENTITY_MATRIX,\n  isNumberArray,\n  lookupMatrix,\n  lookupNormalRect,\n  lookupRect,\n  MissingDataException,\n  numberToString,\n  RESOURCES_KEYS_OPERATOR_LIST,\n  RESOURCES_KEYS_TEXT_CONTENT,\n} from \"./core_utils.js\";\nimport {\n  createDefaultAppearance,\n  FakeUnicodeFont,\n  getPdfColor,\n  parseAppearanceStream,\n  parseDefaultAppearance,\n} from \"./default_appearance.js\";\nimport { DateFormats, TimeFormats } from \"../shared/scripting_utils.js\";\nimport { Dict, isName, isRefsEqual, Name, Ref, RefSet } from \"./primitives.js\";\nimport {\n  stringToAsciiOrUTF16BE,\n  stringToPDFString,\n  stringToUTF16String,\n} from \"./string_utils.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { bidi } from \"./bidi.js\";\nimport { Catalog } from \"./catalog.js\";\nimport { ColorSpaceUtils } from \"./colorspace_utils.js\";\nimport { createImage } from \"./editor/pdf_images.js\";\nimport { FileSpec } from \"./file_spec.js\";\nimport { JpegStream } from \"./jpeg_stream.js\";\nimport { ObjectLoader } from \"./object_loader.js\";\nimport { OperatorList } from \"./operator_list.js\";\nimport { parseMarkedContentProps } from \"./evaluator_utils.js\";\nimport { StringStream } from \"./stream.js\";\nimport { XFAFactory } from \"./xfa/factory.js\";\n\nclass AnnotationFactory {\n  static createGlobals(pdfManager) {\n    return Promise.all([\n      pdfManager.ensureCatalog(\"acroForm\"),\n      pdfManager.ensureDoc(\"xfaDatasets\"),\n      pdfManager.ensureCatalog(\"structTreeRoot\"),\n      // Only necessary to prevent the `Catalog.baseUrl`-getter, used\n      // with some Annotations, from throwing and thus breaking parsing:\n      pdfManager.ensureCatalog(\"baseUrl\"),\n      // Only necessary to prevent the `Catalog.attachments`-getter, used\n      // with \"GoToE\" actions, from throwing and thus breaking parsing:\n      pdfManager.ensureCatalog(\"attachments\"),\n      pdfManager.ensureCatalog(\"globalColorSpaceCache\"),\n    ]).then(\n      ([\n        acroForm,\n        xfaDatasets,\n        structTreeRoot,\n        baseUrl,\n        attachments,\n        globalColorSpaceCache,\n      ]) => ({\n        pdfManager,\n        catalog: pdfManager.pdfDocument.catalog,\n        acroForm: acroForm instanceof Dict ? acroForm : Dict.empty,\n        xfaDatasets,\n        structTreeRoot,\n        baseUrl,\n        attachments,\n        globalColorSpaceCache,\n      }),\n      reason => {\n        warn(`createGlobals: \"${reason}\".`);\n        return null;\n      }\n    );\n  }\n\n  /**\n   * Create an `Annotation` object of the correct type for the given reference\n   * to an annotation dictionary. This yields a promise that is resolved when\n   * the `Annotation` object is constructed.\n   *\n   * @param {XRef} xref\n   * @param {Object} ref\n   * @params {Object} annotationGlobals\n   * @param {Object} idFactory\n   * @param {boolean} [collectFields]\n   * @param {Object} [orphanFields]\n   * @param {Array<string>} [collectByType]\n   * @param {Object} [pageRef]\n   * @returns {Promise} A promise that is resolved with an {Annotation}\n   *   instance.\n   */\n  static async create(\n    xref,\n    ref,\n    annotationGlobals,\n    idFactory,\n    collectFields,\n    orphanFields,\n    collectByType,\n    pageRef\n  ) {\n    const pageIndex = collectFields\n      ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager)\n      : null;\n\n    return annotationGlobals.pdfManager.ensure(this, \"_create\", [\n      xref,\n      ref,\n      annotationGlobals,\n      idFactory,\n      collectFields,\n      orphanFields,\n      collectByType,\n      pageIndex,\n      pageRef,\n    ]);\n  }\n\n  /**\n   * @private\n   */\n  static _create(\n    xref,\n    ref,\n    annotationGlobals,\n    idFactory,\n    collectFields = false,\n    orphanFields = null,\n    collectByType = null,\n    pageIndex = null,\n    pageRef = null\n  ) {\n    const dict = xref.fetchIfRef(ref);\n    if (!(dict instanceof Dict)) {\n      return undefined;\n    }\n\n    // Determine the annotation's subtype.\n    let subtype = dict.get(\"Subtype\");\n    subtype = subtype instanceof Name ? subtype.name : null;\n\n    if (\n      collectByType &&\n      !collectByType.has(AnnotationType[subtype?.toUpperCase()])\n    ) {\n      return null;\n    }\n\n    const { acroForm, pdfManager } = annotationGlobals;\n    const id =\n      ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`;\n\n    // Return the right annotation object based on the subtype and field type.\n    const parameters = {\n      xref,\n      ref,\n      dict,\n      subtype,\n      id,\n      annotationGlobals,\n      collectFields,\n      orphanFields,\n      needAppearances:\n        !collectFields && acroForm.get(\"NeedAppearances\") === true,\n      pageIndex,\n      evaluatorOptions: pdfManager.evaluatorOptions,\n      pageRef,\n    };\n\n    switch (subtype) {\n      case \"Link\":\n        return new LinkAnnotation(parameters);\n\n      case \"Text\":\n        return new TextAnnotation(parameters);\n\n      case \"Widget\":\n        let fieldType = getInheritableProperty({ dict, key: \"FT\" });\n        fieldType = fieldType instanceof Name ? fieldType.name : null;\n\n        switch (fieldType) {\n          case \"Tx\":\n            return new TextWidgetAnnotation(parameters);\n          case \"Btn\":\n            return new ButtonWidgetAnnotation(parameters);\n          case \"Ch\":\n            return new ChoiceWidgetAnnotation(parameters);\n          case \"Sig\":\n            return new SignatureWidgetAnnotation(parameters);\n        }\n        warn(\n          `Unimplemented widget field type \"${fieldType}\", ` +\n            \"falling back to base field type.\"\n        );\n        return new WidgetAnnotation(parameters);\n\n      case \"Popup\":\n        return new PopupAnnotation(parameters);\n\n      case \"FreeText\":\n        return new FreeTextAnnotation(parameters);\n\n      case \"Line\":\n        return new LineAnnotation(parameters);\n\n      case \"Square\":\n        return new SquareAnnotation(parameters);\n\n      case \"Circle\":\n        return new CircleAnnotation(parameters);\n\n      case \"PolyLine\":\n        return new PolylineAnnotation(parameters);\n\n      case \"Polygon\":\n        return new PolygonAnnotation(parameters);\n\n      case \"Caret\":\n        return new CaretAnnotation(parameters);\n\n      case \"Ink\":\n        return new InkAnnotation(parameters);\n\n      case \"Highlight\":\n        return new HighlightAnnotation(parameters);\n\n      case \"Underline\":\n        return new UnderlineAnnotation(parameters);\n\n      case \"Squiggly\":\n        return new SquigglyAnnotation(parameters);\n\n      case \"StrikeOut\":\n        return new StrikeOutAnnotation(parameters);\n\n      case \"Stamp\":\n        return new StampAnnotation(parameters);\n\n      case \"FileAttachment\":\n        return new FileAttachmentAnnotation(parameters);\n\n      case \"RichMedia\":\n        return new RichMediaAnnotation(parameters);\n\n      case \"Screen\":\n        return new ScreenAnnotation(parameters);\n\n      default:\n        if (!collectFields) {\n          if (!subtype) {\n            warn(\"Annotation is missing the required /Subtype.\");\n          } else {\n            warn(\n              `Unimplemented annotation type \"${subtype}\", ` +\n                \"falling back to base annotation.\"\n            );\n          }\n        }\n        return new Annotation(parameters);\n    }\n  }\n\n  static async _getPageIndex(xref, ref, pdfManager) {\n    try {\n      const annotDict = await xref.fetchIfRefAsync(ref);\n      if (!(annotDict instanceof Dict)) {\n        return -1;\n      }\n      const pageRef = annotDict.getRaw(\"P\");\n      if (pageRef instanceof Ref) {\n        try {\n          const pageIndex = await pdfManager.ensureCatalog(\"getPageIndex\", [\n            pageRef,\n          ]);\n          return pageIndex;\n        } catch (ex) {\n          info(`_getPageIndex -- not a valid page reference: \"${ex}\".`);\n        }\n      }\n      if (annotDict.has(\"Kids\")) {\n        return -1; // Not an annotation reference.\n      }\n      // Fallback to, potentially, checking the annotations of all pages.\n      // PLEASE NOTE: This could force the *entire* PDF document to load,\n      //              hence it absolutely cannot be done unconditionally.\n      const numPages = await pdfManager.ensureDoc(\"numPages\");\n\n      for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {\n        const page = await pdfManager.getPage(pageIndex);\n        const annotations = await pdfManager.ensure(page, \"annotations\");\n\n        for (const annotRef of annotations) {\n          if (annotRef instanceof Ref && isRefsEqual(annotRef, ref)) {\n            return pageIndex;\n          }\n        }\n      }\n    } catch (ex) {\n      warn(`_getPageIndex: \"${ex}\".`);\n    }\n    return -1;\n  }\n\n  static generateImages(annotations, xref, isOffscreenCanvasSupported) {\n    if (!isOffscreenCanvasSupported) {\n      warn(\n        \"generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images.\"\n      );\n      return null;\n    }\n    let imagePromises;\n    for (const { bitmapId, bitmap } of annotations) {\n      if (!bitmap) {\n        continue;\n      }\n      imagePromises ||= new Map();\n      imagePromises.set(bitmapId, createImage(bitmap, xref));\n    }\n\n    return imagePromises;\n  }\n\n  static async saveNewAnnotations(\n    evaluator,\n    xref,\n    task,\n    annotations,\n    imagePromises,\n    changes\n  ) {\n    let baseFontRef;\n    const promises = [];\n    const { isOffscreenCanvasSupported } = evaluator.options;\n\n    for (const annotation of annotations) {\n      if (annotation.deleted) {\n        continue;\n      }\n      switch (annotation.annotationType) {\n        case AnnotationEditorType.FREETEXT:\n          if (!baseFontRef) {\n            const baseFont = new Dict(xref);\n            baseFont.setIfName(\"BaseFont\", \"Helvetica\");\n            baseFont.setIfName(\"Type\", \"Font\");\n            baseFont.setIfName(\"Subtype\", \"Type1\");\n            baseFont.setIfName(\"Encoding\", \"WinAnsiEncoding\");\n            baseFontRef = xref.getNewTemporaryRef();\n            changes.put(baseFontRef, {\n              data: baseFont,\n            });\n          }\n          promises.push(\n            FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, {\n              evaluator,\n              task,\n              baseFontRef,\n            })\n          );\n          break;\n        case AnnotationEditorType.HIGHLIGHT:\n          if (annotation.quadPoints) {\n            promises.push(\n              HighlightAnnotation.createNewAnnotation(xref, annotation, changes)\n            );\n          } else {\n            promises.push(\n              InkAnnotation.createNewAnnotation(xref, annotation, changes)\n            );\n          }\n          break;\n        case AnnotationEditorType.INK:\n          promises.push(\n            InkAnnotation.createNewAnnotation(xref, annotation, changes)\n          );\n          break;\n        case AnnotationEditorType.STAMP:\n          const image = isOffscreenCanvasSupported\n            ? await imagePromises?.get(annotation.bitmapId)\n            : null;\n          if (image?.imageStream) {\n            const { imageStream, smaskStream } = image;\n            if (smaskStream) {\n              const smaskRef = xref.getNewTemporaryRef();\n              changes.put(smaskRef, {\n                data: smaskStream,\n              });\n              imageStream.dict.set(\"SMask\", smaskRef);\n            }\n            const imageRef = (image.imageRef = xref.getNewTemporaryRef());\n            changes.put(imageRef, {\n              data: imageStream,\n            });\n            image.imageStream = null;\n            image.imageRenderStream = null;\n            image.smaskStream = null;\n            image.smaskRenderStream = null;\n          }\n          promises.push(\n            StampAnnotation.createNewAnnotation(xref, annotation, changes, {\n              image,\n            })\n          );\n          break;\n        case AnnotationEditorType.SIGNATURE:\n          promises.push(\n            StampAnnotation.createNewAnnotation(xref, annotation, changes, {})\n          );\n          break;\n      }\n    }\n\n    return {\n      annotations: (await Promise.all(promises)).flat(),\n    };\n  }\n\n  static async printNewAnnotations(\n    annotationGlobals,\n    evaluator,\n    task,\n    annotations,\n    imagePromises\n  ) {\n    if (!annotations) {\n      return null;\n    }\n\n    const { options, xref } = evaluator;\n    const promises = [];\n    for (const annotation of annotations) {\n      if (annotation.deleted) {\n        continue;\n      }\n      switch (annotation.annotationType) {\n        case AnnotationEditorType.FREETEXT:\n          promises.push(\n            FreeTextAnnotation.createNewPrintAnnotation(\n              annotationGlobals,\n              xref,\n              annotation,\n              {\n                evaluator,\n                task,\n                evaluatorOptions: options,\n              }\n            )\n          );\n          break;\n        case AnnotationEditorType.HIGHLIGHT:\n          if (annotation.quadPoints) {\n            promises.push(\n              HighlightAnnotation.createNewPrintAnnotation(\n                annotationGlobals,\n                xref,\n                annotation,\n                {\n                  evaluatorOptions: options,\n                }\n              )\n            );\n          } else {\n            promises.push(\n              InkAnnotation.createNewPrintAnnotation(\n                annotationGlobals,\n                xref,\n                annotation,\n                {\n                  evaluatorOptions: options,\n                }\n              )\n            );\n          }\n          break;\n        case AnnotationEditorType.INK:\n          promises.push(\n            InkAnnotation.createNewPrintAnnotation(\n              annotationGlobals,\n              xref,\n              annotation,\n              {\n                evaluatorOptions: options,\n              }\n            )\n          );\n          break;\n        case AnnotationEditorType.STAMP:\n          const image = options.isOffscreenCanvasSupported\n            ? await imagePromises?.get(annotation.bitmapId)\n            : null;\n          if (image?.imageStream) {\n            const {\n              imageStream,\n              imageRenderStream,\n              smaskStream,\n              smaskRenderStream,\n            } = image;\n            const imageRef =\n              imageRenderStream ||\n              new JpegStream(imageStream, imageStream.length);\n            if (smaskStream || smaskRenderStream) {\n              imageRef.dict.set(\"SMask\", smaskRenderStream || smaskStream);\n            }\n            image.imageRef = imageRef;\n            image.imageStream = null;\n            image.imageRenderStream = null;\n            image.smaskStream = null;\n            image.smaskRenderStream = null;\n          }\n          promises.push(\n            StampAnnotation.createNewPrintAnnotation(\n              annotationGlobals,\n              xref,\n              annotation,\n              {\n                image,\n                evaluatorOptions: options,\n              }\n            )\n          );\n          break;\n        case AnnotationEditorType.SIGNATURE:\n          promises.push(\n            StampAnnotation.createNewPrintAnnotation(\n              annotationGlobals,\n              xref,\n              annotation,\n              {\n                evaluatorOptions: options,\n              }\n            )\n          );\n          break;\n      }\n    }\n\n    return Promise.all(promises);\n  }\n}\n\nfunction getRgbColor(color, defaultColor = new Uint8ClampedArray(3)) {\n  if (!Array.isArray(color)) {\n    return defaultColor;\n  }\n\n  const rgbColor = defaultColor || new Uint8ClampedArray(3);\n  switch (color.length) {\n    case 0: // Transparent, which we indicate with a null value\n      return null;\n\n    case 1: // Convert grayscale to RGB\n      ColorSpaceUtils.gray.getRgbItem(color, 0, rgbColor, 0);\n      return rgbColor;\n\n    case 3: // Convert RGB percentages to RGB\n      ColorSpaceUtils.rgb.getRgbItem(color, 0, rgbColor, 0);\n      return rgbColor;\n\n    case 4: // Convert CMYK to RGB\n      ColorSpaceUtils.cmyk.getRgbItem(color, 0, rgbColor, 0);\n      return rgbColor;\n\n    default:\n      return defaultColor;\n  }\n}\n\nfunction getPdfColorArray(color, defaultValue = null) {\n  return (color && Array.from(color, c => c / 255)) || defaultValue;\n}\n\nfunction getQuadPoints(dict, rect) {\n  // The region is described as a number of quadrilaterals.\n  // Each quadrilateral must consist of eight coordinates.\n  const quadPoints = dict.getArray(\"QuadPoints\");\n  if (\n    !isNumberArray(quadPoints, null) ||\n    quadPoints.length === 0 ||\n    quadPoints.length % 8 > 0\n  ) {\n    return null;\n  }\n\n  const newQuadPoints = new Float32Array(quadPoints.length);\n  for (let i = 0, ii = quadPoints.length; i < ii; i += 8) {\n    // Each series of eight numbers represents the coordinates for one\n    // quadrilateral in the order [x1, y1, x2, y2, x3, y3, x4, y4].\n    // Convert this to an array of objects with x and y coordinates.\n    const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8);\n    const minX = Math.min(x1, x2, x3, x4);\n    const maxX = Math.max(x1, x2, x3, x4);\n    const minY = Math.min(y1, y2, y3, y4);\n    const maxY = Math.max(y1, y2, y3, y4);\n    // The quadpoints should be ignored if any coordinate in the array\n    // lies outside the region specified by the rectangle. The rectangle\n    // can be `null` for markup annotations since their rectangle may be\n    // incorrect (fixes bug 1538111).\n    if (\n      rect !== null &&\n      (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])\n    ) {\n      return null;\n    }\n    // The PDF specification states in section 12.5.6.10 (figure 64) that the\n    // order of the quadpoints should be bottom left, bottom right, top right\n    // and top left. However, in practice PDF files use a different order,\n    // namely bottom left, bottom right, top left and top right (this is also\n    // mentioned on https://github.com/highkite/pdfAnnotate#QuadPoints), so\n    // this is the actual order we should work with. However, the situation is\n    // even worse since Adobe's own applications and other applications violate\n    // the specification and create annotations with other orders, namely top\n    // left, top right, bottom left and bottom right or even top left,\n    // top right, bottom right and bottom left. To avoid inconsistency and\n    // broken rendering, we normalize all lists to put the quadpoints in the\n    // same standard order (see https://stackoverflow.com/a/10729881).\n    newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i);\n  }\n  return newQuadPoints;\n}\n\nfunction getTransformMatrix(rect, bbox, matrix) {\n  // 12.5.5: Algorithm: Appearance streams\n  const minMax = F32_BBOX_INIT.slice();\n  Util.axialAlignedBoundingBox(bbox, matrix, minMax);\n  const [minX, minY, maxX, maxY] = minMax;\n  if (minX === maxX || minY === maxY) {\n    // From real-life file, bbox was [0, 0, 0, 0]. In this case,\n    // just apply the transform for rect\n    return [1, 0, 0, 1, rect[0], rect[1]];\n  }\n\n  const xRatio = (rect[2] - rect[0]) / (maxX - minX);\n  const yRatio = (rect[3] - rect[1]) / (maxY - minY);\n  return [\n    xRatio,\n    0,\n    0,\n    yRatio,\n    rect[0] - minX * xRatio,\n    rect[1] - minY * yRatio,\n  ];\n}\n\nclass Annotation {\n  appearance = null;\n\n  _oc = undefined;\n\n  constructor(params) {\n    const { annotationGlobals, dict, orphanFields, ref, subtype, xref } =\n      params;\n    const parentRef = orphanFields?.get(ref);\n    if (parentRef) {\n      dict.set(\"Parent\", parentRef);\n    }\n\n    this.setTitle(dict.get(\"T\"));\n    this.setContents(dict.get(\"Contents\"));\n    this.setModificationDate(dict.get(\"M\"));\n    this.setFlags(dict.get(\"F\"));\n    this.setRectangle(dict.getArray(\"Rect\"));\n    this.setColor(dict.getArray(\"C\"));\n    this.setBorderStyle(dict);\n    this.setAppearance(dict);\n    this.#setOptionalContent(xref, dict);\n\n    const MK = dict.get(\"MK\");\n    this.setBorderAndBackgroundColors(MK);\n    this.setRotation(MK, dict);\n    this.ref = params.ref instanceof Ref ? params.ref : null;\n\n    this._streams = [];\n    if (this.appearance) {\n      this._streams.push(this.appearance);\n    }\n\n    // The annotation cannot be changed (neither its position/visibility nor its\n    // contents), hence we can just display its appearance and don't generate\n    // a HTML element for it.\n    const isLocked = !!(this.flags & AnnotationFlag.LOCKED);\n    const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS);\n\n    // Expose public properties using a data object.\n    this.data = {\n      annotationType: AnnotationType[subtype?.toUpperCase()],\n      annotationFlags: this.flags,\n      borderStyle: this.borderStyle,\n      color: this.color,\n      backgroundColor: this.backgroundColor,\n      borderColor: this.borderColor,\n      rotation: this.rotation,\n      contentsObj: this._contents,\n      hasAppearance: !!this.appearance,\n      id: params.id,\n      modificationDate: this.modificationDate,\n      oc: this._oc,\n      rect: this.rectangle,\n      subtype,\n      hasOwnCanvas: false,\n      noRotate: !!(this.flags & AnnotationFlag.NOROTATE),\n      noHTML: isLocked && isContentLocked,\n      isEditable: false,\n      structParent: -1,\n    };\n\n    if (annotationGlobals.structTreeRoot) {\n      let structParent = dict.get(\"StructParent\");\n      this.data.structParent = structParent =\n        Number.isInteger(structParent) && structParent >= 0 ? structParent : -1;\n\n      annotationGlobals.structTreeRoot.addAnnotationIdToPage(\n        params.pageRef,\n        structParent\n      );\n    }\n\n    if (params.collectFields) {\n      // Fields can act as container for other fields and have\n      // some actions even if no Annotation inherit from them.\n      // Those fields can be referenced by CO (calculation order).\n      const kids = dict.get(\"Kids\");\n      if (Array.isArray(kids)) {\n        const kidIds = [];\n        for (const kid of kids) {\n          if (kid instanceof Ref) {\n            kidIds.push(kid.toString());\n          }\n        }\n        if (kidIds.length !== 0) {\n          this.data.kidIds = kidIds;\n        }\n      }\n\n      this.data.actions = collectActions(xref, dict, AnnotationActionEventType);\n      this.data.fieldName = this._constructFieldName(dict);\n      this.data.pageIndex = params.pageIndex;\n    }\n\n    const it = dict.get(\"IT\");\n    if (it instanceof Name) {\n      this.data.it = it.name;\n    }\n\n    this._isOffscreenCanvasSupported =\n      params.evaluatorOptions.isOffscreenCanvasSupported;\n    this._fallbackFontDict = null;\n    this._needAppearances = false;\n  }\n\n  _getOperatorListNoAppearance() {\n    return {\n      opList: new OperatorList(),\n      separateForm: false,\n      separateCanvas: false,\n    };\n  }\n\n  /**\n   * @private\n   */\n  _hasFlag(flags, flag) {\n    return !!(flags & flag);\n  }\n\n  _buildFlags(noView, noPrint) {\n    let { flags } = this;\n    if (noView === undefined) {\n      if (noPrint === undefined) {\n        return undefined;\n      }\n      if (noPrint) {\n        return flags & ~AnnotationFlag.PRINT;\n      }\n      return (flags & ~AnnotationFlag.HIDDEN) | AnnotationFlag.PRINT;\n    }\n\n    if (noView) {\n      flags |= AnnotationFlag.PRINT;\n      if (noPrint) {\n        // display === 1.\n        return (flags & ~AnnotationFlag.NOVIEW) | AnnotationFlag.HIDDEN;\n      }\n      // display === 3.\n      return (flags & ~AnnotationFlag.HIDDEN) | AnnotationFlag.NOVIEW;\n    }\n\n    flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW);\n    if (noPrint) {\n      // display === 2.\n      return flags & ~AnnotationFlag.PRINT;\n    }\n\n    // display === 0.\n    return flags | AnnotationFlag.PRINT;\n  }\n\n  /**\n   * @private\n   */\n  _isViewable(flags) {\n    return (\n      !this._hasFlag(flags, AnnotationFlag.INVISIBLE) &&\n      !this._hasFlag(flags, AnnotationFlag.NOVIEW)\n    );\n  }\n\n  /**\n   * @private\n   */\n  _isPrintable(flags) {\n    // In Acrobat, hidden flag cancels the print one\n    // (see annotation_hidden_print.pdf).\n    return (\n      this._hasFlag(flags, AnnotationFlag.PRINT) &&\n      !this._hasFlag(flags, AnnotationFlag.HIDDEN) &&\n      !this._hasFlag(flags, AnnotationFlag.INVISIBLE)\n    );\n  }\n\n  /**\n   * Check if the annotation must be displayed by taking into account\n   * the value found in the annotationStorage which may have been set\n   * through JS.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {AnnotationStorage} [annotationStorage] - Storage for annotation\n   * @param {boolean} [_renderForms] - if true widgets are rendered thanks to\n   *                                   the annotation layer.\n   */\n  mustBeViewed(annotationStorage, _renderForms) {\n    const noView = annotationStorage?.get(this.data.id)?.noView;\n    if (noView !== undefined) {\n      return !noView;\n    }\n    return this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN);\n  }\n\n  /**\n   * Check if the annotation must be printed by taking into account\n   * the value found in the annotationStorage which may have been set\n   * through JS.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {AnnotationStorage} [annotationStorage] - Storage for annotation\n   */\n  mustBePrinted(annotationStorage) {\n    const noPrint = annotationStorage?.get(this.data.id)?.noPrint;\n    if (noPrint !== undefined) {\n      return !noPrint;\n    }\n    return this.printable;\n  }\n\n  mustBeViewedWhenEditing(isEditing, modifiedIds = null) {\n    return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id);\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get viewable() {\n    if (this.data.quadPoints === null) {\n      return false;\n    }\n    if (this.flags === 0) {\n      return true;\n    }\n    return this._isViewable(this.flags);\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get printable() {\n    if (this.data.quadPoints === null) {\n      return false;\n    }\n    if (this.flags === 0) {\n      return false;\n    }\n    return this._isPrintable(this.flags);\n  }\n\n  /**\n   * @private\n   */\n  _parseStringHelper(data) {\n    const str = typeof data === \"string\" ? stringToPDFString(data) : \"\";\n    const dir = str && bidi(str).dir === \"rtl\" ? \"rtl\" : \"ltr\";\n\n    return { str, dir };\n  }\n\n  setDefaultAppearance(params) {\n    const { dict, annotationGlobals } = params;\n\n    const defaultAppearance =\n      getInheritableProperty({ dict, key: \"DA\" }) ||\n      annotationGlobals.acroForm.get(\"DA\");\n    this._defaultAppearance =\n      typeof defaultAppearance === \"string\" ? defaultAppearance : \"\";\n    this.data.defaultAppearanceData = parseDefaultAppearance(\n      this._defaultAppearance\n    );\n  }\n\n  /**\n   * Set the title.\n   *\n   * @param {string} title - The title of the annotation, used e.g. with\n   *   PopupAnnotations.\n   */\n  setTitle(title) {\n    this._title = this._parseStringHelper(title);\n  }\n\n  /**\n   * Set the contents.\n   *\n   * @param {string} contents - Text to display for the annotation or, if the\n   *                            type of annotation does not display text, a\n   *                            description of the annotation's contents\n   */\n  setContents(contents) {\n    this._contents = this._parseStringHelper(contents);\n  }\n\n  /**\n   * Set the modification date.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {string} modificationDate - PDF date string that indicates when the\n   *                                    annotation was last modified\n   */\n  setModificationDate(modificationDate) {\n    this.modificationDate =\n      typeof modificationDate === \"string\" ? modificationDate : null;\n  }\n\n  /**\n   * Set the flags.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {number} flags - Unsigned 32-bit integer specifying annotation\n   *                         characteristics\n   * @see {@link shared/util.js}\n   */\n  setFlags(flags) {\n    this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0;\n    if (\n      this.flags & AnnotationFlag.INVISIBLE &&\n      this.constructor.name !== \"Annotation\"\n    ) {\n      // From the pdf spec v1.7, section 12.5.3 (Annotation Flags):\n      //   If set, do not display the annotation if it does not belong to one of\n      //   the standard annotation types and no annotation handler is available.\n      //\n      // So we can remove the flag in case we have a known annotation type.\n      this.flags ^= AnnotationFlag.INVISIBLE;\n    }\n  }\n\n  /**\n   * Check if a provided flag is set.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {number} flag - Hexadecimal representation for an annotation\n   *                        characteristic\n   * @returns {boolean}\n   * @see {@link shared/util.js}\n   */\n  hasFlag(flag) {\n    return this._hasFlag(this.flags, flag);\n  }\n\n  /**\n   * Set the rectangle.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Array} rectangle - The rectangle array with exactly four entries\n   */\n  setRectangle(rectangle) {\n    this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]);\n  }\n\n  /**\n   * Set the color and take care of color space conversion.\n   * The default value is black, in RGB color space.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Array} color - The color array containing either 0\n   *                        (transparent), 1 (grayscale), 3 (RGB) or\n   *                        4 (CMYK) elements\n   */\n  setColor(color) {\n    this.color = getRgbColor(color);\n  }\n\n  /**\n   * Set the line endings; should only be used with specific annotation types.\n   * @param {Array} lineEndings - The line endings array.\n   */\n  setLineEndings(lineEndings) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: setLineEndings\");\n    }\n    this.lineEndings = [\"None\", \"None\"]; // The default values.\n\n    if (Array.isArray(lineEndings) && lineEndings.length === 2) {\n      for (let i = 0; i < 2; i++) {\n        const obj = lineEndings[i];\n\n        if (obj instanceof Name) {\n          switch (obj.name) {\n            case \"None\":\n              continue;\n            case \"Square\":\n            case \"Circle\":\n            case \"Diamond\":\n            case \"OpenArrow\":\n            case \"ClosedArrow\":\n            case \"Butt\":\n            case \"ROpenArrow\":\n            case \"RClosedArrow\":\n            case \"Slash\":\n              this.lineEndings[i] = obj.name;\n              continue;\n          }\n        }\n        warn(`Ignoring invalid lineEnding: ${obj}`);\n      }\n    }\n  }\n\n  setRotation(mk, dict) {\n    this.rotation = 0;\n    let angle = mk instanceof Dict ? mk.get(\"R\") || 0 : dict.get(\"Rotate\") || 0;\n    if (Number.isInteger(angle) && angle !== 0) {\n      angle %= 360;\n      if (angle < 0) {\n        angle += 360;\n      }\n      if (angle % 90 === 0) {\n        this.rotation = angle;\n      }\n    }\n  }\n\n  /**\n   * Set the color for background and border if any.\n   * The default values are transparent.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Dict} mk - The MK dictionary\n   */\n  setBorderAndBackgroundColors(mk) {\n    if (mk instanceof Dict) {\n      this.borderColor = getRgbColor(mk.getArray(\"BC\"), null);\n      this.backgroundColor = getRgbColor(mk.getArray(\"BG\"), null);\n    } else {\n      this.borderColor = this.backgroundColor = null;\n    }\n  }\n\n  /**\n   * Set the border style (as AnnotationBorderStyle object).\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Dict} borderStyle - The border style dictionary\n   */\n  setBorderStyle(borderStyle) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(this.rectangle, \"setRectangle must have been called previously.\");\n    }\n\n    this.borderStyle = new AnnotationBorderStyle();\n    if (!(borderStyle instanceof Dict)) {\n      return;\n    }\n    if (borderStyle.has(\"BS\")) {\n      const dict = borderStyle.get(\"BS\");\n\n      if (dict instanceof Dict) {\n        const dictType = dict.get(\"Type\");\n\n        if (!dictType || isName(dictType, \"Border\")) {\n          this.borderStyle.setWidth(dict.get(\"W\"), this.rectangle);\n          this.borderStyle.setStyle(dict.get(\"S\"));\n          this.borderStyle.setDashArray(dict.getArray(\"D\"));\n        }\n      }\n    } else if (borderStyle.has(\"Border\")) {\n      const array = borderStyle.getArray(\"Border\");\n      if (Array.isArray(array)) {\n        if (array.length >= 3) {\n          this.borderStyle.setHorizontalCornerRadius(array[0]);\n          this.borderStyle.setVerticalCornerRadius(array[1]);\n          this.borderStyle.setWidth(array[2], this.rectangle);\n\n          if (array.length === 4) {\n            // Dash array available\n            this.borderStyle.setDashArray(array[3], /* forceStyle = */ true);\n          }\n        } else if (array.length === 0) {\n          this.borderStyle.setWidth(0);\n        }\n      }\n    } else {\n      // There are no border entries in the dictionary. According to the\n      // specification, we should draw a solid border of width 1 in that\n      // case, but Adobe Reader did not implement that part of the\n      // specification and instead draws no border at all, so we do the same.\n      // See also https://github.com/mozilla/pdf.js/issues/6179.\n      this.borderStyle.setWidth(0);\n    }\n  }\n\n  /**\n   * Set the (normal) appearance.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Dict} dict - The annotation's data dictionary\n   */\n  setAppearance(dict) {\n    const appearanceStates = dict.get(\"AP\");\n    if (!(appearanceStates instanceof Dict)) {\n      return;\n    }\n\n    // In case the normal appearance is a stream, then it is used directly.\n    const normalAppearanceState = appearanceStates.get(\"N\");\n    if (normalAppearanceState instanceof BaseStream) {\n      this.appearance = normalAppearanceState;\n      return;\n    }\n    if (!(normalAppearanceState instanceof Dict)) {\n      return;\n    }\n\n    // In case the normal appearance is a dictionary, the `AS` entry provides\n    // the key of the stream in this dictionary.\n    const as = dict.get(\"AS\");\n    if (!(as instanceof Name)) {\n      return;\n    }\n    const appearance = normalAppearanceState.get(as.name);\n    if (appearance instanceof BaseStream) {\n      this.appearance = appearance;\n    }\n  }\n\n  #setOptionalContent(xref, dict) {\n    if (dict.has(\"OC\")) {\n      try {\n        this._oc = parseMarkedContentProps(\n          xref,\n          dict.get(\"OC\"),\n          /* resources = */ null\n        );\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        warn(`#setOptionalContent: ${ex}`);\n      }\n    }\n  }\n\n  async loadResources(keys, appearance) {\n    const resources = await appearance.dict.getAsync(\"Resources\");\n    if (resources) {\n      await ObjectLoader.load(resources, keys, resources.xref);\n    }\n    return resources;\n  }\n\n  // Whether the annotation should only be rendered on its own canvas when\n  // interactive forms are enabled. This is the case for checkbox/radio button\n  // widgets, whose checked/unchecked appearances are toggled in forms mode;\n  // other annotations (e.g. push buttons) keep their own canvas in any display\n  // mode.\n  get _ownCanvasRequiresForms() {\n    return false;\n  }\n\n  async getOperatorList(evaluator, task, intent, annotationStorage) {\n    const { hasOwnCanvas, id, rect } = this.data;\n    let appearance = this.appearance;\n    const isUsingOwnCanvas = !!(\n      hasOwnCanvas &&\n      intent & RenderingIntentFlag.DISPLAY &&\n      (!this._ownCanvasRequiresForms ||\n        intent & RenderingIntentFlag.ANNOTATIONS_FORMS)\n    );\n    if (isUsingOwnCanvas && (this.width === 0 || this.height === 0)) {\n      // Empty annotation, don't draw anything.\n      this.data.hasOwnCanvas = false;\n      return this._getOperatorListNoAppearance();\n    }\n    if (!appearance) {\n      if (!isUsingOwnCanvas) {\n        return this._getOperatorListNoAppearance();\n      }\n      appearance = new StringStream(\"\", new Dict());\n    }\n\n    const appearanceDict = appearance.dict;\n    const resources = await this.loadResources(\n      RESOURCES_KEYS_OPERATOR_LIST,\n      appearance\n    );\n    const bbox = lookupRect(appearanceDict.getArray(\"BBox\"), [\n      0,\n      0,\n      this.width,\n      this.height,\n    ]);\n    const matrix = lookupMatrix(\n      appearanceDict.getArray(\"Matrix\"),\n      IDENTITY_MATRIX\n    );\n    const transform = getTransformMatrix(rect, bbox, matrix);\n\n    const opList = new OperatorList();\n\n    const optionalContent = this._oc;\n    if (optionalContent !== undefined) {\n      opList.addOp(OPS.beginMarkedContentProps, [\"OC\", optionalContent]);\n    }\n\n    opList.addOp(OPS.beginAnnotation, [\n      id,\n      rect,\n      transform,\n      matrix,\n      isUsingOwnCanvas,\n    ]);\n\n    await evaluator.getOperatorList({\n      stream: appearance,\n      task,\n      resources,\n      operatorList: opList,\n      fallbackFontDict: this._fallbackFontDict,\n    });\n    opList.addOp(OPS.endAnnotation, []);\n\n    if (optionalContent !== undefined) {\n      opList.addOp(OPS.endMarkedContent, []);\n    }\n    this.reset();\n    return { opList, separateForm: false, separateCanvas: isUsingOwnCanvas };\n  }\n\n  async save(evaluator, task, annotationStorage, changes) {\n    return null;\n  }\n\n  get overlaysTextContent() {\n    return false;\n  }\n\n  get hasTextContent() {\n    return false;\n  }\n\n  async extractTextContent(evaluator, task, viewBox) {\n    if (!this.appearance) {\n      return;\n    }\n\n    const resources = await this.loadResources(\n      RESOURCES_KEYS_TEXT_CONTENT,\n      this.appearance\n    );\n\n    const text = [];\n    const buffer = [];\n    let firstPosition = null;\n    const sink = {\n      desiredSize: Math.Infinity,\n      ready: true,\n\n      enqueue(chunk, size) {\n        for (const item of chunk.items) {\n          if (item.str === undefined) {\n            continue;\n          }\n          firstPosition ||= item.transform.slice(-2);\n          buffer.push(item.str);\n          if (item.hasEOL) {\n            text.push(buffer.join(\"\").trimEnd());\n            buffer.length = 0;\n          }\n        }\n      },\n    };\n\n    await evaluator.getTextContent({\n      stream: this.appearance,\n      task,\n      resources,\n      includeMarkedContent: true,\n      keepWhiteSpace: true,\n      sink,\n      viewBox,\n    });\n    this.reset();\n\n    if (buffer.length) {\n      text.push(buffer.join(\"\").trimEnd());\n    }\n\n    if (text.length > 1 || text[0]) {\n      const appearanceDict = this.appearance.dict;\n      const bbox = lookupRect(appearanceDict.getArray(\"BBox\"), null);\n      const matrix = lookupMatrix(appearanceDict.getArray(\"Matrix\"), null);\n\n      this.data.textPosition = this._transformPoint(\n        firstPosition,\n        bbox,\n        matrix\n      );\n      this.data.textContent = text;\n    }\n  }\n\n  _transformPoint(coords, bbox, matrix) {\n    const { rect } = this.data;\n    bbox ||= [0, 0, 1, 1];\n    matrix ||= [1, 0, 0, 1, 0, 0];\n    const transform = getTransformMatrix(rect, bbox, matrix);\n    transform[4] -= rect[0];\n    transform[5] -= rect[1];\n    const p = coords.slice();\n    Util.applyTransform(p, transform);\n    Util.applyTransform(p, matrix);\n    return p;\n  }\n\n  /**\n   * Get field data for usage in JS sandbox.\n   *\n   * Field object is defined here:\n   * https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/js_api_reference.pdf#page=16\n   *\n   * @public\n   * @memberof Annotation\n   * @returns {Object | null}\n   */\n  getFieldObject() {\n    if (this.data.kidIds) {\n      return {\n        id: this.data.id,\n        actions: this.data.actions,\n        name: this.data.fieldName,\n        strokeColor: this.data.borderColor,\n        fillColor: this.data.backgroundColor,\n        type: \"\",\n        kidIds: this.data.kidIds,\n        page: this.data.pageIndex,\n        rotation: this.rotation,\n      };\n    }\n    return null;\n  }\n\n  /**\n   * Reset the annotation.\n   *\n   * This involves resetting the various streams that are either cached on the\n   * annotation instance or created during its construction.\n   *\n   * @public\n   * @memberof Annotation\n   */\n  reset() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.appearance &&\n      !this._streams.includes(this.appearance)\n    ) {\n      unreachable(\"The appearance stream should always be reset.\");\n    }\n\n    for (const stream of this._streams) {\n      stream.reset();\n    }\n  }\n\n  /**\n   * Construct the (fully qualified) field name from the (partial) field\n   * names of the field and its ancestors.\n   *\n   * @private\n   * @memberof Annotation\n   * @param {Dict} dict - Complete widget annotation dictionary\n   * @returns {string}\n   */\n  _constructFieldName(dict) {\n    // Both the `Parent` and `T` fields are optional. While at least one of\n    // them should be provided, bad PDF generators may fail to do so.\n    if (!dict.has(\"T\") && !dict.has(\"Parent\")) {\n      warn(\"Unknown field name, falling back to empty field name.\");\n      return \"\";\n    }\n\n    // If no parent exists, the partial and fully qualified names are equal.\n    if (!dict.has(\"Parent\")) {\n      return stringToPDFString(dict.get(\"T\"));\n    }\n\n    // Form the fully qualified field name by appending the partial name to\n    // the parent's fully qualified name, separated by a period.\n    const fieldName = [];\n    if (dict.has(\"T\")) {\n      fieldName.unshift(stringToPDFString(dict.get(\"T\")));\n    }\n\n    let loopDict = dict;\n    const visited = new RefSet();\n    if (dict.objId) {\n      visited.put(dict.objId);\n    }\n    while (loopDict.has(\"Parent\")) {\n      loopDict = loopDict.get(\"Parent\");\n      if (\n        !(loopDict instanceof Dict) ||\n        (loopDict.objId && visited.has(loopDict.objId))\n      ) {\n        // Even though it is not allowed according to the PDF specification,\n        // bad PDF generators may provide a `Parent` entry that is not a\n        // dictionary, but `null` for example (issue 8143).\n        //\n        // If parent has been already visited, it means that we're\n        // in an infinite loop.\n        break;\n      }\n      if (loopDict.objId) {\n        visited.put(loopDict.objId);\n      }\n\n      if (loopDict.has(\"T\")) {\n        fieldName.unshift(stringToPDFString(loopDict.get(\"T\")));\n      }\n    }\n    return fieldName.join(\".\");\n  }\n\n  /**\n   * Encode the embedded content's reference in the id so it can be\n   * re-fetched from the xref on demand (see `Catalog.attachmentContent`)\n   * instead of being cached where `cleanup` would wipe it. The file-spec is\n   * usually indirect; when it's inline its embedded-file stream still isn't\n   * (streams are always indirect), so fall back to that ref.\n   */\n  _getAttachmentId(fsDict, fsRef, annotationGlobals) {\n    if (!(fsDict instanceof Dict)) {\n      return undefined;\n    }\n    if (!(fsRef instanceof Ref)) {\n      fsRef = FileSpec.pickPlatformItem(fsDict.get(\"EF\"), /* raw = */ true);\n    }\n    return fsRef instanceof Ref\n      ? annotationGlobals.catalog.getAttachmentIdForAnnotation(fsRef)\n      : undefined;\n  }\n\n  get width() {\n    return this.data.rect[2] - this.data.rect[0];\n  }\n\n  get height() {\n    return this.data.rect[3] - this.data.rect[1];\n  }\n}\n\n/**\n * Contains all data regarding an annotation's border style.\n */\nclass AnnotationBorderStyle {\n  width = 1;\n\n  rawWidth = 1;\n\n  style = AnnotationBorderStyleType.SOLID;\n\n  dashArray = [3];\n\n  horizontalCornerRadius = 0;\n\n  verticalCornerRadius = 0;\n\n  /**\n   * Set the width.\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {number} width - The width.\n   * @param {Array} rect - The annotation `Rect` entry.\n   */\n  setWidth(width, rect = [0, 0, 0, 0]) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        isNumberArray(rect, 4),\n        \"A valid `rect` parameter must be provided.\"\n      );\n    }\n\n    // Some corrupt PDF generators may provide the width as a `Name`,\n    // rather than as a number (fixes issue 10385).\n    if (width instanceof Name) {\n      this.width = 0; // This is consistent with the behaviour in Adobe Reader.\n      return;\n    }\n    if (typeof width === \"number\") {\n      if (width > 0) {\n        this.rawWidth = width;\n        const maxWidth = (rect[2] - rect[0]) / 2;\n        const maxHeight = (rect[3] - rect[1]) / 2;\n\n        // Ignore large `width`s, since they lead to the Annotation overflowing\n        // the size set by the `Rect` entry thus causing the `annotationLayer`\n        // to render it over the surrounding document (fixes bug1552113.pdf).\n        if (\n          maxWidth > 0 &&\n          maxHeight > 0 &&\n          (width > maxWidth || width > maxHeight)\n        ) {\n          warn(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`);\n          width = 1;\n        }\n      }\n      this.width = width;\n    }\n  }\n\n  /**\n   * Set the style.\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {Name} style - The annotation style.\n   * @see {@link shared/util.js}\n   */\n  setStyle(style) {\n    if (!(style instanceof Name)) {\n      return;\n    }\n    switch (style.name) {\n      case \"S\":\n        this.style = AnnotationBorderStyleType.SOLID;\n        break;\n\n      case \"D\":\n        this.style = AnnotationBorderStyleType.DASHED;\n        break;\n\n      case \"B\":\n        this.style = AnnotationBorderStyleType.BEVELED;\n        break;\n\n      case \"I\":\n        this.style = AnnotationBorderStyleType.INSET;\n        break;\n\n      case \"U\":\n        this.style = AnnotationBorderStyleType.UNDERLINE;\n        break;\n\n      default:\n        break;\n    }\n  }\n\n  /**\n   * Set the dash array.\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {Array} dashArray - The dash array with at least one element\n   * @param {boolean} [forceStyle]\n   */\n  setDashArray(dashArray, forceStyle = false) {\n    // We validate the dash array, but we do not use it because CSS does not\n    // allow us to change spacing of dashes. For more information, visit\n    // http://www.w3.org/TR/css3-background/#the-border-style.\n    if (Array.isArray(dashArray)) {\n      // The PDF specification states that elements in the dash array, if\n      // present, must be non-negative numbers and must not all equal zero.\n      let isValid = true;\n      let allZeros = true;\n      for (const element of dashArray) {\n        const validNumber = +element >= 0;\n        if (!validNumber) {\n          isValid = false;\n          break;\n        } else if (element > 0) {\n          allZeros = false;\n        }\n      }\n      if (dashArray.length === 0 || (isValid && !allZeros)) {\n        this.dashArray = dashArray;\n\n        if (forceStyle) {\n          // Even though we cannot use the dash array in the display layer,\n          // at least ensure that we use the correct border-style.\n          this.setStyle(Name.get(\"D\"));\n        }\n      } else {\n        this.width = 0; // Adobe behavior when the array is invalid.\n      }\n    } else if (dashArray) {\n      this.width = 0; // Adobe behavior when the array is invalid.\n    }\n  }\n\n  /**\n   * Set the horizontal corner radius (from a Border dictionary).\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {number} radius - The horizontal corner radius.\n   */\n  setHorizontalCornerRadius(radius) {\n    if (Number.isInteger(radius)) {\n      this.horizontalCornerRadius = radius;\n    }\n  }\n\n  /**\n   * Set the vertical corner radius (from a Border dictionary).\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {number} radius - The vertical corner radius.\n   */\n  setVerticalCornerRadius(radius) {\n    if (Number.isInteger(radius)) {\n      this.verticalCornerRadius = radius;\n    }\n  }\n}\n\nclass MarkupAnnotation extends Annotation {\n  constructor(params) {\n    super(params);\n\n    const { dict } = params;\n\n    if (dict.has(\"IRT\")) {\n      const rawIRT = dict.getRaw(\"IRT\");\n      this.data.inReplyTo = rawIRT instanceof Ref ? rawIRT.toString() : null;\n\n      const rt = dict.get(\"RT\");\n      this.data.replyType =\n        rt instanceof Name ? rt.name : AnnotationReplyType.REPLY;\n    }\n    let popupRef = null;\n\n    if (this.data.replyType === AnnotationReplyType.GROUP) {\n      // Subordinate annotations in a group should inherit\n      // the group attributes from the primary annotation.\n      const parent = dict.get(\"IRT\");\n\n      this.setTitle(parent.get(\"T\"));\n      this.data.titleObj = this._title;\n\n      this.setContents(parent.get(\"Contents\"));\n      this.data.contentsObj = this._contents;\n\n      if (!parent.has(\"CreationDate\")) {\n        this.data.creationDate = null;\n      } else {\n        this.setCreationDate(parent.get(\"CreationDate\"));\n        this.data.creationDate = this.creationDate;\n      }\n\n      if (!parent.has(\"M\")) {\n        this.data.modificationDate = null;\n      } else {\n        this.setModificationDate(parent.get(\"M\"));\n        this.data.modificationDate = this.modificationDate;\n      }\n\n      popupRef = parent.getRaw(\"Popup\");\n\n      if (!parent.has(\"C\")) {\n        // Fall back to the default background color.\n        this.data.color = null;\n      } else {\n        this.setColor(parent.getArray(\"C\"));\n        this.data.color = this.color;\n      }\n    } else {\n      this.data.titleObj = this._title;\n\n      this.setCreationDate(dict.get(\"CreationDate\"));\n      this.data.creationDate = this.creationDate;\n\n      popupRef = dict.getRaw(\"Popup\");\n\n      if (!dict.has(\"C\")) {\n        // Fall back to the default background color.\n        this.data.color = null;\n      }\n    }\n\n    this.data.popupRef = popupRef instanceof Ref ? popupRef.toString() : null;\n\n    if (dict.has(\"RC\")) {\n      this.data.richText = XFAFactory.getRichTextAsHtml(dict.get(\"RC\"));\n    }\n  }\n\n  /**\n   * Set the creation date.\n   *\n   * @public\n   * @memberof MarkupAnnotation\n   * @param {string} creationDate - PDF date string that indicates when the\n   *                                annotation was originally created\n   */\n  setCreationDate(creationDate) {\n    this.creationDate = typeof creationDate === \"string\" ? creationDate : null;\n  }\n\n  _setDefaultAppearance({\n    xref,\n    extra,\n    strokeColor,\n    fillColor,\n    blendMode,\n    strokeAlpha,\n    fillAlpha,\n    pointsCallback,\n  }) {\n    const bbox = (this.data.rect = BBOX_INIT.slice());\n\n    const buffer = [\"q\"];\n    if (extra) {\n      buffer.push(extra);\n    }\n    if (strokeColor) {\n      buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`);\n    }\n    if (fillColor) {\n      buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`);\n    }\n\n    // If there are no quadpoints, the rectangle should be used instead.\n    // Convert the rectangle definition to a points array similar to how the\n    // quadpoints are defined.\n    const pointsArray =\n      this.data.quadPoints ||\n      Float32Array.from([\n        this.rectangle[0],\n        this.rectangle[3],\n        this.rectangle[2],\n        this.rectangle[3],\n        this.rectangle[0],\n        this.rectangle[1],\n        this.rectangle[2],\n        this.rectangle[1],\n      ]);\n\n    for (let i = 0, ii = pointsArray.length; i < ii; i += 8) {\n      const points = pointsCallback(buffer, pointsArray.subarray(i, i + 8));\n      Util.rectBoundingBox(...points, bbox);\n    }\n    buffer.push(\"Q\");\n\n    const formDict = new Dict(xref);\n    const appearanceStreamDict = new Dict(xref);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n\n    const appearanceStream = new StringStream(\n      buffer.join(\" \"),\n      appearanceStreamDict\n    );\n    formDict.set(\"Fm0\", appearanceStream);\n\n    const gsDict = new Dict(xref);\n    if (blendMode) {\n      gsDict.setIfName(\"BM\", blendMode);\n    }\n    gsDict.setIfNumber(\"CA\", strokeAlpha);\n    gsDict.setIfNumber(\"ca\", fillAlpha);\n\n    const stateDict = new Dict(xref);\n    stateDict.set(\"GS0\", gsDict);\n\n    const resources = new Dict(xref);\n    resources.set(\"ExtGState\", stateDict);\n    resources.set(\"XObject\", formDict);\n\n    const appearanceDict = new Dict(xref);\n    appearanceDict.set(\"Resources\", resources);\n    appearanceDict.set(\"BBox\", bbox);\n\n    this.appearance = new StringStream(\"/GS0 gs /Fm0 Do\", appearanceDict);\n\n    // This method is only called if there is no appearance for the annotation,\n    // so `this.appearance` is not pushed yet in the `Annotation` constructor.\n    this._streams.push(this.appearance, appearanceStream);\n  }\n\n  static async createNewAnnotation(xref, annotation, changes, params) {\n    const annotationRef = (annotation.ref ||= xref.getNewTemporaryRef());\n\n    const ap = await this.createNewAppearanceStream(annotation, xref, params);\n    let annotationDict;\n\n    if (ap) {\n      const apRef = xref.getNewTemporaryRef();\n      annotationDict = this.createNewDict(annotation, xref, {\n        apRef,\n      });\n      changes.put(apRef, {\n        data: ap,\n      });\n    } else {\n      annotationDict = this.createNewDict(annotation, xref, {});\n    }\n    if (Number.isInteger(annotation.parentTreeId)) {\n      annotationDict.set(\"StructParent\", annotation.parentTreeId);\n    }\n\n    changes.put(annotationRef, {\n      data: annotationDict,\n    });\n\n    const retRef = { ref: annotationRef };\n    const { popup } = annotation;\n    if (popup) {\n      if (popup.deleted) {\n        annotationDict.delete(\"Popup\");\n        annotationDict.delete(\"Contents\");\n        annotationDict.delete(\"RC\");\n        return retRef;\n      }\n      const popupRef = (popup.ref ||= xref.getNewTemporaryRef());\n      popup.parent = annotationRef;\n      const popupDict = PopupAnnotation.createNewDict(popup, xref);\n      changes.put(popupRef, { data: popupDict });\n      annotationDict.setIfDefined(\n        \"Contents\",\n        stringToAsciiOrUTF16BE(popup.contents)\n      );\n      annotationDict.set(\"Popup\", popupRef);\n\n      return [retRef, { ref: popupRef }];\n    }\n\n    return retRef;\n  }\n\n  static async createNewPrintAnnotation(\n    annotationGlobals,\n    xref,\n    annotation,\n    params\n  ) {\n    const ap = await this.createNewAppearanceStream(annotation, xref, params);\n    const annotationDict = this.createNewDict(\n      annotation,\n      xref,\n      ap ? { ap } : {}\n    );\n\n    const newAnnotation = new this.prototype.constructor({\n      dict: annotationDict,\n      xref,\n      annotationGlobals,\n      evaluatorOptions: params.evaluatorOptions,\n    });\n\n    if (annotation.ref) {\n      newAnnotation.ref = newAnnotation.refToReplace = annotation.ref;\n    }\n\n    return newAnnotation;\n  }\n}\n\nclass WidgetAnnotation extends Annotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref, annotationGlobals } = params;\n    const data = this.data;\n    this._needAppearances = params.needAppearances;\n\n    if (data.fieldName === undefined) {\n      data.fieldName = this._constructFieldName(dict);\n    }\n\n    if (data.actions === undefined) {\n      data.actions = collectActions(xref, dict, AnnotationActionEventType);\n    }\n\n    let fieldValue = getInheritableProperty({\n      dict,\n      key: \"V\",\n      getArray: true,\n    });\n    data.fieldValue = this._decodeFormValue(fieldValue);\n\n    const defaultFieldValue = getInheritableProperty({\n      dict,\n      key: \"DV\",\n      getArray: true,\n    });\n    data.defaultFieldValue = this._decodeFormValue(defaultFieldValue);\n\n    if (fieldValue === undefined && annotationGlobals.xfaDatasets) {\n      // Try to figure out if we have something in the xfa dataset.\n      const path = this._title.str;\n      if (path) {\n        this._hasValueFromXFA = true;\n        data.fieldValue = fieldValue =\n          annotationGlobals.xfaDatasets.getValue(path);\n      }\n    }\n\n    // When no \"V\" entry exists, let the fieldValue fallback to the \"DV\" entry\n    // (fixes issue13823.pdf).\n    if (fieldValue === undefined && data.defaultFieldValue !== null) {\n      data.fieldValue = data.defaultFieldValue;\n    }\n\n    data.alternativeText = stringToPDFString(dict.get(\"TU\") || \"\");\n\n    this.setDefaultAppearance(params);\n\n    data.hasAppearance ||=\n      this._needAppearances &&\n      data.fieldValue !== undefined &&\n      data.fieldValue !== null;\n\n    const fieldType = getInheritableProperty({ dict, key: \"FT\" });\n    data.fieldType = fieldType instanceof Name ? fieldType.name : null;\n\n    const localResources = getInheritableProperty({ dict, key: \"DR\" });\n    const acroFormResources = annotationGlobals.acroForm.get(\"DR\");\n    const appearanceResources = this.appearance?.dict.get(\"Resources\");\n\n    this._fieldResources = {\n      localResources,\n      acroFormResources,\n      appearanceResources,\n      mergedResources: Dict.merge({\n        xref,\n        dictArray: [localResources, appearanceResources, acroFormResources],\n        mergeSubDicts: true,\n      }),\n    };\n\n    data.fieldFlags = getInheritableProperty({ dict, key: \"Ff\" });\n    if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {\n      data.fieldFlags = 0;\n    }\n\n    data.password = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD);\n    data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY);\n    data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED);\n    data.hidden =\n      this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) ||\n      this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW);\n  }\n\n  /**\n   * Decode the given form value.\n   *\n   * @private\n   * @memberof WidgetAnnotation\n   * @param {Array<string>|Name|string} formValue - The (possibly encoded)\n   *   form value.\n   * @returns {Array<string>|string|null}\n   */\n  _decodeFormValue(formValue) {\n    if (Array.isArray(formValue)) {\n      const arr = formValue\n        .map(item => this._decodeFormValue(item))\n        .filter(item => item !== null);\n      return arr.length > 0 ? arr : null;\n    } else if (formValue instanceof Name) {\n      return formValue.name;\n    } else if (typeof formValue === \"string\") {\n      return stringToPDFString(formValue);\n    }\n    return null;\n  }\n\n  /**\n   * Check if a provided field flag is set.\n   *\n   * @public\n   * @memberof WidgetAnnotation\n   * @param {number} flag - Hexadecimal representation for an annotation\n   *                        field characteristic\n   * @returns {boolean}\n   * @see {@link shared/util.js}\n   */\n  hasFieldFlag(flag) {\n    return !!(this.data.fieldFlags & flag);\n  }\n\n  /** @inheritdoc */\n  _isViewable(flags) {\n    // We don't take into account the `NOVIEW` or `HIDDEN` flags here,\n    // since the visibility can be changed by js code, hence in case\n    // it's made viewable, we should render it (with visibility set to\n    // hidden).\n    // We don't take into account the `INVISIBLE` flag here, since we've a known\n    // annotation type.\n    return true;\n  }\n\n  /** @inheritdoc */\n  mustBeViewed(annotationStorage, renderForms) {\n    if (renderForms) {\n      return this.viewable;\n    }\n    return (\n      super.mustBeViewed(annotationStorage, renderForms) &&\n      !this._hasFlag(this.flags, AnnotationFlag.NOVIEW)\n    );\n  }\n\n  getRotationMatrix(annotationStorage) {\n    let rotation = annotationStorage?.get(this.data.id)?.rotation;\n    if (rotation === undefined) {\n      rotation = this.rotation;\n    }\n\n    return rotation === 0\n      ? IDENTITY_MATRIX\n      : getRotationMatrix(rotation, this.width, this.height);\n  }\n\n  getBorderAndBackgroundAppearances(annotationStorage) {\n    let rotation = annotationStorage?.get(this.data.id)?.rotation;\n    if (rotation === undefined) {\n      rotation = this.rotation;\n    }\n\n    if (!this.backgroundColor && !this.borderColor) {\n      return \"\";\n    }\n    const rect =\n      rotation === 0 || rotation === 180\n        ? `0 0 ${this.width} ${this.height} re`\n        : `0 0 ${this.height} ${this.width} re`;\n\n    let str = \"\";\n    if (this.backgroundColor) {\n      str = `${getPdfColor(\n        this.backgroundColor,\n        /* isFill */ true\n      )} ${rect} f `;\n    }\n\n    if (this.borderColor) {\n      const borderWidth = this.borderStyle.width || 1;\n      str += `${borderWidth} w ${getPdfColor(\n        this.borderColor,\n        /* isFill */ false\n      )} ${rect} S `;\n    }\n\n    return str;\n  }\n\n  async getOperatorList(evaluator, task, intent, annotationStorage) {\n    // Do not render form elements on the canvas when interactive forms are\n    // enabled. The display layer is responsible for rendering them instead.\n    if (\n      intent & RenderingIntentFlag.ANNOTATIONS_FORMS &&\n      !(this instanceof SignatureWidgetAnnotation) &&\n      !this.data.noHTML &&\n      !this.data.hasOwnCanvas\n    ) {\n      const list = this._getOperatorListNoAppearance();\n      list.separateForm = true;\n      return list;\n    }\n\n    if (!this._hasText) {\n      return super.getOperatorList(evaluator, task, intent, annotationStorage);\n    }\n\n    const content = await this._getAppearance(\n      evaluator,\n      task,\n      intent,\n      annotationStorage\n    );\n    if (this.appearance && content === null) {\n      return super.getOperatorList(evaluator, task, intent, annotationStorage);\n    }\n\n    const opList = new OperatorList();\n\n    // Even if there is an appearance stream, ignore it. This is the\n    // behaviour used by Adobe Reader.\n    if (!this._defaultAppearance || content === null) {\n      return { opList, separateForm: false, separateCanvas: false };\n    }\n\n    const isUsingOwnCanvas = !!(\n      this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY\n    );\n\n    const matrix = [1, 0, 0, 1, 0, 0];\n    const bbox = [0, 0, this.width, this.height];\n    const transform = getTransformMatrix(this.data.rect, bbox, matrix);\n\n    const optionalContent = this._oc;\n    if (optionalContent !== undefined) {\n      opList.addOp(OPS.beginMarkedContentProps, [\"OC\", optionalContent]);\n    }\n\n    opList.addOp(OPS.beginAnnotation, [\n      this.data.id,\n      this.data.rect,\n      transform,\n      this.getRotationMatrix(annotationStorage),\n      isUsingOwnCanvas,\n    ]);\n\n    const stream = new StringStream(content);\n    await evaluator.getOperatorList({\n      stream,\n      task,\n      resources: this._fieldResources.mergedResources,\n      operatorList: opList,\n    });\n    opList.addOp(OPS.endAnnotation, []);\n\n    if (optionalContent !== undefined) {\n      opList.addOp(OPS.endMarkedContent, []);\n    }\n    return { opList, separateForm: false, separateCanvas: isUsingOwnCanvas };\n  }\n\n  _getMKDict(rotation) {\n    const mk = new Dict(null);\n    if (rotation) {\n      mk.set(\"R\", rotation);\n    }\n    mk.setIfArray(\"BC\", getPdfColorArray(this.borderColor));\n    mk.setIfArray(\"BG\", getPdfColorArray(this.backgroundColor));\n    return mk.size > 0 ? mk : null;\n  }\n\n  amendSavedDict(annotationStorage, dict) {}\n\n  setValue(dict, value, xref, changes) {\n    const { dict: parentDict, ref: parentRef } = getParentToUpdate(\n      dict,\n      this.ref,\n      xref\n    );\n    if (!parentDict) {\n      dict.set(\"V\", value);\n    } else if (!changes.has(parentRef)) {\n      const newParentDict = parentDict.clone();\n      newParentDict.set(\"V\", value);\n      changes.put(parentRef, { data: newParentDict });\n      return newParentDict;\n    }\n\n    return null;\n  }\n\n  async save(evaluator, task, annotationStorage, changes) {\n    const storageEntry = annotationStorage?.get(this.data.id);\n    const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);\n    let value = storageEntry?.value,\n      rotation = storageEntry?.rotation;\n    if (value === this.data.fieldValue || value === undefined) {\n      if (\n        !this._hasValueFromXFA &&\n        rotation === undefined &&\n        flags === undefined\n      ) {\n        return;\n      }\n      value ||= this.data.fieldValue;\n    }\n\n    // Value can be an array (with choice list and multiple selections)\n    if (\n      rotation === undefined &&\n      !this._hasValueFromXFA &&\n      Array.isArray(value) &&\n      Array.isArray(this.data.fieldValue) &&\n      isArrayEqual(value, this.data.fieldValue) &&\n      flags === undefined\n    ) {\n      return;\n    }\n\n    if (rotation === undefined) {\n      rotation = this.rotation;\n    }\n\n    let appearance = null;\n    if (!this._needAppearances) {\n      appearance = await this._getAppearance(\n        evaluator,\n        task,\n        RenderingIntentFlag.SAVE,\n        annotationStorage\n      );\n      if (appearance === null && flags === undefined) {\n        // Appearance didn't change.\n        return;\n      }\n    } else {\n      // No need to create an appearance: the pdf has the flag /NeedAppearances\n      // which means that it's up to the reader to produce an appearance.\n    }\n\n    let needAppearances = false;\n    if (appearance?.needAppearances) {\n      needAppearances = true;\n      appearance = null;\n    }\n\n    const { xref } = evaluator;\n\n    const originalDict = xref.fetchIfRef(this.ref);\n    if (!(originalDict instanceof Dict)) {\n      return;\n    }\n\n    const dict = new Dict(xref);\n    for (const [key, rawVal] of originalDict.getRawEntries()) {\n      if (key !== \"AP\") {\n        dict.set(key, rawVal);\n      }\n    }\n    if (flags !== undefined) {\n      dict.set(\"F\", flags);\n      if (appearance === null && !needAppearances) {\n        const ap = originalDict.getRaw(\"AP\");\n        if (ap) {\n          dict.set(\"AP\", ap);\n        }\n      }\n    }\n\n    const xfa = {\n      path: this.data.fieldName,\n      value,\n    };\n\n    const newParentDict = this.setValue(\n      dict,\n      Array.isArray(value)\n        ? value.map(stringToAsciiOrUTF16BE)\n        : stringToAsciiOrUTF16BE(value),\n      xref,\n      changes\n    );\n    this.amendSavedDict(annotationStorage, newParentDict || dict);\n\n    const maybeMK = this._getMKDict(rotation);\n    if (maybeMK) {\n      dict.set(\"MK\", maybeMK);\n    }\n\n    changes.put(this.ref, {\n      data: dict,\n      xfa,\n      needAppearances,\n    });\n    if (appearance !== null) {\n      const newRef = xref.getNewTemporaryRef();\n      const AP = new Dict(xref);\n      dict.set(\"AP\", AP);\n      AP.set(\"N\", newRef);\n\n      const resources = this._getSaveFieldResources(xref),\n        appearanceDict = new Dict(xref);\n      appearanceDict.setIfName(\"Subtype\", \"Form\");\n      appearanceDict.set(\"Resources\", resources);\n      const bbox =\n        rotation % 180 === 0\n          ? [0, 0, this.width, this.height]\n          : [0, 0, this.height, this.width];\n      appearanceDict.set(\"BBox\", bbox);\n\n      const appearanceStream = new StringStream(appearance, appearanceDict);\n\n      const rotationMatrix = this.getRotationMatrix(annotationStorage);\n      if (rotationMatrix !== IDENTITY_MATRIX) {\n        // The matrix isn't the identity one.\n        appearanceDict.set(\"Matrix\", rotationMatrix);\n      }\n\n      changes.put(newRef, {\n        data: appearanceStream,\n        xfa: null,\n        needAppearances: false,\n      });\n    }\n\n    dict.set(\"M\", `D:${getModificationDate()}`);\n  }\n\n  async _getAppearance(evaluator, task, intent, annotationStorage) {\n    if (this.data.password) {\n      return null;\n    }\n    const storageEntry = annotationStorage?.get(this.data.id);\n    let value, rotation;\n    if (storageEntry) {\n      value = storageEntry.formattedValue || storageEntry.value;\n      rotation = storageEntry.rotation;\n    }\n\n    if (\n      rotation === undefined &&\n      value === undefined &&\n      !this._needAppearances\n    ) {\n      if (!this._hasValueFromXFA || this.appearance) {\n        // The annotation hasn't been rendered so use the appearance.\n        return null;\n      }\n    }\n\n    // Empty or it has a trailing whitespace.\n    const colors = this.getBorderAndBackgroundAppearances(annotationStorage);\n\n    if (value === undefined) {\n      // The annotation has its value in XFA datasets but not in the V field.\n      value = this.data.fieldValue;\n      if (!value) {\n        return `/Tx BMC q ${colors}Q EMC`;\n      }\n    }\n\n    if (Array.isArray(value) && value.length === 1) {\n      value = value[0];\n    }\n\n    assert(typeof value === \"string\", \"Expected `value` to be a string.\");\n    value = value.trimEnd();\n\n    if (this.data.combo) {\n      // The value can be one of the exportValue or any other values.\n      const option = this.data.options.find(\n        ({ exportValue }) => value === exportValue\n      );\n      value = option?.displayValue || value;\n    }\n\n    if (value === \"\") {\n      // the field is empty: nothing to render\n      return `/Tx BMC q ${colors}Q EMC`;\n    }\n\n    if (rotation === undefined) {\n      rotation = this.rotation;\n    }\n\n    let lineCount = -1;\n    let lines;\n\n    // We could have a text containing for example some sequences of chars and\n    // their diacritics (e.g. \"茅\".normalize(\"NFKD\") shows 1 char when it's 2).\n    // Positioning diacritics is really something we don't want to do here.\n    // So if a font has a glyph for a acute accent and one for \"e\" then we won't\n    // get any encoding issues but we'll render \"e\" and then \"麓\".\n    // It's why we normalize the string. We use NFC to preserve the initial\n    // string, (e.g. \"虏\".normalize(\"NFC\") === \"虏\"\n    // but \"虏\".normalize(\"NFKC\") === \"2\").\n    //\n    // TODO: it isn't a perfect solution, some chars like \"岷固乗" will be\n    // decomposed into two chars (\"岷筡" and \"麓\"), so we should detect such\n    // situations and then use either FakeUnicodeFont or set the\n    // /NeedAppearances flag.\n    if (this.data.multiLine) {\n      lines = value.split(/\\r\\n?|\\n/).map(line => line.normalize(\"NFC\"));\n      lineCount = lines.length;\n    } else {\n      lines = [value.replace(/\\r\\n?|\\n/, \"\").normalize(\"NFC\")];\n    }\n\n    const defaultPadding = 1;\n    const defaultHPadding = 2;\n    let { width: totalWidth, height: totalHeight } = this;\n\n    if (rotation === 90 || rotation === 270) {\n      [totalWidth, totalHeight] = [totalHeight, totalWidth];\n    }\n\n    if (!this._defaultAppearance) {\n      // The DA is required and must be a string.\n      // If there is no font named Helvetica in the resource dictionary,\n      // the evaluator will fall back to a default font.\n      // Doing so prevents exceptions and allows saving/printing\n      // the file as expected.\n      this.data.defaultAppearanceData = parseDefaultAppearance(\n        (this._defaultAppearance = \"/Helvetica 0 Tf 0 g\")\n      );\n    }\n\n    let font = await WidgetAnnotation._getFontData(\n      evaluator,\n      task,\n      this.data.defaultAppearanceData,\n      this._fieldResources.mergedResources\n    );\n\n    let defaultAppearance, fontSize, lineHeight;\n    const encodedLines = [];\n    let encodingError = false;\n    for (const line of lines) {\n      const encodedString = font.encodeString(line);\n      if (encodedString.length > 1) {\n        encodingError = true;\n      }\n      encodedLines.push(encodedString.join(\"\"));\n    }\n\n    if (encodingError && intent & RenderingIntentFlag.SAVE) {\n      // We don't have a way to render the field, so we just rely on the\n      // /NeedAppearances trick to let the different software correctly render\n      // this pdf.\n      return { needAppearances: true };\n    }\n\n    // We check that the font is able to encode the string.\n    if (encodingError && this._isOffscreenCanvasSupported) {\n      // If it can't then we fallback on fake unicode font (mapped to sans-serif\n      // for the rendering).\n      // It means that a printed form can be rendered differently (it depends on\n      // the sans-serif font) but at least we've something to render.\n      // In an ideal world the associated font should correctly handle the\n      // possible chars but a user can add a smiley or whatever.\n      // We could try to embed a font but it means that we must have access\n      // to the raw font file.\n      const fontFamily = this.data.comb ? \"monospace\" : \"sans-serif\";\n      const fakeUnicodeFont = new FakeUnicodeFont(evaluator.xref, fontFamily);\n      const resources = fakeUnicodeFont.createFontResources(lines.join(\"\"));\n      const newFont = resources.getRaw(\"Font\");\n\n      if (this._fieldResources.mergedResources.has(\"Font\")) {\n        const oldFont = this._fieldResources.mergedResources.get(\"Font\");\n        for (const [key, rawVal] of newFont.getRawEntries()) {\n          oldFont.set(key, rawVal);\n        }\n      } else {\n        this._fieldResources.mergedResources.set(\"Font\", newFont);\n      }\n\n      const fontName = fakeUnicodeFont.fontName.name;\n      font = await WidgetAnnotation._getFontData(\n        evaluator,\n        task,\n        { fontName, fontSize: 0 },\n        resources\n      );\n\n      for (let i = 0, ii = encodedLines.length; i < ii; i++) {\n        encodedLines[i] = stringToUTF16String(lines[i]);\n      }\n\n      const savedDefaultAppearance = Object.assign(\n        Object.create(null),\n        this.data.defaultAppearanceData\n      );\n      this.data.defaultAppearanceData.fontSize = 0;\n      this.data.defaultAppearanceData.fontName = fontName;\n\n      [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(\n        totalHeight - 2 * defaultPadding,\n        totalWidth - 2 * defaultHPadding,\n        value,\n        font,\n        lineCount\n      );\n\n      this.data.defaultAppearanceData = savedDefaultAppearance;\n    } else {\n      if (!this._isOffscreenCanvasSupported) {\n        warn(\n          \"_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly.\"\n        );\n      }\n\n      [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(\n        totalHeight - 2 * defaultPadding,\n        totalWidth - 2 * defaultHPadding,\n        value,\n        font,\n        lineCount\n      );\n    }\n\n    let descent = font.descent;\n    if (isNaN(descent)) {\n      descent = BASELINE_FACTOR * lineHeight;\n    } else {\n      descent = Math.max(\n        BASELINE_FACTOR * lineHeight,\n        Math.abs(descent) * fontSize\n      );\n    }\n\n    // Take into account the space we have to compute the default vertical\n    // padding.\n    const defaultVPadding = Math.min(\n      Math.floor((totalHeight - fontSize) / 2),\n      defaultPadding\n    );\n    const alignment = this.data.textAlignment;\n\n    if (this.data.multiLine) {\n      return this._getMultilineAppearance(\n        defaultAppearance,\n        encodedLines,\n        font,\n        fontSize,\n        totalWidth,\n        totalHeight,\n        alignment,\n        defaultHPadding,\n        defaultVPadding,\n        descent,\n        lineHeight,\n        annotationStorage\n      );\n    }\n\n    if (this.data.comb) {\n      return this._getCombAppearance(\n        defaultAppearance,\n        font,\n        encodedLines[0],\n        fontSize,\n        totalWidth,\n        totalHeight,\n        alignment,\n        bidi(lines[0]).dir === \"rtl\",\n        annotationStorage\n      );\n    }\n\n    const bottomPadding = defaultVPadding + descent;\n    if (alignment === 0 || alignment > 2) {\n      // Left alignment: nothing to do\n      return (\n        `/Tx BMC q ${colors}BT ` +\n        defaultAppearance +\n        ` 1 0 0 1 ${numberToString(defaultHPadding)} ${numberToString(\n          bottomPadding\n        )} Tm (${escapeString(encodedLines[0])}) Tj` +\n        \" ET Q EMC\"\n      );\n    }\n\n    const prevInfo = { shift: 0 };\n    const renderedText = this._renderText(\n      encodedLines[0],\n      font,\n      fontSize,\n      totalWidth,\n      alignment,\n      prevInfo,\n      defaultHPadding,\n      bottomPadding\n    );\n    return (\n      `/Tx BMC q ${colors}BT ` +\n      defaultAppearance +\n      ` 1 0 0 1 0 0 Tm ${renderedText}` +\n      \" ET Q EMC\"\n    );\n  }\n\n  static async _getFontData(evaluator, task, appearanceData, resources) {\n    const operatorList = new OperatorList();\n    const initialState = {\n      font: null,\n      clone() {\n        return this;\n      },\n    };\n\n    const { fontName, fontSize } = appearanceData;\n    await evaluator.handleSetFont(\n      resources,\n      [fontName && Name.get(fontName), fontSize],\n      /* fontRef = */ null,\n      operatorList,\n      task,\n      initialState,\n      /* fallbackFontDict = */ null\n    );\n\n    return initialState.font;\n  }\n\n  _getTextWidth(text, font) {\n    return Math.sumPrecise(font.charsToGlyphs(text).map(g => g.width)) / 1000;\n  }\n\n  _computeFontSize(height, width, text, font, lineCount) {\n    let { fontSize } = this.data.defaultAppearanceData;\n    let lineHeight = (fontSize || 12) * LINE_FACTOR,\n      numberOfLines = Math.round(height / lineHeight);\n\n    if (!fontSize) {\n      // A zero value for size means that the font shall be auto-sized:\n      // its size shall be computed as a function of the height of the\n      // annotation rectangle (see 12.7.3.3).\n\n      const roundWithTwoDigits = x => Math.floor(x * 100) / 100;\n\n      if (lineCount === -1) {\n        // Get the text width for a font size of 1.\n        const textWidth = this._getTextWidth(text, font);\n\n        // width / textWidth is the max font size to fit the width.\n        // height / LINE_FACTOR is the max font size to fit the height.\n        fontSize = roundWithTwoDigits(\n          Math.min(height / LINE_FACTOR, width / textWidth)\n        );\n        numberOfLines = 1;\n      } else {\n        const lines = text.split(/\\r\\n?|\\n/);\n        const cachedLines = [];\n        for (const line of lines) {\n          const encoded = font.encodeString(line).join(\"\");\n          const glyphs = font.charsToGlyphs(encoded);\n          const positions = font.getCharPositions(encoded);\n          cachedLines.push({\n            line: encoded,\n            glyphs,\n            positions,\n          });\n        }\n\n        const isTooBig = fsize => {\n          // Return true when the text doesn't fit the given height.\n          let totalHeight = 0;\n          for (const cache of cachedLines) {\n            const chunks = this._splitLine(null, font, fsize, width, cache);\n            totalHeight += chunks.length * fsize;\n            if (totalHeight > height) {\n              return true;\n            }\n          }\n          return false;\n        };\n\n        // Hard to guess how many lines there are.\n        // The field may have been sized to have 10 lines\n        // and the user entered only 1 so if we get font size from\n        // height and number of lines then we'll get something too big.\n        // So we compute a fake number of lines based on height and\n        // a font size equal to 12 (this is the default font size in\n        // Acrobat).\n        // Then we'll adjust font size to what we have really.\n        numberOfLines = Math.max(numberOfLines, lineCount);\n\n        while (true) {\n          lineHeight = height / numberOfLines;\n          fontSize = roundWithTwoDigits(lineHeight / LINE_FACTOR);\n\n          if (isTooBig(fontSize)) {\n            numberOfLines++;\n            continue;\n          }\n\n          break;\n        }\n      }\n\n      const { fontName, fontColor } = this.data.defaultAppearanceData;\n      this._defaultAppearance = createDefaultAppearance({\n        fontSize,\n        fontName,\n        fontColor,\n      });\n    }\n\n    return [this._defaultAppearance, fontSize, height / numberOfLines];\n  }\n\n  _renderText(\n    text,\n    font,\n    fontSize,\n    totalWidth,\n    alignment,\n    prevInfo,\n    hPadding,\n    vPadding\n  ) {\n    // TODO: we need to take into account (if possible) how the text\n    // is rendered. For example in arabic, the cumulated width of some\n    // glyphs isn't equal to the width of the rendered glyphs because\n    // of ligatures.\n    let shift;\n    if (alignment === 1) {\n      // Center\n      const width = this._getTextWidth(text, font) * fontSize;\n      shift = (totalWidth - width) / 2;\n    } else if (alignment === 2) {\n      // Right\n      const width = this._getTextWidth(text, font) * fontSize;\n      shift = totalWidth - width - hPadding;\n    } else {\n      shift = hPadding;\n    }\n    const shiftStr = numberToString(shift - prevInfo.shift);\n    prevInfo.shift = shift;\n    vPadding = numberToString(vPadding);\n\n    return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`;\n  }\n\n  /**\n   * @private\n   */\n  _getSaveFieldResources(xref) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        this.data.defaultAppearanceData,\n        \"Expected `_defaultAppearanceData` to have been set.\"\n      );\n    }\n    const { localResources, appearanceResources, acroFormResources } =\n      this._fieldResources;\n\n    const fontName = this.data.defaultAppearanceData?.fontName;\n    if (!fontName) {\n      return localResources || Dict.empty;\n    }\n\n    for (const resources of [localResources, appearanceResources]) {\n      if (resources instanceof Dict) {\n        const localFont = resources.get(\"Font\");\n        if (localFont instanceof Dict && localFont.has(fontName)) {\n          return resources;\n        }\n      }\n    }\n    if (acroFormResources instanceof Dict) {\n      const acroFormFont = acroFormResources.get(\"Font\");\n      if (acroFormFont instanceof Dict && acroFormFont.has(fontName)) {\n        const subFontDict = new Dict(xref);\n        subFontDict.set(fontName, acroFormFont.getRaw(fontName));\n\n        const subResourcesDict = new Dict(xref);\n        subResourcesDict.set(\"Font\", subFontDict);\n\n        return Dict.merge({\n          xref,\n          dictArray: [subResourcesDict, localResources],\n          mergeSubDicts: true,\n        });\n      }\n    }\n    return localResources || Dict.empty;\n  }\n\n  getFieldObject() {\n    return null;\n  }\n}\n\nclass TextWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict } = params;\n\n    if (dict.has(\"PMD\")) {\n      // It's used to display a barcode but it isn't specified so we just hide\n      // it to avoid any confusion.\n      this.flags |= AnnotationFlag.HIDDEN;\n      this.data.hidden = true;\n      warn(\"Barcodes are not supported\");\n    }\n\n    this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML;\n    this._hasText = true;\n\n    // The field value is always a string.\n    if (typeof this.data.fieldValue !== \"string\") {\n      this.data.fieldValue = \"\";\n    }\n\n    // Determine the alignment of text in the field.\n    let alignment = getInheritableProperty({ dict, key: \"Q\" });\n    if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {\n      alignment = null;\n    }\n    this.data.textAlignment = alignment;\n\n    // Determine the maximum length of text in the field.\n    let maximumLength = getInheritableProperty({ dict, key: \"MaxLen\" });\n    if (!Number.isInteger(maximumLength) || maximumLength < 0) {\n      maximumLength = 0;\n    }\n    this.data.maxLen = maximumLength;\n\n    // Process field flags for the display layer.\n    this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE);\n    this.data.comb =\n      this.hasFieldFlag(AnnotationFieldFlag.COMB) &&\n      !this.data.multiLine &&\n      !this.data.password &&\n      !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) &&\n      this.data.maxLen !== 0;\n    this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL);\n\n    // Check if we have a date or time.\n    const {\n      data: { actions },\n    } = this;\n\n    if (!actions) {\n      return;\n    }\n\n    const AFDateTime =\n      /^AF(Date|Time)_(?:Keystroke|Format)(?:Ex)?\\(['\"]?([^'\"]+)['\"]?\\);$/;\n    let canUseHTMLDateTime = false;\n    if (\n      (actions.Format?.length === 1 &&\n        actions.Keystroke?.length === 1 &&\n        AFDateTime.test(actions.Format[0]) &&\n        AFDateTime.test(actions.Keystroke[0])) ||\n      (actions.Format?.length === 0 &&\n        actions.Keystroke?.length === 1 &&\n        AFDateTime.test(actions.Keystroke[0])) ||\n      (actions.Keystroke?.length === 0 &&\n        actions.Format?.length === 1 &&\n        AFDateTime.test(actions.Format[0]))\n    ) {\n      // If the Format and Keystroke actions are the same, we can just use\n      // the Format action.\n      canUseHTMLDateTime = true;\n    }\n    const actionsToVisit = [];\n    if (actions.Format) {\n      actionsToVisit.push(...actions.Format);\n    }\n    if (actions.Keystroke) {\n      actionsToVisit.push(...actions.Keystroke);\n    }\n    if (canUseHTMLDateTime) {\n      delete actions.Keystroke;\n      actions.Format = actionsToVisit;\n    }\n\n    for (const formatAction of actionsToVisit) {\n      const m = formatAction.match(AFDateTime);\n      if (!m) {\n        continue;\n      }\n      const isDate = m[1] === \"Date\";\n      let format = m[2];\n      const num = parseInt(format, 10);\n      if (!isNaN(num) && Math.floor(Math.log10(num)) + 1 === m[2].length) {\n        format = (isDate ? DateFormats : TimeFormats)[num] ?? format;\n      }\n      this.data.datetimeFormat = format;\n      if (!canUseHTMLDateTime) {\n        // The datetime format will just be used as a tooltip.\n        break;\n      }\n      if (isDate) {\n        // We can have a date and a time so we'll use a time input in this\n        // case.\n        if (/HH|MM|ss|h/.test(format)) {\n          this.data.datetimeType = \"datetime-local\";\n          this.data.timeStep = /ss/.test(format) ? 1 : 60;\n        } else {\n          this.data.datetimeType = \"date\";\n        }\n        break;\n      }\n      this.data.datetimeType = \"time\";\n      this.data.timeStep = /ss/.test(format) ? 1 : 60;\n      break;\n    }\n  }\n\n  get hasTextContent() {\n    return !!this.appearance && !this._needAppearances;\n  }\n\n  _getCombAppearance(\n    defaultAppearance,\n    font,\n    text,\n    fontSize,\n    width,\n    height,\n    alignment,\n    isRTL,\n    annotationStorage\n  ) {\n    const combWidth = width / this.data.maxLen;\n    // Empty or it has a trailing whitespace.\n    const colors = this.getBorderAndBackgroundAppearances(annotationStorage);\n\n    const cells = font.getCharPositions(text).map(([start, end]) => {\n      const glyph = text.substring(start, end);\n      return { glyph, width: this._getTextWidth(glyph, font) * fontSize };\n    });\n    if (isRTL) {\n      cells.reverse();\n    }\n\n    const textWidth = combWidth * cells.length;\n    let hShift = 0;\n    if (alignment === 1) {\n      hShift += Math.floor((width - textWidth) / (2 * combWidth)) * combWidth;\n    } else if (alignment === 2) {\n      hShift += width - textWidth;\n    }\n\n    const buf = [];\n    let previousWidth = 0;\n    for (let i = 0, ii = cells.length; i < ii; i++) {\n      const { glyph, width: glyphWidth } = cells[i];\n      const shift =\n        i === 0\n          ? (combWidth - glyphWidth) / 2\n          : combWidth + (previousWidth - glyphWidth) / 2;\n      buf.push(`${numberToString(shift)} 0 Td (${escapeString(glyph)}) Tj`);\n      previousWidth = glyphWidth;\n    }\n    const renderedComb = buf.join(\" \");\n\n    // Vertically center the glyphs within the field: comb fields are mostly\n    // filled with uppercase letters and/or digits, hence we use the cap height\n    // (with a fallback on the ascent or the font size) to center them.\n    const vShift =\n      (height - (font.capHeight || font.ascent || 1) * fontSize) / 2;\n\n    return (\n      `/Tx BMC q ${colors}BT ` +\n      defaultAppearance +\n      ` 1 0 0 1 ${numberToString(hShift)} ${numberToString(\n        vShift\n      )} Tm ${renderedComb}` +\n      \" ET Q EMC\"\n    );\n  }\n\n  _getMultilineAppearance(\n    defaultAppearance,\n    lines,\n    font,\n    fontSize,\n    width,\n    height,\n    alignment,\n    hPadding,\n    vPadding,\n    descent,\n    lineHeight,\n    annotationStorage\n  ) {\n    const buf = [];\n    const totalWidth = width - 2 * hPadding;\n    const prevInfo = { shift: 0 };\n    for (let i = 0, ii = lines.length; i < ii; i++) {\n      const line = lines[i];\n      const chunks = this._splitLine(line, font, fontSize, totalWidth);\n      for (let j = 0, jj = chunks.length; j < jj; j++) {\n        const chunk = chunks[j];\n        const vShift =\n          i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight;\n        buf.push(\n          this._renderText(\n            chunk,\n            font,\n            fontSize,\n            width,\n            alignment,\n            prevInfo,\n            hPadding,\n            vShift\n          )\n        );\n      }\n    }\n\n    // Empty or it has a trailing whitespace.\n    const colors = this.getBorderAndBackgroundAppearances(annotationStorage);\n    const renderedText = buf.join(\"\\n\");\n\n    return (\n      `/Tx BMC q ${colors}BT ` +\n      defaultAppearance +\n      ` 1 0 0 1 0 ${numberToString(height)} Tm ${renderedText}` +\n      \" ET Q EMC\"\n    );\n  }\n\n  _splitLine(line, font, fontSize, width, cache = {}) {\n    line = cache.line || line;\n\n    const glyphs = cache.glyphs || font.charsToGlyphs(line);\n\n    if (glyphs.length <= 1) {\n      // Nothing to split\n      return [line];\n    }\n\n    const positions = cache.positions || font.getCharPositions(line);\n    const scale = fontSize / 1000;\n    const chunks = [];\n\n    let lastSpacePosInStringStart = -1,\n      lastSpacePosInStringEnd = -1,\n      lastSpacePos = -1,\n      startChunk = 0,\n      currentWidth = 0;\n\n    for (let i = 0, ii = glyphs.length; i < ii; i++) {\n      const [start, end] = positions[i];\n      const glyph = glyphs[i];\n      const glyphWidth = glyph.width * scale;\n      if (glyph.unicode === \" \") {\n        if (currentWidth + glyphWidth > width) {\n          // We can break here\n          chunks.push(line.substring(startChunk, start));\n          startChunk = start;\n          currentWidth = glyphWidth;\n          lastSpacePosInStringStart = -1;\n          lastSpacePos = -1;\n        } else {\n          currentWidth += glyphWidth;\n          lastSpacePosInStringStart = start;\n          lastSpacePosInStringEnd = end;\n          lastSpacePos = i;\n        }\n      } else if (currentWidth + glyphWidth > width) {\n        // We must break to the last white position (if available)\n        if (lastSpacePosInStringStart !== -1) {\n          chunks.push(line.substring(startChunk, lastSpacePosInStringEnd));\n          startChunk = lastSpacePosInStringEnd;\n          i = lastSpacePos + 1;\n          lastSpacePosInStringStart = -1;\n          currentWidth = 0;\n        } else {\n          // Just break in the middle of the word\n          chunks.push(line.substring(startChunk, start));\n          startChunk = start;\n          currentWidth = glyphWidth;\n        }\n      } else {\n        currentWidth += glyphWidth;\n      }\n    }\n\n    if (startChunk < line.length) {\n      chunks.push(line.substring(startChunk));\n    }\n\n    return chunks;\n  }\n\n  async extractTextContent(evaluator, task, viewBox) {\n    await super.extractTextContent(evaluator, task, viewBox);\n    const text = this.data.textContent;\n    if (!text) {\n      return;\n    }\n\n    // The text extractor doesn't handle empty lines correctly, so if the\n    // content we get is more or less (modulo whitespaces) the same as the\n    // field value we just ignore it.\n    const allText = text.join(\"\\n\");\n    if (allText === this.data.fieldValue) {\n      return;\n    }\n    const regex = allText.replaceAll(/([.*+?^${}()|[\\]\\\\])|(\\s+)/g, (_m, p1) =>\n      p1 ? `\\\\${p1}` : \"\\\\s+\"\n    );\n    if (new RegExp(`^\\\\s*${regex}\\\\s*$`).test(this.data.fieldValue)) {\n      this.data.textContent = this.data.fieldValue.split(\"\\n\");\n    }\n  }\n\n  getFieldObject() {\n    return {\n      id: this.data.id,\n      value: this.data.fieldValue,\n      defaultValue: this.data.defaultFieldValue || \"\",\n      multiline: this.data.multiLine,\n      password: this.data.password,\n      charLimit: this.data.maxLen,\n      comb: this.data.comb,\n      editable: !this.data.readOnly,\n      hidden: this.data.hidden,\n      name: this.data.fieldName,\n      rect: this.data.rect,\n      actions: this.data.actions,\n      page: this.data.pageIndex,\n      strokeColor: this.data.borderColor,\n      fillColor: this.data.backgroundColor,\n      rotation: this.rotation,\n      datetimeFormat: this.data.datetimeFormat,\n      hasDatetimeHTML: !!this.data.datetimeType,\n      type: \"text\",\n    };\n  }\n}\n\nclass ButtonWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n\n    this.checkedAppearance = null;\n    this.uncheckedAppearance = null;\n\n    const isRadio = this.hasFieldFlag(AnnotationFieldFlag.RADIO),\n      isPushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);\n\n    this.data.checkBox = !isRadio && !isPushButton;\n    this.data.radioButton = isRadio && !isPushButton;\n    this.data.pushButton = isPushButton;\n    this.data.isTooltipOnly = false;\n    this.data.hasOwnCanvas = true;\n    this.data.noHTML = false;\n\n    if (this.data.checkBox) {\n      this._processCheckBox(params);\n    } else if (this.data.radioButton) {\n      this._processRadioButton(params);\n    } else if (this.data.pushButton) {\n      this._processPushButton(params);\n    } else {\n      warn(\"Invalid field flags for button widget annotation\");\n    }\n  }\n\n  get _ownCanvasRequiresForms() {\n    return this.data.checkBox || this.data.radioButton;\n  }\n\n  #getOperatorListForAppearance(\n    evaluator,\n    task,\n    intent,\n    annotationStorage,\n    rotation,\n    appearance\n  ) {\n    if (!appearance) {\n      return this._getOperatorListNoAppearance();\n    }\n\n    const savedAppearance = this.appearance;\n    const savedMatrix = lookupMatrix(\n      appearance.dict.getArray(\"Matrix\"),\n      IDENTITY_MATRIX\n    );\n\n    if (rotation) {\n      appearance.dict.set(\"Matrix\", this.getRotationMatrix(annotationStorage));\n    }\n\n    this.appearance = appearance;\n    const operatorList = super.getOperatorList(\n      evaluator,\n      task,\n      intent,\n      annotationStorage\n    );\n    this.appearance = savedAppearance;\n    appearance.dict.set(\"Matrix\", savedMatrix);\n    return operatorList;\n  }\n\n  async getOperatorList(evaluator, task, intent, annotationStorage) {\n    if (this.data.pushButton) {\n      return super.getOperatorList(\n        evaluator,\n        task,\n        intent,\n        false, // we use normalAppearance to render the button\n        annotationStorage\n      );\n    }\n\n    if (\n      intent & RenderingIntentFlag.DISPLAY &&\n      intent & RenderingIntentFlag.ANNOTATIONS_FORMS &&\n      (this.data.checkBox || this.data.radioButton)\n    ) {\n      // Tag the dedicated canvas with the state it represents. The appearance\n      // may start with other operators (e.g. an optional content marked-content\n      // sequence), so target the `beginAnnotation` operator directly rather\n      // than assuming it's the first one.\n      const setCanvasName = (operatorList, name) => {\n        const index = operatorList.fnArray.indexOf(OPS.beginAnnotation);\n        if (index !== -1) {\n          operatorList.argsArray[index].push(name);\n        }\n      };\n      const checked = await this.#getOperatorListForAppearance(\n        evaluator,\n        task,\n        intent,\n        annotationStorage,\n        null,\n        this.checkedAppearance\n      );\n      setCanvasName(checked.opList, \"checked\");\n      const unchecked = await this.#getOperatorListForAppearance(\n        evaluator,\n        task,\n        intent,\n        annotationStorage,\n        null,\n        this.uncheckedAppearance\n      );\n      setCanvasName(unchecked.opList, \"unchecked\");\n      checked.opList.addOpList(unchecked.opList);\n      checked.separateForm ||= unchecked.separateForm;\n      checked.separateCanvas ||= unchecked.separateCanvas;\n      return checked;\n    }\n\n    let value = null;\n    let rotation = null;\n    if (annotationStorage) {\n      const storageEntry = annotationStorage.get(this.data.id);\n      value = storageEntry ? storageEntry.value : null;\n      rotation = storageEntry ? storageEntry.rotation : null;\n    }\n\n    if (value === null && this.appearance) {\n      // Nothing in the annotationStorage.\n      // But we've a default appearance so use it.\n      return super.getOperatorList(evaluator, task, intent, annotationStorage);\n    }\n\n    if (value === null || value === undefined) {\n      // There is no default appearance so use the one derived\n      // from the field value.\n      value = this.data.checkBox\n        ? this.data.fieldValue === this.data.exportValue\n        : this.data.fieldValue === this.data.buttonValue;\n    }\n\n    return this.#getOperatorListForAppearance(\n      evaluator,\n      task,\n      intent,\n      annotationStorage,\n      rotation,\n      value ? this.checkedAppearance : this.uncheckedAppearance\n    );\n  }\n\n  async save(evaluator, task, annotationStorage, changes) {\n    if (this.data.checkBox) {\n      this._saveCheckbox(evaluator, task, annotationStorage, changes);\n      return;\n    }\n\n    if (this.data.radioButton) {\n      this._saveRadioButton(evaluator, task, annotationStorage, changes);\n    }\n  }\n\n  async _saveCheckbox(evaluator, task, annotationStorage, changes) {\n    if (!annotationStorage) {\n      return;\n    }\n    const storageEntry = annotationStorage.get(this.data.id);\n    const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);\n    let rotation = storageEntry?.rotation,\n      value = storageEntry?.value;\n\n    if (rotation === undefined && flags === undefined) {\n      if (value === undefined) {\n        return;\n      }\n\n      const defaultValue = this.data.fieldValue === this.data.exportValue;\n      if (defaultValue === value) {\n        return;\n      }\n    }\n\n    let dict = evaluator.xref.fetchIfRef(this.ref);\n    if (!(dict instanceof Dict)) {\n      return;\n    }\n    dict = dict.clone();\n\n    if (rotation === undefined) {\n      rotation = this.rotation;\n    }\n    if (value === undefined) {\n      value = this.data.fieldValue === this.data.exportValue;\n    }\n\n    const xfa = {\n      path: this.data.fieldName,\n      value: value ? this.data.exportValue : \"\",\n    };\n\n    const name = Name.get(value ? this._onStateName : \"Off\");\n    this.setValue(dict, name, evaluator.xref, changes);\n\n    dict.set(\"AS\", name);\n    dict.set(\"M\", `D:${getModificationDate()}`);\n    if (flags !== undefined) {\n      dict.set(\"F\", flags);\n    }\n\n    const maybeMK = this._getMKDict(rotation);\n    if (maybeMK) {\n      dict.set(\"MK\", maybeMK);\n    }\n\n    changes.put(this.ref, {\n      data: dict,\n      xfa,\n      needAppearances: false,\n    });\n  }\n\n  async _saveRadioButton(evaluator, task, annotationStorage, changes) {\n    if (!annotationStorage) {\n      return;\n    }\n    const storageEntry = annotationStorage.get(this.data.id);\n    const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);\n    let rotation = storageEntry?.rotation,\n      value = storageEntry?.value;\n\n    if (rotation === undefined && flags === undefined) {\n      if (value === undefined) {\n        return;\n      }\n\n      const defaultValue = this.data.fieldValue === this.data.buttonValue;\n      if (defaultValue === value) {\n        return;\n      }\n    }\n\n    let dict = evaluator.xref.fetchIfRef(this.ref);\n    if (!(dict instanceof Dict)) {\n      return;\n    }\n    dict = dict.clone();\n\n    if (value === undefined) {\n      value = this.data.fieldValue === this.data.buttonValue;\n    }\n\n    if (rotation === undefined) {\n      rotation = this.rotation;\n    }\n\n    const xfa = {\n      path: this.data.fieldName,\n      value: value ? this.data.buttonValue : \"\",\n    };\n\n    const name = Name.get(value ? this._onStateName : \"Off\");\n    if (value) {\n      this.setValue(dict, name, evaluator.xref, changes);\n    }\n\n    dict.set(\"AS\", name);\n    dict.set(\"M\", `D:${getModificationDate()}`);\n    if (flags !== undefined) {\n      dict.set(\"F\", flags);\n    }\n\n    const maybeMK = this._getMKDict(rotation);\n    if (maybeMK) {\n      dict.set(\"MK\", maybeMK);\n    }\n\n    changes.put(this.ref, {\n      data: dict,\n      xfa,\n      needAppearances: false,\n    });\n  }\n\n  _getDefaultCheckedAppearance(params, type) {\n    const { width, height } = this;\n    const bbox = [0, 0, width, height];\n\n    // Ratio used to have a mark slightly smaller than the bbox.\n    const FONT_RATIO = 0.8;\n    const fontSize = Math.min(width, height) * FONT_RATIO;\n\n    // Char Metrics\n    // Widths came from widths for ZapfDingbats.\n    // Heights are guessed with Fontforge and FoxitDingbats.pfb.\n    let metrics, char;\n    if (type === \"check\") {\n      // Char 33 (2713 in unicode)\n      metrics = {\n        width: 0.755 * fontSize,\n        height: 0.705 * fontSize,\n      };\n      char = \"\\x33\";\n    } else if (type === \"disc\") {\n      // Char 6C (25CF in unicode)\n      metrics = {\n        width: 0.791 * fontSize,\n        height: 0.705 * fontSize,\n      };\n      char = \"\\x6C\";\n    } else {\n      unreachable(`_getDefaultCheckedAppearance - unsupported type: ${type}`);\n    }\n\n    // Values to center the glyph in the bbox.\n    const xShift = numberToString((width - metrics.width) / 2);\n    const yShift = numberToString((height - metrics.height) / 2);\n\n    const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`;\n\n    const appearanceStreamDict = new Dict(params.xref);\n    appearanceStreamDict.set(\"FormType\", 1);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n    appearanceStreamDict.setIfName(\"Type\", \"XObject\");\n    appearanceStreamDict.set(\"BBox\", bbox);\n    appearanceStreamDict.set(\"Matrix\", [1, 0, 0, 1, 0, 0]);\n    appearanceStreamDict.set(\"Length\", appearance.length);\n\n    const resources = new Dict(params.xref);\n    const font = new Dict(params.xref);\n    font.set(\"PdfJsZaDb\", this.fallbackFontDict);\n    resources.set(\"Font\", font);\n\n    appearanceStreamDict.set(\"Resources\", resources);\n\n    this.checkedAppearance = new StringStream(appearance, appearanceStreamDict);\n\n    this._streams.push(this.checkedAppearance);\n  }\n\n  _getOnStateName(dict) {\n    const appearanceStates = dict.get(\"AP\");\n    if (!(appearanceStates instanceof Dict)) {\n      return null;\n    }\n    const normalAppearance = appearanceStates.get(\"N\");\n    if (!(normalAppearance instanceof Dict)) {\n      return null;\n    }\n    for (const key of normalAppearance.getKeys()) {\n      if (key !== \"Off\") {\n        return key;\n      }\n    }\n    return null;\n  }\n\n  _getExportValueForOptIndex(index, opt, xref) {\n    if (Number.isInteger(index) && index >= 0 && index < opt.length) {\n      const value = this._decodeFormValue(xref.fetchIfRef(opt[index]));\n      if (typeof value === \"string\") {\n        return value;\n      }\n    }\n    return null;\n  }\n\n  _getOptInfo(dict, onState, opt, xref) {\n    if (!Array.isArray(opt)) {\n      return null;\n    }\n    const stateToIndex = new Map();\n    let currentIndex = null;\n\n    const fieldParent = dict.get(\"Parent\");\n    const kids = fieldParent instanceof Dict ? fieldParent.get(\"Kids\") : null;\n    if (Array.isArray(kids)) {\n      for (let i = 0, ii = Math.min(kids.length, opt.length); i < ii; i++) {\n        const kid = kids[i];\n        if (kid instanceof Ref && isRefsEqual(kid, this.ref)) {\n          currentIndex = i;\n        }\n\n        const kidDict = xref.fetchIfRef(kid);\n        if (!(kidDict instanceof Dict)) {\n          continue;\n        }\n        if (kidDict === dict) {\n          currentIndex = i;\n        }\n\n        const kidOnState = this._getOnStateName(kidDict);\n        if (typeof kidOnState === \"string\" && !stateToIndex.has(kidOnState)) {\n          stateToIndex.set(kidOnState, i);\n        }\n      }\n    } else if (opt.length === 1 && typeof onState === \"string\") {\n      // A single widget is sometimes used as its own field dictionary.\n      currentIndex = 0;\n      stateToIndex.set(onState, 0);\n    }\n\n    return { currentIndex, opt, stateToIndex };\n  }\n\n  // The appearance state is a Name; its real export value can be overridden by\n  // the \"Opt\" array, whose entries are ordered like the field's \"Kids\".\n  _getExportValue(state, optInfo, xref) {\n    if (!optInfo || typeof state !== \"string\" || state === \"Off\") {\n      return state;\n    }\n\n    if (state === this._onStateName) {\n      const exportValue = this._getExportValueForOptIndex(\n        optInfo.currentIndex,\n        optInfo.opt,\n        xref\n      );\n      if (exportValue !== null) {\n        return exportValue;\n      }\n    }\n\n    if (optInfo.stateToIndex.has(state)) {\n      const exportValue = this._getExportValueForOptIndex(\n        optInfo.stateToIndex.get(state),\n        optInfo.opt,\n        xref\n      );\n      if (exportValue !== null) {\n        return exportValue;\n      }\n    }\n\n    const index = parseInt(state, 10);\n    if (Number.isInteger(index) && String(index) === state) {\n      return this._getExportValueForOptIndex(index, optInfo.opt, xref) || state;\n    }\n    return state;\n  }\n\n  _processCheckBox(params) {\n    const customAppearance = params.dict.get(\"AP\");\n    let normalAppearance =\n      customAppearance instanceof Dict ? customAppearance.get(\"N\") : null;\n    if (!(normalAppearance instanceof Dict)) {\n      // Synthesize a default appearance below when the field defines none.\n      normalAppearance = null;\n    }\n\n    // See https://bugzilla.mozilla.org/show_bug.cgi?id=1722036.\n    // If we've an AS and a V then take AS.\n    const asValue = this._decodeFormValue(params.dict.get(\"AS\"));\n    if (typeof asValue === \"string\") {\n      this.data.fieldValue = asValue;\n    }\n\n    const yes =\n      this.data.fieldValue !== null && this.data.fieldValue !== \"Off\"\n        ? this.data.fieldValue\n        : \"Yes\";\n\n    // Don't decode the keys which are names.\n    const exportValues = normalAppearance\n      ? [...normalAppearance.getKeys()]\n      : [];\n    if (exportValues.length === 0) {\n      exportValues.push(\"Off\", yes);\n    } else if (exportValues.length === 1) {\n      if (exportValues[0] === \"Off\") {\n        exportValues.push(yes);\n      } else {\n        exportValues.unshift(\"Off\");\n      }\n    } else if (exportValues.includes(yes)) {\n      exportValues.length = 0;\n      exportValues.push(\"Off\", yes);\n    } else {\n      const otherYes = exportValues.find(v => v !== \"Off\");\n      exportValues.length = 0;\n      exportValues.push(\"Off\", otherYes);\n    }\n\n    const onState = exportValues[1];\n    this._onStateName = onState;\n\n    const opt = getInheritableProperty({ dict: params.dict, key: \"Opt\" });\n    const optInfo = this._getOptInfo(params.dict, onState, opt, params.xref);\n    this.data.exportValue = this._getExportValue(onState, optInfo, params.xref);\n\n    // Don't use a \"V\" entry pointing to a non-existent appearance state,\n    // see e.g. bug1720411.pdf where it's an *empty* Name-instance.\n    if (\n      !exportValues.includes(this.data.fieldValue) &&\n      this.data.fieldValue !== this.data.exportValue\n    ) {\n      this.data.fieldValue = \"Off\";\n    }\n    this.data.fieldValue = this._getExportValue(\n      this.data.fieldValue,\n      optInfo,\n      params.xref\n    );\n    this.data.defaultFieldValue = this._getExportValue(\n      this.data.defaultFieldValue,\n      optInfo,\n      params.xref\n    );\n\n    const checkedAppearance = normalAppearance?.get(onState);\n    this.checkedAppearance =\n      checkedAppearance instanceof BaseStream ? checkedAppearance : null;\n    const uncheckedAppearance = normalAppearance?.get(\"Off\");\n    this.uncheckedAppearance =\n      uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null;\n\n    if (this.checkedAppearance) {\n      this._streams.push(this.checkedAppearance);\n    } else {\n      this._getDefaultCheckedAppearance(params, \"check\");\n    }\n    if (this.uncheckedAppearance) {\n      this._streams.push(this.uncheckedAppearance);\n    }\n    this._fallbackFontDict = this.fallbackFontDict;\n    if (this.data.defaultFieldValue === null) {\n      this.data.defaultFieldValue = \"Off\";\n    }\n  }\n\n  _processRadioButton(params) {\n    this.data.buttonValue = null;\n\n    // The parent field's `V` entry holds a `Name` object with the appearance\n    // state of whichever child field is currently in the \"on\" state.\n    const fieldParent = params.dict.get(\"Parent\");\n    if (fieldParent instanceof Dict) {\n      this.parent = params.dict.getRaw(\"Parent\");\n      const fieldParentValue = fieldParent.get(\"V\");\n      if (fieldParentValue instanceof Name) {\n        this.data.fieldValue = this._decodeFormValue(fieldParentValue);\n      }\n    }\n\n    // The button's value corresponds to its appearance state.\n    const appearanceStates = params.dict.get(\"AP\");\n    if (!(appearanceStates instanceof Dict)) {\n      return;\n    }\n    const normalAppearance = appearanceStates.get(\"N\");\n    if (!(normalAppearance instanceof Dict)) {\n      return;\n    }\n    let onState = null;\n    for (const key of normalAppearance.getKeys()) {\n      if (key !== \"Off\") {\n        onState = key;\n        break;\n      }\n    }\n    this._onStateName = onState;\n\n    const opt = getInheritableProperty({ dict: params.dict, key: \"Opt\" });\n    const optInfo = this._getOptInfo(params.dict, onState, opt, params.xref);\n    this.data.buttonValue = this._getExportValue(onState, optInfo, params.xref);\n    this.data.fieldValue = this._getExportValue(\n      this.data.fieldValue,\n      optInfo,\n      params.xref\n    );\n    this.data.defaultFieldValue = this._getExportValue(\n      this.data.defaultFieldValue,\n      optInfo,\n      params.xref\n    );\n\n    const checkedAppearance = normalAppearance.get(onState);\n    this.checkedAppearance =\n      checkedAppearance instanceof BaseStream ? checkedAppearance : null;\n    const uncheckedAppearance = normalAppearance.get(\"Off\");\n    this.uncheckedAppearance =\n      uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null;\n\n    if (this.checkedAppearance) {\n      this._streams.push(this.checkedAppearance);\n    } else {\n      this._getDefaultCheckedAppearance(params, \"disc\");\n    }\n    if (this.uncheckedAppearance) {\n      this._streams.push(this.uncheckedAppearance);\n    }\n    this._fallbackFontDict = this.fallbackFontDict;\n    if (this.data.defaultFieldValue === null) {\n      this.data.defaultFieldValue = \"Off\";\n    }\n  }\n\n  _processPushButton(params) {\n    const { dict, annotationGlobals } = params;\n\n    if (!dict.has(\"A\") && !dict.has(\"AA\") && !this.data.alternativeText) {\n      warn(\"Push buttons without action dictionaries are not supported\");\n      return;\n    }\n\n    this.data.isTooltipOnly = !dict.has(\"A\") && !dict.has(\"AA\");\n\n    Catalog.parseDestDictionary({\n      destDict: dict,\n      resultObj: this.data,\n      docBaseUrl: annotationGlobals.baseUrl,\n      docAttachments: annotationGlobals.attachments,\n    });\n  }\n\n  getFieldObject() {\n    let type = \"button\";\n    let exportValues;\n    if (this.data.checkBox) {\n      type = \"checkbox\";\n      exportValues = this.data.exportValue;\n    } else if (this.data.radioButton) {\n      type = \"radiobutton\";\n      exportValues = this.data.buttonValue;\n    }\n    return {\n      id: this.data.id,\n      value: this.data.fieldValue || \"Off\",\n      defaultValue: this.data.defaultFieldValue,\n      exportValues,\n      editable: !this.data.readOnly,\n      name: this.data.fieldName,\n      rect: this.data.rect,\n      hidden: this.data.hidden,\n      actions: this.data.actions,\n      page: this.data.pageIndex,\n      strokeColor: this.data.borderColor,\n      fillColor: this.data.backgroundColor,\n      rotation: this.rotation,\n      type,\n    };\n  }\n\n  get fallbackFontDict() {\n    const dict = new Dict();\n    dict.setIfName(\"BaseFont\", \"ZapfDingbats\");\n    dict.setIfName(\"Type\", \"FallbackType\");\n    dict.setIfName(\"Subtype\", \"FallbackType\");\n    dict.setIfName(\"Encoding\", \"ZapfDingbatsEncoding\");\n\n    return shadow(this, \"fallbackFontDict\", dict);\n  }\n}\n\nclass ChoiceWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n\n    this.indices = dict.getArray(\"I\");\n    this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0;\n\n    // Determine the options. The options array may consist of strings or\n    // arrays. If the array consists of arrays, then the first element of\n    // each array is the export value and the second element of each array is\n    // the display value. If the array consists of strings, then these\n    // represent both the export and display value. In this case, we convert\n    // it to an array of arrays as well for convenience in the display layer.\n    // Note that the specification does not state that the `Opt` field is\n    // inheritable, but in practice PDF generators do make annotations\n    // inherit the options from a parent annotation (issue 8094).\n    this.data.options = [];\n\n    const options = getInheritableProperty({ dict, key: \"Opt\" });\n    if (Array.isArray(options)) {\n      for (let i = 0, ii = options.length; i < ii; i++) {\n        const option = xref.fetchIfRef(options[i]);\n        const isOptionArray = Array.isArray(option);\n\n        this.data.options[i] = {\n          exportValue: this._decodeFormValue(\n            isOptionArray ? xref.fetchIfRef(option[0]) : option\n          ),\n          displayValue: this._decodeFormValue(\n            isOptionArray ? xref.fetchIfRef(option[1]) : option\n          ),\n        };\n      }\n    }\n\n    if (!this.hasIndices) {\n      // The field value can be `null` if no item is selected, a string if one\n      // item is selected or an array of strings if multiple items are selected.\n      // For consistency in the API and convenience in the display layer, we\n      // always make the field value an array with zero, one or multiple items.\n      if (typeof this.data.fieldValue === \"string\") {\n        this.data.fieldValue = [this.data.fieldValue];\n      } else {\n        this.data.fieldValue ||= [];\n      }\n    } else {\n      // The specs say that we should have an indices array only with\n      // multiselectable Choice and the \"V\" entry should have the\n      // precedence, but Acrobat itself is using it whatever the\n      // the \"V\" entry is (see bug 1770750).\n      this.data.fieldValue = [];\n      const ii = this.data.options.length;\n      for (const i of this.indices) {\n        if (Number.isInteger(i) && i >= 0 && i < ii) {\n          this.data.fieldValue.push(this.data.options[i].exportValue);\n        }\n      }\n    }\n\n    // It's a workaround for the issue #19083.\n    // Normally a choice widget is a mix of a text field and a listbox,\n    // So in the case where the V entry isn't an option we should just set it\n    // as the text field value.\n    if (this.data.options.length === 0 && this.data.fieldValue.length > 0) {\n      // If there are no options, then the field value is the only option.\n      this.data.options = this.data.fieldValue.map(value => ({\n        exportValue: value,\n        displayValue: value,\n      }));\n    }\n\n    // Process field flags for the display layer.\n    this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO);\n    this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT);\n    this._hasText = true;\n  }\n\n  getFieldObject() {\n    const type = this.data.combo ? \"combobox\" : \"listbox\";\n    const value =\n      this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null;\n    return {\n      id: this.data.id,\n      value,\n      defaultValue: this.data.defaultFieldValue,\n      editable: !this.data.readOnly,\n      name: this.data.fieldName,\n      rect: this.data.rect,\n      numItems: this.data.fieldValue.length,\n      multipleSelection: this.data.multiSelect,\n      hidden: this.data.hidden,\n      actions: this.data.actions,\n      items: this.data.options,\n      page: this.data.pageIndex,\n      strokeColor: this.data.borderColor,\n      fillColor: this.data.backgroundColor,\n      rotation: this.rotation,\n      type,\n    };\n  }\n\n  amendSavedDict(annotationStorage, dict) {\n    if (!this.hasIndices) {\n      return;\n    }\n    let values = annotationStorage?.get(this.data.id)?.value;\n    if (!Array.isArray(values)) {\n      values = [values];\n    }\n    const indices = [];\n    const { options } = this.data;\n    for (let i = 0, j = 0, ii = options.length; i < ii; i++) {\n      if (options[i].exportValue === values[j]) {\n        indices.push(i);\n        j += 1;\n      }\n    }\n    dict.set(\"I\", indices);\n  }\n\n  async _getAppearance(evaluator, task, intent, annotationStorage) {\n    if (this.data.combo) {\n      return super._getAppearance(evaluator, task, intent, annotationStorage);\n    }\n\n    let exportedValue, rotation;\n    const storageEntry = annotationStorage?.get(this.data.id);\n    if (storageEntry) {\n      rotation = storageEntry.rotation;\n      exportedValue = storageEntry.value;\n    }\n\n    if (\n      rotation === undefined &&\n      exportedValue === undefined &&\n      !this._needAppearances\n    ) {\n      // The annotation hasn't been rendered so use the appearance\n      return null;\n    }\n\n    if (exportedValue === undefined) {\n      exportedValue = this.data.fieldValue;\n    } else if (!Array.isArray(exportedValue)) {\n      exportedValue = [exportedValue];\n    }\n\n    const defaultPadding = 1;\n    const defaultHPadding = 2;\n    let { width: totalWidth, height: totalHeight } = this;\n\n    if (rotation === 90 || rotation === 270) {\n      [totalWidth, totalHeight] = [totalHeight, totalWidth];\n    }\n\n    const lineCount = this.data.options.length;\n    const valueIndices = [];\n    for (let i = 0; i < lineCount; i++) {\n      const { exportValue } = this.data.options[i];\n      if (exportedValue.includes(exportValue)) {\n        valueIndices.push(i);\n      }\n    }\n\n    if (!this._defaultAppearance) {\n      // The DA is required and must be a string.\n      // If there is no font named Helvetica in the resource dictionary,\n      // the evaluator will fall back to a default font.\n      // Doing so prevents exceptions and allows saving/printing\n      // the file as expected.\n      this.data.defaultAppearanceData = parseDefaultAppearance(\n        (this._defaultAppearance = \"/Helvetica 0 Tf 0 g\")\n      );\n    }\n\n    const font = await WidgetAnnotation._getFontData(\n      evaluator,\n      task,\n      this.data.defaultAppearanceData,\n      this._fieldResources.mergedResources\n    );\n\n    let defaultAppearance;\n    let { fontSize } = this.data.defaultAppearanceData;\n    if (!fontSize) {\n      const lineHeight = (totalHeight - defaultPadding) / lineCount;\n      let lineWidth = -1;\n      let value;\n      for (const { displayValue } of this.data.options) {\n        const width = this._getTextWidth(displayValue, font);\n        if (width > lineWidth) {\n          lineWidth = width;\n          value = displayValue;\n        }\n      }\n\n      [defaultAppearance, fontSize] = this._computeFontSize(\n        lineHeight,\n        totalWidth - 2 * defaultHPadding,\n        value,\n        font,\n        -1\n      );\n    } else {\n      defaultAppearance = this._defaultAppearance;\n    }\n\n    const lineHeight = fontSize * LINE_FACTOR;\n    const vPadding = (lineHeight - fontSize) / 2;\n    const numberOfVisibleLines = Math.floor(totalHeight / lineHeight);\n\n    let firstIndex = 0;\n    if (valueIndices.length > 0) {\n      const minIndex = Math.min(...valueIndices);\n      const maxIndex = Math.max(...valueIndices);\n\n      firstIndex = Math.max(0, maxIndex - numberOfVisibleLines + 1);\n      if (firstIndex > minIndex) {\n        firstIndex = minIndex;\n      }\n    }\n    const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount);\n\n    const buf = [\"/Tx BMC q\", `1 1 ${totalWidth} ${totalHeight} re W n`];\n\n    if (valueIndices.length) {\n      // This value has been copied/pasted from annotation-choice-widget.pdf.\n      // It corresponds to rgb(153, 193, 218).\n      buf.push(\"0.600006 0.756866 0.854904 rg\");\n\n      // Highlight the lines in filling a blue rectangle at the selected\n      // positions.\n      for (const index of valueIndices) {\n        if (firstIndex <= index && index < end) {\n          buf.push(\n            `1 ${\n              totalHeight - (index - firstIndex + 1) * lineHeight\n            } ${totalWidth} ${lineHeight} re f`\n          );\n        }\n      }\n    }\n    buf.push(\"BT\", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`);\n\n    const prevInfo = { shift: 0 };\n    for (let i = firstIndex; i < end; i++) {\n      const { displayValue } = this.data.options[i];\n      const vpadding = i === firstIndex ? vPadding : 0;\n      buf.push(\n        this._renderText(\n          displayValue,\n          font,\n          fontSize,\n          totalWidth,\n          0,\n          prevInfo,\n          defaultHPadding,\n          -lineHeight + vpadding\n        )\n      );\n    }\n\n    buf.push(\"ET Q EMC\");\n\n    return buf.join(\"\\n\");\n  }\n}\n\nclass SignatureWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n\n    // Unset the fieldValue since it's (most likely) a `Dict` which is\n    // non-serializable and will thus cause errors when sending annotations\n    // to the main-thread (issue 10347).\n    this.data.fieldValue = null;\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.noHTML = !this.data.hasOwnCanvas;\n  }\n\n  getFieldObject() {\n    return {\n      id: this.data.id,\n      value: null,\n      page: this.data.pageIndex,\n      type: \"signature\",\n    };\n  }\n}\n\nclass TextAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    const DEFAULT_ICON_SIZE = 22; // px\n\n    super(params);\n\n    // No rotation for Text (see 12.5.6.4).\n    this.data.noRotate = true;\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.noHTML = false;\n\n    const { dict } = params;\n\n    if (this.data.hasAppearance) {\n      this.data.name = \"NoIcon\";\n    } else {\n      this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;\n      this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;\n      this.data.name = dict.has(\"Name\") ? dict.get(\"Name\").name : \"Note\";\n    }\n\n    if (dict.has(\"State\")) {\n      this.data.state = dict.get(\"State\") || null;\n      this.data.stateModel = dict.get(\"StateModel\") || null;\n    } else {\n      this.data.state = null;\n      this.data.stateModel = null;\n    }\n  }\n}\n\nclass LinkAnnotation extends Annotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, annotationGlobals } = params;\n\n    // A link is never rendered on the main canvas so we must render its HTML\n    // version.\n    this.data.noHTML = false;\n\n    const quadPoints = getQuadPoints(dict, this.rectangle);\n    if (quadPoints) {\n      this.data.quadPoints = quadPoints;\n    }\n\n    // The color entry for a link annotation is the color of the border.\n    this.data.borderColor ||= this.data.color;\n\n    Catalog.parseDestDictionary({\n      destDict: dict,\n      resultObj: this.data,\n      docBaseUrl: annotationGlobals.baseUrl,\n      docAttachments: annotationGlobals.attachments,\n    });\n  }\n\n  get overlaysTextContent() {\n    return true;\n  }\n}\n\nclass PopupAnnotation extends Annotation {\n  constructor(params) {\n    super(params);\n\n    const { dict } = params;\n\n    // A pop-up is never rendered on the main canvas so we must render its HTML\n    // version.\n    this.data.noHTML = false;\n\n    if (this.width === 0 || this.height === 0) {\n      this.data.rect = null;\n    }\n\n    let parentItem = dict.get(\"Parent\");\n    if (!parentItem) {\n      warn(\"Popup annotation has a missing or invalid parent annotation.\");\n      return;\n    }\n    this.data.parentRect = lookupNormalRect(parentItem.getArray(\"Rect\"), null);\n    this.data.creationDate = parentItem.get(\"CreationDate\") || \"\";\n\n    const rt = parentItem.get(\"RT\");\n    if (isName(rt, AnnotationReplyType.GROUP)) {\n      // Subordinate annotations in a group should inherit\n      // the group attributes from the primary annotation.\n      parentItem = parentItem.get(\"IRT\");\n    }\n\n    if (!parentItem.has(\"M\")) {\n      this.data.modificationDate = null;\n    } else {\n      this.setModificationDate(parentItem.get(\"M\"));\n      this.data.modificationDate = this.modificationDate;\n    }\n\n    if (!parentItem.has(\"C\")) {\n      // Fall back to the default background color.\n      this.data.color = null;\n    } else {\n      this.setColor(parentItem.getArray(\"C\"));\n      this.data.color = this.color;\n    }\n\n    // If the Popup annotation is not viewable, but the parent annotation is,\n    // that is most likely a bug. Fallback to inherit the flags from the parent\n    // annotation (this is consistent with the behaviour in Adobe Reader).\n    if (!this.viewable) {\n      const parentFlags = parentItem.get(\"F\");\n      if (this._isViewable(parentFlags)) {\n        this.setFlags(parentFlags);\n      }\n    }\n\n    this.setTitle(parentItem.get(\"T\"));\n    this.data.titleObj = this._title;\n\n    this.setContents(parentItem.get(\"Contents\"));\n    this.data.contentsObj = this._contents;\n\n    if (parentItem.has(\"RC\")) {\n      this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get(\"RC\"));\n    }\n\n    this.data.open = !!dict.get(\"Open\");\n  }\n\n  static createNewDict(annotation, xref, _params) {\n    const { oldAnnotation, rect, parent } = annotation;\n    const popup = oldAnnotation || new Dict(xref);\n    popup.setIfNotExists(\"Type\", Name.get(\"Annot\"));\n    popup.setIfNotExists(\"Subtype\", Name.get(\"Popup\"));\n    popup.setIfNotExists(\"Open\", false);\n    popup.setIfArray(\"Rect\", rect);\n    popup.set(\"Parent\", parent);\n\n    return popup;\n  }\n\n  static async createNewAppearanceStream(annotation, xref, params) {\n    return null;\n  }\n}\n\nclass FreeTextAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    // It uses its own canvas in order to be hidden if edited.\n    // But if it has the noHTML flag, it means that we don't want to be able\n    // to modify it so we can just draw it on the main canvas.\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.isEditable = !this.data.noHTML;\n    // We want to be able to add mouse listeners to the annotation.\n    this.data.noHTML = false;\n\n    const { annotationGlobals, xref } = params;\n    this.setDefaultAppearance(params);\n    this._hasAppearance = !!this.appearance;\n\n    if (this._hasAppearance) {\n      const { fontColor, fontSize } = parseAppearanceStream(\n        this.appearance,\n        xref,\n        annotationGlobals.globalColorSpaceCache\n      );\n      this.data.defaultAppearanceData.fontColor = fontColor;\n      this.data.defaultAppearanceData.fontSize = fontSize || 10;\n    } else {\n      this.data.defaultAppearanceData.fontSize ||= 10;\n      const { fontColor, fontSize } = this.data.defaultAppearanceData;\n      if (this._contents.str) {\n        this.data.textContent = this._contents.str\n          .split(/\\r\\n?|\\n/)\n          .map(line => line.trimEnd());\n        const { coords, bbox, matrix } = FakeUnicodeFont.getFirstPositionInfo(\n          this.rectangle,\n          this.rotation,\n          fontSize\n        );\n        this.data.textPosition = this._transformPoint(coords, bbox, matrix);\n      }\n      if (this._isOffscreenCanvasSupported) {\n        const strokeAlpha = params.dict.get(\"CA\");\n        const fakeUnicodeFont = new FakeUnicodeFont(xref, \"sans-serif\");\n        this.appearance = fakeUnicodeFont.createAppearance(\n          this._contents.str,\n          this.rectangle,\n          this.rotation,\n          fontSize,\n          fontColor,\n          strokeAlpha\n        );\n        this._streams.push(this.appearance);\n      } else {\n        warn(\n          \"FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly.\"\n        );\n      }\n    }\n  }\n\n  get hasTextContent() {\n    return this._hasAppearance;\n  }\n\n  static createNewDict(annotation, xref, { apRef, ap }) {\n    const {\n      color,\n      date,\n      fontSize,\n      oldAnnotation,\n      rect,\n      rotation,\n      user,\n      value,\n    } = annotation;\n    const freetext = oldAnnotation || new Dict(xref);\n    freetext.setIfNotExists(\"Type\", Name.get(\"Annot\"));\n    freetext.setIfNotExists(\"Subtype\", Name.get(\"FreeText\"));\n    freetext.set(\n      oldAnnotation ? \"M\" : \"CreationDate\",\n      `D:${getModificationDate(date)}`\n    );\n    if (oldAnnotation) {\n      // TODO: We should try to generate a new RC from the content we've.\n      // For now we can just remove it to avoid any issues.\n      freetext.delete(\"RC\");\n    }\n    freetext.setIfArray(\"Rect\", rect);\n    const da = `/Helv ${fontSize} Tf ${getPdfColor(color, /* isFill */ true)}`;\n    freetext.set(\"DA\", da);\n    freetext.setIfDefined(\"Contents\", stringToAsciiOrUTF16BE(value));\n    freetext.setIfNotExists(\"F\", 4);\n    freetext.setIfNotExists(\"Border\", [0, 0, 0]);\n    freetext.setIfNumber(\"Rotate\", rotation);\n    freetext.setIfDefined(\"T\", stringToAsciiOrUTF16BE(user));\n\n    if (apRef || ap) {\n      const n = new Dict(xref);\n      freetext.set(\"AP\", n);\n      n.set(\"N\", apRef || ap);\n    }\n\n    return freetext;\n  }\n\n  static async createNewAppearanceStream(annotation, xref, params) {\n    const { baseFontRef, evaluator, task } = params;\n    const { color, fontSize, rect, rotation, value } = annotation;\n    if (!color) {\n      return null;\n    }\n\n    const resources = new Dict(xref);\n    const font = new Dict(xref);\n\n    if (baseFontRef) {\n      font.set(\"Helv\", baseFontRef);\n    } else {\n      const baseFont = new Dict(xref);\n      baseFont.setIfName(\"BaseFont\", \"Helvetica\");\n      baseFont.setIfName(\"Type\", \"Font\");\n      baseFont.setIfName(\"Subtype\", \"Type1\");\n      baseFont.setIfName(\"Encoding\", \"WinAnsiEncoding\");\n      font.set(\"Helv\", baseFont);\n    }\n    resources.set(\"Font\", font);\n\n    const helv = await WidgetAnnotation._getFontData(\n      evaluator,\n      task,\n      {\n        fontName: \"Helv\",\n        fontSize,\n      },\n      resources\n    );\n\n    const [x1, y1, x2, y2] = rect;\n    let w = x2 - x1;\n    let h = y2 - y1;\n\n    if (rotation % 180 !== 0) {\n      [w, h] = [h, w];\n    }\n\n    const lines = value.split(\"\\n\");\n    const scale = fontSize / 1000;\n    let totalWidth = -Infinity;\n    const encodedLines = [];\n    for (let line of lines) {\n      const encoded = helv.encodeString(line);\n      if (encoded.length > 1) {\n        // The font doesn't contain all the chars.\n        return null;\n      }\n      line = encoded.join(\"\");\n      encodedLines.push(line);\n      let lineWidth = 0;\n      const glyphs = helv.charsToGlyphs(line);\n      for (const glyph of glyphs) {\n        lineWidth += glyph.width * scale;\n      }\n      totalWidth = Math.max(totalWidth, lineWidth);\n    }\n\n    const hscale = totalWidth > w ? w / totalWidth : 1;\n    let vscale = 1;\n    const lineHeight = LINE_FACTOR * fontSize;\n    const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize;\n    const totalHeight = lineHeight * lines.length;\n    if (totalHeight > h) {\n      vscale = h / totalHeight;\n    }\n    const fscale = Math.min(hscale, vscale);\n    const newFontSize = fontSize * fscale;\n    let firstPoint, clipBox, matrix;\n    switch (rotation) {\n      case 0:\n        matrix = [1, 0, 0, 1];\n        clipBox = [rect[0], rect[1], w, h];\n        firstPoint = [rect[0], rect[3] - lineAscent];\n        break;\n      case 90:\n        matrix = [0, 1, -1, 0];\n        clipBox = [rect[1], -rect[2], w, h];\n        firstPoint = [rect[1], -rect[0] - lineAscent];\n        break;\n      case 180:\n        matrix = [-1, 0, 0, -1];\n        clipBox = [-rect[2], -rect[3], w, h];\n        firstPoint = [-rect[2], -rect[1] - lineAscent];\n        break;\n      case 270:\n        matrix = [0, -1, 1, 0];\n        clipBox = [-rect[3], rect[0], w, h];\n        firstPoint = [-rect[3], rect[2] - lineAscent];\n        break;\n    }\n\n    const buffer = [\n      \"q\",\n      `${matrix.join(\" \")} 0 0 cm`,\n      `${clipBox.join(\" \")} re W n`,\n      `BT`,\n      `${getPdfColor(color, /* isFill */ true)}`,\n      `0 Tc /Helv ${numberToString(newFontSize)} Tf`,\n    ];\n\n    buffer.push(\n      `${firstPoint.join(\" \")} Td (${escapeString(encodedLines[0])}) Tj`\n    );\n    const vShift = numberToString(lineHeight);\n    for (let i = 1, ii = encodedLines.length; i < ii; i++) {\n      const line = encodedLines[i];\n      buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`);\n    }\n    buffer.push(\"ET\", \"Q\");\n    const appearance = buffer.join(\"\\n\");\n\n    const appearanceStreamDict = new Dict(xref);\n    appearanceStreamDict.set(\"FormType\", 1);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n    appearanceStreamDict.setIfName(\"Type\", \"XObject\");\n    appearanceStreamDict.set(\"BBox\", rect);\n    appearanceStreamDict.set(\"Resources\", resources);\n    appearanceStreamDict.set(\"Matrix\", [1, 0, 0, 1, -rect[0], -rect[1]]);\n\n    return new StringStream(appearance, appearanceStreamDict);\n  }\n}\n\nclass LineAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.noHTML = false;\n\n    const lineCoordinates = lookupRect(dict.getArray(\"L\"), [0, 0, 0, 0]);\n    this.data.lineCoordinates = Util.normalizeRect(lineCoordinates);\n\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      this.setLineEndings(dict.getArray(\"LE\"));\n      this.data.lineEndings = this.lineEndings;\n    }\n\n    if (!this.appearance) {\n      // The default stroke color is black.\n      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);\n      const strokeAlpha = dict.get(\"CA\");\n\n      const interiorColor = getRgbColor(dict.getArray(\"IC\"), null);\n      // The default fill color is transparent. Setting the fill colour is\n      // necessary if/when we want to add support for non-default line endings.\n      const fillColor = getPdfColorArray(interiorColor);\n      const fillAlpha = fillColor ? strokeAlpha : null;\n\n      const borderWidth = this.borderStyle.width || 1,\n        borderAdjust = 2 * borderWidth;\n\n      // If the /Rect-entry is empty/wrong, create a fallback rectangle so that\n      // we get similar rendering/highlighting behaviour as in Adobe Reader.\n      const bbox = [\n        this.data.lineCoordinates[0] - borderAdjust,\n        this.data.lineCoordinates[1] - borderAdjust,\n        this.data.lineCoordinates[2] + borderAdjust,\n        this.data.lineCoordinates[3] + borderAdjust,\n      ];\n      if (!Util.intersect(this.rectangle, bbox)) {\n        this.rectangle = bbox;\n      }\n\n      this._setDefaultAppearance({\n        xref,\n        extra: `${borderWidth} w`,\n        strokeColor,\n        fillColor,\n        strokeAlpha,\n        fillAlpha,\n        pointsCallback: (buffer, points) => {\n          buffer.push(\n            `${lineCoordinates[0]} ${lineCoordinates[1]} m`,\n            `${lineCoordinates[2]} ${lineCoordinates[3]} l`,\n            \"S\"\n          );\n          return [\n            points[0] - borderWidth,\n            points[7] - borderWidth,\n            points[2] + borderWidth,\n            points[3] + borderWidth,\n          ];\n        },\n      });\n    }\n  }\n}\n\nclass SquareAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.noHTML = false;\n\n    if (!this.appearance) {\n      // The default stroke color is black.\n      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);\n      const strokeAlpha = dict.get(\"CA\");\n\n      const interiorColor = getRgbColor(dict.getArray(\"IC\"), null);\n      // The default fill color is transparent.\n      const fillColor = getPdfColorArray(interiorColor);\n      const fillAlpha = fillColor ? strokeAlpha : null;\n\n      if (this.borderStyle.width === 0 && !fillColor) {\n        // Prevent rendering a \"hairline\" border (fixes issue14164.pdf).\n        return;\n      }\n\n      this._setDefaultAppearance({\n        xref,\n        extra: `${this.borderStyle.width} w`,\n        strokeColor,\n        fillColor,\n        strokeAlpha,\n        fillAlpha,\n        pointsCallback: (buffer, points) => {\n          const x = points[4] + this.borderStyle.width / 2;\n          const y = points[5] + this.borderStyle.width / 2;\n          const width = points[6] - points[4] - this.borderStyle.width;\n          const height = points[3] - points[7] - this.borderStyle.width;\n          buffer.push(`${x} ${y} ${width} ${height} re`);\n          if (fillColor) {\n            buffer.push(\"B\");\n          } else {\n            buffer.push(\"S\");\n          }\n          return [points[0], points[7], points[2], points[3]];\n        },\n      });\n    }\n  }\n}\n\nclass CircleAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n\n    if (!this.appearance) {\n      // The default stroke color is black.\n      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);\n      const strokeAlpha = dict.get(\"CA\");\n\n      const interiorColor = getRgbColor(dict.getArray(\"IC\"), null);\n      // The default fill color is transparent.\n      const fillColor = getPdfColorArray(interiorColor);\n      const fillAlpha = fillColor ? strokeAlpha : null;\n\n      if (this.borderStyle.width === 0 && !fillColor) {\n        // Prevent rendering a \"hairline\" border (fixes issue14164.pdf).\n        return;\n      }\n\n      // Circles are approximated by B茅zier curves with four segments since\n      // there is no circle primitive in the PDF specification. For the control\n      // points distance, see https://stackoverflow.com/a/27863181.\n      const controlPointsDistance = (4 / 3) * Math.tan(Math.PI / (2 * 4));\n\n      this._setDefaultAppearance({\n        xref,\n        extra: `${this.borderStyle.width} w`,\n        strokeColor,\n        fillColor,\n        strokeAlpha,\n        fillAlpha,\n        pointsCallback: (buffer, points) => {\n          const x0 = points[0] + this.borderStyle.width / 2;\n          const y0 = points[1] - this.borderStyle.width / 2;\n          const x1 = points[6] - this.borderStyle.width / 2;\n          const y1 = points[7] + this.borderStyle.width / 2;\n          const xMid = x0 + (x1 - x0) / 2;\n          const yMid = y0 + (y1 - y0) / 2;\n          const xOffset = ((x1 - x0) / 2) * controlPointsDistance;\n          const yOffset = ((y1 - y0) / 2) * controlPointsDistance;\n\n          buffer.push(\n            `${xMid} ${y1} m`,\n            `${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`,\n            `${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`,\n            `${xMid - xOffset} ${y0} ${x0} ${yMid - yOffset} ${x0} ${yMid} c`,\n            `${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`,\n            \"h\"\n          );\n          if (fillColor) {\n            buffer.push(\"B\");\n          } else {\n            buffer.push(\"S\");\n          }\n          return [points[0], points[7], points[2], points[3]];\n        },\n      });\n    }\n  }\n}\n\nclass PolylineAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.noHTML = false;\n    this.data.vertices = null;\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n      !(this instanceof PolygonAnnotation)\n    ) {\n      // Only meaningful for polyline annotations.\n      this.setLineEndings(dict.getArray(\"LE\"));\n      this.data.lineEndings = this.lineEndings;\n    }\n\n    // The vertices array is an array of numbers representing the alternating\n    // horizontal and vertical coordinates, respectively, of each vertex.\n    // Convert this to an array of objects with x and y coordinates.\n    const rawVertices = dict.getArray(\"Vertices\");\n    if (!isNumberArray(rawVertices, null)) {\n      return;\n    }\n    const vertices = (this.data.vertices = Float32Array.from(rawVertices));\n\n    if (!this.appearance) {\n      // The default stroke color is black.\n      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);\n      const strokeAlpha = dict.get(\"CA\");\n\n      let fillColor = getRgbColor(dict.getArray(\"IC\"), null);\n      if (fillColor) {\n        fillColor = getPdfColorArray(fillColor);\n      }\n\n      let operator;\n      if (fillColor) {\n        if (this.color) {\n          operator = fillColor.every((c, i) => c === strokeColor[i])\n            ? \"f\"\n            : \"B\";\n        } else {\n          operator = \"f\";\n        }\n      } else {\n        operator = \"S\";\n      }\n\n      const borderWidth = this.borderStyle.width || 1,\n        borderAdjust = 2 * borderWidth;\n\n      // If the /Rect-entry is empty/wrong, create a fallback rectangle so that\n      // we get similar rendering/highlighting behaviour as in Adobe Reader.\n      const bbox = BBOX_INIT.slice();\n      for (let i = 0, ii = vertices.length; i < ii; i += 2) {\n        Util.rectBoundingBox(\n          vertices[i] - borderAdjust,\n          vertices[i + 1] - borderAdjust,\n          vertices[i] + borderAdjust,\n          vertices[i + 1] + borderAdjust,\n          bbox\n        );\n      }\n      if (!Util.intersect(this.rectangle, bbox)) {\n        this.rectangle = bbox;\n      }\n\n      this._setDefaultAppearance({\n        xref,\n        extra: `${borderWidth} w`,\n        strokeColor,\n        strokeAlpha,\n        fillColor,\n        fillAlpha: fillColor ? strokeAlpha : null,\n        pointsCallback: (buffer, points) => {\n          for (let i = 0, ii = vertices.length; i < ii; i += 2) {\n            buffer.push(\n              `${vertices[i]} ${vertices[i + 1]} ${i === 0 ? \"m\" : \"l\"}`\n            );\n          }\n          buffer.push(operator);\n          return [points[0], points[7], points[2], points[3]];\n        },\n      });\n    }\n  }\n}\n\n// Polygons are specific forms of polylines, so reuse their logic.\nclass PolygonAnnotation extends PolylineAnnotation {}\n\nclass CaretAnnotation extends MarkupAnnotation {}\n\nclass InkAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.noHTML = false;\n\n    const { dict, xref } = params;\n    this.data.inkLists = [];\n    this.data.isEditable = !this.data.noHTML;\n    // We want to be able to add mouse listeners to the annotation.\n    this.data.noHTML = false;\n    this.data.opacity = dict.get(\"CA\") || 1;\n\n    const rawInkLists = dict.getArray(\"InkList\");\n    if (!Array.isArray(rawInkLists)) {\n      return;\n    }\n    for (let i = 0, ii = rawInkLists.length; i < ii; ++i) {\n      // The raw ink lists array contains arrays of numbers representing\n      // the alternating horizontal and vertical coordinates, respectively,\n      // of each vertex. Convert this to an array of objects with x and y\n      // coordinates.\n      if (!Array.isArray(rawInkLists[i])) {\n        continue;\n      }\n      const inkList = new Float32Array(rawInkLists[i].length);\n      this.data.inkLists.push(inkList);\n      for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) {\n        const x = xref.fetchIfRef(rawInkLists[i][j]),\n          y = xref.fetchIfRef(rawInkLists[i][j + 1]);\n        if (typeof x === \"number\" && typeof y === \"number\") {\n          inkList[j] = x;\n          inkList[j + 1] = y;\n        }\n      }\n    }\n\n    if (!this.appearance) {\n      // The default stroke color is black.\n      const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);\n      const strokeAlpha = dict.get(\"CA\");\n\n      const borderWidth = this.borderStyle.width || 1,\n        borderAdjust = 2 * borderWidth;\n\n      // If the /Rect-entry is empty/wrong, create a fallback rectangle so that\n      // we get similar rendering/highlighting behaviour as in Adobe Reader.\n      const bbox = BBOX_INIT.slice();\n      for (const inkList of this.data.inkLists) {\n        for (let i = 0, ii = inkList.length; i < ii; i += 2) {\n          Util.rectBoundingBox(\n            inkList[i] - borderAdjust,\n            inkList[i + 1] - borderAdjust,\n            inkList[i] + borderAdjust,\n            inkList[i + 1] + borderAdjust,\n            bbox\n          );\n        }\n      }\n      if (!Util.intersect(this.rectangle, bbox)) {\n        this.rectangle = bbox;\n      }\n\n      this._setDefaultAppearance({\n        xref,\n        extra: `${borderWidth} w`,\n        strokeColor,\n        strokeAlpha,\n        pointsCallback: (buffer, points) => {\n          // According to the specification, see \"12.5.6.13 Ink Annotations\":\n          //   When drawn, the points shall be connected by straight lines or\n          //   curves in an implementation-dependent way.\n          // In order to simplify things, we utilize straight lines for now.\n          for (const inkList of this.data.inkLists) {\n            for (let i = 0, ii = inkList.length; i < ii; i += 2) {\n              buffer.push(\n                `${inkList[i]} ${inkList[i + 1]} ${i === 0 ? \"m\" : \"l\"}`\n              );\n            }\n            buffer.push(\"S\");\n          }\n          return [points[0], points[7], points[2], points[3]];\n        },\n      });\n    }\n  }\n\n  static createNewDict(annotation, xref, { apRef, ap }) {\n    const {\n      oldAnnotation,\n      color,\n      date,\n      opacity,\n      paths,\n      outlines,\n      rect,\n      rotation,\n      thickness,\n      user,\n    } = annotation;\n    const ink = oldAnnotation || new Dict(xref);\n    ink.setIfNotExists(\"Type\", Name.get(\"Annot\"));\n    ink.setIfNotExists(\"Subtype\", Name.get(\"Ink\"));\n    ink.set(\n      oldAnnotation ? \"M\" : \"CreationDate\",\n      `D:${getModificationDate(date)}`\n    );\n    ink.setIfArray(\"Rect\", rect);\n    ink.setIfArray(\"InkList\", outlines?.points || paths?.points);\n    ink.setIfNotExists(\"F\", 4);\n    ink.setIfNumber(\"Rotate\", rotation);\n    ink.setIfDefined(\"T\", stringToAsciiOrUTF16BE(user));\n\n    if (outlines) {\n      // Free highlight.\n      // There's nothing about this in the spec, but it's used when highlighting\n      // in Edge's viewer. Acrobat takes into account this parameter to indicate\n      // that the Ink is used for highlighting.\n      ink.setIfName(\"IT\", \"InkHighlight\");\n    }\n\n    // Line thickness.\n    if (thickness > 0) {\n      const bs = new Dict(xref);\n      ink.set(\"BS\", bs);\n      bs.set(\"W\", thickness);\n    }\n\n    // Color.\n    ink.setIfArray(\"C\", getPdfColorArray(color));\n\n    // Opacity.\n    ink.setIfNumber(\"CA\", opacity);\n\n    if (ap || apRef) {\n      const n = new Dict(xref);\n      ink.set(\"AP\", n);\n      n.set(\"N\", apRef || ap);\n    }\n\n    return ink;\n  }\n\n  static async createNewAppearanceStream(annotation, xref, params) {\n    if (annotation.outlines) {\n      return this.createNewAppearanceStreamForHighlight(\n        annotation,\n        xref,\n        params\n      );\n    }\n    const { color, rect, paths, thickness, opacity } = annotation;\n    if (!color) {\n      return null;\n    }\n\n    const appearanceBuffer = [\n      `${thickness} w 1 J 1 j`,\n      `${getPdfColor(color, /* isFill */ false)}`,\n    ];\n\n    if (opacity !== 1) {\n      appearanceBuffer.push(\"/R0 gs\");\n    }\n\n    for (const outline of paths.lines) {\n      appearanceBuffer.push(\n        `${numberToString(outline[4])} ${numberToString(outline[5])} m`\n      );\n      for (let i = 6, ii = outline.length; i < ii; i += 6) {\n        if (isNaN(outline[i])) {\n          appearanceBuffer.push(\n            `${numberToString(outline[i + 4])} ${numberToString(\n              outline[i + 5]\n            )} l`\n          );\n        } else {\n          const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6);\n          appearanceBuffer.push(\n            [c1x, c1y, c2x, c2y, x, y].map(numberToString).join(\" \") + \" c\"\n          );\n        }\n      }\n      if (outline.length === 6) {\n        appearanceBuffer.push(\n          `${numberToString(outline[4])} ${numberToString(outline[5])} l`\n        );\n      }\n    }\n    appearanceBuffer.push(\"S\");\n\n    const appearance = appearanceBuffer.join(\"\\n\");\n\n    const appearanceStreamDict = new Dict(xref);\n    appearanceStreamDict.set(\"FormType\", 1);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n    appearanceStreamDict.setIfName(\"Type\", \"XObject\");\n    appearanceStreamDict.set(\"BBox\", rect);\n    appearanceStreamDict.set(\"Length\", appearance.length);\n\n    if (opacity !== 1) {\n      const resources = new Dict(xref);\n      const extGState = new Dict(xref);\n      const r0 = new Dict(xref);\n      r0.set(\"CA\", opacity);\n      r0.setIfName(\"Type\", \"ExtGState\");\n      extGState.set(\"R0\", r0);\n      resources.set(\"ExtGState\", extGState);\n      appearanceStreamDict.set(\"Resources\", resources);\n    }\n\n    return new StringStream(appearance, appearanceStreamDict);\n  }\n\n  static async createNewAppearanceStreamForHighlight(annotation, xref, params) {\n    const {\n      color,\n      rect,\n      outlines: { outline },\n      opacity,\n    } = annotation;\n    if (!color) {\n      return null;\n    }\n    const appearanceBuffer = [\n      `${getPdfColor(color, /* isFill */ true)}`,\n      \"/R0 gs\",\n    ];\n\n    appearanceBuffer.push(\n      `${numberToString(outline[4])} ${numberToString(outline[5])} m`\n    );\n    for (let i = 6, ii = outline.length; i < ii; i += 6) {\n      if (isNaN(outline[i])) {\n        appearanceBuffer.push(\n          `${numberToString(outline[i + 4])} ${numberToString(\n            outline[i + 5]\n          )} l`\n        );\n      } else {\n        const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6);\n        appearanceBuffer.push(\n          [c1x, c1y, c2x, c2y, x, y].map(numberToString).join(\" \") + \" c\"\n        );\n      }\n    }\n    appearanceBuffer.push(\"h f\");\n    const appearance = appearanceBuffer.join(\"\\n\");\n\n    const appearanceStreamDict = new Dict(xref);\n    appearanceStreamDict.set(\"FormType\", 1);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n    appearanceStreamDict.setIfName(\"Type\", \"XObject\");\n    appearanceStreamDict.set(\"BBox\", rect);\n    appearanceStreamDict.set(\"Length\", appearance.length);\n\n    const resources = new Dict(xref);\n    const extGState = new Dict(xref);\n    resources.set(\"ExtGState\", extGState);\n    appearanceStreamDict.set(\"Resources\", resources);\n    const r0 = new Dict(xref);\n    extGState.set(\"R0\", r0);\n    r0.setIfName(\"BM\", \"Multiply\");\n\n    if (opacity !== 1) {\n      r0.set(\"ca\", opacity);\n      r0.setIfName(\"Type\", \"ExtGState\");\n    }\n\n    return new StringStream(appearance, appearanceStreamDict);\n  }\n}\n\nclass HighlightAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n    this.data.isEditable = !this.data.noHTML;\n    // We want to be able to add mouse listeners to the annotation.\n    this.data.noHTML = false;\n    this.data.opacity = dict.get(\"CA\") || 1;\n\n    const quadPoints = (this.data.quadPoints = getQuadPoints(dict, null));\n    if (quadPoints) {\n      if (!this.appearance) {\n        // Default color is yellow in Acrobat Reader\n        const fillColor = getPdfColorArray(this.color, [1, 1, 0]);\n        const fillAlpha = dict.get(\"CA\");\n\n        this._setDefaultAppearance({\n          xref,\n          fillColor,\n          blendMode: \"Multiply\",\n          fillAlpha,\n          pointsCallback: (buffer, points) => {\n            buffer.push(\n              `${points[0]} ${points[1]} m`,\n              `${points[2]} ${points[3]} l`,\n              `${points[6]} ${points[7]} l`,\n              `${points[4]} ${points[5]} l`,\n              \"f\"\n            );\n            return [points[0], points[7], points[2], points[3]];\n          },\n        });\n      }\n    } else {\n      this.data.popupRef = null;\n    }\n  }\n\n  get overlaysTextContent() {\n    return true;\n  }\n\n  static createNewDict(annotation, xref, { apRef, ap }) {\n    const {\n      color,\n      date,\n      oldAnnotation,\n      opacity,\n      rect,\n      rotation,\n      user,\n      quadPoints,\n    } = annotation;\n    const highlight = oldAnnotation || new Dict(xref);\n    highlight.setIfNotExists(\"Type\", Name.get(\"Annot\"));\n    highlight.setIfNotExists(\"Subtype\", Name.get(\"Highlight\"));\n    highlight.set(\n      oldAnnotation ? \"M\" : \"CreationDate\",\n      `D:${getModificationDate(date)}`\n    );\n    highlight.setIfArray(\"Rect\", rect);\n    highlight.setIfNotExists(\"F\", 4);\n    highlight.setIfNotExists(\"Border\", [0, 0, 0]);\n    highlight.setIfNumber(\"Rotate\", rotation);\n    highlight.setIfArray(\"QuadPoints\", quadPoints);\n    highlight.setIfArray(\"C\", getPdfColorArray(color));\n    highlight.setIfNumber(\"CA\", opacity);\n    highlight.setIfDefined(\"T\", stringToAsciiOrUTF16BE(user));\n\n    if (apRef || ap) {\n      const n = new Dict(xref);\n      highlight.set(\"AP\", n);\n      n.set(\"N\", apRef || ap);\n    }\n\n    return highlight;\n  }\n\n  static async createNewAppearanceStream(annotation, xref, params) {\n    const { color, rect, outlines, opacity } = annotation;\n    if (!color) {\n      return null;\n    }\n\n    const appearanceBuffer = [\n      `${getPdfColor(color, /* isFill */ true)}`,\n      \"/R0 gs\",\n    ];\n\n    const buffer = [];\n    for (const outline of outlines) {\n      buffer.length = 0;\n      buffer.push(\n        `${numberToString(outline[0])} ${numberToString(outline[1])} m`\n      );\n      for (let i = 2, ii = outline.length; i < ii; i += 2) {\n        buffer.push(\n          `${numberToString(outline[i])} ${numberToString(outline[i + 1])} l`\n        );\n      }\n      buffer.push(\"h\");\n      appearanceBuffer.push(buffer.join(\"\\n\"));\n    }\n    appearanceBuffer.push(\"f*\");\n    const appearance = appearanceBuffer.join(\"\\n\");\n\n    const appearanceStreamDict = new Dict(xref);\n    appearanceStreamDict.set(\"FormType\", 1);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n    appearanceStreamDict.setIfName(\"Type\", \"XObject\");\n    appearanceStreamDict.set(\"BBox\", rect);\n    appearanceStreamDict.set(\"Length\", appearance.length);\n\n    const resources = new Dict(xref);\n    const extGState = new Dict(xref);\n    resources.set(\"ExtGState\", extGState);\n    appearanceStreamDict.set(\"Resources\", resources);\n    const r0 = new Dict(xref);\n    extGState.set(\"R0\", r0);\n    r0.setIfName(\"BM\", \"Multiply\");\n\n    if (opacity !== 1) {\n      r0.set(\"ca\", opacity);\n      r0.setIfName(\"Type\", \"ExtGState\");\n    }\n\n    return new StringStream(appearance, appearanceStreamDict);\n  }\n}\n\nclass UnderlineAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n\n    const quadPoints = (this.data.quadPoints = getQuadPoints(dict, null));\n    if (quadPoints) {\n      if (!this.appearance) {\n        // Default color is black\n        const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);\n        const strokeAlpha = dict.get(\"CA\");\n\n        // The values 0.571 and 1.3 below corresponds to what Acrobat is doing.\n        this._setDefaultAppearance({\n          xref,\n          extra: \"[] 0 d 0.571 w\",\n          strokeColor,\n          strokeAlpha,\n          pointsCallback: (buffer, points) => {\n            buffer.push(\n              `${points[4]} ${points[5] + 1.3} m`,\n              `${points[6]} ${points[7] + 1.3} l`,\n              \"S\"\n            );\n            return [points[0], points[7], points[2], points[3]];\n          },\n        });\n      }\n    } else {\n      this.data.popupRef = null;\n    }\n  }\n\n  get overlaysTextContent() {\n    return true;\n  }\n}\n\nclass SquigglyAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n\n    const quadPoints = (this.data.quadPoints = getQuadPoints(dict, null));\n    if (quadPoints) {\n      if (!this.appearance) {\n        // Default color is black\n        const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);\n        const strokeAlpha = dict.get(\"CA\");\n\n        this._setDefaultAppearance({\n          xref,\n          extra: \"[] 0 d 1 w\",\n          strokeColor,\n          strokeAlpha,\n          pointsCallback: (buffer, points) => {\n            const dy = (points[1] - points[5]) / 6;\n            let shift = dy;\n            let x = points[4];\n            const y = points[5];\n            const xEnd = points[6];\n            buffer.push(`${x} ${y + shift} m`);\n            do {\n              x += 2;\n              shift = shift === 0 ? dy : 0;\n              buffer.push(`${x} ${y + shift} l`);\n            } while (x < xEnd);\n            buffer.push(\"S\");\n            return [points[4], y - 2 * dy, xEnd, y + 2 * dy];\n          },\n        });\n      }\n    } else {\n      this.data.popupRef = null;\n    }\n  }\n\n  get overlaysTextContent() {\n    return true;\n  }\n}\n\nclass StrikeOutAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref } = params;\n\n    const quadPoints = (this.data.quadPoints = getQuadPoints(dict, null));\n    if (quadPoints) {\n      if (!this.appearance) {\n        // Default color is black\n        const strokeColor = getPdfColorArray(this.color, [0, 0, 0]);\n        const strokeAlpha = dict.get(\"CA\");\n\n        this._setDefaultAppearance({\n          xref,\n          extra: \"[] 0 d 1 w\",\n          strokeColor,\n          strokeAlpha,\n          pointsCallback: (buffer, points) => {\n            buffer.push(\n              `${(points[0] + points[4]) / 2} ` +\n                `${(points[1] + points[5]) / 2} m`,\n              `${(points[2] + points[6]) / 2} ` +\n                `${(points[3] + points[7]) / 2} l`,\n              \"S\"\n            );\n            return [points[0], points[7], points[2], points[3]];\n          },\n        });\n      }\n    } else {\n      this.data.popupRef = null;\n    }\n  }\n\n  get overlaysTextContent() {\n    return true;\n  }\n}\n\nclass StampAnnotation extends MarkupAnnotation {\n  #savedHasOwnCanvas = null;\n\n  constructor(params) {\n    super(params);\n\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.isEditable = !this.data.noHTML;\n    // We want to be able to add mouse listeners to the annotation.\n    this.data.noHTML = false;\n  }\n\n  mustBeViewedWhenEditing(isEditing, modifiedIds = null) {\n    if (isEditing) {\n      if (!this.data.isEditable) {\n        return true;\n      }\n      // When we're editing, we want to ensure that the stamp annotation is\n      // drawn on a canvas in order to use it in the annotation editor layer.\n      this.#savedHasOwnCanvas ??= this.data.hasOwnCanvas;\n      this.data.hasOwnCanvas = true;\n      return true;\n    }\n    if (this.#savedHasOwnCanvas !== null) {\n      this.data.hasOwnCanvas = this.#savedHasOwnCanvas;\n      this.#savedHasOwnCanvas = null;\n    }\n\n    return !modifiedIds?.has(this.data.id);\n  }\n\n  static createNewDict(annotation, xref, { apRef, ap }) {\n    const { date, oldAnnotation, rect, rotation, user } = annotation;\n    const stamp = oldAnnotation || new Dict(xref);\n    stamp.setIfNotExists(\"Type\", Name.get(\"Annot\"));\n    stamp.setIfNotExists(\"Subtype\", Name.get(\"Stamp\"));\n    stamp.set(\n      oldAnnotation ? \"M\" : \"CreationDate\",\n      `D:${getModificationDate(date)}`\n    );\n    stamp.setIfArray(\"Rect\", rect);\n    stamp.setIfNotExists(\"F\", 4);\n    stamp.setIfNotExists(\"Border\", [0, 0, 0]);\n    stamp.setIfNumber(\"Rotate\", rotation);\n    stamp.setIfDefined(\"T\", stringToAsciiOrUTF16BE(user));\n\n    if (apRef || ap) {\n      const n = new Dict(xref);\n      stamp.set(\"AP\", n);\n      n.set(\"N\", apRef || ap);\n    }\n\n    return stamp;\n  }\n\n  static async #createNewAppearanceStreamForDrawing(annotation, xref) {\n    const { areContours, color, rect, lines, thickness } = annotation;\n    if (!color) {\n      return null;\n    }\n\n    const appearanceBuffer = [\n      `${thickness} w 1 J 1 j`,\n      `${getPdfColor(color, /* isFill */ areContours)}`,\n    ];\n\n    for (const line of lines) {\n      appearanceBuffer.push(\n        `${numberToString(line[4])} ${numberToString(line[5])} m`\n      );\n      for (let i = 6, ii = line.length; i < ii; i += 6) {\n        if (isNaN(line[i])) {\n          appearanceBuffer.push(\n            `${numberToString(line[i + 4])} ${numberToString(line[i + 5])} l`\n          );\n        } else {\n          const [c1x, c1y, c2x, c2y, x, y] = line.slice(i, i + 6);\n          appearanceBuffer.push(\n            [c1x, c1y, c2x, c2y, x, y].map(numberToString).join(\" \") + \" c\"\n          );\n        }\n      }\n      if (line.length === 6) {\n        appearanceBuffer.push(\n          `${numberToString(line[4])} ${numberToString(line[5])} l`\n        );\n      }\n    }\n    appearanceBuffer.push(areContours ? \"F\" : \"S\");\n\n    const appearance = appearanceBuffer.join(\"\\n\");\n\n    const appearanceStreamDict = new Dict(xref);\n    appearanceStreamDict.set(\"FormType\", 1);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n    appearanceStreamDict.setIfName(\"Type\", \"XObject\");\n    appearanceStreamDict.set(\"BBox\", rect);\n    appearanceStreamDict.set(\"Length\", appearance.length);\n\n    return new StringStream(appearance, appearanceStreamDict);\n  }\n\n  static async createNewAppearanceStream(annotation, xref, params) {\n    if (annotation.oldAnnotation) {\n      // We'll use the AP we already have.\n      return null;\n    }\n    if (annotation.isSignature) {\n      return this.#createNewAppearanceStreamForDrawing(annotation, xref);\n    }\n\n    const { rotation } = annotation;\n    const { imageRef, width, height } = params.image;\n    const resources = new Dict(xref);\n    const xobject = new Dict(xref);\n    resources.set(\"XObject\", xobject);\n    xobject.set(\"Im0\", imageRef);\n    const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`;\n\n    const appearanceStreamDict = new Dict(xref);\n    appearanceStreamDict.set(\"FormType\", 1);\n    appearanceStreamDict.setIfName(\"Subtype\", \"Form\");\n    appearanceStreamDict.setIfName(\"Type\", \"XObject\");\n    appearanceStreamDict.set(\"BBox\", [0, 0, width, height]);\n    appearanceStreamDict.set(\"Resources\", resources);\n\n    if (rotation) {\n      const matrix = getRotationMatrix(rotation, width, height);\n      appearanceStreamDict.set(\"Matrix\", matrix);\n    }\n\n    return new StringStream(appearance, appearanceStreamDict);\n  }\n}\n\nclass FileAttachmentAnnotation extends MarkupAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { annotationGlobals, dict } = params;\n    const fsDict = dict.get(\"FS\");\n\n    this.data.hasOwnCanvas = this.data.noRotate;\n    this.data.noHTML = false;\n    this.data.fileId = this._getAttachmentId(\n      fsDict,\n      dict.getRaw(\"FS\"),\n      annotationGlobals\n    );\n    this.data.file = new FileSpec(fsDict).serializable;\n\n    const name = dict.get(\"Name\");\n    this.data.name =\n      name instanceof Name ? stringToPDFString(name.name) : \"PushPin\";\n\n    const fillAlpha = dict.get(\"ca\");\n    this.data.fillAlpha =\n      typeof fillAlpha === \"number\" && fillAlpha >= 0 && fillAlpha <= 1\n        ? fillAlpha\n        : null;\n  }\n}\n\n/**\n * Shared base for annotations that play an embedded audio/video clip:\n * `RichMedia` (via `RichMediaContent`) and `Screen` (via a rendition action).\n * Both resolve a single embedded media file and expose it identically through\n * `data.richMedia`, so the display layer can render them with one element.\n */\nclass MediaAnnotation extends Annotation {\n  // The MIME types we can build a `<video>`/`<audio>` element for.\n  static #MEDIA_MIME_TYPE_RE = /^(?:video|audio)\\//;\n\n  constructor(params) {\n    super(params);\n\n    // No HTML element until a playable asset is found below by the subclass.\n    this.data.noHTML = true;\n  }\n\n  /**\n   * Expose a resolved embedded media asset as `data.richMedia`.\n   *\n   * @param {Object} asset\n   * @param {Ref | null} asset.assetRef\n   *   Reference to the file-spec dictionary (or, for an inline file-spec, the\n   *   embedded-file stream); used to lazily fetch the bytes on the main thread.\n   * @param {Dict} asset.assetDict\n   *   The file-spec (or stream) dictionary, used to locate the embedded file\n   *   when `assetRef` isn't itself a reference.\n   * @param {string} asset.filename\n   * @param {string} asset.contentType\n   * @param {Object} annotationGlobals\n   */\n  _setMediaData(\n    { assetRef, assetDict, filename, contentType },\n    annotationGlobals\n  ) {\n    this.data.noHTML = false;\n    this.data.richMedia = {\n      fileId: this._getAttachmentId(assetDict, assetRef, annotationGlobals),\n      filename,\n      contentType,\n    };\n  }\n\n  /**\n   * Determine the MIME type used to build the `<video>`/`<audio>` element.\n   *\n   * When the media dictionary provides an explicit type (e.g. a MediaClip\n   * `/CT`), it's honored if it names an audio/video type. Otherwise, per the\n   * spec (ISO 32000-2, 7.11.4) an embedded file stream declares its MIME type\n   * through its own `/Subtype`, with characters not allowed in a name\n   * hex-escaped (e.g. `/video#2Fmp4` -> `video/mp4`). We trust that when it\n   * names an audio/video type, and otherwise fall back to mapping the filename\n   * extension. Returns `null` when the asset isn't a recognized audio/video\n   * type (e.g. Flash `.swf` or 3D models), so we don't build a player that\n   * can't play anything.\n   *\n   * @param {Dict} assetDict\n   * @param {string} filename\n   * @param {string | null} [contentType]\n   * @returns {string | null}\n   */\n  static _getContentType(assetDict, filename, contentType = null) {\n    if (\n      typeof contentType === \"string\" &&\n      MediaAnnotation.#MEDIA_MIME_TYPE_RE.test(contentType)\n    ) {\n      return contentType;\n    }\n\n    // The embedded file stream is keyed like a file-spec platform item.\n    const stream = FileSpec.pickPlatformItem(assetDict.get(\"EF\"));\n    const subtype =\n      stream instanceof BaseStream ? stream.dict?.get(\"Subtype\") : null;\n    if (\n      subtype instanceof Name &&\n      MediaAnnotation.#MEDIA_MIME_TYPE_RE.test(subtype.name)\n    ) {\n      return subtype.name;\n    }\n\n    const ext = filename.split(\".\").at(-1)?.toLowerCase();\n    switch (ext) {\n      case \"mp4\":\n      case \"m4v\":\n        return \"video/mp4\";\n      case \"webm\":\n        return \"video/webm\";\n      case \"ogv\":\n        return \"video/ogg\";\n      case \"mov\":\n        return \"video/quicktime\";\n      case \"mp3\":\n        return \"audio/mpeg\";\n      case \"m4a\":\n        return \"audio/mp4\";\n      case \"wav\":\n        return \"audio/wav\";\n      case \"oga\":\n      case \"ogg\":\n        return \"audio/ogg\";\n      default:\n        return null;\n    }\n  }\n}\n\nclass RichMediaAnnotation extends MediaAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref, annotationGlobals } = params;\n\n    const content = dict.get(\"RichMediaContent\");\n    if (!(content instanceof Dict)) {\n      return;\n    }\n\n    const asset = RichMediaAnnotation.#findAsset(content, xref);\n    if (!asset) {\n      warn(\"RichMedia annotation has no playable asset.\");\n      return;\n    }\n    this._setMediaData(asset, annotationGlobals);\n  }\n\n  /**\n   * Locate the primary playable embedded media asset.\n   *\n   * Per the spec (ISO 32000-2, 13.7), the asset to play is selected through\n   * `Configurations -> Instances -> Asset`. We pick the first instance with a\n   * natively playable asset rather than honoring the default configuration\n   * indicated by `RichMediaSettings`/activation; this keeps selection simple\n   * and matches the common single-configuration case. The `/Assets` name tree\n   * merely enumerates every embedded file; we don't use it as a fallback, since\n   * Acrobat itself won't play media that's only reachable that way. Flash\n   * instances are skipped, since they can't be played natively.\n   *\n   * @returns {{\n   *   assetRef: Ref | null,\n   *   assetDict: Dict,\n   *   filename: string,\n   *   contentType: string,\n   * } | null}\n   */\n  static #findAsset(content, xref) {\n    const configurations = content.get(\"Configurations\");\n    if (!Array.isArray(configurations)) {\n      return null;\n    }\n    for (const configRef of configurations) {\n      const config = xref.fetchIfRef(configRef);\n      if (!(config instanceof Dict)) {\n        continue;\n      }\n      const instances = config.get(\"Instances\");\n      if (!Array.isArray(instances)) {\n        continue;\n      }\n      for (const instanceRef of instances) {\n        const instance = xref.fetchIfRef(instanceRef);\n        if (!(instance instanceof Dict)) {\n          continue;\n        }\n        // Skip Flash instances: it's obsolete.\n        if (isName(instance.get(\"Subtype\"), \"Flash\")) {\n          // Flash has been supported (see PDF 1.7 Extension Level 3).\n          continue;\n        }\n        const rawAsset = instance.getRaw(\"Asset\");\n        const asset = xref.fetchIfRef(rawAsset);\n        if (!(asset instanceof Dict)) {\n          continue;\n        }\n        // Skip assets that only reference an external file we can't read.\n        if (!FileSpec.hasEmbeddedFile(asset)) {\n          continue;\n        }\n        const { filename } = new FileSpec(asset).serializable;\n        const contentType = MediaAnnotation._getContentType(asset, filename);\n        if (!contentType) {\n          continue;\n        }\n        return {\n          assetRef: rawAsset instanceof Ref ? rawAsset : null,\n          assetDict: asset,\n          filename,\n          contentType,\n        };\n      }\n    }\n\n    return null;\n  }\n}\n\nclass ScreenAnnotation extends MediaAnnotation {\n  constructor(params) {\n    super(params);\n\n    const { dict, xref, annotationGlobals } = params;\n    const asset = ScreenAnnotation.#findAsset(dict, xref);\n    if (!asset) {\n      // Not every Screen annotation plays embedded media (e.g. a URL stream or\n      // a /Movie); such ones simply render their appearance, so don't warn.\n      return;\n    }\n    this._setMediaData(asset, annotationGlobals);\n  }\n\n  /**\n   * Locate the embedded media played by the annotation's rendition action.\n   *\n   * Per the spec (ISO 32000-1, 12.6.4.13 and 13.2) the chain is:\n   *   Screen `/A` (or `/AA`) rendition action -> `/R` rendition (`/MR`)\n   *   -> `/C` media clip (`/MCD`) -> `/D` file-spec -> `/EF` embedded file.\n   * Selector renditions (`/SR`) are unwrapped to their first playable media\n   * rendition. This mirrors `RichMediaAnnotation`, which also targets the\n   * common single embedded-media case.\n   *\n   * @returns {{\n   *   assetRef: Ref | null,\n   *   assetDict: Dict,\n   *   filename: string,\n   *   contentType: string,\n   * } | null}\n   */\n  static #findAsset(dict, xref) {\n    for (const action of this.#renditionActions(dict)) {\n      const asset = this.#findRenditionAsset(\n        action.get(\"R\"),\n        xref,\n        new RefSet()\n      );\n      if (asset) {\n        return asset;\n      }\n    }\n    return null;\n  }\n\n  static *#renditionActions(dict) {\n    // The rendition action may be the activation action (/A) or one of the\n    // additional actions (/AA), e.g. page-open.\n    const action = dict.get(\"A\");\n    if (\n      action instanceof Dict &&\n      isName(action.get(\"S\"), \"Rendition\") &&\n      this.#isPlayAction(action)\n    ) {\n      yield action;\n    }\n    const additionalActions = dict.get(\"AA\");\n    if (additionalActions instanceof Dict) {\n      for (const [, aa] of additionalActions) {\n        if (\n          aa instanceof Dict &&\n          isName(aa.get(\"S\"), \"Rendition\") &&\n          this.#isPlayAction(aa)\n        ) {\n          yield aa;\n        }\n      }\n    }\n  }\n\n  static #isPlayAction(action) {\n    // Rendition action /OP (ISO 32000-1, Table 214): PLAY_OR_RESUME and PLAY\n    // play; STOP/PAUSE/RESUME don't start playback. When absent, the action is\n    // JS-driven (/JS), which we can't run, so assume play.\n    const operation = action.get(\"OP\");\n    return (\n      operation === undefined ||\n      operation === AnnotationRenditionOperation.PLAY_OR_RESUME ||\n      operation === AnnotationRenditionOperation.PLAY\n    );\n  }\n\n  static #findRenditionAsset(rendition, xref, seen) {\n    if (!(rendition instanceof Dict)) {\n      return null;\n    }\n    const subtype = rendition.get(\"S\");\n    if (isName(subtype, \"MR\")) {\n      return this.#findClipAsset(rendition.get(\"C\"), xref);\n    }\n    if (isName(subtype, \"SR\")) {\n      // A selector rendition lists candidate renditions; play the first that\n      // resolves to embedded media.\n      const renditions = rendition.get(\"R\");\n      if (Array.isArray(renditions)) {\n        for (const ref of renditions) {\n          // Guard against renditions referencing each other in a cycle.\n          if (ref instanceof Ref) {\n            if (seen.has(ref)) {\n              continue;\n            }\n            seen.put(ref);\n          }\n          const asset = this.#findRenditionAsset(\n            xref.fetchIfRef(ref),\n            xref,\n            seen\n          );\n          if (asset) {\n            return asset;\n          }\n        }\n      }\n    }\n    return null;\n  }\n\n  static #findClipAsset(clip, xref) {\n    if (!(clip instanceof Dict) || !isName(clip.get(\"S\"), \"MCD\")) {\n      return null;\n    }\n    const rawData = clip.getRaw(\"D\");\n    const data = xref.fetchIfRef(rawData);\n    const contentTypeHint = clip.get(\"CT\");\n    let explicitType =\n      typeof contentTypeHint === \"string\" ? contentTypeHint : null;\n\n    let assetDict, filename;\n    if (data instanceof BaseStream) {\n      // `/D` is the embedded media stream directly.\n      assetDict = data.dict;\n      // `/N` is a human-readable label, not a filename, so it's an unreliable\n      // source for a file extension. When `/CT` is absent, prefer the stream's\n      // own `/Subtype` if it declares a media MIME type (as embedded-file\n      // streams do); `_getContentType` ignores a non-media value.\n      const name = clip.get(\"N\");\n      filename = typeof name === \"string\" ? stringToPDFString(name) : \"\";\n      if (!explicitType) {\n        const subtype = data.dict.get(\"Subtype\");\n        if (subtype instanceof Name) {\n          explicitType = subtype.name;\n        }\n      }\n    } else if (data instanceof Dict) {\n      // `/D` is a file specification; require a readable embedded file.\n      if (!FileSpec.hasEmbeddedFile(data)) {\n        return null;\n      }\n      assetDict = data;\n      ({ filename } = new FileSpec(data).serializable);\n    } else {\n      return null;\n    }\n\n    const contentType = MediaAnnotation._getContentType(\n      assetDict,\n      filename,\n      explicitType\n    );\n    if (!contentType) {\n      return null;\n    }\n    return {\n      assetRef: rawData instanceof Ref ? rawData : null,\n      assetDict,\n      filename,\n      contentType,\n    };\n  }\n}\n\nexport {\n  Annotation,\n  AnnotationBorderStyle,\n  AnnotationFactory,\n  getQuadPoints,\n  MarkupAnnotation,\n  PopupAnnotation,\n  WidgetAnnotation,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { shadow } from \"../shared/util.js\";\n\nconst PARAMS = {\n  get r() {\n    return shadow(\n      this,\n      \"r\",\n      new Uint8Array([\n        7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14,\n        20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16,\n        23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10,\n        15, 21, 6, 10, 15, 21,\n      ])\n    );\n  },\n\n  get k() {\n    return shadow(\n      this,\n      \"k\",\n      new Int32Array([\n        -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,\n        -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,\n        1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,\n        643717713, -373897302, -701558691, 38016083, -660478335, -405537848,\n        568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,\n        1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,\n        -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,\n        -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,\n        -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,\n        -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,\n        -145523070, -1120210379, 718787259, -343485551,\n      ])\n    );\n  },\n};\n\nfunction calculateMD5(data, offset, length) {\n  let h0 = 1732584193,\n    h1 = -271733879,\n    h2 = -1732584194,\n    h3 = 271733878;\n  // pre-processing\n  const paddedLength = (length + 72) & ~63; // data + 9 extra bytes\n  const padded = new Uint8Array(paddedLength);\n  let i, j;\n  for (i = 0; i < length; ++i) {\n    padded[i] = data[offset++];\n  }\n  padded[i++] = 0x80;\n  const n = paddedLength - 8;\n  if (i < n) {\n    i = n;\n  }\n  padded[i++] = (length << 3) & 0xff;\n  padded[i++] = (length >> 5) & 0xff;\n  padded[i++] = (length >> 13) & 0xff;\n  padded[i++] = (length >> 21) & 0xff;\n  padded[i++] = (length >>> 29) & 0xff;\n  i += 3;\n  const w = new Int32Array(16);\n  const { k, r } = PARAMS;\n  for (i = 0; i < paddedLength; ) {\n    for (j = 0; j < 16; ++j, i += 4) {\n      w[j] =\n        padded[i] |\n        (padded[i + 1] << 8) |\n        (padded[i + 2] << 16) |\n        (padded[i + 3] << 24);\n    }\n    let a = h0,\n      b = h1,\n      c = h2,\n      d = h3,\n      f,\n      g;\n    for (j = 0; j < 64; ++j) {\n      if (j < 16) {\n        f = (b & c) | (~b & d);\n        g = j;\n      } else if (j < 32) {\n        f = (d & b) | (~d & c);\n        g = (5 * j + 1) & 15;\n      } else if (j < 48) {\n        f = b ^ c ^ d;\n        g = (3 * j + 5) & 15;\n      } else {\n        f = c ^ (b | ~d);\n        g = (7 * j) & 15;\n      }\n      const tmp = d,\n        rotateArg = (a + f + k[j] + w[g]) | 0,\n        rotate = r[j];\n      d = c;\n      c = b;\n      b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;\n      a = tmp;\n    }\n    h0 = (h0 + a) | 0;\n    h1 = (h1 + b) | 0;\n    h2 = (h2 + c) | 0;\n    h3 = (h3 + d) | 0;\n  }\n  // prettier-ignore\n  return new Uint8Array([\n    h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,\n    h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,\n    h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,\n    h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF\n  ]);\n}\n\nexport { calculateMD5 };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringToUTF8String, warn } from \"../shared/util.js\";\nimport { parseXFAPath } from \"./core_utils.js\";\nimport { SimpleXMLParser } from \"./xml_parser.js\";\n\nfunction decodeString(str) {\n  try {\n    return stringToUTF8String(str);\n  } catch (ex) {\n    warn(`UTF-8 decoding failed: \"${ex}\".`);\n    return str;\n  }\n}\n\nclass DatasetXMLParser extends SimpleXMLParser {\n  node = null;\n\n  onEndElement(name) {\n    const node = super.onEndElement(name);\n    if (node && name === \"xfa:datasets\") {\n      this.node = node;\n\n      // We don't need anything else, so just kill the parser.\n      throw new Error(\"Aborting DatasetXMLParser.\");\n    }\n  }\n}\n\nclass DatasetReader {\n  constructor(data) {\n    if (data.datasets) {\n      this.node = new SimpleXMLParser({ hasAttributes: true }).parseFromString(\n        data.datasets\n      ).documentElement;\n    } else {\n      const parser = new DatasetXMLParser({ hasAttributes: true });\n      try {\n        parser.parseFromString(data[\"xdp:xdp\"]);\n      } catch {}\n      this.node = parser.node;\n    }\n  }\n\n  getValue(path) {\n    if (!this.node || !path) {\n      return \"\";\n    }\n    const node = this.node.searchNode(parseXFAPath(path), 0);\n\n    if (!node) {\n      return \"\";\n    }\n\n    const first = node.firstChild;\n    if (first?.nodeName === \"value\") {\n      return node.children.map(child => decodeString(child.textContent));\n    }\n\n    return decodeString(node.textContent);\n  }\n}\n\nexport { DatasetReader };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass SingleIntersector {\n  #annotation;\n\n  minX = Infinity;\n\n  minY = Infinity;\n\n  maxX = -Infinity;\n\n  maxY = -Infinity;\n\n  #quadPoints = null;\n\n  #text = [];\n\n  #extraChars = [];\n\n  #lastIntersectingQuadIndex = -1;\n\n  #canTakeExtraChars = false;\n\n  constructor(annotation) {\n    this.#annotation = annotation;\n    const quadPoints = annotation.data.quadPoints;\n    if (!quadPoints) {\n      // If there are no quad points, we use the rectangle to determine the\n      // bounds of the annotation.\n      [this.minX, this.minY, this.maxX, this.maxY] = annotation.data.rect;\n      return;\n    }\n\n    for (let i = 0, ii = quadPoints.length; i < ii; i += 8) {\n      this.minX = Math.min(this.minX, quadPoints[i]);\n      this.maxX = Math.max(this.maxX, quadPoints[i + 2]);\n      this.minY = Math.min(this.minY, quadPoints[i + 5]);\n      this.maxY = Math.max(this.maxY, quadPoints[i + 1]);\n    }\n    if (quadPoints.length > 8) {\n      this.#quadPoints = quadPoints;\n    }\n  }\n\n  /**\n   * Check if the given point intersects with the annotation's quad points.\n   * The point (x, y) is supposed to be the center of the glyph.\n   * @param {number} x\n   * @param {number} y\n   * @returns {boolean}\n   */\n  #intersects(x, y) {\n    if (this.minX >= x || this.maxX <= x || this.minY >= y || this.maxY <= y) {\n      return false;\n    }\n\n    const quadPoints = this.#quadPoints;\n    if (!quadPoints) {\n      // We've only one quad, so if we intersect min/max bounds then we\n      // intersect the quad.\n      return true;\n    }\n\n    if (this.#lastIntersectingQuadIndex >= 0) {\n      const i = this.#lastIntersectingQuadIndex;\n      if (\n        !(\n          quadPoints[i] >= x ||\n          quadPoints[i + 2] <= x ||\n          quadPoints[i + 5] >= y ||\n          quadPoints[i + 1] <= y\n        )\n      ) {\n        return true;\n      }\n      this.#lastIntersectingQuadIndex = -1;\n    }\n\n    for (let i = 0, ii = quadPoints.length; i < ii; i += 8) {\n      if (\n        !(\n          quadPoints[i] >= x ||\n          quadPoints[i + 2] <= x ||\n          quadPoints[i + 5] >= y ||\n          quadPoints[i + 1] <= y\n        )\n      ) {\n        this.#lastIntersectingQuadIndex = i;\n        return true;\n      }\n    }\n    return false;\n  }\n\n  addGlyph(x, y, glyph) {\n    if (!this.#intersects(x, y)) {\n      this.disableExtraChars();\n      return false;\n    }\n\n    if (this.#extraChars.length > 0) {\n      this.#text.push(this.#extraChars.join(\"\"));\n      this.#extraChars.length = 0;\n    }\n    this.#text.push(glyph);\n    this.#canTakeExtraChars = true;\n\n    return true;\n  }\n\n  addExtraChar(char) {\n    if (this.#canTakeExtraChars) {\n      this.#extraChars.push(char);\n    }\n  }\n\n  disableExtraChars() {\n    if (!this.#canTakeExtraChars) {\n      return;\n    }\n    this.#canTakeExtraChars = false;\n    this.#extraChars.length = 0;\n  }\n\n  setText() {\n    this.#annotation.data.overlaidText = this.#text.join(\"\");\n  }\n}\n\n// The grid is STEPS x STEPS.\nconst STEPS = 64;\n\nclass Intersector {\n  #intersectors = [];\n\n  #grid = [];\n\n  #minX;\n\n  #maxX;\n\n  #minY;\n\n  #maxY;\n\n  #invXRatio;\n\n  #invYRatio;\n\n  constructor(annotations) {\n    let minX = Infinity;\n    let minY = Infinity;\n    let maxX = -Infinity;\n    let maxY = -Infinity;\n    const intersectors = this.#intersectors;\n    for (const annotation of annotations) {\n      if (!annotation.data.quadPoints && !annotation.data.rect) {\n        continue;\n      }\n      const intersector = new SingleIntersector(annotation);\n      intersectors.push(intersector);\n      minX = Math.min(minX, intersector.minX);\n      minY = Math.min(minY, intersector.minY);\n      maxX = Math.max(maxX, intersector.maxX);\n      maxY = Math.max(maxY, intersector.maxY);\n    }\n    this.#minX = minX;\n    this.#minY = minY;\n    this.#maxX = maxX;\n    this.#maxY = maxY;\n    this.#invXRatio = (STEPS - 1) / (maxX - minX);\n    this.#invYRatio = (STEPS - 1) / (maxY - minY);\n    for (const intersector of intersectors) {\n      // TODO: instead of using the intersector bounds, we could iterate over\n      // the grid cells that the quad points intersect.\n      const iMin = this.#getGridIndex(intersector.minX, intersector.minY);\n      const iMax = this.#getGridIndex(intersector.maxX, intersector.maxY);\n      const w = (iMax - iMin) % STEPS;\n      const h = Math.floor((iMax - iMin) / STEPS);\n      for (let i = iMin; i <= iMin + h * STEPS; i += STEPS) {\n        for (let j = 0; j <= w; j++) {\n          (this.#grid[i + j] ??= []).push(intersector);\n        }\n      }\n    }\n  }\n\n  #getGridIndex(x, y) {\n    const i = Math.floor((x - this.#minX) * this.#invXRatio);\n    const j = Math.floor((y - this.#minY) * this.#invYRatio);\n    return i + j * STEPS;\n  }\n\n  addGlyph(transform, width, height, glyph) {\n    const x = transform[4] + width / 2;\n    const y = transform[5] + height / 2;\n    if (x < this.#minX || y < this.#minY || x > this.#maxX || y > this.#maxY) {\n      return;\n    }\n    const intersectors = this.#grid[this.#getGridIndex(x, y)];\n    if (!intersectors) {\n      return;\n    }\n\n    for (const intersector of intersectors) {\n      intersector.addGlyph(x, y, glyph);\n    }\n  }\n\n  addExtraChar(char) {\n    for (const intersector of this.#intersectors) {\n      intersector.addExtraChar(char);\n    }\n  }\n\n  setText() {\n    for (const intersector of this.#intersectors) {\n      intersector.setText();\n    }\n  }\n}\n\nexport { Intersector };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { shadow } from \"../shared/util.js\";\n\nclass Word64 {\n  constructor(highInteger, lowInteger) {\n    this.high = highInteger | 0;\n    this.low = lowInteger | 0;\n  }\n\n  and(word) {\n    this.high &= word.high;\n    this.low &= word.low;\n  }\n\n  xor(word) {\n    this.high ^= word.high;\n    this.low ^= word.low;\n  }\n\n  shiftRight(places) {\n    if (places >= 32) {\n      this.low = (this.high >>> (places - 32)) | 0;\n      this.high = 0;\n    } else {\n      this.low = (this.low >>> places) | (this.high << (32 - places));\n      this.high = (this.high >>> places) | 0;\n    }\n  }\n\n  rotateRight(places) {\n    let low, high;\n    if (places & 32) {\n      high = this.low;\n      low = this.high;\n    } else {\n      low = this.low;\n      high = this.high;\n    }\n    places &= 31;\n    this.low = (low >>> places) | (high << (32 - places));\n    this.high = (high >>> places) | (low << (32 - places));\n  }\n\n  not() {\n    this.high = ~this.high;\n    this.low = ~this.low;\n  }\n\n  add(word) {\n    const lowAdd = (this.low >>> 0) + (word.low >>> 0);\n    let highAdd = (this.high >>> 0) + (word.high >>> 0);\n    if (lowAdd > 0xffffffff) {\n      highAdd += 1;\n    }\n    this.low = lowAdd | 0;\n    this.high = highAdd | 0;\n  }\n\n  copyTo(bytes, offset) {\n    bytes[offset] = (this.high >>> 24) & 0xff;\n    bytes[offset + 1] = (this.high >> 16) & 0xff;\n    bytes[offset + 2] = (this.high >> 8) & 0xff;\n    bytes[offset + 3] = this.high & 0xff;\n    bytes[offset + 4] = (this.low >>> 24) & 0xff;\n    bytes[offset + 5] = (this.low >> 16) & 0xff;\n    bytes[offset + 6] = (this.low >> 8) & 0xff;\n    bytes[offset + 7] = this.low & 0xff;\n  }\n\n  assign(word) {\n    this.high = word.high;\n    this.low = word.low;\n  }\n}\n\nconst PARAMS = {\n  get k() {\n    return shadow(this, \"k\", [\n      new Word64(0x428a2f98, 0xd728ae22),\n      new Word64(0x71374491, 0x23ef65cd),\n      new Word64(0xb5c0fbcf, 0xec4d3b2f),\n      new Word64(0xe9b5dba5, 0x8189dbbc),\n      new Word64(0x3956c25b, 0xf348b538),\n      new Word64(0x59f111f1, 0xb605d019),\n      new Word64(0x923f82a4, 0xaf194f9b),\n      new Word64(0xab1c5ed5, 0xda6d8118),\n      new Word64(0xd807aa98, 0xa3030242),\n      new Word64(0x12835b01, 0x45706fbe),\n      new Word64(0x243185be, 0x4ee4b28c),\n      new Word64(0x550c7dc3, 0xd5ffb4e2),\n      new Word64(0x72be5d74, 0xf27b896f),\n      new Word64(0x80deb1fe, 0x3b1696b1),\n      new Word64(0x9bdc06a7, 0x25c71235),\n      new Word64(0xc19bf174, 0xcf692694),\n      new Word64(0xe49b69c1, 0x9ef14ad2),\n      new Word64(0xefbe4786, 0x384f25e3),\n      new Word64(0x0fc19dc6, 0x8b8cd5b5),\n      new Word64(0x240ca1cc, 0x77ac9c65),\n      new Word64(0x2de92c6f, 0x592b0275),\n      new Word64(0x4a7484aa, 0x6ea6e483),\n      new Word64(0x5cb0a9dc, 0xbd41fbd4),\n      new Word64(0x76f988da, 0x831153b5),\n      new Word64(0x983e5152, 0xee66dfab),\n      new Word64(0xa831c66d, 0x2db43210),\n      new Word64(0xb00327c8, 0x98fb213f),\n      new Word64(0xbf597fc7, 0xbeef0ee4),\n      new Word64(0xc6e00bf3, 0x3da88fc2),\n      new Word64(0xd5a79147, 0x930aa725),\n      new Word64(0x06ca6351, 0xe003826f),\n      new Word64(0x14292967, 0x0a0e6e70),\n      new Word64(0x27b70a85, 0x46d22ffc),\n      new Word64(0x2e1b2138, 0x5c26c926),\n      new Word64(0x4d2c6dfc, 0x5ac42aed),\n      new Word64(0x53380d13, 0x9d95b3df),\n      new Word64(0x650a7354, 0x8baf63de),\n      new Word64(0x766a0abb, 0x3c77b2a8),\n      new Word64(0x81c2c92e, 0x47edaee6),\n      new Word64(0x92722c85, 0x1482353b),\n      new Word64(0xa2bfe8a1, 0x4cf10364),\n      new Word64(0xa81a664b, 0xbc423001),\n      new Word64(0xc24b8b70, 0xd0f89791),\n      new Word64(0xc76c51a3, 0x0654be30),\n      new Word64(0xd192e819, 0xd6ef5218),\n      new Word64(0xd6990624, 0x5565a910),\n      new Word64(0xf40e3585, 0x5771202a),\n      new Word64(0x106aa070, 0x32bbd1b8),\n      new Word64(0x19a4c116, 0xb8d2d0c8),\n      new Word64(0x1e376c08, 0x5141ab53),\n      new Word64(0x2748774c, 0xdf8eeb99),\n      new Word64(0x34b0bcb5, 0xe19b48a8),\n      new Word64(0x391c0cb3, 0xc5c95a63),\n      new Word64(0x4ed8aa4a, 0xe3418acb),\n      new Word64(0x5b9cca4f, 0x7763e373),\n      new Word64(0x682e6ff3, 0xd6b2b8a3),\n      new Word64(0x748f82ee, 0x5defb2fc),\n      new Word64(0x78a5636f, 0x43172f60),\n      new Word64(0x84c87814, 0xa1f0ab72),\n      new Word64(0x8cc70208, 0x1a6439ec),\n      new Word64(0x90befffa, 0x23631e28),\n      new Word64(0xa4506ceb, 0xde82bde9),\n      new Word64(0xbef9a3f7, 0xb2c67915),\n      new Word64(0xc67178f2, 0xe372532b),\n      new Word64(0xca273ece, 0xea26619c),\n      new Word64(0xd186b8c7, 0x21c0c207),\n      new Word64(0xeada7dd6, 0xcde0eb1e),\n      new Word64(0xf57d4f7f, 0xee6ed178),\n      new Word64(0x06f067aa, 0x72176fba),\n      new Word64(0x0a637dc5, 0xa2c898a6),\n      new Word64(0x113f9804, 0xbef90dae),\n      new Word64(0x1b710b35, 0x131c471b),\n      new Word64(0x28db77f5, 0x23047d84),\n      new Word64(0x32caab7b, 0x40c72493),\n      new Word64(0x3c9ebe0a, 0x15c9bebc),\n      new Word64(0x431d67c4, 0x9c100d4c),\n      new Word64(0x4cc5d4be, 0xcb3e42b6),\n      new Word64(0x597f299c, 0xfc657e2a),\n      new Word64(0x5fcb6fab, 0x3ad6faec),\n      new Word64(0x6c44198c, 0x4a475817),\n    ]);\n  },\n};\n\nfunction ch(result, x, y, z, tmp) {\n  result.assign(x);\n  result.and(y);\n  tmp.assign(x);\n  tmp.not();\n  tmp.and(z);\n  result.xor(tmp);\n}\n\nfunction maj(result, x, y, z, tmp) {\n  result.assign(x);\n  result.and(y);\n  tmp.assign(x);\n  tmp.and(z);\n  result.xor(tmp);\n  tmp.assign(y);\n  tmp.and(z);\n  result.xor(tmp);\n}\n\nfunction sigma(result, x, tmp) {\n  result.assign(x);\n  result.rotateRight(28);\n  tmp.assign(x);\n  tmp.rotateRight(34);\n  result.xor(tmp);\n  tmp.assign(x);\n  tmp.rotateRight(39);\n  result.xor(tmp);\n}\n\nfunction sigmaPrime(result, x, tmp) {\n  result.assign(x);\n  result.rotateRight(14);\n  tmp.assign(x);\n  tmp.rotateRight(18);\n  result.xor(tmp);\n  tmp.assign(x);\n  tmp.rotateRight(41);\n  result.xor(tmp);\n}\n\nfunction littleSigma(result, x, tmp) {\n  result.assign(x);\n  result.rotateRight(1);\n  tmp.assign(x);\n  tmp.rotateRight(8);\n  result.xor(tmp);\n  tmp.assign(x);\n  tmp.shiftRight(7);\n  result.xor(tmp);\n}\n\nfunction littleSigmaPrime(result, x, tmp) {\n  result.assign(x);\n  result.rotateRight(19);\n  tmp.assign(x);\n  tmp.rotateRight(61);\n  result.xor(tmp);\n  tmp.assign(x);\n  tmp.shiftRight(6);\n  result.xor(tmp);\n}\n\nfunction calculateSHA512(data, offset, length, mode384 = false) {\n  // initial hash values\n  let h0, h1, h2, h3, h4, h5, h6, h7;\n  if (!mode384) {\n    h0 = new Word64(0x6a09e667, 0xf3bcc908);\n    h1 = new Word64(0xbb67ae85, 0x84caa73b);\n    h2 = new Word64(0x3c6ef372, 0xfe94f82b);\n    h3 = new Word64(0xa54ff53a, 0x5f1d36f1);\n    h4 = new Word64(0x510e527f, 0xade682d1);\n    h5 = new Word64(0x9b05688c, 0x2b3e6c1f);\n    h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);\n    h7 = new Word64(0x5be0cd19, 0x137e2179);\n  } else {\n    // SHA384 is exactly the same\n    // except with different starting values and a trimmed result\n    h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);\n    h1 = new Word64(0x629a292a, 0x367cd507);\n    h2 = new Word64(0x9159015a, 0x3070dd17);\n    h3 = new Word64(0x152fecd8, 0xf70e5939);\n    h4 = new Word64(0x67332667, 0xffc00b31);\n    h5 = new Word64(0x8eb44a87, 0x68581511);\n    h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);\n    h7 = new Word64(0x47b5481d, 0xbefa4fa4);\n  }\n\n  // pre-processing\n  const paddedLength = Math.ceil((length + 17) / 128) * 128;\n  const padded = new Uint8Array(paddedLength);\n  let i, j;\n  for (i = 0; i < length; ++i) {\n    padded[i] = data[offset++];\n  }\n  padded[i++] = 0x80;\n  const n = paddedLength - 16;\n  if (i < n) {\n    i = n;\n  }\n  i += 11;\n  padded[i++] = (length >>> 29) & 0xff;\n  padded[i++] = (length >> 21) & 0xff;\n  padded[i++] = (length >> 13) & 0xff;\n  padded[i++] = (length >> 5) & 0xff;\n  padded[i++] = (length << 3) & 0xff;\n\n  const w = new Array(80);\n  for (i = 0; i < 80; i++) {\n    w[i] = new Word64(0, 0);\n  }\n  const { k } = PARAMS;\n\n  let a = new Word64(0, 0),\n    b = new Word64(0, 0),\n    c = new Word64(0, 0);\n  let d = new Word64(0, 0),\n    e = new Word64(0, 0),\n    f = new Word64(0, 0);\n  let g = new Word64(0, 0),\n    h = new Word64(0, 0);\n  const t1 = new Word64(0, 0),\n    t2 = new Word64(0, 0);\n  const tmp1 = new Word64(0, 0),\n    tmp2 = new Word64(0, 0);\n  let tmp3;\n\n  // for each 1024 bit block\n  for (i = 0; i < paddedLength; ) {\n    for (j = 0; j < 16; ++j) {\n      w[j].high =\n        (padded[i] << 24) |\n        (padded[i + 1] << 16) |\n        (padded[i + 2] << 8) |\n        padded[i + 3];\n      w[j].low =\n        (padded[i + 4] << 24) |\n        (padded[i + 5] << 16) |\n        (padded[i + 6] << 8) |\n        padded[i + 7];\n      i += 8;\n    }\n    for (j = 16; j < 80; ++j) {\n      tmp3 = w[j];\n      littleSigmaPrime(tmp3, w[j - 2], tmp2);\n      tmp3.add(w[j - 7]);\n      littleSigma(tmp1, w[j - 15], tmp2);\n      tmp3.add(tmp1);\n      tmp3.add(w[j - 16]);\n    }\n\n    a.assign(h0);\n    b.assign(h1);\n    c.assign(h2);\n    d.assign(h3);\n    e.assign(h4);\n    f.assign(h5);\n    g.assign(h6);\n    h.assign(h7);\n    for (j = 0; j < 80; ++j) {\n      t1.assign(h);\n      sigmaPrime(tmp1, e, tmp2);\n      t1.add(tmp1);\n      ch(tmp1, e, f, g, tmp2);\n      t1.add(tmp1);\n      t1.add(k[j]);\n      t1.add(w[j]);\n\n      sigma(t2, a, tmp2);\n      maj(tmp1, a, b, c, tmp2);\n      t2.add(tmp1);\n\n      tmp3 = h;\n      h = g;\n      g = f;\n      f = e;\n      d.add(t1);\n      e = d;\n      d = c;\n      c = b;\n      b = a;\n      tmp3.assign(t1);\n      tmp3.add(t2);\n      a = tmp3;\n    }\n    h0.add(a);\n    h1.add(b);\n    h2.add(c);\n    h3.add(d);\n    h4.add(e);\n    h5.add(f);\n    h6.add(g);\n    h7.add(h);\n  }\n\n  let result;\n  if (!mode384) {\n    result = new Uint8Array(64);\n    h0.copyTo(result, 0);\n    h1.copyTo(result, 8);\n    h2.copyTo(result, 16);\n    h3.copyTo(result, 24);\n    h4.copyTo(result, 32);\n    h5.copyTo(result, 40);\n    h6.copyTo(result, 48);\n    h7.copyTo(result, 56);\n  } else {\n    result = new Uint8Array(48);\n    h0.copyTo(result, 0);\n    h1.copyTo(result, 8);\n    h2.copyTo(result, 16);\n    h3.copyTo(result, 24);\n    h4.copyTo(result, 32);\n    h5.copyTo(result, 40);\n  }\n  return result;\n}\n\nfunction calculateSHA384(data, offset, length) {\n  return calculateSHA512(data, offset, length, /* mode384 = */ true);\n}\n\nexport { calculateSHA384, calculateSHA512 };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { shadow } from \"../shared/util.js\";\n\nconst PARAMS = {\n  get k() {\n    return shadow(\n      this,\n      \"k\",\n      [\n        0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n        0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n        0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n        0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n        0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n        0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n        0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n        0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n        0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n        0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n      ]\n    );\n  },\n};\n\nfunction rotr(x, n) {\n  return (x >>> n) | (x << (32 - n));\n}\n\nfunction ch(x, y, z) {\n  return (x & y) ^ (~x & z);\n}\n\nfunction maj(x, y, z) {\n  return (x & y) ^ (x & z) ^ (y & z);\n}\n\nfunction sigma(x) {\n  return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);\n}\n\nfunction sigmaPrime(x) {\n  return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);\n}\n\nfunction littleSigma(x) {\n  return rotr(x, 7) ^ rotr(x, 18) ^ (x >>> 3);\n}\n\nfunction littleSigmaPrime(x) {\n  return rotr(x, 17) ^ rotr(x, 19) ^ (x >>> 10);\n}\n\nfunction calculateSHA256(data, offset, length) {\n  // initial hash values\n  let h0 = 0x6a09e667,\n    h1 = 0xbb67ae85,\n    h2 = 0x3c6ef372,\n    h3 = 0xa54ff53a,\n    h4 = 0x510e527f,\n    h5 = 0x9b05688c,\n    h6 = 0x1f83d9ab,\n    h7 = 0x5be0cd19;\n  // pre-processing\n  const paddedLength = Math.ceil((length + 9) / 64) * 64;\n  const padded = new Uint8Array(paddedLength);\n  let i, j;\n  for (i = 0; i < length; ++i) {\n    padded[i] = data[offset++];\n  }\n  padded[i++] = 0x80;\n  const n = paddedLength - 8;\n  if (i < n) {\n    i = n;\n  }\n  i += 3;\n  padded[i++] = (length >>> 29) & 0xff;\n  padded[i++] = (length >> 21) & 0xff;\n  padded[i++] = (length >> 13) & 0xff;\n  padded[i++] = (length >> 5) & 0xff;\n  padded[i++] = (length << 3) & 0xff;\n  const w = new Uint32Array(64);\n  const { k } = PARAMS;\n  // for each 512 bit block\n  for (i = 0; i < paddedLength; ) {\n    for (j = 0; j < 16; ++j) {\n      w[j] =\n        (padded[i] << 24) |\n        (padded[i + 1] << 16) |\n        (padded[i + 2] << 8) |\n        padded[i + 3];\n      i += 4;\n    }\n\n    for (j = 16; j < 64; ++j) {\n      w[j] =\n        (littleSigmaPrime(w[j - 2]) +\n          w[j - 7] +\n          littleSigma(w[j - 15]) +\n          w[j - 16]) |\n        0;\n    }\n    let a = h0,\n      b = h1,\n      c = h2,\n      d = h3,\n      e = h4,\n      f = h5,\n      g = h6,\n      h = h7,\n      t1,\n      t2;\n    for (j = 0; j < 64; ++j) {\n      t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];\n      t2 = sigma(a) + maj(a, b, c);\n      h = g;\n      g = f;\n      f = e;\n      e = (d + t1) | 0;\n      d = c;\n      c = b;\n      b = a;\n      a = (t1 + t2) | 0;\n    }\n    h0 = (h0 + a) | 0;\n    h1 = (h1 + b) | 0;\n    h2 = (h2 + c) | 0;\n    h3 = (h3 + d) | 0;\n    h4 = (h4 + e) | 0;\n    h5 = (h5 + f) | 0;\n    h6 = (h6 + g) | 0;\n    h7 = (h7 + h) | 0;\n  }\n  // prettier-ignore\n  return new Uint8Array([\n    (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF,\n    (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF,\n    (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF,\n    (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF,\n    (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF,\n    (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF,\n    (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF,\n    (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF\n  ]);\n}\n\nexport { calculateSHA256 };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from \"./decode_stream.js\";\n\nconst chunkSize = 512;\n\nclass DecryptStream extends DecodeStream {\n  #nextChunk = null;\n\n  constructor(str, maybeLength, decrypt) {\n    super(maybeLength);\n\n    this.stream = str;\n    this.dict = str.dict;\n    this.decrypt = decrypt;\n  }\n\n  readBlock() {\n    let chunk = this.#nextChunk ?? this.stream.getBytes(chunkSize);\n    if (!chunk?.length) {\n      this.eof = true;\n      return;\n    }\n    this.#nextChunk = this.stream.getBytes(chunkSize);\n    const hasMoreData = this.#nextChunk?.length > 0;\n\n    const decrypt = this.decrypt;\n    chunk = decrypt(chunk, !hasMoreData);\n\n    const bufferLength = this.bufferLength,\n      newLength = bufferLength + chunk.length,\n      buffer = this.ensureBuffer(newLength);\n    buffer.set(chunk, bufferLength);\n    this.bufferLength = newLength;\n  }\n\n  getOriginalStream() {\n    return this;\n  }\n}\n\nexport { DecryptStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @import {BaseStream} from \"./base_stream.js\";\n */\n\nimport {\n  bytesToString,\n  FormatError,\n  isArrayEqual,\n  PasswordException,\n  PasswordResponses,\n  shadow,\n  stringToBytes,\n  unreachable,\n  utf8StringToString,\n  warn,\n} from \"../shared/util.js\";\nimport { calculateSHA384, calculateSHA512 } from \"./calculate_sha_other.js\";\nimport { Dict, isDict, isName, Name } from \"./primitives.js\";\nimport { calculateMD5 } from \"./calculate_md5.js\";\nimport { calculateSHA256 } from \"./calculate_sha256.js\";\nimport { DecryptStream } from \"./decrypt_stream.js\";\n\n/**\n * @typedef {typeof AES128Cipher | typeof AES256Cipher | typeof ARCFourCipher\n * | typeof NullCipher} CipherConstructors\n */\n\n/**\n * @callback ResolveCipher\n *   Find the appropriate cipher class based on the filter name.\n * @param {Name | null} [filterName]\n *   Name.\n * @returns {CipherConstructors}\n *   Cipher constructor.\n */\n\nclass ARCFourCipher {\n  a = 0;\n\n  b = 0;\n\n  constructor(key) {\n    const s = new Uint8Array(256);\n    const keyLength = key.length;\n\n    for (let i = 0; i < 256; ++i) {\n      s[i] = i;\n    }\n    for (let i = 0, j = 0; i < 256; ++i) {\n      const tmp = s[i];\n      j = (j + tmp + key[i % keyLength]) & 0xff;\n      s[i] = s[j];\n      s[j] = tmp;\n    }\n    this.s = s;\n  }\n\n  encryptBlock(data) {\n    let a = this.a,\n      b = this.b;\n    const s = this.s;\n    const n = data.length;\n    const output = new Uint8Array(n);\n    for (let i = 0; i < n; ++i) {\n      a = (a + 1) & 0xff;\n      const tmp = s[a];\n      b = (b + tmp) & 0xff;\n      const tmp2 = s[b];\n      s[a] = tmp2;\n      s[b] = tmp;\n      output[i] = data[i] ^ s[(tmp + tmp2) & 0xff];\n    }\n    this.a = a;\n    this.b = b;\n    return output;\n  }\n\n  decryptBlock(data) {\n    return this.encryptBlock(data);\n  }\n\n  encrypt(data) {\n    return this.encryptBlock(data);\n  }\n}\n\nclass NullCipher {\n  decryptBlock(data) {\n    return data;\n  }\n\n  encrypt(data) {\n    return data;\n  }\n}\n\nclass AESBaseCipher {\n  _s = new Uint8Array([\n    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,\n    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,\n    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,\n    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,\n    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,\n    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,\n    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,\n    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,\n    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,\n    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,\n    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,\n    0xb0, 0x54, 0xbb, 0x16,\n  ]);\n\n  _inv_s = new Uint8Array([\n    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,\n    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,\n    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,\n    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,\n    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,\n    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,\n    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,\n    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,\n    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,\n    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,\n    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,\n    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,\n    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,\n    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,\n    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,\n    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,\n    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,\n    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,\n    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,\n    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,\n    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,\n    0x55, 0x21, 0x0c, 0x7d,\n  ]);\n\n  _mix = new Uint32Array([\n    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,\n    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,\n    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,\n    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,\n    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,\n    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,\n    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,\n    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,\n    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,\n    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,\n    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,\n    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,\n    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,\n    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,\n    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,\n    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,\n    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,\n    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,\n    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,\n    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,\n    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,\n    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,\n    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,\n    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,\n    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,\n    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,\n    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,\n    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,\n    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,\n    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,\n    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,\n    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,\n    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,\n    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,\n    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,\n    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,\n    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,\n    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,\n    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,\n    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,\n    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,\n    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,\n    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3,\n  ]);\n\n  _mixCol = new Uint8Array(256).map((_, i) =>\n    i < 128 ? i << 1 : (i << 1) ^ 0x1b\n  );\n\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === AESBaseCipher\n    ) {\n      unreachable(\"Cannot initialize AESBaseCipher.\");\n    }\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n\n  _expandKey(cipherKey) {\n    unreachable(\"Cannot call `_expandKey` on the base class\");\n  }\n\n  _decrypt(input, key) {\n    let t, u, v;\n    const state = new Uint8Array(16);\n    state.set(input);\n\n    // AddRoundKey\n    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) {\n      // InvShiftRows\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n      // InvSubBytes\n      for (let j = 0; j < 16; ++j) {\n        state[j] = this._inv_s[state[j]];\n      }\n      // AddRoundKey\n      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n      // InvMixColumns\n      for (let j = 0; j < 16; j += 4) {\n        const s0 = this._mix[state[j]];\n        const s1 = this._mix[state[j + 1]];\n        const s2 = this._mix[state[j + 2]];\n        const s3 = this._mix[state[j + 3]];\n        t =\n          s0 ^\n          (s1 >>> 8) ^\n          (s1 << 24) ^\n          (s2 >>> 16) ^\n          (s2 << 16) ^\n          (s3 >>> 24) ^\n          (s3 << 8);\n        state[j] = (t >>> 24) & 0xff;\n        state[j + 1] = (t >> 16) & 0xff;\n        state[j + 2] = (t >> 8) & 0xff;\n        state[j + 3] = t & 0xff;\n      }\n    }\n    // InvShiftRows\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n    for (let j = 0; j < 16; ++j) {\n      // InvSubBytes\n      state[j] = this._inv_s[state[j]];\n      // AddRoundKey\n      state[j] ^= key[j];\n    }\n    return state;\n  }\n\n  _encrypt(input, key) {\n    const s = this._s;\n\n    let t, u, v;\n    const state = new Uint8Array(16);\n    state.set(input);\n\n    for (let j = 0; j < 16; ++j) {\n      // AddRoundKey\n      state[j] ^= key[j];\n    }\n\n    for (let i = 1; i < this._cyclesOfRepetition; i++) {\n      // SubBytes\n      for (let j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n      // ShiftRows\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n      // MixColumns\n      for (let j = 0; j < 16; j += 4) {\n        const s0 = state[j];\n        const s1 = state[j + 1];\n        const s2 = state[j + 2];\n        const s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j] ^= t ^ this._mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ this._mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ this._mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ this._mixCol[s3 ^ s0];\n      }\n      // AddRoundKey\n      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n\n    // SubBytes\n    for (let j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n    // ShiftRows\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n    // AddRoundKey\n    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    return state;\n  }\n\n  _decryptBlock2(data, finalize) {\n    const sourceLength = data.length;\n    let buffer = this.buffer,\n      bufferLength = this.bufferPosition;\n    const result = [];\n    let iv = this.iv;\n\n    for (let i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      // buffer is full, decrypting\n      const plain = this._decrypt(buffer, this._key);\n      // xor-ing the IV vector to get plain text\n      for (let j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    // saving incomplete buffer\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array(0);\n    }\n    // combining plain text blocks into one\n    let outputLength = 16 * result.length;\n    if (finalize) {\n      // undo a padding that is described in RFC 2898\n      const lastBlock = result.at(-1);\n      let psLen = lastBlock[15];\n      if (psLen <= 16) {\n        for (let i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            // Invalid padding, assume that the block has no padding.\n            psLen = 0;\n            break;\n          }\n        }\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n    const output = new Uint8Array(outputLength);\n    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n\n  decryptBlock(data, finalize, iv = null) {\n    const sourceLength = data.length;\n    const buffer = this.buffer;\n    let bufferLength = this.bufferPosition;\n    // If an IV is not supplied, wait for IV values. They are at the start\n    // of the stream.\n    if (iv) {\n      this.iv = iv;\n    } else {\n      for (\n        let i = 0;\n        bufferLength < 16 && i < sourceLength;\n        ++i, ++bufferLength\n      ) {\n        buffer[bufferLength] = data[i];\n      }\n      if (bufferLength < 16) {\n        // Need more data.\n        this.bufferLength = bufferLength;\n        return new Uint8Array(0);\n      }\n      this.iv = buffer;\n      data = data.subarray(16);\n    }\n    this.buffer = new Uint8Array(16);\n    this.bufferLength = 0;\n    // starting decryption\n    this.decryptBlock = this._decryptBlock2;\n    return this.decryptBlock(data, finalize);\n  }\n\n  encrypt(data, iv) {\n    const sourceLength = data.length;\n    let buffer = this.buffer,\n      bufferLength = this.bufferPosition;\n    const result = [];\n\n    iv ||= new Uint8Array(16);\n    for (let i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n\n      for (let j = 0; j < 16; ++j) {\n        buffer[j] ^= iv[j];\n      }\n\n      // buffer is full, encrypting\n      const cipher = this._encrypt(buffer, this._key);\n      iv = cipher;\n      result.push(cipher);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    // saving incomplete buffer\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array(0);\n    }\n    // combining plain text blocks into one\n    const outputLength = 16 * result.length;\n    const output = new Uint8Array(outputLength);\n    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n}\n\nclass AES128Cipher extends AESBaseCipher {\n  _rcon = new Uint8Array([\n    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,\n    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,\n    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\n    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\n    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,\n    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,\n    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,\n    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,\n    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,\n    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,\n    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,\n    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,\n    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,\n    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,\n    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,\n    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,\n    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,\n    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,\n    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,\n    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\n    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\n    0x74, 0xe8, 0xcb, 0x8d,\n  ]);\n\n  constructor(key) {\n    super();\n\n    this._cyclesOfRepetition = 10;\n    this._keySize = 160; // bits\n\n    this._key = this._expandKey(key);\n  }\n\n  _expandKey(cipherKey) {\n    const b = 176;\n    const s = this._s;\n    const rcon = this._rcon;\n\n    const result = new Uint8Array(b);\n    result.set(cipherKey);\n\n    for (let j = 16, i = 1; j < b; ++i) {\n      // RotWord\n      let t1 = result[j - 3];\n      let t2 = result[j - 2];\n      let t3 = result[j - 1];\n      let t4 = result[j - 4];\n      // SubWord\n      t1 = s[t1];\n      t2 = s[t2];\n      t3 = s[t3];\n      t4 = s[t4];\n      // Rcon\n      t1 ^= rcon[i];\n      for (let n = 0; n < 4; ++n) {\n        result[j] = t1 ^= result[j - 16];\n        j++;\n        result[j] = t2 ^= result[j - 16];\n        j++;\n        result[j] = t3 ^= result[j - 16];\n        j++;\n        result[j] = t4 ^= result[j - 16];\n        j++;\n      }\n    }\n    return result;\n  }\n}\n\nclass AES256Cipher extends AESBaseCipher {\n  constructor(key) {\n    super();\n\n    this._cyclesOfRepetition = 14;\n    this._keySize = 224; // bits\n\n    this._key = this._expandKey(key);\n  }\n\n  _expandKey(cipherKey) {\n    const b = 240;\n    const s = this._s;\n\n    const result = new Uint8Array(b);\n    result.set(cipherKey);\n\n    let r = 1;\n    let t1, t2, t3, t4;\n    for (let j = 32, i = 1; j < b; ++i) {\n      if (j % 32 === 16) {\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n      } else if (j % 32 === 0) {\n        // RotWord\n        t1 = result[j - 3];\n        t2 = result[j - 2];\n        t3 = result[j - 1];\n        t4 = result[j - 4];\n        // SubWord\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n        // Rcon\n        t1 ^= r;\n        if ((r <<= 1) >= 256) {\n          r = (r ^ 0x1b) & 0xff;\n        }\n      }\n\n      for (let n = 0; n < 4; ++n) {\n        result[j] = t1 ^= result[j - 32];\n        j++;\n        result[j] = t2 ^= result[j - 32];\n        j++;\n        result[j] = t3 ^= result[j - 32];\n        j++;\n        result[j] = t4 ^= result[j - 32];\n        j++;\n      }\n    }\n    return result;\n  }\n}\n\nclass PDFBase {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === PDFBase\n    ) {\n      unreachable(\"Cannot initialize PDFBase.\");\n    }\n  }\n\n  _hash(password, input, userBytes) {\n    unreachable(\"Abstract method `_hash` called\");\n  }\n\n  checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {\n    const hashData = new Uint8Array(password.length + 56);\n    hashData.set(password, 0);\n    hashData.set(ownerValidationSalt, password.length);\n    hashData.set(userBytes, password.length + ownerValidationSalt.length);\n    const result = this._hash(password, hashData, userBytes);\n    return isArrayEqual(result, ownerPassword);\n  }\n\n  checkUserPassword(password, userValidationSalt, userPassword) {\n    const hashData = new Uint8Array(password.length + 8);\n    hashData.set(password, 0);\n    hashData.set(userValidationSalt, password.length);\n    const result = this._hash(password, hashData, []);\n    return isArrayEqual(result, userPassword);\n  }\n\n  getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {\n    const hashData = new Uint8Array(password.length + 56);\n    hashData.set(password, 0);\n    hashData.set(ownerKeySalt, password.length);\n    hashData.set(userBytes, password.length + ownerKeySalt.length);\n    const key = this._hash(password, hashData, userBytes);\n    const cipher = new AES256Cipher(key);\n    return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));\n  }\n\n  getUserKey(password, userKeySalt, userEncryption) {\n    const hashData = new Uint8Array(password.length + 8);\n    hashData.set(password, 0);\n    hashData.set(userKeySalt, password.length);\n    // `key` is the decryption key for the UE string.\n    const key = this._hash(password, hashData, []);\n    const cipher = new AES256Cipher(key);\n    return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));\n  }\n}\n\nclass PDF17 extends PDFBase {\n  _hash(password, input, userBytes) {\n    return calculateSHA256(input, 0, input.length);\n  }\n}\n\nclass PDF20 extends PDFBase {\n  _hash(password, input, userBytes) {\n    // This refers to Algorithm 2.B as defined in ISO 32000-2.\n    let k = calculateSHA256(input, 0, input.length).subarray(0, 32);\n    let e = [0];\n    let i = 0;\n    while (i < 64 || e.at(-1) > i - 32) {\n      const combinedLength = password.length + k.length + userBytes.length,\n        combinedArray = new Uint8Array(combinedLength);\n      let writeOffset = 0;\n      combinedArray.set(password, writeOffset);\n      writeOffset += password.length;\n      combinedArray.set(k, writeOffset);\n      writeOffset += k.length;\n      combinedArray.set(userBytes, writeOffset);\n\n      const k1 = new Uint8Array(combinedLength * 64);\n      for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) {\n        k1.set(combinedArray, pos);\n      }\n      // AES128 CBC NO PADDING with first 16 bytes of k as the key\n      // and the second 16 as the iv.\n      const cipher = new AES128Cipher(k.subarray(0, 16));\n      e = cipher.encrypt(k1, k.subarray(16, 32));\n      // Now we have to take the first 16 bytes of an unsigned big endian\n      // integer and compute the remainder modulo 3. That is a fairly large\n      // number and JavaScript isn't going to handle that well.\n      // The number is e0 + 256 * e1 + 256^2 * e2... and 256 % 3 === 1, hence\n      // the powers of 256 are === 1 modulo 3 and finally the number modulo 3\n      // is equal to the remainder modulo 3 of the sum of the e_n.\n      const remainder = Math.sumPrecise(e.slice(0, 16)) % 3;\n      if (remainder === 0) {\n        k = calculateSHA256(e, 0, e.length);\n      } else if (remainder === 1) {\n        k = calculateSHA384(e, 0, e.length);\n      } else if (remainder === 2) {\n        k = calculateSHA512(e, 0, e.length);\n      }\n      i++;\n    }\n    return k.subarray(0, 32);\n  }\n}\n\nclass CipherTransform {\n  /** @type {Map<string, CipherConstructors>} */\n  #cipherCache = new Map();\n\n  /** @type {Name | null} */\n  embeddedFilterName = null;\n\n  /**\n   * @param {ResolveCipher} resolveCipher\n   *   Resolve a cipher constructor from a crypt filter name.\n   * @param {Name | null} [stringFilterName]\n   *   Default crypt filter for strings.\n   * @param {Name | null} [streamFilterName]\n   *   Default crypt filter for streams.\n   */\n  constructor(resolveCipher, stringFilterName = null, streamFilterName = null) {\n    this.resolveCipher = resolveCipher;\n    this.streamFilterName = streamFilterName;\n    this.stringFilterName = stringFilterName;\n  }\n\n  /**\n   * @param {Name | null} [filterName]\n   *   Crypt filter name.\n   * @returns {CipherConstructors}\n   *   Cipher constructor.\n   */\n  #getCipher(filterName = null) {\n    const key = filterName instanceof Name ? filterName.name : \"__default__\";\n\n    return this.#cipherCache.getOrInsertComputed(key, () =>\n      this.resolveCipher(filterName)\n    );\n  }\n\n  /**\n   * @param {BaseStream} stream\n   * @param {number | null} length\n   * @param {Name | null} [cryptFilterName]\n   * @returns {DecryptStream}\n   */\n  createStream(stream, length, cryptFilterName = null) {\n    const defaultFilterName =\n      this.embeddedFilterName && isDict(stream.dict, \"EmbeddedFile\")\n        ? this.embeddedFilterName\n        : this.streamFilterName;\n    const Cipher = this.#getCipher(cryptFilterName || defaultFilterName);\n    const cipher = new Cipher();\n    return new DecryptStream(\n      stream,\n      length,\n      function cipherTransformDecryptStream(data, finalize) {\n        return cipher.decryptBlock(data, finalize);\n      }\n    );\n  }\n\n  decryptString(s) {\n    const Cipher = this.#getCipher(this.stringFilterName);\n    const cipher = new Cipher();\n    let data = stringToBytes(s);\n    data = cipher.decryptBlock(data, true);\n    return bytesToString(data);\n  }\n\n  encryptString(s) {\n    const Cipher = this.#getCipher(this.stringFilterName);\n    const cipher = new Cipher();\n    if (cipher instanceof AESBaseCipher) {\n      // Append some chars equal to \"16 - (M mod 16)\"\n      // where M is the string length (see section 7.6.2 in PDF specification)\n      // to have a final string where the length is a multiple of 16.\n      // Special note:\n      //   \"Note that the pad is present when M is evenly divisible by 16;\n      //   it contains 16 bytes of 0x10.\"\n      const strLen = s.length;\n      const pad = 16 - (strLen % 16);\n      s += String.fromCharCode(pad).repeat(pad);\n\n      // Generate an initialization vector\n      const iv = new Uint8Array(16);\n      crypto.getRandomValues(iv);\n\n      let data = stringToBytes(s);\n      data = cipher.encrypt(data, iv);\n\n      const buf = new Uint8Array(16 + data.length);\n      buf.set(iv);\n      buf.set(data, 16);\n\n      return bytesToString(buf);\n    }\n\n    let data = stringToBytes(s);\n    data = cipher.encrypt(data);\n    return bytesToString(data);\n  }\n}\n\nclass CipherTransformFactory {\n  #fileId;\n\n  static get _defaultPasswordBytes() {\n    return shadow(\n      this,\n      \"_defaultPasswordBytes\",\n      new Uint8Array([\n        0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56,\n        0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,\n        0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a,\n      ])\n    );\n  }\n\n  #createEncryptionKey20(\n    revision,\n    password,\n    ownerPassword,\n    ownerValidationSalt,\n    ownerKeySalt,\n    uBytes,\n    userPassword,\n    userValidationSalt,\n    userKeySalt,\n    ownerEncryption,\n    userEncryption,\n    perms\n  ) {\n    if (password) {\n      const passwordLength = Math.min(127, password.length);\n      password = password.subarray(0, passwordLength);\n    } else {\n      password = [];\n    }\n    const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17();\n\n    if (\n      pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)\n    ) {\n      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);\n    } else if (\n      password.length &&\n      pdfAlgorithm.checkOwnerPassword(\n        password,\n        ownerValidationSalt,\n        uBytes,\n        ownerPassword\n      )\n    ) {\n      return pdfAlgorithm.getOwnerKey(\n        password,\n        ownerKeySalt,\n        uBytes,\n        ownerEncryption\n      );\n    }\n\n    return null;\n  }\n\n  #prepareKeyData(\n    fileId,\n    password,\n    ownerPassword,\n    userPassword,\n    flags,\n    revision,\n    keyLength,\n    encryptMetadata\n  ) {\n    const hashDataSize = 40 + ownerPassword.length + fileId.length;\n    const hashData = new Uint8Array(hashDataSize);\n    let i = 0,\n      j,\n      n;\n    if (password) {\n      n = Math.min(32, password.length);\n      for (; i < n; ++i) {\n        hashData[i] = password[i];\n      }\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = CipherTransformFactory._defaultPasswordBytes[j++];\n    }\n    // as now the padded password in the hashData[0..i]\n    hashData.set(ownerPassword, i);\n    i += ownerPassword.length;\n    hashData[i++] = flags & 0xff;\n    hashData[i++] = (flags >> 8) & 0xff;\n    hashData[i++] = (flags >> 16) & 0xff;\n    hashData[i++] = (flags >>> 24) & 0xff;\n    hashData.set(fileId, i);\n    i += fileId.length;\n    if (revision >= 4 && !encryptMetadata) {\n      hashData.fill(0xff, i, i + 4);\n      i += 4;\n    }\n    let hash = calculateMD5(hashData, 0, i);\n    const keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, keyLengthInBytes);\n      }\n    }\n    const encryptionKey = hash.subarray(0, keyLengthInBytes);\n    let cipher, checkData;\n\n    if (revision >= 3) {\n      i = 0;\n      hashData.set(CipherTransformFactory._defaultPasswordBytes, i);\n      i += 32;\n      hashData.set(fileId, i);\n      i += fileId.length;\n\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));\n      n = encryptionKey.length;\n      const derivedKey = new Uint8Array(n);\n      for (j = 1; j <= 19; ++j) {\n        for (let k = 0; k < n; ++k) {\n          derivedKey[k] = encryptionKey[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        checkData = cipher.encryptBlock(checkData);\n      }\n    } else {\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(\n        CipherTransformFactory._defaultPasswordBytes\n      );\n    }\n    return checkData.every((data, k) => userPassword[k] === data)\n      ? encryptionKey\n      : null;\n  }\n\n  #decodeUserPassword(password, ownerPassword, revision, keyLength) {\n    const hashData = new Uint8Array(32);\n    let i = 0;\n    const n = Math.min(32, password.length);\n    for (; i < n; ++i) {\n      hashData[i] = password[i];\n    }\n    let j = 0;\n    while (i < 32) {\n      hashData[i++] = CipherTransformFactory._defaultPasswordBytes[j++];\n    }\n    let hash = calculateMD5(hashData, 0, i);\n    const keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, hash.length);\n      }\n    }\n\n    let cipher, userPassword;\n    if (revision >= 3) {\n      userPassword = ownerPassword;\n      const derivedKey = new Uint8Array(keyLengthInBytes);\n      for (j = 19; j >= 0; j--) {\n        for (let k = 0; k < keyLengthInBytes; ++k) {\n          derivedKey[k] = hash[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        userPassword = cipher.encryptBlock(userPassword);\n      }\n    } else {\n      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));\n      userPassword = cipher.encryptBlock(ownerPassword);\n    }\n    return userPassword;\n  }\n\n  #buildObjectKey(num, gen, encryptionKey, isAes = false) {\n    const n = encryptionKey.length;\n    const key = new Uint8Array(n + 9);\n    key.set(encryptionKey);\n    let i = n;\n    key[i++] = num & 0xff;\n    key[i++] = (num >> 8) & 0xff;\n    key[i++] = (num >> 16) & 0xff;\n    key[i++] = gen & 0xff;\n    key[i++] = (gen >> 8) & 0xff;\n    if (isAes) {\n      key[i++] = 0x73;\n      key[i++] = 0x41;\n      key[i++] = 0x6c;\n      key[i++] = 0x54;\n    }\n    const hash = calculateMD5(key, 0, i);\n    return hash.subarray(0, Math.min(n + 5, 16));\n  }\n\n  constructor(dict, fileId, password) {\n    const filter = dict.get(\"Filter\");\n    if (!isName(filter, \"Standard\")) {\n      throw new FormatError(\"unknown encryption method\");\n    }\n    this.filterName = filter.name;\n    this.dict = dict;\n    this.#fileId = fileId;\n    const algorithm = dict.get(\"V\");\n    if (\n      !Number.isInteger(algorithm) ||\n      (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5)\n    ) {\n      throw new FormatError(\"unsupported encryption algorithm\");\n    }\n    this.algorithm = algorithm;\n    let keyLength = dict.get(\"Length\");\n    if (!keyLength) {\n      // Spec asks to rely on encryption dictionary's Length entry, however\n      // some PDFs don't have it. Trying to recover.\n      if (algorithm <= 3) {\n        // For 1 and 2 it's fixed to 40-bit, for 3 40-bit is a minimal value.\n        keyLength = 40;\n      } else {\n        // Trying to find default handler -- it usually has Length.\n        const cfDict = dict.get(\"CF\");\n        const streamCryptoName = dict.get(\"StmF\");\n        if (cfDict instanceof Dict && streamCryptoName instanceof Name) {\n          cfDict.suppressEncryption = true; // See comment below.\n          const handlerDict = cfDict.get(streamCryptoName.name);\n          keyLength = handlerDict?.get(\"Length\") || 128;\n          if (keyLength < 40) {\n            // Sometimes it's incorrect value of bits, generators specify\n            // bytes.\n            keyLength <<= 3;\n          }\n        }\n      }\n    }\n    if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {\n      throw new FormatError(\"invalid key length\");\n    }\n\n    let cf = null;\n    let stmf = Name.get(\"Identity\");\n    let strf = Name.get(\"Identity\");\n    let eff = stmf;\n\n    if (algorithm >= 4) {\n      cf = dict.get(\"CF\");\n      if (cf instanceof Dict) {\n        // The 'CF' dictionary itself should not be encrypted, and by setting\n        // `suppressEncryption` we can prevent an infinite loop inside of\n        // `XRef_fetchUncompressed` if the dictionary contains indirect\n        // objects (fixes issue7665.pdf).\n        cf.suppressEncryption = true;\n      }\n      stmf = dict.get(\"StmF\") || Name.get(\"Identity\");\n      strf = dict.get(\"StrF\") || Name.get(\"Identity\");\n      eff = dict.get(\"EFF\") || stmf;\n    }\n    this.cf = cf;\n    this.stmf = stmf;\n    this.strf = strf;\n    this.eff = eff;\n\n    const ownerBytes = stringToBytes(dict.get(\"O\")),\n      userBytes = stringToBytes(dict.get(\"U\"));\n    // prepare keys\n    const ownerPassword = ownerBytes.subarray(0, 32);\n    const userPassword = userBytes.subarray(0, 32);\n    const flags = dict.get(\"P\");\n    const revision = dict.get(\"R\");\n    // meaningful when V is 4 or 5\n    const encryptMetadata =\n      (algorithm === 4 || algorithm === 5) &&\n      dict.get(\"EncryptMetadata\") !== false;\n    this.encryptMetadata = encryptMetadata;\n\n    const fileIdBytes = stringToBytes(fileId);\n    let passwordBytes;\n    if (password) {\n      if (revision === 6) {\n        try {\n          password = utf8StringToString(password);\n        } catch {\n          warn(\n            \"CipherTransformFactory: Unable to convert UTF8 encoded password.\"\n          );\n        }\n      }\n      passwordBytes = stringToBytes(password);\n    }\n\n    let encryptionKey;\n    if (algorithm !== 5) {\n      encryptionKey = this.#prepareKeyData(\n        fileIdBytes,\n        passwordBytes,\n        ownerPassword,\n        userPassword,\n        flags,\n        revision,\n        keyLength,\n        encryptMetadata\n      );\n    } else {\n      const ownerValidationSalt = ownerBytes.subarray(32, 40);\n      const ownerKeySalt = ownerBytes.subarray(40, 48);\n      const uBytes = userBytes.subarray(0, 48);\n      const userValidationSalt = userBytes.subarray(32, 40);\n      const userKeySalt = userBytes.subarray(40, 48);\n      const ownerEncryption = stringToBytes(dict.get(\"OE\"));\n      const userEncryption = stringToBytes(dict.get(\"UE\"));\n      const perms = stringToBytes(dict.get(\"Perms\"));\n      encryptionKey = this.#createEncryptionKey20(\n        revision,\n        passwordBytes,\n        ownerPassword,\n        ownerValidationSalt,\n        ownerKeySalt,\n        uBytes,\n        userPassword,\n        userValidationSalt,\n        userKeySalt,\n        ownerEncryption,\n        userEncryption,\n        perms\n      );\n    }\n    if (!encryptionKey) {\n      if (!password) {\n        if (\n          this.algorithm >= 4 &&\n          isName(this.stmf, \"Identity\") &&\n          isName(this.strf, \"Identity\")\n        ) {\n          const effCF = this.cf?.get(this.eff.name);\n          const authEvent = effCF?.get(\"AuthEvent\");\n\n          if (isName(authEvent, \"EFOpen\")) {\n            // For EFOpen with Identity as default stream/string filters, defer\n            // password prompting until an EmbeddedFile stream is actually read.\n            this.encryptionKey = null;\n            return;\n          }\n        }\n        throw new PasswordException(\n          \"No password given\",\n          PasswordResponses.NEED_PASSWORD\n        );\n      }\n      // Attempting use the password as an owner password\n      const decodedPassword = this.#decodeUserPassword(\n        passwordBytes,\n        ownerPassword,\n        revision,\n        keyLength\n      );\n      encryptionKey = this.#prepareKeyData(\n        fileIdBytes,\n        decodedPassword,\n        ownerPassword,\n        userPassword,\n        flags,\n        revision,\n        keyLength,\n        encryptMetadata\n      );\n    }\n\n    if (!encryptionKey) {\n      throw new PasswordException(\n        \"Incorrect Password\",\n        PasswordResponses.INCORRECT_PASSWORD\n      );\n    }\n\n    if (algorithm === 4 && encryptionKey.length < 16) {\n      // Extend key to 16 byte minimum (undocumented),\n      // fixes issue19484_1.pdf and issue19484_2.pdf.\n      this.encryptionKey = new Uint8Array(16);\n      this.encryptionKey.set(encryptionKey);\n    } else {\n      this.encryptionKey = encryptionKey;\n    }\n  }\n\n  /**\n   * Set password.\n   *\n   * @param {string} password\n   *   New password.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  setPassword(password) {\n    const transform = new CipherTransformFactory(\n      this.dict,\n      this.#fileId,\n      password\n    );\n    this.encryptionKey = transform.encryptionKey;\n  }\n\n  /**\n   * @param {number} num\n   *   Object number.\n   * @param {number} gen\n   *   Generation number.\n   * @returns {CipherTransform}\n   *   Cipher transform.\n   */\n  createCipherTransform(num, gen) {\n    if (this.algorithm === 4 || this.algorithm === 5) {\n      /** @type {ResolveCipher} */\n      const resolveCipher = filterName => {\n        if (!(filterName instanceof Name)) {\n          throw new FormatError(\"Invalid crypt filter name.\");\n        }\n        const cryptFilter = this.cf.get(filterName.name);\n        const cfm = cryptFilter?.get(\"CFM\");\n\n        if (!cfm || cfm.name === \"None\") {\n          return NullCipher;\n        }\n        if (!this.encryptionKey) {\n          throw new PasswordException(\n            \"No password given\",\n            PasswordResponses.NEED_PASSWORD\n          );\n        }\n        if (this.algorithm === 5) {\n          // V=5 always uses 256-bit AES with the file encryption key, even\n          // when a producer wrongly sets the crypt filter's CFM to AESV2\n          // (bug 2046659).\n          return AES256Cipher.bind(null, this.encryptionKey);\n        }\n        if (cfm.name === \"V2\") {\n          return ARCFourCipher.bind(\n            null,\n            this.#buildObjectKey(\n              num,\n              gen,\n              this.encryptionKey,\n              /* isAes = */ false\n            )\n          );\n        }\n        if (cfm.name === \"AESV2\") {\n          return AES128Cipher.bind(\n            null,\n            this.#buildObjectKey(\n              num,\n              gen,\n              this.encryptionKey,\n              /* isAes = */ true\n            )\n          );\n        }\n        if (cfm.name === \"AESV3\") {\n          return AES256Cipher.bind(null, this.encryptionKey);\n        }\n        throw new FormatError(\"Unknown crypto method\");\n      };\n\n      const transform = new CipherTransform(\n        resolveCipher,\n        this.strf,\n        this.stmf\n      );\n      transform.embeddedFilterName = this.eff;\n      return transform;\n    }\n\n    // algorithms 1 and 2\n    /** @type {ResolveCipher} */\n    const resolveCipher = () =>\n      ARCFourCipher.bind(\n        null,\n        this.#buildObjectKey(num, gen, this.encryptionKey, /* isAes = */ false)\n      );\n    return new CipherTransform(resolveCipher);\n  }\n}\n\nexport {\n  AES128Cipher,\n  AES256Cipher,\n  ARCFourCipher,\n  CipherTransform,\n  CipherTransformFactory,\n  PDF17,\n  PDF20,\n};\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert,\n  bytesToString,\n  FormatError,\n  info,\n  InvalidPDFException,\n  warn,\n} from \"../shared/util.js\";\nimport { CIRCULAR_REF, Cmd, Dict, isCmd, Ref, RefSet } from \"./primitives.js\";\nimport { Lexer, Parser } from \"./parser.js\";\nimport {\n  MissingDataException,\n  ParserEOFException,\n  XRefEntryException,\n  XRefParseException,\n} from \"./core_utils.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { CipherTransformFactory } from \"./crypto.js\";\n\nclass XRef {\n  constructor(stream, pdfManager) {\n    this.stream = stream;\n    this.pdfManager = pdfManager;\n    this.entries = [];\n    this._xrefStms = new Set();\n    this._cacheMap = new Map(); // Prepare the XRef cache.\n    this._pendingRefs = new RefSet();\n    this._newPersistentRefNum = null;\n    this._newTemporaryRefNum = null;\n    this._persistentRefsCache = null;\n  }\n\n  getNewPersistentRef(obj) {\n    // When printing we don't care that much about the ref number by itself, it\n    // can increase for ever and it allows to keep some re-usable refs.\n    if (this._newPersistentRefNum === null) {\n      this._newPersistentRefNum = this.entries.length || 1;\n    }\n    const num = this._newPersistentRefNum++;\n    this._cacheMap.set(num, obj);\n    return Ref.get(num, 0);\n  }\n\n  getNewTemporaryRef() {\n    // When saving we want to have some minimal numbers.\n    // Those refs are only created in order to be written in the final pdf\n    // stream.\n    if (this._newTemporaryRefNum === null) {\n      this._newTemporaryRefNum = this.entries.length || 1;\n      if (this._newPersistentRefNum) {\n        this._persistentRefsCache = new Map();\n        for (\n          let i = this._newTemporaryRefNum;\n          i < this._newPersistentRefNum;\n          i++\n        ) {\n          // We *temporarily* clear the cache, see `resetNewTemporaryRef` below,\n          // to avoid any conflict with the refs created during saving.\n          this._persistentRefsCache.set(i, this._cacheMap.get(i));\n          this._cacheMap.delete(i);\n        }\n      }\n    }\n    return Ref.get(this._newTemporaryRefNum++, 0);\n  }\n\n  resetNewTemporaryRef() {\n    // Called once saving is finished.\n    this._newTemporaryRefNum = null;\n    if (this._persistentRefsCache) {\n      for (const [num, obj] of this._persistentRefsCache) {\n        this._cacheMap.set(num, obj);\n      }\n    }\n    this._persistentRefsCache = null;\n  }\n\n  setStartXRef(startXRef) {\n    // Store the starting positions of xref tables as we process them\n    // so we can recover from missing data errors\n    this.startXRefQueue = [startXRef];\n  }\n\n  parse(recoveryMode = false) {\n    let trailerDict;\n    if (!recoveryMode) {\n      trailerDict = this.readXRef();\n    } else {\n      warn(\"Indexing all PDF objects\");\n      trailerDict = this.indexObjects();\n    }\n    trailerDict.assignXref(this);\n    this.trailer = trailerDict;\n\n    let encrypt;\n    try {\n      encrypt = trailerDict.get(\"Encrypt\");\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(`XRef.parse - Invalid \"Encrypt\" reference: \"${ex}\".`);\n    }\n    if (encrypt instanceof Dict) {\n      const ids = trailerDict.get(\"ID\");\n      const fileId = ids?.length ? ids[0] : \"\";\n      // The 'Encrypt' dictionary itself should not be encrypted, and by\n      // setting `suppressEncryption` we can prevent an infinite loop inside\n      // of `XRef_fetchUncompressed` if the dictionary contains indirect\n      // objects (fixes issue7665.pdf).\n      encrypt.suppressEncryption = true;\n      this.encrypt = new CipherTransformFactory(\n        encrypt,\n        fileId,\n        this.pdfManager.password\n      );\n    }\n\n    // Get the root dictionary (catalog) object, and do some basic validation.\n    let root;\n    try {\n      root = trailerDict.get(\"Root\");\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(`XRef.parse - Invalid \"Root\" reference: \"${ex}\".`);\n    }\n    if (root instanceof Dict) {\n      try {\n        const pages = root.get(\"Pages\");\n        if (pages instanceof Dict) {\n          this.root = root;\n          return;\n        }\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        warn(`XRef.parse - Invalid \"Pages\" reference: \"${ex}\".`);\n      }\n    }\n\n    if (!recoveryMode) {\n      throw new XRefParseException();\n    }\n    // Even recovery failed, there's nothing more we can do here.\n    throw new InvalidPDFException(\"Invalid Root reference.\");\n  }\n\n  processXRefTable(parser) {\n    if (!(\"tableState\" in this)) {\n      // Stores state of the table as we process it so we can resume\n      // from middle of table in case of missing data error\n      this.tableState = {\n        entryNum: 0,\n        streamPos: parser.lexer.stream.pos,\n        parserBuf1: parser.buf1,\n        parserBuf2: parser.buf2,\n      };\n    }\n\n    const obj = this.readXRefTable(parser);\n\n    // Sanity check\n    if (!isCmd(obj, \"trailer\")) {\n      throw new FormatError(\n        \"Invalid XRef table: could not find trailer dictionary\"\n      );\n    }\n    // Read trailer dictionary, e.g.\n    // trailer\n    //    << /Size 22\n    //      /Root 20R\n    //      /Info 10R\n    //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]\n    //    >>\n    // The parser goes through the entire stream << ... >> and provides\n    // a getter interface for the key-value table\n    let dict = parser.getObj();\n\n    // The pdflib PDF generator can generate a nested trailer dictionary\n    if (!(dict instanceof Dict) && dict.dict) {\n      dict = dict.dict;\n    }\n    if (!(dict instanceof Dict)) {\n      throw new FormatError(\n        \"Invalid XRef table: could not parse trailer dictionary\"\n      );\n    }\n    delete this.tableState;\n\n    return dict;\n  }\n\n  readXRefTable(parser) {\n    // Example of cross-reference table:\n    // xref\n    // 0 1                    <-- subsection header (first obj #, obj count)\n    // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)\n    // 23 2                   <-- subsection header ... and so on ...\n    // 0000025518 00002 n\n    // 0000025635 00000 n\n    // trailer\n    // ...\n\n    const stream = parser.lexer.stream;\n    const tableState = this.tableState;\n    stream.pos = tableState.streamPos;\n    parser.buf1 = tableState.parserBuf1;\n    parser.buf2 = tableState.parserBuf2;\n\n    // Outer loop is over subsection headers\n    let obj;\n\n    while (true) {\n      if (!(\"firstEntryNum\" in tableState) || !(\"entryCount\" in tableState)) {\n        if (isCmd((obj = parser.getObj()), \"trailer\")) {\n          break;\n        }\n        tableState.firstEntryNum = obj;\n        tableState.entryCount = parser.getObj();\n      }\n\n      let first = tableState.firstEntryNum;\n      const count = tableState.entryCount;\n      if (!Number.isInteger(first) || !Number.isInteger(count)) {\n        throw new FormatError(\n          \"Invalid XRef table: wrong types in subsection header\"\n        );\n      }\n      // Inner loop is over objects themselves\n      for (let i = tableState.entryNum; i < count; i++) {\n        tableState.streamPos = stream.pos;\n        tableState.entryNum = i;\n        tableState.parserBuf1 = parser.buf1;\n        tableState.parserBuf2 = parser.buf2;\n\n        const entry = {};\n        entry.offset = parser.getObj();\n        entry.gen = parser.getObj();\n        const type = parser.getObj();\n\n        if (type instanceof Cmd) {\n          switch (type.cmd) {\n            case \"f\":\n              entry.free = true;\n              break;\n            case \"n\":\n              entry.uncompressed = true;\n              break;\n          }\n        }\n\n        // Validate entry obj\n        if (\n          !Number.isInteger(entry.offset) ||\n          !Number.isInteger(entry.gen) ||\n          !(entry.free || entry.uncompressed)\n        ) {\n          throw new FormatError(\n            `Invalid entry in XRef subsection: ${first}, ${count}`\n          );\n        }\n\n        // The first xref table entry, i.e. obj 0, should be free. Attempting\n        // to adjust an incorrect first obj # (fixes issue 3248 and 7229).\n        if (i === 0 && entry.free && first === 1) {\n          first = 0;\n        }\n\n        if (!this.entries[i + first]) {\n          this.entries[i + first] = entry;\n        }\n      }\n\n      tableState.entryNum = 0;\n      tableState.streamPos = stream.pos;\n      tableState.parserBuf1 = parser.buf1;\n      tableState.parserBuf2 = parser.buf2;\n      delete tableState.firstEntryNum;\n      delete tableState.entryCount;\n    }\n\n    // Sanity check: as per spec, first object must be free\n    if (this.entries[0] && !this.entries[0].free) {\n      throw new FormatError(\"Invalid XRef table: unexpected first object\");\n    }\n    return obj;\n  }\n\n  processXRefStream(stream) {\n    if (!(\"streamState\" in this)) {\n      // Stores state of the stream as we process it so we can resume\n      // from middle of stream in case of missing data error\n      const { dict, pos } = stream;\n      const byteWidths = dict.get(\"W\");\n      const range = dict.get(\"Index\") || [0, dict.get(\"Size\")];\n\n      this.streamState = {\n        entryRanges: range,\n        byteWidths,\n        entryNum: 0,\n        streamPos: pos,\n      };\n    }\n    this.readXRefStream(stream);\n    delete this.streamState;\n\n    return stream.dict;\n  }\n\n  readXRefStream(stream) {\n    const streamState = this.streamState;\n    stream.pos = streamState.streamPos;\n\n    const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] =\n      streamState.byteWidths;\n\n    const entryRanges = streamState.entryRanges;\n    while (entryRanges.length > 0) {\n      const [first, n] = entryRanges;\n\n      if (!Number.isInteger(first) || !Number.isInteger(n)) {\n        throw new FormatError(`Invalid XRef range fields: ${first}, ${n}`);\n      }\n      if (\n        !Number.isInteger(typeFieldWidth) ||\n        !Number.isInteger(offsetFieldWidth) ||\n        !Number.isInteger(generationFieldWidth)\n      ) {\n        throw new FormatError(\n          `Invalid XRef entry fields length: ${first}, ${n}`\n        );\n      }\n      for (let i = streamState.entryNum; i < n; ++i) {\n        streamState.entryNum = i;\n        streamState.streamPos = stream.pos;\n\n        let type = 0,\n          offset = 0,\n          generation = 0;\n        for (let j = 0; j < typeFieldWidth; ++j) {\n          const typeByte = stream.getByte();\n          if (typeByte === -1) {\n            throw new FormatError(\"Invalid XRef byteWidths 'type'.\");\n          }\n          type = (type << 8) | typeByte;\n        }\n        // if type field is absent, its default value is 1\n        if (typeFieldWidth === 0) {\n          type = 1;\n        }\n        for (let j = 0; j < offsetFieldWidth; ++j) {\n          const offsetByte = stream.getByte();\n          if (offsetByte === -1) {\n            throw new FormatError(\"Invalid XRef byteWidths 'offset'.\");\n          }\n          offset = (offset << 8) | offsetByte;\n        }\n        for (let j = 0; j < generationFieldWidth; ++j) {\n          const generationByte = stream.getByte();\n          if (generationByte === -1) {\n            throw new FormatError(\"Invalid XRef byteWidths 'generation'.\");\n          }\n          generation = (generation << 8) | generationByte;\n        }\n        const entry = {};\n        entry.offset = offset;\n        entry.gen = generation;\n        switch (type) {\n          case 0:\n            entry.free = true;\n            break;\n          case 1:\n            entry.uncompressed = true;\n            break;\n          case 2:\n            break;\n          default:\n            throw new FormatError(`Invalid XRef entry type: ${type}`);\n        }\n        if (!this.entries[first + i]) {\n          this.entries[first + i] = entry;\n        }\n      }\n\n      streamState.entryNum = 0;\n      streamState.streamPos = stream.pos;\n      entryRanges.splice(0, 2);\n    }\n  }\n\n  indexObjects() {\n    // Simple scan through the PDF content to find objects,\n    // trailers and XRef streams.\n    const TAB = 0x9,\n      LF = 0xa,\n      CR = 0xd,\n      SPACE = 0x20;\n    const PERCENT = 0x25,\n      LT = 0x3c;\n\n    function readToken(data, offset) {\n      let token = \"\",\n        ch = data[offset];\n      while (ch !== LF && ch !== CR && ch !== LT) {\n        if (++offset >= data.length) {\n          break;\n        }\n        token += String.fromCharCode(ch);\n        ch = data[offset];\n      }\n      return token;\n    }\n    function skipUntil(data, offset, what) {\n      const length = what.length,\n        dataLength = data.length;\n      let skipped = 0;\n      // finding byte sequence\n      while (offset < dataLength) {\n        let i = 0;\n        while (i < length && data[offset + i] === what[i]) {\n          ++i;\n        }\n        if (i >= length) {\n          break; // sequence found\n        }\n        offset++;\n        skipped++;\n      }\n      return skipped;\n    }\n    const gEndobjRegExp = /\\b(endobj|\\d+\\s+\\d+\\s+obj|xref|trailer\\s*<<)\\b/g;\n    const gStartxrefRegExp = /\\b(startxref|\\d+\\s+\\d+\\s+obj)\\b/g;\n    const objRegExp = /^(\\d+)\\s+(\\d+)\\s+obj\\b/;\n\n    const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);\n    const startxrefBytes = new Uint8Array([\n      115, 116, 97, 114, 116, 120, 114, 101, 102,\n    ]);\n    const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);\n\n    // Clear out any existing entries, since they may be bogus.\n    this.entries.length = 0;\n    this._cacheMap.clear();\n\n    const stream = this.stream;\n    stream.pos = 0;\n    const buffer = stream.getBytes(),\n      bufferStr = bytesToString(buffer),\n      length = buffer.length;\n    let position = stream.start;\n    const trailers = [],\n      xrefStms = [];\n    while (position < length) {\n      let ch = buffer[position];\n      if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {\n        ++position;\n        continue;\n      }\n      if (ch === PERCENT) {\n        // %-comment\n        do {\n          ++position;\n          if (position >= length) {\n            break;\n          }\n          ch = buffer[position];\n        } while (ch !== LF && ch !== CR);\n        continue;\n      }\n      const token = readToken(buffer, position);\n      let m;\n      if (\n        token.startsWith(\"xref\") &&\n        (token.length === 4 || /\\s/.test(token[4]))\n      ) {\n        position += skipUntil(buffer, position, trailerBytes);\n        trailers.push(position);\n        position += skipUntil(buffer, position, startxrefBytes);\n      } else if ((m = objRegExp.exec(token))) {\n        const num = m[1] | 0,\n          gen = m[2] | 0;\n\n        const startPos = position + token.length;\n        let contentLength,\n          updateEntries = false;\n        if (!this.entries[num]) {\n          updateEntries = true;\n        } else if (this.entries[num].gen === gen) {\n          // Before overwriting an existing entry, ensure that the new one won't\n          // cause *immediate* errors when it's accessed (fixes issue13783.pdf).\n          try {\n            const parser = new Parser({\n              lexer: new Lexer(stream.makeSubStream(startPos)),\n            });\n            parser.getObj();\n            updateEntries = true;\n          } catch (ex) {\n            if (ex instanceof ParserEOFException) {\n              warn(`indexObjects -- checking object (${token}): \"${ex}\".`);\n            } else {\n              // The error may come from the `Parser`-instance being initialized\n              // without an `XRef`-instance (we don't have a usable one yet).\n              updateEntries = true;\n            }\n          }\n        }\n        if (updateEntries) {\n          this.entries[num] = {\n            offset: position - stream.start,\n            gen,\n            uncompressed: true,\n          };\n        }\n\n        // Find the next \"obj\" string, rather than \"endobj\", to ensure that\n        // we won't skip over a new 'obj' operator in corrupt files where\n        // 'endobj' operators are missing (fixes issue9105_reduced.pdf).\n        gEndobjRegExp.lastIndex = startPos;\n        const match = gEndobjRegExp.exec(bufferStr);\n\n        if (match) {\n          const endPos = gEndobjRegExp.lastIndex + 1;\n          contentLength = endPos - position;\n\n          if (match[1] !== \"endobj\") {\n            warn(\n              `indexObjects: Found \"${match[1]}\" inside of another \"obj\", ` +\n                'caused by missing \"endobj\" -- trying to recover.'\n            );\n            contentLength -= match[1].length + 1;\n          }\n        } else {\n          contentLength = length - position;\n        }\n        const content = buffer.subarray(position, position + contentLength);\n\n        // checking XRef stream suspect\n        // (it shall have '/XRef' and next char is not a letter)\n        const xrefTagOffset = skipUntil(content, 0, xrefBytes);\n        if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {\n          xrefStms.push(position - stream.start);\n          this._xrefStms.add(position - stream.start); // Avoid recursion\n        }\n\n        position += contentLength;\n      } else if (\n        token.startsWith(\"trailer\") &&\n        (token.length === 7 || /\\s/.test(token[7]))\n      ) {\n        trailers.push(position);\n\n        const startPos = position + token.length;\n        let contentLength;\n        // Attempt to handle (some) corrupt documents, where no 'startxref'\n        // operators are present (fixes issue15590.pdf).\n        gStartxrefRegExp.lastIndex = startPos;\n        const match = gStartxrefRegExp.exec(bufferStr);\n\n        if (match) {\n          const endPos = gStartxrefRegExp.lastIndex + 1;\n          contentLength = endPos - position;\n\n          if (match[1] !== \"startxref\") {\n            warn(\n              `indexObjects: Found \"${match[1]}\" after \"trailer\", ` +\n                'caused by missing \"startxref\" -- trying to recover.'\n            );\n            contentLength -= match[1].length + 1;\n          }\n        } else {\n          contentLength = length - position;\n        }\n        position += contentLength;\n      } else {\n        position += token.length + 1;\n      }\n    }\n    // reading XRef streams\n    for (const xrefStm of xrefStms) {\n      this.startXRefQueue.push(xrefStm);\n      this.readXRef(/* recoveryMode */ true);\n    }\n\n    const trailerDicts = [];\n    // Pre-parsing the trailers to check if the document is possibly encrypted.\n    let isEncrypted = false;\n    for (const trailer of trailers) {\n      stream.pos = trailer;\n      const parser = new Parser({\n        lexer: new Lexer(stream),\n        xref: this,\n        allowStreams: true,\n        recoveryMode: true,\n      });\n      const obj = parser.getObj();\n      if (!isCmd(obj, \"trailer\")) {\n        continue;\n      }\n      // read the trailer dictionary\n      const dict = parser.getObj();\n      if (!(dict instanceof Dict)) {\n        continue;\n      }\n      trailerDicts.push(dict);\n\n      if (dict.has(\"Encrypt\")) {\n        isEncrypted = true;\n      }\n    }\n\n    // finding main trailer\n    let trailerDict, trailerError;\n    for (const dict of [...trailerDicts, \"genFallback\", ...trailerDicts]) {\n      if (dict === \"genFallback\") {\n        if (!trailerError) {\n          break; // No need to fallback if there were no validation errors.\n        }\n        this._generationFallback = true;\n        continue;\n      }\n      // Do some basic validation of the trailer/root dictionary candidate.\n      let validPagesDict = false;\n      try {\n        const rootDict = dict.get(\"Root\");\n        if (!(rootDict instanceof Dict)) {\n          continue;\n        }\n        const pagesDict = rootDict.get(\"Pages\");\n        if (!(pagesDict instanceof Dict)) {\n          continue;\n        }\n        const pagesCount = pagesDict.get(\"Count\");\n        if (Number.isInteger(pagesCount)) {\n          validPagesDict = true;\n        }\n        // The top-level /Pages dictionary isn't obviously corrupt.\n      } catch (ex) {\n        trailerError = ex;\n        continue;\n      }\n      // taking the first one with 'ID'\n      if (\n        validPagesDict &&\n        (!isEncrypted || dict.has(\"Encrypt\")) &&\n        dict.has(\"ID\")\n      ) {\n        return dict;\n      }\n      // The current dictionary is a candidate, but continue searching.\n      trailerDict = dict;\n    }\n    // No trailer with 'ID', taking last one (if exists).\n    if (trailerDict) {\n      return trailerDict;\n    }\n    // No trailer dictionary found, taking the \"top\"-dictionary (if exists).\n    if (this.topDict) {\n      return this.topDict;\n    }\n\n    // When no trailer dictionary candidate exists, try picking the first\n    // dictionary that contains a /Root entry (fixes issue18986.pdf).\n    if (!trailerDicts.length) {\n      // In case, this.entries is a sparse array we don't want to\n      // iterate over empty entries so we use the `in` operator instead of\n      // using for..of on entries() or a for with the array length.\n      for (const num in this.entries) {\n        const entry = this.entries[num];\n        if (!entry) {\n          continue;\n        }\n        const ref = Ref.get(parseInt(num, 10), entry.gen);\n        let obj;\n\n        try {\n          obj = this.fetch(ref);\n        } catch {\n          continue;\n        }\n        if (obj instanceof BaseStream) {\n          obj = obj.dict;\n        }\n        if (obj instanceof Dict && obj.has(\"Root\")) {\n          return obj;\n        }\n      }\n    }\n\n    // nothing helps\n    throw new InvalidPDFException(\"Invalid PDF structure.\");\n  }\n\n  readXRef(recoveryMode = false) {\n    const stream = this.stream;\n    // Keep track of already parsed XRef tables, to prevent an infinite loop\n    // when parsing corrupt PDF files where e.g. the /Prev entries create a\n    // circular dependency between tables (fixes bug1393476.pdf).\n    const startXRefParsedCache = new Set();\n\n    while (this.startXRefQueue.length) {\n      try {\n        const startXRef = this.startXRefQueue[0];\n\n        if (startXRefParsedCache.has(startXRef)) {\n          warn(\"readXRef - skipping XRef table since it was already parsed.\");\n          this.startXRefQueue.shift();\n          continue;\n        }\n        startXRefParsedCache.add(startXRef);\n\n        stream.pos = startXRef + stream.start;\n\n        const parser = new Parser({\n          lexer: new Lexer(stream),\n          xref: this,\n          allowStreams: true,\n        });\n        let obj = parser.getObj();\n        let dict;\n\n        // Get dictionary\n        if (isCmd(obj, \"xref\")) {\n          // Parse end-of-file XRef\n          dict = this.processXRefTable(parser);\n          if (!this.topDict) {\n            this.topDict = dict;\n          }\n\n          // Recursively get other XRefs 'XRefStm', if any\n          obj = dict.get(\"XRefStm\");\n          if (Number.isInteger(obj) && !this._xrefStms.has(obj)) {\n            // ignore previously loaded xref streams\n            // (possible infinite recursion)\n            this._xrefStms.add(obj);\n            this.startXRefQueue.push(obj);\n          }\n        } else if (Number.isInteger(obj)) {\n          // Parse in-stream XRef\n          if (\n            !Number.isInteger(parser.getObj()) ||\n            !isCmd(parser.getObj(), \"obj\") ||\n            !((obj = parser.getObj()) instanceof BaseStream)\n          ) {\n            throw new FormatError(\"Invalid XRef stream\");\n          }\n          dict = this.processXRefStream(obj);\n          if (!this.topDict) {\n            this.topDict = dict;\n          }\n          if (!dict) {\n            throw new FormatError(\"Failed to read XRef stream\");\n          }\n        } else {\n          throw new FormatError(\"Invalid XRef stream header\");\n        }\n\n        // Recursively get previous dictionary, if any\n        obj = dict.get(\"Prev\");\n        if (Number.isInteger(obj)) {\n          this.startXRefQueue.push(obj);\n        } else if (obj instanceof Ref) {\n          // The spec says Prev must not be a reference, i.e. \"/Prev NNN\"\n          // This is a fallback for non-compliant PDFs, i.e. \"/Prev NNN 0 R\"\n          this.startXRefQueue.push(obj.num);\n        }\n      } catch (e) {\n        if (e instanceof MissingDataException) {\n          throw e;\n        }\n        info(\"(while reading XRef): \" + e);\n      }\n      this.startXRefQueue.shift();\n    }\n\n    if (this.topDict) {\n      return this.topDict;\n    }\n    if (recoveryMode) {\n      return undefined;\n    }\n    throw new XRefParseException();\n  }\n\n  getEntry(i) {\n    const xrefEntry = this.entries[i];\n    if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {\n      return xrefEntry;\n    }\n    return null;\n  }\n\n  fetchIfRef(obj, suppressEncryption = false) {\n    if (obj instanceof Ref) {\n      return this.fetch(obj, suppressEncryption);\n    }\n    return obj;\n  }\n\n  fetch(ref, suppressEncryption = false) {\n    if (!(ref instanceof Ref)) {\n      throw new Error(\"ref object is not a reference\");\n    }\n    const num = ref.num;\n\n    // The XRef cache is populated with objects which are obtained through\n    // `Parser.getObj`, and indirectly via `Lexer.getObj`. Neither of these\n    // methods should ever return `undefined` (note the `assert` calls below).\n    const cacheEntry = this._cacheMap.get(num);\n    if (cacheEntry !== undefined) {\n      // In documents with Object Streams, it's possible that cached `Dict`s\n      // have not been assigned an `objId` yet (see e.g. issue3115r.pdf).\n      if (cacheEntry instanceof Dict && !cacheEntry.objId) {\n        cacheEntry.objId = ref.toString();\n      }\n      return cacheEntry;\n    }\n    let xrefEntry = this.getEntry(num);\n\n    if (xrefEntry === null) {\n      // The referenced entry can be free.\n      return xrefEntry;\n    }\n    // Prevent circular references, in corrupt PDF documents, from hanging the\n    // worker-thread. This relies, implicitly, on the parsing being synchronous.\n    if (this._pendingRefs.has(ref)) {\n      this._pendingRefs.remove(ref);\n\n      warn(`Ignoring circular reference: ${ref}.`);\n      return CIRCULAR_REF;\n    }\n    this._pendingRefs.put(ref);\n\n    try {\n      xrefEntry = xrefEntry.uncompressed\n        ? this.fetchUncompressed(ref, xrefEntry, suppressEncryption)\n        : this.fetchCompressed(ref, xrefEntry, suppressEncryption);\n      this._pendingRefs.remove(ref);\n    } catch (ex) {\n      this._pendingRefs.remove(ref);\n      throw ex;\n    }\n    if (xrefEntry instanceof Dict) {\n      xrefEntry.objId = ref.toString();\n    } else if (xrefEntry instanceof BaseStream) {\n      xrefEntry.dict.objId = ref.toString();\n    }\n    return xrefEntry;\n  }\n\n  fetchUncompressed(ref, xrefEntry, suppressEncryption = false) {\n    const gen = ref.gen;\n    let num = ref.num;\n    if (xrefEntry.gen !== gen) {\n      const msg = `Inconsistent generation in XRef: ${ref}`;\n      // Try falling back to a *previous* generation (fixes issue15577.pdf).\n      if (this._generationFallback && xrefEntry.gen < gen) {\n        warn(msg);\n        return this.fetchUncompressed(\n          Ref.get(num, xrefEntry.gen),\n          xrefEntry,\n          suppressEncryption\n        );\n      }\n      throw new XRefEntryException(msg);\n    }\n    const stream = this.stream.makeSubStream(\n      xrefEntry.offset + this.stream.start\n    );\n    const parser = new Parser({\n      lexer: new Lexer(stream),\n      xref: this,\n      allowStreams: true,\n    });\n    const obj1 = parser.getObj();\n    const obj2 = parser.getObj();\n    const obj3 = parser.getObj();\n\n    if (obj1 !== num || obj2 !== gen || !(obj3 instanceof Cmd)) {\n      throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);\n    }\n    if (obj3.cmd !== \"obj\") {\n      // some bad PDFs use \"obj1234\" and really mean 1234\n      if (obj3.cmd.startsWith(\"obj\")) {\n        num = parseInt(obj3.cmd.substring(3), 10);\n        if (!Number.isNaN(num)) {\n          return num;\n        }\n      }\n      throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);\n    }\n    xrefEntry =\n      this.encrypt && !suppressEncryption\n        ? parser.getObj(this.encrypt.createCipherTransform(num, gen))\n        : parser.getObj();\n    if (!(xrefEntry instanceof BaseStream)) {\n      if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n        assert(\n          xrefEntry !== undefined,\n          'fetchUncompressed: The \"xrefEntry\" cannot be undefined.'\n        );\n      }\n      this._cacheMap.set(num, xrefEntry);\n    }\n    return xrefEntry;\n  }\n\n  fetchCompressed(ref, xrefEntry, suppressEncryption = false) {\n    const tableOffset = xrefEntry.offset;\n    const stream = this.fetch(Ref.get(tableOffset, 0));\n    if (!(stream instanceof BaseStream)) {\n      throw new FormatError(\"bad ObjStm stream\");\n    }\n    const first = stream.dict.get(\"First\");\n    const n = stream.dict.get(\"N\");\n    if (!Number.isInteger(first) || !Number.isInteger(n)) {\n      throw new FormatError(\"invalid first and n parameters for ObjStm stream\");\n    }\n    let parser = new Parser({\n      lexer: new Lexer(stream),\n      xref: this,\n      allowStreams: true,\n    });\n    const nums = new Array(n);\n    const offsets = new Array(n);\n    // read the object numbers to populate cache\n    for (let i = 0; i < n; ++i) {\n      const num = parser.getObj();\n      if (!Number.isInteger(num)) {\n        throw new FormatError(\n          `invalid object number in the ObjStm stream: ${num}`\n        );\n      }\n      const offset = parser.getObj();\n      if (!Number.isInteger(offset)) {\n        throw new FormatError(\n          `invalid object offset in the ObjStm stream: ${offset}`\n        );\n      }\n      nums[i] = num;\n\n      // The entry in the xref table is the object number followed by the index.\n      // So if index (gen number) is not the same as the index (i), we fix it\n      // (fixes bug 1978317).\n      const entry = this.getEntry(num);\n      if (entry?.offset === tableOffset && entry.gen !== i) {\n        entry.gen = i;\n      }\n\n      offsets[i] = offset;\n    }\n\n    const start = (stream.start || 0) + first;\n    const entries = new Array(n);\n    // read stream objects for cache\n    for (let i = 0; i < n; ++i) {\n      const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined;\n      if (length < 0) {\n        throw new FormatError(\"Invalid offset in the ObjStm stream.\");\n      }\n      parser = new Parser({\n        lexer: new Lexer(\n          stream.makeSubStream(start + offsets[i], length, stream.dict)\n        ),\n        xref: this,\n        allowStreams: true,\n      });\n\n      const obj = parser.getObj();\n      entries[i] = obj;\n      if (obj instanceof BaseStream) {\n        continue;\n      }\n      const num = nums[i],\n        entry = this.entries[num];\n      if (entry && entry.offset === tableOffset && entry.gen === i) {\n        if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n          assert(\n            obj !== undefined,\n            'fetchCompressed: The \"obj\" cannot be undefined.'\n          );\n        }\n        this._cacheMap.set(num, obj);\n      }\n    }\n    xrefEntry = entries[xrefEntry.gen];\n    if (xrefEntry === undefined) {\n      throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`);\n    }\n    return xrefEntry;\n  }\n\n  async fetchIfRefAsync(obj, suppressEncryption) {\n    if (obj instanceof Ref) {\n      return this.fetchAsync(obj, suppressEncryption);\n    }\n    return obj;\n  }\n\n  async fetchAsync(ref, suppressEncryption) {\n    try {\n      return this.fetch(ref, suppressEncryption);\n    } catch (ex) {\n      if (!(ex instanceof MissingDataException)) {\n        throw ex;\n      }\n      await this.pdfManager.requestRange(ex.begin, ex.end);\n      return this.fetchAsync(ref, suppressEncryption);\n    }\n  }\n\n  getCatalogObj() {\n    return this.root;\n  }\n}\n\nexport { XRef };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorPrefix,\n  assert,\n  FormatError,\n  info,\n  InvalidPDFException,\n  isArrayEqual,\n  makeArr,\n  objectSize,\n  PageActionEventType,\n  RenderingIntentFlag,\n  shadow,\n  stringToBytes,\n  stringToUTF8String,\n  unreachable,\n  Util,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  AnnotationFactory,\n  PopupAnnotation,\n  WidgetAnnotation,\n} from \"./annotation.js\";\nimport {\n  collectActions,\n  getInheritableProperty,\n  getNewAnnotationsMap,\n  isWhiteSpace,\n  lookupNormalRect,\n  MissingDataException,\n  PDF_VERSION_REGEXP,\n  RESOURCES_KEYS_OPERATOR_LIST,\n  RESOURCES_KEYS_TEXT_CONTENT,\n  validateCSSFont,\n  XRefEntryException,\n  XRefParseException,\n} from \"./core_utils.js\";\nimport {\n  Dict,\n  isName,\n  isRefsEqual,\n  Name,\n  Ref,\n  RefSet,\n  RefSetCache,\n} from \"./primitives.js\";\nimport { FunctionType, PDFFunctionFactory } from \"./function.js\";\nimport { getXfaFontDict, getXfaFontName } from \"./xfa_fonts.js\";\nimport { NullStream, Stream } from \"./stream.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { calculateMD5 } from \"./calculate_md5.js\";\nimport { Catalog } from \"./catalog.js\";\nimport { clearGlobalCaches } from \"./cleanup_helper.js\";\nimport { DatasetReader } from \"./dataset_reader.js\";\nimport { Intersector } from \"./intersector.js\";\nimport { Linearization } from \"./parser.js\";\nimport { LocalColorSpaceCache } from \"./image_utils.js\";\nimport { ObjectLoader } from \"./object_loader.js\";\nimport { OperatorList } from \"./operator_list.js\";\nimport { PartialEvaluator } from \"./evaluator.js\";\nimport { PDFImage } from \"./image.js\";\nimport { StreamsSequenceStream } from \"./decode_stream.js\";\nimport { stringToPDFString } from \"./string_utils.js\";\nimport { StructTreePage } from \"./struct_tree.js\";\nimport { XFAFactory } from \"./xfa/factory.js\";\nimport { XRef } from \"./xref.js\";\n\nconst LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];\n\nclass Page {\n  #resourcesPromise = null;\n\n  constructor({\n    pdfManager,\n    xref,\n    pageIndex,\n    pageDict,\n    ref,\n    globalIdFactory,\n    fontCache,\n    builtInCMapCache,\n    standardFontDataCache,\n    globalColorSpaceCache,\n    globalImageCache,\n    systemFontCache,\n    nonBlendModesSet,\n    xfaFactory,\n  }) {\n    this.pdfManager = pdfManager;\n    this.pageIndex = pageIndex;\n    this.pageDict = pageDict;\n    this.xref = xref;\n    this.ref = ref;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.standardFontDataCache = standardFontDataCache;\n    this.globalColorSpaceCache = globalColorSpaceCache;\n    this.globalImageCache = globalImageCache;\n    this.systemFontCache = systemFontCache;\n    this.nonBlendModesSet = nonBlendModesSet;\n    this.evaluatorOptions = pdfManager.evaluatorOptions;\n    this.xfaFactory = xfaFactory;\n\n    const idCounters = {\n      obj: 0,\n    };\n    this._localIdFactory = class extends globalIdFactory {\n      static createObjId() {\n        return `p${pageIndex}_${++idCounters.obj}`;\n      }\n\n      static getPageObjId() {\n        return `p${ref.toString()}`;\n      }\n    };\n  }\n\n  #createPartialEvaluator(handler, pageIndex = this.pageIndex) {\n    // The pageIndex is used to identify the page some objects (like images)\n    // belong to.\n\n    return new PartialEvaluator({\n      xref: this.xref,\n      handler,\n      pageIndex,\n      idFactory: this._localIdFactory,\n      fontCache: this.fontCache,\n      builtInCMapCache: this.builtInCMapCache,\n      standardFontDataCache: this.standardFontDataCache,\n      globalColorSpaceCache: this.globalColorSpaceCache,\n      globalImageCache: this.globalImageCache,\n      systemFontCache: this.systemFontCache,\n      options: this.evaluatorOptions,\n    });\n  }\n\n  createAnnotationEvaluator(handler) {\n    return this.#createPartialEvaluator(handler);\n  }\n\n  #getInheritableProperty(key, getArray = false) {\n    const value = getInheritableProperty({\n      dict: this.pageDict,\n      key,\n      getArray,\n      stopWhenFound: false,\n    });\n    if (!Array.isArray(value)) {\n      return value;\n    }\n    if (value.length === 1 || !(value[0] instanceof Dict)) {\n      return value[0];\n    }\n    return Dict.merge({ xref: this.xref, dictArray: value });\n  }\n\n  get content() {\n    return this.pageDict.getArray(\"Contents\");\n  }\n\n  get resources() {\n    // For robustness: The spec states that a \\Resources entry has to be\n    // present, but can be empty. Some documents still omit it; in this case\n    // we return an empty dictionary.\n    const resources = this.#getInheritableProperty(\"Resources\");\n\n    return shadow(\n      this,\n      \"resources\",\n      resources instanceof Dict ? resources : Dict.empty\n    );\n  }\n\n  getBoundingBox(name) {\n    if (this.xfaData) {\n      return this.xfaData.bbox;\n    }\n    const box = lookupNormalRect(\n      this.#getInheritableProperty(name, /* getArray = */ true),\n      null\n    );\n\n    if (box) {\n      if (box[2] - box[0] > 0 && box[3] - box[1] > 0) {\n        return box;\n      }\n      warn(`Empty, or invalid, /${name} entry.`);\n    }\n    return null;\n  }\n\n  get mediaBox() {\n    // Reset invalid media box to letter size.\n    return shadow(\n      this,\n      \"mediaBox\",\n      this.getBoundingBox(\"MediaBox\") || LETTER_SIZE_MEDIABOX\n    );\n  }\n\n  get cropBox() {\n    // Reset invalid crop box to media box.\n    return shadow(\n      this,\n      \"cropBox\",\n      this.getBoundingBox(\"CropBox\") || this.mediaBox\n    );\n  }\n\n  get userUnit() {\n    const obj = this.pageDict.get(\"UserUnit\");\n    return shadow(\n      this,\n      \"userUnit\",\n      typeof obj === \"number\" && obj > 0 ? obj : 1.0\n    );\n  }\n\n  get view() {\n    // From the spec, 6th ed., p.963:\n    // \"The crop, bleed, trim, and art boxes should not ordinarily\n    // extend beyond the boundaries of the media box. If they do, they are\n    // effectively reduced to their intersection with the media box.\"\n    const { cropBox, mediaBox } = this;\n\n    if (cropBox !== mediaBox && !isArrayEqual(cropBox, mediaBox)) {\n      const box = Util.intersect(cropBox, mediaBox);\n      if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) {\n        return shadow(this, \"view\", box);\n      }\n      warn(\"Empty /CropBox and /MediaBox intersection.\");\n    }\n    return shadow(this, \"view\", mediaBox);\n  }\n\n  get rotate() {\n    let rotate = this.#getInheritableProperty(\"Rotate\") || 0;\n\n    // Normalize rotation so it's a multiple of 90 and between 0 and 270.\n    if (rotate % 90 !== 0) {\n      rotate = 0;\n    } else if (rotate >= 360) {\n      rotate %= 360;\n    } else if (rotate < 0) {\n      // The spec doesn't cover negatives. Assume it's counterclockwise\n      // rotation. The following is the other implementation of modulo.\n      rotate = ((rotate % 360) + 360) % 360;\n    }\n    return shadow(this, \"rotate\", rotate);\n  }\n\n  #onSubStreamError(reason, objId) {\n    if (this.evaluatorOptions.ignoreErrors) {\n      warn(`getContentStream - ignoring sub-stream (${objId}): \"${reason}\".`);\n      return;\n    }\n    throw reason;\n  }\n\n  /**\n   * @returns {Promise<BaseStream>}\n   */\n  async getContentStream() {\n    const content = await this.pdfManager.ensure(this, \"content\");\n\n    if (content instanceof BaseStream && !content.isImageStream) {\n      if (content.isAsync) {\n        const bytes = await content.asyncGetBytes();\n        if (bytes) {\n          return new Stream(bytes, 0, bytes.length, content.dict);\n        }\n      }\n      return content;\n    }\n    if (Array.isArray(content)) {\n      const promises = [];\n      for (let i = 0, ii = content.length; i < ii; i++) {\n        const item = content[i];\n        if (item instanceof BaseStream && item.isAsync) {\n          promises.push(\n            item.asyncGetBytes().then(bytes => {\n              if (bytes) {\n                content[i] = new Stream(bytes, 0, bytes.length, item.dict);\n              }\n            })\n          );\n        }\n      }\n      if (promises.length > 0) {\n        await Promise.all(promises);\n      }\n      return new StreamsSequenceStream(\n        content,\n        this.#onSubStreamError.bind(this)\n      );\n    }\n    // Replace non-existent page content with empty content.\n    return new NullStream();\n  }\n\n  get xfaData() {\n    return shadow(\n      this,\n      \"xfaData\",\n      this.xfaFactory\n        ? { bbox: this.xfaFactory.getBoundingBox(this.pageIndex) }\n        : null\n    );\n  }\n\n  async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) {\n    const promises = [];\n    for (const annotation of annotations) {\n      if (annotation.id) {\n        const ref = Ref.fromString(annotation.id);\n        if (!ref) {\n          warn(`A non-linked annotation cannot be modified: ${annotation.id}`);\n          continue;\n        }\n        if (annotation.deleted) {\n          deletedAnnotations.put(ref, ref);\n          if (annotation.popupRef) {\n            const popupRef = Ref.fromString(annotation.popupRef);\n            if (popupRef) {\n              deletedAnnotations.put(popupRef, popupRef);\n            }\n          }\n          continue;\n        }\n        if (annotation.popup?.deleted) {\n          const popupRef = Ref.fromString(annotation.popupRef);\n          if (popupRef) {\n            deletedAnnotations.put(popupRef, popupRef);\n          }\n        }\n        existingAnnotations?.put(ref);\n        annotation.ref = ref;\n        promises.push(\n          this.xref.fetchAsync(ref).then(\n            obj => {\n              if (obj instanceof Dict) {\n                annotation.oldAnnotation = obj.clone();\n              }\n            },\n            () => {\n              warn(`Cannot fetch \\`oldAnnotation\\` for: ${ref}.`);\n            }\n          )\n        );\n        delete annotation.id;\n      }\n    }\n    await Promise.all(promises);\n  }\n\n  async saveNewAnnotations(handler, task, annotations, imagePromises, changes) {\n    if (this.xfaFactory) {\n      throw new Error(\"XFA: Cannot save new annotations.\");\n    }\n    const partialEvaluator = this.#createPartialEvaluator(handler);\n\n    const deletedAnnotations = new RefSetCache();\n    const existingAnnotations = new RefSet();\n    await this.#replaceIdByRef(\n      annotations,\n      deletedAnnotations,\n      existingAnnotations\n    );\n\n    const pageDict = this.pageDict;\n    const annotationsArray = this.annotations.filter(\n      a => !(a instanceof Ref && deletedAnnotations.has(a))\n    );\n    const newData = await AnnotationFactory.saveNewAnnotations(\n      partialEvaluator,\n      this.xref,\n      task,\n      annotations,\n      imagePromises,\n      changes\n    );\n\n    for (const { ref } of newData.annotations) {\n      // Don't add an existing annotation ref to the annotations array.\n      if (ref instanceof Ref && !existingAnnotations.has(ref)) {\n        annotationsArray.push(ref);\n      }\n    }\n\n    const dict = pageDict.clone();\n    dict.set(\"Annots\", annotationsArray);\n    changes.put(this.ref, {\n      data: dict,\n    });\n\n    for (const deletedRef of deletedAnnotations) {\n      changes.put(deletedRef, {\n        data: null,\n      });\n    }\n  }\n\n  async save(handler, task, annotationStorage, changes) {\n    const partialEvaluator = this.#createPartialEvaluator(handler);\n\n    // Fetch the page's annotations and save the content\n    // in case of interactive form fields.\n    const annotations = await this._parsedAnnotations;\n\n    const promises = [];\n    for (const annotation of annotations) {\n      promises.push(\n        annotation\n          .save(partialEvaluator, task, annotationStorage, changes)\n          .catch(function (reason) {\n            warn(\n              \"save - ignoring annotation data during \" +\n                `\"${task.name}\" task: \"${reason}\".`\n            );\n            return null;\n          })\n      );\n    }\n    return Promise.all(promises);\n  }\n\n  async loadResources(keys) {\n    // TODO: add async `#getInheritableProperty` and remove this.\n    await (this.#resourcesPromise ??= this.pdfManager.ensure(\n      this,\n      \"resources\"\n    ));\n\n    await ObjectLoader.load(this.resources, keys, this.xref);\n  }\n\n  async #getMergedResources(streamDict, keys) {\n    // In rare cases /Resources are also found in the /Contents stream-dict,\n    // in addition to in the /Page dict, hence we need to prefer those when\n    // available (see issue18894.pdf).\n    const localResources = streamDict?.get(\"Resources\");\n\n    if (!(localResources instanceof Dict && localResources.size)) {\n      return this.resources;\n    }\n    await ObjectLoader.load(localResources, keys, this.xref);\n\n    return Dict.merge({\n      xref: this.xref,\n      dictArray: [localResources, this.resources],\n      mergeSubDicts: true,\n    });\n  }\n\n  async getOperatorList({\n    handler,\n    sink,\n    task,\n    intent,\n    cacheKey,\n    pageIndex = this.pageIndex,\n    annotationStorage = null,\n    modifiedIds = null,\n  }) {\n    const contentStreamPromise = this.getContentStream();\n    const resourcesPromise = this.loadResources(RESOURCES_KEYS_OPERATOR_LIST);\n\n    const partialEvaluator = this.#createPartialEvaluator(handler, pageIndex);\n\n    const newAnnotsByPage = !this.xfaFactory\n      ? getNewAnnotationsMap(annotationStorage)\n      : null;\n    const newAnnots = newAnnotsByPage?.get(this.pageIndex);\n    let newAnnotationsPromise = Promise.resolve(null);\n    let deletedAnnotations = null;\n\n    if (newAnnots) {\n      const annotationGlobalsPromise =\n        this.pdfManager.ensureDoc(\"annotationGlobals\");\n      let imagePromises;\n\n      // An annotation can contain a reference to a bitmap, but this bitmap\n      // is defined in another annotation. So we need to find this annotation\n      // and generate the bitmap.\n      const missingBitmaps = new Set();\n      for (const { bitmapId, bitmap } of newAnnots) {\n        if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) {\n          missingBitmaps.add(bitmapId);\n        }\n      }\n\n      const { isOffscreenCanvasSupported } = this.evaluatorOptions;\n      if (missingBitmaps.size > 0) {\n        const annotationWithBitmaps = newAnnots.slice();\n        for (const [key, annotation] of annotationStorage) {\n          if (!key.startsWith(AnnotationEditorPrefix)) {\n            continue;\n          }\n          if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) {\n            annotationWithBitmaps.push(annotation);\n          }\n        }\n        // The array annotationWithBitmaps cannot be empty: the check above\n        // makes sure to have at least one annotation containing the bitmap.\n        imagePromises = AnnotationFactory.generateImages(\n          annotationWithBitmaps,\n          this.xref,\n          isOffscreenCanvasSupported\n        );\n      } else {\n        imagePromises = AnnotationFactory.generateImages(\n          newAnnots,\n          this.xref,\n          isOffscreenCanvasSupported\n        );\n      }\n\n      deletedAnnotations = new RefSet();\n\n      newAnnotationsPromise = Promise.all([\n        annotationGlobalsPromise,\n        this.#replaceIdByRef(newAnnots, deletedAnnotations, null),\n      ]).then(([annotationGlobals]) => {\n        if (!annotationGlobals) {\n          return null;\n        }\n\n        return AnnotationFactory.printNewAnnotations(\n          annotationGlobals,\n          partialEvaluator,\n          task,\n          newAnnots,\n          imagePromises\n        );\n      });\n    }\n\n    const pageListPromise = Promise.all([\n      contentStreamPromise,\n      resourcesPromise,\n    ]).then(async ([contentStream]) => {\n      const resources = await this.#getMergedResources(\n        contentStream.dict,\n        RESOURCES_KEYS_OPERATOR_LIST\n      );\n      const opList = new OperatorList(intent, sink);\n      handler.send(\"StartRenderPage\", {\n        transparency: partialEvaluator.hasBlendModes(\n          resources,\n          this.nonBlendModesSet\n        ),\n        pageIndex,\n        cacheKey,\n      });\n\n      await partialEvaluator.getOperatorList({\n        stream: contentStream,\n        task,\n        resources,\n        operatorList: opList,\n      });\n      return opList;\n    });\n\n    // Fetch the page's annotations and add their operator lists to the\n    // page's operator list to render them.\n    // eslint-disable-next-line prefer-const\n    let [pageOpList, annotations, newAnnotations] = await Promise.all([\n      pageListPromise,\n      this._parsedAnnotations,\n      newAnnotationsPromise,\n    ]);\n\n    if (newAnnotations) {\n      // Some annotations can already exist (if it has the refToReplace\n      // property). In this case, we replace the old annotation by the new one.\n      annotations = annotations.filter(\n        a => !(a.ref && deletedAnnotations.has(a.ref))\n      );\n      for (let i = 0, ii = newAnnotations.length; i < ii; i++) {\n        const newAnnotation = newAnnotations[i];\n        if (newAnnotation.refToReplace) {\n          const j = annotations.findIndex(\n            a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace)\n          );\n          if (j >= 0) {\n            annotations.splice(j, 1, newAnnotation);\n            newAnnotations.splice(i--, 1);\n            ii--;\n          }\n        }\n      }\n      annotations = annotations.concat(newAnnotations);\n    }\n    if (\n      annotations.length === 0 ||\n      intent & RenderingIntentFlag.ANNOTATIONS_DISABLE\n    ) {\n      pageOpList.flush(/* lastChunk = */ true);\n      return { length: pageOpList.totalLength };\n    }\n    const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS),\n      isEditing = !!(intent & RenderingIntentFlag.IS_EDITING),\n      intentAny = !!(intent & RenderingIntentFlag.ANY),\n      intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY),\n      intentPrint = !!(intent & RenderingIntentFlag.PRINT);\n\n    // Collect the operator list promises for the annotations. Each promise\n    // is resolved with the complete operator list for a single annotation.\n    const opListPromises = [];\n    for (const annotation of annotations) {\n      if (\n        intentAny ||\n        (intentDisplay &&\n          annotation.mustBeViewed(annotationStorage, renderForms) &&\n          annotation.mustBeViewedWhenEditing(isEditing, modifiedIds)) ||\n        (intentPrint && annotation.mustBePrinted(annotationStorage))\n      ) {\n        opListPromises.push(\n          annotation\n            .getOperatorList(partialEvaluator, task, intent, annotationStorage)\n            .catch(function (reason) {\n              warn(\n                \"getOperatorList - ignoring annotation data during \" +\n                  `\"${task.name}\" task: \"${reason}\".`\n              );\n              return {\n                opList: null,\n                separateForm: false,\n                separateCanvas: false,\n              };\n            })\n        );\n      }\n    }\n\n    const opLists = await Promise.all(opListPromises);\n    let form = false,\n      canvas = false;\n\n    for (const { opList, separateForm, separateCanvas } of opLists) {\n      pageOpList.addOpList(opList);\n\n      form ||= separateForm;\n      canvas ||= separateCanvas;\n    }\n    pageOpList.flush(\n      /* lastChunk = */ true,\n      /* separateAnnots = */ { form, canvas }\n    );\n    return { length: pageOpList.totalLength };\n  }\n\n  async extractTextContent({\n    handler,\n    task,\n    includeMarkedContent,\n    disableNormalization,\n    sink,\n    intersector = null,\n  }) {\n    const contentStreamPromise = this.getContentStream();\n    const resourcesPromise = this.loadResources(RESOURCES_KEYS_TEXT_CONTENT);\n    const langPromise = this.pdfManager.ensureCatalog(\"lang\");\n\n    const [contentStream, , lang] = await Promise.all([\n      contentStreamPromise,\n      resourcesPromise,\n      langPromise,\n    ]);\n    const resources = await this.#getMergedResources(\n      contentStream.dict,\n      RESOURCES_KEYS_TEXT_CONTENT\n    );\n\n    const partialEvaluator = this.#createPartialEvaluator(handler);\n\n    return partialEvaluator.getTextContent({\n      stream: contentStream,\n      task,\n      resources,\n      includeMarkedContent,\n      disableNormalization,\n      sink,\n      viewBox: this.view,\n      lang,\n      intersector,\n    });\n  }\n\n  async getStructTree() {\n    const structTreeRoot =\n      await this.pdfManager.ensureCatalog(\"structTreeRoot\");\n    if (!structTreeRoot) {\n      return null;\n    }\n    // Ensure that the structTree will contain the page's annotations.\n    await this._parsedAnnotations;\n\n    try {\n      const structTree = await this.pdfManager.ensure(\n        this,\n        \"_parseStructTree\",\n        [structTreeRoot]\n      );\n      return await this.pdfManager.ensure(structTree, \"serializable\");\n    } catch (ex) {\n      warn(`getStructTree: \"${ex}\".`);\n      return null;\n    }\n  }\n\n  /**\n   * @private\n   */\n  _parseStructTree(structTreeRoot) {\n    const tree = new StructTreePage(structTreeRoot, this.pageDict);\n    tree.parse(this.ref);\n    return tree;\n  }\n\n  async getAnnotationsData(handler, task, intent) {\n    const annotations = await this._parsedAnnotations;\n    if (annotations.length === 0) {\n      return annotations;\n    }\n\n    const annotationsData = [],\n      textContentPromises = [];\n    let partialEvaluator;\n\n    const intentAny = !!(intent & RenderingIntentFlag.ANY),\n      intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY),\n      intentPrint = !!(intent & RenderingIntentFlag.PRINT);\n\n    const highlightedAnnotations = [];\n\n    for (const annotation of annotations) {\n      // Get the annotation even if it's hidden because\n      // JS can change its display.\n      const isVisible = intentAny || (intentDisplay && annotation.viewable);\n      if (isVisible || (intentPrint && annotation.printable)) {\n        annotationsData.push(annotation.data);\n      }\n\n      if (annotation.hasTextContent && isVisible) {\n        partialEvaluator ??= this.#createPartialEvaluator(handler);\n\n        textContentPromises.push(\n          annotation\n            .extractTextContent(partialEvaluator, task, [\n              -Infinity,\n              -Infinity,\n              Infinity,\n              Infinity,\n            ])\n            .catch(function (reason) {\n              warn(\n                `getAnnotationsData - ignoring textContent during \"${task.name}\" task: \"${reason}\".`\n              );\n            })\n        );\n      } else if (annotation.overlaysTextContent && isVisible) {\n        highlightedAnnotations.push(annotation);\n      }\n    }\n\n    if (highlightedAnnotations.length > 0) {\n      const intersector = new Intersector(highlightedAnnotations);\n      textContentPromises.push(\n        this.extractTextContent({\n          handler,\n          task,\n          includeMarkedContent: false,\n          disableNormalization: false,\n          sink: null,\n          intersector,\n        }).then(() => {\n          intersector.setText();\n        })\n      );\n    }\n\n    await Promise.all(textContentPromises);\n    return annotationsData;\n  }\n\n  get annotations() {\n    const annots = this.#getInheritableProperty(\"Annots\");\n    return shadow(this, \"annotations\", Array.isArray(annots) ? annots : []);\n  }\n\n  get _parsedAnnotations() {\n    const promise = this.pdfManager\n      .ensure(this, \"annotations\")\n      .then(async annots => {\n        if (annots.length === 0) {\n          return annots;\n        }\n\n        const [annotationGlobals, fieldObjects] = await Promise.all([\n          this.pdfManager.ensureDoc(\"annotationGlobals\"),\n          this.pdfManager.ensureDoc(\"fieldObjects\"),\n        ]);\n        if (!annotationGlobals) {\n          return [];\n        }\n\n        const orphanFields = fieldObjects?.orphanFields;\n        const annotationPromises = [];\n        for (const annotationRef of annots) {\n          annotationPromises.push(\n            AnnotationFactory.create(\n              this.xref,\n              annotationRef,\n              annotationGlobals,\n              this._localIdFactory,\n              /* collectFields */ false,\n              orphanFields,\n              /* collectByType */ null,\n              this.ref\n            ).catch(function (reason) {\n              warn(`_parsedAnnotations: \"${reason}\".`);\n              return null;\n            })\n          );\n        }\n\n        const sortedAnnotations = [];\n        let popupAnnotations, widgetAnnotations;\n        // Ensure that PopupAnnotations are handled last, since they depend on\n        // their parent Annotation in the display layer; fixes issue 11362.\n        for (const annotation of await Promise.all(annotationPromises)) {\n          if (!annotation) {\n            continue;\n          }\n          if (annotation instanceof WidgetAnnotation) {\n            (widgetAnnotations ||= []).push(annotation);\n            continue;\n          }\n          if (annotation instanceof PopupAnnotation) {\n            (popupAnnotations ||= []).push(annotation);\n            continue;\n          }\n          sortedAnnotations.push(annotation);\n        }\n        if (widgetAnnotations) {\n          sortedAnnotations.push(...widgetAnnotations);\n        }\n        if (popupAnnotations) {\n          sortedAnnotations.push(...popupAnnotations);\n        }\n\n        return sortedAnnotations;\n      });\n\n    return shadow(this, \"_parsedAnnotations\", promise);\n  }\n\n  get jsActions() {\n    const actions = collectActions(\n      this.xref,\n      this.pageDict,\n      PageActionEventType\n    );\n    return shadow(this, \"jsActions\", actions);\n  }\n\n  async collectAnnotationsByType(\n    handler,\n    task,\n    types,\n    promises,\n    annotationGlobals\n  ) {\n    const { pageIndex } = this;\n\n    if (Object.hasOwn(this, \"_parsedAnnotations\")) {\n      const cachedAnnotations = await this._parsedAnnotations;\n      for (const { data } of cachedAnnotations) {\n        if (!types || types.has(data.annotationType)) {\n          data.pageIndex = pageIndex;\n          promises.push(Promise.resolve(data));\n        }\n      }\n      return;\n    }\n\n    const annots = await this.pdfManager.ensure(this, \"annotations\");\n    let partialEvaluator;\n\n    for (const annotationRef of annots) {\n      promises.push(\n        AnnotationFactory.create(\n          this.xref,\n          annotationRef,\n          annotationGlobals,\n          this._localIdFactory,\n          /* collectFields */ false,\n          /* orphanFields */ null,\n          /* collectByType */ types,\n          this.ref\n        )\n          .then(async annotation => {\n            if (!annotation) {\n              return null;\n            }\n            annotation.data.pageIndex = pageIndex;\n            if (annotation.hasTextContent && annotation.viewable) {\n              partialEvaluator ??= this.#createPartialEvaluator(handler);\n\n              await annotation.extractTextContent(partialEvaluator, task, [\n                -Infinity,\n                -Infinity,\n                Infinity,\n                Infinity,\n              ]);\n            }\n            return annotation.data;\n          })\n          .catch(function (reason) {\n            warn(`collectAnnotationsByType: \"${reason}\".`);\n            return null;\n          })\n      );\n    }\n  }\n}\n\nconst PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]);\nconst STARTXREF_SIGNATURE = new Uint8Array([\n  0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66,\n]);\nconst ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]);\n\nfunction find(stream, signature, limit = 1024, backwards = false) {\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n    assert(limit > 0, 'The \"limit\" must be a positive integer.');\n  }\n  const signatureLength = signature.length;\n\n  const scanBytes = stream.peekBytes(limit);\n  const scanLength = scanBytes.length - signatureLength;\n\n  if (scanLength <= 0) {\n    return false;\n  }\n  if (backwards) {\n    const signatureEnd = signatureLength - 1;\n\n    let pos = scanBytes.length - 1;\n    while (pos >= signatureEnd) {\n      let j = 0;\n      while (\n        j < signatureLength &&\n        scanBytes[pos - j] === signature[signatureEnd - j]\n      ) {\n        j++;\n      }\n      if (j >= signatureLength) {\n        // `signature` found.\n        stream.pos += pos - signatureEnd;\n        return true;\n      }\n      pos--;\n    }\n  } else {\n    // forwards\n    let pos = 0;\n    while (pos <= scanLength) {\n      let j = 0;\n      while (j < signatureLength && scanBytes[pos + j] === signature[j]) {\n        j++;\n      }\n      if (j >= signatureLength) {\n        // `signature` found.\n        stream.pos += pos;\n        return true;\n      }\n      pos++;\n    }\n  }\n  return false;\n}\n\n/**\n * The `PDFDocument` class holds all the (worker-thread) data of the PDF file.\n */\nclass PDFDocument {\n  #pagePromises = new Map();\n\n  #version = null;\n\n  constructor(pdfManager, stream) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        stream instanceof BaseStream,\n        'PDFDocument: Invalid \"stream\" argument.'\n      );\n    }\n    if (stream.length <= 0) {\n      throw new InvalidPDFException(\n        \"The PDF file is empty, i.e. its size is zero bytes.\"\n      );\n    }\n\n    this.pdfManager = pdfManager;\n    this.stream = stream;\n    this.xref = new XRef(stream, pdfManager);\n\n    const idCounters = {\n      font: 0,\n    };\n    this._globalIdFactory = class {\n      static getDocId() {\n        return `g_${pdfManager.docId}`;\n      }\n\n      static createFontId() {\n        return `f${++idCounters.font}`;\n      }\n\n      static createObjId() {\n        unreachable(\"Abstract method `createObjId` called.\");\n      }\n\n      static getPageObjId() {\n        unreachable(\"Abstract method `getPageObjId` called.\");\n      }\n    };\n  }\n\n  parse(recoveryMode) {\n    this.xref.parse(recoveryMode);\n    this.catalog = new Catalog(this.pdfManager, this.xref);\n  }\n\n  get linearization() {\n    let linearization = null;\n    try {\n      linearization = Linearization.create(this.stream);\n    } catch (err) {\n      if (err instanceof MissingDataException) {\n        throw err;\n      }\n      info(err);\n    }\n    return shadow(this, \"linearization\", linearization);\n  }\n\n  get startXRef() {\n    const stream = this.stream;\n    let startXRef = 0;\n\n    if (this.linearization) {\n      // Find the end of the first object.\n      stream.reset();\n      if (find(stream, ENDOBJ_SIGNATURE)) {\n        stream.skip(6);\n\n        let ch = stream.peekByte();\n        while (isWhiteSpace(ch)) {\n          stream.pos++;\n          ch = stream.peekByte();\n        }\n        startXRef = stream.pos - stream.start;\n      }\n    } else {\n      // Find `startxref` by checking backwards from the end of the file.\n      const step = 1024;\n      const startXRefLength = STARTXREF_SIGNATURE.length;\n      let found = false,\n        pos = stream.end;\n\n      while (!found && pos > 0) {\n        pos -= step - startXRefLength;\n        if (pos < 0) {\n          pos = 0;\n        }\n        stream.pos = pos;\n        found = find(stream, STARTXREF_SIGNATURE, step, true);\n      }\n\n      if (found) {\n        stream.skip(9);\n        let ch;\n        do {\n          ch = stream.getByte();\n        } while (isWhiteSpace(ch));\n        let str = \"\";\n        while (ch >= /* Space = */ 0x20 && ch <= /* '9' = */ 0x39) {\n          str += String.fromCharCode(ch);\n          ch = stream.getByte();\n        }\n        startXRef = parseInt(str, 10);\n        if (isNaN(startXRef)) {\n          startXRef = 0;\n        }\n      }\n    }\n    return shadow(this, \"startXRef\", startXRef);\n  }\n\n  // Find the header, get the PDF format version and setup the\n  // stream to start from the header.\n  checkHeader() {\n    const stream = this.stream;\n    stream.reset();\n\n    if (!find(stream, PDF_HEADER_SIGNATURE)) {\n      // May not be a PDF file, but don't throw an error and let\n      // parsing continue.\n      return;\n    }\n    stream.moveStart();\n\n    // Skip over the \"%PDF-\" prefix, since it was found above.\n    stream.skip(PDF_HEADER_SIGNATURE.length);\n    // Read the PDF format version.\n    let version = \"\",\n      ch;\n    while (\n      (ch = stream.getByte()) > /* Space = */ 0x20 &&\n      version.length < /* MAX_PDF_VERSION_LENGTH = */ 7\n    ) {\n      version += String.fromCharCode(ch);\n    }\n\n    if (PDF_VERSION_REGEXP.test(version)) {\n      this.#version = version;\n    } else {\n      warn(`Invalid PDF header version: ${version}`);\n    }\n  }\n\n  parseStartXRef() {\n    this.xref.setStartXRef(this.startXRef);\n  }\n\n  get numPages() {\n    let num = 0;\n    if (this.catalog.hasActualNumPages) {\n      num = this.catalog.numPages;\n    } else if (this.xfaFactory) {\n      // num is a Promise.\n      num = this.xfaFactory.getNumPages();\n    } else if (this.linearization) {\n      num = this.linearization.numPages;\n    } else {\n      num = this.catalog.numPages;\n    }\n    return shadow(this, \"numPages\", num);\n  }\n\n  #hasOnlyDocumentSignatures(fields, recursionDepth = 0) {\n    const RECURSION_LIMIT = 10;\n\n    if (!Array.isArray(fields)) {\n      return false;\n    }\n    return fields.every(field => {\n      field = this.xref.fetchIfRef(field);\n      if (!(field instanceof Dict)) {\n        return false;\n      }\n      if (field.has(\"Kids\")) {\n        if (++recursionDepth > RECURSION_LIMIT) {\n          warn(\"#hasOnlyDocumentSignatures: maximum recursion depth reached\");\n          return false;\n        }\n        return this.#hasOnlyDocumentSignatures(\n          field.get(\"Kids\"),\n          recursionDepth\n        );\n      }\n      const isSignature = isName(field.get(\"FT\"), \"Sig\");\n      const rectangle = field.get(\"Rect\");\n      const isInvisible =\n        Array.isArray(rectangle) && rectangle.every(value => value === 0);\n      return isSignature && isInvisible;\n    });\n  }\n\n  get _xfaStreams() {\n    const { acroForm } = this.catalog;\n    if (!acroForm) {\n      return null;\n    }\n\n    const xfa = acroForm.get(\"XFA\");\n    const entries = new Map(\n      [\n        \"xdp:xdp\",\n        \"template\",\n        \"datasets\",\n        \"config\",\n        \"connectionSet\",\n        \"localeSet\",\n        \"stylesheet\",\n        \"/xdp:xdp\",\n      ].map(e => [e, null])\n    );\n    if (xfa instanceof BaseStream && !xfa.isEmpty) {\n      entries.set(\"xdp:xdp\", xfa);\n      return entries;\n    }\n\n    if (!Array.isArray(xfa) || xfa.length === 0) {\n      return null;\n    }\n\n    for (let i = 0, ii = xfa.length; i < ii; i += 2) {\n      let name;\n      if (i === 0) {\n        name = \"xdp:xdp\";\n      } else if (i === ii - 2) {\n        name = \"/xdp:xdp\";\n      } else {\n        name = xfa[i];\n      }\n\n      if (!entries.has(name)) {\n        continue;\n      }\n      const data = this.xref.fetchIfRef(xfa[i + 1]);\n      if (!(data instanceof BaseStream) || data.isEmpty) {\n        continue;\n      }\n      entries.set(name, data);\n    }\n    return entries;\n  }\n\n  get xfaDatasets() {\n    const streams = this._xfaStreams;\n    if (!streams) {\n      return shadow(this, \"xfaDatasets\", null);\n    }\n    for (const key of [\"datasets\", \"xdp:xdp\"]) {\n      const stream = streams.get(key);\n      if (!stream) {\n        continue;\n      }\n      try {\n        const str = stringToUTF8String(stream.getString());\n        const data = { [key]: str };\n        return shadow(this, \"xfaDatasets\", new DatasetReader(data));\n      } catch {\n        warn(\"XFA - Invalid utf-8 string.\");\n        break;\n      }\n    }\n    return shadow(this, \"xfaDatasets\", null);\n  }\n\n  get xfaData() {\n    const streams = this._xfaStreams;\n    if (!streams) {\n      return null;\n    }\n    const data = Object.create(null);\n    for (const [key, stream] of streams) {\n      if (!stream) {\n        continue;\n      }\n      try {\n        data[key] = stringToUTF8String(stream.getString());\n      } catch {\n        warn(\"XFA - Invalid utf-8 string.\");\n        return null;\n      }\n    }\n    return data;\n  }\n\n  get xfaFactory() {\n    let data;\n    if (\n      this.pdfManager.enableXfa &&\n      this.catalog.needsRendering &&\n      this.formInfo.hasXfa &&\n      !this.formInfo.hasAcroForm\n    ) {\n      data = this.xfaData;\n    }\n    return shadow(this, \"xfaFactory\", data ? new XFAFactory(data) : null);\n  }\n\n  get isPureXfa() {\n    return this.xfaFactory ? this.xfaFactory.isValid() : false;\n  }\n\n  get htmlForXfa() {\n    return this.xfaFactory ? this.xfaFactory.getPages() : null;\n  }\n\n  async #loadXfaImages() {\n    const xfaImages = await this.pdfManager.ensureCatalog(\"xfaImages\");\n    if (!xfaImages) {\n      return;\n    }\n    this.xfaFactory.setImages(xfaImages);\n  }\n\n  async #loadXfaFonts(handler, task) {\n    const acroForm = await this.pdfManager.ensureCatalog(\"acroForm\");\n    if (!acroForm) {\n      return;\n    }\n    const resources = await acroForm.getAsync(\"DR\");\n    if (!(resources instanceof Dict)) {\n      return;\n    }\n    await ObjectLoader.load(resources, [\"Font\"], this.xref);\n\n    const fontRes = resources.get(\"Font\");\n    if (!(fontRes instanceof Dict)) {\n      return;\n    }\n\n    const options = Object.assign(\n      Object.create(null),\n      this.pdfManager.evaluatorOptions,\n      { useSystemFonts: false }\n    );\n    const { builtInCMapCache, fontCache, standardFontDataCache } = this.catalog;\n\n    const partialEvaluator = new PartialEvaluator({\n      xref: this.xref,\n      handler,\n      pageIndex: -1,\n      idFactory: this._globalIdFactory,\n      fontCache,\n      builtInCMapCache,\n      standardFontDataCache,\n      options,\n    });\n    const operatorList = new OperatorList();\n    const pdfFonts = [];\n    const initialState = {\n      get font() {\n        return pdfFonts.at(-1);\n      },\n      set font(font) {\n        pdfFonts.push(font);\n      },\n      clone() {\n        return this;\n      },\n    };\n\n    const parseFont = (fontName, fallbackFontDict, cssFontInfo) =>\n      partialEvaluator\n        .handleSetFont(\n          resources,\n          [Name.get(fontName), 1],\n          /* fontRef = */ null,\n          operatorList,\n          task,\n          initialState,\n          fallbackFontDict,\n          cssFontInfo\n        )\n        .catch(reason => {\n          warn(`loadXfaFonts: \"${reason}\".`);\n          return null;\n        });\n\n    const promises = [];\n    for (const [fontName, font] of fontRes) {\n      const descriptor = font.get(\"FontDescriptor\");\n      if (!(descriptor instanceof Dict)) {\n        continue;\n      }\n      let fontFamily = descriptor.get(\"FontFamily\");\n      // For example, \"Wingdings 3\" is not a valid font name in the css specs.\n      fontFamily = fontFamily.replaceAll(/ +(\\d)/g, \"$1\");\n      const fontWeight = descriptor.get(\"FontWeight\");\n\n      // Angle is expressed in degrees counterclockwise in PDF\n      // when it's clockwise in CSS\n      // (see https://drafts.csswg.org/css-fonts-4/#valdef-font-style-oblique-angle)\n      const italicAngle = -descriptor.get(\"ItalicAngle\");\n      const cssFontInfo = { fontFamily, fontWeight, italicAngle };\n\n      if (!validateCSSFont(cssFontInfo)) {\n        continue;\n      }\n      promises.push(\n        parseFont(fontName, /* fallbackFontDict = */ null, cssFontInfo)\n      );\n    }\n\n    await Promise.all(promises);\n    const missingFonts = this.xfaFactory.setFonts(pdfFonts);\n\n    if (!missingFonts) {\n      return;\n    }\n\n    options.ignoreErrors = true;\n    promises.length = 0;\n    pdfFonts.length = 0;\n\n    const reallyMissingFonts = new Set();\n    for (const missing of missingFonts) {\n      if (!getXfaFontName(`${missing}-Regular`)) {\n        // No substitution available: we'll fallback on Myriad.\n        reallyMissingFonts.add(missing);\n      }\n    }\n\n    if (reallyMissingFonts.size) {\n      missingFonts.push(\"PdfJS-Fallback\");\n    }\n\n    for (const missing of missingFonts) {\n      if (reallyMissingFonts.has(missing)) {\n        continue;\n      }\n      for (const fontInfo of [\n        { name: \"Regular\", fontWeight: 400, italicAngle: 0 },\n        { name: \"Bold\", fontWeight: 700, italicAngle: 0 },\n        { name: \"Italic\", fontWeight: 400, italicAngle: 12 },\n        { name: \"BoldItalic\", fontWeight: 700, italicAngle: 12 },\n      ]) {\n        const name = `${missing}-${fontInfo.name}`;\n\n        promises.push(\n          parseFont(name, getXfaFontDict(name), {\n            fontFamily: missing,\n            fontWeight: fontInfo.fontWeight,\n            italicAngle: fontInfo.italicAngle,\n          })\n        );\n      }\n    }\n\n    await Promise.all(promises);\n    this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts);\n  }\n\n  loadXfaResources(handler, task) {\n    return Promise.all([\n      this.#loadXfaFonts(handler, task).catch(() => {\n        // Ignore errors, to allow the document to load.\n      }),\n      this.#loadXfaImages(),\n    ]);\n  }\n\n  serializeXfaData(annotationStorage) {\n    return this.xfaFactory\n      ? this.xfaFactory.serializeData(annotationStorage)\n      : null;\n  }\n\n  /**\n   * The specification states in section 7.5.2 that the version from\n   * the catalog, if present, should overwrite the version from the header.\n   */\n  get version() {\n    return this.catalog.version || this.#version;\n  }\n\n  get formInfo() {\n    const formInfo = {\n      hasFields: false,\n      hasAcroForm: false,\n      hasXfa: false,\n      hasSignatures: false,\n    };\n    const { acroForm } = this.catalog;\n    if (!acroForm) {\n      return shadow(this, \"formInfo\", formInfo);\n    }\n\n    try {\n      const fields = acroForm.get(\"Fields\");\n      const hasFields = Array.isArray(fields) && fields.length > 0;\n      formInfo.hasFields = hasFields; // Used by the `fieldObjects` getter.\n\n      // The document contains XFA data if the `XFA` entry is a non-empty\n      // array or stream.\n      const xfa = acroForm.get(\"XFA\");\n      formInfo.hasXfa =\n        (Array.isArray(xfa) && xfa.length > 0) ||\n        (xfa instanceof BaseStream && !xfa.isEmpty);\n\n      // The document contains AcroForm data if the `Fields` entry is a\n      // non-empty array and it doesn't consist of only document signatures.\n      // This second check is required for files that don't actually contain\n      // AcroForm data (only XFA data), but that use the `Fields` entry to\n      // store (invisible) document signatures. This can be detected using\n      // the first bit of the `SigFlags` integer (see Table 219 in the\n      // specification).\n      const sigFlags = acroForm.get(\"SigFlags\");\n      const hasSignatures = !!(sigFlags & 0x1);\n      const hasOnlyDocumentSignatures =\n        hasSignatures && this.#hasOnlyDocumentSignatures(fields);\n      formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures;\n      formInfo.hasSignatures = hasSignatures;\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn(`Cannot fetch form information: \"${ex}\".`);\n    }\n    return shadow(this, \"formInfo\", formInfo);\n  }\n\n  get documentInfo() {\n    const { catalog, formInfo, xref } = this;\n\n    const docInfo = {\n      PDFFormatVersion: this.version,\n      Language: catalog.lang,\n      EncryptFilterName: xref.encrypt?.filterName ?? null,\n      IsLinearized: !!this.linearization,\n      IsAcroFormPresent: formInfo.hasAcroForm,\n      IsXFAPresent: formInfo.hasXfa,\n      IsCollectionPresent: !!catalog.collection,\n      IsSignaturesPresent: formInfo.hasSignatures,\n    };\n\n    let infoDict;\n    try {\n      infoDict = xref.trailer.get(\"Info\");\n    } catch (err) {\n      if (err instanceof MissingDataException) {\n        throw err;\n      }\n      info(\"The document information dictionary is invalid.\");\n    }\n    if (!(infoDict instanceof Dict)) {\n      return shadow(this, \"documentInfo\", docInfo);\n    }\n\n    for (const [key, value] of infoDict) {\n      switch (key) {\n        case \"Title\":\n        case \"Author\":\n        case \"Subject\":\n        case \"Keywords\":\n        case \"Creator\":\n        case \"Producer\":\n        case \"CreationDate\":\n        case \"ModDate\":\n          if (typeof value === \"string\") {\n            docInfo[key] = stringToPDFString(value);\n            continue;\n          }\n          break;\n        case \"Trapped\":\n          if (value instanceof Name) {\n            docInfo[key] = value;\n            continue;\n          }\n          break;\n        default:\n          // For custom values, only accept white-listed types to prevent\n          // errors that would occur when trying to send non-serializable\n          // objects to the main-thread (for example `Dict` or `Stream`).\n          let customValue;\n          switch (typeof value) {\n            case \"string\":\n              customValue = stringToPDFString(value);\n              break;\n            case \"number\":\n            case \"boolean\":\n              customValue = value;\n              break;\n            default:\n              if (value instanceof Name) {\n                customValue = value;\n              }\n              break;\n          }\n\n          if (customValue === undefined) {\n            warn(`Bad value, for custom key \"${key}\", in Info: ${value}.`);\n            continue;\n          }\n          docInfo.Custom ??= Object.create(null);\n          docInfo.Custom[key] = customValue;\n          continue;\n      }\n      warn(`Bad value, for key \"${key}\", in Info: ${value}.`);\n    }\n    return shadow(this, \"documentInfo\", docInfo);\n  }\n\n  get fingerprints() {\n    const FINGERPRINT_FIRST_BYTES = 1024;\n    const EMPTY_FINGERPRINT = \"\\x00\".repeat(16);\n\n    function validate(data) {\n      return (\n        typeof data === \"string\" &&\n        data.length === 16 &&\n        data !== EMPTY_FINGERPRINT\n      );\n    }\n\n    const id = this.xref.trailer.get(\"ID\");\n    let hashOriginal, hashModified;\n    if (Array.isArray(id) && validate(id[0])) {\n      hashOriginal = stringToBytes(id[0]);\n\n      if (id[1] !== id[0] && validate(id[1])) {\n        hashModified = stringToBytes(id[1]);\n      }\n    } else {\n      hashOriginal = calculateMD5(\n        this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES),\n        0,\n        FINGERPRINT_FIRST_BYTES\n      );\n    }\n\n    return shadow(this, \"fingerprints\", [\n      hashOriginal.toHex(),\n      hashModified?.toHex() ?? null,\n    ]);\n  }\n\n  async #getLinearizationPage(pageIndex) {\n    const { catalog, linearization, xref } = this;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        linearization?.pageFirst === pageIndex,\n        \"_getLinearizationPage - invalid pageIndex argument.\"\n      );\n    }\n\n    const ref = Ref.get(linearization.objectNumberFirst, 0);\n    try {\n      const obj = await xref.fetchAsync(ref);\n      // Ensure that the object that was found is actually a Page dictionary.\n      if (obj instanceof Dict) {\n        let type = obj.getRaw(\"Type\");\n        if (type instanceof Ref) {\n          type = await xref.fetchAsync(type);\n        }\n        if (\n          isName(type, \"Page\") ||\n          (!obj.has(\"Type\") && !obj.has(\"Kids\") && obj.has(\"Contents\"))\n        ) {\n          if (!catalog.pageKidsCountCache.has(ref)) {\n            catalog.pageKidsCountCache.put(ref, 1); // Cache the Page reference.\n          }\n          // Help improve performance of the `Catalog.getPageIndex` method.\n          if (!catalog.pageIndexCache.has(ref)) {\n            catalog.pageIndexCache.put(ref, 0);\n          }\n\n          return [obj, ref];\n        }\n      }\n      throw new FormatError(\n        \"The Linearization dictionary doesn't point to a valid Page dictionary.\"\n      );\n    } catch (reason) {\n      warn(`_getLinearizationPage: \"${reason.message}\".`);\n      return catalog.getPageDict(pageIndex);\n    }\n  }\n\n  getPage(pageIndex) {\n    const cachedPromise = this.#pagePromises.get(pageIndex);\n    if (cachedPromise) {\n      return cachedPromise;\n    }\n    const { catalog, linearization, xfaFactory } = this;\n\n    let promise;\n    if (xfaFactory) {\n      promise = Promise.resolve([Dict.empty, null]);\n    } else if (linearization?.pageFirst === pageIndex) {\n      promise = this.#getLinearizationPage(pageIndex);\n    } else {\n      promise = catalog.getPageDict(pageIndex);\n    }\n    promise = promise.then(\n      ([pageDict, ref]) =>\n        new Page({\n          pdfManager: this.pdfManager,\n          xref: this.xref,\n          pageIndex,\n          pageDict,\n          ref,\n          globalIdFactory: this._globalIdFactory,\n          fontCache: catalog.fontCache,\n          builtInCMapCache: catalog.builtInCMapCache,\n          standardFontDataCache: catalog.standardFontDataCache,\n          globalColorSpaceCache: catalog.globalColorSpaceCache,\n          globalImageCache: catalog.globalImageCache,\n          systemFontCache: catalog.systemFontCache,\n          nonBlendModesSet: catalog.nonBlendModesSet,\n          xfaFactory,\n        })\n    );\n\n    this.#pagePromises.set(pageIndex, promise);\n    return promise;\n  }\n\n  async checkFirstPage(recoveryMode = false) {\n    if (recoveryMode) {\n      return;\n    }\n    try {\n      await this.getPage(0);\n    } catch (reason) {\n      if (reason instanceof XRefEntryException) {\n        // Clear out the various caches to ensure that we haven't stored any\n        // inconsistent and/or incorrect state, since that could easily break\n        // subsequent `this.getPage` calls.\n        this.#pagePromises.delete(0);\n        await this.cleanup();\n\n        throw new XRefParseException();\n      }\n    }\n  }\n\n  async checkLastPage(recoveryMode = false) {\n    const { catalog, pdfManager } = this;\n\n    catalog.setActualNumPages(); // Ensure that it's always reset.\n    let numPages;\n\n    try {\n      await Promise.all([\n        pdfManager.ensureDoc(\"xfaFactory\"),\n        pdfManager.ensureDoc(\"linearization\"),\n        pdfManager.ensureCatalog(\"numPages\"),\n      ]);\n\n      if (this.xfaFactory) {\n        return; // The Page count is always calculated for XFA-documents.\n      } else if (this.linearization) {\n        numPages = this.linearization.numPages;\n      } else {\n        numPages = catalog.numPages;\n      }\n\n      if (!Number.isInteger(numPages)) {\n        throw new FormatError(\"Page count is not an integer.\");\n      } else if (numPages <= 1) {\n        return;\n      }\n      await this.getPage(numPages - 1);\n    } catch (reason) {\n      // Clear out the various caches to ensure that we haven't stored any\n      // inconsistent and/or incorrect state, since that could easily break\n      // subsequent `this.getPage` calls.\n      this.#pagePromises.delete(numPages - 1);\n      await this.cleanup();\n\n      if (reason instanceof XRefEntryException && !recoveryMode) {\n        throw new XRefParseException();\n      }\n      warn(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`);\n\n      let pagesTree;\n      try {\n        pagesTree = await catalog.getAllPageDicts(recoveryMode);\n      } catch (reasonAll) {\n        if (reasonAll instanceof XRefEntryException && !recoveryMode) {\n          throw new XRefParseException();\n        }\n        catalog.setActualNumPages(1);\n        return;\n      }\n\n      for (const [pageIndex, [pageDict, ref]] of pagesTree) {\n        let promise;\n        if (pageDict instanceof Error) {\n          promise = Promise.reject(pageDict);\n\n          // Prevent \"uncaught exception: Object\"-messages in the console.\n          promise.catch(() => {});\n        } else {\n          promise = Promise.resolve(\n            new Page({\n              pdfManager,\n              xref: this.xref,\n              pageIndex,\n              pageDict,\n              ref,\n              globalIdFactory: this._globalIdFactory,\n              fontCache: catalog.fontCache,\n              builtInCMapCache: catalog.builtInCMapCache,\n              standardFontDataCache: catalog.standardFontDataCache,\n              globalColorSpaceCache: this.globalColorSpaceCache,\n              globalImageCache: catalog.globalImageCache,\n              systemFontCache: catalog.systemFontCache,\n              nonBlendModesSet: catalog.nonBlendModesSet,\n              xfaFactory: null,\n            })\n          );\n        }\n\n        this.#pagePromises.set(pageIndex, promise);\n      }\n      catalog.setActualNumPages(pagesTree.size);\n    }\n  }\n\n  async fontFallback(id, handler) {\n    const { catalog, pdfManager } = this;\n\n    for (const translatedFont of await Promise.all(catalog.fontCache)) {\n      if (translatedFont.loadedName === id) {\n        translatedFont.fallback(handler, pdfManager.evaluatorOptions);\n        return;\n      }\n    }\n  }\n\n  async cleanup(manuallyTriggered = false) {\n    return this.catalog\n      ? this.catalog.cleanup(manuallyTriggered)\n      : clearGlobalCaches();\n  }\n\n  async #collectFieldObjects(\n    name,\n    parentRef,\n    fieldRef,\n    promises,\n    annotationGlobals,\n    visitedRefs,\n    orphanFields\n  ) {\n    const { xref } = this;\n\n    if (!(fieldRef instanceof Ref) || visitedRefs.has(fieldRef)) {\n      return;\n    }\n    visitedRefs.put(fieldRef);\n    const field = await xref.fetchAsync(fieldRef);\n    if (!(field instanceof Dict)) {\n      return;\n    }\n    let subtype = await field.getAsync(\"Subtype\");\n    subtype = subtype instanceof Name ? subtype.name : null;\n    // Skip unrelated annotation types (see issue 19281).\n    switch (subtype) {\n      case \"Link\":\n        return;\n    }\n    if (field.has(\"T\")) {\n      const partName = stringToPDFString(await field.getAsync(\"T\"));\n      name = name === \"\" ? partName : `${name}.${partName}`;\n    } else {\n      let obj = field;\n      while (true) {\n        obj = obj.getRaw(\"Parent\") || parentRef;\n        if (obj instanceof Ref) {\n          if (visitedRefs.has(obj)) {\n            break;\n          }\n          obj = await xref.fetchAsync(obj);\n        }\n        if (!(obj instanceof Dict)) {\n          break;\n        }\n        if (obj.has(\"T\")) {\n          const partName = stringToPDFString(await obj.getAsync(\"T\"));\n          name = name === \"\" ? partName : `${name}.${partName}`;\n          break;\n        }\n      }\n    }\n\n    if (\n      parentRef &&\n      !field.has(\"Parent\") &&\n      isName(field.get(\"Subtype\"), \"Widget\")\n    ) {\n      // We've a parent from the Fields array, but the field hasn't.\n      orphanFields.put(fieldRef, parentRef);\n    }\n\n    promises.getOrInsertComputed(name, makeArr).push(\n      AnnotationFactory.create(\n        xref,\n        fieldRef,\n        annotationGlobals,\n        /* idFactory = */ null,\n        /* collectFields */ true,\n        orphanFields,\n        /* collectByType */ null,\n        /* pageRef */ null\n      )\n        .then(annotation => annotation?.getFieldObject())\n        .catch(function (reason) {\n          warn(`#collectFieldObjects: \"${reason}\".`);\n          return null;\n        })\n    );\n\n    if (!field.has(\"Kids\")) {\n      return;\n    }\n    const kids = await field.getAsync(\"Kids\");\n    if (Array.isArray(kids)) {\n      for (const kid of kids) {\n        await this.#collectFieldObjects(\n          name,\n          fieldRef,\n          kid,\n          promises,\n          annotationGlobals,\n          visitedRefs,\n          orphanFields\n        );\n      }\n    }\n  }\n\n  get fieldObjects() {\n    const promise = this.pdfManager\n      .ensureDoc(\"formInfo\")\n      .then(async formInfo => {\n        if (!formInfo.hasFields) {\n          return null;\n        }\n        const annotationGlobals = await this.annotationGlobals;\n        if (!annotationGlobals) {\n          return null;\n        }\n        const { acroForm } = annotationGlobals;\n\n        const visitedRefs = new RefSet();\n        const allFields = Object.create(null);\n        const fieldPromises = new Map();\n        const orphanFields = new RefSetCache();\n        for (const fieldRef of acroForm.get(\"Fields\")) {\n          await this.#collectFieldObjects(\n            \"\",\n            null,\n            fieldRef,\n            fieldPromises,\n            annotationGlobals,\n            visitedRefs,\n            orphanFields\n          );\n        }\n\n        const allPromises = [];\n        for (const [name, promises] of fieldPromises) {\n          allPromises.push(\n            Promise.all(promises).then(fields => {\n              fields = fields.filter(field => !!field);\n              if (fields.length > 0) {\n                allFields[name] = fields;\n              }\n            })\n          );\n        }\n        await Promise.all(allPromises);\n\n        return {\n          allFields: objectSize(allFields) > 0 ? allFields : null,\n          orphanFields,\n        };\n      });\n\n    return shadow(this, \"fieldObjects\", promise);\n  }\n\n  get hasJSActions() {\n    const promise = this.pdfManager.ensureDoc(\"_parseHasJSActions\");\n    return shadow(this, \"hasJSActions\", promise);\n  }\n\n  /**\n   * @private\n   */\n  async _parseHasJSActions() {\n    const [catalogJsActions, fieldObjects] = await Promise.all([\n      this.pdfManager.ensureCatalog(\"jsActions\"),\n      this.pdfManager.ensureDoc(\"fieldObjects\"),\n    ]);\n\n    if (catalogJsActions) {\n      return true;\n    }\n    if (fieldObjects?.allFields) {\n      return Object.values(fieldObjects.allFields).some(fieldObject =>\n        fieldObject.some(object => object.actions !== null)\n      );\n    }\n    return false;\n  }\n\n  get calculationOrderIds() {\n    const calculationOrder = this.catalog.acroForm?.get(\"CO\");\n    if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) {\n      return shadow(this, \"calculationOrderIds\", null);\n    }\n\n    const ids = [];\n    for (const id of calculationOrder) {\n      if (id instanceof Ref) {\n        ids.push(id.toString());\n      }\n    }\n    return shadow(this, \"calculationOrderIds\", ids.length ? ids : null);\n  }\n\n  get annotationGlobals() {\n    return shadow(\n      this,\n      \"annotationGlobals\",\n      AnnotationFactory.createGlobals(this.pdfManager)\n    );\n  }\n\n  async toJSObject(value, firstCall = true) {\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      !PDFJSDev.test(\"TESTING || INTERNAL_VIEWER\")\n    ) {\n      throw new Error(\"Not implemented: toJSObject\");\n    }\n    const { InternalViewerUtils } =\n      typeof PDFJSDev === \"undefined\"\n        ? await import(\"./internal_viewer_utils.js\")\n        : await __eager_import__(\"./internal_viewer_utils.js\");\n\n    if (value === null && firstCall) {\n      return this.toJSObject(this.xref.trailer, false);\n    }\n    if (value instanceof Dict) {\n      const obj = Object.create(null);\n      const isPage = isName(value.get(\"Type\"), \"Page\");\n      for (const [key, val] of value.getRawEntries()) {\n        obj[key] =\n          isPage && key === \"Contents\"\n            ? InternalViewerUtils.getContentTokens(val, this.xref)\n            : await this.toJSObject(val, false);\n      }\n      return obj;\n    }\n    if (Array.isArray(value)) {\n      return Promise.all(value.map(v => this.toJSObject(v, false)));\n    }\n    if (value instanceof Ref) {\n      if (firstCall) {\n        return this.toJSObject(this.xref.fetch(value), false);\n      }\n      const result = Object.create(null);\n      result.num = value.num;\n      result.gen = value.gen;\n      return result;\n    }\n    if (value instanceof BaseStream) {\n      const { dict } = value;\n      const obj = Object.create(null);\n      obj.dict = await this.toJSObject(dict, false);\n\n      if (isName(dict.get(\"Subtype\"), \"Image\")) {\n        const isImageMask = dict.get(\"ImageMask\") === true;\n        if (isImageMask) {\n          dict.set(\"ImageMask\", false);\n          dict.set(\"IM\", false);\n          value.numComps = value.bitsPerComponent = 1;\n        }\n        try {\n          const imageObj = await PDFImage.buildImage({\n            xref: this.xref,\n            res: Dict.empty,\n            image: value,\n            pdfFunctionFactory: new PDFFunctionFactory({ xref: this.xref }),\n            globalColorSpaceCache: this.catalog.globalColorSpaceCache,\n            localColorSpaceCache: new LocalColorSpaceCache(),\n          });\n          const imgData = await imageObj.createImageData(\n            /* forceRGBA = */ true,\n            /* isOffscreenCanvasSupported = */ false\n          );\n          obj.imageData = {\n            width: imgData.width,\n            height: imgData.height,\n            kind: imgData.kind,\n            data: imgData.data,\n          };\n          return obj;\n        } catch {\n          // Fall through to regular byte stream if image decoding fails.\n        }\n        if (isImageMask) {\n          dict.set(\"ImageMask\", true);\n          delete value.numComps;\n          delete value.bitsPerComponent;\n        }\n      }\n\n      if (isName(dict.get(\"Subtype\"), \"Form\")) {\n        obj.bytes = value.getString();\n        value.reset();\n        const { instructions, cmdNames } =\n          InternalViewerUtils.groupIntoInstructions(\n            InternalViewerUtils.tokenizeStream(value, this.xref)\n          );\n        obj.contentStream = true;\n        obj.instructions = instructions;\n        obj.cmdNames = cmdNames;\n        return obj;\n      }\n\n      if (dict.get(\"FunctionType\") === FunctionType.POSTSCRIPT_CALCULATOR) {\n        const source = value.getString();\n        value.reset();\n        const domain = dict.get(\"Domain\") ?? [];\n        const range = dict.get(\"Range\") ?? [];\n        obj.psFunction = true;\n        obj.source = source;\n        obj.psLines = InternalViewerUtils.tokenizePSSource(source);\n        obj.jsCode = InternalViewerUtils.postScriptToJSCode(\n          source,\n          domain,\n          range\n        );\n        return obj;\n      }\n\n      obj.bytes = value.getString();\n      return obj;\n    }\n    return value;\n  }\n}\n\nexport { LETTER_SIZE_MEDIABOX, Page, PDFDocument };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CmykICCBasedCS, IccColorSpace } from \"./icc_colorspace.js\";\nimport {\n  createValidAbsoluteUrl,\n  FeatureTest,\n  unreachable,\n  warn,\n} from \"../shared/util.js\";\nimport { ChunkedStreamManager } from \"./chunked_stream.js\";\nimport { ImageResizer } from \"./image_resizer.js\";\nimport { JpegStream } from \"./jpeg_stream.js\";\nimport { MissingDataException } from \"./core_utils.js\";\nimport { OperatorList } from \"./operator_list.js\";\nimport { Pattern } from \"./pattern.js\";\nimport { PDFDocument } from \"./document.js\";\nimport { PDFFunctionFactory } from \"./function.js\";\nimport { Stream } from \"./stream.js\";\nimport { WasmImage } from \"./wasm_image.js\";\n\n/**\n * @typedef { LocalPdfManager | NetworkPdfManager } PdfManager\n */\n\nfunction parseDocBaseUrl(url) {\n  if (url) {\n    const absoluteUrl = createValidAbsoluteUrl(url);\n    if (absoluteUrl) {\n      return absoluteUrl.href;\n    }\n    warn(`Invalid absolute docBaseUrl: \"${url}\".`);\n  }\n  return null;\n}\n\nclass BasePdfManager {\n  constructor({\n    // source,\n    // disableAutoFetch,\n    docBaseUrl,\n    docId,\n    enableXfa,\n    evaluatorOptions,\n    handler,\n    // length,\n    password,\n    // rangeChunkSize,\n  }) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BasePdfManager\n    ) {\n      unreachable(\"Cannot initialize BasePdfManager.\");\n    }\n    this._docBaseUrl = parseDocBaseUrl(docBaseUrl);\n    this._docId = docId;\n    this._password = password;\n    this.enableXfa = enableXfa;\n\n    // Check `OffscreenCanvas` and `ImageDecoder` support once,\n    // rather than repeatedly throughout the worker-thread code.\n    evaluatorOptions.isOffscreenCanvasSupported &&=\n      FeatureTest.isOffscreenCanvasSupported;\n    evaluatorOptions.isImageDecoderSupported &&=\n      FeatureTest.isImageDecoderSupported;\n\n    this.evaluatorOptions = Object.freeze(evaluatorOptions);\n\n    // Initialize image-options once per document.\n    ImageResizer.setOptions(evaluatorOptions);\n    JpegStream.setOptions(evaluatorOptions);\n    OperatorList.setOptions(evaluatorOptions);\n\n    const options = { ...evaluatorOptions, handler };\n    IccColorSpace.setOptions(options);\n    CmykICCBasedCS.setOptions(options);\n    PDFFunctionFactory.setOptions(options);\n    Pattern.setOptions(options);\n    WasmImage.setOptions(options);\n  }\n\n  get docId() {\n    return this._docId;\n  }\n\n  get password() {\n    return this._password;\n  }\n\n  get docBaseUrl() {\n    return this._docBaseUrl;\n  }\n\n  ensureDoc(prop, args) {\n    return this.ensure(this.pdfDocument, prop, args);\n  }\n\n  ensureXRef(prop, args) {\n    return this.ensure(this.pdfDocument.xref, prop, args);\n  }\n\n  ensureCatalog(prop, args) {\n    return this.ensure(this.pdfDocument.catalog, prop, args);\n  }\n\n  async initDocument(recoveryMode) {\n    await this.ensureDoc(\"checkHeader\");\n    await this.ensureDoc(\"parseStartXRef\");\n    await this.ensureDoc(\"parse\", [recoveryMode]);\n\n    // Check that at least the first page can be successfully loaded,\n    // since otherwise the XRef table is definitely not valid.\n    await this.ensureDoc(\"checkFirstPage\", [recoveryMode]);\n    // Check that the last page can be successfully loaded, to ensure that\n    // `numPages` is correct, and fallback to walking the entire /Pages-tree.\n    await this.ensureDoc(\"checkLastPage\", [recoveryMode]);\n  }\n\n  getPage(pageIndex) {\n    return this.pdfDocument.getPage(pageIndex);\n  }\n\n  fontFallback(id, handler) {\n    return this.pdfDocument.fontFallback(id, handler);\n  }\n\n  cleanup(manuallyTriggered = false) {\n    return this.pdfDocument.cleanup(manuallyTriggered);\n  }\n\n  async ensure(obj, prop, args) {\n    unreachable(\"Abstract method `ensure` called\");\n  }\n\n  requestRange(begin, end) {\n    unreachable(\"Abstract method `requestRange` called\");\n  }\n\n  requestLoadedStream(noFetch = false) {\n    unreachable(\"Abstract method `requestLoadedStream` called\");\n  }\n\n  sendProgressiveData(chunk) {\n    unreachable(\"Abstract method `sendProgressiveData` called\");\n  }\n\n  /**\n   * Set password.\n   *\n   * @param {string} password\n   *   New password.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  updatePassword(password) {\n    this._password = password;\n    this.pdfDocument.xref.encrypt?.setPassword(password);\n  }\n\n  terminate(reason) {\n    unreachable(\"Abstract method `terminate` called\");\n  }\n}\n\nclass LocalPdfManager extends BasePdfManager {\n  constructor(args) {\n    super(args);\n\n    const stream = new Stream(args.source);\n    this.pdfDocument = new PDFDocument(this, stream);\n    this._loadedStreamPromise = Promise.resolve(stream);\n  }\n\n  async ensure(obj, prop, args) {\n    const value = obj[prop];\n    if (typeof value === \"function\") {\n      return value.apply(obj, args);\n    }\n    return value;\n  }\n\n  requestRange(begin, end) {\n    return Promise.resolve();\n  }\n\n  requestLoadedStream(noFetch = false) {\n    return this._loadedStreamPromise;\n  }\n\n  terminate(reason) {}\n}\n\nclass NetworkPdfManager extends BasePdfManager {\n  constructor(args) {\n    super(args);\n\n    this.streamManager = new ChunkedStreamManager(args.source, {\n      msgHandler: args.handler,\n      length: args.length,\n      disableAutoFetch: args.disableAutoFetch,\n      rangeChunkSize: args.rangeChunkSize,\n    });\n    this.pdfDocument = new PDFDocument(this, this.streamManager.getStream());\n  }\n\n  async ensure(obj, prop, args) {\n    try {\n      const value = obj[prop];\n      if (typeof value === \"function\") {\n        return await value.apply(obj, args);\n      }\n      return value;\n    } catch (ex) {\n      if (!(ex instanceof MissingDataException)) {\n        throw ex;\n      }\n      await this.requestRange(ex.begin, ex.end);\n      return this.ensure(obj, prop, args);\n    }\n  }\n\n  requestRange(begin, end) {\n    return this.streamManager.requestRange(begin, end);\n  }\n\n  requestLoadedStream(noFetch = false) {\n    return this.streamManager.requestAllChunks(noFetch);\n  }\n\n  sendProgressiveData(chunk) {\n    this.streamManager.onReceiveData({ chunk });\n  }\n\n  terminate(reason) {\n    this.streamManager.abort(reason);\n  }\n}\n\nexport { LocalPdfManager, NetworkPdfManager };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException,\n  assert,\n  InvalidPDFException,\n  PasswordException,\n  ResponseException,\n  UnknownErrorException,\n  unreachable,\n} from \"./util.js\";\n\nconst CallbackKind = {\n  DATA: 1,\n  ERROR: 2,\n};\n\nconst StreamKind = {\n  CANCEL: 1,\n  CANCEL_COMPLETE: 2,\n  CLOSE: 3,\n  ENQUEUE: 4,\n  ERROR: 5,\n  PULL: 6,\n  PULL_COMPLETE: 7,\n  START_COMPLETE: 8,\n};\n\nfunction onFn() {}\n\nfunction wrapReason(ex) {\n  if (\n    ex instanceof AbortException ||\n    ex instanceof InvalidPDFException ||\n    ex instanceof PasswordException ||\n    ex instanceof ResponseException ||\n    ex instanceof UnknownErrorException\n  ) {\n    // Avoid re-creating the exception when its type is already correct.\n    return ex;\n  }\n\n  if (!(ex instanceof Error || (typeof ex === \"object\" && ex !== null))) {\n    unreachable(\n      'wrapReason: Expected \"reason\" to be a (possibly cloned) Error.'\n    );\n  }\n  switch (ex.name) {\n    case \"AbortException\":\n      return new AbortException(ex.message);\n    case \"InvalidPDFException\":\n      return new InvalidPDFException(ex.message);\n    case \"PasswordException\":\n      return new PasswordException(ex.message, ex.code);\n    case \"ResponseException\":\n      return new ResponseException(ex.message, ex.status, ex.missing);\n    case \"UnknownErrorException\":\n      return new UnknownErrorException(ex.message, ex.details);\n  }\n  return new UnknownErrorException(ex.message, ex.toString());\n}\n\nclass MessageHandler {\n  #messageAC = new AbortController();\n\n  constructor(sourceName, targetName, comObj) {\n    this.sourceName = sourceName;\n    this.targetName = targetName;\n    this.comObj = comObj;\n    this.callbackId = 1;\n    this.streamId = 1;\n    this.streamSinks = Object.create(null);\n    this.streamControllers = Object.create(null);\n    this.callbackCapabilities = Object.create(null);\n    this.actionHandler = Object.create(null);\n\n    comObj.addEventListener(\"message\", this.#onMessage.bind(this), {\n      signal: this.#messageAC.signal,\n    });\n  }\n\n  #onMessage({ data }) {\n    if (data.targetName !== this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      this.#processStreamMessage(data);\n      return;\n    }\n    if (data.callback) {\n      const callbackId = data.callbackId;\n      const capability = this.callbackCapabilities[callbackId];\n      if (!capability) {\n        throw new Error(`Cannot resolve callback ${callbackId}`);\n      }\n      delete this.callbackCapabilities[callbackId];\n\n      if (data.callback === CallbackKind.DATA) {\n        capability.resolve(data.data);\n      } else if (data.callback === CallbackKind.ERROR) {\n        capability.reject(wrapReason(data.reason));\n      } else {\n        throw new Error(\"Unexpected callback case\");\n      }\n      return;\n    }\n    const action = this.actionHandler[data.action];\n    if (!action) {\n      throw new Error(`Unknown action from worker: ${data.action}`);\n    }\n    if (data.callbackId) {\n      const sourceName = this.sourceName,\n        targetName = data.sourceName,\n        comObj = this.comObj;\n\n      Promise.try(action, data.data).then(\n        function (result) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            callback: CallbackKind.DATA,\n            callbackId: data.callbackId,\n            data: result,\n          });\n        },\n        function (reason) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            callback: CallbackKind.ERROR,\n            callbackId: data.callbackId,\n            reason: wrapReason(reason),\n          });\n        }\n      );\n      return;\n    }\n    if (data.streamId) {\n      this.#createStreamSink(data);\n      return;\n    }\n    action(data.data);\n  }\n\n  on(actionName, handler) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      assert(\n        typeof handler === \"function\",\n        'MessageHandler.on: Expected \"handler\" to be a function.'\n      );\n    }\n    const ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error(`There is already an actionName called \"${actionName}\"`);\n    }\n    ah[actionName] = handler;\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   */\n  send(actionName, data, transfers) {\n    this.comObj.postMessage(\n      {\n        sourceName: this.sourceName,\n        targetName: this.targetName,\n        action: actionName,\n        data,\n      },\n      transfers\n    );\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expects that the other side will callback with the response.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   * @returns {Promise} Promise to be resolved with response data.\n   */\n  sendWithPromise(actionName, data, transfers) {\n    const callbackId = this.callbackId++;\n    const capability = Promise.withResolvers();\n    this.callbackCapabilities[callbackId] = capability;\n    try {\n      this.comObj.postMessage(\n        {\n          sourceName: this.sourceName,\n          targetName: this.targetName,\n          action: actionName,\n          callbackId,\n          data,\n        },\n        transfers\n      );\n    } catch (ex) {\n      capability.reject(ex);\n    }\n    return capability.promise;\n  }\n\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expect that the other side will callback to signal 'start_complete'.\n   * @param {string} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Object} queueingStrategy - Strategy to signal backpressure based on\n   *                 internal queue.\n   * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n   * @returns {ReadableStream} ReadableStream to read data in chunks.\n   */\n  sendWithStream(actionName, data, queueingStrategy, transfers) {\n    const streamId = this.streamId++,\n      sourceName = this.sourceName,\n      targetName = this.targetName,\n      comObj = this.comObj;\n\n    return new ReadableStream(\n      {\n        start: controller => {\n          const startCapability = Promise.withResolvers();\n          this.streamControllers[streamId] = {\n            controller,\n            startCall: startCapability,\n            pullCall: null,\n            cancelCall: null,\n            isClosed: false,\n          };\n          comObj.postMessage(\n            {\n              sourceName,\n              targetName,\n              action: actionName,\n              streamId,\n              data,\n              desiredSize: controller.desiredSize,\n            },\n            transfers\n          );\n          // Return Promise for Async process, to signal success/failure.\n          return startCapability.promise;\n        },\n\n        pull: controller => {\n          const pullCapability = Promise.withResolvers();\n          this.streamControllers[streamId].pullCall = pullCapability;\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL,\n            streamId,\n            desiredSize: controller.desiredSize,\n          });\n          // Returning Promise will not call \"pull\"\n          // again until current pull is resolved.\n          return pullCapability.promise;\n        },\n\n        cancel: reason => {\n          assert(reason instanceof Error, \"cancel must have a valid reason\");\n          const cancelCapability = Promise.withResolvers();\n          this.streamControllers[streamId].cancelCall = cancelCapability;\n          this.streamControllers[streamId].isClosed = true;\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.CANCEL,\n            streamId,\n            reason: wrapReason(reason),\n          });\n          // Return Promise to signal success or failure.\n          return cancelCapability.promise;\n        },\n      },\n      queueingStrategy\n    );\n  }\n\n  #createStreamSink(data) {\n    const streamId = data.streamId,\n      sourceName = this.sourceName,\n      targetName = data.sourceName,\n      comObj = this.comObj;\n    const self = this,\n      action = this.actionHandler[data.action];\n\n    const streamSink = {\n      enqueue(chunk, size = 1, transfers) {\n        if (this.isCancelled) {\n          return;\n        }\n        const lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        // Enqueue decreases the desiredSize property of sink,\n        // so when it changes from positive to negative,\n        // set ready as unresolved promise.\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = Promise.withResolvers();\n          this.ready = this.sinkCapability.promise;\n        }\n        comObj.postMessage(\n          {\n            sourceName,\n            targetName,\n            stream: StreamKind.ENQUEUE,\n            streamId,\n            chunk,\n          },\n          transfers\n        );\n      },\n\n      close() {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.CLOSE,\n          streamId,\n        });\n        delete self.streamSinks[streamId];\n      },\n\n      error(reason) {\n        assert(reason instanceof Error, \"error must have a valid reason\");\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.ERROR,\n          streamId,\n          reason: wrapReason(reason),\n        });\n      },\n\n      sinkCapability: Promise.withResolvers(),\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize: data.desiredSize,\n      ready: null,\n    };\n\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n\n    Promise.try(action, data.data, streamSink).then(\n      function () {\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.START_COMPLETE,\n          streamId,\n          success: true,\n        });\n      },\n      function (reason) {\n        comObj.postMessage({\n          sourceName,\n          targetName,\n          stream: StreamKind.START_COMPLETE,\n          streamId,\n          reason: wrapReason(reason),\n        });\n      }\n    );\n  }\n\n  #processStreamMessage(data) {\n    const streamId = data.streamId,\n      sourceName = this.sourceName,\n      targetName = data.sourceName,\n      comObj = this.comObj;\n    const streamController = this.streamControllers[streamId],\n      streamSink = this.streamSinks[streamId];\n\n    switch (data.stream) {\n      case StreamKind.START_COMPLETE:\n        if (data.success) {\n          streamController.startCall.resolve();\n        } else {\n          streamController.startCall.reject(wrapReason(data.reason));\n        }\n        break;\n      case StreamKind.PULL_COMPLETE:\n        if (data.success) {\n          streamController.pullCall.resolve();\n        } else {\n          streamController.pullCall.reject(wrapReason(data.reason));\n        }\n        break;\n      case StreamKind.PULL:\n        // Ignore any pull after close is called.\n        if (!streamSink) {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            stream: StreamKind.PULL_COMPLETE,\n            streamId,\n            success: true,\n          });\n          break;\n        }\n        // Pull increases the desiredSize property of sink, so when it changes\n        // from negative to positive, set ready property as resolved promise.\n        if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {\n          streamSink.sinkCapability.resolve();\n        }\n        // Reset desiredSize property of sink on every pull.\n        streamSink.desiredSize = data.desiredSize;\n\n        Promise.try(streamSink.onPull || onFn).then(\n          function () {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.PULL_COMPLETE,\n              streamId,\n              success: true,\n            });\n          },\n          function (reason) {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.PULL_COMPLETE,\n              streamId,\n              reason: wrapReason(reason),\n            });\n          }\n        );\n        break;\n      case StreamKind.ENQUEUE:\n        assert(streamController, \"enqueue should have stream controller\");\n        if (streamController.isClosed) {\n          break;\n        }\n        streamController.controller.enqueue(data.chunk);\n        break;\n      case StreamKind.CLOSE:\n        assert(streamController, \"close should have stream controller\");\n        if (streamController.isClosed) {\n          break;\n        }\n        streamController.isClosed = true;\n        streamController.controller.close();\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.ERROR:\n        assert(streamController, \"error should have stream controller\");\n        streamController.controller.error(wrapReason(data.reason));\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.CANCEL_COMPLETE:\n        if (data.success) {\n          streamController.cancelCall.resolve();\n        } else {\n          streamController.cancelCall.reject(wrapReason(data.reason));\n        }\n        this.#deleteStreamController(streamController, streamId);\n        break;\n      case StreamKind.CANCEL:\n        if (!streamSink) {\n          break;\n        }\n        const dataReason = wrapReason(data.reason);\n\n        Promise.try(streamSink.onCancel || onFn, dataReason).then(\n          function () {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.CANCEL_COMPLETE,\n              streamId,\n              success: true,\n            });\n          },\n          function (reason) {\n            comObj.postMessage({\n              sourceName,\n              targetName,\n              stream: StreamKind.CANCEL_COMPLETE,\n              streamId,\n              reason: wrapReason(reason),\n            });\n          }\n        );\n        streamSink.sinkCapability.reject(dataReason);\n        streamSink.isCancelled = true;\n        delete this.streamSinks[streamId];\n        break;\n      default:\n        throw new Error(\"Unexpected stream case\");\n    }\n  }\n\n  async #deleteStreamController(streamController, streamId) {\n    // Delete the `streamController` only when the start, pull, and cancel\n    // capabilities have settled, to prevent `TypeError`s.\n    await Promise.allSettled([\n      streamController.startCall?.promise,\n      streamController.pullCall?.promise,\n      streamController.cancelCall?.promise,\n    ]);\n    delete this.streamControllers[streamId];\n  }\n\n  destroy() {\n    this.#messageAC?.abort();\n    this.#messageAC = null;\n  }\n}\n\nexport { MessageHandler, wrapReason };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bytesToString, info, warn } from \"../shared/util.js\";\nimport { Dict, isName, Name, Ref } from \"./primitives.js\";\nimport {\n  escapePDFName,\n  escapeString,\n  getSizeInBytes,\n  parseXFAPath,\n} from \"./core_utils.js\";\nimport { SimpleDOMNode, SimpleXMLParser } from \"./xml_parser.js\";\nimport { Stream, StringStream } from \"./stream.js\";\nimport { BaseStream } from \"./base_stream.js\";\nimport { calculateMD5 } from \"./calculate_md5.js\";\n\nasync function writeObject(\n  ref,\n  obj,\n  buffer,\n  { encrypt = null, encryptRef = null }\n) {\n  // Avoid to encrypt the encrypt dictionary.\n  const transform =\n    encrypt && encryptRef !== ref\n      ? encrypt.createCipherTransform(ref.num, ref.gen)\n      : null;\n  buffer.push(`${ref.num} ${ref.gen} obj\\n`);\n  await writeValue(obj, buffer, transform);\n  buffer.push(\"\\nendobj\\n\");\n}\n\nasync function writeDict(dict, buffer, transform) {\n  buffer.push(\"<<\");\n  for (const [key, rawObj] of dict.getRawEntries()) {\n    buffer.push(` /${escapePDFName(key)} `);\n    await writeValue(rawObj, buffer, transform);\n  }\n  buffer.push(\">>\");\n}\n\nasync function writeStream(stream, buffer, transform) {\n  stream = stream.getOriginalStream();\n  stream.reset();\n  let bytes = stream.getBytes();\n  const { dict } = stream;\n\n  const [filter, params] = await Promise.all([\n    dict.getAsync(\"Filter\"),\n    dict.getAsync(\"DecodeParms\"),\n  ]);\n\n  const filterZero = Array.isArray(filter)\n    ? await dict.xref.fetchIfRefAsync(filter[0])\n    : filter;\n  const isFilterZeroFlateDecode = isName(filterZero, \"FlateDecode\");\n\n  // These filters already compress the data, so we shouldn't try to compress it\n  // again.\n  const isFilterZeroImageDecode =\n    isName(filterZero, \"DCTDecode\") ||\n    isName(filterZero, \"JPXDecode\") ||\n    isName(filterZero, \"JBIG2Decode\") ||\n    isName(filterZero, \"CCITTFaxDecode\") ||\n    isName(filterZero, \"LZWDecode\");\n  const isFilterZeroCompressedObject =\n    isFilterZeroFlateDecode ||\n    isFilterZeroImageDecode ||\n    isName(filterZero, \"BrotliDecode\");\n\n  // If the string is too small there is no real benefit in compressing it.\n  // The number 256 is arbitrary, but it should be reasonable.\n  const MIN_LENGTH_FOR_COMPRESSING = 256;\n\n  if (\n    !isFilterZeroCompressedObject &&\n    bytes.length >= MIN_LENGTH_FOR_COMPRESSING\n  ) {\n    try {\n      const cs = new CompressionStream(\"deflate\");\n      const writer = cs.writable.getWriter();\n      await writer.ready;\n      writer\n        .write(bytes)\n        .then(async () => {\n          await writer.ready;\n          await writer.close();\n        })\n        .catch(() => {});\n\n      // Response::text doesn't return the correct data.\n      bytes = await new Response(cs.readable).bytes();\n\n      let newFilter, newParams;\n      if (!filter) {\n        newFilter = Name.get(\"FlateDecode\");\n      } else if (!isFilterZeroFlateDecode) {\n        newFilter = Array.isArray(filter)\n          ? [Name.get(\"FlateDecode\"), ...filter]\n          : [Name.get(\"FlateDecode\"), filter];\n        if (params) {\n          newParams = Array.isArray(params)\n            ? [null, ...params]\n            : [null, params];\n        }\n      }\n      if (newFilter) {\n        dict.set(\"Filter\", newFilter);\n      }\n      if (newParams) {\n        dict.set(\"DecodeParms\", newParams);\n      }\n    } catch (ex) {\n      info(`writeStream - cannot compress data: \"${ex}\".`);\n    }\n  }\n\n  let string = bytesToString(bytes);\n  if (transform) {\n    string = transform.encryptString(string);\n  }\n\n  dict.set(\"Length\", string.length);\n  await writeDict(dict, buffer, transform);\n  buffer.push(\" stream\\n\", string, \"\\nendstream\");\n}\n\nasync function writeArray(array, buffer, transform) {\n  buffer.push(\"[\");\n  for (let i = 0, ii = array.length; i < ii; i++) {\n    await writeValue(array[i], buffer, transform);\n    if (i < ii - 1) {\n      buffer.push(\" \");\n    }\n  }\n  buffer.push(\"]\");\n}\n\nasync function writeValue(value, buffer, transform) {\n  if (value instanceof Name) {\n    buffer.push(`/${escapePDFName(value.name)}`);\n  } else if (value instanceof Ref) {\n    buffer.push(`${value.num} ${value.gen} R`);\n  } else if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n    await writeArray(value, buffer, transform);\n  } else if (typeof value === \"string\") {\n    if (transform) {\n      value = transform.encryptString(value);\n    }\n    buffer.push(`(${escapeString(value)})`);\n  } else if (typeof value === \"number\") {\n    // Don't try to round numbers in general, it could lead to have degenerate\n    // matrices (e.g. [0.000008 0 0 0.000008 0 0]).\n    // The numbers must be \"rounded\" only when pdf.js is producing them and the\n    // current transformation matrix is well known.\n    // toFixed(10) avoids scientific notation and rounds; the replace removes\n    // trailing zeros (and a trailing dot for integers).\n    buffer.push(value.toFixed(10).replace(/\\.?0+$/, \"\"));\n  } else if (typeof value === \"boolean\") {\n    buffer.push(value.toString());\n  } else if (value instanceof Dict) {\n    await writeDict(value, buffer, transform);\n  } else if (value instanceof BaseStream) {\n    await writeStream(value, buffer, transform);\n  } else if (value === null) {\n    buffer.push(\"null\");\n  } else {\n    warn(`Unhandled value in writer: ${typeof value}, please file a bug.`);\n  }\n}\n\nfunction writeInt(number, size, offset, buffer) {\n  for (let i = size + offset - 1; i > offset - 1; i--) {\n    buffer[i] = number & 0xff;\n    number >>= 8;\n  }\n  return offset + size;\n}\n\nfunction writeString(string, offset, buffer) {\n  const ii = string.length;\n  for (let i = 0; i < ii; i++) {\n    buffer[offset + i] = string.charCodeAt(i) & 0xff;\n  }\n  return offset + ii;\n}\n\nfunction computeMD5(filesize, xrefInfo) {\n  const time = Math.floor(Date.now() / 1000);\n  const filename = xrefInfo.filename || \"\";\n  const md5Buffer = [\n    time.toString(),\n    filename,\n    filesize.toString(),\n    ...xrefInfo.infoMap.values(),\n  ];\n  const md5BufferLen = Math.sumPrecise(md5Buffer.map(str => str.length));\n\n  const array = new Uint8Array(md5BufferLen);\n  let offset = 0;\n  for (const str of md5Buffer) {\n    offset = writeString(str, offset, array);\n  }\n  return bytesToString(calculateMD5(array, 0, array.length));\n}\n\nfunction writeXFADataForAcroform(str, changes) {\n  const xml = new SimpleXMLParser({ hasAttributes: true }).parseFromString(str);\n\n  for (const { xfa } of changes) {\n    if (!xfa) {\n      continue;\n    }\n    const { path, value } = xfa;\n    if (!path) {\n      continue;\n    }\n    const nodePath = parseXFAPath(path);\n    let node = xml.documentElement.searchNode(nodePath, 0);\n    if (!node && nodePath.length > 1) {\n      // If we're lucky the last element in the path will identify the node.\n      node = xml.documentElement.searchNode([nodePath.at(-1)], 0);\n    }\n    if (node) {\n      node.childNodes = Array.isArray(value)\n        ? value.map(val => new SimpleDOMNode(\"value\", val))\n        : [new SimpleDOMNode(\"#text\", value)];\n    } else {\n      warn(`Node not found for path: ${path}`);\n    }\n  }\n  const buffer = [];\n  xml.documentElement.dump(buffer);\n  return buffer.join(\"\");\n}\n\nasync function updateAcroform({\n  xref,\n  acroForm,\n  acroFormRef,\n  hasXfa,\n  hasXfaDatasetsEntry,\n  xfaDatasetsRef,\n  needAppearances,\n  changes,\n}) {\n  if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) {\n    warn(\"XFA - Cannot save it\");\n  }\n\n  if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) {\n    return;\n  }\n\n  const dict = acroForm.clone();\n\n  if (hasXfa && !hasXfaDatasetsEntry) {\n    // We've a XFA array which doesn't contain a datasets entry.\n    // So we'll update the AcroForm dictionary to have an XFA containing\n    // the datasets.\n    const newXfa = acroForm.get(\"XFA\").slice();\n    newXfa.splice(2, 0, \"datasets\");\n    newXfa.splice(3, 0, xfaDatasetsRef);\n\n    dict.set(\"XFA\", newXfa);\n  }\n\n  if (needAppearances) {\n    dict.set(\"NeedAppearances\", true);\n  }\n\n  changes.put(acroFormRef, {\n    data: dict,\n  });\n}\n\nfunction updateXFA({ xfaData, xfaDatasetsRef, changes, xref }) {\n  if (xfaData === null) {\n    const datasets = xref.fetchIfRef(xfaDatasetsRef);\n    xfaData = writeXFADataForAcroform(datasets.getString(), changes);\n  }\n  const xfaDataStream = new StringStream(xfaData, new Dict(xref));\n  xfaDataStream.dict.setIfName(\"Type\", \"EmbeddedFile\");\n\n  changes.put(xfaDatasetsRef, {\n    data: xfaDataStream,\n  });\n}\n\nasync function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) {\n  buffer.push(\"xref\\n\");\n  const indexes = getIndexes(newRefs);\n  let indexesPosition = 0;\n  for (const { ref, data } of newRefs) {\n    if (ref.num === indexes[indexesPosition]) {\n      buffer.push(\n        `${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\\n`\n      );\n      indexesPosition += 2;\n    }\n    // The EOL is \\r\\n to make sure that every entry is exactly 20 bytes long.\n    // (see 7.5.4 - Cross-Reference Table).\n    if (data !== null) {\n      buffer.push(\n        `${baseOffset.toString().padStart(10, \"0\")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, \"0\")} n\\r\\n`\n      );\n      baseOffset += data.length;\n    } else {\n      buffer.push(\n        `0000000000 ${Math.min(ref.gen + 1, 0xffff)\n          .toString()\n          .padStart(5, \"0\")} f\\r\\n`\n      );\n    }\n  }\n  computeIDs(baseOffset, xrefInfo, newXref);\n  buffer.push(\"trailer\\n\");\n  await writeDict(newXref, buffer, null);\n  buffer.push(\"\\nstartxref\\n\", baseOffset.toString(), \"\\n%%EOF\\n\");\n}\n\nfunction getIndexes(newRefs) {\n  const indexes = [];\n  for (const { ref } of newRefs) {\n    if (ref.num === indexes.at(-2) + indexes.at(-1)) {\n      indexes[indexes.length - 1] += 1;\n    } else {\n      indexes.push(ref.num, 1);\n    }\n  }\n  return indexes;\n}\n\nasync function getXRefStreamTable(\n  xrefInfo,\n  baseOffset,\n  newRefs,\n  newXref,\n  buffer\n) {\n  const xrefTableData = [];\n  let maxOffset = 0;\n  let maxGen = 0;\n  for (const { ref, data, objStreamRef, index } of newRefs) {\n    let gen;\n    maxOffset = Math.max(maxOffset, baseOffset);\n    // The first number in each entry is the type (see 7.5.8.3):\n    //  0: free object\n    //  1: in-use object\n    //  2: compressed object\n    if (objStreamRef) {\n      gen = index;\n      xrefTableData.push([2, objStreamRef.num, gen]);\n    } else if (data !== null) {\n      gen = Math.min(ref.gen, 0xffff);\n      xrefTableData.push([1, baseOffset, gen]);\n      baseOffset += data.length;\n    } else {\n      gen = Math.min(ref.gen + 1, 0xffff);\n      xrefTableData.push([0, 0, gen]);\n    }\n    maxGen = Math.max(maxGen, gen);\n  }\n  newXref.set(\"Index\", getIndexes(newRefs));\n  const offsetSize = getSizeInBytes(maxOffset);\n  const maxGenSize = getSizeInBytes(maxGen);\n  const sizes = [1, offsetSize, maxGenSize];\n  newXref.set(\"W\", sizes);\n  computeIDs(baseOffset, xrefInfo, newXref);\n\n  const structSize = Math.sumPrecise(sizes);\n  const data = new Uint8Array(structSize * xrefTableData.length);\n  const stream = new Stream(data);\n  stream.dict = newXref;\n\n  let offset = 0;\n  for (const [type, objOffset, gen] of xrefTableData) {\n    offset = writeInt(type, sizes[0], offset, data);\n    offset = writeInt(objOffset, sizes[1], offset, data);\n    offset = writeInt(gen, sizes[2], offset, data);\n  }\n\n  await writeObject(xrefInfo.newRef, stream, buffer, {});\n  buffer.push(\"startxref\\n\", baseOffset.toString(), \"\\n%%EOF\\n\");\n}\n\nfunction computeIDs(baseOffset, xrefInfo, newXref) {\n  if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) {\n    const md5 = computeMD5(baseOffset, xrefInfo);\n    newXref.set(\"ID\", [xrefInfo.fileIds[0] || md5, md5]);\n  }\n}\n\nfunction getTrailerDict(xrefInfo, changes, useXrefStream) {\n  const newXref = new Dict(null);\n  newXref.setIfDefined(\"Prev\", xrefInfo?.startXRef);\n  const refForXrefTable = xrefInfo.newRef;\n  if (useXrefStream) {\n    changes.put(refForXrefTable, { data: \"\" });\n    newXref.set(\"Size\", refForXrefTable.num + 1);\n    newXref.setIfName(\"Type\", \"XRef\");\n  } else {\n    newXref.set(\"Size\", refForXrefTable.num);\n  }\n  newXref.setIfDefined(\"Root\", xrefInfo?.rootRef);\n  newXref.setIfDefined(\"Info\", xrefInfo?.infoRef);\n  newXref.setIfDefined(\"Encrypt\", xrefInfo?.encryptRef);\n\n  return newXref;\n}\n\nasync function writeChanges(changes, xref, buffer = []) {\n  const newRefs = [];\n  for (const [ref, { data, objStreamRef, index }] of changes.items()) {\n    if (objStreamRef) {\n      newRefs.push({ ref, data, objStreamRef, index });\n      continue;\n    }\n    if (data === null || typeof data === \"string\") {\n      newRefs.push({ ref, data });\n      continue;\n    }\n    await writeObject(ref, data, buffer, xref);\n    newRefs.push({ ref, data: buffer.join(\"\") });\n    buffer.length = 0;\n  }\n  return newRefs.sort((a, b) => /* compare the refs */ a.ref.num - b.ref.num);\n}\n\nasync function incrementalUpdate({\n  originalData,\n  xrefInfo,\n  changes,\n  xref = null,\n  hasXfa = false,\n  xfaDatasetsRef = null,\n  hasXfaDatasetsEntry = false,\n  needAppearances,\n  acroFormRef = null,\n  acroForm = null,\n  xfaData = null,\n  useXrefStream = false,\n}) {\n  await updateAcroform({\n    xref,\n    acroForm,\n    acroFormRef,\n    hasXfa,\n    hasXfaDatasetsEntry,\n    xfaDatasetsRef,\n    needAppearances,\n    changes,\n  });\n\n  if (hasXfa) {\n    updateXFA({\n      xfaData,\n      xfaDatasetsRef,\n      changes,\n      xref,\n    });\n  }\n\n  const newXref = getTrailerDict(xrefInfo, changes, useXrefStream);\n  const buffer = [];\n  const newRefs = await writeChanges(changes, xref, buffer);\n  let baseOffset = originalData.length;\n  const lastByte = originalData.at(-1);\n  if (lastByte !== /* \\n */ 0x0a && lastByte !== /* \\r */ 0x0d) {\n    // Avoid to concatenate %%EOF with an object definition\n    buffer.push(\"\\n\");\n    baseOffset += 1;\n  }\n\n  for (const { data } of newRefs) {\n    if (data !== null) {\n      buffer.push(data);\n    }\n  }\n\n  await (useXrefStream\n    ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer)\n    : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer));\n\n  const totalLength =\n    originalData.length + Math.sumPrecise(buffer.map(str => str.length));\n  const array = new Uint8Array(totalLength);\n\n  // Original data\n  array.set(originalData);\n  let offset = originalData.length;\n\n  // New data\n  for (const str of buffer) {\n    offset = writeString(str, offset, array);\n  }\n\n  return array;\n}\n\nexport { incrementalUpdate, writeChanges, writeDict, writeObject, writeValue };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../document.js\").PDFDocument} PDFDocument */\n/** @typedef {import(\"../document.js\").Page} Page */\n/** @typedef {import(\"../xref.js\").XRef} XRef */\n/** @typedef {import(\"../worker.js\").WorkerTask} WorkerTask */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../../shared/message_handler.js\").MessageHandler} MessageHandler */\n\nimport {\n  deepCompare,\n  getInheritableProperty,\n  getModificationDate,\n  getNewAnnotationsMap,\n  numberToString,\n} from \"../core_utils.js\";\nimport {\n  Dict,\n  isDict,\n  isName,\n  Name,\n  Ref,\n  RefSet,\n  RefSetCache,\n} from \"../primitives.js\";\nimport { incrementalUpdate, writeValue } from \"../writer.js\";\nimport { isArrayEqual, makeArr, stringToBytes } from \"../../shared/util.js\";\nimport { NameTree, NumberTree } from \"../name_number_tree.js\";\nimport { stringToAsciiOrUTF16BE, stringToPDFString } from \"../string_utils.js\";\nimport { AnnotationFactory } from \"../annotation.js\";\nimport { BaseStream } from \"../base_stream.js\";\nimport { createImage } from \"./pdf_images.js\";\nimport { LETTER_SIZE_MEDIABOX } from \"../document.js\";\nimport { MurmurHash3_64 } from \"../../shared/murmurhash3.js\";\nimport { StringStream } from \"../stream.js\";\n\nconst MAX_LEAVES_PER_PAGES_NODE = 16;\nconst MAX_IN_NAME_TREE_NODE = 64;\n\nclass PageData {\n  constructor(page, documentData) {\n    this.page = page;\n    this.documentData = documentData;\n    this.annotations = null;\n    // Named destinations which points to this page.\n    this.pointingNamedDestinations = null;\n\n    documentData.pagesMap.put(page.ref, this);\n  }\n}\n\nclass DocumentData {\n  constructor(document) {\n    this.document = document;\n    this.destinations = null;\n    this.pageLabels = null;\n    this.pagesMap = new RefSetCache();\n    this.oldRefMapping = new RefSetCache();\n    this.dedupNamedDestinations = new Map();\n    this.usedNamedDestinations = new Set();\n    this.postponedRefCopies = new RefSetCache();\n    this.resourceStreamPromises = new Map();\n    this.usedStructParents = new Set();\n    this.oldStructParentMapping = new Map();\n    this.structTreeRoot = null;\n    this.parentTree = null;\n    this.idTree = null;\n    this.roleMap = null;\n    this.classMap = null;\n    this.namespaces = null;\n    this.structTreeAF = null;\n    this.structTreePronunciationLexicon = [];\n    this.acroForm = null;\n    this.acroFormDefaultAppearance = \"\";\n    this.acroFormDefaultResources = null;\n    this.acroFormQ = 0;\n    this.hasSignatureAnnotations = false;\n    this.fieldToParent = new RefSetCache();\n    this.outline = null;\n    this.embeddedFiles = null;\n  }\n}\n\nclass XRefWrapper {\n  constructor(entries, getNewRef) {\n    this.entries = entries;\n    this._getNewRef = getNewRef;\n  }\n\n  getNewTemporaryRef() {\n    return this._getNewRef();\n  }\n\n  fetchIfRef(obj) {\n    return obj instanceof Ref ? this.fetch(obj) : obj;\n  }\n\n  fetch(ref) {\n    if (!(ref instanceof Ref)) {\n      throw new Error(\"ref object is not a reference\");\n    }\n    return this.entries[ref.num];\n  }\n\n  async fetchIfRefAsync(obj) {\n    return obj instanceof Ref ? this.fetchAsync(obj) : obj;\n  }\n\n  async fetchAsync(ref) {\n    return this.fetch(ref);\n  }\n}\n\nclass PDFEditor {\n  // Whether the edited PDF is built from a single source file, used one or more\n  // times. This is used to determine if we can preserve information that can't\n  // be meaningfully merged across distinct files, such as page labels, the Info\n  // dictionary, and passwords. For example, there's no obvious way to dedup\n  // page labels when merging multiple PDF files.\n  isSingleFile = false;\n\n  #newAnnotationsParams = null;\n\n  #primaryDocument = null;\n\n  // Deduplicates resource streams (fonts/images) shared across the merged\n  // documents. Maps a cheap content key to a bucket of { ref, dictStr, stream }\n  // candidates; the key only groups possible matches, an exact byte comparison\n  // decides, so a key collision can never alias two distinct resources.\n  #resourceStreamCache = new Map();\n\n  currentDocument = null;\n\n  oldPages = [];\n\n  newPages = [];\n\n  xref = [null];\n\n  xrefWrapper = new XRefWrapper(this.xref, () => this.newRef);\n\n  newRefCount = 1;\n\n  namesDict = null;\n\n  version = \"1.7\";\n\n  pageLabels = null;\n\n  namedDestinations = new Map();\n\n  parentTree = new Map();\n\n  structTreeKids = [];\n\n  idTree = new Map();\n\n  classMap = new Dict();\n\n  roleMap = new Dict();\n\n  namespaces = new Map();\n\n  structTreeAF = [];\n\n  structTreePronunciationLexicon = [];\n\n  fields = [];\n\n  acroFormDefaultAppearance = \"\";\n\n  acroFormDefaultResources = null;\n\n  acroFormNeedAppearances = false;\n\n  acroFormSigFlags = 0;\n\n  acroFormCalculationOrder = null;\n\n  acroFormQ = 0;\n\n  outlineItems = null;\n\n  embeddedFiles = new Map();\n\n  constructor({ useObjectStreams = true, title = \"\", author = \"\" } = {}) {\n    [this.rootRef, this.rootDict] = this.newDict;\n    [this.infoRef, this.infoDict] = this.newDict;\n    [this.pagesRef, this.pagesDict] = this.newDict;\n    this.useObjectStreams = useObjectStreams;\n    this.objStreamRefs = useObjectStreams ? new Set() : null;\n    this.title = title;\n    this.author = author;\n  }\n\n  /**\n   * Get a new reference for an object in the PDF.\n   * @returns {Ref}\n   */\n  get newRef() {\n    return Ref.get(this.newRefCount++, 0);\n  }\n\n  /**\n   * Create a new dictionary and its reference.\n   * @returns {[Ref, Dict]}\n   */\n  get newDict() {\n    const ref = this.newRef;\n    const dict = (this.xref[ref.num] = new Dict());\n    return [ref, dict];\n  }\n\n  /**\n   * Clone an object in the PDF.\n   * @param {*} obj\n   * @param {XRef} xref\n   * @returns {Promise<Ref>}\n   */\n  async #cloneObject(obj, xref) {\n    const ref = this.newRef;\n    this.xref[ref.num] = await this.#collectDependencies(obj, true, xref);\n    return ref;\n  }\n\n  cloneDict(dict) {\n    const newDict = dict.clone();\n    newDict.xref = this.xrefWrapper;\n    return newDict;\n  }\n\n  /**\n   * Collect the dependencies of an object and create new references for each\n   * dependency.\n   * @param {*} obj\n   * @param {boolean} mustClone\n   * @param {XRef} xref\n   * @param {RefSet} resourceStreamPath\n   * @returns {Promise<*>}\n   */\n  async #collectDependencies(\n    obj,\n    mustClone,\n    xref,\n    resourceStreamPath = new RefSet()\n  ) {\n    if (obj instanceof Ref) {\n      const {\n        currentDocument: { oldRefMapping },\n      } = this;\n      const existingRef = oldRefMapping.get(obj);\n      if (existingRef) {\n        return existingRef;\n      }\n      const oldRef = obj;\n      obj = await xref.fetchAsync(oldRef);\n      if (typeof obj === \"number\") {\n        // Simple value; no need to create a new reference.\n        return obj;\n      }\n\n      // Deduplicate fonts/images against earlier copies (common when merging\n      // exports of the same template). Reusing a copy costs no reference, so\n      // allocation is deferred to #collectResourceStream until it's known new.\n      if (obj instanceof BaseStream && this.#isResourceStream(obj.dict)) {\n        return this.#collectResourceStream(\n          oldRef,\n          obj,\n          xref,\n          resourceStreamPath\n        );\n      }\n\n      const newRef = this.newRef;\n      oldRefMapping.put(oldRef, newRef);\n\n      if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n        if (isDict(obj, \"Page\") && !this.currentDocument.pagesMap.has(oldRef)) {\n          throw new Error(\n            \"Add a deleted page to the document is not supported.\"\n          );\n        }\n      }\n\n      this.xref[newRef.num] = await this.#collectDependencies(\n        obj,\n        true,\n        xref,\n        resourceStreamPath\n      );\n      return newRef;\n    }\n    const promises = [];\n    const {\n      currentDocument: { postponedRefCopies },\n    } = this;\n    if (Array.isArray(obj)) {\n      if (mustClone) {\n        obj = obj.slice();\n      }\n      for (let i = 0, ii = obj.length; i < ii; i++) {\n        const postponedActions =\n          obj[i] instanceof Ref && postponedRefCopies.get(obj[i]);\n        if (postponedActions) {\n          // The object is a reference that needs to be copied later.\n          postponedActions.push(ref => (obj[i] = ref));\n          continue;\n        }\n        promises.push(\n          this.#collectDependencies(\n            obj[i],\n            true,\n            xref,\n            resourceStreamPath\n          ).then(newObj => (obj[i] = newObj))\n        );\n      }\n      await Promise.all(promises);\n      return obj;\n    }\n    let dict;\n    if (obj instanceof BaseStream) {\n      ({ dict } = obj = obj.getOriginalStream().clone());\n      dict.xref = this.xrefWrapper;\n    } else if (obj instanceof Dict) {\n      if (mustClone) {\n        obj = obj.clone();\n        obj.xref = this.xrefWrapper;\n      }\n      dict = obj;\n    }\n    if (dict) {\n      for (const [key, rawObj] of dict.getRawEntries()) {\n        const postponedActions =\n          rawObj instanceof Ref && postponedRefCopies.get(rawObj);\n        if (postponedActions) {\n          // The object is a reference that needs to be copied later.\n          postponedActions.push(ref => dict.set(key, ref));\n          continue;\n        }\n        promises.push(\n          this.#collectDependencies(\n            rawObj,\n            true,\n            xref,\n            resourceStreamPath\n          ).then(newObj => dict.set(key, newObj))\n        );\n      }\n      await Promise.all(promises);\n    }\n\n    return obj;\n  }\n\n  /**\n   * Whether a stream is worth deduplicating: an image or an embedded font\n   * program (large and often shared). Per-page content streams etc. are\n   * essentially never shared, so hashing them would be wasted work.\n   * @param {Dict} dict\n   * @returns {boolean}\n   */\n  #isResourceStream(dict) {\n    const subtype = dict.get(\"Subtype\");\n    return (\n      isName(subtype, \"Image\") ||\n      // FontFile/FontFile2 carry Length1; FontFile3 has one of these Subtypes.\n      dict.has(\"Length1\") ||\n      isName(subtype, \"Type1C\") ||\n      isName(subtype, \"CIDFontType0C\") ||\n      isName(subtype, \"OpenType\")\n    );\n  }\n\n  /**\n   * Read the raw, still-encoded bytes of a stream.\n   * @param {BaseStream} stream\n   * @returns {Uint8Array}\n   */\n  #rawStreamBytes(stream) {\n    const original = stream.getOriginalStream();\n    original.reset();\n    return original.getBytes();\n  }\n\n  /**\n   * Serialize a dictionary to a canonical string. Two clones of the same source\n   * dict serialize identically, so this works as a bucket key and as an exact\n   * comparison.\n   * @param {Dict} dict\n   * @returns {Promise<string>}\n   */\n  async #serializeDict(dict) {\n    const buffer = [];\n    await writeValue(dict, buffer, /* transform = */ null);\n    return buffer.join(\"\");\n  }\n\n  /**\n   * Cheap bucket key for a resource stream: the serialized dict, the byte\n   * length, and a few sampled chunks (so large payloads aren't fully hashed).\n   * Collisions only group candidates that are then compared byte-for-byte, so\n   * they cost time but never cause a wrong merge.\n   * @param {string} dictStr\n   * @param {Uint8Array} bytes\n   * @returns {string}\n   */\n  #resourceStreamKey(dictStr, bytes) {\n    const SAMPLE_SIZE = 256;\n    const SAMPLE_COUNT = 4;\n    const { length } = bytes;\n    const hash = new MurmurHash3_64();\n    hash.update(dictStr);\n    hash.update(`#${length}`);\n    if (length <= SAMPLE_SIZE * SAMPLE_COUNT) {\n      hash.update(bytes);\n    } else {\n      const step = Math.floor((length - SAMPLE_SIZE) / (SAMPLE_COUNT - 1));\n      for (let i = 0; i < SAMPLE_COUNT; i++) {\n        const start = Math.min(i * step, length - SAMPLE_SIZE);\n        hash.update(bytes.subarray(start, start + SAMPLE_SIZE));\n      }\n    }\n    return hash.hexdigest();\n  }\n\n  /**\n   * Clone a resource stream and return its output reference, reusing an earlier\n   * copy when possible. The reference is allocated lazily (in\n   * #dedupResourceStream), so a reused resource leaves no unused reference.\n   * @param {Ref} oldRef\n   * @param {BaseStream} stream\n   * @param {XRef} xref\n   * @param {RefSet} resourceStreamPath\n   * @returns {Promise<Ref>}\n   */\n  async #collectResourceStream(oldRef, stream, xref, resourceStreamPath) {\n    const {\n      currentDocument: { oldRefMapping, resourceStreamPromises },\n    } = this;\n\n    // Re-entry means a (malformed) cycle back to this stream: allocate its\n    // reference now to break the loop, like the generic path's eager alloc.\n    if (resourceStreamPath.has(oldRef)) {\n      let ref = oldRefMapping.get(oldRef);\n      if (!ref) {\n        ref = this.newRef;\n        oldRefMapping.put(oldRef, ref);\n      }\n      return ref;\n    }\n\n    const key = oldRef.toString();\n    const pending = resourceStreamPromises.get(key);\n    if (pending) {\n      return pending;\n    }\n\n    // The path only grows here, so the shared parent path can be passed\n    // read-only everywhere else; snapshot it, add this stream, and recurse.\n    const childPath = new RefSet(resourceStreamPath);\n    childPath.put(oldRef);\n\n    const promise = Promise.resolve().then(async () => {\n      const collected = await this.#collectDependencies(\n        stream,\n        true,\n        xref,\n        childPath\n      );\n\n      // A cycle already allocated a reference, so store the clone there.\n      const cycleRef = oldRefMapping.get(oldRef);\n      if (cycleRef) {\n        this.xref[cycleRef.num] = collected;\n        return cycleRef;\n      }\n\n      const ref = await this.#dedupResourceStream(collected);\n      oldRefMapping.put(oldRef, ref);\n      return ref;\n    });\n    resourceStreamPromises.set(key, promise);\n    try {\n      return await promise;\n    } finally {\n      if (resourceStreamPromises.get(key) === promise) {\n        resourceStreamPromises.delete(key);\n      }\n    }\n  }\n\n  /**\n   * Return the reference for a cloned resource stream, reusing a byte-identical\n   * earlier copy or else allocating and registering a new one.\n   * @param {BaseStream} stream\n   * @returns {Promise<Ref>}\n   */\n  async #dedupResourceStream(stream) {\n    const dictStr = await this.#serializeDict(stream.dict);\n    const bytes = this.#rawStreamBytes(stream);\n    const key = this.#resourceStreamKey(dictStr, bytes);\n\n    const bucket = this.#resourceStreamCache.getOrInsertComputed(key, makeArr);\n    // Same key only means \"maybe equal\": confirm with an exact comparison.\n    for (const entry of bucket) {\n      if (\n        entry.dictStr === dictStr &&\n        isArrayEqual(this.#rawStreamBytes(entry.stream), bytes)\n      ) {\n        return entry.ref;\n      }\n    }\n    const ref = this.newRef;\n    this.xref[ref.num] = stream;\n    bucket.push({ ref, dictStr, stream });\n    return ref;\n  }\n\n  async #cloneStructTreeNode(\n    parentStructRef,\n    node,\n    xref,\n    removedStructElements,\n    dedupIDs,\n    dedupClasses,\n    dedupRoles,\n    visited = new RefSet()\n  ) {\n    const {\n      currentDocument: { pagesMap, oldRefMapping },\n    } = this;\n    const pg = node.getRaw(\"Pg\");\n    if (pg instanceof Ref && !pagesMap.has(pg)) {\n      return null;\n    }\n    let kids;\n    const k = (kids = node.getRaw(\"K\"));\n    if (k instanceof Ref) {\n      // We're only interested by ref referencing nodes and not an array.\n      if (visited.has(k)) {\n        return null;\n      }\n      kids = await xref.fetchAsync(k);\n      if (!Array.isArray(kids)) {\n        kids = [k];\n      }\n    }\n    kids = Array.isArray(kids) ? kids : [kids];\n    const newKids = [];\n    const structElemIndices = [];\n    for (let kid of kids) {\n      const kidRef = kid instanceof Ref ? kid : null;\n      if (kidRef) {\n        if (visited.has(kidRef)) {\n          continue;\n        }\n        visited.put(kidRef);\n        kid = await xref.fetchAsync(kidRef);\n      }\n      if (typeof kid === \"number\") {\n        newKids.push(kid);\n        continue;\n      }\n      if (!(kid instanceof Dict)) {\n        continue;\n      }\n      const pgRef = kid.getRaw(\"Pg\");\n      if (pgRef instanceof Ref && !pagesMap.has(pgRef)) {\n        continue;\n      }\n      const type = kid.get(\"Type\");\n      if (!type || isName(type, \"StructElem\")) {\n        let setAsSpan = false;\n        if (kidRef && removedStructElements.has(kidRef)) {\n          if (!isName(kid.get(\"S\"), \"Link\")) {\n            continue;\n          }\n          // A link annotation has been removed but we still need to keep the\n          // node in order to preserve the structure tree. Mark it as a Span\n          // so that it doesn't affect the semantics.\n          setAsSpan = true;\n        }\n        const newKidRef = await this.#cloneStructTreeNode(\n          kidRef,\n          kid,\n          xref,\n          removedStructElements,\n          dedupIDs,\n          dedupClasses,\n          dedupRoles,\n          visited\n        );\n        if (newKidRef) {\n          structElemIndices.push(newKids.length);\n          newKids.push(newKidRef);\n          if (kidRef) {\n            oldRefMapping.put(kidRef, newKidRef);\n          }\n          if (setAsSpan) {\n            this.xref[newKidRef.num].setIfName(\"S\", \"Span\");\n          }\n        }\n        continue;\n      }\n      if (isName(type, \"OBJR\")) {\n        if (!kidRef) {\n          continue;\n        }\n        const newKidRef = oldRefMapping.get(kidRef);\n        if (!newKidRef) {\n          continue;\n        }\n        const newKid = this.xref[newKidRef.num];\n        // Fix the missing StructParent entry in the referenced object.\n        const objRef = newKid.getRaw(\"Obj\");\n        if (objRef instanceof Ref) {\n          const obj = this.xref[objRef.num];\n          if (\n            obj instanceof Dict &&\n            !obj.has(\"StructParent\") &&\n            parentStructRef\n          ) {\n            const structParent = this.parentTree.size;\n            this.parentTree.set(structParent, [oldRefMapping, parentStructRef]);\n            obj.set(\"StructParent\", structParent);\n          }\n        }\n        newKids.push(newKidRef);\n        continue;\n      }\n      if (isName(type, \"MCR\")) {\n        const newKid = await this.#collectDependencies(\n          kidRef || kid,\n          true,\n          xref\n        );\n        newKids.push(newKid);\n        continue;\n      }\n      if (kidRef) {\n        const newKidRef = await this.#collectDependencies(kidRef, true, xref);\n        newKids.push(newKidRef);\n      }\n    }\n    if (kids.length !== 0 && newKids.length === 0) {\n      return null;\n    }\n\n    const newNodeRef = this.newRef;\n    const newNode = (this.xref[newNodeRef.num] = this.cloneDict(node));\n    // Don't collect for ID or C since they will be fixed later.\n    newNode.delete(\"ID\");\n    newNode.delete(\"C\");\n    newNode.delete(\"K\");\n    newNode.delete(\"P\");\n    newNode.delete(\"S\");\n    await this.#collectDependencies(newNode, false, xref);\n\n    // Fix the class names.\n    const classNames = node.get(\"C\");\n    if (classNames instanceof Name) {\n      const newClassName = dedupClasses.get(classNames.name);\n      newNode.set(\"C\", newClassName ? Name.get(newClassName) : classNames);\n    } else if (Array.isArray(classNames)) {\n      const newClassNames = [];\n      for (const className of classNames) {\n        if (className instanceof Name) {\n          const newClassName = dedupClasses.get(className.name);\n          newClassNames.push(newClassName ? Name.get(newClassName) : className);\n        }\n      }\n      newNode.set(\"C\", newClassNames);\n    }\n\n    // Fix the role name.\n    const roleName = node.get(\"S\");\n    if (roleName instanceof Name) {\n      const newRoleName = dedupRoles.get(roleName.name);\n      newNode.set(\"S\", newRoleName ? Name.get(newRoleName) : roleName);\n    }\n\n    // Fix the ID.\n    const id = node.get(\"ID\");\n    if (typeof id === \"string\") {\n      const stringId = stringToPDFString(id, /* keepEscapeSequence = */ false);\n      const newId = dedupIDs.get(stringId);\n      newNode.set(\"ID\", newId ? stringToAsciiOrUTF16BE(newId) : id);\n    }\n\n    // Table headers may contain IDs that need to be deduplicated.\n    let attributes = newNode.get(\"A\");\n    if (attributes) {\n      if (!Array.isArray(attributes)) {\n        attributes = [attributes];\n      }\n      for (let attr of attributes) {\n        attr = this.xrefWrapper.fetchIfRef(attr);\n        if (isName(attr.get(\"O\"), \"Table\") && attr.has(\"Headers\")) {\n          const headers = this.xrefWrapper.fetchIfRef(attr.getRaw(\"Headers\"));\n          if (Array.isArray(headers)) {\n            for (let i = 0, ii = headers.length; i < ii; i++) {\n              const newId = dedupIDs.get(\n                stringToPDFString(headers[i], /* keepEscapeSequence = */ false)\n              );\n              if (newId) {\n                headers[i] = newId;\n              }\n            }\n          }\n        }\n      }\n    }\n\n    for (const index of structElemIndices) {\n      const structElemRef = newKids[index];\n      const structElem = this.xref[structElemRef.num];\n      structElem.set(\"P\", newNodeRef);\n    }\n\n    if (newKids.length === 1) {\n      newNode.set(\"K\", newKids[0]);\n    } else if (newKids.length > 1) {\n      newNode.set(\"K\", newKids);\n    }\n\n    return newNodeRef;\n  }\n\n  /**\n   * @typedef {Object} PageInfo\n   * @property {PDFDocument} [document]\n   * @property {ImageBitmap} [image]\n   *  image to insert as a synthetic page.\n   * @property {Array<Array<number>|number>} [includePages]\n   *  included ranges (inclusive) or indices.\n   * @property {Array<Array<number>|number>} [excludePages]\n   *  excluded ranges (inclusive) or indices.\n   * @property {Array<number>} [pageIndices]\n   *  position of the pages in the final document.\n   * @property {number} [insertAfter]\n   *  0-based index in the base sequential sequence after which to insert the\n   *  pages. When every contributing pageInfo has pageIndices, this is\n   *  interpreted against that explicit layout. Cannot be combined with\n   *  pageIndices on the same entry.\n   */\n\n  /**\n   * Return the document-local page indices that pass the include/exclude\n   * filters for the given pageInfo, in document order.\n   * @param {PageInfo} pageInfo\n   * @returns {Array<number>}\n   */\n  #getFilteredPageIndices({ document, includePages, excludePages }) {\n    if (!document) {\n      return [];\n    }\n    const compile = list => {\n      if (!list?.length) {\n        return null;\n      }\n      const indices = new Set();\n      const ranges = [];\n      for (const item of list) {\n        if (Array.isArray(item)) {\n          ranges.push(item);\n        } else {\n          indices.add(item);\n        }\n      }\n      return { indices, ranges };\n    };\n    const matches = (index, { indices, ranges }) =>\n      indices.has(index) ||\n      ranges.some(([start, end]) => index >= start && index <= end);\n    const inc = compile(includePages);\n    const exc = compile(excludePages);\n    const result = [];\n    for (let i = 0, ii = document.numPages; i < ii; i++) {\n      if (exc && matches(i, exc)) {\n        continue;\n      }\n      if (!inc || matches(i, inc)) {\n        result.push(i);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Resolve insertAfter pageInfos by converting them (and sequential pageInfos)\n   * to explicit pageIndices, shifting indices to accommodate each insertion.\n   * @param {Array<PageInfo>} pageInfos\n   * @returns {Array<PageInfo>}\n   */\n  #resolveInsertAfterIndices(pageInfos) {\n    const counts = new Array(pageInfos.length);\n    const sequence = [];\n    const insertAfterList = [];\n    for (let i = 0; i < pageInfos.length; i++) {\n      const info = pageInfos[i];\n      let count;\n      if (info.image) {\n        count = counts[i] = 1;\n      } else if (!info.document) {\n        counts[i] = 0;\n        continue;\n      } else {\n        count = counts[i] = this.#getFilteredPageIndices(info).length;\n      }\n      if (info.pageIndices) {\n        continue;\n      }\n      if (info.insertAfter === undefined) {\n        for (let j = 0; j < count; j++) {\n          sequence.push(i);\n        }\n      } else {\n        insertAfterList.push({ i, insertAfter: info.insertAfter, count });\n      }\n    }\n    if (insertAfterList.length === 0) {\n      return pageInfos;\n    }\n\n    const hasContent = info => !!(info.document || info.image);\n\n    // Partial pageIndices rely on auto-fill in extractPages, which races with\n    // the slots insertAfter assigns here.\n    for (let i = 0; i < pageInfos.length; i++) {\n      const info = pageInfos[i];\n      if (\n        hasContent(info) &&\n        info.pageIndices &&\n        info.pageIndices.length < counts[i]\n      ) {\n        throw new Error(\n          \"extractPages: partial pageIndices cannot be combined with insertAfter entries.\"\n        );\n      }\n    }\n\n    insertAfterList.sort((a, b) => a.insertAfter - b.insertAfter || a.i - b.i);\n\n    // If there is no base sequential sequence, resolve insertAfter against the\n    // explicit layout. Shift pageIndices values but keep their array order:\n    // extractPages maps each filtered source page to the corresponding\n    // pageIndices entry.\n    if (\n      sequence.length === 0 &&\n      pageInfos.some(info => hasContent(info) && info.pageIndices)\n    ) {\n      const updatedPageInfos = pageInfos.slice();\n      let maxExistingPos = -1;\n      for (const info of pageInfos) {\n        if (!hasContent(info) || !info.pageIndices) {\n          continue;\n        }\n        for (const idx of info.pageIndices) {\n          if (idx > maxExistingPos) {\n            maxExistingPos = idx;\n          }\n        }\n      }\n      let offset = 0;\n      for (const { i, insertAfter, count } of insertAfterList) {\n        const threshold = Math.min(\n          Math.max(insertAfter, -1) + offset,\n          maxExistingPos\n        );\n        for (let j = 0; j < updatedPageInfos.length; j++) {\n          const existingInfo = updatedPageInfos[j];\n          if (\n            !hasContent(existingInfo) ||\n            !existingInfo.pageIndices ||\n            existingInfo.pageIndices.every(idx => idx <= threshold)\n          ) {\n            continue;\n          }\n          updatedPageInfos[j] = {\n            ...existingInfo,\n            pageIndices: existingInfo.pageIndices.map(idx =>\n              idx > threshold ? idx + count : idx\n            ),\n          };\n        }\n        const pageIndices = [];\n        for (let k = 0; k < count; k++) {\n          pageIndices.push(threshold + 1 + k);\n        }\n        const result = { ...updatedPageInfos[i], pageIndices };\n        delete result.insertAfter;\n        updatedPageInfos[i] = result;\n        offset += count;\n        maxExistingPos += count;\n      }\n      return updatedPageInfos;\n    }\n\n    let offset = 0;\n    for (const { i, insertAfter, count } of insertAfterList) {\n      const insertPos = Math.max(insertAfter, -1) + 1 + offset;\n      sequence.splice(insertPos, 0, ...new Array(count).fill(i));\n      offset += count;\n    }\n\n    const pageIndicesArr = new Array(pageInfos.length);\n    for (let pos = 0; pos < sequence.length; pos++) {\n      const infoIdx = sequence[pos];\n      (pageIndicesArr[infoIdx] ||= []).push(pos);\n    }\n\n    return pageInfos.map((info, i) => {\n      if (!hasContent(info) || info.pageIndices) {\n        return info;\n      }\n      const result = { ...info, pageIndices: pageIndicesArr[i] || [] };\n      delete result.insertAfter;\n      return result;\n    });\n  }\n\n  /**\n   * Extract pages from the given documents.\n   * @param {Array<PageInfo>} pageInfos\n   * @param {Object} annotationStorage - The annotation storage containing the\n   *  annotations to be merged into the new document.\n   * @param {PDFDocument} primaryDocument - The document the annotation storage\n   *  belongs to.\n   * @param {MessageHandler} handler - The message handler to use for processing\n   *  the annotations.\n   * @param {WorkerTask} task - The worker task to use for reporting progress\n   *  and cancellation.\n   * @return {Promise<void>}\n   */\n  async extractPages(\n    pageInfos,\n    annotationStorage,\n    primaryDocument,\n    handler,\n    task\n  ) {\n    this.#primaryDocument = primaryDocument;\n    pageInfos = this.#resolveInsertAfterIndices(pageInfos);\n    const promises = [];\n    let newIndex = 0;\n    const reservePageSlot = newPageIndex => {\n      if (!Number.isInteger(newPageIndex) || newPageIndex < 0) {\n        throw new Error(\"extractPages: invalid page index.\");\n      }\n      if (this.oldPages[newPageIndex] !== undefined) {\n        throw new Error(\"extractPages: overlapping pageIndices.\");\n      }\n      // Reserve the slot immediately because page/image collection can be\n      // async.\n      this.oldPages[newPageIndex] = null;\n    };\n    // Image entries don't carry document identity, so ignore them when\n    // deciding whether we're operating on a single source PDF.\n    const docPageInfos = pageInfos.filter(info => !!info.document);\n    this.isSingleFile =\n      docPageInfos.length === 1 ||\n      (docPageInfos.length > 0 &&\n        docPageInfos.every(info => info.document === docPageInfos[0].document));\n    const allDocumentData = [];\n\n    if (annotationStorage) {\n      this.#newAnnotationsParams = {\n        handler,\n        task,\n        newAnnotationsByPage: getNewAnnotationsMap(annotationStorage),\n        imagesPromises: AnnotationFactory.generateImages(\n          annotationStorage.values(),\n          this.xrefWrapper,\n          true\n        ),\n      };\n    }\n\n    const imageEntries = [];\n    for (const pageInfo of pageInfos) {\n      const { document, image, includePages, excludePages, pageIndices } =\n        pageInfo;\n      if (image) {\n        if (pageIndices) {\n          newIndex = -1;\n          if (pageIndices.length > 1) {\n            throw new Error(\"extractPages: too many pageIndices.\");\n          }\n        }\n        // Image entries are inserted as synthetic pages. Reserve a slot now;\n        // the actual page dict is built after real pages are collected so\n        // that we know the modal MediaBox dimensions to use.\n        let newPageIndex;\n        if (pageIndices?.length) {\n          newPageIndex = pageIndices[0];\n        } else if (newIndex !== -1) {\n          newPageIndex = newIndex++;\n        } else {\n          for (\n            newPageIndex = 0;\n            this.oldPages[newPageIndex] !== undefined;\n            newPageIndex++\n          ) {\n            /* empty */\n          }\n        }\n        reservePageSlot(newPageIndex);\n        imageEntries.push({ image, slot: newPageIndex });\n        continue;\n      }\n      if (!document) {\n        continue;\n      }\n      if (pageIndices) {\n        newIndex = -1;\n      }\n      const filteredPageIndices = this.#getFilteredPageIndices({\n        document,\n        includePages,\n        excludePages,\n      });\n      if (pageIndices && pageIndices.length > filteredPageIndices.length) {\n        throw new Error(\"extractPages: too many pageIndices.\");\n      }\n      const documentData = new DocumentData(document);\n      allDocumentData.push(documentData);\n      promises.push(this.#collectDocumentData(documentData));\n      let pageIndex = 0;\n      for (const i of filteredPageIndices) {\n        let newPageIndex;\n        if (pageIndices) {\n          newPageIndex = pageIndices[pageIndex++];\n        }\n        if (newPageIndex === undefined) {\n          if (newIndex !== -1) {\n            newPageIndex = newIndex++;\n          } else {\n            // Find the first available index in the newPages array.\n            // This is needed when the pageIndices option is used since the\n            // pages can be added in any order.\n            for (\n              newPageIndex = 0;\n              this.oldPages[newPageIndex] !== undefined;\n              newPageIndex++\n            ) {\n              /* empty */\n            }\n          }\n        }\n        reservePageSlot(newPageIndex);\n        promises.push(\n          document.getPage(i).then(page => {\n            this.oldPages[newPageIndex] = new PageData(page, documentData);\n          })\n        );\n      }\n    }\n    await Promise.all(promises);\n    for (let i = 0, ii = this.oldPages.length; i < ii; i++) {\n      if (this.oldPages[i] === undefined) {\n        throw new Error(\"extractPages: sparse pageIndices.\");\n      }\n    }\n    promises.length = 0;\n\n    this.#collectValidDestinations(allDocumentData);\n    this.#collectOutlineDestinations(allDocumentData);\n    this.#collectPageLabels();\n\n    for (const page of this.oldPages) {\n      if (page) {\n        promises.push(this.#postCollectPageData(page));\n      }\n    }\n    await Promise.all(promises);\n\n    this.#findDuplicateNamedDestinations();\n    this.#setPostponedRefCopies(allDocumentData);\n\n    const imageSlots = new Map();\n    for (const entry of imageEntries) {\n      imageSlots.set(entry.slot, entry);\n    }\n    const modalPageSize = imageSlots.size > 0 ? this.#modalPageSize() : null;\n\n    for (let i = 0, ii = this.oldPages.length; i < ii; i++) {\n      const imageEntry = imageSlots.get(i);\n      if (imageEntry) {\n        this.newPages[i] = await this.#makeImagePage(\n          imageEntry.image,\n          modalPageSize\n        );\n      } else {\n        this.newPages[i] = await this.#makePageCopy(i, null);\n      }\n    }\n\n    this.#fixPostponedRefCopies(allDocumentData);\n    await this.#mergeStructTrees(allDocumentData);\n    await this.#mergeAcroForms(allDocumentData);\n    this.#buildOutline(allDocumentData);\n    await this.#collectEmbeddedFiles(allDocumentData);\n\n    return this.writePDF();\n  }\n\n  /**\n   * Collect the document data.\n   * @param {DocumentData} documentData\n   * @return {Promise<void>}\n   */\n  async #collectDocumentData(documentData) {\n    const {\n      document: { pdfManager, xref },\n    } = documentData;\n    await Promise.all([\n      pdfManager\n        .ensureCatalog(\"destinations\")\n        .then(destinations => (documentData.destinations = destinations)),\n      pdfManager\n        .ensureCatalog(\"rawPageLabels\")\n        .then(pageLabels => (documentData.pageLabels = pageLabels)),\n      pdfManager\n        .ensureCatalog(\"structTreeRoot\")\n        .then(structTreeRoot => (documentData.structTreeRoot = structTreeRoot)),\n      pdfManager\n        .ensureCatalog(\"acroForm\")\n        .then(acroForm => (documentData.acroForm = acroForm)),\n      pdfManager\n        .ensureCatalog(\"documentOutlineForEditor\")\n        .then(outline => (documentData.outline = outline)),\n      pdfManager\n        .ensureCatalog(\"rawEmbeddedFiles\")\n        .then(ef => (documentData.embeddedFiles = ef)),\n    ]);\n    const structTreeRoot = documentData.structTreeRoot;\n    if (structTreeRoot) {\n      const rootDict = structTreeRoot.dict;\n      const parentTree = rootDict.get(\"ParentTree\");\n      if (parentTree) {\n        const numberTree = new NumberTree(parentTree, xref);\n        documentData.parentTree = numberTree.getAll(/* isRaw = */ true);\n      }\n      const idTree = rootDict.get(\"IDTree\");\n      if (idTree) {\n        const nameTree = new NameTree(idTree, xref);\n        documentData.idTree = nameTree.getAll(/* isRaw = */ true);\n      }\n      documentData.roleMap = rootDict.get(\"RoleMap\") || null;\n      documentData.classMap = rootDict.get(\"ClassMap\") || null;\n      let namespaces = rootDict.get(\"Namespaces\") || null;\n      if (namespaces && !Array.isArray(namespaces)) {\n        namespaces = [namespaces];\n      }\n      documentData.namespaces = namespaces;\n      documentData.structTreeAF = rootDict.get(\"AF\") || null;\n      documentData.structTreePronunciationLexicon =\n        rootDict.get(\"PronunciationLexicon\") || null;\n    }\n  }\n\n  /**\n   * Post process the collected page data.\n   * @param {PageData} pageData\n   * @returns {Promise<void>}\n   */\n  async #postCollectPageData(pageData) {\n    const {\n      page: { xref, annotations },\n      documentData: {\n        pagesMap,\n        destinations,\n        usedNamedDestinations,\n        fieldToParent,\n      },\n    } = pageData;\n\n    if (!annotations) {\n      return;\n    }\n\n    const promises = [];\n    let newAnnotations = [];\n    let newIndex = 0;\n    let { hasSignatureAnnotations } = pageData.documentData;\n\n    // Filter out annotations that are linking to deleted pages.\n    for (const annotationRef of annotations) {\n      const newAnnotationIndex = newIndex++;\n      promises.push(\n        xref.fetchIfRefAsync(annotationRef).then(async annotationDict => {\n          if (!isName(annotationDict.get(\"Subtype\"), \"Link\")) {\n            if (isName(annotationDict.get(\"Subtype\"), \"Widget\")) {\n              hasSignatureAnnotations ||= isName(\n                annotationDict.get(\"FT\"),\n                \"Sig\"\n              );\n              const parentRef = annotationDict.get(\"Parent\") || null;\n              // We remove the parent to avoid visiting it when cloning the\n              // annotation.\n              // It'll be fixed later in #mergeAcroForms when merging the\n              // AcroForms.\n              annotationDict.delete(\"Parent\");\n              fieldToParent.put(annotationRef, parentRef);\n            }\n\n            newAnnotations[newAnnotationIndex] = annotationRef;\n            return;\n          }\n          const action = annotationDict.get(\"A\");\n          const dest =\n            action instanceof Dict\n              ? action.get(\"D\")\n              : annotationDict.get(\"Dest\");\n          if (\n            !dest /* not a destination */ ||\n            (Array.isArray(dest) &&\n              (!(dest[0] instanceof Ref) || pagesMap.has(dest[0])))\n          ) {\n            // Keep the annotation as is: it isn't linking to a deleted page.\n            newAnnotations[newAnnotationIndex] = annotationRef;\n          } else if (typeof dest === \"string\") {\n            const destString = stringToPDFString(\n              dest,\n              /* keepEscapeSequence = */ true\n            );\n            if (destinations.has(destString)) {\n              // Keep the annotation as is: the named destination is valid.\n              // Valid named destinations have been collected previously (see\n              // #collectValidDestinations).\n              newAnnotations[newAnnotationIndex] = annotationRef;\n              usedNamedDestinations.add(destString);\n            }\n          }\n        })\n      );\n    }\n\n    await Promise.all(promises);\n    newAnnotations = newAnnotations.filter(annot => !!annot);\n    pageData.annotations = newAnnotations.length > 0 ? newAnnotations : null;\n    pageData.documentData.hasSignatureAnnotations ||= hasSignatureAnnotations;\n  }\n\n  /**\n   * Some references cannot be copied right away since they correspond to some\n   * pages that haven't been processed yet. Postpone the copy of those\n   * references.\n   * @param {Array<DocumentData>} allDocumentData\n   */\n  #setPostponedRefCopies(allDocumentData) {\n    for (const { postponedRefCopies, pagesMap } of allDocumentData) {\n      for (const oldPageRef of pagesMap.keys()) {\n        postponedRefCopies.put(oldPageRef, []);\n      }\n    }\n  }\n\n  /**\n   * Fix all postponed reference copies.\n   * @param {Array<DocumentData>} allDocumentData\n   */\n  #fixPostponedRefCopies(allDocumentData) {\n    for (const { postponedRefCopies, oldRefMapping } of allDocumentData) {\n      for (const [oldRef, actions] of postponedRefCopies.items()) {\n        const newRef = oldRefMapping.get(oldRef);\n        for (const action of actions) {\n          action(newRef);\n        }\n      }\n      postponedRefCopies.clear();\n    }\n  }\n\n  #visitObject(obj, callback, visited = new RefSet()) {\n    if (obj instanceof Ref) {\n      if (!visited.has(obj)) {\n        visited.put(obj);\n        this.#visitObject(this.xref[obj.num], callback, visited);\n      }\n      return;\n    }\n    if (Array.isArray(obj)) {\n      for (const item of obj) {\n        this.#visitObject(item, callback, visited);\n      }\n      return;\n    }\n    let dict;\n    if (obj instanceof BaseStream) {\n      ({ dict } = obj);\n    } else if (obj instanceof Dict) {\n      dict = obj;\n    }\n    if (dict) {\n      callback(dict);\n      for (const value of dict.getRawValues()) {\n        this.#visitObject(value, callback, visited);\n      }\n    }\n  }\n\n  async #mergeStructTrees(allDocumentData) {\n    let newStructParentId = 0;\n    const { parentTree: newParentTree } = this;\n    for (let i = 0, ii = this.newPages.length; i < ii; i++) {\n      if (!this.oldPages[i]) {\n        continue;\n      }\n      const {\n        documentData: {\n          parentTree,\n          oldRefMapping,\n          oldStructParentMapping,\n          usedStructParents,\n          document: { xref },\n        },\n      } = this.oldPages[i];\n      if (!parentTree) {\n        continue;\n      }\n      const pageRef = this.newPages[i];\n      const pageDict = this.xref[pageRef.num];\n      const visited = new RefSet();\n      visited.put(pageRef);\n\n      // Visit the new page in order to collect used StructParent entries.\n      this.#visitObject(\n        pageDict,\n        dict => {\n          const structParent =\n            dict.get(\"StructParent\") ?? dict.get(\"StructParents\");\n          if (typeof structParent !== \"number\") {\n            return;\n          }\n          usedStructParents.add(structParent);\n          let parent = parentTree.get(structParent);\n          const parentRef = parent instanceof Ref ? parent : null;\n          if (parentRef) {\n            const array = xref.fetch(parentRef);\n            if (Array.isArray(array)) {\n              parent = array;\n            }\n          }\n          if (Array.isArray(parent) && parent.every(ref => ref === null)) {\n            parent = null;\n          }\n          if (!parent) {\n            if (dict.has(\"StructParent\")) {\n              dict.delete(\"StructParent\");\n            } else {\n              dict.delete(\"StructParents\");\n            }\n            return;\n          }\n          let newStructParent = oldStructParentMapping.get(structParent);\n          if (newStructParent === undefined) {\n            newStructParent = newStructParentId++;\n            oldStructParentMapping.set(structParent, newStructParent);\n            newParentTree.set(newStructParent, [oldRefMapping, parent]);\n          }\n          if (dict.has(\"StructParent\")) {\n            dict.set(\"StructParent\", newStructParent);\n          } else {\n            dict.set(\"StructParents\", newStructParent);\n          }\n        },\n        visited\n      );\n    }\n\n    const {\n      structTreeKids,\n      idTree: newIdTree,\n      classMap: newClassMap,\n      roleMap: newRoleMap,\n      namespaces: newNamespaces,\n      structTreeAF: newStructTreeAF,\n      structTreePronunciationLexicon: newStructTreePronunciationLexicon,\n    } = this;\n    // Clone the struct tree nodes for each document.\n    for (const documentData of allDocumentData) {\n      const {\n        document: { xref },\n        oldRefMapping,\n        parentTree,\n        usedStructParents,\n        structTreeRoot,\n        idTree,\n        classMap,\n        roleMap,\n        namespaces,\n        structTreeAF,\n        structTreePronunciationLexicon,\n      } = documentData;\n\n      if (!structTreeRoot) {\n        continue;\n      }\n\n      this.currentDocument = documentData;\n      // Get all the removed StructElem\n      const removedStructElements = new RefSet();\n      for (const [key, value] of parentTree || []) {\n        if (!usedStructParents.has(key) && value instanceof Ref) {\n          removedStructElements.put(value);\n        }\n      }\n\n      // Deduplicate IDs in the ID tree.\n      // We keep the old node references since they will be cloned later when\n      // cloning the struct tree.\n      const dedupIDs = new Map();\n      for (const [id, nodeRef] of idTree || []) {\n        let _id = id;\n        if (newIdTree.has(id)) {\n          for (let i = 1; ; i++) {\n            const newId = `${id}_${i}`;\n            if (!newIdTree.has(newId)) {\n              dedupIDs.set(id, newId);\n              _id = newId;\n              break;\n            }\n          }\n        }\n        newIdTree.set(_id, nodeRef);\n      }\n\n      const dedupClasses = new Map();\n      if (classMap?.size > 0) {\n        // Deduplicate ClassMap entries.\n        for (let [className, classDict] of classMap) {\n          classDict = await this.#collectDependencies(classDict, true, xref);\n          if (newClassMap.has(className)) {\n            for (let i = 1; ; i++) {\n              const newClassName = `${className}_${i}`;\n              if (!newClassMap.has(newClassName)) {\n                dedupClasses.set(className, newClassName);\n                className = newClassName;\n                break;\n              }\n            }\n          }\n          newClassMap.set(className, classDict);\n        }\n      }\n\n      const dedupRoles = new Map();\n      if (roleMap?.size > 0) {\n        // Deduplicate RoleMap entries.\n        for (const [roleName, mappedName] of roleMap) {\n          const newMappedName = newRoleMap.get(roleName);\n          if (!newMappedName) {\n            newRoleMap.set(roleName, mappedName);\n            continue;\n          }\n          if (newMappedName === mappedName) {\n            continue;\n          }\n          for (let i = 1; ; i++) {\n            const newRoleName = `${roleName}_${i}`;\n            if (!newRoleMap.has(newRoleName)) {\n              dedupRoles.set(roleName, newRoleName);\n              newRoleMap.set(newRoleName, mappedName);\n              break;\n            }\n          }\n        }\n      }\n\n      if (namespaces?.length > 0) {\n        for (const namespaceRef of namespaces) {\n          const namespace = await xref.fetchIfRefAsync(namespaceRef);\n          let ns = namespace.get(\"NS\");\n          if (!ns || newNamespaces.has(ns)) {\n            continue;\n          }\n          ns = stringToPDFString(ns, /* keepEscapeSequence = */ false);\n          const newNamespace = await this.#collectDependencies(\n            namespace,\n            true,\n            xref\n          );\n          newNamespaces.set(ns, newNamespace);\n        }\n      }\n\n      if (structTreeAF) {\n        for (const afRef of structTreeAF) {\n          newStructTreeAF.push(\n            await this.#collectDependencies(afRef, true, xref)\n          );\n        }\n      }\n\n      if (structTreePronunciationLexicon) {\n        for (const lexiconRef of structTreePronunciationLexicon) {\n          newStructTreePronunciationLexicon.push(\n            await this.#collectDependencies(lexiconRef, true, xref)\n          );\n        }\n      }\n\n      // Get the kids.\n      let kids = structTreeRoot.dict.get(\"K\");\n      if (!kids) {\n        continue;\n      }\n      kids = Array.isArray(kids) ? kids : [kids];\n      for (let kid of kids) {\n        const kidRef = kid instanceof Ref ? kid : null;\n        if (kidRef && removedStructElements.has(kidRef)) {\n          continue;\n        }\n        kid = await xref.fetchIfRefAsync(kid);\n        const newKidRef = await this.#cloneStructTreeNode(\n          kidRef,\n          kid,\n          xref,\n          removedStructElements,\n          dedupIDs,\n          dedupClasses,\n          dedupRoles\n        );\n        if (newKidRef) {\n          structTreeKids.push(newKidRef);\n        }\n      }\n\n      // Fix the ID tree.\n      for (const [id, nodeRef] of idTree || []) {\n        const newNodeRef = nodeRef instanceof Ref && oldRefMapping.get(nodeRef);\n        const newId = dedupIDs.get(id) || id;\n        if (newNodeRef) {\n          newIdTree.set(newId, newNodeRef);\n        } else {\n          newIdTree.delete(newId);\n        }\n      }\n    }\n\n    for (const [key, [oldRefMapping, parent]] of newParentTree) {\n      if (!parent) {\n        newParentTree.delete(key);\n        continue;\n      }\n      // Some nodes haven't been visited while cloning the struct trees so their\n      // ref don't belong to the oldRefMapping. Remove those nodes.\n      if (!Array.isArray(parent)) {\n        const newParent = oldRefMapping.get(parent);\n        if (newParent === undefined) {\n          newParentTree.delete(key);\n        } else {\n          newParentTree.set(key, newParent);\n        }\n        continue;\n      }\n      const newParents = parent.map(\n        ref => (ref instanceof Ref && oldRefMapping.get(ref)) || null\n      );\n      if (newParents.length === 0 || newParents.every(ref => ref === null)) {\n        newParentTree.delete(key);\n        continue;\n      }\n      newParentTree.set(key, newParents);\n    }\n\n    this.currentDocument = null;\n  }\n\n  /**\n   * Collect named destinations that are still valid (i.e. pointing to kept\n   * pages).\n   * @param {Array<DocumentData>} allDocumentData\n   */\n  #collectValidDestinations(allDocumentData) {\n    // TODO: Handle OpenAction as well.\n    for (const documentData of allDocumentData) {\n      if (!documentData.destinations) {\n        continue;\n      }\n      const { destinations, pagesMap } = documentData;\n      const newDestinations = (documentData.destinations = new Map());\n      for (const [key, dest] of Object.entries(destinations)) {\n        const pageRef = dest[0];\n        const pageData = pageRef instanceof Ref && pagesMap.get(pageRef);\n        if (!pageData) {\n          continue;\n        }\n        (pageData.pointingNamedDestinations ||= new Set()).add(key);\n        newDestinations.set(key, dest);\n      }\n    }\n  }\n\n  /**\n   * Find and rename duplicate named destinations.\n   */\n  #findDuplicateNamedDestinations() {\n    const { namedDestinations } = this;\n    const getUniqueDestinationName = name => {\n      if (!namedDestinations.has(name)) {\n        return name;\n      }\n      for (let i = 1; ; i++) {\n        const dedupedName = `${name}_${i}`;\n        if (!namedDestinations.has(dedupedName)) {\n          return dedupedName;\n        }\n      }\n    };\n    for (let i = 0, ii = this.oldPages.length; i < ii; i++) {\n      const page = this.oldPages[i];\n      if (!page) {\n        continue;\n      }\n      const {\n        documentData: {\n          destinations,\n          dedupNamedDestinations,\n          usedNamedDestinations,\n        },\n      } = page;\n      let { pointingNamedDestinations } = page;\n\n      if (!pointingNamedDestinations) {\n        // No named destinations pointing to this page.\n        continue;\n      }\n      // Keep only the named destinations that are still used.\n      page.pointingNamedDestinations = pointingNamedDestinations =\n        pointingNamedDestinations.intersection(usedNamedDestinations);\n\n      for (const pointingDest of pointingNamedDestinations) {\n        if (!usedNamedDestinations.has(pointingDest)) {\n          // If the named destination isn't used, we can keep it as is.\n          continue;\n        }\n        const dest = destinations.get(pointingDest).slice();\n        if (!namedDestinations.has(pointingDest)) {\n          // If the named destination hasn't been used yet, we can keep it\n          // as is.\n          namedDestinations.set(pointingDest, dest);\n          continue;\n        }\n        // Create a new unique named destination.\n        const newName = getUniqueDestinationName(`${pointingDest}_p${i + 1}`);\n        dedupNamedDestinations.set(pointingDest, newName);\n        namedDestinations.set(newName, dest);\n      }\n    }\n  }\n\n  /**\n   * Fix named destinations in the annotations.\n   * @param {Array<Ref>} annotations\n   * @param {Map<string,string>} dedupNamedDestinations\n   */\n  #fixNamedDestinations(annotations, dedupNamedDestinations) {\n    if (dedupNamedDestinations.size === 0) {\n      return;\n    }\n    const fixDestination = (dict, key, dest) => {\n      if (typeof dest === \"string\") {\n        dict.set(\n          key,\n          dedupNamedDestinations.get(\n            stringToPDFString(dest, /* keepEscapeSequence = */ true)\n          ) || dest\n        );\n      }\n    };\n\n    for (const annotRef of annotations) {\n      const annotDict = this.xref[annotRef.num];\n      if (!isName(annotDict.get(\"Subtype\"), \"Link\")) {\n        continue;\n      }\n      const action = annotDict.get(\"A\");\n      if (action instanceof Dict && action.has(\"D\")) {\n        const dest = action.get(\"D\");\n        fixDestination(action, \"D\", dest);\n        continue;\n      }\n      const dest = annotDict.get(\"Dest\");\n      fixDestination(annotDict, \"Dest\", dest);\n    }\n  }\n\n  /**\n   * Collect named destinations referenced in the outlines so they are kept\n   * when filtering duplicate named destinations.\n   * @param {Array<DocumentData>} allDocumentData\n   */\n  #collectOutlineDestinations(allDocumentData) {\n    const collect = (items, destinations, usedNamedDestinations) => {\n      for (const item of items) {\n        if (typeof item.dest === \"string\" && destinations?.has(item.dest)) {\n          usedNamedDestinations.add(item.dest);\n        }\n        if (item.items.length > 0) {\n          collect(item.items, destinations, usedNamedDestinations);\n        }\n      }\n    };\n    for (const documentData of allDocumentData) {\n      const { outline, destinations, usedNamedDestinations } = documentData;\n      if (outline?.length) {\n        collect(outline, destinations, usedNamedDestinations);\n      }\n    }\n  }\n\n  /**\n   * Check whether an outline item has a valid destination in the output doc.\n   * @param {Object} item\n   * @param {DocumentData} documentData\n   * @returns {boolean}\n   */\n  #isValidOutlineDest(item, documentData) {\n    const { dest, action, url, unsafeUrl, attachment, setOCGState } = item;\n    // External links (including relative URLs that can't be made absolute),\n    // named actions, attachments and OCG state changes are always kept.\n    if (action || url || unsafeUrl || attachment || setOCGState) {\n      return true;\n    }\n    if (!dest) {\n      return false;\n    }\n    if (typeof dest === \"string\") {\n      const name = documentData.dedupNamedDestinations.get(dest) || dest;\n      return this.namedDestinations.has(name);\n    }\n    if (Array.isArray(dest) && dest[0] instanceof Ref) {\n      return !!documentData.oldRefMapping.get(dest[0]);\n    }\n    return false;\n  }\n\n  /**\n   * Recursively filter outline items, removing those with no valid destination\n   * and no remaining children.\n   * @param {Array} items\n   * @param {DocumentData} documentData\n   * @returns {Array}\n   */\n  #filterOutlineItems(items, documentData) {\n    const result = [];\n    for (const item of items) {\n      const filteredChildren = this.#filterOutlineItems(\n        item.items,\n        documentData\n      );\n      const hasValidOwnDest = this.#isValidOutlineDest(item, documentData);\n      if (hasValidOwnDest || filteredChildren.length > 0) {\n        result.push({\n          ...item,\n          // When the item's own destination is invalid (but it has surviving\n          // children), clear the destination and rawDict so the output item is\n          // a plain container rather than a broken link. Clearing rawDict\n          // prevents #setOutlineItemDest from cloning a GoTo action that\n          // references a deleted page via its D array.\n          dest: hasValidOwnDest ? item.dest : null,\n          rawDict: hasValidOwnDest ? item.rawDict : null,\n          items: filteredChildren,\n          _documentData: documentData,\n        });\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Filter outline trees and collect the result into this.outlineItems.\n   * Must be called after page copies are made (oldRefMapping is populated).\n   * @param {Array<DocumentData>} allDocumentData\n   */\n  #buildOutline(allDocumentData) {\n    const outlineItems = [];\n    for (const documentData of allDocumentData) {\n      const { outline } = documentData;\n      if (!outline?.length) {\n        continue;\n      }\n      outlineItems.push(...this.#filterOutlineItems(outline, documentData));\n    }\n    this.outlineItems = outlineItems.length > 0 ? outlineItems : null;\n  }\n\n  /**\n   * Write the destination or action of an outline item into the given dict.\n   * @param {Dict} itemDict\n   * @param {Object} item\n   * @returns {Promise<void>}\n   */\n  async #setOutlineItemDest(itemDict, item) {\n    const { dest, rawDict } = item;\n    const documentData = item._documentData;\n    if (dest) {\n      if (typeof dest === \"string\") {\n        const name = documentData.dedupNamedDestinations.get(dest) || dest;\n        itemDict.set(\"Dest\", stringToAsciiOrUTF16BE(name));\n      } else if (Array.isArray(dest)) {\n        const newDest = dest.slice();\n        if (newDest[0] instanceof Ref) {\n          newDest[0] = documentData.oldRefMapping.get(newDest[0]) || newDest[0];\n        }\n        itemDict.set(\"Dest\", newDest);\n      }\n      return;\n    }\n    // For all other action types (URI, GoToR, Named, SetOCGState, ...) clone\n    // the raw action dict from the original document.\n    const actionDict = rawDict?.get(\"A\");\n    if (actionDict instanceof Dict) {\n      this.currentDocument = documentData;\n      const actionRef = await this.#cloneObject(\n        actionDict,\n        documentData.document.xref\n      );\n      this.currentDocument = null;\n      itemDict.set(\"A\", actionRef);\n    }\n  }\n\n  /**\n   * Build and write the document outline (bookmarks) into the output PDF.\n   * @returns {Promise<void>}\n   */\n  async #makeOutline() {\n    const { outlineItems } = this;\n    if (!outlineItems?.length) {\n      return;\n    }\n\n    const [outlineRootRef, outlineRootDict] = this.newDict;\n    outlineRootDict.setIfName(\"Type\", \"Outlines\");\n\n    // First pass: allocate a new Ref for every item in the tree.\n    const assignRefs = items => {\n      for (const item of items) {\n        [item._ref] = this.newDict;\n        if (item.items.length > 0) {\n          assignRefs(item.items);\n        }\n      }\n    };\n    assignRefs(outlineItems);\n\n    // Second pass: fill each Dict and return the total visible item count.\n    const fillItems = async (items, parentRef) => {\n      let totalCount = 0;\n      for (let i = 0; i < items.length; i++) {\n        const item = items[i];\n        const dict = this.xref[item._ref.num];\n\n        dict.set(\"Title\", stringToAsciiOrUTF16BE(item.title));\n        dict.set(\"Parent\", parentRef);\n        if (i > 0) {\n          dict.set(\"Prev\", items[i - 1]._ref);\n        }\n        if (i < items.length - 1) {\n          dict.set(\"Next\", items[i + 1]._ref);\n        }\n\n        if (item.items.length > 0) {\n          dict.set(\"First\", item.items[0]._ref);\n          dict.set(\"Last\", item.items.at(-1)._ref);\n          const childCount = await fillItems(item.items, item._ref);\n          if (item.count !== undefined) {\n            // Preserve the original expanded/collapsed state while updating\n            // the number of visible descendants after filtering.\n            dict.set(\"Count\", item.count < 0 ? -childCount : childCount);\n          }\n          // A closed item (count < 0) hides its descendants, so it only\n          // contributes 1 to the parent's visible-item tally.\n          totalCount +=\n            item.count !== undefined && item.count < 0 ? 1 : childCount + 1;\n        } else {\n          totalCount += 1;\n        }\n\n        await this.#setOutlineItemDest(dict, item);\n\n        const flags = (item.bold ? 2 : 0) | (item.italic ? 1 : 0);\n        if (flags !== 0) {\n          dict.set(\"F\", flags);\n        }\n        if (\n          item.color &&\n          (item.color[0] !== 0 || item.color[1] !== 0 || item.color[2] !== 0)\n        ) {\n          dict.set(\"C\", [\n            item.color[0] / 255,\n            item.color[1] / 255,\n            item.color[2] / 255,\n          ]);\n        }\n      }\n      return totalCount;\n    };\n\n    const totalCount = await fillItems(outlineItems, outlineRootRef);\n    outlineRootDict.set(\"First\", outlineItems[0]._ref);\n    outlineRootDict.set(\"Last\", outlineItems.at(-1)._ref);\n    outlineRootDict.set(\"Count\", totalCount);\n\n    this.rootDict.set(\"Outlines\", outlineRootRef);\n  }\n\n  async #mergeAcroForms(allDocumentData) {\n    this.#setAcroFormDefaultBasicValues(allDocumentData);\n    this.#setAcroFormDefaultAppearance(allDocumentData);\n    this.#setAcroFormQ(allDocumentData);\n    await this.#setAcroFormDefaultResources(allDocumentData);\n    const newFields = this.fields;\n    for (const documentData of allDocumentData) {\n      let fields = documentData.acroForm?.get(\"Fields\") || null;\n      if (!fields && documentData.fieldToParent.size > 0) {\n        fields = this.#fixFields(\n          documentData.fieldToParent,\n          documentData.document.xref\n        );\n      }\n      if (Array.isArray(fields) && fields.length > 0) {\n        this.currentDocument = documentData;\n        await this.#cloneFields(newFields, fields);\n        this.currentDocument = null;\n      }\n    }\n    this.#setAcroFormCalculationOrder(allDocumentData);\n  }\n\n  #setAcroFormQ(allDocumentData) {\n    let firstQ = 0;\n    let firstDocData = null;\n    for (const documentData of allDocumentData) {\n      const q = documentData.acroForm?.get(\"Q\");\n      if (typeof q !== \"number\" || q === 0) {\n        continue;\n      }\n      if (firstDocData?.acroFormQ > 0) {\n        documentData.acroFormQ = q;\n        continue;\n      }\n      if (firstQ === 0) {\n        firstQ = q;\n        firstDocData = documentData;\n        continue;\n      }\n      if (q === firstQ) {\n        continue;\n      }\n      firstDocData.acroFormQ ||= firstQ;\n      documentData.acroFormQ = q;\n      firstQ = 0;\n    }\n\n    if (firstQ > 0) {\n      this.acroFormQ = firstQ;\n    }\n  }\n\n  #setAcroFormDefaultBasicValues(allDocumentData) {\n    let sigFlags = 0;\n    let needAppearances = false;\n    for (const documentData of allDocumentData) {\n      if (!documentData.acroForm) {\n        continue;\n      }\n      const sf = documentData.acroForm.get(\"SigFlags\");\n      if (typeof sf === \"number\" && documentData.hasSignatureAnnotations) {\n        sigFlags |= sf;\n      }\n      if (documentData.acroForm.get(\"NeedAppearances\") === true) {\n        needAppearances = true;\n      }\n    }\n    this.acroFormSigFlags = sigFlags;\n    this.acroFormNeedAppearances = needAppearances;\n  }\n\n  #setAcroFormCalculationOrder(allDocumentData) {\n    const calculationOrder = [];\n    for (const documentData of allDocumentData) {\n      const co = documentData.acroForm?.get(\"CO\") || null;\n      if (!Array.isArray(co)) {\n        continue;\n      }\n      const { oldRefMapping } = documentData;\n      for (const coRef of co) {\n        const newCoRef = coRef instanceof Ref && oldRefMapping.get(coRef);\n        if (newCoRef) {\n          calculationOrder.push(newCoRef);\n        }\n      }\n    }\n    this.acroFormCalculationOrder =\n      calculationOrder.length > 0 ? calculationOrder : null;\n  }\n\n  #setAcroFormDefaultAppearance(allDocumentData) {\n    // If all the DAs are the same we just use it in the AcroForm. Otherwise, we\n    // set the DA for each documentData and use for any annotations that don't\n    // have their own DA.\n    let firstDA = null;\n    let firstDocData = null;\n    for (const documentData of allDocumentData) {\n      const da = documentData.acroForm?.get(\"DA\") || null;\n      if (!da || typeof da !== \"string\") {\n        continue;\n      }\n      if (firstDocData?.acroFormDefaultAppearance) {\n        documentData.acroFormDefaultAppearance = da;\n        continue;\n      }\n      if (!firstDA) {\n        firstDA = da;\n        firstDocData = documentData;\n        continue;\n      }\n      if (da === firstDA) {\n        continue;\n      }\n      firstDocData.acroFormDefaultAppearance ||= firstDA;\n      documentData.acroFormDefaultAppearance = da;\n      firstDA = null;\n    }\n\n    if (firstDA) {\n      this.acroFormDefaultAppearance = firstDA;\n    }\n  }\n\n  async #setAcroFormDefaultResources(allDocumentData) {\n    let firstDR = null;\n    let firstDRRef = null;\n    let firstDocData = null;\n    for (const documentData of allDocumentData) {\n      const dr = documentData.acroForm?.get(\"DR\") || null;\n      if (!dr || !(dr instanceof Dict)) {\n        continue;\n      }\n      if (firstDocData?.acroFormDefaultResources) {\n        documentData.acroFormDefaultResources = dr;\n        continue;\n      }\n      if (!firstDR) {\n        firstDR = dr;\n        firstDRRef = documentData.acroForm.getRaw(\"DR\");\n        firstDocData = documentData;\n        continue;\n      }\n      if (deepCompare(firstDR, dr)) {\n        continue;\n      }\n      firstDocData.acroFormDefaultResources ||= firstDR;\n      documentData.acroFormDefaultResources = dr;\n      firstDR = null;\n      firstDRRef = null;\n    }\n\n    if (firstDR) {\n      this.currentDocument = firstDocData;\n      this.acroFormDefaultResources = await this.#collectDependencies(\n        firstDRRef,\n        true,\n        firstDocData.document.xref\n      );\n      this.currentDocument = null;\n    }\n  }\n\n  /**\n   * If the document has some fields but no Fields entry in the AcroForm, we\n   * need to fix that by creating a Fields entry with the oldest parent field\n   * for each field.\n   * @param {Map<Ref, Ref>} fieldToParent\n   * @param {XRef} xref\n   * @returns {Array<Ref>}\n   */\n  #fixFields(fieldToParent, xref) {\n    const newFields = [];\n    const processed = new RefSet();\n    for (const [fieldRef, parentRef] of fieldToParent) {\n      if (!parentRef) {\n        newFields.push(fieldRef);\n        continue;\n      }\n      let parent = parentRef;\n      let lastNonNullParent = parentRef;\n      while (true) {\n        parent = xref.fetchIfRef(parent)?.getRaw(\"Parent\") || null;\n        if (!parent) {\n          break;\n        }\n        lastNonNullParent = parent;\n      }\n      if (\n        lastNonNullParent instanceof Ref &&\n        !processed.has(lastNonNullParent)\n      ) {\n        newFields.push(lastNonNullParent);\n        processed.put(lastNonNullParent);\n      }\n    }\n    return newFields;\n  }\n\n  async #cloneFields(newFields, fields) {\n    const processed = new RefSet();\n    const stack = [\n      {\n        kids: fields,\n        newKids: newFields,\n        pos: 0,\n        oldParentRef: null,\n        parentRef: null,\n        parent: null,\n      },\n    ];\n    const {\n      document: { xref },\n      oldRefMapping,\n      fieldToParent,\n      acroFormDefaultAppearance,\n      acroFormDefaultResources,\n      acroFormQ,\n    } = this.currentDocument;\n    const daToFix = [];\n    const drToFix = [];\n\n    while (stack.length > 0) {\n      const data = stack.at(-1);\n      const { kids, newKids, parent, pos } = data;\n      if (pos === kids.length) {\n        stack.pop();\n        if (newKids.length === 0 || !parent) {\n          continue;\n        }\n\n        const parentDict = (this.xref[data.parentRef.num] =\n          this.cloneDict(parent));\n        parentDict.delete(\"Parent\");\n        parentDict.delete(\"Kids\");\n        await this.#collectDependencies(parentDict, false, xref);\n        parentDict.set(\"Kids\", newKids);\n\n        if (stack.length > 0) {\n          const lastData = stack.at(-1);\n          if (!lastData.parentRef && lastData.oldParentRef) {\n            const parentRef = (lastData.parentRef = this.newRef);\n            parentDict.set(\"Parent\", parentRef);\n            oldRefMapping.put(lastData.oldParentRef, parentRef);\n          }\n          lastData.newKids.push(data.parentRef);\n        }\n        continue;\n      }\n      const oldKidRef = kids[data.pos++];\n      if (!(oldKidRef instanceof Ref) || processed.has(oldKidRef)) {\n        continue;\n      }\n      processed.put(oldKidRef);\n      const kid = xref.fetchIfRef(oldKidRef);\n      if (kid.has(\"Kids\")) {\n        const kidsArray = kid.get(\"Kids\");\n        if (!Array.isArray(kidsArray)) {\n          continue;\n        }\n        stack.push({\n          kids: kidsArray,\n          newKids: [],\n          pos: 0,\n          oldParentRef: oldKidRef,\n          parentRef: null,\n          parent: kid,\n        });\n\n        continue;\n      }\n\n      if (!fieldToParent.has(oldKidRef)) {\n        continue;\n      }\n      const newRef = oldRefMapping.get(oldKidRef);\n      if (!newRef) {\n        continue;\n      }\n      newKids.push(newRef);\n      if (!data.parentRef && data.oldParentRef) {\n        data.parentRef = this.newRef;\n        oldRefMapping.put(data.oldParentRef, data.parentRef);\n      }\n      const newKid = this.xref[newRef.num];\n      if (data.parentRef) {\n        newKid.set(\"Parent\", data.parentRef);\n      }\n      if (\n        acroFormDefaultAppearance &&\n        isName(newKid.get(\"FT\"), \"Tx\") &&\n        !newKid.has(\"DA\")\n      ) {\n        // Fix the DA later since we need to have all the fields tree.\n        daToFix.push(newKid);\n      }\n      if (\n        acroFormDefaultResources &&\n        !newKid.has(\"Kids\") &&\n        newKid.get(\"AP\") instanceof Dict\n      ) {\n        // Fix the DR later since we need to have all the fields tree.\n        drToFix.push(newKid);\n      }\n      if (acroFormQ && !newKid.has(\"Q\")) {\n        newKid.set(\"Q\", acroFormQ);\n      }\n    }\n\n    for (const field of daToFix) {\n      const da = getInheritableProperty({ dict: field, key: \"DA\" });\n      if (!da) {\n        // No DA in a parent field, we can set the default one.\n        field.set(\"DA\", acroFormDefaultAppearance);\n      }\n    }\n    const resourcesValuesCache = new Map();\n    for (const field of drToFix) {\n      const ap = field.get(\"AP\");\n      for (const [, value] of ap) {\n        if (!(value instanceof BaseStream)) {\n          continue;\n        }\n        let resources = value.dict.getRaw(\"Resources\");\n        if (!resources) {\n          const newResourcesRef =\n            await resourcesValuesCache.getOrInsertComputed(\n              acroFormDefaultResources,\n              () => this.#cloneObject(acroFormDefaultResources, xref)\n            );\n          value.dict.set(\"Resources\", newResourcesRef);\n          continue;\n        }\n\n        resources = xref.fetchIfRef(resources);\n        for (const [\n          resKey,\n          resValue,\n        ] of acroFormDefaultResources.getRawEntries()) {\n          if (!resources.has(resKey)) {\n            let newResValue = resValue;\n            if (resValue instanceof Ref) {\n              newResValue = await this.#collectDependencies(\n                resValue,\n                true,\n                xref\n              );\n            } else if (\n              resValue instanceof Dict ||\n              resValue instanceof BaseStream ||\n              Array.isArray(resValue)\n            ) {\n              newResValue = await resourcesValuesCache.getOrInsertComputed(\n                resValue,\n                () => this.#cloneObject(resValue, xref)\n              );\n            }\n            resources.set(resKey, newResValue);\n          }\n        }\n      }\n    }\n  }\n\n  async #collectPageLabels() {\n    // We can only preserve page labels when editing a single PDF file.\n    // This is consistent with behavior in Adobe Acrobat.\n    if (!this.isSingleFile) {\n      return;\n    }\n    const firstRealPage = this.oldPages.find(p => !!p);\n    if (!firstRealPage) {\n      return;\n    }\n    const {\n      documentData: { document, pageLabels },\n    } = firstRealPage;\n    if (!pageLabels) {\n      return;\n    }\n    const numPages = document.numPages;\n    const labelsByPageIndex = new Map();\n    const oldPageIndices = new Set(\n      this.oldPages.filter(p => !!p).map(({ page: { pageIndex } }) => pageIndex)\n    );\n    let currentLabel = null;\n    let stFirstIndex = -1;\n    for (let i = 0; i < numPages; i++) {\n      const newLabel = pageLabels.get(i);\n      if (newLabel) {\n        currentLabel = newLabel;\n        stFirstIndex = currentLabel.has(\"St\") ? i : -1;\n      }\n      if (!oldPageIndices.has(i)) {\n        continue;\n      }\n      if (stFirstIndex !== -1) {\n        const st = currentLabel.get(\"St\");\n        currentLabel = this.cloneDict(currentLabel);\n        currentLabel.set(\"St\", st + (i - stFirstIndex));\n        stFirstIndex = -1;\n      }\n      labelsByPageIndex.set(i, currentLabel);\n    }\n\n    const defaultLabel = index => {\n      const label = new Dict();\n      label.setIfName(\"S\", \"D\");\n      label.set(\"St\", index + 1);\n      return label;\n    };\n    currentLabel = null;\n    const newPageLabels = (this.pageLabels = []);\n    for (let i = 0, ii = this.oldPages.length; i < ii; i++) {\n      const pageData = this.oldPages[i];\n      const label = pageData\n        ? labelsByPageIndex.get(pageData.page.pageIndex) || defaultLabel(i)\n        : defaultLabel(i);\n      if (label === currentLabel) {\n        continue;\n      }\n      currentLabel = label;\n      newPageLabels.push([i, currentLabel]);\n    }\n  }\n\n  /**\n   * Create a copy of a page.\n   * @param {number} pageIndex\n   * @returns {Promise<Ref>} the page reference in the new PDF document.\n   */\n  async #makePageCopy(pageIndex) {\n    const { page, documentData, annotations, pointingNamedDestinations } =\n      this.oldPages[pageIndex];\n    this.currentDocument = documentData;\n    const { dedupNamedDestinations, oldRefMapping } = documentData;\n    const { xref, rotate, mediaBox, resources, ref: oldPageRef } = page;\n    const pageRef = this.newRef;\n    const pageDict = (this.xref[pageRef.num] = this.cloneDict(page.pageDict));\n    oldRefMapping.put(oldPageRef, pageRef);\n\n    if (pointingNamedDestinations) {\n      for (const pointingDest of pointingNamedDestinations) {\n        const name = dedupNamedDestinations.get(pointingDest) || pointingDest;\n        const dest = this.namedDestinations.get(name);\n        dest[0] = pageRef;\n      }\n    }\n\n    // No need to keep these entries as we'll set them again later.\n    for (const key of [\n      \"Rotate\",\n      \"MediaBox\",\n      \"CropBox\",\n      \"BleedBox\",\n      \"TrimBox\",\n      \"ArtBox\",\n      \"Resources\",\n      \"Annots\",\n      \"Parent\",\n      \"UserUnit\",\n    ]) {\n      pageDict.delete(key);\n    }\n\n    const lastRef = this.newRefCount;\n    await this.#collectDependencies(pageDict, false, xref);\n\n    pageDict.set(\"Rotate\", rotate);\n    pageDict.set(\"MediaBox\", mediaBox);\n    for (const boxName of [\"CropBox\", \"BleedBox\", \"TrimBox\", \"ArtBox\"]) {\n      const box = page.getBoundingBox(boxName);\n      if (box?.some((value, index) => value !== mediaBox[index])) {\n        // These boxes are optional and their default value is the MediaBox.\n        pageDict.set(boxName, box);\n      }\n    }\n    const userUnit = page.userUnit;\n    if (userUnit !== 1) {\n      pageDict.set(\"UserUnit\", userUnit);\n    }\n    pageDict.setIfDict(\n      \"Resources\",\n      await this.#collectDependencies(resources, true, xref)\n    );\n\n    let newAnnots = null;\n\n    if (annotations) {\n      const newAnnotations = await this.#collectDependencies(\n        annotations,\n        true,\n        xref\n      );\n      this.#fixNamedDestinations(newAnnotations, dedupNamedDestinations);\n      if (Array.isArray(newAnnotations) && newAnnotations.length > 0) {\n        newAnnots = newAnnotations;\n      }\n    }\n\n    const newAnnotations =\n      documentData.document === this.#primaryDocument\n        ? this.#newAnnotationsParams?.newAnnotationsByPage?.get(page.pageIndex)\n        : null;\n    if (newAnnotations) {\n      const { handler, task, imagesPromises } = this.#newAnnotationsParams;\n      const changes = new RefSetCache();\n      const newData = await AnnotationFactory.saveNewAnnotations(\n        page.createAnnotationEvaluator(handler),\n        this.xrefWrapper,\n        task,\n        newAnnotations,\n        imagesPromises,\n        changes\n      );\n      for (const [ref, { data }] of changes.items()) {\n        this.xref[ref.num] = data;\n      }\n      newAnnots ||= [];\n      for (const { ref } of newData.annotations) {\n        newAnnots.push(ref);\n      }\n    }\n\n    pageDict.setIfArray(\"Annots\", newAnnots);\n\n    if (this.useObjectStreams) {\n      const newLastRef = this.newRefCount;\n      const pageObjectRefs = [];\n      for (let i = lastRef; i < newLastRef; i++) {\n        const obj = this.xref[i];\n        if (obj instanceof BaseStream) {\n          continue;\n        }\n        pageObjectRefs.push(Ref.get(i, 0));\n      }\n      for (let i = 0; i < pageObjectRefs.length; i += 0xffff) {\n        const objStreamRef = this.newRef;\n        this.objStreamRefs.add(objStreamRef.num);\n        this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff);\n      }\n    }\n\n    this.currentDocument = null;\n\n    return pageRef;\n  }\n\n  #modalPageSize() {\n    const counts = new Map();\n    for (const pageData of this.oldPages) {\n      if (!pageData) {\n        continue;\n      }\n      const { page } = pageData;\n      const [x0, y0, x1, y1] = page.view;\n      let width = x1 - x0;\n      let height = y1 - y0;\n      if (width <= 0 || height <= 0) {\n        continue;\n      }\n      // The synthesized page won't carry a /Rotate entry, so swap dimensions\n      // for 90/270 to match what the user sees in the source page.\n      if (page.rotate % 180 !== 0) {\n        [width, height] = [height, width];\n      }\n      const key = `${width}x${height}`;\n      const entry = counts.get(key);\n      if (entry) {\n        entry.count++;\n      } else {\n        counts.set(key, { width, height, count: 1 });\n      }\n    }\n    if (counts.size === 0) {\n      const [, , width, height] = LETTER_SIZE_MEDIABOX;\n      return { width, height };\n    }\n    let best = null;\n    for (const entry of counts.values()) {\n      if (\n        !best ||\n        entry.count > best.count ||\n        (entry.count === best.count &&\n          entry.width * entry.height > best.width * best.height)\n      ) {\n        best = entry;\n      }\n    }\n    return { width: best.width, height: best.height };\n  }\n\n  /**\n   * Create a brand-new page that displays a single image, sized to the modal\n   * page dimensions with a margin equal to 10% of the page width on every\n   * side. The image is encoded as JPEG or lossless Flate depending on its\n   * contents; when the source has transparency, an SMask carrying the alpha\n   * channel is attached so the mask is preserved on render.\n   * @param {ImageBitmap} bitmap\n   * @param {{width: number, height: number}} pageSize\n   * @returns {Promise<Ref>}\n   */\n  async #makeImagePage(bitmap, pageSize) {\n    const { width: pageW, height: pageH } = pageSize;\n    const DEFAULT_MARGIN_RATIO = 0.1;\n    const margin = pageW * DEFAULT_MARGIN_RATIO;\n    const availW = Math.max(1, pageW - 2 * margin);\n    const availH = Math.max(1, pageH - 2 * margin);\n\n    const lastRef = this.newRefCount;\n\n    const {\n      imageStream,\n      smaskStream,\n      width: imgW,\n      height: imgH,\n    } = await createImage(bitmap, this.xrefWrapper, { closeBitmap: true });\n\n    const scale = Math.min(availW / imgW, availH / imgH);\n    const drawW = imgW * scale;\n    const drawH = imgH * scale;\n    const tx = (pageW - drawW) / 2;\n    const ty = (pageH - drawH) / 2;\n\n    if (smaskStream) {\n      const smaskRef = this.newRef;\n      this.xref[smaskRef.num] = smaskStream;\n      imageStream.dict.set(\"SMask\", smaskRef);\n    }\n    const imageRef = this.newRef;\n    this.xref[imageRef.num] = imageStream;\n\n    const xobjectDict = new Dict(this.xrefWrapper);\n    xobjectDict.set(\"Im0\", imageRef);\n    const resourcesDict = new Dict(this.xrefWrapper);\n    resourcesDict.set(\"XObject\", xobjectDict);\n    resourcesDict.set(\"ProcSet\", [Name.get(\"PDF\"), Name.get(\"ImageC\")]);\n\n    const content =\n      `q ${numberToString(drawW)} 0 0 ${numberToString(drawH)} ` +\n      `${numberToString(tx)} ${numberToString(ty)} cm /Im0 Do Q`;\n    const contentsStream = new StringStream(\n      content,\n      new Dict(this.xrefWrapper)\n    );\n    const contentsRef = this.newRef;\n    this.xref[contentsRef.num] = contentsStream;\n\n    const pageRef = this.newRef;\n    const pageDict = (this.xref[pageRef.num] = new Dict(this.xrefWrapper));\n    pageDict.setIfName(\"Type\", \"Page\");\n    pageDict.set(\"MediaBox\", [0, 0, pageW, pageH]);\n    pageDict.set(\"Resources\", resourcesDict);\n    pageDict.set(\"Contents\", contentsRef);\n\n    if (this.useObjectStreams) {\n      const newLastRef = this.newRefCount;\n      const pageObjectRefs = [];\n      for (let i = lastRef; i < newLastRef; i++) {\n        const obj = this.xref[i];\n        if (obj instanceof BaseStream) {\n          continue;\n        }\n        pageObjectRefs.push(Ref.get(i, 0));\n      }\n      for (let i = 0; i < pageObjectRefs.length; i += 0xffff) {\n        const objStreamRef = this.newRef;\n        this.objStreamRefs.add(objStreamRef.num);\n        this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff);\n      }\n    }\n\n    return pageRef;\n  }\n\n  /**\n   * Create the page tree structure.\n   */\n  #makePageTree() {\n    const { newPages: pages, rootDict, pagesRef, pagesDict } = this;\n    rootDict.set(\"Pages\", pagesRef);\n    pagesDict.setIfName(\"Type\", \"Pages\");\n    pagesDict.set(\"Count\", pages.length);\n\n    const maxLeaves =\n      MAX_LEAVES_PER_PAGES_NODE <= 1 ? pages.length : MAX_LEAVES_PER_PAGES_NODE;\n    const stack = [{ dict: pagesDict, kids: pages, parentRef: pagesRef }];\n\n    while (stack.length > 0) {\n      const { dict, kids, parentRef } = stack.pop();\n      if (kids.length <= maxLeaves) {\n        dict.set(\"Kids\", kids);\n        for (const ref of kids) {\n          this.xref[ref.num].set(\"Parent\", parentRef);\n        }\n        continue;\n      }\n      const chunkSize = Math.max(maxLeaves, Math.ceil(kids.length / maxLeaves));\n      const kidsChunks = [];\n      for (let i = 0; i < kids.length; i += chunkSize) {\n        kidsChunks.push(kids.slice(i, i + chunkSize));\n      }\n      const kidsRefs = [];\n      dict.set(\"Kids\", kidsRefs);\n      for (const chunk of kidsChunks) {\n        const [kidRef, kidDict] = this.newDict;\n        kidsRefs.push(kidRef);\n        kidDict.setIfName(\"Type\", \"Pages\");\n        kidDict.set(\"Parent\", parentRef);\n        kidDict.set(\"Count\", chunk.length);\n        stack.push({ dict: kidDict, kids: chunk, parentRef: kidRef });\n      }\n    }\n  }\n\n  /**\n   * Create a name or number tree from the given map.\n   * @param {Array<[string|number, any]>} map\n   * @returns {Ref}\n   */\n  #makeNameNumTree(map, areNames) {\n    const allEntries = map.sort(\n      areNames\n        ? ([keyA], [keyB]) => keyA.localeCompare(keyB)\n        : ([keyA], [keyB]) => keyA - keyB\n    );\n    const maxLeaves =\n      MAX_IN_NAME_TREE_NODE <= 1 ? allEntries.length : MAX_IN_NAME_TREE_NODE;\n    const [treeRef, treeDict] = this.newDict;\n    const stack = [{ dict: treeDict, entries: allEntries, isRoot: true }];\n    const valueType = areNames ? \"Names\" : \"Nums\";\n\n    while (stack.length > 0) {\n      const { dict, entries, isRoot } = stack.pop();\n      if (entries.length <= maxLeaves) {\n        if (!isRoot) {\n          dict.set(\"Limits\", [entries[0][0], entries.at(-1)[0]]);\n        }\n        dict.set(valueType, entries.flat());\n        continue;\n      }\n      const entriesChunks = [];\n      const chunkSize = Math.max(\n        maxLeaves,\n        Math.ceil(entries.length / maxLeaves)\n      );\n      for (let i = 0; i < entries.length; i += chunkSize) {\n        entriesChunks.push(entries.slice(i, i + chunkSize));\n      }\n      const entriesRefs = [];\n      dict.set(\"Kids\", entriesRefs);\n      for (const chunk of entriesChunks) {\n        const [entriesRef, entriesDict] = this.newDict;\n        entriesRefs.push(entriesRef);\n        entriesDict.set(\"Limits\", [chunk[0][0], chunk.at(-1)[0]]);\n        stack.push({ dict: entriesDict, entries: chunk });\n      }\n    }\n    return treeRef;\n  }\n\n  /**\n   * Create the page labels tree if it exists.\n   */\n  #makePageLabelsTree() {\n    const { pageLabels } = this;\n    if (!pageLabels?.length) {\n      return;\n    }\n    const { rootDict } = this;\n    const pageLabelsRef = this.#makeNameNumTree(\n      this.pageLabels,\n      /* areNames = */ false\n    );\n    rootDict.set(\"PageLabels\", pageLabelsRef);\n  }\n\n  /**\n   * Collect and clone EmbeddedFiles from all source documents.\n   * @param {Array<DocumentData>} allDocumentData\n   */\n  async #collectEmbeddedFiles(allDocumentData) {\n    const { embeddedFiles } = this;\n    for (const documentData of allDocumentData) {\n      const {\n        embeddedFiles: docEmbeddedFiles,\n        document: { xref },\n      } = documentData;\n      if (!docEmbeddedFiles?.size) {\n        continue;\n      }\n      this.currentDocument = documentData;\n      for (const [key, valueRef] of docEmbeddedFiles) {\n        let name = key;\n        if (embeddedFiles.has(name)) {\n          const displayName = stringToPDFString(\n            key,\n            /* keepEscapeSequence = */ true\n          );\n          for (let i = 1; ; i++) {\n            const deduped = `${displayName}_${i}`;\n            if (!embeddedFiles.has(deduped)) {\n              name = deduped;\n              break;\n            }\n          }\n        }\n        embeddedFiles.set(\n          name,\n          await this.#collectDependencies(valueRef, true, xref)\n        );\n      }\n      this.currentDocument = null;\n    }\n  }\n\n  #makeEmbeddedFilesTree() {\n    const { embeddedFiles } = this;\n    if (embeddedFiles.size === 0) {\n      return;\n    }\n    if (!this.namesDict) {\n      [this.namesRef, this.namesDict] = this.newDict;\n      this.rootDict.set(\"Names\", this.namesRef);\n    }\n    this.namesDict.set(\n      \"EmbeddedFiles\",\n      this.#makeNameNumTree(\n        Array.from(embeddedFiles.entries()),\n        /* areNames = */ true\n      )\n    );\n  }\n\n  #makeDestinationsTree() {\n    const { namedDestinations } = this;\n    if (namedDestinations.size === 0) {\n      return;\n    }\n    if (!this.namesDict) {\n      [this.namesRef, this.namesDict] = this.newDict;\n      this.rootDict.set(\"Names\", this.namesRef);\n    }\n    this.namesDict.set(\n      \"Dests\",\n      this.#makeNameNumTree(\n        Array.from(namedDestinations.entries()),\n        /* areNames = */ true\n      )\n    );\n  }\n\n  #makeStructTree() {\n    const { structTreeKids } = this;\n    if (!structTreeKids?.length) {\n      return;\n    }\n    const { rootDict } = this;\n    const structTreeRef = this.newRef;\n    const structTree = (this.xref[structTreeRef.num] = new Dict());\n    structTree.setIfName(\"Type\", \"StructTreeRoot\");\n    structTree.setIfArray(\"K\", structTreeKids);\n    for (const kidRef of structTreeKids) {\n      const kid = this.xref[kidRef.num];\n      const type = kid.get(\"Type\");\n      if (!type || isName(type, \"StructElem\")) {\n        kid.set(\"P\", structTreeRef);\n      }\n    }\n    if (this.parentTree.size > 0) {\n      const parentTreeRef = this.#makeNameNumTree(\n        Array.from(this.parentTree.entries()),\n        /* areNames = */ false\n      );\n      const parentTree = this.xref[parentTreeRef.num];\n      parentTree.setIfName(\"Type\", \"ParentTree\");\n      structTree.set(\"ParentTree\", parentTreeRef);\n      structTree.set(\"ParentTreeNextKey\", this.parentTree.size);\n    }\n    if (this.idTree.size > 0) {\n      const idTreeRef = this.#makeNameNumTree(\n        Array.from(this.idTree.entries()),\n        /* areNames = */ true\n      );\n      const idTree = this.xref[idTreeRef.num];\n      idTree.setIfName(\"Type\", \"IDTree\");\n      structTree.set(\"IDTree\", idTreeRef);\n    }\n    if (this.classMap.size > 0) {\n      const classMapRef = this.newRef;\n      this.xref[classMapRef.num] = this.classMap;\n      structTree.set(\"ClassMap\", classMapRef);\n    }\n    if (this.roleMap.size > 0) {\n      const roleMapRef = this.newRef;\n      this.xref[roleMapRef.num] = this.roleMap;\n      structTree.set(\"RoleMap\", roleMapRef);\n    }\n    if (this.namespaces.size > 0) {\n      const namespacesRef = this.newRef;\n      this.xref[namespacesRef.num] = Array.from(this.namespaces.values());\n      structTree.set(\"Namespaces\", namespacesRef);\n    }\n    if (this.structTreeAF.length > 0) {\n      const structTreeAFRef = this.newRef;\n      this.xref[structTreeAFRef.num] = this.structTreeAF;\n      structTree.set(\"AF\", structTreeAFRef);\n    }\n    if (this.structTreePronunciationLexicon.length > 0) {\n      const structTreePronunciationLexiconRef = this.newRef;\n      this.xref[structTreePronunciationLexiconRef.num] =\n        this.structTreePronunciationLexicon;\n      structTree.set(\"PronunciationLexicon\", structTreePronunciationLexiconRef);\n    }\n    rootDict.set(\"StructTreeRoot\", structTreeRef);\n  }\n\n  #makeAcroForm() {\n    if (this.fields.length === 0) {\n      return;\n    }\n    const { rootDict } = this;\n    const acroFormRef = this.newRef;\n    const acroForm = (this.xref[acroFormRef.num] = new Dict());\n    rootDict.set(\"AcroForm\", acroFormRef);\n    acroForm.set(\"Fields\", this.fields);\n    if (this.acroFormNeedAppearances) {\n      acroForm.set(\"NeedAppearances\", true);\n    }\n    if (this.acroFormSigFlags > 0) {\n      acroForm.set(\"SigFlags\", this.acroFormSigFlags);\n    }\n    acroForm.setIfArray(\"CO\", this.acroFormCalculationOrder);\n    acroForm.setIfDict(\"DR\", this.acroFormDefaultResources);\n    if (this.acroFormDefaultAppearance) {\n      acroForm.set(\"DA\", this.acroFormDefaultAppearance);\n    }\n    if (this.acroFormQ > 0) {\n      acroForm.set(\"Q\", this.acroFormQ);\n    }\n    // We don't merge XFA stuff because it'd require to parse, extract and merge\n    // all the data, which is a lot of work for a deprecated feature (i.e. XFA).\n  }\n\n  /**\n   * Create the root dictionary.\n   * @returns {Promise<void>}\n   */\n  async #makeRoot() {\n    const { rootDict } = this;\n    rootDict.setIfName(\"Type\", \"Catalog\");\n    rootDict.setIfName(\"Version\", this.version);\n    this.#makeAcroForm();\n    this.#makePageTree();\n    this.#makePageLabelsTree();\n    this.#makeEmbeddedFilesTree();\n    this.#makeDestinationsTree();\n    this.#makeStructTree();\n    await this.#makeOutline();\n  }\n\n  /**\n   * Create the info dictionary.\n   * @returns {Map} infoMap\n   */\n  #makeInfo() {\n    const infoMap = new Map();\n    if (this.isSingleFile) {\n      const firstRealPage = this.oldPages.find(p => !!p);\n      const {\n        xref: { trailer },\n      } = firstRealPage.documentData.document;\n      const oldInfoDict = trailer.get(\"Info\");\n      for (const [key, value] of oldInfoDict || []) {\n        if (typeof value === \"string\") {\n          infoMap.set(key, stringToPDFString(value));\n        }\n      }\n    }\n    infoMap.delete(\"ModDate\");\n    infoMap.set(\"CreationDate\", getModificationDate());\n    infoMap.set(\"Creator\", \"PDF.js\");\n    infoMap.set(\"Producer\", \"Firefox\");\n\n    if (this.author) {\n      infoMap.set(\"Author\", this.author);\n    }\n    if (this.title) {\n      infoMap.set(\"Title\", this.title);\n    }\n    for (const [key, value] of infoMap) {\n      this.infoDict.set(key, stringToAsciiOrUTF16BE(value));\n    }\n    return infoMap;\n  }\n\n  /**\n   * Create the encryption dictionary if required.\n   * @returns {Promise<[Dict|null, CipherTransformFactory|null, Array|null]>}\n   */\n  async #makeEncrypt() {\n    if (!this.isSingleFile) {\n      return [null, null, null];\n    }\n    const firstRealPage = this.oldPages.find(p => !!p);\n    const { documentData } = firstRealPage;\n    const {\n      document: {\n        xref: { trailer, encrypt },\n      },\n    } = documentData;\n    if (!trailer.has(\"Encrypt\")) {\n      return [null, null, null];\n    }\n    const encryptDict = trailer.get(\"Encrypt\");\n    if (!(encryptDict instanceof Dict)) {\n      return [null, null, null];\n    }\n    this.currentDocument = documentData;\n    const result = [\n      await this.#cloneObject(encryptDict, trailer.xref),\n      encrypt,\n      trailer.get(\"ID\"),\n    ];\n    this.currentDocument = null;\n    return result;\n  }\n\n  /**\n   * Create the changes required to write the new PDF document.\n   * @returns {Promise<[RefSetCache, Ref]>}\n   */\n  async #createChanges() {\n    const changes = new RefSetCache();\n    changes.put(Ref.get(0, 0xffff), { data: null });\n    for (let i = 1, ii = this.xref.length; i < ii; i++) {\n      if (this.objStreamRefs?.has(i)) {\n        await this.#createObjectStream(Ref.get(i, 0), this.xref[i], changes);\n      } else {\n        changes.put(Ref.get(i, 0), { data: this.xref[i] });\n      }\n    }\n\n    return [changes, this.newRef];\n  }\n\n  /**\n   * Create an object stream containing the given objects.\n   * @param {Ref} objStreamRef\n   * @param {Array<Ref>} objRefs\n   * @param {RefSetCache} changes\n   */\n  async #createObjectStream(objStreamRef, objRefs, changes) {\n    const streamBuffer = [\"\"];\n    const objOffsets = [];\n    let offset = 0;\n    const buffer = [];\n    for (let i = 0, ii = objRefs.length; i < ii; i++) {\n      const objRef = objRefs[i];\n      changes.put(objRef, { data: null, objStreamRef, index: i });\n      objOffsets.push(`${objRef.num} ${offset}`);\n      const data = this.xref[objRef.num];\n      await writeValue(data, buffer, /* transform = */ null);\n      const obj = buffer.join(\"\");\n      buffer.length = 0;\n      streamBuffer.push(obj);\n      offset += obj.length + 1;\n    }\n    streamBuffer[0] = objOffsets.join(\"\\n\");\n    const dict = new Dict();\n    dict.setIfName(\"Type\", \"ObjStm\");\n    dict.set(\"N\", objRefs.length);\n    dict.set(\"First\", streamBuffer[0].length + 1);\n    const objStream = new StringStream(streamBuffer.join(\"\\n\"), dict);\n\n    changes.put(objStreamRef, { data: objStream });\n  }\n\n  /**\n   * Write the new PDF document to a Uint8Array.\n   * @returns {Promise<Uint8Array>}\n   */\n  async writePDF() {\n    await this.#makeRoot();\n    const infoMap = this.#makeInfo();\n    const [encryptRef, encrypt, fileIds] = await this.#makeEncrypt();\n    const [changes, xrefTableRef] = await this.#createChanges();\n\n    // Create the PDF header in order to help sniffers.\n    // PDF version must be in the range 1.0 to 1.7 inclusive.\n    // We add a binary comment line to ensure that the file is treated\n    // as a binary file by applications that open it.\n    const header = stringToBytes(`%PDF-${this.version}\\n%\\xfa\\xde\\xfa\\xce`);\n\n    return incrementalUpdate({\n      originalData: header,\n      changes,\n      xrefInfo: {\n        startXRef: null,\n        rootRef: this.rootRef,\n        infoRef: this.infoRef,\n        encryptRef,\n        newRef: xrefTableRef,\n        fileIds: fileIds || [null, null],\n        infoMap,\n      },\n      useXrefStream: this.useObjectStreams,\n      xref: {\n        encrypt,\n        encryptRef,\n      },\n    });\n  }\n}\n\nexport { PDFEditor };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, unreachable } from \"./util.js\";\n\n/**\n * Interface that represents PDF data transport. If possible, it allows\n * progressively load entire or fragment of the PDF binary data.\n */\nclass BasePDFStream {\n  #PDFStreamReader = null;\n\n  #PDFStreamRangeReader = null;\n\n  _fullReader = null;\n\n  _rangeReaders = new Set();\n\n  _source = null;\n\n  constructor(source, PDFStreamReader, PDFStreamRangeReader) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BasePDFStream\n    ) {\n      unreachable(\"Cannot initialize BasePDFStream.\");\n    }\n    this._source = source;\n\n    this.#PDFStreamReader = PDFStreamReader;\n    this.#PDFStreamRangeReader = PDFStreamRangeReader;\n  }\n\n  get _progressiveDataLength() {\n    return this._fullReader?._loaded ?? 0;\n  }\n\n  /**\n   * Gets a reader for the entire PDF data.\n   * @returns {BasePDFStreamReader}\n   */\n  getFullReader() {\n    assert(\n      !this._fullReader,\n      \"BasePDFStream.getFullReader can only be called once.\"\n    );\n    return (this._fullReader = new this.#PDFStreamReader(this));\n  }\n\n  /**\n   * Gets a reader for the range of the PDF data.\n   *\n   * NOTE: Currently this method is only expected to be invoked *after*\n   * the `BasePDFStreamReader.prototype.headersReady` promise has resolved.\n   *\n   * @param {number} begin - the start offset of the data.\n   * @param {number} end - the end offset of the data.\n   * @returns {BasePDFStreamRangeReader}\n   */\n  getRangeReader(begin, end) {\n    if (end <= this._progressiveDataLength) {\n      return null;\n    }\n    const reader = new this.#PDFStreamRangeReader(this, begin, end);\n    this._rangeReaders.add(reader);\n    return reader;\n  }\n\n  /**\n   * Cancels all opened reader and closes all their opened requests.\n   * @param {Object} reason - the reason for cancelling\n   */\n  cancelAllRequests(reason) {\n    this._fullReader?.cancel(reason);\n\n    // Always create a copy of the rangeReaders.\n    for (const reader of new Set(this._rangeReaders)) {\n      reader.cancel(reason);\n    }\n  }\n}\n\n/**\n * Interface for a PDF binary data reader.\n */\nclass BasePDFStreamReader {\n  /**\n   * Sets or gets the progress callback. The callback can be useful when the\n   * isStreamingSupported property of the object is defined as false.\n   * The callback is called with one parameter: an object with the loaded and\n   * total properties.\n   */\n  onProgress = null;\n\n  _contentLength = 0;\n\n  _filename = null;\n\n  _headersCapability = Promise.withResolvers();\n\n  _isRangeSupported = false;\n\n  _isStreamingSupported = false;\n\n  _loaded = 0;\n\n  _stream = null;\n\n  constructor(stream) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BasePDFStreamReader\n    ) {\n      unreachable(\"Cannot initialize BasePDFStreamReader.\");\n    }\n    this._stream = stream;\n  }\n\n  _callOnProgress() {\n    this.onProgress?.({ loaded: this._loaded, total: this._contentLength });\n  }\n\n  /**\n   * Gets a promise that is resolved when the headers and other metadata of\n   * the PDF data stream are available.\n   * @type {Promise}\n   */\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  /**\n   * Gets the Content-Disposition filename. It is defined after the headersReady\n   * promise is resolved.\n   * @type {string|null} The filename, or `null` if the Content-Disposition\n   *                     header is missing/invalid.\n   */\n  get filename() {\n    return this._filename;\n  }\n\n  /**\n   * Gets PDF binary data length. It is defined after the headersReady promise\n   * is resolved.\n   * @type {number} The data length (or 0 if unknown).\n   */\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  /**\n   * Gets ability of the stream to handle range requests. It is defined after\n   * the headersReady promise is resolved. Rejected when the reader is cancelled\n   * or an error occurs.\n   * @type {boolean}\n   */\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  /**\n   * Gets ability of the stream to progressively load binary data. It is defined\n   * after the headersReady promise is resolved.\n   * @type {boolean}\n   */\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  /**\n   * Requests a chunk of the binary data. The method returns the promise, which\n   * is resolved into object with properties \"value\" and \"done\". If the done\n   * is set to true, then the stream has reached its end, otherwise the value\n   * contains binary data. Cancelled requests will be resolved with the done is\n   * set to true.\n   * @returns {Promise}\n   */\n  async read() {\n    unreachable(\"Abstract method `read` called\");\n  }\n\n  /**\n   * Cancels all pending read requests and closes the stream.\n   * @param {Object} reason\n   */\n  cancel(reason) {\n    unreachable(\"Abstract method `cancel` called\");\n  }\n}\n\n/**\n * Interface for a PDF binary data fragment reader.\n */\nclass BasePDFStreamRangeReader {\n  _stream = null;\n\n  constructor(stream, begin, end) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BasePDFStreamRangeReader\n    ) {\n      unreachable(\"Cannot initialize BasePDFStreamRangeReader.\");\n    }\n    this._stream = stream;\n  }\n\n  /**\n   * Requests a chunk of the binary data. The method returns the promise, which\n   * is resolved into object with properties \"value\" and \"done\". If the done\n   * is set to true, then the stream has reached its end, otherwise the value\n   * contains binary data. Cancelled requests will be resolved with the done is\n   * set to true.\n   * @returns {Promise}\n   */\n  async read() {\n    unreachable(\"Abstract method `read` called\");\n  }\n\n  /**\n   * Cancels all pending read requests and closes the stream.\n   * @param {Object} reason\n   */\n  cancel(reason) {\n    unreachable(\"Abstract method `cancel` called\");\n  }\n}\n\nexport { BasePDFStream, BasePDFStreamRangeReader, BasePDFStreamReader };\n","/* Copyright 2019 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  BasePDFStream,\n  BasePDFStreamRangeReader,\n  BasePDFStreamReader,\n} from \"../shared/base_pdf_stream.js\";\n\nclass PDFWorkerStream extends BasePDFStream {\n  constructor(source) {\n    super(source, PDFWorkerStreamReader, PDFWorkerStreamRangeReader);\n  }\n}\n\nclass PDFWorkerStreamReader extends BasePDFStreamReader {\n  _reader = null;\n\n  constructor(stream) {\n    super(stream);\n    const { msgHandler } = stream._source;\n\n    const readableStream = msgHandler.sendWithStream(\"GetReader\");\n    this._reader = readableStream.getReader();\n\n    msgHandler.sendWithPromise(\"ReaderHeadersReady\").then(data => {\n      this._contentLength = data.contentLength;\n      this._isStreamingSupported = data.isStreamingSupported;\n      this._isRangeSupported = data.isRangeSupported;\n\n      this._headersCapability.resolve();\n    }, this._headersCapability.reject);\n  }\n\n  async read() {\n    const { value, done } = await this._reader.read();\n    if (done) {\n      return { value: undefined, done: true };\n    }\n    // `value` is wrapped into Uint8Array, we need to\n    // unwrap it to ArrayBuffer for further processing.\n    return { value: value.buffer, done: false };\n  }\n\n  cancel(reason) {\n    this._reader.cancel(reason);\n  }\n}\n\nclass PDFWorkerStreamRangeReader extends BasePDFStreamRangeReader {\n  _reader = null;\n\n  constructor(stream, begin, end) {\n    super(stream, begin, end);\n    const { msgHandler } = stream._source;\n\n    const readableStream = msgHandler.sendWithStream(\"GetRangeReader\", {\n      begin,\n      end,\n    });\n    this._reader = readableStream.getReader();\n  }\n\n  async read() {\n    const { value, done } = await this._reader.read();\n    if (done) {\n      return { value: undefined, done: true };\n    }\n    return { value: value.buffer, done: false };\n  }\n\n  cancel(reason) {\n    this._reader.cancel(reason);\n  }\n}\n\nexport { PDFWorkerStream };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException,\n  assert,\n  getVerbosityLevel,\n  info,\n  isNodeJS,\n  PasswordException,\n  setVerbosityLevel,\n  VerbosityLevel,\n  warn,\n} from \"../shared/util.js\";\nimport {\n  arrayBuffersToBytes,\n  getNewAnnotationsMap,\n  XRefParseException,\n} from \"./core_utils.js\";\nimport { Dict, isDict, Ref, RefSetCache } from \"./primitives.js\";\nimport { LocalPdfManager, NetworkPdfManager } from \"./pdf_manager.js\";\nimport { MessageHandler, wrapReason } from \"../shared/message_handler.js\";\nimport { AnnotationFactory } from \"./annotation.js\";\nimport { clearGlobalCaches } from \"./cleanup_helper.js\";\nimport { incrementalUpdate } from \"./writer.js\";\nimport { PDFEditor } from \"./editor/pdf_editor.js\";\nimport { PDFWorkerStream } from \"./worker_stream.js\";\nimport { stringToPDFString } from \"./string_utils.js\";\nimport { StructTreeRoot } from \"./struct_tree.js\";\n\nclass WorkerTask {\n  constructor(name) {\n    this.name = name;\n    this.terminated = false;\n    this._capability = Promise.withResolvers();\n  }\n\n  get finished() {\n    return this._capability.promise;\n  }\n\n  finish() {\n    this._capability.resolve();\n  }\n\n  terminate() {\n    this.terminated = true;\n  }\n\n  ensureNotTerminated() {\n    if (this.terminated) {\n      throw new Error(\"Worker task was terminated\");\n    }\n  }\n}\n\nclass WorkerMessageHandler {\n  static {\n    // Worker thread (and not Node.js)?\n    if (\n      typeof window === \"undefined\" &&\n      !isNodeJS &&\n      typeof self !== \"undefined\" &&\n      /* isMessagePort = */\n      typeof self.postMessage === \"function\" &&\n      \"onmessage\" in self\n    ) {\n      this.initializeFromPort(self);\n    }\n  }\n\n  static setup(handler, port) {\n    let testMessageProcessed = false;\n    handler.on(\"test\", data => {\n      if (testMessageProcessed) {\n        return; // we already processed 'test' message once\n      }\n      testMessageProcessed = true;\n\n      // Ensure that `TypedArray`s can be sent to the worker.\n      handler.send(\"test\", data instanceof Uint8Array);\n    });\n\n    handler.on(\"configure\", data => {\n      setVerbosityLevel(data.verbosity);\n    });\n\n    handler.on(\"GetDocRequest\", data => this.createDocumentHandler(data, port));\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      handler.on(\"GetWorkerCoverage\", function () {\n        return globalThis.__coverage__ ?? {};\n      });\n    }\n  }\n\n  static createDocumentHandler(docParams, port) {\n    // This context is actually holds references on pdfManager and handler,\n    // until the latter is destroyed.\n    let pdfManager;\n    let terminated = false;\n    let cancelXHRs = null;\n    const WorkerTasks = new Set();\n    const verbosity = getVerbosityLevel();\n\n    const { docId, apiVersion } = docParams;\n    const workerVersion =\n      typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n        ? PDFJSDev.eval(\"BUNDLE_VERSION\")\n        : null;\n    if (apiVersion !== workerVersion) {\n      throw new Error(\n        `The API version \"${apiVersion}\" does not match ` +\n          `the Worker version \"${workerVersion}\".`\n      );\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      // Fail early, and predictably, rather than having (some) fonts fail to\n      // load/render with slightly cryptic error messages in environments where\n      // the `{Object, Array}.prototype` has been *incorrectly* extended.\n      //\n      // PLEASE NOTE: We do *not* want to slow down font parsing by adding\n      //              `Object.hasOwn` checks all over the code-base.\n      const buildMsg = (type, prop) =>\n        `The \\`${type}.prototype\\` contains unexpected enumerable property ` +\n        `\"${prop}\", thus breaking e.g. \\`for...in\\` iteration of ${type}s.`;\n\n      for (const prop in {}) {\n        throw new Error(buildMsg(\"Object\", prop));\n      }\n      for (const prop in []) {\n        throw new Error(buildMsg(\"Array\", prop));\n      }\n    }\n    const workerHandlerName = docId + \"_worker\";\n    let handler = new MessageHandler(workerHandlerName, docId, port);\n\n    function ensureNotTerminated() {\n      if (terminated) {\n        throw new Error(\"Worker was terminated\");\n      }\n    }\n\n    function startWorkerTask(task) {\n      WorkerTasks.add(task);\n    }\n\n    function finishWorkerTask(task) {\n      task.finish();\n      WorkerTasks.delete(task);\n    }\n\n    async function loadDocument(recoveryMode) {\n      await pdfManager.initDocument(recoveryMode);\n\n      const isPureXfa = await pdfManager.ensureDoc(\"isPureXfa\");\n      if (isPureXfa) {\n        const task = new WorkerTask(\"loadXfaResources\");\n        startWorkerTask(task);\n\n        await pdfManager.ensureDoc(\"loadXfaResources\", [handler, task]);\n        finishWorkerTask(task);\n      }\n\n      const [numPages, fingerprints] = await Promise.all([\n        pdfManager.ensureDoc(\"numPages\"),\n        pdfManager.ensureDoc(\"fingerprints\"),\n      ]);\n\n      // Get htmlForXfa after numPages to avoid to create HTML twice.\n      const htmlForXfa = isPureXfa\n        ? await pdfManager.ensureDoc(\"htmlForXfa\")\n        : null;\n\n      return { numPages, fingerprints, htmlForXfa };\n    }\n\n    async function getPdfManager({\n      data,\n      password,\n      disableAutoFetch,\n      rangeChunkSize,\n      docBaseUrl,\n      enableXfa,\n      evaluatorOptions,\n    }) {\n      const pdfManagerArgs = {\n        source: null,\n        disableAutoFetch,\n        docBaseUrl,\n        docId,\n        enableXfa,\n        evaluatorOptions,\n        handler,\n        length: 0,\n        password,\n        rangeChunkSize,\n      };\n\n      if (data) {\n        pdfManagerArgs.source = data;\n\n        return new LocalPdfManager(pdfManagerArgs);\n      }\n      const pdfStream = new PDFWorkerStream({ msgHandler: handler }),\n        fullReader = pdfStream.getFullReader();\n\n      const { promise, resolve, reject } = Promise.withResolvers();\n      let newPdfManager,\n        cachedChunks = [];\n      cancelXHRs = reason => pdfStream.cancelAllRequests(reason);\n\n      fullReader.headersReady\n        .then(() => {\n          if (!fullReader.isRangeSupported) {\n            return;\n          }\n          pdfManagerArgs.source = pdfStream;\n          pdfManagerArgs.length = fullReader.contentLength;\n          // We don't need auto-fetch when streaming is enabled.\n          pdfManagerArgs.disableAutoFetch ||= fullReader.isStreamingSupported;\n\n          newPdfManager = new NetworkPdfManager(pdfManagerArgs);\n          // There may be a chance that `newPdfManager` is not initialized for\n          // the first few iterations of the `readData` code. Be sure to send\n          // all cached chunks, if any, to chunked_stream via pdf_manager.\n          for (const chunk of cachedChunks) {\n            newPdfManager.sendProgressiveData(chunk);\n          }\n          cachedChunks = null;\n\n          resolve(newPdfManager);\n          cancelXHRs = null;\n        })\n        .catch(reason => {\n          reject(reason);\n          cancelXHRs = null;\n        });\n\n      async function readData() {\n        let loaded = 0;\n\n        while (true) {\n          const { value, done } = await fullReader.read();\n          ensureNotTerminated();\n\n          if (done) {\n            break;\n          }\n          if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n            assert(\n              value instanceof ArrayBuffer,\n              \"readData (getPdfManager) - expected an ArrayBuffer.\"\n            );\n          }\n          loaded += value.byteLength;\n\n          if (!fullReader.isStreamingSupported) {\n            handler.send(\"DocProgress\", {\n              loaded,\n              total: fullReader.contentLength,\n            });\n          }\n\n          if (newPdfManager) {\n            newPdfManager.sendProgressiveData(value);\n          } else {\n            cachedChunks.push(value);\n          }\n        }\n\n        if (!newPdfManager) {\n          pdfManagerArgs.source = arrayBuffersToBytes(cachedChunks);\n          cachedChunks = null;\n\n          newPdfManager = new LocalPdfManager(pdfManagerArgs);\n          resolve(newPdfManager);\n        }\n        cancelXHRs = null;\n      }\n      readData().catch(reason => {\n        reject(reason);\n        cancelXHRs = null;\n      });\n\n      return promise;\n    }\n\n    async function getPassword(ex) {\n      if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n        assert(\n          ex instanceof PasswordException,\n          \"getPassword - must be a `PasswordException`.\"\n        );\n      }\n      const task = new WorkerTask(`PasswordException: response ${ex.code}`);\n      startWorkerTask(task);\n\n      try {\n        const res = await handler.sendWithPromise(\"PasswordRequest\", ex);\n        return res.password;\n      } finally {\n        // Ensure that any `catch` handler runs *before* removing the task.\n        Promise.resolve().then(() => {\n          finishWorkerTask(task);\n        });\n      }\n    }\n\n    function setupDoc(data) {\n      function onSuccess(doc) {\n        ensureNotTerminated();\n        handler.send(\"GetDoc\", { pdfInfo: doc });\n      }\n\n      function onFailure(ex) {\n        if (terminated) {\n          return;\n        }\n\n        if (ex instanceof PasswordException) {\n          getPassword(ex)\n            .then(password => {\n              pdfManager.updatePassword(password);\n              pdfManagerReady();\n            })\n            .catch(() => {\n              handler.send(\"DocException\", ex);\n            });\n        } else {\n          // Ensure that we always fallback to `UnknownErrorException`.\n          handler.send(\"DocException\", wrapReason(ex));\n        }\n      }\n\n      function pdfManagerReady() {\n        ensureNotTerminated();\n\n        loadDocument(false).then(onSuccess, function (reason) {\n          ensureNotTerminated();\n\n          // Try again with recoveryMode == true\n          if (!(reason instanceof XRefParseException)) {\n            onFailure(reason);\n            return;\n          }\n          pdfManager.requestLoadedStream().then(function () {\n            ensureNotTerminated();\n\n            loadDocument(true).then(onSuccess, onFailure);\n          }, onFailure);\n        });\n      }\n\n      ensureNotTerminated();\n\n      getPdfManager(data)\n        .then(function (newPdfManager) {\n          if (terminated) {\n            // We were in a process of setting up the manager, but it got\n            // terminated in the middle.\n            newPdfManager.terminate(\n              new AbortException(\"Worker was terminated.\")\n            );\n            throw new Error(\"Worker was terminated\");\n          }\n          pdfManager = newPdfManager;\n\n          pdfManager.requestLoadedStream(/* noFetch = */ true).then(\n            stream => {\n              handler.send(\"DataLoaded\", { length: stream.bytes.byteLength });\n            },\n            () => {\n              // Avoid errors if document loading was terminated.\n            }\n          );\n        })\n        .then(pdfManagerReady, onFailure);\n    }\n\n    handler.on(\"GetPage\", function (data) {\n      return pdfManager.getPage(data.pageIndex).then(function (page) {\n        return Promise.all([\n          pdfManager.ensure(page, \"rotate\"),\n          pdfManager.ensure(page, \"ref\"),\n          pdfManager.ensure(page, \"userUnit\"),\n          pdfManager.ensure(page, \"view\"),\n        ]).then(function ([rotate, ref, userUnit, view]) {\n          return {\n            rotate,\n            ref,\n            refStr: ref?.toString() ?? null,\n            userUnit,\n            view,\n          };\n        });\n      });\n    });\n\n    handler.on(\"GetPageIndex\", function (data) {\n      const pageRef = Ref.get(data.num, data.gen);\n      return pdfManager.ensureCatalog(\"getPageIndex\", [pageRef]);\n    });\n\n    handler.on(\"GetDestinations\", function (data) {\n      return pdfManager.ensureCatalog(\"destinations\");\n    });\n\n    handler.on(\"GetDestination\", function (data) {\n      return pdfManager.ensureCatalog(\"getDestination\", [data.id]);\n    });\n\n    handler.on(\"GetPageLabels\", function (data) {\n      return pdfManager.ensureCatalog(\"pageLabels\");\n    });\n\n    handler.on(\"GetPageLayout\", function (data) {\n      return pdfManager.ensureCatalog(\"pageLayout\");\n    });\n\n    handler.on(\"GetPageMode\", function (data) {\n      return pdfManager.ensureCatalog(\"pageMode\");\n    });\n\n    handler.on(\"GetViewerPreferences\", function (data) {\n      return pdfManager.ensureCatalog(\"viewerPreferences\");\n    });\n\n    handler.on(\"GetOpenAction\", function (data) {\n      return pdfManager.ensureCatalog(\"openAction\");\n    });\n\n    handler.on(\"GetAttachments\", function (data) {\n      return pdfManager.ensureCatalog(\"attachments\");\n    });\n\n    handler.on(\n      \"GetAttachmentContent\",\n      /**\n       * @param {string} id\n       *   Unique attachment identifier (required).\n       */\n      async function (id) {\n        let passwordEx;\n\n        // Loop to prompt again after an incorrect password.\n        while (true) {\n          const password = passwordEx ? await getPassword(passwordEx) : null;\n\n          try {\n            if (password) {\n              pdfManager.updatePassword(password);\n            }\n            return await pdfManager.ensureCatalog(\"attachmentContent\", [id]);\n          } catch (ex) {\n            if (ex instanceof PasswordException) {\n              passwordEx = ex;\n              continue;\n            }\n            throw ex;\n          }\n        }\n      }\n    );\n\n    handler.on(\"GetDocJSActions\", function (data) {\n      return pdfManager.ensureCatalog(\"jsActions\");\n    });\n\n    handler.on(\"GetPageJSActions\", function ({ pageIndex }) {\n      return pdfManager\n        .getPage(pageIndex)\n        .then(page => pdfManager.ensure(page, \"jsActions\"));\n    });\n\n    handler.on(\n      \"GetAnnotationsByType\",\n      async function ({ types, pageIndexesToSkip }) {\n        const [numPages, annotationGlobals] = await Promise.all([\n          pdfManager.ensureDoc(\"numPages\"),\n          pdfManager.ensureDoc(\"annotationGlobals\"),\n        ]);\n\n        if (!annotationGlobals) {\n          return null;\n        }\n        const pagePromises = [];\n        const annotationPromises = [];\n        let task = null;\n        try {\n          for (let i = 0, ii = numPages; i < ii; i++) {\n            if (pageIndexesToSkip?.has(i)) {\n              continue;\n            }\n            if (!task) {\n              task = new WorkerTask(\"GetAnnotationsByType\");\n              startWorkerTask(task);\n            }\n            pagePromises.push(\n              pdfManager\n                .getPage(i)\n                .then(page =>\n                  page.collectAnnotationsByType(\n                    handler,\n                    task,\n                    types,\n                    annotationPromises,\n                    annotationGlobals\n                  )\n                )\n            );\n          }\n          await Promise.all(pagePromises);\n          const annotations = await Promise.all(annotationPromises);\n          return annotations.filter(a => !!a);\n        } finally {\n          if (task) {\n            finishWorkerTask(task);\n          }\n        }\n      }\n    );\n\n    handler.on(\"GetOutline\", function (data) {\n      return pdfManager.ensureCatalog(\"documentOutline\");\n    });\n\n    handler.on(\"GetOptionalContentConfig\", function (data) {\n      return pdfManager.ensureCatalog(\"optionalContentConfig\");\n    });\n\n    handler.on(\"GetPermissions\", function (data) {\n      return pdfManager.ensureCatalog(\"permissions\");\n    });\n\n    handler.on(\"GetMetadata\", function (data) {\n      return Promise.all([\n        pdfManager.ensureDoc(\"documentInfo\"),\n        pdfManager.ensureCatalog(\"metadata\"),\n        pdfManager.ensureCatalog(\"hasStructTree\"),\n      ]);\n    });\n\n    handler.on(\"GetMarkInfo\", function (data) {\n      return pdfManager.ensureCatalog(\"markInfo\");\n    });\n\n    handler.on(\"GetData\", function (data) {\n      return pdfManager.requestLoadedStream().then(stream => stream.bytes);\n    });\n\n    handler.on(\"GetAnnotations\", function ({ pageIndex, intent }) {\n      return pdfManager.getPage(pageIndex).then(function (page) {\n        const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`);\n        startWorkerTask(task);\n\n        return page.getAnnotationsData(handler, task, intent).finally(() => {\n          finishWorkerTask(task);\n        });\n      });\n    });\n\n    handler.on(\"GetFieldObjects\", function (data) {\n      return pdfManager\n        .ensureDoc(\"fieldObjects\")\n        .then(fieldObjects => fieldObjects?.allFields || null);\n    });\n\n    handler.on(\"HasJSActions\", function (data) {\n      return pdfManager.ensureDoc(\"hasJSActions\");\n    });\n\n    handler.on(\"GetCalculationOrderIds\", function (data) {\n      return pdfManager.ensureDoc(\"calculationOrderIds\");\n    });\n\n    handler.on(\n      \"ExtractPages\",\n      async function ({ pageInfos, annotationStorage }) {\n        if (!pageInfos) {\n          warn(\"extractPages: nothing to extract.\");\n          return null;\n        }\n        if (!Array.isArray(pageInfos)) {\n          pageInfos = [pageInfos];\n        }\n        let newDocumentId = 0;\n        for (const pageInfo of pageInfos) {\n          if (pageInfo.image) {\n            continue;\n          }\n          if (pageInfo.document === null) {\n            pageInfo.document = pdfManager.pdfDocument;\n          } else if (ArrayBuffer.isView(pageInfo.document)) {\n            const manager = new LocalPdfManager({\n              source: pageInfo.document,\n              docId: `${docId}_extractPages_${newDocumentId++}`,\n              handler,\n              password: pageInfo.password ?? null,\n              evaluatorOptions: Object.assign({}, pdfManager.evaluatorOptions),\n            });\n            let recoveryMode = false;\n            let isValid = true;\n            while (true) {\n              try {\n                await manager.requestLoadedStream();\n                await manager.initDocument(recoveryMode);\n                break;\n              } catch (e) {\n                if (e instanceof XRefParseException) {\n                  if (recoveryMode === false) {\n                    recoveryMode = true;\n                    continue;\n                  } else {\n                    isValid = false;\n                    warn(\"extractPages: XRefParseException.\");\n                  }\n                } else if (e instanceof PasswordException) {\n                  try {\n                    const password = await getPassword(e);\n                    manager.updatePassword(password);\n                  } catch {\n                    isValid = false;\n                    warn(\"extractPages: invalid password.\");\n                  }\n                } else {\n                  isValid = false;\n                  warn(\"extractPages: invalid document.\");\n                }\n                if (!isValid) {\n                  break;\n                }\n              }\n            }\n            if (!isValid) {\n              pageInfo.document = null;\n            }\n            const isPureXfa = await manager.ensureDoc(\"isPureXfa\");\n            if (isPureXfa) {\n              pageInfo.document = null;\n              warn(\"extractPages does not support pure XFA documents.\");\n            } else {\n              pageInfo.document = manager.pdfDocument;\n            }\n          } else {\n            warn(\"extractPages: invalid document.\");\n          }\n        }\n        let task;\n        try {\n          const pdfEditor = new PDFEditor();\n          task = new WorkerTask(`ExtractPages: ${pageInfos.length} page(s)`);\n          startWorkerTask(task);\n          const buffer = await pdfEditor.extractPages(\n            pageInfos,\n            annotationStorage,\n            pdfManager.pdfDocument,\n            handler,\n            task\n          );\n          return buffer;\n        } catch (reason) {\n          warn(`extractPages: \"${reason}\".`);\n          return null;\n        } finally {\n          if (task) {\n            finishWorkerTask(task);\n          }\n        }\n      }\n    );\n\n    handler.on(\n      \"SaveDocument\",\n      async function ({ isPureXfa, numPages, annotationStorage, filename }) {\n        const globalPromises = [\n          pdfManager.requestLoadedStream(),\n          pdfManager.ensureCatalog(\"acroForm\"),\n          pdfManager.ensureCatalog(\"acroFormRef\"),\n          pdfManager.ensureDoc(\"startXRef\"),\n          pdfManager.ensureDoc(\"xref\"),\n          pdfManager.ensureCatalog(\"structTreeRoot\"),\n        ];\n        const changes = new RefSetCache();\n        const promises = [];\n\n        const newAnnotationsByPage = !isPureXfa\n          ? getNewAnnotationsMap(annotationStorage)\n          : null;\n        const [\n          stream,\n          acroForm,\n          acroFormRef,\n          startXRef,\n          xref,\n          _structTreeRoot,\n        ] = await Promise.all(globalPromises);\n        const catalogRef = xref.trailer.getRaw(\"Root\") || null;\n        let structTreeRoot;\n\n        if (newAnnotationsByPage) {\n          if (!_structTreeRoot) {\n            if (\n              await StructTreeRoot.canCreateStructureTree({\n                catalogRef,\n                pdfManager,\n                newAnnotationsByPage,\n              })\n            ) {\n              structTreeRoot = null;\n            }\n          } else if (\n            await _structTreeRoot.canUpdateStructTree({\n              pdfManager,\n              newAnnotationsByPage,\n            })\n          ) {\n            structTreeRoot = _structTreeRoot;\n          }\n\n          const imagePromises = AnnotationFactory.generateImages(\n            annotationStorage.values(),\n            xref,\n            pdfManager.evaluatorOptions.isOffscreenCanvasSupported\n          );\n          const newAnnotationPromises =\n            structTreeRoot === undefined ? promises : [];\n          for (const [pageIndex, annotations] of newAnnotationsByPage) {\n            newAnnotationPromises.push(\n              pdfManager.getPage(pageIndex).then(page => {\n                const task = new WorkerTask(`Save (editor): page ${pageIndex}`);\n                startWorkerTask(task);\n\n                return page\n                  .saveNewAnnotations(\n                    handler,\n                    task,\n                    annotations,\n                    imagePromises,\n                    changes\n                  )\n                  .finally(() => {\n                    finishWorkerTask(task);\n                  });\n              })\n            );\n          }\n          if (structTreeRoot === null) {\n            // No structTreeRoot exists, so we need to create one.\n            promises.push(\n              Promise.all(newAnnotationPromises).then(async () => {\n                await StructTreeRoot.createStructureTree({\n                  newAnnotationsByPage,\n                  xref,\n                  catalogRef,\n                  pdfManager,\n                  changes,\n                });\n              })\n            );\n          } else if (structTreeRoot) {\n            promises.push(\n              Promise.all(newAnnotationPromises).then(async () => {\n                await structTreeRoot.updateStructureTree({\n                  newAnnotationsByPage,\n                  pdfManager,\n                  changes,\n                });\n              })\n            );\n          }\n        }\n\n        if (isPureXfa) {\n          promises.push(\n            pdfManager.ensureDoc(\"serializeXfaData\", [annotationStorage])\n          );\n        } else {\n          for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {\n            promises.push(\n              pdfManager.getPage(pageIndex).then(function (page) {\n                const task = new WorkerTask(`Save: page ${pageIndex}`);\n                startWorkerTask(task);\n\n                return page\n                  .save(handler, task, annotationStorage, changes)\n                  .finally(() => {\n                    finishWorkerTask(task);\n                  });\n              })\n            );\n          }\n        }\n        const refs = await Promise.all(promises);\n\n        let xfaData = null;\n        if (isPureXfa) {\n          xfaData = refs[0];\n          if (!xfaData) {\n            return stream.bytes;\n          }\n        } else if (changes.size === 0) {\n          // No new refs so just return the initial bytes\n          return stream.bytes;\n        }\n\n        const needAppearances =\n          acroFormRef &&\n          acroForm instanceof Dict &&\n          changes.values().some(ref => ref.needAppearances);\n\n        const xfa = (acroForm instanceof Dict && acroForm.get(\"XFA\")) || null;\n        let xfaDatasetsRef = null;\n        let hasXfaDatasetsEntry = false;\n        if (Array.isArray(xfa)) {\n          for (let i = 0, ii = xfa.length; i < ii; i += 2) {\n            if (xfa[i] === \"datasets\") {\n              xfaDatasetsRef = xfa[i + 1];\n              hasXfaDatasetsEntry = true;\n            }\n          }\n          if (xfaDatasetsRef === null) {\n            xfaDatasetsRef = xref.getNewTemporaryRef();\n          }\n        } else if (xfa) {\n          // TODO: Support XFA streams.\n          warn(\"Unsupported XFA type.\");\n        }\n\n        let newXrefInfo = Object.create(null);\n        if (xref.trailer) {\n          // Get string info from Info in order to compute fileId.\n          const infoMap = new Map();\n          const xrefInfo = xref.trailer.get(\"Info\") || null;\n          if (xrefInfo instanceof Dict) {\n            for (const [key, value] of xrefInfo) {\n              if (typeof value === \"string\") {\n                infoMap.set(key, stringToPDFString(value));\n              }\n            }\n          }\n\n          newXrefInfo = {\n            rootRef: catalogRef,\n            encryptRef: xref.trailer.getRaw(\"Encrypt\") || null,\n            newRef: xref.getNewTemporaryRef(),\n            infoRef: xref.trailer.getRaw(\"Info\") || null,\n            infoMap,\n            fileIds: xref.trailer.get(\"ID\") || null,\n            startXRef,\n            filename,\n          };\n        }\n\n        return incrementalUpdate({\n          originalData: stream.bytes,\n          xrefInfo: newXrefInfo,\n          changes,\n          xref,\n          hasXfa: !!xfa,\n          xfaDatasetsRef,\n          hasXfaDatasetsEntry,\n          needAppearances,\n          acroFormRef,\n          acroForm,\n          xfaData,\n          // Use the same kind of XRef as the previous one.\n          useXrefStream: isDict(xref.topDict, \"XRef\"),\n        }).finally(() => {\n          xref.resetNewTemporaryRef();\n        });\n      }\n    );\n\n    handler.on(\"GetOperatorList\", function (data, sink) {\n      const { pageId, pageIndex } = data;\n      pdfManager.getPage(pageId).then(function (page) {\n        const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`);\n        startWorkerTask(task);\n\n        // NOTE: Keep this condition in sync with the `info` helper function.\n        const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0;\n\n        // Pre compile the pdf page and fetch the fonts/images.\n        page\n          .getOperatorList({\n            handler,\n            sink,\n            task,\n            intent: data.intent,\n            cacheKey: data.cacheKey,\n            annotationStorage: data.annotationStorage,\n            modifiedIds: data.modifiedIds,\n            pageIndex,\n          })\n          .then(\n            operatorListInfo => {\n              if (start) {\n                info(\n                  `page=${pageIndex + 1} - getOperatorList: time=` +\n                    `${Date.now() - start}ms, len=${operatorListInfo.length}`\n                );\n              }\n              sink.close();\n            },\n            reason => {\n              if (task.terminated) {\n                return; // ignoring errors from the terminated thread\n              }\n              sink.error(reason);\n\n              // TODO: Should `reason` be re-thrown here (currently that casues\n              //       \"Uncaught exception: ...\" messages in the console)?\n            }\n          )\n          .finally(() => {\n            finishWorkerTask(task);\n          });\n      });\n    });\n\n    handler.on(\"GetTextContent\", function (data, sink) {\n      const { pageId, pageIndex, includeMarkedContent, disableNormalization } =\n        data;\n\n      pdfManager.getPage(pageId).then(function (page) {\n        const task = new WorkerTask(\"GetTextContent: page \" + pageIndex);\n        startWorkerTask(task);\n\n        // NOTE: Keep this condition in sync with the `info` helper function.\n        const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0;\n\n        page\n          .extractTextContent({\n            handler,\n            task,\n            sink,\n            includeMarkedContent,\n            disableNormalization,\n          })\n          .then(\n            () => {\n              if (start) {\n                info(\n                  `page=${pageIndex + 1} - getTextContent: time=` +\n                    `${Date.now() - start}ms`\n                );\n              }\n              sink.close();\n            },\n            reason => {\n              if (task.terminated) {\n                return; // ignoring errors from the terminated thread\n              }\n              sink.error(reason);\n\n              // TODO: Should `reason` be re-thrown here (currently that casues\n              //       \"Uncaught exception: ...\" messages in the console)?\n            }\n          )\n          .finally(() => {\n            finishWorkerTask(task);\n          });\n      });\n    });\n\n    handler.on(\"GetStructTree\", function (data) {\n      return pdfManager\n        .getPage(data.pageIndex)\n        .then(page => pdfManager.ensure(page, \"getStructTree\"));\n    });\n\n    handler.on(\"FontFallback\", function (data) {\n      return pdfManager.fontFallback(data.id, handler);\n    });\n\n    if (\n      typeof PDFJSDev === \"undefined\" ||\n      PDFJSDev.test(\"TESTING || INTERNAL_VIEWER\")\n    ) {\n      handler.on(\"GetRawData\", async function ({ ref, page }) {\n        let value = null;\n        if (page >= 1) {\n          value = (\n            await pdfManager.ensureCatalog(\"getPageDict\", [page - 1])\n          )[1];\n        } else if (ref) {\n          value =\n            typeof ref === \"string\"\n              ? Ref.fromString(ref)\n              : Ref.get(ref.num, ref.gen);\n        }\n        return pdfManager.ensureDoc(\"toJSObject\", [value]);\n      });\n    }\n\n    handler.on(\"Cleanup\", function (data) {\n      return pdfManager.cleanup(/* manuallyTriggered = */ true);\n    });\n\n    handler.on(\"Terminate\", async function (data) {\n      terminated = true;\n\n      const waitOn = [];\n      if (pdfManager) {\n        pdfManager.terminate(new AbortException(\"Worker was terminated.\"));\n\n        const cleanupPromise = pdfManager.cleanup();\n        waitOn.push(cleanupPromise);\n\n        pdfManager = null;\n      } else {\n        clearGlobalCaches();\n      }\n      cancelXHRs?.(new AbortException(\"Worker was terminated.\"));\n\n      for (const task of WorkerTasks) {\n        waitOn.push(task.finished);\n        task.terminate();\n      }\n\n      await Promise.all(waitOn);\n      // Notice that even if we destroying handler, resolved response promise\n      // must be sent back.\n      handler.destroy();\n      handler = null;\n    });\n\n    handler.on(\"Ready\", function (data) {\n      setupDoc(docParams);\n      docParams = null; // we don't need docParams anymore -- saving memory.\n    });\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      handler.on(\"GetXFADatasets\", function (data) {\n        return pdfManager.ensureDoc(\"xfaDatasets\");\n      });\n      handler.on(\"GetStartXRefPos\", function (data) {\n        return pdfManager.ensureDoc(\"startXRef\");\n      });\n      handler.on(\"GetAnnotArray\", function (data) {\n        return pdfManager\n          .getPage(data.pageIndex)\n          .then(page => page.annotations.map(a => a.toString()));\n      });\n      handler.on(\"GetWorkerCoverage\", function () {\n        return globalThis.__coverage__ ?? {};\n      });\n    }\n\n    return workerHandlerName;\n  }\n\n  static initializeFromPort(port) {\n    const handler = new MessageHandler(\"worker\", \"main\", port);\n    this.setup(handler, port);\n    handler.send(\"ready\", null);\n  }\n}\n\nexport { WorkerMessageHandler, WorkerTask };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WorkerMessageHandler } from \"./core/worker.js\";\n\nglobalThis.pdfjsWorker = {\n  WorkerMessageHandler,\n};\n\nexport { WorkerMessageHandler };\n"],"names":["isNodeJS","process","versions","nw","electron","type","BBOX_INIT","Infinity","F32_BBOX_INIT","Float32Array","FONT_IDENTITY_MATRIX","LINE_FACTOR","LINE_DESCENT_FACTOR","BASELINE_FACTOR","SVG_NS","RenderingIntentFlag","ANY","DISPLAY","PRINT","SAVE","ANNOTATIONS_FORMS","ANNOTATIONS_STORAGE","ANNOTATIONS_DISABLE","IS_EDITING","OPLIST","AnnotationMode","DISABLE","ENABLE","ENABLE_FORMS","ENABLE_STORAGE","AnnotationPrefix","AnnotationEditorPrefix","AnnotationEditorType","NONE","FREETEXT","HIGHLIGHT","STAMP","INK","POPUP","SIGNATURE","COMMENT","AnnotationEditorParamsType","RESIZE","CREATE","FREETEXT_SIZE","FREETEXT_COLOR","FREETEXT_OPACITY","INK_COLOR","INK_THICKNESS","INK_OPACITY","INK_COLOR_AND_OPACITY","HIGHLIGHT_COLOR","HIGHLIGHT_THICKNESS","HIGHLIGHT_FREE","HIGHLIGHT_SHOW_ALL","DRAW_STEP","PermissionFlag","MODIFY_CONTENTS","COPY","MODIFY_ANNOTATIONS","FILL_INTERACTIVE_FORMS","COPY_FOR_ACCESSIBILITY","ASSEMBLE","PRINT_HIGH_QUALITY","MeshFigureType","TRIANGLES","LATTICE","PATCH","TextRenderingMode","FILL","STROKE","FILL_STROKE","INVISIBLE","FILL_ADD_TO_PATH","STROKE_ADD_TO_PATH","FILL_STROKE_ADD_TO_PATH","ADD_TO_PATH","FILL_STROKE_MASK","ADD_TO_PATH_FLAG","ImageKind","GRAYSCALE_1BPP","RGB_24BPP","RGBA_32BPP","AnnotationType","TEXT","LINK","LINE","SQUARE","CIRCLE","POLYGON","POLYLINE","UNDERLINE","SQUIGGLY","STRIKEOUT","CARET","FILEATTACHMENT","SOUND","MOVIE","WIDGET","SCREEN","PRINTERMARK","TRAPNET","WATERMARK","THREED","REDACT","RICHMEDIA","AnnotationReplyType","GROUP","REPLY","AnnotationRenditionOperation","PLAY_OR_RESUME","STOP","PAUSE","RESUME","PLAY","AnnotationFlag","HIDDEN","NOZOOM","NOROTATE","NOVIEW","READONLY","LOCKED","TOGGLENOVIEW","LOCKEDCONTENTS","AnnotationFieldFlag","REQUIRED","NOEXPORT","MULTILINE","PASSWORD","NOTOGGLETOOFF","RADIO","PUSHBUTTON","COMBO","EDIT","SORT","FILESELECT","MULTISELECT","DONOTSPELLCHECK","DONOTSCROLL","COMB","RICHTEXT","RADIOSINUNISON","COMMITONSELCHANGE","AnnotationBorderStyleType","SOLID","DASHED","BEVELED","INSET","AnnotationActionEventType","E","X","D","U","Fo","Bl","PO","PC","PV","PI","K","F","V","C","DocumentActionEventType","WC","WS","DS","WP","DP","PageActionEventType","O","VerbosityLevel","ERRORS","WARNINGS","INFOS","OPS","dependency","setLineWidth","setLineCap","setLineJoin","setMiterLimit","setDash","setRenderingIntent","setFlatness","setGState","save","restore","transform","moveTo","lineTo","curveTo","curveTo2","curveTo3","closePath","rectangle","stroke","closeStroke","fill","eoFill","fillStroke","eoFillStroke","closeFillStroke","closeEOFillStroke","endPath","clip","eoClip","beginText","endText","setCharSpacing","setWordSpacing","setHScale","setLeading","setFont","setTextRenderingMode","setTextRise","moveText","setLeadingMoveText","setTextMatrix","nextLine","showText","showSpacedText","nextLineShowText","nextLineSetSpacingShowText","setCharWidth","setCharWidthAndBounds","setStrokeColorSpace","setFillColorSpace","setStrokeColor","setStrokeColorN","setFillColor","setFillColorN","setStrokeGray","setFillGray","setStrokeRGBColor","setFillRGBColor","setStrokeCMYKColor","setFillCMYKColor","shadingFill","beginInlineImage","beginImageData","endInlineImage","paintXObject","markPoint","markPointProps","beginMarkedContent","beginMarkedContentProps","endMarkedContent","beginCompat","endCompat","paintFormXObjectBegin","paintFormXObjectEnd","beginGroup","endGroup","beginAnnotation","endAnnotation","paintImageMaskXObject","paintImageMaskXObjectGroup","paintImageXObject","paintInlineImageXObject","paintInlineImageXObjectGroup","paintImageXObjectRepeat","paintImageMaskXObjectRepeat","paintSolidColorImageMask","constructPath","setStrokeTransparent","setFillTransparent","rawFillPath","DrawOPS","quadraticCurveTo","PasswordResponses","NEED_PASSWORD","INCORRECT_PASSWORD","verbosity","setVerbosityLevel","level","Number","isInteger","getVerbosityLevel","info","msg","console","warn","unreachable","Error","assert","cond","_isValidProtocol","url","protocol","createValidAbsoluteUrl","baseUrl","options","addDefaultProtocol","startsWith","dots","match","length","tryConvertEncoding","stringToUTF8String","absoluteUrl","URL","parse","updateUrlHash","hash","allowRel","res","href","split","stripPath","str","substring","lastIndexOf","shadow","obj","prop","value","nonSerializable","Object","defineProperty","enumerable","configurable","writable","BaseException","BaseExceptionClosure","message","name","prototype","constructor","PasswordException","code","UnknownErrorException","details","InvalidPDFException","ResponseException","status","missing","FormatError","AbortException","bytesToString","bytes","undefined","MAX_ARGUMENT_COUNT","String","fromCharCode","apply","strBuf","i","chunkEnd","Math","min","chunk","subarray","push","join","stringToBytes","Uint8Array","charCodeAt","objectSize","keys","FeatureTest","isLittleEndian","buffer8","view32","Uint32Array","buffer","isOffscreenCanvasSupported","OffscreenCanvas","isImageDecoderSupported","ImageDecoder","isFloat16ArraySupported","Float16Array","isSanitizerSupported","Sanitizer","platform","userAgent","navigator","isAndroid","includes","isLinux","isMac","isWindows","isFirefox","isCanvasFilterSupported","ctx","getContext","filter","isAlphaColorInputSupported","isBackdropFilterSupported","CSS","supports","Util","hexNums","Array","from","n","toString","padStart","makeHexColor","r","g","b","m1","m2","multiplyByDOMMatrix","m","md","a","c","d","e","f","applyTransform","p","pos","p0","p1","applyTransformToBezier","m0","m3","m4","m5","pI","pI1","applyInverseTransform","axialAlignedBoundingBox","rect","output","r0","r1","r2","r3","a0","a2","a1","a3","b0","b2","b1","b3","m1r0","m1r2","m2r1","m2r3","max","inverseTransform","singularValueDecompose2dScale","matrix","first","second","sqrt","normalizeRect","slice","intersect","rect1","rect2","xLow","xHigh","yLow","yHigh","pointBoundingBox","x","y","minMax","rectBoundingBox","x0","y0","x1","y1","getExtremumOnCurve","#getExtremumOnCurve","x2","x3","y2","y3","t","mt","tt","ttt","getExtremum","#getExtremum","abs","delta","sqrtDelta","bezierBoundingBox","decodeURIComponent","escape","utf8StringToString","unescape","encodeURIComponent","isArrayEqual","arr1","arr2","ii","NormalizeRegex","NormalizationMap","normalizeUnicode","Map","replaceAll","_","p2","normalize","get","getUuid","crypto","randomUUID","buf","getRandomValues","_isValidExplicitDest","validRef","validName","dest","isArray","page","zoom","args","argsLen","allowNull","arg","makeArr","makeMap","makeObj","create","CIRCULAR_REF","Symbol","EOF","CmdCache","NameCache","RefCache","clearPrimitiveCaches","Name","Cmd","cmd","nonSerializableClosure","Dict","__nonSerializable__","map","objId","suppressEncryption","xref","assignXref","newXref","size","getValue","#getValue","isAsync","key1","key2","key3","Ref","fetchAsync","fetch","getAsync","getArray","getRaw","key","getKeys","getRawValues","values","getRawEntries","entries","set","setIfNotExists","has","setIfNumber","setIfArray","ArrayBuffer","isView","setIfDefined","setIfName","setIfDict","iterator","empty","emptyDict","merge","dictArray","mergeSubDicts","mergedDict","properties","dict","property","getOrInsertComputed","subDict","clear","clone","delete","num","gen","fromString","ref","exec","parseInt","RefSet","parent","_set","Set","put","add","remove","RefSetCache","_map","putAlias","aliasRef","items","isName","v","isCmd","isDict","isRefsEqual","v1","v2","BaseStream","isEmpty","isDataLoaded","getByte","getBytes","getImageData","decoderOptions","asyncGetBytes","isAsyncDecoder","isImageStream","canAsyncDecodeImageFromBuffer","getTransferableImage","peekByte","peekedByte","peekBytes","getUint16","getInt32","getByteRange","begin","end","getString","skip","reset","moveStart","makeSubStream","start","getBaseStreams","getOriginalStream","stream","isAscii","test","stringToAsciiOrUTF16BE","stringToUTF16String","stringToUTF16HexString","char","bigEndian","PDFStringTranslateTable","stringToPDFString","keepEscapeSequence","encoding","decoder","TextDecoder","fatal","decoded","decode","ex","charCode","charAt","PDF_VERSION_REGEXP","MAX_INT_32","IDENTITY_MATRIX","RESOURCES_KEYS_OPERATOR_LIST","RESOURCES_KEYS_TEXT_CONTENT","getLookupTableFactory","initializer","lookup","MissingDataException","ParserEOFException","XRefEntryException","XRefParseException","arrayBuffersToBytes","arr","dataLength","byteLength","data","item","fetchBinaryData","response","ok","statusText","getInheritableProperty","stopWhenFound","visited","getParentToUpdate","firstDict","result","deepCompare","value1","value2","ROMAN_NUMBER_MAP","toRomanNumerals","number","lowerCase","roman","repeat","toLowerCase","isWhiteSpace","ch","isBooleanArray","len","every","isNumberArray","BigInt64Array","BigUint64Array","lookupMatrix","fallback","lookupRect","lookupNormalRect","parseXFAPath","path","positionPattern","component","escapePDFName","escapeString","_collectJS","entry","list","parents","element","js","trim","collectActions","eventType","actions","additionalActionsDicts","additionalActions","rawActionDict","action","actionDict","Action","XMLEntities","codePointIter","codePointAt","encodeToXmlString","entity","toUpperCase","validateFontName","fontFamily","mustWarn","re","RegExp","ident","validateCSSFont","cssFontInfo","DEFAULT_CSS_FONT_OBLIQUE","DEFAULT_CSS_FONT_WEIGHT","CSS_FONT_WEIGHT_VALUES","fontWeight","italicAngle","weight","angle","parseFloat","isNaN","recoverJsURL","URL_OPEN_METHODS","regex","jsUrl","newWindow","numberToString","roundedValue","round","toFixed","getNewAnnotationsMap","annotationStorage","newAnnotationsByPage","pageIndex","getModificationDate","date","Date","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getRotationMatrix","rotation","width","height","getSizeInBytes","ceil","log2","QCMS","memoryArray","_memory","_mustAddAlpha","_destBuffer","_destOffset","_destLength","_cssColor","_makeHexColor","_memoryArray","array","copy_result","ptr","j","copy_rgb","make_cssRGB","DataType","freeze","RGB8","RGBA8","BGRA8","Gray8","GrayA8","CMYK","Intent","Perceptual","RelativeColorimetric","Saturation","AbsoluteColorimetric","qcms_convert_array","transformer","src","ptr0","passArray8ToWasm0","wasm","__wbindgen_malloc","len0","WASM_VECTOR_LEN","qcms_convert_four","src1","src2","src3","src4","css","qcms_convert_one","qcms_convert_three","qcms_drop_transformer","qcms_transformer_from_memory","mem","in_type","intent","ret","__wbg_get_imports","import0","__proto__","__wbg___wbindgen_throw_6b64449b9b9ed33c","arg0","arg1","getStringFromWasm0","__wbg_copy_result_0d15f3bf9d9012ae","__wbg_copy_rgb_0106d9d9464fce43","__wbg_make_cssRGB_8e24b34f71f5363e","__wbindgen_init_externref_table","table","__wbindgen_externrefs","offset","grow","decodeText","cachedUint8ArrayMemory0","getUint8ArrayMemory0","memory","malloc","cachedTextDecoder","ignoreBOM","MAX_SAFARI_DECODE_BYTES","numBytesDecoded","wasmModule","__wbg_finalize_init","instance","module","exports","__wbindgen_start","__wbg_load","imports","Response","WebAssembly","instantiateStreaming","validResponse","expectedResponseType","headers","arrayBuffer","instantiate","Instance","initSync","getPrototypeOf","Module","__wbg_init","module_or_path","Request","default","MathClamp","resizeRgbImage","w1","h1","w2","h2","alpha01","COMPONENTS","xRatio","yRatio","newIndex","oldIndex","xScaled","Uint16Array","w1Scanline","floor","py","resizeRgbaImage","src32","dest32","rgbMask","copyRgbaImage","isDefaultDecodeHelper","expectedLen","decodeLen","ColorSpace","rgbBuf","Uint8ClampedArray","numComps","getRgb","srcOffset","getRgbItem","getRgbHex","destOffset","getRgbBuffer","count","bits","getOutputLength","inputLength","isPassthrough","isDefaultDecode","bpc","fillRgb","originalWidth","originalHeight","actualHeight","comps","numComponentColors","needsResizing","allColors","colorMap","destPos","rgbPos","usesZeroToOneRange","AlternateCS","base","tintFn","tmpBuf","scale","baseNumComps","baseBuf","scaled","tinted","PatternCS","baseCS","IndexedCS","highVal","outputDelta","lookupPos","DeviceGrayCS","q","DeviceRgbCS","DeviceRgbaCS","_alpha01","DeviceCmykCS","toRgb","#toRgb","srcScale","k","CalGrayCS","whitePoint","blackPoint","gamma","XW","YW","ZW","XB","YB","ZB","G","A","AG","L","val","CalRGBCS","BRADFORD_SCALE_MATRIX","BRADFORD_SCALE_INVERSE_MATRIX","SRGB_D65_XYZ_TO_RGB_MATRIX","FLAT_WHITEPOINT_MATRIX","tempNormalizeMatrix","tempConvertMatrix1","tempConvertMatrix2","DECODE_L_CONSTANT","GR","GG","GB","MXA","MYA","MZA","MXB","MYB","MZB","MXC","MYC","MZC","matrixProduct","#matrixProduct","toFlat","#toFlat","sourceWhitePoint","LMS","toD65","#toD65","D65X","D65Y","D65Z","sRGBTransferFunction","#sRGBTransferFunction","color","decodeL","#decodeL","compensateBlackPoint","#compensateBlackPoint","sourceBlackPoint","XYZ_Flat","zeroDecodeL","X_DST","X_SRC","Y_DST","Y_SRC","Z_DST","Z_SRC","X_Scale","X_Offset","Y_Scale","Y_Offset","Z_Scale","Z_Offset","normalizeWhitePointToFlat","#normalizeWhitePointToFlat","XYZ_In","LMS_Flat","normalizeWhitePointToD65","#normalizeWhitePointToD65","LMS_D65","B","AGR","BGG","CGB","Y","Z","XYZ","XYZ_Black","XYZ_D65","SRGB","LabCS","range","amin","amax","bmin","bmax","fn_g","#fn_g","#decode","high1","low2","high2","maxVal","Ls","as","bs","M","N","fetchSync","xhr","XMLHttpRequest","open","responseType","send","IccColorSpace","convertPixel","useWasm","wasmUrl","finalizer","iccProfile","isUsable","inType","FinalizationRegistry","register","setOptions","useWorkerFetch","_module","bind","CmykICCBasedCS","iccUrl","Stream","endPos","StringStream","NaN","NullStream","ChunkedStream","progressiveDataLength","_lastSuccessfulEnsureByteChunk","_loadedChunks","chunkSize","manager","numChunks","getMissingChunks","chunks","numChunksLoaded","onReceiveData","beginChunk","endChunk","curChunk","onReceiveProgressiveData","position","ensureByte","ensureRange","nextEmptyChunk","hasChunk","ChunkedStreamSubstream","missingChunks","subStream","ChunkedStreamManager","aborted","currRequestId","_chunksNeededByRequest","loadedStreamCapability","Promise","withResolvers","_promisesByRequest","_requestsByChunk","pdfStream","rangeChunkSize","disableAutoFetch","msgHandler","sendRequest","rangeReader","getRangeReader","done","read","requestAllChunks","noFetch","_requestChunks","promise","requestId","chunksNeeded","resolve","capability","chunksToRequest","requestIds","groupedChunksToRequest","groupChunks","groupedChunk","catch","reject","reason","getStream","requestRange","getBeginChunk","getEndChunk","requestRanges","ranges","sort","groupedChunks","prevChunk","isProgressive","loadedRequests","lastChunk","loaded","total","abort","cancelAllRequests","convertToRGBA","params","kind","convertBlackAndWhiteToRGBA","convertRGBToRGBA","srcPos","nonBlackColor","inverseDecode","black","zeroMapping","oneMapping","widthInSource","widthRemainder","xorMask","srcLength","elem","len32","alphaMask","s1","s2","s3","jj","grayToRGBA","MIN_IMAGE_DIM","MAX_IMAGE_DIM","MAX_ERROR","ImageResizer","goodSquareLength","imgData","isMask","_imgData","_isMask","canUseImageDecoder","isTypeSupported","needsToBeResized","MAX_DIM","area","_hasMaxArea","MAX_AREA","_areGoodDims","_guessMax","maxArea","getReducePowerForJPX","componentsCount","maxJPXArea","minFactor","canvasMaxAreaInBytes","canvas","fillRect","opacity","tolerance","defaultHeight","middle","createImage","_createImage","rescaleImageData","_encodeBMP","imagePromise","preferAnimation","transfer","createImageBitmap","Blob","finally","close","firstFactor","factor","steps","splice","newWidth","newHeight","bitmap","image","step","prevWidth","prevHeight","drawImage","transferToImageBitmap","#rescaleImageData","rgbaSize","rgbaData","maxHeight","newSize","remainder","h","willReadFrequently","putImageData","ImageData","bitPerPixel","colorTable","maskTable","compression","rowLen","rowSize","newData","extraLen","row","tmp","view","DataView","setUint32","headerLength","fileLength","bmpData","setUint16","setInt32","emptyBuffer","DecodeStream","bufferLength","eof","minBufferLength","maybeMinBufferLength","_rawMinBufferLength","readBlock","ensureBuffer","requested","buffer2","bufEnd","decodeImage","asyncGetBytesFromDecompressionStream","readable","DecompressionStream","writer","getWriter","ready","write","then","totalLength","decompressed","compressed","StreamsSequenceStream","streams","onError","s","maybeLength","_onError","shift","newLength","baseStreamsBuf","baseStreams","ColorSpaceUtils","cs","resources","pdfFunctionFactory","globalColorSpaceCache","localColorSpaceCache","asyncIfNotCached","csName","csRef","parsedCS","cachedCS","getByRef","getByName","subParse","#subParse","#parse","fetchIfRef","gray","rgb","rgba","cmyk","colorSpaces","resourcesCS","mode","isRef","iccCS","altRaw","altCS","hiVal","JpegError","DNLMarkerError","scanLines","EOIMarkerError","dctZigZag","dctCos1","dctSin1","dctCos3","dctSin3","dctCos6","dctSin6","dctSqrt2","dctSqrt1d2","buildHuffmanTable","codeLengths","children","index","pop","getBlockBufferOffset","col","blocksPerLine","decodeScan","frame","components","resetInterval","spectralStart","spectralEnd","successivePrev","successive","parseDNLMarker","mcusPerLine","progressive","startOffset","bitsData","bitsCount","readBit","nextByte","maybeScanLines","blockRow","precision","decodeHuffman","tree","node","receive","receiveAndExtend","decodeBaseline","blockOffset","huffmanTableDC","diff","blockData","pred","rs","huffmanTableAC","z","decodeDCFirst","decodeDCSuccessive","eobrun","decodeACFirst","successiveACState","successiveACNextValue","decodeACSuccessive","offsetZ","sign","decodeMcu","mcu","mcuRow","mcuCol","blockCol","decodeBlock","componentsLength","decodeFn","fileMarker","mcuExpected","blocksPerColumn","mcusPerColumn","mcuToRead","findNextFileMarker","invalid","partialMsg","marker","quantizeAndInverse","blockBufferOffset","qt","quantizationTable","v0","v3","v4","v5","v6","v7","p3","p4","p5","p6","p7","buildComponentData","computationBuffer","Int16Array","currentPos","startPos","maxPos","newPos","currentMarker","newMarker","prepareComponents","samplesPerLine","maxH","maxV","blocksPerLineForMcu","blocksPerColumnForMcu","blocksBufferSize","readDataBlock","endOffset","appData","oldOffset","newOffset","skipData","JpegImage","decodeTransform","colorTransform","_decodeTransform","_colorTransform","byteOffset","exifOffsets","numComponents","markerLoop","exifStart","exifEnd","dnlScanLines","maxOffset","jfif","adobe","numSOSMarkers","quantizationTables","huffmanTablesAC","huffmanTablesDC","l","version","major","minor","densityUnits","xDensity","yDensity","thumbWidth","thumbHeight","thumbData","flags0","flags1","transformCode","quantizationTablesLength","quantizationTablesEnd","quantizationTableSpec","tableData","extended","sofScanLines","componentIds","componentId","qId","quantizationId","huffmanLength","huffmanTableSpec","codeLengthSum","huffmanValues","selectorsCount","componentIndex","tableSpec","successiveApproximation","processed","nextFileMarker","scaleX","scaleY","getLinearizedBlockData","#getLinearizedBlockData","isSourcePDF","componentScaleX","componentScaleY","blocksPerScanline","xScaleBlockOffset","mask3LSB","lastComponentScaleX","_isColorConversionNeeded","_convertYccToRgb","Cb","Cr","_convertYccToRgba","out","_convertYcckToRgb","_convertYcckToCmyk","_convertCmykToRgb","_convertYcckToRgba","_convertCmykToRgba","getData","forceRGBA","forceRGB","grayColor","JpegStream","jpegOptions","decodeArr","bitsPerComponent","decodeArrLength","Int32Array","transformNeeded","maxValue","skipUselessBytes","#skipUselessBytes","jpegImage","drawWidth","drawHeight","useImageDecoder","addState","parentState","pattern","checkFn","iterateFn","processFn","state","at","InitialState","iterateInlineImageGroup","context","fnArray","iFirstSave","iCurr","foundInlineImageGroup","MIN_IMAGES_IN_INLINE_IMAGES_BLOCK","MAX_IMAGES_IN_INLINE_IMAGES_BLOCK","MAX_WIDTH","IMAGE_PADDING","argsArray","curr","iFirstTransform","iFirstPIIXO","maxX","maxLineHeight","currentX","currentY","img","w","imgWidth","imgHeight","imgRowSize","dataOffset","kk","iterateImageMaskGroup","foundImageMaskGroup","MIN_IMAGES_IN_MASKS_BLOCK","MAX_IMAGES_IN_MASKS_BLOCK","MAX_SAME_IMAGES_IN_MASKS_BLOCK","iFirstPIMXO","isSameImage","iTransform","transformArgs","firstPIMXOArg0","firstTransformArg0","firstTransformArg1","firstTransformArg2","firstTransformArg3","iPIMXO","positions","images","maskParams","interpolate","iterateImageGroup","iFirstPIXO","firstPIXOArg0","MIN_IMAGES_IN_BLOCK","MAX_IMAGES_IN_BLOCK","iterateShowTextGroup","iFirstSetFont","firstSetFontArg0","firstSetFontArg1","MIN_CHARS_IN_BLOCK","MAX_CHARS_IN_BLOCK","iFirstBeginText","iFirstSetTextMatrix","iFirstShowText","iFirstEndText","iFirst","iEndText","iFirstConstructPath","op","newBBox","NullOptimizer","queue","_optimize","fn","flush","QueueOptimizer","OperatorList","lastProcessed","iterate","CHUNK_SIZE","CHUNK_SIZE_ABOUT","streamSink","_streamSink","optimizer","dependencies","_totalLength","_resolved","addOp","addImageOps","optionalContent","hasMask","addDependency","addDependencies","addOpList","opList","getIR","_transfers","transfers","bbox","separateAnnots","enqueue","CheckedOperatorList","needsIsolation","hasSoftMask","ShadingType","FUNCTION_BASED","AXIAL","RADIAL","FREE_FORM_MESH","LATTICE_FORM_MESH","COONS_PATCH_MESH","TENSOR_PATCH_MESH","Pattern","hasGPU","parseShading","shading","FunctionBasedShading","RadialAxialShading","MeshShading","DummyShading","BaseShading","SMALL_NUMBER","shadingType","coordsLen","coordsArr","t0","t1","domainArr","extendStart","extendEnd","extendArr","fnObj","NUMBER_OF_SAMPLES","colorStops","ratio","iBase","rgbBuffer","rBase","gBase","bBase","iPrev","rPrev","gPrev","bPrev","maxSlopeR","maxSlopeG","maxSlopeB","minSlopeR","minSlopeG","minSlopeB","run","slopesExist","cssColor","background","unshift","meshUpdateBounds","self","minX","coords","minY","maxY","bounds","meshPackData","coordsPacked","xy","colors","colorsPacked","figure","figures","buildMeshVertexData","vertexCount","vpr","verticesPerRow","posData","colData","pOff","cOff","addVertex","pi","ci","ps","rows","cols","MAX_STEP_COUNT","bboxW","bboxH","stepsX","stepsY","totalVertices","xyBuf","colorBuf","rangeX","rangeY","halfStepX","halfStepY","coordOffset","colorOffset","yDomain","xDomain","MeshStreamReader","tmpCompsBuf","csNumComps","colorSpace","tmpCsCompsBuf","colorFn","hasData","readBits","align","readFlag","bitsPerFlag","readCoordinate","bitsPerCoordinate","xi","yi","readComponents","bCache","buildB","lut","t_","getB","clearPatternCaches","MIN_SPLIT_PATCH_CHUNKS_AMOUNT","MAX_SPLIT_PATCH_CHUNKS_AMOUNT","TRIANGLE_DENSITY","decodeContext","reader","patchMesh","_decodeType4Shading","_decodeType5Shading","_decodeType6Shading","_decodeType7Shading","_updateBounds","_buildFigureFromPatch","_packData","operators","verticesLeft","coord","tmp1","tmp2","tmp3","tmp4","figureMinX","figureMinY","figureMaxX","figureMaxY","splitXBy","splitYBy","figureCoords","figureColors","cl","cr","c0","c1","c2","c3","bRow","bCol","newColor","getTilingPatternIR","operatorList","xstep","ystep","paintType","tilingType","hexToInt","hexToStr","addHex","incHex","MAX_NUM_SIZE","MAX_ENCODED_NUM_SIZE","BinaryCMapStream","readNumber","last","readSigned","readHex","readHexNumber","stack","sp","bufferSize","readHexSigned","readString","BinaryCMapReader","cMap","extend","header","vertical","useCMap","sequence","dataSize","ucs2DataSize","subitemsCount","addCodespaceRange","mapOne","mapCidRange","mapBfRange","Ascii85Stream","input","TILDA_CHAR","Z_LOWER_CHAR","AsciiHexStream","firstDigit","UPSTREAM_BLOCK_SIZE","maxDecodeLength","digit","Options","makeBrotliDecode","MAX_HUFFMAN_TABLE_SIZE","CODE_LENGTH_CODE_ORDER","DISTANCE_SHORT_CODE_INDEX_OFFSET","DISTANCE_SHORT_CODE_VALUE_OFFSET","FIXED_TABLE","BLOCK_LENGTH_OFFSET","BLOCK_LENGTH_N_BITS","INSERT_LENGTH_N_BITS","COPY_LENGTH_N_BITS","CMD_LOOKUP","unpackCommandLookupTable","log2floor","next","calculateDistanceAlphabetSize","npostfix","ndirect","maxndistbits","calculateDistanceAlphabetLimit","maxDistance","makeError","ndistbits","group","cmdLookup","insertLengthOffsets","copyLengthOffsets","cmdCode","rangeIdx","distanceContextOffset","insertCode","copyCode","copyLengthOffset","distanceContext","decodeWindowBits","largeWindowEnabled","isLargeWindow","bitOffset","accumulator32","shortBuffer","halfOffset","readFewBits","attachDictionaryChunk","runningState","cdNumChunks","cdChunks","cdChunkOffsets","cdBlockBits","cdTotalSize","initState","blockTrees","distRbIdx","maxDistanceAlphabetLimit","distExtraBits","Int8Array","distOffset","initBitReader","decodeVarLenUnsignedByte","decodeMetaBlockLength","inputEnd","metaBlockLength","isUncompressed","isMetadata","sizeNibbles","sizeBytes","readSymbol","tableGroup","tableIdx","sym","mask","readBlockLength","readManyBits","moveToFront","inverseMoveToFrontTransform","vLen","mtf","readHuffmanCodeLengths","codeLengthCodeLengths","numSymbols","symbol","prevCodeLen","repeatCodeLen","space","readMoreInput","codeLen","extraBits","newLen","oldRepeat","repeatDelta","checkDupes","symbols","readSimpleHuffmanCode","alphabetSizeMax","alphabetSizeLimit","maxBits","histogramId","readComplexHuffmanCode","numCodes","codeLenIdx","readHuffmanCode","simpleCodeOrSkip","decodeContextMap","contextMapSize","contextMap","numTrees","useRleForZeros","maxRunLengthPrefix","alphabetSize","tableSize","reps","decodeBlockTypeAndLength","treeType","numBlockTypes","ringBuffers","rings","blockType","decodeLiteralBlockSwitch","literalBlockLength","numLiteralBlockTypes","literalBlockType","contextMapSlice","literalTreeIdx","contextMode","contextModes","contextLookupOffset1","contextLookupOffset2","decodeCommandBlockSwitch","commandBlockLength","numCommandBlockTypes","commandTreeIdx","decodeDistanceBlockSwitch","distanceBlockLength","numDistanceBlockTypes","distContextMapSlice","maybeReallocateRingBuffer","maxRingBufferSize","expectedTotalSize","minimalNewSize","ringBufferSize","ringBufferSizeWithSlack","newBuffer","oldBuffer","ringBuffer","readNextMetablockHeader","nextRunningState","literalTreeGroup","commandTreeGroup","distanceTreeGroup","jumpToByteBoundary","readMetablockPartition","blockTypeAlphabetSize","blockLengthAlphabetSize","calculateDistanceLut","distancePostfixBits","numDirectDistanceCodes","postfix","half","readMetablockHuffmanCodesAndContextMaps","limit","contextMapLength","numLiteralTrees","trivialLiteralContext","distContextMap","numDistTrees","huffmanTreeGroupAllocSize","decodeHuffmanTreeGroup","distanceAlphabetSizeMax","distanceAlphabetSizeLimit","copyUncompressedData","reload","chunkLength","copyRawBytes","writeRingBuffer","toWrite","outputLength","outputUsed","ringBufferBytesReady","ringBufferBytesWritten","outputOffset","maxTableSize","calculateFence","isEager","doUseDictionary","fence","distance","address","initializeCompoundDictionaryCopy","copyLength","dictionaryData","wordLength","sizeBits","offsets","wordIdx","transformIdx","transforms","RFC_TRANSFORMS","numTransforms","transformDictionaryWord","initializeCompoundDictionary","cdBlockMap","blockBits","cursor","cdBrIndex","cdBrOffset","cdBrLength","cdBrCopied","copyFromCompoundDictionary","origPos","remChunkLength","decompress","windowBits","maxBackwardDistance","ringBufferMask","insertAndCopyExtraBits","insertLengthOffset","distanceCode","insertLengthExtraBits","insertLength","copyLengthExtraBits","prevByte1","prevByte2","literalContext","LOOKUP","distTreeIdx","dst","srcEnd","dstEnd","numQuads","copyWithin","checkHealth","Transforms","prefixSuffixLen","prefixSuffixCount","triplets","prefixSuffixStorage","prefixSuffixHeads","unpackTransforms","prefixSuffix","prefixSuffixSrc","transformsSrc","prefixSuffixBytes","toUtf8Runes","dstOffset","wordLen","transformIndex","transformOffset","prefixIdx","transformType","suffixIdx","prefix","prefixEnd","suffix","suffixEnd","omitFirst","omitLast","dictOffset","uppercaseOffset","shiftOffset","param","scalar","getNextKey","replicateValue","nextTableBitSize","rootBits","left","codeLengthsSize","tableOffset","sorted","tableBits","totalSize","low","currentOffset","endOfStreamReached","halfAvailable","readOffset","bytesInBuffer","byteBuffer","spaceLeft","readInput","tailBytes","bytesToNibbles","endOfStream","prepare","health","padding","paddingBits","copyNibbles","chunkLen","byteLen","halfLen","unpackLookupTable","utfMap","utfRle","rep","State","intBuffer","accumulator64","InputStream","setData","newSizeBits","dictionaryOffsets","dictionarySizeBits","unpackDictionaryData","dictionary","data0","data1","skipFlip","sizeBitsData","toUsAsciiBytes","skipFlipRunes","flip","bytesRead","closeInput","ByteBuffer","customDictionary","totalOutput","BrotliDecode","BrotliStream","decodedData","_decoderOptions","JBig2","moduleArg","moduleRtn","ENVIRONMENT_IS_WEB","ENVIRONMENT_IS_WORKER","arguments_","thisProgram","quit_","toThrow","_scriptName","import","meta","scriptDirectory","readAsync","readBinary","credentials","log","err","error","wasmBinary","ABORT","EXITSTATUS","readyPromiseResolve","readyPromiseReject","HEAP8","HEAPU8","HEAP16","HEAPU16","HEAP32","HEAPU32","HEAPF32","HEAPF64","HEAP64","HEAPU64","runtimeInitialized","updateMemoryViews","wasmMemory","Float64Array","preRun","addOnPreRun","callRuntimeCallbacks","onPreRuns","initRuntime","wasmExports","postRun","addOnPostRun","onPostRuns","what","RuntimeError","wasmBinaryFile","getWasmImports","wasmImports","createWasm","receiveInstance","assignWasmExports","inst","mod","ExitStatus","callbacks","cb","noExitRuntime","__abort_js","runtimeKeepaliveCounter","__emscripten_runtime_keepalive_clear","timers","handleException","keepRuntimeAlive","_proc_exit","exitJS","implicit","_exit","maybeExit","callUserCallback","func","_emscripten_get_now","performance","now","__setitimer_js","which","timeout_ms","clearTimeout","id","setTimeout","__emscripten_timeout","_createImageData","imageData","getHeapMax","alignMemory","alignment","growMemory","oldHeapSize","pages","_emscripten_resize_heap","requestedSize","oldSize","maxHeapSize","cutDown","overGrownHeapSize","replacement","_setImageData","array_ptr","pitch8","pitch32","destSize","srcStart","destStart","_setLineData","line_ptr","writeArrayToMemory","_malloc","_free","_jbig2_decode","_ccitt_decode","__indirect_function_table","doRun","WasmImage","handler","instances","modulePromise","_filename","_noWasmFilename","cleanup","trackInstance","getJsModule","#getJsModule","fallbackCallback","instantiateWasm","#instantiateWasm","successCallback","sendWithPromise","filename","results","_getModule","promises","race","_params","Jbig2Error","JBig2CCITTFaxImage","globals","CCITTOptions","globalsPtr","EndOfLine","EncodedByteAlign","BlackIs1","Columns","Rows","globalsSize","CCITTFaxStream","EndOfBlock","codeLenCodeMap","lengthDecode","distDecode","fixedLitCodeTab","fixedDistCodeTab","FlateStream","cmf","flg","codeSize","codeBuf","getBits","getCode","codes","maxLen","codeVal","generateHuffmanTable","lengths","code2","endsStreamOnError","#endsStreamOnError","hdr","blockLen","check","block","litCodeTable","distCodeTable","numLitCodes","numDistCodes","numCodeLenCodes","codeLenCodeLengths","codeLenCodeTab","bitsLength","bitsOffset","repeatLength","code1","dist","Jbig2Stream","stripFileHeader","globalsStream","OpenJPEG","EmscriptenEH","EmscriptenSjLj","_copy_pixels_1","compG_ptr","nb_pixels","compG","_copy_pixels_3","compR_ptr","compB_ptr","compR","compB","_copy_pixels_4","compA_ptr","compA","ENV","getExecutableName","getEnvStrings","strings","lang","globalThis","language","replace","env","USER","LOGNAME","PATH","PWD","HOME","LANG","stringToUTF8Array","heap","outIdx","maxBytesToWrite","startIdx","endIdx","u","stringToUTF8","outPtr","_environ_get","__environ","environ_buf","bufSize","envp","string","lengthBytesUTF8","_environ_sizes_get","penviron_count","penviron_buf_size","INT53_MAX","INT53_MIN","bigintToI53Checked","_fd_seek","fd","whence","printCharBuffers","UTF8Decoder","findStringEnd","heapOrArray","idx","maxBytesToRead","ignoreNul","maxIdx","UTF8ArrayToString","endPtr","u0","u1","u2","printChar","UTF8ToString","_fd_write","iov","iovcnt","pnum","_gray_to_rgba","_graya_to_rgba","_jsPrintWarning","message_ptr","_rgb_to_rgba","_storeErrorMessage","errorMessages","_jp2_decode","o","JpxError","JpxImage","isIndexedColormap","smaskInData","reducePower","parseImageProperties","newByte","oldByte","Xsiz","Ysiz","XOsiz","YOsiz","Csiz","JpxStream","_length","LZWStream","earlyChange","cachedData","bitsCached","maxLzwDictionarySize","lzwState","codeLength","nextCode","dictionaryValues","dictionaryLengths","dictionaryPrevCodes","currentSequence","currentSequenceLength","blockSize","decodedSizeDelta","estimatedDecodedSize","prevCode","decodedLength","currentBufferLength","hasPrev","PredictorStream","predictor","readBlockTiff","readBlockPng","columns","pixBytes","rowBytes","rawBytes","inbuf","outbuf","inbits","outbits","bytesPerPixel","sum","compArray","bitMask","prevRow","up","upLeft","pa","pb","pc","RunLengthStream","repeatHeader","source","MAX_LENGTH_TO_CACHE","getInlineImageCacheKey","Parser","lexer","allowStreams","recoveryMode","imageCache","_imageId","refill","buf1","getObj","buf2","tryShift","cipherTransform","makeInlineImage","makeStream","decryptString","findDefaultInlineStreamEnd","I","SPACE","LF","CR","NUL","knownCommands","maybeEIPos","followingBytes","tmpLexer","Lexer","_hexStringWarn","numArgs","nextObj","knownCommand","variableArgs","findDCTDecodeInlineStreamEnd","foundEOI","markerLength","inlineStreamSkipEI","findASCII85DecodeInlineStreamEnd","TILDE","GT","tildePos","maybeEI","findASCIIHexDecodeInlineStreamEnd","dictMap","dictLength","beginInlineImagePos","Filter","filterName","filterZero","cacheKey","initialStreamPos","cacheEntry","imageStream","hasCryptFilter","createStream","#fetchIfRef","#hasCryptFilter","findStreamLength","#findStreamLength","SCAN_BLOCK_LENGTH","signatureLength","END_SIGNATURE","endLength","PARTIAL_SIGNATURE","normalLength","scanBytes","scanLength","found","part","partLen","lastByte","skipToNextLine","nextChar","makeFilter","filterArray","paramsArray","cryptName","specialChars","toHexDigit","_hexStringNumWarn","currentChar","peekChar","getNumber","divideBy","baseValue","currentDigit","numParen","charBuffered","getName","previousCh","MAX_HEX_STRING_NUM_WARN","getHexString","comment","nextCh","knownCommandFound","possibleCommand","Linearization","getInt","linDict","allowZeroValue","getHints","hints","hintsLength","hint","parser","obj1","obj2","obj3","objectNumberFirst","endFirst","numPages","mainXRefEntriesOffset","pageFirst","BUILT_IN_CMAPS","MAX_MAP_RANGE","CMap","builtInCMap","codespaceRanges","numCodespaceRanges","high","dstLow","nextCharCode","mapBfRangeToArray","contains","forEach","callback","charCodeOf","indexOf","getMap","readCharCode","nn","codespaceRange","charcode","getCharCodeLength","isIdentityCMap","IdentityCMap","strToInt","expectString","expectInt","parseBfChar","parseBfRange","parseCidChar","parseCidRange","parseCodespaceRange","parseWMode","parseCMapName","parseCMap","fetchBuiltInCMap","previous","embeddedUseCMap","objLoop","extendCMap","createBuiltInCMap","useCodespaceRanges","cMapData","isCompressed","CMapFactory","parsedCMap","CSS_FONT_INFO","SYSTEM_FONT_INFO","FONT_INFO","bools","numbers","OFFSET_NUMBERS","OFFSET_BBOX","OFFSET_FONT_MATRIX","OFFSET_DEFAULT_VMETRICS","OFFSET_STRINGS","PATTERN_INFO","KIND","HAS_BBOX","HAS_BACKGROUND","SHADING_TYPE","N_COORD","N_COLOR","N_STOP","N_FIGURES","compileCssFontInfo","encoder","TextEncoder","encodedStrings","stringsLength","encoded","encode","compileSystemFontInfo","encodedStyleStyle","encodedStyleWeight","lengthEstimate","style","setUint8","guessFallback","transferToFixedLength","compileFontInfo","font","systemFontInfoBuffer","systemFontInfo","cssFontInfoBuffer","numBools","boolByte","boolBit","setFloat64","setInt16","fontMatrix","point","defaultVMetrics","metric","compilePatternInfo","ir","nCoord","nColor","nStop","dataView","u8data","coordsView","hex","setFloat32","compileFontPathInfo","ExpertEncoding","MacExpertEncoding","MacRomanEncoding","StandardEncoding","WinAnsiEncoding","SymbolSetEncoding","ZapfDingbatsEncoding","getEncoding","encodingName","getGlyphsUnicode","AE","AEacute","AEmacron","AEsmall","Aacute","Aacutesmall","Abreve","Abreveacute","Abrevecyrillic","Abrevedotbelow","Abrevegrave","Abrevehookabove","Abrevetilde","Acaron","Acircle","Acircumflex","Acircumflexacute","Acircumflexdotbelow","Acircumflexgrave","Acircumflexhookabove","Acircumflexsmall","Acircumflextilde","Acute","Acutesmall","Acyrillic","Adblgrave","Adieresis","Adieresiscyrillic","Adieresismacron","Adieresissmall","Adotbelow","Adotmacron","Agrave","Agravesmall","Ahookabove","Aiecyrillic","Ainvertedbreve","Alpha","Alphatonos","Amacron","Amonospace","Aogonek","Aring","Aringacute","Aringbelow","Aringsmall","Asmall","Atilde","Atildesmall","Aybarmenian","Bcircle","Bdotaccent","Bdotbelow","Becyrillic","Benarmenian","Beta","Bhook","Blinebelow","Bmonospace","Brevesmall","Bsmall","Btopbar","Caarmenian","Cacute","Caron","Caronsmall","Ccaron","Ccedilla","Ccedillaacute","Ccedillasmall","Ccircle","Ccircumflex","Cdot","Cdotaccent","Cedillasmall","Chaarmenian","Cheabkhasiancyrillic","Checyrillic","Chedescenderabkhasiancyrillic","Chedescendercyrillic","Chedieresiscyrillic","Cheharmenian","Chekhakassiancyrillic","Cheverticalstrokecyrillic","Chi","Chook","Circumflexsmall","Cmonospace","Coarmenian","Csmall","DZ","DZcaron","Daarmenian","Dafrican","Dcaron","Dcedilla","Dcircle","Dcircumflexbelow","Dcroat","Ddotaccent","Ddotbelow","Decyrillic","Deicoptic","Delta","Deltagreek","Dhook","Dieresis","DieresisAcute","DieresisGrave","Dieresissmall","Digammagreek","Djecyrillic","Dlinebelow","Dmonospace","Dotaccentsmall","Dslash","Dsmall","Dtopbar","Dz","Dzcaron","Dzeabkhasiancyrillic","Dzecyrillic","Dzhecyrillic","Eacute","Eacutesmall","Ebreve","Ecaron","Ecedillabreve","Echarmenian","Ecircle","Ecircumflex","Ecircumflexacute","Ecircumflexbelow","Ecircumflexdotbelow","Ecircumflexgrave","Ecircumflexhookabove","Ecircumflexsmall","Ecircumflextilde","Ecyrillic","Edblgrave","Edieresis","Edieresissmall","Edot","Edotaccent","Edotbelow","Efcyrillic","Egrave","Egravesmall","Eharmenian","Ehookabove","Eightroman","Einvertedbreve","Eiotifiedcyrillic","Elcyrillic","Elevenroman","Emacron","Emacronacute","Emacrongrave","Emcyrillic","Emonospace","Encyrillic","Endescendercyrillic","Eng","Enghecyrillic","Enhookcyrillic","Eogonek","Eopen","Epsilon","Epsilontonos","Ercyrillic","Ereversed","Ereversedcyrillic","Escyrillic","Esdescendercyrillic","Esh","Esmall","Eta","Etarmenian","Etatonos","Eth","Ethsmall","Etilde","Etildebelow","Euro","Ezh","Ezhcaron","Ezhreversed","Fcircle","Fdotaccent","Feharmenian","Feicoptic","Fhook","Fitacyrillic","Fiveroman","Fmonospace","Fourroman","Fsmall","GBsquare","Gacute","Gamma","Gammaafrican","Gangiacoptic","Gbreve","Gcaron","Gcedilla","Gcircle","Gcircumflex","Gcommaaccent","Gdot","Gdotaccent","Gecyrillic","Ghadarmenian","Ghemiddlehookcyrillic","Ghestrokecyrillic","Gheupturncyrillic","Ghook","Gimarmenian","Gjecyrillic","Gmacron","Gmonospace","Grave","Gravesmall","Gsmall","Gsmallhook","Gstroke","H","H18533","H18543","H18551","H22073","HPsquare","Haabkhasiancyrillic","Hadescendercyrillic","Hardsigncyrillic","Hbar","Hbrevebelow","Hcedilla","Hcircle","Hcircumflex","Hdieresis","Hdotaccent","Hdotbelow","Hmonospace","Hoarmenian","Horicoptic","Hsmall","Hungarumlaut","Hungarumlautsmall","Hzsquare","IAcyrillic","IJ","IUcyrillic","Iacute","Iacutesmall","Ibreve","Icaron","Icircle","Icircumflex","Icircumflexsmall","Icyrillic","Idblgrave","Idieresis","Idieresisacute","Idieresiscyrillic","Idieresissmall","Idot","Idotaccent","Idotbelow","Iebrevecyrillic","Iecyrillic","Ifraktur","Igrave","Igravesmall","Ihookabove","Iicyrillic","Iinvertedbreve","Iishortcyrillic","Imacron","Imacroncyrillic","Imonospace","Iniarmenian","Iocyrillic","Iogonek","Iota","Iotaafrican","Iotadieresis","Iotatonos","Ismall","Istroke","Itilde","Itildebelow","Izhitsacyrillic","Izhitsadblgravecyrillic","J","Jaarmenian","Jcircle","Jcircumflex","Jecyrillic","Jheharmenian","Jmonospace","Jsmall","KBsquare","KKsquare","Kabashkircyrillic","Kacute","Kacyrillic","Kadescendercyrillic","Kahookcyrillic","Kappa","Kastrokecyrillic","Kaverticalstrokecyrillic","Kcaron","Kcedilla","Kcircle","Kcommaaccent","Kdotbelow","Keharmenian","Kenarmenian","Khacyrillic","Kheicoptic","Khook","Kjecyrillic","Klinebelow","Kmonospace","Koppacyrillic","Koppagreek","Ksicyrillic","Ksmall","LJ","LL","Lacute","Lambda","Lcaron","Lcedilla","Lcircle","Lcircumflexbelow","Lcommaaccent","Ldot","Ldotaccent","Ldotbelow","Ldotbelowmacron","Liwnarmenian","Lj","Ljecyrillic","Llinebelow","Lmonospace","Lslash","Lslashsmall","Lsmall","MBsquare","Macron","Macronsmall","Macute","Mcircle","Mdotaccent","Mdotbelow","Menarmenian","Mmonospace","Msmall","Mturned","Mu","NJ","Nacute","Ncaron","Ncedilla","Ncircle","Ncircumflexbelow","Ncommaaccent","Ndotaccent","Ndotbelow","Nhookleft","Nineroman","Nj","Njecyrillic","Nlinebelow","Nmonospace","Nowarmenian","Nsmall","Ntilde","Ntildesmall","Nu","OE","OEsmall","Oacute","Oacutesmall","Obarredcyrillic","Obarreddieresiscyrillic","Obreve","Ocaron","Ocenteredtilde","Ocircle","Ocircumflex","Ocircumflexacute","Ocircumflexdotbelow","Ocircumflexgrave","Ocircumflexhookabove","Ocircumflexsmall","Ocircumflextilde","Ocyrillic","Odblacute","Odblgrave","Odieresis","Odieresiscyrillic","Odieresissmall","Odotbelow","Ogoneksmall","Ograve","Ogravesmall","Oharmenian","Ohm","Ohookabove","Ohorn","Ohornacute","Ohorndotbelow","Ohorngrave","Ohornhookabove","Ohorntilde","Ohungarumlaut","Oi","Oinvertedbreve","Omacron","Omacronacute","Omacrongrave","Omega","Omegacyrillic","Omegagreek","Omegaroundcyrillic","Omegatitlocyrillic","Omegatonos","Omicron","Omicrontonos","Omonospace","Oneroman","Oogonek","Oogonekmacron","Oopen","Oslash","Oslashacute","Oslashsmall","Osmall","Ostrokeacute","Otcyrillic","Otilde","Otildeacute","Otildedieresis","Otildesmall","P","Pacute","Pcircle","Pdotaccent","Pecyrillic","Peharmenian","Pemiddlehookcyrillic","Phi","Phook","Pi","Piwrarmenian","Pmonospace","Psi","Psicyrillic","Psmall","Q","Qcircle","Qmonospace","Qsmall","R","Raarmenian","Racute","Rcaron","Rcedilla","Rcircle","Rcommaaccent","Rdblgrave","Rdotaccent","Rdotbelow","Rdotbelowmacron","Reharmenian","Rfraktur","Rho","Ringsmall","Rinvertedbreve","Rlinebelow","Rmonospace","Rsmall","Rsmallinverted","Rsmallinvertedsuperior","S","SF010000","SF020000","SF030000","SF040000","SF050000","SF060000","SF070000","SF080000","SF090000","SF100000","SF110000","SF190000","SF200000","SF210000","SF220000","SF230000","SF240000","SF250000","SF260000","SF270000","SF280000","SF360000","SF370000","SF380000","SF390000","SF400000","SF410000","SF420000","SF430000","SF440000","SF450000","SF460000","SF470000","SF480000","SF490000","SF500000","SF510000","SF520000","SF530000","SF540000","Sacute","Sacutedotaccent","Sampigreek","Scaron","Scarondotaccent","Scaronsmall","Scedilla","Schwa","Schwacyrillic","Schwadieresiscyrillic","Scircle","Scircumflex","Scommaaccent","Sdotaccent","Sdotbelow","Sdotbelowdotaccent","Seharmenian","Sevenroman","Shaarmenian","Shacyrillic","Shchacyrillic","Sheicoptic","Shhacyrillic","Shimacoptic","Sigma","Sixroman","Smonospace","Softsigncyrillic","Ssmall","Stigmagreek","T","Tau","Tbar","Tcaron","Tcedilla","Tcircle","Tcircumflexbelow","Tcommaaccent","Tdotaccent","Tdotbelow","Tecyrillic","Tedescendercyrillic","Tenroman","Tetsecyrillic","Theta","Thook","Thorn","Thornsmall","Threeroman","Tildesmall","Tiwnarmenian","Tlinebelow","Tmonospace","Toarmenian","Tonefive","Tonesix","Tonetwo","Tretroflexhook","Tsecyrillic","Tshecyrillic","Tsmall","Twelveroman","Tworoman","Uacute","Uacutesmall","Ubreve","Ucaron","Ucircle","Ucircumflex","Ucircumflexbelow","Ucircumflexsmall","Ucyrillic","Udblacute","Udblgrave","Udieresis","Udieresisacute","Udieresisbelow","Udieresiscaron","Udieresiscyrillic","Udieresisgrave","Udieresismacron","Udieresissmall","Udotbelow","Ugrave","Ugravesmall","Uhookabove","Uhorn","Uhornacute","Uhorndotbelow","Uhorngrave","Uhornhookabove","Uhorntilde","Uhungarumlaut","Uhungarumlautcyrillic","Uinvertedbreve","Ukcyrillic","Umacron","Umacroncyrillic","Umacrondieresis","Umonospace","Uogonek","Upsilon","Upsilon1","Upsilonacutehooksymbolgreek","Upsilonafrican","Upsilondieresis","Upsilondieresishooksymbolgreek","Upsilonhooksymbol","Upsilontonos","Uring","Ushortcyrillic","Usmall","Ustraightcyrillic","Ustraightstrokecyrillic","Utilde","Utildeacute","Utildebelow","Vcircle","Vdotbelow","Vecyrillic","Vewarmenian","Vhook","Vmonospace","Voarmenian","Vsmall","Vtilde","W","Wacute","Wcircle","Wcircumflex","Wdieresis","Wdotaccent","Wdotbelow","Wgrave","Wmonospace","Wsmall","Xcircle","Xdieresis","Xdotaccent","Xeharmenian","Xi","Xmonospace","Xsmall","Yacute","Yacutesmall","Yatcyrillic","Ycircle","Ycircumflex","Ydieresis","Ydieresissmall","Ydotaccent","Ydotbelow","Yericyrillic","Yerudieresiscyrillic","Ygrave","Yhook","Yhookabove","Yiarmenian","Yicyrillic","Yiwnarmenian","Ymonospace","Ysmall","Ytilde","Yusbigcyrillic","Yusbigiotifiedcyrillic","Yuslittlecyrillic","Yuslittleiotifiedcyrillic","Zaarmenian","Zacute","Zcaron","Zcaronsmall","Zcircle","Zcircumflex","Zdot","Zdotaccent","Zdotbelow","Zecyrillic","Zedescendercyrillic","Zedieresiscyrillic","Zeta","Zhearmenian","Zhebrevecyrillic","Zhecyrillic","Zhedescendercyrillic","Zhedieresiscyrillic","Zlinebelow","Zmonospace","Zsmall","Zstroke","aabengali","aacute","aadeva","aagujarati","aagurmukhi","aamatragurmukhi","aarusquare","aavowelsignbengali","aavowelsigndeva","aavowelsigngujarati","abbreviationmarkarmenian","abbreviationsigndeva","abengali","abopomofo","abreve","abreveacute","abrevecyrillic","abrevedotbelow","abrevegrave","abrevehookabove","abrevetilde","acaron","acircle","acircumflex","acircumflexacute","acircumflexdotbelow","acircumflexgrave","acircumflexhookabove","acircumflextilde","acute","acutebelowcmb","acutecmb","acutecomb","acutedeva","acutelowmod","acutetonecmb","acyrillic","adblgrave","addakgurmukhi","adeva","adieresis","adieresiscyrillic","adieresismacron","adotbelow","adotmacron","ae","aeacute","aekorean","aemacron","afii00208","afii08941","afii10017","afii10018","afii10019","afii10020","afii10021","afii10022","afii10023","afii10024","afii10025","afii10026","afii10027","afii10028","afii10029","afii10030","afii10031","afii10032","afii10033","afii10034","afii10035","afii10036","afii10037","afii10038","afii10039","afii10040","afii10041","afii10042","afii10043","afii10044","afii10045","afii10046","afii10047","afii10048","afii10049","afii10050","afii10051","afii10052","afii10053","afii10054","afii10055","afii10056","afii10057","afii10058","afii10059","afii10060","afii10061","afii10062","afii10063","afii10064","afii10065","afii10066","afii10067","afii10068","afii10069","afii10070","afii10071","afii10072","afii10073","afii10074","afii10075","afii10076","afii10077","afii10078","afii10079","afii10080","afii10081","afii10082","afii10083","afii10084","afii10085","afii10086","afii10087","afii10088","afii10089","afii10090","afii10091","afii10092","afii10093","afii10094","afii10095","afii10096","afii10097","afii10098","afii10099","afii10100","afii10101","afii10102","afii10103","afii10104","afii10105","afii10106","afii10107","afii10108","afii10109","afii10110","afii10145","afii10146","afii10147","afii10148","afii10192","afii10193","afii10194","afii10195","afii10196","afii10831","afii10832","afii10846","afii299","afii300","afii301","afii57381","afii57388","afii57392","afii57393","afii57394","afii57395","afii57396","afii57397","afii57398","afii57399","afii57400","afii57401","afii57403","afii57407","afii57409","afii57410","afii57411","afii57412","afii57413","afii57414","afii57415","afii57416","afii57417","afii57418","afii57419","afii57420","afii57421","afii57422","afii57423","afii57424","afii57425","afii57426","afii57427","afii57428","afii57429","afii57430","afii57431","afii57432","afii57433","afii57434","afii57440","afii57441","afii57442","afii57443","afii57444","afii57445","afii57446","afii57448","afii57449","afii57450","afii57451","afii57452","afii57453","afii57454","afii57455","afii57456","afii57457","afii57458","afii57470","afii57505","afii57506","afii57507","afii57508","afii57509","afii57511","afii57512","afii57513","afii57514","afii57519","afii57534","afii57636","afii57645","afii57658","afii57664","afii57665","afii57666","afii57667","afii57668","afii57669","afii57670","afii57671","afii57672","afii57673","afii57674","afii57675","afii57676","afii57677","afii57678","afii57679","afii57680","afii57681","afii57682","afii57683","afii57684","afii57685","afii57686","afii57687","afii57688","afii57689","afii57690","afii57694","afii57695","afii57700","afii57705","afii57716","afii57717","afii57718","afii57723","afii57793","afii57794","afii57795","afii57796","afii57797","afii57798","afii57799","afii57800","afii57801","afii57802","afii57803","afii57804","afii57806","afii57807","afii57839","afii57841","afii57842","afii57929","afii61248","afii61289","afii61352","afii61573","afii61574","afii61575","afii61664","afii63167","afii64937","agrave","agujarati","agurmukhi","ahiragana","ahookabove","aibengali","aibopomofo","aideva","aiecyrillic","aigujarati","aigurmukhi","aimatragurmukhi","ainarabic","ainfinalarabic","aininitialarabic","ainmedialarabic","ainvertedbreve","aivowelsignbengali","aivowelsigndeva","aivowelsigngujarati","akatakana","akatakanahalfwidth","akorean","alef","alefarabic","alefdageshhebrew","aleffinalarabic","alefhamzaabovearabic","alefhamzaabovefinalarabic","alefhamzabelowarabic","alefhamzabelowfinalarabic","alefhebrew","aleflamedhebrew","alefmaddaabovearabic","alefmaddaabovefinalarabic","alefmaksuraarabic","alefmaksurafinalarabic","alefmaksurainitialarabic","alefmaksuramedialarabic","alefpatahhebrew","alefqamatshebrew","aleph","allequal","alpha","alphatonos","amacron","amonospace","ampersand","ampersandmonospace","ampersandsmall","amsquare","anbopomofo","angbopomofo","angbracketleft","angbracketright","angkhankhuthai","anglebracketleft","anglebracketleftvertical","anglebracketright","anglebracketrightvertical","angleleft","angleright","angstrom","anoteleia","anudattadeva","anusvarabengali","anusvaradeva","anusvaragujarati","aogonek","apaatosquare","aparen","apostrophearmenian","apostrophemod","apple","approaches","approxequal","approxequalorimage","approximatelyequal","araeaekorean","araeakorean","arc","arighthalfring","aring","aringacute","aringbelow","arrowboth","arrowdashdown","arrowdashleft","arrowdashright","arrowdashup","arrowdblboth","arrowdbldown","arrowdblleft","arrowdblright","arrowdblup","arrowdown","arrowdownleft","arrowdownright","arrowdownwhite","arrowheaddownmod","arrowheadleftmod","arrowheadrightmod","arrowheadupmod","arrowhorizex","arrowleft","arrowleftdbl","arrowleftdblstroke","arrowleftoverright","arrowleftwhite","arrowright","arrowrightdblstroke","arrowrightheavy","arrowrightoverleft","arrowrightwhite","arrowtableft","arrowtabright","arrowup","arrowupdn","arrowupdnbse","arrowupdownbase","arrowupleft","arrowupleftofdown","arrowupright","arrowupwhite","arrowvertex","asciicircum","asciicircummonospace","asciitilde","asciitildemonospace","ascript","ascriptturned","asmallhiragana","asmallkatakana","asmallkatakanahalfwidth","asterisk","asteriskaltonearabic","asteriskarabic","asteriskmath","asteriskmonospace","asterisksmall","asterism","asuperior","asymptoticallyequal","atilde","atmonospace","atsmall","aturned","aubengali","aubopomofo","audeva","augujarati","augurmukhi","aulengthmarkbengali","aumatragurmukhi","auvowelsignbengali","auvowelsigndeva","auvowelsigngujarati","avagrahadeva","aybarmenian","ayin","ayinaltonehebrew","ayinhebrew","babengali","backslash","backslashmonospace","badeva","bagujarati","bagurmukhi","bahiragana","bahtthai","bakatakana","bar","barmonospace","bbopomofo","bcircle","bdotaccent","bdotbelow","beamedsixteenthnotes","because","becyrillic","beharabic","behfinalarabic","behinitialarabic","behiragana","behmedialarabic","behmeeminitialarabic","behmeemisolatedarabic","behnoonfinalarabic","bekatakana","benarmenian","bet","beta","betasymbolgreek","betdagesh","betdageshhebrew","bethebrew","betrafehebrew","bhabengali","bhadeva","bhagujarati","bhagurmukhi","bhook","bihiragana","bikatakana","bilabialclick","bindigurmukhi","birusquare","blackcircle","blackdiamond","blackdownpointingtriangle","blackleftpointingpointer","blackleftpointingtriangle","blacklenticularbracketleft","blacklenticularbracketleftvertical","blacklenticularbracketright","blacklenticularbracketrightvertical","blacklowerlefttriangle","blacklowerrighttriangle","blackrectangle","blackrightpointingpointer","blackrightpointingtriangle","blacksmallsquare","blacksmilingface","blacksquare","blackstar","blackupperlefttriangle","blackupperrighttriangle","blackuppointingsmalltriangle","blackuppointingtriangle","blank","blinebelow","bmonospace","bobaimaithai","bohiragana","bokatakana","bparen","bqsquare","braceex","braceleft","braceleftbt","braceleftmid","braceleftmonospace","braceleftsmall","bracelefttp","braceleftvertical","braceright","bracerightbt","bracerightmid","bracerightmonospace","bracerightsmall","bracerighttp","bracerightvertical","bracketleft","bracketleftbt","bracketleftex","bracketleftmonospace","bracketlefttp","bracketright","bracketrightbt","bracketrightex","bracketrightmonospace","bracketrighttp","breve","brevebelowcmb","brevecmb","breveinvertedbelowcmb","breveinvertedcmb","breveinverteddoublecmb","bridgebelowcmb","bridgeinvertedbelowcmb","brokenbar","bstroke","bsuperior","btopbar","buhiragana","bukatakana","bullet","bulletinverse","bulletoperator","bullseye","caarmenian","cabengali","cacute","cadeva","cagujarati","cagurmukhi","calsquare","candrabindubengali","candrabinducmb","candrabindudeva","candrabindugujarati","capslock","careof","caron","caronbelowcmb","caroncmb","carriagereturn","cbopomofo","ccaron","ccedilla","ccedillaacute","ccircle","ccircumflex","ccurl","cdot","cdotaccent","cdsquare","cedilla","cedillacmb","cent","centigrade","centinferior","centmonospace","centoldstyle","centsuperior","chaarmenian","chabengali","chadeva","chagujarati","chagurmukhi","chbopomofo","cheabkhasiancyrillic","checkmark","checyrillic","chedescenderabkhasiancyrillic","chedescendercyrillic","chedieresiscyrillic","cheharmenian","chekhakassiancyrillic","cheverticalstrokecyrillic","chi","chieuchacirclekorean","chieuchaparenkorean","chieuchcirclekorean","chieuchkorean","chieuchparenkorean","chochangthai","chochanthai","chochingthai","chochoethai","chook","cieucacirclekorean","cieucaparenkorean","cieuccirclekorean","cieuckorean","cieucparenkorean","cieucuparenkorean","circle","circlecopyrt","circlemultiply","circleot","circleplus","circlepostalmark","circlewithlefthalfblack","circlewithrighthalfblack","circumflex","circumflexbelowcmb","circumflexcmb","clickalveolar","clickdental","clicklateral","clickretroflex","club","clubsuitblack","clubsuitwhite","cmcubedsquare","cmonospace","cmsquaredsquare","coarmenian","colon","colonmonetary","colonmonospace","colonsign","colonsmall","colontriangularhalfmod","colontriangularmod","comma","commaabovecmb","commaaboverightcmb","commaaccent","commaarabic","commaarmenian","commainferior","commamonospace","commareversedabovecmb","commareversedmod","commasmall","commasuperior","commaturnedabovecmb","commaturnedmod","compass","congruent","contourintegral","control","controlACK","controlBEL","controlBS","controlCAN","controlCR","controlDC1","controlDC2","controlDC3","controlDC4","controlDEL","controlDLE","controlEM","controlENQ","controlEOT","controlESC","controlETB","controlETX","controlFF","controlFS","controlGS","controlHT","controlLF","controlNAK","controlNULL","controlRS","controlSI","controlSO","controlSOT","controlSTX","controlSUB","controlSYN","controlUS","controlVT","copyright","copyrightsans","copyrightserif","cornerbracketleft","cornerbracketlefthalfwidth","cornerbracketleftvertical","cornerbracketright","cornerbracketrighthalfwidth","cornerbracketrightvertical","corporationsquare","cosquare","coverkgsquare","cparen","cruzeiro","cstretched","curlyand","curlyor","currency","cyrBreve","cyrFlex","cyrbreve","cyrflex","daarmenian","dabengali","dadarabic","dadeva","dadfinalarabic","dadinitialarabic","dadmedialarabic","dagesh","dageshhebrew","dagger","daggerdbl","dagujarati","dagurmukhi","dahiragana","dakatakana","dalarabic","dalet","daletdagesh","daletdageshhebrew","dalethebrew","dalfinalarabic","dammaarabic","dammalowarabic","dammatanaltonearabic","dammatanarabic","danda","dargahebrew","dargalefthebrew","dasiapneumatacyrilliccmb","dblGrave","dblanglebracketleft","dblanglebracketleftvertical","dblanglebracketright","dblanglebracketrightvertical","dblarchinvertedbelowcmb","dblarrowleft","dblarrowright","dbldanda","dblgrave","dblgravecmb","dblintegral","dbllowline","dbllowlinecmb","dbloverlinecmb","dblprimemod","dblverticalbar","dblverticallineabovecmb","dbopomofo","dbsquare","dcaron","dcedilla","dcircle","dcircumflexbelow","dcroat","ddabengali","ddadeva","ddagujarati","ddagurmukhi","ddalarabic","ddalfinalarabic","dddhadeva","ddhabengali","ddhadeva","ddhagujarati","ddhagurmukhi","ddotaccent","ddotbelow","decimalseparatorarabic","decimalseparatorpersian","decyrillic","degree","dehihebrew","dehiragana","deicoptic","dekatakana","deleteleft","deleteright","deltaturned","denominatorminusonenumeratorbengali","dezh","dhabengali","dhadeva","dhagujarati","dhagurmukhi","dhook","dialytikatonos","dialytikatonoscmb","diamond","diamondsuitwhite","dieresis","dieresisacute","dieresisbelowcmb","dieresiscmb","dieresisgrave","dieresistonos","dihiragana","dikatakana","dittomark","divide","divides","divisionslash","djecyrillic","dkshade","dlinebelow","dlsquare","dmacron","dmonospace","dnblock","dochadathai","dodekthai","dohiragana","dokatakana","dollar","dollarinferior","dollarmonospace","dollaroldstyle","dollarsmall","dollarsuperior","dong","dorusquare","dotaccent","dotaccentcmb","dotbelowcmb","dotbelowcomb","dotkatakana","dotlessi","dotlessj","dotlessjstrokehook","dotmath","dottedcircle","doubleyodpatah","doubleyodpatahhebrew","downtackbelowcmb","downtackmod","dparen","dsuperior","dtail","dtopbar","duhiragana","dukatakana","dz","dzaltone","dzcaron","dzcurl","dzeabkhasiancyrillic","dzecyrillic","dzhecyrillic","eacute","earth","ebengali","ebopomofo","ebreve","ecandradeva","ecandragujarati","ecandravowelsigndeva","ecandravowelsigngujarati","ecaron","ecedillabreve","echarmenian","echyiwnarmenian","ecircle","ecircumflex","ecircumflexacute","ecircumflexbelow","ecircumflexdotbelow","ecircumflexgrave","ecircumflexhookabove","ecircumflextilde","ecyrillic","edblgrave","edeva","edieresis","edot","edotaccent","edotbelow","eegurmukhi","eematragurmukhi","efcyrillic","egrave","egujarati","eharmenian","ehbopomofo","ehiragana","ehookabove","eibopomofo","eight","eightarabic","eightbengali","eightcircle","eightcircleinversesansserif","eightdeva","eighteencircle","eighteenparen","eighteenperiod","eightgujarati","eightgurmukhi","eighthackarabic","eighthangzhou","eighthnotebeamed","eightideographicparen","eightinferior","eightmonospace","eightoldstyle","eightparen","eightperiod","eightpersian","eightroman","eightsuperior","eightthai","einvertedbreve","eiotifiedcyrillic","ekatakana","ekatakanahalfwidth","ekonkargurmukhi","ekorean","elcyrillic","elevencircle","elevenparen","elevenperiod","elevenroman","ellipsis","ellipsisvertical","emacron","emacronacute","emacrongrave","emcyrillic","emdash","emdashvertical","emonospace","emphasismarkarmenian","emptyset","enbopomofo","encyrillic","endash","endashvertical","endescendercyrillic","eng","engbopomofo","enghecyrillic","enhookcyrillic","enspace","eogonek","eokorean","eopen","eopenclosed","eopenreversed","eopenreversedclosed","eopenreversedhook","eparen","epsilon","epsilontonos","equal","equalmonospace","equalsmall","equalsuperior","equivalence","erbopomofo","ercyrillic","ereversed","ereversedcyrillic","escyrillic","esdescendercyrillic","esh","eshcurl","eshortdeva","eshortvowelsigndeva","eshreversedloop","eshsquatreversed","esmallhiragana","esmallkatakana","esmallkatakanahalfwidth","estimated","esuperior","eta","etarmenian","etatonos","eth","etilde","etildebelow","etnahtafoukhhebrew","etnahtafoukhlefthebrew","etnahtahebrew","etnahtalefthebrew","eturned","eukorean","euro","evowelsignbengali","evowelsigndeva","evowelsigngujarati","exclam","exclamarmenian","exclamdbl","exclamdown","exclamdownsmall","exclammonospace","exclamsmall","existential","ezh","ezhcaron","ezhcurl","ezhreversed","ezhtail","fadeva","fagurmukhi","fahrenheit","fathaarabic","fathalowarabic","fathatanarabic","fbopomofo","fcircle","fdotaccent","feharabic","feharmenian","fehfinalarabic","fehinitialarabic","fehmedialarabic","feicoptic","female","ff","f_f","ffi","f_f_i","ffl","f_f_l","fi","f_i","fifteencircle","fifteenparen","fifteenperiod","figuredash","filledbox","filledrect","finalkaf","finalkafdagesh","finalkafdageshhebrew","finalkafhebrew","finalmem","finalmemhebrew","finalnun","finalnunhebrew","finalpe","finalpehebrew","finaltsadi","finaltsadihebrew","firsttonechinese","fisheye","fitacyrillic","five","fivearabic","fivebengali","fivecircle","fivecircleinversesansserif","fivedeva","fiveeighths","fivegujarati","fivegurmukhi","fivehackarabic","fivehangzhou","fiveideographicparen","fiveinferior","fivemonospace","fiveoldstyle","fiveparen","fiveperiod","fivepersian","fiveroman","fivesuperior","fivethai","fl","f_l","florin","fmonospace","fmsquare","fofanthai","fofathai","fongmanthai","forall","four","fourarabic","fourbengali","fourcircle","fourcircleinversesansserif","fourdeva","fourgujarati","fourgurmukhi","fourhackarabic","fourhangzhou","fourideographicparen","fourinferior","fourmonospace","fournumeratorbengali","fouroldstyle","fourparen","fourperiod","fourpersian","fourroman","foursuperior","fourteencircle","fourteenparen","fourteenperiod","fourthai","fourthtonechinese","fparen","fraction","franc","gabengali","gacute","gadeva","gafarabic","gaffinalarabic","gafinitialarabic","gafmedialarabic","gagujarati","gagurmukhi","gahiragana","gakatakana","gammalatinsmall","gammasuperior","gangiacoptic","gbopomofo","gbreve","gcaron","gcedilla","gcircle","gcircumflex","gcommaaccent","gdot","gdotaccent","gecyrillic","gehiragana","gekatakana","geometricallyequal","gereshaccenthebrew","gereshhebrew","gereshmuqdamhebrew","germandbls","gershayimaccenthebrew","gershayimhebrew","getamark","ghabengali","ghadarmenian","ghadeva","ghagujarati","ghagurmukhi","ghainarabic","ghainfinalarabic","ghaininitialarabic","ghainmedialarabic","ghemiddlehookcyrillic","ghestrokecyrillic","gheupturncyrillic","ghhadeva","ghhagurmukhi","ghook","ghzsquare","gihiragana","gikatakana","gimarmenian","gimel","gimeldagesh","gimeldageshhebrew","gimelhebrew","gjecyrillic","glottalinvertedstroke","glottalstop","glottalstopinverted","glottalstopmod","glottalstopreversed","glottalstopreversedmod","glottalstopreversedsuperior","glottalstopstroke","glottalstopstrokereversed","gmacron","gmonospace","gohiragana","gokatakana","gparen","gpasquare","gradient","grave","gravebelowcmb","gravecmb","gravecomb","gravedeva","gravelowmod","gravemonospace","gravetonecmb","greater","greaterequal","greaterequalorless","greatermonospace","greaterorequivalent","greaterorless","greateroverequal","greatersmall","gscript","gstroke","guhiragana","guillemotleft","guillemotright","guilsinglleft","guilsinglright","gukatakana","guramusquare","gysquare","haabkhasiancyrillic","haaltonearabic","habengali","hadescendercyrillic","hadeva","hagujarati","hagurmukhi","haharabic","hahfinalarabic","hahinitialarabic","hahiragana","hahmedialarabic","haitusquare","hakatakana","hakatakanahalfwidth","halantgurmukhi","hamzaarabic","hamzalowarabic","hangulfiller","hardsigncyrillic","harpoonleftbarbup","harpoonrightbarbup","hasquare","hatafpatah","hatafpatah16","hatafpatah23","hatafpatah2f","hatafpatahhebrew","hatafpatahnarrowhebrew","hatafpatahquarterhebrew","hatafpatahwidehebrew","hatafqamats","hatafqamats1b","hatafqamats28","hatafqamats34","hatafqamatshebrew","hatafqamatsnarrowhebrew","hatafqamatsquarterhebrew","hatafqamatswidehebrew","hatafsegol","hatafsegol17","hatafsegol24","hatafsegol30","hatafsegolhebrew","hatafsegolnarrowhebrew","hatafsegolquarterhebrew","hatafsegolwidehebrew","hbar","hbopomofo","hbrevebelow","hcedilla","hcircle","hcircumflex","hdieresis","hdotaccent","hdotbelow","he","heart","heartsuitblack","heartsuitwhite","hedagesh","hedageshhebrew","hehaltonearabic","heharabic","hehebrew","hehfinalaltonearabic","hehfinalalttwoarabic","hehfinalarabic","hehhamzaabovefinalarabic","hehhamzaaboveisolatedarabic","hehinitialaltonearabic","hehinitialarabic","hehiragana","hehmedialaltonearabic","hehmedialarabic","heiseierasquare","hekatakana","hekatakanahalfwidth","hekutaarusquare","henghook","herutusquare","het","hethebrew","hhook","hhooksuperior","hieuhacirclekorean","hieuhaparenkorean","hieuhcirclekorean","hieuhkorean","hieuhparenkorean","hihiragana","hikatakana","hikatakanahalfwidth","hiriq","hiriq14","hiriq21","hiriq2d","hiriqhebrew","hiriqnarrowhebrew","hiriqquarterhebrew","hiriqwidehebrew","hlinebelow","hmonospace","hoarmenian","hohipthai","hohiragana","hokatakana","hokatakanahalfwidth","holam","holam19","holam26","holam32","holamhebrew","holamnarrowhebrew","holamquarterhebrew","holamwidehebrew","honokhukthai","hookabovecomb","hookcmb","hookpalatalizedbelowcmb","hookretroflexbelowcmb","hoonsquare","horicoptic","horizontalbar","horncmb","hotsprings","house","hparen","hsuperior","hturned","huhiragana","huiitosquare","hukatakana","hukatakanahalfwidth","hungarumlaut","hungarumlautcmb","hv","hyphen","hypheninferior","hyphenmonospace","hyphensmall","hyphensuperior","hyphentwo","iacute","iacyrillic","ibengali","ibopomofo","ibreve","icaron","icircle","icircumflex","icyrillic","idblgrave","ideographearthcircle","ideographfirecircle","ideographicallianceparen","ideographiccallparen","ideographiccentrecircle","ideographicclose","ideographiccomma","ideographiccommaleft","ideographiccongratulationparen","ideographiccorrectcircle","ideographicearthparen","ideographicenterpriseparen","ideographicexcellentcircle","ideographicfestivalparen","ideographicfinancialcircle","ideographicfinancialparen","ideographicfireparen","ideographichaveparen","ideographichighcircle","ideographiciterationmark","ideographiclaborcircle","ideographiclaborparen","ideographicleftcircle","ideographiclowcircle","ideographicmedicinecircle","ideographicmetalparen","ideographicmoonparen","ideographicnameparen","ideographicperiod","ideographicprintcircle","ideographicreachparen","ideographicrepresentparen","ideographicresourceparen","ideographicrightcircle","ideographicsecretcircle","ideographicselfparen","ideographicsocietyparen","ideographicspace","ideographicspecialparen","ideographicstockparen","ideographicstudyparen","ideographicsunparen","ideographicsuperviseparen","ideographicwaterparen","ideographicwoodparen","ideographiczero","ideographmetalcircle","ideographmooncircle","ideographnamecircle","ideographsuncircle","ideographwatercircle","ideographwoodcircle","ideva","idieresis","idieresisacute","idieresiscyrillic","idotbelow","iebrevecyrillic","iecyrillic","ieungacirclekorean","ieungaparenkorean","ieungcirclekorean","ieungkorean","ieungparenkorean","igrave","igujarati","igurmukhi","ihiragana","ihookabove","iibengali","iicyrillic","iideva","iigujarati","iigurmukhi","iimatragurmukhi","iinvertedbreve","iishortcyrillic","iivowelsignbengali","iivowelsigndeva","iivowelsigngujarati","ij","ikatakana","ikatakanahalfwidth","ikorean","ilde","iluyhebrew","imacron","imacroncyrillic","imageorapproximatelyequal","imatragurmukhi","imonospace","increment","infinity","iniarmenian","integral","integralbottom","integralbt","integralex","integraltop","integraltp","intersection","intisquare","invbullet","invcircle","invsmileface","iocyrillic","iogonek","iota","iotadieresis","iotadieresistonos","iotalatin","iotatonos","iparen","irigurmukhi","ismallhiragana","ismallkatakana","ismallkatakanahalfwidth","issharbengali","istroke","isuperior","iterationhiragana","iterationkatakana","itilde","itildebelow","iubopomofo","iucyrillic","ivowelsignbengali","ivowelsigndeva","ivowelsigngujarati","izhitsacyrillic","izhitsadblgravecyrillic","jaarmenian","jabengali","jadeva","jagujarati","jagurmukhi","jbopomofo","jcaron","jcircle","jcircumflex","jcrossedtail","jdotlessstroke","jecyrillic","jeemarabic","jeemfinalarabic","jeeminitialarabic","jeemmedialarabic","jeharabic","jehfinalarabic","jhabengali","jhadeva","jhagujarati","jhagurmukhi","jheharmenian","jis","jmonospace","jparen","jsuperior","kabashkircyrillic","kabengali","kacute","kacyrillic","kadescendercyrillic","kadeva","kaf","kafarabic","kafdagesh","kafdageshhebrew","kaffinalarabic","kafhebrew","kafinitialarabic","kafmedialarabic","kafrafehebrew","kagujarati","kagurmukhi","kahiragana","kahookcyrillic","kakatakana","kakatakanahalfwidth","kappa","kappasymbolgreek","kapyeounmieumkorean","kapyeounphieuphkorean","kapyeounpieupkorean","kapyeounssangpieupkorean","karoriisquare","kashidaautoarabic","kashidaautonosidebearingarabic","kasmallkatakana","kasquare","kasraarabic","kasratanarabic","kastrokecyrillic","katahiraprolongmarkhalfwidth","kaverticalstrokecyrillic","kbopomofo","kcalsquare","kcaron","kcedilla","kcircle","kcommaaccent","kdotbelow","keharmenian","kehiragana","kekatakana","kekatakanahalfwidth","kenarmenian","kesmallkatakana","kgreenlandic","khabengali","khacyrillic","khadeva","khagujarati","khagurmukhi","khaharabic","khahfinalarabic","khahinitialarabic","khahmedialarabic","kheicoptic","khhadeva","khhagurmukhi","khieukhacirclekorean","khieukhaparenkorean","khieukhcirclekorean","khieukhkorean","khieukhparenkorean","khokhaithai","khokhonthai","khokhuatthai","khokhwaithai","khomutthai","khook","khorakhangthai","khzsquare","kihiragana","kikatakana","kikatakanahalfwidth","kiroguramusquare","kiromeetorusquare","kirosquare","kiyeokacirclekorean","kiyeokaparenkorean","kiyeokcirclekorean","kiyeokkorean","kiyeokparenkorean","kiyeoksioskorean","kjecyrillic","klinebelow","klsquare","kmcubedsquare","kmonospace","kmsquaredsquare","kohiragana","kohmsquare","kokaithai","kokatakana","kokatakanahalfwidth","kooposquare","koppacyrillic","koreanstandardsymbol","koroniscmb","kparen","kpasquare","ksicyrillic","ktsquare","kturned","kuhiragana","kukatakana","kukatakanahalfwidth","kvsquare","kwsquare","labengali","lacute","ladeva","lagujarati","lagurmukhi","lakkhangyaothai","lamaleffinalarabic","lamalefhamzaabovefinalarabic","lamalefhamzaaboveisolatedarabic","lamalefhamzabelowfinalarabic","lamalefhamzabelowisolatedarabic","lamalefisolatedarabic","lamalefmaddaabovefinalarabic","lamalefmaddaaboveisolatedarabic","lamarabic","lambda","lambdastroke","lamed","lameddagesh","lameddageshhebrew","lamedhebrew","lamfinalarabic","lamhahinitialarabic","laminitialarabic","lamjeeminitialarabic","lamkhahinitialarabic","lamlamhehisolatedarabic","lammedialarabic","lammeemhahinitialarabic","lammeeminitialarabic","largecircle","lbar","lbelt","lbopomofo","lcaron","lcedilla","lcircle","lcircumflexbelow","lcommaaccent","ldot","ldotaccent","ldotbelow","ldotbelowmacron","leftangleabovecmb","lefttackbelowcmb","less","lessequal","lessequalorgreater","lessmonospace","lessorequivalent","lessorgreater","lessoverequal","lesssmall","lezh","lfblock","lhookretroflex","lira","liwnarmenian","lj","ljecyrillic","ll","lladeva","llagujarati","llinebelow","llladeva","llvocalicbengali","llvocalicdeva","llvocalicvowelsignbengali","llvocalicvowelsigndeva","lmiddletilde","lmonospace","lmsquare","lochulathai","logicaland","logicalnot","logicalnotreversed","logicalor","lolingthai","longs","lowlinecenterline","lowlinecmb","lowlinedashed","lozenge","lparen","lslash","lsquare","lsuperior","ltshade","luthai","lvocalicbengali","lvocalicdeva","lvocalicvowelsignbengali","lvocalicvowelsigndeva","lxsquare","mabengali","macron","macronbelowcmb","macroncmb","macronlowmod","macronmonospace","macute","madeva","magujarati","magurmukhi","mahapakhhebrew","mahapakhlefthebrew","mahiragana","maichattawalowleftthai","maichattawalowrightthai","maichattawathai","maichattawaupperleftthai","maieklowleftthai","maieklowrightthai","maiekthai","maiekupperleftthai","maihanakatleftthai","maihanakatthai","maitaikhuleftthai","maitaikhuthai","maitholowleftthai","maitholowrightthai","maithothai","maithoupperleftthai","maitrilowleftthai","maitrilowrightthai","maitrithai","maitriupperleftthai","maiyamokthai","makatakana","makatakanahalfwidth","male","mansyonsquare","maqafhebrew","mars","masoracirclehebrew","masquare","mbopomofo","mbsquare","mcircle","mcubedsquare","mdotaccent","mdotbelow","meemarabic","meemfinalarabic","meeminitialarabic","meemmedialarabic","meemmeeminitialarabic","meemmeemisolatedarabic","meetorusquare","mehiragana","meizierasquare","mekatakana","mekatakanahalfwidth","memdagesh","memdageshhebrew","memhebrew","menarmenian","merkhahebrew","merkhakefulahebrew","merkhakefulalefthebrew","merkhalefthebrew","mhook","mhzsquare","middledotkatakanahalfwidth","middot","mieumacirclekorean","mieumaparenkorean","mieumcirclekorean","mieumkorean","mieumpansioskorean","mieumparenkorean","mieumpieupkorean","mieumsioskorean","mihiragana","mikatakana","mikatakanahalfwidth","minus","minusbelowcmb","minuscircle","minusmod","minusplus","minute","miribaarusquare","mirisquare","mlonglegturned","mlsquare","mmcubedsquare","mmonospace","mmsquaredsquare","mohiragana","mohmsquare","mokatakana","mokatakanahalfwidth","molsquare","momathai","moverssquare","moverssquaredsquare","mparen","mpasquare","mssquare","msuperior","mturned","mu","mu1","muasquare","muchgreater","muchless","mufsquare","mugreek","mugsquare","muhiragana","mukatakana","mukatakanahalfwidth","mulsquare","multiply","mumsquare","munahhebrew","munahlefthebrew","musicalnote","musicalnotedbl","musicflatsign","musicsharpsign","mussquare","muvsquare","muwsquare","mvmegasquare","mvsquare","mwmegasquare","mwsquare","nabengali","nabla","nacute","nadeva","nagujarati","nagurmukhi","nahiragana","nakatakana","nakatakanahalfwidth","napostrophe","nasquare","nbopomofo","nbspace","ncaron","ncedilla","ncircle","ncircumflexbelow","ncommaaccent","ndotaccent","ndotbelow","nehiragana","nekatakana","nekatakanahalfwidth","newsheqelsign","nfsquare","ngabengali","ngadeva","ngagujarati","ngagurmukhi","ngonguthai","nhiragana","nhookleft","nhookretroflex","nieunacirclekorean","nieunaparenkorean","nieuncieuckorean","nieuncirclekorean","nieunhieuhkorean","nieunkorean","nieunpansioskorean","nieunparenkorean","nieunsioskorean","nieuntikeutkorean","nihiragana","nikatakana","nikatakanahalfwidth","nikhahitleftthai","nikhahitthai","nine","ninearabic","ninebengali","ninecircle","ninecircleinversesansserif","ninedeva","ninegujarati","ninegurmukhi","ninehackarabic","ninehangzhou","nineideographicparen","nineinferior","ninemonospace","nineoldstyle","nineparen","nineperiod","ninepersian","nineroman","ninesuperior","nineteencircle","nineteenparen","nineteenperiod","ninethai","nj","njecyrillic","nkatakana","nkatakanahalfwidth","nlegrightlong","nlinebelow","nmonospace","nmsquare","nnabengali","nnadeva","nnagujarati","nnagurmukhi","nnnadeva","nohiragana","nokatakana","nokatakanahalfwidth","nonbreakingspace","nonenthai","nonuthai","noonarabic","noonfinalarabic","noonghunnaarabic","noonghunnafinalarabic","nooninitialarabic","noonjeeminitialarabic","noonjeemisolatedarabic","noonmedialarabic","noonmeeminitialarabic","noonmeemisolatedarabic","noonnoonfinalarabic","notcontains","notelement","notelementof","notequal","notgreater","notgreaternorequal","notgreaternorless","notidentical","notless","notlessnorequal","notparallel","notprecedes","notsubset","notsucceeds","notsuperset","nowarmenian","nparen","nssquare","nsuperior","ntilde","nu","nuhiragana","nukatakana","nukatakanahalfwidth","nuktabengali","nuktadeva","nuktagujarati","nuktagurmukhi","numbersign","numbersignmonospace","numbersignsmall","numeralsigngreek","numeralsignlowergreek","numero","nun","nundagesh","nundageshhebrew","nunhebrew","nvsquare","nwsquare","nyabengali","nyadeva","nyagujarati","nyagurmukhi","oacute","oangthai","obarred","obarredcyrillic","obarreddieresiscyrillic","obengali","obopomofo","obreve","ocandradeva","ocandragujarati","ocandravowelsigndeva","ocandravowelsigngujarati","ocaron","ocircle","ocircumflex","ocircumflexacute","ocircumflexdotbelow","ocircumflexgrave","ocircumflexhookabove","ocircumflextilde","ocyrillic","odblacute","odblgrave","odeva","odieresis","odieresiscyrillic","odotbelow","oe","oekorean","ogonek","ogonekcmb","ograve","ogujarati","oharmenian","ohiragana","ohookabove","ohorn","ohornacute","ohorndotbelow","ohorngrave","ohornhookabove","ohorntilde","ohungarumlaut","oi","oinvertedbreve","okatakana","okatakanahalfwidth","okorean","olehebrew","omacron","omacronacute","omacrongrave","omdeva","omega","omega1","omegacyrillic","omegalatinclosed","omegaroundcyrillic","omegatitlocyrillic","omegatonos","omgujarati","omicron","omicrontonos","omonospace","one","onearabic","onebengali","onecircle","onecircleinversesansserif","onedeva","onedotenleader","oneeighth","onefitted","onegujarati","onegurmukhi","onehackarabic","onehalf","onehangzhou","oneideographicparen","oneinferior","onemonospace","onenumeratorbengali","oneoldstyle","oneparen","oneperiod","onepersian","onequarter","oneroman","onesuperior","onethai","onethird","oogonek","oogonekmacron","oogurmukhi","oomatragurmukhi","oopen","oparen","openbullet","option","ordfeminine","ordmasculine","orthogonal","oshortdeva","oshortvowelsigndeva","oslash","oslashacute","osmallhiragana","osmallkatakana","osmallkatakanahalfwidth","ostrokeacute","osuperior","otcyrillic","otilde","otildeacute","otildedieresis","oubopomofo","overline","overlinecenterline","overlinecmb","overlinedashed","overlinedblwavy","overlinewavy","overscore","ovowelsignbengali","ovowelsigndeva","ovowelsigngujarati","paampssquare","paasentosquare","pabengali","pacute","padeva","pagedown","pageup","pagujarati","pagurmukhi","pahiragana","paiyannoithai","pakatakana","palatalizationcyrilliccmb","palochkacyrillic","pansioskorean","paragraph","parallel","parenleft","parenleftaltonearabic","parenleftbt","parenleftex","parenleftinferior","parenleftmonospace","parenleftsmall","parenleftsuperior","parenlefttp","parenleftvertical","parenright","parenrightaltonearabic","parenrightbt","parenrightex","parenrightinferior","parenrightmonospace","parenrightsmall","parenrightsuperior","parenrighttp","parenrightvertical","partialdiff","paseqhebrew","pashtahebrew","pasquare","patah","patah11","patah1d","patah2a","patahhebrew","patahnarrowhebrew","patahquarterhebrew","patahwidehebrew","pazerhebrew","pbopomofo","pcircle","pdotaccent","pe","pecyrillic","pedagesh","pedageshhebrew","peezisquare","pefinaldageshhebrew","peharabic","peharmenian","pehebrew","pehfinalarabic","pehinitialarabic","pehiragana","pehmedialarabic","pekatakana","pemiddlehookcyrillic","perafehebrew","percent","percentarabic","percentmonospace","percentsmall","period","periodarmenian","periodcentered","periodhalfwidth","periodinferior","periodmonospace","periodsmall","periodsuperior","perispomenigreekcmb","perpendicular","perthousand","peseta","pfsquare","phabengali","phadeva","phagujarati","phagurmukhi","phi","phi1","phieuphacirclekorean","phieuphaparenkorean","phieuphcirclekorean","phieuphkorean","phieuphparenkorean","philatin","phinthuthai","phisymbolgreek","phook","phophanthai","phophungthai","phosamphaothai","pieupacirclekorean","pieupaparenkorean","pieupcieuckorean","pieupcirclekorean","pieupkiyeokkorean","pieupkorean","pieupparenkorean","pieupsioskiyeokkorean","pieupsioskorean","pieupsiostikeutkorean","pieupthieuthkorean","pieuptikeutkorean","pihiragana","pikatakana","pisymbolgreek","piwrarmenian","planckover2pi","planckover2pi1","plus","plusbelowcmb","pluscircle","plusminus","plusmod","plusmonospace","plussmall","plussuperior","pmonospace","pmsquare","pohiragana","pointingindexdownwhite","pointingindexleftwhite","pointingindexrightwhite","pointingindexupwhite","pokatakana","poplathai","postalmark","postalmarkface","pparen","precedes","prescription","primemod","primereversed","product","projective","prolongedkana","propellor","propersubset","propersuperset","proportion","proportional","psi","psicyrillic","psilipneumatacyrilliccmb","pssquare","puhiragana","pukatakana","pvsquare","pwsquare","qadeva","qadmahebrew","qafarabic","qaffinalarabic","qafinitialarabic","qafmedialarabic","qamats","qamats10","qamats1a","qamats1c","qamats27","qamats29","qamats33","qamatsde","qamatshebrew","qamatsnarrowhebrew","qamatsqatanhebrew","qamatsqatannarrowhebrew","qamatsqatanquarterhebrew","qamatsqatanwidehebrew","qamatsquarterhebrew","qamatswidehebrew","qarneyparahebrew","qbopomofo","qcircle","qhook","qmonospace","qof","qofdagesh","qofdageshhebrew","qofhebrew","qparen","quarternote","qubuts","qubuts18","qubuts25","qubuts31","qubutshebrew","qubutsnarrowhebrew","qubutsquarterhebrew","qubutswidehebrew","question","questionarabic","questionarmenian","questiondown","questiondownsmall","questiongreek","questionmonospace","questionsmall","quotedbl","quotedblbase","quotedblleft","quotedblmonospace","quotedblprime","quotedblprimereversed","quotedblright","quoteleft","quoteleftreversed","quotereversed","quoteright","quoterightn","quotesinglbase","quotesingle","quotesinglemonospace","raarmenian","rabengali","racute","radeva","radical","radicalex","radoverssquare","radoverssquaredsquare","radsquare","rafe","rafehebrew","ragujarati","ragurmukhi","rahiragana","rakatakana","rakatakanahalfwidth","ralowerdiagonalbengali","ramiddlediagonalbengali","ramshorn","rbopomofo","rcaron","rcedilla","rcircle","rcommaaccent","rdblgrave","rdotaccent","rdotbelow","rdotbelowmacron","referencemark","reflexsubset","reflexsuperset","registered","registersans","registerserif","reharabic","reharmenian","rehfinalarabic","rehiragana","rekatakana","rekatakanahalfwidth","resh","reshdageshhebrew","reshhebrew","reversedtilde","reviahebrew","reviamugrashhebrew","revlogicalnot","rfishhook","rfishhookreversed","rhabengali","rhadeva","rho","rhook","rhookturned","rhookturnedsuperior","rhosymbolgreek","rhotichookmod","rieulacirclekorean","rieulaparenkorean","rieulcirclekorean","rieulhieuhkorean","rieulkiyeokkorean","rieulkiyeoksioskorean","rieulkorean","rieulmieumkorean","rieulpansioskorean","rieulparenkorean","rieulphieuphkorean","rieulpieupkorean","rieulpieupsioskorean","rieulsioskorean","rieulthieuthkorean","rieultikeutkorean","rieulyeorinhieuhkorean","rightangle","righttackbelowcmb","righttriangle","rihiragana","rikatakana","rikatakanahalfwidth","ring","ringbelowcmb","ringcmb","ringhalfleft","ringhalfleftarmenian","ringhalfleftbelowcmb","ringhalfleftcentered","ringhalfright","ringhalfrightbelowcmb","ringhalfrightcentered","rinvertedbreve","rittorusquare","rlinebelow","rlongleg","rlonglegturned","rmonospace","rohiragana","rokatakana","rokatakanahalfwidth","roruathai","rparen","rrabengali","rradeva","rragurmukhi","rreharabic","rrehfinalarabic","rrvocalicbengali","rrvocalicdeva","rrvocalicgujarati","rrvocalicvowelsignbengali","rrvocalicvowelsigndeva","rrvocalicvowelsigngujarati","rsuperior","rtblock","rturned","rturnedsuperior","ruhiragana","rukatakana","rukatakanahalfwidth","rupeemarkbengali","rupeesignbengali","rupiah","ruthai","rvocalicbengali","rvocalicdeva","rvocalicgujarati","rvocalicvowelsignbengali","rvocalicvowelsigndeva","rvocalicvowelsigngujarati","sabengali","sacute","sacutedotaccent","sadarabic","sadeva","sadfinalarabic","sadinitialarabic","sadmedialarabic","sagujarati","sagurmukhi","sahiragana","sakatakana","sakatakanahalfwidth","sallallahoualayhewasallamarabic","samekh","samekhdagesh","samekhdageshhebrew","samekhhebrew","saraaathai","saraaethai","saraaimaimalaithai","saraaimaimuanthai","saraamthai","saraathai","saraethai","saraiileftthai","saraiithai","saraileftthai","saraithai","saraothai","saraueeleftthai","saraueethai","saraueleftthai","sarauethai","sarauthai","sarauuthai","sbopomofo","scaron","scarondotaccent","scedilla","schwa","schwacyrillic","schwadieresiscyrillic","schwahook","scircle","scircumflex","scommaaccent","sdotaccent","sdotbelow","sdotbelowdotaccent","seagullbelowcmb","secondtonechinese","section","seenarabic","seenfinalarabic","seeninitialarabic","seenmedialarabic","segol","segol13","segol1f","segol2c","segolhebrew","segolnarrowhebrew","segolquarterhebrew","segoltahebrew","segolwidehebrew","seharmenian","sehiragana","sekatakana","sekatakanahalfwidth","semicolon","semicolonarabic","semicolonmonospace","semicolonsmall","semivoicedmarkkana","semivoicedmarkkanahalfwidth","sentisquare","sentosquare","seven","sevenarabic","sevenbengali","sevencircle","sevencircleinversesansserif","sevendeva","seveneighths","sevengujarati","sevengurmukhi","sevenhackarabic","sevenhangzhou","sevenideographicparen","seveninferior","sevenmonospace","sevenoldstyle","sevenparen","sevenperiod","sevenpersian","sevenroman","sevensuperior","seventeencircle","seventeenparen","seventeenperiod","seventhai","sfthyphen","shaarmenian","shabengali","shacyrillic","shaddaarabic","shaddadammaarabic","shaddadammatanarabic","shaddafathaarabic","shaddakasraarabic","shaddakasratanarabic","shade","shadedark","shadelight","shademedium","shadeva","shagujarati","shagurmukhi","shalshelethebrew","shbopomofo","shchacyrillic","sheenarabic","sheenfinalarabic","sheeninitialarabic","sheenmedialarabic","sheicoptic","sheqel","sheqelhebrew","sheva","sheva115","sheva15","sheva22","sheva2e","shevahebrew","shevanarrowhebrew","shevaquarterhebrew","shevawidehebrew","shhacyrillic","shimacoptic","shin","shindagesh","shindageshhebrew","shindageshshindot","shindageshshindothebrew","shindageshsindot","shindageshsindothebrew","shindothebrew","shinhebrew","shinshindot","shinshindothebrew","shinsindot","shinsindothebrew","shook","sigma","sigma1","sigmafinal","sigmalunatesymbolgreek","sihiragana","sikatakana","sikatakanahalfwidth","siluqhebrew","siluqlefthebrew","similar","sindothebrew","siosacirclekorean","siosaparenkorean","sioscieuckorean","sioscirclekorean","sioskiyeokkorean","sioskorean","siosnieunkorean","siosparenkorean","siospieupkorean","siostikeutkorean","six","sixarabic","sixbengali","sixcircle","sixcircleinversesansserif","sixdeva","sixgujarati","sixgurmukhi","sixhackarabic","sixhangzhou","sixideographicparen","sixinferior","sixmonospace","sixoldstyle","sixparen","sixperiod","sixpersian","sixroman","sixsuperior","sixteencircle","sixteencurrencydenominatorbengali","sixteenparen","sixteenperiod","sixthai","slash","slashmonospace","slong","slongdotaccent","smileface","smonospace","sofpasuqhebrew","softhyphen","softsigncyrillic","sohiragana","sokatakana","sokatakanahalfwidth","soliduslongoverlaycmb","solidusshortoverlaycmb","sorusithai","sosalathai","sosothai","sosuathai","spacehackarabic","spade","spadesuitblack","spadesuitwhite","sparen","squarebelowcmb","squarecc","squarecm","squarediagonalcrosshatchfill","squarehorizontalfill","squarekg","squarekm","squarekmcapital","squareln","squarelog","squaremg","squaremil","squaremm","squaremsquared","squareorthogonalcrosshatchfill","squareupperlefttolowerrightfill","squareupperrighttolowerleftfill","squareverticalfill","squarewhitewithsmallblack","srsquare","ssabengali","ssadeva","ssagujarati","ssangcieuckorean","ssanghieuhkorean","ssangieungkorean","ssangkiyeokkorean","ssangnieunkorean","ssangpieupkorean","ssangsioskorean","ssangtikeutkorean","ssuperior","sterling","sterlingmonospace","strokelongoverlaycmb","strokeshortoverlaycmb","subset","subsetnotequal","subsetorequal","succeeds","suchthat","suhiragana","sukatakana","sukatakanahalfwidth","sukunarabic","summation","sun","superset","supersetnotequal","supersetorequal","svsquare","syouwaerasquare","tabengali","tackdown","tackleft","tadeva","tagujarati","tagurmukhi","taharabic","tahfinalarabic","tahinitialarabic","tahiragana","tahmedialarabic","taisyouerasquare","takatakana","takatakanahalfwidth","tatweelarabic","tau","tav","tavdages","tavdagesh","tavdageshhebrew","tavhebrew","tbar","tbopomofo","tcaron","tccurl","tcedilla","tcheharabic","tchehfinalarabic","tchehinitialarabic","tchehmedialarabic","tcircle","tcircumflexbelow","tcommaaccent","tdieresis","tdotaccent","tdotbelow","tecyrillic","tedescendercyrillic","teharabic","tehfinalarabic","tehhahinitialarabic","tehhahisolatedarabic","tehinitialarabic","tehiragana","tehjeeminitialarabic","tehjeemisolatedarabic","tehmarbutaarabic","tehmarbutafinalarabic","tehmedialarabic","tehmeeminitialarabic","tehmeemisolatedarabic","tehnoonfinalarabic","tekatakana","tekatakanahalfwidth","telephone","telephoneblack","telishagedolahebrew","telishaqetanahebrew","tencircle","tenideographicparen","tenparen","tenperiod","tenroman","tesh","tet","tetdagesh","tetdageshhebrew","tethebrew","tetsecyrillic","tevirhebrew","tevirlefthebrew","thabengali","thadeva","thagujarati","thagurmukhi","thalarabic","thalfinalarabic","thanthakhatlowleftthai","thanthakhatlowrightthai","thanthakhatthai","thanthakhatupperleftthai","theharabic","thehfinalarabic","thehinitialarabic","thehmedialarabic","thereexists","therefore","theta","theta1","thetasymbolgreek","thieuthacirclekorean","thieuthaparenkorean","thieuthcirclekorean","thieuthkorean","thieuthparenkorean","thirteencircle","thirteenparen","thirteenperiod","thonangmonthothai","thook","thophuthaothai","thorn","thothahanthai","thothanthai","thothongthai","thothungthai","thousandcyrillic","thousandsseparatorarabic","thousandsseparatorpersian","three","threearabic","threebengali","threecircle","threecircleinversesansserif","threedeva","threeeighths","threegujarati","threegurmukhi","threehackarabic","threehangzhou","threeideographicparen","threeinferior","threemonospace","threenumeratorbengali","threeoldstyle","threeparen","threeperiod","threepersian","threequarters","threequartersemdash","threeroman","threesuperior","threethai","thzsquare","tihiragana","tikatakana","tikatakanahalfwidth","tikeutacirclekorean","tikeutaparenkorean","tikeutcirclekorean","tikeutkorean","tikeutparenkorean","tilde","tildebelowcmb","tildecmb","tildecomb","tildedoublecmb","tildeoperator","tildeoverlaycmb","tildeverticalcmb","timescircle","tipehahebrew","tipehalefthebrew","tippigurmukhi","titlocyrilliccmb","tiwnarmenian","tlinebelow","tmonospace","toarmenian","tohiragana","tokatakana","tokatakanahalfwidth","tonebarextrahighmod","tonebarextralowmod","tonebarhighmod","tonebarlowmod","tonebarmidmod","tonefive","tonesix","tonetwo","tonos","tonsquare","topatakthai","tortoiseshellbracketleft","tortoiseshellbracketleftsmall","tortoiseshellbracketleftvertical","tortoiseshellbracketright","tortoiseshellbracketrightsmall","tortoiseshellbracketrightvertical","totaothai","tpalatalhook","tparen","trademark","trademarksans","trademarkserif","tretroflexhook","triagdn","triaglf","triagrt","triagup","ts","tsadi","tsadidagesh","tsadidageshhebrew","tsadihebrew","tsecyrillic","tsere","tsere12","tsere1e","tsere2b","tserehebrew","tserenarrowhebrew","tserequarterhebrew","tserewidehebrew","tshecyrillic","tsuperior","ttabengali","ttadeva","ttagujarati","ttagurmukhi","tteharabic","ttehfinalarabic","ttehinitialarabic","ttehmedialarabic","tthabengali","tthadeva","tthagujarati","tthagurmukhi","tturned","tuhiragana","tukatakana","tukatakanahalfwidth","tusmallhiragana","tusmallkatakana","tusmallkatakanahalfwidth","twelvecircle","twelveparen","twelveperiod","twelveroman","twentycircle","twentyhangzhou","twentyparen","twentyperiod","two","twoarabic","twobengali","twocircle","twocircleinversesansserif","twodeva","twodotenleader","twodotleader","twodotleadervertical","twogujarati","twogurmukhi","twohackarabic","twohangzhou","twoideographicparen","twoinferior","twomonospace","twonumeratorbengali","twooldstyle","twoparen","twoperiod","twopersian","tworoman","twostroke","twosuperior","twothai","twothirds","uacute","ubar","ubengali","ubopomofo","ubreve","ucaron","ucircle","ucircumflex","ucircumflexbelow","ucyrillic","udattadeva","udblacute","udblgrave","udeva","udieresis","udieresisacute","udieresisbelow","udieresiscaron","udieresiscyrillic","udieresisgrave","udieresismacron","udotbelow","ugrave","ugujarati","ugurmukhi","uhiragana","uhookabove","uhorn","uhornacute","uhorndotbelow","uhorngrave","uhornhookabove","uhorntilde","uhungarumlaut","uhungarumlautcyrillic","uinvertedbreve","ukatakana","ukatakanahalfwidth","ukcyrillic","ukorean","umacron","umacroncyrillic","umacrondieresis","umatragurmukhi","umonospace","underscore","underscoredbl","underscoremonospace","underscorevertical","underscorewavy","union","universal","uogonek","uparen","upblock","upperdothebrew","upsilon","upsilondieresis","upsilondieresistonos","upsilonlatin","upsilontonos","uptackbelowcmb","uptackmod","uragurmukhi","uring","ushortcyrillic","usmallhiragana","usmallkatakana","usmallkatakanahalfwidth","ustraightcyrillic","ustraightstrokecyrillic","utilde","utildeacute","utildebelow","uubengali","uudeva","uugujarati","uugurmukhi","uumatragurmukhi","uuvowelsignbengali","uuvowelsigndeva","uuvowelsigngujarati","uvowelsignbengali","uvowelsigndeva","uvowelsigngujarati","vadeva","vagujarati","vagurmukhi","vakatakana","vav","vavdagesh","vavdagesh65","vavdageshhebrew","vavhebrew","vavholam","vavholamhebrew","vavvavhebrew","vavyodhebrew","vcircle","vdotbelow","vecyrillic","veharabic","vehfinalarabic","vehinitialarabic","vehmedialarabic","vekatakana","venus","verticalbar","verticallineabovecmb","verticallinebelowcmb","verticallinelowmod","verticallinemod","vewarmenian","vhook","vikatakana","viramabengali","viramadeva","viramagujarati","visargabengali","visargadeva","visargagujarati","vmonospace","voarmenian","voicediterationhiragana","voicediterationkatakana","voicedmarkkana","voicedmarkkanahalfwidth","vokatakana","vparen","vtilde","vturned","vuhiragana","vukatakana","wacute","waekorean","wahiragana","wakatakana","wakatakanahalfwidth","wakorean","wasmallhiragana","wasmallkatakana","wattosquare","wavedash","wavyunderscorevertical","wawarabic","wawfinalarabic","wawhamzaabovearabic","wawhamzaabovefinalarabic","wbsquare","wcircle","wcircumflex","wdieresis","wdotaccent","wdotbelow","wehiragana","weierstrass","wekatakana","wekorean","weokorean","wgrave","whitebullet","whitecircle","whitecircleinverse","whitecornerbracketleft","whitecornerbracketleftvertical","whitecornerbracketright","whitecornerbracketrightvertical","whitediamond","whitediamondcontainingblacksmalldiamond","whitedownpointingsmalltriangle","whitedownpointingtriangle","whiteleftpointingsmalltriangle","whiteleftpointingtriangle","whitelenticularbracketleft","whitelenticularbracketright","whiterightpointingsmalltriangle","whiterightpointingtriangle","whitesmallsquare","whitesmilingface","whitesquare","whitestar","whitetelephone","whitetortoiseshellbracketleft","whitetortoiseshellbracketright","whiteuppointingsmalltriangle","whiteuppointingtriangle","wihiragana","wikatakana","wikorean","wmonospace","wohiragana","wokatakana","wokatakanahalfwidth","won","wonmonospace","wowaenthai","wparen","wring","wsuperior","wturned","wynn","xabovecmb","xbopomofo","xcircle","xdieresis","xdotaccent","xeharmenian","xmonospace","xparen","xsuperior","yaadosquare","yabengali","yacute","yadeva","yaekorean","yagujarati","yagurmukhi","yahiragana","yakatakana","yakatakanahalfwidth","yakorean","yamakkanthai","yasmallhiragana","yasmallkatakana","yasmallkatakanahalfwidth","yatcyrillic","ycircle","ycircumflex","ydieresis","ydotaccent","ydotbelow","yeharabic","yehbarreearabic","yehbarreefinalarabic","yehfinalarabic","yehhamzaabovearabic","yehhamzaabovefinalarabic","yehhamzaaboveinitialarabic","yehhamzaabovemedialarabic","yehinitialarabic","yehmedialarabic","yehmeeminitialarabic","yehmeemisolatedarabic","yehnoonfinalarabic","yehthreedotsbelowarabic","yekorean","yen","yenmonospace","yeokorean","yeorinhieuhkorean","yerahbenyomohebrew","yerahbenyomolefthebrew","yericyrillic","yerudieresiscyrillic","yesieungkorean","yesieungpansioskorean","yesieungsioskorean","yetivhebrew","ygrave","yhook","yhookabove","yiarmenian","yicyrillic","yikorean","yinyang","yiwnarmenian","ymonospace","yod","yoddagesh","yoddageshhebrew","yodhebrew","yodyodhebrew","yodyodpatahhebrew","yohiragana","yoikorean","yokatakana","yokatakanahalfwidth","yokorean","yosmallhiragana","yosmallkatakana","yosmallkatakanahalfwidth","yotgreek","yoyaekorean","yoyakorean","yoyakthai","yoyingthai","yparen","ypogegrammeni","ypogegrammenigreekcmb","yr","yring","ysuperior","ytilde","yturned","yuhiragana","yuikorean","yukatakana","yukatakanahalfwidth","yukorean","yusbigcyrillic","yusbigiotifiedcyrillic","yuslittlecyrillic","yuslittleiotifiedcyrillic","yusmallhiragana","yusmallkatakana","yusmallkatakanahalfwidth","yuyekorean","yuyeokorean","yyabengali","yyadeva","zaarmenian","zacute","zadeva","zagurmukhi","zaharabic","zahfinalarabic","zahinitialarabic","zahiragana","zahmedialarabic","zainarabic","zainfinalarabic","zakatakana","zaqefgadolhebrew","zaqefqatanhebrew","zarqahebrew","zayin","zayindagesh","zayindageshhebrew","zayinhebrew","zbopomofo","zcaron","zcircle","zcircumflex","zcurl","zdot","zdotaccent","zdotbelow","zecyrillic","zedescendercyrillic","zedieresiscyrillic","zehiragana","zekatakana","zero","zeroarabic","zerobengali","zerodeva","zerogujarati","zerogurmukhi","zerohackarabic","zeroinferior","zeromonospace","zerooldstyle","zeropersian","zerosuperior","zerothai","zerowidthjoiner","zerowidthnonjoiner","zerowidthspace","zeta","zhbopomofo","zhearmenian","zhebrevecyrillic","zhecyrillic","zhedescendercyrillic","zhedieresiscyrillic","zihiragana","zikatakana","zinorhebrew","zlinebelow","zmonospace","zohiragana","zokatakana","zparen","zretroflexhook","zstroke","zuhiragana","zukatakana","angbracketleftbig","angbracketleftBig","angbracketleftbigg","angbracketleftBigg","angbracketrightBig","angbracketrightbig","angbracketrightBigg","angbracketrightbigg","arrowhookleft","arrowhookright","arrowlefttophalf","arrowleftbothalf","arrownortheast","arrownorthwest","arrowrighttophalf","arrowrightbothalf","arrowsoutheast","arrowsouthwest","backslashbig","backslashBig","backslashBigg","backslashbigg","bardbl","bracehtipdownleft","bracehtipdownright","bracehtipupleft","bracehtipupright","braceleftBig","braceleftbig","braceleftbigg","braceleftBigg","bracerightBig","bracerightbig","bracerightbigg","bracerightBigg","bracketleftbig","bracketleftBig","bracketleftbigg","bracketleftBigg","bracketrightBig","bracketrightbig","bracketrightbigg","bracketrightBigg","ceilingleftbig","ceilingleftBig","ceilingleftBigg","ceilingleftbigg","ceilingrightbig","ceilingrightBig","ceilingrightbigg","ceilingrightBigg","circledotdisplay","circledottext","circlemultiplydisplay","circlemultiplytext","circleplusdisplay","circleplustext","contintegraldisplay","contintegraltext","coproductdisplay","coproducttext","floorleftBig","floorleftbig","floorleftbigg","floorleftBigg","floorrightbig","floorrightBig","floorrightBigg","floorrightbigg","hatwide","hatwider","hatwidest","intercal","integraldisplay","integraltext","intersectiondisplay","intersectiontext","logicalanddisplay","logicalandtext","logicalordisplay","logicalortext","parenleftBig","parenleftbig","parenleftBigg","parenleftbigg","parenrightBig","parenrightbig","parenrightBigg","parenrightbigg","prime","productdisplay","producttext","radicalbig","radicalBig","radicalBigg","radicalbigg","radicalbt","radicaltp","radicalvertex","slashbig","slashBig","slashBigg","slashbigg","summationdisplay","summationtext","tildewide","tildewider","tildewidest","uniondisplay","unionmultidisplay","unionmultitext","unionsqdisplay","unionsqtext","uniontext","vextenddouble","vextendsingle","getDingbatsGlyphsUnicode","a202","a4","a5","a119","a118","a117","a11","a12","a13","a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25","a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34","a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47","a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60","a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73","a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97","a98","a99","a100","a101","a102","a103","a104","a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123","a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134","a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145","a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156","a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166","a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176","a177","a178","a179","a193","a180","a199","a181","a200","a182","a201","a183","a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190","a191","a89","a90","a93","a94","a91","a92","a205","a85","a206","a86","a87","a88","a95","a96","getSpecialPUASymbols","mapSpecialUnicodeValues","getUnicodeForGlyph","glyphsUnicodeMap","unicode","nameLen","hexStr","UnicodeRanges","getUnicodeRangeFor","lastPosition","SpecialCharRegExp","CategoryCache","getCharUnicodeCategory","cachedCategory","groups","category","isWhitespace","isZeroWidthDiacritic","isInvisibleFormatMark","clearUnicodeCaches","SEAC_ANALYSIS_ENABLED","FontFlags","FixedPitch","Serif","Symbolic","Script","Nonsymbolic","Italic","AllCap","SmallCap","ForceBold","MacStandardGlyphOrdering","recoverGlyphName","type1FontGlyphMapping","builtInEncoding","glyphNames","charCodeToGlyphId","glyphId","baseEncoding","isSymbolicFont","flags","isInternalFont","baseEncodingName","differences","glyphName","standardGlyphName","normalizeFontName","getVerticalPresentationForm","MAX_SIZE_TO_COMPILE","compileType3Glyph","POINT_TO_PROCESS_LIMIT","POINT_TYPES","width1","points","j0","lineSize","pathBuf","DOMMatrix","scaleSelf","translateSelf","pp","ISOAdobeCharset","ExpertCharset","ExpertSubsetCharset","DataBuilder","bufLength","hasExactLength","exactLength","minLength","initBuf","#initBuf","newBuf","setArray","setSafeInt16","MAX_SUBR_NESTING","looksLikeUnsigned16BitNegative","recoverSigned16BitBBox","onlyLowerLeft","CFFStandardStrings","NUM_STANDARD_CFF_STRINGS","DEFAULT_BLUE_SCALE","DEFAULT_BLUE_SHIFT","DEFAULT_BLUE_FUZZ","DEFAULT_EXPANSION_FACTOR","CharstringValidationData","stackClearing","stem","resetStack","CharstringValidationData12","stackDelta","stackFn","CFFParser","file","seacAnalysisEnabled","cff","CFF","parseHeader","nameIndex","parseIndex","topDictIndex","stringIndex","globalSubrIndex","topDictParsed","parseDict","topDict","createDict","CFFTopDict","names","parseNameIndex","parseStringIndex","parsePrivateDict","isCIDFont","hasName","charStringOffset","charStringIndex","charStringCount","fontBBox","descriptorBBox","some","cffBBoxHasUnsignedLowerLeft","cffBBoxHasUnsignedCoords","setByName","recoveredFontBBox","descriptorCorroborates","ascent","descent","ascentScaled","charset","fdArrayIndex","dictRaw","fontDict","fdArray","parseCharsets","fdSelect","parseFDSelect","parseEncoding","charStringsAndSeacs","parseCharStrings","charStrings","localSubrIndex","privateDict","subrsIndex","seacs","widths","bytesLength","hdrSize","offSize","CFFHeader","parseOperand","parseFloatOperand","getInt16","operands","cffIndex","CFFIndex","offsetSize","offsetStart","offsetEnd","CFFStrings","Type","cffDict","setByKey","parseCharString","callDepth","stackSize","validationCommand","seac","bias","subrNumber","valid","hasVStems","firstStackClearing","charstring","localSubrToUse","privateDictToUse","fdIndex","getFDIndex","nominalWidth","defaultWidth","emptyPrivateDictionary","parentDict","CFFPrivateDict","privateOffset","removeByName","privateDictEnd","dictData","blueScale","blueShift","blueFuzz","expansionFactor","maxZoneHeight","zones","PRECISION","lowerBound","minBlueScale","maxBlueScale","clamped","subrsOffset","relativeOffset","cid","CFFCharset","CFFCharsetPredefinedTypes","ISO_ADOBE","EXPERT","EXPERT_SUBSET","format","predefined","raw","readSupplement","supplementsCount","sid","dataStart","glyphsCount","rangesCount","gid","dataEnd","CFFEncoding","CFFFDSelect","rawFileLength","duplicateFirstGlyph","glyphZero","hasGlyphId","glyph","getSID","objects","CFFDict","tables","keyToNameMap","nameToKeyMap","defaults","types","opcodes","order","createTables","layout","CFFTopDictLayout","CFFPrivateDictLayout","glyphIndex","CFFOffsetTracker","isTracking","track","location","setEntryLocation","offset0","offset1","offset2","offset3","offset4","CFFCompiler","compile","compileHeader","compileNameIndex","xuid","compiled","compileTopDicts","topDictTracker","trackers","compileStringIndex","compileIndex","compileEncoding","compileCharset","compileCharStrings","compileFDSelect","fontDictTrackers","compilePrivateDicts","encodeNumber","encodeInteger","encodeFloat","EncodeFloatRegExp","nibbles","sanitizedName","dicts","removeCidKeys","fontDictTracker","fontDictData","compileDict","privateDictTracker","privateDictData","subrs","offsetTracker","charStringsIndex","numGlyphs","numGlyphsLessNotDef","nLeft","charsetIndex","numCharsets","warned","lastFD","currentFD","numRanges","lastOffset","getStdFontMap","Helvetica","Courier","ZapfDingbats","ArialNarrow","ArialBlack","Arial","ArialMT","ArialUnicodeMS","CourierNew","CourierNewPSMT","TimesNewRoman","TimesNewRomanPS","TimesNewRomanPSMT","getFontNameToFileMap","getNonStdFontMap","Calibri","CenturyGothic","ComicSansMS","GillSansMT","Impact","LucidaConsole","NuptialScript","SegoeUISymbol","getSerifFonts","Albertus","Aldus","Alexandria","Algerian","Antiqua","Apex","Arno","Aster","Aurora","Baskerville","Bell","Bembo","Benguiat","Bodoni","Bookman","Calisto","Calvert","Capitals","Cambria","Cartier","Caslon","Catull","Centaur","Chaparral","Cheltenham","Clarendon","Clearface","Cochin","Colonna","Constantia","Corona","Ecotype","Egyptienne","Elephant","Excelsior","Fairfield","Folkard","Footlight","FreeSerif","Garamond","Gentium","Georgia","Gloucester","Granjon","Heather","Hercules","Hiroshige","Imprint","Janson","Joanna","Korinna","Lexicon","LiberationSerif","Literaturnaya","Lucida","Melior","Memphis","Miller","Minion","Modern","Palatino","Perpetua","Plantin","Playbill","Renault","Requiem","Rockwell","Roman","Sabon","Scala","Seagull","Sistina","Souvenir","STIX","Sylfaen","Times","Trajan","Utopia","Versailles","Wanted","Weiss","Windsor","XITS","getSymbolsFonts","Dingbats","Wingdings","getGlyphMapForStandardFonts","getSupplementalGlyphMapForArialBlack","getSupplementalGlyphMapForCalibri","getStandardFontName","fontName","stdFontMap","isKnownFontName","ON_CURVE_POINT","X_SHORT_VECTOR","Y_SHORT_VECTOR","REPEAT_FLAG","X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR","Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR","OVERLAP_SIMPLE","ARG_1_AND_2_ARE_WORDS","ARGS_ARE_XY_VALUES","WE_HAVE_A_SCALE","MORE_COMPONENTS","WE_HAVE_AN_X_AND_Y_SCALE","WE_HAVE_A_TWO_BY_TWO","WE_HAVE_INSTRUCTIONS","GLYPH_HEADER_SIZE","GlyfTable","glyfTable","isGlyphLocationsLong","locaTable","glyphs","loca","glyf","prev","getUint32","Glyph","getSize","sumPrecise","isLocationLong","locaIndex","factors","simple","composites","GlyphHeader","numberOfContours","composite","CompositeGlyph","SimpleGlyph","spos","xMiddle","xMin","xMax","yMin","yMax","Contour","xCoordinates","yCoordinates","contours","instructions","endPtsOfContours","endPt","numberOfPt","instructionLength","flag","getUint8","allXCoordinates","pointFlags","endPtsOfContoursIndex","lastCoordinate","lastX","lastY","contour","argument1","argument2","transf","getInt8","pruneCompositeGlyphCycles","locaEntries","WHITE","GRAY","BLACK","backEdges","top","compIdx","removeSet","droppedGlyphs","gIdx","remaining","writePos","isLast","newFlags","ToUnicodeMap","cmap","amend","IdentityToUnicodeMap","firstChar","lastChar","CFFFont","compiler","loadedName","_createBuiltInEncoding","getCharset","getGlyphMapping","cidToGidMap","charsets","invCidToGidMap","defaultEncoding","encodings","getFloat214","getSubroutineBias","numSubrs","parseCmap","segCount","idDelta","idOffset","ids","parseCff","gsubrs","isCFFCIDFont","parseGlyfTable","itemSize","itemDecode","dv","lookupCmap","compileGlyf","cmds","visitedGlyphs","firstPoint","xa","ya","arg2","scale01","scale10","subglyph","numberOfPoints","startPoint","endPoint","compileCharString","charStringCode","bezierCurveTo","stems","stackClean","xb","yb","subrCode","subrsBias","achar","bchar","translate","glyphNameMap","gsubrsBias","Commands","transformStack","currentTransform","getPath","CompiledFont","compiledGlyphs","compiledCharCodeToGlyphId","NOOP","getPathJs","compileEx","compileGlyph","compileGlyphImpl","hasBuiltPath","TrueTypeCompiled","Type2Compiled","cffInfo","FontRendererFactory","indexToLocFormat","unitsPerEm","numTables","tag","getMetrics","getFontBasicMetrics","capHeight","xHeight","OTF_HEADER_SIZE","OTF_TABLE_ENTRY_SIZE","OpenTypeFileBuilder","sfnt","getSearchParams","entriesCount","entrySize","maxPower2","searchRange","rangeShift","toArray","tablesNames","tableOffsets","paddedLength","searchParams","tableName","checksum","quad","addTable","HINTING_ENABLED","COMMAND_MAP","hstem","vstem","vmoveto","rlineto","hlineto","vlineto","rrcurveto","callsubr","flex","drop","endchar","rmoveto","hmoveto","vhcurveto","hvcurveto","Type1CharString","lsb","flexing","convert","wx","sbx","executeCommand","dy","asb","sby","num2","num1","flexArgs","howManyArgs","command","keepStack","stackLength","EEXEC_ENCRYPT_KEY","CHAR_STRS_ENCRYPT_KEY","isHexDigit","decrypt","discardNumber","decrypted","decryptAscii","digit1","digit2","isSpecial","Type1Parser","encrypted","isBinary","readNumberArray","getToken","token","readInt","readBoolean","prevChar","readCharStrings","lenIV","extractFontProgram","charstrings","privateData","program","subrsParsed","charStringsParsed","blueArray","charString","charStringObject","extractCidKeyedFontProgram","cidCount","cidMapOffset","fdBytes","gdBytes","subrMapOffset","sdBytes","subrCount","startDataLength","startDataIsHex","foundStartData","previousTokens","rememberToken","dataType","maxLength","binary","cidEntrySize","readUint","byteCount","subrOffsets","prevOffset","nextOffset","notDef","extractFontHeader","encodingArg","findBlock","streamBytes","signature","startIndex","streamBytesLength","getHeaderBlock","suggestedLength","EEXEC_SIGNATURE","streamStartPos","headerBytes","headerBytesLength","actualLength","getEexecBlock","eexecBytes","isCidKeyedType1File","sample","text","Type1Font","parseCidKeyedType1","parseType1","type2Charstrings","getType2Charstrings","getType2Subrs","wrap","getSeacs","#parseType1","PFB_HEADER_SIZE","headerBlockLength","length1","eexecBlockLength","length2","pfbHeader","pfbHeaderPresent","headerBlock","headerBlockParser","eexecBlock","eexecBlockParser","#parseCidKeyedType1","fileStart","charstringsLen","seacMap","type1Charstrings","type1Charstring","type1Subrs","type2Subrs","charsetArray","fields","field","subrIndex","subr","PRIVATE_USE_AREAS","PDF_GLYPH_SPACE_UNITS","EXPORT_DATA_PROPERTIES","EXPORT_DATA_EXTRA_PROPERTIES","adjustWidths","glyphsWidths","adjustTrueTypeToUnicode","nameRecords","hasIncludedToUnicodeMap","hasEncoding","toUnicode","isWinNameRecord","adjustType1ToUnicode","amendFallbackToUnicode","fallbackToUnicode","originalCharCode","fontChar","accent","vmetric","operatorListId","isSpace","isInFont","int16","writeSignedInt16","signedInt16","writeUint32","isTrueTypeFile","isTrueTypeCollectionFile","isOpenTypeFile","isType1File","isCFFFile","getFontFileType","subtype","fileType","fileSubtype","applyStandardFontGlyphMap","glyphMap","buildToFontChar","toFontChar","isMacNameRecord","convertCidString","shouldThrow","adjustMapping","hasGlyph","newGlyphZeroId","newMap","toUnicodeExtraMap","usedGlyphIds","privateUseAreaIndex","privateUseOffetStart","nextAvailableFontCharCode","privateUseOffetEnd","isInPrivateArea","LIGATURE_TO_UNICODE","fontCharCode","normalized","getRanges","codeIndices","createCmapTable","hasNonBmp","bmpLength","trailingRangesCount","segmentsLength","startCount","endCount","idDeltas","idRangeOffsets","glyphsIds","format4Overflow","contiguous","startCode","format314","useFormat4","useFormat12","format31012","header31012","format4Length","validateOS2Table","os2","selection","usWinAscent","createOS2Table","override","ulUnicodeRange1","ulUnicodeRange2","ulUnicodeRange3","ulUnicodeRange4","firstCharIndex","lastCharIndex","typoAscent","typoDescent","winAscent","winDescent","fixedPitch","createPostTable","post","createPostscriptName","createNameTable","proto","stringsBytes","stringsUnicodeBytes","strUnicode","namesBytes","platformsBytes","encodingsBytes","languagesBytes","strOffset","strs","nameRecord","namesRecordCount","nameTable","Font","charsCache","glyphCache","charProcOperatorList","evaluatorOptions","psName","mimetype","disableFontFace","fontExtraProperties","isType3Font","missingFile","isSerifFont","isSimulatedFlags","nonStdFontMap","serifFonts","namePart","isMonospace","matches","isInvalidPDFjsFont","fallbackName","lineHeight","cidEncoding","vmetrics","fallbackToSystemFont","checkAndRepair","isOpenType","renderer","getExportData","#getExportData","props","exportData","extra","isStandardFont","isMappedToStandardFont","fontBasicMetricsMap","metrics","bold","italic","isNarrow","remeasure","unicodeCharCode","VALID_TABLES","readTables","head","hhea","hmtx","maxp","readTableEntry","previousPosition","readOpenTypeHeader","ttf","entrySelector","readTrueTypeCollectionHeader","ttc","ttcTag","majorVersion","minorVersion","numFonts","offsetTable","dsigTag","dsigLength","dsigOffset","readTrueTypeCollectionData","fontNameParts","fallbackData","potentialHeader","potentialTables","readNameTable","nameEntry","readCmapTable","platformId","encodingId","mappings","hasShortCmap","segment","potentialTable","canBreak","useTable","correctlySorted","nextBytes","nextPlatformId","subHeaderKeys","maxSubHeaderKey","subHeaderKey","subHeaders","firstCode","entryCount","idRangePos","segments","segIndex","offsetsCount","offsetIndex","rangeOffset","nGroups","startCharCode","endCharCode","glyphCode","finalMappings","seenCharCodes","sanitizeMetrics","headTable","dupFirstEntry","caretOffset","numOfMetrics","macStyle","numOfSidebearings","numMissing","sanitizeGlyph","sourceStart","sourceEnd","hintsValid","glyphProfile","sizeOfInstructions","contoursCount","flagsCount","instructionsStart","instructionsLength","instructionsEnd","coordinatesLength","xLength","yLength","xyLength","glyphDataLength","sanitizeHead","locaLength","numGlyphsPlusOne","sanitizeGlyphLocations","maxSizeOfInstructions","itemEncode","fontItemDecodeLong","fontItemEncodeLong","fontItemDecode","fontItemEncode","numGlyphsOut","locaDataSize","locaData","oldGlyfData","oldGlyfDataLength","newGlyfData","missingGlyphs","writeOffset","simpleGlyph","firstEntryLength","readPostScriptTable","propertiesObj","maxpNumGlyphs","glyphNameIndexes","customNames","strLen","records","FORMAT_0_HEADER_LENGTH","numRecords","stringsStart","NAME_RECORD_LENGTH","record","TTOpsStackDeltas","sanitizeTTProgram","ttContext","funcId","lastEndf","lastDeff","callstack","functionsCalled","tooComplexToFollowFunctions","inFDEF","ifLevel","inELSE","functionsUsed","functionsStackDeltas","newStackLength","functionsDefined","stackTop","content","foldTTTable","checkInvalidFunctions","maxFunctionDefs","sanitizeTTPrograms","fpgm","prep","cvt","cvtData","ttcData","isTrueType","parsedCff","fontFileN","numGlyphsFromCFF","sortedTables","Boolean","nextTable","previousPos","scaleFactors","advanceWidth","maxZones","newMaxp","glyphsInfo","metricsOverride","lineGap","isCidToGidMapEmpty","cmapTable","cmapPlatformId","cmapEncodingId","cmapMappings","forcePostTable","unicodeOrCharCode","mapping","glyphZeroId","newMapping","namePrototype","builder","tableTag","newCharCodeToGlyphId","getCharCodes","charCodes","createCharCode","baseGlyphName","accentGlyphName","baseGlyphId","accentGlyphId","accentOffset","baseFontCharCode","accentFontCharCode","fontTableHead","dateArr","fontTableHhea","tan","fontTableHmtx","cffWidths","fontTableMaxp","_spaceWidth","possibleSpaceReplacements","glyphUnicode","_charToGlyph","widthCode","fromCodePoint","charsToGlyphs","chars","getCharPositions","glyphCacheValues","encodeString","buffers","currentBuf","hasCurrentBufErrors","getCharCode","charCodeLength","ErrorFont","CalibriBoldFactors","CalibriBoldMetrics","CalibriBoldItalicFactors","CalibriBoldItalicMetrics","CalibriItalicFactors","CalibriItalicMetrics","CalibriRegularFactors","CalibriRegularMetrics","HelveticaBoldFactors","HelveticaBoldMetrics","HelveticaBoldItalicFactors","HelveticaBoldItalicMetrics","HelveticaItalicFactors","HelveticaItalicMetrics","HelveticaRegularFactors","HelveticaRegularMetrics","LiberationSansBoldWidths","LiberationSansBoldMapping","LiberationSansBoldItalicWidths","LiberationSansBoldItalicMapping","LiberationSansItalicWidths","LiberationSansItalicMapping","LiberationSansRegularWidths","LiberationSansRegularMapping","MyriadProBoldFactors","MyriadProBoldMetrics","MyriadProBoldItalicFactors","MyriadProBoldItalicMetrics","MyriadProItalicFactors","MyriadProItalicMetrics","MyriadProRegularFactors","MyriadProRegularMetrics","SegoeuiBoldFactors","SegoeuiBoldMetrics","SegoeuiBoldItalicFactors","SegoeuiBoldItalicMetrics","SegoeuiItalicFactors","SegoeuiItalicMetrics","SegoeuiRegularFactors","SegoeuiRegularMetrics","getXFAFontMap","baseWidths","baseMapping","getXfaFontName","fontMap","getXfaFontWidths","rescaledBaseWidths","currentCode","currentArray","newWidths","charUnicode","unicode1","unicode2","getXfaFontDict","descriptor","systemInfo","TOKEN","lbrace","rbrace","true","false","sub","mul","div","idiv","exp","eq","ne","gt","ge","lt","le","and","or","xor","bitshift","neg","ceiling","truncate","not","sin","cos","ln","atan","cvi","cvr","dup","exch","copy","roll","if","ifelse","Token","singletons","operatorSingletons","initSingletons","#initSingletons","isOperator","_numberPattern","_identifierPattern","_skipComment","lf","eol","_getNumber","lastIndex","isFinite","_getOperator","PS_VALUE_TYPE","numeric","boolean","unknown","PS_NODE","operator","const","unary","ternary","PsNode","PsProgram","body","PsBlock","PsNumber","PsOperator","PsIf","PsIfElse","otherwise","PsArgNode","valueType","PsConstNode","PsUnaryNode","operand","PsBinaryNode","PsTernaryNode","_token","_isRegularOperator","_advance","_expect","tok","_parseBlock","thenBlock","elseBlock","parsePostScriptFunction","_nodesEqual","_evalBinaryConst","trunc","deg","atan2","_evalUnaryConst","log10","MAX_STACK_SIZE","_unaryValueType","operandType","_binaryValueType","firstType","secondType","PSStackToTree","binaryOps","unaryOps","idempotentUnary","negatedComparison","init","#init","evaluate","numInputs","_failed","_evalBlock","markShared","#markShared","outputs","refCount","visit","shared","sharedCount","_evalBlockFrom","instr","_evalOp","saved","_makeTernary","trueStack","falseStack","snapshot","thenStack","elseStack","_makeBinary","_makeUnary","nNode","jNode","sqrtOnce","square","negated","cop","cf","OP","ARG","CONST","STORE","IF","JUMP","ABS","NEG","CEIL","FLOOR","ROUND","TRUNC","NOT_B","NOT_N","SQRT","SIN","COS","LN","LOG10","CVI","SHIFT","ADD","SUB","MUL","DIV","IDIV","MOD","POW","EQ","NE","GE","LT","LE","AND","OR","XOR","ATAN","MIN","MAX","TEE_TMP","LOAD_TMP","_DEG_TO_RAD","_RAD_TO_DEG","PsJsCompiler","domain","nIn","nOut","_tmpMap","_nextTmp","_compileNode","cached","_compileNodeImpl","slot","_compileUnary","_compileBinary","_compileTernary","ifPatch","jumpPatch","execute","ip","tgt","amt","PSStackBasedInterpreter","#push","execOp","#execOp","dx","execBlock","#execBlock","build","buildPostScriptJsFunction","forceInterpreter","else","select","call","local_get","local_set","local_tee","i32_const","i32_eqz","i32_and","i32_or","i32_xor","i32_shl","i32_shr_s","i32_trunc_f64_s","f64_const","f64_eq","f64_ne","f64_lt","f64_gt","f64_le","f64_ge","f64_abs","f64_neg","f64_ceil","f64_floor","f64_trunc","f64_nearest","f64_sqrt","f64_add","f64_sub","f64_mul","f64_div","f64_min","f64_max","f64_convert_i32_s","f64_store","FUNC_TYPE","F64","SECTION","function","export","EXTERN_FUNC","EXTERN_MEM","unsignedLEB128","byte","encodeASCIIString","vec","MATH_IMPORTS","_mathImportObject","fromEntries","PsWasmCompiler","initialized","comparisonToOp","importIdx","degToRad","radToDeg","importTypeEntries","importSection","functionSection","memorySection","exportSection","wasmMagicVersion","f64View","f64Arr","f64Buf","_nIn","_nOut","_range","_code","_nextLocal","_freeLocals","_sharedLocals","_allocLocal","_releaseLocal","_emitULEB128","_emitF64Const","_emitLocalGet","_emitLocalSet","_emitLocalTee","local","_compileUnaryNode","_compileBinaryNode","_compileTernaryNode","_compileSinCosNode","_compileNodeAsBoolI32","_compileSafeDivNode","_compileSafeIdivNode","_compileBitshiftNode","_compileModNode","localA","localB","_compileAtanNode","localR","_compileBitwiseNode","_compileBitwiseOperandI32","_compileStandardBinaryNode","pow","wasmOp","nLocals","paramTypes","resultTypes","funcType","typeSectionBytes","localDecls","funcBodyLen","codeSectionBytes","magicVersion","totalLen","off","compilePostScriptToWasm","_makeWrapper","outView","writeOut","inBuf","buildPostScriptWasmFunction","BaseLocalCache","_onlyRefs","onlyRefs","_nameRefMap","_imageMap","_imageCache","LocalImageCache","LocalColorSpaceCache","LocalFunctionCache","LocalGStateCache","LocalTilingPatternCache","RegionalImageCache","GlobalColorSpaceCache","GlobalImageCache","NUM_PAGES_THRESHOLD","MIN_IMAGES_TO_CACHE","MAX_BYTE_SIZE","decodeFailedSet","_refCache","byteSize","#byteSize","cacheLimitReached","#cacheLimitReached","shouldCache","pageIndexSet","addDecodeFailed","hasDecodeFailed","addByteSize","onlyData","FunctionType","SAMPLED","EXPONENTIAL_INTERPOLATION","STITCHING","POSTSCRIPT_CALCULATOR","PDFFunctionFactory","parseArray","fnRef","parsedFn","cachedFn","_localFunctionCache","PDFFunction","toNumberArray","getSampleArray","outputSize","bps","sampleMul","strBytes","strIdx","factory","typeNum","constructSampled","constructInterpolated","constructStiched","constructPostScript","xmin","xmax","ymin","ymax","inputSize","samples","constructSampledFn","cubeVertices","cubeN","cubeVertex","domain_2i","domain_2i_1","size_i","e0","n0","n1","rj","constructInterpolatedFn","fns","constructStichedFn","dmin","dmax","rmin","rmax","psCode","wasmFn","isPDFFunction","fnDict","textSinkWrapper","sink","TEXT_CONTENT_CHUNK_SIZE","resolved","enqueueInvoked","desiredSize","_parseVisibilityExpression","nestingCounter","currentResult","MAX_NESTING","object","nestedResult","parseMarkedContentProps","contentProperties","optionalContentType","expression","optionalContentGroups","groupIds","ocg","policy","baseTypes","arabicTypes","isOdd","isEven","findUnequal","reverseValues","temp","createBidiText","isLTR","dir","bidi","startLevel","strLength","numBidi","charType","levels","sor","eor","lastType","before","after","highestLevel","lowestOddLevel","NORMAL","MEDIUM","BOLD","ITALIC","BOLDITALIC","substitutionMap","ultimate","alias","fontAliases","getStyleToAppend","getFamilyName","keywords","generateFont","localFontPath","useFallback","usePath","append","substitution","aliasAppend","assign","fallbackInfo","fallbackUltimate","getFontSubstitution","systemFontCache","idFactory","baseFontName","standardFontName","substitutionInfo","subst","mustAddBaseFont","getDocId","createFontId","SEED","MASK_HIGH","MASK_LOW","MurmurHash3_64","seed","update","blockCounts","tailLength","dataUint32","k1","k2","C1","C2","C1_LOW","C2_LOW","hexdigest","PDFImage","isInline","smask","jpxDecoderOptions","validWidth","validHeight","fallbackDims","imageMask","matte","hasColorSpace","needsDecode","decodeCoefficients","decodeAddends","isIndexed","maskDict","buildImage","smaskData","maskData","createMask","computedLength","imgArray","isSingleOpaquePixel","createImageData","haveFullData","decodeBuffer","getComponents","bufferPos","rowComps","loop1End","loop2End","remainingBits","fillOpacity","rgbaBuf","fillGrayBuffer","destWidth","destHeight","invertOutput","maxRows","stride","imageOffset","maskOffset","undoPreblend","matteRgb","matteR","matteG","matteB","mustBeResized","getImageBytes","internal","createBitmap","getImage","imageLength","isHandled","maybeUndoPreblend","canvasImgData","srcWidth","srcHeight","resolvedDestWidth","resolvedDestHeight","needsResampling","outputWidth","xMap","destIndex","#getImage","imageBytes","DefaultPartialEvaluatorOptions","maxImageSize","ignoreErrors","useSystemFonts","cMapUrl","cMapPacked","standardFontDataUrl","PatternType","TILING","SHADING","TEXT_CHUNK_BATCH_SIZE","deferred","normalizeBlendMode","parsingArray","maybeBM","addCachedImageOps","TimeSlotManager","TIME_SLOT_DURATION_MS","CHECK_TIME_EVERY","checked","endTime","PartialEvaluator","fontCache","builtInCMapCache","standardFontDataCache","globalImageCache","type3FontRefs","_regionalImageCache","_fetchBuiltInCMapBound","_pdfFunctionFactory","parsingType3Font","newOptions","newEvaluator","hasBlendModes","nonBlendModesSet","nodes","graphicStates","graphicState","bm","xObjects","xObject","xResources","fetchStandardFontData","standardFontNameToFileName","buildFormXObject","xobj","task","initialState","seenRefs","f32bbox","groupOptions","newOpList","f32matrix","localResources","isolated","knockout","isGray","groupSubtype","_getColorSpace","_handleColorSpace","backdrop","getOperatorList","prevRefs","_sendImgData","cacheGlobally","buildPaintImageXObject","localImageCache","imageRef","cacheData","createObjId","dataLen","SMALL_IMAGE_DIMENSIONS","imageObj","globalCacheData","localLength","handleSMask","stateManager","smaskContent","smaskOptions","transferObj","transferFn","transferMap","newPath","handleTransferFunction","tr","transferArray","transferMaps","numFns","numEffectfulFns","handleTilingType","patternDict","localTilingPatternCache","tilingOpList","patternResources","operatorListIR","tilingPatternIR","handleSetFont","fontArgs","fontRef","fallbackFontDict","translated","loadFont","type3Dependencies","handleText","isAddToPathSet","textRenderingMode","fillColorSpace","strokeColorSpace","buildFontPaths","ensureStateFont","gState","localGStateCache","gStateRef","isSimpleGState","gStateObj","errorFont","TranslatedFont","fontRes","preEvaluatedFont","preEvaluateFont","fontRefIsRef","fontID","aliasFontRef","translateFont","translatedFont","loadType3Data","buildPath","pathMinMax","pathBuffer","currentPointX","currentPointY","xw","yh","startX","startY","csPromise","localShadingPatternCache","patternIR","handleColorN","patterns","patternName","rawPattern","localTilingPattern","EvalState","xobjs","StateManager","preprocessor","EvaluatorPreprocessor","timeSlotManager","closePendingRestoreOPS","argument","savedStatesDepth","promiseBody","all","ensureNotTerminated","operation","stop","isValidName","localImage","resolveXObject","rejectXObject","cachedImage","fontSize","combinedGlyphs","arrItem","fillCS","strokeCS","patternFillColorSpace","patternStrokeColorSpace","shadingRes","patternId","localGStateObj","resolveGState","rejectGState","extGState","thickness","dashPhase","dashArray","getTextContent","includeMarkedContent","seenStyles","viewBox","markedContentData","disableNormalization","keepWhiteSpace","intersector","TextState","textContent","styles","textContentItem","totalWidth","totalHeight","prevTransform","prevTextRise","textAdvanceScale","spaceInFlowMin","spaceInFlowMax","trackingSpaceMin","negativeSpaceMax","notASpace","hasEOL","twoLastChars","twoLastCharsPos","saveLastChar","nextPos","shouldAddWhitepsace","resetLastChars","TRACKING_SPACE_FACTOR","NOT_A_SPACE_FACTOR","NEGATIVE_SPACE_FACTOR","SPACE_IN_FLOW_MIN_FACTOR","SPACE_IN_FLOW_MAX_FACTOR","VERTICAL_SHIFT_RATIO","showSpacedTextBuffer","emptyXObjectCache","emptyGStateCache","textState","currentTextState","pushWhitespace","addExtraChar","getCurrentTextTransform","tsm","textHScale","textRise","isCharBBox","glyphHeight","ctm","textMatrix","ensureTextContentItem","fontSubstitution","fontSubstitutionLoadedName","trm","hypot","scaleLineX","textLineMatrix","scaleCtmX","updateAdvanceScale","scaleFactor","runBidiTransform","textChunk","bidiResult","applyInverseRotation","compareWithLastPosition","glyphWidth","posX","posY","lastPosX","lastPosY","rotate","advanceY","advanceX","textOrientation","appendEOL","flushTextContentItem","addFakeSpaces","textRiseDelta","advanceYCorrected","buildTextContentItem","extraSpacing","baseCharSpacing","charSpacing","translateTextMatrix","scaledDim","wordSpacing","addGlyph","enqueueChunk","batch","fontNameArg","fontSizeArg","leading","translateTextLineMatrix","carriageReturn","setTextLineMatrix","spaceFactor","elements","globalImage","currentState","xObjStateManager","sinkWrapper","gStateFont","mcid","getPageObjId","extractDataStructures","cidToGidBytes","toUnicodePromise","readToUnicode","cidSystemInfo","registry","ordering","supplement","diffEncoding","nonEmbeddedFont","isSymbolsFontName","chineseFontNames","isNonsymbolicFont","builtToUnicode","buildToUnicode","readCidToGidMap","_simpleFontToUnicode","forceGlyphs","codeStr","ucs2CMapName","ucs2CMap","ucs2","cmapObj","glyphsData","glyphID","extractWidths","glyphsVMetrics","dw","dw2","missingWidth","getBaseFontMetrics","buildCharCodeToWidth","firstWidth","fontNameWoStyle","monospace","Metrics","glyphWidths","widthsByGlyphName","baseDict","df","diffLength","diffBuf","diffEntry","uint8array","widthsBuf","compositeWidths","subWidthsBuf","charProcs","newProperties","baseFont","fontNameStr","baseFontStr","fontFile","length3","glyphScaleFactors","subtypeEntry","sent","type3Loaded","fontData","evaluator","type3Evaluator","loadCharProcsPromise","fontResources","fontBBoxSize","glyphStream","removeType3ColorOperators","guessType3FontBBox","dummyOperatorList","_bbox","#removeType3ColorOperators","charBBox","charBBoxSize","gStateKey","#guessType3FontBBox","stateStack","old","_fillColorSpace","_strokeColorSpace","opMap","ri","gs","cm","BT","ET","Tc","Tw","Tz","TL","Tf","Tr","Ts","Td","TD","Tm","Tj","TJ","d0","d1","CS","SC","SCN","sc","scn","RG","rg","sh","BI","ID","EI","Do","MP","BMC","BDC","EMC","BX","EX","BM","BD","fa","fal","fals","nul","null","MAX_INVALID_PATH_OPS","nonProcessedArgs","_isPathOp","_numInvalidPathOPS","opSpec","argsLength","preprocessCommand","DefaultAppearanceEvaluator","fontColor","parseDefaultAppearance","AppearanceStreamEvaluator","breakLoop","_localColorSpaceCache","parseAppearanceStream","getPdfColor","isFill","createDefaultAppearance","FakeUnicodeFont","fontNameId","ctxMeasure","fontDescriptorRef","_fontDescriptorRef","fontDescriptor","getNewPersistentRef","descendantFontRef","descendantFont","currentWidths","baseFontRef","_createContext","createFontResources","line","measureText","getFirstPositionInfo","lineDescent","createAppearance","bgColor","strokeAlpha","lines","maxWidth","lineWidth","hscale","vscale","fscale","newFontSize","vShift","appearance","appearanceStreamDict","makeColorComp","scaleAndClamp","ColorConverters","CMYK_G","G_CMYK","G_RGB","G_rgb","G_HTML","RGB_G","RGB_rgb","RGB_HTML","T_HTML","T_rgb","CMYK_RGB","CMYK_rgb","CMYK_HTML","RGB_CMYK","DateFormats","TimeFormats","NameOrNumberTree","root","_type","getAll","isRaw","kids","kid","kidsOrEntries","loopCount","MAX_LEVELS","limits","currentKey","NameTree","NumberTree","clearGlobalCaches","FileSpec","fs","pickPlatformItem","description","desc","serializable","rawFilename","hasEmbeddedFile","fileSpecDict","readContent","ef","readStreamContent","encrypt","encryptionKey","XMLParserErrorCode","NoError","EndOfDocument","UnterminatedCdat","UnterminatedXmlDeclaration","UnterminatedDoctypeDeclaration","UnterminatedComment","MalformedElement","OutOfMemory","UnterminatedAttributeValue","UnterminatedElement","ElementNeverBegun","isWhitespaceString","XMLParserBase","_entityRegex","_resolveEntities","dec","onResolveEntity","_parseContent","attributes","skipWs","attrName","attrValue","attrEndChar","attrEndIndex","parsed","_parseProcessingInstruction","attrStart","parseXml","ch2","onEndElement","onPi","onComment","onCdata","q2","complexDoctype","doctypeContent","onDoctype","isClosed","onBeginElement","onText","SimpleDOMNode","nodeName","nodeValue","firstChild","childNodes","nextSibling","parentNode","child","hasChildNodes","searchNode","paths","siblingPos","dump","attribute","SimpleXMLParser","hasAttributes","lowerCaseName","_currentFragment","_stack","_errorCode","_hasAttributes","_lowerCaseName","parseFromString","documentElement","lastElement","childNode","MetadataParser","_repair","xmlDocument","_metadataMap","_data","_parse","d2","d3","charBuf","_getSequence","_parseArray","seqNode","rdf","parsedData","rawData","MAX_DEPTH","StructElementType","PAGE_CONTENT","STREAM_CONTENT","OBJECT","ANNOTATION","ELEMENT","StructTreeRoot","kidRefToPosition","parentTree","roleMap","structParentIds","rootDict","rootRef","getKidPosition","kidRef","addIdToPage","#addIdToPage","pageRef","addAnnotationIdToPage","canCreateStructureTree","catalogRef","pdfManager","nextKey","hasNothingToUpdate","getPage","accessibilityData","parentTreeId","createStructureTree","changes","ensureCatalog","cache","structTreeRootRef","getNewTemporaryRef","structTreeRoot","parentTreeRef","nums","writeKids","canUpdateStructTree","numberTree","pageDict","collectParents","structParent","structTreeParent","updateStructureTree","numsRef","newNextKey","#writeKids","objr","structTreePageObjs","isPageRef","objs","structTreePage","StructTreePage","collectObjects","objRef","tagDict","writeProperties","tagRef","updateParentTag","newTagRef","fallbackKids","objDict","#writeProperties","title","alt","expanded","actualText","#collectParents","idToElements","structTreeParentId","parentArray","updateElement","pageKid","elems","parentRef","#updateParentTag","cachedParentDict","parentKidsRaw","cachedParentKids","parentKidsRef","StructElementNode","parseKids","role","nameObj","mathML","AFs","af","fileStream","mathml","pageObjId","parseKid","StructElement","refObjId","elemId","addNode","addTopLevelNode","nodeToSerializable","kidElement","isValidExplicitDest","fetchDest","fetchRemoteDest","JSON","stringify","Catalog","actualNumPages","annotationAttachmentIdByRef","annotationAttachmentRefById","catDict","pageDictCache","pageIndexCache","pageKidsCountCache","getCatalogObj","toplevelPagesDict","cloneDict","getAttachmentIdForAnnotation","baseId","attachments","needsRendering","collection","acroForm","acroFormRef","metadata","streamRef","encryptMetadata","markInfo","readMarkInfo","#readMarkInfo","Marked","UserProperties","Suspects","hasStructTree","structTree","readStructTreeRoot","#readStructTreeRoot","rawObj","pagesObj","documentOutline","readDocumentOutline","#readDocumentOutline","blackColor","outlineDict","parseDestDictionary","destDict","resultObj","docBaseUrl","docAttachments","rgbColor","outlineItem","attachmentId","attachment","unsafeUrl","setOCGState","keepRawDict","rawDict","documentOutlineForEditor","permissions","readPermissions","#readPermissions","trailer","optionalContentConfig","config","defaultConfig","groupsData","groupRefCache","groupRef","readOptionalContentGroup","readOptionalContentConfig","#readOptionalContentGroup","usage","print","rbGroups","usageObj","printState","viewState","#readOptionalContentConfig","parseOnOff","refs","onParsed","parseOrder","nestedLevels","parsedOrderRefs","nestedOrder","parseNestedOrder","hiddenGroups","MAX_NESTED_LEVELS","nestedName","parseRBGroups","rbGroup","parsedRbGroup","creator","baseState","on","setActualNumPages","hasActualNumPages","_pagesCount","destinations","rawDests","readDests","dests","getDestination","hasOwn","#readDests","rawPageLabels","pageLabels","readPageLabels","#readPageLabels","currentLabel","currentIndex","labelDict","st","LIMIT","A_UPPER_CASE","A_LOWER_CASE","baseCharCode","letterIndex","character","pageLayout","pageMode","viewerPreferences","prefs","prefValue","isValid","openAction","nameTree","attachmentContentByName","#attachmentContentByName","attachmentContent","namedContent","target","rawEmbeddedFiles","xfaImages","collectJavaScript","#collectJavaScript","javaScript","appendIfJavaScriptDict","jsDict","jsActions","manuallyTriggered","getPageDict","nodesToVisit","visitedNodes","pagesRef","currentPageIndex","currentNode","lastKid","getAllPageDicts","posInKids","addPageDict","addPageError","queueItem","kidObj","getPageIndex","cachedPageIndex","kidPromises","uri","getDestFromStructElement","#getDestFromStructElement","seRef","seDict","directPg","kidsArr","pg","current","depth","parentRaw","attrs","actionType","actionName","include","resetForm","urlDict","remoteDest","relationship","attachmentDest","namedAction","preserveRB","stateArr","jsAction","jsURL","seDest","FLATE_COLOR_COUNT_THRESHOLD","createImageDict","createRawImage","paethPredictor","above","upperLeft","applyPNGOptimumFilter","candidates","rowOffset","prevRowOffset","scores","cur","bestFilter","outOffset","deflate","CompressionStream","writePromise","createPNGLikeImage","filtered","decodeParms","closeBitmap","buf32","isLE","colorCounter","hasAlpha","useFlate","imageStreamPromise","imageRenderStream","convertToBlob","quality","blob","smaskStreamPromise","smaskRenderStream","alphaBuffer","smaskRenderDict","smaskStream","mayHaveChildren","addChildren","rawValue","ObjectLoader","refSet","load","walk","#walk","nodesToRevisit","pendingRequests","foundMissingData","objLoader","$acceptWhitespace","$addHTML","$appendChild","$childrenToHTML","$clean","$cleanPage","$cleanup","$clone","$consumed","$content","$data","$dump","$extra","$finalize","$flushHTML","$getAttributeIt","$getAttributes","$getAvailableSpace","$getChildrenByClass","$getChildrenByName","$getChildrenByNameIt","$getDataValue","$getExtra","$getRealChildrenByNameIt","$getChildren","$getContainedChildren","$getNextPage","$getSubformParent","$getParent","$getTemplateRoot","$globalData","$hasSettableValue","$ids","$indexOf","$insertAt","$isCDATAXml","$isBindable","$isDataValue","$isDescendent","$isNsAgnostic","$isSplittable","$isThereMoreWidth","$isTransparent","$isUsable","$lastAttribute","$namespaceId","$nodeName","$nsAttributes","$onChild","$onChildCheck","$onText","$pushGlyphs","$popPara","$pushPara","$removeChild","$root","$resolvePrototypes","$searchNode","$setId","$setSetAttributes","$setValue","$tabIndex","$text","$toPages","$toHTML","$toString","$toStyle","$uid","$buildXFAObject","NamespaceIds","ns","connectionSet","datasets","form","localeSet","pdf","sourceSet","stylesheet","template","xdc","xdp","xfdf","xhtml","xmpmeta","dimConverters","pt","mm","in","px","measurementPattern","stripQuotes","getInteger","defaultValue","validate","getFloat","getKeyword","getStringOption","getMeasurement","def","valueStr","unit","conv","getRatio","den","getRelevant","excluded","viewname","getColor","getBBox","HTMLResult","FAILURE","EMPTY","success","html","breakNode","isBreak","FontFinder","pdfFonts","fonts","defaultFont","reallyMissingFonts","pdfFont","addPdfFont","regular","bolditalic","myriad","endsWith","getDefault","find","maybe","family","selectFont","xfaFont","typeface","posture","real","fontFinder","lineNoGap","WIDTH_FACTOR","FontInfo","margin","paraMargin","bottom","right","letterSpacing","FontSelector","defaultXfaFont","defaultParaMargin","defaultLineHeight","pushData","lastFont","fontInfo","popFont","topFont","TextMeasure","fontSelector","extraHeight","addPara","addString","fontLineHeight","noGap","firstLineHeight","fallbackWidth","encodedLine","compute","lastSpacePos","lastSpaceWidth","currentLineWidth","currentLineHeight","isBroken","isFirstLine","isEOL","namePattern","indexPattern","dot","dotDot","dotHash","dotBracket","dotParen","shortcuts","host","dataWindow","event","somCache","WeakMap","parseExpression","expr","dotDotAllowed","noExpr","cacheName","formCalc","container","useCache","isQualified","isXFAObject","isXFAObjectArray","flat","createDataNode","createNodes","_applyPrototype","_attributes","_attributeNames","_children","_cloneAttribute","_dataValue","_defaultValue","_filteredChildrenGenerator","_getPrototype","_getUnsetAttributes","_hasChildren","_max","_options","_parent","_resolvePrototypesHelper","_setAttributes","_validator","uid","NS_DATASETS","XFAObject","nsId","hasChildren","XmlObject","XFAObjectArray","para","paraStack","clean","getOwnPropertyNames","dumped","availableSpace","failingNode","generator","protoAttributes","allAttr","setAttr","ancestors","use","usehref","somExpression","protoProto","newAncestors","unsetAttrName","protoValue","$symbol","getOwnPropertySymbols","clonedChild","allTransparent","XFAAttribute","dataNode","xfa","tagName","utf8TagName","utf8Name","skipConsumed","hasNS","$ns","$name","ContentObject","OptionObject","StringObject","IntegerObject","validator","Option01","Option10","measureToString","converters","anchorType","dimensions","colSpan","columnWidths","currentColumn","transformOrigin","presence","visibility","display","hAlign","textAlign","alignSelf","setMinMaxDimensions","minW","minWidth","maxW","minH","minHeight","layoutText","measure","layoutNode","marginH","marginV","leftInset","rightInset","topInset","bottomInset","spaceAbove","spaceBelow","marginLeft","marginRight","exData","contentType","computeBbox","fixDimensions","layoutClass","toStyle","newStyle","createWrapper","wrapper","class","border","insets","insetsH","insetsW","hand","classNames","isPrintOnly","fixTextIndent","indent","textIndent","setAccess","access","relevant","getCurrentPara","setPara","nodeStyle","valueStyle","flexDirection","vAlign","justifyContent","paraStyle","setFontFamily","fixURL","createLine","flushHTML","htmlFromFailing","addHTML","attempt","numberInLine","currentWidth","getAvailableSpace","getTransformedBBox","centerX","centerY","checkDimensions","firstUnsplittable","ERROR","noLayoutFailure","currentContentArea","TEMPLATE_NS_ID","MAX_ATTEMPTS_FOR_LRTB_LAYOUT","MAX_EMPTY_PAGES","DEFAULT_TAB_INDEX","HEADING_PATTERN","MIMES","IMAGES_HEADERS","getBorderDims","borderExtra","hasMargin","_setValue","templateNode","Value","getContainedChildren","SubformSet","isRequired","nullTest","setTabIndex","traversal","applyAssist","assist","assistTitle","ariaRole","ariaLevel","ariaLabel","speak","toolTip","valueToHtml","setFirstUnsplittable","unsetFirstUnsplittable","handleBreak","targetType","currentPageArea","PageArea","startNew","ContentArea","pageArea","nextPageArea","contentAreas","contentArea","indexForCurrent","indexForTarget","handleOverflow","extraNode","savedMethod","AppearanceFilter","Arc","circular","startAngle","sweepAngle","edge","Edge","edgeStyle","strokeWidth","xmlns","overflow","cx","cy","rx","ry","largeArc","vectorEffect","preserveAspectRatio","svg","Area","extras","draw","exObject","exclGroup","subform","subformSet","xfaName","Assist","Barcode","charEncoding","dataColumnCount","dataPrep","dataRowCount","endChar","errorCorrectionLevel","moduleHeight","moduleWidth","printCheckDigit","rowColumnRatio","startChar","textLocation","upsMode","wideNarrowRatio","Bind","picture","BindItems","connection","labelRef","valueRef","Bookend","leader","BooleanElement","Border","break","corner","edges","defaultEdge","edgeStyles","radius","cornerStyles","borderRadius","borderStyle","borderWidth","borderColor","Break","afterTarget","beforeTarget","bookendLeader","bookendTrailer","overflowLeader","overflowTarget","overflowTrailer","BreakAfter","script","BreakBefore","Button","highlight","grandpa","htmlButton","activity","Calculate","Caption","placement","reserve","savedReserve","Certificate","Certificates","credentialServerPolicy","urlPolicy","encryption","issuers","keyUsage","oids","signing","subjectDNs","CheckButton","mark","shape","className","groupId","exportedValue","fieldId","dataId","ExclGroup","xfaOn","xfaOff","required","ChoiceList","commitOn","textEntry","ui","optionStyle","displayedIndex","saveIndex","displayed","selected","hidden","selectAttributes","multiple","Color","cSpace","Comb","numberOfCells","Connect","Corner","inverted","DateElement","DateTime","DateTimeEdit","hScrollPolicy","picker","comb","Decimal","fracDigits","leadDigits","DefaultUi","Desc","dateTime","decimal","float","integer","time","DigestMethod","DigestMethods","digestMethod","Draw","locale","caption","keep","setProperty","savedW","savedH","cap","linecap","Encoding","Encodings","Encrypt","certificate","EncryptData","manifest","Encryption","EncryptionMethod","EncryptionMethods","encryptionMethod","Event","listen","encryptData","signData","submit","ExData","rid","transferEncoding","ExObject","archive","classId","codeBase","codeType","accessKey","calculate","connect","_isSplittable","isSplittable","isLrTb","maxRun","Execute","executeType","runAt","Extras","Field","bindItems","Ui","TextEdit","textEdit","checkButton","choiceList","borderDims","uiW","uiH","tabindex","aElement","button","imageEdit","htmlValue","maxChars","numericEdit","captionHeight","inputHeight","Fill","linear","radial","solid","stipple","ggrandpa","propName","altPropName","backgroundColor","Rectangle","addRevocationInfo","appearanceFilter","certificates","digestMethods","encryptionMethods","lockDocument","mdp","reasons","timeStamp","Float","baselineShift","fontHorizontalScale","fontVerticalScale","kerningMode","lineThrough","lineThroughPeriod","overlinePeriod","underline","underlinePeriod","usedTypefaces","backgroundClip","verticalAlign","fontKerning","textDecoration","textDecorationStyle","fontStyle","Format","Handler","Hyphenation","excludeAllCaps","excludeInitialCap","hyphenate","pushCharacterCount","remainCharacterCount","wordCharacterCount","Image","aspect","fromBase64","objectFit","createObjectURL","ImageEdit","Integer","Issuers","Items","Keep","intact","KeyUsage","crlSign","dataEncipherment","decipherOnly","digitalSignature","encipherOnly","keyAgreement","keyCertSign","keyEncipherment","nonRepudiation","Line","slope","Linear","startColor","endColor","LockDocument","Manifest","Margin","Mdp","signatureType","Medium","imagingBBox","long","orientation","short","stock","trayIn","trayOut","Message","NumericEdit","Occur","initial","originalMin","PageSet","Template","Oid","Oids","oid","Overflow","addLeader","addTrailer","blankOrNotBlank","initialNumber","numbered","oddOrEven","pagePosition","medium","occur","numberOfUse","relation","duplexImposition","pageSet","pageSetIndex","pageNumber","parity","Para","orphans","preserve","radixOffset","tabDefault","tabStops","widows","hyphenation","paddingLeft","paddingRight","paddingTop","paddingBottom","tabSize","hyphenatation","PasswordEdit","passwordChar","Picture","Proto","barcode","bookend","breakAfter","breakBefore","dateTimeEdit","defaultUi","passwordEdit","subjectDN","traverse","variables","Radial","Reason","Reasons","cornerStyle","RefElement","binding","SetProperty","SignData","Signature","Signing","Solid","Speak","disable","priority","Stipple","rate","Subform","allowMacro","mergeMode","restoreState","scope","afterBreakAfter","savedNoLayoutFailure","overflowExtra","overflowNode","SubjectDN","delimiter","kv","SubjectDNs","Submit","embedPDF","textEncoding","xdpContent","baseProfile","pageAreas","mainHtml","breakBeforeTarget","pageAreaParent","targetPageArea","hasSomething","hasSomethingCounter","htmlContentAreas","Text","flatMap","allowRichText","multiLine","vScrollPolicy","Time","TimeStamp","server","ToolTip","Traversal","Traverse","Validate","formatTest","scriptTest","valueName","Variables","TemplateNamespace","createText","Binder","emptyMerge","_isConsumeData","_mergeMode","_isMatchTemplate","_bindElement","_bindValue","formNode","_findDataByNameToConsume","isValue","global","_setProperties","targetNodes","targetNode","targetParent","Reflect","construct","_bindItems","labels","labelNodes","labelNode","valueNodes","valueNode","label","_bindOccurrences","baseClone","_createOccurrences","currentNumber","nodeClone","_getOccurInfo","_setAndBind","uselessNodes","dataChildren","dataChild","DataHandler","dataset","serialize","storage","storageEntry","CONFIG_NS_ID","Acrobat","acrobat7","autoSave","common","validateApprovalSignatures","submitUrl","Acrobat7","dynamicRender","ADBE_JSConsole","ADBE_JSDebugger","AddSilentPrint","AddViewerPreferences","AdjustData","AdobeExtensionLevel","Agent","AlwaysEmbed","Amd","Attributes","AutoSave","Base","BatchOutput","BehaviorOverride","Cache","templateCache","Change","Common","messaging","suppressBanner","validationMessaging","versionControl","Compress","CompressLogicalStructure","CompressObjectStream","Compression","compressLogicalStructure","compressObjectStream","Config","acrobat","present","trace","agent","Conformance","ContentCopy","Copies","Creator","CurrentPage","Data","adjustData","incrementalLoad","outputXSL","startNode","window","xsl","excludeNS","Debug","DefaultTypeface","writingScript","Destination","DocumentAssembly","Driver","DuplexOption","DynamicRender","Embed","encryptionLevel","EncryptionLevel","Enforce","Equate","force","to","EquateRange","_unicodeRange","unicodeRange","unicodeRegex","Exclude","ExcludeNS","FlipLabel","embed","subsetBelow","alwaysEmbed","defaultTypeface","neverEmbed","FormFieldFilling","GroupParent","IfEmpty","IncludeXDPContent","IncrementalLoad","IncrementalMerge","Interactive","Jog","LabelPrinter","batchOutput","flipLabel","Layout","Level","Linearized","Locale","LocaleSet","Log","threshold","MapElement","equate","equateRange","MediumInfo","msgId","severity","Messaging","Mode","ModifyAnnots","MsgId","NameAttr","NeverEmbed","NumberOfCopies","OpenAction","destination","Output","OutputBin","OutputXSL","Overprint","Packets","PageOffset","PageRange","Pagination","PaginationOverride","Part","Pcl","jog","mediumInfo","outputBin","pageOffset","staple","Pdf","adobeExtensionLevel","interactive","linearized","pdfa","producer","renderPolicy","scriptModel","silentPrint","submitFormat","tagged","Pdfa","amd","conformance","includeXDPContent","Permissions","accessibleContent","change","contentCopy","documentAssembly","formFieldFilling","modifyAnnots","plaintextMetadata","printHighQuality","PickTrayByPDFSize","PlaintextMetadata","Presence","Present","behaviorOverride","copies","incrementalMerge","overprint","pagination","paginationOverride","driver","labelPrinter","pcl","webClient","zpl","Print","PrintHighQuality","PrintScaling","PrinterName","Producer","Ps","Range","Record","Relevant","Rename","RenderPolicy","RunScripts","currentPage","exclude","runScripts","ScriptModel","Severity","SilentPrint","addSilentPrint","printerName","Staple","StartNode","StartPage","SubmitFormat","SubmitUrl","SubsetBelow","SuppressBanner","Tagged","startPage","Threshold","To","TemplateCache","maxEntries","Trace","Transform","groupParent","ifEmpty","nameAttr","rename","whitespace","Uri","ValidateApprovalSignatures","ValidationMessaging","Version","VersionControl","outputBelow","sourceAbove","sourceBelow","ViewerPreferences","addViewerPreferences","duplexOption","enforce","numberOfCopies","pageRange","pickTrayByPDFSize","printScaling","WebClient","Whitespace","Window","pair","Xdc","Xdp","packets","Xsl","debug","Zpl","ConfigNamespace","compress","CONNECTION_SET_NS_ID","ConnectionSet","wsdlConnection","xmlConnection","xsdConnection","EffectiveInputPolicy","EffectiveOutputPolicy","Operation","RootElement","SoapAction","SoapAddress","WsdlAddress","WsdlConnection","dataDescription","effectiveInputPolicy","effectiveOutputPolicy","soapAction","soapAddress","wsdlAddress","XmlConnection","XsdConnection","rootElement","ConnectionSetNamespace","DATASETS_NS_ID","Datasets","DatasetsNamespace","LOCALE_SET_NS_ID","CalendarSymbols","dayNames","eraNames","meridiemNames","monthNames","CurrencySymbol","CurrencySymbols","currencySymbol","DatePattern","DatePatterns","datePattern","DateTimeSymbols","Day","DayNames","abbr","day","Era","EraNames","era","calendarSymbols","currencySymbols","datePatterns","dateTimeSymbols","numberPatterns","numberSymbols","timePatterns","typeFaces","Meridiem","MeridiemNames","meridiem","Month","MonthNames","month","NumberPattern","NumberPatterns","numberPattern","NumberSymbol","NumberSymbols","numberSymbol","TimePattern","TimePatterns","timePattern","TypeFace","TypeFaces","typeFace","LocaleSetNamespace","SIGNATURE_NS_ID","SignatureNamespace","STYLESHEET_NS_ID","Stylesheet","StylesheetNamespace","XDP_NS_ID","uuid","XdpNamespace","XHTML_NS_ID","$richText","VALID_STYLES","StyleMapping","original","spacesRegExp","crlfRegExp","crlfForRichTextRegExp","mapStyle","styleStr","richText","newValue","SUB_SUPER_SCRIPT_FACTOR","VERTICAL_FACTOR","checkStyle","NoWhites","XhtmlObject","mustPop","pushFont","Body","Br","Html","Li","Ol","siblings","Span","Sub","Sup","Ul","XhtmlNamespace","br","li","ol","span","sup","ul","NamespaceSetUp","UnknownNamespace","namespaceId","Root","Empty","Builder","rootNameSpace","_namespaceStack","_nsAgnosticLevel","_namespacePrefixes","_namespaces","_nextNsId","_currentNamespace","buildRoot","nsPrefix","namespace","prefixes","hasNamespaceDef","_searchNamespace","_addNamespacePrefix","dataTemplate","nsAttrs","xfaAttrs","nsToUse","_getNamespaceToUse","namespaceToUse","hasNamespace","nsAgnostic","isNsAgnostic","nsName","prefixStack","XFAParser","_builder","_globalData","_ids","_current","_whiteRegex","_nbsps","_richText","_mkAttributes","attributeObj","_getNameAndPrefix","attributesObj","XFAFactory","_createDocument","binder","dataHandler","_createPagesHelper","nextIteration","_createPages","dims","getBoundingBox","getNumPages","setImages","setFonts","missingFonts","appendFonts","getPages","serializeData","getRichTextAsHtml","rc","newRoot","attr","AnnotationFactory","createGlobals","ensureDoc","xfaDatasets","catalog","pdfDocument","annotationGlobals","collectFields","orphanFields","collectByType","_getPageIndex","ensure","_create","parameters","needAppearances","LinkAnnotation","TextAnnotation","fieldType","TextWidgetAnnotation","ButtonWidgetAnnotation","ChoiceWidgetAnnotation","SignatureWidgetAnnotation","WidgetAnnotation","PopupAnnotation","FreeTextAnnotation","LineAnnotation","SquareAnnotation","CircleAnnotation","PolylineAnnotation","PolygonAnnotation","CaretAnnotation","InkAnnotation","HighlightAnnotation","UnderlineAnnotation","SquigglyAnnotation","StrikeOutAnnotation","StampAnnotation","FileAttachmentAnnotation","RichMediaAnnotation","ScreenAnnotation","Annotation","annotDict","fetchIfRefAsync","annotations","annotRef","generateImages","imagePromises","bitmapId","saveNewAnnotations","annotation","deleted","annotationType","createNewAnnotation","quadPoints","smaskRef","printNewAnnotations","createNewPrintAnnotation","getRgbColor","defaultColor","getPdfColorArray","getQuadPoints","newQuadPoints","x4","y4","getTransformMatrix","_oc","setTitle","setContents","setModificationDate","setFlags","setRectangle","setColor","setBorderStyle","setAppearance","setOptionalContent","MK","setBorderAndBackgroundColors","setRotation","_streams","isLocked","isContentLocked","annotationFlags","contentsObj","_contents","hasAppearance","modificationDate","oc","hasOwnCanvas","noRotate","noHTML","isEditable","kidIds","fieldName","_constructFieldName","it","_isOffscreenCanvasSupported","_fallbackFontDict","_needAppearances","_getOperatorListNoAppearance","separateForm","separateCanvas","_hasFlag","_buildFlags","noView","noPrint","_isViewable","_isPrintable","mustBeViewed","_renderForms","viewable","mustBePrinted","printable","mustBeViewedWhenEditing","isEditing","modifiedIds","_parseStringHelper","setDefaultAppearance","defaultAppearance","_defaultAppearance","defaultAppearanceData","_title","contents","hasFlag","setLineEndings","lineEndings","mk","AnnotationBorderStyle","dictType","setWidth","setStyle","setDashArray","setHorizontalCornerRadius","setVerticalCornerRadius","appearanceStates","normalAppearanceState","#setOptionalContent","loadResources","_ownCanvasRequiresForms","isUsingOwnCanvas","appearanceDict","overlaysTextContent","hasTextContent","extractTextContent","firstPosition","trimEnd","textPosition","_transformPoint","getFieldObject","strokeColor","fillColor","loopDict","_getAttachmentId","fsDict","fsRef","rawWidth","horizontalCornerRadius","verticalCornerRadius","forceStyle","allZeros","validNumber","MarkupAnnotation","rawIRT","inReplyTo","rt","replyType","popupRef","titleObj","creationDate","setCreationDate","_setDefaultAppearance","blendMode","fillAlpha","pointsCallback","pointsArray","formDict","appearanceStream","gsDict","stateDict","annotationRef","ap","createNewAppearanceStream","annotationDict","apRef","createNewDict","retRef","popup","popupDict","newAnnotation","refToReplace","fieldValue","_decodeFormValue","defaultFieldValue","_hasValueFromXFA","alternativeText","acroFormResources","appearanceResources","_fieldResources","mergedResources","fieldFlags","password","hasFieldFlag","readOnly","formValue","renderForms","getBorderAndBackgroundAppearances","_hasText","_getAppearance","_getMKDict","amendSavedDict","setValue","newParentDict","originalDict","rawVal","maybeMK","newRef","AP","_getSaveFieldResources","rotationMatrix","formattedValue","combo","exportValue","displayValue","lineCount","defaultPadding","defaultHPadding","_getFontData","encodedLines","encodingError","encodedString","fakeUnicodeFont","newFont","oldFont","savedDefaultAppearance","_computeFontSize","defaultVPadding","textAlignment","_getMultilineAppearance","_getCombAppearance","bottomPadding","prevInfo","renderedText","_renderText","appearanceData","_getTextWidth","numberOfLines","roundWithTwoDigits","textWidth","cachedLines","isTooBig","fsize","_splitLine","hPadding","vPadding","shiftStr","localFont","acroFormFont","subFontDict","subResourcesDict","maximumLength","doNotScroll","AFDateTime","canUseHTMLDateTime","Keystroke","actionsToVisit","formatAction","isDate","datetimeFormat","datetimeType","timeStep","isRTL","combWidth","cells","reverse","hShift","previousWidth","renderedComb","lastSpacePosInStringStart","lastSpacePosInStringEnd","startChunk","allText","_m","multiline","charLimit","editable","hasDatetimeHTML","checkedAppearance","uncheckedAppearance","isRadio","isPushButton","checkBox","radioButton","pushButton","isTooltipOnly","_processCheckBox","_processRadioButton","_processPushButton","getOperatorListForAppearance","#getOperatorListForAppearance","savedAppearance","savedMatrix","setCanvasName","unchecked","buttonValue","_saveCheckbox","_saveRadioButton","_onStateName","_getDefaultCheckedAppearance","FONT_RATIO","xShift","yShift","_getOnStateName","normalAppearance","_getExportValueForOptIndex","opt","_getOptInfo","onState","stateToIndex","fieldParent","kidDict","kidOnState","_getExportValue","optInfo","customAppearance","asValue","yes","exportValues","otherYes","fieldParentValue","indices","hasIndices","isOptionArray","multiSelect","numItems","multipleSelection","valueIndices","numberOfVisibleLines","firstIndex","minIndex","maxIndex","vpadding","DEFAULT_ICON_SIZE","stateModel","parentItem","parentRect","parentFlags","oldAnnotation","_hasAppearance","user","freetext","da","helv","lineAscent","clipBox","lineCoordinates","interiorColor","borderAdjust","controlPointsDistance","xMid","yMid","xOffset","yOffset","vertices","rawVertices","inkLists","rawInkLists","inkList","outlines","ink","createNewAppearanceStreamForHighlight","appearanceBuffer","outline","c1x","c1y","c2x","c2y","xEnd","savedHasOwnCanvas","stamp","createNewAppearanceStreamForDrawing","#createNewAppearanceStreamForDrawing","areContours","isSignature","xobject","fileId","MediaAnnotation","MEDIA_MIME_TYPE_RE","_setMediaData","assetRef","assetDict","richMedia","_getContentType","ext","asset","findAsset","#findAsset","configurations","configRef","instanceRef","rawAsset","renditionActions","findRenditionAsset","#renditionActions","isPlayAction","aa","#isPlayAction","#findRenditionAsset","rendition","seen","findClipAsset","renditions","#findClipAsset","contentTypeHint","explicitType","PARAMS","calculateMD5","h0","h3","padded","rotateArg","decodeString","DatasetXMLParser","DatasetReader","SingleIntersector","extraChars","lastIntersectingQuadIndex","canTakeExtraChars","intersects","#intersects","disableExtraChars","setText","overlaidText","STEPS","Intersector","intersectors","grid","invXRatio","invYRatio","iMin","getGridIndex","iMax","#getGridIndex","Word64","highInteger","lowInteger","word","shiftRight","places","rotateRight","lowAdd","highAdd","copyTo","maj","sigmaPrime","littleSigma","littleSigmaPrime","calculateSHA512","mode384","h4","h5","h6","h7","t2","calculateSHA384","rotr","calculateSHA256","DecryptStream","nextChunk","hasMoreData","ARCFourCipher","keyLength","encryptBlock","decryptBlock","NullCipher","AESBaseCipher","_s","_inv_s","_mix","_mixCol","bufferPosition","_expandKey","cipherKey","_decrypt","_keySize","_cyclesOfRepetition","s0","_encrypt","_decryptBlock2","finalize","sourceLength","iv","plain","_key","lastBlock","psLen","cipher","AES128Cipher","_rcon","rcon","t3","t4","AES256Cipher","PDFBase","_hash","userBytes","checkOwnerPassword","ownerValidationSalt","ownerPassword","hashData","checkUserPassword","userValidationSalt","userPassword","getOwnerKey","ownerKeySalt","ownerEncryption","getUserKey","userKeySalt","userEncryption","PDF17","PDF20","combinedLength","combinedArray","CipherTransform","cipherCache","embeddedFilterName","resolveCipher","stringFilterName","streamFilterName","getCipher","#getCipher","cryptFilterName","defaultFilterName","Cipher","cipherTransformDecryptStream","encryptString","pad","CipherTransformFactory","_defaultPasswordBytes","createEncryptionKey20","#createEncryptionKey20","revision","uBytes","perms","passwordLength","pdfAlgorithm","prepareKeyData","#prepareKeyData","hashDataSize","keyLengthInBytes","checkData","derivedKey","decodeUserPassword","#decodeUserPassword","buildObjectKey","#buildObjectKey","isAes","algorithm","cfDict","streamCryptoName","handlerDict","stmf","strf","eff","ownerBytes","fileIdBytes","passwordBytes","effCF","authEvent","decodedPassword","setPassword","createCipherTransform","cryptFilter","cfm","XRef","_xrefStms","_cacheMap","_pendingRefs","_newPersistentRefNum","_newTemporaryRefNum","_persistentRefsCache","resetNewTemporaryRef","setStartXRef","startXRef","startXRefQueue","trailerDict","readXRef","indexObjects","processXRefTable","tableState","entryNum","streamPos","parserBuf1","parserBuf2","readXRefTable","firstEntryNum","free","uncompressed","processXRefStream","byteWidths","streamState","entryRanges","readXRefStream","typeFieldWidth","offsetFieldWidth","generationFieldWidth","generation","typeByte","offsetByte","generationByte","TAB","PERCENT","readToken","skipUntil","skipped","gEndobjRegExp","gStartxrefRegExp","objRegExp","trailerBytes","startxrefBytes","xrefBytes","bufferStr","trailers","xrefStms","contentLength","updateEntries","xrefTagOffset","xrefStm","trailerDicts","isEncrypted","trailerError","_generationFallback","validPagesDict","pagesDict","pagesCount","startXRefParsedCache","getEntry","xrefEntry","fetchUncompressed","fetchCompressed","LETTER_SIZE_MEDIABOX","Page","resourcesPromise","globalIdFactory","xfaFactory","idCounters","_localIdFactory","createPartialEvaluator","#createPartialEvaluator","createAnnotationEvaluator","#getInheritableProperty","xfaData","box","mediaBox","cropBox","userUnit","onSubStreamError","#onSubStreamError","getContentStream","replaceIdByRef","#replaceIdByRef","deletedAnnotations","existingAnnotations","partialEvaluator","annotationsArray","deletedRef","_parsedAnnotations","getMergedResources","#getMergedResources","streamDict","contentStreamPromise","newAnnotsByPage","newAnnots","newAnnotationsPromise","annotationGlobalsPromise","missingBitmaps","annotationWithBitmaps","pageListPromise","contentStream","transparency","pageOpList","newAnnotations","findIndex","concat","intentAny","intentDisplay","intentPrint","opListPromises","opLists","langPromise","getStructTree","_parseStructTree","getAnnotationsData","annotationsData","textContentPromises","highlightedAnnotations","isVisible","annots","fieldObjects","annotationPromises","sortedAnnotations","popupAnnotations","widgetAnnotations","collectAnnotationsByType","cachedAnnotations","PDF_HEADER_SIGNATURE","STARTXREF_SIGNATURE","ENDOBJ_SIGNATURE","backwards","signatureEnd","PDFDocument","pagePromises","_globalIdFactory","docId","linearization","startXRefLength","checkHeader","parseStartXRef","hasOnlyDocumentSignatures","#hasOnlyDocumentSignatures","recursionDepth","RECURSION_LIMIT","isInvisible","_xfaStreams","enableXfa","formInfo","hasXfa","hasAcroForm","isPureXfa","htmlForXfa","loadXfaImages","#loadXfaImages","loadXfaFonts","#loadXfaFonts","parseFont","loadXfaResources","serializeXfaData","hasFields","hasSignatures","sigFlags","documentInfo","docInfo","PDFFormatVersion","Language","EncryptFilterName","IsLinearized","IsAcroFormPresent","IsXFAPresent","IsCollectionPresent","IsSignaturesPresent","infoDict","customValue","Custom","fingerprints","FINGERPRINT_FIRST_BYTES","EMPTY_FINGERPRINT","hashOriginal","hashModified","toHex","getLinearizationPage","#getLinearizationPage","cachedPromise","checkFirstPage","checkLastPage","pagesTree","reasonAll","fontFallback","collectFieldObjects","#collectFieldObjects","fieldRef","visitedRefs","partName","allFields","fieldPromises","allPromises","hasJSActions","_parseHasJSActions","catalogJsActions","fieldObject","calculationOrderIds","calculationOrder","toJSObject","firstCall","parseDocBaseUrl","BasePdfManager","_docBaseUrl","_docId","_password","ensureXRef","initDocument","requestLoadedStream","sendProgressiveData","updatePassword","terminate","LocalPdfManager","_loadedStreamPromise","NetworkPdfManager","streamManager","CallbackKind","DATA","StreamKind","CANCEL","CANCEL_COMPLETE","CLOSE","ENQUEUE","PULL","PULL_COMPLETE","START_COMPLETE","onFn","wrapReason","MessageHandler","messageAC","AbortController","sourceName","targetName","comObj","callbackId","streamId","streamSinks","streamControllers","callbackCapabilities","actionHandler","addEventListener","onMessage","signal","#onMessage","processStreamMessage","try","postMessage","createStreamSink","ah","sendWithStream","queueingStrategy","ReadableStream","controller","startCapability","startCall","pullCall","cancelCall","pull","pullCapability","cancel","cancelCapability","#createStreamSink","isCancelled","lastDesiredSize","sinkCapability","onPull","onCancel","#processStreamMessage","streamController","deleteStreamController","dataReason","#deleteStreamController","allSettled","destroy","writeObject","encryptRef","writeValue","writeDict","writeStream","isFilterZeroFlateDecode","isFilterZeroImageDecode","isFilterZeroCompressedObject","MIN_LENGTH_FOR_COMPRESSING","newFilter","newParams","writeArray","writeInt","writeString","computeMD5","filesize","xrefInfo","md5Buffer","infoMap","md5BufferLen","writeXFADataForAcroform","xml","nodePath","updateAcroform","hasXfaDatasetsEntry","xfaDatasetsRef","newXfa","updateXFA","xfaDataStream","getXRefTable","baseOffset","newRefs","indexes","getIndexes","indexesPosition","computeIDs","getXRefStreamTable","xrefTableData","maxGen","objStreamRef","maxGenSize","sizes","structSize","objOffset","fileIds","md5","getTrailerDict","useXrefStream","refForXrefTable","infoRef","writeChanges","incrementalUpdate","originalData","MAX_LEAVES_PER_PAGES_NODE","MAX_IN_NAME_TREE_NODE","PageData","documentData","pointingNamedDestinations","pagesMap","DocumentData","document","oldRefMapping","dedupNamedDestinations","usedNamedDestinations","postponedRefCopies","resourceStreamPromises","usedStructParents","oldStructParentMapping","idTree","classMap","namespaces","structTreeAF","structTreePronunciationLexicon","acroFormDefaultAppearance","acroFormDefaultResources","acroFormQ","hasSignatureAnnotations","fieldToParent","embeddedFiles","XRefWrapper","getNewRef","_getNewRef","PDFEditor","isSingleFile","newAnnotationsParams","primaryDocument","resourceStreamCache","currentDocument","oldPages","newPages","xrefWrapper","newRefCount","namesDict","namedDestinations","structTreeKids","acroFormNeedAppearances","acroFormSigFlags","acroFormCalculationOrder","outlineItems","useObjectStreams","author","newDict","objStreamRefs","cloneObject","#cloneObject","collectDependencies","#collectDependencies","mustClone","resourceStreamPath","existingRef","oldRef","isResourceStream","collectResourceStream","postponedActions","newObj","#isResourceStream","rawStreamBytes","#rawStreamBytes","serializeDict","#serializeDict","resourceStreamKey","#resourceStreamKey","dictStr","SAMPLE_SIZE","SAMPLE_COUNT","#collectResourceStream","pending","childPath","collected","cycleRef","dedupResourceStream","#dedupResourceStream","bucket","cloneStructTreeNode","#cloneStructTreeNode","parentStructRef","removedStructElements","dedupIDs","dedupClasses","dedupRoles","newKids","structElemIndices","pgRef","setAsSpan","newKidRef","newKid","newNodeRef","newNode","newClassName","newClassNames","roleName","newRoleName","stringId","newId","structElemRef","structElem","getFilteredPageIndices","#getFilteredPageIndices","includePages","excludePages","inc","exc","resolveInsertAfterIndices","#resolveInsertAfterIndices","pageInfos","counts","insertAfterList","pageIndices","insertAfter","hasContent","updatedPageInfos","maxExistingPos","existingInfo","insertPos","pageIndicesArr","infoIdx","extractPages","reservePageSlot","newPageIndex","docPageInfos","allDocumentData","imagesPromises","imageEntries","pageInfo","filteredPageIndices","collectDocumentData","collectValidDestinations","collectOutlineDestinations","collectPageLabels","postCollectPageData","findDuplicateNamedDestinations","setPostponedRefCopies","imageSlots","modalPageSize","imageEntry","makeImagePage","makePageCopy","fixPostponedRefCopies","mergeStructTrees","mergeAcroForms","buildOutline","collectEmbeddedFiles","writePDF","#collectDocumentData","#postCollectPageData","pageData","newAnnotationIndex","destString","annot","#setPostponedRefCopies","oldPageRef","#fixPostponedRefCopies","visitObject","#visitObject","#mergeStructTrees","newStructParentId","newParentTree","newStructParent","newIdTree","newClassMap","newRoleMap","newNamespaces","newStructTreeAF","newStructTreePronunciationLexicon","nodeRef","_id","classDict","mappedName","newMappedName","namespaceRef","newNamespace","afRef","lexiconRef","newParent","newParents","#collectValidDestinations","newDestinations","#findDuplicateNamedDestinations","getUniqueDestinationName","dedupedName","pointingDest","newName","fixNamedDestinations","#fixNamedDestinations","fixDestination","#collectOutlineDestinations","collect","isValidOutlineDest","#isValidOutlineDest","filterOutlineItems","#filterOutlineItems","filteredChildren","hasValidOwnDest","_documentData","#buildOutline","setOutlineItemDest","#setOutlineItemDest","itemDict","newDest","actionRef","makeOutline","#makeOutline","outlineRootRef","outlineRootDict","assignRefs","_ref","fillItems","totalCount","childCount","#mergeAcroForms","setAcroFormDefaultBasicValues","setAcroFormDefaultAppearance","setAcroFormQ","setAcroFormDefaultResources","newFields","fixFields","cloneFields","setAcroFormCalculationOrder","#setAcroFormQ","firstQ","firstDocData","#setAcroFormDefaultBasicValues","sf","#setAcroFormCalculationOrder","co","coRef","newCoRef","#setAcroFormDefaultAppearance","firstDA","#setAcroFormDefaultResources","firstDR","firstDRRef","dr","#fixFields","lastNonNullParent","#cloneFields","oldParentRef","daToFix","drToFix","lastData","oldKidRef","kidsArray","resourcesValuesCache","newResourcesRef","resKey","resValue","newResValue","#collectPageLabels","firstRealPage","labelsByPageIndex","oldPageIndices","stFirstIndex","newLabel","defaultLabel","newPageLabels","#makePageCopy","lastRef","boxName","newLastRef","pageObjectRefs","#modalPageSize","best","#makeImagePage","pageSize","pageW","pageH","DEFAULT_MARGIN_RATIO","availW","availH","imgW","imgH","drawW","drawH","tx","ty","xobjectDict","resourcesDict","contentsStream","contentsRef","makePageTree","#makePageTree","maxLeaves","kidsChunks","kidsRefs","makeNameNumTree","#makeNameNumTree","areNames","allEntries","keyA","keyB","localeCompare","treeRef","treeDict","isRoot","entriesChunks","entriesRefs","entriesRef","entriesDict","makePageLabelsTree","#makePageLabelsTree","pageLabelsRef","#collectEmbeddedFiles","docEmbeddedFiles","displayName","deduped","makeEmbeddedFilesTree","#makeEmbeddedFilesTree","namesRef","makeDestinationsTree","#makeDestinationsTree","makeStructTree","#makeStructTree","structTreeRef","idTreeRef","classMapRef","roleMapRef","namespacesRef","structTreeAFRef","structTreePronunciationLexiconRef","makeAcroForm","#makeAcroForm","makeRoot","#makeRoot","makeInfo","#makeInfo","oldInfoDict","makeEncrypt","#makeEncrypt","encryptDict","createChanges","#createChanges","createObjectStream","#createObjectStream","objRefs","streamBuffer","objOffsets","objStream","xrefTableRef","BasePDFStream","PDFStreamReader","PDFStreamRangeReader","_fullReader","_rangeReaders","_source","_progressiveDataLength","_loaded","getFullReader","BasePDFStreamReader","onProgress","_contentLength","_headersCapability","_isRangeSupported","_isStreamingSupported","_stream","_callOnProgress","headersReady","isRangeSupported","isStreamingSupported","BasePDFStreamRangeReader","PDFWorkerStream","PDFWorkerStreamReader","PDFWorkerStreamRangeReader","_reader","readableStream","getReader","WorkerTask","terminated","_capability","finished","finish","WorkerMessageHandler","initializeFromPort","setup","port","testMessageProcessed","createDocumentHandler","docParams","cancelXHRs","WorkerTasks","apiVersion","workerVersion","buildMsg","workerHandlerName","startWorkerTask","finishWorkerTask","loadDocument","getPdfManager","pdfManagerArgs","fullReader","newPdfManager","cachedChunks","readData","getPassword","setupDoc","onSuccess","doc","pdfInfo","onFailure","pdfManagerReady","refStr","passwordEx","pageIndexesToSkip","newDocumentId","pdfEditor","globalPromises","_structTreeRoot","newAnnotationPromises","newXrefInfo","pageId","operatorListInfo","waitOn","cleanupPromise","pdfjsWorker"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/pdfjs/web/cmaps/78-EUC-H.bcmap b/public/pdfjs/web/cmaps/78-EUC-H.bcmap
new file mode 100644
index 0000000..2655fc7
--- /dev/null
+++ b/public/pdfjs/web/cmaps/78-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/78-EUC-V.bcmap b/public/pdfjs/web/cmaps/78-EUC-V.bcmap
new file mode 100644
index 0000000..f1ed853
--- /dev/null
+++ b/public/pdfjs/web/cmaps/78-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/78-H.bcmap b/public/pdfjs/web/cmaps/78-H.bcmap
new file mode 100644
index 0000000..39e89d3
--- /dev/null
+++ b/public/pdfjs/web/cmaps/78-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/78-RKSJ-H.bcmap b/public/pdfjs/web/cmaps/78-RKSJ-H.bcmap
new file mode 100644
index 0000000..e4167cb
--- /dev/null
+++ b/public/pdfjs/web/cmaps/78-RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/78-RKSJ-V.bcmap b/public/pdfjs/web/cmaps/78-RKSJ-V.bcmap
new file mode 100644
index 0000000..50b1646
--- /dev/null
+++ b/public/pdfjs/web/cmaps/78-RKSJ-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/78-V.bcmap b/public/pdfjs/web/cmaps/78-V.bcmap
new file mode 100644
index 0000000..d7af99b
--- /dev/null
+++ b/public/pdfjs/web/cmaps/78-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap b/public/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap
new file mode 100644
index 0000000..37077d0
--- /dev/null
+++ b/public/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap b/public/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap
new file mode 100644
index 0000000..acf2323
--- /dev/null
+++ b/public/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap b/public/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap
new file mode 100644
index 0000000..2359bc5
--- /dev/null
+++ b/public/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap b/public/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap
new file mode 100644
index 0000000..af82938
--- /dev/null
+++ b/public/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap b/public/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap
new file mode 100644
index 0000000..780549d
--- /dev/null
+++ b/public/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap b/public/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap
new file mode 100644
index 0000000..bfd3119
--- /dev/null
+++ b/public/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap b/public/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap
new file mode 100644
index 0000000..25ef14a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap b/public/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap
new file mode 100644
index 0000000..02f713b
--- /dev/null
+++ b/public/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap b/public/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap
new file mode 100644
index 0000000..d08e0cc
--- /dev/null
+++ b/public/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Add-H.bcmap b/public/pdfjs/web/cmaps/Add-H.bcmap
new file mode 100644
index 0000000..59442ac
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Add-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Add-RKSJ-H.bcmap b/public/pdfjs/web/cmaps/Add-RKSJ-H.bcmap
new file mode 100644
index 0000000..a3065e4
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Add-RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Add-RKSJ-V.bcmap b/public/pdfjs/web/cmaps/Add-RKSJ-V.bcmap
new file mode 100644
index 0000000..040014c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Add-RKSJ-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Add-V.bcmap b/public/pdfjs/web/cmaps/Add-V.bcmap
new file mode 100644
index 0000000..2f816d3
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Add-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap b/public/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap
new file mode 100644
index 0000000..88ec04a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap b/public/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap
new file mode 100644
index 0000000..03a5014
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap b/public/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap
new file mode 100644
index 0000000..2aa9514
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap b/public/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap
new file mode 100644
index 0000000..86d8b8c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap b/public/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap
new file mode 100644
index 0000000..f50fc6c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap b/public/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap
new file mode 100644
index 0000000..6caf4a8
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap b/public/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap
new file mode 100644
index 0000000..b77fb07
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap b/public/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap
new file mode 100644
index 0000000..69d79a2
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-GB1-0.bcmap b/public/pdfjs/web/cmaps/Adobe-GB1-0.bcmap
new file mode 100644
index 0000000..3610108
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-GB1-0.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-GB1-1.bcmap b/public/pdfjs/web/cmaps/Adobe-GB1-1.bcmap
new file mode 100644
index 0000000..707bb10
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-GB1-1.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-GB1-2.bcmap b/public/pdfjs/web/cmaps/Adobe-GB1-2.bcmap
new file mode 100644
index 0000000..f7648cc
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-GB1-2.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-GB1-3.bcmap b/public/pdfjs/web/cmaps/Adobe-GB1-3.bcmap
new file mode 100644
index 0000000..8521458
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-GB1-3.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-GB1-4.bcmap b/public/pdfjs/web/cmaps/Adobe-GB1-4.bcmap
new file mode 100644
index 0000000..e40c63a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-GB1-4.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-GB1-5.bcmap b/public/pdfjs/web/cmaps/Adobe-GB1-5.bcmap
new file mode 100644
index 0000000..d7623b5
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-GB1-5.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap b/public/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap
new file mode 100644
index 0000000..7586525
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap b/public/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap
new file mode 100644
index 0000000..f0e94ec
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap b/public/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap
new file mode 100644
index 0000000..dad42c5
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap b/public/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap
new file mode 100644
index 0000000..090819a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap b/public/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap
new file mode 100644
index 0000000..087dfc1
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap b/public/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap
new file mode 100644
index 0000000..46aa9bf
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap b/public/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap
new file mode 100644
index 0000000..5b4b65c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap b/public/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap
new file mode 100644
index 0000000..e77d699
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap b/public/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap
new file mode 100644
index 0000000..128a141
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap b/public/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap
new file mode 100644
index 0000000..cef1a99
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap b/public/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap
new file mode 100644
index 0000000..11ffa36
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap b/public/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap
new file mode 100644
index 0000000..3172308
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap b/public/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap
new file mode 100644
index 0000000..f3371c0
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/B5-H.bcmap b/public/pdfjs/web/cmaps/B5-H.bcmap
new file mode 100644
index 0000000..beb4d22
--- /dev/null
+++ b/public/pdfjs/web/cmaps/B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/B5-V.bcmap b/public/pdfjs/web/cmaps/B5-V.bcmap
new file mode 100644
index 0000000..2d4f87d
--- /dev/null
+++ b/public/pdfjs/web/cmaps/B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/B5pc-H.bcmap b/public/pdfjs/web/cmaps/B5pc-H.bcmap
new file mode 100644
index 0000000..ce00131
--- /dev/null
+++ b/public/pdfjs/web/cmaps/B5pc-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/B5pc-V.bcmap b/public/pdfjs/web/cmaps/B5pc-V.bcmap
new file mode 100644
index 0000000..73b99ff
--- /dev/null
+++ b/public/pdfjs/web/cmaps/B5pc-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/CNS-EUC-H.bcmap b/public/pdfjs/web/cmaps/CNS-EUC-H.bcmap
new file mode 100644
index 0000000..61d1d0c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/CNS-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/CNS-EUC-V.bcmap b/public/pdfjs/web/cmaps/CNS-EUC-V.bcmap
new file mode 100644
index 0000000..1a393a5
--- /dev/null
+++ b/public/pdfjs/web/cmaps/CNS-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/CNS1-H.bcmap b/public/pdfjs/web/cmaps/CNS1-H.bcmap
new file mode 100644
index 0000000..f738e21
--- /dev/null
+++ b/public/pdfjs/web/cmaps/CNS1-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/CNS1-V.bcmap b/public/pdfjs/web/cmaps/CNS1-V.bcmap
new file mode 100644
index 0000000..9c3169f
--- /dev/null
+++ b/public/pdfjs/web/cmaps/CNS1-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/CNS2-H.bcmap b/public/pdfjs/web/cmaps/CNS2-H.bcmap
new file mode 100644
index 0000000..c89b352
--- /dev/null
+++ b/public/pdfjs/web/cmaps/CNS2-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/CNS2-V.bcmap b/public/pdfjs/web/cmaps/CNS2-V.bcmap
new file mode 100644
index 0000000..7588cec
--- /dev/null
+++ b/public/pdfjs/web/cmaps/CNS2-V.bcmap
@@ -0,0 +1,3 @@
+郣Copyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSE�CNS2-H
\ No newline at end of file
diff --git a/public/pdfjs/web/cmaps/ETHK-B5-H.bcmap b/public/pdfjs/web/cmaps/ETHK-B5-H.bcmap
new file mode 100644
index 0000000..cb29415
--- /dev/null
+++ b/public/pdfjs/web/cmaps/ETHK-B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/ETHK-B5-V.bcmap b/public/pdfjs/web/cmaps/ETHK-B5-V.bcmap
new file mode 100644
index 0000000..f09aec6
--- /dev/null
+++ b/public/pdfjs/web/cmaps/ETHK-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/ETen-B5-H.bcmap b/public/pdfjs/web/cmaps/ETen-B5-H.bcmap
new file mode 100644
index 0000000..c2d7746
--- /dev/null
+++ b/public/pdfjs/web/cmaps/ETen-B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/ETen-B5-V.bcmap b/public/pdfjs/web/cmaps/ETen-B5-V.bcmap
new file mode 100644
index 0000000..89bff15
--- /dev/null
+++ b/public/pdfjs/web/cmaps/ETen-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/ETenms-B5-H.bcmap b/public/pdfjs/web/cmaps/ETenms-B5-H.bcmap
new file mode 100644
index 0000000..a7d69db
--- /dev/null
+++ b/public/pdfjs/web/cmaps/ETenms-B5-H.bcmap
@@ -0,0 +1,3 @@
+郣Copyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSE�	ETen-B5-H` ^
\ No newline at end of file
diff --git a/public/pdfjs/web/cmaps/ETenms-B5-V.bcmap b/public/pdfjs/web/cmaps/ETenms-B5-V.bcmap
new file mode 100644
index 0000000..adc5d61
--- /dev/null
+++ b/public/pdfjs/web/cmaps/ETenms-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/EUC-H.bcmap b/public/pdfjs/web/cmaps/EUC-H.bcmap
new file mode 100644
index 0000000..e92ea5b
--- /dev/null
+++ b/public/pdfjs/web/cmaps/EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/EUC-V.bcmap b/public/pdfjs/web/cmaps/EUC-V.bcmap
new file mode 100644
index 0000000..7a7c183
--- /dev/null
+++ b/public/pdfjs/web/cmaps/EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Ext-H.bcmap b/public/pdfjs/web/cmaps/Ext-H.bcmap
new file mode 100644
index 0000000..3b5cde4
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Ext-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap b/public/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap
new file mode 100644
index 0000000..ea4d2d9
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap b/public/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap
new file mode 100644
index 0000000..3457c27
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Ext-V.bcmap b/public/pdfjs/web/cmaps/Ext-V.bcmap
new file mode 100644
index 0000000..4999ca4
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Ext-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GB-EUC-H.bcmap b/public/pdfjs/web/cmaps/GB-EUC-H.bcmap
new file mode 100644
index 0000000..e39908b
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GB-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GB-EUC-V.bcmap b/public/pdfjs/web/cmaps/GB-EUC-V.bcmap
new file mode 100644
index 0000000..d5be544
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GB-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GB-H.bcmap b/public/pdfjs/web/cmaps/GB-H.bcmap
new file mode 100644
index 0000000..39189c5
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GB-H.bcmap
@@ -0,0 +1,4 @@
+郣Copyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSE!!伜]aX!!]`�21�>	乸亃�$]��"R俤�-U�7�*�
4�%�+ 刏 剓�/�%�<�9K卋�1]�.�"�塦]�,�"]�
+�"]坔�"]塅�"]�$�"]��"]媊�"]�>�"]��"]峼�"]嶺�"]�6�"]��"]恟�"]慞�"]�.�"]��"]搄�"]擧�"]�&�"]��"]朾�"]桜�"]��"]榺�"]橺�"]�8�"]��"]泃�"]淩�"]�0�"]��"]瀕�"]烰�"]�(�"]��"]�"]�"]� �"X�']�"]�5�"]��"]�"]�"]�-�"]��"]﹊�"]狦�"]�%�"]��"]琣�"]�?�"]��"]畕�"]痀�"]�7�"]��"]眘�"]睶�"]�/�"]�
�"]磌�"]礗�"]�'�"]��"]穋�"]窤�"]��"]箎�"]篬�"]�9
\ No newline at end of file
diff --git a/public/pdfjs/web/cmaps/GB-V.bcmap b/public/pdfjs/web/cmaps/GB-V.bcmap
new file mode 100644
index 0000000..3108345
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GB-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBK-EUC-H.bcmap b/public/pdfjs/web/cmaps/GBK-EUC-H.bcmap
new file mode 100644
index 0000000..05fff7e
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBK-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBK-EUC-V.bcmap b/public/pdfjs/web/cmaps/GBK-EUC-V.bcmap
new file mode 100644
index 0000000..0cdf6be
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBK-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBK2K-H.bcmap b/public/pdfjs/web/cmaps/GBK2K-H.bcmap
new file mode 100644
index 0000000..46f6ba5
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBK2K-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBK2K-V.bcmap b/public/pdfjs/web/cmaps/GBK2K-V.bcmap
new file mode 100644
index 0000000..d9a9479
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBK2K-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBKp-EUC-H.bcmap b/public/pdfjs/web/cmaps/GBKp-EUC-H.bcmap
new file mode 100644
index 0000000..5cb0af6
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBKp-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBKp-EUC-V.bcmap b/public/pdfjs/web/cmaps/GBKp-EUC-V.bcmap
new file mode 100644
index 0000000..bca93b8
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBKp-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBT-EUC-H.bcmap b/public/pdfjs/web/cmaps/GBT-EUC-H.bcmap
new file mode 100644
index 0000000..4b4e2d3
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBT-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBT-EUC-V.bcmap b/public/pdfjs/web/cmaps/GBT-EUC-V.bcmap
new file mode 100644
index 0000000..38f7066
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBT-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBT-H.bcmap b/public/pdfjs/web/cmaps/GBT-H.bcmap
new file mode 100644
index 0000000..8437ac3
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBT-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBT-V.bcmap b/public/pdfjs/web/cmaps/GBT-V.bcmap
new file mode 100644
index 0000000..697ab4a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBT-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap b/public/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap
new file mode 100644
index 0000000..f6e50e8
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap b/public/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap
new file mode 100644
index 0000000..6c0d71a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBpc-EUC-H.bcmap b/public/pdfjs/web/cmaps/GBpc-EUC-H.bcmap
new file mode 100644
index 0000000..c9edf67
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBpc-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/GBpc-EUC-V.bcmap b/public/pdfjs/web/cmaps/GBpc-EUC-V.bcmap
new file mode 100644
index 0000000..31450c9
--- /dev/null
+++ b/public/pdfjs/web/cmaps/GBpc-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/H.bcmap b/public/pdfjs/web/cmaps/H.bcmap
new file mode 100644
index 0000000..7b24ea4
--- /dev/null
+++ b/public/pdfjs/web/cmaps/H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKdla-B5-H.bcmap b/public/pdfjs/web/cmaps/HKdla-B5-H.bcmap
new file mode 100644
index 0000000..7d30c05
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKdla-B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKdla-B5-V.bcmap b/public/pdfjs/web/cmaps/HKdla-B5-V.bcmap
new file mode 100644
index 0000000..7894694
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKdla-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKdlb-B5-H.bcmap b/public/pdfjs/web/cmaps/HKdlb-B5-H.bcmap
new file mode 100644
index 0000000..d829a23
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKdlb-B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKdlb-B5-V.bcmap b/public/pdfjs/web/cmaps/HKdlb-B5-V.bcmap
new file mode 100644
index 0000000..2b572b5
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKdlb-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKgccs-B5-H.bcmap b/public/pdfjs/web/cmaps/HKgccs-B5-H.bcmap
new file mode 100644
index 0000000..971a4f2
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKgccs-B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKgccs-B5-V.bcmap b/public/pdfjs/web/cmaps/HKgccs-B5-V.bcmap
new file mode 100644
index 0000000..d353ca2
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKgccs-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKm314-B5-H.bcmap b/public/pdfjs/web/cmaps/HKm314-B5-H.bcmap
new file mode 100644
index 0000000..576dc01
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKm314-B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKm314-B5-V.bcmap b/public/pdfjs/web/cmaps/HKm314-B5-V.bcmap
new file mode 100644
index 0000000..0e96d0e
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKm314-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKm471-B5-H.bcmap b/public/pdfjs/web/cmaps/HKm471-B5-H.bcmap
new file mode 100644
index 0000000..11d170c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKm471-B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKm471-B5-V.bcmap b/public/pdfjs/web/cmaps/HKm471-B5-V.bcmap
new file mode 100644
index 0000000..54959bf
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKm471-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKscs-B5-H.bcmap b/public/pdfjs/web/cmaps/HKscs-B5-H.bcmap
new file mode 100644
index 0000000..6ef7857
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKscs-B5-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/HKscs-B5-V.bcmap b/public/pdfjs/web/cmaps/HKscs-B5-V.bcmap
new file mode 100644
index 0000000..1fb2fa2
--- /dev/null
+++ b/public/pdfjs/web/cmaps/HKscs-B5-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Hankaku.bcmap b/public/pdfjs/web/cmaps/Hankaku.bcmap
new file mode 100644
index 0000000..4b8ec7f
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Hankaku.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Hiragana.bcmap b/public/pdfjs/web/cmaps/Hiragana.bcmap
new file mode 100644
index 0000000..17e983e
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Hiragana.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSC-EUC-H.bcmap b/public/pdfjs/web/cmaps/KSC-EUC-H.bcmap
new file mode 100644
index 0000000..a45c65f
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSC-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSC-EUC-V.bcmap b/public/pdfjs/web/cmaps/KSC-EUC-V.bcmap
new file mode 100644
index 0000000..0e7b21f
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSC-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSC-H.bcmap b/public/pdfjs/web/cmaps/KSC-H.bcmap
new file mode 100644
index 0000000..b9b22b6
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSC-Johab-H.bcmap b/public/pdfjs/web/cmaps/KSC-Johab-H.bcmap
new file mode 100644
index 0000000..2531ffc
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSC-Johab-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSC-Johab-V.bcmap b/public/pdfjs/web/cmaps/KSC-Johab-V.bcmap
new file mode 100644
index 0000000..367ceb2
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSC-Johab-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSC-V.bcmap b/public/pdfjs/web/cmaps/KSC-V.bcmap
new file mode 100644
index 0000000..6ae2f0b
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSCms-UHC-H.bcmap b/public/pdfjs/web/cmaps/KSCms-UHC-H.bcmap
new file mode 100644
index 0000000..a8d4240
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSCms-UHC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap b/public/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap
new file mode 100644
index 0000000..8b4ae18
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap b/public/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap
new file mode 100644
index 0000000..b655dbc
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSCms-UHC-V.bcmap b/public/pdfjs/web/cmaps/KSCms-UHC-V.bcmap
new file mode 100644
index 0000000..21f97f6
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSCms-UHC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap b/public/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap
new file mode 100644
index 0000000..e06f361
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap b/public/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap
new file mode 100644
index 0000000..f3c9113
--- /dev/null
+++ b/public/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Katakana.bcmap b/public/pdfjs/web/cmaps/Katakana.bcmap
new file mode 100644
index 0000000..524303c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Katakana.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/LICENSE b/public/pdfjs/web/cmaps/LICENSE
new file mode 100644
index 0000000..b1ad168
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/cmaps/NWP-H.bcmap b/public/pdfjs/web/cmaps/NWP-H.bcmap
new file mode 100644
index 0000000..afc5e4b
--- /dev/null
+++ b/public/pdfjs/web/cmaps/NWP-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/NWP-V.bcmap b/public/pdfjs/web/cmaps/NWP-V.bcmap
new file mode 100644
index 0000000..bb5785e
--- /dev/null
+++ b/public/pdfjs/web/cmaps/NWP-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/RKSJ-H.bcmap b/public/pdfjs/web/cmaps/RKSJ-H.bcmap
new file mode 100644
index 0000000..fb8d298
--- /dev/null
+++ b/public/pdfjs/web/cmaps/RKSJ-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/RKSJ-V.bcmap b/public/pdfjs/web/cmaps/RKSJ-V.bcmap
new file mode 100644
index 0000000..a2555a6
--- /dev/null
+++ b/public/pdfjs/web/cmaps/RKSJ-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/Roman.bcmap b/public/pdfjs/web/cmaps/Roman.bcmap
new file mode 100644
index 0000000..f896dcf
--- /dev/null
+++ b/public/pdfjs/web/cmaps/Roman.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap b/public/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap
new file mode 100644
index 0000000..d5db27c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap b/public/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap
new file mode 100644
index 0000000..1dc9b7a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap b/public/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap
new file mode 100644
index 0000000..961afef
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap b/public/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap
new file mode 100644
index 0000000..df0cffe
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap b/public/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap
new file mode 100644
index 0000000..1ab18a1
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap b/public/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap
new file mode 100644
index 0000000..ad14662
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap b/public/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap
new file mode 100644
index 0000000..83c6bd7
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap b/public/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap
new file mode 100644
index 0000000..22a27e4
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap b/public/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap
new file mode 100644
index 0000000..5bd6228
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap b/public/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap
new file mode 100644
index 0000000..53c534b
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap b/public/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap
new file mode 100644
index 0000000..b95045b
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap b/public/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap
new file mode 100644
index 0000000..51f023e
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap b/public/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap
new file mode 100644
index 0000000..f0dbd14
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap b/public/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap
new file mode 100644
index 0000000..ce9c30a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap b/public/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap
new file mode 100644
index 0000000..982ca46
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap b/public/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap
new file mode 100644
index 0000000..f78020d
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap b/public/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap
new file mode 100644
index 0000000..7daf56a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap b/public/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap
new file mode 100644
index 0000000..ac9975c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap b/public/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap
new file mode 100644
index 0000000..3da0a1c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap b/public/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap
new file mode 100644
index 0000000..c50b9dd
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap b/public/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap
new file mode 100644
index 0000000..6761344
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap b/public/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap
new file mode 100644
index 0000000..70bf90c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap b/public/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap
new file mode 100644
index 0000000..7a83d53
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap b/public/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap
new file mode 100644
index 0000000..7a87135
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap b/public/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap
new file mode 100644
index 0000000..9f0334c
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap b/public/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap
new file mode 100644
index 0000000..808a94f
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap b/public/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap
new file mode 100644
index 0000000..d768bf8
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap b/public/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap
new file mode 100644
index 0000000..3d5bf6f
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap b/public/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap
new file mode 100644
index 0000000..09eee10
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap b/public/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap
new file mode 100644
index 0000000..6c54600
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap b/public/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap
new file mode 100644
index 0000000..1b1a64f
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap b/public/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap
new file mode 100644
index 0000000..994aa9e
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap b/public/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap
new file mode 100644
index 0000000..643f921
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap b/public/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap
new file mode 100644
index 0000000..c148f67
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap b/public/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap
new file mode 100644
index 0000000..1849d80
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap b/public/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap
new file mode 100644
index 0000000..a83a677
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap b/public/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap
new file mode 100644
index 0000000..f527248
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap b/public/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap
new file mode 100644
index 0000000..e1a988d
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap b/public/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap
new file mode 100644
index 0000000..47e054a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap b/public/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap
new file mode 100644
index 0000000..b5b9485
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap b/public/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap
new file mode 100644
index 0000000..026adca
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap b/public/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap
new file mode 100644
index 0000000..fd4e66e
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap b/public/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap
new file mode 100644
index 0000000..075efb7
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap b/public/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap
new file mode 100644
index 0000000..769d214
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap b/public/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap
new file mode 100644
index 0000000..bdab208
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap b/public/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap
new file mode 100644
index 0000000..6ff8674
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap b/public/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap
new file mode 100644
index 0000000..8dfa76a
--- /dev/null
+++ b/public/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/V.bcmap b/public/pdfjs/web/cmaps/V.bcmap
new file mode 100644
index 0000000..fdec990
--- /dev/null
+++ b/public/pdfjs/web/cmaps/V.bcmap
Binary files differ
diff --git a/public/pdfjs/web/cmaps/WP-Symbol.bcmap b/public/pdfjs/web/cmaps/WP-Symbol.bcmap
new file mode 100644
index 0000000..46729bb
--- /dev/null
+++ b/public/pdfjs/web/cmaps/WP-Symbol.bcmap
Binary files differ
diff --git a/public/pdfjs/web/compressed.tracemonkey-pldi-09.pdf b/public/pdfjs/web/compressed.tracemonkey-pldi-09.pdf
new file mode 100644
index 0000000..6557018
--- /dev/null
+++ b/public/pdfjs/web/compressed.tracemonkey-pldi-09.pdf
Binary files differ
diff --git a/public/pdfjs/web/debugger.css b/public/pdfjs/web/debugger.css
new file mode 100644
index 0000000..7405844
--- /dev/null
+++ b/public/pdfjs/web/debugger.css
@@ -0,0 +1,145 @@
+/* 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.
+ */
+
+:root {
+  --panel-width: 300px;
+}
+
+#PDFBug,
+#PDFBug :is(input, button, select) {
+  font: message-box;
+}
+#PDFBug {
+  color-scheme: only light;
+
+  background-color: white;
+  color: black;
+  border: 1px solid rgb(102 102 102);
+  position: fixed;
+  top: 32px;
+  right: 0;
+  bottom: 0;
+  font-size: 10px;
+  padding: 0;
+  width: var(--panel-width);
+}
+#PDFBug .controls {
+  background: rgb(238 238 238);
+  border-bottom: 1px solid rgb(102 102 102);
+  padding: 3px;
+}
+#PDFBug .panels {
+  inset: 27px 0 0;
+  overflow: auto;
+  position: absolute;
+}
+#PDFBug .panels > div {
+  padding: 5px;
+}
+#PDFBug button.active {
+  font-weight: bold;
+}
+.debuggerShowText,
+.debuggerHideText:hover {
+  background-color: rgb(255 255 0 / 0.25);
+}
+#PDFBug .stats {
+  font-family: courier;
+  font-size: 10px;
+  white-space: pre;
+}
+#PDFBug .stats .title {
+  font-weight: bold;
+}
+#PDFBug table {
+  font-size: 10px;
+  white-space: pre;
+}
+#PDFBug table.showText {
+  border-collapse: collapse;
+  text-align: center;
+}
+#PDFBug table.showText,
+#PDFBug table.showText :is(tr, td) {
+  border: 1px solid black;
+  padding: 1px;
+}
+#PDFBug table.showText td.advance {
+  color: grey;
+}
+
+#viewer.textLayer-visible .textLayer {
+  opacity: 1;
+}
+
+#viewer.textLayer-visible .canvasWrapper {
+  background-color: rgb(128 255 128);
+}
+
+#viewer.textLayer-visible .canvasWrapper canvas {
+  mix-blend-mode: screen;
+}
+
+#viewer.textLayer-visible .textLayer span {
+  background-color: rgb(255 255 0 / 0.1);
+  color: rgb(0 0 0);
+  border: solid 1px rgb(255 0 0 / 0.5);
+  box-sizing: border-box;
+}
+
+#viewer.textLayer-visible .textLayer span[aria-owns] {
+  background-color: rgb(255 0 0 / 0.3);
+}
+
+#viewer.textLayer-hover .textLayer span:hover {
+  background-color: rgb(255 255 255);
+  color: rgb(0 0 0);
+}
+
+#viewer.textLayer-shadow .textLayer span {
+  background-color: rgb(255 255 255 / 0.6);
+  color: rgb(0 0 0);
+}
+
+.pdfBugGroupsLayer {
+  position: absolute;
+  inset: 0;
+  pointer-events: none;
+
+  > * {
+    position: absolute;
+    outline-color: red;
+    outline-width: 2px;
+
+    --hover-outline-style: solid !important;
+    --hover-background-color: rgb(255 0 0 / 0.2);
+
+    &:hover {
+      outline-style: var(--hover-outline-style);
+      background-color: var(--hover-background-color);
+      cursor: pointer;
+    }
+
+    .showDebugBoxes & {
+      outline-style: dashed;
+    }
+  }
+}
+
+.showDebugBoxes {
+  .pdfBugGroupsLayer {
+    pointer-events: all;
+  }
+}
diff --git a/public/pdfjs/web/debugger.mjs b/public/pdfjs/web/debugger.mjs
new file mode 100644
index 0000000..5f6fd2b
--- /dev/null
+++ b/public/pdfjs/web/debugger.mjs
@@ -0,0 +1,841 @@
+/* Copyright 2012 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.
+ */
+
+const { OPS } = globalThis.pdfjsLib || (await import("pdfjs-lib"));
+
+const opMap = Object.create(null);
+for (const key in OPS) {
+  opMap[OPS[key]] = key;
+}
+
+const FontInspector = (function FontInspectorClosure() {
+  let fonts;
+  let active = false;
+  const fontAttribute = "data-font-name";
+  function removeSelection() {
+    const divs = document.querySelectorAll(`span[${fontAttribute}]`);
+    for (const div of divs) {
+      div.className = "";
+    }
+  }
+  function resetSelection() {
+    const divs = document.querySelectorAll(`span[${fontAttribute}]`);
+    for (const div of divs) {
+      div.className = "debuggerHideText";
+    }
+  }
+  function selectFont(fontName, show) {
+    const divs = document.querySelectorAll(
+      `span[${fontAttribute}=${fontName}]`
+    );
+    for (const div of divs) {
+      div.className = show ? "debuggerShowText" : "debuggerHideText";
+    }
+  }
+  function textLayerClick(e) {
+    if (
+      !e.target.dataset.fontName ||
+      e.target.tagName.toUpperCase() !== "SPAN"
+    ) {
+      return;
+    }
+    const fontName = e.target.dataset.fontName;
+    const selects = document.getElementsByTagName("input");
+    for (const select of selects) {
+      if (select.dataset.fontName !== fontName) {
+        continue;
+      }
+      select.checked = !select.checked;
+      selectFont(fontName, select.checked);
+      select.scrollIntoView();
+    }
+  }
+  return {
+    // Properties/functions needed by PDFBug.
+    id: "FontInspector",
+    name: "Font Inspector",
+    panel: null,
+    manager: null,
+    init() {
+      const panel = this.panel;
+      const tmp = document.createElement("button");
+      tmp.addEventListener("click", resetSelection);
+      tmp.textContent = "Refresh";
+      panel.append(tmp);
+
+      fonts = document.createElement("div");
+      panel.append(fonts);
+    },
+    cleanup() {
+      fonts.textContent = "";
+    },
+    enabled: false,
+    get active() {
+      return active;
+    },
+    set active(value) {
+      active = value;
+      if (active) {
+        document.body.addEventListener("click", textLayerClick, true);
+        resetSelection();
+      } else {
+        document.body.removeEventListener("click", textLayerClick, true);
+        removeSelection();
+      }
+    },
+    // FontInspector specific functions.
+    fontAdded(fontObj, url) {
+      function properties(obj, list) {
+        const moreInfo = document.createElement("table");
+        for (const entry of list) {
+          const tr = document.createElement("tr");
+          const td1 = document.createElement("td");
+          td1.textContent = entry;
+          tr.append(td1);
+          const td2 = document.createElement("td");
+          td2.textContent = obj[entry].toString();
+          tr.append(td2);
+          moreInfo.append(tr);
+        }
+        return moreInfo;
+      }
+
+      const moreInfo = fontObj.css
+        ? properties(fontObj, ["baseFontName"])
+        : properties(fontObj, ["name", "type"]);
+
+      const fontName = fontObj.loadedName;
+      const font = document.createElement("div");
+      const name = document.createElement("span");
+      name.textContent = fontName;
+      let download;
+      if (!fontObj.css) {
+        download = document.createElement("a");
+        if (url) {
+          url = /url\(['"]?([^)"']+)/.exec(url);
+          download.href = url[1];
+        } else if (fontObj.data) {
+          download.href = URL.createObjectURL(
+            new Blob([fontObj.data], { type: fontObj.mimetype })
+          );
+        }
+        download.textContent = "Download";
+      }
+
+      const logIt = document.createElement("a");
+      logIt.href = "";
+      logIt.textContent = "Log";
+      logIt.addEventListener("click", function (event) {
+        event.preventDefault();
+        console.log(fontObj);
+      });
+      const select = document.createElement("input");
+      select.setAttribute("type", "checkbox");
+      select.dataset.fontName = fontName;
+      select.addEventListener("click", function () {
+        selectFont(fontName, select.checked);
+      });
+      if (download) {
+        font.append(select, name, " ", download, " ", logIt, moreInfo);
+      } else {
+        font.append(select, name, " ", logIt, moreInfo);
+      }
+      fonts.append(font);
+      // Somewhat of a hack, should probably add a hook for when the text layer
+      // is done rendering.
+      setTimeout(() => {
+        if (this.active) {
+          resetSelection();
+        }
+      }, 2000);
+    },
+  };
+})();
+
+// Manages all the page steppers.
+const StepperManager = (function StepperManagerClosure() {
+  let steppers = [];
+  let stepperDiv = null;
+  let stepperControls = null;
+  let stepperChooser = null;
+  let breakPoints = Object.create(null);
+  return {
+    // Properties/functions needed by PDFBug.
+    id: "Stepper",
+    name: "Stepper",
+    panel: null,
+    manager: null,
+    init() {
+      const self = this;
+      stepperControls = document.createElement("div");
+      stepperChooser = document.createElement("select");
+      stepperChooser.addEventListener("change", function (event) {
+        self.selectStepper(this.value);
+      });
+      stepperControls.append(stepperChooser);
+      stepperDiv = document.createElement("div");
+      this.panel.append(stepperControls, stepperDiv);
+      if (sessionStorage.getItem("pdfjsBreakPoints")) {
+        breakPoints = JSON.parse(sessionStorage.getItem("pdfjsBreakPoints"));
+      }
+    },
+    cleanup() {
+      stepperChooser.textContent = "";
+      stepperDiv.textContent = "";
+      steppers = [];
+    },
+    enabled: false,
+    active: false,
+    // Stepper specific functions.
+    create(pageIndex) {
+      const pageContainer = document.querySelector(
+        `#viewer div[data-page-number="${pageIndex + 1}"]`
+      );
+
+      const debug = document.createElement("div");
+      debug.id = "stepper" + pageIndex;
+      debug.hidden = true;
+      debug.className = "stepper";
+      stepperDiv.append(debug);
+      const b = document.createElement("option");
+      b.textContent = "Page " + (pageIndex + 1);
+      b.value = pageIndex;
+      stepperChooser.append(b);
+      const initBreakPoints = breakPoints[pageIndex] || [];
+      const stepper = new Stepper(
+        debug,
+        pageIndex,
+        initBreakPoints,
+        pageContainer
+      );
+      steppers.push(stepper);
+      if (steppers.length === 1) {
+        this.selectStepper(pageIndex, false);
+      }
+      return stepper;
+    },
+    selectStepper(pageIndex, selectPanel) {
+      pageIndex |= 0;
+      if (selectPanel) {
+        this.manager.selectPanel(this);
+      }
+      for (const stepper of steppers) {
+        stepper.panel.hidden = stepper.pageIndex !== pageIndex;
+      }
+      for (const option of stepperChooser.options) {
+        option.selected = (option.value | 0) === pageIndex;
+      }
+    },
+    saveBreakPoints(pageIndex, bps) {
+      breakPoints[pageIndex] = bps;
+      sessionStorage.setItem("pdfjsBreakPoints", JSON.stringify(breakPoints));
+    },
+  };
+})();
+
+// The stepper for each page's operatorList.
+class Stepper {
+  // Shorter way to create element and optionally set textContent.
+  #c(tag, textContent) {
+    const d = document.createElement(tag);
+    if (textContent) {
+      d.textContent = textContent;
+    }
+    return d;
+  }
+
+  #simplifyArgs(args) {
+    if (typeof args === "string") {
+      const MAX_STRING_LENGTH = 75;
+      return args.length <= MAX_STRING_LENGTH
+        ? args
+        : args.substring(0, MAX_STRING_LENGTH) + "...";
+    }
+    if (typeof args !== "object" || args === null) {
+      return args;
+    }
+    if ("length" in args) {
+      // array
+      const MAX_ITEMS = 10,
+        simpleArgs = [];
+      let i, ii;
+      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
+        simpleArgs.push(this.#simplifyArgs(args[i]));
+      }
+      if (i < args.length) {
+        simpleArgs.push("...");
+      }
+      return simpleArgs;
+    }
+    const simpleObj = {};
+    for (const key in args) {
+      simpleObj[key] = this.#simplifyArgs(args[key]);
+    }
+    return simpleObj;
+  }
+
+  constructor(panel, pageIndex, initialBreakPoints, pageContainer) {
+    this.panel = panel;
+    this.breakPoint = 0;
+    this.nextBreakPoint = null;
+    this.pageIndex = pageIndex;
+    this.breakPoints = initialBreakPoints;
+    this.currentIdx = -1;
+    this.operatorListIdx = 0;
+    this.indentLevel = 0;
+    this.operatorsGroups = null;
+    this.pageContainer = pageContainer;
+  }
+
+  init(operatorList) {
+    const panel = this.panel;
+    const content = this.#c("div", "c=continue, s=step");
+
+    const showBoxesToggle = this.#c("label", "Show bounding boxes");
+    const showBoxesCheckbox = this.#c("input");
+    showBoxesCheckbox.type = "checkbox";
+    showBoxesToggle.prepend(showBoxesCheckbox);
+    content.append(this.#c("br"), showBoxesToggle);
+
+    const table = this.#c("table");
+    content.append(table);
+    table.cellSpacing = 0;
+    const headerRow = this.#c("tr");
+    table.append(headerRow);
+    headerRow.append(
+      this.#c("th", "Break"),
+      this.#c("th", "Idx"),
+      this.#c("th", "fn"),
+      this.#c("th", "args")
+    );
+    panel.append(content);
+    this.table = table;
+    this.updateOperatorList(operatorList);
+
+    const hoverStyle = this.#c("style");
+    this.hoverStyle = hoverStyle;
+    content.prepend(hoverStyle);
+    table.addEventListener("mouseover", this.#handleStepHover.bind(this));
+    table.addEventListener("mouseleave", e => {
+      hoverStyle.innerText = "";
+    });
+
+    showBoxesCheckbox.addEventListener("change", () => {
+      this.pageContainer.classList.toggle(
+        "showDebugBoxes",
+        showBoxesCheckbox.checked
+      );
+    });
+  }
+
+  updateOperatorList(operatorList) {
+    const self = this;
+
+    function cboxOnClick() {
+      const x = +this.dataset.idx;
+      if (this.checked) {
+        self.breakPoints.push(x);
+      } else {
+        self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
+      }
+      StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
+    }
+
+    const MAX_OPERATORS_COUNT = 15000;
+    if (this.operatorListIdx > MAX_OPERATORS_COUNT) {
+      return;
+    }
+
+    const chunk = document.createDocumentFragment();
+    const operatorsToDisplay = Math.min(
+      MAX_OPERATORS_COUNT,
+      operatorList.fnArray.length
+    );
+    for (let i = this.operatorListIdx; i < operatorsToDisplay; i++) {
+      const line = this.#c("tr");
+      line.className = "line";
+      line.dataset.idx = i;
+      chunk.append(line);
+      const checked = this.breakPoints.includes(i);
+      const args = operatorList.argsArray[i] || [];
+
+      const breakCell = this.#c("td");
+      const cbox = this.#c("input");
+      cbox.type = "checkbox";
+      cbox.className = "points";
+      cbox.checked = checked;
+      cbox.dataset.idx = i;
+      cbox.onclick = cboxOnClick;
+
+      breakCell.append(cbox);
+      line.append(breakCell, this.#c("td", i.toString()));
+      const fn = opMap[operatorList.fnArray[i]];
+      let decArgs = args;
+      if (fn === "showText") {
+        const glyphs = args[0];
+        const charCodeRow = this.#c("tr");
+        const fontCharRow = this.#c("tr");
+        const unicodeRow = this.#c("tr");
+        for (const glyph of glyphs) {
+          if (typeof glyph === "object" && glyph !== null) {
+            charCodeRow.append(this.#c("td", glyph.originalCharCode));
+            fontCharRow.append(this.#c("td", glyph.fontChar));
+            unicodeRow.append(this.#c("td", glyph.unicode));
+          } else {
+            // null or number
+            const advanceEl = this.#c("td", glyph);
+            advanceEl.classList.add("advance");
+            charCodeRow.append(advanceEl);
+            fontCharRow.append(this.#c("td"));
+            unicodeRow.append(this.#c("td"));
+          }
+        }
+        decArgs = this.#c("td");
+        const table = this.#c("table");
+        table.classList.add("showText");
+        decArgs.append(table);
+        table.append(charCodeRow, fontCharRow, unicodeRow);
+      } else if (fn === "constructPath") {
+        const [op, [path], minMax] = args;
+        decArgs = this.#c("td");
+        decArgs.append(JSON.stringify(this.#simplifyArgs(path)));
+        decArgs.append(this.#c("br"));
+        decArgs.append(`minMax: ${JSON.stringify(this.#simplifyArgs(minMax))}`);
+        decArgs.append(this.#c("br"));
+        decArgs.append(`鈫� ${opMap[op]}`);
+      } else if (fn === "restore" && this.indentLevel > 0) {
+        this.indentLevel--;
+      }
+      line.append(this.#c("td", " ".repeat(this.indentLevel * 2) + fn));
+      if (fn === "save") {
+        this.indentLevel++;
+      }
+
+      if (decArgs instanceof HTMLElement) {
+        line.append(decArgs);
+      } else {
+        line.append(this.#c("td", JSON.stringify(this.#simplifyArgs(decArgs))));
+      }
+    }
+    if (operatorsToDisplay < operatorList.fnArray.length) {
+      const lastCell = this.#c("td", "...");
+      lastCell.colspan = 4;
+      chunk.append(lastCell);
+    }
+    this.operatorListIdx = operatorList.fnArray.length;
+    this.table.append(chunk);
+  }
+
+  setOperatorBBoxes(bboxes, metadata) {
+    let boxesContainer = this.pageContainer.querySelector(".pdfBugGroupsLayer");
+    if (!boxesContainer) {
+      boxesContainer = this.#c("div");
+      boxesContainer.classList.add("pdfBugGroupsLayer");
+      this.pageContainer.append(boxesContainer);
+
+      boxesContainer.addEventListener(
+        "click",
+        this.#handleDebugBoxClick.bind(this)
+      );
+      boxesContainer.addEventListener(
+        "mouseover",
+        this.#handleDebugBoxHover.bind(this)
+      );
+    }
+    boxesContainer.innerHTML = "";
+
+    const dependents = new Map();
+    for (const [dependentIdx, { dependencies: ownDependencies }] of metadata) {
+      for (const dependencyIdx of ownDependencies) {
+        dependents
+          .getOrInsertComputed(dependencyIdx, () => new Set())
+          .add(dependentIdx);
+      }
+    }
+
+    const groups = Array.from({ length: bboxes.length }, (_, i) => {
+      let minX = null;
+      let minY = null;
+      let maxX = null;
+      let maxY = null;
+      if (!bboxes.isEmpty(i)) {
+        minX = bboxes.minX(i);
+        minY = bboxes.minY(i);
+        maxX = bboxes.maxX(i);
+        maxY = bboxes.maxY(i);
+      }
+
+      return {
+        minX,
+        minY,
+        maxX,
+        maxY,
+        dependencies: Array.from(metadata.get(i)?.dependencies ?? []).sort(),
+        dependents: Array.from(dependents.get(i) ?? []).sort(),
+        isRenderingOperation: metadata.get(i)?.isRenderingOperation ?? false,
+        idx: i,
+      };
+    });
+    this.operatorsGroups = groups;
+
+    const operatorsGroupsByZindex = groups.toSorted((a, b) => {
+      if (a.minX === null) {
+        return b.minX === null ? 0 : 1;
+      }
+      if (b.minX === null) {
+        return -1;
+      }
+
+      const diffs = [
+        a.minY - b.minY,
+        a.minX - b.minX,
+        b.maxY - a.maxY,
+        b.maxX - a.maxX,
+      ];
+      for (const diff of diffs) {
+        if (Math.abs(diff) > 0.01) {
+          return Math.sign(diff);
+        }
+      }
+      for (const diff of diffs) {
+        if (Math.abs(diff) > 0.0001) {
+          return Math.sign(diff);
+        }
+      }
+      return 0;
+    });
+
+    for (let i = 0; i < operatorsGroupsByZindex.length; i++) {
+      const group = operatorsGroupsByZindex[i];
+      if (group.minX !== null) {
+        const el = this.#c("div");
+        el.style.left = `${group.minX * 100}%`;
+        el.style.top = `${group.minY * 100}%`;
+        el.style.width = `${(group.maxX - group.minX) * 100}%`;
+        el.style.height = `${(group.maxY - group.minY) * 100}%`;
+        el.dataset.idx = group.idx;
+        boxesContainer.append(el);
+      }
+    }
+  }
+
+  #handleStepHover(e) {
+    const tr = e.target.closest("tr");
+    if (!tr || tr.dataset.idx === undefined) {
+      return;
+    }
+
+    const index = +tr.dataset.idx;
+    this.#highlightStepsGroup(index);
+  }
+
+  #handleDebugBoxHover(e) {
+    if (e.target.dataset.idx === undefined) {
+      return;
+    }
+
+    const idx = Number(e.target.dataset.idx);
+    this.#highlightStepsGroup(idx);
+  }
+
+  #handleDebugBoxClick(e) {
+    if (e.target.dataset.idx === undefined) {
+      return;
+    }
+
+    const idx = Number(e.target.dataset.idx);
+
+    this.table.childNodes[idx].scrollIntoView();
+  }
+
+  #highlightStepsGroup(index) {
+    const group = this.operatorsGroups?.[index];
+    if (!group) {
+      return;
+    }
+
+    const renderingColor = `rgba(0, 0, 0, 0.1)`;
+    const dependencyColor = `rgba(0, 255, 255, 0.1)`;
+    const dependentColor = `rgba(255, 0, 0, 0.1)`;
+
+    const solid = color => `background-color: ${color}`;
+    // Used for operations that have an empty bounding box
+    const striped = color => `
+      background-image: repeating-linear-gradient(
+        -45deg,
+        white,
+        white 10px,
+        ${color} 10px,
+        ${color} 20px
+      )
+    `;
+
+    const select = idx => `#${this.panel.id} tr[data-idx="${idx}"]`;
+    const selectN = idxs =>
+      idxs.length === 0 ? "q:not(q)" : idxs.map(select).join(", ");
+
+    const isEmpty = idx =>
+      !this.operatorsGroups[idx] || this.operatorsGroups[idx].minX === null;
+
+    const selfColor = group.isRenderingOperation
+      ? renderingColor
+      : dependentColor;
+
+    this.hoverStyle.innerText = `${select(index)} {
+      ${group.minX === null ? striped(selfColor) : solid(selfColor)}
+    }`;
+    if (group.dependencies.length > 0) {
+      this.hoverStyle.innerText += `
+        ${selectN(group.dependencies.filter(idx => !isEmpty(idx)))} {
+          ${solid(dependencyColor)}
+        }
+        ${selectN(group.dependencies.filter(isEmpty))} {
+          ${striped(dependencyColor)}
+        }`;
+    }
+    if (group.dependents.length > 0) {
+      this.hoverStyle.innerText += `
+        ${selectN(group.dependents.filter(idx => !isEmpty(idx)))} {
+          ${solid(dependentColor)}
+        }
+        ${selectN(group.dependents.filter(isEmpty))} {
+          ${striped(dependentColor)}
+        }`;
+    }
+
+    this.hoverStyle.innerText += `
+      #viewer [data-page-number="${this.pageIndex + 1}"] .pdfBugGroupsLayer [data-idx="${index}"] {
+        background-color: var(--hover-background-color);
+        outline-style: var(--hover-outline-style);
+      }
+    `;
+  }
+
+  getNextBreakPoint() {
+    this.breakPoints.sort((a, b) => a - b);
+    for (const breakPoint of this.breakPoints) {
+      if (breakPoint > this.currentIdx) {
+        return breakPoint;
+      }
+    }
+    return null;
+  }
+
+  breakIt(idx, callback) {
+    StepperManager.selectStepper(this.pageIndex, true);
+    this.currentIdx = idx;
+
+    const listener = evt => {
+      switch (evt.keyCode) {
+        case 83: // step
+          document.removeEventListener("keydown", listener);
+          this.nextBreakPoint = this.currentIdx + 1;
+          this.goTo(-1);
+          callback();
+          break;
+        case 67: // continue
+          document.removeEventListener("keydown", listener);
+          this.nextBreakPoint = this.getNextBreakPoint();
+          this.goTo(-1);
+          callback();
+          break;
+      }
+    };
+    document.addEventListener("keydown", listener);
+    this.goTo(idx);
+  }
+
+  shouldSkip(idx) {
+    return false;
+  }
+
+  goTo(idx) {
+    const allRows = this.panel.getElementsByClassName("line");
+    for (const row of allRows) {
+      if ((row.dataset.idx | 0) === idx) {
+        row.style.backgroundColor = "rgb(251,250,207)";
+        row.scrollIntoView();
+      } else {
+        row.style.backgroundColor = null;
+      }
+    }
+  }
+}
+
+const Stats = (function () {
+  let stats = [];
+  function clear(node) {
+    node.textContent = ""; // Remove any `node` contents from the DOM.
+  }
+  return {
+    // Properties/functions needed by PDFBug.
+    id: "Stats",
+    name: "Stats",
+    panel: null,
+    manager: null,
+    init() {},
+    enabled: false,
+    active: false,
+    // Stats specific functions.
+    add(pageNumber, stat) {
+      if (!stat) {
+        return;
+      }
+      const statsIndex = stats.findIndex(s => s.pageNumber === pageNumber);
+      if (statsIndex !== -1) {
+        stats[statsIndex].div.remove();
+        stats.splice(statsIndex, 1);
+      }
+      const wrapper = document.createElement("div");
+      wrapper.className = "stats";
+      const title = document.createElement("div");
+      title.className = "title";
+      title.textContent = "Page: " + pageNumber;
+      const statsDiv = document.createElement("div");
+      statsDiv.textContent = stat.toString();
+      wrapper.append(title, statsDiv);
+      stats.push({ pageNumber, div: wrapper });
+      stats.sort((a, b) => a.pageNumber - b.pageNumber);
+      clear(this.panel);
+      for (const entry of stats) {
+        this.panel.append(entry.div);
+      }
+    },
+    cleanup() {
+      stats = [];
+      clear(this.panel);
+    },
+  };
+})();
+
+// Manages all the debugging tools.
+class PDFBug {
+  static #buttons = [];
+
+  static #activePanel = null;
+
+  static tools = [FontInspector, StepperManager, Stats];
+
+  static enable(ids) {
+    const all = ids.length === 1 && ids[0] === "all";
+    const tools = this.tools;
+    for (const tool of tools) {
+      if (all || ids.includes(tool.id)) {
+        tool.enabled = true;
+      }
+    }
+    if (!all) {
+      // Sort the tools by the order they are enabled.
+      tools.sort(function (a, b) {
+        let indexA = ids.indexOf(a.id);
+        indexA = indexA < 0 ? tools.length : indexA;
+        let indexB = ids.indexOf(b.id);
+        indexB = indexB < 0 ? tools.length : indexB;
+        return indexA - indexB;
+      });
+    }
+  }
+
+  static init(container, ids) {
+    this.loadCSS();
+    this.enable(ids);
+    /*
+     * Basic Layout:
+     * PDFBug
+     *  Controls
+     *  Panels
+     *    Panel
+     *    Panel
+     *    ...
+     */
+    const ui = document.createElement("div");
+    ui.id = "PDFBug";
+
+    const controls = document.createElement("div");
+    controls.setAttribute("class", "controls");
+    ui.append(controls);
+
+    const panels = document.createElement("div");
+    panels.setAttribute("class", "panels");
+    ui.append(panels);
+
+    container.append(ui);
+    container.style.right = "var(--panel-width)";
+
+    // Initialize all the debugging tools.
+    for (const tool of this.tools) {
+      const panel = document.createElement("div");
+      const panelButton = document.createElement("button");
+      panelButton.textContent = tool.name;
+      panelButton.addEventListener("click", event => {
+        event.preventDefault();
+        this.selectPanel(tool);
+      });
+      controls.append(panelButton);
+      panels.append(panel);
+      tool.panel = panel;
+      tool.manager = this;
+      if (tool.enabled) {
+        tool.init();
+      } else {
+        panel.textContent =
+          `${tool.name} is disabled. To enable add "${tool.id}" to ` +
+          "the pdfBug parameter and refresh (separate multiple by commas).";
+      }
+      this.#buttons.push(panelButton);
+    }
+    this.selectPanel(0);
+  }
+
+  static loadCSS() {
+    const { url } = import.meta;
+
+    const link = document.createElement("link");
+    link.rel = "stylesheet";
+    link.href = url.replace(/\.mjs$/, ".css");
+
+    document.head.append(link);
+  }
+
+  static cleanup() {
+    for (const tool of this.tools) {
+      if (tool.enabled) {
+        tool.cleanup();
+      }
+    }
+  }
+
+  static selectPanel(index) {
+    if (typeof index !== "number") {
+      index = this.tools.indexOf(index);
+    }
+    if (index === this.#activePanel) {
+      return;
+    }
+    this.#activePanel = index;
+    for (const [j, tool] of this.tools.entries()) {
+      const isActive = j === index;
+      this.#buttons[j].classList.toggle("active", isActive);
+      tool.active = isActive;
+      tool.panel.hidden = !isActive;
+    }
+  }
+}
+
+globalThis.FontInspector = FontInspector;
+globalThis.StepperManager = StepperManager;
+globalThis.Stats = Stats;
+
+export { PDFBug };
diff --git a/public/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc b/public/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc
new file mode 100644
index 0000000..b5a7349
--- /dev/null
+++ b/public/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc
Binary files differ
diff --git a/public/pdfjs/web/iccs/LICENSE b/public/pdfjs/web/iccs/LICENSE
new file mode 100644
index 0000000..4ee29e0
--- /dev/null
+++ b/public/pdfjs/web/iccs/LICENSE
@@ -0,0 +1,116 @@
+CC0 1.0 Universal
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later
+claims of infringement build upon, modify, incorporate in other works, reuse
+and redistribute as freely as possible in any form whatsoever and for any
+purposes, including without limitation commercial purposes. These owners may
+contribute to the Commons to promote the ideal of a free culture and the
+further production of creative, cultural and scientific works, or to gain
+reputation or greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with a
+Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not limited
+to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display, communicate,
+  and translate a Work;
+
+  ii. moral rights retained by the original author(s) and/or performer(s);
+
+  iii. publicity and privacy rights pertaining to a person's image or likeness
+  depicted in a Work;
+
+  iv. rights protecting against unfair competition in regards to a Work,
+  subject to the limitations in paragraph 4(a), below;
+
+  v. rights protecting the extraction, dissemination, use and reuse of data in
+  a Work;
+
+  vi. database rights (such as those arising under Directive 96/9/EC of the
+  European Parliament and of the Council of 11 March 1996 on the legal
+  protection of databases, and under any national implementation thereof,
+  including any amended or successor version of such directive); and
+
+  vii. other similar, equivalent or corresponding rights throughout the world
+  based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number of
+copies, and (iv) for any purpose whatsoever, including without limitation
+commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+the Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such Waiver
+shall not be subject to revocation, rescission, cancellation, termination, or
+any other legal or equitable action to disrupt the quiet enjoyment of the Work
+by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account
+Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
+is so judged Affirmer hereby grants to each affected person a royalty-free,
+non transferable, non sublicensable, non exclusive, irrevocable and
+unconditional license to exercise Affirmer's Copyright and Related Rights in
+the Work (i) in all territories worldwide, (ii) for the maximum duration
+provided by applicable law or treaty (including future time extensions), (iii)
+in any current or future medium and for any number of copies, and (iv) for any
+purpose whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed effective as
+of the date CC0 was applied by Affirmer to the Work. Should any part of the
+License for any reason be judged legally invalid or ineffective under
+applicable law, such partial invalidity or ineffectiveness shall not
+invalidate the remainder of the License, and in such case Affirmer hereby
+affirms that he or she will not (i) exercise any of his or her remaining
+Copyright and Related Rights in the Work or (ii) assert any associated claims
+and causes of action with respect to the Work, in either case contrary to
+Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+  a. No trademark or patent rights held by Affirmer are waived, abandoned,
+  surrendered, licensed or otherwise affected by this document.
+
+  b. Affirmer offers the Work as-is and makes no representations or warranties
+  of any kind concerning the Work, express, implied, statutory or otherwise,
+  including without limitation warranties of title, merchantability, fitness
+  for a particular purpose, non infringement, or the absence of latent or
+  other defects, accuracy, or the present or absence of errors, whether or not
+  discoverable, all to the greatest extent permissible under applicable law.
+
+  c. Affirmer disclaims responsibility for clearing rights of other persons
+  that may apply to the Work or any use thereof, including without limitation
+  any person's Copyright and Related Rights in the Work. Further, Affirmer
+  disclaims responsibility for obtaining any necessary consents, permissions
+  or other rights required for any use of the Work.
+
+  d. Affirmer understands and acknowledges that Creative Commons is not a
+  party to this document and has no duty or obligation with respect to this
+  CC0 or use of the Work.
+
+For more information, please see
+http://creativecommons.org/publicdomain/zero/1.0/
diff --git a/public/pdfjs/web/images/altText_add.svg b/public/pdfjs/web/images/altText_add.svg
new file mode 100644
index 0000000..3451b53
--- /dev/null
+++ b/public/pdfjs/web/images/altText_add.svg
@@ -0,0 +1,3 @@
+<svg width="12" height="13" viewBox="0 0 12 13" fill="none" xmlns="http://www.w3.org/2000/svg">
+   <path d="M5.375 7.625V11.875C5.375 12.0408 5.44085 12.1997 5.55806 12.3169C5.67527 12.4342 5.83424 12.5 6 12.5C6.16576 12.5 6.32473 12.4342 6.44194 12.3169C6.55915 12.1997 6.625 12.0408 6.625 11.875V7.625L7.125 7.125H11.375C11.5408 7.125 11.6997 7.05915 11.8169 6.94194C11.9342 6.82473 12 6.66576 12 6.5C12 6.33424 11.9342 6.17527 11.8169 6.05806C11.6997 5.94085 11.5408 5.875 11.375 5.875H7.125L6.625 5.375V1.125C6.625 0.95924 6.55915 0.800269 6.44194 0.683058C6.32473 0.565848 6.16576 0.5 6 0.5C5.83424 0.5 5.67527 0.565848 5.55806 0.683058C5.44085 0.800269 5.375 0.95924 5.375 1.125V5.375L4.875 5.875H0.625C0.45924 5.875 0.300269 5.94085 0.183058 6.05806C0.065848 6.17527 0 6.33424 0 6.5C0 6.66576 0.065848 6.82473 0.183058 6.94194C0.300269 7.05915 0.45924 7.125 0.625 7.125H4.762L5.375 7.625Z" fill="black"/>
+</svg> 
diff --git a/public/pdfjs/web/images/altText_disclaimer.svg b/public/pdfjs/web/images/altText_disclaimer.svg
new file mode 100644
index 0000000..6fe79e7
--- /dev/null
+++ b/public/pdfjs/web/images/altText_disclaimer.svg
@@ -0,0 +1,3 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.49073 1.3015L3.30873 2.1505C3.29349 2.22246 3.25769 2.28844 3.20568 2.34045C3.15368 2.39246 3.08769 2.42826 3.01573 2.4435L2.16673 2.6255C1.76473 2.7125 1.76473 3.2865 2.16673 3.3725L3.01573 3.5555C3.08769 3.57074 3.15368 3.60654 3.20568 3.65855C3.25769 3.71056 3.29349 3.77654 3.30873 3.8485L3.49073 4.6975C3.57773 5.0995 4.15173 5.0995 4.23773 4.6975L4.42073 3.8485C4.43598 3.77654 4.47177 3.71056 4.52378 3.65855C4.57579 3.60654 4.64178 3.57074 4.71373 3.5555L5.56173 3.3725C5.96373 3.2855 5.96373 2.7115 5.56173 2.6255L4.71273 2.4435C4.64083 2.42814 4.57491 2.3923 4.52292 2.34031C4.47093 2.28832 4.43509 2.2224 4.41973 2.1505L4.23773 1.3015C4.15073 0.8995 3.57673 0.8995 3.49073 1.3015ZM10.8647 13.9995C10.4853 14.0056 10.1158 13.8782 9.82067 13.6397C9.52553 13.4013 9.32347 13.0667 9.24973 12.6945L8.89273 11.0275C8.83676 10.7687 8.70738 10.5316 8.52009 10.3445C8.3328 10.1574 8.09554 10.0282 7.83673 9.9725L6.16973 9.6155C5.38873 9.4465 4.86473 8.7975 4.86473 7.9995C4.86473 7.2015 5.38873 6.5525 6.16973 6.3845L7.83673 6.0275C8.09551 5.97135 8.33267 5.84193 8.51992 5.65468C8.70716 5.46744 8.83658 5.23028 8.89273 4.9715L9.25073 3.3045C9.41773 2.5235 10.0667 1.9995 10.8647 1.9995C11.6627 1.9995 12.3117 2.5235 12.4797 3.3045L12.8367 4.9715C12.9507 5.4995 13.3647 5.9135 13.8927 6.0265L15.5597 6.3835C16.3407 6.5525 16.8647 7.2015 16.8647 7.9995C16.8647 8.7975 16.3407 9.4465 15.5597 9.6145L13.8927 9.9715C13.6337 10.0275 13.3963 10.157 13.209 10.3445C13.0217 10.5319 12.8925 10.7694 12.8367 11.0285L12.4787 12.6945C12.4054 13.0667 12.2036 13.4014 11.9086 13.6399C11.6135 13.8784 11.2441 14.0057 10.8647 13.9995ZM10.8647 3.2495C10.7667 3.2495 10.5337 3.2795 10.4727 3.5655L10.1147 5.2335C10.0081 5.72777 9.76116 6.18082 9.40361 6.53837C9.04606 6.89593 8.59301 7.14283 8.09873 7.2495L6.43173 7.6065C6.14573 7.6685 6.11473 7.9015 6.11473 7.9995C6.11473 8.0975 6.14573 8.3305 6.43173 8.3925L8.09873 8.7495C8.59301 8.85617 9.04606 9.10307 9.40361 9.46062C9.76116 9.81817 10.0081 10.2712 10.1147 10.7655L10.4727 12.4335C10.5337 12.7195 10.7667 12.7495 10.8647 12.7495C10.9627 12.7495 11.1957 12.7195 11.2567 12.4335L11.6147 10.7665C11.7212 10.272 11.9681 9.81878 12.3256 9.46103C12.6832 9.10329 13.1363 8.85624 13.6307 8.7495L15.2977 8.3925C15.5837 8.3305 15.6147 8.0975 15.6147 7.9995C15.6147 7.9015 15.5837 7.6685 15.2977 7.6065L13.6307 7.2495C13.1365 7.14283 12.6834 6.89593 12.3259 6.53837C11.9683 6.18082 11.7214 5.72777 11.6147 5.2335L11.2567 3.5655C11.1957 3.2795 10.9627 3.2495 10.8647 3.2495ZM3.30873 12.1505L3.49073 11.3015C3.57673 10.8995 4.15073 10.8995 4.23773 11.3015L4.41973 12.1505C4.43509 12.2224 4.47093 12.2883 4.52292 12.3403C4.57491 12.3923 4.64083 12.4281 4.71273 12.4435L5.56173 12.6255C5.96373 12.7115 5.96373 13.2855 5.56173 13.3725L4.71273 13.5545C4.64083 13.5699 4.57491 13.6057 4.52292 13.6577C4.47093 13.7097 4.43509 13.7756 4.41973 13.8475L4.23773 14.6965C4.15173 15.0985 3.57773 15.0985 3.49073 14.6965L3.30873 13.8475C3.29337 13.7756 3.25754 13.7097 3.20555 13.6577C3.15356 13.6057 3.08764 13.5699 3.01573 13.5545L2.16673 13.3725C1.76473 13.2865 1.76473 12.7125 2.16673 12.6255L3.01573 12.4435C3.08769 12.4283 3.15368 12.3925 3.20568 12.3405C3.25769 12.2884 3.29349 12.2225 3.30873 12.1505Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/altText_done.svg b/public/pdfjs/web/images/altText_done.svg
new file mode 100644
index 0000000..f54924e
--- /dev/null
+++ b/public/pdfjs/web/images/altText_done.svg
@@ -0,0 +1,3 @@
+<svg width="12" height="13" viewBox="0 0 12 13" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M6 0.5C5.21207 0.5 4.43185 0.655195 3.7039 0.956723C2.97595 1.25825 2.31451 1.70021 1.75736 2.25736C1.20021 2.81451 0.758251 3.47595 0.456723 4.2039C0.155195 4.93185 0 5.71207 0 6.5C0 7.28793 0.155195 8.06815 0.456723 8.7961C0.758251 9.52405 1.20021 10.1855 1.75736 10.7426C2.31451 11.2998 2.97595 11.7417 3.7039 12.0433C4.43185 12.3448 5.21207 12.5 6 12.5C7.5913 12.5 9.11742 11.8679 10.2426 10.7426C11.3679 9.61742 12 8.0913 12 6.5C12 4.9087 11.3679 3.38258 10.2426 2.25736C9.11742 1.13214 7.5913 0.5 6 0.5ZM5.06 8.9L2.9464 6.7856C2.85273 6.69171 2.80018 6.56446 2.80033 6.43183C2.80048 6.29921 2.85331 6.17207 2.9472 6.0784C3.04109 5.98473 3.16834 5.93218 3.30097 5.93233C3.43359 5.93248 3.56073 5.98531 3.6544 6.0792L5.3112 7.7368L8.3464 4.7008C8.44109 4.6109 8.56715 4.56153 8.69771 4.56322C8.82827 4.56492 8.95301 4.61754 9.04534 4.70986C9.13766 4.80219 9.19028 4.92693 9.19198 5.05749C9.19367 5.18805 9.1443 5.31411 9.0544 5.4088L5.5624 8.9H5.06Z" fill="#FBFBFE"/>
+</svg> 
diff --git a/public/pdfjs/web/images/altText_spinner.svg b/public/pdfjs/web/images/altText_spinner.svg
new file mode 100644
index 0000000..fedb472
--- /dev/null
+++ b/public/pdfjs/web/images/altText_spinner.svg
@@ -0,0 +1,30 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+  <style>
+    @media not (prefers-reduced-motion) {
+      @keyframes loadingRotate {
+        from { rotate: 0; } to { rotate: 360deg }
+      }
+      #circle-arrows {
+        animation: loadingRotate 1.8s linear infinite;
+        transform-origin: 50% 50%;
+      }
+      #hourglass {
+        display: none;
+      }
+    }
+
+    @media (prefers-reduced-motion) {
+      #circle-arrows {
+        display: none;
+      }
+    }
+  </style>
+  <path id="circle-arrows" d="M9 5.528c0 .42.508.63.804.333l2.528-2.528a.47.47 0 0 0 0-.666L9.805.14A.471.471 0 0 0 9 .472v1.866A5.756 5.756 0 0 0 2.25 8c0 .942.232 1.83.635 2.615l1.143-1.143A4.208 4.208 0 0 1 3.75 8 4.254 4.254 0 0 1 8 3.75c.345 0 .68.042 1 .122v1.656zM7 10.472v1.656c.32.08.655.122 1 .122A4.254 4.254 0 0 0 12.25 8c0-.52-.107-1.013-.279-1.474l1.143-1.143c.404.786.636 1.674.636 2.617A5.756 5.756 0 0 1 7 13.662v1.866a.47.47 0 0 1-.804.333l-2.528-2.528a.47.47 0 0 1 0-.666l2.528-2.528a.47.47 0 0 1 .804.333z"/>
+  <g id="hourglass">
+    <path d="M13,1 C13.5522847,1 14,1.44771525 14,2 C14,2.55228475 13.5522847,3 13,3 L12.9854217,2.99990801 C12.9950817,3.16495885 13,3.33173274 13,3.5 C13,5.24679885 10.9877318,6.01090495 10.9877318,8.0017538 C10.9877318,9.99260264 13,10.7536922 13,12.5 C13,12.6686079 12.9950617,12.8357163 12.985363,13.0010943 L13,13 C13.5522847,13 14,13.4477153 14,14 C14,14.5522847 13.5522847,15 13,15 L3,15 C2.44771525,15 2,14.5522847 2,14 C2,13.4477153 2.44771525,13 3,13 L3.01463704,13.0010943 C3.00493827,12.8357163 3,12.6686079 3,12.5 C3,10.7536922 4.9877318,9.99260264 5,8.0017538 C5.0122682,6.01090495 3,5.24679885 3,3.5 C3,3.33173274 3.00491834,3.16495885 3.01457832,2.99990801 L3,3 C2.44771525,3 2,2.55228475 2,2 C2,1.44771525 2.44771525,1 3,1 L13,1 Z M10.987,3 L5.012,3 L5.00308914,3.24815712 C5.00103707,3.33163368 5,3.4155948 5,3.5 C5,5.36125069 6.99153646,6.01774089 6.99153646,8.0017538 C6.99153646,9.98576671 5,10.6393737 5,12.5 L5.00307746,12.7513676 L5.01222201,12.9998392 L5.60191711,12.9988344 L6.0425138,12.2959826 C7.02362731,10.7653275 7.67612271,10 8,10 C8.37014547,10 9.16950644,10.9996115 10.3980829,12.9988344 L10.987778,12.9998392 C10.9958674,12.8352104 11,12.66849 11,12.5 C11,10.6393737 8.98689779,10.0147381 8.98689779,8.0017538 C8.98689779,5.98876953 11,5.36125069 11,3.5 L10.9969109,3.24815712 L10.987,3 Z"/>
+    <path d="M6,4 L10,4 C8.95166016,6 8.28499349,7 8,7 C7.71500651,7 7.04833984,6 6,4 Z"/>
+  </g>
+</svg>
diff --git a/public/pdfjs/web/images/altText_warning.svg b/public/pdfjs/web/images/altText_warning.svg
new file mode 100644
index 0000000..03014ce
--- /dev/null
+++ b/public/pdfjs/web/images/altText_warning.svg
@@ -0,0 +1,3 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M8.78182 2.63903C8.58882 2.28803 8.25782 2.25003 8.12482 2.25003C7.99019 2.24847 7.85771 2.28393 7.74185 2.35253C7.62599 2.42113 7.5312 2.52023 7.46782 2.63903L1.97082 12.639C1.90673 12.7528 1.87406 12.8816 1.87617 13.0122C1.87828 13.1427 1.91509 13.2704 1.98282 13.382C2.04798 13.4951 2.14207 13.5888 2.25543 13.6535C2.36879 13.7182 2.49732 13.7515 2.62782 13.75H13.6218C13.7523 13.7515 13.8809 13.7182 13.9942 13.6535C14.1076 13.5888 14.2017 13.4951 14.2668 13.382C14.3346 13.2704 14.3714 13.1427 14.3735 13.0122C14.3756 12.8816 14.3429 12.7528 14.2788 12.639L8.78182 2.63903ZM6.37282 2.03703C6.75182 1.34603 7.43882 1.00003 8.12482 1.00003C8.48341 0.997985 8.83583 1.09326 9.14454 1.2757C9.45325 1.45814 9.70668 1.72092 9.87782 2.03603L15.3748 12.036C16.1078 13.369 15.1438 15 13.6228 15H2.62782C1.10682 15 0.141823 13.37 0.875823 12.037L6.37282 2.03703ZM8.74982 9.06203C8.74982 9.22779 8.68397 9.38676 8.56676 9.50397C8.44955 9.62118 8.29058 9.68703 8.12482 9.68703C7.95906 9.68703 7.80009 9.62118 7.68288 9.50397C7.56566 9.38676 7.49982 9.22779 7.49982 9.06203V5.62503C7.49982 5.45927 7.56566 5.3003 7.68288 5.18309C7.80009 5.06588 7.95906 5.00003 8.12482 5.00003C8.29058 5.00003 8.44955 5.06588 8.56676 5.18309C8.68397 5.3003 8.74982 5.45927 8.74982 5.62503V9.06203ZM7.74982 12L7.49982 11.75V11L7.74982 10.75H8.49982L8.74982 11V11.75L8.49982 12H7.74982Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/annotation-check.svg b/public/pdfjs/web/images/annotation-check.svg
new file mode 100644
index 0000000..71cd16d
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-check.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <path
+     d="M 1.5006714,23.536225 6.8925879,18.994244 14.585721,26.037937 34.019683,4.5410479 38.499329,9.2235032 14.585721,35.458952 z"
+     id="path4"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.25402856;stroke-opacity:1" />
+</svg>
diff --git a/public/pdfjs/web/images/annotation-comment.svg b/public/pdfjs/web/images/annotation-comment.svg
new file mode 100644
index 0000000..86f1f17
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-comment.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   height="40"
+   width="40"
+   viewBox="0 0 40 40">
+  <rect
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     width="33.76017"
+     height="33.76017"
+     x="3.119915"
+     y="3.119915" />
+  <path
+     d="m 20.677967,8.54499 c -7.342801,0 -13.295293,4.954293 -13.295293,11.065751 0,2.088793 0.3647173,3.484376 1.575539,5.150563 L 6.0267418,31.45501 13.560595,29.011117 c 2.221262,1.387962 4.125932,1.665377 7.117372,1.665377 7.3428,0 13.295291,-4.954295 13.295291,-11.065753 0,-6.111458 -5.952491,-11.065751 -13.295291,-11.065751 z"
+     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.93031836;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+</svg>
diff --git a/public/pdfjs/web/images/annotation-help.svg b/public/pdfjs/web/images/annotation-help.svg
new file mode 100644
index 0000000..00938fe
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-help.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <g
+     transform="translate(0,-60)"
+     id="layer1">
+    <rect
+       width="36.460953"
+       height="34.805603"
+       x="1.7695236"
+       y="62.597198"
+       style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.30826771;stroke-opacity:1" />
+    <g
+       transform="matrix(0.88763677,0,0,0.88763677,2.2472646,8.9890584)">
+      <path
+         d="M 20,64.526342 C 11.454135,64.526342 4.5263421,71.454135 4.5263421,80 4.5263421,88.545865 11.454135,95.473658 20,95.473658 28.545865,95.473658 35.473658,88.545865 35.473658,80 35.473658,71.454135 28.545865,64.526342 20,64.526342 z m -0.408738,9.488564 c 3.527079,0 6.393832,2.84061 6.393832,6.335441 0,3.494831 -2.866753,6.335441 -6.393832,6.335441 -3.527079,0 -6.393832,-2.84061 -6.393832,-6.335441 0,-3.494831 2.866753,-6.335441 6.393832,-6.335441 z"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.02768445;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         d="m 7.2335209,71.819938 4.9702591,4.161823 c -1.679956,2.581606 -1.443939,6.069592 0.159325,8.677725 l -5.1263071,3.424463 c 0.67516,1.231452 3.0166401,3.547686 4.2331971,4.194757 l 3.907728,-4.567277 c 2.541952,1.45975 5.730694,1.392161 8.438683,-0.12614 l 3.469517,6.108336 c 1.129779,-0.44367 4.742234,-3.449633 5.416358,-5.003859 l -5.46204,-4.415541 c 1.44319,-2.424098 1.651175,-5.267515 0.557303,-7.748623 l 5.903195,-3.833951 C 33.14257,71.704996 30.616217,69.018606 29.02952,67.99296 l -4.118813,4.981678 C 22.411934,71.205099 18.900853,70.937534 16.041319,72.32916 l -3.595408,-5.322091 c -1.345962,0.579488 -4.1293881,2.921233 -5.2123901,4.812869 z m 8.1010311,3.426672 c 2.75284,-2.446266 6.769149,-2.144694 9.048998,0.420874 2.279848,2.56557 2.113919,6.596919 -0.638924,9.043185 -2.752841,2.446267 -6.775754,2.13726 -9.055604,-0.428308 -2.279851,-2.565568 -2.107313,-6.589485 0.64553,-9.035751 z"
+         style="fill:#000000;fill-opacity:1;stroke:none" />
+    </g>
+  </g>
+</svg>
diff --git a/public/pdfjs/web/images/annotation-insert.svg b/public/pdfjs/web/images/annotation-insert.svg
new file mode 100644
index 0000000..519ef68
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-insert.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 32.003143,1.4044602 57.432701,62.632577 6.5672991,62.627924 z"
+     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:1.00493038;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/public/pdfjs/web/images/annotation-key.svg b/public/pdfjs/web/images/annotation-key.svg
new file mode 100644
index 0000000..8d09d53
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-key.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 25.470843,9.4933766 C 25.30219,12.141818 30.139101,14.445969 34.704831,13.529144 40.62635,12.541995 41.398833,7.3856498 35.97505,5.777863 31.400921,4.1549155 25.157674,6.5445892 25.470843,9.4933766 z M 4.5246282,17.652051 C 4.068249,11.832873 9.2742983,5.9270407 18.437379,3.0977088 29.751911,-0.87185184 45.495663,1.4008022 53.603953,7.1104009 c 9.275765,6.1889221 7.158128,16.2079421 -3.171076,21.5939521 -1.784316,1.635815 -6.380222,1.21421 -7.068351,3.186186 -1.04003,0.972427 -1.288046,2.050158 -1.232864,3.168203 1.015111,2.000108 -3.831548,1.633216 -3.270553,3.759574 0.589477,5.264544 -0.179276,10.53738 -0.362842,15.806257 -0.492006,2.184998 1.163456,4.574232 -0.734888,6.610642 -2.482919,2.325184 -7.30604,2.189143 -9.193497,-0.274767 -2.733688,-1.740626 -8.254447,-3.615254 -6.104247,-6.339626 3.468112,-1.708686 -2.116197,-3.449897 0.431242,-5.080274 5.058402,-1.39256 -2.393215,-2.304318 -0.146889,-4.334645 3.069198,-0.977415 2.056986,-2.518352 -0.219121,-3.540397 1.876567,-1.807151 1.484149,-4.868919 -2.565455,-5.942205 0.150866,-1.805474 2.905737,-4.136876 -1.679967,-5.20493 C 10.260902,27.882167 4.6872697,22.95045 4.5245945,17.652051 z"
+     id="path604"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.72665179;stroke-opacity:1" />
+</svg>
diff --git a/public/pdfjs/web/images/annotation-newparagraph.svg b/public/pdfjs/web/images/annotation-newparagraph.svg
new file mode 100644
index 0000000..38d2497
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-newparagraph.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 32.003143,10.913072 57.432701,53.086929 6.567299,53.083723 z"
+     id="path2985"
+     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:0.83403099;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/public/pdfjs/web/images/annotation-noicon.svg b/public/pdfjs/web/images/annotation-noicon.svg
new file mode 100644
index 0000000..c07d108
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-noicon.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+</svg>
diff --git a/public/pdfjs/web/images/annotation-note.svg b/public/pdfjs/web/images/annotation-note.svg
new file mode 100644
index 0000000..7017365
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-note.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <rect
+     width="36.075428"
+     height="31.096582"
+     x="1.962286"
+     y="4.4517088"
+     id="rect4"
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.23004246;stroke-opacity:1" />
+  <rect
+     width="27.96859"
+     height="1.5012145"
+     x="6.0157046"
+     y="10.285"
+     id="rect6"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="6.0157056"
+     y="23.21689"
+     id="rect8"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="5.8130345"
+     y="28.964394"
+     id="rect10"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="6.0157046"
+     y="17.426493"
+     id="rect12"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+</svg>
diff --git a/public/pdfjs/web/images/annotation-paperclip.svg b/public/pdfjs/web/images/annotation-paperclip.svg
new file mode 100644
index 0000000..2bed225
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-paperclip.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" height="40" width="40">
+  <path d="M9 3.5a1.5 1.5 0 0 0-3-.001v7.95C6 12.83 7.12 14 8.5 14s2.5-1.17 2.5-2.55V5.5a.5.5 0 0 1 1 0v6.03C11.955 13.427 10.405 15 8.5 15S5.044 13.426 5 11.53V3.5a2.5 2.5 0 0 1 5 0v7.003a1.5 1.5 0 0 1-3-.003v-5a.5.5 0 0 1 1 0v5a.5.5 0 0 0 1 0Z"/>
+</svg>
diff --git a/public/pdfjs/web/images/annotation-paragraph.svg b/public/pdfjs/web/images/annotation-paragraph.svg
new file mode 100644
index 0000000..6ae5212
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-paragraph.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <rect
+     width="33.76017"
+     height="33.76017"
+     x="3.119915"
+     y="3.119915"
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  <path
+     d="m 17.692678,34.50206 0,-16.182224 c -1.930515,-0.103225 -3.455824,-0.730383 -4.57593,-1.881473 -1.12011,-1.151067 -1.680164,-2.619596 -1.680164,-4.405591 0,-1.992435 0.621995,-3.5796849 1.865988,-4.7617553 1.243989,-1.1820288 3.06352,-1.7730536 5.458598,-1.7730764 l 9.802246,0 0,2.6789711 -2.229895,0 0,26.3251486 -2.632515,0 0,-26.3251486 -3.45324,0 0,26.3251486 z"
+     style="font-size:29.42051125px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.07795751;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+</svg>
diff --git a/public/pdfjs/web/images/annotation-pushpin.svg b/public/pdfjs/web/images/annotation-pushpin.svg
new file mode 100644
index 0000000..6e0896c
--- /dev/null
+++ b/public/pdfjs/web/images/annotation-pushpin.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" height="40" width="40">
+  <path d="M8.156 12.5a.99.99 0 0 0 .707-.294l.523-2.574L10.5 8.499l1.058-1.04 2.65-.601a.996.996 0 0 0 0-1.414l-3.657-3.658a.996.996 0 0 0-1.414 0l-.523 2.576L7.5 5.499 6.442 6.535l-2.65.6a.996.996 0 0 0 0 1.413l3.657 3.658a.999.999 0 0 0 .707.295z"/>
+  <path d="M9.842.996c-.386 0-.77.146-1.06.44a.5.5 0 0 0-.136.251l-.492 2.43-1.008 1.03-.953.933-2.511.566a.5.5 0 0 0-.243.133 1.505 1.505 0 0 0-.002 2.123l1.477 1.477-2.768 2.767a.5.5 0 0 0 0 .707.5.5 0 0 0 .708 0l2.767-2.767 1.475 1.474a1.494 1.494 0 0 0 2.123-.002.5.5 0 0 0 .135-.254l.492-2.427 1.008-1.024.953-.937 2.511-.57a.5.5 0 0 0 .243-.132c.586-.58.583-1.543.002-2.125l-3.659-3.656A1.501 1.501 0 0 0 9.842.996Zm.05 1.025a.394.394 0 0 1 .305.12l3.658 3.657c.18.18.141.432.002.627l-2.41.545a.5.5 0 0 0-.24.131L10.15 8.142a.5.5 0 0 0-.007.006L9.029 9.283a.5.5 0 0 0-.133.25l-.48 2.36c-.082.053-.165.109-.26.109a.492.492 0 0 1-.353-.149L4.145 8.195c-.18-.18-.141-.432-.002-.627l2.41-.545a.5.5 0 0 0 .238-.13L7.85 5.857a.5.5 0 0 0 .007-.008l1.114-1.138a.5.5 0 0 0 .133-.25l.472-2.323a.619.619 0 0 1 .317-.117Z"/>
+</svg>
diff --git a/public/pdfjs/web/images/checkmark.svg b/public/pdfjs/web/images/checkmark.svg
new file mode 100644
index 0000000..20ba0d2
--- /dev/null
+++ b/public/pdfjs/web/images/checkmark.svg
@@ -0,0 +1,5 @@
+<svg width="11" height="11" viewBox="0 0 11 11" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <g>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M9.79253 0.14683C10.2086 0.418844 10.3253 0.976607 10.0533 1.39263L4.56097 9.79263C4.4081 10.0264 4.15533 10.176 3.87682 10.1974C3.5983 10.2189 3.32561 10.1098 3.13874 9.90217L0.231043 6.6714C-0.10147 6.30194 -0.0715196 5.73288 0.29794 5.40037C0.667399 5.06786 1.23646 5.09781 1.56897 5.46727L3.69438 7.82883L8.54674 0.407579C8.81875 -0.00844234 9.37651 -0.125183 9.79253 0.14683Z" fill="black"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/comment-actionsButton.svg b/public/pdfjs/web/images/comment-actionsButton.svg
new file mode 100644
index 0000000..3161438
--- /dev/null
+++ b/public/pdfjs/web/images/comment-actionsButton.svg
@@ -0,0 +1,3 @@
+<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.51562 11H6.01562L5.51562 11.5V13L6.01562 13.5H7.51562L8.01562 13V11.5L7.51562 11ZM13.2656 11H11.7656L11.2656 11.5V13L11.7656 13.5H13.2656L13.7656 13V11.5L13.2656 11ZM17.5156 11H19.0156L19.5156 11.5V13L19.0156 13.5H17.5156L17.0156 13V11.5L17.5156 11Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/comment-closeButton.svg b/public/pdfjs/web/images/comment-closeButton.svg
new file mode 100644
index 0000000..6fb5f6a
--- /dev/null
+++ b/public/pdfjs/web/images/comment-closeButton.svg
@@ -0,0 +1,3 @@
+<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.6241 11.7759L18.3331 7.06694C18.4423 6.94811 18.5015 6.79167 18.4981 6.63028C18.4948 6.46889 18.4292 6.31502 18.3152 6.20081C18.2011 6.0866 18.0473 6.02088 17.8859 6.01736C17.7245 6.01384 17.568 6.0728 17.4491 6.18194L12.7601 10.8709H12.2721L7.58306 6.18294C7.52495 6.12489 7.45598 6.07886 7.38008 6.04747C7.30418 6.01609 7.22284 5.99995 7.14071 6C7.05857 6.00005 6.97725 6.01627 6.90139 6.04774C6.82553 6.07922 6.75661 6.12533 6.69856 6.18344C6.64052 6.24155 6.59449 6.31052 6.5631 6.38642C6.53171 6.46232 6.51558 6.54366 6.51563 6.62579C6.51572 6.79167 6.5817 6.95071 6.69906 7.06794L11.3861 11.7539V12.2449L6.69906 16.9319C6.5898 17.0508 6.53066 17.2072 6.53399 17.3686C6.53732 17.53 6.60288 17.6839 6.71696 17.7981C6.83104 17.9123 6.98483 17.978 7.14622 17.9815C7.3076 17.985 7.46411 17.9261 7.58306 17.8169L12.2701 13.1299H12.7611L17.4481 17.8169C17.5656 17.934 17.7247 17.9997 17.8906 17.9997C18.0564 17.9997 18.2155 17.934 18.3331 17.8169C18.4504 17.6996 18.5163 17.5404 18.5163 17.3744C18.5163 17.2085 18.4504 17.0493 18.3331 16.9319L13.6241 12.2229V11.7759Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/comment-editButton.svg b/public/pdfjs/web/images/comment-editButton.svg
new file mode 100644
index 0000000..92b1316
--- /dev/null
+++ b/public/pdfjs/web/images/comment-editButton.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <g>
+    <path d="M10.75 7H12.25V5.5H10.75V7Z" fill="black"/>
+    <path d="M7.5 7H9V5.5H7.5V7Z" fill="black"/>
+    <path d="M4.25 7H5.75V5.5H4.25V7Z" fill="black"/>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M2 0C0.895786 0 0 0.895786 0 2V10.5C0 11.6042 0.895786 12.5 2 12.5H3V15.25C3 15.5405 3.16778 15.805 3.43066 15.9287C3.6937 16.0523 4.00473 16.0126 4.22852 15.8271L8.27051 12.4775L13.9941 12.4961C15.1007 12.4991 15.9999 11.6033 16 10.4961V2C16 0.895786 15.1042 0 14 0H2ZM14 1.5C14.2758 1.5 14.5 1.72421 14.5 2V10.4961C14.4999 10.7727 14.2753 10.9969 13.998 10.9961L8.00195 10.9775L7.87207 10.9893C7.74389 11.0115 7.62281 11.0664 7.52148 11.1504L4.5 13.6543V11.75C4.5 11.3358 4.16421 11 3.75 11H2C1.72421 11 1.5 10.7758 1.5 10.5V2C1.5 1.72421 1.72421 1.5 2 1.5H14Z" fill="black"/>
+  </g>
+</svg>
diff --git a/public/pdfjs/web/images/comment-popup-editButton.svg b/public/pdfjs/web/images/comment-popup-editButton.svg
new file mode 100644
index 0000000..e497422
--- /dev/null
+++ b/public/pdfjs/web/images/comment-popup-editButton.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M0.0189877 13.6645L0.612989 10.4635C0.687989 10.0545 0.884989 9.6805 1.18099 9.3825L9.98199 0.5805C10.756 -0.1925 12.015 -0.1945 12.792 0.5805L14.42 2.2085C15.194 2.9835 15.194 4.2435 14.42 5.0185L5.61599 13.8215C5.31999 14.1165 4.94599 14.3125 4.53799 14.3875L1.33599 14.9815C1.26599 14.9935 1.19799 15.0005 1.12999 15.0005C0.832989 15.0005 0.544988 14.8835 0.330988 14.6695C0.0679874 14.4055 -0.0490122 14.0305 0.0189877 13.6645ZM12.472 5.1965L13.632 4.0365L13.631 3.1885L11.811 1.3675L10.963 1.3685L9.80299 2.5285L12.472 5.1965ZM4.31099 13.1585C4.47099 13.1285 4.61799 13.0515 4.73399 12.9345L11.587 6.0815L8.91899 3.4135L2.06599 10.2655C1.94899 10.3835 1.87199 10.5305 1.84099 10.6915L1.36699 13.2485L1.75199 13.6335L4.31099 13.1585Z" fill="black"/>
+</svg>
+
+<!--path d="M0.0189877 14.1645L0.612989 10.9635C0.687989 10.5545 0.884989 10.1805 1.18099 9.8825L9.98199 1.0805C10.756 0.3075 12.015 0.3055 12.792 1.0805L14.42 2.7085C15.194 3.4835 15.194 4.7435 14.42 5.5185L5.61599 14.3215C5.31999 14.6165 4.94599 14.8125 4.53799 14.8875L1.33599 15.4815C1.26599 15.4935 1.19799 15.5005 1.12999 15.5005C0.832989 15.5005 0.544988 15.3835 0.330988 15.1695C0.0679874 14.9055 -0.0490122 14.5305 0.0189877 14.1645ZM12.472 5.6965L13.632 4.5365L13.631 3.6885L11.811 1.8675L10.963 1.8685L9.80299 3.0285L12.472 5.6965ZM4.31099 13.6585C4.47099 13.6285 4.61799 13.5515 4.73399 13.4345L11.587 6.5815L8.91899 3.9135L2.06599 10.7655C1.94899 10.8835 1.87199 11.0305 1.84099 11.1915L1.36699 13.7485L1.75199 14.1335L4.31099 13.6585Z" fill="black"/-->
\ No newline at end of file
diff --git a/public/pdfjs/web/images/cursor-editorFreeHighlight.svg b/public/pdfjs/web/images/cursor-editorFreeHighlight.svg
new file mode 100644
index 0000000..513f6bd
--- /dev/null
+++ b/public/pdfjs/web/images/cursor-editorFreeHighlight.svg
@@ -0,0 +1,6 @@
+<svg width="18" height="19" viewBox="0 0 18 19" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.2 3.09C12.28 3.01 12.43 3 12.43 3C12.48 3 12.58 3.02 12.66 3.1L14.45 4.89C14.58 5.02 14.58 5.22 14.45 5.35L11.7713 8.02872L9.51628 5.77372L12.2 3.09ZM13.2658 5.12L11.7713 6.6145L10.9305 5.77372L12.425 4.27921L13.2658 5.12Z" fill="#FBFBFE"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.98 9.32L8.23 11.57L10.7106 9.08938L8.45562 6.83438L5.98 9.31V9.32ZM8.23 10.1558L9.29641 9.08938L8.45562 8.24859L7.38921 9.315L8.23 10.1558Z" fill="#FBFBFE"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.1526 13.1816L16.2125 7.1217C16.7576 6.58919 17.05 5.8707 17.05 5.12C17.05 4.36931 16.7576 3.65084 16.2126 3.11834L14.4317 1.33747C13.8992 0.79242 13.1807 0.5 12.43 0.5C11.6643 0.5 10.9529 0.812929 10.4329 1.33289L3.68289 8.08289C3.04127 8.72452 3.00459 9.75075 3.57288 10.4363L1.29187 12.7239C1.09186 12.9245 0.990263 13.1957 1.0007 13.4685L1 14.5C0.447715 14.5 0 14.9477 0 15.5V17.5C0 18.0523 0.447715 18.5 1 18.5H16C16.5523 18.5 17 18.0523 17 17.5V15.5C17 14.9477 16.5523 14.5 16 14.5H10.2325C9.83594 14.5 9.39953 13.9347 10.1526 13.1816ZM4.39 9.85L4.9807 10.4407L2.39762 13.0312H6.63877L7.10501 12.565L7.57125 13.0312H8.88875L15.51 6.41C15.86 6.07 16.05 5.61 16.05 5.12C16.05 4.63 15.86 4.17 15.51 3.83L13.72 2.04C13.38 1.69 12.92 1.5 12.43 1.5C11.94 1.5 11.48 1.7 11.14 2.04L4.39 8.79C4.1 9.08 4.1 9.56 4.39 9.85ZM16 17.5V15.5H1V17.5H16Z" fill="#FBFBFE"/>
+<path d="M15.1616 6.05136L15.1616 6.05132L15.1564 6.05645L8.40645 12.8064C8.35915 12.8537 8.29589 12.88 8.23 12.88C8.16411 12.88 8.10085 12.8537 8.05355 12.8064L7.45857 12.2115L7.10501 11.8579L6.75146 12.2115L6.03289 12.93H3.20465L5.33477 10.7937L5.6873 10.4402L5.33426 10.0871L4.74355 9.49645C4.64882 9.40171 4.64882 9.23829 4.74355 9.14355L11.4936 2.39355C11.7436 2.14354 12.0779 2 12.43 2C12.7883 2 13.1179 2.13776 13.3614 2.38839L13.3613 2.38843L13.3664 2.39355L15.1564 4.18355L15.1564 4.18359L15.1616 4.18864C15.4122 4.43211 15.55 4.76166 15.55 5.12C15.55 5.47834 15.4122 5.80789 15.1616 6.05136ZM7.87645 11.9236L8.23 12.2771L8.58355 11.9236L11.0642 9.44293L11.4177 9.08938L11.0642 8.73582L8.80918 6.48082L8.45562 6.12727L8.10207 6.48082L5.62645 8.95645L5.48 9.10289V9.31V9.32V9.52711L5.62645 9.67355L7.87645 11.9236ZM11.4177 8.38227L11.7713 8.73582L12.1248 8.38227L14.8036 5.70355C15.1288 5.37829 15.1288 4.86171 14.8036 4.53645L13.0136 2.74645C12.8186 2.55146 12.5792 2.5 12.43 2.5H12.4134L12.3967 2.50111L12.43 3C12.3967 2.50111 12.3966 2.50112 12.3965 2.50112L12.3963 2.50114L12.3957 2.50117L12.3947 2.50125L12.3924 2.50142L12.387 2.50184L12.3732 2.50311C12.3628 2.50416 12.3498 2.50567 12.3346 2.50784C12.3049 2.51208 12.2642 2.51925 12.2178 2.53146C12.1396 2.55202 11.9797 2.60317 11.8464 2.73645L9.16273 5.42016L8.80918 5.77372L9.16273 6.12727L11.4177 8.38227ZM1.5 16H15.5V17H1.5V16Z" stroke="#15141A"/>
+</svg>
diff --git a/public/pdfjs/web/images/cursor-editorFreeText.svg b/public/pdfjs/web/images/cursor-editorFreeText.svg
new file mode 100644
index 0000000..de2838e
--- /dev/null
+++ b/public/pdfjs/web/images/cursor-editorFreeText.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12 2.75H12.5V2.25V1V0.5H12H10.358C9.91165 0.5 9.47731 0.625661 9.09989 0.860442L9.09886 0.861087L8 1.54837L6.89997 0.860979L6.89911 0.860443C6.5218 0.625734 6.08748 0.5 5.642 0.5H4H3.5V1V2.25V2.75H4H5.642C5.66478 2.75 5.6885 2.75641 5.71008 2.76968C5.71023 2.76977 5.71038 2.76986 5.71053 2.76995L6.817 3.461C6.81704 3.46103 6.81709 3.46105 6.81713 3.46108C6.81713 3.46108 6.81713 3.46108 6.81714 3.46109C6.8552 3.48494 6.876 3.52285 6.876 3.567V8V12.433C6.876 12.4771 6.85523 12.515 6.81722 12.5389C6.81715 12.5389 6.81707 12.539 6.817 12.539L5.70953 13.23C5.70941 13.2301 5.70929 13.2302 5.70917 13.2303C5.68723 13.2438 5.6644 13.25 5.641 13.25H4H3.5V13.75V15V15.5H4H5.642C6.08835 15.5 6.52269 15.3743 6.90011 15.1396L6.90086 15.1391L8 14.4526L9.10003 15.14L9.10089 15.1406C9.47831 15.3753 9.91265 15.501 10.359 15.501H12H12.5V15.001V13.751V13.251H12H10.358C10.3352 13.251 10.3115 13.2446 10.2899 13.2313C10.2897 13.2312 10.2896 13.2311 10.2895 13.231L9.183 12.54C9.18298 12.54 9.18295 12.54 9.18293 12.54C9.18291 12.5399 9.18288 12.5399 9.18286 12.5399C9.14615 12.5169 9.125 12.4797 9.125 12.434V8V3.567C9.125 3.52266 9.14603 3.48441 9.18364 3.4606C9.18377 3.46052 9.1839 3.46043 9.18404 3.46035L10.2895 2.76995C10.2896 2.76985 10.2898 2.76975 10.2899 2.76966C10.3119 2.75619 10.3346 2.75 10.358 2.75H12Z" fill="black" stroke="white"/>
+</svg>
diff --git a/public/pdfjs/web/images/cursor-editorInk.svg b/public/pdfjs/web/images/cursor-editorInk.svg
new file mode 100644
index 0000000..1dadb5c
--- /dev/null
+++ b/public/pdfjs/web/images/cursor-editorInk.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0.0189877 13.6645L0.612989 10.4635C0.687989 10.0545 0.884989 9.6805 1.18099 9.3825L9.98199 0.5805C10.756 -0.1925 12.015 -0.1945 12.792 0.5805L14.42 2.2085C15.194 2.9835 15.194 4.2435 14.42 5.0185L5.61599 13.8215C5.31999 14.1165 4.94599 14.3125 4.53799 14.3875L1.33599 14.9815C1.26599 14.9935 1.19799 15.0005 1.12999 15.0005C0.832989 15.0005 0.544988 14.8835 0.330988 14.6695C0.0679874 14.4055 -0.0490122 14.0305 0.0189877 13.6645Z" fill="white"/>
+<path d="M0.0189877 13.6645L0.612989 10.4635C0.687989 10.0545 0.884989 9.6805 1.18099 9.3825L9.98199 0.5805C10.756 -0.1925 12.015 -0.1945 12.792 0.5805L14.42 2.2085C15.194 2.9835 15.194 4.2435 14.42 5.0185L5.61599 13.8215C5.31999 14.1165 4.94599 14.3125 4.53799 14.3875L1.33599 14.9815C1.26599 14.9935 1.19799 15.0005 1.12999 15.0005C0.832989 15.0005 0.544988 14.8835 0.330988 14.6695C0.0679874 14.4055 -0.0490122 14.0305 0.0189877 13.6645ZM12.472 5.1965L13.632 4.0365L13.631 3.1885L11.811 1.3675L10.963 1.3685L9.80299 2.5285L12.472 5.1965ZM4.31099 13.1585C4.47099 13.1285 4.61799 13.0515 4.73399 12.9345L11.587 6.0815L8.91899 3.4135L2.06599 10.2655C1.94899 10.3835 1.87199 10.5305 1.84099 10.6915L1.36699 13.2485L1.75199 13.6335L4.31099 13.1585Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/cursor-editorTextHighlight.svg b/public/pdfjs/web/images/cursor-editorTextHighlight.svg
new file mode 100644
index 0000000..800340c
--- /dev/null
+++ b/public/pdfjs/web/images/cursor-editorTextHighlight.svg
@@ -0,0 +1,8 @@
+<svg width="29" height="32" viewBox="0 0 29 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M28 16.75C28.2761 16.75 28.5 16.5261 28.5 16.25V15C28.5 14.7239 28.2761 14.5 28 14.5H26.358C25.9117 14.5 25.4773 14.6257 25.0999 14.8604L25.0989 14.8611L24 15.5484L22.9 14.861L22.8991 14.8604C22.5218 14.6257 22.0875 14.5 21.642 14.5H20C19.7239 14.5 19.5 14.7239 19.5 15V16.25C19.5 16.5261 19.7239 16.75 20 16.75H21.642C21.6648 16.75 21.6885 16.7564 21.7101 16.7697C21.7102 16.7698 21.7104 16.7699 21.7105 16.77L22.817 17.461C22.817 17.461 22.8171 17.4611 22.8171 17.4611C22.8171 17.4611 22.8171 17.4611 22.8171 17.4611C22.8552 17.4849 22.876 17.5229 22.876 17.567V22.625V27.683C22.876 27.7271 22.8552 27.765 22.8172 27.7889C22.8171 27.7889 22.8171 27.789 22.817 27.789L21.7095 28.48C21.7094 28.4801 21.7093 28.4802 21.7092 28.4803C21.6872 28.4938 21.6644 28.5 21.641 28.5H20C19.7239 28.5 19.5 28.7239 19.5 29V30.25C19.5 30.5261 19.7239 30.75 20 30.75H21.642C22.0883 30.75 22.5227 30.6243 22.9001 30.3896L22.9009 30.3891L24 29.7026L25.1 30.39L25.1009 30.3906C25.4783 30.6253 25.9127 30.751 26.359 30.751H28C28.2761 30.751 28.5 30.5271 28.5 30.251V29.001C28.5 28.7249 28.2761 28.501 28 28.501H26.358C26.3352 28.501 26.3115 28.4946 26.2899 28.4813C26.2897 28.4812 26.2896 28.4811 26.2895 28.481L25.183 27.79C25.183 27.79 25.183 27.79 25.1829 27.79C25.1829 27.7899 25.1829 27.7899 25.1829 27.7899C25.1462 27.7669 25.125 27.7297 25.125 27.684V22.625V17.567C25.125 17.5227 25.146 17.4844 25.1836 17.4606C25.1838 17.4605 25.1839 17.4604 25.184 17.4603L26.2895 16.77C26.2896 16.7699 26.2898 16.7698 26.2899 16.7697C26.3119 16.7562 26.3346 16.75 26.358 16.75H28Z" fill="black" stroke="#FBFBFE" stroke-linejoin="round"/>
+<path d="M24.625 17.567C24.625 17.35 24.735 17.152 24.918 17.037L26.026 16.345C26.126 16.283 26.24 16.25 26.358 16.25H28V15H26.358C26.006 15 25.663 15.099 25.364 15.285L24.256 15.978C24.161 16.037 24.081 16.113 24 16.187C23.918 16.113 23.839 16.037 23.744 15.978L22.635 15.285C22.336 15.099 21.993 15 21.642 15H20V16.25H21.642C21.759 16.25 21.874 16.283 21.974 16.345L23.082 17.037C23.266 17.152 23.376 17.35 23.376 17.567V22.625V27.683C23.376 27.9 23.266 28.098 23.082 28.213L21.973 28.905C21.873 28.967 21.759 29 21.641 29H20V30.25H21.642C21.994 30.25 22.337 30.151 22.636 29.965L23.744 29.273C23.84 29.213 23.919 29.137 24 29.064C24.081 29.137 24.161 29.213 24.256 29.273L25.365 29.966C25.664 30.152 26.007 30.251 26.359 30.251H28V29.001H26.358C26.241 29.001 26.126 28.968 26.026 28.906L24.918 28.214C24.734 28.099 24.625 27.901 24.625 27.684V22.625V17.567Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.2 2.59C12.28 2.51 12.43 2.5 12.43 2.5C12.48 2.5 12.58 2.52 12.66 2.6L14.45 4.39C14.58 4.52 14.58 4.72 14.45 4.85L11.7713 7.52872L9.51628 5.27372L12.2 2.59ZM13.2658 4.62L11.7713 6.1145L10.9305 5.27372L12.425 3.77921L13.2658 4.62Z" fill="#FBFBFE"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.98 8.82L8.23 11.07L10.7106 8.58938L8.45562 6.33438L5.98 8.81V8.82ZM8.23 9.65579L9.29641 8.58938L8.45562 7.74859L7.38921 8.815L8.23 9.65579Z" fill="#FBFBFE"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.1526 12.6816L16.2125 6.6217C16.7576 6.08919 17.05 5.3707 17.05 4.62C17.05 3.86931 16.7576 3.15084 16.2126 2.61834L14.4317 0.837474C13.8992 0.29242 13.1807 0 12.43 0C11.6643 0 10.9529 0.312929 10.4329 0.832893L3.68289 7.58289C3.04127 8.22452 3.00459 9.25075 3.57288 9.93634L1.29187 12.2239C1.09186 12.4245 0.990263 12.6957 1.0007 12.9685L1 14C0.447715 14 0 14.4477 0 15V17C0 17.5523 0.447715 18 1 18H16C16.5523 18 17 17.5523 17 17V15C17 14.4477 16.5523 14 16 14H10.2325C9.83594 14 9.39953 13.4347 10.1526 12.6816ZM4.39 9.35L4.9807 9.9407L2.39762 12.5312H6.63877L7.10501 12.065L7.57125 12.5312H8.88875L15.51 5.91C15.86 5.57 16.05 5.11 16.05 4.62C16.05 4.13 15.86 3.67 15.51 3.33L13.72 1.54C13.38 1.19 12.92 1 12.43 1C11.94 1 11.48 1.2 11.14 1.54L4.39 8.29C4.1 8.58 4.1 9.06 4.39 9.35ZM16 17V15H1V17H16Z" fill="#FBFBFE"/>
+<path d="M15.1616 5.55136L15.1616 5.55132L15.1564 5.55645L8.40645 12.3064C8.35915 12.3537 8.29589 12.38 8.23 12.38C8.16411 12.38 8.10085 12.3537 8.05355 12.3064L7.45857 11.7115L7.10501 11.3579L6.75146 11.7115L6.03289 12.43H3.20465L5.33477 10.2937L5.6873 9.94019L5.33426 9.58715L4.74355 8.99645C4.64882 8.90171 4.64882 8.73829 4.74355 8.64355L11.4936 1.89355C11.7436 1.64354 12.0779 1.5 12.43 1.5C12.7883 1.5 13.1179 1.63776 13.3614 1.88839L13.3613 1.88843L13.3664 1.89355L15.1564 3.68355L15.1564 3.68359L15.1616 3.68864C15.4122 3.93211 15.55 4.26166 15.55 4.62C15.55 4.97834 15.4122 5.30789 15.1616 5.55136ZM5.48 8.82V9.02711L5.62645 9.17355L7.87645 11.4236L8.23 11.7771L8.58355 11.4236L11.0642 8.94293L11.4177 8.58938L11.0642 8.23582L8.80918 5.98082L8.45562 5.62727L8.10207 5.98082L5.62645 8.45645L5.48 8.60289V8.81V8.82ZM11.4177 7.88227L11.7713 8.23582L12.1248 7.88227L14.8036 5.20355C15.1288 4.87829 15.1288 4.36171 14.8036 4.03645L13.0136 2.24645C12.8186 2.05146 12.5792 2 12.43 2H12.4134L12.3967 2.00111L12.43 2.5C12.3967 2.00111 12.3966 2.00112 12.3965 2.00112L12.3963 2.00114L12.3957 2.00117L12.3947 2.00125L12.3924 2.00142L12.387 2.00184L12.3732 2.00311C12.3628 2.00416 12.3498 2.00567 12.3346 2.00784C12.3049 2.01208 12.2642 2.01925 12.2178 2.03146C12.1396 2.05202 11.9797 2.10317 11.8464 2.23645L9.16273 4.92016L8.80918 5.27372L9.16273 5.62727L11.4177 7.88227ZM1.5 16.5V15.5H15.5V16.5H1.5Z" stroke="#15141A"/>
+</svg>
diff --git a/public/pdfjs/web/images/editor-toolbar-delete.svg b/public/pdfjs/web/images/editor-toolbar-delete.svg
new file mode 100644
index 0000000..f84520d
--- /dev/null
+++ b/public/pdfjs/web/images/editor-toolbar-delete.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path fill-rule="evenodd" clip-rule="evenodd"
+        d="M11 3H13.6C14 3 14.3 3.3 14.3 3.6C14.3 3.9 14 4.2 13.7 4.2H13.3V14C13.3 15.1 12.4 16 11.3 16H4.80005C3.70005 16 2.80005 15.1 2.80005 14V4.2H2.40005C2.00005 4.2 1.80005 4 1.80005 3.6C1.80005 3.2 2.00005 3 2.40005 3H5.00005V2C5.00005 0.9 5.90005 0 7.00005 0H9.00005C10.1 0 11 0.9 11 2V3ZM6.90005 1.2L6.30005 1.8V3H9.80005V1.8L9.20005 1.2H6.90005ZM11.4 14.7L12 14.1V4.2H4.00005V14.1L4.60005 14.7H11.4ZM7.00005 12.4C7.00005 12.7 6.70005 13 6.40005 13C6.10005 13 5.80005 12.7 5.80005 12.4V7.6C5.70005 7.3 6.00005 7 6.40005 7C6.80005 7 7.00005 7.3 7.00005 7.6V12.4ZM10.2001 12.4C10.2001 12.7 9.90006 13 9.60006 13C9.30006 13 9.00006 12.7 9.00006 12.4V7.6C9.00006 7.3 9.30006 7 9.60006 7C9.90006 7 10.2001 7.3 10.2001 7.6V12.4Z"
+        fill="black" />
+</svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/editor-toolbar-edit.svg b/public/pdfjs/web/images/editor-toolbar-edit.svg
new file mode 100644
index 0000000..692de38
--- /dev/null
+++ b/public/pdfjs/web/images/editor-toolbar-edit.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.9815 14.3461L14.3875 11.1451C14.3125 10.7361 14.1155 10.3621 13.8195 10.0641L5.0185 1.26214C4.2445 0.489141 2.9855 0.487141 2.2085 1.26214L0.5805 2.89014C-0.1935 3.66514 -0.1935 4.92514 0.5805 5.70014L9.3845 14.5031C9.6805 14.7981 10.0545 14.9941 10.4625 15.0691L13.6645 15.6631C13.7345 15.6751 13.8025 15.6821 13.8705 15.6821C14.1675 15.6821 14.4555 15.5651 14.6695 15.3511C14.9325 15.0871 15.0495 14.7121 14.9815 14.3461ZM2.5285 5.87814L1.3685 4.71814L1.3695 3.87014L3.1895 2.04914L4.0375 2.05014L5.1975 3.21014L2.5285 5.87814ZM10.6895 13.8401C10.5295 13.8101 10.3825 13.7331 10.2665 13.6161L3.4135 6.76314L6.0815 4.09514L12.9345 10.9471C13.0515 11.0651 13.1285 11.2121 13.1595 11.3731L13.6335 13.9301L13.2485 14.3151L10.6895 13.8401Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/findbarButton-next.svg b/public/pdfjs/web/images/findbarButton-next.svg
new file mode 100644
index 0000000..8cb39be
--- /dev/null
+++ b/public/pdfjs/web/images/findbarButton-next.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10.999 8.352L5.534 13.818C5.41551 13.9303 5.25786 13.9918 5.09466 13.9895C4.93146 13.9872 4.77561 13.9212 4.66033 13.8057C4.54505 13.6902 4.47945 13.5342 4.47752 13.3709C4.47559 13.2077 4.53748 13.0502 4.65 12.932L9.585 7.998L4.651 3.067C4.53862 2.94864 4.47691 2.79106 4.47903 2.62786C4.48114 2.46466 4.54692 2.30874 4.66233 2.19333C4.77774 2.07792 4.93366 2.01215 5.09686 2.01003C5.26006 2.00792 5.41763 2.06962 5.536 2.182L11 7.647L10.999 8.352Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/findbarButton-previous.svg b/public/pdfjs/web/images/findbarButton-previous.svg
new file mode 100644
index 0000000..b610879
--- /dev/null
+++ b/public/pdfjs/web/images/findbarButton-previous.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.001 8.352L10.466 13.818C10.5845 13.9303 10.7421 13.9918 10.9053 13.9895C11.0685 13.9872 11.2244 13.9212 11.3397 13.8057C11.4549 13.6902 11.5205 13.5342 11.5225 13.3709C11.5244 13.2077 11.4625 13.0502 11.35 12.932L6.416 7.999L11.349 3.067C11.4614 2.94864 11.5231 2.79106 11.521 2.62786C11.5189 2.46466 11.4531 2.30874 11.3377 2.19333C11.2223 2.07792 11.0663 2.01215 10.9031 2.01003C10.7399 2.00792 10.5824 2.06962 10.464 2.182L5 7.647L5.001 8.352Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/gv-toolbarButton-download.svg b/public/pdfjs/web/images/gv-toolbarButton-download.svg
new file mode 100644
index 0000000..d56cf3c
--- /dev/null
+++ b/public/pdfjs/web/images/gv-toolbarButton-download.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16.969 10.059C17.262 9.766 17.737 9.766 18.03 10.059C18.323 10.352 18.323 10.827 18.03 11.12L12.15 17H11.35L5.46896 11.12C5.17596 10.827 5.17596 10.352 5.46896 10.059C5.76196 9.766 6.23696 9.766 6.52996 10.059L11 14.529V2.75C11 2.336 11.336 2 11.75 2C12.164 2 12.5 2.336 12.499 2.75V14.529L16.969 10.059ZM4.98193 19.7L5.78193 20.5H17.7169L18.5169 19.7V17.75C18.5169 17.336 18.8529 17 19.2669 17C19.6809 17 20.0169 17.336 20.0169 17.75V19.5C20.0169 20.881 18.8979 22 17.5169 22H5.98193C4.60093 22 3.48193 20.881 3.48193 19.5V17.75C3.48193 17.336 3.81793 17 4.23193 17C4.64593 17 4.98193 17.336 4.98193 17.75V19.7Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/loading-icon.gif b/public/pdfjs/web/images/loading-icon.gif
new file mode 100644
index 0000000..1c72ebb
--- /dev/null
+++ b/public/pdfjs/web/images/loading-icon.gif
Binary files differ
diff --git a/public/pdfjs/web/images/loading.svg b/public/pdfjs/web/images/loading.svg
new file mode 100644
index 0000000..0a15ff6
--- /dev/null
+++ b/public/pdfjs/web/images/loading.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" style="animation:spinLoadingIcon 1s steps(12,end) infinite"><style>@keyframes spinLoadingIcon{to{transform:rotate(360deg)}}</style><path d="M7 3V1s0-1 1-1 1 1 1 1v2s0 1-1 1-1-1-1-1z"/><path d="M4.63 4.1l-1-1.73S3.13 1.5 4 1c.87-.5 1.37.37 1.37.37l1 1.73s.5.87-.37 1.37c-.87.57-1.37-.37-1.37-.37z" fill-opacity=".93"/><path d="M3.1 6.37l-1.73-1S.5 4.87 1 4c.5-.87 1.37-.37 1.37-.37l1.73 1s.87.5.37 1.37c-.5.87-1.37.37-1.37.37z" fill-opacity=".86"/><path d="M3 9H1S0 9 0 8s1-1 1-1h2s1 0 1 1-1 1-1 1z" fill-opacity=".79"/><path d="M4.1 11.37l-1.73 1S1.5 12.87 1 12c-.5-.87.37-1.37.37-1.37l1.73-1s.87-.5 1.37.37c.5.87-.37 1.37-.37 1.37z" fill-opacity=".72"/><path d="M3.63 13.56l1-1.73s.5-.87 1.37-.37c.87.5.37 1.37.37 1.37l-1 1.73s-.5.87-1.37.37c-.87-.5-.37-1.37-.37-1.37z" fill-opacity=".65"/><path d="M7 15v-2s0-1 1-1 1 1 1 1v2s0 1-1 1-1-1-1-1z" fill-opacity=".58"/><path d="M10.63 14.56l-1-1.73s-.5-.87.37-1.37c.87-.5 1.37.37 1.37.37l1 1.73s.5.87-.37 1.37c-.87.5-1.37-.37-1.37-.37z" fill-opacity=".51"/><path d="M13.56 12.37l-1.73-1s-.87-.5-.37-1.37c.5-.87 1.37-.37 1.37-.37l1.73 1s.87.5.37 1.37c-.5.87-1.37.37-1.37.37z" fill-opacity=".44"/><path d="M15 9h-2s-1 0-1-1 1-1 1-1h2s1 0 1 1-1 1-1 1z" fill-opacity=".37"/><path d="M14.56 5.37l-1.73 1s-.87.5-1.37-.37c-.5-.87.37-1.37.37-1.37l1.73-1s.87-.5 1.37.37c.5.87-.37 1.37-.37 1.37z" fill-opacity=".3"/><path d="M9.64 3.1l.98-1.66s.5-.874 1.37-.37c.87.5.37 1.37.37 1.37l-1 1.73s-.5.87-1.37.37c-.87-.5-.37-1.37-.37-1.37z" fill-opacity=".23"/></svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/messageBar_closingButton.svg b/public/pdfjs/web/images/messageBar_closingButton.svg
new file mode 100644
index 0000000..8a40715
--- /dev/null
+++ b/public/pdfjs/web/images/messageBar_closingButton.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M7.85822 8.84922L4.85322 11.8542C4.75891 11.9453 4.63261 11.9957 4.50151 11.9946C4.37042 11.9934 4.24501 11.9408 4.15231 11.8481C4.0596 11.7554 4.00702 11.63 4.00588 11.4989C4.00474 11.3678 4.05514 11.2415 4.14622 11.1472L7.15122 8.14222V7.85922L4.14622 4.85322C4.05514 4.75891 4.00474 4.63261 4.00588 4.50151C4.00702 4.37042 4.0596 4.24501 4.15231 4.15231C4.24501 4.0596 4.37042 4.00702 4.50151 4.00588C4.63261 4.00474 4.75891 4.05514 4.85322 4.14622L7.85822 7.15122H8.14122L11.1462 4.14622C11.2405 4.05514 11.3668 4.00474 11.4979 4.00588C11.629 4.00702 11.7544 4.0596 11.8471 4.15231C11.9398 4.24501 11.9924 4.37042 11.9936 4.50151C11.9947 4.63261 11.9443 4.75891 11.8532 4.85322L8.84822 7.85922V8.14222L11.8532 11.1472C11.9443 11.2415 11.9947 11.3678 11.9936 11.4989C11.9924 11.63 11.9398 11.7554 11.8471 11.8481C11.7544 11.9408 11.629 11.9934 11.4979 11.9946C11.3668 11.9957 11.2405 11.9453 11.1462 11.8542L8.14122 8.84922L8.14222 8.85022L7.85822 8.84922Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/messageBar_info.svg b/public/pdfjs/web/images/messageBar_info.svg
new file mode 100644
index 0000000..b12b6be
--- /dev/null
+++ b/public/pdfjs/web/images/messageBar_info.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M7.625 0.5C6.64009 0.5 5.66482 0.693993 4.75487 1.0709C3.84493 1.44781 3.01814 2.00026 2.3217 2.6967C1.62526 3.39314 1.07281 4.21993 0.695904 5.12987C0.318993 6.03982 0.125 7.01509 0.125 8C0.125 8.98491 0.318993 9.96018 0.695904 10.8701C1.07281 11.7801 1.62526 12.6069 2.3217 13.3033C3.01814 13.9997 3.84493 14.5522 4.75487 14.9291C5.66482 15.306 6.64009 15.5 7.625 15.5C9.61412 15.5 11.5218 14.7098 12.9283 13.3033C14.3348 11.8968 15.125 9.98912 15.125 8C15.125 6.01088 14.3348 4.10322 12.9283 2.6967C11.5218 1.29018 9.61412 0.5 7.625 0.5ZM8.25 11.375C8.25 11.5408 8.18415 11.6997 8.06694 11.8169C7.94973 11.9342 7.79076 12 7.625 12C7.45924 12 7.30027 11.9342 7.18306 11.8169C7.06585 11.6997 7 11.5408 7 11.375V6.938C7 6.77224 7.06585 6.61327 7.18306 6.49606C7.30027 6.37885 7.45924 6.313 7.625 6.313C7.79076 6.313 7.94973 6.37885 8.06694 6.49606C8.18415 6.61327 8.25 6.77224 8.25 6.938V11.375ZM8.25 5L8 5.25H7.25L7 5V4.25L7.25 4H8L8.25 4.25V5Z" fill="black" />
+</svg>
diff --git a/public/pdfjs/web/images/messageBar_warning.svg b/public/pdfjs/web/images/messageBar_warning.svg
new file mode 100644
index 0000000..011cfcf
--- /dev/null
+++ b/public/pdfjs/web/images/messageBar_warning.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M14.8748 12.037L9.37782 2.037C8.99682 1.346 8.31082 1 7.62482 1C6.93882 1 6.25282 1.346 5.87282 2.037L0.375823 12.037C-0.358177 13.37 0.606823 15 2.12782 15H13.1228C14.6428 15 15.6078 13.37 14.8748 12.037ZM8.24982 11.75L7.99982 12H7.24982L6.99982 11.75V11L7.24982 10.75H7.99982L8.24982 11V11.75ZM8.24982 9.062C8.24982 9.22776 8.18398 9.38673 8.06677 9.50394C7.94955 9.62115 7.79058 9.687 7.62482 9.687C7.45906 9.687 7.30009 9.62115 7.18288 9.50394C7.06567 9.38673 6.99982 9.22776 6.99982 9.062V5.625C6.99982 5.45924 7.06567 5.30027 7.18288 5.18306C7.30009 5.06585 7.45906 5 7.62482 5C7.79058 5 7.94955 5.06585 8.06677 5.18306C8.18398 5.30027 8.24982 5.45924 8.24982 5.625V9.062Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/pages_closeButton.svg b/public/pdfjs/web/images/pages_closeButton.svg
new file mode 100644
index 0000000..92fc5ec
--- /dev/null
+++ b/public/pdfjs/web/images/pages_closeButton.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M14 3.06055L9.06055 8L14 12.9385L12.9395 14L8 9.06055L3.06152 14L2.00098 12.9395L6.93848 8L2 3.06152L3.06055 2.00098L7.99902 6.93945L12.9385 2L14 3.06055Z" fill="black"/>
+</svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/pages_selected.svg b/public/pdfjs/web/images/pages_selected.svg
new file mode 100644
index 0000000..32c4816
--- /dev/null
+++ b/public/pdfjs/web/images/pages_selected.svg
@@ -0,0 +1,7 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <mask id="mask">
+    <rect width="16" height="16" rx="2" fill="white"/>
+    <path d="M12 8L4 8" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  </mask>
+  <rect width="16" height="16" fill="black" mask="url(#mask)"/>
+</svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/pages_viewArrow.svg b/public/pdfjs/web/images/pages_viewArrow.svg
new file mode 100644
index 0000000..a4932d4
--- /dev/null
+++ b/public/pdfjs/web/images/pages_viewArrow.svg
@@ -0,0 +1,3 @@
+<svg width="8" height="10" viewBox="0 0 8 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M4.23336 7.46639L7.84736 3.85339C7.89401 3.8071 7.93104 3.75203 7.9563 3.69136C7.98157 3.63069 7.99458 3.56562 7.99458 3.49989C7.99458 3.43417 7.98157 3.3691 7.9563 3.30843C7.93104 3.24776 7.89401 3.19269 7.84736 3.14639C7.75359 3.05266 7.62644 3 7.49386 3C7.36127 3 7.23412 3.05266 7.14036 3.14639L3.99236 6.29339L0.847356 3.14739C0.753055 3.05631 0.626754 3.00592 0.495655 3.00706C0.364557 3.0082 0.239151 3.06078 0.146447 3.15348C0.0537425 3.24619 0.00115811 3.37159 1.89013e-05 3.50269C-0.00112031 3.63379 0.0492769 3.76009 0.140356 3.85439L3.75236 7.46739L4.23336 7.46639Z" fill="black"/>
+</svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/pages_viewButton.svg b/public/pdfjs/web/images/pages_viewButton.svg
new file mode 100644
index 0000000..24c518d
--- /dev/null
+++ b/public/pdfjs/web/images/pages_viewButton.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path fill-rule="evenodd" clip-rule="evenodd" d="M3 7H5C5.53043 7 6.03914 6.78929 6.41421 6.41421C6.78929 6.03914 7 5.53043 7 5V3C7 2.46957 6.78929 1.96086 6.41421 1.58579C6.03914 1.21071 5.53043 1 5 1H3C2.46957 1 1.96086 1.21071 1.58579 1.58579C1.21071 1.96086 1 2.46957 1 3V5C1 5.53043 1.21071 6.03914 1.58579 6.41421C1.96086 6.78929 2.46957 7 3 7ZM11 7H13C13.5304 7 14.0391 6.78929 14.4142 6.41421C14.7893 6.03914 15 5.53043 15 5V3C15 2.46957 14.7893 1.96086 14.4142 1.58579C14.0391 1.21071 13.5304 1 13 1H11C10.4696 1 9.96086 1.21071 9.58579 1.58579C9.21071 1.96086 9 2.46957 9 3V5C9 5.53043 9.21071 6.03914 9.58579 6.41421C9.96086 6.78929 10.4696 7 11 7ZM5 15H3C2.46957 15 1.96086 14.7893 1.58579 14.4142C1.21071 14.0391 1 13.5304 1 13V11C1 10.4696 1.21071 9.96086 1.58579 9.58579C1.96086 9.21071 2.46957 9 3 9H5C5.53043 9 6.03914 9.21071 6.41421 9.58579C6.78929 9.96086 7 10.4696 7 11V13C7 13.5304 6.78929 14.0391 6.41421 14.4142C6.03914 14.7893 5.53043 15 5 15ZM11 15H13C13.5304 15 14.0391 14.7893 14.4142 14.4142C14.7893 14.0391 15 13.5304 15 13V11C15 10.4696 14.7893 9.96086 14.4142 9.58579C14.0391 9.21071 13.5304 9 13 9H11C10.4696 9 9.96086 9.21071 9.58579 9.58579C9.21071 9.96086 9 10.4696 9 11V13C9 13.5304 9.21071 14.0391 9.58579 14.4142C9.96086 14.7893 10.4696 15 11 15Z" fill="black"/>
+</svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg b/public/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg
new file mode 100644
index 0000000..dd3917b
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8 1.5C4.41015 1.5 1.5 4.41015 1.5 8C1.5 11.5899 4.41015 14.5 8 14.5C11.5899 14.5 14.5 11.5899 14.5 8C14.5 4.41015 11.5899 1.5 8 1.5ZM0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8ZM8.75 4V5.5H7.25V4H8.75ZM8.75 12V7H7.25V12H8.75Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-firstPage.svg b/public/pdfjs/web/images/secondaryToolbarButton-firstPage.svg
new file mode 100644
index 0000000..f5c917f
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-firstPage.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14 3.5H2V5H14V3.5ZM8 8.811L12.939 13.75L14.001 12.689L8.531 7.219C8.238 6.926 7.763 6.926 7.47 7.219L2 12.689L3.061 13.75L8 8.811Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-handTool.svg b/public/pdfjs/web/images/secondaryToolbarButton-handTool.svg
new file mode 100644
index 0000000..b7073b5
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-handTool.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.75 2.125C7.75 1.78021 8.03021 1.5 8.375 1.5C8.71979 1.5 9 1.78021 9 2.125V3.125V8H10.5V3.125C10.5 2.78021 10.7802 2.5 11.125 2.5C11.4698 2.5 11.75 2.78021 11.75 3.125V4.625V8H13.25V4.625C13.25 4.28021 13.5302 4 13.875 4C14.2198 4 14.5 4.28021 14.5 4.625V12.0188L13.3802 13.6628C13.2954 13.7872 13.25 13.9344 13.25 14.085V16H14.75V14.3162L15.8698 12.6722C15.9546 12.5478 16 12.4006 16 12.25V4.625C16 3.45179 15.0482 2.5 13.875 2.5C13.6346 2.5 13.4035 2.53996 13.188 2.6136C12.959 1.68724 12.1219 1 11.125 1C10.8235 1 10.5366 1.06286 10.2768 1.17618C9.9281 0.478968 9.20726 0 8.375 0C7.54274 0 6.8219 0.478968 6.47323 1.17618C6.21337 1.06286 5.9265 1 5.625 1C4.45179 1 3.5 1.95179 3.5 3.125V7.25317C2.66504 6.54282 1.41035 6.58199 0.621672 7.37067C-0.208221 8.20056 -0.208221 9.54644 0.621672 10.3763L0.62188 10.3765L5.499 15.2498V16H6.999V14.939C6.999 14.74 6.9199 14.5491 6.77912 14.4085L1.68233 9.31567C1.43823 9.07156 1.43823 8.67544 1.68233 8.43133C1.92644 8.18722 2.32257 8.18722 2.56667 8.43133L3.71967 9.58433C3.93417 9.79883 4.25676 9.863 4.53701 9.74691C4.81727 9.63082 5 9.35735 5 9.054V3.125C5 2.78021 5.28022 2.5 5.625 2.5C5.96921 2.5 6.24906 2.77927 6.25 3.12326V8H7.75L7.75 3.125L7.75 3.12178V2.125Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-lastPage.svg b/public/pdfjs/web/images/secondaryToolbarButton-lastPage.svg
new file mode 100644
index 0000000..c04f650
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-lastPage.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8 8.189L12.939 3.25L14 4.311L8.531 9.781C8.238 10.074 7.763 10.074 7.47 9.781L2 4.311L3.061 3.25L8 8.189ZM14 13.5V12H2V13.5H14Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg b/public/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg
new file mode 100644
index 0000000..da73a1b
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.4105 4.83612L4.77001 6.19601C5.06701 6.49201 4.85701 7.00001 4.43701 7.00001H0.862006C0.602006 7.00001 0.391006 6.78901 0.391006 6.52901V2.95401C0.391006 2.53401 0.899006 2.32401 1.19601 2.62101L2.32796 3.75328C3.67958 1.78973 5.9401 0.5 8.5 0.5C12.636 0.5 16 3.864 16 8C16 12.136 12.636 15.5 8.5 15.5C4.704 15.5 1.566 12.663 1.075 9H2.59C3.068 11.833 5.532 14 8.5 14C11.809 14 14.5 11.309 14.5 8C14.5 4.691 11.809 2 8.5 2C6.35262 2 4.46893 3.13503 3.4105 4.83612Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg b/public/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg
new file mode 100644
index 0000000..c41ce73
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.5895 4.83613L11.23 6.19601C10.933 6.49201 11.143 7.00001 11.563 7.00001H15.138C15.398 7.00001 15.609 6.78901 15.609 6.52901V2.95401C15.609 2.53401 15.101 2.32401 14.804 2.62101L13.672 3.75328C12.3204 1.78973 10.0599 0.5 7.5 0.5C3.364 0.5 0 3.864 0 8C0 12.136 3.364 15.5 7.5 15.5C11.296 15.5 14.434 12.663 14.925 9H13.41C12.932 11.833 10.468 14 7.5 14C4.191 14 1.5 11.309 1.5 8C1.5 4.691 4.191 2 7.5 2C9.64738 2 11.5311 3.13503 12.5895 4.83613Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg b/public/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg
new file mode 100644
index 0000000..fb440b9
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3 3.78C3 2.7621 2.13279 2.11834 1.25 2.01476V2H1V3.5C1.18133 3.5 1.32279 3.5609 1.40708 3.63029C1.48961 3.69823 1.5 3.75458 1.5 3.78V11.72C1.5 11.7454 1.48961 11.8018 1.40708 11.8697C1.32279 11.9391 1.18133 12 1 12V13.5H1.25V13.4852C2.13279 13.3817 3 12.7379 3 11.72V3.78ZM10.5 4C10.5 3.72386 10.2761 3.5 10 3.5H6.5C6.22386 3.5 6 3.72386 6 4V11.5C6 11.7761 6.22386 12 6.5 12H10C10.2761 12 10.5 11.7761 10.5 11.5V4ZM10 2C11.1046 2 12 2.89543 12 4V11.5C12 12.6046 11.1046 13.5 10 13.5H6.5C5.39543 13.5 4.5 12.6046 4.5 11.5V4C4.5 2.89543 5.39543 2 6.5 2H10ZM15.5 2H15.25V2.01476C14.3672 2.11834 13.5 2.7621 13.5 3.78V11.72C13.5 12.7379 14.3672 13.3817 15.25 13.4852V13.5H15.5V12C15.3187 12 15.1772 11.9391 15.0929 11.8697C15.0104 11.8018 15 11.7454 15 11.72V3.78C15 3.75458 15.0104 3.69823 15.0929 3.63029C15.1772 3.5609 15.3187 3.5 15.5 3.5V2Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg b/public/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg
new file mode 100644
index 0000000..64a9f50
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.5 2C3.5 1.72421 3.72421 1.5 4 1.5H12C12.2758 1.5 12.5 1.72421 12.5 2V14C12.5 14.2758 12.2758 14.5 12 14.5H4C3.72421 14.5 3.5 14.2758 3.5 14V2ZM4 0C2.89579 0 2 0.895786 2 2V14C2 15.1042 2.89579 16 4 16H12C13.1042 16 14 15.1042 14 14V2C14 0.895786 13.1042 0 12 0H4ZM5.89301 6H7.25V10H5.89301C5.54301 10 5.36801 10.423 5.61501 10.67L7.72101 12.776C7.87401 12.929 8.12301 12.929 8.27601 12.776L10.383 10.669C10.63 10.422 10.455 9.99902 10.105 9.99902H8.75V6H10.106C10.456 6 10.632 5.577 10.383 5.331L8.27601 3.224C8.12301 3.071 7.87401 3.071 7.72101 3.224L5.61501 5.33C5.36801 5.577 5.54301 6 5.89301 6Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg b/public/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg
new file mode 100644
index 0000000..dc7e805
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 1V1.25H2.01476C2.11834 2.13279 2.7621 3 3.78 3H11.72C12.7379 3 13.3817 2.13279 13.4852 1.25H13.5V1H12C12 1.18133 11.9391 1.32279 11.8697 1.40708C11.8018 1.48961 11.7454 1.5 11.72 1.5H3.78C3.75458 1.5 3.69823 1.48961 3.63029 1.40708C3.5609 1.32279 3.5 1.18133 3.5 1H2ZM4 6C3.72386 6 3.5 6.22386 3.5 6.5V10C3.5 10.2761 3.72386 10.5 4 10.5H11.5C11.7761 10.5 12 10.2761 12 10V6.5C12 6.22386 11.7761 6 11.5 6H4ZM2 6.5C2 5.39543 2.89543 4.5 4 4.5H11.5C12.6046 4.5 13.5 5.39543 13.5 6.5V10C13.5 11.1046 12.6046 12 11.5 12H4C2.89543 12 2 11.1046 2 10V6.5ZM3.78 13.5C2.7621 13.5 2.11834 14.3672 2.01476 15.25H2V15.5H3.5C3.5 15.3187 3.5609 15.1772 3.63029 15.0929C3.69823 15.0104 3.75458 15 3.78 15H11.72C11.7454 15 11.8018 15.0104 11.8697 15.0929C11.9391 15.1772 12 15.3187 12 15.5H13.5V15.25H13.4852C13.3817 14.3672 12.7379 13.5 11.72 13.5H3.78Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg b/public/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg
new file mode 100644
index 0000000..75fe26b
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2.5 1C2.5 1.27579 2.72421 1.5 3 1.5H5C5.27579 1.5 5.5 1.27579 5.5 1H7C7 2.10421 6.10421 3 5 3H3C1.89579 3 1 2.10421 1 1H2.5ZM2.5 6C2.5 5.72421 2.72421 5.5 3 5.5H5C5.27579 5.5 5.5 5.72421 5.5 6V10C5.5 10.2758 5.27579 10.5 5 10.5H3C2.72421 10.5 2.5 10.2758 2.5 10V6ZM3 4C1.89579 4 1 4.89579 1 6V10C1 11.1042 1.89579 12 3 12H5C6.10421 12 7 11.1042 7 10V6C7 4.89579 6.10421 4 5 4H3ZM10 6C10 5.72421 10.2242 5.5 10.5 5.5H12.5C12.7758 5.5 13 5.72421 13 6V10C13 10.2758 12.7758 10.5 12.5 10.5H10.5C10.2242 10.5 10 10.2758 10 10V6ZM10.5 4C9.39579 4 8.5 4.89579 8.5 6V10C8.5 11.1042 9.39579 12 10.5 12H12.5C13.6042 12 14.5 11.1042 14.5 10V6C14.5 4.89579 13.6042 4 12.5 4H10.5ZM3 14.5C2.72421 14.5 2.5 14.7242 2.5 15H1C1 13.8958 1.89579 13 3 13H5C6.10421 13 7 13.8958 7 15H5.5C5.5 14.7242 5.27579 14.5 5 14.5H3ZM10 15C10 14.7242 10.2242 14.5 10.5 14.5H12.5C12.7758 14.5 13 14.7242 13 15H14.5C14.5 13.8958 13.6042 13 12.5 13H10.5C9.39579 13 8.5 13.8958 8.5 15H10ZM10.5 1.5C10.2242 1.5 10 1.27579 10 1H8.5C8.5 2.10421 9.39579 3 10.5 3H12.5C13.6042 3 14.5 2.10421 14.5 1H13C13 1.27579 12.7758 1.5 12.5 1.5H10.5Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-selectTool.svg b/public/pdfjs/web/images/secondaryToolbarButton-selectTool.svg
new file mode 100644
index 0000000..94d5141
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-selectTool.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0.371588 2.93131C-0.203366 1.33422 1.3342 -0.20335 2.93129 0.371603L2.93263 0.372085L12.0716 3.68171C12.0718 3.68178 12.0714 3.68163 12.0716 3.68171C13.4459 4.17758 13.8478 5.9374 12.8076 6.9776L11.8079 7.97727L14.6876 10.8569C15.4705 11.6398 15.4705 12.9047 14.6876 13.6876L13.6476 14.7276C12.8647 15.5105 11.5998 15.5105 10.8169 14.7276L7.93725 11.8479L6.97758 12.8076C5.93739 13.8478 4.17779 13.4465 3.68192 12.0722C3.68184 12.072 3.682 12.0724 3.68192 12.0722L0.371588 2.93131ZM1.78292 2.42323C1.78298 2.4234 1.78286 2.42305 1.78292 2.42323L5.09281 11.5629C5.21725 11.9082 5.65728 12.0066 5.91692 11.7469L7.93725 9.72661L11.8776 13.6669C12.0747 13.864 12.3898 13.864 12.5869 13.6669L13.6269 12.6269C13.824 12.4298 13.824 12.1147 13.6269 11.9176L9.68659 7.97727L11.7469 5.91694C12.0066 5.65729 11.9081 5.21727 11.5629 5.09283L11.5619 5.09245L2.42321 1.78293C2.42304 1.78287 2.42339 1.783 2.42321 1.78293C2.02067 1.63847 1.63846 2.02069 1.78292 2.42323Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg b/public/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg
new file mode 100644
index 0000000..ce201e3
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" d="M2 3.5C1.72421 3.5 1.5 3.72421 1.5 4V12.5C1.5 12.7758 1.72421 13 2 13H7.25V3.5H2ZM14 13H8.75V3.5H14C14.2758 3.5 14.5 3.72421 14.5 4V12.5C14.5 12.7758 14.2758 13 14 13ZM0 4C0 2.89579 0.895786 2 2 2H14C15.1042 2 16 2.89579 16 4V12.5C16 13.6042 15.1042 14.5 14 14.5H2C0.895786 14.5 0 13.6042 0 12.5V4ZM10 6.5H11.5V7.5H10V9H11.5V10H10V11.5H12.25C12.6642 11.5 13 11.1642 13 10.75V5.75C13 5.33579 12.6642 5 12.25 5H10V6.5ZM4.5 6.5H3V5H5.25C5.66421 5 6 5.33579 6 5.75V7.75C6 8.03408 5.8395 8.29378 5.58541 8.42082L4.5 8.96353V10H6V11.5H3.75C3.33579 11.5 3 11.1642 3 10.75V8.5C3 8.21592 3.1605 7.95622 3.41459 7.82918L4.5 7.28647V6.5Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg b/public/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg
new file mode 100644
index 0000000..e8d487f
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4 1.5C3.72421 1.5 3.5 1.72421 3.5 2V14C3.5 14.2758 3.72421 14.5 4 14.5H12C12.2758 14.5 12.5 14.2758 12.5 14V2C12.5 1.72421 12.2758 1.5 12 1.5H4ZM2 2C2 0.895786 2.89579 0 4 0H12C13.1042 0 14 0.895786 14 2V14C14 15.1042 13.1042 16 12 16H4C2.89579 16 2 15.1042 2 14V2Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg b/public/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg
new file mode 100644
index 0000000..9211a42
--- /dev/null
+++ b/public/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M1.5 4C1.5 3.72421 1.72421 3.5 2 3.5H7.25V13H2C1.72421 13 1.5 12.7758 1.5 12.5V4ZM8.75 13V3.5H14C14.2758 3.5 14.5 3.72421 14.5 4V12.5C14.5 12.7758 14.2758 13 14 13H8.75ZM2 2C0.895786 2 0 2.89579 0 4V12.5C0 13.6042 0.895786 14.5 2 14.5H14C15.1042 14.5 16 13.6042 16 12.5V4C16 2.89579 15.1042 2 14 2H2ZM4.75 5H3V6.5H4V11.5H5.5V5.75C5.5 5.33579 5.16421 5 4.75 5ZM10 6.5H11.5V7.28647L10.4146 7.82918C10.1605 7.95622 10 8.21592 10 8.5V10.75C10 11.1642 10.3358 11.5 10.75 11.5H13V10H11.5V8.96353L12.5854 8.42082C12.8395 8.29378 13 8.03408 13 7.75V5.75C13 5.33579 12.6642 5 12.25 5H10V6.5Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-bookmark.svg b/public/pdfjs/web/images/toolbarButton-bookmark.svg
new file mode 100644
index 0000000..c4c37c9
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-bookmark.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 3.5C1.72421 3.5 1.5 3.72421 1.5 4V12C1.5 12.2758 1.72421 12.5 2 12.5H14C14.2758 12.5 14.5 12.2758 14.5 12V4C14.5 3.72421 14.2758 3.5 14 3.5H2ZM0 4C0 2.89579 0.895786 2 2 2H14C15.1042 2 16 2.89579 16 4V12C16 13.1042 15.1042 14 14 14H2C0.895786 14 0 13.1042 0 12V4ZM8.75 8.75H7.25V7.25H8.75V8.75ZM8.00001 4.625C5.91142 4.625 4.14736 5.94291 3.45159 7.77847L3.36761 8L3.45159 8.22153C4.14736 10.0571 5.91142 11.375 8.00001 11.375C10.0886 11.375 11.8527 10.0571 12.5484 8.22153L12.6324 8L12.5484 7.77847C11.8527 5.94291 10.0886 4.625 8.00001 4.625ZM8.00001 10.125C6.53912 10.125 5.28508 9.25455 4.71282 8C5.28508 6.74545 6.53912 5.875 8.00001 5.875C9.4609 5.875 10.7149 6.74545 11.2872 8C10.7149 9.25455 9.4609 10.125 8.00001 10.125Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-currentOutlineItem.svg b/public/pdfjs/web/images/toolbarButton-currentOutlineItem.svg
new file mode 100644
index 0000000..01e6762
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-currentOutlineItem.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10.803 4.74998V6.02436C10.803 6.39302 10.3571 6.57793 10.0967 6.31753L7.87716 4.098C7.71566 3.93649 7.71566 3.67434 7.87716 3.51283L10.0967 1.29329C10.3571 1.0329 10.8036 1.21722 10.8036 1.58588V3.24998H15V4.74998H10.803ZM8 1.24998H3V2.74998H6.5L8 1.24998ZM6.5 5.24998H3V6.74998H8L6.5 5.24998ZM3 13.25H15V14.75H3V13.25ZM6 9.24998H15V10.75H6V9.24998ZM1.5 5.24998H0V6.74998H1.5V5.24998ZM0 13.25H1.5V14.75H0V13.25ZM1.5 1.24998H0V2.74998H1.5V1.24998ZM3 9.24998H4.5V10.75H3V9.24998Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-download.svg b/public/pdfjs/web/images/toolbarButton-download.svg
new file mode 100644
index 0000000..e2e850a
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-download.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9.79407 7.31811H7.86307C7.41807 7.31811 7.19407 7.85711 7.50907 8.17211L10.1911 10.8541C10.3861 11.0491 10.7031 11.0491 10.8981 10.8541L13.5801 8.17211C13.8951 7.85711 13.6721 7.31811 13.2261 7.31811H11.2941V4.38211H11.2961V3.13211H11.2941V2.30811H9.79407V3.13211H9.79107V4.38211H9.79507V7.31811H9.79407Z" fill="black"/>
+<path d="M14 3.13208H12.796V4.38208H14C14.345 4.38208 14.625 4.66208 14.625 5.00708V13.0071C14.625 13.3521 14.345 13.6321 14 13.6321H2C1.655 13.6321 1.375 13.3521 1.375 13.0071V3.00708C1.375 2.66208 1.655 2.38208 2 2.38208H5.643C5.82 2.38208 5.989 2.45808 6.108 2.58908L7.536 4.17508C7.654 4.30708 7.823 4.38208 8 4.38208H8.291V3.13208H8.278L7.036 1.75208C6.681 1.35808 6.173 1.13208 5.642 1.13208H2C0.966 1.13208 0.125 1.97308 0.125 3.00708V13.0071C0.125 14.0411 0.966 14.8821 2 14.8821H14C15.034 14.8821 15.875 14.0411 15.875 13.0071V5.00708C15.875 3.97308 15.034 3.13208 14 3.13208Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-editorFreeText.svg b/public/pdfjs/web/images/toolbarButton-editorFreeText.svg
new file mode 100644
index 0000000..13a67bd
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-editorFreeText.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3 2.5C2.72421 2.5 2.5 2.72421 2.5 3V4.75H1V3C1 1.89579 1.89579 1 3 1H13C14.1042 1 15 1.89579 15 3V4.75H13.5V3C13.5 2.72421 13.2758 2.5 13 2.5H3Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M11 15H5V13.5H11V15Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.75 2.25V14.25H7.25V2.25H8.75Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-editorHighlight.svg b/public/pdfjs/web/images/toolbarButton-editorHighlight.svg
new file mode 100644
index 0000000..b3cd7fd
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-editorHighlight.svg
@@ -0,0 +1,6 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <g>
+      <path fill-rule="evenodd" clip-rule="evenodd" d="M7.10918 11.66C7.24918 11.8 7.43918 11.88 7.63918 11.88C7.83918 11.88 8.02918 11.8 8.16918 11.66L14.9192 4.91C15.2692 4.57 15.4592 4.11 15.4592 3.62C15.4592 3.13 15.2692 2.67 14.9192 2.33L13.1292 0.54C12.7892 0.19 12.3292 0 11.8392 0C11.3492 0 10.8892 0.2 10.5492 0.54L3.79918 7.29C3.50918 7.58 3.50918 8.06 3.79918 8.35L4.38988 8.9407L1.40918 11.93H5.64918L6.51419 11.065L7.10918 11.66ZM7.63918 10.07L5.38918 7.82V7.81L7.8648 5.33438L10.1198 7.58938L7.63918 10.07ZM11.1805 6.52872L13.8592 3.85C13.9892 3.72 13.9892 3.52 13.8592 3.39L12.0692 1.6C11.9892 1.52 11.8892 1.5 11.8392 1.5C11.8392 1.5 11.6892 1.51 11.6092 1.59L8.92546 4.27372L11.1805 6.52872Z" fill="#000"/>
+      <path d="M0.40918 14H15.4092V16H0.40918V14Z" fill="#000"/>
+    </g>
+  </svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/toolbarButton-editorInk.svg b/public/pdfjs/web/images/toolbarButton-editorInk.svg
new file mode 100644
index 0000000..b579eec
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-editorInk.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2.49913 12.6251C2.61913 12.6251 2.73913 12.6051 2.85713 12.5661L6.29013 11.4201L13.2891 4.4221C14.0191 3.6911 14.0191 2.5011 13.2891 1.7701L12.2291 0.710098C11.4971 -0.0199023 10.3091 -0.0199023 9.57713 0.710098L2.57813 7.7091L1.43313 11.1451C1.29813 11.5511 1.40213 11.9931 1.70513 12.2951C1.92113 12.5101 2.20613 12.6251 2.49913 12.6251ZM10.4611 1.5951C10.7031 1.3511 11.1021 1.3511 11.3441 1.5951L12.4051 2.6561C12.6491 2.8991 12.6491 3.2961 12.4051 3.5391L11.3401 4.6051L9.39513 2.6601L10.4611 1.5951ZM3.67013 8.3851L8.51013 3.5451L10.4541 5.4891L5.61413 10.3301L2.69713 11.3031L3.67013 8.3851Z" fill="black"/>
+<path d="M14.8169 13.314L13.0229 13.862C12.3309 14.073 11.5909 14.111 10.8859 13.968L8.80391 13.551C7.58491 13.308 6.29791 13.48 5.18491 14.036C3.95291 14.652 2.46691 14.412 1.49191 13.436L1.44091 13.385L0.60791 14.321C1.46291 15.175 2.59991 15.625 3.75291 15.625C4.42891 15.625 5.10991 15.471 5.74391 15.153C6.60891 14.721 7.60891 14.586 8.55891 14.777L10.6409 15.194C11.5509 15.376 12.5009 15.327 13.3879 15.056L15.1819 14.508L14.8169 13.314Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-editorSignature.svg b/public/pdfjs/web/images/toolbarButton-editorSignature.svg
new file mode 100644
index 0000000..0b4e904
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-editorSignature.svg
@@ -0,0 +1,6 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11.618 12.868L11.254 13.25H10.423C10.335 13.396 10.182 13.5 10 13.5H2C1.725 13.5 1.5 13.275 1.5 13V2C1.5 1.725 1.725 1.5 2 1.5H6.939L7 1.561V4.5C7 4.776 7.224 5 7.5 5H10.439L10.5 5.061V6.515L12 5.015V4.75C12 4.551 11.921 4.36 11.78 4.22L7.78 0.22C7.64 0.079 7.449 0 7.25 0H2C0.895 0 0 0.895 0 2V13C0 14.105 0.895 15 2 15H10C11.105 15 12 14.105 12 13V12.486L11.618 12.868Z" fill="black"/>
+<path d="M13.836 4.946C13.962 4.819 14.13 4.75 14.309 4.75C14.487 4.75 14.655 4.819 14.782 4.945L15.805 5.969C15.931 6.094 16 6.262 16 6.441C16 6.621 15.931 6.789 15.805 6.915L14.9397 7.78033L12.9707 5.81134L13.836 4.946Z" fill="black"/>
+<path d="M12.4403 6.34167L8.84 9.942C8.793 9.989 8.767 10.052 8.767 10.119V11.75C8.767 11.888 8.879 12 9.017 12H10.616L10.793 11.927L14.4093 8.31067L12.4403 6.34167Z" fill="black"/>
+<path d="M7.517 9.84799V10.016H7.516V11.517C7.49168 11.4944 7.46584 11.4738 7.44007 11.4532C7.39062 11.4138 7.34148 11.3746 7.304 11.322L7.081 11.009C7.071 10.992 7.037 10.946 6.966 10.957C6.93 10.962 6.882 10.982 6.859 11.046C6.705 11.486 6.492 12.087 5.938 12.087H5.921C5.317 12.07 5.009 11.557 4.745 9.98599L4.382 10.954C4.146 11.585 3.535 12.009 2.861 12.009H2.5V10.759H2.861C3.017 10.759 3.158 10.661 3.213 10.515L3.883 8.72799C4.05 8.28199 4.494 8.01899 4.955 8.07299C5.434 8.12799 5.796 8.48599 5.858 8.96399C5.921 9.43699 5.98 9.80399 6.035 10.085C6.24 9.89099 6.504 9.76099 6.795 9.71999C7.048 9.68399 7.291 9.74599 7.517 9.84799Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-editorStamp.svg b/public/pdfjs/web/images/toolbarButton-editorStamp.svg
new file mode 100644
index 0000000..a1fef49
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-editorStamp.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="black">
+  <path d="M3 1a2 2 0 0 0-2 2l0 10a2 2 0 0 0 2 2l10 0a2 2 0 0 0 2-2l0-10a2 2 0 0 0-2-2L3 1zm10.75 12.15-.6.6-10.3 0-.6-.6 0-10.3.6-.6 10.3 0 .6.6 0 10.3z"/>
+  <path d="m11 12-6 0a1 1 0 0 1-1-1l0-1.321a.75.75 0 0 1 .218-.529L6.35 7.005a.75.75 0 0 1 1.061-.003l2.112 2.102.612-.577a.75.75 0 0 1 1.047.017l.6.605a.75.75 0 0 1 .218.529L12 11a1 1 0 0 1-1 1z"/>
+  <path d="m11.6 5-1.2 0-.4.4 0 1.2.4.4 1.2 0 .4-.4 0-1.2z"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-menuArrow.svg b/public/pdfjs/web/images/toolbarButton-menuArrow.svg
new file mode 100644
index 0000000..82ffeaa
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-menuArrow.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.23336 10.4664L11.8474 6.85339C11.894 6.8071 11.931 6.75203 11.9563 6.69136C11.9816 6.63069 11.9946 6.56562 11.9946 6.49989C11.9946 6.43417 11.9816 6.3691 11.9563 6.30843C11.931 6.24776 11.894 6.19269 11.8474 6.14639C11.7536 6.05266 11.6264 6 11.4939 6C11.3613 6 11.2341 6.05266 11.1404 6.14639L7.99236 9.29339L4.84736 6.14739C4.75305 6.05631 4.62675 6.00592 4.49566 6.00706C4.36456 6.0082 4.23915 6.06078 4.14645 6.15348C4.05374 6.24619 4.00116 6.37159 4.00002 6.50269C3.99888 6.63379 4.04928 6.76009 4.14036 6.85439L7.75236 10.4674L8.23336 10.4664Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-openFile.svg b/public/pdfjs/web/images/toolbarButton-openFile.svg
new file mode 100644
index 0000000..e773781
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-openFile.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10.4287 1.08398C10.5111 1.02905 10.608 0.999824 10.707 1H14.7L15 1.3V5.293C15 5.39194 14.9706 5.48864 14.9156 5.57088C14.8606 5.65311 14.7824 5.71718 14.691 5.75498C14.5996 5.79277 14.499 5.80259 14.402 5.78319C14.3049 5.76379 14.2159 5.71605 14.146 5.646L12.973 4.473L12.692 4.192L9.067 7.817C8.94923 7.93347 8.79034 7.99888 8.6247 7.99907C8.45907 7.99925 8.30003 7.93421 8.182 7.818C8.06518 7.70036 7.99962 7.54129 7.99962 7.3755C7.99962 7.20971 8.06518 7.05065 8.182 6.933L11.807 3.308L10.353 1.854C10.2829 1.78407 10.2351 1.6949 10.2158 1.59779C10.1964 1.50068 10.2063 1.40001 10.2442 1.30854C10.2821 1.21707 10.3464 1.13891 10.4287 1.08398ZM7.81694 2.06694C7.69973 2.18415 7.54076 2.25 7.375 2.25H2.85L2.25 2.85V13.15L2.85 13.75H13.15L13.75 13.15V8.625C13.75 8.45924 13.8158 8.30027 13.9331 8.18306C14.0503 8.06585 14.2092 8 14.375 8C14.5408 8 14.6997 8.06585 14.8169 8.18306C14.9342 8.30027 15 8.45924 15 8.625V13C15 13.5304 14.7893 14.0391 14.4142 14.4142C14.0391 14.7893 13.5304 15 13 15H3C2.46957 15 1.96086 14.7893 1.58579 14.4142C1.21071 14.0391 1 13.5304 1 13V3C1 2.46957 1.21071 1.96086 1.58579 1.58579C1.96086 1.21071 2.46957 1 3 1H7.375C7.54076 1 7.69973 1.06585 7.81694 1.18306C7.93415 1.30027 8 1.45924 8 1.625C8 1.79076 7.93415 1.94973 7.81694 2.06694Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-pageDown.svg b/public/pdfjs/web/images/toolbarButton-pageDown.svg
new file mode 100644
index 0000000..1fc12e7
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-pageDown.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.35176 10.9989L13.8178 5.53391C13.876 5.47594 13.9222 5.40702 13.9537 5.33113C13.9851 5.25524 14.0013 5.17387 14.0012 5.0917C14.0011 5.00954 13.9848 4.9282 13.9531 4.85238C13.9215 4.77656 13.8751 4.70775 13.8168 4.64991C13.6991 4.53309 13.5401 4.46753 13.3743 4.46753C13.2085 4.46753 13.0494 4.53309 12.9318 4.64991L7.99776 9.58491L3.06776 4.65091C2.9494 4.53853 2.79183 4.47682 2.62863 4.47894C2.46542 4.48106 2.3095 4.54683 2.19409 4.66224C2.07868 4.77765 2.01291 4.93357 2.01079 5.09677C2.00868 5.25997 2.07039 5.41754 2.18276 5.53591L7.64776 10.9999L8.35176 10.9989Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-pageUp.svg b/public/pdfjs/web/images/toolbarButton-pageUp.svg
new file mode 100644
index 0000000..0936b9a
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-pageUp.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.35179 5.001L13.8178 10.466C13.876 10.524 13.9222 10.5929 13.9537 10.6688C13.9852 10.7447 14.0013 10.826 14.0012 10.9082C14.0011 10.9904 13.9848 11.0717 13.9531 11.1475C13.9215 11.2234 13.8751 11.2922 13.8168 11.35C13.6991 11.4668 13.5401 11.5324 13.3743 11.5324C13.2085 11.5324 13.0494 11.4668 12.9318 11.35L7.99879 6.416L3.06679 11.349C2.94842 11.4614 2.79085 11.5231 2.62765 11.521C2.46445 11.5189 2.30853 11.4531 2.19312 11.3377C2.07771 11.2223 2.01193 11.0663 2.00982 10.9031C2.0077 10.7399 2.06941 10.5824 2.18179 10.464L7.64779 5L8.35179 5.001Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-presentationMode.svg b/public/pdfjs/web/images/toolbarButton-presentationMode.svg
new file mode 100644
index 0000000..901d567
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-presentationMode.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M1.5 3C1.5 2.72421 1.72421 2.5 2 2.5H14C14.2758 2.5 14.5 2.72421 14.5 3V11C14.5 11.2758 14.2758 11.5 14 11.5H2C1.72421 11.5 1.5 11.2758 1.5 11V3ZM2 1C0.895786 1 0 1.89579 0 3V11C0 12.1042 0.895786 13 2 13H2.64979L1.35052 15.2499L2.64949 16L4.38194 13H11.6391L13.3715 16L14.6705 15.2499L13.3712 13H14C15.1042 13 16 12.1042 16 11V3C16 1.89579 15.1042 1 14 1H2ZM5.79501 4.64401V9.35601C5.79501 9.85001 6.32901 10.159 6.75701 9.91401L10.88 7.55801C11.312 7.31201 11.312 6.68901 10.88 6.44201L6.75701 4.08601C6.32801 3.84101 5.79501 4.15001 5.79501 4.64401Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-print.svg b/public/pdfjs/web/images/toolbarButton-print.svg
new file mode 100644
index 0000000..97a3904
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-print.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13 4H12V2C12 1.46957 11.7893 0.960859 11.4142 0.585786C11.0391 0.210714 10.5304 0 10 0L6 0C5.46957 0 4.96086 0.210714 4.58579 0.585786C4.21071 0.960859 4 1.46957 4 2V4H3C2.46957 4 1.96086 4.21071 1.58579 4.58579C1.21071 4.96086 1 5.46957 1 6V11C1 11.5304 1.21071 12.0391 1.58579 12.4142C1.96086 12.7893 2.46957 13 3 13H4V14C4 14.5304 4.21071 15.0391 4.58579 15.4142C4.96086 15.7893 5.46957 16 6 16H10C10.5304 16 11.0391 15.7893 11.4142 15.4142C11.7893 15.0391 12 14.5304 12 14V13H13C13.5304 13 14.0391 12.7893 14.4142 12.4142C14.7893 12.0391 15 11.5304 15 11V6C15 5.46957 14.7893 4.96086 14.4142 4.58579C14.0391 4.21071 13.5304 4 13 4V4ZM10.75 14.15L10.15 14.75H5.85L5.25 14.15V10H10.75V14.15ZM10.75 4H5.25V1.85L5.85 1.25H10.15L10.75 1.85V4V4ZM13 7.6L12.6 8H11.4L11 7.6V6.4L11.4 6H12.6L13 6.4V7.6Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-search.svg b/public/pdfjs/web/images/toolbarButton-search.svg
new file mode 100644
index 0000000..0cc7ae2
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-search.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10.089 10.973L13.934 14.817C13.9918 14.8754 14.0605 14.9218 14.1364 14.9534C14.2122 14.9851 14.2936 15.0013 14.3757 15.0012C14.4579 15.0011 14.5392 14.9847 14.6149 14.9529C14.6907 14.9211 14.7594 14.8746 14.817 14.816C14.875 14.7579 14.921 14.6889 14.9523 14.613C14.9836 14.5372 14.9997 14.4559 14.9996 14.3738C14.9995 14.2917 14.9833 14.2104 14.9518 14.1346C14.9203 14.0588 14.8741 13.99 14.816 13.932L10.983 10.1L10.989 9.67299C11.489 8.96674 11.8152 8.15249 11.9413 7.29642C12.0674 6.44034 11.9897 5.5666 11.7145 4.74621C11.4394 3.92582 10.9745 3.18192 10.3578 2.57498C9.74104 1.96804 8.98979 1.51519 8.16509 1.25322C7.34039 0.991255 6.46551 0.927572 5.61157 1.06735C4.75763 1.20712 3.94871 1.54641 3.25057 2.05764C2.55243 2.56887 1.98476 3.23761 1.59371 4.0095C1.20265 4.7814 0.999236 5.63468 1 6.49999C1 7.95868 1.57946 9.35763 2.61091 10.3891C3.64236 11.4205 5.04131 12 6.5 12C7.689 12 8.788 11.62 9.687 10.978L10.089 10.973V10.973ZM6.5 10.75C4.157 10.75 2.25 8.84299 2.25 6.49999C2.25 4.15699 4.157 2.24999 6.5 2.24999C8.843 2.24999 10.75 4.15699 10.75 6.49999C10.75 8.84299 8.843 10.75 6.5 10.75Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg b/public/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg
new file mode 100644
index 0000000..cace863
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2.53406 13.818L7.99906 8.35203L8.00006 7.64703L2.53606 2.18203C2.41769 2.06965 2.26012 2.00795 2.09692 2.01006C1.93372 2.01218 1.7778 2.07795 1.66239 2.19336C1.54698 2.30877 1.48121 2.46469 1.47909 2.62789C1.47697 2.79109 1.53868 2.94867 1.65106 3.06703L6.58506 7.99803L1.65006 12.932C1.53754 13.0503 1.47565 13.2078 1.47758 13.371C1.47951 13.5342 1.54511 13.6902 1.66039 13.8057C1.77567 13.9213 1.93152 13.9872 2.09472 13.9895C2.25792 13.9918 2.41557 13.9303 2.53406 13.818ZM8.53406 13.818L13.9991 8.35203L14.0001 7.64703L8.53606 2.18203C8.4177 2.06965 8.26012 2.00795 8.09692 2.01006C7.93372 2.01218 7.7778 2.07795 7.66239 2.19336C7.54698 2.30877 7.48121 2.46469 7.47909 2.62789C7.47697 2.79109 7.53868 2.94867 7.65106 3.06703L12.5851 7.99803L7.65006 12.932C7.53754 13.0503 7.47565 13.2078 7.47758 13.371C7.47951 13.5342 7.54511 13.6902 7.66039 13.8057C7.77567 13.9213 7.93152 13.9872 8.09472 13.9895C8.25792 13.9918 8.41557 13.9303 8.53406 13.818Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-viewAttachments.svg b/public/pdfjs/web/images/toolbarButton-viewAttachments.svg
new file mode 100644
index 0000000..ab73f6e
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-viewAttachments.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.5 3.75C3.5 1.67879 5.17879 0 7.25 0C9.32121 0 11 1.67879 11 3.75V10.25C11 11.4922 9.99221 12.5 8.75 12.5C7.50779 12.5 6.5 11.4922 6.5 10.25V3.5H8V10.25C8 10.6638 8.33621 11 8.75 11C9.16379 11 9.5 10.6638 9.5 10.25V3.75C9.5 2.50721 8.49279 1.5 7.25 1.5C6.00721 1.5 5 2.50721 5 3.75V10.75C5 12.8208 6.67921 14.5 8.75 14.5C10.8208 14.5 12.5 12.8208 12.5 10.75V3.5H14V10.75C14 13.6492 11.6492 16 8.75 16C5.85079 16 3.5 13.6492 3.5 10.75V3.75Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-viewLayers.svg b/public/pdfjs/web/images/toolbarButton-viewLayers.svg
new file mode 100644
index 0000000..1d72668
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-viewLayers.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.36645 2.34562C8.13878 2.21813 7.86122 2.21813 7.63355 2.34562L1.38355 5.84562C1.14669 5.97826 1 6.22853 1 6.5C1 6.77147 1.14669 7.02174 1.38355 7.15438L7.63355 10.6544C7.86122 10.7819 8.13878 10.7819 8.36645 10.6544L14.6165 7.15438C14.8533 7.02174 15 6.77147 15 6.5C15 6.22853 14.8533 5.97826 14.6165 5.84562L8.36645 2.34562ZM8 9.14041L3.28499 6.5L8 3.85959L12.715 6.5L8 9.14041ZM1.63647 9.0766L7.99999 12.6404L14.3255 9.09761L15.0585 10.4063L8.36649 14.1543C8.13881 14.2818 7.86122 14.2819 7.63353 14.1543L0.903534 10.3853L1.63647 9.0766Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-viewOutline.svg b/public/pdfjs/web/images/toolbarButton-viewOutline.svg
new file mode 100644
index 0000000..7ed1bd9
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-viewOutline.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3 1.25H15V2.75H3V1.25ZM15 5.25H3V6.75H15V5.25ZM15 13.25H3V14.75H15V13.25ZM15 9.25H6V10.75H15V9.25ZM0 5.25H1.5V6.75H0V5.25ZM1.5 13.25H0V14.75H1.5V13.25ZM0 1.25H1.5V2.75H0V1.25ZM4.5 9.25H3V10.75H4.5V9.25Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-viewThumbnail.svg b/public/pdfjs/web/images/toolbarButton-viewThumbnail.svg
new file mode 100644
index 0000000..040d123
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-viewThumbnail.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.5 2C3.5 1.72421 3.72421 1.5 4 1.5H5.25C5.52579 1.5 5.75 1.72421 5.75 2V5.25C5.75 5.52579 5.52579 5.75 5.25 5.75H4C3.72421 5.75 3.5 5.52579 3.5 5.25V2ZM4 0C2.89579 0 2 0.895786 2 2V5.25C2 6.35421 2.89579 7.25 4 7.25H5.25C6.35421 7.25 7.25 6.35421 7.25 5.25V2C7.25 0.895786 6.35421 0 5.25 0H4ZM3.5 10.75C3.5 10.4742 3.72421 10.25 4 10.25H5.25C5.52579 10.25 5.75 10.4742 5.75 10.75V14C5.75 14.2758 5.52579 14.5 5.25 14.5H4C3.72421 14.5 3.5 14.2758 3.5 14V10.75ZM4 8.75C2.89579 8.75 2 9.64579 2 10.75V14C2 15.1042 2.89579 16 4 16H5.25C6.35421 16 7.25 15.1042 7.25 14V10.75C7.25 9.64579 6.35421 8.75 5.25 8.75H4ZM10.75 1.5C10.4742 1.5 10.25 1.72421 10.25 2V5.25C10.25 5.52579 10.4742 5.75 10.75 5.75H12C12.2758 5.75 12.5 5.52579 12.5 5.25V2C12.5 1.72421 12.2758 1.5 12 1.5H10.75ZM8.75 2C8.75 0.895786 9.64579 0 10.75 0H12C13.1042 0 14 0.895786 14 2V5.25C14 6.35421 13.1042 7.25 12 7.25H10.75C9.64579 7.25 8.75 6.35421 8.75 5.25V2ZM10.25 10.75C10.25 10.4742 10.4742 10.25 10.75 10.25H12C12.2758 10.25 12.5 10.4742 12.5 10.75V14C12.5 14.2758 12.2758 14.5 12 14.5H10.75C10.4742 14.5 10.25 14.2758 10.25 14V10.75ZM10.75 8.75C9.64579 8.75 8.75 9.64579 8.75 10.75V14C8.75 15.1042 9.64579 16 10.75 16H12C13.1042 16 14 15.1042 14 14V10.75C14 9.64579 13.1042 8.75 12 8.75H10.75Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg b/public/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg
new file mode 100644
index 0000000..1d8d0e4
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" d="M16 4V12.25C16 12.7804 15.7893 13.2891 15.4142 13.6642C15.0391 14.0393 14.5304 14.25 14 14.25H2C1.46957 14.25 0.960859 14.0393 0.585786 13.6642C0.210714 13.2891 0 12.7804 0 12.25V4C0 3.46957 0.210714 2.96086 0.585786 2.58579C0.960859 2.21071 1.46957 2 2 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4ZM1.25 3.85V12.4L1.85 13H6.75V3.25H1.85L1.25 3.85ZM14.15 13H8V3.25H14.15L14.75 3.85V12.4L14.15 13ZM5.35355 10.1464C5.44732 10.2402 5.5 10.3674 5.5 10.5C5.5 10.6326 5.44732 10.7598 5.35355 10.8536C5.25979 10.9473 5.13261 11 5 11H3C2.86739 11 2.74021 10.9473 2.64645 10.8536C2.55268 10.7598 2.5 10.6326 2.5 10.5C2.5 10.3674 2.55268 10.2402 2.64645 10.1464C2.74021 10.0527 2.86739 10 3 10H5C5.13261 10 5.25979 10.0527 5.35355 10.1464ZM5.5 8C5.5 7.86739 5.44732 7.74021 5.35355 7.64645C5.25979 7.55268 5.13261 7.5 5 7.5H3C2.86739 7.5 2.74021 7.55268 2.64645 7.64645C2.55268 7.74021 2.5 7.86739 2.5 8C2.5 8.13261 2.55268 8.25979 2.64645 8.35355C2.74021 8.44732 2.86739 8.5 3 8.5H5C5.13261 8.5 5.25979 8.44732 5.35355 8.35355C5.44732 8.25979 5.5 8.13261 5.5 8ZM5.35355 5.14645C5.44732 5.24021 5.5 5.36739 5.5 5.5C5.5 5.63261 5.44732 5.75979 5.35355 5.85355C5.25979 5.94732 5.13261 6 5 6H3C2.86739 6 2.74021 5.94732 2.64645 5.85355C2.55268 5.75979 2.5 5.63261 2.5 5.5C2.5 5.36739 2.55268 5.24021 2.64645 5.14645C2.74021 5.05268 2.86739 5 3 5H5C5.13261 5 5.25979 5.05268 5.35355 5.14645Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-zoomIn.svg b/public/pdfjs/web/images/toolbarButton-zoomIn.svg
new file mode 100644
index 0000000..30ec51a
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-zoomIn.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.00488 9.75V14C7.00488 14.1658 7.07073 14.3247 7.18794 14.4419C7.30515 14.5592 7.46412 14.625 7.62988 14.625C7.79564 14.625 7.95461 14.5592 8.07183 14.4419C8.18904 14.3247 8.25488 14.1658 8.25488 14V9.75L8.75488 9.25H13.0049C13.1706 9.25 13.3296 9.18415 13.4468 9.06694C13.564 8.94973 13.6299 8.79076 13.6299 8.625C13.6299 8.45924 13.564 8.30027 13.4468 8.18306C13.3296 8.06585 13.1706 8 13.0049 8H8.75488L8.25488 7.5V3.25C8.25488 3.08424 8.18904 2.92527 8.07183 2.80806C7.95461 2.69085 7.79564 2.625 7.62988 2.625C7.46412 2.625 7.30515 2.69085 7.18794 2.80806C7.07073 2.92527 7.00488 3.08424 7.00488 3.25V7.5L6.50488 8H2.25488C2.08912 8 1.93015 8.06585 1.81294 8.18306C1.69573 8.30027 1.62988 8.45924 1.62988 8.625C1.62988 8.79076 1.69573 8.94973 1.81294 9.06694C1.93015 9.18415 2.08912 9.25 2.25488 9.25H6.39188L7.00488 9.75Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/toolbarButton-zoomOut.svg b/public/pdfjs/web/images/toolbarButton-zoomOut.svg
new file mode 100644
index 0000000..f273b59
--- /dev/null
+++ b/public/pdfjs/web/images/toolbarButton-zoomOut.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.375 9.25C13.5408 9.25 13.6997 9.18415 13.8169 9.06694C13.9342 8.94973 14 8.79076 14 8.625C14 8.45924 13.9342 8.30027 13.8169 8.18306C13.6997 8.06585 13.5408 8 13.375 8H2.625C2.45924 8 2.30027 8.06585 2.18306 8.18306C2.06585 8.30027 2 8.45924 2 8.625C2 8.79076 2.06585 8.94973 2.18306 9.06694C2.30027 9.18415 2.45924 9.25 2.625 9.25H13.375Z" fill="black"/>
+</svg>
diff --git a/public/pdfjs/web/images/treeitem-collapsed.svg b/public/pdfjs/web/images/treeitem-collapsed.svg
new file mode 100644
index 0000000..831cddf
--- /dev/null
+++ b/public/pdfjs/web/images/treeitem-collapsed.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13 9L6 5v8z"/></svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/images/treeitem-expanded.svg b/public/pdfjs/web/images/treeitem-expanded.svg
new file mode 100644
index 0000000..2d45f0c
--- /dev/null
+++ b/public/pdfjs/web/images/treeitem-expanded.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M10 13l4-7H6z"/></svg>
\ No newline at end of file
diff --git a/public/pdfjs/web/locale/ach/viewer.ftl b/public/pdfjs/web/locale/ach/viewer.ftl
new file mode 100644
index 0000000..8f10145
--- /dev/null
+++ b/public/pdfjs/web/locale/ach/viewer.ftl
@@ -0,0 +1,200 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pot buk mukato
+pdfjs-previous-button-label = Mukato
+pdfjs-next-button =
+    .title = Pot buk malubo
+pdfjs-next-button-label = Malubo
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pot buk
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = pi { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } me { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Jwik Matidi
+pdfjs-zoom-out-button-label = Jwik Matidi
+pdfjs-zoom-in-button =
+    .title = Kwot Madit
+pdfjs-zoom-in-button-label = Kwot Madit
+pdfjs-zoom-select =
+    .title = Kwoti
+pdfjs-presentation-mode-button =
+    .title = Lokke i kit me tyer
+pdfjs-presentation-mode-button-label = Kit me tyer
+pdfjs-open-file-button =
+    .title = Yab Pwail
+pdfjs-open-file-button-label = Yab
+pdfjs-print-button =
+    .title = Go
+pdfjs-print-button-label = Go
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Gintic
+pdfjs-tools-button-label = Gintic
+pdfjs-first-page-button =
+    .title = Cit i pot buk mukwongo
+pdfjs-first-page-button-label = Cit i pot buk mukwongo
+pdfjs-last-page-button =
+    .title = Cit i pot buk magiko
+pdfjs-last-page-button-label = Cit i pot buk magiko
+pdfjs-page-rotate-cw-button =
+    .title = Wire i tung lacuc
+pdfjs-page-rotate-cw-button-label = Wire i tung lacuc
+pdfjs-page-rotate-ccw-button =
+    .title = Wire i tung lacam
+pdfjs-page-rotate-ccw-button-label = Wire i tung lacam
+pdfjs-cursor-text-select-tool-button =
+    .title = Cak gitic me yero coc
+pdfjs-cursor-text-select-tool-button-label = Gitic me yero coc
+pdfjs-cursor-hand-tool-button =
+    .title = Cak gitic me cing
+pdfjs-cursor-hand-tool-button-label = Gitic cing
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Jami me gin acoya鈥�
+pdfjs-document-properties-button-label = Jami me gin acoya鈥�
+pdfjs-document-properties-file-name = Nying pwail:
+pdfjs-document-properties-file-size = Dit pa pwail:
+pdfjs-document-properties-title = Wiye:
+pdfjs-document-properties-author = Ngat mucoyo:
+pdfjs-document-properties-subject = Subjek:
+pdfjs-document-properties-keywords = Lok mapire tek:
+pdfjs-document-properties-creation-date = Nino dwe me cwec:
+pdfjs-document-properties-modification-date = Nino dwe me yub:
+pdfjs-document-properties-creator = Lacwec:
+pdfjs-document-properties-producer = Layub PDF:
+pdfjs-document-properties-version = Kit PDF:
+pdfjs-document-properties-page-count = Kwan me pot buk:
+pdfjs-document-properties-page-size = Dit pa potbuk:
+pdfjs-document-properties-page-size-unit-inches = i
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = atir
+pdfjs-document-properties-page-size-orientation-landscape = arii
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Waraga
+pdfjs-document-properties-page-size-name-legal = Cik
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+pdfjs-document-properties-linearized-yes = Eyo
+pdfjs-document-properties-linearized-no = Pe
+pdfjs-document-properties-close-button = Lor
+
+## Print
+
+pdfjs-print-progress-message = Yubo coc me agoya鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Juki
+pdfjs-printing-not-supported = Ciko: Layeny ma pe teno goyo liweng.
+pdfjs-printing-not-ready = Ciko: PDF pe ocane weng me agoya.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Lok gintic ma inget
+pdfjs-toggle-sidebar-button-label = Lok gintic ma inget
+pdfjs-document-outline-button =
+    .title = Nyut Wiyewiye me Gin acoya (dii-kiryo me yaro/kano jami weng)
+pdfjs-document-outline-button-label = Pek pa gin acoya
+pdfjs-attachments-button =
+    .title = Nyut twec
+pdfjs-attachments-button-label = Twec
+pdfjs-thumbs-button =
+    .title = Nyut cal
+pdfjs-thumbs-button-label = Cal
+pdfjs-findbar-button =
+    .title = Nong iye gin acoya
+pdfjs-findbar-button-label = Nong
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pot buk { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Cal me pot buk { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Nong
+    .placeholder = Nong i dokumen鈥�
+pdfjs-find-previous-button =
+    .title = Nong timme pa lok mukato
+pdfjs-find-previous-button-label = Mukato
+pdfjs-find-next-button =
+    .title = Nong timme pa lok malubo
+pdfjs-find-next-button-label = Malubo
+pdfjs-find-highlight-checkbox = Ket Lanyut I Weng
+pdfjs-find-match-case-checkbox-label = Lok marwate
+pdfjs-find-reached-top = Oo iwi gin acoya, omede ki i tere
+pdfjs-find-reached-bottom = Oo i agiki me gin acoya, omede ki iwiye
+pdfjs-find-not-found = Lok pe ononge
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Lac me iye pot buk
+pdfjs-page-scale-fit = Porre me pot buk
+pdfjs-page-scale-auto = Kwot pire kene
+pdfjs-page-scale-actual = Dite kikome
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Bal otime kun cano PDF.
+pdfjs-invalid-file-error = Pwail me PDF ma pe atir onyo obale woko.
+pdfjs-missing-file-error = Pwail me PDF tye ka rem.
+pdfjs-unexpected-response-error = Lagam mape kigeno pa lapok tic.
+pdfjs-rendering-error = Bal otime i kare me nyuto pot buk.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Lok angea manok]
+
+## Password
+
+pdfjs-password-label = Ket mung me donyo me yabo pwail me PDF man.
+pdfjs-password-invalid = Mung me donyo pe atir. Tim ber i tem doki.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Juki
+pdfjs-web-fonts-disabled = Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine.
diff --git a/public/pdfjs/web/locale/af/viewer.ftl b/public/pdfjs/web/locale/af/viewer.ftl
new file mode 100644
index 0000000..577888c
--- /dev/null
+++ b/public/pdfjs/web/locale/af/viewer.ftl
@@ -0,0 +1,179 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Vorige bladsy
+pdfjs-previous-button-label = Vorige
+pdfjs-next-button =
+    .title = Volgende bladsy
+pdfjs-next-button-label = Volgende
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Bladsy
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = van { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } van { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoem uit
+pdfjs-zoom-out-button-label = Zoem uit
+pdfjs-zoom-in-button =
+    .title = Zoem in
+pdfjs-zoom-in-button-label = Zoem in
+pdfjs-zoom-select =
+    .title = Zoem
+pdfjs-presentation-mode-button =
+    .title = Wissel na voorleggingsmodus
+pdfjs-presentation-mode-button-label = Voorleggingsmodus
+pdfjs-open-file-button =
+    .title = Open l锚er
+pdfjs-open-file-button-label = Open
+pdfjs-print-button =
+    .title = Druk
+pdfjs-print-button-label = Druk
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Nutsgoed
+pdfjs-tools-button-label = Nutsgoed
+pdfjs-first-page-button =
+    .title = Gaan na eerste bladsy
+pdfjs-first-page-button-label = Gaan na eerste bladsy
+pdfjs-last-page-button =
+    .title = Gaan na laaste bladsy
+pdfjs-last-page-button-label = Gaan na laaste bladsy
+pdfjs-page-rotate-cw-button =
+    .title = Roteer kloksgewys
+pdfjs-page-rotate-cw-button-label = Roteer kloksgewys
+pdfjs-page-rotate-ccw-button =
+    .title = Roteer anti-kloksgewys
+pdfjs-page-rotate-ccw-button-label = Roteer anti-kloksgewys
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktiveer gereedskap om teks te merk
+pdfjs-cursor-text-select-tool-button-label = Teksmerkgereedskap
+pdfjs-cursor-hand-tool-button =
+    .title = Aktiveer handjie
+pdfjs-cursor-hand-tool-button-label = Handjie
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumenteienskappe鈥�
+pdfjs-document-properties-button-label = Dokumenteienskappe鈥�
+pdfjs-document-properties-file-name = L锚ernaam:
+pdfjs-document-properties-file-size = L锚ergrootte:
+pdfjs-document-properties-title = Titel:
+pdfjs-document-properties-author = Outeur:
+pdfjs-document-properties-subject = Onderwerp:
+pdfjs-document-properties-keywords = Sleutelwoorde:
+pdfjs-document-properties-creation-date = Skeppingsdatum:
+pdfjs-document-properties-modification-date = Wysigingsdatum:
+pdfjs-document-properties-creator = Skepper:
+pdfjs-document-properties-producer = PDF-vervaardiger:
+pdfjs-document-properties-version = PDF-weergawe:
+pdfjs-document-properties-page-count = Aantal bladsye:
+
+##
+
+pdfjs-document-properties-close-button = Sluit
+
+## Print
+
+pdfjs-print-progress-message = Berei tans dokument voor om te druk鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Kanselleer
+pdfjs-printing-not-supported = Waarskuwing: Di茅 blaaier ondersteun nie drukwerk ten volle nie.
+pdfjs-printing-not-ready = Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Sypaneel aan/af
+pdfjs-toggle-sidebar-button-label = Sypaneel aan/af
+pdfjs-document-outline-button =
+    .title = Wys dokumentskema (dubbelklik om alle items oop/toe te vou)
+pdfjs-document-outline-button-label = Dokumentoorsig
+pdfjs-attachments-button =
+    .title = Wys aanhegsels
+pdfjs-attachments-button-label = Aanhegsels
+pdfjs-thumbs-button =
+    .title = Wys duimnaels
+pdfjs-thumbs-button-label = Duimnaels
+pdfjs-findbar-button =
+    .title = Soek in dokument
+pdfjs-findbar-button-label = Vind
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Bladsy { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Duimnael van bladsy { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Vind
+    .placeholder = Soek in dokument鈥�
+pdfjs-find-previous-button =
+    .title = Vind die vorige voorkoms van die frase
+pdfjs-find-previous-button-label = Vorige
+pdfjs-find-next-button =
+    .title = Vind die volgende voorkoms van die frase
+pdfjs-find-next-button-label = Volgende
+pdfjs-find-highlight-checkbox = Verlig almal
+pdfjs-find-match-case-checkbox-label = Kassensitief
+pdfjs-find-reached-top = Bokant van dokument is bereik; gaan voort van onder af
+pdfjs-find-reached-bottom = Einde van dokument is bereik; gaan voort van bo af
+pdfjs-find-not-found = Frase nie gevind nie
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Bladsywydte
+pdfjs-page-scale-fit = Pas bladsy
+pdfjs-page-scale-auto = Outomatiese zoem
+pdfjs-page-scale-actual = Werklike grootte
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = 'n Fout het voorgekom met die laai van die PDF.
+pdfjs-invalid-file-error = Ongeldige of korrupte PDF-l锚er.
+pdfjs-missing-file-error = PDF-l锚er is weg.
+pdfjs-unexpected-response-error = Onverwagse antwoord van bediener.
+pdfjs-rendering-error = 'n Fout het voorgekom toe die bladsy weergegee is.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type }-annotasie]
+
+## Password
+
+pdfjs-password-label = Gee die wagwoord om di茅 PDF-l锚er mee te open.
+pdfjs-password-invalid = Ongeldige wagwoord. Probeer gerus weer.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Kanselleer
+pdfjs-web-fonts-disabled = Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.
diff --git a/public/pdfjs/web/locale/an/viewer.ftl b/public/pdfjs/web/locale/an/viewer.ftl
new file mode 100644
index 0000000..ad5d2fe
--- /dev/null
+++ b/public/pdfjs/web/locale/an/viewer.ftl
@@ -0,0 +1,228 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pachina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = Pachina siguient
+pdfjs-next-button-label = Siguient
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pachina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Achiquir
+pdfjs-zoom-out-button-label = Achiquir
+pdfjs-zoom-in-button =
+    .title = Agrandir
+pdfjs-zoom-in-button-label = Agrandir
+pdfjs-zoom-select =
+    .title = Grandaria
+pdfjs-presentation-mode-button =
+    .title = Cambear t'o modo de presentaci贸n
+pdfjs-presentation-mode-button-label = Modo de presentaci贸n
+pdfjs-open-file-button =
+    .title = Ubrir o fichero
+pdfjs-open-file-button-label = Ubrir
+pdfjs-print-button =
+    .title = Imprentar
+pdfjs-print-button-label = Imprentar
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ferramientas
+pdfjs-tools-button-label = Ferramientas
+pdfjs-first-page-button =
+    .title = Ir ta la primer pachina
+pdfjs-first-page-button-label = Ir ta la primer pachina
+pdfjs-last-page-button =
+    .title = Ir ta la zaguer pachina
+pdfjs-last-page-button-label = Ir ta la zaguer pachina
+pdfjs-page-rotate-cw-button =
+    .title = Chirar enta la dreita
+pdfjs-page-rotate-cw-button-label = Chira enta la dreita
+pdfjs-page-rotate-ccw-button =
+    .title = Chirar enta la zurda
+pdfjs-page-rotate-ccw-button-label = Chirar enta la zurda
+pdfjs-cursor-text-select-tool-button =
+    .title = Activar la ferramienta de selecci贸n de texto
+pdfjs-cursor-text-select-tool-button-label = Ferramienta de selecci贸n de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Activar la ferramienta man
+pdfjs-cursor-hand-tool-button-label = Ferramienta man
+pdfjs-scroll-vertical-button =
+    .title = Usar lo desplazamiento vertical
+pdfjs-scroll-vertical-button-label = Desplazamiento vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usar lo desplazamiento horizontal
+pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Activaar lo desplazamiento contino
+pdfjs-scroll-wrapped-button-label = Desplazamiento contino
+pdfjs-spread-none-button =
+    .title = No unir vistas de pachinas
+pdfjs-spread-none-button-label = Una pachina nom谩s
+pdfjs-spread-odd-button =
+    .title = Mostrar vista de pachinas, con as impars a la zurda
+pdfjs-spread-odd-button-label = Doble pachina, impar a la zurda
+pdfjs-spread-even-button =
+    .title = Amostrar vista de pachinas, con as pars a la zurda
+pdfjs-spread-even-button-label = Doble pachina, para a la zurda
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiedatz d'o documento...
+pdfjs-document-properties-button-label = Propiedatz d'o documento...
+pdfjs-document-properties-file-name = Nombre de fichero:
+pdfjs-document-properties-file-size = Grandaria d'o fichero:
+pdfjs-document-properties-title = Titol:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Afer:
+pdfjs-document-properties-keywords = Parolas clau:
+pdfjs-document-properties-creation-date = Calendata de creyaci贸n:
+pdfjs-document-properties-modification-date = Calendata de modificaci贸n:
+pdfjs-document-properties-creator = Creyador:
+pdfjs-document-properties-producer = Creyador de PDF:
+pdfjs-document-properties-version = Versi贸n de PDF:
+pdfjs-document-properties-page-count = Numero de pachinas:
+pdfjs-document-properties-page-size = Mida de pachina:
+pdfjs-document-properties-page-size-unit-inches = pulgadas
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = horizontal
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } x { $height } { $unit } { $orientation }
+pdfjs-document-properties-page-size-dimension-name-string = { $width } x { $height } { $unit } { $name }, { $orientation }
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista web rapida:
+pdfjs-document-properties-linearized-yes = S铆
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Zarrar
+
+## Print
+
+pdfjs-print-progress-message = Se ye preparando la documentaci贸n pa imprentar鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancelar
+pdfjs-printing-not-supported = Pare cuenta: Iste navegador no maneya totalment as impresions.
+pdfjs-printing-not-ready = Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Amostrar u amagar a barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Cambiar barra lateral (lo documento contiene esquema/adchuntos/capas)
+pdfjs-toggle-sidebar-button-label = Amostrar a barra lateral
+pdfjs-document-outline-button =
+    .title = Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items)
+pdfjs-document-outline-button-label = Esquema d'o documento
+pdfjs-attachments-button =
+    .title = Amostrar os adchuntos
+pdfjs-attachments-button-label = Adchuntos
+pdfjs-layers-button =
+    .title = Amostrar capas (doble clic para reiniciar totas las capas a lo estau per defecto)
+pdfjs-layers-button-label = Capas
+pdfjs-thumbs-button =
+    .title = Amostrar as miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-findbar-button =
+    .title = Trobar en o documento
+pdfjs-findbar-button-label = Trobar
+pdfjs-additional-layers = Capas adicionals
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pachina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura d'a pachina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Trobar
+    .placeholder = Trobar en o documento鈥�
+pdfjs-find-previous-button =
+    .title = Trobar l'anterior coincidencia d'a frase
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button =
+    .title = Trobar a siguient coincidencia d'a frase
+pdfjs-find-next-button-label = Siguient
+pdfjs-find-highlight-checkbox = Resaltar-lo tot
+pdfjs-find-match-case-checkbox-label = Coincidencia de mayusclas/minusclas
+pdfjs-find-entire-word-checkbox-label = Parolas completas
+pdfjs-find-reached-top = S'ha plegau a l'inicio d'o documento, se contina dende baixo
+pdfjs-find-reached-bottom = S'ha plegau a la fin d'o documento, se contina dende alto
+pdfjs-find-not-found = No s'ha trobau a frase
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Amplaria d'a pachina
+pdfjs-page-scale-fit = Achuste d'a pachina
+pdfjs-page-scale-auto = Grandaria automatica
+pdfjs-page-scale-actual = Grandaria actual
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = S'ha produciu una error en cargar o PDF.
+pdfjs-invalid-file-error = O PDF no ye valido u ye estorbau.
+pdfjs-missing-file-error = No i ha fichero PDF.
+pdfjs-unexpected-response-error = Respuesta a lo servicio inasperada.
+pdfjs-rendering-error = Ha ocurriu una error en renderizar a pachina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotaci贸n { $type }]
+
+## Password
+
+pdfjs-password-label = Introduzca a clau ta ubrir iste fichero PDF.
+pdfjs-password-invalid = Clau invalida. Torna a intentar-lo.
+pdfjs-password-ok-button = Acceptar
+pdfjs-password-cancel-button = Cancelar
+pdfjs-web-fonts-disabled = As fuents web son desactivadas: no se puet incrustar fichers PDF.
diff --git a/public/pdfjs/web/locale/ar/viewer.ftl b/public/pdfjs/web/locale/ar/viewer.ftl
new file mode 100644
index 0000000..11046bb
--- /dev/null
+++ b/public/pdfjs/web/locale/ar/viewer.ftl
@@ -0,0 +1,779 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 丕賱氐賮丨丞 丕賱爻丕亘賯丞
+pdfjs-previous-button-label = 丕賱爻丕亘賯丞
+pdfjs-next-button =
+    .title = 丕賱氐賮丨丞 丕賱鬲丕賱賷丞
+pdfjs-next-button-label = 丕賱鬲丕賱賷丞
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 氐賮丨丞
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 賲賳 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 賲賳 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 亘毓賾丿
+pdfjs-zoom-out-button-label = 亘毓賾丿
+pdfjs-zoom-in-button =
+    .title = 賯乇賾亘
+pdfjs-zoom-in-button-label = 賯乇賾亘
+pdfjs-zoom-select =
+    .title = 丕賱鬲賯乇賷亘
+pdfjs-presentation-mode-button =
+    .title = 丕賳鬲賯賱 賱賵囟毓 丕賱毓乇囟 丕賱鬲賯丿賷賲賷
+pdfjs-presentation-mode-button-label = 賵囟毓 丕賱毓乇囟 丕賱鬲賯丿賷賲賷
+pdfjs-open-file-button =
+    .title = 丕賮鬲丨 賲賱賮賸丕
+pdfjs-open-file-button-label = 丕賮鬲丨
+pdfjs-print-button =
+    .title = 丕胤亘毓
+pdfjs-print-button-label = 丕胤亘毓
+pdfjs-save-button =
+    .title = 丕丨賮馗
+pdfjs-save-button-label = 丕丨賮馗
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 賳夭賾賱
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 賳夭賾賱
+pdfjs-bookmark-button =
+    .title = 丕賱氐賮丨丞 丕賱丨丕賱賷丞 (毓乇囟 URL 賲賳 丕賱氐賮丨丞 丕賱丨丕賱賷丞)
+pdfjs-bookmark-button-label = 丕賱氐賮丨丞 丕賱丨丕賱賷丞
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 丕賱兀丿賵丕鬲
+pdfjs-tools-button-label = 丕賱兀丿賵丕鬲
+pdfjs-first-page-button =
+    .title = 丕賳鬲賯賱 廿賱賶 丕賱氐賮丨丞 丕賱兀賵賱賶
+pdfjs-first-page-button-label = 丕賳鬲賯賱 廿賱賶 丕賱氐賮丨丞 丕賱兀賵賱賶
+pdfjs-last-page-button =
+    .title = 丕賳鬲賯賱 廿賱賶 丕賱氐賮丨丞 丕賱兀禺賷乇丞
+pdfjs-last-page-button-label = 丕賳鬲賯賱 廿賱賶 丕賱氐賮丨丞 丕賱兀禺賷乇丞
+pdfjs-page-rotate-cw-button =
+    .title = 兀丿乇 亘丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+pdfjs-page-rotate-cw-button-label = 兀丿乇 亘丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+pdfjs-page-rotate-ccw-button =
+    .title = 兀丿乇 亘毓賰爻 丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+pdfjs-page-rotate-ccw-button-label = 兀丿乇 亘毓賰爻 丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+pdfjs-cursor-text-select-tool-button =
+    .title = 賮毓賾賱 兀丿丕丞 丕禺鬲賷丕乇 丕賱賳氐
+pdfjs-cursor-text-select-tool-button-label = 兀丿丕丞 丕禺鬲賷丕乇 丕賱賳氐
+pdfjs-cursor-hand-tool-button =
+    .title = 賮毓賾賱 兀丿丕丞 丕賱賷丿
+pdfjs-cursor-hand-tool-button-label = 兀丿丕丞 丕賱賷丿
+pdfjs-scroll-page-button =
+    .title = 丕爻鬲禺丿賲 鬲賲乇賷乇 丕賱氐賮丨丞
+pdfjs-scroll-page-button-label = 鬲賲乇賷乇 丕賱氐賮丨丞
+pdfjs-scroll-vertical-button =
+    .title = 丕爻鬲禺丿賲 丕賱鬲賲乇賷乇 丕賱乇兀爻賷
+pdfjs-scroll-vertical-button-label = 丕賱鬲賲乇賷乇 丕賱乇兀爻賷
+pdfjs-scroll-horizontal-button =
+    .title = 丕爻鬲禺丿賲 丕賱鬲賲乇賷乇 丕賱兀賮賯賷
+pdfjs-scroll-horizontal-button-label = 丕賱鬲賲乇賷乇 丕賱兀賮賯賷
+pdfjs-scroll-wrapped-button =
+    .title = 丕爻鬲禺丿賲 丕賱鬲賲乇賷乇 丕賱賲賱鬲賮
+pdfjs-scroll-wrapped-button-label = 丕賱鬲賲乇賷乇 丕賱賲賱鬲賮
+pdfjs-spread-none-button =
+    .title = 賱丕 鬲丿賲噩 賴賵丕賲卮 丕賱氐賮丨丕鬲 賲毓 亘毓囟賴丕 丕賱亘毓囟
+pdfjs-spread-none-button-label = 亘賱丕 賴賵丕賲卮
+pdfjs-spread-odd-button =
+    .title = 丕丿賲噩 賴賵丕賲卮 丕賱氐賮丨丕鬲 丕賱賮乇丿賷丞
+pdfjs-spread-odd-button-label = 賴賵丕賲卮 丕賱氐賮丨丕鬲 丕賱賮乇丿賷丞
+pdfjs-spread-even-button =
+    .title = 丕丿賲噩 賴賵丕賲卮 丕賱氐賮丨丕鬲 丕賱夭賵噩賷丞
+pdfjs-spread-even-button-label = 賴賵丕賲卮 丕賱氐賮丨丕鬲 丕賱夭賵噩賷丞
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 禺氐丕卅氐 丕賱賲爻鬲賳丿鈥�
+pdfjs-document-properties-button-label = 禺氐丕卅氐 丕賱賲爻鬲賳丿鈥�
+pdfjs-document-properties-file-name = 丕爻賲 丕賱賲賱賮:
+pdfjs-document-properties-file-size = 丨噩賲 丕賱賲賱賮:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 賰.亘丕賷鬲 ({ $b } 亘丕賷鬲丕鬲)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 賲.亘丕賷鬲 ({ $b } 亘丕賷鬲丕鬲)
+pdfjs-document-properties-title = 丕賱毓賳賵丕賳:
+pdfjs-document-properties-author = 丕賱賲丐賱賮:
+pdfjs-document-properties-subject = 丕賱賲賵囟賵毓:
+pdfjs-document-properties-keywords = 丕賱賰賱賲丕鬲 丕賱兀爻丕爻賷丞:
+pdfjs-document-properties-creation-date = 鬲丕乇賷禺 丕賱廿賳卮丕亍:
+pdfjs-document-properties-modification-date = 鬲丕乇賷禺 丕賱鬲毓丿賷賱:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 丕賱賲賳卮卅:
+pdfjs-document-properties-producer = 賲賳鬲噩 PDF:
+pdfjs-document-properties-version = 廿氐丿丕乇丞 PDF:
+pdfjs-document-properties-page-count = 毓丿丿 丕賱氐賮丨丕鬲:
+pdfjs-document-properties-page-size = 賲賯丕爻 丕賱賵乇賯丞:
+pdfjs-document-properties-page-size-unit-inches = 亘賵氐丞
+pdfjs-document-properties-page-size-unit-millimeters = 賲賱賲
+pdfjs-document-properties-page-size-orientation-portrait = 胤賵賱賷賾
+pdfjs-document-properties-page-size-orientation-landscape = 毓乇囟賷賾
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 禺胤丕亘
+pdfjs-document-properties-page-size-name-legal = 賯丕賳賵賳賷賾
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = 鈥弡 $width } 脳 鈥弡 $height } 鈥弡 $unit } (鈥弡 $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = 鈥弡 $width } 脳 鈥弡 $height } 鈥弡 $unit } (鈥弡 $name }貙 { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 丕賱毓乇囟 丕賱爻乇賷毓 毓亘乇 丕賱賵賽亘:
+pdfjs-document-properties-linearized-yes = 賳毓賲
+pdfjs-document-properties-linearized-no = 賱丕
+pdfjs-document-properties-close-button = 兀睾賱賯
+
+## Print
+
+pdfjs-print-progress-message = 賷購丨囟賾乇 丕賱賲爻鬲賳丿 賱賱胤亘丕毓丞鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }侏
+pdfjs-print-progress-close-button = 兀賱睾賽
+pdfjs-printing-not-supported = 鬲丨匕賷乇: 賱丕 賷丿毓賲 賴匕丕 丕賱賲鬲氐賮丨 丕賱胤亘丕毓丞 亘卮賰賱 賰丕賲賱.
+pdfjs-printing-not-ready = 鬲丨匕賷乇: 賲賱賮 PDF 賱賲 賷購丨賲賾賱 賰丕賲賱賸丕 賱賱胤亘丕毓丞.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 亘丿賾賱 馗賴賵乇 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+pdfjs-toggle-sidebar-notification-button =
+    .title = 亘丿賾賱 馗賴賵乇 丕賱卮乇賷胤 丕賱噩丕賳亘賷 (賷丨鬲賵賷 丕賱賲爻鬲賳丿 毓賱賶 賲禺胤胤 兀賵 賲乇賮賯丕鬲 兀賵 胤亘賯丕鬲)
+pdfjs-toggle-sidebar-button-label = 亘丿賾賱 馗賴賵乇 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+pdfjs-document-outline-button =
+    .title = 丕毓乇囟 賮賴乇爻 丕賱賲爻鬲賳丿 (賳賯乇 賲夭丿賵噩 賱鬲賲丿賷丿 兀賵 鬲賯賱賷氐 賰賱 丕賱毓賳丕氐乇)
+pdfjs-document-outline-button-label = 賲禺胤胤 丕賱賲爻鬲賳丿
+pdfjs-attachments-button =
+    .title = 丕毓乇囟 丕賱賲乇賮賯丕鬲
+pdfjs-attachments-button-label = 丕賱賲購乇賮賯丕鬲
+pdfjs-layers-button =
+    .title = 丕毓乇囟 丕賱胤亘賯丕鬲 (丕賳賯乇 賲乇鬲賷賳 賱鬲氐賮賷乇 賰賱 丕賱胤亘賯丕鬲 廿賱賶 丕賱丨丕賱丞 丕賱賲亘丿卅賷丞)
+pdfjs-layers-button-label = 鈥忊�徹з勜坟ㄙ傌ж�
+pdfjs-thumbs-button =
+    .title = 丕毓乇囟 賲購氐睾乇丕鬲
+pdfjs-thumbs-button-label = 賲購氐睾賾乇丕鬲
+pdfjs-current-outline-item-button =
+    .title = 丕亘丨孬 毓賳 毓賳氐乇 丕賱賲禺胤賾胤 丕賱鬲賮氐賷賱賷 丕賱丨丕賱賷
+pdfjs-current-outline-item-button-label = 毓賳氐乇 丕賱賲禺胤賾胤 丕賱鬲賮氐賷賱賷 丕賱丨丕賱賷
+pdfjs-findbar-button =
+    .title = 丕亘丨孬 賮賷 丕賱賲爻鬲賳丿
+pdfjs-findbar-button-label = 丕亘丨孬
+pdfjs-additional-layers = 丕賱胤亘賯丕鬲 丕賱廿囟丕賮賷丞
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 氐賮丨丞 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 賲氐睾賾乇丞 氐賮丨丞 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 丨丿賾丿 丕賱氐賮丨丞 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 丕賱氐賮丨丞 { $page } 賲賳 { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 丕亘丨孬
+    .placeholder = 丕亘丨孬 賮賷 丕賱賲爻鬲賳丿鈥�
+pdfjs-find-previous-button =
+    .title = 丕亘丨孬 毓賳 丕賱鬲賾賵丕噩丿 丕賱爻賾丕亘賯 賱賱毓亘丕乇丞
+pdfjs-find-previous-button-label = 丕賱爻丕亘賯
+pdfjs-find-next-button =
+    .title = 丕亘丨孬 毓賳 丕賱鬲賾賵丕噩丿 丕賱鬲賾丕賱賷 賱賱毓亘丕乇丞
+pdfjs-find-next-button-label = 丕賱鬲丕賱賷
+pdfjs-find-highlight-checkbox = 兀亘乇賽夭 丕賱賰賱
+pdfjs-find-match-case-checkbox-label = 胤丕亘賯 丨丕賱丞 丕賱兀丨乇賮
+pdfjs-find-match-diacritics-checkbox-label = 胤丕亘賽賯 丕賱鬲卮賰賷賱
+pdfjs-find-entire-word-checkbox-label = 賰賱賲丕鬲 賰丕賲賱丞
+pdfjs-find-reached-top = 鬲丕亘毓鬲 賲賳 丕賱兀爻賮賱 亘毓丿賲丕 賵氐賱鬲 廿賱賶 亘丿丕賷丞 丕賱賲爻鬲賳丿
+pdfjs-find-reached-bottom = 鬲丕亘毓鬲 賲賳 丕賱兀毓賱賶 亘毓丿賲丕 賵氐賱鬲 廿賱賶 賳賴丕賷丞 丕賱賲爻鬲賳丿
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [zero] 賱丕  賲胤丕亘賯丞
+        [one] { $current } 賲賳 兀氐賱 { $total } 賲胤丕亘賯丞
+        [two] { $current } 賲賳 兀氐賱 { $total } 賲胤丕亘賯丞
+        [few] { $current } 賲賳 兀氐賱 { $total } 賲胤丕亘賯丞
+        [many] { $current } 賲賳 兀氐賱 { $total } 賲胤丕亘賯丞
+       *[other] { $current } 賲賳 兀氐賱 { $total } 賲胤丕亘賯丞
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [zero] { $limit } 賲胤丕亘賯丞
+        [one] 兀賰孬乇 賲賳 { $limit } 賲胤丕亘賯丞
+        [two] 兀賰孬乇 賲賳 { $limit } 賲胤丕亘賯丞
+        [few] 兀賰孬乇 賲賳 { $limit } 賲胤丕亘賯丞
+        [many] 兀賰孬乇 賲賳 { $limit } 賲胤丕亘賯丞
+       *[other] 兀賰孬乇 賲賳 { $limit } 賲胤丕亘賯丕鬲
+    }
+pdfjs-find-not-found = 賱丕 賵噩賵丿 賱賱毓亘丕乇丞
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 毓乇囟 丕賱氐賮丨丞
+pdfjs-page-scale-fit = 賲賱丕卅賲丞 丕賱氐賮丨丞
+pdfjs-page-scale-auto = 鬲賯乇賷亘 鬲賱賯丕卅賷
+pdfjs-page-scale-actual = 丕賱丨噩賲 丕賱賮毓賱賷
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }侏
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 氐賮丨丞 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 丨丿孬 毓胤賱 兀孬賳丕亍 鬲丨賲賷賱 賲賱賮 PDF.
+pdfjs-invalid-file-error = 賲賱賮 PDF 鬲丕賱賮 兀賵 睾賷乇 氐丨賷丨.
+pdfjs-missing-file-error = 賲賱賮 PDF 睾賷乇 賲賵噩賵丿.
+pdfjs-unexpected-response-error = 丕爻鬲噩丕亘丞 禺丕丿賵賲 睾賷乇 賲鬲賵賯毓丞.
+pdfjs-rendering-error = 丨丿孬 禺胤兀 兀孬賳丕亍 毓乇囟 丕賱氐賮丨丞.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [鬲毓賱賷賯 { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 兀丿禺賱 賱賰賱賲丞 丕賱爻乇 賱賮鬲丨 賴匕丕 丕賱賲賱賮.
+pdfjs-password-invalid = 賰賱賲丞 爻乇 禺胤兀. 賲賳 賮囟賱賰 兀毓丿 丕賱賲丨丕賵賱丞.
+pdfjs-password-ok-button = 丨爻賳賸丕
+pdfjs-password-cancel-button = 兀賱睾賽
+pdfjs-web-fonts-disabled = 禺胤賵胤 丕賱賵亘 賲購毓胤賾賱丞: 鬲毓匕賾乇 丕爻鬲禺丿丕賲 禺胤賵胤 PDF 丕賱賲購囟賲賾賳丞.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 賳氐
+pdfjs-editor-color-picker-free-text-input =
+    .title = 睾賷賾賽乇 賱賵賳 丕賱賳氐
+pdfjs-editor-free-text-button-label = 賳氐
+pdfjs-editor-ink-button =
+    .title = 丕乇爻賲
+pdfjs-editor-color-picker-ink-input =
+    .title = 睾賷賾賽乇 賱賵賳 丕賱乇爻賲
+pdfjs-editor-ink-button-label = 丕乇爻賲
+pdfjs-editor-stamp-button =
+    .title = 兀囟賽賮 兀賵 丨乇賾乇 丕賱氐賵乇
+pdfjs-editor-stamp-button-label = 兀囟賽賮 兀賵 丨乇賾乇 丕賱氐賵乇
+pdfjs-editor-highlight-button =
+    .title = 兀亘乇賽夭
+pdfjs-editor-highlight-button-label = 兀亘乇賽夭
+pdfjs-highlight-floating-button1 =
+    .title = 兀亘乇賽夭
+    .aria-label = 兀亘乇賽夭
+pdfjs-highlight-floating-button-label = 兀亘乇賽夭
+pdfjs-comment-floating-button =
+    .title = 毓賱賯
+    .aria-label = 毓賱賯
+pdfjs-comment-floating-button-label = 毓賱賯
+pdfjs-editor-comment-button =
+    .title = 毓賱賯
+    .aria-label = 毓賱賯
+pdfjs-editor-comment-button-label = 丕賱鬲毓賱賷賯
+pdfjs-editor-signature-button =
+    .title = 兀囟賽賮 鬲賵賯賷毓
+pdfjs-editor-signature-button-label = 兀囟賽賮 鬲賵賯賷毓
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 賲丨乇賾賽乇 丕賱廿亘乇丕夭
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 賲丨乇賾賽乇 丕賱乇爻賲
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 賲丨乇賾賽乇 丕賱鬲賵賯賷毓: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 賲丨乇賾賽乇 丕賱氐賵乇
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 兀夭賽賱 丕賱乇爻賲
+pdfjs-editor-remove-freetext-button =
+    .title = 兀夭賽賱 丕賱賳氐
+pdfjs-editor-remove-stamp-button =
+    .title = 兀夭賽賱 丕賱氐賵乇丞
+pdfjs-editor-remove-highlight-button =
+    .title = 兀夭賽賱 丕賱廿亘乇丕夭
+pdfjs-editor-remove-signature-button =
+    .title = 兀夭賽賱 丕賱鬲賵賯賷毓
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 丕賱賱賵賳
+pdfjs-editor-free-text-size-input = 丕賱丨噩賲
+pdfjs-editor-ink-color-input = 丕賱賱賵賳
+pdfjs-editor-ink-thickness-input = 丕賱爻賲丕賰丞
+pdfjs-editor-ink-opacity-input = 丕賱毓鬲丕賲丞
+pdfjs-editor-stamp-add-image-button =
+    .title = 兀囟賽賮 氐賵乇丞
+pdfjs-editor-stamp-add-image-button-label = 兀囟賽賮 氐賵乇丞
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 丕賱爻賲丕賰丞
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 睾賷賾乇 丕賱爻購賲賰 毓賳丿 廿亘乇丕夭 毓賳丕氐乇 兀購禺乇賶 睾賷乇 丕賱賳氐
+pdfjs-editor-add-signature-container =
+    .aria-label = 毓賳丕氐乇 丕賱鬲丨賰賲 賮賷 丕賱鬲賵賯賷毓 賵丕賱鬲賵賯賷毓丕鬲 丕賱賲丨賮賵馗丞
+pdfjs-editor-signature-add-signature-button =
+    .title = 兀囟賽賮 鬲賵賯賷毓 噩丿賷丿
+pdfjs-editor-signature-add-signature-button-label = 兀囟賽賮 鬲賵賯賷毓 噩丿賷丿
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 丕賱鬲賵賯賷毓 丕賱賲丨賮賵馗: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 賲丨乇賾賽乇 丕賱賳氐
+    .default-content = 丕亘丿兀 賮賷 賰鬲丕亘丞鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [zero] 鬲毓賱賷賯
+        [one] 鬲毓賱賷賯
+        [two] 鬲毓賱賷賯丕鬲
+        [few] 鬲毓賱賷賯丕鬲
+        [many] 鬲毓賱賷賯丕鬲
+       *[other] 鬲毓賱賷賯丕鬲
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 兀睾賱賽賯 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+    .aria-label = 兀睾賱賽賯 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+pdfjs-editor-comments-sidebar-close-button-label = 兀睾賱賽賯 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 賴賱 乇兀賷鬲 卮賷卅丕賸 噩丿賷乇賸丕 亘丕賱賲賱丕丨馗丞責 丕亘乇夭賴 賵丕鬲乇賰 鬲毓賱賷賯賸丕.
+pdfjs-editor-comments-sidebar-no-comments-link = 丕胤賾賱毓 毓賱賶 丕賱賲夭賷丿
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 賳氐 亘丿賷賱
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 丨乇賾乇 丕賱賳氐 丕賱亘丿賷賱
+pdfjs-editor-alt-text-dialog-label = 丕禺鬲乇 禺賷丕乇
+pdfjs-editor-alt-text-dialog-description = 賷爻丕毓丿 丕賱賳氐 丕賱亘丿賷賱 毓賳丿賲丕 賱丕 賷鬲賲賰賳 丕賱兀卮禺丕氐 賲賳 乇丐賷丞 丕賱氐賵乇丞 兀賵 毓賳丿賲丕 賱丕 賷鬲賲 鬲丨賲賷賱賴丕.
+pdfjs-editor-alt-text-add-description-label = 兀囟賽賮 賵氐賮
+pdfjs-editor-alt-text-add-description-description = 丕爻鬲賴丿賮 噩賲賱鬲賷賳 鬲氐賮丕賳 丕賱賲賵囟賵毓 兀賵 丕賱廿毓丿丕丿 兀賵 丕賱廿噩乇丕亍丕鬲.
+pdfjs-editor-alt-text-mark-decorative-label = 毓賱賾賲賴丕 毓賱賶 兀賳賴丕 夭禺乇賮賷丞
+pdfjs-editor-alt-text-mark-decorative-description = 賷購爻鬲禺丿賲 賴匕丕 賮賷 丕賱氐賵乇 丕賱賲夭禺乇賮丞貙 賲孬賱 丕賱丨丿賵丿 兀賵 丕賱毓賱丕賲丕鬲 丕賱賲丕卅賷丞.
+pdfjs-editor-alt-text-cancel-button = 兀賱睾賽
+pdfjs-editor-alt-text-save-button = 丕丨賮馗
+pdfjs-editor-alt-text-decorative-tooltip = 毓購賱賾賲鬲 毓賱賶 兀賳賴丕 夭禺乇賮賷丞
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 毓賱賶 爻亘賷賱 丕賱賲孬丕賱貙 "賷噩賱爻 卮丕亘 毓賱賶 丕賱胤丕賵賱丞 賱鬲賳丕賵賱 賵噩亘丞"
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 賳氐 亘丿賷賱
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 丕賱夭丕賵賷丞 丕賱賷購爻乇賶 丕賱毓購賱賷丕 鈥� 睾賷賾乇 丕賱丨噩賲
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 兀毓賱賶 丕賱賵爻胤 - 睾賷賾乇 丕賱丨噩賲
+pdfjs-editor-resizer-top-right =
+    .aria-label = 丕賱夭丕賵賷丞 丕賱賷購賲賳賶 丕賱毓購賱賷丕 - 睾賷賾乇 丕賱丨噩賲
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 丕賱賷賲賷賳 丕賱兀賵爻胤 - 睾賷賾乇 丕賱丨噩賲
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 丕賱夭丕賵賷丞 丕賱賷購賲賳賶 丕賱爻購賮賱賶 - 睾賷賾乇 丕賱丨噩賲
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 兀爻賮賱 丕賱賵爻胤 - 睾賷賾乇 丕賱丨噩賲
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 丕賱夭丕賵賷丞 丕賱賷購爻乇賶 丕賱爻購賮賱賷丞 - 睾賷賾乇 丕賱丨噩賲
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 賲購賳鬲氐賮 丕賱賷爻丕乇 - 睾賷賾乇 丕賱丨噩賲
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 兀亘乇賽夭 丕賱賱賵賳
+pdfjs-editor-colorpicker-button =
+    .title = 睾賷賾乇 丕賱賱賵賳
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 丕禺鬲賷丕乇丕鬲 丕賱兀賱賵丕賳
+pdfjs-editor-colorpicker-yellow =
+    .title = 兀氐賮乇
+pdfjs-editor-colorpicker-green =
+    .title = 兀禺囟乇
+pdfjs-editor-colorpicker-blue =
+    .title = 兀夭乇賯
+pdfjs-editor-colorpicker-pink =
+    .title = 賵乇丿賷
+pdfjs-editor-colorpicker-red =
+    .title = 兀丨賲乇
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 兀馗賴賽乇 丕賱賰賱
+pdfjs-editor-highlight-show-all-button =
+    .title = 兀馗賴賽乇 丕賱賰賱
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 丨乇賾乇 丕賱賳氐 丕賱亘丿賷賱 (賵氐賮 丕賱氐賵乇丞)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 兀囟賽賮 丕賱賳氐 丕賱亘丿賷賱 (賵氐賮 丕賱氐賵乇丞)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 丕賰鬲亘 賵氐賮賰 賴賳丕鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 賵氐賮 賲禺鬲氐乇 賱賱兀卮禺丕氐 丕賱匕賷賳 賱丕 賷爻鬲胤賷毓賵賳 乇丐賷丞 丕賱氐賵乇丞 兀賵 毓賳丿賲丕 賱丕 賷鬲賲 鬲丨賲賷賱 丕賱氐賵乇丞.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 兀購賳卮卅 賴匕丕 丕賱賳氐 丕賱亘丿賷賱 鬲賱賯丕卅賷賸丕 賵賯丿 賷賰賵賳 睾賷乇 丿賯賷賯.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 丕胤賾賱毓 毓賱賶 丕賱賲夭賷丿
+pdfjs-editor-new-alt-text-create-automatically-button-label = 兀賳卮卅 賳氐 亘丿賷賱 鬲賱賯丕卅賷賸丕
+pdfjs-editor-new-alt-text-not-now-button = 賱賷爻 丕賱丌賳
+pdfjs-editor-new-alt-text-error-title = 賱賲 賷鬲賲賰賳 賲賳 廿賳卮丕亍 賳氐 亘丿賷賱 鬲賱賯丕卅賷賸丕
+pdfjs-editor-new-alt-text-error-description = 賷購乇噩賶 賰鬲丕亘丞 賳氐 亘丿賷賱賰 兀賵 丕賱賲丨丕賵賱丞 賲乇丞 兀禺乇賶 賱丕丨賯賸丕.
+pdfjs-editor-new-alt-text-error-close-button = 兀睾賱賯
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 賷購賳夭賾賱 賳賲賵匕噩 丕賱匕賰丕亍 丕賱丕氐胤賳丕毓賷 賱賱賳氐 丕賱亘丿賷賱 ({ $downloadedSize } 賲賳 { $totalSize } 賲.亘丕賷鬲)
+    .aria-valuetext = 賷購賳夭賾賱 賳賲賵匕噩 丕賱匕賰丕亍 丕賱丕氐胤賳丕毓賷 賱賱賳氐 丕賱亘丿賷賱 ({ $downloadedSize } 賲賳 { $totalSize } 賲.亘丕賷鬲)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 兀購囟賽賷賮 賳氐 亘丿賷賱
+pdfjs-editor-new-alt-text-added-button-label = 兀購囟賽賷賮 賳氐 亘丿賷賱
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 賳氐 亘丿賷賱 賲賮賯賵丿
+pdfjs-editor-new-alt-text-missing-button-label = 賳氐 亘丿賷賱 賲賮賯賵丿
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 乇丕噩毓 丕賱賳氐 丕賱亘丿賷賱
+pdfjs-editor-new-alt-text-to-review-button-label = 乇丕噩毓 丕賱賳氐 丕賱亘丿賷賱
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 兀購賳卮卅 鬲賱賯丕卅賷賸丕: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 廿毓丿丕丿丕鬲 丕賱賳氐 丕賱亘丿賷賱 賱賱氐賵乇丞
+pdfjs-image-alt-text-settings-button-label = 廿毓丿丕丿丕鬲 丕賱賳氐 丕賱亘丿賷賱 賱賱氐賵乇丞
+pdfjs-editor-alt-text-settings-dialog-label = 廿毓丿丕丿丕鬲 丕賱賳氐 丕賱亘丿賷賱 賱賱氐賵乇丞
+pdfjs-editor-alt-text-settings-automatic-title = 賳氐 亘丿賷賱 鬲賱賯丕卅賷
+pdfjs-editor-alt-text-settings-create-model-button-label = 兀賳卮卅 賳氐 亘丿賷賱 鬲賱賯丕卅賷賸丕
+pdfjs-editor-alt-text-settings-create-model-description = 賷賯鬲乇丨 兀賵氐丕賮賸丕 賱賲爻丕毓丿丞 丕賱兀卮禺丕氐 丕賱匕賷賳 賱丕 賷爻鬲胤賷毓賵賳 乇丐賷丞 丕賱氐賵乇丞 兀賵 毓賳丿賲丕 賱丕 賷鬲賲 鬲丨賲賷賱 丕賱氐賵乇丞.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 賳賲賵匕噩 丕賱匕賰丕亍 丕賱丕氐胤賳丕毓賷 賱賱賳氐 丕賱亘丿賷賱 ({ $totalSize } 賲.亘丕賷鬲)
+pdfjs-editor-alt-text-settings-ai-model-description = 賷鬲賲 鬲卮睾賷賱賴 賲丨賱賷賸丕 毓賱賶 噩賴丕夭賰 丨鬲賶 鬲馗賱 亘賷丕賳丕鬲賰 禺丕氐丞. 賲胤賱賵亘 賱賱賳氐 丕賱亘丿賷賱 丕賱鬲賱賯丕卅賷.
+pdfjs-editor-alt-text-settings-delete-model-button = 丕丨匕賮
+pdfjs-editor-alt-text-settings-download-model-button = 賳夭賾賱
+pdfjs-editor-alt-text-settings-downloading-model-button = 賷購賳夭賱鈥�
+pdfjs-editor-alt-text-settings-editor-title = 賲購丨乇賾賽乇 丕賱賳氐 丕賱亘丿賷賱
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 兀馗賴賽乇 賲購丨乇賾賽乇 丕賱賳氐 丕賱亘丿賷賱 毓賱賶 丕賱賮賵乇 毓賳丿 廿囟丕賮丞 氐賵乇丞
+pdfjs-editor-alt-text-settings-show-dialog-description = 賷爻丕毓丿賰 毓賱賶 丕賱鬲兀賰丿 賲賳 兀賳 噩賲賷毓 氐賵乇賰 鬲丨鬲賵賷 毓賱賶 賳氐 亘丿賷賱.
+pdfjs-editor-alt-text-settings-close-button = 兀睾賱賯
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 兀購囟賷賮 廿亘乇丕夭
+pdfjs-editor-freetext-added-alert = 兀購囟賷賮 丕賱賳氐
+pdfjs-editor-ink-added-alert = 兀購囟賷賮 乇爻賲
+pdfjs-editor-stamp-added-alert = 兀購囟賷賮 氐賵乇丞
+pdfjs-editor-signature-added-alert = 兀購囟賷賮 鬲賵賯賷毓
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 兀購夭賽賷賱 丕賱亘乇夭
+pdfjs-editor-undo-bar-message-freetext = 兀購夭賷賱 丕賱賳氐
+pdfjs-editor-undo-bar-message-ink = 兀購夭賽賷賱鬲 丕賱乇爻賲丞
+pdfjs-editor-undo-bar-message-stamp = 兀購夭賷賱鬲 丕賱氐賵乇丞
+pdfjs-editor-undo-bar-message-signature = 兀購夭賷賱 丕賱鬲賵賯賷毓
+pdfjs-editor-undo-bar-message-comment = 兀購夭賷賱 丕賱鬲毓賱賷賯
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [zero] 兀購夭賷賱 賱丕 鬲毓賱賷賯
+        [one] 兀購夭賷賱 鬲毓賱賷賯
+        [two] 兀購夭賷賱 鬲毓賱賷賯賷賳
+        [few] 兀購夭賷賱鬲 { $count } 鬲毓賱賷賯丕鬲
+        [many] 兀購夭賷賱 { $count } 鬲毓賱賷賯
+       *[other] 兀購夭賷賱 { $count } 鬲毓賱賷賯
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 鬲乇丕噩毓
+pdfjs-editor-undo-bar-undo-button-label = 鬲乇丕噩毓
+pdfjs-editor-undo-bar-close-button =
+    .title = 兀睾賱賯
+pdfjs-editor-undo-bar-close-button-label = 兀睾賱賯
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 賷鬲賷丨 賴匕丕 丕賱賳賲賵匕噩 賱賱賲爻鬲禺丿賲 廿賳卮丕亍 鬲賵賯賷毓 賱廿囟丕賮鬲賴 廿賱賶 賲爻鬲賳丿 PDF. 賵賷賲賰賳 賱賱賲爻鬲禺丿賲 鬲丨乇賷乇 丕賱丕爻賲 (丕賱匕賷 賷毓賲賱 兀賷囟賸丕 賰賳氐 亘丿賷賱)貙 賵丨賮馗 丕賱鬲賵賯賷毓 亘卮賰賱 丕禺鬲賷丕乇賷 賱賱丕爻鬲禺丿丕賲 丕賱賲鬲賰乇乇.
+pdfjs-editor-add-signature-dialog-title = 兀囟賽賮 鬲賵賯賷毓賸丕
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 丕賰鬲亘
+    .title = 丕賰鬲亘
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 丕乇爻賲
+    .title = 丕乇爻賲
+pdfjs-editor-add-signature-image-button = 氐賵乇丞
+    .title = 氐賵乇丞
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 丕賰鬲亘 鬲賵賯賷毓賰
+    .placeholder = 丕賰鬲亘 鬲賵賯賷毓賰
+pdfjs-editor-add-signature-draw-placeholder = 丕乇爻賲 鬲賵賯賷毓賰
+pdfjs-editor-add-signature-draw-thickness-range-label = 丕賱爻賲丕賰丞
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 爻賲賰 丕賱乇爻賲: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 丕爻丨亘 丕賱賲賱賮 賴賳丕 賱乇賮毓賴
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 兀賵 丕禺鬲乇 賲賱賮丕鬲 丕賱氐賵乇
+       *[other] 兀賵 鬲氐賮丨 賲賱賮丕鬲 丕賱氐賵乇
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 丕賱賵氐賮 (賳氐 亘丿賷賱)
+pdfjs-editor-add-signature-description-input =
+    .title = 丕賱賵氐賮 (賳氐 亘丿賷賱)
+pdfjs-editor-add-signature-description-default-when-drawing = 鬲賵賯賷毓
+pdfjs-editor-add-signature-clear-button-label = 丕賲丨購 丕賱鬲賵賯賷毓
+pdfjs-editor-add-signature-clear-button =
+    .title = 丕賲丨購 丕賱鬲賵賯賷毓
+pdfjs-editor-add-signature-save-checkbox = 丕丨賮馗 丕賱鬲賵賯賷毓
+pdfjs-editor-add-signature-save-warning-message = 賱賯丿 賵氐賱鬲 廿賱賶 丕賱丨丿 丕賱兀賯氐賶 賵賴賵 5 鬲賵賯賷毓丕鬲 賲丨賮賵馗丞. 兀夭賽賱 鬲賵賯賷毓 賵丕丨丿 賱丨賮馗 丕賱賲夭賷丿.
+pdfjs-editor-add-signature-image-upload-error-title = 鬲毓匕乇 乇賮毓 丕賱氐賵乇丞.
+pdfjs-editor-add-signature-image-upload-error-description = 鬲丨賯賯 賲賳 丕鬲氐丕賱 丕賱卮亘賰丞 賱丿賷賰 兀賵 噩乇賾亘 氐賵乇丞 兀禺乇賶.
+pdfjs-editor-add-signature-image-no-data-error-title = 賱丕 賷賲賰賳 鬲丨賵賷賱 賴匕賴 丕賱氐賵乇丞 廿賱賶 鬲賵賯賷毓
+pdfjs-editor-add-signature-image-no-data-error-description = 賲賳 賮囟賱賰 丨丕賵賱 乇賮毓 氐賵乇丞 兀禺乇賶.
+pdfjs-editor-add-signature-error-close-button = 兀睾賱賯
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 兀賱睾賽
+pdfjs-editor-add-signature-add-button = 兀囟賽賮
+pdfjs-editor-edit-signature-update-button = 丨丿賾孬
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 丨乇賾乇 丕賱鬲毓賱賷賯
+pdfjs-editor-edit-comment-popup-button =
+    .title = 丨乇賾乇 丕賱鬲毓賱賷賯
+pdfjs-editor-delete-comment-popup-button-label = 兀夭賽賱 丕賱鬲毓賱賷賯
+pdfjs-editor-delete-comment-popup-button =
+    .title = 兀夭賽賱 丕賱鬲毓賱賷賯
+pdfjs-show-comment-button =
+    .title = 兀馗賴乇 丕賱鬲毓賱賷賯
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 丨乇賾乇 丕賱鬲毓賱賷賯
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 丨丿賾孬
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 兀囟賽賮 鬲毓賱賷賯賸丕
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 兀囟賮
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 丕亘丿兀 丕賱賰鬲丕亘丞鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 兀賱睾賽
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 兀囟賮 丕賱鬲毓賱賷賯
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 鬲亘丿賷賱 丕賱卮乇賷胤 丕賱噩丕賳亘賷 (賷丨鬲賵賷 丕賱賲爻鬲賳丿 毓賱賶 氐賵乇 賲氐睾乇丞/賲禺胤胤 鬲賮氐賷賱賷/賲乇賮賯丕鬲/胤亘賯丕鬲)
+pdfjs-toggle-views-manager-button1-label = 兀丿賽乇 丕賱氐賮丨丕鬲
+pdfjs-views-manager-sidebar =
+    .aria-label = 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 兀丿丕丞 鬲睾賷賷乇 丨噩賲 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+pdfjs-views-manager-view-selector-button =
+    .title = 丕賱賲賳丕馗賷乇
+pdfjs-views-manager-view-selector-button-label = 丕賱賲賳丕馗賷乇
+pdfjs-views-manager-pages-title = 丕賱氐賮丨丕鬲
+pdfjs-views-manager-outlines-title1 = 賲禺胤胤 丕賱賲爻鬲賳丿
+    .title = 賲禺胤胤 丕賱賲爻鬲賳丿 (丕賳賯乇 賳賯乇賸丕 賲夭丿賵噩賸丕 賱鬲賵爻賷毓/胤賷 賰丕賮丞 丕賱毓賳丕氐乇)
+pdfjs-views-manager-attachments-title = 丕賱賲乇賮賯丕鬲
+pdfjs-views-manager-layers-title1 = 鈥忊�徹坟ㄙ傌ж�
+    .title = 丕賱胤亘賯丕鬲 (丕賳賯乇 賳賯乇賸丕 賲夭丿賵噩賸丕 賱廿毓丕丿丞 鬲毓賷賷賳 賰丕賮丞 丕賱胤亘賯丕鬲 廿賱賶 丕賱丨丕賱丞 丕賱賲亘丿卅賷丞)
+pdfjs-views-manager-pages-option-label = 丕賱氐賮丨丕鬲
+pdfjs-views-manager-outlines-option-label = 賲禺胤胤 丕賱賲爻鬲賳丿
+pdfjs-views-manager-attachments-option-label = 丕賱賲乇賮賯丕鬲
+pdfjs-views-manager-layers-option-label = 鈥忊�徹з勜坟ㄙ傌ж�
+pdfjs-views-manager-add-file-button =
+    .title = 兀囟賮 賲賱賮
+pdfjs-views-manager-add-file-button-label = 兀囟賮 賲賱賮
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [zero] { $count } 賲丨丿賾丿
+        [one] { $count } 賲丨丿賾丿
+        [two] { $count } 賲丨丿賾丿丕賳
+        [few] { $count } 賲丨丿賾丿
+        [many] { $count } 賲丨丿賾丿
+       *[other] { $count } 賲丨丿賾丿
+    }
+pdfjs-views-manager-pages-status-none-action-label = 丨丿賾丿 丕賱氐賮丨丕鬲
+pdfjs-views-manager-pages-status-action-button-label = 兀丿賽乇
+pdfjs-views-manager-pages-status-copy-button-label = 丕賳爻禺
+pdfjs-views-manager-pages-status-cut-button-label = 賯氐賾
+pdfjs-views-manager-pages-status-delete-button-label = 丕丨匕賮
+pdfjs-views-manager-pages-status-export-selected-button-label = 丨購丿賾賽丿 丕賱鬲氐丿賷乇鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [zero] 賱丕 氐賮丨丕鬲 賯購氐鬲
+        [one] 氐賮丨丞 賯購氐鬲
+        [two] { $count } 氐賮丨鬲丕賳 賯購氐鬲
+        [few] { $count } 氐賮丨丕鬲 賯購氐鬲
+        [many] { $count } 氐賮丨丞賸 賯購氐鬲
+       *[other] { $count } 氐賮丨丞 賯購氐鬲
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [zero] 賱丕 氐賮丨丞 賲賳爻賵禺丞
+        [one] 氐賮丨丞 賲賳爻賵禺丞
+        [two] 氐賮丨鬲丕賳 賲賳爻賵禺鬲丕賳
+        [few] { $count } 氐賮丨丕鬲 賲賳爻賵禺丞
+        [many] { $count } 氐賮丨丞賸 賲賳爻賵禺丞賸
+       *[other] { $count } 氐賮丨丞 賲賳爻賵禺丞
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [zero] 賱丕 氐賮丨丕鬲 賲丨匕賵賮丞
+        [one] 丨購匕賮 氐賮丨丞
+        [two] 丨購匕賮 氐賮丨鬲丕賳
+        [few] 丨購匕賮 { $count } 氐賮丨丕鬲
+        [many] 丨購匕賮 { $count } 氐賮丨丞賸
+       *[other] 丨購匕賮 { $count } 氐賮丨丞
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 賷噩賴夭 賲賱賮賰鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 賷乇賮毓 賲賱賮鈥�
+pdfjs-views-manager-status-warning-cut-label = 鬲毓匕賾乇 丕賱賯氐. 兀賳毓卮 丕賱氐賮丨丞 賵丨丕賵賱 賲噩丿丿賸丕.
+pdfjs-views-manager-status-warning-copy-label = 鬲毓匕賾乇 丕賱賳爻禺. 兀賳毓卮 丕賱氐賮丨丞 賵丨丕賵賱 賲噩丿丿賸丕.
+pdfjs-views-manager-status-warning-delete-label = 鬲毓匕賾乇 丕賱丨匕賮. 丨丿賾賽孬 丕賱氐賮丨丞 賵丨丕賵賱 賲噩丿丿賸丕.
+pdfjs-views-manager-status-warning-save-label = 鬲毓匕賾乇 丕賱丨賮馗. 兀賳毓卮 丕賱氐賮丨丞 賵丨丕賵賱 賲噩丿丿賸丕.
+pdfjs-views-manager-status-undo-button-label = 鬲乇丕噩毓
+pdfjs-views-manager-status-done-button-label = 鬲賲賾
+pdfjs-views-manager-status-close-button =
+    .title = 兀睾賱賯
+pdfjs-views-manager-status-close-button-label = 兀睾賱賯
+pdfjs-views-manager-paste-button-label = 兀賱氐賯
+pdfjs-views-manager-paste-button-before =
+    .title = 兀賱氐賯 賯亘賱 丕賱氐賮丨丞 丕賱兀賵賱賶
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 兀賱氐賯 亘毓丿 丕賱氐賮丨丞 { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 噩丿賷丿
+pdfjs-views-manager-waiting-for-file = 賷乇賮毓 賲賱賮鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 兀丿賽乇 丕賱氐賮丨丕鬲
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 兀夭賽賱 丕賱鬲賵賯賷毓 丕賱賲丨賮賵馗
+pdfjs-editor-delete-signature-button-label1 = 兀夭賽賱 丕賱鬲賵賯賷毓 丕賱賲丨賮賵馗
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 毓丿賾賱 丕賱賵氐賮
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 毓丿賾賱 丕賱賵氐賮
diff --git a/public/pdfjs/web/locale/ast/viewer.ftl b/public/pdfjs/web/locale/ast/viewer.ftl
new file mode 100644
index 0000000..2993916
--- /dev/null
+++ b/public/pdfjs/web/locale/ast/viewer.ftl
@@ -0,0 +1,172 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩xina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = P谩xina siguiente
+pdfjs-next-button-label = Siguiente
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P谩xina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Allo帽ar
+pdfjs-zoom-out-button-label = Allo帽a
+pdfjs-zoom-in-button =
+    .title = Averar
+pdfjs-zoom-in-button-label = Avera
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Cambiar al mou de presentaci贸n
+pdfjs-presentation-mode-button-label = Mou de presentaci贸n
+pdfjs-open-file-button-label = Abrir
+pdfjs-print-button =
+    .title = Imprentar
+pdfjs-print-button-label = Imprentar
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ferramientes
+pdfjs-tools-button-label = Ferramientes
+pdfjs-first-page-button-label = Dir a la primer p谩xina
+pdfjs-last-page-button-label = Dir a la 煤ltima p谩xina
+pdfjs-page-rotate-cw-button =
+    .title = Voltia a la derecha
+pdfjs-page-rotate-cw-button-label = Voltiar a la derecha
+pdfjs-page-rotate-ccw-button =
+    .title = Voltia a la esquierda
+pdfjs-page-rotate-ccw-button-label = Voltiar a la esquierda
+pdfjs-cursor-text-select-tool-button =
+    .title = Activa la ferramienta d'esbilla de testu
+pdfjs-cursor-text-select-tool-button-label = Ferramienta d'esbilla de testu
+pdfjs-cursor-hand-tool-button =
+    .title = Activa la ferramienta de mano
+pdfjs-cursor-hand-tool-button-label = Ferramienta de mano
+pdfjs-scroll-vertical-button =
+    .title = Usa'l desplazamientu vertical
+pdfjs-scroll-vertical-button-label = Desplazamientu vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usa'l desplazamientu horizontal
+pdfjs-scroll-horizontal-button-label = Desplazamientu horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Usa'l desplazamientu continuu
+pdfjs-scroll-wrapped-button-label = Desplazamientu continuu
+pdfjs-spread-none-button-label = Fueyes individuales
+pdfjs-spread-odd-button-label = Fueyes pares
+pdfjs-spread-even-button-label = Fueyes impares
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiedaes del documentu鈥�
+pdfjs-document-properties-button-label = Propiedaes del documentu鈥�
+pdfjs-document-properties-file-name = Nome del ficheru:
+pdfjs-document-properties-file-size = Tama帽u del ficheru:
+pdfjs-document-properties-title = T铆tulu:
+pdfjs-document-properties-keywords = Pallabres clave:
+pdfjs-document-properties-creation-date = Data de creaci贸n:
+pdfjs-document-properties-modification-date = Data de modificaci贸n:
+pdfjs-document-properties-producer = Productor del PDF:
+pdfjs-document-properties-version = Versi贸n del PDF:
+pdfjs-document-properties-page-count = N煤mberu de p谩xines:
+pdfjs-document-properties-page-size = Tama帽u de p谩xina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = horizontal
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista web r谩pida:
+pdfjs-document-properties-linearized-yes = S铆
+pdfjs-document-properties-linearized-no = Non
+pdfjs-document-properties-close-button = Zarrar
+
+## Print
+
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Encaboxar
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Alternar la barra llateral
+pdfjs-attachments-button =
+    .title = Amosar los axuntos
+pdfjs-attachments-button-label = Axuntos
+pdfjs-layers-button-label = Capes
+pdfjs-thumbs-button =
+    .title = Amosar les miniatures
+pdfjs-thumbs-button-label = Miniatures
+pdfjs-findbar-button-label = Atopar
+pdfjs-additional-layers = Capes adicionales
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P谩xina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button-label = Siguiente
+pdfjs-find-entire-word-checkbox-label = Pallabres completes
+pdfjs-find-reached-top = Algam贸se'l comienzu de la p谩xina, s铆guese dende abaxo
+pdfjs-find-reached-bottom = Algam贸se la fin del documentu, s铆guese dende arriba
+
+## Predefined zoom values
+
+pdfjs-page-scale-auto = Zoom autom谩ticu
+pdfjs-page-scale-actual = Tama帽u real
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P谩xina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Asocedi贸 un fallu mentanto se cargaba'l PDF.
+
+## Password
+
+pdfjs-password-ok-button = Aceptar
+pdfjs-password-cancel-button = Encaboxar
diff --git a/public/pdfjs/web/locale/az/viewer.ftl b/public/pdfjs/web/locale/az/viewer.ftl
new file mode 100644
index 0000000..a2d8c19
--- /dev/null
+++ b/public/pdfjs/web/locale/az/viewer.ftl
@@ -0,0 +1,228 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 茝vv蓹lki s蓹hif蓹
+pdfjs-previous-button-label = 茝vv蓹lkini tap
+pdfjs-next-button =
+    .title = N枚vb蓹ti s蓹hif蓹
+pdfjs-next-button-label = 陌r蓹li
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = S蓹hif蓹
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = / { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Uzaqla艧
+pdfjs-zoom-out-button-label = Uzaqla艧
+pdfjs-zoom-in-button =
+    .title = Yax谋nla艧
+pdfjs-zoom-in-button-label = Yax谋nla艧
+pdfjs-zoom-select =
+    .title = Yax谋nla艧d谋rma
+pdfjs-presentation-mode-button =
+    .title = T蓹qdimat Rejimin蓹 Ke莽
+pdfjs-presentation-mode-button-label = T蓹qdimat Rejimi
+pdfjs-open-file-button =
+    .title = Fayl A莽
+pdfjs-open-file-button-label = A莽
+pdfjs-print-button =
+    .title = Yazd谋r
+pdfjs-print-button-label = Yazd谋r
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Al蓹tl蓹r
+pdfjs-tools-button-label = Al蓹tl蓹r
+pdfjs-first-page-button =
+    .title = 陌lk S蓹hif蓹y蓹 get
+pdfjs-first-page-button-label = 陌lk S蓹hif蓹y蓹 get
+pdfjs-last-page-button =
+    .title = Son S蓹hif蓹y蓹 get
+pdfjs-last-page-button-label = Son S蓹hif蓹y蓹 get
+pdfjs-page-rotate-cw-button =
+    .title = Saat 陌stiqam蓹tind蓹 F谋rlat
+pdfjs-page-rotate-cw-button-label = Saat 陌stiqam蓹tind蓹 F谋rlat
+pdfjs-page-rotate-ccw-button =
+    .title = Saat 陌stiqam蓹tinin 茝ksin蓹 F谋rlat
+pdfjs-page-rotate-ccw-button-label = Saat 陌stiqam蓹tinin 茝ksin蓹 F谋rlat
+pdfjs-cursor-text-select-tool-button =
+    .title = Yaz谋 se莽m蓹 al蓹tini aktivl蓹艧dir
+pdfjs-cursor-text-select-tool-button-label = Yaz谋 se莽m蓹 al蓹ti
+pdfjs-cursor-hand-tool-button =
+    .title = 茝l al蓹tini aktivl蓹艧dir
+pdfjs-cursor-hand-tool-button-label = 茝l al蓹ti
+pdfjs-scroll-vertical-button =
+    .title = 艦aquli s眉r眉艧d眉rm蓹 i艧l蓹t
+pdfjs-scroll-vertical-button-label = 艦aquli s眉r眉艧d眉rm蓹
+pdfjs-scroll-horizontal-button =
+    .title = 脺f眉qi s眉r眉艧d眉rm蓹 i艧l蓹t
+pdfjs-scroll-horizontal-button-label = 脺f眉qi s眉r眉艧d眉rm蓹
+pdfjs-scroll-wrapped-button =
+    .title = B眉k眉l眉 s眉r眉艧d眉rm蓹 i艧l蓹t
+pdfjs-scroll-wrapped-button-label = B眉k眉l眉 s眉r眉艧d眉rm蓹
+pdfjs-spread-none-button =
+    .title = Yan-yana birl蓹艧dirilmi艧 s蓹hif蓹l蓹ri i艧l蓹tm蓹
+pdfjs-spread-none-button-label = Birl蓹艧dirm蓹
+pdfjs-spread-odd-button =
+    .title = Yan-yana birl蓹艧dirilmi艧 s蓹hif蓹l蓹ri t蓹k n枚mr蓹li s蓹hif蓹l蓹rd蓹n ba艧lat
+pdfjs-spread-odd-button-label = T蓹k n枚mr蓹li
+pdfjs-spread-even-button =
+    .title = Yan-yana birl蓹艧dirilmi艧 s蓹hif蓹l蓹ri c眉t n枚mr蓹li s蓹hif蓹l蓹rd蓹n ba艧lat
+pdfjs-spread-even-button-label = C眉t n枚mr蓹li
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = S蓹n蓹d x眉susiyy蓹tl蓹ri鈥�
+pdfjs-document-properties-button-label = S蓹n蓹d x眉susiyy蓹tl蓹ri鈥�
+pdfjs-document-properties-file-name = Fayl ad谋:
+pdfjs-document-properties-file-size = Fayl 枚l莽眉s眉:
+pdfjs-document-properties-title = Ba艧l谋k:
+pdfjs-document-properties-author = M眉蓹llif:
+pdfjs-document-properties-subject = M枚vzu:
+pdfjs-document-properties-keywords = A莽ar s枚zl蓹r:
+pdfjs-document-properties-creation-date = Yarad谋l谋艧 Tarixi :
+pdfjs-document-properties-modification-date = D蓹yi艧dirilm蓹 Tarixi :
+pdfjs-document-properties-creator = Yaradan:
+pdfjs-document-properties-producer = PDF yarad谋c谋s谋:
+pdfjs-document-properties-version = PDF versiyas谋:
+pdfjs-document-properties-page-count = S蓹hif蓹 say谋:
+pdfjs-document-properties-page-size = S蓹hif蓹 脰l莽眉s眉:
+pdfjs-document-properties-page-size-unit-inches = in莽
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portret
+pdfjs-document-properties-page-size-orientation-landscape = albom
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = M蓹ktub
+pdfjs-document-properties-page-size-name-legal = H眉quqi
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = B蓹li
+pdfjs-document-properties-linearized-no = Xeyr
+pdfjs-document-properties-close-button = Qapat
+
+## Print
+
+pdfjs-print-progress-message = S蓹n蓹d 莽ap 眉莽眉n haz谋rlan谋r鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = L蓹臒v et
+pdfjs-printing-not-supported = X蓹b蓹rdarl谋q: 脟ap bu s蓹yyah t蓹r蓹find蓹n tam olaraq d蓹st蓹kl蓹nmir.
+pdfjs-printing-not-ready = X蓹b蓹rdarl谋q: PDF 莽ap 眉莽眉n tam y眉kl蓹nm蓹yib.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Yan Paneli A莽/Ba臒la
+pdfjs-toggle-sidebar-notification-button =
+    .title = Yan paneli 莽evir (s蓹n蓹dd蓹 icmal/ba臒lamalar/laylar m枚vcuddur)
+pdfjs-toggle-sidebar-button-label = Yan Paneli A莽/Ba臒la
+pdfjs-document-outline-button =
+    .title = S蓹n蓹din eskizini g枚st蓹r (b眉t眉n b蓹ndl蓹ri a莽maq/y谋臒maq 眉莽眉n iki d蓹f蓹 klikl蓹yin)
+pdfjs-document-outline-button-label = S蓹n蓹d strukturu
+pdfjs-attachments-button =
+    .title = Ba臒lamalar谋 g枚st蓹r
+pdfjs-attachments-button-label = Ba臒lamalar
+pdfjs-layers-button =
+    .title = Laylar谋 g枚st蓹r (b眉t眉n laylar谋 ilkin hal谋na s谋f谋rlamaq 眉莽眉n iki d蓹f蓹 klikl蓹yin)
+pdfjs-layers-button-label = Laylar
+pdfjs-thumbs-button =
+    .title = Ki莽ik 艧蓹kill蓹ri g枚st蓹r
+pdfjs-thumbs-button-label = Ki莽ik 艧蓹kill蓹r
+pdfjs-findbar-button =
+    .title = S蓹n蓹dd蓹 Tap
+pdfjs-findbar-button-label = Tap
+pdfjs-additional-layers = 茝lav蓹 laylar
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = S蓹hif蓹{ $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } s蓹hif蓹sinin ki莽ik v蓹ziyy蓹ti
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Tap
+    .placeholder = S蓹n蓹dd蓹 tap鈥�
+pdfjs-find-previous-button =
+    .title = Bir 枚nc蓹ki uy臒un g蓹l蓹n s枚z眉 tap谋r
+pdfjs-find-previous-button-label = Geri
+pdfjs-find-next-button =
+    .title = Bir sonrak谋 uy臒un g蓹l蓹n s枚z眉 tap谋r
+pdfjs-find-next-button-label = 陌r蓹li
+pdfjs-find-highlight-checkbox = 陌艧ar蓹l蓹
+pdfjs-find-match-case-checkbox-label = B枚y眉k/ki莽ik h蓹rf蓹 h蓹ssasl谋q
+pdfjs-find-entire-word-checkbox-label = Tam s枚zl蓹r
+pdfjs-find-reached-top = S蓹n蓹din yuxar谋s谋na 莽atd谋, a艧a臒谋dan davam edir
+pdfjs-find-reached-bottom = S蓹n蓹din sonuna 莽atd谋, yuxar谋dan davam edir
+pdfjs-find-not-found = Uy臒unla艧ma tap谋lmad谋
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = S蓹hif蓹 geni艧liyi
+pdfjs-page-scale-fit = S蓹hif蓹ni s谋臒d谋r
+pdfjs-page-scale-auto = Avtomatik yax谋nla艧d谋r
+pdfjs-page-scale-actual = Haz谋rk谋 H蓹cm
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF y眉klen蓹rk蓹n bir s蓹hv yarand谋.
+pdfjs-invalid-file-error = S蓹hv v蓹 ya z蓹d蓹l蓹nmi艧 olmu艧 PDF fayl.
+pdfjs-missing-file-error = PDF fayl yoxdur.
+pdfjs-unexpected-response-error = G枚zl蓹nilm蓹z server cavab谋.
+pdfjs-rendering-error = S蓹hif蓹 g枚st蓹ril蓹rk蓹n s蓹hv yarand谋.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotasiyas谋]
+
+## Password
+
+pdfjs-password-label = Bu PDF fayl谋 a莽maq 眉莽眉n parolu daxil edin.
+pdfjs-password-invalid = Parol s蓹hvdir. Bir daha yoxlay谋n.
+pdfjs-password-ok-button = Tamam
+pdfjs-password-cancel-button = L蓹臒v et
+pdfjs-web-fonts-disabled = Web 艦riftl蓹r s枚nd眉r眉l眉b: yerl蓹艧dirilmi艧 PDF 艧riftl蓹rini istifad蓹 etm蓹k m眉mk眉n deyil.
diff --git a/public/pdfjs/web/locale/be/viewer.ftl b/public/pdfjs/web/locale/be/viewer.ftl
new file mode 100644
index 0000000..e851c00
--- /dev/null
+++ b/public/pdfjs/web/locale/be/viewer.ftl
@@ -0,0 +1,755 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 袩邪锌褟褉褝写薪褟褟 褋褌邪褉芯薪泻邪
+pdfjs-previous-button-label = 袩邪锌褟褉褝写薪褟褟
+pdfjs-next-button =
+    .title = 袧邪褋褌褍锌薪邪褟 褋褌邪褉芯薪泻邪
+pdfjs-next-button-label = 袧邪褋褌褍锌薪邪褟
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 小褌邪褉芯薪泻邪
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 蟹 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 蟹 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 袩邪屑械薪褕褘褑褜
+pdfjs-zoom-out-button-label = 袩邪屑械薪褕褘褑褜
+pdfjs-zoom-in-button =
+    .title = 袩邪胁褟谢褨褔褘褑褜
+pdfjs-zoom-in-button-label = 袩邪胁褟谢褨褔褘褑褜
+pdfjs-zoom-select =
+    .title = 袩邪胁褟谢褨褔褝薪薪械 褌褝泻褋褌褍
+pdfjs-presentation-mode-button =
+    .title = 袩械褉邪泻谢褞褔褘褑褑邪 褳 褉褝卸褘屑 锌邪泻邪蟹褍
+pdfjs-presentation-mode-button-label = 袪褝卸褘屑 锌邪泻邪蟹褍
+pdfjs-open-file-button =
+    .title = 袗写泻褉褘褑褜 褎邪泄谢
+pdfjs-open-file-button-label = 袗写泻褉褘褑褜
+pdfjs-print-button =
+    .title = 袛褉褍泻邪胁邪褑褜
+pdfjs-print-button-label = 袛褉褍泻邪胁邪褑褜
+pdfjs-save-button =
+    .title = 袟邪褏邪胁邪褑褜
+pdfjs-save-button-label = 袟邪褏邪胁邪褑褜
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 小褑褟谐薪褍褑褜
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 小褑褟谐薪褍褑褜
+pdfjs-bookmark-button =
+    .title = 袛蟹械泄薪邪褟 褋褌邪褉芯薪泻邪 (锌邪谐谢褟写蟹械褑褜 URL-邪写褉邪褋 蟹 写蟹械泄薪邪泄 褋褌邪褉芯薪泻褨)
+pdfjs-bookmark-button-label = 笑褟锌械褉邪褕薪褟褟 褋褌邪褉芯薪泻邪
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 袩褉褘谢邪写褘
+pdfjs-tools-button-label = 袩褉褘谢邪写褘
+pdfjs-first-page-button =
+    .title = 袩械褉邪泄褋褑褨 薪邪 锌械褉褕褍褞 褋褌邪褉芯薪泻褍
+pdfjs-first-page-button-label = 袩械褉邪泄褋褑褨 薪邪 锌械褉褕褍褞 褋褌邪褉芯薪泻褍
+pdfjs-last-page-button =
+    .title = 袩械褉邪泄褋褑褨 薪邪 邪锌芯褕薪褞褞 褋褌邪褉芯薪泻褍
+pdfjs-last-page-button-label = 袩械褉邪泄褋褑褨 薪邪 邪锌芯褕薪褞褞 褋褌邪褉芯薪泻褍
+pdfjs-page-rotate-cw-button =
+    .title = 袩邪胁褟褉薪褍褑褜 锌邪 褋芯薪褑褍
+pdfjs-page-rotate-cw-button-label = 袩邪胁褟褉薪褍褑褜 锌邪 褋芯薪褑褍
+pdfjs-page-rotate-ccw-button =
+    .title = 袩邪胁褟褉薪褍褑褜 褋褍锌褉邪褑褜 褋芯薪褑邪
+pdfjs-page-rotate-ccw-button-label = 袩邪胁褟褉薪褍褑褜 褋褍锌褉邪褑褜 褋芯薪褑邪
+pdfjs-cursor-text-select-tool-button =
+    .title = 校泻谢褞褔褘褑褜 锌褉褘谢邪写褍 胁褘斜邪褉褍 褌褝泻褋褌褍
+pdfjs-cursor-text-select-tool-button-label = 袩褉褘谢邪写邪 胁褘斜邪褉褍 褌褝泻褋褌褍
+pdfjs-cursor-hand-tool-button =
+    .title = 校泻谢褞褔褘褑褜 褉褍褔薪褍褞 锌褉褘谢邪写褍
+pdfjs-cursor-hand-tool-button-label = 袪褍褔薪邪褟 锌褉褘谢邪写邪
+pdfjs-scroll-page-button =
+    .title = 袙褘泻邪褉褘褋褌芯褳胁邪褑褜 锌褉邪泻褉褍褌泻褍 褋褌邪褉芯薪泻i
+pdfjs-scroll-page-button-label = 袩褉邪泻褉褍褌泻邪 褋褌邪褉芯薪泻i
+pdfjs-scroll-vertical-button =
+    .title = 校卸褘胁邪褑褜 胁械褉褌褘泻邪谢褜薪褍褞 锌褉邪泻褉褍褌泻褍
+pdfjs-scroll-vertical-button-label = 袙械褉褌褘泻邪谢褜薪邪褟 锌褉邪泻褉褍褌泻邪
+pdfjs-scroll-horizontal-button =
+    .title = 校卸褘胁邪褑褜 谐邪褉褘蟹邪薪褌邪谢褜薪褍褞 锌褉邪泻褉褍褌泻褍
+pdfjs-scroll-horizontal-button-label = 袚邪褉褘蟹邪薪褌邪谢褜薪邪褟 锌褉邪泻褉褍褌泻邪
+pdfjs-scroll-wrapped-button =
+    .title = 校卸褘胁邪褑褜 屑邪褕褌邪斜邪胁邪谢褜薪褍褞 锌褉邪泻褉褍褌泻褍
+pdfjs-scroll-wrapped-button-label = 袦邪褕褌邪斜邪胁邪谢褜薪邪褟 锌褉邪泻褉褍褌泻邪
+pdfjs-spread-none-button =
+    .title = 袧械 胁褘泻邪褉褘褋褌芯褳胁邪褑褜 褉邪蟹谐芯褉薪褍褌褘褟 褋褌邪褉芯薪泻褨
+pdfjs-spread-none-button-label = 袘械蟹 褉邪蟹谐芯褉薪褍褌褘褏 褋褌邪褉芯薪邪泻
+pdfjs-spread-odd-button =
+    .title = 袪邪蟹谐芯褉薪褍褌褘褟 褋褌邪褉芯薪泻褨 锌邪褔褘薪邪褞褔褘 蟹 薪褟褑芯褌薪褘褏 薪褍屑邪褉芯褳
+pdfjs-spread-odd-button-label = 袧褟褑芯褌薪褘褟 褋褌邪褉芯薪泻褨 蟹谢械胁邪
+pdfjs-spread-even-button =
+    .title = 袪邪蟹谐芯褉薪褍褌褘褟 褋褌邪褉芯薪泻褨 锌邪褔褘薪邪褞褔褘 蟹 褑芯褌薪褘褏 薪褍屑邪褉芯褳
+pdfjs-spread-even-button-label = 笑芯褌薪褘褟 褋褌邪褉芯薪泻褨 蟹谢械胁邪
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 校谢邪褋褑褨胁邪褋褑褨 写邪泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-button-label = 校谢邪褋褑褨胁邪褋褑褨 写邪泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-file-name = 袧邪蟹胁邪 褎邪泄谢邪:
+pdfjs-document-properties-file-size = 袩邪屑械褉 褎邪泄谢邪:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 袣袘 ({ $b } 斜邪泄褌邪褳)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 袦袘 ({ $b } 斜邪泄褌邪褳)
+pdfjs-document-properties-title = 袟邪谐邪谢芯胁邪泻:
+pdfjs-document-properties-author = 袗褳褌邪褉:
+pdfjs-document-properties-subject = 孝褝屑邪:
+pdfjs-document-properties-keywords = 袣谢褞褔邪胁褘褟 褋谢芯胁褘:
+pdfjs-document-properties-creation-date = 袛邪褌邪 褋褌胁邪褉褝薪薪褟:
+pdfjs-document-properties-modification-date = 袛邪褌邪 蟹屑褟薪械薪薪褟:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 小褌胁邪褉邪谢褜薪褨泻:
+pdfjs-document-properties-producer = 袙褘褉邪斜薪褨泻 PDF:
+pdfjs-document-properties-version = 袙械褉褋褨褟 PDF:
+pdfjs-document-properties-page-count = 袣芯谢褜泻邪褋褑褜 褋褌邪褉芯薪邪泻:
+pdfjs-document-properties-page-size = 袩邪屑械褉 褋褌邪褉芯薪泻褨:
+pdfjs-document-properties-page-size-unit-inches = 褑邪谢褟褳
+pdfjs-document-properties-page-size-unit-millimeters = 屑屑
+pdfjs-document-properties-page-size-orientation-portrait = 泻薪褨卸薪邪褟
+pdfjs-document-properties-page-size-orientation-landscape = 邪谢褜斜芯屑薪邪褟
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 啸褍褌泻褨 锌褉邪谐谢褟写 褍 袉薪褌褝褉薪褝褑械:
+pdfjs-document-properties-linearized-yes = 孝邪泻
+pdfjs-document-properties-linearized-no = 袧械
+pdfjs-document-properties-close-button = 袟邪泻褉褘褑褜
+
+## Print
+
+pdfjs-print-progress-message = 袩邪写褉褘褏褌芯褳泻邪 写邪泻褍屑械薪褌邪 写邪 写褉褍泻褍鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 小泻邪褋邪胁邪褑褜
+pdfjs-printing-not-supported = 袩邪锌褟褉褝写卸邪薪薪械: 写褉褍泻 薪械 锌邪写褌褉褘屑谢褨胁邪械褑褑邪 褑邪谢泻邪屑 谐褝褌褘屑 斜褉邪褳蟹械褉邪屑.
+pdfjs-printing-not-ready = 校胁邪谐邪: PDF 薪械 褋褑褟谐薪褍褌褘 褑邪谢泻邪屑 写谢褟 写褉褍泻邪胁邪薪薪褟.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 袩邪泻邪蟹邪褑褜/褋褏邪胁邪褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜
+pdfjs-toggle-sidebar-notification-button =
+    .title = 袩邪泻邪蟹邪褑褜/褋褏邪胁邪褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜 (写邪泻褍屑械薪褌 屑邪械 蟹屑械褋褌/褍泻谢邪写邪薪薪褨/锌谢邪褋褌褘)
+pdfjs-toggle-sidebar-button-label = 袩邪泻邪蟹邪褑褜/褋褏邪胁邪褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜
+pdfjs-document-outline-button =
+    .title = 袩邪泻邪蟹邪褑褜 褋褌褉褍泻褌褍褉褍 写邪泻褍屑械薪褌邪 (写胁邪泄薪邪褟 锌褋褌褉褘褔泻邪, 泻邪斜 褉邪蟹谐邪褉薪褍褑褜 /蟹谐邪褉薪褍褑褜 褍褋械 褝谢械屑械薪褌褘)
+pdfjs-document-outline-button-label = 小褌褉褍泻褌褍褉邪 写邪泻褍屑械薪褌邪
+pdfjs-attachments-button =
+    .title = 袩邪泻邪蟹邪褑褜 写邪谢褍褔褝薪薪褨
+pdfjs-attachments-button-label = 袛邪谢褍褔褝薪薪褨
+pdfjs-layers-button =
+    .title = 袩邪泻邪蟹邪褑褜 锌谢邪褋褌褘 (薪邪褑褨褋薪褨褑械 写胁芯泄褔褘, 泻邪斜 褋泻褨薪褍褑褜 褍褋械 锌谢邪褋褌褘 写邪 锌褉邪写胁褘蟹薪邪褔邪薪邪谐邪 褋褌邪薪褍)
+pdfjs-layers-button-label = 袩谢邪褋褌褘
+pdfjs-thumbs-button =
+    .title = 袩邪泻邪蟹 屑褨薪褨褟褑褞褉
+pdfjs-thumbs-button-label = 袦褨薪褨褟褑褞褉褘
+pdfjs-current-outline-item-button =
+    .title = 袟薪邪泄褋褑褨 斜褟谐褍褔褘 褝谢械屑械薪褌 褋褌褉褍泻褌褍褉褘
+pdfjs-current-outline-item-button-label = 袘褟谐褍褔褘 褝谢械屑械薪褌 褋褌褉褍泻褌褍褉褘
+pdfjs-findbar-button =
+    .title = 袩芯褕褍泻 褍 写邪泻褍屑械薪褑械
+pdfjs-findbar-button-label = 袟薪邪泄褋褑褨
+pdfjs-additional-layers = 袛邪写邪褌泻芯胁褘褟 锌谢邪褋褌褘
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 小褌邪褉芯薪泻邪 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 袦褨薪褨褟褑褞褉邪 褋褌邪褉芯薪泻褨 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 袙褘斜褉邪褑褜 褋褌邪褉芯薪泻褍 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 小褌邪褉芯薪泻邪 { $page } 蟹聽{ $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 楔褍泻邪褑褜
+    .placeholder = 楔褍泻邪褑褜 褍 写邪泻褍屑械薪褑械鈥�
+pdfjs-find-previous-button =
+    .title = 袟薪邪泄褋褑褨 锌邪锌褟褉褝写薪褨 胁褘锌邪写邪泻 胁褘褉邪蟹褍
+pdfjs-find-previous-button-label = 袩邪锌褟褉褝写薪褨
+pdfjs-find-next-button =
+    .title = 袟薪邪泄褋褑褨 薪邪褋褌褍锌薪褘 胁褘锌邪写邪泻 胁褘褉邪蟹褍
+pdfjs-find-next-button-label = 袧邪褋褌褍锌薪褘
+pdfjs-find-highlight-checkbox = 袩邪写褎邪褉斜邪胁邪褑褜 褍褋械
+pdfjs-find-match-case-checkbox-label = 袗写褉芯蟹薪褨胁邪褑褜 胁褟谢褨泻褨褟/屑邪谢褘褟 谢褨褌邪褉褘
+pdfjs-find-match-diacritics-checkbox-label = 袟 褍谢褨泻邪屑 写褘褟泻褉褘褌褘泻
+pdfjs-find-entire-word-checkbox-label = 小谢芯胁褘 褑邪谢泻邪屑
+pdfjs-find-reached-top = 袛邪褋褟谐薪褍褌褘 锌邪褔邪褌邪泻 写邪泻褍屑械薪褌邪, 锌褉邪褑褟谐 蟹 泻邪薪褑邪
+pdfjs-find-reached-bottom = 袛邪褋褟谐薪褍褌褘 泻邪薪械褑 写邪泻褍屑械薪褌邪, 锌褉邪褑褟谐 蟹 锌邪褔邪褌泻褍
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 蟹 { $total } 褋褍锌邪写蟹械薪薪褟褳
+        [few] { $current } 蟹 { $total } 褋褍锌邪写蟹械薪薪褟褳
+       *[many] { $current } 蟹 { $total } 褋褍锌邪写蟹械薪薪褟褳
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 袘芯谢褜褕 蟹邪 { $limit } 褋褍锌邪写蟹械薪薪械
+        [few] 袘芯谢褜褕 蟹邪 { $limit } 褋褍锌邪写蟹械薪薪褨
+       *[many] 袘芯谢褜褕 蟹邪 { $limit } 褋褍锌邪写蟹械薪薪褟褳
+    }
+pdfjs-find-not-found = 袙褘褉邪蟹 薪械 蟹薪芯泄写蟹械薪褘
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 楔褘褉褘薪褟 褋褌邪褉芯薪泻褨
+pdfjs-page-scale-fit = 校褑褨褋薪械薪薪械 褋褌邪褉芯薪泻褨
+pdfjs-page-scale-auto = 袗褳褌邪屑邪褌褘褔薪邪械 锌邪胁械谢褨褔褝薪薪械
+pdfjs-page-scale-actual = 小邪锌褉邪褳写薪褘 锌邪屑械褉
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 小褌邪褉芯薪泻邪 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 袟写邪褉褘谢邪褋褟 锌邪屑褘谢泻邪 褳聽褔邪褋械 蟹邪谐褉褍蟹泻褨 PDF.
+pdfjs-invalid-file-error = 袧褟褋锌褉邪褳薪褘 邪斜芯 锌邪褕泻芯写卸邪薪褘 褎邪泄谢 PDF.
+pdfjs-missing-file-error = 袗写褋褍褌薪褘 褎邪泄谢 PDF.
+pdfjs-unexpected-response-error = 袧械褔邪泻邪薪褘 邪写泻邪蟹 褋械褉胁械褉邪.
+pdfjs-rendering-error = 袟写邪褉褘谢邪褋褟 锌邪屑褘谢泻邪 锌邪写褔邪褋 邪写谢褞褋褌褉邪胁邪薪薪褟 褋褌邪褉芯薪泻褨.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 校胁褟写蟹褨褑械 锌邪褉芯谢褜, 泻邪斜 邪写泻褉褘褑褜 谐褝褌褘 褎邪泄谢 PDF.
+pdfjs-password-invalid = 袧褟写蟹械泄褋薪褘 锌邪褉芯谢褜. 袩邪褋锌褉邪斜褍泄褑械 蟹薪芯褳.
+pdfjs-password-ok-button = 袛芯斜褉邪
+pdfjs-password-cancel-button = 小泻邪褋邪胁邪褑褜
+pdfjs-web-fonts-disabled = 楔褉褘褎褌褘 小械褑褨胁邪 蟹邪斜邪褉芯薪械薪褘: 薪械屑邪谐褔褘屑邪 褳卸褘胁邪褑褜 褍泻谢邪写蟹械薪褘褟 褕褉褘褎褌褘 PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 孝褝泻褋褌
+pdfjs-editor-color-picker-free-text-input =
+    .title = 袟屑褟薪褨褑褜 泻芯谢械褉 褌褝泻褋褌褍
+pdfjs-editor-free-text-button-label = 孝褝泻褋褌
+pdfjs-editor-ink-button =
+    .title = 袦邪谢褟胁邪褑褜
+pdfjs-editor-color-picker-ink-input =
+    .title = 袟屑褟薪褨褑褜 泻芯谢械褉 屑邪谢褞薪泻邪
+pdfjs-editor-ink-button-label = 袦邪谢褟胁邪褑褜
+pdfjs-editor-stamp-button =
+    .title = 袛邪写邪褑褜 邪斜芯 蟹屑褟薪褨褑褜 胁褘褟胁褘
+pdfjs-editor-stamp-button-label = 袛邪写邪褑褜 邪斜芯 蟹屑褟薪褨褑褜 胁褘褟胁褘
+pdfjs-editor-highlight-button =
+    .title = 袙褘谢褍褔褝薪薪械
+pdfjs-editor-highlight-button-label = 袙褘谢褍褔褝薪薪械
+pdfjs-highlight-floating-button1 =
+    .title = 袩邪写褎邪褉斜邪胁邪褑褜
+    .aria-label = 袩邪写褎邪褉斜邪胁邪褑褜
+pdfjs-highlight-floating-button-label = 袩邪写褎邪褉斜邪胁邪褑褜
+pdfjs-comment-floating-button =
+    .title = 袣邪屑械薪褌邪胁邪褑褜
+    .aria-label = 袣邪屑械薪褌邪胁邪褑褜
+pdfjs-comment-floating-button-label = 袣邪屑械薪褌邪胁邪褑褜
+pdfjs-editor-comment-button =
+    .title = 袣邪屑械薪褌邪褉褘泄
+    .aria-label = 袣邪屑械薪褌邪褉褘泄
+pdfjs-editor-comment-button-label = 袣邪屑械薪褌邪褉褘泄
+pdfjs-editor-signature-button =
+    .title = 袛邪写邪褑褜 锌芯写锌褨褋
+pdfjs-editor-signature-button-label = 袛邪写邪褑褜 锌芯写锌褨褋
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 袪褝写邪泻褌邪褉 胁褘谢褍褔褝薪薪褟褳
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 袪褝写邪泻褌邪褉 屑邪谢褞薪泻邪褳
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 袪褝写邪泻褌邪褉 锌芯写锌褨褋邪褳: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 袪褝写邪泻褌邪褉 胁褘褟褳
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 袙褘写邪谢褨褑褜 屑邪谢褞薪邪泻
+pdfjs-editor-remove-freetext-button =
+    .title = 袙褘写邪谢褨褑褜 褌褝泻褋褌
+pdfjs-editor-remove-stamp-button =
+    .title = 袙褘写邪谢褨褑褜 胁褘褟胁褍
+pdfjs-editor-remove-highlight-button =
+    .title = 袙褘写邪谢褨褑褜 锌邪写褎邪褉斜芯褳泻褍
+pdfjs-editor-remove-signature-button =
+    .title = 袙褘写邪谢褨褑褜 锌芯写锌褨褋
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 袣芯谢械褉
+pdfjs-editor-free-text-size-input = 袩邪屑械褉
+pdfjs-editor-ink-color-input = 袣芯谢械褉
+pdfjs-editor-ink-thickness-input = 孝邪褳褕褔褘薪褟
+pdfjs-editor-ink-opacity-input = 袧械锌褉邪蟹褉褘褋褌邪褋褑褜
+pdfjs-editor-stamp-add-image-button =
+    .title = 袛邪写邪褑褜 胁褘褟胁褍
+pdfjs-editor-stamp-add-image-button-label = 袛邪写邪褑褜 胁褘褟胁褍
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 孝邪褳褕褔褘薪褟
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 袟屑褟薪褟褑褜 褌邪褳褕褔褘薪褞 锌褉褘 胁褘谢褍褔褝薪薪褨 褨薪褕褘褏 褝谢械屑械薪褌邪褳, 邪泻褉邪屑褟 褌褝泻褋褌褍
+pdfjs-editor-add-signature-container =
+    .aria-label = 协谢械屑械薪褌褘 泻褨褉邪胁邪薪薪褟 锌芯写锌褨褋邪屑褨 褨聽蟹邪褏邪胁邪薪褘褟 锌芯写锌褨褋褘
+pdfjs-editor-signature-add-signature-button =
+    .title = 袛邪写邪褑褜 薪芯胁褘 锌芯写锌褨褋
+pdfjs-editor-signature-add-signature-button-label = 袛邪写邪褑褜 薪芯胁褘 锌芯写锌褨褋
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 袟邪褏邪胁邪薪褘 锌芯写锌褨褋: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 孝褝泻褋褌邪胁褘 褉褝写邪泻褌邪褉
+    .default-content = 袩邪褔薪褨褑械 褳胁芯写蟹褨褑褜鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 袣邪屑械薪褌邪褉褘泄
+        [few] 袣邪屑械薪褌邪褉褘褨
+       *[many] 袣邪屑械薪褌邪褉褘褨
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 袟邪泻褉褘褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜
+    .aria-label = 袟邪泻褉褘褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜
+pdfjs-editor-comments-sidebar-close-button-label = 袟邪泻褉褘褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 袘邪褔褘褑械 褕褌芯褋褜褑褨 胁邪褉褌邪械 褳胁邪谐褨? 袙褘谢褍褔褘褑械 褨聽锌邪泻褨薪褜褑械 泻邪屑械薪褌邪褉褘泄.
+pdfjs-editor-comments-sidebar-no-comments-link = 袩邪写褉邪斜褟蟹薪械泄
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 袗谢褜褌褝褉薪邪褌褘褳薪褘 褌褝泻褋褌
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 袟屑褟薪褨褑褜 邪谢褜褌褝褉薪邪褌褘褳薪褘 褌褝泻褋褌
+pdfjs-editor-alt-text-dialog-label = 袙褘斜械褉褘褑械 胁邪褉褘褟薪褌
+pdfjs-editor-alt-text-dialog-description = 袗谢褜褌褝褉薪邪褌褘褳薪褘 褌褝泻褋褌 写邪锌邪屑邪谐邪械, 泻邪谢褨 谢褞写蟹褨 薪械 斜邪褔邪褑褜 胁褘褟胁褍 邪斜芯 泻邪谢褨 褟薪邪 薪械 蟹邪谐褉褍卸邪械褑褑邪.
+pdfjs-editor-alt-text-add-description-label = 袛邪写邪褑褜 邪锌褨褋邪薪薪械
+pdfjs-editor-alt-text-add-description-description = 小褌邪褉邪泄褑械褋褟 褋泻谢邪褋褑褨 1-2 褋泻邪蟹褘, 褟泻褨褟 邪锌褨褋胁邪褞褑褜 锌褉邪写屑械褌, 邪斜褋褌邪薪芯褳泻褍 邪斜芯 写蟹械褟薪薪褨.
+pdfjs-editor-alt-text-mark-decorative-label = 袩邪蟹薪邪褔褘褑褜 褟泻 写褝泻邪褉邪褌褘褳薪褘
+pdfjs-editor-alt-text-mark-decorative-description = 袙褘泻邪褉褘褋褌芯褳胁邪械褑褑邪 写谢褟 写褝泻邪褉邪褌褘褳薪褘褏 胁褘褟胁邪褳, 褌邪泻褨褏 褟泻 褉邪屑泻褨 邪斜芯 胁邪写蟹褟薪褘褟 蟹薪邪泻褨.
+pdfjs-editor-alt-text-cancel-button = 小泻邪褋邪胁邪褑褜
+pdfjs-editor-alt-text-save-button = 袟邪褏邪胁邪褑褜
+pdfjs-editor-alt-text-decorative-tooltip = 袩邪蟹薪邪褔邪薪褘 褟泻 写褝泻邪褉邪褌褘褳薪褘
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 袧邪锌褉褘泻谢邪写, 芦袦邪谢邪写褘 褔邪谢邪胁械泻 褋邪写蟹褨褑褑邪 蟹邪 褋褌芯谢 械褋褑褨禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 袗谢褜褌褝褉薪邪褌褘褳薪褘 褌褝泻褋褌
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 袙械褉褏薪褨 谢械胁褘 泻褍褌 鈥� 蟹屑褟薪褨褑褜 锌邪屑械褉
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 校胁械褉褋械 锌邪褋褟褉褝写蟹褨薪械 鈥� 蟹屑褟薪褨褑褜 锌邪屑械褉
+pdfjs-editor-resizer-top-right =
+    .aria-label = 袙械褉褏薪褨 锌褉邪胁褘 泻褍褌 鈥� 蟹屑褟薪褨褑褜 锌邪屑械褉
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 袩邪褋褟褉褝写蟹褨薪械 褋锌褉邪胁邪 鈥� 蟹屑褟薪褨褑褜 锌邪屑械褉
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 袩褉邪胁褘 薪褨卸薪褨 泻褍褌 鈥� 蟹屑褟薪褨褑褜 锌邪屑械褉
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 袩邪褋褟褉褝写蟹褨薪械 褳薪褨蟹械 鈥� 蟹屑褟薪褨褑褜 锌邪屑械褉
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 袥械胁褘 薪褨卸薪褨 泻褍褌 鈥� 蟹屑褟薪褨褑褜 锌邪屑械褉
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 袩邪褋褟褉褝写蟹褨薪械 蟹谢械胁邪 鈥� 蟹屑褟薪褨褑褜 锌邪屑械褉
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 袣芯谢械褉 锌邪写褎邪褉斜芯褳泻褨
+pdfjs-editor-colorpicker-button =
+    .title = 袟屑褟薪褨褑褜 泻芯谢械褉
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 袙褘斜邪褉 泻芯谢械褉褍
+pdfjs-editor-colorpicker-yellow =
+    .title = 袞芯褳褌褘
+pdfjs-editor-colorpicker-green =
+    .title = 袟褟谢褢薪褘
+pdfjs-editor-colorpicker-blue =
+    .title = 袘谢邪泻褨褌薪褘
+pdfjs-editor-colorpicker-pink =
+    .title = 袪褍卸芯胁褘
+pdfjs-editor-colorpicker-red =
+    .title = 效褘褉胁芯薪褘
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 袩邪泻邪蟹邪褑褜 褍褋械
+pdfjs-editor-highlight-show-all-button =
+    .title = 袩邪泻邪蟹邪褑褜 褍褋械
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 袪褝写邪谐邪胁邪褑褜 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt (邪锌褨褋邪薪薪械 胁褘褟胁褘)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 袛邪写邪褑褜 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt (邪锌褨褋邪薪薪械 胁褘褟胁褘)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 袧邪锌褨褕褘褑械 褋胁邪褢 邪锌褨褋邪薪薪械 褌褍褌鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 袣邪褉芯褌泻邪械 邪锌褨褋邪薪薪械 写谢褟 谢褞写蟹械泄, 褟泻褨褟 薪械 斜邪褔邪褑褜 胁褘褟胁褍, 褑褨 泻邪谢褨 胁褘褟胁邪 薪械 蟹邪谐褉褍卸邪械褑褑邪.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 袚褝褌褘 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt 斜褘褳 褋褌胁芯褉邪薪褘 邪褳褌邪屑邪褌褘褔薪邪 褨 屑芯卸邪 斜褘褑褜 薪械写邪泻谢邪写薪褘屑
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 袛邪胁械写邪褑褑邪 斜芯谢褜褕
+pdfjs-editor-new-alt-text-create-automatically-button-label = 小褌胁邪褉邪褑褜 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt 邪褳褌邪屑邪褌褘褔薪邪
+pdfjs-editor-new-alt-text-not-now-button = 袧械 蟹邪褉邪蟹
+pdfjs-editor-new-alt-text-error-title = 袧械 褳写邪谢芯褋褟 邪褳褌邪屑邪褌褘褔薪邪 褋褌胁邪褉褘褑褜 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt
+pdfjs-editor-new-alt-text-error-description = 袣邪谢褨 谢邪褋泻邪, 薪邪锌褨褕褘褑械 褳谢邪褋薪褘 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt 邪斜芯 锌邪褳褌邪褉褘褑械 褋锌褉芯斜褍 锌邪蟹薪械泄.
+pdfjs-editor-new-alt-text-error-close-button = 袟邪泻褉褘褑褜
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 小褑褟谐胁邪薪薪械 屑邪写褝谢褨 楔袉 写谢褟 褌褝泻褋褌褍 写谢褟 邪褌褉褘斜褍褌邪 alt ({ $downloadedSize } 蟹 { $totalSize } 袦袘)
+    .aria-valuetext = 小褑褟谐胁邪薪薪械 屑邪写褝谢褨 楔袉 写谢褟 褌褝泻褋褌褍 写谢褟 邪褌褉褘斜褍褌邪 alt ({ $downloadedSize } 蟹 { $totalSize } 袦袘)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 孝褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt 写邪写邪写蟹械薪褘
+pdfjs-editor-new-alt-text-added-button-label = 孝褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt 写邪写邪写蟹械薪褘
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 袗写褋褍褌薪褨褔邪械 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt
+pdfjs-editor-new-alt-text-missing-button-label = 袗写褋褍褌薪褨褔邪械 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 袙芯写谐褍泻 薪邪 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt
+pdfjs-editor-new-alt-text-to-review-button-label = 袙芯写谐褍泻 薪邪 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 小褌胁芯褉邪薪褘 邪褳褌邪屑邪褌褘褔薪邪: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 袧邪谢邪写褘 邪谢褜褌褝褉薪邪褌褘褳薪邪谐邪 褌褝泻褋褌褍 写谢褟 胁褘褟胁褘
+pdfjs-image-alt-text-settings-button-label = 袧邪谢邪写褘 邪谢褜褌褝褉薪邪褌褘褳薪邪谐邪 褌褝泻褋褌褍 写谢褟 胁褘褟胁褘
+pdfjs-editor-alt-text-settings-dialog-label = 袧邪谢邪写褘 邪谢褜褌褝褉薪邪褌褘褳薪邪谐邪 褌褝泻褋褌褍 写谢褟 胁褘褟胁褘
+pdfjs-editor-alt-text-settings-automatic-title = 袗褳褌邪屑邪褌褘褔薪褘 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt
+pdfjs-editor-alt-text-settings-create-model-button-label = 小褌胁邪褉邪褑褜 褌褝泻褋褌 写谢褟 邪褌褉褘斜褍褌邪 alt 邪褳褌邪屑邪褌褘褔薪邪
+pdfjs-editor-alt-text-settings-create-model-description = 袩褉邪锌邪薪褍械 邪锌褨褋邪薪薪褨, 泻邪斜 写邪锌邪屑邪谐褔褘 谢褞写蟹褟屑, 褟泻褨褟 薪械 斜邪褔邪褑褜 胁褘褟胁褍, 褑褨 泻邪谢褨 胁褘褟胁邪 薪械 蟹邪谐褉褍卸邪械褑褑邪.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 袦邪写褝谢褜 楔袉 写谢褟 褌褝泻褋褌褍 写谢褟 邪褌褉褘斜褍褌邪 alt ({ $totalSize } 袦袘)
+pdfjs-editor-alt-text-settings-ai-model-description = 袩褉邪褑褍械 谢邪泻邪谢褜薪邪 薪邪 胁邪褕邪泄 锌褉褘谢邪写蟹械, 褌邪屑褍 胁邪褕褘 蟹胁械褋褌泻褨 蟹邪褋褌邪褞褑褑邪 锌褉褘胁邪褌薪褘屑褨. 袩邪褌褉邪斜褍械褑褑邪 写谢褟 邪褳褌邪屑邪褌褘褔薪邪谐邪 邪谢褜褌褝褉薪邪褌褘褳薪邪谐邪 褌褝泻褋褌褍.
+pdfjs-editor-alt-text-settings-delete-model-button = 袙褘写邪谢褨褑褜
+pdfjs-editor-alt-text-settings-download-model-button = 小褑褟谐薪褍褑褜
+pdfjs-editor-alt-text-settings-downloading-model-button = 小褑褟谐胁邪薪薪械鈥�
+pdfjs-editor-alt-text-settings-editor-title = 袪褝写邪泻褌邪褉 褌褝泻褋褌褍 写谢褟 邪褌褉褘斜褍褌邪 alt
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 袗写褉邪蟹褍 锌邪泻邪蟹胁邪褑褜 褉褝写邪泻褌邪褉 褌褝泻褋褌褍 写谢褟 邪褌褉褘斜褍褌邪 alt 锌褉褘 写邪写邪薪薪褨 胁褘褟胁褘
+pdfjs-editor-alt-text-settings-show-dialog-description = 袛邪锌邪屑邪谐邪械 锌械褉邪泻邪薪邪褑褑邪, 褕褌芯 褳褋械 胁邪褕褘 胁褘褟胁褘 屑邪褞褑褜 邪谢褜褌褝褉薪邪褌褘褳薪褘 褌褝泻褋褌.
+pdfjs-editor-alt-text-settings-close-button = 袟邪泻褉褘褑褜
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 袙褘谢褍褔褝薪薪械 写邪写邪写蟹械薪邪
+pdfjs-editor-freetext-added-alert = 孝褝泻褋褌 写邪写邪写蟹械薪褘
+pdfjs-editor-ink-added-alert = 袦邪谢褞薪邪泻 写邪写邪写蟹械薪褘
+pdfjs-editor-stamp-added-alert = 袙褘褟胁邪 写邪写邪写蟹械薪邪
+pdfjs-editor-signature-added-alert = 袩芯写锌褨褋 写邪写邪写蟹械薪褘
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 袩邪写褋胁褟褌谢械薪薪械 胁褘写邪谢械薪邪
+pdfjs-editor-undo-bar-message-freetext = 孝褝泻褋褌 胁褘写邪谢械薪褘
+pdfjs-editor-undo-bar-message-ink = 袦邪谢褞薪邪泻 胁褘写邪谢械薪褘
+pdfjs-editor-undo-bar-message-stamp = 袙褨写邪褉褘褋 胁褘写邪谢械薪褘
+pdfjs-editor-undo-bar-message-signature = 袩芯写锌褨褋 胁褘写邪谢械薪褘
+pdfjs-editor-undo-bar-message-comment = 袣邪屑械薪褌邪褉褘泄 胁褘写邪谢械薪褘
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 邪薪邪褌邪褑褘褟 胁褘写邪谢械薪邪
+        [few] { $count } 邪薪邪褌邪褑褘褨 胁褘写邪谢械薪邪
+       *[many] { $count } 邪薪邪褌邪褑褘泄 胁褘写邪谢械薪邪
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 袗写屑褟薪褨褑褜
+pdfjs-editor-undo-bar-undo-button-label = 袗写屑褟薪褨褑褜
+pdfjs-editor-undo-bar-close-button =
+    .title = 袟邪泻褉褘褑褜
+pdfjs-editor-undo-bar-close-button-label = 袟邪泻褉褘褑褜
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 袚褝褌褘 褉褝卸褘屑 写邪蟹胁邪谢褟械 泻邪褉褘褋褌邪谢褜薪褨泻褍 褋褌胁邪褉邪褑褜 锌芯写锌褨褋 写谢褟 写邪写邪薪薪褟 褳聽写邪泻褍屑械薪褌 PDF. 袣邪褉褘褋褌邪谢褜薪褨泻 屑芯卸邪 褉褝写邪谐邪胁邪褑褜 褨屑褟 (褟泻芯械 褌邪泻褋邪屑邪 褋谢褍卸褘褑褜 邪谢褜褌褝褉薪邪褌褘褳薪褘屑 褌褝泻褋褌邪屑) 褨聽锌褉褘 卸邪写邪薪薪褨 蟹邪褏邪胁邪褑褜 锌芯写锌褨褋 写谢褟 锌邪褳褌芯褉薪邪谐邪 胁褘泻邪褉褘褋褌邪薪薪褟.
+pdfjs-editor-add-signature-dialog-title = 袛邪写邪褑褜 锌芯写锌褨褋
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 校胁芯写
+    .title = 校胁芯写
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 袦邪谢褟胁邪褑褜
+    .title = 袦邪谢褟胁邪褑褜
+pdfjs-editor-add-signature-image-button = 袙褘褟胁邪
+    .title = 袙褘褟胁邪
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 校胁褟写蟹褨褑械 褋胁芯泄 锌芯写锌褨褋
+    .placeholder = 校胁褟写蟹褨褑械 褋胁芯泄 锌芯写锌褨褋
+pdfjs-editor-add-signature-draw-placeholder = 袧邪屑邪谢褞泄褑械 褋胁芯泄 锌芯写锌褨褋
+pdfjs-editor-add-signature-draw-thickness-range-label = 孝邪褳褕褔褘薪褟
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 孝邪褳褕褔褘薪褟 屑邪谢褞薪泻邪: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 袩械褉邪褑褟谐薪褍褑褜 褎邪泄谢 褋褞写褘, 泻邪斜 蟹邪谐褉褍蟹褨褑褜
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 袗斜芯 锌褉邪谐谢褟写邪泄褑械 褎邪泄谢褘 屑邪谢褞薪泻邪褳
+       *[other] 袗斜芯 锌褉邪谐谢褟写邪泄褑械 褎邪泄谢褘 屑邪谢褞薪泻邪褳
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 袗锌褨褋邪薪薪械 (邪谢褜褌褝褉薪邪褌褘褳薪褘 褌褝泻褋褌)
+pdfjs-editor-add-signature-description-input =
+    .title = 袗锌褨褋邪薪薪械 (邪谢褜褌褝褉薪邪褌褘褳薪褘 褌褝泻褋褌)
+pdfjs-editor-add-signature-description-default-when-drawing = 袩芯写锌褨褋
+pdfjs-editor-add-signature-clear-button-label = 袙褘写邪谢褨褑褜 锌芯写锌褨褋
+pdfjs-editor-add-signature-clear-button =
+    .title = 袙褘写邪谢褨褑褜 锌芯写锌褨褋
+pdfjs-editor-add-signature-save-checkbox = 袟邪褏邪胁邪褑褜 锌芯写锌褨褋
+pdfjs-editor-add-signature-save-warning-message = 袙褘 写邪褋褟谐薪褍谢褨 谢褨屑褨褌褍 褳 5 蟹邪褏邪胁邪薪褘褏 锌芯写锌褨褋邪褳. 袙褘写邪谢褨褑械 邪写蟹褨薪, 泻邪斜 蟹邪褏邪胁邪褑褜 褨薪褕褘.
+pdfjs-editor-add-signature-image-upload-error-title = 袧械 褳写邪谢芯褋褟 蟹邪谐褉褍蟹褨褑褜 胁褘褟胁褍
+pdfjs-editor-add-signature-image-upload-error-description = 袩褉邪胁械褉褑械 锌邪写泻谢褞褔褝薪薪械 写邪 褋械褌泻褨 褑褨 锌邪褋锌褉邪斜褍泄褑械 褨薪褕褍褞 胁褘褟胁褍.
+pdfjs-editor-add-signature-image-no-data-error-title = 袧械 褳写邪谢芯褋褟 锌械褉邪褳褌胁邪褉褘褑褜 谐褝褌褍 胁褘褟胁褍 褳聽锌芯写锌褨褋
+pdfjs-editor-add-signature-image-no-data-error-description = 袣邪谢褨 谢邪褋泻邪, 锌邪褋锌褉邪斜褍泄褑械 蟹邪褑褟谐薪褍褑褜 褨薪褕褍褞 胁褘褟胁褍.
+pdfjs-editor-add-signature-error-close-button = 袟邪泻褉褘褑褜
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 小泻邪褋邪胁邪褑褜
+pdfjs-editor-add-signature-add-button = 袛邪写邪褑褜
+pdfjs-editor-edit-signature-update-button = 袗斜薪邪胁褨褑褜
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 袟屑褟薪褨褑褜 泻邪屑械薪褌邪褉褘泄
+pdfjs-editor-edit-comment-popup-button =
+    .title = 袟屑褟薪褨褑褜 泻邪屑械薪褌邪褉褘泄
+pdfjs-editor-delete-comment-popup-button-label = 袙褘写邪谢褨褑褜 泻邪屑械薪褌邪褉褘泄
+pdfjs-editor-delete-comment-popup-button =
+    .title = 袙褘写邪谢褨褑褜 泻邪屑械薪褌邪褉褘泄
+pdfjs-show-comment-button =
+    .title = 袩邪泻邪蟹邪褑褜 泻邪屑械薪褌邪褉褘泄
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 袟屑褟薪褨褑褜 泻邪屑械薪褌邪褉褘泄
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 袗斜薪邪胁褨褑褜
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 袛邪写邪褑褜 泻邪屑械薪褌邪褉褘泄
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 袛邪写邪褑褜
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 袩邪褔薪褨褑械 薪邪斜芯褉 褌褝泻褋褌褍鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 小泻邪褋邪胁邪褑褜
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 袛邪写邪褑褜 泻邪屑械薪褌邪褉褘泄
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 袩邪泻邪蟹邪褑褜/褋褏邪胁邪褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜 (写邪泻褍屑械薪褌 屑邪械 屑褨薪褨褟褑褞褉褘/蟹屑械褋褌/写邪谢褍褔褝薪薪褨/锌谢邪褋褌褘)
+pdfjs-toggle-views-manager-button1-label = 袣褨褉邪胁邪薪薪械 褋褌邪褉芯薪泻邪屑褨
+pdfjs-views-manager-sidebar =
+    .aria-label = 袘邪泻邪胁邪褟 锌邪薪褝谢褜
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 袟屑械薪邪 锌邪屑械褉褍 斜邪泻邪胁芯泄 锌邪薪褝谢褨
+pdfjs-views-manager-view-selector-button =
+    .title = 袙褘谐谢褟写
+pdfjs-views-manager-view-selector-button-label = 袙褘谐谢褟写
+pdfjs-views-manager-pages-title = 小褌邪褉芯薪泻褨
+pdfjs-views-manager-outlines-title1 = 小褌褉褍泻褌褍褉邪 写邪泻褍屑械薪褌邪
+    .title = 小褌褉褍泻褌褍褉邪 写邪泻褍屑械薪褌邪 (薪邪褑褨褋薪褨褑械 写胁芯泄褔褘, 泻邪斜 褉邪蟹谐邪褉薪褍褑褜/蟹谐邪褉薪褍褑褜 褍褋械 褝谢械屑械薪褌褘)
+pdfjs-views-manager-attachments-title = 袛邪谢褍褔褝薪薪褨
+pdfjs-views-manager-layers-title1 = 袩谢邪褋褌褘
+    .title = 袩谢邪褋褌褘 (薪邪褑褨褋薪褨褑械 写胁芯泄褔褘 泻邪斜 褋泻褨薪褍褑褜 褍聽锌褉邪写胁褘蟹薪邪褔邪薪褘 褋褌邪薪)
+pdfjs-views-manager-pages-option-label = 小褌邪褉芯薪泻褨
+pdfjs-views-manager-outlines-option-label = 小褌褉褍泻褌褍褉邪 写邪泻褍屑械薪褌邪
+pdfjs-views-manager-attachments-option-label = 袛邪谢褍褔褝薪薪褨
+pdfjs-views-manager-layers-option-label = 袩谢邪褋褌褘
+pdfjs-views-manager-add-file-button =
+    .title = 袛邪写邪褑褜 褎邪泄谢
+pdfjs-views-manager-add-file-button-label = 袛邪写邪褑褜 褎邪泄谢
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] 袙褘谢褍褔邪薪邪 { $count }
+        [few] 袙褘谢褍褔邪薪褘 { $count }
+       *[many] 袙褘谢褍褔邪薪邪 { $count }
+    }
+pdfjs-views-manager-pages-status-none-action-label = 袙褘斜褉邪褑褜 褋褌邪褉芯薪泻褨
+pdfjs-views-manager-pages-status-action-button-label = 袣褨褉邪胁邪褑褜
+pdfjs-views-manager-pages-status-copy-button-label = 袣邪锌褨褟胁邪褑褜
+pdfjs-views-manager-pages-status-cut-button-label = 袙褘褉邪蟹邪褑褜
+pdfjs-views-manager-pages-status-delete-button-label = 袙褘写邪谢褨褑褜
+pdfjs-views-manager-pages-status-export-selected-button-label = 协泻褋锌邪褉褌邪胁邪褑褜 胁褘斜褉邪薪邪械鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 袙褘褉邪蟹邪薪邪 { $count } 褋褌邪褉芯薪泻邪
+        [few] 袙褘褉邪蟹邪薪邪 { $count } 褋褌邪褉芯薪泻褨
+       *[many] 袙褘褉邪蟹邪薪邪 { $count } 褋褌邪褉芯薪邪泻
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 小泻邪锌褨褉邪胁邪薪邪 { $count } 褋褌邪褉芯薪泻邪
+        [few] 小泻邪锌褨褉邪胁邪薪邪 { $count } 褋褌邪褉芯薪泻褨
+       *[many] 小泻邪锌褨褉邪胁邪薪邪 { $count } 褋褌邪褉芯薪邪泻
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 袙褘写邪谢械薪邪 { $count } 褋褌邪褉芯薪泻邪
+        [few] 袙褘写邪谢械薪邪 { $count } 褋褌邪褉芯薪泻褨
+       *[many] 袙褘写邪谢械薪邪 { $count } 褋褌邪褉芯薪邪泻
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 袪褘褏褌褍械褑褑邪 胁邪褕 褎邪泄谢鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 袟邪褑褟谐胁邪械褑褑邪 褎邪泄谢鈥�
+pdfjs-views-manager-status-warning-cut-label = 袧械 褳写邪谢芯褋褟 胁褘褉邪蟹邪褑褜. 袗斜薪邪胁褨褑械 褋褌邪褉芯薪泻褍 褨聽锌邪褋锌褉邪斜褍泄褑械 蟹薪芯褳.
+pdfjs-views-manager-status-warning-copy-label = 袧械 褳写邪谢芯褋褟 褋泻邪锌褨褟胁邪褑褜. 袗斜薪邪胁褨褑械 褋褌邪褉芯薪泻褍 褨聽锌邪褋锌褉邪斜褍泄褑械 蟹薪芯褳.
+pdfjs-views-manager-status-warning-delete-label = 袧械 褳写邪谢芯褋褟 胁褘写邪谢褨褑褜. 袗斜薪邪胁褨褑械 褋褌邪褉芯薪泻褍 褨聽锌邪褋锌褉邪斜褍泄褑械 蟹薪芯褳.
+pdfjs-views-manager-status-warning-save-label = 袧械 褳写邪谢芯褋褟 蟹邪褏邪胁邪褑褜. 袗斜薪邪胁褨褑械 褋褌邪褉芯薪泻褍 褨聽锌邪褋锌褉邪斜褍泄褑械 蟹薪芯褳.
+pdfjs-views-manager-status-undo-button-label = 袗写屑褟薪褨褑褜
+pdfjs-views-manager-status-done-button-label = 袚邪褌芯胁邪
+pdfjs-views-manager-status-close-button =
+    .title = 袟邪泻褉褘褑褜
+pdfjs-views-manager-status-close-button-label = 袟邪泻褉褘褑褜
+pdfjs-views-manager-paste-button-label = 校褋褌邪胁褨褑褜
+pdfjs-views-manager-paste-button-before =
+    .title = 校褋褌邪胁褨褑褜 锌械褉邪写 锌械褉褕邪泄 褋褌邪褉芯薪泻邪泄
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 校褋褌邪胁褨褑褜 锌邪褋谢褟 褋褌邪褉芯薪泻褨 { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 袧袨袙袗袝
+pdfjs-views-manager-waiting-for-file = 袟邪褑褟谐胁邪械褑褑邪 褎邪泄谢鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 袣褨褉邪胁邪薪薪械 褋褌邪褉芯薪泻邪屑褨
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 袙褘写邪谢褨褑褜 蟹邪褏邪胁邪薪褘 锌芯写锌褨褋
+pdfjs-editor-delete-signature-button-label1 = 袙褘写邪谢褨褑褜 蟹邪褏邪胁邪薪褘 锌芯写锌褨褋
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 袪褝写邪谐邪胁邪褑褜 邪锌褨褋邪薪薪械
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 袪褝写邪谐邪胁邪褑褜 邪锌褨褋邪薪薪械
diff --git a/public/pdfjs/web/locale/bg/viewer.ftl b/public/pdfjs/web/locale/bg/viewer.ftl
new file mode 100644
index 0000000..e6c3106
--- /dev/null
+++ b/public/pdfjs/web/locale/bg/viewer.ftl
@@ -0,0 +1,392 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 袩褉械写懈褕薪邪 褋褌褉邪薪懈褑邪
+pdfjs-previous-button-label = 袩褉械写懈褕薪邪
+pdfjs-next-button =
+    .title = 小谢械写胁邪褖邪 褋褌褉邪薪懈褑邪
+pdfjs-next-button-label = 小谢械写胁邪褖邪
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 小褌褉邪薪懈褑邪
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 芯褌 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 芯褌 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 袧邪屑邪谢褟胁邪薪械
+pdfjs-zoom-out-button-label = 袧邪屑邪谢褟胁邪薪械
+pdfjs-zoom-in-button =
+    .title = 校胁械谢懈褔邪胁邪薪械
+pdfjs-zoom-in-button-label = 校胁械谢懈褔邪胁邪薪械
+pdfjs-zoom-select =
+    .title = 袦邪褖邪斜懈褉邪薪械
+pdfjs-presentation-mode-button =
+    .title = 袩褉械胁泻谢褞褔胁邪薪械 泻褗屑 褉械卸懈屑 薪邪 锌褉械写褋褌邪胁褟薪械
+pdfjs-presentation-mode-button-label = 袪械卸懈屑 薪邪 锌褉械写褋褌邪胁褟薪械
+pdfjs-open-file-button =
+    .title = 袨褌胁邪褉褟薪械 薪邪 褎邪泄谢
+pdfjs-open-file-button-label = 袨褌胁邪褉褟薪械
+pdfjs-print-button =
+    .title = 袨褌锌械褔邪褌胁邪薪械
+pdfjs-print-button-label = 袨褌锌械褔邪褌胁邪薪械
+pdfjs-save-button =
+    .title = 袟邪锌邪蟹胁邪薪械
+pdfjs-save-button-label = 袟邪锌邪蟹胁邪薪械
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 袠蟹褌械谐谢褟薪械
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 袠蟹褌械谐谢褟薪械
+pdfjs-bookmark-button =
+    .title = 孝械泻褍褖邪 褋褌褉邪薪懈褑邪 (锌褉械谐谢械写 薪邪 邪写褉械褋邪 薪邪 褋褌褉邪薪懈褑邪褌邪)
+pdfjs-bookmark-button-label = 孝械泻褍褖邪 褋褌褉邪薪懈褑邪
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 袠薪褋褌褉褍屑械薪褌懈
+pdfjs-tools-button-label = 袠薪褋褌褉褍屑械薪褌懈
+pdfjs-first-page-button =
+    .title = 袣褗屑 锌褗褉胁邪褌邪 褋褌褉邪薪懈褑邪
+pdfjs-first-page-button-label = 袣褗屑 锌褗褉胁邪褌邪 褋褌褉邪薪懈褑邪
+pdfjs-last-page-button =
+    .title = 袣褗屑 锌芯褋谢械写薪邪褌邪 褋褌褉邪薪懈褑邪
+pdfjs-last-page-button-label = 袣褗屑 锌芯褋谢械写薪邪褌邪 褋褌褉邪薪懈褑邪
+pdfjs-page-rotate-cw-button =
+    .title = 袟邪胁褗褉褌邪薪械 锌芯 褔邪褋. 褋褌褉械谢泻邪
+pdfjs-page-rotate-cw-button-label = 袟邪胁褗褉褌邪薪械 锌芯 褔邪褋芯胁薪懈泻芯胁邪褌邪 褋褌褉械谢泻邪
+pdfjs-page-rotate-ccw-button =
+    .title = 袟邪胁褗褉褌邪薪械 芯斜褉邪褌薪芯 薪邪 褔邪褋. 褋褌褉械谢泻邪
+pdfjs-page-rotate-ccw-button-label = 袟邪胁褗褉褌邪薪械 芯斜褉邪褌薪芯 薪邪 褔邪褋芯胁薪懈泻芯胁邪褌邪 褋褌褉械谢泻邪
+pdfjs-cursor-text-select-tool-button =
+    .title = 袙泻谢褞褔胁邪薪械 薪邪 懈薪褋褌褉褍屑械薪褌邪 蟹邪 懈蟹斜芯褉 薪邪 褌械泻褋褌
+pdfjs-cursor-text-select-tool-button-label = 袠薪褋褌褉褍屑械薪褌 蟹邪 懈蟹斜芯褉 薪邪 褌械泻褋褌
+pdfjs-cursor-hand-tool-button =
+    .title = 袙泻谢褞褔胁邪薪械 薪邪 懈薪褋褌褉褍屑械薪褌邪 褉褗泻邪
+pdfjs-cursor-hand-tool-button-label = 袠薪褋褌褉褍屑械薪褌 褉褗泻邪
+pdfjs-scroll-page-button =
+    .title = 袠蟹锌芯谢蟹胁邪薪械 薪邪 锌谢褗蟹谐邪薪械 薪邪 褋褌褉邪薪懈褑懈
+pdfjs-scroll-page-button-label = 袩谢褗蟹谐邪薪械 薪邪 褋褌褉邪薪懈褑懈
+pdfjs-scroll-vertical-button =
+    .title = 袠蟹锌芯谢蟹胁邪薪械 薪邪 胁械褉褌懈泻邪谢薪芯 锌谢褗蟹谐邪薪械
+pdfjs-scroll-vertical-button-label = 袙械褉褌懈泻邪谢薪芯 锌谢褗蟹谐邪薪械
+pdfjs-scroll-horizontal-button =
+    .title = 袠蟹锌芯谢蟹胁邪薪械 薪邪 褏芯褉懈蟹芯薪褌邪谢薪芯
+pdfjs-scroll-horizontal-button-label = 啸芯褉懈蟹芯薪褌邪谢薪芯 锌谢褗蟹谐邪薪械
+pdfjs-scroll-wrapped-button =
+    .title = 袠蟹锌芯谢蟹胁邪薪械 薪邪 屑邪褖邪斜懈褉褍械屑芯 锌谢褗蟹谐邪薪械
+pdfjs-scroll-wrapped-button-label = 袦邪褖邪斜懈褉褍械屑芯 锌谢褗蟹谐邪薪械
+pdfjs-spread-none-button =
+    .title = 袪械卸懈屑褗褌 薪邪 褋写胁芯褟胁邪薪械 械 懈蟹泻谢褞褔械薪
+pdfjs-spread-none-button-label = 袘械蟹 褋写胁芯褟胁邪薪械
+pdfjs-spread-odd-button =
+    .title = 小写胁芯褟胁邪薪械, 蟹邪锌芯褔胁邪泄泻懈 芯褌 薪械褔械褌薪懈褌械 褋褌褉邪薪懈褑懈
+pdfjs-spread-odd-button-label = 袧械褔械褌薪懈褌械 芯褌谢褟胁芯
+pdfjs-spread-even-button =
+    .title = 小写胁芯褟胁邪薪械, 蟹邪锌芯褔胁邪泄泻懈 芯褌 褔械褌薪懈褌械 褋褌褉邪薪懈褑懈
+pdfjs-spread-even-button-label = 效械褌薪懈褌械 芯褌谢褟胁芯
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 小胁芯泄褋褌胁邪 薪邪 写芯泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-button-label = 小胁芯泄褋褌胁邪 薪邪 写芯泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-file-name = 袠屑械 薪邪 褎邪泄谢:
+pdfjs-document-properties-file-size = 袚芯谢械屑懈薪邪 薪邪 褎邪泄谢:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 袣袘 ({ $b } 斜邪泄褌邪)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 袦袘 ({ $b } 斜邪泄褌邪)
+pdfjs-document-properties-title = 袟邪谐谢邪胁懈械:
+pdfjs-document-properties-author = 袗胁褌芯褉:
+pdfjs-document-properties-subject = 孝械屑邪:
+pdfjs-document-properties-keywords = 袣谢褞褔芯胁懈 写褍屑懈:
+pdfjs-document-properties-creation-date = 袛邪褌邪 薪邪 褋褗蟹写邪胁邪薪械:
+pdfjs-document-properties-modification-date = 袛邪褌邪 薪邪 锌褉芯屑褟薪邪:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 小褗蟹写邪褌械谢:
+pdfjs-document-properties-producer = PDF 锌褉芯懈蟹胁械写械薪 芯褌:
+pdfjs-document-properties-version = 袠蟹写邪薪懈械 薪邪 PDF:
+pdfjs-document-properties-page-count = 袘褉芯泄 褋褌褉邪薪懈褑懈:
+pdfjs-document-properties-page-size = 袪邪蟹屑械褉 薪邪 褋褌褉邪薪懈褑邪褌邪:
+pdfjs-document-properties-page-size-unit-inches = 懈薪褔
+pdfjs-document-properties-page-size-unit-millimeters = 屑屑
+pdfjs-document-properties-page-size-orientation-portrait = 锌芯褉褌褉械褌
+pdfjs-document-properties-page-size-orientation-landscape = 锌械泄蟹邪卸
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = 袩褉邪胁薪懈 胁褗锌褉芯褋懈
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 袘褗褉蟹 锌褉械谐谢械写:
+pdfjs-document-properties-linearized-yes = 袛邪
+pdfjs-document-properties-linearized-no = 袧械
+pdfjs-document-properties-close-button = 袟邪褌胁邪褉褟薪械
+
+## Print
+
+pdfjs-print-progress-message = 袩芯写谐芯褌胁褟薪械 薪邪 写芯泻褍屑械薪褌邪 蟹邪 芯褌锌械褔邪褌胁邪薪械鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 袨褌泻邪蟹
+pdfjs-printing-not-supported = 袙薪懈屑邪薪懈械: 孝芯蟹懈 褔械褌械褑 薪褟屑邪 锌褗谢薪邪 锌芯写写褉褗卸泻邪 薪邪 芯褌锌械褔邪褌胁邪薪械.
+pdfjs-printing-not-ready = 袙薪懈屑邪薪懈械: 孝芯蟹懈 PDF 褎邪泄谢 薪械 械 薪邪锌褗谢薪芯 蟹邪褉械写械薪 蟹邪 锌械褔邪褌.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 袩褉械胁泻谢褞褔胁邪薪械 薪邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+pdfjs-toggle-sidebar-notification-button =
+    .title = 袩褉械胁泻谢褞褔胁邪薪械 薪邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪 (写芯泻褍屑械薪褌褗褌 懈屑邪 褋褌褉褍泻褌褍褉邪/锌褉懈泻邪褔械薪懈 褎邪泄谢芯胁械/褋谢芯械胁械)
+pdfjs-toggle-sidebar-button-label = 袩褉械胁泻谢褞褔胁邪薪械 薪邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+pdfjs-document-outline-button =
+    .title = 袩芯泻邪蟹胁邪薪械 薪邪 褋褌褉褍泻褌褍褉邪褌邪 薪邪 写芯泻褍屑械薪褌邪 (写胁褍泻褉邪褌薪芯 褖褉邪泻胁邪薪械 蟹邪 褋胁懈胁邪薪械/褉邪蟹谐褗胁邪薪械 薪邪 胁褋懈褔泻芯)
+pdfjs-document-outline-button-label = 小褌褉褍泻褌褍褉邪 薪邪 写芯泻褍屑械薪褌邪
+pdfjs-attachments-button =
+    .title = 袩芯泻邪蟹胁邪薪械 薪邪 锌褉懈褌褍褉泻懈褌械
+pdfjs-attachments-button-label = 袩褉懈褌褍褉泻懈
+pdfjs-layers-button =
+    .title = 袩芯泻邪蟹胁邪薪械 薪邪 褋谢芯械胁械褌械 (写胁褍泻褉邪褌薪芯 褖褉邪泻胁邪薪械 蟹邪 胁褗蟹褋褌邪薪芯胁褟胁邪薪械 薪邪 胁褋懈褔泻懈 褋谢芯械胁械 泻褗屑 褋褗褋褌芯褟薪懈械褌芯 锌芯 锌芯写褉邪蟹斜懈褉邪薪械)
+pdfjs-layers-button-label = 小谢芯械胁械
+pdfjs-thumbs-button =
+    .title = 袩芯泻邪蟹胁邪薪械 薪邪 屑懈薪懈邪褌褞褉懈褌械
+pdfjs-thumbs-button-label = 袦懈薪懈邪褌褞褉懈
+pdfjs-current-outline-item-button =
+    .title = 袧邪屑懈褉邪薪械 薪邪 褌械泻褍褖懈褟 械谢械屑械薪褌 芯褌 褋褌褉褍泻褌褍褉邪褌邪
+pdfjs-current-outline-item-button-label = 孝械泻褍褖 械谢械屑械薪褌 芯褌 褋褌褉褍泻褌褍褉邪褌邪
+pdfjs-findbar-button =
+    .title = 袧邪屑懈褉邪薪械 胁 写芯泻褍屑械薪褌邪
+pdfjs-findbar-button-label = 孝褗褉褋械薪械
+pdfjs-additional-layers = 袛芯锌褗谢薪懈褌械谢薪懈 褋谢芯械胁械
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 小褌褉邪薪懈褑邪 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 袦懈薪懈邪褌褞褉邪 薪邪 褋褌褉邪薪懈褑邪 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 孝褗褉褋械薪械
+    .placeholder = 孝褗褉褋械薪械 胁 写芯泻褍屑械薪褌邪鈥�
+pdfjs-find-previous-button =
+    .title = 袧邪屑懈褉邪薪械 薪邪 锌褉械写懈褕薪芯 褋褗胁锌邪写械薪懈械 薪邪 褎褉邪蟹邪褌邪
+pdfjs-find-previous-button-label = 袩褉械写懈褕薪邪
+pdfjs-find-next-button =
+    .title = 袧邪屑懈褉邪薪械 薪邪 褋谢械写胁邪褖芯 褋褗胁锌邪写械薪懈械 薪邪 褎褉邪蟹邪褌邪
+pdfjs-find-next-button-label = 小谢械写胁邪褖邪
+pdfjs-find-highlight-checkbox = 袨褌泻褉芯褟胁邪薪械 薪邪 胁褋懈褔泻懈
+pdfjs-find-match-case-checkbox-label = 小褗胁锌邪写械薪懈械 薪邪 褉械谐懈褋褌褗褉邪
+pdfjs-find-match-diacritics-checkbox-label = 袘械蟹 锌褉芯懈蟹胁芯写薪懈 斜褍泻胁懈
+pdfjs-find-entire-word-checkbox-label = 笑械谢懈 写褍屑懈
+pdfjs-find-reached-top = 袛芯褋褌懈谐薪邪褌芯 械 薪邪褔邪谢芯褌芯 薪邪 写芯泻褍屑械薪褌邪, 锌褉芯写褗谢卸邪胁邪薪械 芯褌 泻褉邪褟
+pdfjs-find-reached-bottom = 袛芯褋褌懈谐薪邪褌 械 泻褉邪褟褌 薪邪 写芯泻褍屑械薪褌邪, 锌褉芯写褗谢卸邪胁邪薪械 芯褌 薪邪褔邪谢芯褌芯
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 芯褌 { $total } 褋褗胁锌邪写械薪懈械
+       *[other] { $current } 芯褌 { $total } 褋褗胁锌邪写械薪懈褟
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 袩芯胁械褔械 芯褌 { $limit } 褋褗胁锌邪写械薪懈械
+       *[other] 袩芯胁械褔械 芯褌 { $limit } 褋褗胁锌邪写械薪懈褟
+    }
+pdfjs-find-not-found = 肖褉邪蟹邪褌邪 薪械 械 薪邪屑械褉械薪邪
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 楔懈褉懈薪邪 薪邪 褋褌褉邪薪懈褑邪褌邪
+pdfjs-page-scale-fit = 袙屑械褋褌胁邪薪械 胁 褋褌褉邪薪懈褑邪褌邪
+pdfjs-page-scale-auto = 袗胁褌芯屑邪褌懈褔薪芯 屑邪褖邪斜懈褉邪薪械
+pdfjs-page-scale-actual = 袛械泄褋褌胁懈褌械谢械薪 褉邪蟹屑械褉
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 小褌褉邪薪懈褑邪 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 袩芯谢褍褔懈 褋械 谐褉械褕泻邪 锌褉懈 蟹邪褉械卸写邪薪械 薪邪 PDF-邪.
+pdfjs-invalid-file-error = 袧械胁邪谢懈写械薪 懈谢懈 锌芯胁褉械写械薪 PDF 褎邪泄谢.
+pdfjs-missing-file-error = 袥懈锌褋胁邪褖 PDF 褎邪泄谢.
+pdfjs-unexpected-response-error = 袧械芯褔邪泻胁邪薪 芯褌谐芯胁芯褉 芯褌 褋褗褉胁褗褉邪.
+pdfjs-rendering-error = 袚褉械褕泻邪 锌褉懈 懈蟹褔械褉褌邪胁邪薪械 薪邪 褋褌褉邪薪懈褑邪褌邪.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [袗薪芯褌邪褑懈褟 { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 袙褗胁械写械褌械 锌邪褉芯谢邪 蟹邪 芯褌胁邪褉褟薪械 薪邪 褌芯蟹懈 PDF 褎邪泄谢.
+pdfjs-password-invalid = 袧械胁邪谢懈写薪邪 锌邪褉芯谢邪. 袦芯谢褟, 芯锌懈褌邪泄褌械 芯褌薪芯胁芯.
+pdfjs-password-ok-button = 袛芯斜褉械
+pdfjs-password-cancel-button = 袨褌泻邪蟹
+pdfjs-web-fonts-disabled = 校械斜-褕褉懈褎褌芯胁械褌械 褋邪 蟹邪斜褉邪薪械薪懈: 褉邪蟹褉械褕邪胁邪薪械 薪邪 懈蟹锌芯谢蟹胁邪薪械褌芯 薪邪 胁谐褉邪写械薪懈褌械 PDF 褕褉懈褎褌芯胁械.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 孝械泻褋褌
+pdfjs-editor-free-text-button-label = 孝械泻褋褌
+pdfjs-editor-ink-button =
+    .title = 袪懈褋褍胁邪薪械
+pdfjs-editor-ink-button-label = 袪懈褋褍胁邪薪械
+pdfjs-editor-stamp-button =
+    .title = 袛芯斜邪胁褟薪械 懈谢懈 锌褉芯屑械薪褟薪械 薪邪 懈蟹芯斜褉邪卸械薪懈褟
+pdfjs-editor-stamp-button-label = 袛芯斜邪胁褟薪械 懈谢懈 锌褉芯屑械薪褟薪械 薪邪 懈蟹芯斜褉邪卸械薪懈褟
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 袩褉械屑邪褏胁邪薪械 薪邪 褉懈褋褍薪泻邪褌邪
+pdfjs-editor-remove-freetext-button =
+    .title = 袩褉械屑邪褏胁邪薪械 薪邪 褌械泻褋褌邪
+pdfjs-editor-remove-stamp-button =
+    .title = 袩械褉屑邪褏胁邪薪械 薪邪 懈蟹芯斜褉邪卸械薪懈械褌芯
+pdfjs-editor-remove-highlight-button =
+    .title = 袩褉械屑邪褏胁邪薪械 薪邪 芯褌泻褉芯褟胁邪薪械褌芯
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 笑胁褟褌
+pdfjs-editor-free-text-size-input = 袪邪蟹屑械褉
+pdfjs-editor-ink-color-input = 笑胁褟褌
+pdfjs-editor-ink-thickness-input = 袛械斜械谢懈薪邪
+pdfjs-editor-ink-opacity-input = 袩褉芯蟹褉邪褔薪芯褋褌
+pdfjs-editor-stamp-add-image-button =
+    .title = 袛芯斜邪胁褟薪械 薪邪 懈蟹芯斜褉邪卸械薪懈械
+pdfjs-editor-stamp-add-image-button-label = 袛芯斜邪胁褟薪械 薪邪 懈蟹芯斜褉邪卸械薪懈械
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 孝械泻褋褌芯胁 褉械写邪泻褌芯褉
+    .default-content = 袟邪锌芯褔薪械褌械 写邪 锌懈褕械褌械鈥�
+pdfjs-editor-comments-sidebar-close-button-label = 袟邪褌胁邪褉褟薪械 薪邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 袗谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌
+pdfjs-editor-alt-text-dialog-label = 袠蟹斜械褉械褌械 芯褌 胁褗蟹屑芯卸薪芯褋褌懈褌械
+pdfjs-editor-alt-text-dialog-description = 袗谢褌械褉薪邪褌懈胁薪懈褟褌 褌械泻褋褌 锌芯屑邪谐邪 薪邪 锌芯褌褉械斜懈褌械谢懈褌械, 泻芯谐邪褌芯 薪械 屑芯谐邪褌 写邪 胁懈写褟褌 懈蟹芯斜褉邪卸械薪懈械褌芯 懈谢懈 褌芯 薪械 褋械 蟹邪褉械卸写邪.
+pdfjs-editor-alt-text-add-description-label = 袛芯斜邪胁褟薪械 薪邪 芯锌懈褋邪薪懈械
+pdfjs-editor-alt-text-add-description-description = 小褌褉械屑械褌械 褋械 泻褗屑 1-2 懈蟹褉械褔械薪懈褟, 芯锌懈褋胁邪褖懈 锌褉械写屑械褌邪, 薪邪褋褌褉芯泄泻邪褌邪 懈谢懈 写械泄褋褌胁懈褟褌邪.
+pdfjs-editor-alt-text-mark-decorative-label = 袨褌斜械谢褟蟹胁邪薪械 泻邪褌芯 写械泻芯褉邪褌懈胁薪芯
+pdfjs-editor-alt-text-mark-decorative-description = 袠蟹锌芯谢蟹胁邪 褋械 蟹邪 芯褉薪邪屑械薪褌懈 懈谢懈 写械泻芯褉邪褌懈胁薪懈 懈蟹芯斜褉邪卸械薪懈褟, 泻邪褌芯 泻芯薪褌褍褉懈 懈 胁芯写薪懈 蟹薪邪褑懈.
+pdfjs-editor-alt-text-cancel-button = 袨褌泻邪蟹
+pdfjs-editor-alt-text-save-button = 袟邪锌邪蟹胁邪薪械
+pdfjs-editor-alt-text-decorative-tooltip = 袨褌斜械谢褟蟹胁邪薪械 泻邪褌芯 写械泻芯褉邪褌懈胁薪芯
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 袧邪锌褉懈屑械褉, 鈥炐溞恍靶� 屑褗卸 褋械写懈 薪邪 屑邪褋邪 懈 褋械 褏褉邪薪懈鈥�
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 袚芯褉械薪 谢褟胁 褗谐褗谢 鈥� 锌褉械芯褉邪蟹屑械褉褟胁邪薪械
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 袚芯褉械 胁 褋褉械写邪褌邪 鈥� 锌褉械芯褉邪蟹屑械褉褟胁邪薪械
+pdfjs-editor-resizer-top-right =
+    .aria-label = 袚芯褉械薪 写械褋械薪 褗谐褗谢 鈥� 锌褉械芯褉邪蟹屑械褉褟胁邪薪械
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 袛褟褋薪芯 胁 褋褉械写邪褌邪 鈥� 锌褉械芯褉邪蟹屑械褉褟胁邪薪械
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 袛芯谢械薪 写械褋械薪 褗谐褗谢 鈥� 锌褉械芯褉邪蟹屑械褉褟胁邪薪械
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 袛芯谢褍 胁 褋褉械写邪褌邪 鈥� 锌褉械芯褉邪蟹屑械褉褟胁邪薪械
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 袛芯谢械薪 谢褟胁 褗谐褗谢 鈥� 锌褉械芯褉邪蟹屑械褉褟胁邪薪械
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 袥褟胁芯 胁 褋褉械写邪褌邪 鈥� 锌褉械芯褉邪蟹屑械褉褟胁邪薪械
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 笑胁褟褌 薪邪 芯褌泻褉芯褟胁邪薪械
+pdfjs-editor-colorpicker-button =
+    .title = 袩褉芯屑褟薪邪 薪邪 褑胁褟褌
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 袠蟹斜芯褉 薪邪 褑胁褟褌
+pdfjs-editor-colorpicker-yellow =
+    .title = 袞褗谢褌芯
+pdfjs-editor-colorpicker-green =
+    .title = 袟械谢械薪芯
+pdfjs-editor-colorpicker-blue =
+    .title = 小懈薪褜芯
+pdfjs-editor-colorpicker-pink =
+    .title = 袪芯蟹芯胁芯
+pdfjs-editor-colorpicker-red =
+    .title = 效械褉胁械薪芯
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 袧邪褍褔械褌械 锌芯胁械褔械
+pdfjs-editor-new-alt-text-not-now-button = 袧械 褋械谐邪
+
+## Image alt-text settings
+
+pdfjs-editor-alt-text-settings-delete-model-button = 袠蟹褌褉懈胁邪薪械
+
+## Controls
+
+pdfjs-editor-add-signature-image-upload-error-description = 袩褉芯胁械褉械褌械 屑褉械卸芯胁邪褌邪 褋懈 胁褉褗蟹泻邪 懈谢懈 芯锌懈褌邪泄褌械 褋 写褉褍谐芯 懈蟹芯斜褉邪卸械薪懈械.
diff --git a/public/pdfjs/web/locale/bn/viewer.ftl b/public/pdfjs/web/locale/bn/viewer.ftl
new file mode 100644
index 0000000..7ca2c1d
--- /dev/null
+++ b/public/pdfjs/web/locale/bn/viewer.ftl
@@ -0,0 +1,218 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 唳唳班唳Μ唳班唳む 唳唳む
+pdfjs-previous-button-label = 唳唳班唳Μ唳班唳む
+pdfjs-next-button =
+    .title = 唳Π唳Π唰嵿Δ唰� 唳唳む
+pdfjs-next-button-label = 唳Π唳Π唰嵿Δ唰�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 唳唳む
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 唳忇Π
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pagesCount } 唳忇Π { $pageNumber })
+pdfjs-zoom-out-button =
+    .title = 唳涏唳� 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+pdfjs-zoom-out-button-label = 唳涏唳� 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+pdfjs-zoom-in-button =
+    .title = 唳 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+pdfjs-zoom-in-button-label = 唳 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+pdfjs-zoom-select =
+    .title = 唳 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+pdfjs-presentation-mode-button =
+    .title = 唳夃Κ唳膏唳ム唳Θ唳� 唳唳∴ 唳膏唳唳囙 唳曕Π唰佮Θ
+pdfjs-presentation-mode-button-label = 唳夃Κ唳膏唳ム唳Θ唳� 唳唳�
+pdfjs-open-file-button =
+    .title = 唳唳囙Σ 唳栢唳侧唳�
+pdfjs-open-file-button-label = 唳栢唳侧唳�
+pdfjs-print-button =
+    .title = 唳唳︵唳班Γ
+pdfjs-print-button-label = 唳唳︵唳班Γ
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 唳熰唳�
+pdfjs-tools-button-label = 唳熰唳�
+pdfjs-first-page-button =
+    .title = 唳唳班Ε唳� 唳唳む唰� 唳唳�
+pdfjs-first-page-button-label = 唳唳班Ε唳� 唳唳む唰� 唳唳�
+pdfjs-last-page-button =
+    .title = 唳多唳� 唳唳む唰� 唳唳�
+pdfjs-last-page-button-label = 唳多唳� 唳唳む唰� 唳唳�
+pdfjs-page-rotate-cw-button =
+    .title = 唳樴唳苦Π 唳曕唳佮唳距Π 唳︵唳曕 唳樴唳班唳�
+pdfjs-page-rotate-cw-button-label = 唳樴唳苦Π 唳曕唳佮唳距Π 唳︵唳曕 唳樴唳班唳�
+pdfjs-page-rotate-ccw-button =
+    .title = 唳樴Α唳监唳� 唳曕唳佮唳距Π 唳唳Π唰�唳む 唳樴唳班唳�
+pdfjs-page-rotate-ccw-button-label = 唳樴Α唳监唳� 唳曕唳佮唳距Π 唳唳Π唰�唳む 唳樴唳班唳�
+pdfjs-cursor-text-select-tool-button =
+    .title = 唳侧唳栢 唳ㄠ唳班唳唳氞 唳熰唳� 唳膏唰嵿Π唳苦 唳曕Π唰佮Θ
+pdfjs-cursor-text-select-tool-button-label = 唳侧唳栢 唳ㄠ唳班唳唳氞 唳熰唳�
+pdfjs-cursor-hand-tool-button =
+    .title = 唳灌唳唳ㄠ唳� 唳熰唳� 唳膏唰嵿Π唳苦Ο唳� 唳曕Π唰佮Θ
+pdfjs-cursor-hand-tool-button-label = 唳灌唳唳ㄠ唳� 唳熰唳�
+pdfjs-scroll-vertical-button =
+    .title = 唳夃Σ唳唳� 唳膏唳曕唳班Σ唳苦 唳唳Μ唳灌唳� 唳曕Π唰佮Θ
+pdfjs-scroll-vertical-button-label = 唳夃Σ唳唳� 唳膏唳曕唳班Σ唳苦
+pdfjs-scroll-horizontal-button =
+    .title = 唳呧Θ唰佮Ν唰傕Ξ唳苦 唳膏唳曕唳班Σ唳苦 唳唳Μ唳灌唳� 唳曕Π唰佮Θ
+pdfjs-scroll-horizontal-button-label = 唳呧Θ唰佮Ν唰傕Ξ唳苦 唳膏唳曕唳班Σ唳苦
+pdfjs-scroll-wrapped-button =
+    .title = Wrapped 唳膏唳曕唳班唳侧唳� 唳唳Μ唳灌唳� 唳曕Π唰佮Θ
+pdfjs-scroll-wrapped-button-label = Wrapped 唳膏唳曕唳班唳侧唳�
+pdfjs-spread-none-button =
+    .title = 唳唳� 唳膏唳唳班唳∴唰佮Σ唰嬥Δ唰� 唳唳椸Ζ唳距Θ 唳曕Π唳唳� 唳ㄠ
+pdfjs-spread-none-button-label = Spreads 唳ㄠ唳�
+pdfjs-spread-odd-button-label = 唳唳溹唰� Spreads
+pdfjs-spread-even-button-label = 唳溹唰� Spreads
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 唳ㄠΕ唳� 唳唳多唳粪唳熰唳��
+pdfjs-document-properties-button-label = 唳ㄠΕ唳� 唳唳多唳粪唳熰唳��
+pdfjs-document-properties-file-name = 唳唳囙Σ唰囙Π 唳ㄠ唳�:
+pdfjs-document-properties-file-size = 唳唳囙Σ唰囙Π 唳嗋唳距Π:
+pdfjs-document-properties-title = 唳多唳班唳ㄠ唳�:
+pdfjs-document-properties-author = 唳侧唳栢:
+pdfjs-document-properties-subject = 唳唳粪:
+pdfjs-document-properties-keywords = 唳曕唳撪唳距Π唰嵿Α:
+pdfjs-document-properties-creation-date = 唳む唳班唳� 唳む唳班唳�:
+pdfjs-document-properties-modification-date = 唳Π唳苦Μ唳班唳むΘ唰囙Π 唳む唳班唳�:
+pdfjs-document-properties-creator = 唳唳班Ω唰嵿Δ唰佮Δ唳曕唳班:
+pdfjs-document-properties-producer = 唳唳∴唳忇Λ 唳唳班Ω唰嵿Δ唰佮Δ唳曕唳班:
+pdfjs-document-properties-version = 唳唳∴唳忇Λ 唳膏唳粪唳曕Π唳�:
+pdfjs-document-properties-page-count = 唳唳� 唳唳む:
+pdfjs-document-properties-page-size = 唳唳む唳� 唳膏唳囙:
+pdfjs-document-properties-page-size-unit-inches = 唳忇Π 唳Η唰嵿Ο唰�
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 唳夃Σ唳唳�
+pdfjs-document-properties-page-size-orientation-landscape = 唳呧Θ唰佮Ν唰傕Ξ唳苦
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 唳侧唳熰唳�
+pdfjs-document-properties-page-size-name-legal = 唳侧唳椸唳�
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = 唳灌唳唳�
+pdfjs-document-properties-linearized-no = 唳ㄠ
+pdfjs-document-properties-close-button = 唳Θ唰嵿Η
+
+## Print
+
+pdfjs-print-progress-message = 唳唳︵唳班Γ唰囙Π 唳溹Θ唰嵿Ο 唳ㄠΕ唳� 唳唳班Ω唰嵿Δ唰佮Δ 唳曕Π唳� 唳灌唰嵿唰団��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 唳唳む唳�
+pdfjs-printing-not-supported = 唳膏Δ唳班唳曕Δ唳�: 唳忇 唳唳班唳夃唳距Π唰� 唳唳︵唳班Γ 唳膏Ξ唰嵿Κ唰傕Π唰嵿Γ唳唳 唳膏Ξ唳班唳ム唳� 唳ㄠ啷�
+pdfjs-printing-not-ready = 唳膏Δ唳班唳曕唳曕Π唳�: 唳唳∴唳忇Λ唳熰 唳唳︵唳班Γ唰囙Π 唳溹Θ唰嵿Ο 唳膏Ξ唰嵿Κ唰傕Π唰嵿Γ 唳侧唳� 唳灌唳ㄠ啷�
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 唳膏唳囙Α唳唳� 唳熰唳� 唳曕Π唰佮Θ
+pdfjs-toggle-sidebar-button-label = 唳膏唳囙Α唳唳� 唳熰唳� 唳曕Π唰佮Θ
+pdfjs-document-outline-button =
+    .title = 唳ㄠΕ唳苦Π 唳嗋唳熰Σ唳距唳� 唳︵唳栢唳� (唳膏Μ 唳嗋唳熰唳� 唳唳班Ω唳距Π唳苦Δ/唳膏唰嵿唰佮唳苦Δ 唳曕Π唳む 唳∴Μ唳� 唳曕唳侧唳� 唳曕Π唰佮Θ)
+pdfjs-document-outline-button-label = 唳ㄠΕ唳苦Π 唳班唳Π唰囙唳�
+pdfjs-attachments-button =
+    .title = 唳膏唳唳曕唳む 唳︵唳栢唳�
+pdfjs-attachments-button-label = 唳膏唳唳曕唳む
+pdfjs-thumbs-button =
+    .title = 唳ム唳唳Θ唰囙唳� 唳膏Ξ唰傕 唳唳班Ζ唳班唳多Θ 唳曕Π唰佮Θ
+pdfjs-thumbs-button-label = 唳ム唳唳Θ唰囙唳� 唳膏Ξ唰傕
+pdfjs-findbar-button =
+    .title = 唳ㄠΕ唳苦Π 唳Η唰嵿Ο唰� 唳栢唳佮唰佮Θ
+pdfjs-findbar-button-label = 唳栢唳佮唰佮Θ
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 唳唳む { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 唳唳む唳� 唳ム唳唳Θ唰囙唳�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 唳栢唳佮唰佮Θ
+    .placeholder = 唳ㄠΕ唳苦Π 唳Η唰嵿Ο唰� 唳栢唳佮唰佮Θ鈥�
+pdfjs-find-previous-button =
+    .title = 唳唳曕唳唳傕Χ唰囙Π 唳唳班唳Μ唳班唳む 唳夃Κ唳膏唳ム唳む 唳呧Θ唰佮Ω唳ㄠ唳о唳�
+pdfjs-find-previous-button-label = 唳唳班唳Μ唳班唳む
+pdfjs-find-next-button =
+    .title = 唳唳曕唳唳傕Χ唰囙Π 唳Π唳Π唰嵿Δ唰� 唳夃Κ唳膏唳ム唳む 唳呧Θ唰佮Ω唳ㄠ唳о唳�
+pdfjs-find-next-button-label = 唳Π唳Π唰嵿Δ唰�
+pdfjs-find-highlight-checkbox = 唳膏Μ 唳灌唳囙Σ唳距唳� 唳曕Π唰佮Θ
+pdfjs-find-match-case-checkbox-label = 唳呧唰嵿Ψ唳班唳� 唳涏唳佮Ζ 唳唳侧唳ㄠ
+pdfjs-find-entire-word-checkbox-label = 唳膏Ξ唰嵿Κ唰傕Π唰嵿Γ 唳多Μ唰嵿Ζ
+pdfjs-find-reached-top = 唳唳む唳� 唳多唳班唳む 唳唳涏 唳椸唳涏, 唳ㄠ唳� 唳ム唳曕 唳嗋Π唳唳� 唳曕Π唳� 唳灌唰囙唰�
+pdfjs-find-reached-bottom = 唳唳む唳� 唳多唳粪 唳唳涏 唳椸唳涏, 唳夃Κ唳� 唳ム唳曕 唳嗋Π唳唳� 唳曕Π唳� 唳灌唰囙唰�
+pdfjs-find-not-found = 唳唳曕唳唳傕Χ 唳唳撪唳� 唳唰熰Θ唳�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 唳唳む唳� 唳唳班Ω唰嵿Ε
+pdfjs-page-scale-fit = 唳唳む 唳唳� 唳曕Π唰佮Θ
+pdfjs-page-scale-auto = 唳膏唳唳傕唰嵿Π唳苦 唳溹唳�
+pdfjs-page-scale-actual = 唳唳班唰冟Δ 唳嗋唳距Π
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = 唳唳∴唳忇Λ 唳侧唳� 唳曕Π唳距Π 唳膏Ξ唰� 唳む唳班唳熰 唳︵唳栢 唳︵唰熰唳涏啷�
+pdfjs-invalid-file-error = 唳呧唳距Π唰嵿Ο唳曕Π 唳呧Ε唳 唳曕唳粪Δ唳苦唰嵿Π唳膏唳� 唳唳∴唳忇Λ 唳唳囙Σ啷�
+pdfjs-missing-file-error = 唳ㄠ唳栢唳佮 PDF 唳唳囙Σ啷�
+pdfjs-unexpected-response-error = 唳呧Κ唰嵿Π唳む唳唳多唳� 唳膏唳班唳唳� 唳唳班Δ唳苦唰嵿Π唳苦唳距イ
+pdfjs-rendering-error = 唳唳む 唳夃Κ唳膏唳ム唳Θ唳距Π 唳膏Ξ唰� 唳む唳班唳熰 唳︵唳栢 唳︵唰熰唳涏啷�
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 唳熰唳曕]
+
+## Password
+
+pdfjs-password-label = 唳唳∴唳忇Λ 唳唳囙Σ唳熰 唳撪Κ唰囙Θ 唳曕Π唳む 唳唳膏唰熰唳班唳� 唳︵唳ㄠイ
+pdfjs-password-invalid = 唳唳� 唳唳膏唰熰唳班唳∴イ 唳呧Θ唰佮唰嵿Π唳� 唳曕Π唰� 唳嗋Μ唳距Π 唳氞唳粪唳熰 唳曕Π唰佮Θ啷�
+pdfjs-password-ok-button = 唳犩唳� 唳嗋唰�
+pdfjs-password-cancel-button = 唳唳む唳�
+pdfjs-web-fonts-disabled = 唳撪唰囙Μ 唳Θ唰嵿 唳ㄠ唳粪唳曕唳班唰�: 唳膏唳唳曕唳� 唳唳∴唳忇Λ 唳Θ唰嵿 唳唳Μ唳灌唳� 唳曕Π唳� 唳唳氞唳涏 唳ㄠ啷�
diff --git a/public/pdfjs/web/locale/bo/viewer.ftl b/public/pdfjs/web/locale/bo/viewer.ftl
new file mode 100644
index 0000000..4bea897
--- /dev/null
+++ b/public/pdfjs/web/locale/bo/viewer.ftl
@@ -0,0 +1,222 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 嘟戉静嗉嬥絼嘟监溅嗉嬥溅嗑斷郊嘟撪紜嘟�
+pdfjs-previous-button-label = 嘟︵緮嘟监綋嗉嬥綐
+pdfjs-next-button =
+    .title = 嘟戉静嗉嬥絼嘟监溅嗉嬥舰嗑椸胶嘟︵紜嘟�
+pdfjs-next-button-label = 嘟⑧緱嘟亨溅嗉嬥綐
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 嘟む郊嘟傕紜嘟勦郊嘟�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = of { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom Out
+pdfjs-zoom-out-button-label = Zoom Out
+pdfjs-zoom-in-button =
+    .title = Zoom In
+pdfjs-zoom-in-button-label = Zoom In
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Switch to Presentation Mode
+pdfjs-presentation-mode-button-label = Presentation Mode
+pdfjs-open-file-button =
+    .title = Open File
+pdfjs-open-file-button-label = Open
+pdfjs-print-button =
+    .title = Print
+pdfjs-print-button-label = Print
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Tools
+pdfjs-tools-button-label = Tools
+pdfjs-first-page-button =
+    .title = Go to First Page
+pdfjs-first-page-button-label = Go to First Page
+pdfjs-last-page-button =
+    .title = Go to Last Page
+pdfjs-last-page-button-label = Go to Last Page
+pdfjs-page-rotate-cw-button =
+    .title = Rotate Clockwise
+pdfjs-page-rotate-cw-button-label = Rotate Clockwise
+pdfjs-page-rotate-ccw-button =
+    .title = Rotate Counterclockwise
+pdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise
+pdfjs-cursor-text-select-tool-button =
+    .title = Enable Text Selection Tool
+pdfjs-cursor-text-select-tool-button-label = Text Selection Tool
+pdfjs-cursor-hand-tool-button =
+    .title = Enable Hand Tool
+pdfjs-cursor-hand-tool-button-label = Hand Tool
+pdfjs-scroll-vertical-button =
+    .title = Use Vertical Scrolling
+pdfjs-scroll-vertical-button-label = Vertical Scrolling
+pdfjs-scroll-horizontal-button =
+    .title = Use Horizontal Scrolling
+pdfjs-scroll-horizontal-button-label = Horizontal Scrolling
+pdfjs-scroll-wrapped-button =
+    .title = Use Wrapped Scrolling
+pdfjs-scroll-wrapped-button-label = Wrapped Scrolling
+pdfjs-spread-none-button =
+    .title = Do not join page spreads
+pdfjs-spread-none-button-label = No Spreads
+pdfjs-spread-odd-button =
+    .title = Join page spreads starting with odd-numbered pages
+pdfjs-spread-odd-button-label = Odd Spreads
+pdfjs-spread-even-button =
+    .title = Join page spreads starting with even-numbered pages
+pdfjs-spread-even-button-label = Even Spreads
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Document Properties鈥�
+pdfjs-document-properties-button-label = Document Properties鈥�
+pdfjs-document-properties-file-name = File name:
+pdfjs-document-properties-file-size = File size:
+pdfjs-document-properties-title = Title:
+pdfjs-document-properties-author = Author:
+pdfjs-document-properties-subject = Subject:
+pdfjs-document-properties-keywords = Keywords:
+pdfjs-document-properties-creation-date = Creation Date:
+pdfjs-document-properties-modification-date = Modification Date:
+pdfjs-document-properties-creator = Creator:
+pdfjs-document-properties-producer = PDF Producer:
+pdfjs-document-properties-version = PDF Version:
+pdfjs-document-properties-page-count = Page Count:
+pdfjs-document-properties-page-size = Page Size:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portrait
+pdfjs-document-properties-page-size-orientation-landscape = landscape
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = Yes
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Close
+
+## Print
+
+pdfjs-print-progress-message = Preparing document for printing鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancel
+pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.
+pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Toggle Sidebar
+pdfjs-toggle-sidebar-button-label = Toggle Sidebar
+pdfjs-document-outline-button =
+    .title = Show Document Outline (double-click to expand/collapse all items)
+pdfjs-document-outline-button-label = Document Outline
+pdfjs-attachments-button =
+    .title = Show Attachments
+pdfjs-attachments-button-label = Attachments
+pdfjs-thumbs-button =
+    .title = Show Thumbnails
+pdfjs-thumbs-button-label = Thumbnails
+pdfjs-findbar-button =
+    .title = Find in Document
+pdfjs-findbar-button-label = Find
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Page { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Thumbnail of Page { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Find
+    .placeholder = Find in document鈥�
+pdfjs-find-previous-button =
+    .title = Find the previous occurrence of the phrase
+pdfjs-find-previous-button-label = Previous
+pdfjs-find-next-button =
+    .title = Find the next occurrence of the phrase
+pdfjs-find-next-button-label = Next
+pdfjs-find-highlight-checkbox = Highlight all
+pdfjs-find-match-case-checkbox-label = Match case
+pdfjs-find-entire-word-checkbox-label = Whole words
+pdfjs-find-reached-top = Reached top of document, continued from bottom
+pdfjs-find-reached-bottom = Reached end of document, continued from top
+pdfjs-find-not-found = Phrase not found
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Page Width
+pdfjs-page-scale-fit = Page Fit
+pdfjs-page-scale-auto = Automatic Zoom
+pdfjs-page-scale-actual = Actual Size
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = An error occurred while loading the PDF.
+pdfjs-invalid-file-error = Invalid or corrupted PDF file.
+pdfjs-missing-file-error = Missing PDF file.
+pdfjs-unexpected-response-error = Unexpected server response.
+pdfjs-rendering-error = An error occurred while rendering the page.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = Enter the password to open this PDF file.
+pdfjs-password-invalid = Invalid password. Please try again.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Cancel
+pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.
diff --git a/public/pdfjs/web/locale/bqi/viewer.ftl b/public/pdfjs/web/locale/bqi/viewer.ftl
new file mode 100644
index 0000000..a2d0535
--- /dev/null
+++ b/public/pdfjs/web/locale/bqi/viewer.ftl
@@ -0,0 +1,67 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-print-button =
+    .title = 趩丕倬
+pdfjs-print-button-label = 趩丕倬
+
+##
+
+pdfjs-document-properties-linearized-yes = 賴乇蹖
+
+## Print
+
+pdfjs-print-progress-close-button = 賱賯賵
+
+## Password
+
+pdfjs-password-ok-button = 禺丕
+pdfjs-password-cancel-button = 賱賯賵
+
+## Editing
+
+pdfjs-editor-stamp-button =
+    .title = 俦賵賵乇丿賳 蹖丕 丌賱卮鬲 卮亟賵丕鬲丕
+pdfjs-editor-stamp-button-label = 俦賵賵乇丿賳 蹖丕 丌賱卮鬲 卮亟賵丕鬲丕
+
+## Default editor aria labels
+
+pdfjs-editor-stamp-editor =
+    .aria-label = 丌賱卮鬲诏乇 卮亟賵丕鬲
+
+##
+
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 丌賱卮鬲诏乇 賴亟賱
+    .default-content = 賳丕賴丕趯賳 倬丕 賴亟賱 讴乇丿賳...
+pdfjs-editor-comments-sidebar-no-comments-link = 賯賱賵賴 丿賵賵爻鬲賴 亘蹔蹖賳
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-cancel-button = 賱賯賵
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 賯賱賵賴 丿賵賵爻鬲賴 亘蹔蹖賳
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 賱賯賵
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 丌賱卮鬲 賲賳卮趯
+pdfjs-editor-edit-comment-popup-button =
+    .title = 丌賱卮鬲 賲賳卮趯
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 丌賱卮鬲 賲賳卮趯
+pdfjs-editor-edit-comment-dialog-cancel-button = 賱賯賵
diff --git a/public/pdfjs/web/locale/br/viewer.ftl b/public/pdfjs/web/locale/br/viewer.ftl
new file mode 100644
index 0000000..1f86d46
--- /dev/null
+++ b/public/pdfjs/web/locale/br/viewer.ftl
@@ -0,0 +1,323 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pajenn a-raok
+pdfjs-previous-button-label = A-raok
+pdfjs-next-button =
+    .title = Pajenn war-lerc'h
+pdfjs-next-button-label = War-lerc'h
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pajenn
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = eus { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } war { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoum bihanaat
+pdfjs-zoom-out-button-label = Zoum bihanaat
+pdfjs-zoom-in-button =
+    .title = Zoum brasaat
+pdfjs-zoom-in-button-label = Zoum brasaat
+pdfjs-zoom-select =
+    .title = Zoum
+pdfjs-presentation-mode-button =
+    .title = Trec'haoli帽 etrezek ar mod kinnigadenn
+pdfjs-presentation-mode-button-label = Mod kinnigadenn
+pdfjs-open-file-button =
+    .title = Digeri帽 ur restr
+pdfjs-open-file-button-label = Digeri帽 ur restr
+pdfjs-print-button =
+    .title = Moulla帽
+pdfjs-print-button-label = Moulla帽
+pdfjs-save-button =
+    .title = Enrolla帽
+pdfjs-save-button-label = Enrolla帽
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Pellgarga帽
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Pellgarga帽
+pdfjs-bookmark-button-label = Pajenn a-vrema帽
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ostilho霉
+pdfjs-tools-button-label = Ostilho霉
+pdfjs-first-page-button =
+    .title = Mont d'ar bajenn genta帽
+pdfjs-first-page-button-label = Mont d'ar bajenn genta帽
+pdfjs-last-page-button =
+    .title = Mont d'ar bajenn diwezha帽
+pdfjs-last-page-button-label = Mont d'ar bajenn diwezha帽
+pdfjs-page-rotate-cw-button =
+    .title = C'hwela帽 gant roud ar bizied
+pdfjs-page-rotate-cw-button-label = C'hwela帽 gant roud ar bizied
+pdfjs-page-rotate-ccw-button =
+    .title = C'hwela帽 gant roud gin ar bizied
+pdfjs-page-rotate-ccw-button-label = C'hwela帽 gant roud gin ar bizied
+pdfjs-cursor-text-select-tool-button =
+    .title = Gweredekaat an ostilh diuza帽 testenn
+pdfjs-cursor-text-select-tool-button-label = Ostilh diuza帽 testenn
+pdfjs-cursor-hand-tool-button =
+    .title = Gweredekaat an ostilh dorn
+pdfjs-cursor-hand-tool-button-label = Ostilh dorn
+pdfjs-scroll-vertical-button =
+    .title = Arvera帽 an dibuna帽 a-blom
+pdfjs-scroll-vertical-button-label = Dibuna帽 a-serzh
+pdfjs-scroll-horizontal-button =
+    .title = Arvera帽 an dibuna帽 a-blaen
+pdfjs-scroll-horizontal-button-label = Dibuna帽 a-blaen
+pdfjs-scroll-wrapped-button =
+    .title = Arvera帽 an dibuna帽 paket
+pdfjs-scroll-wrapped-button-label = Dibuna帽 paket
+pdfjs-spread-none-button =
+    .title = Chom hep staga帽 ar skignadurio霉
+pdfjs-spread-none-button-label = Skignadenn ebet
+pdfjs-spread-odd-button =
+    .title = Lakaat ar pajennado霉 en ur gregi帽 gant ar pajenno霉 ampar
+pdfjs-spread-odd-button-label = Pajenno霉 ampar
+pdfjs-spread-even-button =
+    .title = Lakaat ar pajennado霉 en ur gregi帽 gant ar pajenno霉 par
+pdfjs-spread-even-button-label = Pajenno霉 par
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Perzhio霉 an teul鈥�
+pdfjs-document-properties-button-label = Perzhio霉 an teul鈥�
+pdfjs-document-properties-file-name = Anv restr:
+pdfjs-document-properties-file-size = Ment ar restr:
+pdfjs-document-properties-title = Titl:
+pdfjs-document-properties-author = Aozer:
+pdfjs-document-properties-subject = Danvez:
+pdfjs-document-properties-keywords = Gerio霉-alc'hwez:
+pdfjs-document-properties-creation-date = Deiziad kroui帽:
+pdfjs-document-properties-modification-date = Deiziad kemma帽:
+pdfjs-document-properties-creator = Krouer:
+pdfjs-document-properties-producer = Kenderc'her PDF:
+pdfjs-document-properties-version = Handelv PDF:
+pdfjs-document-properties-page-count = Niver a bajenno霉:
+pdfjs-document-properties-page-size = Ment ar bajenn:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = poltred
+pdfjs-document-properties-page-size-orientation-landscape = gweledva
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Lizher
+pdfjs-document-properties-page-size-name-legal = Lezennel
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Gwel Web Herrek:
+pdfjs-document-properties-linearized-yes = Ya
+pdfjs-document-properties-linearized-no = Ket
+pdfjs-document-properties-close-button = Serri帽
+
+## Print
+
+pdfjs-print-progress-message = O prienti帽 an teul evit moulla帽...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Nulla帽
+pdfjs-printing-not-supported = Kemenn: N'eo ket skoret penn-da-benn ar moulla帽 gant ar merdeer-ma帽.
+pdfjs-printing-not-ready = Kemenn: N'hall ket beza帽 moullet ar restr PDF rak n'eo ket karget penn-da-benn.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Diskouez/kuzhat ar varrenn gostez
+pdfjs-toggle-sidebar-notification-button =
+    .title = Trec'haoli帽 ar varrenn-gostez (ur steu帽v pe stagadenno霉 a zo en teul)
+pdfjs-toggle-sidebar-button-label = Diskouez/kuzhat ar varrenn gostez
+pdfjs-document-outline-button =
+    .title = Diskouez steu帽v an teul (daouglikit evit brasaat/bihanaat an holl elfenno霉)
+pdfjs-document-outline-button-label = Sinedo霉 an teuliad
+pdfjs-attachments-button =
+    .title = Diskouez ar c'henstagadurio霉
+pdfjs-attachments-button-label = Kenstagadurio霉
+pdfjs-layers-button =
+    .title = Diskouez ar gwiskado霉 (daou-glika帽 evit adderaouekaat an holl gwiskado霉 d'o stad dre ziouer)
+pdfjs-layers-button-label = Gwiskado霉
+pdfjs-thumbs-button =
+    .title = Diskouez ar melvenno霉
+pdfjs-thumbs-button-label = Melvenno霉
+pdfjs-findbar-button =
+    .title = Klask e-barzh an teuliad
+pdfjs-findbar-button-label = Klask
+pdfjs-additional-layers = Gwiskado霉 ouzhpenn
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pajenn { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Melvenn ar bajenn { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Klask
+    .placeholder = Klask e-barzh an teuliad
+pdfjs-find-previous-button =
+    .title = Kavout an tamm frazenn kent o klota帽 ganti
+pdfjs-find-previous-button-label = Kent
+pdfjs-find-next-button =
+    .title = Kavout an tamm frazenn war-lerc'h o klota帽 ganti
+pdfjs-find-next-button-label = War-lerc'h
+pdfjs-find-highlight-checkbox = Skl锚rijenna帽 pep tra
+pdfjs-find-match-case-checkbox-label = Teurel evezh ouzh ar pennlizherenno霉
+pdfjs-find-match-diacritics-checkbox-label = Douja帽 d鈥檃n tiredo霉
+pdfjs-find-entire-word-checkbox-label = Gerio霉 a-bezh
+pdfjs-find-reached-top = Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz
+pdfjs-find-reached-bottom = Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h
+pdfjs-find-not-found = N'haller ket kavout ar frazenn
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Led ar bajenn
+pdfjs-page-scale-fit = Pajenn a-bezh
+pdfjs-page-scale-auto = Zoum emgefreek
+pdfjs-page-scale-actual = Ment wir
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pajenn { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Degouezhet ez eus bet ur fazi e-pad karga帽 ar PDF.
+pdfjs-invalid-file-error = Restr PDF didalvoudek pe kontronet.
+pdfjs-missing-file-error = Restr PDF o vankout.
+pdfjs-unexpected-response-error = Respont dic'hortoz a-berzh an dafariad
+pdfjs-rendering-error = Degouezhet ez eus bet ur fazi e-pad skramma帽 ar bajennad.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Notenna帽]
+
+## Password
+
+pdfjs-password-label = Enankit ar ger-tremen evit digeri帽 ar restr PDF-ma帽.
+pdfjs-password-invalid = Ger-tremen didalvoudek. Klaskit en-dro mar plij.
+pdfjs-password-ok-button = Mat eo
+pdfjs-password-cancel-button = Nulla帽
+pdfjs-web-fonts-disabled = Diweredekaet eo an nodrezho霉 web: n'haller ket arvera帽 an nodrezho霉 PDF enframmet.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Testenn
+pdfjs-editor-free-text-button-label = Testenn
+pdfjs-editor-ink-button =
+    .title = Tresa帽
+pdfjs-editor-ink-button-label = Tresa帽
+pdfjs-editor-stamp-button =
+    .title = Ouzhpenna帽 pe aoza帽 skeudenno霉
+pdfjs-editor-stamp-button-label = Ouzhpenna帽 pe aoza帽 skeudenno霉
+pdfjs-editor-highlight-button =
+    .title = Sklerijenna帽
+pdfjs-editor-highlight-button-label = Sklerijenna帽
+pdfjs-highlight-floating-button1 =
+    .title = Sklerijenna帽
+    .aria-label = Sklerijenna帽
+pdfjs-highlight-floating-button-label = Sklerijenna帽
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Liv
+pdfjs-editor-free-text-size-input = Ment
+pdfjs-editor-ink-color-input = Liv
+pdfjs-editor-ink-thickness-input = Tevder
+pdfjs-editor-ink-opacity-input = Boullder
+pdfjs-editor-stamp-add-image-button =
+    .title = Ouzhpenna帽 ur skeudenn
+pdfjs-editor-stamp-add-image-button-label = Ouzhpenna帽 ur skeudenn
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Tevded
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-add-description-label = Ouzhpenna帽 un deskrivadur
+pdfjs-editor-alt-text-cancel-button = Nulla帽
+pdfjs-editor-alt-text-save-button = Enrolla帽
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Da skouer, 鈥淯r paotr yaouank ouzh taol o tebri帽 boued鈥�
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Liv skl锚rijenna帽
+pdfjs-editor-colorpicker-button =
+    .title = Che帽ch liv
+pdfjs-editor-colorpicker-yellow =
+    .title = Melen
+pdfjs-editor-colorpicker-blue =
+    .title = Glas
+pdfjs-editor-colorpicker-pink =
+    .title = Roz
+pdfjs-editor-colorpicker-red =
+    .title = Ruz
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Diskouez pep tra
+pdfjs-editor-highlight-show-all-button =
+    .title = Diskouez pep tra
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Gouzout hiroc鈥檋
+pdfjs-editor-new-alt-text-error-close-button = Serri帽
+
+## Image alt-text settings
+
+pdfjs-editor-alt-text-settings-delete-model-button = Dilemel
+pdfjs-editor-alt-text-settings-download-model-button = Pellgarga帽
+pdfjs-editor-alt-text-settings-downloading-model-button = O pellgarga帽鈥�
+pdfjs-editor-alt-text-settings-close-button = Serri帽
diff --git a/public/pdfjs/web/locale/brx/viewer.ftl b/public/pdfjs/web/locale/brx/viewer.ftl
new file mode 100644
index 0000000..bd44403
--- /dev/null
+++ b/public/pdfjs/web/locale/brx/viewer.ftl
@@ -0,0 +1,189 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 啶嗋啷嬥げ啶ㄠた 啶た啶侧ぞ啶�
+pdfjs-previous-button-label = 啶嗋啷嬥げ啶ㄠた
+pdfjs-next-button =
+    .title = 啶夃え啶ㄠた 啶た啶侧ぞ啶�
+pdfjs-next-button-label = 啶夃え啶ㄠた
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 啶た啶侧ぞ啶�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 啶ㄠた
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pagesCount } 啶ㄠた { $pageNumber })
+pdfjs-zoom-out-button =
+    .title = 啶た啶膏ぞ啶 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+pdfjs-zoom-out-button-label = 啶た啶膏ぞ啶 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+pdfjs-zoom-in-button =
+    .title = 啶椸啶︵啶班 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+pdfjs-zoom-in-button-label = 啶椸啶︵啶班 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+pdfjs-zoom-select =
+    .title = 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+pdfjs-presentation-mode-button =
+    .title = 啶︵た啶ㄠ啶ムた啶啶傕え啶距く 啶�'啶∴啶� 啶ムぞ啶�
+pdfjs-presentation-mode-button-label = 啶︵た啶ㄠ啶ムた啶啶傕え啶距く 啶�'啶�
+pdfjs-open-file-button =
+    .title = 啶ぞ啶囙げ啶栢 啶栢啶�
+pdfjs-open-file-button-label = 啶栢啶�
+pdfjs-print-button =
+    .title = 啶膏ぞ啶ぞ啶�
+pdfjs-print-button-label = 啶膏ぞ啶ぞ啶�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 啶熰啶�
+pdfjs-tools-button-label = 啶熰啶�
+pdfjs-first-page-button =
+    .title = 啶椸た啶た 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+pdfjs-first-page-button-label = 啶椸た啶た 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+pdfjs-last-page-button =
+    .title = 啶溹啶ぅ啶� 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+pdfjs-last-page-button-label = 啶溹啶ぅ啶� 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+pdfjs-page-rotate-cw-button =
+    .title = 啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶ぞ啶班啶膏 啶た啶︵た啶�
+pdfjs-page-rotate-cw-button-label = 啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶ぞ啶班啶膏 啶た啶︵た啶�
+pdfjs-page-rotate-ccw-button =
+    .title = 啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶夃げ啷嵿ぅ啶� 啶ぞ啶班啶膏 啶た啶︵た啶�
+pdfjs-page-rotate-ccw-button-label = 啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶夃げ啷嵿ぅ啶� 啶ぞ啶班啶膏 啶た啶︵た啶�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙え啶� 啶嗋啷佮ぅ啶距く...
+pdfjs-document-properties-button-label = 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙え啶� 啶嗋啷佮ぅ啶距く...
+pdfjs-document-properties-file-name = 啶ぞ啶囙げ啶ㄠた 啶啶�:
+pdfjs-document-properties-file-size = 啶ぞ啶囙げ啶ㄠた 啶す啶�:
+pdfjs-document-properties-title = 啶た啶啶�:
+pdfjs-document-properties-author = 啶侧た啶班啶苦ぐ啶�:
+pdfjs-document-properties-subject = 啶嗋く啶︵ぞ:
+pdfjs-document-properties-keywords = 啶椸ぞ啶灌ぞ啶� 啶膏啶︵啶�:
+pdfjs-document-properties-creation-date = 啶膏啶班啶苦え啶距く 啶呧啷嵿':
+pdfjs-document-properties-modification-date = 啶膏啶︵啶班ぞ啶え啶距く 啶呧啷嵿':
+pdfjs-document-properties-creator = 啶膏啶班啶苦啷嵿ぐ啶�:
+pdfjs-document-properties-producer = PDF 啶︵た啶灌啶ㄠ啷嵿ぐ啶�:
+pdfjs-document-properties-version = PDF 啶た啶膏ぞ啶�:
+pdfjs-document-properties-page-count = 啶た啶侧ぞ啶囙え啶� 啶灌た啶膏ぞ啶�:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 啶�'啶班啶熰啶班啶�
+pdfjs-document-properties-page-size-orientation-landscape = 啶侧啶`啶∴じ啷嵿啷囙お
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 啶侧ぞ啶啶距ぎ
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+pdfjs-document-properties-linearized-yes = 啶ㄠ啶椸
+pdfjs-document-properties-linearized-no = 啶ㄠ啶�
+pdfjs-document-properties-close-button = 啶え啷嵿う 啶栢ぞ啶侧ぞ啶�
+
+## Print
+
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 啶ㄠ啶掂じ啶�
+pdfjs-printing-not-supported = 啶膏ぞ啶傕啷嵿ぐ啶距啶ムた: 啶膏ぞ啶ぞ啶え啶距く啶� 啶 啶啶班ぞ啶夃啶距ぐ啶溹啶� 啶嗋が啷佮啷� 啶灌啶ぞ啶溹ぞ啶� 啶灌啶溹ぞ啶ぞ啷�
+pdfjs-printing-not-ready = 啶膏ぞ啶傕啷嵿ぐ啶距啶ムた: PDF 啶栢 啶膏ぞ啶ぞ啶え啶距く啶ㄠた 啶ムぞ啶栢ぞ啶� 啶啶班ぞ啶 啶�'啶� 啶栢ぞ啶侧ぞ啶ぞ啶栢啷�
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 啶熰啷嵿啶� 啶膏ぞ啶囙ぁ啶ぞ啶�
+pdfjs-toggle-sidebar-button-label = 啶熰啷嵿啶� 啶膏ぞ啶囙ぁ啶ぞ啶�
+pdfjs-document-outline-button-label = 啶啶班ぎ啶距え 啶た啶侧ぞ啶� 啶膏た啶ぞ 啶灌ぞ啶傕啷�
+pdfjs-attachments-button =
+    .title = 啶ㄠぞ啶傕啶距が 啶灌啶ㄠぞ啶啷� 啶︵た啶ㄠ啶ムた
+pdfjs-attachments-button-label = 啶ㄠぞ啶傕啶距が 啶灌啶ㄠぞ啶�
+pdfjs-thumbs-button =
+    .title = 啶ムぞ啶え啷囙啶侧啷� 啶︵た啶ㄠ啶ムた
+pdfjs-thumbs-button-label = 啶ムぞ啶え啷囙啶�
+pdfjs-findbar-button =
+    .title = 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙啶� 啶ㄠぞ啶椸た啶班え啶� 啶︵た啶灌啶�
+pdfjs-findbar-button-label = 啶ㄠぞ啶啶苦ぐ啶ㄠぞ 啶︵た啶灌啶�
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 啶た啶侧ぞ啶� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 啶た啶侧ぞ啶� { $page } 啶ㄠた 啶ムぞ啶え啷囙啶�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 啶ㄠぞ啶啶苦ぐ啶ㄠぞ 啶︵た啶灌啶�
+    .placeholder = 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙啶� 啶ㄠぞ啶椸た啶班え啶� 啶︵た啶灌啶�...
+pdfjs-find-previous-button =
+    .title = 啶ぞ啶ム啶班ぞ 啶栢啶ㄠ啶︵啶え啶� 啶膏た啶椸ぞ啶傕え啶� 啶ㄠ啶溹ぞ啶ムた啶ㄠぞ啶啷� 啶ㄠぞ啶椸た啶�
+pdfjs-find-previous-button-label = 啶嗋啷嬥げ啶ㄠた
+pdfjs-find-next-button =
+    .title = 啶ぞ啶ム啶班ぞ 啶栢啶ㄠ啶︵啶え啶� 啶夃え啶ㄠた 啶ㄠ啶溹ぞ啶ムた啶ㄠぞ啶啷� 啶ㄠぞ啶椸た啶�
+pdfjs-find-next-button-label = 啶夃え啶ㄠた
+pdfjs-find-highlight-checkbox = 啶椸ぞ啶膏啶栢啶 啶灌ぞ啶囙げ啶距啶� 啶栢ぞ啶侧ぞ啶�
+pdfjs-find-match-case-checkbox-label = 啶椸啶班啶え啶距く 啶曕啶�
+pdfjs-find-reached-top = 啶ムぞ啶侧 啶ㄠた啶啶班ぞ啶� 啶溹ぞ啶椸ぞ啶え啶距え啷� 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙え啶� 啶た啶溹啶嗋さ 啶膏啶灌啶ぞ啶�
+pdfjs-find-reached-bottom = 啶た啶溹 啶ㄠた啶啶班ぞ啶� 啶溹ぞ啶椸ぞ啶え啶距え啷� 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙え啶� 啶た啶溹啶嗋さ 啶膏啶灌啶ぞ啶�
+pdfjs-find-not-found = 啶ぞ啶ム啶班ぞ 啶栢啶ㄠ啶︵啶� 啶啶ㄠぞ啶栢
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 啶た啶侧ぞ啶囙え啶� 啶椸啶掂ぞ啶�
+pdfjs-page-scale-fit = 啶た啶侧ぞ啶� 啶椸啶班啶え啶距く
+pdfjs-page-scale-auto = 啶椸ぞ啶掂え啷嬥啶距さ 啶溹啶�
+pdfjs-page-scale-actual = 啶ムぞ啶� 啶す啶�
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 啶�'啶� 啶栢ぞ啶侧ぞ啶え啶距く 啶膏ぎ啶距さ 啶啶ㄠじ啷� 啶椸啶班啶ㄠ啶ムた 啶溹ぞ啶ぞ啶イ
+pdfjs-invalid-file-error = 啶ぞ啶灌ぞ啶啶距く啷� 啶忇が啶� 啶椸ぞ啶溹啶班た 啶溹ぞ啶ㄠぞ啶� PDF 啶ぞ啶囙げ
+pdfjs-missing-file-error = 啶椸啶ぞ啶ㄠぞ啶� PDF 啶ぞ啶囙げ
+pdfjs-unexpected-response-error = 啶た啶溹た啶傕ぅ啶苦く啷� 啶膏ぞ啶班啶ぞ啶� 啶た啶ㄠえ啶距く啷�
+pdfjs-rendering-error = 啶た啶侧ぞ啶囙啷� 啶班ぞ啶� 啶膏啶侧ぞ啶え啶距く 啶膏ぎ啶距さ 啶啶ㄠじ啷� 啶椸啶班啶ㄠ啶ムた 啶溹ぞ啶︵啶傕イ
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 啶膏啶︵啶� 啶啶栢啶掂え啶距く]
+
+## Password
+
+pdfjs-password-label = 啶 PDF 啶ぞ啶囙げ啶栢 啶栢啶掂え啷� 啶ぞ啶膏さ啶距ぐ啷嵿ぁ 啶灌ぞ啶す啷嬥イ
+pdfjs-password-invalid = 啶ぞ啶灌ぞ啶啶距く啷� 啶ぞ啶膏さ啶距ぐ啷嵿ぁ啷� 啶呧え啶ㄠぞ啶ㄠ 啶た啶� 啶ㄠぞ啶溹ぞ啷�
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = 啶ㄠ啶掂じ啶�
+pdfjs-web-fonts-disabled = 啶掂啶� 啶え啷嵿啶栢 啶侧啶班が啶距 啶栢ぞ啶侧ぞ啶が啶距く: 啶呧ぐ啶溹ぞ啶す啷嬥え啶距く PDF 啶え啷嵿啶栢 啶ぞ啶灌ぞ啶え啷� 啶灌ぞ啶ぞ啶栢啷�
diff --git a/public/pdfjs/web/locale/bs/viewer.ftl b/public/pdfjs/web/locale/bs/viewer.ftl
new file mode 100644
index 0000000..f0a67ca
--- /dev/null
+++ b/public/pdfjs/web/locale/bs/viewer.ftl
@@ -0,0 +1,588 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Prethodna strana
+pdfjs-previous-button-label = Prethodna
+pdfjs-next-button =
+    .title = Sljede膰a strna
+pdfjs-next-button-label = Sljede膰a
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Strana
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = od { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } od { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Umanji
+pdfjs-zoom-out-button-label = Umanji
+pdfjs-zoom-in-button =
+    .title = Uve膰aj
+pdfjs-zoom-in-button-label = Uve膰aj
+pdfjs-zoom-select =
+    .title = Uve膰anje
+pdfjs-presentation-mode-button =
+    .title = Prebaci se u prezentacijski re啪im
+pdfjs-presentation-mode-button-label = Prezentacijski re啪im
+pdfjs-open-file-button =
+    .title = Otvori fajl
+pdfjs-open-file-button-label = Otvori
+pdfjs-print-button =
+    .title = 艩tampaj
+pdfjs-print-button-label = 艩tampaj
+pdfjs-save-button =
+    .title = Sa膷uvaj
+pdfjs-save-button-label = Sa膷uvaj
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Preuzmi
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Preuzmi
+pdfjs-bookmark-button =
+    .title = Trenutna stranica (Prika啪i URL sa trenutne stranice)
+pdfjs-bookmark-button-label = Trenutna stranica
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Alati
+pdfjs-tools-button-label = Alati
+pdfjs-first-page-button =
+    .title = Idi na prvu stranu
+pdfjs-first-page-button-label = Idi na prvu stranu
+pdfjs-last-page-button =
+    .title = Idi na zadnju stranu
+pdfjs-last-page-button-label = Idi na zadnju stranu
+pdfjs-page-rotate-cw-button =
+    .title = Rotiraj u smjeru kazaljke na satu
+pdfjs-page-rotate-cw-button-label = Rotiraj u smjeru kazaljke na satu
+pdfjs-page-rotate-ccw-button =
+    .title = Rotiraj suprotno smjeru kazaljke na satu
+pdfjs-page-rotate-ccw-button-label = Rotiraj suprotno smjeru kazaljke na satu
+pdfjs-cursor-text-select-tool-button =
+    .title = Omogu膰i alat za ozna膷avanje teksta
+pdfjs-cursor-text-select-tool-button-label = Alat za ozna膷avanje teksta
+pdfjs-cursor-hand-tool-button =
+    .title = Omogu膰i ru膷ni alat
+pdfjs-cursor-hand-tool-button-label = Ru膷ni alat
+pdfjs-scroll-page-button =
+    .title = Koristite pomicanje stranice
+pdfjs-scroll-page-button-label = Pomicanje stranice
+pdfjs-scroll-vertical-button =
+    .title = Koristite vertikalno pomicanje
+pdfjs-scroll-vertical-button-label = Vertikalno pomicanje
+pdfjs-scroll-horizontal-button =
+    .title = Koristite horizontalno pomicanje
+pdfjs-scroll-horizontal-button-label = Horizontalno pomicanje
+pdfjs-scroll-wrapped-button =
+    .title = Koristite omotno pomicanje
+pdfjs-scroll-wrapped-button-label = Omotno pomicanje
+pdfjs-spread-none-button =
+    .title = Ne izra膽uj duplerice
+pdfjs-spread-none-button-label = Bez duplerica
+pdfjs-spread-odd-button =
+    .title = Izradi duplerice koje po膷inju s neparnim stranicama
+pdfjs-spread-odd-button-label = Neparne duplerice
+pdfjs-spread-even-button =
+    .title = Izradi duplerice koje po膷inju s parnim stranicama
+pdfjs-spread-even-button-label = Parne duplerice
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Svojstva dokumenta...
+pdfjs-document-properties-button-label = Svojstva dokumenta...
+pdfjs-document-properties-file-name = Naziv fajla:
+pdfjs-document-properties-file-size = Veli膷ina fajla:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtova)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtova)
+pdfjs-document-properties-title = Naslov:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Predmet:
+pdfjs-document-properties-keywords = Klju膷ne rije膷i:
+pdfjs-document-properties-creation-date = Datum kreiranja:
+pdfjs-document-properties-modification-date = Datum promjene:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Kreator:
+pdfjs-document-properties-producer = PDF stvaratelj:
+pdfjs-document-properties-version = PDF verzija:
+pdfjs-document-properties-page-count = Broj stranica:
+pdfjs-document-properties-page-size = Veli膷ina stranice:
+pdfjs-document-properties-page-size-unit-inches = u
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = uspravno
+pdfjs-document-properties-page-size-orientation-landscape = vodoravno
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Pismo
+pdfjs-document-properties-page-size-name-legal = Pravni
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Brzi web pregled:
+pdfjs-document-properties-linearized-yes = Da
+pdfjs-document-properties-linearized-no = Ne
+pdfjs-document-properties-close-button = Zatvori
+
+## Print
+
+pdfjs-print-progress-message = Pripremam dokument za 拧tampu鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Otka啪i
+pdfjs-printing-not-supported = Upozorenje: 艩tampanje nije u potpunosti podr啪ano u ovom browseru.
+pdfjs-printing-not-ready = Upozorenje: PDF nije u potpunosti u膷itan za 拧tampanje.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Uklju膷i/isklju膷i bo膷nu traku
+pdfjs-toggle-sidebar-notification-button =
+    .title = Uklju膷i/isklju膷i bo膷nu traku (dokument sadr啪i obris/priloge/slojeve)
+pdfjs-toggle-sidebar-button-label = Uklju膷i/isklju膷i bo膷nu traku
+pdfjs-document-outline-button =
+    .title = Prika啪i outline dokumenta (dvoklik za skupljanje/拧irenje svih stavki)
+pdfjs-document-outline-button-label = Konture dokumenta
+pdfjs-attachments-button =
+    .title = Prika啪i priloge
+pdfjs-attachments-button-label = Prilozi
+pdfjs-layers-button =
+    .title = Prika啪i slojeve (dvostruki klik da biste vratili sve slojeve na zadano stanje)
+pdfjs-layers-button-label = Slojevi
+pdfjs-thumbs-button =
+    .title = Prika啪i thumbnailove
+pdfjs-thumbs-button-label = Thumbnailovi
+pdfjs-current-outline-item-button =
+    .title = Prona膽i trenutnu stavku strukture
+pdfjs-current-outline-item-button-label = Trenutna stavka strukture
+pdfjs-findbar-button =
+    .title = Prona膽i u dokumentu
+pdfjs-findbar-button-label = Prona膽i
+pdfjs-additional-layers = Dodatni slojevi
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Strana { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Thumbnail strane { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Prona膽i
+    .placeholder = Prona膽i u dokumentu鈥�
+pdfjs-find-previous-button =
+    .title = Prona膽i prethodno pojavljivanje fraze
+pdfjs-find-previous-button-label = Prethodno
+pdfjs-find-next-button =
+    .title = Prona膽i sljede膰e pojavljivanje fraze
+pdfjs-find-next-button-label = Sljede膰e
+pdfjs-find-highlight-checkbox = Ozna膷i sve
+pdfjs-find-match-case-checkbox-label = Osjetljivost na karaktere
+pdfjs-find-match-diacritics-checkbox-label = Podudaranje dijakritika
+pdfjs-find-entire-word-checkbox-label = Cijele rije膷i
+pdfjs-find-reached-top = Dostigao sam vrh dokumenta, nastavljam sa dna
+pdfjs-find-reached-bottom = Dostigao sam kraj dokumenta, nastavljam sa vrha
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } od { $total } podudaranje
+        [few] { $current } od { $total } podudaranja
+       *[other] { $current } od { $total } podudaranja
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Vi拧e od { $limit } podudaranja
+        [few] Vi拧e od { $limit } podudaranja
+       *[other] Vi拧e od { $limit } podudaranja
+    }
+pdfjs-find-not-found = Fraza nije prona膽ena
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 艩irina strane
+pdfjs-page-scale-fit = Uklopi stranu
+pdfjs-page-scale-auto = Automatsko uve膰anje
+pdfjs-page-scale-actual = Stvarna veli膷ina
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Stranica { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Do拧lo je do gre拧ke prilikom u膷itavanja PDF-a.
+pdfjs-invalid-file-error = Neispravan ili o拧te膰en PDF fajl.
+pdfjs-missing-file-error = Nedostaje PDF fajl.
+pdfjs-unexpected-response-error = Neo膷ekivani odgovor servera.
+pdfjs-rendering-error = Do拧lo je do gre拧ke prilikom renderiranja strane.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } pribilje拧ka]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Upi拧ite lozinku da biste otvorili ovaj PDF fajl.
+pdfjs-password-invalid = Pogre拧na lozinka. Poku拧ajte ponovo.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Otka啪i
+pdfjs-web-fonts-disabled = Web fontovi su onemogu膰eni: nemogu膰e koristiti uba膷ene PDF fontove.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Crtanje
+pdfjs-editor-ink-button-label = Crtanje
+pdfjs-editor-stamp-button =
+    .title = Dodajte ili uredite slike
+pdfjs-editor-stamp-button-label = Dodajte ili uredite slike
+pdfjs-editor-highlight-button =
+    .title = Istaknite
+pdfjs-editor-highlight-button-label = Istaknite
+pdfjs-highlight-floating-button1 =
+    .title = Istaknite
+    .aria-label = Istaknite
+pdfjs-highlight-floating-button-label = Istaknite
+pdfjs-editor-signature-button =
+    .title = Dodaj potpis
+pdfjs-editor-signature-button-label = Dodaj potpis
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Ure膽iva膷 istaknutih elemenata
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Ure膽iva膷 crte啪a
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Ure膽iva膷 potpisa: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Ure膽iva膷 slika
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Ukloni crte啪
+pdfjs-editor-remove-freetext-button =
+    .title = Ukloni tekst
+pdfjs-editor-remove-stamp-button =
+    .title = Ukloni sliku
+pdfjs-editor-remove-highlight-button =
+    .title = Ukloni istaknuti dio
+pdfjs-editor-remove-signature-button =
+    .title = Ukloni potpis
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Boja
+pdfjs-editor-free-text-size-input = Veli膷ina
+pdfjs-editor-ink-color-input = Boja
+pdfjs-editor-ink-thickness-input = Debljina
+pdfjs-editor-ink-opacity-input = Neprozirnost
+pdfjs-editor-stamp-add-image-button =
+    .title = Dodaj sliku
+pdfjs-editor-stamp-add-image-button-label = Dodaj sliku
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Debljina
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Promijenite debljinu prilikom ozna膷avanja stavki koje nisu tekst
+pdfjs-editor-add-signature-container =
+    .aria-label = Kontrole potpisa i sa膷uvani potpisi
+pdfjs-editor-signature-add-signature-button =
+    .title = Dodaj novi potpis
+pdfjs-editor-signature-add-signature-button-label = Dodaj novi potpis
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Sa膷uvani potpis: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Ure膽iva膷 teksta
+    .default-content = Po膷nite kucati鈥�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternativni tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Uredi alternativni tekst
+pdfjs-editor-alt-text-dialog-label = Odaberite opciju
+pdfjs-editor-alt-text-dialog-description = Alternativni tekst (Alt tekst) poma啪e kada ljudi ne mogu vidjeti sliku ili kada se ona ne u膷itava.
+pdfjs-editor-alt-text-add-description-label = Dodajte opis
+pdfjs-editor-alt-text-add-description-description = Ciljajte na 1-2 re膷enice koje opisuju temu, okru啪enje ili radnju.
+pdfjs-editor-alt-text-mark-decorative-label = Ozna膷i kao dekorativno
+pdfjs-editor-alt-text-mark-decorative-description = Ovo se koristi za ukrasne slike, poput okvira ili vodenih 啪igova.
+pdfjs-editor-alt-text-cancel-button = Otka啪i
+pdfjs-editor-alt-text-save-button = Sa膷uvaj
+pdfjs-editor-alt-text-decorative-tooltip = Ozna膷eno kao dekorativno
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Na primjer, 鈥濵ladi膰 sjeda za stol da jede obrok鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternativni tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Gornji lijevi ugao 鈥� promjena veli膷ine
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Gore u sredini 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-top-right =
+    .aria-label = Gornji desni ugao 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Sredina desno 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Donji desni ugao 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Donji srednji dio 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Donji lijevi ugao 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Sredina lijevo 鈥� promijeni veli膷inu
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Boja isticanja
+pdfjs-editor-colorpicker-button =
+    .title = Promijeni boju
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Izbor boja
+pdfjs-editor-colorpicker-yellow =
+    .title = 沤uta
+pdfjs-editor-colorpicker-green =
+    .title = Zelena
+pdfjs-editor-colorpicker-blue =
+    .title = Plava
+pdfjs-editor-colorpicker-pink =
+    .title = Roza
+pdfjs-editor-colorpicker-red =
+    .title = Crvena
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Prika啪i sve
+pdfjs-editor-highlight-show-all-button =
+    .title = Prika啪i sve
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Uredi alternativni tekst (opis slike)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Dodaj alternativni tekst (opis slike)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Ovdje napi拧ite svoj opis鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kratak opis za osobe koje ne mogu vidjeti sliku ili kada se slika ne u膷itava.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Ovaj alternativni tekst je kreiran automatski i mogu膰e je da je neta膷an.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saznajte vi拧e
+pdfjs-editor-new-alt-text-create-automatically-button-label = Automatski kreiraj alternativni tekst
+pdfjs-editor-new-alt-text-not-now-button = Ne sada
+pdfjs-editor-new-alt-text-error-title = Nije mogu膰e automatski kreirati alternativni tekst
+pdfjs-editor-new-alt-text-error-description = Molimo vas da napi拧ete vlastiti alternativni tekst ili poku拧ate ponovo kasnije.
+pdfjs-editor-new-alt-text-error-close-button = Zatvori
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Preuzimanje alternativnog tekstualnog AI modela ({ $downloadedSize } od { $totalSize } MB)
+    .aria-valuetext = Preuzimanje alternativnog tekstualnog AI modela ({ $downloadedSize } od { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativni tekst je dodan
+pdfjs-editor-new-alt-text-added-button-label = Alternativni tekst je dodan
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Nedostaje alternativni tekst
+pdfjs-editor-new-alt-text-missing-button-label = Nedostaje alternativni tekst
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Alternativni tekst recenzije
+pdfjs-editor-new-alt-text-to-review-button-label = Alternativni tekst recenzije
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatski kreirano: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Postavke alternativnog teksta slike
+pdfjs-image-alt-text-settings-button-label = Postavke alternativnog teksta slike
+pdfjs-editor-alt-text-settings-dialog-label = Postavke alternativnog teksta slike
+pdfjs-editor-alt-text-settings-automatic-title = Automatski alternativni tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Automatski kreiraj alternativni tekst
+pdfjs-editor-alt-text-settings-create-model-description = Predla啪e opise kako bi pomogao ljudima koji ne vide sliku ili kada se slika ne u膷itava.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Alternativni tekst AI model ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Radi lokalno na va拧em ure膽aju tako da va拧i podaci ostaju privatni. Potrebno za automatski alternativni tekst.
+pdfjs-editor-alt-text-settings-delete-model-button = Izbri拧i
+pdfjs-editor-alt-text-settings-download-model-button = Preuzmi
+pdfjs-editor-alt-text-settings-downloading-model-button = Preuzimam鈥�
+pdfjs-editor-alt-text-settings-editor-title = Ure膽iva膷 alternativnog teksta
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Odmah prika啪i ure膽iva膷 alternativnog teksta prilikom dodavanja slike
+pdfjs-editor-alt-text-settings-show-dialog-description = Poma啪e vam da osigurate da sve va拧e slike imaju alternativni tekst.
+pdfjs-editor-alt-text-settings-close-button = Zatvori
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Istaknuto je uklonjeno
+pdfjs-editor-undo-bar-message-freetext = Tekst uklonjen
+pdfjs-editor-undo-bar-message-ink = Crte啪 uklonjen
+pdfjs-editor-undo-bar-message-stamp = Slika uklonjena
+pdfjs-editor-undo-bar-message-signature = Potpis uklonjen
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } bilje拧ka uklonjena
+        [few] { $count } bilje拧ke uklonjene
+       *[other] { $count } bilje拧ki uklonjeno
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Poni拧ti
+pdfjs-editor-undo-bar-undo-button-label = Poni拧ti
+pdfjs-editor-undo-bar-close-button =
+    .title = Zatvori
+pdfjs-editor-undo-bar-close-button-label = Zatvori
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Ovaj modalni prozor omogu膰ava korisniku da kreira potpis koji 膰e dodati PDF dokumentu. Korisnik mo啪e urediti ime (koje slu啪i i kao alternativni tekst) i opcionalno sa膷uvati potpis za ponovnu upotrebu.
+pdfjs-editor-add-signature-dialog-title = Dodaj potpis
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Ukucaj
+    .title = Ukucaj
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Napi拧i
+    .title = Napi拧i
+pdfjs-editor-add-signature-image-button = Slika
+    .title = Slika
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Ukucajte svoj potpis
+    .placeholder = Ukucajte svoj potpis
+pdfjs-editor-add-signature-draw-placeholder = Napi拧ite svoj potpis
+pdfjs-editor-add-signature-draw-thickness-range-label = Debljina
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Debljina pisanja: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Prevucite datoteku ovdje da biste je u膷itali
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ili odaberite slikovne datoteke
+       *[other] Ili pregledajte slikovne datoteke
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Opis (alternativni tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Opis (alternativni tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Potpis
+pdfjs-editor-add-signature-clear-button-label = O膷isti potpis
+pdfjs-editor-add-signature-clear-button =
+    .title = O膷isti potpis
+pdfjs-editor-add-signature-save-checkbox = Sa膷uvaj potpis
+pdfjs-editor-add-signature-save-warning-message = Dostigli ste ograni膷enje od 5 sa膷uvanih potpisa. Uklonite jedan da biste sa膷uvali vi拧e.
+pdfjs-editor-add-signature-image-upload-error-title = Nije mogu膰e u膷itati sliku
+pdfjs-editor-add-signature-image-upload-error-description = Provjerite mre啪nu vezu ili poku拧ajte s drugom slikom.
+pdfjs-editor-add-signature-image-no-data-error-title = Nije mogu膰e pretvoriti ovu sliku u potpis
+pdfjs-editor-add-signature-image-no-data-error-description = Molimo poku拧ajte u膷itati drugu sliku.
+pdfjs-editor-add-signature-error-close-button = Zatvori
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Otka啪i
+pdfjs-editor-add-signature-add-button = Dodaj
+pdfjs-editor-edit-signature-update-button = A啪uriraj
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Ukloni sa膷uvani potpis
+pdfjs-editor-delete-signature-button-label1 = Ukloni sa膷uvani potpis
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Uredi opis
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Uredi opis
diff --git a/public/pdfjs/web/locale/ca/viewer.ftl b/public/pdfjs/web/locale/ca/viewer.ftl
new file mode 100644
index 0000000..4e0d9cb
--- /dev/null
+++ b/public/pdfjs/web/locale/ca/viewer.ftl
@@ -0,0 +1,274 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P脿gina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = P脿gina seg眉ent
+pdfjs-next-button-label = Seg眉ent
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P脿gina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Redueix
+pdfjs-zoom-out-button-label = Redueix
+pdfjs-zoom-in-button =
+    .title = Amplia
+pdfjs-zoom-in-button-label = Amplia
+pdfjs-zoom-select =
+    .title = Escala
+pdfjs-presentation-mode-button =
+    .title = Canvia al mode de presentaci贸
+pdfjs-presentation-mode-button-label = Mode de presentaci贸
+pdfjs-open-file-button =
+    .title = Obre el fitxer
+pdfjs-open-file-button-label = Obre
+pdfjs-print-button =
+    .title = Imprimeix
+pdfjs-print-button-label = Imprimeix
+pdfjs-save-button =
+    .title = Desa
+pdfjs-save-button-label = Desa
+pdfjs-bookmark-button =
+    .title = P脿gina actual (mostra l'URL de la p脿gina actual)
+pdfjs-bookmark-button-label = P脿gina actual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Eines
+pdfjs-tools-button-label = Eines
+pdfjs-first-page-button =
+    .title = V茅s a la primera p脿gina
+pdfjs-first-page-button-label = V茅s a la primera p脿gina
+pdfjs-last-page-button =
+    .title = V茅s a l'煤ltima p脿gina
+pdfjs-last-page-button-label = V茅s a l'煤ltima p脿gina
+pdfjs-page-rotate-cw-button =
+    .title = Gira cap a la dreta
+pdfjs-page-rotate-cw-button-label = Gira cap a la dreta
+pdfjs-page-rotate-ccw-button =
+    .title = Gira cap a l'esquerra
+pdfjs-page-rotate-ccw-button-label = Gira cap a l'esquerra
+pdfjs-cursor-text-select-tool-button =
+    .title = Habilita l'eina de selecci贸 de text
+pdfjs-cursor-text-select-tool-button-label = Eina de selecci贸 de text
+pdfjs-cursor-hand-tool-button =
+    .title = Habilita l'eina de m脿
+pdfjs-cursor-hand-tool-button-label = Eina de m脿
+pdfjs-scroll-page-button =
+    .title = Usa el despla莽ament de p脿gina
+pdfjs-scroll-page-button-label = Despla莽ament de p脿gina
+pdfjs-scroll-vertical-button =
+    .title = Utilitza el despla莽ament vertical
+pdfjs-scroll-vertical-button-label = Despla莽ament vertical
+pdfjs-scroll-horizontal-button =
+    .title = Utilitza el despla莽ament horitzontal
+pdfjs-scroll-horizontal-button-label = Despla莽ament horitzontal
+pdfjs-scroll-wrapped-button =
+    .title = Activa el despla莽ament continu
+pdfjs-scroll-wrapped-button-label = Despla莽ament continu
+pdfjs-spread-none-button =
+    .title = No agrupis les p脿gines de dues en dues
+pdfjs-spread-none-button-label = Una sola p脿gina
+pdfjs-spread-odd-button =
+    .title = Mostra dues p脿gines comen莽ant per les p脿gines de numeraci贸 senar
+pdfjs-spread-odd-button-label = Doble p脿gina (senar)
+pdfjs-spread-even-button =
+    .title = Mostra dues p脿gines comen莽ant per les p脿gines de numeraci贸 parell
+pdfjs-spread-even-button-label = Doble p脿gina (parell)
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propietats del document鈥�
+pdfjs-document-properties-button-label = Propietats del document鈥�
+pdfjs-document-properties-file-name = Nom del fitxer:
+pdfjs-document-properties-file-size = Mida del fitxer:
+pdfjs-document-properties-title = T铆tol:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Assumpte:
+pdfjs-document-properties-keywords = Paraules clau:
+pdfjs-document-properties-creation-date = Data de creaci贸:
+pdfjs-document-properties-modification-date = Data de modificaci贸:
+pdfjs-document-properties-creator = Creador:
+pdfjs-document-properties-producer = Generador de PDF:
+pdfjs-document-properties-version = Versi贸 de PDF:
+pdfjs-document-properties-page-count = Nombre de p脿gines:
+pdfjs-document-properties-page-size = Mida de la p脿gina:
+pdfjs-document-properties-page-size-unit-inches = polzades
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = apa茂sat
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista web r脿pida:
+pdfjs-document-properties-linearized-yes = S铆
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Tanca
+
+## Print
+
+pdfjs-print-progress-message = S'est脿 preparant la impressi贸 del document鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancel路la
+pdfjs-printing-not-supported = Av铆s: la impressi贸 no 茅s plenament funcional en aquest navegador.
+pdfjs-printing-not-ready = Atenci贸: el PDF no s'ha acabat de carregar per imprimir-lo.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Mostra/amaga la barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Mostra/amaga la barra lateral (el document cont茅 un esquema, adjuncions o capes)
+pdfjs-toggle-sidebar-button-label = Mostra/amaga la barra lateral
+pdfjs-document-outline-button =
+    .title = Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements)
+pdfjs-document-outline-button-label = Esquema del document
+pdfjs-attachments-button =
+    .title = Mostra les adjuncions
+pdfjs-attachments-button-label = Adjuncions
+pdfjs-layers-button =
+    .title = Mostra les capes (doble clic per restablir totes les capes al seu estat per defecte)
+pdfjs-layers-button-label = Capes
+pdfjs-thumbs-button =
+    .title = Mostra les miniatures
+pdfjs-thumbs-button-label = Miniatures
+pdfjs-current-outline-item-button =
+    .title = Cerca l'element d'esquema actual
+pdfjs-current-outline-item-button-label = Element d'esquema actual
+pdfjs-findbar-button =
+    .title = Cerca al document
+pdfjs-findbar-button-label = Cerca
+pdfjs-additional-layers = Capes addicionals
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P脿gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura de la p脿gina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Cerca
+    .placeholder = Cerca al document鈥�
+pdfjs-find-previous-button =
+    .title = Cerca l'anterior coincid猫ncia de l'expressi贸
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button =
+    .title = Cerca la seg眉ent coincid猫ncia de l'expressi贸
+pdfjs-find-next-button-label = Seg眉ent
+pdfjs-find-highlight-checkbox = Ressalta-ho tot
+pdfjs-find-match-case-checkbox-label = Distingeix entre maj煤scules i min煤scules
+pdfjs-find-match-diacritics-checkbox-label = Respecta els diacr铆tics
+pdfjs-find-entire-word-checkbox-label = Paraules senceres
+pdfjs-find-reached-top = S'ha arribat al principi del document, es continua pel final
+pdfjs-find-reached-bottom = S'ha arribat al final del document, es continua pel principi
+pdfjs-find-not-found = No s'ha trobat l'expressi贸
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Amplada de la p脿gina
+pdfjs-page-scale-fit = Ajusta la p脿gina
+pdfjs-page-scale-auto = Zoom autom脿tic
+pdfjs-page-scale-actual = Mida real
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P脿gina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = S'ha produ茂t un error en carregar el PDF.
+pdfjs-invalid-file-error = El fitxer PDF no 茅s v脿lid o est脿 malm猫s.
+pdfjs-missing-file-error = Falta el fitxer PDF.
+pdfjs-unexpected-response-error = Resposta inesperada del servidor.
+pdfjs-rendering-error = S'ha produ茂t un error mentre es renderitzava la p脿gina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotaci贸 { $type }]
+
+## Password
+
+pdfjs-password-label = Introdu茂u la contrasenya per obrir aquest fitxer PDF.
+pdfjs-password-invalid = La contrasenya no 茅s v脿lida. Torneu-ho a provar.
+pdfjs-password-ok-button = D'acord
+pdfjs-password-cancel-button = Cancel路la
+pdfjs-web-fonts-disabled = Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra incrustats al PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Dibuixa
+pdfjs-editor-ink-button-label = Dibuixa
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Color
+pdfjs-editor-free-text-size-input = Mida
+pdfjs-editor-ink-color-input = Color
+pdfjs-editor-ink-thickness-input = Gruix
+pdfjs-editor-ink-opacity-input = Opacitat
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-cancel-button = Cancel路la
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancel路la
diff --git a/public/pdfjs/web/locale/cak/viewer.ftl b/public/pdfjs/web/locale/cak/viewer.ftl
new file mode 100644
index 0000000..3f9c6a2
--- /dev/null
+++ b/public/pdfjs/web/locale/cak/viewer.ftl
@@ -0,0 +1,264 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Jun kan ruxaq
+pdfjs-previous-button-label = Jun kan
+pdfjs-next-button =
+    .title = Jun chik ruxaq
+pdfjs-next-button-label = Jun chik
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Ruxaq
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = richin { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } richin { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Tich'utiniris盲x
+pdfjs-zoom-out-button-label = Tich'utiniris盲x
+pdfjs-zoom-in-button =
+    .title = Tinimiris盲x
+pdfjs-zoom-in-button-label = Tinimiris盲x
+pdfjs-zoom-select =
+    .title = Sum
+pdfjs-presentation-mode-button =
+    .title = Tijal ri rub'anikil niwachin
+pdfjs-presentation-mode-button-label = Pa rub'eyal niwachin
+pdfjs-open-file-button =
+    .title = Tijaq Yakb'盲l
+pdfjs-open-file-button-label = Tijaq
+pdfjs-print-button =
+    .title = Titz'ajb'盲x
+pdfjs-print-button-label = Titz'ajb'盲x
+pdfjs-save-button =
+    .title = Tiyak
+pdfjs-save-button-label = Tiyak
+pdfjs-bookmark-button-label = Ruxaq k'o wakami
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Samajib'盲l
+pdfjs-tools-button-label = Samajib'盲l
+pdfjs-first-page-button =
+    .title = Tib'e pa nab'ey ruxaq
+pdfjs-first-page-button-label = Tib'e pa nab'ey ruxaq
+pdfjs-last-page-button =
+    .title = Tib'e pa ruk'isib'盲l ruxaq
+pdfjs-last-page-button-label = Tib'e pa ruk'isib'盲l ruxaq
+pdfjs-page-rotate-cw-button =
+    .title = Tisut茂x pan ajkiq'a'
+pdfjs-page-rotate-cw-button-label = Tisut茂x pan ajkiq'a'
+pdfjs-page-rotate-ccw-button =
+    .title = Tisut茂x pan ajxokon
+pdfjs-page-rotate-ccw-button-label = Tisut茂x pan ajxokon
+pdfjs-cursor-text-select-tool-button =
+    .title = Titzij ri rusamajib'al Rucha'ik Rucholajem Tzij
+pdfjs-cursor-text-select-tool-button-label = Rusamajib'al Rucha'ik Rucholajem Tzij
+pdfjs-cursor-hand-tool-button =
+    .title = Titzij ri q'ab'aj samajib'盲l
+pdfjs-cursor-hand-tool-button-label = Q'ab'aj Samajib'盲l
+pdfjs-scroll-page-button =
+    .title = Tokis盲x Ruxaq Q'axanem
+pdfjs-scroll-page-button-label = Ruxaq Q'axanem
+pdfjs-scroll-vertical-button =
+    .title = Tokis盲x Pa'盲l Q'axanem
+pdfjs-scroll-vertical-button-label = Pa'盲l Q'axanem
+pdfjs-scroll-horizontal-button =
+    .title = Tokis盲x Kotz'枚l Q'axanem
+pdfjs-scroll-horizontal-button-label = Kotz'枚l Q'axanem
+pdfjs-scroll-wrapped-button =
+    .title = Tokis盲x Tzub'aj Q'axanem
+pdfjs-scroll-wrapped-button-label = Tzub'aj Q'axanem
+pdfjs-spread-none-button =
+    .title = Man ketun taq ruxaq pa rub'eyal wuj
+pdfjs-spread-none-button-label = Majun Rub'eyal
+pdfjs-spread-odd-button =
+    .title = Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun man k'ulaj ta rajilab'al
+pdfjs-spread-odd-button-label = Man K'ulaj Ta Rub'eyal
+pdfjs-spread-even-button =
+    .title = Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun k'ulaj rajilab'al
+pdfjs-spread-even-button-label = K'ulaj Rub'eyal
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Taq richinil wuj鈥�
+pdfjs-document-properties-button-label = Taq richinil wuj鈥�
+pdfjs-document-properties-file-name = Rub'i' yakb'盲l:
+pdfjs-document-properties-file-size = Runimilem yakb'盲l:
+pdfjs-document-properties-title = B'i'aj:
+pdfjs-document-properties-author = B'anel:
+pdfjs-document-properties-subject = Taqikil:
+pdfjs-document-properties-keywords = Kixe'el taq tzij:
+pdfjs-document-properties-creation-date = Ruq'ijul xtz'uk:
+pdfjs-document-properties-modification-date = Ruq'ijul xjalwach茂x:
+pdfjs-document-properties-creator = Q'inonel:
+pdfjs-document-properties-producer = PDF b'an枚y:
+pdfjs-document-properties-version = PDF ruw盲ch:
+pdfjs-document-properties-page-count = Jarupe' ruxaq:
+pdfjs-document-properties-page-size = Runimilem ri Ruxaq:
+pdfjs-document-properties-page-size-unit-inches = pa
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = rupalem
+pdfjs-document-properties-page-size-orientation-landscape = rukotz'olem
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Loman wuj
+pdfjs-document-properties-page-size-name-legal = Taqanel tzijol
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Anin Rutz'etik Ajk'amaya'l:
+pdfjs-document-properties-linearized-yes = Ja'
+pdfjs-document-properties-linearized-no = Mani
+pdfjs-document-properties-close-button = Titz'ap茂x
+
+## Print
+
+pdfjs-print-progress-message = Ruchojmirisaxik wuj richin nitz'ajb'盲x鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Tiq'at
+pdfjs-printing-not-supported = Rutzijol k'ayewal: Ri rutz'ajb'axik man koch'el ta ronojel pa re okik'amaya'l re'.
+pdfjs-printing-not-ready = Rutzijol k'ayewal: Ri PDF man xusamajij ta ronojel richin nitz'ajb'盲x.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Tijal ri ajxikin kajtz'ik
+pdfjs-toggle-sidebar-notification-button =
+    .title = Tik'ex ri ajxikin yuqkajtz'ik (ri wuj eruk'wan taq ruchi'/taqo/kuchuj)
+pdfjs-toggle-sidebar-button-label = Tijal ri ajxikin kajtz'ik
+pdfjs-document-outline-button =
+    .title = Tik'ut pe ruch'akulal wuj (kamul-pitz'oj richin nirik'/nich'utiniris盲x ronojel ruch'akulal)
+pdfjs-document-outline-button-label = Ruch'akulal wuj
+pdfjs-attachments-button =
+    .title = Kek'ut pe ri taq taqoj
+pdfjs-attachments-button-label = Taq taqoj
+pdfjs-layers-button =
+    .title = Kek'ut taq Kuchuj (ka'i'-pitz' richin yetzol茂x ronojel ri taq kuchuj e k'o wi)
+pdfjs-layers-button-label = Taq kuchuj
+pdfjs-thumbs-button =
+    .title = Kek'ut pe taq ch'utiq
+pdfjs-thumbs-button-label = Kok枚j
+pdfjs-current-outline-item-button =
+    .title = Kekan枚x  Taq Ch'akulal Kik'wan Chib'盲l
+pdfjs-current-outline-item-button-label = Taq Ch'akulal Kik'wan Chib'盲l
+pdfjs-findbar-button =
+    .title = Tikan枚x chupam ri wuj
+pdfjs-findbar-button-label = Tikan枚x
+pdfjs-additional-layers = Tz'aqat ta Kuchuj
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Ruxaq { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Ruch'utinirisaxik ruxaq { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Tikan枚x
+    .placeholder = Tikan枚x pa wuj鈥�
+pdfjs-find-previous-button =
+    .title = Tib'an b'enam pa ri jun kan q'aptzij xilit盲j
+pdfjs-find-previous-button-label = Jun kan
+pdfjs-find-next-button =
+    .title = Tib'e pa ri jun chik pajtzij xilit盲j
+pdfjs-find-next-button-label = Jun chik
+pdfjs-find-highlight-checkbox = Tiya' retal ronojel
+pdfjs-find-match-case-checkbox-label = Tuk'盲m ri' kik'in taq nimatz'ib' chuqa' taq ch'utitz'ib'
+pdfjs-find-match-diacritics-checkbox-label = Tiya' Kikojol Tz'aqat taq Tz'ib'
+pdfjs-find-entire-word-checkbox-label = Tz'aq盲t taq tzij
+pdfjs-find-reached-top = Xb'eq'i' ri rutikirib'al wuj, xtikan枚x k'a pa ruk'isib'盲l
+pdfjs-find-reached-bottom = Xb'eq'i' ri ruk'isib'盲l wuj, xtikan枚x pa rutikirib'al
+pdfjs-find-not-found = Man xilit盲j ta ri pajtzij
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Ruwa ruxaq
+pdfjs-page-scale-fit = Tinuk' ruxaq
+pdfjs-page-scale-auto = Yonil chi nimilem
+pdfjs-page-scale-actual = Runimilem Wakami
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Ruxaq { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Xk'ulwachit盲j jun sach'oj toq xnuk'ux ri PDF .
+pdfjs-invalid-file-error = Man oke ta o yujtajin盲q ri PDF yakb'盲l.
+pdfjs-missing-file-error = Man xilit盲j ta ri PDF yakb'盲l.
+pdfjs-unexpected-response-error = Man oyob'en ta tz'olin rutzij ruk'u'x samaj.
+pdfjs-rendering-error = Xk'ulwachit盲j jun sachoj toq ninuk'wachij ri ruxaq.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Tz'ib'an茂k]
+
+## Password
+
+pdfjs-password-label = Tatz'ib'aj ri ewan tzij richin naj盲q re yakb'盲l re' pa PDF.
+pdfjs-password-invalid = Man okel ta ri ewan tzij: Tatojtob'ej chik.
+pdfjs-password-ok-button = 脺tz
+pdfjs-password-cancel-button = Tiq'at
+pdfjs-web-fonts-disabled = E chup眉l ri taq ajk'amaya'l tz'ib': man tikirel ta nokis盲x ri taq tz'ib' PDF pa ch'iken茂k
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Rucholajem tz'ib'
+pdfjs-editor-free-text-button-label = Rucholajem tz'ib'
+pdfjs-editor-ink-button =
+    .title = Tiwachib'毛x
+pdfjs-editor-ink-button-label = Tiwachib'毛x
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = B'onil
+pdfjs-editor-free-text-size-input = Nimilem
+pdfjs-editor-ink-color-input = B'onil
+pdfjs-editor-ink-thickness-input = Rupimil
+pdfjs-editor-ink-opacity-input = Q'equmal
diff --git a/public/pdfjs/web/locale/ckb/viewer.ftl b/public/pdfjs/web/locale/ckb/viewer.ftl
new file mode 100644
index 0000000..73f9e86
--- /dev/null
+++ b/public/pdfjs/web/locale/ckb/viewer.ftl
@@ -0,0 +1,213 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 倬蹠跁蹠蹖 倬蹘卮賵賵
+pdfjs-previous-button-label = 倬蹘卮賵賵
+pdfjs-next-button =
+    .title = 倬蹠跁蹠蹖 丿賵賵丕鬲乇
+pdfjs-next-button-label = 丿賵賵丕鬲乇
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 倬蹠乇蹠
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 賱蹠 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 賱蹠 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 跁蹎趩賵賵賳蹖
+pdfjs-zoom-out-button-label = 跁蹎趩賵賵賳蹖
+pdfjs-zoom-in-button =
+    .title = 賴蹘賳丕賳蹠倬蹘卮
+pdfjs-zoom-in-button-label = 賴蹘賳丕賳蹠倬蹘卮
+pdfjs-zoom-select =
+    .title = 夭賵賵賲
+pdfjs-presentation-mode-button =
+    .title = 诏蹎跁蹖賳 亘蹎 丿蹎禺蹖 倬蹘卮讴蹠卮讴乇丿賳
+pdfjs-presentation-mode-button-label = 丿蹎禺蹖 倬蹘卮讴蹠卮讴乇丿賳
+pdfjs-open-file-button =
+    .title = 倬蹠跁诏蹠 亘讴蹠乇蹠賵蹠
+pdfjs-open-file-button-label = 讴乇丿賳蹠賵蹠
+pdfjs-print-button =
+    .title = 趩丕倬讴乇丿賳
+pdfjs-print-button-label = 趩丕倬讴乇丿賳
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 卅丕賲乇丕夭蹠讴丕賳
+pdfjs-tools-button-label = 卅丕賲乇丕夭蹠讴丕賳
+pdfjs-first-page-button =
+    .title = 亘乇蹎 亘蹎 蹖蹠讴蹠賲 倬蹠跁蹠
+pdfjs-first-page-button-label = 亘跁蹎 亘蹎 蹖蹠讴蹠賲 倬蹠跁蹠
+pdfjs-last-page-button =
+    .title = 亘跁蹎 亘蹎 讴蹎鬲丕 倬蹠跁蹠
+pdfjs-last-page-button-label = 亘跁蹎 亘蹎 讴蹎鬲丕 倬蹠跁蹠
+pdfjs-page-rotate-cw-button =
+    .title = 卅丕跁丕爻鬲蹠蹖 賲蹖賱蹖 讴丕鬲跇賲蹘乇
+pdfjs-page-rotate-cw-button-label = 卅丕跁丕爻鬲蹠蹖 賲蹖賱蹖 讴丕鬲跇賲蹘乇
+pdfjs-page-rotate-ccw-button =
+    .title = 倬蹘趩蹠賵丕賳蹠蹖 賲蹖賱蹖 讴丕鬲跇賲蹘乇
+pdfjs-page-rotate-ccw-button-label = 倬蹘趩蹠賵丕賳蹠蹖 賲蹖賱蹖 讴丕鬲跇賲蹘乇
+pdfjs-cursor-text-select-tool-button =
+    .title = 鬲賵诘丕賲乇丕夭蹖 賳蹖卮丕賳讴蹠乇蹖 丿蹠賯 趩丕賱丕讴 亘讴蹠
+pdfjs-cursor-text-select-tool-button-label = 鬲賵诘丕賲乇丕夭蹖 賳蹖卮丕賳讴蹠乇蹖 丿蹠賯
+pdfjs-cursor-hand-tool-button =
+    .title = 鬲賵诘丕賲乇丕夭蹖 丿蹠爻鬲蹖 趩丕賱丕讴 亘讴蹠
+pdfjs-cursor-hand-tool-button-label = 鬲賵诘丕賲乇丕夭蹖 丿蹠爻鬲蹖
+pdfjs-scroll-vertical-button =
+    .title = 賳丕乇丿賳蹖 卅蹠爻鬲賵賵賳蹖 亘蹠讴丕乇亘蹘賳蹠
+pdfjs-scroll-vertical-button-label = 賳丕乇丿賳蹖 卅蹠爻鬲賵賵賳蹖
+pdfjs-scroll-horizontal-button =
+    .title = 賳丕乇丿賳蹖 卅丕爻蹎蹖蹖 亘蹠讴丕乇亘蹘賳蹠
+pdfjs-scroll-horizontal-button-label = 賳丕乇丿賳蹖 卅丕爻蹎蹖蹖
+pdfjs-scroll-wrapped-button =
+    .title = 賳丕乇丿賳蹖 賱賵賵賱讴乇丕賵 亘蹠讴丕乇亘蹘賳蹠
+pdfjs-scroll-wrapped-button-label = 賳丕乇丿賳蹖 賱賵賵賱讴乇丕賵
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 鬲丕蹖亘蹠鬲賲蹠賳丿蹖蹖蹠讴丕賳蹖 亘蹠诘诏蹠賳丕賲蹠...
+pdfjs-document-properties-button-label = 鬲丕蹖亘蹠鬲賲蹠賳丿蹖蹖蹠讴丕賳蹖 亘蹠诘诏蹠賳丕賲蹠...
+pdfjs-document-properties-file-name = 賳丕賵蹖 倬蹠跁诏蹠:
+pdfjs-document-properties-file-size = 賯蹠亘丕乇蹠蹖 倬蹠跁诏蹠:
+pdfjs-document-properties-title = 爻蹠乇丿蹘跁:
+pdfjs-document-properties-author = 賳賵賵爻蹠乇
+pdfjs-document-properties-subject = 亘丕亘蹠鬲:
+pdfjs-document-properties-keywords = 讴賱蹖賱蹠賵卮蹠:
+pdfjs-document-properties-creation-date = 亘蹠乇賵丕乇蹖 丿乇賵賵爻鬲讴乇丿賳:
+pdfjs-document-properties-modification-date = 亘蹠乇賵丕乇蹖 丿蹠爻鬲讴丕乇蹖讴乇丿賳:
+pdfjs-document-properties-creator = 丿乇賵賵爻鬲讴蹠乇:
+pdfjs-document-properties-producer = 亘蹠乇賴蹠賲賴蹘賳蹠乇蹖 PDF:
+pdfjs-document-properties-version = 賵蹠卮丕賳蹖 PDF:
+pdfjs-document-properties-page-count = 跇賲丕乇蹠蹖 倬蹠乇蹠讴丕賳:
+pdfjs-document-properties-page-size = 賯蹠亘丕乇蹠蹖 倬蹠跁蹠:
+pdfjs-document-properties-page-size-unit-inches = 卅蹖賳趩
+pdfjs-document-properties-page-size-unit-millimeters = 賲賱賲
+pdfjs-document-properties-page-size-orientation-portrait = 倬蹎乇鬲乇蹠蹖鬲(丿乇蹘跇)
+pdfjs-document-properties-page-size-orientation-landscape = 倬丕賳蹖蹖
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 賳丕賲蹠
+pdfjs-document-properties-page-size-name-legal = 蹖丕爻丕蹖蹖
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 倬蹖卮丕賳丿丕賳蹖 賵蹘亘蹖 禺蹘乇丕:
+pdfjs-document-properties-linearized-yes = 亘蹠诘蹘
+pdfjs-document-properties-linearized-no = 賳蹠禺蹘乇
+pdfjs-document-properties-close-button = 丿丕禺爻鬲賳
+
+## Print
+
+pdfjs-print-progress-message = 亘蹠诘诏蹠賳丕賲蹠 卅丕賲丕丿蹠丿蹠讴乇蹘鬲 亘蹎 趩丕倬讴乇丿賳...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 倬丕卮诏蹠夭亘賵賵賳蹠賵蹠
+pdfjs-printing-not-supported = 卅丕诏丕丿丕乇亘蹠: 趩丕倬讴乇丿賳 亘蹠 鬲蹠賵丕賵蹖 倬卮鬲诏蹖乇 賳丕讴乇蹘鬲 賱蹠賲 賵蹘亘诏蹠跁蹠.
+pdfjs-printing-not-ready = 卅丕诏丕丿丕乇亘蹠: PDF 亘蹠 鬲蹠賵丕賵蹖 亘丕乇賳蹠亘賵賵蹠 亘蹎 趩丕倬讴乇丿賳.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 賱丕鬲蹠賳蹖卮鬲 倬蹖卮丕賳丿丕賳/卮丕乇丿賳蹠賵蹠
+pdfjs-toggle-sidebar-button-label = 賱丕鬲蹠賳蹖卮鬲 倬蹖卮丕賳丿丕賳/卮丕乇丿賳蹠賵蹠
+pdfjs-document-outline-button-label = 爻賳賵賵乇蹖 趩賵丕乇趩蹘賵蹠
+pdfjs-attachments-button =
+    .title = 倬丕卮讴蹎讴丕賳 倬蹖卮丕賳 亘丿蹠
+pdfjs-attachments-button-label = 倬丕卮讴蹎讴丕賳
+pdfjs-layers-button-label = 趩蹖賳蹠讴丕賳
+pdfjs-thumbs-button =
+    .title = 賵蹘賳蹎趩讴蹠 倬蹖卮丕賳 亘丿蹠
+pdfjs-thumbs-button-label = 賵蹘賳蹎趩讴蹠
+pdfjs-findbar-button =
+    .title = 賱蹠 亘蹠诘诏蹠賳丕賲蹠 亘诏蹠乇蹘
+pdfjs-findbar-button-label = 丿蹎夭蹖賳蹠賵蹠
+pdfjs-additional-layers = 趩蹖賳蹖 夭蹖丕鬲乇
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 倬蹠跁蹠蹖 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 賵蹘賳蹎趩讴蹠蹖 倬蹠跁蹠蹖 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 丿蹎夭蹖賳蹠賵蹠
+    .placeholder = 賱蹠 亘蹠诘诏蹠賳丕賲蹠 亘诏蹠乇蹘...
+pdfjs-find-previous-button =
+    .title = 賴蹠亘賵賵賳蹖 倬蹘卮賵賵 亘丿蹎夭乇蹠賵蹠 賱蹠 跁爻鬲蹠讴蹠丿丕
+pdfjs-find-previous-button-label = 倬蹘卮賵賵
+pdfjs-find-next-button =
+    .title = 賴蹠亘賵賵賳蹖 丿丕賴丕鬲賵賵 亘丿蹎夭蹠乇蹠賵蹠 賱蹠 跁爻鬲蹠讴蹠丿丕
+pdfjs-find-next-button-label = 丿賵賵丕鬲乇
+pdfjs-find-highlight-checkbox = 賴蹠賲賵賵蹖 賳蹖卮丕賳蹠 亘讴蹠
+pdfjs-find-match-case-checkbox-label = 丿蹎禺蹖 賱蹠蹖蹠讴趩賵賵賳
+pdfjs-find-entire-word-checkbox-label = 賴蹠賲賵賵 賵卮蹠讴丕賳
+pdfjs-find-reached-top = 诏蹠卮鬲蹖鬲蹠 爻蹠乇蹠賵蹠蹖 亘蹠诘诏蹠賳丕賲蹠貙 賱蹠 禺賵丕乇蹠賵蹠 丿蹠爻鬲鬲 倬蹘讴乇丿
+pdfjs-find-reached-bottom = 诏蹠卮鬲蹖鬲蹠 讴蹎鬲丕蹖蹖 亘蹠诘诏蹠賳丕賲蹠. 賱蹠爻蹠乇蹠賵蹠 丿蹠爻鬲鬲 倬蹘讴乇丿
+pdfjs-find-not-found = 賳賵賵爻蹖賳 賳蹠丿蹎夭乇丕蹖蹠賵蹠
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 倬丕賳蹖 倬蹠跁蹠
+pdfjs-page-scale-fit = 倬跁亘賵賵賳蹖 倬蹠跁蹠
+pdfjs-page-scale-auto = 夭賵賵賲蹖 禺蹎讴丕乇
+pdfjs-page-scale-actual = 賯蹠亘丕乇蹠蹖 跁丕爻鬲蹖
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = 賴蹠诘蹠蹖蹠讴 跁賵賵蹖丿丕 賱蹠 讴丕鬲蹖 亘丕乇讴乇丿賳蹖  PDF.
+pdfjs-invalid-file-error = 倬蹠跁诏蹠蹖 pdf 鬲蹘讴趩賵賵蹠 蹖丕賳 賳蹠诏賵賳噩丕賵蹠.
+pdfjs-missing-file-error = 倬蹠跁诏蹠蹖 pdf 亘賵賵賳蹖 賳蹖蹠.
+pdfjs-unexpected-response-error = 賵蹠诘丕賲蹖 跁丕跇蹠禺賵丕夭蹖 賳蹠禺賵丕夭乇丕賵.
+pdfjs-rendering-error = 賴蹠诘蹠蹖蹠讴 跁賵賵蹖丿丕 賱蹠 讴丕鬲蹖 倬賵禺鬲蹠讴乇丿賳蹖 (跁蹘賳丿蹠乇) 倬蹠跁蹠.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 爻蹠乇賳噩]
+
+## Password
+
+pdfjs-password-label = 賵卮蹠蹖 鬲蹘倬蹠跁 亘賳賵賵爻蹠 亘蹎 讴乇丿賳蹠賵蹠蹖 倬蹠跁诏蹠蹖 pdf.
+pdfjs-password-invalid = 賵卮蹠蹖 鬲蹘倬蹠跁 賴蹠诘蹠蹖蹠. 鬲讴丕蹖蹠 丿賵賵亘丕乇蹠 賴蹠賵诘 亘丿蹠乇蹠賵蹠.
+pdfjs-password-ok-button = 亘丕卮蹠
+pdfjs-password-cancel-button = 倬丕卮诏蹠夭亘賵賵賳蹠賵蹠
+pdfjs-web-fonts-disabled = 噩蹎乇蹠倬蹖鬲蹖 賵蹘亘 賳丕趩丕賱丕讴蹠: 賳蹠鬲賵丕賳蹖 噩蹎乇蹠倬蹖鬲蹖 鬲蹘禺乇丕賵蹖 賳丕賵 pdf賭蹠讴蹠 亘蹠讴丕乇亘蹘鬲.
diff --git a/public/pdfjs/web/locale/cs/viewer.ftl b/public/pdfjs/web/locale/cs/viewer.ftl
new file mode 100644
index 0000000..cf175c9
--- /dev/null
+++ b/public/pdfjs/web/locale/cs/viewer.ftl
@@ -0,0 +1,763 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P艡ejde na p艡edchoz铆 str谩nku
+pdfjs-previous-button-label = P艡edchoz铆
+pdfjs-next-button =
+    .title = P艡ejde na n谩sleduj铆c铆 str谩nku
+pdfjs-next-button-label = Dal拧铆
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Str谩nka
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = z { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zmen拧铆 velikost
+pdfjs-zoom-out-button-label = Zmen拧it
+pdfjs-zoom-in-button =
+    .title = Zv臎t拧铆 velikost
+pdfjs-zoom-in-button-label = Zv臎t拧it
+pdfjs-zoom-select =
+    .title = Nastav铆 velikost
+pdfjs-presentation-mode-button =
+    .title = P艡epne do re啪imu prezentace
+pdfjs-presentation-mode-button-label = Re啪im prezentace
+pdfjs-open-file-button =
+    .title = Otev艡e soubor
+pdfjs-open-file-button-label = Otev艡铆t
+pdfjs-print-button =
+    .title = Vytiskne dokument
+pdfjs-print-button-label = Vytisknout
+pdfjs-save-button =
+    .title = Ulo啪it
+pdfjs-save-button-label = Ulo啪it
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = St谩hnout
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = St谩hnout
+pdfjs-bookmark-button =
+    .title = Aktu谩ln铆 str谩nka (zobrazit URL od aktu谩ln铆 str谩nky)
+pdfjs-bookmark-button-label = Aktu谩ln铆 str谩nka
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = N谩stroje
+pdfjs-tools-button-label = N谩stroje
+pdfjs-first-page-button =
+    .title = P艡ejde na prvn铆 str谩nku
+pdfjs-first-page-button-label = P艡ej铆t na prvn铆 str谩nku
+pdfjs-last-page-button =
+    .title = P艡ejde na posledn铆 str谩nku
+pdfjs-last-page-button-label = P艡ej铆t na posledn铆 str谩nku
+pdfjs-page-rotate-cw-button =
+    .title = Oto膷铆 po sm臎ru hodin
+pdfjs-page-rotate-cw-button-label = Oto膷it po sm臎ru hodin
+pdfjs-page-rotate-ccw-button =
+    .title = Oto膷铆 proti sm臎ru hodin
+pdfjs-page-rotate-ccw-button-label = Oto膷it proti sm臎ru hodin
+pdfjs-cursor-text-select-tool-button =
+    .title = Povol铆 v媒b臎r textu
+pdfjs-cursor-text-select-tool-button-label = V媒b臎r textu
+pdfjs-cursor-hand-tool-button =
+    .title = Povol铆 n谩stroj ru膷i膷ka
+pdfjs-cursor-hand-tool-button-label = N谩stroj ru膷i膷ka
+pdfjs-scroll-page-button =
+    .title = Posouvat po str谩nk谩ch
+pdfjs-scroll-page-button-label = Posouv谩n铆 po str谩nk谩ch
+pdfjs-scroll-vertical-button =
+    .title = Pou啪铆t svisl茅 posouv谩n铆
+pdfjs-scroll-vertical-button-label = Svisl茅 posouv谩n铆
+pdfjs-scroll-horizontal-button =
+    .title = Pou啪铆t vodorovn茅 posouv谩n铆
+pdfjs-scroll-horizontal-button-label = Vodorovn茅 posouv谩n铆
+pdfjs-scroll-wrapped-button =
+    .title = Pou啪铆t postupn茅 posouv谩n铆
+pdfjs-scroll-wrapped-button-label = Postupn茅 posouv谩n铆
+pdfjs-spread-none-button =
+    .title = Nesdru啪ovat str谩nky
+pdfjs-spread-none-button-label = 沤谩dn茅 sdru啪en铆
+pdfjs-spread-odd-button =
+    .title = Sdru啪铆 str谩nky s um铆st臎n铆m lich媒ch vlevo
+pdfjs-spread-odd-button-label = Sdru啪en铆 str谩nek (lich茅 vlevo)
+pdfjs-spread-even-button =
+    .title = Sdru啪铆 str谩nky s um铆st臎n铆m sud媒ch vlevo
+pdfjs-spread-even-button-label = Sdru啪en铆 str谩nek (sud茅 vlevo)
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Vlastnosti dokumentu鈥�
+pdfjs-document-properties-button-label = Vlastnosti dokumentu鈥�
+pdfjs-document-properties-file-name = N谩zev souboru:
+pdfjs-document-properties-file-size = Velikost souboru:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bajt暖)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajt暖)
+pdfjs-document-properties-title = N谩zev str谩nky:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = P艡edm臎t:
+pdfjs-document-properties-keywords = Kl铆膷ov谩 slova:
+pdfjs-document-properties-creation-date = Datum vytvo艡en铆:
+pdfjs-document-properties-modification-date = Datum 煤pravy:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Vytvo艡il:
+pdfjs-document-properties-producer = Tv暖rce PDF:
+pdfjs-document-properties-version = Verze PDF:
+pdfjs-document-properties-page-count = Po膷et str谩nek:
+pdfjs-document-properties-page-size = Velikost str谩nky:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = na v媒拧ku
+pdfjs-document-properties-page-size-orientation-landscape = na 拧铆艡ku
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Dopis
+pdfjs-document-properties-page-size-name-legal = Pr谩vn铆 dokument
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Rychl茅 zobrazov谩n铆 z webu:
+pdfjs-document-properties-linearized-yes = Ano
+pdfjs-document-properties-linearized-no = Ne
+pdfjs-document-properties-close-button = Zav艡铆t
+
+## Print
+
+pdfjs-print-progress-message = P艡铆prava dokumentu pro tisk鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress } %
+pdfjs-print-progress-close-button = Zru拧it
+pdfjs-printing-not-supported = Upozorn臎n铆: Tisk nen铆 v tomto prohl铆啪e膷i pln臎 podporov谩n.
+pdfjs-printing-not-ready = Upozorn臎n铆: Dokument PDF nen铆 kompletn臎 na膷ten.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Postrann铆 li拧ta
+pdfjs-toggle-sidebar-notification-button =
+    .title = P艡epnout postrann铆 li拧tu (dokument obsahuje osnovu/p艡铆lohy/vrstvy)
+pdfjs-toggle-sidebar-button-label = Postrann铆 li拧ta
+pdfjs-document-outline-button =
+    .title = Zobraz铆 osnovu dokumentu (poklep谩n铆 p艡epne zobrazen铆 v拧ech polo啪ek)
+pdfjs-document-outline-button-label = Osnova dokumentu
+pdfjs-attachments-button =
+    .title = Zobraz铆 p艡铆lohy
+pdfjs-attachments-button-label = P艡铆lohy
+pdfjs-layers-button =
+    .title = Zobrazit vrstvy (poklep谩n铆m obnov铆te v拧echny vrstvy do v媒choz铆ho stavu)
+pdfjs-layers-button-label = Vrstvy
+pdfjs-thumbs-button =
+    .title = Zobraz铆 n谩hledy
+pdfjs-thumbs-button-label = N谩hledy
+pdfjs-current-outline-item-button =
+    .title = Naj铆t aktu谩ln铆 polo啪ku v osnov臎
+pdfjs-current-outline-item-button-label = Aktu谩ln铆 polo啪ka v osnov臎
+pdfjs-findbar-button =
+    .title = Najde v dokumentu
+pdfjs-findbar-button-label = Naj铆t
+pdfjs-additional-layers = Dal拧铆 vrstvy
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Strana { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = N谩hled strany { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Vybrat stranu { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Strana { $page } z { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Naj铆t
+    .placeholder = Naj铆t v dokumentu鈥�
+pdfjs-find-previous-button =
+    .title = Najde p艡edchoz铆 v媒skyt hledan茅ho textu
+pdfjs-find-previous-button-label = P艡edchoz铆
+pdfjs-find-next-button =
+    .title = Najde dal拧铆 v媒skyt hledan茅ho textu
+pdfjs-find-next-button-label = Dal拧铆
+pdfjs-find-highlight-checkbox = Zv媒raznit
+pdfjs-find-match-case-checkbox-label = Rozli拧ovat velikost
+pdfjs-find-match-diacritics-checkbox-label = Rozli拧ovat diakritiku
+pdfjs-find-entire-word-checkbox-label = Cel谩 slova
+pdfjs-find-reached-top = Dosa啪en za膷谩tek dokumentu, pokra膷uje se od konce
+pdfjs-find-reached-bottom = Dosa啪en konec dokumentu, pokra膷uje se od za膷谩tku
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current }. z { $total } v媒skytu
+        [few] { $current }. z { $total } v媒skyt暖
+        [many] { $current }. z { $total } v媒skyt暖
+       *[other] { $current }. z { $total } v媒skyt暖
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] V铆ce ne啪 { $limit } v媒skyt
+        [few] V铆ce ne啪 { $limit } v媒skyty
+        [many] V铆ce ne啪 { $limit } v媒skyt暖
+       *[other] V铆ce ne啪 { $limit } v媒skyt暖
+    }
+pdfjs-find-not-found = Hledan媒 text nenalezen
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Podle 拧铆艡ky
+pdfjs-page-scale-fit = Podle str谩nky
+pdfjs-page-scale-auto = Automatick谩 velikost
+pdfjs-page-scale-actual = Skute膷n谩 velikost
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale } %
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Strana { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = P艡i nahr谩v谩n铆 PDF nastala chyba.
+pdfjs-invalid-file-error = Neplatn媒 nebo chybn媒 soubor PDF.
+pdfjs-missing-file-error = Chyb铆 soubor PDF.
+pdfjs-unexpected-response-error = Neo膷ek谩van谩 odpov臎膹 serveru.
+pdfjs-rendering-error = P艡i vykreslov谩n铆 str谩nky nastala chyba.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotace typu { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Pro otev艡en铆 PDF souboru vlo啪te heslo.
+pdfjs-password-invalid = Neplatn茅 heslo. Zkuste to znovu.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Zru拧it
+pdfjs-web-fonts-disabled = Webov谩 p铆sma jsou zak谩z谩na, proto nen铆 mo啪n茅 pou啪铆t vlo啪en谩 p铆sma PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = Zm臎na barvy textu
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Kreslen铆
+pdfjs-editor-color-picker-ink-input =
+    .title = Zm臎na barvy kresby
+pdfjs-editor-ink-button-label = Kreslen铆
+pdfjs-editor-stamp-button =
+    .title = P艡id谩n铆 膷i 煤prava obr谩zk暖
+pdfjs-editor-stamp-button-label = P艡id谩n铆 膷i 煤prava obr谩zk暖
+pdfjs-editor-highlight-button =
+    .title = Zv媒razn臎n铆
+pdfjs-editor-highlight-button-label = Zv媒razn臎n铆
+pdfjs-highlight-floating-button1 =
+    .title = Zv媒raznit
+    .aria-label = Zv媒raznit
+pdfjs-highlight-floating-button-label = Zv媒raznit
+pdfjs-comment-floating-button =
+    .title = Koment谩艡
+    .aria-label = Koment谩艡
+pdfjs-comment-floating-button-label = Koment谩艡
+pdfjs-editor-comment-button =
+    .title = Koment谩艡
+    .aria-label = Koment谩艡
+pdfjs-editor-comment-button-label = Koment谩艡
+pdfjs-editor-signature-button =
+    .title = P艡idat podpis
+pdfjs-editor-signature-button-label = P艡idat podpis
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor zv媒razn臎n铆
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor kresby
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor podpisu: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor obr谩zk暖
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Odebrat kresbu
+pdfjs-editor-remove-freetext-button =
+    .title = Odebrat text
+pdfjs-editor-remove-stamp-button =
+    .title = Odebrat obr谩zek
+pdfjs-editor-remove-highlight-button =
+    .title = Odebrat zv媒razn臎n铆
+pdfjs-editor-remove-signature-button =
+    .title = Odebrat podpis
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Barva
+pdfjs-editor-free-text-size-input = Velikost
+pdfjs-editor-ink-color-input = Barva
+pdfjs-editor-ink-thickness-input = Tlou拧钮ka
+pdfjs-editor-ink-opacity-input = Pr暖hlednost
+pdfjs-editor-stamp-add-image-button =
+    .title = P艡idat obr谩zek
+pdfjs-editor-stamp-add-image-button-label = P艡idat obr谩zek
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Tlou拧钮ka
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Zm臎na tlou拧钮ky p艡i zv媒raz艌ov谩n铆 jin媒ch polo啪ek ne啪 textu
+pdfjs-editor-add-signature-container =
+    .aria-label = Ovl谩dac铆 prvky pro podpisy a ulo啪en茅 podpisy
+pdfjs-editor-signature-add-signature-button =
+    .title = P艡idat nov媒 podpis
+pdfjs-editor-signature-add-signature-button-label = P艡idat nov媒 podpis
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Ulo啪en媒 podpis: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Textov媒 editor
+    .default-content = Za膷n臎te ps谩t...
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Koment谩艡
+        [few] Koment谩艡e
+        [many] Koment谩艡e
+       *[other] Koment谩艡e
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Zav艡铆t postrann铆 li拧tu
+    .aria-label = Zav艡铆t postrann铆 li拧tu
+pdfjs-editor-comments-sidebar-close-button-label = Zav艡铆t postrann铆 li拧tu
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Vid铆te n臎co pozoruhodn茅ho? Zv媒razn臎te to a zanechte koment谩艡.
+pdfjs-editor-comments-sidebar-no-comments-link = Zjistit v铆ce
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = N谩hradn铆 popis
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Upravit alternativn铆 text
+pdfjs-editor-alt-text-dialog-label = Vyberte mo啪nost
+pdfjs-editor-alt-text-dialog-description = N谩hradn铆 popis pom谩h谩, kdy啪 lid茅 obr谩zek nevid铆 nebo kdy啪 se nena膷铆t谩.
+pdfjs-editor-alt-text-add-description-label = P艡idat popis
+pdfjs-editor-alt-text-add-description-description = Sna啪te se o 1-2 v臎ty, kter茅 popisuj铆 p艡edm臎t, prost艡ed铆 nebo 膷innosti.
+pdfjs-editor-alt-text-mark-decorative-label = Ozna膷it jako dekorativn铆
+pdfjs-editor-alt-text-mark-decorative-description = Pou啪铆v谩 se pro okrasn茅 obr谩zky, jako jsou r谩me膷ky nebo vodoznaky.
+pdfjs-editor-alt-text-cancel-button = Zru拧it
+pdfjs-editor-alt-text-save-button = Ulo啪it
+pdfjs-editor-alt-text-decorative-tooltip = Ozna膷en jako dekorativn铆
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Nap艡铆klad: 鈥淢lad媒 mu啪 si sed谩 ke stolu, aby se najedl.鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternativn铆 text
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Lev媒 horn铆 roh 鈥� zm臎na velikosti
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Horn铆 st艡ed 鈥� zm臎na velikosti
+pdfjs-editor-resizer-top-right =
+    .aria-label = Prav媒 horn铆 roh 鈥� zm臎na velikosti
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Vpravo uprost艡ed 鈥� zm臎na velikosti
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Prav媒 doln铆 roh 鈥� zm臎na velikosti
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = St艡ed dole 鈥� zm臎na velikosti
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Lev媒 doln铆 roh 鈥� zm臎na velikosti
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Vlevo uprost艡ed 鈥� zm臎na velikosti
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Barva zv媒razn臎n铆
+pdfjs-editor-colorpicker-button =
+    .title = Zm臎na barvy
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = V媒b臎r barev
+pdfjs-editor-colorpicker-yellow =
+    .title = 沤lut谩
+pdfjs-editor-colorpicker-green =
+    .title = Zelen谩
+pdfjs-editor-colorpicker-blue =
+    .title = Modr谩
+pdfjs-editor-colorpicker-pink =
+    .title = R暖啪ov谩
+pdfjs-editor-colorpicker-red =
+    .title = 膶erven谩
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Zobrazit v拧e
+pdfjs-editor-highlight-show-all-button =
+    .title = Zobrazit v拧e
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Upravit alternativn铆 text (popis obr谩zku)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = P艡idat alternativn铆 text (popis obr谩zku)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Sem napi拧te sv暖j popis鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kr谩tk媒 popis pro lidi, kte艡铆 neuvid铆 obr谩zek nebo kdy啪 se obr谩zek nena膷铆t谩.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Tento alternativn铆 text byl vytvo艡en automaticky a m暖啪e b媒t nep艡esn媒.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = V铆ce informac铆
+pdfjs-editor-new-alt-text-create-automatically-button-label = Vytvo艡it alternativn铆 text automaticky
+pdfjs-editor-new-alt-text-not-now-button = Te膹 ne
+pdfjs-editor-new-alt-text-error-title = Nepoda艡ilo se automaticky vytvo艡it alternativn铆 text
+pdfjs-editor-new-alt-text-error-description = Napi拧te pros铆m vlastn铆 alternativn铆 text nebo to zkuste znovu pozd臎ji.
+pdfjs-editor-new-alt-text-error-close-button = Zav艡铆t
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Stahuje se model AI pro alternativn铆 texty ({ $downloadedSize } z { $totalSize } MB)
+    .aria-valuetext = Stahuje se model AI pro alternativn铆 texty ({ $downloadedSize } z { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativn铆 text byl p艡id谩n
+pdfjs-editor-new-alt-text-added-button-label = Alternativn铆 text byl p艡id谩n
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Chyb铆 alternativn铆 text
+pdfjs-editor-new-alt-text-missing-button-label = Chyb铆 alternativn铆 text
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Zkontrolovat alternativn铆 text
+pdfjs-editor-new-alt-text-to-review-button-label = Zkontrolovat alternativn铆 text
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Vytvo艡eno automaticky: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Nastaven铆 alternativn铆ho textu obr谩zku
+pdfjs-image-alt-text-settings-button-label = Nastaven铆 alternativn铆ho textu obr谩zku
+pdfjs-editor-alt-text-settings-dialog-label = Nastaven铆 alternativn铆ho textu obr谩zku
+pdfjs-editor-alt-text-settings-automatic-title = Automatick媒 alternativn铆 text
+pdfjs-editor-alt-text-settings-create-model-button-label = Vytvo艡it alternativn铆 text automaticky
+pdfjs-editor-alt-text-settings-create-model-description = Navrhuje popisy, kter茅 pomohou lidem, kte艡铆 nevid铆 obr谩zek nebo kdy啪 se obr谩zek nena膷te.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model AI pro alternativn铆 text ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = B臎啪铆 lok谩ln臎 na va拧em za艡铆zen铆, tak啪e va拧e data z暖st谩vaj铆 v bezpe膷铆. Vy啪adov谩no pro automatick媒 alternativn铆 text.
+pdfjs-editor-alt-text-settings-delete-model-button = Smazat
+pdfjs-editor-alt-text-settings-download-model-button = St谩hnout
+pdfjs-editor-alt-text-settings-downloading-model-button = Prob铆h谩 stahov谩n铆...
+pdfjs-editor-alt-text-settings-editor-title = Editor alternativn铆ho textu
+pdfjs-editor-alt-text-settings-show-dialog-button-label = P艡i p艡id谩v谩n铆 obr谩zku hned zobrazit editor alternativn铆ho textu
+pdfjs-editor-alt-text-settings-show-dialog-description = Pom暖啪e v谩m zajistit, aby v拧echny va拧e obr谩zky obsahovaly alternativn铆 text.
+pdfjs-editor-alt-text-settings-close-button = Zav艡铆t
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = P艡id谩no zv媒razn臎n铆
+pdfjs-editor-freetext-added-alert = Text p艡id谩n
+pdfjs-editor-ink-added-alert = Kresba byla p艡id谩na
+pdfjs-editor-stamp-added-alert = Obr谩zek byl p艡id谩n
+pdfjs-editor-signature-added-alert = Byl p艡id谩n podpis
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Zv媒razn臎n铆 odebr谩no
+pdfjs-editor-undo-bar-message-freetext = Text odstran臎n
+pdfjs-editor-undo-bar-message-ink = Kresba odstran臎na
+pdfjs-editor-undo-bar-message-stamp = Obr谩zek odebr谩n
+pdfjs-editor-undo-bar-message-signature = Podpis odebr谩n
+pdfjs-editor-undo-bar-message-comment = Koment谩艡 odebr谩n
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anotace odebr谩na
+        [few] { $count } anotace odebr谩ny
+        [many] { $count } anotac铆 odebr谩no
+       *[other] { $count } anotac铆 odebr谩no
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Zp臎t
+pdfjs-editor-undo-bar-undo-button-label = Zp臎t
+pdfjs-editor-undo-bar-close-button =
+    .title = Zav艡铆t
+pdfjs-editor-undo-bar-close-button-label = Zav艡铆t
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Tento zp暖sob umo啪艌uje u啪ivateli vytvo艡it podpis, kter媒 se p艡id谩 do dokumentu PDF. U啪ivatel m暖啪e upravit jm茅no (kter茅 slou啪铆 z谩rove艌 jako alternativn铆 text) a podpis ulo啪it pro pozd臎j拧铆 pou啪it铆.
+pdfjs-editor-add-signature-dialog-title = P艡idat podpis
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Ps谩t
+    .title = Ps谩t
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Kreslit
+    .title = Kreslit
+pdfjs-editor-add-signature-image-button = Obr谩zek
+    .title = Obr谩zek
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Zadejte sv暖j podpis
+    .placeholder = Zadejte sv暖j podpis
+pdfjs-editor-add-signature-draw-placeholder = Nakreslete sv暖j podpis
+pdfjs-editor-add-signature-draw-thickness-range-label = Tlou拧钮ka
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Tlou拧钮ka kresby: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = P艡et谩hn臎te sem soubor, kter媒 chcete nahr谩t
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Nebo vyberte soubory obrazu
+       *[other] Nebo vyberte soubory obrazu
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Popis (alternativn铆 text)
+pdfjs-editor-add-signature-description-input =
+    .title = Popis (alternativn铆 text)
+pdfjs-editor-add-signature-description-default-when-drawing = Podpis
+pdfjs-editor-add-signature-clear-button-label = Vymaz谩n铆 podpisu
+pdfjs-editor-add-signature-clear-button =
+    .title = Vymaz谩n铆 podpisu
+pdfjs-editor-add-signature-save-checkbox = Ulo啪it podpis
+pdfjs-editor-add-signature-save-warning-message = Dos谩hli jste limitu 5 ulo啪en媒ch podpis暖. Chcete-li ulo啪it dal拧铆, jeden odstra艌te.
+pdfjs-editor-add-signature-image-upload-error-title = Obr谩zek se nepoda艡ilo nahr谩t
+pdfjs-editor-add-signature-image-upload-error-description = Zkontrolujte p艡ipojen铆 k s铆ti nebo zkuste jin媒 obr谩zek.
+pdfjs-editor-add-signature-image-no-data-error-title = Nelze p艡ev茅st tento obr谩zek na podpis
+pdfjs-editor-add-signature-image-no-data-error-description = Zkuste nahr谩t jin媒 obr谩zek.
+pdfjs-editor-add-signature-error-close-button = Zav艡铆t
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Zru拧it
+pdfjs-editor-add-signature-add-button = P艡idat
+pdfjs-editor-edit-signature-update-button = Aktualizovat
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Upravit koment谩艡
+pdfjs-editor-edit-comment-popup-button =
+    .title = Upravit koment谩艡
+pdfjs-editor-delete-comment-popup-button-label = Odebrat koment谩艡
+pdfjs-editor-delete-comment-popup-button =
+    .title = Odebrat koment谩艡
+pdfjs-show-comment-button =
+    .title = Zobrazit koment谩艡
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Upravit koment谩艡
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizovat
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = P艡id谩n铆 koment谩艡e
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = P艡idat
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Za膷n臎te ps谩t鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Zru拧it
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = P艡id谩n铆 koment谩艡e
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = P艡epnout postrann铆 li拧tu (dokument obsahuje n谩hledy/osnovu/p艡铆lohy/vrstvy)
+pdfjs-toggle-views-manager-button1-label = Spravovat strany
+pdfjs-views-manager-sidebar =
+    .aria-label = Postrann铆 li拧ta
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Zm臎na velikosti v postrann铆 li拧t臎
+pdfjs-views-manager-view-selector-button =
+    .title = Zobrazen铆
+pdfjs-views-manager-view-selector-button-label = Zobrazen铆
+pdfjs-views-manager-pages-title = Str谩nky
+pdfjs-views-manager-outlines-title1 = Osnova dokumentu
+    .title = Osnova dokumentu (dvojit茅 klepnut铆 rozbal铆/sbal铆 v拧echny polo啪ky)
+pdfjs-views-manager-attachments-title = P艡铆lohy
+pdfjs-views-manager-layers-title1 = Vrstvy
+    .title = Vrstvy (dvojit茅 klepnut铆 obnov铆 v拧echny vrstvy do v媒choz铆ho stavu)
+pdfjs-views-manager-pages-option-label = Str谩nky
+pdfjs-views-manager-outlines-option-label = Osnova dokumentu
+pdfjs-views-manager-attachments-option-label = P艡铆lohy
+pdfjs-views-manager-layers-option-label = Vrstvy
+pdfjs-views-manager-add-file-button =
+    .title = P艡idat soubor
+pdfjs-views-manager-add-file-button-label = P艡idat soubor
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } vybr谩na
+        [few] { $count } vybr谩ny
+        [many] { $count } vybr谩no
+       *[other] { $count } vybr谩no
+    }
+pdfjs-views-manager-pages-status-none-action-label = V媒b臎r str谩nek
+pdfjs-views-manager-pages-status-action-button-label = Spr谩va
+pdfjs-views-manager-pages-status-copy-button-label = Kop铆rovat
+pdfjs-views-manager-pages-status-cut-button-label = Vyjmout
+pdfjs-views-manager-pages-status-delete-button-label = Smazat
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportovat vybran茅鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 str谩nka vyjmuta
+        [few] { $count } str谩nky vyjmuty
+        [many] { $count } str谩nek vyjmuto
+       *[other] { $count } str谩nek vyjmuto
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 str谩nka zkop铆rov谩na
+        [few] { $count } str谩nky zkop铆rov谩ny
+        [many] { $count } str谩nek zkop铆rov谩no
+       *[other] { $count } str谩nek zkop铆rov谩no
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 str谩nka smaz谩na
+        [few] { $count } str谩nky smaz谩ny
+        [many] { $count } str谩nek smaz谩no
+       *[other] { $count } str谩nek smaz谩no
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = P艡铆prava va拧eho souboru鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Nahr谩v谩n铆 souboru鈥�
+pdfjs-views-manager-status-warning-cut-label = Nelze vyjmout. Obnovte str谩nku a zkuste to znovu.
+pdfjs-views-manager-status-warning-copy-label = Kop铆rov谩n铆 se nezda艡ilo. Obnovte str谩nku a zkuste to znovu.
+pdfjs-views-manager-status-warning-delete-label = Smaz谩n铆 se nezda艡ilo. Obnovte str谩nku a zkuste to znovu.
+pdfjs-views-manager-status-warning-save-label = Nepoda艡ilo se ulo啪it. Obnovte str谩nku a zkuste to znovu.
+pdfjs-views-manager-status-undo-button-label = Zp臎t
+pdfjs-views-manager-status-done-button-label = Hotovo
+pdfjs-views-manager-status-close-button =
+    .title = Zav艡铆t
+pdfjs-views-manager-status-close-button-label = Zav艡铆t
+pdfjs-views-manager-paste-button-label = Vlo啪it
+pdfjs-views-manager-paste-button-before =
+    .title = Vlo啪铆 p艡ed prvn铆 str谩nku
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Vlo啪it za str谩nku { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOV脡
+pdfjs-views-manager-waiting-for-file = Nahr谩v谩n铆 souboru鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Spravovat strany
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Odebrat ulo啪en媒 podpis
+pdfjs-editor-delete-signature-button-label1 = Odebrat ulo啪en媒 podpis
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Upravit popis
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Upravit popis
diff --git a/public/pdfjs/web/locale/cy/viewer.ftl b/public/pdfjs/web/locale/cy/viewer.ftl
new file mode 100644
index 0000000..fd9f51f
--- /dev/null
+++ b/public/pdfjs/web/locale/cy/viewer.ftl
@@ -0,0 +1,779 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Tudalen Flaenorol
+pdfjs-previous-button-label = Blaenorol
+pdfjs-next-button =
+    .title = Tudalen Nesaf
+pdfjs-next-button-label = Nesaf
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Tudalen
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = o { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } o { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Lleihau
+pdfjs-zoom-out-button-label = Lleihau
+pdfjs-zoom-in-button =
+    .title = Cynyddu
+pdfjs-zoom-in-button-label = Cynyddu
+pdfjs-zoom-select =
+    .title = Chwyddo
+pdfjs-presentation-mode-button =
+    .title = Newid i'r Modd Cyflwyno
+pdfjs-presentation-mode-button-label = Modd Cyflwyno
+pdfjs-open-file-button =
+    .title = Agor Ffeil
+pdfjs-open-file-button-label = Agor
+pdfjs-print-button =
+    .title = Argraffu
+pdfjs-print-button-label = Argraffu
+pdfjs-save-button =
+    .title = Cadw
+pdfjs-save-button-label = Cadw
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Llwytho i lawr
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Llwytho i lawr
+pdfjs-bookmark-button =
+    .title = Tudalen Gyfredol (Gweld URL o'r Dudalen Gyfredol)
+pdfjs-bookmark-button-label = Tudalen Gyfredol
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Offer
+pdfjs-tools-button-label = Offer
+pdfjs-first-page-button =
+    .title = Mynd i'r Dudalen Gyntaf
+pdfjs-first-page-button-label = Mynd i'r Dudalen Gyntaf
+pdfjs-last-page-button =
+    .title = Mynd i'r Dudalen Olaf
+pdfjs-last-page-button-label = Mynd i'r Dudalen Olaf
+pdfjs-page-rotate-cw-button =
+    .title = Cylchdroi Clocwedd
+pdfjs-page-rotate-cw-button-label = Cylchdroi Clocwedd
+pdfjs-page-rotate-ccw-button =
+    .title = Cylchdroi Gwrthglocwedd
+pdfjs-page-rotate-ccw-button-label = Cylchdroi Gwrthglocwedd
+pdfjs-cursor-text-select-tool-button =
+    .title = Galluogi Dewis Offeryn Testun
+pdfjs-cursor-text-select-tool-button-label = Offeryn Dewis Testun
+pdfjs-cursor-hand-tool-button =
+    .title = Galluogi Offeryn Llaw
+pdfjs-cursor-hand-tool-button-label = Offeryn Llaw
+pdfjs-scroll-page-button =
+    .title = Defnyddio Sgrolio Tudalen
+pdfjs-scroll-page-button-label = Sgrolio Tudalen
+pdfjs-scroll-vertical-button =
+    .title = Defnyddio Sgrolio Fertigol
+pdfjs-scroll-vertical-button-label = Sgrolio Fertigol
+pdfjs-scroll-horizontal-button =
+    .title = Defnyddio Sgrolio Llorweddol
+pdfjs-scroll-horizontal-button-label = Sgrolio Llorweddol
+pdfjs-scroll-wrapped-button =
+    .title = Defnyddio Sgrolio Amlapio
+pdfjs-scroll-wrapped-button-label = Sgrolio Amlapio
+pdfjs-spread-none-button =
+    .title = Peidio uno trawsdaleniadau
+pdfjs-spread-none-button-label = Dim Trawsdaleniadau
+pdfjs-spread-odd-button =
+    .title = Uno trawsdaleniadau gan gychwyn gyda thudalennau odrif
+pdfjs-spread-odd-button-label = Trawsdaleniadau Odrif
+pdfjs-spread-even-button =
+    .title = Uno trawsdaleniadau gan gychwyn gyda thudalennau eilrif
+pdfjs-spread-even-button-label = Trawsdaleniadau Eilrif
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Priodweddau Dogfen鈥�
+pdfjs-document-properties-button-label = Priodweddau Dogfen鈥�
+pdfjs-document-properties-file-name = Enw ffeil:
+pdfjs-document-properties-file-size = Maint ffeil:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } beit)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } beit)
+pdfjs-document-properties-title = Teitl:
+pdfjs-document-properties-author = Awdur:
+pdfjs-document-properties-subject = Pwnc:
+pdfjs-document-properties-keywords = Allweddair:
+pdfjs-document-properties-creation-date = Dyddiad Creu:
+pdfjs-document-properties-modification-date = Dyddiad Addasu:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Crewr:
+pdfjs-document-properties-producer = Cynhyrchydd PDF:
+pdfjs-document-properties-version = Fersiwn PDF:
+pdfjs-document-properties-page-count = Cyfrif Tudalen:
+pdfjs-document-properties-page-size = Maint Tudalen:
+pdfjs-document-properties-page-size-unit-inches = o fewn
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portread
+pdfjs-document-properties-page-size-orientation-landscape = tirlun
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Llythyr
+pdfjs-document-properties-page-size-name-legal = Cyfreithiol
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Golwg Gwe Cyflym:
+pdfjs-document-properties-linearized-yes = Iawn
+pdfjs-document-properties-linearized-no = Na
+pdfjs-document-properties-close-button = Cau
+
+## Print
+
+pdfjs-print-progress-message = Paratoi dogfen ar gyfer ei hargraffu鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Diddymu
+pdfjs-printing-not-supported = Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr.
+pdfjs-printing-not-ready = Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Toglo'r Bar Ochr
+pdfjs-toggle-sidebar-notification-button =
+    .title = Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys amlinelliadau/atodiadau/haenau)
+pdfjs-toggle-sidebar-button-label = Toglo'r Bar Ochr
+pdfjs-document-outline-button =
+    .title = Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem)
+pdfjs-document-outline-button-label = Amlinelliad Dogfen
+pdfjs-attachments-button =
+    .title = Dangos Atodiadau
+pdfjs-attachments-button-label = Atodiadau
+pdfjs-layers-button =
+    .title = Dangos Haenau (cliciwch ddwywaith i ailosod yr holl haenau i'r cyflwr rhagosodedig)
+pdfjs-layers-button-label = Haenau
+pdfjs-thumbs-button =
+    .title = Dangos Lluniau Bach
+pdfjs-thumbs-button-label = Lluniau Bach
+pdfjs-current-outline-item-button =
+    .title = Canfod yr Eitem Amlinellol Gyfredol
+pdfjs-current-outline-item-button-label = Yr Eitem Amlinellol Gyfredol
+pdfjs-findbar-button =
+    .title = Canfod yn y Ddogfen
+pdfjs-findbar-button-label = Canfod
+pdfjs-additional-layers = Haenau Ychwanegol
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Tudalen { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Llun Bach Tudalen { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Dewis tudalen { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Tudalen { $page } o { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Canfod
+    .placeholder = Canfod yn y ddogfen鈥�
+pdfjs-find-previous-button =
+    .title = Canfod enghraifft flaenorol o'r ymadrodd
+pdfjs-find-previous-button-label = Blaenorol
+pdfjs-find-next-button =
+    .title = Canfod enghraifft nesaf yr ymadrodd
+pdfjs-find-next-button-label = Nesaf
+pdfjs-find-highlight-checkbox = Amlygu Popeth
+pdfjs-find-match-case-checkbox-label = Cydweddu Maint
+pdfjs-find-match-diacritics-checkbox-label = Diacritigau Cyfatebol
+pdfjs-find-entire-word-checkbox-label = Geiriau Cyfan
+pdfjs-find-reached-top = Wedi cyrraedd brig y dudalen, parhau o'r gwaelod
+pdfjs-find-reached-bottom = Wedi cyrraedd diwedd y dudalen, parhau o'r brig
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [zero] { $current } o { $total } cydweddiadau
+        [one] { $current } o { $total } cydweddiad
+        [two] { $current } o { $total } gydweddiad
+        [few] { $current } o { $total } cydweddiad
+        [many] { $current } o { $total } chydweddiad
+       *[other] { $current } o { $total } cydweddiad
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [zero] Mwy nag { $limit } cydweddiadau
+        [one] Mwy nag { $limit } cydweddiad
+        [two] Mwy nag { $limit } gydweddiad
+        [few] Mwy nag { $limit } cydweddiad
+        [many] Mwy nag { $limit } chydweddiad
+       *[other] Mwy nag { $limit } cydweddiad
+    }
+pdfjs-find-not-found = Heb ganfod ymadrodd
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Lled Tudalen
+pdfjs-page-scale-fit = Ffit Tudalen
+pdfjs-page-scale-auto = Chwyddo Awtomatig
+pdfjs-page-scale-actual = Maint Gwirioneddol
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Tudalen { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Digwyddodd gwall wrth lwytho'r PDF.
+pdfjs-invalid-file-error = Ffeil PDF annilys neu llwgr.
+pdfjs-missing-file-error = Ffeil PDF coll.
+pdfjs-unexpected-response-error = Ymateb annisgwyl gan y gweinydd.
+pdfjs-rendering-error = Digwyddodd gwall wrth adeiladu'r dudalen.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anodiad { $type } ]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Rhowch gyfrinair i agor y PDF.
+pdfjs-password-invalid = Cyfrinair annilys. Ceisiwch eto.
+pdfjs-password-ok-button = Iawn
+pdfjs-password-cancel-button = Diddymu
+pdfjs-web-fonts-disabled = Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Testun
+pdfjs-editor-color-picker-free-text-input =
+    .title = Newid lliw testun
+pdfjs-editor-free-text-button-label = Testun
+pdfjs-editor-ink-button =
+    .title = Lluniadu
+pdfjs-editor-color-picker-ink-input =
+    .title = Newid lliw lluniadu
+pdfjs-editor-ink-button-label = Lluniadu
+pdfjs-editor-stamp-button =
+    .title = Ychwanegu neu olygu delweddau
+pdfjs-editor-stamp-button-label = Ychwanegu neu olygu delweddau
+pdfjs-editor-highlight-button =
+    .title = Amlygu
+pdfjs-editor-highlight-button-label = Amlygu
+pdfjs-highlight-floating-button1 =
+    .title = Amlygu
+    .aria-label = Amlygu
+pdfjs-highlight-floating-button-label = Amlygu
+pdfjs-comment-floating-button =
+    .title = Sylw
+    .aria-label = Sylw
+pdfjs-comment-floating-button-label = Sylw
+pdfjs-editor-comment-button =
+    .title = Sylw
+    .aria-label = Sylw
+pdfjs-editor-comment-button-label = Sylw
+pdfjs-editor-signature-button =
+    .title = Ychwanegu llofnod
+pdfjs-editor-signature-button-label = Ychwanegu llofnod
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Golygydd amlygu
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Golygydd lluniadu
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Golygydd llofnod: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Golygydd delweddau
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Dileu lluniad
+pdfjs-editor-remove-freetext-button =
+    .title = Dileu testun
+pdfjs-editor-remove-stamp-button =
+    .title = Dileu delwedd
+pdfjs-editor-remove-highlight-button =
+    .title = Tynnu amlygiad
+pdfjs-editor-remove-signature-button =
+    .title = Dileu llofnod
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Lliw
+pdfjs-editor-free-text-size-input = Maint
+pdfjs-editor-ink-color-input = Lliw
+pdfjs-editor-ink-thickness-input = Trwch
+pdfjs-editor-ink-opacity-input = Didreiddedd
+pdfjs-editor-stamp-add-image-button =
+    .title = Ychwanegu delwedd
+pdfjs-editor-stamp-add-image-button-label = Ychwanegu delwedd
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Trwch
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Newid trwch wrth amlygu eitemau heblaw testun
+pdfjs-editor-add-signature-container =
+    .aria-label = Rheolyddion llofnodion a llofnodion wedi'u cadw
+pdfjs-editor-signature-add-signature-button =
+    .title = Ychwanegu llofnod newydd
+pdfjs-editor-signature-add-signature-button-label = Ychwanegu llofnod newydd
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Llofnod wedi'i gadw: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Golygydd Testun
+    .default-content = Cychwyn teipio鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [zero] Sylwadau
+        [one] Sylw
+        [two] Sylw
+        [few] Sylw
+        [many] Sylw
+       *[other] Sylw
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Cau'r bar ochr
+    .aria-label = Cau'r bar ochr
+pdfjs-editor-comments-sidebar-close-button-label = Cau'r bar ochr
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Gweld rhywbeth nodedig? Amlygwch ef a gadael sylw.
+pdfjs-editor-comments-sidebar-no-comments-link = Dysgu rhagor
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Testun amgen (alt)
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Golygu testun amgen
+pdfjs-editor-alt-text-dialog-label = Dewisiadau
+pdfjs-editor-alt-text-dialog-description = Mae testun amgen (testun alt) yn helpu pan na all pobl weld y ddelwedd neu pan nad yw'n llwytho.
+pdfjs-editor-alt-text-add-description-label = Ychwanegu disgrifiad
+pdfjs-editor-alt-text-add-description-description = Anelwch at 1-2 frawddeg sy'n disgrifio'r pwnc, y cefndir neu'r gweithredoedd.
+pdfjs-editor-alt-text-mark-decorative-label = Marcio fel addurniadol
+pdfjs-editor-alt-text-mark-decorative-description = Mae'n cael ei ddefnyddio ar gyfer delweddau addurniadol, fel borderi neu farciau d诺r.
+pdfjs-editor-alt-text-cancel-button = Diddymu
+pdfjs-editor-alt-text-save-button = Cadw
+pdfjs-editor-alt-text-decorative-tooltip = Marcio fel addurniadol
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Er enghraifft, 鈥淢ae dyn ifanc yn eistedd wrth fwrdd i fwyta pryd bwyd鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Testun amgen (alt)
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Y gornel chwith uchaf 鈥� newid maint
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Canol uchaf - newid maint
+pdfjs-editor-resizer-top-right =
+    .aria-label = Y gornel dde uchaf - newid maint
+pdfjs-editor-resizer-middle-right =
+    .aria-label = De canol - newid maint
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Y gornel dde isaf 鈥� newid maint
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Canol gwaelod 鈥� newid maint
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Y gornel chwith isaf 鈥� newid maint
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Chwith canol 鈥� newid maint
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Lliw amlygu
+pdfjs-editor-colorpicker-button =
+    .title = Newid lliw
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Dewisiadau lliw
+pdfjs-editor-colorpicker-yellow =
+    .title = Melyn
+pdfjs-editor-colorpicker-green =
+    .title = Gwyrdd
+pdfjs-editor-colorpicker-blue =
+    .title = Glas
+pdfjs-editor-colorpicker-pink =
+    .title = Pinc
+pdfjs-editor-colorpicker-red =
+    .title = Coch
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Dangos y cyfan
+pdfjs-editor-highlight-show-all-button =
+    .title = Dangos y cyfan
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Golygu testun amgen (disgrifiad o ddelwedd)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Ychwanegwch destun amgen (disgrifiad delwedd)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Ysgrifennwch eich disgrifiad yma鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Disgrifiad byr ar gyfer pobl sydd ddim yn gallu gweld y ddelwedd neu pan nad yw'r ddelwedd yn llwytho.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Cafodd y testun amgen hwn ei greu'n awtomatig a gall fod yn anghywir.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Rhagor
+pdfjs-editor-new-alt-text-create-automatically-button-label = Creu testun amgen yn awtomatig
+pdfjs-editor-new-alt-text-not-now-button = Nid nawr
+pdfjs-editor-new-alt-text-error-title = Methu 芒 chreu testun amgen yn awtomatig
+pdfjs-editor-new-alt-text-error-description = Ysgrifennwch eich testun amgen eich hun neu ceisiwch eto yn nes ymlaen.
+pdfjs-editor-new-alt-text-error-close-button = Cau
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Wrthi'n llwytho i lawr model AI testun amgen ( { $downloadedSize } o { $totalSize } MB)
+    .aria-valuetext = Wrthi'n llwytho i lawr model AI testun amgen ( { $downloadedSize } o { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Ychwanegwyd testun amgen
+pdfjs-editor-new-alt-text-added-button-label = Ychwanegwyd testun amgen
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Testun amgen coll
+pdfjs-editor-new-alt-text-missing-button-label = Testun amgen coll
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Adolygu'r testun amgen
+pdfjs-editor-new-alt-text-to-review-button-label = Adolygu'r testun amgen
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Cr毛wyd yn awtomatig: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Gosodiadau testun amgen delwedd
+pdfjs-image-alt-text-settings-button-label = Gosodiadau testun amgen delwedd
+pdfjs-editor-alt-text-settings-dialog-label = Gosodiadau testun amgen delwedd
+pdfjs-editor-alt-text-settings-automatic-title = Testun amgen awtomatig
+pdfjs-editor-alt-text-settings-create-model-button-label = Creu testun amgen yn awtomatig
+pdfjs-editor-alt-text-settings-create-model-description = Yn awgrymu disgrifiadau i helpu pobl sydd ddim yn gallu gweld y ddelwedd neu pan nad yw'r ddelwedd yn llwytho.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model AI testun amgen ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Yn rhedeg yn lleol ar eich dyfais fel bod eich data'n aros yn breifat. Yn ofynnol ar gyfer testun amgen awtomatig.
+pdfjs-editor-alt-text-settings-delete-model-button = Dileu
+pdfjs-editor-alt-text-settings-download-model-button = Llwytho i Lawr
+pdfjs-editor-alt-text-settings-downloading-model-button = Wrthi'n llwytho i lawr鈥�
+pdfjs-editor-alt-text-settings-editor-title = Golygydd testun amgen
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Dangoswch y golygydd testun amgen yn syth wrth ychwanegu delwedd
+pdfjs-editor-alt-text-settings-show-dialog-description = Yn eich helpu i wneud yn si诺r bod gan eich holl ddelweddau destun amgen.
+pdfjs-editor-alt-text-settings-close-button = Cau
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Amlygu wedi'i ychwanegu
+pdfjs-editor-freetext-added-alert = Testun wedi'i ychwanegu
+pdfjs-editor-ink-added-alert = Lluniadu wedi'i ychwanegu
+pdfjs-editor-stamp-added-alert = Delwedd wedi'i hychwanegu
+pdfjs-editor-signature-added-alert = Llofnod wedi'i ychwanegu
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Tynnwyd yr amlygu
+pdfjs-editor-undo-bar-message-freetext = Tynnwyd y testun
+pdfjs-editor-undo-bar-message-ink = Tynnwyd y lluniad
+pdfjs-editor-undo-bar-message-stamp = Tynnwyd y ddelwedd
+pdfjs-editor-undo-bar-message-signature = Llofnod wedi'i dynnu
+pdfjs-editor-undo-bar-message-comment = Sylw wedi'i dynnu
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [zero] { $count } anodiad wedi'u tynnu
+        [one] { $count } anodiad wedi'i dynnu
+        [two] { $count } anodiad wedi'u tynnu
+        [few] { $count } anodiad wedi'u tynnu
+        [many] { $count } anodiad wedi'u tynnu
+       *[other] { $count } anodiad wedi'u tynnu
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Dadwneud
+pdfjs-editor-undo-bar-undo-button-label = Dadwneud
+pdfjs-editor-undo-bar-close-button =
+    .title = Cau
+pdfjs-editor-undo-bar-close-button-label = Cau
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Mae'r modd hwn yn caniat谩u i'r defnyddiwr greu llofnod i'w ychwanegu at ddogfen PDF. Gall y defnyddiwr olygu'r enw (sydd hefyd yn gweithredu fel y testun amgen), ac yn ddewisol cadw'r llofnod i'w ddefnyddio dro ar 么l tro.
+pdfjs-editor-add-signature-dialog-title = Ychwanegu llofnod
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Math
+    .title = Math
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Lluniadu
+    .title = Lluniadu
+pdfjs-editor-add-signature-image-button = Delwedd
+    .title = Delwedd
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Teipiwch eich llofnod
+    .placeholder = Teipiwch eich llofnod
+pdfjs-editor-add-signature-draw-placeholder = Lluniwch eich llofnod
+pdfjs-editor-add-signature-draw-thickness-range-label = Trwch
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Trwch y llinell: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Llusgwch ffeil yma i'w llwytho
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Neu ddewis ffeiliau delwedd
+       *[other] Neu bori ffeiliau delwedd
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Disgrifiad (testun amgen)
+pdfjs-editor-add-signature-description-input =
+    .title = Disgrifiad (testun amgen)
+pdfjs-editor-add-signature-description-default-when-drawing = Llofnod
+pdfjs-editor-add-signature-clear-button-label = Diddymu llofnod
+pdfjs-editor-add-signature-clear-button =
+    .title = Diddymu llofnod
+pdfjs-editor-add-signature-save-checkbox = Cadw llofnod
+pdfjs-editor-add-signature-save-warning-message = Rydych chi wedi cyrraedd y terfyn o 5 llofnod sydd wedi'u cadw. Tynnwch un i gadw rhagor
+pdfjs-editor-add-signature-image-upload-error-title = Methu llwytho'r ddelwedd.
+pdfjs-editor-add-signature-image-upload-error-description = Gwiriwch eich cysylltiad rhwydwaith neu rhowch gynnig ar ddelwedd arall.
+pdfjs-editor-add-signature-image-no-data-error-title = Methu trosi'r ddelwedd hon yn llofnod
+pdfjs-editor-add-signature-image-no-data-error-description = Ceisiwch lwytho delwedd wahanol.
+pdfjs-editor-add-signature-error-close-button = Cau
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Diddymu
+pdfjs-editor-add-signature-add-button = Ychwanegu
+pdfjs-editor-edit-signature-update-button = Diweddaru
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Golygu sylw
+pdfjs-editor-edit-comment-popup-button =
+    .title = Golygu sylw
+pdfjs-editor-delete-comment-popup-button-label = Tynnu sylw
+pdfjs-editor-delete-comment-popup-button =
+    .title = Tynnu sylw
+pdfjs-show-comment-button =
+    .title = Dangos sylw
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Golygu sylw
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Diweddaru
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Ychwanegu sylw
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ychwanegu
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Cychwyn teipio鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Diddymu
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Ychwanegu sylw
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Togl y Bar Ochr (dogfen yn cynnwys lluniau bach/amlinelliad/atodiadau/haenau)
+pdfjs-toggle-views-manager-button1-label = Rheoli tudalennau
+pdfjs-views-manager-sidebar =
+    .aria-label = Bar Ochr
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Newid maint bar ochr
+pdfjs-views-manager-view-selector-button =
+    .title = Golygon
+pdfjs-views-manager-view-selector-button-label = Golygon
+pdfjs-views-manager-pages-title = Tudalennau
+pdfjs-views-manager-outlines-title1 = Amlinelliad Dogfen
+    .title = Amlinelliad dogfen (clic dwbl i ehangu/leihau pob eitem)
+pdfjs-views-manager-attachments-title = Atodiadau
+pdfjs-views-manager-layers-title1 = Haenau
+    .title = Haenau clic dwbl i ailosod pob haen i'r cyflwr ragosodedig)
+pdfjs-views-manager-pages-option-label = Tudalennau
+pdfjs-views-manager-outlines-option-label = Amlinelliad dogfen
+pdfjs-views-manager-attachments-option-label = Atodiadau
+pdfjs-views-manager-layers-option-label = Haenau
+pdfjs-views-manager-add-file-button =
+    .title = Ychwanegu ffeil
+pdfjs-views-manager-add-file-button-label = Ychwanegu ffeil
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [zero] { $count } wedi'u dewis
+        [one] { $count } wedi'i dewis
+        [two] { $count } wedi'u dewis
+        [few] { $count } wedi'u dewis
+        [many] { $count } wedi'u dewis
+       *[other] { $count } wedi'u dewis
+    }
+pdfjs-views-manager-pages-status-none-action-label = Dewiswch dudalennau
+pdfjs-views-manager-pages-status-action-button-label = Rheoli
+pdfjs-views-manager-pages-status-copy-button-label = Cop茂o
+pdfjs-views-manager-pages-status-cut-button-label = Torri
+pdfjs-views-manager-pages-status-delete-button-label = Dileu
+pdfjs-views-manager-pages-status-export-selected-button-label = Wedi dewis allforio鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [zero] { $count } tudalennau wedi'u torri
+        [one] { $count } dudalen wedi'i thorri
+        [two] { $count } dudalen wedi'u torri
+        [few] { $count } tudalen wedi'u torri
+        [many] { $count } tudalen wedi'u torri
+       *[other] { $count } tudalen wedi'u torri
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [zero] { $count } tudalennau wedi'u cop茂o
+        [one] { $count } tudalen wedi'i chop茂o
+        [two] { $count } tudalen wedi'u cop茂o
+        [few] { $count } tudalen wedi'u cop茂o
+        [many] { $count } tudalen wedi'u cop茂o
+       *[other] { $count } tudalen wedi'u cop茂o
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [zero] { $count } tudalennau wedi'u dileu
+        [one] { $count } tudalen wedi'i dileu
+        [two] { $count } dudalen wedi'u dileu
+        [few] { $count } tudalen wedi'u dileu
+        [many] { $count } tudalen wedi'u dileu
+       *[other] { $count } tudalen wedi'u dileu
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Yn paratoi eich ffeil鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Yn llwytho ffeil i fyny鈥�
+pdfjs-views-manager-status-warning-cut-label = Methu torri. Adnewyddwch y dudalen a cheisio eto.
+pdfjs-views-manager-status-warning-copy-label = Methu cop茂o. Adnewyddwch y dudalen a cheisio eto.
+pdfjs-views-manager-status-warning-delete-label = Methu dileu. Adnewyddwch y dudalen a cheisio eto.
+pdfjs-views-manager-status-warning-save-label = Methu cadw. Adnewyddwch y dudalen a cheisio eto.
+pdfjs-views-manager-status-undo-button-label = Dadwneud
+pdfjs-views-manager-status-done-button-label = Gorffen
+pdfjs-views-manager-status-close-button =
+    .title = Cau
+pdfjs-views-manager-status-close-button-label = Cau
+pdfjs-views-manager-paste-button-label = Gludo
+pdfjs-views-manager-paste-button-before =
+    .title = Gludo cyn y dudalen gyntaf
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Gludo ar 么l tudalen { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NEWYDD
+pdfjs-views-manager-waiting-for-file = Yn llwytho ffeil i fyny鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Rheoli tudalennau
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Tynnu llofnod sydd wedi'i gadw
+pdfjs-editor-delete-signature-button-label1 = Tynnwch y llofnod sydd wedi'i gadw
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Golygu disgrifiad
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Golygu disgrifiad
diff --git a/public/pdfjs/web/locale/da/viewer.ftl b/public/pdfjs/web/locale/da/viewer.ftl
new file mode 100644
index 0000000..ba5bd58
--- /dev/null
+++ b/public/pdfjs/web/locale/da/viewer.ftl
@@ -0,0 +1,739 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Forrige side
+pdfjs-previous-button-label = Forrige
+pdfjs-next-button =
+    .title = N忙ste side
+pdfjs-next-button-label = N忙ste
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Side
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = af { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } af { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom ud
+pdfjs-zoom-out-button-label = Zoom ud
+pdfjs-zoom-in-button =
+    .title = Zoom ind
+pdfjs-zoom-in-button-label = Zoom ind
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Skift til fuldsk忙rmsvisning
+pdfjs-presentation-mode-button-label = Fuldsk忙rmsvisning
+pdfjs-open-file-button =
+    .title = 脜bn fil
+pdfjs-open-file-button-label = 脜bn
+pdfjs-print-button =
+    .title = Udskriv
+pdfjs-print-button-label = Udskriv
+pdfjs-save-button =
+    .title = Gem
+pdfjs-save-button-label = Gem
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Hent
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Hent
+pdfjs-bookmark-button =
+    .title = Aktuel side (vis URL fra den aktuelle side)
+pdfjs-bookmark-button-label = Aktuel side
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Funktioner
+pdfjs-tools-button-label = Funktioner
+pdfjs-first-page-button =
+    .title = G氓 til f酶rste side
+pdfjs-first-page-button-label = G氓 til f酶rste side
+pdfjs-last-page-button =
+    .title = G氓 til sidste side
+pdfjs-last-page-button-label = G氓 til sidste side
+pdfjs-page-rotate-cw-button =
+    .title = Roter med uret
+pdfjs-page-rotate-cw-button-label = Roter med uret
+pdfjs-page-rotate-ccw-button =
+    .title = Roter mod uret
+pdfjs-page-rotate-ccw-button-label = Roter mod uret
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktiver markeringsv忙rkt酶j
+pdfjs-cursor-text-select-tool-button-label = Markeringsv忙rkt酶j
+pdfjs-cursor-hand-tool-button =
+    .title = Aktiver h氓ndv忙rkt酶j
+pdfjs-cursor-hand-tool-button-label = H氓ndv忙rkt酶j
+pdfjs-scroll-page-button =
+    .title = Brug sidescrolling
+pdfjs-scroll-page-button-label = Sidescrolling
+pdfjs-scroll-vertical-button =
+    .title = Brug vertikal scrolling
+pdfjs-scroll-vertical-button-label = Vertikal scrolling
+pdfjs-scroll-horizontal-button =
+    .title = Brug horisontal scrolling
+pdfjs-scroll-horizontal-button-label = Horisontal scrolling
+pdfjs-scroll-wrapped-button =
+    .title = Brug ombrudt scrolling
+pdfjs-scroll-wrapped-button-label = Ombrudt scrolling
+pdfjs-spread-none-button =
+    .title = Vis enkeltsider
+pdfjs-spread-none-button-label = Enkeltsider
+pdfjs-spread-odd-button =
+    .title = Vis opslag med ulige sidenumre til venstre
+pdfjs-spread-odd-button-label = Opslag med forside
+pdfjs-spread-even-button =
+    .title = Vis opslag med lige sidenumre til venstre
+pdfjs-spread-even-button-label = Opslag uden forside
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumentegenskaber鈥�
+pdfjs-document-properties-button-label = Dokumentegenskaber鈥�
+pdfjs-document-properties-file-name = Filnavn:
+pdfjs-document-properties-file-size = Filst酶rrelse:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Titel:
+pdfjs-document-properties-author = Forfatter:
+pdfjs-document-properties-subject = Emne:
+pdfjs-document-properties-keywords = N酶gleord:
+pdfjs-document-properties-creation-date = Oprettet:
+pdfjs-document-properties-modification-date = Redigeret:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Program:
+pdfjs-document-properties-producer = PDF-producent:
+pdfjs-document-properties-version = PDF-version:
+pdfjs-document-properties-page-count = Antal sider:
+pdfjs-document-properties-page-size = Sidest酶rrelse:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = st氓ende
+pdfjs-document-properties-page-size-orientation-landscape = liggende
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Hurtig web-visning:
+pdfjs-document-properties-linearized-yes = Ja
+pdfjs-document-properties-linearized-no = Nej
+pdfjs-document-properties-close-button = Luk
+
+## Print
+
+pdfjs-print-progress-message = Forbereder dokument til udskrivning鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Annuller
+pdfjs-printing-not-supported = Advarsel: Udskrivning er ikke fuldt underst酶ttet af browseren.
+pdfjs-printing-not-ready = Advarsel: PDF-filen er ikke fuldt indl忙st til udskrivning.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Sl氓 sidepanel til eller fra
+pdfjs-toggle-sidebar-notification-button =
+    .title = Sl氓 sidepanel til eller fra (dokumentet indeholder disposition/vedh忙ftede filer/lag)
+pdfjs-toggle-sidebar-button-label = Sl氓 sidepanel til eller fra
+pdfjs-document-outline-button =
+    .title = Vis dokumentets disposition (dobbeltklik for at udvide/sammenfolde alle elementer)
+pdfjs-document-outline-button-label = Dokument-disposition
+pdfjs-attachments-button =
+    .title = Vis vedh忙ftede filer
+pdfjs-attachments-button-label = Vedh忙ftede filer
+pdfjs-layers-button =
+    .title = Vis lag (dobbeltklik for at nulstille alle lag til standard-tilstanden)
+pdfjs-layers-button-label = Lag
+pdfjs-thumbs-button =
+    .title = Vis miniaturer
+pdfjs-thumbs-button-label = Miniaturer
+pdfjs-current-outline-item-button =
+    .title = Find det aktuelle dispositions-element
+pdfjs-current-outline-item-button-label = Aktuelt dispositions-element
+pdfjs-findbar-button =
+    .title = Find i dokument
+pdfjs-findbar-button-label = Find
+pdfjs-additional-layers = Yderligere lag
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Side { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniature af side { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = V忙lg side { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Side { $page } af { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Find
+    .placeholder = Find i dokument鈥�
+pdfjs-find-previous-button =
+    .title = Find den forrige forekomst
+pdfjs-find-previous-button-label = Forrige
+pdfjs-find-next-button =
+    .title = Find den n忙ste forekomst
+pdfjs-find-next-button-label = N忙ste
+pdfjs-find-highlight-checkbox = Fremh忙v alle
+pdfjs-find-match-case-checkbox-label = Forskel p氓 store og sm氓 bogstaver
+pdfjs-find-match-diacritics-checkbox-label = Diakritiske tegn
+pdfjs-find-entire-word-checkbox-label = Hele ord
+pdfjs-find-reached-top = Toppen af siden blev n氓et, fortsatte fra bunden
+pdfjs-find-reached-bottom = Bunden af siden blev n氓et, fortsatte fra toppen
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } af { $total } forekomst
+       *[other] { $current } af { $total } forekomster
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mere end { $limit } forekomst
+       *[other] Mere end { $limit } forekomster
+    }
+pdfjs-find-not-found = Der blev ikke fundet noget
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Sidebredde
+pdfjs-page-scale-fit = Tilpas til side
+pdfjs-page-scale-auto = Automatisk zoom
+pdfjs-page-scale-actual = Faktisk st酶rrelse
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Side { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Der opstod en fejl ved indl忙sning af PDF-filen.
+pdfjs-invalid-file-error = PDF-filen er ugyldig eller 酶delagt.
+pdfjs-missing-file-error = Manglende PDF-fil.
+pdfjs-unexpected-response-error = Uventet svar fra serveren.
+pdfjs-rendering-error = Der opstod en fejl ved generering af siden.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type }kommentar]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Angiv adgangskode til at 氓bne denne PDF-fil.
+pdfjs-password-invalid = Ugyldig adgangskode. Pr酶v igen.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Fortryd
+pdfjs-web-fonts-disabled = Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Skift tekstfarve
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Tegn
+pdfjs-editor-color-picker-ink-input =
+    .title = Skift tegne-farve
+pdfjs-editor-ink-button-label = Tegn
+pdfjs-editor-stamp-button =
+    .title = Tilf酶j eller rediger billeder
+pdfjs-editor-stamp-button-label = Tilf酶j eller rediger billeder
+pdfjs-editor-highlight-button =
+    .title = Fremh忙v
+pdfjs-editor-highlight-button-label = Fremh忙v
+pdfjs-highlight-floating-button1 =
+    .title = Fremh忙v
+    .aria-label = Fremh忙v
+pdfjs-highlight-floating-button-label = Fremh忙v
+pdfjs-comment-floating-button =
+    .title = Kommenter
+    .aria-label = Kommenter
+pdfjs-comment-floating-button-label = Kommenter
+pdfjs-editor-comment-button =
+    .title = Kommentar
+    .aria-label = Kommentar
+pdfjs-editor-comment-button-label = Kommentar
+pdfjs-editor-signature-button =
+    .title = Tilf酶j signatur
+pdfjs-editor-signature-button-label = Tilf酶j signatur
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Redigering af fremh忙vning
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Redigering af tegninger
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Redigering af signatur: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Redigering af billeder
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Fjern tegning
+pdfjs-editor-remove-freetext-button =
+    .title = Fjern tekst
+pdfjs-editor-remove-stamp-button =
+    .title = Fjern billede
+pdfjs-editor-remove-highlight-button =
+    .title = Fjern fremh忙vning
+pdfjs-editor-remove-signature-button =
+    .title = Fjern signatur
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Farve
+pdfjs-editor-free-text-size-input = St酶rrelse
+pdfjs-editor-ink-color-input = Farve
+pdfjs-editor-ink-thickness-input = Tykkelse
+pdfjs-editor-ink-opacity-input = Uigennemsigtighed
+pdfjs-editor-stamp-add-image-button =
+    .title = Tilf酶j billede
+pdfjs-editor-stamp-add-image-button-label = Tilf酶j billede
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Tykkelse
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 脝ndr tykkelse, n氓r andre elementer end tekst fremh忙ves
+pdfjs-editor-add-signature-container =
+    .aria-label = Indstillinger for signaturer og gemte signaturer
+pdfjs-editor-signature-add-signature-button =
+    .title = Tilf酶j ny signatur
+pdfjs-editor-signature-add-signature-button-label = Tilf酶j ny signatur
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Gemt signatur: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Teksteditor
+    .default-content = Begynd at skrive鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Kommentar
+       *[other] Kommentarer
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Luk sidepanelet
+    .aria-label = Luk sidepanelet
+pdfjs-editor-comments-sidebar-close-button-label = Luk sidepanelet
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Har du fundet noget interessant? Fremh忙v det og gem en kommentar.
+pdfjs-editor-comments-sidebar-no-comments-link = L忙s mere
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternativ tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Rediger alternativ tekst
+pdfjs-editor-alt-text-dialog-label = V忙lg en indstilling
+pdfjs-editor-alt-text-dialog-description = Alternativ tekst hj忙lper folk, som ikke kan se billedet eller n氓r det ikke indl忙ses.
+pdfjs-editor-alt-text-add-description-label = Tilf酶j en beskrivelse
+pdfjs-editor-alt-text-add-description-description = Sigt efter en eller to s忙tninger, der beskriver emnet, omgivelserne eller handlinger.
+pdfjs-editor-alt-text-mark-decorative-label = Marker som dekorativ
+pdfjs-editor-alt-text-mark-decorative-description = Dette bruges for dekorative billeder som rammer eller vandm忙rker.
+pdfjs-editor-alt-text-cancel-button = Annuller
+pdfjs-editor-alt-text-save-button = Gem
+pdfjs-editor-alt-text-decorative-tooltip = Markeret som dekorativ
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = For eksempel: "En ung mand s忙tter sig ved et bord for at spise et m氓ltid mad"
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternativ tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 脴verste venstre hj酶rne 鈥� tilpas st酶rrelse
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 脴verste i midten 鈥� tilpas st酶rrelse
+pdfjs-editor-resizer-top-right =
+    .aria-label = 脴verste h酶jre hj酶rne 鈥� tilpas st酶rrelse
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Midten til h酶jre 鈥� tilpas st酶rrelse
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Nederste h酶jre hj酶rne - tilpas st酶rrelse
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Nederst i midten - tilpas st酶rrelse
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Nederste venstre hj酶rne - tilpas st酶rrelse
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Midten til venstre 鈥� tilpas st酶rrelse
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Fremh忙vningsfarve
+pdfjs-editor-colorpicker-button =
+    .title = Skift farve
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Farvevalg
+pdfjs-editor-colorpicker-yellow =
+    .title = Gul
+pdfjs-editor-colorpicker-green =
+    .title = Gr酶n
+pdfjs-editor-colorpicker-blue =
+    .title = Bl氓
+pdfjs-editor-colorpicker-pink =
+    .title = Lyser酶d
+pdfjs-editor-colorpicker-red =
+    .title = R酶d
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Vis alle
+pdfjs-editor-highlight-show-all-button =
+    .title = Vis alle
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (billedbeskrivelse)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Tilf酶j alternativ tekst (billedbeskrivelse)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Skriv din beskrivelse her...
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kort beskrivelse til personer, der ikke kan se billedet, eller n氓r billedet ikke indl忙ses.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative tekst blev oprettet automatisk og kan v忙re upr忙cis.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = L忙s mere
+pdfjs-editor-new-alt-text-create-automatically-button-label = Opret alternativ tekst automatisk
+pdfjs-editor-new-alt-text-not-now-button = Ikke nu
+pdfjs-editor-new-alt-text-error-title = Kunne ikke oprette alternativ tekst automatisk
+pdfjs-editor-new-alt-text-error-description = Skriv din egen alternative tekst, eller pr酶v igen senere.
+pdfjs-editor-new-alt-text-error-close-button = Luk
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Henter alternativ tekst AI-model ({ $downloadedSize } af { $totalSize } MB)
+    .aria-valuetext = Henter alternativ tekst AI-model ({ $downloadedSize } af { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativ tekst tilf酶jet
+pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst tilf酶jet
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Mangler alternativ tekst
+pdfjs-editor-new-alt-text-missing-button-label = Mangler alternativ tekst
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Gennemg氓 alternativ tekst
+pdfjs-editor-new-alt-text-to-review-button-label = Gennemg氓 alternativ tekst
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Oprettet automatisk: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Indstillinger for alternativ tekst til billeder
+pdfjs-image-alt-text-settings-button-label = Indstillinger for alternativ tekst til billeder
+pdfjs-editor-alt-text-settings-dialog-label = Indstillinger for alternativ tekst til billeder
+pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Opret alternativ tekst automatisk
+pdfjs-editor-alt-text-settings-create-model-description = Foresl氓r beskrivelser for at hj忙lpe folk, der ikke kan se billedet, eller n氓r billedet ikke indl忙ses.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = AI-model til at oprette alternative tekster ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = K酶rer lokalt p氓 din enhed, s氓 dine data forbliver private. P氓kr忙vet for at anvende automatisk alternativ tekst.
+pdfjs-editor-alt-text-settings-delete-model-button = Slet
+pdfjs-editor-alt-text-settings-download-model-button = Hent
+pdfjs-editor-alt-text-settings-downloading-model-button = Henter鈥�
+pdfjs-editor-alt-text-settings-editor-title = Redigering af alternativ tekst
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis redigering af alternativ tekst med det samme, n氓r et billede tilf酶jes
+pdfjs-editor-alt-text-settings-show-dialog-description = Hj忙lper dig med at sikre, at alle dine billeder har alternativ tekst.
+pdfjs-editor-alt-text-settings-close-button = Luk
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Fremh忙vning tilf酶jet
+pdfjs-editor-freetext-added-alert = Tekst tilf酶jet
+pdfjs-editor-ink-added-alert = Tegning tilf酶jet
+pdfjs-editor-stamp-added-alert = Billede tilf酶jet
+pdfjs-editor-signature-added-alert = Signatur tilf酶jet
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Fremh忙vning fjernet
+pdfjs-editor-undo-bar-message-freetext = Tekst fjernet
+pdfjs-editor-undo-bar-message-ink = Tegning fjernet
+pdfjs-editor-undo-bar-message-stamp = Billede fjernet
+pdfjs-editor-undo-bar-message-signature = Signatur fjernet
+pdfjs-editor-undo-bar-message-comment = Kommentar fjernet
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } kommentar fjernet
+       *[other] { $count } kommentarer fjernet
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Fortryd
+pdfjs-editor-undo-bar-undo-button-label = Fortryd
+pdfjs-editor-undo-bar-close-button =
+    .title = Luk
+pdfjs-editor-undo-bar-close-button-label = Luk
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Modal-vinduet g酶r det muligt for brugeren at oprette en signatur, som kan f酶jes til PDF-dokumenter. Brugeren kan redigere navnet (der ogs氓 fungerer som alternativ tekst) og eventuelt gemme signaturen, s氓 den kan bruges igen.
+pdfjs-editor-add-signature-dialog-title = Tilf酶j en signatur
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Indtast
+    .title = Indtast
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Tegn
+    .title = Tegn
+pdfjs-editor-add-signature-image-button = Billede
+    .title = Billede
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Indtast din signatur
+    .placeholder = Indtast din signatur
+pdfjs-editor-add-signature-draw-placeholder = Tegn din signatur
+pdfjs-editor-add-signature-draw-thickness-range-label = Tykkelse
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Linjetykkelse: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Tr忙k en fil herhen for at uploade den
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Eller v忙lg billedfiler
+       *[other] Eller v忙lg billedfiler
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Beskrivelse (alternativ tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Beskrivelse (alternativ tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Underskrift
+pdfjs-editor-add-signature-clear-button-label = Ryd signatur
+pdfjs-editor-add-signature-clear-button =
+    .title = Ryd signatur
+pdfjs-editor-add-signature-save-checkbox = Gem signatur
+pdfjs-editor-add-signature-save-warning-message = Du har n氓et gr忙nsen p氓 5 gemte signaturer. Fjern en for at tilf酶je en ny.
+pdfjs-editor-add-signature-image-upload-error-title = Kunne ikke uploade billede
+pdfjs-editor-add-signature-image-upload-error-description = Kontroller din netv忙rksforbindelse eller pr酶v med et andet billede.
+pdfjs-editor-add-signature-image-no-data-error-title = Kan ikke konvertere dette billede til en signatur
+pdfjs-editor-add-signature-image-no-data-error-description = Pr酶v at uploade et andet billede.
+pdfjs-editor-add-signature-error-close-button = Luk
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Annuller
+pdfjs-editor-add-signature-add-button = Tilf酶j
+pdfjs-editor-edit-signature-update-button = Opdater
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar
+pdfjs-editor-edit-comment-popup-button =
+    .title = Rediger kommentar
+pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar
+pdfjs-editor-delete-comment-popup-button =
+    .title = Fjern kommentar
+pdfjs-show-comment-button =
+    .title = Vis kommentar
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Opdater
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Tilf酶j kommentar
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Tilf酶j
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Begynd at skrive鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Annuller
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Tilf酶j kommentar
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Sl氓 sidepanel til eller fra (dokumentet indeholder miniaturer/disposition/vedh忙ftede filer/lag)
+pdfjs-toggle-views-manager-button1-label = H氓ndter sider
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidepanel
+pdfjs-views-manager-view-selector-button =
+    .title = Visninger
+pdfjs-views-manager-view-selector-button-label = Visninger
+pdfjs-views-manager-pages-title = Sider
+pdfjs-views-manager-attachments-title = Vedh忙ftede filer
+pdfjs-views-manager-layers-title1 = Lag
+    .title = Lag (dobbeltklik for at nulstille alle lag til standard-tilstanden)
+pdfjs-views-manager-pages-option-label = Sider
+pdfjs-views-manager-outlines-option-label = Dokument-disposition
+pdfjs-views-manager-attachments-option-label = Vedh忙ftede filer
+pdfjs-views-manager-layers-option-label = Lag
+pdfjs-views-manager-add-file-button =
+    .title = Tilf酶j fil
+pdfjs-views-manager-add-file-button-label = Tilf酶j fil
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } valgt
+       *[other] { $count } valgt
+    }
+pdfjs-views-manager-pages-status-none-action-label = V忙lg sider
+pdfjs-views-manager-pages-status-action-button-label = H氓ndter
+pdfjs-views-manager-pages-status-copy-button-label = Kopier
+pdfjs-views-manager-pages-status-cut-button-label = Klip
+pdfjs-views-manager-pages-status-delete-button-label = Slet
+pdfjs-views-manager-pages-status-export-selected-button-label = Eksporter valgte鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 side klippet
+       *[other] { $count } sider klippet
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 side kopieret
+       *[other] { $count } sider kopieret
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 side slettet
+       *[other] { $count } sider slettet
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = G酶r din fil klar鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Uploader fil鈥�
+pdfjs-views-manager-status-undo-button-label = Fortryd
+pdfjs-views-manager-status-done-button-label = F忙rdig
+pdfjs-views-manager-status-close-button =
+    .title = Luk
+pdfjs-views-manager-status-close-button-label = Luk
+pdfjs-views-manager-paste-button-label = Inds忙t
+pdfjs-views-manager-paste-button-before =
+    .title = Inds忙t f酶r f酶rste side
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Inds忙t efter side { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NY
+pdfjs-views-manager-waiting-for-file = Uploader fil鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = H氓ndter sider
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Fjern gemt signatur
+pdfjs-editor-delete-signature-button-label1 = Fjern gemt signatur
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Rediger beskrivelse
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Rediger beskrivelse
diff --git a/public/pdfjs/web/locale/de/viewer.ftl b/public/pdfjs/web/locale/de/viewer.ftl
new file mode 100644
index 0000000..0372c35
--- /dev/null
+++ b/public/pdfjs/web/locale/de/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Eine Seite zur眉ck
+pdfjs-previous-button-label = Zur眉ck
+pdfjs-next-button =
+    .title = Eine Seite vor
+pdfjs-next-button-label = Vor
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Seite
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = von { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } von { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Verkleinern
+pdfjs-zoom-out-button-label = Verkleinern
+pdfjs-zoom-in-button =
+    .title = Vergr枚脽ern
+pdfjs-zoom-in-button-label = Vergr枚脽ern
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = In Pr盲sentationsmodus wechseln
+pdfjs-presentation-mode-button-label = Pr盲sentationsmodus
+pdfjs-open-file-button =
+    .title = Datei 枚ffnen
+pdfjs-open-file-button-label = 脰ffnen
+pdfjs-print-button =
+    .title = Drucken
+pdfjs-print-button-label = Drucken
+pdfjs-save-button =
+    .title = Speichern
+pdfjs-save-button-label = Speichern
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Herunterladen
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Herunterladen
+pdfjs-bookmark-button =
+    .title = Aktuelle Seite (URL von aktueller Seite anzeigen)
+pdfjs-bookmark-button-label = Aktuelle Seite
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Werkzeuge
+pdfjs-tools-button-label = Werkzeuge
+pdfjs-first-page-button =
+    .title = Erste Seite anzeigen
+pdfjs-first-page-button-label = Erste Seite anzeigen
+pdfjs-last-page-button =
+    .title = Letzte Seite anzeigen
+pdfjs-last-page-button-label = Letzte Seite anzeigen
+pdfjs-page-rotate-cw-button =
+    .title = Im Uhrzeigersinn drehen
+pdfjs-page-rotate-cw-button-label = Im Uhrzeigersinn drehen
+pdfjs-page-rotate-ccw-button =
+    .title = Gegen Uhrzeigersinn drehen
+pdfjs-page-rotate-ccw-button-label = Gegen Uhrzeigersinn drehen
+pdfjs-cursor-text-select-tool-button =
+    .title = Textauswahl-Werkzeug aktivieren
+pdfjs-cursor-text-select-tool-button-label = Textauswahl-Werkzeug
+pdfjs-cursor-hand-tool-button =
+    .title = Hand-Werkzeug aktivieren
+pdfjs-cursor-hand-tool-button-label = Hand-Werkzeug
+pdfjs-scroll-page-button =
+    .title = Seiten einzeln anordnen
+pdfjs-scroll-page-button-label = Einzelseitenanordnung
+pdfjs-scroll-vertical-button =
+    .title = Seiten 眉bereinander anordnen
+pdfjs-scroll-vertical-button-label = Vertikale Seitenanordnung
+pdfjs-scroll-horizontal-button =
+    .title = Seiten nebeneinander anordnen
+pdfjs-scroll-horizontal-button-label = Horizontale Seitenanordnung
+pdfjs-scroll-wrapped-button =
+    .title = Seiten neben- und 眉bereinander anordnen, abh盲ngig vom Platz
+pdfjs-scroll-wrapped-button-label = Kombinierte Seitenanordnung
+pdfjs-spread-none-button =
+    .title = Seiten nicht nebeneinander anzeigen
+pdfjs-spread-none-button-label = Einzelne Seiten
+pdfjs-spread-odd-button =
+    .title = Jeweils eine ungerade und eine gerade Seite nebeneinander anzeigen
+pdfjs-spread-odd-button-label = Ungerade + gerade Seite
+pdfjs-spread-even-button =
+    .title = Jeweils eine gerade und eine ungerade Seite nebeneinander anzeigen
+pdfjs-spread-even-button-label = Gerade + ungerade Seite
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumenteigenschaften
+pdfjs-document-properties-button-label = Dokumenteigenschaften鈥�
+pdfjs-document-properties-file-name = Dateiname:
+pdfjs-document-properties-file-size = Dateigr枚脽e:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } Bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } Bytes)
+pdfjs-document-properties-title = Titel:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Thema:
+pdfjs-document-properties-keywords = Stichw枚rter:
+pdfjs-document-properties-creation-date = Erstelldatum:
+pdfjs-document-properties-modification-date = Bearbeitungsdatum:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Anwendung:
+pdfjs-document-properties-producer = PDF erstellt mit:
+pdfjs-document-properties-version = PDF-Version:
+pdfjs-document-properties-page-count = Seitenzahl:
+pdfjs-document-properties-page-size = Seitengr枚脽e:
+pdfjs-document-properties-page-size-unit-inches = Zoll
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = Hochformat
+pdfjs-document-properties-page-size-orientation-landscape = Querformat
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Schnelle Webanzeige:
+pdfjs-document-properties-linearized-yes = Ja
+pdfjs-document-properties-linearized-no = Nein
+pdfjs-document-properties-close-button = Schlie脽en
+
+## Print
+
+pdfjs-print-progress-message = Dokument wird f眉r Drucken vorbereitet鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress } %
+pdfjs-print-progress-close-button = Abbrechen
+pdfjs-printing-not-supported = Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollst盲ndig unterst眉tzt.
+pdfjs-printing-not-ready = Warnung: Die PDF-Datei ist nicht vollst盲ndig geladen, dies ist f眉r das Drucken aber empfohlen.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Sidebar umschalten
+pdfjs-toggle-sidebar-notification-button =
+    .title = Sidebar umschalten (Dokument enth盲lt Dokumentstruktur/Anh盲nge/Ebenen)
+pdfjs-toggle-sidebar-button-label = Sidebar umschalten
+pdfjs-document-outline-button =
+    .title = Dokumentstruktur anzeigen (Doppelklicken, um alle Eintr盲ge aus- bzw. einzuklappen)
+pdfjs-document-outline-button-label = Dokumentstruktur
+pdfjs-attachments-button =
+    .title = Anh盲nge anzeigen
+pdfjs-attachments-button-label = Anh盲nge
+pdfjs-layers-button =
+    .title = Ebenen anzeigen (Doppelklicken, um alle Ebenen auf den Standardzustand zur眉ckzusetzen)
+pdfjs-layers-button-label = Ebenen
+pdfjs-thumbs-button =
+    .title = Miniaturansichten anzeigen
+pdfjs-thumbs-button-label = Miniaturansichten
+pdfjs-current-outline-item-button =
+    .title = Aktuelles Struktur-Element finden
+pdfjs-current-outline-item-button-label = Aktuelles Struktur-Element
+pdfjs-findbar-button =
+    .title = Dokument durchsuchen
+pdfjs-findbar-button-label = Suchen
+pdfjs-additional-layers = Zus盲tzliche Ebenen
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Seite { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniaturansicht von Seite { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Seite { $page } ausw盲hlen
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Seite { $page } von { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Suchen
+    .placeholder = Dokument durchsuchen鈥�
+pdfjs-find-previous-button =
+    .title = Vorheriges Vorkommen des Suchbegriffs finden
+pdfjs-find-previous-button-label = Zur眉ck
+pdfjs-find-next-button =
+    .title = N盲chstes Vorkommen des Suchbegriffs finden
+pdfjs-find-next-button-label = Weiter
+pdfjs-find-highlight-checkbox = Alle hervorheben
+pdfjs-find-match-case-checkbox-label = Gro脽-/Kleinschreibung beachten
+pdfjs-find-match-diacritics-checkbox-label = Akzente
+pdfjs-find-entire-word-checkbox-label = Ganze W枚rter
+pdfjs-find-reached-top = Anfang des Dokuments erreicht, fahre am Ende fort
+pdfjs-find-reached-bottom = Ende des Dokuments erreicht, fahre am Anfang fort
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } von { $total } 脺bereinstimmung
+       *[other] { $current } von { $total } 脺bereinstimmungen
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mehr als { $limit } 脺bereinstimmung
+       *[other] Mehr als { $limit } 脺bereinstimmungen
+    }
+pdfjs-find-not-found = Suchbegriff nicht gefunden
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Seitenbreite
+pdfjs-page-scale-fit = Seitengr枚脽e
+pdfjs-page-scale-auto = Automatischer Zoom
+pdfjs-page-scale-actual = Originalgr枚脽e
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale } %
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Seite { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Beim Laden der PDF-Datei trat ein Fehler auf.
+pdfjs-invalid-file-error = Ung眉ltige oder besch盲digte PDF-Datei
+pdfjs-missing-file-error = Fehlende PDF-Datei
+pdfjs-unexpected-response-error = Unerwartete Antwort des Servers
+pdfjs-rendering-error = Beim Darstellen der Seite trat ein Fehler auf.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anlage: { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Geben Sie zum 脰ffnen der PDF-Datei deren Passwort ein.
+pdfjs-password-invalid = Falsches Passwort. Bitte versuchen Sie es erneut.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Abbrechen
+pdfjs-web-fonts-disabled = Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = Textfarbe 盲ndern
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Zeichnen
+pdfjs-editor-color-picker-ink-input =
+    .title = Zeichnungsfarbe 盲ndern
+pdfjs-editor-ink-button-label = Zeichnen
+pdfjs-editor-stamp-button =
+    .title = Grafiken hinzuf眉gen oder bearbeiten
+pdfjs-editor-stamp-button-label = Grafiken hinzuf眉gen oder bearbeiten
+pdfjs-editor-highlight-button =
+    .title = Hervorheben
+pdfjs-editor-highlight-button-label = Hervorheben
+pdfjs-highlight-floating-button1 =
+    .title = Hervorheben
+    .aria-label = Hervorheben
+pdfjs-highlight-floating-button-label = Hervorheben
+pdfjs-comment-floating-button =
+    .title = Kommentieren
+    .aria-label = Kommentieren
+pdfjs-comment-floating-button-label = Kommentieren
+pdfjs-editor-comment-button =
+    .title = Kommentar
+    .aria-label = Kommentar
+pdfjs-editor-comment-button-label = Kommentar
+pdfjs-editor-signature-button =
+    .title = Unterschrift hinzuf眉gen
+pdfjs-editor-signature-button-label = Unterschrift hinzuf眉gen
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Hervorhebungs-Editor
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Zeichnungseditor
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Unterschrifts-Editor: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Grafik-Editor
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Zeichnung entfernen
+pdfjs-editor-remove-freetext-button =
+    .title = Text entfernen
+pdfjs-editor-remove-stamp-button =
+    .title = Grafik entfernen
+pdfjs-editor-remove-highlight-button =
+    .title = Hervorhebung entfernen
+pdfjs-editor-remove-signature-button =
+    .title = Unterschrift entfernen
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Farbe
+pdfjs-editor-free-text-size-input = Gr枚脽e
+pdfjs-editor-ink-color-input = Farbe
+pdfjs-editor-ink-thickness-input = Linienst盲rke
+pdfjs-editor-ink-opacity-input = Deckkraft
+pdfjs-editor-stamp-add-image-button =
+    .title = Grafik hinzuf眉gen
+pdfjs-editor-stamp-add-image-button-label = Grafik hinzuf眉gen
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Linienst盲rke
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Linienst盲rke beim Hervorheben anderer Elemente als Text 盲ndern
+pdfjs-editor-add-signature-container =
+    .aria-label = Signaturkontrollen und gespeicherte Signaturen
+pdfjs-editor-signature-add-signature-button =
+    .title = Neue Unterschrift hinzuf眉gen
+pdfjs-editor-signature-add-signature-button-label = Neue Unterschrift hinzuf眉gen
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Gespeicherte Signatur: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Texteditor
+    .default-content = Schreiben beginnen鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Kommentar
+       *[other] Kommentare
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Sidebar schlie脽en
+    .aria-label = Sidebar schlie脽en
+pdfjs-editor-comments-sidebar-close-button-label = Sidebar schlie脽en
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Haben Sie etwas Bemerkenswertes entdeckt? Heben Sie es hervor und hinterlassen Sie einen Kommentar.
+pdfjs-editor-comments-sidebar-no-comments-link = Weitere Informationen
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternativ-Text
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Alternativ-Text bearbeiten
+pdfjs-editor-alt-text-dialog-label = Option w盲hlen
+pdfjs-editor-alt-text-dialog-description = Alt-Text (Alternativtext) hilft, wenn Personen die Grafik nicht sehen k枚nnen oder wenn sie nicht geladen wird.
+pdfjs-editor-alt-text-add-description-label = Beschreibung hinzuf眉gen
+pdfjs-editor-alt-text-add-description-description = Ziel sind 1-2 S盲tze, die das Thema, das Szenario oder Aktionen beschreiben.
+pdfjs-editor-alt-text-mark-decorative-label = Als dekorativ markieren
+pdfjs-editor-alt-text-mark-decorative-description = Dies wird f眉r Ziergrafiken wie R盲nder oder Wasserzeichen verwendet.
+pdfjs-editor-alt-text-cancel-button = Abbrechen
+pdfjs-editor-alt-text-save-button = Speichern
+pdfjs-editor-alt-text-decorative-tooltip = Als dekorativ markiert
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Zum Beispiel: "Ein junger Mann setzt sich an einen Tisch, um zu essen."
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternativ-Text
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Linke obere Ecke - Gr枚脽e 盲ndern
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Oben mittig - Gr枚脽e 盲ndern
+pdfjs-editor-resizer-top-right =
+    .aria-label = Rechts oben - Gr枚脽e 盲ndern
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Mitte rechts - Gr枚脽e 盲ndern
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Rechte untere Ecke - Gr枚脽e 盲ndern
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Unten mittig - Gr枚脽e 盲ndern
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Linke untere Ecke - Gr枚脽e 盲ndern
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Mitte links - Gr枚脽e 盲ndern
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Hervorhebungsfarbe
+pdfjs-editor-colorpicker-button =
+    .title = Farbe 盲ndern
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Farbauswahl
+pdfjs-editor-colorpicker-yellow =
+    .title = Gelb
+pdfjs-editor-colorpicker-green =
+    .title = Gr眉n
+pdfjs-editor-colorpicker-blue =
+    .title = Blau
+pdfjs-editor-colorpicker-pink =
+    .title = Pink
+pdfjs-editor-colorpicker-red =
+    .title = Rot
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Alle anzeigen
+pdfjs-editor-highlight-show-all-button =
+    .title = Alle anzeigen
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Alternativ-Text (Grafikbeschreibung) bearbeiten
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Alternativ-Text (Grafikbeschreibung) hinzuf眉gen
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Schreiben Sie Ihre Beschreibung hier鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kurze Beschreibung f眉r Personen, die die Grafik nicht sehen k枚nnen, oder wenn die Grafik nicht geladen wird.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Dieser Alternativ-Text wurde automatisch erstellt und k枚nnte ungenau sein.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Weitere Informationen
+pdfjs-editor-new-alt-text-create-automatically-button-label = Alternativ-Text automatisch erstellen
+pdfjs-editor-new-alt-text-not-now-button = Nicht jetzt
+pdfjs-editor-new-alt-text-error-title = Alternativ-Text konnte nicht automatisch erstellt werden
+pdfjs-editor-new-alt-text-error-description = Bitte schreiben Sie Ihren eigenen Alternativ-Text oder versuchen Sie es sp盲ter erneut.
+pdfjs-editor-new-alt-text-error-close-button = Schlie脽en
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alternativ-Text-KI-Modell wird heruntergeladen ({ $downloadedSize } von { $totalSize } MB)
+    .aria-valuetext = Alternativ-Text-KI-Modell wird heruntergeladen ({ $downloadedSize } von { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativ-Text hinzugef眉gt
+pdfjs-editor-new-alt-text-added-button-label = Alternativ-Text hinzugef眉gt
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Fehlender Alternativ-Text
+pdfjs-editor-new-alt-text-missing-button-label = Fehlender Alternativ-Text
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Alternativ-Text 眉berpr眉fen
+pdfjs-editor-new-alt-text-to-review-button-label = Alternativ-Text 眉berpr眉fen
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatisch erstellt: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Alternativ-Text-Einstellungen f眉r Grafiken
+pdfjs-image-alt-text-settings-button-label = Alternativ-Text-Einstellungen f眉r Grafiken
+pdfjs-editor-alt-text-settings-dialog-label = Alternativ-Text-Einstellungen f眉r Grafiken
+pdfjs-editor-alt-text-settings-automatic-title = Automatischer Alternativ-Text
+pdfjs-editor-alt-text-settings-create-model-button-label = Alternativ-Text automatisch erstellen
+pdfjs-editor-alt-text-settings-create-model-description = Schl盲gt Beschreibungen vor, um Personen zu helfen, die die Grafik nicht sehen k枚nnen, oder wenn die Grafik nicht geladen wird.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Alternativ-Text-KI-Modell ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Wird lokal auf Ihrem Ger盲t ausgef眉hrt, sodass Ihre Daten privat bleiben. Erforderlich f眉r automatischen Alternativ-Text.
+pdfjs-editor-alt-text-settings-delete-model-button = L枚schen
+pdfjs-editor-alt-text-settings-download-model-button = Herunterladen
+pdfjs-editor-alt-text-settings-downloading-model-button = Wird heruntergeladen鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alternativ-Texteditor
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternativ-Texteditor beim Hinzuf眉gen einer Grafik anzeigen
+pdfjs-editor-alt-text-settings-show-dialog-description = Hilft Ihnen, sicherzustellen, dass alle Ihre Grafiken Alternativ-Text haben.
+pdfjs-editor-alt-text-settings-close-button = Schlie脽en
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Hervorhebung hinzugef眉gt
+pdfjs-editor-freetext-added-alert = Text hinzugef眉gt
+pdfjs-editor-ink-added-alert = Zeichnung hinzugef眉gt
+pdfjs-editor-stamp-added-alert = Bild hinzugef眉gt
+pdfjs-editor-signature-added-alert = Signatur hinzugef眉gt
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Hervorhebung entfernt
+pdfjs-editor-undo-bar-message-freetext = Text entfernt
+pdfjs-editor-undo-bar-message-ink = Zeichnung entfernt
+pdfjs-editor-undo-bar-message-stamp = Grafik entfernt
+pdfjs-editor-undo-bar-message-signature = Unterschrift entfernt
+pdfjs-editor-undo-bar-message-comment = Kommentar entfernt
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } Anmerkung entfernt
+       *[other] { $count } Anmerkungen entfernt
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = R眉ckg盲ngig
+pdfjs-editor-undo-bar-undo-button-label = R眉ckg盲ngig
+pdfjs-editor-undo-bar-close-button =
+    .title = Schlie脽en
+pdfjs-editor-undo-bar-close-button-label = Schlie脽en
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Dieses Modal erm枚glicht es dem Benutzer, eine Unterschrift zu erstellen, um sie zu einem PDF-Dokument hinzuzuf眉gen. Der Benutzer kann den Namen bearbeiten (der auch als Alt-Text dient) und optional die Unterschrift zur wiederholten Verwendung speichern.
+pdfjs-editor-add-signature-dialog-title = Unterschrift hinzuf眉gen
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Eintippen
+    .title = Eintippen
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Zeichnen
+    .title = Zeichnen
+pdfjs-editor-add-signature-image-button = Grafik
+    .title = Grafik
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Tippen Sie Ihre Unterschrift ein
+    .placeholder = Tippen Sie Ihre Unterschrift ein
+pdfjs-editor-add-signature-draw-placeholder = Ihre Unterschrift zeichnen
+pdfjs-editor-add-signature-draw-thickness-range-label = Linienst盲rke
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Zeichnungsst盲rke: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Datei zum Hochladen hierher ziehen
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Oder Grafikdateien w盲hlen
+       *[other] Oder Bilddateien durchsuchen
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Beschreibung (alternativer Text)
+pdfjs-editor-add-signature-description-input =
+    .title = Beschreibung (alternativer Text)
+pdfjs-editor-add-signature-description-default-when-drawing = Unterschrift
+pdfjs-editor-add-signature-clear-button-label = Unterschrift l枚schen
+pdfjs-editor-add-signature-clear-button =
+    .title = Unterschrift l枚schen
+pdfjs-editor-add-signature-save-checkbox = Unterschrift speichern
+pdfjs-editor-add-signature-save-warning-message = Sie haben die Grenze von 5 gespeicherten Unterschriften erreicht. Entfernen Sie eine, um weitere zu speichern.
+pdfjs-editor-add-signature-image-upload-error-title = Grafik konnte nicht hochgeladen werden
+pdfjs-editor-add-signature-image-upload-error-description = 脺berpr眉fen Sie Ihre Netzwerkverbindung, oder versuchen Sie es mit einer anderen Grafik.
+pdfjs-editor-add-signature-image-no-data-error-title = Kann Grafik nicht in eine Signatur umwandeln
+pdfjs-editor-add-signature-image-no-data-error-description = Bitte versuchen Sie, eine andere Grafik hochzuladen.
+pdfjs-editor-add-signature-error-close-button = Schlie脽en
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Abbrechen
+pdfjs-editor-add-signature-add-button = Hinzuf眉gen
+pdfjs-editor-edit-signature-update-button = Aktualisieren
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Kommentar bearbeiten
+pdfjs-editor-edit-comment-popup-button =
+    .title = Kommentar bearbeiten
+pdfjs-editor-delete-comment-popup-button-label = Kommentar entfernen
+pdfjs-editor-delete-comment-popup-button =
+    .title = Kommentar entfernen
+pdfjs-show-comment-button =
+    .title = Kommentar anzeigen
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Kommentar bearbeiten
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualisieren
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Kommentar hinzuf眉gen
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Hinzuf眉gen
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Schreiben beginnen鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Abbrechen
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Kommentar hinzuf眉gen
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Sidebar umschalten (Dokument enth盲lt Miniaturansichten/Dokumentstruktur/Anh盲nge/Ebenen)
+pdfjs-toggle-views-manager-button1-label = Seiten verwalten
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidebar
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Gr枚脽enanpassung der Sidebar
+pdfjs-views-manager-view-selector-button =
+    .title = Ansichten
+pdfjs-views-manager-view-selector-button-label = Ansichten
+pdfjs-views-manager-pages-title = Seiten
+pdfjs-views-manager-outlines-title1 = Dokumentstruktur
+    .title = Dokumentstruktur (Doppelklick zum Ein- bzw. Ausblenden aller Eintr盲ge)
+pdfjs-views-manager-attachments-title = Anh盲nge
+pdfjs-views-manager-layers-title1 = Ebenen
+    .title = Ebenen (Doppelklick, um alle Ebenen auf den Standard-Zustand zur眉ckzusetzen)
+pdfjs-views-manager-pages-option-label = Seiten
+pdfjs-views-manager-outlines-option-label = Dokumentstruktur
+pdfjs-views-manager-attachments-option-label = Anh盲nge
+pdfjs-views-manager-layers-option-label = Ebenen
+pdfjs-views-manager-add-file-button =
+    .title = Datei hinzuf眉gen
+pdfjs-views-manager-add-file-button-label = Datei hinzuf眉gen
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } ausgew盲hlt
+       *[other] { $count } ausgew盲hlt
+    }
+pdfjs-views-manager-pages-status-none-action-label = Seiten ausw盲hlen
+pdfjs-views-manager-pages-status-action-button-label = Verwalten
+pdfjs-views-manager-pages-status-copy-button-label = Kopieren
+pdfjs-views-manager-pages-status-cut-button-label = Ausschneiden
+pdfjs-views-manager-pages-status-delete-button-label = L枚schen
+pdfjs-views-manager-pages-status-export-selected-button-label = Ausgew盲hlte exportieren鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 Seite ausgeschnitten
+       *[other] { $count } Seiten ausgeschnitten
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 Seite kopiert
+       *[other] { $count } Seiten kopiert
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 Seite gel枚scht
+       *[other] { $count } Seiten gel枚scht
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Ihre Datei wird vorbereitet鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Datei wird hochgeladen鈥�
+pdfjs-views-manager-status-warning-cut-label = Ausschneiden war nicht m枚glich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
+pdfjs-views-manager-status-warning-copy-label = Kopieren nicht m枚glich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
+pdfjs-views-manager-status-warning-delete-label = L枚schen war nicht m枚glich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
+pdfjs-views-manager-status-warning-save-label = Speichern nicht m枚glich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
+pdfjs-views-manager-status-undo-button-label = R眉ckg盲ngig
+pdfjs-views-manager-status-done-button-label = Fertig
+pdfjs-views-manager-status-close-button =
+    .title = Schlie脽en
+pdfjs-views-manager-status-close-button-label = Schlie脽en
+pdfjs-views-manager-paste-button-label = Einf眉gen
+pdfjs-views-manager-paste-button-before =
+    .title = Vor der ersten Seite einf眉gen
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Nach Seite { $page } einf眉gen
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NEU
+pdfjs-views-manager-waiting-for-file = Datei wird hochgeladen鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Seiten verwalten
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Gespeicherte Signatur entfernen
+pdfjs-editor-delete-signature-button-label1 = Gespeicherte Signatur entfernen
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Beschreibung bearbeiten
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Beschreibung bearbeiten
diff --git a/public/pdfjs/web/locale/dsb/viewer.ftl b/public/pdfjs/web/locale/dsb/viewer.ftl
new file mode 100644
index 0000000..93c1803
--- /dev/null
+++ b/public/pdfjs/web/locale/dsb/viewer.ftl
@@ -0,0 +1,763 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pjerwjej拧ny bok
+pdfjs-previous-button-label = Sl臎dk
+pdfjs-next-button =
+    .title = P艣iducy bok
+pdfjs-next-button-label = Dalej
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Bok
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = z { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = P贸mje艅拧y艣
+pdfjs-zoom-out-button-label = P贸mje艅拧y艣
+pdfjs-zoom-in-button =
+    .title = P贸w臎t拧y艣
+pdfjs-zoom-in-button-label = P贸w臎t拧y艣
+pdfjs-zoom-select =
+    .title = Skal臎rowanje
+pdfjs-presentation-mode-button =
+    .title = Do prezentaciskego modusa p艣ej艣
+pdfjs-presentation-mode-button-label = Prezentaciski modus
+pdfjs-open-file-button =
+    .title = Dataju w贸cyni艣
+pdfjs-open-file-button-label = W贸cyni艣
+pdfjs-print-button =
+    .title = 艢i拧膰a艣
+pdfjs-print-button-label = 艢i拧膰a艣
+pdfjs-save-button =
+    .title = Sk艂adowa艣
+pdfjs-save-button-label = Sk艂adowa艣
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Ze艣臎gnu艣
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Ze艣臎gnu艣
+pdfjs-bookmark-button =
+    .title = Aktualny bok (URL z aktualnego boka pokaza艣)
+pdfjs-bookmark-button-label = Aktualny bok
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = R臎dy
+pdfjs-tools-button-label = R臎dy
+pdfjs-first-page-button =
+    .title = K pr臎dnemu bokoju
+pdfjs-first-page-button-label = K pr臎dnemu bokoju
+pdfjs-last-page-button =
+    .title = K sl臎dnemu bokoju
+pdfjs-last-page-button-label = K sl臎dnemu bokoju
+pdfjs-page-rotate-cw-button =
+    .title = Wobwjertnu艣 ako 拧p臎ra 藕o
+pdfjs-page-rotate-cw-button-label = Wobwjertnu艣 ako 拧p臎ra 藕o
+pdfjs-page-rotate-ccw-button =
+    .title = Wobwjertnu艣 nawopaki ako 拧p臎ra 藕o
+pdfjs-page-rotate-ccw-button-label = Wobwjertnu艣 nawopaki ako 拧p臎ra 藕o
+pdfjs-cursor-text-select-tool-button =
+    .title = R臎d za wub臎ranje teksta zm贸啪ni艣
+pdfjs-cursor-text-select-tool-button-label = R臎d za wub臎ranje teksta
+pdfjs-cursor-hand-tool-button =
+    .title = Rucny r臎d zm贸啪ni艣
+pdfjs-cursor-hand-tool-button-label = Rucny r臎d
+pdfjs-scroll-page-button =
+    .title = Kulanje boka wu啪ywa艣
+pdfjs-scroll-page-button-label = Kulanje boka
+pdfjs-scroll-vertical-button =
+    .title = Wertikalne suwanje wu啪ywa艣
+pdfjs-scroll-vertical-button-label = Wertikalne suwanje
+pdfjs-scroll-horizontal-button =
+    .title = Horicontalne suwanje wu啪ywa艣
+pdfjs-scroll-horizontal-button-label = Horicontalne suwanje
+pdfjs-scroll-wrapped-button =
+    .title = P贸zla啪ke suwanje wu啪ywa艣
+pdfjs-scroll-wrapped-button-label = P贸zla啪ke suwanje
+pdfjs-spread-none-button =
+    .title = Boki njezw臎za艣
+pdfjs-spread-none-button-label = 沤eden dw贸jny bok
+pdfjs-spread-odd-button =
+    .title = Boki zachopinajucy z njerownymi bokami zw臎za艣
+pdfjs-spread-odd-button-label = Njerowne boki
+pdfjs-spread-even-button =
+    .title = Boki zachopinajucy z rownymi bokami zw臎za艣
+pdfjs-spread-even-button-label = Rowne boki
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumentowe kakos膰i鈥�
+pdfjs-document-properties-button-label = Dokumentowe kakos膰i鈥�
+pdfjs-document-properties-file-name = M臎 dataje:
+pdfjs-document-properties-file-size = Wjelikos膰 dataje:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtow)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtow)
+pdfjs-document-properties-title = Titel:
+pdfjs-document-properties-author = Awtor:
+pdfjs-document-properties-subject = Tema:
+pdfjs-document-properties-keywords = Klucowe s艂owa:
+pdfjs-document-properties-creation-date = Datum nap贸ranja:
+pdfjs-document-properties-modification-date = Datum zm臎ny:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Awtor:
+pdfjs-document-properties-producer = PDF-g贸towa艜:
+pdfjs-document-properties-version = PDF-wersija:
+pdfjs-document-properties-page-count = Licba bokow:
+pdfjs-document-properties-page-size = Wjelikos膰 boka:
+pdfjs-document-properties-page-size-unit-inches = col
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = wusoki format
+pdfjs-document-properties-page-size-orientation-landscape = pr臎cny format
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = Jo
+pdfjs-document-properties-linearized-no = N臎
+pdfjs-document-properties-close-button = Zacyni艣
+
+## Print
+
+pdfjs-print-progress-message = Dokument p艣ig贸tujo se za 艣i拧膰anje鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = P艣etergnu艣
+pdfjs-printing-not-supported = Warnowanje: 艢i拧膰anje njep贸dp臎ra se po艂nje p艣ez to艣 ten wobgl臎dowak.
+pdfjs-printing-not-ready = Warnowanje: PDF njejo se za 艣i拧膰anje dopo艂nje zacyta艂.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Bocnicu pokaza艣/schowa艣
+pdfjs-toggle-sidebar-notification-button =
+    .title = Bocnicu p艣e拧altowa艣 (dokument rozr臎dowanje/p艣ipiski/warstwy wop艣imujo)
+pdfjs-toggle-sidebar-button-label = Bocnicu pokaza艣/schowa艣
+pdfjs-document-outline-button =
+    .title = Dokumentowe nara藕enje pokaza艣 (dw贸jne kliknjenje, aby se w拧ykne zapiski pokazali/schowali)
+pdfjs-document-outline-button-label = Dokumentowa struktura
+pdfjs-attachments-button =
+    .title = P艣idanki pokaza艣
+pdfjs-attachments-button-label = P艣idanki
+pdfjs-layers-button =
+    .title = Warstwy pokaza艣 (klikni艣o dw贸jcy, aby w拧ykne warstwy na standardny staw sl臎dk staji艂)
+pdfjs-layers-button-label = Warstwy
+pdfjs-thumbs-button =
+    .title = Miniatury pokaza艣
+pdfjs-thumbs-button-label = Miniatury
+pdfjs-current-outline-item-button =
+    .title = Aktualny rozr臎dowa艅ski zapisk pyta艣
+pdfjs-current-outline-item-button-label = Aktualny rozr臎dowa艅ski zapisk
+pdfjs-findbar-button =
+    .title = W dokumen艣e pyta艣
+pdfjs-findbar-button-label = Pyta艣
+pdfjs-additional-layers = Dal拧ne warstwy
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Bok { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura boka { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Bok { $page } wubra艣
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Bok { $page } z { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Pyta艣
+    .placeholder = W dokumen艣e pyta艣鈥�
+pdfjs-find-previous-button =
+    .title = Pjerwjej拧ne wustupowanje pyta艅skego wuraza pyta艣
+pdfjs-find-previous-button-label = Sl臎dk
+pdfjs-find-next-button =
+    .title = P艣idujuce wustupowanje pyta艅skego wuraza pyta艣
+pdfjs-find-next-button-label = Dalej
+pdfjs-find-highlight-checkbox = W拧ykne wuzwignu艣
+pdfjs-find-match-case-checkbox-label = Na wjelikopisanje 藕iwa艣
+pdfjs-find-match-diacritics-checkbox-label = Diakritiske znamu拧ka wu啪ywa艣
+pdfjs-find-entire-word-checkbox-label = Ce艂e s艂owa
+pdfjs-find-reached-top = Zachopje艅k dokumenta dostany, p贸k拧acujo se z k贸艅com
+pdfjs-find-reached-bottom = K贸艅c dokumenta dostany, p贸k拧acujo se ze zachopje艅kom
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } z { $total } w贸tpow臎dnika
+        [two] { $current } z { $total } w贸tpow臎dnikowu
+        [few] { $current } z { $total } w贸tpow臎dnikow
+       *[other] { $current } z { $total } w贸tpow臎dnikow
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Wu拧ej { $limit } w贸tpow臎dnik
+        [two] Wu拧ej { $limit } w贸tpow臎dnika
+        [few] Wu拧ej { $limit } w贸tpow臎dniki
+       *[other] Wu拧ej { $limit } w贸tpow臎dniki
+    }
+pdfjs-find-not-found = Pyta艅ski wuraz njejo se namaka艂
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 艩yrokos膰 boka
+pdfjs-page-scale-fit = Wjelikos膰 boka
+pdfjs-page-scale-auto = Awtomatiske skal臎rowanje
+pdfjs-page-scale-actual = Aktualna wjelikos膰
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Bok { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = P艣i zacytowanju PDF jo zm贸lka nasta艂a.
+pdfjs-invalid-file-error = Njep艂a艣iwa abo wob拧k贸藕ona PDF-dataja.
+pdfjs-missing-file-error = Felujuca PDF-dataja.
+pdfjs-unexpected-response-error = Njew贸cakane serwerowe w贸tegrono.
+pdfjs-rendering-error = P艣i zwobraznjanju boka jo zm贸lka nasta艂a.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Typ p艣ipiskow: { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Zap贸daj艣o gronid艂o, aby PDF-dataju w贸cyni艂.
+pdfjs-password-invalid = Njep艂a艣iwe gronid艂o. P拧osym wopytaj艣o hy拧膰i raz.
+pdfjs-password-ok-button = W p贸r臎藕e
+pdfjs-password-cancel-button = P艣etergnu艣
+pdfjs-web-fonts-disabled = Webpisma su znjem贸啪njone: njejo m贸啪no, zasaj藕one PDF-pisma wu啪ywa艣.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Tekstowu barwu zm臎ni艣
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Kresli艣
+pdfjs-editor-color-picker-ink-input =
+    .title = Kresle艅sku barwu zm臎ni艣
+pdfjs-editor-ink-button-label = Kresli艣
+pdfjs-editor-stamp-button =
+    .title = Wobraze p艣ida艣 abo wob藕臎艂a艣
+pdfjs-editor-stamp-button-label = Wobraze p艣ida艣 abo wob藕臎艂a艣
+pdfjs-editor-highlight-button =
+    .title = Wuzwignu艣
+pdfjs-editor-highlight-button-label = Wuzwignu艣
+pdfjs-highlight-floating-button1 =
+    .title = Wuzwignu艣
+    .aria-label = Wuzwignu艣
+pdfjs-highlight-floating-button-label = Wuzwignu艣
+pdfjs-comment-floating-button =
+    .title = Koment臎rowa艣
+    .aria-label = Koment臎rowa艣
+pdfjs-comment-floating-button-label = Koment臎rowa艣
+pdfjs-editor-comment-button =
+    .title = Koment臎rowa艣
+    .aria-label = Koment臎rowa艣
+pdfjs-editor-comment-button-label = Komentar
+pdfjs-editor-signature-button =
+    .title = Signaturu p艣ida艣
+pdfjs-editor-signature-button-label = Signaturu p艣ida艣
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor wuzwignjenja
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Kresle艅ski editor
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Signaturowy editor: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Wobrazowy editor
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Kreslanku w贸tw贸no藕e艣
+pdfjs-editor-remove-freetext-button =
+    .title = Tekst w贸tw贸no藕e艣
+pdfjs-editor-remove-stamp-button =
+    .title = Wobraz w贸tw贸no藕e艣
+pdfjs-editor-remove-highlight-button =
+    .title = Wuzwignjenje w贸tp贸ra艣
+pdfjs-editor-remove-signature-button =
+    .title = Signaturu w贸tw贸no藕e艣
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Barwa
+pdfjs-editor-free-text-size-input = Wjelikos膰
+pdfjs-editor-ink-color-input = Barwa
+pdfjs-editor-ink-thickness-input = T艂ustos膰
+pdfjs-editor-ink-opacity-input = Opacita
+pdfjs-editor-stamp-add-image-button =
+    .title = Wobraz p艣ida艣
+pdfjs-editor-stamp-add-image-button-label = Wobraz p艣ida艣
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = T艂ustos膰
+pdfjs-editor-free-highlight-thickness-title =
+    .title = T艂ustos膰 zm臎ni艣, ga啪 se zapiski wuzwiguju, k贸tare啪 tekst njejsu
+pdfjs-editor-add-signature-container =
+    .aria-label = W贸藕e艅ske elementy signaturow a sk艂a藕one signatury
+pdfjs-editor-signature-add-signature-button =
+    .title = Nowu signaturu p艣ida艣
+pdfjs-editor-signature-add-signature-button-label = Nowu signaturu p艣ida艣
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Sk艂a藕ona signatura: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Tekstowy editor
+    .default-content = Zachop艣o pisa艣 鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] { $count } komentar
+        [two] { $count } komentara
+        [few] { $count } komentary
+       *[other] { $count } komentarow
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Bocnicu zacyni艣
+    .aria-label = Bocnicu zacyni艣
+pdfjs-editor-comments-sidebar-close-button-label = Bocnicu zacyni艣
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Wi藕i艣o n臎co wobspomnje艣a g贸dnego? Wuzwigni艣o to a zaw贸staj艣o komentar.
+pdfjs-editor-comments-sidebar-no-comments-link = Dal拧ne informacije
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternatiwny tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Alternatiwny tekst wob藕臎艂a艣
+pdfjs-editor-alt-text-dialog-label = Nastajenje wubra艣
+pdfjs-editor-alt-text-dialog-description = Alternatiwny tekst pomaga, ga啪 lu藕e njam贸gu wobraz wi藕e艣 abo ga啪 se wobraz njezacytajo.
+pdfjs-editor-alt-text-add-description-label = Wopisanje p艣ida艣
+pdfjs-editor-alt-text-add-description-description = Pi拧膰o 1 sadu abo 2 sa藕e, k贸tarej啪 temu, nastajenje abo akcije wopisujotej.
+pdfjs-editor-alt-text-mark-decorative-label = Ako dekoratiwny mark臎rowa艣
+pdfjs-editor-alt-text-mark-decorative-description = To se za py拧njece wobraze wu啪ywa, na p艣ik艂ad ramiki abo w贸dowe znamjenja.
+pdfjs-editor-alt-text-cancel-button = P艣etergnu艣
+pdfjs-editor-alt-text-save-button = Sk艂adowa艣
+pdfjs-editor-alt-text-decorative-tooltip = Ako dekoratiwny mark臎rowany
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Na p艣ik艂ad, 鈥濵艂ody muski za blidom sej藕i, aby j臎藕 j臎d艂鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternatiwny tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = G贸rjejce nal臎wo 鈥� wjelikos膰 zm臎ni艣
+pdfjs-editor-resizer-top-middle =
+    .aria-label = G贸rjejce wesrjej藕 鈥� wjelikos膰 zm臎ni艣
+pdfjs-editor-resizer-top-right =
+    .aria-label = G贸rjejce nap拧awo 鈥� wjelikos膰 zm臎ni艣
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Wesrjej藕 nap拧awo 鈥� wjelikos膰 zm臎ni艣
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Do艂ojce nap拧awo 鈥� wjelikos膰 zm臎ni艣
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Do艂ojce wesrjej藕 鈥� wjelikos膰 zm臎ni艣
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Do艂ojce nal臎wo 鈥� wjelikos膰 zm臎ni艣
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Wesrjej藕 nal臎wo 鈥� wjelikos膰 zm臎ni艣
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Barwa wuzwignjenja
+pdfjs-editor-colorpicker-button =
+    .title = Barwu zm臎ni艣
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Wub臎rk barwow
+pdfjs-editor-colorpicker-yellow =
+    .title = 沤o艂ty
+pdfjs-editor-colorpicker-green =
+    .title = Zeleny
+pdfjs-editor-colorpicker-blue =
+    .title = M贸dry
+pdfjs-editor-colorpicker-pink =
+    .title = Pink
+pdfjs-editor-colorpicker-red =
+    .title = Cerwjeny
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = W拧ykne pokaza艣
+pdfjs-editor-highlight-show-all-button =
+    .title = W拧ykne pokaza艣
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Alternatiwny tekst wob藕臎艂a艣 (wobrazowe wopisanje)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Alternatiwny tekst p艣ida艣 (wobrazowe wopisanje)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Pi拧膰o how sw贸jo wopisanje鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Krotke wopisanje za lu藕e, k贸tare啪 njam贸啪o艣o wobraz wi藕e艣 abo ga啪 se wobraz njezacytajo.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = To艣 ten alternatiwny tekst jo se awtomatiski nap贸ra艂 a jo sna藕 njedokradny.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Dal拧ne informacije
+pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatiwny tekst awtomatiski nap贸ra艣
+pdfjs-editor-new-alt-text-not-now-button = Nic n臎nto
+pdfjs-editor-new-alt-text-error-title = Alternatiwny tekst njedajo se awtomatiski nap贸ra艣
+pdfjs-editor-new-alt-text-error-description = P拧osym pi拧膰o sw贸j alternatiwny tekst abo wopytaj艣o p贸zd藕ej hy拧膰i raz.
+pdfjs-editor-new-alt-text-error-close-button = Zacyni艣
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Model KI za alternatiwny tekst se ze艣臎gujo ({ $downloadedSize } z { $totalSize } MB)
+    .aria-valuetext = Model KI za alternatiwny tekst se ze艣臎gujo ({ $downloadedSize } z { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternatiwny tekst jo se p艣ida艂
+pdfjs-editor-new-alt-text-added-button-label = Alternatiwny tekst jo se p艣ida艂
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Alternatiwny tekst felujo
+pdfjs-editor-new-alt-text-missing-button-label = Alternatiwny tekst felujo
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Alternatiwny tekst p艣egl臎dowa艣
+pdfjs-editor-new-alt-text-to-review-button-label = Alternatiwny tekst p艣egl臎dowa艣
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Awtomatiski nap贸rany: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Nastajenja alternatiwnego wobrazowego teksta
+pdfjs-image-alt-text-settings-button-label = Nastajenja alternatiwnego wobrazowego teksta
+pdfjs-editor-alt-text-settings-dialog-label = Nastajenja alternatiwnego wobrazowego teksta
+pdfjs-editor-alt-text-settings-automatic-title = Awtomatiski alternatiwny tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Alternatiwny tekst awtomatiski nap贸ra艣
+pdfjs-editor-alt-text-settings-create-model-description = Nara藕ujo wopisanja, aby pomaga艂 ludam, k贸tare啪 njam贸啪o艣o wobraz wi藕e艣 abo ga啪 se wobraz njezacytajo.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model KI alternatiwnego teksta ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = B臎啪y lokalnje na wa拧om r臎藕e, aby wa拧e daty priwatne w贸stali. Za awtomatiski alternatiwny tekst trjebny.
+pdfjs-editor-alt-text-settings-delete-model-button = La拧owa艣
+pdfjs-editor-alt-text-settings-download-model-button = Ze艣臎gnu艣
+pdfjs-editor-alt-text-settings-downloading-model-button = Ze艣臎gujo se鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor za alternatiwny tekst
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Editor alternatiwnego teksta ned pokaza艣, ga啪 se wobraz p艣idawa
+pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga, wam w拧ym sw贸jim wobrazam alternatiwny tekst p艣ida艣.
+pdfjs-editor-alt-text-settings-close-button = Zacyni艣
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Wuzwignjenje p艣idane
+pdfjs-editor-freetext-added-alert = Tekst p艣idany
+pdfjs-editor-ink-added-alert = Kreslanka p艣idana
+pdfjs-editor-stamp-added-alert = Wobraz p艣idany
+pdfjs-editor-signature-added-alert = Signatura p艣idana
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = W贸tw贸no藕one wuzwignu艣
+pdfjs-editor-undo-bar-message-freetext = Tekst jo se w贸tw贸no藕e艂
+pdfjs-editor-undo-bar-message-ink = Kreslanka jo se w贸tw贸no藕e艂a
+pdfjs-editor-undo-bar-message-stamp = Wobraz jo se w贸tw贸no藕e艂
+pdfjs-editor-undo-bar-message-signature = Signatura jo se w贸tw贸no藕e艂a
+pdfjs-editor-undo-bar-message-comment = Komentar jo se w贸tw贸no藕e艂
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } p艣ipisk jo se w贸tw贸no藕e艂
+        [two] { $count } p艣ipiska stej se w贸tw贸no藕e艂ej
+        [few] { $count } p艣ipiski su se w贸tw贸no藕eli
+       *[other] { $count } p艣ipiskow jo se w贸tw贸no藕e艂o
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Anul臎rowa艣
+pdfjs-editor-undo-bar-undo-button-label = Anul臎rowa艣
+pdfjs-editor-undo-bar-close-button =
+    .title = Zacyni艣
+pdfjs-editor-undo-bar-close-button-label = Zacyni艣
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = To艣 ten modalny dialog wu啪ywarjeju zm贸啪nja, signaturu nap贸ra艣, aby PDF-dokument p艣ida艂. Wu啪ywa艜 m贸啪o m臎 wob藕臎艂a艣 (k贸tare啪 teke ako alternatiwny tekst s艂u啪y) a p贸 啪ycenju signaturu za w贸spjetne wu啪ywanje sk艂adowa艣.
+pdfjs-editor-add-signature-dialog-title = Signaturu p艣ida艣
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Typ
+    .title = Typ
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Kresli艣
+    .title = Kresli艣
+pdfjs-editor-add-signature-image-button = Wobraz
+    .title = Wobraz
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Zap贸daj艣o sw贸ju signaturu
+    .placeholder = Zap贸daj艣o sw贸ju signaturu
+pdfjs-editor-add-signature-draw-placeholder = Kresli艣o sw贸ju signaturu
+pdfjs-editor-add-signature-draw-thickness-range-label = T艂ustos膰
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = T艂ustos膰 kreslanki: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 艢臎gni艣o dataju sem, aby ju nagra艂
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Abo wubje艜艣o wobrazowe dataje
+       *[other] Abo p艣epytaj艣o wobrazowe dataje
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Wopisanje (alternatiwny tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Wopisanje (alternatiwny tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Signatura
+pdfjs-editor-add-signature-clear-button-label = Signaturu la拧owa艣
+pdfjs-editor-add-signature-clear-button =
+    .title = Signaturu la拧owa艣
+pdfjs-editor-add-signature-save-checkbox = Signaturu sk艂adowa艣
+pdfjs-editor-add-signature-save-warning-message = S膰o doj艣pi艂 limit 5 sk艂a藕onych signaturow. W贸tw贸no藕膰o jadnu, aby w臎cej sk艂adowa艂.
+pdfjs-editor-add-signature-image-upload-error-title = Wobraz njedajo se nagra艣
+pdfjs-editor-add-signature-image-upload-error-description = P艣egl臎daj艣o sw贸j se艣owy zwisk abo wopytaj艣o drugi wobraz.
+pdfjs-editor-add-signature-image-no-data-error-title = To艣 ten wobraz njedajo se do signatury p艣etw贸ri艣
+pdfjs-editor-add-signature-image-no-data-error-description = Wopytaj艣o p拧osym drugi wobraz nagra艣.
+pdfjs-editor-add-signature-error-close-button = Zacyni艣
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = P艣etergnu艣
+pdfjs-editor-add-signature-add-button = P艣ida艣
+pdfjs-editor-edit-signature-update-button = Aktualiz臎rowa艣
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Komentar wob藕臎艂a艣
+pdfjs-editor-edit-comment-popup-button =
+    .title = Komentar wob藕臎艂a艣
+pdfjs-editor-delete-comment-popup-button-label = Komentar w贸tw贸no藕e艣
+pdfjs-editor-delete-comment-popup-button =
+    .title = Komentar w贸tw贸no藕e艣
+pdfjs-show-comment-button =
+    .title = Komentar pokaza艣
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Komentar wob藕臎艂a艣
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualiz臎rowa艣
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Komentar p艣ida艣
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = P艣ida艣
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Zachop艣o pisa艣鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = P艣etergnu艣
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Komentar p艣ida艣
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Bocnicu p艣e拧altowa艣 (dokument miniatury/rozr臎dowanje/p艣ipiski/warstwy wop艣imujo)
+pdfjs-toggle-views-manager-button1-label = Boki zastoja艣
+pdfjs-views-manager-sidebar =
+    .aria-label = Bocnica
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = P艣im臎rjenje wjelikos膰i bocnice
+pdfjs-views-manager-view-selector-button =
+    .title = Nagl臎dy
+pdfjs-views-manager-view-selector-button-label = Nagl臎dy
+pdfjs-views-manager-pages-title = Boki
+pdfjs-views-manager-outlines-title1 = Dokumentowa struktura
+    .title = Dokumentowa struktura (klikni艣o dw贸jcy, aby w拧ykne zapiski pokaza艂/schowa艂)
+pdfjs-views-manager-attachments-title = P艣idanki
+pdfjs-views-manager-layers-title1 = Rowniny
+    .title = Rowniny (klikni艣o dw贸jcy, aby w拧ykne rowniny na standardny status sl臎dk staji艂)
+pdfjs-views-manager-pages-option-label = Boki
+pdfjs-views-manager-outlines-option-label = Dokumentowa struktura
+pdfjs-views-manager-attachments-option-label = P艣idanki
+pdfjs-views-manager-layers-option-label = Rowniny
+pdfjs-views-manager-add-file-button =
+    .title = Dataju p艣ida艣
+pdfjs-views-manager-add-file-button-label = Dataju p艣ida艣
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } wubrany
+        [two] { $count } wubranej
+        [few] { $count } wubrane
+       *[other] { $count } wubrane
+    }
+pdfjs-views-manager-pages-status-none-action-label = Boki wubra艣
+pdfjs-views-manager-pages-status-action-button-label = Zastoja艣
+pdfjs-views-manager-pages-status-copy-button-label = Kop臎rowa艣
+pdfjs-views-manager-pages-status-cut-button-label = Wur臎za艣
+pdfjs-views-manager-pages-status-delete-button-label = La拧owa艣
+pdfjs-views-manager-pages-status-export-selected-button-label = Wubrane eksport臎rowa艣鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] { $count } bok wur臎zany
+        [two] { $count } boka wur臎zanej
+        [few] { $count } boki wur臎zane
+       *[other] { $count } bokow wur臎zane
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] { $count } bok kop臎rowany
+        [two] { $count } boka kop臎rowanej
+        [few] { $count } boki kop臎rowane
+       *[other] { $count } bokow kop臎rowane
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] { $count } bok wula拧owany
+        [two] { $count } boka wula拧owanej
+        [few] { $count } boki wula拧owane
+       *[other] { $count } bokow wula拧owane
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Wa拧a dataja se p艣ig贸tujo鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Dataja se nagrawa鈥�
+pdfjs-views-manager-status-warning-cut-label = Njedajo se wur臎za艣. Aktualiz臎ruj艣o bok a wopytaj艣o hy拧膰i raz.
+pdfjs-views-manager-status-warning-copy-label = Njedajo se kop臎rowa艣. Aktualiz臎ruj艣o bok a wopytaj艣o hy拧膰i raz.
+pdfjs-views-manager-status-warning-delete-label = Njedajo se la拧owa艣. Aktualiz臎ruj艣o bok a wopytaj艣o hy拧膰i raz.
+pdfjs-views-manager-status-warning-save-label = Njedajo se sk艂adowa艣. Aktualiz臎ruj艣o bok a wopytaj艣o hy拧膰i raz.
+pdfjs-views-manager-status-undo-button-label = Anul臎rowa艣
+pdfjs-views-manager-status-done-button-label = Dok贸艅cony
+pdfjs-views-manager-status-close-button =
+    .title = Zacyni艣
+pdfjs-views-manager-status-close-button-label = Zacyni艣
+pdfjs-views-manager-paste-button-label = Zasaj藕i艣
+pdfjs-views-manager-paste-button-before =
+    .title = P艣ed pr臎dnym bokom zasaj藕i艣
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Za bokom { $page } zasaj藕i艣
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOWY
+pdfjs-views-manager-waiting-for-file = Dataja se nagrawa鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Boki zastoja艣
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Sk艂a藕onu signaturu w贸tw贸no藕e艣
+pdfjs-editor-delete-signature-button-label1 = Sk艂a藕onu signaturu w贸tw贸no藕e艣
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Wopisanje wob藕臎艂a艣
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Wopisanje wob藕臎艂a艣
diff --git a/public/pdfjs/web/locale/el/viewer.ftl b/public/pdfjs/web/locale/el/viewer.ftl
new file mode 100644
index 0000000..ffdebd2
--- /dev/null
+++ b/public/pdfjs/web/locale/el/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 螤蟻慰畏纬慰蠉渭蔚谓畏 蟽蔚位委未伪
+pdfjs-previous-button-label = 螤蟻慰畏纬慰蠉渭蔚谓畏
+pdfjs-next-button =
+    .title = 螘蟺蠈渭蔚谓畏 蟽蔚位委未伪
+pdfjs-next-button-label = 螘蟺蠈渭蔚谓畏
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 危蔚位委未伪
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 伪蟺蠈 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 伪蟺蠈 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 危渭委魏蟻蠀谓蟽畏
+pdfjs-zoom-out-button-label = 危渭委魏蟻蠀谓蟽畏
+pdfjs-zoom-in-button =
+    .title = 螠蔚纬苇胃蠀谓蟽畏
+pdfjs-zoom-in-button-label = 螠蔚纬苇胃蠀谓蟽畏
+pdfjs-zoom-select =
+    .title = 螙慰蠀渭
+pdfjs-presentation-mode-button =
+    .title = 螘谓伪位位伪纬萎 蟽蔚 位蔚喂蟿慰蠀蟻纬委伪 蟺伪蟻慰蠀蟽委伪蟽畏蟼
+pdfjs-presentation-mode-button-label = 螞蔚喂蟿慰蠀蟻纬委伪 蟺伪蟻慰蠀蟽委伪蟽畏蟼
+pdfjs-open-file-button =
+    .title = 螁谓慰喂纬渭伪 伪蟻蠂蔚委慰蠀
+pdfjs-open-file-button-label = 螁谓慰喂纬渭伪
+pdfjs-print-button =
+    .title = 螘魏蟿蠉蟺蠅蟽畏
+pdfjs-print-button-label = 螘魏蟿蠉蟺蠅蟽畏
+pdfjs-save-button =
+    .title = 螒蟺慰胃萎魏蔚蠀蟽畏
+pdfjs-save-button-label = 螒蟺慰胃萎魏蔚蠀蟽畏
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 螞萎蠄畏
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 螞萎蠄畏
+pdfjs-bookmark-button =
+    .title = 韦蟻苇蠂慰蠀蟽伪 蟽蔚位委未伪 (螤蟻慰尾慰位萎 URL 伪蟺蠈 蟿蟻苇蠂慰蠀蟽伪 蟽蔚位委未伪)
+pdfjs-bookmark-button-label = 韦蟻苇蠂慰蠀蟽伪 蟽蔚位委未伪
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 螘蟻纬伪位蔚委伪
+pdfjs-tools-button-label = 螘蟻纬伪位蔚委伪
+pdfjs-first-page-button =
+    .title = 螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟺蟻蠋蟿畏 蟽蔚位委未伪
+pdfjs-first-page-button-label = 螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟺蟻蠋蟿畏 蟽蔚位委未伪
+pdfjs-last-page-button =
+    .title = 螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟿蔚位蔚蠀蟿伪委伪 蟽蔚位委未伪
+pdfjs-last-page-button-label = 螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟿蔚位蔚蠀蟿伪委伪 蟽蔚位委未伪
+pdfjs-page-rotate-cw-button =
+    .title = 螖蔚尉喂蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+pdfjs-page-rotate-cw-button-label = 螖蔚尉喂蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+pdfjs-page-rotate-ccw-button =
+    .title = 螒蟻喂蟽蟿蔚蟻蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+pdfjs-page-rotate-ccw-button-label = 螒蟻喂蟽蟿蔚蟻蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+pdfjs-cursor-text-select-tool-button =
+    .title = 螘谓蔚蟻纬慰蟺慰委畏蟽畏 蔚蟻纬伪位蔚委慰蠀 蔚蟺喂位慰纬萎蟼 魏蔚喂渭苇谓慰蠀
+pdfjs-cursor-text-select-tool-button-label = 螘蟻纬伪位蔚委慰 蔚蟺喂位慰纬萎蟼 魏蔚喂渭苇谓慰蠀
+pdfjs-cursor-hand-tool-button =
+    .title = 螘谓蔚蟻纬慰蟺慰委畏蟽畏 蔚蟻纬伪位蔚委慰蠀 蠂蔚蟻喂慰蠉
+pdfjs-cursor-hand-tool-button-label = 螘蟻纬伪位蔚委慰 蠂蔚蟻喂慰蠉
+pdfjs-scroll-page-button =
+    .title = 围蟻萎蟽畏 魏蠉位喂蟽畏蟼 蟽蔚位委未伪蟼
+pdfjs-scroll-page-button-label = 螝蠉位喂蟽畏 蟽蔚位委未伪蟼
+pdfjs-scroll-vertical-button =
+    .title = 围蟻萎蟽畏 魏维胃蔚蟿畏蟼 魏蠉位喂蟽畏蟼
+pdfjs-scroll-vertical-button-label = 螝维胃蔚蟿畏 魏蠉位喂蟽畏
+pdfjs-scroll-horizontal-button =
+    .title = 围蟻萎蟽畏 慰蟻喂味蠈谓蟿喂伪蟼 魏蠉位喂蟽畏蟼
+pdfjs-scroll-horizontal-button-label = 螣蟻喂味蠈谓蟿喂伪 魏蠉位喂蟽畏
+pdfjs-scroll-wrapped-button =
+    .title = 围蟻萎蟽畏 魏蠀魏位喂魏萎蟼 魏蠉位喂蟽畏蟼
+pdfjs-scroll-wrapped-button-label = 螝蠀魏位喂魏萎 魏蠉位喂蟽畏
+pdfjs-spread-none-button =
+    .title = 螡伪 渭畏谓 纬委谓蔚喂 蟽蠉谓未蔚蟽畏 蟿蠅谓 蔚蟺蔚魏蟿维蟽蔚蠅谓 蟽蔚位委未蠅谓
+pdfjs-spread-none-button-label = 围蠅蟻委蟼 蔚蟺蔚魏蟿维蟽蔚喂蟼
+pdfjs-spread-odd-button =
+    .title = 危蠉谓未蔚蟽畏 蔚蟺蔚魏蟿维蟽蔚蠅谓 蟽蔚位委未蠅谓 尉蔚魏喂谓蠋谓蟿伪蟼 伪蟺蠈 蟿喂蟼 渭慰谓苇蟼 蟽蔚位委未蔚蟼
+pdfjs-spread-odd-button-label = 螠慰谓苇蟼 蔚蟺蔚魏蟿维蟽蔚喂蟼
+pdfjs-spread-even-button =
+    .title = 危蠉谓未蔚蟽畏 蔚蟺蔚魏蟿维蟽蔚蠅谓 蟽蔚位委未蠅谓 尉蔚魏喂谓蠋谓蟿伪蟼 伪蟺蠈 蟿喂蟼 味蠀纬苇蟼 蟽蔚位委未蔚蟼
+pdfjs-spread-even-button-label = 螙蠀纬苇蟼 蔚蟺蔚魏蟿维蟽蔚喂蟼
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 螜未喂蠈蟿畏蟿蔚蟼 蔚纬纬蟻维蠁慰蠀鈥�
+pdfjs-document-properties-button-label = 螜未喂蠈蟿畏蟿蔚蟼 蔚纬纬蟻维蠁慰蠀鈥�
+pdfjs-document-properties-file-name = 螌谓慰渭伪 伪蟻蠂蔚委慰蠀:
+pdfjs-document-properties-file-size = 螠苇纬蔚胃慰蟼 伪蟻蠂蔚委慰蠀:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = 韦委蟿位慰蟼:
+pdfjs-document-properties-author = 危蠀纬纬蟻伪蠁苇伪蟼:
+pdfjs-document-properties-subject = 螛苇渭伪:
+pdfjs-document-properties-keywords = 螞苇尉蔚喂蟼-魏位蔚喂未喂维:
+pdfjs-document-properties-creation-date = 螚渭蔚蟻慰渭畏谓委伪 未畏渭喂慰蠀蟻纬委伪蟼:
+pdfjs-document-properties-modification-date = 螚渭蔚蟻慰渭畏谓委伪 蟿蟻慰蟺慰蟺慰委畏蟽畏蟼:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 螖畏渭喂慰蠀蟻纬蠈蟼:
+pdfjs-document-properties-producer = 螤伪蟻伪纬蠅纬蠈蟼 PDF:
+pdfjs-document-properties-version = 螆魏未慰蟽畏 PDF:
+pdfjs-document-properties-page-count = 螒蟻喂胃渭蠈蟼 蟽蔚位委未蠅谓:
+pdfjs-document-properties-page-size = 螠苇纬蔚胃慰蟼 蟽蔚位委未伪蟼:
+pdfjs-document-properties-page-size-unit-inches = 委谓蟿蟽蔚蟼
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 魏伪蟿伪魏蠈蟻蠀蠁伪
+pdfjs-document-properties-page-size-orientation-landscape = 慰蟻喂味蠈谓蟿喂伪
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 螘蟺喂蟽蟿慰位萎
+pdfjs-document-properties-page-size-name-legal = 韦蠉蟺慰蠀 Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 韦伪蠂蔚委伪 蟺蟻慰尾慰位萎 喂蟽蟿慰蠉:
+pdfjs-document-properties-linearized-yes = 螡伪喂
+pdfjs-document-properties-linearized-no = 螌蠂喂
+pdfjs-document-properties-close-button = 螝位蔚委蟽喂渭慰
+
+## Print
+
+pdfjs-print-progress-message = 螤蟻慰蔚蟿慰喂渭伪蟽委伪 蟿慰蠀 蔚纬纬蟻维蠁慰蠀 纬喂伪 蔚魏蟿蠉蟺蠅蟽畏鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 螒魏蠉蟻蠅蟽畏
+pdfjs-printing-not-supported = 螤蟻慰蔚喂未慰蟺慰委畏蟽畏: 螚 蔚魏蟿蠉蟺蠅蟽畏 未蔚谓 蠀蟺慰蟽蟿畏蟻委味蔚蟿伪喂 蟺位萎蟻蠅蟼 伪蟺蠈 蟿慰 蟺蟻蠈纬蟻伪渭渭伪 蟺蔚蟻喂萎纬畏蟽畏蟼.
+pdfjs-printing-not-ready = 螤蟻慰蔚喂未慰蟺慰委畏蟽畏: 韦慰 PDF 未蔚谓 蠁慰蟻蟿蠋胃畏魏蔚 蟺位萎蟻蠅蟼 纬喂伪 蔚魏蟿蠉蟺蠅蟽畏.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = (螒蟺)蔚谓蔚蟻纬慰蟺慰委畏蟽畏 蟺位伪蠆谓萎蟼 纬蟻伪渭渭萎蟼
+pdfjs-toggle-sidebar-notification-button =
+    .title = (螒蟺)蔚谓蔚蟻纬慰蟺慰委畏蟽畏 蟺位伪蠆谓萎蟼 纬蟻伪渭渭萎蟼 (蟿慰 苇纬纬蟻伪蠁慰 蟺蔚蟻喂苇蠂蔚喂 蟺蔚蟻委纬蟻伪渭渭伪/蟽蠀谓畏渭渭苇谓伪/蔚蟺委蟺蔚未伪)
+pdfjs-toggle-sidebar-button-label = (螒蟺)蔚谓蔚蟻纬慰蟺慰委畏蟽畏 蟺位伪蠆谓萎蟼 纬蟻伪渭渭萎蟼
+pdfjs-document-outline-button =
+    .title = 螘渭蠁维谓喂蟽畏 未喂维蟻胃蟻蠅蟽畏蟼 蔚纬纬蟻维蠁慰蠀 (未喂蟺位蠈 魏位喂魏 纬喂伪 伪谓维蟺蟿蠀尉畏/蟽蠉渭蟺蟿蠀尉畏 蠈位蠅谓 蟿蠅谓 蟽蟿慰喂蠂蔚委蠅谓)
+pdfjs-document-outline-button-label = 螖喂维蟻胃蟻蠅蟽畏 蔚纬纬蟻维蠁慰蠀
+pdfjs-attachments-button =
+    .title = 螘渭蠁维谓喂蟽畏 蟽蠀谓畏渭渭苇谓蠅谓
+pdfjs-attachments-button-label = 危蠀谓畏渭渭苇谓伪
+pdfjs-layers-button =
+    .title = 螘渭蠁维谓喂蟽畏 蔚蟺喂蟺苇未蠅谓 (未喂蟺位蠈 魏位喂魏 纬喂伪 蔚蟺伪谓伪蠁慰蟻维 蠈位蠅谓 蟿蠅谓 蔚蟺喂蟺苇未蠅谓 蟽蟿畏谓 蟺蟻慰蔚蟺喂位蔚纬渭苇谓畏 魏伪蟿维蟽蟿伪蟽畏)
+pdfjs-layers-button-label = 螘蟺委蟺蔚未伪
+pdfjs-thumbs-button =
+    .title = 螘渭蠁维谓喂蟽畏 渭喂魏蟻慰纬蟻伪蠁喂蠋谓
+pdfjs-thumbs-button-label = 螠喂魏蟻慰纬蟻伪蠁委蔚蟼
+pdfjs-current-outline-item-button =
+    .title = 螘蠉蟻蔚蟽畏 蟿蟻苇蠂慰谓蟿慰蟼 蟽蟿慰喂蠂蔚委慰蠀 未喂维蟻胃蟻蠅蟽畏蟼
+pdfjs-current-outline-item-button-label = 韦蟻苇蠂慰谓 蟽蟿慰喂蠂蔚委慰 未喂维蟻胃蟻蠅蟽畏蟼
+pdfjs-findbar-button =
+    .title = 螘蠉蟻蔚蟽畏 蟽蟿慰 苇纬纬蟻伪蠁慰
+pdfjs-findbar-button-label = 螘蠉蟻蔚蟽畏
+pdfjs-additional-layers = 螘蟺喂蟺蟻蠈蟽胃蔚蟿伪 蔚蟺委蟺蔚未伪
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 危蔚位委未伪 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 螠喂魏蟻慰纬蟻伪蠁委伪 蟽蔚位委未伪蟼 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 螘蟺喂位慰纬萎 蟽蔚位委未伪蟼 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 危蔚位委未伪 { $page } 伪蟺蠈 { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 螘蠉蟻蔚蟽畏
+    .placeholder = 螘蠉蟻蔚蟽畏 蟽蟿慰 苇纬纬蟻伪蠁慰鈥�
+pdfjs-find-previous-button =
+    .title = 螘蠉蟻蔚蟽畏 蟿畏蟼 蟺蟻慰畏纬慰蠉渭蔚谓畏蟼 蔚渭蠁维谓喂蟽畏蟼 蟿畏蟼 蠁蟻维蟽畏蟼
+pdfjs-find-previous-button-label = 螤蟻慰畏纬慰蠉渭蔚谓慰
+pdfjs-find-next-button =
+    .title = 螘蠉蟻蔚蟽畏 蟿畏蟼 蔚蟺蠈渭蔚谓畏蟼 蔚渭蠁维谓喂蟽畏蟼 蟿畏蟼 蠁蟻维蟽畏蟼
+pdfjs-find-next-button-label = 螘蟺蠈渭蔚谓慰
+pdfjs-find-highlight-checkbox = 螘蟺喂蟽萎渭伪谓蟽畏 蠈位蠅谓
+pdfjs-find-match-case-checkbox-label = 危蠀渭蠁蠅谓委伪 蟺蔚味蠋谓/魏蔚蠁伪位伪委蠅谓
+pdfjs-find-match-diacritics-checkbox-label = 螒谓蟿喂蟽蟿慰委蠂喂蟽畏 未喂伪魏蟻喂蟿喂魏蠋谓
+pdfjs-find-entire-word-checkbox-label = 螣位蠈魏位畏蟻蔚蟼 位苇尉蔚喂蟼
+pdfjs-find-reached-top = 桅蟿维蟽伪蟿蔚 蟽蟿畏谓 伪蟻蠂萎 蟿慰蠀 蔚纬纬蟻维蠁慰蠀, 蟽蠀谓苇蠂蔚喂伪 伪蟺蠈 蟿慰 蟿苇位慰蟼
+pdfjs-find-reached-bottom = 桅蟿维蟽伪蟿蔚 蟽蟿慰 蟿苇位慰蟼 蟿慰蠀 蔚纬纬蟻维蠁慰蠀, 蟽蠀谓苇蠂蔚喂伪 伪蟺蠈 蟿畏谓 伪蟻蠂萎
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 伪蟺蠈 { $total } 伪谓蟿喂蟽蟿慰喂蠂委伪
+       *[other] { $current } 伪蟺蠈 { $total } 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 伪蟺蠈 { $limit } 伪谓蟿喂蟽蟿慰喂蠂委伪
+       *[other] 螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 伪蟺蠈 { $limit } 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+    }
+pdfjs-find-not-found = 螚 蠁蟻维蟽畏 未蔚谓 尾蟻苇胃畏魏蔚
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 螤位维蟿慰蟼 蟽蔚位委未伪蟼
+pdfjs-page-scale-fit = 螠苇纬蔚胃慰蟼 蟽蔚位委未伪蟼
+pdfjs-page-scale-auto = 螒蠀蟿蠈渭伪蟿慰 味慰蠀渭
+pdfjs-page-scale-actual = 螤蟻伪纬渭伪蟿喂魏蠈 渭苇纬蔚胃慰蟼
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 危蔚位委未伪 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 螤蟻慰苇魏蠀蠄蔚 蟽蠁维位渭伪 魏伪蟿维 蟿畏 蠁蠈蟻蟿蠅蟽畏 蟿慰蠀 PDF.
+pdfjs-invalid-file-error = 螠畏 苇纬魏蠀蟻慰 萎 魏伪蟿蔚蟽蟿蟻伪渭渭苇谓慰 伪蟻蠂蔚委慰 PDF.
+pdfjs-missing-file-error = 螞蔚委蟺蔚喂 伪蟻蠂蔚委慰 PDF.
+pdfjs-unexpected-response-error = 螒蟺蟻蠈蟽渭蔚谓畏 伪蟺维谓蟿畏蟽畏 未喂伪魏慰渭喂蟽蟿萎.
+pdfjs-rendering-error = 螤蟻慰苇魏蠀蠄蔚 蟽蠁维位渭伪 魏伪蟿维 蟿畏谓 蔚渭蠁维谓喂蟽畏 蟿畏蟼 蟽蔚位委未伪蟼.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [危蠂蠈位喂慰 芦{ $type }禄]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 螘喂蟽伪纬维纬蔚蟿蔚 蟿慰谓 魏蠅未喂魏蠈 蟺蟻蠈蟽尾伪蟽畏蟼 纬喂伪 谓伪 伪谓慰委尉蔚蟿蔚 伪蠀蟿蠈 蟿慰 伪蟻蠂蔚委慰 PDF.
+pdfjs-password-invalid = 螠畏 苇纬魏蠀蟻慰蟼 魏蠅未喂魏蠈蟼 蟺蟻蠈蟽尾伪蟽畏蟼. 螖慰魏喂渭维蟽蟿蔚 尉伪谓维.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = 螒魏蠉蟻蠅蟽畏
+pdfjs-web-fonts-disabled = 螣喂 纬蟻伪渭渭伪蟿慰蟽蔚喂蟻苇蟼 喂蟽蟿慰蠉 蔚委谓伪喂 伪谓蔚谓蔚蟻纬苇蟼: 未蔚谓 蔚委谓伪喂 未蠀谓伪蟿萎 畏 蠂蟻萎蟽畏 蟿蠅谓 蔚谓蟽蠅渭伪蟿蠅渭苇谓蠅谓 纬蟻伪渭渭伪蟿慰蟽蔚喂蟻蠋谓 PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 螝蔚委渭蔚谓慰
+pdfjs-editor-color-picker-free-text-input =
+    .title = 螒位位伪纬萎 蠂蟻蠋渭伪蟿慰蟼 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-free-text-button-label = 螝蔚委渭蔚谓慰
+pdfjs-editor-ink-button =
+    .title = 危蠂苇未喂慰
+pdfjs-editor-color-picker-ink-input =
+    .title = 螒位位伪纬萎 蠂蟻蠋渭伪蟿慰蟼 蟽蠂蔚未委慰蠀
+pdfjs-editor-ink-button-label = 危蠂苇未喂慰
+pdfjs-editor-stamp-button =
+    .title = 螤蟻慰蟽胃萎魏畏 萎 蔚蟺蔚尉蔚蟻纬伪蟽委伪 蔚喂魏蠈谓蠅谓
+pdfjs-editor-stamp-button-label = 螤蟻慰蟽胃萎魏畏 萎 蔚蟺蔚尉蔚蟻纬伪蟽委伪 蔚喂魏蠈谓蠅谓
+pdfjs-editor-highlight-button =
+    .title = 螘蟺喂蟽萎渭伪谓蟽畏
+pdfjs-editor-highlight-button-label = 螘蟺喂蟽萎渭伪谓蟽畏
+pdfjs-highlight-floating-button1 =
+    .title = 螘蟺喂蟽萎渭伪谓蟽畏
+    .aria-label = 螘蟺喂蟽萎渭伪谓蟽畏
+pdfjs-highlight-floating-button-label = 螘蟺喂蟽萎渭伪谓蟽畏
+pdfjs-comment-floating-button =
+    .title = 危蠂蠈位喂慰
+    .aria-label = 危蠂蠈位喂慰
+pdfjs-comment-floating-button-label = 危蠂蠈位喂慰
+pdfjs-editor-comment-button =
+    .title = 危蠂蠈位喂慰
+    .aria-label = 危蠂蠈位喂慰
+pdfjs-editor-comment-button-label = 危蠂蠈位喂慰
+pdfjs-editor-signature-button =
+    .title = 螤蟻慰蟽胃萎魏畏 蠀蟺慰纬蟻伪蠁萎蟼
+pdfjs-editor-signature-button-label = 螤蟻慰蟽胃萎魏畏 蠀蟺慰纬蟻伪蠁萎蟼
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蔚蟺喂蟽萎渭伪谓蟽畏蟼
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蟽蠂蔚未委慰蠀
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蠀蟺慰纬蟻伪蠁萎蟼: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蔚喂魏蠈谓伪蟼
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 螒蠁伪委蟻蔚蟽畏 蟽蠂蔚未委慰蠀
+pdfjs-editor-remove-freetext-button =
+    .title = 螒蠁伪委蟻蔚蟽畏 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-remove-stamp-button =
+    .title = 螒蠁伪委蟻蔚蟽畏 蔚喂魏蠈谓伪蟼
+pdfjs-editor-remove-highlight-button =
+    .title = 螒蠁伪委蟻蔚蟽畏 蔚蟺喂蟽萎渭伪谓蟽畏蟼
+pdfjs-editor-remove-signature-button =
+    .title = 螒蠁伪委蟻蔚蟽畏 蠀蟺慰纬蟻伪蠁萎蟼
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 围蟻蠋渭伪
+pdfjs-editor-free-text-size-input = 螠苇纬蔚胃慰蟼
+pdfjs-editor-ink-color-input = 围蟻蠋渭伪
+pdfjs-editor-ink-thickness-input = 螤维蠂慰蟼
+pdfjs-editor-ink-opacity-input = 螒未喂伪蠁维谓蔚喂伪
+pdfjs-editor-stamp-add-image-button =
+    .title = 螤蟻慰蟽胃萎魏畏 蔚喂魏蠈谓伪蟼
+pdfjs-editor-stamp-add-image-button-label = 螤蟻慰蟽胃萎魏畏 蔚喂魏蠈谓伪蟼
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 螤维蠂慰蟼
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 螒位位伪纬萎 蟺维蠂慰蠀蟼 魏伪蟿维 蟿畏谓 蔚蟺喂蟽萎渭伪谓蟽畏 蟽蟿慰喂蠂蔚委蠅谓 蔚魏蟿蠈蟼 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-add-signature-container =
+    .aria-label = 危蟿慰喂蠂蔚委伪 蔚位苇纬蠂慰蠀 蠀蟺慰纬蟻伪蠁萎蟼 魏伪喂 伪蟺慰胃畏魏蔚蠀渭苇谓蔚蟼 蠀蟺慰纬蟻伪蠁苇蟼
+pdfjs-editor-signature-add-signature-button =
+    .title = 螤蟻慰蟽胃萎魏畏 谓苇伪蟼 蠀蟺慰纬蟻伪蠁萎蟼
+pdfjs-editor-signature-add-signature-button-label = 螤蟻慰蟽胃萎魏畏 谓苇伪蟼 蠀蟺慰纬蟻伪蠁萎蟼
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 螒蟺慰胃畏魏蔚蠀渭苇谓畏 蠀蟺慰纬蟻伪蠁萎: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 螘蟺蔚尉蔚蟻纬伪蟽委伪 魏蔚喂渭苇谓慰蠀
+    .default-content = 螢蔚魏喂谓萎蟽蟿蔚 谓伪 蟺位畏魏蟿蟻慰位慰纬蔚委蟿蔚鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 危蠂蠈位喂伪
+       *[other] 危蠂蠈位喂伪
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 螝位蔚委蟽喂渭慰 蟺位蔚蠀蟻喂魏萎蟼 蟽蟿萎位畏蟼
+    .aria-label = 螝位蔚委蟽喂渭慰 蟺位蔚蠀蟻喂魏萎蟼 蟽蟿萎位畏蟼
+pdfjs-editor-comments-sidebar-close-button-label = 螝位蔚委蟽喂渭慰 蟺位蔚蠀蟻喂魏萎蟼 蟽蟿萎位畏蟼
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 螔位苇蟺蔚蟿蔚 魏维蟿喂 伪尉喂慰蟽畏渭蔚委蠅蟿慰; 螘蟺喂蟽畏渭维谓蔚蟿蔚 蟿慰 魏伪喂 伪蠁萎蟽蟿蔚 苇谓伪 蟽蠂蠈位喂慰.
+pdfjs-editor-comments-sidebar-no-comments-link = 螠维胃蔚蟿蔚 蟺蔚蟻喂蟽蟽蠈蟿蔚蟻伪
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 螘谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-alt-text-dialog-label = 螖喂伪位苇尉蟿蔚 渭喂伪 蔚蟺喂位慰纬萎
+pdfjs-editor-alt-text-dialog-description = 韦慰 蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰 蔚委谓伪喂 蠂蟻萎蟽喂渭慰 蠈蟿伪谓 慰喂 维谓胃蟻蠅蟺慰喂 未蔚谓 渭蟺慰蟻慰蠉谓 谓伪 未慰蠀谓 蟿畏谓 蔚喂魏蠈谓伪 萎 蠈蟿伪谓 伪蠀蟿萎 未蔚谓 蠁慰蟻蟿蠋谓蔚蟿伪喂.
+pdfjs-editor-alt-text-add-description-label = 螤蟻慰蟽胃萎魏畏 蟺蔚蟻喂纬蟻伪蠁萎蟼
+pdfjs-editor-alt-text-add-description-description = 危蟿慰蠂蔚蠉蟽蟿蔚 蟽蔚 渭委伪 萎 未蠉慰 蟺蟻慰蟿维蟽蔚喂蟼 蟺慰蠀 蟺蔚蟻喂纬蟻维蠁慰蠀谓 蟿慰 胃苇渭伪, 蟿畏 蟻蠉胃渭喂蟽畏 萎 蟿喂蟼 蔚谓苇蟻纬蔚喂蔚蟼.
+pdfjs-editor-alt-text-mark-decorative-label = 螘蟺喂蟽萎渭伪谓蟽畏 蠅蟼 未喂伪魏慰蟽渭畏蟿喂魏蠈
+pdfjs-editor-alt-text-mark-decorative-description = 围蟻畏蟽喂渭慰蟺慰喂蔚委蟿伪喂 纬喂伪 未喂伪魏慰蟽渭畏蟿喂魏苇蟼 蔚喂魏蠈谓蔚蟼, 蠈蟺蠅蟼 蟺蔚蟻喂纬蟻维渭渭伪蟿伪 萎 蠀未伪蟿慰纬蟻伪蠁萎渭伪蟿伪.
+pdfjs-editor-alt-text-cancel-button = 螒魏蠉蟻蠅蟽畏
+pdfjs-editor-alt-text-save-button = 螒蟺慰胃萎魏蔚蠀蟽畏
+pdfjs-editor-alt-text-decorative-tooltip = 螘蟺喂蟽畏渭伪蟽渭苇谓慰 蠅蟼 未喂伪魏慰蟽渭畏蟿喂魏蠈
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 螕喂伪 蟺伪蟻维未蔚喂纬渭伪, 芦螆谓伪蟼 谓蔚伪蟻蠈蟼 维谓未蟻伪蟼 魏维胃蔚蟿伪喂 蟽蔚 苇谓伪 蟿蟻伪蟺苇味喂 纬喂伪 谓伪 蠁维蔚喂 苇谓伪 纬蔚蠉渭伪禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 螘谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 螘蟺维谓蠅 伪蟻喂蟽蟿蔚蟻萎 纬蠅谓委伪 鈥� 伪位位伪纬萎 渭蔚纬苇胃慰蠀蟼
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 螠苇蟽慰 蔚蟺维谓蠅 蟺位蔚蠀蟻维蟼 鈥� 伪位位伪纬萎 渭蔚纬苇胃慰蠀蟼
+pdfjs-editor-resizer-top-right =
+    .aria-label = 螘蟺维谓蠅 未蔚尉喂维 纬蠅谓委伪 鈥� 伪位位伪纬萎 渭蔚纬苇胃慰蠀蟼
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 螠苇蟽慰 未蔚尉喂维蟼 蟺位蔚蠀蟻维蟼 鈥� 伪位位伪纬萎 渭蔚纬苇胃慰蠀蟼
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 螝维蟿蠅 未蔚尉喂维 纬蠅谓委伪 鈥� 伪位位伪纬萎 渭蔚纬苇胃慰蠀蟼
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 螠苇蟽慰 魏维蟿蠅 蟺位蔚蠀蟻维蟼 鈥� 伪位位伪纬萎 渭蔚纬苇胃慰蠀蟼
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 螝维蟿蠅 伪蟻喂蟽蟿蔚蟻萎 纬蠅谓委伪 鈥� 伪位位伪纬萎 渭蔚纬苇胃慰蠀蟼
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 螠苇蟽慰 伪蟻喂蟽蟿蔚蟻萎蟼 蟺位蔚蠀蟻维蟼 鈥� 伪位位伪纬萎 渭蔚纬苇胃慰蠀蟼
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 围蟻蠋渭伪 蔚蟺喂蟽萎渭伪谓蟽畏蟼
+pdfjs-editor-colorpicker-button =
+    .title = 螒位位伪纬萎 蠂蟻蠋渭伪蟿慰蟼
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 螘蟺喂位慰纬苇蟼 蠂蟻蠅渭维蟿蠅谓
+pdfjs-editor-colorpicker-yellow =
+    .title = 螝委蟿蟻喂谓慰
+pdfjs-editor-colorpicker-green =
+    .title = 螤蟻维蟽喂谓慰
+pdfjs-editor-colorpicker-blue =
+    .title = 螠蟺位蔚
+pdfjs-editor-colorpicker-pink =
+    .title = 巍慰味
+pdfjs-editor-colorpicker-red =
+    .title = 螝蠈魏魏喂谓慰
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 螘渭蠁维谓喂蟽畏 蠈位蠅谓
+pdfjs-editor-highlight-show-all-button =
+    .title = 螘渭蠁维谓喂蟽畏 蠈位蠅谓
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 (蟺蔚蟻喂纬蟻伪蠁萎 蔚喂魏蠈谓伪蟼)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 螤蟻慰蟽胃萎魏畏 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 (蟺蔚蟻喂纬蟻伪蠁萎 蔚喂魏蠈谓伪蟼)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 螕蟻维蠄蟿蔚 蟿畏谓 蟺蔚蟻喂纬蟻伪蠁萎 蟽伪蟼 蔚未蠋鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 危蠉谓蟿慰渭畏 蟺蔚蟻喂纬蟻伪蠁萎 纬喂伪 维蟿慰渭伪 蟺慰蠀 未蔚谓 渭蟺慰蟻慰蠉谓 谓伪 未慰蠀谓 蟿畏谓 蔚喂魏蠈谓伪 萎 蠈蟿伪谓 畏 蔚喂魏蠈谓伪 未蔚谓 蠁慰蟻蟿蠋谓蔚蟿伪喂.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 螒蠀蟿蠈 蟿慰 蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰 未畏渭喂慰蠀蟻纬萎胃畏魏蔚 伪蠀蟿蠈渭伪蟿伪 魏伪喂 蔚谓未苇蠂蔚蟿伪喂 谓伪 蔚委谓伪喂 伪谓伪魏蟻喂尾苇蟼.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 螠维胃蔚蟿蔚 蟺蔚蟻喂蟽蟽蠈蟿蔚蟻伪
+pdfjs-editor-new-alt-text-create-automatically-button-label = 螒蠀蟿蠈渭伪蟿畏 未畏渭喂慰蠀蟻纬委伪 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-new-alt-text-not-now-button = 螌蠂喂 蟿蠋蟻伪
+pdfjs-editor-new-alt-text-error-title = 螖蔚谓 萎蟿伪谓 未蠀谓伪蟿萎 畏 伪蠀蟿蠈渭伪蟿畏 未畏渭喂慰蠀蟻纬委伪 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-new-alt-text-error-description = 螕蟻维蠄蟿蔚 蟿慰 未喂魏蠈 蟽伪蟼 蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰 萎 未慰魏喂渭维蟽蟿蔚 尉伪谓维 伪蟻纬蠈蟿蔚蟻伪.
+pdfjs-editor-new-alt-text-error-close-button = 螝位蔚委蟽喂渭慰
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 螞萎蠄畏 渭慰谓蟿苇位慰蠀 韦螡 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 ({ $downloadedSize } 伪蟺蠈 { $totalSize } MB)
+    .aria-valuetext = 螞萎蠄畏 渭慰谓蟿苇位慰蠀 韦螡 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 ({ $downloadedSize } 伪蟺蠈 { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 螤蟻慰蟽蟿苇胃畏魏蔚 蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰
+pdfjs-editor-new-alt-text-added-button-label = 螤蟻慰蟽蟿苇胃畏魏蔚 蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 螒蟺慰蠀蟽委伪 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-new-alt-text-missing-button-label = 螒蟺慰蠀蟽委伪 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 螆位蔚纬蠂慰蟼 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-new-alt-text-to-review-button-label = 螆位蔚纬蠂慰蟼 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 螒蠀蟿蠈渭伪蟿畏 未畏渭喂慰蠀蟻纬委伪: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 巍蠀胃渭委蟽蔚喂蟼 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 蔚喂魏蠈谓伪蟼
+pdfjs-image-alt-text-settings-button-label = 巍蠀胃渭委蟽蔚喂蟼 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 蔚喂魏蠈谓伪蟼
+pdfjs-editor-alt-text-settings-dialog-label = 巍蠀胃渭委蟽蔚喂蟼 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 蔚喂魏蠈谓伪蟼
+pdfjs-editor-alt-text-settings-automatic-title = 螒蠀蟿蠈渭伪蟿慰 蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰
+pdfjs-editor-alt-text-settings-create-model-button-label = 螒蠀蟿蠈渭伪蟿畏 未畏渭喂慰蠀蟻纬委伪 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-alt-text-settings-create-model-description = 螤蟻慰蟿蔚委谓蔚喂 蟺蔚蟻喂纬蟻伪蠁苇蟼 纬喂伪 维蟿慰渭伪 蟺慰蠀 未蔚谓 渭蟺慰蟻慰蠉谓 谓伪 未慰蠀谓 蟿畏谓 蔚喂魏蠈谓伪 萎 蠈蟿伪谓 畏 蔚喂魏蠈谓伪 未蔚谓 蠁慰蟻蟿蠋谓蔚蟿伪喂.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 螠慰谓蟿苇位慰 韦螡 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = 螘魏蟿蔚位蔚委蟿伪喂 蟿慰蟺喂魏维 蟽蟿畏 蟽蠀蟽魏蔚蠀萎 蟽伪蟼, 蠋蟽蟿蔚 蟿伪 未蔚未慰渭苇谓伪 蟽伪蟼 谓伪 蟺伪蟻伪渭苇谓慰蠀谓 喂未喂蠅蟿喂魏维. 螒蟺伪喂蟿蔚委蟿伪喂 纬喂伪 蟿畏 未畏渭喂慰蠀蟻纬委伪 蟿慰蠀 伪蠀蟿蠈渭伪蟿慰蠀 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀.
+pdfjs-editor-alt-text-settings-delete-model-button = 螖喂伪纬蟻伪蠁萎
+pdfjs-editor-alt-text-settings-download-model-button = 螞萎蠄畏
+pdfjs-editor-alt-text-settings-downloading-model-button = 螞萎蠄畏鈥�
+pdfjs-editor-alt-text-settings-editor-title = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 螁渭蔚蟽畏 蔚渭蠁维谓喂蟽畏 蟿畏蟼 蔚蟺蔚尉蔚蟻纬伪蟽委伪蟼 蔚谓伪位位伪魏蟿喂魏慰蠉 魏蔚喂渭苇谓慰蠀 魏伪蟿维 蟿畏谓 蟺蟻慰蟽胃萎魏畏 蔚喂魏蠈谓伪蟼
+pdfjs-editor-alt-text-settings-show-dialog-description = 危伪蟼 尾慰畏胃维 谓伪 尾蔚尾伪喂蠅胃蔚委蟿蔚 蠈蟿喂 蠈位蔚蟼 慰喂 蔚喂魏蠈谓蔚蟼 蟽伪蟼 苇蠂慰蠀谓 蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰.
+pdfjs-editor-alt-text-settings-close-button = 螝位蔚委蟽喂渭慰
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 螤蟻慰蟽蟿苇胃畏魏蔚 蔚蟺喂蟽萎渭伪谓蟽畏
+pdfjs-editor-freetext-added-alert = 螤蟻慰蟽蟿苇胃畏魏蔚 魏蔚委渭蔚谓慰
+pdfjs-editor-ink-added-alert = 螤蟻慰蟽蟿苇胃畏魏蔚 蟽蠂苇未喂慰
+pdfjs-editor-stamp-added-alert = 螤蟻慰蟽蟿苇胃畏魏蔚 蔚喂魏蠈谓伪
+pdfjs-editor-signature-added-alert = 螤蟻慰蟽蟿苇胃畏魏蔚 蠀蟺慰纬蟻伪蠁萎
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 螚 蔚蟺喂蟽萎渭伪谓蟽畏 伪蠁伪喂蟻苇胃畏魏蔚
+pdfjs-editor-undo-bar-message-freetext = 韦慰 魏蔚委渭蔚谓慰 伪蠁伪喂蟻苇胃畏魏蔚
+pdfjs-editor-undo-bar-message-ink = 韦慰 蟽蠂苇未喂慰 伪蠁伪喂蟻苇胃畏魏蔚
+pdfjs-editor-undo-bar-message-stamp = 螚 蔚喂魏蠈谓伪 伪蠁伪喂蟻苇胃畏魏蔚
+pdfjs-editor-undo-bar-message-signature = 螚 蠀蟺慰纬蟻伪蠁萎 伪蠁伪喂蟻苇胃畏魏蔚
+pdfjs-editor-undo-bar-message-comment = 韦慰 蟽蠂蠈位喂慰 伪蠁伪喂蟻苇胃畏魏蔚
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] 螒蠁伪喂蟻苇胃畏魏蔚 { $count } 蟽蠂慰位喂伪蟽渭蠈蟼
+       *[other] 螒蠁伪喂蟻苇胃畏魏伪谓 { $count } 蟽蠂慰位喂伪蟽渭慰委
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 螒谓伪委蟻蔚蟽畏
+pdfjs-editor-undo-bar-undo-button-label = 螒谓伪委蟻蔚蟽畏
+pdfjs-editor-undo-bar-close-button =
+    .title = 螝位蔚委蟽喂渭慰
+pdfjs-editor-undo-bar-close-button-label = 螝位蔚委蟽喂渭慰
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 螒蠀蟿蠈 蟿慰 蟺伪蟻维胃蠀蟻慰 未喂伪位蠈纬慰蠀 蔚蟺喂蟿蟻苇蟺蔚喂 蟽蟿慰谓 蠂蟻萎蟽蟿畏 谓伪 未畏渭喂慰蠀蟻纬萎蟽蔚喂 渭喂伪 蠀蟺慰纬蟻伪蠁萎 纬喂伪 谓伪 蟿畏谓 蟺蟻慰蟽胃苇蟽蔚喂 蟽蔚 苇谓伪 苇纬纬蟻伪蠁慰 PDF. 螣 蠂蟻萎蟽蟿畏蟼 渭蟺慰蟻蔚委 谓伪 蔚蟺蔚尉蔚蟻纬伪蟽蟿蔚委 蟿慰 蠈谓慰渭伪 (蟿慰 慰蟺慰委慰 蠂蟻畏蟽喂渭蔚蠉蔚喂 魏伪喂 蠅蟼 蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰) 魏伪喂, 蟺蟻慰伪喂蟻蔚蟿喂魏维, 谓伪 伪蟺慰胃畏魏蔚蠉蟽蔚喂 蟿畏谓 蠀蟺慰纬蟻伪蠁萎 纬喂伪 蔚蟺伪谓伪位伪渭尾伪谓蠈渭蔚谓畏 蠂蟻萎蟽畏.
+pdfjs-editor-add-signature-dialog-title = 螤蟻慰蟽胃萎魏畏 蠀蟺慰纬蟻伪蠁萎蟼
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 螤位畏魏蟿蟻慰位蠈纬畏蟽畏
+    .title = 螤位畏魏蟿蟻慰位蠈纬畏蟽畏
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 危蠂苇未喂慰
+    .title = 危蠂苇未喂慰
+pdfjs-editor-add-signature-image-button = 螘喂魏蠈谓伪
+    .title = 螘喂魏蠈谓伪
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 螤位畏魏蟿蟻慰位慰纬萎蟽蟿蔚 蟿畏谓 蠀蟺慰纬蟻伪蠁萎 蟽伪蟼
+    .placeholder = 螤位畏魏蟿蟻慰位慰纬萎蟽蟿蔚 蟿畏谓 蠀蟺慰纬蟻伪蠁萎 蟽伪蟼
+pdfjs-editor-add-signature-draw-placeholder = 危蠂蔚未喂维蟽蟿蔚 蟿畏谓 蠀蟺慰纬蟻伪蠁萎 蟽伪蟼
+pdfjs-editor-add-signature-draw-thickness-range-label = 螤维蠂慰蟼
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 螤维蠂慰蟼 蟽蠂蔚未委慰蠀: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 危蠉蟻蔚蟿蔚 苇谓伪 伪蟻蠂蔚委慰 蔚未蠋 纬喂伪 渭蔚蟿伪蠁蠈蟻蟿蠅蟽畏
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 螇 蔚蟺喂位苇尉蟿蔚 伪蟻蠂蔚委伪 蔚喂魏蠈谓伪蟼
+       *[other] 螇 蟺蔚蟻喂畏纬畏胃蔚委蟿蔚 蟽蔚 伪蟻蠂蔚委伪 蔚喂魏蠈谓伪蟼
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 螤蔚蟻喂纬蟻伪蠁萎 (蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰)
+pdfjs-editor-add-signature-description-input =
+    .title = 螤蔚蟻喂纬蟻伪蠁萎 (蔚谓伪位位伪魏蟿喂魏蠈 魏蔚委渭蔚谓慰)
+pdfjs-editor-add-signature-description-default-when-drawing = 违蟺慰纬蟻伪蠁萎
+pdfjs-editor-add-signature-clear-button-label = 螒蟺伪位慰喂蠁萎 蠀蟺慰纬蟻伪蠁萎蟼
+pdfjs-editor-add-signature-clear-button =
+    .title = 螒蟺伪位慰喂蠁萎 蠀蟺慰纬蟻伪蠁萎蟼
+pdfjs-editor-add-signature-save-checkbox = 螒蟺慰胃萎魏蔚蠀蟽畏 蠀蟺慰纬蟻伪蠁萎蟼
+pdfjs-editor-add-signature-save-warning-message = 螆蠂蔚蟿蔚 蠁蟿维蟽蔚喂 蟿慰 蠈蟻喂慰 蟿蠅谓 5 伪蟺慰胃畏魏蔚蠀渭苇谓蠅谓 蠀蟺慰纬蟻伪蠁蠋谓. 螒蠁伪喂蟻苇蟽蟿蔚 渭委伪 纬喂伪 谓伪 伪蟺慰胃畏魏蔚蠉蟽蔚蟿蔚 蟺蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼.
+pdfjs-editor-add-signature-image-upload-error-title = 螖蔚谓 萎蟿伪谓 未蠀谓伪蟿萎 畏 渭蔚蟿伪蠁蠈蟻蟿蠅蟽畏 蟿畏蟼 蔚喂魏蠈谓伪蟼
+pdfjs-editor-add-signature-image-upload-error-description = 螘位苇纬尉蟿蔚 蟿畏 蟽蠉谓未蔚蟽畏 未喂魏蟿蠉慰蠀 蟽伪蟼 萎 未慰魏喂渭维蟽蟿蔚 渭喂伪 维位位畏 蔚喂魏蠈谓伪.
+pdfjs-editor-add-signature-image-no-data-error-title = 螖蔚谓 蔚委谓伪喂 未蠀谓伪蟿萎 畏 渭蔚蟿伪蟿蟻慰蟺萎 伪蠀蟿萎蟼 蟿畏蟼 蔚喂魏蠈谓伪蟼 蟽蔚 蠀蟺慰纬蟻伪蠁萎
+pdfjs-editor-add-signature-image-no-data-error-description = 螖慰魏喂渭维蟽蟿蔚 谓伪 渭蔚蟿伪蠁慰蟻蟿蠋蟽蔚蟿蔚 渭喂伪 维位位畏 蔚喂魏蠈谓伪.
+pdfjs-editor-add-signature-error-close-button = 螝位蔚委蟽喂渭慰
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 螒魏蠉蟻蠅蟽畏
+pdfjs-editor-add-signature-add-button = 螤蟻慰蟽胃萎魏畏
+pdfjs-editor-edit-signature-update-button = 螘谓畏渭苇蟻蠅蟽畏
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蟽蠂慰位委慰蠀
+pdfjs-editor-edit-comment-popup-button =
+    .title = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蟽蠂慰位委慰蠀
+pdfjs-editor-delete-comment-popup-button-label = 螒蠁伪委蟻蔚蟽畏 蟽蠂慰位委慰蠀
+pdfjs-editor-delete-comment-popup-button =
+    .title = 螒蠁伪委蟻蔚蟽畏 蟽蠂慰位委慰蠀
+pdfjs-show-comment-button =
+    .title = 螘渭蠁维谓喂蟽畏 蟽蠂慰位委慰蠀
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蟽蠂慰位委慰蠀
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 螘谓畏渭苇蟻蠅蟽畏
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 螤蟻慰蟽胃萎魏畏 蟽蠂慰位委慰蠀
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 螤蟻慰蟽胃萎魏畏
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 螢蔚魏喂谓萎蟽蟿蔚 谓伪 蟺位畏魏蟿蟻慰位慰纬蔚委蟿蔚鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 螒魏蠉蟻蠅蟽畏
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 螤蟻慰蟽胃萎魏畏 蟽蠂慰位委慰蠀
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = (螒蟺)蔚谓蔚蟻纬慰蟺慰委畏蟽畏 蟺位伪蠆谓萎蟼 纬蟻伪渭渭萎蟼 (蟿慰 苇纬纬蟻伪蠁慰 蟺蔚蟻喂苇蠂蔚喂 渭喂魏蟻慰纬蟻伪蠁委蔚蟼/蟺蔚蟻委纬蟻伪渭渭伪/蟽蠀谓畏渭渭苇谓伪/蔚蟺委蟺蔚未伪)
+pdfjs-toggle-views-manager-button1-label = 螖喂伪蠂蔚委蟻喂蟽畏 蟽蔚位委未蠅谓
+pdfjs-views-manager-sidebar =
+    .aria-label = 螤位伪蠆谓萎 纬蟻伪渭渭萎
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 螒位位伪纬萎 渭蔚纬苇胃慰蠀蟼 蟺位伪蠆谓萎蟼 纬蟻伪渭渭萎蟼
+pdfjs-views-manager-view-selector-button =
+    .title = 螤蟻慰尾慰位苇蟼
+pdfjs-views-manager-view-selector-button-label = 螤蟻慰尾慰位苇蟼
+pdfjs-views-manager-pages-title = 危蔚位委未蔚蟼
+pdfjs-views-manager-outlines-title1 = 螖喂维蟻胃蟻蠅蟽畏 蔚纬纬蟻维蠁慰蠀
+    .title = 螖喂维蟻胃蟻蠅蟽畏 蔚纬纬蟻维蠁慰蠀 (未喂蟺位蠈 魏位喂魏 纬喂伪 伪谓维蟺蟿蠀尉畏/蟽蠉渭蟺蟿蠀尉畏 蠈位蠅谓 蟿蠅谓 蟽蟿慰喂蠂蔚委蠅谓)
+pdfjs-views-manager-attachments-title = 危蠀谓畏渭渭苇谓伪
+pdfjs-views-manager-layers-title1 = 螘蟺委蟺蔚未伪
+    .title = 螘蟺委蟺蔚未伪 (未喂蟺位蠈 魏位喂魏 纬喂伪 蔚蟺伪谓伪蠁慰蟻维 蠈位蠅谓 蟿蠅谓 蔚蟺喂蟺苇未蠅谓 蟽蟿畏谓 蟺蟻慰蔚蟺喂位蔚纬渭苇谓畏 魏伪蟿维蟽蟿伪蟽畏)
+pdfjs-views-manager-pages-option-label = 危蔚位委未蔚蟼
+pdfjs-views-manager-outlines-option-label = 螖喂维蟻胃蟻蠅蟽畏 蔚纬纬蟻维蠁慰蠀
+pdfjs-views-manager-attachments-option-label = 危蠀谓畏渭渭苇谓伪
+pdfjs-views-manager-layers-option-label = 螘蟺委蟺蔚未伪
+pdfjs-views-manager-add-file-button =
+    .title = 螤蟻慰蟽胃萎魏畏 伪蟻蠂蔚委慰蠀
+pdfjs-views-manager-add-file-button-label = 螤蟻慰蟽胃萎魏畏 伪蟻蠂蔚委慰蠀
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } 蔚蟺喂位蔚纬渭苇谓畏
+       *[other] { $count } 蔚蟺喂位蔚纬渭苇谓蔚蟼
+    }
+pdfjs-views-manager-pages-status-none-action-label = 螘蟺喂位慰纬萎 蟽蔚位委未蠅谓
+pdfjs-views-manager-pages-status-action-button-label = 螖喂伪蠂蔚委蟻喂蟽畏
+pdfjs-views-manager-pages-status-copy-button-label = 螒谓蟿喂纬蟻伪蠁萎
+pdfjs-views-manager-pages-status-cut-button-label = 螒蟺慰魏慰蟺萎
+pdfjs-views-manager-pages-status-delete-button-label = 螖喂伪纬蟻伪蠁萎
+pdfjs-views-manager-pages-status-export-selected-button-label = 螘尉伪纬蠅纬萎 蔚蟺喂位蔚纬渭苇谓蠅谓鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 螒蟺慰魏蠈蟺畏魏蔚 1 蟽蔚位委未伪
+       *[other] 螒蟺慰魏蠈蟺畏魏伪谓 { $count } 蟽蔚位委未蔚蟼
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 螒谓蟿喂纬蟻维蠁畏魏蔚 1 蟽蔚位委未伪
+       *[other] 螒谓蟿喂纬蟻维蠁畏魏伪谓 { $count } 蟽蔚位委未蔚蟼
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 螖喂伪纬蟻维蠁畏魏蔚 1 蟽蔚位委未伪
+       *[other] 螖喂伪纬蟻维蠁畏魏伪谓 { $count } 蟽蔚位委未蔚蟼
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 螤蟻慰蔚蟿慰喂渭伪蟽委伪 伪蟻蠂蔚委慰蠀鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 螠蔚蟿伪蠁蠈蟻蟿蠅蟽畏 伪蟻蠂蔚委慰蠀鈥�
+pdfjs-views-manager-status-warning-cut-label = 螖蔚谓 萎蟿伪谓 未蠀谓伪蟿萎 畏 伪蟺慰魏慰蟺萎. 螒谓伪谓蔚蠋蟽蟿蔚 蟿畏 蟽蔚位委未伪 魏伪喂 未慰魏喂渭维蟽蟿蔚 尉伪谓维.
+pdfjs-views-manager-status-warning-copy-label = 螖蔚谓 萎蟿伪谓 未蠀谓伪蟿萎 畏 伪谓蟿喂纬蟻伪蠁萎. 螒谓伪谓蔚蠋蟽蟿蔚 蟿畏 蟽蔚位委未伪 魏伪喂 未慰魏喂渭维蟽蟿蔚 尉伪谓维.
+pdfjs-views-manager-status-warning-delete-label = 螖蔚谓 萎蟿伪谓 未蠀谓伪蟿萎 畏 未喂伪纬蟻伪蠁萎. 螒谓伪谓蔚蠋蟽蟿蔚 蟿畏 蟽蔚位委未伪 魏伪喂 未慰魏喂渭维蟽蟿蔚 尉伪谓维.
+pdfjs-views-manager-status-warning-save-label = 螖蔚谓 萎蟿伪谓 未蠀谓伪蟿萎 畏 伪蟺慰胃萎魏蔚蠀蟽畏. 螒谓伪谓蔚蠋蟽蟿蔚 蟿畏 蟽蔚位委未伪 魏伪喂 未慰魏喂渭维蟽蟿蔚 尉伪谓维.
+pdfjs-views-manager-status-undo-button-label = 螒谓伪委蟻蔚蟽畏
+pdfjs-views-manager-status-done-button-label = 韦苇位慰蟼
+pdfjs-views-manager-status-close-button =
+    .title = 螝位蔚委蟽喂渭慰
+pdfjs-views-manager-status-close-button-label = 螝位蔚委蟽喂渭慰
+pdfjs-views-manager-paste-button-label = 螘蟺喂魏蠈位位畏蟽畏
+pdfjs-views-manager-paste-button-before =
+    .title = 螘蟺喂魏蠈位位畏蟽畏 蟺蟻喂谓 伪蟺蠈 蟿畏谓 蟺蟻蠋蟿畏 蟽蔚位委未伪
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 螘蟺喂魏蠈位位畏蟽畏 渭蔚蟿维 蟿畏 蟽蔚位委未伪 { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 螡螘螣
+pdfjs-views-manager-waiting-for-file = 螠蔚蟿伪蠁蠈蟻蟿蠅蟽畏 伪蟻蠂蔚委慰蠀鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 螖喂伪蠂蔚委蟻喂蟽畏 蟽蔚位委未蠅谓
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 螒蠁伪委蟻蔚蟽畏 伪蟺慰胃畏魏蔚蠀渭苇谓畏蟼 蠀蟺慰纬蟻伪蠁萎蟼
+pdfjs-editor-delete-signature-button-label1 = 螒蠁伪委蟻蔚蟽畏 伪蟺慰胃畏魏蔚蠀渭苇谓畏蟼 蠀蟺慰纬蟻伪蠁萎蟼
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蟺蔚蟻喂纬蟻伪蠁萎蟼
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 螘蟺蔚尉蔚蟻纬伪蟽委伪 蟺蔚蟻喂纬蟻伪蠁萎蟼
diff --git a/public/pdfjs/web/locale/en-CA/viewer.ftl b/public/pdfjs/web/locale/en-CA/viewer.ftl
new file mode 100644
index 0000000..f797585
--- /dev/null
+++ b/public/pdfjs/web/locale/en-CA/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Previous Page
+pdfjs-previous-button-label = Previous
+pdfjs-next-button =
+    .title = Next Page
+pdfjs-next-button-label = Next
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Page
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = of { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom Out
+pdfjs-zoom-out-button-label = Zoom Out
+pdfjs-zoom-in-button =
+    .title = Zoom In
+pdfjs-zoom-in-button-label = Zoom In
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Switch to Presentation Mode
+pdfjs-presentation-mode-button-label = Presentation Mode
+pdfjs-open-file-button =
+    .title = Open File
+pdfjs-open-file-button-label = Open
+pdfjs-print-button =
+    .title = Print
+pdfjs-print-button-label = Print
+pdfjs-save-button =
+    .title = Save
+pdfjs-save-button-label = Save
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Download
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Download
+pdfjs-bookmark-button =
+    .title = Current Page (View URL from Current Page)
+pdfjs-bookmark-button-label = Current Page
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Tools
+pdfjs-tools-button-label = Tools
+pdfjs-first-page-button =
+    .title = Go to First Page
+pdfjs-first-page-button-label = Go to First Page
+pdfjs-last-page-button =
+    .title = Go to Last Page
+pdfjs-last-page-button-label = Go to Last Page
+pdfjs-page-rotate-cw-button =
+    .title = Rotate Clockwise
+pdfjs-page-rotate-cw-button-label = Rotate Clockwise
+pdfjs-page-rotate-ccw-button =
+    .title = Rotate Counterclockwise
+pdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise
+pdfjs-cursor-text-select-tool-button =
+    .title = Enable Text Selection Tool
+pdfjs-cursor-text-select-tool-button-label = Text Selection Tool
+pdfjs-cursor-hand-tool-button =
+    .title = Enable Hand Tool
+pdfjs-cursor-hand-tool-button-label = Hand Tool
+pdfjs-scroll-page-button =
+    .title = Use Page Scrolling
+pdfjs-scroll-page-button-label = Page Scrolling
+pdfjs-scroll-vertical-button =
+    .title = Use Vertical Scrolling
+pdfjs-scroll-vertical-button-label = Vertical Scrolling
+pdfjs-scroll-horizontal-button =
+    .title = Use Horizontal Scrolling
+pdfjs-scroll-horizontal-button-label = Horizontal Scrolling
+pdfjs-scroll-wrapped-button =
+    .title = Use Wrapped Scrolling
+pdfjs-scroll-wrapped-button-label = Wrapped Scrolling
+pdfjs-spread-none-button =
+    .title = Do not join page spreads
+pdfjs-spread-none-button-label = No Spreads
+pdfjs-spread-odd-button =
+    .title = Join page spreads starting with odd-numbered pages
+pdfjs-spread-odd-button-label = Odd Spreads
+pdfjs-spread-even-button =
+    .title = Join page spreads starting with even-numbered pages
+pdfjs-spread-even-button-label = Even Spreads
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Document Properties鈥�
+pdfjs-document-properties-button-label = Document Properties鈥�
+pdfjs-document-properties-file-name = File name:
+pdfjs-document-properties-file-size = File size:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Title:
+pdfjs-document-properties-author = Author:
+pdfjs-document-properties-subject = Subject:
+pdfjs-document-properties-keywords = Keywords:
+pdfjs-document-properties-creation-date = Creation Date:
+pdfjs-document-properties-modification-date = Modification Date:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creator:
+pdfjs-document-properties-producer = PDF Producer:
+pdfjs-document-properties-version = PDF Version:
+pdfjs-document-properties-page-count = Page Count:
+pdfjs-document-properties-page-size = Page Size:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portrait
+pdfjs-document-properties-page-size-orientation-landscape = landscape
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = Yes
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Close
+
+## Print
+
+pdfjs-print-progress-message = Preparing document for printing鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancel
+pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.
+pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Toggle Sidebar
+pdfjs-toggle-sidebar-notification-button =
+    .title = Toggle Sidebar (document contains outline/attachments/layers)
+pdfjs-toggle-sidebar-button-label = Toggle Sidebar
+pdfjs-document-outline-button =
+    .title = Show Document Outline (double-click to expand/collapse all items)
+pdfjs-document-outline-button-label = Document Outline
+pdfjs-attachments-button =
+    .title = Show Attachments
+pdfjs-attachments-button-label = Attachments
+pdfjs-layers-button =
+    .title = Show Layers (double-click to reset all layers to the default state)
+pdfjs-layers-button-label = Layers
+pdfjs-thumbs-button =
+    .title = Show Thumbnails
+pdfjs-thumbs-button-label = Thumbnails
+pdfjs-current-outline-item-button =
+    .title = Find Current Outline Item
+pdfjs-current-outline-item-button-label = Current Outline Item
+pdfjs-findbar-button =
+    .title = Find in Document
+pdfjs-findbar-button-label = Find
+pdfjs-additional-layers = Additional Layers
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Page { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Thumbnail of Page { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Select page { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Page { $page } of { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Find
+    .placeholder = Find in document鈥�
+pdfjs-find-previous-button =
+    .title = Find the previous occurrence of the phrase
+pdfjs-find-previous-button-label = Previous
+pdfjs-find-next-button =
+    .title = Find the next occurrence of the phrase
+pdfjs-find-next-button-label = Next
+pdfjs-find-highlight-checkbox = Highlight All
+pdfjs-find-match-case-checkbox-label = Match Case
+pdfjs-find-match-diacritics-checkbox-label = Match Diacritics
+pdfjs-find-entire-word-checkbox-label = Whole Words
+pdfjs-find-reached-top = Reached top of document, continued from bottom
+pdfjs-find-reached-bottom = Reached end of document, continued from top
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } of { $total } match
+       *[other] { $current } of { $total } matches
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] More than { $limit } match
+       *[other] More than { $limit } matches
+    }
+pdfjs-find-not-found = Phrase not found
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Page Width
+pdfjs-page-scale-fit = Page Fit
+pdfjs-page-scale-auto = Automatic Zoom
+pdfjs-page-scale-actual = Actual Size
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Page { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = An error occurred while loading the PDF.
+pdfjs-invalid-file-error = Invalid or corrupted PDF file.
+pdfjs-missing-file-error = Missing PDF file.
+pdfjs-unexpected-response-error = Unexpected server response.
+pdfjs-rendering-error = An error occurred while rendering the page.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Enter the password to open this PDF file.
+pdfjs-password-invalid = Invalid password. Please try again.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Cancel
+pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = Change text colour
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Draw
+pdfjs-editor-color-picker-ink-input =
+    .title = Change drawing colour
+pdfjs-editor-ink-button-label = Draw
+pdfjs-editor-stamp-button =
+    .title = Add or edit images
+pdfjs-editor-stamp-button-label = Add or edit images
+pdfjs-editor-highlight-button =
+    .title = Highlight
+pdfjs-editor-highlight-button-label = Highlight
+pdfjs-highlight-floating-button1 =
+    .title = Highlight
+    .aria-label = Highlight
+pdfjs-highlight-floating-button-label = Highlight
+pdfjs-comment-floating-button =
+    .title = Comment
+    .aria-label = Comment
+pdfjs-comment-floating-button-label = Comment
+pdfjs-editor-comment-button =
+    .title = Comment
+    .aria-label = Comment
+pdfjs-editor-comment-button-label = Comment
+pdfjs-editor-signature-button =
+    .title = Add signature
+pdfjs-editor-signature-button-label = Add signature
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Highlight editor
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Drawing editor
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Signature editor: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Image editor
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Remove drawing
+pdfjs-editor-remove-freetext-button =
+    .title = Remove text
+pdfjs-editor-remove-stamp-button =
+    .title = Remove image
+pdfjs-editor-remove-highlight-button =
+    .title = Remove highlight
+pdfjs-editor-remove-signature-button =
+    .title = Remove signature
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Colour
+pdfjs-editor-free-text-size-input = Size
+pdfjs-editor-ink-color-input = Colour
+pdfjs-editor-ink-thickness-input = Thickness
+pdfjs-editor-ink-opacity-input = Opacity
+pdfjs-editor-stamp-add-image-button =
+    .title = Add image
+pdfjs-editor-stamp-add-image-button-label = Add image
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Thickness
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Change thickness when highlighting items other than text
+pdfjs-editor-add-signature-container =
+    .aria-label = Signature controls and saved signatures
+pdfjs-editor-signature-add-signature-button =
+    .title = Add new signature
+pdfjs-editor-signature-add-signature-button-label = Add new signature
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Saved signature: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Text Editor
+    .default-content = Start typing鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Comment
+       *[other] Comments
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Close the sidebar
+    .aria-label = Close the sidebar
+pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment.
+pdfjs-editor-comments-sidebar-no-comments-link = Learn more
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alt text
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Edit alt text
+pdfjs-editor-alt-text-dialog-label = Choose an option
+pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can鈥檛 see the image or when it doesn鈥檛 load.
+pdfjs-editor-alt-text-add-description-label = Add a description
+pdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.
+pdfjs-editor-alt-text-mark-decorative-label = Mark as decorative
+pdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.
+pdfjs-editor-alt-text-cancel-button = Cancel
+pdfjs-editor-alt-text-save-button = Save
+pdfjs-editor-alt-text-decorative-tooltip = Marked as decorative
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = For example, 鈥淎 young man sits down at a table to eat a meal鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alt text
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Top left corner 鈥� resize
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Top middle 鈥� resize
+pdfjs-editor-resizer-top-right =
+    .aria-label = Top right corner 鈥� resize
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Middle right 鈥� resize
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Bottom right corner 鈥� resize
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Bottom middle 鈥� resize
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Bottom left corner 鈥� resize
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Middle left 鈥� resize
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Highlight colour
+pdfjs-editor-colorpicker-button =
+    .title = Change colour
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Colour choices
+pdfjs-editor-colorpicker-yellow =
+    .title = Yellow
+pdfjs-editor-colorpicker-green =
+    .title = Green
+pdfjs-editor-colorpicker-blue =
+    .title = Blue
+pdfjs-editor-colorpicker-pink =
+    .title = Pink
+pdfjs-editor-colorpicker-red =
+    .title = Red
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Show all
+pdfjs-editor-highlight-show-all-button =
+    .title = Show all
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Write your description here鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Short description for people who can鈥檛 see the image or when the image doesn鈥檛 load.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more
+pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically
+pdfjs-editor-new-alt-text-not-now-button = Not now
+pdfjs-editor-new-alt-text-error-title = Couldn鈥檛 create alt text automatically
+pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later.
+pdfjs-editor-new-alt-text-error-close-button = Close
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)
+    .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alt text added
+pdfjs-editor-new-alt-text-added-button-label = Alt text added
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Missing alt text
+pdfjs-editor-new-alt-text-missing-button-label = Missing alt text
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Review alt text
+pdfjs-editor-new-alt-text-to-review-button-label = Review alt text
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Image alt text settings
+pdfjs-image-alt-text-settings-button-label = Image alt text settings
+pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings
+pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text
+pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically
+pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can鈥檛 see the image or when the image doesn鈥檛 load.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text.
+pdfjs-editor-alt-text-settings-delete-model-button = Delete
+pdfjs-editor-alt-text-settings-download-model-button = Download
+pdfjs-editor-alt-text-settings-downloading-model-button = Downloading鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alt text editor
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image
+pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text.
+pdfjs-editor-alt-text-settings-close-button = Close
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Highlight added
+pdfjs-editor-freetext-added-alert = Text added
+pdfjs-editor-ink-added-alert = Drawing added
+pdfjs-editor-stamp-added-alert = Image added
+pdfjs-editor-signature-added-alert = Signature added
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Highlight removed
+pdfjs-editor-undo-bar-message-freetext = Text removed
+pdfjs-editor-undo-bar-message-ink = Drawing removed
+pdfjs-editor-undo-bar-message-stamp = Image removed
+pdfjs-editor-undo-bar-message-signature = Signature removed
+pdfjs-editor-undo-bar-message-comment = Comment removed
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } annotation removed
+       *[other] { $count } annotations removed
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Undo
+pdfjs-editor-undo-bar-undo-button-label = Undo
+pdfjs-editor-undo-bar-close-button =
+    .title = Close
+pdfjs-editor-undo-bar-close-button-label = Close
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use.
+pdfjs-editor-add-signature-dialog-title = Add a signature
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Type
+    .title = Type
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Draw
+    .title = Draw
+pdfjs-editor-add-signature-image-button = Image
+    .title = Image
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Type your signature
+    .placeholder = Type your signature
+pdfjs-editor-add-signature-draw-placeholder = Draw your signature
+pdfjs-editor-add-signature-draw-thickness-range-label = Thickness
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Drawing thickness: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Drag a file here to upload
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Or choose image files
+       *[other] Or browse image files
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Description (alt text)
+pdfjs-editor-add-signature-description-input =
+    .title = Description (alt text)
+pdfjs-editor-add-signature-description-default-when-drawing = Signature
+pdfjs-editor-add-signature-clear-button-label = Clear signature
+pdfjs-editor-add-signature-clear-button =
+    .title = Clear signature
+pdfjs-editor-add-signature-save-checkbox = Save signature
+pdfjs-editor-add-signature-save-warning-message = You鈥檝e reached the limit of 5 saved signatures. Remove one to save more.
+pdfjs-editor-add-signature-image-upload-error-title = Couldn鈥檛 upload image
+pdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image.
+pdfjs-editor-add-signature-image-no-data-error-title = Can鈥檛 convert this image into a signature
+pdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image.
+pdfjs-editor-add-signature-error-close-button = Close
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancel
+pdfjs-editor-add-signature-add-button = Add
+pdfjs-editor-edit-signature-update-button = Update
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Edit comment
+pdfjs-editor-edit-comment-popup-button =
+    .title = Edit comment
+pdfjs-editor-delete-comment-popup-button-label = Remove comment
+pdfjs-editor-delete-comment-popup-button =
+    .title = Remove comment
+pdfjs-show-comment-button =
+    .title = Show comment
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Start typing鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancel
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Add comment
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers)
+pdfjs-toggle-views-manager-button1-label = Manage pages
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidebar
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Sidebar resizer
+pdfjs-views-manager-view-selector-button =
+    .title = Views
+pdfjs-views-manager-view-selector-button-label = Views
+pdfjs-views-manager-pages-title = Pages
+pdfjs-views-manager-outlines-title1 = Document outline
+    .title = Document outline (double-click to expand/collapse all items)
+pdfjs-views-manager-attachments-title = Attachments
+pdfjs-views-manager-layers-title1 = Layers
+    .title = Layers (double-click to reset all layers to the default state)
+pdfjs-views-manager-pages-option-label = Pages
+pdfjs-views-manager-outlines-option-label = Document outline
+pdfjs-views-manager-attachments-option-label = Attachments
+pdfjs-views-manager-layers-option-label = Layers
+pdfjs-views-manager-add-file-button =
+    .title = Add file
+pdfjs-views-manager-add-file-button-label = Add file
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } selected
+       *[other] { $count } selected
+    }
+pdfjs-views-manager-pages-status-none-action-label = Select pages
+pdfjs-views-manager-pages-status-action-button-label = Manage
+pdfjs-views-manager-pages-status-copy-button-label = Copy
+pdfjs-views-manager-pages-status-cut-button-label = Cut
+pdfjs-views-manager-pages-status-delete-button-label = Delete
+pdfjs-views-manager-pages-status-export-selected-button-label = Export selected鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 page cut
+       *[other] { $count } pages cut
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 page copied
+       *[other] { $count } pages copied
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 page deleted
+       *[other] { $count } pages deleted
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file鈥�
+pdfjs-views-manager-status-warning-cut-label = Couldn鈥檛 cut. Refresh page and try again.
+pdfjs-views-manager-status-warning-copy-label = Couldn鈥檛 copy. Refresh page and try again.
+pdfjs-views-manager-status-warning-delete-label = Couldn鈥檛 delete. Refresh page and try again.
+pdfjs-views-manager-status-warning-save-label = Couldn鈥檛 save. Refresh page and try again.
+pdfjs-views-manager-status-undo-button-label = Undo
+pdfjs-views-manager-status-done-button-label = Done
+pdfjs-views-manager-status-close-button =
+    .title = Close
+pdfjs-views-manager-status-close-button-label = Close
+pdfjs-views-manager-paste-button-label = Paste
+pdfjs-views-manager-paste-button-before =
+    .title = Paste before the first page
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Paste after page { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NEW
+pdfjs-views-manager-waiting-for-file = Uploading file鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Manage pages
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Remove saved signature
+pdfjs-editor-delete-signature-button-label1 = Remove saved signature
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Edit description
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Edit description
diff --git a/public/pdfjs/web/locale/en-GB/viewer.ftl b/public/pdfjs/web/locale/en-GB/viewer.ftl
new file mode 100644
index 0000000..7a6692a
--- /dev/null
+++ b/public/pdfjs/web/locale/en-GB/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Previous Page
+pdfjs-previous-button-label = Previous
+pdfjs-next-button =
+    .title = Next Page
+pdfjs-next-button-label = Next
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Page
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = of { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom Out
+pdfjs-zoom-out-button-label = Zoom Out
+pdfjs-zoom-in-button =
+    .title = Zoom In
+pdfjs-zoom-in-button-label = Zoom In
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Switch to Presentation Mode
+pdfjs-presentation-mode-button-label = Presentation Mode
+pdfjs-open-file-button =
+    .title = Open File
+pdfjs-open-file-button-label = Open
+pdfjs-print-button =
+    .title = Print
+pdfjs-print-button-label = Print
+pdfjs-save-button =
+    .title = Save
+pdfjs-save-button-label = Save
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Download
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Download
+pdfjs-bookmark-button =
+    .title = Current Page (View URL from Current Page)
+pdfjs-bookmark-button-label = Current Page
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Tools
+pdfjs-tools-button-label = Tools
+pdfjs-first-page-button =
+    .title = Go to First Page
+pdfjs-first-page-button-label = Go to First Page
+pdfjs-last-page-button =
+    .title = Go to Last Page
+pdfjs-last-page-button-label = Go to Last Page
+pdfjs-page-rotate-cw-button =
+    .title = Rotate Clockwise
+pdfjs-page-rotate-cw-button-label = Rotate Clockwise
+pdfjs-page-rotate-ccw-button =
+    .title = Rotate Anti-Clockwise
+pdfjs-page-rotate-ccw-button-label = Rotate Anti-Clockwise
+pdfjs-cursor-text-select-tool-button =
+    .title = Enable Text Selection Tool
+pdfjs-cursor-text-select-tool-button-label = Text Selection Tool
+pdfjs-cursor-hand-tool-button =
+    .title = Enable Hand Tool
+pdfjs-cursor-hand-tool-button-label = Hand Tool
+pdfjs-scroll-page-button =
+    .title = Use Page Scrolling
+pdfjs-scroll-page-button-label = Page Scrolling
+pdfjs-scroll-vertical-button =
+    .title = Use Vertical Scrolling
+pdfjs-scroll-vertical-button-label = Vertical Scrolling
+pdfjs-scroll-horizontal-button =
+    .title = Use Horizontal Scrolling
+pdfjs-scroll-horizontal-button-label = Horizontal Scrolling
+pdfjs-scroll-wrapped-button =
+    .title = Use Wrapped Scrolling
+pdfjs-scroll-wrapped-button-label = Wrapped Scrolling
+pdfjs-spread-none-button =
+    .title = Do not join page spreads
+pdfjs-spread-none-button-label = No Spreads
+pdfjs-spread-odd-button =
+    .title = Join page spreads starting with odd-numbered pages
+pdfjs-spread-odd-button-label = Odd Spreads
+pdfjs-spread-even-button =
+    .title = Join page spreads starting with even-numbered pages
+pdfjs-spread-even-button-label = Even Spreads
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Document Properties鈥�
+pdfjs-document-properties-button-label = Document Properties鈥�
+pdfjs-document-properties-file-name = File name:
+pdfjs-document-properties-file-size = File size:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Title:
+pdfjs-document-properties-author = Author:
+pdfjs-document-properties-subject = Subject:
+pdfjs-document-properties-keywords = Keywords:
+pdfjs-document-properties-creation-date = Creation Date:
+pdfjs-document-properties-modification-date = Modification Date:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creator:
+pdfjs-document-properties-producer = PDF Producer:
+pdfjs-document-properties-version = PDF Version:
+pdfjs-document-properties-page-count = Page Count:
+pdfjs-document-properties-page-size = Page Size:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portrait
+pdfjs-document-properties-page-size-orientation-landscape = landscape
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = Yes
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Close
+
+## Print
+
+pdfjs-print-progress-message = Preparing document for printing鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancel
+pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.
+pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Toggle Sidebar
+pdfjs-toggle-sidebar-notification-button =
+    .title = Toggle Sidebar (document contains outline/attachments/layers)
+pdfjs-toggle-sidebar-button-label = Toggle Sidebar
+pdfjs-document-outline-button =
+    .title = Show Document Outline (double-click to expand/collapse all items)
+pdfjs-document-outline-button-label = Document Outline
+pdfjs-attachments-button =
+    .title = Show Attachments
+pdfjs-attachments-button-label = Attachments
+pdfjs-layers-button =
+    .title = Show Layers (double-click to reset all layers to the default state)
+pdfjs-layers-button-label = Layers
+pdfjs-thumbs-button =
+    .title = Show Thumbnails
+pdfjs-thumbs-button-label = Thumbnails
+pdfjs-current-outline-item-button =
+    .title = Find Current Outline Item
+pdfjs-current-outline-item-button-label = Current Outline Item
+pdfjs-findbar-button =
+    .title = Find in Document
+pdfjs-findbar-button-label = Find
+pdfjs-additional-layers = Additional Layers
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Page { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Thumbnail of Page { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Select page { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Page { $page } of { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Find
+    .placeholder = Find in document鈥�
+pdfjs-find-previous-button =
+    .title = Find the previous occurrence of the phrase
+pdfjs-find-previous-button-label = Previous
+pdfjs-find-next-button =
+    .title = Find the next occurrence of the phrase
+pdfjs-find-next-button-label = Next
+pdfjs-find-highlight-checkbox = Highlight All
+pdfjs-find-match-case-checkbox-label = Match Case
+pdfjs-find-match-diacritics-checkbox-label = Match Diacritics
+pdfjs-find-entire-word-checkbox-label = Whole Words
+pdfjs-find-reached-top = Reached top of document, continued from bottom
+pdfjs-find-reached-bottom = Reached end of document, continued from top
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } of { $total } match
+       *[other] { $current } of { $total } matches
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] More than { $limit } match
+       *[other] More than { $limit } matches
+    }
+pdfjs-find-not-found = Phrase not found
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Page Width
+pdfjs-page-scale-fit = Page Fit
+pdfjs-page-scale-auto = Automatic Zoom
+pdfjs-page-scale-actual = Actual Size
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Page { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = An error occurred while loading the PDF.
+pdfjs-invalid-file-error = Invalid or corrupted PDF file.
+pdfjs-missing-file-error = Missing PDF file.
+pdfjs-unexpected-response-error = Unexpected server response.
+pdfjs-rendering-error = An error occurred while rendering the page.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Enter the password to open this PDF file.
+pdfjs-password-invalid = Invalid password. Please try again.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Cancel
+pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = Change text colour
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Draw
+pdfjs-editor-color-picker-ink-input =
+    .title = Change drawing colour
+pdfjs-editor-ink-button-label = Draw
+pdfjs-editor-stamp-button =
+    .title = Add or edit images
+pdfjs-editor-stamp-button-label = Add or edit images
+pdfjs-editor-highlight-button =
+    .title = Highlight
+pdfjs-editor-highlight-button-label = Highlight
+pdfjs-highlight-floating-button1 =
+    .title = Highlight
+    .aria-label = Highlight
+pdfjs-highlight-floating-button-label = Highlight
+pdfjs-comment-floating-button =
+    .title = Comment
+    .aria-label = Comment
+pdfjs-comment-floating-button-label = Comment
+pdfjs-editor-comment-button =
+    .title = Comment
+    .aria-label = Comment
+pdfjs-editor-comment-button-label = Comment
+pdfjs-editor-signature-button =
+    .title = Add signature
+pdfjs-editor-signature-button-label = Add signature
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Highlight editor
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Drawing editor
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Signature editor: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Image editor
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Remove drawing
+pdfjs-editor-remove-freetext-button =
+    .title = Remove text
+pdfjs-editor-remove-stamp-button =
+    .title = Remove image
+pdfjs-editor-remove-highlight-button =
+    .title = Remove highlight
+pdfjs-editor-remove-signature-button =
+    .title = Remove signature
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Colour
+pdfjs-editor-free-text-size-input = Size
+pdfjs-editor-ink-color-input = Colour
+pdfjs-editor-ink-thickness-input = Thickness
+pdfjs-editor-ink-opacity-input = Opacity
+pdfjs-editor-stamp-add-image-button =
+    .title = Add image
+pdfjs-editor-stamp-add-image-button-label = Add image
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Thickness
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Change thickness when highlighting items other than text
+pdfjs-editor-add-signature-container =
+    .aria-label = Signature controls and saved signatures
+pdfjs-editor-signature-add-signature-button =
+    .title = Add new signature
+pdfjs-editor-signature-add-signature-button-label = Add new signature
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Saved signature: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Text Editor
+    .default-content = Start typing鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Comment
+       *[other] Comments
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Close the sidebar
+    .aria-label = Close the sidebar
+pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment.
+pdfjs-editor-comments-sidebar-no-comments-link = Learn more
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alt text
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Edit alt text
+pdfjs-editor-alt-text-dialog-label = Choose an option
+pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can鈥檛 see the image or when it doesn鈥檛 load.
+pdfjs-editor-alt-text-add-description-label = Add a description
+pdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.
+pdfjs-editor-alt-text-mark-decorative-label = Mark as decorative
+pdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.
+pdfjs-editor-alt-text-cancel-button = Cancel
+pdfjs-editor-alt-text-save-button = Save
+pdfjs-editor-alt-text-decorative-tooltip = Marked as decorative
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = For example, 鈥淎 young man sits down at a table to eat a meal鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alt text
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Top left corner 鈥� resize
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Top middle 鈥� resize
+pdfjs-editor-resizer-top-right =
+    .aria-label = Top right corner 鈥� resize
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Middle right 鈥� resize
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Bottom right corner 鈥� resize
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Bottom middle 鈥� resize
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Bottom left corner 鈥� resize
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Middle left 鈥� resize
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Highlight colour
+pdfjs-editor-colorpicker-button =
+    .title = Change colour
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Colour choices
+pdfjs-editor-colorpicker-yellow =
+    .title = Yellow
+pdfjs-editor-colorpicker-green =
+    .title = Green
+pdfjs-editor-colorpicker-blue =
+    .title = Blue
+pdfjs-editor-colorpicker-pink =
+    .title = Pink
+pdfjs-editor-colorpicker-red =
+    .title = Red
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Show all
+pdfjs-editor-highlight-show-all-button =
+    .title = Show all
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Write your description here鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Short description for people who can鈥檛 see the image or when the image doesn鈥檛 load.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more
+pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically
+pdfjs-editor-new-alt-text-not-now-button = Not now
+pdfjs-editor-new-alt-text-error-title = Couldn鈥檛 create alt text automatically
+pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later.
+pdfjs-editor-new-alt-text-error-close-button = Close
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)
+    .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alt text added
+pdfjs-editor-new-alt-text-added-button-label = Alt text added
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Missing alt text
+pdfjs-editor-new-alt-text-missing-button-label = Missing alt text
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Review alt text
+pdfjs-editor-new-alt-text-to-review-button-label = Review alt text
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Image alt text settings
+pdfjs-image-alt-text-settings-button-label = Image alt text settings
+pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings
+pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text
+pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically
+pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can鈥檛 see the image or when the image doesn鈥檛 load.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text.
+pdfjs-editor-alt-text-settings-delete-model-button = Delete
+pdfjs-editor-alt-text-settings-download-model-button = Download
+pdfjs-editor-alt-text-settings-downloading-model-button = Downloading鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alt text editor
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image
+pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text.
+pdfjs-editor-alt-text-settings-close-button = Close
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Highlight added
+pdfjs-editor-freetext-added-alert = Text added
+pdfjs-editor-ink-added-alert = Drawing added
+pdfjs-editor-stamp-added-alert = Image added
+pdfjs-editor-signature-added-alert = Signature added
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Highlight removed
+pdfjs-editor-undo-bar-message-freetext = Text removed
+pdfjs-editor-undo-bar-message-ink = Drawing removed
+pdfjs-editor-undo-bar-message-stamp = Image removed
+pdfjs-editor-undo-bar-message-signature = Signature removed
+pdfjs-editor-undo-bar-message-comment = Comment removed
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } annotation removed
+       *[other] { $count } annotations removed
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Undo
+pdfjs-editor-undo-bar-undo-button-label = Undo
+pdfjs-editor-undo-bar-close-button =
+    .title = Close
+pdfjs-editor-undo-bar-close-button-label = Close
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use.
+pdfjs-editor-add-signature-dialog-title = Add a signature
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Type
+    .title = Type
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Draw
+    .title = Draw
+pdfjs-editor-add-signature-image-button = Image
+    .title = Image
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Type your signature
+    .placeholder = Type your signature
+pdfjs-editor-add-signature-draw-placeholder = Draw your signature
+pdfjs-editor-add-signature-draw-thickness-range-label = Thickness
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Drawing thickness: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Drag a file here to upload
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Or choose image files
+       *[other] Or browse image files
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Description (alt text)
+pdfjs-editor-add-signature-description-input =
+    .title = Description (alt text)
+pdfjs-editor-add-signature-description-default-when-drawing = Signature
+pdfjs-editor-add-signature-clear-button-label = Clear signature
+pdfjs-editor-add-signature-clear-button =
+    .title = Clear signature
+pdfjs-editor-add-signature-save-checkbox = Save signature
+pdfjs-editor-add-signature-save-warning-message = You鈥檝e reached the limit of 5 saved signatures. Remove one to save more.
+pdfjs-editor-add-signature-image-upload-error-title = Couldn鈥檛 upload image
+pdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image.
+pdfjs-editor-add-signature-image-no-data-error-title = Can鈥檛 convert this image into a signature
+pdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image.
+pdfjs-editor-add-signature-error-close-button = Close
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancel
+pdfjs-editor-add-signature-add-button = Add
+pdfjs-editor-edit-signature-update-button = Update
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Edit comment
+pdfjs-editor-edit-comment-popup-button =
+    .title = Edit comment
+pdfjs-editor-delete-comment-popup-button-label = Remove comment
+pdfjs-editor-delete-comment-popup-button =
+    .title = Remove comment
+pdfjs-show-comment-button =
+    .title = Show comment
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Start typing鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancel
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Add comment
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers)
+pdfjs-toggle-views-manager-button1-label = Manage pages
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidebar
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Sidebar resizer
+pdfjs-views-manager-view-selector-button =
+    .title = Views
+pdfjs-views-manager-view-selector-button-label = Views
+pdfjs-views-manager-pages-title = Pages
+pdfjs-views-manager-outlines-title1 = Document outline
+    .title = Document outline (double-click to expand/collapse all items)
+pdfjs-views-manager-attachments-title = Attachments
+pdfjs-views-manager-layers-title1 = Layers
+    .title = Layers (double-click to reset all layers to the default state)
+pdfjs-views-manager-pages-option-label = Pages
+pdfjs-views-manager-outlines-option-label = Document outline
+pdfjs-views-manager-attachments-option-label = Attachments
+pdfjs-views-manager-layers-option-label = Layers
+pdfjs-views-manager-add-file-button =
+    .title = Add file
+pdfjs-views-manager-add-file-button-label = Add file
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } selected
+       *[other] { $count } selected
+    }
+pdfjs-views-manager-pages-status-none-action-label = Select pages
+pdfjs-views-manager-pages-status-action-button-label = Manage
+pdfjs-views-manager-pages-status-copy-button-label = Copy
+pdfjs-views-manager-pages-status-cut-button-label = Cut
+pdfjs-views-manager-pages-status-delete-button-label = Delete
+pdfjs-views-manager-pages-status-export-selected-button-label = Export selected鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 page cut
+       *[other] { $count } pages cut
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 page copied
+       *[other] { $count } pages copied
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 page deleted
+       *[other] { $count } pages deleted
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file鈥�
+pdfjs-views-manager-status-warning-cut-label = Couldn鈥檛 cut. Refresh page and try again.
+pdfjs-views-manager-status-warning-copy-label = Couldn鈥檛 copy. Refresh page and try again.
+pdfjs-views-manager-status-warning-delete-label = Couldn鈥檛 delete. Refresh page and try again.
+pdfjs-views-manager-status-warning-save-label = Couldn鈥檛 save. Refresh page and try again.
+pdfjs-views-manager-status-undo-button-label = Undo
+pdfjs-views-manager-status-done-button-label = Done
+pdfjs-views-manager-status-close-button =
+    .title = Close
+pdfjs-views-manager-status-close-button-label = Close
+pdfjs-views-manager-paste-button-label = Paste
+pdfjs-views-manager-paste-button-before =
+    .title = Paste before the first page
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Paste after page { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NEW
+pdfjs-views-manager-waiting-for-file = Uploading file鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Manage pages
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Remove saved signature
+pdfjs-editor-delete-signature-button-label1 = Remove saved signature
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Edit description
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Edit description
diff --git a/public/pdfjs/web/locale/en-US/viewer.ftl b/public/pdfjs/web/locale/en-US/viewer.ftl
new file mode 100644
index 0000000..3186b9a
--- /dev/null
+++ b/public/pdfjs/web/locale/en-US/viewer.ftl
@@ -0,0 +1,787 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Previous Page
+pdfjs-previous-button-label = Previous
+pdfjs-next-button =
+    .title = Next Page
+pdfjs-next-button-label = Next
+
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Page
+
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = of { $pagesCount }
+
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })
+
+pdfjs-zoom-out-button =
+    .title = Zoom Out
+pdfjs-zoom-out-button-label = Zoom Out
+pdfjs-zoom-in-button =
+    .title = Zoom In
+pdfjs-zoom-in-button-label = Zoom In
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Switch to Presentation Mode
+pdfjs-presentation-mode-button-label = Presentation Mode
+pdfjs-open-file-button =
+    .title = Open File
+pdfjs-open-file-button-label = Open
+pdfjs-print-button =
+    .title = Print
+pdfjs-print-button-label = Print
+pdfjs-save-button =
+    .title = Save
+pdfjs-save-button-label = Save
+
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Download
+
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Download
+
+pdfjs-bookmark-button =
+    .title = Current Page (View URL from Current Page)
+pdfjs-bookmark-button-label = Current Page
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Tools
+
+pdfjs-tools-button-label = Tools
+pdfjs-first-page-button =
+    .title = Go to First Page
+pdfjs-first-page-button-label = Go to First Page
+pdfjs-last-page-button =
+    .title = Go to Last Page
+pdfjs-last-page-button-label = Go to Last Page
+pdfjs-page-rotate-cw-button =
+    .title = Rotate Clockwise
+pdfjs-page-rotate-cw-button-label = Rotate Clockwise
+pdfjs-page-rotate-ccw-button =
+    .title = Rotate Counterclockwise
+pdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise
+pdfjs-cursor-text-select-tool-button =
+    .title = Enable Text Selection Tool
+pdfjs-cursor-text-select-tool-button-label = Text Selection Tool
+pdfjs-cursor-hand-tool-button =
+    .title = Enable Hand Tool
+pdfjs-cursor-hand-tool-button-label = Hand Tool
+pdfjs-scroll-page-button =
+    .title = Use Page Scrolling
+pdfjs-scroll-page-button-label = Page Scrolling
+pdfjs-scroll-vertical-button =
+    .title = Use Vertical Scrolling
+pdfjs-scroll-vertical-button-label = Vertical Scrolling
+pdfjs-scroll-horizontal-button =
+    .title = Use Horizontal Scrolling
+pdfjs-scroll-horizontal-button-label = Horizontal Scrolling
+pdfjs-scroll-wrapped-button =
+    .title = Use Wrapped Scrolling
+pdfjs-scroll-wrapped-button-label = Wrapped Scrolling
+pdfjs-spread-none-button =
+    .title = Do not join page spreads
+pdfjs-spread-none-button-label = No Spreads
+pdfjs-spread-odd-button =
+    .title = Join page spreads starting with odd-numbered pages
+pdfjs-spread-odd-button-label = Odd Spreads
+pdfjs-spread-even-button =
+    .title = Join page spreads starting with even-numbered pages
+pdfjs-spread-even-button-label = Even Spreads
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Document Properties鈥�
+pdfjs-document-properties-button-label = Document Properties鈥�
+pdfjs-document-properties-file-name = File name:
+pdfjs-document-properties-file-size = File size:
+
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+
+pdfjs-document-properties-title = Title:
+pdfjs-document-properties-author = Author:
+pdfjs-document-properties-subject = Subject:
+pdfjs-document-properties-keywords = Keywords:
+pdfjs-document-properties-creation-date = Creation Date:
+pdfjs-document-properties-modification-date = Modification Date:
+
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+pdfjs-document-properties-creator = Creator:
+pdfjs-document-properties-producer = PDF Producer:
+pdfjs-document-properties-version = PDF Version:
+pdfjs-document-properties-page-count = Page Count:
+pdfjs-document-properties-page-size = Page Size:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portrait
+pdfjs-document-properties-page-size-orientation-landscape = landscape
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = Yes
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Close
+
+## Print
+
+pdfjs-print-progress-message = Preparing document for printing鈥�
+
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+
+pdfjs-print-progress-close-button = Cancel
+pdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.
+pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-current-outline-item-button =
+    .title = Find Current Outline Item
+pdfjs-current-outline-item-button-label = Current Outline Item
+pdfjs-findbar-button =
+    .title = Find in Document
+pdfjs-findbar-button-label = Find
+pdfjs-additional-layers = Additional Layers
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Page { $page } of { $total }
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Thumbnail of Page { $page }
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Select page { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Find
+    .placeholder = Find in document鈥�
+pdfjs-find-previous-button =
+    .title = Find the previous occurrence of the phrase
+pdfjs-find-previous-button-label = Previous
+pdfjs-find-next-button =
+    .title = Find the next occurrence of the phrase
+pdfjs-find-next-button-label = Next
+pdfjs-find-highlight-checkbox = Highlight All
+pdfjs-find-match-case-checkbox-label = Match Case
+pdfjs-find-match-diacritics-checkbox-label = Match Diacritics
+pdfjs-find-entire-word-checkbox-label = Whole Words
+pdfjs-find-reached-top = Reached top of document, continued from bottom
+pdfjs-find-reached-bottom = Reached end of document, continued from top
+
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } of { $total } match
+       *[other] { $current } of { $total } matches
+    }
+
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] More than { $limit } match
+       *[other] More than { $limit } matches
+    }
+
+pdfjs-find-not-found = Phrase not found
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Page Width
+pdfjs-page-scale-fit = Page Fit
+pdfjs-page-scale-auto = Automatic Zoom
+pdfjs-page-scale-actual = Actual Size
+
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Page { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = An error occurred while loading the PDF.
+pdfjs-invalid-file-error = Invalid or corrupted PDF file.
+pdfjs-missing-file-error = Missing PDF file.
+pdfjs-unexpected-response-error = Unexpected server response.
+pdfjs-rendering-error = An error occurred while rendering the page.
+
+## Annotations
+
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = Enter the password to open this PDF file.
+pdfjs-password-invalid = Invalid password. Please try again.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Cancel
+pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = Change text color
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Draw
+pdfjs-editor-color-picker-ink-input =
+    .title = Change drawing color
+pdfjs-editor-ink-button-label = Draw
+pdfjs-editor-stamp-button =
+    .title = Add or edit images
+pdfjs-editor-stamp-button-label = Add or edit images
+pdfjs-editor-highlight-button =
+    .title = Highlight
+pdfjs-editor-highlight-button-label = Highlight
+pdfjs-highlight-floating-button1 =
+    .title = Highlight
+    .aria-label = Highlight
+pdfjs-highlight-floating-button-label = Highlight
+pdfjs-comment-floating-button =
+    .title = Comment
+    .aria-label = Comment
+pdfjs-comment-floating-button-label = Comment
+pdfjs-editor-comment-button =
+    .title = Comment
+    .aria-label = Comment
+pdfjs-editor-comment-button-label = Comment
+pdfjs-editor-signature-button =
+    .title = Add signature
+pdfjs-editor-signature-button-label = Add signature
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Highlight editor
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Drawing editor
+
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Signature editor: { $description }
+
+pdfjs-editor-stamp-editor =
+    .aria-label = Image editor
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Remove drawing
+pdfjs-editor-remove-freetext-button =
+    .title = Remove text
+pdfjs-editor-remove-stamp-button =
+    .title = Remove image
+pdfjs-editor-remove-highlight-button =
+    .title = Remove highlight
+pdfjs-editor-remove-signature-button =
+    .title = Remove signature
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Color
+pdfjs-editor-free-text-size-input = Size
+pdfjs-editor-ink-color-input = Color
+pdfjs-editor-ink-thickness-input = Thickness
+pdfjs-editor-ink-opacity-input = Opacity
+pdfjs-editor-stamp-add-image-button =
+    .title = Add image
+pdfjs-editor-stamp-add-image-button-label = Add image
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Thickness
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Change thickness when highlighting items other than text
+pdfjs-editor-add-signature-container =
+    .aria-label = Signature controls and saved signatures
+pdfjs-editor-signature-add-signature-button =
+    .title = Add new signature
+pdfjs-editor-signature-add-signature-button-label = Add new signature
+
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Saved signature: { $description }
+
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Text Editor
+    .default-content = Start typing鈥�
+
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Comment
+       *[other] Comments
+    }
+
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Close the sidebar
+    .aria-label = Close the sidebar
+pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar
+
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment.
+pdfjs-editor-comments-sidebar-no-comments-link = Learn more
+
+## Alt-text dialog
+
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alt text
+pdfjs-editor-alt-text-button-label = Alt text
+
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Edit alt text
+pdfjs-editor-alt-text-dialog-label = Choose an option
+pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can鈥檛 see the image or when it doesn鈥檛 load.
+pdfjs-editor-alt-text-add-description-label = Add a description
+pdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.
+pdfjs-editor-alt-text-mark-decorative-label = Mark as decorative
+pdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.
+pdfjs-editor-alt-text-cancel-button = Cancel
+pdfjs-editor-alt-text-save-button = Save
+pdfjs-editor-alt-text-decorative-tooltip = Marked as decorative
+
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = For example, 鈥淎 young man sits down at a table to eat a meal鈥�
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Top left corner 鈥� resize
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Top middle 鈥� resize
+pdfjs-editor-resizer-top-right =
+    .aria-label = Top right corner 鈥� resize
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Middle right 鈥� resize
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Bottom right corner 鈥� resize
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Bottom middle 鈥� resize
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Bottom left corner 鈥� resize
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Middle left 鈥� resize
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Highlight color
+
+pdfjs-editor-colorpicker-button =
+    .title = Change color
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Color choices
+pdfjs-editor-colorpicker-yellow =
+    .title = Yellow
+pdfjs-editor-colorpicker-green =
+    .title = Green
+pdfjs-editor-colorpicker-blue =
+    .title = Blue
+pdfjs-editor-colorpicker-pink =
+    .title = Pink
+pdfjs-editor-colorpicker-red =
+    .title = Red
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Show all
+pdfjs-editor-highlight-show-all-button =
+    .title = Show all
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description)
+
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description)
+
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Write your description here鈥�
+
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Short description for people who can鈥檛 see the image or when the image doesn鈥檛 load.
+
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more
+
+pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically
+pdfjs-editor-new-alt-text-not-now-button = Not now
+pdfjs-editor-new-alt-text-error-title = Couldn鈥檛 create alt text automatically
+pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later.
+pdfjs-editor-new-alt-text-error-close-button = Close
+
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)
+    .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)
+
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alt text added
+pdfjs-editor-new-alt-text-added-button-label = Alt text added
+
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Missing alt text
+pdfjs-editor-new-alt-text-missing-button-label = Missing alt text
+
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Review alt text
+pdfjs-editor-new-alt-text-to-review-button-label = Review alt text
+
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Image alt text settings
+pdfjs-image-alt-text-settings-button-label = Image alt text settings
+
+pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings
+pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text
+pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically
+pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can鈥檛 see the image or when the image doesn鈥檛 load.
+
+pdfjs-editor-alt-text-settings-editor-title = Alt text editor
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image
+pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text.
+pdfjs-editor-alt-text-settings-close-button = Close
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Highlight added
+pdfjs-editor-freetext-added-alert = Text added
+pdfjs-editor-ink-added-alert = Drawing added
+pdfjs-editor-stamp-added-alert = Image added
+pdfjs-editor-signature-added-alert = Signature added
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Highlight removed
+pdfjs-editor-undo-bar-message-freetext = Text removed
+pdfjs-editor-undo-bar-message-ink = Drawing removed
+pdfjs-editor-undo-bar-message-stamp = Image removed
+pdfjs-editor-undo-bar-message-signature = Signature removed
+pdfjs-editor-undo-bar-message-comment = Comment removed
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } annotation removed
+       *[other] { $count } annotations removed
+    }
+
+pdfjs-editor-undo-bar-undo-button =
+    .title = Undo
+pdfjs-editor-undo-bar-undo-button-label = Undo
+pdfjs-editor-undo-bar-close-button =
+    .title = Close
+pdfjs-editor-undo-bar-close-button-label = Close
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use.
+pdfjs-editor-add-signature-dialog-title = Add a signature
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Type
+    .title = Type
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Draw
+    .title = Draw
+pdfjs-editor-add-signature-image-button = Image
+    .title = Image
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Type your signature
+    .placeholder = Type your signature
+pdfjs-editor-add-signature-draw-placeholder = Draw your signature
+pdfjs-editor-add-signature-draw-thickness-range-label = Thickness
+
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Drawing thickness: { $thickness }
+
+pdfjs-editor-add-signature-image-placeholder = Drag a file here to upload
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Or choose image files
+       *[other] Or browse image files
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Description (alt text)
+pdfjs-editor-add-signature-description-input =
+    .title = Description (alt text)
+pdfjs-editor-add-signature-description-default-when-drawing = Signature
+
+
+pdfjs-editor-add-signature-clear-button-label = Clear signature
+pdfjs-editor-add-signature-clear-button =
+    .title = Clear signature
+pdfjs-editor-add-signature-save-checkbox = Save signature
+pdfjs-editor-add-signature-save-warning-message = You鈥檝e reached the limit of 5 saved signatures. Remove one to save more.
+pdfjs-editor-add-signature-image-upload-error-title = Couldn鈥檛 upload image
+pdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image.
+pdfjs-editor-add-signature-image-no-data-error-title = Can鈥檛 convert this image into a signature
+pdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image.
+pdfjs-editor-add-signature-error-close-button = Close
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancel
+pdfjs-editor-add-signature-add-button = Add
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Remove saved signature
+pdfjs-editor-delete-signature-button-label1 = Remove saved signature
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Edit description
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Edit description
+
+## Dialog buttons
+
+pdfjs-editor-edit-signature-update-button = Update
+
+## Comment popup
+
+pdfjs-show-comment-button =
+    .title = Show comment
+
+pdfjs-editor-edit-comment-popup-button-label = Edit comment
+pdfjs-editor-edit-comment-popup-button =
+    .title = Edit comment
+pdfjs-editor-delete-comment-popup-button-label = Remove comment
+pdfjs-editor-delete-comment-popup-button =
+    .title = Remove comment
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update
+
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add
+
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Start typing鈥�
+
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancel
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Add comment
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-button1 =
+    .title = Manage pages
+pdfjs-toggle-views-manager-notification-button =
+    .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers)
+pdfjs-toggle-views-manager-button1-label = Manage pages
+
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidebar
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Sidebar resizer
+pdfjs-views-manager-view-selector-button =
+    .title = Views
+pdfjs-views-manager-view-selector-button-label = Views
+pdfjs-views-manager-pages-title = Pages
+pdfjs-views-manager-outlines-title1 = Document outline
+    .title = Document outline (double-click to expand/collapse all items)
+pdfjs-views-manager-attachments-title = Attachments
+pdfjs-views-manager-layers-title1 = Layers
+    .title = Layers (double-click to reset all layers to the default state)
+
+pdfjs-views-manager-pages-option-label = Pages
+pdfjs-views-manager-outlines-option-label = Document outline
+pdfjs-views-manager-attachments-option-label = Attachments
+pdfjs-views-manager-layers-option-label = Layers
+
+pdfjs-views-manager-add-file-button =
+    .title = Add file
+pdfjs-views-manager-add-file-button-label = Add file
+
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } selected
+        *[other] { $count } selected
+    }
+pdfjs-views-manager-pages-status-none-action-label = Select pages
+pdfjs-views-manager-pages-status-action-button-label = Manage
+pdfjs-views-manager-pages-status-copy-button-label = Copy
+pdfjs-views-manager-pages-status-cut-button-label = Cut
+pdfjs-views-manager-pages-status-delete-button-label = Delete
+pdfjs-views-manager-pages-status-export-selected-button-label = Export selected鈥�
+
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 page cut
+        *[other] { $count } pages cut
+    }
+
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 page copied
+        *[other] { $count } pages copied
+    }
+
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 page deleted
+        *[other] { $count } pages deleted
+    }
+
+pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file鈥�
+
+pdfjs-views-manager-status-warning-cut-label = Couldn鈥檛 cut. Refresh page and try again.
+pdfjs-views-manager-status-warning-copy-label = Couldn鈥檛 copy. Refresh page and try again.
+pdfjs-views-manager-status-warning-delete-label = Couldn鈥檛 delete. Refresh page and try again.
+pdfjs-views-manager-status-warning-save-label = Couldn鈥檛 save. Refresh page and try again.
+pdfjs-views-manager-status-undo-button-label = Undo
+pdfjs-views-manager-status-done-button-label = Done
+pdfjs-views-manager-status-close-button =
+    .title = Close
+pdfjs-views-manager-status-close-button-label = Close
+
+pdfjs-views-manager-paste-button-label = Paste
+pdfjs-views-manager-paste-button-before =
+    .title = Paste before the first page
+
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Paste after page { $page }
+
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NEW
+
+pdfjs-views-manager-waiting-for-file = Uploading file鈥�
diff --git a/public/pdfjs/web/locale/eo/viewer.ftl b/public/pdfjs/web/locale/eo/viewer.ftl
new file mode 100644
index 0000000..ced79c8
--- /dev/null
+++ b/public/pdfjs/web/locale/eo/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Anta怒a pa臐o
+pdfjs-previous-button-label = Malanta怒en
+pdfjs-next-button =
+    .title = Venonta pa臐o
+pdfjs-next-button-label = Anta怒en
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pa臐o
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = el { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } el { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Malpligrandigi
+pdfjs-zoom-out-button-label = Malpligrandigi
+pdfjs-zoom-in-button =
+    .title = Pligrandigi
+pdfjs-zoom-in-button-label = Pligrandigi
+pdfjs-zoom-select =
+    .title = Pligrandigilo
+pdfjs-presentation-mode-button =
+    .title = Iri al prezenta re臐imo
+pdfjs-presentation-mode-button-label = Prezenta re臐imo
+pdfjs-open-file-button =
+    .title = Malfermi dosieron
+pdfjs-open-file-button-label = Malfermi
+pdfjs-print-button =
+    .title = Presi
+pdfjs-print-button-label = Presi
+pdfjs-save-button =
+    .title = Konservi
+pdfjs-save-button-label = Konservi
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = El艥uti
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = El艥uti
+pdfjs-bookmark-button =
+    .title = Nuna pa臐o (Montri adreson de la nuna pa臐o)
+pdfjs-bookmark-button-label = Nuna pa臐o
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Iloj
+pdfjs-tools-button-label = Iloj
+pdfjs-first-page-button =
+    .title = Iri al la unua pa臐o
+pdfjs-first-page-button-label = Iri al la unua pa臐o
+pdfjs-last-page-button =
+    .title = Iri al la lasta pa臐o
+pdfjs-last-page-button-label = Iri al la lasta pa臐o
+pdfjs-page-rotate-cw-button =
+    .title = Rotaciigi dekstrume
+pdfjs-page-rotate-cw-button-label = Rotaciigi dekstrume
+pdfjs-page-rotate-ccw-button =
+    .title = Rotaciigi maldekstrume
+pdfjs-page-rotate-ccw-button-label = Rotaciigi maldekstrume
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktivigi tekstan elektilon
+pdfjs-cursor-text-select-tool-button-label = Teksta elektilo
+pdfjs-cursor-hand-tool-button =
+    .title = Aktivigi ilon de mano
+pdfjs-cursor-hand-tool-button-label = Ilo de mano
+pdfjs-scroll-page-button =
+    .title = Uzi rulumon de pa臐o
+pdfjs-scroll-page-button-label = Rulumo de pa臐o
+pdfjs-scroll-vertical-button =
+    .title = Uzi vertikalan rulumon
+pdfjs-scroll-vertical-button-label = Vertikala rulumo
+pdfjs-scroll-horizontal-button =
+    .title = Uzi horizontalan rulumon
+pdfjs-scroll-horizontal-button-label = Horizontala rulumo
+pdfjs-scroll-wrapped-button =
+    .title = Uzi amba怒direktan rulumon
+pdfjs-scroll-wrapped-button-label = Amba怒direkta rulumo
+pdfjs-spread-none-button =
+    .title = Ne montri pa臐ojn po du
+pdfjs-spread-none-button-label = Unupa臐a vido
+pdfjs-spread-odd-button =
+    .title = Kunigi pa臐ojn komencante per nepara pa臐o
+pdfjs-spread-odd-button-label = Po du pa臐oj, neparaj maldekstre
+pdfjs-spread-even-button =
+    .title = Kunigi pa臐ojn komencante per para pa臐o
+pdfjs-spread-even-button-label = Po du pa臐oj, paraj maldekstre
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Atributoj de dokumento鈥�
+pdfjs-document-properties-button-label = Atributoj de dokumento鈥�
+pdfjs-document-properties-file-name = Nomo de dosiero:
+pdfjs-document-properties-file-size = Grando de dosiero:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KO ({ $b } oktetoj)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mo ({ $b } oktetoj)
+pdfjs-document-properties-title = Titolo:
+pdfjs-document-properties-author = A怒toro:
+pdfjs-document-properties-subject = Temo:
+pdfjs-document-properties-keywords = 艤losilvorto:
+pdfjs-document-properties-creation-date = Dato de kreado:
+pdfjs-document-properties-modification-date = Dato de modifo:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Kreinto:
+pdfjs-document-properties-producer = Produktinto de PDF:
+pdfjs-document-properties-version = Versio de PDF:
+pdfjs-document-properties-page-count = Nombro de pa臐oj:
+pdfjs-document-properties-page-size = Grando de pa臐o:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertikala
+pdfjs-document-properties-page-size-orientation-landscape = horizontala
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letera
+pdfjs-document-properties-page-size-name-legal = Jura
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Rapida teksta牡a vido:
+pdfjs-document-properties-linearized-yes = Jes
+pdfjs-document-properties-linearized-no = Ne
+pdfjs-document-properties-close-button = Fermi
+
+## Print
+
+pdfjs-print-progress-message = Preparo de dokumento por presi 臐in 鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Nuligi
+pdfjs-printing-not-supported = Averto: tiu 膲i retumilo ne plene subtenas presadon.
+pdfjs-printing-not-ready = Averto: la PDF dosiero ne estas plene 艥argita por presado.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Montri/ka艥i flankan strion
+pdfjs-toggle-sidebar-notification-button =
+    .title = Montri/ka艥i flankan strion (la dokumento enhavas konturon/kunsenda牡ojn/tavolojn)
+pdfjs-toggle-sidebar-button-label = Montri/ka艥i flankan strion
+pdfjs-document-outline-button =
+    .title = Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi 膲iujn elementojn)
+pdfjs-document-outline-button-label = Konturo de dokumento
+pdfjs-attachments-button =
+    .title = Montri kunsenda牡ojn
+pdfjs-attachments-button-label = Kunsenda牡ojn
+pdfjs-layers-button =
+    .title = Montri tavolojn (duoble alklaku por remeti 膲iujn tavolojn en la norman staton)
+pdfjs-layers-button-label = Tavoloj
+pdfjs-thumbs-button =
+    .title = Montri miniaturojn
+pdfjs-thumbs-button-label = Miniaturoj
+pdfjs-current-outline-item-button =
+    .title = Trovi nunan konturan elementon
+pdfjs-current-outline-item-button-label = Nuna kontura elemento
+pdfjs-findbar-button =
+    .title = Ser膲i en dokumento
+pdfjs-findbar-button-label = Ser膲i
+pdfjs-additional-layers = Aldonaj tavoloj
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pa臐o { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniaturo de pa臐o { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Elekti pa臐on { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Pa臐o { $page } el { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Ser膲i
+    .placeholder = Ser膲i en dokumento鈥�
+pdfjs-find-previous-button =
+    .title = Ser膲i la anta怒an aperon de la frazo
+pdfjs-find-previous-button-label = Malanta怒en
+pdfjs-find-next-button =
+    .title = Ser膲i la venontan aperon de la frazo
+pdfjs-find-next-button-label = Anta怒en
+pdfjs-find-highlight-checkbox = Elstarigi 膲iujn
+pdfjs-find-match-case-checkbox-label = Distingi usklecon
+pdfjs-find-match-diacritics-checkbox-label = Respekti supersignojn
+pdfjs-find-entire-word-checkbox-label = Tutaj vortoj
+pdfjs-find-reached-top = Komenco de la dokumento atingita, da怒rigado ekde la fino
+pdfjs-find-reached-bottom = Fino de la dokumento atingita, da怒rigado ekde la komenco
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } el { $total } kongruo
+       *[other] { $current } el { $total } kongruoj
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Pli ol { $limit } kongruo
+       *[other] Pli ol { $limit } kongruoj
+    }
+pdfjs-find-not-found = Frazo ne trovita
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Lar臐o de pa臐o
+pdfjs-page-scale-fit = Adapti pa臐on
+pdfjs-page-scale-auto = A怒tomata skalo
+pdfjs-page-scale-actual = Reala grando
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pa臐o { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Okazis eraro dum la 艥argado de la PDF dosiero.
+pdfjs-invalid-file-error = Nevalida a怒 difektita PDF dosiero.
+pdfjs-missing-file-error = Mankas dosiero PDF.
+pdfjs-unexpected-response-error = Neatendita respondo de servilo.
+pdfjs-rendering-error = Okazis eraro dum la montro de la pa臐o.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Prinoto: { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Tajpu pasvorton por malfermi tiun 膲i dosieron PDF.
+pdfjs-password-invalid = Nevalida pasvorto. Bonvolu provi denove.
+pdfjs-password-ok-button = Akcepti
+pdfjs-password-cancel-button = Nuligi
+pdfjs-web-fonts-disabled = Neaktivaj teksa牡aj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Teksto
+pdfjs-editor-color-picker-free-text-input =
+    .title = 艤an臐i koloron de teksto
+pdfjs-editor-free-text-button-label = Teksto
+pdfjs-editor-ink-button =
+    .title = Desegni
+pdfjs-editor-color-picker-ink-input =
+    .title = 艤an臐i desegnan koloron
+pdfjs-editor-ink-button-label = Desegni
+pdfjs-editor-stamp-button =
+    .title = Aldoni a怒 modifi bildojn
+pdfjs-editor-stamp-button-label = Aldoni a怒 modifi bildojn
+pdfjs-editor-highlight-button =
+    .title = Elstarigi
+pdfjs-editor-highlight-button-label = Elstarigi
+pdfjs-highlight-floating-button1 =
+    .title = Elstarigi
+    .aria-label = Elstarigi
+pdfjs-highlight-floating-button-label = Elstarigi
+pdfjs-comment-floating-button =
+    .title = Komenti
+    .aria-label = Komenti
+pdfjs-comment-floating-button-label = Komenti
+pdfjs-editor-comment-button =
+    .title = Komenti
+    .aria-label = Komenti
+pdfjs-editor-comment-button-label = Komenti
+pdfjs-editor-signature-button =
+    .title = Aldoni subskribon
+pdfjs-editor-signature-button-label = Aldoni subskribon
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Redaktilo de elstara牡o
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Redaktilo de desegno
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Redaktilo de subskribo: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Redaktilo de bildo
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Forigi desegnon
+pdfjs-editor-remove-freetext-button =
+    .title = Forigi tekston
+pdfjs-editor-remove-stamp-button =
+    .title = Forigi bildon
+pdfjs-editor-remove-highlight-button =
+    .title = Forigi elstara牡on
+pdfjs-editor-remove-signature-button =
+    .title = Forigi subskribon
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Koloro
+pdfjs-editor-free-text-size-input = Grando
+pdfjs-editor-ink-color-input = Koloro
+pdfjs-editor-ink-thickness-input = Dikeco
+pdfjs-editor-ink-opacity-input = Maldiafaneco
+pdfjs-editor-stamp-add-image-button =
+    .title = Aldoni bildon
+pdfjs-editor-stamp-add-image-button-label = Aldoni bildon
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Dikeco
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 艤an臐i dikecon dum elstarigo de netekstaj elementoj
+pdfjs-editor-add-signature-container =
+    .aria-label = Kontrolado de subskriboj kaj konservitaj subskriboj
+pdfjs-editor-signature-add-signature-button =
+    .title = Aldoni novan subskribon
+pdfjs-editor-signature-add-signature-button-label = Aldoni novan subskribon
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Konservita subskribo: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Teksta redaktilo
+    .default-content = Komencu tajpi鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Komenti
+       *[other] Komentoj
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Fermi la flankan strion
+    .aria-label = Fermi la flankan strion
+pdfjs-editor-comments-sidebar-close-button-label = Fermi la flankan strion
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 膱u vi rimarkas ion interesan? Elstarigu tion kaj aldonu komenton.
+pdfjs-editor-comments-sidebar-no-comments-link = Pli da informo
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternativa teksto
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Redakti alternativan tekston
+pdfjs-editor-alt-text-dialog-label = Elektu eblon
+pdfjs-editor-alt-text-dialog-description = Alternativa teksto helpas personojn, en la okazoj kiam ili ne povas vidi a怒 艥argi la bildon.
+pdfjs-editor-alt-text-add-description-label = Aldoni priskribon
+pdfjs-editor-alt-text-add-description-description = La celo estas unu a怒 du frazoj, kiuj priskribas la temon, etoson a怒 agojn.
+pdfjs-editor-alt-text-mark-decorative-label = Marki kiel ornaman
+pdfjs-editor-alt-text-mark-decorative-description = Tio 膲i estas uzita por ornamaj bildoj, kiel randoj a怒 fonaj bildoj.
+pdfjs-editor-alt-text-cancel-button = Nuligi
+pdfjs-editor-alt-text-save-button = Konservi
+pdfjs-editor-alt-text-decorative-tooltip = Markita kiel ornama
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Ekzemple: 鈥淛una persono sidi臐as 膲etable por ekman臐i鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternativa teksto
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Supra maldekstra angulo 鈥� 艥angi grandon
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Supra mezo 鈥� 艥an臐i grandon
+pdfjs-editor-resizer-top-right =
+    .aria-label = Supran dekstran angulon 鈥� 艥an臐i grandon
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Dekstra mezo 鈥� 艥an臐i grandon
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Malsupra deksta angulo 鈥� 艥an臐i grandon
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Malsupra mezo 鈥� 艥an臐i grandon
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Malsupra maldekstra angulo 鈥� 艥an臐i grandon
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Maldekstra mezo 鈥� 艥an臐i grandon
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Elstarigi koloron
+pdfjs-editor-colorpicker-button =
+    .title = 艤an臐i koloron
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Elekto de koloroj
+pdfjs-editor-colorpicker-yellow =
+    .title = Flava
+pdfjs-editor-colorpicker-green =
+    .title = Verda
+pdfjs-editor-colorpicker-blue =
+    .title = Blua
+pdfjs-editor-colorpicker-pink =
+    .title = Roza
+pdfjs-editor-colorpicker-red =
+    .title = Ru臐a
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Montri 膲iujn
+pdfjs-editor-highlight-show-all-button =
+    .title = Montri 膲iujn
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Modifi alternativan tekston (priskribo de bildo)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Aldoni alternativan tekston (priskribo de bildo)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Skribu vian priskribon 膲i tie鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Mallonga priskribo por personoj kiuj ne povas vidi la bildon kaj por montri kiam la bildo ne 艥argeblas.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Tiu 膲i alternativa teksto estis a怒tomate kreita kaj povus esti mal臐usta.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Pli da informo
+pdfjs-editor-new-alt-text-create-automatically-button-label = A怒tomate krei alternativan tekston
+pdfjs-editor-new-alt-text-not-now-button = Ne nun
+pdfjs-editor-new-alt-text-error-title = Ne eblis a怒tomate krei alternativan tekston
+pdfjs-editor-new-alt-text-error-description = Bonvolu skribi vian propran alternativan tekston a怒 provi denove poste.
+pdfjs-editor-new-alt-text-error-close-button = Fermi
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = El艥uto de modelo de artefarita intelekto por alternativa teksto ({ $downloadedSize } el { $totalSize } MO)
+    .aria-valuetext = El艥uto de modelo de artefarita intelekto por alternativa teksto ({ $downloadedSize } el { $totalSize } MO)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativa teksto aldonita
+pdfjs-editor-new-alt-text-added-button-label = Alternativa teksto aldonita
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Mankas alternativa teksto
+pdfjs-editor-new-alt-text-missing-button-label = Mankas alternativa teksto
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Kontroli alternativan tekston
+pdfjs-editor-new-alt-text-to-review-button-label = Kontroli alternativan tekston
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = A怒tomate kreita: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Agordoj por alternativa teksto de bildoj
+pdfjs-image-alt-text-settings-button-label = Agordoj por alternativa teksto de bildoj
+pdfjs-editor-alt-text-settings-dialog-label = Agordoj por alternativa teksto de bildoj
+pdfjs-editor-alt-text-settings-automatic-title = A怒tomata alternativa teksto
+pdfjs-editor-alt-text-settings-create-model-button-label = A怒tomate krei alternativan tekston
+pdfjs-editor-alt-text-settings-create-model-description = Tio 膲i sugestas priskribojn por helpi personojn kiuj ne povas vidi a怒 艥argi la bildon.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modelo de artefarita intelekto por alternativa teksto ({ $totalSize } MO)
+pdfjs-editor-alt-text-settings-ai-model-description = 臏i funkcias en via aparato, do viaj datumoj restas privataj. 臏i estas postulata por a怒tomata kreado de alternativa teksto.
+pdfjs-editor-alt-text-settings-delete-model-button = Forigi
+pdfjs-editor-alt-text-settings-download-model-button = El艥uti
+pdfjs-editor-alt-text-settings-downloading-model-button = El艥uto鈥�
+pdfjs-editor-alt-text-settings-editor-title = Redaktilo de alternativa teksto
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Montri redaktilon de alternativa teksto tuj post aldono de bildo
+pdfjs-editor-alt-text-settings-show-dialog-description = Tio 膲i helpas vin kontroli 膲u 膲iuj bildoj havas alternativan tekston.
+pdfjs-editor-alt-text-settings-close-button = Fermi
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Elstarigo aldonita
+pdfjs-editor-freetext-added-alert = Teksto aldonita
+pdfjs-editor-ink-added-alert = Desegno aldonita
+pdfjs-editor-stamp-added-alert = Bildo aldonita
+pdfjs-editor-signature-added-alert = Subskribo aldonita
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Elstara牡o forigita
+pdfjs-editor-undo-bar-message-freetext = Teksto forigita
+pdfjs-editor-undo-bar-message-ink = Desegno forigita
+pdfjs-editor-undo-bar-message-stamp = Bildo forigita
+pdfjs-editor-undo-bar-message-signature = Subskribo forigita
+pdfjs-editor-undo-bar-message-comment = Komento forigita
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] unu prinoto forigita
+       *[other] { $count } prinotoj forigitaj
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Malfari
+pdfjs-editor-undo-bar-undo-button-label = Malfari
+pdfjs-editor-undo-bar-close-button =
+    .title = Fermi
+pdfjs-editor-undo-bar-close-button-label = Fermi
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Tiu 膲i fenestro permesas al la uzanto krei subskribon por aldoni al dokumento PDF. La uzanto povas modifi la nomon (kiu estas cetere la alternativa teksto) kaj havas la eblon konservi la subskribon por posta uzo.
+pdfjs-editor-add-signature-dialog-title = Aldoni subskribon
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Tajpi
+    .title = Tajpi
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Desegni
+    .title = Desegni
+pdfjs-editor-add-signature-image-button = Bildo
+    .title = Bildo
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Tajpu vian subskribon
+    .placeholder = Tajpu vian subskribon
+pdfjs-editor-add-signature-draw-placeholder = Desegni vian subskribon
+pdfjs-editor-add-signature-draw-thickness-range-label = Dikeco
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Dikeco de desegno: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Trenu dosieron 膲i tien por al艥uti 臐in
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] A怒 elektu bildan dosieron
+       *[other] A怒 elektu bildan dosieron
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Priskribo (alternativa teksto)
+pdfjs-editor-add-signature-description-input =
+    .title = Priskribo (alternativa teksto)
+pdfjs-editor-add-signature-description-default-when-drawing = Subskribo
+pdfjs-editor-add-signature-clear-button-label = Vi艥i subskribon
+pdfjs-editor-add-signature-clear-button =
+    .title = Vi艥i subskribon
+pdfjs-editor-add-signature-save-checkbox = Konservi subskribon
+pdfjs-editor-add-signature-save-warning-message = Vi atingis la limon de kvin konservitaj subskriboj. Forigi unu por povi konservi pli da.
+pdfjs-editor-add-signature-image-upload-error-title = Ne eblis al艥uti bildon
+pdfjs-editor-add-signature-image-upload-error-description = Kontrolu vian retaliron a怒 provu al艥uti alian bildon.
+pdfjs-editor-add-signature-image-no-data-error-title = Ne eblas konverti tiun 膲i bildon al subskribo
+pdfjs-editor-add-signature-image-no-data-error-description = Bonvolu provi al艥uti novan bildon.
+pdfjs-editor-add-signature-error-close-button = Fermi
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Nuligi
+pdfjs-editor-add-signature-add-button = Aldoni
+pdfjs-editor-edit-signature-update-button = 臏isdatigi
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Modifi komenton
+pdfjs-editor-edit-comment-popup-button =
+    .title = Modifi komenton
+pdfjs-editor-delete-comment-popup-button-label = Forigi komenton
+pdfjs-editor-delete-comment-popup-button =
+    .title = Forigi komenton
+pdfjs-show-comment-button =
+    .title = Montri komenton
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Modifi komenton
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 臏isdatigi
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Aldoni komenton
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Aldoni
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Ektajpi鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Nuligi
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Aldoni komenton
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Montri/ka艥i flankan strion (la dokumento enhavas miniaturojn/konturon/kunsenda牡ojn/tavolojn)
+pdfjs-toggle-views-manager-button1-label = Administri pa臐ojn
+pdfjs-views-manager-sidebar =
+    .aria-label = Flanka strio
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Dimensiigilo por la flanka strio
+pdfjs-views-manager-view-selector-button =
+    .title = Vidoj
+pdfjs-views-manager-view-selector-button-label = Vidoj
+pdfjs-views-manager-pages-title = Pa臐oj
+pdfjs-views-manager-outlines-title1 = Konturo de dokumento
+    .title = Konturo de dokumento (alklaku duoble por faldi/malfaldi 膲iujn elementojn)
+pdfjs-views-manager-attachments-title = Kunsenda牡oj
+pdfjs-views-manager-layers-title1 = Tavoloj
+    .title = Tavoloj (alklaku duoble por ke 膲iuj tavoloj reiru al la norma stato)
+pdfjs-views-manager-pages-option-label = Pa臐oj
+pdfjs-views-manager-outlines-option-label = Konturo de dokumento
+pdfjs-views-manager-attachments-option-label = Kunsenda牡oj
+pdfjs-views-manager-layers-option-label = Tavoloj
+pdfjs-views-manager-add-file-button =
+    .title = Aldoni dosieron
+pdfjs-views-manager-add-file-button-label = Aldoni dosieron
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } elektita
+       *[other] { $count } elektitaj
+    }
+pdfjs-views-manager-pages-status-none-action-label = Elekti pa臐ojn
+pdfjs-views-manager-pages-status-action-button-label = Administri
+pdfjs-views-manager-pages-status-copy-button-label = Kopii
+pdfjs-views-manager-pages-status-cut-button-label = Eltondi
+pdfjs-views-manager-pages-status-delete-button-label = Forigi
+pdfjs-views-manager-pages-status-export-selected-button-label = Eksporti elektitajn鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 pa臐o eltondita
+       *[other] { $count } pa臐oj eltonditaj
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 pa臐o kopiita
+       *[other] { $count } pa臐oj kopiitaj
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 pa臐o forigita
+       *[other] { $count } pa臐oj forigitaj
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Pretigo de via dosiero鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Dosiero al艥utata鈥�
+pdfjs-views-manager-status-warning-cut-label = Ne eblis eltondi. Refre艥igu la pa臐on kaj provu denove.
+pdfjs-views-manager-status-warning-copy-label = Ne eblis kopii. Refre艥igu la pa臐on kaj provu denove.
+pdfjs-views-manager-status-warning-delete-label = Ne eblis forigi. Refre艥igu la pa臐on kaj provu denove.
+pdfjs-views-manager-status-warning-save-label = Ne eblis konservi. Refre艥igu la pa臐on kaj provu denove.
+pdfjs-views-manager-status-undo-button-label = Malfari
+pdfjs-views-manager-status-done-button-label = Farita
+pdfjs-views-manager-status-close-button =
+    .title = Fermi
+pdfjs-views-manager-status-close-button-label = Fermi
+pdfjs-views-manager-paste-button-label = Alglui
+pdfjs-views-manager-paste-button-before =
+    .title = Alglui anta怒 la unua pa臐o
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Alglui post la pa臐o { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOVA
+pdfjs-views-manager-waiting-for-file = Dosiero al艥utata鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Administri pa臐ojn
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Forigi konservitan subskribon
+pdfjs-editor-delete-signature-button-label1 = Forigi konservitan subskribon
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Modifi priskribon
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Modifi priskribon
diff --git a/public/pdfjs/web/locale/es-AR/viewer.ftl b/public/pdfjs/web/locale/es-AR/viewer.ftl
new file mode 100644
index 0000000..0d26a75
--- /dev/null
+++ b/public/pdfjs/web/locale/es-AR/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩gina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = P谩gina siguiente
+pdfjs-next-button-label = Siguiente
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P谩gina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ( { $pageNumber } de { $pagesCount } )
+pdfjs-zoom-out-button =
+    .title = Alejar
+pdfjs-zoom-out-button-label = Alejar
+pdfjs-zoom-in-button =
+    .title = Acercar
+pdfjs-zoom-in-button-label = Acercar
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Cambiar a modo presentaci贸n
+pdfjs-presentation-mode-button-label = Modo presentaci贸n
+pdfjs-open-file-button =
+    .title = Abrir archivo
+pdfjs-open-file-button-label = Abrir
+pdfjs-print-button =
+    .title = Imprimir
+pdfjs-print-button-label = Imprimir
+pdfjs-save-button =
+    .title = Guardar
+pdfjs-save-button-label = Guardar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Descargar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Descargar
+pdfjs-bookmark-button =
+    .title = P谩gina actual (Ver URL de la p谩gina actual)
+pdfjs-bookmark-button-label = P谩gina actual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Herramientas
+pdfjs-tools-button-label = Herramientas
+pdfjs-first-page-button =
+    .title = Ir a primera p谩gina
+pdfjs-first-page-button-label = Ir a primera p谩gina
+pdfjs-last-page-button =
+    .title = Ir a 煤ltima p谩gina
+pdfjs-last-page-button-label = Ir a 煤ltima p谩gina
+pdfjs-page-rotate-cw-button =
+    .title = Rotar horario
+pdfjs-page-rotate-cw-button-label = Rotar horario
+pdfjs-page-rotate-ccw-button =
+    .title = Rotar antihorario
+pdfjs-page-rotate-ccw-button-label = Rotar antihorario
+pdfjs-cursor-text-select-tool-button =
+    .title = Habilitar herramienta de selecci贸n de texto
+pdfjs-cursor-text-select-tool-button-label = Herramienta de selecci贸n de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Habilitar herramienta mano
+pdfjs-cursor-hand-tool-button-label = Herramienta mano
+pdfjs-scroll-page-button =
+    .title = Usar desplazamiento de p谩gina
+pdfjs-scroll-page-button-label = Desplazamiento de p谩gina
+pdfjs-scroll-vertical-button =
+    .title = Usar desplazamiento vertical
+pdfjs-scroll-vertical-button-label = Desplazamiento vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usar desplazamiento vertical
+pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Usar desplazamiento encapsulado
+pdfjs-scroll-wrapped-button-label = Desplazamiento encapsulado
+pdfjs-spread-none-button =
+    .title = No unir p谩ginas dobles
+pdfjs-spread-none-button-label = Sin dobles
+pdfjs-spread-odd-button =
+    .title = Unir p谩ginas dobles comenzando con las impares
+pdfjs-spread-odd-button-label = Dobles impares
+pdfjs-spread-even-button =
+    .title = Unir p谩ginas dobles comenzando con las pares
+pdfjs-spread-even-button-label = Dobles pares
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiedades del documento鈥�
+pdfjs-document-properties-button-label = Propiedades del documento鈥�
+pdfjs-document-properties-file-name = Nombre de archivo:
+pdfjs-document-properties-file-size = Tama帽o de archovo:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = T铆tulo:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Asunto:
+pdfjs-document-properties-keywords = Palabras clave:
+pdfjs-document-properties-creation-date = Fecha de creaci贸n:
+pdfjs-document-properties-modification-date = Fecha de modificaci贸n:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creador:
+pdfjs-document-properties-producer = PDF Productor:
+pdfjs-document-properties-version = Versi贸n de PDF:
+pdfjs-document-properties-page-count = Cantidad de p谩ginas:
+pdfjs-document-properties-page-size = Tama帽o de p谩gina:
+pdfjs-document-properties-page-size-unit-inches = en
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = normal
+pdfjs-document-properties-page-size-orientation-landscape = apaisado
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista r谩pida de la Web:
+pdfjs-document-properties-linearized-yes = S铆
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Cerrar
+
+## Print
+
+pdfjs-print-progress-message = Preparando documento para imprimir鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancelar
+pdfjs-printing-not-supported = Advertencia: La impresi贸n no est谩 totalmente soportada por este navegador.
+pdfjs-printing-not-ready = Advertencia: El PDF no est谩 completamente cargado para impresi贸n.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Alternar barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)
+pdfjs-toggle-sidebar-button-label = Alternar barra lateral
+pdfjs-document-outline-button =
+    .title = Mostrar esquema del documento (doble clic para expandir/colapsar todos los 铆tems)
+pdfjs-document-outline-button-label = Esquema del documento
+pdfjs-attachments-button =
+    .title = Mostrar adjuntos
+pdfjs-attachments-button-label = Adjuntos
+pdfjs-layers-button =
+    .title = Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)
+pdfjs-layers-button-label = Capas
+pdfjs-thumbs-button =
+    .title = Mostrar miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Buscar elemento de esquema actual
+pdfjs-current-outline-item-button-label = Elemento de esquema actual
+pdfjs-findbar-button =
+    .title = Buscar en documento
+pdfjs-findbar-button-label = Buscar
+pdfjs-additional-layers = Capas adicionales
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura de p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Seleccionar p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = P谩gina { $page } de { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Buscar
+    .placeholder = Buscar en documento鈥�
+pdfjs-find-previous-button =
+    .title = Buscar la aparici贸n anterior de la frase
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button =
+    .title = Buscar la siguiente aparici贸n de la frase
+pdfjs-find-next-button-label = Siguiente
+pdfjs-find-highlight-checkbox = Resaltar todo
+pdfjs-find-match-case-checkbox-label = Coincidir may煤sculas
+pdfjs-find-match-diacritics-checkbox-label = Coincidir diacr铆ticos
+pdfjs-find-entire-word-checkbox-label = Palabras completas
+pdfjs-find-reached-top = Inicio de documento alcanzado, continuando desde abajo
+pdfjs-find-reached-bottom = Fin de documento alcanzando, continuando desde arriba
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } de { $total } coincidencia
+       *[other] { $current } de { $total } coincidencias
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] M谩s de { $limit } coincidencia
+       *[other] M谩s de { $limit } coincidencias
+    }
+pdfjs-find-not-found = Frase no encontrada
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Ancho de p谩gina
+pdfjs-page-scale-fit = Ajustar p谩gina
+pdfjs-page-scale-auto = Zoom autom谩tico
+pdfjs-page-scale-actual = Tama帽o real
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P谩gina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ocurri贸 un error al cargar el PDF.
+pdfjs-invalid-file-error = Archivo PDF no v谩lido o cocrrupto.
+pdfjs-missing-file-error = Archivo PDF faltante.
+pdfjs-unexpected-response-error = Respuesta del servidor inesperada.
+pdfjs-rendering-error = Ocurri贸 un error al dibujar la p谩gina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Anotaci贸n]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Ingrese la contrase帽a para abrir este archivo PDF
+pdfjs-password-invalid = Contrase帽a inv谩lida. Intente nuevamente.
+pdfjs-password-ok-button = Aceptar
+pdfjs-password-cancel-button = Cancelar
+pdfjs-web-fonts-disabled = Tipograf铆a web deshabilitada: no se pueden usar tipos incrustados en PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texto
+pdfjs-editor-color-picker-free-text-input =
+    .title = Cambiar color del texto
+pdfjs-editor-free-text-button-label = Texto
+pdfjs-editor-ink-button =
+    .title = Dibujar
+pdfjs-editor-color-picker-ink-input =
+    .title = Cambiar color del dibujo
+pdfjs-editor-ink-button-label = Dibujar
+pdfjs-editor-stamp-button =
+    .title = Agregar o editar im谩genes
+pdfjs-editor-stamp-button-label = Agregar o editar im谩genes
+pdfjs-editor-highlight-button =
+    .title = Resaltar
+pdfjs-editor-highlight-button-label = Resaltar
+pdfjs-highlight-floating-button1 =
+    .title = Resaltar
+    .aria-label = Resaltar
+pdfjs-highlight-floating-button-label = Resaltar
+pdfjs-comment-floating-button =
+    .title = Comentar
+    .aria-label = Comentar
+pdfjs-comment-floating-button-label = Comentar
+pdfjs-editor-comment-button =
+    .title = Comentar
+    .aria-label = Comentar
+pdfjs-editor-comment-button-label = Comentar
+pdfjs-editor-signature-button =
+    .title = Agregar firma
+pdfjs-editor-signature-button-label = Agregar firma
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de resaltado
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de dibujos
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de firmas: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de im谩genes
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Eliminar dibujo
+pdfjs-editor-remove-freetext-button =
+    .title = Eliminar texto
+pdfjs-editor-remove-stamp-button =
+    .title = Eliminar imagen
+pdfjs-editor-remove-highlight-button =
+    .title = Eliminar resaltado
+pdfjs-editor-remove-signature-button =
+    .title = Eliminar firma
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Color
+pdfjs-editor-free-text-size-input = Tama帽o
+pdfjs-editor-ink-color-input = Color
+pdfjs-editor-ink-thickness-input = Espesor
+pdfjs-editor-ink-opacity-input = Opacidad
+pdfjs-editor-stamp-add-image-button =
+    .title = Agregar una imagen
+pdfjs-editor-stamp-add-image-button-label = Agregar una imagen
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Grosor
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Cambiar el grosor al resaltar elementos que no sean texto
+pdfjs-editor-add-signature-container =
+    .aria-label = Controles de firma y firmas guardadas
+pdfjs-editor-signature-add-signature-button =
+    .title = Agregar nueva firma
+pdfjs-editor-signature-add-signature-button-label = Agregar nueva firma
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Firma guardada: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de texto
+    .default-content = Comenzar a tipear鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Comentario
+       *[other] Comentarios
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Cerrar la barra lateral
+    .aria-label = Cerrar la barra lateral
+pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 驴Ve algo digno de menci贸n? Res谩ltelo y deje un comentario.
+pdfjs-editor-comments-sidebar-no-comments-link = Conocer m谩s
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texto alternativo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editar texto alternativo
+pdfjs-editor-alt-text-dialog-label = Eligir una opci贸n
+pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga.
+pdfjs-editor-alt-text-add-description-label = Agregar una descripci贸n
+pdfjs-editor-alt-text-add-description-description = Intente escribir 1 o 2 oraciones que describan el tema, el entorno o las acciones.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativo
+pdfjs-editor-alt-text-mark-decorative-description = Esto se usa para im谩genes ornamentales, como bordes o marcas de agua.
+pdfjs-editor-alt-text-cancel-button = Cancelar
+pdfjs-editor-alt-text-save-button = Guardar
+pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativo
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Por ejemplo: 鈥淯n joven se sienta a la mesa a comer鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texto alternativo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Esquina superior izquierda 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Arriba en el medio 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-top-right =
+    .aria-label = Esquina superior derecha 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Al centro a la derecha 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Esquina inferior derecha 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Abajo en el medio 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Esquina inferior izquierda 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Al centro a la izquierda 鈥� cambiar el tama帽o
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Color de resaltado
+pdfjs-editor-colorpicker-button =
+    .title = Cambiar el color
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Opciones de color
+pdfjs-editor-colorpicker-yellow =
+    .title = Amarillo
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Azul
+pdfjs-editor-colorpicker-pink =
+    .title = Rosado
+pdfjs-editor-colorpicker-red =
+    .title = Rojo
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mostrar todo
+pdfjs-editor-highlight-show-all-button =
+    .title = Mostrar todo
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripci贸n de la imagen)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Agregar texto alternativo (descripci贸n de la imagen)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Escribir la descripci贸n aqu铆鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Descripci贸n corta para las personas que no pueden ver la imagen o cuando la imagen no se carga.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado autom谩ticamente y puede ser incorrecto.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Conocer m谩s
+pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo autom谩ticamente
+pdfjs-editor-new-alt-text-not-now-button = No ahora
+pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo autom谩ticamente
+pdfjs-editor-new-alt-text-error-description = Escriba su propio texto alternativo o pruebe nuevamente m谩s tarde.
+pdfjs-editor-new-alt-text-error-close-button = Cerrar
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = Descargando modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Texto alternativo agregado
+pdfjs-editor-new-alt-text-added-button-label = Texto alternativo agregado
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Falta el texto alternativo
+pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Calificar el texto alternativo
+pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado autom谩ticamente: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Configuraci贸n de texto alternativo de la imagen
+pdfjs-image-alt-text-settings-button-label = Configuraci贸n de texto alternativo de la imagen
+pdfjs-editor-alt-text-settings-dialog-label = Configuraci贸n de texto alternativo de la imagen
+pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo autom谩tico
+pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo autom谩ticamente
+pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo autom谩tico.
+pdfjs-editor-alt-text-settings-delete-model-button = Borrar
+pdfjs-editor-alt-text-settings-download-model-button = Descargar
+pdfjs-editor-alt-text-settings-downloading-model-button = Descargando鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al agregar una imagen
+pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarse de que todas las im谩genes tengan texto alternativo.
+pdfjs-editor-alt-text-settings-close-button = Cerrar
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Resaltado agregado
+pdfjs-editor-freetext-added-alert = Texto agregado
+pdfjs-editor-ink-added-alert = Dibujo agregado
+pdfjs-editor-stamp-added-alert = Imagen agregada
+pdfjs-editor-signature-added-alert = Firma agregada
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado
+pdfjs-editor-undo-bar-message-freetext = Texto eliminado
+pdfjs-editor-undo-bar-message-ink = Dibujo eliminado
+pdfjs-editor-undo-bar-message-stamp = Imagen eliminado
+pdfjs-editor-undo-bar-message-signature = Firma eliminada
+pdfjs-editor-undo-bar-message-comment = Comentario eliminado
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anotaci贸n eliminada
+       *[other] { $count } anotaciones eliminadas
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Deshacer
+pdfjs-editor-undo-bar-undo-button-label = Deshacer
+pdfjs-editor-undo-bar-close-button =
+    .title = Cerrar
+pdfjs-editor-undo-bar-close-button-label = Cerrar
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para agregar a un documento PDF. El usuario puede editar el nombre (que tambi茅n sirve como texto alternativo) y opcionalmente guardar la firma para un uso repetido.
+pdfjs-editor-add-signature-dialog-title = Agregar una firma
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Tipear
+    .title = Tipear
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Dibujar
+    .title = Dibujar
+pdfjs-editor-add-signature-image-button = Imagen
+    .title = Imagen
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Escribir la firma
+    .placeholder = Escribir la firma
+pdfjs-editor-add-signature-draw-placeholder = Dibujar la firma
+pdfjs-editor-add-signature-draw-thickness-range-label = Grosor
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Grosor del dibujo: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Arrastrar un archivo ac谩 para subirlo
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] O seleccionar archivos de im谩genes
+       *[other] O seleccionar archivos de im谩genes
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descripci贸n (texto alternativo)
+pdfjs-editor-add-signature-description-input =
+    .title = Descripci贸n (texto alternativo)
+pdfjs-editor-add-signature-description-default-when-drawing = Firma
+pdfjs-editor-add-signature-clear-button-label = Borrar firma
+pdfjs-editor-add-signature-clear-button =
+    .title = Borrar firma
+pdfjs-editor-add-signature-save-checkbox = Guardar firma
+pdfjs-editor-add-signature-save-warning-message = Se alcanz贸 el l铆mite de 5 firmas guardadas. Elimine una para guardar m谩s.
+pdfjs-editor-add-signature-image-upload-error-title = No se pudo subir la imagen
+pdfjs-editor-add-signature-image-upload-error-description = Verifique la conexi贸n de red o pruebe con otra imagen.
+pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma
+pdfjs-editor-add-signature-image-no-data-error-description = Intente subir una imagen diferente.
+pdfjs-editor-add-signature-error-close-button = Cerrar
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancelar
+pdfjs-editor-add-signature-add-button = Agregar
+pdfjs-editor-edit-signature-update-button = Actualizar
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Editar comentario
+pdfjs-editor-edit-comment-popup-button =
+    .title = Editar comentario
+pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario
+pdfjs-editor-delete-comment-popup-button =
+    .title = Eliminar comentario
+pdfjs-show-comment-button =
+    .title = Mostrar comentario
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Agregar comentario
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Agregar
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Empezar a tipear鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Agregar comentario
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Alternar barra lateral (el documento contiene miniaturas/esquemas/adjuntos/capas)
+pdfjs-toggle-views-manager-button1-label = Administrar p谩ginas
+pdfjs-views-manager-sidebar =
+    .aria-label = Barra lateral
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Redimensionador de barra lateral
+pdfjs-views-manager-view-selector-button =
+    .title = Vistas
+pdfjs-views-manager-view-selector-button-label = Vistas
+pdfjs-views-manager-pages-title = P谩ginas
+pdfjs-views-manager-outlines-title1 = Esquema del documento
+    .title = Esquema del documento (doble clic para expandir/colapsar todos los 铆tems)
+pdfjs-views-manager-attachments-title = Adjuntos
+pdfjs-views-manager-layers-title1 = Capas
+    .title = Capas (doble clic para restablecer todas las ca帽as al estado predeterminado)
+pdfjs-views-manager-pages-option-label = P谩ginas
+pdfjs-views-manager-outlines-option-label = Esquema del documento
+pdfjs-views-manager-attachments-option-label = Adjuntos
+pdfjs-views-manager-layers-option-label = Capas
+pdfjs-views-manager-add-file-button =
+    .title = Agregar archivo
+pdfjs-views-manager-add-file-button-label = Agregar archivo
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } seleccionada
+       *[other] { $count } seleccionadas
+    }
+pdfjs-views-manager-pages-status-none-action-label = Seleccionar p谩ginas
+pdfjs-views-manager-pages-status-action-button-label = Administrar
+pdfjs-views-manager-pages-status-copy-button-label = Copiar
+pdfjs-views-manager-pages-status-cut-button-label = Cortar
+pdfjs-views-manager-pages-status-delete-button-label = Borrar
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportar seleccionado鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 p谩gina cortada
+       *[other] { $count } p谩ginas cortadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 p谩gina copiada
+       *[other] { $count } p谩ginas copiadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 p谩gina borrada
+       *[other] { $count } p谩ginas borradas
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Preparando el archivo鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo el archivo鈥�
+pdfjs-views-manager-status-warning-cut-label = No se pudo cortar. Refresque la p谩gina y pruebe de nuevo.
+pdfjs-views-manager-status-warning-copy-label = No se pudo copiar. Refresque la p谩gina y pruebe de nuevo.
+pdfjs-views-manager-status-warning-delete-label = No se pudo borrar. Refresque la p谩gina y pruebe de nuevo.
+pdfjs-views-manager-status-warning-save-label = No se pudo guardar. Refresque la p谩gina y pruebe de nuevo.
+pdfjs-views-manager-status-undo-button-label = Deshacer
+pdfjs-views-manager-status-done-button-label = Listo
+pdfjs-views-manager-status-close-button =
+    .title = Cerrar
+pdfjs-views-manager-status-close-button-label = Cerrar
+pdfjs-views-manager-paste-button-label = Pegar
+pdfjs-views-manager-paste-button-before =
+    .title = Pegar antes de la primera p谩gina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Pegar despu茅s de la p谩gina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NUEVO
+pdfjs-views-manager-waiting-for-file = Subiendo archivo鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Administrar p谩ginas
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Eliminar firma guardada
+pdfjs-editor-delete-signature-button-label1 = Eliminar firma guardada
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Editar descripci贸n
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Editar descripci贸n
diff --git a/public/pdfjs/web/locale/es-CL/viewer.ftl b/public/pdfjs/web/locale/es-CL/viewer.ftl
new file mode 100644
index 0000000..6ab81b1
--- /dev/null
+++ b/public/pdfjs/web/locale/es-CL/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩gina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = P谩gina siguiente
+pdfjs-next-button-label = Siguiente
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P谩gina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Alejar
+pdfjs-zoom-out-button-label = Alejar
+pdfjs-zoom-in-button =
+    .title = Acercar
+pdfjs-zoom-in-button-label = Acercar
+pdfjs-zoom-select =
+    .title = Ampliaci贸n
+pdfjs-presentation-mode-button =
+    .title = Cambiar al modo de presentaci贸n
+pdfjs-presentation-mode-button-label = Modo de presentaci贸n
+pdfjs-open-file-button =
+    .title = Abrir archivo
+pdfjs-open-file-button-label = Abrir
+pdfjs-print-button =
+    .title = Imprimir
+pdfjs-print-button-label = Imprimir
+pdfjs-save-button =
+    .title = Guardar
+pdfjs-save-button-label = Guardar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Descargar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Descargar
+pdfjs-bookmark-button =
+    .title = P谩gina actual (Ver URL de la p谩gina actual)
+pdfjs-bookmark-button-label = P谩gina actual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Herramientas
+pdfjs-tools-button-label = Herramientas
+pdfjs-first-page-button =
+    .title = Ir a la primera p谩gina
+pdfjs-first-page-button-label = Ir a la primera p谩gina
+pdfjs-last-page-button =
+    .title = Ir a la 煤ltima p谩gina
+pdfjs-last-page-button-label = Ir a la 煤ltima p谩gina
+pdfjs-page-rotate-cw-button =
+    .title = Girar a la derecha
+pdfjs-page-rotate-cw-button-label = Girar a la derecha
+pdfjs-page-rotate-ccw-button =
+    .title = Girar a la izquierda
+pdfjs-page-rotate-ccw-button-label = Girar a la izquierda
+pdfjs-cursor-text-select-tool-button =
+    .title = Activar la herramienta de selecci贸n de texto
+pdfjs-cursor-text-select-tool-button-label = Herramienta de selecci贸n de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Activar la herramienta de mano
+pdfjs-cursor-hand-tool-button-label = Herramienta de mano
+pdfjs-scroll-page-button =
+    .title = Usar desplazamiento de p谩gina
+pdfjs-scroll-page-button-label = Desplazamiento de p谩gina
+pdfjs-scroll-vertical-button =
+    .title = Usar desplazamiento vertical
+pdfjs-scroll-vertical-button-label = Desplazamiento vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usar desplazamiento horizontal
+pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Usar desplazamiento en bloque
+pdfjs-scroll-wrapped-button-label = Desplazamiento en bloque
+pdfjs-spread-none-button =
+    .title = No juntar p谩ginas a modo de libro
+pdfjs-spread-none-button-label = Vista de una p谩gina
+pdfjs-spread-odd-button =
+    .title = Junta las p谩ginas partiendo con una de n煤mero impar
+pdfjs-spread-odd-button-label = Vista de libro impar
+pdfjs-spread-even-button =
+    .title = Junta las p谩ginas partiendo con una de n煤mero par
+pdfjs-spread-even-button-label = Vista de libro par
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiedades del documento鈥�
+pdfjs-document-properties-button-label = Propiedades del documento鈥�
+pdfjs-document-properties-file-name = Nombre de archivo:
+pdfjs-document-properties-file-size = Tama帽o del archivo:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = T铆tulo:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Asunto:
+pdfjs-document-properties-keywords = Palabras clave:
+pdfjs-document-properties-creation-date = Fecha de creaci贸n:
+pdfjs-document-properties-modification-date = Fecha de modificaci贸n:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creador:
+pdfjs-document-properties-producer = Productor del PDF:
+pdfjs-document-properties-version = Versi贸n de PDF:
+pdfjs-document-properties-page-count = Cantidad de p谩ginas:
+pdfjs-document-properties-page-size = Tama帽o de la p谩gina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = horizontal
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Oficio
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista r谩pida en Web:
+pdfjs-document-properties-linearized-yes = S铆
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Cerrar
+
+## Print
+
+pdfjs-print-progress-message = Preparando documento para impresi贸n鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancelar
+pdfjs-printing-not-supported = Advertencia: Imprimir no est谩 soportado completamente por este navegador.
+pdfjs-printing-not-ready = Advertencia: El PDF no est谩 completamente cargado para ser impreso.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Cambiar barra lateral (铆ndice de contenidos del documento/adjuntos/capas)
+pdfjs-toggle-sidebar-button-label = Mostrar u ocultar la barra lateral
+pdfjs-document-outline-button =
+    .title = Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)
+pdfjs-document-outline-button-label = Esquema del documento
+pdfjs-attachments-button =
+    .title = Mostrar adjuntos
+pdfjs-attachments-button-label = Adjuntos
+pdfjs-layers-button =
+    .title = Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)
+pdfjs-layers-button-label = Capas
+pdfjs-thumbs-button =
+    .title = Mostrar miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Buscar elemento de esquema actual
+pdfjs-current-outline-item-button-label = Elemento de esquema actual
+pdfjs-findbar-button =
+    .title = Buscar en el documento
+pdfjs-findbar-button-label = Buscar
+pdfjs-additional-layers = Capas adicionales
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura de la p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Selecciona la p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = P谩gina { $page } de { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Encontrar
+    .placeholder = Encontrar en el documento鈥�
+pdfjs-find-previous-button =
+    .title = Buscar la aparici贸n anterior de la frase
+pdfjs-find-previous-button-label = Previo
+pdfjs-find-next-button =
+    .title = Buscar la siguiente aparici贸n de la frase
+pdfjs-find-next-button-label = Siguiente
+pdfjs-find-highlight-checkbox = Destacar todos
+pdfjs-find-match-case-checkbox-label = Coincidir may煤s./min煤s.
+pdfjs-find-match-diacritics-checkbox-label = Coincidir diacr铆ticos
+pdfjs-find-entire-word-checkbox-label = Palabras completas
+pdfjs-find-reached-top = Se alcanz贸 el inicio del documento, continuando desde el final
+pdfjs-find-reached-bottom = Se alcanz贸 el final del documento, continuando desde el inicio
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] Coincidencia { $current } de { $total }
+       *[other] Coincidencia { $current } de { $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] M谩s de { $limit } coincidencia
+       *[other] M谩s de { $limit } coincidencias
+    }
+pdfjs-find-not-found = Frase no encontrada
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Ancho de p谩gina
+pdfjs-page-scale-fit = Ajuste de p谩gina
+pdfjs-page-scale-auto = Aumento autom谩tico
+pdfjs-page-scale-actual = Tama帽o actual
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P谩gina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ocurri贸 un error al cargar el PDF.
+pdfjs-invalid-file-error = Archivo PDF inv谩lido o corrupto.
+pdfjs-missing-file-error = Falta el archivo PDF.
+pdfjs-unexpected-response-error = Respuesta del servidor inesperada.
+pdfjs-rendering-error = Ocurri贸 un error al renderizar la p谩gina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Anotaci贸n]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Ingresa la contrase帽a para abrir este archivo PDF.
+pdfjs-password-invalid = Contrase帽a inv谩lida. Por favor, vuelve a intentarlo.
+pdfjs-password-ok-button = Aceptar
+pdfjs-password-cancel-button = Cancelar
+pdfjs-web-fonts-disabled = Las tipograf铆as web est谩n desactivadas: imposible usar las fuentes PDF embebidas.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texto
+pdfjs-editor-color-picker-free-text-input =
+    .title = Cambiar color del texto
+pdfjs-editor-free-text-button-label = Texto
+pdfjs-editor-ink-button =
+    .title = Dibujar
+pdfjs-editor-color-picker-ink-input =
+    .title = Cambiar color del dibujo
+pdfjs-editor-ink-button-label = Dibujar
+pdfjs-editor-stamp-button =
+    .title = A帽adir o editar im谩genes
+pdfjs-editor-stamp-button-label = A帽adir o editar im谩genes
+pdfjs-editor-highlight-button =
+    .title = Destacar
+pdfjs-editor-highlight-button-label = Destacar
+pdfjs-highlight-floating-button1 =
+    .title = Destacar
+    .aria-label = Destacar
+pdfjs-highlight-floating-button-label = Destacar
+pdfjs-comment-floating-button =
+    .title = Comentario
+    .aria-label = Comentario
+pdfjs-comment-floating-button-label = Comentario
+pdfjs-editor-comment-button =
+    .title = Comentar
+    .aria-label = Comentar
+pdfjs-editor-comment-button-label = Comentar
+pdfjs-editor-signature-button =
+    .title = A帽adir firma
+pdfjs-editor-signature-button-label = A帽adir firma
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de destacados
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de dibujos
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de firmas: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de im谩genes
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Eliminar dibujo
+pdfjs-editor-remove-freetext-button =
+    .title = Eliminar texto
+pdfjs-editor-remove-stamp-button =
+    .title = Eliminar imagen
+pdfjs-editor-remove-highlight-button =
+    .title = Quitar resaltado
+pdfjs-editor-remove-signature-button =
+    .title = Eliminar firma
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Color
+pdfjs-editor-free-text-size-input = Tama帽o
+pdfjs-editor-ink-color-input = Color
+pdfjs-editor-ink-thickness-input = Grosor
+pdfjs-editor-ink-opacity-input = Opacidad
+pdfjs-editor-stamp-add-image-button =
+    .title = A帽adir imagen
+pdfjs-editor-stamp-add-image-button-label = A帽adir imagen
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Grosor
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Cambia el grosor al resaltar elementos que no sean texto
+pdfjs-editor-add-signature-container =
+    .aria-label = Controles de firma y firmas guardadas
+pdfjs-editor-signature-add-signature-button =
+    .title = A帽adir nueva firma
+pdfjs-editor-signature-add-signature-button-label = A帽adir nueva firma
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Firma guardada: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de texto
+    .default-content = Empieza a escribir鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Comentario
+       *[other] Comentarios
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Cerrar la barra lateral
+    .aria-label = Cerrar la barra lateral
+pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 驴Ves algo interesante? Res谩ltalo y deja un comentario.
+pdfjs-editor-comments-sidebar-no-comments-link = M谩s informaci贸n
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texto alternativo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editar texto alternativo
+pdfjs-editor-alt-text-dialog-label = Elige una opci贸n
+pdfjs-editor-alt-text-dialog-description = El texto alternativo (alt text) ayuda cuando las personas no pueden ver la imagen o cuando no se carga.
+pdfjs-editor-alt-text-add-description-label = A帽ade una descripci贸n
+pdfjs-editor-alt-text-add-description-description = Intenta escribir 1 o 2 oraciones que describan el tema, el ambiente o las acciones.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa
+pdfjs-editor-alt-text-mark-decorative-description = Se utiliza para im谩genes ornamentales, como bordes o marcas de agua.
+pdfjs-editor-alt-text-cancel-button = Cancelar
+pdfjs-editor-alt-text-save-button = Guardar
+pdfjs-editor-alt-text-decorative-tooltip = Marcada como decorativa
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Por ejemplo: 鈥淯n joven se sienta a la mesa a comer鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texto alternativo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Esquina superior izquierda 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Borde superior en el medio 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-top-right =
+    .aria-label = Esquina superior derecha 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Borde derecho en el medio 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Esquina inferior derecha 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Borde inferior en el medio 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Esquina inferior izquierda 鈥� cambiar el tama帽o
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Borde izquierdo en el medio 鈥� cambiar el tama帽o
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Color de resaltado
+pdfjs-editor-colorpicker-button =
+    .title = Cambiar color
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Opciones de color
+pdfjs-editor-colorpicker-yellow =
+    .title = Amarillo
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Azul
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Rojo
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mostrar todo
+pdfjs-editor-highlight-show-all-button =
+    .title = Mostrar todo
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripci贸n de la imagen)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = A帽adir texto alternativo (descripci贸n de la imagen)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Escribe tu descripci贸n aqu铆鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Breve descripci贸n para las personas que no pueden ver la imagen o cuando la imagen no se carga.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado autom谩ticamente y puede ser incorrecto.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Aprender m谩s
+pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo autom谩ticamente
+pdfjs-editor-new-alt-text-not-now-button = Ahora no
+pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo autom谩ticamente
+pdfjs-editor-new-alt-text-error-description = Escribe tu propio texto alternativo o vuelve a intentarlo m谩s tarde.
+pdfjs-editor-new-alt-text-error-close-button = Cerrar
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Se a帽adi贸 el texto alternativo
+pdfjs-editor-new-alt-text-added-button-label = Se a帽adi贸 el texto alternativo
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Falta el texto alternativo
+pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Revisar el texto alternativo
+pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado autom谩ticamente: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Ajustes del texto alternativo de la imagen
+pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen
+pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen
+pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo autom谩tico
+pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo autom谩ticamente
+pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en tu dispositivo para que tus datos permanezcan privados. Necesario para el texto alternativo autom谩tico.
+pdfjs-editor-alt-text-settings-delete-model-button = Eliminar
+pdfjs-editor-alt-text-settings-download-model-button = Descargar
+pdfjs-editor-alt-text-settings-downloading-model-button = Bajando鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al a帽adir una imagen
+pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarte de que todas tus im谩genes tengan texto alternativo.
+pdfjs-editor-alt-text-settings-close-button = Cerrar
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Destacado a帽adido
+pdfjs-editor-freetext-added-alert = Texto a帽adido
+pdfjs-editor-ink-added-alert = Dibujo a帽adido
+pdfjs-editor-stamp-added-alert = Imagen a帽adida
+pdfjs-editor-signature-added-alert = Firma a帽adida
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado
+pdfjs-editor-undo-bar-message-freetext = Texto eliminado
+pdfjs-editor-undo-bar-message-ink = Dibujo eliminado
+pdfjs-editor-undo-bar-message-stamp = Imagen eliminada
+pdfjs-editor-undo-bar-message-signature = Firma eliminada
+pdfjs-editor-undo-bar-message-comment = Comentario eliminado
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anotaci贸n eliminada
+       *[other] { $count } anotaciones eliminadas
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Deshacer
+pdfjs-editor-undo-bar-undo-button-label = Deshacer
+pdfjs-editor-undo-bar-close-button =
+    .title = Cerrar
+pdfjs-editor-undo-bar-close-button-label = Cerrar
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para agregarla a un documento PDF. El usuario puede editar el nombre (que tambi茅n sirve como texto alternativo) y, opcionalmente, guardar la firma para usarla nuevamente.
+pdfjs-editor-add-signature-dialog-title = A帽adir una firma
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Escribir
+    .title = Escribir
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Dibujar
+    .title = Dibujar
+pdfjs-editor-add-signature-image-button = Imagen
+    .title = Imagen
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Escribe tu firma
+    .placeholder = Escribe tu firma
+pdfjs-editor-add-signature-draw-placeholder = Dibuja tu firma
+pdfjs-editor-add-signature-draw-thickness-range-label = Grosor
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Grosor del dibujo: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Arrastre un archivo aqu铆 para cargarlo
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] O elige archivos de imagen
+       *[other] O busca archivos de imagen
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descripci贸n (texto alternativo)
+pdfjs-editor-add-signature-description-input =
+    .title = Descripci贸n (texto alternativo)
+pdfjs-editor-add-signature-description-default-when-drawing = Firma
+pdfjs-editor-add-signature-clear-button-label = Limpiar firma
+pdfjs-editor-add-signature-clear-button =
+    .title = Limpiar firma
+pdfjs-editor-add-signature-save-checkbox = Guardar firma
+pdfjs-editor-add-signature-save-warning-message = Has alcanzado el l铆mite de 5 firmas guardadas. Elimina una para guardar m谩s.
+pdfjs-editor-add-signature-image-upload-error-title = No se pudo subir la imagen
+pdfjs-editor-add-signature-image-upload-error-description = Verifica tu conexi贸n de red o prueba con otra imagen.
+pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma
+pdfjs-editor-add-signature-image-no-data-error-description = Por favor, intenta cargar una imagen diferente.
+pdfjs-editor-add-signature-error-close-button = Cerrar
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancelar
+pdfjs-editor-add-signature-add-button = A帽adir
+pdfjs-editor-edit-signature-update-button = Actualizar
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Editar comentario
+pdfjs-editor-edit-comment-popup-button =
+    .title = Editar comentario
+pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario
+pdfjs-editor-delete-comment-popup-button =
+    .title = Eliminar comentario
+pdfjs-show-comment-button =
+    .title = Mostrar comentario
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = A帽adir comentario
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = A帽adir
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Empieza a escribir鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = A帽adir comentario
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Cambiar barra lateral (铆ndice de contenidos del documento/miniaturas/adjuntos/capas)
+pdfjs-toggle-views-manager-button1-label = Gestionar p谩ginas
+pdfjs-views-manager-sidebar =
+    .aria-label = Barra lateral
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Redimensionador de la barra lateral
+pdfjs-views-manager-view-selector-button =
+    .title = Vistas
+pdfjs-views-manager-view-selector-button-label = Vistas
+pdfjs-views-manager-pages-title = P谩ginas
+pdfjs-views-manager-outlines-title1 = Esquema del documento
+    .title = Esquema del documento (doble clic para expandir/contraer todos los elementos)
+pdfjs-views-manager-attachments-title = Adjuntos
+pdfjs-views-manager-layers-title1 = Capas
+    .title = Capas (doble clic para restablecer todas las capas a su estado predeterminado)
+pdfjs-views-manager-pages-option-label = P谩ginas
+pdfjs-views-manager-outlines-option-label = Esquema del documento
+pdfjs-views-manager-attachments-option-label = Adjuntos
+pdfjs-views-manager-layers-option-label = Capas
+pdfjs-views-manager-add-file-button =
+    .title = A帽adir archivo
+pdfjs-views-manager-add-file-button-label = A帽adir archivo
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } seleccionado
+       *[other] { $count } seleccionados
+    }
+pdfjs-views-manager-pages-status-none-action-label = Seleccionar p谩ginas
+pdfjs-views-manager-pages-status-action-button-label = Administrar
+pdfjs-views-manager-pages-status-copy-button-label = Copiar
+pdfjs-views-manager-pages-status-cut-button-label = Cortar
+pdfjs-views-manager-pages-status-delete-button-label = Eliminar
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportar selecci贸n鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 p谩gina cortada
+       *[other] { $count } p谩ginas cortadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 p谩gina copiada
+       *[other] { $count } p谩ginas copiadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 p谩gina eliminada
+       *[other] { $count } p谩ginas eliminadas
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Preparando tu archivo鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo archivo鈥�
+pdfjs-views-manager-status-warning-cut-label = No se pudo cortar. Actualiza la p谩gina y vuelve a intentarlo.
+pdfjs-views-manager-status-warning-copy-label = No se pudo copiar. Actualiza la p谩gina y vuelve a intentarlo.
+pdfjs-views-manager-status-warning-delete-label = No se pudo eliminar. Actualiza la p谩gina y vuelve a intentarlo.
+pdfjs-views-manager-status-warning-save-label = No se pudo guardar. Actualiza la p谩gina y vuelve a intentarlo.
+pdfjs-views-manager-status-undo-button-label = Deshacer
+pdfjs-views-manager-status-done-button-label = Hecho
+pdfjs-views-manager-status-close-button =
+    .title = Cerrar
+pdfjs-views-manager-status-close-button-label = Cerrar
+pdfjs-views-manager-paste-button-label = Pegar
+pdfjs-views-manager-paste-button-before =
+    .title = Pegar antes de la primera p谩gina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Pegar despu茅s de la p谩gina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NUEVO
+pdfjs-views-manager-waiting-for-file = Subiendo archivo鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Gestionar p谩ginas
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Eliminar firma guardada
+pdfjs-editor-delete-signature-button-label1 = Eliminar firma guardada
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Editar descripci贸n
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Editar descripci贸n
diff --git a/public/pdfjs/web/locale/es-ES/viewer.ftl b/public/pdfjs/web/locale/es-ES/viewer.ftl
new file mode 100644
index 0000000..5bb2012
--- /dev/null
+++ b/public/pdfjs/web/locale/es-ES/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩gina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = P谩gina siguiente
+pdfjs-next-button-label = Siguiente
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P谩gina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Reducir
+pdfjs-zoom-out-button-label = Reducir
+pdfjs-zoom-in-button =
+    .title = Aumentar
+pdfjs-zoom-in-button-label = Aumentar
+pdfjs-zoom-select =
+    .title = Tama帽o
+pdfjs-presentation-mode-button =
+    .title = Cambiar al modo presentaci贸n
+pdfjs-presentation-mode-button-label = Modo presentaci贸n
+pdfjs-open-file-button =
+    .title = Abrir archivo
+pdfjs-open-file-button-label = Abrir
+pdfjs-print-button =
+    .title = Imprimir
+pdfjs-print-button-label = Imprimir
+pdfjs-save-button =
+    .title = Guardar
+pdfjs-save-button-label = Guardar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Descargar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Descargar
+pdfjs-bookmark-button =
+    .title = P谩gina actual (Ver URL de la p谩gina actual)
+pdfjs-bookmark-button-label = P谩gina actual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Herramientas
+pdfjs-tools-button-label = Herramientas
+pdfjs-first-page-button =
+    .title = Ir a la primera p谩gina
+pdfjs-first-page-button-label = Ir a la primera p谩gina
+pdfjs-last-page-button =
+    .title = Ir a la 煤ltima p谩gina
+pdfjs-last-page-button-label = Ir a la 煤ltima p谩gina
+pdfjs-page-rotate-cw-button =
+    .title = Rotar en sentido horario
+pdfjs-page-rotate-cw-button-label = Rotar en sentido horario
+pdfjs-page-rotate-ccw-button =
+    .title = Rotar en sentido antihorario
+pdfjs-page-rotate-ccw-button-label = Rotar en sentido antihorario
+pdfjs-cursor-text-select-tool-button =
+    .title = Activar herramienta de selecci贸n de texto
+pdfjs-cursor-text-select-tool-button-label = Herramienta de selecci贸n de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Activar herramienta de mano
+pdfjs-cursor-hand-tool-button-label = Herramienta de mano
+pdfjs-scroll-page-button =
+    .title = Usar desplazamiento de p谩gina
+pdfjs-scroll-page-button-label = Desplazamiento de p谩gina
+pdfjs-scroll-vertical-button =
+    .title = Usar desplazamiento vertical
+pdfjs-scroll-vertical-button-label = Desplazamiento vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usar desplazamiento horizontal
+pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Usar desplazamiento en bloque
+pdfjs-scroll-wrapped-button-label = Desplazamiento en bloque
+pdfjs-spread-none-button =
+    .title = No juntar p谩ginas en vista de libro
+pdfjs-spread-none-button-label = Vista de libro
+pdfjs-spread-odd-button =
+    .title = Juntar las p谩ginas partiendo de una con n煤mero impar
+pdfjs-spread-odd-button-label = Vista de libro impar
+pdfjs-spread-even-button =
+    .title = Juntar las p谩ginas partiendo de una con n煤mero par
+pdfjs-spread-even-button-label = Vista de libro par
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiedades del documento鈥�
+pdfjs-document-properties-button-label = Propiedades del documento鈥�
+pdfjs-document-properties-file-name = Nombre de archivo:
+pdfjs-document-properties-file-size = Tama帽o de archivo:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = T铆tulo:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Asunto:
+pdfjs-document-properties-keywords = Palabras clave:
+pdfjs-document-properties-creation-date = Fecha de creaci贸n:
+pdfjs-document-properties-modification-date = Fecha de modificaci贸n:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creador:
+pdfjs-document-properties-producer = Productor PDF:
+pdfjs-document-properties-version = Versi贸n PDF:
+pdfjs-document-properties-page-count = N煤mero de p谩ginas:
+pdfjs-document-properties-page-size = Tama帽o de la p谩gina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = horizontal
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista r谩pida de la web:
+pdfjs-document-properties-linearized-yes = S铆
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Cerrar
+
+## Print
+
+pdfjs-print-progress-message = Preparando documento para impresi贸n鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancelar
+pdfjs-printing-not-supported = Advertencia: Imprimir no est谩 totalmente soportado por este navegador.
+pdfjs-printing-not-ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Cambiar barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)
+pdfjs-toggle-sidebar-button-label = Cambiar barra lateral
+pdfjs-document-outline-button =
+    .title = Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos)
+pdfjs-document-outline-button-label = Resumen de documento
+pdfjs-attachments-button =
+    .title = Mostrar adjuntos
+pdfjs-attachments-button-label = Adjuntos
+pdfjs-layers-button =
+    .title = Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)
+pdfjs-layers-button-label = Capas
+pdfjs-thumbs-button =
+    .title = Mostrar miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Encontrar elemento de esquema actual
+pdfjs-current-outline-item-button-label = Elemento de esquema actual
+pdfjs-findbar-button =
+    .title = Buscar en el documento
+pdfjs-findbar-button-label = Buscar
+pdfjs-additional-layers = Capas adicionales
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura de la p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Seleccionar p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = P谩gina { $page } de { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Buscar
+    .placeholder = Buscar en el documento鈥�
+pdfjs-find-previous-button =
+    .title = Encontrar la anterior aparici贸n de la frase
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button =
+    .title = Encontrar la siguiente aparici贸n de esta frase
+pdfjs-find-next-button-label = Siguiente
+pdfjs-find-highlight-checkbox = Resaltar todos
+pdfjs-find-match-case-checkbox-label = Coincidencia de may煤s./min煤s.
+pdfjs-find-match-diacritics-checkbox-label = Coincidir diacr铆ticos
+pdfjs-find-entire-word-checkbox-label = Palabras completas
+pdfjs-find-reached-top = Se alcanz贸 el inicio del documento, se contin煤a desde el final
+pdfjs-find-reached-bottom = Se alcanz贸 el final del documento, se contin煤a desde el inicio
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } de { $total } coincidencia
+       *[other] { $current } de { $total } coincidencias
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] M谩s de { $limit } coincidencia
+       *[other] M谩s de { $limit } coincidencias
+    }
+pdfjs-find-not-found = Frase no encontrada
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Anchura de la p谩gina
+pdfjs-page-scale-fit = Ajuste de la p谩gina
+pdfjs-page-scale-auto = Tama帽o autom谩tico
+pdfjs-page-scale-actual = Tama帽o real
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P谩gina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ocurri贸 un error al cargar el PDF.
+pdfjs-invalid-file-error = Fichero PDF no v谩lido o corrupto.
+pdfjs-missing-file-error = No hay fichero PDF.
+pdfjs-unexpected-response-error = Respuesta inesperada del servidor.
+pdfjs-rendering-error = Ocurri贸 un error al renderizar la p谩gina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotaci贸n { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Introduzca la contrase帽a para abrir este archivo PDF.
+pdfjs-password-invalid = Contrase帽a no v谩lida. Vuelva a intentarlo.
+pdfjs-password-ok-button = Aceptar
+pdfjs-password-cancel-button = Cancelar
+pdfjs-web-fonts-disabled = Las tipograf铆as web est谩n desactivadas: es imposible usar las tipograf铆as PDF embebidas.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texto
+pdfjs-editor-color-picker-free-text-input =
+    .title = Cambiar el color del texto
+pdfjs-editor-free-text-button-label = Texto
+pdfjs-editor-ink-button =
+    .title = Dibujar
+pdfjs-editor-color-picker-ink-input =
+    .title = Cambiar el color del dibujo
+pdfjs-editor-ink-button-label = Dibujar
+pdfjs-editor-stamp-button =
+    .title = A帽adir o editar im谩genes
+pdfjs-editor-stamp-button-label = A帽adir o editar im谩genes
+pdfjs-editor-highlight-button =
+    .title = Resaltar
+pdfjs-editor-highlight-button-label = Resaltar
+pdfjs-highlight-floating-button1 =
+    .title = Resaltar
+    .aria-label = Resaltar
+pdfjs-highlight-floating-button-label = Resaltar
+pdfjs-comment-floating-button =
+    .title = Comentario
+    .aria-label = Comentario
+pdfjs-comment-floating-button-label = Comentario
+pdfjs-editor-comment-button =
+    .title = Comentario
+    .aria-label = Comentario
+pdfjs-editor-comment-button-label = Comentario
+pdfjs-editor-signature-button =
+    .title = A帽adir firma
+pdfjs-editor-signature-button-label = A帽adir firma
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de resaltado
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de dibujos
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de firmas: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de im谩genes
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Eliminar dibujo
+pdfjs-editor-remove-freetext-button =
+    .title = Eliminar texto
+pdfjs-editor-remove-stamp-button =
+    .title = Eliminar imagen
+pdfjs-editor-remove-highlight-button =
+    .title = Quitar resaltado
+pdfjs-editor-remove-signature-button =
+    .title = Eliminar firma
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Color
+pdfjs-editor-free-text-size-input = Tama帽o
+pdfjs-editor-ink-color-input = Color
+pdfjs-editor-ink-thickness-input = Grosor
+pdfjs-editor-ink-opacity-input = Opacidad
+pdfjs-editor-stamp-add-image-button =
+    .title = A帽adir imagen
+pdfjs-editor-stamp-add-image-button-label = A帽adir imagen
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Grosor
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Cambiar el grosor al resaltar elementos que no sean texto
+pdfjs-editor-add-signature-container =
+    .aria-label = Controles de firma y firmas guardadas
+pdfjs-editor-signature-add-signature-button =
+    .title = A帽adir nueva firma
+pdfjs-editor-signature-add-signature-button-label = A帽adir nueva firma
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Firma guardada: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de texto
+    .default-content = Empiece a escribir鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Comentario
+       *[other] Comentarios
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Cerrar la barra lateral
+    .aria-label = Cerrar la barra lateral
+pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 驴Ve algo interesante? Res谩ltelo y deje un comentario.
+pdfjs-editor-comments-sidebar-no-comments-link = Saber m谩s
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texto alternativo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editar el texto alternativo
+pdfjs-editor-alt-text-dialog-label = Eligir una opci贸n
+pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga.
+pdfjs-editor-alt-text-add-description-label = A帽adir una descripci贸n
+pdfjs-editor-alt-text-add-description-description = Intente escribir 1 o 2 frases que describan el tema, el entorno o las acciones.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa
+pdfjs-editor-alt-text-mark-decorative-description = Se utiliza para im谩genes ornamentales, como bordes o marcas de agua.
+pdfjs-editor-alt-text-cancel-button = Cancelar
+pdfjs-editor-alt-text-save-button = Guardar
+pdfjs-editor-alt-text-decorative-tooltip = Marcada como decorativa
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Por ejemplo: 鈥淯n joven se sienta a la mesa a comer鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texto alternativo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Esquina superior izquierda 鈥� redimensionar
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Borde superior en el medio 鈥� redimensionar
+pdfjs-editor-resizer-top-right =
+    .aria-label = Esquina superior derecha 鈥� redimensionar
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Borde derecho en el medio 鈥� redimensionar
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Esquina inferior derecha 鈥� redimensionar
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Borde inferior en el medio 鈥� redimensionar
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Esquina inferior izquierda 鈥� redimensionar
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Borde izquierdo en el medio 鈥� redimensionar
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Color de resaltado
+pdfjs-editor-colorpicker-button =
+    .title = Cambiar color
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Opciones de color
+pdfjs-editor-colorpicker-yellow =
+    .title = Amarillo
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Azul
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Rojo
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mostrar todo
+pdfjs-editor-highlight-show-all-button =
+    .title = Mostrar todo
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripci贸n de la imagen)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = A帽adir texto alternativo (descripci贸n de la imagen)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Escribir la descripci贸n aqu铆鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Breve descripci贸n para las personas que no pueden ver la imagen o cuando la imagen no se carga.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado autom谩ticamente y puede ser inexacto.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber m谩s
+pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo autom谩ticamente
+pdfjs-editor-new-alt-text-not-now-button = Ahora no
+pdfjs-editor-new-alt-text-error-title = No se ha podido crear el texto alternativo autom谩ticamente
+pdfjs-editor-new-alt-text-error-description = Escriba su propio texto alternativo o int茅ntelo de nuevo m谩s tarde.
+pdfjs-editor-new-alt-text-error-close-button = Cerrar
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Se a帽adi贸 el texto alternativo
+pdfjs-editor-new-alt-text-added-button-label = Se a帽adi贸 el texto alternativo
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Falta el texto alternativo
+pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Revisar el texto alternativo
+pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado autom谩ticamente: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Ajustes del texto alternativo de la imagen
+pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen
+pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen
+pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo autom谩tico
+pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo autom谩ticamente
+pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo autom谩tico.
+pdfjs-editor-alt-text-settings-delete-model-button = Eliminar
+pdfjs-editor-alt-text-settings-download-model-button = Descargar
+pdfjs-editor-alt-text-settings-downloading-model-button = Descargando鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al a帽adir una imagen
+pdfjs-editor-alt-text-settings-show-dialog-description = Le ayuda a asegurarse de que todas sus im谩genes tengan texto alternativo.
+pdfjs-editor-alt-text-settings-close-button = Cerrar
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Resaltado a帽adido
+pdfjs-editor-freetext-added-alert = Texto a帽adido
+pdfjs-editor-ink-added-alert = Dibujo a帽adido
+pdfjs-editor-stamp-added-alert = Imagen a帽adida
+pdfjs-editor-signature-added-alert = Firma a帽adida
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado
+pdfjs-editor-undo-bar-message-freetext = Texto eliminado
+pdfjs-editor-undo-bar-message-ink = Dibujo eliminado
+pdfjs-editor-undo-bar-message-stamp = Imagen eliminada
+pdfjs-editor-undo-bar-message-signature = Firma eliminada
+pdfjs-editor-undo-bar-message-comment = Comentario eliminado
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anotaci贸n eliminada
+       *[other] { $count } anotaciones eliminadas
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Deshacer
+pdfjs-editor-undo-bar-undo-button-label = Deshacer
+pdfjs-editor-undo-bar-close-button =
+    .title = Cerrar
+pdfjs-editor-undo-bar-close-button-label = Cerrar
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para a帽adirla a un documento PDF. El usuario puede editar el nombre (que tambi茅n sirve como texto alternativo) y, opcionalmente, guardar la firma para usarla nuevamente.
+pdfjs-editor-add-signature-dialog-title = A帽adir una firma
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Escribir
+    .title = Escribir
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Dibujar
+    .title = Dibujar
+pdfjs-editor-add-signature-image-button = Imagen
+    .title = Imagen
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Escriba su firma
+    .placeholder = Escriba su firma
+pdfjs-editor-add-signature-draw-placeholder = Dibuje su firma
+pdfjs-editor-add-signature-draw-thickness-range-label = Grosor
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Grosor del dibujo: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Arrastre un archivo aqu铆 para cargarlo
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] O seleccione archivos de im谩genes
+       *[other] O seleccione archivos de im谩genes
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descripci贸n (texto alternativo)
+pdfjs-editor-add-signature-description-input =
+    .title = Descripci贸n (texto alternativo)
+pdfjs-editor-add-signature-description-default-when-drawing = Firma
+pdfjs-editor-add-signature-clear-button-label = Borrar firma
+pdfjs-editor-add-signature-clear-button =
+    .title = Borrar firma
+pdfjs-editor-add-signature-save-checkbox = Guardar firma
+pdfjs-editor-add-signature-save-warning-message = Ha alcanzado el l铆mite de 5 firmas guardadas. Elimine una para guardar m谩s.
+pdfjs-editor-add-signature-image-upload-error-title = No se ha podido subir la imagen
+pdfjs-editor-add-signature-image-upload-error-description = Compruebe su conexi贸n de red o pruebe con otra imagen.
+pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma
+pdfjs-editor-add-signature-image-no-data-error-description = Por favor, intente cargar una imagen diferente.
+pdfjs-editor-add-signature-error-close-button = Cerrar
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancelar
+pdfjs-editor-add-signature-add-button = A帽adir
+pdfjs-editor-edit-signature-update-button = Actualizar
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Editar comentario
+pdfjs-editor-edit-comment-popup-button =
+    .title = Editar comentario
+pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario
+pdfjs-editor-delete-comment-popup-button =
+    .title = Eliminar comentario
+pdfjs-show-comment-button =
+    .title = Mostrar comentario
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = A帽adir comentario
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = A帽adir
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Empezar a escribir鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = A帽adir comentario
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Alternar barra lateral (el documento contiene miniaturas/esquemas/adjuntos/capas)
+pdfjs-toggle-views-manager-button1-label = Administrar p谩ginas
+pdfjs-views-manager-sidebar =
+    .aria-label = Barra lateral
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Redimensionador de la barra lateral
+pdfjs-views-manager-view-selector-button =
+    .title = Vistas
+pdfjs-views-manager-view-selector-button-label = Vistas
+pdfjs-views-manager-pages-title = P谩ginas
+pdfjs-views-manager-outlines-title1 = Esquema del documento
+    .title = Esquema del documento (doble-clic para expandir/contraer todos los elementos)
+pdfjs-views-manager-attachments-title = Adjuntos
+pdfjs-views-manager-layers-title1 = Capas
+    .title = Capas (doble clic para restablecer todas las capas a su estado predeterminado)
+pdfjs-views-manager-pages-option-label = P谩ginas
+pdfjs-views-manager-outlines-option-label = Esquema del documento
+pdfjs-views-manager-attachments-option-label = Adjuntos
+pdfjs-views-manager-layers-option-label = Capas
+pdfjs-views-manager-add-file-button =
+    .title = A帽adir archivo
+pdfjs-views-manager-add-file-button-label = A帽adir archivo
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } seleccionado
+       *[other] { $count } seleccionados
+    }
+pdfjs-views-manager-pages-status-none-action-label = Seleccionar p谩ginas
+pdfjs-views-manager-pages-status-action-button-label = Administrar
+pdfjs-views-manager-pages-status-copy-button-label = Copiar
+pdfjs-views-manager-pages-status-cut-button-label = Cortar
+pdfjs-views-manager-pages-status-delete-button-label = Eliminar
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportar selecci贸n鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 p谩gina cortada
+       *[other] { $count } p谩ginas cortadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 p谩gina copiada
+       *[other] { $count } p谩ginas cortadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 p谩gina eliminada
+       *[other] { $count } p谩ginas eliminadas
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Preparando su archivo鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo el archivo鈥�
+pdfjs-views-manager-status-warning-cut-label = No se pudo cortar. Refresque la p谩gina y pruebe de nuevo.
+pdfjs-views-manager-status-warning-copy-label = No se pudo copiar. Refresque la p谩gina y pruebe de nuevo.
+pdfjs-views-manager-status-warning-delete-label = No se pudo cortar. Refresque la p谩gina y pruebe de nuevo.
+pdfjs-views-manager-status-warning-save-label = No se pudo cortar. Refresque la p谩gina y pruebe de nuevo.
+pdfjs-views-manager-status-undo-button-label = Deshacer
+pdfjs-views-manager-status-done-button-label = Hecho
+pdfjs-views-manager-status-close-button =
+    .title = Cerrar
+pdfjs-views-manager-status-close-button-label = Cerrar
+pdfjs-views-manager-paste-button-label = Pegar
+pdfjs-views-manager-paste-button-before =
+    .title = Pegar antes de la primera p谩gina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Pegar despu茅s de la p谩gina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NUEVO
+pdfjs-views-manager-waiting-for-file = Subiendo el archivo鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Administrar p谩ginas
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Eliminar firma guardada
+pdfjs-editor-delete-signature-button-label1 = Eliminar firma guardada
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Editar descripci贸n
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Editar descripci贸n
diff --git a/public/pdfjs/web/locale/es-MX/viewer.ftl b/public/pdfjs/web/locale/es-MX/viewer.ftl
new file mode 100644
index 0000000..7d496bc
--- /dev/null
+++ b/public/pdfjs/web/locale/es-MX/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩gina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = P谩gina siguiente
+pdfjs-next-button-label = Siguiente
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P谩gina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Reducir
+pdfjs-zoom-out-button-label = Reducir
+pdfjs-zoom-in-button =
+    .title = Aumentar
+pdfjs-zoom-in-button-label = Aumentar
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Cambiar al modo presentaci贸n
+pdfjs-presentation-mode-button-label = Modo presentaci贸n
+pdfjs-open-file-button =
+    .title = Abrir archivo
+pdfjs-open-file-button-label = Abrir
+pdfjs-print-button =
+    .title = Imprimir
+pdfjs-print-button-label = Imprimir
+pdfjs-save-button =
+    .title = Guardar
+pdfjs-save-button-label = Guardar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Descargar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Descargar
+pdfjs-bookmark-button =
+    .title = P谩gina actual (Ver URL de la p谩gina actual)
+pdfjs-bookmark-button-label = P谩gina actual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Herramientas
+pdfjs-tools-button-label = Herramientas
+pdfjs-first-page-button =
+    .title = Ir a la primera p谩gina
+pdfjs-first-page-button-label = Ir a la primera p谩gina
+pdfjs-last-page-button =
+    .title = Ir a la 煤ltima p谩gina
+pdfjs-last-page-button-label = Ir a la 煤ltima p谩gina
+pdfjs-page-rotate-cw-button =
+    .title = Girar a la derecha
+pdfjs-page-rotate-cw-button-label = Girar a la derecha
+pdfjs-page-rotate-ccw-button =
+    .title = Girar a la izquierda
+pdfjs-page-rotate-ccw-button-label = Girar a la izquierda
+pdfjs-cursor-text-select-tool-button =
+    .title = Activar la herramienta de selecci贸n de texto
+pdfjs-cursor-text-select-tool-button-label = Herramienta de selecci贸n de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Activar la herramienta de mano
+pdfjs-cursor-hand-tool-button-label = Herramienta de mano
+pdfjs-scroll-page-button =
+    .title = Usar desplazamiento de p谩gina
+pdfjs-scroll-page-button-label = Desplazamiento de p谩gina
+pdfjs-scroll-vertical-button =
+    .title = Usar desplazamiento vertical
+pdfjs-scroll-vertical-button-label = Desplazamiento vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usar desplazamiento horizontal
+pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Usar desplazamiento encapsulado
+pdfjs-scroll-wrapped-button-label = Desplazamiento encapsulado
+pdfjs-spread-none-button =
+    .title = No unir p谩ginas separadas
+pdfjs-spread-none-button-label = Vista de una p谩gina
+pdfjs-spread-odd-button =
+    .title = Unir las p谩ginas partiendo con una de n煤mero impar
+pdfjs-spread-odd-button-label = Vista de libro impar
+pdfjs-spread-even-button =
+    .title = Juntar las p谩ginas partiendo con una de n煤mero par
+pdfjs-spread-even-button-label = Vista de libro par
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiedades del documento鈥�
+pdfjs-document-properties-button-label = Propiedades del documento鈥�
+pdfjs-document-properties-file-name = Nombre del archivo:
+pdfjs-document-properties-file-size = Tama帽o del archivo:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = T铆tulo:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Asunto:
+pdfjs-document-properties-keywords = Palabras claves:
+pdfjs-document-properties-creation-date = Fecha de creaci贸n:
+pdfjs-document-properties-modification-date = Fecha de modificaci贸n:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creador:
+pdfjs-document-properties-producer = Productor PDF:
+pdfjs-document-properties-version = Versi贸n PDF:
+pdfjs-document-properties-page-count = N煤mero de p谩ginas:
+pdfjs-document-properties-page-size = Tama帽o de la p谩gina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = horizontal
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Oficio
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista r谩pida de la web:
+pdfjs-document-properties-linearized-yes = S铆
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Cerrar
+
+## Print
+
+pdfjs-print-progress-message = Preparando documento para impresi贸n鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancelar
+pdfjs-printing-not-supported = Advertencia: La impresi贸n no esta completamente soportada por este navegador.
+pdfjs-printing-not-ready = Advertencia: El PDF no cargo completamente para impresi贸n.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Cambiar barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Alternar barra lateral (el documento contiene esquemas/adjuntos/capas)
+pdfjs-toggle-sidebar-button-label = Cambiar barra lateral
+pdfjs-document-outline-button =
+    .title = Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)
+pdfjs-document-outline-button-label = Esquema del documento
+pdfjs-attachments-button =
+    .title = Mostrar adjuntos
+pdfjs-attachments-button-label = Adjuntos
+pdfjs-layers-button =
+    .title = Mostrar capas (doble clic para restablecer todas las capas al estado predeterminado)
+pdfjs-layers-button-label = Capas
+pdfjs-thumbs-button =
+    .title = Mostrar miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Buscar elemento de esquema actual
+pdfjs-current-outline-item-button-label = Elemento de esquema actual
+pdfjs-findbar-button =
+    .title = Buscar en el documento
+pdfjs-findbar-button-label = Buscar
+pdfjs-additional-layers = Capas adicionales
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura de la p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Seleccionar p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = P谩gina { $page } de { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Buscar
+    .placeholder = Buscar en el documento鈥�
+pdfjs-find-previous-button =
+    .title = Ir a la anterior frase encontrada
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button =
+    .title = Ir a la siguiente frase encontrada
+pdfjs-find-next-button-label = Siguiente
+pdfjs-find-highlight-checkbox = Resaltar todo
+pdfjs-find-match-case-checkbox-label = Coincidir con may煤sculas y min煤sculas
+pdfjs-find-match-diacritics-checkbox-label = Coincidir diacr铆ticos
+pdfjs-find-entire-word-checkbox-label = Palabras completas
+pdfjs-find-reached-top = Se alcanz贸 el inicio del documento, se buscar谩 al final
+pdfjs-find-reached-bottom = Se alcanz贸 el final del documento, se buscar谩 al inicio
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } de { $total } coincidencia
+       *[other] { $current } de { $total } coincidencias
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] M谩s de { $limit } coincidencia
+       *[other] M谩s de { $limit } coincidencias
+    }
+pdfjs-find-not-found = No se encontr贸 la frase
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Ancho de p谩gina
+pdfjs-page-scale-fit = Ajustar p谩gina
+pdfjs-page-scale-auto = Zoom autom谩tico
+pdfjs-page-scale-actual = Tama帽o real
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P谩gina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Un error ocurri贸 al cargar el PDF.
+pdfjs-invalid-file-error = Archivo PDF invalido o da帽ado.
+pdfjs-missing-file-error = Archivo PDF no encontrado.
+pdfjs-unexpected-response-error = Respuesta inesperada del servidor.
+pdfjs-rendering-error = Un error ocurri贸 al renderizar la p谩gina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } anotaci贸n]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Ingresa la contrase帽a para abrir este archivo PDF.
+pdfjs-password-invalid = Contrase帽a inv谩lida. Por favor intenta de nuevo.
+pdfjs-password-ok-button = Aceptar
+pdfjs-password-cancel-button = Cancelar
+pdfjs-web-fonts-disabled = Las fuentes web est谩n desactivadas: es imposible usar las fuentes PDF embebidas.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texto
+pdfjs-editor-color-picker-free-text-input =
+    .title = Cambiar el color del texto
+pdfjs-editor-free-text-button-label = Texto
+pdfjs-editor-ink-button =
+    .title = Dibujar
+pdfjs-editor-color-picker-ink-input =
+    .title = Cambiar el color del dibujo
+pdfjs-editor-ink-button-label = Dibujar
+pdfjs-editor-stamp-button =
+    .title = Agregar o editar im谩genes
+pdfjs-editor-stamp-button-label = Agregar o editar im谩genes
+pdfjs-editor-highlight-button =
+    .title = Destacar
+pdfjs-editor-highlight-button-label = Destacar
+pdfjs-highlight-floating-button1 =
+    .title = Destacados
+    .aria-label = Destacados
+pdfjs-highlight-floating-button-label = Destacados
+pdfjs-comment-floating-button =
+    .title = Comentario
+    .aria-label = Comentario
+pdfjs-comment-floating-button-label = Comentario
+pdfjs-editor-comment-button =
+    .title = Comentario
+    .aria-label = Comentario
+pdfjs-editor-comment-button-label = Comentario
+pdfjs-editor-signature-button =
+    .title = Agregar firma
+pdfjs-editor-signature-button-label = A帽adir firma
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de destacados
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de dibujos
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de firmas: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de im谩genes
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Eliminar dibujo
+pdfjs-editor-remove-freetext-button =
+    .title = Eliminar texto
+pdfjs-editor-remove-stamp-button =
+    .title = Eliminar imagen
+pdfjs-editor-remove-highlight-button =
+    .title = Eliminar destacado
+pdfjs-editor-remove-signature-button =
+    .title = Eliminar firma
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Color
+pdfjs-editor-free-text-size-input = Tama帽o
+pdfjs-editor-ink-color-input = Color
+pdfjs-editor-ink-thickness-input = Grossor
+pdfjs-editor-ink-opacity-input = Opacidad
+pdfjs-editor-stamp-add-image-button =
+    .title = Agregar imagen
+pdfjs-editor-stamp-add-image-button-label = Agregar imagen
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Espesor
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Cambiar el grosor al resaltar elementos que no sean texto
+pdfjs-editor-add-signature-container =
+    .aria-label = Controles de firma y firmas guardadas
+pdfjs-editor-signature-add-signature-button =
+    .title = Agregar nueva firma
+pdfjs-editor-signature-add-signature-button-label = Agregar nueva firma
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Firma guardada: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de texto
+    .default-content = Comenzar a escribir鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Comentario
+       *[other] Comentarios
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Cerrar la barra lateral
+    .aria-label = Cerrar la barra lateral
+pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 驴Ves algo interesante? Res谩ltalo y deja un comentario.
+pdfjs-editor-comments-sidebar-no-comments-link = Saber m谩s
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texto alternativo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editar texto alternativo
+pdfjs-editor-alt-text-dialog-label = Elige una opci贸n
+pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga.
+pdfjs-editor-alt-text-add-description-label = A帽adir una descripci贸n
+pdfjs-editor-alt-text-add-description-description = Intente escribir 1 o 2 oraciones que describan el tema, el entorno o las acciones.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativo
+pdfjs-editor-alt-text-mark-decorative-description = Se utiliza para im谩genes ornamentales, como bordes o marcas de agua.
+pdfjs-editor-alt-text-cancel-button = Cancelar
+pdfjs-editor-alt-text-save-button = Guardar
+pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativo
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Por ejemplo: 鈥淯n joven se sienta a la mesa a comer鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texto alternativo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Esquina superior izquierda 鈥� redimensionar
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Borde superior en el medio 鈥� redimensionar
+pdfjs-editor-resizer-top-right =
+    .aria-label = Esquina superior derecha 鈥� redimensionar
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Borde derecho en el medio 鈥� redimensionar
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Esquina inferior derecha 鈥� redimensionar
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Borde inferior en el medio 鈥� redimensionar
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Esquina inferior izquierda 鈥� redimensionar
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Borde izquierdo en el medio 鈥� redimensionar
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Color de resaltado
+pdfjs-editor-colorpicker-button =
+    .title = Cambiar color
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Opciones de color
+pdfjs-editor-colorpicker-yellow =
+    .title = Amarillo
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Azul
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Rojo
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mostrar todo
+pdfjs-editor-highlight-show-all-button =
+    .title = Mostrar todo
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripci贸n de la imagen)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Agregar texto alternativo (descripci贸n de la imagen)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Escribe tu descripci贸n aqu铆鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Breve descripci贸n para las personas que no pueden ver la imagen o cuando la imagen no se carga.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado autom谩ticamente y puede ser inexacto.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber m谩s
+pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo autom谩ticamente
+pdfjs-editor-new-alt-text-not-now-button = Ahora no
+pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo autom谩ticamente
+pdfjs-editor-new-alt-text-error-description = Escribe tu propio texto alternativo o int茅ntalo de nuevo m谩s tarde.
+pdfjs-editor-new-alt-text-error-close-button = Cerrar
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Se agreg贸 el texto alternativo
+pdfjs-editor-new-alt-text-added-button-label = Se agreg贸 el texto alternativo
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Falta el texto alternativo
+pdfjs-editor-new-alt-text-missing-button-label = Falta texto alternativo
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Revisar el texto alternativo
+pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado autom谩ticamente: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Ajustes del texto alternativo de la imagen
+pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen
+pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen
+pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo autom谩tico
+pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo autom谩ticamente
+pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo autom谩tico.
+pdfjs-editor-alt-text-settings-delete-model-button = Eliminar
+pdfjs-editor-alt-text-settings-download-model-button = Descargar
+pdfjs-editor-alt-text-settings-downloading-model-button = Descargando鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al a帽adir una imagen
+pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarte de que todas tus im谩genes tengan texto alternativo.
+pdfjs-editor-alt-text-settings-close-button = Cerrar
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Destacado a帽adido
+pdfjs-editor-freetext-added-alert = Texto agregado
+pdfjs-editor-ink-added-alert = Dibujo agregado
+pdfjs-editor-stamp-added-alert = Imagen agregada
+pdfjs-editor-signature-added-alert = Firma agregada
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado
+pdfjs-editor-undo-bar-message-freetext = Texto eliminado
+pdfjs-editor-undo-bar-message-ink = Dibujo eliminado
+pdfjs-editor-undo-bar-message-stamp = Imagen eliminada
+pdfjs-editor-undo-bar-message-signature = Firma eliminada
+pdfjs-editor-undo-bar-message-comment = Comentario eliminado
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anotaci贸n eliminada
+       *[other] { $count } anotaciones eliminadas
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Deshacer
+pdfjs-editor-undo-bar-undo-button-label = Deshacer
+pdfjs-editor-undo-bar-close-button =
+    .title = Cerrar
+pdfjs-editor-undo-bar-close-button-label = Cerrar
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para a帽adirla a un documento PDF. El usuario puede editar el nombre (que tambi茅n sirve como texto alternativo) y, opcionalmente, guardar la firma para utilizarla en otras ocasiones.
+pdfjs-editor-add-signature-dialog-title = Agregar una firma
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Tipo
+    .title = Tipo
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Dibujar
+    .title = Dibujar
+pdfjs-editor-add-signature-image-button = Imagen
+    .title = Imagen
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Escribe tu firma
+    .placeholder = Escribe tu firma
+pdfjs-editor-add-signature-draw-placeholder = Dibuja tu firma
+pdfjs-editor-add-signature-draw-thickness-range-label = Grossor
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Grosor del dibujo: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Arrastra un archivo aqu铆 para cargarlo
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] O elegir archivos de imagen
+       *[other] O buscar archivos de imagen
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descripci贸n (texto alternativo)
+pdfjs-editor-add-signature-description-input =
+    .title = Descripci贸n (texto alternativo)
+pdfjs-editor-add-signature-description-default-when-drawing = Firma
+pdfjs-editor-add-signature-clear-button-label = Limpiar firma
+pdfjs-editor-add-signature-clear-button =
+    .title = Limpiar firma
+pdfjs-editor-add-signature-save-checkbox = Guardar firma
+pdfjs-editor-add-signature-save-warning-message = Has alcanzado el l铆mite de 5 firmas guardadas. Elimina una para guardar m谩s.
+pdfjs-editor-add-signature-image-upload-error-title = No se pudo cargar la imagen
+pdfjs-editor-add-signature-image-upload-error-description = Verifica tu conexi贸n de red o prueba con otra imagen.
+pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma
+pdfjs-editor-add-signature-image-no-data-error-description = Intenta cargar una imagen diferente.
+pdfjs-editor-add-signature-error-close-button = Cerrar
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancelar
+pdfjs-editor-add-signature-add-button = Agregar
+pdfjs-editor-edit-signature-update-button = Actualizar
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Editar comentario
+pdfjs-editor-edit-comment-popup-button =
+    .title = Editar comentario
+pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario
+pdfjs-editor-delete-comment-popup-button =
+    .title = Eliminar comentario
+pdfjs-show-comment-button =
+    .title = Mostrar comentario
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Agregar comentario
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Agregar
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Empieza a escribir鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = A帽adir comentario
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Cambiar barra lateral (铆ndice de contenidos del documento/miniaturas/adjuntos/capas)
+pdfjs-toggle-views-manager-button1-label = Administrar p谩ginas
+pdfjs-views-manager-sidebar =
+    .aria-label = Barra lateral
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Cambiar tama帽o de la barra lateral
+pdfjs-views-manager-view-selector-button =
+    .title = Vistas
+pdfjs-views-manager-view-selector-button-label = Vistas
+pdfjs-views-manager-pages-title = P谩ginas
+pdfjs-views-manager-outlines-title1 = Esquema del documento
+    .title = Esquema del documento (haz doble clic para expandir/contraer todos los elementos)
+pdfjs-views-manager-attachments-title = Adjuntos
+pdfjs-views-manager-layers-title1 = Capas
+    .title = Capas (haz doble clic para restablecer todas las capas a su estado predeterminado)
+pdfjs-views-manager-pages-option-label = P谩ginas
+pdfjs-views-manager-outlines-option-label = Esquema del documento
+pdfjs-views-manager-attachments-option-label = Adjuntos
+pdfjs-views-manager-layers-option-label = Capas
+pdfjs-views-manager-add-file-button =
+    .title = Agregar archivo
+pdfjs-views-manager-add-file-button-label = Agregar archivo
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } seleccionado
+       *[other] { $count } seleccionados
+    }
+pdfjs-views-manager-pages-status-none-action-label = Seleccionar p谩ginas
+pdfjs-views-manager-pages-status-action-button-label = Administrar
+pdfjs-views-manager-pages-status-copy-button-label = Copiar
+pdfjs-views-manager-pages-status-cut-button-label = Cortar
+pdfjs-views-manager-pages-status-delete-button-label = Eliminar
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportar seleccionado鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 p谩gina cortada
+       *[other] { $count } p谩ginas cortadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 pagina copiada
+       *[other] { $count } paginas copiadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 pagina eliminada
+       *[other] { $count } paginas eliminadas
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Preparando tu archivo鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo archivo鈥�
+pdfjs-views-manager-status-warning-cut-label = No se pudo cortar. Actualiza la p谩gina y vuelve a intentarlo.
+pdfjs-views-manager-status-warning-copy-label = No se pudo pegar. Actualiza la p谩gina y vuelve a intentarlo.
+pdfjs-views-manager-status-warning-delete-label = No se pudo eliminar. Actualiza la p谩gina y vuelve a intentarlo.
+pdfjs-views-manager-status-warning-save-label = No se pudo guardar. Actualiza la p谩gina y vuelve a intentarlo.
+pdfjs-views-manager-status-undo-button-label = Deshacer
+pdfjs-views-manager-status-done-button-label = Hecho
+pdfjs-views-manager-status-close-button =
+    .title = Cerrar
+pdfjs-views-manager-status-close-button-label = Cerrar
+pdfjs-views-manager-paste-button-label = Pegar
+pdfjs-views-manager-paste-button-before =
+    .title = Pegar antes de la primera p谩gina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Pegar despu茅s de la p谩gina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NUEVO
+pdfjs-views-manager-waiting-for-file = Subiendo archivo鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Administrar p谩ginas
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Eliminar la firma guardada
+pdfjs-editor-delete-signature-button-label1 = Eliminar la firma guardada
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Editar descripci贸n
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Editar descripci贸n
diff --git a/public/pdfjs/web/locale/et/viewer.ftl b/public/pdfjs/web/locale/et/viewer.ftl
new file mode 100644
index 0000000..e0212b7
--- /dev/null
+++ b/public/pdfjs/web/locale/et/viewer.ftl
@@ -0,0 +1,246 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Eelmine lehek眉lg
+pdfjs-previous-button-label = Eelmine
+pdfjs-next-button =
+    .title = J盲rgmine lehek眉lg
+pdfjs-next-button-label = J盲rgmine
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Leht
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = / { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber }/{ $pagesCount })
+pdfjs-zoom-out-button =
+    .title = V盲henda
+pdfjs-zoom-out-button-label = V盲henda
+pdfjs-zoom-in-button =
+    .title = Suurenda
+pdfjs-zoom-in-button-label = Suurenda
+pdfjs-zoom-select =
+    .title = Suurendamine
+pdfjs-presentation-mode-button =
+    .title = L眉litu esitlusre啪iimi
+pdfjs-presentation-mode-button-label = Esitlusre啪iim
+pdfjs-open-file-button =
+    .title = Ava fail
+pdfjs-open-file-button-label = Ava
+pdfjs-print-button =
+    .title = Prindi
+pdfjs-print-button-label = Prindi
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = T枚枚riistad
+pdfjs-tools-button-label = T枚枚riistad
+pdfjs-first-page-button =
+    .title = Mine esimesele lehek眉ljele
+pdfjs-first-page-button-label = Mine esimesele lehek眉ljele
+pdfjs-last-page-button =
+    .title = Mine viimasele lehek眉ljele
+pdfjs-last-page-button-label = Mine viimasele lehek眉ljele
+pdfjs-page-rotate-cw-button =
+    .title = P枚枚ra p盲rip盲eva
+pdfjs-page-rotate-cw-button-label = P枚枚ra p盲rip盲eva
+pdfjs-page-rotate-ccw-button =
+    .title = P枚枚ra vastup盲eva
+pdfjs-page-rotate-ccw-button-label = P枚枚ra vastup盲eva
+pdfjs-cursor-text-select-tool-button =
+    .title = Luba teksti valimise t枚枚riist
+pdfjs-cursor-text-select-tool-button-label = Teksti valimise t枚枚riist
+pdfjs-cursor-hand-tool-button =
+    .title = Luba sirvimist枚枚riist
+pdfjs-cursor-hand-tool-button-label = Sirvimist枚枚riist
+pdfjs-scroll-page-button =
+    .title = Kasutatakse lehe kaupa kerimist
+pdfjs-scroll-page-button-label = Lehe kaupa kerimine
+pdfjs-scroll-vertical-button =
+    .title = Kasuta vertikaalset kerimist
+pdfjs-scroll-vertical-button-label = Vertikaalne kerimine
+pdfjs-scroll-horizontal-button =
+    .title = Kasuta horisontaalset kerimist
+pdfjs-scroll-horizontal-button-label = Horisontaalne kerimine
+pdfjs-scroll-wrapped-button =
+    .title = Kasuta rohkem mahutavat kerimist
+pdfjs-scroll-wrapped-button-label = Rohkem mahutav kerimine
+pdfjs-spread-none-button =
+    .title = 脛ra k玫rvuta lehek眉lgi
+pdfjs-spread-none-button-label = Lehtede k玫rvutamine puudub
+pdfjs-spread-odd-button =
+    .title = K玫rvuta lehek眉ljed, alustades paaritute numbritega lehek眉lgedega
+pdfjs-spread-odd-button-label = K玫rvutamine paaritute numbritega alustades
+pdfjs-spread-even-button =
+    .title = K玫rvuta lehek眉ljed, alustades paarisnumbritega lehek眉lgedega
+pdfjs-spread-even-button-label = K玫rvutamine paarisnumbritega alustades
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumendi omadused鈥�
+pdfjs-document-properties-button-label = Dokumendi omadused鈥�
+pdfjs-document-properties-file-name = Faili nimi:
+pdfjs-document-properties-file-size = Faili suurus:
+pdfjs-document-properties-title = Pealkiri:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Teema:
+pdfjs-document-properties-keywords = M盲rks玫nad:
+pdfjs-document-properties-creation-date = Loodud:
+pdfjs-document-properties-modification-date = Muudetud:
+pdfjs-document-properties-creator = Looja:
+pdfjs-document-properties-producer = Generaator:
+pdfjs-document-properties-version = Generaatori versioon:
+pdfjs-document-properties-page-count = Lehek眉lgi:
+pdfjs-document-properties-page-size = Lehe suurus:
+pdfjs-document-properties-page-size-unit-inches = tolli
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertikaalpaigutus
+pdfjs-document-properties-page-size-orientation-landscape = r玫htpaigutus
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = "Fast Web View" tugi:
+pdfjs-document-properties-linearized-yes = Jah
+pdfjs-document-properties-linearized-no = Ei
+pdfjs-document-properties-close-button = Sulge
+
+## Print
+
+pdfjs-print-progress-message = Dokumendi ettevalmistamine printimiseks鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Loobu
+pdfjs-printing-not-supported = Hoiatus: printimine pole selle brauseri poolt t盲ielikult toetatud.
+pdfjs-printing-not-ready = Hoiatus: PDF pole printimiseks t盲ielikult laaditud.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = N盲ita k眉lgriba
+pdfjs-toggle-sidebar-notification-button =
+    .title = N盲ita k眉lgriba (dokument sisaldab sisukorda/manuseid/kihte)
+pdfjs-toggle-sidebar-button-label = N盲ita k眉lgriba
+pdfjs-document-outline-button =
+    .title = N盲ita sisukorda (k玫igi punktide laiendamiseks/ahendamiseks topeltkl玫psa)
+pdfjs-document-outline-button-label = N盲ita sisukorda
+pdfjs-attachments-button =
+    .title = N盲ita manuseid
+pdfjs-attachments-button-label = Manused
+pdfjs-layers-button =
+    .title = N盲ita kihte (k玫ikide kihtide vaikeolekusse l盲htestamiseks topeltkl玫psa)
+pdfjs-layers-button-label = Kihid
+pdfjs-thumbs-button =
+    .title = N盲ita pisipilte
+pdfjs-thumbs-button-label = Pisipildid
+pdfjs-current-outline-item-button =
+    .title = Otsi 眉les praegune kontuuri眉ksus
+pdfjs-current-outline-item-button-label = Praegune kontuuri眉ksus
+pdfjs-findbar-button =
+    .title = Otsi dokumendist
+pdfjs-findbar-button-label = Otsi
+pdfjs-additional-layers = T盲iendavad kihid
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page }. lehek眉lg
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page }. lehek眉lje pisipilt
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Otsi
+    .placeholder = Otsi dokumendist鈥�
+pdfjs-find-previous-button =
+    .title = Otsi fraasi eelmine esinemiskoht
+pdfjs-find-previous-button-label = Eelmine
+pdfjs-find-next-button =
+    .title = Otsi fraasi j盲rgmine esinemiskoht
+pdfjs-find-next-button-label = J盲rgmine
+pdfjs-find-highlight-checkbox = Too k玫ik esile
+pdfjs-find-match-case-checkbox-label = T玫stutundlik
+pdfjs-find-match-diacritics-checkbox-label = Otsitakse diakriitiliselt
+pdfjs-find-entire-word-checkbox-label = T盲iss玫nad
+pdfjs-find-reached-top = J玫uti dokumendi algusesse, j盲tkati l玫pust
+pdfjs-find-reached-bottom = J玫uti dokumendi l玫ppu, j盲tkati algusest
+pdfjs-find-not-found = Fraasi ei leitud
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Mahuta laiusele
+pdfjs-page-scale-fit = Mahuta lehek眉ljele
+pdfjs-page-scale-auto = Automaatne suurendamine
+pdfjs-page-scale-actual = Tegelik suurus
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Lehek眉lg { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDFi laadimisel esines viga.
+pdfjs-invalid-file-error = Vigane v玫i rikutud PDF-fail.
+pdfjs-missing-file-error = PDF-fail puudub.
+pdfjs-unexpected-response-error = Ootamatu vastus serverilt.
+pdfjs-rendering-error = Lehe renderdamisel esines viga.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = PDF-faili avamiseks sisesta parool.
+pdfjs-password-invalid = Vigane parool. Palun proovi uuesti.
+pdfjs-password-ok-button = Sobib
+pdfjs-password-cancel-button = Loobu
+pdfjs-web-fonts-disabled = Veebifondid on keelatud: PDFiga kaasatud fonte pole v玫imalik kasutada.
+
+## Image alt-text settings
+
+pdfjs-editor-alt-text-settings-delete-model-button = Kustuta
diff --git a/public/pdfjs/web/locale/eu/viewer.ftl b/public/pdfjs/web/locale/eu/viewer.ftl
new file mode 100644
index 0000000..f5fd645
--- /dev/null
+++ b/public/pdfjs/web/locale/eu/viewer.ftl
@@ -0,0 +1,751 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Aurreko orria
+pdfjs-previous-button-label = Aurrekoa
+pdfjs-next-button =
+    .title = Hurrengo orria
+pdfjs-next-button-label = Hurrengoa
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Orria
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = / { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Urrundu zooma
+pdfjs-zoom-out-button-label = Urrundu zooma
+pdfjs-zoom-in-button =
+    .title = Gerturatu zooma
+pdfjs-zoom-in-button-label = Gerturatu zooma
+pdfjs-zoom-select =
+    .title = Zooma
+pdfjs-presentation-mode-button =
+    .title = Aldatu aurkezpen modura
+pdfjs-presentation-mode-button-label = Arkezpen modua
+pdfjs-open-file-button =
+    .title = Ireki fitxategia
+pdfjs-open-file-button-label = Ireki
+pdfjs-print-button =
+    .title = Inprimatu
+pdfjs-print-button-label = Inprimatu
+pdfjs-save-button =
+    .title = Gorde
+pdfjs-save-button-label = Gorde
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Deskargatu
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Deskargatu
+pdfjs-bookmark-button =
+    .title = Uneko orria (ikusi uneko orriaren URLa)
+pdfjs-bookmark-button-label = Uneko orria
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Tresnak
+pdfjs-tools-button-label = Tresnak
+pdfjs-first-page-button =
+    .title = Joan lehen orrira
+pdfjs-first-page-button-label = Joan lehen orrira
+pdfjs-last-page-button =
+    .title = Joan azken orrira
+pdfjs-last-page-button-label = Joan azken orrira
+pdfjs-page-rotate-cw-button =
+    .title = Biratu erlojuaren norantzan
+pdfjs-page-rotate-cw-button-label = Biratu erlojuaren norantzan
+pdfjs-page-rotate-ccw-button =
+    .title = Biratu erlojuaren aurkako norantzan
+pdfjs-page-rotate-ccw-button-label = Biratu erlojuaren aurkako norantzan
+pdfjs-cursor-text-select-tool-button =
+    .title = Gaitu testuaren hautapen tresna
+pdfjs-cursor-text-select-tool-button-label = Testuaren hautapen tresna
+pdfjs-cursor-hand-tool-button =
+    .title = Gaitu eskuaren tresna
+pdfjs-cursor-hand-tool-button-label = Eskuaren tresna
+pdfjs-scroll-page-button =
+    .title = Erabili orriaren korritzea
+pdfjs-scroll-page-button-label = Orriaren korritzea
+pdfjs-scroll-vertical-button =
+    .title = Erabili korritze bertikala
+pdfjs-scroll-vertical-button-label = Korritze bertikala
+pdfjs-scroll-horizontal-button =
+    .title = Erabili korritze horizontala
+pdfjs-scroll-horizontal-button-label = Korritze horizontala
+pdfjs-scroll-wrapped-button =
+    .title = Erabili korritze egokitua
+pdfjs-scroll-wrapped-button-label = Korritze egokitua
+pdfjs-spread-none-button =
+    .title = Ez elkartu barreiatutako orriak
+pdfjs-spread-none-button-label = Barreiatzerik ez
+pdfjs-spread-odd-button =
+    .title = Elkartu barreiatutako orriak bakoiti zenbakidunekin hasita
+pdfjs-spread-odd-button-label = Barreiatze bakoitia
+pdfjs-spread-even-button =
+    .title = Elkartu barreiatutako orriak bikoiti zenbakidunekin hasita
+pdfjs-spread-even-button-label = Barreiatze bikoitia
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumentuaren propietateak鈥�
+pdfjs-document-properties-button-label = Dokumentuaren propietateak鈥�
+pdfjs-document-properties-file-name = Fitxategi-izena:
+pdfjs-document-properties-file-size = Fitxategiaren tamaina:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte)
+pdfjs-document-properties-title = Izenburua:
+pdfjs-document-properties-author = Egilea:
+pdfjs-document-properties-subject = Gaia:
+pdfjs-document-properties-keywords = Gako-hitzak:
+pdfjs-document-properties-creation-date = Sortze-data:
+pdfjs-document-properties-modification-date = Aldatze-data:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Sortzailea:
+pdfjs-document-properties-producer = PDFaren ekoizlea:
+pdfjs-document-properties-version = PDF bertsioa:
+pdfjs-document-properties-page-count = Orrialde kopurua:
+pdfjs-document-properties-page-size = Orriaren tamaina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = bertikala
+pdfjs-document-properties-page-size-orientation-landscape = horizontala
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Gutuna
+pdfjs-document-properties-page-size-name-legal = Legala
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Webeko ikuspegi bizkorra:
+pdfjs-document-properties-linearized-yes = Bai
+pdfjs-document-properties-linearized-no = Ez
+pdfjs-document-properties-close-button = Itxi
+
+## Print
+
+pdfjs-print-progress-message = Dokumentua inprimatzeko prestatzen鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = %{ $progress }
+pdfjs-print-progress-close-button = Utzi
+pdfjs-printing-not-supported = Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan.
+pdfjs-printing-not-ready = Abisua: PDFa ez dago erabat kargatuta inprimatzeko.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Txandakatu alboko barra
+pdfjs-toggle-sidebar-notification-button =
+    .title = Txandakatu alboko barra (dokumentuak eskema/eranskinak/geruzak ditu)
+pdfjs-toggle-sidebar-button-label = Txandakatu alboko barra
+pdfjs-document-outline-button =
+    .title = Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko)
+pdfjs-document-outline-button-label = Dokumentuaren eskema
+pdfjs-attachments-button =
+    .title = Erakutsi eranskinak
+pdfjs-attachments-button-label = Eranskinak
+pdfjs-layers-button =
+    .title = Erakutsi geruzak (klik bikoitza geruza guztiak egoera lehenetsira berrezartzeko)
+pdfjs-layers-button-label = Geruzak
+pdfjs-thumbs-button =
+    .title = Erakutsi koadro txikiak
+pdfjs-thumbs-button-label = Koadro txikiak
+pdfjs-current-outline-item-button =
+    .title = Bilatu uneko eskemaren elementua
+pdfjs-current-outline-item-button-label = Uneko eskemaren elementua
+pdfjs-findbar-button =
+    .title = Bilatu dokumentuan
+pdfjs-findbar-button-label = Bilatu
+pdfjs-additional-layers = Geruza gehigarriak
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page }. orria
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page }. orriaren koadro txikia
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Hautatu { $page } orria
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = { $page } / { $total } orria
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Bilatu
+    .placeholder = Bilatu dokumentuan鈥�
+pdfjs-find-previous-button =
+    .title = Bilatu esaldiaren aurreko parekatzea
+pdfjs-find-previous-button-label = Aurrekoa
+pdfjs-find-next-button =
+    .title = Bilatu esaldiaren hurrengo parekatzea
+pdfjs-find-next-button-label = Hurrengoa
+pdfjs-find-highlight-checkbox = Nabarmendu guztia
+pdfjs-find-match-case-checkbox-label = Bat etorri maiuskulekin/minuskulekin
+pdfjs-find-match-diacritics-checkbox-label = Bereizi diakritikoak
+pdfjs-find-entire-word-checkbox-label = Hitz osoak
+pdfjs-find-reached-top = Dokumentuaren hasierara heldu da, bukaeratik jarraitzen
+pdfjs-find-reached-bottom = Dokumentuaren bukaerara heldu da, hasieratik jarraitzen
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current }/{ $total } bat-etortzea
+       *[other] { $current }/{ $total } bat-etortzea
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Bat datorren { $limit } baino gehiago
+       *[other] Bat datozen { $limit } baino gehiago
+    }
+pdfjs-find-not-found = Esaldia ez da aurkitu
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Orriaren zabalera
+pdfjs-page-scale-fit = Doitu orrira
+pdfjs-page-scale-auto = Zoom automatikoa
+pdfjs-page-scale-actual = Benetako tamaina
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = %{ $scale }
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = { $page }. orria
+
+## Loading indicator messages
+
+pdfjs-loading-error = Errorea gertatu da PDFa kargatzean.
+pdfjs-invalid-file-error = PDF fitxategi baliogabe edo hondatua.
+pdfjs-missing-file-error = PDF fitxategia falta da.
+pdfjs-unexpected-response-error = Espero gabeko zerbitzariaren erantzuna.
+pdfjs-rendering-error = Errorea gertatu da orria errendatzean.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } ohartarazpena]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Idatzi PDF fitxategi hau irekitzeko pasahitza.
+pdfjs-password-invalid = Pasahitz baliogabea. Saiatu berriro mesedez.
+pdfjs-password-ok-button = Ados
+pdfjs-password-cancel-button = Utzi
+pdfjs-web-fonts-disabled = Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Testua
+pdfjs-editor-color-picker-free-text-input =
+    .title = Aldatu testuaren kolorea
+pdfjs-editor-free-text-button-label = Testua
+pdfjs-editor-ink-button =
+    .title = Marrazkia
+pdfjs-editor-color-picker-ink-input =
+    .title = Aldatu marrazteko kolorea
+pdfjs-editor-ink-button-label = Marrazkia
+pdfjs-editor-stamp-button =
+    .title = Gehitu edo editatu irudiak
+pdfjs-editor-stamp-button-label = Gehitu edo editatu irudiak
+pdfjs-editor-highlight-button =
+    .title = Nabarmendu
+pdfjs-editor-highlight-button-label = Nabarmendu
+pdfjs-highlight-floating-button1 =
+    .title = Nabarmendu
+    .aria-label = Nabarmendu
+pdfjs-highlight-floating-button-label = Nabarmendu
+pdfjs-comment-floating-button =
+    .title = Iruzkina
+    .aria-label = Iruzkina
+pdfjs-comment-floating-button-label = Iruzkina
+pdfjs-editor-comment-button =
+    .title = Iruzkina
+    .aria-label = Iruzkina
+pdfjs-editor-comment-button-label = Iruzkina
+pdfjs-editor-signature-button =
+    .title = Gehitu sinadura
+pdfjs-editor-signature-button-label = Gehitu sinadura
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Nabarmendutakoen editorea
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Marrazkien editorea
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Sinaduren editorea: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Irudien editorea
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Kendu marrazkia
+pdfjs-editor-remove-freetext-button =
+    .title = Kendu testua
+pdfjs-editor-remove-stamp-button =
+    .title = Kendu irudia
+pdfjs-editor-remove-highlight-button =
+    .title = Kendu nabarmentzea
+pdfjs-editor-remove-signature-button =
+    .title = Kendu sinadura
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Kolorea
+pdfjs-editor-free-text-size-input = Tamaina
+pdfjs-editor-ink-color-input = Kolorea
+pdfjs-editor-ink-thickness-input = Loditasuna
+pdfjs-editor-ink-opacity-input = Opakutasuna
+pdfjs-editor-stamp-add-image-button =
+    .title = Gehitu irudia
+pdfjs-editor-stamp-add-image-button-label = Gehitu irudia
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Loditasuna
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Aldatu loditasuna testua ez beste elementuak nabarmentzean
+pdfjs-editor-add-signature-container =
+    .aria-label = Sinaduren kontrolak eta gordetako sinadurak
+pdfjs-editor-signature-add-signature-button =
+    .title = Gehitu sinadura berria
+pdfjs-editor-signature-add-signature-button-label = Gehitu sinadura berria
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Gordetako sinadura: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Testu-editorea
+    .default-content = Hasi idazten鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Iruzkina
+       *[other] Iruzkinak
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Itxi alboko barra
+    .aria-label = Itxi alboko barra
+pdfjs-editor-comments-sidebar-close-button-label = Itxi alboko barra
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Azpimarratzeko zerbait ikusi duzu? Nabarmen ezazu eta utzi iruzkina.
+pdfjs-editor-comments-sidebar-no-comments-link = Argibide gehiago
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Testu alternatiboa
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editatu testu alternatiboa
+pdfjs-editor-alt-text-dialog-label = Aukeratu aukera
+pdfjs-editor-alt-text-dialog-description = Testu alternatiboak laguntzen du jendeak ezin duenean irudia ikusi edo ez denean kargatzen.
+pdfjs-editor-alt-text-add-description-label = Gehitu azalpena
+pdfjs-editor-alt-text-add-description-description = Saiatu idazten gaia, ezarpena edo ekintzak deskribatzen dituen esaldi 1 edo 2.
+pdfjs-editor-alt-text-mark-decorative-label = Markatu apaingarri gisa
+pdfjs-editor-alt-text-mark-decorative-description = Irudiak apaingarrientzat erabiltzen da, adibidez ertz edo ur-marketarako.
+pdfjs-editor-alt-text-cancel-button = Utzi
+pdfjs-editor-alt-text-save-button = Gorde
+pdfjs-editor-alt-text-decorative-tooltip = Apaingarri gisa markatuta
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Adibidez, "gizon gaztea mahaian eserita dago bazkaltzeko"
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Testu alternatiboa
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Goiko ezkerreko izkina 鈥� aldatu tamaina
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Goian erdian 鈥� aldatu tamaina
+pdfjs-editor-resizer-top-right =
+    .aria-label = Goiko eskuineko izkina 鈥� aldatu tamaina
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Erdian eskuinean 鈥� aldatu tamaina
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Beheko eskuineko izkina 鈥� aldatu tamaina
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Behean erdian 鈥� aldatu tamaina
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Beheko ezkerreko izkina 鈥� aldatu tamaina
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Erdian ezkerrean 鈥�  aldatu tamaina
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Nabarmentze kolorea
+pdfjs-editor-colorpicker-button =
+    .title = Aldatu kolorea
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Kolore-aukerak
+pdfjs-editor-colorpicker-yellow =
+    .title = Horia
+pdfjs-editor-colorpicker-green =
+    .title = Berdea
+pdfjs-editor-colorpicker-blue =
+    .title = Urdina
+pdfjs-editor-colorpicker-pink =
+    .title = Arrosa
+pdfjs-editor-colorpicker-red =
+    .title = Gorria
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Erakutsi denak
+pdfjs-editor-highlight-show-all-button =
+    .title = Erakutsi denak
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editatu testu alternatiboa (irudiaren azalpena)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Gehitu testu alternatiboa (irudiaren azalpena)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Idatzi zure azalpena hemen鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Azalpen laburra irudia ikusi ezin duen jendearentzat edo irudia kargatu ezin denerako.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Testu alternatibo hau automatikoki sortu da eta okerra izan liteke.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Argibide gehiago
+pdfjs-editor-new-alt-text-create-automatically-button-label = Sortu testu alternatiboa automatikoki
+pdfjs-editor-new-alt-text-not-now-button = Une honetan ez
+pdfjs-editor-new-alt-text-error-title = Ezin da testu alternatiboa automatikoki sortu
+pdfjs-editor-new-alt-text-error-description = Idatzi zure testu alternatibo propioa edo saiatu berriro geroago.
+pdfjs-editor-new-alt-text-error-close-button = Itxi
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Testu alternatiboaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB)
+    .aria-valuetext = Testu alternatiboaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Testu alternatiboa gehituta
+pdfjs-editor-new-alt-text-added-button-label = Testu alternatiboa gehituta
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Testu alternatiboa falta da
+pdfjs-editor-new-alt-text-missing-button-label = Testu alternatiboa falta da
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Berrikusi testu alternatiboa
+pdfjs-editor-new-alt-text-to-review-button-label = Berrikusi testu alternatiboa
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatikoki sortua: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Irudiaren testu alternatiboaren ezarpenak
+pdfjs-image-alt-text-settings-button-label = Irudiaren testu alternatiboaren ezarpenak
+pdfjs-editor-alt-text-settings-dialog-label = Irudiaren testu alternatiboaren ezarpenak
+pdfjs-editor-alt-text-settings-automatic-title = Testu alternatibo automatikoa
+pdfjs-editor-alt-text-settings-create-model-button-label = Sortu testu alternatiboa automatikoki
+pdfjs-editor-alt-text-settings-create-model-description = Azalpenak iradokitzen ditu irudia ikusi ezin duen jendearentzat edo irudia kargatu ezin denerako.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Testu alternatiboaren AA modeloa ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Zure gailuan modu lokalean exekutatzen da eta zure datuak pribatu mantentzen dira. Testu alternatibo automatikorako beharrezkoa.
+pdfjs-editor-alt-text-settings-delete-model-button = Ezabatu
+pdfjs-editor-alt-text-settings-download-model-button = Deskargatu
+pdfjs-editor-alt-text-settings-downloading-model-button = Deskargatzen鈥�
+pdfjs-editor-alt-text-settings-editor-title = Testu alternatiboaren editorea
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Erakutsi testu alternatiboa irudi bat gehitzean berehala
+pdfjs-editor-alt-text-settings-show-dialog-description = Zure irudiek testu alternatiboa duela ziurtatzen laguntzen dizu.
+pdfjs-editor-alt-text-settings-close-button = Itxi
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Nabarmentzea gehituta
+pdfjs-editor-freetext-added-alert = Testua gehituta
+pdfjs-editor-ink-added-alert = Marrazkia gehituta
+pdfjs-editor-stamp-added-alert = Irudia gehituta
+pdfjs-editor-signature-added-alert = Sinadura gehituta
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Nabarmentzea kenduta
+pdfjs-editor-undo-bar-message-freetext = Testua kenduta
+pdfjs-editor-undo-bar-message-ink = Marrazkia kenduta
+pdfjs-editor-undo-bar-message-stamp = Irudia kenduta
+pdfjs-editor-undo-bar-message-signature = Sinadura kenduta
+pdfjs-editor-undo-bar-message-comment = Iruzkina kenduta
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] Esku-ohar bat kenduta
+       *[other] { $count } esku-ohar kenduta
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Desegin
+pdfjs-editor-undo-bar-undo-button-label = Desegin
+pdfjs-editor-undo-bar-close-button =
+    .title = Itxi
+pdfjs-editor-undo-bar-close-button-label = Itxi
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label =
+    Leiho modal honek PDF dokumentu batera gehitzeko sinadurak
+    sortzea ahalbidetzen dio erabiltzaileari. Erabiltzaileak izena edita
+    dezake (testu alternatibo modura ere erabiltzen dena) eta sinadura
+    gordetzeko aukera du gehiagotan erabili ahal izateko.
+pdfjs-editor-add-signature-dialog-title = Gehitu sinadura
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Idatzi
+    .title = Idatzi
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Marraztu
+    .title = Marraztu
+pdfjs-editor-add-signature-image-button = Irudia
+    .title = Irudia
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Idatzi zure sinadura
+    .placeholder = Idatzi zure sinadura
+pdfjs-editor-add-signature-draw-placeholder = Marraztu zure sinadura
+pdfjs-editor-add-signature-draw-thickness-range-label = Loditasuna
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Marrazteko loditasuna: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Igotzeko, jaregin fitxategia hemen
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Edo aukeratu irudi-fitxategiak
+       *[other] Edo arakatu irudi-fitxategiak
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Azalpena (testu alternatiboa)
+pdfjs-editor-add-signature-description-input =
+    .title = Azalpena (testu alternatiboa)
+pdfjs-editor-add-signature-description-default-when-drawing = Sinadura
+pdfjs-editor-add-signature-clear-button-label = Garbitu sinadura
+pdfjs-editor-add-signature-clear-button =
+    .title = Garbitu sinadura
+pdfjs-editor-add-signature-save-checkbox = Gorde sinadura
+pdfjs-editor-add-signature-save-warning-message = Gordetako sinadura kopuruaren mugara heldu zara (5). Gehiago gorde ahal izateko, ken ezazu bat.
+pdfjs-editor-add-signature-image-upload-error-title = Ezin da irudia igo
+pdfjs-editor-add-signature-image-upload-error-description = Egiaztatu zure sareko konexioa edo saiatu beste irudi batekin.
+pdfjs-editor-add-signature-image-no-data-error-title = Ezin da irudia sinaduran bihurtu
+pdfjs-editor-add-signature-image-no-data-error-description = Saiatu beste irudi bat igotzen.
+pdfjs-editor-add-signature-error-close-button = Itxi
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Utzi
+pdfjs-editor-add-signature-add-button = Gehitu
+pdfjs-editor-edit-signature-update-button = Eguneratu
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Editatu iruzkina
+pdfjs-editor-edit-comment-popup-button =
+    .title = Editatu iruzkina
+pdfjs-editor-delete-comment-popup-button-label = Kendu iruzkina
+pdfjs-editor-delete-comment-popup-button =
+    .title = Kendu iruzkina
+pdfjs-show-comment-button =
+    .title = Erakutsi iruzkina
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Editatu iruzkina
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Eguneratu
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Gehitu iruzkina
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Gehitu
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Hasi idazten鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Utzi
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Gehitu iruzkina
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Txandakatu alboko barra (dokumentuak koadro txikiak/eskema/eranskinak/geruzak ditu)
+pdfjs-toggle-views-manager-button1-label = Kudeatu orriak
+pdfjs-views-manager-sidebar =
+    .aria-label = Alboko barra
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Alboko barra neurriz aldatzekoa
+pdfjs-views-manager-view-selector-button =
+    .title = Ikuspegiak
+pdfjs-views-manager-view-selector-button-label = Ikuspegiak
+pdfjs-views-manager-pages-title = Orriak
+pdfjs-views-manager-outlines-title1 = Dokumentuaren eskema
+    .title = Dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko)
+pdfjs-views-manager-attachments-title = Eranskinak
+pdfjs-views-manager-layers-title1 = Geruzak
+    .title = Geruzak (klik bikoitza geruza guztiak egoera lehenetsira berrezartzeko)
+pdfjs-views-manager-pages-option-label = Orriak
+pdfjs-views-manager-outlines-option-label = Dokumentuaren eskema
+pdfjs-views-manager-attachments-option-label = Eranskinak
+pdfjs-views-manager-layers-option-label = Geruzak
+pdfjs-views-manager-add-file-button =
+    .title = Gehitu fitxategia
+pdfjs-views-manager-add-file-button-label = Gehitu fitxategia
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } hautatuta
+       *[other] { $count } hautatuta
+    }
+pdfjs-views-manager-pages-status-none-action-label = Hautatu orriak
+pdfjs-views-manager-pages-status-action-button-label = Kudeatu
+pdfjs-views-manager-pages-status-copy-button-label = Kopiatu
+pdfjs-views-manager-pages-status-cut-button-label = Ebaki
+pdfjs-views-manager-pages-status-delete-button-label = Ezabatu
+pdfjs-views-manager-pages-status-export-selected-button-label = Esportatu hautatutakoa鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] Orri bat moztuta
+       *[other] { $count } orri moztuta
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] Orri bat kopiatuta
+       *[other] { $count } orri kopiatuta
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] Orri bat ezabatuta
+       *[other] { $count } orri ezabatuta
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Zuee fitxategia prestatzen鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Fitxategia igotzen鈥�
+pdfjs-views-manager-status-warning-cut-label = Ezin da moztu. Berritu orria eta saiatu berriro.
+pdfjs-views-manager-status-warning-copy-label = Ezin da kopiatu. Berritu orria eta saiatu berriro.
+pdfjs-views-manager-status-warning-delete-label = Ezin da ezabatu. Berritu orria eta saiatu berriro.
+pdfjs-views-manager-status-warning-save-label = Ezin da gorde. Berritu orria eta saiatu berriro.
+pdfjs-views-manager-status-undo-button-label = Desegin
+pdfjs-views-manager-status-done-button-label = Eginda
+pdfjs-views-manager-status-close-button =
+    .title = Itxi
+pdfjs-views-manager-status-close-button-label = Itxi
+pdfjs-views-manager-paste-button-label = Itsatsi
+pdfjs-views-manager-paste-button-before =
+    .title = Itsatsi lehen orriaren aurretik
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Itsatsi { $page }. orriaren aurretik
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = BERRIA
+pdfjs-views-manager-waiting-for-file = Fitxategia igotzen鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Kudeatu orriak
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Kendu gordetako sinadura
+pdfjs-editor-delete-signature-button-label1 = Kendu gordetako sinadura
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Editatu azalpena
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Editatu azalpena
diff --git a/public/pdfjs/web/locale/fa/viewer.ftl b/public/pdfjs/web/locale/fa/viewer.ftl
new file mode 100644
index 0000000..edff37c
--- /dev/null
+++ b/public/pdfjs/web/locale/fa/viewer.ftl
@@ -0,0 +1,322 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 氐賮丨賴贁 賯亘賱蹖
+pdfjs-previous-button-label = 賯亘賱蹖
+pdfjs-next-button =
+    .title = 氐賮丨賴贁 亘毓丿蹖
+pdfjs-next-button-label = 亘毓丿蹖
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 氐賮丨賴
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 丕夭 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber }丕夭 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 讴賵趩讴鈥屬嗁呚й屰�
+pdfjs-zoom-out-button-label = 讴賵趩讴鈥屬嗁呚й屰�
+pdfjs-zoom-in-button =
+    .title = 亘夭乇诏鈥屬嗁呚й屰�
+pdfjs-zoom-in-button-label = 亘夭乇诏鈥屬嗁呚й屰�
+pdfjs-zoom-select =
+    .title = 夭賵賲
+pdfjs-presentation-mode-button =
+    .title = 鬲睾蹖蹖乇 亘賴 丨丕賱鬲 丕乇丕卅賴
+pdfjs-presentation-mode-button-label = 丨丕賱鬲 丕乇丕卅賴
+pdfjs-open-file-button =
+    .title = 亘丕夭 讴乇丿賳 倬乇賵賳丿賴
+pdfjs-open-file-button-label = 亘丕夭 讴乇丿賳
+pdfjs-print-button =
+    .title = 趩丕倬
+pdfjs-print-button-label = 趩丕倬
+pdfjs-save-button =
+    .title = 匕禺蹖乇賴
+pdfjs-save-button-label = 匕禺蹖乇賴
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 丿乇蹖丕賮鬲
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 丿乇蹖丕賮鬲
+pdfjs-bookmark-button =
+    .title = 氐賮丨賴 賮毓賱蹖 (賲卮丕賴丿賴 賳卮丕賳蹖 丕蹖賳鬲乇賳鬲蹖 丕夭 氐賮丨賴 賮毓賱蹖)
+pdfjs-bookmark-button-label = 氐賮丨賴 賮毓賱蹖
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 丕亘夭丕乇賴丕
+pdfjs-tools-button-label = 丕亘夭丕乇賴丕
+pdfjs-first-page-button =
+    .title = 亘乇賵 亘賴 丕賵賱蹖賳 氐賮丨賴
+pdfjs-first-page-button-label = 亘乇賵 亘賴 丕賵賱蹖賳 氐賮丨賴
+pdfjs-last-page-button =
+    .title = 亘乇賵 亘賴 丌禺乇蹖賳 氐賮丨賴
+pdfjs-last-page-button-label = 亘乇賵 亘賴 丌禺乇蹖賳 氐賮丨賴
+pdfjs-page-rotate-cw-button =
+    .title = 趩乇禺卮 爻丕毓鬲诏乇丿
+pdfjs-page-rotate-cw-button-label = 趩乇禺卮 爻丕毓鬲诏乇丿
+pdfjs-page-rotate-ccw-button =
+    .title = 趩乇禺卮 倬丕丿 爻丕毓鬲诏乇丿
+pdfjs-page-rotate-ccw-button-label = 趩乇禺卮 倬丕丿 爻丕毓鬲诏乇丿
+pdfjs-cursor-text-select-tool-button =
+    .title = 賮毓丕賱 讴乇丿賳 丕亘夭丕乇賽 丕賳鬲禺丕亘賽 賲鬲賳
+pdfjs-cursor-text-select-tool-button-label = 丕亘夭丕乇賽 丕賳鬲禺丕亘賽 賲鬲賳
+pdfjs-cursor-hand-tool-button =
+    .title = 賮毓丕賱 讴乇丿賳 丕亘夭丕乇賽 丿爻鬲
+pdfjs-cursor-hand-tool-button-label = 丕亘夭丕乇 丿爻鬲
+pdfjs-scroll-page-button =
+    .title = 丕爻鬲賮丕丿賴 丕夭 倬蹖賲丕蹖卮 氐賮丨賴
+pdfjs-scroll-page-button-label = 倬蹖賲丕蹖卮 氐賮丨賴
+pdfjs-scroll-vertical-button =
+    .title = 丕爻鬲賮丕丿賴 丕夭 倬蹖賲丕蹖卮 毓賲賵丿蹖
+pdfjs-scroll-vertical-button-label = 倬蹖賲丕蹖卮 毓賲賵丿蹖
+pdfjs-scroll-horizontal-button =
+    .title = 丕爻鬲賮丕丿賴 丕夭 倬蹖賲丕蹖卮 丕賮賯蹖
+pdfjs-scroll-horizontal-button-label = 倬蹖賲丕蹖卮 丕賮賯蹖
+pdfjs-spread-none-button =
+    .title = 氐賮丨丕鬲 倬蹖賵爻鬲賴 乇丕 蹖讴蹖 賳讴賳蹖丿
+pdfjs-spread-none-button-label = 亘丿賵賳 氐賮丨丕鬲 倬蹖賵爻鬲賴
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 禺氐賵氐蹖丕鬲 爻賳丿...
+pdfjs-document-properties-button-label = 禺氐賵氐蹖丕鬲 爻賳丿...
+pdfjs-document-properties-file-name = 賳丕賲 倬乇賵賳丿賴:
+pdfjs-document-properties-file-size = 丨噩賲 倬乇賵賳丿賴:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 讴蹖賱賵亘丕蹖鬲 ({ $b } 亘丕蹖鬲)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 賲诏丕亘丕蹖鬲 ({ $b } 亘丕蹖鬲)
+pdfjs-document-properties-title = 毓賳賵丕賳:
+pdfjs-document-properties-author = 賳賵蹖爻賳丿賴:
+pdfjs-document-properties-subject = 賲賵囟賵毓:
+pdfjs-document-properties-keywords = 讴賱蹖丿賵丕跇賴鈥屬囏�:
+pdfjs-document-properties-creation-date = 鬲丕乇蹖禺 丕蹖噩丕丿:
+pdfjs-document-properties-modification-date = 鬲丕乇蹖禺 賵蹖乇丕蹖卮:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 丕蹖噩丕丿 讴賳賳丿賴:
+pdfjs-document-properties-producer = 丕蹖噩丕丿 讴賳賳丿賴 PDF:
+pdfjs-document-properties-version = 賳爻禺賴 PDF:
+pdfjs-document-properties-page-count = 鬲毓丿丕丿 氐賮丨丕鬲:
+pdfjs-document-properties-page-size = 丕賳丿丕夭賴 氐賮丨賴:
+pdfjs-document-properties-page-size-unit-inches = 丕蹖賳趩
+pdfjs-document-properties-page-size-unit-millimeters = 賲蹖賱蹖鈥屬呚�
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 賳丕賲賴
+pdfjs-document-properties-page-size-name-legal = 丨賯賵賯蹖
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+pdfjs-document-properties-linearized-yes = 亘賱賴
+pdfjs-document-properties-linearized-no = 禺蹖乇
+pdfjs-document-properties-close-button = 亘爻鬲賳
+
+## Print
+
+pdfjs-print-progress-message = 丌賲丕丿賴 爻丕夭蹖 賲丿丕乇讴 亘乇丕蹖 趩丕倬 讴乇丿賳鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 賱睾賵
+pdfjs-printing-not-supported = 賴卮丿丕乇: 賯丕亘賱蹖鬲 趩丕倬 亘賴鈥屫焚堌� 讴丕賲賱 丿乇 丕蹖賳 賲乇賵乇诏乇 倬卮鬲蹖亘丕賳蹖 賳賲蹖鈥屫促堌�.
+pdfjs-printing-not-ready = 丕禺胤丕乇: 倬乇賵賳丿賴 PDF 亘胤賵乇 讴丕賲賱 亘丕乇诏蹖乇蹖 賳卮丿賴 賵 丕賲讴丕賳 趩丕倬 賵噩賵丿 賳丿丕乇丿.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 亘丕夭 賵 亘爻鬲賴 讴乇丿賳 賳賵丕乇 讴賳丕乇蹖
+pdfjs-toggle-sidebar-button-label = 鬲睾蹖蹖乇丨丕賱鬲 賳賵丕乇讴賳丕乇蹖
+pdfjs-document-outline-button =
+    .title = 賳賲丕蹖卮 乇卅賵爻 賲胤丕賱亘 賲丿丕乇讴(亘乇丕蹖 亘丕夭卮丿賳/噩賲毓 卮丿賳 賴賲賴 賲賵丕乇丿 丿賵亘丕乇 讴賱蹖讴 讴賳蹖丿)
+pdfjs-document-outline-button-label = 胤乇丨 賳賵卮鬲丕乇
+pdfjs-attachments-button =
+    .title = 賳賲丕蹖卮 倬蹖賵爻鬲鈥屬囏�
+pdfjs-attachments-button-label = 倬蹖賵爻鬲鈥屬囏�
+pdfjs-layers-button-label = 賱丕蹖賴鈥屬囏�
+pdfjs-thumbs-button =
+    .title = 賳賲丕蹖卮 鬲氐丕賵蹖乇 亘賳丿丕賳诏卮鬲蹖
+pdfjs-thumbs-button-label = 鬲氐丕賵蹖乇 亘賳丿丕賳诏卮鬲蹖
+pdfjs-findbar-button =
+    .title = 噩爻鬲噩賵 丿乇 爻賳丿
+pdfjs-findbar-button-label = 倬蹖丿丕 讴乇丿賳
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 氐賮丨賴 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 鬲氐賵蹖乇 亘賳丿鈥� 丕賳诏卮鬲蹖 氐賮丨賴 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 倬蹖丿丕 讴乇丿賳
+    .placeholder = 倬蹖丿丕 讴乇丿賳 丿乇 爻賳丿鈥�
+pdfjs-find-previous-button =
+    .title = 倬蹖丿丕 讴乇丿賳 乇禺丿丕丿 賯亘賱蹖 毓亘丕乇鬲
+pdfjs-find-previous-button-label = 賯亘賱蹖
+pdfjs-find-next-button =
+    .title = 倬蹖丿丕 讴乇丿賳 乇禺丿丕丿 亘毓丿蹖 毓亘丕乇鬲
+pdfjs-find-next-button-label = 亘毓丿蹖
+pdfjs-find-highlight-checkbox = 亘乇噩爻鬲賴 賵 賴丕蹖賱丕蹖鬲 讴乇丿賳 賴賲賴 賲賵丕乇丿
+pdfjs-find-match-case-checkbox-label = 鬲胤亘蹖賯 讴賵趩讴蹖 賵 亘夭乇诏蹖 丨乇賵賮
+pdfjs-find-entire-word-checkbox-label = 鬲賲丕賲 讴賱賲賴鈥屬囏�
+pdfjs-find-reached-top = 亘賴 亘丕賱丕蹖 氐賮丨賴 乇爻蹖丿蹖賲貙 丕夭 倬丕蹖蹖賳 丕丿丕賲賴 賲蹖鈥屫囒屬�
+pdfjs-find-reached-bottom = 亘賴 丌禺乇 氐賮丨賴 乇爻蹖丿蹖賲貙 丕夭 亘丕賱丕 丕丿丕賲賴 賲蹖鈥屫囒屬�
+pdfjs-find-not-found = 毓亘丕乇鬲 倬蹖丿丕 賳卮丿
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 毓乇囟 氐賮丨賴
+pdfjs-page-scale-fit = 丕賳丿丕夭賴 讴乇丿賳 氐賮丨賴
+pdfjs-page-scale-auto = 亘夭乇诏賳賲丕蹖蹖 禺賵丿讴丕乇
+pdfjs-page-scale-actual = 丕賳丿丕夭賴 賵丕賯毓蹖鈥�
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 氐賮丨賴贁 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 賴賳诏丕賲 亘丕乇诏蹖乇蹖 倬乇賵賳丿賴 PDF 禺胤丕蹖蹖 乇禺 丿丕丿.
+pdfjs-invalid-file-error = 倬乇賵賳丿賴 PDF 賳丕賲毓鬲亘乇 蹖丕賲毓蹖賵亘 賲蹖鈥屫ㄘж簇�.
+pdfjs-missing-file-error = 倬乇賵賳丿賴 PDF 蹖丕賮鬲 賳卮丿.
+pdfjs-unexpected-response-error = 倬丕爻禺 倬蹖卮 亘蹖賳蹖 賳卮丿賴 爻乇賵乇
+pdfjs-rendering-error = 賴賳诏丕賲 亘丕乇诏蹖乇蹖 氐賮丨賴 禺胤丕蹖蹖 乇禺 丿丕丿.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 噩賴鬲 亘丕夭 讴乇丿賳 倬乇賵賳丿賴 PDF 诏匕乇賵丕跇賴 乇丕 賵丕乇丿 賳賲丕卅蹖丿.
+pdfjs-password-invalid = 诏匕乇賵丕跇賴 賳丕賲毓鬲亘乇. 賱胤賮丕 賲噩丿丿丕 鬲賱丕卮 讴賳蹖丿.
+pdfjs-password-ok-button = 鬲兀蹖蹖丿
+pdfjs-password-cancel-button = 賱睾賵
+pdfjs-web-fonts-disabled = 賮賵賳鬲 賴丕蹖 鬲丨鬲 賵亘 睾蹖乇 賮毓丕賱 卮丿賴 丕賳丿: 丕賲讴丕賳 丕爻鬲賮丕丿賴 丕夭 賳賲丕蹖卮 丿賴賳丿賴 丿丕禺賱蹖 PDF 賵噩賵丿 賳丿丕乇丿.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 賲鬲賳
+pdfjs-editor-free-text-button-label = 賲鬲賳
+pdfjs-editor-ink-button =
+    .title = 讴卮蹖丿賳
+pdfjs-editor-ink-button-label = 讴卮蹖丿賳
+pdfjs-editor-stamp-button =
+    .title = 丕賮夭賵丿賳 蹖丕 賵蹖乇丕蹖卮 鬲氐丕賵蹖乇
+pdfjs-editor-stamp-button-label = 丕賮夭賵丿賳 蹖丕 賵蹖乇丕蹖卮 鬲氐丕賵蹖乇
+pdfjs-editor-highlight-button =
+    .title = 亘乇噩爻鬲賴 讴乇丿賳
+pdfjs-editor-highlight-button-label = 亘乇噩爻鬲賴 讴乇丿賳
+pdfjs-highlight-floating-button1 =
+    .title = 亘乇噩爻鬲賴 讴乇丿賳
+    .aria-label = 亘乇噩爻鬲賴 讴乇丿賳
+pdfjs-highlight-floating-button-label = 亘乇噩爻鬲賴 讴乇丿賳
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 乇賳诏
+pdfjs-editor-free-text-size-input = 丕賳丿丕夭賴
+pdfjs-editor-ink-color-input = 乇賳诏
+pdfjs-editor-stamp-add-image-button =
+    .title = 丕賮夭賵丿賳 鬲氐賵蹖乇
+pdfjs-editor-stamp-add-image-button-label = 丕賮夭賵丿賳 鬲氐賵蹖乇
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 賵蹖乇丕蹖卮诏乇 賲鬲賳
+    .default-content = 卮乇賵毓 亘賴 賳賵卮鬲賳 讴賳蹖丿鈥�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-add-description-label = 丕賮夭賵丿賳 鬲賵囟蹖丨丕鬲
+pdfjs-editor-alt-text-cancel-button = 丕賳氐乇丕賮
+pdfjs-editor-alt-text-save-button = 匕禺蹖乇賴
+
+## Color picker
+
+pdfjs-editor-colorpicker-button =
+    .title = 鬲睾蹖蹖乇 乇賳诏
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 丕賳鬲禺丕亘 乇賳诏
+pdfjs-editor-colorpicker-yellow =
+    .title = 夭乇丿
+pdfjs-editor-colorpicker-green =
+    .title = 爻亘夭
+pdfjs-editor-colorpicker-blue =
+    .title = 丌亘蹖
+pdfjs-editor-colorpicker-pink =
+    .title = 氐賵乇鬲蹖
+pdfjs-editor-colorpicker-red =
+    .title = 賯乇賲夭
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 賳賲丕蹖卮 賴賲賴
+pdfjs-editor-highlight-show-all-button =
+    .title = 賳賲丕蹖卮 賴賲賴
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 亘蹖卮鬲乇 亘丿丕賳蹖丿
+pdfjs-editor-new-alt-text-not-now-button = 丕讴賳賵賳 賳賴
+pdfjs-editor-new-alt-text-error-close-button = 亘爻鬲賳
+
+## Image alt-text settings
+
+pdfjs-editor-alt-text-settings-delete-model-button = 丨匕賮
+pdfjs-editor-alt-text-settings-download-model-button = 丿乇蹖丕賮鬲
+pdfjs-editor-alt-text-settings-downloading-model-button = 丿乇 丨丕賱 丿乇蹖丕賮鬲鈥�
+pdfjs-editor-alt-text-settings-close-button = 亘爻鬲賳
diff --git a/public/pdfjs/web/locale/ff/viewer.ftl b/public/pdfjs/web/locale/ff/viewer.ftl
new file mode 100644
index 0000000..e7cc1d7
--- /dev/null
+++ b/public/pdfjs/web/locale/ff/viewer.ftl
@@ -0,0 +1,222 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Hello 苼ennungo
+pdfjs-previous-button-label = 苼ennu蓷o
+pdfjs-next-button =
+    .title = Hello faango
+pdfjs-next-button-label = Yeeso
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Hello
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = e nder { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Lonngo Wo蓷蓷a
+pdfjs-zoom-out-button-label = Lonngo Wo蓷蓷a
+pdfjs-zoom-in-button =
+    .title = Lonngo Ara
+pdfjs-zoom-in-button-label = Lonngo Ara
+pdfjs-zoom-select =
+    .title = Lonngo
+pdfjs-presentation-mode-button =
+    .title = Faytu to  Presentation Mode
+pdfjs-presentation-mode-button-label = Presentation Mode
+pdfjs-open-file-button =
+    .title = Uddit Fiilde
+pdfjs-open-file-button-label = Uddit
+pdfjs-print-button =
+    .title = Winndito
+pdfjs-print-button-label = Winndito
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Kuutor蓷e
+pdfjs-tools-button-label = Kuutor蓷e
+pdfjs-first-page-button =
+    .title = Yah to hello adanngo
+pdfjs-first-page-button-label = Yah to hello adanngo
+pdfjs-last-page-button =
+    .title = Yah to hello wattindiingo
+pdfjs-last-page-button-label = Yah to hello wattindiingo
+pdfjs-page-rotate-cw-button =
+    .title = Yiiltu Faya 脩aamo
+pdfjs-page-rotate-cw-button-label = Yiiltu Faya 脩aamo
+pdfjs-page-rotate-ccw-button =
+    .title = Yiiltu Faya Nano
+pdfjs-page-rotate-ccw-button-label = Yiiltu Faya Nano
+pdfjs-cursor-text-select-tool-button =
+    .title = Gollin ka蓳irgel cu蓳irgel binndi
+pdfjs-cursor-text-select-tool-button-label = Ka蓳irgel cu蓳irgel binndi
+pdfjs-cursor-hand-tool-button =
+    .title = Hurmin kuutorgal junngo
+pdfjs-cursor-hand-tool-button-label = Ka蓳irgel junngo
+pdfjs-scroll-vertical-button =
+    .title = Huutoro gorwitol daringol
+pdfjs-scroll-vertical-button-label = Gorwitol daringol
+pdfjs-scroll-horizontal-button =
+    .title = Huutoro gorwitol lelingol
+pdfjs-scroll-horizontal-button-label = Gorwitol daringol
+pdfjs-scroll-wrapped-button =
+    .title = Huutoro gorwitol coomingol
+pdfjs-scroll-wrapped-button-label = Gorwitol coomingol
+pdfjs-spread-none-button =
+    .title = Hoto tawtu kelle kelle
+pdfjs-spread-none-button-label = Alaa Spreads
+pdfjs-spread-odd-button =
+    .title = Tawtu kelle pu蓷蓷ortoo蓷e kelle teel蓷e
+pdfjs-spread-odd-button-label = Kelle teel蓷e
+pdfjs-spread-even-button =
+    .title = Tawtu 蓷ereeji kelle pu蓷蓷orii蓷i kelle teeltu蓷e
+pdfjs-spread-even-button-label = Kelle teeltu蓷e
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Keeroraa蓷i Winndannde鈥�
+pdfjs-document-properties-button-label = Keeroraa蓷i Winndannde鈥�
+pdfjs-document-properties-file-name = Innde fiilde:
+pdfjs-document-properties-file-size = 苼etol fiilde:
+pdfjs-document-properties-title = Tiitoonde:
+pdfjs-document-properties-author = Binndu蓷o:
+pdfjs-document-properties-subject = To蓳蓳ere:
+pdfjs-document-properties-keywords = Kelmekele jiytir蓷e:
+pdfjs-document-properties-creation-date = 脩alnde Sosaa:
+pdfjs-document-properties-modification-date = 脩alnde Waylaa:
+pdfjs-document-properties-creator = Cos蓷o:
+pdfjs-document-properties-producer = Paggii蓷o PDF:
+pdfjs-document-properties-version = Yamre PDF:
+pdfjs-document-properties-page-count = Limoore Kelle:
+pdfjs-document-properties-page-size = 苼eto Hello:
+pdfjs-document-properties-page-size-unit-inches = nder
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = dariingo
+pdfjs-document-properties-page-size-orientation-landscape = wertiingo
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 苼ataake
+pdfjs-document-properties-page-size-name-legal = Laawol
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 茒isngo geese yaawngo:
+pdfjs-document-properties-linearized-yes = Eey
+pdfjs-document-properties-linearized-no = Alaa
+pdfjs-document-properties-close-button = Uddu
+
+## Print
+
+pdfjs-print-progress-message = Nana heboo winnditaade fiilannde鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Haaytu
+pdfjs-printing-not-supported = Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde.
+pdfjs-printing-not-ready = Reentino: PDF oo loowaaki haa timmi ngam winnditagol.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Toggilo Palal Sawndo
+pdfjs-toggle-sidebar-button-label = Toggilo Palal Sawndo
+pdfjs-document-outline-button =
+    .title = Hollu 瞥iyal Fiilannde (dobdobo ngam wertude/taggude teme fof)
+pdfjs-document-outline-button-label = To蓳蓳e Fiilannde
+pdfjs-attachments-button =
+    .title = Hollu 茒isan蓷e
+pdfjs-attachments-button-label = 茒isan蓷e
+pdfjs-thumbs-button =
+    .title = Hollu Doo蓳e
+pdfjs-thumbs-button-label = Doo蓳e
+pdfjs-findbar-button =
+    .title = Yiylo e fiilannde
+pdfjs-findbar-button-label = Yiytu
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Hello { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Doo蓳re Hello { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Yiytu
+    .placeholder = Yiylo nder dokimaa
+pdfjs-find-previous-button =
+    .title = Yiylo cilol 蓳ennugol konngol ngol
+pdfjs-find-previous-button-label = 苼ennu蓷o
+pdfjs-find-next-button =
+    .title = Yiylo cilol garowol konngol ngol
+pdfjs-find-next-button-label = Yeeso
+pdfjs-find-highlight-checkbox = Jalbin fof
+pdfjs-find-match-case-checkbox-label = Jaa蓳nu darnde
+pdfjs-find-entire-word-checkbox-label = Kelme timmu蓷e tan
+pdfjs-find-reached-top = He蓳ii fu蓷蓷orde fiilannde, jokku faya les
+pdfjs-find-reached-bottom = He蓳ii hoore fiilannde, jokku faya les
+pdfjs-find-not-found = Konngi njiyataa
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Njaajeendi Hello
+pdfjs-page-scale-fit = Ke拼eendi Hello
+pdfjs-page-scale-auto = Loongorde Jaajol
+pdfjs-page-scale-actual = 苼etol Jaati
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Juumre wa蓷ii tuma nde loowata PDF oo.
+pdfjs-invalid-file-error = Fiilde PDF mo拼拼aani walla jiibii.
+pdfjs-missing-file-error = Fiilde PDF ena 艐akki.
+pdfjs-unexpected-response-error = Jaabtol sarworde tijjinooka.
+pdfjs-rendering-error = Juumre wa蓷ii tuma nde yo艐kittoo hello.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Siiftannde]
+
+## Password
+
+pdfjs-password-label = Naatu finnde ngam uddite ndee fiilde PDF.
+pdfjs-password-invalid = Finnde mo拼拼aani. Tii蓷no eto kadi.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Haaytu
+pdfjs-web-fonts-disabled = Ponte geese ko daa拼aa蓷e: horiima huutoraade ponte PDF coomtoraa蓷e.
diff --git a/public/pdfjs/web/locale/fi/viewer.ftl b/public/pdfjs/web/locale/fi/viewer.ftl
new file mode 100644
index 0000000..8f7091c
--- /dev/null
+++ b/public/pdfjs/web/locale/fi/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Edellinen sivu
+pdfjs-previous-button-label = Edellinen
+pdfjs-next-button =
+    .title = Seuraava sivu
+pdfjs-next-button-label = Seuraava
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Sivu
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = / { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Loitonna
+pdfjs-zoom-out-button-label = Loitonna
+pdfjs-zoom-in-button =
+    .title = L盲henn盲
+pdfjs-zoom-in-button-label = L盲henn盲
+pdfjs-zoom-select =
+    .title = Suurennus
+pdfjs-presentation-mode-button =
+    .title = Siirry esitystilaan
+pdfjs-presentation-mode-button-label = Esitystila
+pdfjs-open-file-button =
+    .title = Avaa tiedosto
+pdfjs-open-file-button-label = Avaa
+pdfjs-print-button =
+    .title = Tulosta
+pdfjs-print-button-label = Tulosta
+pdfjs-save-button =
+    .title = Tallenna
+pdfjs-save-button-label = Tallenna
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Lataa
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Lataa
+pdfjs-bookmark-button =
+    .title = Nykyinen sivu (N盲yt盲 URL-osoite nykyiselt盲 sivulta)
+pdfjs-bookmark-button-label = Nykyinen sivu
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Tools
+pdfjs-tools-button-label = Tools
+pdfjs-first-page-button =
+    .title = Siirry ensimm盲iselle sivulle
+pdfjs-first-page-button-label = Siirry ensimm盲iselle sivulle
+pdfjs-last-page-button =
+    .title = Siirry viimeiselle sivulle
+pdfjs-last-page-button-label = Siirry viimeiselle sivulle
+pdfjs-page-rotate-cw-button =
+    .title = Kierr盲 oikealle
+pdfjs-page-rotate-cw-button-label = Kierr盲 oikealle
+pdfjs-page-rotate-ccw-button =
+    .title = Kierr盲 vasemmalle
+pdfjs-page-rotate-ccw-button-label = Kierr盲 vasemmalle
+pdfjs-cursor-text-select-tool-button =
+    .title = K盲yt盲 tekstinvalintaty枚kalua
+pdfjs-cursor-text-select-tool-button-label = Tekstinvalintaty枚kalu
+pdfjs-cursor-hand-tool-button =
+    .title = K盲yt盲 k盲sity枚kalua
+pdfjs-cursor-hand-tool-button-label = K盲sity枚kalu
+pdfjs-scroll-page-button =
+    .title = K盲yt盲 sivun vierityst盲
+pdfjs-scroll-page-button-label = Sivun vieritys
+pdfjs-scroll-vertical-button =
+    .title = K盲yt盲 pystysuuntaista vierityst盲
+pdfjs-scroll-vertical-button-label = Pystysuuntainen vieritys
+pdfjs-scroll-horizontal-button =
+    .title = K盲yt盲 vaakasuuntaista vierityst盲
+pdfjs-scroll-horizontal-button-label = Vaakasuuntainen vieritys
+pdfjs-scroll-wrapped-button =
+    .title = K盲yt盲 rivittyv盲盲 vierityst盲
+pdfjs-scroll-wrapped-button-label = Rivittyv盲 vieritys
+pdfjs-spread-none-button =
+    .title = 脛l盲 yhdist盲 sivuja aukeamiksi
+pdfjs-spread-none-button-label = Ei aukeamia
+pdfjs-spread-odd-button =
+    .title = Yhdist盲 sivut aukeamiksi alkaen parittomalta sivulta
+pdfjs-spread-odd-button-label = Parittomalta alkavat aukeamat
+pdfjs-spread-even-button =
+    .title = Yhdist盲 sivut aukeamiksi alkaen parilliselta sivulta
+pdfjs-spread-even-button-label = Parilliselta alkavat aukeamat
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumentin ominaisuudet鈥�
+pdfjs-document-properties-button-label = Dokumentin ominaisuudet鈥�
+pdfjs-document-properties-file-name = Tiedoston nimi:
+pdfjs-document-properties-file-size = Tiedoston koko:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kt ({ $b } tavua)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mt ({ $b } tavua)
+pdfjs-document-properties-title = Otsikko:
+pdfjs-document-properties-author = Tekij盲:
+pdfjs-document-properties-subject = Aihe:
+pdfjs-document-properties-keywords = Avainsanat:
+pdfjs-document-properties-creation-date = Luomisp盲iv盲m盲盲r盲:
+pdfjs-document-properties-modification-date = Muokkausp盲iv盲m盲盲r盲:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Luoja:
+pdfjs-document-properties-producer = PDF-tuottaja:
+pdfjs-document-properties-version = PDF-versio:
+pdfjs-document-properties-page-count = Sivujen m盲盲r盲:
+pdfjs-document-properties-page-size = Sivun koko:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = pysty
+pdfjs-document-properties-page-size-orientation-landscape = vaaka
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Nopea web-katselu:
+pdfjs-document-properties-linearized-yes = Kyll盲
+pdfjs-document-properties-linearized-no = Ei
+pdfjs-document-properties-close-button = Sulje
+
+## Print
+
+pdfjs-print-progress-message = Valmistellaan dokumenttia tulostamista varten鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }聽%
+pdfjs-print-progress-close-button = Peruuta
+pdfjs-printing-not-supported = Varoitus: Selain ei tue kaikkia tulostustapoja.
+pdfjs-printing-not-ready = Varoitus: PDF-tiedosto ei ole viel盲 latautunut kokonaan, eik盲 sit盲 voi viel盲 tulostaa.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = N盲yt盲/piilota sivupaneeli
+pdfjs-toggle-sidebar-notification-button =
+    .title = N盲yt盲/piilota sivupaneeli (dokumentissa on sis盲llys/liitteit盲/tasoja)
+pdfjs-toggle-sidebar-button-label = N盲yt盲/piilota sivupaneeli
+pdfjs-document-outline-button =
+    .title = N盲yt盲 dokumentin sis盲llys (laajenna tai kutista kohdat kaksoisnapsauttamalla)
+pdfjs-document-outline-button-label = Dokumentin sis盲llys
+pdfjs-attachments-button =
+    .title = N盲yt盲 liitteet
+pdfjs-attachments-button-label = Liitteet
+pdfjs-layers-button =
+    .title = N盲yt盲 tasot (kaksoisnapsauta palauttaaksesi kaikki tasot oletustilaan)
+pdfjs-layers-button-label = Tasot
+pdfjs-thumbs-button =
+    .title = N盲yt盲 pienoiskuvat
+pdfjs-thumbs-button-label = Pienoiskuvat
+pdfjs-current-outline-item-button =
+    .title = Etsi nykyinen sis盲llyksen kohta
+pdfjs-current-outline-item-button-label = Nykyinen sis盲llyksen kohta
+pdfjs-findbar-button =
+    .title = Etsi dokumentista
+pdfjs-findbar-button-label = Etsi
+pdfjs-additional-layers = Lis盲tasot
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Sivu { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Pienoiskuva sivusta { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Valitse sivu { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Sivu { $page }/{ $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Etsi
+    .placeholder = Etsi dokumentista鈥�
+pdfjs-find-previous-button =
+    .title = Etsi hakusanan edellinen osuma
+pdfjs-find-previous-button-label = Edellinen
+pdfjs-find-next-button =
+    .title = Etsi hakusanan seuraava osuma
+pdfjs-find-next-button-label = Seuraava
+pdfjs-find-highlight-checkbox = Korosta kaikki
+pdfjs-find-match-case-checkbox-label = Huomioi kirjainkoko
+pdfjs-find-match-diacritics-checkbox-label = Erota tarkkeet
+pdfjs-find-entire-word-checkbox-label = Kokonaiset sanat
+pdfjs-find-reached-top = P盲盲stiin dokumentin alkuun, jatketaan lopusta
+pdfjs-find-reached-bottom = P盲盲stiin dokumentin loppuun, jatketaan alusta
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } / { $total } osuma
+       *[other] { $current } / { $total } osumaa
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Yli { $limit } osuma
+       *[other] Yli { $limit } osumaa
+    }
+pdfjs-find-not-found = Hakusanaa ei l枚ytynyt
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Sivun leveys
+pdfjs-page-scale-fit = Koko sivu
+pdfjs-page-scale-auto = Automaattinen suurennus
+pdfjs-page-scale-actual = Todellinen koko
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale } %
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Sivu { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Tapahtui virhe ladattaessa PDF-tiedostoa.
+pdfjs-invalid-file-error = Virheellinen tai vioittunut PDF-tiedosto.
+pdfjs-missing-file-error = Puuttuva PDF-tiedosto.
+pdfjs-unexpected-response-error = Odottamaton vastaus palvelimelta.
+pdfjs-rendering-error = Tapahtui virhe piirrett盲ess盲 sivua.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type }-merkint盲]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Kirjoita PDF-tiedoston salasana.
+pdfjs-password-invalid = Virheellinen salasana. Yrit盲 uudestaan.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Peruuta
+pdfjs-web-fonts-disabled = Verkkosivujen omat kirjasinlajit on estetty: ei voida k盲ytt盲盲 upotettuja PDF-kirjasinlajeja.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Teksti
+pdfjs-editor-color-picker-free-text-input =
+    .title = Muuta tekstin v盲ri盲
+pdfjs-editor-free-text-button-label = Teksti
+pdfjs-editor-ink-button =
+    .title = Piirros
+pdfjs-editor-color-picker-ink-input =
+    .title = Vaihda piirustuksen v盲ri盲
+pdfjs-editor-ink-button-label = Piirros
+pdfjs-editor-stamp-button =
+    .title = Lis盲盲 tai muokkaa kuvia
+pdfjs-editor-stamp-button-label = Lis盲盲 tai muokkaa kuvia
+pdfjs-editor-highlight-button =
+    .title = Korostus
+pdfjs-editor-highlight-button-label = Korostus
+pdfjs-highlight-floating-button1 =
+    .title = Korostus
+    .aria-label = Korostus
+pdfjs-highlight-floating-button-label = Korostus
+pdfjs-comment-floating-button =
+    .title = Kommentti
+    .aria-label = Kommentti
+pdfjs-comment-floating-button-label = Kommentti
+pdfjs-editor-comment-button =
+    .title = Kommentti
+    .aria-label = Kommentti
+pdfjs-editor-comment-button-label = Kommentti
+pdfjs-editor-signature-button =
+    .title = Lis盲盲 allekirjoitus
+pdfjs-editor-signature-button-label = Lis盲盲 allekirjoitus
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Korostusmuokkain
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Piirustusmuokkain
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Allekirjoituksen muokkain: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Kuvamuokkain
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Poista piirros
+pdfjs-editor-remove-freetext-button =
+    .title = Poista teksti
+pdfjs-editor-remove-stamp-button =
+    .title = Poista kuva
+pdfjs-editor-remove-highlight-button =
+    .title = Poista korostus
+pdfjs-editor-remove-signature-button =
+    .title = Poista allekirjoitus
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = V盲ri
+pdfjs-editor-free-text-size-input = Koko
+pdfjs-editor-ink-color-input = V盲ri
+pdfjs-editor-ink-thickness-input = Paksuus
+pdfjs-editor-ink-opacity-input = Peitt盲vyys
+pdfjs-editor-stamp-add-image-button =
+    .title = Lis盲盲 kuva
+pdfjs-editor-stamp-add-image-button-label = Lis盲盲 kuva
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Paksuus
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Muuta paksuutta korostaessasi muita kohteita kuin teksti盲
+pdfjs-editor-add-signature-container =
+    .aria-label = Allekirjoituss盲盲timet ja tallennetut allekirjoitukset
+pdfjs-editor-signature-add-signature-button =
+    .title = Lis盲盲 uusi allekirjoitus
+pdfjs-editor-signature-add-signature-button-label = Lis盲盲 uusi allekirjoitus
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Tallennettu allekirjoitus: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Tekstimuokkain
+    .default-content = Aloita kirjoittaminen鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Kommentti
+       *[other] Kommenttia
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Sulje sivupaneeli
+    .aria-label = Sulje sivupaneeli
+pdfjs-editor-comments-sidebar-close-button-label = Sulje sivupaneeli
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = N盲etk枚 jotain huomionarvoista? Korosta se ja j盲t盲 kommentti.
+pdfjs-editor-comments-sidebar-no-comments-link = Lue lis盲盲
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Vaihtoehtoinen teksti
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Muokkaa vaihtoehtoista teksti盲
+pdfjs-editor-alt-text-dialog-label = Valitse vaihtoehto
+pdfjs-editor-alt-text-dialog-description = Vaihtoehtoinen teksti ("alt-teksti") auttaa ihmisi盲, jotka eiv盲t n盲e kuvaa tai kun kuva ei lataudu.
+pdfjs-editor-alt-text-add-description-label = Lis盲盲 kuvaus
+pdfjs-editor-alt-text-add-description-description = Pyri 1-2 lauseeseen, jotka kuvaavat aihetta, ymp盲rist枚盲 tai toimintaa.
+pdfjs-editor-alt-text-mark-decorative-label = Merkitse koristeelliseksi
+pdfjs-editor-alt-text-mark-decorative-description = T盲t盲 k盲ytet盲盲n koristekuville, kuten reunuksille tai vesileimoille.
+pdfjs-editor-alt-text-cancel-button = Peruuta
+pdfjs-editor-alt-text-save-button = Tallenna
+pdfjs-editor-alt-text-decorative-tooltip = Merkitty koristeelliseksi
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Esimerkiksi "Nuori mies istuu p枚yt盲盲n sy枚m盲盲n aterian"
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Vaihtoehtoinen teksti
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Vasen yl盲kulma - muuta kokoa
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Ylh盲盲ll盲 keskell盲 - muuta kokoa
+pdfjs-editor-resizer-top-right =
+    .aria-label = Oikea yl盲kulma - muuta kokoa
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Keskell盲 oikealla - muuta kokoa
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Oikea alakulma - muuta kokoa
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Alhaalla keskell盲 - muuta kokoa
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Vasen alakulma - muuta kokoa
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Keskell盲 vasemmalla - muuta kokoa
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Korostusv盲ri
+pdfjs-editor-colorpicker-button =
+    .title = Vaihda v盲ri
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = V盲rivalinnat
+pdfjs-editor-colorpicker-yellow =
+    .title = Keltainen
+pdfjs-editor-colorpicker-green =
+    .title = Vihre盲
+pdfjs-editor-colorpicker-blue =
+    .title = Sininen
+pdfjs-editor-colorpicker-pink =
+    .title = Pinkki
+pdfjs-editor-colorpicker-red =
+    .title = Punainen
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = N盲yt盲 kaikki
+pdfjs-editor-highlight-show-all-button =
+    .title = N盲yt盲 kaikki
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Muokkaa vaihtoehtoista teksti盲 (kuvan kuvaus)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Lis盲盲 vaihtoehtoinen teksti (kuvan kuvaus)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Kirjoita kuvaus t盲h盲n鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Lyhyt kuvaus ihmisille, jotka eiv盲t n盲e kuvaa tai kun kuva ei lataudu.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = T盲m盲 vaihtoehtoinen teksti luotiin automaattisesti, ja se voi olla ep盲tarkka.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Lue lis盲盲
+pdfjs-editor-new-alt-text-create-automatically-button-label = Luo vaihtoehtoinen teksti automaattisesti
+pdfjs-editor-new-alt-text-not-now-button = Ei nyt
+pdfjs-editor-new-alt-text-error-title = Vaihtoehtoteksti盲 ei voitu luoda automaattisesti
+pdfjs-editor-new-alt-text-error-description = Kirjoita oma vaihtoehtoinen teksti tai yrit盲 my枚hemmin uudelleen.
+pdfjs-editor-new-alt-text-error-close-button = Sulje
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Ladataan vaihtoehtoisen tekstin teko盲lymallia ({ $downloadedSize } / { $totalSize } Mt)
+    .aria-valuetext = Ladataan vaihtoehtoisen tekstin teko盲lymallia ({ $downloadedSize } / { $totalSize } Mt)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Vaihtoehtoinen teksti lis盲tty
+pdfjs-editor-new-alt-text-added-button-label = Vaihtoehtoinen teksti lis盲tty
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Vaihtoehtoinen teksti puuttuu
+pdfjs-editor-new-alt-text-missing-button-label = Vaihtoehtoinen teksti puuttuu
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Tarkista vaihtoehtoinen teksti
+pdfjs-editor-new-alt-text-to-review-button-label = Tarkista vaihtoehtoinen teksti
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Luotu automaattisesti: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Kuvan vaihtoehtoisen tekstin asetukset
+pdfjs-image-alt-text-settings-button-label = Kuvan vaihtoehtoisen tekstin asetukset
+pdfjs-editor-alt-text-settings-dialog-label = Kuvan vaihtoehtoisen tekstin asetukset
+pdfjs-editor-alt-text-settings-automatic-title = Automaattinen vaihtoehtoinen teksti
+pdfjs-editor-alt-text-settings-create-model-button-label = Luo vaihtoehtoinen teksti automaattisesti
+pdfjs-editor-alt-text-settings-create-model-description = Ehdottaa kuvauksia, jotka auttavat ihmisi盲, jotka eiv盲t n盲e kuvaa tai kun kuva ei lataudu.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Vaihtoehtoisen tekstin teko盲lymalli ({ $totalSize } Mt)
+pdfjs-editor-alt-text-settings-ai-model-description = Toimii paikallisesti laitteellasi, joten tietosi pysyv盲t yksityisin盲. Vaadittu automaattiselle vaihtoehtoiselle tekstille.
+pdfjs-editor-alt-text-settings-delete-model-button = Poista
+pdfjs-editor-alt-text-settings-download-model-button = Lataa
+pdfjs-editor-alt-text-settings-downloading-model-button = Ladataan鈥�
+pdfjs-editor-alt-text-settings-editor-title = Vaihtoehtoisen tekstin muokkain
+pdfjs-editor-alt-text-settings-show-dialog-button-label = N盲yt盲 vaihtoehtoisen tekstin muokkain heti, kun lis盲盲t kuvan
+pdfjs-editor-alt-text-settings-show-dialog-description = Auttaa varmistamaan, ett盲 kaikissa kuvissasi on vaihtoehtoinen teksti.
+pdfjs-editor-alt-text-settings-close-button = Sulje
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Korostus lis盲tty
+pdfjs-editor-freetext-added-alert = Teksti lis盲tty
+pdfjs-editor-ink-added-alert = Piirustus lis盲tty
+pdfjs-editor-stamp-added-alert = Kuva lis盲tty
+pdfjs-editor-signature-added-alert = Allekirjoitus lis盲tty
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Korostus poistettu
+pdfjs-editor-undo-bar-message-freetext = Teksti poistettu
+pdfjs-editor-undo-bar-message-ink = Piirustus poistettu
+pdfjs-editor-undo-bar-message-stamp = Kuva poistettu
+pdfjs-editor-undo-bar-message-signature = Allekirjoitus poistettu
+pdfjs-editor-undo-bar-message-comment = Kommentti poistettu
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } merkint盲 poistettu
+       *[other] { $count } merkint盲盲 poistettu
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Kumoa
+pdfjs-editor-undo-bar-undo-button-label = Kumoa
+pdfjs-editor-undo-bar-close-button =
+    .title = Sulje
+pdfjs-editor-undo-bar-close-button-label = Sulje
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = T盲m盲n ikkunan avulla k盲ytt盲j盲 voi luoda allekirjoituksen PDF-asiakirjaan lis盲tt盲v盲ksi. K盲ytt盲j盲 voi muokata nime盲 (joka toimii my枚s vaihtoehtoisena tekstin盲) ja valinnaisesti tallentaa allekirjoituksen toistuvaa k盲ytt枚盲 varten.
+pdfjs-editor-add-signature-dialog-title = Lis盲盲 allekirjoitus
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Kirjoita
+    .title = Kirjoita
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Piirr盲
+    .title = Piirr盲
+pdfjs-editor-add-signature-image-button = Kuva
+    .title = Kuva
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Kirjoita allekirjoituksesi
+    .placeholder = Kirjoita allekirjoituksesi
+pdfjs-editor-add-signature-draw-placeholder = Piirr盲 allekirjoituksesi
+pdfjs-editor-add-signature-draw-thickness-range-label = Paksuus
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Piirustuksen paksuus: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = L盲het盲 tiedosto vet盲m盲ll盲 se t盲h盲n
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Tai selaa kuvatiedostoja
+       *[other] Tai selaa kuvatiedostoja
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Kuvaus (vaihtoehtoinen teksti)
+pdfjs-editor-add-signature-description-input =
+    .title = Kuvaus (vaihtoehtoinen teksti)
+pdfjs-editor-add-signature-description-default-when-drawing = Allekirjoitus
+pdfjs-editor-add-signature-clear-button-label = Tyhjenn盲 allekirjoitus
+pdfjs-editor-add-signature-clear-button =
+    .title = Tyhjenn盲 allekirjoitus
+pdfjs-editor-add-signature-save-checkbox = Tallenna allekirjoitus
+pdfjs-editor-add-signature-save-warning-message = Olet saavuttanut viiden tallennetun allekirjoituksen rajan. Poista yksi s盲盲st盲盲ksesi lis盲盲.
+pdfjs-editor-add-signature-image-upload-error-title = Kuvaa ei voitu l盲hett盲盲
+pdfjs-editor-add-signature-image-upload-error-description = Tarkista verkkoyhteyden tila tai kokeile toista kuvaa.
+pdfjs-editor-add-signature-image-no-data-error-title = T盲t盲 kuvaa ei voida muuntaa allekirjoitukseksi
+pdfjs-editor-add-signature-image-no-data-error-description = Yrit盲 l盲hett盲盲 eri kuva.
+pdfjs-editor-add-signature-error-close-button = Sulje
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Peruuta
+pdfjs-editor-add-signature-add-button = Lis盲盲
+pdfjs-editor-edit-signature-update-button = P盲ivit盲
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Muokkaa kommenttia
+pdfjs-editor-edit-comment-popup-button =
+    .title = Muokkaa kommenttia
+pdfjs-editor-delete-comment-popup-button-label = Poista kommentti
+pdfjs-editor-delete-comment-popup-button =
+    .title = Poista kommentti
+pdfjs-show-comment-button =
+    .title = N盲yt盲 kommentti
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Muokkaa kommenttia
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = P盲ivit盲
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Lis盲盲 kommentti
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Lis盲盲
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Aloita kirjoittaminen鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Peruuta
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Lis盲盲 kommentti
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = N盲yt盲/piilota sivupaneeli (dokumentissa on pienoiskuvat/sis盲llys/liitteit盲/tasoja)
+pdfjs-toggle-views-manager-button1-label = Hallitse sivuja
+pdfjs-views-manager-sidebar =
+    .aria-label = Sivupaneeli
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Sivupaneelin koon muuttaja
+pdfjs-views-manager-view-selector-button =
+    .title = N盲kym盲t
+pdfjs-views-manager-view-selector-button-label = N盲kym盲t
+pdfjs-views-manager-pages-title = Sivut
+pdfjs-views-manager-outlines-title1 = Dokumentin sis盲llys
+    .title = Dokumentin sis盲llys (napsauta kahdesti laajentaaksesi/supistaaksesi kohteet)
+pdfjs-views-manager-attachments-title = Liitteet
+pdfjs-views-manager-layers-title1 = Tasot
+    .title = Tasot (napsauta kahdesti nollataksesi tasot niiden oletustilaan)
+pdfjs-views-manager-pages-option-label = Sivut
+pdfjs-views-manager-outlines-option-label = Dokumentin sis盲llys
+pdfjs-views-manager-attachments-option-label = Liitteet
+pdfjs-views-manager-layers-option-label = Tasot
+pdfjs-views-manager-add-file-button =
+    .title = Lis盲盲 tiedosto
+pdfjs-views-manager-add-file-button-label = Lis盲盲 tiedosto
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } valittu
+       *[other] { $count } valittu
+    }
+pdfjs-views-manager-pages-status-none-action-label = Valitse sivut
+pdfjs-views-manager-pages-status-action-button-label = Hallitse
+pdfjs-views-manager-pages-status-copy-button-label = Kopioi
+pdfjs-views-manager-pages-status-cut-button-label = Leikkaa
+pdfjs-views-manager-pages-status-delete-button-label = Poista
+pdfjs-views-manager-pages-status-export-selected-button-label = Vie valitut鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 sivu leikattu
+       *[other] { $count } sivua leikattu
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 sivu kopioitu
+       *[other] { $count } sivua kopioitu
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 sivu poistettu
+       *[other] { $count } sivua poistettu
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Tiedostoa valmistellaan鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = L盲hetet盲盲n tiedostoa鈥�
+pdfjs-views-manager-status-warning-cut-label = Leikkaaminen ep盲onnistui. P盲ivit盲 sivu ja yrit盲 uudelleen.
+pdfjs-views-manager-status-warning-copy-label = Kopiointi ep盲onnistui. P盲ivit盲 sivu ja yrit盲 uudelleen.
+pdfjs-views-manager-status-warning-delete-label = Poisto ep盲onnistui. P盲ivit盲 sivu ja yrit盲 uudelleen.
+pdfjs-views-manager-status-warning-save-label = Tallentaminen ep盲onnistui. P盲ivit盲 sivu ja yrit盲 uudelleen.
+pdfjs-views-manager-status-undo-button-label = Kumoa
+pdfjs-views-manager-status-done-button-label = Valmis
+pdfjs-views-manager-status-close-button =
+    .title = Sulje
+pdfjs-views-manager-status-close-button-label = Sulje
+pdfjs-views-manager-paste-button-label = Liit盲
+pdfjs-views-manager-paste-button-before =
+    .title = Liit盲 ennen ensimm盲ist盲 sivua
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Liit盲 sivun { $page } j盲lkeen
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = UUTTA
+pdfjs-views-manager-waiting-for-file = L盲hetet盲盲n tiedostoa鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Hallitse sivuja
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Poista tallennettu allekirjoitus
+pdfjs-editor-delete-signature-button-label1 = Poista tallennettu allekirjoitus
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Muokkaa kuvausta
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Muokkaa kuvausta
diff --git a/public/pdfjs/web/locale/fr/viewer.ftl b/public/pdfjs/web/locale/fr/viewer.ftl
new file mode 100644
index 0000000..0fc4706
--- /dev/null
+++ b/public/pdfjs/web/locale/fr/viewer.ftl
@@ -0,0 +1,743 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Page pr茅c茅dente
+pdfjs-previous-button-label = Pr茅c茅dent
+pdfjs-next-button =
+    .title = Page suivante
+pdfjs-next-button-label = Suivant
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Page
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = sur { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } sur { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom arri猫re
+pdfjs-zoom-out-button-label = Zoom arri猫re
+pdfjs-zoom-in-button =
+    .title = Zoom avant
+pdfjs-zoom-in-button-label = Zoom avant
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Basculer en mode pr茅sentation
+pdfjs-presentation-mode-button-label = Mode pr茅sentation
+pdfjs-open-file-button =
+    .title = Ouvrir le fichier
+pdfjs-open-file-button-label = Ouvrir le fichier
+pdfjs-print-button =
+    .title = Imprimer
+pdfjs-print-button-label = Imprimer
+pdfjs-save-button =
+    .title = Enregistrer
+pdfjs-save-button-label = Enregistrer
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = T茅l茅charger
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = T茅l茅charger
+pdfjs-bookmark-button =
+    .title = Page courante (montrer l鈥檃dresse de la page courante)
+pdfjs-bookmark-button-label = Page courante
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Outils
+pdfjs-tools-button-label = Outils
+pdfjs-first-page-button =
+    .title = Aller 脿 la premi猫re page
+pdfjs-first-page-button-label = Aller 脿 la premi猫re page
+pdfjs-last-page-button =
+    .title = Aller 脿 la derni猫re page
+pdfjs-last-page-button-label = Aller 脿 la derni猫re page
+pdfjs-page-rotate-cw-button =
+    .title = Rotation horaire
+pdfjs-page-rotate-cw-button-label = Rotation horaire
+pdfjs-page-rotate-ccw-button =
+    .title = Rotation antihoraire
+pdfjs-page-rotate-ccw-button-label = Rotation antihoraire
+pdfjs-cursor-text-select-tool-button =
+    .title = Activer l鈥檕util de s茅lection de texte
+pdfjs-cursor-text-select-tool-button-label = Outil de s茅lection de texte
+pdfjs-cursor-hand-tool-button =
+    .title = Activer l鈥檕util main
+pdfjs-cursor-hand-tool-button-label = Outil main
+pdfjs-scroll-page-button =
+    .title = Utiliser le d茅filement par page
+pdfjs-scroll-page-button-label = D茅filement par page
+pdfjs-scroll-vertical-button =
+    .title = Utiliser le d茅filement vertical
+pdfjs-scroll-vertical-button-label = D茅filement vertical
+pdfjs-scroll-horizontal-button =
+    .title = Utiliser le d茅filement horizontal
+pdfjs-scroll-horizontal-button-label = D茅filement horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Utiliser le d茅filement par bloc
+pdfjs-scroll-wrapped-button-label = D茅filement par bloc
+pdfjs-spread-none-button =
+    .title = Ne pas afficher les pages deux 脿 deux
+pdfjs-spread-none-button-label = Pas de double affichage
+pdfjs-spread-odd-button =
+    .title = Afficher les pages par deux, impaires 脿 gauche
+pdfjs-spread-odd-button-label = Doubles pages, impaires 脿 gauche
+pdfjs-spread-even-button =
+    .title = Afficher les pages par deux, paires 脿 gauche
+pdfjs-spread-even-button-label = Doubles pages, paires 脿 gauche
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propri茅t茅s du document鈥�
+pdfjs-document-properties-button-label = Propri茅t茅s du document鈥�
+pdfjs-document-properties-file-name = Nom du fichier聽:
+pdfjs-document-properties-file-size = Taille du fichier聽:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) }聽Ko ({ $b }聽octets)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) }聽Mo ({ $b }聽octets)
+pdfjs-document-properties-title = Titre聽:
+pdfjs-document-properties-author = Auteur聽:
+pdfjs-document-properties-subject = Sujet聽:
+pdfjs-document-properties-keywords = Mots-cl茅s聽:
+pdfjs-document-properties-creation-date = Date de cr茅ation聽:
+pdfjs-document-properties-modification-date = Modifi茅 le聽:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Cr茅茅 par聽:
+pdfjs-document-properties-producer = Outil de conversion PDF聽:
+pdfjs-document-properties-version = Version PDF聽:
+pdfjs-document-properties-page-count = Nombre de pages聽:
+pdfjs-document-properties-page-size = Taille de la page聽:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portrait
+pdfjs-document-properties-page-size-orientation-landscape = paysage
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = lettre
+pdfjs-document-properties-page-size-name-legal = document juridique
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height }聽{ $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height }聽{ $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Affichage rapide des pages web聽:
+pdfjs-document-properties-linearized-yes = Oui
+pdfjs-document-properties-linearized-no = Non
+pdfjs-document-properties-close-button = Fermer
+
+## Print
+
+pdfjs-print-progress-message = Pr茅paration du document pour l鈥檌mpression鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }聽%
+pdfjs-print-progress-close-button = Annuler
+pdfjs-printing-not-supported = Attention聽: l鈥檌mpression n鈥檈st pas totalement prise en charge par ce navigateur.
+pdfjs-printing-not-ready = Attention聽: le PDF n鈥檈st pas enti猫rement charg茅 pour pouvoir l鈥檌mprimer.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Afficher/Masquer le panneau lat茅ral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Afficher/Masquer le panneau lat茅ral (le document contient des signets/pi猫ces jointes/calques)
+pdfjs-toggle-sidebar-button-label = Afficher/Masquer le panneau lat茅ral
+pdfjs-document-outline-button =
+    .title = Afficher les signets du document (double-cliquer pour d茅velopper/r茅duire tous les 茅l茅ments)
+pdfjs-document-outline-button-label = Signets du document
+pdfjs-attachments-button =
+    .title = Afficher les pi猫ces jointes
+pdfjs-attachments-button-label = Pi猫ces jointes
+pdfjs-layers-button =
+    .title = Afficher les calques (double-cliquer pour r茅initialiser tous les calques 脿 l鈥櫭﹖at par d茅faut)
+pdfjs-layers-button-label = Calques
+pdfjs-thumbs-button =
+    .title = Afficher les vignettes
+pdfjs-thumbs-button-label = Vignettes
+pdfjs-current-outline-item-button =
+    .title = Trouver l鈥櫭﹍茅ment de plan actuel
+pdfjs-current-outline-item-button-label = 脡l茅ment de plan actuel
+pdfjs-findbar-button =
+    .title = Rechercher dans le document
+pdfjs-findbar-button-label = Rechercher
+pdfjs-additional-layers = Calques additionnels
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Page { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Vignette de la page { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = S茅lectionner la page { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Page { $page } sur { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Rechercher
+    .placeholder = Rechercher dans le document鈥�
+pdfjs-find-previous-button =
+    .title = Trouver l鈥檕ccurrence pr茅c茅dente de l鈥檈xpression
+pdfjs-find-previous-button-label = Pr茅c茅dent
+pdfjs-find-next-button =
+    .title = Trouver la prochaine occurrence de l鈥檈xpression
+pdfjs-find-next-button-label = Suivant
+pdfjs-find-highlight-checkbox = Tout surligner
+pdfjs-find-match-case-checkbox-label = Respecter la casse
+pdfjs-find-match-diacritics-checkbox-label = Respecter les accents et diacritiques
+pdfjs-find-entire-word-checkbox-label = Mots entiers
+pdfjs-find-reached-top = Haut de la page atteint, poursuite depuis la fin
+pdfjs-find-reached-bottom = Bas de la page atteint, poursuite au d茅but
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count = Occurrence聽{ $current } sur聽{ $total }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Plus d鈥檣 $limit }聽occurrence
+       *[other] Plus de { $limit }聽occurrences
+    }
+pdfjs-find-not-found = Expression non trouv茅e
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Pleine largeur
+pdfjs-page-scale-fit = Page enti猫re
+pdfjs-page-scale-auto = Zoom automatique
+pdfjs-page-scale-actual = Taille r茅elle
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }聽%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Page { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Une erreur s鈥檈st produite lors du chargement du fichier PDF.
+pdfjs-invalid-file-error = Fichier PDF invalide ou corrompu.
+pdfjs-missing-file-error = Fichier PDF manquant.
+pdfjs-unexpected-response-error = R茅ponse inattendue du serveur.
+pdfjs-rendering-error = Une erreur s鈥檈st produite lors de l鈥檃ffichage de la page.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Annotation { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Veuillez saisir le mot de passe pour ouvrir ce fichier PDF.
+pdfjs-password-invalid = Mot de passe incorrect. Veuillez r茅essayer.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Annuler
+pdfjs-web-fonts-disabled = Les polices web sont d茅sactiv茅es聽: impossible d鈥檜tiliser les polices int茅gr茅es au PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texte
+pdfjs-editor-color-picker-free-text-input =
+    .title = Changer la couleur du texte
+pdfjs-editor-free-text-button-label = Texte
+pdfjs-editor-ink-button =
+    .title = Dessiner
+pdfjs-editor-color-picker-ink-input =
+    .title = Changer la couleur pour dessiner
+pdfjs-editor-ink-button-label = Dessiner
+pdfjs-editor-stamp-button =
+    .title = Ajouter ou modifier des images
+pdfjs-editor-stamp-button-label = Ajouter ou modifier des images
+pdfjs-editor-highlight-button =
+    .title = Surligner
+pdfjs-editor-highlight-button-label = Surligner
+pdfjs-highlight-floating-button1 =
+    .title = Surligner
+    .aria-label = Surligner
+pdfjs-highlight-floating-button-label = Surligner
+pdfjs-comment-floating-button =
+    .title = Commenter
+    .aria-label = Commenter
+pdfjs-comment-floating-button-label = Commenter
+pdfjs-editor-comment-button =
+    .title = Commenter
+    .aria-label = Commenter
+pdfjs-editor-comment-button-label = Commenter
+pdfjs-editor-signature-button =
+    .title = Ajouter une signature
+pdfjs-editor-signature-button-label = Ajouter une signature
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 脡diteur de surlignage
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 脡diteur de dessins
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 脡diteur de signature聽: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 脡diteur d鈥檌mages
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Supprimer le dessin
+pdfjs-editor-remove-freetext-button =
+    .title = Supprimer le texte
+pdfjs-editor-remove-stamp-button =
+    .title = Supprimer l鈥檌mage
+pdfjs-editor-remove-highlight-button =
+    .title = Supprimer le surlignage
+pdfjs-editor-remove-signature-button =
+    .title = Retirer la signature
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Couleur
+pdfjs-editor-free-text-size-input = Taille
+pdfjs-editor-ink-color-input = Couleur
+pdfjs-editor-ink-thickness-input = 脡paisseur
+pdfjs-editor-ink-opacity-input = Opacit茅
+pdfjs-editor-stamp-add-image-button =
+    .title = Ajouter une image
+pdfjs-editor-stamp-add-image-button-label = Ajouter une image
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 脡paisseur
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Modifier l鈥櫭﹑aisseur pour le surlignage d鈥櫭﹍茅ments non textuels
+pdfjs-editor-add-signature-container =
+    .aria-label = Contr么les de signature et signatures enregistr茅es
+pdfjs-editor-signature-add-signature-button =
+    .title = Ajouter une nouvelle signature
+pdfjs-editor-signature-add-signature-button-label = Ajouter une nouvelle signature
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Signature enregistr茅e聽: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 脡diteur de texte
+    .default-content = Commencez 脿 茅crire鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Commentaire
+       *[other] Commentaires
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Fermer le panneau lat茅ral
+    .aria-label = Fermer le panneau lat茅ral
+pdfjs-editor-comments-sidebar-close-button-label = Fermer le panneau lat茅ral
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Vous remarquez quelque chose d鈥檌nt茅ressant聽? Mettez-le en surbrillance et ajoutez un commentaire.
+pdfjs-editor-comments-sidebar-no-comments-link = En savoir plus
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texte alternatif
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Modifier le texte alternatif
+pdfjs-editor-alt-text-dialog-label = S茅lectionnez une option
+pdfjs-editor-alt-text-dialog-description = Le texte alternatif est utile lorsque des personnes ne peuvent pas voir l鈥檌mage ou que l鈥檌mage ne se charge pas.
+pdfjs-editor-alt-text-add-description-label = Ajouter une description
+pdfjs-editor-alt-text-add-description-description = Il est conseill茅 de r茅diger une ou deux phrases d茅crivant le sujet, le cadre ou les actions.
+pdfjs-editor-alt-text-mark-decorative-label = Marquer comme d茅corative
+pdfjs-editor-alt-text-mark-decorative-description = Cette option est utilis茅e pour les images d茅coratives, comme les bordures ou les filigranes.
+pdfjs-editor-alt-text-cancel-button = Annuler
+pdfjs-editor-alt-text-save-button = Enregistrer
+pdfjs-editor-alt-text-decorative-tooltip = Marqu茅e comme d茅corative
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Par exemple, 芦聽Un jeune homme est assis 脿 une table pour prendre un repas聽禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texte alternatif
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Coin sup茅rieur gauche 鈥� redimensionner
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Milieu haut 鈥� redimensionner
+pdfjs-editor-resizer-top-right =
+    .aria-label = Coin sup茅rieur droit 鈥� redimensionner
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Milieu droit 鈥� redimensionner
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Coin inf茅rieur droit 鈥� redimensionner
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Centre bas 鈥� redimensionner
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Coin inf茅rieur gauche 鈥� redimensionner
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Milieu gauche 鈥� redimensionner
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Couleur de surlignage
+pdfjs-editor-colorpicker-button =
+    .title = Changer de couleur
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Choix de couleurs
+pdfjs-editor-colorpicker-yellow =
+    .title = Jaune
+pdfjs-editor-colorpicker-green =
+    .title = Vert
+pdfjs-editor-colorpicker-blue =
+    .title = Bleu
+pdfjs-editor-colorpicker-pink =
+    .title = Rose
+pdfjs-editor-colorpicker-red =
+    .title = Rouge
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Tout afficher
+pdfjs-editor-highlight-show-all-button =
+    .title = Tout afficher
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Modifier le texte alternatif (description de l鈥檌mage)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Ajouter du texte alternatif (description de l鈥檌mage)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = R茅digez votre description ici鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Courte description pour les personnes qui ne peuvent pas voir l鈥檌mage ou lorsque l鈥檌mage ne se charge pas.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Ce texte alternatif a 茅t茅 cr茅茅 automatiquement et peut 锚tre inexact.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = En savoir plus
+pdfjs-editor-new-alt-text-create-automatically-button-label = Cr茅er automatiquement le texte alternatif
+pdfjs-editor-new-alt-text-not-now-button = Pas maintenant
+pdfjs-editor-new-alt-text-error-title = Impossible de cr茅er automatiquement le texte alternatif
+pdfjs-editor-new-alt-text-error-description = Veuillez r茅diger votre propre texte alternatif ou r茅essayer plus tard.
+pdfjs-editor-new-alt-text-error-close-button = Fermer
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = T茅l茅chargement du mod猫le d鈥橧A de texte alternatif ({ $downloadedSize } sur { $totalSize }聽Mo)
+    .aria-valuetext = T茅l茅chargement du mod猫le d鈥橧A de texte alternatif ({ $downloadedSize } sur { $totalSize }聽Mo)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Texte alternatif ajout茅
+pdfjs-editor-new-alt-text-added-button-label = Texte alternatif ajout茅
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Texte alternatif manquant
+pdfjs-editor-new-alt-text-missing-button-label = Texte alternatif manquant
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = R茅viser le texte alternatif
+pdfjs-editor-new-alt-text-to-review-button-label = R茅viser le texte alternatif
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Cr茅茅 automatiquement聽: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Param猫tres du texte alternatif des images
+pdfjs-image-alt-text-settings-button-label = Param猫tres du texte alternatif des images
+pdfjs-editor-alt-text-settings-dialog-label = Param猫tres du texte alternatif des images
+pdfjs-editor-alt-text-settings-automatic-title = Texte alternatif automatique
+pdfjs-editor-alt-text-settings-create-model-button-label = Cr茅er automatiquement le texte alternatif
+pdfjs-editor-alt-text-settings-create-model-description = Sugg猫re des descriptions pour aider les personnes qui ne peuvent pas voir l鈥檌mage ou lorsque l鈥檌mage ne se charge pas.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Mod猫le d鈥橧A de texte alternatif ({ $totalSize }聽Mo)
+pdfjs-editor-alt-text-settings-ai-model-description = Fonctionne localement sur votre appareil, vos donn茅es restent priv茅es. Obligatoire pour la g茅n茅ration automatique de texte alternatif.
+pdfjs-editor-alt-text-settings-delete-model-button = Supprimer
+pdfjs-editor-alt-text-settings-download-model-button = T茅l茅charger
+pdfjs-editor-alt-text-settings-downloading-model-button = T茅l茅chargement鈥�
+pdfjs-editor-alt-text-settings-editor-title = 脡diteur de texte alternatif
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Afficher l鈥櫭ヾiteur de texte alternatif imm茅diatement lors de l鈥檃jout d鈥檜ne image
+pdfjs-editor-alt-text-settings-show-dialog-description = Vous aide 脿 vous assurer que toutes vos images ont du texte alternatif.
+pdfjs-editor-alt-text-settings-close-button = Fermer
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Surlignage ajout茅
+pdfjs-editor-freetext-added-alert = Texte ajout茅
+pdfjs-editor-ink-added-alert = Dessin ajout茅
+pdfjs-editor-stamp-added-alert = Image ajout茅e
+pdfjs-editor-signature-added-alert = Signature ajout茅e
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Surlignage supprim茅
+pdfjs-editor-undo-bar-message-freetext = Texte supprim茅
+pdfjs-editor-undo-bar-message-ink = Dessin supprim茅
+pdfjs-editor-undo-bar-message-stamp = Image supprim茅e
+pdfjs-editor-undo-bar-message-signature = Signature retir茅e
+pdfjs-editor-undo-bar-message-comment = Commentaire supprim茅
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count }聽annotation supprim茅e
+       *[other] { $count }聽annotations supprim茅es
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Annuler
+pdfjs-editor-undo-bar-undo-button-label = Annuler
+pdfjs-editor-undo-bar-close-button =
+    .title = Fermer
+pdfjs-editor-undo-bar-close-button-label = Fermer
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Cette fen锚tre permet de cr茅er une signature 脿 ajouter 脿 un document au format PDF. Il est possible d鈥檈n modifier le nom (qui sert 茅galement de texte alternatif) et, 茅ventuellement, de l鈥檈nregistrer pour une utilisation r茅p茅t茅e.
+pdfjs-editor-add-signature-dialog-title = Ajout d鈥檜ne signature
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Saisir
+    .title = Saisir au clavier
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Dessiner
+    .title = Dessiner
+pdfjs-editor-add-signature-image-button = Image
+    .title = Image
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Saisissez votre signature
+    .placeholder = Saisissez votre signature
+pdfjs-editor-add-signature-draw-placeholder = Tracez votre signature
+pdfjs-editor-add-signature-draw-thickness-range-label = 脡paisseur
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 脡paisseur du trait聽: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = D茅posez un fichier ici pour l鈥檈nvoyer
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ou choisissez parmi les fichiers image
+       *[other] Ou parcourez les fichiers image
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Description (texte alternatif)
+pdfjs-editor-add-signature-description-input =
+    .title = Description (texte alternatif)
+pdfjs-editor-add-signature-description-default-when-drawing = Signature
+pdfjs-editor-add-signature-clear-button-label = Effacer la signature
+pdfjs-editor-add-signature-clear-button =
+    .title = Effacer la signature
+pdfjs-editor-add-signature-save-checkbox = Enregistrer la signature
+pdfjs-editor-add-signature-save-warning-message = Vous avez atteint la limite de 5聽signatures enregistr茅es. Supprimez-en une pour en enregistrer une autre.
+pdfjs-editor-add-signature-image-upload-error-title = Impossible d鈥檈nvoyer l鈥檌mage
+pdfjs-editor-add-signature-image-upload-error-description = V茅rifiez votre connexion r茅seau ou essayez avec une autre image.
+pdfjs-editor-add-signature-image-no-data-error-title = Impossible de convertir cette image en signature
+pdfjs-editor-add-signature-image-no-data-error-description = Veuillez essayer d鈥檈nvoyer une autre image.
+pdfjs-editor-add-signature-error-close-button = Fermer
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Annuler
+pdfjs-editor-add-signature-add-button = Ajouter
+pdfjs-editor-edit-signature-update-button = Mettre 脿 jour
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Modifier le commentaire
+pdfjs-editor-edit-comment-popup-button =
+    .title = Modifier le commentaire
+pdfjs-editor-delete-comment-popup-button-label = Supprimer le commentaire
+pdfjs-editor-delete-comment-popup-button =
+    .title = Supprimer le commentaire
+pdfjs-show-comment-button =
+    .title = Voir les commentaires
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Modifier le commentaire
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Mettre 脿 jour
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Ajouter un commentaire
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ajouter
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Commencer 脿 茅crire鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Annuler
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Ajouter un commentaire
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Afficher/Masquer le panneau lat茅ral (le document contient des vignettes/plan/pi猫ces jointes/calques)
+pdfjs-toggle-views-manager-button1-label = G茅rer les pages
+pdfjs-views-manager-sidebar =
+    .aria-label = Panneau lat茅ral
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Redimensionner le panneau lat茅ral
+pdfjs-views-manager-view-selector-button =
+    .title = Vues
+pdfjs-views-manager-view-selector-button-label = Vues
+pdfjs-views-manager-pages-title = Pages
+pdfjs-views-manager-outlines-title1 = Structure du document
+    .title = Structure du document (double-cliquer pour d茅velopper/r茅duire tous les 茅l茅ments)
+pdfjs-views-manager-attachments-title = Pi猫ces jointes
+pdfjs-views-manager-layers-title1 = Calques
+    .title = Calques (double-cliquer pour r茅initialiser tous les calques 脿 leur 茅tat par d茅faut)
+pdfjs-views-manager-pages-option-label = Pages
+pdfjs-views-manager-outlines-option-label = Signets du document
+pdfjs-views-manager-attachments-option-label = Pi猫ces jointes
+pdfjs-views-manager-layers-option-label = Calques
+pdfjs-views-manager-add-file-button =
+    .title = Ajouter un fichier
+pdfjs-views-manager-add-file-button-label = Ajouter un fichier
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count }聽page s茅lectionn茅e
+       *[other] { $count }聽pages s茅lectionn茅es
+    }
+pdfjs-views-manager-pages-status-none-action-label = S茅lectionner des pages
+pdfjs-views-manager-pages-status-action-button-label = G茅rer
+pdfjs-views-manager-pages-status-copy-button-label = Copier
+pdfjs-views-manager-pages-status-cut-button-label = Couper
+pdfjs-views-manager-pages-status-delete-button-label = Supprimer
+pdfjs-views-manager-pages-status-export-selected-button-label = Exporter la s茅lection鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 page coup茅e
+       *[other] { $count }聽pages coup茅es
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 page copi茅e
+       *[other] { $count } pages copi茅es
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 page supprim茅e
+       *[other] { $count }聽pages supprim茅es
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Pr茅paration de votre fichier鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Envoi du fichier鈥�
+pdfjs-views-manager-status-warning-cut-label = Impossible de couper. Actualisez la page et essayez 脿 nouveau.
+pdfjs-views-manager-status-warning-copy-label = Copie impossible. Actualisez la page et essayez 脿 nouveau.
+pdfjs-views-manager-status-warning-delete-label = Suppression impossible. Actualisez la page et essayez 脿 nouveau.
+pdfjs-views-manager-status-warning-save-label = Enregistrement impossible. Actualisez la page et essayez 脿 nouveau.
+pdfjs-views-manager-status-undo-button-label = Annuler
+pdfjs-views-manager-status-done-button-label = Terminer
+pdfjs-views-manager-status-close-button =
+    .title = Fermer
+pdfjs-views-manager-status-close-button-label = Fermer
+pdfjs-views-manager-paste-button-label = Coller
+pdfjs-views-manager-paste-button-before =
+    .title = Coller avant la premi猫re page
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Coller apr猫s la page { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOUVEAU
+pdfjs-views-manager-waiting-for-file = Envoi du fichier鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = G茅rer les pages
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Supprimer la signature enregistr茅e
+pdfjs-editor-delete-signature-button-label1 = Supprimer la signature enregistr茅e
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Modifier la description
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Modifier la description
diff --git a/public/pdfjs/web/locale/fur/viewer.ftl b/public/pdfjs/web/locale/fur/viewer.ftl
new file mode 100644
index 0000000..ed94224
--- /dev/null
+++ b/public/pdfjs/web/locale/fur/viewer.ftl
@@ -0,0 +1,648 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pagjine di prime
+pdfjs-previous-button-label = Inda没r
+pdfjs-next-button =
+    .title = Prossime pagjine
+pdfjs-next-button-label = Indevant
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pagjine
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = di { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } di { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Impi莽ul矛s
+pdfjs-zoom-out-button-label = Impi莽ul矛s
+pdfjs-zoom-in-button =
+    .title = Ingrand矛s
+pdfjs-zoom-in-button-label = Ingrand矛s
+pdfjs-zoom-select =
+    .title = Ingrandiment
+pdfjs-presentation-mode-button =
+    .title = Passe ae modalit芒t presentazion
+pdfjs-presentation-mode-button-label = Modalit芒t presentazion
+pdfjs-open-file-button =
+    .title = Vier莽 un file
+pdfjs-open-file-button-label = Vier莽
+pdfjs-print-button =
+    .title = Stampe
+pdfjs-print-button-label = Stampe
+pdfjs-save-button =
+    .title = Salve
+pdfjs-save-button-label = Salve
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Discjame
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Discjame
+pdfjs-bookmark-button =
+    .title = Pagjine corinte (mostre URL de pagjine atu芒l)
+pdfjs-bookmark-button-label = Pagjine corinte
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Struments
+pdfjs-tools-button-label = Struments
+pdfjs-first-page-button =
+    .title = Va ae prime pagjine
+pdfjs-first-page-button-label = Va ae prime pagjine
+pdfjs-last-page-button =
+    .title = Va ae ultime pagjine
+pdfjs-last-page-button-label = Va ae ultime pagjine
+pdfjs-page-rotate-cw-button =
+    .title = Zire in sens orari
+pdfjs-page-rotate-cw-button-label = Zire in sens orari
+pdfjs-page-rotate-ccw-button =
+    .title = Zire in sens antiorari
+pdfjs-page-rotate-ccw-button-label = Zire in sens antiorari
+pdfjs-cursor-text-select-tool-button =
+    .title = Ative il strument di selezion dal test
+pdfjs-cursor-text-select-tool-button-label = Strument di selezion dal test
+pdfjs-cursor-hand-tool-button =
+    .title = Ative il strument manute
+pdfjs-cursor-hand-tool-button-label = Strument manute
+pdfjs-scroll-page-button =
+    .title = Dopre il scoriment des pagjinis
+pdfjs-scroll-page-button-label = Scoriment pagjinis
+pdfjs-scroll-vertical-button =
+    .title = Dopre scoriment vertic芒l
+pdfjs-scroll-vertical-button-label = Scoriment vertic芒l
+pdfjs-scroll-horizontal-button =
+    .title = Dopre scoriment orizont芒l
+pdfjs-scroll-horizontal-button-label = Scoriment orizont芒l
+pdfjs-scroll-wrapped-button =
+    .title = Dopre scoriment par blocs
+pdfjs-scroll-wrapped-button-label = Scoriment par blocs
+pdfjs-spread-none-button =
+    .title = No sta meti dongje pagjinis in cubie
+pdfjs-spread-none-button-label = No cubiis di pagjinis
+pdfjs-spread-odd-button =
+    .title = Met dongje cubiis di pagjinis scomen莽ant des pagjinis dispar
+pdfjs-spread-odd-button-label = Cubiis di pagjinis, dispar a 莽ampe
+pdfjs-spread-even-button =
+    .title = Met dongje cubiis di pagjinis scomen莽ant des pagjinis p芒r
+pdfjs-spread-even-button-label = Cubiis di pagjinis, p芒r a 莽ampe
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propriet芒ts dal document鈥�
+pdfjs-document-properties-button-label = Propriet芒ts dal document鈥�
+pdfjs-document-properties-file-name = Non dal file:
+pdfjs-document-properties-file-size = Dimension dal file:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Titul:
+pdfjs-document-properties-author = Aut么r:
+pdfjs-document-properties-subject = Ogjet:
+pdfjs-document-properties-keywords = Peraulis cl芒f:
+pdfjs-document-properties-creation-date = Date di creazion:
+pdfjs-document-properties-modification-date = Date di modifiche:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creat么r
+pdfjs-document-properties-producer = Gjenerad么r PDF:
+pdfjs-document-properties-version = Version PDF:
+pdfjs-document-properties-page-count = Numar di pagjinis:
+pdfjs-document-properties-page-size = Dimension de pagjine:
+pdfjs-document-properties-page-size-unit-inches = oncis
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertic芒l
+pdfjs-document-properties-page-size-orientation-landscape = orizont芒l
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letare
+pdfjs-document-properties-page-size-name-legal = Leg芒l
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Visualizazion web svelte:
+pdfjs-document-properties-linearized-yes = S矛
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Siere
+
+## Print
+
+pdfjs-print-progress-message = Da没r a pront芒 il document pe stampe鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Anule
+pdfjs-printing-not-supported = Atenzion: la stampe no je supuartade ad implen di chest navigad么r.
+pdfjs-printing-not-ready = Atenzion: il PDF nol 猫 st芒t cjam芒t dal dut pe stampe.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Ative/Disative sbare later芒l
+pdfjs-toggle-sidebar-notification-button =
+    .title = Ative/Disative sbare later芒l (il document al conten struture/zontis/str芒ts)
+pdfjs-toggle-sidebar-button-label = Ative/Disative sbare later芒l
+pdfjs-document-outline-button =
+    .title = Mostre la struture dal document (dopli clic par slargj芒/strenzi ducj i elements)
+pdfjs-document-outline-button-label = Struture dal document
+pdfjs-attachments-button =
+    .title = Mostre lis zontis
+pdfjs-attachments-button-label = Zontis
+pdfjs-layers-button =
+    .title = Mostre i str芒ts (dopli clic par ristabil卯 ducj i str芒ts al st芒t predefin卯t)
+pdfjs-layers-button-label = Str芒ts
+pdfjs-thumbs-button =
+    .title = Mostre miniaturis
+pdfjs-thumbs-button-label = Miniaturis
+pdfjs-current-outline-item-button =
+    .title = Cjate l'element de struture atu芒l
+pdfjs-current-outline-item-button-label = Element de struture atu芒l
+pdfjs-findbar-button =
+    .title = Cjate tal document
+pdfjs-findbar-button-label = Cjate
+pdfjs-additional-layers = Str芒ts adizion芒i
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pagjine { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniature de pagjine { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Cjate
+    .placeholder = Cjate tal document鈥�
+pdfjs-find-previous-button =
+    .title = Cjate il c芒s precedent dal test
+pdfjs-find-previous-button-label = Precedent
+pdfjs-find-next-button =
+    .title = Cjate il c芒s sucess卯f dal test
+pdfjs-find-next-button-label = Sucess卯f
+pdfjs-find-highlight-checkbox = Evidenzie dut
+pdfjs-find-match-case-checkbox-label = F芒s distinzion tra maiusculis e minusculis
+pdfjs-find-match-diacritics-checkbox-label = Corispondence diacritiche
+pdfjs-find-entire-word-checkbox-label = Peraulis interiis
+pdfjs-find-reached-top = Si 猫 riv芒ts al inizi dal document e si 脿 continu芒t de fin
+pdfjs-find-reached-bottom = Si 猫 riv芒t ae fin dal document e si 脿 continu芒t dal inizi
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } di { $total } corispondence
+       *[other] { $current } di { $total } corispondencis
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Plui di { $limit } corispondence
+       *[other] Plui di { $limit } corispondencis
+    }
+pdfjs-find-not-found = Test no cjat芒t
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Largjece de pagjine
+pdfjs-page-scale-fit = Pagjine interie
+pdfjs-page-scale-auto = Ingrandiment automatic
+pdfjs-page-scale-actual = Dimension re芒l
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pagjine { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Al 猫 vign没t f没r un er么r intant che si cjariave il PDF.
+pdfjs-invalid-file-error = File PDF no valit o ruvin芒t.
+pdfjs-missing-file-error = Al mancje il file PDF.
+pdfjs-unexpected-response-error = Rispueste dal servid么r inspietade.
+pdfjs-rendering-error = Al 猫 vign没t f没r un er么r tal realiz芒 la visualizazion de pagjine.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotazion { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Inser矛s la password par vierzi chest file PDF.
+pdfjs-password-invalid = Password no valide. Par plas锚 torne prove.
+pdfjs-password-ok-button = Va ben
+pdfjs-password-cancel-button = Anule
+pdfjs-web-fonts-disabled = I caratars dal Web a son disativ芒ts: Impussibil dopr芒 i caratars PDF incorpor芒ts.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Test
+pdfjs-editor-color-picker-free-text-input =
+    .title = Cambie col么r dal test
+pdfjs-editor-free-text-button-label = Test
+pdfjs-editor-ink-button =
+    .title = Dissen
+pdfjs-editor-color-picker-ink-input =
+    .title = Cambie col么r dal dissen
+pdfjs-editor-ink-button-label = Dissen
+pdfjs-editor-stamp-button =
+    .title = Zonte o modifiche imagjins
+pdfjs-editor-stamp-button-label = Zonte o modifiche imagjins
+pdfjs-editor-highlight-button =
+    .title = Evidenzie
+pdfjs-editor-highlight-button-label = Evidenzie
+pdfjs-highlight-floating-button1 =
+    .title = Evidenzie
+    .aria-label = Evidenzie
+pdfjs-highlight-floating-button-label = Evidenzie
+pdfjs-comment-floating-button =
+    .title = Comente
+    .aria-label = Comente
+pdfjs-comment-floating-button-label = Comente
+pdfjs-editor-comment-button =
+    .title = Comente
+    .aria-label = Comente
+pdfjs-editor-comment-button-label = Comente
+pdfjs-editor-signature-button =
+    .title = Zonte firme
+pdfjs-editor-signature-button-label = Zonte firme
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Modifiche evidenziazions
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Modifiche dissens
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Edit么r firmis: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Modifiche imagjins
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Gjave dissen
+pdfjs-editor-remove-freetext-button =
+    .title = Gjave test
+pdfjs-editor-remove-stamp-button =
+    .title = Gjave imagjin
+pdfjs-editor-remove-highlight-button =
+    .title = Gjave evidenziazion
+pdfjs-editor-remove-signature-button =
+    .title = Gjave firme
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Col么r
+pdfjs-editor-free-text-size-input = Dimension
+pdfjs-editor-ink-color-input = Col么r
+pdfjs-editor-ink-thickness-input = Spess么r
+pdfjs-editor-ink-opacity-input = Opacit芒t
+pdfjs-editor-stamp-add-image-button =
+    .title = Zonte imagjin
+pdfjs-editor-stamp-add-image-button-label = Zonte imagjin
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Spess么r
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Modifiche il spess么r de selezion pai elements che no son testu芒i
+pdfjs-editor-add-signature-container =
+    .aria-label = Controi firme e firmis salvadis
+pdfjs-editor-signature-add-signature-button =
+    .title = Zonte gnove firme
+pdfjs-editor-signature-add-signature-button-label = Zonte gnove firme
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Firme salvade: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Edit么r di test
+    .default-content = Scomence a scrivi鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Coment
+       *[other] Coments
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Siere la sbare later芒l
+    .aria-label = Siere la sbare later芒l
+pdfjs-editor-comments-sidebar-close-button-label = Siere la sbare later芒l
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 脗stu cjat芒t alc di interessant? Evidenzilu e lasse un coment.
+pdfjs-editor-comments-sidebar-no-comments-link = Plui informazions
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Test alternat卯f
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Modifiche test alternat卯f
+pdfjs-editor-alt-text-dialog-label = Siel莽 une opzion
+pdfjs-editor-alt-text-dialog-description = Il test alternat卯f (鈥渁lt text鈥�) al jude cuant che lis personis no puedin viodi la imagjin o cuant che la imagjine no ven cjariade.
+pdfjs-editor-alt-text-add-description-label = Zonte une descrizion
+pdfjs-editor-alt-text-add-description-description = Ponte a une o d么s frasis che a descrivin l鈥檃rgoment, la ambientazion o lis azions.
+pdfjs-editor-alt-text-mark-decorative-label = Segne come decorative
+pdfjs-editor-alt-text-mark-decorative-description = Chest al ven dopr芒t pes imagjins ornament芒ls, come i 么rs o lis filigranis.
+pdfjs-editor-alt-text-cancel-button = Anule
+pdfjs-editor-alt-text-save-button = Salve
+pdfjs-editor-alt-text-decorative-tooltip = Segnade come decorative
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Par esempli, 鈥淯n zovin si sente a taule par mangj芒鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Test alternat卯f
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Cjanton in alt a 莽ampe 鈥� ridimensione
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Bande superi么r tal mie莽 鈥� ridimensione
+pdfjs-editor-resizer-top-right =
+    .aria-label = Cjanton in alt a diestre 鈥� ridimensione
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Bande diestre tal mie莽 鈥� ridimensione
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Cjanton in bas a diestre 鈥� ridimensione
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Bande inferi么r tal mie莽 鈥� ridimensione
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Cjanton in bas a 莽ampe 鈥� ridimensione
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Bande di 莽ampe tal mie莽 鈥� ridimensione
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Col么r par evidenzi芒
+pdfjs-editor-colorpicker-button =
+    .title = Cambie col么r
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Sieltis di col么r
+pdfjs-editor-colorpicker-yellow =
+    .title = Z芒l
+pdfjs-editor-colorpicker-green =
+    .title = Vert
+pdfjs-editor-colorpicker-blue =
+    .title = Blu
+pdfjs-editor-colorpicker-pink =
+    .title = Rose
+pdfjs-editor-colorpicker-red =
+    .title = Ros
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mostre dut
+pdfjs-editor-highlight-show-all-button =
+    .title = Mostre dut
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Modifiche test alternat卯f (descrizion de imagjin)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Zonte test alternat卯f (descrizion de imagjin)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Scr卯f ach矛 la t么 descrizion鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Curte descrizion par personis che no rivin a viodi la imagjin, o che e ven mostrade cuant che no si rive a cjari芒le.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Chest test alternat卯f al 猫 st芒t cre芒t in automatic e al 猫 pussibil che nol sedi cret.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Plui informazions
+pdfjs-editor-new-alt-text-create-automatically-button-label = Cree test alternat卯f in automatic
+pdfjs-editor-new-alt-text-not-now-button = No cum貌
+pdfjs-editor-new-alt-text-error-title = Impussibil cre芒 test alternat卯f in automatic
+pdfjs-editor-new-alt-text-error-description = Scr卯f il to test alternat卯f o prove plui tart.
+pdfjs-editor-new-alt-text-error-close-button = Siere
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Da没r a discjari芒il model IA pal test alternat卯f ({ $downloadedSize } di { $totalSize } MB)
+    .aria-valuetext = Da没r a discjari芒 il model IA pal test alternat卯f ({ $downloadedSize } di { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Test alternat卯f zont芒t
+pdfjs-editor-new-alt-text-added-button-label = Test alternat卯f zont芒t
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Al mancje il test alternat卯f
+pdfjs-editor-new-alt-text-missing-button-label = Al mancje il test alternat卯f
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Verifiche test alternat卯f
+pdfjs-editor-new-alt-text-to-review-button-label = Verifiche test alternat卯f
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Cre芒t in automatic: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Impostazions test alternat卯f pes imagjins
+pdfjs-image-alt-text-settings-button-label = Impostazions test alternat卯f pes imagjins
+pdfjs-editor-alt-text-settings-dialog-label = Impostazions test alternat卯f pes imagjins
+pdfjs-editor-alt-text-settings-automatic-title = Test alternat卯f automatic
+pdfjs-editor-alt-text-settings-create-model-button-label = Cree test alternat卯f in automatic
+pdfjs-editor-alt-text-settings-create-model-description = Al sugjer矛s descrizions par jud芒 lis personis che no rivin a viodi la imagjin o cuant che la imagjin no ven cjariade.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model IA pal test alternat卯f ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Al ven esegu卯t in loc芒l sul to disposit卯f, cuss矛 che i tiei d芒ts a restin riserv芒ts. Al 猫 necessari pe gjenerazion automatiche dal test alternat卯f.
+pdfjs-editor-alt-text-settings-delete-model-button = Elimine
+pdfjs-editor-alt-text-settings-download-model-button = Discjame
+pdfjs-editor-alt-text-settings-downloading-model-button = Da没r a discjari芒鈥�
+pdfjs-editor-alt-text-settings-editor-title = Modifiche test alternat卯f
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostre l'edit么r dal test alternat卯f a pene che e ven zontade une imagjin
+pdfjs-editor-alt-text-settings-show-dialog-description = Ti jude a sigur芒ti che dutis lis t么s imagjins a vedin il test alternat卯f.
+pdfjs-editor-alt-text-settings-close-button = Siere
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Evidenziazion zontade
+pdfjs-editor-freetext-added-alert = Test zont芒t
+pdfjs-editor-ink-added-alert = Dissen zont芒t
+pdfjs-editor-stamp-added-alert = Imagjin zontade
+pdfjs-editor-signature-added-alert = Firme zontade
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Evidenziazion gjavade
+pdfjs-editor-undo-bar-message-freetext = Test gjav芒t
+pdfjs-editor-undo-bar-message-ink = Dissen gjav芒t
+pdfjs-editor-undo-bar-message-stamp = Imagjin gjavade
+pdfjs-editor-undo-bar-message-signature = Firme gjavade
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } note gjavade
+       *[other] { $count } notis gjavadis
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Anule
+pdfjs-editor-undo-bar-undo-button-label = Anule
+pdfjs-editor-undo-bar-close-button =
+    .title = Siere
+pdfjs-editor-undo-bar-close-button-label = Siere
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Chest barcon al permet al utent di cre芒 une firme di zont芒 a un document PDF. L鈥檜tent al pues modific芒 il non (che al vignar脿 dopr芒t ancje come test alternat卯f) e, se lu desidere, salv芒 la firme par torn芒 a dopr芒le un doman.
+pdfjs-editor-add-signature-dialog-title = Zonte une firme
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Scr卯f
+    .title = Scr卯f
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Dissegne
+    .title = Dissegne
+pdfjs-editor-add-signature-image-button = Imagjin
+    .title = Imagjin
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Scr卯f la t么 firme
+    .placeholder = Scr卯f la t么 firme
+pdfjs-editor-add-signature-draw-placeholder = Dissegne la t么 firme
+pdfjs-editor-add-signature-draw-thickness-range-label = Spess么r
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Spess么r de tresse: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Strissine un file ach矛 par cjari芒lu
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Op没r siel莽 i files imagjin
+       *[other] Op没r sgarfe pai files imagjin
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descrizion (test alternat卯f)
+pdfjs-editor-add-signature-description-input =
+    .title = Descrizion (test alternat卯f)
+pdfjs-editor-add-signature-description-default-when-drawing = Firme
+pdfjs-editor-add-signature-clear-button-label = Nete firme
+pdfjs-editor-add-signature-clear-button =
+    .title = Nete firme
+pdfjs-editor-add-signature-save-checkbox = Salve firme
+pdfjs-editor-add-signature-save-warning-message = Tu s锚s riv芒t/rivade al limit di 5 firmis salvadis. Gjave une  par salv芒nt une altre.
+pdfjs-editor-add-signature-image-upload-error-title = Impussibil cjari芒 la imagjin
+pdfjs-editor-add-signature-image-upload-error-description = Controle la conession di r锚t o prove cuntune altre imagjin.
+pdfjs-editor-add-signature-image-no-data-error-title = Impussibil convert卯 cheste imagjin intune firme
+pdfjs-editor-add-signature-image-no-data-error-description = Prove a cjari芒 une altre imagjin.
+pdfjs-editor-add-signature-error-close-button = Siere
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Anule
+pdfjs-editor-add-signature-add-button = Zonte
+pdfjs-editor-edit-signature-update-button = Inzorne
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Modifiche coment
+pdfjs-editor-edit-comment-popup-button =
+    .title = Modifiche coment
+pdfjs-editor-delete-comment-popup-button-label = Gjave coment
+pdfjs-editor-delete-comment-popup-button =
+    .title = Gjave coment
+pdfjs-show-comment-button =
+    .title = Mostre coment
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Modifiche coment
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Inzorne
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Zonte coment
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Zonte
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Scomence a scrivi鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Anule
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Zonte coment
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Gjave firme salvade
+pdfjs-editor-delete-signature-button-label1 = Gjave firme salvade
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Modifiche descrizion
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Modifiche descrizion
diff --git a/public/pdfjs/web/locale/fy-NL/viewer.ftl b/public/pdfjs/web/locale/fy-NL/viewer.ftl
new file mode 100644
index 0000000..7c33823
--- /dev/null
+++ b/public/pdfjs/web/locale/fy-NL/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Foarige side
+pdfjs-previous-button-label = Foarige
+pdfjs-next-button =
+    .title = Folgjende side
+pdfjs-next-button-label = Folgjende
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Side
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = fan { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } fan { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Utzoome
+pdfjs-zoom-out-button-label = Utzoome
+pdfjs-zoom-in-button =
+    .title = Ynzoome
+pdfjs-zoom-in-button-label = Ynzoome
+pdfjs-zoom-select =
+    .title = Zoome
+pdfjs-presentation-mode-button =
+    .title = Wikselje nei presintaasjemodus
+pdfjs-presentation-mode-button-label = Presintaasjemodus
+pdfjs-open-file-button =
+    .title = Best芒n iepenje
+pdfjs-open-file-button-label = Iepenje
+pdfjs-print-button =
+    .title = Ofdrukke
+pdfjs-print-button-label = Ofdrukke
+pdfjs-save-button =
+    .title = Bewarje
+pdfjs-save-button-label = Bewarje
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Downloade
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Downloade
+pdfjs-bookmark-button =
+    .title = Aktuele side (URL fan aktuele side besjen)
+pdfjs-bookmark-button-label = Aktuele side
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ark
+pdfjs-tools-button-label = Ark
+pdfjs-first-page-button =
+    .title = Gean nei earste side
+pdfjs-first-page-button-label = Gean nei earste side
+pdfjs-last-page-button =
+    .title = Gean nei l锚ste side
+pdfjs-last-page-button-label = Gean nei l锚ste side
+pdfjs-page-rotate-cw-button =
+    .title = Rjochtsom draaie
+pdfjs-page-rotate-cw-button-label = Rjochtsom draaie
+pdfjs-page-rotate-ccw-button =
+    .title = Linksom draaie
+pdfjs-page-rotate-ccw-button-label = Linksom draaie
+pdfjs-cursor-text-select-tool-button =
+    .title = Tekstseleksjehelpmiddel ynskeakelje
+pdfjs-cursor-text-select-tool-button-label = Tekstseleksjehelpmiddel
+pdfjs-cursor-hand-tool-button =
+    .title = H芒nhelpmiddel ynskeakelje
+pdfjs-cursor-hand-tool-button-label = H芒nhelpmiddel
+pdfjs-scroll-page-button =
+    .title = Sideskowen br没ke
+pdfjs-scroll-page-button-label = Sideskowen
+pdfjs-scroll-vertical-button =
+    .title = Fertikaal skowe br没ke
+pdfjs-scroll-vertical-button-label = Fertikaal skowe
+pdfjs-scroll-horizontal-button =
+    .title = Horizontaal skowe br没ke
+pdfjs-scroll-horizontal-button-label = Horizontaal skowe
+pdfjs-scroll-wrapped-button =
+    .title = Skowe mei oersjoch br没ke
+pdfjs-scroll-wrapped-button-label = Skowe mei oersjoch
+pdfjs-spread-none-button =
+    .title = Sidesprieding net gearfetsje
+pdfjs-spread-none-button-label = Gjin sprieding
+pdfjs-spread-odd-button =
+    .title = Sidesprieding gearfetsje te starten mei 没neven n没mers
+pdfjs-spread-odd-button-label = Uneven sprieding
+pdfjs-spread-even-button =
+    .title = Sidesprieding gearfetsje te starten mei even n没mers
+pdfjs-spread-even-button-label = Even sprieding
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokuminteigenskippen鈥�
+pdfjs-document-properties-button-label = Dokuminteigenskippen鈥�
+pdfjs-document-properties-file-name = Best芒nsnamme:
+pdfjs-document-properties-file-size = Best芒nsgrutte:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Titel:
+pdfjs-document-properties-author = Auteur:
+pdfjs-document-properties-subject = Underwerp:
+pdfjs-document-properties-keywords = Kaaiwurden:
+pdfjs-document-properties-creation-date = Oanmaakdatum:
+pdfjs-document-properties-modification-date = Bewurkingsdatum:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Makker:
+pdfjs-document-properties-producer = PDF-makker:
+pdfjs-document-properties-version = PDF-ferzje:
+pdfjs-document-properties-page-count = Siden:
+pdfjs-document-properties-page-size = Sideformaat:
+pdfjs-document-properties-page-size-unit-inches = yn
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = steand
+pdfjs-document-properties-page-size-orientation-landscape = lizzend
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Juridysk
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Flugge webwerjefte:
+pdfjs-document-properties-linearized-yes = Ja
+pdfjs-document-properties-linearized-no = Nee
+pdfjs-document-properties-close-button = Slute
+
+## Print
+
+pdfjs-print-progress-message = Dokumint tariede oar 么fdrukken鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Annulearje
+pdfjs-printing-not-supported = Warning: Printen is net folslein stipe troch dizze browser.
+pdfjs-printing-not-ready = Warning: PDF is net folslein laden om 么f te drukken.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Sidebalke yn-/煤tskeakelje
+pdfjs-toggle-sidebar-notification-button =
+    .title = Sidebalke yn-/煤tskeakelje (dokumint befettet oersjoch/bylagen/lagen)
+pdfjs-toggle-sidebar-button-label = Sidebalke yn-/煤tskeakelje
+pdfjs-document-outline-button =
+    .title = Dokumintoersjoch toane (d没belklik om alle items 煤t/yn te klappen)
+pdfjs-document-outline-button-label = Dokumintoersjoch
+pdfjs-attachments-button =
+    .title = Bylagen toane
+pdfjs-attachments-button-label = Bylagen
+pdfjs-layers-button =
+    .title = Lagen toane (d没belklik om alle lagen nei de standertsteat werom te setten)
+pdfjs-layers-button-label = Lagen
+pdfjs-thumbs-button =
+    .title = Miniatueren toane
+pdfjs-thumbs-button-label = Miniatueren
+pdfjs-current-outline-item-button =
+    .title = Aktueel item yn ynh芒ldsopjefte sykje
+pdfjs-current-outline-item-button-label = Aktueel item yn ynh芒ldsopjefte
+pdfjs-findbar-button =
+    .title = Sykje yn dokumint
+pdfjs-findbar-button-label = Sykje
+pdfjs-additional-layers = Oanfoljende lagen
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Side { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatuer fan side { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Side { $page } selektearje
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Side { $page } fan { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Sykje
+    .placeholder = Sykje yn dokumint鈥�
+pdfjs-find-previous-button =
+    .title = It foarige foarkommen fan de tekst sykje
+pdfjs-find-previous-button-label = Foarige
+pdfjs-find-next-button =
+    .title = It folgjende foarkommen fan de tekst sykje
+pdfjs-find-next-button-label = Folgjende
+pdfjs-find-highlight-checkbox = Alles markearje
+pdfjs-find-match-case-checkbox-label = Haadlettergefoelich
+pdfjs-find-match-diacritics-checkbox-label = Diakrityske tekens br没ke
+pdfjs-find-entire-word-checkbox-label = Hiele wurden
+pdfjs-find-reached-top = Boppekant fan dokumint berikt, trochgien fan 没nder 么f
+pdfjs-find-reached-bottom = Ein fan dokumint berikt, trochgien fan boppe 么f
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } fan { $total } oerienkomst
+       *[other] { $current } fan { $total } oerienkomsten
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mear as { $limit } oerienkomst
+       *[other] Mear as { $limit } oerienkomsten
+    }
+pdfjs-find-not-found = Tekst net f没n
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Sidebreedte
+pdfjs-page-scale-fit = Hiele side
+pdfjs-page-scale-auto = Automatysk zoome
+pdfjs-page-scale-actual = Werklike grutte
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Side { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Der is in flater bard by it laden fan de PDF.
+pdfjs-invalid-file-error = Ynfalide of korruptearre PDF-best芒n.
+pdfjs-missing-file-error = PDF-best芒n 没ntbrekt.
+pdfjs-unexpected-response-error = Unferwacht serverantwurd.
+pdfjs-rendering-error = Der is in flater bard by it renderjen fan de side.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type }-annotaasje]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Jou it wachtwurd om dit PDF-best芒n te iepenjen.
+pdfjs-password-invalid = Ferkeard wachtwurd. Probearje opnij.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Annulearje
+pdfjs-web-fonts-disabled = Weblettertypen binne 煤tskeakele: gebr没k fan ynsluten PDF-lettertypen is net mooglik.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Tekstleur wizigje
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Tekenje
+pdfjs-editor-color-picker-ink-input =
+    .title = Tekenkleur wizigje
+pdfjs-editor-ink-button-label = Tekenje
+pdfjs-editor-stamp-button =
+    .title = Ofbyldingen tafoegje of bewurkje
+pdfjs-editor-stamp-button-label = Ofbyldingen tafoegje of bewurkje
+pdfjs-editor-highlight-button =
+    .title = Markearje
+pdfjs-editor-highlight-button-label = Markearje
+pdfjs-highlight-floating-button1 =
+    .title = Markearje
+    .aria-label = Markearje
+pdfjs-highlight-floating-button-label = Markearje
+pdfjs-comment-floating-button =
+    .title = Opmerking
+    .aria-label = Opmerking
+pdfjs-comment-floating-button-label = Opmerking
+pdfjs-editor-comment-button =
+    .title = Opmerking
+    .aria-label = Opmerking
+pdfjs-editor-comment-button-label = Opmerking
+pdfjs-editor-signature-button =
+    .title = Hantekening tafoegje
+pdfjs-editor-signature-button-label = Hantekening tafoegje
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Markearingsbewurker
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Tekeningbewurker
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Undertekeningsbewurker: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Ofbyldingsbewurker
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Tekening fuortsmite
+pdfjs-editor-remove-freetext-button =
+    .title = Tekst fuortsmite
+pdfjs-editor-remove-stamp-button =
+    .title = Ofbylding fuortsmite
+pdfjs-editor-remove-highlight-button =
+    .title = Markearring fuortsmite
+pdfjs-editor-remove-signature-button =
+    .title = Hantekening fuortsmite
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Kleur
+pdfjs-editor-free-text-size-input = Grutte
+pdfjs-editor-ink-color-input = Kleur
+pdfjs-editor-ink-thickness-input = Tsjokte
+pdfjs-editor-ink-opacity-input = Transpar芒nsje
+pdfjs-editor-stamp-add-image-button =
+    .title = Ofbylding tafoegje
+pdfjs-editor-stamp-add-image-button-label = Ofbylding tafoegje
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Tsjokte
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Tsjokte wizigje by aksintuearring fan oare items as tekst
+pdfjs-editor-add-signature-container =
+    .aria-label = Undertekeningsynstellingen en bewarre 没ndertekeningen
+pdfjs-editor-signature-add-signature-button =
+    .title = Nije hantekening tafoegje
+pdfjs-editor-signature-add-signature-button-label = Nije hantekening tafoegje
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Bewarre 没ndertekening: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Tekstbewurker
+    .default-content = Start mei typen鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Opmerking
+       *[other] Opmerkingen
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = De sydbalke slute
+    .aria-label = De sydbalke slute
+pdfjs-editor-comments-sidebar-close-button-label = De sydbalke slute
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Sjogge jo wat it neamen wurdich? Markearje it en lit in opmerking efter.
+pdfjs-editor-comments-sidebar-no-comments-link = Mear ynfo
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternative tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Alternative tekst bewurkje
+pdfjs-editor-alt-text-dialog-label = Kies in opsje
+pdfjs-editor-alt-text-dialog-description = Alternative tekst helpt wannear鈥檛 minsken de 么fbylding net sjen kinne of wannear鈥檛 dizze net laden wurdt.
+pdfjs-editor-alt-text-add-description-label = Foegje in beskriuwing ta
+pdfjs-editor-alt-text-add-description-description = Stribje nei 1-2 sinnen dy鈥檛 it 没nderwerp, de omjouwing of de aksjes beskriuwe.
+pdfjs-editor-alt-text-mark-decorative-label = As dekoratyf markearje
+pdfjs-editor-alt-text-mark-decorative-description = Dit wurdt br没kt foar sierlike 么fbyldingen, lykas r芒nen of wettermerken.
+pdfjs-editor-alt-text-cancel-button = Annulearje
+pdfjs-editor-alt-text-save-button = Bewarje
+pdfjs-editor-alt-text-decorative-tooltip = As dekoratyf markearre
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Bygelyks, 鈥業n jonge man sit oan in tafel om te iten鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternative tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Linkerboppehoek 鈥� formaat wizigje
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Midden boppe 鈥� formaat wizigje
+pdfjs-editor-resizer-top-right =
+    .aria-label = Rjochterboppehoek 鈥� formaat wizigje
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Midden rjochts 鈥� formaat wizigje
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Rjochter没nderhoek 鈥� formaat wizigje
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Midden 没nder 鈥� formaat wizigje
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Linker没nderhoek 鈥� formaat wizigje
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Links midden 鈥� formaat wizigje
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Markearringskleur
+pdfjs-editor-colorpicker-button =
+    .title = Kleur wizigje
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Kleurkarren
+pdfjs-editor-colorpicker-yellow =
+    .title = Giel
+pdfjs-editor-colorpicker-green =
+    .title = Grien
+pdfjs-editor-colorpicker-blue =
+    .title = Blau
+pdfjs-editor-colorpicker-pink =
+    .title = Roze
+pdfjs-editor-colorpicker-red =
+    .title = Read
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Alles toane
+pdfjs-editor-highlight-show-all-button =
+    .title = Alles toane
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Alternative tekst (么fbyldingsbeskriuwing) bewurkje
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Alternative tekst (么fbyldingsbeskriuwing) tafoegje
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Skriuw hjir jo beskriuwing鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Koarte beskriuwing foar minsken dy鈥檛 de 么fbylding net sjen kinne of wannear鈥檛 de 么fbylding net laden wurdt.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Dizze alternative tekst is automatysk makke en is mooglik net korrekt.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Mear ynfo
+pdfjs-editor-new-alt-text-create-automatically-button-label = Alternative tekst automatysk oanmeitsje
+pdfjs-editor-new-alt-text-not-now-button = No net
+pdfjs-editor-new-alt-text-error-title = Kin alternative tekst net automatysk oanmeitsje
+pdfjs-editor-new-alt-text-error-description = Skriuw jo eigen alternative tekst of probearje it letter nochris.
+pdfjs-editor-new-alt-text-error-close-button = Slute
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = AI-model foar alternative tekst downloade ({ $downloadedSize } fan { $totalSize } MB)
+    .aria-valuetext = AI-model foar alternative tekst downloade ({ $downloadedSize } fan { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternative tekst tafoege
+pdfjs-editor-new-alt-text-added-button-label = Alternative tekst tafoege
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Alternative tekst 没ntbrekt
+pdfjs-editor-new-alt-text-missing-button-label = Alternative tekst 没ntbrekt
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Alternative tekst beoardiele
+pdfjs-editor-new-alt-text-to-review-button-label = Alternative tekst beoardiele
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatysk oanmakke: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Ynstellingen foar alternative tekst fan 么fbyldingen
+pdfjs-image-alt-text-settings-button-label = Ynstellingen foar alternative tekst fan 么fbyldingen
+pdfjs-editor-alt-text-settings-dialog-label = Ynstellingen foar alternative tekst fan 么fbyldingen
+pdfjs-editor-alt-text-settings-automatic-title = Automatyske alternative tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Alternative tekst automatysk oanmeitsje
+pdfjs-editor-alt-text-settings-create-model-description = Stelt beskriuwingen foar om minsken te helpen dy鈥檛 de 么fbylding net sjen kinne of foar wa鈥檛 de 么fbylding net laden wurdt.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = AI-model foar alternative tekst ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Wurdt lokaal op jo apparaat 煤tfierd, sadat jo gegevens privee bliuwe. Fereaske foar automatyske alternative tekst.
+pdfjs-editor-alt-text-settings-delete-model-button = Fuortsmite
+pdfjs-editor-alt-text-settings-download-model-button = Downloade
+pdfjs-editor-alt-text-settings-downloading-model-button = Downloade鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alternative-tekstbewurker
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternative-tekstbewurker daliks toane by tafoegjen fan in 么fbylding
+pdfjs-editor-alt-text-settings-show-dialog-description = Helpt jo derfoar te soargjen dat al jo 么fbyldingen alternative tekst hawwe.
+pdfjs-editor-alt-text-settings-close-button = Slute
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Markearring tafoege
+pdfjs-editor-freetext-added-alert = Tekst tafoege
+pdfjs-editor-ink-added-alert = Tekening tafoege
+pdfjs-editor-stamp-added-alert = Ofbylding tafoege
+pdfjs-editor-signature-added-alert = Hantekening tafoege
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Markearring fuortsmiten
+pdfjs-editor-undo-bar-message-freetext = Tekst fuortsmiten
+pdfjs-editor-undo-bar-message-ink = Tekening fuortsmiten
+pdfjs-editor-undo-bar-message-stamp = Ofbylding fuortsmiten
+pdfjs-editor-undo-bar-message-signature = Hantekening fuortsmiten
+pdfjs-editor-undo-bar-message-comment = Opmerking fuortsmiten
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } annotaasje fuortsmiten
+       *[other] { $count } annotaasjes fuortsmiten
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Ungedien meitsje
+pdfjs-editor-undo-bar-undo-button-label = Ungedien meitsje
+pdfjs-editor-undo-bar-close-button =
+    .title = Slute
+pdfjs-editor-undo-bar-close-button-label = Slute
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Mei dizze modal kin de br没ker in hantekening meitsje om oan in PDF-dokumint ta te foegjen. De br没ker kin de namme bewurkje (dy't ek tsjinnet as alternative tekst), en opsjoneel de 没ndertekening bewarje foar werhelle gebr没k.
+pdfjs-editor-add-signature-dialog-title = In hantekening tafoegje
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Type
+    .title = Type
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Tekenje
+    .title = Tekenje
+pdfjs-editor-add-signature-image-button = Ofbylding
+    .title = Ofbylding
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Jo hantekening type
+    .placeholder = Jo hantekening type
+pdfjs-editor-add-signature-draw-placeholder = Jo hantekening tekenje
+pdfjs-editor-add-signature-draw-thickness-range-label = Tsjokte
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Tekentsjokte: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Sleep best芒n hjirhinne om op te laden
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Of kies 么fbyldingsbestannen
+       *[other] Of kies 么fbyldingsbestannen
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Beskriuwing (alternative tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Beskriuwing (alternative tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Hantekening
+pdfjs-editor-add-signature-clear-button-label = Hantekening wiskje
+pdfjs-editor-add-signature-clear-button =
+    .title = Hantekening wiskje
+pdfjs-editor-add-signature-save-checkbox = Hantekening bewarje
+pdfjs-editor-add-signature-save-warning-message = Jo hawwe de limyt fan 5 bewarre hantekeningen berikt. Ferwiderje ien om in oar te bewarjen.
+pdfjs-editor-add-signature-image-upload-error-title = Kin de 么fbylding net oplade
+pdfjs-editor-add-signature-image-upload-error-description = Kontrolearje jo netwurkferbining of probearje in oare 么fbylding.
+pdfjs-editor-add-signature-image-no-data-error-title = Kin dizze 么fbylding net nei in hantekening konvertearje
+pdfjs-editor-add-signature-image-no-data-error-description = Probearje in oare 么fbylding op te laden.
+pdfjs-editor-add-signature-error-close-button = Slute
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Annulearje
+pdfjs-editor-add-signature-add-button = Tafoegje
+pdfjs-editor-edit-signature-update-button = Bywurkje
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Opmerking bewurkje
+pdfjs-editor-edit-comment-popup-button =
+    .title = Opmerking bewurkje
+pdfjs-editor-delete-comment-popup-button-label = Opmerking fuortsmite
+pdfjs-editor-delete-comment-popup-button =
+    .title = Opmerking fuortsmite
+pdfjs-show-comment-button =
+    .title = Opmerking toane
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Opmerking bewurkje
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Bywurkje
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Opmerking tafoegje
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Tafoegje
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Begjin mei typen鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Annulearje
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Opmerking tafoegje
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Sidebalke yn-/煤tskeakelje (dokumint befettet miniatueren/oersjoch/bylagen/lagen)
+pdfjs-toggle-views-manager-button1-label = Siden beheare
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidebalke
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Gruttewiziging sydbalke
+pdfjs-views-manager-view-selector-button =
+    .title = Werjeften
+pdfjs-views-manager-view-selector-button-label = Werjeften
+pdfjs-views-manager-pages-title = Siden
+pdfjs-views-manager-outlines-title1 = Dokumintoersjoch
+    .title = Dokumintoersjoch (d没belklik om alle items 煤t/yn te klappen)
+pdfjs-views-manager-attachments-title = Bylagen
+pdfjs-views-manager-layers-title1 = Lagen
+    .title = Lagen (d没belklik om alle lagen nei de standertstatus werom te setten)
+pdfjs-views-manager-pages-option-label = Siden
+pdfjs-views-manager-outlines-option-label = Dokumintoersjoch
+pdfjs-views-manager-attachments-option-label = Bylagen
+pdfjs-views-manager-layers-option-label = Lagen
+pdfjs-views-manager-add-file-button =
+    .title = Best芒n tafoegje
+pdfjs-views-manager-add-file-button-label = Best芒n tafoegje
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } selektearre
+       *[other] { $count } selektearre
+    }
+pdfjs-views-manager-pages-status-none-action-label = Siden selektearje
+pdfjs-views-manager-pages-status-action-button-label = Beheare
+pdfjs-views-manager-pages-status-copy-button-label = Kopiearje
+pdfjs-views-manager-pages-status-cut-button-label = Knippe
+pdfjs-views-manager-pages-status-delete-button-label = Fuortsmite
+pdfjs-views-manager-pages-status-export-selected-button-label = Selektearre eksportearje鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 side knipt
+       *[other] { $count } siden knipt
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 side kopiearre
+       *[other] { $count } siden kopiearre
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 side fuortsmiten
+       *[other] { $count } siden fuortsmiten
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Jo best芒n tariede鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Best芒n oplade鈥�
+pdfjs-views-manager-status-warning-cut-label = Kin net knippe. Ferfarskje de side en probearje it opnij.
+pdfjs-views-manager-status-warning-copy-label = Kin net kopiearje. Ferfarskje de side en probearje it opnij.
+pdfjs-views-manager-status-warning-delete-label = Kin net fuortsmite. Ferfarskje de side en probearje it opnij.
+pdfjs-views-manager-status-warning-save-label = Kin net bewarje. Ferfarskje de side en probearje it opnij.
+pdfjs-views-manager-status-undo-button-label = Ungedien meitsje
+pdfjs-views-manager-status-done-button-label = Dien
+pdfjs-views-manager-status-close-button =
+    .title = Slute
+pdfjs-views-manager-status-close-button-label = Slute
+pdfjs-views-manager-paste-button-label = Plakke
+pdfjs-views-manager-paste-button-before =
+    .title = Plakke foar de earste side
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Plakke nei side { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NIJ
+pdfjs-views-manager-waiting-for-file = Best芒n oplade鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Siden beheare
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Bewarre 没ndertekening fuortsmite
+pdfjs-editor-delete-signature-button-label1 = Bewarre 没ndertekening fuortsmite
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Beskriuwing bewurkje
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Beskriuwing bewurkje
diff --git a/public/pdfjs/web/locale/ga-IE/viewer.ftl b/public/pdfjs/web/locale/ga-IE/viewer.ftl
new file mode 100644
index 0000000..680d5bf
--- /dev/null
+++ b/public/pdfjs/web/locale/ga-IE/viewer.ftl
@@ -0,0 +1,180 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = An Leathanach Roimhe Seo
+pdfjs-previous-button-label = Roimhe Seo
+pdfjs-next-button =
+    .title = An Ch茅ad Leathanach Eile
+pdfjs-next-button-label = Ar Aghaidh
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Leathanach
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = as { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } as { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = S煤m谩il Amach
+pdfjs-zoom-out-button-label = S煤m谩il Amach
+pdfjs-zoom-in-button =
+    .title = S煤m谩il Isteach
+pdfjs-zoom-in-button-label = S煤m谩il Isteach
+pdfjs-zoom-select =
+    .title = S煤m谩il
+pdfjs-presentation-mode-button =
+    .title = 脷s谩id an M贸d L谩ithreoireachta
+pdfjs-presentation-mode-button-label = M贸d L谩ithreoireachta
+pdfjs-open-file-button =
+    .title = Oscail Comhad
+pdfjs-open-file-button-label = Oscail
+pdfjs-print-button =
+    .title = Priont谩il
+pdfjs-print-button-label = Priont谩il
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Uirlis铆
+pdfjs-tools-button-label = Uirlis铆
+pdfjs-first-page-button =
+    .title = Go dt铆 an ch茅ad leathanach
+pdfjs-first-page-button-label = Go dt铆 an ch茅ad leathanach
+pdfjs-last-page-button =
+    .title = Go dt铆 an leathanach deiridh
+pdfjs-last-page-button-label = Go dt铆 an leathanach deiridh
+pdfjs-page-rotate-cw-button =
+    .title = Rothlaigh ar deiseal
+pdfjs-page-rotate-cw-button-label = Rothlaigh ar deiseal
+pdfjs-page-rotate-ccw-button =
+    .title = Rothlaigh ar tuathal
+pdfjs-page-rotate-ccw-button-label = Rothlaigh ar tuathal
+pdfjs-cursor-text-select-tool-button =
+    .title = Cumasaigh an Uirlis Roghnaithe T茅acs
+pdfjs-cursor-text-select-tool-button-label = Uirlis Roghnaithe T茅acs
+pdfjs-cursor-hand-tool-button =
+    .title = Cumasaigh an Uirlis L谩imhe
+pdfjs-cursor-hand-tool-button-label = Uirlis L谩imhe
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Air铆onna na C谩ip茅ise鈥�
+pdfjs-document-properties-button-label = Air铆onna na C谩ip茅ise鈥�
+pdfjs-document-properties-file-name = Ainm an chomhaid:
+pdfjs-document-properties-file-size = M茅id an chomhaid:
+pdfjs-document-properties-title = Teideal:
+pdfjs-document-properties-author = 脷dar:
+pdfjs-document-properties-subject = 脕bhar:
+pdfjs-document-properties-keywords = Eochairfhocail:
+pdfjs-document-properties-creation-date = D谩ta Cruthaithe:
+pdfjs-document-properties-modification-date = D谩ta Athraithe:
+pdfjs-document-properties-creator = Cruthaitheoir:
+pdfjs-document-properties-producer = Cruthaitheoir an PDF:
+pdfjs-document-properties-version = Leagan PDF:
+pdfjs-document-properties-page-count = L铆on Leathanach:
+
+##
+
+pdfjs-document-properties-close-button = D煤n
+
+## Print
+
+pdfjs-print-progress-message = C谩ip茅is 谩 hullmh煤 le priont谩il鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cealaigh
+pdfjs-printing-not-supported = Rabhadh: N铆 thaca铆onn an brabhs谩la铆 le priont谩il go hioml谩n.
+pdfjs-printing-not-ready = Rabhadh: N铆 f茅idir an PDF a phriont谩il go dt铆 go mbeidh an ch谩ip茅is ioml谩n l贸d谩ilte.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Scor谩naigh an Barra Taoibh
+pdfjs-toggle-sidebar-button-label = Scor谩naigh an Barra Taoibh
+pdfjs-document-outline-button =
+    .title = Taispe谩in Iml铆ne na C谩ip茅ise (d茅chlice谩il chun chuile rud a leathn煤 n贸 a laghd煤)
+pdfjs-document-outline-button-label = Creatlach na C谩ip茅ise
+pdfjs-attachments-button =
+    .title = Taispe谩in Iat谩in
+pdfjs-attachments-button-label = Iat谩in
+pdfjs-thumbs-button =
+    .title = Taispe谩in Mionsamhlacha
+pdfjs-thumbs-button-label = Mionsamhlacha
+pdfjs-findbar-button =
+    .title = Aimsigh sa Ch谩ip茅is
+pdfjs-findbar-button-label = Aimsigh
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Leathanach { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Mionsamhail Leathanaigh { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Aimsigh
+    .placeholder = Aimsigh sa ch谩ip茅is鈥�
+pdfjs-find-previous-button =
+    .title = Aimsigh an sampla roimhe seo den nath seo
+pdfjs-find-previous-button-label = Roimhe seo
+pdfjs-find-next-button =
+    .title = Aimsigh an ch茅ad sampla eile den nath sin
+pdfjs-find-next-button-label = Ar aghaidh
+pdfjs-find-highlight-checkbox = Aibhsigh uile
+pdfjs-find-match-case-checkbox-label = C谩s铆ogair
+pdfjs-find-entire-word-checkbox-label = Focail ioml谩na
+pdfjs-find-reached-top = Ag barr na c谩ip茅ise, ag lean煤int 贸n mbun
+pdfjs-find-reached-bottom = Ag bun na c谩ip茅ise, ag lean煤int 贸n mbarr
+pdfjs-find-not-found = Fr谩sa gan aimsi煤
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Leithead Leathanaigh
+pdfjs-page-scale-fit = Laghdaigh go dt铆 an Leathanach
+pdfjs-page-scale-auto = S煤m谩il Uathoibr铆och
+pdfjs-page-scale-actual = F铆ormh茅id
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Tharla earr谩id agus an ch谩ip茅is PDF 谩 l贸d谩il.
+pdfjs-invalid-file-error = Comhad neamhbhail铆 n贸 truaillithe PDF.
+pdfjs-missing-file-error = Comhad PDF ar iarraidh.
+pdfjs-unexpected-response-error = Freagra 贸n bhfreastala铆 nach rabhthas ag s煤il leis.
+pdfjs-rendering-error = Tharla earr谩id agus an leathanach 谩 leagan amach.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [An贸t谩il { $type }]
+
+## Password
+
+pdfjs-password-label = Cuir an focal faire isteach chun an comhad PDF seo a oscailt.
+pdfjs-password-invalid = Focal faire m铆cheart. D茅an iarracht eile.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Cealaigh
+pdfjs-web-fonts-disabled = T谩 cl贸fhoirne Gr茅as谩in d铆chumasaithe: n铆 f茅idir cl贸fhoirne leabaithe PDF a 煤s谩id.
diff --git a/public/pdfjs/web/locale/gd/viewer.ftl b/public/pdfjs/web/locale/gd/viewer.ftl
new file mode 100644
index 0000000..a15bc9e
--- /dev/null
+++ b/public/pdfjs/web/locale/gd/viewer.ftl
@@ -0,0 +1,266 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = An duilleag roimhe
+pdfjs-previous-button-label = Air ais
+pdfjs-next-button =
+    .title = An ath-dhuilleag
+pdfjs-next-button-label = Air adhart
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Duilleag
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 脿 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 脿 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = S霉m a-mach
+pdfjs-zoom-out-button-label = S霉m a-mach
+pdfjs-zoom-in-button =
+    .title = S霉m a-steach
+pdfjs-zoom-in-button-label = S霉m a-steach
+pdfjs-zoom-select =
+    .title = S霉m
+pdfjs-presentation-mode-button =
+    .title = Gearr leum dhan mhodh taisbeanaidh
+pdfjs-presentation-mode-button-label = Am modh taisbeanaidh
+pdfjs-open-file-button =
+    .title = Fosgail faidhle
+pdfjs-open-file-button-label = Fosgail
+pdfjs-print-button =
+    .title = Cl貌-bhuail
+pdfjs-print-button-label = Cl貌-bhuail
+pdfjs-save-button =
+    .title = S脿bhail
+pdfjs-save-button-label = S脿bhail
+pdfjs-bookmark-button =
+    .title = An duilleag l脿ithreach (Seall an URL on duilleag l脿ithreach)
+pdfjs-bookmark-button-label = An duilleag l脿ithreach
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Innealan
+pdfjs-tools-button-label = Innealan
+pdfjs-first-page-button =
+    .title = Rach gun chiad duilleag
+pdfjs-first-page-button-label = Rach gun chiad duilleag
+pdfjs-last-page-button =
+    .title = Rach gun duilleag mu dheireadh
+pdfjs-last-page-button-label = Rach gun duilleag mu dheireadh
+pdfjs-page-rotate-cw-button =
+    .title = Cuairtich gu deiseil
+pdfjs-page-rotate-cw-button-label = Cuairtich gu deiseil
+pdfjs-page-rotate-ccw-button =
+    .title = Cuairtich gu tuathail
+pdfjs-page-rotate-ccw-button-label = Cuairtich gu tuathail
+pdfjs-cursor-text-select-tool-button =
+    .title = Cuir an comas inneal taghadh an teacsa
+pdfjs-cursor-text-select-tool-button-label = Inneal taghadh an teacsa
+pdfjs-cursor-hand-tool-button =
+    .title = Cuir inneal na l脿imhe an comas
+pdfjs-cursor-hand-tool-button-label = Inneal na l脿imhe
+pdfjs-scroll-page-button =
+    .title = Cleachd sgroladh duilleige
+pdfjs-scroll-page-button-label = Sgroladh duilleige
+pdfjs-scroll-vertical-button =
+    .title = Cleachd sgroladh inghearach
+pdfjs-scroll-vertical-button-label = Sgroladh inghearach
+pdfjs-scroll-horizontal-button =
+    .title = Cleachd sgroladh c貌mhnard
+pdfjs-scroll-horizontal-button-label = Sgroladh c貌mhnard
+pdfjs-scroll-wrapped-button =
+    .title = Cleachd sgroladh paisgte
+pdfjs-scroll-wrapped-button-label = Sgroladh paisgte
+pdfjs-spread-none-button =
+    .title = Na cuir c貌mhla sgoileadh dhuilleagan
+pdfjs-spread-none-button-label = Gun sgaoileadh dhuilleagan
+pdfjs-spread-odd-button =
+    .title = Cuir c貌mhla duilleagan sgaoilte a th貌isicheas le duilleagan aig a bheil 脿ireamh chorr
+pdfjs-spread-odd-button-label = Sgaoileadh dhuilleagan corra
+pdfjs-spread-even-button =
+    .title = Cuir c貌mhla duilleagan sgaoilte a th貌isicheas le duilleagan aig a bheil 脿ireamh chothrom
+pdfjs-spread-even-button-label = Sgaoileadh dhuilleagan cothrom
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Roghainnean na sgr矛obhainne鈥�
+pdfjs-document-properties-button-label = Roghainnean na sgr矛obhainne鈥�
+pdfjs-document-properties-file-name = Ainm an fhaidhle:
+pdfjs-document-properties-file-size = Meud an fhaidhle:
+pdfjs-document-properties-title = Tiotal:
+pdfjs-document-properties-author = 脵ghdar:
+pdfjs-document-properties-subject = Cuspair:
+pdfjs-document-properties-keywords = Faclan-luirg:
+pdfjs-document-properties-creation-date = Latha a chruthachaidh:
+pdfjs-document-properties-modification-date = Latha atharrachaidh:
+pdfjs-document-properties-creator = Cruthadair:
+pdfjs-document-properties-producer = Saothraiche a' PDF:
+pdfjs-document-properties-version = Tionndadh a' PDF:
+pdfjs-document-properties-page-count = 脌ireamh de dhuilleagan:
+pdfjs-document-properties-page-size = Meud na duilleige:
+pdfjs-document-properties-page-size-unit-inches = ann an
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portraid
+pdfjs-document-properties-page-size-orientation-landscape = dreach-t矛re
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Litir
+pdfjs-document-properties-page-size-name-legal = Laghail
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Grad shealladh-l矛n:
+pdfjs-document-properties-linearized-yes = Tha
+pdfjs-document-properties-linearized-no = Chan eil
+pdfjs-document-properties-close-button = D霉in
+
+## Print
+
+pdfjs-print-progress-message = Ag ullachadh na sgr矛obhainn airson cl貌-bhualadh鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Sguir dheth
+pdfjs-printing-not-supported = Rabhadh: Chan eil am brabhsair seo a' cur l脿n-taic ri cl貌-bhualadh.
+pdfjs-printing-not-ready = Rabhadh: Cha deach am PDF a luchdadh gu tur airson cl貌-bhualadh.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Toglaich am b脿r-taoibh
+pdfjs-toggle-sidebar-notification-button =
+    .title = Toglaich am b脿r-taoibh (tha oir-loidhne/ceanglachain/breathan aig an sgr矛obhainn)
+pdfjs-toggle-sidebar-button-label = Toglaich am b脿r-taoibh
+pdfjs-document-outline-button =
+    .title = Seall oir-loidhne na sgr矛obhainn (d猫an briogadh d霉bailte airson a h-uile n矛 a leudachadh/a cho-theannadh)
+pdfjs-document-outline-button-label = Oir-loidhne na sgr矛obhainne
+pdfjs-attachments-button =
+    .title = Seall na ceanglachain
+pdfjs-attachments-button-label = Ceanglachain
+pdfjs-layers-button =
+    .title = Seall na breathan (d猫an briogadh d霉bailte airson a h-uile breath ath-shuidheachadh dhan staid bhunaiteach)
+pdfjs-layers-button-label = Breathan
+pdfjs-thumbs-button =
+    .title = Seall na dealbhagan
+pdfjs-thumbs-button-label = Dealbhagan
+pdfjs-current-outline-item-button =
+    .title = Lorg n矛 l脿ithreach na h-oir-loidhne
+pdfjs-current-outline-item-button-label = N矛 l脿ithreach na h-oir-loidhne
+pdfjs-findbar-button =
+    .title = Lorg san sgr矛obhainn
+pdfjs-findbar-button-label = Lorg
+pdfjs-additional-layers = Barrachd breathan
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Duilleag a { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Dealbhag duilleag a { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Lorg
+    .placeholder = Lorg san sgr矛obhainn...
+pdfjs-find-previous-button =
+    .title = Lorg l脿thair roimhe na h-abairt seo
+pdfjs-find-previous-button-label = Air ais
+pdfjs-find-next-button =
+    .title = Lorg ath-l脿thair na h-abairt seo
+pdfjs-find-next-button-label = Air adhart
+pdfjs-find-highlight-checkbox = Soillsich a h-uile
+pdfjs-find-match-case-checkbox-label = Aire do litrichean m貌ra is beaga
+pdfjs-find-match-diacritics-checkbox-label = Aire do str脿can
+pdfjs-find-entire-word-checkbox-label = Faclan-sl脿na
+pdfjs-find-reached-top = R脿inig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige
+pdfjs-find-reached-bottom = R脿inig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige
+pdfjs-find-not-found = Cha deach an abairt a lorg
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Leud na duilleige
+pdfjs-page-scale-fit = Freagair ri meud na duilleige
+pdfjs-page-scale-auto = S霉m f猫in-obrachail
+pdfjs-page-scale-actual = Am f矛or-mheud
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Duilleag { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Thachair mearachd r猫 luchdadh a' PDF.
+pdfjs-invalid-file-error = Faidhle PDF a tha m矛-dhligheach no coirbte.
+pdfjs-missing-file-error = Faidhle PDF a tha a dh矛th.
+pdfjs-unexpected-response-error = Freagairt on fhrithealaiche ris nach robh d霉il.
+pdfjs-rendering-error = Thachair mearachd r猫 reandaradh na duilleige.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [N貌tachadh { $type }]
+
+## Password
+
+pdfjs-password-label = Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.
+pdfjs-password-invalid = Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?
+pdfjs-password-ok-button = Ceart ma-th脿
+pdfjs-password-cancel-button = Sguir dheth
+pdfjs-web-fonts-disabled = Tha cruthan-cl貌 l矛n 脿 comas: Chan urrainn dhuinn cruthan-cl貌 PDF leabaichte a chleachdadh.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Teacsa
+pdfjs-editor-free-text-button-label = Teacsa
+pdfjs-editor-ink-button =
+    .title = Tarraing
+pdfjs-editor-ink-button-label = Tarraing
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Dath
+pdfjs-editor-free-text-size-input = Meud
+pdfjs-editor-ink-color-input = Dath
+pdfjs-editor-ink-thickness-input = Tighead
+pdfjs-editor-ink-opacity-input = Tr矛d-dhoilleireachd
diff --git a/public/pdfjs/web/locale/gl/viewer.ftl b/public/pdfjs/web/locale/gl/viewer.ftl
new file mode 100644
index 0000000..b77dda3
--- /dev/null
+++ b/public/pdfjs/web/locale/gl/viewer.ftl
@@ -0,0 +1,591 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩xina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = Seguinte p谩xina
+pdfjs-next-button-label = Seguinte
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P谩xina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Reducir
+pdfjs-zoom-out-button-label = Reducir
+pdfjs-zoom-in-button =
+    .title = Ampliar
+pdfjs-zoom-in-button-label = Ampliar
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Cambiar ao modo presentaci贸n
+pdfjs-presentation-mode-button-label = Modo presentaci贸n
+pdfjs-open-file-button =
+    .title = Abrir ficheiro
+pdfjs-open-file-button-label = Abrir
+pdfjs-print-button =
+    .title = Imprimir
+pdfjs-print-button-label = Imprimir
+pdfjs-save-button =
+    .title = Gardar
+pdfjs-save-button-label = Gardar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Descargar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Descargar
+pdfjs-bookmark-button =
+    .title = P谩xina actual (ver o URL da p谩xina actual)
+pdfjs-bookmark-button-label = P谩xina actual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ferramentas
+pdfjs-tools-button-label = Ferramentas
+pdfjs-first-page-button =
+    .title = Ir 谩 primeira p谩xina
+pdfjs-first-page-button-label = Ir 谩 primeira p谩xina
+pdfjs-last-page-button =
+    .title = Ir 谩 煤ltima p谩xina
+pdfjs-last-page-button-label = Ir 谩 煤ltima p谩xina
+pdfjs-page-rotate-cw-button =
+    .title = Rotar no sentido das agullas do reloxo
+pdfjs-page-rotate-cw-button-label = Rotar no sentido das agullas do reloxo
+pdfjs-page-rotate-ccw-button =
+    .title = Rotar no sentido contrario 谩s agullas do reloxo
+pdfjs-page-rotate-ccw-button-label = Rotar no sentido contrario 谩s agullas do reloxo
+pdfjs-cursor-text-select-tool-button =
+    .title = Activar a ferramenta de selecci贸n de texto
+pdfjs-cursor-text-select-tool-button-label = Ferramenta de selecci贸n de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Activar a ferramenta de man
+pdfjs-cursor-hand-tool-button-label = Ferramenta de man
+pdfjs-scroll-page-button =
+    .title = Usar o desprazamento da p谩xina
+pdfjs-scroll-page-button-label = Desprazamento da p谩xina
+pdfjs-scroll-vertical-button =
+    .title = Usar o desprazamento vertical
+pdfjs-scroll-vertical-button-label = Desprazamento vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usar o desprazamento horizontal
+pdfjs-scroll-horizontal-button-label = Desprazamento horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Usar o desprazamento en bloque
+pdfjs-scroll-wrapped-button-label = Desprazamento por bloque
+pdfjs-spread-none-button =
+    .title = Non agrupar p谩xinas
+pdfjs-spread-none-button-label = Ning煤n agrupamento
+pdfjs-spread-odd-button =
+    .title = Crea grupo de p谩xinas que comezan con n煤meros de p谩xina impares
+pdfjs-spread-odd-button-label = Agrupamento impar
+pdfjs-spread-even-button =
+    .title = Crea grupo de p谩xinas que comezan con n煤meros de p谩xina pares
+pdfjs-spread-even-button-label = Agrupamento par
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiedades do documento鈥�
+pdfjs-document-properties-button-label = Propiedades do documento鈥�
+pdfjs-document-properties-file-name = Nome do ficheiro:
+pdfjs-document-properties-file-size = Tama帽o do ficheiro:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = T铆tulo:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Asunto:
+pdfjs-document-properties-keywords = Palabras clave:
+pdfjs-document-properties-creation-date = Data de creaci贸n:
+pdfjs-document-properties-modification-date = Data de modificaci贸n:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creado por:
+pdfjs-document-properties-producer = Xenerador do PDF:
+pdfjs-document-properties-version = Versi贸n de PDF:
+pdfjs-document-properties-page-count = N煤mero de p谩xinas:
+pdfjs-document-properties-page-size = Tama帽o da p谩xina:
+pdfjs-document-properties-page-size-unit-inches = pol
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = horizontal
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Visualizaci贸n r谩pida das p谩xinas web:
+pdfjs-document-properties-linearized-yes = Si
+pdfjs-document-properties-linearized-no = Non
+pdfjs-document-properties-close-button = Pechar
+
+## Print
+
+pdfjs-print-progress-message = Preparando o documento para imprimir鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancelar
+pdfjs-printing-not-supported = Aviso: A impresi贸n non 茅 compat铆bel de todo con este navegador.
+pdfjs-printing-not-ready = Aviso: O PDF non se cargou completamente para imprimirse.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Amosar/agochar a barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Alternar barra lateral (o documento cont茅n esquema/anexos/capas)
+pdfjs-toggle-sidebar-button-label = Amosar/agochar a barra lateral
+pdfjs-document-outline-button =
+    .title = Amosar a estrutura do documento (dobre clic para expandir/contraer todos os elementos)
+pdfjs-document-outline-button-label = Estrutura do documento
+pdfjs-attachments-button =
+    .title = Amosar anexos
+pdfjs-attachments-button-label = Anexos
+pdfjs-layers-button =
+    .title = Mostrar capas (prema d煤as veces para restaurar todas as capas o estado predeterminado)
+pdfjs-layers-button-label = Capas
+pdfjs-thumbs-button =
+    .title = Amosar miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Atopar o elemento delimitado actualmente
+pdfjs-current-outline-item-button-label = Elemento delimitado actualmente
+pdfjs-findbar-button =
+    .title = Atopar no documento
+pdfjs-findbar-button-label = Atopar
+pdfjs-additional-layers = Capas adicionais
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P谩xina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura da p谩xina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Atopar
+    .placeholder = Atopar no documento鈥�
+pdfjs-find-previous-button =
+    .title = Atopar a anterior aparici贸n da frase
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button =
+    .title = Atopar a seguinte aparici贸n da frase
+pdfjs-find-next-button-label = Seguinte
+pdfjs-find-highlight-checkbox = Realzar todo
+pdfjs-find-match-case-checkbox-label = Diferenciar mai煤sculas de min煤sculas
+pdfjs-find-match-diacritics-checkbox-label = Distinguir os diacr铆ticos
+pdfjs-find-entire-word-checkbox-label = Palabras completas
+pdfjs-find-reached-top = Chegouse ao inicio do documento, continuar desde o final
+pdfjs-find-reached-bottom = Chegouse ao final do documento, continuar desde o inicio
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] Coincidencia { $current } de { $total }
+       *[other] Coincidencia { $current } de { $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] M谩is de { $limit } coincidencia
+       *[other] M谩is de { $limit } coincidencias
+    }
+pdfjs-find-not-found = Non se atopou a frase
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Largura da p谩xina
+pdfjs-page-scale-fit = Axuste de p谩xina
+pdfjs-page-scale-auto = Zoom autom谩tico
+pdfjs-page-scale-actual = Tama帽o actual
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P谩xina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Produciuse un erro ao cargar o PDF.
+pdfjs-invalid-file-error = Ficheiro PDF danado ou non v谩lido.
+pdfjs-missing-file-error = Falta o ficheiro PDF.
+pdfjs-unexpected-response-error = Resposta inesperada do servidor.
+pdfjs-rendering-error = Produciuse un erro ao representar a p谩xina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotaci贸n { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Escriba o contrasinal para abrir este ficheiro PDF.
+pdfjs-password-invalid = Contrasinal incorrecto. Tente de novo.
+pdfjs-password-ok-button = Aceptar
+pdfjs-password-cancel-button = Cancelar
+pdfjs-web-fonts-disabled = Desactiv谩ronse as fontes web:  foi impos铆bel usar as fontes incrustadas no PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texto
+pdfjs-editor-free-text-button-label = Texto
+pdfjs-editor-ink-button =
+    .title = Debuxo
+pdfjs-editor-ink-button-label = Debuxo
+pdfjs-editor-stamp-button =
+    .title = Engadir ou editar imaxes
+pdfjs-editor-stamp-button-label = Engadir ou editar imaxes
+pdfjs-editor-highlight-button =
+    .title = Destacar
+pdfjs-editor-highlight-button-label = Destacar
+pdfjs-highlight-floating-button1 =
+    .title = Destacar
+    .aria-label = Destacar
+pdfjs-highlight-floating-button-label = Destacar
+pdfjs-editor-signature-button =
+    .title = Engadir sinatura
+pdfjs-editor-signature-button-label = Engadir sinatura
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de destacados
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de debuxos
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de sinaturas: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de imaxes
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Eliminar debuxo
+pdfjs-editor-remove-freetext-button =
+    .title = Eliminar o texto
+pdfjs-editor-remove-stamp-button =
+    .title = Eliminar a imaxe
+pdfjs-editor-remove-highlight-button =
+    .title = Eliminar o resaltado
+pdfjs-editor-remove-signature-button =
+    .title = Eliminar sinatura
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Cor
+pdfjs-editor-free-text-size-input = Tama帽o
+pdfjs-editor-ink-color-input = Cor
+pdfjs-editor-ink-thickness-input = Grosor
+pdfjs-editor-ink-opacity-input = Opacidade
+pdfjs-editor-stamp-add-image-button =
+    .title = Engadir imaxe
+pdfjs-editor-stamp-add-image-button-label = Engadir imaxe
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Grosor
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Cambiar o grosor ao resaltar elementos que non sexan texto
+pdfjs-editor-add-signature-container =
+    .aria-label = Controis de sinaturas e sinaturas gardadas
+pdfjs-editor-signature-add-signature-button =
+    .title = Engadir nova sinatura
+pdfjs-editor-signature-add-signature-button-label = Engadir nova sinatura
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Sinatura gardada: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de texto
+    .default-content = Empeza a escribir...
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texto alternativo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editar o texto alternativo
+pdfjs-editor-alt-text-dialog-label = Escoller unha opci贸n
+pdfjs-editor-alt-text-dialog-description = O texto alternativo (texto alt) axuda cando as persoas non poden ver a imaxe ou cando non se carga.
+pdfjs-editor-alt-text-add-description-label = Engadir unha descrici贸n
+pdfjs-editor-alt-text-add-description-description = Tenta escribir 1-2 frases que describan o tema, o escenario ou as acci贸ns.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativo
+pdfjs-editor-alt-text-mark-decorative-description = Util铆zase para imaxes ornamentais, como bordos ou marcas de auga.
+pdfjs-editor-alt-text-cancel-button = Cancelar
+pdfjs-editor-alt-text-save-button = Gardar
+pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativo
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Por exemplo, 芦Un mozo s茅ntase 谩 mesa para comer禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texto alternativo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Esquina superior esquerda: cambia o tama帽o
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Medio superior: cambia o tama帽o
+pdfjs-editor-resizer-top-right =
+    .aria-label = Esquina superior dereita: cambia o tama帽o
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Medio dereito: cambia o tama帽o
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Esquina inferior dereita: cambia o tama帽o
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Abaixo medio: cambia o tama帽o
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Esquina inferior esquerda: cambia o tama帽o
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Medio esquerdo: cambia o tama帽o
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Cor de resaltado
+pdfjs-editor-colorpicker-button =
+    .title = Cambiar de cor
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Opci贸ns de cor
+pdfjs-editor-colorpicker-yellow =
+    .title = Amarelo
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Azul
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Vermello
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Amosar todo
+pdfjs-editor-highlight-show-all-button =
+    .title = Amosar todo
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descrici贸n da imaxe)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Engadir texto alternativo (descrici贸n da imaxe)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Escribe a t煤a descrici贸n aqu铆...
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Breve descrici贸n para as persoas que non poden ver a imaxe ou cando a imaxe non carga.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo creouse automaticamente e pode ser inexacto.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = M谩is informaci贸n
+pdfjs-editor-new-alt-text-create-automatically-button-label = Crea texto alternativo automaticamente
+pdfjs-editor-new-alt-text-not-now-button = Agora non
+pdfjs-editor-new-alt-text-error-title = Non se puido crear o texto alternativo automaticamente
+pdfjs-editor-new-alt-text-error-description = Escribe o teu propio texto alternativo ou t茅ntao de novo m谩is tarde.
+pdfjs-editor-new-alt-text-error-close-button = Pechar
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = Descargando o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Texto alternativo engadido
+pdfjs-editor-new-alt-text-added-button-label = Texto alternativo engadido
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Falta o texto alternativo
+pdfjs-editor-new-alt-text-missing-button-label = Falta o texto alternativo
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Revisar o texto alternativo
+pdfjs-editor-new-alt-text-to-review-button-label = Revisar o texto alternativo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automaticamente: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Configuraci贸n do texto alternativo da imaxe
+pdfjs-image-alt-text-settings-button-label = Configuraci贸n do texto alternativo da imaxe
+pdfjs-editor-alt-text-settings-dialog-label = Configuraci贸n do texto alternativo da imaxe
+pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo autom谩tico
+pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automaticamente
+pdfjs-editor-alt-text-settings-create-model-description = Suxire descrici贸ns para axudar 谩s persoas que non poden ver a imaxe ou cando a imaxe non se carga.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Funciona localmente no teu dispositivo para que os teus datos se mante帽an privados. Necesario para o texto alternativo autom谩tico.
+pdfjs-editor-alt-text-settings-delete-model-button = Eliminar
+pdfjs-editor-alt-text-settings-download-model-button = Descargar
+pdfjs-editor-alt-text-settings-downloading-model-button = Descargando鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar o editor de texto alternativo inmediatamente ao engadir unha imaxe
+pdfjs-editor-alt-text-settings-show-dialog-description = Ax煤dache a asegurarte de que todas as t煤as imaxes te帽an texto alternativo.
+pdfjs-editor-alt-text-settings-close-button = Pechar
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Resaltado engadido
+pdfjs-editor-freetext-added-alert = Texto engadido
+pdfjs-editor-ink-added-alert = Debuxo engadido
+pdfjs-editor-stamp-added-alert = Imaxe engadida
+pdfjs-editor-signature-added-alert = Sinatura engadida
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado
+pdfjs-editor-undo-bar-message-freetext = Texto eliminado
+pdfjs-editor-undo-bar-message-ink = Debuxo eliminado
+pdfjs-editor-undo-bar-message-stamp = Imaxe eliminada
+pdfjs-editor-undo-bar-message-signature = Sinatura eliminada
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] Eliminouse { $count } anotaci贸n
+       *[other] Elimin谩ronse { $count } anotaci贸ns
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Desfacer
+pdfjs-editor-undo-bar-undo-button-label = Desfacer
+pdfjs-editor-undo-bar-close-button =
+    .title = Pechar
+pdfjs-editor-undo-bar-close-button-label = Pechar
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Este modal permite ao usuario crear unha sinatura para engadila a un documento PDF. O usuario pode editar o nome (que tam茅n serve como texto alternativo) e, opcionalmente, gardar a sinatura para usala novamente.
+pdfjs-editor-add-signature-dialog-title = Engadir unha sinatura
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Tipo
+    .title = Tipo
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Debuxar
+    .title = Debuxar
+pdfjs-editor-add-signature-image-button = Imaxe
+    .title = Imaxe
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Escribe a t煤a sinatura
+    .placeholder = Escribe a t煤a sinatura
+pdfjs-editor-add-signature-draw-placeholder = Debuxa a t煤a sinatura
+pdfjs-editor-add-signature-draw-thickness-range-label = Grosor
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Grosor do debuxo: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Arrastra un ficheiro aqu铆 para cargalo
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ou selecciona ficheiros de imaxes
+       *[other] Ou navega ficheiros de imaxes
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descrici贸n (texto alternativo)
+pdfjs-editor-add-signature-description-input =
+    .title = Descrici贸n (texto alternativo)
+pdfjs-editor-add-signature-description-default-when-drawing = Sinatura
+pdfjs-editor-add-signature-clear-button-label = Borrar a sinatura
+pdfjs-editor-add-signature-clear-button =
+    .title = Borrar a sinatura
+pdfjs-editor-add-signature-save-checkbox = Gardar a sinatura
+pdfjs-editor-add-signature-save-warning-message = Acadaches o l铆mite de 5 sinaturas gardadas. Elimina unha para gardar m谩is.
+pdfjs-editor-add-signature-image-upload-error-title = Non se puido cargar a imaxe
+pdfjs-editor-add-signature-image-upload-error-description = Comproba a t煤a conexi贸n de rede ou proba con outra imaxe.
+pdfjs-editor-add-signature-error-close-button = Pechar
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancelar
+pdfjs-editor-add-signature-add-button = Engadir
+pdfjs-editor-edit-signature-update-button = Actualizar
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Eliminar a sinatura gardada
+pdfjs-editor-delete-signature-button-label1 = Eliminar a sinatura gardada
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Editar descrici贸n
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Editar descrici贸n
diff --git a/public/pdfjs/web/locale/gn/viewer.ftl b/public/pdfjs/web/locale/gn/viewer.ftl
new file mode 100644
index 0000000..1a533eb
--- /dev/null
+++ b/public/pdfjs/web/locale/gn/viewer.ftl
@@ -0,0 +1,746 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Kuatiarogue mboyvegua
+pdfjs-previous-button-label = Mboyvegua
+pdfjs-next-button =
+    .title = Kuatiarogue upeigua
+pdfjs-next-button-label = Upeigua
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Kuatiarogue
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } gui
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Momich末
+pdfjs-zoom-out-button-label = Momich末
+pdfjs-zoom-in-button =
+    .title = Mbotuicha
+pdfjs-zoom-in-button-label = Mbotuicha
+pdfjs-zoom-select =
+    .title = Tuichakue
+pdfjs-presentation-mode-button =
+    .title = Jehechauka reko moambue
+pdfjs-presentation-mode-button-label = Jehechauka reko
+pdfjs-open-file-button =
+    .title = Marandurend谩pe jeike
+pdfjs-open-file-button-label = Jeike
+pdfjs-print-button =
+    .title = Monguatia
+pdfjs-print-button-label = Monguatia
+pdfjs-save-button =
+    .title = 脩ongatu
+pdfjs-save-button-label = 脩ongatu
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Mboguejy
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Mboguejy
+pdfjs-bookmark-button =
+    .title = Kuatiarogue ag虄agua (Ehecha URL kuatiarogue ag虄agua)
+pdfjs-bookmark-button-label = Kuatiarogue Ag虄agua
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Tembiporu
+pdfjs-tools-button-label = Tembiporu
+pdfjs-first-page-button =
+    .title = Kuatiarogue 帽epyr农me jeho
+pdfjs-first-page-button-label = Kuatiarogue 帽epyr农me jeho
+pdfjs-last-page-button =
+    .title = Kuatiarogue pah谩pe jeho
+pdfjs-last-page-button-label = Kuatiarogue pah谩pe jeho
+pdfjs-page-rotate-cw-button =
+    .title = Arav贸icha mbojere
+pdfjs-page-rotate-cw-button-label = Arav贸icha mbojere
+pdfjs-page-rotate-ccw-button =
+    .title = Aravo rapykue gotyo mbojere
+pdfjs-page-rotate-ccw-button-label = Aravo rapykue gotyo mbojere
+pdfjs-cursor-text-select-tool-button =
+    .title = Emyandy mo帽e鈥欋航r茫 jeporavo rembiporu
+pdfjs-cursor-text-select-tool-button-label = Mo帽e鈥欋航r茫 jeporavo rembiporu
+pdfjs-cursor-hand-tool-button =
+    .title = Tembiporu po pegua myandy
+pdfjs-cursor-hand-tool-button-label = Tembiporu po pegua
+pdfjs-scroll-page-button =
+    .title = Eiporu kuatiarogue jeku鈥檈
+pdfjs-scroll-page-button-label = Kuatiarogue jeku鈥檈
+pdfjs-scroll-vertical-button =
+    .title = Eiporu jeku鈥檈 ykegu谩va
+pdfjs-scroll-vertical-button-label = Jeku鈥檈 ykegu谩va
+pdfjs-scroll-horizontal-button =
+    .title = Eiporu jeku鈥檈 yvate gotyo
+pdfjs-scroll-horizontal-button-label = Jeku鈥檈 yvate gotyo
+pdfjs-scroll-wrapped-button =
+    .title = Eiporu jeku鈥檈 mbohyrupyre
+pdfjs-scroll-wrapped-button-label = Jeku鈥檈 mbohyrupyre
+pdfjs-spread-none-button =
+    .title = Ani ejuaju spreads kuatiarogue ndive
+pdfjs-spread-none-button-label = Spreads 峄箁e
+pdfjs-spread-odd-button =
+    .title = Embojuaju kuatiarogue jepysokue e帽epyr农vo kuatiarogue impar-vagui
+pdfjs-spread-odd-button-label = Spreads impar
+pdfjs-spread-even-button =
+    .title = Embojuaju kuatiarogue jepysokue e帽epyr农vo kuatiarogue par-vagui
+pdfjs-spread-even-button-label = Ipukuve uvei
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Kuatia mba鈥檈tee鈥�
+pdfjs-document-properties-button-label = Kuatia mba鈥檈tee鈥�
+pdfjs-document-properties-file-name = Marandurenda r茅ra:
+pdfjs-document-properties-file-size = Marandurenda tuichakue:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Teratee:
+pdfjs-document-properties-author = Apoh谩ra:
+pdfjs-document-properties-subject = Mba鈥檈gua:
+pdfjs-document-properties-keywords = Jehero:
+pdfjs-document-properties-creation-date = Te帽oihague arange:
+pdfjs-document-properties-modification-date = I帽ambue hague arange:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Apo鈥檡pyha:
+pdfjs-document-properties-producer = PDF mbosako鈥檌ha:
+pdfjs-document-properties-version = PDF mbojuehegua:
+pdfjs-document-properties-page-count = Kuatiarogue papapy:
+pdfjs-document-properties-page-size = Kuatiarogue tuichakue:
+pdfjs-document-properties-page-size-unit-inches = Amo
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = O末h谩icha
+pdfjs-document-properties-page-size-orientation-landscape = apaisado
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Kuatia帽e鈥欋航
+pdfjs-document-properties-page-size-name-legal = Tee
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 脩anduti jahecha pya鈥檈:
+pdfjs-document-properties-linearized-yes = A帽ete
+pdfjs-document-properties-linearized-no = Ah谩niri
+pdfjs-document-properties-close-button = Mboty
+
+## Print
+
+pdfjs-print-progress-message = Embosako鈥檌 kuatia emonguatia hag虄ua鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Heja
+pdfjs-printing-not-supported = Kyhyjer茫: 脩embokuatia ndojokupytyp谩i ko kundah谩ra ndive.
+pdfjs-printing-not-ready = Kyhyjer茫: Ko PDF nahenyh岷絤b谩i o帽embokuatia hag虄u谩icha.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Tenda yke moambue
+pdfjs-toggle-sidebar-notification-button =
+    .title = Embojopyru tenda ykegua (kuatia oguereko kuaakaha/moir农ha/帽u茫ha)
+pdfjs-toggle-sidebar-button-label = Tenda yke moambue
+pdfjs-document-outline-button =
+    .title = Ehechauka kuatia rape (eikutu mok玫i jey embotuicha/emomich末 hag虄ua opavavete mba鈥檈poru)
+pdfjs-document-outline-button-label = Kuatia apopyre
+pdfjs-attachments-button =
+    .title = Moir农ha jehechauka
+pdfjs-attachments-button-label = Moir农ha
+pdfjs-layers-button =
+    .title = Ehechauka 帽u茫ha (eikutu jo鈥檃 emomba鈥檃po hag虄ua opaite 帽u茫ha tekoyp媒pe)
+pdfjs-layers-button-label = 脩u茫ha
+pdfjs-thumbs-button =
+    .title = Mba鈥檈mir末 jehechauka
+pdfjs-thumbs-button-label = Mba鈥檈mir末
+pdfjs-current-outline-item-button =
+    .title = Eheka mba鈥檈poru ag虄aguait茅va
+pdfjs-current-outline-item-button-label = Mba鈥檈poru ag虄aguait茅va
+pdfjs-findbar-button =
+    .title = Kuati谩pe jeheka
+pdfjs-findbar-button-label = Juhu
+pdfjs-additional-layers = 脩u茫ha moir农gu谩va
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Kuatiarogue { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Kuatiarogue mba鈥檈mir末 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Eiporavo kuatiarogue { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Kuatiarogue { $page } { $total } mba鈥檈
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Juhu
+    .placeholder = Kuati谩pe jejuhu鈥�
+pdfjs-find-previous-button =
+    .title = Ejuhu 帽e鈥欋航rys媒i os岷解�檡py hague
+pdfjs-find-previous-button-label = Mboyvegua
+pdfjs-find-next-button =
+    .title = Eho 帽e鈥欋航 juhupyre upeigu谩vape
+pdfjs-find-next-button-label = Upeigua
+pdfjs-find-highlight-checkbox = Embojekuaavepa
+pdfjs-find-match-case-checkbox-label = Ejesareko taiguasu/taimich末re
+pdfjs-find-match-diacritics-checkbox-label = Diacr铆tico mo帽ondive
+pdfjs-find-entire-word-checkbox-label = 脩e鈥欋航 o末mb谩va
+pdfjs-find-reached-top = Ojehupyty kuatia 帽epyr农, oku鈥檈je媒ta kuatia paha guive
+pdfjs-find-reached-bottom = Ojehupyty kuatia paha, oku鈥檈je媒ta kuatia 帽epyr农 guive
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } ha { $total } ojuehegu谩va
+       *[other] { $current } ha { $total } ojuehegu谩va
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Hetave { $limit } ojuehegu谩va
+       *[other] Hetave { $limit } ojuehegu谩va
+    }
+pdfjs-find-not-found = 脩e鈥欋航rys媒i ojejuhu鈥欋还va
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Kuatiarogue pekue
+pdfjs-page-scale-fit = Kuatiarogue 帽emo末por茫
+pdfjs-page-scale-auto = Tuichakue ijehegu铆va
+pdfjs-page-scale-actual = Tuichakue ag虄agua
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Kuatiarogue { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Oiko jejavy PDF o帽emye帽yh岷絥gu茅vo.
+pdfjs-invalid-file-error = PDF marandurenda ndoik贸iva t茅r茫 ivaipyr茅va.
+pdfjs-missing-file-error = Ndaip贸ri PDF marandurenda
+pdfjs-unexpected-response-error = Mohendahavusu mbohov谩i eha鈥櫭玫鈥欋还va.
+pdfjs-rendering-error = Oiko jejavy ehechaukas茅vo kuatiarogue.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Jehaipy { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Emoinge 帽e鈥欋航帽emi eipe鈥檃 hag虄ua ko marandurenda PDF.
+pdfjs-password-invalid = 脩e鈥欋航帽emi ndoik贸iva. Eha鈥櫭� jey.
+pdfjs-password-ok-button = MONE抹
+pdfjs-password-cancel-button = Heja
+pdfjs-web-fonts-disabled = 脩anduti taity o帽emong茅ma: ndaikatumo鈥櫭 eiporu PDF jehai鈥櫭璿a taity.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Mo帽e鈥欋航r茫
+pdfjs-editor-color-picker-free-text-input =
+    .title = Emoambue mo帽e鈥欋航r茫 sa鈥檡
+pdfjs-editor-free-text-button-label = Mo帽e鈥欋航r茫
+pdfjs-editor-ink-button =
+    .title = Moha鈥櫭ga
+pdfjs-editor-color-picker-ink-input =
+    .title = Emoambue ta鈥櫭ga sa鈥檡
+pdfjs-editor-ink-button-label = Moha鈥櫭ga
+pdfjs-editor-stamp-button =
+    .title = Embojuaju t茅r茫 embosako鈥檌 ta鈥櫭ga
+pdfjs-editor-stamp-button-label = Embojuaju t茅r茫 embosako鈥檌 ta鈥櫭ga
+pdfjs-editor-highlight-button =
+    .title = Mbosa鈥檡
+pdfjs-editor-highlight-button-label = Mbosa鈥檡
+pdfjs-highlight-floating-button1 =
+    .title = Mbosa鈥檡
+    .aria-label = Mbosa鈥檡
+pdfjs-highlight-floating-button-label = Mbosa鈥檡
+pdfjs-comment-floating-button =
+    .title = Je鈥檈rei
+    .aria-label = Je鈥檈rei
+pdfjs-comment-floating-button-label = Je鈥檈rei
+pdfjs-editor-comment-button =
+    .title = Je鈥檈rei
+    .aria-label = Je鈥檈rei
+pdfjs-editor-comment-button-label = Je鈥檈rei
+pdfjs-editor-signature-button =
+    .title = Embojuaju teraguapy
+pdfjs-editor-signature-button-label = Embojuaju teraguapy
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Jehechaukar茫 mbosako鈥檌ha
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Ta鈥櫭ga鈥檃po mohe帽oiha
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Teraguapy mbosako鈥檌ha: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Ta鈥櫭ga mbosako鈥檌ha
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Emboguete ta鈥櫭ga
+pdfjs-editor-remove-freetext-button =
+    .title = Emboguete mo帽e鈥欋航r茫
+pdfjs-editor-remove-stamp-button =
+    .title = Emboguete ta鈥櫭ga
+pdfjs-editor-remove-highlight-button =
+    .title = Eipe鈥檃 jehechaveha
+pdfjs-editor-remove-signature-button =
+    .title = Embogue teraguapy
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Sa鈥檡
+pdfjs-editor-free-text-size-input = Tuichakue
+pdfjs-editor-ink-color-input = Sa鈥檡
+pdfjs-editor-ink-thickness-input = Anambusu
+pdfjs-editor-ink-opacity-input = Pyt农ngy
+pdfjs-editor-stamp-add-image-button =
+    .title = Embojuaju ta鈥櫭ga
+pdfjs-editor-stamp-add-image-button-label = Embojuaju ta鈥櫭ga
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Anambusu
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Emoambue anambusukue embosa鈥櫭絭o mba鈥檈poru ha鈥檈鈥欋还va mo帽e鈥欋航r茫
+pdfjs-editor-add-signature-container =
+    .aria-label = Teraguapy 帽ema帽a ha teraguapy 帽ongatupyre
+pdfjs-editor-signature-add-signature-button =
+    .title = Embojuaju teraguapy pyahu
+pdfjs-editor-signature-add-signature-button-label = Embojuaju teraguapy pyahu
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Teraguapy 帽ongatupyre: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Mo帽e鈥欋航r茫 mohe帽oiha
+    .default-content = E帽epyr农 ehai鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Je鈥檈rei
+       *[other] Je鈥檈reieta
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Emboty ta'茫ngarupa yke
+    .aria-label = Emboty ta'茫ngarupa yke
+pdfjs-editor-comments-sidebar-close-button-label = Emboty ta'茫ngarupa yke
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 驴Ehech谩pa pete末 mba始e ipor茫va? Emomba鈥檈 ha eheja jehaipy.
+pdfjs-editor-comments-sidebar-no-comments-link = Kuaave
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Mo帽e鈥欋航r茫 mok玫ih谩va
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Embojuruja mo帽e鈥欋航r茫 mok玫ih谩va
+pdfjs-editor-alt-text-dialog-label = Eiporavo poravor茫
+pdfjs-editor-alt-text-dialog-description = Mo帽e鈥欋航r茫 ykepegua (mo帽e鈥欋航r茫 ykepegua) nepytyv玫 nderehech谩iramo ta鈥櫭ga t茅r茫 nahenyh岷絠ramo.
+pdfjs-editor-alt-text-add-description-label = Embojuaju 帽emoha鈥櫭ga
+pdfjs-editor-alt-text-add-description-description = Ehaimi 1 t茅r茫 2 帽e鈥欋航juaju o帽e鈥欋航va pe t茅ma rehe, ijere t茅r茫 mba鈥檈ap贸re.
+pdfjs-editor-alt-text-mark-decorative-label = Emongurusu jeguak谩r玫
+pdfjs-editor-alt-text-mark-decorative-description = Ojeporu ta鈥櫭ga jeguakar茫, tembe鈥檡 t茅r茫 ta鈥櫭ga ruguar茫ramo.
+pdfjs-editor-alt-text-cancel-button = Heja
+pdfjs-editor-alt-text-save-button = 脩ongatu
+pdfjs-editor-alt-text-decorative-tooltip = Jeguak谩r玫 mongurusupyre
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Techapyr茫: 鈥淧ete末 mit茫rusu oguapy mes谩pe okaru hag虄ua鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Mo帽e鈥欋航r茫 mok玫ih谩va
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Yvate asu gotyo 鈥� emoambue tuichakue
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Yvate mbyt茅pe 鈥� emoambue tuichakue
+pdfjs-editor-resizer-top-right =
+    .aria-label = Yvate akat煤ape 鈥� emoambue tuichakue
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Mbyte akat煤ape 鈥� emoambue tuichakue
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Yvy gotyo akat煤ape 鈥� emoambue tuichakue
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Yvy gotyo mbyt茅pe 鈥� emoambue tuichakue
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Igu媒pe asu gotyo 鈥� emoambue tuichakue
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Mbyte asu gotyo 鈥� emoambue tuichakue
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Jehechaveha sa鈥檡
+pdfjs-editor-colorpicker-button =
+    .title = Emoambue sa鈥檡
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Sa鈥檡 poravopyr茫
+pdfjs-editor-colorpicker-yellow =
+    .title = Sa鈥檡ju
+pdfjs-editor-colorpicker-green =
+    .title = Hovy农
+pdfjs-editor-colorpicker-blue =
+    .title = Hovy
+pdfjs-editor-colorpicker-pink =
+    .title = Pyt茫ngy
+pdfjs-editor-colorpicker-red =
+    .title = Pyha
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Techaukapa
+pdfjs-editor-highlight-show-all-button =
+    .title = Techaukapa
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Embosako鈥檌 mo帽e鈥欋航r茫 mok玫iha (ta鈥櫭g谩re 帽e帽e鈥欋航)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Embojuaju mo帽e鈥欋航r茫 mok玫iha (ta鈥櫭g谩re 帽e帽e鈥欋航)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Edescribi ko鈥櫭e鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 脩emyesak茫 mbykymi opavave ohecha鈥欋还va upe ta鈥櫭ga t茅r茫 pe ta鈥櫭ga nahenyh岷絠ramo.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Ko mo帽e鈥欋航r茫 mok玫iha o帽emohe帽贸i ijehegui ha ikatu ndoikopor茫i.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Eikuaave
+pdfjs-editor-new-alt-text-create-automatically-button-label = Emohe帽贸i mo帽e鈥欋航r茫 mok玫iha ijehegu铆va
+pdfjs-editor-new-alt-text-not-now-button = Ani ko鈥櫭虄a
+pdfjs-editor-new-alt-text-error-title = No帽emohe帽贸i mo帽e鈥欋航r茫 mok玫iha ijehegu铆va
+pdfjs-editor-new-alt-text-error-description = Ehai ne mo帽e鈥欋航r茫 mok玫iha t茅r茫 eha鈥櫭� jey ag虄amieve.
+pdfjs-editor-new-alt-text-error-close-button = Mboty
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Emboguejyh铆na IA mo帽e鈥欋航r茫 mok玫ih谩va ({ $downloadedSize } { $totalSize } MB) mba鈥檈
+    .aria-valuetext = Emboguejyh铆na IA mo帽e鈥欋航r茫 mok玫ih谩va ({ $downloadedSize } { $totalSize } MB) mba鈥檈
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Mo帽e鈥欋航r茫 mok玫iha mbojuajupyre
+pdfjs-editor-new-alt-text-added-button-label = O帽embojuaju mo帽e鈥欋航r茫 mok玫iha
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Ndaip贸ri mo帽e鈥欋航r茫 mok玫iha
+pdfjs-editor-new-alt-text-missing-button-label = Ndaip贸ri mo帽e鈥欋航r茫 mok玫iha
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Ehechajey mo帽e鈥欋航r茫 mok玫iha
+pdfjs-editor-new-alt-text-to-review-button-label = Ehechajey mo帽e鈥欋航r茫 mok玫iha
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = He帽贸iva ijeheguiete: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Ta鈥櫭ga mo帽e鈥欋航r茫 mok玫iha 帽emboheko
+pdfjs-image-alt-text-settings-button-label = Ta鈥櫭ga mo帽e鈥欋航r茫 mok玫iha 帽emboheko
+pdfjs-editor-alt-text-settings-dialog-label = Ta鈥櫭ga mo帽e鈥欋航r茫 mok玫iha 帽emboheko
+pdfjs-editor-alt-text-settings-automatic-title = Mo帽e鈥欋航r茫 mok玫iha ijehegu铆va
+pdfjs-editor-alt-text-settings-create-model-button-label = Emohe帽贸i mo帽e鈥欋航r茫 mok玫iha ijehegu铆va
+pdfjs-editor-alt-text-settings-create-model-description = 脩emyesak茫 mbykymi opavave tapicha ohecha鈥欋还va upe ta鈥櫭ga t茅r茫 pe ta鈥櫭ga nahenyh岷絠ramo.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Pete末va IA mo帽e鈥欋航r茫 mok玫iha ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Oku鈥檈 mba鈥檈鈥檕kait茅pe umi mba鈥檈kuaar茫 heko帽emi hag虄ua. Tekotev岷絭a mo帽e鈥欋航r茫 ykegua ijehegu铆vape.
+pdfjs-editor-alt-text-settings-delete-model-button = Mboguete
+pdfjs-editor-alt-text-settings-download-model-button = Mboguejy
+pdfjs-editor-alt-text-settings-downloading-model-button = Emboguejyh铆na鈥�
+pdfjs-editor-alt-text-settings-editor-title = Mo帽e鈥欋航r茫 mok玫iha mbosako鈥檌ha
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Ehechauka mo帽e鈥欋航r茫 mok玫iha mbosako鈥檌ha embojuaj煤vo ta鈥櫭ga
+pdfjs-editor-alt-text-settings-show-dialog-description = Nepytyv玫ta ta鈥櫭gaku茅ra orekotaha mo帽e鈥欋航r茫 mok玫iha.
+pdfjs-editor-alt-text-settings-close-button = Mboty
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Techaukar茫 juajupyre
+pdfjs-editor-freetext-added-alert = Mo帽e鈥欋航r茫 juajupyre
+pdfjs-editor-ink-added-alert = Ta鈥櫭ga juajupyre
+pdfjs-editor-stamp-added-alert = Ta鈥櫭ga juajupyre
+pdfjs-editor-signature-added-alert = Teraguapy juajupyre
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Mbosa鈥櫭絭a mboguete
+pdfjs-editor-undo-bar-message-freetext = Mo帽e鈥欋航r茫 mboguepyre
+pdfjs-editor-undo-bar-message-ink = Ta鈥櫭ga mboguepyre
+pdfjs-editor-undo-bar-message-stamp = Ta鈥櫭ga mboguepyre
+pdfjs-editor-undo-bar-message-signature = Teraguapy mboguepyre
+pdfjs-editor-undo-bar-message-comment = Je鈥檈py mboguepyre
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } jehaikue mboguepyre
+       *[other] { $count } jehaikue mboguepyre
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Mboguevi
+pdfjs-editor-undo-bar-undo-button-label = Mboguevi
+pdfjs-editor-undo-bar-close-button =
+    .title = Mboty
+pdfjs-editor-undo-bar-close-button-label = Mboty
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-title = Embojuaju teraguapy
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Jehai
+    .title = Jehai
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Moha鈥櫭ga
+    .title = Moha鈥櫭ga
+pdfjs-editor-add-signature-image-button = Ta鈥櫭ga
+    .title = Ta鈥櫭ga
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Ehai nde reraguapy
+    .placeholder = Ehai nde reraguapy
+pdfjs-editor-add-signature-draw-placeholder = Emoha鈥櫭ga nde reraguapy
+pdfjs-editor-add-signature-draw-thickness-range-label = Anambusu
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Ta鈥櫭ga anambusukue: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Egueru marandurenda 谩pe ehupi hag虄ua
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Eiporavo ta鈥櫭ga marandurenda
+       *[other] Eiporavo ta鈥櫭ga marandurenda
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Moha鈥櫭ga (mo帽e鈥欋航r茫 ykepegua)
+pdfjs-editor-add-signature-description-input =
+    .title = Moha鈥櫭ga (mo帽e鈥欋航r茫 ykepegua)
+pdfjs-editor-add-signature-description-default-when-drawing = Teraguapy
+pdfjs-editor-add-signature-clear-button-label = Emboguete teraguapy
+pdfjs-editor-add-signature-clear-button =
+    .title = Emboguete teraguapy
+pdfjs-editor-add-signature-save-checkbox = E帽ongatu teraguapy
+pdfjs-editor-add-signature-save-warning-message = Ehupyt媒ma 5 mboheraguapy 帽ongatupyre. Embogue pete末 e帽ongatukuaa jey hag虄ua.
+pdfjs-editor-add-signature-image-upload-error-title = Ndaikat煤i ojehupi pe ta鈥櫭ga
+pdfjs-editor-add-signature-image-upload-error-description = Ehechajey ne 帽anduti oik贸pa t茅r茫 aha鈥櫭� ambue ta鈥櫭ga ndive.
+pdfjs-editor-add-signature-image-no-data-error-title = Ndaikat煤i ejapo ko ta鈥櫭g谩gui teraguapy
+pdfjs-editor-add-signature-image-no-data-error-description = E帽eha鈥櫭ena ehupi ambu茅va ta鈥櫭ga.
+pdfjs-editor-add-signature-error-close-button = Mboty
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Heja
+pdfjs-editor-add-signature-add-button = Mbojuaju
+pdfjs-editor-edit-signature-update-button = Mbohekopyahu
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Je鈥檈rei mbosako鈥檌
+pdfjs-editor-edit-comment-popup-button =
+    .title = Je鈥檈rei mbosako鈥檌
+pdfjs-editor-delete-comment-popup-button-label = Je鈥檈rei mboguete
+pdfjs-editor-delete-comment-popup-button =
+    .title = Je鈥檈rei mboguete
+pdfjs-show-comment-button =
+    .title = Ehechauka je鈥檈py
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Je鈥檈rei mbosako鈥檌
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Mbohekopyahu
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Je鈥檈rei mbojuaju
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Mbojuaju
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Ehai 帽epyr农鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Eheja
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Je鈥檈rei mbojuaju
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Embojopyru tenda ykegua (kuatia oguereko mba鈥檈鈥檌, kuaakaha/moir农ha/帽u茫ha)
+pdfjs-toggle-views-manager-button1-label = E帽angareko kuotiarogue
+pdfjs-views-manager-sidebar =
+    .aria-label = Ta鈥櫭garupa yke
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Tuichakue mongu鈥檈ha tenda yk茅pe
+pdfjs-views-manager-view-selector-button =
+    .title = Hechaha
+pdfjs-views-manager-view-selector-button-label = Hechaha
+pdfjs-views-manager-pages-title = Kuatiarogue
+pdfjs-views-manager-outlines-title1 = Kuatiaite jejapopy
+    .title = Kuatiaite jejapopy (eikutu jo鈥檃 emyas茫i hag虄ua/emomich末mbaite mba鈥檈poruita)
+pdfjs-views-manager-attachments-title = Moir农ha
+pdfjs-views-manager-layers-title1 = 脩u茫haita
+    .title = 脩u茫haita (eikutu jo鈥檃 erupaite jey hag虄ua 帽u茫haita o末 haguepevoi)
+pdfjs-views-manager-pages-option-label = Kuatiarogueita
+pdfjs-views-manager-outlines-option-label = Kuatiaite jejapopy
+pdfjs-views-manager-attachments-option-label = Moir农haita
+pdfjs-views-manager-layers-option-label = 脩u茫haita
+pdfjs-views-manager-add-file-button =
+    .title = Embojuaju marandurenda
+pdfjs-views-manager-add-file-button-label = Embojuaju marandurenda
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } poravopyre
+       *[other] { $count } poravopyre
+    }
+pdfjs-views-manager-pages-status-none-action-label = Eiporavo kuatiarogue
+pdfjs-views-manager-pages-status-action-button-label = 脩angareko
+pdfjs-views-manager-pages-status-copy-button-label = Monguatia
+pdfjs-views-manager-pages-status-cut-button-label = Kyt末
+pdfjs-views-manager-pages-status-delete-button-label = Mboguete
+pdfjs-views-manager-pages-status-export-selected-button-label = Eguerahauka poravopyre鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 kuatiarogue kyt末mbyre
+       *[other] { $count } kuatiarogue kyt末mbyre
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 kuatiarogue monguatiapyre
+       *[other] { $count } kuatiarogue monguatiapyre
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 kuatiarogue mboguepyre
+       *[other] { $count } kuatiarogue mboguepyre
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Embosako鈥檌h铆na ne marandurenda鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Ehupih铆na marandurenda鈥�
+pdfjs-views-manager-status-warning-cut-label = Ndaikat煤i o帽ekyt末. Embopyahu kuatiarogue ha eha鈥櫭� jey.
+pdfjs-views-manager-status-warning-copy-label = Ndaikat煤i o帽embokuatia. Embopyahu kuatiarogue ha eha鈥櫭� jey.
+pdfjs-views-manager-status-warning-delete-label = Ndaikat煤i embogue. Embopyahu kuatiarogue ha eha鈥櫭� jey.
+pdfjs-views-manager-status-warning-save-label = Ndaikat煤i e帽ongatu. Embopyahu kuatiarogue ha eha鈥櫭� jey.
+pdfjs-views-manager-status-undo-button-label = Mboguevi
+pdfjs-views-manager-status-done-button-label = O末ma
+pdfjs-views-manager-status-close-button =
+    .title = Mboty
+pdfjs-views-manager-status-close-button-label = Mboty
+pdfjs-views-manager-paste-button-label = Mboja
+pdfjs-views-manager-paste-button-before =
+    .title = Emboja togue pete末ha mboyve
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Emboja kuatiarogue { $page } rire
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = PYAHU
+pdfjs-views-manager-waiting-for-file = Ehupih铆na marandurenda鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = E帽angareko kuotiarogue
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Embogue teraguapy 帽ongatupyre
+pdfjs-editor-delete-signature-button-label1 = Embogue teraguapy 帽ongatupyre
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Embosako鈥檌 moha鈥櫭ga
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Embosako鈥檌 moha鈥櫭ga
diff --git a/public/pdfjs/web/locale/gu-IN/viewer.ftl b/public/pdfjs/web/locale/gu-IN/viewer.ftl
new file mode 100644
index 0000000..5ad3db1
--- /dev/null
+++ b/public/pdfjs/web/locale/gu-IN/viewer.ftl
@@ -0,0 +1,222 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 嗒喃囙嗒距喃� 嗒嗒ㄠ珌嗒�
+pdfjs-previous-button-label = 嗒喃囙嗒距喃�
+pdfjs-next-button =
+    .title = 嗒嗋獥嗒赤喃� 嗒嗒ㄠ珌嗒�
+pdfjs-next-button-label = 嗒嗋獥嗒赤喃佮獋
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 嗒嗒ㄠ珌嗒�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 嗒ㄠ珛 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 嗒ㄠ珛 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 嗒珛嗒熰珌 嗒曕喃�
+pdfjs-zoom-out-button-label = 嗒珛嗒熰珌 嗒曕喃�
+pdfjs-zoom-in-button =
+    .title = 嗒ㄠ嗒ㄠ珌嗒� 嗒曕喃�
+pdfjs-zoom-in-button-label = 嗒ㄠ嗒ㄠ珌嗒� 嗒曕喃�
+pdfjs-zoom-select =
+    .title = 嗒ㄠ嗒ㄠ珌嗒� 嗒珛嗒熰珌 嗒曕喃�
+pdfjs-presentation-mode-button =
+    .title = 嗒班獪喃傕獑嗒� 嗒膏珝嗒ム嗒む嗒嗒� 嗒溹嗒�
+pdfjs-presentation-mode-button-label = 嗒班獪喃傕獑嗒� 嗒膏珝嗒ム嗒む
+pdfjs-open-file-button =
+    .title = 嗒嗒囙 嗒栢珛嗒侧珛
+pdfjs-open-file-button-label = 嗒栢珛嗒侧珛
+pdfjs-print-button =
+    .title = 嗒涏嗒珛
+pdfjs-print-button-label = 嗒涏嗒班珛
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 嗒膏嗒о喃�
+pdfjs-tools-button-label = 嗒膏嗒о喃�
+pdfjs-first-page-button =
+    .title = 嗒喃囙嗒距獋 嗒嗒ㄠ嗒嗒� 嗒溹嗒�
+pdfjs-first-page-button-label = 嗒珝嗒班嗒� 嗒嗒ㄠ嗒� 嗒 嗒溹嗒�
+pdfjs-last-page-button =
+    .title = 嗒涏珖嗒侧珝嗒侧 嗒嗒ㄠ嗒� 嗒 嗒溹嗒�
+pdfjs-last-page-button-label = 嗒涏珖嗒侧珝嗒侧 嗒嗒ㄠ嗒� 嗒 嗒溹嗒�
+pdfjs-page-rotate-cw-button =
+    .title = 嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒� 嗒む嗒� 嗒珖嗒班喃�
+pdfjs-page-rotate-cw-button-label = 嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒� 嗒む嗒� 嗒珖嗒班喃�
+pdfjs-page-rotate-ccw-button =
+    .title = 嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒距喃� 嗒夃嗒熰珋 嗒︵嗒多嗒嗒� 嗒珖嗒班喃�
+pdfjs-page-rotate-ccw-button-label = 嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒距喃� 嗒掂嗒班珌嗒︵珝嗒� 嗒珖嗒班喃�
+pdfjs-cursor-text-select-tool-button =
+    .title = 嗒熰珖嗒曕珝嗒膏珝嗒� 嗒嗒傕嗒椸珋 嗒熰珎嗒� 嗒膏獣喃嵿嗒� 嗒曕喃�
+pdfjs-cursor-text-select-tool-button-label = 嗒熰珖嗒曕珝嗒膏珝嗒� 嗒嗒傕嗒椸珋 嗒熰珎嗒�
+pdfjs-cursor-hand-tool-button =
+    .title = 嗒灌嗒ム嗒距獋 嗒膏嗒о嗒ㄠ珖 嗒膏獣喃嵿嗒苦 嗒曕喃�
+pdfjs-cursor-hand-tool-button-label = 嗒灌珖嗒ㄠ珝嗒� 嗒熰珎嗒�
+pdfjs-scroll-vertical-button =
+    .title = 嗒娻喃� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥嗒ㄠ珛 嗒夃嗒珛嗒� 嗒曕喃�
+pdfjs-scroll-vertical-button-label = 嗒娻喃� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥
+pdfjs-scroll-horizontal-button =
+    .title = 嗒嗋喃� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥嗒ㄠ珛 嗒夃嗒珛嗒� 嗒曕喃�
+pdfjs-scroll-horizontal-button-label = 嗒嗋喃� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥
+pdfjs-scroll-wrapped-button =
+    .title = 嗒嗋嗒班嗒� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥嗒ㄠ珛 嗒夃嗒珛嗒� 嗒曕喃�
+pdfjs-scroll-wrapped-button-label = 嗒嗋嗒班嗒� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥
+pdfjs-spread-none-button =
+    .title = 嗒珒嗒粪珝嗒� 嗒膏珝嗒珝嗒班珖嗒∴嗒距獋 嗒溹珛嗒∴嗒掂喃� 嗒ㄠ喃�嗒�
+pdfjs-spread-none-button-label = 嗒曕珛嗒� 嗒膏珝嗒珝嗒班珖嗒� 嗒ㄠ喃�
+pdfjs-spread-odd-button =
+    .title = 嗒忇獣喃�-嗒曕珝嗒班嗒距獋嗒曕嗒� 嗒珒嗒粪珝嗒犩珛 嗒膏嗒ム珖 嗒珝嗒班嗒班獋嗒� 嗒ム嗒距獋 嗒珒嗒粪珝嗒� 嗒膏珝嗒珝嗒班珖嗒∴嗒距獋 嗒溹珛嗒∴嗒�
+pdfjs-spread-odd-button-label = 嗒忇獣喃� 嗒膏珝嗒珝嗒班珖嗒∴珝嗒�
+pdfjs-spread-even-button =
+    .title = 嗒ㄠ獋嗒-嗒曕珝嗒班嗒距獋嗒曕嗒� 嗒珒嗒粪珝嗒犩珛嗒ム珋 嗒多喃� 嗒ム嗒距獋 嗒珒嗒粪珝嗒� 嗒膏珝嗒珝嗒班珖嗒∴嗒距獋 嗒溹珛嗒∴嗒�
+pdfjs-spread-even-button-label = 嗒膏嗒栢珌嗒� 嗒珖嗒侧嗒掂喃佮獋
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 嗒︵喃嵿嗒距喃囙獪 嗒椸珌嗒`嗒班珝嗒珛鈥�
+pdfjs-document-properties-button-label = 嗒︵喃嵿嗒距喃囙獪 嗒椸珌嗒`嗒班珝嗒珛鈥�
+pdfjs-document-properties-file-name = 嗒嗒囙 嗒ㄠ嗒�:
+pdfjs-document-properties-file-size = 嗒嗒囙 嗒嗒�:
+pdfjs-document-properties-title = 嗒多珋嗒班珝嗒粪獣:
+pdfjs-document-properties-author = 嗒侧珖嗒栢獣:
+pdfjs-document-properties-subject = 嗒掂嗒粪:
+pdfjs-document-properties-keywords = 嗒曕嗒掂喃嵿:
+pdfjs-document-properties-creation-date = 嗒ㄠ嗒班珝嗒嗒� 嗒む嗒班珋嗒�:
+pdfjs-document-properties-modification-date = 嗒珖嗒班嗒距 嗒む嗒班珋嗒�:
+pdfjs-document-properties-creator = 嗒ㄠ嗒班珝嗒嗒む:
+pdfjs-document-properties-producer = PDF 嗒ㄠ嗒班珝嗒嗒む:
+pdfjs-document-properties-version = PDF 嗒嗋喃冟喃嵿嗒�:
+pdfjs-document-properties-page-count = 嗒嗒ㄠ嗒� 嗒椸嗒む喃�:
+pdfjs-document-properties-page-size = 嗒珒嗒粪珝嗒犩喃佮獋 嗒曕:
+pdfjs-document-properties-page-size-unit-inches = 嗒囙獋嗒�
+pdfjs-document-properties-page-size-unit-millimeters = 嗒珋嗒珋
+pdfjs-document-properties-page-size-orientation-portrait = 嗒夃喃佮獋
+pdfjs-document-properties-page-size-orientation-landscape = 嗒嗋喃�
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 嗒喃嵿
+pdfjs-document-properties-page-size-name-legal = 嗒曕嗒嗒距獣喃�嗒�
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 嗒澿嗒珋 嗒掂珔嗒� 嗒︵珒嗒多珝嗒�:
+pdfjs-document-properties-linearized-yes = 嗒灌
+pdfjs-document-properties-linearized-no = 嗒ㄠ
+pdfjs-document-properties-close-button = 嗒獋嗒� 嗒曕喃�
+
+## Print
+
+pdfjs-print-progress-message = 嗒涏嗒獣嗒距 嗒嗒熰珖 嗒︵喃嵿嗒距喃囙獪 嗒む珗嗒嗒� 嗒曕喃� 嗒班喃嵿嗒� 嗒涏珖鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 嗒班 嗒曕喃�
+pdfjs-printing-not-supported = 嗒氞珖嗒む嗒`珋: 嗒涏嗒嗒距喃佮獋 嗒� 嗒珝嗒班嗒夃獫嗒� 嗒︵珝嗒︵嗒班 嗒膏獋嗒珎嗒班珝嗒`嗒`珖 嗒嗋嗒距嗒珎嗒� 嗒ㄠ喃�.
+pdfjs-printing-not-ready = Warning: PDF 嗒� 嗒涏嗒嗒� 嗒嗒熰珖 嗒膏獋嗒珎嗒班珝嗒`嗒`珖 嗒侧嗒掂珖嗒� 嗒涏珖.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 嗒熰珘嗒椸 嗒嗒溹珌嗒獰喃嵿獰喃�
+pdfjs-toggle-sidebar-button-label = 嗒熰珘嗒椸 嗒嗒溹珌嗒獰喃嵿獰喃�
+pdfjs-document-outline-button =
+    .title = 嗒︵喃嵿嗒距喃囙獪嗒ㄠ珋 嗒班珎嗒喃囙獤嗒� 嗒嗒距喃�(嗒喃� 嗒嗋獓嗒熰喃嵿嗒ㄠ珖 嗒掂嗒膏珝嗒む珒嗒�/嗒膏獋嗒曕珌嗒氞嗒� 嗒曕嗒掂 嗒嗒熰珖 嗒∴嗒�-嗒曕珝嗒侧嗒� 嗒曕喃�)
+pdfjs-document-outline-button-label = 嗒︵喃嵿嗒距喃囙獪 嗒班珎嗒喃囙獤嗒�
+pdfjs-attachments-button =
+    .title = 嗒溹珛嗒∴嗒`珛嗒ㄠ珖 嗒嗒距喃�
+pdfjs-attachments-button-label = 嗒溹珛嗒∴嗒`珛
+pdfjs-thumbs-button =
+    .title = 嗒ム獋嗒喃囙喃嵿 嗒嗒距喃�
+pdfjs-thumbs-button-label = 嗒ム獋嗒喃囙喃嵿
+pdfjs-findbar-button =
+    .title = 嗒︵喃嵿嗒距喃囙獪嗒嗒� 嗒多珛嗒о珛
+pdfjs-findbar-button-label = 嗒多珛嗒о珛
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 嗒嗒ㄠ珌嗒� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 嗒嗒ㄠ嗒� { $page } 嗒ㄠ珌嗒� 嗒ム獋嗒喃囙喃嵿
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 嗒多珛嗒о珛
+    .placeholder = 嗒︵喃嵿嗒距喃囙獪嗒嗒� 嗒多珛嗒о珛鈥�
+pdfjs-find-previous-button =
+    .title = 嗒多喃嵿嗒膏喃傕嗒ㄠ珋 嗒嗒涏喃� 嗒樴獰嗒ㄠ嗒ㄠ珖 嗒多珛嗒о珛
+pdfjs-find-previous-button-label = 嗒喃囙嗒距獋嗒ㄠ珌
+pdfjs-find-next-button =
+    .title = 嗒多喃嵿嗒膏喃傕嗒ㄠ珋 嗒嗋獥嗒赤喃� 嗒樴獰嗒ㄠ嗒ㄠ珖 嗒多珛嗒о珛
+pdfjs-find-next-button-label = 嗒嗋獥嗒赤喃佮獋
+pdfjs-find-highlight-checkbox = 嗒喃� 嗒珝嗒班獣嗒距嗒苦 嗒曕喃�
+pdfjs-find-match-case-checkbox-label = 嗒曕珖嗒� 嗒獋嗒о喃囙嗒距喃�
+pdfjs-find-entire-word-checkbox-label = 嗒膏獋嗒珎嗒班珝嗒� 嗒多喃嵿喃�
+pdfjs-find-reached-top = 嗒︵喃嵿嗒距喃囙獪嗒ㄠ嗒� 嗒熰珛嗒氞珖 嗒喃嬥獋嗒氞珋 嗒椸嗒�, 嗒む嗒苦喃囙喃� 嗒氞嗒侧珌 嗒曕喃囙 嗒灌喃�
+pdfjs-find-reached-bottom = 嗒︵喃嵿嗒距喃囙獪嗒ㄠ嗒� 嗒呧獋嗒む珖 嗒喃嬥獋嗒氞珋 嗒椸嗒�, 嗒夃嗒班喃� 嗒氞嗒侧珌 嗒曕喃囙 嗒灌喃�
+pdfjs-find-not-found = 嗒多喃嵿嗒膏喃傕 嗒喃嵿喃� 嗒ㄠ喃�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 嗒嗒ㄠ嗒ㄠ珋 嗒喃嬥嗒距獓
+pdfjs-page-scale-fit = 嗒嗒ㄠ珌嗒� 嗒獋嗒о喃囙嗒む珌
+pdfjs-page-scale-auto = 嗒嗋嗒珖嗒赤珖 嗒ㄠ嗒ㄠ珌嗒傕喃嬥獰喃� 嗒曕喃�
+pdfjs-page-scale-actual = 嗒氞珛嗒曕珝嗒曕 嗒嗒�
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = 嗒珎嗒� 嗒夃喃嵿嗒掂珋 嗒溹珝嗒嗒班珖 PDF 嗒ㄠ珖 嗒侧嗒掂珋 嗒班喃嵿嗒� 嗒灌珛嗒�.
+pdfjs-invalid-file-error = 嗒呧喃嬥獥喃嵿 嗒呧嗒掂 嗒嗒傕獥喃囙 PDF 嗒嗒囙.
+pdfjs-missing-file-error = 嗒椸珌嗒� 嗒ム喃囙 PDF 嗒嗒囙.
+pdfjs-unexpected-response-error = 嗒呧嗒珖嗒曕珝嗒粪嗒� 嗒膏喃嵿嗒� 嗒珝嗒班嗒苦嗒距.
+pdfjs-rendering-error = 嗒珎嗒� 嗒夃喃嵿嗒掂珋 嗒溹珝嗒嗒班珖 嗒嗒ㄠ嗒傕喃� 嗒班珖嗒ㄠ珝嗒� 嗒曕喃� 嗒班喃嵿嗒� 嗒灌珛嗒�.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = 嗒� PDF 嗒嗒囙嗒ㄠ珖 嗒栢珛嗒侧嗒� 嗒嗒膏嗒班珝嗒∴喃� 嗒︵嗒栢 嗒曕喃�.
+pdfjs-password-invalid = 嗒呧喃嬥獥喃嵿 嗒嗒膏嗒班珝嗒�. 嗒喃囙嗒嗒ㄠ珋 嗒曕喃�嗒ㄠ珖 嗒喃� 嗒珝嗒班嗒む珝嗒� 嗒曕喃�.
+pdfjs-password-ok-button = 嗒嗒距嗒�
+pdfjs-password-cancel-button = 嗒班 嗒曕喃�
+pdfjs-web-fonts-disabled = 嗒掂珖嗒� 嗒珛嗒ㄠ珝嗒� 嗒ㄠ嗒粪珝嗒曕珝嗒班嗒� 嗒ム喃囙 嗒涏珖: 嗒嵿喃嵿喃囙 嗒ム喃囙 PDF 嗒珛嗒ㄠ珝嗒熰喃� 嗒掂嗒嗒掂嗒ㄠ珌嗒� 嗒呧嗒喃嵿.
diff --git a/public/pdfjs/web/locale/he/viewer.ftl b/public/pdfjs/web/locale/he/viewer.ftl
new file mode 100644
index 0000000..ed51d4a
--- /dev/null
+++ b/public/pdfjs/web/locale/he/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 讚祝 拽讜讚诐
+pdfjs-previous-button-label = 拽讜讚诐
+pdfjs-next-button =
+    .title = 讚祝 讛讘讗
+pdfjs-next-button-label = 讛讘讗
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 讚祝
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 诪转讜讱 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 诪转讜讱 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 讛转专讞拽讜转
+pdfjs-zoom-out-button-label = 讛转专讞拽讜转
+pdfjs-zoom-in-button =
+    .title = 讛转拽专讘讜转
+pdfjs-zoom-in-button-label = 讛转拽专讘讜转
+pdfjs-zoom-select =
+    .title = 诪专讞拽 诪转爪讜讙讛
+pdfjs-presentation-mode-button =
+    .title = 诪注讘专 诇诪爪讘 诪爪讙转
+pdfjs-presentation-mode-button-label = 诪爪讘 诪爪讙转
+pdfjs-open-file-button =
+    .title = 驻转讬讞转 拽讜讘抓
+pdfjs-open-file-button-label = 驻转讬讞讛
+pdfjs-print-button =
+    .title = 讛讚驻住讛
+pdfjs-print-button-label = 讛讚驻住讛
+pdfjs-save-button =
+    .title = 砖诪讬专讛
+pdfjs-save-button-label = 砖诪讬专讛
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 讛讜专讚讛
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 讛讜专讚讛
+pdfjs-bookmark-button =
+    .title = 注诪讜讚 谞讜讻讞讬 (讛爪讙转 讻转讜讘转 讛讗转专 诪讛注诪讜讚 讛谞讜讻讞讬)
+pdfjs-bookmark-button-label = 注诪讜讚 谞讜讻讞讬
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 讻诇讬诐
+pdfjs-tools-button-label = 讻诇讬诐
+pdfjs-first-page-button =
+    .title = 诪注讘专 诇注诪讜讚 讛专讗砖讜谉
+pdfjs-first-page-button-label = 诪注讘专 诇注诪讜讚 讛专讗砖讜谉
+pdfjs-last-page-button =
+    .title = 诪注讘专 诇注诪讜讚 讛讗讞专讜谉
+pdfjs-last-page-button-label = 诪注讘专 诇注诪讜讚 讛讗讞专讜谉
+pdfjs-page-rotate-cw-button =
+    .title = 讛讟讬讛 注诐 讻讬讜讜谉 讛砖注讜谉
+pdfjs-page-rotate-cw-button-label = 讛讟讬讛 注诐 讻讬讜讜谉 讛砖注讜谉
+pdfjs-page-rotate-ccw-button =
+    .title = 讛讟讬讛 讻谞讙讚 讻讬讜讜谉 讛砖注讜谉
+pdfjs-page-rotate-ccw-button-label = 讛讟讬讛 讻谞讙讚 讻讬讜讜谉 讛砖注讜谉
+pdfjs-cursor-text-select-tool-button =
+    .title = 讛驻注诇转 讻诇讬 讘讞讬专转 讟拽住讟
+pdfjs-cursor-text-select-tool-button-label = 讻诇讬 讘讞讬专转 讟拽住讟
+pdfjs-cursor-hand-tool-button =
+    .title = 讛驻注诇转 讻诇讬 讛讬讚
+pdfjs-cursor-hand-tool-button-label = 讻诇讬 讬讚
+pdfjs-scroll-page-button =
+    .title = 砖讬诪讜砖 讘讙诇讬诇转 注诪讜讚
+pdfjs-scroll-page-button-label = 讙诇讬诇转 注诪讜讚
+pdfjs-scroll-vertical-button =
+    .title = 砖讬诪讜砖 讘讙诇讬诇讛 讗谞讻讬转
+pdfjs-scroll-vertical-button-label = 讙诇讬诇讛 讗谞讻讬转
+pdfjs-scroll-horizontal-button =
+    .title = 砖讬诪讜砖 讘讙诇讬诇讛 讗讜驻拽讬转
+pdfjs-scroll-horizontal-button-label = 讙诇讬诇讛 讗讜驻拽讬转
+pdfjs-scroll-wrapped-button =
+    .title = 砖讬诪讜砖 讘讙诇讬诇讛 专爪讬驻讛
+pdfjs-scroll-wrapped-button-label = 讙诇讬诇讛 专爪讬驻讛
+pdfjs-spread-none-button =
+    .title = 诇讗 诇爪专祝 诪驻转讞讬 注诪讜讚讬诐
+pdfjs-spread-none-button-label = 诇诇讗 诪驻转讞讬诐
+pdfjs-spread-odd-button =
+    .title = 爪讬专讜祝 诪驻转讞讬 注诪讜讚讬诐 砖诪转讞讬诇讬诐 讘讚驻讬诐 注诐 诪住驻专讬诐 讗讬志讝讜讙讬讬诐
+pdfjs-spread-odd-button-label = 诪驻转讞讬诐 讗讬志讝讜讙讬讬诐
+pdfjs-spread-even-button =
+    .title = 爪讬专讜祝 诪驻转讞讬 注诪讜讚讬诐 砖诪转讞讬诇讬诐 讘讚驻讬诐 注诐 诪住驻专讬诐 讝讜讙讬讬诐
+pdfjs-spread-even-button-label = 诪驻转讞讬诐 讝讜讙讬讬诐
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 诪讗驻讬讬谞讬 诪住诪讱鈥�
+pdfjs-document-properties-button-label = 诪讗驻讬讬谞讬 诪住诪讱鈥�
+pdfjs-document-properties-file-name = 砖诐 拽讜讘抓:
+pdfjs-document-properties-file-size = 讙讜讚诇 讛拽讜讘抓:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 拽状讘 ({ $b } 讘转讬诐)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 诪状讘 ({ $b } 讘转讬诐)
+pdfjs-document-properties-title = 讻讜转专转:
+pdfjs-document-properties-author = 诪讞讘专:
+pdfjs-document-properties-subject = 谞讜砖讗:
+pdfjs-document-properties-keywords = 诪讬诇讜转 诪驻转讞:
+pdfjs-document-properties-creation-date = 转讗专讬讱 讬爪讬专讛:
+pdfjs-document-properties-modification-date = 转讗专讬讱 砖讬谞讜讬:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 讬讜爪专:
+pdfjs-document-properties-producer = 讬爪专谉 PDF:
+pdfjs-document-properties-version = 讙专住转 PDF:
+pdfjs-document-properties-page-count = 诪住驻专 讚驻讬诐:
+pdfjs-document-properties-page-size = 讙讜讚诇 讛注诪讜讚:
+pdfjs-document-properties-page-size-unit-inches = 讗讬谞壮
+pdfjs-document-properties-page-size-unit-millimeters = 诪状诪
+pdfjs-document-properties-page-size-orientation-portrait = 诇讗讜专讱
+pdfjs-document-properties-page-size-orientation-landscape = 诇专讜讞讘
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 诪讻转讘
+pdfjs-document-properties-page-size-name-legal = 讚祝 诪砖驻讟讬
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 转爪讜讙转 讚祝 诪讛讬专讛:
+pdfjs-document-properties-linearized-yes = 讻谉
+pdfjs-document-properties-linearized-no = 诇讗
+pdfjs-document-properties-close-button = 住讙讬专讛
+
+## Print
+
+pdfjs-print-progress-message = 诪住诪讱 讘讛讻谞讛 诇讛讚驻住讛鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 讘讬讟讜诇
+pdfjs-printing-not-supported = 讗讝讛专讛: 讛讚驻住讛 讗讬谞讛 谞转诪讻转 讘诪诇讜讗讛 讘讚驻讚驻谉 讝讛.
+pdfjs-printing-not-ready = 讗讝讛专讛: 诪住诪讱 讛志PDF 诇讗 谞讟注谉 诇讞诇讜讟讬谉 注讚 诪爪讘 砖诪讗驻砖专 讛讚驻住讛.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 讛爪讙讛/讛住转专讛 砖诇 住专讙诇 讛爪讚
+pdfjs-toggle-sidebar-notification-button =
+    .title = 讛讞诇驻转 转爪讜讙转 住专讙诇 爪讚 (诪住诪讱 砖诪讻讬诇 转讜讻谉 注谞讬讬谞讬诐/拽讘爪讬诐 诪爪讜专驻讬诐/砖讻讘讜转)
+pdfjs-toggle-sidebar-button-label = 讛爪讙讛/讛住转专讛 砖诇 住专讙诇 讛爪讚
+pdfjs-document-outline-button =
+    .title = 讛爪讙转 转讜讻谉 讛注谞讬讬谞讬诐 砖诇 讛诪住诪讱 (诇讞讬爪讛 讻驻讜诇讛 讻讚讬 诇讛专讞讬讘 讗讜 诇爪诪爪诐 讗转 讻诇 讛驻专讬讟讬诐)
+pdfjs-document-outline-button-label = 转讜讻谉 讛注谞讬讬谞讬诐 砖诇 讛诪住诪讱
+pdfjs-attachments-button =
+    .title = 讛爪讙转 爪专讜驻讜转
+pdfjs-attachments-button-label = 爪专讜驻讜转
+pdfjs-layers-button =
+    .title = 讛爪讙转 砖讻讘讜转 (讬砖 诇诇讞讜抓 诇讞讬爪讛 讻驻讜诇讛 讻讚讬 诇讗驻住 讗转 讻诇 讛砖讻讘讜转 诇诪爪讘 讘专讬专转 讛诪讞讚诇)
+pdfjs-layers-button-label = 砖讻讘讜转
+pdfjs-thumbs-button =
+    .title = 讛爪讙转 转爪讜讙讛 诪拽讚讬诪讛
+pdfjs-thumbs-button-label = 转爪讜讙讛 诪拽讚讬诪讛
+pdfjs-current-outline-item-button =
+    .title = 诪爪讬讗转 驻专讬讟 转讜讻谉 讛注谞讬讬谞讬诐 讛谞讜讻讞讬
+pdfjs-current-outline-item-button-label = 驻专讬讟 转讜讻谉 讛注谞讬讬谞讬诐 讛谞讜讻讞讬
+pdfjs-findbar-button =
+    .title = 讞讬驻讜砖 讘诪住诪讱
+pdfjs-findbar-button-label = 讞讬驻讜砖
+pdfjs-additional-layers = 砖讻讘讜转 谞讜住驻讜转
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 注诪讜讚 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 转爪讜讙讛 诪拽讚讬诪讛 砖诇 注诪讜讚 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 讘讞讬专转 注诪讜讚 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 注诪讜讚 { $page } 诪转讜讱 { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 讞讬驻讜砖
+    .placeholder = 讞讬驻讜砖 讘诪住诪讱鈥�
+pdfjs-find-previous-button =
+    .title = 诪爪讬讗转 讛诪讜驻注 讛拽讜讚诐 砖诇 讛讘讬讟讜讬
+pdfjs-find-previous-button-label = 拽讜讚诐
+pdfjs-find-next-button =
+    .title = 诪爪讬讗转 讛诪讜驻注 讛讘讗 砖诇 讛讘讬讟讜讬
+pdfjs-find-next-button-label = 讛讘讗
+pdfjs-find-highlight-checkbox = 讛讚讙砖转 讛讻讜诇
+pdfjs-find-match-case-checkbox-label = 讛转讗诪转 讗讜转讬讜转
+pdfjs-find-match-diacritics-checkbox-label = 讛转讗诪讛 讚讬讗拽专讬讟讬转
+pdfjs-find-entire-word-checkbox-label = 诪讬诇讬诐 砖诇诪讜转
+pdfjs-find-reached-top = 讛讙讬注 诇专讗砖 讛讚祝, 诪诪砖讬讱 诪诇诪讟讛
+pdfjs-find-reached-bottom = 讛讙讬注 诇住讜祝 讛讚祝, 诪诪砖讬讱 诪诇诪注诇讛
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 诪转讜讱 { $total } 转讜爪讗讜转
+       *[other] { $current } 诪转讜讱 { $total } 转讜爪讗讜转
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 讬讜转专 诪转讜爪讗讛 讗讞转
+       *[other] 讬讜转专 诪志{ $limit } 转讜爪讗讜转
+    }
+pdfjs-find-not-found = 讛讘讬讟讜讬 诇讗 谞诪爪讗
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 专讜讞讘 讛注诪讜讚
+pdfjs-page-scale-fit = 讛转讗诪讛 诇注诪讜讚
+pdfjs-page-scale-auto = 诪专讞拽 诪转爪讜讙讛 讗讜讟讜诪讟讬
+pdfjs-page-scale-actual = 讙讜讚诇 讗诪讬转讬
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 注诪讜讚 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 讗讬专注讛 砖讙讬讗讛 讘注转 讟注讬谞转 讛志PDF.
+pdfjs-invalid-file-error = 拽讜讘抓 PDF 驻讙讜诐 讗讜 诇讗 转拽讬谉.
+pdfjs-missing-file-error = 拽讜讘抓 PDF 讞住专.
+pdfjs-unexpected-response-error = 转讙讜讘转 砖专转 诇讗 爪驻讜讬讛.
+pdfjs-rendering-error = 讗讬专注讛 砖讙讬讗讛 讘注转 注讬讘讜讚 讛讚祝.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [讛注专转 { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 谞讗 诇讛讻谞讬住 讗转 讛住住诪讛 诇驻转讬讞转 拽讜讘抓 PDF 讝讛.
+pdfjs-password-invalid = 住住诪讛 砖讙讜讬讛. 谞讗 诇谞住讜转 砖讜讘.
+pdfjs-password-ok-button = 讗讬砖讜专
+pdfjs-password-cancel-button = 讘讬讟讜诇
+pdfjs-web-fonts-disabled = 讙讜驻谞讬 专砖转 诪谞讜讟专诇讬诐: 诇讗 谞讬转谉 诇讛砖转诪砖 讘讙讜驻谞讬 PDF 诪讜讟讘注讬诐.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 讟拽住讟
+pdfjs-editor-color-picker-free-text-input =
+    .title = 砖讬谞讜讬 爪讘注 讛讟拽住讟
+pdfjs-editor-free-text-button-label = 讟拽住讟
+pdfjs-editor-ink-button =
+    .title = 爪讬讜专
+pdfjs-editor-color-picker-ink-input =
+    .title = 砖讬谞讜讬 爪讘注 讛爪讬讜专
+pdfjs-editor-ink-button-label = 爪讬讜专
+pdfjs-editor-stamp-button =
+    .title = 讛讜住驻讛 讗讜 注专讬讻转 转诪讜谞讜转
+pdfjs-editor-stamp-button-label = 讛讜住驻讛 讗讜 注专讬讻转 转诪讜谞讜转
+pdfjs-editor-highlight-button =
+    .title = 住讬诪讜谉
+pdfjs-editor-highlight-button-label = 住讬诪讜谉
+pdfjs-highlight-floating-button1 =
+    .title = 住讬诪讜谉
+    .aria-label = 住讬诪讜谉
+pdfjs-highlight-floating-button-label = 住讬诪讜谉
+pdfjs-comment-floating-button =
+    .title = 讛注专讛
+    .aria-label = 讛注专讛
+pdfjs-comment-floating-button-label = 讛注专讛
+pdfjs-editor-comment-button =
+    .title = 讛注专讛
+    .aria-label = 讛注专讛
+pdfjs-editor-comment-button-label = 讛注专讛
+pdfjs-editor-signature-button =
+    .title = 讛讜住驻转 讞转讬诪讛
+pdfjs-editor-signature-button-label = 讛讜住驻转 讞转讬诪讛
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 注讜专讱 住讬诪讜谞讬诐
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 注讜专讱 爪讬讜专讬诐
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 注讜专讱 讛讞转讬诪讜转: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 注讜专讱 转诪讜谞讜转
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 讛住专转 爪讬讜专
+pdfjs-editor-remove-freetext-button =
+    .title = 讛住专转 讟拽住讟
+pdfjs-editor-remove-stamp-button =
+    .title = 讛住专转 转诪讜谞讛
+pdfjs-editor-remove-highlight-button =
+    .title = 讛住专转 住讬诪讜谉
+pdfjs-editor-remove-signature-button =
+    .title = 讛住专转 讞转讬诪讛
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 爪讘注
+pdfjs-editor-free-text-size-input = 讙讜讚诇
+pdfjs-editor-ink-color-input = 爪讘注
+pdfjs-editor-ink-thickness-input = 注讜讘讬
+pdfjs-editor-ink-opacity-input = 讗讟讬诪讜转
+pdfjs-editor-stamp-add-image-button =
+    .title = 讛讜住驻转 转诪讜谞讛
+pdfjs-editor-stamp-add-image-button-label = 讛讜住驻转 转诪讜谞讛
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 注讜讘讬
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 砖讬谞讜讬 注讜讘讬 讘注转 住讬诪讜谉 驻专讬讟讬诐 砖讗讬谞诐 讟拽住讟
+pdfjs-editor-add-signature-container =
+    .aria-label = 驻拽讚讬 讞转讬诪讛 讜讞转讬诪讜转 砖诪讜专讜转
+pdfjs-editor-signature-add-signature-button =
+    .title = 讛讜住驻转 讞转讬诪讛 讞讚砖讛
+pdfjs-editor-signature-add-signature-button-label = 讛讜住驻转 讞转讬诪讛 讞讚砖讛
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 讞转讬诪讛 砖诪讜专讛: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 注讜专讱 讟拽住讟
+    .default-content = 谞讗 诇讛转讞讬诇 诇讛拽诇讬讚鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 讛注专讛
+       *[other] 讛注专讜转
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 住讙讬专转 住专讙诇 讛爪讚
+    .aria-label = 住讙讬专转 住专讙诇 讛爪讚
+pdfjs-editor-comments-sidebar-close-button-label = 住讙讬专转 住专讙诇 讛爪讚
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 专讗讬转 诪砖讛讜 专讗讜讬 诇爪讬讜谉? 谞讬转谉 诇住诪谉 讗讜转讜 讜诇讛砖讗讬专 讛注专讛.
+pdfjs-editor-comments-sidebar-no-comments-link = 诪讬讚注 谞讜住祝
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 讟拽住讟 讞诇讜驻讬
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 注专讬讻转 讟拽住讟 讞诇讜驻讬
+pdfjs-editor-alt-text-dialog-label = 讘讞讬专转 讗驻砖专讜转
+pdfjs-editor-alt-text-dialog-description = 讟拽住讟 讞诇讜驻讬 注讜讝专 讻砖讗谞砖讬诐 诇讗 讬讻讜诇讬诐 诇专讗讜转 讗转 讛转诪讜谞讛 讗讜 讻砖讛讬讗 诇讗 谞讟注谞转.
+pdfjs-editor-alt-text-add-description-label = 讛讜住驻转 转讬讗讜专
+pdfjs-editor-alt-text-add-description-description = 讻讚讗讬 诇转讗专 讘诪砖驻讟 讗讞讚 讗讜 砖谞讬讬诐 讗转 讛谞讜砖讗, 讛转驻讗讜专讛 讗讜 讛驻注讜诇讜转.
+pdfjs-editor-alt-text-mark-decorative-label = 住讬诪讜谉 讻讚拽讜专讟讬讘讬
+pdfjs-editor-alt-text-mark-decorative-description = 讝讛 诪砖诪砖 诇转诪讜谞讜转 谞讜讬, 讻诪讜 讙讘讜诇讜转 讗讜 住讬诪谞讬 诪讬诐.
+pdfjs-editor-alt-text-cancel-button = 讘讬讟讜诇
+pdfjs-editor-alt-text-save-button = 砖诪讬专讛
+pdfjs-editor-alt-text-decorative-tooltip = 诪住讜诪谉 讻讚拽讜专讟讬讘讬
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 诇讚讜讙诪讛, 状讙讘专 爪注讬专 诪转讬讬砖讘 诇讬讚 砖讜诇讞谉 诇讗讻讜诇 讗专讜讞讛状
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 讟拽住讟 讞诇讜驻讬
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 驻讬谞讛 砖诪讗诇讬转 注诇讬讜谞讛 - 砖讬谞讜讬 讙讜讚诇
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 诇诪注诇讛 讘讗诪爪注 - 砖讬谞讜讬 讙讜讚诇
+pdfjs-editor-resizer-top-right =
+    .aria-label = 驻讬谞讛 讬诪谞讬转 注诇讬讜谞讛 - 砖讬谞讜讬 讙讜讚诇
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 讬诪讬谞讛 讘讗诪爪注 - 砖讬谞讜讬 讙讜讚诇
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 驻讬谞讛 讬诪谞讬转 转讞转讜谞讛 - 砖讬谞讜讬 讙讜讚诇
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 诇诪讟讛 讘讗诪爪注 - 砖讬谞讜讬 讙讜讚诇
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 驻讬谞讛 砖诪讗诇讬转 转讞转讜谞讛 - 砖讬谞讜讬 讙讜讚诇
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 砖诪讗诇讛 讘讗诪爪注 - 砖讬谞讜讬 讙讜讚诇
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 爪讘注 住讬诪讜谉
+pdfjs-editor-colorpicker-button =
+    .title = 砖讬谞讜讬 爪讘注
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 讘讞讬专转 爪讘注
+pdfjs-editor-colorpicker-yellow =
+    .title = 爪讛讜讘
+pdfjs-editor-colorpicker-green =
+    .title = 讬专讜拽
+pdfjs-editor-colorpicker-blue =
+    .title = 讻讞讜诇
+pdfjs-editor-colorpicker-pink =
+    .title = 讜专讜讚
+pdfjs-editor-colorpicker-red =
+    .title = 讗讚讜诐
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 讛爪讙转 讛讻讜诇
+pdfjs-editor-highlight-show-all-button =
+    .title = 讛爪讙转 讛讻讜诇
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 注专讬讻转 讟拽住讟 讞诇讜驻讬 (转讬讗讜专 转诪讜谞讛)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 讛讜住驻转 讟拽住讟 讞诇讜驻讬 (转讬讗讜专 转诪讜谞讛)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 谞讗 诇讻转讜讘 讗转 讛转讬讗讜专 砖诇讱 讻讗谉鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 转讬讗讜专 拽爪专 诇讗谞砖讬诐 砖讗讬谞诐 讬讻讜诇讬诐 诇专讗讜转 讗转 讛转诪讜谞讛 讗讜 讻讗砖专 讛转诪讜谞讛 讗讬谞讛 谞讟注谞转.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 讟拽住讟 讞诇讜驻讬 讝讛 谞讜爪专 讘讗讜驻谉 讗讜讟讜诪讟讬 讜注砖讜讬 诇讛讬讜转 诇讗 诪讚讜讬拽.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 诪讬讚注 谞讜住祝
+pdfjs-editor-new-alt-text-create-automatically-button-label = 讬爪讬专转 讟拽住讟 讞诇讜驻讬 讘讗讜驻谉 讗讜讟讜诪讟讬
+pdfjs-editor-new-alt-text-not-now-button = 诇讗 讻注转
+pdfjs-editor-new-alt-text-error-title = 诇讗 谞讬转谉 讛讬讛 诇讬爪讜专 讟拽住讟 讞诇讜驻讬 讘讗讜驻谉 讗讜讟讜诪讟讬
+pdfjs-editor-new-alt-text-error-description = 谞讗 诇讻转讜讘 讟拽住讟 讞诇讜驻讬 诪砖诇讱 讗讜 诇谞住讜转 砖讜讘 诪讗讜讞专 讬讜转专.
+pdfjs-editor-new-alt-text-error-close-button = 住讙讬专讛
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 讘转讛诇讬讱 讛讜专讚转 诪讜讚诇 AI 砖诇 讟拽住讟 讞诇讜驻讬 ({ $downloadedSize } 诪转讜讱 { $totalSize } 诪状讘)
+    .aria-valuetext = 讘转讛诇讬讱 讛讜专讚转 诪讜讚诇 AI 砖诇 讟拽住讟 讞诇讜驻讬 ({ $downloadedSize } 诪转讜讱 { $totalSize } 诪状讘)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 谞讜住祝 讟拽住讟 讞诇讜驻讬
+pdfjs-editor-new-alt-text-added-button-label = 谞讜住祝 讟拽住讟 讞诇讜驻讬
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 讞住专 讟拽住讟 讞诇讜驻讬
+pdfjs-editor-new-alt-text-missing-button-label = 讞住专 讟拽住讟 讞诇讜驻讬
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 住拽讬专转 讟拽住讟 讞诇讜驻讬
+pdfjs-editor-new-alt-text-to-review-button-label = 住拽讬专转 讟拽住讟 讞诇讜驻讬
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 谞讜爪专 讘讗讜驻谉 讗讜讟讜诪讟讬: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 讛讙讚专讜转 讟拽住讟 讞诇讜驻讬 砖诇 转诪讜谞讛
+pdfjs-image-alt-text-settings-button-label = 讛讙讚专讜转 讟拽住讟 讞诇讜驻讬 砖诇 转诪讜谞讛
+pdfjs-editor-alt-text-settings-dialog-label = 讛讙讚专讜转 讟拽住讟 讞诇讜驻讬 砖诇 转诪讜谞讛
+pdfjs-editor-alt-text-settings-automatic-title = 讟拽住讟 讞诇讜驻讬 讗讜讟讜诪讟讬
+pdfjs-editor-alt-text-settings-create-model-button-label = 讬爪讬专转 讟拽住讟 讞诇讜驻讬 讘讗讜驻谉 讗讜讟讜诪讟讬
+pdfjs-editor-alt-text-settings-create-model-description = 讛爪注转 转讬讗讜专讬诐 讻讚讬 诇住讬讬注 诇讗谞砖讬诐 砖讗讬谞诐 讬讻讜诇讬诐 诇专讗讜转 讗转 讛转诪讜谞讛 讗讜 讻讗砖专 讛转诪讜谞讛 讗讬谞讛 谞讟注谞转.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 诪讜讚诇 AI 诇讟拽住讟 讞诇讜驻讬 ({ $totalSize } 诪状讘)
+pdfjs-editor-alt-text-settings-ai-model-description = 驻讜注诇 讘讗讜驻谉 诪拽讜诪讬 讘诪讻砖讬专 砖诇讱 讻讱 砖讛谞转讜谞讬诐 砖诇讱 谞砖讗专讬诐 驻专讟讬讬诐. 谞讚专砖 注讘讜专 讟拽住讟 讞诇讜驻讬 讗讜讟讜诪讟讬.
+pdfjs-editor-alt-text-settings-delete-model-button = 诪讞讬拽讛
+pdfjs-editor-alt-text-settings-download-model-button = 讛讜专讚讛
+pdfjs-editor-alt-text-settings-downloading-model-button = 讘讛讜专讚讛鈥�
+pdfjs-editor-alt-text-settings-editor-title = 注讜专讱 讟拽住讟 讞诇讜驻讬
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 讛爪讙转 注讜专讱 讟拽住讟 讞诇讜驻讬 诪讬讚 讘注转 讛讜住驻转 转诪讜谞讛
+pdfjs-editor-alt-text-settings-show-dialog-description = 诪住讬讬注 诇讱 诇讜讜讚讗 砖诇讻诇 讛转诪讜谞讜转 砖诇讱 讬砖 讟拽住讟 讞诇讜驻讬.
+pdfjs-editor-alt-text-settings-close-button = 住讙讬专讛
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 讛住讬诪讜谉 谞讜住祝
+pdfjs-editor-freetext-added-alert = 讛讟拽住讟 谞讜住祝
+pdfjs-editor-ink-added-alert = 讛爪讬讜专 谞讜住祝
+pdfjs-editor-stamp-added-alert = 讛转诪讜谞讛 谞讜住驻讛
+pdfjs-editor-signature-added-alert = 讛讞转讬诪讛 谞讜住驻讛
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 讛住讬诪讜谉 讛讜住专
+pdfjs-editor-undo-bar-message-freetext = 讛讟拽住讟 讛讜住专
+pdfjs-editor-undo-bar-message-ink = 讛爪讬讜专 讛讜住专
+pdfjs-editor-undo-bar-message-stamp = 讛转诪讜谞讛 讛讜住专讛
+pdfjs-editor-undo-bar-message-signature = 讛讞转讬诪讛 讛讜住专讛
+pdfjs-editor-undo-bar-message-comment = 讛讛注专讛 讛讜住专讛
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] 讛注专讛 讗讞转 讛讜住专讛
+       *[other] { $count } 讛注专讜转 讛讜住专讜
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 讘讬讟讜诇 驻注讜诇讛
+pdfjs-editor-undo-bar-undo-button-label = 讘讬讟讜诇 驻注诇讛
+pdfjs-editor-undo-bar-close-button =
+    .title = 住讙讬专讛
+pdfjs-editor-undo-bar-close-button-label = 住讙讬专讛
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 诪讜讚诇 讝讛 诪讗驻砖专 诇诪砖转诪砖 诇讬爪讜专 讞转讬诪讛 诇讛讜住驻讛 诇诪住诪讱 PDF. 讛诪砖转诪砖 讬讻讜诇 诇注专讜讱 讗转 讛砖诐 (砖诪砖诪砖 讙诐 讻讟拽住讟 讛讗诇讟专谞讟讬讘讬), 讜讘讗讜驻谉 讗讜驻爪讬讜谞诇讬 诇砖诪讜专 讗转 讛讞转讬诪讛 诇砖讬诪讜砖 讞讜讝专.
+pdfjs-editor-add-signature-dialog-title = 讛讜住驻转 讞转讬诪讛
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 讛拽诇讚讛
+    .title = 讛拽诇讚讛
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 爪讬讜专
+    .title = 爪讬讜专
+pdfjs-editor-add-signature-image-button = 转诪讜谞讛
+    .title = 转诪讜谞讛
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 谞讗 诇讛拽诇讬讚 讗转 讛讞转讬诪讛 砖诇讱
+    .placeholder = 谞讗 诇讛拽诇讬讚 讗转 讛讞转讬诪讛 砖诇讱
+pdfjs-editor-add-signature-draw-placeholder = 谞讗 诇爪讬讬专 讗转 讛讞转讬诪讛 砖诇讱
+pdfjs-editor-add-signature-draw-thickness-range-label = 注讜讘讬
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 注讜讘讬 讛爪讬讜专: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 讬砖 诇讙专讜专 诇讻讗谉 拽讜讘抓 诇讛注诇讗讛
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 讗讜 诇讘讞讜专 讘拽讜讘爪讬 转诪讜谞讛
+       *[other] 讗讜 诇注讬讬谉 讘拽讜讘爪讬 转诪讜谞讛
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 转讬讗讜专 (讟拽住讟 讞诇讜驻讬)
+pdfjs-editor-add-signature-description-input =
+    .title = 转讬讗讜专 (讟拽住讟 讞诇讜驻讬)
+pdfjs-editor-add-signature-description-default-when-drawing = 讞转讬诪讛
+pdfjs-editor-add-signature-clear-button-label = 谞讬拽讜讬 讞转讬诪讛
+pdfjs-editor-add-signature-clear-button =
+    .title = 谞讬拽讜讬 讞转讬诪讛
+pdfjs-editor-add-signature-save-checkbox = 砖诪讬专转 讛讞转讬诪讛
+pdfjs-editor-add-signature-save-warning-message = 讛讙注转 诇诪讙讘诇讛 砖诇 5 讞转讬诪讜转 砖诪讜专讜转. 讬砖 诇讛住讬专 讗讞讚 讻讚讬 诇砖诪讜专 注讜讚.
+pdfjs-editor-add-signature-image-upload-error-title = 诇讗 谞讬转谉 诇讛注诇讜转 讗转 讛转诪讜谞讛
+pdfjs-editor-add-signature-image-upload-error-description = 谞讗 诇讘讚讜拽 讗转 讛讞讬讘讜专 砖诇讱 诇专砖转 讗讜 诇谞住讜转 转诪讜谞讛 讗讞专转.
+pdfjs-editor-add-signature-image-no-data-error-title = 诇讗 谞讬转谉 诇讛诪讬专 讗转 讛转诪讜谞讛 讛讝讜 诇讞转讬诪讛
+pdfjs-editor-add-signature-image-no-data-error-description = 谞讗 诇谞住讜转 诇讛注诇讜转 转诪讜谞讛 讗讞专转.
+pdfjs-editor-add-signature-error-close-button = 住讙讬专讛
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 讘讬讟讜诇
+pdfjs-editor-add-signature-add-button = 讛讜住驻讛
+pdfjs-editor-edit-signature-update-button = 注讚讻讜谉
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 注专讬讻转 讛注专讛
+pdfjs-editor-edit-comment-popup-button =
+    .title = 注专讬讻转 讛注专讛
+pdfjs-editor-delete-comment-popup-button-label = 讛住专转 讛注专讛
+pdfjs-editor-delete-comment-popup-button =
+    .title = 讛住专转 讛注专讛
+pdfjs-show-comment-button =
+    .title = 讛爪讙转 讛注专讛
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 注专讬讻转 讛注专讛
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 注讚讻讜谉
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 讛讜住驻转 讛注专讛
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 讛讜住驻讛
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 诇讛转讞讬诇 诇讛拽诇讬讚鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 讘讬讟讜诇
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 讛讜住驻转 讛注专讛
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 讛讞诇驻转 转爪讜讙转 住专讙诇 爪讚 (诪住诪讱 砖诪讻讬诇 转诪讜谞讜转 诪诪讜讝注专讜转/转讜讻谉 注谞讬讬谞讬诐/拽讘爪讬诐 诪爪讜专驻讬诐/砖讻讘讜转)
+pdfjs-toggle-views-manager-button1-label = 谞讬讛讜诇 注诪讜讚讬诐
+pdfjs-views-manager-sidebar =
+    .aria-label = 住专讙诇 爪讚
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 砖讬谞讜讬 讙讜讚诇 住专讙诇 讛爪讚
+pdfjs-views-manager-view-selector-button =
+    .title = 转爪讜讙讜转
+pdfjs-views-manager-view-selector-button-label = 转爪讜讙讜转
+pdfjs-views-manager-pages-title = 注诪讜讚讬诐
+pdfjs-views-manager-outlines-title1 = 转讜讻谉 讛注谞讬讬谞讬诐 砖诇 讛诪住诪讱
+    .title = 讛爪讙转 转讜讻谉 讛注谞讬讬谞讬诐 砖诇 讛诪住诪讱 (讬砖 诇诇讞讜抓 诇讞讬爪讛 讻驻讜诇讛 讻讚讬 诇讛专讞讬讘 讗讜 诇爪诪爪诐 讗转 讻诇 讛驻专讬讟讬诐)
+pdfjs-views-manager-attachments-title = 拽讘爪讬诐 诪爪讜专驻讬诐
+pdfjs-views-manager-layers-title1 = 砖讻讘讜转
+    .title = 讛爪讙转 砖讻讘讜转 (讬砖 诇诇讞讜抓 诇讞讬爪讛 讻驻讜诇讛 讻讚讬 诇讗驻住 讗转 讻诇 讛砖讻讘讜转 诇诪爪讘 讘专讬专转 讛诪讞讚诇)
+pdfjs-views-manager-pages-option-label = 注诪讜讚讬诐
+pdfjs-views-manager-outlines-option-label = 转讜讻谉 讛注谞讬讬谞讬诐 砖诇 讛诪住诪讱
+pdfjs-views-manager-attachments-option-label = 拽讘爪讬诐 诪爪讜专驻讬诐
+pdfjs-views-manager-layers-option-label = 砖讻讘讜转
+pdfjs-views-manager-add-file-button =
+    .title = 讛讜住驻转 拽讜讘抓
+pdfjs-views-manager-add-file-button-label = 讛讜住驻转 拽讜讘抓
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] 讗讞讚 谞讘讞专
+       *[other] { $count } 谞讘讞专讜
+    }
+pdfjs-views-manager-pages-status-none-action-label = 讘讞讬专转 注诪讜讚讬诐
+pdfjs-views-manager-pages-status-action-button-label = 谞讬讛讜诇
+pdfjs-views-manager-pages-status-copy-button-label = 讛注转拽讛
+pdfjs-views-manager-pages-status-cut-button-label = 讙讝讬专讛
+pdfjs-views-manager-pages-status-delete-button-label = 诪讞讬拽讛
+pdfjs-views-manager-pages-status-export-selected-button-label = 讬讬爪讜讗 讛驻专讬讟讬诐 砖谞讘讞专讜鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 注诪讜讚 讗讞讚 谞讙讝专
+       *[other] { $count } 注诪讜讚讬诐 谞讙讝专讜
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 注诪讜讚 讗讞讚 讛讜注转拽
+       *[other] { $count } 注诪讜讚讬诐 讛讜注转拽讜
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 注诪讜讚 讗讞讚 谞诪讞拽
+       *[other] { $count } 注诪讜讚讬诐 谞诪讞拽讜
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 讘转讛诇讬讱 讛讻谞转 讛拽讜讘抓 砖诇讱鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 讘转讛诇讬讱 讛注诇讗转 讛拽讜讘抓鈥�
+pdfjs-views-manager-status-warning-cut-label = 诇讗 谞讬转谉 讛讬讛 诇讙讝讜专. 谞讗 诇专注谞谉 讗转 讛讚祝 讜诇谞住讜转 砖讜讘.
+pdfjs-views-manager-status-warning-copy-label = 诇讗 谞讬转谉 讛讬讛 诇讛注转讬拽. 谞讗 诇专注谞谉 讗转 讛讚祝 讜诇谞住讜转 砖讜讘.
+pdfjs-views-manager-status-warning-delete-label = 诇讗 谞讬转谉 讛讬讛 诇诪讞讜拽. 谞讗 诇专注谞谉 讗转 讛讚祝 讜诇谞住讜转 砖讜讘.
+pdfjs-views-manager-status-warning-save-label = 诇讗 谞讬转谉 讛讬讛 诇砖诪讜专. 谞讗 诇专注谞谉 讗转 讛讚祝 讜诇谞住讜转 砖讜讘.
+pdfjs-views-manager-status-undo-button-label = 讘讬讟讜诇 驻注讜诇讛
+pdfjs-views-manager-status-done-button-label = 住讬讜诐
+pdfjs-views-manager-status-close-button =
+    .title = 住讙讬专讛
+pdfjs-views-manager-status-close-button-label = 住讙讬专讛
+pdfjs-views-manager-paste-button-label = 讛讚讘拽讛
+pdfjs-views-manager-paste-button-before =
+    .title = 诇讛讚讘讬拽 诇驻谞讬 讛注诪讜讚 讛专讗砖讜谉
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 诇讛讚讘讬拽 讗讞专讬 注诪讜讚 { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 讞讚砖
+pdfjs-views-manager-waiting-for-file = 讘转讛诇讬讱 讛注诇讗转 讛拽讜讘抓鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 谞讬讛讜诇 注诪讜讚讬诐
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 讛住专转 讞转讬诪讛 砖诪讜专讛
+pdfjs-editor-delete-signature-button-label1 = 讛住专转 讞转讬诪讛 砖诪讜专讛
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 注专讬讻转 转讬讗讜专
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 注专讬讻转 转讬讗讜专
diff --git a/public/pdfjs/web/locale/hi-IN/viewer.ftl b/public/pdfjs/web/locale/hi-IN/viewer.ftl
new file mode 100644
index 0000000..91459eb
--- /dev/null
+++ b/public/pdfjs/web/locale/hi-IN/viewer.ftl
@@ -0,0 +1,221 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 啶た啶涏げ啶� 啶啶粪啶�
+pdfjs-previous-button-label = 啶た啶涏げ啶�
+pdfjs-next-button =
+    .title = 啶呧啶侧ぞ 啶啶粪啶�
+pdfjs-next-button-label = 啶嗋啷�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 啶啶粪啶�:
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 啶曕ぞ
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 啶涏啶熰ぞ 啶曕ぐ啷囙
+pdfjs-zoom-out-button-label = 啶涏啶熰ぞ 啶曕ぐ啷囙
+pdfjs-zoom-in-button =
+    .title = 啶ぁ啶监ぞ 啶曕ぐ啷囙
+pdfjs-zoom-in-button-label = 啶ぁ啶监ぞ 啶曕ぐ啷囙
+pdfjs-zoom-select =
+    .title = 啶ぁ啶监ぞ-啶涏啶熰ぞ 啶曕ぐ啷囙
+pdfjs-presentation-mode-button =
+    .title = 啶啶班じ啷嵿い啷佮い啶� 啶呧さ啶膏啶ムぞ 啶啶� 啶溹ぞ啶忇
+pdfjs-presentation-mode-button-label = 啶啶班じ啷嵿い啷佮い啶� 啶呧さ啶膏啶ムぞ
+pdfjs-open-file-button =
+    .title = 啶ぜ啶距啶� 啶栢啶侧啶�
+pdfjs-open-file-button-label = 啶栢啶侧啶�
+pdfjs-print-button =
+    .title = 啶涏ぞ啶啶�
+pdfjs-print-button-label = 啶涏ぞ啶啶�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 啶斷啶监ぞ啶�
+pdfjs-tools-button-label = 啶斷啶监ぞ啶�
+pdfjs-first-page-button =
+    .title = 啶啶班ぅ啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+pdfjs-first-page-button-label = 啶啶班ぅ啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+pdfjs-last-page-button =
+    .title = 啶呧啶むた啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+pdfjs-last-page-button-label = 啶呧啶むた啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+pdfjs-page-rotate-cw-button =
+    .title = 啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶啶� 啶樴啶ぞ啶忇
+pdfjs-page-rotate-cw-button-label = 啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶啶� 啶樴啶ぞ啶忇
+pdfjs-page-rotate-ccw-button =
+    .title = 啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶膏 啶夃げ啷嵿啶� 啶樴啶ぞ啶忇
+pdfjs-page-rotate-ccw-button-label = 啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶膏 啶夃げ啷嵿啶� 啶樴啶ぞ啶忇
+pdfjs-cursor-text-select-tool-button =
+    .title = 啶ぞ啶� 啶氞く啶� 啶夃お啶曕ぐ啶� 啶膏啷嵿し啶� 啶曕ぐ啷囙
+pdfjs-cursor-text-select-tool-button-label = 啶ぞ啶� 啶氞く啶� 啶夃お啶曕ぐ啶�
+pdfjs-cursor-hand-tool-button =
+    .title = 啶灌じ啷嵿い 啶夃お啶曕ぐ啶� 啶膏啷嵿し啶� 啶曕ぐ啷囙
+pdfjs-cursor-hand-tool-button-label = 啶灌じ啷嵿い 啶夃お啶曕ぐ啶�
+pdfjs-scroll-vertical-button =
+    .title = 啶侧啶さ啶� 啶膏啶曕啶班啶侧た啶傕 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙
+pdfjs-scroll-vertical-button-label = 啶侧啶さ啶� 啶膏啶曕啶班啶侧た啶傕
+pdfjs-scroll-horizontal-button =
+    .title = 啶曕啶粪た啶むた啶溹た啶� 啶膏啶曕啶班啶侧た啶傕 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙
+pdfjs-scroll-horizontal-button-label = 啶曕啶粪た啶むた啶溹た啶� 啶膏啶曕啶班啶侧た啶傕
+pdfjs-scroll-wrapped-button =
+    .title = 啶掂啶班ぞ啶啶啶� 啶膏啶曕啶班啶侧た啶傕 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙
+pdfjs-spread-none-button-label = 啶曕啶� 啶膏啶啶班啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶�
+pdfjs-spread-odd-button =
+    .title = 啶掂た啶粪ぎ-啶曕啶班ぎ啶距啶曕た啶� 啶啶粪啶犩啶� 啶膏 啶啶班ぞ啶班啶� 啶灌啶ㄠ 啶掂ぞ啶侧 啶啶粪啶� 啶膏啶啶班啶� 啶啶� 啶多ぞ啶た啶� 啶灌啶�
+pdfjs-spread-odd-button-label = 啶掂た啶粪ぎ 啶啶侧ぞ啶�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 啶︵じ啷嵿い啶距さ啷囙啶� 啶掂た啶多啶粪い啶�...
+pdfjs-document-properties-button-label = 啶︵じ啷嵿い啶距さ啷囙啶� 啶掂た啶多啶粪い啶�...
+pdfjs-document-properties-file-name = 啶ぜ啶距啶� 啶ㄠぞ啶�:
+pdfjs-document-properties-file-size = 啶ぞ啶囙げ 啶嗋啶距ぐ啶�
+pdfjs-document-properties-title = 啶多啶班啶粪:
+pdfjs-document-properties-author = 啶侧啶栢啶�
+pdfjs-document-properties-subject = 啶掂た啶粪く:
+pdfjs-document-properties-keywords = 啶曕啶傕啷�-啶多が啷嵿う:
+pdfjs-document-properties-creation-date = 啶ㄠた啶班啶ぞ啶� 啶︵た啶ㄠぞ啶傕:
+pdfjs-document-properties-modification-date = 啶膏啶多啶оえ 啶︵た啶ㄠぞ啶傕:
+pdfjs-document-properties-creator = 啶ㄠた啶班啶ぞ啶むぞ:
+pdfjs-document-properties-producer = PDF 啶夃い啷嵿お啶距う啶�:
+pdfjs-document-properties-version = PDF 啶膏啶膏啶曕ぐ啶�:
+pdfjs-document-properties-page-count = 啶啶粪啶� 啶椸た啶ㄠい啷�:
+pdfjs-document-properties-page-size = 啶啶粪啶� 啶嗋啶距ぐ:
+pdfjs-document-properties-page-size-unit-inches = 啶囙啶�
+pdfjs-document-properties-page-size-unit-millimeters = 啶た啶
+pdfjs-document-properties-page-size-orientation-portrait = 啶啶班啶熰啶班啶�
+pdfjs-document-properties-page-size-orientation-landscape = 啶侧啶傕ぁ啶膏啶曕啶�
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 啶い啷嵿ぐ
+pdfjs-document-properties-page-size-name-legal = 啷樴ぞ啶ㄠ啶ㄠ
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 啶む啶掂啶� 啶掂啶� 啶掂啶:
+pdfjs-document-properties-linearized-yes = 啶灌ぞ啶�
+pdfjs-document-properties-linearized-no = 啶ㄠす啷�啶�
+pdfjs-document-properties-close-button = 啶啶� 啶曕ぐ啷囙
+
+## Print
+
+pdfjs-print-progress-message = 啶涏お啶距 啶曕 啶侧た啶� 啶︵じ啷嵿い啶距さ啷囙啶� 啶曕 啶む啶ぞ啶� 啶曕た啶ぞ 啶溹ぞ 啶班す啶� 啶灌...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 啶班う啷嵿う 啶曕ぐ啷囙
+pdfjs-printing-not-supported = 啶氞啶むぞ啶掂え啷�: 啶囙じ 啶啶班ぞ啶夃啶监ぐ 啶ぐ 啶涏お啶距 啶啶班 啶むぐ啶� 啶膏 啶膏ぎ啶班啶ムた啶� 啶ㄠす啷�啶� 啶灌.
+pdfjs-printing-not-ready = 啶氞啶むぞ啶掂え啷�: PDF 啶涏お啶距 啶曕 啶侧た啶� 啶啶班 啶むぐ啶� 啶膏 啶侧啶� 啶ㄠす啷�啶� 啶灌.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 啶膏啶侧ぞ啶囙ぁ啶� 啶熰啶椸げ 啶曕ぐ啷囙
+pdfjs-toggle-sidebar-button-label = 啶膏啶侧ぞ啶囙ぁ啶� 啶熰啶椸げ 啶曕ぐ啷囙
+pdfjs-document-outline-button =
+    .title = 啶︵じ啷嵿い啶距さ啷囙啶� 啶曕 啶班啶ぐ啷囙啶� 啶︵た啶栢ぞ啶囙 (啶膏ぞ啶班 啶掂じ啷嵿い啷佮啶� 啶曕 啶げ啶ㄠ 啶呧ぅ啶掂ぞ 啶膏ぎ啷囙啶ㄠ 啶曕 啶侧た啶� 啶︵ 啶ぞ啶� 啶曕啶侧た啶� 啶曕ぐ啷囙)
+pdfjs-document-outline-button-label = 啶︵じ啷嵿い啶距さ啷囙啶� 啶嗋啶熰げ啶距啶�
+pdfjs-attachments-button =
+    .title = 啶膏啶侧啷嵿え啶� 啶︵た啶栢ぞ啶啶�
+pdfjs-attachments-button-label = 啶膏啶侧啷嵿え啶�
+pdfjs-thumbs-button =
+    .title = 啶侧啷佮啶掂た啶ぞ啶� 啶︵た啶栢ぞ啶忇
+pdfjs-thumbs-button-label = 啶侧啷� 啶涏さ啶�
+pdfjs-findbar-button =
+    .title = 啶︵じ啷嵿い啶距さ啷囙啶� 啶啶� 啶⑧啶佮あ啶监啶�
+pdfjs-findbar-button-label = 啶⑧啶佮あ啷囙
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 啶啶粪啶� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 啶啶粪啶� { $page } 啶曕 啶侧啷�-啶涏さ啶�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 啶⑧啶佮あ啷囙
+    .placeholder = 啶︵じ啷嵿い啶距さ啷囙啶� 啶啶� 啶栢啶溹啶�...
+pdfjs-find-previous-button =
+    .title = 啶掂ぞ啶曕啶ぞ啶傕ざ 啶曕 啶た啶涏げ啷� 啶夃お啶膏啶ムた啶むた 啶⑧啶佮あ啶监啶�
+pdfjs-find-previous-button-label = 啶た啶涏げ啶�
+pdfjs-find-next-button =
+    .title = 啶掂ぞ啶曕啶ぞ啶傕ざ 啶曕 啶呧啶侧 啶夃お啶膏啶ムた啶むた 啶⑧啶佮あ啶监啶�
+pdfjs-find-next-button-label = 啶呧啶侧ぞ
+pdfjs-find-highlight-checkbox = 啶膏き啷� 啶嗋げ啷嬥啶苦い 啶曕ぐ啷囙
+pdfjs-find-match-case-checkbox-label = 啶た啶侧ぞ啶� 啶膏啶ムた啶むた
+pdfjs-find-entire-word-checkbox-label = 啶膏啶啶班啶� 啶多が啷嵿う
+pdfjs-find-reached-top = 啶啶粪啶� 啶曕 啶娻お啶� 啶す啷佮啶� 啶椸く啶�, 啶ㄠ啶氞 啶膏 啶溹ぞ啶班 啶班啷囙
+pdfjs-find-reached-bottom = 啶啶粪啶� 啶曕 啶ㄠ啶氞 啶啶� 啶溹ぞ 啶す啷佮啶氞ぞ, 啶娻お啶� 啶膏 啶溹ぞ啶班
+pdfjs-find-not-found = 啶掂ぞ啶曕啶ぞ啶傕ざ 啶ㄠす啷�啶� 啶た啶侧ぞ
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 啶啶粪啶� 啶氞啶∴ぜ啶距
+pdfjs-page-scale-fit = 啶啶粪啶� 啶た啶�
+pdfjs-page-scale-auto = 啶膏啶掂啶距げ啶苦い 啶溹啶�
+pdfjs-page-scale-actual = 啶掂ぞ啶膏啶むさ啶苦 啶嗋啶距ぐ
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 啶侧啶� 啶曕ぐ啶む 啶膏ぎ啶� 啶忇 啶む啶班啶熰た 啶灌啶�.
+pdfjs-invalid-file-error = 啶呧ぎ啶距え啷嵿く 啶ぞ 啶啶班し啷嵿 PDF 啶ぜ啶距啶�.
+pdfjs-missing-file-error = 啶呧え啷佮お啶膏啶ムた啶� PDF 啶ぜ啶距啶�.
+pdfjs-unexpected-response-error = 啶呧お啷嵿ぐ啶む啶ぞ啶多た啶� 啶膏ぐ啷嵿さ啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶�.
+pdfjs-rendering-error = 啶啶粪啶� 啶班啶傕ぁ啶班た啶傕 啶曕 啶︵啶班ぞ啶� 啶む啶班啶熰た 啶嗋.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = 啶囙じ PDF 啶ぜ啶距啶� 啶曕 啶栢啶侧え啷� 啶曕 啶侧た啶� 啶曕啶く啶� 啶曕啶熰ざ啶啶� 啶ぐ啷囙.
+pdfjs-password-invalid = 啶呧さ啷堗ぇ 啶曕啶熰ざ啶啶�, 啶曕啶く啶� 啶た啶� 啶曕啶多た啶� 啶曕ぐ啷囙.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = 啶班う啷嵿う 啶曕ぐ啷囙
+pdfjs-web-fonts-disabled = 啶掂啶� 啶啶ㄠ啶熰啶� 啶ㄠた啶粪啶曕啶班た啶� 啶灌啶�: 啶呧啶む啶膏啶ムぞ啶た啶� PDF 啶啶ㄠ啶熰じ 啶曕 啶夃お啶啶� 啶啶� 啶呧じ啶ぐ啷嵿ぅ.
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 啶班啶�
diff --git a/public/pdfjs/web/locale/hr/viewer.ftl b/public/pdfjs/web/locale/hr/viewer.ftl
new file mode 100644
index 0000000..bd8fcf9
--- /dev/null
+++ b/public/pdfjs/web/locale/hr/viewer.ftl
@@ -0,0 +1,723 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Prethodna stranica
+pdfjs-previous-button-label = Prethodna
+pdfjs-next-button =
+    .title = Sljede膰a stranica
+pdfjs-next-button-label = Sljede膰a
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Stranica
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = od { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } od { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Umanji
+pdfjs-zoom-out-button-label = Umanji
+pdfjs-zoom-in-button =
+    .title = Uve膰aj
+pdfjs-zoom-in-button-label = Uve膰aj
+pdfjs-zoom-select =
+    .title = Zumiranje
+pdfjs-presentation-mode-button =
+    .title = Prebaci u modus prezentacija
+pdfjs-presentation-mode-button-label = Modus prezentacija
+pdfjs-open-file-button =
+    .title = Otvori datoteku
+pdfjs-open-file-button-label = Otvori
+pdfjs-print-button =
+    .title = Ispi拧i
+pdfjs-print-button-label = Ispi拧i
+pdfjs-save-button =
+    .title = Spremi
+pdfjs-save-button-label = Spremi
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Preuzimanja
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Preuzimanja
+pdfjs-bookmark-button =
+    .title = Trenuta膷na stranica (pogledaj URL s trenuta膷ne stranice)
+pdfjs-bookmark-button-label = Trenuta膷na stranica
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Alati
+pdfjs-tools-button-label = Alati
+pdfjs-first-page-button =
+    .title = Idi na prvu stranicu
+pdfjs-first-page-button-label = Idi na prvu stranicu
+pdfjs-last-page-button =
+    .title = Idi na zadnju stranicu
+pdfjs-last-page-button-label = Idi na zadnju stranicu
+pdfjs-page-rotate-cw-button =
+    .title = Okreni nadesno
+pdfjs-page-rotate-cw-button-label = Okreni nadesno
+pdfjs-page-rotate-ccw-button =
+    .title = Okreni nalijevo
+pdfjs-page-rotate-ccw-button-label = Okreni nalijevo
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktiviraj alat za biranje teksta
+pdfjs-cursor-text-select-tool-button-label = Alat za ozna膷avanje teksta
+pdfjs-cursor-hand-tool-button =
+    .title = Aktiviraj ru膷ni alat
+pdfjs-cursor-hand-tool-button-label = Ru膷ni alat
+pdfjs-scroll-page-button =
+    .title = Koristi klizanje stranice
+pdfjs-scroll-page-button-label = Klizanje stranice
+pdfjs-scroll-vertical-button =
+    .title = Koristi okomito pomicanje
+pdfjs-scroll-vertical-button-label = Okomito pomicanje
+pdfjs-scroll-horizontal-button =
+    .title = Koristi vodoravno pomicanje
+pdfjs-scroll-horizontal-button-label = Vodoravno pomicanje
+pdfjs-scroll-wrapped-button =
+    .title = Koristi kontinuirani raspored stranica
+pdfjs-scroll-wrapped-button-label = Kontinuirani raspored stranica
+pdfjs-spread-none-button =
+    .title = Ne izra膽uj duplerice
+pdfjs-spread-none-button-label = Pojedina膷ne stranice
+pdfjs-spread-odd-button =
+    .title = Izradi duplerice koje po膷inju s neparnim stranicama
+pdfjs-spread-odd-button-label = Neparne duplerice
+pdfjs-spread-even-button =
+    .title = Izradi duplerice koje po膷inju s parnim stranicama
+pdfjs-spread-even-button-label = Parne duplerice
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Svojstva dokumenta 鈥�
+pdfjs-document-properties-button-label = Svojstva dokumenta 鈥�
+pdfjs-document-properties-file-name = Ime datoteke:
+pdfjs-document-properties-file-size = Veli膷ina datoteke:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtova)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtova)
+pdfjs-document-properties-title = Naslov:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Predmet:
+pdfjs-document-properties-keywords = Klju膷ne rije膷i:
+pdfjs-document-properties-creation-date = Datum stvaranja:
+pdfjs-document-properties-modification-date = Datum promjene:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Stvaratelj:
+pdfjs-document-properties-producer = PDF stvaratelj:
+pdfjs-document-properties-version = PDF verzija:
+pdfjs-document-properties-page-count = Broj stranica:
+pdfjs-document-properties-page-size = Dimenzije stranice:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = uspravno
+pdfjs-document-properties-page-size-orientation-landscape = polo啪eno
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Brzi web pregled:
+pdfjs-document-properties-linearized-yes = Da
+pdfjs-document-properties-linearized-no = Ne
+pdfjs-document-properties-close-button = Zatvori
+
+## Print
+
+pdfjs-print-progress-message = Pripremanje dokumenta za ispis鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Odustani
+pdfjs-printing-not-supported = Upozorenje: Ovaj preglednik ne podr啪ava u potpunosti ispisivanje.
+pdfjs-printing-not-ready = Upozorenje: PDF nije u potpunosti u膷itan za ispis.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Prika啪i/sakrij bo膷nu traku
+pdfjs-toggle-sidebar-notification-button =
+    .title = Prikazivanje i sklanjanje bo膷ne trake (dokument sadr啪i strukturu/privitke/slojeve)
+pdfjs-toggle-sidebar-button-label = Prika啪i/sakrij bo膷nu traku
+pdfjs-document-outline-button =
+    .title = Prika啪i strukturu dokumenta (dvoklik za rasklapanje/sklapanje svih stavki)
+pdfjs-document-outline-button-label = Struktura dokumenta
+pdfjs-attachments-button =
+    .title = Prika啪i privitke
+pdfjs-attachments-button-label = Privitci
+pdfjs-layers-button =
+    .title = Prika啪i slojeve (dvoklik za vra膰anje svih slojeva u standardno stanje)
+pdfjs-layers-button-label = Slojevi
+pdfjs-thumbs-button =
+    .title = Prika啪i minijature
+pdfjs-thumbs-button-label = Minijature
+pdfjs-current-outline-item-button =
+    .title = Prona膽i trenuta膷ni element strukture
+pdfjs-current-outline-item-button-label = Trenuta膷ni element strukture
+pdfjs-findbar-button =
+    .title = Prona膽i u dokumentu
+pdfjs-findbar-button-label = Prona膽i
+pdfjs-additional-layers = Dodatni slojevi
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Stranica { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Minijatura stranice { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Odaberi stranicu { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Stranica { $page } od { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Prona膽i
+    .placeholder = Prona膽i u dokumentu 鈥�
+pdfjs-find-previous-button =
+    .title = Prona膽i prethodno pojavljivanje ovog izraza
+pdfjs-find-previous-button-label = Prethodno
+pdfjs-find-next-button =
+    .title = Prona膽i sljede膰e pojavljivanje ovog izraza
+pdfjs-find-next-button-label = Dalje
+pdfjs-find-highlight-checkbox = Istankni sve
+pdfjs-find-match-case-checkbox-label = Razlikovanje velikih i malih slova
+pdfjs-find-match-diacritics-checkbox-label = Razlikuj dijakriti膷ke znakove
+pdfjs-find-entire-word-checkbox-label = Cijele rije膷i
+pdfjs-find-reached-top = Dosegnut po膷etak dokumenta, nastavak s kraja
+pdfjs-find-reached-bottom = Dosegnut kraj dokumenta, nastavak s po膷etka
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } od { $total } rezultata
+        [few] { $current } od { $total } rezultata
+       *[other] { $current } od { $total } rezultata
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Vi拧e od { $limit } rezultat
+        [few] Vi拧e od { $limit } rezultata
+       *[other] Vi拧e od { $limit } rezultata
+    }
+pdfjs-find-not-found = Izraz nije prona膽en
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Prilagodi 拧irini prozora
+pdfjs-page-scale-fit = Prilagodi veli膷ini prozora
+pdfjs-page-scale-auto = Automatsko zumiranje
+pdfjs-page-scale-actual = Stvarna veli膷ina
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale } %
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Stranica { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Do拧lo je do gre拧ke pri u膷itavanju PDF-a.
+pdfjs-invalid-file-error = Neispravna ili o拧te膰ena PDF datoteka.
+pdfjs-missing-file-error = Nedostaje PDF datoteka.
+pdfjs-unexpected-response-error = Neo膷ekivani odgovor servera.
+pdfjs-rendering-error = Do拧lo je do gre拧ke prilikom iscrtavanja stranice.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Bilje拧ka]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Za otvoranje ove PDF datoteku upi拧i lozinku.
+pdfjs-password-invalid = Neispravna lozinka. Poku拧aj ponovo.
+pdfjs-password-ok-button = U redu
+pdfjs-password-cancel-button = Odustani
+pdfjs-web-fonts-disabled = Web fontovi su deaktivirani: nije mogu膰e koristiti ugra膽ene PDF fontove.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Promijeni boju teksta
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Crtanje
+pdfjs-editor-color-picker-ink-input =
+    .title = Promijeni boju crte啪a
+pdfjs-editor-ink-button-label = Crtanje
+pdfjs-editor-stamp-button =
+    .title = Dodaj ili uredi slike
+pdfjs-editor-stamp-button-label = Dodaj ili uredi slike
+pdfjs-editor-highlight-button =
+    .title = Istakni
+pdfjs-editor-highlight-button-label = Istakni
+pdfjs-highlight-floating-button1 =
+    .title = Istakni
+    .aria-label = Istakni
+pdfjs-highlight-floating-button-label = Istakni
+pdfjs-comment-floating-button =
+    .title = Komentiraj
+    .aria-label = Komentiraj
+pdfjs-comment-floating-button-label = Komentiraj
+pdfjs-editor-comment-button =
+    .title = Komentar
+    .aria-label = Komentar
+pdfjs-editor-comment-button-label = Komentar
+pdfjs-editor-signature-button =
+    .title = Dodaj potpis
+pdfjs-editor-signature-button-label = Dodaj potpis
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Ure膽iva膷 za isticanje teksta
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Ure膽iva膷 crte啪a
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Ure膽iva膷 potpisa: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Ure膽iva膷 slika
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Ukloni crte啪
+pdfjs-editor-remove-freetext-button =
+    .title = Ukloni tekst
+pdfjs-editor-remove-stamp-button =
+    .title = Ukloni sliku
+pdfjs-editor-remove-highlight-button =
+    .title = Ukloni isticanje
+pdfjs-editor-remove-signature-button =
+    .title = Ukloni potpis
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Boja
+pdfjs-editor-free-text-size-input = Veli膷ina
+pdfjs-editor-ink-color-input = Boja
+pdfjs-editor-ink-thickness-input = Debljina
+pdfjs-editor-ink-opacity-input = Neprozirnost
+pdfjs-editor-stamp-add-image-button =
+    .title = Dodaj sliku
+pdfjs-editor-stamp-add-image-button-label = Dodaj sliku
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Debljina
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Promjeni debljinu pri isticanju drugih stavki osim teksta
+pdfjs-editor-add-signature-container =
+    .aria-label = Kontrole potpisa i spremljeni potpisi
+pdfjs-editor-signature-add-signature-button =
+    .title = Dodaj novi potpis
+pdfjs-editor-signature-add-signature-button-label = Dodaj novi potpis
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Spremljeni potpis: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Ure膽iva膷 teksta
+    .default-content = Po膷ni tipkati 鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Komentar
+        [few] Komentara
+       *[other] Komentara
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Zatvori bo膷nu traku
+    .aria-label = Zatvori bo膷nu traku
+pdfjs-editor-comments-sidebar-close-button-label = Zatvori bo膷nu traku
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Vidi拧 ne拧to vrijedno pa啪nje? Istakni to i ostavi komentar.
+pdfjs-editor-comments-sidebar-no-comments-link = Saznaj vi拧e
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternativni tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Uredi alternativni tekst
+pdfjs-editor-alt-text-dialog-label = Odaberi jednu opciju
+pdfjs-editor-alt-text-dialog-description = Alternativni tekst poma啪e slijepim osobama ili kada se slika ne u膷ita.
+pdfjs-editor-alt-text-add-description-label = Dodaj opis
+pdfjs-editor-alt-text-add-description-description = Sa啪mi sadr啪aj predmeta, okru啪enje ili radnje u jednoj ili dvije re膷enice.
+pdfjs-editor-alt-text-mark-decorative-label = Ozna膷i kao ukrasno
+pdfjs-editor-alt-text-mark-decorative-description = Ovo se koristi za ukrasne slike, poput rubova ili vodenih 啪igova.
+pdfjs-editor-alt-text-cancel-button = Odustani
+pdfjs-editor-alt-text-save-button = Spremi
+pdfjs-editor-alt-text-decorative-tooltip = Ozna膷eno kao ukrasno
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Na primjer, 鈥濵ladi膰 sjeda za stol kako bi jeo鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternativni tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Gornji lijevi kut 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Sredina gore 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-top-right =
+    .aria-label = Gornji desni kut 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Sredina desno 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Donji desni kut 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Sredina dolje 鈥� promjeni veli膷inu
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Donji lijevi kut 鈥� promijeni veli膷inu
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Sredina lijevo 鈥� promijeni veli膷inu
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Boja isticanja
+pdfjs-editor-colorpicker-button =
+    .title = Promjeni boju
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Izbor boja
+pdfjs-editor-colorpicker-yellow =
+    .title = 沤uta
+pdfjs-editor-colorpicker-green =
+    .title = Zelena
+pdfjs-editor-colorpicker-blue =
+    .title = Plava
+pdfjs-editor-colorpicker-pink =
+    .title = Ru啪i膷asta
+pdfjs-editor-colorpicker-red =
+    .title = Crvena
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Prika啪i sve
+pdfjs-editor-highlight-show-all-button =
+    .title = Prika啪i sve
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Uredi alternativni tekst (opis slike)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Dodaj alternativni tekst (opis slike)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Ovdje upi拧i tvoj opis 鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kratki opis koji poma啪u osobama koji ne mogu vidjeti sliku ili kada se slika ne u膷ita.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Ovaj je alternativni tekst stvoren automatski i mo啪e biti neto膷an.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saznaj vi拧e
+pdfjs-editor-new-alt-text-create-automatically-button-label = Automatski stvori alternativni tekst
+pdfjs-editor-new-alt-text-not-now-button = Ne sada
+pdfjs-editor-new-alt-text-error-title = Nije bilo mogu膰e automatski izraditi alternativni tekst
+pdfjs-editor-new-alt-text-error-description = Napi拧i vlastiti alternativni tekst ili poku拧aj kasnije ponovo.
+pdfjs-editor-new-alt-text-error-close-button = Zatvori
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Preuzimanje alternativnog teksta UI modela ({ $downloadedSize } od { $totalSize } MB)
+    .aria-valuetext = Preuzimanje alternativnog teksta UI modela ({ $downloadedSize } od { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativni tekst je dodan
+pdfjs-editor-new-alt-text-added-button-label = Alternativni tekst je dodan
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Nedostaje alternativni tekst
+pdfjs-editor-new-alt-text-missing-button-label = Nedostaje alternativni tekst
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Pregledaj alternativni tekst
+pdfjs-editor-new-alt-text-to-review-button-label = Pregledaj alternativni tekst
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Stvoreno automatski: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Postavke alternativnog teksta slike
+pdfjs-image-alt-text-settings-button-label = Postavke alternativnog teksta slike
+pdfjs-editor-alt-text-settings-dialog-label = Postavke alternativnog teksta slike
+pdfjs-editor-alt-text-settings-automatic-title = Automatski alternativni tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Stvori alternativni tekst automatski
+pdfjs-editor-alt-text-settings-create-model-description = Predla啪e opise koji poma啪u osobama koji ne mogu vidjeti sliku ili kada se slika ne u膷ita.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Alternativni tekst UI modela ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Radi lokalno na tvom ure膽aju kako bi tvoji podaci ostali privatni. Potrebno za automatski alternativni tekst.
+pdfjs-editor-alt-text-settings-delete-model-button = Izbri拧i
+pdfjs-editor-alt-text-settings-download-model-button = Preuzmi
+pdfjs-editor-alt-text-settings-downloading-model-button = Preuzimanje 鈥�
+pdfjs-editor-alt-text-settings-editor-title = Ure膽iva膷 alternativnog teksta
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Prika啪i ure膽iva膷 alternativnog teksta odmah pri dodavanju slike
+pdfjs-editor-alt-text-settings-show-dialog-description = Poma啪e osigurati da sve tvoje slike imaju alternativni tekst.
+pdfjs-editor-alt-text-settings-close-button = Zatvori
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Isticanje je dodano
+pdfjs-editor-freetext-added-alert = Tekst je dodan
+pdfjs-editor-ink-added-alert = Crte啪 je dodan
+pdfjs-editor-stamp-added-alert = Slika je dodana
+pdfjs-editor-signature-added-alert = Potpis je dodan
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Isticanje uklonjeno
+pdfjs-editor-undo-bar-message-freetext = Tekst uklonjen
+pdfjs-editor-undo-bar-message-ink = Crte啪 uklonjen
+pdfjs-editor-undo-bar-message-stamp = Slika uklonjena
+pdfjs-editor-undo-bar-message-signature = Potpis uklonjen
+pdfjs-editor-undo-bar-message-comment = Komentar je uklonjen
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } pribilje拧ka uklonjena
+        [few] { $count } pribilje拧ke uklonjene
+       *[other] { $count } pribilje拧ki uklonjeno
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Poni拧ti
+pdfjs-editor-undo-bar-undo-button-label = Poni拧ti
+pdfjs-editor-undo-bar-close-button =
+    .title = Zatvori
+pdfjs-editor-undo-bar-close-button-label = Zatvori
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Ovaj prozor omogu膰uje korisniku stvoriti potpis i dodati ga u PDF dokument. Korisnik mo啪e urediti ime (koje slu啪i i kao alternativni tekst) i opcionalno spremiti potpis za ponovnu upotrebu.
+pdfjs-editor-add-signature-dialog-title = Dodaj potpis
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Utipkaj
+    .title = Utipkaj
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Crtaj
+    .title = Crtaj
+pdfjs-editor-add-signature-image-button = Slika
+    .title = Slika
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Utipkaj svoj potpis
+    .placeholder = Utipkaj svoj potpis
+pdfjs-editor-add-signature-draw-placeholder = Nacrtaj svoj potpis
+pdfjs-editor-add-signature-draw-thickness-range-label = Debljina
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Debljina crtanja: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Povuci datoteku za prijenos ovamo
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ili odaberi slikovne datoteke
+       *[other] Ili odaberi slikovne datoteke
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Opis (alternativni tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Opis (alternativni tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Potpis
+pdfjs-editor-add-signature-clear-button-label = Izbri拧i potpis
+pdfjs-editor-add-signature-clear-button =
+    .title = Izbri拧i potpis
+pdfjs-editor-add-signature-save-checkbox = Spremi potpis
+pdfjs-editor-add-signature-save-warning-message = Dosegnuto je ograni膷enje od 5 spremljenih potpisa. Za spremanje novih ukloni jedan potpis.
+pdfjs-editor-add-signature-image-upload-error-title = Nije mogu膰e prenijeti sliku
+pdfjs-editor-add-signature-image-upload-error-description = Provjeri mre啪nu vezu ili poku拧aj s jednom drugom slikom.
+pdfjs-editor-add-signature-image-no-data-error-title = Ova se slika ne mo啪e pretvoriti u potpis
+pdfjs-editor-add-signature-image-no-data-error-description = Probaj prenijeti jednu drugu sliku.
+pdfjs-editor-add-signature-error-close-button = Zatvori
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Odustani
+pdfjs-editor-add-signature-add-button = Dodaj
+pdfjs-editor-edit-signature-update-button = Aktualiziraj
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Uredi komentar
+pdfjs-editor-edit-comment-popup-button =
+    .title = Uredi komentar
+pdfjs-editor-delete-comment-popup-button-label = Ukloni komentar
+pdfjs-editor-delete-comment-popup-button =
+    .title = Ukloni komentar
+pdfjs-show-comment-button =
+    .title = Prika啪i komentar
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Uredi komentar
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualiziraj
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentar
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Po膷ni tipkati 鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Odustani
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Dodaj komentar
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-button1-label = Upravljaj stranicama
+pdfjs-views-manager-sidebar =
+    .aria-label = Bo膷na traka
+pdfjs-views-manager-view-selector-button =
+    .title = Prikazi
+pdfjs-views-manager-view-selector-button-label = Prikazi
+pdfjs-views-manager-pages-title = Stranice
+pdfjs-views-manager-outlines-title1 = Struktura dokumenta
+    .title = Struktura dokumenta (sa啪mi/pro拧iri sve stavke dvostrukim klikom)
+pdfjs-views-manager-attachments-title = Privici
+pdfjs-views-manager-layers-title1 = Slojevi
+    .title = Slojevi (ponovo postavi sve slojeve na zadano stanje dvostrukim klikom)
+pdfjs-views-manager-pages-option-label = Stranice
+pdfjs-views-manager-outlines-option-label = Struktura dokumenta
+pdfjs-views-manager-attachments-option-label = Privici
+pdfjs-views-manager-layers-option-label = Slojevi
+pdfjs-views-manager-add-file-button =
+    .title = Dodaj datoteku
+pdfjs-views-manager-add-file-button-label = Dodaj datoteku
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } odabrana
+        [few] { $count } odabrane
+       *[other] { $count } odabranih
+    }
+pdfjs-views-manager-pages-status-none-action-label = Odaberi stranice
+pdfjs-views-manager-pages-status-action-button-label = Upravljaj
+pdfjs-views-manager-pages-status-copy-button-label = Kopiraj
+pdfjs-views-manager-pages-status-cut-button-label = Izre啪i
+pdfjs-views-manager-pages-status-delete-button-label = Izbri拧i
+pdfjs-views-manager-status-warning-cut-label = Nije mogu膰e izrezati. Osvje啪i stranicu i poku拧aj ponovo.
+pdfjs-views-manager-status-warning-copy-label = Nije mogu膰e kopirati. Osvje啪i stranicu i poku拧aj ponovo.
+pdfjs-views-manager-status-warning-delete-label = Nije mogu膰e izbrisati. Osvje啪i stranicu i poku拧aj ponovo.
+pdfjs-views-manager-status-warning-save-label = Nije mogu膰e spremiti. Osvje啪i stranicu i poku拧aj ponovo.
+pdfjs-views-manager-status-undo-button-label = Poni拧ti
+pdfjs-views-manager-status-done-button-label = Gotovo
+pdfjs-views-manager-status-close-button =
+    .title = Zatvori
+pdfjs-views-manager-status-close-button-label = Zatvori
+pdfjs-views-manager-paste-button-label = Umetni
+pdfjs-views-manager-paste-button-before =
+    .title = Umetni prije prve stranice
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Umetni nakon stranice { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOVO
+pdfjs-toggle-views-manager-button1 =
+    .title = Upravljaj stranicama
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Ukloni spremljeni potpis
+pdfjs-editor-delete-signature-button-label1 = Ukloni spremljeni potpis
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Uredi opis
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Uredi opis
diff --git a/public/pdfjs/web/locale/hsb/viewer.ftl b/public/pdfjs/web/locale/hsb/viewer.ftl
new file mode 100644
index 0000000..aac7d6c
--- /dev/null
+++ b/public/pdfjs/web/locale/hsb/viewer.ftl
@@ -0,0 +1,763 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P艡edchadna strona
+pdfjs-previous-button-label = Wr贸膰o
+pdfjs-next-button =
+    .title = P艡ichodna strona
+pdfjs-next-button-label = Dale
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Strona
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = z { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Pomje艅拧i膰
+pdfjs-zoom-out-button-label = Pomje艅拧i膰
+pdfjs-zoom-in-button =
+    .title = Powjet拧i膰
+pdfjs-zoom-in-button-label = Powjet拧i膰
+pdfjs-zoom-select =
+    .title = Skalowanje
+pdfjs-presentation-mode-button =
+    .title = Do prezentaciskeho modusa p艡e艅膰
+pdfjs-presentation-mode-button-label = Prezentaciski modus
+pdfjs-open-file-button =
+    .title = Dataju wo膷ini膰
+pdfjs-open-file-button-label = Wo膷ini膰
+pdfjs-print-button =
+    .title = 膯i拧膰e膰
+pdfjs-print-button-label = 膯i拧膰e膰
+pdfjs-save-button =
+    .title = Sk艂adowa膰
+pdfjs-save-button-label = Sk艂adowa膰
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = S膰ahny膰
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = S膰ahny膰
+pdfjs-bookmark-button =
+    .title = Aktualna strona (URL z aktualneje strony pokaza膰)
+pdfjs-bookmark-button-label = Aktualna strona
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Nastroje
+pdfjs-tools-button-label = Nastroje
+pdfjs-first-page-button =
+    .title = K pr臎njej stronje
+pdfjs-first-page-button-label = K pr臎njej stronje
+pdfjs-last-page-button =
+    .title = K poslednjej stronje
+pdfjs-last-page-button-label = K poslednjej stronje
+pdfjs-page-rotate-cw-button =
+    .title = K sm臎rej 膷asnika wjer膰e膰
+pdfjs-page-rotate-cw-button-label = K sm臎rej 膷asnika wjer膰e膰
+pdfjs-page-rotate-ccw-button =
+    .title = P艡e膰iwo sm臎rej 膷asnika wjer膰e膰
+pdfjs-page-rotate-ccw-button-label = P艡e膰iwo sm臎rej 膷asnika wjer膰e膰
+pdfjs-cursor-text-select-tool-button =
+    .title = Nastroj za wub臎ranje teksta zm贸啪ni膰
+pdfjs-cursor-text-select-tool-button-label = Nastroj za wub臎ranje teksta
+pdfjs-cursor-hand-tool-button =
+    .title = Ru膷ny nastroj zm贸啪ni膰
+pdfjs-cursor-hand-tool-button-label = Ru膷ny nastroj
+pdfjs-scroll-page-button =
+    .title = Kulenje strony wu啪iwa膰
+pdfjs-scroll-page-button-label = Kulenje strony
+pdfjs-scroll-vertical-button =
+    .title = Wertikalne suwanje wu啪iwa膰
+pdfjs-scroll-vertical-button-label = Wertikalne suwanje
+pdfjs-scroll-horizontal-button =
+    .title = Horicontalne suwanje wu啪iwa膰
+pdfjs-scroll-horizontal-button-label = Horicontalne suwanje
+pdfjs-scroll-wrapped-button =
+    .title = Postupne suwanje wu啪iwa膰
+pdfjs-scroll-wrapped-button-label = Postupne suwanje
+pdfjs-spread-none-button =
+    .title = Strony njezwjaza膰
+pdfjs-spread-none-button-label = 沤ana dw贸jna strona
+pdfjs-spread-odd-button =
+    .title = Strony zapo膷inajo z njerunymi stronami zwjaza膰
+pdfjs-spread-odd-button-label = Njerune strony
+pdfjs-spread-even-button =
+    .title = Strony zapo膷inajo z runymi stronami zwjaza膰
+pdfjs-spread-even-button-label = Rune strony
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumentowe kajkos膰e鈥�
+pdfjs-document-properties-button-label = Dokumentowe kajkos膰e鈥�
+pdfjs-document-properties-file-name = Mjeno dataje:
+pdfjs-document-properties-file-size = Wulkos膰 dataje:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtow)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtow)
+pdfjs-document-properties-title = Titul:
+pdfjs-document-properties-author = Awtor:
+pdfjs-document-properties-subject = P艡edmjet:
+pdfjs-document-properties-keywords = Klu膷owe s艂owa:
+pdfjs-document-properties-creation-date = Datum wutworjenja:
+pdfjs-document-properties-modification-date = Datum zm臎ny:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Awtor:
+pdfjs-document-properties-producer = PDF-zhotowjer:
+pdfjs-document-properties-version = PDF-wersija:
+pdfjs-document-properties-page-count = Li膷ba stronow:
+pdfjs-document-properties-page-size = Wulkos膰 strony:
+pdfjs-document-properties-page-size-unit-inches = c贸l
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = wysoki format
+pdfjs-document-properties-page-size-orientation-landscape = pr臎膷ny format
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = Haj
+pdfjs-document-properties-linearized-no = N臎
+pdfjs-document-properties-close-button = Za膷ini膰
+
+## Print
+
+pdfjs-print-progress-message = Dokument so za 膰i拧膰enje p艡ihotuje鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = P艡etorhny膰
+pdfjs-printing-not-supported = Warnowanje: 膯i拧膰enje so p艡ez tut贸n wobhladowak po艂nje njepodp臎ruje.
+pdfjs-printing-not-ready = Warnowanje: PDF njeje so za 膰i拧膰enje dospo艂nje za膷ita艂.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = B贸膷nicu pokaza膰/schowa膰
+pdfjs-toggle-sidebar-notification-button =
+    .title = B贸膷nicu p艡epina膰 (dokument rozrjad/p艡iw臎拧ki/wor拧ty wobsahuje)
+pdfjs-toggle-sidebar-button-label = B贸膷nicu pokaza膰/schowa膰
+pdfjs-document-outline-button =
+    .title = Dokumentowy na膰isk pokaza膰 (dw贸jne kliknjenje, zo bychu so w拧臎 zapiski pokazali/schowali)
+pdfjs-document-outline-button-label = Dokumentowa struktura
+pdfjs-attachments-button =
+    .title = P艡iw臎拧ki pokaza膰
+pdfjs-attachments-button-label = P艡iw臎拧ki
+pdfjs-layers-button =
+    .title = Wor拧ty pokaza膰 (klik艅膰e dw贸jce, zo by拧膰e w拧臎 wor拧ty na standardny staw wr贸膰o staji艂)
+pdfjs-layers-button-label = Wor拧ty
+pdfjs-thumbs-button =
+    .title = Miniatury pokaza膰
+pdfjs-thumbs-button-label = Miniatury
+pdfjs-current-outline-item-button =
+    .title = Aktualny rozrjadowy zapisk pyta膰
+pdfjs-current-outline-item-button-label = Aktualny rozrjadowy zapisk
+pdfjs-findbar-button =
+    .title = W dokumen膰e pyta膰
+pdfjs-findbar-button-label = Pyta膰
+pdfjs-additional-layers = Dal拧e wor拧ty
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Strona { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura strony { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Stronu { $page } wubra膰
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Strona { $page } z { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Pyta膰
+    .placeholder = W dokumen膰e pyta膰鈥�
+pdfjs-find-previous-button =
+    .title = P艡edchadne wustupowanje pytanskeho wuraza pyta膰
+pdfjs-find-previous-button-label = Wr贸膰o
+pdfjs-find-next-button =
+    .title = P艡ichodne wustupowanje pytanskeho wuraza pyta膰
+pdfjs-find-next-button-label = Dale
+pdfjs-find-highlight-checkbox = W拧臎 wuzb臎hny膰
+pdfjs-find-match-case-checkbox-label = Wulkopisanje wobked藕bowa膰
+pdfjs-find-match-diacritics-checkbox-label = Diakritiske znamje拧ka wu啪iwa膰
+pdfjs-find-entire-word-checkbox-label = Cy艂e s艂owa
+pdfjs-find-reached-top = Spo膷atk dokumenta docp臎ty, pokro膷uje so z k贸ncom
+pdfjs-find-reached-bottom = K贸nc dokument docp臎ty, pokro膷uje so ze spo膷atkom
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } z { $total } wotpow臎dnika
+        [two] { $current } z { $total } wotpow臎dnikow
+        [few] { $current } z { $total } wotpow臎dnikow
+       *[other] { $current } z { $total } wotpow臎dnikow
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Wy拧e { $limit } wotpow臎dnik
+        [two] Wy拧e { $limit } wotpow臎dnikaj
+        [few] Wy拧e { $limit } wotpow臎dniki
+       *[other] Wy拧e { $limit } wotpow臎dnikow
+    }
+pdfjs-find-not-found = Pytanski wuraz njeje so namaka艂
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 艩臎rokos膰 strony
+pdfjs-page-scale-fit = Wulkos膰 strony
+pdfjs-page-scale-auto = Awtomatiske skalowanje
+pdfjs-page-scale-actual = Aktualna wulkos膰
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Strona { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = P艡i za膷itowanju PDF je zmylk wustupi艂.
+pdfjs-invalid-file-error = Njep艂a膰iwa abo wob拧kod藕ena PDF-dataja.
+pdfjs-missing-file-error = Falowaca PDF-dataja.
+pdfjs-unexpected-response-error = Njewo膷akowana serwerowa wotmo艂wa.
+pdfjs-rendering-error = P艡i zwobraznjenju strony je zmylk wustupi艂.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Typ p艡ispomnjenki: { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Zapodaj膰e hes艂o, zo by拧膰e PDF-dataju wo膷ini艂.
+pdfjs-password-invalid = Njep艂a膰iwe hes艂o. Pro拧u spytaj膰e hi拧膰e raz.
+pdfjs-password-ok-button = W porjadku
+pdfjs-password-cancel-button = P艡etorhny膰
+pdfjs-web-fonts-disabled = Webpisma su znjem贸啪njene: njeje m贸啪no, zasad藕ene PDF-pisma wu啪iwa膰.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Tekstowu barbu zm臎ni膰
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Rysowa膰
+pdfjs-editor-color-picker-ink-input =
+    .title = Rysowansku barbu zm臎ni膰
+pdfjs-editor-ink-button-label = Rysowa膰
+pdfjs-editor-stamp-button =
+    .title = Wobrazy p艡ida膰 abo wobd藕臎艂a膰
+pdfjs-editor-stamp-button-label = Wobrazy p艡ida膰 abo wobd藕臎艂a膰
+pdfjs-editor-highlight-button =
+    .title = Wuzb臎hny膰
+pdfjs-editor-highlight-button-label = Wuzb臎hny膰
+pdfjs-highlight-floating-button1 =
+    .title = Wuzb臎hnjenje
+    .aria-label = Wuzb臎hnjenje
+pdfjs-highlight-floating-button-label = Wuzb臎hnjenje
+pdfjs-comment-floating-button =
+    .title = Komentowa膰
+    .aria-label = Komentowa膰
+pdfjs-comment-floating-button-label = Komentowa膰
+pdfjs-editor-comment-button =
+    .title = Komentowa膰
+    .aria-label = Komentowa膰
+pdfjs-editor-comment-button-label = Komentowa膰
+pdfjs-editor-signature-button =
+    .title = Signaturu p艡ida膰
+pdfjs-editor-signature-button-label = Signaturu p艡ida膰
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Wuzb臎howanski editor
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Rysowanski editor
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Signaturowy editor: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Wobrazowy editor
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Rysowanku wotstroni膰
+pdfjs-editor-remove-freetext-button =
+    .title = Tekst wotstroni膰
+pdfjs-editor-remove-stamp-button =
+    .title = Wobraz wotstroni膰
+pdfjs-editor-remove-highlight-button =
+    .title = Wuzb臎hnjenje wotstroni膰
+pdfjs-editor-remove-signature-button =
+    .title = Signaturu wotstroni膰
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Barba
+pdfjs-editor-free-text-size-input = Wulkos膰
+pdfjs-editor-ink-color-input = Barba
+pdfjs-editor-ink-thickness-input = To艂stos膰
+pdfjs-editor-ink-opacity-input = Opacita
+pdfjs-editor-stamp-add-image-button =
+    .title = Wobraz p艡ida膰
+pdfjs-editor-stamp-add-image-button-label = Wobraz p艡ida膰
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = To艂stos膰
+pdfjs-editor-free-highlight-thickness-title =
+    .title = To艂stos膰 zm臎ni膰, hdy啪 so zapiski wuzb臎huja, kotre啪 tekst njejsu
+pdfjs-editor-add-signature-container =
+    .aria-label = Wod藕enske elementy signaturow a sk艂adowane signatury
+pdfjs-editor-signature-add-signature-button =
+    .title = Nowu signaturu p艡ida膰
+pdfjs-editor-signature-add-signature-button-label = Nowu signaturu p艡ida膰
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Sk艂adowana signatura: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Tekstowy editor
+    .default-content = Zapo膷艅膰e pisa膰 鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] { $count } komentar
+        [two] { $count } komentaraj
+        [few] { $count } komentary
+       *[other] { $count } komentarow
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = B贸膷nicu za膷ini膰
+    .aria-label = B贸膷nicu za膷ini膰
+pdfjs-editor-comments-sidebar-close-button-label = B贸膷nicu za膷ini膰
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Wid藕i膰e n臎拧to p艡ispomnjenja h贸dneho? Wuzb臎h艅膰e to a zawostaj膰e komentar.
+pdfjs-editor-comments-sidebar-no-comments-link = Dal拧e informacije
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternatiwny tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Alternatiwny tekst wobd藕臎艂a膰
+pdfjs-editor-alt-text-dialog-label = Nastajenje wubra膰
+pdfjs-editor-alt-text-dialog-description = Alternatiwny tekst pomha, hdy啪 lud藕o njem贸啪a wobraz wid藕e膰 abo hdy啪 so wobraz njeza膷ita.
+pdfjs-editor-alt-text-add-description-label = Wopisanje p艡ida膰
+pdfjs-editor-alt-text-add-description-description = Pisaj膰e 1 sadu abo 2 sad藕e, kotrej啪 temu, nastajenje abo akcije wopisujetej.
+pdfjs-editor-alt-text-mark-decorative-label = Jako dekoratiwny mark臎rowa膰
+pdfjs-editor-alt-text-mark-decorative-description = To so za py拧ace wobrazy wu啪iwa, na p艡ik艂ad ramiki abo wodowe znamjenja.
+pdfjs-editor-alt-text-cancel-button = P艡etorhny膰
+pdfjs-editor-alt-text-save-button = Sk艂adowa膰
+pdfjs-editor-alt-text-decorative-tooltip = Jako dekoratiwny mark臎rowany
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Na p艡ik艂ad, 鈥濵艂ody mu啪 za blidom sed藕i, zo by j臎d藕 j臎d艂鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternatiwny tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Horjeka nal臎wo 鈥� wulkos膰 zm臎ni膰
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Horjeka wosrjed藕 鈥� wulkos膰 zm臎ni膰
+pdfjs-editor-resizer-top-right =
+    .aria-label = Horjeka naprawo 鈥� wulkos膰 zm臎ni膰
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Wosrjed藕 naprawo 鈥� wulkos膰 zm臎ni膰
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Deleka naprawo 鈥� wulkos膰 zm臎ni膰
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Deleka wosrjed藕 鈥� wulkos膰 zm臎ni膰
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Deleka nal臎wo 鈥� wulkos膰 zm臎ni膰
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Wosrjed藕 nal臎wo 鈥� wulkos膰 zm臎ni膰
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Barba wuzb臎hnjenja
+pdfjs-editor-colorpicker-button =
+    .title = Barbu zm臎ni膰
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Wub臎r barbow
+pdfjs-editor-colorpicker-yellow =
+    .title = 沤o艂ty
+pdfjs-editor-colorpicker-green =
+    .title = Zeleny
+pdfjs-editor-colorpicker-blue =
+    .title = M贸dry
+pdfjs-editor-colorpicker-pink =
+    .title = Pink
+pdfjs-editor-colorpicker-red =
+    .title = 膶erwjeny
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = W拧臎 pokaza膰
+pdfjs-editor-highlight-show-all-button =
+    .title = W拧臎 pokaza膰
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Alternatiwny tekst wobd藕臎艂a膰 (wobrazowe wopisanje)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Alternatiwny tekst p艡ida膰 (wobrazowe wopisanje)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Pisaj膰e tu swoje wopisanje鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kr贸tke wopisanje za lud藕i, kot艡i啪 njem贸啪e膰e wobraz wid藕e膰 abo hdy啪 so wobraz njeza膷ita.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Tut贸n alternatiwny tekst je so awtomatisce wutwori艂 a je snano njedok艂adny.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Dal拧e informacije
+pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatiwny tekst awtomatisce wutwori膰
+pdfjs-editor-new-alt-text-not-now-button = Nic n臎tko
+pdfjs-editor-new-alt-text-error-title = Alternatiwny tekst njeda so awtomatisce wutwori膰
+pdfjs-editor-new-alt-text-error-description = Pro拧u pisaj膰e sw贸j alternatiwny tekst abo spytaj膰e pozd藕i拧o hi拧膰e raz.
+pdfjs-editor-new-alt-text-error-close-button = Za膷ini膰
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Model KI za alternatiwny tekst so s膰ahuje ({ $downloadedSize } z { $totalSize } MB)
+    .aria-valuetext = Model KI za alternatiwny tekst so s膰ahuje ({ $downloadedSize } z { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternatiwny tekst je so p艡ida艂
+pdfjs-editor-new-alt-text-added-button-label = Alternatiwny tekst je so p艡ida艂
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Alternatiwny tekst faluje
+pdfjs-editor-new-alt-text-missing-button-label = Alternatiwny tekst faluje
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Alternatiwny tekst p艡epruwowa膰
+pdfjs-editor-new-alt-text-to-review-button-label = Alternatiwny tekst p艡epruwowa膰
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Awtomatisce wutworjeny: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Nastajenja alternatiwneho wobrazoweho teksta
+pdfjs-image-alt-text-settings-button-label = Nastajenja alternatiwneho wobrazoweho teksta
+pdfjs-editor-alt-text-settings-dialog-label = Nastajenja alternatiwneho wobrazoweho teksta
+pdfjs-editor-alt-text-settings-automatic-title = Awtomatiski alternatiwny tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Alternatiwny tekst awtomatisce wutwori膰
+pdfjs-editor-alt-text-settings-create-model-description = Namjetuje wopisanja, zo by lud藕om pomha艂, kot艡i啪 njem贸啪e膰e wobraz wid藕e膰 abo hdy啪 so wobraz njeza膷ita.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model KI alternatiwneho teksta ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = B臎啪i lokalnje na wa拧im gra膰e, zo bychu wa拧e daty priwatne wostali. Za awtomatiski alternatiwny tekst tr臎bny.
+pdfjs-editor-alt-text-settings-delete-model-button = Zha拧e膰
+pdfjs-editor-alt-text-settings-download-model-button = S膰ahny膰
+pdfjs-editor-alt-text-settings-downloading-model-button = S膰ahuje so鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor za alternatiwny tekst
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Editor alternatiwneho teksta hnydom pokaza膰, hdy啪 so wobraz p艡idawa
+pdfjs-editor-alt-text-settings-show-dialog-description = Pomha, wam w拧臎m swojim wobrazam alternatiwny tekst p艡ida膰.
+pdfjs-editor-alt-text-settings-close-button = Za膷ini膰
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Wuzb臎hnjenje p艡idate
+pdfjs-editor-freetext-added-alert = Tekst p艡idaty
+pdfjs-editor-ink-added-alert = Rysowanka p艡idata
+pdfjs-editor-stamp-added-alert = Wobraz p艡idaty
+pdfjs-editor-signature-added-alert = Signatura p艡idata
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Wotstronjene wuzb臎hny膰
+pdfjs-editor-undo-bar-message-freetext = Tekst je so wotstroni艂
+pdfjs-editor-undo-bar-message-ink = Rysowanka je so wotstroni艂a
+pdfjs-editor-undo-bar-message-stamp = Wobraz je so wotstroni艂
+pdfjs-editor-undo-bar-message-signature = Signatura je so wotstroni艂a
+pdfjs-editor-undo-bar-message-comment = Komentar je so wotstroni艂
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } p艡ispomnjenka je so wotstroni艂a
+        [two] { $count } p艡ispomnjence stej so wotstroni艂oj
+        [few] { $count } p艡ispomnjenki su so wotstronili
+       *[other] { $count } p艡ispomnjenkow je so wotstroni艂o
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Cofny膰
+pdfjs-editor-undo-bar-undo-button-label = Cofny膰
+pdfjs-editor-undo-bar-close-button =
+    .title = Za膷ini膰
+pdfjs-editor-undo-bar-close-button-label = Za膷ini膰
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Tut贸n modalny dialog wu啪iwarjej zm贸啪nja, signaturu wutwori膰, zo by PDF-dokument p艡ida艂. Wu啪iwar m贸啪e mjeno wobd藕臎艂a膰 (kotre啪 te啪 jako alternatiwny tekst s艂u啪i) a po p艡e膰u signaturu za wospjetne wu啪iwanje sk艂adowa膰.
+pdfjs-editor-add-signature-dialog-title = Signaturu p艡ida膰
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Typ
+    .title = Typ
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Rysowa膰
+    .title = Rysowa膰
+pdfjs-editor-add-signature-image-button = Wobraz
+    .title = Wobraz
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Zapodaj膰e swoju signaturu
+    .placeholder = Zapodaj膰e swoju signaturu
+pdfjs-editor-add-signature-draw-placeholder = Rysuj膰e swoju signaturu
+pdfjs-editor-add-signature-draw-thickness-range-label = To艂stos膰
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = To艂stos膰 rysowanki: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 膯eh艅膰e dataju sem, zo by拧膰e ju nahra艂
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Abo p艡epytaj膰e wobrazowe dataje
+       *[other] Abo p艡epytaj膰e wobrazowe dataje
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Wopisanje (alternatiwny tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Wopisanje (alternatiwny tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Signatura
+pdfjs-editor-add-signature-clear-button-label = Signaturu zha拧e膰
+pdfjs-editor-add-signature-clear-button =
+    .title = Signaturu zha拧e膰
+pdfjs-editor-add-signature-save-checkbox = Signaturu sk艂adowa膰
+pdfjs-editor-add-signature-save-warning-message = S膰e limit 5 sk艂adowanych signaturow docp臎艂. Wotstro艅膰e jednu, zo by拧膰e wjace sk艂adowa艂.
+pdfjs-editor-add-signature-image-upload-error-title = Wobraz njeda so nahra膰
+pdfjs-editor-add-signature-image-upload-error-description = P艡epruwuj膰e sw贸j sy膰owy zwisk abo spytaj膰e druhi wobraz.
+pdfjs-editor-add-signature-image-no-data-error-title = Tut贸n wobraz njeda so do signatury p艡etwori膰
+pdfjs-editor-add-signature-image-no-data-error-description = Spytaj膰e pro拧u druhi wobraz nahra膰.
+pdfjs-editor-add-signature-error-close-button = Za膷ini膰
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = P艡etorhny膰
+pdfjs-editor-add-signature-add-button = P艡ida膰
+pdfjs-editor-edit-signature-update-button = Aktualizowa膰
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Komentar wobd藕臎艂a膰
+pdfjs-editor-edit-comment-popup-button =
+    .title = Komentar wobd藕臎艂a膰
+pdfjs-editor-delete-comment-popup-button-label = Komentar wotstroni膰
+pdfjs-editor-delete-comment-popup-button =
+    .title = Komentar wotstroni膰
+pdfjs-show-comment-button =
+    .title = Komentar pokaza膰
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Komentar wobd藕臎艂a膰
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizowa膰
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Komentar p艡ida膰
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = P艡ida膰
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Zapo膷艅膰e pisa膰鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = P艡etorhny膰
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Komentar p艡ida膰
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = B贸膷nicu p艡epina膰 (dokument miniatury/rozrjad/p艡iw臎拧ki/wor拧ty wobsahuje)
+pdfjs-toggle-views-manager-button1-label = Strony rjadowa膰
+pdfjs-views-manager-sidebar =
+    .aria-label = B贸膷nica
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = P艡im臎rjenje wulkos膰e b贸膷nicy
+pdfjs-views-manager-view-selector-button =
+    .title = Napohlady
+pdfjs-views-manager-view-selector-button-label = Napohlady
+pdfjs-views-manager-pages-title = Strony
+pdfjs-views-manager-outlines-title1 = Dokumentowa struktura
+    .title = Dokumentowa struktura (klik艅膰e dw贸jce, zo by拧膰e w拧臎 zapiski pokaza艂/schowa艂)
+pdfjs-views-manager-attachments-title = P艡iw臎拧ki
+pdfjs-views-manager-layers-title1 = Runiny
+    .title = Runiny (klik艅膰e dw贸jce, zo by拧膰e w拧臎 runiny na standardny status wr贸膰o staji艂)
+pdfjs-views-manager-pages-option-label = Strony
+pdfjs-views-manager-outlines-option-label = Dokumentowa struktura
+pdfjs-views-manager-attachments-option-label = P艡iw臎拧ki
+pdfjs-views-manager-layers-option-label = Runiny
+pdfjs-views-manager-add-file-button =
+    .title = Dataju p艡ida膰
+pdfjs-views-manager-add-file-button-label = Dataju p艡ida膰
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } wubrany
+        [two] { $count } wubranej
+        [few] { $count } wubrane
+       *[other] { $count } wubranych
+    }
+pdfjs-views-manager-pages-status-none-action-label = Strony wubra膰
+pdfjs-views-manager-pages-status-action-button-label = Rjadowa膰
+pdfjs-views-manager-pages-status-copy-button-label = Kop臎rowa膰
+pdfjs-views-manager-pages-status-cut-button-label = Wut艡iha膰
+pdfjs-views-manager-pages-status-delete-button-label = Zha拧e膰
+pdfjs-views-manager-pages-status-export-selected-button-label = Wubrane eksportowa膰鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] { $count } strona wut艡ihana
+        [two] { $count } stronje wut艡ihanej
+        [few] { $count } strony wut艡ihane
+       *[other] { $count } stronow wut艡ihane
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] { $count } strona kop臎rowana
+        [two] { $count } strona kop臎rowanej
+        [few] { $count } strona kop臎rowane
+       *[other] { $count } strona kop臎rowane
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] { $count } strona zha拧ana
+        [two] { $count } strona zha拧anej
+        [few] { $count } strona zha拧ane
+       *[other] { $count } strona zha拧ane
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Wa拧a dataja so p艡ihotuje鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Dataja so nahrawa鈥�
+pdfjs-views-manager-status-warning-cut-label = Njeda so wut艡iha膰. Aktualizuj膰e stronu a spytaj膰e hi拧膰e raz.
+pdfjs-views-manager-status-warning-copy-label = Njeda so kop臎rowa膰. Aktualizuj膰e stronu a spytaj膰e hi拧膰e raz.
+pdfjs-views-manager-status-warning-delete-label = Njeda so zha拧e膰. Aktualizuj膰e stronu a spytaj膰e hi拧膰e raz.
+pdfjs-views-manager-status-warning-save-label = Njeda so sk艂adowa膰. Aktualizuj膰e stronu a spytaj膰e hi拧膰e raz.
+pdfjs-views-manager-status-undo-button-label = Cofny膰
+pdfjs-views-manager-status-done-button-label = Dok贸n膷eny
+pdfjs-views-manager-status-close-button =
+    .title = Za膷ini膰
+pdfjs-views-manager-status-close-button-label = Za膷ini膰
+pdfjs-views-manager-paste-button-label = Zasad藕i膰
+pdfjs-views-manager-paste-button-before =
+    .title = P艡ed pr臎njej stronu zasad藕i膰
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Za stronu { $page } zasad藕i膰
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOWY
+pdfjs-views-manager-waiting-for-file = Dataja so nahrawa鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Strony rjadowa膰
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Sk艂adowanu signaturu wotstroni膰
+pdfjs-editor-delete-signature-button-label1 = Sk艂adowanu signaturu wotstroni膰
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Wopisanje wobd藕臎艂a膰
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Wopisanje wobd藕臎艂a膰
diff --git a/public/pdfjs/web/locale/hu/viewer.ftl b/public/pdfjs/web/locale/hu/viewer.ftl
new file mode 100644
index 0000000..4ea85af
--- /dev/null
+++ b/public/pdfjs/web/locale/hu/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = El艖z艖 oldal
+pdfjs-previous-button-label = El艖z艖
+pdfjs-next-button =
+    .title = K枚vetkez艖 oldal
+pdfjs-next-button-label = Tov谩bb
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Oldal
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 枚sszesen: { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Kicsiny铆t茅s
+pdfjs-zoom-out-button-label = Kicsiny铆t茅s
+pdfjs-zoom-in-button =
+    .title = Nagy铆t谩s
+pdfjs-zoom-in-button-label = Nagy铆t谩s
+pdfjs-zoom-select =
+    .title = Nagy铆t谩s
+pdfjs-presentation-mode-button =
+    .title = V谩lt谩s bemutat贸 m贸dba
+pdfjs-presentation-mode-button-label = Bemutat贸 m贸d
+pdfjs-open-file-button =
+    .title = F谩jl megnyit谩sa
+pdfjs-open-file-button-label = Megnyit谩s
+pdfjs-print-button =
+    .title = Nyomtat谩s
+pdfjs-print-button-label = Nyomtat谩s
+pdfjs-save-button =
+    .title = Ment茅s
+pdfjs-save-button-label = Ment茅s
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Let枚lt茅s
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Let枚lt茅s
+pdfjs-bookmark-button =
+    .title = Jelenlegi oldal (webc铆m megtekint茅se a jelenlegi oldalr贸l)
+pdfjs-bookmark-button-label = Jelenlegi oldal
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Eszk枚z枚k
+pdfjs-tools-button-label = Eszk枚z枚k
+pdfjs-first-page-button =
+    .title = Ugr谩s az els艖 oldalra
+pdfjs-first-page-button-label = Ugr谩s az els艖 oldalra
+pdfjs-last-page-button =
+    .title = Ugr谩s az utols贸 oldalra
+pdfjs-last-page-button-label = Ugr谩s az utols贸 oldalra
+pdfjs-page-rotate-cw-button =
+    .title = Forgat谩s az 贸ramutat贸 j谩r谩s谩val egyez艖en
+pdfjs-page-rotate-cw-button-label = Forgat谩s az 贸ramutat贸 j谩r谩s谩val egyez艖en
+pdfjs-page-rotate-ccw-button =
+    .title = Forgat谩s az 贸ramutat贸 j谩r谩s谩val ellent茅tesen
+pdfjs-page-rotate-ccw-button-label = Forgat谩s az 贸ramutat贸 j谩r谩s谩val ellent茅tesen
+pdfjs-cursor-text-select-tool-button =
+    .title = Sz枚vegkijel枚l艖 eszk枚z bekapcsol谩sa
+pdfjs-cursor-text-select-tool-button-label = Sz枚vegkijel枚l艖 eszk枚z
+pdfjs-cursor-hand-tool-button =
+    .title = K茅z eszk枚z bekapcsol谩sa
+pdfjs-cursor-hand-tool-button-label = K茅z eszk枚z
+pdfjs-scroll-page-button =
+    .title = Oldalg枚rget茅s haszn谩lata
+pdfjs-scroll-page-button-label = Oldalg枚rget茅s
+pdfjs-scroll-vertical-button =
+    .title = F眉gg艖leges g枚rget茅s haszn谩lata
+pdfjs-scroll-vertical-button-label = F眉gg艖leges g枚rget茅s
+pdfjs-scroll-horizontal-button =
+    .title = V铆zszintes g枚rget茅s haszn谩lata
+pdfjs-scroll-horizontal-button-label = V铆zszintes g枚rget茅s
+pdfjs-scroll-wrapped-button =
+    .title = R谩csos elrendez茅s haszn谩lata
+pdfjs-scroll-wrapped-button-label = R谩csos elrendez茅s
+pdfjs-spread-none-button =
+    .title = Ne tapassza 枚ssze az oldalakat
+pdfjs-spread-none-button-label = Nincs 枚sszetapaszt谩s
+pdfjs-spread-odd-button =
+    .title = Lapok 枚sszetapaszt谩sa, a p谩ratlan sz谩m煤 oldalakkal kezdve
+pdfjs-spread-odd-button-label = 脰sszetapaszt谩s: p谩ratlan
+pdfjs-spread-even-button =
+    .title = Lapok 枚sszetapaszt谩sa, a p谩ros sz谩m煤 oldalakkal kezdve
+pdfjs-spread-even-button-label = 脰sszetapaszt谩s: p谩ros
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumentum tulajdons谩gai鈥�
+pdfjs-document-properties-button-label = Dokumentum tulajdons谩gai鈥�
+pdfjs-document-properties-file-name = F谩jln茅v:
+pdfjs-document-properties-file-size = F谩jlm茅ret:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } b谩jt)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } b谩jt)
+pdfjs-document-properties-title = C铆m:
+pdfjs-document-properties-author = Szerz艖:
+pdfjs-document-properties-subject = T谩rgy:
+pdfjs-document-properties-keywords = Kulcsszavak:
+pdfjs-document-properties-creation-date = L茅trehoz谩s d谩tuma:
+pdfjs-document-properties-modification-date = M贸dos铆t谩s d谩tuma:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = L茅trehozta:
+pdfjs-document-properties-producer = PDF el艖谩ll铆t贸:
+pdfjs-document-properties-version = PDF verzi贸:
+pdfjs-document-properties-page-count = Oldalsz谩m:
+pdfjs-document-properties-page-size = Lapm茅ret:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 谩ll贸
+pdfjs-document-properties-page-size-orientation-landscape = fekv艖
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Jogi inform谩ci贸k
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Gyors webes n茅zet:
+pdfjs-document-properties-linearized-yes = Igen
+pdfjs-document-properties-linearized-no = Nem
+pdfjs-document-properties-close-button = Bez谩r谩s
+
+## Print
+
+pdfjs-print-progress-message = Dokumentum el艖k茅sz铆t茅se nyomtat谩shoz鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = M茅gse
+pdfjs-printing-not-supported = Figyelmeztet茅s: Ez a b枚ng茅sz艖 nem teljesen t谩mogatja a nyomtat谩st.
+pdfjs-printing-not-ready = Figyelmeztet茅s: A PDF nincs teljesen bet枚ltve a nyomtat谩shoz.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Oldals谩v be/ki
+pdfjs-toggle-sidebar-notification-button =
+    .title = Oldals谩v be/ki (a dokumentum v谩zlatot/mell茅kleteket/r茅tegeket tartalmaz)
+pdfjs-toggle-sidebar-button-label = Oldals谩v be/ki
+pdfjs-document-outline-button =
+    .title = Dokumentum megjelen铆t茅se online (dupla kattint谩s minden elem kinyit谩s谩hoz/枚sszecsuk谩s谩hoz)
+pdfjs-document-outline-button-label = Dokumentumv谩zlat
+pdfjs-attachments-button =
+    .title = Mell茅kletek megjelen铆t茅se
+pdfjs-attachments-button-label = Van mell茅klet
+pdfjs-layers-button =
+    .title = R茅tegek megjelen铆t茅se (dupla kattint谩s az 枚sszes r茅teg alap茅rtelmezett 谩llapotra vissza谩ll铆t谩s谩hoz)
+pdfjs-layers-button-label = R茅tegek
+pdfjs-thumbs-button =
+    .title = B茅lyegk茅pek megjelen铆t茅se
+pdfjs-thumbs-button-label = B茅lyegk茅pek
+pdfjs-current-outline-item-button =
+    .title = Jelenlegi v谩zlatelem megkeres茅se
+pdfjs-current-outline-item-button-label = Jelenlegi v谩zlatelem
+pdfjs-findbar-button =
+    .title = Keres茅s a dokumentumban
+pdfjs-findbar-button-label = Keres茅s
+pdfjs-additional-layers = Tov谩bbi r茅tegek
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page }. oldal
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page }. oldal b茅lyegk茅pe
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = { $page }. oldal kiv谩laszt谩sa
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = { $page }. / { $total } oldal
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Keres茅s
+    .placeholder = Keres茅s a dokumentumban鈥�
+pdfjs-find-previous-button =
+    .title = A kifejez茅s el艖z艖 el艖fordul谩s谩nak keres茅se
+pdfjs-find-previous-button-label = El艖z艖
+pdfjs-find-next-button =
+    .title = A kifejez茅s k枚vetkez艖 el艖fordul谩s谩nak keres茅se
+pdfjs-find-next-button-label = Tov谩bb
+pdfjs-find-highlight-checkbox = 脰sszes kiemel茅se
+pdfjs-find-match-case-checkbox-label = Kis- 茅s nagybet疟k megk眉l枚nb枚ztet茅se
+pdfjs-find-match-diacritics-checkbox-label = Diakritikus jelek
+pdfjs-find-entire-word-checkbox-label = Teljes szavak
+pdfjs-find-reached-top = A dokumentum eleje el茅rve, folytat谩s a v茅g茅t艖l
+pdfjs-find-reached-bottom = A dokumentum v茅ge el茅rve, folytat谩s az elej茅t艖l
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } / { $total } tal谩lat
+       *[other] { $current } / { $total } tal谩lat
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] T枚bb mint { $limit } tal谩lat
+       *[other] T枚bb mint { $limit } tal谩lat
+    }
+pdfjs-find-not-found = A kifejez茅s nem tal谩lhat贸
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Oldalsz茅less茅g
+pdfjs-page-scale-fit = Teljes oldal
+pdfjs-page-scale-auto = Automatikus nagy铆t谩s
+pdfjs-page-scale-actual = Val贸di m茅ret
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = { $page }. oldal
+
+## Loading indicator messages
+
+pdfjs-loading-error = Hiba t枚rt茅nt a PDF bet枚lt茅sekor.
+pdfjs-invalid-file-error = 脡rv茅nytelen vagy s茅r眉lt PDF f谩jl.
+pdfjs-missing-file-error = Hi谩nyz贸 PDF f谩jl.
+pdfjs-unexpected-response-error = V谩ratlan kiszolg谩l贸v谩lasz.
+pdfjs-rendering-error = Hiba t枚rt茅nt az oldal feldolgoz谩sa k枚zben.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } megjegyz茅s]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Adja meg a jelsz贸t a PDF f谩jl megnyit谩s谩hoz.
+pdfjs-password-invalid = Helytelen jelsz贸. Pr贸b谩lja 煤jra.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = M茅gse
+pdfjs-web-fonts-disabled = Webes bet疟k茅szletek letiltva: nem haszn谩lhat贸k a be谩gyazott PDF bet疟k茅szletek.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Sz枚veg
+pdfjs-editor-color-picker-free-text-input =
+    .title = Sz枚vegsz铆n m贸dos铆t谩sa
+pdfjs-editor-free-text-button-label = Sz枚veg
+pdfjs-editor-ink-button =
+    .title = Rajzol谩s
+pdfjs-editor-color-picker-ink-input =
+    .title = Rajzol谩si sz铆n m贸dos铆t谩sa
+pdfjs-editor-ink-button-label = Rajzol谩s
+pdfjs-editor-stamp-button =
+    .title = K茅pek hozz谩ad谩sa vagy szerkeszt茅se
+pdfjs-editor-stamp-button-label = K茅pek hozz谩ad谩sa vagy szerkeszt茅se
+pdfjs-editor-highlight-button =
+    .title = Kiemel茅s
+pdfjs-editor-highlight-button-label = Kiemel茅s
+pdfjs-highlight-floating-button1 =
+    .title = Kiemel茅s
+    .aria-label = Kiemel茅s
+pdfjs-highlight-floating-button-label = Kiemel茅s
+pdfjs-comment-floating-button =
+    .title = Megjegyz茅s
+    .aria-label = Megjegyz茅s
+pdfjs-comment-floating-button-label = Megjegyz茅s
+pdfjs-editor-comment-button =
+    .title = Megjegyz茅s
+    .aria-label = Megjegyz茅s
+pdfjs-editor-comment-button-label = Megjegyz茅s
+pdfjs-editor-signature-button =
+    .title = Al谩铆r谩s hozz谩ad谩sa
+pdfjs-editor-signature-button-label = Al谩铆r谩s hozz谩ad谩sa
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Kiemel茅sszerkeszt艖
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Rajzszerkeszt艖
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Al谩铆r谩s-szerkeszt艖: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = K茅pszerkeszt艖
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Rajz elt谩vol铆t谩sa
+pdfjs-editor-remove-freetext-button =
+    .title = Sz枚veg elt谩vol铆t谩sa
+pdfjs-editor-remove-stamp-button =
+    .title = K茅p elt谩vol铆t谩sa
+pdfjs-editor-remove-highlight-button =
+    .title = Kiemel茅s elt谩vol铆t谩sa
+pdfjs-editor-remove-signature-button =
+    .title = Al谩铆r谩s elt谩vol铆t谩sa
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Sz铆n
+pdfjs-editor-free-text-size-input = M茅ret
+pdfjs-editor-ink-color-input = Sz铆n
+pdfjs-editor-ink-thickness-input = Vastags谩g
+pdfjs-editor-ink-opacity-input = 脕tl谩tszatlans谩g
+pdfjs-editor-stamp-add-image-button =
+    .title = K茅p hozz谩ad谩sa
+pdfjs-editor-stamp-add-image-button-label = K茅p hozz谩ad谩sa
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Vastags谩g
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Vastags谩g m贸dos铆t谩sa, ha nem sz枚veges elemeket emel ki
+pdfjs-editor-add-signature-container =
+    .aria-label = Al谩铆r谩s-vez茅rl艖k 茅s mentett al谩铆r谩sok
+pdfjs-editor-signature-add-signature-button =
+    .title = 脷j al谩铆r谩s hozz谩ad谩sa
+pdfjs-editor-signature-add-signature-button-label = 脷j al谩铆r谩s hozz谩ad谩sa
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Mentett al谩铆r谩s: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Sz枚vegszerkeszt艖
+    .default-content = Kezdjen g茅pelni鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Megjegyz茅s
+       *[other] Megjegyz茅sek
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Oldals谩v bez谩r谩sa
+    .aria-label = Oldals谩v bez谩r谩sa
+pdfjs-editor-comments-sidebar-close-button-label = Oldals谩v bez谩r谩sa
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = L谩t valami figyelemre m茅lt贸t? Jel枚lje ki 茅s 铆rjon megjegyz茅st.
+pdfjs-editor-comments-sidebar-no-comments-link = Tov谩bbi tudnival贸k
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternat铆v sz枚veg
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Alternat铆v sz枚veg szerkeszt茅se
+pdfjs-editor-alt-text-dialog-label = V谩lasszon egy lehet艖s茅get
+pdfjs-editor-alt-text-dialog-description = Az alternat铆v sz枚veg seg铆t, ha az emberek nem l谩tj谩k a k茅pet, vagy ha az nem t枚lt艖dik be.
+pdfjs-editor-alt-text-add-description-label = Le铆r谩s hozz谩ad谩sa
+pdfjs-editor-alt-text-add-description-description = T枚rekedjen 1-2 mondatra, amely jellemzi a t茅m谩t, k枚rnyezetet vagy cselekv茅st.
+pdfjs-editor-alt-text-mark-decorative-label = Megjel枚l茅s dekorat铆vk茅nt
+pdfjs-editor-alt-text-mark-decorative-description = Ez a d铆sz铆t艖k茅pekn茅l haszn谩latos, mint a szeg茅lyek vagy a v铆zjelek.
+pdfjs-editor-alt-text-cancel-button = M茅gse
+pdfjs-editor-alt-text-save-button = Ment茅s
+pdfjs-editor-alt-text-decorative-tooltip = Megjel枚lve dekorat铆vk茅nt
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = P茅ld谩ul: 鈥濫gy fiatal f茅rfi le眉l enni egy asztalhoz鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternat铆v sz枚veg
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Bal fels艖 sarok 鈥� 谩tm茅retez茅s
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Fel眉l k枚z茅pen 鈥� 谩tm茅retez茅s
+pdfjs-editor-resizer-top-right =
+    .aria-label = Jobb fels艖 sarok 鈥� 谩tm茅retez茅s
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Jobbra k枚z茅pen 鈥� 谩tm茅retez茅s
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Jobb als贸 sarok 鈥� 谩tm茅retez茅s
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Alul k枚z茅pen 鈥� 谩tm茅retez茅s
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Bal als贸 sarok 鈥� 谩tm茅retez茅s
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Balra k枚z茅pen 鈥� 谩tm茅retez茅s
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Kiemel茅s sz铆ne
+pdfjs-editor-colorpicker-button =
+    .title = Sz铆n m贸dos铆t谩sa
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Sz铆nv谩laszt谩sok
+pdfjs-editor-colorpicker-yellow =
+    .title = S谩rga
+pdfjs-editor-colorpicker-green =
+    .title = Z枚ld
+pdfjs-editor-colorpicker-blue =
+    .title = K茅k
+pdfjs-editor-colorpicker-pink =
+    .title = R贸zsasz铆n
+pdfjs-editor-colorpicker-red =
+    .title = V枚r枚s
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 脰sszes megjelen铆t茅se
+pdfjs-editor-highlight-show-all-button =
+    .title = 脰sszes megjelen铆t茅se
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Alternat铆v sz枚veg szerkeszt茅se (k茅ple铆r谩s)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Alternat铆v sz枚veg hozz谩ad谩sa (k茅ple铆r谩s)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 脥rja ide a le铆r谩s谩t鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = R枚vid le铆r谩s azoknak, akik nem l谩tj谩k a k茅pet, vagy arra az esetre, ha a k茅p nem t枚lt be.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Ez az alternat铆v sz枚veg automatikusan lett l茅trehozva, 茅s pontatlan lehet.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Tov谩bbi tudnival贸k
+pdfjs-editor-new-alt-text-create-automatically-button-label = Alternat铆v sz枚veg automatikus l茅trehoz谩sa
+pdfjs-editor-new-alt-text-not-now-button = Most nem
+pdfjs-editor-new-alt-text-error-title = Az alternat铆v sz枚veg automatikus l茅trehoz谩sa nem siker眉lt
+pdfjs-editor-new-alt-text-error-description = 脥rja meg a saj谩t alternat铆v sz枚veg茅t, vagy pr贸b谩lja 煤jra k茅s艖bb.
+pdfjs-editor-new-alt-text-error-close-button = Bez谩r谩s
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alternat铆v sz枚veg MI modell let枚lt茅se ({ $downloadedSize } / { $totalSize } MB)
+    .aria-valuetext = Alternat铆v sz枚veg MI modell let枚lt茅se ({ $downloadedSize } / { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternat铆v sz枚veg hozz谩adva
+pdfjs-editor-new-alt-text-added-button-label = Alternat铆v sz枚veg hozz谩adva
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Hi谩nyz贸 alternat铆v sz枚veg
+pdfjs-editor-new-alt-text-missing-button-label = Hi谩nyz贸 alternat铆v sz枚veg
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Alternat铆v sz枚veg 谩ttekint茅se
+pdfjs-editor-new-alt-text-to-review-button-label = Alternat铆v sz枚veg szerkeszt茅se
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatikusan l茅trehozva: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = K茅p alternat铆v sz枚veg茅nek be谩ll铆t谩sai
+pdfjs-image-alt-text-settings-button-label = K茅p alternat铆v sz枚veg茅nek be谩ll铆t谩sai
+pdfjs-editor-alt-text-settings-dialog-label = K茅p alternat铆v sz枚veg茅nek be谩ll铆t谩sai
+pdfjs-editor-alt-text-settings-automatic-title = Automatikus alternat铆v sz枚veg
+pdfjs-editor-alt-text-settings-create-model-button-label = Alternat铆v sz枚veg automatikus l茅trehoz谩sa
+pdfjs-editor-alt-text-settings-create-model-description = Le铆r谩sokat javasol, hogy seg铆tsen azoknak, akik nem l谩tj谩k a k茅pet, vagy arra az esetre, ha a k茅p nem t枚lt be.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Alternat铆v sz枚veg MI modellje ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Helyben fut az eszk枚z茅n, 铆gy az adatai priv谩tok maradnak. Az automatikus alternat铆v sz枚vegekhez sz眉ks茅ges.
+pdfjs-editor-alt-text-settings-delete-model-button = T枚rl茅s
+pdfjs-editor-alt-text-settings-download-model-button = Let枚lt茅s
+pdfjs-editor-alt-text-settings-downloading-model-button = Let枚lt茅s鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alternat铆v sz枚veg szerkeszt艖je
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Az alternat铆v sz枚veg szerkeszt艖j茅nek azonnali megjelen铆t茅se egy k茅p hozz谩ad谩sakor
+pdfjs-editor-alt-text-settings-show-dialog-description = Seg铆t el茅rni, hogy az 枚sszes k茅p茅n legyen alternat铆v sz枚veg.
+pdfjs-editor-alt-text-settings-close-button = Bez谩r谩s
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Kiemel茅s hozz谩adva
+pdfjs-editor-freetext-added-alert = Sz枚veg hozz谩adva
+pdfjs-editor-ink-added-alert = Rajz hozz谩adva
+pdfjs-editor-stamp-added-alert = K茅p hozz谩adva
+pdfjs-editor-signature-added-alert = Al谩铆r谩s hozz谩adva
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Kiemel茅s elt谩vol铆tva
+pdfjs-editor-undo-bar-message-freetext = Sz枚veg elt谩vol铆tva
+pdfjs-editor-undo-bar-message-ink = Rajz elt谩vol铆tva
+pdfjs-editor-undo-bar-message-stamp = K茅p elt谩vol铆tva
+pdfjs-editor-undo-bar-message-signature = Al谩铆r谩s elt谩vol铆tva
+pdfjs-editor-undo-bar-message-comment = Megjegyz茅s elt谩vol铆tva
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } komment谩r elt谩vol铆tva
+       *[other] { $count } komment谩r elt谩vol铆tva
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Visszavon谩s
+pdfjs-editor-undo-bar-undo-button-label = Visszavon谩s
+pdfjs-editor-undo-bar-close-button =
+    .title = Bez谩r谩s
+pdfjs-editor-undo-bar-close-button-label = Bez谩r谩s
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Ez a m贸d lehet艖v茅 teszi a felhaszn谩l贸nak, hogy al谩铆r谩st hozzon l茅tre, 茅s ezt egy PDF dokumentumhoz adja. A felhaszn谩l贸 szerkesztheti a nevet (ez egyben alternat铆v sz枚vegk茅nt is szolg谩l), 茅s ism茅telt felhaszn谩l谩s c茅lj谩b贸l tetsz茅s szerint mentheti az al谩铆r谩st.
+pdfjs-editor-add-signature-dialog-title = Al谩铆r谩s hozz谩ad谩sa
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Be铆r谩s
+    .title = Be铆r谩s
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Rajzol谩s
+    .title = Rajzol谩s
+pdfjs-editor-add-signature-image-button = K茅p
+    .title = K茅p
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 脥rja be az al谩铆r谩s谩t
+    .placeholder = 脥rja be az al谩铆r谩s谩t
+pdfjs-editor-add-signature-draw-placeholder = Rajzolja le az al谩铆r谩s谩t
+pdfjs-editor-add-signature-draw-thickness-range-label = Vastags谩g
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Rajzol谩si vastags谩g: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = H煤zzon ide egy f谩jlt a felt枚lt茅shez
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Vagy tall贸zzon a k茅pf谩jlok k枚z枚tt
+       *[other] Vagy tall贸zzon a k茅pf谩jlok k枚z枚tt
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Le铆r谩s (alternat铆v sz枚veg)
+pdfjs-editor-add-signature-description-input =
+    .title = Le铆r谩s (alternat铆v sz枚veg)
+pdfjs-editor-add-signature-description-default-when-drawing = Al谩铆r谩s
+pdfjs-editor-add-signature-clear-button-label = Al谩铆r谩s t枚rl茅se
+pdfjs-editor-add-signature-clear-button =
+    .title = Al谩铆r谩s t枚rl茅se
+pdfjs-editor-add-signature-save-checkbox = Al谩铆r谩s ment茅se
+pdfjs-editor-add-signature-save-warning-message = El茅rte a mentett al谩铆r谩sok 5 darabos korl谩tj谩t. A ment茅shez t谩vol铆tson el egyet.
+pdfjs-editor-add-signature-image-upload-error-title = A k茅p nem t枚lthet艖 fel
+pdfjs-editor-add-signature-image-upload-error-description = Ellen艖rizze a h谩l贸zati kapcsolatot, vagy pr贸b谩lkozzon egy m谩sik k茅ppel.
+pdfjs-editor-add-signature-image-no-data-error-title = Ez a k茅p nem alak铆that贸 谩t al谩铆r谩ss谩
+pdfjs-editor-add-signature-image-no-data-error-description = Pr贸b谩ljon meg m谩sik k茅pet felt枚lteni.
+pdfjs-editor-add-signature-error-close-button = Bez谩r谩s
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = M茅gse
+pdfjs-editor-add-signature-add-button = Hozz谩ad谩s
+pdfjs-editor-edit-signature-update-button = Friss铆t茅s
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Megjegyz茅s szerkeszt茅se
+pdfjs-editor-edit-comment-popup-button =
+    .title = Megjegyz茅s szerkeszt茅se
+pdfjs-editor-delete-comment-popup-button-label = Megjegyz茅s elt谩vol铆t谩sa
+pdfjs-editor-delete-comment-popup-button =
+    .title = Megjegyz茅s elt谩vol铆t谩sa
+pdfjs-show-comment-button =
+    .title = Megjegyz茅s megjelen铆t茅se
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Megjegyz茅s szerkeszt茅se
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Friss铆t茅s
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Megjegyz茅s hozz谩ad谩sa
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Hozz谩ad谩s
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Kezdjen el g茅pelni鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = M茅gse
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Megjegyz茅s hozz谩ad谩sa
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Oldals谩v be/ki (a dokumentum b茅lyegk茅peket/v谩zlatot/mell茅kleteket/r茅tegeket tartalmaz)
+pdfjs-toggle-views-manager-button1-label = Oldalak kezel茅se
+pdfjs-views-manager-sidebar =
+    .aria-label = Oldals谩v
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Oldals谩v-谩tm茅retez艖
+pdfjs-views-manager-view-selector-button =
+    .title = N茅zetek
+pdfjs-views-manager-view-selector-button-label = N茅zetek
+pdfjs-views-manager-pages-title = Oldalak
+pdfjs-views-manager-outlines-title1 = Dokumentumv谩zlat
+    .title = Dokumentumv谩zlat (dupla kattint谩s az 枚sszes elem kinyit谩s谩hoz/becsuk谩s谩hoz)
+pdfjs-views-manager-attachments-title = Mell茅kletek
+pdfjs-views-manager-layers-title1 = R茅tegek
+    .title = R茅tegek (dupla kattint谩s az 枚sszes r茅teg eredeti 谩llapotba val贸 vissza谩ll铆t谩s谩hoz)
+pdfjs-views-manager-pages-option-label = Oldalak
+pdfjs-views-manager-outlines-option-label = Dokumentumv谩zlat
+pdfjs-views-manager-attachments-option-label = Mell茅kletek
+pdfjs-views-manager-layers-option-label = R茅tegek
+pdfjs-views-manager-add-file-button =
+    .title = F谩jl hozz谩ad谩sa
+pdfjs-views-manager-add-file-button-label = F谩jl hozz谩ad谩sa
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } kiv谩lasztva
+       *[other] { $count } kiv谩lasztva
+    }
+pdfjs-views-manager-pages-status-none-action-label = Oldalak kiv谩laszt谩sa
+pdfjs-views-manager-pages-status-action-button-label = Kezel茅s
+pdfjs-views-manager-pages-status-copy-button-label = M谩sol谩s
+pdfjs-views-manager-pages-status-cut-button-label = Kiv谩g谩s
+pdfjs-views-manager-pages-status-delete-button-label = T枚rl茅s
+pdfjs-views-manager-pages-status-export-selected-button-label = Kiv谩lasztottak export谩l谩sa鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 oldal kiv谩gva
+       *[other] { $count } oldal kiv谩gva
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 oldal m谩solva
+       *[other] { $count } oldal m谩solva
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 oldal t枚r枚lve
+       *[other] { $count } oldal t枚r枚lve
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = A f谩jl el艖k茅sz铆t茅se鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = F谩jl felt枚lt茅se鈥�
+pdfjs-views-manager-status-warning-cut-label = Nem siker眉lt kiv谩gni. Friss铆tse az oldalt, 茅s pr贸b谩lja 煤jra.
+pdfjs-views-manager-status-warning-copy-label = Nem siker眉lt m谩solni. Friss铆tse az oldalt, 茅s pr贸b谩lja 煤jra.
+pdfjs-views-manager-status-warning-delete-label = Nem siker眉lt t枚r枚lni. Friss铆tse az oldalt, 茅s pr贸b谩lja 煤jra.
+pdfjs-views-manager-status-warning-save-label = Nem siker眉lt menteni. Friss铆tse az oldalt, 茅s pr贸b谩lja 煤jra.
+pdfjs-views-manager-status-undo-button-label = Visszavon谩s
+pdfjs-views-manager-status-done-button-label = K茅sz
+pdfjs-views-manager-status-close-button =
+    .title = Bez谩r谩s
+pdfjs-views-manager-status-close-button-label = Bez谩r谩s
+pdfjs-views-manager-paste-button-label = Beilleszt茅s
+pdfjs-views-manager-paste-button-before =
+    .title = Beilleszt茅s az els艖 oldal el茅
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Beilleszt茅s a(z) { $page }. oldal ut谩n
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 脷J
+pdfjs-views-manager-waiting-for-file = F谩jl felt枚lt茅se鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Oldalak kezel茅se
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Mentett al谩铆r谩s elt谩vol铆t谩sa
+pdfjs-editor-delete-signature-button-label1 = Mentett al谩铆r谩s elt谩vol铆t谩sa
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Le铆r谩s szerkeszt茅se
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Le铆r谩s szerkeszt茅se
diff --git a/public/pdfjs/web/locale/hy-AM/viewer.ftl b/public/pdfjs/web/locale/hy-AM/viewer.ftl
new file mode 100644
index 0000000..de98360
--- /dev/null
+++ b/public/pdfjs/web/locale/hy-AM/viewer.ftl
@@ -0,0 +1,637 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 諉铡窄崭謤栅 乍栈炸
+pdfjs-previous-button-label = 諉铡窄崭謤栅炸
+pdfjs-next-button =
+    .title = 諃铡栈崭謤栅 乍栈炸
+pdfjs-next-button-label = 諃铡栈崭謤栅炸
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 苑栈.
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = -炸諠 { $pagesCount }-斋謥
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber }-炸 { $pagesCount })-斋謥
+pdfjs-zoom-out-button =
+    .title = 論崭謩謤铡謥斩榨宅
+pdfjs-zoom-out-button-label = 論崭謩謤铡謥斩榨宅
+pdfjs-zoom-in-button =
+    .title = 越崭辗崭謤铡謥斩榨宅
+pdfjs-zoom-in-button-label = 越崭辗崭謤铡謥斩榨宅
+pdfjs-zoom-select =
+    .title = 源斋湛铡謨崭窄崭謧沾
+pdfjs-presentation-mode-button =
+    .title = 员斩謥斩榨宅 諉榨謤寨铡盏铡謥沾铡斩 榨詹铡斩铡寨斋斩
+pdfjs-presentation-mode-button-label = 諉榨謤寨铡盏铡謥沾铡斩 榨詹铡斩铡寨
+pdfjs-open-file-button =
+    .title = 圆铡謥榨宅 謫铡盏宅
+pdfjs-open-file-button-label = 圆铡謥榨宅
+pdfjs-print-button =
+    .title = 諒蘸榨宅
+pdfjs-print-button-label = 諒蘸榨宅
+pdfjs-save-button =
+    .title = 諍铡瞻榨宅
+pdfjs-save-button-label = 諍铡瞻榨宅
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 諉榨謤闸榨占斩榨宅
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 諉榨謤闸榨占斩榨宅
+pdfjs-bookmark-button =
+    .title = 愿斩诈铡謥斋寨 乍栈 (源斋湛榨宅 URL-炸 炸斩诈铡謥斋寨 乍栈斋謥)
+pdfjs-bookmark-button-label = 愿斩诈铡謥斋寨 乍栈
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 猿崭謤债斋謩斩榨謤
+pdfjs-tools-button-label = 猿崭謤债斋謩斩榨謤
+pdfjs-first-page-button =
+    .title = 员斩謥斩榨宅 铡占铡栈斋斩 乍栈斋斩
+pdfjs-first-page-button-label = 员斩謥斩榨宅 铡占铡栈斋斩 乍栈斋斩
+pdfjs-last-page-button =
+    .title = 员斩謥斩榨宅 站榨謤栈斋斩 乍栈斋斩
+pdfjs-last-page-button-label = 员斩謥斩榨宅 站榨謤栈斋斩 乍栈斋斩
+pdfjs-page-rotate-cw-button =
+    .title = 諍湛湛榨宅 炸战湛 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+pdfjs-page-rotate-cw-button-label = 諍湛湛榨宅 炸战湛 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+pdfjs-page-rotate-ccw-button =
+    .title = 諍湛湛榨宅 瞻铡寨铡占铡寨 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+pdfjs-page-rotate-ccw-button-label = 諍湛湛榨宅 瞻铡寨铡占铡寨 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+pdfjs-cursor-text-select-tool-button =
+    .title = 談斋铡謥斩榨宅 眨謤崭謧盏诈 炸斩湛謤榨宅崭謧 眨崭謤债斋謩炸
+pdfjs-cursor-text-select-tool-button-label = 猿謤崭謧盏诈炸 炸斩湛謤榨宅崭謧 眨崭謤债斋謩
+pdfjs-cursor-hand-tool-button =
+    .title = 談斋铡謥斩榨宅 諄榨占謩斋 眨崭謤债斋謩炸
+pdfjs-cursor-hand-tool-button-label = 諄榨占謩斋 眨崭謤债斋謩
+pdfjs-scroll-page-button =
+    .title = 諘眨湛铡眨崭謤债榨謩 乍栈斋 眨宅崭謤崭謧沾炸
+pdfjs-scroll-page-button-label = 苑栈斋 眨宅崭謤崭謧沾
+pdfjs-scroll-vertical-button =
+    .title = 諘眨湛铡眨崭謤债榨宅 崭謧詹詹铡瞻铡盏铡謥 崭宅崭謤崭謧沾
+pdfjs-scroll-vertical-button-label = 請謧詹詹铡瞻铡盏铡謥 崭宅崭謤崭謧沾
+pdfjs-scroll-horizontal-button =
+    .title = 諘眨湛铡眨崭謤债榨宅 瞻崭謤斋咋崭斩铡寨铡斩 崭宅崭謤崭謧沾
+pdfjs-scroll-horizontal-button-label = 諃崭謤斋咋崭斩铡寨铡斩 崭宅崭謤崭謧沾
+pdfjs-scroll-wrapped-button =
+    .title = 諘眨湛铡眨崭謤债榨宅 謨铡诈铡诈站铡债 崭宅崭謤崭謧沾
+pdfjs-scroll-wrapped-button-label = 論铡诈铡诈站铡债 崭宅崭謤崭謧沾
+pdfjs-spread-none-button =
+    .title = 談斋 沾斋铡謥榨謩 乍栈斋 站榨謤铡债铡债寨榨謤斋斩
+pdfjs-spread-none-button-label = 諌寨铡 站榨謤铡债铡债寨榨謤
+pdfjs-spread-odd-button =
+    .title = 談斋铡謥榨謩 乍栈斋 站榨謤铡债铡债寨榨謤斋斩 战寨战榨宅崭站諠 寨榨斩湛 瞻铡沾铡謤铡寨铡宅站铡债 乍栈榨謤崭站
+pdfjs-spread-odd-button-label = 钥榨斩湛 站榨謤铡债铡债寨榨謤
+pdfjs-spread-even-button =
+    .title = 談斋铡謥榨謩 乍栈斋 站榨謤铡债铡债寨榨謤斋斩 战寨战榨宅崭站諠 咋崭謧盏眨 瞻铡沾铡謤铡寨铡宅站铡债 乍栈榨謤崭站
+pdfjs-spread-even-button-label = 远崭謧盏眨 站榨謤铡债铡债寨榨謤
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 論铡战湛铡诈詹诈斋 瞻铡湛寨崭謧诈盏崭謧斩斩榨謤炸鈥�
+pdfjs-document-properties-button-label = 論铡战湛铡诈詹诈斋 瞻铡湛寨崭謧诈盏崭謧斩斩榨謤炸鈥�
+pdfjs-document-properties-file-name = 諙铡盏宅斋 铡斩崭謧斩炸.
+pdfjs-document-properties-file-size = 諙铡盏宅斋 展铡謨炸.
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 钥圆 ({ $b } 闸铡盏诈)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 談圆 ({ $b } 闸铡盏诈)
+pdfjs-document-properties-title = 諑榨謤斩铡眨斋謤.
+pdfjs-document-properties-author = 諃榨詹斋斩铡寨鈥�
+pdfjs-document-properties-subject = 諑榨謤斩铡眨斋謤.
+pdfjs-document-properties-keywords = 諃斋沾斩铡闸铡占.
+pdfjs-document-properties-creation-date = 諐湛榨詹债榨宅崭謧 铡沾战铡诈斋站炸.
+pdfjs-document-properties-modification-date = 論崭謨崭窄榨宅崭謧 铡沾战铡诈斋站炸.
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 諐湛榨詹债崭詹.
+pdfjs-document-properties-producer = PDF-斋 瞻榨詹斋斩铡寨炸.
+pdfjs-document-properties-version = PDF-斋 湛铡謤闸榨謤铡寨炸.
+pdfjs-document-properties-page-count = 苑栈榨謤斋 謩铡斩铡寨炸.
+pdfjs-document-properties-page-size = 苑栈斋 展铡謨炸.
+pdfjs-document-properties-page-size-unit-inches = 崭謧沾
+pdfjs-document-properties-page-size-unit-millimeters = 沾沾
+pdfjs-document-properties-page-size-orientation-portrait = 崭謧詹詹铡毡斋眨
+pdfjs-document-properties-page-size-orientation-landscape = 瞻崭謤斋咋崭斩铡寨铡斩
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 諉铡沾铡寨
+pdfjs-document-properties-page-size-name-legal = 諘謤斋斩铡寨铡斩
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 员謤铡眨 站榨闸 栅斋湛崭謧沾鈥�
+pdfjs-document-properties-linearized-yes = 员盏崭
+pdfjs-document-properties-linearized-no = 請展
+pdfjs-document-properties-close-button = 論铡寨榨宅
+
+## Print
+
+pdfjs-print-progress-message = 諉铡窄铡蘸铡湛謤铡战湛崭謧沾 乍 謨铡战湛铡诈崭謧詹诈炸 湛蘸榨宅崭謧斩...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 諌榨詹铡謤寨榨宅
+pdfjs-printing-not-supported = 远眨崭謧辗铡謥崭謧沾. 諒蘸榨宅炸 铡沾闸崭詹栈崭謧诈盏铡沾闸 展斋 铡栈铡寨謥站崭謧沾 栅斋湛铡謤寨斋展斋 寨崭詹沾斋謥謮
+pdfjs-printing-not-ready = 远眨崭謧辗铡謥崭謧沾. PDF-炸 铡沾闸崭詹栈崭謧诈盏铡沾闸 展斋 闸榨占斩铡站崭謤站榨宅 湛蘸榨宅崭謧 瞻铡沾铡謤:
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 圆铡謥榨宅/論铡寨榨宅 寨崭詹铡眨崭湛斋斩
+pdfjs-toggle-sidebar-notification-button =
+    .title = 論崭窄铡謤寨榨宅 钥崭詹铡眨崭湛斋斩 (謨铡战湛铡诈崭謧詹诈炸 蘸铡謤崭謧斩铡寨崭謧沾 乍 崭謧謤站铡眨斋债/寨謥崭謤栅斩榨謤)
+pdfjs-toggle-sidebar-button-label = 圆铡謥榨宅/論铡寨榨宅 寨崭詹铡眨崭湛斋斩
+pdfjs-document-outline-button =
+    .title = 諔崭謧謥铡栅謤榨宅 謨铡战湛铡诈詹诈斋 崭謧謤站铡眨斋债炸 (寨謤寨斩铡寨斋 战榨詹沾榨謩諠 沾斋铡站崭謤斩榨謤炸 炸斩栅铡謤毡铡寨榨宅崭謧/寨崭债寨榨宅崭謧 瞻铡沾铡謤)
+pdfjs-document-outline-button-label = 論铡战湛铡诈詹诈斋 闸崭站铡斩栅铡寨崭謧诈盏崭謧斩炸
+pdfjs-attachments-button =
+    .title = 諔崭謧謥铡栅謤榨宅 寨謥崭謤栅斩榨謤炸
+pdfjs-attachments-button-label = 钥謥崭謤栅斩榨謤
+pdfjs-layers-button =
+    .title = 諔崭謧謥铡栅謤榨宅 辗榨謤湛榨謤炸 (寨謤寨斩铡寨斋 战榨詹沾榨謩 闸崭宅崭謤 辗榨謤湛榨謤炸 战寨咋闸斩铡寨铡斩 站斋粘铡寨斋斩 站榨謤铡寨铡斩眨斩榨宅崭謧 瞻铡沾铡謤)
+pdfjs-layers-button-label = 諊榨謤湛榨謤
+pdfjs-thumbs-button =
+    .title = 諔崭謧謥铡栅謤榨宅 沾铡斩謤铡蘸铡湛寨榨謤炸
+pdfjs-thumbs-button-label = 談铡斩謤铡蘸铡湛寨榨謤炸
+pdfjs-current-outline-item-button =
+    .title = 猿湛榨謩 炸斩诈铡謥斋寨 崭謧謤站铡眨债铡盏斋斩 湛铡謤謤炸
+pdfjs-current-outline-item-button-label = 愿斩诈铡謥斋寨 崭謧謤站铡眨债铡盏斋斩 湛铡謤謤
+pdfjs-findbar-button =
+    .title = 猿湛斩榨宅 謨铡战湛铡诈詹诈崭謧沾
+pdfjs-findbar-button-label = 請謤崭斩崭謧沾
+pdfjs-additional-layers = 约謤铡謥崭謧謥斋展 辗榨謤湛榨謤
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 苑栈炸 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 苑栈斋 沾铡斩謤铡蘸铡湛寨榨謤炸 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 請謤崭斩崭謧沾
+    .placeholder = 猿湛斩榨宅 謨铡战湛铡诈詹诈崭謧沾...
+pdfjs-find-previous-button =
+    .title = 猿湛斩榨宅 铡斩謤铡瞻铡盏湛崭謧诈盏铡斩 斩铡窄崭謤栅 瞻铡斩栅斋蘸崭謧沾炸
+pdfjs-find-previous-button-label = 諉铡窄崭謤栅炸
+pdfjs-find-next-button =
+    .title = 猿湛斋謤 铡謤湛铡瞻铡盏湛崭謧诈盏铡斩 瞻铡栈崭謤栅 瞻铡斩栅斋蘸崭謧沾炸
+pdfjs-find-next-button-label = 諃铡栈崭謤栅炸
+pdfjs-find-highlight-checkbox = 猿崭謧斩铡斩辗榨宅 闸崭宅崭謤炸
+pdfjs-find-match-case-checkbox-label = 談榨债(謨崭謩謤)铡湛铡占 瞻铡辗站斋 铡占斩榨宅
+pdfjs-find-match-diacritics-checkbox-label = 諃铡沾铡蘸铡湛铡战窄铡斩榨謥斩榨宅 湛铡謤闸榨謤斋展斩榨謤炸
+pdfjs-find-entire-word-checkbox-label = 员沾闸崭詹栈 闸铡占榨謤炸
+pdfjs-find-reached-top = 諃铡战榨宅 榨謩 謨铡战湛铡诈詹诈斋 站榨謤謬斋斩, 寨辗铡謤崭謧斩铡寨站斋 斩榨謤謩謬斋謥
+pdfjs-find-reached-bottom = 諃铡战榨宅 榨謩 謨铡战湛铡诈詹诈斋 站榨謤栈斋斩, 寨辗铡謤崭謧斩铡寨站斋 站榨謤謬斋謥
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current }諠 { $total } 瞻铡沾炸斩寨斩崭謧沾斋謥
+       *[other] { $current } of { $total } 瞻铡沾炸斩寨斩崭謧沾斩榨謤斋謥
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 员站榨宅斋 謩铡斩 { $limit } 瞻铡沾炸斩寨斩崭謧沾
+       *[other] 员站榨宅斋 謩铡斩 { $limit } 瞻铡沾炸斩寨斩崭謧沾斩榨謤
+    }
+pdfjs-find-not-found = 员謤湛铡瞻铡盏湛崭謧诈盏崭謧斩炸 展眨湛斩站榨謥
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 苑栈斋 宅铡盏斩謩炸
+pdfjs-page-scale-fit = 諄眨榨宅 乍栈炸
+pdfjs-page-scale-auto = 曰斩謩斩铡辗窄铡湛
+pdfjs-page-scale-actual = 曰謤铡寨铡斩 展铡謨炸
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 苑栈 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 諐窄铡宅諠 PDF 謫铡盏宅炸 闸铡謥榨宅斋战謮
+pdfjs-invalid-file-error = 諐窄铡宅 寨铡沾 站斩铡战站铡债 PDF 謫铡盏宅:
+pdfjs-missing-file-error = PDF 謫铡盏宅炸 闸铡謥铡寨铡盏崭謧沾 乍:
+pdfjs-unexpected-response-error = 諐蘸铡战铡謤寨斋展斋 铡斩战蘸铡战榨宅斋 蘸铡湛铡战窄铡斩:
+pdfjs-rendering-error = 諐窄铡宅諠 乍栈炸 战湛榨詹债榨宅斋战:
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 跃铡斩崭诈崭謧诈盏崭謧斩]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 談崭謧湛謩铡眨謤榨謩 PDF-斋 眨铡詹湛斩铡闸铡占炸:
+pdfjs-password-invalid = 猿铡詹湛斩铡闸铡占炸 战窄铡宅 乍: 钥謤寨斋斩 謨崭謤毡榨謩:
+pdfjs-password-ok-button = 约铡站
+pdfjs-password-cancel-button = 諌榨詹铡謤寨榨宅
+pdfjs-web-fonts-disabled = 諑榨闸-湛铡占铡湛榨战铡寨斩榨謤炸 铡斩栈铡湛站铡债 榨斩. 瞻斩铡謤铡站崭謤 展乍 謪眨湛铡眨崭謤债榨宅 斩榨謤寨铡占崭謧謥站铡债 PDF 湛铡占铡湛榨战铡寨斩榨謤炸:
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 猿謤站铡债謩
+pdfjs-editor-color-picker-free-text-input =
+    .title = 論崭窄榨宅 湛榨謩战湛斋 眨崭謧盏斩炸
+pdfjs-editor-free-text-button-label = 猿謤站铡债謩
+pdfjs-editor-ink-button =
+    .title = 諉寨铡謤榨宅
+pdfjs-editor-color-picker-ink-input =
+    .title = 論崭窄榨宅 斩寨铡謤榨宅崭謧 眨崭謧盏斩炸
+pdfjs-editor-ink-button-label = 諉寨铡謤榨宅
+pdfjs-editor-stamp-button =
+    .title = 諃铡站榨宅榨宅 寨铡沾 窄沾闸铡眨謤榨宅 蘸铡湛寨榨謤斩榨謤
+pdfjs-editor-stamp-button-label = 諃铡站榨宅榨宅 寨铡沾 窄沾闸铡眨謤榨宅 蘸铡湛寨榨謤斩榨謤
+pdfjs-editor-highlight-button =
+    .title = 猿崭謧斩铡斩辗崭謧沾
+pdfjs-editor-highlight-button-label = 猿崭謧斩铡斩辗崭謧沾
+pdfjs-highlight-floating-button1 =
+    .title = 猿崭謧斩铡斩辗崭謧沾
+    .aria-label = 猿崭謧斩铡斩辗崭謧沾
+pdfjs-highlight-floating-button-label = 猿崭謧斩铡斩辗崭謧沾
+pdfjs-comment-floating-button =
+    .title = 談榨寨斩铡闸铡斩崭謧诈盏崭謧斩
+    .aria-label = 談榨寨斩铡闸铡斩崭謧诈盏崭謧斩
+pdfjs-comment-floating-button-label = 談榨寨斩铡闸铡斩崭謧诈盏崭謧斩
+pdfjs-editor-signature-button =
+    .title = 员站榨宅铡謥斩榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩
+pdfjs-editor-signature-button-label = 员站榨宅铡謥斩榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 猿崭謧斩铡斩辗榨宅 窄沾闸铡眨斋謤炸
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 諉寨铡謤榨宅崭謧 窄沾闸铡眨斋謤
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 諐湛崭謤铡眨謤崭謧诈盏铡斩 窄沾闸铡眨斋謤諠 { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 諍铡湛寨榨謤斋 窄沾闸铡眨斋謤
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 諃榨占铡謥斩榨宅 斩寨铡謤崭謧沾炸
+pdfjs-editor-remove-freetext-button =
+    .title = 諃榨占铡謥斩榨宅 眨謤站铡债謩炸
+pdfjs-editor-remove-stamp-button =
+    .title = 諃榨占铡謥斩榨宅 蘸铡湛寨榨謤炸
+pdfjs-editor-remove-highlight-button =
+    .title = 諃榨占铡謥斩榨宅 眨崭謧斩铡斩辗崭謧沾炸
+pdfjs-editor-remove-signature-button =
+    .title = 諃榨占铡謥斩榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩炸
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 猿崭謧盏斩
+pdfjs-editor-free-text-size-input = 諌铡謨
+pdfjs-editor-ink-color-input = 猿崭謧盏斩
+pdfjs-editor-ink-thickness-input = 諃铡战湛崭謧诈盏崭謧斩
+pdfjs-editor-ink-opacity-input = 談眨崭謧诈盏崭謧斩
+pdfjs-editor-stamp-add-image-button =
+    .title = 諃铡站榨宅榨宅 蘸铡湛寨榨謤
+pdfjs-editor-stamp-add-image-button-label = 諃铡站榨宅榨宅 蘸铡湛寨榨謤
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 諃铡战湛崭謧诈盏崭謧斩
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 論崭窄榨宅 瞻铡战湛崭謧诈盏崭謧斩炸諠 湛榨謩战湛斋謥 闸铡謥斋 铡盏宅 湛铡謤謤榨謤 眨崭謧斩铡斩辗榨宅斋战
+pdfjs-editor-add-signature-container =
+    .aria-label = 諐湛崭謤铡眨謤崭謧诈盏铡斩 寨铡占铡站铡謤沾铡斩 湛铡謤謤榨謤 謬 蘸铡瞻站铡债 战湛崭謤铡眨謤崭謧诈盏崭謧斩斩榨謤
+pdfjs-editor-signature-add-signature-button =
+    .title = 员站榨宅铡謥斩榨宅 斩崭謤 战湛崭謤铡眨謤崭謧诈盏崭謧斩
+pdfjs-editor-signature-add-signature-button-label = 员站榨宅铡謥斩榨宅 斩崭謤 战湛崭謤铡眨謤崭謧诈盏崭謧斩
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 諍铡瞻站铡债 战湛崭謤铡眨謤崭謧诈盏崭謧斩諠 { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 猿謤站铡债謩斋 窄沾闸铡眨斋謤
+    .default-content = 諐寨战榨謩 沾崭謧湛謩铡眨謤榨宅...
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 談榨寨斩铡闸铡斩崭謧诈盏崭謧斩
+       *[other] 談榨寨斩铡闸铡斩崭謧诈盏崭謧斩斩榨謤
+    }
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 諒榨战斩崭諡謧沾 榨謩 斋斩展-崭謤 崭謧辗铡眨謤铡站 闸铡斩謮 猿崭謧斩铡斩辗榨謩 铡盏斩 謬 诈崭詹榨謩 沾榨寨斩铡闸铡斩崭謧诈盏崭謧斩謮
+pdfjs-editor-comments-sidebar-no-comments-link = 曰沾铡斩铡宅 铡站榨宅斋斩
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 越沾闸铡眨謤榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩炸
+pdfjs-editor-alt-text-dialog-label = 愿斩湛謤榨謩 湛铡占铡湛榨战铡寨炸
+pdfjs-editor-alt-text-dialog-description = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 湛榨謩战湛炸 (alternative text) 謪眨斩崭謧沾 乍, 榨謤闸 沾铡謤栅斋寨 展榨斩 寨铡謤崭詹铡斩崭謧沾 湛榨战斩榨宅 蘸铡湛寨榨謤炸 寨铡沾 榨謤闸 铡盏斩 展斋 闸榨占斩站崭謧沾謮
+pdfjs-editor-alt-text-add-description-label = 諃铡站榨宅榨宅 斩寨铡謤铡眨謤崭謧诈盏崭謧斩
+pdfjs-editor-alt-text-add-description-description = 諄眨湛榨謩 眨謤榨宅 1-2 斩铡窄铡栅铡战崭謧诈盏崭謧斩, 崭謤崭斩謩 斩寨铡謤铡眨謤崭謧沾 榨斩 诈榨沾铡斩, 沾斋栈铡站铡盏謤炸 寨铡沾 眨崭謤债崭詹崭謧诈盏崭謧斩斩榨謤炸謮
+pdfjs-editor-alt-text-mark-decorative-label = 諉辗榨宅 崭謤蘸榨战 栅榨寨崭謤铡湛斋站
+pdfjs-editor-alt-text-mark-decorative-description = 諐铡 謪眨湛铡眨崭謤债站崭謧沾 乍 栅榨寨崭謤铡湛斋站 蘸铡湛寨榨謤斩榨謤斋 瞻铡沾铡謤, 斋斩展蘸斋战斋謩 榨斩 榨咋謤铡眨债榨謤炸 寨铡沾 栈謤铡斩斋辗榨謤炸謮
+pdfjs-editor-alt-text-cancel-button = 諌榨詹铡謤寨榨宅
+pdfjs-editor-alt-text-save-button = 諍铡瞻榨宅
+pdfjs-editor-alt-text-decorative-tooltip = 諉辗榨宅 崭謤蘸榨战 栅榨寨崭謤铡湛斋站
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 諘謤斋斩铡寨諠 芦談斋 榨謤斋湛铡战铡謤栅 斩战湛崭謧沾 乍 战榨詹铡斩斋 辗崭謧謤栈諠 崭謧湛榨宅崭謧禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 諑榨謤斋斩 毡铡窄 铡斩寨盏崭謧斩諠 展铡謨铡謨崭窄榨宅
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 諑榨謤謬斋 沾榨栈湛榨詹崭謧沾諠 展铡謨铡謨崭窄榨宅
+pdfjs-editor-resizer-top-right =
+    .aria-label = 諑榨謤斋斩 毡铡窄 铡斩寨盏崭謧斩諠 展铡謨铡謨崭窄榨宅
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 談榨栈湛榨詹斋 铡栈 寨崭詹沾崭謧沾諠 展铡謨铡謨崭窄榨宅
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 諑榨謤斋斩 毡铡窄 铡斩寨盏崭謧斩諠 展铡謨铡謨崭窄榨宅
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 諑榨謤謬斋 沾榨栈湛榨詹崭謧沾諠 展铡謨铡謨崭窄榨宅
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 諑榨謤斋斩 毡铡窄 铡斩寨盏崭謧斩諠 展铡謨铡謨崭窄榨宅
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 談榨栈湛榨詹斋 毡铡窄 寨崭詹沾崭謧沾諠 展铡謨铡謨崭窄榨宅
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 猿崭謧斩铡斩辗沾铡斩 眨崭謧盏斩
+pdfjs-editor-colorpicker-button =
+    .title = 論崭窄榨宅 眨崭謧盏斩炸
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 猿崭謧盏斩榨謤斋 炸斩湛謤崭謧诈盏崭謧斩
+pdfjs-editor-colorpicker-yellow =
+    .title = 源榨詹斋斩
+pdfjs-editor-colorpicker-green =
+    .title = 钥铡斩铡展
+pdfjs-editor-colorpicker-blue =
+    .title = 钥铡蘸崭謧盏湛
+pdfjs-editor-colorpicker-pink =
+    .title = 諑铡謤栅铡眨崭謧盏斩
+pdfjs-editor-colorpicker-red =
+    .title = 钥铡謤沾斋謤
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 諔崭謧謥铡栅謤榨宅 闸崭宅崭謤炸
+pdfjs-editor-highlight-show-all-button =
+    .title = 諔崭謧謥铡栅謤榨宅 闸崭宅崭謤炸
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 越沾闸铡眨謤榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 湛榨謩战湛炸 (蘸铡湛寨榨謤斋 斩寨铡謤铡眨謤崭謧诈盏崭謧斩炸)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 员站榨宅铡謥斩榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩 (蘸铡湛寨榨謤斋 斩寨铡謤铡眨謤崭謧诈盏崭謧斩)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 猿謤榨謩 毡榨謤 斩寨铡謤铡眨謤崭謧诈盏崭謧斩斩 铡盏战湛榨詹鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 钥铡謤粘 斩寨铡謤铡眨謤崭謧诈盏崭謧斩 斩謤铡斩謥 瞻铡沾铡謤, 崭站謩榨謤 展榨斩 寨铡謤崭詹 湛榨战斩榨宅 蘸铡湛寨榨謤炸 寨铡沾 榨謤闸 蘸铡湛寨榨謤炸 展斋 闸榨占斩站崭謧沾謮
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 员盏战 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 湛榨謩战湛炸 战湛榨詹债站榨宅 乍 斋斩謩斩铡辗窄铡湛 謬 寨铡謤崭詹 乍 战窄铡宅 宅斋斩榨宅謮
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 曰沾铡斩铡宅 铡站榨宅斋斩
+pdfjs-editor-new-alt-text-create-automatically-button-label = 曰斩謩斩铡辗窄铡湛 战湛榨詹债榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩
+pdfjs-editor-new-alt-text-not-now-button = 請展 瞻斋沾铡
+pdfjs-editor-new-alt-text-error-title = 諃斩铡謤铡站崭謤 展乍 斋斩謩斩铡辗窄铡湛 战湛榨詹债榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩
+pdfjs-editor-new-alt-text-error-description = 越斩栅謤崭謧沾 榨斩謩 眨謤榨宅 毡榨謤 战榨謨铡寨铡斩 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 湛榨謩战湛炸 寨铡沾 謨崭謤毡榨宅 寨謤寨斋斩 铡站榨宅斋 崭謧辗謮
+pdfjs-editor-new-alt-text-error-close-button = 論铡寨榨宅
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 諉榨謤闸榨占斩站崭謧沾 乍 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 铡瞻榨战湛铡寨铡斩 闸铡斩铡寨铡斩崭謧诈盏铡斩 沾崭栅榨宅炸 ({ $downloadedSize }諠 { $totalSize } 談圆-斋謥)
+    .aria-valuetext = 諉榨謤闸榨占斩站崭謧沾 乍 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 铡瞻榨战湛铡寨铡斩 闸铡斩铡寨铡斩崭謧诈盏铡斩 沾崭栅榨宅炸 ({ $downloadedSize }諠 { $totalSize } 談圆-斋謥)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斩 铡站榨宅铡謥站铡债 乍
+pdfjs-editor-new-alt-text-added-button-label = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斩 铡站榨宅铡謥站铡债 乍
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩炸 闸铡謥铡寨铡盏崭謧沾 乍
+pdfjs-editor-new-alt-text-missing-button-label = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩炸 闸铡謥铡寨铡盏崭謧沾 乍
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 諑榨謤铡斩铡盏榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩炸
+pdfjs-editor-new-alt-text-to-review-button-label = 諑榨謤铡斩铡盏榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩炸
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 諐湛榨詹债站榨宅 乍 斋斩謩斩铡辗窄铡湛站諠 { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 諍铡湛寨榨謤斋 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 寨铡謤眨铡站崭謤崭謧沾斩榨謤
+pdfjs-image-alt-text-settings-button-label = 諍铡湛寨榨謤斋 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 寨铡謤眨铡站崭謤崭謧沾斩榨謤
+pdfjs-editor-alt-text-settings-dialog-label = 諍铡湛寨榨謤斋 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 寨铡謤眨铡站崭謤崭謧沾斩榨謤
+pdfjs-editor-alt-text-settings-automatic-title = 曰斩謩斩铡辗窄铡湛 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩
+pdfjs-editor-alt-text-settings-create-model-button-label = 曰斩謩斩铡辗窄铡湛 战湛榨詹债榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩
+pdfjs-editor-alt-text-settings-create-model-description = 钥铡謤粘 斩寨铡謤铡眨謤崭謧诈盏崭謧斩 斩謤铡斩謥 瞻铡沾铡謤, 崭站謩榨謤 展榨斩 寨铡謤崭詹 湛榨战斩榨宅 蘸铡湛寨榨謤炸 寨铡沾 榨謤闸 蘸铡湛寨榨謤炸 展斋 闸榨占斩站崭謧沾謮
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 铡謤瞻榨战湛铡寨铡斩 闸铡斩铡寨铡斩崭謧诈盏铡斩 沾崭栅榨宅 ({ $totalSize } 談圆)
+pdfjs-editor-alt-text-settings-ai-model-description = 员辗窄铡湛崭謧沾 乍 湛榨詹铡盏斩崭謤榨斩 毡榨謤 战铡謤謩斋 站謤铡, 崭謤蘸榨战咋斋 毡榨謤 湛站盏铡宅斩榨謤炸 沾斩铡斩 眨铡詹湛斩斋: 諍铡瞻铡斩栈站崭謧沾 乍 斋斩謩斩铡辗窄铡湛 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 瞻铡沾铡謤:
+pdfjs-editor-alt-text-settings-delete-model-button = 諎斩栈榨宅
+pdfjs-editor-alt-text-settings-download-model-button = 諉榨謤闸榨占斩榨宅
+pdfjs-editor-alt-text-settings-downloading-model-button = 諉榨謤闸榨占斩站崭謧沾 乍鈥�
+pdfjs-editor-alt-text-settings-editor-title = 员盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 窄沾闸铡眨斋謤
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 諍铡湛寨榨謤 铡站榨宅铡謥斩榨宅斋战 铡斩沾斋栈铡蘸榨战 謥崭謧謥铡栅謤榨宅 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩斋 窄沾闸铡眨斋謤炸
+pdfjs-editor-alt-text-settings-show-dialog-description = 諘眨斩崭謧沾 乍  瞻铡沾崭咋站榨宅, 崭謤 毡榨謤 闸崭宅崭謤 蘸铡湛寨榨謤斩榨謤斩 崭謧斩榨斩 铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩謮
+pdfjs-editor-alt-text-settings-close-button = 論铡寨榨宅
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 猿崭謧斩铡斩辗崭謧沾炸 铡站榨宅铡謥站榨宅 乍
+pdfjs-editor-freetext-added-alert = 猿謤站铡债謩炸 铡站榨宅铡謥站榨宅 乍
+pdfjs-editor-ink-added-alert = 諉寨铡謤崭謧沾炸 铡站榨宅铡謥站榨宅 乍
+pdfjs-editor-stamp-added-alert = 諍铡湛寨榨謤斩 铡站榨宅铡謥站铡债 乍
+pdfjs-editor-signature-added-alert = 諐湛崭謤铡眨謤崭謧诈盏崭謧斩斩 铡站榨宅铡謥站铡债 乍
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 猿崭謧斩铡斩辗崭謧沾炸 瞻榨占铡謥站铡债 乍
+pdfjs-editor-undo-bar-message-freetext = 猿謤站铡债謩炸 瞻榨占铡謥站榨宅 乍
+pdfjs-editor-undo-bar-message-ink = 諉寨铡謤站铡债炸 瞻榨占铡謥站榨宅 乍
+pdfjs-editor-undo-bar-message-stamp = 諍铡湛寨榨謤炸 瞻榨占铡謥站榨宅 乍
+pdfjs-editor-undo-bar-message-signature = 諐湛崭謤铡眨謤崭謧诈盏崭謧斩炸 瞻榨占铡謥站铡债 乍
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 沾榨寨斩铡闸铡斩崭謧诈盏崭謧斩炸 瞻榨占铡謥站榨宅 乍
+       *[other] { $count } 沾榨寨斩铡闸铡斩崭謧诈盏崭謧斩斩榨謤炸 瞻榨占铡謥站榨宅 榨斩
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 諃榨湛铡謤寨榨宅
+pdfjs-editor-undo-bar-undo-button-label = 諃榨湛铡謤寨榨宅
+pdfjs-editor-undo-bar-close-button =
+    .title = 論铡寨榨宅
+pdfjs-editor-undo-bar-close-button-label = 論铡寨榨宅
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 员盏战 盏崭謧謤铡瞻铡湛寨崭謧诈盏崭謧斩炸 瞻斩铡謤铡站崭謤崭謧诈盏崭謧斩 乍 湛铡宅斋战 謪眨湛站崭詹斋斩 战湛榨詹债榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩諠 PDF 謨铡战湛铡诈詹诈崭謧沾 铡站榨宅铡謥斩榨宅崭謧 瞻铡沾铡謤: 諘眨湛站崭詹炸 寨铡謤崭詹 乍 窄沾闸铡眨謤榨宅 铡斩崭謧斩炸 (崭謤炸 斩铡謬 债铡占铡盏崭謧沾 乍 崭謤蘸榨战 alt 湛榨謩战湛) 謬 宅謤铡謥崭謧謥斋展 蘸铡瞻榨宅 铡盏斩諠 瞻榨湛铡眨铡 謪眨湛铡眨崭謤债沾铡斩 瞻铡沾铡謤:
+pdfjs-editor-add-signature-dialog-title = 员站榨宅铡謥斩榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 諒榨战铡寨
+    .title = 諒榨战铡寨
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 諉寨铡謤榨宅
+    .title = 諉寨铡謤榨宅
+pdfjs-editor-add-signature-image-button = 諍铡湛寨榨謤
+    .title = 諍铡湛寨榨謤
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 談崭謧湛謩铡眨謤榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩
+    .placeholder = 談崭謧湛謩铡眨謤榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩
+pdfjs-editor-add-signature-draw-placeholder = 諉寨铡謤榨謩 毡榨謤 战湛崭謤铡眨謤崭謧诈盏崭謧斩炸
+pdfjs-editor-add-signature-draw-thickness-range-label = 諃铡战湛崭謧诈盏崭謧斩
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 諉寨铡謤榨宅崭謧 瞻铡战湛崭謧诈盏崭謧斩炸諠 { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 諗铡辗榨謩 謫铡盏宅炸 铡盏战湛榨詹諠 站榨謤闸榨占斩榨宅崭謧 瞻铡沾铡謤
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 钥铡沾 炸斩湛謤榨謩 蘸铡湛寨榨謤斋 謫铡盏宅炸
+       *[other] 钥铡沾 炸斩湛謤榨謩 蘸铡湛寨榨謤斋 謫铡盏宅榨謤炸
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 諉寨铡謤铡眨謤崭謧诈盏崭謧斩 (铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩)
+pdfjs-editor-add-signature-description-input =
+    .title = 諉寨铡謤铡眨謤崭謧诈盏崭謧斩 (铡盏宅炸斩湛謤铡斩謩铡盏斋斩 眨謤站铡债謩)
+pdfjs-editor-add-signature-description-default-when-drawing = 諐湛崭謤铡眨謤崭謧诈盏崭謧斩
+pdfjs-editor-add-signature-clear-button-label = 談铡謩謤榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩炸
+pdfjs-editor-add-signature-clear-button =
+    .title = 談铡謩謤榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩炸
+pdfjs-editor-add-signature-save-checkbox = 諍铡瞻榨宅 战湛崭謤铡眨謤崭謧诈盏崭謧斩炸
+pdfjs-editor-add-signature-save-warning-message = 源崭謧謩 瞻铡战榨宅 榨謩 蘸铡瞻蘸铡斩站铡债 战湛崭謤铡眨謤崭謧诈盏崭謧斩斩榨謤斋 5 战铡瞻沾铡斩铡展铡謨斋斩謮 諃榨占铡謥謤榨謩 沾榨寨炸諠 铡站榨宅斋斩 蘸铡瞻榨宅崭謧 瞻铡沾铡謤謮
+pdfjs-editor-add-signature-image-upload-error-title = 諌瞻铡栈崭詹站榨謥 站榨謤闸榨占斩榨宅 蘸铡湛寨榨謤炸
+pdfjs-editor-add-signature-image-upload-error-description = 諐湛崭謧眨榨謩 毡榨謤 謥铡斩謥铡盏斋斩 寨铡蘸铡寨謥崭謧沾炸 寨铡沾 謨崭謤毡榨謩 沾榨寨 铡盏宅 蘸铡湛寨榨謤謮
+pdfjs-editor-add-signature-image-no-data-error-title = 员盏战 蘸铡湛寨榨謤炸 瞻斩铡謤铡站崭謤 展乍 站榨謤铡债榨宅 战湛崭謤铡眨謤崭謧诈盏铡斩
+pdfjs-editor-add-signature-image-no-data-error-description = 越斩栅謤崭謧沾 榨沾 謨崭謤毡榨謩 站榨謤闸榨占斩榨宅 铡盏宅 蘸铡湛寨榨謤謮
+pdfjs-editor-add-signature-error-close-button = 論铡寨榨宅
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 諌榨詹铡謤寨榨宅
+pdfjs-editor-add-signature-add-button = 员站榨宅铡謥斩榨宅
+pdfjs-editor-edit-signature-update-button = 怨铡謤沾铡謥斩榨宅
+
+##  Edit a comment dialog
+
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 员站榨宅铡謥斩榨宅 沾榨寨斩铡闸铡斩崭謧诈盏崭謧斩
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 员站榨宅铡謥斩榨宅
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 談崭謧湛謩铡眨謤榨謩 铡盏战湛榨詹鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 諌榨詹铡謤寨榨宅
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 员站榨宅铡謥斩榨宅 沾榨寨斩铡闸铡斩崭謧诈盏崭謧斩
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-views-manager-add-file-button =
+    .title = 员站榨宅铡謥斩榨宅 謫铡盏宅
+pdfjs-views-manager-add-file-button-label = 员站榨宅铡謥斩榨宅 謫铡盏宅
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 諃榨占铡謥斩榨宅 蘸铡瞻站铡债 战湛崭謤铡眨謤崭謧诈盏崭謧斩炸
+pdfjs-editor-delete-signature-button-label1 = 諃榨占铡謥斩榨宅 蘸铡瞻站铡债 战湛崭謤铡眨謤崭謧诈盏崭謧斩炸
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 越沾闸铡眨謤榨宅 斩寨铡謤铡眨謤崭謧诈盏崭謧斩炸
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 越沾闸铡眨謤榨宅 斩寨铡謤铡眨謤崭謧诈盏崭謧斩炸
diff --git a/public/pdfjs/web/locale/hye/viewer.ftl b/public/pdfjs/web/locale/hye/viewer.ftl
new file mode 100644
index 0000000..4625bfe
--- /dev/null
+++ b/public/pdfjs/web/locale/hye/viewer.ftl
@@ -0,0 +1,242 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 諉铡窄崭謤栅 乍栈
+pdfjs-previous-button-label = 諉铡窄崭謤栅炸
+pdfjs-next-button =
+    .title = 諈铡栈崭謤栅 乍栈
+pdfjs-next-button-label = 諈铡栈崭謤栅炸
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 乍栈
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount }-斋謥
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber }-炸 { $pagesCount })-斋謥
+pdfjs-zoom-out-button =
+    .title = 論崭謩謤铡謥斩榨宅
+pdfjs-zoom-out-button-label = 論崭謩謤铡謥斩榨宅
+pdfjs-zoom-in-button =
+    .title = 越崭辗崭謤铡謥斩榨宅
+pdfjs-zoom-in-button-label = 越崭辗崭謤铡謥斩榨宅
+pdfjs-zoom-select =
+    .title = 越崭辗崭謤铡謥崭謧沾
+pdfjs-presentation-mode-button =
+    .title = 员斩謥斩榨宅 斩榨謤寨铡盏铡謥沾铡斩 榨詹铡斩铡寨斋斩
+pdfjs-presentation-mode-button-label = 諉榨謤寨铡盏铡謥沾铡斩 榨詹铡斩铡寨
+pdfjs-open-file-button =
+    .title = 圆铡謥榨宅 斩斋辗謩炸
+pdfjs-open-file-button-label = 圆铡謥榨宅
+pdfjs-print-button =
+    .title = 諒蘸榨宅
+pdfjs-print-button-label = 諒蘸榨宅
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 猿崭謤债斋謩斩榨謤
+pdfjs-tools-button-label = 猿崭謤债斋謩斩榨謤
+pdfjs-first-page-button =
+    .title = 猿斩铡宅 栅乍蘸斋 铡占铡栈斋斩 乍栈
+pdfjs-first-page-button-label = 猿斩铡宅 栅乍蘸斋 铡占铡栈斋斩 乍栈
+pdfjs-last-page-button =
+    .title = 猿斩铡宅 栅乍蘸斋 站榨謤栈斋斩 乍栈
+pdfjs-last-page-button-label = 猿斩铡宅 栅乍蘸斋 站榨謤栈斋斩 乍栈
+pdfjs-page-rotate-cw-button =
+    .title = 諍湛湛榨宅 摘铡沾铡謥崭盏謥斋 战宅铡謩斋 崭謧詹詹崭謧诈榨铡沾闸
+pdfjs-page-rotate-cw-button-label = 諍湛湛榨宅 摘铡沾铡謥崭盏謥斋 战宅铡謩斋 崭謧詹詹崭謧诈榨铡沾闸
+pdfjs-page-rotate-ccw-button =
+    .title = 諍湛湛榨宅 摘铡沾铡謥崭盏謥斋 战宅铡謩斋 瞻铡寨铡占铡寨 崭謧詹詹崭謧诈榨铡沾闸
+pdfjs-page-rotate-ccw-button-label = 諍湛湛榨宅 摘铡沾铡謥崭盏謥斋 战宅铡謩斋 瞻铡寨铡占铡寨 崭謧詹詹崭謧诈榨铡沾闸
+pdfjs-cursor-text-select-tool-button =
+    .title = 談斋铡謥斩榨宅 眨謤崭盏诈 炸斩湛謤榨宅崭謧 眨崭謤债斋謩炸
+pdfjs-cursor-text-select-tool-button-label = 猿謤崭謧铡债謩 炸斩湛謤榨宅崭謧 眨崭謤债斋謩
+pdfjs-cursor-hand-tool-button =
+    .title = 談斋铡謥斩榨宅 毡榨占謩斋 眨崭謤债斋謩炸
+pdfjs-cursor-hand-tool-button-label = 諄榨占謩斋 眨崭謤债斋謩
+pdfjs-scroll-page-button =
+    .title = 员謧眨湛铡眨崭謤债榨宅 乍栈斋 崭宅崭謤崭謧沾
+pdfjs-scroll-page-button-label = 苑栈斋 崭宅崭謤崭謧沾
+pdfjs-scroll-vertical-button =
+    .title = 员謧眨湛铡眨崭謤债榨宅 崭謧詹詹铡瞻铡盏榨铡謥 崭宅崭謤崭謧沾
+pdfjs-scroll-vertical-button-label = 請謧詹詹铡瞻铡盏榨铡謥 崭宅崭謤崭謧沾
+pdfjs-scroll-horizontal-button =
+    .title = 员謧眨湛铡眨崭謤债榨宅 瞻崭謤斋咋崭斩铡寨铡斩 崭宅崭謤崭謧沾
+pdfjs-scroll-horizontal-button-label = 諃崭謤斋咋崭斩铡寨铡斩 崭宅崭謤崭謧沾
+pdfjs-scroll-wrapped-button =
+    .title = 员謧眨湛铡眨崭謤债榨宅 謨铡诈铡诈崭謧铡债 崭宅崭謤崭謧沾
+pdfjs-scroll-wrapped-button-label = 論铡诈铡诈崭謧铡债 崭宅崭謤崭謧沾
+pdfjs-spread-none-button =
+    .title = 談斋 沾斋铡謥乍謩 乍栈斋 寨崭斩湛榨謩战湛崭謧沾
+pdfjs-spread-none-button-label = 諌寨铡盏 寨崭斩湛榨謩战湛
+pdfjs-spread-odd-button =
+    .title = 談斋铡謥乍謩 乍栈斋 寨崭斩湛榨謩战湛斋斩 战寨战榨宅崭站諠 寨榨斩湛 瞻铡沾铡謤铡寨铡宅崭謧铡债 乍栈榨謤崭站
+pdfjs-spread-odd-button-label = 諒铡謤铡謧謤斋斩铡寨 寨崭斩湛榨謩战湛
+pdfjs-spread-even-button =
+    .title = 談斋铡謥乍謩 乍栈斋 寨崭斩湛榨謩战湛斋斩 战寨战榨宅崭站諠 咋崭盏眨 瞻铡沾铡謤铡寨铡宅崭謧铡债 乍栈榨謤崭站
+pdfjs-spread-even-button-label = 諃铡謧铡战铡謤 站榨謤铡债铡债寨榨謤
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 論铡战湛铡诈詹诈斋 瞻铡湛寨崭謧诈斋謧斩斩榨謤炸鈥�
+pdfjs-document-properties-button-label = 論铡战湛铡诈詹诈斋 盏铡湛寨崭謧诈斋謧斩斩榨謤炸鈥�
+pdfjs-document-properties-file-name = 諉斋辗謩斋 铡斩崭謧斩炸鈥�
+pdfjs-document-properties-file-size = 諉斋辗謩 展铡謨炸.
+pdfjs-document-properties-title = 諑榨謤斩铡眨斋謤
+pdfjs-document-properties-author = 諃榨詹斋斩铡寨鈥�
+pdfjs-document-properties-subject = 铡占铡謤寨铡盏
+pdfjs-document-properties-keywords = 諃斋沾斩铡闸铡占榨謤
+pdfjs-document-properties-creation-date = 諐湛榨詹债沾铡斩 铡沾战铡诈斋謧
+pdfjs-document-properties-modification-date = 論崭謨崭窄崭謧诈榨铡斩 铡沾战铡诈斋謧.
+pdfjs-document-properties-creator = 諐湛榨詹债崭詹
+pdfjs-document-properties-producer = PDF-斋 员謤湛铡栅謤崭詹炸.
+pdfjs-document-properties-version = PDF-斋 湛铡謤闸榨謤铡寨炸.
+pdfjs-document-properties-page-count = 苑栈榨謤斋 謩铡斩铡寨炸.
+pdfjs-document-properties-page-size = 苑栈斋 展铡謨炸.
+pdfjs-document-properties-page-size-unit-inches = 崭謧沾
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 崭謧詹詹铡毡斋眨
+pdfjs-document-properties-page-size-orientation-landscape = 瞻崭謤斋咋崭斩铡寨铡斩
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 諉铡沾铡寨
+pdfjs-document-properties-page-size-name-legal = 员謧謤斋斩铡寨铡斩
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 员謤铡眨 站榨闸 栅斋湛崭謧沾鈥�
+pdfjs-document-properties-linearized-yes = 员盏崭
+pdfjs-document-properties-linearized-no = 請展
+pdfjs-document-properties-close-button = 論铡寨榨宅
+
+## Print
+
+pdfjs-print-progress-message = 諉铡窄铡蘸铡湛謤铡战湛崭謧沾 乍 謨铡战湛铡诈崭謧詹诈炸 湛蘸榨宅崭謧斩鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 諌榨詹铡謤寨榨宅
+pdfjs-printing-not-supported = 远眨崭謧辗铡謥崭謧沾. 諒蘸榨宅炸 铡沾闸崭詹栈崭謧诈榨铡沾闸 展斋 铡栈铡寨謥崭謧崭謧沾 咋斩斩铡謤寨斋展斋 寨崭詹沾斋謥謮
+pdfjs-printing-not-ready = 远眨崭謧辗铡謥崭謧沾. PDF謯炸 铡沾闸崭詹栈崭謧诈榨铡沾闸 展斋 闸榨占斩铡謧崭謤崭謧榨宅 湛蘸榨宅崭謧 瞻铡沾铡謤謮
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 論崭窄铡謤寨榨宅 寨崭詹铡盏斋斩 站铡瞻铡斩铡寨炸
+pdfjs-toggle-sidebar-notification-button =
+    .title = 論崭窄铡斩栈铡湛榨宅 寨崭詹沾斩铡战斋謧斩炸 (謨铡战湛铡诈崭謧詹诈炸 蘸铡謤崭謧斩铡寨崭謧沾 乍 崭謧謤崭謧铡眨斋债/寨謥崭謤栅斩榨謤/辗榨謤湛榨謤)
+pdfjs-toggle-sidebar-button-label = 論崭窄铡謤寨榨宅 寨崭詹铡盏斋斩 站铡瞻铡斩铡寨炸
+pdfjs-document-outline-button =
+    .title = 諔崭謧謥铡栅謤榨宅 謨铡战湛铡诈詹诈斋 崭謧謤崭謧铡眨斋债炸 (寨謤寨斩铡寨斋 战榨詹沾乍謩諠 沾斋铡謧崭謤斩榨謤炸 炸斩栅铡謤毡铡寨榨宅崭謧/寨崭债寨榨宅崭謧 瞻铡沾铡謤)
+pdfjs-document-outline-button-label = 論铡战湛铡诈詹诈斋 崭謧謤崭謧铡眨斋债
+pdfjs-attachments-button =
+    .title = 諔崭謧謥铡栅謤榨宅 寨謥崭謤栅斩榨謤炸
+pdfjs-attachments-button-label = 钥謥崭謤栅斩榨謤
+pdfjs-layers-button =
+    .title = 諔崭謧謥铡栅謤榨宅 辗榨謤湛榨謤炸 (寨謤寨斩铡瞻蘸榨宅 站榨謤铡寨铡盏榨宅崭謧 闸崭宅崭謤 辗榨謤湛榨謤炸 战寨咋闸斩铡栅斋謤 站斋粘铡寨斋)
+pdfjs-layers-button-label = 諊榨謤湛榨謤
+pdfjs-thumbs-button =
+    .title = 諔崭謧謥铡栅謤榨宅 沾铡斩謤铡蘸铡湛寨榨謤炸
+pdfjs-thumbs-button-label = 談铡斩謤铡蘸铡湛寨榨謤
+pdfjs-current-outline-item-button =
+    .title = 猿湛乍謩 炸斩诈铡謥斋寨 眨债铡眨謤沾铡斩 湛铡謤謤炸
+pdfjs-current-outline-item-button-label = 愿斩诈铡謥斋寨 眨债铡眨謤沾铡斩 湛铡謤謤
+pdfjs-findbar-button =
+    .title = 猿湛斩榨宅 謨铡战湛铡诈詹诈崭謧沾
+pdfjs-findbar-button-label = 請謤崭斩崭謧沾
+pdfjs-additional-layers = 约謤铡謥崭謧謥斋展 辗榨謤湛榨謤
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 苑栈炸 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 苑栈斋 沾铡斩謤铡蘸铡湛寨榨謤炸 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 請謤崭斩崭謧沾
+    .placeholder = 猿湛斩榨宅 謨铡战湛铡诈詹诈崭謧沾鈥�
+pdfjs-find-previous-button =
+    .title = 猿湛斩榨宅 铡謤湛铡盏铡盏湛崭謧诈榨铡斩 斩铡窄崭謤栅 铡謤湛铡盏铡盏湛崭謧诈斋謧斩炸
+pdfjs-find-previous-button-label = 諉铡窄崭謤栅炸
+pdfjs-find-next-button =
+    .title = 猿湛斋謤 铡謤湛铡盏铡盏湛崭謧诈榨铡斩 盏铡栈崭謤栅 铡謤湛铡盏铡盏湛崭謧诈斋謧斩炸
+pdfjs-find-next-button-label = 諃铡栈崭謤栅炸
+pdfjs-find-highlight-checkbox = 猿崭謧斩铡斩辗榨宅 闸崭宅崭謤炸
+pdfjs-find-match-case-checkbox-label = 諃铡辗崭謧斋 铡占斩榨宅 瞻铡斩眨铡沾铡斩謩炸
+pdfjs-find-match-diacritics-checkbox-label = 諃斩展斋謧斩铡湛铡謤闸榨謤斋展 斩辗铡斩斩榨謤斋 瞻铡沾铡蘸铡湛铡战窄铡斩榨謥崭謧沾
+pdfjs-find-entire-word-checkbox-label = 员沾闸崭詹栈 闸铡占榨謤炸
+pdfjs-find-reached-top = 諃铡战榨宅 榨謩 謨铡战湛铡诈詹诈斋 站榨謤榨謧斋斩,辗铡謤崭謧斩铡寨榨宅 斩榨謤謩榨謧斋謥
+pdfjs-find-reached-bottom = 諃铡战榨宅 乍謩 謨铡战湛铡诈詹诈斋 站榨謤栈斋斩, 辗铡謤崭謧斩铡寨榨宅 站榨謤榨謧斋謥
+pdfjs-find-not-found = 员謤湛铡盏铡盏湛崭謧诈斋謧斩炸 展眨湛斩崭謧榨謥
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 苑栈斋 宅铡盏斩崭謧诈斋謧斩
+pdfjs-page-scale-fit = 諃铡謤沾铡謤榨謥斩榨宅 乍栈炸
+pdfjs-page-scale-auto = 曰斩謩斩铡辗窄铡湛 窄崭辗崭謤铡謥崭謧沾
+pdfjs-page-scale-actual = 曰謤铡寨铡斩 展铡謨炸
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 苑栈 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 斩斋辗謩炸 闸铡謥榨宅斋战 战窄铡宅 乍 湛榨詹斋 崭謧斩榨謥榨宅謮
+pdfjs-invalid-file-error = 諐窄铡宅 寨铡沾 站斩铡战崭謧铡债 PDF 斩斋辗謩謮
+pdfjs-missing-file-error = PDF 斩斋辗謩炸 闸铡謥铡寨铡斋謧沾 乍謮
+pdfjs-unexpected-response-error = 諐蘸铡战铡謤寨斋展斋 铡斩战蘸铡战榨宅斋 蘸铡湛铡战窄铡斩謮
+pdfjs-rendering-error = 諐窄铡宅 乍 湛榨詹斋 崭謧斩榨謥榨宅 乍栈斋 沾榨寨斩铡闸铡斩沾铡斩 摘铡沾铡斩铡寨
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 跃铡斩崭诈崭謧诈斋謧斩]
+
+## Password
+
+pdfjs-password-label = 談崭謧湛謩铡眨謤乍謩  眨铡詹湛斩铡闸铡占炸 铡盏战 PDF 斩斋辗謩炸 闸铡謥榨宅崭謧 瞻铡沾铡謤
+pdfjs-password-invalid = 猿铡詹湛斩铡闸铡占炸 战窄铡宅 乍: 钥謤寨斋斩 謨崭謤毡乍謩:
+pdfjs-password-ok-button = 约铡謧
+pdfjs-password-cancel-button = 諌榨詹铡謤寨榨宅
+pdfjs-web-fonts-disabled = 諑榨闸-湛铡占铡湛榨战铡寨斩榨謤炸 铡斩栈铡湛崭謧铡债 榨斩. 瞻斩铡謤铡謧崭謤 展乍 铡謧眨湛铡眨崭謤债榨宅 斩榨謤寨铡占崭謧謥崭謧铡债 PDF 湛铡占铡湛榨战铡寨斩榨謤炸謮
diff --git a/public/pdfjs/web/locale/ia/viewer.ftl b/public/pdfjs/web/locale/ia/viewer.ftl
new file mode 100644
index 0000000..0ed368b
--- /dev/null
+++ b/public/pdfjs/web/locale/ia/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pagina previe
+pdfjs-previous-button-label = Previe
+pdfjs-next-button =
+    .title = Pagina sequente
+pdfjs-next-button-label = Sequente
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pagina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Distantiar
+pdfjs-zoom-out-button-label = Distantiar
+pdfjs-zoom-in-button =
+    .title = Approximar
+pdfjs-zoom-in-button-label = Approximar
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Excambiar a modo presentation
+pdfjs-presentation-mode-button-label = Modo presentation
+pdfjs-open-file-button =
+    .title = Aperir le file
+pdfjs-open-file-button-label = Aperir
+pdfjs-print-button =
+    .title = Imprimer
+pdfjs-print-button-label = Imprimer
+pdfjs-save-button =
+    .title = Salvar
+pdfjs-save-button-label = Salvar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Discargar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Discargar
+pdfjs-bookmark-button =
+    .title = Pagina actual (vide le URL del pagina actual)
+pdfjs-bookmark-button-label = Pagina actual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Instrumentos
+pdfjs-tools-button-label = Instrumentos
+pdfjs-first-page-button =
+    .title = Ir al prime pagina
+pdfjs-first-page-button-label = Ir al prime pagina
+pdfjs-last-page-button =
+    .title = Ir al ultime pagina
+pdfjs-last-page-button-label = Ir al ultime pagina
+pdfjs-page-rotate-cw-button =
+    .title = Rotar in senso horari
+pdfjs-page-rotate-cw-button-label = Rotar in senso horari
+pdfjs-page-rotate-ccw-button =
+    .title = Rotar in senso antihorari
+pdfjs-page-rotate-ccw-button-label = Rotar in senso antihorari
+pdfjs-cursor-text-select-tool-button =
+    .title = Activar le instrumento de selection de texto
+pdfjs-cursor-text-select-tool-button-label = Instrumento de selection de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Activar le instrumento mano
+pdfjs-cursor-hand-tool-button-label = Instrumento mano
+pdfjs-scroll-page-button =
+    .title = Usar rolamento de pagina
+pdfjs-scroll-page-button-label = Rolamento de pagina
+pdfjs-scroll-vertical-button =
+    .title = Usar rolamento vertical
+pdfjs-scroll-vertical-button-label = Rolamento vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usar rolamento horizontal
+pdfjs-scroll-horizontal-button-label = Rolamento horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Usar rolamento incapsulate
+pdfjs-scroll-wrapped-button-label = Rolamento incapsulate
+pdfjs-spread-none-button =
+    .title = Non junger paginas dual
+pdfjs-spread-none-button-label = Sin paginas dual
+pdfjs-spread-odd-button =
+    .title = Junger paginas dual a partir de paginas con numeros impar
+pdfjs-spread-odd-button-label = Paginas dual impar
+pdfjs-spread-even-button =
+    .title = Junger paginas dual a partir de paginas con numeros par
+pdfjs-spread-even-button-label = Paginas dual par
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Proprietates del documento鈥�
+pdfjs-document-properties-button-label = Proprietates del documento鈥�
+pdfjs-document-properties-file-name = Nomine del file:
+pdfjs-document-properties-file-size = Dimension de file:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Titulo:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Subjecto:
+pdfjs-document-properties-keywords = Parolas clave:
+pdfjs-document-properties-creation-date = Data de creation:
+pdfjs-document-properties-modification-date = Data de modification:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Creator:
+pdfjs-document-properties-producer = Productor PDF:
+pdfjs-document-properties-version = Version PDF:
+pdfjs-document-properties-page-count = Numero de paginas:
+pdfjs-document-properties-page-size = Dimension del pagina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = horizontal
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Littera
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista web rapide:
+pdfjs-document-properties-linearized-yes = Si
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Clauder
+
+## Print
+
+pdfjs-print-progress-message = Preparation del documento pro le impression鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancellar
+pdfjs-printing-not-supported = Attention聽: le impression non es totalmente supportate per ce navigator.
+pdfjs-printing-not-ready = Attention: le file PDF non es integremente cargate pro lo poter imprimer.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Monstrar/celar le barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Monstrar/celar le barra lateral (le documento contine structura/attachamentos/stratos)
+pdfjs-toggle-sidebar-button-label = Monstrar/celar le barra lateral
+pdfjs-document-outline-button =
+    .title = Monstrar le schema del documento (clic duple pro expander/contraher tote le elementos)
+pdfjs-document-outline-button-label = Schema del documento
+pdfjs-attachments-button =
+    .title = Monstrar le annexos
+pdfjs-attachments-button-label = Annexos
+pdfjs-layers-button =
+    .title = Monstrar stratos (clicca duple pro remontar tote le stratos al stato predefinite)
+pdfjs-layers-button-label = Stratos
+pdfjs-thumbs-button =
+    .title = Monstrar le vignettes
+pdfjs-thumbs-button-label = Vignettes
+pdfjs-current-outline-item-button =
+    .title = Trovar le elemento de structura actual
+pdfjs-current-outline-item-button-label = Elemento de structura actual
+pdfjs-findbar-button =
+    .title = Cercar in le documento
+pdfjs-findbar-button-label = Cercar
+pdfjs-additional-layers = Altere stratos
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Vignette del pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Seliger pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Pagina { $page } de { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Cercar
+    .placeholder = Cercar in le documento鈥�
+pdfjs-find-previous-button =
+    .title = Trovar le previe occurrentia del phrase
+pdfjs-find-previous-button-label = Previe
+pdfjs-find-next-button =
+    .title = Trovar le successive occurrentia del phrase
+pdfjs-find-next-button-label = Sequente
+pdfjs-find-highlight-checkbox = Evidentiar toto
+pdfjs-find-match-case-checkbox-label = Distinguer majusculas/minusculas
+pdfjs-find-match-diacritics-checkbox-label = Differentiar diacriticos
+pdfjs-find-entire-word-checkbox-label = Parolas integre
+pdfjs-find-reached-top = Initio del documento attingite, continuation ab fin
+pdfjs-find-reached-bottom = Fin del documento attingite, continuation ab initio
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } de { $total } correspondentia
+       *[other] { $current } de { $total } correspondentias
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Plus de { $limit } correspondentia
+       *[other] Plus de { $limit } correspondentias
+    }
+pdfjs-find-not-found = Phrase non trovate
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Plen largor del pagina
+pdfjs-page-scale-fit = Pagina integre
+pdfjs-page-scale-auto = Zoom automatic
+pdfjs-page-scale-actual = Dimension real
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pagina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Un error occurreva durante que on cargava le file PDF.
+pdfjs-invalid-file-error = File PDF corrumpite o non valide.
+pdfjs-missing-file-error = File PDF mancante.
+pdfjs-unexpected-response-error = Responsa del servitor inexpectate.
+pdfjs-rendering-error = Un error occurreva durante que on processava le pagina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Insere le contrasigno pro aperir iste file PDF.
+pdfjs-password-invalid = Contrasigno invalide. Per favor retenta.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Cancellar
+pdfjs-web-fonts-disabled = Le typos de litteras web es disactivate: impossibile usar le typos de litteras PDF incorporate.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texto
+pdfjs-editor-color-picker-free-text-input =
+    .title = Cambiar color de texto
+pdfjs-editor-free-text-button-label = Texto
+pdfjs-editor-ink-button =
+    .title = Designar
+pdfjs-editor-color-picker-ink-input =
+    .title = Cambiar color de designo
+pdfjs-editor-ink-button-label = Designar
+pdfjs-editor-stamp-button =
+    .title = Adder o rediger imagines
+pdfjs-editor-stamp-button-label = Adder o rediger imagines
+pdfjs-editor-highlight-button =
+    .title = Evidentia
+pdfjs-editor-highlight-button-label = Evidentia
+pdfjs-highlight-floating-button1 =
+    .title = Evidentiar
+    .aria-label = Evidentiar
+pdfjs-highlight-floating-button-label = Evidentiar
+pdfjs-comment-floating-button =
+    .title = Commento
+    .aria-label = Commento
+pdfjs-comment-floating-button-label = Commento
+pdfjs-editor-comment-button =
+    .title = Commento
+    .aria-label = Commento
+pdfjs-editor-comment-button-label = Commento
+pdfjs-editor-signature-button =
+    .title = Adder signatura
+pdfjs-editor-signature-button-label = Adder signatura
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de evidentiation
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de designos
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de signaturas: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de imagines
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Remover le designo
+pdfjs-editor-remove-freetext-button =
+    .title = Remover texto
+pdfjs-editor-remove-stamp-button =
+    .title = Remover imagine
+pdfjs-editor-remove-highlight-button =
+    .title = Remover evidentia
+pdfjs-editor-remove-signature-button =
+    .title = Remover signatura
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Color
+pdfjs-editor-free-text-size-input = Dimension
+pdfjs-editor-ink-color-input = Color
+pdfjs-editor-ink-thickness-input = Spissor
+pdfjs-editor-ink-opacity-input = Opacitate
+pdfjs-editor-stamp-add-image-button =
+    .title = Adder imagine
+pdfjs-editor-stamp-add-image-button-label = Adder imagine
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Spissor
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Cambiar spissor evidentiante elementos differente de texto
+pdfjs-editor-add-signature-container =
+    .aria-label = Controlos de signatura e signaturas salvate
+pdfjs-editor-signature-add-signature-button =
+    .title = Adder nove signatura
+pdfjs-editor-signature-add-signature-button-label = Adder nove signatura
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Signatura salvate: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de texto
+    .default-content = Initiar a inserer鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Commento
+       *[other] Commentos
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Clauder le barra lateral
+    .aria-label = Clauder le barra lateral
+pdfjs-editor-comments-sidebar-close-button-label = Clauder le barra lateral
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Vide tu alco notabile? Evidentia lo e lassa un commentario.
+pdfjs-editor-comments-sidebar-no-comments-link = Pro saper plus
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texto alternative
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Rediger texto alternative
+pdfjs-editor-alt-text-dialog-label = Elige un option
+pdfjs-editor-alt-text-dialog-description = Le texto alternative (alt text) adjuta quando le personas non pote vider le imagine o quando illo non carga.
+pdfjs-editor-alt-text-add-description-label = Adder un description
+pdfjs-editor-alt-text-add-description-description = Mira a 1-2 phrases que describe le subjecto, parametro, o actiones.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorative
+pdfjs-editor-alt-text-mark-decorative-description = Isto es usate pro imagines ornamental, como bordaturas o filigranas.
+pdfjs-editor-alt-text-cancel-button = Cancellar
+pdfjs-editor-alt-text-save-button = Salvar
+pdfjs-editor-alt-text-decorative-tooltip = Marcate como decorative
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Per exemplo, 鈥淯n juvene sede a un tabula pro mangiar un repasto鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texto alternative
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Angulo superior sinistre 鈥� redimensionar
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Medio superior 鈥� redimensionar
+pdfjs-editor-resizer-top-right =
+    .aria-label = Angulo superior dextre 鈥� redimensionar
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Medio dextre 鈥� redimensionar
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Angulo inferior dextre 鈥� redimensionar
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Medio inferior 鈥� redimensionar
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Angulo inferior sinistre 鈥� redimensionar
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Medio sinistre 鈥� redimensionar
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Color pro evidentiar
+pdfjs-editor-colorpicker-button =
+    .title = Cambiar color
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Electiones del color
+pdfjs-editor-colorpicker-yellow =
+    .title = Jalne
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Blau
+pdfjs-editor-colorpicker-pink =
+    .title = Rosate
+pdfjs-editor-colorpicker-red =
+    .title = Rubie
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Monstrar toto
+pdfjs-editor-highlight-show-all-button =
+    .title = Monstrar toto
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Rediger texto alternative (description del imagine)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Adder texto alternative (description del imagine)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Scribe tu description ci鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Breve description pro personas qui non pote vider le imagine o quando le imagine non se carga.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Iste texto alternative ha essite create automaticamente e pote esser inexacte.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Pro saper plus
+pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternative automaticamente
+pdfjs-editor-new-alt-text-not-now-button = Non ora
+pdfjs-editor-new-alt-text-error-title = Impossibile crear texto alternative automaticamente
+pdfjs-editor-new-alt-text-error-description = Scribe tu proprie texto alternative o retenta plus tarde.
+pdfjs-editor-new-alt-text-error-close-button = Clauder
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Discargante modello de intelligentia artificial  del texto alternative ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = Discargante modello de intelligentia artificial  del texto alternative ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Texto alternative addite
+pdfjs-editor-new-alt-text-added-button-label = Texto alternative addite
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Texto alternative mancante
+pdfjs-editor-new-alt-text-missing-button-label = Texto alternative mancante
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Revider texto alternative
+pdfjs-editor-new-alt-text-to-review-button-label = Revider texto alternative
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automaticamente create: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Parametros del texto alternative del imagine
+pdfjs-image-alt-text-settings-button-label = Parametros del texto alternative del imagine
+pdfjs-editor-alt-text-settings-dialog-label = Parametros del texto alternative del imagine
+pdfjs-editor-alt-text-settings-automatic-title = Texto alternative automatic
+pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternative automaticamente
+pdfjs-editor-alt-text-settings-create-model-description = Suggere descriptiones pro adjutar le personas qui non pote vider le imagine o quando le imagine non carga.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modello de intelligentia artificial del texto alternative ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Flue localmente sur tu apparato assi tu datos remane private. Necessari pro texto alternative automatic.
+pdfjs-editor-alt-text-settings-delete-model-button = Deler
+pdfjs-editor-alt-text-settings-download-model-button = Discargar
+pdfjs-editor-alt-text-settings-downloading-model-button = Discargante鈥�
+pdfjs-editor-alt-text-settings-editor-title = Rediger texto alternative
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Monstrar le redactor de texto alternative a pena on adde un imagine
+pdfjs-editor-alt-text-settings-show-dialog-description = Te adjuta a verifica que tote tu imagines ha un texto alternative.
+pdfjs-editor-alt-text-settings-close-button = Clauder
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Evidentia addite
+pdfjs-editor-freetext-added-alert = Texto addite
+pdfjs-editor-ink-added-alert = Designo addite
+pdfjs-editor-stamp-added-alert = Imagine addite
+pdfjs-editor-signature-added-alert = Firma addite
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Evidentiation removite
+pdfjs-editor-undo-bar-message-freetext = Texto removite
+pdfjs-editor-undo-bar-message-ink = Designo removite
+pdfjs-editor-undo-bar-message-stamp = Imagine removite
+pdfjs-editor-undo-bar-message-signature = Signatura removite
+pdfjs-editor-undo-bar-message-comment = Commento removite
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } annotation removite
+       *[other] { $count } annotationes removite
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Disfacer
+pdfjs-editor-undo-bar-undo-button-label = Disfacer
+pdfjs-editor-undo-bar-close-button =
+    .title = Clauder
+pdfjs-editor-undo-bar-close-button-label = Clauder
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Iste formulario permitte al usator crear un firma a adder a un documento PDF. Le usator pote modificar le nomine (le qual tamben servi de texto alternative) e, si desirate, salvar le firma pro uso repetite.
+pdfjs-editor-add-signature-dialog-title = Adder un signatura
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Typar
+    .title = Typar
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Designar
+    .title = Designar
+pdfjs-editor-add-signature-image-button = Imagine
+    .title = Imagine
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Insere tu firma
+    .placeholder = Insere tu firma
+pdfjs-editor-add-signature-draw-placeholder = Designa tu firma
+pdfjs-editor-add-signature-draw-thickness-range-label = Spissor
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Spissor de designo: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Trahe un file hic pro incargar lo
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] O elige files de imagine
+       *[other] O folietta files de imagine
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Description (texto alternative)
+pdfjs-editor-add-signature-description-input =
+    .title = Description (texto alternative)
+pdfjs-editor-add-signature-description-default-when-drawing = Signatura
+pdfjs-editor-add-signature-clear-button-label = Rader signatura
+pdfjs-editor-add-signature-clear-button =
+    .title = Rader signatura
+pdfjs-editor-add-signature-save-checkbox = Salvar signatura
+pdfjs-editor-add-signature-save-warning-message = Tu ha attingite le limite de 5 firmas salvate. Remove un pro salvar un altere.
+pdfjs-editor-add-signature-image-upload-error-title = Non poteva incargar le imagine
+pdfjs-editor-add-signature-image-upload-error-description = Verifica tu connexion al rete o tenta un altere imagine.
+pdfjs-editor-add-signature-image-no-data-error-title = Impossibile converter iste imagine in un firma
+pdfjs-editor-add-signature-image-no-data-error-description = Essaya cargar un imagine differente.
+pdfjs-editor-add-signature-error-close-button = Clauder
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancellar
+pdfjs-editor-add-signature-add-button = Adder
+pdfjs-editor-edit-signature-update-button = Actualisar
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Rediger commento
+pdfjs-editor-edit-comment-popup-button =
+    .title = Rediger commento
+pdfjs-editor-delete-comment-popup-button-label = Remover commento
+pdfjs-editor-delete-comment-popup-button =
+    .title = Remover commento
+pdfjs-show-comment-button =
+    .title = Monstrar commento
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger commento
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualisar
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Adder commento
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adder
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Comenciar a scriber鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancellar
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Adder commento
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Monstrar/celar le barra lateral (le documento contine miniaturas/structura/attachamentos/stratos)
+pdfjs-toggle-views-manager-button1-label = Gerer paginas
+pdfjs-views-manager-sidebar =
+    .aria-label = Barra lateral
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Saltar al declaration
+pdfjs-views-manager-view-selector-button =
+    .title = Vistas
+pdfjs-views-manager-view-selector-button-label = Vistas
+pdfjs-views-manager-pages-title = Paginas
+pdfjs-views-manager-outlines-title1 = Structura de documento
+    .title = Structura de documento (clicca-duplemente pro expander/collaber tote elementos)
+pdfjs-views-manager-attachments-title = Annexos
+pdfjs-views-manager-layers-title1 = Stratos
+    .title = Stratos (clicca-duplemente pro reinitialisar tote le stratos al stato predefinite)
+pdfjs-views-manager-pages-option-label = Paginas
+pdfjs-views-manager-outlines-option-label = Schema del documento
+pdfjs-views-manager-attachments-option-label = Annexos
+pdfjs-views-manager-layers-option-label = Stratos
+pdfjs-views-manager-add-file-button =
+    .title = Adder file
+pdfjs-views-manager-add-file-button-label = Adder file
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } seligite
+       *[other] { $count } seligite
+    }
+pdfjs-views-manager-pages-status-none-action-label = Seliger paginas
+pdfjs-views-manager-pages-status-action-button-label = Gerer
+pdfjs-views-manager-pages-status-copy-button-label = Copiar
+pdfjs-views-manager-pages-status-cut-button-label = Secar
+pdfjs-views-manager-pages-status-delete-button-label = Deler
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportar seligite鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 pagina secate
+       *[other] { $count } paginas secate
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 pagina copiate
+       *[other] { $count } paginas copiate
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 pagina delite
+       *[other] { $count } paginas delite
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Preparante file鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Cargante file鈥�
+pdfjs-views-manager-status-warning-cut-label = Impossibile secar. Refresca le pagina e retenta.
+pdfjs-views-manager-status-warning-copy-label = Impossibile copiar. Refresca le pagina e retenta.
+pdfjs-views-manager-status-warning-delete-label = Impossibile deler. Refresca le pagina e retenta.
+pdfjs-views-manager-status-warning-save-label = Impossibile salvar. Refresca le pagina e retenta.
+pdfjs-views-manager-status-undo-button-label = Disfacer
+pdfjs-views-manager-status-done-button-label = Facite
+pdfjs-views-manager-status-close-button =
+    .title = Clauder
+pdfjs-views-manager-status-close-button-label = Clauder
+pdfjs-views-manager-paste-button-label = Collar
+pdfjs-views-manager-paste-button-before =
+    .title = Collar ante le prime pagina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Colla post pagina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOVA
+pdfjs-views-manager-waiting-for-file = Cargante file鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Gerer paginas
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Remover signatura salvate
+pdfjs-editor-delete-signature-button-label1 = Remover signatura salvate
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Rediger description
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Rediger description
diff --git a/public/pdfjs/web/locale/id/viewer.ftl b/public/pdfjs/web/locale/id/viewer.ftl
new file mode 100644
index 0000000..f5b84af
--- /dev/null
+++ b/public/pdfjs/web/locale/id/viewer.ftl
@@ -0,0 +1,589 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Laman Sebelumnya
+pdfjs-previous-button-label = Sebelumnya
+pdfjs-next-button =
+    .title = Laman Selanjutnya
+pdfjs-next-button-label = Selanjutnya
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Halaman
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = dari { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } dari { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Perkecil
+pdfjs-zoom-out-button-label = Perkecil
+pdfjs-zoom-in-button =
+    .title = Perbesar
+pdfjs-zoom-in-button-label = Perbesar
+pdfjs-zoom-select =
+    .title = Perbesaran
+pdfjs-presentation-mode-button =
+    .title = Ganti ke Mode Presentasi
+pdfjs-presentation-mode-button-label = Mode Presentasi
+pdfjs-open-file-button =
+    .title = Buka Berkas
+pdfjs-open-file-button-label = Buka
+pdfjs-print-button =
+    .title = Cetak
+pdfjs-print-button-label = Cetak
+pdfjs-save-button =
+    .title = Simpan
+pdfjs-save-button-label = Simpan
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Unduh
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Unduh
+pdfjs-bookmark-button =
+    .title = Laman Saat Ini (Lihat URL dari Laman Sekarang)
+pdfjs-bookmark-button-label = Laman Saat Ini
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Alat
+pdfjs-tools-button-label = Alat
+pdfjs-first-page-button =
+    .title = Buka Halaman Pertama
+pdfjs-first-page-button-label = Buka Halaman Pertama
+pdfjs-last-page-button =
+    .title = Buka Halaman Terakhir
+pdfjs-last-page-button-label = Buka Halaman Terakhir
+pdfjs-page-rotate-cw-button =
+    .title = Putar Searah Jarum Jam
+pdfjs-page-rotate-cw-button-label = Putar Searah Jarum Jam
+pdfjs-page-rotate-ccw-button =
+    .title = Putar Berlawanan Arah Jarum Jam
+pdfjs-page-rotate-ccw-button-label = Putar Berlawanan Arah Jarum Jam
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktifkan Alat Seleksi Teks
+pdfjs-cursor-text-select-tool-button-label = Alat Seleksi Teks
+pdfjs-cursor-hand-tool-button =
+    .title = Aktifkan Alat Tangan
+pdfjs-cursor-hand-tool-button-label = Alat Tangan
+pdfjs-scroll-page-button =
+    .title = Gunakan Pengguliran Laman
+pdfjs-scroll-page-button-label = Pengguliran Laman
+pdfjs-scroll-vertical-button =
+    .title = Gunakan Penggeseran Vertikal
+pdfjs-scroll-vertical-button-label = Penggeseran Vertikal
+pdfjs-scroll-horizontal-button =
+    .title = Gunakan Penggeseran Horizontal
+pdfjs-scroll-horizontal-button-label = Penggeseran Horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Gunakan Penggeseran Terapit
+pdfjs-scroll-wrapped-button-label = Penggeseran Terapit
+pdfjs-spread-none-button =
+    .title = Jangan gabungkan lembar halaman
+pdfjs-spread-none-button-label = Tidak Ada Lembaran
+pdfjs-spread-odd-button =
+    .title = Gabungkan lembar lamanan mulai dengan halaman ganjil
+pdfjs-spread-odd-button-label = Lembaran Ganjil
+pdfjs-spread-even-button =
+    .title = Gabungkan lembar halaman dimulai dengan halaman genap
+pdfjs-spread-even-button-label = Lembaran Genap
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Properti Dokumen鈥�
+pdfjs-document-properties-button-label = Properti Dokumen鈥�
+pdfjs-document-properties-file-name = Nama berkas:
+pdfjs-document-properties-file-size = Ukuran berkas:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte)
+pdfjs-document-properties-title = Judul:
+pdfjs-document-properties-author = Penyusun:
+pdfjs-document-properties-subject = Subjek:
+pdfjs-document-properties-keywords = Kata Kunci:
+pdfjs-document-properties-creation-date = Tanggal Dibuat:
+pdfjs-document-properties-modification-date = Tanggal Dimodifikasi:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Pembuat:
+pdfjs-document-properties-producer = Pemroduksi PDF:
+pdfjs-document-properties-version = Versi PDF:
+pdfjs-document-properties-page-count = Jumlah Halaman:
+pdfjs-document-properties-page-size = Ukuran Laman:
+pdfjs-document-properties-page-size-unit-inches = inci
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = tegak
+pdfjs-document-properties-page-size-orientation-landscape = mendatar
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Tampilan Web Kilat:
+pdfjs-document-properties-linearized-yes = Ya
+pdfjs-document-properties-linearized-no = Tidak
+pdfjs-document-properties-close-button = Tutup
+
+## Print
+
+pdfjs-print-progress-message = Menyiapkan dokumen untuk pencetakan鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Batalkan
+pdfjs-printing-not-supported = Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini.
+pdfjs-printing-not-ready = Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Aktif/Nonaktifkan Bilah Samping
+pdfjs-toggle-sidebar-notification-button =
+    .title = Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran/lapisan)
+pdfjs-toggle-sidebar-button-label = Aktif/Nonaktifkan Bilah Samping
+pdfjs-document-outline-button =
+    .title = Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item)
+pdfjs-document-outline-button-label = Kerangka Dokumen
+pdfjs-attachments-button =
+    .title = Tampilkan Lampiran
+pdfjs-attachments-button-label = Lampiran
+pdfjs-layers-button =
+    .title = Tampilkan Lapisan (klik ganda untuk mengatur ulang semua lapisan ke keadaan baku)
+pdfjs-layers-button-label = Lapisan
+pdfjs-thumbs-button =
+    .title = Tampilkan Miniatur
+pdfjs-thumbs-button-label = Miniatur
+pdfjs-current-outline-item-button =
+    .title = Cari Butir Ikhtisar Saat Ini
+pdfjs-current-outline-item-button-label = Butir Ikhtisar Saat Ini
+pdfjs-findbar-button =
+    .title = Temukan di Dokumen
+pdfjs-findbar-button-label = Temukan
+pdfjs-additional-layers = Lapisan Tambahan
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Laman { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatur Laman { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Temukan
+    .placeholder = Temukan di dokumen鈥�
+pdfjs-find-previous-button =
+    .title = Temukan kata sebelumnya
+pdfjs-find-previous-button-label = Sebelumnya
+pdfjs-find-next-button =
+    .title = Temukan lebih lanjut
+pdfjs-find-next-button-label = Selanjutnya
+pdfjs-find-highlight-checkbox = Sorot semuanya
+pdfjs-find-match-case-checkbox-label = Cocokkan BESAR/kecil
+pdfjs-find-match-diacritics-checkbox-label = Pencocokan Diakritik
+pdfjs-find-entire-word-checkbox-label = Seluruh teks
+pdfjs-find-reached-top = Sampai di awal dokumen, dilanjutkan dari bawah
+pdfjs-find-reached-bottom = Sampai di akhir dokumen, dilanjutkan dari atas
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count = { $current } dari { $total } yang cocok
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit = Lebih dari { $limit } kecocokan
+pdfjs-find-not-found = Frasa tidak ditemukan
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Lebar Laman
+pdfjs-page-scale-fit = Muat Laman
+pdfjs-page-scale-auto = Perbesaran Otomatis
+pdfjs-page-scale-actual = Ukuran Asli
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Halaman { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Galat terjadi saat memuat PDF.
+pdfjs-invalid-file-error = Berkas PDF tidak valid atau rusak.
+pdfjs-missing-file-error = Berkas PDF tidak ada.
+pdfjs-unexpected-response-error = Balasan server yang tidak diharapkan.
+pdfjs-rendering-error = Galat terjadi saat merender laman.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotasi { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Masukkan sandi untuk membuka berkas PDF ini.
+pdfjs-password-invalid = Sandi tidak valid. Silakan coba lagi.
+pdfjs-password-ok-button = Oke
+pdfjs-password-cancel-button = Batal
+pdfjs-web-fonts-disabled = Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Teks
+pdfjs-editor-color-picker-free-text-input =
+    .title = Ubah warna teks
+pdfjs-editor-free-text-button-label = Teks
+pdfjs-editor-ink-button =
+    .title = Gambar
+pdfjs-editor-color-picker-ink-input =
+    .title = Ubah warna gambar
+pdfjs-editor-ink-button-label = Gambar
+pdfjs-editor-stamp-button =
+    .title = Tambah atau edit gambar
+pdfjs-editor-stamp-button-label = Tambah atau edit gambar
+pdfjs-editor-highlight-button =
+    .title = Sorot
+pdfjs-editor-highlight-button-label = Sorot
+pdfjs-highlight-floating-button1 =
+    .title = Sorot
+    .aria-label = Sorot
+pdfjs-highlight-floating-button-label = Sorot
+pdfjs-comment-floating-button =
+    .title = Komentar
+    .aria-label = Komentar
+pdfjs-comment-floating-button-label = Komentar
+pdfjs-editor-signature-button =
+    .title = Tambahkan tanda tangan
+pdfjs-editor-signature-button-label = Tambahkan tanda tangan
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor sorot
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor gambar
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor tanda tangan: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor gambar
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Hapus gambar
+pdfjs-editor-remove-freetext-button =
+    .title = Hapus teks
+pdfjs-editor-remove-stamp-button =
+    .title = Hapus gambar
+pdfjs-editor-remove-highlight-button =
+    .title = Hapus sorotan
+pdfjs-editor-remove-signature-button =
+    .title = Hapus tanda tangan
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Warna
+pdfjs-editor-free-text-size-input = Ukuran
+pdfjs-editor-ink-color-input = Warna
+pdfjs-editor-ink-thickness-input = Ketebalan
+pdfjs-editor-ink-opacity-input = Opasitas
+pdfjs-editor-stamp-add-image-button =
+    .title = Tambahkan gambar
+pdfjs-editor-stamp-add-image-button-label = Tambahkan gambar
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Ketebalan
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Ubah ketebalan saat menyorot item selain teks
+pdfjs-editor-add-signature-container =
+    .aria-label = Kontrol tanda tangan dan tanda tangan tersimpan
+pdfjs-editor-signature-add-signature-button =
+    .title = Tambahkan tanda tangan baru
+pdfjs-editor-signature-add-signature-button-label = Tambahkan tanda tangan baru
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Tanda tangan tersimpan: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor Teks
+    .default-content = Mulai mengetik鈥�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Teks alternatif
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Edit teks alternatif
+pdfjs-editor-alt-text-dialog-label = Pilih opsi
+pdfjs-editor-alt-text-dialog-description = Teks alternatif membantu ketika orang tidak dapat melihat gambar atau ketika tidak termuat.
+pdfjs-editor-alt-text-add-description-label = Tambahkan deskripsi
+pdfjs-editor-alt-text-add-description-description = Upayakan 1-2 kalimat yang menggambarkan subjek, latar, atau tindakan.
+pdfjs-editor-alt-text-mark-decorative-label = Tandai sebagai dekoratif
+pdfjs-editor-alt-text-mark-decorative-description = Ini digunakan untuk gambar hias, seperti batas atau tanda air.
+pdfjs-editor-alt-text-cancel-button = Batal
+pdfjs-editor-alt-text-save-button = Simpan
+pdfjs-editor-alt-text-decorative-tooltip = Ditandai sebagai dekoratif
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Misalnya, 鈥淪eorang pemuda duduk di meja untuk makan鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Teks alternatif
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Pojok kiri atas 鈥� ubah ukuran
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Tengah atas 鈥� ubah ukuran
+pdfjs-editor-resizer-top-right =
+    .aria-label = Pojok kanan atas 鈥� ubah ukuran
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Kanan tengah 鈥� ubah ukuran
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Pojok kanan bawah 鈥� ubah ukuran
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Tengah bawah 鈥� ubah ukuran
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Pojok kiri bawah 鈥� ubah ukuran
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Kiri tengah 鈥� ubah ukuran
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Warna sorot
+pdfjs-editor-colorpicker-button =
+    .title = Ubah warna
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Pilihan warna
+pdfjs-editor-colorpicker-yellow =
+    .title = Kuning
+pdfjs-editor-colorpicker-green =
+    .title = Hijau
+pdfjs-editor-colorpicker-blue =
+    .title = Biru
+pdfjs-editor-colorpicker-pink =
+    .title = Merah Jambu
+pdfjs-editor-colorpicker-red =
+    .title = Merah
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Tampilkan semua
+pdfjs-editor-highlight-show-all-button =
+    .title = Tampilkan semua
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Edit teks alternatif (deskripsi gambar)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Tambahkan teks alternatif (deskripsi gambar)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Tulis deskripsi Anda di sini鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Deskripsi singkat untuk orang yang tidak dapat melihat gambar atau saat gambar tidak termuat.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Teks alternatif ini dibuat secara otomatis dan mungkin tidak akurat.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Pelajari lebih lanjut
+pdfjs-editor-new-alt-text-create-automatically-button-label = Buat teks alternatif secara otomatis
+pdfjs-editor-new-alt-text-not-now-button = Jangan sekarang
+pdfjs-editor-new-alt-text-error-title = Tidak bisa membuat teks alternatif secara otomatis
+pdfjs-editor-new-alt-text-error-description = Silakan tulis teks alternatif Anda sendiri atau coba lagi nanti.
+pdfjs-editor-new-alt-text-error-close-button = Tutup
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Mengunduh model AI teks alternatif ({ $downloadedSize } dari { $totalSize } MB)
+    .aria-valuetext = Mengunduh model AI teks alternatif ({ $downloadedSize } dari { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Teks alternatif ditambahkan
+pdfjs-editor-new-alt-text-added-button-label = Teks alternatif ditambahkan
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Teks alternatif hilang
+pdfjs-editor-new-alt-text-missing-button-label = Teks alternatif hilang
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Tinjau teks alternatif
+pdfjs-editor-new-alt-text-to-review-button-label = Tinjau teks alternatif
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Dibuat secara otomatis: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Pengaturan teks alternatif gambar
+pdfjs-image-alt-text-settings-button-label = Pengaturan teks alternatif gambar
+pdfjs-editor-alt-text-settings-dialog-label = Pengaturan teks alternatif gambar
+pdfjs-editor-alt-text-settings-automatic-title = Teks alternatif otomatis
+pdfjs-editor-alt-text-settings-create-model-button-label = Buat teks alternatif secara otomatis
+pdfjs-editor-alt-text-settings-create-model-description = Menyarankan deskripsi untuk membantu orang yang tidak dapat melihat gambar atau ketika gambar tidak termuat.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model AI teks alternatif ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Berjalan secara lokal di perangkat Anda sehingga data Anda tetap pribadi. Diperlukan untuk teks alternatif otomatis.
+pdfjs-editor-alt-text-settings-delete-model-button = Hapus
+pdfjs-editor-alt-text-settings-download-model-button = Unduh
+pdfjs-editor-alt-text-settings-downloading-model-button = Mengunduh鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor teks alternatif
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Tampilkan editor teks alternatif segera saat menambahkan gambar
+pdfjs-editor-alt-text-settings-show-dialog-description = Membantu Anda memastikan semua gambar Anda memiliki teks alternatif.
+pdfjs-editor-alt-text-settings-close-button = Tutup
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Sorotan ditambahkan
+pdfjs-editor-freetext-added-alert = Teks ditambahkan
+pdfjs-editor-ink-added-alert = Gambar ditambahkan
+pdfjs-editor-stamp-added-alert = Citra ditambahkan
+pdfjs-editor-signature-added-alert = Tanda tangan ditambahkan
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Sorotan dihapus
+pdfjs-editor-undo-bar-message-freetext = Teks dihapus
+pdfjs-editor-undo-bar-message-ink = Gambar dihapus
+pdfjs-editor-undo-bar-message-stamp = Gambar dihapus
+pdfjs-editor-undo-bar-message-signature = Tanda tangan dihapus
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple = { $count } anotasi dihapus
+pdfjs-editor-undo-bar-undo-button =
+    .title = Urungkan
+pdfjs-editor-undo-bar-undo-button-label = Urungkan
+pdfjs-editor-undo-bar-close-button =
+    .title = Tutup
+pdfjs-editor-undo-bar-close-button-label = Tutup
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Modal ini memungkinkan pengguna untuk membuat tanda tangan yang dapat ditambahkan ke dokumen PDF. Pengguna dapat mengedit nama (yang juga berfungsi sebagai teks alternatif), dan jika diinginkan, menyimpan tanda tangan untuk digunakan kembali.
+pdfjs-editor-add-signature-dialog-title = Tambahkan tanda tangan
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Tipe
+    .title = Tipe
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Gambarkan
+    .title = Gambarkan
+pdfjs-editor-add-signature-image-button = Gambar
+    .title = Gambar
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Ketik tanda tangan Anda
+    .placeholder = Ketik tanda tangan Anda
+pdfjs-editor-add-signature-draw-placeholder = Buat tanda tangan Anda
+pdfjs-editor-add-signature-draw-thickness-range-label = Ketebalan
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Ketebalan gambar: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Seret berkas ke sini untuk mengunggah
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Atau pilih berkas gambar
+       *[other] Atau cari berkas gambar
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Deskripsi (teks alternatif)
+pdfjs-editor-add-signature-description-input =
+    .title = Deskripsi (teks alternatif)
+pdfjs-editor-add-signature-description-default-when-drawing = Tanda tangan
+pdfjs-editor-add-signature-clear-button-label = Hapus tanda tangan
+pdfjs-editor-add-signature-clear-button =
+    .title = Hapus tanda tangan
+pdfjs-editor-add-signature-save-checkbox = Simpan tanda tangan
+pdfjs-editor-add-signature-save-warning-message = Anda telah mencapai batas 5 tanda tangan tersimpan. Hapus untuk menyimpan lebih banyak.
+pdfjs-editor-add-signature-image-upload-error-title = Tidak dapat mengunggah gambar
+pdfjs-editor-add-signature-image-upload-error-description = Periksa sambungan jaringan Anda atau coba gambar lain.
+pdfjs-editor-add-signature-image-no-data-error-title = Tak bisa mengonversi citra ini menjadi tanda tangan
+pdfjs-editor-add-signature-image-no-data-error-description = Coba unggah gambar lain.
+pdfjs-editor-add-signature-error-close-button = Tutup
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Batal
+pdfjs-editor-add-signature-add-button = Tambah
+pdfjs-editor-edit-signature-update-button = Perbarui
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Hapus tanda tangan tersimpan
+pdfjs-editor-delete-signature-button-label1 = Hapus tanda tangan tersimpan
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Edit deskripsi
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Edit deskripsi
diff --git a/public/pdfjs/web/locale/is/viewer.ftl b/public/pdfjs/web/locale/is/viewer.ftl
new file mode 100644
index 0000000..2f27e67
--- /dev/null
+++ b/public/pdfjs/web/locale/is/viewer.ftl
@@ -0,0 +1,572 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Fyrri s铆冒a
+pdfjs-previous-button-label = Fyrri
+pdfjs-next-button =
+    .title = N忙sta s铆冒a
+pdfjs-next-button-label = N忙sti
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = S铆冒a
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = af { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } af { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Minnka a冒dr谩tt
+pdfjs-zoom-out-button-label = Minnka a冒dr谩tt
+pdfjs-zoom-in-button =
+    .title = Auka a冒dr谩tt
+pdfjs-zoom-in-button-label = Auka a冒dr谩tt
+pdfjs-zoom-select =
+    .title = A冒dr谩ttur
+pdfjs-presentation-mode-button =
+    .title = Skipta yfir 谩 kynningarham
+pdfjs-presentation-mode-button-label = Kynningarhamur
+pdfjs-open-file-button =
+    .title = Opna skr谩
+pdfjs-open-file-button-label = Opna
+pdfjs-print-button =
+    .title = Prenta
+pdfjs-print-button-label = Prenta
+pdfjs-save-button =
+    .title = Vista
+pdfjs-save-button-label = Vista
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = S忙kja
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = S忙kja
+pdfjs-bookmark-button =
+    .title = N煤verandi s铆冒a (Sko冒a vefsl贸冒 fr谩 n煤verandi s铆冒u)
+pdfjs-bookmark-button-label = N煤verandi s铆冒a
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Verkf忙ri
+pdfjs-tools-button-label = Verkf忙ri
+pdfjs-first-page-button =
+    .title = Fara 谩 fyrstu s铆冒u
+pdfjs-first-page-button-label = Fara 谩 fyrstu s铆冒u
+pdfjs-last-page-button =
+    .title = Fara 谩 s铆冒ustu s铆冒u
+pdfjs-last-page-button-label = Fara 谩 s铆冒ustu s铆冒u
+pdfjs-page-rotate-cw-button =
+    .title = Sn煤a r茅tts忙lis
+pdfjs-page-rotate-cw-button-label = Sn煤a r茅tts忙lis
+pdfjs-page-rotate-ccw-button =
+    .title = Sn煤a rangs忙lis
+pdfjs-page-rotate-ccw-button-label = Sn煤a rangs忙lis
+pdfjs-cursor-text-select-tool-button =
+    .title = Virkja textavals谩hald
+pdfjs-cursor-text-select-tool-button-label = Textavals谩hald
+pdfjs-cursor-hand-tool-button =
+    .title = Virkja handarverkf忙ri
+pdfjs-cursor-hand-tool-button-label = Handarverkf忙ri
+pdfjs-scroll-page-button =
+    .title = Nota s铆冒uskrun
+pdfjs-scroll-page-button-label = S铆冒uskrun
+pdfjs-scroll-vertical-button =
+    .title = Nota l贸冒r茅tt skrun
+pdfjs-scroll-vertical-button-label = L贸冒r茅tt skrun
+pdfjs-scroll-horizontal-button =
+    .title = Nota l谩r茅tt skrun
+pdfjs-scroll-horizontal-button-label = L谩r茅tt skrun
+pdfjs-scroll-wrapped-button =
+    .title = Nota l铆nuskipt s铆冒uskrun
+pdfjs-scroll-wrapped-button-label = L铆nuskipt s铆冒uskrun
+pdfjs-spread-none-button =
+    .title = Ekki taka 镁谩tt 铆 dreifingu s铆冒na
+pdfjs-spread-none-button-label = Engin dreifing
+pdfjs-spread-odd-button =
+    .title = Taka 镁谩tt 铆 dreifingu s铆冒na me冒 oddat枚lum
+pdfjs-spread-odd-button-label = Oddat枚ludreifing
+pdfjs-spread-even-button =
+    .title = Taktu 镁谩tt 铆 dreifingu s铆冒na me冒 j枚fnunt枚lum
+pdfjs-spread-even-button-label = Jafnat枚ludreifing
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Eiginleikar skjals鈥�
+pdfjs-document-properties-button-label = Eiginleikar skjals鈥�
+pdfjs-document-properties-file-name = Skr谩arheiti:
+pdfjs-document-properties-file-size = Skr谩rst忙r冒:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } b忙ti)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } b忙ti)
+pdfjs-document-properties-title = Titill:
+pdfjs-document-properties-author = H枚nnu冒ur:
+pdfjs-document-properties-subject = Efni:
+pdfjs-document-properties-keywords = Stikkor冒:
+pdfjs-document-properties-creation-date = B煤i冒 til:
+pdfjs-document-properties-modification-date = Dags breytingar:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = H枚fundur:
+pdfjs-document-properties-producer = PDF framlei冒andi:
+pdfjs-document-properties-version = PDF 煤tg谩fa:
+pdfjs-document-properties-page-count = Bla冒s铆冒ufj枚ldi:
+pdfjs-document-properties-page-size = St忙r冒 s铆冒u:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = skammsni冒
+pdfjs-document-properties-page-size-orientation-landscape = langsni冒
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Flj贸tleg vefsko冒un:
+pdfjs-document-properties-linearized-yes = J谩
+pdfjs-document-properties-linearized-no = Nei
+pdfjs-document-properties-close-button = Loka
+
+## Print
+
+pdfjs-print-progress-message = Undirb媒 skjal fyrir prentun鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = H忙tta vi冒
+pdfjs-printing-not-supported = A冒v枚run: Prentun er ekki me冒 fyllilegan stu冒ning 谩 镁essum vafra.
+pdfjs-printing-not-ready = A冒v枚run: Ekki er b煤i冒 a冒 hla冒a inn allri PDF skr谩nni fyrir prentun.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = V铆xla hli冒arstiku af/谩
+pdfjs-toggle-sidebar-notification-button =
+    .title = V铆xla hli冒arstiku af/谩 (skjal inniheldur yfirlit/vi冒hengi/l枚g)
+pdfjs-toggle-sidebar-button-label = V铆xla hli冒arstiku af/谩
+pdfjs-document-outline-button =
+    .title = S媒na yfirlit skjals (tv铆smelltu til a冒 opna/loka 枚llum hlutum)
+pdfjs-document-outline-button-label = Efnisskipan skjals
+pdfjs-attachments-button =
+    .title = S媒na vi冒hengi
+pdfjs-attachments-button-label = Vi冒hengi
+pdfjs-layers-button =
+    .title = Birta l枚g (tv铆smelltu til a冒 endurstilla 枚ll l枚g 铆 sj谩lfgefna st枚冒u)
+pdfjs-layers-button-label = L枚g
+pdfjs-thumbs-button =
+    .title = S媒na sm谩myndir
+pdfjs-thumbs-button-label = Sm谩myndir
+pdfjs-current-outline-item-button =
+    .title = Finna n煤verandi atri冒i efnisskipunar
+pdfjs-current-outline-item-button-label = N煤verandi atri冒i efnisskipunar
+pdfjs-findbar-button =
+    .title = Leita 铆 skjali
+pdfjs-findbar-button-label = Leita
+pdfjs-additional-layers = Vi冒b贸tarl枚g
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = S铆冒a { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Sm谩mynd af s铆冒u { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Leita
+    .placeholder = Leita 铆 skjali鈥�
+pdfjs-find-previous-button =
+    .title = Leita a冒 fyrra tilfelli 镁essara or冒a
+pdfjs-find-previous-button-label = Fyrri
+pdfjs-find-next-button =
+    .title = Leita a冒 n忙sta tilfelli 镁essara or冒a
+pdfjs-find-next-button-label = N忙sti
+pdfjs-find-highlight-checkbox = Lita allt
+pdfjs-find-match-case-checkbox-label = Passa vi冒 stafst枚冒u
+pdfjs-find-match-diacritics-checkbox-label = Passa vi冒 broddstafi
+pdfjs-find-entire-word-checkbox-label = Heil or冒
+pdfjs-find-reached-top = N谩冒i efst 铆 skjal, held 谩fram ne冒st
+pdfjs-find-reached-bottom = N谩冒i enda skjals, held 谩fram efst
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } af { $total } passar vi冒
+       *[other] { $current } af { $total } passa vi冒
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Fleiri en { $limit } passar vi冒
+       *[other] Fleiri en { $limit } passa vi冒
+    }
+pdfjs-find-not-found = Fann ekki or冒i冒
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = S铆冒ubreidd
+pdfjs-page-scale-fit = Passa 谩 s铆冒u
+pdfjs-page-scale-auto = Sj谩lfvirkur a冒dr谩ttur
+pdfjs-page-scale-actual = Raunst忙r冒
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = S铆冒a { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Villa kom upp vi冒 a冒 hla冒a inn PDF.
+pdfjs-invalid-file-error = 脫gild e冒a skemmd PDF skr谩.
+pdfjs-missing-file-error = Vantar PDF skr谩.
+pdfjs-unexpected-response-error = 脫v忙nt svar fr谩 net镁j贸ni.
+pdfjs-rendering-error = Upp kom villa vi冒 a冒 birta s铆冒una.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Sk媒ring]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Settu inn lykilor冒 til a冒 opna 镁essa PDF-skr谩.
+pdfjs-password-invalid = 脫gilt lykilor冒. Reyndu aftur.
+pdfjs-password-ok-button = 脥 lagi
+pdfjs-password-cancel-button = H忙tta vi冒
+pdfjs-web-fonts-disabled = Vef leturger冒ir eru 贸virkar: get ekki nota冒 innbygg冒ar PDF leturger冒ir.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texti
+pdfjs-editor-free-text-button-label = Texti
+pdfjs-editor-ink-button =
+    .title = Teikna
+pdfjs-editor-ink-button-label = Teikna
+pdfjs-editor-stamp-button =
+    .title = B忙ta vi冒 e冒a breyta myndum
+pdfjs-editor-stamp-button-label = B忙ta vi冒 e冒a breyta myndum
+pdfjs-editor-highlight-button =
+    .title = 脕herslulita
+pdfjs-editor-highlight-button-label = 脕herslulita
+pdfjs-highlight-floating-button1 =
+    .title = 脕herslulita
+    .aria-label = 脕herslulita
+pdfjs-highlight-floating-button-label = 脕herslulita
+pdfjs-editor-signature-button =
+    .title = B忙ta vi冒 undirritun
+pdfjs-editor-signature-button-label = B忙ta vi冒 undirritun
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Fjarl忙gja teikningu
+pdfjs-editor-remove-freetext-button =
+    .title = Fjarl忙gja texta
+pdfjs-editor-remove-stamp-button =
+    .title = Fjarl忙gja mynd
+pdfjs-editor-remove-highlight-button =
+    .title = Fjarl忙gja 谩herslulit
+pdfjs-editor-remove-signature-button =
+    .title = Fjarl忙gja undirskrift
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Litur
+pdfjs-editor-free-text-size-input = St忙r冒
+pdfjs-editor-ink-color-input = Litur
+pdfjs-editor-ink-thickness-input = 脼ykkt
+pdfjs-editor-ink-opacity-input = 脫gegns忙i
+pdfjs-editor-stamp-add-image-button =
+    .title = B忙ta vi冒 mynd
+pdfjs-editor-stamp-add-image-button-label = B忙ta vi冒 mynd
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 脼ykkt
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Breyta 镁ykkt vi冒 谩herslulitun annarra atri冒a en texta
+pdfjs-editor-signature-add-signature-button =
+    .title = B忙ta vi冒 n媒rri undirritun
+pdfjs-editor-signature-add-signature-button-label = B忙ta vi冒 n媒rri undirritun
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Vistu冒 undirskrift: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Textaritill
+    .default-content = Byrja冒u a冒 skrifa鈥�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alt-varatexti
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Breyta alt-myndatexta
+pdfjs-editor-alt-text-dialog-label = Veldu valkost
+pdfjs-editor-alt-text-dialog-description = Alt-varatexti (auka-myndatexti) hj谩lpar 镁egar f贸lk getur ekki s茅冒 myndina e冒a 镁egar h煤n hle冒st ekki inn.
+pdfjs-editor-alt-text-add-description-label = B忙ttu vi冒 l媒singu
+pdfjs-editor-alt-text-add-description-description = Reyndu a冒 takmarka 镁etta vi冒 1-2 setningar sem l媒sa efninu, umhverfi e冒a a冒ger冒um.
+pdfjs-editor-alt-text-mark-decorative-label = Merkja sem skraut
+pdfjs-editor-alt-text-mark-decorative-description = 脼etta er nota冒 fyrir skrautmyndir, eins og bor冒a e冒a vatnsmerki.
+pdfjs-editor-alt-text-cancel-button = H忙tta vi冒
+pdfjs-editor-alt-text-save-button = Vista
+pdfjs-editor-alt-text-decorative-tooltip = Merkt sem skraut
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Til d忙mis: 鈥濽ngur ma冒ur sest vi冒 bor冒 til a冒 sn忙冒a m谩lt铆冒鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alt-myndatexti
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Efst 铆 vinstra horni - breyta st忙r冒
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Efst 谩 mi冒ju - breyta st忙r冒
+pdfjs-editor-resizer-top-right =
+    .aria-label = Efst 铆 h忙gra horni - breyta st忙r冒
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Mi冒ja til h忙gri - breyta st忙r冒
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Ne冒st 铆 h忙gra horni - breyta st忙r冒
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Ne冒st 谩 mi冒ju - breyta st忙r冒
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Ne冒st 铆 vinstra horni - breyta st忙r冒
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Mi冒ja til vinstri - breyta st忙r冒
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 脕herslulitur
+pdfjs-editor-colorpicker-button =
+    .title = Skipta um lit
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Val lita
+pdfjs-editor-colorpicker-yellow =
+    .title = Gult
+pdfjs-editor-colorpicker-green =
+    .title = Gr忙nt
+pdfjs-editor-colorpicker-blue =
+    .title = Bl谩tt
+pdfjs-editor-colorpicker-pink =
+    .title = Bleikt
+pdfjs-editor-colorpicker-red =
+    .title = Rautt
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Birta allt
+pdfjs-editor-highlight-show-all-button =
+    .title = Birta allt
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Breyta alt-myndatexta (l媒singu 谩 mynd)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = B忙ta vi冒 alt-myndatexta (l媒singu 谩 mynd)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Skrifa冒u l媒singuna 镁铆na h茅r鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Stutt l媒sing fyrir f贸lk sem getur ekki s茅冒 myndina e冒a 镁egar myndin hle冒st ekki inn.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 脼essi alt-myndatexti var b煤inn til sj谩lfvirkt og g忙ti veri冒 贸n谩kv忙mur.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Kanna n谩nar
+pdfjs-editor-new-alt-text-create-automatically-button-label = 脷tb煤a alt-myndatexta sj谩lfvirkt
+pdfjs-editor-new-alt-text-not-now-button = Ekki n煤na
+pdfjs-editor-new-alt-text-error-title = Gat ekki b煤i冒 til alt-myndatexta sj谩lfkrafa
+pdfjs-editor-new-alt-text-error-description = Skrifa冒u 镁inn eiginn alt-myndatexta e冒a reyndu aftur s铆冒ar.
+pdfjs-editor-new-alt-text-error-close-button = Loka
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = S忙kir gervigreindarl铆kan me冒 alt-myndatextum ({ $downloadedSize } af { $totalSize } MB)
+    .aria-valuetext = S忙kir gervigreindarl铆kan me冒 alt-myndatextum ({ $downloadedSize } af { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alt-myndatexta b忙tt vi冒
+pdfjs-editor-new-alt-text-added-button-label = Alt-myndatexta b忙tt vi冒
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Vantar alt-myndatexta
+pdfjs-editor-new-alt-text-missing-button-label = Vantar alt-myndatexta
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Yfirfara alt-myndatexta
+pdfjs-editor-new-alt-text-to-review-button-label = Yfirfara myndatexta
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 脷tb煤i冒 sj谩lfvirkt: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Stillingar fyrir alt-texta myndar
+pdfjs-image-alt-text-settings-button-label = Stillingar fyrir alt-texta myndar
+pdfjs-editor-alt-text-settings-dialog-label = Stillingar fyrir alt-texta myndar
+pdfjs-editor-alt-text-settings-automatic-title = Sj谩lfvirkur alt-myndatexti
+pdfjs-editor-alt-text-settings-create-model-button-label = 脷tb煤a alt-myndatexta sj谩lfvirkt
+pdfjs-editor-alt-text-settings-create-model-description = Stingur upp 谩 l媒singum til a冒 hj谩lpa f贸lki sem getur ekki s茅冒 myndina e冒a 镁egar myndin hle冒st ekki inn.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Gervigreindarl铆kan alt-myndatexta ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Keyrir sta冒bundi冒 谩 t忙kinu 镁铆nu svo g枚gnin 镁铆n haldast undir 镁inni stj贸rn. Nau冒synlegt fyrir sj谩lfvirka alt-myndatexta.
+pdfjs-editor-alt-text-settings-delete-model-button = Ey冒a
+pdfjs-editor-alt-text-settings-download-model-button = S忙kja
+pdfjs-editor-alt-text-settings-downloading-model-button = S忙ki鈥�
+pdfjs-editor-alt-text-settings-editor-title = Ritill fyrir alt-myndatexta
+pdfjs-editor-alt-text-settings-show-dialog-button-label = S媒na alt-myndatextaritil strax 镁egar mynd er b忙tt vi冒
+pdfjs-editor-alt-text-settings-show-dialog-description = Hj谩lpar 镁茅r a冒 tryggja a冒 allar myndirnar 镁铆nar s茅u me冒 alt-myndatexta.
+pdfjs-editor-alt-text-settings-close-button = Loka
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-stamp-added-alert = Mynd b忙tt vi冒
+pdfjs-editor-signature-added-alert = Undirritun b忙tt vi冒
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 脕herslulitun fjarl忙g冒
+pdfjs-editor-undo-bar-message-freetext = Texti fjarl忙g冒ur
+pdfjs-editor-undo-bar-message-ink = Teikning fjarl忙g冒
+pdfjs-editor-undo-bar-message-stamp = Mynd fjarl忙g冒
+pdfjs-editor-undo-bar-message-signature = Undirskrift fjarl忙g冒
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } gl贸sa fjarl忙g冒
+       *[other] { $count } gl贸sur fjarl忙g冒ar
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Afturkalla
+pdfjs-editor-undo-bar-undo-button-label = Afturkalla
+pdfjs-editor-undo-bar-close-button =
+    .title = Loka
+pdfjs-editor-undo-bar-close-button-label = Loka
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 脼essi gluggi gerir notandanum kleift a冒 b煤a til undirskrift til a冒 b忙ta vi冒 PDF-skjal. Notandinn getur breytt nafninu (sem einnig 镁j贸nar sem alt-texti), og vali冒 a冒 vista undirskriftina til endurtekinnar notkunar.
+pdfjs-editor-add-signature-dialog-title = B忙ta vi冒 undirskrift
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Tegund
+    .title = Tegund
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Teikna
+    .title = Teikna
+pdfjs-editor-add-signature-image-button = Mynd
+    .title = Mynd
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Skrifa冒u inn undirskriftina 镁铆na
+    .placeholder = Skrifa冒u inn undirskriftina 镁铆na
+pdfjs-editor-add-signature-draw-placeholder = Teikna冒u undirskriftina 镁铆na
+pdfjs-editor-add-signature-draw-thickness-range-label = 脼ykkt
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Sverleiki teikningar: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Drag冒u skr谩 hinga冒 til a冒 senda inn
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] E冒a sko冒a冒u myndskr谩r
+       *[other] E冒a sko冒a冒u myndskr谩r
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = L媒sing (alt-hj谩lpartexti)
+pdfjs-editor-add-signature-description-input =
+    .title = L媒sing (alt-hj谩lpartexti)
+pdfjs-editor-add-signature-description-default-when-drawing = Undirskrift
+pdfjs-editor-add-signature-clear-button-label = Hreinsa undirskrift
+pdfjs-editor-add-signature-clear-button =
+    .title = Hreinsa undirskrift
+pdfjs-editor-add-signature-save-checkbox = Vista undirskrift
+pdfjs-editor-add-signature-save-warning-message = 脼煤 hefur n谩冒 h谩marki 5 vista冒ra undirskrifta. Fjarl忙g冒u eina til a冒 geta vista冒 fleiri.
+pdfjs-editor-add-signature-image-upload-error-title = Ekki t贸kst a冒 senda inn mynd
+pdfjs-editor-add-signature-image-upload-error-description = Athuga冒u nettenginguna 镁铆na e冒a pr贸fa冒u a冒ra mynd.
+pdfjs-editor-add-signature-image-no-data-error-title = Get ekki breytt 镁essari mynd 铆 undirskrift
+pdfjs-editor-add-signature-image-no-data-error-description = Reyndu a冒 senda inn a冒ra mynd.
+pdfjs-editor-add-signature-error-close-button = Loka
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = H忙tta vi冒
+pdfjs-editor-add-signature-add-button = B忙ta vi冒
+pdfjs-editor-edit-signature-update-button = Uppf忙ra
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Fjarl忙gja vista冒a undirskrift
+pdfjs-editor-delete-signature-button-label1 = Fjarl忙gja vista冒a undirskrift
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Breyta l媒singu
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Breyta l媒singu
diff --git a/public/pdfjs/web/locale/it/viewer.ftl b/public/pdfjs/web/locale/it/viewer.ftl
new file mode 100644
index 0000000..9426b89
--- /dev/null
+++ b/public/pdfjs/web/locale/it/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pagina precedente
+pdfjs-previous-button-label = Precedente
+pdfjs-next-button =
+    .title = Pagina successiva
+pdfjs-next-button-label = Successiva
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pagina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = di { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } di { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Riduci zoom
+pdfjs-zoom-out-button-label = Riduci zoom
+pdfjs-zoom-in-button =
+    .title = Aumenta zoom
+pdfjs-zoom-in-button-label = Aumenta zoom
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Passa alla modalit脿 presentazione
+pdfjs-presentation-mode-button-label = Modalit脿 presentazione
+pdfjs-open-file-button =
+    .title = Apri file
+pdfjs-open-file-button-label = Apri
+pdfjs-print-button =
+    .title = Stampa
+pdfjs-print-button-label = Stampa
+pdfjs-save-button =
+    .title = Salva
+pdfjs-save-button-label = Salva
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Scarica
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Scarica
+pdfjs-bookmark-button =
+    .title = Pagina corrente (mostra URL della pagina corrente)
+pdfjs-bookmark-button-label = Pagina corrente
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Strumenti
+pdfjs-tools-button-label = Strumenti
+pdfjs-first-page-button =
+    .title = Vai alla prima pagina
+pdfjs-first-page-button-label = Vai alla prima pagina
+pdfjs-last-page-button =
+    .title = Vai all鈥檜ltima pagina
+pdfjs-last-page-button-label = Vai all鈥檜ltima pagina
+pdfjs-page-rotate-cw-button =
+    .title = Ruota in senso orario
+pdfjs-page-rotate-cw-button-label = Ruota in senso orario
+pdfjs-page-rotate-ccw-button =
+    .title = Ruota in senso antiorario
+pdfjs-page-rotate-ccw-button-label = Ruota in senso antiorario
+pdfjs-cursor-text-select-tool-button =
+    .title = Attiva strumento di selezione testo
+pdfjs-cursor-text-select-tool-button-label = Strumento di selezione testo
+pdfjs-cursor-hand-tool-button =
+    .title = Attiva strumento mano
+pdfjs-cursor-hand-tool-button-label = Strumento mano
+pdfjs-scroll-page-button =
+    .title = Utilizza scorrimento pagine
+pdfjs-scroll-page-button-label = Scorrimento pagine
+pdfjs-scroll-vertical-button =
+    .title = Scorri le pagine in verticale
+pdfjs-scroll-vertical-button-label = Scorrimento verticale
+pdfjs-scroll-horizontal-button =
+    .title = Scorri le pagine in orizzontale
+pdfjs-scroll-horizontal-button-label = Scorrimento orizzontale
+pdfjs-scroll-wrapped-button =
+    .title = Scorri le pagine in verticale, disponendole da sinistra a destra e andando a capo automaticamente
+pdfjs-scroll-wrapped-button-label = Scorrimento con a capo automatico
+pdfjs-spread-none-button =
+    .title = Non raggruppare pagine
+pdfjs-spread-none-button-label = Nessun raggruppamento
+pdfjs-spread-odd-button =
+    .title = Crea gruppi di pagine che iniziano con numeri di pagina dispari
+pdfjs-spread-odd-button-label = Raggruppamento dispari
+pdfjs-spread-even-button =
+    .title = Crea gruppi di pagine che iniziano con numeri di pagina pari
+pdfjs-spread-even-button-label = Raggruppamento pari
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propriet脿 del documento鈥�
+pdfjs-document-properties-button-label = Propriet脿 del documento鈥�
+pdfjs-document-properties-file-name = Nome file:
+pdfjs-document-properties-file-size = Dimensione file:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte)
+pdfjs-document-properties-title = Titolo:
+pdfjs-document-properties-author = Autore:
+pdfjs-document-properties-subject = Oggetto:
+pdfjs-document-properties-keywords = Parole chiave:
+pdfjs-document-properties-creation-date = Data creazione:
+pdfjs-document-properties-modification-date = Data modifica:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Autore originale:
+pdfjs-document-properties-producer = Produttore PDF:
+pdfjs-document-properties-version = Versione PDF:
+pdfjs-document-properties-page-count = Conteggio pagine:
+pdfjs-document-properties-page-size = Dimensioni pagina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = verticale
+pdfjs-document-properties-page-size-orientation-landscape = orizzontale
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Lettera
+pdfjs-document-properties-page-size-name-legal = Legale
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Visualizzazione web veloce:
+pdfjs-document-properties-linearized-yes = S矛
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = Chiudi
+
+## Print
+
+pdfjs-print-progress-message = Preparazione documento per la stampa鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Annulla
+pdfjs-printing-not-supported = Attenzione: la stampa non 猫 completamente supportata da questo browser.
+pdfjs-printing-not-ready = Attenzione: il PDF non 猫 ancora stato caricato completamente per la stampa.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Attiva/disattiva barra laterale
+pdfjs-toggle-sidebar-notification-button =
+    .title = Attiva/disattiva barra laterale (il documento contiene struttura/allegati/livelli)
+pdfjs-toggle-sidebar-button-label = Attiva/disattiva barra laterale
+pdfjs-document-outline-button =
+    .title = Visualizza la struttura del documento (doppio clic per visualizzare/comprimere tutti gli elementi)
+pdfjs-document-outline-button-label = Struttura documento
+pdfjs-attachments-button =
+    .title = Visualizza allegati
+pdfjs-attachments-button-label = Allegati
+pdfjs-layers-button =
+    .title = Visualizza livelli (doppio clic per ripristinare tutti i livelli allo stato predefinito)
+pdfjs-layers-button-label = Livelli
+pdfjs-thumbs-button =
+    .title = Mostra le miniature
+pdfjs-thumbs-button-label = Miniature
+pdfjs-current-outline-item-button =
+    .title = Trova elemento struttura corrente
+pdfjs-current-outline-item-button-label = Elemento struttura corrente
+pdfjs-findbar-button =
+    .title = Trova nel documento
+pdfjs-findbar-button-label = Trova
+pdfjs-additional-layers = Livelli aggiuntivi
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura della pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Seleziona pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Pagina { $page } di { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Trova
+    .placeholder = Trova nel documento鈥�
+pdfjs-find-previous-button =
+    .title = Trova l鈥檕ccorrenza precedente del testo da cercare
+pdfjs-find-previous-button-label = Precedente
+pdfjs-find-next-button =
+    .title = Trova l鈥檕ccorrenza successiva del testo da cercare
+pdfjs-find-next-button-label = Successivo
+pdfjs-find-highlight-checkbox = Evidenzia
+pdfjs-find-match-case-checkbox-label = Maiuscole/minuscole
+pdfjs-find-match-diacritics-checkbox-label = Segni diacritici
+pdfjs-find-entire-word-checkbox-label = Parole intere
+pdfjs-find-reached-top = Raggiunto l鈥檌nizio della pagina, continua dalla fine
+pdfjs-find-reached-bottom = Raggiunta la fine della pagina, continua dall鈥檌nizio
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } di { $total } corrispondenza
+       *[other] { $current } di { $total } corrispondenze
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Pi霉 di una { $limit } corrispondenza
+       *[other] Pi霉 di { $limit } corrispondenze
+    }
+pdfjs-find-not-found = Testo non trovato
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Larghezza pagina
+pdfjs-page-scale-fit = Adatta a una pagina
+pdfjs-page-scale-auto = Zoom automatico
+pdfjs-page-scale-actual = Dimensioni effettive
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pagina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Si 猫 verificato un errore durante il caricamento del PDF.
+pdfjs-invalid-file-error = File PDF non valido o danneggiato.
+pdfjs-missing-file-error = File PDF non disponibile.
+pdfjs-unexpected-response-error = Risposta imprevista del server
+pdfjs-rendering-error = Si 猫 verificato un errore durante il rendering della pagina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Annotazione: { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Inserire la password per aprire questo file PDF.
+pdfjs-password-invalid = Password non corretta. Riprova.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Annulla
+pdfjs-web-fonts-disabled = I web font risultano disattivati: impossibile utilizzare i caratteri incorporati nel PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Testo
+pdfjs-editor-color-picker-free-text-input =
+    .title = Cambia colore del testo
+pdfjs-editor-free-text-button-label = Testo
+pdfjs-editor-ink-button =
+    .title = Disegna
+pdfjs-editor-color-picker-ink-input =
+    .title = Cambia colore del disegno
+pdfjs-editor-ink-button-label = Disegna
+pdfjs-editor-stamp-button =
+    .title = Aggiungi o rimuovi immagine
+pdfjs-editor-stamp-button-label = Aggiungi o rimuovi immagine
+pdfjs-editor-highlight-button =
+    .title = Evidenzia
+pdfjs-editor-highlight-button-label = Evidenzia
+pdfjs-highlight-floating-button1 =
+    .title = Evidenzia
+    .aria-label = Evidenzia
+pdfjs-highlight-floating-button-label = Evidenzia
+pdfjs-comment-floating-button =
+    .title = Commenta
+    .aria-label = Commenta
+pdfjs-comment-floating-button-label = Commenta
+pdfjs-editor-comment-button =
+    .title = Commenta
+    .aria-label = Commenta
+pdfjs-editor-comment-button-label = Commenta
+pdfjs-editor-signature-button =
+    .title = Aggiungi firma
+pdfjs-editor-signature-button-label = Aggiungi firma
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Modifica evidenziazioni
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Modifica disegni
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor firme: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Modifica immagini
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Rimuovi disegno
+pdfjs-editor-remove-freetext-button =
+    .title = Rimuovi testo
+pdfjs-editor-remove-stamp-button =
+    .title = Rimuovi immagine
+pdfjs-editor-remove-highlight-button =
+    .title = Rimuovi evidenziazione
+pdfjs-editor-remove-signature-button =
+    .title = Rimuovi firma
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Colore
+pdfjs-editor-free-text-size-input = Dimensione
+pdfjs-editor-ink-color-input = Colore
+pdfjs-editor-ink-thickness-input = Spessore
+pdfjs-editor-ink-opacity-input = Opacit脿
+pdfjs-editor-stamp-add-image-button =
+    .title = Aggiungi immagine
+pdfjs-editor-stamp-add-image-button-label = Aggiungi immagine
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Spessore
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Modifica lo spessore della selezione per elementi non testuali
+pdfjs-editor-add-signature-container =
+    .aria-label = Controlli firma e firme salvate
+pdfjs-editor-signature-add-signature-button =
+    .title = Aggiungi nuova firma
+pdfjs-editor-signature-add-signature-button-label = Aggiungi nuova firma
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Firma salvata: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor di testo
+    .default-content = Inizia a digitare鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Commento
+       *[other] Commenti
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Chiudi la barra laterale
+    .aria-label = Chiudi la barra laterale
+pdfjs-editor-comments-sidebar-close-button-label = Chiudi la barra laterale
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Hai notato qualcosa di interessante? Evidenzialo e aggiungi un commento.
+pdfjs-editor-comments-sidebar-no-comments-link = Ulteriori informazioni
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Testo alternativo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Modifica testo alternativo
+pdfjs-editor-alt-text-dialog-label = Scegli un鈥檕pzione
+pdfjs-editor-alt-text-dialog-description = Il testo alternativo (鈥渁lt text鈥�) aiuta quando le persone non possono vedere l鈥檌mmagine o quando l鈥檌mmagine non viene caricata.
+pdfjs-editor-alt-text-add-description-label = Aggiungi una descrizione
+pdfjs-editor-alt-text-add-description-description = Punta a una o due frasi che descrivono l鈥檃rgomento, l鈥檃mbientazione o le azioni.
+pdfjs-editor-alt-text-mark-decorative-label = Contrassegna come decorativa
+pdfjs-editor-alt-text-mark-decorative-description = Viene utilizzato per immagini ornamentali, come bordi o filigrane.
+pdfjs-editor-alt-text-cancel-button = Annulla
+pdfjs-editor-alt-text-save-button = Salva
+pdfjs-editor-alt-text-decorative-tooltip = Contrassegnata come decorativa
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Ad esempio, 鈥淯n giovane si siede a tavola per mangiare鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Testo alternativo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Angolo in alto a sinistra 鈥� ridimensiona
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Lato superiore nel mezzo 鈥� ridimensiona
+pdfjs-editor-resizer-top-right =
+    .aria-label = Angolo in alto a destra 鈥� ridimensiona
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Lato destro nel mezzo 鈥� ridimensiona
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Angolo in basso a destra 鈥� ridimensiona
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Lato inferiore nel mezzo 鈥� ridimensiona
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Angolo in basso a sinistra 鈥� ridimensiona
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Lato sinistro nel mezzo 鈥� ridimensiona
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Colore evidenziatore
+pdfjs-editor-colorpicker-button =
+    .title = Cambia colore
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Colori disponibili
+pdfjs-editor-colorpicker-yellow =
+    .title = Giallo
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Blu
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Rosso
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mostra tutto
+pdfjs-editor-highlight-show-all-button =
+    .title = Mostra tutto
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Modifica testo alternativo (descrizione dell鈥檌mmagine)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Aggiungi testo alternativo (descrizione dell鈥檌mmagine)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Scrivi qui la tua descrizione鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Breve descrizione per le persone che non possono vedere l鈥檌mmagine, o mostrata quando l鈥檌mmagine non si carica.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Questo testo alternativo 猫 stato creato automaticamente e potrebbe non essere accurato.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ulteriori informazioni
+pdfjs-editor-new-alt-text-create-automatically-button-label = Crea automaticamente testo alternativo
+pdfjs-editor-new-alt-text-not-now-button = Non adesso
+pdfjs-editor-new-alt-text-error-title = Impossibile creare automaticamente il testo alternativo
+pdfjs-editor-new-alt-text-error-description = Scrivi il testo alternativo o riprova pi霉 tardi.
+pdfjs-editor-new-alt-text-error-close-button = Chiudi
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Download in corso del modello IA per il testo alternativo ({ $downloadedSize } di { $totalSize } MB)
+    .aria-valuetext = Download in corso del modello IA per il testo alternativo ({ $downloadedSize } di { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Aggiunto testo alternativo
+pdfjs-editor-new-alt-text-added-button-label = Aggiunto testo alternativo
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Testo alternativo mancante
+pdfjs-editor-new-alt-text-missing-button-label = Testo alternativo mancante
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Verifica testo alternativo
+pdfjs-editor-new-alt-text-to-review-button-label = Verifica testo alternativo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creato automaticamente: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Impostazioni testo alternativo per le immagini
+pdfjs-image-alt-text-settings-button-label = Impostazioni testo alternativo per le immagini
+pdfjs-editor-alt-text-settings-dialog-label = Impostazioni testo alternativo per le immagini
+pdfjs-editor-alt-text-settings-automatic-title = Testo alternativo automatico
+pdfjs-editor-alt-text-settings-create-model-button-label = Crea testo alternativo automaticamente
+pdfjs-editor-alt-text-settings-create-model-description = Suggerisce una descrizione per le persone che non possono vedere l鈥檌mmagine, o mostrata quando l鈥檌mmagine non si carica.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modello IA per il testo alternativo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Viene eseguito localmente sul tuo dispositivo in modo che i tuoi dati rimangano riservati. 脠 richiesto per la generazione automatica del testo alternativo.
+pdfjs-editor-alt-text-settings-delete-model-button = Elimina
+pdfjs-editor-alt-text-settings-download-model-button = Scarica
+pdfjs-editor-alt-text-settings-downloading-model-button = Download鈥�
+pdfjs-editor-alt-text-settings-editor-title = Modifica testo alternativo
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostra l鈥檈ditor del testo alternativo non appena si aggiunge un鈥檌mmagine
+pdfjs-editor-alt-text-settings-show-dialog-description = Ti aiuta ad assicurarti che tutte le tue immagini abbiano il testo alternativo.
+pdfjs-editor-alt-text-settings-close-button = Chiudi
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Aggiunta evidenziazione
+pdfjs-editor-freetext-added-alert = Aggiunto testo
+pdfjs-editor-ink-added-alert = Aggiunto disegno
+pdfjs-editor-stamp-added-alert = Aggiunta immagine
+pdfjs-editor-signature-added-alert = Aggiunta firma
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Evidenziazione rimossa
+pdfjs-editor-undo-bar-message-freetext = Testo rimosso
+pdfjs-editor-undo-bar-message-ink = Disegno rimosso
+pdfjs-editor-undo-bar-message-stamp = Immagine rimossa
+pdfjs-editor-undo-bar-message-signature = Firma rimossa
+pdfjs-editor-undo-bar-message-comment = Commento rimosso
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } annotazione rimossa
+       *[other] { $count } annotazioni rimosse
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Annulla
+pdfjs-editor-undo-bar-undo-button-label = Annulla
+pdfjs-editor-undo-bar-close-button =
+    .title = Chiudi
+pdfjs-editor-undo-bar-close-button-label = Chiudi
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Questa finestra consente all鈥檜tente di creare una firma da aggiungere a un documento PDF. L鈥檜tente pu貌 modificare il nome (che verr脿 utilizzato anche come testo alternativo) e, se lo desidera, salvare la firma per riutilizzarla in futuro.
+pdfjs-editor-add-signature-dialog-title = Aggiungi una firma
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Scrivi
+    .title = Scrivi
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Disegna
+    .title = Disegna
+pdfjs-editor-add-signature-image-button = Immagine
+    .title = Immagine
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Digita la tua firma
+    .placeholder = Digita la tua firma
+pdfjs-editor-add-signature-draw-placeholder = Disegna la tua firma
+pdfjs-editor-add-signature-draw-thickness-range-label = Spessore
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Spessore del tratto: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Trascina un file qui per caricarlo
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Oppure scegli un file immagine
+       *[other] Oppure sfoglia i file immagine
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descrizione (testo alternativo)
+pdfjs-editor-add-signature-description-input =
+    .title = Descrizione (testo alternativo)
+pdfjs-editor-add-signature-description-default-when-drawing = Firma
+pdfjs-editor-add-signature-clear-button-label = Cancella firma
+pdfjs-editor-add-signature-clear-button =
+    .title = Cancella firma
+pdfjs-editor-add-signature-save-checkbox = Salva firma
+pdfjs-editor-add-signature-save-warning-message = Hai raggiunto il limite di 5 firme salvate. Rimuovine una per salvarne altre.
+pdfjs-editor-add-signature-image-upload-error-title = Impossibile caricare l鈥檌mmagine
+pdfjs-editor-add-signature-image-upload-error-description = Controlla la connessione di rete o prova con un鈥檃ltra immagine.
+pdfjs-editor-add-signature-image-no-data-error-title = Impossibile convertire questa immagine in una firma
+pdfjs-editor-add-signature-image-no-data-error-description = Prova a caricare un鈥檃ltra immagine.
+pdfjs-editor-add-signature-error-close-button = Chiudi
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Annulla
+pdfjs-editor-add-signature-add-button = Aggiungi
+pdfjs-editor-edit-signature-update-button = Aggiorna
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Modifica commento
+pdfjs-editor-edit-comment-popup-button =
+    .title = Modifica commento
+pdfjs-editor-delete-comment-popup-button-label = Elimina commento
+pdfjs-editor-delete-comment-popup-button =
+    .title = Elimina commento
+pdfjs-show-comment-button =
+    .title = Mostra commento
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Modifica commento
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aggiorna
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Aggiungi commento
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Aggiungi
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Inizia a digitare鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Annulla
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Aggiungi commento
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Attiva/disattiva barra laterale (il documento contiene miniature, struttura, allegati, livelli)
+pdfjs-toggle-views-manager-button1-label = Gestisci pagine
+pdfjs-views-manager-sidebar =
+    .aria-label = Barra laterale
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Regolatore della larghezza della barra laterale
+pdfjs-views-manager-view-selector-button =
+    .title = Viste
+pdfjs-views-manager-view-selector-button-label = Viste
+pdfjs-views-manager-pages-title = Pagine
+pdfjs-views-manager-outlines-title1 = Struttura del documento
+    .title = Struttura del documento (doppio clic per espandere/comprimere tutti gli elementi)
+pdfjs-views-manager-attachments-title = Allegati
+pdfjs-views-manager-layers-title1 = Livelli
+    .title = Livelli (doppio clic per ripristinare tutti i livelli allo stato predefinito)
+pdfjs-views-manager-pages-option-label = Pagine
+pdfjs-views-manager-outlines-option-label = Struttura del documento
+pdfjs-views-manager-attachments-option-label = Allegati
+pdfjs-views-manager-layers-option-label = Livelli
+pdfjs-views-manager-add-file-button =
+    .title = Aggiungi file
+pdfjs-views-manager-add-file-button-label = Aggiungi file
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } selezionata
+       *[other] { $count } selezionate
+    }
+pdfjs-views-manager-pages-status-none-action-label = Seleziona pagine
+pdfjs-views-manager-pages-status-action-button-label = Gestisci
+pdfjs-views-manager-pages-status-copy-button-label = Copia
+pdfjs-views-manager-pages-status-cut-button-label = Taglia
+pdfjs-views-manager-pages-status-delete-button-label = Elimina
+pdfjs-views-manager-pages-status-export-selected-button-label = Esporta selezionate鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] { $count } pagina tagliata
+       *[other] { $count } pagine tagliate
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] { $count } pagina copiata
+       *[other] { $count } pagine copiate
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] { $count } pagina eliminata
+       *[other] { $count } pagine eliminate
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Preparazione file鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Caricamento file鈥�
+pdfjs-views-manager-status-warning-cut-label = Taglio non riuscito. Ricarica la pagina e riprova.
+pdfjs-views-manager-status-warning-copy-label = Copia non riuscita. Ricarica la pagina e riprova.
+pdfjs-views-manager-status-warning-delete-label = Eliminazione non riuscita. Ricarica la pagina e riprova.
+pdfjs-views-manager-status-warning-save-label = Salvataggio non riuscito. Ricarica la pagina e prova di nuovo.
+pdfjs-views-manager-status-undo-button-label = Annulla
+pdfjs-views-manager-status-done-button-label = Fatto
+pdfjs-views-manager-status-close-button =
+    .title = Chiudi
+pdfjs-views-manager-status-close-button-label = Chiudi
+pdfjs-views-manager-paste-button-label = Incolla
+pdfjs-views-manager-paste-button-before =
+    .title = Incolla dopo la prima pagina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Incolla dopo pagina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOVIT脌
+pdfjs-views-manager-waiting-for-file = Caricamento file鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Gestisci pagine
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Rimuovi firma salvata
+pdfjs-editor-delete-signature-button-label1 = Rimuovi firma salvata
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Modifica descrizione
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Modifica descrizione
diff --git a/public/pdfjs/web/locale/ja/viewer.ftl b/public/pdfjs/web/locale/ja/viewer.ftl
new file mode 100644
index 0000000..9601ad5
--- /dev/null
+++ b/public/pdfjs/web/locale/ja/viewer.ftl
@@ -0,0 +1,715 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 鍓嶃伄銉氥兗銈搞伕鎴汇倞銇俱仚
+pdfjs-previous-button-label = 鍓嶃伕
+pdfjs-next-button =
+    .title = 娆°伄銉氥兗銈搞伕閫层伩銇俱仚
+pdfjs-next-button-label = 娆°伕
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 銉氥兗銈�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = / { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 琛ㄧず銈掔府灏忋仐銇俱仚
+pdfjs-zoom-out-button-label = 绺皬
+pdfjs-zoom-in-button =
+    .title = 琛ㄧず銈掓嫛澶с仐銇俱仚
+pdfjs-zoom-in-button-label = 鎷″ぇ
+pdfjs-zoom-select =
+    .title = 鎷″ぇ/绺皬
+pdfjs-presentation-mode-button =
+    .title = 銉椼儸銈笺兂銉嗐兗銈枫儳銉炽儮銉笺儔銇垏銈婃浛銇堛伨銇�
+pdfjs-presentation-mode-button-label = 銉椼儸銈笺兂銉嗐兗銈枫儳銉炽儮銉笺儔
+pdfjs-open-file-button =
+    .title = 銉曘偂銈ゃ儷銈掗枊銇嶃伨銇�
+pdfjs-open-file-button-label = 闁嬨亸
+pdfjs-print-button =
+    .title = 鍗板埛銇椼伨銇�
+pdfjs-print-button-label = 鍗板埛
+pdfjs-save-button =
+    .title = 淇濆瓨銇椼伨銇�
+pdfjs-save-button-label = 淇濆瓨
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 銉�銈︺兂銉兗銉夈仐銇俱仚
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 銉�銈︺兂銉兗銉�
+pdfjs-bookmark-button =
+    .title = 鐝惧湪銇儦銉笺偢銇� URL 銇с仚 (鐝惧湪銇儦銉笺偢銈掕〃绀恒仚銈� URL)
+pdfjs-bookmark-button-label = 鐝惧湪銇儦銉笺偢
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 銉勩兗銉�
+pdfjs-tools-button-label = 銉勩兗銉�
+pdfjs-first-page-button =
+    .title = 鏈�鍒濄伄銉氥兗銈搞伕绉诲嫊銇椼伨銇�
+pdfjs-first-page-button-label = 鏈�鍒濄伄銉氥兗銈搞伕绉诲嫊
+pdfjs-last-page-button =
+    .title = 鏈�寰屻伄銉氥兗銈搞伕绉诲嫊銇椼伨銇�
+pdfjs-last-page-button-label = 鏈�寰屻伄銉氥兗銈搞伕绉诲嫊
+pdfjs-page-rotate-cw-button =
+    .title = 銉氥兗銈搞倰鍙炽伕鍥炶虎銇椼伨銇�
+pdfjs-page-rotate-cw-button-label = 鍙冲洖杌�
+pdfjs-page-rotate-ccw-button =
+    .title = 銉氥兗銈搞倰宸︺伕鍥炶虎銇椼伨銇�
+pdfjs-page-rotate-ccw-button-label = 宸﹀洖杌�
+pdfjs-cursor-text-select-tool-button =
+    .title = 銉嗐偔銈广儓閬告姙銉勩兗銉倰鏈夊姽銇仐銇俱仚
+pdfjs-cursor-text-select-tool-button-label = 銉嗐偔銈广儓閬告姙銉勩兗銉�
+pdfjs-cursor-hand-tool-button =
+    .title = 鎵嬨伄銇层倝銉勩兗銉倰鏈夊姽銇仐銇俱仚
+pdfjs-cursor-hand-tool-button-label = 鎵嬨伄銇层倝銉勩兗銉�
+pdfjs-scroll-page-button =
+    .title = 銉氥兗銈稿崢浣嶃仹銈广偗銉兗銉仐銇俱仚
+pdfjs-scroll-page-button-label = 銉氥兗銈稿崢浣嶃仹銈广偗銉兗銉�
+pdfjs-scroll-vertical-button =
+    .title = 绺︺偣銈儹銉笺儷銇仐銇俱仚
+pdfjs-scroll-vertical-button-label = 绺︺偣銈儹銉笺儷
+pdfjs-scroll-horizontal-button =
+    .title = 妯偣銈儹銉笺儷銇仐銇俱仚
+pdfjs-scroll-horizontal-button-label = 妯偣銈儹銉笺儷
+pdfjs-scroll-wrapped-button =
+    .title = 鎶樸倞杩斻仐銈广偗銉兗銉伀銇椼伨銇�
+pdfjs-scroll-wrapped-button-label = 鎶樸倞杩斻仐銈广偗銉兗銉�
+pdfjs-spread-none-button =
+    .title = 瑕嬮枊銇嶃伀銇椼伨銇涖倱
+pdfjs-spread-none-button-label = 瑕嬮枊銇嶃伀銇椼仾銇�
+pdfjs-spread-odd-button =
+    .title = 濂囨暟銉氥兗銈搁枊濮嬨仹瑕嬮枊銇嶃伀銇椼伨銇�
+pdfjs-spread-odd-button-label = 濂囨暟銉氥兗銈歌闁嬨亶
+pdfjs-spread-even-button =
+    .title = 鍋舵暟銉氥兗銈搁枊濮嬨仹瑕嬮枊銇嶃伀銇椼伨銇�
+pdfjs-spread-even-button-label = 鍋舵暟銉氥兗銈歌闁嬨亶
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 鏂囨浉銇儣銉儜銉嗐偅...
+pdfjs-document-properties-button-label = 鏂囨浉銇儣銉儜銉嗐偅...
+pdfjs-document-properties-file-name = 銉曘偂銈ゃ儷鍚�:
+pdfjs-document-properties-file-size = 銉曘偂銈ゃ儷銈点偆銈�:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 銉愩偆銉�)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 銉愩偆銉�)
+pdfjs-document-properties-title = 銈裤偆銉堛儷:
+pdfjs-document-properties-author = 浣滄垚鑰�:
+pdfjs-document-properties-subject = 浠跺悕:
+pdfjs-document-properties-keywords = 銈兗銉兗銉�:
+pdfjs-document-properties-creation-date = 浣滄垚鏃�:
+pdfjs-document-properties-modification-date = 鏇存柊鏃�:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 銈€儣銉偙銉笺偡銉с兂:
+pdfjs-document-properties-producer = PDF 浣滄垚:
+pdfjs-document-properties-version = PDF 銇儛銉笺偢銉с兂:
+pdfjs-document-properties-page-count = 銉氥兗銈告暟:
+pdfjs-document-properties-page-size = 銉氥兗銈搞偟銈ゃ偤:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 绺�
+pdfjs-document-properties-page-size-orientation-landscape = 妯�
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 銉偪銉�
+pdfjs-document-properties-page-size-name-legal = 銉兗銈儷
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 銈︺偋銉栬〃绀虹敤銇渶閬╁寲:
+pdfjs-document-properties-linearized-yes = 銇亜
+pdfjs-document-properties-linearized-no = 銇勩亜銇�
+pdfjs-document-properties-close-button = 闁夈仒銈�
+
+## Print
+
+pdfjs-print-progress-message = 鏂囨浉銇嵃鍒枫倰婧栧倷銇椼仸銇勩伨銇�...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 銈儯銉炽偦銉�
+pdfjs-printing-not-supported = 璀﹀憡: 銇撱伄銉栥儵銈︺偠銉笺仹銇嵃鍒枫亴瀹屽叏銇偟銉濄兗銉堛仌銈屻仸銇勩伨銇涖倱銆�
+pdfjs-printing-not-ready = 璀﹀憡: PDF 銈掑嵃鍒枫仚銈嬨仧銈併伄瑾伩杈笺伩銇岀祩浜嗐仐銇︺亜銇俱仜銈撱��
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 銈点偆銉夈儛銉艰〃绀恒倰鍒囥倞鏇裤亪銇俱仚
+pdfjs-toggle-sidebar-notification-button =
+    .title = 銈点偆銉夈儛銉艰〃绀恒倰鍒囥倞鏇裤亪銇俱仚 (鏂囨浉銇惈銇俱倢銈嬨偄銈︺儓銉┿偆銉� / 娣讳粯 / 銉偆銉ゃ兗)
+pdfjs-toggle-sidebar-button-label = 銈点偆銉夈儛銉笺伄鍒囥倞鏇裤亪
+pdfjs-document-outline-button =
+    .title = 鏂囨浉銇洰娆°倰琛ㄧず銇椼伨銇� (銉�銉栥儷銈儶銉冦偗銇ч爡鐩倰闁嬮枆銇椼伨銇�)
+pdfjs-document-outline-button-label = 鏂囨浉銇洰娆�
+pdfjs-attachments-button =
+    .title = 娣讳粯銉曘偂銈ゃ儷銈掕〃绀恒仐銇俱仚
+pdfjs-attachments-button-label = 娣讳粯銉曘偂銈ゃ儷
+pdfjs-layers-button =
+    .title = 銉偆銉ゃ兗銈掕〃绀恒仐銇俱仚 (銉�銉栥儷銈儶銉冦偗銇с仚銇广仸銇儸銈ゃ儰銉笺亴鍒濇湡鐘舵厠銇埢銈娿伨銇�)
+pdfjs-layers-button-label = 銉偆銉ゃ兗
+pdfjs-thumbs-button =
+    .title = 绺皬鐗堛倰琛ㄧず銇椼伨銇�
+pdfjs-thumbs-button-label = 绺皬鐗�
+pdfjs-current-outline-item-button =
+    .title = 鐝惧湪銇偄銈︺儓銉┿偆銉抽爡鐩倰妞滅储
+pdfjs-current-outline-item-button-label = 鐝惧湪銇偄銈︺儓銉┿偆銉抽爡鐩�
+pdfjs-findbar-button =
+    .title = 鏂囨浉鍐呫倰妞滅储銇椼伨銇�
+pdfjs-findbar-button-label = 妞滅储
+pdfjs-additional-layers = 杩藉姞銉偆銉ゃ兗
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page } 銉氥兗銈�
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 銉氥兗銈搞伄绺皬鐗�
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = { $page } 銉氥兗銈搞倰閬告姙銇椼伨銇�
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = { $page } / { $total } 銉氥兗銈�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 妞滅储
+    .placeholder = 鏂囨浉鍐呫倰妞滅储...
+pdfjs-find-previous-button =
+    .title = 鐝惧湪銈堛倞鍓嶃伄浣嶇疆銇ф寚瀹氭枃瀛楀垪銇岀従銈屻倠閮ㄥ垎銈掓绱€仐銇俱仚
+pdfjs-find-previous-button-label = 鍓嶃伕
+pdfjs-find-next-button =
+    .title = 鐝惧湪銈堛倞寰屻伄浣嶇疆銇ф寚瀹氭枃瀛楀垪銇岀従銈屻倠閮ㄥ垎銈掓绱€仐銇俱仚
+pdfjs-find-next-button-label = 娆°伕
+pdfjs-find-highlight-checkbox = 銇欍伖銇﹀挤瑾胯〃绀�
+pdfjs-find-match-case-checkbox-label = 澶ф枃瀛�/灏忔枃瀛椼倰鍖哄垾
+pdfjs-find-match-diacritics-checkbox-label = 鐧洪煶鍖哄垾绗﹀彿銈掑尯鍒�
+pdfjs-find-entire-word-checkbox-label = 鍗樿獮涓�鑷�
+pdfjs-find-reached-top = 鏂囨浉鍏堥牠銇埌閬斻仐銇熴伄銇ф湯灏俱亱銈夌稓銇戙仸妞滅储銇椼伨銇�
+pdfjs-find-reached-bottom = 鏂囨浉鏈熬銇埌閬斻仐銇熴伄銇у厛闋亱銈夌稓銇戙仸妞滅储銇椼伨銇�
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count = { $total } 浠朵腑 { $current } 浠剁洰
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit = { $limit } 浠朵互涓婁竴鑷�
+pdfjs-find-not-found = 瑕嬨仱銇嬨倞銇俱仜銈撱仹銇椼仧
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 骞呫伀鍚堛倧銇涖倠
+pdfjs-page-scale-fit = 銉氥兗銈搞伄銈点偆銈恒伀鍚堛倧銇涖倠
+pdfjs-page-scale-auto = 鑷嫊銈恒兗銉�
+pdfjs-page-scale-actual = 瀹熼殯銇偟銈ゃ偤
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = { $page } 銉氥兗銈�
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 銇銇胯炯銇夸腑銇偍銉┿兗銇岀櫤鐢熴仐銇俱仐銇熴��
+pdfjs-invalid-file-error = 鐒″姽銇俱仧銇牬鎼嶃仐銇� PDF 銉曘偂銈ゃ儷銆�
+pdfjs-missing-file-error = PDF 銉曘偂銈ゃ儷銇岃銇ゃ亱銈娿伨銇涖倱銆�
+pdfjs-unexpected-response-error = 銈点兗銉愩兗銇嬨倝浜堟湡銇涖伂蹇滅瓟銇屻亗銈娿伨銇椼仧銆�
+pdfjs-rendering-error = 銉氥兗銈搞伄銉兂銉�銉兂銈颁腑銇偍銉┿兗銇岀櫤鐢熴仐銇俱仐銇熴��
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 娉ㄩ噲]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 銇撱伄 PDF 銉曘偂銈ゃ儷銈掗枊銇忋仧銈併伄銉戙偣銉兗銉夈倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆�
+pdfjs-password-invalid = 銉戙偣銉兗銉夈亴姝c仐銇忋亗銈娿伨銇涖倱銆傘倐銇嗕竴搴﹁│銇椼仸銇忋仩銇曘亜銆�
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = 銈儯銉炽偦銉�
+pdfjs-web-fonts-disabled = 銈︺偋銉栥儠銈┿兂銉堛亴鐒″姽銇仾銇c仸銇勩伨銇�: 鍩嬨倎杈笺伨銈屻仧 PDF 銇儠銈┿兂銉堛倰浣跨敤銇с亶銇俱仜銈撱��
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 銉曘儶銉笺儐銈偣銉堟敞閲堛倰杩藉姞銇椼伨銇�
+pdfjs-editor-color-picker-free-text-input =
+    .title = 銉嗐偔銈广儓鑹层倰澶夋洿銇椼伨銇�
+pdfjs-editor-free-text-button-label = 銉曘儶銉笺儐銈偣銉堟敞閲�
+pdfjs-editor-ink-button =
+    .title = 銈ゃ兂銈敞閲堛倰杩藉姞銇椼伨銇�
+pdfjs-editor-color-picker-ink-input =
+    .title = 銈ゃ兂銈壊銈掑鏇淬仐銇俱仚
+pdfjs-editor-ink-button-label = 銈ゃ兂銈敞閲�
+pdfjs-editor-stamp-button =
+    .title = 鐢诲儚銈掕拷鍔犮伨銇熴伅绶ㄩ泦銇椼伨銇�
+pdfjs-editor-stamp-button-label = 鐢诲儚銈掕拷鍔犮伨銇熴伅绶ㄩ泦
+pdfjs-editor-highlight-button =
+    .title = 寮疯銇椼伨銇�
+pdfjs-editor-highlight-button-label = 寮疯
+pdfjs-highlight-floating-button1 =
+    .title = 寮疯銇椼伨銇�
+    .aria-label = 寮疯銇椼伨銇�
+pdfjs-highlight-floating-button-label = 寮疯
+pdfjs-comment-floating-button =
+    .title = 銈炽儭銉炽儓銈掕拷鍔犮仐銇俱仚
+    .aria-label = 銈炽儭銉炽儓銈掕拷鍔犮仐銇俱仚
+pdfjs-comment-floating-button-label = 銈炽儭銉炽儓
+pdfjs-editor-comment-button =
+    .title = 銈炽儭銉炽儓銈掔法闆嗐仐銇俱仚
+    .aria-label = 銈炽儭銉炽儓銈掔法闆嗐仐銇俱仚
+pdfjs-editor-comment-button-label = 銈炽儭銉炽儓
+pdfjs-editor-signature-button =
+    .title = 缃插悕銈掕拷鍔犮仐銇俱仚
+pdfjs-editor-signature-button-label = 缃插悕銈掕拷鍔�
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 寮疯銈ㄣ儑銈c偪銉�
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 鎻忕敾銈ㄣ儑銈c偪銉�
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 缃插悕銈ㄣ儑銈c偪銉�: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 鐢诲儚銈ㄣ儑銈c偪銉�
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 銈ゃ兂銈敞閲堛倰鍓婇櫎銇椼伨銇�
+pdfjs-editor-remove-freetext-button =
+    .title = 銉嗐偔銈广儓銈掑墛闄ゃ仐銇俱仚
+pdfjs-editor-remove-stamp-button =
+    .title = 鐢诲儚銈掑墛闄ゃ仐銇俱仚
+pdfjs-editor-remove-highlight-button =
+    .title = 寮疯銈掑墛闄ゃ仐銇俱仚
+pdfjs-editor-remove-signature-button =
+    .title = 缃插悕銈掑墛闄ゃ仐銇俱仚
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 鑹�
+pdfjs-editor-free-text-size-input = 銈点偆銈�
+pdfjs-editor-ink-color-input = 鑹�
+pdfjs-editor-ink-thickness-input = 澶仌
+pdfjs-editor-ink-opacity-input = 涓嶉�忔槑搴�
+pdfjs-editor-stamp-add-image-button =
+    .title = 鐢诲儚銈掕拷鍔犮仐銇俱仚
+pdfjs-editor-stamp-add-image-button-label = 鐢诲儚銈掕拷鍔�
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 澶仌
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 銉嗐偔銈广儓浠ュ銇偄銈ゃ儐銉犮倰寮疯銇欍倠鏅傘伄澶仌銈掑鏇淬仐銇俱仚
+pdfjs-editor-add-signature-container =
+    .aria-label = 缃插悕銈炽兂銉堛儹銉笺儷銇ㄤ繚瀛樸仌銈屻仧缃插悕
+pdfjs-editor-signature-add-signature-button =
+    .title = 鏂般仐銇勭讲鍚嶃倰杩藉姞銇椼伨銇�
+pdfjs-editor-signature-add-signature-button-label = 鏂般仐銇勭讲鍚嶃倰杩藉姞
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 淇濆瓨銇曘倢銇熺讲鍚�: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 銉曘儶銉笺儐銈偣銉堟敞閲堛偍銉囥偅銈裤兗
+    .default-content = 銉嗐偔銈广儓銈掑叆鍔涖仐銇︺亸銇犮仌銇�...
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title = 銈炽儭銉炽儓
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 銈点偆銉夈儛銉笺倰闁夈仒銇俱仚
+    .aria-label = 銈点偆銉夈儛銉笺倰闁夈仒銈�
+pdfjs-editor-comments-sidebar-close-button-label = 銈点偆銉夈儛銉笺倰闁夈仒銈�
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 姘椼伀銇倠銇撱仺銇屻亗銈屻伆銆侀伕鎶炪仐銇︺偝銉°兂銉堛倰娈嬨仐銇︺亸銇犮仌銇勩��
+pdfjs-editor-comments-sidebar-no-comments-link = 瑭崇窗鎯呭牨
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 浠f浛銉嗐偔銈广儓
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 浠f浛銉嗐偔銈广儓銈掔法闆�
+pdfjs-editor-alt-text-dialog-label = 銈儣銈枫儳銉炽伄閬告姙
+pdfjs-editor-alt-text-dialog-description = 浠f浛銉嗐偔銈广儓銇敾鍍忋亴琛ㄧず銇曘倢銇亜鍫村悎銈勮銇胯炯銇俱倢銇亜鍫村悎銇儲銉笺偠銉笺伄鍔┿亼銇仾銈娿伨銇欍��
+pdfjs-editor-alt-text-add-description-label = 瑾槑銈掕拷鍔�
+pdfjs-editor-alt-text-add-description-description = 瀵捐薄銈勮ō瀹氥�佸嫊浣溿倰瑾槑銇欍倠鐭亜鏂囩珷銈掕鍏ャ仐銇︺亸銇犮仌銇勩��
+pdfjs-editor-alt-text-mark-decorative-label = 瑁呴>銉炪兗銈倰浠樸亼銈�
+pdfjs-editor-alt-text-mark-decorative-description = 銇撱倢銇尯鍒囥倞绶氥倓銈︺偐銉笺偪銉笺優銉笺偗銇仼銇椋剧敾鍍忋伀浣跨敤銇曘倢銇俱仚銆�
+pdfjs-editor-alt-text-cancel-button = 銈儯銉炽偦銉�
+pdfjs-editor-alt-text-save-button = 淇濆瓨
+pdfjs-editor-alt-text-decorative-tooltip = 瑁呴>銉炪兗銈亴浠樸亜銇︺亜銇俱仚
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 渚�:銆岃嫢銇勪汉銇屻儐銉笺儢銉伄甯伀銇ゃ亜銇﹂浜嬨倰銇椼仸銇勩伨銇欍��
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 浠f浛銉嗐偔銈广儓
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 宸︿笂闅� 鈥� 銈点偆銈哄鏇�
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 涓婁腑澶� 鈥� 銈点偆銈哄鏇�
+pdfjs-editor-resizer-top-right =
+    .aria-label = 鍙充笂闅� 鈥� 銈点偆銈哄鏇�
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 鍙充腑澶� 鈥� 銈点偆銈哄鏇�
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 鍙充笅闅� 鈥� 銈点偆銈哄鏇�
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 涓嬩腑澶� 鈥� 銈点偆銈哄鏇�
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 宸︿笅闅� 鈥� 銈点偆銈哄鏇�
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 宸︿腑澶� 鈥� 銈点偆銈哄鏇�
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 寮疯鑹�
+pdfjs-editor-colorpicker-button =
+    .title = 鑹层倰澶夋洿銇椼伨銇�
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 鑹层伄閬告姙
+pdfjs-editor-colorpicker-yellow =
+    .title = 榛勮壊
+pdfjs-editor-colorpicker-green =
+    .title = 绶戣壊
+pdfjs-editor-colorpicker-blue =
+    .title = 闈掕壊
+pdfjs-editor-colorpicker-pink =
+    .title = 銉斻兂銈壊
+pdfjs-editor-colorpicker-red =
+    .title = 璧よ壊
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 銇欍伖銇﹁〃绀�
+# (^m^) en-US: .title = Show all
+pdfjs-editor-highlight-show-all-button =
+    .title = 寮疯銇〃绀恒倰鍒囥倞鏇裤亪銇俱仚
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 浠f浛銉嗐偔銈广儓銈掔法闆� (鐢诲儚銇鏄�)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 浠f浛銉嗐偔銈广儓銈掕拷鍔� (鐢诲儚銇鏄�)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 銇撱亾銇鏄庛倰瑷樺叆銇椼仸銇忋仩銇曘亜...
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 鐢诲儚銇岃銇胯炯銇俱倢銇亜鍫村悎銈勮銇堛仾銇勪汉銇仧銈併伄鐭亜瑾槑銇с仚銆�
+pdfjs-editor-new-alt-text-disclaimer1 = 銇撱伄浠f浛銉嗐偔銈广儓銇嚜鍕曠殑銇敓鎴愩仌銈屻仧銇熴倎姝g⒑銇с仾銇勫彲鑳芥�с亴銇傘倞銇俱仚銆�
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 瑭崇窗鎯呭牨
+pdfjs-editor-new-alt-text-create-automatically-button-label = 浠f浛銉嗐偔銈广儓銈掕嚜鍕曠敓鎴�
+pdfjs-editor-new-alt-text-not-now-button = 寰屻仹
+pdfjs-editor-new-alt-text-error-title = 浠f浛銉嗐偔銈广儓銈掕嚜鍕曠敓鎴愩仹銇嶃伨銇涖倱銇с仐銇�
+pdfjs-editor-new-alt-text-error-description = 銇旇嚜鍒嗐仹浠f浛銉嗐偔銈广儓銈掓浉銇忋亱寰屻仹銈傘亞涓�搴﹁│銇椼仸銇忋仩銇曘亜銆�
+pdfjs-editor-new-alt-text-error-close-button = 闁夈仒銈�
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 浠f浛銉嗐偔銈广儓 AI 銉€儑銉倰銉�銈︺兂銉兗銉夈仐銇︺亜銇俱仚 ({ $downloadedSize } / { $totalSize } MB)
+    .aria-valuetext = 浠f浛銉嗐偔銈广儓 AI 銉€儑銉倰銉�銈︺兂銉兗銉夈仐銇︺亜銇俱仚 ({ $downloadedSize } / { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 浠f浛銉嗐偔銈广儓銈掕拷鍔犮仐銇俱仐銇�
+pdfjs-editor-new-alt-text-added-button-label = 浠f浛銉嗐偔銈广儓銈掕拷鍔犮仐銇俱仐銇�
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 浠f浛銉嗐偔銈广儓銇屻亗銈娿伨銇涖倱
+pdfjs-editor-new-alt-text-missing-button-label = 浠f浛銉嗐偔銈广儓銇屻亗銈娿伨銇涖倱
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 浠f浛銉嗐偔銈广儓銈掋儸銉撱儱銉�
+pdfjs-editor-new-alt-text-to-review-button-label = 浠f浛銉嗐偔銈广儓銈掋儸銉撱儱銉�
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 鑷嫊鐢熸垚銇曘倢銇俱仐銇�: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 鐢诲儚銇唬鏇裤儐銈偣銉堣ō瀹�
+pdfjs-image-alt-text-settings-button-label = 鐢诲儚銇唬鏇裤儐銈偣銉堣ō瀹�
+pdfjs-editor-alt-text-settings-dialog-label = 鐢诲儚銇唬鏇裤儐銈偣銉堣ō瀹�
+pdfjs-editor-alt-text-settings-automatic-title = 鑷嫊浠f浛銉嗐偔銈广儓
+pdfjs-editor-alt-text-settings-create-model-button-label = 浠f浛銉嗐偔銈广儓銈掕嚜鍕曠敓鎴�
+pdfjs-editor-alt-text-settings-create-model-description = 鐢诲儚銇岃銇胯炯銇俱倢銇亜鍫村悎銈勮銇堛仾銇勪汉銇仧銈併伀瑾槑銈掓彁妗堛仐銇俱仚銆�
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 浠f浛銉嗐偔銈广儓 AI 銉€儑銉� ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = 銉兗銈儷銇鏈笂銇у疅琛屻仌銈屻倠銇熴倎銉囥兗銈裤伅闈炲叕闁嬨伀銇倞銇俱仚銆備唬鏇裤儐銈偣銉堛伄鑷嫊鐢熸垚銇繀瑕併仹銇欍��
+pdfjs-editor-alt-text-settings-delete-model-button = 鍓婇櫎
+pdfjs-editor-alt-text-settings-download-model-button = 銉�銈︺兂銉兗銉�
+pdfjs-editor-alt-text-settings-downloading-model-button = 銉�銈︺兂銉兗銉変腑...
+pdfjs-editor-alt-text-settings-editor-title = 浠f浛銉嗐偔銈广儓銈ㄣ儑銈c偪銉�
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 鐢诲儚銇拷鍔犳檪銇唬鏇裤儐銈偣銉堛偍銉囥偅銈裤兗銈掕〃绀恒仚銈�
+pdfjs-editor-alt-text-settings-show-dialog-description = 銇欍伖銇︺伄鐢诲儚銇唬鏇裤儐銈偣銉堛倰杩藉姞銇欍倠鍔┿亼銇仾銈娿伨銇欍��
+pdfjs-editor-alt-text-settings-close-button = 闁夈仒銈�
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 寮疯琛ㄧず銈掕拷鍔犮仐銇俱仐銇�
+pdfjs-editor-freetext-added-alert = 銉曘儶銉笺儐銈偣銉堟敞閲堛倰杩藉姞銇椼伨銇椼仧
+pdfjs-editor-ink-added-alert = 銈ゃ兂銈敞閲堛倰杩藉姞銇椼伨銇椼仧
+pdfjs-editor-stamp-added-alert = 鐢诲儚銈掕拷鍔犮仐銇俱仐銇�
+pdfjs-editor-signature-added-alert = 缃插悕銈掕拷鍔犮仐銇俱仐銇�
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 寮疯琛ㄧず銇屽墛闄ゃ仌銈屻伨銇椼仧
+pdfjs-editor-undo-bar-message-freetext = 銉曘儶銉笺儐銈偣銉堟敞閲堛亴鍓婇櫎銇曘倢銇俱仐銇�
+pdfjs-editor-undo-bar-message-ink = 銈ゃ兂銈敞閲堛亴鍓婇櫎銇曘倢銇俱仐銇�
+pdfjs-editor-undo-bar-message-stamp = 鐢诲儚銇屽墛闄ゃ仌銈屻伨銇椼仧
+pdfjs-editor-undo-bar-message-signature = 缃插悕銇屽墛闄ゃ仌銈屻伨銇椼仧
+pdfjs-editor-undo-bar-message-comment = 銈炽儭銉炽儓銇屽墛闄ゃ仌銈屻伨銇椼仧
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple = { $count } 鍊嬨伄娉ㄩ噲銇屽墛闄ゃ仌銈屻伨銇椼仧
+pdfjs-editor-undo-bar-undo-button =
+    .title = 鍏冦伀鎴汇仚
+pdfjs-editor-undo-bar-undo-button-label = 鍏冦伀鎴汇仚
+pdfjs-editor-undo-bar-close-button =
+    .title = 闁夈仒銈�
+pdfjs-editor-undo-bar-close-button-label = 闁夈仒銈�
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 銇撱伄銉�銈ゃ偄銉偘銇с伅銉︺兗銈躲兗銇岀讲鍚嶃倰浣滄垚銇椼仸 PDF 鏂囨浉銇拷鍔犮仹銇嶃伨銇欍��
+pdfjs-editor-add-signature-dialog-title = 缃插悕銈掕拷鍔�
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 銈裤偆銉�
+    .title = 銈兗銉溿兗銉夊叆鍔涖仐銇俱仚
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 鎵嬫浉銇�
+    .title = 鎵嬫浉銇嶅叆鍔涖仐銇俱仚
+pdfjs-editor-add-signature-image-button = 鐢诲儚
+    .title = 鐢诲儚銈掓寚瀹氥仐銇俱仚
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 缃插悕銈掋偔銉笺儨銉笺儔鍏ュ姏
+    .placeholder = 缃插悕銈掋偔銉笺儨銉笺儔鍏ュ姏
+pdfjs-editor-add-signature-draw-placeholder = 缃插悕銈掓墜鏇搞亶鍏ュ姏
+pdfjs-editor-add-signature-draw-thickness-range-label = 绶氥伄澶仌
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 绶氥伄澶仌: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 銉曘偂銈ゃ儷銈掋亾銇撱伀銉夈儵銉冦偘銇椼仸銈€儍銉椼儹銉笺儔
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 銇俱仧銇敾鍍忋儠銈°偆銉倰閬告姙
+       *[other] 銇俱仧銇敾鍍忋儠銈°偆銉倰鍙傜収
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 瑾槑 (浠f浛銉嗐偔銈广儓)
+pdfjs-editor-add-signature-description-input =
+    .title = 瑾槑 (浠f浛銉嗐偔銈广儓) 銈掕拷鍔犮仐銇俱仚
+pdfjs-editor-add-signature-description-default-when-drawing = 缃插悕
+pdfjs-editor-add-signature-clear-button-label = 缃插悕銈掓秷鍘�
+pdfjs-editor-add-signature-clear-button =
+    .title = 缃插悕銈掓秷鍘汇仐銇俱仚
+pdfjs-editor-add-signature-save-checkbox = 缃插悕銈掍繚瀛�
+pdfjs-editor-add-signature-save-warning-message = 淇濆瓨銇曘倢銇熺讲鍚嶃亴涓婇檺銇� 5 鍊嬨伀閬斻仐銇俱仐銇熴�傘仌銈夈伀淇濆瓨銇欍倠銇伅銇勩仛銈屻亱銈掑墛闄ゃ仐銇︺亸銇犮仌銇勩��
+pdfjs-editor-add-signature-image-upload-error-title = 鐢诲儚銈掋偄銉冦儣銉兗銉夈仹銇嶃伨銇涖倱
+pdfjs-editor-add-signature-image-upload-error-description = 銉嶃儍銉堛儻銉笺偗鎺ョ稓銈掔⒑瑾嶃仚銈嬨亱鍒ャ伄鐢诲儚銈掕│銇椼仸銇忋仩銇曘亜銆�
+pdfjs-editor-add-signature-image-no-data-error-title = 銇撱伄鐢诲儚銇讲鍚嶃伀澶夋彌銇с亶銇俱仜銈�
+pdfjs-editor-add-signature-image-no-data-error-description = 鍒ャ伄鐢诲儚銈掋偄銉冦儣銉兗銉夈仐銇︺亸銇犮仌銇勩��
+pdfjs-editor-add-signature-error-close-button = 闁夈仒銈�
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 銈儯銉炽偦銉�
+pdfjs-editor-add-signature-add-button = 杩藉姞
+pdfjs-editor-edit-signature-update-button = 鏇存柊
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 銈炽儭銉炽儓銈掔法闆�
+pdfjs-editor-edit-comment-popup-button =
+    .title = 銈炽儭銉炽儓銈掔法闆嗐仐銇俱仚
+pdfjs-editor-delete-comment-popup-button-label = 銈炽儭銉炽儓銈掑墛闄�
+pdfjs-editor-delete-comment-popup-button =
+    .title = 銈炽儭銉炽儓銈掑墛闄ゃ仐銇俱仚
+pdfjs-show-comment-button =
+    .title = 銈炽儭銉炽儓銈掕〃绀恒仐銇俱仚
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 銈炽儭銉炽儓銈掔法闆�
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 鏇存柊
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 銈炽儭銉炽儓銈掕拷鍔�
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 杩藉姞
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 銈炽儭銉炽儓銈掑叆鍔涖仐銇︺亸銇犮仌銇�...
+pdfjs-editor-edit-comment-dialog-cancel-button = 銈儯銉炽偦銉�
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 銈炽儭銉炽儓銈掕拷鍔犮仐銇俱仚
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 銈点偆銉夈儛銉笺倰鍒囥倞鏇裤亪銇俱仚 (鏂囨浉銇惈銇俱倢銈嬨偟銉犮儘銈ゃ儷銆併偄銈︺儓銉┿偆銉炽�佹坊浠樸儑銉笺偪銆併儸銈ゃ儰銉�)
+pdfjs-toggle-views-manager-button1-label = 銉氥兗銈搞倰绠$悊
+pdfjs-views-manager-sidebar =
+    .aria-label = 銈点偆銉夈儛銉�
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 銈点偆銉夈儛銉笺伄骞呭鏇�
+pdfjs-views-manager-view-selector-button =
+    .title = 銉撱儱銉�
+pdfjs-views-manager-view-selector-button-label = 銉撱儱銉�
+pdfjs-views-manager-pages-title = 銉氥兗銈�
+pdfjs-views-manager-outlines-title1 = 鏂囨浉銇偄銈︺儓銉┿偆銉�
+    .title = 鏂囨浉銇偄銈︺儓銉┿偆銉� (銉�銉栥儷銈儶銉冦偗銇с仚銇广仸銇爡鐩倰灞曢枊/鎶樸倞銇熴仧銇�)
+pdfjs-views-manager-attachments-title = 娣讳粯銉囥兗銈�
+pdfjs-views-manager-layers-title1 = 銉偆銉ゃ兗
+    .title = 銉偆銉ゃ兗 (銉�銉栥儷銈儶銉冦偗銇с仚銇广仸銇儸銈ゃ儰銉笺倰鏃㈠畾鐘舵厠銇儶銈汇儍銉�)
+pdfjs-views-manager-pages-option-label = 銉氥兗銈�
+pdfjs-views-manager-outlines-option-label = 鏂囨浉銇偄銈︺儓銉┿偆銉�
+pdfjs-views-manager-attachments-option-label = 娣讳粯銉囥兗銈�
+pdfjs-views-manager-layers-option-label = 銉偆銉ゃ兗
+pdfjs-views-manager-add-file-button =
+    .title = 銉曘偂銈ゃ儷銈掕拷鍔犮仐銇俱仚
+pdfjs-views-manager-add-file-button-label = 銉曘偂銈ゃ儷銈掕拷鍔�
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label = { $count } 銉氥兗銈搁伕鎶炰腑
+pdfjs-views-manager-pages-status-none-action-label = 銉氥兗銈搞倰閬告姙
+pdfjs-views-manager-pages-status-action-button-label = 绠$悊
+pdfjs-views-manager-pages-status-copy-button-label = 銈炽償銉�
+pdfjs-views-manager-pages-status-cut-button-label = 鍒囥倞鍙栥倞
+pdfjs-views-manager-pages-status-delete-button-label = 鍓婇櫎
+pdfjs-views-manager-pages-status-export-selected-button-label = 閬告姙銇椼仧銉氥兗銈搞倰銈ㄣ偗銈广儩銉笺儓...
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label = { $count } 銉氥兗銈搞倰鍒囥倞鍙栥倞銇椼伨銇椼仧
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label = { $count } 銉氥兗銈搞倰銈炽償銉笺仐銇俱仐銇�
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label = { $count } 銉氥兗銈搞倰鍓婇櫎銇椼伨銇椼仧
+pdfjs-views-manager-pages-status-waiting-ready-label = 銉曘偂銈ゃ儷銈掓簴鍌欍仐銇︺亜銇俱仚...
+pdfjs-views-manager-pages-status-waiting-uploading-label = 銉曘偂銈ゃ儷銈掋偄銉冦儣銉兗銉夈仐銇︺亜銇俱仚...
+pdfjs-views-manager-status-warning-cut-label = 鍒囥倞鍙栥倞銇с亶銇俱仜銈撱仹銇椼仧銆傘儦銉笺偢銈掓洿鏂般仐銇︺倐銇嗕竴搴﹁│銇椼仸銇忋仩銇曘亜銆�
+pdfjs-views-manager-status-warning-copy-label = 銈炽償銉笺仹銇嶃伨銇涖倱銇с仐銇熴�傘儦銉笺偢銈掓洿鏂般仐銇︺倐銇嗕竴搴﹁│銇椼仸銇忋仩銇曘亜銆�
+pdfjs-views-manager-status-warning-delete-label = 鍓婇櫎銇с亶銇俱仜銈撱仹銇椼仧銆傘儦銉笺偢銈掓洿鏂般仐銇︺倐銇嗕竴搴﹁│銇椼仸銇忋仩銇曘亜銆�
+pdfjs-views-manager-status-warning-save-label = 淇濆瓨銇с亶銇俱仜銈撱仹銇椼仧銆傘儦銉笺偢銈掓洿鏂般仐銇︺倐銇嗕竴搴﹁│銇椼仸銇忋仩銇曘亜銆�
+pdfjs-views-manager-status-undo-button-label = 鍏冦伀鎴汇仚
+pdfjs-views-manager-status-done-button-label = 瀹屼簡
+pdfjs-views-manager-status-close-button =
+    .title = 闁夈仒銈�
+pdfjs-views-manager-status-close-button-label = 闁夈仒銈�
+pdfjs-views-manager-paste-button-label = 璨笺倞浠樸亼
+pdfjs-views-manager-paste-button-before =
+    .title = 鏈�鍒濄伄銉氥兗銈搞伄鍓嶃伀璨笺倞浠樸亼銇俱仚
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = { $page } 銉氥兗銈搞伄寰屻伀璨笺倞浠樸亼銇俱仚
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 鏂版鑳�
+pdfjs-views-manager-waiting-for-file = 銉曘偂銈ゃ儷銈掋偄銉冦儣銉兗銉夈仐銇︺亜銇俱仚...
+pdfjs-toggle-views-manager-button1 =
+    .title = 銉氥兗銈搞倰绠$悊
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 淇濆瓨銇曘倢銇熺讲鍚嶃倰鍓婇櫎銇椼伨銇�
+pdfjs-editor-delete-signature-button-label1 = 淇濆瓨銇曘倢銇熺讲鍚嶃倰鍓婇櫎
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 瑾槑銈掔法闆�
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 瑾槑銇法闆�
diff --git a/public/pdfjs/web/locale/ka/viewer.ftl b/public/pdfjs/web/locale/ka/viewer.ftl
new file mode 100644
index 0000000..a7828e2
--- /dev/null
+++ b/public/pdfjs/web/locale/ka/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 醿儤醿溼儛 醿掅儠醿斸儬醿撫儤
+pdfjs-previous-button-label = 醿儤醿溼儛
+pdfjs-next-button =
+    .title = 醿ㄡ償醿涐儞醿斸儝醿� 醿掅儠醿斸儬醿撫儤
+pdfjs-next-button-label = 醿ㄡ償醿涐儞醿斸儝醿�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 醿掅儠醿斸儬醿撫儤
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount }-醿撫儛醿�
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } { $pagesCount }-醿撫儛醿�)
+pdfjs-zoom-out-button =
+    .title = 醿栣儩醿涐儤醿� 醿ㄡ償醿涐儶醿樶儬醿斸儜醿�
+pdfjs-zoom-out-button-label = 醿撫儛醿ㄡ儩醿犪償醿戓儛
+pdfjs-zoom-in-button =
+    .title = 醿栣儩醿涐儤醿� 醿掅儛醿栣儬醿撫儛
+pdfjs-zoom-in-button-label = 醿涐儩醿愥儺醿氠儩醿斸儜醿�
+pdfjs-zoom-select =
+    .title = 醿栣儩醿涐儛
+pdfjs-presentation-mode-button =
+    .title = 醿儛醿犪儞醿掅償醿溼儤醿� 醿犪償醿熱儤醿涐儢醿� 醿掅儛醿撫儛醿犪儣醿曖儛
+pdfjs-presentation-mode-button-label = 醿儛醿犪儞醿掅償醿溼儤醿� 醿犪償醿熱儤醿涐儤
+pdfjs-open-file-button =
+    .title = 醿め儛醿樶儦醿樶儭 醿掅儛醿儭醿溼儛
+pdfjs-open-file-button-label = 醿掅儛醿儭醿溼儛
+pdfjs-print-button =
+    .title = 醿愥儧醿濁儜醿斸儹醿撫儠醿�
+pdfjs-print-button-label = 醿愥儧醿濁儜醿斸儹醿撫儠醿�
+pdfjs-save-button =
+    .title = 醿ㄡ償醿溼儛醿儠醿�
+pdfjs-save-button-label = 醿ㄡ償醿溼儛醿儠醿�
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 醿┽儛醿涐儩醿⑨儠醿樶儬醿椺儠醿�
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 醿┽儛醿涐儩醿⑨儠醿樶儬醿椺儠醿�
+pdfjs-bookmark-button =
+    .title = 醿涐儤醿涐儞醿樶儨醿愥儬醿� 醿掅儠醿斸儬醿撫儤 (醿戓儧醿a儦醿� 醿愥儧 醿掅儠醿斸儬醿撫儤醿♂儣醿曖儤醿�)
+pdfjs-bookmark-button-label = 醿涐儤醿涐儞醿樶儨醿愥儬醿� 醿掅儠醿斸儬醿撫儤
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 醿償醿氠儭醿愥儸醿п儩醿斸儜醿�
+pdfjs-tools-button-label = 醿償醿氠儭醿愥儸醿п儩醿斸儜醿�
+pdfjs-first-page-button =
+    .title = 醿炨儤醿犪儠醿斸儦 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+pdfjs-first-page-button-label = 醿炨儤醿犪儠醿斸儦 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+pdfjs-last-page-button =
+    .title = 醿戓儩醿氠儩 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+pdfjs-last-page-button-label = 醿戓儩醿氠儩 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+pdfjs-page-rotate-cw-button =
+    .title = 醿♂儛醿愥儣醿樶儭 醿樶儭醿犪儤醿� 醿涐儤醿涐儛醿犪儣醿a儦醿斸儜醿樶儣 醿ㄡ償醿戓儬醿a儨醿斸儜醿�
+pdfjs-page-rotate-cw-button-label = 醿涐儛醿犪儻醿曖儨醿樶儠 醿掅儛醿撫儛醿戓儬醿a儨醿斸儜醿�
+pdfjs-page-rotate-ccw-button =
+    .title = 醿♂儛醿愥儣醿樶儭 醿樶儭醿犪儤醿� 醿♂儛醿炨儤醿犪儤醿♂優醿樶儬醿濁儞 醿ㄡ償醿戓儬醿a儨醿斸儜醿�
+pdfjs-page-rotate-ccw-button-label = 醿涐儛醿犪儶醿儨醿樶儠 醿掅儛醿撫儛醿戓儬醿a儨醿斸儜醿�
+pdfjs-cursor-text-select-tool-button =
+    .title = 醿涐儩醿♂儛醿溼儤醿ㄡ儨醿� 醿涐儛醿┽儠醿斸儨醿斸儜醿氠儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儛
+pdfjs-cursor-text-select-tool-button-label = 醿涐儩醿♂儛醿溼儤醿ㄡ儨醿� 醿涐儛醿┽儠醿斸儨醿斸儜醿斸儦醿�
+pdfjs-cursor-hand-tool-button =
+    .title = 醿掅儛醿撫儛醿♂儛醿愥儞醿掅儤醿氠償醿戓償醿氠儤 醿涐儛醿┽儠醿斸儨醿斸儜醿氠儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儛
+pdfjs-cursor-hand-tool-button-label = 醿掅儛醿撫儛醿♂儛醿愥儞醿掅儤醿氠償醿戓償醿氠儤
+pdfjs-scroll-page-button =
+    .title = 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿愥儞醿掅儤醿氠償醿戓儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儛
+pdfjs-scroll-page-button-label = 醿掅儠醿斸儬醿撫儴醿樶儠醿� 醿掅儛醿撫儛醿愥儞醿掅儤醿氠償醿戓儛
+pdfjs-scroll-vertical-button =
+    .title = 醿掅儠醿斸儬醿撫償醿戓儤醿� 醿ㄡ儠醿斸儯醿氠儛醿� 醿┽儠醿斸儨醿斸儜醿�
+pdfjs-scroll-vertical-button-label = 醿ㄡ儠醿斸儯醿氠儤 醿掅儛醿撫儛醿愥儞醿掅儤醿氠償醿戓儛
+pdfjs-scroll-horizontal-button =
+    .title = 醿掅儠醿斸儬醿撫償醿戓儤醿� 醿椺儛醿犪儛醿栣儯醿氠儛醿� 醿┽儠醿斸儨醿斸儜醿�
+pdfjs-scroll-horizontal-button-label = 醿掅儛醿溼儤醿曖儤 醿掅儛醿撫儛醿愥儞醿掅儤醿氠償醿戓儛
+pdfjs-scroll-wrapped-button =
+    .title = 醿掅儠醿斸儬醿撫償醿戓儤醿� 醿儺醿犪儤醿氠儯醿犪儛醿� 醿┽儠醿斸儨醿斸儜醿�
+pdfjs-scroll-wrapped-button-label = 醿儺醿犪儤醿氠儯醿犪儤 醿掅儛醿撫儛醿愥儞醿掅儤醿氠償醿戓儛
+pdfjs-spread-none-button =
+    .title = 醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿ㄡ儦醿樶儭 醿掅儛醿犪償醿ㄡ償
+pdfjs-spread-none-button-label = 醿儛醿氠儝醿曖償醿犪儞醿樶儛醿溼儤 醿┽儠醿斸儨醿斸儜醿�
+pdfjs-spread-odd-button =
+    .title = 醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿ㄡ儦醿� 醿欋償醿溼儮醿� 醿掅儠醿斸儬醿撫儤醿撫儛醿�
+pdfjs-spread-odd-button-label = 醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿欋償醿溼儮醿樶儞醿愥儨
+pdfjs-spread-even-button =
+    .title = 醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿ㄡ儦醿� 醿氠儯醿儤 醿掅儠醿斸儬醿撫儤醿撫儛醿�
+pdfjs-spread-even-button-label = 醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿氠儯醿儤醿撫儛醿�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿ㄡ償醿♂儛醿償醿戔��
+pdfjs-document-properties-button-label = 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿ㄡ償醿♂儛醿償醿戔��
+pdfjs-document-properties-file-name = 醿め儛醿樶儦醿樶儭 醿♂儛醿償醿氠儤:
+pdfjs-document-properties-file-size = 醿め儛醿樶儦醿樶儭 醿涐儩醿儯醿氠儩醿戓儛:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 醿欋儜醿愥儤醿⑨儤 ({ $b } 醿戓儛醿樶儮醿�)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 醿涐儜醿愥儤醿⑨儤 ({ $b } 醿戓儛醿樶儮醿�)
+pdfjs-document-properties-title = 醿♂儛醿椺儛醿a儬醿�:
+pdfjs-document-properties-author = 醿ㄡ償醿涐儱醿涐儨醿斸儦醿�:
+pdfjs-document-properties-subject = 醿椺償醿涐儛:
+pdfjs-document-properties-keywords = 醿♂儛醿欋儠醿愥儨醿儩 醿♂儤醿⑨儳醿曖償醿戓儤:
+pdfjs-document-properties-creation-date = 醿ㄡ償醿メ儧醿溼儤醿� 醿撫儬醿�:
+pdfjs-document-properties-modification-date = 醿┽儛醿♂儸醿濁儬醿斸儜醿樶儭 醿撫儬醿�:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 醿ㄡ償醿涐儞醿掅償醿溼償醿氠儤:
+pdfjs-document-properties-producer = PDF-醿ㄡ償醿涐儞醿掅償醿溼償醿氠儤:
+pdfjs-document-properties-version = PDF-醿曖償醿犪儭醿樶儛:
+pdfjs-document-properties-page-count = 醿掅儠醿斸儬醿撫償醿戓儤:
+pdfjs-document-properties-page-size = 醿掅儠醿斸儬醿撫儤醿� 醿栣儩醿涐儛:
+pdfjs-document-properties-page-size-unit-inches = 醿撫儯醿樶儧醿�
+pdfjs-document-properties-page-size-unit-millimeters = 醿涐儧
+pdfjs-document-properties-page-size-orientation-portrait = 醿ㄡ儠醿斸儯醿氠儛醿�
+pdfjs-document-properties-page-size-orientation-landscape = 醿椺儛醿犪儛醿栣儯醿氠儛醿�
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 醿涐儭醿a儜醿a儱醿� 醿曖償醿戓儵醿曖償醿溼償醿戓儛:
+pdfjs-document-properties-linearized-yes = 醿撫儤醿愥儺
+pdfjs-document-properties-linearized-no = 醿愥儬醿�
+pdfjs-document-properties-close-button = 醿撫儛醿儯醿犪儠醿�
+
+## Print
+
+pdfjs-print-progress-message = 醿撫儩醿欋儯醿涐償醿溼儮醿� 醿涐儢醿愥儞醿撫償醿戓儛 醿愥儧醿濁儭醿愥儜醿斸儹醿撫儛醿撯��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 醿掅儛醿a儱醿涐償醿戓儛
+pdfjs-printing-not-supported = 醿掅儛醿め儬醿椺儺醿樶儦醿斸儜醿�: 醿愥儧醿濁儜醿斸儹醿撫儠醿� 醿愥儧 醿戓儬醿愥儯醿栣償醿犪儴醿� 醿愥儬醿愥儛 醿♂儬醿a儦醿愥儞 醿涐儺醿愥儬醿撫儛醿償醿犪儤醿氠儤.
+pdfjs-printing-not-ready = 醿掅儛醿め儬醿椺儺醿樶儦醿斸儜醿�: PDF 醿♂儬醿a儦醿愥儞 醿┽儛醿⑨儠醿樶儬醿椺儯醿氠儤 醿愥儬醿愥儛, 醿愥儧醿濁儜醿斸儹醿撫儠醿樶儭 醿撫儛醿♂儛醿儳醿斸儜醿愥儞.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 醿掅儠醿斸儬醿撫儤醿椺儛 醿栣儩醿氠儤醿� 醿掅儛醿涐儩醿┽償醿溼儛/醿撫儛醿涐儛醿氠儠醿�
+pdfjs-toggle-sidebar-notification-button =
+    .title = 醿掅儠醿斸儬醿撫儤醿椺儤 醿栣儩醿氠儤醿� 醿掅儛醿涐儩醿┽償醿溼儛 (醿ㄡ償醿樶儶醿愥儠醿� 醿♂儛醿犪儵醿斸儠醿�/醿撫儛醿溼儛醿犪儣醿�/醿ㄡ儬醿斸償醿戓儭)
+pdfjs-toggle-sidebar-button-label = 醿掅儠醿斸儬醿撫儤醿椺儛 醿栣儩醿氠儤醿� 醿掅儛醿涐儩醿┽償醿溼儛/醿撫儛醿涐儛醿氠儠醿�
+pdfjs-document-outline-button =
+    .title = 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿♂儛醿犪儵醿斸儠醿樶儭 醿┽儠醿斸儨醿斸儜醿� (醿濁儬醿涐儛醿掅儤 醿儥醿愥優醿樶儣 醿椺儤醿椺儩醿斸儯醿氠儤醿� 醿┽儛醿涐儩醿ㄡ儦醿�/醿愥儥醿斸儶醿曖儛)
+pdfjs-document-outline-button-label = 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿♂儛醿犪儵醿斸儠醿�
+pdfjs-attachments-button =
+    .title = 醿撫儛醿溼儛醿犪儣醿斸儜醿樶儭 醿┽儠醿斸儨醿斸儜醿�
+pdfjs-attachments-button-label = 醿撫儛醿溼儛醿犪儣醿斸儜醿�
+pdfjs-layers-button =
+    .title = 醿ㄡ儬醿斸償醿戓儤醿� 醿掅儛醿涐儩醿┽償醿溼儛 (醿濁儬醿涐儛醿掅儤 醿儥醿愥優醿樶儣 醿п儠醿斸儦醿� 醿ㄡ儬醿樶儭 醿溼儛醿掅儯醿氠儤醿♂儺醿涐償醿曖儢醿� 醿撫儛醿戓儬醿a儨醿斸儜醿�)
+pdfjs-layers-button-label = 醿ㄡ儬醿斸償醿戓儤
+pdfjs-thumbs-button =
+    .title = 醿ㄡ償醿椺儠醿愥儦醿樶償醿犪償醿戓儛
+pdfjs-thumbs-button-label = 醿斸儭醿欋儤醿栣償醿戓儤
+pdfjs-current-outline-item-button =
+    .title = 醿涐儤醿涐儞醿樶儨醿愥儬醿� 醿掅儠醿斸儬醿撫儤醿� 醿涐儩醿溼儛醿儠醿� 醿♂儛醿犪儵醿斸儠醿ㄡ儤
+pdfjs-current-outline-item-button-label = 醿涐儤醿涐儞醿樶儨醿愥儬醿� 醿掅儠醿斸儬醿撫儤 醿♂儛醿犪儵醿斸儠醿ㄡ儤
+pdfjs-findbar-button =
+    .title = 醿炨儩醿曖儨醿� 醿撫儩醿欋儯醿涐償醿溼儮醿ㄡ儤
+pdfjs-findbar-button-label = 醿儤醿斸儜醿�
+pdfjs-additional-layers = 醿撫儛醿涐儛醿⑨償醿戓儤醿椺儤 醿ㄡ儬醿斸償醿戓儤
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 醿掅儠醿斸儬醿撫儤 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 醿掅儠醿斸儬醿撫儤醿� 醿ㄡ償醿椺儠醿愥儦醿樶償醿犪償醿戓儛 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 醿涐儩醿溼儤醿ㄡ儨醿斸儣 { $page } 醿掅儠醿斸儬醿撫儤
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 醿掅儠醿斸儬醿撫儤 { $page }, 醿♂儯醿� { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 醿儤醿斸儜醿�
+    .placeholder = 醿炨儩醿曖儨醿� 醿撫儩醿欋儯醿涐償醿溼儮醿ㄡ儤鈥�
+pdfjs-find-previous-button =
+    .title = 醿儤醿溼儛 醿撫儛醿涐儣醿儠醿斸儠醿樶儭 醿炨儩醿曖儨醿�
+pdfjs-find-previous-button-label = 醿儤醿溼儛
+pdfjs-find-next-button =
+    .title = 醿涐儩醿涐儞醿斸儠醿溼儩 醿撫儛醿涐儣醿儠醿斸儠醿樶儭 醿炨儩醿曖儨醿�
+pdfjs-find-next-button-label = 醿ㄡ償醿涐儞醿斸儝醿�
+pdfjs-find-highlight-checkbox = 醿п儠醿斸儦醿愥儰醿犪儤醿� 醿涐儩醿溼儤醿ㄡ儠醿溼儛
+pdfjs-find-match-case-checkbox-label = 醿涐儣醿愥儠醿犪儯醿氠儤醿�
+pdfjs-find-match-diacritics-checkbox-label = 醿溼儤醿ㄡ儨醿斸儜醿樶儣
+pdfjs-find-entire-word-checkbox-label = 醿涐儣醿氠儤醿愥儨醿� 醿♂儤醿⑨儳醿曖償醿戓儤
+pdfjs-find-reached-top = 醿涐儤醿︶儸醿斸儯醿氠儤醿� 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿撫儛醿♂儛醿儳醿樶儭醿�, 醿掅儬醿償醿氠儞醿斸儜醿� 醿戓儩醿氠儩醿撫儛醿�
+pdfjs-find-reached-bottom = 醿涐儤醿︶儸醿斸儯醿氠儤醿� 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿戓儩醿氠儩, 醿掅儬醿償醿氠儞醿斸儜醿� 醿撫儛醿♂儛醿儳醿樶儭醿樶儞醿愥儨
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] 醿椺儛醿溼儺醿曖償醿撫儬醿� { $current }, 醿♂儯醿� { $total }
+       *[other] 醿椺儛醿溼儺醿曖償醿撫儬醿� { $current }, 醿♂儯醿� { $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 醿愥儬醿愥儨醿愥儥醿氠償醿� { $limit } 醿椺儛醿溼儺醿曖償醿撫儬醿�
+       *[other] 醿愥儬醿愥儨醿愥儥醿氠償醿� { $limit } 醿椺儛醿溼儺醿曖償醿撫儬醿�
+    }
+pdfjs-find-not-found = 醿め儬醿愥儢醿� 醿曖償醿� 醿涐儩醿樶儷醿斸儜醿溼儛
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 醿掅儠醿斸儬醿撫儤醿� 醿♂儤醿掅儛醿溼償醿栣償
+pdfjs-page-scale-fit = 醿涐儣醿氠儤醿愥儨醿� 醿掅儠醿斸儬醿撫儤
+pdfjs-page-scale-auto = 醿愥儠醿⑨儩醿涐儛醿⑨儯醿犪儤
+pdfjs-page-scale-actual = 醿♂儛醿儳醿樶儭醿� 醿栣儩醿涐儛
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 醿掅儠醿斸儬醿撫儤 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 醿ㄡ償醿儞醿濁儧醿�, PDF-醿め儛醿樶儦醿樶儭 醿┽儛醿⑨儠醿樶儬醿椺儠醿樶儭醿愥儭.
+pdfjs-invalid-file-error = 醿愥儬醿愥儧醿愥儬醿椺償醿戓儯醿氠儤 醿愥儨 醿撫儛醿栣儤醿愥儨醿斸儜醿a儦醿� PDF-醿め儛醿樶儦醿�.
+pdfjs-missing-file-error = 醿溼儛醿欋儦醿a儦醿� PDF-醿め儛醿樶儦醿�.
+pdfjs-unexpected-response-error = 醿♂償醿犪儠醿斸儬醿樶儭 醿涐儩醿a儦醿濁儞醿溼償醿氠儤 醿炨儛醿♂儯醿儤.
+pdfjs-rendering-error = 醿ㄡ償醿儞醿濁儧醿�, 醿掅儠醿斸儬醿撫儤醿� 醿┽儠醿斸儨醿斸儜醿樶儭醿愥儭.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 醿ㄡ償醿樶儳醿曖儛醿溼償醿� 醿炨儛醿犪儩醿氠儤 PDF-醿め儛醿樶儦醿樶儭 醿掅儛醿♂儛醿儭醿溼償醿氠儛醿�.
+pdfjs-password-invalid = 醿愥儬醿愥儭醿儩醿犪儤 醿炨儛醿犪儩醿氠儤. 醿掅儣醿儩醿曖儣, 醿♂儶醿愥儞醿濁儣 醿償醿氠儛醿儦醿�.
+pdfjs-password-ok-button = 醿欋儛醿犪儝醿�
+pdfjs-password-cancel-button = 醿掅儛醿a儱醿涐償醿戓儛
+pdfjs-web-fonts-disabled = 醿曖償醿戓儴醿犪儤醿め儮醿斸儜醿� 醿掅儛醿涐儩醿犪儣醿a儦醿樶儛: 醿┽儛醿ㄡ償醿溼償醿戓儯醿氠儤 PDF-醿ㄡ儬醿樶儰醿⑨償醿戓儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儛 醿曖償醿� 醿償醿犪儺醿撫償醿戓儛.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 醿儛醿犪儸醿斸儬醿�
+pdfjs-editor-color-picker-free-text-input =
+    .title = 醿儛醿犪儸醿斸儬醿樶儭 醿め償醿犪儤醿� 醿ㄡ償醿儠醿氠儛
+pdfjs-editor-free-text-button-label = 醿儛醿犪儸醿斸儬醿�
+pdfjs-editor-ink-button =
+    .title = 醿涐儩醿儛醿栣儠醿�
+pdfjs-editor-color-picker-ink-input =
+    .title = 醿涐儩醿儛醿栣儯醿氠儤醿� 醿め償醿犪儤醿� 醿ㄡ償醿儠醿氠儛
+pdfjs-editor-ink-button-label = 醿涐儩醿儛醿栣儠醿�
+pdfjs-editor-stamp-button =
+    .title = 醿♂儯醿犪儛醿椺償醿戓儤醿� 醿撫儛醿犪儣醿曖儛 醿愥儨 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+pdfjs-editor-stamp-button-label = 醿♂儯醿犪儛醿椺償醿戓儤醿� 醿撫儛醿犪儣醿曖儛 醿愥儨 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+pdfjs-editor-highlight-button =
+    .title = 醿涐儩醿溼儤醿ㄡ儠醿溼儛
+pdfjs-editor-highlight-button-label = 醿涐儩醿溼儤醿ㄡ儠醿溼儛
+pdfjs-highlight-floating-button1 =
+    .title = 醿涐儩醿溼儤醿ㄡ儠醿溼儛
+    .aria-label = 醿涐儩醿溼儤醿ㄡ儠醿溼儛
+pdfjs-highlight-floating-button-label = 醿涐儩醿溼儤醿ㄡ儠醿溼儛
+pdfjs-comment-floating-button =
+    .title = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛
+    .aria-label = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛
+pdfjs-comment-floating-button-label = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛
+pdfjs-editor-comment-button =
+    .title = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛
+    .aria-label = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛
+pdfjs-editor-comment-button-label = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛
+pdfjs-editor-signature-button =
+    .title = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿撫儛醿涐儛醿⑨償醿戓儛
+pdfjs-editor-signature-button-label = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿撫儛醿涐儛醿⑨償醿戓儛
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 醿涐儩醿溼儤醿ㄡ儠醿溼儤醿� 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 醿涐儩醿儛醿栣儯醿氠儤醿� 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿┽儛醿♂儸醿濁儬醿斸儜醿�: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 醿♂儯醿犪儛醿椺儤醿� 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 醿涐儩醿儛醿栣儯醿氠儤醿� 醿涐儩醿儤醿氠償醿戓儛
+pdfjs-editor-remove-freetext-button =
+    .title = 醿儛醿犪儸醿斸儬醿樶儭 醿涐儩醿儤醿氠償醿戓儛
+pdfjs-editor-remove-stamp-button =
+    .title = 醿♂儯醿犪儛醿椺儤醿� 醿涐儩醿儤醿氠償醿戓儛
+pdfjs-editor-remove-highlight-button =
+    .title = 醿涐儩醿溼儤醿ㄡ儠醿溼儤醿� 醿涐儩醿儤醿氠償醿戓儛
+pdfjs-editor-remove-signature-button =
+    .title = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿涐儩醿儤醿氠償醿戓儛
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 醿め償醿犪儤
+pdfjs-editor-free-text-size-input = 醿栣儩醿涐儛
+pdfjs-editor-ink-color-input = 醿め償醿犪儤
+pdfjs-editor-ink-thickness-input = 醿♂儤醿♂儱醿�
+pdfjs-editor-ink-opacity-input = 醿掅儛醿a儧醿儠醿樶儬醿曖儛醿氠儩醿戓儛
+pdfjs-editor-stamp-add-image-button =
+    .title = 醿♂儯醿犪儛醿椺儤醿� 醿撫儛醿涐儛醿⑨償醿戓儛
+pdfjs-editor-stamp-add-image-button-label = 醿♂儯醿犪儛醿椺儤醿� 醿撫儛醿涐儛醿⑨償醿戓儛
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 醿♂儤醿♂儱醿�
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 醿♂儤醿♂儱醿樶儭 醿ㄡ償醿儠醿氠儛 醿儛醿犪儸醿斸儬醿樶儭 醿掅儛醿犪儞醿� 醿♂儺醿曖儛 醿溼儛醿儤醿氠償醿戓儤醿� 醿涐儩醿溼儤醿ㄡ儠醿溼儤醿♂儛醿�
+pdfjs-editor-add-signature-container =
+    .aria-label = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿涐儛醿犪儣醿曖儛 醿撫儛 醿ㄡ償醿溼儛醿儯醿氠儤 醿償醿氠儧醿濁儸醿斸儬醿斸儜醿�
+pdfjs-editor-signature-add-signature-button =
+    .title = 醿愥儺醿愥儦醿� 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿撫儛醿涐儛醿⑨償醿戓儛
+pdfjs-editor-signature-add-signature-button-label = 醿愥儺醿愥儦醿� 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿撫儛醿涐儛醿⑨償醿戓儛
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 醿ㄡ償醿溼儛醿儯醿氠儤 醿償醿氠儧醿濁儸醿斸儬醿�: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 醿儛醿犪儸醿斸儬醿樶儭 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+    .default-content = 醿撫儛醿樶儸醿п償醿� 醿愥儥醿犪償醿め儛鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛
+       *[other] 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 醿掅儠醿斸儬醿撫儤醿椺儤 醿栣儩醿氠儤醿� 醿撫儛醿儯醿犪儠醿�
+    .aria-label = 醿掅儠醿斸儬醿撫儤醿椺儤 醿栣儩醿氠儤醿� 醿撫儛醿儯醿犪儠醿�
+pdfjs-editor-comments-sidebar-close-button-label = 醿掅儠醿斸儬醿撫儤醿椺儤 醿栣儩醿氠儤醿� 醿撫儛醿儯醿犪儠醿�
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 醿犪儛醿涐償 醿♂儛醿п儯醿犪儛醿撫儲醿斸儜醿濁儭 醿儛醿愥儸醿п儞醿樶儣? 醿掅儛醿愥儰醿斸儬醿愥儞醿斸儣 醿撫儛 醿撫儛醿a儬醿椺償醿� 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛.
+pdfjs-editor-comments-sidebar-no-comments-link = 醿曖儬醿儦醿愥儞
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 醿椺儛醿溼儞醿愥儬醿椺儯醿氠儤 醿儛醿犪儸醿斸儬醿�
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+pdfjs-editor-alt-text-dialog-label = 醿愥儬醿┽償醿曖儛
+pdfjs-editor-alt-text-dialog-description = 醿椺儛醿溼儞醿愥儬醿椺儯醿氠儤 (醿ㄡ償醿涐儨醿愥儶醿曖儦醿斸儜醿斸儦醿�) 醿儛醿犪儸醿斸儬醿� 醿掅儛醿涐儩醿♂儛醿撫償醿掅儤醿� 醿涐儛醿椺儣醿曖儤醿�, 醿曖儤醿溼儶 醿曖償醿� 醿償醿撫儛醿曖儭 醿♂儯醿犪儛醿椺償醿戓儭 醿愥儨 醿掅儛醿涐儩醿樶儭醿愥儺醿斸儜醿� 醿涐儛醿ㄡ儤醿�, 醿犪儩醿儛 醿♂儯醿犪儛醿椺儤 醿曖償醿� 醿┽儛醿樶儮醿曖儤醿犪儣醿斸儜醿�.
+pdfjs-editor-alt-text-add-description-label = 醿愥儲醿償醿犪儤醿氠儩醿戓儤醿� 醿涐儤醿椺儤醿椺償醿戓儛
+pdfjs-editor-alt-text-add-description-description = 醿掅儛醿溼儥醿a儣醿曖儨醿樶儦醿樶儛 1-2 醿儤醿溼儛醿撫儛醿撫償醿戓儤醿� 醿♂儛醿掅儨醿樶儭, 醿涐儛醿儛醿♂儤醿愥儣醿斸儜醿氠儤醿� 醿愥儨 醿涐儩醿メ儧醿斸儞醿斸儜醿樶儭 醿愥儲醿♂儛醿償醿犪儛醿�.
+pdfjs-editor-alt-text-mark-decorative-label = 醿涐儩醿樶儨醿樶儴醿溼儩醿� 醿涐儩醿犪儣醿a儦醿濁儜醿愥儞
+pdfjs-editor-alt-text-mark-decorative-description = 醿掅儛醿溼儥醿a儣醿曖儨醿樶儦醿樶儛 醿ㄡ償醿♂儛醿涐儥醿濁儜醿� 醿♂儯醿犪儛醿椺償醿戓儤醿♂儣醿曖儤醿�, 醿掅儛醿犪儭醿ㄡ償醿涐儩醿♂儛醿曖儦醿斸儜醿� 醿┽儛醿犪儵醿濁償醿戓儤醿♂儛 醿撫儛 醿儠醿樶儬醿溼儤醿ㄡ儨醿斸儜醿樶儭醿椺儠醿樶儭.
+pdfjs-editor-alt-text-cancel-button = 醿掅儛醿a儱醿涐償醿戓儛
+pdfjs-editor-alt-text-save-button = 醿ㄡ償醿溼儛醿儠醿�
+pdfjs-editor-alt-text-decorative-tooltip = 醿涐儩醿樶儨醿樶儴醿溼儩醿� 醿涐儩醿犪儣醿a儦醿濁儜醿愥儞
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 醿涐儛醿掅儛醿氠儤醿椺儛醿�, 鈥炨儛醿儛醿氠儝醿愥儢醿犪儞醿� 醿涐儛醿涐儛醿欋儛醿儤 醿涐儛醿掅儤醿撫儛醿♂儣醿愥儨 醿栣儤醿� 醿撫儛 醿♂儛醿撫儤醿氠儩醿戓儭鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿�
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 醿栣償醿曖儤醿� 醿涐儛醿犪儶醿儨醿樶儠 鈥� 醿栣儩醿涐儛醿儠醿氠儛
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 醿栣償醿曖儤醿� 醿ㄡ儯醿愥儴醿� 鈥� 醿栣儩醿涐儛醿儠醿氠儛
+pdfjs-editor-resizer-top-right =
+    .aria-label = 醿栣償醿曖儤醿� 醿涐儛醿犪儻醿曖儨醿樶儠 鈥� 醿栣儩醿涐儛醿儠醿氠儛
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 醿ㄡ儯醿愥儴醿� 醿涐儛醿犪儻醿曖儨醿樶儠 鈥� 醿栣儩醿涐儛醿儠醿氠儛
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 醿メ儠醿斸儠醿樶儣 醿涐儛醿犪儻醿曖儨醿樶儠 鈥� 醿栣儩醿涐儛醿儠醿氠儛
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 醿メ儠醿斸儠醿樶儣 醿ㄡ儯醿愥儴醿� 鈥� 醿栣儩醿涐儛醿儠醿氠儛
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 醿栣儠醿斸儠醿樶儣 醿涐儛醿犪儶醿儨醿樶儠 鈥� 醿栣儩醿涐儛醿儠醿氠儛
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 醿ㄡ儯醿愥儴醿� 醿涐儛醿犪儶醿儨醿樶儠 鈥� 醿栣儩醿涐儛醿儠醿氠儛
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 醿涐儩醿♂儛醿溼儤醿ㄡ儨醿� 醿め償醿犪儤
+pdfjs-editor-colorpicker-button =
+    .title = 醿め償醿犪儤醿� 醿ㄡ償醿儠醿氠儛
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 醿め償醿犪儤醿� 醿愥儬醿┽償醿曖儛
+pdfjs-editor-colorpicker-yellow =
+    .title = 醿п儠醿樶儣醿斸儦醿�
+pdfjs-editor-colorpicker-green =
+    .title = 醿涐儸醿曖儛醿溼償
+pdfjs-editor-colorpicker-blue =
+    .title = 醿氠儯醿犪儻醿�
+pdfjs-editor-colorpicker-pink =
+    .title = 醿曖儛醿犪儞醿樶儭醿め償醿犪儤
+pdfjs-editor-colorpicker-red =
+    .title = 醿儤醿椺償醿氠儤
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 醿п儠醿斸儦醿愥儭 醿┽儠醿斸儨醿斸儜醿�
+pdfjs-editor-highlight-show-all-button =
+    .title = 醿п儠醿斸儦醿愥儭 醿┽儠醿斸儨醿斸儜醿�
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿┽儛醿♂儸醿濁儬醿斸儜醿� (醿♂儯醿犪儛醿椺儤醿� 醿愥儲醿償醿犪儤醿�)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿撫儛醿涐儛醿⑨償醿戓儛 (醿♂儯醿犪儛醿椺儤醿� 醿愥儲醿償醿犪儤醿�)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 醿撫儛醿償醿犪償醿� 醿椺儱醿曖償醿溼儤 醿愥儲醿償醿犪儤醿氠儩醿戓儛 醿愥儱鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 醿涐儩醿欋儦醿� 醿愥儲醿償醿犪儛 醿涐儛醿椺儣醿曖儤醿�, 醿曖儤醿溼儶 醿曖償醿� 醿償醿撫儛醿曖儭 醿♂儯醿犪儛醿椺儭 醿愥儨 醿曖儤醿♂儣醿愥儨醿愥儶 醿曖償醿� 醿┽儛醿樶儮醿曖儤醿犪儣醿斸儜醿� 醿♂儯醿犪儛醿椺儤.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 醿斸儭 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿� 醿愥儠醿⑨儩醿涐儛醿⑨儯醿犪儛醿撫儛醿� 醿ㄡ償醿撫儝醿斸儨醿樶儦醿� 醿撫儛 醿ㄡ償醿♂儛醿儦醿濁儛, 醿a儧醿愥儬醿椺償醿戓儯醿氠儩 醿樶儳醿濁儭.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 醿曖儬醿儦醿愥儞
+pdfjs-editor-new-alt-text-create-automatically-button-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿椺儠醿樶儣醿ㄡ償醿撫儝醿斸儨醿�
+pdfjs-editor-new-alt-text-not-now-button = 醿愥儺醿氠儛 醿愥儬醿�
+pdfjs-editor-new-alt-text-error-title = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿ㄡ償醿撫儝醿斸儨醿� 醿曖償醿� 醿涐儩醿償醿犪儺醿撫儛
+pdfjs-editor-new-alt-text-error-description = 醿掅儣醿儩醿曖儣 醿撫儛醿償醿犪儩醿� 醿♂儛醿欋儯醿椺儛醿犪儤 醿撫儛醿溼儛醿犪儣醿� 醿撫儛 醿欋儠醿氠儛醿� 醿♂儶醿愥儞醿濁儣 醿涐儩醿掅儠醿樶儛醿溼償醿戓儤醿�.
+pdfjs-editor-new-alt-text-error-close-button = 醿撫儛醿儯醿犪儠醿�
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 醿┽儛醿涐儩醿樶儮醿曖儤醿犪儣醿斸儜醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿ㄡ償醿♂儛醿撫償醿掅儤 AI-醿涐儩醿撫償醿氠儤 ({ $downloadedSize } 醿栣儩醿涐儤醿� { $totalSize } 醿涐儜醿愥儤醿⑨儤)
+    .aria-valuetext = 醿┽儛醿涐儩醿樶儮醿曖儤醿犪儣醿斸儜醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿ㄡ償醿♂儛醿撫償醿掅儤 AI-醿涐儩醿撫償醿氠儤 ({ $downloadedSize } 醿栣儩醿涐儤醿� { $totalSize } 醿涐儜醿愥儤醿⑨儤)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿� 醿撫儛醿涐儛醿⑨償醿戓儯醿氠儤醿�
+pdfjs-editor-new-alt-text-added-button-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿� 醿撫儛醿涐儛醿⑨償醿戓儯醿氠儤醿�
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 醿愥儥醿氠儤醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿�
+pdfjs-editor-new-alt-text-missing-button-label = 醿愥儥醿氠儤醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿�
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿掅儛醿撫儛醿償醿撫儠醿�
+pdfjs-editor-new-alt-text-to-review-button-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿掅儛醿撫儛醿償醿撫儠醿�
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 醿ㄡ償醿撫儝醿斸儨醿樶儦醿樶儛 醿愥儠醿⑨儩醿涐儛醿⑨儯醿犪儛醿�: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 醿♂儯醿犪儛醿椺儤醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿炨儛醿犪儛醿涐償醿⑨儬醿斸儜醿�
+pdfjs-image-alt-text-settings-button-label = 醿♂儯醿犪儛醿椺儤醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿炨儛醿犪儛醿涐償醿⑨儬醿斸儜醿�
+pdfjs-editor-alt-text-settings-dialog-label = 醿♂儯醿犪儛醿椺儤醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿炨儛醿犪儛醿涐償醿⑨儬醿斸儜醿�
+pdfjs-editor-alt-text-settings-automatic-title = 醿愥儠醿⑨儩醿涐儛醿⑨儯醿犪儛醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿�
+pdfjs-editor-alt-text-settings-create-model-button-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿椺儠醿樶儣醿ㄡ償醿撫儝醿斸儨醿�
+pdfjs-editor-alt-text-settings-create-model-description = 醿愥儲醿償醿犪儭 醿♂儯醿犪儛醿椺儭 醿涐儛醿椺儣醿曖儤醿�, 醿曖儤醿溼儶 醿曖償醿� 醿償醿撫儛醿曖儭 醿愥儨 醿曖儤醿♂儣醿愥儨醿愥儶 醿曖償醿� 醿┽儛醿樶儮醿曖儤醿犪儣醿斸儜醿�.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿ㄡ償醿♂儛醿撫儝醿斸儨醿� AI-醿涐儩醿撫償醿氠儤 ({ $totalSize } 醿涐儜醿愥儤醿⑨儤)
+pdfjs-editor-alt-text-settings-ai-model-description = 醿斸儴醿曖償醿戓儛 醿愥儞醿掅儤醿氠儩醿戓儬醿樶儠醿愥儞 醿椺儱醿曖償醿溼儭 醿涐儩醿儳醿濁儜醿樶儦醿濁儜醿愥儢醿�, 醿愥儭醿� 醿犪儩醿� 醿涐儩醿溼儛醿償醿涐償醿戓儤 醿撫儛醿犪儵醿斸儜醿� 醿炨儤醿犪儛醿撫儤. 醿♂儛醿儤醿犪儩醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿斸儜醿樶儭 醿椺儠醿樶儣醿ㄡ償醿撫儝醿斸儨醿樶儭醿椺儠醿樶儭.
+pdfjs-editor-alt-text-settings-delete-model-button = 醿儛醿ㄡ儦醿�
+pdfjs-editor-alt-text-settings-download-model-button = 醿┽儛醿涐儩醿⑨儠醿樶儬醿椺儠醿�
+pdfjs-editor-alt-text-settings-downloading-model-button = 醿┽儛醿涐儩醿樶儮醿曖儬醿樶儣醿斸儜醿�...
+pdfjs-editor-alt-text-settings-editor-title = 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿┽儛醿涐儭醿儩醿犪償醿戓償醿氠儤
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 醿掅儛醿涐儩醿┽儨醿撫償醿� 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿樶儭 醿┽儛醿涐儭醿儩醿犪償醿戓償醿氠儤 醿♂儯醿犪儛醿椺儤醿� 醿撫儛醿涐儛醿⑨償醿戓儤醿♂儣醿愥儨醿愥儠醿�
+pdfjs-editor-alt-text-settings-show-dialog-description = 醿a儢醿犪儯醿溼儠醿斸儦醿п儩醿め儭, 醿犪儩醿� 醿椺儱醿曖償醿溼儭 醿п儠醿斸儦醿� 醿♂儯醿犪儛醿椺儭 醿愥儺醿氠儞醿斸儭 醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿�.
+pdfjs-editor-alt-text-settings-close-button = 醿撫儛醿儯醿犪儠醿�
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 醿涐儩醿溼儤醿ㄡ儠醿溼儛 醿撫儛醿涐儛醿⑨償醿戓儯醿氠儤醿�
+pdfjs-editor-freetext-added-alert = 醿儛醿犪儸醿斸儬醿� 醿撫儛醿涐儛醿⑨償醿戓儯醿氠儤醿�
+pdfjs-editor-ink-added-alert = 醿涐儩醿儛醿栣儠醿� 醿撫儛醿涐儛醿⑨償醿戓儯醿氠儤
+pdfjs-editor-stamp-added-alert = 醿♂儯醿犪儛醿椺儤 醿撫儛醿涐儛醿⑨償醿戓儯醿氠儤醿�
+pdfjs-editor-signature-added-alert = 醿償醿氠儧醿濁儸醿斸儬醿� 醿撫儛醿涐儛醿⑨償醿戓儯醿氠儤醿�
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 醿涐儩醿溼儤醿ㄡ儠醿溼儛 醿涐儩醿儤醿氠償醿戓儯醿氠儤醿�
+pdfjs-editor-undo-bar-message-freetext = 醿儛醿犪儸醿斸儬醿� 醿涐儩醿儤醿氠償醿戓儯醿氠儤醿�
+pdfjs-editor-undo-bar-message-ink = 醿涐儩醿儛醿栣儯醿氠儤醿� 醿涐儩醿儤醿氠償醿戓儯醿氠儤醿�
+pdfjs-editor-undo-bar-message-stamp = 醿♂儯醿犪儛醿椺儤 醿涐儩醿儤醿氠償醿戓儯醿氠儤醿�
+pdfjs-editor-undo-bar-message-signature = 醿償醿氠儧醿濁儸醿斸儬醿� 醿涐儩醿儤醿氠償醿戓儯醿氠儤醿�
+pdfjs-editor-undo-bar-message-comment = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛 醿涐儩醿儤醿氠償醿戓儯醿氠儤醿�
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛 醿涐儩醿儤醿氠償醿戓儯醿氠儤醿�
+       *[other] { $count } 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛 醿涐儩醿儤醿氠償醿戓儯醿氠儤醿�
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 醿撫儛醿戓儬醿a儨醿斸儜醿�
+pdfjs-editor-undo-bar-undo-button-label = 醿撫儛醿戓儬醿a儨醿斸儜醿�
+pdfjs-editor-undo-bar-close-button =
+    .title = 醿撫儛醿儯醿犪儠醿�
+pdfjs-editor-undo-bar-close-button-label = 醿撫儛醿儯醿犪儠醿�
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 醿斸儭 醿愥儬醿� 醿♂儛醿ㄡ儯醿愥儦醿斸儜醿愥儭 醿愥儷醿氠償醿曖儭 醿涐儩醿涐儺醿涐儛醿犪償醿戓償醿氠儭, 醿ㄡ償醿メ儧醿溼儛醿� 醿♂儛醿欋儯醿椺儛醿犪儤 醿償醿氠儧醿濁儸醿斸儬醿� PDF-醿撫儩醿欋儯醿涐償醿溼儮醿樶儭醿椺儠醿樶儭. 醿涐儩醿涐儺醿涐儛醿犪償醿戓償醿氠儭 醿ㄡ償醿斸儷醿氠償醿戓儛 醿┽儛醿愥儭醿儩醿犪儩醿� 醿♂儛醿償醿氠儤 (醿犪儩醿涐償醿氠儤醿� 醿撫儛醿犪儣醿a儦醿� 醿⑨償醿メ儭醿⑨儤醿� 醿涐儩醿曖儛醿氠償醿濁儜醿愥儭醿愥儶 醿愥儭醿犪儯醿氠償醿戓儭) 醿撫儛 醿♂儯醿犪儠醿樶儦醿樶儭醿愥儧醿斸儜醿� 醿ㄡ償醿樶儨醿愥儺醿濁儭 醿償醿氠儧醿濁儸醿斸儬醿� 醿掅儛醿溼儧醿斸儩醿犪償醿戓儤醿� 醿掅儛醿涐儩醿♂儛醿п償醿溼償醿戓儦醿愥儞.
+pdfjs-editor-add-signature-dialog-title = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿撫儛醿涐儛醿⑨償醿戓儛
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 醿愥儥醿犪償醿め儛
+    .title = 醿愥儥醿犪償醿め儛
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 醿涐儩醿儛醿栣儠醿�
+    .title = 醿涐儩醿儛醿栣儠醿�
+pdfjs-editor-add-signature-image-button = 醿♂儯醿犪儛醿椺儤
+    .title = 醿♂儯醿犪儛醿椺儤
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 醿愥儥醿犪儤醿め償醿� 醿償醿氠儧醿濁儸醿斸儬醿�
+    .placeholder = 醿愥儥醿犪儤醿め償醿� 醿償醿氠儧醿濁儸醿斸儬醿�
+pdfjs-editor-add-signature-draw-placeholder = 醿涐儩醿儛醿栣償醿� 醿償醿氠儧醿濁儸醿斸儬醿�
+pdfjs-editor-add-signature-draw-thickness-range-label = 醿♂儤醿♂儱醿�
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 醿涐儩醿儛醿栣儯醿氠儤醿� 醿♂儤醿♂儱醿�: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 醿┽儛醿曖儦醿斸儜醿樶儣 醿掅儛醿撫儧醿濁儤醿⑨儛醿溼償醿� 醿愥儭醿愥儮醿曖儤醿犪儣醿愥儞
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 醿愥儨 醿愥儧醿濁儛醿犪儵醿樶償醿� 醿♂儯醿犪儛醿椺償醿戓儤醿撫儛醿�
+       *[other] 醿愥儨 醿愥儧醿濁儛醿犪儵醿樶償醿� 醿♂儯醿犪儛醿椺償醿戓儤醿撫儛醿�
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 醿愥儲醿償醿犪儤醿氠儩醿戓儛 (醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿�)
+pdfjs-editor-add-signature-description-input =
+    .title = 醿愥儲醿償醿犪儤醿氠儩醿戓儛 (醿撫儛醿犪儣醿a儦醿� 醿儛醿犪儸醿斸儬醿�)
+pdfjs-editor-add-signature-description-default-when-drawing = 醿償醿氠儧醿濁儸醿斸儬醿�
+pdfjs-editor-add-signature-clear-button-label = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿儛醿ㄡ儦醿�
+pdfjs-editor-add-signature-clear-button =
+    .title = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿儛醿ㄡ儦醿�
+pdfjs-editor-add-signature-save-checkbox = 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿ㄡ償醿溼儛醿儠醿�
+pdfjs-editor-add-signature-save-warning-message = 醿涐儤醿︶儸醿斸儯醿氠儤醿� 5 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿ㄡ償醿溼儛醿儠醿樶儭 醿栣儲醿曖儛醿犪儤. 醿涐儩醿愥儶醿樶儦醿斸儣 醿犪儩醿涐償醿氠儤醿涐償 醿愥儺醿氠儤醿� 醿ㄡ償醿♂儛醿溼儛醿儛醿�.
+pdfjs-editor-add-signature-image-upload-error-title = 醿曖償醿� 醿愥儤醿⑨儠醿樶儬醿椺儛 醿♂儯醿犪儛醿椺儤
+pdfjs-editor-add-signature-image-upload-error-description = 醿ㄡ償醿愥儧醿濁儸醿涐償醿� 醿メ儭醿斸儦醿椺儛醿� 醿欋儛醿曖儴醿樶儬醿� 醿愥儨 醿涐儩醿♂儤醿溼儻醿斸儣 醿♂儺醿曖儛 醿♂儯醿犪儛醿椺儤.
+pdfjs-editor-add-signature-image-no-data-error-title = 醿曖償醿� 醿掅儛醿犪儞醿愥儤醿メ儧醿溼償醿戓儛 醿斸儭 醿♂儯醿犪儛醿椺儤 醿償醿氠儧醿濁儸醿斸儬醿愥儞
+pdfjs-editor-add-signature-image-no-data-error-description = 醿掅儣醿儩醿曖儣, 醿♂儶醿愥儞醿濁儣 醿♂儺醿曖儛 醿♂儯醿犪儛醿椺儤醿� 醿愥儮醿曖儤醿犪儣醿曖儛.
+pdfjs-editor-add-signature-error-close-button = 醿撫儛醿儯醿犪儠醿�
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 醿掅儛醿a儱醿涐償醿戓儛
+pdfjs-editor-add-signature-add-button = 醿撫儛醿涐儛醿⑨償醿戓儛
+pdfjs-editor-edit-signature-update-button = 醿掅儛醿溼儛醿儦醿斸儜醿�
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儤醿� 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+pdfjs-editor-edit-comment-popup-button =
+    .title = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儤醿� 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+pdfjs-editor-delete-comment-popup-button-label = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儤醿� 醿涐儩醿儤醿氠償醿戓儛
+pdfjs-editor-delete-comment-popup-button =
+    .title = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儤醿� 醿涐儩醿儤醿氠償醿戓儛
+pdfjs-show-comment-button =
+    .title = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儤醿� 醿掅儛醿涐儩醿┽償醿溼儛
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儤醿� 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 醿掅儛醿溼儛醿儦醿斸儜醿�
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儤醿� 醿撫儛醿涐儛醿⑨償醿戓儛
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 醿撫儛醿涐儛醿⑨償醿戓儛
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 醿愥儥醿犪儤醿め償醿椻��
+pdfjs-editor-edit-comment-dialog-cancel-button = 醿掅儛醿a儱醿涐償醿戓儛
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 醿ㄡ償醿溼儤醿ㄡ儠醿溼儤醿� 醿撫儛醿涐儛醿⑨償醿戓儛
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 醿掅儠醿斸儬醿撫儤醿椺儤 醿栣儩醿氠儤醿� 醿掅儛醿涐儩醿┽償醿溼儛 (醿ㄡ償醿樶儶醿愥儠醿� 醿ㄡ償醿♂儛醿椺儠醿愥儦醿樶償醿犪償醿戓償醿氠儭/醿♂儛醿犪儵醿斸儠醿�/醿撫儛醿溼儛醿犪儣醿�)
+pdfjs-toggle-views-manager-button1-label = 醿掅儠醿斸儬醿撫償醿戓儤醿� 醿涐儛醿犪儣醿曖儛
+pdfjs-views-manager-sidebar =
+    .aria-label = 醿掅儠醿斸儬醿撫儤醿椺儤 醿栣儩醿氠儤
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 醿掅儠醿斸儬醿撫儤醿椺儤 醿栣儩醿氠儤醿� 醿栣儩醿涐儛醿儠醿氠儛
+pdfjs-views-manager-view-selector-button =
+    .title = 醿償醿撫償醿戓儤
+pdfjs-views-manager-view-selector-button-label = 醿償醿撫償醿戓儤
+pdfjs-views-manager-pages-title = 醿掅儠醿斸儬醿撫償醿戓儤
+pdfjs-views-manager-outlines-title1 = 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿♂儛醿犪儵醿斸儠醿�
+    .title = 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿♂儛醿犪儵醿斸儠醿� (醿濁儬醿涐儛醿掅儤 醿儥醿愥優醿樶儣 醿п儠醿斸儦醿� 醿┽儛醿溼儛醿償醿犪儤醿� 醿┽儛醿涐儩醿ㄡ儦醿�/醿愥儥醿斸儶醿曖儛)
+pdfjs-views-manager-attachments-title = 醿撫儛醿溼儛醿犪儣醿斸儜醿�
+pdfjs-views-manager-layers-title1 = 醿ㄡ儬醿斸償醿戓儤
+    .title = 醿ㄡ儬醿斸償醿戓儤 (醿濁儬醿涐儛醿掅儤 醿儥醿愥優醿樶儣 醿п儠醿斸儦醿� 醿ㄡ儬醿樶儭 醿溼儛醿掅儯醿氠儤醿♂儺醿涐償醿曖儢醿� 醿撫儛醿戓儬醿a儨醿斸儜醿�)
+pdfjs-views-manager-pages-option-label = 醿掅儠醿斸儬醿撫償醿戓儤
+pdfjs-views-manager-outlines-option-label = 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿♂儛醿犪儵醿斸儠醿�
+pdfjs-views-manager-attachments-option-label = 醿撫儛醿溼儛醿犪儣醿斸儜醿�
+pdfjs-views-manager-layers-option-label = 醿ㄡ儬醿斸償醿戓儤
+pdfjs-views-manager-add-file-button =
+    .title = 醿め儛醿樶儦醿樶儭 醿撫儛醿涐儛醿⑨償醿戓儛
+pdfjs-views-manager-add-file-button-label = 醿め儛醿樶儦醿樶儭 醿撫儛醿涐儛醿⑨償醿戓儛
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } 醿ㄡ償醿犪儵醿斸儯醿氠儤
+       *[other] { $count } 醿ㄡ償醿犪儵醿斸儯醿氠儤
+    }
+pdfjs-views-manager-pages-status-none-action-label = 醿掅儠醿斸儬醿撫償醿戓儤醿� 醿ㄡ償醿犪儵醿斸儠醿�
+pdfjs-views-manager-pages-status-action-button-label = 醿涐儛醿犪儣醿曖儛
+pdfjs-views-manager-pages-status-copy-button-label = 醿愥儭醿氠儤
+pdfjs-views-manager-pages-status-cut-button-label = 醿愥儧醿濁儹醿犪儛
+pdfjs-views-manager-pages-status-delete-button-label = 醿儛醿ㄡ儦醿�
+pdfjs-views-manager-pages-status-export-selected-button-label = 醿ㄡ償醿犪儵醿斸儯醿氠儤醿� 醿掅儛醿⑨儛醿溼儛鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 醿掅儠醿斸儬醿撫儤 醿愥儧醿濁儤醿儬醿�
+       *[other] { $count } 醿掅儠醿斸儬醿撫儤 醿愥儧醿濁儤醿儬醿�
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 醿掅儠醿斸儬醿撫儤醿� 醿愥儭醿氠儤 醿愥儲醿斸儜醿a儦醿樶儛
+       *[other] { $count } 醿掅儠醿斸儬醿撫儤醿� 醿愥儭醿氠儤 醿愥儲醿斸儜醿a儦醿樶儛
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 醿掅儠醿斸儬醿撫儤 醿儛醿樶儴醿愥儦醿�
+       *[other] { $count } 醿掅儠醿斸儬醿撫儤 醿儛醿樶儴醿愥儦醿�
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 醿涐儢醿愥儞醿撫償醿戓儛 醿椺儱醿曖償醿溼儤 醿め儛醿樶儦醿樷��
+pdfjs-views-manager-pages-status-waiting-uploading-label = 醿め儛醿樶儦醿� 醿愥儤醿⑨儠醿樶儬醿椺償醿戓儛鈥�
+pdfjs-views-manager-status-warning-cut-label = 醿曖償醿� 醿愥儧醿濁儤醿儬醿�. 醿掅儛醿溼儛醿愥儺醿氠償醿� 醿掅儠醿斸儬醿撫儤 醿撫儛 醿欋儠醿氠儛醿� 醿♂儶醿愥儞醿斸儣.
+pdfjs-views-manager-status-warning-copy-label = 醿愥儭醿氠儤 醿曖償醿� 醿愥儤醿︶儩. 醿掅儛醿溼儛醿愥儺醿氠償醿� 醿掅儠醿斸儬醿撫儤 醿撫儛 醿欋儠醿氠儛醿� 醿♂儶醿愥儞醿斸儣.
+pdfjs-views-manager-status-warning-delete-label = 醿曖償醿� 醿儛醿樶儴醿愥儦醿�. 醿掅儛醿溼儛醿愥儺醿氠償醿� 醿掅儠醿斸儬醿撫儤 醿撫儛 醿欋儠醿氠儛醿� 醿♂儶醿愥儞醿斸儣.
+pdfjs-views-manager-status-warning-save-label = 醿曖償醿� 醿ㄡ償醿樶儨醿愥儺醿�. 醿掅儛醿溼儛醿愥儺醿氠償醿� 醿掅儠醿斸儬醿撫儤 醿撫儛 醿欋儠醿氠儛醿� 醿♂儶醿愥儞醿斸儣.
+pdfjs-views-manager-status-undo-button-label = 醿撫儛醿戓儬醿a儨醿斸儜醿�
+pdfjs-views-manager-status-done-button-label = 醿涐儢醿愥儞醿愥儛
+pdfjs-views-manager-status-close-button =
+    .title = 醿撫儛醿儯醿犪儠醿�
+pdfjs-views-manager-status-close-button-label = 醿撫儛醿儯醿犪儠醿�
+pdfjs-views-manager-paste-button-label = 醿┽儛醿♂儧醿�
+pdfjs-views-manager-paste-button-before =
+    .title = 醿┽儛醿♂儧醿� 醿炨儤醿犪儠醿斸儦醿� 醿掅儠醿斸儬醿撫儤醿� 醿儤醿�
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 醿┽儛醿♂儧醿� { $page } 醿掅儠醿斸儬醿撫儤醿� 醿ㄡ償醿涐儞醿斸儝
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 岵♂矘岵愥伯岵氠矓
+pdfjs-views-manager-waiting-for-file = 醿め儛醿樶儦醿� 醿愥儤醿⑨儠醿樶儬醿椺償醿戓儛鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 醿掅儠醿斸儬醿撫償醿戓儤醿� 醿涐儛醿犪儣醿曖儛
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 醿ㄡ償醿溼儛醿儯醿氠儤 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿涐儩醿儤醿氠償醿戓儛
+pdfjs-editor-delete-signature-button-label1 = 醿ㄡ償醿溼儛醿儯醿氠儤 醿償醿氠儧醿濁儸醿斸儬醿樶儭 醿涐儩醿儤醿氠償醿戓儛
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 醿愥儲醿償醿犪儤醿氠儩醿戓儤醿� 醿┽儛醿♂儸醿濁儬醿斸儜醿�
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 醿愥儲醿償醿犪儤醿氠儩醿戓儤醿� 醿┽儛醿♂儸醿濁儬醿斸儜醿�
diff --git a/public/pdfjs/web/locale/kab/viewer.ftl b/public/pdfjs/web/locale/kab/viewer.ftl
new file mode 100644
index 0000000..4527c69
--- /dev/null
+++ b/public/pdfjs/web/locale/kab/viewer.ftl
@@ -0,0 +1,626 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Asebter azewwar
+pdfjs-previous-button-label = Azewwar
+pdfjs-next-button =
+    .title = Asebter d-iteddun
+pdfjs-next-button-label = Ddu 桑er zdat
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Asebter
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 桑ef { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } n { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Sem岷搃
+pdfjs-zoom-out-button-label = Sem岷搃
+pdfjs-zoom-in-button =
+    .title = Sem桑e峁�
+pdfjs-zoom-in-button-label = Sem桑e峁�
+pdfjs-zoom-select =
+    .title = Sem桑e峁�/Sem岷搃
+pdfjs-presentation-mode-button =
+    .title = U桑al 桑er Uskar Tihawt
+pdfjs-presentation-mode-button-label = Askar Tihawt
+pdfjs-open-file-button =
+    .title = Ldi Afaylu
+pdfjs-open-file-button-label = Ldi
+pdfjs-print-button =
+    .title = Siggez
+pdfjs-print-button-label = Siggez
+pdfjs-save-button =
+    .title = Sekles
+pdfjs-save-button-label = Sekles
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Sader
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Sader
+pdfjs-bookmark-button =
+    .title = Asebter amiran (Sken-d tansa URL seg usebter amiran)
+pdfjs-bookmark-button-label = Asebter amiran
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ifecka
+pdfjs-tools-button-label = Ifecka
+pdfjs-first-page-button =
+    .title = Ddu 桑er usebter amezwaru
+pdfjs-first-page-button-label = Ddu 桑er usebter amezwaru
+pdfjs-last-page-button =
+    .title = Ddu 桑er usebter aneggaru
+pdfjs-last-page-button-label = Ddu 桑er usebter aneggaru
+pdfjs-page-rotate-cw-button =
+    .title = Tuzzya tusrigt
+pdfjs-page-rotate-cw-button-label = Tuzzya tusrigt
+pdfjs-page-rotate-ccw-button =
+    .title = Tuzzya amgal-usrig
+pdfjs-page-rotate-ccw-button-label = Tuzzya amgal-usrig
+pdfjs-cursor-text-select-tool-button =
+    .title = Rmed afecku n tefrant n u岣峳is
+pdfjs-cursor-text-select-tool-button-label = Afecku n tefrant n u岣峳is
+pdfjs-cursor-hand-tool-button =
+    .title = Rmed afecku afus
+pdfjs-cursor-hand-tool-button-label = Afecku afus
+pdfjs-scroll-page-button =
+    .title = Seqdec adrurem n usebter
+pdfjs-scroll-page-button-label = Adrurem n usebter
+pdfjs-scroll-vertical-button =
+    .title = Seqdec adrurem ubdid
+pdfjs-scroll-vertical-button-label = Adrurem ubdid
+pdfjs-scroll-horizontal-button =
+    .title = Seqdec adrurem aglawan
+pdfjs-scroll-horizontal-button-label = Adrurem aglawan
+pdfjs-scroll-wrapped-button =
+    .title = Seqdec adrurem yu岷揺n
+pdfjs-scroll-wrapped-button-label = Adrurem yu岷揺n
+pdfjs-spread-none-button =
+    .title = Ur sedday ara isi桑zaf n usebter
+pdfjs-spread-none-button-label = Ulac isi桑zaf
+pdfjs-spread-odd-button =
+    .title = Seddu isi桑zaf n usebter ibeddun s yisebtar irayuganen
+pdfjs-spread-odd-button-label = Isi桑zaf irayuganen
+pdfjs-spread-even-button =
+    .title = Seddu isi桑zaf n usebter ibeddun s yisebtar iyuganen
+pdfjs-spread-even-button-label = Isi桑zaf iyuganen
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Ta桑a峁沘 n isemli鈥�
+pdfjs-document-properties-button-label = Ta桑a峁沘 n isemli鈥�
+pdfjs-document-properties-file-name = Isem n ufaylu:
+pdfjs-document-properties-file-size = Te桑zi n ufaylu:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } yibiten)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } yibiten)
+pdfjs-document-properties-title = Azwel:
+pdfjs-document-properties-author = Ameskar:
+pdfjs-document-properties-subject = Amgay:
+pdfjs-document-properties-keywords = Awalen n tsaru牛
+pdfjs-document-properties-creation-date = Azemz n tmerna:
+pdfjs-document-properties-modification-date = Azemz n usnifel:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Yerna-t:
+pdfjs-document-properties-producer = Afecku n uselket PDF:
+pdfjs-document-properties-version = Lqem PDF:
+pdfjs-document-properties-page-count = Am岣峚n n yisebtar:
+pdfjs-document-properties-page-size = Tu纬zi n usebter:
+pdfjs-document-properties-page-size-unit-inches = deg
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = s te桑zi
+pdfjs-document-properties-page-size-orientation-landscape = s tehri
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Asekkil
+pdfjs-document-properties-page-size-name-legal = Us岣峣f
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Taskant Web taruradt:
+pdfjs-document-properties-linearized-yes = Ih
+pdfjs-document-properties-linearized-no = Ala
+pdfjs-document-properties-close-button = Mdel
+
+## Print
+
+pdfjs-print-progress-message = Aheggi i usiggez n isemli鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Sefsex
+pdfjs-printing-not-supported = 茢u峁�-k: Asiggez ur ittusefrak ara yakan ima峁涐箾a deg iminig-a.
+pdfjs-printing-not-ready = 茢u峁�-k: Afaylu PDF ur d-yuli ara ime峁涐箾a akken ad ittusiggez.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Sken/Fer agalis adisan
+pdfjs-toggle-sidebar-notification-button =
+    .title = Ffer/Sekn agalis adisan (isemli yegber a桑awas/ticeqqufin yeddan/tissiwin)
+pdfjs-toggle-sidebar-button-label = Sken/Fer agalis adisan
+pdfjs-document-outline-button =
+    .title = Sken isemli (Senned snat tikal i wesem桑er/Afne岷� n iferdisen me峁涐箾a)
+pdfjs-document-outline-button-label = Is桑alen n isebtar
+pdfjs-attachments-button =
+    .title = Sken ticeqqufin yeddan
+pdfjs-attachments-button-label = Ticeqqufin yeddan
+pdfjs-layers-button =
+    .title = Skeen tissiwin (sit sin yiberdan i uwennez n me峁涐箾a tissiwin 桑er waddad amezwer)
+pdfjs-layers-button-label = Tissiwin
+pdfjs-thumbs-button =
+    .title = Sken tanfult.
+pdfjs-thumbs-button-label = Tinfulin
+pdfjs-current-outline-item-button =
+    .title = Af-d aferdis n u桑awas amiran
+pdfjs-current-outline-item-button-label = Aferdis n u桑awas amiran
+pdfjs-findbar-button =
+    .title = Nadi deg isemli
+pdfjs-findbar-button-label = Nadi
+pdfjs-additional-layers = Tissiwin-nni岣峞n
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Asebter { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Tanfult n usebter { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Nadi
+    .placeholder = Nadi deg isemli鈥�
+pdfjs-find-previous-button =
+    .title = Aff-d tamse岣峳iwt n twinest n deffir
+pdfjs-find-previous-button-label = Azewwar
+pdfjs-find-next-button =
+    .title = Aff-d timse岣峳iwt n twinest d-iteddun
+pdfjs-find-next-button-label = Ddu 桑er zdat
+pdfjs-find-highlight-checkbox = Err izirig ima峁涐箾a
+pdfjs-find-match-case-checkbox-label = Qade峁� amasal n isekkilen
+pdfjs-find-match-diacritics-checkbox-label = Qade峁� ifeskilen
+pdfjs-find-entire-word-checkbox-label = Awalen i膷膷uranen
+pdfjs-find-reached-top = Yabbe岣� s afella n usebter, tu桑alin s wadda
+pdfjs-find-reached-bottom = Teb岣峞岣� s adda n usebter, tu桑alin s afella
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] Time岣峳iwt { $current } 桑ef { $total }
+       *[other] Time岣峳iwin { $current } 桑ef { $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Ugar n { $limit } um峁da
+       *[other] Ugar n { $limit } yim峁dayen
+    }
+pdfjs-find-not-found = Ulac tawinest
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Tehri n usebter
+pdfjs-page-scale-fit = Asebter ima峁涐箾a
+pdfjs-page-scale-auto = Asem桑e峁�/Asem岷搃 awurman
+pdfjs-page-scale-actual = Te桑zi tilawt
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Asebter { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Te岣峳a-d tucc岣峚 deg alluy n PDF:
+pdfjs-invalid-file-error = Afaylu PDF arame桑tu ne桑 yex峁峁�.
+pdfjs-missing-file-error = Ulac afaylu PDF.
+pdfjs-unexpected-response-error = Aqeddac yerra-d yir tiririt ur nettwa峁浨 ara.
+pdfjs-rendering-error = Te岣峳a-d tucc岣峚 deg uskan n usebter.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Tabzimt { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Sekcem awal uffir akken ad ldi岣� afaylu-yagi PDF
+pdfjs-password-invalid = Awal uffir ma膷膷i d ame桑tu, 茞re岣� tikelt-nni岣峞n.
+pdfjs-password-ok-button = IH
+pdfjs-password-cancel-button = Sefsex
+pdfjs-web-fonts-disabled = Tisefsiyin web ttwassensent; D awez桑i useqdec n tsefsiyin yettwarnan 桑er PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = A岣峳is
+pdfjs-editor-color-picker-free-text-input =
+    .title = Senfel ini n u岣峳is
+pdfjs-editor-free-text-button-label = A岣峳is
+pdfjs-editor-ink-button =
+    .title = Sune桑
+pdfjs-editor-color-picker-ink-input =
+    .title = Senfel ini n usune桑
+pdfjs-editor-ink-button-label = Sune桑
+pdfjs-editor-stamp-button =
+    .title = Rnu ne桑 岷搑eg tugniwin
+pdfjs-editor-stamp-button-label = Rnu ne桑 岷搑eg tugniwin
+pdfjs-editor-highlight-button =
+    .title = Derrer
+pdfjs-editor-highlight-button-label = Derrer
+pdfjs-highlight-floating-button1 =
+    .title = Derrer
+    .aria-label = Derrer
+pdfjs-highlight-floating-button-label = Derrer
+pdfjs-comment-floating-button =
+    .title = Wennet
+    .aria-label = Wennet
+pdfjs-comment-floating-button-label = Awennit
+pdfjs-editor-comment-button =
+    .title = Wennet
+    .aria-label = Wennet
+pdfjs-editor-comment-button-label = Awennit
+pdfjs-editor-signature-button =
+    .title = Rnu azmul
+pdfjs-editor-signature-button-label = Rnu azmul
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Ama岷搑ag usebrureq
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Ama岷搑ag n usune桑
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = usune桑 n uzmul: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Ama岷搑ag n tugna
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Kkes asune桑
+pdfjs-editor-remove-freetext-button =
+    .title = Kkes a岣峳is
+pdfjs-editor-remove-stamp-button =
+    .title = Kkes tugna
+pdfjs-editor-remove-highlight-button =
+    .title = Kkes aderrer
+pdfjs-editor-remove-signature-button =
+    .title = Kkes azmul
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Initen
+pdfjs-editor-free-text-size-input = Te桑zi
+pdfjs-editor-ink-color-input = Ini
+pdfjs-editor-ink-thickness-input = Tuzert
+pdfjs-editor-ink-opacity-input = Tebrek
+pdfjs-editor-stamp-add-image-button =
+    .title = Rnu tawlaft
+pdfjs-editor-stamp-add-image-button-label = Rnu tawlaft
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Tuzert
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Beddel tuzert mi ara d-tesbeggne岣� iferdisen ni岣峞n ur nelli d a岣峳is
+pdfjs-editor-add-signature-container =
+    .aria-label = Isenqaden n uzmul d yizmulen yettwaskelsen
+pdfjs-editor-signature-add-signature-button =
+    .title = Rnu azmul amaynut
+pdfjs-editor-signature-add-signature-button-label = Rnu azmul amaynut
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Yettwasekles uzmul: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Ama岷搑ag n u岣峳is
+    .default-content = Bdu tira鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Awennit
+       *[other] Iwenniten
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Mdel agalis adisan
+    .aria-label = Mdel agalis adisan
+pdfjs-editor-comments-sidebar-close-button-label = Mdel agalis adisan
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Twala岣� ayen i ak鈰卆kem-i蓻e千ben? Sebrureq-it, ternu岣� e千千 awennit.
+pdfjs-editor-comments-sidebar-no-comments-link = Issin ugar
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = A岣峳is amaskal
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 岷抮eg a岣峳is amaskal
+pdfjs-editor-alt-text-dialog-label = Fren taxtirt
+pdfjs-editor-alt-text-dialog-description = A岣峳is amaskal yettallel mi ara yili imdanen ur ttwalin ara tugna ne桑 mi ara yili ur d-tuli ara.
+pdfjs-editor-alt-text-add-description-label = Rnu aglam
+pdfjs-editor-alt-text-add-description-description = Yettuwelleh tira n tefyirt ne桑 n snat ideg ara d-yettwaglem asentel, akatar ne桑 tigawin.
+pdfjs-editor-alt-text-mark-decorative-label = Cre岣� d adlag
+pdfjs-editor-alt-text-mark-decorative-description = Taxti峁泃-a tettwaseqdacay i tugniwin n ucebba岣�, am tamiwin ne桑 i tecra岣� tifrawanin.
+pdfjs-editor-alt-text-cancel-button = Sefsex
+pdfjs-editor-alt-text-save-button = Sekles
+pdfjs-editor-alt-text-decorative-tooltip = Yettwacre岣� d adlag
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = D amedya, 鈥淵iwen yilem岷搃 iqqim 桑er 峁弓abla,ad ye膷膷 imekli鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = A岣峳is amaskal
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Ti桑mert n ufella n zelme岣� 鈥� semsawi te桑zi
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Talemmat n ufella 鈥� semsawi te桑zi
+pdfjs-editor-resizer-top-right =
+    .aria-label = Ti桑mert n ufella n yeffus 鈥� semsawi te桑zi
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Talemmast tayeffust 鈥� semsawi te桑zi
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Ti桑mert n wadda n yeffus 鈥� semsawi te桑zi
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Talemmat n wadda 鈥� semsawi te桑zi
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Ti桑mert n wadda n zelme岣� 鈥� semsawi te桑zi
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Talemmast tazelmda岣峵 鈥� semsawi te桑zi
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Ini n uderrer
+pdfjs-editor-colorpicker-button =
+    .title = Senfel ini
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Afran n yiniten
+pdfjs-editor-colorpicker-yellow =
+    .title = Awra桑
+pdfjs-editor-colorpicker-green =
+    .title = Azegzaw
+pdfjs-editor-colorpicker-blue =
+    .title = Amidadi
+pdfjs-editor-colorpicker-pink =
+    .title = Axuxi
+pdfjs-editor-colorpicker-red =
+    .title = Azgga桑
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Sken akk
+pdfjs-editor-highlight-show-all-button =
+    .title = Sken akk
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 岷抮eg a岣峳is ni岣峞n (aglam n tugna)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Rnu a岣峳is ni岣峞n (aglam n tugna)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Aru aglam-ik dagi鈥�
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Issin ugar
+pdfjs-editor-new-alt-text-create-automatically-button-label = Rnu a岣峳is ni岣峞n s wudem awurman
+pdfjs-editor-new-alt-text-not-now-button = Ma膷膷i tura
+pdfjs-editor-new-alt-text-error-title = D awez桑i timerna n u岣峳is ni岣峞n s wudem awurman
+pdfjs-editor-new-alt-text-error-description = Ttxil-k鈰卪 aru a岣峳is-ik鈰卛m ni岣峞n ne桑 蓻re岣� tikkelt ni岣峞n.
+pdfjs-editor-new-alt-text-error-close-button = Mdel
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Asader n tmudemt n IA n u岣峳is amlellay ({ $downloadedSize } n { $totalSize } MB)
+    .aria-valuetext = Asader n tmudemt n IA n u岣峳is amlellay ({ $downloadedSize } n { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Yettwarna we岣峳is amlellay
+pdfjs-editor-new-alt-text-added-button-label = Yettwarna we岣峳is amlellay
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Ixu峁� u岣峳is amlellay
+pdfjs-editor-new-alt-text-missing-button-label = Ixu峁� u岣峳is amlellay
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Senqed a岣峳is amlellay
+pdfjs-editor-new-alt-text-to-review-button-label = Senqed a岣峳is amlellay
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Yettwarna s wudem awurman: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = I桑ewwa峁沞n n we岣峳is amlellay n tugna
+pdfjs-image-alt-text-settings-button-label = I桑ewwa峁沞n n we岣峳is amlellay n tugna
+pdfjs-editor-alt-text-settings-dialog-label = I桑ewwa峁沞n n we岣峳is amlellay n tugna
+pdfjs-editor-alt-text-settings-automatic-title = A岣峳is amlellay awurman
+pdfjs-editor-alt-text-settings-create-model-button-label = Rnu a岣峳is ni岣峞n s wudem awurman
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Tamudemt n IA n u岣峳is amlellay ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-delete-model-button = Kkes
+pdfjs-editor-alt-text-settings-download-model-button = Sader
+pdfjs-editor-alt-text-settings-downloading-model-button = Asader鈥�
+pdfjs-editor-alt-text-settings-editor-title = Ama岷搑ag n we岣峳is amlellay
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Sken ama岷搑ag n u岣峳is amlellay akken kan ara ternu岣� tugna
+pdfjs-editor-alt-text-settings-show-dialog-description = Yettall ad t岣峞mne岣� tugniwin s蓻ant a岣峳is amlellay.
+pdfjs-editor-alt-text-settings-close-button = Mdel
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Yettwarna usebrureq
+pdfjs-editor-freetext-added-alert = Yettwarna u岣峳is
+pdfjs-editor-ink-added-alert = Yettwarna usune桑
+pdfjs-editor-stamp-added-alert = Tugna tettwarna
+pdfjs-editor-signature-added-alert = Azmul yettwarna
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Yettwakkes usebrureq
+pdfjs-editor-undo-bar-message-freetext = A岣峳is yettwakkes
+pdfjs-editor-undo-bar-message-ink = Asune桑 yettwakkes
+pdfjs-editor-undo-bar-message-stamp = Tugna tettwakkes
+pdfjs-editor-undo-bar-message-signature = Azmul yettwakkes
+pdfjs-editor-undo-bar-undo-button =
+    .title = Sefsex
+pdfjs-editor-undo-bar-undo-button-label = Sefsex
+pdfjs-editor-undo-bar-close-button =
+    .title = Mdel
+pdfjs-editor-undo-bar-close-button-label = Mdel
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-title = Rnu azmul
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Anaw
+    .title = Anaw
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Sune桑
+    .title = Sune桑
+pdfjs-editor-add-signature-image-button = Tugna
+    .title = Tugna
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Zru azmul-ik
+    .placeholder = Zru azmul-ik
+pdfjs-editor-add-signature-draw-placeholder = Sune桑 azmul-ik
+pdfjs-editor-add-signature-draw-thickness-range-label = Tuzert
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Tuzert n usune桑: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Se岣ucce岣� afaylu da akken ad t-sali峁�
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] ne桑 fren ifuyla n tugna
+       *[other] ne桑 inig ifuyla n tugna
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Aglam (a岣峳is amlellay)
+pdfjs-editor-add-signature-description-input =
+    .title = Aglam (a岣峳is amlellay)
+pdfjs-editor-add-signature-description-default-when-drawing = Azmul
+pdfjs-editor-add-signature-clear-button-label = Sfe岣� azmul
+pdfjs-editor-add-signature-clear-button =
+    .title = Sfe岣� azmul
+pdfjs-editor-add-signature-save-checkbox = Sekles azmul
+pdfjs-editor-add-signature-image-upload-error-title = Ur izmir ara ad yessali tugna
+pdfjs-editor-add-signature-image-upload-error-description = Ssefqed tuqqna-inek鈰卛nem n u岷揺峁弓a ne桑 蓻re岣� tugna-nni岣峞n.
+pdfjs-editor-add-signature-image-no-data-error-title = D awez桑i aselket n tugna-a 桑er uzmul
+pdfjs-editor-add-signature-image-no-data-error-description = Ttxil-k鈰卪 蓻re岣� ad tzedme岣� tugna ni岣峞n
+pdfjs-editor-add-signature-error-close-button = Mdel
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Semmet
+pdfjs-editor-add-signature-add-button = Rnu
+pdfjs-editor-edit-signature-update-button = Leqqem
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 岷抮eg awennit
+pdfjs-editor-edit-comment-popup-button =
+    .title = 岷抮eg awennit
+pdfjs-editor-delete-comment-popup-button-label = Kkes awennit
+pdfjs-editor-delete-comment-popup-button =
+    .title = Kkes awennit
+pdfjs-show-comment-button =
+    .title = Sken awennit
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 岷抮eg awennit
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Rnu awennit
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Bdu tira...
+pdfjs-editor-edit-comment-dialog-cancel-button = Sefsex
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Kkes azmul yettwakelsen
+pdfjs-editor-delete-signature-button-label1 = Kkes azmul yettwakelsen
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 岷抮eg aglam
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 岷抮eg aglam
diff --git a/public/pdfjs/web/locale/kk/viewer.ftl b/public/pdfjs/web/locale/kk/viewer.ftl
new file mode 100644
index 0000000..19cbbe2
--- /dev/null
+++ b/public/pdfjs/web/locale/kk/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 袗谢写褘遥覔褘 锌邪褉邪覜
+pdfjs-previous-button-label = 袗谢写褘遥覔褘褋褘
+pdfjs-next-button =
+    .title = 袣械谢械褋褨 锌邪褉邪覜
+pdfjs-next-button-label = 袣械谢械褋褨
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 袩邪褉邪覜
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 褨褕褨薪械薪
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = (锌邪褉邪覜 { $pageNumber }, { $pagesCount } 褨褕褨薪械薪)
+pdfjs-zoom-out-button =
+    .title = 袣褨褕褨褉械泄褌褍
+pdfjs-zoom-out-button-label = 袣褨褕褨褉械泄褌褍
+pdfjs-zoom-in-button =
+    .title = 耶谢泻械泄褌褍
+pdfjs-zoom-in-button-label = 耶谢泻械泄褌褍
+pdfjs-zoom-select =
+    .title = 袦邪褋褕褌邪斜
+pdfjs-presentation-mode-button =
+    .title = 袩褉械蟹械薪褌邪褑懈褟 褉械卸懈屑褨薪械 邪褍褘褋褍
+pdfjs-presentation-mode-button-label = 袩褉械蟹械薪褌邪褑懈褟 褉械卸懈屑褨
+pdfjs-open-file-button =
+    .title = 肖邪泄谢写褘 邪褕褍
+pdfjs-open-file-button-label = 袗褕褍
+pdfjs-print-button =
+    .title = 袘邪褋锌邪覔邪 褕褘覔邪褉褍
+pdfjs-print-button-label = 袘邪褋锌邪覔邪 褕褘覔邪褉褍
+pdfjs-save-button =
+    .title = 小邪覜褌邪褍
+pdfjs-save-button-label = 小邪覜褌邪褍
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 袞爷泻褌械锌 邪谢褍
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 袞爷泻褌械锌 邪谢褍
+pdfjs-bookmark-button =
+    .title = 袗覔褘屑写邪覔褘 斜械褌 (袗覔褘屑写邪覔褘 斜械褌褌械薪 URL 邪写褉械褋褨薪 泻萤褉褍)
+pdfjs-bookmark-button-label = 袗覔褘屑写邪覔褘 斜械褌
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 覛冶褉邪谢写邪褉
+pdfjs-tools-button-label = 覛冶褉邪谢写邪褉
+pdfjs-first-page-button =
+    .title = 袗谢覔邪褕覜褘 锌邪褉邪覜覜邪 萤褌褍
+pdfjs-first-page-button-label = 袗谢覔邪褕覜褘 锌邪褉邪覜覜邪 萤褌褍
+pdfjs-last-page-button =
+    .title = 小芯遥覔褘 锌邪褉邪覜覜邪 萤褌褍
+pdfjs-last-page-button-label = 小芯遥覔褘 锌邪褉邪覜覜邪 萤褌褍
+pdfjs-page-rotate-cw-button =
+    .title = 小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘屑械薪 邪泄薪邪谢写褘褉褍
+pdfjs-page-rotate-cw-button-label = 小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘屑械薪 斜冶褉褍
+pdfjs-page-rotate-ccw-button =
+    .title = 小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘薪邪 覜邪褉褋褘 斜冶褉褍
+pdfjs-page-rotate-ccw-button-label = 小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘薪邪 覜邪褉褋褘 斜冶褉褍
+pdfjs-cursor-text-select-tool-button =
+    .title = 袦訖褌褨薪写褨 褌邪遥写邪褍 覜冶褉邪谢褘薪 褨褋泻械 覜芯褋褍
+pdfjs-cursor-text-select-tool-button-label = 袦訖褌褨薪写褨 褌邪遥写邪褍 覜冶褉邪谢褘
+pdfjs-cursor-hand-tool-button =
+    .title = 覛芯谢 覜冶褉邪谢褘薪 褨褋泻械 覜芯褋褍
+pdfjs-cursor-hand-tool-button-label = 覛芯谢 覜冶褉邪谢褘
+pdfjs-scroll-page-button =
+    .title = 袘械褌褌械褉写褨 邪泄薪邪谢写褘褉褍写褘 锌邪泄写邪谢邪薪褍
+pdfjs-scroll-page-button-label = 袘械褌褌械褉写褨 邪泄薪邪谢写褘褉褍
+pdfjs-scroll-vertical-button =
+    .title = 袙械褉褌懈泻邪谢写褘 邪泄薪邪谢写褘褉褍写褘 覜芯谢写邪薪褍
+pdfjs-scroll-vertical-button-label = 袙械褉褌懈泻邪谢写褘 邪泄薪邪谢写褘褉褍
+pdfjs-scroll-horizontal-button =
+    .title = 袚芯褉懈蟹芯薪褌邪谢写褘 邪泄薪邪谢写褘褉褍写褘 覜芯谢写邪薪褍
+pdfjs-scroll-horizontal-button-label = 袚芯褉懈蟹芯薪褌邪谢写褘 邪泄薪邪谢写褘褉褍
+pdfjs-scroll-wrapped-button =
+    .title = 袦邪褋褕褌邪斜褌邪谢邪褌褘薪 邪泄薪邪谢写褘褉褍写褘 覜芯谢写邪薪褍
+pdfjs-scroll-wrapped-button-label = 袦邪褋褕褌邪斜褌邪谢邪褌褘薪 邪泄薪邪谢写褘褉褍
+pdfjs-spread-none-button =
+    .title = 袞邪蟹褘覜 斜械褌褌械褉 褉械卸懈屑褨薪 覜芯谢写邪薪斜邪褍
+pdfjs-spread-none-button-label = 袞邪蟹褘覜 斜械褌褌械褉 褉械卸懈屑褋褨蟹
+pdfjs-spread-odd-button =
+    .title = 袞邪蟹褘覜 斜械褌褌械褉 褌邪覜 薪萤屑褨褉谢褨 斜械褌褌械褉写械薪 斜邪褋褌邪谢邪写褘
+pdfjs-spread-odd-button-label = 孝邪覜 薪萤屑褨褉谢褨 斜械褌褌械褉 褋芯谢 卸邪覜褌邪薪
+pdfjs-spread-even-button =
+    .title = 袞邪蟹褘覜 斜械褌褌械褉 卸冶锌 薪萤屑褨褉谢褨 斜械褌褌械褉写械薪 斜邪褋褌邪谢邪写褘
+pdfjs-spread-even-button-label = 袞冶锌 薪萤屑褨褉谢褨 斜械褌褌械褉 褋芯谢 卸邪覜褌邪薪
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 覛冶卸邪褌 覜邪褋懈械褌褌械褉褨鈥�
+pdfjs-document-properties-button-label = 覛冶卸邪褌 覜邪褋懈械褌褌械褉褨鈥�
+pdfjs-document-properties-file-name = 肖邪泄谢 邪褌褘:
+pdfjs-document-properties-file-size = 肖邪泄谢 萤谢褕械屑褨:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 袣袘 ({ $b } 斜邪泄褌)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 袦袘 ({ $b } 斜邪泄褌)
+pdfjs-document-properties-title = 孝邪覜褘褉褘斜褘:
+pdfjs-document-properties-author = 袗胁褌芯褉褘:
+pdfjs-document-properties-subject = 孝邪覜褘褉褘斜褘:
+pdfjs-document-properties-keywords = 袣褨谢褌 褋萤蟹写械褉:
+pdfjs-document-properties-creation-date = 袞邪褋邪谢覔邪薪 泻爷薪褨:
+pdfjs-document-properties-modification-date = 孝爷蟹械褌褍 泻爷薪褨:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 袞邪褋邪覔邪薪:
+pdfjs-document-properties-producer = PDF 萤薪写褨褉谐械薪:
+pdfjs-document-properties-version = PDF 薪冶褋覜邪褋褘:
+pdfjs-document-properties-page-count = 袘械褌褌械褉 褋邪薪褘:
+pdfjs-document-properties-page-size = 袘械褌 萤谢褕械屑褨:
+pdfjs-document-properties-page-size-unit-inches = 写褞泄屑
+pdfjs-document-properties-page-size-unit-millimeters = 屑屑
+pdfjs-document-properties-page-size-orientation-portrait = 褌褨泻
+pdfjs-document-properties-page-size-orientation-landscape = 卸邪褌褘覜
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 袞褘谢写邪屑 Web 泻萤褉褨薪褨褋褨:
+pdfjs-document-properties-linearized-yes = 袠訖
+pdfjs-document-properties-linearized-no = 袞芯覜
+pdfjs-document-properties-close-button = 袞邪斜褍
+
+## Print
+
+pdfjs-print-progress-message = 覛冶卸邪褌褌褘 斜邪褋锌邪覔邪 褕褘覔邪褉褍 爷褕褨薪 写邪泄褘薪写邪褍鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 袘邪褋 褌邪褉褌褍
+pdfjs-printing-not-supported = 袝褋泻械褉褌褍: 袘邪褋锌邪覔邪 褕褘覔邪褉褍写褘 斜冶谢 斜褉邪褍蟹械褉 褌芯谢褘覔褘屑械薪 覜芯谢写邪屑邪泄写褘.
+pdfjs-printing-not-ready = 袝褋泻械褉褌褍: 袘邪褋锌邪覔邪 褕褘覔邪褉褍 爷褕褨薪, 斜冶谢 PDF 褌芯谢褘覔褘屑械薪 卸爷泻褌械谢褨锌 邪谢褘薪斜邪写褘.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 袘爷泄褨褉 锌邪薪械谢褨薪 泻萤褉褋械褌褍/卸邪褋褘褉褍
+pdfjs-toggle-sidebar-notification-button =
+    .title = 袘爷泄褨褉 锌邪薪械谢褨薪 泻萤褉褋械褌褍/卸邪褋褘褉褍 (覜冶卸邪褌褌邪 覜冶褉褘谢褘屑褘/褋邪谢褘薪褘屑写邪褉/覜邪斜邪褌褌邪褉 斜邪褉)
+pdfjs-toggle-sidebar-button-label = 袘爷泄褨褉 锌邪薪械谢褨薪 泻萤褉褋械褌褍/卸邪褋褘褉褍
+pdfjs-document-outline-button =
+    .title = 覛冶卸邪褌 覜冶褉褘谢褘屑褘薪 泻萤褉褋械褌褍 (斜邪褉谢褘覜 薪訖褉褋械谢械褉写褨 卸邪蟹褘覜 覜褘谢褍/卸懈薪邪褍 爷褕褨薪 覜芯褋 褕械褉褌褍 泻械褉械泻)
+pdfjs-document-outline-button-label = 覛冶卸邪褌 覜冶褉邪屑邪褋褘
+pdfjs-attachments-button =
+    .title = 小邪谢褘薪褘屑写邪褉写褘 泻萤褉褋械褌褍
+pdfjs-attachments-button-label = 小邪谢褘薪褘屑写邪褉
+pdfjs-layers-button =
+    .title = 覛邪斜邪褌褌邪褉写褘 泻萤褉褋械褌褍 (斜邪褉谢褘覜 覜邪斜邪褌褌邪褉写褘 斜邪褋褌邪锌覜褘 泻爷泄谐械 泻械谢褌褨褉褍 爷褕褨薪 械泻褨 褉械褌 褕械褉褌褨遥褨蟹)
+pdfjs-layers-button-label = 覛邪斜邪褌褌邪褉
+pdfjs-thumbs-button =
+    .title = 袣褨褕褨 泻萤褉褨薪褨褋褌械褉写褨 泻萤褉褋械褌褍
+pdfjs-thumbs-button-label = 袣褨褕褨 泻萤褉褨薪褨褋褌械褉
+pdfjs-current-outline-item-button =
+    .title = 覛冶褉褘谢褘屑薪褘遥 邪覔褘屑写邪覔褘 褝谢械屑械薪褌褨薪 褌邪斜褍
+pdfjs-current-outline-item-button-label = 覛冶褉褘谢褘屑薪褘遥 邪覔褘屑写邪覔褘 褝谢械屑械薪褌褨
+pdfjs-findbar-button =
+    .title = 覛冶卸邪褌褌邪薪 褌邪斜褍
+pdfjs-findbar-button-label = 孝邪斜褍
+pdfjs-additional-layers = 覛芯褋褘屑褕邪 覜邪斜邪褌褌邪褉
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page } 锌邪褉邪覔褘
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 锌邪褉邪覔褘 爷褕褨薪 泻褨褕褨 泻萤褉褨薪褨褋褨
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = { $page } 斜械褌褨薪 褌邪遥写邪褍
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 袘械褌 { $page }/{ $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 孝邪斜褍
+    .placeholder = 覛冶卸邪褌褌邪薪 褌邪斜褍鈥�
+pdfjs-find-previous-button =
+    .title = 袨褋褘 褋萤蟹写械褉写褨遥 屑訖褌褨薪薪械薪 邪谢写褘遥覔褘 泻械蟹写械褋褍褨薪 褌邪斜褍
+pdfjs-find-previous-button-label = 袗谢写褘遥覔褘褋褘
+pdfjs-find-next-button =
+    .title = 袨褋褘 褋萤蟹写械褉写褨遥 屑訖褌褨薪薪械薪 泻械谢械褋褨 泻械蟹写械褋褍褨薪 褌邪斜褍
+pdfjs-find-next-button-label = 袣械谢械褋褨
+pdfjs-find-highlight-checkbox = 袘邪褉谢褘覔褘薪 褌爷褋锌械薪 械褉械泻褕械谢械褍
+pdfjs-find-match-case-checkbox-label = 袪械谐懈褋褌褉写褨 械褋泻械褉褍
+pdfjs-find-match-diacritics-checkbox-label = 袛懈邪泻褉懈褌懈泻邪薪褘 械褋泻械褉褍
+pdfjs-find-entire-word-checkbox-label = 小萤蟹写械褉 褌芯谢褘覔褘屑械薪
+pdfjs-find-reached-top = 覛冶卸邪褌褌褘遥 斜邪褋褘薪邪 卸械褌褌褨泻, 褋芯遥褘薪邪薪 斜邪褋褌邪锌 卸邪谢覔邪褋褌褘褉邪屑褘蟹
+pdfjs-find-reached-bottom = 覛冶卸邪褌褌褘遥 褋芯遥褘薪邪 卸械褌褌褨泻, 斜邪褋褘薪邪薪 斜邪褋褌邪锌 卸邪谢覔邪褋褌褘褉邪屑褘蟹
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 褋訖泄泻械褋褌褨泻, 斜邪褉谢褘覔褘 { $total }
+       *[other] { $current } 褋訖泄泻械褋褌褨泻, 斜邪褉谢褘覔褘 { $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] { $limit } 褋訖泄泻械褋褌褨泻褌械薪 泻萤锌
+       *[other] { $limit } 褋訖泄泻械褋褌褨泻褌械薪 泻萤锌
+    }
+pdfjs-find-not-found = 小萤蟹(写械褉) 褌邪斜褘谢屑邪写褘
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 袩邪褉邪覜 械薪褨
+pdfjs-page-scale-fit = 袩邪褉邪覜褌褘 褋褘泄写褘褉褍
+pdfjs-page-scale-auto = 袗胁褌芯屑邪褋褕褌邪斜褌邪褍
+pdfjs-page-scale-actual = 袧邪覜褌褘 萤谢褕械屑褨
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 袘械褌 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 卸爷泻褌械褍 泻械蟹褨薪写械 覜邪褌械 泻械褌褌褨.
+pdfjs-invalid-file-error = 袟邪覜褘屑写邪谢覔邪薪 薪械屑械褋械 覜邪褌械 PDF 褎邪泄谢.
+pdfjs-missing-file-error = PDF 褎邪泄谢褘 卸芯覜.
+pdfjs-unexpected-response-error = 小械褉胁械褉写褨遥 泻爷褌锌械谐械薪 卸邪褍邪斜褘.
+pdfjs-rendering-error = 袩邪褉邪覜褌褘 萤遥写械褍 泻械蟹褨薪写械 覜邪褌械 泻械褌褌褨.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 邪遥写邪褌锌邪褋褘]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 袘冶谢 PDF 褎邪泄谢褘薪 邪褕褍 爷褕褨薪 锌邪褉芯谢褜写褨 械薪谐褨蟹褨遥褨蟹.
+pdfjs-password-invalid = 袩邪褉芯谢褜 写冶褉褘褋 械屑械褋. 覛邪泄褌邪谢邪锌 泻萤褉褨遥褨蟹.
+pdfjs-password-ok-button = 袨袣
+pdfjs-password-cancel-button = 袘邪褋 褌邪褉褌褍
+pdfjs-web-fonts-disabled = 袙械斜 覜邪褉褨锌褌械褉褨 褋萤薪写褨褉褨谢谐械薪: 覜冶褉邪屑褘薪邪 械薪谐褨蟹褨谢谐械薪 PDF 覜邪褉褨锌褌械褉褨薪 覜芯谢写邪薪褍 屑爷屑泻褨薪 械屑械褋.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 袦訖褌褨薪
+pdfjs-editor-color-picker-free-text-input =
+    .title = 袦訖褌褨薪 褌爷褋褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-free-text-button-label = 袦訖褌褨薪
+pdfjs-editor-ink-button =
+    .title = 小褍褉械褌 褋邪谢褍
+pdfjs-editor-color-picker-ink-input =
+    .title = 小褘蟹斜邪 褌爷褋褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-ink-button-label = 小褍褉械褌 褋邪谢褍
+pdfjs-editor-stamp-button =
+    .title = 小褍褉械褌褌械褉写褨 覜芯褋褍 薪械屑械褋械 褌爷蟹械褌褍
+pdfjs-editor-stamp-button-label = 小褍褉械褌褌械褉写褨 覜芯褋褍 薪械屑械褋械 褌爷蟹械褌褍
+pdfjs-editor-highlight-button =
+    .title = 袝褉械泻褕械谢械褍
+pdfjs-editor-highlight-button-label = 袝褉械泻褕械谢械褍
+pdfjs-highlight-floating-button1 =
+    .title = 袝褉械泻褕械谢械褍
+    .aria-label = 袝褉械泻褕械谢械褍
+pdfjs-highlight-floating-button-label = 袝褉械泻褕械谢械褍
+pdfjs-comment-floating-button =
+    .title = 孝爷褋褨薪写褨褉屑械
+    .aria-label = 孝爷褋褨薪写褨褉屑械
+pdfjs-comment-floating-button-label = 孝爷褋褨薪写褨褉屑械
+pdfjs-editor-comment-button =
+    .title = 孝爷褋褨薪写褨褉屑械
+    .aria-label = 孝爷褋褨薪写褨褉屑械
+pdfjs-editor-comment-button-label = 孝爷褋褨薪写褨褉屑械
+pdfjs-editor-signature-button =
+    .title = 覛芯谢褌邪遥斜邪薪褘 覜芯褋褍
+pdfjs-editor-signature-button-label = 覛芯谢褌邪遥斜邪薪褘 覜芯褋褍
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 袝褉械泻褕械谢械褍 褌爷蟹械褌泻褨褕褨
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 小褍褉械褌 褋邪谢褍 褌爷蟹械褌泻褨褕褨
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 覛芯谢褌邪遥斜邪 褌爷蟹械褌泻褨褕褨: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 小褍褉械褌 褉械写邪泻褌芯褉褘
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 小褘蟹斜邪薪褘 萤褕褨褉褍
+pdfjs-editor-remove-freetext-button =
+    .title = 袦訖褌褨薪写褨 萤褕褨褉褍
+pdfjs-editor-remove-stamp-button =
+    .title = 小褍褉械褌褌褨 萤褕褨褉褍
+pdfjs-editor-remove-highlight-button =
+    .title = 孝爷褋锌械薪 械褉械泻褕械谢械褍写褨 萤褕褨褉褍
+pdfjs-editor-remove-signature-button =
+    .title = 覛芯谢褌邪遥斜邪薪褘 萤褕褨褉褍
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 孝爷褋
+pdfjs-editor-free-text-size-input = 莹谢褕械屑褨
+pdfjs-editor-ink-color-input = 孝爷褋
+pdfjs-editor-ink-thickness-input = 覛邪谢褘遥写褘覔褘
+pdfjs-editor-ink-opacity-input = 袦萤谢写褨褉褋褨蟹写褨谐褨
+pdfjs-editor-stamp-add-image-button =
+    .title = 小褍褉械褌褌褨 覜芯褋褍
+pdfjs-editor-stamp-add-image-button-label = 小褍褉械褌褌褨 覜芯褋褍
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 覛邪谢褘遥写褘覔褘
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 袦訖褌褨薪薪械薪 斜邪褋覜邪 褝谢械屑械薪褌褌械褉写褨 械褉械泻褕械谢械褍 泻械蟹褨薪写械 覜邪谢褘遥写褘覜褌褘 萤蟹谐械褉褌褍
+pdfjs-editor-add-signature-container =
+    .aria-label = 覛芯谢褌邪遥斜邪谢邪褉写褘 斜邪褋覜邪褉褍 卸訖薪械 褋邪覜褌邪谢覔邪薪 覜芯谢褌邪遥斜邪谢邪褉
+pdfjs-editor-signature-add-signature-button =
+    .title = 袞邪遥邪 覜芯谢褌邪遥斜邪薪褘 覜芯褋褍
+pdfjs-editor-signature-add-signature-button-label = 袞邪遥邪 覜芯谢褌邪遥斜邪薪褘 覜芯褋褍
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 小邪覜褌邪谢覔邪薪 覜芯谢褌邪遥斜邪: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 袦訖褌褨薪 褌爷蟹械褌泻褨褕褨
+    .default-content = 孝械褉褨锌 斜邪褋褌邪遥褘蟹鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 孝爷褋褨薪写褨褉屑械谢械褉
+       *[other] 孝爷褋褨薪写褨褉屑械谢械褉
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 袘爷泄褨褉 锌邪薪械谢褨薪 卸邪斜褍
+    .aria-label = 袘爷泄褨褉 锌邪薪械谢褨薪 卸邪斜褍
+pdfjs-editor-comments-sidebar-close-button-label = 袘爷泄褨褉 锌邪薪械谢褨薪 卸邪斜褍
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 袧邪蟹邪褉 邪褍写邪褉邪褉谢褘覜 斜褨褉写械遥械 泻萤褉写褨遥褨蟹 斜械? 袨薪褘 械褉械泻褕械谢械锌, 褌爷褋褨薪写褨褉屑械 覜邪谢写褘褉褘遥褘蟹.
+pdfjs-editor-comments-sidebar-no-comments-link = 袣萤斜褨褉械泻 斜褨谢褍
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 袘邪谢邪屑邪 屑訖褌褨薪
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 袘邪谢邪屑邪 屑訖褌褨薪写褨 萤遥写械褍
+pdfjs-editor-alt-text-dialog-label = 袨锌褑懈褟薪褘 褌邪遥写邪褍
+pdfjs-editor-alt-text-dialog-description = 袘邪谢邪屑邪 屑訖褌褨薪 邪写邪屑写邪褉 褋褍褉械褌褌褨 泻萤褉械 邪谢屑邪覔邪薪写邪 薪械屑械褋械 芯谢 卸爷泻褌械谢屑械谐械薪写械 泻萤屑械泻褌械褋械写褨.
+pdfjs-editor-alt-text-add-description-label = 小懈锌邪褌褌邪屑邪薪褘 覜芯褋褍
+pdfjs-editor-alt-text-add-description-description = 孝邪覜褘褉褘锌褌褘, 斜邪锌褌邪褍写褘 薪械屑械褋械 訖褉械泻械褌褌褨 褋懈锌邪褌褌邪泄褌褘薪 1-2 褋萤泄谢械屑写褨 覜芯谢写邪薪褍覔邪 褌褘褉褘褋褘遥褘蟹.
+pdfjs-editor-alt-text-mark-decorative-label = 袛械泻芯褉邪褌懈胁褌褨 写械锌 斜械谢谐褨谢械褍
+pdfjs-editor-alt-text-mark-decorative-description = 袘冶谢 卸懈械泻褌械褉 薪械屑械褋械 褋褍 斜械谢谐褨谢械褉褨 褋懈褟覜褌褘 芯褞谢褘覜 褋褍褉械褌褌械褉 爷褕褨薪 锌邪泄写邪谢邪薪褘谢邪写褘.
+pdfjs-editor-alt-text-cancel-button = 袘邪褋 褌邪褉褌褍
+pdfjs-editor-alt-text-save-button = 小邪覜褌邪褍
+pdfjs-editor-alt-text-decorative-tooltip = 袛械泻芯褉邪褌懈胁褌褨 写械锌 斜械谢谐褨谢械薪谐械薪
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 袦褘褋邪谢褘, "袞邪褋 卸褨谐褨褌 褌邪屑邪覜 褨褕褍 爷褕褨薪 爷褋褌械谢 斜邪褋褘薪邪 芯褌褘褉邪写褘"
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 袘邪谢邪屑邪 屑訖褌褨薪
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 袞芯覔邪褉覔褘 褋芯谢 卸邪覜 斜冶褉褘褕 鈥� 萤谢褕械屑褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 袞芯覔邪褉覔褘 芯褉褌邪褋褘 鈥� 萤谢褕械屑褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-resizer-top-right =
+    .aria-label = 袞芯覔邪褉覔褘 芯遥 卸邪覜 斜冶褉褘褕 鈥� 萤谢褕械屑褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 袨褉褌邪遥覔褘 芯遥 卸邪覜 鈥� 萤谢褕械屑褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 孝萤屑械薪谐褨 芯遥 卸邪覜 斜冶褉褘褕 鈥� 萤谢褕械屑褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 孝萤屑械薪谐褨 芯褉褌邪褋褘 鈥� 萤谢褕械屑褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 孝萤屑械薪谐褨 褋芯谢 卸邪覜 斜冶褉褘褕 鈥� 萤谢褕械屑褨薪 萤蟹谐械褉褌褍
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 袨褉褌邪遥覔褘 褋芯谢 卸邪覜 鈥� 萤谢褕械屑褨薪 萤蟹谐械褉褌褍
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 袝褉械泻褕械谢械褍 褌爷褋褨
+pdfjs-editor-colorpicker-button =
+    .title = 孝爷褋褌褨 萤蟹谐械褉褌褍
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 孝爷褋 褌邪遥写邪褍谢邪褉褘
+pdfjs-editor-colorpicker-yellow =
+    .title = 小邪褉褘
+pdfjs-editor-colorpicker-green =
+    .title = 袞邪褋褘谢
+pdfjs-editor-colorpicker-blue =
+    .title = 袣萤泻
+pdfjs-editor-colorpicker-pink =
+    .title = 覛褘蟹覔褘谢褌
+pdfjs-editor-colorpicker-red =
+    .title = 覛褘蟹褘谢
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 袘邪褉谢褘覔褘薪 泻萤褉褋械褌褍
+pdfjs-editor-highlight-show-all-button =
+    .title = 袘邪褉谢褘覔褘薪 泻萤褉褋械褌褍
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 袘邪谢邪屑邪 屑訖褌褨薪写褨 萤遥写械褍 (褋褍褉械褌 褋懈锌邪褌褌邪屑邪褋褘)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 袘邪谢邪屑邪 屑訖褌褨薪写褨 覜芯褋褍 (褋褍褉械褌 褋懈锌邪褌褌邪屑邪褋褘)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 小懈锌邪褌褌邪屑邪遥褘蟹写褘 芯褋褘薪写邪 卸邪蟹褘遥褘蟹鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 小褍褉械褌褌褨 泻萤褉械 邪谢屑邪泄褌褘薪 邪写邪屑写邪褉 爷褕褨薪 薪械屑械褋械 褋褍褉械褌 卸爷泻褌械谢屑械谐械薪 泻械蟹褨薪械 邪褉薪邪谢覔邪薪 覜褘褋覜邪褕邪 褋懈锌邪褌褌邪屑邪.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 袘冶谢 斜邪谢邪屑邪 屑訖褌褨薪 邪胁褌芯屑邪褌褌褘 褌爷褉写械 卸邪褋邪谢写褘 卸訖薪械 写訖谢褋褨蟹 斜芯谢褍褘 屑爷屑泻褨薪.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 袣萤斜褨褉械泻 斜褨谢褍
+pdfjs-editor-new-alt-text-create-automatically-button-label = 袘邪谢邪屑邪 屑訖褌褨薪写褨 邪胁褌芯屑邪褌褌褘 褌爷褉写械 卸邪褋邪褍
+pdfjs-editor-new-alt-text-not-now-button = 覛邪蟹褨褉 械屑械褋
+pdfjs-editor-new-alt-text-error-title = 袘邪谢邪屑邪 屑訖褌褨薪写褨 邪胁褌芯屑邪褌褌褘 褌爷褉写械 卸邪褋邪褍 屑爷屑泻褨薪 斜芯谢屑邪写褘
+pdfjs-editor-new-alt-text-error-description = 莹蟹褨遥褨蟹写褨遥 斜邪谢邪屑邪 屑訖褌褨薪褨遥褨蟹写褨 卸邪蟹褘遥褘蟹 薪械屑械褋械 泻械泄褨薪褨褉械泻 覜邪泄褌邪谢邪锌 泻萤褉褨遥褨蟹.
+pdfjs-editor-new-alt-text-error-close-button = 袞邪斜褍
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 袘邪谢邪屑邪 屑訖褌褨薪 爷褕褨薪 袞袠 屑芯写械谢褨 卸爷泻褌械锌 邪谢褘薪褍写邪 ({ $downloadedSize }/{ $totalSize } 袦袘)
+    .aria-valuetext = 袘邪谢邪屑邪 屑訖褌褨薪 爷褕褨薪 袞袠 屑芯写械谢褨 卸爷泻褌械锌 邪谢褘薪褍写邪 ({ $downloadedSize }/{ $totalSize } 袦袘)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 袘邪谢邪屑邪 屑訖褌褨薪 覜芯褋褘谢写褘
+pdfjs-editor-new-alt-text-added-button-label = 袘邪谢邪屑邪 屑訖褌褨薪 覜芯褋褘谢写褘
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 袘邪谢邪屑邪 屑訖褌褨薪 卸芯覜
+pdfjs-editor-new-alt-text-missing-button-label = 袘邪谢邪屑邪 屑訖褌褨薪 卸芯覜
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 袘邪谢邪屑邪 屑訖褌褨薪谐械 锌褨泻褨褉 覜邪谢写褘褉褍
+pdfjs-editor-new-alt-text-to-review-button-label = 袘邪谢邪屑邪 屑訖褌褨薪谐械 锌褨泻褨褉 覜邪谢写褘褉褍
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 袗胁褌芯屑邪褌褌褘 褌爷褉写械 卸邪褋邪谢写褘: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 小褍褉械褌褌褨遥 斜邪谢邪屑邪 屑訖褌褨薪褨薪褨遥 斜邪锌褌邪褍谢邪褉褘
+pdfjs-image-alt-text-settings-button-label = 小褍褉械褌褌褨遥 斜邪谢邪屑邪 屑訖褌褨薪褨薪褨遥 斜邪锌褌邪褍谢邪褉褘
+pdfjs-editor-alt-text-settings-dialog-label = 小褍褉械褌褌褨遥 斜邪谢邪屑邪 屑訖褌褨薪褨薪褨遥 斜邪锌褌邪褍谢邪褉褘
+pdfjs-editor-alt-text-settings-automatic-title = 袗胁褌芯屑邪褌褌褘 斜邪谢邪屑邪 屑訖褌褨薪
+pdfjs-editor-alt-text-settings-create-model-button-label = 袘邪谢邪屑邪 屑訖褌褨薪写褨 邪胁褌芯屑邪褌褌褘 褌爷褉写械 卸邪褋邪褍
+pdfjs-editor-alt-text-settings-create-model-description = 小褍褉械褌褌褨 泻萤褉械 邪谢屑邪泄褌褘薪 邪写邪屑写邪褉 爷褕褨薪 薪械屑械褋械 褋褍褉械褌 卸爷泻褌械谢屑械谐械薪 泻械蟹褨薪械 邪褉薪邪谢覔邪薪 褋懈锌邪褌褌邪屑邪谢邪褉写褘 冶褋褘薪邪写褘.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 袘邪谢邪屑邪谢褘 屑訖褌褨薪薪褨遥 袞袠 屑芯写械谢褨 ({ $totalSize } 袦袘)
+pdfjs-editor-alt-text-settings-ai-model-description = 袛械褉械泻褌械褉褨遥褨蟹 卸械泻械 斜芯谢褘锌 覜邪谢褍褘 爷褕褨薪 覜冶褉褘谢覔褘遥褘蟹写邪 卸械褉谐褨谢褨泻褌褨 褌爷褉写械 卸冶屑褘褋 褨褋褌械泄写褨. 袗胁褌芯屑邪褌褌褘 斜邪谢邪屑邪 屑訖褌褨薪 爷褕褨薪 覜邪卸械褌.
+pdfjs-editor-alt-text-settings-delete-model-button = 莹褕褨褉褍
+pdfjs-editor-alt-text-settings-download-model-button = 袞爷泻褌械锌 邪谢褍
+pdfjs-editor-alt-text-settings-downloading-model-button = 袞爷泻褌械谢褨锌 邪谢褘薪褍写邪鈥�
+pdfjs-editor-alt-text-settings-editor-title = 袘邪谢邪屑邪谢褘 屑訖褌褨薪 褉械写邪泻褌芯褉褘
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 小褍褉械褌褌褨 覜芯褋覜邪薪写邪 斜邪谢邪屑邪 屑訖褌褨薪 褉械写邪泻褌芯褉褘薪 斜褨褉写械薪 泻萤褉褋械褌褍
+pdfjs-editor-alt-text-settings-show-dialog-description = 袘邪褉谢褘覜 褋褍褉械褌褌械褉写械 斜邪谢邪屑邪 屑訖褌褨薪 斜邪褉 械泻械薪褨薪械 泻萤蟹 卸械褌泻褨蟹褍谐械 泻萤屑械泻褌械褋械写褨.
+pdfjs-editor-alt-text-settings-close-button = 袞邪斜褍
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 袝褉械泻褕械谢械褍 覜芯褋褘谢写褘
+pdfjs-editor-freetext-added-alert = 袦訖褌褨薪 覜芯褋褘谢写褘
+pdfjs-editor-ink-added-alert = 小褘蟹斜邪 覜芯褋褘谢写褘
+pdfjs-editor-stamp-added-alert = 小褍褉械褌 覜芯褋褘谢写褘
+pdfjs-editor-signature-added-alert = 覛芯谢褌邪遥斜邪 覜芯褋褘谢写褘
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 袝褉械泻褕械谢械褍 萤褕褨褉褨谢写褨
+pdfjs-editor-undo-bar-message-freetext = 袦訖褌褨薪 萤褕褨褉褨谢写褨
+pdfjs-editor-undo-bar-message-ink = 小褘蟹斜邪 萤褕褨褉褨谢写褨
+pdfjs-editor-undo-bar-message-stamp = 小褍褉械褌 萤褕褨褉褨谢写褨
+pdfjs-editor-undo-bar-message-signature = 覛芯谢褌邪遥斜邪 萤褕褨褉褨谢写褨
+pdfjs-editor-undo-bar-message-comment = 孝爷褋褨薪写褨褉屑械 萤褕褨褉褨谢写褨
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 邪薪懈屑邪褑懈褟 萤褕褨褉褨谢写褨
+       *[other] { $count } 邪薪懈屑邪褑懈褟 萤褕褨褉褨谢写褨
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 袘芯谢写褘褉屑邪褍
+pdfjs-editor-undo-bar-undo-button-label = 袘芯谢写褘褉屑邪褍
+pdfjs-editor-undo-bar-close-button =
+    .title = 袞邪斜褍
+pdfjs-editor-undo-bar-close-button-label = 袞邪斜褍
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 袘冶谢 屑芯写邪谢褜写褨 褌械褉械蟹械 锌邪泄写邪谢邪薪褍褕褘覔邪 PDF 覜冶卸邪褌褘薪邪 覜芯褋褍 爷褕褨薪 覜芯谢褌邪遥斜邪 卸邪褋邪褍覔邪 屑爷屑泻褨薪写褨泻 斜械褉械写褨. 袩邪泄写邪谢邪薪褍褕褘 萤蟹 邪褌褘薪 (芯谢 斜邪谢邪屑邪 屑訖褌褨薪 褉械褌褨薪写械 写械 覜芯谢写邪薪褘谢邪写褘) 萤遥写械泄 邪谢邪写褘 卸訖薪械 覜芯谢褌邪遥斜邪薪褘 泻械泄褨薪 覜邪泄褌邪 锌邪泄写邪谢邪薪褍 爷褕褨薪 褋邪覜褌邪泄 邪谢邪写褘.
+pdfjs-editor-add-signature-dialog-title = 覛芯谢褌邪遥斜邪 覜芯褋褍
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 袝薪谐褨蟹褍
+    .title = 袝薪谐褨蟹褍
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 小褍褉械褌 褋邪谢褍
+    .title = 小褍褉械褌 褋邪谢褍
+pdfjs-editor-add-signature-image-button = 小褍褉械褌
+    .title = 小褍褉械褌
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 覛芯谢褌邪遥斜邪遥褘蟹写褘 褌械褉褨遥褨蟹
+    .placeholder = 覛芯谢褌邪遥斜邪遥褘蟹写褘 褌械褉褨遥褨蟹
+pdfjs-editor-add-signature-draw-placeholder = 覛芯谢褌邪遥斜邪遥褘蟹写褘 褋褘蟹褘遥褘蟹
+pdfjs-editor-add-signature-draw-thickness-range-label = 覛邪谢褘遥写褘覔褘
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 小褘蟹斜邪 覜邪谢褘遥蟹写褘覔褘: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 袞爷泻褌械锌 卸褨斜械褉褍 爷褕褨薪 褎邪泄谢写褘 芯褋褘 卸械褉谐械 褋爷泄褉械遥褨蟹
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 袧械屑械褋械 褋褍褉械褌 褎邪泄谢写邪褉褘薪 褌邪遥写邪遥褘蟹
+       *[other] 袧械屑械褋械 褋褍褉械褌 褎邪泄谢写邪褉褘薪 褕芯谢褘遥褘蟹
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 小懈锌邪褌褌邪屑邪 (斜邪谢邪屑邪 屑訖褌褨薪)
+pdfjs-editor-add-signature-description-input =
+    .title = 小懈锌邪褌褌邪屑邪 (斜邪谢邪屑邪 屑訖褌褨薪)
+pdfjs-editor-add-signature-description-default-when-drawing = 覛芯谢褌邪遥斜邪
+pdfjs-editor-add-signature-clear-button-label = 覛芯谢褌邪遥斜邪薪褘 萤褕褨褉褍
+pdfjs-editor-add-signature-clear-button =
+    .title = 覛芯谢褌邪遥斜邪薪褘 萤褕褨褉褍
+pdfjs-editor-add-signature-save-checkbox = 覛芯谢褌邪遥斜邪薪褘 褋邪覜褌邪褍
+pdfjs-editor-add-signature-save-warning-message = 小邪覜褌邪谢覔邪薪 5 覜芯谢褌邪遥斜邪薪褘遥 褕械谐褨薪械 卸械褌褌褨遥褨蟹. 袣萤斜褨褉械泻 褋邪覜褌邪褍 爷褕褨薪 斜褨褉械褍褨薪 邪谢褘锌 褌邪褋褌邪遥褘蟹.
+pdfjs-editor-add-signature-image-upload-error-title = 小褍褉械褌褌褨 卸爷泻褌械锌 卸褨斜械褉褍 屑爷屑泻褨薪 械屑械褋.
+pdfjs-editor-add-signature-image-upload-error-description = 袞械谢褨 斜邪泄谢邪薪褘褋褘薪 褌械泻褋械褉褨遥褨蟹 薪械屑械褋械 斜邪褋覜邪 斜械泄薪械薪褨 覜芯谢写邪薪褘锌 泻萤褉褨遥褨蟹.
+pdfjs-editor-add-signature-image-no-data-error-title = 袘冶谢 褋褍褉械褌褌褨 覜芯谢褌邪遥斜邪覔邪 褌爷褉谢械薪写褨褉褍 屑爷屑泻褨薪 械屑械褋
+pdfjs-editor-add-signature-image-no-data-error-description = 袘邪褋覜邪 褋褍褉械褌褌褨 卸爷泻褌械锌 褋邪谢褘锌 泻萤褉褨遥褨蟹.
+pdfjs-editor-add-signature-error-close-button = 袞邪斜褍
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 袘邪褋 褌邪褉褌褍
+pdfjs-editor-add-signature-add-button = 覛芯褋褍
+pdfjs-editor-edit-signature-update-button = 袞邪遥邪褉褌褍
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 孝爷褋褨薪写褨褉屑械薪褨 褌爷蟹械褌褍
+pdfjs-editor-edit-comment-popup-button =
+    .title = 孝爷褋褨薪写褨褉屑械薪褨 褌爷蟹械褌褍
+pdfjs-editor-delete-comment-popup-button-label = 孝爷褋褨薪写褨褉屑械薪褨 萤褕褨褉褍
+pdfjs-editor-delete-comment-popup-button =
+    .title = 孝爷褋褨薪写褨褉屑械薪褨 萤褕褨褉褍
+pdfjs-show-comment-button =
+    .title = 孝爷褋褨薪写褨褉屑械薪褨 泻萤褉褋械褌褍
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 孝爷褋褨薪写褨褉屑械薪褨 褌爷蟹械褌褍
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 袞邪遥邪褉褌褍
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 孝爷褋褨薪写褨褉屑械薪褨 覜芯褋褍
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 覛芯褋褍
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 孝械褉褨锌 斜邪褋褌邪遥褘蟹鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 袘邪褋 褌邪褉褌褍
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 袩褨泻褨褉 覜芯褋褍
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 袘爷泄褨褉 锌邪薪械谢褨薪 泻萤褉褋械褌褍/卸邪褋褘褉褍 (覜冶卸邪褌褌邪 泻褨褕褨 泻萤褉褨薪褨褋褌械褉/覜冶褉褘谢褘屑褘/褋邪谢褘薪褘屑写邪褉/覜邪斜邪褌褌邪褉 斜邪褉)
+pdfjs-toggle-views-manager-button1-label = 袘械褌褌械褉写褨 斜邪褋覜邪褉褍
+pdfjs-views-manager-sidebar =
+    .aria-label = 袘爷泄褨褉 锌邪薪械谢褨
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 袘爷泄褨褉 锌邪薪械谢褨薪褨遥 萤谢褕械屑褨薪 萤蟹谐械褉褌褍褕褨
+pdfjs-views-manager-view-selector-button =
+    .title = 袣萤褉褨薪褨褋褌械褉
+pdfjs-views-manager-view-selector-button-label = 袣萤褉褨薪褨褋褌械褉
+pdfjs-views-manager-pages-title = 袘械褌褌械褉
+pdfjs-views-manager-outlines-title1 = 覛冶卸邪褌 覜冶褉褘谢褘屑褘
+    .title = 覛冶卸邪褌 覜冶褉褘谢褘屑褘 (斜邪褉谢褘覜 薪訖褉褋械谢械褉写褨 卸邪褞/卸懈褞 爷褕褨薪 覜芯褋 褕械褉褌褍)
+pdfjs-views-manager-attachments-title = 小邪谢褘薪褘屑写邪褉
+pdfjs-views-manager-layers-title1 = 覛邪斜邪褌褌邪褉
+    .title = 覛邪斜邪褌褌邪褉 (斜邪褉谢褘覜 薪訖褉褋械谢械褉写褨 卸邪褞/卸懈褞 爷褕褨薪 覜芯褋 褕械褉褌褍)
+pdfjs-views-manager-pages-option-label = 袘械褌褌械褉
+pdfjs-views-manager-outlines-option-label = 覛冶卸邪褌褌褘遥 覜冶褉褘谢褘屑褘
+pdfjs-views-manager-attachments-option-label = 小邪谢褘薪褘屑写邪褉
+pdfjs-views-manager-layers-option-label = 覛邪斜邪褌褌邪褉
+pdfjs-views-manager-add-file-button =
+    .title = 肖邪泄谢写褘 覜芯褋褍
+pdfjs-views-manager-add-file-button-label = 肖邪泄谢写褘 覜芯褋褍
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } 褌邪遥写邪谢写褘
+       *[other] { $count } 褌邪遥写邪谢写褘
+    }
+pdfjs-views-manager-pages-status-none-action-label = 袘械褌褌械褉写褨 褌邪遥写邪褍
+pdfjs-views-manager-pages-status-action-button-label = 袘邪褋覜邪褉褍
+pdfjs-views-manager-pages-status-copy-button-label = 袣萤褕褨褉褨锌 邪谢褍
+pdfjs-views-manager-pages-status-cut-button-label = 覛懈褘锌 邪谢褍
+pdfjs-views-manager-pages-status-delete-button-label = 莹褕褨褉褍
+pdfjs-views-manager-pages-status-export-selected-button-label = 孝邪遥写邪谢覔邪薪写褘 褝泻褋锌芯褉褌褌邪褍鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 斜械褌 覜懈褘锌 邪谢褘薪写褘
+       *[other] { $count } 覜懈褘锌 邪谢褘薪写褘
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 斜械褌 泻萤褕褨褉褨谢写褨
+       *[other] { $count } 斜械褌 泻萤褕褨褉褨谢写褨
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 斜械褌 萤褕褨褉褨谢写褨
+       *[other] { $count } 斜械褌 萤褕褨褉褨谢写褨
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 肖邪泄谢褘遥褘蟹 写邪泄褘薪写邪谢褍写邪鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 肖邪泄谢 卸爷泻褌械锌 褋邪谢褘薪褍写邪鈥�
+pdfjs-views-manager-status-warning-cut-label = 覛懈褘锌 邪谢褍 屑爷屑泻褨薪 斜芯谢屑邪写褘. 袘械褌褌褨 卸邪遥邪褉褌褘锌, 覜邪泄褌邪谢邪锌 泻萤褉褨遥褨蟹.
+pdfjs-views-manager-status-warning-copy-label = 袣萤褕褨褉褍 屑爷屑泻褨薪 斜芯谢屑邪写褘. 袘械褌褌褨 卸邪遥邪褉褌褘锌, 覜邪泄褌邪谢邪锌 泻萤褉褨遥褨蟹.
+pdfjs-views-manager-status-warning-delete-label = 莹褕褨褉褍 屑爷屑泻褨薪 斜芯谢屑邪写褘. 袘械褌褌褨 卸邪遥邪褉褌褘锌, 覜邪泄褌邪谢邪锌 泻萤褉褨遥褨蟹.
+pdfjs-views-manager-status-warning-save-label = 小邪覜褌邪褍 屑爷屑泻褨薪 斜芯谢屑邪写褘. 袘械褌褌褨 卸邪遥邪褉褌褘锌, 覜邪泄褌邪谢邪锌 泻萤褉褨遥褨蟹.
+pdfjs-views-manager-status-undo-button-label = 袘芯谢写褘褉屑邪褍
+pdfjs-views-manager-status-done-button-label = 袛邪泄褘薪
+pdfjs-views-manager-status-close-button =
+    .title = 袞邪斜褍
+pdfjs-views-manager-status-close-button-label = 袞邪斜褍
+pdfjs-views-manager-paste-button-label = 袣褨褉褨褋褌褨褉褍
+pdfjs-views-manager-paste-button-before =
+    .title = 袘褨褉褨薪褕褨 斜械褌褌褨遥 邪谢写褘薪邪 泻褨褉褨褋褌褨褉褍
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = { $page } 斜械褌褨薪械薪 泻械泄褨薪 泻褨褉褨褋褌褨褉褍
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 袞袗尧袗
+pdfjs-views-manager-waiting-for-file = 肖邪泄谢 卸爷泻褌械锌 褋邪谢褘薪褍写邪鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 袘械褌褌械褉写褨 斜邪褋覜邪褉褍
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 小邪覜褌邪谢覔邪薪 覜芯谢褌邪遥斜邪薪褘 萤褕褨褉褍
+pdfjs-editor-delete-signature-button-label1 = 小邪覜褌邪谢覔邪薪 覜芯谢褌邪遥斜邪薪褘 萤褕褨褉褍
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 小懈锌邪褌褌邪屑邪薪褘 褌爷蟹械褌褍
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 小懈锌邪褌褌邪屑邪薪褘 褌爷蟹械褌褍
diff --git a/public/pdfjs/web/locale/km/viewer.ftl b/public/pdfjs/web/locale/km/viewer.ftl
new file mode 100644
index 0000000..cf899f4
--- /dev/null
+++ b/public/pdfjs/web/locale/km/viewer.ftl
@@ -0,0 +1,242 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 釣戓焼釣栣煇釣氣�嬦灅釣会灀
+pdfjs-previous-button-label = 釣樶灮釣�
+pdfjs-next-button =
+    .title = 釣戓焼釣栣煇釣氣�嬦灁釣撫煉釣戓灦釣斸煁
+pdfjs-next-button-label = 釣斸灀釤掅瀾釣夺灁釤�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 釣戓焼釣栣煇釣�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 釣撫焹 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 釣撫焹 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 鈥嬦灁釣勧煉釣氠灲釣�
+pdfjs-zoom-out-button-label = 鈥嬦灁釣勧煉釣氠灲釣�
+pdfjs-zoom-in-button =
+    .title = 鈥嬦灃釣勧煉釣氠灨釣�
+pdfjs-zoom-in-button-label = 鈥嬦灃釣勧煉釣氠灨釣�
+pdfjs-zoom-select =
+    .title = 釣栣瀯釤掅灇釣羔瀫
+pdfjs-presentation-mode-button =
+    .title = 釣斸煉釣娽灱釣氣�嬦瀾釤呪�嬦灇釣斸焵釣斺�嬦灁釣戔�嬦灁釣勧煉釣犪灦釣�
+pdfjs-presentation-mode-button-label = 釣氠灁釤�釣斺�嬦灁釣戔�嬦灁釣勧煉釣犪灦釣�
+pdfjs-open-file-button =
+    .title = 釣斸灳釣�鈥嬦灟釣�釣熱灦釣�
+pdfjs-open-file-button-label = 釣斸灳釣�
+pdfjs-print-button =
+    .title = 釣斸焺釤囜灃釣会灅釤掅灃
+pdfjs-print-button-label = 釣斸焺釤囜灃釣会灅釤掅灃
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 釣п灁釣�釣氠瀻釤�
+pdfjs-tools-button-label = 釣п灁釣�釣氠瀻釤�
+pdfjs-first-page-button =
+    .title = 釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀶釤嗎灁釣坚瀯鈥�
+pdfjs-first-page-button-label = 釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀶釤嗎灁釣坚瀯鈥�
+pdfjs-last-page-button =
+    .title = 釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀰釣会瀯釣�釤掅灇釤勧灆鈥�
+pdfjs-last-page-button-label = 釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀰釣会瀯釣�釤掅灇釤勧灆
+pdfjs-page-rotate-cw-button =
+    .title = 釣斸瀯釤掅灉釣丰灈鈥嬦灍釤掅灇釣斺�嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣�
+pdfjs-page-rotate-cw-button-label = 釣斸瀯釤掅灉釣丰灈鈥嬦灍釤掅灇釣斺�嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣�
+pdfjs-page-rotate-ccw-button =
+    .title = 釣斸瀯釤掅灉釣丰灈鈥嬦瀰釤掅灇釣夺灍鈥嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣垛�嬧��
+pdfjs-page-rotate-ccw-button-label = 釣斸瀯釤掅灉釣丰灈鈥嬦瀰釤掅灇釣夺灍鈥嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣垛�嬧��
+pdfjs-cursor-text-select-tool-button =
+    .title = 釣斸灳釣�鈥嬦灖釣斸瀫釣氠瀻釤嶁�嬦瀲釤掅灇釣踞灍鈥嬦灑釣忈煉釣愥灁釣�
+pdfjs-cursor-text-select-tool-button-label = 釣п灁釣�釣氠瀻釤嶁�嬦瀲釤掅灇釣踞灍鈥嬦灑釣忈煉釣愥灁釣�
+pdfjs-cursor-hand-tool-button =
+    .title = 釣斸灳釣�鈥嬦灖釣斸瀫釣氠瀻釤嶁�嬦瀶釤�
+pdfjs-cursor-hand-tool-button-label = 釣п灁釣�釣氠瀻釤嶁�嬦瀶釤�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 釣涐瀫釤掅瀬釣庘�嬦灍釣樶煉釣斸瀼釤掅瀼釣封�嬦灟釣�釣熱灦釣氣��
+pdfjs-document-properties-button-label = 釣涐瀫釤掅瀬釣庘�嬦灍釣樶煉釣斸瀼釤掅瀼釣封�嬦灟釣�釣熱灦釣氣��
+pdfjs-document-properties-file-name = 釣堘煉釣樶焺釤団�嬦灟釣�釣熱灦釣氠煐
+pdfjs-document-properties-file-size = 釣戓焼釣犪焼鈥嬦灟釣�釣熱灦釣氠煐
+pdfjs-document-properties-title = 釣呩焼釣庒瀯釣囜灳釣勧煐
+pdfjs-document-properties-author = 釣⑨煉釣撫瀫鈥嬦灀釣丰灃釣撫煉釣掅煐
+pdfjs-document-properties-subject = 釣斸煉釣氠瀿釣夺灀釣斸瀾釤�
+pdfjs-document-properties-keywords = 釣栣灦釣�釤掅灆鈥嬦瀭釣撫煉釣涐灩釤囜煐
+pdfjs-document-properties-creation-date = 釣�釣夺灈釣斸灇釣丰瀰釤掅瀱釤佱瀾鈥嬦灁釣勧煉釣�釣踞瀼釤�
+pdfjs-document-properties-modification-date = 釣�釣夺灈釣斸灇釣丰瀰釤掅瀱釤佱瀾鈥嬦瀫釤傖灁釤掅灇釤傖煐
+pdfjs-document-properties-creator = 釣⑨煉釣撫瀫鈥嬦灁釣勧煉釣�釣踞瀼釤�
+pdfjs-document-properties-producer = 釣�釣樶煉釣樶灉釣丰瀿釣糕�嬦灁釣勧煉釣�釣踞瀼 PDF 釤�
+pdfjs-document-properties-version = 釣�釤嗎瀻釤� PDF 釤�
+pdfjs-document-properties-page-count = 釣呩焼釣撫灲釣撯�嬦瀾釤嗎灃釤愥灇釤�
+pdfjs-document-properties-page-size-unit-inches = 釣⑨煀釣羔瀴
+pdfjs-document-properties-page-size-unit-millimeters = 釣樶灅
+pdfjs-document-properties-page-size-orientation-portrait = 釣斸瀴釤掅瀳釣�
+pdfjs-document-properties-page-size-orientation-landscape = 釣曖煉釣忈焷釣�
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 釣熱焼釣斸灮釣忈煉釣�
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+pdfjs-document-properties-linearized-yes = 釣斸灦釣�/釣呩灦釣�
+pdfjs-document-properties-linearized-no = 釣戓焷
+pdfjs-document-properties-close-button = 釣斸灧釣�
+
+## Print
+
+pdfjs-print-progress-message = 釣�釤嗎灃釣会瀯鈥嬦灇釤�釣斸瀰釤嗏�嬦灟釣�釣熱灦釣氣�嬦灍釣樶煉釣氠灦釣斸煁鈥嬦灁釤勧焽釣栣灮釣樶煉釣栤��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 釣斸焺釤囜灁釣勧煁
+pdfjs-printing-not-supported = 釣�釣夺灇鈥嬦灃釤掅灇釣樶灦釣撀犪煐 釣�釣垛�嬦灇鈥嬦灁釤勧焽釣栣灮釣樶煉釣栤�嬦灅釣丰灀鈥嬦瀼釤掅灇釣坚灉鈥嬦灁釣夺灀鈥嬦瀭釣夺焼釣戓煉釣氣�嬦灃釤佱瀴釣涐焷釣夆�嬦瀶釤勧灆鈥嬦瀫釣樶煉釣樶灉釣丰瀿釣糕�嬦灇釣会瀫釣氠瀫鈥嬦灀釤佱焽鈥嬦瀾釤伮犪煍
+pdfjs-printing-not-ready = 釣栣煉釣氠灅釣夺灀釤� PDF 釣樶灧釣撯�嬦瀼釤掅灇釣坚灉鈥嬦灁釣夺灀鈥嬦灂釤掅瀾釣会瀫鈥嬦瀾釣夺焼釣勧灍釤掅灇釣会瀯鈥嬦瀶釣踞灅釤掅灁釣糕�嬦灁釤勧焽釣栣灮釣樶煉釣栤�嬦瀾釤佱煍
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 釣斸灧釣�/釣斸灳釣�鈥嬦瀭釤掅灇釣夺灁釤嬧�嬦灇釤嗎瀫釣丰灈
+pdfjs-toggle-sidebar-button-label = 釣斸灧釣�/釣斸灳釣�鈥嬦瀭釤掅灇釣夺灁釤嬧�嬦灇釤嗎瀫釣丰灈
+pdfjs-document-outline-button =
+    .title = 釣斸瀯釤掅灎釣夺瀴鈥嬦瀭釤掅灇釤勧瀯鈥嬦灟釣�釣熱灦釣� (釣呩灮釣呪�嬦瀾釤掅灉釤佲�嬦瀶釣勨�嬦瀶釣踞灅釤掅灁釣糕�嬦灃釣勧煉釣氠灨釣�/釣斸瀯釤掅灇釣结灅鈥嬦瀿釣夺瀼釣烩�嬦瀾釣夺焼釣勧灑釣熱煁)
+pdfjs-document-outline-button-label = 釣傖煉釣氠焺釣勨�嬦灟釣�釣熱灦釣�
+pdfjs-attachments-button =
+    .title = 釣斸瀯釤掅灎釣夺瀴鈥嬦灟釣�釣熱灦釣氣�嬦灄釤掅瀲釣夺灁釤�
+pdfjs-attachments-button-label = 釣瀫釣熱灦釣氣�嬦灄釤掅瀲釣夺灁釤�
+pdfjs-thumbs-button =
+    .title = 釣斸瀯釤掅灎釣夺瀴鈥嬦灇釣坚灁釣椺灦釣栤�嬦瀼釣坚瀰釤�
+pdfjs-thumbs-button-label = 釣氠灲釣斸灄釣夺灃鈥嬦瀼釣坚瀰釤�
+pdfjs-findbar-button =
+    .title = 釣氠瀫鈥嬦灀釤呪�嬦瀫釤掅灀釣会瀯鈥嬦灟釣�釣熱灦釣�
+pdfjs-findbar-button-label = 釣氠瀫
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 釣戓焼釣栣煇釣� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 釣氠灱釣斸灄釣夺灃鈥嬦瀼釣坚瀰鈥嬦灇釣斸灍釤嬧�嬦瀾釤嗎灃釤愥灇 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 釣氠瀫
+    .placeholder = 釣氠瀫鈥嬦灀釤呪�嬦瀫釤掅灀釣会瀯鈥嬦灟釣�釣熱灦釣�...
+pdfjs-find-previous-button =
+    .title = 釣氠瀫鈥嬦灃釣夺瀫釤掅灆 釣�嬦瀮釤掅灈釣垛�嬦瀶釤傖灈鈥嬦灁釣夺灀鈥嬦瀲釣结灁鈥嬦灅釣会灀
+pdfjs-find-previous-button-label = 釣樶灮釣�
+pdfjs-find-next-button =
+    .title = 釣氠瀫鈥嬦灃釣夺瀫釤掅灆 釣�嬦瀮釤掅灈釣垛�嬦瀶釤傖灈鈥嬦灁釣夺灀鈥嬦瀲釣结灁鈥嬦灁釣撫煉釣戓灦釣斸煁
+pdfjs-find-next-button-label = 釣斸灀釤掅瀾釣夺灁釤�
+pdfjs-find-highlight-checkbox = 釣斸灀釤掅灈釣丰瀰鈥嬦瀾釣夺焼釣勧灑釣熱煁
+pdfjs-find-match-case-checkbox-label = 釣�釣氠瀻釣糕�嬦瀶釤嗎瀻釣坚瀰
+pdfjs-find-reached-top = 釣斸灦釣撯�嬦灁釣撫煉釣忊�嬦灃釣糕�嬦瀬釣夺瀯鈥嬦瀫釤掅灇釤勧灅 釣戓焻鈥嬦瀶釣涐煁鈥嬦瀬釣夺瀯鈥嬧�嬦灈釣锯�嬦灀釤冣�嬦灟釣�釣熱灦釣�
+pdfjs-find-reached-bottom = 釣斸灦釣撯�嬦灁釣撫煉釣忊�嬦灃釣糕�嬦瀬釣夺瀯釣涐灳 釣戓焻釣娽灈釤嬧�嬦瀰釣会瀯鈥嬧�嬦灀釤冣�嬦灟釣�釣熱灦釣�
+pdfjs-find-not-found = 釣氠瀫鈥嬦灅釣丰灀鈥嬦瀮釣踞瀴鈥嬦灃釣夺瀫釤掅灆 釣�嬦瀮釤掅灈釣�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 釣戓瀾釣贯瀯鈥嬦瀾釤嗎灃釤愥灇
+pdfjs-page-scale-fit = 釣熱灅鈥嬦瀾釤嗎灃釤愥灇
+pdfjs-page-scale-auto = 釣栣瀯釤掅灇釣羔瀫鈥嬦灍釤掅灉釤愥灆釣斸煉釣氠灉釣忈煉釣忈灧
+pdfjs-page-scale-actual = 釣戓焼釣犪焼鈥嬦瀲釣夺瀫釤嬦灍釤掅瀶釤傖瀯
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = 釣樶灦釣撯�嬦瀫釤嗎灎釣会灍鈥嬦灁釣夺灀鈥嬦瀫釣踞瀼釣♂灳釣勨�嬦灃釤佱灈鈥嬦瀫釤嗎灃釣会瀯鈥嬦灂釤掅瀾釣会瀫 PDF聽釤�
+pdfjs-invalid-file-error = 釣瀫釣熱灦釣� PDF 釣佱灱釣� 釣�嬦灅釣丰灀鈥嬦瀼釤掅灇釣贯灅釣忈煉釣氠灱釣溌犪煍
+pdfjs-missing-file-error = 釣斸灦釣忈煁鈥嬦灟釣�釣熱灦釣� PDF
+pdfjs-unexpected-response-error = 釣�釣夺灇鈥嬦瀱釤掅灈釣踞灆鈥嬦瀼釣樷�嬦灅釤夅灦釣熱煀釣羔灀鈥嬦灅釤佲�嬦瀶釤傖灈鈥嬦灅釣丰灀鈥嬦灁釣夺灀鈥嬦灇釤嗎灃釣贯瀯釤�
+pdfjs-rendering-error = 釣樶灦釣撯�嬦瀫釤嗎灎釣会灍鈥嬦灁釣夺灀鈥嬦瀫釣踞瀼釣♂灳釣勨�嬦灃釤佱灈鈥嬦灁釣勧煉釣犪灦釣夆�嬦瀾釤嗎灃釤愥灇聽釤�
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 釣呩焼釣庒灦釣氣�嬦灃釣撫煉釣欋灈釤媇
+
+## Password
+
+pdfjs-password-label = 釣斸瀴釤掅瀰釣坚灈鈥嬦灃釣夺瀫釤掅灆釣熱灅釤掅瀯釣夺瀼釤嬧�嬦瀶釣踞灅釤掅灁釣糕�嬦灁釣踞瀫鈥嬦灟釣�釣熱灦釣� PDF 釣撫焷釤囜煍
+pdfjs-password-invalid = 釣栣灦釣�釤掅灆釣熱灅釤掅瀯釣夺瀼釤嬧�嬦灅釣丰灀鈥嬦瀼釤掅灇釣贯灅釣忈煉釣氠灱釣溼煍 釣熱灱釣樷�嬦灃釤掅灆釣夺灆釣夺灅鈥嬦灅釤掅瀶釣勧瀾釤�釣忈煍
+pdfjs-password-ok-button = 釣欋灈釤嬧�嬦灃釤掅灇釣�
+pdfjs-password-cancel-button = 釣斸焺釤囜灁釣勧煁
+pdfjs-web-fonts-disabled = 釣斸灦釣撯�嬦灁釣丰瀾鈥嬦灃釣会灅釤掅灃釣⑨瀫釤掅灍釣氣�嬦灁釣庒煉釣娽灦釣壜犪煐 釣樶灧釣撯�嬦灑釣夺瀰鈥嬦灁釤掅灇釣锯�嬦灃釣会灅釤掅灃釣⑨瀫釤掅灍釣� PDF 釣娽焸釣涒�嬦灁釣夺灀鈥嬦灁釣勧煉釣�釣斸煁鈥嬦灁釣夺灀鈥嬦瀾釤伮犪煍
+
+## Editing
+
+pdfjs-editor-highlight-button =
+    .title = 釣氠焼釣涐焷釣�
+pdfjs-editor-highlight-button-label = 釣氠焼釣涐焷釣�
+pdfjs-highlight-floating-button-label = 釣氠焼釣涐焷釣�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-cancel-button = 釣斸焺釤囜灁釣勧煁
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 釣斸瀯釤掅灎釣夺瀴鈥嬦瀾釣夺焼釣勧灑釣熱煁
+pdfjs-editor-highlight-show-all-button =
+    .title = 釣斸瀯釤掅灎釣夺瀴鈥嬦瀾釣夺焼釣勧灑釣熱煁
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+pdfjs-editor-new-alt-text-not-now-button = 釣樶灧釣撯�嬦灅釤傖灀鈥嬦灔釣♂灱釣�
+
+## Image alt-text settings
+
+pdfjs-editor-alt-text-settings-delete-model-button = 釣涐灮釣�
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 釣斸焺釤囜灁釣勧煁
+
+##  Edit a comment dialog
+
+pdfjs-editor-edit-comment-dialog-cancel-button = 釣斸焺釤囜灁釣勧煁
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-views-manager-pages-status-delete-button-label = 釣涐灮釣�
diff --git a/public/pdfjs/web/locale/kn/viewer.ftl b/public/pdfjs/web/locale/kn/viewer.ftl
new file mode 100644
index 0000000..0da25c5
--- /dev/null
+++ b/public/pdfjs/web/locale/kn/viewer.ftl
@@ -0,0 +1,180 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 嗖灌部嗖傕拨嗖苦波 嗖硜嗖�
+pdfjs-previous-button-label = 嗖灌部嗖傕拨嗖苦波
+pdfjs-next-button =
+    .title = 嗖硜嗖傕拨嗖苦波 嗖硜嗖�
+pdfjs-next-button-label = 嗖硜嗖傕拨嗖苦波
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 嗖硜嗖�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 嗖班膊喑嵿膊嗖�
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pagesCount } 嗖班膊喑嵿膊嗖� { $pageNumber })
+pdfjs-zoom-out-button =
+    .title = 嗖曕部嗖班部嗖︵簿嗖椸部嗖膏硜
+pdfjs-zoom-out-button-label = 嗖曕部嗖班部嗖︵簿嗖椸部嗖膏部
+pdfjs-zoom-in-button =
+    .title = 嗖灌部嗖班部嗖︵簿嗖椸部嗖膏硜
+pdfjs-zoom-in-button-label = 嗖灌部嗖班部嗖︵簿嗖椸部嗖膏部
+pdfjs-zoom-select =
+    .title = 嗖椸簿嗖む硩嗖班铂嗖︵膊嗖苦哺喑�
+pdfjs-presentation-mode-button =
+    .title = 嗖硩嗖班哺喑嵿菠喑佮菠嗖� (嗖硩嗖班哺喑嗋矀嗖熰硣嗖多波喑�) 嗖曕硩嗖班伯嗖曕硩嗖曕硢 嗖拨嗖侧簿嗖部嗖膏硜
+pdfjs-presentation-mode-button-label = 嗖硩嗖班哺喑嵿菠喑佮菠嗖� (嗖硩嗖班哺喑嗋矀嗖熰硣嗖多波喑�) 嗖曕硩嗖班伯
+pdfjs-open-file-button =
+    .title = 嗖曕病嗖む驳嗖ㄠ硩嗖ㄠ硜 嗖む硢嗖班硢
+pdfjs-open-file-button-label = 嗖む硢嗖班硢嗖部嗖班部
+pdfjs-print-button =
+    .title = 嗖硜嗖︵硩嗖班部嗖膏硜
+pdfjs-print-button-label = 嗖硜嗖︵硩嗖班部嗖膏部
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 嗖夃勃嗖曕舶嗖`矖嗖赤硜
+pdfjs-tools-button-label = 嗖夃勃嗖曕舶嗖`矖嗖赤硜
+pdfjs-first-page-button =
+    .title = 嗖硦嗖︵膊 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+pdfjs-first-page-button-label = 嗖硦嗖︵膊 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+pdfjs-last-page-button =
+    .title = 嗖曕硦嗖ㄠ硢嗖� 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+pdfjs-last-page-button-label = 嗖曕硦嗖ㄠ硢嗖� 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+pdfjs-page-rotate-cw-button =
+    .title = 嗖硩嗖班拨嗖曕硩嗖粪部嗖`硢嗖膊喑嵿膊嗖� 嗖む部嗖班硜嗖椸部嗖膏硜
+pdfjs-page-rotate-cw-button-label = 嗖硩嗖班拨嗖曕硩嗖粪部嗖`硢嗖膊喑嵿膊嗖� 嗖む部嗖班硜嗖椸部嗖膏硜
+pdfjs-page-rotate-ccw-button =
+    .title = 嗖呧勃喑嵿舶嗖︵矔喑嵿卜嗖苦玻喑嗋帛嗖侧硩嗖侧部 嗖む部嗖班硜嗖椸部嗖膏硜
+pdfjs-page-rotate-ccw-button-label = 嗖呧勃喑嵿舶嗖︵矔喑嵿卜嗖苦玻喑嗋帛嗖侧硩嗖侧部 嗖む部嗖班硜嗖椸部嗖膏硜
+pdfjs-cursor-text-select-tool-button =
+    .title = 嗖矤喑嵿帛 嗖嗋帛喑嵿矔喑� 嗖夃勃嗖曕舶嗖`驳嗖ㄠ硩嗖ㄠ硜 嗖膏矔喑嵿舶嗖苦帛嗖椸硦嗖赤部嗖膏部
+pdfjs-cursor-text-select-tool-button-label = 嗖矤喑嵿帛 嗖嗋帛喑嵿矔喑嗋帛 嗖夃勃嗖曕舶嗖�
+pdfjs-cursor-hand-tool-button =
+    .title = 嗖曕硤 嗖夃勃嗖曕舶嗖`驳嗖ㄠ硩嗖ㄠ硜 嗖膏矔喑嵿舶嗖苦帛嗖椸硦嗖赤部嗖膏部
+pdfjs-cursor-hand-tool-button-label = 嗖曕硤 嗖夃勃嗖曕舶嗖�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 嗖∴簿嗖曕硩嗖硜嗖硢嗖傕矡喑嶁�� 嗖椸硜嗖`矖嗖赤硜...
+pdfjs-document-properties-button-label = 嗖∴簿嗖曕硩嗖硜嗖硢嗖傕矡喑嶁�� 嗖椸硜嗖`矖嗖赤硜...
+pdfjs-document-properties-file-name = 嗖曕病嗖む拨 嗖灌硢嗖膏舶喑�:
+pdfjs-document-properties-file-size = 嗖曕病嗖む拨 嗖椸簿嗖む硩嗖�:
+pdfjs-document-properties-title = 嗖多硛嗖班硩嗖粪部嗖曕硢:
+pdfjs-document-properties-author = 嗖曕舶喑嵿菠喑�:
+pdfjs-document-properties-subject = 嗖掂部嗖粪帛:
+pdfjs-document-properties-keywords = 嗖硜嗖栢硩嗖勃嗖︵矖嗖赤硜:
+pdfjs-document-properties-creation-date = 嗖班矚嗖苦哺嗖苦拨 嗖︵部嗖ㄠ簿嗖傕矔:
+pdfjs-document-properties-modification-date = 嗖簿嗖班硩嗖病嗖苦哺嗖侧簿嗖� 嗖︵部嗖ㄠ簿嗖傕矔:
+pdfjs-document-properties-creator = 嗖班矚嗖苦哺嗖苦拨嗖掂舶喑�:
+pdfjs-document-properties-producer = PDF 嗖夃菠喑嵿勃嗖距拨嗖�:
+pdfjs-document-properties-version = PDF 嗖嗋驳喑冟菠喑嵿菠嗖�:
+pdfjs-document-properties-page-count = 嗖硜嗖熰拨 嗖庎玻嗖苦矔喑�:
+pdfjs-document-properties-page-size-unit-inches = 嗖囙拨嗖班膊喑嵿膊嗖�
+pdfjs-document-properties-page-size-orientation-portrait = 嗖簿嗖掂矚嗖苦菠喑嵿舶
+pdfjs-document-properties-page-size-orientation-landscape = 嗖硩嗖班矔喑冟菠嗖� 嗖氞部嗖む硩嗖�
+
+##
+
+pdfjs-document-properties-close-button = 嗖硜嗖氞硩嗖氞硜
+
+## Print
+
+pdfjs-print-progress-message = 嗖硜嗖︵硩嗖班部嗖膏硜嗖掂硜嗖︵矔喑嵿矔嗖距矖嗖� 嗖︵哺喑嵿菠嗖距驳喑囙矞嗖ㄠ硩嗖ㄠ硜 嗖膏部嗖︵硩嗖о矖喑娻渤嗖苦哺嗖侧簿嗖椸硜嗖む硩嗖む部嗖︵硢鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 嗖班拨喑嵿拨喑� 嗖簿嗖∴硜
+pdfjs-printing-not-supported = 嗖庎矚喑嵿矚嗖班部嗖曕硢: 嗖� 嗖溹簿嗖侧驳喑�嗖曕硩嗖粪矔嗖︵膊喑嵿膊嗖� 嗖硜嗖︵硩嗖班玻嗖曕硩嗖曕硢 嗖膏矀嗖硞嗖班硩嗖� 嗖硢嗖傕铂嗖侧驳嗖苦膊喑嵿膊.
+pdfjs-printing-not-ready = 嗖庎矚喑嵿矚嗖班部嗖曕硢: PDF 嗖曕病嗖む驳喑� 嗖硜嗖︵硩嗖班部嗖膏膊喑� 嗖膏矀嗖硞嗖班硩嗖`驳嗖距矖嗖� 嗖侧硧嗖∴硩 嗖嗋矖嗖苦膊喑嵿膊.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 嗖拨嗖苦勃嗖熰硩嗖熰部嗖波喑嵿波喑� 嗖灌硦嗖班渤嗖苦哺喑�
+pdfjs-toggle-sidebar-button-label = 嗖拨嗖苦勃嗖熰硩嗖熰部嗖波喑嵿波喑� 嗖灌硦嗖班渤嗖苦哺喑�
+pdfjs-document-outline-button-label = 嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波 嗖灌硦嗖班舶喑囙矕喑�
+pdfjs-attachments-button =
+    .title = 嗖侧矖嗖む硩嗖む硜嗖椸渤嗖ㄠ硩嗖ㄠ硜 嗖む硧嗖班部嗖膏硜
+pdfjs-attachments-button-label = 嗖侧矖嗖む硩嗖む硜嗖椸渤喑�
+pdfjs-thumbs-button =
+    .title = 嗖氞部嗖曕硩嗖曕矚嗖苦菠喑嵿舶嗖︵矀嗖む硢 嗖む硧嗖班部嗖膏硜
+pdfjs-thumbs-button-label = 嗖氞部嗖曕硩嗖曕矚嗖苦菠喑嵿舶嗖椸渤喑�
+pdfjs-findbar-button =
+    .title = 嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波嗖侧硩嗖侧部 嗖灌硜嗖∴硜嗖曕硜
+pdfjs-findbar-button-label = 嗖灌硜嗖∴硜嗖曕硜
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 嗖硜嗖� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 嗖硜嗖熰驳嗖ㄠ硩嗖ㄠ硜 嗖氞部嗖曕硩嗖曕矚嗖苦菠喑嵿舶嗖︵矀嗖む硢 嗖む硧嗖班部嗖膏硜 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 嗖灌硜嗖∴硜嗖曕硜
+    .placeholder = 嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波嗖侧硩嗖侧部 嗖灌硜嗖∴硜嗖曕硜鈥�
+pdfjs-find-previous-button =
+    .title = 嗖掂簿嗖曕硩嗖拨 嗖灌部嗖傕拨嗖苦波 嗖囙舶喑佮驳嗖苦矔喑嗋帛嗖ㄠ硩嗖ㄠ硜 嗖灌硜嗖∴硜嗖曕硜
+pdfjs-find-previous-button-label = 嗖灌部嗖傕拨嗖苦波
+pdfjs-find-next-button =
+    .title = 嗖掂簿嗖曕硩嗖拨 嗖硜嗖傕拨嗖苦波 嗖囙舶喑佮驳嗖苦矔喑嗋帛嗖ㄠ硩嗖ㄠ硜 嗖灌硜嗖∴硜嗖曕硜
+pdfjs-find-next-button-label = 嗖硜嗖傕拨嗖苦波
+pdfjs-find-highlight-checkbox = 嗖庎膊喑嵿膊嗖掂波喑嵿波喑� 嗖灌硤嗖侧硤嗖熰硩 嗖簿嗖∴硜
+pdfjs-find-match-case-checkbox-label = 嗖曕硣嗖膏波喑嵿波喑� 嗖灌硦嗖傕拨嗖苦哺喑�
+pdfjs-find-reached-top = 嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波 嗖硣嗖侧硩嗖簿嗖椸驳嗖ㄠ硩嗖ㄠ硜 嗖む膊喑佮勃嗖苦拨喑�, 嗖曕硢嗖赤矖嗖苦波嗖苦矀嗖� 嗖嗋舶嗖傕箔嗖苦哺喑�
+pdfjs-find-reached-bottom = 嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波 嗖曕硦嗖ㄠ硢嗖波喑嵿波喑� 嗖む膊喑佮勃嗖苦拨喑�, 嗖硣嗖侧部嗖ㄠ部嗖傕拨 嗖嗋舶嗖傕箔嗖苦哺喑�
+pdfjs-find-not-found = 嗖掂簿嗖曕硩嗖驳喑� 嗖曕矀嗖∴硜 嗖矀嗖︵部嗖侧硩嗖�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 嗖硜嗖熰拨 嗖呧矖嗖�
+pdfjs-page-scale-fit = 嗖硜嗖熰拨 嗖膏舶嗖苦补喑娻矀嗖︵部嗖曕硢
+pdfjs-page-scale-auto = 嗖膏硩嗖掂帛嗖傕矚嗖距膊嗖苦菠 嗖椸簿嗖む硩嗖班铂嗖︵膊嗖距驳嗖`硢
+pdfjs-page-scale-actual = 嗖ㄠ部嗖溹驳嗖距拨 嗖椸簿嗖む硩嗖�
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 嗖呧波喑嵿波喑� 嗖侧硧嗖∴硩 嗖簿嗖∴硜嗖掂簿嗖� 嗖掄矀嗖︵硜 嗖︵硧嗖� 嗖庎拨喑佮舶嗖距矖嗖苦拨喑�.
+pdfjs-invalid-file-error = 嗖呧伯嗖距波喑嵿帛嗖掂簿嗖� 嗖呧播嗖� 嗖灌簿嗖赤簿嗖� PDF 嗖曕病嗖�.
+pdfjs-missing-file-error = PDF 嗖曕病嗖� 嗖囙膊喑嵿膊.
+pdfjs-unexpected-response-error = 嗖呧波嗖苦舶喑�嗖曕硩嗖粪部嗖む驳嗖距拨 嗖硞嗖班硤嗖曕硢嗖椸玻嗖曕拨 嗖硩嗖班菠嗖苦矔喑嵿舶嗖苦帛喑�.
+pdfjs-rendering-error = 嗖硜嗖熰驳嗖ㄠ硩嗖ㄠ硜 嗖ㄠ部嗖班硞嗖部嗖膏硜嗖掂簿嗖� 嗖掄矀嗖︵硜 嗖︵硧嗖� 嗖庎拨喑佮舶嗖距矖嗖苦拨喑�.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 嗖熰部嗖硩嗖玻嗖縘
+
+## Password
+
+pdfjs-password-label = PDF 嗖呧波喑嵿波喑� 嗖む硢嗖班硢嗖膊喑� 嗖椸硜嗖硩嗖む勃嗖︵驳嗖ㄠ硩嗖ㄠ硜 嗖ㄠ伯喑傕拨嗖苦哺嗖�.
+pdfjs-password-invalid = 嗖呧伯嗖距波喑嵿帛嗖掂簿嗖� 嗖椸硜嗖硩嗖む勃嗖�, 嗖︵帛嗖掂部嗖熰硩嗖熰硜 嗖囙波喑嵿波喑娻伯喑嵿伯喑� 嗖硩嗖班帛嗖む硩嗖ㄠ部嗖膏部.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = 嗖班拨喑嵿拨喑� 嗖簿嗖∴硜
+pdfjs-web-fonts-disabled = 嗖溹簿嗖� 嗖呧矔喑嵿卜嗖班捕喑堗膊嗖苦帛嗖ㄠ硩嗖ㄠ硜 嗖ㄠ部嗖粪硩嗖曕硩嗖班部嗖矖喑娻渤嗖苦哺嗖侧簿嗖椸部嗖︵硢: 嗖呧病嗖曕矖喑娻渤嗖苦哺嗖苦拨 PDF 嗖呧矔喑嵿卜嗖班捕喑堗膊嗖苦矖嗖赤波喑嵿波喑� 嗖渤嗖膏膊喑� 嗖膏簿嗖о硩嗖驳嗖距矖嗖苦膊喑嵿膊.
diff --git a/public/pdfjs/web/locale/ko/viewer.ftl b/public/pdfjs/web/locale/ko/viewer.ftl
new file mode 100644
index 0000000..fc033eb
--- /dev/null
+++ b/public/pdfjs/web/locale/ko/viewer.ftl
@@ -0,0 +1,715 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 鞚挫爠 韼橃澊歆�
+pdfjs-previous-button-label = 鞚挫爠
+pdfjs-next-button =
+    .title = 雼れ潓 韼橃澊歆�
+pdfjs-next-button-label = 雼れ潓
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 韼橃澊歆�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = / { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 於曥唽
+pdfjs-zoom-out-button-label = 於曥唽
+pdfjs-zoom-in-button =
+    .title = 頇曤寑
+pdfjs-zoom-in-button-label = 頇曤寑
+pdfjs-zoom-select =
+    .title = 頇曤寑/於曥唽
+pdfjs-presentation-mode-button =
+    .title = 頂勲爤鞝犿厡鞚挫厴 氇摐搿� 鞝勴櫂
+pdfjs-presentation-mode-button-label = 頂勲爤鞝犿厡鞚挫厴 氇摐
+pdfjs-open-file-button =
+    .title = 韺岇澕 鞐搓赴
+pdfjs-open-file-button-label = 鞐搓赴
+pdfjs-print-button =
+    .title = 鞚胳噭
+pdfjs-print-button-label = 鞚胳噭
+pdfjs-save-button =
+    .title = 鞝�鞛�
+pdfjs-save-button-label = 鞝�鞛�
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 雼れ毚搿滊摐
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 雼れ毚搿滊摐
+pdfjs-bookmark-button =
+    .title = 順勳灛 韼橃澊歆� (URL 氤搓赴)
+pdfjs-bookmark-button-label = 順勳灛 韼橃澊歆�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 霃勱惮
+pdfjs-tools-button-label = 霃勱惮
+pdfjs-first-page-button =
+    .title = 觳� 韼橃澊歆�搿� 鞚措彊
+pdfjs-first-page-button-label = 觳� 韼橃澊歆�搿� 鞚措彊
+pdfjs-last-page-button =
+    .title = 毵堨毵� 韼橃澊歆�搿� 鞚措彊
+pdfjs-last-page-button-label = 毵堨毵� 韼橃澊歆�搿� 鞚措彊
+pdfjs-page-rotate-cw-button =
+    .title = 鞁滉硠氚╉枼鞙茧 須岇爠
+pdfjs-page-rotate-cw-button-label = 鞁滉硠氚╉枼鞙茧 須岇爠
+pdfjs-page-rotate-ccw-button =
+    .title = 鞁滉硠 氚橂寑氚╉枼鞙茧 須岇爠
+pdfjs-page-rotate-ccw-button-label = 鞁滉硠 氚橂寑氚╉枼鞙茧 須岇爠
+pdfjs-cursor-text-select-tool-button =
+    .title = 韰嶌姢韸� 靹犿儩 霃勱惮 頇滌劚頇�
+pdfjs-cursor-text-select-tool-button-label = 韰嶌姢韸� 靹犿儩 霃勱惮
+pdfjs-cursor-hand-tool-button =
+    .title = 靻� 霃勱惮 頇滌劚頇�
+pdfjs-cursor-hand-tool-button-label = 靻� 霃勱惮
+pdfjs-scroll-page-button =
+    .title = 韼橃澊歆� 鞀ろ伂搿� 靷毄
+pdfjs-scroll-page-button-label = 韼橃澊歆� 鞀ろ伂搿�
+pdfjs-scroll-vertical-button =
+    .title = 靹鸽 鞀ろ伂搿� 靷毄
+pdfjs-scroll-vertical-button-label = 靹鸽 鞀ろ伂搿�
+pdfjs-scroll-horizontal-button =
+    .title = 臧�搿� 鞀ろ伂搿� 靷毄
+pdfjs-scroll-horizontal-button-label = 臧�搿� 鞀ろ伂搿�
+pdfjs-scroll-wrapped-button =
+    .title = 鞛愲彊 欷勲皵昕� 鞀ろ伂搿� 靷毄
+pdfjs-scroll-wrapped-button-label = 鞛愲彊 欷勲皵昕� 鞀ろ伂搿�
+pdfjs-spread-none-button =
+    .title = 頃� 韼橃澊歆� 氤搓赴
+pdfjs-spread-none-button-label = 韼检龚 鞐嗢潓
+pdfjs-spread-odd-button =
+    .title = 頇�靾� 韼橃澊歆�搿� 鞁滌瀾頃橂姅 霊� 韼橃澊歆� 氤搓赴
+pdfjs-spread-odd-button-label = 頇�靾� 韼检龚
+pdfjs-spread-even-button =
+    .title = 歆濎垬 韼橃澊歆�搿� 鞁滌瀾頃橂姅 霊� 韼橃澊歆� 氤搓赴
+pdfjs-spread-even-button-label = 歆濎垬 韼检龚
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 氍胳劀 靻嶌劚鈥�
+pdfjs-document-properties-button-label = 氍胳劀 靻嶌劚鈥�
+pdfjs-document-properties-file-name = 韺岇澕 鞚措:
+pdfjs-document-properties-file-size = 韺岇澕 韥赴:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 氚旍澊韸�)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 氚旍澊韸�)
+pdfjs-document-properties-title = 鞝滊:
+pdfjs-document-properties-author = 鞛戩劚鞛�:
+pdfjs-document-properties-subject = 欤检牅:
+pdfjs-document-properties-keywords = 韨れ泴霌�:
+pdfjs-document-properties-creation-date = 鞛戩劚 雮犾:
+pdfjs-document-properties-modification-date = 靾橃爼 雮犾:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 鞛戩劚 頂勲攴鸽灗:
+pdfjs-document-properties-producer = PDF 氤�頇� 靻岉攧韸胳洦鞏�:
+pdfjs-document-properties-version = PDF 氩勳爠:
+pdfjs-document-properties-page-count = 韼橃澊歆� 靾�:
+pdfjs-document-properties-page-size = 韼橃澊歆� 韥赴:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 靹鸽 氚╉枼
+pdfjs-document-properties-page-size-orientation-landscape = 臧�搿� 氚╉枼
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 霠堩劙
+pdfjs-document-properties-page-size-name-legal = 毽备
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 牍犽ジ 鞗� 氤搓赴:
+pdfjs-document-properties-linearized-yes = 鞓�
+pdfjs-document-properties-linearized-no = 鞎勲媹鞖�
+pdfjs-document-properties-close-button = 雼赴
+
+## Print
+
+pdfjs-print-progress-message = 鞚胳噭 氍胳劀 欷�牍� 欷戔��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 旆唽
+pdfjs-printing-not-supported = 瓴疥碃: 鞚� 敫岆澕鞖办爛電� 鞚胳噭毳� 鞕勳爠頌� 歆�鞗愴晿歆� 鞎婌姷雼堧嫟.
+pdfjs-printing-not-ready = 瓴疥碃: 鞚� PDF毳� 鞚胳噭毳� 頃� 靾� 鞛堨潉 鞝曤弰搿� 鞚届柎霌れ澊歆� 氇豁枅鞀惦媹雼�.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 靷澊霌滊皵 響滌嫓/靾赴旮�
+pdfjs-toggle-sidebar-notification-button =
+    .title = 靷澊霌滊皵 響滌嫓/靾赴旮� (氍胳劀鞐� 鞎勳泝霛检澑/觳秬韺岇澕/霠堨澊鞏� 韽暔霅�)
+pdfjs-toggle-sidebar-button-label = 靷澊霌滊皵 響滌嫓/靾赴旮�
+pdfjs-document-outline-button =
+    .title = 氍胳劀 鞎勳泝霛检澑 氤搓赴 (雿旊笖 韥措Ν頃挫劀 氇摖 頃 韼检箻旮�/鞝戧赴)
+pdfjs-document-outline-button-label = 氍胳劀 鞎勳泝霛检澑
+pdfjs-attachments-button =
+    .title = 觳秬韺岇澕 氤搓赴
+pdfjs-attachments-button-label = 觳秬韺岇澕
+pdfjs-layers-button =
+    .title = 霠堨澊鞏� 氤搓赴 (雿旊笖 韥措Ν頃挫劀 氇摖 霠堨澊鞏措ゼ 旮半掣 靸來儨搿� 鞛劋鞝�)
+pdfjs-layers-button-label = 霠堨澊鞏�
+pdfjs-thumbs-button =
+    .title = 氙鸽Μ氤搓赴
+pdfjs-thumbs-button-label = 氙鸽Μ氤搓赴
+pdfjs-current-outline-item-button =
+    .title = 順勳灛 鞎勳泝霛检澑 頃 彀娟赴
+pdfjs-current-outline-item-button-label = 順勳灛 鞎勳泝霛检澑 頃
+pdfjs-findbar-button =
+    .title = 瓴�靸�
+pdfjs-findbar-button-label = 瓴�靸�
+pdfjs-additional-layers = 於旉皜 霠堨澊鞏�
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page } 韼橃澊歆�
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 韼橃澊歆� 氙鸽Μ氤搓赴
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = { $page } 韼橃澊歆� 靹犿儩
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = { $page } / { $total } 韼橃澊歆�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 彀娟赴
+    .placeholder = 氍胳劀鞐愳劀 彀娟赴鈥�
+pdfjs-find-previous-button =
+    .title = 歆�鞝� 氍胳瀽鞐挫棎 鞚检箻頃橂姅 1臧� 攵�攵勳潉 瓴�靸�
+pdfjs-find-previous-button-label = 鞚挫爠
+pdfjs-find-next-button =
+    .title = 歆�鞝� 氍胳瀽鞐挫棎 鞚检箻頃橂姅 雼れ潓 攵�攵勳潉 瓴�靸�
+pdfjs-find-next-button-label = 雼れ潓
+pdfjs-find-highlight-checkbox = 氇憪 臧曥“ 響滌嫓
+pdfjs-find-match-case-checkbox-label = 雽�/靻岆鞛� 甑秳
+pdfjs-find-match-diacritics-checkbox-label = 攵勳潓 攵�順� 鞚检箻
+pdfjs-find-entire-word-checkbox-label = 雼柎 雼渼搿�
+pdfjs-find-reached-top = 氍胳劀 觳橃潓旯岇 瓴�靸夗晿瓿� 雭濎溂搿� 霃岇晞鞕� 瓴�靸夗枅鞀惦媹雼�.
+pdfjs-find-reached-bottom = 氍胳劀 雭濌箤歆� 瓴�靸夗晿瓿� 鞎烄溂搿� 霃岇晞鞕� 瓴�靸夗枅鞀惦媹雼�.
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count = { $current } / { $total } 鞚检箻
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit = { $limit }臧� 鞚挫儊 鞚检箻
+pdfjs-find-not-found = 瓴�靸� 瓴瓣臣 鞐嗢潓
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 韼橃澊歆� 雱堧箘鞐� 毵烄稊旮�
+pdfjs-page-scale-fit = 韼橃澊歆�鞐� 毵烄稊旮�
+pdfjs-page-scale-auto = 鞛愲彊
+pdfjs-page-scale-actual = 鞁れ牅 韥赴
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = { $page } 韼橃澊歆�
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF毳� 搿滊摐頃橂姅 霃欖晥 鞓る臧� 氚滌儩頄堨姷雼堧嫟.
+pdfjs-invalid-file-error = 鞛橂霅橃棃瓯半倶 靻愳儊霅� PDF 韺岇澕.
+pdfjs-missing-file-error = PDF 韺岇澕 鞐嗢潓.
+pdfjs-unexpected-response-error = 鞓堦赴旃� 鞎婌潃 靹滊矂 鞚戨嫷鞛呺媹雼�.
+pdfjs-rendering-error = 韼橃澊歆�毳� 霠岆崝毵來晿電� 霃欖晥 鞓る臧� 氚滌儩頄堨姷雼堧嫟.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 欤检劃]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 鞚� PDF 韺岇澕鞚� 鞐� 靾� 鞛堧姅 牍勲皜氩堩樃毳� 鞛呺牓頃橃劯鞖�.
+pdfjs-password-invalid = 鞛橂霅� 牍勲皜氩堩樃鞛呺媹雼�. 雼れ嫓 鞁滊弰頃橃劯鞖�.
+pdfjs-password-ok-button = 頇曥澑
+pdfjs-password-cancel-button = 旆唽
+pdfjs-web-fonts-disabled = 鞗� 韽绊姼臧� 牍勴櫆靹表檾霅�: 雮挫灔霅� PDF 旮�昙挫潉 靷毄頃� 靾� 鞐嗢姷雼堧嫟.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 韰嶌姢韸�
+pdfjs-editor-color-picker-free-text-input =
+    .title = 韰嶌姢韸� 靸夓儊 氤�瓴�
+pdfjs-editor-free-text-button-label = 韰嶌姢韸�
+pdfjs-editor-ink-button =
+    .title = 攴鸽Μ旮�
+pdfjs-editor-color-picker-ink-input =
+    .title = 攴鸽Μ旮� 靸夓儊 氤�瓴�
+pdfjs-editor-ink-button-label = 攴鸽Μ旮�
+pdfjs-editor-stamp-button =
+    .title = 鞚措歆� 於旉皜 霕愲姅 韼胳
+pdfjs-editor-stamp-button-label = 鞚措歆� 於旉皜 霕愲姅 韼胳
+pdfjs-editor-highlight-button =
+    .title = 臧曥“ 響滌嫓
+pdfjs-editor-highlight-button-label = 臧曥“ 響滌嫓
+pdfjs-highlight-floating-button1 =
+    .title = 臧曥“ 響滌嫓
+    .aria-label = 臧曥“ 響滌嫓
+pdfjs-highlight-floating-button-label = 臧曥“ 響滌嫓
+pdfjs-comment-floating-button =
+    .title = 欤检劃
+    .aria-label = 欤检劃
+pdfjs-comment-floating-button-label = 欤检劃
+pdfjs-editor-comment-button =
+    .title = 欤检劃
+    .aria-label = 欤检劃
+pdfjs-editor-comment-button-label = 欤检劃
+pdfjs-editor-signature-button =
+    .title = 靹滊獏 於旉皜
+pdfjs-editor-signature-button-label = 靹滊獏 於旉皜
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 臧曥“ 響滌嫓 韼胳旮�
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 攴鸽Μ旮� 韼胳旮�
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 靹滊獏 韼胳旮�: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 鞚措歆� 韼胳旮�
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 攴鸽Μ旮� 鞝滉卑
+pdfjs-editor-remove-freetext-button =
+    .title = 韰嶌姢韸� 鞝滉卑
+pdfjs-editor-remove-stamp-button =
+    .title = 鞚措歆� 鞝滉卑
+pdfjs-editor-remove-highlight-button =
+    .title = 臧曥“ 響滌嫓 鞝滉卑
+pdfjs-editor-remove-signature-button =
+    .title = 靹滊獏 鞝滉卑
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 靸夓儊
+pdfjs-editor-free-text-size-input = 韥赴
+pdfjs-editor-ink-color-input = 靸夓儊
+pdfjs-editor-ink-thickness-input = 霊愱粯
+pdfjs-editor-ink-opacity-input = 攵堩埇氇呺弰
+pdfjs-editor-stamp-add-image-button =
+    .title = 鞚措歆� 於旉皜
+pdfjs-editor-stamp-add-image-button-label = 鞚措歆� 於旉皜
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 霊愱粯
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 韰嶌姢韸� 鞚挫櫢鞚� 頃鞚� 臧曥“ 響滌嫓頃� 霑� 霊愱粯 氤�瓴�
+pdfjs-editor-add-signature-container =
+    .aria-label = 靹滊獏 鞝滌柎 氚� 鞝�鞛ル悳 靹滊獏
+pdfjs-editor-signature-add-signature-button =
+    .title = 靸� 靹滊獏 於旉皜
+pdfjs-editor-signature-add-signature-button-label = 靸� 靹滊獏 於旉皜
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 鞝�鞛ル悳 靹滊獏: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 韰嶌姢韸� 韼胳旮�
+    .default-content = 鞛呺牓頃橃劯鞖斺��
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title = 欤检劃
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 靷澊霌滊皵 雼赴
+    .aria-label = 靷澊霌滊皵 雼赴
+pdfjs-editor-comments-sidebar-close-button-label = 靷澊霌滊皵 雼赴
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 雸堨棎 霛勲姅 雮挫毄鞚� 鞛堧倶鞖�? 頃措嫻 攵�攵勳潉 臧曥“ 響滌嫓頃橁碃 欤检劃鞚� 雮波欤检劯鞖�.
+pdfjs-editor-comments-sidebar-no-comments-link = 雿� 鞎岇晞氤搓赴
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 雽�觳� 韰嶌姢韸�
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 雽�觳� 韰嶌姢韸� 韼胳
+pdfjs-editor-alt-text-dialog-label = 鞓奠厴鞚� 靹犿儩頃橃劯鞖�
+pdfjs-editor-alt-text-dialog-description = 雽�觳� 韰嶌姢韸鸽姅 靷瀸霌れ澊 鞚措歆�毳� 氤� 靾� 鞐嗞卑雮� 鞚措歆�臧� 搿滊摐霅橃 鞎婌潉 霑� 霃勳泙鞚� 霅╇媹雼�.
+pdfjs-editor-alt-text-add-description-label = 靹る獏 於旉皜
+pdfjs-editor-alt-text-add-description-description = 欤检牅, 靹れ爼, 霃欖瀾鞚� 靹る獏頃橂姅 1~2臧滌潣 氍胳灔鞚� 氇╉憸搿� 頃橃劯鞖�.
+pdfjs-editor-alt-text-mark-decorative-label = 鞛レ嫕鞖╈溂搿� 響滌嫓
+pdfjs-editor-alt-text-mark-decorative-description = 韰岆憪毽倶 鞗岉劙毵堩伂鞕� 臧欖潃 鞛レ嫕鞝侅澑 鞚措歆�鞐� 靷毄霅╇媹雼�.
+pdfjs-editor-alt-text-cancel-button = 旆唽
+pdfjs-editor-alt-text-save-button = 鞝�鞛�
+pdfjs-editor-alt-text-decorative-tooltip = 鞛レ嫕鞖╈溂搿� 響滌嫓霅�
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 鞓堧ゼ 霌れ柎, 鈥滍暅 觳厔鞚� 鞁濏儊鞐� 鞎夓晞 鞁濎偓毳� 頃橁碃 鞛堨姷雼堧嫟.鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 雽�觳� 韰嶌姢韸�
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 鞕检 鞙� 鈥� 韥赴 臁办爼
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 臧�鞖措嵃 鞙� - 韥赴 臁办爼
+pdfjs-editor-resizer-top-right =
+    .aria-label = 鞓るジ飒� 鞙� 鈥� 韥赴 臁办爼
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 鞓るジ飒� 臧�鞖措嵃 鈥� 韥赴 臁办爼
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 鞓るジ飒� 鞎勲灅 - 韥赴 臁办爼
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 臧�鞖措嵃 鞎勲灅 鈥� 韥赴 臁办爼
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 鞕检 鞎勲灅 - 韥赴 臁办爼
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 鞕检 臧�鞖措嵃 鈥� 韥赴 臁办爼
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 靸夓儊
+pdfjs-editor-colorpicker-button =
+    .title = 靸夓儊 氤�瓴�
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 靸夓儊 靹犿儩
+pdfjs-editor-colorpicker-yellow =
+    .title = 雲鸽瀫靸�
+pdfjs-editor-colorpicker-green =
+    .title = 雲轨儔
+pdfjs-editor-colorpicker-blue =
+    .title = 韺岆瀫靸�
+pdfjs-editor-colorpicker-pink =
+    .title = 攵勴檷靸�
+pdfjs-editor-colorpicker-red =
+    .title = 牍皠靸�
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 氇憪 氤搓赴
+pdfjs-editor-highlight-show-all-button =
+    .title = 氇憪 氤搓赴
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 雽�觳� 韰嶌姢韸� (鞚措歆� 靹る獏) 韼胳
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 雽�觳� 韰嶌姢韸� (鞚措歆� 靹る獏) 於旉皜
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 鞐赴鞐� 靹る獏鞚� 鞛戩劚頃橃劯鞖斺��
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 鞚措歆�臧� 氤挫澊歆� 鞎婈卑雮� 鞚措歆�臧� 搿滊敥霅橃 鞎婋姅 瓴届毎毳� 鞙勴暅 臧勲嫧頃� 靹る獏鞛呺媹雼�.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 鞚� 雽�觳� 韰嶌姢韸鸽姅 鞛愲彊鞙茧 靸濎劚霅橃棃鞙茧瘈搿� 鞝曧檿頃橃 鞎婌潉 靾� 鞛堨姷雼堧嫟.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 雿� 鞎岇晞氤搓赴
+pdfjs-editor-new-alt-text-create-automatically-button-label = 鞛愲彊鞙茧 雽�觳� 韰嶌姢韸� 靸濎劚
+pdfjs-editor-new-alt-text-not-now-button = 雮橃鞐�
+pdfjs-editor-new-alt-text-error-title = 雽�觳� 韰嶌姢韸鸽ゼ 鞛愲彊鞙茧 靸濎劚頃� 靾� 鞐嗢姷雼堧嫟.
+pdfjs-editor-new-alt-text-error-description = 雽�觳� 韰嶌姢韸鸽ゼ 歆侅爲 鞛戩劚頃橁卑雮� 雮橃鞐� 雼れ嫓 鞁滊弰頃橃劯鞖�.
+pdfjs-editor-new-alt-text-error-close-button = 雼赴
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 雽�觳� 韰嶌姢韸� AI 氇嵏 雼れ毚搿滊摐 欷� ({ $downloadedSize } / { $totalSize } MB)
+    .aria-valuetext = 雽�觳� 韰嶌姢韸� AI 氇嵏 雼れ毚搿滊摐 欷� ({ $downloadedSize } / { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 雽�觳� 韰嶌姢韸� 於旉皜霅�
+pdfjs-editor-new-alt-text-added-button-label = 雽�觳� 韰嶌姢韸� 於旉皜霅�
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 雽�觳� 韰嶌姢韸� 雸勲澖
+pdfjs-editor-new-alt-text-missing-button-label = 雽�觳� 韰嶌姢韸� 雸勲澖
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 雽�觳� 韰嶌姢韸� 瓴�韱�
+pdfjs-editor-new-alt-text-to-review-button-label = 雽�觳� 韰嶌姢韸� 瓴�韱�
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 鞛愲彊鞙茧 靸濎劚霅�: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 鞚措歆� 雽�觳� 韰嶌姢韸� 靹れ爼
+pdfjs-image-alt-text-settings-button-label = 鞚措歆� 雽�觳� 韰嶌姢韸� 靹れ爼
+pdfjs-editor-alt-text-settings-dialog-label = 鞚措歆� 雽�觳� 韰嶌姢韸� 靹れ爼
+pdfjs-editor-alt-text-settings-automatic-title = 鞛愲彊 雽�觳� 韰嶌姢韸�
+pdfjs-editor-alt-text-settings-create-model-button-label = 鞛愲彊鞙茧 雽�觳� 韰嶌姢韸� 靸濎劚
+pdfjs-editor-alt-text-settings-create-model-description = 鞚措歆�臧� 氤挫澊歆� 鞎婈卑雮� 鞚措歆�臧� 搿滊敥霅橃 鞎婌潉 霑� 霃勳泙鞚� 霅橂姅 靹る獏鞚� 鞝滌晥頃╇媹雼�.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 雽�觳� 韰嶌姢韸� AI 氇嵏 ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = 靷毄鞛愳潣 鞛レ箻鞐愳劀 搿滌滑搿� 鞁ろ枆霅橂瘈搿� 雿办澊韯瓣皜 牍勱车臧滊 鞙犾霅╇媹雼�. 鞛愲彊 雽�觳� 韰嶌姢韸胳棎 頃勳殧頃╇媹雼�.
+pdfjs-editor-alt-text-settings-delete-model-button = 靷牅
+pdfjs-editor-alt-text-settings-download-model-button = 雼れ毚搿滊摐
+pdfjs-editor-alt-text-settings-downloading-model-button = 雼れ毚搿滊摐 欷戔��
+pdfjs-editor-alt-text-settings-editor-title = 雽�觳� 韰嶌姢韸� 韼胳旮�
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 鞚措歆� 於旉皜 鞁� 氚旊 雽�觳� 韰嶌姢韸� 韼胳旮� 響滌嫓
+pdfjs-editor-alt-text-settings-show-dialog-description = 氇摖 鞚措歆�鞐� 雽�觳� 韰嶌姢韸戈皜 鞛堧姅歆� 頇曥澑頃橂姅 雿� 霃勳泙鞚� 霅╇媹雼�.
+pdfjs-editor-alt-text-settings-close-button = 雼赴
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 臧曥“ 響滌嫓 於旉皜霅�
+pdfjs-editor-freetext-added-alert = 韰嶌姢韸� 於旉皜霅�
+pdfjs-editor-ink-added-alert = 攴鸽Μ旮� 於旉皜霅�
+pdfjs-editor-stamp-added-alert = 鞚措歆� 於旉皜霅�
+pdfjs-editor-signature-added-alert = 靹滊獏 於旉皜霅�
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 臧曥“ 響滌嫓 鞝滉卑霅�
+pdfjs-editor-undo-bar-message-freetext = 韰嶌姢韸� 鞝滉卑霅�
+pdfjs-editor-undo-bar-message-ink = 攴鸽Μ旮� 鞝滉卑霅�
+pdfjs-editor-undo-bar-message-stamp = 鞚措歆� 鞝滉卑霅�
+pdfjs-editor-undo-bar-message-signature = 靹滊獏 鞝滉卑霅�
+pdfjs-editor-undo-bar-message-comment = 欤检劃 鞝滉卑霅�
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple = 欤检劃 { $count }臧� 鞝滉卑霅�
+pdfjs-editor-undo-bar-undo-button =
+    .title = 鞁ろ枆 旆唽
+pdfjs-editor-undo-bar-undo-button-label = 鞁ろ枆 旆唽
+pdfjs-editor-undo-bar-close-button =
+    .title = 雼赴
+pdfjs-editor-undo-bar-close-button-label = 雼赴
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 鞚� 氇嫭搿� PDF 氍胳劀鞐� 於旉皜 頃� 靹滊獏鞚� 毵岆摛 靾� 鞛堨姷雼堧嫟. 靷毄鞛愲姅 鞚措(雽�觳� 韰嶌姢韸� 鞐暊霃� 頃�)鞚� 韼胳頃橁碃, 氚橂车頃� 靷毄頃� 靾� 鞛堧弰搿� 靹滊獏鞚� 鞝�鞛ロ暊 靾橂弰 鞛堨姷雼堧嫟.
+pdfjs-editor-add-signature-dialog-title = 靹滊獏 於旉皜
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 鞛呺牓
+    .title = 鞛呺牓
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 攴鸽Μ旮�
+    .title = 攴鸽Μ旮�
+pdfjs-editor-add-signature-image-button = 鞚措歆�
+    .title = 鞚措歆�
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 靹滊獏 鞛呺牓
+    .placeholder = 靹滊獏 鞛呺牓
+pdfjs-editor-add-signature-draw-placeholder = 靹滊獏 攴鸽Μ旮�
+pdfjs-editor-add-signature-draw-thickness-range-label = 霊愱粯
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 攴鸽Μ旮� 霊愱粯: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 鞚措歆� 韺岇澕鞚� 鞐赴鞐� 雭岇柎靹� 雴撿溂靹胳殧
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 霕愲姅 鞚措歆� 韺岇澕 彀眷晞氤搓赴
+       *[other] 霕愲姅 鞚措歆� 韺岇澕 彀眷晞氤搓赴
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 靹る獏 (雽�觳� 韰嶌姢韸�)
+pdfjs-editor-add-signature-description-input =
+    .title = 靹る獏 (雽�觳� 韰嶌姢韸�)
+pdfjs-editor-add-signature-description-default-when-drawing = 靹滊獏
+pdfjs-editor-add-signature-clear-button-label = 靹滊獏 歆�鞖瓣赴
+pdfjs-editor-add-signature-clear-button =
+    .title = 靹滊獏 歆�鞖瓣赴
+pdfjs-editor-add-signature-save-checkbox = 靹滊獏 鞝�鞛�
+pdfjs-editor-add-signature-save-warning-message = 鞝�鞛ル悳 靹滊獏鞚� 頃滉硠鞐� 霃勲嫭頄堨姷雼堧嫟. 雿� 鞝�鞛ロ晿霠る┐ 頃橂倶毳� 鞝滉卑頃橃劯鞖�.
+pdfjs-editor-add-signature-image-upload-error-title = 鞚措歆�毳� 鞐呺霌滍暊 靾� 鞐嗢潓
+pdfjs-editor-add-signature-image-upload-error-description = 雱ろ姼鞗岉伂 鞐瓣舶鞚� 頇曥澑頃橁卑雮� 雼るジ 鞚措歆�搿� 鞁滊弰頃橃劯鞖�.
+pdfjs-editor-add-signature-image-no-data-error-title = 鞚� 鞚措歆�毳� 靹滊獏鞙茧 氤�頇橅暊 靾� 鞐嗢潓
+pdfjs-editor-add-signature-image-no-data-error-description = 雼るジ 鞚措歆�毳� 鞐呺霌� 頃� 欤检劯鞖�.
+pdfjs-editor-add-signature-error-close-button = 雼赴
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 旆唽
+pdfjs-editor-add-signature-add-button = 於旉皜
+pdfjs-editor-edit-signature-update-button = 鞐呺嵃鞚错姼
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 欤检劃 韼胳
+pdfjs-editor-edit-comment-popup-button =
+    .title = 欤检劃 韼胳
+pdfjs-editor-delete-comment-popup-button-label = 欤检劃 鞝滉卑
+pdfjs-editor-delete-comment-popup-button =
+    .title = 欤检劃 鞝滉卑
+pdfjs-show-comment-button =
+    .title = 欤检劃 氤搓赴
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 欤检劃 韼胳
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 鞐呺嵃鞚错姼
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 欤检劃 於旉皜
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 於旉皜
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 鞛呺牓頃橃劯鞖斺��
+pdfjs-editor-edit-comment-dialog-cancel-button = 旆唽
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 欤检劃 於旉皜
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 靷澊霌滊皵 響滌嫓/靾赴旮� (氍胳劀鞐� 氙鸽Μ氤搓赴/鞎勳泝霛检澑/觳秬韺岇澕/霠堨澊鞏� 韽暔霅�)
+pdfjs-toggle-views-manager-button1-label = 韼橃澊歆� 甏�毽�
+pdfjs-views-manager-sidebar =
+    .aria-label = 靷澊霌滊皵
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 靷澊霌滊皵 韥赴 臁办爼
+pdfjs-views-manager-view-selector-button =
+    .title = 氤搓赴
+pdfjs-views-manager-view-selector-button-label = 氤搓赴
+pdfjs-views-manager-pages-title = 韼橃澊歆�
+pdfjs-views-manager-outlines-title1 = 氍胳劀 鞎勳泝霛检澑
+    .title = 氍胳劀 鞎勳泝霛检澑 (雿旊笖 韥措Ν頃挫劀 氇摖 頃 韼检箻旮�/鞝戧赴)
+pdfjs-views-manager-attachments-title = 觳秬韺岇澕
+pdfjs-views-manager-layers-title1 = 霠堨澊鞏�
+    .title = 霠堨澊鞏� (雿旊笖 韥措Ν頃挫劀 氇摖 霠堨澊鞏措ゼ 旮半掣 靸來儨搿� 鞛劋鞝�)
+pdfjs-views-manager-pages-option-label = 韼橃澊歆�
+pdfjs-views-manager-outlines-option-label = 氍胳劀 鞎勳泝霛检澑
+pdfjs-views-manager-attachments-option-label = 觳秬韺岇澕
+pdfjs-views-manager-layers-option-label = 霠堨澊鞏�
+pdfjs-views-manager-add-file-button =
+    .title = 韺岇澕 於旉皜
+pdfjs-views-manager-add-file-button-label = 韺岇澕 於旉皜
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label = { $count }臧� 靹犿儩霅�
+pdfjs-views-manager-pages-status-none-action-label = 韼橃澊歆� 靹犿儩
+pdfjs-views-manager-pages-status-action-button-label = 甏�毽�
+pdfjs-views-manager-pages-status-copy-button-label = 氤奠偓
+pdfjs-views-manager-pages-status-cut-button-label = 鞛橂澕雮搓赴
+pdfjs-views-manager-pages-status-delete-button-label = 靷牅
+pdfjs-views-manager-pages-status-export-selected-button-label = 靹犿儩頃� 韼橃澊歆� 雮措炒雮搓赴鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label = { $count }臧� 韼橃澊歆� 鞛橂
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label = { $count }臧� 韼橃澊歆� 氤奠偓霅�
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label = { $count }臧� 韼橃澊歆� 靷牅霅�
+pdfjs-views-manager-pages-status-waiting-ready-label = 韺岇澕 欷�牍� 欷戔��
+pdfjs-views-manager-pages-status-waiting-uploading-label = 韺岇澕 鞐呺霌� 欷戔��
+pdfjs-views-manager-status-warning-cut-label = 鞛橂澕雮� 靾� 鞐嗢姷雼堧嫟. 韼橃澊歆�毳� 靸堧 瓿犾龚頃橁碃 雼れ嫓 鞁滊弰頃橃劯鞖�.
+pdfjs-views-manager-status-warning-copy-label = 氤奠偓頃� 靾� 鞐嗢姷雼堧嫟. 韼橃澊歆�毳� 靸堧 瓿犾龚頃橁碃 雼れ嫓 鞁滊弰頃橃劯鞖�.
+pdfjs-views-manager-status-warning-delete-label = 靷牅頃� 靾� 鞐嗢姷雼堧嫟. 韼橃澊歆�毳� 靸堧 瓿犾龚頃橁碃 雼れ嫓 鞁滊弰頃橃劯鞖�.
+pdfjs-views-manager-status-warning-save-label = 鞝�鞛ロ暊 靾� 鞐嗢姷雼堧嫟. 韼橃澊歆�毳� 靸堧 瓿犾龚頃橁碃 雼れ嫓 鞁滊弰頃橃劯鞖�.
+pdfjs-views-manager-status-undo-button-label = 鞁ろ枆 旆唽
+pdfjs-views-manager-status-done-button-label = 鞕勲
+pdfjs-views-manager-status-close-button =
+    .title = 雼赴
+pdfjs-views-manager-status-close-button-label = 雼赴
+pdfjs-views-manager-paste-button-label = 攵欖棳雱j赴
+pdfjs-views-manager-paste-button-before =
+    .title = 觳� 韼橃澊歆� 鞎烄棎 攵欖棳雱j赴
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = { $page } 韼橃澊歆� 霋れ棎 攵欖棳雱j赴
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 鞁犼窚
+pdfjs-views-manager-waiting-for-file = 韺岇澕 鞐呺霌� 欷戔��
+pdfjs-toggle-views-manager-button1 =
+    .title = 韼橃澊歆� 甏�毽�
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 鞝�鞛ル悳 靹滊獏 鞝滉卑
+pdfjs-editor-delete-signature-button-label1 = 鞝�鞛ル悳 靹滊獏 鞝滉卑
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 靹る獏 韼胳
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 靹る獏 韼胳
diff --git a/public/pdfjs/web/locale/lij/viewer.ftl b/public/pdfjs/web/locale/lij/viewer.ftl
new file mode 100644
index 0000000..8847b25
--- /dev/null
+++ b/public/pdfjs/web/locale/lij/viewer.ftl
@@ -0,0 +1,222 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pagina primma
+pdfjs-previous-button-label = Precedente
+pdfjs-next-button =
+    .title = Pagina d貌ppo
+pdfjs-next-button-label = Pr貌scima
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pagina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Diminoisci zoom
+pdfjs-zoom-out-button-label = Diminoisci zoom
+pdfjs-zoom-in-button =
+    .title = Aomenta zoom
+pdfjs-zoom-in-button-label = Aomenta zoom
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Vanni into m貌ddo de prezenta莽ion
+pdfjs-presentation-mode-button-label = M貌ddo de prezenta莽ion
+pdfjs-open-file-button =
+    .title = Arvi file
+pdfjs-open-file-button-label = Arvi
+pdfjs-print-button =
+    .title = Stanpa
+pdfjs-print-button-label = Stanpa
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Atressi
+pdfjs-tools-button-label = Atressi
+pdfjs-first-page-button =
+    .title = Vanni a-a primma pagina
+pdfjs-first-page-button-label = Vanni a-a primma pagina
+pdfjs-last-page-button =
+    .title = Vanni a l'urtima pagina
+pdfjs-last-page-button-label = Vanni a l'urtima pagina
+pdfjs-page-rotate-cw-button =
+    .title = Gia into verso oraio
+pdfjs-page-rotate-cw-button-label = Gia into verso oraio
+pdfjs-page-rotate-ccw-button =
+    .title = Gia into verso antioraio
+pdfjs-page-rotate-ccw-button-label = Gia into verso antioraio
+pdfjs-cursor-text-select-tool-button =
+    .title = Abilita strumento de sele莽ion do testo
+pdfjs-cursor-text-select-tool-button-label = Strumento de sele莽ion do testo
+pdfjs-cursor-hand-tool-button =
+    .title = Abilita strumento man
+pdfjs-cursor-hand-tool-button-label = Strumento man
+pdfjs-scroll-vertical-button =
+    .title = Deuvia rebelamento verticale
+pdfjs-scroll-vertical-button-label = Rebelamento verticale
+pdfjs-scroll-horizontal-button =
+    .title = Deuvia rebelamento orizont芒
+pdfjs-scroll-horizontal-button-label = Rebelamento orizont芒
+pdfjs-scroll-wrapped-button =
+    .title = Deuvia rebelamento incapsolou
+pdfjs-scroll-wrapped-button-label = Rebelamento incapsolou
+pdfjs-spread-none-button =
+    .title = No unite a-a difuxon de pagina
+pdfjs-spread-none-button-label = No difuxon
+pdfjs-spread-odd-button =
+    .title = Uniscite a-a difuxon de pagina co-o numero d猫spa
+pdfjs-spread-odd-button-label = Difuxon d猫spa
+pdfjs-spread-even-button =
+    .title = Uniscite a-a difuxon de pagina co-o numero pari
+pdfjs-spread-even-button-label = Difuxon pari
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiet忙 do documento鈥�
+pdfjs-document-properties-button-label = Propiet忙 do documento鈥�
+pdfjs-document-properties-file-name = Nomme schedaio:
+pdfjs-document-properties-file-size = Dimenscion schedaio:
+pdfjs-document-properties-title = Titolo:
+pdfjs-document-properties-author = Aoto:
+pdfjs-document-properties-subject = Ogetto:
+pdfjs-document-properties-keywords = Par貌lle ciave:
+pdfjs-document-properties-creation-date = D忙ta crea莽ion:
+pdfjs-document-properties-modification-date = D忙ta cangiamento:
+pdfjs-document-properties-creator = Aot么 originale:
+pdfjs-document-properties-producer = Produt么 PDF:
+pdfjs-document-properties-version = Verscion PDF:
+pdfjs-document-properties-page-count = Contezzo pagine:
+pdfjs-document-properties-page-size = Dimenscion da pagina:
+pdfjs-document-properties-page-size-unit-inches = dii gr貌sci
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = drito
+pdfjs-document-properties-page-size-orientation-landscape = desteizo
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letia
+pdfjs-document-properties-page-size-name-legal = Lezze
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista veloce do Web:
+pdfjs-document-properties-linearized-yes = Sci
+pdfjs-document-properties-linearized-no = No
+pdfjs-document-properties-close-button = S忙ra
+
+## Print
+
+pdfjs-print-progress-message = Praparo o documento pe-a stanpa鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Anulla
+pdfjs-printing-not-supported = Aten莽ion: a stanpa a no l'茅 conpletamente soport芒 da sto navegat么.
+pdfjs-printing-not-ready = Aten莽ion: o PDF o no l'茅 ancon caregou conpletamente pe-a stanpa.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Ativa/dizativa bara de scianco
+pdfjs-toggle-sidebar-button-label = Ativa/dizativa bara de scianco
+pdfjs-document-outline-button =
+    .title = Fanni vedde o contorno do documento (scicca doggio pe espande/ridue tutti i elementi)
+pdfjs-document-outline-button-label = Contorno do documento
+pdfjs-attachments-button =
+    .title = Fanni vedde aleg忙
+pdfjs-attachments-button-label = Aleg忙
+pdfjs-thumbs-button =
+    .title = Mostra miniatue
+pdfjs-thumbs-button-label = Miniatue
+pdfjs-findbar-button =
+    .title = Treuva into documento
+pdfjs-findbar-button-label = Treuva
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatua da pagina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Treuva
+    .placeholder = Treuva into documento鈥�
+pdfjs-find-previous-button =
+    .title = Treuva a ripeti莽ion precedente do testo da 莽erc芒
+pdfjs-find-previous-button-label = Precedente
+pdfjs-find-next-button =
+    .title = Treuva a ripeti莽ion d貌ppo do testo da 莽erc芒
+pdfjs-find-next-button-label = Segoente
+pdfjs-find-highlight-checkbox = Eviden莽ia
+pdfjs-find-match-case-checkbox-label = Maioscole/minoscole
+pdfjs-find-entire-word-checkbox-label = Poula intrega
+pdfjs-find-reached-top = Razonto a fin da pagina, continoa da l'ini莽io
+pdfjs-find-reached-bottom = Razonto l'ini莽io da pagina, continoa da-a fin
+pdfjs-find-not-found = Testo no trovou
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Larghessa pagina
+pdfjs-page-scale-fit = Adatta a una pagina
+pdfjs-page-scale-auto = Zoom aotomatico
+pdfjs-page-scale-actual = Dimenscioin efetive
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = S'茅 verificou 'n'er么 itno caregamento do PDF.
+pdfjs-invalid-file-error = O schedaio PDF o l'茅 no valido 貌 aroinou.
+pdfjs-missing-file-error = O schedaio PDF o no gh'茅.
+pdfjs-unexpected-response-error = Risposta inprevista do-u server
+pdfjs-rendering-error = Gh'茅 st忙to 'n'er么 itno rendering da pagina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anota莽ion: { $type }]
+
+## Password
+
+pdfjs-password-label = Dimme a par貌lla segreta pe arv卯 sto schedaio PDF.
+pdfjs-password-invalid = Par貌lla segreta sbalia. Preuva torna.
+pdfjs-password-ok-button = Va ben
+pdfjs-password-cancel-button = Anulla
+pdfjs-web-fonts-disabled = I font do web en dizativ忙: inposcibile adeuvi芒 i carateri do PDF.
diff --git a/public/pdfjs/web/locale/lo/viewer.ftl b/public/pdfjs/web/locale/lo/viewer.ftl
new file mode 100644
index 0000000..492c8cf
--- /dev/null
+++ b/public/pdfjs/web/locale/lo/viewer.ftl
@@ -0,0 +1,266 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 嗪簷嗷夃翰嗪佮粓嗪簷嗪簷嗷夃翰
+pdfjs-previous-button-label = 嗪佮粓嗪簷嗪簷嗷夃翰
+pdfjs-next-button =
+    .title = 嗪簷嗷夃翰嗪栢罕嗪斷粍嗪�
+pdfjs-next-button-label = 嗪栢罕嗪斷粍嗪�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 嗪簷嗷夃翰
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 嗪堗翰嗪� { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 嗪堗翰嗪� { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 嗪傕喊嗪簫嗪侧簫嗪涵嗪�
+pdfjs-zoom-out-button-label = 嗪傕喊嗪簫嗪侧簫嗪涵嗪�
+pdfjs-zoom-in-button =
+    .title = 嗪傕喊嗪簫嗪侧簫嗷�嗪傕夯嗷夃翰
+pdfjs-zoom-in-button-label = 嗪傕喊嗪簫嗪侧簫嗷�嗪傕夯嗷夃翰
+pdfjs-zoom-select =
+    .title = 嗪傕喊嗪簫嗪侧簫
+pdfjs-presentation-mode-button =
+    .title = 嗪罕嗪氞簺嗷堗航嗪權粈嗪涏罕嗪權粋嗪骸嗪斷簛嗪侧簷嗪權撼嗪喊嗷�嗪簷嗪�
+pdfjs-presentation-mode-button-label = 嗷傕韩嗪∴簲嗪佮翰嗪權簷嗪赤邯嗪班粈嗪簷嗪�
+pdfjs-open-file-button =
+    .title = 嗷�嗪涏旱嗪斷粍嗪熰亥嗷�
+pdfjs-open-file-button-label = 嗷�嗪涏旱嗪�
+pdfjs-print-button =
+    .title = 嗪炧捍嗪�
+pdfjs-print-button-label = 嗪炧捍嗪�
+pdfjs-save-button =
+    .title = 嗪氞罕嗪權簵嗪多簛
+pdfjs-save-button-label = 嗪氞罕嗪權簵嗪多簛
+pdfjs-bookmark-button =
+    .title = 嗷溹粔嗪侧簺嗪编簲嗪堗焊嗪氞罕嗪� (嗷�嗪氞捍嗷堗簢 URL 嗪堗翰嗪佮粶嗷夃翰嗪涏罕嗪斷簣嗪膏簹嗪编簷)
+pdfjs-bookmark-button-label = 嗪簷嗷夃翰鈥嬥簺嗪编簲鈥嬥簣嗪糕�嬥簹嗪编簷
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 嗷�嗪勦悍嗷堗涵嗪囙骸嗪�
+pdfjs-tools-button-label = 嗷�嗪勦悍嗷堗涵嗪囙骸嗪�
+pdfjs-first-page-button =
+    .title = 嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧簵嗪赤涵嗪脆簲
+pdfjs-first-page-button-label = 嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧簵嗪赤涵嗪脆簲
+pdfjs-last-page-button =
+    .title = 嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧邯嗪膏簲嗪椸粔嗪侧簫
+pdfjs-last-page-button-label = 嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧邯嗪膏簲嗪椸粔嗪侧簫
+pdfjs-page-rotate-cw-button =
+    .title = 嗪骸嗪灌簷嗪曕翰嗪∴粈嗪傕罕嗪∴粋嗪∴簢
+pdfjs-page-rotate-cw-button-label = 嗪骸嗪灌簷嗪曕翰嗪∴粈嗪傕罕嗪∴粋嗪∴簢
+pdfjs-page-rotate-ccw-button =
+    .title = 嗪骸嗪灌簷嗪椸骇嗪權粈嗪傕罕嗪∴粋嗪∴簢
+pdfjs-page-rotate-ccw-button-label = 嗪骸嗪灌簷嗪椸骇嗪權粈嗪傕罕嗪∴粋嗪∴簢
+pdfjs-cursor-text-select-tool-button =
+    .title = 嗷�嗪涏旱嗪斷粌嗪娻粔嗷�嗪勦悍嗷堗涵嗪囙骸嗪粪簛嗪侧簷嗷�嗪ム悍嗪簛嗪傕粛嗷夃簞嗪о翰嗪�
+pdfjs-cursor-text-select-tool-button-label = 嗷�嗪勦悍嗷堗涵嗪囙骸嗪粪粈嗪ム悍嗪簛嗪傕粛嗷夃簞嗪о翰嗪�
+pdfjs-cursor-hand-tool-button =
+    .title = 嗷�嗪涏旱嗪斷粌嗪娻粔嗷�嗪勦悍嗷堗涵嗪囙骸嗪粪骸嗪�
+pdfjs-cursor-hand-tool-button-label = 嗷�嗪勦悍嗷堗涵嗪囙骸嗪粪骸嗪�
+pdfjs-scroll-page-button =
+    .title = 嗷冟簥嗷夃簛嗪侧簷嗷�嗪ム悍嗷堗涵嗪權粶嗷夃翰
+pdfjs-scroll-page-button-label = 嗷�嗪ム悍嗷堗涵嗪權粶嗷夃翰
+pdfjs-scroll-vertical-button =
+    .title = 嗷冟簥嗷夃簛嗪侧簷嗷�嗪ム悍嗷堗涵嗪權粊嗪權骇嗪曕罕嗷夃簢
+pdfjs-scroll-vertical-button-label = 嗷�嗪ム悍嗷堗涵嗪權粊嗪權骇嗪曕罕嗷夃簢
+pdfjs-scroll-horizontal-button =
+    .title = 嗷冟簥嗷夃簛嗪侧簷嗷�嗪ム悍嗷堗涵嗪權粊嗪權骇嗪權涵嗪�
+pdfjs-scroll-horizontal-button-label = 嗷�嗪ム悍嗷堗涵嗪權粊嗪權骇嗪權涵嗪�
+pdfjs-scroll-wrapped-button =
+    .title = 嗷冟簥嗷� Wrapped Scrolling
+pdfjs-scroll-wrapped-button-label = Wrapped Scrolling
+pdfjs-spread-none-button =
+    .title = 嗪氞粛嗷堗簳嗷夃涵嗪囙寒嗷堗骇嗪∴簛嗪侧簷嗷佮簻嗷堗簛嗪班簣嗪侧簫嗪簷嗷夃翰
+pdfjs-spread-none-button-label = 嗪氞粛嗷堗骸嗪掂簛嗪侧簷嗷佮簻嗷堗簛嗪班簣嗪侧簫
+pdfjs-spread-odd-button =
+    .title = 嗷�嗪傕夯嗷夃翰嗪粓嗪о骸嗪佮翰嗪權粊嗪溹粓嗪佮喊嗪堗翰嗪嵿韩嗪權粔嗪侧粈嗪ム旱嗷堗骸嗪曕夯嗷夃簷嗪斷粔嗪о簫嗪簷嗷夃翰嗷�嗪ム簛嗪勦旱嗪�
+pdfjs-spread-odd-button-label = 嗪佮翰嗪權粊嗪溹粓嗪佮喊嗪堗翰嗪嵿簞嗪掂簛
+pdfjs-spread-even-button =
+    .title = 嗷�嗪傕夯嗷夃翰嗪粓嗪о骸嗪佮翰嗪權粊嗪溹粓嗪佮喊嗪堗翰嗪嵿簜嗪簢嗪簷嗷夃翰嗷�嗪ム旱嗷堗骸嗪曕夯嗷夃簷嗪斷粔嗪о簫嗪簷嗷夃翰嗷�嗪ム簛嗪勦汗嗷�
+pdfjs-spread-even-button-label = 嗪佮翰嗪權粊嗪溹粓嗪佮喊嗪堗翰嗪嵿簞嗪灌粓
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 嗪勦焊嗪權邯嗪秽骸嗪氞罕嗪斷粈嗪簛嗪班邯嗪侧簷...
+pdfjs-document-properties-button-label = 嗪勦焊嗪權邯嗪秽骸嗪氞罕嗪斷粈嗪簛嗪班邯嗪侧簷...
+pdfjs-document-properties-file-name = 嗪娻悍嗷堗粍嗪熰亥嗷�:
+pdfjs-document-properties-file-size = 嗪傕喊嗪簷嗪侧簲嗷勦簾嗪ム粚:
+pdfjs-document-properties-title = 嗪夯嗪о簜嗷嵿粔:
+pdfjs-document-properties-author = 嗪溹汗嗷夃簜嗪洁簷:
+pdfjs-document-properties-subject = 嗪夯嗪о簜嗷嵿粔:
+pdfjs-document-properties-keywords = 嗪勦粛嗪侧簵嗪掂粓嗪曕粔嗪簢嗪佮翰嗪權簞嗪秽粔嗪權韩嗪�:
+pdfjs-document-properties-creation-date = 嗪о罕嗪權簵嗪掂邯嗷夃翰嗪�:
+pdfjs-document-properties-modification-date = 嗪о罕嗪權簵嗪掂粊嗪佮粔嗷勦簜:
+pdfjs-document-properties-creator = 嗪溹汗嗷夃邯嗷夃翰嗪�:
+pdfjs-document-properties-producer = 嗪溹汗嗷夃簻嗪班亥嗪脆簲 PDF:
+pdfjs-document-properties-version = 嗷�嗪о旱嗪娻罕嗷堗簷 PDF:
+pdfjs-document-properties-page-count = 嗪堗撼嗪權骇嗪權粶嗷夃翰:
+pdfjs-document-properties-page-size = 嗪傕喊嗷溹翰嗪斷粶嗷夃翰:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 嗪ム骇嗪囙簳嗪编粔嗪�
+pdfjs-document-properties-page-size-orientation-landscape = 嗪ム骇嗪囙簷嗪簷
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 嗪堗夯嗪斷粷嗪侧簫
+pdfjs-document-properties-page-size-name-legal = 嗪傕粛嗷夃簛嗪秽簲嗪骸嗪侧簫
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 嗪∴焊嗪∴骸嗪簢嗷�嗪о罕嗪氞簵嗪掂粓嗷勦骇:
+pdfjs-document-properties-linearized-yes = 嗷佮骸嗷堗簷
+pdfjs-document-properties-linearized-no = 嗪氞粛嗷�
+pdfjs-document-properties-close-button = 嗪涏捍嗪�
+
+## Print
+
+pdfjs-print-progress-message = 嗪佮撼嗪ム罕嗪囙簛嗪班簛嗪洁骸嗷�嗪簛嗪班邯嗪侧簷嗪撼嗪ム罕嗪氞簛嗪侧簷嗪炧捍嗪�...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 嗪嵿夯嗪佮粈嗪ム旱嗪�
+pdfjs-printing-not-supported = 嗪勦撼嗷�嗪曕悍嗪簷: 嗪氞杭嗪侧骇嗷�嗪娻旱嗪權旱嗷夃簹嗷嵿粓嗪涵嗪囙寒嗪编簹嗪佮翰嗪權簽嗪脆骸嗪⑧粓嗪侧簢嗷�嗪曕罕嗪∴簵嗪掂粓.
+pdfjs-printing-not-ready = 嗪勦粛嗪测�嬥粈嗪曕悍嗪簷鈥�: PDF 嗪氞粛嗷堚�嬥粍嗪斷粔鈥嬥簴嗪粪簛鈥嬥粋嗪杭嗪斺�嬥孩嗷堗翰嗪団�嬥粈嗪曕罕嗪♀�嬥簵嗪掂粓鈥嬥邯嗷嵿翰鈥嬥亥嗪编簹鈥嬥簛嗪侧簷鈥嬥簽嗪脆骸鈥�.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 嗷�嗪涏旱嗪�/嗪涏捍嗪斷粊嗪栢簹嗪傕粔嗪侧簢
+pdfjs-toggle-sidebar-notification-button =
+    .title = 嗪喊嗪杭嗪编簹嗷佮簴嗪氞簲嗷夃翰嗪權簜嗷夃翰嗪� (嗷�嗪簛嗪班邯嗪侧簷嗪涏喊嗪佮涵嗪氞骸嗪掂粋嗪勦簢嗪粓嗪侧簢/嗷勦簾嗪ム粚嗷佮簷嗪�/嗪娻罕嗷夃簷嗪傕粛嗷夃骸嗪灌簷)
+pdfjs-toggle-sidebar-button-label = 嗷�嗪涏旱嗪�/嗪涏捍嗪斷粊嗪栢簹嗪傕粔嗪侧簢
+pdfjs-document-outline-button =
+    .title = 嗪喊鈥嬥粊嗪斷簢鈥嬥粋嗪勦簢鈥嬥寒嗷堗翰嗪団�嬥粈嗪�嬥簛嗪扳�嬥邯嗪侧簷 (嗪佮夯嗪斺�嬥邯嗪簢鈥嬥簞嗪编粔嗪団�嬥粈嗪炧悍嗷堗涵鈥嬥簜嗪扳�嬥韩嗪嵿翰嗪� / 嗪簫嗷嵿粔鈥嬥亥嗪侧簫鈥嬥簛嗪侧簷鈥嬥簵嗪编簢鈥嬥韩嗪∴夯嗪斺��)
+pdfjs-document-outline-button-label = 嗷�嗪勦夯嗷夃翰嗪粓嗪侧簢嗷�嗪簛嗪班邯嗪侧簷
+pdfjs-attachments-button =
+    .title = 嗪喊嗷佮簲嗪囙粍嗪熰亥嗷屶粊嗪權簹
+pdfjs-attachments-button-label = 嗷勦簾嗪ム粚嗷佮簷嗪�
+pdfjs-layers-button =
+    .title = 嗪喊嗷佮簲嗪囙簥嗪编粔嗪權簜嗷嵿粔嗪∴汗嗪� (嗪勦亥嗪脆簛嗪涵嗪囙粈嗪椸悍嗷堗涵嗷�嗪炧悍嗷堗涵嗪`旱嗷�嗪娻罕嗪斷簥嗪编粔嗪權簜嗷嵿粔嗪∴汗嗪權簵嗪编簢嗷澿夯嗪斷粌嗪粔嗷�嗪涏罕嗪權邯嗪班簴嗪侧簷嗪班粈嗪ム旱嗷堗骸嗪曕夯嗷夃簷)
+pdfjs-layers-button-label = 嗪娻罕嗷夃簷
+pdfjs-thumbs-button =
+    .title = 嗪喊嗷佮簲嗪囙寒嗪灌簹嗪簫嗷嵿粔
+pdfjs-thumbs-button-label = 嗪汗嗪氞簳嗪秽骇嗪⑧粓嗪侧簢
+pdfjs-current-outline-item-button =
+    .title = 嗪娻涵嗪佮韩嗪侧亥嗪侧簫嗪佮翰嗪權粋嗪勦簢嗪粓嗪侧簢嗪涏喊嗪堗焊嗪氞罕嗪�
+pdfjs-current-outline-item-button-label = 嗪ム翰嗪嵿簛嗪侧簷嗷傕簞嗪囙寒嗷堗翰嗪囙簺嗪班簣嗪膏簹嗪编簷
+pdfjs-findbar-button =
+    .title = 嗪娻涵嗪佮韩嗪侧粌嗪權粈嗪簛嗪班邯嗪侧簷
+pdfjs-findbar-button-label = 嗪勦夯嗷夃簷嗪翰
+pdfjs-additional-layers = 嗪娻罕嗷夃簷嗪傕粛嗷夃骸嗪灌簷嗷�嗪炧旱嗷堗骸嗷�嗪曕旱嗪�
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 嗷溹粔嗪� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 嗪汗嗪氞簳嗪秽骇嗪⑧粓嗪侧簢嗪傕涵嗪囙粶嗷夃翰 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 嗪勦夯嗷夃簷嗪翰
+    .placeholder = 嗪娻涵嗪佮韩嗪侧粌嗪權粈嗪簛嗪班邯嗪侧簷...
+pdfjs-find-previous-button =
+    .title = 嗪娻涵嗪佮韩嗪侧簛嗪侧簷嗪涏喊嗪佮夯嗪斷簳嗪秽骇嗪椸旱嗷堗簻嗷堗翰嗪權骸嗪侧簜嗪簢嗪涏喊嗷傕韩嗪嵿簛
+pdfjs-find-previous-button-label = 嗪佮粓嗪簷嗪簷嗷夃翰嗪權旱嗷�
+pdfjs-find-next-button =
+    .title = 嗪娻涵嗪佮韩嗪侧簳嗪赤粊嗪簷嗷堗簢嗪栢罕嗪斷粍嗪涏簜嗪簢嗪о喊嗪ム旱
+pdfjs-find-next-button-label = 嗪曕粛嗷堗粍嗪�
+pdfjs-find-highlight-checkbox = 嗷勦寒嗷勦亥嗪椸粚嗪椸罕嗪囙韩嗪∴夯嗪�
+pdfjs-find-match-case-checkbox-label = 嗪佮粛嗪ム喊嗪權旱嗪椸旱嗷堗簛嗪秽簢嗪佮罕嗪�
+pdfjs-find-match-diacritics-checkbox-label = 嗷�嗪勦悍嗷堗涵嗪囙粷嗪侧簫嗪佮撼嗪佮罕嗪氞簛嗪侧簷嗪涵嗪佮邯嗪洁簢嗪佮夯嗪囙簛嗪编簷
+pdfjs-find-entire-word-checkbox-label = 嗪佮夯嗪囙簛嗪编簷嗪椸焊嗪佮簞嗪�
+pdfjs-find-reached-top = 嗪∴翰嗪涵嗪斷粈嗪椸捍嗪囙簜嗪簢嗷�嗪簛嗪班邯嗪侧簷, 嗪悍嗪氞簳嗷嵿粓嗪堗翰嗪佮亥嗪膏粓嗪�
+pdfjs-find-reached-bottom = 嗪涵嗪斷簳嗪簷嗪椸粔嗪侧簫嗪傕涵嗪囙粈嗪簛嗪班邯嗪侧簷, 嗪悍嗪氞簳嗷嵿粓嗪堗翰嗪佮粈嗪椸捍嗪�
+pdfjs-find-not-found = 嗪氞粛嗷堗簽嗪秽簹嗪о喊嗪ム旱嗪椸旱嗷堗簳嗷夃涵嗪囙簛嗪侧簷
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 嗪勦骇嗪侧骸嗪佮骇嗷夃翰嗪囙粶嗷夃翰
+pdfjs-page-scale-fit = 嗷溹粔嗪侧簽嗷嵿簲嗪�
+pdfjs-page-scale-auto = 嗪娻汗嗪∴涵嗪编簲嗪曕喊嗷傕簷嗪∴罕嗪�
+pdfjs-page-scale-actual = 嗪傕喊嗷溹翰嗪斷簳嗪秽骇嗪堗捍嗪�
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 嗷溹粔嗪� { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 嗪∴旱嗪傕粛嗷夃簻嗪脆簲嗪炧翰嗪斷粈嗪佮旱嗪斷簜嗪粪粔嗪權簜嗪班簷嗪班簵嗪掂粓嗪佮撼嗪ム罕嗪囙粋嗪亥嗪� PDF.
+pdfjs-invalid-file-error = 嗷勦簾嗪ム粚 PDF 嗪氞粛嗷堗簴嗪粪簛嗪曕粔嗪簢嗪亥嗪粪粈嗪簫嗪翰嗪�.
+pdfjs-missing-file-error = 嗪氞粛嗷堗骸嗪掂粍嗪熰亥嗷� PDF.
+pdfjs-unexpected-response-error = 嗪佮翰嗪權簳嗪簹嗪喊嗷溹涵嗪囙簜嗪簢嗷�嗪娻旱嗪氞粈嗪о旱嗪椸旱嗷堗簹嗷嵿粓嗪勦翰嗪斷簞嗪脆簲.
+pdfjs-rendering-error = 嗪∴旱嗪傕粛嗷夃簻嗪脆簲嗪炧翰嗪斷粈嗪佮旱嗪斷簜嗪粪粔嗪權簜嗪班簷嗪班簵嗪掂粓嗪佮撼嗪ム罕嗪囙粈嗪`罕嗪權粈嗪斷旱嗪簷嗷夃翰.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 嗪勦撼嗪氞罕嗪權簫嗪侧簫]
+
+## Password
+
+pdfjs-password-label = 嗷冟邯嗷堗亥嗪班韩嗪编簲嗪溹粓嗪侧簷嗷�嗪炧悍嗷堗涵嗷�嗪涏旱嗪斷粍嗪熰亥嗷� PDF 嗪權旱嗷�.
+pdfjs-password-invalid = 嗪ム喊嗪罕嗪斷簻嗷堗翰嗪權簹嗷嵿粓嗪栢悍嗪佮簳嗷夃涵嗪�. 嗪佮喊嗪ム焊嗪權翰嗪ム涵嗪囙涵嗪掂簛嗪勦罕嗷夃簢.
+pdfjs-password-ok-button = 嗪曕夯嗪佮亥嗪秽簢
+pdfjs-password-cancel-button = 嗪嵿夯嗪佮粈嗪ム旱嗪�
+pdfjs-web-fonts-disabled = 嗪熰涵嗪權粈嗪о罕嗪氞簴嗪粪簛嗪涏捍嗪斷粌嗪娻粔嗪囙翰嗪�: 嗪氞粛嗷堗邯嗪侧骸嗪侧簲嗷冟簥嗷夃簾嗪簷 PDF 嗪椸旱嗷堗簼嗪编簢嗷勦骇嗷夃粍嗪斷粔.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 嗪傕粛嗷夃簞嗪о翰嗪�
+pdfjs-editor-free-text-button-label = 嗪傕粛嗷夃簞嗪о翰嗪�
+pdfjs-editor-ink-button =
+    .title = 嗷佮簳嗷夃骸
+pdfjs-editor-ink-button-label = 嗷佮簳嗷夃骸
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 嗪旱
+pdfjs-editor-free-text-size-input = 嗪傕喊嗪簷嗪侧簲
+pdfjs-editor-ink-color-input = 嗪旱
+pdfjs-editor-ink-thickness-input = 嗪勦骇嗪侧骸嗪簷嗪�
+pdfjs-editor-ink-opacity-input = 嗪勦骇嗪侧骸嗷傕簺嗷堗簢嗷冟邯
diff --git a/public/pdfjs/web/locale/locale.json b/public/pdfjs/web/locale/locale.json
new file mode 100644
index 0000000..16ae62e
--- /dev/null
+++ b/public/pdfjs/web/locale/locale.json
@@ -0,0 +1 @@
+{"ach":"ach/viewer.ftl","af":"af/viewer.ftl","an":"an/viewer.ftl","ar":"ar/viewer.ftl","ast":"ast/viewer.ftl","az":"az/viewer.ftl","be":"be/viewer.ftl","bg":"bg/viewer.ftl","bn":"bn/viewer.ftl","bo":"bo/viewer.ftl","bqi":"bqi/viewer.ftl","br":"br/viewer.ftl","brx":"brx/viewer.ftl","bs":"bs/viewer.ftl","ca":"ca/viewer.ftl","cak":"cak/viewer.ftl","ckb":"ckb/viewer.ftl","cs":"cs/viewer.ftl","cy":"cy/viewer.ftl","da":"da/viewer.ftl","de":"de/viewer.ftl","dsb":"dsb/viewer.ftl","el":"el/viewer.ftl","en-ca":"en-CA/viewer.ftl","en-gb":"en-GB/viewer.ftl","en-us":"en-US/viewer.ftl","eo":"eo/viewer.ftl","es-ar":"es-AR/viewer.ftl","es-cl":"es-CL/viewer.ftl","es-es":"es-ES/viewer.ftl","es-mx":"es-MX/viewer.ftl","et":"et/viewer.ftl","eu":"eu/viewer.ftl","fa":"fa/viewer.ftl","ff":"ff/viewer.ftl","fi":"fi/viewer.ftl","fr":"fr/viewer.ftl","fur":"fur/viewer.ftl","fy-nl":"fy-NL/viewer.ftl","ga-ie":"ga-IE/viewer.ftl","gd":"gd/viewer.ftl","gl":"gl/viewer.ftl","gn":"gn/viewer.ftl","gu-in":"gu-IN/viewer.ftl","he":"he/viewer.ftl","hi-in":"hi-IN/viewer.ftl","hr":"hr/viewer.ftl","hsb":"hsb/viewer.ftl","hu":"hu/viewer.ftl","hy-am":"hy-AM/viewer.ftl","hye":"hye/viewer.ftl","ia":"ia/viewer.ftl","id":"id/viewer.ftl","is":"is/viewer.ftl","it":"it/viewer.ftl","ja":"ja/viewer.ftl","ka":"ka/viewer.ftl","kab":"kab/viewer.ftl","kk":"kk/viewer.ftl","km":"km/viewer.ftl","kn":"kn/viewer.ftl","ko":"ko/viewer.ftl","lij":"lij/viewer.ftl","lo":"lo/viewer.ftl","lt":"lt/viewer.ftl","ltg":"ltg/viewer.ftl","lv":"lv/viewer.ftl","meh":"meh/viewer.ftl","mk":"mk/viewer.ftl","ml":"ml/viewer.ftl","mr":"mr/viewer.ftl","ms":"ms/viewer.ftl","my":"my/viewer.ftl","nb-no":"nb-NO/viewer.ftl","ne-np":"ne-NP/viewer.ftl","nl":"nl/viewer.ftl","nn-no":"nn-NO/viewer.ftl","oc":"oc/viewer.ftl","pa-in":"pa-IN/viewer.ftl","pl":"pl/viewer.ftl","pt-br":"pt-BR/viewer.ftl","pt-pt":"pt-PT/viewer.ftl","rm":"rm/viewer.ftl","ro":"ro/viewer.ftl","ru":"ru/viewer.ftl","sat":"sat/viewer.ftl","sc":"sc/viewer.ftl","scn":"scn/viewer.ftl","sco":"sco/viewer.ftl","si":"si/viewer.ftl","sk":"sk/viewer.ftl","skr":"skr/viewer.ftl","sl":"sl/viewer.ftl","son":"son/viewer.ftl","sq":"sq/viewer.ftl","sr":"sr/viewer.ftl","sv-se":"sv-SE/viewer.ftl","szl":"szl/viewer.ftl","ta":"ta/viewer.ftl","te":"te/viewer.ftl","tg":"tg/viewer.ftl","th":"th/viewer.ftl","tl":"tl/viewer.ftl","tr":"tr/viewer.ftl","trs":"trs/viewer.ftl","uk":"uk/viewer.ftl","ur":"ur/viewer.ftl","uz":"uz/viewer.ftl","vi":"vi/viewer.ftl","wo":"wo/viewer.ftl","xh":"xh/viewer.ftl","zh-cn":"zh-CN/viewer.ftl","zh-tw":"zh-TW/viewer.ftl"}
\ No newline at end of file
diff --git a/public/pdfjs/web/locale/lt/viewer.ftl b/public/pdfjs/web/locale/lt/viewer.ftl
new file mode 100644
index 0000000..f15d1f9
--- /dev/null
+++ b/public/pdfjs/web/locale/lt/viewer.ftl
@@ -0,0 +1,242 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Ankstesnis puslapis
+pdfjs-previous-button-label = Ankstesnis
+pdfjs-next-button =
+    .title = Kitas puslapis
+pdfjs-next-button-label = Kitas
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Puslapis
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = i拧 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } i拧 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Suma啪inti
+pdfjs-zoom-out-button-label = Suma啪inti
+pdfjs-zoom-in-button =
+    .title = Padidinti
+pdfjs-zoom-in-button-label = Padidinti
+pdfjs-zoom-select =
+    .title = Mastelis
+pdfjs-presentation-mode-button =
+    .title = Pereiti 寞 pateikties veiksen膮
+pdfjs-presentation-mode-button-label = Pateikties veiksena
+pdfjs-open-file-button =
+    .title = Atverti fail膮
+pdfjs-open-file-button-label = Atverti
+pdfjs-print-button =
+    .title = Spausdinti
+pdfjs-print-button-label = Spausdinti
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Priemon臈s
+pdfjs-tools-button-label = Priemon臈s
+pdfjs-first-page-button =
+    .title = Eiti 寞 pirm膮 puslap寞
+pdfjs-first-page-button-label = Eiti 寞 pirm膮 puslap寞
+pdfjs-last-page-button =
+    .title = Eiti 寞 paskutin寞 puslap寞
+pdfjs-last-page-button-label = Eiti 寞 paskutin寞 puslap寞
+pdfjs-page-rotate-cw-button =
+    .title = Pasukti pagal laikrod啪io rodykl臋
+pdfjs-page-rotate-cw-button-label = Pasukti pagal laikrod啪io rodykl臋
+pdfjs-page-rotate-ccw-button =
+    .title = Pasukti prie拧 laikrod啪io rodykl臋
+pdfjs-page-rotate-ccw-button-label = Pasukti prie拧 laikrod啪io rodykl臋
+pdfjs-cursor-text-select-tool-button =
+    .title = 漠jungti teksto 啪ym臈jimo 寞rank寞
+pdfjs-cursor-text-select-tool-button-label = Teksto 啪ym臈jimo 寞rankis
+pdfjs-cursor-hand-tool-button =
+    .title = 漠jungti vilkimo 寞rank寞
+pdfjs-cursor-hand-tool-button-label = Vilkimo 寞rankis
+pdfjs-scroll-page-button =
+    .title = Naudoti puslapio slinkim膮
+pdfjs-scroll-page-button-label = Puslapio slinkimas
+pdfjs-scroll-vertical-button =
+    .title = Naudoti vertikal懦 slinkim膮
+pdfjs-scroll-vertical-button-label = Vertikalus slinkimas
+pdfjs-scroll-horizontal-button =
+    .title = Naudoti horizontal懦 slinkim膮
+pdfjs-scroll-horizontal-button-label = Horizontalus slinkimas
+pdfjs-scroll-wrapped-button =
+    .title = Naudoti i拧klot膮 slinkim膮
+pdfjs-scroll-wrapped-button-label = I拧klotas slinkimas
+pdfjs-spread-none-button =
+    .title = Nejungti puslapi懦 寞 dvilapius
+pdfjs-spread-none-button-label = Be dvilapi懦
+pdfjs-spread-odd-button =
+    .title = Sujungti 寞 dvilapius pradedant nelyginiais puslapiais
+pdfjs-spread-odd-button-label = Nelyginiai dvilapiai
+pdfjs-spread-even-button =
+    .title = Sujungti 寞 dvilapius pradedant lyginiais puslapiais
+pdfjs-spread-even-button-label = Lyginiai dvilapiai
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumento savyb臈s鈥�
+pdfjs-document-properties-button-label = Dokumento savyb臈s鈥�
+pdfjs-document-properties-file-name = Failo vardas:
+pdfjs-document-properties-file-size = Failo dydis:
+pdfjs-document-properties-title = Antra拧t臈:
+pdfjs-document-properties-author = Autorius:
+pdfjs-document-properties-subject = Tema:
+pdfjs-document-properties-keywords = Reik拧miniai 啪od啪iai:
+pdfjs-document-properties-creation-date = Suk奴rimo data:
+pdfjs-document-properties-modification-date = Modifikavimo data:
+pdfjs-document-properties-creator = K奴r臈jas:
+pdfjs-document-properties-producer = PDF generatorius:
+pdfjs-document-properties-version = PDF versija:
+pdfjs-document-properties-page-count = Puslapi懦 skai膷ius:
+pdfjs-document-properties-page-size = Puslapio dydis:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = sta膷ias
+pdfjs-document-properties-page-size-orientation-landscape = guls膷ias
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Lai拧kas
+pdfjs-document-properties-page-size-name-legal = Dokumentas
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Spartus 啪iniatinklio rodinys:
+pdfjs-document-properties-linearized-yes = Taip
+pdfjs-document-properties-linearized-no = Ne
+pdfjs-document-properties-close-button = U啪verti
+
+## Print
+
+pdfjs-print-progress-message = Dokumentas ruo拧iamas spausdinimui鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Atsisakyti
+pdfjs-printing-not-supported = D臈mesio! Spausdinimas 拧ioje nar拧ykl臈je n臈ra pilnai realizuotas.
+pdfjs-printing-not-ready = D臈mesio! PDF failas dar n臈ra pilnai 寞keltas spausdinimui.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Rodyti / sl臈pti 拧onin寞 polang寞
+pdfjs-toggle-sidebar-notification-button =
+    .title = Parankin臈 (dokumentas turi strukt奴r膮 / pried懦 / sluoksni懦)
+pdfjs-toggle-sidebar-button-label = 艩oninis polangis
+pdfjs-document-outline-button =
+    .title = Rodyti dokumento strukt奴r膮 (spustel臈kite dukart nor臈dami i拧pl臈sti/suskleisti visus elementus)
+pdfjs-document-outline-button-label = Dokumento strukt奴ra
+pdfjs-attachments-button =
+    .title = Rodyti priedus
+pdfjs-attachments-button-label = Priedai
+pdfjs-layers-button =
+    .title = Rodyti sluoksnius (spustel臈kite dukart, nor臈dami atstatyti visus sluoksnius 寞 numatyt膮j膮 b奴sen膮)
+pdfjs-layers-button-label = Sluoksniai
+pdfjs-thumbs-button =
+    .title = Rodyti puslapi懦 miniati奴ras
+pdfjs-thumbs-button-label = Miniati奴ros
+pdfjs-current-outline-item-button =
+    .title = Rasti dabartin寞 strukt奴ros element膮
+pdfjs-current-outline-item-button-label = Dabartinis strukt奴ros elementas
+pdfjs-findbar-button =
+    .title = Ie拧koti dokumente
+pdfjs-findbar-button-label = Rasti
+pdfjs-additional-layers = Papildomi sluoksniai
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page } puslapis
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } puslapio miniati奴ra
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Rasti
+    .placeholder = Rasti dokumente鈥�
+pdfjs-find-previous-button =
+    .title = Ie拧koti ankstesnio fraz臈s egzemplioriaus
+pdfjs-find-previous-button-label = Ankstesnis
+pdfjs-find-next-button =
+    .title = Ie拧koti tolesnio fraz臈s egzemplioriaus
+pdfjs-find-next-button-label = Tolesnis
+pdfjs-find-highlight-checkbox = Visk膮 pary拧kinti
+pdfjs-find-match-case-checkbox-label = Skirti did啪i膮sias ir ma啪膮sias raides
+pdfjs-find-match-diacritics-checkbox-label = Skirti diakritinius 啪enklus
+pdfjs-find-entire-word-checkbox-label = I拧tisi 啪od啪iai
+pdfjs-find-reached-top = Pasiekus dokumento prad啪i膮, paie拧ka prat臋sta nuo pabaigos
+pdfjs-find-reached-bottom = Pasiekus dokumento pabaig膮, paie拧ka prat臋sta nuo prad啪ios
+pdfjs-find-not-found = Ie拧koma fraz臈 nerasta
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Priderinti prie lapo plo膷io
+pdfjs-page-scale-fit = Pritaikyti prie lapo dyd啪io
+pdfjs-page-scale-auto = Automatinis mastelis
+pdfjs-page-scale-actual = Tikras dydis
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = { $page } puslapis
+
+## Loading indicator messages
+
+pdfjs-loading-error = 漠keliant PDF fail膮 寞vyko klaida.
+pdfjs-invalid-file-error = Tai n臈ra PDF failas arba jis yra sugadintas.
+pdfjs-missing-file-error = PDF failas nerastas.
+pdfjs-unexpected-response-error = Netik臈tas serverio atsakas.
+pdfjs-rendering-error = Atvaizduojant puslap寞 寞vyko klaida.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [鈥瀧 $type }鈥� tipo anotacija]
+
+## Password
+
+pdfjs-password-label = 漠veskite slapta啪od寞 拧iam PDF failui atverti.
+pdfjs-password-invalid = Slapta啪odis neteisingas. Bandykite dar kart膮.
+pdfjs-password-ok-button = Gerai
+pdfjs-password-cancel-button = Atsisakyti
+pdfjs-web-fonts-disabled = Saityno 拧riftai i拧jungti 鈥� PDF faile esan膷i懦 拧rift懦 naudoti negalima.
diff --git a/public/pdfjs/web/locale/ltg/viewer.ftl b/public/pdfjs/web/locale/ltg/viewer.ftl
new file mode 100644
index 0000000..d837f92
--- /dev/null
+++ b/public/pdfjs/web/locale/ltg/viewer.ftl
@@ -0,0 +1,221 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 莫pr墨k拧ej膩 lopa
+pdfjs-previous-button-label = 莫pr墨k拧ej膩
+pdfjs-next-button =
+    .title = Nuokomuo lopa
+pdfjs-next-button-label = Nuokomuo
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Lopa
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = nu { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } nu { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Attuolynuot
+pdfjs-zoom-out-button-label = Attuolynuot
+pdfjs-zoom-in-button =
+    .title = P墨tuvynuot
+pdfjs-zoom-in-button-label = P墨tuvynuot
+pdfjs-zoom-select =
+    .title = Palelynuojums
+pdfjs-presentation-mode-button =
+    .title = Puorsl膿gt墨s iz Prezentacejis re啪ymu
+pdfjs-presentation-mode-button-label = Prezentacejis re啪yms
+pdfjs-open-file-button =
+    .title = Attaiseit failu
+pdfjs-open-file-button-label = Attaiseit
+pdfjs-print-button =
+    .title = Drukuo拧ona
+pdfjs-print-button-label = Druk艒t
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Reiki
+pdfjs-tools-button-label = Reiki
+pdfjs-first-page-button =
+    .title = 莫t iz pyrm奴 lopu
+pdfjs-first-page-button-label = 莫t iz pyrm奴 lopu
+pdfjs-last-page-button =
+    .title = 莫t iz piedej奴 lopu
+pdfjs-last-page-button-label = 莫t iz piedej奴 lopu
+pdfjs-page-rotate-cw-button =
+    .title = Pagr墨zt pa pulksteni
+pdfjs-page-rotate-cw-button-label = Pagr墨zt pa pulksteni
+pdfjs-page-rotate-ccw-button =
+    .title = Pagr墨zt pret pulksteni
+pdfjs-page-rotate-ccw-button-label = Pagr墨zt pret pulksteni
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktiviz膿t teksta izvieles reiku
+pdfjs-cursor-text-select-tool-button-label = Teksta izvieles reiks
+pdfjs-cursor-hand-tool-button =
+    .title = Aktiv膿t r奴kys reiku
+pdfjs-cursor-hand-tool-button-label = R奴kys reiks
+pdfjs-scroll-vertical-button =
+    .title = Izmont艒t vertikal奴 ritin艒拧onu
+pdfjs-scroll-vertical-button-label = Vertikal艒 ritin艒拧ona
+pdfjs-scroll-horizontal-button =
+    .title = Izmont艒t horizontal奴 ritin艒拧onu
+pdfjs-scroll-horizontal-button-label = Horizontal艒 ritin艒拧ona
+pdfjs-scroll-wrapped-button =
+    .title = Izmont艒t m膩r奴gojam奴 ritin艒拧onu
+pdfjs-scroll-wrapped-button-label = M膩r奴gojam艒 ritin艒拧ona
+pdfjs-spread-none-button =
+    .title = Naizmont艒t lopu atv膩ruma re啪imu
+pdfjs-spread-none-button-label = Bez atv膩rumim
+pdfjs-spread-odd-button =
+    .title = Izmont艒t lopu atv膩rumus s艒kut nu nap艒ra numeru lopom
+pdfjs-spread-odd-button-label = Nap艒ra lopys pa kreisi
+pdfjs-spread-even-button =
+    .title = Izmont艒t lopu atv膩rumus s艒kut nu p艒ra numeru lopom
+pdfjs-spread-even-button-label = P艒ra lopys pa kreisi
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumenta 墨statiejumi鈥�
+pdfjs-document-properties-button-label = Dokumenta 墨statiejumi鈥�
+pdfjs-document-properties-file-name = Faila n奴saukums:
+pdfjs-document-properties-file-size = Faila izm膩rs:
+pdfjs-document-properties-title = N奴saukums:
+pdfjs-document-properties-author = Autors:
+pdfjs-document-properties-subject = Tema:
+pdfjs-document-properties-keywords = Atsl膩gi vuordi:
+pdfjs-document-properties-creation-date = Izveides datums:
+pdfjs-document-properties-modification-date = lobuo拧onys datums:
+pdfjs-document-properties-creator = Radeituojs:
+pdfjs-document-properties-producer = PDF producents:
+pdfjs-document-properties-version = PDF verseja:
+pdfjs-document-properties-page-count = Lopu skaits:
+pdfjs-document-properties-page-size = Lopas izm膩rs:
+pdfjs-document-properties-page-size-unit-inches = collas
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portreta orientaceja
+pdfjs-document-properties-page-size-orientation-landscape = ainovys orientaceja
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = J膩
+pdfjs-document-properties-linearized-no = N膩
+pdfjs-document-properties-close-button = Aiztaiseit
+
+## Print
+
+pdfjs-print-progress-message = Preparing document for printing鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Atce募t
+pdfjs-printing-not-supported = Uzmaneibu: Drukuo拧ona nu itei puorl奴ka dorboj膩s tikai daleji.
+pdfjs-printing-not-ready = Uzmaneibu: PDF nav pilneib膩 墨luodeits drukuo拧onai.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Puorsl膿gt suonu j奴slu
+pdfjs-toggle-sidebar-button-label = Puorsl膿gt suonu j奴slu
+pdfjs-document-outline-button =
+    .title = Show Document Outline (double-click to expand/collapse all items)
+pdfjs-document-outline-button-label = Dokumenta saturs
+pdfjs-attachments-button =
+    .title = Show Attachments
+pdfjs-attachments-button-label = Attachments
+pdfjs-thumbs-button =
+    .title = Paruodeit seikt膩lus
+pdfjs-thumbs-button-label = Seikt膩li
+pdfjs-findbar-button =
+    .title = Mekleit dokument膩
+pdfjs-findbar-button-label = Mekleit
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Lopa { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Lopys { $page } seikt膩ls
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Mekleit
+    .placeholder = Mekleit dokument膩鈥�
+pdfjs-find-previous-button =
+    .title = Atrast 墨pr墨k拧ej奴
+pdfjs-find-previous-button-label = 莫pr墨k拧ej膩
+pdfjs-find-next-button =
+    .title = Atrast nuokam奴
+pdfjs-find-next-button-label = Nuokomuo
+pdfjs-find-highlight-checkbox = 莫kruosuot vysys
+pdfjs-find-match-case-checkbox-label = Lel奴, moz奴 burtu jiuteigs
+pdfjs-find-reached-top = Sasn墨gts dokumenta suokums, turpynojom nu beigom
+pdfjs-find-reached-bottom = Sasn墨gtys dokumenta beigys, turpynojom nu suokuma
+pdfjs-find-not-found = Fr膩ze nav atrosta
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Lopys plotum膩
+pdfjs-page-scale-fit = 莫tylpyn奴t lopu
+pdfjs-page-scale-auto = Automatiskais izm膩rs
+pdfjs-page-scale-actual = Pat墨sais izm膩rs
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = 莫luodej奴t PDF n奴tyka klaida.
+pdfjs-invalid-file-error = Nadereigs voi b奴juots PDF fails.
+pdfjs-missing-file-error = PDF fails nav atrosts.
+pdfjs-unexpected-response-error = Unexpected server response.
+pdfjs-rendering-error = Att膩loj奴t lopu rod膩s klaida
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = 莫vodit paroli, kab attaiseitu PDF failu.
+pdfjs-password-invalid = Napareiza parole, raugit v膿募reiz.
+pdfjs-password-ok-button = Labi
+pdfjs-password-cancel-button = Atce募t
+pdfjs-web-fonts-disabled = 艩姆膩rsteikla fonti nav aktiviz膩ti: Navar 墨gult PDF fontus.
diff --git a/public/pdfjs/web/locale/lv/viewer.ftl b/public/pdfjs/web/locale/lv/viewer.ftl
new file mode 100644
index 0000000..e82433a
--- /dev/null
+++ b/public/pdfjs/web/locale/lv/viewer.ftl
@@ -0,0 +1,222 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Iepriek拧膿j膩 lapa
+pdfjs-previous-button-label = Iepriek拧膿j膩
+pdfjs-next-button =
+    .title = N膩kam膩 lapa
+pdfjs-next-button-label = N膩kam膩
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Lapa
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = no { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } no { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Att膩lin膩t
+pdfjs-zoom-out-button-label = Att膩lin膩t
+pdfjs-zoom-in-button =
+    .title = Pietuvin膩t
+pdfjs-zoom-in-button-label = Pietuvin膩t
+pdfjs-zoom-select =
+    .title = Palielin膩jums
+pdfjs-presentation-mode-button =
+    .title = P膩rsl膿gties uz Prezent膩cijas re啪墨mu
+pdfjs-presentation-mode-button-label = Prezent膩cijas re啪墨ms
+pdfjs-open-file-button =
+    .title = Atv膿rt failu
+pdfjs-open-file-button-label = Atv膿rt
+pdfjs-print-button =
+    .title = Druk膩拧ana
+pdfjs-print-button-label = Druk膩t
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = R墨ki
+pdfjs-tools-button-label = R墨ki
+pdfjs-first-page-button =
+    .title = Iet uz pirmo lapu
+pdfjs-first-page-button-label = Iet uz pirmo lapu
+pdfjs-last-page-button =
+    .title = Iet uz p膿d膿jo lapu
+pdfjs-last-page-button-label = Iet uz p膿d膿jo lapu
+pdfjs-page-rotate-cw-button =
+    .title = Pagriezt pa pulksteni
+pdfjs-page-rotate-cw-button-label = Pagriezt pa pulksteni
+pdfjs-page-rotate-ccw-button =
+    .title = Pagriezt pret pulksteni
+pdfjs-page-rotate-ccw-button-label = Pagriezt pret pulksteni
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktiviz膿t teksta izv膿les r墨ku
+pdfjs-cursor-text-select-tool-button-label = Teksta izv膿les r墨ks
+pdfjs-cursor-hand-tool-button =
+    .title = Aktiv膿t rokas r墨ku
+pdfjs-cursor-hand-tool-button-label = Rokas r墨ks
+pdfjs-scroll-vertical-button =
+    .title = Izmantot vertik膩lo ritin膩拧anu
+pdfjs-scroll-vertical-button-label = Vertik膩l膩 ritin膩拧ana
+pdfjs-scroll-horizontal-button =
+    .title = Izmantot horizont膩lo ritin膩拧anu
+pdfjs-scroll-horizontal-button-label = Horizont膩l膩 ritin膩拧ana
+pdfjs-scroll-wrapped-button =
+    .title = Izmantot apk募auto ritin膩拧anu
+pdfjs-scroll-wrapped-button-label = Apk募aut膩 ritin膩拧ana
+pdfjs-spread-none-button =
+    .title = Nepievienoties lapu izpletumiem
+pdfjs-spread-none-button-label = Neizmantot izpletumus
+pdfjs-spread-odd-button =
+    .title = Izmantot lapu izpletumus s膩kot ar nep膩ra numuru lap膩m
+pdfjs-spread-odd-button-label = Nep膩ra izpletumi
+pdfjs-spread-even-button =
+    .title = Izmantot lapu izpletumus s膩kot ar p膩ra numuru lap膩m
+pdfjs-spread-even-button-label = P膩ra izpletumi
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumenta iestat墨jumi鈥�
+pdfjs-document-properties-button-label = Dokumenta iestat墨jumi鈥�
+pdfjs-document-properties-file-name = Faila nosaukums:
+pdfjs-document-properties-file-size = Faila izm膿rs:
+pdfjs-document-properties-title = Nosaukums:
+pdfjs-document-properties-author = Autors:
+pdfjs-document-properties-subject = T膿ma:
+pdfjs-document-properties-keywords = Atsl膿gas v膩rdi:
+pdfjs-document-properties-creation-date = Izveides datums:
+pdfjs-document-properties-modification-date = LAbo拧anas datums:
+pdfjs-document-properties-creator = Rad墨t膩js:
+pdfjs-document-properties-producer = PDF producents:
+pdfjs-document-properties-version = PDF versija:
+pdfjs-document-properties-page-count = Lapu skaits:
+pdfjs-document-properties-page-size = Pap墨ra izm膿rs:
+pdfjs-document-properties-page-size-unit-inches = collas
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portretorient膩cija
+pdfjs-document-properties-page-size-orientation-landscape = ainavorient膩cija
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = V膿stule
+pdfjs-document-properties-page-size-name-legal = Juridiskie teksti
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 膧tr膩 t墨mek募a skats:
+pdfjs-document-properties-linearized-yes = J膩
+pdfjs-document-properties-linearized-no = N膿
+pdfjs-document-properties-close-button = Aizv膿rt
+
+## Print
+
+pdfjs-print-progress-message = Gatavo dokumentu druk膩拧anai...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Atcelt
+pdfjs-printing-not-supported = Uzman墨bu: Druk膩拧ana no 拧墨 p膩rl奴ka darbojas tikai da募膿ji.
+pdfjs-printing-not-ready = Uzman墨bu: PDF nav piln墨b膩 iel膩d膿ts druk膩拧anai.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = P膩rsl膿gt s膩nu joslu
+pdfjs-toggle-sidebar-button-label = P膩rsl膿gt s膩nu joslu
+pdfjs-document-outline-button =
+    .title = R膩d墨t dokumenta strukt奴ru (veiciet dubultklik拧姆i lai izv膿rstu/sak募autu visus vienumus)
+pdfjs-document-outline-button-label = Dokumenta saturs
+pdfjs-attachments-button =
+    .title = R膩d墨t pielikumus
+pdfjs-attachments-button-label = Pielikumi
+pdfjs-thumbs-button =
+    .title = Par膩d墨t s墨kt膿lus
+pdfjs-thumbs-button-label = S墨kt膿li
+pdfjs-findbar-button =
+    .title = Mekl膿t dokument膩
+pdfjs-findbar-button-label = Mekl膿t
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Lapa { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Lapas { $page } s墨kt膿ls
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Mekl膿t
+    .placeholder = Mekl膿t dokument膩鈥�
+pdfjs-find-previous-button =
+    .title = Atrast iepriek拧膿jo
+pdfjs-find-previous-button-label = Iepriek拧膿j膩
+pdfjs-find-next-button =
+    .title = Atrast n膩kamo
+pdfjs-find-next-button-label = N膩kam膩
+pdfjs-find-highlight-checkbox = Iekr膩sot visas
+pdfjs-find-match-case-checkbox-label = Lielo, mazo burtu jut墨gs
+pdfjs-find-entire-word-checkbox-label = Veselus v膩rdus
+pdfjs-find-reached-top = Sasniegts dokumenta s膩kums, turpin膩m no beig膩m
+pdfjs-find-reached-bottom = Sasniegtas dokumenta beigas, turpin膩m no s膩kuma
+pdfjs-find-not-found = Fr膩ze nav atrasta
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Lapas platum膩
+pdfjs-page-scale-fit = Ietilpinot lapu
+pdfjs-page-scale-auto = Autom膩tiskais izm膿rs
+pdfjs-page-scale-actual = Patiesais izm膿rs
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Iel膩d膿jot PDF notika k募奴da.
+pdfjs-invalid-file-error = Neder墨gs vai boj膩ts PDF fails.
+pdfjs-missing-file-error = PDF fails nav atrasts.
+pdfjs-unexpected-response-error = Negaid墨a servera atbilde.
+pdfjs-rendering-error = Att膿lojot lapu rad膩s k募奴da
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } anot膩cija]
+
+## Password
+
+pdfjs-password-label = Ievadiet paroli, lai atv膿rtu PDF failu.
+pdfjs-password-invalid = Nepareiza parole, m膿模iniet v膿lreiz.
+pdfjs-password-ok-button = Labi
+pdfjs-password-cancel-button = Atcelt
+pdfjs-web-fonts-disabled = T墨mek募a fonti nav aktiviz膿ti: Nevar iegult PDF fontus.
diff --git a/public/pdfjs/web/locale/meh/viewer.ftl b/public/pdfjs/web/locale/meh/viewer.ftl
new file mode 100644
index 0000000..43f1fef
--- /dev/null
+++ b/public/pdfjs/web/locale/meh/viewer.ftl
@@ -0,0 +1,48 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩gina yata
+pdfjs-zoom-select =
+    .title = Nasa麓a ka麓nu/Nasa麓a luli
+pdfjs-open-file-button-label = S铆ne
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+pdfjs-document-properties-linearized-yes = Kuvi
+pdfjs-document-properties-close-button = Nakas扫
+
+## Print
+
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Nkuvi-ka
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-findbar-button-label = N谩nuku
+
+## Predefined zoom values
+
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Password
+
+pdfjs-password-cancel-button = Nkuvi-ka
diff --git a/public/pdfjs/web/locale/mk/viewer.ftl b/public/pdfjs/web/locale/mk/viewer.ftl
new file mode 100644
index 0000000..ad0ba31
--- /dev/null
+++ b/public/pdfjs/web/locale/mk/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 袩褉械褌褏芯写薪邪 褋褌褉邪薪懈褑邪
+pdfjs-previous-button-label = 袩褉械褌褏芯写薪邪
+pdfjs-next-button =
+    .title = 小谢械写薪邪 褋褌褉邪薪懈褑邪
+pdfjs-next-button-label = 小谢械写薪邪
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 小褌褉邪薪懈褑邪
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 芯写 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 芯写 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 袧邪屑邪谢褍胁邪褮械
+pdfjs-zoom-out-button-label = 袧邪屑邪谢懈
+pdfjs-zoom-in-button =
+    .title = 袟谐芯谢械屑褍胁邪褮械
+pdfjs-zoom-in-button-label = 袟谐芯谢械屑懈
+pdfjs-zoom-select =
+    .title = 袩褉芯屑械薪褍胁邪褮械 薪邪 谐芯谢械屑懈薪邪
+pdfjs-presentation-mode-button =
+    .title = 袩褉械屑懈薪懈 胁芯 锌褉械蟹械薪褌邪褑懈褋泻懈 褉械卸懈屑
+pdfjs-presentation-mode-button-label = 袩褉械蟹械薪褌邪褑懈褋泻懈 褉械卸懈屑
+pdfjs-open-file-button =
+    .title = 袨褌胁芯褉邪褮械 写邪褌芯褌械泻邪
+pdfjs-open-file-button-label = 袨褌胁芯褉懈
+pdfjs-print-button =
+    .title = 袩械褔邪褌械褮械
+pdfjs-print-button-label = 袩械褔邪褌懈
+pdfjs-save-button =
+    .title = 小薪懈屑邪褮械
+pdfjs-save-button-label = 小薪懈屑懈
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 袩褉械蟹械屑邪褮械
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 袩褉械蟹械屑懈
+pdfjs-bookmark-button =
+    .title = 孝械泻芯胁薪邪 褋褌褉邪薪懈褑邪 (袩褉械谐谢械写 薪邪 URL 芯写 褌械泻芯胁薪邪 褋褌褉邪薪懈褑邪)
+pdfjs-bookmark-button-label = 孝械泻芯胁薪邪 褋褌褉邪薪懈褑邪
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 袗谢邪褌泻懈
+pdfjs-tools-button-label = 袗谢邪褌泻懈
+pdfjs-first-page-button =
+    .title = 袨写懈 写芯 锌褉胁邪褌邪 褋褌褉邪薪懈褑邪
+pdfjs-first-page-button-label = 袨写懈 写芯 锌褉胁邪褌邪 褋褌褉邪薪懈褑邪
+pdfjs-last-page-button =
+    .title = 袨写懈 写芯 锌芯褋谢械写薪邪褌邪 褋褌褉邪薪懈褑邪
+pdfjs-last-page-button-label = 袨写懈 写芯 锌芯褋谢械写薪邪褌邪 褋褌褉邪薪懈褑邪
+pdfjs-page-rotate-cw-button =
+    .title = 袪芯褌懈褉邪褬 锌芯 褋褌褉械谢泻懈褌械 薪邪 褔邪褋芯胁薪懈泻芯褌
+pdfjs-page-rotate-cw-button-label = 袪芯褌懈褉邪褬 锌芯 褋褌褉械谢泻懈褌械 薪邪 褔邪褋芯胁薪懈泻芯褌
+pdfjs-page-rotate-ccw-button =
+    .title = 袪芯褌懈褉邪褬 褋锌褉芯褌懈胁薪芯 芯写 褋褌褉械谢泻懈褌械 薪邪 褔邪褋芯胁薪懈泻芯褌
+pdfjs-page-rotate-ccw-button-label = 袪芯褌懈褉邪褬 褋锌褉芯褌懈胁薪芯 芯写 褋褌褉械谢泻懈褌械 薪邪 褔邪褋芯胁薪懈泻芯褌
+pdfjs-cursor-text-select-tool-button =
+    .title = 袨胁芯蟹屑芯卸懈 邪谢邪褌泻邪 蟹邪 懈蟹斜芯褉 薪邪 褌械泻褋褌
+pdfjs-cursor-text-select-tool-button-label = 袗谢邪褌泻邪 蟹邪 懈蟹斜芯褉 薪邪 褌械泻褋褌
+pdfjs-cursor-hand-tool-button =
+    .title = 袨胁芯蟹屑芯卸褍胁邪褮械 薪邪 褉邪褔薪邪 邪谢邪褌泻邪
+pdfjs-cursor-hand-tool-button-label = 袪邪褔薪邪 邪谢邪褌泻邪
+pdfjs-scroll-page-button =
+    .title = 校锌芯褌褉械斜邪 薪邪 锌芯屑械褋褌褍胁邪褮械 薪邪 褋褌褉邪薪懈褑邪
+pdfjs-scroll-page-button-label = 袩芯屑械褋褌褍胁邪褮械 薪邪 褋褌褉邪薪懈褑邪
+pdfjs-scroll-vertical-button =
+    .title = 校锌芯褌褉械斜邪 薪邪 胁械褉褌懈泻邪谢薪芯 锌芯屑械褋褌褍胁邪褮械
+pdfjs-scroll-vertical-button-label = 袙械褉褌懈泻邪谢薪芯 锌芯屑械褋褌褍胁邪褮械
+pdfjs-scroll-horizontal-button =
+    .title = 校锌芯褌褉械斜邪 薪邪 褏芯褉懈蟹芯薪褌邪谢薪芯 锌芯屑械褋褌褍胁邪褮械
+pdfjs-scroll-horizontal-button-label = 啸芯褉懈蟹芯薪褌邪谢薪芯 锌芯屑械褋褌褍胁邪褮械
+pdfjs-scroll-wrapped-button =
+    .title = 校锌芯褌褉械斜邪 薪邪 锌芯褋谢械写芯胁邪褌械谢薪芯 锌芯屑械褋褌褍胁邪褮械
+pdfjs-scroll-wrapped-button-label = 袩芯褋谢械写芯胁邪褌械谢薪芯 锌芯屑械褋褌褍胁邪褮械
+pdfjs-spread-none-button =
+    .title = 袧械 褋锌芯褬褍胁邪褬 褋锌褉芯褌懈胁薪懈 褋褌褉邪薪懈褑懈
+pdfjs-spread-none-button-label = 袘械蟹 褋锌芯褬褍胁邪褮械
+pdfjs-spread-odd-button =
+    .title = 小锌芯褬 褋褌褉邪薪懈褑懈 锌芯褔薪褍胁邪褬褱懈 褋芯 薪械锌邪褉械薪 斜褉芯褬
+pdfjs-spread-odd-button-label = 袧械锌邪褉薪o 褋锌芯褬褍胁邪褮械
+pdfjs-spread-even-button =
+    .title = 小锌芯褬 褋褌褉邪薪懈褑懈 锌芯褔薪褍胁邪褬褱懈 褋芯 锌邪褉械薪 斜褉芯褬
+pdfjs-spread-even-button-label = 袩邪褉薪芯 褋锌芯褬褍胁邪褮械
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 小胁芯褬褋褌胁邪 薪邪 写芯泻褍屑械薪褌芯褌鈥�
+pdfjs-document-properties-button-label = 小胁芯褬褋褌胁邪 薪邪 写芯泻褍屑械薪褌芯褌鈥�
+pdfjs-document-properties-file-name = 袠屑械 薪邪 写邪褌芯褌械泻邪:
+pdfjs-document-properties-file-size = 袚芯谢械屑懈薪邪 薪邪 写邪褌芯褌械泻邪褌邪:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 斜邪褬褌懈)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 斜邪褬褌懈)
+pdfjs-document-properties-title = 袧邪褋谢芯胁:
+pdfjs-document-properties-author = 袗胁褌芯褉:
+pdfjs-document-properties-subject = 孝械屑邪:
+pdfjs-document-properties-keywords = 袣谢褍褔薪懈 蟹斜芯褉芯胁懈:
+pdfjs-document-properties-creation-date = 袛邪褌褍屑 薪邪 褋芯蟹写邪胁邪褮械:
+pdfjs-document-properties-modification-date = 袛邪褌褍屑 薪邪 锌褉芯屑械薪邪:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 袗胁褌芯褉:
+pdfjs-document-properties-producer = 小芯褋褌邪胁褍胁邪褔 薪邪 PDF:
+pdfjs-document-properties-version = 袙械褉蟹懈褬邪 薪邪 PDF:
+pdfjs-document-properties-page-count = 袘褉芯褬 薪邪 褋褌褉邪薪懈褑懈:
+pdfjs-document-properties-page-size = 袚芯谢械屑懈薪邪 薪邪 褋褌褉邪薪懈褑邪:
+pdfjs-document-properties-page-size-unit-inches = 懈薪褔
+pdfjs-document-properties-page-size-unit-millimeters = 屑屑
+pdfjs-document-properties-page-size-orientation-portrait = 锌芯褉褌褉械褌
+pdfjs-document-properties-page-size-orientation-landscape = 锌械褬蟹邪卸
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 袩懈褋屑芯
+pdfjs-document-properties-page-size-name-legal = 袩褉邪胁薪芯
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 袘褉蟹 屑褉械卸械薪 锌褉械谐谢械写:
+pdfjs-document-properties-linearized-yes = 袛邪
+pdfjs-document-properties-linearized-no = 袧械
+pdfjs-document-properties-close-button = 袟邪褌胁芯褉懈
+
+## Print
+
+pdfjs-print-progress-message = 袛芯泻褍屑械薪褌 褋械 锌芯写谐芯褌胁褍胁邪 蟹邪 锌械褔邪褌械褮械鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 袨褌泻邪卸懈
+pdfjs-printing-not-supported = 袩褉械写褍锌褉械写褍胁邪褮械: 袩械褔邪褌械褮械褌芯 薪械 械 褑械谢芯褋薪芯 锌芯写写褉卸邪薪芯 胁芯 芯胁芯褬 锌褉械谢懈褋褌褍胁邪褔.
+pdfjs-printing-not-ready = 袩褉械写褍锌褉械写褍胁邪褮械: PDF 写芯泻褍屑械薪褌芯褌 薪械 械 褑械谢芯褋薪芯 胁褔懈褌邪薪 蟹邪 锌械褔邪褌械褮械.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 袙泻谢褍褔懈 褋褌褉邪薪懈褔薪邪 谢械薪褌邪
+pdfjs-toggle-sidebar-notification-button =
+    .title = 袙泻谢褍褔懈 褋褌褉邪薪懈褔薪邪 谢械薪褌邪 (写芯泻褍屑械薪褌芯褌 褋芯写褉卸懈 锌褉械谐谢械写, 锌褉懈谢芯蟹懈, 懈谢懈 褋谢芯械胁懈)
+pdfjs-toggle-sidebar-button-label = 袙泻谢褍褔懈 褋褌褉邪薪懈褔薪邪 谢械薪褌邪
+pdfjs-document-outline-button =
+    .title = 袩褉懈泻邪卸懈 谐芯 锌褉械谐械写芯褌 薪邪 写芯泻褍屑械薪褌芯褌 (写胁芯 泻谢懈泻 蟹邪 写邪 褋械 锌褉懈泻邪卸邪褌/褋泻褉懈褬邪褌 褋懈褌械 械谢械屑械薪褌懈)
+pdfjs-document-outline-button-label = 袩褉械谐谢械写 薪邪 写芯泻褍屑械薪褌芯褌
+pdfjs-attachments-button =
+    .title = 袩褉懈泻邪卸褍胁邪褮械 薪邪 锌褉懈谢芯蟹懈
+pdfjs-attachments-button-label = 袩褉懈谢芯蟹懈
+pdfjs-layers-button =
+    .title = 袩褉懈泻邪卸懈 褋谢芯械胁懈 (写胁芯泻谢懈泻 蟹邪 褉械褋械褌懈褉邪褮械 薪邪 褋懈褌械 褋谢芯械胁懈)
+pdfjs-layers-button-label = 小谢芯械胁懈
+pdfjs-thumbs-button =
+    .title = 袩褉懈泻邪卸褍胁邪褮械 薪邪 懈泻芯薪泻懈
+pdfjs-thumbs-button-label = 袠泻芯薪泻懈
+pdfjs-current-outline-item-button =
+    .title = 袘邪褉邪褮械 薪邪 褌械泻芯胁薪懈芯褌 械谢械屑械薪褌 芯写 锌褉械谐谢械写芯褌
+pdfjs-current-outline-item-button-label = 孝械泻芯胁械薪 械谢械屑械薪褌 芯写 锌褉械谐谢械写芯褌
+pdfjs-findbar-button =
+    .title = 袧邪褬写懈 胁芯 写芯泻褍屑械薪褌芯褌
+pdfjs-findbar-button-label = 袧邪褬写懈
+pdfjs-additional-layers = 袛芯锌芯谢薪懈褌械谢薪懈 褋谢芯械胁懈
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 小褌褉邪薪懈褑邪 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 袠泻芯薪泻邪 芯写 褋褌褉邪薪懈褑邪 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 袠蟹斜械褉械褌械 褋褌褉邪薪懈褑邪 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 小褌褉邪薪懈褑邪 { $page } 芯写 { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 袩褉械斜邪褉褍胁邪褮械
+    .placeholder = 袩褉芯薪邪褬写懈 胁芯 写芯泻褍屑械薪褌芯褌鈥�
+pdfjs-find-previous-button =
+    .title = 袧邪褬写懈 褬邪 锌褉械写褏芯写薪邪褌邪 锌芯褬邪胁邪 薪邪 褎褉邪蟹邪褌邪
+pdfjs-find-previous-button-label = 袩褉械褌褏芯写薪芯
+pdfjs-find-next-button =
+    .title = 袧邪褬写懈 褬邪 褋谢械写薪邪褌邪 锌芯褬邪胁邪 薪邪 褎褉邪蟹邪褌邪
+pdfjs-find-next-button-label = 小谢械写薪芯
+pdfjs-find-highlight-checkbox = 袨蟹薪邪褔懈 褋褠
+pdfjs-find-match-case-checkbox-label = 孝芯泻屑褍 褌邪泻邪
+pdfjs-find-match-diacritics-checkbox-label = 袙泻谢褍褔懈 写懈褬邪泻褉懈褌懈褔泻懈 蟹薪邪褑懈
+pdfjs-find-entire-word-checkbox-label = 笑械谢懈 蟹斜芯褉芯胁懈
+pdfjs-find-reached-top = 袘邪褉邪褮械褌芯 褋褌懈谐薪邪 写芯 锌芯褔械褌芯泻芯褌 薪邪 写芯泻褍屑械薪褌芯褌 懈 锌芯褔薪褍胁邪 芯写 泻褉邪褬芯褌
+pdfjs-find-reached-bottom = 袘邪褉邪褮械褌芯 褋褌懈谐薪邪 写芯 泻褉邪褬芯褌 薪邪 写芯泻褍屑械薪褌芯褌 懈 锌芯褔薪褍胁邪 芯写 锌芯褔械褌芯泻
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 芯写 { $total } 褋芯胁锌邪褤邪褮械
+       *[other] { $current } 芯写 { $total } 褋芯胁锌邪褤邪褮邪
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 袩芯胁械褱械 芯写 { $limit } 褋芯胁锌邪褤邪褮械
+       *[other] 袩芯胁械褱械 芯写 { $limit } 褋芯胁锌邪褤邪褮邪
+    }
+pdfjs-find-not-found = 肖褉邪蟹邪褌邪 薪械 械 锌褉芯薪邪褬写械薪邪
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 楔懈褉懈薪邪 薪邪 褋褌褉邪薪懈褑邪
+pdfjs-page-scale-fit = 笑械谢邪 褋褌褉邪薪懈褑邪
+pdfjs-page-scale-auto = 袗胁褌芯屑邪褌褋泻邪 谐芯谢械屑懈薪邪
+pdfjs-page-scale-actual = 袙懈褋褌懈薪褋泻邪 谐芯谢械屑懈薪邪
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 小褌褉邪薪懈褑邪 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 袧邪褋褌邪薪邪 谐褉械褕泻邪 锌褉懈 胁褔懈褌褍胁邪褮械褌芯 薪邪 PDF-芯褌.
+pdfjs-invalid-file-error = 袧械胁邪谢懈写薪邪 懈谢懈 泻芯褉褍屑锌懈褉邪薪邪 PDF 写邪褌芯褌械泻邪.
+pdfjs-missing-file-error = 袧械写芯褋褌邪褋褍胁邪 PDF 写芯泻褍屑械薪褌.
+pdfjs-unexpected-response-error = 袧械芯褔械泻褍胁邪薪 芯写谐芯胁芯褉 芯写 褋械褉胁械褉芯褌.
+pdfjs-rendering-error = 袧邪褋褌邪薪邪 谐褉械褕泻邪 锌褉懈 锌褉懈泻邪卸褍胁邪褮械褌芯 薪邪 褋褌褉邪薪懈褑邪褌邪.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 薪邪锌芯屑械薪邪]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 袙薪械褋械褌械 褬邪 谢芯蟹懈薪泻邪褌邪 蟹邪 写邪 褬邪 芯褌胁芯褉懈褌械 芯胁邪邪 PDF 写邪褌芯褌械泻邪.
+pdfjs-password-invalid = 袧械胁邪谢懈写薪邪 谢芯蟹懈薪泻邪. 袨斜懈写械褌械 褋械 锌芯胁褌芯褉薪芯.
+pdfjs-password-ok-button = 袙芯 褉械写
+pdfjs-password-cancel-button = 袨褌泻邪卸懈
+pdfjs-web-fonts-disabled = 袠薪褌械褉薪械褌 褎芯薪褌芯胁懈褌械 褋械 芯薪械胁芯蟹屑芯卸械薪懈: 薪械 屑芯卸械 写邪 褋械 泻芯褉懈褋褌邪褌 胁谐褉邪写械薪懈褌械 PDF 褎芯薪褌芯胁懈.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 孝械泻褋褌
+pdfjs-editor-color-picker-free-text-input =
+    .title = 袩褉芯屑械薪邪 薪邪 斜芯褬邪 薪邪 褌械泻褋褌
+pdfjs-editor-free-text-button-label = 孝械泻褋褌
+pdfjs-editor-ink-button =
+    .title = 笑褉褌邪褮械
+pdfjs-editor-color-picker-ink-input =
+    .title = 袩褉芯屑械薪邪 薪邪 斜芯褬邪 蟹邪 褑褉褌邪褮械
+pdfjs-editor-ink-button-label = 笑褉褌邪褬
+pdfjs-editor-stamp-button =
+    .title = 袛芯写邪胁邪褮械 懈谢懈 褍褉械写褍胁邪褮械 薪邪 褋谢懈泻懈
+pdfjs-editor-stamp-button-label = 袛芯写邪褬 懈谢懈 褍褉械写懈 褋谢懈泻懈
+pdfjs-editor-highlight-button =
+    .title = 袧邪谐谢邪褋褍胁邪褮械
+pdfjs-editor-highlight-button-label = 袧邪谐谢邪褋懈
+pdfjs-highlight-floating-button1 =
+    .title = 袧邪谐谢邪褋褍胁邪褮械
+    .aria-label = 袧邪谐谢邪褋褍胁邪褮械
+pdfjs-highlight-floating-button-label = 袧邪谐谢邪褋懈
+pdfjs-comment-floating-button =
+    .title = 袣芯屑械薪褌邪褉
+    .aria-label = 袣芯屑械薪褌邪褉
+pdfjs-comment-floating-button-label = 袣芯屑械薪褌邪褉
+pdfjs-editor-comment-button =
+    .title = 袣芯屑械薪褌邪褉
+    .aria-label = 袣芯屑械薪褌邪褉
+pdfjs-editor-comment-button-label = 袣芯屑械薪褌邪褉
+pdfjs-editor-signature-button =
+    .title = 袛芯写邪胁邪褮械 薪邪 锌芯褌锌懈褋
+pdfjs-editor-signature-button-label = 袛芯写邪褬 锌芯褌锌懈褋
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 校褉械写褍胁邪褔 薪邪 薪邪谐谢邪褋褍胁邪褮邪
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 校褉械写褍胁邪褔 蟹邪 褑褉褌邪褮械
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 校褉械写褍胁邪褔 薪邪 锌芯褌锌懈褋: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 校褉械写褍胁邪褔 薪邪 褋谢懈泻邪
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 袨褌褋褌褉邪薪褍胁邪褮械 薪邪 褑褉褌械卸
+pdfjs-editor-remove-freetext-button =
+    .title = 袨褌褋褌褉邪薪褍胁邪褮械 薪邪 褌械泻褋褌
+pdfjs-editor-remove-stamp-button =
+    .title = 袨褌褋褌褉邪薪褍胁邪褮械 薪邪 褋谢懈泻邪
+pdfjs-editor-remove-highlight-button =
+    .title = 袨褌褋褌褉邪薪褍胁邪褮械 薪邪 薪邪谐谢邪褋褍胁邪褮邪
+pdfjs-editor-remove-signature-button =
+    .title = 袨褌褋褌褉邪薪褍胁邪褮械 薪邪 锌芯褌锌懈褋
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 袘芯褬邪
+pdfjs-editor-free-text-size-input = 袚芯谢械屑懈薪邪
+pdfjs-editor-ink-color-input = 袘芯褬邪
+pdfjs-editor-ink-thickness-input = 袛械斜械谢懈薪邪
+pdfjs-editor-ink-opacity-input = 袩褉芯蟹褉邪褔薪芯褋褌
+pdfjs-editor-stamp-add-image-button =
+    .title = 袛芯写邪胁邪褮械 薪邪 褋谢懈泻邪
+pdfjs-editor-stamp-add-image-button-label = 袛芯写邪褬 褋谢懈泻邪
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 袛械斜械谢懈薪邪
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 袩褉芯屑械薪懈 褬邪 写械斜械谢懈薪邪褌邪 锌褉懈 薪邪谐谢邪褋褍胁邪褮械 薪邪 械谢械屑械薪褌懈 褕褌芯 薪械 褋械 褌械泻褋褌
+pdfjs-editor-add-signature-container =
+    .aria-label = 袣芯薪褌褉芯谢邪 薪邪 锌芯褌锌懈褋懈 懈 褋薪懈屑械薪懈 锌芯褌锌懈褋懈
+pdfjs-editor-signature-add-signature-button =
+    .title = 袛芯写邪胁邪褮械 薪邪 薪芯胁 锌芯褌锌懈褋
+pdfjs-editor-signature-add-signature-button-label = 袛芯写邪褬 薪芯胁 锌芯褌锌懈褋
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 小薪懈屑械薪 锌芯褌锌懈褋: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 校褉械写褍胁邪褔 薪邪 褌械泻褋褌
+    .default-content = 袩芯褔薪褍懈 褋芯 锌懈褕褍胁邪褮械鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 袣芯屑械薪褌邪褉
+       *[other] 袣芯屑械薪褌邪褉懈
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 袟邪褌胁芯褉懈 褬邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+    .aria-label = 袟邪褌胁芯褉懈 褬邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+pdfjs-editor-comments-sidebar-close-button-label = 袟邪褌胁芯褉懈 褬邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 袚谢械写邪褌械 薪械褕褌芯 胁褉械写薪芯 蟹邪 胁薪懈屑邪薪懈械? 袠褋褌邪泻薪械褌械 谐芯 懈 薪邪锌懈褕械褌械 泻芯屑械薪褌邪褉.
+pdfjs-editor-comments-sidebar-no-comments-link = 袛芯蟹薪邪褬褌械 锌芯胁械褱械
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 袛芯锌芯谢薪懈褌械谢械薪 褌械泻褋褌
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 校褉械写懈 谐芯 写芯锌芯谢薪懈褌械谢薪懈芯褌 褌械泻褋褌
+pdfjs-editor-alt-text-dialog-label = 袠蟹斜械褉械褌械 芯锌褑懈褬邪
+pdfjs-editor-alt-text-dialog-description = 袗谢褌械褉薪邪褌懈胁薪懈芯褌 褌械泻褋褌 锌芯屑邪谐邪 泻芯谐邪 谢褍褤械 薪械 屑芯卸邪褌 写邪 胁懈写邪褌 褋谢懈泻邪褌邪 懈谢懈 泻芯谐邪 褋谢懈泻邪褌邪 薪械 褋械 胁褔懈褌褍胁邪
+pdfjs-editor-alt-text-add-description-label = 袛芯写邪褬 芯锌懈褋
+pdfjs-editor-alt-text-add-description-description = 袛芯写邪褬褌械 1-2 褉械褔械薪懈褑懈 褕褌芯 谐芯 芯斜褬邪褋薪褍胁邪邪褌 锌褉械写屑械褌芯褌, 芯泻芯谢懈薪邪褌邪, 懈谢懈 写械褬褋褌胁邪褌邪.
+pdfjs-editor-alt-text-mark-decorative-label = 袨蟹薪邪褔懈 泻邪泻芯 写械泻芯褉邪褌懈胁薪芯
+pdfjs-editor-alt-text-mark-decorative-description = 袨胁邪 褋械 泻芯褉懈褋褌懈 蟹邪 芯褉薪邪屑械薪褌邪谢薪懈 褋谢懈泻懈, 泻邪泻芯 谐褉邪薪懈褑懈 懈谢懈 胁芯写械薪懈 卸懈谐芯胁懈.
+pdfjs-editor-alt-text-cancel-button = 袨褌泻邪卸懈
+pdfjs-editor-alt-text-save-button = 小薪懈屑懈
+pdfjs-editor-alt-text-decorative-tooltip = 袨蟹薪邪褔械薪芯 泻邪泻芯 写械泻芯褉邪褌懈胁薪芯
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 袧邪 锌褉懈屑械褉: 鈥炐溞拘佳囆� 褋械写薪褍胁邪 薪邪 屑邪褋邪 蟹邪 写邪 褬邪写械鈥�.
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 袛芯锌芯谢薪懈褌械谢械薪 褌械泻褋褌
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 袚芯褉械薪 谢械胁 褱芯褕 鈥� 锌褉芯屑械薪懈 谐芯谢械屑懈薪邪
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 袚芯褉械 薪邪 褋褉械写懈薪邪 鈥� 锌褉芯屑械薪懈 谐芯谢械屑懈薪邪
+pdfjs-editor-resizer-top-right =
+    .aria-label = 袚芯褉械薪 写械褋械薪 褱芯褕 鈥� 锌褉芯屑械薪懈 谐芯谢械屑懈薪邪
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 小褉械写懈薪邪 写械褋薪芯 鈥� 锌褉芯屑械薪懈 谐芯谢械屑懈薪邪
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 袛芯谢械薪 写械褋械薪 褱芯褕 鈥� 锌褉芯屑械薪懈 谐芯谢械屑懈薪邪
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 袛芯谢褍 薪邪 褋褉械写懈薪邪 鈥� 锌褉芯屑械薪懈 谐芯谢械屑懈薪邪
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 袛芯谢械薪 谢械胁 褱芯褕 鈥� 锌褉芯屑械薪懈 谐芯谢械屑懈薪邪
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 小褉械写懈薪邪 谢械胁芯 鈥� 锌褉芯屑械薪懈 谐芯谢械屑懈薪邪
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 袘芯褬邪 蟹邪 薪邪谐谢邪褋褍胁邪褮械
+pdfjs-editor-colorpicker-button =
+    .title = 袦械薪褍胁邪褮械 薪邪 斜芯褬邪
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 袠蟹斜芯褉 薪邪 斜芯懈
+pdfjs-editor-colorpicker-yellow =
+    .title = 袞芯谢褌邪
+pdfjs-editor-colorpicker-green =
+    .title = 袟械谢械薪邪
+pdfjs-editor-colorpicker-blue =
+    .title = 小懈薪邪
+pdfjs-editor-colorpicker-pink =
+    .title = 袪芯蟹芯胁邪
+pdfjs-editor-colorpicker-red =
+    .title = 笑褉胁械薪邪
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 袩褉懈泻邪卸懈 褋褠
+pdfjs-editor-highlight-show-all-button =
+    .title = 袩褉懈泻邪卸懈 褋褠
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 校褉械写懈 谐芯 邪谢褌械褉薪邪褌懈胁薪懈芯褌 褌械泻褋褌 (芯锌懈褋 薪邪 褋谢懈泻邪)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 袛芯写邪褬 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 (芯锌懈褋 薪邪 褋谢懈泻邪)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 袧邪锌懈褕懈 芯锌懈褋鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 袣褉邪褌芯泻 芯锌懈褋 蟹邪 谢褍褤械 泻芯懈 薪械 屑芯卸邪褌 写邪 褬邪 胁懈写邪褌 褋谢懈泻邪褌邪 懈谢懈 泻芯谐邪 褋谢懈泻邪褌邪 薪械 褋械 胁褔懈褌褍胁邪.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 袨胁芯褬 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 械 泻褉械懈褉邪薪 邪胁褌芯屑邪褌褋泻懈 懈 屑芯卸械 写邪 斜懈写械 薪械褌芯褔械薪.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 袛芯蟹薪邪褬褌械 锌芯胁械褱械
+pdfjs-editor-new-alt-text-create-automatically-button-label = 袣褉械懈褉邪褬 谐芯 邪谢褌械褉薪邪褌懈胁薪懈芯褌 褌械泻褋褌 邪胁褌芯屑邪褌褋泻懈
+pdfjs-editor-new-alt-text-not-now-button = 袧械 褋械谐邪
+pdfjs-editor-new-alt-text-error-title = 袗谢褌械褉薪邪褌懈芯胁薪懈芯褌 褌械泻褋褌 薪械 屑芯卸械 写邪 褋械 泻褉械懈褉邪 邪胁褌芯屑邪褌褋泻懈
+pdfjs-editor-new-alt-text-error-description = 袧邪锌懈褕械褌械 袙邪褕 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 懈谢懈 芯斜懈写械褌械 褋械 锌芯胁褌芯褉薪芯 锌芯写芯褑薪邪.
+pdfjs-editor-new-alt-text-error-close-button = 袟邪褌胁芯褉懈
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 袩褉械蟹械屑邪褮械 薪邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 屑芯写械谢 薪邪 袙袠 ({ $downloadedSize } 芯写 { $totalSize } MB)
+    .aria-valuetext = 袩褉械蟹械屑邪褮械 薪邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 屑芯写械谢 薪邪 袙袠 ({ $downloadedSize } 芯写 { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 袗谢褌械褉薪邪褌懈胁薪懈芯褌 褌械泻褋褌 械 写芯写邪写械薪
+pdfjs-editor-new-alt-text-added-button-label = 袗谢褌械褉薪邪褌懈胁薪懈芯褌 褌械泻褋褌 械 写芯写邪写械薪
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 袧械写芯褋褌邪褋褍胁邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌
+pdfjs-editor-new-alt-text-missing-button-label = 袧械写芯褋褌邪褋褍胁邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 袩褉械谐谢械写邪褬 谐芯 邪谢褌械褉薪邪褌懈胁薪懈芯褌 褌械泻褋褌
+pdfjs-editor-new-alt-text-to-review-button-label = 袩褉械谐谢械写邪褬 谐芯 邪谢褌械褉薪邪褌懈胁薪懈芯褌 褌械泻褋褌
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 袣褉械懈褉邪薪芯 邪胁褌芯屑邪褌褋泻懈: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 袩芯褋褌邪胁泻懈 蟹邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 薪邪 褋谢懈泻邪
+pdfjs-image-alt-text-settings-button-label = 袩芯褋褌邪胁泻懈 蟹邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 薪邪 褋谢懈泻邪
+pdfjs-editor-alt-text-settings-dialog-label = 袩芯褋褌邪胁泻懈 蟹邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 薪邪 褋谢懈泻邪
+pdfjs-editor-alt-text-settings-automatic-title = 袗胁褌芯屑邪褌褋泻懈 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌
+pdfjs-editor-alt-text-settings-create-model-button-label = 袣褉械懈褉邪褬 谐芯 邪谢褌械褉薪邪褌懈胁薪懈芯褌 褌械泻褋褌 邪胁褌芯屑邪褌褋泻懈
+pdfjs-editor-alt-text-settings-create-model-description = 袩褉械写谢邪谐邪 芯锌懈褋懈 蟹邪 写邪 懈屑 锌芯屑芯谐薪械 薪邪 谢褍褤械褌芯 泻芯懈 薪械 屑芯卸邪褌 写邪 褬邪 胁懈写邪褌 褋谢懈泻邪褌邪 懈谢懈 泻芯谐邪 褋谢懈泻邪褌邪 薪械 褋械 胁褔懈褌褍胁邪.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 袦芯写械谢 薪邪 胁械褕褌邪褔泻邪 懈薪褌械谢懈谐械薪褑懈褬邪 褋芯 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = 袪邪斜芯褌懈 谢芯泻邪谢薪芯 薪邪 胁邪褕懈芯褌 褍褉械写, 褌邪泻邪 褕褌芯 胁邪褕懈褌械 锌芯写邪褌芯褑懈 芯褋褌邪薪褍胁邪邪褌 锌褉懈胁邪褌薪懈. 袟邪写芯谢卸懈褌械谢薪芯 蟹邪 邪胁褌芯屑邪褌褋泻懈 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌.
+pdfjs-editor-alt-text-settings-delete-model-button = 袠蟹斜褉懈褕懈
+pdfjs-editor-alt-text-settings-download-model-button = 袩褉械蟹械屑懈
+pdfjs-editor-alt-text-settings-downloading-model-button = 小械 锌褉械蟹械屑邪鈥�
+pdfjs-editor-alt-text-settings-editor-title = 校褉械写褍胁邪褔 薪邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 袩褉懈泻邪卸懈 谐芯 褍褉械写褍胁邪褔芯褌 薪邪 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌 胁械写薪邪褕 锌褉懈 写芯写邪胁邪褮械 薪邪 褋谢懈泻邪
+pdfjs-editor-alt-text-settings-show-dialog-description = 袙懈 锌芯屑邪谐邪 写邪 褋械 芯褋懈谐褍褉邪褌械 写械泻邪 褋懈褌械 胁邪褕懈 褋谢懈泻懈 懈屑邪邪褌 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌.
+pdfjs-editor-alt-text-settings-close-button = 袟邪褌胁芯褉懈
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 袧邪谐谢邪褋褍胁邪褮械褌芯 械 写芯写邪写械薪芯
+pdfjs-editor-freetext-added-alert = 孝械泻褋褌芯褌 械 写芯写邪写械薪
+pdfjs-editor-ink-added-alert = 笑褉褌械卸芯褌 械 写芯写邪写械薪
+pdfjs-editor-stamp-added-alert = 小谢懈泻邪褌邪 械 写芯写邪写械薪邪
+pdfjs-editor-signature-added-alert = 袩芯褌锌懈褋芯褌 械 写芯写邪写械薪
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 袧邪谐谢邪褋褍胁邪褮械褌芯 械 芯褌褋褌褉邪薪械褌芯
+pdfjs-editor-undo-bar-message-freetext = 孝械泻褋褌芯褌 械 芯褌褋褌褉邪薪械褌
+pdfjs-editor-undo-bar-message-ink = 笑褉褌械卸芯褌 械 芯褌褋褌褉邪薪械褌
+pdfjs-editor-undo-bar-message-stamp = 小谢懈泻邪褌邪 械 芯褌褋褌褉邪薪械褌邪
+pdfjs-editor-undo-bar-message-signature = 袩芯褌锌懈褋芯褌 械 芯褌褋褌褉邪薪械褌
+pdfjs-editor-undo-bar-message-comment = 袣芯屑械薪褌邪褉芯褌 械 芯褌褋褌褉邪薪械褌
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 薪邪锌芯屑械薪邪 械 芯褌褋褌褉邪薪械褌邪
+       *[other] { $count } 薪邪锌芯屑械薪懈 械 芯褌褋褌褉邪薪械褌邪
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 袙褉邪褌懈
+pdfjs-editor-undo-bar-undo-button-label = 袙褉邪褌懈
+pdfjs-editor-undo-bar-close-button =
+    .title = 袟邪褌胁芯褉懈
+pdfjs-editor-undo-bar-close-button-label = 袟邪褌胁芯褉懈
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 袨胁芯褬 锌褉芯蟹芯褉械褑 屑褍 芯胁芯蟹屑芯卸褍胁邪 薪邪 泻芯褉懈褋薪懈泻芯褌 写邪 泻褉械懈褉邪 锌芯褌锌懈褋 蟹邪 写邪 谐芯 写芯写邪写械 胁芯 PDF 写芯泻褍屑械薪褌. 袣芯褉懈褋薪懈泻芯褌 屑芯卸械 写邪 谐芯 褍褉械写懈 懈屑械褌芯 (泻芯械 懈褋褌芯 褌邪泻邪 褋谢褍卸懈 泻邪泻芯 邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌) 懈 芯锌褑懈芯薪邪谢薪芯 写邪 谐芯 蟹邪褔褍胁邪 锌芯褌锌懈褋芯褌 蟹邪 锌芯胁褌芯褉薪邪 褍锌芯褌褉械斜邪.
+pdfjs-editor-add-signature-dialog-title = 袛芯写邪胁邪褮械 薪邪 锌芯褌锌懈褋
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 孝懈锌泻邪褬
+    .title = 孝懈锌泻邪褬
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 笑褉褌邪褬
+    .title = 笑褉褌邪褬
+pdfjs-editor-add-signature-image-button = 小谢懈泻邪
+    .title = 小谢懈泻邪
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 孝懈锌泻邪褬褌械 谐芯 袙邪褕懈芯褌 锌芯褌锌懈褋
+    .placeholder = 孝懈锌泻邪褬褌械 谐芯 袙邪褕懈芯褌 锌芯褌锌懈褋
+pdfjs-editor-add-signature-draw-placeholder = 袧邪褑褉褌邪褬褌械 谐芯 袙邪褕懈芯褌 锌芯褌锌懈褋
+pdfjs-editor-add-signature-draw-thickness-range-label = 袛械斜械谢懈薪邪
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 袛械斜械谢懈薪邪 薪邪 褑褉褌械卸芯褌: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 袩芯胁谢械褔械褌械 写邪褌芯褌械泻邪 褌褍泻邪 蟹邪 写邪 褬邪 锌褉懈泻邪褔懈褌械
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 袠谢懈 锌褉械谢懈褋褌邪褬褌械 写邪褌芯褌械泻懈 褋芯 褋谢懈泻懈
+       *[other] 袠谢懈 锌褉械谢懈褋褌邪褬褌械 写邪褌芯褌械泻懈 褋芯 褋谢懈泻懈
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 袨锌懈褋 (邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌)
+pdfjs-editor-add-signature-description-input =
+    .title = 袨锌懈褋 (邪谢褌械褉薪邪褌懈胁械薪 褌械泻褋褌)
+pdfjs-editor-add-signature-description-default-when-drawing = 袩芯褌锌懈褋
+pdfjs-editor-add-signature-clear-button-label = 袠蟹斜褉懈褕懈 谐芯 锌芯褌锌懈褋芯褌
+pdfjs-editor-add-signature-clear-button =
+    .title = 袘褉懈褕械褮械 薪邪 锌芯褌锌懈褋芯褌
+pdfjs-editor-add-signature-save-checkbox = 小薪懈屑懈 谐芯 锌芯褌锌懈褋芯褌
+pdfjs-editor-add-signature-save-warning-message = 袦芯卸械褌械 写邪 褋薪懈屑懈褌械 薪邪褬屑薪芯谐褍 5 锌芯褌锌懈褋懈. 袨褌褋褌褉邪薪械褌械 械写械薪 蟹邪 写邪 褋薪懈屑懈褌械 薪芯胁.
+pdfjs-editor-add-signature-image-upload-error-title = 小谢懈泻邪褌邪 薪械 屑芯卸械 写邪 褋械 锌褉懈泻邪褔懈
+pdfjs-editor-add-signature-image-upload-error-description = 袩褉芯胁械褉械褌械 褬邪 屑褉械卸薪邪褌邪 胁褉褋泻邪 懈谢懈 芯斜懈写械褌械 褋械 褋芯 写褉褍谐邪 褋谢懈泻邪.
+pdfjs-editor-add-signature-image-no-data-error-title = 袨胁邪邪 褋谢懈泻邪 薪械 屑芯卸械 写邪 褋械 泻芯薪胁械褉褌懈褉邪 胁芯 锌芯褌锌懈褋
+pdfjs-editor-add-signature-image-no-data-error-description = 袨斜懈写械褌械 褋械 写邪 锌褉懈泻邪褔懈褌械 写褉褍谐邪 褋谢懈泻邪.
+pdfjs-editor-add-signature-error-close-button = 袟邪褌胁芯褉懈
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 袨褌泻邪卸懈
+pdfjs-editor-add-signature-add-button = 袛芯写邪褬
+pdfjs-editor-edit-signature-update-button = 袗卸褍褉懈褉邪褬
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 校褉械写懈 泻芯屑械薪褌邪褉
+pdfjs-editor-edit-comment-popup-button =
+    .title = 校褉械写懈 泻芯屑械薪褌邪褉
+pdfjs-editor-delete-comment-popup-button-label = 袨褌褋褌褉邪薪懈 谐芯 泻芯屑械薪褌邪褉芯褌
+pdfjs-editor-delete-comment-popup-button =
+    .title = 袨褌褋褌褉邪薪懈 谐芯 泻芯屑械薪褌邪褉芯褌
+pdfjs-show-comment-button =
+    .title = 袩褉懈泻邪卸懈 谐芯 泻芯屑械薪褌邪褉芯褌
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 校褉械写懈 泻芯屑械薪褌邪褉
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 袗卸褍褉懈褉邪褬
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 袛芯写邪褬 泻芯屑械薪褌邪褉
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 袛芯写邪褬
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 袟邪锌芯褔薪械褌械 褋芯 锌懈褕褍胁邪褮械鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 袨褌泻邪卸懈
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 袛芯写邪褬 泻芯屑械薪褌邪褉
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 袙泻谢褍褔懈 褋褌褉邪薪懈褔薪邪 谢械薪褌邪 (写芯泻褍屑械薪褌芯褌 褋芯写褉卸懈 锌褉械谐谢械写, 锌褉懈谢芯蟹懈, 懈谢懈 褋谢芯械胁懈)
+pdfjs-toggle-views-manager-button1-label = 校锌褉邪胁褍胁邪褬 褋芯 褋褌褉邪薪懈褑懈褌械
+pdfjs-views-manager-sidebar =
+    .aria-label = 小褌褉邪薪懈褔薪邪 谢械薪褌邪
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 袩褉芯屑械薪褍胁邪褔 薪邪 谐芯谢械屑懈薪邪褌邪 薪邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+pdfjs-views-manager-view-selector-button =
+    .title = 袩芯谐谢械写懈
+pdfjs-views-manager-view-selector-button-label = 袩芯谐谢械写懈
+pdfjs-views-manager-pages-title = 小褌褉邪薪懈褑懈
+pdfjs-views-manager-outlines-title1 = 袩褉械谐谢械写 薪邪 写芯泻褍屑械薪褌芯褌
+    .title = 袩褉械谐谢械写 薪邪 写芯泻褍屑械薪褌芯褌 (写胁芯泻谢懈泻 蟹邪 锌褉懈泻邪卸褍胁邪褮械/泻褉懈械褮械 薪邪 褋懈褌械 褋褌邪胁泻懈)
+pdfjs-views-manager-attachments-title = 袩褉懈谢芯蟹懈
+pdfjs-views-manager-layers-title1 = 小谢芯械胁懈
+    .title = 小谢芯械胁懈 (写胁芯泻谢懈泻 蟹邪 褉械褋械褌懈褉邪褮械 薪邪 褋懈褌械 褋谢芯械胁懈)
+pdfjs-views-manager-pages-option-label = 小褌褉邪薪懈褑懈
+pdfjs-views-manager-outlines-option-label = 袩褉械谐谢械写 薪邪 写芯泻褍屑械薪褌芯褌
+pdfjs-views-manager-attachments-option-label = 袩褉懈谢芯蟹懈
+pdfjs-views-manager-layers-option-label = 小谢芯械胁懈
+pdfjs-views-manager-add-file-button =
+    .title = 袛芯写邪褬 写邪褌芯褌械泻邪
+pdfjs-views-manager-add-file-button-label = 袛芯写邪褬 写邪褌芯褌械泻邪
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } 懈蟹斜褉邪薪
+       *[other] { $count } 懈蟹斜褉邪薪懈
+    }
+pdfjs-views-manager-pages-status-none-action-label = 袠蟹斜械褉懈 褋褌褉邪薪懈褑懈
+pdfjs-views-manager-pages-status-action-button-label = 校锌褉邪胁褍胁邪褬
+pdfjs-views-manager-pages-status-copy-button-label = 袣芯锌懈褉邪褬
+pdfjs-views-manager-pages-status-cut-button-label = 袠褋械褔懈
+pdfjs-views-manager-pages-status-delete-button-label = 袠蟹斜褉懈褕懈
+pdfjs-views-manager-pages-status-export-selected-button-label = 袠蟹胁械蟹懈 谐懈 懈蟹斜褉邪薪懈褌械鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 懈褋械褔械薪邪 褋褌褉邪薪懈褑邪
+       *[other] { $count } 懈褋械褔械薪懈 褋褌褉邪薪懈褑懈
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 泻芯锌懈褉邪薪邪 褋褌褉邪薪懈褑邪
+       *[other] { $count } 泻芯锌懈褉邪薪懈 褋褌褉邪薪懈褑懈
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 懈蟹斜褉懈褕邪薪邪 褋褌褉邪薪懈褑邪
+       *[other] { $count } 懈蟹斜褉懈褕邪薪懈 褋褌褉邪薪懈褑懈
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 袙邪褕邪褌邪 写邪褌芯褌械泻邪 褋械 锌芯写谐芯褌胁褍胁邪鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 袛邪褌芯褌械泻邪褌邪 褋械 锌褉懈泻邪褔褍胁邪鈥�
+pdfjs-views-manager-status-warning-cut-label = 小械褔械褮械褌芯 薪邪 褍褋锌械邪. 袨褋胁械卸械褌械 褬邪 褋褌褉邪薪懈褑邪褌邪 懈 芯斜懈写械褌械 褋械 锌芯胁褌芯褉薪芯.
+pdfjs-views-manager-status-warning-copy-label = 袣芯锌懈褉邪褮械褌芯 薪邪 褍褋锌械邪. 袨褋胁械卸械褌械 褬邪 褋褌褉邪薪懈褑邪褌邪 懈 芯斜懈写械褌械 褋械 锌芯胁褌芯褉薪芯.
+pdfjs-views-manager-status-warning-delete-label = 袘褉懈褕械褮械褌芯 薪邪 褍褋锌械邪. 袨褋胁械卸械褌械 褬邪 褋褌褉邪薪懈褑邪褌邪 懈 芯斜懈写械褌械 褋械 锌芯胁褌芯褉薪芯.
+pdfjs-views-manager-status-warning-save-label = 小薪懈屑邪褮械褌芯 薪邪 褍褋锌械邪. 袨褋胁械卸械褌械 褬邪 褋褌褉邪薪懈褑邪褌邪 懈 芯斜懈写械褌械 褋械 锌芯胁褌芯褉薪芯.
+pdfjs-views-manager-status-undo-button-label = 袙褉邪褌懈
+pdfjs-views-manager-status-done-button-label = 袚芯褌芯胁芯
+pdfjs-views-manager-status-close-button =
+    .title = 袟邪褌胁芯褉懈
+pdfjs-views-manager-status-close-button-label = 袟邪褌胁芯褉懈
+pdfjs-views-manager-paste-button-label = 袟邪谢械锌懈
+pdfjs-views-manager-paste-button-before =
+    .title = 袟邪谢械锌懈 锌褉械写 锌褉胁邪褌邪 褋褌褉邪薪懈褑邪
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 袟邪谢械锌懈 锌芯 褋褌褉邪薪懈褑邪 { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 袧袨袙袨
+pdfjs-views-manager-waiting-for-file = 袛邪褌芯褌械泻邪褌邪 褋械 锌褉懈泻邪褔褍胁邪鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 校锌褉邪胁褍胁邪褮械 褋芯 褋褌褉邪薪懈褑懈褌械
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 袨褌褋褌褉邪薪懈 谐芯 蟹邪褔褍胁邪薪懈芯褌 锌芯褌锌懈褋
+pdfjs-editor-delete-signature-button-label1 = 袨褌褋褌褉邪薪懈 谐芯 蟹邪褔褍胁邪薪懈芯褌 锌芯褌锌懈褋
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 校褉械写懈 芯锌懈褋
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 校褉械写懈 芯锌懈褋
diff --git a/public/pdfjs/web/locale/ml/viewer.ftl b/public/pdfjs/web/locale/ml/viewer.ftl
new file mode 100644
index 0000000..6c33b8f
--- /dev/null
+++ b/public/pdfjs/web/locale/ml/viewer.ftl
@@ -0,0 +1,509 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 啻祦啻祶啻祦啻赤祶啻� 啻む淳啻赤祶鈥�
+pdfjs-previous-button-label = 啻祦啻祶啻祦嗟�
+pdfjs-next-button =
+    .title = 啻呧礋嗟佮搐嗟嵿搐 啻む淳啻赤祶鈥�
+pdfjs-next-button-label = 啻呧礋嗟佮搐嗟嵿搐啻む祦嗟�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 啻む淳啻赤祶鈥�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 啻侧祮
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pagesCount } 啻侧祮 { $pageNumber })
+pdfjs-zoom-out-button =
+    .title = 啻氞祮啻编祦啻む淳啻曕祶啻曕祦啻�
+pdfjs-zoom-out-button-label = 啻氞祮啻编祦啻む淳啻曕祶啻曕祦啻�
+pdfjs-zoom-in-button =
+    .title = 啻掂床嗟佮搐啻距磿嗟嵿磿嗟佮磿
+pdfjs-zoom-in-button-label = 啻掂床嗟佮搐啻距磿嗟嵿磿嗟佮磿
+pdfjs-zoom-select =
+    .title = 啻掂祶啻淳啻祶啻む纯 啻淳啻编祶啻编祦啻�
+pdfjs-presentation-mode-button =
+    .title = 啻祶啻班锤啻ㄠ祶啻编祰啻粪川嗟嶁�� 啻班祤啻む纯啻纯啻侧祰啻曕祶啻曕祦嗟� 啻淳啻编祶啻编祦啻�
+pdfjs-presentation-mode-button-label = 啻祶啻班锤啻ㄠ祶啻编祰啻粪川嗟嶁�� 啻班祤啻む纯
+pdfjs-open-file-button =
+    .title = 啻疮啻侧祶鈥� 啻む祦啻编磿嗟嵿磿嗟佮磿
+pdfjs-open-file-button-label = 啻む祦啻编磿嗟嵿磿嗟佮磿
+pdfjs-print-button =
+    .title = 啻呧礆嗟嵿礆啻熰纯啻曕祶啻曕祦啻�
+pdfjs-print-button-label = 啻呧礆嗟嵿礆啻熰纯啻曕祶啻曕祦啻�
+pdfjs-save-button =
+    .title = 啻曕窗嗟佮搐啻苦吹啻祶啻曕祶啻曕祦啻�
+pdfjs-save-button-label = 啻曕窗嗟佮搐啻苦吹啻祶啻曕祶啻曕祦啻�
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 啻囙幢啻曕祶啻曕纯啻掂疮嗟嵿磿嗟嵿磿嗟佮磿
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 啻囙幢啻曕祶啻曕纯啻掂疮嗟嵿磿嗟嵿磿嗟佮磿
+pdfjs-bookmark-button =
+    .title = 啻ㄠ纯啻侧吹啻苦床嗟� 啻む淳嗟� (啻ㄠ纯啻侧吹啻苦床嗟� 啻む淳啻赤纯嗟� 啻ㄠ纯啻ㄠ祶啻ㄠ祦嗟� 啻祩.啻嗋导.啻庎到 啻曕淳啻`祦啻�)
+pdfjs-bookmark-button-label = 啻ㄠ纯啻侧吹啻苦床嗟佮闯嗟嵿闯 啻む淳嗟�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 啻夃椽啻曕窗啻`礄嗟嵿礄啻赤祶鈥�
+pdfjs-tools-button-label = 啻夃椽啻曕窗啻`礄嗟嵿礄啻赤祶鈥�
+pdfjs-first-page-button =
+    .title = 啻嗋处嗟嵿疮啻む祶啻む祮 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+pdfjs-first-page-button-label = 啻嗋处嗟嵿疮啻む祶啻む祮 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+pdfjs-last-page-button =
+    .title = 啻呧吹啻膏淳啻� 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+pdfjs-last-page-button-label = 啻呧吹啻膏淳啻� 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+pdfjs-page-rotate-cw-button =
+    .title = 啻樴礋啻苦磿啻距窗啻︵纯啻多疮啻苦床嗟嶁�� 啻曕幢啻曕祶啻曕祦啻�
+pdfjs-page-rotate-cw-button-label = 啻樴礋啻苦磿啻距窗啻︵纯啻多疮啻苦床嗟嶁�� 啻曕幢啻曕祶啻曕祦啻�
+pdfjs-page-rotate-ccw-button =
+    .title = 啻樴礋啻苦磿啻距窗 啻︵纯啻多疮嗟嵿磿嗟嵿磿嗟佮祶 啻掂纯啻窗嗟�啻む串啻距疮啻� 啻曕幢啻曕祶啻曕祦啻�
+pdfjs-page-rotate-ccw-button-label = 啻樴礋啻苦磿啻距窗 啻︵纯啻多疮嗟嵿磿嗟嵿磿嗟佮祶 啻掂纯啻窗嗟�啻む串啻距疮啻� 啻曕幢啻曕祶啻曕祦啻�
+pdfjs-cursor-text-select-tool-button =
+    .title = 啻熰祮啻曕祶啻膏祶啻编祶啻编祶 啻む纯啻班礊嗟嵿礊嗟嗋礋嗟佮磿嗟嵿磿嗟� 啻熰祩啻赤祶鈥� 啻祶啻班淳啻祶啻む串啻距磿嗟嵿磿嗟佮磿
+pdfjs-cursor-text-select-tool-button-label = 啻庎创嗟佮搐嗟嵿搐嗟佮祶 啻む纯啻班礊嗟嵿礊嗟嗋礋嗟佮磿嗟嵿磿嗟� 啻曕窗嗟�
+pdfjs-cursor-hand-tool-button =
+    .title = 啻曕祱啻曕祶啻曕窗嗟� 啻祶啻班淳啻祶啻む串啻距磿嗟嵿磿嗟佮磿
+pdfjs-cursor-hand-tool-button-label = 啻曕祱啻曕祶啻曕窗嗟�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 啻班祰啻栢疮嗟佮礋嗟� 啻掂纯啻多祰啻粪搐啻曕闯嗟嶁��...
+pdfjs-document-properties-button-label = 啻班祰啻栢疮嗟佮礋嗟� 啻掂纯啻多祰啻粪搐啻曕闯嗟嶁��...
+pdfjs-document-properties-file-name = 啻疮啻侧纯啻ㄠ祶啻编祮 啻祰啻班祶鈥�:
+pdfjs-document-properties-file-size = 啻疮啻侧纯啻ㄠ祶啻编祮 啻掂床啻苦椽嗟嵿椽啻�:鈥屸��
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 啻祱啻编祶啻编祦啻曕稻)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 啻祱啻编祶啻编祦啻曕稻)
+pdfjs-document-properties-title = 啻む床啻曕祶啻曕祮啻熰祶啻熰祶鈥�
+pdfjs-document-properties-author = 啻班礆啻纯啻む淳啻掂祶:
+pdfjs-document-properties-subject = 啻掂纯啻粪疮啻�:
+pdfjs-document-properties-keywords = 啻祮啻班祦啻祦啻班纯啻曕稻:
+pdfjs-document-properties-creation-date = 啻祩啻班祶鈥嵿搐嗟嵿搐啻苦疮啻距磿嗟佮川嗟嵿川 啻む祤啻搐啻�:
+pdfjs-document-properties-modification-date = 啻淳啻编祶啻编磦 啻掂窗嗟佮搐嗟嵿搐啻苦疮 啻む祤啻搐啻�:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 啻膏祪啻粪祶啻熰纯啻曕窗嗟嶁�嵿搐嗟嵿搐啻距吹嗟�:
+pdfjs-document-properties-producer = 啻纯啻∴纯啻庎传嗟� 啻祶啻班祳啻∴祶啻祩啻膏窗嗟嶁��:
+pdfjs-document-properties-version = 啻纯啻∴纯啻庎传嗟� 啻搐啻苦椽嗟嵿椽嗟�:
+pdfjs-document-properties-page-count = 啻む淳啻赤纯啻ㄠ祶啻编祮 啻庎矗嗟嵿矗啻�:
+pdfjs-document-properties-page-size = 啻む淳嗟� 啻掂床嗟佮椽嗟嵿椽啻�
+pdfjs-document-properties-page-size-unit-inches = 啻囙礊嗟嵿礆嗟佮祶
+pdfjs-document-properties-page-size-unit-millimeters = 啻纯啻侧祶啻侧祤啻祤啻编祶啻编导
+pdfjs-document-properties-page-size-orientation-portrait = 啻涏淳啻椽啻熰磦 啻班祤啻む纯啻纯啻侧祶鈥�
+pdfjs-document-properties-page-size-orientation-landscape = 啻祩啻︵祪啻多祶啻搐嗟嵿搐啻苦川嗟嵿幢嗟� 啻嗋磿嗟冟搐啻苦疮啻苦床嗟嶁��
+pdfjs-document-properties-page-size-name-a-three = 啻� 3
+pdfjs-document-properties-page-size-name-a-four = 啻� 4
+pdfjs-document-properties-page-size-name-letter = 啻曕搐嗟嵿搐嗟佮祶
+pdfjs-document-properties-page-size-name-legal = 啻ㄠ纯啻串啻窗啻�
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name },{ $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 啻掂纯啻班吹嗟嬥闯 啻椸祴啻赤淳啻ㄠ祶啻む窗啻曕祶啻曕淳啻脆祶啻� :
+pdfjs-document-properties-linearized-yes = 啻呧搐嗟�
+pdfjs-document-properties-linearized-no = 啻囙床嗟嵿床
+pdfjs-document-properties-close-button = 啻呧礋啻祶啻曕祶啻曕祦啻�
+
+## Print
+
+pdfjs-print-progress-message = 啻呧礆嗟嵿礆啻熰纯啻祶啻纯啻ㄠ祦嗟� 啻祶啻班串啻距矗啻� 啻掄窗嗟佮磿嗟嵿磿嗟佮川嗟嵿川嗟�...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 啻编处嗟嵿处啻距磿嗟嵿磿嗟佮磿
+pdfjs-printing-not-supported = 啻祦啻ㄠ祶啻ㄠ幢啻苦疮啻苦椽嗟嵿椽嗟佮祶: 啻� 啻呧川嗟嵿吹嗟囙捶啻苦疮啻ㄠ祶啻む祶啻班串啻苦到 啻呧礆嗟嵿礆啻熰纯啻祶啻祦嗟� 啻祦啻脆祦啻掂川啻距疮啻� 啻纯啻ㄠ祶啻む祦啻`疮嗟嵿磿嗟嵿磿啻距窗啻苦床嗟嵿床.
+pdfjs-printing-not-ready = 啻祦啻ㄠ祶啻ㄠ幢啻苦疮啻苦椽嗟嵿椽嗟佮祶: 啻呧礆嗟嵿礆啻熰纯啻曕祶啻曕淳啻ㄠ淳啻纯 啻� 啻纯啻∴纯啻庎传 啻祳啻む祶啻む磦 啻侧喘嗟嵿疮啻淳啻曕祶啻曕纯啻纯啻熰祶啻熰纯啻侧祶啻�
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 啻呧矗啻苦吹啻曕祶啻曕磦 啻熰祴啻椸纯嗟� 啻氞祮啻祶啻祦啻�
+pdfjs-toggle-sidebar-button-label = 啻呧矗啻苦吹啻曕祶啻曕磦 啻熰祴啻椸纯嗟� 啻氞祮啻祶啻祦啻�
+pdfjs-document-outline-button =
+    .title = 啻∴祴啻曕祶啻祦啻祮啻ㄠ祶啻编纯啻ㄠ祶啻编祮 啻淳啻灌祶啻窗嗟囙礀 啻曕淳啻`纯啻曕祶啻曕祦啻� (啻庎床嗟嵿床啻� 啻囙川啻權祶啻權闯嗟佮磦 啻掂纯啻祦啻侧祤啻曕窗啻苦磿嗟嵿磿啻距川嗟佮磦 啻氞祦啻班祦啻曕祶啻曕淳啻ㄠ祦啻� 啻囙窗啻熰祶啻� 啻曕祶啻侧纯啻曕祶啻曕祦啻氞祮啻祶啻祦啻�)
+pdfjs-document-outline-button-label = 啻班祰啻栢疮嗟佮礋嗟� 啻斷礋嗟嵿礋嗟嵿床嗟堗川嗟嶁��
+pdfjs-attachments-button =
+    .title = 啻呧幢嗟嵿幢啻距礆嗟嵿串嗟嗋川嗟嵿幢嗟佮磿啻赤祶鈥� 啻曕淳啻`纯啻祶啻曕祶啻曕祦啻�
+pdfjs-attachments-button-label = 啻呧幢嗟嵿幢啻距礆嗟嵿串嗟嗋川嗟嵿幢嗟佮磿啻赤祶鈥�
+pdfjs-layers-button-label = 啻淳啻赤纯啻曕稻
+pdfjs-thumbs-button =
+    .title = 啻む磦啻祶啻ㄠ祮啻纯啻侧祦啻曕闯嗟嶁�� 啻曕淳啻`纯啻祶啻曕祶啻曕祦啻�
+pdfjs-thumbs-button-label = 啻む磦啻祶啻ㄠ祮啻纯啻侧祦啻曕闯嗟嶁��
+pdfjs-findbar-button =
+    .title = 啻班祰啻栢疮啻苦床嗟嶁�� 啻曕矗嗟嵿礋嗟佮椽啻苦礋啻苦疮嗟嵿磿嗟嵿磿嗟佮磿
+pdfjs-findbar-button-label = 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿
+pdfjs-additional-layers = 啻曕祩啻熰淳啻む祶啻� 啻淳啻赤纯啻曕稻
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 啻む淳啻赤祶鈥� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 啻む淳啻赤纯啻ㄠ祦啻赤祶啻� 啻む磦啻祶啻ㄠ祮啻纯啻侧祶鈥�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿
+    .placeholder = 啻∴祴啻曕祶啻祦啻祮啻ㄠ祶啻编纯啻侧祶鈥� 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿鈥�
+pdfjs-find-previous-button =
+    .title = 啻掂淳啻氞磿啻� 啻囙搐啻苦川嗟� 啻祦啻ㄠ祶鈥嵿椽嗟嶁�� 啻嗋吹啻班祶鈥嵿搐嗟嵿搐啻苦礆嗟嵿礆啻む祶鈥� 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿
+pdfjs-find-previous-button-label = 啻祦啻祶啻祦嗟�
+pdfjs-find-next-button =
+    .title = 啻掂淳啻氞磿啻� 啻掂祤啻`祶啻熰祦啻� 啻嗋吹啻班祶鈥嵿搐嗟嵿搐啻苦磿嗟嵿磿嗟佮川嗟嵿川啻む祶鈥� 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿
+pdfjs-find-next-button-label = 啻呧礋嗟佮搐嗟嵿搐啻む祦嗟�
+pdfjs-find-highlight-checkbox = 啻庎床嗟嵿床啻距磦 啻庎礋嗟佮搐嗟嵿搐嗟佮磿啻距矗啻苦疮嗟嵿磿嗟嵿磿嗟佮磿
+pdfjs-find-match-case-checkbox-label = 啻呧磿嗟嵿捶啻班礄嗟嵿礄啻赤祶鈥� 啻掄搐嗟嵿搐嗟佮川嗟嬥磿嗟嵿磿嗟佮磿
+pdfjs-find-entire-word-checkbox-label = 啻祦啻脆祦啻掂祷 啻掂淳啻曕祶啻曕祦啻曕稻
+pdfjs-find-reached-top = 啻班祰啻栢疮嗟佮礋嗟� 啻祦啻曕闯啻苦床嗟嶁�� 啻庎搐嗟嵿搐啻苦疮啻苦窗啻苦磿嗟嵿磿嗟佮川嗟嵿川嗟�, 啻む淳啻脆祮 啻ㄠ纯啻ㄠ祶啻ㄠ祦啻� 啻む祦啻熰窗嗟佮川嗟嵿川嗟�
+pdfjs-find-reached-bottom = 啻班祰啻栢疮嗟佮礋嗟� 啻呧吹啻膏淳啻ㄠ磦 啻掂窗嗟� 啻庎搐嗟嵿搐啻苦疮啻苦窗啻苦磿嗟嵿磿嗟佮川嗟嵿川嗟�, 啻祦啻曕闯啻苦床嗟嶁�� 啻ㄠ纯啻ㄠ祶啻ㄠ祦啻� 啻む祦啻熰窗嗟佮川嗟嵿川嗟�
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } / { $total } 啻祳啻班祦啻む祶啻む礄嗟嵿礄啻赤祶鈥�
+       *[other] { $current } / { $total } 啻祳啻班祦啻む祶啻む礄嗟嵿礄啻赤祶鈥�
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] { $limit } 啻祳啻班祦啻む祶啻む礄嗟嵿礄啻赤纯啻侧祶鈥� 啻曕祩啻熰祦啻む床嗟嶁��
+       *[other] { $limit } 啻祳啻班祦啻む祶啻む礄嗟嵿礄啻赤纯啻侧祶鈥� 啻曕祩啻熰祦啻む床嗟嶁��
+    }
+pdfjs-find-not-found = 啻掂淳啻氞磿啻� 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐啻距川啻距疮啻苦床嗟嵿床
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 啻む淳啻赤纯啻ㄠ祶啻编祮 啻掂祤啻む纯
+pdfjs-page-scale-fit = 啻む淳啻赤祶鈥� 啻淳啻曕搐嗟嵿搐啻苦川啻距磿嗟嵿磿嗟佮磿
+pdfjs-page-scale-auto = 啻膏祶啻掂疮啻淳啻纯 啻掂床嗟佮搐啻距磿嗟嵿磿嗟佮磿
+pdfjs-page-scale-actual = 啻触啻距窗嗟嶁�嵿搐嗟嵿触 啻掂祶啻淳啻祶啻む纯
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 啻む淳啻赤祶鈥� { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 啻纯啻∴纯啻庎传嗟� 啻侧喘嗟嵿疮啻淳啻曕祶啻曕祦啻祶啻祴啻赤祶鈥� 啻纯啻多磿嗟� 啻夃矗嗟嵿礋啻距疮啻苦窗啻苦疮嗟嵿磿嗟嵿磿嗟佮川嗟嵿川嗟�.
+pdfjs-invalid-file-error = 啻む祮啻编祶啻编淳啻� 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦床嗟嶁�� 啻む磿啻班淳啻编祦啻赤祶啻� 啻纯啻∴纯啻庎传嗟� 啻疮啻侧祶鈥�.
+pdfjs-missing-file-error = 啻纯啻∴纯啻庎传嗟� 啻疮啻侧祶鈥� 啻侧喘嗟嵿疮啻床嗟嵿床.
+pdfjs-unexpected-response-error = 啻祶啻班搐嗟�啻曕祶啻粪纯啻曕祶啻曕淳啻む祶啻� 啻膏祮啻班祶鈥嵿吹啻班祶鈥� 啻幢嗟佮椽啻熰纯.
+pdfjs-rendering-error = 啻む淳啻赤祶鈥� 啻编祮啻`祶啻熰窗嗟嶁�� 啻氞祮啻祶啻祦啻祶啻祴啻赤祶鈥嶁�� 啻纯啻多磿嗟佮矗嗟嵿礋啻距疮啻苦窗啻苦疮嗟嵿磿嗟嵿磿嗟佮川嗟嵿川嗟�.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 啻� 啻纯啻∴纯啻庎传嗟� 啻疮啻侧祶鈥� 啻む祦啻编磿嗟嵿磿嗟佮川嗟嵿川啻む纯啻ㄠ祦嗟� 啻掄闯啻苦吹啻距磿嗟嵿磿嗟� 啻ㄠ床嗟嶁�嵿磿嗟佮磿.
+pdfjs-password-invalid = 啻む祮啻编祶啻编淳啻� 啻掄闯啻苦吹啻距磿嗟嵿磿嗟�, 啻︵疮啻掂淳啻纯 啻掂祤啻`祶啻熰祦啻� 啻多祶啻班串啻苦疮嗟嵿磿嗟嵿磿嗟佮磿.
+pdfjs-password-ok-button = 啻多窗啻�
+pdfjs-password-cancel-button = 啻编处嗟嵿处啻距磿嗟嵿磿嗟佮磿
+pdfjs-web-fonts-disabled = 啻掂祮啻纯啻ㄠ祦啻赤祶啻� 啻呧磿嗟嵿捶啻班锤啻炧祶啻氞疮啻權祶啻權闯嗟嶁�� 啻祶啻班吹啻班祶鈥嵿搐嗟嵿搐啻� 啻班垂啻苦搐啻�: 啻庎磦啻础嗟嵿础嗟� 啻氞祮啻祶啻� 啻纯啻∴纯啻庎传嗟� 啻呧磿嗟嵿捶啻班锤啻炧祶啻氞疮啻權祶啻權闯嗟嶁�� 啻夃椽啻祴啻椸纯啻祶啻曕祶啻曕祦啻掂淳啻ㄠ祶鈥� 啻膏淳啻о祶啻串啻侧祶啻�.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 啻庎创嗟佮搐嗟嵿搐嗟佮祶
+pdfjs-editor-free-text-button-label = 啻庎创嗟佮搐嗟嵿搐嗟佮祶
+pdfjs-editor-ink-button =
+    .title = 啻掂窗啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-ink-button-label = 啻掂窗啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-stamp-button =
+    .title = 啻氞纯啻む祶啻班礄嗟嵿礄啻赤祮 啻氞祰嗟监磿嗟嵿磿嗟佮磿 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦到 啻む纯啻班祦啻む祶啻む祦啻�
+pdfjs-editor-stamp-button-label = 啻氞纯啻む祶啻班礄嗟嵿礄啻赤祮 啻氞祰嗟监磿嗟嵿磿嗟佮磿 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦到 啻む纯啻班祦啻む祶啻む祦啻�
+pdfjs-editor-highlight-button =
+    .title = 啻呧礋啻淳啻赤椽嗟嵿椽嗟嗋礋嗟佮磿
+pdfjs-editor-highlight-button-label = 啻呧礋啻淳啻赤椽嗟嵿椽嗟嗋礋嗟佮磿
+pdfjs-highlight-floating-button1 =
+    .title = 啻呧礋啻淳啻赤椽嗟嵿椽嗟嗋礋嗟佮磿
+    .aria-label = 啻呧礋啻淳啻赤椽嗟嵿椽嗟嗋礋嗟佮磿
+pdfjs-highlight-floating-button-label = 啻呧礋啻淳啻赤椽嗟嵿椽嗟嗋礋嗟佮磿
+pdfjs-editor-signature-button =
+    .title = 啻祦啻む纯啻� 啻掄椽嗟嵿椽嗟佮祶 啻氞祰嗟庎磿嗟嵿磿嗟佮磿
+pdfjs-editor-signature-button-label = 啻祦啻む纯啻� 啻掄椽嗟嵿椽嗟佮祶 啻氞祰嗟庎磿嗟嵿磿嗟佮磿
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 啻嗋床嗟囙礀嗟嵿疮啻� 啻淳啻编祶啻编祦啻�
+pdfjs-editor-remove-freetext-button =
+    .title = 啻庎创嗟佮搐嗟嵿搐嗟佮祶 啻淳啻编祶啻编祦啻�
+pdfjs-editor-remove-stamp-button =
+    .title = 啻氞纯啻む祶啻班磦 啻淳啻编祶啻编祦啻�
+pdfjs-editor-remove-highlight-button =
+    .title = 啻呧礋啻淳啻赤椽嗟嵿椽嗟嗋礋嗟嵿礋嗟佮搐嗟佮祶 啻淳啻编祶啻编祦啻�
+pdfjs-editor-remove-signature-button =
+    .title = 啻掄椽嗟嵿椽嗟佮祶 啻淳啻编祶啻编祦啻�
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 啻ㄠ纯啻编磦
+pdfjs-editor-free-text-size-input = 啻掂床嗟佮椽嗟嵿椽啻�
+pdfjs-editor-ink-color-input = 啻ㄠ纯啻编磦
+pdfjs-editor-ink-thickness-input = 啻曕川啻�
+pdfjs-editor-ink-opacity-input = 啻呧搐啻距窗嗟嵿疮啻�
+pdfjs-editor-stamp-add-image-button =
+    .title = 啻氞纯啻む祶啻班磦 啻氞祰嗟监磿嗟嵿磿嗟佮磿
+pdfjs-editor-stamp-add-image-button-label = 啻氞纯啻む祶啻班磦 啻氞祰嗟监磿嗟嵿磿嗟佮磿
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 啻曕川啻�
+pdfjs-editor-signature-add-signature-button =
+    .title = 啻祦啻む纯啻� 啻掄椽嗟嵿椽嗟佮祶 啻氞祰嗟庎磿嗟嵿磿嗟佮磿
+pdfjs-editor-signature-add-signature-button-label = 啻祦啻む纯啻� 啻掄椽嗟嵿椽嗟佮祶 啻氞祰嗟庎磿嗟嵿磿嗟佮磿
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 啻曕窗嗟佮搐啻苦吹啻氞祶啻� 啻掄椽嗟嵿椽嗟佮祶 : { $description }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 啻呧矗啻苦吹啻曕祶啻曕磦 啻呧礋啻祶啻曕祶啻曕祦啻�
+    .aria-label = 啻呧矗啻苦吹啻曕祶啻曕磦 啻呧礋啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-comments-sidebar-close-button-label = 啻呧矗啻苦吹啻曕祶啻曕磦 啻呧礋啻祶啻曕祶啻曕祦啻�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻む纯啻班祦啻む祶啻む祦啻�
+pdfjs-editor-alt-text-dialog-label = 啻膏淳啻о祶啻搐 啻む纯啻班礊嗟嵿礊嗟嗋礋嗟佮磿嗟嵿磿嗟�
+pdfjs-editor-alt-text-add-description-label = 啻掄窗嗟� 啻掂纯啻掂窗啻`磦 啻氞祰嗟监磿嗟嵿磿嗟佮磿
+pdfjs-editor-alt-text-cancel-button = 啻编处嗟嵿处啻距磿嗟嵿磿嗟佮磿
+pdfjs-editor-alt-text-save-button = 啻曕窗嗟佮搐啻苦吹啻祶啻曕祶啻曕祦啻�
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 啻夃处啻距垂啻班矗啻�, 鈥溹磼啻班祦 啻氞祮啻编祦啻祶啻磿嗟嵿磿啻距窗嗟� 啻磿嗟嵿捶啻`磦 啻曕创啻苦磿嗟嵿磿啻距祷 啻祰啻多疮啻苦床啻苦窗嗟佮川嗟嵿川嗟佲��
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 啻呧礋啻淳啻赤川嗟嵿川啻苦幢啻�
+pdfjs-editor-colorpicker-button =
+    .title = 啻ㄠ纯啻编磦 啻淳啻编祶啻编祦啻�
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 啻ㄠ纯啻编锤啻距揣嗟嵿疮啻む磿嗟�
+pdfjs-editor-colorpicker-yellow =
+    .title = 啻礊嗟嵿礊
+pdfjs-editor-colorpicker-green =
+    .title = 啻礆嗟嵿礆
+pdfjs-editor-colorpicker-blue =
+    .title = 啻ㄠ祤啻�
+pdfjs-editor-colorpicker-pink =
+    .title = 啻淳啻熰床
+pdfjs-editor-colorpicker-red =
+    .title = 啻氞祦啻川嗟嵿川
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 啻庎床嗟嵿床啻距磦 啻曕淳啻`纯啻曕祶啻曕祦啻�
+pdfjs-editor-highlight-show-all-button =
+    .title = 啻庎床嗟嵿床啻距磦 啻曕淳啻`纯啻曕祶啻曕祦啻�
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻む纯啻班祦啻む祶啻む祦啻� (啻氞纯啻む祶啻� 啻掂纯啻掂窗啻`磦)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻氞祰嗟庎磿嗟嵿磿嗟佮磿 (啻氞纯啻む祶啻� 啻掂纯啻掂窗啻`磦)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 啻む淳啻權祶啻權闯嗟佮礋嗟� 啻掂纯啻掂窗啻`磦 啻囙吹啻苦礋嗟� 啻庎创嗟佮搐嗟佮磿...
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 啻� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻む川嗟嵿川嗟嗋搐啻距川嗟嗋疮嗟佮矗嗟嵿礋啻距磿嗟嵿磿啻苦疮啻む祦啻曕祳啻`祶啻熰祦嗟� 啻む祮啻编祶啻编淳啻搐啻距吹啻距磦.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 啻曕祩啻熰祦啻む床嗟嶁�� 啻呧幢啻苦疮嗟佮磿
+pdfjs-editor-new-alt-text-create-automatically-button-label = 啻む川嗟嵿川嗟嗋搐啻距川嗟� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻夃矗嗟嵿礋啻距磿嗟嵿磿嗟佮磿
+pdfjs-editor-new-alt-text-not-now-button = 啻囙椽嗟嵿椽嗟嬥创啻侧祶啻�
+pdfjs-editor-new-alt-text-error-title = 啻む川嗟嵿川嗟嗋搐啻距川嗟� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻夃矗嗟嵿礋啻距磿嗟嵿磿啻距祷 啻幢嗟嵿幢啻苦疮啻苦床嗟嵿床
+pdfjs-editor-new-alt-text-error-description = 啻む川啻む淳啻� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻囙礋嗟佮磿 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦到 啻纯啻ㄠ祶啻ㄠ祤啻熰祦嗟� 啻多祶啻班串啻苦疮嗟嵿磿嗟嵿磿嗟佮磿.
+pdfjs-editor-new-alt-text-error-close-button = 啻呧礋啻祶啻曕祶啻曕祦啻�
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻氞祰嗟庎搐嗟嵿搐嗟�
+pdfjs-editor-new-alt-text-added-button-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻氞祰嗟庎搐嗟嵿搐嗟�
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻曕淳啻`淳啻ㄠ祶啻ㄠ纯啻侧祶啻�
+pdfjs-editor-new-alt-text-missing-button-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻曕淳啻`淳啻ㄠ祶啻ㄠ纯啻侧祶啻�
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻呧吹啻侧祴啻曕纯啻曕祶啻曕祦啻�
+pdfjs-editor-new-alt-text-to-review-button-label = 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻呧吹啻侧祴啻曕纯啻曕祶啻曕祦啻�
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 啻む川嗟嵿川嗟嗋搐啻距川嗟� 啻夃矗嗟嵿礋啻距磿嗟嵿磿啻� : { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 啻氞纯啻む祶啻� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻曕祶啻班串嗟�啻曕窗啻`礄嗟嵿礄嗟�
+pdfjs-image-alt-text-settings-button-label = 啻氞纯啻む祶啻� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻曕祶啻班串嗟�啻曕窗啻`礄嗟嵿礄嗟�
+pdfjs-editor-alt-text-settings-dialog-label = 啻氞纯啻む祶啻� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻曕祶啻班串嗟�啻曕窗啻`礄嗟嵿礄嗟�
+pdfjs-editor-alt-text-settings-automatic-title = 啻淳啻ㄠ祶啻む祶啻班纯啻� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶
+pdfjs-editor-alt-text-settings-create-model-button-label = 啻む川嗟嵿川嗟嗋搐啻距川嗟� 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮祶 啻夃矗嗟嵿礋啻距磿嗟嵿磿嗟佮磿
+pdfjs-editor-alt-text-settings-delete-model-button = 啻淳啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-alt-text-settings-download-model-button = 啻囙幢啻曕祶啻曕纯啻掂疮嗟嵿磿嗟嵿磿嗟佮磿
+pdfjs-editor-alt-text-settings-downloading-model-button = 啻囙幢啻曕祶啻曕纯啻掂疮嗟嵿磿嗟嵿磿嗟佮川嗟嵿川嗟�
+pdfjs-editor-alt-text-settings-show-dialog-description = 啻む淳啻權祶啻權闯嗟佮礋嗟� 啻庎床嗟嵿床啻� 啻礋啻權祶啻權闯啻苦床嗟佮磦 啻幢嗟佮疮嗟嗋创嗟佮搐嗟嵿搐嗟佮矗嗟嵿礋嗟嗋川嗟嵿川嗟佮祶 啻む祤嗟庎礆嗟嵿礆啻祶啻祮啻熰祦啻む祶啻む淳嗟� 啻む祦啻`疮嗟嵿磿嗟嵿磿嗟佮川嗟嵿川嗟�.
+pdfjs-editor-alt-text-settings-close-button = 啻呧礋啻祶啻曕祶啻曕祦啻�
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 啻呧礋啻淳啻赤磦 啻淳啻编祶啻编纯
+pdfjs-editor-undo-bar-message-freetext = 啻庎创嗟佮搐嗟嵿搐嗟佮祶 啻淳啻编祶啻编纯
+pdfjs-editor-undo-bar-message-ink = 啻嗋床嗟囙礀嗟嵿疮啻� 啻淳啻编祶啻编纯
+pdfjs-editor-undo-bar-message-stamp = 啻氞纯啻む祶啻班磦 啻淳啻编祶啻编纯
+pdfjs-editor-undo-bar-message-signature = 啻掄椽嗟嵿椽嗟佮祶 啻淳啻编祶啻编纯
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 啻曕祦啻编纯啻祶啻祮啻脆祦啻む床嗟佮磿嗟� 啻淳啻编祶啻编纯
+       *[other] { $count } 啻曕祦啻编纯啻祶啻祮啻脆祦啻む床嗟佮磿嗟� 啻淳啻编祶啻编纯
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 啻创啻椽嗟嬥床嗟嗋疮啻距磿嗟嵿磿嗟佮磿
+pdfjs-editor-undo-bar-undo-button-label = 啻创啻椽嗟嬥床嗟嗋疮啻距磿嗟嵿磿嗟佮磿
+pdfjs-editor-undo-bar-close-button =
+    .title = 啻呧礋啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-undo-bar-close-button-label = 啻呧礋啻祶啻曕祶啻曕祦啻�
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-title = 啻掄椽嗟嵿椽嗟佮祶 啻氞祰嗟庎磿嗟嵿磿嗟佮磿
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 啻む窗啻�
+    .title = 啻む窗啻�
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 啻掂窗啻祶啻曕祶啻曕祦啻�
+    .title = 啻掂窗啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-add-signature-image-button = 啻氞纯啻む祶啻班磦
+    .title = 啻氞纯啻む祶啻班磦
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 啻む淳啻權祶啻權闯嗟佮礋嗟� 啻掄椽嗟嵿椽嗟佮祶 啻囙吹啻苦礋嗟� 啻庎创嗟佮搐嗟佮磿
+    .placeholder = 啻む淳啻權祶啻權闯嗟佮礋嗟� 啻掄椽嗟嵿椽嗟佮祶 啻囙吹啻苦礋嗟� 啻庎创嗟佮搐嗟佮磿
+pdfjs-editor-add-signature-draw-placeholder = 啻む淳啻權祶啻權闯嗟佮礋嗟� 啻掄椽嗟嵿椽嗟佮祶 啻掂窗啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-add-signature-draw-thickness-range-label = 啻曕川啻�
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 啻掂窗啻祶啻祦啻曕川啻�: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 啻曕疮啻编祶啻编祦啻掂疮嗟嵿磿嗟嵿磿啻距祷 啻掂祰啻`祶啻熰纯 啻疮啻侧纯啻ㄠ祦嗟� 啻囙吹啻苦礋嗟嬥礋嗟嵿礋嗟佮祶 啻掂床啻苦礆嗟嵿礆啻苦礋嗟佮磿
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦到 啻氞纯啻む祶啻班磦 啻疮啻侧祦啻曕稻 啻む椽嗟嵿椽嗟佮磿
+       *[other] 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦到 啻氞纯啻む祶啻班磦 啻疮啻侧祦啻曕稻 啻む椽嗟嵿椽嗟佮磿
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 啻掂纯啻掂窗啻`磦 (啻囙搐啻班疮嗟嗋创嗟佮搐嗟佮祶)
+pdfjs-editor-add-signature-description-input =
+    .title = 啻掂纯啻掂窗啻`磦 (啻囙搐啻班疮嗟嗋创嗟佮搐嗟佮祶)
+pdfjs-editor-add-signature-description-default-when-drawing = 啻掄椽嗟嵿椽嗟佮祶
+pdfjs-editor-add-signature-clear-button-label = 啻掄椽嗟嵿椽嗟佮祶 啻淳啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-add-signature-clear-button =
+    .title = 啻掄椽嗟嵿椽嗟佮祶 啻淳啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-add-signature-save-checkbox = 啻掄椽嗟嵿椽嗟佮祶 啻曕窗嗟佮搐啻苦吹啻祶啻曕祶啻曕祦啻�
+pdfjs-editor-add-signature-save-warning-message = 啻む淳啻權祶啻權闯嗟佮礋嗟� 啻掄椽嗟嵿椽嗟佮磿啻赤祦啻熰祮 啻庎矗嗟嵿矗啻� 5 啻嗋疮啻�. 啻曕祩啻熰祦啻む到 啻曕窗嗟佮搐啻苦吹啻祶啻曕祶啻曕淳嗟� 啻掂祰啻`祶啻熰纯 啻掄窗嗟嗋矗嗟嵿矗啻� 啻淳啻编祶啻编矗嗟嵿礋啻苦吹啻班祦啻�.
+pdfjs-editor-add-signature-image-upload-error-title = 啻氞纯啻む祶啻班磦 啻曕疮啻编祶啻编祦啻掂疮嗟嵿磿嗟嵿磿啻距祷 啻幢嗟嵿幢啻苦疮啻苦床嗟嵿床
+pdfjs-editor-add-signature-image-upload-error-description = 啻む淳啻權祶啻權闯嗟佮礋嗟� 啻多祪啻傕礀啻� 啻膏串嗟嵿椽嗟庎磿嗟嵿磿啻� 啻窗啻苦炊嗟嬥揣啻苦磿嗟嵿磿嗟佮磿 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦到 啻掂祰啻编祮啻祳啻班祦 啻氞纯啻む祶啻班磦 啻囙礋嗟嵿礋嗟佮川嗟嬥磿嗟嵿磿嗟佮磿
+pdfjs-editor-add-signature-error-close-button = 啻呧礋啻祶啻曕祶啻曕祦啻�
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 啻编处嗟嵿处啻距磿嗟嵿磿嗟佮磿
+pdfjs-editor-add-signature-add-button = 啻氞祰嗟庎磿嗟嵿磿嗟佮磿
+pdfjs-editor-edit-signature-update-button = 啻祦啻む祦啻曕祶啻曕祦啻�
+
+##  Edit a comment dialog
+
+pdfjs-editor-edit-comment-dialog-cancel-button = 啻编处嗟嵿处啻距磿嗟嵿磿嗟佮磿
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-views-manager-status-close-button =
+    .title = 啻呧礋啻祶啻曕祶啻曕祦啻�
+pdfjs-views-manager-status-close-button-label = 啻呧礋啻祶啻曕祶啻曕祦啻�
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 啻曕窗嗟佮搐啻苦吹啻氞祶啻� 啻掄椽嗟嵿椽嗟佮祶 啻淳啻编祶啻编祦啻�
+pdfjs-editor-delete-signature-button-label1 = 啻曕窗嗟佮搐啻苦吹啻氞祶啻� 啻掄椽嗟嵿椽嗟佮祶 啻淳啻编祶啻编祦啻�
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 啻掂纯啻掂窗啻`磦 啻む纯啻班祦啻む祶啻む祦啻�
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 啻掂纯啻掂窗啻`磦 啻む纯啻班祦啻む祶啻む祦啻�
diff --git a/public/pdfjs/web/locale/mr/viewer.ftl b/public/pdfjs/web/locale/mr/viewer.ftl
new file mode 100644
index 0000000..fbb9698
--- /dev/null
+++ b/public/pdfjs/web/locale/mr/viewer.ftl
@@ -0,0 +1,210 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 啶ぞ啶椸啶� 啶啶粪啶�
+pdfjs-previous-button-label = 啶ぞ啶椸啶�
+pdfjs-next-button =
+    .title = 啶啶⑧啶� 啶啶粪啶�
+pdfjs-next-button-label = 啶啶⑧啶�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 啶啶粪啶�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount }啶啶曕
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pagesCount } 啶啶曕 { $pageNumber })
+pdfjs-zoom-out-button =
+    .title = 啶涏啶熰 啶曕ぐ啶�
+pdfjs-zoom-out-button-label = 啶涏啶熰 啶曕ぐ啶�
+pdfjs-zoom-in-button =
+    .title = 啶啶犩 啶曕ぐ啶�
+pdfjs-zoom-in-button-label = 啶啶犩 啶曕ぐ啶�
+pdfjs-zoom-select =
+    .title = 啶侧す啶距え 啶曕た啶傕さ啶� 啶啶犩 啶曕ぐ啶�
+pdfjs-presentation-mode-button =
+    .title = 啶啶班じ啷嵿い啷佮い啶苦啶班ぃ 啶啶∴啶� 啶掂ぞ啶ぐ 啶曕ぐ啶�
+pdfjs-presentation-mode-button-label = 啶啶班じ啷嵿い啷佮い啶苦啶班ぃ 啶啶�
+pdfjs-open-file-button =
+    .title = 啶ぞ啶囙げ 啶夃啶∴ぞ
+pdfjs-open-file-button-label = 啶夃啶∴ぞ
+pdfjs-print-button =
+    .title = 啶涏お啶距 啶曕ぐ啶�
+pdfjs-print-button-label = 啶涏お啶距 啶曕ぐ啶�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 啶膏ぞ啶оえ啷�
+pdfjs-tools-button-label = 啶膏ぞ啶оえ啷�
+pdfjs-first-page-button =
+    .title = 啶す啶苦げ啷嵿く啶� 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+pdfjs-first-page-button-label = 啶す啶苦げ啷嵿く啶� 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+pdfjs-last-page-button =
+    .title = 啶多啶掂啶氞啶ぞ 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+pdfjs-last-page-button-label = 啶多啶掂啶氞啶ぞ 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+pdfjs-page-rotate-cw-button =
+    .title = 啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+pdfjs-page-rotate-cw-button-label = 啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+pdfjs-page-rotate-ccw-button =
+    .title = 啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶夃げ啶� 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+pdfjs-page-rotate-ccw-button-label = 啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶夃げ啶� 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+pdfjs-cursor-text-select-tool-button =
+    .title = 啶啶曕啶� 啶ㄠた啶掂ぁ 啶膏ぞ啶оえ 啶曕ぞ啶班啶ぞ啶ㄠ啶掂く啷�啶� 啶曕ぐ啶�
+pdfjs-cursor-text-select-tool-button-label = 啶啶曕啶� 啶ㄠた啶掂ぁ 啶膏ぞ啶оえ
+pdfjs-cursor-hand-tool-button =
+    .title = 啶灌ぞ啶� 啶膏ぞ啶оえ 啶曕ぞ啶班啶ぞ啶ㄠ啶掂た啶� 啶曕ぐ啶�
+pdfjs-cursor-hand-tool-button-label = 啶灌じ啷嵿い 啶膏ぞ啶оえ
+pdfjs-scroll-vertical-button =
+    .title = 啶呧え啷佮げ啶傕が 啶膏啶曕啶班啶侧た啶傕 啶掂ぞ啶ぐ啶�
+pdfjs-scroll-vertical-button-label = 啶呧え啷佮げ啶傕が 啶膏啶曕啶班啶侧た啶傕
+pdfjs-scroll-horizontal-button =
+    .title = 啶曕啶粪啶むた啶� 啶膏啶曕啶班啶侧た啶傕 啶掂ぞ啶ぐ啶�
+pdfjs-scroll-horizontal-button-label = 啶曕啶粪啶むた啶� 啶膏啶曕啶班啶侧た啶傕
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 啶︵じ啷嵿い啶愢さ啶� 啶椸啶`ぇ啶班啶��
+pdfjs-document-properties-button-label = 啶︵じ啷嵿い啶愢さ啶� 啶椸啶`ぇ啶班啶��
+pdfjs-document-properties-file-name = 啶ぞ啶囙げ啶氞 啶ㄠぞ啶�:
+pdfjs-document-properties-file-size = 啶ぞ啶囙げ 啶嗋啶距ぐ:
+pdfjs-document-properties-title = 啶多た啶班啶粪:
+pdfjs-document-properties-author = 啶侧啶栢:
+pdfjs-document-properties-subject = 啶掂た啶粪く:
+pdfjs-document-properties-keywords = 啶啶栢啶ざ啶啶�:
+pdfjs-document-properties-creation-date = 啶ㄠた啶班啶ぞ啶� 啶︵た啶ㄠぞ啶傕:
+pdfjs-document-properties-modification-date = 啶︵啶班啶膏啶む 啶︵た啶ㄠぞ啶傕:
+pdfjs-document-properties-creator = 啶ㄠた啶班啶ぞ啶むぞ:
+pdfjs-document-properties-producer = PDF 啶ㄠた啶班啶ぞ啶むぞ:
+pdfjs-document-properties-version = PDF 啶嗋さ啷冟い啷嵿い啷�:
+pdfjs-document-properties-page-count = 啶啶粪啶� 啶膏啶栢啶ぞ:
+pdfjs-document-properties-page-size = 啶啶粪啶� 啶嗋啶距ぐ:
+pdfjs-document-properties-page-size-unit-inches = 啶囙啶�
+pdfjs-document-properties-page-size-unit-millimeters = 啶啶
+pdfjs-document-properties-page-size-orientation-portrait = 啶夃き啷� 啶ぞ啶傕ぁ啶`
+pdfjs-document-properties-page-size-orientation-landscape = 啶嗋ぁ啶掂
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 啶溹げ啶� 啶掂啶� 啶︵啶粪啶�:
+pdfjs-document-properties-linearized-yes = 啶灌
+pdfjs-document-properties-linearized-no = 啶ㄠぞ啶灌
+pdfjs-document-properties-close-button = 啶啶� 啶曕ぐ啶�
+
+## Print
+
+pdfjs-print-progress-message = 啶涏お啶距 啶曕ぐ啷�啶むぞ 啶啶粪啶� 啶むく啶距ぐ 啶曕ぐ啷�啶� 啶嗋す啷団��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 啶班う啷嵿う 啶曕ぐ啶�
+pdfjs-printing-not-supported = 啶膏ぞ啶掂ぇ啶距え啶むぞ: 啶ぞ 啶啶班ぞ啶夃啶班い啶班啶 啶涏お啶距 啶啶班啶`お啶` 啶膏ぎ啶班啶ム啶� 啶ㄠぞ啶灌.
+pdfjs-printing-not-ready = 啶膏ぞ啶掂ぇ啶距え啶むぞ: 啶涏お啶距啶曕ぐ啶苦い啶� PDF 啶啶班啶`い啶ぞ 啶侧啶� 啶澿ぞ啶侧 啶ㄠぞ啶灌.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 啶ぞ啶溹啶氞啶啷嵿啷� 啶熰啶椸げ 啶曕ぐ啶�
+pdfjs-toggle-sidebar-button-label = 啶ぞ啶溹啶氞啶啷嵿啷� 啶熰啶椸げ 啶曕ぐ啶�
+pdfjs-document-outline-button =
+    .title = 啶︵じ啷嵿い啶愢さ啶� 啶ぞ啶灌啶ぐ啷囙啶� 啶︵ぐ啷嵿ざ啶掂ぞ (啶掂た啶膏啶む啶� 啶曕ぐ啶`啶ぞ啶膏ぞ啶犩 啶︵啶ㄠさ啷囙こ啶� 啶曕啶侧た啶� 啶曕ぐ啶� /啶膏ぐ啷嵿さ 啶樴啶� 啶︵ぞ啶栢さ啶�)
+pdfjs-document-outline-button-label = 啶︵じ啷嵿い啶愢さ啶� 啶班啶ぐ啷囙し啶�
+pdfjs-attachments-button =
+    .title = 啶溹啶∴お啶む啶� 啶︵ぞ啶栢さ啶�
+pdfjs-attachments-button-label = 啶溹啶∴お啶む啶�
+pdfjs-thumbs-button =
+    .title = 啶ム啶え啷囙げ啷嵿じ啷� 啶︵ぞ啶栢さ啶�
+pdfjs-thumbs-button-label = 啶ム啶え啷囙げ啷嵿じ啷�
+pdfjs-findbar-button =
+    .title = 啶︵じ啷嵿い啶愢さ啶溹ぞ啶� 啶多啶оぞ
+pdfjs-findbar-button-label = 啶多啶оぞ
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 啶啶粪啶� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 啶啶粪啶犩ぞ啶氞 啶ム啶え啷囙げ { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 啶多啶оぞ
+    .placeholder = 啶︵じ啷嵿い啶愢さ啶溹ぞ啶� 啶多啶оぞ鈥�
+pdfjs-find-previous-button =
+    .title = 啶掂ぞ啶曕お啷嵿ぐ啶啶椸啷� 啶ぞ啶椸啶� 啶樴啶ㄠぞ 啶多啶оぞ
+pdfjs-find-previous-button-label = 啶ぞ啶椸啶�
+pdfjs-find-next-button =
+    .title = 啶掂ぞ啶曕お啷嵿ぐ啶啶椸啷� 啶啶⑧啶� 啶樴啶ㄠぞ 啶多啶оぞ
+pdfjs-find-next-button-label = 啶啶⑧啶�
+pdfjs-find-highlight-checkbox = 啶膏ぐ啷嵿さ 啶犩こ啶� 啶曕ぐ啶�
+pdfjs-find-match-case-checkbox-label = 啶嗋啶距ぐ 啶溹啶赤さ啶�
+pdfjs-find-entire-word-checkbox-label = 啶膏啶啶班啶� 啶多が啷嵿う
+pdfjs-find-reached-top = 啶︵じ啷嵿い啶愢さ啶溹ぞ啶氞啶ぞ 啶多啶班啶粪啶距じ 啶啶灌啶侧, 啶むこ啶ぞ啶膏啶� 啶啶⑧
+pdfjs-find-reached-bottom = 啶︵じ啷嵿い啶愢さ啶溹ぞ啶氞啶ぞ 啶むこ啶距げ啶� 啶啶灌啶侧, 啶多啶班啶粪啶距お啶距じ啷傕え 啶啶⑧
+pdfjs-find-not-found = 啶掂ぞ啶曕お啷嵿ぐ啶啶� 啶嗋あ啶赤げ啷� 啶ㄠぞ啶灌
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 啶啶粪啶犩ぞ啶氞 啶班啶傕う啷�
+pdfjs-page-scale-fit = 啶啶粪啶� 啶じ啶掂ぞ
+pdfjs-page-scale-auto = 啶膏啶掂く啶� 啶侧ぞ啶灌え 啶曕た啶傕さ啶� 啶啶犩 啶曕ぐ啶`
+pdfjs-page-scale-actual = 啶啶班い啷嵿く啶曕啶� 啶嗋啶距ぐ
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 啶侧啶� 啶曕ぐ啶む啶掂啶赤 啶む啶班啶熰 啶嗋あ啶赤げ啷�.
+pdfjs-invalid-file-error = 啶呧さ啷堗ぇ 啶曕た啶傕さ啶� 啶︵啶粪啶� PDF 啶ぞ啶囙げ.
+pdfjs-missing-file-error = 啶� 啶嗋あ啶赤ぃ啶距ぐ啷� PDF 啶ぞ啶囙げ.
+pdfjs-unexpected-response-error = 啶呧え啶啶曕啶粪た啶� 啶膏ぐ啷嵿さ啷嵿す啶� 啶啶班い啶苦じ啶距う.
+pdfjs-rendering-error = 啶啶粪啶� 啶︵ぞ啶栢さ啶む啶掂啶赤 啶む啶班啶熰 啶嗋あ啶赤げ啷�.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 啶熰た啶ぃ啷嵿ぃ啷�]
+
+## Password
+
+pdfjs-password-label = 啶灌 PDF 啶ぞ啶囙げ 啶夃啶∴ぃ啷嵿く啶距啶班た啶むぞ 啶ぞ啶膏さ啶班啶� 啶︵啶ぞ.
+pdfjs-password-invalid = 啶呧さ啷堗ぇ 啶ぞ啶膏さ啶班啶�. 啶曕啶く啶� 啶啶ㄠ啶灌ぞ 啶啶班く啶む啶� 啶曕ぐ啶�.
+pdfjs-password-ok-button = 啶犩啶� 啶嗋す啷�
+pdfjs-password-cancel-button = 啶班う啷嵿う 啶曕ぐ啶�
+pdfjs-web-fonts-disabled = 啶掂啶� 啶熰啶� 啶呧じ啶ぐ啷嵿ぅ啷�啶� 啶嗋す啷囙い: 啶忇ぎ啷嵿が啷囙ぁ啷囙ぁ PDF 啶熰啶� 啶掂ぞ啶ぐ 啶呧ざ啶曕啶�.
diff --git a/public/pdfjs/web/locale/ms/viewer.ftl b/public/pdfjs/web/locale/ms/viewer.ftl
new file mode 100644
index 0000000..e5e8b1e
--- /dev/null
+++ b/public/pdfjs/web/locale/ms/viewer.ftl
@@ -0,0 +1,222 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Halaman Dahulu
+pdfjs-previous-button-label = Dahulu
+pdfjs-next-button =
+    .title = Halaman Berikut
+pdfjs-next-button-label = Berikut
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Halaman
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = daripada { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } daripada { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zum Keluar
+pdfjs-zoom-out-button-label = Zum Keluar
+pdfjs-zoom-in-button =
+    .title = Zum Masuk
+pdfjs-zoom-in-button-label = Zum Masuk
+pdfjs-zoom-select =
+    .title = Zum
+pdfjs-presentation-mode-button =
+    .title = Tukar ke Mod Persembahan
+pdfjs-presentation-mode-button-label = Mod Persembahan
+pdfjs-open-file-button =
+    .title = Buka Fail
+pdfjs-open-file-button-label = Buka
+pdfjs-print-button =
+    .title = Cetak
+pdfjs-print-button-label = Cetak
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Alatan
+pdfjs-tools-button-label = Alatan
+pdfjs-first-page-button =
+    .title = Pergi ke Halaman Pertama
+pdfjs-first-page-button-label = Pergi ke Halaman Pertama
+pdfjs-last-page-button =
+    .title = Pergi ke Halaman Terakhir
+pdfjs-last-page-button-label = Pergi ke Halaman Terakhir
+pdfjs-page-rotate-cw-button =
+    .title = Berputar ikut arah Jam
+pdfjs-page-rotate-cw-button-label = Berputar ikut arah Jam
+pdfjs-page-rotate-ccw-button =
+    .title = Pusing berlawan arah jam
+pdfjs-page-rotate-ccw-button-label = Pusing berlawan arah jam
+pdfjs-cursor-text-select-tool-button =
+    .title = Dayakan Alatan Pilihan Teks
+pdfjs-cursor-text-select-tool-button-label = Alatan Pilihan Teks
+pdfjs-cursor-hand-tool-button =
+    .title = Dayakan Alatan Tangan
+pdfjs-cursor-hand-tool-button-label = Alatan Tangan
+pdfjs-scroll-vertical-button =
+    .title = Guna Skrol Menegak
+pdfjs-scroll-vertical-button-label = Skrol Menegak
+pdfjs-scroll-horizontal-button =
+    .title = Guna Skrol Mengufuk
+pdfjs-scroll-horizontal-button-label = Skrol Mengufuk
+pdfjs-scroll-wrapped-button =
+    .title = Guna Skrol Berbalut
+pdfjs-scroll-wrapped-button-label = Skrol Berbalut
+pdfjs-spread-none-button =
+    .title = Jangan hubungkan hamparan halaman
+pdfjs-spread-none-button-label = Tanpa Hamparan
+pdfjs-spread-odd-button =
+    .title = Hubungkan hamparan halaman dengan halaman nombor ganjil
+pdfjs-spread-odd-button-label = Hamparan Ganjil
+pdfjs-spread-even-button =
+    .title = Hubungkan hamparan halaman dengan halaman nombor genap
+pdfjs-spread-even-button-label = Hamparan Seimbang
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Sifat Dokumen鈥�
+pdfjs-document-properties-button-label = Sifat Dokumen鈥�
+pdfjs-document-properties-file-name = Nama fail:
+pdfjs-document-properties-file-size = Saiz fail:
+pdfjs-document-properties-title = Tajuk:
+pdfjs-document-properties-author = Pengarang:
+pdfjs-document-properties-subject = Subjek:
+pdfjs-document-properties-keywords = Kata kunci:
+pdfjs-document-properties-creation-date = Masa Dicipta:
+pdfjs-document-properties-modification-date = Tarikh Ubahsuai:
+pdfjs-document-properties-creator = Pencipta:
+pdfjs-document-properties-producer = Pengeluar PDF:
+pdfjs-document-properties-version = Versi PDF:
+pdfjs-document-properties-page-count = Kiraan Laman:
+pdfjs-document-properties-page-size = Saiz Halaman:
+pdfjs-document-properties-page-size-unit-inches = dalam
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = potret
+pdfjs-document-properties-page-size-orientation-landscape = landskap
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Paparan Web Pantas:
+pdfjs-document-properties-linearized-yes = Ya
+pdfjs-document-properties-linearized-no = Tidak
+pdfjs-document-properties-close-button = Tutup
+
+## Print
+
+pdfjs-print-progress-message = Menyediakan dokumen untuk dicetak鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Batal
+pdfjs-printing-not-supported = Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini.
+pdfjs-printing-not-ready = Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Togol Bar Sisi
+pdfjs-toggle-sidebar-button-label = Togol Bar Sisi
+pdfjs-document-outline-button =
+    .title = Papar Rangka Dokumen (klik-dua-kali untuk kembangkan/kolaps semua item)
+pdfjs-document-outline-button-label = Rangka Dokumen
+pdfjs-attachments-button =
+    .title = Papar Lampiran
+pdfjs-attachments-button-label = Lampiran
+pdfjs-thumbs-button =
+    .title = Papar Thumbnails
+pdfjs-thumbs-button-label = Imej kecil
+pdfjs-findbar-button =
+    .title = Cari didalam Dokumen
+pdfjs-findbar-button-label = Cari
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Halaman { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Halaman Imej kecil { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Cari
+    .placeholder = Cari dalam dokumen鈥�
+pdfjs-find-previous-button =
+    .title = Cari teks frasa berkenaan yang terdahulu
+pdfjs-find-previous-button-label = Dahulu
+pdfjs-find-next-button =
+    .title = Cari teks frasa berkenaan yang berikut
+pdfjs-find-next-button-label = Berikut
+pdfjs-find-highlight-checkbox = Serlahkan semua
+pdfjs-find-match-case-checkbox-label = Huruf sepadan
+pdfjs-find-entire-word-checkbox-label = Seluruh perkataan
+pdfjs-find-reached-top = Mencapai teratas daripada dokumen, sambungan daripada bawah
+pdfjs-find-reached-bottom = Mencapai terakhir daripada dokumen, sambungan daripada atas
+pdfjs-find-not-found = Frasa tidak ditemui
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Lebar Halaman
+pdfjs-page-scale-fit = Muat Halaman
+pdfjs-page-scale-auto = Zoom Automatik
+pdfjs-page-scale-actual = Saiz Sebenar
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Masalah berlaku semasa menuatkan sebuah PDF.
+pdfjs-invalid-file-error = Tidak sah atau fail PDF rosak.
+pdfjs-missing-file-error = Fail PDF Hilang.
+pdfjs-unexpected-response-error = Respon pelayan yang tidak dijangka.
+pdfjs-rendering-error = Ralat berlaku ketika memberikan halaman.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Anotasi]
+
+## Password
+
+pdfjs-password-label = Masukan kata kunci untuk membuka fail PDF ini.
+pdfjs-password-invalid = Kata laluan salah. Cuba lagi.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Batal
+pdfjs-web-fonts-disabled = Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF.
diff --git a/public/pdfjs/web/locale/my/viewer.ftl b/public/pdfjs/web/locale/my/viewer.ftl
new file mode 100644
index 0000000..e6c6c35
--- /dev/null
+++ b/public/pdfjs/web/locale/my/viewer.ftl
@@ -0,0 +1,173 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 醼♂�涐�勧�� 醼呩��欋�会��醼横�斸�踞��
+pdfjs-previous-button-label = 醼♂�涐�勧�横�斸�贬�涐��
+pdfjs-next-button =
+    .title = 醼涐�踞�贬�� 醼呩��欋�会��醼横�斸�踞��
+pdfjs-next-button-label = 醼斸�贬���醼横�愥�佱��
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 醼呩��欋�会��醼横�斸�踞��
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 醽�
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pagesCount } 醽� { $pageNumber })
+pdfjs-zoom-out-button =
+    .title = 醼佱�会��夺�丰�曖��
+pdfjs-zoom-out-button-label = 醼佱�会��夺�丰�曖��
+pdfjs-zoom-in-button =
+    .title = 醼佱�会�册�丰�曖��
+pdfjs-zoom-in-button-label = 醼佱�会�册�丰�曖��
+pdfjs-zoom-select =
+    .title = 醼佱�会��夺��/醼佱�会�册�丰�曖��
+pdfjs-presentation-mode-button =
+    .title = 醼嗎�结�贬�羔�斸�结�贬�羔�愥�勧�横�曖�坚�呩�斸�呩�横�炨���� 醼�醼搬�羔�曖�坚�贬��勧�横�羔�曖��
+pdfjs-presentation-mode-button-label = 醼嗎�结�贬�羔�斸�结�贬�羔�愥�勧�横�曖�坚�呩�斸�呩��
+pdfjs-open-file-button =
+    .title = 醼栣���勧�横�♂��羔�栣�结�勧�丰�横�曖�亱
+pdfjs-open-file-button-label = 醼栣�结�勧�横�丰�曖��
+pdfjs-print-button =
+    .title = 醼曖��夺�斸�踞���曖�横�曖��
+pdfjs-print-button-label = 醼曖��夺�斸�踞���曖�横�曖��
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 醼�醼�涐��氠��欋�会���
+pdfjs-tools-button-label = 醼�醼�涐��氠��欋�会���
+pdfjs-first-page-button =
+    .title = 醼曖�戓�� 醼呩��欋�会��醼横�斸�踞��炨����
+pdfjs-first-page-button-label = 醼曖�戓�� 醼呩��欋�会��醼横�斸�踞��炨����
+pdfjs-last-page-button =
+    .title = 醼斸�贬���醼横�嗎��夺�� 醼呩��欋�会��醼横�斸�踞��炨����
+pdfjs-last-page-button-label = 醼斸�贬���醼横�嗎��夺�� 醼呩��欋�会��醼横�斸�踞��炨����
+pdfjs-page-rotate-cw-button =
+    .title = 醼斸��涐��溼��醼横�愥�� 醼♂�愥���勧�横��
+pdfjs-page-rotate-cw-button-label = 醼斸��涐��溼��醼横�愥�� 醼♂�愥���勧�横��
+pdfjs-page-rotate-ccw-button =
+    .title = 醼斸��涐��溼��醼横�愥�� 醼曖�坚�贬��勧�横�羔�曖�坚�斸��
+pdfjs-page-rotate-ccw-button-label = 醼斸��涐��溼��醼横�愥�� 醼曖�坚�贬��勧�横�羔�曖�坚�斸��
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 醼欋�踞�愥�横�愥�欋�横�羔�欋�踞�愥�横�涐�� 醼傖��忈�横�炨�愥�贯�愥��欋�会���
+pdfjs-document-properties-button-label = 醼欋�踞�愥�横�愥�欋�横�羔�欋�踞�愥�横�涐�� 醼傖��忈�横�炨�愥�贯�愥��欋�会���
+pdfjs-document-properties-file-name = 醼栣���勧�� :
+pdfjs-document-properties-file-size = 醼栣���勧�横�嗎���掅�� :
+pdfjs-document-properties-title = 醼佱�贬��勧�横�羔�呩�夅�衡�� -
+pdfjs-document-properties-author = 醼涐�贬�羔�炨��羔�炨��:
+pdfjs-document-properties-subject = 醼♂��醼坚�贬��勧�横�羔�♂�涐��:
+pdfjs-document-properties-keywords = 醼炨�贬��丰�佱�会��醼� 醼呩��溼��夺��:
+pdfjs-document-properties-creation-date = 醼戓��愥�横�溼��曖�横�涐��醼横�呩�结��:
+pdfjs-document-properties-modification-date = 醼曖�坚�勧�横�嗎�勧�横�涐��醼横�呩�结��:
+pdfjs-document-properties-creator = 醼栣�斸�横�愥��羔�炨��:
+pdfjs-document-properties-producer = PDF 醼戓��愥�横�溼��曖�横�炨��:
+pdfjs-document-properties-version = PDF 醼椺��羔�涐�踞�勧�横��:
+pdfjs-document-properties-page-count = 醼呩��欋�会��醼横�斸�踞��♂�涐�贬�♂�愥�结��醼�:
+
+##
+
+pdfjs-document-properties-close-button = 醼曖��愥��
+
+## Print
+
+pdfjs-print-progress-message = Preparing document for printing鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 醼曖�氠�衡�嬦�栣�会��醼横�曖��
+pdfjs-printing-not-supported = 醼炨�愥��曖�贬�羔�佱�会��醼横亰醼曖�涐�勧�丰�横�戓��愥�横�佱�坚�勧�横�羔��醼��め�樶�氠�贬���醼横�嗎��炨�娽�� 醼曖�坚�娽�丰�横�濁�呩�结��戓�贬���醼横�曖�夺�丰�欋�戓��羔�曖�� 醽�
+pdfjs-printing-not-ready = 醼炨�愥��曖�贬�羔�佱�会��醼�: 醼氠�佱�� PDF 醼栣���勧�横�炨�娽�� 醼曖��夺�斸�踞��曖�横�涐�斸�� 醼欋�曖�坚�娽�丰�横�呩��夺�曖��
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 醼樶�贬�羔�愥�斸�横�羔�栣�结�勧�横�丰�曖��愥��
+pdfjs-toggle-sidebar-button-label = 醼栣�结�勧�横�丰�曖��愥�� 醼嗎�溼����醼横�掅��
+pdfjs-document-outline-button =
+    .title = 醼呩��愥�欋�横�羔�♂��醼会�夅�横�羔�佱�会��曖�横��醼�� 醼曖�坚�曖�� (醼呩��涐�勧�横�羔�♂��羔�溼��夺�羔��醼�� 醼佱�会��夺��/醼佱�会�册�丰�涐�斸�� 醼�醼溼�呩�横�斸�踞�呩�横�佱�会��醼横�斸�踞��曖�横�曖��)
+pdfjs-document-outline-button-label = 醼呩��愥�欋�横�羔�♂��醼会�夅�横�羔�佱�会��曖��
+pdfjs-attachments-button =
+    .title = 醼愥�结�册�佱�会��醼横�欋�会��� 醼曖�坚�曖��
+pdfjs-attachments-button-label = 醼愥�结�册�戓��羔�佱�会��醼横�欋�会���
+pdfjs-thumbs-button =
+    .title = 醼曖��夺�涐��曖�横�勧�氠�横�欋�会��羔��醼�� 醼曖�坚�曖��
+pdfjs-thumbs-button-label = 醼曖��夺�涐��曖�横�勧�氠�横�欋�会���
+pdfjs-findbar-button =
+    .title = Find in Document
+pdfjs-findbar-button-label = 醼涐�踞��栣�结�贬�曖��
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 醼呩��欋�会��醼横�斸�踞�� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 醼呩��欋�会��醼横�斸�踞��涐�册�� 醼曖��夺�涐��曖�横�勧�氠�� { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 醼涐�踞��栣�结�贬�曖��
+    .placeholder = 醼呩��愥�欋�横�羔�戓�册�愥�结�勧�� 醼涐�踞��栣�结�贬�涐�斸�衡��
+pdfjs-find-previous-button =
+    .title = 醼呩��醼�羔�呩��涐�册�� 醼♂�涐�勧�� 鈥嬦�栣�坚�呩�横�曖�结��羔�欋�踞���醼�� 醼涐�踞��栣�结�贬�曖��
+pdfjs-find-previous-button-label = 醼斸�贬���醼横�炨����
+pdfjs-find-next-button =
+    .title = 醼呩��醼�羔�呩��涐�册�� 醼斸�贬���醼横�戓�曖�� 鈥嬦�栣�坚�呩�横�曖�结��羔�欋�踞���醼�� 醼涐�踞��栣�结�贬�曖��
+pdfjs-find-next-button-label = 醼涐�踞�贬�丰�炨����
+pdfjs-find-highlight-checkbox = 醼♂��羔�溼��夺�羔��醼�� 醼欋�会�夅�横�羔�炨��羔�曖��
+pdfjs-find-match-case-checkbox-label = 醼呩��溼��夺�� 醼愥����醼横�嗎���勧�横�曖��
+pdfjs-find-reached-top = 醼呩��欋�会��醼横�斸�踞��戓��曖�� 醼涐�贬���醼横�斸�贬�曖�坚�亰 醼♂�嗎��夺�羔��醼斸�� 醼曖�坚�斸�横�呩�曖��
+pdfjs-find-reached-bottom = 醼呩��欋�会��醼横�斸�踞��♂�嗎��夺�� 醼涐�贬���醼横�斸�贬�曖�坚�亰 醼戓��曖�横��醼斸�� 醼曖�坚�斸�横�呩�曖��
+pdfjs-find-not-found = 醼呩��醼�羔�呩�� 醼欋�愥�结�贬�丰�涐�樶�搬��
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 醼呩��欋�会��醼横�斸�踞�� 醼♂��醼会�氠��
+pdfjs-page-scale-fit = 醼呩��欋�会��醼横�斸�踞�� 醼�醼结��醼横�愥��
+pdfjs-page-scale-auto = 醼♂�溼���♂�溼�会�贬���醼� 醼佱�会��夺�丰�佱�会�册��
+pdfjs-page-scale-actual = 醼♂�欋�踞�斸�横�愥��醼氠�横�涐�踞��愥�册�� 醼♂�涐�结�氠��
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 醼栣���勧�� 醼�醼��嗎�结�册�愥�勧�横�斸�贬�佱�会��斸�横�欋�踞�� 醼♂�欋�踞��羔�愥�呩�横�佱��愥�结�贬�丰�涐�曖��愥�氠�横亱
+pdfjs-invalid-file-error = 醼欋�涐�炨�贬�� 醼炨���� 醼曖�会��醼横�斸�贬�炨�贬�� PDF 醼栣���勧��
+pdfjs-missing-file-error = PDF 醼曖�会�贬���醼横�嗎��夺��
+pdfjs-unexpected-response-error = 醼欋�欋�会�踞�贬��横�溼�勧�横�丰�戓��羔�炨�贬�� 醼嗎��椺��欋�� 醼曖�坚�斸�横��醼坚��羔�佱�会��醼�
+pdfjs-rendering-error = 醼呩��欋�会��醼横�斸�踞���醼�� 醼曖��夺�栣�贬��横�斸�贬�佱�会��斸�横�欋�踞�� 醼♂�欋�踞��羔�愥�呩�横�佱��愥�结�贬�丰�涐�曖��愥�氠�横亱
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 醼♂�撫��曖�贯�曖��氠�横�栣�结�勧�丰�横�嗎���佱�会��醼篯
+
+## Password
+
+pdfjs-password-label = 醼氠�佱�� PDF 醼�醼�� 醼栣�结�勧�丰�横�涐�斸�� 醼呩��醼�羔�濁�踞��醼横��醼�� 醼涐����醼横�曖�亱
+pdfjs-password-invalid = 醼呩��濁�踞��醼� 醼欋�踞��羔�炨�娽�横亱 醼戓�曖�横��醼坚���羔�呩��羔��醼坚�娽�丰�横�曖�亱
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = 醼曖�氠�衡�嬦�栣�会��醼横�曖��
+pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.
diff --git a/public/pdfjs/web/locale/nb-NO/viewer.ftl b/public/pdfjs/web/locale/nb-NO/viewer.ftl
new file mode 100644
index 0000000..f23d98e
--- /dev/null
+++ b/public/pdfjs/web/locale/nb-NO/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Forrige side
+pdfjs-previous-button-label = Forrige
+pdfjs-next-button =
+    .title = Neste side
+pdfjs-next-button-label = Neste
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Side
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = av { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } av { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom ut
+pdfjs-zoom-out-button-label = Zoom ut
+pdfjs-zoom-in-button =
+    .title = Zoom inn
+pdfjs-zoom-in-button-label = Zoom inn
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Bytt til presentasjonsmodus
+pdfjs-presentation-mode-button-label = Presentasjonsmodus
+pdfjs-open-file-button =
+    .title = 脜pne fil
+pdfjs-open-file-button-label = 脜pne
+pdfjs-print-button =
+    .title = Skriv ut
+pdfjs-print-button-label = Skriv ut
+pdfjs-save-button =
+    .title = Lagre
+pdfjs-save-button-label = Lagre
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Last ned
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Last ned
+pdfjs-bookmark-button =
+    .title = Gjeldende side (se URL fra gjeldende side)
+pdfjs-bookmark-button-label = Gjeldende side
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Verkt酶y
+pdfjs-tools-button-label = Verkt酶y
+pdfjs-first-page-button =
+    .title = G氓 til f酶rste side
+pdfjs-first-page-button-label = G氓 til f酶rste side
+pdfjs-last-page-button =
+    .title = G氓 til siste side
+pdfjs-last-page-button-label = G氓 til siste side
+pdfjs-page-rotate-cw-button =
+    .title = Roter med klokken
+pdfjs-page-rotate-cw-button-label = Roter med klokken
+pdfjs-page-rotate-ccw-button =
+    .title = Roter mot klokken
+pdfjs-page-rotate-ccw-button-label = Roter mot klokken
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktiver tekstmarkeringsverkt酶y
+pdfjs-cursor-text-select-tool-button-label = Tekstmarkeringsverkt酶y
+pdfjs-cursor-hand-tool-button =
+    .title = Aktiver handverkt酶y
+pdfjs-cursor-hand-tool-button-label = Handverkt酶y
+pdfjs-scroll-page-button =
+    .title = Bruk siderulling
+pdfjs-scroll-page-button-label = Siderulling
+pdfjs-scroll-vertical-button =
+    .title = Bruk vertikal rulling
+pdfjs-scroll-vertical-button-label = Vertikal rulling
+pdfjs-scroll-horizontal-button =
+    .title = Bruk horisontal rulling
+pdfjs-scroll-horizontal-button-label = Horisontal rulling
+pdfjs-scroll-wrapped-button =
+    .title = Bruk flersiderulling
+pdfjs-scroll-wrapped-button-label = Flersiderulling
+pdfjs-spread-none-button =
+    .title = Vis enkeltsider
+pdfjs-spread-none-button-label = Enkeltsider
+pdfjs-spread-odd-button =
+    .title = Vis oppslag med ulike sidenumre til venstre
+pdfjs-spread-odd-button-label = Oppslag med forside
+pdfjs-spread-even-button =
+    .title = Vis oppslag med like sidenumre til venstre
+pdfjs-spread-even-button-label = Oppslag uten forside
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumentegenskaper 鈥�
+pdfjs-document-properties-button-label = Dokumentegenskaper 鈥�
+pdfjs-document-properties-file-name = Filnavn:
+pdfjs-document-properties-file-size = Filst酶rrelse:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte)
+pdfjs-document-properties-title = Dokumentegenskaper 鈥�
+pdfjs-document-properties-author = Forfatter:
+pdfjs-document-properties-subject = Emne:
+pdfjs-document-properties-keywords = N酶kkelord:
+pdfjs-document-properties-creation-date = Opprettet dato:
+pdfjs-document-properties-modification-date = Endret dato:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Opprettet av:
+pdfjs-document-properties-producer = PDF-verkt酶y:
+pdfjs-document-properties-version = PDF-versjon:
+pdfjs-document-properties-page-count = Sideantall:
+pdfjs-document-properties-page-size = Sidest酶rrelse:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = st氓ende
+pdfjs-document-properties-page-size-orientation-landscape = liggende
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Hurtig nettvisning:
+pdfjs-document-properties-linearized-yes = Ja
+pdfjs-document-properties-linearized-no = Nei
+pdfjs-document-properties-close-button = Lukk
+
+## Print
+
+pdfjs-print-progress-message = Forbereder dokument for utskrift 鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Avbryt
+pdfjs-printing-not-supported = Advarsel: Utskrift er ikke fullstendig st酶ttet av denne nettleseren.
+pdfjs-printing-not-ready = Advarsel: PDF er ikke fullstendig innlastet for utskrift.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Sl氓 av/p氓 sidestolpe
+pdfjs-toggle-sidebar-notification-button =
+    .title = Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg/lag)
+pdfjs-toggle-sidebar-button-label = Sl氓 av/p氓 sidestolpe
+pdfjs-document-outline-button =
+    .title = Vis dokumentdisposisjonen (dobbeltklikk for 氓 utvide/skjule alle elementer)
+pdfjs-document-outline-button-label = Dokumentdisposisjon
+pdfjs-attachments-button =
+    .title = Vis vedlegg
+pdfjs-attachments-button-label = Vedlegg
+pdfjs-layers-button =
+    .title = Vis lag (dobbeltklikk for 氓 tilbakestille alle lag til standardtilstand)
+pdfjs-layers-button-label = Lag
+pdfjs-thumbs-button =
+    .title = Vis miniatyrbilde
+pdfjs-thumbs-button-label = Miniatyrbilde
+pdfjs-current-outline-item-button =
+    .title = Finn gjeldende disposisjonselement
+pdfjs-current-outline-item-button-label = Gjeldende disposisjonselement
+pdfjs-findbar-button =
+    .title = Finn i dokumentet
+pdfjs-findbar-button-label = Finn
+pdfjs-additional-layers = Ytterligere lag
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Side { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatyrbilde av side { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Velg side { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Side { $page } av { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = S酶k
+    .placeholder = S酶k i dokument鈥�
+pdfjs-find-previous-button =
+    .title = Finn forrige forekomst av frasen
+pdfjs-find-previous-button-label = Forrige
+pdfjs-find-next-button =
+    .title = Finn neste forekomst av frasen
+pdfjs-find-next-button-label = Neste
+pdfjs-find-highlight-checkbox = Uthev alle
+pdfjs-find-match-case-checkbox-label = Skill store/sm氓 bokstaver
+pdfjs-find-match-diacritics-checkbox-label = Samsvar diakritiske tegn
+pdfjs-find-entire-word-checkbox-label = Hele ord
+pdfjs-find-reached-top = N氓dde toppen av dokumentet, fortsetter fra bunnen
+pdfjs-find-reached-bottom = N氓dde bunnen av dokumentet, fortsetter fra toppen
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } av { $total } treff
+       *[other] { $current } av { $total } treff
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mer enn { $limit } treff
+       *[other] Mer enn { $limit } treff
+    }
+pdfjs-find-not-found = Fant ikke teksten
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Sidebredde
+pdfjs-page-scale-fit = Tilpass til siden
+pdfjs-page-scale-auto = Automatisk zoom
+pdfjs-page-scale-actual = Virkelig st酶rrelse
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale } %
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Side { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = En feil oppstod ved lasting av PDF.
+pdfjs-invalid-file-error = Ugyldig eller skadet PDF-fil.
+pdfjs-missing-file-error = Manglende PDF-fil.
+pdfjs-unexpected-response-error = Uventet serverrespons.
+pdfjs-rendering-error = En feil oppstod ved opptegning av siden.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } annotasjon]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Skriv inn passordet for 氓 氓pne denne PDF-filen.
+pdfjs-password-invalid = Ugyldig passord. Pr酶v igjen.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Avbryt
+pdfjs-web-fonts-disabled = Web-fonter er avsl氓tt: Kan ikke bruke innbundne PDF-fonter.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Endre tekstfarge
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Tegn
+pdfjs-editor-color-picker-ink-input =
+    .title = Endre tegnefarge
+pdfjs-editor-ink-button-label = Tegn
+pdfjs-editor-stamp-button =
+    .title = Legg til eller rediger bilder
+pdfjs-editor-stamp-button-label = Legg til eller rediger bilder
+pdfjs-editor-highlight-button =
+    .title = Markere
+pdfjs-editor-highlight-button-label = Markere
+pdfjs-highlight-floating-button1 =
+    .title = Markere
+    .aria-label = Markere
+pdfjs-highlight-floating-button-label = Markere
+pdfjs-comment-floating-button =
+    .title = Kommenter
+    .aria-label = Kommenter
+pdfjs-comment-floating-button-label = Kommenter
+pdfjs-editor-comment-button =
+    .title = Kommentar
+    .aria-label = Kommentar
+pdfjs-editor-comment-button-label = Kommentar
+pdfjs-editor-signature-button =
+    .title = Legg til signatur
+pdfjs-editor-signature-button-label = Legg til signatur
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Redigering av markering
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Redigering av tegninger
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Signatur-redigerer: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Bilderedigerer
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Fjern tegningen
+pdfjs-editor-remove-freetext-button =
+    .title = Fjern tekst
+pdfjs-editor-remove-stamp-button =
+    .title = Fjern bildet
+pdfjs-editor-remove-highlight-button =
+    .title = Fjern utheving
+pdfjs-editor-remove-signature-button =
+    .title = Fjern signatur
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Farge
+pdfjs-editor-free-text-size-input = St酶rrelse
+pdfjs-editor-ink-color-input = Farge
+pdfjs-editor-ink-thickness-input = Tykkelse
+pdfjs-editor-ink-opacity-input = Opasitet
+pdfjs-editor-stamp-add-image-button =
+    .title = Legg til bilde
+pdfjs-editor-stamp-add-image-button-label = Legg til bilde
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Tykkelse
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Endre tykkelse n氓r du markerer andre elementer enn tekst
+pdfjs-editor-add-signature-container =
+    .aria-label = Signaturkontroller og lagrede signaturer
+pdfjs-editor-signature-add-signature-button =
+    .title = Legg til ny signatur
+pdfjs-editor-signature-add-signature-button-label = Legg til ny signatur
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Lagret signatur: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Tekstredigering
+    .default-content = Begynn 氓 skrive鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Kommentar
+       *[other] Kommentarer
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Lukk sidestolpen
+    .aria-label = Lukk sidestolpen
+pdfjs-editor-comments-sidebar-close-button-label = Lukk sidestolpen
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Ser du noe verdt 氓 merke seg? Marker det og legg igjen en kommentar.
+pdfjs-editor-comments-sidebar-no-comments-link = Les mer
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternativ tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Rediger alternativ tekst
+pdfjs-editor-alt-text-dialog-label = Velg et alternativ
+pdfjs-editor-alt-text-dialog-description = Alt-tekst (alternativ tekst) hjelper n氓r folk ikke kan se bildet eller n氓r det ikke lastes inn.
+pdfjs-editor-alt-text-add-description-label = Legg til en beskrivelse
+pdfjs-editor-alt-text-add-description-description = G氓 etter 1-2 setninger som beskriver emnet, settingen eller handlingene.
+pdfjs-editor-alt-text-mark-decorative-label = Merk som dekorativt
+pdfjs-editor-alt-text-mark-decorative-description = Dette brukes til dekorative bilder, som kantlinjer eller vannmerker.
+pdfjs-editor-alt-text-cancel-button = Avbryt
+pdfjs-editor-alt-text-save-button = Lagre
+pdfjs-editor-alt-text-decorative-tooltip = Merket som dekorativ
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = For eksempel, 芦En ung mann setter seg ved et bord for 氓 spise et m氓ltid禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternativ tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 脴verste venstre hj酶rne 鈥� endre st酶rrelse
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 脴verst i midten 鈥� endre st酶rrelse
+pdfjs-editor-resizer-top-right =
+    .aria-label = 脴verste h酶yre hj酶rne 鈥� endre st酶rrelse
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Midt til h酶yre 鈥� endre st酶rrelse
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Nederste h酶yre hj酶rne 鈥� endre st酶rrelse
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Nederst i midten 鈥� endre st酶rrelse
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Nederste venstre hj酶rne 鈥� endre st酶rrelse
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Midt til venstre 鈥� endre st酶rrelse
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Uthevingsfarge
+pdfjs-editor-colorpicker-button =
+    .title = Endre farge
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Fargevalg
+pdfjs-editor-colorpicker-yellow =
+    .title = Gul
+pdfjs-editor-colorpicker-green =
+    .title = Gr酶nn
+pdfjs-editor-colorpicker-blue =
+    .title = Bl氓
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = R酶d
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Vis alle
+pdfjs-editor-highlight-show-all-button =
+    .title = Vis alle
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (bildebeskrivelse)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Legg til alternativ tekst (bildebeskrivelse)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Skriv din beskrivelse her鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kort beskrivelse for folk som ikke kan se bildet eller n氓r bildet ikke lastes inn.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative teksten ble opprettet automatisk og kan v忙re un酶yaktig.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Les mer
+pdfjs-editor-new-alt-text-create-automatically-button-label = Lag alternativ tekst automatisk
+pdfjs-editor-new-alt-text-not-now-button = Ikke n氓
+pdfjs-editor-new-alt-text-error-title = Kunne ikke opprette alternativ tekst automatisk
+pdfjs-editor-new-alt-text-error-description = Skriv din egen alternativ tekst eller pr酶v igjen senere.
+pdfjs-editor-new-alt-text-error-close-button = Lukk
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Laster ned alternativ tekst AI-modell ({ $downloadedSize } av { $totalSize } MB)
+    .aria-valuetext = Laster ned alternativ tekst AI-modell ({ $downloadedSize } av { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativ tekst lagt til
+pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst lagt til
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Mangler alternativ tekst
+pdfjs-editor-new-alt-text-missing-button-label = Mangler alternativ tekst
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Gjennomg氓 alt-tekst
+pdfjs-editor-new-alt-text-to-review-button-label = Gjennomg氓 alternativ tekst
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Opprettet automatisk: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Innstillinger for alternativ tekst for bilde
+pdfjs-image-alt-text-settings-button-label = Innstillinger for alternativ tekst for bilde
+pdfjs-editor-alt-text-settings-dialog-label = Innstillinger for alternativ tekst for bilde
+pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Opprett alternativ tekst automatisk
+pdfjs-editor-alt-text-settings-create-model-description = Foresl氓r beskrivelser for 氓 hjelpe folk som ikke kan se bildet eller n氓r bildet ikke lastes inn.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Alternativ tekst AI-modell ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Kj酶rer lokalt p氓 enheten din slik at dataene dine forblir private. N酶dvendig for automatisk alternativ tekst.
+pdfjs-editor-alt-text-settings-delete-model-button = Slett
+pdfjs-editor-alt-text-settings-download-model-button = Last ned
+pdfjs-editor-alt-text-settings-downloading-model-button = Laster ned鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alternativ tekst-redigerer
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis alternativ tekst-redigerer direkte n氓r du legger til et bilde
+pdfjs-editor-alt-text-settings-show-dialog-description = Hjelper deg 氓 s酶rge for at alle bildene dine har alternativ tekst.
+pdfjs-editor-alt-text-settings-close-button = Lukk
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Utheving lagt til
+pdfjs-editor-freetext-added-alert = Tekst lagt til
+pdfjs-editor-ink-added-alert = Tegning lagt til
+pdfjs-editor-stamp-added-alert = Bilde lagt til
+pdfjs-editor-signature-added-alert = Signatur lagt til
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Markering fjernet
+pdfjs-editor-undo-bar-message-freetext = Tekst fjernet
+pdfjs-editor-undo-bar-message-ink = Tegning fjernet
+pdfjs-editor-undo-bar-message-stamp = Bilde fjernet
+pdfjs-editor-undo-bar-message-signature = Signatur fjernet
+pdfjs-editor-undo-bar-message-comment = Kommentar fjernet
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } kommentar fjernet
+       *[other] { $count } kommentarer fjernet
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Angre
+pdfjs-editor-undo-bar-undo-button-label = Angre
+pdfjs-editor-undo-bar-close-button =
+    .title = Lukk
+pdfjs-editor-undo-bar-close-button-label = Lukk
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Denne modalen lar brukeren lage en signatur for 氓 legge til et PDF-dokument. Brukeren kan redigere navnet (som ogs氓 fungerer som alt-teksten), og eventuelt lagre signaturen for gjentatt bruk.
+pdfjs-editor-add-signature-dialog-title = Legg til en signatur
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Type
+    .title = Type
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Tegn
+    .title = Tegn
+pdfjs-editor-add-signature-image-button = Bilde
+    .title = Bilde
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Skriv inn signaturen din
+    .placeholder = Skriv inn signaturen din
+pdfjs-editor-add-signature-draw-placeholder = Tegn signaturen din
+pdfjs-editor-add-signature-draw-thickness-range-label = Tykkelse
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Linjetykkelse: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Dra en fil her for 氓 laste opp
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Eller velg bildefiler
+       *[other] Eller velg bildefiler
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Beskrivelse (alternativ tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Beskrivelse (alternativ tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Signatur
+pdfjs-editor-add-signature-clear-button-label = Fjern signatur
+pdfjs-editor-add-signature-clear-button =
+    .title = Fjern signatur
+pdfjs-editor-add-signature-save-checkbox = Lagre signatur
+pdfjs-editor-add-signature-save-warning-message = Du har n氓dd grensen p氓 5 lagrede signaturer. Fjern en for 氓 lagre en ny.
+pdfjs-editor-add-signature-image-upload-error-title = Kunne ikke laste opp bildet
+pdfjs-editor-add-signature-image-upload-error-description = Sjekk nettverkstilkoblingen eller pr酶v et annet bilde.
+pdfjs-editor-add-signature-image-no-data-error-title = Kan ikke konvertere dette bildet til en signatur
+pdfjs-editor-add-signature-image-no-data-error-description = Pr酶v 氓 laste opp et annet bilde.
+pdfjs-editor-add-signature-error-close-button = Lukk
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Avbryt
+pdfjs-editor-add-signature-add-button = Legg til
+pdfjs-editor-edit-signature-update-button = Oppdater
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar
+pdfjs-editor-edit-comment-popup-button =
+    .title = Rediger kommentar
+pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar
+pdfjs-editor-delete-comment-popup-button =
+    .title = Fjern kommentar
+pdfjs-show-comment-button =
+    .title = Vis kommentar
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Oppdater
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Legg til kommentar
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Legg til
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Begynn 氓 skrive鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Legg til kommentar
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Vis/skjul sidestolpe (dokumentet inneholder miniatyrbilder/disposisjon/vedlegg/lag)
+pdfjs-toggle-views-manager-button1-label = Behandle sider
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidestolpe
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Endre st酶rrelse p氓 sidestolpen
+pdfjs-views-manager-view-selector-button =
+    .title = Visninger
+pdfjs-views-manager-view-selector-button-label = Visninger
+pdfjs-views-manager-pages-title = Sider
+pdfjs-views-manager-outlines-title1 = Dokumentoversikt
+    .title = Dokumentoversikt (dobbeltklikk for 氓 utvide/skjule alle elementer)
+pdfjs-views-manager-attachments-title = Vedlegg
+pdfjs-views-manager-layers-title1 = Lag
+    .title = Lag (dobbeltklikk for 氓 tilbakestille alle lag til standardtilstand)
+pdfjs-views-manager-pages-option-label = Sider
+pdfjs-views-manager-outlines-option-label = Dokumentdisposisjon
+pdfjs-views-manager-attachments-option-label = Vedlegg
+pdfjs-views-manager-layers-option-label = Lag
+pdfjs-views-manager-add-file-button =
+    .title = Legg til fil
+pdfjs-views-manager-add-file-button-label = Legg til fil
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } valgt
+       *[other] { $count } valgt
+    }
+pdfjs-views-manager-pages-status-none-action-label = Velg sider
+pdfjs-views-manager-pages-status-action-button-label = Behandle
+pdfjs-views-manager-pages-status-copy-button-label = Kopier
+pdfjs-views-manager-pages-status-cut-button-label = Klipp ut
+pdfjs-views-manager-pages-status-delete-button-label = Slett
+pdfjs-views-manager-pages-status-export-selected-button-label = Eksporter valgte鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 side klippet ut
+       *[other] { $count } sider klippet ut
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 side kopiert
+       *[other] { $count } sider kopiert
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 side slettet
+       *[other] { $count } sider slettet
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Klargj酶r filen din 鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Laster opp filen 鈥�
+pdfjs-views-manager-status-warning-cut-label = Kunne ikke klippe ut. Oppdater siden og pr酶v p氓 nytt.
+pdfjs-views-manager-status-warning-copy-label = Kunne ikke kopiere. Oppdater siden og pr酶v p氓 nytt.
+pdfjs-views-manager-status-warning-delete-label = Kunne ikke slette. Oppdater siden og pr酶v p氓 nytt.
+pdfjs-views-manager-status-warning-save-label = Kunne ikke lagre. Oppdater siden og pr酶v p氓 nytt.
+pdfjs-views-manager-status-undo-button-label = Angre
+pdfjs-views-manager-status-done-button-label = Ferdig
+pdfjs-views-manager-status-close-button =
+    .title = Lukk
+pdfjs-views-manager-status-close-button-label = Lukk
+pdfjs-views-manager-paste-button-label = Lim inn
+pdfjs-views-manager-paste-button-before =
+    .title = Lim inn f酶r f酶rste side
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Lim inn etter side { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NY
+pdfjs-views-manager-waiting-for-file = Laster opp filen 鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Behandle sider
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Fjern lagret signatur
+pdfjs-editor-delete-signature-button-label1 = Fjern lagret signatur
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Rediger beskrivelse
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Rediger beskrivelse
diff --git a/public/pdfjs/web/locale/ne-NP/viewer.ftl b/public/pdfjs/web/locale/ne-NP/viewer.ftl
new file mode 100644
index 0000000..38dac7a
--- /dev/null
+++ b/public/pdfjs/web/locale/ne-NP/viewer.ftl
@@ -0,0 +1,201 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 啶呧啶苦げ啷嵿げ啷� 啶啶粪啶�
+pdfjs-previous-button-label = 啶呧啶苦げ啷嵿げ啷�
+pdfjs-next-button =
+    .title = 啶啶苦げ啷嵿げ啷� 啶啶粪啶�
+pdfjs-next-button-label = 啶啶苦げ啷嵿げ啷�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 啶啶粪啶�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 啶ぇ啷嵿く啷�
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pagesCount } 啶曕 { $pageNumber })
+pdfjs-zoom-out-button =
+    .title = 啶溹啶� 啶樴啶距啶ㄠ啶灌啶膏
+pdfjs-zoom-out-button-label = 啶溹啶� 啶樴啶距啶ㄠ啶灌啶膏
+pdfjs-zoom-in-button =
+    .title = 啶溹啶� 啶あ啶距啶ㄠ啶灌啶膏
+pdfjs-zoom-in-button-label = 啶溹啶� 啶あ啶距啶ㄠ啶灌啶膏
+pdfjs-zoom-select =
+    .title = 啶溹啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-presentation-mode-button =
+    .title = 啶啶班じ啷嵿い啷佮い啶� 啶啶∴ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+pdfjs-presentation-mode-button-label = 啶啶班じ啷嵿い啷佮い啶� 啶啶�
+pdfjs-open-file-button =
+    .title = 啶ぞ啶囙げ 啶栢啶侧啶ㄠ啶灌啶膏
+pdfjs-open-file-button-label = 啶栢啶侧啶ㄠ啶灌啶膏
+pdfjs-print-button =
+    .title = 啶啶︵啶班ぃ 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-print-button-label = 啶啶︵啶班ぃ 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 啶斷啶距ぐ啶灌ぐ啷�
+pdfjs-tools-button-label = 啶斷啶距ぐ啶灌ぐ啷�
+pdfjs-first-page-button =
+    .title = 啶す啶苦げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+pdfjs-first-page-button-label = 啶す啶苦げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+pdfjs-last-page-button =
+    .title = 啶啶苦げ啷嵿げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+pdfjs-last-page-button-label = 啶啶苦げ啷嵿げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+pdfjs-page-rotate-cw-button =
+    .title = 啶樴ぁ啷�啶曕 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+pdfjs-page-rotate-cw-button-label = 啶樴ぁ啷�啶曕 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+pdfjs-page-rotate-ccw-button =
+    .title = 啶樴ぁ啷�啶曕 啶掂た啶ぐ啶苦い 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+pdfjs-page-rotate-ccw-button-label = 啶樴ぁ啷�啶曕 啶掂た啶ぐ啶苦い 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+pdfjs-cursor-text-select-tool-button =
+    .title = 啶ぞ啶� 啶氞く啶� 啶夃お啶曕ぐ啶� 啶膏啷嵿し啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-cursor-text-select-tool-button-label = 啶ぞ啶� 啶氞く啶� 啶夃お啶曕ぐ啶�
+pdfjs-cursor-hand-tool-button =
+    .title = 啶灌ぞ啶む 啶夃お啶曕ぐ啶� 啶膏啷嵿し啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-cursor-hand-tool-button-label = 啶灌ぞ啶む 啶夃お啶曕ぐ啶�
+pdfjs-scroll-vertical-button =
+    .title = 啶犩ぞ啶∴ 啶膏啶曕啶班啶侧た啶權啶� 啶啶班く啷嬥 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-scroll-vertical-button-label = 啶犩ぞ啶∴ 啶膏啶曕啶班啶班啶侧た啶權啶�
+pdfjs-scroll-horizontal-button =
+    .title = 啶む啶班啶膏 啶膏啶曕啶班啶侧た啶權啶� 啶啶班く啷嬥 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-scroll-horizontal-button-label = 啶む啶班啶膏 啶膏啶曕啶班啶侧た啶權啶�
+pdfjs-scroll-wrapped-button =
+    .title = 啶侧た啶た 啶膏啶曕啶班啶侧た啶權啶� 啶啶班く啷嬥 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-scroll-wrapped-button-label = 啶侧た啶た 啶膏啶曕啶班啶侧た啶權啶�
+pdfjs-spread-none-button =
+    .title = 啶啶粪啶� 啶膏啶啶班啶∴ぎ啶� 啶膏ぞ啶啶� 啶灌啶ㄠ啶灌啶ㄠ啶�
+pdfjs-spread-none-button-label = 啶膏啶啶班啶� 啶涏啶�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 啶曕ぞ啶椸啶距い 啶掂た啶多啶粪い啶距す啶班...
+pdfjs-document-properties-button-label = 啶曕ぞ啶椸啶距い 啶掂た啶多啶粪い啶距す啶班...
+pdfjs-document-properties-file-name = 啶ぞ啶囙げ 啶ㄠぞ啶�:
+pdfjs-document-properties-file-size = 啶ぞ啶囙げ 啶嗋啶距ぐ:
+pdfjs-document-properties-title = 啶多啶班啶粪:
+pdfjs-document-properties-author = 啶侧啶栢:
+pdfjs-document-properties-subject = 啶掂た啶粪く啶�
+pdfjs-document-properties-keywords = 啶多が啷嵿う啶曕啶炧啶溹啶�
+pdfjs-document-properties-creation-date = 啶膏た啶班啶溹え啶� 啶椸ぐ啶苦啶曕 啶た啶むた:
+pdfjs-document-properties-modification-date = 啶ぐ啶苦ぎ啶距ぐ啷嵿啶苦い 啶た啶むた:
+pdfjs-document-properties-creator = 啶膏ぐ啷嵿啶�:
+pdfjs-document-properties-producer = PDF 啶ㄠた啶班啶ぞ啶むぞ:
+pdfjs-document-properties-version = PDF 啶膏啶膏啶曕ぐ啶�
+pdfjs-document-properties-page-count = 啶啶粪啶� 啶椸ぃ啶ㄠぞ:
+pdfjs-document-properties-page-size = 啶啶粪啶� 啶嗋啶距ぐ:
+pdfjs-document-properties-page-size-unit-inches = 啶囙え啷嵿
+pdfjs-document-properties-page-size-unit-millimeters = 啶た.啶た.
+pdfjs-document-properties-page-size-orientation-portrait = 啶啶熰啶班啶�
+pdfjs-document-properties-page-size-orientation-landscape = 啶ぐ啶苦う啷冟ざ啷嵿く
+pdfjs-document-properties-page-size-name-letter = 啶呧啷嵿し啶�
+pdfjs-document-properties-page-size-name-legal = 啶曕ぞ啶ㄠ啶ㄠ
+
+##
+
+pdfjs-document-properties-linearized-yes = 啶灌
+pdfjs-document-properties-linearized-no = 啶灌啶囙え
+pdfjs-document-properties-close-button = 啶え啷嵿う 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+
+## Print
+
+pdfjs-print-progress-message = 啶啶︵啶班ぃ啶曕ぞ 啶侧ぞ啶椸た 啶曕ぞ啶椸啶距い 啶むく啶距ぐ啷� 啶椸ぐ啶苦う啷堚��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 啶班う啷嵿う 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-printing-not-supported = 啶氞啶むぞ啶掂え啷�: 啶 啶啶班ぞ啶夃啶班ぎ啶� 啶啶︵啶班ぃ 啶啶班啶`い啶ぞ 啶膏ぎ啶班啶ムた啶� 啶涏啶ㄠイ
+pdfjs-printing-not-ready = 啶氞啶むぞ啶掂え啷�: PDF 啶啶︵啶班ぃ啶曕ぞ 啶侧ぞ啶椸た 啶啶班啶`い啶ぞ 啶侧啶� 啶啶曕 啶涏啶ㄠイ
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 啶熰啶� 啶膏ぞ啶囙ぁ啶ぞ啶�
+pdfjs-toggle-sidebar-button-label = 啶熰啶� 啶膏ぞ啶囙ぁ啶ぞ啶�
+pdfjs-document-outline-button =
+    .title = 啶曕ぞ啶椸啶距い啶曕 啶班啶ぐ啷囙啶� 啶︵啶栢ぞ啶夃え啷佮す啷嬥じ啷� (啶膏が啷� 啶掂じ啷嵿い啷佮す啶班 啶掂た啶膏啶むぞ啶�/啶い啶� 啶椸ぐ啷嵿え 啶∴が啶�-啶曕啶侧た啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�)
+pdfjs-document-outline-button-label = 啶︵じ啷嵿い啶距さ啷囙啶曕 啶班啶ぐ啷囙啶�
+pdfjs-attachments-button =
+    .title = 啶膏啶侧啷嵿え啶灌ぐ啷� 啶︵啶栢ぞ啶夃え啷佮す啷嬥じ啷�
+pdfjs-attachments-button-label = 啶膏啶侧啷嵿え啶曕す啶班
+pdfjs-thumbs-button =
+    .title = 啶ムぎ啷嵿が啶ㄠ啶侧す啶班 啶︵啶栢ぞ啶夃え啷佮す啷嬥じ啷�
+pdfjs-thumbs-button-label = 啶ムぎ啷嵿が啶ㄠ啶侧す啶班
+pdfjs-findbar-button =
+    .title = 啶曕ぞ啶椸啶距い啶ぞ 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+pdfjs-findbar-button-label = 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 啶啶粪啶� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 啶啶粪啶犩啷� 啶ムぎ啷嵿が啶ㄠ啶�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+    .placeholder = 啶曕ぞ啶椸啶距い啶ぞ 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏鈥�
+pdfjs-find-previous-button =
+    .title = 啶じ 啶掂ぞ啶曕啶ぞ啶傕ざ啶曕 啶呧啶苦げ啷嵿げ啷� 啶樴啶ㄠぞ 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+pdfjs-find-previous-button-label = 啶呧啶苦げ啷嵿げ啷�
+pdfjs-find-next-button =
+    .title = 啶じ 啶掂ぞ啶曕啶ぞ啶傕ざ啶曕 啶啶苦げ啷嵿げ啷� 啶樴啶ㄠぞ 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+pdfjs-find-next-button-label = 啶呧ぐ啷嵿啷�
+pdfjs-find-highlight-checkbox = 啶膏が啷� 啶灌ぞ啶囙げ啶距啶� 啶椸ぐ啷嵿え啷�
+pdfjs-find-match-case-checkbox-label = 啶曕啶� 啶溹啶∴ぞ 啶た啶侧ぞ啶夃え啷佮す啷嬥じ啷�
+pdfjs-find-entire-word-checkbox-label = 啶啶班ぞ 啶多が啷嵿う啶灌ぐ啷�
+pdfjs-find-reached-top = 啶啶粪啶犩啷� 啶多た啶班啶粪ぎ啶� 啶啶椸啶, 啶むげ啶ぞ啶� 啶溹ぞ啶班 啶椸ぐ啶苦啶曕 啶ムた啶
+pdfjs-find-reached-bottom = 啶啶粪啶犩啷� 啶呧え啷嵿い啷嵿く啶ぞ 啶啶椸啶, 啶多た啶班啶粪が啶距 啶溹ぞ啶班 啶椸ぐ啶苦啶曕 啶ムた啶
+pdfjs-find-not-found = 啶掂ぞ啶曕啶ぞ啶傕ざ 啶啶侧ぞ 啶ぐ啷囙え
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 啶啶粪啶� 啶氞啶∴ぞ啶�
+pdfjs-page-scale-fit = 啶啶粪啶� 啶犩た啶曕啶� 啶た啶侧啶ㄠ
+pdfjs-page-scale-auto = 啶膏啶掂啶距げ啶苦い 啶溹啶�
+pdfjs-page-scale-actual = 啶掂ぞ啶膏啶むさ啶苦 啶嗋啶距ぐ
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = 啶 PDF 啶侧啶� 啶椸ぐ啷嵿う啶� 啶忇啶熰ぞ 啶む啶班啶熰た 啶︵啶栢ぞ啶ぐ啷嶁�嵿く啷嬥イ
+pdfjs-invalid-file-error = 啶呧さ啷堗ぇ 啶掂ぞ 啶︵啶粪た啶� PDF 啶ぞ啶囙げ啷�
+pdfjs-missing-file-error = 啶灌ぐ啶距啶班す啷囙啷� PDF 啶ぞ啶囙げ啷�
+pdfjs-unexpected-response-error = 啶呧お啷嵿ぐ啶む啶ぞ啶多た啶� 啶膏ぐ啷嵿き啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶距イ
+pdfjs-rendering-error = 啶啶粪啶� 啶啶班い啶苦お啶距う啶� 啶椸ぐ啷嵿う啶� 啶忇啶熰ぞ 啶む啶班啶熰た 啶︵啶栢ぞ啶ぐ啷嶁�嵿く啷嬥イ
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = 啶じ PDF 啶ぞ啶囙げ啶侧ぞ啶� 啶栢啶侧啶� 啶椸啶啶ざ啶啶� 啶啶班さ啶苦し啷嵿 啶椸ぐ啷嵿え啷佮す啷嬥じ啷嵿イ
+pdfjs-password-invalid = 啶呧さ啷堗ぇ 啶椸啶啶ざ啶啶︵イ 啶啶ㄠ 啶啶班く啶距じ 啶椸ぐ啷嵿え啷佮す啷嬥じ啷嵿イ
+pdfjs-password-ok-button = 啶犩た啶� 啶�
+pdfjs-password-cancel-button = 啶班う啷嵿う 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+pdfjs-web-fonts-disabled = 啶掂啶� 啶え啷嵿 啶呧じ啶曕啶粪ぎ 啶涏え啷�: 啶忇ぎ啷嵿が啷囙ぁ啷囙ぁ PDF 啶え啷嵿 啶啶班く啷嬥 啶椸ぐ啷嵿え 啶呧じ啶ぐ啷嵿ぅ啷�
diff --git a/public/pdfjs/web/locale/nl/viewer.ftl b/public/pdfjs/web/locale/nl/viewer.ftl
new file mode 100644
index 0000000..d2bf87d
--- /dev/null
+++ b/public/pdfjs/web/locale/nl/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Vorige pagina
+pdfjs-previous-button-label = Vorige
+pdfjs-next-button =
+    .title = Volgende pagina
+pdfjs-next-button-label = Volgende
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pagina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = van { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } van { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Uitzoomen
+pdfjs-zoom-out-button-label = Uitzoomen
+pdfjs-zoom-in-button =
+    .title = Inzoomen
+pdfjs-zoom-in-button-label = Inzoomen
+pdfjs-zoom-select =
+    .title = Zoomen
+pdfjs-presentation-mode-button =
+    .title = Wisselen naar presentatiemodus
+pdfjs-presentation-mode-button-label = Presentatiemodus
+pdfjs-open-file-button =
+    .title = Bestand openen
+pdfjs-open-file-button-label = Openen
+pdfjs-print-button =
+    .title = Afdrukken
+pdfjs-print-button-label = Afdrukken
+pdfjs-save-button =
+    .title = Opslaan
+pdfjs-save-button-label = Opslaan
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Downloaden
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Downloaden
+pdfjs-bookmark-button =
+    .title = Huidige pagina (URL van huidige pagina bekijken)
+pdfjs-bookmark-button-label = Huidige pagina
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Hulpmiddelen
+pdfjs-tools-button-label = Hulpmiddelen
+pdfjs-first-page-button =
+    .title = Naar eerste pagina gaan
+pdfjs-first-page-button-label = Naar eerste pagina gaan
+pdfjs-last-page-button =
+    .title = Naar laatste pagina gaan
+pdfjs-last-page-button-label = Naar laatste pagina gaan
+pdfjs-page-rotate-cw-button =
+    .title = Rechtsom draaien
+pdfjs-page-rotate-cw-button-label = Rechtsom draaien
+pdfjs-page-rotate-ccw-button =
+    .title = Linksom draaien
+pdfjs-page-rotate-ccw-button-label = Linksom draaien
+pdfjs-cursor-text-select-tool-button =
+    .title = Tekstselectiehulpmiddel inschakelen
+pdfjs-cursor-text-select-tool-button-label = Tekstselectiehulpmiddel
+pdfjs-cursor-hand-tool-button =
+    .title = Handhulpmiddel inschakelen
+pdfjs-cursor-hand-tool-button-label = Handhulpmiddel
+pdfjs-scroll-page-button =
+    .title = Paginascrollen gebruiken
+pdfjs-scroll-page-button-label = Paginascrollen
+pdfjs-scroll-vertical-button =
+    .title = Verticaal scrollen gebruiken
+pdfjs-scroll-vertical-button-label = Verticaal scrollen
+pdfjs-scroll-horizontal-button =
+    .title = Horizontaal scrollen gebruiken
+pdfjs-scroll-horizontal-button-label = Horizontaal scrollen
+pdfjs-scroll-wrapped-button =
+    .title = Scrollen met terugloop gebruiken
+pdfjs-scroll-wrapped-button-label = Scrollen met terugloop
+pdfjs-spread-none-button =
+    .title = Dubbele pagina鈥檚 niet samenvoegen
+pdfjs-spread-none-button-label = Geen dubbele pagina鈥檚
+pdfjs-spread-odd-button =
+    .title = Dubbele pagina鈥檚 samenvoegen vanaf oneven pagina鈥檚
+pdfjs-spread-odd-button-label = Oneven dubbele pagina鈥檚
+pdfjs-spread-even-button =
+    .title = Dubbele pagina鈥檚 samenvoegen vanaf even pagina鈥檚
+pdfjs-spread-even-button-label = Even dubbele pagina鈥檚
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Documenteigenschappen鈥�
+pdfjs-document-properties-button-label = Documenteigenschappen鈥�
+pdfjs-document-properties-file-name = Bestandsnaam:
+pdfjs-document-properties-file-size = Bestandsgrootte:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Titel:
+pdfjs-document-properties-author = Auteur:
+pdfjs-document-properties-subject = Onderwerp:
+pdfjs-document-properties-keywords = Sleutelwoorden:
+pdfjs-document-properties-creation-date = Aanmaakdatum:
+pdfjs-document-properties-modification-date = Wijzigingsdatum:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Maker:
+pdfjs-document-properties-producer = PDF-producent:
+pdfjs-document-properties-version = PDF-versie:
+pdfjs-document-properties-page-count = Aantal pagina鈥檚:
+pdfjs-document-properties-page-size = Paginagrootte:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = staand
+pdfjs-document-properties-page-size-orientation-landscape = liggend
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Snelle webweergave:
+pdfjs-document-properties-linearized-yes = Ja
+pdfjs-document-properties-linearized-no = Nee
+pdfjs-document-properties-close-button = Sluiten
+
+## Print
+
+pdfjs-print-progress-message = Document voorbereiden voor afdrukken鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Annuleren
+pdfjs-printing-not-supported = Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser.
+pdfjs-printing-not-ready = Waarschuwing: de PDF is niet volledig geladen voor afdrukken.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Zijbalk in-/uitschakelen
+pdfjs-toggle-sidebar-notification-button =
+    .title = Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen/lagen)
+pdfjs-toggle-sidebar-button-label = Zijbalk in-/uitschakelen
+pdfjs-document-outline-button =
+    .title = Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen)
+pdfjs-document-outline-button-label = Documentoverzicht
+pdfjs-attachments-button =
+    .title = Bijlagen tonen
+pdfjs-attachments-button-label = Bijlagen
+pdfjs-layers-button =
+    .title = Lagen tonen (dubbelklik om alle lagen naar de standaardstatus terug te zetten)
+pdfjs-layers-button-label = Lagen
+pdfjs-thumbs-button =
+    .title = Miniaturen tonen
+pdfjs-thumbs-button-label = Miniaturen
+pdfjs-current-outline-item-button =
+    .title = Huidig item in inhoudsopgave zoeken
+pdfjs-current-outline-item-button-label = Huidig item in inhoudsopgave
+pdfjs-findbar-button =
+    .title = Zoeken in document
+pdfjs-findbar-button-label = Zoeken
+pdfjs-additional-layers = Aanvullende lagen
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatuur van pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Pagina { $page } selecteren
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Pagina { $page } van { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Zoeken
+    .placeholder = Zoeken in document鈥�
+pdfjs-find-previous-button =
+    .title = De vorige overeenkomst van de tekst zoeken
+pdfjs-find-previous-button-label = Vorige
+pdfjs-find-next-button =
+    .title = De volgende overeenkomst van de tekst zoeken
+pdfjs-find-next-button-label = Volgende
+pdfjs-find-highlight-checkbox = Alles markeren
+pdfjs-find-match-case-checkbox-label = Hoofdlettergevoelig
+pdfjs-find-match-diacritics-checkbox-label = Diakritische tekens gebruiken
+pdfjs-find-entire-word-checkbox-label = Hele woorden
+pdfjs-find-reached-top = Bovenkant van document bereikt, doorgegaan vanaf onderkant
+pdfjs-find-reached-bottom = Onderkant van document bereikt, doorgegaan vanaf bovenkant
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } van { $total } overeenkomst
+       *[other] { $current } van { $total } overeenkomsten
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Meer dan { $limit } overeenkomst
+       *[other] Meer dan { $limit } overeenkomsten
+    }
+pdfjs-find-not-found = Tekst niet gevonden
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Paginabreedte
+pdfjs-page-scale-fit = Hele pagina
+pdfjs-page-scale-auto = Automatisch zoomen
+pdfjs-page-scale-actual = Werkelijke grootte
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pagina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Er is een fout opgetreden bij het laden van de PDF.
+pdfjs-invalid-file-error = Ongeldig of beschadigd PDF-bestand.
+pdfjs-missing-file-error = PDF-bestand ontbreekt.
+pdfjs-unexpected-response-error = Onverwacht serverantwoord.
+pdfjs-rendering-error = Er is een fout opgetreden bij het weergeven van de pagina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type }-aantekening]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Voer het wachtwoord in om dit PDF-bestand te openen.
+pdfjs-password-invalid = Ongeldig wachtwoord. Probeer het opnieuw.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Annuleren
+pdfjs-web-fonts-disabled = Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Tekstkleur wijzigen
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Tekenen
+pdfjs-editor-color-picker-ink-input =
+    .title = Tekenkleur wijzigen
+pdfjs-editor-ink-button-label = Tekenen
+pdfjs-editor-stamp-button =
+    .title = Afbeeldingen toevoegen of bewerken
+pdfjs-editor-stamp-button-label = Afbeeldingen toevoegen of bewerken
+pdfjs-editor-highlight-button =
+    .title = Markeren
+pdfjs-editor-highlight-button-label = Markeren
+pdfjs-highlight-floating-button1 =
+    .title = Markeren
+    .aria-label = Markeren
+pdfjs-highlight-floating-button-label = Markeren
+pdfjs-comment-floating-button =
+    .title = Opmerking
+    .aria-label = Opmerking
+pdfjs-comment-floating-button-label = Opmerking
+pdfjs-editor-comment-button =
+    .title = Opmerking
+    .aria-label = Opmerking
+pdfjs-editor-comment-button-label = Opmerking
+pdfjs-editor-signature-button =
+    .title = Handtekening toevoegen
+pdfjs-editor-signature-button-label = Handtekening toevoegen
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Markeringsbewerker
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Tekeningbewerker
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Ondertekening-editor: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Afbeeldingsbewerker
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Tekening verwijderen
+pdfjs-editor-remove-freetext-button =
+    .title = Tekst verwijderen
+pdfjs-editor-remove-stamp-button =
+    .title = Afbeelding verwijderen
+pdfjs-editor-remove-highlight-button =
+    .title = Markering verwijderen
+pdfjs-editor-remove-signature-button =
+    .title = Handtekening verwijderen
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Kleur
+pdfjs-editor-free-text-size-input = Grootte
+pdfjs-editor-ink-color-input = Kleur
+pdfjs-editor-ink-thickness-input = Dikte
+pdfjs-editor-ink-opacity-input = Opaciteit
+pdfjs-editor-stamp-add-image-button =
+    .title = Afbeelding toevoegen
+pdfjs-editor-stamp-add-image-button-label = Afbeelding toevoegen
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Dikte
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Dikte wijzigen bij accentuering van andere items dan tekst
+pdfjs-editor-add-signature-container =
+    .aria-label = Ondertekeningsinstellingen en opgeslagen ondertekeningen
+pdfjs-editor-signature-add-signature-button =
+    .title = Nieuwe handtekening toevoegen
+pdfjs-editor-signature-add-signature-button-label = Nieuwe handtekening toevoegen
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Opgeslagen ondertekening: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Tekstbewerker
+    .default-content = Start met typen鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Opmerking
+       *[other] Opmerkingen
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = De zijbalk sluiten
+    .aria-label = De zijbalk sluiten
+pdfjs-editor-comments-sidebar-close-button-label = De zijbalk sluiten
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Ziet u iets noemenswaardigs? Markeer het en laat een opmerking achter.
+pdfjs-editor-comments-sidebar-no-comments-link = Meer info
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternatieve tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Alternatieve tekst bewerken
+pdfjs-editor-alt-text-dialog-label = Kies een optie
+pdfjs-editor-alt-text-dialog-description = Alternatieve tekst helpt wanneer mensen de afbeelding niet kunnen zien of wanneer deze niet wordt geladen.
+pdfjs-editor-alt-text-add-description-label = Voeg een beschrijving toe
+pdfjs-editor-alt-text-add-description-description = Streef naar 1-2 zinnen die het onderwerp, de omgeving of de acties beschrijven.
+pdfjs-editor-alt-text-mark-decorative-label = Als decoratief markeren
+pdfjs-editor-alt-text-mark-decorative-description = Dit wordt gebruikt voor sierafbeeldingen, zoals randen of watermerken.
+pdfjs-editor-alt-text-cancel-button = Annuleren
+pdfjs-editor-alt-text-save-button = Opslaan
+pdfjs-editor-alt-text-decorative-tooltip = Als decoratief gemarkeerd
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Bijvoorbeeld: 鈥楨en jonge man gaat aan een tafel zitten om te eten鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternatieve tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Linkerbovenhoek 鈥� formaat wijzigen
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Midden boven 鈥� formaat wijzigen
+pdfjs-editor-resizer-top-right =
+    .aria-label = Rechterbovenhoek 鈥� formaat wijzigen
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Midden rechts 鈥� formaat wijzigen
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Rechterbenedenhoek 鈥� formaat wijzigen
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Midden onder 鈥� formaat wijzigen
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Linkerbenedenhoek 鈥� formaat wijzigen
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Links midden 鈥� formaat wijzigen
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Markeringskleur
+pdfjs-editor-colorpicker-button =
+    .title = Kleur wijzigen
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Kleurkeuzes
+pdfjs-editor-colorpicker-yellow =
+    .title = Geel
+pdfjs-editor-colorpicker-green =
+    .title = Groen
+pdfjs-editor-colorpicker-blue =
+    .title = Blauw
+pdfjs-editor-colorpicker-pink =
+    .title = Roze
+pdfjs-editor-colorpicker-red =
+    .title = Rood
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Alles tonen
+pdfjs-editor-highlight-show-all-button =
+    .title = Alles tonen
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Alternatieve tekst (afbeeldingsbeschrijving) bewerken
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Alternatieve tekst (afbeeldingsbeschrijving) toevoegen
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Schrijf hier uw beschrijving鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Korte beschrijving voor mensen die de afbeelding niet kunnen zien of wanneer de afbeelding niet wordt geladen.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Deze alternatieve tekst is automatisch gemaakt en is mogelijk onjuist.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Meer info
+pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatieve tekst automatisch aanmaken
+pdfjs-editor-new-alt-text-not-now-button = Niet nu
+pdfjs-editor-new-alt-text-error-title = Kan alternatieve tekst niet automatisch aanmaken
+pdfjs-editor-new-alt-text-error-description = Schrijf uw eigen alternatieve tekst of probeer het later nog eens.
+pdfjs-editor-new-alt-text-error-close-button = Sluiten
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = AI-model voor alternatieve tekst downloaden ({ $downloadedSize } van { $totalSize } MB)
+    .aria-valuetext = AI-model voor alternatieve tekst downloaden ({ $downloadedSize } van { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternatieve tekst toegevoegd
+pdfjs-editor-new-alt-text-added-button-label = Alternatieve tekst toegevoegd
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Alternatieve tekst ontbreekt
+pdfjs-editor-new-alt-text-missing-button-label = Alternatieve tekst ontbreekt
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Alternatieve tekst beoordelen
+pdfjs-editor-new-alt-text-to-review-button-label = Alternatieve tekst beoordelen
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatisch aangemaakt: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Instellingen voor alternatieve tekst van afbeeldingen
+pdfjs-image-alt-text-settings-button-label = Instellingen voor alternatieve tekst van afbeeldingen
+pdfjs-editor-alt-text-settings-dialog-label = Instellingen voor alternatieve tekst van afbeeldingen
+pdfjs-editor-alt-text-settings-automatic-title = Automatische alternatieve tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Alternatieve tekst automatisch aanmaken
+pdfjs-editor-alt-text-settings-create-model-description = Stelt beschrijvingen voor om mensen te helpen die de afbeelding niet kunnen zien of voor wie de afbeelding niet wordt geladen.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = AI-model voor alternatieve tekst ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Wordt lokaal op uw apparaat uitgevoerd, zodat uw gegevens priv茅 blijven. Vereist voor automatische alternatieve tekst.
+pdfjs-editor-alt-text-settings-delete-model-button = Verwijderen
+pdfjs-editor-alt-text-settings-download-model-button = Downloaden
+pdfjs-editor-alt-text-settings-downloading-model-button = Downloaden鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alternatieve-tekstbewerker
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternatieve-tekstbewerker meteen tonen bij toevoegen van een afbeelding
+pdfjs-editor-alt-text-settings-show-dialog-description = Helpt u ervoor te zorgen dat al uw afbeeldingen alternatieve tekst hebben.
+pdfjs-editor-alt-text-settings-close-button = Sluiten
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Markering toegevoegd
+pdfjs-editor-freetext-added-alert = Tekst toegevoegd
+pdfjs-editor-ink-added-alert = Tekening toegevoegd
+pdfjs-editor-stamp-added-alert = Afbeelding toegevoegd
+pdfjs-editor-signature-added-alert = Handtekening toegevoegd
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Markering verwijderd
+pdfjs-editor-undo-bar-message-freetext = Tekst verwijderd
+pdfjs-editor-undo-bar-message-ink = Tekening verwijderd
+pdfjs-editor-undo-bar-message-stamp = Afbeelding verwijderd
+pdfjs-editor-undo-bar-message-signature = Handtekening verwijderd
+pdfjs-editor-undo-bar-message-comment = Opmerking verwijderd
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } annotatie verwijderd
+       *[other] { $count } annotaties verwijderd
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Ongedaan maken
+pdfjs-editor-undo-bar-undo-button-label = Ongedaan maken
+pdfjs-editor-undo-bar-close-button =
+    .title = Sluiten
+pdfjs-editor-undo-bar-close-button-label = Sluiten
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Met deze modal kan de gebruiker een handtekening maken om aan een PDF-document toe te voegen. De gebruiker kan de naam (die ook als alternatieve tekst dient) bewerken en optioneel de ondertekening opslaan voor herhaald gebruik.
+pdfjs-editor-add-signature-dialog-title = Een handtekening toevoegen
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Typen
+    .title = Typen
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Tekenen
+    .title = Tekenen
+pdfjs-editor-add-signature-image-button = Afbeelding
+    .title = Afbeelding
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Uw handtekening typen
+    .placeholder = Uw handtekening typen
+pdfjs-editor-add-signature-draw-placeholder = Uw handtekening tekenen
+pdfjs-editor-add-signature-draw-thickness-range-label = Dikte
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Tekendikte: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Sleep bestand hierheen om te uploaden
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Of kies afbeeldingsbestanden
+       *[other] Of kies afbeeldingsbestanden
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Beschrijving (alternatieve tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Beschrijving (alternatieve tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Handtekening
+pdfjs-editor-add-signature-clear-button-label = Handtekening wissen
+pdfjs-editor-add-signature-clear-button =
+    .title = Handtekening wissen
+pdfjs-editor-add-signature-save-checkbox = Handtekening opslaan
+pdfjs-editor-add-signature-save-warning-message = U hebt de limiet van 5 opgeslagen handtekeningen bereikt. Verwijder er een om een andere op te slaan.
+pdfjs-editor-add-signature-image-upload-error-title = Kan afbeelding niet uploaden
+pdfjs-editor-add-signature-image-upload-error-description = Controleer uw netwerkverbinding of probeer een andere afbeelding.
+pdfjs-editor-add-signature-image-no-data-error-title = Kan deze afbeelding niet naar een handtekening converteren
+pdfjs-editor-add-signature-image-no-data-error-description = Probeer een andere afbeelding te uploaden.
+pdfjs-editor-add-signature-error-close-button = Sluiten
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Annuleren
+pdfjs-editor-add-signature-add-button = Toevoegen
+pdfjs-editor-edit-signature-update-button = Bijwerken
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Opmerking bewerken
+pdfjs-editor-edit-comment-popup-button =
+    .title = Opmerking bewerken
+pdfjs-editor-delete-comment-popup-button-label = Opmerking verwijderen
+pdfjs-editor-delete-comment-popup-button =
+    .title = Opmerking verwijderen
+pdfjs-show-comment-button =
+    .title = Opmerking tonen
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Opmerking bewerken
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Bijwerken
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Opmerking toevoegen
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Toevoegen
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Begin met typen鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Annuleren
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Opmerking toevoegen
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Zijbalk in-/uitschakelen (document bevat miniaturen/overzicht/bijlagen/lagen)
+pdfjs-toggle-views-manager-button1-label = Pagina鈥檚 beheren
+pdfjs-views-manager-sidebar =
+    .aria-label = Zijbalk
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Groottewijziging zijbalk
+pdfjs-views-manager-view-selector-button =
+    .title = Weergaven
+pdfjs-views-manager-view-selector-button-label = Weergaven
+pdfjs-views-manager-pages-title = Pagina鈥檚
+pdfjs-views-manager-outlines-title1 = Documentoverzicht
+    .title = Documentoverzicht (dubbelklik om alle items uit te vouwen/samen te vouwen)
+pdfjs-views-manager-attachments-title = Bijlagen
+pdfjs-views-manager-layers-title1 = Lagen
+    .title = Lagen (dubbelklik om alle lagen naar de standaardstatus terug te zetten)
+pdfjs-views-manager-pages-option-label = Pagina鈥檚
+pdfjs-views-manager-outlines-option-label = Documentoverzicht
+pdfjs-views-manager-attachments-option-label = Bijlagen
+pdfjs-views-manager-layers-option-label = Lagen
+pdfjs-views-manager-add-file-button =
+    .title = Bestand toevoegen
+pdfjs-views-manager-add-file-button-label = Bestand toevoegen
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } geselecteerd
+       *[other] { $count } geselecteerd
+    }
+pdfjs-views-manager-pages-status-none-action-label = Pagina鈥檚 selecteren
+pdfjs-views-manager-pages-status-action-button-label = Beheren
+pdfjs-views-manager-pages-status-copy-button-label = Kopi毛ren
+pdfjs-views-manager-pages-status-cut-button-label = Knippen
+pdfjs-views-manager-pages-status-delete-button-label = Verwijderen
+pdfjs-views-manager-pages-status-export-selected-button-label = Geselecteerde exporteren鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 pagina geknipt
+       *[other] { $count } pagina鈥檚 geknipt
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 pagina gekopieerd
+       *[other] { $count } pagina鈥檚 gekopieerd
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 pagina verwijderd
+       *[other] { $count } pagina鈥檚 verwijderd
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Uw bestand voorbereiden鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Bestand uploaden鈥�
+pdfjs-views-manager-status-warning-cut-label = Kan niet knippen. Vernieuw de pagina en probeer het opnieuw.
+pdfjs-views-manager-status-warning-copy-label = Kan niet kopi毛ren. Vernieuw de pagina en probeer het opnieuw.
+pdfjs-views-manager-status-warning-delete-label = Kan niet verwijderen. Vernieuw de pagina en probeer het opnieuw.
+pdfjs-views-manager-status-warning-save-label = Kan niet opslaan. Vernieuw de pagina en probeer het opnieuw.
+pdfjs-views-manager-status-undo-button-label = Ongedaan maken
+pdfjs-views-manager-status-done-button-label = Gereed
+pdfjs-views-manager-status-close-button =
+    .title = Sluiten
+pdfjs-views-manager-status-close-button-label = Sluiten
+pdfjs-views-manager-paste-button-label = Plakken
+pdfjs-views-manager-paste-button-before =
+    .title = Plakken voor de eerste pagina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Plakken na pagina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NIEUW
+pdfjs-views-manager-waiting-for-file = Bestand uploaden鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Pagina鈥檚 beheren
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Opgeslagen ondertekening verwijderen
+pdfjs-editor-delete-signature-button-label1 = Opgeslagen ondertekening verwijderen
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Beschrijving bewerken
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Beschrijving bewerken
diff --git a/public/pdfjs/web/locale/nn-NO/viewer.ftl b/public/pdfjs/web/locale/nn-NO/viewer.ftl
new file mode 100644
index 0000000..d36ed53
--- /dev/null
+++ b/public/pdfjs/web/locale/nn-NO/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = F酶reg氓ande side
+pdfjs-previous-button-label = F酶reg氓ande
+pdfjs-next-button =
+    .title = Neste side
+pdfjs-next-button-label = Neste
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Side
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = av { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } av { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom ut
+pdfjs-zoom-out-button-label = Zoom ut
+pdfjs-zoom-in-button =
+    .title = Zoom inn
+pdfjs-zoom-in-button-label = Zoom inn
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Byt til presentasjonsmodus
+pdfjs-presentation-mode-button-label = Presentasjonsmodus
+pdfjs-open-file-button =
+    .title = Opne fil
+pdfjs-open-file-button-label = Opne
+pdfjs-print-button =
+    .title = Skriv ut
+pdfjs-print-button-label = Skriv ut
+pdfjs-save-button =
+    .title = Lagre
+pdfjs-save-button-label = Lagre
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Last ned
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Last ned
+pdfjs-bookmark-button =
+    .title = Gjeldande side (sj氓 URL fr氓 gjeldande side)
+pdfjs-bookmark-button-label = Gjeldande side
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Verkt酶y
+pdfjs-tools-button-label = Verkt酶y
+pdfjs-first-page-button =
+    .title = G氓 til f酶rste side
+pdfjs-first-page-button-label = G氓 til f酶rste side
+pdfjs-last-page-button =
+    .title = G氓 til siste side
+pdfjs-last-page-button-label = G氓 til siste side
+pdfjs-page-rotate-cw-button =
+    .title = Roter med klokka
+pdfjs-page-rotate-cw-button-label = Roter med klokka
+pdfjs-page-rotate-ccw-button =
+    .title = Roter mot klokka
+pdfjs-page-rotate-ccw-button-label = Roter mot klokka
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktiver tekstmarkeringsverkt酶y
+pdfjs-cursor-text-select-tool-button-label = Tekstmarkeringsverkt酶y
+pdfjs-cursor-hand-tool-button =
+    .title = Aktiver handverkt酶y
+pdfjs-cursor-hand-tool-button-label = Handverkt酶y
+pdfjs-scroll-page-button =
+    .title = Bruk siderulling
+pdfjs-scroll-page-button-label = Siderulling
+pdfjs-scroll-vertical-button =
+    .title = Bruk vertikal rulling
+pdfjs-scroll-vertical-button-label = Vertikal rulling
+pdfjs-scroll-horizontal-button =
+    .title = Bruk horisontal rulling
+pdfjs-scroll-horizontal-button-label = Horisontal rulling
+pdfjs-scroll-wrapped-button =
+    .title = Bruk fleirsiderulling
+pdfjs-scroll-wrapped-button-label = Fleirsiderulling
+pdfjs-spread-none-button =
+    .title = Vis enkeltsider
+pdfjs-spread-none-button-label = Enkeltside
+pdfjs-spread-odd-button =
+    .title = Vis oppslag med ulike sidenummer til venstre
+pdfjs-spread-odd-button-label = Oppslag med framside
+pdfjs-spread-even-button =
+    .title = Vis oppslag med like sidenummmer til venstre
+pdfjs-spread-even-button-label = Oppslag utan framside
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumenteigenskapar鈥�
+pdfjs-document-properties-button-label = Dokumenteigenskapar鈥�
+pdfjs-document-properties-file-name = Filnamn:
+pdfjs-document-properties-file-size = Filstorleik:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } byte)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte)
+pdfjs-document-properties-title = Tittel:
+pdfjs-document-properties-author = Forfattar:
+pdfjs-document-properties-subject = Emne:
+pdfjs-document-properties-keywords = Stikkord:
+pdfjs-document-properties-creation-date = Dato oppretta:
+pdfjs-document-properties-modification-date = Dato endra:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Oppretta av:
+pdfjs-document-properties-producer = PDF-verkt酶y:
+pdfjs-document-properties-version = PDF-versjon:
+pdfjs-document-properties-page-count = Sidetal:
+pdfjs-document-properties-page-size = Sidest酶rrelse:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = st氓ande (portrait)
+pdfjs-document-properties-page-size-orientation-landscape = liggande (landscape)
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Brev
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Rask nettvising:
+pdfjs-document-properties-linearized-yes = Ja
+pdfjs-document-properties-linearized-no = Nei
+pdfjs-document-properties-close-button = Lat att
+
+## Print
+
+pdfjs-print-progress-message = F酶rebur dokumentet for utskrift鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Avbryt
+pdfjs-printing-not-supported = 脜tvaring: Utskrift er ikkje fullstendig st酶tta av denne nettlesaren.
+pdfjs-printing-not-ready = 脜tvaring: PDF ikkje fullstendig innlasta for utskrift.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Sl氓 av/p氓 sidestolpe
+pdfjs-toggle-sidebar-notification-button =
+    .title = Vis/g酶ym sidestolpe (dokumentet inneheld oversikt/vedlegg/lag)
+pdfjs-toggle-sidebar-button-label = Sl氓 av/p氓 sidestolpe
+pdfjs-document-outline-button =
+    .title = Vis dokumentdisposisjonen (dobbelklikk for 氓 utvide/g酶yme alle elementa)
+pdfjs-document-outline-button-label = Dokumentdisposisjon
+pdfjs-attachments-button =
+    .title = Vis vedlegg
+pdfjs-attachments-button-label = Vedlegg
+pdfjs-layers-button =
+    .title = Vis lag (dobbeltklikk for 氓 tilbakestille alle lag til standardtilstand)
+pdfjs-layers-button-label = Lag
+pdfjs-thumbs-button =
+    .title = Vis miniatyrbilde
+pdfjs-thumbs-button-label = Miniatyrbilde
+pdfjs-current-outline-item-button =
+    .title = Finn gjeldande disposisjonselement
+pdfjs-current-outline-item-button-label = Gjeldande disposisjonselement
+pdfjs-findbar-button =
+    .title = Finn i dokumentet
+pdfjs-findbar-button-label = Finn
+pdfjs-additional-layers = Ytterlegare lag
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Side { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatyrbilde av side { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Vel side { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Side { $page } av { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = S酶k
+    .placeholder = S酶k i dokument鈥�
+pdfjs-find-previous-button =
+    .title = Finn f酶rre f酶rekomst av frasen
+pdfjs-find-previous-button-label = F酶rre
+pdfjs-find-next-button =
+    .title = Finn neste f酶rekomst av frasen
+pdfjs-find-next-button-label = Neste
+pdfjs-find-highlight-checkbox = Uthev alle
+pdfjs-find-match-case-checkbox-label = Skil store/sm氓 bokstavar
+pdfjs-find-match-diacritics-checkbox-label = Samsvar diakritiske teikn
+pdfjs-find-entire-word-checkbox-label = Heile ord
+pdfjs-find-reached-top = N氓dde toppen av dokumentet, fortset fr氓 botnen
+pdfjs-find-reached-bottom = N氓dde botnen av dokumentet, fortset fr氓 toppen
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } av { $total } treff
+       *[other] { $current } av { $total } treff
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Meir enn { $limit } treff
+       *[other] Meir enn { $limit } treff
+    }
+pdfjs-find-not-found = Fann ikkje teksten
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Sidebreidde
+pdfjs-page-scale-fit = Tilpass til sida
+pdfjs-page-scale-auto = Automatisk skalering
+pdfjs-page-scale-actual = Verkeleg storleik
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Side { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ein feil oppstod ved lasting av PDF.
+pdfjs-invalid-file-error = Ugyldig eller korrupt PDF-fil.
+pdfjs-missing-file-error = Manglande PDF-fil.
+pdfjs-unexpected-response-error = Uventa tenarrespons.
+pdfjs-rendering-error = Ein feil oppstod under vising av sida.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } annotasjon]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Skriv inn passordet for 氓 opne denne PDF-fila.
+pdfjs-password-invalid = Ugyldig passord. Pr酶v p氓 nytt.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Avbryt
+pdfjs-web-fonts-disabled = Web-skrifter er sl氓tt av: Kan ikkje bruke innbundne PDF-skrifter.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Endre tekstfarge
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Teikne
+pdfjs-editor-color-picker-ink-input =
+    .title = Endre teiknefarge
+pdfjs-editor-ink-button-label = Teikne
+pdfjs-editor-stamp-button =
+    .title = Legg til eller rediger bilde
+pdfjs-editor-stamp-button-label = Legg til eller rediger bilde
+pdfjs-editor-highlight-button =
+    .title = Markere
+pdfjs-editor-highlight-button-label = Markere
+pdfjs-highlight-floating-button1 =
+    .title = Markere
+    .aria-label = Markere
+pdfjs-highlight-floating-button-label = Markere
+pdfjs-comment-floating-button =
+    .title = Kommenter
+    .aria-label = Kommenter
+pdfjs-comment-floating-button-label = Kommenter
+pdfjs-editor-comment-button =
+    .title = Kommentar
+    .aria-label = Kommentar
+pdfjs-editor-comment-button-label = Kommentar
+pdfjs-editor-signature-button =
+    .title = Legg til signatur
+pdfjs-editor-signature-button-label = Legg til signatur
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Markeringsredigerar
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Redigering av teikningar
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Signatur-redigerar: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Bildredigerar
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Fjern teikninga
+pdfjs-editor-remove-freetext-button =
+    .title = Fjern tekst
+pdfjs-editor-remove-stamp-button =
+    .title = Fjern bildet
+pdfjs-editor-remove-highlight-button =
+    .title = Fjern utheving
+pdfjs-editor-remove-signature-button =
+    .title = Fjern signatur
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Farge
+pdfjs-editor-free-text-size-input = Storleik
+pdfjs-editor-ink-color-input = Farge
+pdfjs-editor-ink-thickness-input = Tjukn
+pdfjs-editor-ink-opacity-input = Ugjennomskinleg
+pdfjs-editor-stamp-add-image-button =
+    .title = Legg til bilde
+pdfjs-editor-stamp-add-image-button-label = Legg til bilde
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Tjukn
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Endre tjukn n氓r du markerer andre element enn tekst
+pdfjs-editor-add-signature-container =
+    .aria-label = Signaturkontroll og lagra signaturar
+pdfjs-editor-signature-add-signature-button =
+    .title = Legg til ny signatur
+pdfjs-editor-signature-add-signature-button-label = Legg til ny signatur
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Lagra signatur: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Tekstredigering
+    .default-content = Begynn 氓 skrive鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Kommentarar
+       *[other] Kommentararar
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Lat att sidestolpen
+    .aria-label = Lat att sidestolpen
+pdfjs-editor-comments-sidebar-close-button-label = Lat att sidestolpen
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Ser du noko som er verdt 氓 merke seg? Marker det og legg igjen ein kommentar.
+pdfjs-editor-comments-sidebar-no-comments-link = Les meir
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alt-tekst
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Rediger alt-tekst tekst
+pdfjs-editor-alt-text-dialog-label = Vel eit alternativ
+pdfjs-editor-alt-text-dialog-description = Alt-tekst (alternativ tekst) hjelper n氓r folk ikkje kan sj氓 bildet eller n氓r det ikkje vert lasta inn.
+pdfjs-editor-alt-text-add-description-label = Legg til ei skildring
+pdfjs-editor-alt-text-add-description-description = G氓 etter 1-2 setninger som skildrar emnet, settinga eller handlingane.
+pdfjs-editor-alt-text-mark-decorative-label = Merk som dekorativt
+pdfjs-editor-alt-text-mark-decorative-description = Dette vert brukt til dekorative bilde, som kantlinjer eller vassmerke.
+pdfjs-editor-alt-text-cancel-button = Avbryt
+pdfjs-editor-alt-text-save-button = Lagre
+pdfjs-editor-alt-text-decorative-tooltip = Merkt som dekorativ
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Til d酶mes, 芦Ein ung mann set seg ved eit bord for 氓 ete eit m氓ltid禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alt-tekst
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 脴vste venstre hj酶rne 鈥� endre st酶rrelse
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 脴vst i midten 鈥� endre st酶rrelse
+pdfjs-editor-resizer-top-right =
+    .aria-label = 脴vste h酶gre hj酶rne 鈥� endre st酶rrelse
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Midt til h酶gre 鈥� endre st酶rrelse
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Nedste h酶gre hj酶rne 鈥� endre st酶rrelse
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Nedst i midten 鈥� endre st酶rrelse
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Nedste venstre hj酶rne 鈥� endre st酶rrelse
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Midt til venstre 鈥� endre st酶rrelse
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Uthevingsfarge
+pdfjs-editor-colorpicker-button =
+    .title = Endre farge
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Fargeval
+pdfjs-editor-colorpicker-yellow =
+    .title = Gul
+pdfjs-editor-colorpicker-green =
+    .title = Gr酶n
+pdfjs-editor-colorpicker-blue =
+    .title = Bl氓
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Raud
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Vis alle
+pdfjs-editor-highlight-show-all-button =
+    .title = Vis alle
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (bildeskildring)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Legg til alternativ tekst (bildeskildring)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Skriv skildringa di her鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kort skildring for personar som ikkje kan sj氓 bildet, eller n氓r bildet ikkje lastar inn.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative teksten vart oppretta automatisk, og kan vere un酶yaktig.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Les meir
+pdfjs-editor-new-alt-text-create-automatically-button-label = Opprett alternativ tekt automatisk
+pdfjs-editor-new-alt-text-not-now-button = Ikkje no
+pdfjs-editor-new-alt-text-error-title = Klarte ikkje 氓 opprette alternativ tekst automatisk
+pdfjs-editor-new-alt-text-error-description = Skriv din eigen alternative tekst eller pr酶v igjen seinare.
+pdfjs-editor-new-alt-text-error-close-button = Lat att
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Lastar ned KI-modell med alternativ tekst ({ $downloadedSize } av { $totalSize } MB)
+    .aria-valuetext = Lastar ned KI-modell med alternativ tekst ({ $downloadedSize } av { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativ tekst lagt til
+pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst lagt til
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Manglande alternativ tekst
+pdfjs-editor-new-alt-text-missing-button-label = Manglande alternativ tekst
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Vurder alternativ tekst
+pdfjs-editor-new-alt-text-to-review-button-label = Vurder alternativ tekst
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Oppretta automatisk: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Alternative tekst-innstillingar for bilde
+pdfjs-image-alt-text-settings-button-label = Alternative tekst-innstillingar for bilde
+pdfjs-editor-alt-text-settings-dialog-label = Alternative tekst-innstillingar for bilde
+pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst
+pdfjs-editor-alt-text-settings-create-model-button-label = Opprett alternativ tekt automatisk
+pdfjs-editor-alt-text-settings-create-model-description = F酶resl氓r skildringar for 氓 hjelpe folk som ikkje kan sj氓 bildet eller n氓r bildet ikkje blir lasta inn.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = KI-modell for alternativ tekst ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = K酶yrer lokalt p氓 eininga di slik at dataa dine blir verande private. P氓kravd for automatisk alternativ tekst.
+pdfjs-editor-alt-text-settings-delete-model-button = Slett
+pdfjs-editor-alt-text-settings-download-model-button = Last ned
+pdfjs-editor-alt-text-settings-downloading-model-button = Lastar ned鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alternativ tekst-redigerar
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis alternativ tekst-redigerar direkte n氓r du legg til eit bilde
+pdfjs-editor-alt-text-settings-show-dialog-description = Hjelper deg med 氓 s酶rgje for at alle bilda dine har alternativ tekst.
+pdfjs-editor-alt-text-settings-close-button = Lat att
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Utheving lagt til
+pdfjs-editor-freetext-added-alert = Tekst lagt til
+pdfjs-editor-ink-added-alert = Teikning lagt til
+pdfjs-editor-stamp-added-alert = Bilde lagt til
+pdfjs-editor-signature-added-alert = Signatur lagt til
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Markering fjerna
+pdfjs-editor-undo-bar-message-freetext = Tekst fjerna
+pdfjs-editor-undo-bar-message-ink = Teikning fjerna
+pdfjs-editor-undo-bar-message-stamp = Bilde fjerna
+pdfjs-editor-undo-bar-message-signature = Signatur fjerna
+pdfjs-editor-undo-bar-message-comment = Kommentar fjerna
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } kommentar fjerna
+       *[other] { $count } kommentarar fjerna
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Angre
+pdfjs-editor-undo-bar-undo-button-label = Angre
+pdfjs-editor-undo-bar-close-button =
+    .title = Lat att
+pdfjs-editor-undo-bar-close-button-label = Lat att
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Denne modalen l猫t brukaren lage ein signatur for 氓 leggje til eit PDF-dokument. Brukaren kan redigere namnet (som ogs氓 fungerer som alt-teksten), og eventuelt lagre signaturen for gjenteken bruk.
+pdfjs-editor-add-signature-dialog-title = Legg til ein signatur
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Type
+    .title = Type
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Teikne
+    .title = Teikne
+pdfjs-editor-add-signature-image-button = Bilde
+    .title = Bilde
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Skriv inn signaturen din
+    .placeholder = Skriv inn signaturen din
+pdfjs-editor-add-signature-draw-placeholder = Teikn signaturen din
+pdfjs-editor-add-signature-draw-thickness-range-label = Tjukn
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Linjetjukn: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Drag ei fil hit for 氓 laste opp
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Eller vel bildefiler
+       *[other] Eller vel bildefiler
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Skildring (alternativ tekst)
+pdfjs-editor-add-signature-description-input =
+    .title = Skildring (alternativ tekst)
+pdfjs-editor-add-signature-description-default-when-drawing = Signatur
+pdfjs-editor-add-signature-clear-button-label = Fjern signatur
+pdfjs-editor-add-signature-clear-button =
+    .title = Fjern signatur
+pdfjs-editor-add-signature-save-checkbox = Lagre signatur
+pdfjs-editor-add-signature-save-warning-message = Du har n氓dd grensa p氓 5 lagra signaturar. Fjern ein for 氓 lagre ein ny.
+pdfjs-editor-add-signature-image-upload-error-title = Klarte ikkje 氓 oppdatere bilde
+pdfjs-editor-add-signature-image-upload-error-description = Sjekk nettverkstilkoplinga eller pr酶v eit annet bilde.
+pdfjs-editor-add-signature-image-no-data-error-title = Kan ikkje konvertere dette bildet til ein signatur
+pdfjs-editor-add-signature-image-no-data-error-description = Pr酶v 氓 laste opp eit anna bilde.
+pdfjs-editor-add-signature-error-close-button = Lat att
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Avbryt
+pdfjs-editor-add-signature-add-button = Legg til
+pdfjs-editor-edit-signature-update-button = Oppdater
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar
+pdfjs-editor-edit-comment-popup-button =
+    .title = Rediger kommentar
+pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar
+pdfjs-editor-delete-comment-popup-button =
+    .title = Fjern kommentar
+pdfjs-show-comment-button =
+    .title = Vis kommentar
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Oppdater
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Legg til kommentar
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Legg til
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Byrje 氓 skrive鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Legg til kommentar
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Vis/skjul sidestolpe (dokumentet inneheld miniatyrbilde/disposisjon/vedlegg/lag)
+pdfjs-toggle-views-manager-button1-label = Handsam sider
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidestolpe
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Endre storleiken p氓 sidestolpen
+pdfjs-views-manager-view-selector-button =
+    .title = Vis
+pdfjs-views-manager-view-selector-button-label = Visningar
+pdfjs-views-manager-pages-title = Sider
+pdfjs-views-manager-outlines-title1 = Dokumentoversikt
+    .title = Dokumentoversikt (dobbelklikk for 氓 utvide/skjule alle element)
+pdfjs-views-manager-attachments-title = Vedlegg
+pdfjs-views-manager-layers-title1 = Lag
+    .title = Lag (dobbelklikk for 氓 tilbakestille alle lag til standardtilstand)
+pdfjs-views-manager-pages-option-label = Sider
+pdfjs-views-manager-outlines-option-label = Dokumentdisposisjon
+pdfjs-views-manager-attachments-option-label = Vedlegg
+pdfjs-views-manager-layers-option-label = Lag
+pdfjs-views-manager-add-file-button =
+    .title = Legg til fil
+pdfjs-views-manager-add-file-button-label = Legg til fil
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } vald
+       *[other] { $count } valde
+    }
+pdfjs-views-manager-pages-status-none-action-label = Vel sider
+pdfjs-views-manager-pages-status-action-button-label = Handsam
+pdfjs-views-manager-pages-status-copy-button-label = Kopier
+pdfjs-views-manager-pages-status-cut-button-label = Klipp ut
+pdfjs-views-manager-pages-status-delete-button-label = Slett
+pdfjs-views-manager-pages-status-export-selected-button-label = Eksporter valde鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 side klipt ut
+       *[other] { $count } sider klipte ut
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 side kopiert
+       *[other] { $count } sider kopierte
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 side sletta
+       *[other] { $count } sider sletta
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Klargjer fila di鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Lastar opp fila鈥�
+pdfjs-views-manager-status-warning-cut-label = Klarte ikkje 氓 klippe ut. Oppdater sida og pr酶v p氓 nytt.
+pdfjs-views-manager-status-warning-copy-label = Klarte ikkje 氓 kopiere. Oppdater sida og pr酶v p氓 nytt.
+pdfjs-views-manager-status-warning-delete-label = Klarte ikkje 氓 slette. Oppdater sida og pr酶v p氓 nytt.
+pdfjs-views-manager-status-warning-save-label = Klarte ikkje 氓 lagre. Oppdater sida og pr酶v p氓 nytt.
+pdfjs-views-manager-status-undo-button-label = Angre
+pdfjs-views-manager-status-done-button-label = Ferdig
+pdfjs-views-manager-status-close-button =
+    .title = Lat att
+pdfjs-views-manager-status-close-button-label = Lat att
+pdfjs-views-manager-paste-button-label = Lim inn
+pdfjs-views-manager-paste-button-before =
+    .title = Lim inn f酶r f酶rste side
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Lim inn etter side { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NY
+pdfjs-views-manager-waiting-for-file = Lastar opp fila鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Handsam sider
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Fjern lagra signatur
+pdfjs-editor-delete-signature-button-label1 = Fjern lagra signatur
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Rediger skildring
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Rediger skildring
diff --git a/public/pdfjs/web/locale/oc/viewer.ftl b/public/pdfjs/web/locale/oc/viewer.ftl
new file mode 100644
index 0000000..a10a398
--- /dev/null
+++ b/public/pdfjs/web/locale/oc/viewer.ftl
@@ -0,0 +1,396 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pagina precedenta
+pdfjs-previous-button-label = Precedent
+pdfjs-next-button =
+    .title = Pagina seguenta
+pdfjs-next-button-label = Seguent
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pagina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = sus { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom arri猫r
+pdfjs-zoom-out-button-label = Zoom arri猫r
+pdfjs-zoom-in-button =
+    .title = Zoom avant
+pdfjs-zoom-in-button-label = Zoom avant
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Bascular en m貌de presentacion
+pdfjs-presentation-mode-button-label = M貌de Presentacion
+pdfjs-open-file-button =
+    .title = Dobrir lo fichi猫r
+pdfjs-open-file-button-label = Dobrir
+pdfjs-print-button =
+    .title = Imprimir
+pdfjs-print-button-label = Imprimir
+pdfjs-save-button =
+    .title = Enregistrar
+pdfjs-save-button-label = Enregistrar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Telecargar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Telecargar
+pdfjs-bookmark-button =
+    .title = Pagina actuala (mostrar l鈥檃dre莽a de la pagina actuala)
+pdfjs-bookmark-button-label = Pagina actuala
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Aisinas
+pdfjs-tools-button-label = Aisinas
+pdfjs-first-page-button =
+    .title = Anar a la primi猫ra pagina
+pdfjs-first-page-button-label = Anar a la primi猫ra pagina
+pdfjs-last-page-button =
+    .title = Anar a la darri猫ra pagina
+pdfjs-last-page-button-label = Anar a la darri猫ra pagina
+pdfjs-page-rotate-cw-button =
+    .title = Rotacion or脿ria
+pdfjs-page-rotate-cw-button-label = Rotacion or脿ria
+pdfjs-page-rotate-ccw-button =
+    .title = Rotacion antior脿ria
+pdfjs-page-rotate-ccw-button-label = Rotacion antior脿ria
+pdfjs-cursor-text-select-tool-button =
+    .title = Activar l'aisina de seleccion de t猫xte
+pdfjs-cursor-text-select-tool-button-label = Aisina de seleccion de t猫xte
+pdfjs-cursor-hand-tool-button =
+    .title = Activar l鈥檃isina man
+pdfjs-cursor-hand-tool-button-label = Aisina man
+pdfjs-scroll-page-button =
+    .title = Activar lo defilament per pagina
+pdfjs-scroll-page-button-label = Defilament per pagina
+pdfjs-scroll-vertical-button =
+    .title = Utilizar lo defilament vertical
+pdfjs-scroll-vertical-button-label = Defilament vertical
+pdfjs-scroll-horizontal-button =
+    .title = Utilizar lo defilament orizontal
+pdfjs-scroll-horizontal-button-label = Defilament orizontal
+pdfjs-scroll-wrapped-button =
+    .title = Activar lo defilament contin煤
+pdfjs-scroll-wrapped-button-label = Defilament contin煤
+pdfjs-spread-none-button =
+    .title = Agropar pas las paginas doas a doas
+pdfjs-spread-none-button-label = Una sola pagina
+pdfjs-spread-odd-button =
+    .title = Mostrar doas paginas en comen莽ant per las paginas imparas a esqu猫rra
+pdfjs-spread-odd-button-label = Dobla pagina, impara a drecha
+pdfjs-spread-even-button =
+    .title = Mostrar doas paginas en comen莽ant per las paginas paras a esqu猫rra
+pdfjs-spread-even-button-label = Dobla pagina, para a drecha
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Proprietats del document鈥�
+pdfjs-document-properties-button-label = Proprietats del document鈥�
+pdfjs-document-properties-file-name = Nom del fichi猫r聽:
+pdfjs-document-properties-file-size = Talha del fichi猫r聽:
+pdfjs-document-properties-title = T铆tol聽:
+pdfjs-document-properties-author = Autor聽:
+pdfjs-document-properties-subject = Subj猫cte聽:
+pdfjs-document-properties-keywords = Mots claus聽:
+pdfjs-document-properties-creation-date = Data de creacion聽:
+pdfjs-document-properties-modification-date = Data de modificacion聽:
+pdfjs-document-properties-creator = Creator聽:
+pdfjs-document-properties-producer = Aisina de conversion PDF聽:
+pdfjs-document-properties-version = Version PDF聽:
+pdfjs-document-properties-page-count = Nombre de paginas聽:
+pdfjs-document-properties-page-size = Talha de la pagina聽:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = retrach
+pdfjs-document-properties-page-size-orientation-landscape = pa茂satge
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letra
+pdfjs-document-properties-page-size-name-legal = Document juridic
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height }聽{ $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height }聽{ $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista web rapida聽:
+pdfjs-document-properties-linearized-yes = 脪c
+pdfjs-document-properties-linearized-no = Non
+pdfjs-document-properties-close-button = Tampar
+
+## Print
+
+pdfjs-print-progress-message = Preparacion del document per l鈥檌mpression鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Anullar
+pdfjs-printing-not-supported = Atencion鈥�: l'impression es pas compl猫tament gerida per aqueste navegador.
+pdfjs-printing-not-ready = Atencion鈥�: lo PDF es pas enti猫rament cargat per lo poder imprimir.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Afichar/amagar lo pan猫l lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Afichar/amagar lo pan猫l lateral (lo document conten esqu猫mas/p猫莽as juntas/calques)
+pdfjs-toggle-sidebar-button-label = Afichar/amagar lo pan猫l lateral
+pdfjs-document-outline-button =
+    .title = Mostrar los esqu猫mas del document (dobleclicar per espandre/reduire totes los elements)
+pdfjs-document-outline-button-label = Marcapaginas del document
+pdfjs-attachments-button =
+    .title = Visualizar las p猫莽as juntas
+pdfjs-attachments-button-label = P猫莽as juntas
+pdfjs-layers-button =
+    .title = Afichar los calques (doble-clicar per re茂nicializar totes los calques a l鈥檈stat per defaut)
+pdfjs-layers-button-label = Calques
+pdfjs-thumbs-button =
+    .title = Afichar las vinhetas
+pdfjs-thumbs-button-label = Vinhetas
+pdfjs-current-outline-item-button =
+    .title = Trobar l鈥檈lement de plan actual
+pdfjs-current-outline-item-button-label = Element de plan actual
+pdfjs-findbar-button =
+    .title = Cercar dins lo document
+pdfjs-findbar-button-label = Recercar
+pdfjs-additional-layers = Calques suplementaris
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Vinheta de la pagina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Recercar
+    .placeholder = Cercar dins lo document鈥�
+pdfjs-find-previous-button =
+    .title = Tr貌ba l'ocurr茅ncia precedenta de la frasa
+pdfjs-find-previous-button-label = Precedent
+pdfjs-find-next-button =
+    .title = Tr貌ba l'ocurr茅ncia venenta de la frasa
+pdfjs-find-next-button-label = Seguent
+pdfjs-find-highlight-checkbox = Suslinhar tot
+pdfjs-find-match-case-checkbox-label = Respectar la cassa
+pdfjs-find-match-diacritics-checkbox-label = Respectar los diacritics
+pdfjs-find-entire-word-checkbox-label = Mots enti猫rs
+pdfjs-find-reached-top = Naut de la pagina atenh, perseguida del bas
+pdfjs-find-reached-bottom = Bas de la pagina atench, perseguida al comen莽ament
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] Ocurr茅ncia聽{ $current } de聽{ $total }
+       *[other] Ocurr茅ncia聽{ $current } de聽{ $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mai de { $limit }聽ocurr茅ncia
+       *[other] Mai de { $limit }聽ocurr茅ncias
+    }
+pdfjs-find-not-found = Frasa pas trobada
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Largor plena
+pdfjs-page-scale-fit = Pagina enti猫ra
+pdfjs-page-scale-auto = Zoom automatic
+pdfjs-page-scale-actual = Talha vertadi猫ra
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pagina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Una error s'es producha pendent lo cargament del fichi猫r PDF.
+pdfjs-invalid-file-error = Fichi猫r PDF invalid o corromput.
+pdfjs-missing-file-error = Fichi猫r PDF mancant.
+pdfjs-unexpected-response-error = Responsa de servidor imprevista.
+pdfjs-rendering-error = Una error s'es producha pendent l'afichatge de la pagina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotacion { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Picatz lo senhal per dobrir aqueste fichi猫r PDF.
+pdfjs-password-invalid = Senhal incorr猫cte. Tornatz ensajar.
+pdfjs-password-ok-button = D'ac貌rdi
+pdfjs-password-cancel-button = Anullar
+pdfjs-web-fonts-disabled = Las polissas web son desactivadas聽: impossible d'utilizar las polissas integradas al PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = T猫xte
+pdfjs-editor-free-text-button-label = T猫xte
+pdfjs-editor-ink-button =
+    .title = Dessenhar
+pdfjs-editor-ink-button-label = Dessenhar
+pdfjs-editor-stamp-button =
+    .title = Apondre o modificar d鈥檌matges
+pdfjs-editor-stamp-button-label = Apondre o modificar d鈥檌matges
+pdfjs-editor-highlight-button =
+    .title = Subrelinhar
+pdfjs-editor-highlight-button-label = Subrelinhar
+pdfjs-highlight-floating-button1 =
+    .title = Subrelinhar
+    .aria-label = Subrelinhar
+pdfjs-highlight-floating-button-label = Subrelinhar
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Levar lo dessenh
+pdfjs-editor-remove-freetext-button =
+    .title = Suprimir lo t猫xte
+pdfjs-editor-remove-stamp-button =
+    .title = Suprimir l鈥檌matge
+pdfjs-editor-remove-highlight-button =
+    .title = Levar lo suslinhatge
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Color
+pdfjs-editor-free-text-size-input = Talha
+pdfjs-editor-ink-color-input = Color
+pdfjs-editor-ink-thickness-input = Espessor
+pdfjs-editor-ink-opacity-input = Opacitat
+pdfjs-editor-stamp-add-image-button =
+    .title = Apondre imatge
+pdfjs-editor-stamp-add-image-button-label = Apondre imatge
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Espessor
+pdfjs-editor-signature-add-signature-button =
+    .title = Apondre una signatura nov猫la
+pdfjs-editor-signature-add-signature-button-label = Apondre una signatura nov猫la
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de t猫xte
+    .default-content = Comen莽atz de picar鈥�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = T猫xt alternatiu
+pdfjs-editor-alt-text-dialog-label = Causir una opcion
+pdfjs-editor-alt-text-add-description-label = Apondre una descripcion
+pdfjs-editor-alt-text-cancel-button = Anullar
+pdfjs-editor-alt-text-save-button = Enregistrar
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Color de suslinhatge
+pdfjs-editor-colorpicker-button =
+    .title = Cambiar de color
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Causida de colors
+pdfjs-editor-colorpicker-yellow =
+    .title = Jaune
+pdfjs-editor-colorpicker-green =
+    .title = Verd
+pdfjs-editor-colorpicker-blue =
+    .title = Blau
+pdfjs-editor-colorpicker-pink =
+    .title = R貌se
+pdfjs-editor-colorpicker-red =
+    .title = Roge
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = O afichar tot
+pdfjs-editor-highlight-show-all-button =
+    .title = O afichar tot
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+pdfjs-editor-new-alt-text-not-now-button = Pas ara
+pdfjs-editor-new-alt-text-error-close-button = Tampar
+
+## Image alt-text settings
+
+pdfjs-editor-alt-text-settings-automatic-title = T猫xte alternatiu automatic
+pdfjs-editor-alt-text-settings-create-model-button-label = Crear un t猫xte alternatiu automaticament
+pdfjs-editor-alt-text-settings-delete-model-button = Suprimir
+pdfjs-editor-alt-text-settings-download-model-button = Telecargar
+pdfjs-editor-alt-text-settings-downloading-model-button = Telecargament鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de t猫xte alternatiu
+pdfjs-editor-alt-text-settings-close-button = Tampar
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-freetext = T猫xte suprimit
+pdfjs-editor-undo-bar-message-ink = Dessenh suprimit
+pdfjs-editor-undo-bar-message-stamp = Imatge suprimit
+pdfjs-editor-undo-bar-undo-button =
+    .title = Anullar
+pdfjs-editor-undo-bar-undo-button-label = Anullar
+pdfjs-editor-undo-bar-close-button =
+    .title = Tampar
+pdfjs-editor-undo-bar-close-button-label = Tampar
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = N脪U
diff --git a/public/pdfjs/web/locale/pa-IN/viewer.ftl b/public/pdfjs/web/locale/pa-IN/viewer.ftl
new file mode 100644
index 0000000..0ef28c9
--- /dev/null
+++ b/public/pdfjs/web/locale/pa-IN/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 啜啜涏ú啜� 啜膏ǐ啜监ň
+pdfjs-previous-button-label = 啜喋编喋�
+pdfjs-next-button =
+    .title = 啜呧啜侧ň 啜膏ǐ啜监ň
+pdfjs-next-button-label = 啜呧┍啜椸﹪
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 啜膏ǐ啜监ň
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 啜掂喋编喋嬥▊
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = { $pagesCount }) 啜掂喋编喋嬥▊ ({ $pageNumber }
+pdfjs-zoom-out-button =
+    .title = 喋涏﹤啜� 啜嗋▔啜�
+pdfjs-zoom-out-button-label = 喋涏﹤啜� 啜嗋▔啜�
+pdfjs-zoom-in-button =
+    .title = 喋涏﹤啜� 啜囙è
+pdfjs-zoom-in-button-label = 喋涏﹤啜� 啜囙è
+pdfjs-zoom-select =
+    .title = 喋涏﹤啜�
+pdfjs-presentation-mode-button =
+    .title = 啜ò啜苦喋堗▊啜熰﹪啜多è 啜啜� 啜掂喋编 啜溹ň啜�
+pdfjs-presentation-mode-button-label = 啜ò啜苦喋堗▊啜熰﹪啜多è 啜啜�
+pdfjs-open-file-button =
+    .title = 啜ň啜堗ú 啜ㄠ﹤喋� 啜栢啜侧啜灌
+pdfjs-open-file-button-label = 啜栢啜侧啜灌
+pdfjs-print-button =
+    .title = 啜ò啜苦┌啜�
+pdfjs-print-button-label = 啜ò啜苦┌啜�
+pdfjs-save-button =
+    .title = 啜膏┌啜ň啜侧
+pdfjs-save-button-label = 啜膏┌啜ň啜侧
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 啜∴ň啜娻è啜侧啜�
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 啜∴ň啜娻è啜侧啜�
+pdfjs-bookmark-button =
+    .title = 啜啜溹﹤啜︵ň 啜膏啜监ň (啜啜溹﹤啜︵ň 啜膏喋� 啜む啜� URL 啜掂﹪啜栢)
+pdfjs-bookmark-button-label = 啜啜溹﹤啜︵ň 啜膏啜监ň
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 啜熰﹤啜�
+pdfjs-tools-button-label = 啜熰﹤啜�
+pdfjs-first-page-button =
+    .title = 啜ü啜苦ú喋� 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+pdfjs-first-page-button-label = 啜ü啜苦ú喋� 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+pdfjs-last-page-button =
+    .title = 啜嗋啜班﹢ 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+pdfjs-last-page-button-label = 啜嗋啜班﹢ 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+pdfjs-page-rotate-cw-button =
+    .title = 啜膏┍啜溹﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距〒
+pdfjs-page-rotate-cw-button-label = 啜膏┍啜溹﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距〒
+pdfjs-page-rotate-ccw-button =
+    .title = 啜栢┍啜﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距〒
+pdfjs-page-rotate-ccw-button-label = 啜栢┍啜﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距〒
+pdfjs-cursor-text-select-tool-button =
+    .title = 啜侧啜栢à 啜氞啜� 啜熰﹤啜� 啜膏ó啜班┍啜� 啜曕ò喋�
+pdfjs-cursor-text-select-tool-button-label = 啜侧啜栢à 啜氞啜� 啜熰﹤啜�
+pdfjs-cursor-hand-tool-button =
+    .title = 啜灌┍啜� 啜熰﹤啜� 啜膏ó啜班┍啜� 啜曕ò喋�
+pdfjs-cursor-hand-tool-button-label = 啜灌┍啜� 啜熰﹤啜�
+pdfjs-scroll-page-button =
+    .title = 啜膏ǐ啜监ň 啜栢啜膏〞啜距▔啜� 啜ㄠ﹤喋� 啜掂ò啜む啜�
+pdfjs-scroll-page-button-label = 啜膏ǐ啜监ň 啜栢啜膏〞啜距▔啜`ň
+pdfjs-scroll-vertical-button =
+    .title = 啜栢喋嵿ü啜掂﹪啜� 啜膏〞啜班ň啜夃ǎ 啜ㄠ﹤喋� 啜掂ò啜む啜�
+pdfjs-scroll-vertical-button-label = 啜栢喋嵿ü啜掂ň啜� 啜膏ò啜曕ň啜夃ǎ啜�
+pdfjs-scroll-horizontal-button =
+    .title = 啜侧﹪啜熰ǖ喋囙▊ 啜膏ò啜曕ň啜夃ǎ 啜ㄠ﹤喋� 啜掂ò啜む啜�
+pdfjs-scroll-horizontal-button-label = 啜侧﹪啜熰ǖ啜距▊ 啜膏ò啜曕ň啜夃ǎ啜�
+pdfjs-scroll-wrapped-button =
+    .title = 啜膏ó喋囙喋� 啜膏ò啜曕ň啜夃ǎ 啜ㄠ﹤喋� 啜掂ò啜む啜�
+pdfjs-scroll-wrapped-button-label = 啜膏ó喋囙啜苦▎ 啜膏ò啜曕ň啜夃ǎ啜�
+pdfjs-spread-none-button =
+    .title = 啜膏ǐ啜监ň 啜﹫啜侧ň啜� 啜掂喋编 啜膏啜距ó啜� 啜ㄠň 啜灌啜掂
+pdfjs-spread-none-button-label = 啜曕啜� 啜﹫啜侧ň啜� 啜ㄠü喋�啜�
+pdfjs-spread-odd-button =
+    .title = 啜熰ň啜傕〞 啜呧┌啜� 啜掂ň啜侧﹪ 啜膏ǐ啜监啜嗋▊ 啜ㄠň啜� 啜膏喋佮ò喋� 啜灌啜� 啜掂ň啜侧﹪ 啜膏ǐ啜苦▎啜� 啜掂喋编 啜膏啜距ó啜� 啜灌啜掂
+pdfjs-spread-odd-button-label = 啜熰ň啜傕〞 啜﹫啜侧ň啜�
+pdfjs-spread-even-button =
+    .title = 啜溹啜膏à 啜呧┌啜� 啜掂ň啜侧﹪ 啜膏ǐ啜监啜嗋▊ 啜ㄠň啜� 啜膏喋佮ò喋� 啜灌啜� 啜掂ň啜侧﹪ 啜膏ǐ啜苦▎啜� 啜掂喋编 啜膏啜距ó啜� 啜灌啜掂
+pdfjs-spread-even-button-label = 啜溹啜膏à 啜﹫啜侧ň啜�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 鈥︵é啜膏à啜距ǖ喋囙 啜︵﹢ 啜掂啜多﹪啜多à啜�
+pdfjs-document-properties-button-label = 鈥︵é啜膏à啜距ǖ喋囙 啜︵﹢ 啜掂啜多﹪啜多à啜�
+pdfjs-document-properties-file-name = 啜ň啜堗ú 啜︵ň 啜ㄠň啜�:
+pdfjs-document-properties-file-size = 啜ň啜堗ú 啜︵ň 啜嗋〞啜距ò:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 啜ň啜堗)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 啜ň啜堗)
+pdfjs-document-properties-title = 啜熰ň啜堗啜�:
+pdfjs-document-properties-author = 啜侧﹪啜栢〞:
+pdfjs-document-properties-subject = 啜掂啜多ň:
+pdfjs-document-properties-keywords = 啜多ì啜�:
+pdfjs-document-properties-creation-date = 啜ǎ啜距▔啜� 啜︵﹢ 啜啜む﹢:
+pdfjs-document-properties-modification-date = 啜膏啜� 啜︵﹢ 啜啜む﹢:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 啜ㄠ啜班ó啜距à啜�:
+pdfjs-document-properties-producer = PDF 啜啜班啜∴啜娻ǜ啜�:
+pdfjs-document-properties-version = PDF 啜掂ò啜溹è:
+pdfjs-document-properties-page-count = 啜膏ǐ啜监﹪ 啜︵﹢ 啜椸啜`à喋�:
+pdfjs-document-properties-page-size = 啜膏啜� 啜嗋〞啜距ò:
+pdfjs-document-properties-page-size-unit-inches = 啜囙┌啜�
+pdfjs-document-properties-page-size-unit-millimeters = 啜啜﹢
+pdfjs-document-properties-page-size-orientation-portrait = 啜啜班啜班﹪啜�
+pdfjs-document-properties-page-size-orientation-landscape = 啜侧﹫啜傕ā啜膏〞喋囙í
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 啜侧﹫啜熰ò
+pdfjs-document-properties-page-size-name-legal = 啜曕è喋傕┌啜ㄠ﹢
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 啜む﹪啜溹 啜掂﹫喋编ì 啜澿ú啜�:
+pdfjs-document-properties-linearized-yes = 啜灌ň啜�
+pdfjs-document-properties-linearized-no = 啜ㄠü喋�啜�
+pdfjs-document-properties-close-button = 啜┌啜� 啜曕ò喋�
+
+## Print
+
+pdfjs-print-progress-message = 鈥︵í啜班喋班 啜曕ò啜� 啜侧▓ 啜︵ǜ啜むň啜掂﹪喋� 啜ㄠ﹤喋� 啜む啜嗋ò 啜曕﹢啜むň 啜溹ň 啜班啜灌ň 啜灌﹫
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 啜班┍啜� 啜曕ò喋�
+pdfjs-printing-not-supported = 啜膏ň啜掂ě啜距è: 啜囙ü 啜ò啜距▕喋涏ò 啜ò啜苦┌啜� 啜曕ò啜� 啜侧▓ 啜﹤啜班﹢ 啜むò喋嵿ü啜距▊ 啜膏ü啜距▏啜� 啜ㄠü喋�啜� 啜灌﹫啷�
+pdfjs-printing-not-ready = 啜膏ň啜掂ě啜距è: PDF 啜ㄠ﹤喋� 啜ò啜苦┌啜� 啜曕ò啜� 啜侧▓ 啜﹤啜班﹢ 啜むò喋嵿ü啜距▊ 啜侧啜� 啜ㄠü喋�啜� 啜灌﹫啷�
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 啜ň啜灌﹢ 啜é啜侧
+pdfjs-toggle-sidebar-notification-button =
+    .title = 啜ň啜灌﹢ 啜ㄠ﹤喋� 啜é啜侧 (啜︵ǜ啜むň啜掂﹪喋� 啜栢ň啜曕ň/啜呧喋堗啜﹫啜傕/啜ò啜むň啜� 啜班┍啜栢é啜� 啜灌﹫)
+pdfjs-toggle-sidebar-button-label = 啜ň啜灌﹢ 啜é啜侧
+pdfjs-document-outline-button =
+    .title = 啜︵ǜ啜むň啜掂﹪喋� 啜栢ň啜曕ň 啜︵啜栢ň啜� (啜膏ň啜班﹢啜嗋▊ 啜嗋▓啜熰ó啜距▊ 啜ㄠ﹤喋� 啜﹫啜侧ň啜夃ǎ/啜膏ó喋囙啜� 啜侧▓ 啜︵ 啜掂ň啜� 啜曕ú啜苦┍啜� 啜曕ò喋�)
+pdfjs-document-outline-button-label = 啜︵ǜ啜むň啜掂﹪喋� 啜栢ň啜曕ň
+pdfjs-attachments-button =
+    .title = 啜呧喋堗啜﹫啜傕 啜掂﹪啜栢ň啜�
+pdfjs-attachments-button-label = 啜呧喋堗啜﹫啜傕啜距▊
+pdfjs-layers-button =
+    .title = 啜ò啜むň啜� 啜掂﹪啜栢ň啜� (啜膏ň啜班﹢啜嗋▊ 啜ò啜むň啜� 啜ㄠ﹤喋� 啜﹤啜� 啜灌ň啜侧à 啜夃┍啜む﹪ 啜﹣喋�-啜膏﹫喋编 啜曕ò啜� 啜侧▓ 啜︵ 啜掂ň啜� 啜曕ú啜苦┍啜� 啜曕ò喋�)
+pdfjs-layers-button-label = 啜ò啜むň啜�
+pdfjs-thumbs-button =
+    .title = 啜ム┌啜è喋囙ú 啜ㄠ﹤喋� 啜掂﹪啜栢ň啜�
+pdfjs-thumbs-button-label = 啜ム┌啜è喋囙ú
+pdfjs-current-outline-item-button =
+    .title = 啜喋屶喋傕é啜� 啜栢ň啜曕ň 啜氞﹢喋� 啜侧┍啜
+pdfjs-current-outline-item-button-label = 啜啜溹﹤啜︵ň 啜栢ň啜曕ň 啜氞﹢喋�
+pdfjs-findbar-button =
+    .title = 啜︵ǜ啜むň啜掂﹪喋� 啜掂喋编 啜侧┍啜
+pdfjs-findbar-button-label = 啜侧┍啜
+pdfjs-additional-layers = 啜掂ň啜о﹤ 啜ò啜むň啜�
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 啜膏ǐ啜监ň { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 啜膏ǐ啜监﹪ 啜︵ň 啜ム┌啜è喋囙ú
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = { $page } 啜膏喋� 啜ㄠ﹤喋� 啜氞﹣啜`
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = { $total } 啜掂喋编喋嬥▊ { $page } 啜膏啜�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 啜侧┍啜
+    .placeholder = 鈥︵é啜膏à啜距ǖ喋囙 '啜� 啜侧┍啜
+pdfjs-find-previous-button =
+    .title = 啜掂ň啜� 啜︵﹢ 啜啜涏ú喋� 啜啜溹﹤啜︵喋� 啜侧┍啜
+pdfjs-find-previous-button-label = 啜喋编喋�
+pdfjs-find-next-button =
+    .title = 啜掂ň啜� 啜︵﹢ 啜呧啜侧﹢ 啜啜溹﹤啜︵喋� 啜侧┍啜
+pdfjs-find-next-button-label = 啜呧┍啜椸﹪
+pdfjs-find-highlight-checkbox = 啜膏ō 啜夃ō啜距ò喋�
+pdfjs-find-match-case-checkbox-label = 啜呧┍啜栢ò 啜嗋〞啜距ò 啜ㄠ﹤喋� 啜啜侧ň啜�
+pdfjs-find-match-diacritics-checkbox-label = 啜﹪啜︵ǜ喋傕啜� 啜﹪啜�
+pdfjs-find-entire-word-checkbox-label = 啜﹤啜班﹪ 啜多ì啜�
+pdfjs-find-reached-top = 啜︵ǜ啜むň啜掂﹪喋� 啜︵﹪ 啜夃┍啜む﹪ 啜� 啜椸◤ 啜灌ň啜�, 啜ム┍啜侧﹪ 啜む啜� 啜溹ň啜班﹢ 啜班┍啜栢啜� 啜灌﹫
+pdfjs-find-reached-bottom = 啜︵ǜ啜むň啜掂﹪喋� 啜︵﹪ 啜呧┌啜� 啜夃┍啜む﹪ 啜� 啜椸◤ 啜灌ň啜�, 啜夃┍啜む﹪ 啜む啜� 啜溹ň啜班﹢ 啜班┍啜栢啜� 啜灌﹫
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $total } 啜掂喋编喋嬥▊ { $current } 啜﹪啜�
+       *[other] { $total } 啜掂喋编喋嬥▊ { $current } 啜﹪啜�
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] { $limit } 啜む啜� 啜掂┍啜� 啜﹪啜�
+       *[other] { $limit } 啜む啜� 啜掂┍啜� 啜﹪啜�
+    }
+pdfjs-find-not-found = 啜掂ň啜� 啜ㄠü喋�啜� 啜侧┍啜啜�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 啜膏ǐ啜监﹪ 啜︵﹢ 啜氞喋溹ň啜�
+pdfjs-page-scale-fit = 啜膏ǐ啜监ň 啜喋编
+pdfjs-page-scale-auto = 啜嗋喋嬥ó喋堗啜苦〞 喋涏﹤啜� 啜曕ò喋�
+pdfjs-page-scale-actual = 啜嗋喋嬥ó喋堗啜苦〞 啜嗋〞啜距ò
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 啜膏ǐ啜监ň { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 啜侧啜� 啜曕ò啜� 啜︵﹪ 啜︵啜班ň啜� 啜椸ú啜む﹢ 啜嗋▓ 啜灌﹫啷�
+pdfjs-invalid-file-error = 啜椸ú啜� 啜溹ň啜� 啜ㄠ啜曕ň啜班ň PDF 啜ň啜堗ú 啜灌﹫啷�
+pdfjs-missing-file-error = 啜ㄠň-啜啜溹﹤啜� PDF 啜ň啜堗ú啷�
+pdfjs-unexpected-response-error = 啜呧ǎ啜溹ň啜� 啜膏ò啜掂ò 啜溹ǖ啜距ì啷�
+pdfjs-rendering-error = 啜膏ǐ啜监ň 啜班﹫啜∴ò 啜曕ò啜� 啜︵﹪ 啜︵啜班ň啜� 啜椸ú啜む﹢ 啜嗋▓ 啜灌﹫啷�
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 啜掂啜嗋啜苦▎]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 啜囙ü PDF 啜ň啜堗ú 啜ㄠ﹤喋� 啜栢啜侧啜灌ǎ 啜侧▓ 啜ň啜膏ǖ啜班ā 啜︵啜夃イ
+pdfjs-password-invalid = 啜椸ú啜� 啜ň啜膏ǖ啜班ā啷� 啜﹪啜� 啜曕啜多啜� 啜曕ò喋� 啜溹﹢啷�
+pdfjs-password-ok-button = 啜犩﹢啜� 啜灌﹫
+pdfjs-password-cancel-button = 啜班┍啜� 啜曕ò喋�
+pdfjs-web-fonts-disabled = 啜掂﹫啜� 啜啜傕 啜┌啜� 啜灌è: 啜囙┌啜﹫啜� PDF 啜啜傕 啜ㄠ﹤喋� 啜掂ò啜むǎ 啜侧▓ 啜呧ǜ啜ò喋编ē 啜灌﹫啷�
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 啜侧啜栢à
+pdfjs-editor-color-picker-free-text-input =
+    .title = 啜侧啜栢à 啜︵﹪ 啜班┌啜� 啜ㄠ﹤喋� 啜é啜侧
+pdfjs-editor-free-text-button-label = 啜侧啜栢à
+pdfjs-editor-ink-button =
+    .title = 啜掂ň啜灌
+pdfjs-editor-color-picker-ink-input =
+    .title = 啜∴ò啜距▏喋班 啜班┌啜� 啜ㄠ﹤喋� 啜é啜侧
+pdfjs-editor-ink-button-label = 啜掂ň啜灌
+pdfjs-editor-stamp-button =
+    .title = 啜氞喋编à啜� 啜溹喋溹 啜溹ň啜� 啜膏啜о
+pdfjs-editor-stamp-button-label = 啜氞喋编à啜� 啜溹喋溹 啜溹ň啜� 啜膏啜о
+pdfjs-editor-highlight-button =
+    .title = 啜灌ň啜堗ú啜距▓啜�
+pdfjs-editor-highlight-button-label = 啜灌ň啜堗ú啜距▓啜�
+pdfjs-highlight-floating-button1 =
+    .title = 啜灌ň啜堗ú啜距▓啜�
+    .aria-label = 啜灌ň啜堗ú啜距▓啜�
+pdfjs-highlight-floating-button-label = 啜灌ň啜堗ú啜距▓啜�
+pdfjs-comment-floating-button =
+    .title = 啜熰喋编í啜`﹢
+    .aria-label = 啜熰喋编í啜`﹢
+pdfjs-comment-floating-button-label = 啜熰喋编í啜`﹢
+pdfjs-editor-comment-button =
+    .title = 啜熰喋编í啜`﹢
+    .aria-label = 啜熰喋编í啜`﹢
+pdfjs-editor-comment-button-label = 啜熰喋编í啜`﹢
+pdfjs-editor-signature-button =
+    .title = 啜︵ǜ啜む啜监à 啜溹喋溹
+pdfjs-editor-signature-button-label = 啜︵ǜ啜む啜监à 啜溹喋溹
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 啜灌ň啜堗ú啜距▓啜� 啜膏┌啜ň啜︵〞
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 啜∴ò啜距▏喋班 啜膏┌啜ň啜︵〞
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 啜︵ǜ啜む啜监à 啜愢ā喋�啜熰ò: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 啜氞喋编à啜� 啜膏┌啜ň啜︵〞
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 啜∴ò啜距▏喋班 啜ㄠ﹤喋� 啜灌啜距〒
+pdfjs-editor-remove-freetext-button =
+    .title = 啜侧啜栢à 啜ㄠ﹤喋� 啜灌啜距〒
+pdfjs-editor-remove-stamp-button =
+    .title = 啜氞喋编à啜� 啜ㄠ﹤喋� 啜灌啜距〒
+pdfjs-editor-remove-highlight-button =
+    .title = 啜灌ň啜堗ú啜距▓啜� 啜ㄠ﹤喋� 啜灌啜距〒
+pdfjs-editor-remove-signature-button =
+    .title = 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜灌啜距〒
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 啜班┌啜�
+pdfjs-editor-free-text-size-input = 啜嗋〞啜距ò
+pdfjs-editor-ink-color-input = 啜班┌啜�
+pdfjs-editor-ink-thickness-input = 啜啜熰ň啜�
+pdfjs-editor-ink-opacity-input = 啜о﹣喋班é啜侧ň啜è
+pdfjs-editor-stamp-add-image-button =
+    .title = 啜氞喋编à啜� 啜溹喋溹
+pdfjs-editor-stamp-add-image-button-label = 啜氞喋编à啜� 啜溹喋溹
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 啜啜熰ň啜�
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 啜氞﹢喋涏ň啜� 啜ㄠ﹤喋� 啜灌啜� 啜侧啜栢à啜距▊ 啜む啜� 啜夃啜距啜� 啜膏ó喋囙▊ 啜啜熰ň啜� 啜ㄠ﹤喋� 啜é啜侧
+pdfjs-editor-add-signature-container =
+    .aria-label = 啜︵ǜ啜む啜监à 啜曕┌啜熰ò喋嬥ú 啜呧à喋� 啜膏┌啜ň啜侧﹪ 啜灌啜� 啜︵ǜ啜む啜监à
+pdfjs-editor-signature-add-signature-button =
+    .title = 啜ㄠǖ喋囙▊ 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜溹喋溹
+pdfjs-editor-signature-add-signature-button-label = 啜ㄠǖ喋囙▊ 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜溹喋溹
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 啜膏┌啜ň啜侧﹪ 啜︵ǜ啜む啜监à: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 啜侧啜栢à 啜愢ā喋�啜熰ò
+    .default-content = 鈥︵ú啜苦啜`ň 啜多﹣啜班﹤ 啜曕ò喋�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 啜熰喋编í啜`﹢
+       *[other] 啜熰喋编í啜`﹢啜嗋▊
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 啜ň啜灌﹢ 啜ㄠ﹤喋� 啜┌啜� 啜曕ò喋�
+    .aria-label = 啜ň啜灌﹢ 啜ㄠ﹤喋� 啜┌啜� 啜曕ò喋�
+pdfjs-editor-comments-sidebar-close-button-label = 啜ň啜灌﹢ 啜ㄠ﹤喋� 啜┌啜� 啜曕ò喋�
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 啜曕﹢ 啜曕﹣啜� 啜о啜嗋è 啜︵﹪啜� 啜啜� 啜掂﹪啜栢啜� 啜灌﹫? 啜囙ǜ 啜ㄠ﹤喋� 啜夃啜距喋� 啜呧à喋� 啜熰喋编í啜`﹢ 啜︵啜撪イ
+pdfjs-editor-comments-sidebar-no-comments-link = 啜灌啜� 啜溹ň啜`
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 啜é啜侧ǖ喋�啜� 啜侧啜栢à
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 啜é啜侧ǖ喋� 啜侧啜栢à 啜ㄠ﹤喋� 啜膏啜о
+pdfjs-editor-alt-text-dialog-label = 啜氞啜� 啜曕ò喋�
+pdfjs-editor-alt-text-dialog-description = 啜氞喋编à啜� 啜ㄠň 啜︵喋编ǜ啜� 啜溹ň啜� 啜侧啜� 啜ㄠň 啜灌啜� 啜︵﹢ 啜灌ň啜侧à 啜掂喋编 Alt 啜侧啜栢à (啜é啜侧ǖ喋�啜� 啜侧啜栢à) 啜侧啜曕ň啜� 啜侧▓ 啜é啜︵啜距ò 啜灌﹣喋班é喋� 啜灌﹫啷�
+pdfjs-editor-alt-text-add-description-label = 啜掂ò啜`è 啜溹喋溹
+pdfjs-editor-alt-text-add-description-description = 1-2 啜掂ň啜� 啜班┍啜栢, 啜溹 啜曕 啜掂啜多﹪, 啜膏﹫啜熰喋班 啜溹ň啜� 啜曕ň啜班ǖ啜距▓啜嗋▊ 啜ň啜班﹪ 啜︵ò啜膏ň啜夃▊啜︵﹪ 啜灌啜`イ
+pdfjs-editor-alt-text-mark-decorative-label = 啜膏啜距ǖ啜� 啜掂喋嬥▊ 啜ㄠ啜多ň啜� 啜侧ň啜囙▎
+pdfjs-editor-alt-text-mark-decorative-description = 啜囙ǜ 啜ㄠ﹤喋� 啜膏啜距ǖ啜熰﹢ 啜氞喋编à啜班ň啜� 啜侧▓ 啜掂ò啜む啜� 啜溹ň啜傕é啜� 啜灌﹫ 啜溹啜掂﹪啜� 啜曕 啜灌ň啜多﹢啜� 啜溹ň啜� 啜掂ň啜熰ò啜ň啜班〞 啜嗋é啜苦イ
+pdfjs-editor-alt-text-cancel-button = 啜班┍啜� 啜曕ò喋�
+pdfjs-editor-alt-text-save-button = 啜膏┌啜ň啜侧
+pdfjs-editor-alt-text-decorative-tooltip = 啜膏啜距ǖ啜� 啜掂喋嬥▊ 啜ㄠ啜多ň啜� 啜侧ň啜�
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 啜啜膏ň啜� 啜掂喋嬥▊, 鈥溹喋编ō啜班﹤ 啜啜溹è 啜侧﹫ 啜曕﹪ 啜﹪啜溹 啜夃┍啜む﹪ 啜﹫啜犩ň 啜灌﹫鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 啜é啜侧ǖ喋�啜� 啜侧啜栢à
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 啜夃┍啜む﹪ 啜栢┍啜ň 啜曕啜ㄠň 鈥� 啜﹣喋�-啜嗋〞啜距ò 啜曕ò喋�
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 啜夃┍啜む﹪ 啜┍啜� 鈥� 啜﹣喋�-啜嗋〞啜距ò 啜曕ò喋�
+pdfjs-editor-resizer-top-right =
+    .aria-label = 啜夃┍啜む﹪ 啜膏┍啜溹ň 啜曕啜ㄠň 鈥� 啜﹣喋�-啜嗋〞啜距ò 啜曕ò喋�
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 啜┍啜� 啜膏┍啜溹ň 鈥� 啜﹣喋�-啜嗋〞啜距ò 啜曕ò喋�
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 啜灌﹪啜犩ň啜� 啜膏┍啜溹ň 啜曕啜ㄠň 鈥� 啜﹣喋�-啜嗋〞啜距ò 啜曕ò喋�
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 啜灌﹪啜犩ň啜� 啜┍啜� 鈥� 啜﹣喋�-啜嗋〞啜距ò 啜曕ò喋�
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 啜灌﹪啜犩ň啜� 啜栢┍啜ň 啜曕啜ㄠň 鈥� 啜﹣喋�-啜嗋〞啜距ò 啜曕ò喋�
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 啜┍啜� 啜栢┍啜ň 鈥� 啜﹣喋�-啜嗋〞啜距ò 啜曕ò喋�
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 啜灌ň啜堗啜侧ň啜堗 啜︵ň 啜班┌啜�
+pdfjs-editor-colorpicker-button =
+    .title = 啜班┌啜� 啜ㄠ﹤喋� 啜é啜侧
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 啜班┌啜� 啜氞啜`ň啜�
+pdfjs-editor-colorpicker-yellow =
+    .title = 啜﹢啜侧ň
+pdfjs-editor-colorpicker-green =
+    .title = 啜灌ò啜�
+pdfjs-editor-colorpicker-blue =
+    .title = 啜ㄠ﹢啜侧ň
+pdfjs-editor-colorpicker-pink =
+    .title = 啜椸﹣啜侧ň啜﹢
+pdfjs-editor-colorpicker-red =
+    .title = 啜侧ň啜�
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 啜膏ō 啜掂﹪啜栢
+pdfjs-editor-highlight-show-all-button =
+    .title = 啜膏ō 啜掂﹪啜栢
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 啜é啜侧ǖ喋�啜� 啜侧啜栢à (啜氞喋编à啜� 啜︵ň 啜掂ò啜`è) 啜ㄠ﹤喋� 啜膏啜о
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 啜é啜侧ǖ喋�啜� 啜侧啜栢à (啜氞喋编à啜� 啜︵ň 啜掂ò啜`è) 啜ㄠ﹤喋� 啜溹喋溹
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 鈥︵▎啜ǎ啜� 啜掂ò啜`è啜� 啜囙┍啜ム﹪ 啜侧啜栢
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 啜侧啜�, 啜溹 啜曕 啜氞喋编à啜� 啜ㄠü喋�啜� 啜掂﹪啜� 啜膏〞啜︵﹪ 啜溹ň啜� 啜溹é 啜掂﹢ 啜氞喋编à啜班ň啜� 啜ㄠ﹤喋� 啜侧啜� 啜ㄠü喋�啜� 啜溹ň 啜膏〞啜︵ň, 啜夃ǜ 啜侧▓ 啜涏啜熰ň 啜掂﹪啜班ǖ啜� 啜︵啜撪イ
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 啜囙ü 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜嗋í啜`﹪-啜嗋í 啜む啜嗋ò 啜曕﹢啜む﹢ 啜椸▓ 啜膏﹢ 啜呧à喋� 啜椸ú啜� 啜掂﹢ 啜灌 啜膏〞啜︵﹢ 啜灌﹫啷�
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 啜灌啜� 啜溹ň啜`
+pdfjs-editor-new-alt-text-create-automatically-button-label = 啜ú啜︵ǖ喋�啜� 啜侧啜栢à 啜嗋í啜`﹪-啜嗋í 啜ǎ啜距〒
+pdfjs-editor-new-alt-text-not-now-button = 啜灌﹣啜`﹪ 啜ㄠü喋�啜�
+pdfjs-editor-new-alt-text-error-title = 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜嗋í啜`﹪-啜嗋í 啜ǎ啜距▓ 啜ㄠü喋�啜� 啜溹ň 啜膏〞喋�
+pdfjs-editor-new-alt-text-error-description = 啜嗋í啜`ň 啜栢﹣啜� 啜︵﹢ 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜侧啜栢 啜溹ň啜� 啜﹪啜� 啜曕啜多啜� 啜曕ò喋嬥イ
+pdfjs-editor-new-alt-text-error-close-button = 啜┌啜� 啜曕ò喋�
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 啜é啜侧ǖ啜距▊ 啜侧啜栢à AI 啜ň啜∴ú 啜∴ň啜娻è啜侧啜� 啜曕﹢啜むň 啜溹ň 啜班啜灌ň 啜灌﹫ ({ $totalSize } MB 啜掂喋编喋嬥▊ { $downloadedSize })
+    .aria-valuetext = 啜é啜侧ǖ啜距▊ 啜侧啜栢à AI 啜ň啜∴ú 啜∴ň啜娻è啜侧啜� 啜曕﹢啜むň 啜溹ň 啜班啜灌ň 啜灌﹫ ({ $totalSize } MB 啜掂喋编喋嬥▊ { $downloadedSize })
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜溹喋溹﹢
+pdfjs-editor-new-alt-text-added-button-label = 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜溹喋溹﹢
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 啜é啜侧ǖ啜距▊ 啜侧啜栢à 啜椸﹣喋班ó 啜灌﹫
+pdfjs-editor-new-alt-text-missing-button-label = 啜é啜侧ǖ啜距▊ 啜侧啜栢à 啜椸﹣喋班ó 啜灌﹫
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜︵ň 啜班﹢啜掂啜� 啜曕ò喋�
+pdfjs-editor-new-alt-text-to-review-button-label = 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜︵ň 啜班﹢啜掂啜� 啜曕ò喋�
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 啜嗋í啜`﹪-啜嗋í 啜ǎ啜距▏啜�: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 啜氞喋编à啜� 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜︵﹢啜嗋▊ 啜膏﹫啜熰喋班啜距▊
+pdfjs-image-alt-text-settings-button-label = 啜氞喋编à啜� 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜︵﹢啜嗋▊ 啜膏﹫啜熰喋班啜距▊
+pdfjs-editor-alt-text-settings-dialog-label = 啜氞喋编à啜� 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜︵﹢啜嗋▊ 啜膏﹫啜熰喋班啜距▊
+pdfjs-editor-alt-text-settings-automatic-title = 啜嗋喋嬥ó啜﹫啜熰啜� 啜é啜侧ǖ喋�啜� 啜侧啜栢à
+pdfjs-editor-alt-text-settings-create-model-button-label = 啜ú啜︵ǖ喋�啜� 啜侧啜栢à 啜嗋í啜`﹪-啜嗋í 啜ǎ啜距〒
+pdfjs-editor-alt-text-settings-create-model-description = 啜氞喋编à啜� 啜ㄠň 啜掂﹪啜� 啜膏〞啜� 啜掂ň啜侧﹪ 啜侧啜曕ň啜� 啜︵﹢ 啜é啜� 啜溹ň啜� 啜溹é 啜掂﹢ 啜氞喋编à啜班ň啜� 啜ㄠ﹤喋� 啜侧啜� 啜ㄠü喋�啜� 啜溹ň 啜膏〞啜︵ň, 啜夃ǜ 啜侧▓ 啜涏啜熰ň 啜掂﹪啜班ǖ啜� 啜︵啜撪イ
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 啜é啜侧ǖ喋� 啜侧啜栢à 啜侧▓ AI 啜ň啜∴ú ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = 啜む﹣啜灌ň啜∴﹪ 啜∴啜掂ň啜堗ǜ 啜夃┍啜む﹪ 啜侧啜曕ú 啜灌﹢ 啜氞┍啜侧é啜� 啜灌啜� 啜曕ò啜曕﹪ 啜む﹣啜灌ň啜∴ň 啜∴ň啜熰ň 啜啜班ň啜堗ǖ喋囙 啜灌﹢ 啜班ü啜苦┌啜︵ň 啜灌﹫啷� 啜嗋喋嬥ó喋堗啜苦〞 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜侧▓ 啜氞ň啜灌﹢啜︵ň 啜灌﹫啷�
+pdfjs-editor-alt-text-settings-delete-model-button = 啜灌啜距〒
+pdfjs-editor-alt-text-settings-download-model-button = 啜∴ň啜娻è啜侧啜�
+pdfjs-editor-alt-text-settings-downloading-model-button = 鈥︵è喋傕┌ 啜∴ň啜娻è啜侧啜� 啜曕﹢啜むň 啜溹ň 啜班啜灌ň 啜灌﹫
+pdfjs-editor-alt-text-settings-editor-title = 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜愢ā喋�啜熰ò
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 啜溹é喋嬥▊ 啜掂喋编 啜氞喋编à啜� 啜溹喋溹啜� 啜溹ň啜掂﹪ 啜むň啜� 啜喋屶ò啜� 啜é啜侧ǖ喋� 啜侧啜栢à 啜膏┌啜ň啜︵〞 啜掂﹪啜栢ň啜�
+pdfjs-editor-alt-text-settings-show-dialog-description = 啜む﹣啜灌ň啜∴﹢ 啜é啜� 啜曕ò啜︵ň 啜灌﹫ 啜曕 啜む﹣啜灌ň啜∴﹪ 啜膏ň啜班﹪ 啜氞喋编à啜班ň啜� 啜侧▓ 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜啜溹﹤啜� 啜灌啜掂﹪啷�
+pdfjs-editor-alt-text-settings-close-button = 啜┌啜� 啜曕ò喋�
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 啜灌ň啜堗ú啜距▓啜� 啜ㄠ﹤喋� 啜溹喋溹啜�
+pdfjs-editor-freetext-added-alert = 啜侧啜栢à 啜ㄠ﹤喋� 啜溹喋溹啜� 啜椸啜�
+pdfjs-editor-ink-added-alert = 啜∴ò啜距▏喋班 啜ㄠ﹤喋� 啜溹喋溹啜�
+pdfjs-editor-stamp-added-alert = 啜氞喋编à啜� 啜ㄠ﹤喋� 啜溹喋溹啜�
+pdfjs-editor-signature-added-alert = 啜︵ǜ啜む啜监à啜距▊ 啜ㄠ﹤喋� 啜溹喋溹啜�
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 啜灌ň啜堗ú啜距▓啜� 啜ㄠ﹤喋� 啜灌啜距▏啜� 啜椸啜�
+pdfjs-editor-undo-bar-message-freetext = 啜侧啜栢à 啜ㄠ﹤喋� 啜灌啜距▏啜� 啜椸啜�
+pdfjs-editor-undo-bar-message-ink = 啜∴ò啜距▏喋班 啜ㄠ﹤喋� 啜灌啜距▏啜� 啜椸啜�
+pdfjs-editor-undo-bar-message-stamp = 啜氞喋编à啜� 啜ㄠ﹤喋� 啜灌啜距▏啜� 啜椸啜�
+pdfjs-editor-undo-bar-message-signature = 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜灌啜距▏啜�
+pdfjs-editor-undo-bar-message-comment = 啜熰喋编í啜`﹢ 啜ㄠ﹤喋� 啜灌啜距▏啜� 啜椸啜�
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 啜掂啜嗋啜苦▎ 啜ㄠ﹤喋� 啜灌啜距▏啜�
+       *[other] { $count } 啜掂啜嗋啜苦▎啜掂ň啜� 啜ㄠ﹤喋� 啜灌啜距▏啜�
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 啜掂ň啜ǜ
+pdfjs-editor-undo-bar-undo-button-label = 啜掂ň啜ǜ
+pdfjs-editor-undo-bar-close-button =
+    .title = 啜┌啜� 啜曕ò喋�
+pdfjs-editor-undo-bar-close-button-label = 啜┌啜� 啜曕ò喋�
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 啜囙ü 啜ň啜∴ú 啜掂ò啜む啜傕〞啜距ò 啜ㄠ﹤喋� PDF 啜︵ǜ啜むň啜掂﹪喋� 啜掂喋编 啜溹喋溹è 啜侧▓ 啜︵ǜ啜む啜监à 啜ǎ啜距▔啜� 啜︵喋班é啜� 啜灌﹫啷� 啜掂ò啜む啜傕〞啜距ò 啜ㄠň啜� 啜ㄠ﹤喋� 啜膏啜� 啜膏〞啜︵ň 啜灌﹫ (啜溹 啜曕 啜é啜侧ǖ喋�啜� 啜侧啜栢à 啜掂喋嬥▊ 啜曕┌啜� 啜曕ò喋囙啜�) 啜呧à喋� 啜︵﹣啜ň啜班ň 啜掂ò啜む啜� 啜曕ò啜� 啜侧▓ 啜︵ǜ啜む啜监à啜距▊ 啜ㄠ﹤喋� 啜膏┌啜ň啜� 啜掂﹢ 啜膏〞啜︵ň 啜灌﹫啷�
+pdfjs-editor-add-signature-dialog-title = 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜溹喋溹
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 啜曕啜膏ó
+    .title = 啜曕啜膏ó
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 啜掂ň啜灌
+    .title = 啜掂ň啜灌
+pdfjs-editor-add-signature-image-button = 啜氞喋编à啜�
+    .title = 啜氞喋编à啜�
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 啜嗋í啜`﹪ 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜熰ň啜堗í 啜曕ò喋�
+    .placeholder = 啜嗋í啜`﹪ 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜熰ň啜堗í 啜曕ò喋�
+pdfjs-editor-add-signature-draw-placeholder = 啜嗋í啜`﹪ 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜掂ň啜灌
+pdfjs-editor-add-signature-draw-thickness-range-label = 啜啜熰ň啜�
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 啜掂ü啜距▔啜� 啜侧▓ 啜氞喋溹ň啜�: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 啜呧┍啜ú喋嬥ā 啜曕ò啜� 啜侧▓ 喋炧ň啜囙ú 啜ㄠ﹤喋� 啜囙┍啜ム﹪ 啜栢喋编喋�
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 啜溹ň啜� 啜氞喋编à啜� 喋炧ň啜囙ú啜距▊ 啜ㄠ﹤喋� 啜氞﹣啜`
+       *[other] 啜溹ň啜� 啜氞喋编à啜� 喋炧ň啜囙ú啜距▊ 啜︵﹢ 啜澿ú啜� 啜掂﹪啜栢
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 啜掂ò啜`è (啜é啜侧ǖ喋�啜� 啜侧啜栢à)
+pdfjs-editor-add-signature-description-input =
+    .title = 啜掂ò啜`è (啜é啜侧ǖ喋�啜� 啜侧啜栢à)
+pdfjs-editor-add-signature-description-default-when-drawing = 啜︵ǜ啜む啜监à
+pdfjs-editor-add-signature-clear-button-label = 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜啜熰ň啜�
+pdfjs-editor-add-signature-clear-button =
+    .title = 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜啜熰ň啜�
+pdfjs-editor-add-signature-save-checkbox = 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜膏┌啜ň啜侧
+pdfjs-editor-add-signature-save-warning-message = 啜む﹣啜膏﹢啜� 啜掂┍啜� 啜む啜� 啜掂┍啜� 5 啜膏┌啜ň啜侧﹪ 啜︵ǜ啜む啜监à啜距▊ 啜︵﹢ 啜灌┍啜� 啜む┍啜� 啜呧┍啜喋囙イ 啜灌啜� 啜膏┌啜ň啜侧ǎ 啜侧▓ 啜囙┍啜� 啜ㄠ﹤喋� 啜灌啜距〒啷�
+pdfjs-editor-add-signature-image-upload-error-title = 啜氞喋编à啜� 啜ㄠ﹤喋� 啜呧┍啜ú喋嬥ā 啜ㄠü喋�啜� 啜曕﹢啜むň 啜溹ň 啜膏〞啜苦▎
+pdfjs-editor-add-signature-image-upload-error-description = 啜嗋í啜`﹪ 啜曕è喋堗〞啜多è 啜︵﹢ 啜溹ň啜傕 啜曕ò喋� 啜溹ň啜� 啜灌啜� 啜氞喋编à啜� 啜ㄠ﹤喋� 啜呧啜ň啜撪イ
+pdfjs-editor-add-signature-image-no-data-error-title = 啜囙ǜ 啜氞喋编à啜� 啜ㄠ﹤喋� 啜︵ǜ啜む啜监à 啜掂喋编 啜é啜侧啜� 啜ㄠü喋�啜� 啜溹ň 啜膏〞啜︵ň 啜灌﹫
+pdfjs-editor-add-signature-image-no-data-error-description = 啜掂┍啜栢ò喋� 啜氞喋编à啜� 啜ㄠ﹤喋� 啜呧┍啜ú喋嬥ā 啜曕ò啜� 啜︵﹢ 啜曕啜多啜� 啜曕ò喋嬥イ
+pdfjs-editor-add-signature-error-close-button = 啜┌啜� 啜曕ò喋�
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 啜班┍啜� 啜曕ò喋�
+pdfjs-editor-add-signature-add-button = 啜溹喋溹
+pdfjs-editor-edit-signature-update-button = 啜呧┍啜ā喋囙
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 啜熰喋编í啜`﹢ 啜ㄠ﹤喋� 啜膏啜о
+pdfjs-editor-edit-comment-popup-button =
+    .title = 啜熰喋编í啜`﹢ 啜ㄠ﹤喋� 啜膏啜о
+pdfjs-editor-delete-comment-popup-button-label = 啜熰喋编í啜`﹢ 啜ㄠ﹤喋� 啜灌啜距〒
+pdfjs-editor-delete-comment-popup-button =
+    .title = 啜熰喋编í啜`﹢ 啜ㄠ﹤喋� 啜灌啜距〒
+pdfjs-show-comment-button =
+    .title = 啜熰喋编í啜`﹢ 啜ㄠ﹤喋� 啜掂﹪啜栢ň啜�
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 啜熰喋编í啜`﹢ 啜ㄠ﹤喋� 啜膏啜о
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 啜呧┍啜ā喋囙 啜曕ò喋�
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 啜熰喋编í啜`﹢ 啜溹喋溹
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 啜溹喋溹
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 鈥︵ú啜苦啜`ň 啜多﹣啜班﹤ 啜曕ò喋�
+pdfjs-editor-edit-comment-dialog-cancel-button = 啜班┍啜� 啜曕ò喋�
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 啜熰喋编í啜`﹢ 啜溹喋溹
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 啜ň啜灌﹢ 啜ㄠ﹤喋� 啜é啜侧 (啜︵ǜ啜むň啜掂﹪喋� 啜ム┌啜è喋囙ú/啜嗋è啜侧ň啜堗è啜呧喋堗啜﹫啜傕/啜ò啜むň啜� 啜班┍啜栢é啜� 啜灌﹫)
+pdfjs-toggle-views-manager-button1-label = 啜膏啜苦▎啜� 啜︵ň 啜囙┌啜む啜距ó
+pdfjs-views-manager-sidebar =
+    .aria-label = 啜ň啜灌﹢
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 啜ň啜灌﹢ 啜︵ň 啜嗋〞啜距ò-啜é啜�
+pdfjs-views-manager-view-selector-button =
+    .title = 啜掂﹪啜栢
+pdfjs-views-manager-view-selector-button-label = 啜掂﹪啜栢
+pdfjs-views-manager-pages-title = 啜膏ǐ啜监﹪
+pdfjs-views-manager-outlines-title1 = 啜︵ǜ啜むň啜掂﹪喋� 啜栢ň啜曕ň
+    .title = 啜︵ǜ啜むň啜掂﹪喋� 啜栢ň啜曕ň (啜膏ň啜班﹢啜嗋▊ 啜氞﹢喋涏ň啜� 啜ㄠ﹤喋� 啜﹫啜侧ň啜夃ǎ/啜膏ó喋囙啜� 啜侧▓ 啜︵ 啜掂ň啜� 啜曕ú啜苦┍啜� 啜曕ò喋�)
+pdfjs-views-manager-attachments-title = 啜呧喋堗啜﹫啜傕啜距▊
+pdfjs-views-manager-layers-title1 = 啜侧﹪啜呧ò
+    .title = 啜侧﹪啜呧ò (啜膏ň啜班﹢啜嗋▊ 啜侧﹪啜呧ò啜距▊ 啜ㄠ﹤喋� 啜﹤啜� 啜灌ň啜侧à 啜掂喋编 啜侧﹫ 啜溹ň啜� 啜侧▓ 啜︵ 啜掂ň啜� 啜曕ú啜苦┍啜� 啜曕ò喋�)
+pdfjs-views-manager-pages-option-label = 啜膏ǐ啜监﹪
+pdfjs-views-manager-outlines-option-label = 啜︵ǜ啜むň啜掂﹪喋� 啜嗋▔啜熰ú啜距▓啜�
+pdfjs-views-manager-attachments-option-label = 啜呧喋堗啜﹫啜傕啜距▊
+pdfjs-views-manager-layers-option-label = 啜ò啜むň啜�
+pdfjs-views-manager-add-file-button =
+    .title = 喋炧ň啜囙ú 啜ㄠ﹤喋� 啜溹喋溹
+pdfjs-views-manager-add-file-button-label = 喋炧ň啜囙ú 啜ㄠ﹤喋� 啜溹喋溹
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } 啜氞﹣啜`啜�
+       *[other] { $count } 啜氞﹣啜`﹪
+    }
+pdfjs-views-manager-pages-status-none-action-label = 啜膏喋� 啜氞﹣啜`
+pdfjs-views-manager-pages-status-action-button-label = 啜┌啜︵啜ǜ啜�
+pdfjs-views-manager-pages-status-copy-button-label = 啜曕ň啜﹢ 啜曕ò喋�
+pdfjs-views-manager-pages-status-cut-button-label = 啜曕┍啜熰
+pdfjs-views-manager-pages-status-delete-button-label = 啜灌啜距〒
+pdfjs-views-manager-pages-status-export-selected-button-label = 鈥︵喋佮ǎ喋� 啜ㄠ﹤喋� 啜愢〞啜膏í喋嬥ò啜� 啜曕ò喋�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 啜膏喋� 啜ㄠ﹤喋� 啜曕┍啜熰啜嗋▊
+       *[other] { $count } 啜膏啜苦▎啜� 啜ㄠ﹤喋� 啜曕┍啜熰啜嗋▊
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 啜膏喋� 啜ㄠ﹤喋� 啜曕ň啜﹢ 啜曕﹢啜むň
+       *[other] { $count } 啜膏啜苦▎啜� 啜ㄠ﹤喋� 啜曕ň啜﹢ 啜曕﹢啜むň
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 啜膏喋� 啜ㄠ﹤喋� 啜灌啜距▏啜�
+       *[other] { $count } 啜膏啜苦▎啜� 啜ㄠ﹤喋� 啜灌啜距▏啜�
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 鈥︵à喋佮ü啜距ā喋� 喋炧ň啜囙ú 啜ㄠ﹤喋� 啜む啜嗋ò 啜曕﹢啜むň 啜溹ň 啜班啜灌ň 啜灌﹫
+pdfjs-views-manager-pages-status-waiting-uploading-label = 鈥︵啜距▏啜� 啜ㄠ﹤喋� 啜呧┍啜ú喋嬥ā 啜曕﹢啜むň 啜溹ň 啜班啜灌ň 啜灌﹫
+pdfjs-views-manager-status-warning-cut-label = 啜曕┍啜熰啜� 啜ㄠü喋�啜� 啜溹ň 啜膏〞啜苦▎啷� 啜膏喋� 啜ㄠ﹤喋� 啜むň喋涏ň 啜曕ò啜曕﹪ 啜﹪啜� 啜曕啜多啜� 啜曕ò喋嬥イ
+pdfjs-views-manager-status-warning-copy-label = 啜曕ň啜﹢ 啜ㄠü喋�啜� 啜曕﹢啜むň 啜溹ň 啜膏〞啜苦▎啷� 啜膏喋� 啜ㄠ﹤喋� 啜むň喋涏ň 啜曕ò啜曕﹪ 啜﹪啜� 啜曕啜多啜� 啜曕ò喋嬥イ
+pdfjs-views-manager-status-warning-delete-label = 啜灌啜距▏啜� 啜ㄠü喋�啜� 啜溹ň 啜膏〞啜苦▎啷� 啜膏喋� 啜ㄠ﹤喋� 啜むň喋涏ň 啜曕ò啜曕﹪ 啜﹪啜� 啜曕啜多啜� 啜曕ò喋嬥イ
+pdfjs-views-manager-status-warning-save-label = 啜膏┌啜ň啜侧啜� 啜ㄠü喋�啜� 啜溹ň 啜膏〞啜苦▎啷� 啜膏喋� 啜ㄠ﹤喋� 啜むň喋涏ň 啜曕ò啜曕﹪ 啜﹪啜� 啜曕啜多啜� 啜曕ò喋嬥イ
+pdfjs-views-manager-status-undo-button-label = 啜掂ň啜ǜ
+pdfjs-views-manager-status-done-button-label = 啜﹣啜曕┌啜ú
+pdfjs-views-manager-status-close-button =
+    .title = 啜┌啜� 啜曕ò喋�
+pdfjs-views-manager-status-close-button-label = 啜┌啜� 啜曕ò喋�
+pdfjs-views-manager-paste-button-label = 啜氞﹪啜
+pdfjs-views-manager-paste-button-before =
+    .title = 啜ü啜苦ú喋� 啜膏喋� 啜︵﹪ 啜ň啜呧é 啜氞﹪啜
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = { $page } 啜膏喋� 啜︵﹪ 啜ň啜呧é 啜氞﹪啜
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 啜ㄠǖ啜距▊
+pdfjs-views-manager-waiting-for-file = 鈥︵啜距▏啜� 啜ㄠ﹤喋� 啜呧┍啜ú喋嬥ā 啜曕﹢啜むň 啜溹ň 啜班啜灌ň 啜灌﹫
+pdfjs-toggle-views-manager-button1 =
+    .title = 啜膏啜苦▎啜� 啜︵ň 啜囙┌啜む啜距ó
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 啜膏┌啜ň啜侧﹪ 啜灌啜� 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜灌啜距〒
+pdfjs-editor-delete-signature-button-label1 = 啜膏┌啜ň啜侧﹪ 啜灌啜� 啜︵ǜ啜む啜监à 啜ㄠ﹤喋� 啜灌啜距〒
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 啜掂ò啜`è 啜ㄠ﹤喋� 啜膏啜о
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 啜掂ò啜`è 啜ㄠ﹤喋� 啜膏啜о
diff --git a/public/pdfjs/web/locale/pl/viewer.ftl b/public/pdfjs/web/locale/pl/viewer.ftl
new file mode 100644
index 0000000..5d8e3ed
--- /dev/null
+++ b/public/pdfjs/web/locale/pl/viewer.ftl
@@ -0,0 +1,754 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Poprzednia strona
+pdfjs-previous-button-label = Poprzednia
+pdfjs-next-button =
+    .title = Nast臋pna strona
+pdfjs-next-button-label = Nast臋pna
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Strona
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = z聽{ $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber }聽z聽{ $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Pomniejsz
+pdfjs-zoom-out-button-label = Pomniejsz
+pdfjs-zoom-in-button =
+    .title = Powi臋ksz
+pdfjs-zoom-in-button-label = Powi臋ksz
+pdfjs-zoom-select =
+    .title = Skala
+pdfjs-presentation-mode-button =
+    .title = Prze艂膮cz na tryb prezentacji
+pdfjs-presentation-mode-button-label = Tryb prezentacji
+pdfjs-open-file-button =
+    .title = Otw贸rz plik
+pdfjs-open-file-button-label = Otw贸rz
+pdfjs-print-button =
+    .title = Drukuj
+pdfjs-print-button-label = Drukuj
+pdfjs-save-button =
+    .title = Zapisz
+pdfjs-save-button-label = Zapisz
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Pobierz
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Pobierz
+pdfjs-bookmark-button =
+    .title = Bie偶膮ca strona (adres do otwarcia na bie偶膮cej stronie)
+pdfjs-bookmark-button-label = Bie偶膮ca strona
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Narz臋dzia
+pdfjs-tools-button-label = Narz臋dzia
+pdfjs-first-page-button =
+    .title = Przejd藕 do pierwszej strony
+pdfjs-first-page-button-label = Przejd藕 do pierwszej strony
+pdfjs-last-page-button =
+    .title = Przejd藕 do ostatniej strony
+pdfjs-last-page-button-label = Przejd藕 do ostatniej strony
+pdfjs-page-rotate-cw-button =
+    .title = Obr贸膰 zgodnie z聽ruchem wskaz贸wek zegara
+pdfjs-page-rotate-cw-button-label = Obr贸膰 zgodnie z聽ruchem wskaz贸wek zegara
+pdfjs-page-rotate-ccw-button =
+    .title = Obr贸膰 przeciwnie do ruchu wskaz贸wek zegara
+pdfjs-page-rotate-ccw-button-label = Obr贸膰 przeciwnie do ruchu wskaz贸wek zegara
+pdfjs-cursor-text-select-tool-button =
+    .title = W艂膮cz narz臋dzie zaznaczania tekstu
+pdfjs-cursor-text-select-tool-button-label = Narz臋dzie zaznaczania tekstu
+pdfjs-cursor-hand-tool-button =
+    .title = W艂膮cz narz臋dzie r膮czka
+pdfjs-cursor-hand-tool-button-label = Narz臋dzie r膮czka
+pdfjs-scroll-page-button =
+    .title = Przewijaj strony
+pdfjs-scroll-page-button-label = Przewijanie stron
+pdfjs-scroll-vertical-button =
+    .title = Przewijaj dokument w聽pionie
+pdfjs-scroll-vertical-button-label = Przewijanie pionowe
+pdfjs-scroll-horizontal-button =
+    .title = Przewijaj dokument w聽poziomie
+pdfjs-scroll-horizontal-button-label = Przewijanie poziome
+pdfjs-scroll-wrapped-button =
+    .title = Strony dokumentu wy艣wietlaj i聽przewijaj w聽kolumnach
+pdfjs-scroll-wrapped-button-label = Widok dw贸ch stron
+pdfjs-spread-none-button =
+    .title = Nie ustawiaj stron obok siebie
+pdfjs-spread-none-button-label = Brak kolumn
+pdfjs-spread-odd-button =
+    .title = Strony nieparzyste ustawiaj na lewo od parzystych
+pdfjs-spread-odd-button-label = Nieparzyste po lewej
+pdfjs-spread-even-button =
+    .title = Strony parzyste ustawiaj na lewo od nieparzystych
+pdfjs-spread-even-button-label = Parzyste po lewej
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = W艂a艣ciwo艣ci dokumentu鈥�
+pdfjs-document-properties-button-label = W艂a艣ciwo艣ci dokumentu鈥�
+pdfjs-document-properties-file-name = Nazwa pliku:
+pdfjs-document-properties-file-size = Rozmiar pliku:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) }聽KB ({ $b }聽B)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) }聽MB ({ $b }聽B)
+pdfjs-document-properties-title = Tytu艂:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Temat:
+pdfjs-document-properties-keywords = S艂owa kluczowe:
+pdfjs-document-properties-creation-date = Data utworzenia:
+pdfjs-document-properties-modification-date = Data modyfikacji:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Utworzony przez:
+pdfjs-document-properties-producer = PDF wyprodukowany przez:
+pdfjs-document-properties-version = Wersja PDF:
+pdfjs-document-properties-page-count = Liczba stron:
+pdfjs-document-properties-page-size = Wymiary strony:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = pionowa
+pdfjs-document-properties-page-size-orientation-landscape = pozioma
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = US Letter
+pdfjs-document-properties-page-size-name-legal = US Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width }脳{ $height }聽{ $unit } (orientacja { $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width }脳{ $height }聽{ $unit } ({ $name }, orientacja { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Szybki podgl膮d w聽Internecie:
+pdfjs-document-properties-linearized-yes = tak
+pdfjs-document-properties-linearized-no = nie
+pdfjs-document-properties-close-button = Zamknij
+
+## Print
+
+pdfjs-print-progress-message = Przygotowywanie dokumentu do druku鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Anuluj
+pdfjs-printing-not-supported = Ostrze偶enie: drukowanie nie jest w聽pe艂ni obs艂ugiwane przez t臋 przegl膮dark臋.
+pdfjs-printing-not-ready = Ostrze偶enie: dokument PDF nie jest ca艂kowicie wczytany, wi臋c nie mo偶na go wydrukowa膰.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Prze艂膮cz panel boczny
+pdfjs-toggle-sidebar-notification-button =
+    .title = Prze艂膮cz panel boczny (dokument zawiera konspekt/za艂膮czniki/warstwy)
+pdfjs-toggle-sidebar-button-label = Prze艂膮cz panel boczny
+pdfjs-document-outline-button =
+    .title = Konspekt dokumentu (podw贸jne klikni臋cie rozwija lub zwija wszystkie pozycje)
+pdfjs-document-outline-button-label = Konspekt dokumentu
+pdfjs-attachments-button =
+    .title = Za艂膮czniki
+pdfjs-attachments-button-label = Za艂膮czniki
+pdfjs-layers-button =
+    .title = Warstwy (podw贸jne klikni臋cie przywraca wszystkie warstwy do stanu domy艣lnego)
+pdfjs-layers-button-label = Warstwy
+pdfjs-thumbs-button =
+    .title = Miniatury
+pdfjs-thumbs-button-label = Miniatury
+pdfjs-current-outline-item-button =
+    .title = Znajd藕 bie偶膮cy element konspektu
+pdfjs-current-outline-item-button-label = Bie偶膮cy element konspektu
+pdfjs-findbar-button =
+    .title = Znajd藕 w聽dokumencie
+pdfjs-findbar-button-label = Znajd藕
+pdfjs-additional-layers = Dodatkowe warstwy
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page }. strona
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura { $page }. strony
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Zaznacz { $page }. stron臋
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = { $page }. strona z聽{ $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Znajd藕
+    .placeholder = Znajd藕 w聽dokumencie鈥�
+pdfjs-find-previous-button =
+    .title = Znajd藕 poprzednie wyst膮pienie tekstu
+pdfjs-find-previous-button-label = Poprzednie
+pdfjs-find-next-button =
+    .title = Znajd藕 nast臋pne wyst膮pienie tekstu
+pdfjs-find-next-button-label = Nast臋pne
+pdfjs-find-highlight-checkbox = Wyr贸偶nianie wszystkich
+pdfjs-find-match-case-checkbox-label = Rozr贸偶nianie wielko艣ci liter
+pdfjs-find-match-diacritics-checkbox-label = Rozr贸偶nianie liter diakrytyzowanych
+pdfjs-find-entire-word-checkbox-label = Ca艂e s艂owa
+pdfjs-find-reached-top = Pocz膮tek dokumentu. Wyszukiwanie od ko艅ca.
+pdfjs-find-reached-bottom = Koniec dokumentu. Wyszukiwanie od pocz膮tku.
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current }. z聽{ $total } trafienia
+        [few] { $current }. z聽{ $total } trafie艅
+       *[many] { $current }. z聽{ $total } trafie艅
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Wi臋cej ni偶 { $limit } trafienie
+        [few] Wi臋cej ni偶 { $limit } trafienia
+       *[many] Wi臋cej ni偶 { $limit } trafie艅
+    }
+pdfjs-find-not-found = Nie znaleziono tekstu
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Szeroko艣膰 strony
+pdfjs-page-scale-fit = Dopasowanie strony
+pdfjs-page-scale-auto = Skala automatyczna
+pdfjs-page-scale-actual = Rozmiar oryginalny
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = { $page }. strona
+
+## Loading indicator messages
+
+pdfjs-loading-error = Podczas wczytywania dokumentu PDF wyst膮pi艂 b艂膮d.
+pdfjs-invalid-file-error = Nieprawid艂owy lub uszkodzony plik PDF.
+pdfjs-missing-file-error = Brak pliku PDF.
+pdfjs-unexpected-response-error = Nieoczekiwana odpowied藕 serwera.
+pdfjs-rendering-error = Podczas renderowania strony wyst膮pi艂 b艂膮d.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Przypis: { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Wpisz has艂o, aby otworzy膰 ten dokument PDF.
+pdfjs-password-invalid = Nieprawid艂owe has艂o. Prosz臋 spr贸bowa膰 ponownie.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Anuluj
+pdfjs-web-fonts-disabled = Czcionki sieciowe s膮 wy艂膮czone: nie mo偶na u偶y膰 osadzonych czcionek PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Zmie艅 kolor tekstu
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Rysunek
+pdfjs-editor-color-picker-ink-input =
+    .title = Zmie艅 kolor rysunku
+pdfjs-editor-ink-button-label = Rysunek
+pdfjs-editor-stamp-button =
+    .title = Dodaj lub edytuj obrazy
+pdfjs-editor-stamp-button-label = Dodaj lub edytuj obrazy
+pdfjs-editor-highlight-button =
+    .title = Wyr贸偶nij
+pdfjs-editor-highlight-button-label = Wyr贸偶nij
+pdfjs-highlight-floating-button1 =
+    .title = Wyr贸偶nij
+    .aria-label = Wyr贸偶nij
+pdfjs-highlight-floating-button-label = Wyr贸偶nij
+pdfjs-comment-floating-button =
+    .title = Dodaj komentarz
+    .aria-label = Dodaj komentarz
+pdfjs-comment-floating-button-label = Dodaj komentarz
+pdfjs-editor-comment-button =
+    .title = Dodaj komentarz
+    .aria-label = Dodaj komentarz
+pdfjs-editor-comment-button-label = Dodaj komentarz
+pdfjs-editor-signature-button =
+    .title = Dodaj podpis
+pdfjs-editor-signature-button-label = Dodaj podpis
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Edytor wyr贸偶nienia
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Edytor rysunku
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Edytor podpisu: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Edytor obrazu
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Usu艅 rysunek
+pdfjs-editor-remove-freetext-button =
+    .title = Usu艅 tekst
+pdfjs-editor-remove-stamp-button =
+    .title = Usu艅 obraz
+pdfjs-editor-remove-highlight-button =
+    .title = Usu艅 wyr贸偶nienie
+pdfjs-editor-remove-signature-button =
+    .title = Usu艅 podpis
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Kolor
+pdfjs-editor-free-text-size-input = Rozmiar
+pdfjs-editor-ink-color-input = Kolor
+pdfjs-editor-ink-thickness-input = Grubo艣膰
+pdfjs-editor-ink-opacity-input = Nieprzezroczysto艣膰
+pdfjs-editor-stamp-add-image-button =
+    .title = Dodaj obraz
+pdfjs-editor-stamp-add-image-button-label = Dodaj obraz
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Grubo艣膰
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Zmie艅 grubo艣膰 podczas wyr贸偶niania element贸w innych ni偶 tekst
+pdfjs-editor-add-signature-container =
+    .aria-label = Sterowanie podpisami i聽zachowane podpisy
+pdfjs-editor-signature-add-signature-button =
+    .title = Dodaj nowy podpis
+pdfjs-editor-signature-add-signature-button-label = Dodaj nowy podpis
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Zachowany podpis: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Edytor tekstu
+    .default-content = Zacznij pisa膰鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Komentarz
+       *[other] Komentarze
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Zamknij panel boczny
+    .aria-label = Zamknij panel boczny
+pdfjs-editor-comments-sidebar-close-button-label = Zamknij panel boczny
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Widzisz co艣 godnego uwagi? Wyr贸偶nij to i聽zostaw komentarz.
+pdfjs-editor-comments-sidebar-no-comments-link = Wi臋cej informacji
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Tekst alternatywny
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Edytuj tekst alternatywny
+pdfjs-editor-alt-text-dialog-label = Wybierz opcj臋
+pdfjs-editor-alt-text-dialog-description = Tekst alternatywny pomaga, kiedy kto艣 nie mo偶e zobaczy膰 obrazu lub gdy si臋 nie wczytuje.
+pdfjs-editor-alt-text-add-description-label = Dodaj opis
+pdfjs-editor-alt-text-add-description-description = Staraj si臋 napisa膰 1-2 zdania opisuj膮ce temat, miejsce lub dzia艂ania.
+pdfjs-editor-alt-text-mark-decorative-label = Oznacz jako dekoracyjne
+pdfjs-editor-alt-text-mark-decorative-description = U偶ywane w聽przypadku obraz贸w ozdobnych, takich jak obramowania lub znaki wodne.
+pdfjs-editor-alt-text-cancel-button = Anuluj
+pdfjs-editor-alt-text-save-button = Zapisz
+pdfjs-editor-alt-text-decorative-tooltip = Oznaczone jako dekoracyjne
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Na przyk艂ad: 鈥濵艂ody cz艂owiek siada przy stole, aby zje艣膰 posi艂ek鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Tekst alternatywny
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Lewy g贸rny r贸g 鈥� zmie艅 rozmiar
+pdfjs-editor-resizer-top-middle =
+    .aria-label = G贸rny 艣rodkowy 鈥� zmie艅 rozmiar
+pdfjs-editor-resizer-top-right =
+    .aria-label = Prawy g贸rny r贸g 鈥� zmie艅 rozmiar
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Prawy 艣rodkowy 鈥� zmie艅 rozmiar
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Prawy dolny r贸g 鈥� zmie艅 rozmiar
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Dolny 艣rodkowy 鈥� zmie艅 rozmiar
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Lewy dolny r贸g 鈥� zmie艅 rozmiar
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Lewy 艣rodkowy 鈥� zmie艅 rozmiar
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Kolor wyr贸偶nienia
+pdfjs-editor-colorpicker-button =
+    .title = Zmie艅 kolor
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Wyb贸r kolor贸w
+pdfjs-editor-colorpicker-yellow =
+    .title = 呕贸艂ty
+pdfjs-editor-colorpicker-green =
+    .title = Zielony
+pdfjs-editor-colorpicker-blue =
+    .title = Niebieski
+pdfjs-editor-colorpicker-pink =
+    .title = R贸偶owy
+pdfjs-editor-colorpicker-red =
+    .title = Czerwony
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Poka偶 wszystkie
+pdfjs-editor-highlight-show-all-button =
+    .title = Poka偶 wszystkie
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Edytuj tekst alternatywny (opis obrazu)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Dodaj tekst alternatywny (opis obrazu)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Napisz tutaj opis鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kr贸tki opis dla os贸b, kt贸re nie widz膮 obrazu lub kiedy obraz si臋 nie wczytuje.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Ten tekst alternatywny zosta艂 utworzony automatycznie i聽mo偶e by膰 niepoprawny.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Wi臋cej informacji
+pdfjs-editor-new-alt-text-create-automatically-button-label = Automatycznie utw贸rz tekst alternatywny
+pdfjs-editor-new-alt-text-not-now-button = Nie teraz
+pdfjs-editor-new-alt-text-error-title = Nie mo偶na automatycznie utworzy膰 tekstu alternatywnego
+pdfjs-editor-new-alt-text-error-description = Prosz臋 napisa膰 w艂asny tekst alternatywny lub spr贸bowa膰 ponownie p贸藕niej.
+pdfjs-editor-new-alt-text-error-close-button = Zamknij
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Pobieranie modelu SI tekstu alternatywnego ({ $downloadedSize } z聽{ $totalSize }聽MB)
+    .aria-valuetext = Pobieranie modelu SI tekstu alternatywnego ({ $downloadedSize } z聽{ $totalSize }聽MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Dodano tekst alternatywny
+pdfjs-editor-new-alt-text-added-button-label = Dodano tekst alternatywny
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Brak tekstu alternatywnego
+pdfjs-editor-new-alt-text-missing-button-label = Brak tekstu alternatywnego
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Przejrzyj tekst alternatywny
+pdfjs-editor-new-alt-text-to-review-button-label = Przejrzyj tekst alternatywny
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Utworzono automatycznie: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Ustawienia tekstu alternatywnego obraz贸w
+pdfjs-image-alt-text-settings-button-label = Ustawienia tekstu alternatywnego obraz贸w
+pdfjs-editor-alt-text-settings-dialog-label = Ustawienia tekstu alternatywnego obraz贸w
+pdfjs-editor-alt-text-settings-automatic-title = Automatyczny tekst alternatywny
+pdfjs-editor-alt-text-settings-create-model-button-label = Automatyczne tworzenie tekstu alternatywnego
+pdfjs-editor-alt-text-settings-create-model-description = Podpowiada opisy, kt贸re mog膮 pom贸c osobom, kt贸re nie widz膮 obrazu lub kiedy obraz si臋 nie wczytuje.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model SI tekstu alternatywnego ({ $totalSize }聽MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Dzia艂a lokalnie na urz膮dzeniu u偶ytkownika, wi臋c Twoje dane pozostaj膮 prywatne. Wymagane do funkcji automatycznego tekstu alternatywnego.
+pdfjs-editor-alt-text-settings-delete-model-button = Usu艅
+pdfjs-editor-alt-text-settings-download-model-button = Pobierz
+pdfjs-editor-alt-text-settings-downloading-model-button = Pobieranie鈥�
+pdfjs-editor-alt-text-settings-editor-title = Edytor tekstu alternatywnego
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Wy艣wietlanie edytora tekstu alternatywnego od razu po dodaniu obrazu
+pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga upewni膰 si臋, 偶e wszystkie obrazy maj膮 tekst alternatywny.
+pdfjs-editor-alt-text-settings-close-button = Zamknij
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Dodano wyr贸偶nione
+pdfjs-editor-freetext-added-alert = Dodano tekst
+pdfjs-editor-ink-added-alert = Dodano rysunek
+pdfjs-editor-stamp-added-alert = Dodano obraz
+pdfjs-editor-signature-added-alert = Dodano podpis
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Usuni臋to wyr贸偶nienie
+pdfjs-editor-undo-bar-message-freetext = Usuni臋to tekst
+pdfjs-editor-undo-bar-message-ink = Usuni臋to rysunek
+pdfjs-editor-undo-bar-message-stamp = Usuni臋to obraz
+pdfjs-editor-undo-bar-message-signature = Usuni臋to podpis
+pdfjs-editor-undo-bar-message-comment = Usuni臋to komentarz
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] Usuni臋to przypis
+        [few] Usuni臋to { $count } przypisy
+       *[many] Usuni臋to { $count } przypis贸w
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Cofnij
+pdfjs-editor-undo-bar-undo-button-label = Cofnij
+pdfjs-editor-undo-bar-close-button =
+    .title = Zamknij
+pdfjs-editor-undo-bar-close-button-label = Zamknij
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = To okno umo偶liwia utworzenie podpisu, kt贸ry mo偶na doda膰 do dokumentu PDF. Mo偶na zmieni膰 nazw臋 (kt贸ra s艂u偶y tak偶e jako tekst alternatywny) i聽opcjonalnie zachowa膰 podpis do ponownego u偶ycia.
+pdfjs-editor-add-signature-dialog-title = Dodanie podpisu
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Wpisz
+    .title = Wpisz
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Narysuj
+    .title = Narysuj
+pdfjs-editor-add-signature-image-button = Obraz
+    .title = Obraz
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Wpisz sw贸j podpis
+    .placeholder = Wpisz sw贸j podpis
+pdfjs-editor-add-signature-draw-placeholder = Narysuj sw贸j podpis
+pdfjs-editor-add-signature-draw-thickness-range-label = Grubo艣膰
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Grubo艣膰 kreski: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Przeci膮gnij tutaj plik, aby go przes艂a膰
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Lub wybierz plik obrazu
+       *[other] Lub przegl膮daj pliki obraz贸w
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Opis (tekst alternatywny)
+pdfjs-editor-add-signature-description-input =
+    .title = Opis (tekst alternatywny)
+pdfjs-editor-add-signature-description-default-when-drawing = Podpis
+pdfjs-editor-add-signature-clear-button-label = Usu艅 podpis
+pdfjs-editor-add-signature-clear-button =
+    .title = Usu艅 podpis
+pdfjs-editor-add-signature-save-checkbox = Zachowaj podpis
+pdfjs-editor-add-signature-save-warning-message = Osi膮gni臋to ograniczenie wynosz膮ce pi臋膰 zachowanych podpis贸w. Usu艅 jeden, aby zachowa膰 wi臋cej.
+pdfjs-editor-add-signature-image-upload-error-title = Nie mo偶na przes艂a膰 obrazu
+pdfjs-editor-add-signature-image-upload-error-description = Sprawd藕 po艂膮czenie sieciowe lub spr贸buj przes艂a膰 inny obraz.
+pdfjs-editor-add-signature-image-no-data-error-title = Nie mo偶na przekonwertowa膰 tego obrazu na podpis
+pdfjs-editor-add-signature-image-no-data-error-description = Spr贸buj przes艂a膰 inny obraz.
+pdfjs-editor-add-signature-error-close-button = Zamknij
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Anuluj
+pdfjs-editor-add-signature-add-button = Dodaj
+pdfjs-editor-edit-signature-update-button = Aktualizuj
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Edytuj komentarz
+pdfjs-editor-edit-comment-popup-button =
+    .title = Edytuj komentarz
+pdfjs-editor-delete-comment-popup-button-label = Usu艅 komentarz
+pdfjs-editor-delete-comment-popup-button =
+    .title = Usu艅 komentarz
+pdfjs-show-comment-button =
+    .title = Wy艣wietl komentarz
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Edytuj komentarz
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizuj
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentarz
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Zacznij pisa膰鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Anuluj
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Dodaj komentarz
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Prze艂膮cz panel boczny (dokument zawiera miniatury/konspekt/za艂膮czniki/warstwy)
+pdfjs-toggle-views-manager-button1-label = Zarz膮dzaj stronami
+pdfjs-views-manager-sidebar =
+    .aria-label = Panel boczny
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Zmiana rozmiaru panelu bocznego
+pdfjs-views-manager-view-selector-button =
+    .title = Widoki
+pdfjs-views-manager-view-selector-button-label = Widoki
+pdfjs-views-manager-pages-title = Strony
+pdfjs-views-manager-outlines-title1 = Konspekt dokumentu
+    .title = Konspekt dokumentu (podw贸jne klikni臋cie rozwija lub zwija wszystkie pozycje)
+pdfjs-views-manager-attachments-title = Za艂膮czniki
+pdfjs-views-manager-layers-title1 = Warstwy
+    .title = Warstwy (podw贸jne klikni臋cie przywraca wszystkie warstwy do stanu domy艣lnego)
+pdfjs-views-manager-pages-option-label = Strony
+pdfjs-views-manager-outlines-option-label = Konspekt dokumentu
+pdfjs-views-manager-attachments-option-label = Za艂膮czniki
+pdfjs-views-manager-layers-option-label = Warstwy
+pdfjs-views-manager-add-file-button =
+    .title = Dodaj plik
+pdfjs-views-manager-add-file-button-label = Dodaj plik
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } zaznaczona
+        [few] { $count } zaznaczone
+       *[many] { $count } zaznaczonych
+    }
+pdfjs-views-manager-pages-status-none-action-label = Zaznacz strony
+pdfjs-views-manager-pages-status-action-button-label = Zarz膮dzaj
+pdfjs-views-manager-pages-status-copy-button-label = Kopiuj
+pdfjs-views-manager-pages-status-cut-button-label = Wytnij
+pdfjs-views-manager-pages-status-delete-button-label = Usu艅
+pdfjs-views-manager-pages-status-export-selected-button-label = Eksportuj zaznaczone鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] Wyci臋to 1 stron臋
+        [few] Wyci臋to { $count } strony
+       *[many] Wyci臋to { $count } stron
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] Skopiowano 1 stron臋
+        [few] Skopiowano { $count } strony
+       *[many] Skopiowano { $count } stron
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] Usuni臋to 1 stron臋
+        [few] Usuni臋to { $count } strony
+       *[many] Usuni臋to { $count } stron
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Przygotowywanie pliku鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Przesy艂anie pliku鈥�
+pdfjs-views-manager-status-warning-cut-label = Nie uda艂o si臋 wyci膮膰. Od艣wie偶 stron臋 i聽spr贸buj ponownie.
+pdfjs-views-manager-status-warning-copy-label = Nie uda艂o si臋 skopiowa膰. Od艣wie偶 stron臋 i聽spr贸buj ponownie.
+pdfjs-views-manager-status-warning-delete-label = Nie uda艂o si臋 usun膮膰. Od艣wie偶 stron臋 i聽spr贸buj ponownie.
+pdfjs-views-manager-status-warning-save-label = Nie uda艂o si臋 zachowa膰. Od艣wie偶 stron臋 i聽spr贸buj ponownie.
+pdfjs-views-manager-status-undo-button-label = Cofnij
+pdfjs-views-manager-status-done-button-label = Gotowe
+pdfjs-views-manager-status-close-button =
+    .title = Zamknij
+pdfjs-views-manager-status-close-button-label = Zamknij
+pdfjs-views-manager-paste-button-label = Wklej
+pdfjs-views-manager-paste-button-before =
+    .title = Wklej przed pierwsz膮 stron膮
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Wklej po { $page }. stronie
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = Nowe
+pdfjs-views-manager-waiting-for-file = Przesy艂anie pliku鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Zarz膮dzaj stronami
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Usu艅 zachowany podpis
+pdfjs-editor-delete-signature-button-label1 = Usu艅 zachowany podpis
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Edytuj opis
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Edycja opisu
diff --git a/public/pdfjs/web/locale/pt-BR/viewer.ftl b/public/pdfjs/web/locale/pt-BR/viewer.ftl
new file mode 100644
index 0000000..c95f7e5
--- /dev/null
+++ b/public/pdfjs/web/locale/pt-BR/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩gina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = Pr贸xima p谩gina
+pdfjs-next-button-label = Pr贸xima
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P谩gina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Reduzir
+pdfjs-zoom-out-button-label = Reduzir
+pdfjs-zoom-in-button =
+    .title = Ampliar
+pdfjs-zoom-in-button-label = Ampliar
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Mudar para o modo de apresenta莽茫o
+pdfjs-presentation-mode-button-label = Modo de apresenta莽茫o
+pdfjs-open-file-button =
+    .title = Abrir arquivo
+pdfjs-open-file-button-label = Abrir
+pdfjs-print-button =
+    .title = Imprimir
+pdfjs-print-button-label = Imprimir
+pdfjs-save-button =
+    .title = Salvar
+pdfjs-save-button-label = Salvar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Baixar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Baixar
+pdfjs-bookmark-button =
+    .title = P谩gina atual (ver URL da p谩gina atual)
+pdfjs-bookmark-button-label = Pagina atual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ferramentas
+pdfjs-tools-button-label = Ferramentas
+pdfjs-first-page-button =
+    .title = Ir para a primeira p谩gina
+pdfjs-first-page-button-label = Ir para a primeira p谩gina
+pdfjs-last-page-button =
+    .title = Ir para a 煤ltima p谩gina
+pdfjs-last-page-button-label = Ir para a 煤ltima p谩gina
+pdfjs-page-rotate-cw-button =
+    .title = Girar no sentido hor谩rio
+pdfjs-page-rotate-cw-button-label = Girar no sentido hor谩rio
+pdfjs-page-rotate-ccw-button =
+    .title = Girar no sentido anti-hor谩rio
+pdfjs-page-rotate-ccw-button-label = Girar no sentido anti-hor谩rio
+pdfjs-cursor-text-select-tool-button =
+    .title = Ativar a ferramenta de sele莽茫o de texto
+pdfjs-cursor-text-select-tool-button-label = Ferramenta de sele莽茫o de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Ativar ferramenta de deslocamento
+pdfjs-cursor-hand-tool-button-label = Ferramenta de deslocamento
+pdfjs-scroll-page-button =
+    .title = Usar rolagem de p谩gina
+pdfjs-scroll-page-button-label = Rolagem de p谩gina
+pdfjs-scroll-vertical-button =
+    .title = Usar deslocamento vertical
+pdfjs-scroll-vertical-button-label = Deslocamento vertical
+pdfjs-scroll-horizontal-button =
+    .title = Usar deslocamento horizontal
+pdfjs-scroll-horizontal-button-label = Deslocamento horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Usar deslocamento contido
+pdfjs-scroll-wrapped-button-label = Deslocamento contido
+pdfjs-spread-none-button =
+    .title = N茫o reagrupar p谩ginas
+pdfjs-spread-none-button-label = N茫o estender
+pdfjs-spread-odd-button =
+    .title = Agrupar p谩ginas come莽ando em p谩ginas com n煤meros 铆mpares
+pdfjs-spread-odd-button-label = Estender 铆mpares
+pdfjs-spread-even-button =
+    .title = Agrupar p谩ginas come莽ando em p谩ginas com n煤meros pares
+pdfjs-spread-even-button-label = Estender pares
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propriedades do documento鈥�
+pdfjs-document-properties-button-label = Propriedades do documento鈥�
+pdfjs-document-properties-file-name = Nome do arquivo:
+pdfjs-document-properties-file-size = Tamanho do arquivo:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = T铆tulo:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Assunto:
+pdfjs-document-properties-keywords = Palavras-chave:
+pdfjs-document-properties-creation-date = Data da cria莽茫o:
+pdfjs-document-properties-modification-date = Data da modifica莽茫o:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Cria莽茫o:
+pdfjs-document-properties-producer = Criador do PDF:
+pdfjs-document-properties-version = Vers茫o do PDF:
+pdfjs-document-properties-page-count = N煤mero de p谩ginas:
+pdfjs-document-properties-page-size = Tamanho da p谩gina:
+pdfjs-document-properties-page-size-unit-inches = pol.
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = retrato
+pdfjs-document-properties-page-size-orientation-landscape = paisagem
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Jur铆dico
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Exibi莽茫o web r谩pida:
+pdfjs-document-properties-linearized-yes = Sim
+pdfjs-document-properties-linearized-no = N茫o
+pdfjs-document-properties-close-button = Fechar
+
+## Print
+
+pdfjs-print-progress-message = Preparando documento para impress茫o鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress } %
+pdfjs-print-progress-close-button = Cancelar
+pdfjs-printing-not-supported = Aviso: a impress茫o n茫o 茅 totalmente suportada neste navegador.
+pdfjs-printing-not-ready = Aviso: o PDF n茫o est谩 totalmente carregado para impress茫o.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Exibir/ocultar painel lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Exibir/ocultar painel lateral (documento cont茅m estrutura/anexos/camadas)
+pdfjs-toggle-sidebar-button-label = Exibir/ocultar painel lateral
+pdfjs-document-outline-button =
+    .title = Mostrar estrutura do documento (duplo-clique expande/recolhe todos os itens)
+pdfjs-document-outline-button-label = Estrutura do documento
+pdfjs-attachments-button =
+    .title = Mostrar anexos
+pdfjs-attachments-button-label = Anexos
+pdfjs-layers-button =
+    .title = Mostrar camadas (duplo-clique redefine todas as camadas ao estado predefinido)
+pdfjs-layers-button-label = Camadas
+pdfjs-thumbs-button =
+    .title = Mostrar miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Encontrar item atual da estrutura
+pdfjs-current-outline-item-button-label = Item atual da estrutura
+pdfjs-findbar-button =
+    .title = Procurar no documento
+pdfjs-findbar-button-label = Procurar
+pdfjs-additional-layers = Camadas adicionais
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura da p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Selecionar p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = P谩gina { $page } de { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Procurar
+    .placeholder = Procurar no documento鈥�
+pdfjs-find-previous-button =
+    .title = Procurar a ocorr锚ncia anterior da frase
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button =
+    .title = Procurar a pr贸xima ocorr锚ncia da frase
+pdfjs-find-next-button-label = Pr贸xima
+pdfjs-find-highlight-checkbox = Destacar tudo
+pdfjs-find-match-case-checkbox-label = Diferenciar mai煤sculas/min煤sculas
+pdfjs-find-match-diacritics-checkbox-label = Considerar acentua莽茫o
+pdfjs-find-entire-word-checkbox-label = Palavras completas
+pdfjs-find-reached-top = In铆cio do documento alcan莽ado, continuando do fim
+pdfjs-find-reached-bottom = Fim do documento alcan莽ado, continuando do in铆cio
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } de { $total } ocorr锚ncia
+       *[other] { $current } de { $total } ocorr锚ncias
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mais de { $limit } ocorr锚ncia
+       *[other] Mais de { $limit } ocorr锚ncias
+    }
+pdfjs-find-not-found = N茫o encontrado
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Largura da p谩gina
+pdfjs-page-scale-fit = Ajustar 脿 janela
+pdfjs-page-scale-auto = Zoom autom谩tico
+pdfjs-page-scale-actual = Tamanho real
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P谩gina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ocorreu um erro ao carregar o PDF.
+pdfjs-invalid-file-error = Arquivo PDF corrompido ou inv谩lido.
+pdfjs-missing-file-error = Arquivo PDF ausente.
+pdfjs-unexpected-response-error = Resposta inesperada do servidor.
+pdfjs-rendering-error = Ocorreu um erro ao renderizar a p谩gina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anota莽茫o { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Forne莽a a senha para abrir este arquivo PDF.
+pdfjs-password-invalid = Senha inv谩lida. Tente novamente.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Cancelar
+pdfjs-web-fonts-disabled = As fontes web est茫o desativadas: n茫o foi poss铆vel usar fontes incorporadas do PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texto
+pdfjs-editor-color-picker-free-text-input =
+    .title = Mudar cor do texto
+pdfjs-editor-free-text-button-label = Texto
+pdfjs-editor-ink-button =
+    .title = Desenho
+pdfjs-editor-color-picker-ink-input =
+    .title = Mudar cor do desenho
+pdfjs-editor-ink-button-label = Desenho
+pdfjs-editor-stamp-button =
+    .title = Adicionar ou editar imagens
+pdfjs-editor-stamp-button-label = Adicionar ou editar imagens
+pdfjs-editor-highlight-button =
+    .title = Destaque
+pdfjs-editor-highlight-button-label = Destaque
+pdfjs-highlight-floating-button1 =
+    .title = Destaque
+    .aria-label = Destaque
+pdfjs-highlight-floating-button-label = Destaque
+pdfjs-comment-floating-button =
+    .title = Coment谩rio
+    .aria-label = Coment谩rio
+pdfjs-comment-floating-button-label = Coment谩rio
+pdfjs-editor-comment-button =
+    .title = Comentar
+    .aria-label = Comentar
+pdfjs-editor-comment-button-label = Comentar
+pdfjs-editor-signature-button =
+    .title = Adicionar assinatura
+pdfjs-editor-signature-button-label = Adicionar assinatura
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de destaque
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de desenho
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de assinatura: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de imagem
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Remover desenho
+pdfjs-editor-remove-freetext-button =
+    .title = Remover texto
+pdfjs-editor-remove-stamp-button =
+    .title = Remover imagem
+pdfjs-editor-remove-highlight-button =
+    .title = Remover destaque
+pdfjs-editor-remove-signature-button =
+    .title = Remover assinatura
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Cor
+pdfjs-editor-free-text-size-input = Tamanho
+pdfjs-editor-ink-color-input = Cor
+pdfjs-editor-ink-thickness-input = Espessura
+pdfjs-editor-ink-opacity-input = Opacidade
+pdfjs-editor-stamp-add-image-button =
+    .title = Adicionar imagem
+pdfjs-editor-stamp-add-image-button-label = Adicionar imagem
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Espessura
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Mudar espessura ao destacar itens que n茫o s茫o texto
+pdfjs-editor-add-signature-container =
+    .aria-label = Controles de assinatura e assinaturas salvas
+pdfjs-editor-signature-add-signature-button =
+    .title = Adicionar nova assinatura
+pdfjs-editor-signature-add-signature-button-label = Adicionar nova assinatura
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Assinatura salva: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de texto
+    .default-content = Comece a digitar鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Coment谩rio
+       *[other] Coment谩rios
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Fechar painel lateral
+    .aria-label = Fechar painel lateral
+pdfjs-editor-comments-sidebar-close-button-label = Fechar painel lateral
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Viu algo digno de aten莽茫o? Destaque e deixe um coment谩rio.
+pdfjs-editor-comments-sidebar-no-comments-link = Saiba mais
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texto alternativo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editar texto alternativo
+pdfjs-editor-alt-text-dialog-label = Escolha uma op莽茫o
+pdfjs-editor-alt-text-dialog-description = O texto alternativo ajuda quando uma imagem n茫o aparece ou n茫o 茅 carregada.
+pdfjs-editor-alt-text-add-description-label = Adicionar uma descri莽茫o
+pdfjs-editor-alt-text-add-description-description = Procure usar uma ou duas frases que descrevam o assunto, cen谩rio ou a莽茫o.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa
+pdfjs-editor-alt-text-mark-decorative-description = Isto 茅 usado em imagens ornamentais, como bordas ou marcas d'谩gua.
+pdfjs-editor-alt-text-cancel-button = Cancelar
+pdfjs-editor-alt-text-save-button = Salvar
+pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativa
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Por exemplo, 鈥淯m jovem senta-se 脿 mesa para comer uma refei莽茫o鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texto alternativo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Canto superior esquerdo 鈥� redimensionar
+pdfjs-editor-resizer-top-middle =
+    .aria-label = No centro do topo 鈥� redimensionar
+pdfjs-editor-resizer-top-right =
+    .aria-label = Canto superior direito 鈥� redimensionar
+pdfjs-editor-resizer-middle-right =
+    .aria-label = No meio 脿 direita 鈥� redimensionar
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Canto inferior direito 鈥� redimensionar
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = No centro da base 鈥� redimensionar
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Canto inferior esquerdo 鈥� redimensionar
+pdfjs-editor-resizer-middle-left =
+    .aria-label = No meio 脿 esquerda 鈥� redimensionar
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Cor de destaque
+pdfjs-editor-colorpicker-button =
+    .title = Mudar cor
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Op莽玫es de cores
+pdfjs-editor-colorpicker-yellow =
+    .title = Amarelo
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Azul
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Vermelho
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mostrar todos
+pdfjs-editor-highlight-show-all-button =
+    .title = Mostrar todos
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descri莽茫o da imagem)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Adicionar texto alternativo (descri莽茫o da imagem)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Voc锚 pode escrever uma descri莽茫o aqui鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Descri莽茫o curta para pessoas que n茫o conseguem ver a imagem ou quando a imagem n茫o 茅 carregada.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo foi criado automaticamente, pode n茫o estar correto.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saiba mais
+pdfjs-editor-new-alt-text-create-automatically-button-label = Criar texto alternativo automaticamente
+pdfjs-editor-new-alt-text-not-now-button = Agora n茫o
+pdfjs-editor-new-alt-text-error-title = N茫o foi poss铆vel criar texto alternativo automaticamente
+pdfjs-editor-new-alt-text-error-description = Escreva seu pr贸prio texto alternativo ou tente novamente mais tarde.
+pdfjs-editor-new-alt-text-error-close-button = Fechar
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Baixando modelo de intelig锚ncia artificial de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = Baixando modelo de intelig锚ncia artificial de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Texto alternativo adicionado
+pdfjs-editor-new-alt-text-added-button-label = Texto alternativo adicionado
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Sem texto alternativo
+pdfjs-editor-new-alt-text-missing-button-label = Sem texto alternativo
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Revisar texto alternativo
+pdfjs-editor-new-alt-text-to-review-button-label = Revisar texto alternativo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Criado automaticamente: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Configura莽玫es de texto alternativo de imagens
+pdfjs-image-alt-text-settings-button-label = Configura莽玫es de texto alternativo de imagens
+pdfjs-editor-alt-text-settings-dialog-label = Configura莽玫es de texto alternativo de imagens
+pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo autom谩tico
+pdfjs-editor-alt-text-settings-create-model-button-label = Criar texto alternativo automaticamente
+pdfjs-editor-alt-text-settings-create-model-description = Sugere uma descri莽茫o para ajudar pessoas que n茫o conseguem ver a imagem ou quando a imagem n茫o 茅 carregada.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modelo de intelig锚ncia artificial de texto alternativo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Funciona localmente no seu dispositivo para que seus dados permane莽am privativos. Necess谩rio para texto alternativo autom谩tico.
+pdfjs-editor-alt-text-settings-delete-model-button = Excluir
+pdfjs-editor-alt-text-settings-download-model-button = Baixar
+pdfjs-editor-alt-text-settings-downloading-model-button = Baixando鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar o editor de texto alternativo imediatamente ao adicionar uma imagem
+pdfjs-editor-alt-text-settings-show-dialog-description = Ajuda a assegurar que todas as suas imagens tenham texto alternativo.
+pdfjs-editor-alt-text-settings-close-button = Fechar
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Destaque adicionado
+pdfjs-editor-freetext-added-alert = Texto adicionado
+pdfjs-editor-ink-added-alert = Desenho adicionado
+pdfjs-editor-stamp-added-alert = Imagem adicionada
+pdfjs-editor-signature-added-alert = Assinatura adicionada
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Destaque removido
+pdfjs-editor-undo-bar-message-freetext = Texto removido
+pdfjs-editor-undo-bar-message-ink = Desenho removido
+pdfjs-editor-undo-bar-message-stamp = Imagem removida
+pdfjs-editor-undo-bar-message-signature = Assinatura removida
+pdfjs-editor-undo-bar-message-comment = Coment谩rio removido
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anota莽茫o removida
+       *[other] { $count } anota莽玫es removidas
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Desfazer
+pdfjs-editor-undo-bar-undo-button-label = Desfazer
+pdfjs-editor-undo-bar-close-button =
+    .title = Fechar
+pdfjs-editor-undo-bar-close-button-label = Fechar
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Esta janela permite ao usu谩rio criar uma assinatura para adicionar a um documento PDF. O usu谩rio pode editar o nome (que tamb茅m serve como texto alternativo) e, opcionalmente, salvar a assinatura usar novamente.
+pdfjs-editor-add-signature-dialog-title = Adicionar uma assinatura
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Digitar
+    .title = Digitar
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Desenhar
+    .title = Desenhar
+pdfjs-editor-add-signature-image-button = Imagem
+    .title = Imagem
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Digite sua assinatura
+    .placeholder = Digite sua assinatura
+pdfjs-editor-add-signature-draw-placeholder = Desenhe sua assinatura
+pdfjs-editor-add-signature-draw-thickness-range-label = Espessura
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Espessura do desenho: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Arraste um arquivo aqui para enviar
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ou escolha arquivos de imagem
+       *[other] Ou escolha arquivos de imagem
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descri莽茫o (texto alternativo)
+pdfjs-editor-add-signature-description-input =
+    .title = Descri莽茫o (texto alternativo)
+pdfjs-editor-add-signature-description-default-when-drawing = Assinatura
+pdfjs-editor-add-signature-clear-button-label = Limpar assinatura
+pdfjs-editor-add-signature-clear-button =
+    .title = Limpar assinatura
+pdfjs-editor-add-signature-save-checkbox = Salvar assinatura
+pdfjs-editor-add-signature-save-warning-message = Voc锚 atingiu o limite de 5 assinaturas salvas. Remova uma para salvar mais.
+pdfjs-editor-add-signature-image-upload-error-title = N茫o foi poss铆vel enviar a imagem
+pdfjs-editor-add-signature-image-upload-error-description = Verifique sua conex茫o de rede ou tente outra imagem.
+pdfjs-editor-add-signature-image-no-data-error-title = N茫o 茅 poss铆vel converter esta imagem em uma assinatura
+pdfjs-editor-add-signature-image-no-data-error-description = Experimente enviar outra imagem.
+pdfjs-editor-add-signature-error-close-button = Fechar
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancelar
+pdfjs-editor-add-signature-add-button = Adicionar
+pdfjs-editor-edit-signature-update-button = Atualizar
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Editar coment谩rio
+pdfjs-editor-edit-comment-popup-button =
+    .title = Editar coment谩rio
+pdfjs-editor-delete-comment-popup-button-label = Remover coment谩rio
+pdfjs-editor-delete-comment-popup-button =
+    .title = Remover coment谩rio
+pdfjs-show-comment-button =
+    .title = Mostrar coment谩rio
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Editar coment谩rio
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Atualizar
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Adicionar coment谩rio
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adicionar
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Come莽ar a digitar鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Adicionar coment谩rio
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Exibir/ocultar painel lateral (documento cont茅m miniaturas/estrutura/anexos/camadas)
+pdfjs-toggle-views-manager-button1-label = Gerenciar p谩ginas
+pdfjs-views-manager-sidebar =
+    .aria-label = Painel lateral
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Redimensionador do painel lateral
+pdfjs-views-manager-view-selector-button =
+    .title = Exibi莽茫o
+pdfjs-views-manager-view-selector-button-label = Exibi莽茫o
+pdfjs-views-manager-pages-title = P谩ginas
+pdfjs-views-manager-outlines-title1 = Estrutura do documento
+    .title = Estrutura do documento (duplo clique para expandir/recolher todos os itens)
+pdfjs-views-manager-attachments-title = Anexos
+pdfjs-views-manager-layers-title1 = Camadas
+    .title = Camadas (duplo clique para redefinir todas as camadas ao estado padr茫o)
+pdfjs-views-manager-pages-option-label = P谩ginas
+pdfjs-views-manager-outlines-option-label = Estrutura do documento
+pdfjs-views-manager-attachments-option-label = Anexos
+pdfjs-views-manager-layers-option-label = Camadas
+pdfjs-views-manager-add-file-button =
+    .title = Adicionar arquivo
+pdfjs-views-manager-add-file-button-label = Adicionar arquivo
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } selecionada
+       *[other] { $count } selecionadas
+    }
+pdfjs-views-manager-pages-status-none-action-label = Selecionar p谩ginas
+pdfjs-views-manager-pages-status-action-button-label = Gerenciar
+pdfjs-views-manager-pages-status-copy-button-label = Copiar
+pdfjs-views-manager-pages-status-cut-button-label = Cortar
+pdfjs-views-manager-pages-status-delete-button-label = Excluir
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportar selecionados鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 p谩gina cortada
+       *[other] { $count } p谩ginas cortadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 p谩gina copiada
+       *[other] { $count } p谩ginas copiadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 p谩gina exclu铆da
+       *[other] { $count } p谩ginas exclu铆das
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Preparando seu arquivo鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Enviando arquivo鈥�
+pdfjs-views-manager-status-warning-cut-label = N茫o foi poss铆vel cortar. Atualize a p谩gina e tente novamente.
+pdfjs-views-manager-status-warning-copy-label = N茫o foi poss铆vel copiar. Atualize a p谩gina e tente novamente.
+pdfjs-views-manager-status-warning-delete-label = N茫o foi poss铆vel excluir. Atualize a p谩gina e tente novamente.
+pdfjs-views-manager-status-warning-save-label = N茫o foi poss铆vel salvar. Atualize a p谩gina e tente novamente.
+pdfjs-views-manager-status-undo-button-label = Desfazer
+pdfjs-views-manager-status-done-button-label = Pronto
+pdfjs-views-manager-status-close-button =
+    .title = Fechar
+pdfjs-views-manager-status-close-button-label = Fechar
+pdfjs-views-manager-paste-button-label = Colar
+pdfjs-views-manager-paste-button-before =
+    .title = Colar antes da primeira p谩gina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Colar ap贸s a p谩gina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOVIDADE
+pdfjs-views-manager-waiting-for-file = Enviando arquivo鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Gerenciar p谩ginas
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Remover assinatura salva
+pdfjs-editor-delete-signature-button-label1 = Remover assinatura salva
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Mudar descri莽茫o
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Mudar descri莽茫o
diff --git a/public/pdfjs/web/locale/pt-PT/viewer.ftl b/public/pdfjs/web/locale/pt-PT/viewer.ftl
new file mode 100644
index 0000000..136a45c
--- /dev/null
+++ b/public/pdfjs/web/locale/pt-PT/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P谩gina anterior
+pdfjs-previous-button-label = Anterior
+pdfjs-next-button =
+    .title = P谩gina seguinte
+pdfjs-next-button-label = Seguinte
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P谩gina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Reduzir
+pdfjs-zoom-out-button-label = Reduzir
+pdfjs-zoom-in-button =
+    .title = Ampliar
+pdfjs-zoom-in-button-label = Ampliar
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Trocar para o modo de apresenta莽茫o
+pdfjs-presentation-mode-button-label = Modo de apresenta莽茫o
+pdfjs-open-file-button =
+    .title = Abrir ficheiro
+pdfjs-open-file-button-label = Abrir
+pdfjs-print-button =
+    .title = Imprimir
+pdfjs-print-button-label = Imprimir
+pdfjs-save-button =
+    .title = Guardar
+pdfjs-save-button-label = Guardar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Transferir
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Transferir
+pdfjs-bookmark-button =
+    .title = P谩gina atual (ver URL da p谩gina atual)
+pdfjs-bookmark-button-label = Pagina atual
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ferramentas
+pdfjs-tools-button-label = Ferramentas
+pdfjs-first-page-button =
+    .title = Ir para a primeira p谩gina
+pdfjs-first-page-button-label = Ir para a primeira p谩gina
+pdfjs-last-page-button =
+    .title = Ir para a 煤ltima p谩gina
+pdfjs-last-page-button-label = Ir para a 煤ltima p谩gina
+pdfjs-page-rotate-cw-button =
+    .title = Rodar 脿 direita
+pdfjs-page-rotate-cw-button-label = Rodar 脿 direita
+pdfjs-page-rotate-ccw-button =
+    .title = Rodar 脿 esquerda
+pdfjs-page-rotate-ccw-button-label = Rodar 脿 esquerda
+pdfjs-cursor-text-select-tool-button =
+    .title = Ativar ferramenta de sele莽茫o de texto
+pdfjs-cursor-text-select-tool-button-label = Ferramenta de sele莽茫o de texto
+pdfjs-cursor-hand-tool-button =
+    .title = Ativar ferramenta de m茫o
+pdfjs-cursor-hand-tool-button-label = Ferramenta de m茫o
+pdfjs-scroll-page-button =
+    .title = Utilizar deslocamento da p谩gina
+pdfjs-scroll-page-button-label = Deslocamento da p谩gina
+pdfjs-scroll-vertical-button =
+    .title = Utilizar desloca莽茫o vertical
+pdfjs-scroll-vertical-button-label = Desloca莽茫o vertical
+pdfjs-scroll-horizontal-button =
+    .title = Utilizar desloca莽茫o horizontal
+pdfjs-scroll-horizontal-button-label = Desloca莽茫o horizontal
+pdfjs-scroll-wrapped-button =
+    .title = Utilizar desloca莽茫o encapsulada
+pdfjs-scroll-wrapped-button-label = Desloca莽茫o encapsulada
+pdfjs-spread-none-button =
+    .title = N茫o juntar p谩ginas dispersas
+pdfjs-spread-none-button-label = Sem spreads
+pdfjs-spread-odd-button =
+    .title = Juntar p谩ginas dispersas a partir de p谩ginas com n煤meros 铆mpares
+pdfjs-spread-odd-button-label = Spreads 铆mpares
+pdfjs-spread-even-button =
+    .title = Juntar p谩ginas dispersas a partir de p谩ginas com n煤meros pares
+pdfjs-spread-even-button-label = Spreads pares
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propriedades do documento鈥�
+pdfjs-document-properties-button-label = Propriedades do documento鈥�
+pdfjs-document-properties-file-name = Nome do ficheiro:
+pdfjs-document-properties-file-size = Tamanho do ficheiro:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = T铆tulo:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Assunto:
+pdfjs-document-properties-keywords = Palavras-chave:
+pdfjs-document-properties-creation-date = Data de cria莽茫o:
+pdfjs-document-properties-modification-date = Data de modifica莽茫o:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Criador:
+pdfjs-document-properties-producer = Produtor de PDF:
+pdfjs-document-properties-version = Vers茫o do PDF:
+pdfjs-document-properties-page-count = N.潞 de p谩ginas:
+pdfjs-document-properties-page-size = Tamanho da p谩gina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = retrato
+pdfjs-document-properties-page-size-orientation-landscape = paisagem
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Carta
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista r谩pida web:
+pdfjs-document-properties-linearized-yes = Sim
+pdfjs-document-properties-linearized-no = N茫o
+pdfjs-document-properties-close-button = Fechar
+
+## Print
+
+pdfjs-print-progress-message = A preparar o documento para impress茫o鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Cancelar
+pdfjs-printing-not-supported = Aviso: a impress茫o n茫o 茅 totalmente suportada por este navegador.
+pdfjs-printing-not-ready = Aviso: o PDF ainda n茫o est谩 totalmente carregado.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Alternar barra lateral
+pdfjs-toggle-sidebar-notification-button =
+    .title = Alternar barra lateral (o documento cont茅m contornos/anexos/camadas)
+pdfjs-toggle-sidebar-button-label = Alternar barra lateral
+pdfjs-document-outline-button =
+    .title = Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens)
+pdfjs-document-outline-button-label = Esquema do documento
+pdfjs-attachments-button =
+    .title = Mostrar anexos
+pdfjs-attachments-button-label = Anexos
+pdfjs-layers-button =
+    .title = Mostrar camadas (clique duas vezes para repor todas as camadas para o estado predefinido)
+pdfjs-layers-button-label = Camadas
+pdfjs-thumbs-button =
+    .title = Mostrar miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Encontrar o item atualmente destacado
+pdfjs-current-outline-item-button-label = Item atualmente destacado
+pdfjs-findbar-button =
+    .title = Localizar em documento
+pdfjs-findbar-button-label = Localizar
+pdfjs-additional-layers = Camadas adicionais
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura da p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Selecionar a p谩gina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = P谩gina { $page } de { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Localizar
+    .placeholder = Localizar em documento鈥�
+pdfjs-find-previous-button =
+    .title = Localizar ocorr锚ncia anterior da frase
+pdfjs-find-previous-button-label = Anterior
+pdfjs-find-next-button =
+    .title = Localizar ocorr锚ncia seguinte da frase
+pdfjs-find-next-button-label = Seguinte
+pdfjs-find-highlight-checkbox = Destacar tudo
+pdfjs-find-match-case-checkbox-label = Correspond锚ncia
+pdfjs-find-match-diacritics-checkbox-label = Corresponder diacr铆ticos
+pdfjs-find-entire-word-checkbox-label = Palavras completas
+pdfjs-find-reached-top = Topo do documento atingido, a continuar a partir do fundo
+pdfjs-find-reached-bottom = Fim do documento atingido, a continuar a partir do topo
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } de { $total } correspond锚ncia
+       *[other] { $current } de { $total } correspond锚ncias
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mais de { $limit } correspond锚ncia
+       *[other] Mais de { $limit } correspond锚ncias
+    }
+pdfjs-find-not-found = Frase n茫o encontrada
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Ajustar 脿 largura
+pdfjs-page-scale-fit = Ajustar 脿 p谩gina
+pdfjs-page-scale-auto = Zoom autom谩tico
+pdfjs-page-scale-actual = Tamanho real
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P谩gina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ocorreu um erro ao carregar o PDF.
+pdfjs-invalid-file-error = Ficheiro PDF inv谩lido ou danificado.
+pdfjs-missing-file-error = Ficheiro PDF inexistente.
+pdfjs-unexpected-response-error = Resposta inesperada do servidor.
+pdfjs-rendering-error = Ocorreu um erro ao processar a p谩gina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anota莽茫o { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Introduza a palavra-passe para abrir este ficheiro PDF.
+pdfjs-password-invalid = Palavra-passe inv谩lida. Por favor, tente novamente.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Cancelar
+pdfjs-web-fonts-disabled = Os tipos de letra web est茫o desativados: n茫o 茅 poss铆vel utilizar os tipos de letra PDF embutidos.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Texto
+pdfjs-editor-color-picker-free-text-input =
+    .title = Alterar cor do texto
+pdfjs-editor-free-text-button-label = Texto
+pdfjs-editor-ink-button =
+    .title = Desenhar
+pdfjs-editor-color-picker-ink-input =
+    .title = Alterar a cor de desenho
+pdfjs-editor-ink-button-label = Desenhar
+pdfjs-editor-stamp-button =
+    .title = Adicionar ou editar imagens
+pdfjs-editor-stamp-button-label = Adicionar ou editar imagens
+pdfjs-editor-highlight-button =
+    .title = Destaque
+pdfjs-editor-highlight-button-label = Destaque
+pdfjs-highlight-floating-button1 =
+    .title = Real莽ar
+    .aria-label = Real莽ar
+pdfjs-highlight-floating-button-label = Real莽ar
+pdfjs-comment-floating-button =
+    .title = Coment谩rio
+    .aria-label = Coment谩rio
+pdfjs-comment-floating-button-label = Coment谩rio
+pdfjs-editor-comment-button =
+    .title = Coment谩rio
+    .aria-label = Coment谩rio
+pdfjs-editor-comment-button-label = Coment谩rio
+pdfjs-editor-signature-button =
+    .title = Adicionar assinatura
+pdfjs-editor-signature-button-label = Adicionar assinatura
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de realce
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de desenho
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de assinatura: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de imagem
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Remover desenho
+pdfjs-editor-remove-freetext-button =
+    .title = Remover texto
+pdfjs-editor-remove-stamp-button =
+    .title = Remover imagem
+pdfjs-editor-remove-highlight-button =
+    .title = Remover destaque
+pdfjs-editor-remove-signature-button =
+    .title = Remover assinatura
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Cor
+pdfjs-editor-free-text-size-input = Tamanho
+pdfjs-editor-ink-color-input = Cor
+pdfjs-editor-ink-thickness-input = Espessura
+pdfjs-editor-ink-opacity-input = Opacidade
+pdfjs-editor-stamp-add-image-button =
+    .title = Adicionar imagem
+pdfjs-editor-stamp-add-image-button-label = Adicionar imagem
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Espessura
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Alterar espessura quando destacar itens que n茫o sejam texto
+pdfjs-editor-add-signature-container =
+    .aria-label = Controlos de assinatura e assinaturas guardadas
+pdfjs-editor-signature-add-signature-button =
+    .title = Adicionar nova assinatura
+pdfjs-editor-signature-add-signature-button-label = Adicionar nova assinatura
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Assinatura guardada: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de texto
+    .default-content = Comece a escrever鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Coment谩rio
+       *[other] Coment谩rios
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Fechar barra lateral
+    .aria-label = Fechar barra lateral
+pdfjs-editor-comments-sidebar-close-button-label = Fechar barra lateral
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Viu algo interessante? Realce e adicione um coment谩rio.
+pdfjs-editor-comments-sidebar-no-comments-link = Saber mais
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Texto alternativo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editar texto alternativo
+pdfjs-editor-alt-text-dialog-label = Escolher uma op莽茫o
+pdfjs-editor-alt-text-dialog-description = O texto alternativo (texto alternativo) ajuda quando as pessoas n茫o conseguem ver a imagem ou quando a mesma n茫o 茅 carregada.
+pdfjs-editor-alt-text-add-description-label = Adicionar uma descri莽茫o
+pdfjs-editor-alt-text-add-description-description = Aponte para 1-2 frases que descrevam o assunto, defini莽茫o ou a莽玫es.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa
+pdfjs-editor-alt-text-mark-decorative-description = Isto 茅 utilizado para imagens decorativas, tais como limites ou marcas d'谩gua.
+pdfjs-editor-alt-text-cancel-button = Cancelar
+pdfjs-editor-alt-text-save-button = Guardar
+pdfjs-editor-alt-text-decorative-tooltip = Marcada como decorativa
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Por exemplo, 鈥淯m jovem senta-se 脿 mesa para comer uma refei莽茫o鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Texto alternativo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Canto superior esquerdo 鈥� redimensionar
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Superior ao centro 鈥� redimensionar
+pdfjs-editor-resizer-top-right =
+    .aria-label = Canto superior direito 鈥� redimensionar
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Centro 脿 direita 鈥� redimensionar
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Canto inferior direito 鈥� redimensionar
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Inferior ao centro 鈥� redimensionar
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Canto inferior esquerdo 鈥� redimensionar
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Centro 脿 esquerda 鈥� redimensionar
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Cor de destaque
+pdfjs-editor-colorpicker-button =
+    .title = Alterar cor
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Escolhas de cor
+pdfjs-editor-colorpicker-yellow =
+    .title = Amarelo
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Azul
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Vermelho
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mostrar tudo
+pdfjs-editor-highlight-show-all-button =
+    .title = Mostrar tudo
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descri莽茫o da imagem)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Adicionar texto alternativo (descri莽茫o da imagem)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Escreva a sua descri莽茫o aqui鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Descri莽茫o curta para as pessoas que n茫o podem visualizar a imagem ou quando a imagem n茫o carrega.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo foi criado automaticamente e pode ser impreciso.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber mais
+pdfjs-editor-new-alt-text-create-automatically-button-label = Criar texto alternativo automaticamente
+pdfjs-editor-new-alt-text-not-now-button = Agora n茫o
+pdfjs-editor-new-alt-text-error-title = N茫o foi poss铆vel criar o texto alternativo automaticamente
+pdfjs-editor-new-alt-text-error-description = Escreva o seu pr贸prio texto alternativo ou tente novamente mais tarde.
+pdfjs-editor-new-alt-text-error-close-button = Fechar
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = A transferir o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = A transferir o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Texto alternativo adicionado
+pdfjs-editor-new-alt-text-added-button-label = Texto alternativo adicionado
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Texto alternativo em falta
+pdfjs-editor-new-alt-text-missing-button-label = Texto alternativo em falta
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Rever texto alternativo
+pdfjs-editor-new-alt-text-to-review-button-label = Rever texto alternativo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Criado automaticamente: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Defini莽玫es de texto alternativo da imagem
+pdfjs-image-alt-text-settings-button-label = Defini莽玫es de texto alternativo da imagem
+pdfjs-editor-alt-text-settings-dialog-label = Defini莽玫es de texto alternativo das imagens
+pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo autom谩tico
+pdfjs-editor-alt-text-settings-create-model-button-label = Criar texto alternativo automaticamente
+pdfjs-editor-alt-text-settings-create-model-description = Sugere descri莽玫es para ajudar as pessoas que n茫o podem visualizar a imagem ou quando a imagem n茫o carrega.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = 脡 executado localmente no seu dispositivo para que os seus dados se mantenham privados. 脡 necess谩rio para o texto alternativo autom谩tico.
+pdfjs-editor-alt-text-settings-delete-model-button = Eliminar
+pdfjs-editor-alt-text-settings-download-model-button = Transferir
+pdfjs-editor-alt-text-settings-downloading-model-button = A transferir鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar editor de texto alternativo imediatamente ao adicionar uma imagem
+pdfjs-editor-alt-text-settings-show-dialog-description = Ajuda a garantir que todas as suas imagens tenham um texto alternativo.
+pdfjs-editor-alt-text-settings-close-button = Fechar
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Destaque adicionado
+pdfjs-editor-freetext-added-alert = Texto adicionado
+pdfjs-editor-ink-added-alert = Desenho adicionado
+pdfjs-editor-stamp-added-alert = Imagem adicionada
+pdfjs-editor-signature-added-alert = Assinatura adicionada
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Destaque removido
+pdfjs-editor-undo-bar-message-freetext = Texto removido
+pdfjs-editor-undo-bar-message-ink = Desenho removido
+pdfjs-editor-undo-bar-message-stamp = Imagem removida
+pdfjs-editor-undo-bar-message-signature = Assinatura removida
+pdfjs-editor-undo-bar-message-comment = Coment谩rio removido
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anota莽茫o removida
+       *[other] { $count } anota莽玫es removidas
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Anular
+pdfjs-editor-undo-bar-undo-button-label = Anular
+pdfjs-editor-undo-bar-close-button =
+    .title = Fechar
+pdfjs-editor-undo-bar-close-button-label = Fechar
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Este modo permite ao utilizador criar uma assinatura para adicionar a um documento PDF. O utilizador pode editar o nome (que tamb茅m funciona como texto alternativo) e, opcionalmente, guardar a assinatura para utiliza莽玫es frequentes.
+pdfjs-editor-add-signature-dialog-title = Adicionar uma assinatura
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Digitar
+    .title = Digitar
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Desenhar
+    .title = Desenhar
+pdfjs-editor-add-signature-image-button = Imagem
+    .title = Imagem
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Digite a sua assinatura
+    .placeholder = Digite a sua assinatura
+pdfjs-editor-add-signature-draw-placeholder = Desenhe a sua assinatura
+pdfjs-editor-add-signature-draw-thickness-range-label = Espessura
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Espessura do desenho: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Arraste um ficheiro aqui para carregar
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ou escolha ficheiros de imagem
+       *[other] Ou explore ficheiros de imagem
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descri莽茫o (texto alternativo)
+pdfjs-editor-add-signature-description-input =
+    .title = Descri莽茫o (texto alternativo)
+pdfjs-editor-add-signature-description-default-when-drawing = Assinatura
+pdfjs-editor-add-signature-clear-button-label = Limpar assinatura
+pdfjs-editor-add-signature-clear-button =
+    .title = Limpar assinatura
+pdfjs-editor-add-signature-save-checkbox = Guardar assinatura
+pdfjs-editor-add-signature-save-warning-message = Atingiu o limite de 5 assinaturas guardadas. Remova uma para guardar mais.
+pdfjs-editor-add-signature-image-upload-error-title = N茫o foi poss铆vel carregar a imagem
+pdfjs-editor-add-signature-image-upload-error-description = Verifique a sua liga莽茫o 脿 rede ou tente outra imagem.
+pdfjs-editor-add-signature-image-no-data-error-title = N茫o 茅 poss铆vel converter esta imagem para uma assinatura
+pdfjs-editor-add-signature-image-no-data-error-description = Tente enviar uma imagem diferente.
+pdfjs-editor-add-signature-error-close-button = Fechar
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Cancelar
+pdfjs-editor-add-signature-add-button = Adicionar
+pdfjs-editor-edit-signature-update-button = Atualizar
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Editar coment谩rio
+pdfjs-editor-edit-comment-popup-button =
+    .title = Editar coment谩rio
+pdfjs-editor-delete-comment-popup-button-label = Remover coment谩rio
+pdfjs-editor-delete-comment-popup-button =
+    .title = Remover coment谩rio
+pdfjs-show-comment-button =
+    .title = Mostrar coment谩rio
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Editar coment谩rio
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Atualizar
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Adicionar coment谩rio
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adicionar
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Comece a digitar鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Adicionar coment谩rio
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Alternar barra lateral (o documento inclui miniaturas/esquema/anexos/camadas)
+pdfjs-toggle-views-manager-button1-label = Gerir p谩ginas
+pdfjs-views-manager-sidebar =
+    .aria-label = Barra lateral
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Redimensionador da barra lateral
+pdfjs-views-manager-view-selector-button =
+    .title = Vistas
+pdfjs-views-manager-view-selector-button-label = Vistas
+pdfjs-views-manager-pages-title = P谩ginas
+pdfjs-views-manager-outlines-title1 = Esquema do documento
+    .title = Esquema do documento (duplo clique para expandir/colapsar todos os itens)
+pdfjs-views-manager-attachments-title = Anexos
+pdfjs-views-manager-layers-title1 = Camadas
+    .title = Camadas (duplo clique para repor todas as camadas para o estado predefinido)
+pdfjs-views-manager-pages-option-label = P谩ginas
+pdfjs-views-manager-outlines-option-label = Esquema do documento
+pdfjs-views-manager-attachments-option-label = Anexos
+pdfjs-views-manager-layers-option-label = Camadas
+pdfjs-views-manager-add-file-button =
+    .title = Adicionar ficheiro
+pdfjs-views-manager-add-file-button-label = Adicionar ficheiro
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } selecionada
+       *[other] { $count } selecionadas
+    }
+pdfjs-views-manager-pages-status-none-action-label = Selecionar p谩ginas
+pdfjs-views-manager-pages-status-action-button-label = Gerir
+pdfjs-views-manager-pages-status-copy-button-label = Copiar
+pdfjs-views-manager-pages-status-cut-button-label = Cortar
+pdfjs-views-manager-pages-status-delete-button-label = Eliminar
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportar selecionado鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 p谩gina cortada
+       *[other] { $count } p谩ginas cortadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 p谩gina copiada
+       *[other] { $count } p谩ginas copiadas
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 p谩gina eliminada
+       *[other] { $count } p谩ginas eliminadas
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = A preparar o seu ficheiro鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = A carregar ficheiro鈥�
+pdfjs-views-manager-status-warning-cut-label = N茫o foi poss铆vel cortar. Atualize a p谩gina e tente novamente.
+pdfjs-views-manager-status-warning-copy-label = N茫o foi poss铆vel copiar. Atualize a p谩gina e tente novamente.
+pdfjs-views-manager-status-warning-delete-label = N茫o foi poss铆vel eliminar. Atualize a p谩gina e tente novamente.
+pdfjs-views-manager-status-warning-save-label = N茫o foi poss铆vel guardar. Atualize a p谩gina e tente novamente.
+pdfjs-views-manager-status-undo-button-label = Desfazer
+pdfjs-views-manager-status-done-button-label = Feito
+pdfjs-views-manager-status-close-button =
+    .title = Fechar
+pdfjs-views-manager-status-close-button-label = Fechar
+pdfjs-views-manager-paste-button-label = Colar
+pdfjs-views-manager-paste-button-before =
+    .title = Colar antes da primeira p谩gina
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Colar depois da p谩gina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOVO
+pdfjs-views-manager-waiting-for-file = A carregar ficheiro鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Gerir p谩ginas
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Remover assinatura guardada
+pdfjs-editor-delete-signature-button-label1 = Remover assinatura guardada
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Editar descri莽茫o
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Editar descri莽茫o
diff --git a/public/pdfjs/web/locale/rm/viewer.ftl b/public/pdfjs/web/locale/rm/viewer.ftl
new file mode 100644
index 0000000..e632848
--- /dev/null
+++ b/public/pdfjs/web/locale/rm/viewer.ftl
@@ -0,0 +1,639 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pagina precedenta
+pdfjs-previous-button-label = Enavos
+pdfjs-next-button =
+    .title = Proxima pagina
+pdfjs-next-button-label = Enavant
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pagina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = da { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } da { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Empitschnir
+pdfjs-zoom-out-button-label = Empitschnir
+pdfjs-zoom-in-button =
+    .title = Engrondir
+pdfjs-zoom-in-button-label = Engrondir
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Midar en il modus da preschentaziun
+pdfjs-presentation-mode-button-label = Modus da preschentaziun
+pdfjs-open-file-button =
+    .title = Avrir datoteca
+pdfjs-open-file-button-label = Avrir
+pdfjs-print-button =
+    .title = Stampar
+pdfjs-print-button-label = Stampar
+pdfjs-save-button =
+    .title = Memorisar
+pdfjs-save-button-label = Memorisar
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Telechargiar
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Telechargiar
+pdfjs-bookmark-button =
+    .title = Pagina actuala (mussar l'URL da la pagina actuala)
+pdfjs-bookmark-button-label = Pagina actuala
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Utensils
+pdfjs-tools-button-label = Utensils
+pdfjs-first-page-button =
+    .title = Siglir a l'emprima pagina
+pdfjs-first-page-button-label = Siglir a l'emprima pagina
+pdfjs-last-page-button =
+    .title = Siglir a la davosa pagina
+pdfjs-last-page-button-label = Siglir a la davosa pagina
+pdfjs-page-rotate-cw-button =
+    .title = Rotar en direcziun da l'ura
+pdfjs-page-rotate-cw-button-label = Rotar en direcziun da l'ura
+pdfjs-page-rotate-ccw-button =
+    .title = Rotar en direcziun cuntraria a l'ura
+pdfjs-page-rotate-ccw-button-label = Rotar en direcziun cuntraria a l'ura
+pdfjs-cursor-text-select-tool-button =
+    .title = Activar l'utensil per selecziunar text
+pdfjs-cursor-text-select-tool-button-label = Utensil per selecziunar text
+pdfjs-cursor-hand-tool-button =
+    .title = Activar l'utensil da maun
+pdfjs-cursor-hand-tool-button-label = Utensil da maun
+pdfjs-scroll-page-button =
+    .title = Utilisar la defilada per pagina
+pdfjs-scroll-page-button-label = Defilada per pagina
+pdfjs-scroll-vertical-button =
+    .title = Utilisar il defilar vertical
+pdfjs-scroll-vertical-button-label = Defilar vertical
+pdfjs-scroll-horizontal-button =
+    .title = Utilisar il defilar orizontal
+pdfjs-scroll-horizontal-button-label = Defilar orizontal
+pdfjs-scroll-wrapped-button =
+    .title = Utilisar il defilar en colonnas
+pdfjs-scroll-wrapped-button-label = Defilar en colonnas
+pdfjs-spread-none-button =
+    .title = Betg parallelisar las paginas
+pdfjs-spread-none-button-label = Betg parallel
+pdfjs-spread-odd-button =
+    .title = Parallelisar las paginas cun cumenzar cun paginas sp猫ras
+pdfjs-spread-odd-button-label = Parallel sp猫r
+pdfjs-spread-even-button =
+    .title = Parallelisar las paginas cun cumenzar cun paginas p猫ras
+pdfjs-spread-even-button-label = Parallel p猫r
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Caracteristicas dal document鈥�
+pdfjs-document-properties-button-label = Caracteristicas dal document鈥�
+pdfjs-document-properties-file-name = Num da la datoteca:
+pdfjs-document-properties-file-size = Grondezza da la datoteca:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Titel:
+pdfjs-document-properties-author = Autur:
+pdfjs-document-properties-subject = Tema:
+pdfjs-document-properties-keywords = Chavazzins:
+pdfjs-document-properties-creation-date = Data da creaziun:
+pdfjs-document-properties-modification-date = Data da modificaziun:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Cre脿 da:
+pdfjs-document-properties-producer = Cre脿 il PDF cun:
+pdfjs-document-properties-version = Versiun da PDF:
+pdfjs-document-properties-page-count = Dumber da paginas:
+pdfjs-document-properties-page-size = Grondezza da la pagina:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical
+pdfjs-document-properties-page-size-orientation-landscape = orizontal
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = Gea
+pdfjs-document-properties-linearized-no = Na
+pdfjs-document-properties-close-button = Serrar
+
+## Print
+
+pdfjs-print-progress-message = Preparar il document per stampar鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Interrumper
+pdfjs-printing-not-supported = Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur.
+pdfjs-printing-not-ready = Attenziun: Il PDF n'猫 betg chargi脿 cumplettamain per stampar.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Activar/deactivar la trav laterala
+pdfjs-toggle-sidebar-notification-button =
+    .title = Activar/deactivar la trav laterala (il document cuntegna structura dal document/agiuntas/nivels)
+pdfjs-toggle-sidebar-button-label = Activar/deactivar la trav laterala
+pdfjs-document-outline-button =
+    .title = Mussar la structura dal document (cliccar duas giadas per extender/cumprimer tut ils elements)
+pdfjs-document-outline-button-label = Structura dal document
+pdfjs-attachments-button =
+    .title = Mussar agiuntas
+pdfjs-attachments-button-label = Agiuntas
+pdfjs-layers-button =
+    .title = Mussar ils nivels (cliccar dubel per restaurar il stadi da standard da tut ils nivels)
+pdfjs-layers-button-label = Nivels
+pdfjs-thumbs-button =
+    .title = Mussar las miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Tschertgar l'element da structura actual
+pdfjs-current-outline-item-button-label = Element da structura actual
+pdfjs-findbar-button =
+    .title = Tschertgar en il document
+pdfjs-findbar-button-label = Tschertgar
+pdfjs-additional-layers = Nivels supplementars
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura da la pagina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Tschertgar
+    .placeholder = Tschertgar en il document鈥�
+pdfjs-find-previous-button =
+    .title = Tschertgar la posiziun precedenta da l'expressiun
+pdfjs-find-previous-button-label = Enavos
+pdfjs-find-next-button =
+    .title = Tschertgar la proxima posiziun da l'expressiun
+pdfjs-find-next-button-label = Enavant
+pdfjs-find-highlight-checkbox = Relevar tuts
+pdfjs-find-match-case-checkbox-label = Resguardar maiusclas/minusclas
+pdfjs-find-match-diacritics-checkbox-label = Resguardar ils segns diacritics
+pdfjs-find-entire-word-checkbox-label = Pleds entirs
+pdfjs-find-reached-top = Il cumenzament dal document 猫 cuntansch矛, la tschertga cuntinuescha a la fin dal document
+pdfjs-find-reached-bottom = La fin dal document 猫 cuntansch矛, la tschertga cuntinuescha al cumenzament dal document
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } dad { $total } correspundenza
+       *[other] { $current } da { $total } correspundenzas
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Dapli che { $limit } correspundenza
+       *[other] Dapli che { $limit } correspundenzas
+    }
+pdfjs-find-not-found = Impussibel da chattar l'expressiun
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Ladezza da la pagina
+pdfjs-page-scale-fit = Entira pagina
+pdfjs-page-scale-auto = Zoom automatic
+pdfjs-page-scale-actual = Grondezza actuala
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pagina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ina errur 猫 cumparida cun chargiar il PDF.
+pdfjs-invalid-file-error = Datoteca PDF nunvalida u donnegiada.
+pdfjs-missing-file-error = Datoteca PDF manconta.
+pdfjs-unexpected-response-error = Resposta nunspetgada dal server.
+pdfjs-rendering-error = Ina errur 猫 cumparida cun visualisar questa pagina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Annotaziun da { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Endatescha il pled-clav per avrir questa datoteca da PDF.
+pdfjs-password-invalid = Pled-clav nunvalid. Emprova anc ina giada.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Interrumper
+pdfjs-web-fonts-disabled = Scrittiras dal web 猫n deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = Midar la colur dal text
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Dissegnar
+pdfjs-editor-color-picker-ink-input =
+    .title = Midar la colur per dissegnar
+pdfjs-editor-ink-button-label = Dissegnar
+pdfjs-editor-stamp-button =
+    .title = Agiuntar u modifitgar maletgs
+pdfjs-editor-stamp-button-label = Agiuntar u modifitgar maletgs
+pdfjs-editor-highlight-button =
+    .title = Marcar
+pdfjs-editor-highlight-button-label = Marcar
+pdfjs-highlight-floating-button1 =
+    .title = Marcar
+    .aria-label = Marcar
+pdfjs-highlight-floating-button-label = Marcar
+pdfjs-comment-floating-button =
+    .title = Commentar
+    .aria-label = Commentar
+pdfjs-comment-floating-button-label = Commentar
+pdfjs-editor-comment-button =
+    .title = Commentari
+    .aria-label = Commentari
+pdfjs-editor-comment-button-label = Commentari
+pdfjs-editor-signature-button =
+    .title = Agiuntar ina signatura
+pdfjs-editor-signature-button-label = Agiuntar ina signatura
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editur per relevar
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editur per dissegnar
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editur da signatura: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editur per maletgs
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Allontanar il dissegn
+pdfjs-editor-remove-freetext-button =
+    .title = Allontanar il text
+pdfjs-editor-remove-stamp-button =
+    .title = Allontanar la grafica
+pdfjs-editor-remove-highlight-button =
+    .title = Allontanar l'emfasa
+pdfjs-editor-remove-signature-button =
+    .title = Allontanar la signatura
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Colur
+pdfjs-editor-free-text-size-input = Grondezza
+pdfjs-editor-ink-color-input = Colur
+pdfjs-editor-ink-thickness-input = Grossezza
+pdfjs-editor-ink-opacity-input = Opacitad
+pdfjs-editor-stamp-add-image-button =
+    .title = Agiuntar in maletg
+pdfjs-editor-stamp-add-image-button-label = Agiuntar in maletg
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Grossezza
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Midar la grossezza cun relevar elements betg textuals
+pdfjs-editor-add-signature-container =
+    .aria-label = Controllas da signatura e signaturas memorisadas
+pdfjs-editor-signature-add-signature-button =
+    .title = Agiuntar ina nova signatura
+pdfjs-editor-signature-add-signature-button-label = Agiuntar ina nova signatura
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Signatura memorisada: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editur da text
+    .default-content = Cumenza a tippar鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Commentari
+       *[other] Commentaris
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Serrar la trav laterala
+    .aria-label = Serrar la trav laterala
+pdfjs-editor-comments-sidebar-close-button-label = Serrar la trav laterala
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Vesas insatge interessant? Marchescha la passascha ed agiuntescha in commentari.
+pdfjs-editor-comments-sidebar-no-comments-link = Ulteriuras infurmaziuns
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Text alternativ
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Modifitgar il text alternativ
+pdfjs-editor-alt-text-dialog-label = Tscherner ina opziun
+pdfjs-editor-alt-text-dialog-description = Il text alternativ (alt text) gida en cas che persunas na vesan betg il maletg u sch'i na reussescha betg d'al chargiar.
+pdfjs-editor-alt-text-add-description-label = Agiuntar ina descripziun
+pdfjs-editor-alt-text-add-description-description = Scriva idealmain 1-2 frasas che descrivan l'object, la situaziun u las acziuns.
+pdfjs-editor-alt-text-mark-decorative-label = Marcar sco decorativ
+pdfjs-editor-alt-text-mark-decorative-description = Quai vegn duvr脿 per maletgs ornamentals, sco urs u filigranas.
+pdfjs-editor-alt-text-cancel-button = Interrumper
+pdfjs-editor-alt-text-save-button = Memorisar
+pdfjs-editor-alt-text-decorative-tooltip = Marc脿 sco decorativ
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Per exempel: 芦In um giuven sesa a maisa per mangiar in past禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Text alternativ
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Chantun sura a sanestra 鈥� redimensiunar
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Sura amez 鈥� redimensiunar
+pdfjs-editor-resizer-top-right =
+    .aria-label = Chantun sura a dretga 鈥� redimensiunar
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Da vart dretga amez 鈥� redimensiunar
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Chantun sut a dretga 鈥� redimensiunar
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Sutvart amez 鈥� redimensiunar
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Chantun sut a sanestra 鈥� redimensiunar
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Vart sanestra amez 鈥� redimensiunar
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Colur per l'emfasa
+pdfjs-editor-colorpicker-button =
+    .title = Midar la colur
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Colurs disponiblas
+pdfjs-editor-colorpicker-yellow =
+    .title = Mellen
+pdfjs-editor-colorpicker-green =
+    .title = Verd
+pdfjs-editor-colorpicker-blue =
+    .title = Blau
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = Cotschen
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Mussar tut
+pdfjs-editor-highlight-show-all-button =
+    .title = Mussar tut
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Modifitgar il text alternativ (descripziun dal maletg)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Agiuntar in text alternativ (descripziun dal maletg)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Scriva qua tia descripziun鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Curta descripziun per persunas che na vesan betg il maletg u per cass en ils quals il maletg na vegn betg chargi脿.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Quest text alternativ 猫 vegn矛 cre脿 automaticamain ed 猫 eventualmain nunprecis.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ulteriuras infurmaziuns
+pdfjs-editor-new-alt-text-create-automatically-button-label = Crear automaticamain il text alternativ
+pdfjs-editor-new-alt-text-not-now-button = Betg ussa
+pdfjs-editor-new-alt-text-error-title = I n鈥櫭� betg reuss矛 da crear automaticamain il text alternativ
+pdfjs-editor-new-alt-text-error-description = Scriva per plaschair tes agen text alternativ u emprova pli tard anc ina giada.
+pdfjs-editor-new-alt-text-error-close-button = Serrar
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Telechargiar il model IA da text alternativ ({ $downloadedSize } da { $totalSize } MB)
+    .aria-valuetext = Telechargiar il model IA da text alternativ ({ $downloadedSize } da { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Agiunt脿 text alternativ
+pdfjs-editor-new-alt-text-added-button-label = Text alternativ agiunt脿
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Text alternativ manca
+pdfjs-editor-new-alt-text-missing-button-label = Text alternativ manca
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Repassar il text alternativ
+pdfjs-editor-new-alt-text-to-review-button-label = Repassar il text alternativ
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Cre脿 automaticamain: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Parameters dal text alternativ da maletgs
+pdfjs-image-alt-text-settings-button-label = Parameters dal text alternativ da maletgs
+pdfjs-editor-alt-text-settings-dialog-label = Parameters dal text alternativ da maletgs
+pdfjs-editor-alt-text-settings-automatic-title = Text alternativ automatic
+pdfjs-editor-alt-text-settings-create-model-button-label = Crear automaticamain text alternativ
+pdfjs-editor-alt-text-settings-create-model-description = Propona descripziuns per gidar a persunas che na vesan betg il maletg u per cass en ils quals il maletg na vegn betg chargi脿.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model IA da text alternativ ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Vegn exequ矛 localmain sin tes apparat per che tias datas restian privatas. Necessari per text alternativ automatic.
+pdfjs-editor-alt-text-settings-delete-model-button = Stizzar
+pdfjs-editor-alt-text-settings-download-model-button = Telechargiar
+pdfjs-editor-alt-text-settings-downloading-model-button = Telechargiar鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editur per text alternativ
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mussar l鈥檈ditur per text alternativ directamain cun agiuntar in maletg
+pdfjs-editor-alt-text-settings-show-dialog-description = Ta gida a garantir che tut tes maletgs hajan in text alternativ.
+pdfjs-editor-alt-text-settings-close-button = Serrar
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Agiunt脿 ina emfasa
+pdfjs-editor-freetext-added-alert = Agiunt脿 in text
+pdfjs-editor-ink-added-alert = Agiunt脿 in dissegn
+pdfjs-editor-stamp-added-alert = Agiunt脿 in maletg
+pdfjs-editor-signature-added-alert = Agiunt脿 ina signatura
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Allontan脿 la marcaziun
+pdfjs-editor-undo-bar-message-freetext = Allontan脿 il text
+pdfjs-editor-undo-bar-message-ink = Allontan脿 il dissegn
+pdfjs-editor-undo-bar-message-stamp = Allontan脿 il maletg
+pdfjs-editor-undo-bar-message-signature = Allontan脿 la signatura
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } annotaziun allontanada
+       *[other] { $count } annotaziuns allontanadas
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Revocar
+pdfjs-editor-undo-bar-undo-button-label = Revocar
+pdfjs-editor-undo-bar-close-button =
+    .title = Serrar
+pdfjs-editor-undo-bar-close-button-label = Serrar
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Questa fanestra permetta a l鈥檜tilisader da crear ina signatura per l鈥檃giuntar ad in document PDF. L鈥檜tilisader po modifitgar il num (che serva era sco text alternativ) e memorisar opziunalmain la signatura per l鈥檜tilisar anc ina giada en l鈥檃vegnir.
+pdfjs-editor-add-signature-dialog-title = Agiuntar ina signatura
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Tippar
+    .title = Tippar
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Dissegnar
+    .title = Dissegnar
+pdfjs-editor-add-signature-image-button = Maletg
+    .title = Maletg
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Tippa tia signatura
+    .placeholder = Tippa tia signatura
+pdfjs-editor-add-signature-draw-placeholder = Dissegna tia signatura
+pdfjs-editor-add-signature-draw-thickness-range-label = Grossezza
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Grossezza dal stritg: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Trair na qua ina datoteca per la transferir
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] U tscherner datotecas da maletg
+       *[other] U tscherner datotecas da maletg
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descripziun (text alternativ)
+pdfjs-editor-add-signature-description-input =
+    .title = Descripziun (text alternativ)
+pdfjs-editor-add-signature-description-default-when-drawing = Signatura
+pdfjs-editor-add-signature-clear-button-label = Stizzar la signatura
+pdfjs-editor-add-signature-clear-button =
+    .title = Stizzar la signatura
+pdfjs-editor-add-signature-save-checkbox = Memorisar la signatura
+pdfjs-editor-add-signature-save-warning-message = Ti has cuntansch矛 il dumber maximal da 5 signaturas memorisadas. Allontanar ina per memorisar in鈥檃utra.
+pdfjs-editor-add-signature-image-upload-error-title = Impussibel da transferir il maletg
+pdfjs-editor-add-signature-image-upload-error-description = Controllescha tia connexiun cun la rait u emprova cun in鈥檃uter maletg.
+pdfjs-editor-add-signature-image-no-data-error-title = Impussibel da convertir quest maletg en ina signatura
+pdfjs-editor-add-signature-image-no-data-error-description = Emprova per plaschair da transferir in auter maletg.
+pdfjs-editor-add-signature-error-close-button = Serrar
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Interrumper
+pdfjs-editor-add-signature-add-button = Agiuntar
+pdfjs-editor-edit-signature-update-button = Actualisar
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Modifitgar il commentari
+pdfjs-editor-edit-comment-popup-button =
+    .title = Modifitgar il commentari
+pdfjs-editor-delete-comment-popup-button-label = Allontanar il commentari
+pdfjs-editor-delete-comment-popup-button =
+    .title = Allontanar il commentari
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Modifitgar il commentari
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Agiuntar in commentari
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Cumenzar a tippar鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Interrumper
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Allontanar la signatura memorisada
+pdfjs-editor-delete-signature-button-label1 = Allontanar la signatura memorisada
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Modifitgar la descripziun
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Modifitgar la descripziun
diff --git a/public/pdfjs/web/locale/ro/viewer.ftl b/public/pdfjs/web/locale/ro/viewer.ftl
new file mode 100644
index 0000000..2d51285
--- /dev/null
+++ b/public/pdfjs/web/locale/ro/viewer.ftl
@@ -0,0 +1,754 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pagina precedent膬
+pdfjs-previous-button-label = 脦napoi
+pdfjs-next-button =
+    .title = Pagina urm膬toare
+pdfjs-next-button-label = 脦nainte
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pagina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = din { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } din { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Mic葯oreaz膬
+pdfjs-zoom-out-button-label = Mic葯oreaz膬
+pdfjs-zoom-in-button =
+    .title = M膬re葯te
+pdfjs-zoom-in-button-label = M膬re葯te
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Comut膬 la modul de prezentare
+pdfjs-presentation-mode-button-label = Mod de prezentare
+pdfjs-open-file-button =
+    .title = Deschide un fi葯ier
+pdfjs-open-file-button-label = Deschide
+pdfjs-print-button =
+    .title = Printeaz膬
+pdfjs-print-button-label = Printeaz膬
+pdfjs-save-button =
+    .title = Salveaz膬
+pdfjs-save-button-label = Salveaz膬
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Descarc膬
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Descarc膬
+pdfjs-bookmark-button =
+    .title = Pagina curent膬 (Vezi URL din pagina curent膬)
+pdfjs-bookmark-button-label = Pagin膬 curent膬
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Instrumente
+pdfjs-tools-button-label = Instrumente
+pdfjs-first-page-button =
+    .title = Mergi la prima pagin膬
+pdfjs-first-page-button-label = Mergi la prima pagin膬
+pdfjs-last-page-button =
+    .title = Mergi la ultima pagin膬
+pdfjs-last-page-button-label = Mergi la ultima pagin膬
+pdfjs-page-rotate-cw-button =
+    .title = Rote葯te 卯n sensul acelor de ceas
+pdfjs-page-rotate-cw-button-label = Rote葯te 卯n sensul acelor de ceas
+pdfjs-page-rotate-ccw-button =
+    .title = Rote葯te 卯n sens invers al acelor de ceas
+pdfjs-page-rotate-ccw-button-label = Rote葯te 卯n sens invers al acelor de ceas
+pdfjs-cursor-text-select-tool-button =
+    .title = Activeaz膬 instrumentul de selec葲ie a textului
+pdfjs-cursor-text-select-tool-button-label = Instrumentul de selec葲ie a textului
+pdfjs-cursor-hand-tool-button =
+    .title = Activeaz膬 instrumentul m芒n膬
+pdfjs-cursor-hand-tool-button-label = Unealta m芒n膬
+pdfjs-scroll-page-button =
+    .title = Folose葯te derularea paginilor
+pdfjs-scroll-page-button-label = Derulare pagini
+pdfjs-scroll-vertical-button =
+    .title = Folose葯te derularea vertical膬
+pdfjs-scroll-vertical-button-label = Derulare vertical膬
+pdfjs-scroll-horizontal-button =
+    .title = Folose葯te derularea orizontal膬
+pdfjs-scroll-horizontal-button-label = Derulare orizontal膬
+pdfjs-scroll-wrapped-button =
+    .title = Folose葯te derularea 卯ncadrat膬
+pdfjs-scroll-wrapped-button-label = Derulare 卯ncadrat膬
+pdfjs-spread-none-button =
+    .title = Nu uni paginile bro葯ate
+pdfjs-spread-none-button-label = F膬r膬 pagini bro葯ate
+pdfjs-spread-odd-button =
+    .title = Une葯te paginile bro葯ate 卯ncep芒nd cu cele impare
+pdfjs-spread-odd-button-label = Bro葯are pagini impare
+pdfjs-spread-even-button =
+    .title = Une葯te paginile bro葯ate 卯ncep芒nd cu cele pare
+pdfjs-spread-even-button-label = Bro葯are pagini pare
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propriet膬葲ile documentului鈥�
+pdfjs-document-properties-button-label = Propriet膬葲ile documentului鈥�
+pdfjs-document-properties-file-name = Numele fi葯ierului:
+pdfjs-document-properties-file-size = M膬rimea fi葯ierului:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } octe葲i)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } octe葲i)
+pdfjs-document-properties-title = Titlu:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Subiect:
+pdfjs-document-properties-keywords = Cuvinte cheie:
+pdfjs-document-properties-creation-date = Data cre膬rii:
+pdfjs-document-properties-modification-date = Data modific膬rii:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Autor:
+pdfjs-document-properties-producer = Produc膬tor PDF:
+pdfjs-document-properties-version = Versiune PDF:
+pdfjs-document-properties-page-count = Num膬r de pagini:
+pdfjs-document-properties-page-size = M膬rimea paginii:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = vertical膬
+pdfjs-document-properties-page-size-orientation-landscape = orizontal膬
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Liter膬
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vizualizare web rapid膬:
+pdfjs-document-properties-linearized-yes = Da
+pdfjs-document-properties-linearized-no = Nu
+pdfjs-document-properties-close-button = 脦nchide
+
+## Print
+
+pdfjs-print-progress-message = Se preg膬te葯te documentul pentru printare鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Anuleaz膬
+pdfjs-printing-not-supported = Avertisment: Printarea nu este suportat膬 complet de acest browser.
+pdfjs-printing-not-ready = Avertisment: PDF-ul nu este 卯nc膬rcat complet pentru printare.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Comut膬 bara lateral膬
+pdfjs-toggle-sidebar-notification-button =
+    .title = Comut膬 bara lateral膬 (documentul con葲ine schi葲e/ata葯amente/straturi)
+pdfjs-toggle-sidebar-button-label = Comut膬 bara lateral膬
+pdfjs-document-outline-button =
+    .title = Afi葯eaz膬 schi葲a documentului (d膬 dublu clic pentru a extinde/restr芒nge toate elementele)
+pdfjs-document-outline-button-label = Schi葲膬 a documentului
+pdfjs-attachments-button =
+    .title = Afi葯eaz膬 ata葯amentele
+pdfjs-attachments-button-label = Ata葯amente
+pdfjs-layers-button =
+    .title = Afi葯eaz膬 straturile (d膬 dublu clic pentru resetarea tuturor straturilor la starea implicit膬)
+pdfjs-layers-button-label = Straturi
+pdfjs-thumbs-button =
+    .title = Afi葯eaz膬 miniaturi
+pdfjs-thumbs-button-label = Miniaturi
+pdfjs-current-outline-item-button =
+    .title = G膬se葯te elementul pe schi葲a actual膬
+pdfjs-current-outline-item-button-label = Element al schi葲ei actuale
+pdfjs-findbar-button =
+    .title = Caut膬 卯n document
+pdfjs-findbar-button-label = Caut膬
+pdfjs-additional-layers = Straturi suplimentare
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura paginii { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Selecteaz膬 pagina { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Pagina { $page } din { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Caut膬
+    .placeholder = Caut膬 卯n document鈥�
+pdfjs-find-previous-button =
+    .title = Mergi la apari葲ia anterioar膬 a textului
+pdfjs-find-previous-button-label = 脦napoi
+pdfjs-find-next-button =
+    .title = Mergi la apari葲ia urm膬toare a textului
+pdfjs-find-next-button-label = 脦nainte
+pdfjs-find-highlight-checkbox = Eviden葲iaz膬 toate apari葲iile
+pdfjs-find-match-case-checkbox-label = 葰ine cont de majuscule 葯i minuscule
+pdfjs-find-match-diacritics-checkbox-label = Respect膬 diacriticele
+pdfjs-find-entire-word-checkbox-label = Cuvinte 卯ntregi
+pdfjs-find-reached-top = Am ajuns la 卯nceputul documentului, continu膬 de la sf芒r葯it
+pdfjs-find-reached-bottom = Am ajuns la sf芒r葯itul documentului, continu膬 de la 卯nceput
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } din { $total } rezultat
+        [few] { $current } din { $total } rezultate
+       *[other] { $current } din { $total } de rezultate
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mai mult de { $limit } rezultat
+        [few] Mai mult de { $limit } rezultate
+       *[other] Mai mult de { $limit } de rezultate
+    }
+pdfjs-find-not-found = Nu s-a g膬sit textul
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = L膬葲ime pagin膬
+pdfjs-page-scale-fit = Potrivire la pagin膬
+pdfjs-page-scale-auto = Zoom automat
+pdfjs-page-scale-actual = M膬rime real膬
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Pagina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = A intervenit o eroare la 卯nc膬rcarea PDF-ului.
+pdfjs-invalid-file-error = Fi葯ier PDF nevalid sau corupt.
+pdfjs-missing-file-error = Fi葯ier PDF lips膬.
+pdfjs-unexpected-response-error = R膬spuns nea葯teptat de la server.
+pdfjs-rendering-error = A intervenit o eroare la randarea paginii.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Adnotare { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Introdu parola pentru a deschide acest fi葯ier PDF.
+pdfjs-password-invalid = Parol膬 nevalid膬. Te rug膬m s膬 卯ncerci din nou.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Anuleaz膬
+pdfjs-web-fonts-disabled = Fonturile web sunt dezactivate: nu se pot folosi fonturile PDF 卯ncorporate.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = Schimb膬 culoarea textului
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Deseneaz膬
+pdfjs-editor-color-picker-ink-input =
+    .title = Schimb膬 culoarea de desen
+pdfjs-editor-ink-button-label = Deseneaz膬
+pdfjs-editor-stamp-button =
+    .title = Adaug膬 sau editeaz膬 imagini
+pdfjs-editor-stamp-button-label = Adaug膬 sau editeaz膬 imagini
+pdfjs-editor-highlight-button =
+    .title = Eviden葲iere
+pdfjs-editor-highlight-button-label = Eviden葲iere
+pdfjs-highlight-floating-button1 =
+    .title = Eviden葲iaz膬
+    .aria-label = Eviden葲iere
+pdfjs-highlight-floating-button-label = Eviden葲iaz膬
+pdfjs-comment-floating-button =
+    .title = Comenteaz膬
+    .aria-label = Comentariu
+pdfjs-comment-floating-button-label = Comenteaz膬
+pdfjs-editor-comment-button =
+    .title = Comentariu
+    .aria-label = Comenteaz膬
+pdfjs-editor-comment-button-label = Comentariu
+pdfjs-editor-signature-button =
+    .title = Adaug膬 semn膬tur膬
+pdfjs-editor-signature-button-label = Adaug膬 semn膬tur膬
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor de eviden葲iere
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor de desen
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor de semn膬tur膬: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor de imagini
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Elimin膬 desenul
+pdfjs-editor-remove-freetext-button =
+    .title = Elimin膬 textul
+pdfjs-editor-remove-stamp-button =
+    .title = Elimin膬 imaginea
+pdfjs-editor-remove-highlight-button =
+    .title = Elimin膬 eviden葲ierea
+pdfjs-editor-remove-signature-button =
+    .title = Elimin膬 semn膬tura
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Culoare
+pdfjs-editor-free-text-size-input = M膬rime
+pdfjs-editor-ink-color-input = Culoare
+pdfjs-editor-ink-thickness-input = Grosime
+pdfjs-editor-ink-opacity-input = Opacitate
+pdfjs-editor-stamp-add-image-button =
+    .title = Adaug膬 imagine
+pdfjs-editor-stamp-add-image-button-label = Adaug膬 imagine
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Grosime
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Schimb膬 grosimea c芒nd eviden葲iezi alte elemente dec芒t text
+pdfjs-editor-add-signature-container =
+    .aria-label = Controale de semn膬turi 葯i semn膬turi salvate
+pdfjs-editor-signature-add-signature-button =
+    .title = Adaug膬 o semn膬tur膬 nou膬
+pdfjs-editor-signature-add-signature-button-label = Adaug膬 o semn膬tur膬 nou膬
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Semn膬tur膬 salvat膬: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editor de text
+    .default-content = 脦ncepe s膬 tastezi...
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Comentariu
+       *[other] Comentarii
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 脦nchide bara lateral膬
+    .aria-label = 脦nchide bara lateral膬
+pdfjs-editor-comments-sidebar-close-button-label = 脦nchide bara lateral膬
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Vezi ceva care merit膬 comentat? Eviden葲iaz膬-l 葯i las膬 un comentariu.
+pdfjs-editor-comments-sidebar-no-comments-link = Afl膬 mai multe
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Text alternativ
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Editeaz膬 textul alternativ
+pdfjs-editor-alt-text-dialog-label = Alege o op葲iune
+pdfjs-editor-alt-text-dialog-description = Textul alternativ (alt text) ajut膬 c芒nd oamenii nu pot vedea imaginea sau c芒nd nu se 卯ncarc膬.
+pdfjs-editor-alt-text-add-description-label = Adaug膬 o descriere
+pdfjs-editor-alt-text-add-description-description = 脦ncearc膬 s膬 scrii 1-2 propozi葲ii care s膬 descrie subiectul, cadrul sau ac葲iunile.
+pdfjs-editor-alt-text-mark-decorative-label = Marcheaz膬 ca decorativ
+pdfjs-editor-alt-text-mark-decorative-description = Este pentru imagini ornamentale, cum ar fi chenare sau filigrane.
+pdfjs-editor-alt-text-cancel-button = Anuleaz膬
+pdfjs-editor-alt-text-save-button = Salveaz膬
+pdfjs-editor-alt-text-decorative-tooltip = Marcat ca decorativ
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = De exemplu, 鈥濽n t芒n膬r se a葯eaz膬 la o mas膬 s膬 m膬n芒nce鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Text alternativ
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Col葲ul din st芒nga sus 鈥� redimensioneaz膬
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Mijloc de sus 鈥� redimensioneaz膬
+pdfjs-editor-resizer-top-right =
+    .aria-label = Col葲ul din dreapta sus 鈥� redimensioneaz膬
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Mijloc dreapta 鈥� redimensioneaz膬
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Col葲ul din dreapta jos 鈥� redimensioneaz膬
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Mijloc de jos - redimensioneaz膬
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Col葲ul din st芒nga jos 鈥� redimensioneaz膬
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Mijloc st芒nga 鈥� redimensioneaz膬
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Culoare de eviden葲iere
+pdfjs-editor-colorpicker-button =
+    .title = Schimb膬 culoarea
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Op葲iuni de culoare
+pdfjs-editor-colorpicker-yellow =
+    .title = Galben
+pdfjs-editor-colorpicker-green =
+    .title = Verde
+pdfjs-editor-colorpicker-blue =
+    .title = Albastru
+pdfjs-editor-colorpicker-pink =
+    .title = Roz
+pdfjs-editor-colorpicker-red =
+    .title = Ro葯u
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Afi葯eaz膬 tot
+pdfjs-editor-highlight-show-all-button =
+    .title = Afi葯eaz膬 tot
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Editeaz膬 textul alternativ (descrierea imaginii)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Adaug膬 text alternativ (descrierea imaginii)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Scrie descrierea aici...
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Scurt膬 descriere pentru cei care nu pot vedea imaginea sau pentru c芒nd nu se 卯ncarc膬 imaginea.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Acest text alternativ a fost creat automat 葯i este posibil s膬 nu fie exact.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Afl膬 mai multe
+pdfjs-editor-new-alt-text-create-automatically-button-label = Creeaz膬 automat texte alternative
+pdfjs-editor-new-alt-text-not-now-button = Nu acum
+pdfjs-editor-new-alt-text-error-title = Nu s-a putut crea automat textul alternativ
+pdfjs-editor-new-alt-text-error-description = Te rug膬m s膬 scrii propriul text alternativ sau s膬 卯ncerci din nou mai t芒rziu.
+pdfjs-editor-new-alt-text-error-close-button = 脦nchide
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Se descarc膬 modelul AI de text alternativ ({ $downloadedSize } de { $totalSize } MB)
+    .aria-valuetext = Se descarc膬 modelul AI de text alternativ ({ $downloadedSize } de { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Text alternativ ad膬ugat
+pdfjs-editor-new-alt-text-added-button-label = Text alternativ ad膬ugat
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Text alternativ lips膬
+pdfjs-editor-new-alt-text-missing-button-label = Text alternativ lips膬
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Revizuie葯te textul alternativ
+pdfjs-editor-new-alt-text-to-review-button-label = Revizuie葯te textul alternativ
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creat automat: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Set膬ri text alternativ imagini
+pdfjs-image-alt-text-settings-button-label = Set膬ri text alternativ imagini
+pdfjs-editor-alt-text-settings-dialog-label = Set膬ri text alternativ imagini
+pdfjs-editor-alt-text-settings-automatic-title = Text alternativ automat
+pdfjs-editor-alt-text-settings-create-model-button-label = Creeaz膬 automat texte alternative
+pdfjs-editor-alt-text-settings-create-model-description = Sugereaz膬 descrieri ca s膬 卯i aju葲i pe cei care nu pot vedea imaginea sau pentru c芒nd nu se 卯ncarc膬 imaginea.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model AI de text alternativ ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Ruleaz膬 local pe dispozitiv, deci datele tale r膬m芒n private. Necesar pentru text alternativ automat.
+pdfjs-editor-alt-text-settings-delete-model-button = 葮terge
+pdfjs-editor-alt-text-settings-download-model-button = Descarc膬
+pdfjs-editor-alt-text-settings-downloading-model-button = Se descarc膬鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor de text alternativ
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Afi葯eaz膬 editorul de text alternativ imediat c芒nd adaugi o imagine
+pdfjs-editor-alt-text-settings-show-dialog-description = Te ajut膬 s膬 te asiguri c膬 toate imaginile au text alternativ.
+pdfjs-editor-alt-text-settings-close-button = 脦nchide
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Eviden葲iere ad膬ugat膬
+pdfjs-editor-freetext-added-alert = Text ad膬ugat
+pdfjs-editor-ink-added-alert = Desen ad膬ugat
+pdfjs-editor-stamp-added-alert = Imagine ad膬ugat膬
+pdfjs-editor-signature-added-alert = Semn膬tur膬 ad膬ugat膬
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Eviden葲iere eliminat膬
+pdfjs-editor-undo-bar-message-freetext = Text eliminat
+pdfjs-editor-undo-bar-message-ink = Desen eliminat
+pdfjs-editor-undo-bar-message-stamp = Imagine eliminat膬
+pdfjs-editor-undo-bar-message-signature = Semn膬tur膬 eliminat膬
+pdfjs-editor-undo-bar-message-comment = Comentariu eliminat
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } adnotare eliminat膬
+        [few] { $count } adnot膬ri eliminate
+       *[other] { $count } de adnot膬ri eliminate
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Anuleaz膬
+pdfjs-editor-undo-bar-undo-button-label = Anuleaz膬
+pdfjs-editor-undo-bar-close-button =
+    .title = 脦nchide
+pdfjs-editor-undo-bar-close-button-label = 脦nchide
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Aceast膬 fereastr膬 permite utilizatorului s膬 creeze o semn膬tur膬 de ad膬ugat la un document PDF. Utilizatorul poate edita numele (care serve葯te 葯i ca text alternativ) 葯i, op葲ional, poate salva semn膬tura pentru utilizare repetat膬.
+pdfjs-editor-add-signature-dialog-title = Adaug膬 o semn膬tur膬
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Tip
+    .title = Tip
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Deseneaz膬
+    .title = Deseneaz膬
+pdfjs-editor-add-signature-image-button = Imagine
+    .title = Imagine
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Tasteaz膬 semn膬tura
+    .placeholder = Tasteaz膬 semn膬tura
+pdfjs-editor-add-signature-draw-placeholder = Deseneaz膬 semn膬tura
+pdfjs-editor-add-signature-draw-thickness-range-label = Grosime
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Grosimea desenului: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Trage aici un fi葯ier pentru 卯nc膬rcare
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Sau alege fi葯iere de imagini
+       *[other] Sau r膬sfoie葯te prin fi葯iere de imagini
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Descriere (text alternativ)
+pdfjs-editor-add-signature-description-input =
+    .title = Descriere (text alternativ)
+pdfjs-editor-add-signature-description-default-when-drawing = Semn膬tur膬
+pdfjs-editor-add-signature-clear-button-label = 葮terge semn膬tura
+pdfjs-editor-add-signature-clear-button =
+    .title = 葮terge semn膬tura
+pdfjs-editor-add-signature-save-checkbox = Salveaz膬 semn膬tura
+pdfjs-editor-add-signature-save-warning-message = Ai atins limita de 5 semn膬turi salvate. Elimin膬 una dac膬 vrei s膬 salvezi alta.
+pdfjs-editor-add-signature-image-upload-error-title = Imaginea nu a putut fi 卯nc膬rcat膬
+pdfjs-editor-add-signature-image-upload-error-description = Verific膬-葲i conexiunea la re葲ea sau 卯ncearc膬 cu o alt膬 imagine.
+pdfjs-editor-add-signature-image-no-data-error-title = Imaginea nu poate fi convertit膬 卯n semn膬tur膬
+pdfjs-editor-add-signature-image-no-data-error-description = 脦ncearc膬 s膬 卯ncarci alt膬 imagine.
+pdfjs-editor-add-signature-error-close-button = 脦nchide
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Anuleaz膬
+pdfjs-editor-add-signature-add-button = Adaug膬
+pdfjs-editor-edit-signature-update-button = Actualizeaz膬
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Editeaz膬 comentariul
+pdfjs-editor-edit-comment-popup-button =
+    .title = Editeaz膬 comentariul
+pdfjs-editor-delete-comment-popup-button-label = 葮terge comentariul
+pdfjs-editor-delete-comment-popup-button =
+    .title = 葮terge comentariul
+pdfjs-show-comment-button =
+    .title = Afi葯eaz膬 comentariul
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Editeaz膬 comentariul
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizeaz膬
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Adaug膬 un comentariu
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adaug膬
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 脦ncepe s膬 tastezi鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Anuleaz膬
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Adaug膬 un comentariu
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Comut膬 bara lateral膬 (documentul con葲ine miniaturi/schi葲e/ata葯amente/straturi)
+pdfjs-toggle-views-manager-button1-label = Gestioneaz膬 paginile
+pdfjs-views-manager-sidebar =
+    .aria-label = Bar膬 lateral膬
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Redimensionare bar膬 lateral膬
+pdfjs-views-manager-view-selector-button =
+    .title = Vizualiz膬ri
+pdfjs-views-manager-view-selector-button-label = Vizualiz膬ri
+pdfjs-views-manager-pages-title = Pagini
+pdfjs-views-manager-outlines-title1 = Structura documentului
+    .title = Structura documentului (d膬 dublu clic pentru extinderea/restr芒ngerea elementelor)
+pdfjs-views-manager-attachments-title = Ata葯amente
+pdfjs-views-manager-layers-title1 = Straturi
+    .title = Straturi (d膬 dublu clic ca s膬 resetezi toate straturile la starea implicit膬)
+pdfjs-views-manager-pages-option-label = Pagini
+pdfjs-views-manager-outlines-option-label = Schi葲膬 document
+pdfjs-views-manager-attachments-option-label = Ata葯amente
+pdfjs-views-manager-layers-option-label = Straturi
+pdfjs-views-manager-add-file-button =
+    .title = Adaug膬 un fi葯ier
+pdfjs-views-manager-add-file-button-label = Adaug膬 un fi葯ier
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } selectat膬
+        [few] { $count } selectate
+       *[other] { $count } selectate
+    }
+pdfjs-views-manager-pages-status-none-action-label = Selecteaz膬 pagini
+pdfjs-views-manager-pages-status-action-button-label = Gestioneaz膬
+pdfjs-views-manager-pages-status-copy-button-label = Copiaz膬
+pdfjs-views-manager-pages-status-cut-button-label = Taie
+pdfjs-views-manager-pages-status-delete-button-label = 葮terge
+pdfjs-views-manager-pages-status-export-selected-button-label = Export膬 selec葲ia鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 pagin膬 t膬iat膬
+        [few] { $count } pagini t膬iate
+       *[other] { $count } de pagini t膬iate
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 pagin膬 copiat膬
+        [few] { $count } pagini copiate
+       *[other] { $count } de pagini copiate
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 pagin膬 葯tears膬
+        [few] { $count } pagini 葯terse
+       *[other] { $count } de pagini 葯terse
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Se preg膬te葯te fi葯ierul鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Se 卯ncarc膬 fi葯ierul鈥�
+pdfjs-views-manager-status-warning-cut-label = Nu s-a putut t膬ia. Re卯mprosp膬teaz膬 pagina 葯i 卯ncearc膬 din nou.
+pdfjs-views-manager-status-warning-copy-label = Nu s-a putut copia. Re卯mprosp膬teaz膬 pagina 葯i 卯ncearc膬 din nou.
+pdfjs-views-manager-status-warning-delete-label = Nu s-a putut 葯terge. Re卯mprosp膬teaz膬 pagina 葯i 卯ncearc膬 din nou.
+pdfjs-views-manager-status-warning-save-label = Nu s-a putut salva. Re卯mprosp膬teaz膬 pagina 葯i 卯ncearc膬 din nou.
+pdfjs-views-manager-status-undo-button-label = Anuleaz膬
+pdfjs-views-manager-status-done-button-label = Terminat
+pdfjs-views-manager-status-close-button =
+    .title = 脦nchide
+pdfjs-views-manager-status-close-button-label = 脦nchide
+pdfjs-views-manager-paste-button-label = Lipe葯te
+pdfjs-views-manager-paste-button-before =
+    .title = Insereaz膬 卯nainte de prima pagin膬
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Insereaz膬 dup膬 pagina { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOU
+pdfjs-views-manager-waiting-for-file = Se 卯ncarc膬 fi葯ierul鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Gestioneaz膬 paginile
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Elimin膬 semn膬tura salvat膬
+pdfjs-editor-delete-signature-button-label1 = Elimin膬 semn膬tura salvat膬
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Editeaz膬 descrierea
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Editeaz膬 descrierea
diff --git a/public/pdfjs/web/locale/ru/viewer.ftl b/public/pdfjs/web/locale/ru/viewer.ftl
new file mode 100644
index 0000000..bca884c
--- /dev/null
+++ b/public/pdfjs/web/locale/ru/viewer.ftl
@@ -0,0 +1,755 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 袩褉械写褘写褍褖邪褟 褋褌褉邪薪懈褑邪
+pdfjs-previous-button-label = 袩褉械写褘写褍褖邪褟
+pdfjs-next-button =
+    .title = 小谢械写褍褞褖邪褟 褋褌褉邪薪懈褑邪
+pdfjs-next-button-label = 小谢械写褍褞褖邪褟
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 小褌褉邪薪懈褑邪
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 懈蟹 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 懈蟹 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 校屑械薪褜褕懈褌褜
+pdfjs-zoom-out-button-label = 校屑械薪褜褕懈褌褜
+pdfjs-zoom-in-button =
+    .title = 校胁械谢懈褔懈褌褜
+pdfjs-zoom-in-button-label = 校胁械谢懈褔懈褌褜
+pdfjs-zoom-select =
+    .title = 袦邪褋褕褌邪斜
+pdfjs-presentation-mode-button =
+    .title = 袩械褉械泄褌懈 胁 褉械卸懈屑 锌褉械蟹械薪褌邪褑懈懈
+pdfjs-presentation-mode-button-label = 袪械卸懈屑 锌褉械蟹械薪褌邪褑懈懈
+pdfjs-open-file-button =
+    .title = 袨褌泻褉褘褌褜 褎邪泄谢
+pdfjs-open-file-button-label = 袨褌泻褉褘褌褜
+pdfjs-print-button =
+    .title = 袩械褔邪褌褜
+pdfjs-print-button-label = 袩械褔邪褌褜
+pdfjs-save-button =
+    .title = 小芯褏褉邪薪懈褌褜
+pdfjs-save-button-label = 小芯褏褉邪薪懈褌褜
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 小泻邪褔邪褌褜
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 小泻邪褔邪褌褜
+pdfjs-bookmark-button =
+    .title = 孝械泻褍褖邪褟 褋褌褉邪薪懈褑邪 (锌褉芯褋屑芯褌褉 URL-邪写褉械褋邪 褋 褌械泻褍褖械泄 褋褌褉邪薪懈褑褘)
+pdfjs-bookmark-button-label = 孝械泻褍褖邪褟 褋褌褉邪薪懈褑邪
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 袠薪褋褌褉褍屑械薪褌褘
+pdfjs-tools-button-label = 袠薪褋褌褉褍屑械薪褌褘
+pdfjs-first-page-button =
+    .title = 袩械褉械泄褌懈 薪邪 锌械褉胁褍褞 褋褌褉邪薪懈褑褍
+pdfjs-first-page-button-label = 袩械褉械泄褌懈 薪邪 锌械褉胁褍褞 褋褌褉邪薪懈褑褍
+pdfjs-last-page-button =
+    .title = 袩械褉械泄褌懈 薪邪 锌芯褋谢械写薪褞褞 褋褌褉邪薪懈褑褍
+pdfjs-last-page-button-label = 袩械褉械泄褌懈 薪邪 锌芯褋谢械写薪褞褞 褋褌褉邪薪懈褑褍
+pdfjs-page-rotate-cw-button =
+    .title = 袩芯胁械褉薪褍褌褜 锌芯 褔邪褋芯胁芯泄 褋褌褉械谢泻械
+pdfjs-page-rotate-cw-button-label = 袩芯胁械褉薪褍褌褜 锌芯 褔邪褋芯胁芯泄 褋褌褉械谢泻械
+pdfjs-page-rotate-ccw-button =
+    .title = 袩芯胁械褉薪褍褌褜 锌褉芯褌懈胁 褔邪褋芯胁芯泄 褋褌褉械谢泻懈
+pdfjs-page-rotate-ccw-button-label = 袩芯胁械褉薪褍褌褜 锌褉芯褌懈胁 褔邪褋芯胁芯泄 褋褌褉械谢泻懈
+pdfjs-cursor-text-select-tool-button =
+    .title = 袙泻谢褞褔懈褌褜 懈薪褋褌褉褍屑械薪褌 芦袙褘写械谢械薪懈械 褌械泻褋褌邪禄
+pdfjs-cursor-text-select-tool-button-label = 袠薪褋褌褉褍屑械薪褌 芦袙褘写械谢械薪懈械 褌械泻褋褌邪禄
+pdfjs-cursor-hand-tool-button =
+    .title = 袙泻谢褞褔懈褌褜 懈薪褋褌褉褍屑械薪褌 芦袪褍泻邪禄
+pdfjs-cursor-hand-tool-button-label = 袠薪褋褌褉褍屑械薪褌 芦袪褍泻邪禄
+pdfjs-scroll-page-button =
+    .title = 袠褋锌芯谢褜蟹芯胁邪褌褜 锌褉芯泻褉褍褌泻褍 褋褌褉邪薪懈褑
+pdfjs-scroll-page-button-label = 袩褉芯泻褉褍褌泻邪 褋褌褉邪薪懈褑
+pdfjs-scroll-vertical-button =
+    .title = 袠褋锌芯谢褜蟹芯胁邪褌褜 胁械褉褌懈泻邪谢褜薪褍褞 锌褉芯泻褉褍褌泻褍
+pdfjs-scroll-vertical-button-label = 袙械褉褌懈泻邪谢褜薪邪褟 锌褉芯泻褉褍褌泻邪
+pdfjs-scroll-horizontal-button =
+    .title = 袠褋锌芯谢褜蟹芯胁邪褌褜 谐芯褉懈蟹芯薪褌邪谢褜薪褍褞 锌褉芯泻褉褍褌泻褍
+pdfjs-scroll-horizontal-button-label = 袚芯褉懈蟹芯薪褌邪谢褜薪邪褟 锌褉芯泻褉褍褌泻邪
+pdfjs-scroll-wrapped-button =
+    .title = 袠褋锌芯谢褜蟹芯胁邪褌褜 屑邪褋褕褌邪斜懈褉褍械屑褍褞 锌褉芯泻褉褍褌泻褍
+pdfjs-scroll-wrapped-button-label = 袦邪褋褕褌邪斜懈褉褍械屑邪褟 锌褉芯泻褉褍褌泻邪
+pdfjs-spread-none-button =
+    .title = 袧械 懈褋锌芯谢褜蟹芯胁邪褌褜 褉械卸懈屑 褉邪蟹胁芯褉芯褌芯胁 褋褌褉邪薪懈褑
+pdfjs-spread-none-button-label = 袘械蟹 褉邪蟹胁芯褉芯褌芯胁 褋褌褉邪薪懈褑
+pdfjs-spread-odd-button =
+    .title = 袪邪蟹胁芯褉芯褌褘 薪邪褔懈薪邪褞褌褋褟 褋 薪械褔褢褌薪褘褏 薪芯屑械褉芯胁 褋褌褉邪薪懈褑
+pdfjs-spread-odd-button-label = 袧械褔褢褌薪褘械 褋褌褉邪薪懈褑褘 褋谢械胁邪
+pdfjs-spread-even-button =
+    .title = 袪邪蟹胁芯褉芯褌褘 薪邪褔懈薪邪褞褌褋褟 褋 褔褢褌薪褘褏 薪芯屑械褉芯胁 褋褌褉邪薪懈褑
+pdfjs-spread-even-button-label = 效褢褌薪褘械 褋褌褉邪薪懈褑褘 褋谢械胁邪
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 小胁芯泄褋褌胁邪 写芯泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-button-label = 小胁芯泄褋褌胁邪 写芯泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-file-name = 袠屑褟 褎邪泄谢邪:
+pdfjs-document-properties-file-size = 袪邪蟹屑械褉 褎邪泄谢邪:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 袣袘 ({ $b } 斜邪泄褌)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 袦袘 ({ $b } 斜邪泄褌)
+pdfjs-document-properties-title = 袟邪谐芯谢芯胁芯泻:
+pdfjs-document-properties-author = 袗胁褌芯褉:
+pdfjs-document-properties-subject = 孝械屑邪:
+pdfjs-document-properties-keywords = 袣谢褞褔械胁褘械 褋谢芯胁邪:
+pdfjs-document-properties-creation-date = 袛邪褌邪 褋芯蟹写邪薪懈褟:
+pdfjs-document-properties-modification-date = 袛邪褌邪 懈蟹屑械薪械薪懈褟:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 袩褉懈谢芯卸械薪懈械:
+pdfjs-document-properties-producer = 袩褉芯懈蟹胁芯写懈褌械谢褜 PDF:
+pdfjs-document-properties-version = 袙械褉褋懈褟 PDF:
+pdfjs-document-properties-page-count = 效懈褋谢芯 褋褌褉邪薪懈褑:
+pdfjs-document-properties-page-size = 袪邪蟹屑械褉 褋褌褉邪薪懈褑褘:
+pdfjs-document-properties-page-size-unit-inches = 写褞泄屑芯胁
+pdfjs-document-properties-page-size-unit-millimeters = 屑屑
+pdfjs-document-properties-page-size-orientation-portrait = 泻薪懈卸薪邪褟
+pdfjs-document-properties-page-size-orientation-landscape = 邪谢褜斜芯屑薪邪褟
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 袘褘褋褌褉褘泄 锌褉芯褋屑芯褌褉 胁 Web:
+pdfjs-document-properties-linearized-yes = 袛邪
+pdfjs-document-properties-linearized-no = 袧械褌
+pdfjs-document-properties-close-button = 袟邪泻褉褘褌褜
+
+## Print
+
+pdfjs-print-progress-message = 袩芯写谐芯褌芯胁泻邪 写芯泻褍屑械薪褌邪 泻 锌械褔邪褌懈鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 袨褌屑械薪邪
+pdfjs-printing-not-supported = 袩褉械写褍锌褉械卸写械薪懈械: 袙 褝褌芯屑 斜褉邪褍蟹械褉械 薪械 锌芯谢薪芯褋褌褜褞 锌芯写写械褉卸懈胁邪械褌褋褟 锌械褔邪褌褜.
+pdfjs-printing-not-ready = 袩褉械写褍锌褉械卸写械薪懈械: PDF 薪械 锌芯谢薪芯褋褌褜褞 蟹邪谐褉褍卸械薪 写谢褟 锌械褔邪褌懈.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 袩芯泻邪蟹邪褌褜/褋泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜
+pdfjs-toggle-sidebar-notification-button =
+    .title = 袩芯泻邪蟹邪褌褜/褋泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜 (写芯泻褍屑械薪褌 懈屑械械褌 褋芯写械褉卸邪薪懈械/胁谢芯卸械薪懈褟/褋谢芯懈)
+pdfjs-toggle-sidebar-button-label = 袩芯泻邪蟹邪褌褜/褋泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜
+pdfjs-document-outline-button =
+    .title = 袩芯泻邪蟹邪褌褜 褋芯写械褉卸邪薪懈械 写芯泻褍屑械薪褌邪 (写胁芯泄薪芯泄 褖械谢褔芯泻, 褔褌芯斜褘 褉邪蟹胁械褉薪褍褌褜/褋胁械褉薪褍褌褜 胁褋械 褝谢械屑械薪褌褘)
+pdfjs-document-outline-button-label = 小芯写械褉卸邪薪懈械 写芯泻褍屑械薪褌邪
+pdfjs-attachments-button =
+    .title = 袩芯泻邪蟹邪褌褜 胁谢芯卸械薪懈褟
+pdfjs-attachments-button-label = 袙谢芯卸械薪懈褟
+pdfjs-layers-button =
+    .title = 袩芯泻邪蟹邪褌褜 褋谢芯懈 (写胁邪卸写褘 褖褢谢泻薪懈褌械, 褔褌芯斜褘 褋斜褉芯褋懈褌褜 胁褋械 褋谢芯懈 泻 褋芯褋褌芯褟薪懈褞 锌芯 褍屑芯谢褔邪薪懈褞)
+pdfjs-layers-button-label = 小谢芯懈
+pdfjs-thumbs-button =
+    .title = 袩芯泻邪蟹邪褌褜 屑懈薪懈邪褌褞褉褘
+pdfjs-thumbs-button-label = 袦懈薪懈邪褌褞褉褘
+pdfjs-current-outline-item-button =
+    .title = 袧邪泄褌懈 褌械泻褍褖懈泄 褝谢械屑械薪褌 褋褌褉褍泻褌褍褉褘
+pdfjs-current-outline-item-button-label = 孝械泻褍褖懈泄 褝谢械屑械薪褌 褋褌褉褍泻褌褍褉褘
+pdfjs-findbar-button =
+    .title = 袧邪泄褌懈 胁 写芯泻褍屑械薪褌械
+pdfjs-findbar-button-label = 袧邪泄褌懈
+pdfjs-additional-layers = 袛芯锌芯谢薪懈褌械谢褜薪褘械 褋谢芯懈
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 小褌褉邪薪懈褑邪 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 袦懈薪懈邪褌褞褉邪 褋褌褉邪薪懈褑褘 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 袙褘斜褉邪褌褜 褋褌褉邪薪懈褑褍 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 小褌褉邪薪懈褑邪 { $page } 懈蟹 { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 袧邪泄褌懈
+    .placeholder = 袧邪泄褌懈 胁 写芯泻褍屑械薪褌械鈥�
+pdfjs-find-previous-button =
+    .title = 袧邪泄褌懈 锌褉械写褘写褍褖械械 胁褏芯卸写械薪懈械 褎褉邪蟹褘 胁 褌械泻褋褌
+pdfjs-find-previous-button-label = 袧邪蟹邪写
+pdfjs-find-next-button =
+    .title = 袧邪泄褌懈 褋谢械写褍褞褖械械 胁褏芯卸写械薪懈械 褎褉邪蟹褘 胁 褌械泻褋褌
+pdfjs-find-next-button-label = 袛邪谢械械
+pdfjs-find-highlight-checkbox = 袩芯写褋胁械褌懈褌褜 胁褋械
+pdfjs-find-match-case-checkbox-label = 小 褍褔褢褌芯屑 褉械谐懈褋褌褉邪
+pdfjs-find-match-diacritics-checkbox-label = 小 褍褔褢褌芯屑 写懈邪泻褉懈褌懈褔械褋泻懈褏 蟹薪邪泻芯胁
+pdfjs-find-entire-word-checkbox-label = 小谢芯胁邪 褑械谢懈泻芯屑
+pdfjs-find-reached-top = 袛芯褋褌懈谐薪褍褌 胁械褉褏 写芯泻褍屑械薪褌邪, 锌褉芯写芯谢卸械薪芯 褋薪懈蟹褍
+pdfjs-find-reached-bottom = 袛芯褋褌懈谐薪褍褌 泻芯薪械褑 写芯泻褍屑械薪褌邪, 锌褉芯写芯谢卸械薪芯 褋胁械褉褏褍
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 懈蟹 { $total } 褋芯胁锌邪写械薪懈褟
+        [few] { $current } 懈蟹 { $total } 褋芯胁锌邪写械薪懈泄
+       *[many] { $current } 懈蟹 { $total } 褋芯胁锌邪写械薪懈泄
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 袘芯谢械械 { $limit } 褋芯胁锌邪写械薪懈褟
+        [few] 袘芯谢械械 { $limit } 褋芯胁锌邪写械薪懈泄
+       *[many] 袘芯谢械械 { $limit } 褋芯胁锌邪写械薪懈泄
+    }
+pdfjs-find-not-found = 肖褉邪蟹邪 薪械 薪邪泄写械薪邪
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 袩芯 褕懈褉懈薪械 褋褌褉邪薪懈褑褘
+pdfjs-page-scale-fit = 袩芯 褉邪蟹屑械褉褍 褋褌褉邪薪懈褑褘
+pdfjs-page-scale-auto = 袗胁褌芯屑邪褌懈褔械褋泻懈
+pdfjs-page-scale-actual = 袪械邪谢褜薪褘泄 褉邪蟹屑械褉
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 小褌褉邪薪懈褑邪 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 袩褉懈 蟹邪谐褉褍蟹泻械 PDF 锌褉芯懈蟹芯褕谢邪 芯褕懈斜泻邪.
+pdfjs-invalid-file-error = 袧械泻芯褉褉械泻褌薪褘泄 懈谢懈 锌芯胁褉械卸写褢薪薪褘泄 PDF-褎邪泄谢.
+pdfjs-missing-file-error = PDF-褎邪泄谢 芯褌褋褍褌褋褌胁褍械褌.
+pdfjs-unexpected-response-error = 袧械芯卸懈写邪薪薪褘泄 芯褌胁械褌 褋械褉胁械褉邪.
+pdfjs-rendering-error = 袩褉懈 褋芯蟹写邪薪懈懈 褋褌褉邪薪懈褑褘 锌褉芯懈蟹芯褕谢邪 芯褕懈斜泻邪.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [袗薪薪芯褌邪褑懈褟 { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 袙胁械写懈褌械 锌邪褉芯谢褜, 褔褌芯斜褘 芯褌泻褉褘褌褜 褝褌芯褌 PDF-褎邪泄谢.
+pdfjs-password-invalid = 袧械胁械褉薪褘泄 锌邪褉芯谢褜. 袩芯卸邪谢褍泄褋褌邪, 锌芯锌褉芯斜褍泄褌械 褋薪芯胁邪.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = 袨褌屑械薪邪
+pdfjs-web-fonts-disabled = 袙械斜-褕褉懈褎褌褘 芯褌泻谢褞褔械薪褘: 薪械 褍写邪谢芯褋褜 蟹邪写械泄褋褌胁芯胁邪褌褜 胁褋褌褉芯械薪薪褘械 PDF-褕褉懈褎褌褘.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 孝械泻褋褌
+pdfjs-editor-color-picker-free-text-input =
+    .title = 袠蟹屑械薪懈褌褜 褑胁械褌 褌械泻褋褌邪
+pdfjs-editor-free-text-button-label = 孝械泻褋褌
+pdfjs-editor-ink-button =
+    .title = 袪懈褋芯胁邪褌褜
+pdfjs-editor-color-picker-ink-input =
+    .title = 袠蟹屑械薪懈褌褜 褑胁械褌 锌褉芯褉懈褋芯胁泻懈
+pdfjs-editor-ink-button-label = 袪懈褋芯胁邪褌褜
+pdfjs-editor-stamp-button =
+    .title = 袛芯斜邪胁懈褌褜 懈谢懈 懈蟹屑械薪懈褌褜 懈蟹芯斜褉邪卸械薪懈褟
+pdfjs-editor-stamp-button-label = 袛芯斜邪胁懈褌褜 懈谢懈 懈蟹屑械薪懈褌褜 懈蟹芯斜褉邪卸械薪懈褟
+pdfjs-editor-highlight-button =
+    .title = 袙褘写械谢械薪懈械
+pdfjs-editor-highlight-button-label = 袙褘写械谢械薪懈械
+pdfjs-highlight-floating-button1 =
+    .title = 袙褘写械谢械薪懈械
+    .aria-label = 袙褘写械谢械薪懈械
+pdfjs-highlight-floating-button-label = 袙褘写械谢械薪懈械
+pdfjs-comment-floating-button =
+    .title = 袣芯屑屑械薪褌懈褉芯胁邪褌褜
+    .aria-label = 袣芯屑屑械薪褌懈褉芯胁邪褌褜
+pdfjs-comment-floating-button-label = 袣芯屑屑械薪褌懈褉芯胁邪褌褜
+pdfjs-editor-comment-button =
+    .title = 袣芯屑屑械薪褌邪褉懈泄
+    .aria-label = 袣芯屑屑械薪褌邪褉懈泄
+pdfjs-editor-comment-button-label = 袣芯屑屑械薪褌邪褉懈泄
+pdfjs-editor-signature-button =
+    .title = 袛芯斜邪胁懈褌褜 锌芯写锌懈褋褜
+pdfjs-editor-signature-button-label = 袛芯斜邪胁懈褌褜 锌芯写锌懈褋褜
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 袪械写邪泻褌芯褉 胁褘写械谢械薪懈褟
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 袪械写邪泻褌芯褉 懈蟹芯斜褉邪卸械薪懈泄
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 袪械写邪泻褌芯褉 锌芯写锌懈褋懈: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 袪械写邪泻褌芯褉 懈蟹芯斜褉邪卸械薪懈泄
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 校写邪谢懈褌褜 褉懈褋褍薪芯泻
+pdfjs-editor-remove-freetext-button =
+    .title = 校写邪谢懈褌褜 褌械泻褋褌
+pdfjs-editor-remove-stamp-button =
+    .title = 校写邪谢懈褌褜 懈蟹芯斜褉邪卸械薪懈械
+pdfjs-editor-remove-highlight-button =
+    .title = 校写邪谢懈褌褜 胁褘写械谢械薪懈械
+pdfjs-editor-remove-signature-button =
+    .title = 校写邪谢懈褌褜 锌芯写锌懈褋褜
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 笑胁械褌
+pdfjs-editor-free-text-size-input = 袪邪蟹屑械褉
+pdfjs-editor-ink-color-input = 笑胁械褌
+pdfjs-editor-ink-thickness-input = 孝芯谢褖懈薪邪
+pdfjs-editor-ink-opacity-input = 袩褉芯蟹褉邪褔薪芯褋褌褜
+pdfjs-editor-stamp-add-image-button =
+    .title = 袛芯斜邪胁懈褌褜 懈蟹芯斜褉邪卸械薪懈械
+pdfjs-editor-stamp-add-image-button-label = 袛芯斜邪胁懈褌褜 懈蟹芯斜褉邪卸械薪懈械
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 孝芯谢褖懈薪邪
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 袠蟹屑械薪懈褌褜 褌芯谢褖懈薪褍 锌褉懈 胁褘写械谢械薪懈懈 褝谢械屑械薪褌芯胁, 泻褉芯屑械 褌械泻褋褌邪
+pdfjs-editor-add-signature-container =
+    .aria-label = 校锌褉邪胁谢械薪懈械 锌芯写锌懈褋褟屑懈 懈 褋芯褏褉邪薪褢薪薪褘械 锌芯写锌懈褋懈
+pdfjs-editor-signature-add-signature-button =
+    .title = 袛芯斜邪胁懈褌褜 薪芯胁褍褞 锌芯写锌懈褋褜
+pdfjs-editor-signature-add-signature-button-label = 袛芯斜邪胁懈褌褜 薪芯胁褍褞 锌芯写锌懈褋褜
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 小芯褏褉邪薪褢薪薪邪褟 锌芯写锌懈褋褜: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 孝械泻褋褌芯胁褘泄 褉械写邪泻褌芯褉
+    .default-content = 袧邪褔薪懈褌械 胁胁芯写...
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 袣芯屑屑械薪褌邪褉懈泄
+        [few] 袣芯屑屑械薪褌邪褉懈懈
+       *[many] 袣芯屑屑械薪褌邪褉懈懈
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 袟邪泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜
+    .aria-label = 袟邪泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜
+pdfjs-editor-comments-sidebar-close-button-label = 袟邪泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 校胁懈写械谢懈 褔褌芯-褌芯 懈薪褌械褉械褋薪芯械? 袙褘写械谢懈褌械 懈 芯褋褌邪胁褜褌械 泻芯屑屑械薪褌邪褉懈泄.
+pdfjs-editor-comments-sidebar-no-comments-link = 袩芯写褉芯斜薪械械
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 袗谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 袠蟹屑械薪懈褌褜 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+pdfjs-editor-alt-text-dialog-label = 袙褘斜械褉懈褌械 胁邪褉懈邪薪褌
+pdfjs-editor-alt-text-dialog-description = 袗谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌 锌芯屑芯谐邪械褌, 泻芯谐写邪 谢褞写懈 薪械 胁懈写褟褌 懈蟹芯斜褉邪卸械薪懈械 懈谢懈 芯薪芯 薪械 蟹邪谐褉褍卸邪械褌褋褟.
+pdfjs-editor-alt-text-add-description-label = 袛芯斜邪胁懈褌褜 芯锌懈褋邪薪懈械
+pdfjs-editor-alt-text-add-description-description = 小褌邪褉邪泄褌械褋褜 褋芯褋褌邪胁谢褟褌褜 1鈥�2 锌褉械写谢芯卸械薪懈褟, 芯锌懈褋褘胁邪褞褖懈褏 锌褉械写屑械褌, 芯斜褋褌邪薪芯胁泻褍 懈谢懈 写械泄褋褌胁懈褟.
+pdfjs-editor-alt-text-mark-decorative-label = 袨褌屑械褌懈褌褜 泻邪泻 写械泻芯褉邪褌懈胁薪芯械
+pdfjs-editor-alt-text-mark-decorative-description = 袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 写械泻芯褉邪褌懈胁薪褘褏 懈蟹芯斜褉邪卸械薪懈泄, 褌邪泻懈褏 泻邪泻 褉邪屑泻懈 懈谢懈 胁芯写褟薪褘械 蟹薪邪泻懈.
+pdfjs-editor-alt-text-cancel-button = 袨褌屑械薪懈褌褜
+pdfjs-editor-alt-text-save-button = 小芯褏褉邪薪懈褌褜
+pdfjs-editor-alt-text-decorative-tooltip = 袩芯屑械褔械薪 泻邪泻 写械泻芯褉邪褌懈胁薪褘泄
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 袧邪锌褉懈屑械褉: 芦袦芯谢芯写芯泄 褔械谢芯胁械泻 褋邪写懈褌褋褟 蟹邪 褋褌芯谢, 褔褌芯斜褘 锌芯械褋褌褜禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 袗谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 袥械胁褘泄 胁械褉褏薪懈泄 褍谐芯谢 鈥� 懈蟹屑械薪懈褌褜 褉邪蟹屑械褉
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 袙胁械褉褏褍 锌芯褋械褉械写懈薪械 鈥� 懈蟹屑械薪懈褌褜 褉邪蟹屑械褉
+pdfjs-editor-resizer-top-right =
+    .aria-label = 袙械褉褏薪懈泄 锌褉邪胁褘泄 褍谐芯谢 鈥� 懈蟹屑械薪懈褌褜 褉邪蟹屑械褉
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 袙 褑械薪褌褉械 褋锌褉邪胁邪 鈥� 懈蟹屑械薪懈褌褜 褉邪蟹屑械褉
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 袧懈卸薪懈泄 锌褉邪胁褘泄 褍谐芯谢 鈥� 懈蟹屑械薪懈褌褜 褉邪蟹屑械褉
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 袙薪懈蟹褍 锌芯褋械褉械写懈薪械 鈥� 懈蟹屑械薪懈褌褜 褉邪蟹屑械褉
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 袧懈卸薪懈泄 谢械胁褘泄 褍谐芯谢 鈥� 懈蟹屑械薪懈褌褜 褉邪蟹屑械褉
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 袙 褑械薪褌褉械 褋谢械胁邪 鈥� 懈蟹屑械薪懈褌褜 褉邪蟹屑械褉
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 笑胁械褌 胁褘写械谢械薪懈褟
+pdfjs-editor-colorpicker-button =
+    .title = 袠蟹屑械薪懈褌褜 褑胁械褌
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 袙褘斜芯褉 褑胁械褌邪
+pdfjs-editor-colorpicker-yellow =
+    .title = 袞褢谢褌褘泄
+pdfjs-editor-colorpicker-green =
+    .title = 袟械谢褢薪褘泄
+pdfjs-editor-colorpicker-blue =
+    .title = 小懈薪懈泄
+pdfjs-editor-colorpicker-pink =
+    .title = 袪芯蟹芯胁褘泄
+pdfjs-editor-colorpicker-red =
+    .title = 袣褉邪褋薪褘泄
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 袩芯泻邪蟹邪褌褜 胁褋械
+pdfjs-editor-highlight-show-all-button =
+    .title = 袩芯泻邪蟹邪褌褜 胁褋械
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 袠蟹屑械薪懈褌褜 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌 (芯锌懈褋邪薪懈械 懈蟹芯斜褉邪卸械薪懈褟)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 袛芯斜邪胁懈褌褜 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌 (芯锌懈褋邪薪懈械 懈蟹芯斜褉邪卸械薪懈褟)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 袧邪锌懈褕懈褌械 蟹写械褋褜 褋胁芯褢 芯锌懈褋邪薪懈械鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 袣芯褉芯褌泻芯械 芯锌懈褋邪薪懈械 写谢褟 谢褞写械泄, 泻芯褌芯褉褘械 薪械 胁懈写褟褌 懈蟹芯斜褉邪卸械薪懈械, 懈谢懈 械褋谢懈 懈蟹芯斜褉邪卸械薪懈械 薪械 蟹邪谐褉褍卸邪械褌褋褟.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 协褌芯褌 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌 斜褘谢 褋芯蟹写邪薪 邪胁褌芯屑邪褌懈褔械褋泻懈 懈 屑芯卸械褌 斜褘褌褜 薪械褌芯褔薪褘屑.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 袩芯写褉芯斜薪械械
+pdfjs-editor-new-alt-text-create-automatically-button-label = 袗胁褌芯屑邪褌懈褔械褋泻懈 褋芯蟹写邪胁邪褌褜 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+pdfjs-editor-new-alt-text-not-now-button = 袧械 褋械泄褔邪褋
+pdfjs-editor-new-alt-text-error-title = 袧械 褍写邪谢芯褋褜 邪胁褌芯屑邪褌懈褔械褋泻懈 褋芯蟹写邪褌褜 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+pdfjs-editor-new-alt-text-error-description = 袩芯卸邪谢褍泄褋褌邪, 薪邪锌懈褕懈褌械 褋胁芯泄 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌 懈谢懈 锌芯锌褉芯斜褍泄褌械 械褖褢 褉邪蟹 锌芯蟹卸械.
+pdfjs-editor-new-alt-text-error-close-button = 袟邪泻褉褘褌褜
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 袟邪谐褉褍蟹泻邪 屑芯写械谢懈 袠袠 写谢褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪 ({ $downloadedSize } 懈蟹 { $totalSize } 袦袘)
+    .aria-valuetext = 袟邪谐褉褍蟹泻邪 屑芯写械谢懈 袠袠 写谢褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪 ({ $downloadedSize } 懈蟹 { $totalSize } 袦袘)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 袗谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌 写芯斜邪胁谢械薪
+pdfjs-editor-new-alt-text-added-button-label = 袗谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌 写芯斜邪胁谢械薪
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 袨褌褋褍褌褋褌胁褍械褌 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+pdfjs-editor-new-alt-text-missing-button-label = 袨褌褋褍褌褋褌胁褍械褌 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 袨褑械薪懈褌褜 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+pdfjs-editor-new-alt-text-to-review-button-label = 袨褑械薪懈褌褜 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 小芯蟹写邪薪芯 邪胁褌芯屑邪褌懈褔械褋泻懈: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 袧邪褋褌褉芯泄泻懈 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪 写谢褟 懈蟹芯斜褉邪卸械薪懈褟
+pdfjs-image-alt-text-settings-button-label = 袧邪褋褌褉芯泄泻懈 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪 写谢褟 懈蟹芯斜褉邪卸械薪懈褟
+pdfjs-editor-alt-text-settings-dialog-label = 袧邪褋褌褉芯泄泻懈 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪 写谢褟 懈蟹芯斜褉邪卸械薪懈褟
+pdfjs-editor-alt-text-settings-automatic-title = 袗胁褌芯屑邪褌懈褔械褋泻懈泄 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+pdfjs-editor-alt-text-settings-create-model-button-label = 袗胁褌芯屑邪褌懈褔械褋泻懈 褋芯蟹写邪胁邪褌褜 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌
+pdfjs-editor-alt-text-settings-create-model-description = 袩褉械写谢邪谐邪械褌 芯锌懈褋邪薪懈褟, 褔褌芯斜褘 锌芯屑芯褔褜 谢褞写褟屑, 泻芯褌芯褉褘械 薪械 胁懈写褟褌 懈蟹芯斜褉邪卸械薪懈械, 懈谢懈 械褋谢懈 懈蟹芯斜褉邪卸械薪懈械 薪械 蟹邪谐褉褍卸邪械褌褋褟.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 袠袠-屑芯写械谢褜 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪 ({ $totalSize } 袦袘)
+pdfjs-editor-alt-text-settings-ai-model-description = 袟邪锌褍褋泻邪械褌褋褟 谢芯泻邪谢褜薪芯 薪邪 胁邪褕械屑 褍褋褌褉芯泄褋褌胁械, 锌芯褝褌芯屑褍 胁邪褕懈 写邪薪薪褘械 芯褋褌邪褞褌褋褟 泻芯薪褎懈写械薪褑懈邪谢褜薪褘屑懈. 孝褉械斜褍械褌褋褟 写谢褟 邪胁褌芯屑邪褌懈褔械褋泻芯谐芯 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪.
+pdfjs-editor-alt-text-settings-delete-model-button = 校写邪谢懈褌褜
+pdfjs-editor-alt-text-settings-download-model-button = 小泻邪褔邪褌褜
+pdfjs-editor-alt-text-settings-downloading-model-button = 袟邪谐褉褍蟹泻邪鈥�
+pdfjs-editor-alt-text-settings-editor-title = 袪械写邪泻褌芯褉 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 小褉邪蟹褍 锌芯泻邪蟹褘胁邪褌褜 褉械写邪泻褌芯褉 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪 锌褉懈 写芯斜邪胁谢械薪懈懈 懈蟹芯斜褉邪卸械薪懈褟
+pdfjs-editor-alt-text-settings-show-dialog-description = 袩芯屑芯谐邪械褌 胁邪屑 褍斜械写懈褌褜褋褟, 褔褌芯 胁褋械 胁邪褕懈 懈蟹芯斜褉邪卸械薪懈褟 懈屑械褞褌 邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌.
+pdfjs-editor-alt-text-settings-close-button = 袟邪泻褉褘褌褜
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 袙褘写械谢械薪懈械 写芯斜邪胁谢械薪芯
+pdfjs-editor-freetext-added-alert = 孝械泻褋褌 写芯斜邪胁谢械薪
+pdfjs-editor-ink-added-alert = 袠蟹芯斜褉邪卸械薪懈械 写芯斜邪胁谢械薪芯
+pdfjs-editor-stamp-added-alert = 袠蟹芯斜褉邪卸械薪懈械 写芯斜邪胁谢械薪芯
+pdfjs-editor-signature-added-alert = 袩芯写锌懈褋褜 写芯斜邪胁谢械薪邪
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 袙褘写械谢械薪懈械 褍写邪谢械薪芯
+pdfjs-editor-undo-bar-message-freetext = 孝械泻褋褌 褍写邪谢褢薪
+pdfjs-editor-undo-bar-message-ink = 袪懈褋褍薪芯泻 褍写邪谢褢薪
+pdfjs-editor-undo-bar-message-stamp = 袠蟹芯斜褉邪卸械薪懈械 褍写邪谢械薪芯
+pdfjs-editor-undo-bar-message-signature = 袩芯写锌懈褋褜 褍写邪谢械薪邪
+pdfjs-editor-undo-bar-message-comment = 袣芯屑屑械薪褌邪褉懈泄 褍写邪谢褢薪
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 邪薪薪芯褌邪褑懈褟 褍写邪谢械薪邪
+        [few] { $count } 邪薪薪芯褌邪褑懈懈 褍写邪谢械薪褘
+       *[many] { $count } 邪薪薪芯褌邪褑懈泄 褍写邪谢械薪褘
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 袨褌屑械薪懈褌褜
+pdfjs-editor-undo-bar-undo-button-label = 袨褌屑械薪懈褌褜
+pdfjs-editor-undo-bar-close-button =
+    .title = 袟邪泻褉褘褌褜
+pdfjs-editor-undo-bar-close-button-label = 袟邪泻褉褘褌褜
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 协褌芯 芯泻薪芯 锌芯蟹胁芯谢褟械褌 锌芯谢褜蟹芯胁邪褌械谢褞 褋芯蟹写邪褌褜 锌芯写锌懈褋褜 写谢褟 写芯斜邪胁谢械薪懈褟 胁 PDF-写芯泻褍屑械薪褌. 袩芯谢褜蟹芯胁邪褌械谢褜 屑芯卸械褌 芯褌褉械写邪泻褌懈褉芯胁邪褌褜 懈屑褟 (泻芯褌芯褉芯械 褌邪泻卸械 懈褋锌芯谢褜蟹褍械褌褋褟 胁 泻邪褔械褋褌胁械 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌邪) 懈, 锌芯 卸械谢邪薪懈褞, 褋芯褏褉邪薪懈褌褜 锌芯写锌懈褋褜 写谢褟 锌芯胁褌芯褉薪芯谐芯 懈褋锌芯谢褜蟹芯胁邪薪懈褟.
+pdfjs-editor-add-signature-dialog-title = 袛芯斜邪胁懈褌褜 锌芯写锌懈褋褜
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 袙胁芯写
+    .title = 袙胁芯写
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 袪懈褋芯胁邪褌褜
+    .title = 袪懈褋芯胁邪褌褜
+pdfjs-editor-add-signature-image-button = 袠蟹芯斜褉邪卸械薪懈械
+    .title = 袠蟹芯斜褉邪卸械薪懈械
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 袙胁械写懈褌械 褋胁芯褞 锌芯写锌懈褋褜
+    .placeholder = 袙胁械写懈褌械 褋胁芯褞 锌芯写锌懈褋褜
+pdfjs-editor-add-signature-draw-placeholder = 袧邪褉懈褋褍泄褌械 褋胁芯褞 锌芯写锌懈褋褜
+pdfjs-editor-add-signature-draw-thickness-range-label = 孝芯谢褖懈薪邪
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 孝芯谢褖懈薪邪 褉懈褋褍薪泻邪: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 袩械褉械褌邪褖懈褌械 褋褞写邪 褎邪泄谢 写谢褟 蟹邪谐褉褍蟹泻懈
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 袠谢懈 锌褉芯褋屑芯褌褉懈褌械 褎邪泄谢褘 懈蟹芯斜褉邪卸械薪懈泄
+       *[other] 袠谢懈 锌褉芯褋屑芯褌褉懈褌械 褎邪泄谢褘 懈蟹芯斜褉邪卸械薪懈泄
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 袨锌懈褋邪薪懈械 (邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌)
+pdfjs-editor-add-signature-description-input =
+    .title = 袨锌懈褋邪薪懈械 (邪谢褜褌械褉薪邪褌懈胁薪褘泄 褌械泻褋褌)
+pdfjs-editor-add-signature-description-default-when-drawing = 袩芯写锌懈褋褜
+pdfjs-editor-add-signature-clear-button-label = 校写邪谢懈褌褜 锌芯写锌懈褋褜
+pdfjs-editor-add-signature-clear-button =
+    .title = 校写邪谢懈褌褜 锌芯写锌懈褋褜
+pdfjs-editor-add-signature-save-checkbox = 小芯褏褉邪薪懈褌褜 锌芯写锌懈褋褜
+pdfjs-editor-add-signature-save-warning-message = 袙褘 写芯褋褌懈谐谢懈 谢懈屑懈褌邪 胁 5 褋芯褏褉邪薪褢薪薪褘褏 锌芯写锌懈褋械泄. 校写邪谢懈褌械 芯写薪褍, 褔褌芯斜褘 褋芯褏褉邪薪懈褌褜 写褉褍谐懈械.
+pdfjs-editor-add-signature-image-upload-error-title = 袧械 褍写邪谢芯褋褜 蟹邪谐褉褍蟹懈褌褜 懈蟹芯斜褉邪卸械薪懈械
+pdfjs-editor-add-signature-image-upload-error-description = 袩褉芯胁械褉褜褌械 锌芯写泻谢褞褔械薪懈械 泻 褋械褌懈 懈谢懈 锌芯锌褉芯斜褍泄褌械 写褉褍谐芯械 懈蟹芯斜褉邪卸械薪懈械.
+pdfjs-editor-add-signature-image-no-data-error-title = 袧械 褍写邪谢芯褋褜 锌褉械芯斜褉邪蟹芯胁邪褌褜 褝褌芯 懈蟹芯斜褉邪卸械薪懈械 胁 锌芯写锌懈褋褜
+pdfjs-editor-add-signature-image-no-data-error-description = 袩芯卸邪谢褍泄褋褌邪, 锌芯锌褉芯斜褍泄褌械 蟹邪谐褉褍蟹懈褌褜 写褉褍谐芯械 懈蟹芯斜褉邪卸械薪懈械.
+pdfjs-editor-add-signature-error-close-button = 袟邪泻褉褘褌褜
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 袨褌屑械薪邪
+pdfjs-editor-add-signature-add-button = 袛芯斜邪胁懈褌褜
+pdfjs-editor-edit-signature-update-button = 袨斜薪芯胁懈褌褜
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 袪械写邪泻褌懈褉芯胁邪褌褜 泻芯屑屑械薪褌邪褉懈泄
+pdfjs-editor-edit-comment-popup-button =
+    .title = 袪械写邪泻褌懈褉芯胁邪褌褜 泻芯屑屑械薪褌邪褉懈泄
+pdfjs-editor-delete-comment-popup-button-label = 校写邪谢懈褌褜 泻芯屑屑械薪褌邪褉懈泄
+pdfjs-editor-delete-comment-popup-button =
+    .title = 校写邪谢懈褌褜 泻芯屑屑械薪褌邪褉懈泄
+pdfjs-show-comment-button =
+    .title = 袩芯泻邪蟹邪褌褜 泻芯屑屑械薪褌邪褉懈泄
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 袪械写邪泻褌懈褉芯胁邪褌褜 泻芯屑屑械薪褌邪褉懈泄
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 袨斜薪芯胁懈褌褜
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 袛芯斜邪胁懈褌褜 泻芯屑屑械薪褌邪褉懈泄
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 袛芯斜邪胁懈褌褜
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 袧邪褔薪懈褌械 胁胁芯写鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 袨褌屑械薪邪
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 袛芯斜邪胁懈褌褜 泻芯屑屑械薪褌邪褉懈泄
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 袩芯泻邪蟹邪褌褜/褋泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜 (写芯泻褍屑械薪褌 褋芯写械褉卸懈褌 屑懈薪懈邪褌褞褉褘/褋褌褉褍泻褌褍褉褍/胁谢芯卸械薪懈褟/褋谢芯懈)
+pdfjs-toggle-views-manager-button1-label = 校锌褉邪胁谢械薪懈械 褋褌褉邪薪懈褑邪屑懈
+pdfjs-views-manager-sidebar =
+    .aria-label = 袘芯泻芯胁邪褟 锌邪薪械谢褜
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 袠蟹屑械薪械薪懈械 褉邪蟹屑械褉邪 斜芯泻芯胁芯泄 锌邪薪械谢懈
+pdfjs-views-manager-view-selector-button =
+    .title = 袙懈写
+pdfjs-views-manager-view-selector-button-label = 袙懈写
+pdfjs-views-manager-pages-title = 小褌褉邪薪懈褑褘
+pdfjs-views-manager-outlines-title1 = 小褌褉褍泻褌褍褉邪 写芯泻褍屑械薪褌邪
+    .title = 小褌褉褍泻褌褍褉邪 写芯泻褍屑械薪褌邪 (褖褢谢泻薪懈褌械 写胁邪卸写褘, 褔褌芯斜褘 褉邪褋泻褉褘褌褜/褋胁械褉薪褍褌褜 胁褋械 褝谢械屑械薪褌褘)
+pdfjs-views-manager-attachments-title = 袙谢芯卸械薪懈褟
+pdfjs-views-manager-layers-title1 = 小谢芯懈
+    .title = 小谢芯懈 (褖褢谢泻薪懈褌械 写胁邪卸写褘, 褔褌芯斜褘 褋斜褉芯褋懈褌褜 胁褋械 褋谢芯懈 胁 锌芯谢芯卸械薪懈械 锌芯 褍屑芯谢褔邪薪懈褞)
+pdfjs-views-manager-pages-option-label = 小褌褉邪薪懈褑褘
+pdfjs-views-manager-outlines-option-label = 小褌褉褍泻褌褍褉邪 写芯泻褍屑械薪褌邪
+pdfjs-views-manager-attachments-option-label = 袙谢芯卸械薪懈褟
+pdfjs-views-manager-layers-option-label = 小谢芯懈
+pdfjs-views-manager-add-file-button =
+    .title = 袛芯斜邪胁懈褌褜 褎邪泄谢
+pdfjs-views-manager-add-file-button-label = 袛芯斜邪胁懈褌褜 褎邪泄谢
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] 袙褘斜褉邪薪邪 { $count }
+        [few] 袙褘斜褉邪薪褘 { $count }
+       *[many] 袙褘斜褉邪薪芯 { $count }
+    }
+pdfjs-views-manager-pages-status-none-action-label = 袙褘斜褉邪褌褜 褋褌褉邪薪懈褑褘
+pdfjs-views-manager-pages-status-action-button-label = 校锌褉邪胁谢械薪懈械
+pdfjs-views-manager-pages-status-copy-button-label = 袣芯锌懈褉芯胁邪褌褜
+pdfjs-views-manager-pages-status-cut-button-label = 袙褘褉械蟹邪褌褜
+pdfjs-views-manager-pages-status-delete-button-label = 校写邪谢懈褌褜
+pdfjs-views-manager-pages-status-export-selected-button-label = 协泻褋锌芯褉褌懈褉芯胁邪褌褜 胁褘斜褉邪薪薪芯械鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 袙褘褉械蟹邪薪邪 1 褋褌褉邪薪懈褑邪
+        [few] 袙褘褉械蟹邪薪褘 { $count } 褋褌褉邪薪懈褑褘
+       *[many] 袙褘褉械蟹邪薪芯 { $count } 褋褌褉邪薪懈褑
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 小泻芯锌懈褉芯胁邪薪邪 1 褋褌褉邪薪懈褑邪
+        [few] 小泻芯锌懈褉芯胁邪薪褘 { $count } 褋褌褉邪薪懈褑褘
+       *[many] 小泻芯锌懈褉芯胁邪薪芯 { $count } 褋褌褉邪薪懈褑
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 校写邪谢械薪邪 1 褋褌褉邪薪懈褑邪
+        [few] 校写邪谢械薪褘 { $count } 褋褌褉邪薪懈褑褘
+       *[many] 校写邪谢械薪芯 { $count } 褋褌褉邪薪懈褑
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 袠写褢褌 锌芯写谐芯褌芯胁泻邪 褎邪泄谢邪鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 袙褘谐褉褍蟹泻邪 褎邪泄谢邪鈥�
+pdfjs-views-manager-status-warning-cut-label = 袧械 褍写邪谢芯褋褜 胁褘褉械蟹邪褌褜. 袨斜薪芯胁懈褌褜 褋褌褉邪薪懈褑褍 懈 锌芯锌褉芯斜芯胁邪褌褜 械褖褢 褉邪蟹.
+pdfjs-views-manager-status-warning-copy-label = 袧械 褍写邪谢芯褋褜 褋泻芯锌懈褉芯胁邪褌褜. 袨斜薪芯胁懈褌褜 褋褌褉邪薪懈褑褍 懈 锌芯锌褉芯斜芯胁邪褌褜 械褖褢 褉邪蟹.
+pdfjs-views-manager-status-warning-delete-label = 袧械 褍写邪谢芯褋褜 褍写邪谢懈褌褜. 袨斜薪芯胁懈褌褜 褋褌褉邪薪懈褑褍 懈 锌芯锌褉芯斜芯胁邪褌褜 械褖褢 褉邪蟹.
+pdfjs-views-manager-status-warning-save-label = 袧械 褍写邪谢芯褋褜 褋芯褏褉邪薪懈褌褜. 袨斜薪芯胁懈褌褜 褋褌褉邪薪懈褑褍 懈 锌芯锌褉芯斜芯胁邪褌褜 械褖褢 褉邪蟹.
+pdfjs-views-manager-status-undo-button-label = 袨褌屑械薪懈褌褜
+pdfjs-views-manager-status-done-button-label = 袚芯褌芯胁芯
+pdfjs-views-manager-status-close-button =
+    .title = 袟邪泻褉褘褌褜
+pdfjs-views-manager-status-close-button-label = 袟邪泻褉褘褌褜
+pdfjs-views-manager-paste-button-label = 袙褋褌邪胁懈褌褜
+pdfjs-views-manager-paste-button-before =
+    .title = 袙褋褌邪胁懈褌褜 锌械褉械写 锌械褉胁芯泄 褋褌褉邪薪懈褑械泄
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 袙褋褌邪胁懈褌褜 锌芯褋谢械 褋褌褉邪薪懈褑褘 { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 袧袨袙袨袝
+pdfjs-views-manager-waiting-for-file = 袟邪谐褉褍蟹泻邪 褎邪泄谢邪鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 校锌褉邪胁谢械薪懈械 褋褌褉邪薪懈褑邪屑懈
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 校写邪谢懈褌褜 褋芯褏褉邪薪褢薪薪褍褞 锌芯写锌懈褋褜
+pdfjs-editor-delete-signature-button-label1 = 校写邪谢懈褌褜 褋芯褏褉邪薪褢薪薪褍褞 锌芯写锌懈褋褜
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 袠蟹屑械薪懈褌褜 芯锌懈褋邪薪懈械
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 袠蟹屑械薪懈褌褜 芯锌懈褋邪薪懈械
diff --git a/public/pdfjs/web/locale/sat/viewer.ftl b/public/pdfjs/web/locale/sat/viewer.ftl
new file mode 100644
index 0000000..e2e3140
--- /dev/null
+++ b/public/pdfjs/web/locale/sat/viewer.ftl
@@ -0,0 +1,278 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 岜⑨睙岜册睙岜� 岜メ睙岜︶贝岜�
+pdfjs-previous-button-label = 岜⑨睙岜册睙岜濁睙岜�
+pdfjs-next-button =
+    .title = 岜め北岜熱惫 岜涐睙岜睔岜� 岜メ睙岜︶贝岜�
+pdfjs-next-button-label = 岜め北岜熱惫 岜涐睙岜睔岜�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 岜メ睙岜︶贝岜�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 岜ㄡ碑岜睙岜� { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 岜犪狈岜氠北 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 岜︶堡岜册堡岜� 岜涐碑岜睙岜�
+pdfjs-zoom-out-button-label = 岜︶堡岜册堡岜� 岜涐碑岜睙岜�
+pdfjs-zoom-in-button =
+    .title = 岜⑨睙岜ㄡ睙岜� 岜涐碑岜睙岜�
+pdfjs-zoom-in-button-label = 岜⑨睙岜ㄡ睙岜� 岜涐碑岜睙岜�
+pdfjs-zoom-select =
+    .title = 岜♂暴岜�
+pdfjs-presentation-mode-button =
+    .title = 岜┽鲍岜┽睖 岜メ睔岜睔岜� 岜氠钡岜氠饱岜涐睙 岜ㄡ碑 岜氠睕岜熱杯 岜⑨碑
+pdfjs-presentation-mode-button-label = 岜┽鲍岜┽睖 岜メ睔岜睔岜� 岜氠钡岜氠饱岜涐睙 岜ㄡ碑
+pdfjs-open-file-button =
+    .title = 岜ㄡ碑岜� 岜♂狈岜め薄岜� 岜⑨碑
+pdfjs-open-file-button-label = 岜♂狈岜め薄岜� 岜⑨碑
+pdfjs-print-button =
+    .title = 岜狈岜熱悲岜�
+pdfjs-print-button-label = 岜狈岜熱悲岜�
+pdfjs-save-button =
+    .title = 岜メ睙岜横豹岜熱保 岜⑨碑
+pdfjs-save-button-label = 岜メ睙岜横豹岜熱保 岜⑨碑
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 岜搬睙岜a暴岜贬睘岜氠卑
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 岜搬睙岜a暴岜贬睘岜氠卑
+pdfjs-bookmark-button =
+    .title = 岜贬堡岜涐睔岜溼睙岜� 岜メ睙岜︶贝岜� (岜贬堡岜涐睔岜溼睙岜� 岜メ睙岜︶贝岜� 岜犪狈岜氠北 URL 岜碑岜犪狈岜熱保 岜⑨碑)
+pdfjs-bookmark-button-label = 岜贬堡岜涐睔岜溼睙岜� 岜メ睙岜︶贝岜�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 岜︶睙岜贯睕岜め杯岜熱惫岜� 岜犪睔
+pdfjs-tools-button-label = 岜︶睙岜贯睕岜め杯岜熱惫岜� 岜犪睔
+pdfjs-first-page-button =
+    .title = 岜暴岜睘岜� 岜メ睙岜︶贝岜� 岜メ碑岜� 岜睙岜炨睙岜� 岜⑨碑
+pdfjs-first-page-button-label = 岜暴岜睘岜� 岜メ睙岜︶贝岜� 岜メ碑岜� 岜睙岜炨睙岜� 岜⑨碑
+pdfjs-last-page-button =
+    .title = 岜⑨暴岜睙岜贯鲍 岜メ睙岜︶贝岜� 岜メ碑岜� 岜睙岜炨睙岜� 岜⑨碑
+pdfjs-last-page-button-label = 岜⑨暴岜睙岜贯鲍 岜メ睙岜︶贝岜� 岜メ碑岜� 岜睙岜炨睙岜� 岜⑨碑
+pdfjs-page-rotate-cw-button =
+    .title = 岜溼狈岜氠卑岜� 岜︶堡岜メ睙岜贯钡 岜涐碑 岜熱惫岜暴岜�
+pdfjs-page-rotate-cw-button-label = 岜溼狈岜氠卑岜� 岜︶堡岜メ睙岜贯钡 岜涐碑 岜熱惫岜暴岜�
+pdfjs-page-rotate-ccw-button =
+    .title = 岜溼狈岜氠卑岜� 岜︶堡岜メ睙岜贯钡 岜涐碑 岜┽睘岜瘁睙岜� 岜熱惫岜暴岜�
+pdfjs-page-rotate-ccw-button-label = 岜溼狈岜氠卑岜� 岜︶堡岜メ睙岜贯钡 岜涐碑 岜┽睘岜瘁睙岜� 岜熱惫岜暴岜�
+pdfjs-cursor-text-select-tool-button =
+    .title = 岜氠睘 岜滇睙岜狈岜熱保 岜︶睙岜贯睕岜め杯岜熱报 岜雹 岜狈岜氠杯 岜⑨碑
+pdfjs-cursor-text-select-tool-button-label = 岜氠睘 岜滇睙岜狈岜熱保 岜︶睙岜贯睕岜め杯岜熱报
+pdfjs-cursor-hand-tool-button =
+    .title = 岜涐堡 岜︶睙岜贯睕岜め杯岜熱报 岜雹 岜狈岜氠杯 岜⑨碑
+pdfjs-cursor-hand-tool-button-label = 岜涐堡 岜︶睙岜贯睕岜め杯岜熱报
+pdfjs-scroll-page-button =
+    .title = 岜メ睙岜︶贝岜� 岜溼暴岜册睙岜贯保 岜滇碑岜滇狈岜熱报 岜⑨碑
+pdfjs-scroll-page-button-label = 岜メ睙岜︶贝岜� 岜溼暴岜册睙岜贯保
+pdfjs-scroll-vertical-button =
+    .title = 岜メ堡岜苯 岜溼暴岜册睙岜贯保 岜滇碑岜滇狈岜熱报 岜⑨碑
+pdfjs-scroll-vertical-button-label = 岜メ堡岜苯 岜溼暴岜册睙岜贯保
+pdfjs-scroll-horizontal-button =
+    .title = 岜溼堡岜涐堡岜� 岜涐碑 岜溼暴岜册睙岜贯保 岜滇碑岜滇狈岜熱报 岜⑨碑
+pdfjs-scroll-horizontal-button-label = 岜溼堡岜涐堡岜� 岜涐碑 岜溼暴岜册睙岜贯保
+pdfjs-scroll-wrapped-button =
+    .title = 岜炨堡岜贝岜熱惫岜� 岜溼暴岜搬报岜熱惫岜� 岜滇碑岜滇狈岜熱报 岜⑨碑
+pdfjs-scroll-wrapped-button-label = 岜炨堡岜贝岜熱保 岜溼暴岜搬报岜熱惫岜�
+pdfjs-spread-none-button =
+    .title = 岜熱睘岜氠雹 岜♂睔岜册睙岜� 岜� 岜メ睙岜︶贝岜� 岜睔 岜睙岜メ北岜熱保岜溼奔岜�
+pdfjs-spread-none-button-label = 岜睙岜メ北岜熱保 岜滇睙岜贯北岜┽睖岜坚睙
+pdfjs-spread-odd-button =
+    .title = 岜メ睙岜︶贝岜� 岜睙岜メ北岜熱保 岜♂睔岜册睙岜� 岜⑨碑 岜♂睙岜︶睙岜� 岜睔 岜氠卑岜坚碑岜� 岜メ睙岜︶贝岜熱睜岜� 岜メ睙岜炨睙岜� 岜睕岜︶睔岜滇睔岜� 岜犪睙岜贬睙
+pdfjs-spread-odd-button-label = 岜氠卑 岜睙岜メ北岜熱保
+pdfjs-spread-even-button =
+    .title = 岜メ睙岜︶贝岜� 岜睙岜メ北岜熱保 岜♂睔岜册睙岜� 岜⑨碑 岜♂睙岜︶睙岜� 岜睔 岜め保岜北岜坚碑岜� 岜メ睙岜︶贝岜熱睜岜� 岜メ睙岜炨睙岜� 岜睕岜︶睔岜滇睔岜� 岜犪睙岜贬睙
+pdfjs-spread-even-button-label = 岜睙岜メ北岜熱保 岜め保岜北
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 岜睔岜炨堡岜� 岜溼暴岜贬睜岜� 鈥�
+pdfjs-document-properties-button-label = 岜睔岜炨堡岜� 岜溼暴岜贬睜岜� 鈥�
+pdfjs-document-properties-file-name = 岜ㄡ碑岜苯 岜п暴岜涐暴岜� :
+pdfjs-document-properties-file-size = 岜ㄡ碑岜苯 岜⑨睙岜� :
+pdfjs-document-properties-title = 岜п暴岜涐暴岜� :
+pdfjs-document-properties-author = 岜氠北岜氠睘岜め杯岜熱惫 :
+pdfjs-document-properties-subject = 岜滇堡岜メ睔岜� :
+pdfjs-document-properties-keywords = 岜犪睙岜贯贝岜丰堡 岜メ睙岜滇睙岜苯 :
+pdfjs-document-properties-creation-date = 岜涐碑岜睙岜� 岜⑨睙岜羔宝岜め睕 :
+pdfjs-document-properties-modification-date = 岜滇睔岜睔岜� 岜︶睔岜睔 岜⑨睙岜贯宝岜め睕 :
+pdfjs-document-properties-creator = 岜滇碑岜贬睙岜a堡岜� :
+pdfjs-document-properties-producer = PDF 岜涐碑岜睙岜� 岜氠卑岜氠睜岜め薄 :
+pdfjs-document-properties-version = PDF 岜滇狈岜熱惫岜ㄡ饱岜氠北 :
+pdfjs-document-properties-page-count = 岜メ睙岜︶贝岜� 岜炨碑岜犪狈岜� :
+pdfjs-document-properties-page-size = 岜メ睙岜︶贝岜� 岜⑨睙岜� :
+pdfjs-document-properties-page-size-unit-inches = 岜め抱岜�
+pdfjs-document-properties-page-size-unit-millimeters = 岜⑨堡岜⑨堡
+pdfjs-document-properties-page-size-orientation-portrait = 岜睔岜瘁报岜贝
+pdfjs-document-properties-page-size-orientation-landscape = 岜炨碑岜贬卑岜メ睜岜悲
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 岜堡岜瘁狈岜�
+pdfjs-document-properties-page-size-name-legal = 岜犪睙岜贯北岜┽北岜�
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 岜炨睔岜溼睔岜� 岜a碑岜滇苯 岜п碑岜� :
+pdfjs-document-properties-linearized-yes = 岜︶睔岜�
+pdfjs-document-properties-linearized-no = 岜滇睙岜�
+pdfjs-document-properties-close-button = 岜滇睔岜羔鲍岜氠杯 岜⑨碑
+
+## Print
+
+pdfjs-print-progress-message = 岜狈岜熱悲岜� 岜炨睙岜贯睖岜め鲍 岜睔岜炨堡岜� 岜涐碑岜睙岜ㄡ睔岜� 岜犪睙岜贬睙 鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 岜滇睙岜贯卑岜ㄡ睙岜�
+pdfjs-printing-not-supported = 岜︶睔岜メ堡岜睙岜� : 岜狈岜熱悲岜� 岜贬睔岜a睙 岜睙岜贬睕岜杯岜熱睖 岜睙岜ㄡ睙岜� 岜涐碑 岜暴岜ㄡ睙岜贯保 岜滇睙岜� 岜溼睔岜册睔岜a睙岜犪睙岜贬睙 岜�
+pdfjs-printing-not-ready = 岜︶暴岜メ堡岜睙岜贯报 : 岜狈岜熱悲岜� 岜炨睙岜贯睖岜め鲍 PDF 岜暴岜ㄡ睙岜� 岜滇睙岜� 岜炨睙岜碑 岜熱睜岜熱北岜� 岜�
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 岜狈岜熱报岜钡岜熱报 岜メ碑岜� 岜┽豹岜熱惫岜册睔岜� 岜⑨碑
+pdfjs-toggle-sidebar-notification-button =
+    .title = 岜狈岜熱报岜钡岜熱报 岜メ碑岜� 岜┽豹岜熱惫岜册睔岜� 岜⑨碑  (岜睔岜炨堡岜� 岜ㄡ碑 岜熱保岜瘁睘岜熱杯岜め雹 岜⑨碑岜贬睙岜溼奔岜�/岜炨睙岜狈岜熱睜岜�/岜睔岜ㄡ睔岜涐睜岜�)
+pdfjs-toggle-sidebar-button-label = 岜狈岜熱报岜钡岜熱报 岜メ碑岜� 岜┽豹岜熱惫岜册睔岜� 岜⑨碑
+pdfjs-document-outline-button =
+    .title = 岜睔岜炨睔岜� 岜熱保岜瘁睘岜熱杯岜め北 岜碑岜犪狈岜熱保 岜⑨碑 (岜♂狈岜氠睕岜� 岜♂堡岜贬堡岜メ睜岜� 岜滇睙岜� 岜♂碑岜犪狈岜� 岜氠睕岜� 岜犪碑岜涐碑 岜♂狈岜熱惫岜�/岜︶暴岜搬堡岜� 岜狈岜氠杯 岜⑨碑)
+pdfjs-document-outline-button-label = 岜睔岜炨堡岜� 岜涐碑岜睙岜� 岜涐碑岜�
+pdfjs-attachments-button =
+    .title = 岜炨睙岜瘁狈岜� 岜メ碑岜炨碑岜� 岜犪睔 岜┽鲍岜┽睖岜� 岜⑨碑
+pdfjs-attachments-button-label = 岜炨睙岜瘁狈岜� 岜メ碑岜炨碑岜� 岜犪睔
+pdfjs-layers-button =
+    .title = 岜睔岜ㄡ睔岜� 岜碑岜犪狈岜熱保 岜⑨碑 (岜⑨暴岜� 岜♂睙岜睖岜� 岜涐碑 岜♂狈岜氠睕岜� 岜睔岜ㄡ睔岜涐睜岜� 岜ㄡ堡岜メ碑岜� 岜炨睙岜贯睖岜め鲍 岜滇睙岜� 岜♂碑岜犪狈岜� 岜氠睕岜氠杯 岜⑨碑)
+pdfjs-layers-button-label = 岜睔岜ㄡ睔岜涐睜岜�
+pdfjs-thumbs-button =
+    .title = 岜堡岜涐睙岜贯报 岜熱宝岜炨睙 岜犪睔 岜┽鲍岜┽睖岜� 岜⑨碑
+pdfjs-thumbs-button-label = 岜堡岜涐睙岜贯报 岜熱宝岜炨睙 岜犪睔
+pdfjs-current-outline-item-button =
+    .title = 岜贬堡岜涐睔岜溼睙岜� 岜熱保岜瘁睘岜熱杯岜め北 岜♂睙岜贬堡岜� 岜睙岜贬睕岜� 岜⑨碑
+pdfjs-current-outline-item-button-label = 岜贬堡岜涐睔岜溼睙岜� 岜熱保岜瘁睘岜熱杯岜め北 岜♂睙岜贬堡岜�
+pdfjs-findbar-button =
+    .title = 岜睔岜炨堡岜� 岜ㄡ碑 岜睙岜贬睕岜�
+pdfjs-findbar-button-label = 岜メ碑岜羔鲍岜结报岜熱杯 岜⑨碑
+pdfjs-additional-layers = 岜滇睙岜贯辈岜涐堡 岜睔岜ㄡ睔岜涐睜岜�
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page } 岜メ睙岜︶贝岜�
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 岜メ睙岜︶贝岜� 岜ㄡ碑岜睙岜� 岜堡岜涐睙岜贯报 岜熱宝岜炨睙
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 岜メ碑岜羔鲍岜结报岜熱杯 岜⑨碑
+    .placeholder = 岜睔岜炨堡岜� 岜ㄡ碑 岜睙岜贬睕岜� 岜⑨碑 鈥�
+pdfjs-find-previous-button =
+    .title = 岜熱杯岜熱睕 岜︶堡岜羔饱 岜ㄡ碑岜睙岜� 岜睙岜贯宝岜め睘 岜メ碑岜睙岜� 岜氠卑岜氠睜 岜п睙岜� 岜⑨碑
+pdfjs-find-previous-button-label = 岜⑨睙岜册睙岜濁睙岜�
+pdfjs-find-next-button =
+    .title = 岜熱杯岜熱睕 岜︶堡岜羔饱 岜ㄡ碑岜睙岜� 岜め北岜熱惫 岜涐睙岜睔岜� 岜氠卑岜氠睜 岜п睙岜� 岜⑨碑
+pdfjs-find-next-button-label = 岜め北岜熱惫 岜涐睙岜睔岜�
+pdfjs-find-highlight-checkbox = 岜♂狈岜氠睕岜� 岜┽鲍岜┽睖 岜ㄡ睙岜犪睙岜�
+pdfjs-find-match-case-checkbox-label = 岜♂睔岜� 岜犪睙岜涐狈岜�
+pdfjs-find-match-diacritics-checkbox-label = 岜滇堡岜メ碑岜メ睔岜� 岜犪睔 岜⑨碑岜册睙岜� 岜⑨碑
+pdfjs-find-entire-word-checkbox-label = 岜♂狈岜氠睕岜� 岜熱惫岜册睙岜贯睜岜�
+pdfjs-find-reached-top = 岜睔岜炨堡岜� 岜ㄡ碑岜睙岜� 岜堡岜� 岜ㄡ碑 岜メ碑岜瘁碑岜�, 岜炨睙岜涐睙岜� 岜犪狈岜氠北 岜炨碑岜涐睙岜�
+pdfjs-find-reached-bottom = 岜睔岜炨堡岜� 岜ㄡ碑岜睙岜� 岜⑨暴岜睙岜贯鲍 岜ㄡ碑 岜メ碑岜瘁碑岜�, 岜睔岜� 岜犪狈岜氠北 岜炨碑岜涐睙岜�
+pdfjs-find-not-found = 岜涐睔岜睔岜� 岜睔岜贬睔岜� 岜滇睙岜� 岜п睙岜� 岜炨碑岜贬睙
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 岜メ睙岜︶贝岜� 岜氠饱岜熱报
+pdfjs-page-scale-fit = 岜メ睙岜︶贝岜� 岜犪狈岜熱悲
+pdfjs-page-scale-auto = 岜熱薄岜坚睙岜� 岜涐碑 岜︶暴岜搬堡岜� 岜炨睙岜贯贝岜� 岜涐碑岜睙岜�
+pdfjs-page-scale-actual = 岜瘁狈岜め睜 岜⑨睙岜ㄡ睙岜� 岜涐碑岜�
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = { $page } 岜メ睙岜︶贝岜�
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 岜炨睙岜碑 岜♂睔岜︶睔岜� 岜⑨堡岜� 岜滇狈岜┽睘 岜︶暴岜� 岜北岜� 岜�
+pdfjs-invalid-file-error = 岜滇睙岜� 岜滇睙岜涐睙岜� 岜熱报岜滇睙岜濁睜岜丰睙岜� 岜搬堡岜溼睙岜贯保 PDF 岜ㄡ碑岜苯 岜�
+pdfjs-missing-file-error = 岜熱鲍岜熱睖 PDF 岜ㄡ碑岜苯 岜�
+pdfjs-unexpected-response-error = 岜滇睙岜濁钡岜┽薄岜� 岜メ睔岜ㄡ钡岜丰睔岜� 岜涐碑岜炨睙 岜�
+pdfjs-rendering-error = 岜メ睙岜︶贝岜� 岜雹 岜♂睔岜︶睔岜� 岜⑨堡岜� 岜滇狈岜┽睘 岜︶暴岜� 岜北岜� 岜�
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 岜⑨睔岜贬睕岜� 岜雹]
+
+## Password
+
+pdfjs-password-label = 岜贬睔岜夺睙 PDF 岜ㄡ碑岜苯 岜♂狈岜め薄岜� 岜炨睙岜贯睖岜め鲍 岜睙岜贬睙岜� 岜メ睙岜滇睙岜苯 岜熱鲍岜报 岜⑨碑 岜�
+pdfjs-password-invalid = 岜滇狈岜┽睘 岜睙岜贬睙岜� 岜メ睙岜滇睙岜苯 岜� 岜睙岜睙岜犪睙岜涐碑 岜暴岜︶辈岜熱惫 岜碑岜メ贝岜熱杯 岜⑨碑 岜�
+pdfjs-password-ok-button = 岜瘁狈岜め睜
+pdfjs-password-cancel-button = 岜滇睙岜贯卑岜ㄡ睙岜�
+pdfjs-web-fonts-disabled = 岜a碑岜滇苯 岜堡岜犪堡 岜滇睙岜� 岜︶暴岜� 岜︶睔岜睔 岜犪睙岜贬睙 : 岜滇狈岜め睕岜め报 岜涐狈岜熱悲岜氠北 PDF 岜堡岜犪堡 岜滇碑岜滇狈岜熱报 岜滇睙岜� 岜︶暴岜� 岜犪碑岜睙 岜�
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 岜氠睘
+pdfjs-editor-free-text-button-label = 岜氠睘
+pdfjs-editor-ink-button =
+    .title = 岜涐碑岜睙岜�
+pdfjs-editor-ink-button-label = 岜涐碑岜睙岜�
+pdfjs-editor-stamp-button =
+    .title = 岜堡岜涐睙岜贯报岜犪睔 岜メ碑岜炨碑岜� 岜メ碑 岜メ睙岜辈岜熱保 岜⑨碑
+pdfjs-editor-stamp-button-label = 岜堡岜涐睙岜贯报岜犪睔 岜メ碑岜炨碑岜� 岜メ碑 岜メ睙岜辈岜熱保 岜⑨碑
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 岜ㄡ睔岜�
+pdfjs-editor-free-text-size-input = 岜⑨睙岜�
+pdfjs-editor-ink-color-input = 岜ㄡ睔岜�
+pdfjs-editor-ink-thickness-input = 岜⑨睔岜瘁睙
+pdfjs-editor-ink-opacity-input = 岜熱报岜睙岜�
+pdfjs-editor-stamp-add-image-button =
+    .title = 岜堡岜涐睙岜贯报 岜メ碑岜炨碑岜� 岜⑨碑
+pdfjs-editor-stamp-add-image-button-label = 岜堡岜涐睙岜贯报 岜メ碑岜炨碑岜� 岜⑨碑
diff --git a/public/pdfjs/web/locale/sc/viewer.ftl b/public/pdfjs/web/locale/sc/viewer.ftl
new file mode 100644
index 0000000..c8a7327
--- /dev/null
+++ b/public/pdfjs/web/locale/sc/viewer.ftl
@@ -0,0 +1,342 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = P脿gina anteriore
+pdfjs-previous-button-label = S'ischeda chi b'est primu
+pdfjs-next-button =
+    .title = P脿gina imbeniente
+pdfjs-next-button-label = Imbeniente
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = P脿gina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = de { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Impitica
+pdfjs-zoom-out-button-label = Impitica
+pdfjs-zoom-in-button =
+    .title = Ism脿nnia
+pdfjs-zoom-in-button-label = Ism脿nnia
+pdfjs-zoom-select =
+    .title = Ism脿nnia
+pdfjs-presentation-mode-button =
+    .title = Cola a sa modalidade de presentatzione
+pdfjs-presentation-mode-button-label = Modalidade de presentatzione
+pdfjs-open-file-button =
+    .title = Aberi s'arch矛viu
+pdfjs-open-file-button-label = Abertu
+pdfjs-print-button =
+    .title = Imprenta
+pdfjs-print-button-label = Imprenta
+pdfjs-save-button =
+    .title = Sarva
+pdfjs-save-button-label = Sarva
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Isc脿rriga
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Isc脿rriga
+pdfjs-bookmark-button =
+    .title = P脿gina atuale (ammustra s鈥橴RL de sa p脿gina atuale)
+pdfjs-bookmark-button-label = P脿gina atuale
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Istrumentos
+pdfjs-tools-button-label = Istrumentos
+pdfjs-first-page-button =
+    .title = Bae a sa prima p脿gina
+pdfjs-first-page-button-label = Bae a sa prima p脿gina
+pdfjs-last-page-button =
+    .title = Bae a s'霉rtima p脿gina
+pdfjs-last-page-button-label = Bae a s'霉rtima p脿gina
+pdfjs-page-rotate-cw-button =
+    .title = Gira in sensu or脿riu
+pdfjs-page-rotate-cw-button-label = Gira in sensu or脿riu
+pdfjs-page-rotate-ccw-button =
+    .title = Gira in sensu anti-or脿riu
+pdfjs-page-rotate-ccw-button-label = Gira in sensu anti-or脿riu
+pdfjs-cursor-text-select-tool-button =
+    .title = Ativa s'aina de seletzione de testu
+pdfjs-cursor-text-select-tool-button-label = Aina de seletzione de testu
+pdfjs-cursor-hand-tool-button =
+    .title = Ativa s'aina de manu
+pdfjs-cursor-hand-tool-button-label = Aina de manu
+pdfjs-scroll-page-button =
+    .title = Imprea s'iscurrimentu de p脿gina
+pdfjs-scroll-page-button-label = Iscurrimentu de p脿gina
+pdfjs-scroll-vertical-button =
+    .title = Imprea s'iscurrimentu verticale
+pdfjs-scroll-vertical-button-label = Iscurrimentu verticale
+pdfjs-scroll-horizontal-button =
+    .title = Imprea s'iscurrimentu orizontale
+pdfjs-scroll-horizontal-button-label = Iscurrimentu orizontale
+pdfjs-scroll-wrapped-button =
+    .title = Imprea s'iscurrimentu continu
+pdfjs-scroll-wrapped-button-label = Iscurrimentu continu
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Propiedades de su documentu鈥�
+pdfjs-document-properties-button-label = Propiedades de su documentu鈥�
+pdfjs-document-properties-file-name = N貌mine de s'arch矛viu:
+pdfjs-document-properties-file-size = Mann脿ria de s'arch矛viu:
+pdfjs-document-properties-title = T矛tulu:
+pdfjs-document-properties-author = Autoria:
+pdfjs-document-properties-subject = Ogetu:
+pdfjs-document-properties-keywords = Faeddos crae:
+pdfjs-document-properties-creation-date = Data de creatzione:
+pdfjs-document-properties-modification-date = Data de mod矛fica:
+pdfjs-document-properties-creator = Creatzione:
+pdfjs-document-properties-producer = Produtore de PDF:
+pdfjs-document-properties-version = Versione de PDF:
+pdfjs-document-properties-page-count = Contu de p脿ginas:
+pdfjs-document-properties-page-size = Mann脿ria de sa p脿gina:
+pdfjs-document-properties-page-size-unit-inches = p貌ddighes
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = verticale
+pdfjs-document-properties-page-size-orientation-landscape = orizontale
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = L矛tera
+pdfjs-document-properties-page-size-name-legal = Legale
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Visualizatzione web lestra:
+pdfjs-document-properties-linearized-yes = Eja
+pdfjs-document-properties-linearized-no = Nono
+pdfjs-document-properties-close-button = Serra
+
+## Print
+
+pdfjs-print-progress-message = Aparitzende s'imprenta de su documentu鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Annulla
+pdfjs-printing-not-supported = Atentzione: s'imprenta no est funtzionende de su totu in custu navigadore.
+pdfjs-printing-not-ready = Atentzione: su PDF no est istadu carrigadu de su totu pro s'imprenta.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Ativa/disativa sa barra laterale
+pdfjs-toggle-sidebar-notification-button =
+    .title = Ativa/disativa sa barra laterale (su documentu cuntenet un'ischema, alligongiados o livellos)
+pdfjs-toggle-sidebar-button-label = Ativa/disativa sa barra laterale
+pdfjs-document-outline-button-label = Ischema de su documentu
+pdfjs-attachments-button =
+    .title = Ammustra alligongiados
+pdfjs-attachments-button-label = Alliongiados
+pdfjs-layers-button =
+    .title = Ammustra livellos (clic d貌piu pro ripristinare totu is livellos a s'istadu predefinidu)
+pdfjs-layers-button-label = Livellos
+pdfjs-thumbs-button =
+    .title = Ammustra miniaturas
+pdfjs-thumbs-button-label = Miniaturas
+pdfjs-current-outline-item-button =
+    .title = Agata s'elementu atuale de s'ischema
+pdfjs-current-outline-item-button-label = Elementu atuale de s'ischema
+pdfjs-findbar-button =
+    .title = Agata in su documentu
+pdfjs-findbar-button-label = Agata
+pdfjs-additional-layers = Livellos additzionales
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = P脿gina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura de sa p脿gina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Agata
+    .placeholder = Agata in su documentu鈥�
+pdfjs-find-previous-button =
+    .title = Agata s'ocurr猫ntzia pretzedente de sa fr脿sia
+pdfjs-find-previous-button-label = S'ischeda chi b'est primu
+pdfjs-find-next-button =
+    .title = Agata s'ocurr猫ntzia imbeniente de sa fr脿sia
+pdfjs-find-next-button-label = Imbeniente
+pdfjs-find-highlight-checkbox = Evid猫ntzia totu
+pdfjs-find-match-case-checkbox-label = Distinghe intre maj霉sculas e min霉sculas
+pdfjs-find-match-diacritics-checkbox-label = Respeta is diacr矛ticos
+pdfjs-find-entire-word-checkbox-label = Faeddos intreos
+pdfjs-find-reached-top = S'est l貌mpidu a su cumintzu de su documentu, si sighit dae su b脿sciu
+pdfjs-find-reached-bottom = Acabbu de su documentu, si sighit dae s'artu
+pdfjs-find-not-found = Testu no agatadu
+
+## Predefined zoom values
+
+pdfjs-page-scale-auto = Ingrandimentu autom脿ticu
+pdfjs-page-scale-actual = Mann脿ria reale
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = P脿gina { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Faddina in sa c脿rriga de su PDF.
+pdfjs-invalid-file-error = Arch矛viu PDF non v脿lidu o corr霉mpidu.
+pdfjs-missing-file-error = Ammancat s'arch矛viu PDF.
+pdfjs-unexpected-response-error = Risposta imprevista de su serbidore.
+pdfjs-rendering-error = Faddina in sa visualizatzione de sa p脿gina.
+
+## Password
+
+pdfjs-password-label = Inserta sa crae pro ab猫rrere custu arch矛viu PDF.
+pdfjs-password-invalid = Sa crae no est curreta. Torra a nche proare.
+pdfjs-password-ok-button = Andat bene
+pdfjs-password-cancel-button = Annulla
+pdfjs-web-fonts-disabled = Is tipografias web sunt disativadas: is tipografias incrustadas a su PDF non podent 猫ssere impreadas.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Testu
+pdfjs-editor-free-text-button-label = Testu
+pdfjs-editor-ink-button =
+    .title = Disinnu
+pdfjs-editor-ink-button-label = Disinnu
+pdfjs-editor-stamp-button =
+    .title = Agiunghe o mod矛fica imm脿gines
+pdfjs-editor-stamp-button-label = Agiunghe o mod矛fica imm脿gines
+pdfjs-editor-highlight-button =
+    .title = Evid猫ntzia
+pdfjs-editor-highlight-button-label = Evid猫ntzia
+pdfjs-highlight-floating-button1 =
+    .title = Evid猫ntzia
+    .aria-label = Evid猫ntzia
+pdfjs-highlight-floating-button-label = Evid猫ntzia
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Boga su disinnu
+pdfjs-editor-remove-freetext-button =
+    .title = Boga su testu
+pdfjs-editor-remove-stamp-button =
+    .title = Boga s鈥檌mm脿gine
+pdfjs-editor-remove-highlight-button =
+    .title = Boga s鈥檈vid猫ntzia
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Colore
+pdfjs-editor-free-text-size-input = Mann脿ria
+pdfjs-editor-ink-color-input = Colore
+pdfjs-editor-ink-thickness-input = Gruss脿ria
+pdfjs-editor-stamp-add-image-button =
+    .title = Agiunghe un鈥檌mm脿gine
+pdfjs-editor-stamp-add-image-button-label = Agiunghe un鈥檌mm脿gine
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Gruss脿ria
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Editore de testu
+    .default-content = Cumintza a iscr矛ere鈥�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Testu alternativu
+pdfjs-editor-alt-text-dialog-label = S猫bera un鈥檕ptzione
+pdfjs-editor-alt-text-dialog-description = Su testu alternativu (鈥渁lt text鈥�) est 霉tile pro persones chi non podent b矛dere s鈥檌mm脿gine o cando non benit carrigada.
+pdfjs-editor-alt-text-add-description-label = Agiunghe una descritzione
+pdfjs-editor-alt-text-cancel-button = Annulla
+pdfjs-editor-alt-text-save-button = Sarva
+
+## Color picker
+
+pdfjs-editor-colorpicker-button =
+    .title = Modifica su colore
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Colores a disponimentu
+pdfjs-editor-colorpicker-yellow =
+    .title = Grogu
+pdfjs-editor-colorpicker-green =
+    .title = Birde
+pdfjs-editor-colorpicker-blue =
+    .title = Biaitu
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+pdfjs-editor-new-alt-text-missing-button-label = Mancat su testu alternativu
+pdfjs-editor-new-alt-text-to-review-button-label = Revisiona su testu alternativu
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creadu in autom脿ticu: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Cunfiguratzione de su testu alternativu de is imm脿gines
+pdfjs-image-alt-text-settings-button-label = Cunfiguratzione de su testu alternativu de is imm脿gines
+pdfjs-editor-alt-text-settings-dialog-label = Cunfiguratzione de su testu alternativu de is imm脿gines
+pdfjs-editor-alt-text-settings-automatic-title = Testu alternativu autom脿ticu
+pdfjs-editor-alt-text-settings-create-model-button-label = Crea testu alternativu in autom脿ticu
+pdfjs-editor-alt-text-settings-create-model-description = Cuss矛giat descritziones pro agiudare a gente chi non podet b矛dere s鈥檌mm脿gine o cando non benit carrigada.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Modellu de IA pro su testu alternativu ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Est esecutadu in locale in manera chi is datos tuos abarrent in privadu. Rechestu pro sa generatzione autom脿tica de testu alternativu.
+pdfjs-editor-alt-text-settings-delete-model-button = Cantzella
+pdfjs-editor-alt-text-settings-download-model-button = Isc脿rriga
+pdfjs-editor-alt-text-settings-downloading-model-button = Iscarrighende鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editore de testu alternativu
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Mustra deretu s鈥檈ditore de testu alternativu cando siat agiunta un鈥檌mm脿gine
+pdfjs-editor-alt-text-settings-show-dialog-description = T鈥檃giudat a assegurare chi totu is imm脿gines tuas t猫ngiant unu testu alternativu.
+pdfjs-editor-alt-text-settings-close-button = Serra
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Annulla
+
+##  Edit a comment dialog
+
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Cumintza a iscr矛ere鈥�
diff --git a/public/pdfjs/web/locale/scn/viewer.ftl b/public/pdfjs/web/locale/scn/viewer.ftl
new file mode 100644
index 0000000..287201a
--- /dev/null
+++ b/public/pdfjs/web/locale/scn/viewer.ftl
@@ -0,0 +1,32 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-zoom-out-button =
+    .title = Cchi霉 nicu
+pdfjs-zoom-out-button-label = Cchi霉 nicu
+pdfjs-zoom-in-button =
+    .title = Cchi霉 granni
+pdfjs-zoom-in-button-label = Cchi霉 granni
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Vista web lesta:
+pdfjs-document-properties-linearized-yes = Se
+
+## Print
+
+pdfjs-print-progress-close-button = Sfai
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Larghizza d芒 p脿ggina
+
+## Password
+
+pdfjs-password-cancel-button = Sfai
diff --git a/public/pdfjs/web/locale/sco/viewer.ftl b/public/pdfjs/web/locale/sco/viewer.ftl
new file mode 100644
index 0000000..ed4c3bb
--- /dev/null
+++ b/public/pdfjs/web/locale/sco/viewer.ftl
@@ -0,0 +1,238 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Page Afore
+pdfjs-previous-button-label = Previous
+pdfjs-next-button =
+    .title = Page Efter
+pdfjs-next-button-label = Neist
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Page
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = o { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } o { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zoom Oot
+pdfjs-zoom-out-button-label = Zoom Oot
+pdfjs-zoom-in-button =
+    .title = Zoom In
+pdfjs-zoom-in-button-label = Zoom In
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Flit tae Presentation Mode
+pdfjs-presentation-mode-button-label = Presentation Mode
+pdfjs-open-file-button =
+    .title = Open File
+pdfjs-open-file-button-label = Open
+pdfjs-print-button =
+    .title = Prent
+pdfjs-print-button-label = Prent
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Tools
+pdfjs-tools-button-label = Tools
+pdfjs-first-page-button =
+    .title = Gang tae First Page
+pdfjs-first-page-button-label = Gang tae First Page
+pdfjs-last-page-button =
+    .title = Gang tae Lest Page
+pdfjs-last-page-button-label = Gang tae Lest Page
+pdfjs-page-rotate-cw-button =
+    .title = Rotate Clockwise
+pdfjs-page-rotate-cw-button-label = Rotate Clockwise
+pdfjs-page-rotate-ccw-button =
+    .title = Rotate Coonterclockwise
+pdfjs-page-rotate-ccw-button-label = Rotate Coonterclockwise
+pdfjs-cursor-text-select-tool-button =
+    .title = Enable Text Walin Tool
+pdfjs-cursor-text-select-tool-button-label = Text Walin Tool
+pdfjs-cursor-hand-tool-button =
+    .title = Enable Haun Tool
+pdfjs-cursor-hand-tool-button-label = Haun Tool
+pdfjs-scroll-vertical-button =
+    .title = Yaise Vertical Scrollin
+pdfjs-scroll-vertical-button-label = Vertical Scrollin
+pdfjs-scroll-horizontal-button =
+    .title = Yaise Horizontal Scrollin
+pdfjs-scroll-horizontal-button-label = Horizontal Scrollin
+pdfjs-scroll-wrapped-button =
+    .title = Yaise Wrapped Scrollin
+pdfjs-scroll-wrapped-button-label = Wrapped Scrollin
+pdfjs-spread-none-button =
+    .title = Dinnae jyn page spreids
+pdfjs-spread-none-button-label = Nae Spreids
+pdfjs-spread-odd-button =
+    .title = Jyn page spreids stertin wi odd-numbered pages
+pdfjs-spread-odd-button-label = Odd Spreids
+pdfjs-spread-even-button =
+    .title = Jyn page spreids stertin wi even-numbered pages
+pdfjs-spread-even-button-label = Even Spreids
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Document Properties鈥�
+pdfjs-document-properties-button-label = Document Properties鈥�
+pdfjs-document-properties-file-name = File nemme:
+pdfjs-document-properties-file-size = File size:
+pdfjs-document-properties-title = Title:
+pdfjs-document-properties-author = Author:
+pdfjs-document-properties-subject = Subjeck:
+pdfjs-document-properties-keywords = Keywirds:
+pdfjs-document-properties-creation-date = Date o Makkin:
+pdfjs-document-properties-modification-date = Date o Chynges:
+pdfjs-document-properties-creator = Makker:
+pdfjs-document-properties-producer = PDF Producer:
+pdfjs-document-properties-version = PDF Version:
+pdfjs-document-properties-page-count = Page Coont:
+pdfjs-document-properties-page-size = Page Size:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portrait
+pdfjs-document-properties-page-size-orientation-landscape = landscape
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Wab View:
+pdfjs-document-properties-linearized-yes = Aye
+pdfjs-document-properties-linearized-no = Naw
+pdfjs-document-properties-close-button = Sneck
+
+## Print
+
+pdfjs-print-progress-message = Reddin document fur prentin鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Stap
+pdfjs-printing-not-supported = Tak tent: Prentin isnae richt supportit by this stravaiger.
+pdfjs-printing-not-ready = Tak tent: The PDF isnae richt loadit fur prentin.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Toggle Sidebaur
+pdfjs-toggle-sidebar-notification-button =
+    .title = Toggle Sidebaur (document conteens ootline/attachments/layers)
+pdfjs-toggle-sidebar-button-label = Toggle Sidebaur
+pdfjs-document-outline-button =
+    .title = Kythe Document Ootline (double-click fur tae oot-fauld/in-fauld aw items)
+pdfjs-document-outline-button-label = Document Ootline
+pdfjs-attachments-button =
+    .title = Kythe Attachments
+pdfjs-attachments-button-label = Attachments
+pdfjs-layers-button =
+    .title = Kythe Layers (double-click fur tae reset aw layers tae the staunart state)
+pdfjs-layers-button-label = Layers
+pdfjs-thumbs-button =
+    .title = Kythe Thumbnails
+pdfjs-thumbs-button-label = Thumbnails
+pdfjs-current-outline-item-button =
+    .title = Find Current Ootline Item
+pdfjs-current-outline-item-button-label = Current Ootline Item
+pdfjs-findbar-button =
+    .title = Find in Document
+pdfjs-findbar-button-label = Find
+pdfjs-additional-layers = Mair Layers
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Page { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Thumbnail o Page { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Find
+    .placeholder = Find in document鈥�
+pdfjs-find-previous-button =
+    .title = Airt oot the last time this phrase occurred
+pdfjs-find-previous-button-label = Previous
+pdfjs-find-next-button =
+    .title = Airt oot the neist time this phrase occurs
+pdfjs-find-next-button-label = Neist
+pdfjs-find-highlight-checkbox = Highlicht aw
+pdfjs-find-match-case-checkbox-label = Match case
+pdfjs-find-entire-word-checkbox-label = Hale Wirds
+pdfjs-find-reached-top = Raxed tap o document, went on fae the dowp end
+pdfjs-find-reached-bottom = Raxed end o document, went on fae the tap
+pdfjs-find-not-found = Phrase no fund
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Page Width
+pdfjs-page-scale-fit = Page Fit
+pdfjs-page-scale-auto = Automatic Zoom
+pdfjs-page-scale-actual = Actual Size
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Page { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = An mishanter tuik place while loadin the PDF.
+pdfjs-invalid-file-error = No suithfest or camshauchlet PDF file.
+pdfjs-missing-file-error = PDF file tint.
+pdfjs-unexpected-response-error = Unexpectit server repone.
+pdfjs-rendering-error = A mishanter tuik place while renderin the page.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = Inpit the passwird fur tae open this PDF file.
+pdfjs-password-invalid = Passwird no suithfest. Gonnae gie it anither shot.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Stap
+pdfjs-web-fonts-disabled = Wab fonts are disabled: cannae yaise embeddit PDF fonts.
diff --git a/public/pdfjs/web/locale/si/viewer.ftl b/public/pdfjs/web/locale/si/viewer.ftl
new file mode 100644
index 0000000..28d53f3
--- /dev/null
+++ b/public/pdfjs/web/locale/si/viewer.ftl
@@ -0,0 +1,228 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 喽氞督喾掄侗喾� 喽脆窉喽о窋喾�
+pdfjs-previous-button-label = 喽氞督喾掄侗喾�
+pdfjs-next-button =
+    .title = 喽娻穮喽� 喽脆窉喽о窋喾�
+pdfjs-next-button-label = 喽娻穮喽�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 喽脆窉喽о窋喾�
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 喽氞窋喽┼窂喽洁侗喽�
+pdfjs-zoom-out-button-label = 喽氞窋喽┼窂喽洁侗喽�
+pdfjs-zoom-in-button =
+    .title = 喾�喾掄穪喾忇督喽编逗
+pdfjs-zoom-in-button-label = 喾�喾掄穪喾忇督喽编逗
+pdfjs-zoom-select =
+    .title = 喾�喾掄穪喾忇督 喽氞痘喽编穵喽�
+pdfjs-presentation-mode-button =
+    .title = 喾冟陡喽秽穵喽脆东 喽脆穵鈥嵿痘喽氞窂喽秽逗 喾�喾權董 喽膏窂喽秽窋喾�喽编穵喽�
+pdfjs-presentation-mode-button-label = 喾冟陡喽秽穵喽脆东 喽脆穵鈥嵿痘喽氞窂喽秽逗
+pdfjs-open-file-button =
+    .title = 喽溹窚喽编窋喾� 喽呧痘喾掄侗喾娻侗
+pdfjs-open-file-button-label = 喽呧痘喾掄侗喾娻侗
+pdfjs-print-button =
+    .title = 喽膏窋喽穵鈥嵿痘喽逗
+pdfjs-print-button-label = 喽膏窋喽穵鈥嵿痘喽逗
+pdfjs-save-button =
+    .title = 喾冟窋喽秽稓喾掄侗喾娻侗
+pdfjs-save-button-label = 喾冟窋喽秽稓喾掄侗喾娻侗
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 喽多窂喽溹侗喾娻侗
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 喽多窂喽溹侗喾娻侗
+pdfjs-bookmark-button-label = 喽脆穩喽窉喽� 喽脆窉喽о窋喾�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 喽膏窓喾�喽洁陡喾�
+pdfjs-tools-button-label = 喽膏窓喾�喽洁陡喾�
+pdfjs-first-page-button =
+    .title = 喽膏窋喽洁穵 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+pdfjs-first-page-button-label = 喽膏窋喽洁穵 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+pdfjs-last-page-button =
+    .title = 喽呧穩喾冟侗喾� 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+pdfjs-last-page-button-label = 喽呧穩喾冟侗喾� 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+pdfjs-cursor-text-select-tool-button =
+    .title = 喽脆窓喾� 喽窔喽秽窊喽膏窔 喽膏窓喾�喽洁陡 喾冟抖喽� 喽氞痘喽编穵喽�
+pdfjs-cursor-text-select-tool-button-label = 喽脆窓喾� 喽窔喽秽窊喽膏窔 喽膏窓喾�喽洁陡
+pdfjs-cursor-hand-tool-button =
+    .title = 喽呧董喾� 喽膏窓喾�喽洁陡 喾冟抖喽� 喽氞痘喽编穵喽�
+pdfjs-cursor-hand-tool-button-label = 喽呧董喾� 喽膏窓喾�喽洁陡
+pdfjs-scroll-page-button =
+    .title = 喽脆窉喽о窋喾� 喽呧侗喾斷稜喽洁侗喽� 喽粪窂喾�喾掄董喽�
+pdfjs-scroll-page-button-label = 喽脆窉喽о窋喾� 喽呧侗喾斷稜喽洁侗喽�
+pdfjs-scroll-vertical-button =
+    .title = 喾冟窉喽秽穬喾� 喽呧侗喾斷稜喽洁侗喽� 喽粪窂喾�喾掄董喽�
+pdfjs-scroll-vertical-button-label = 喾冟窉喽秽穬喾� 喽呧侗喾斷稜喽洁侗喽�
+pdfjs-scroll-horizontal-button =
+    .title = 喽窉喽秽穬喾� 喽呧侗喾斷稜喽洁侗喽� 喽粪窂喾�喾掄董喽�
+pdfjs-scroll-horizontal-button-label = 喽窉喽秽穬喾� 喽呧侗喾斷稜喽洁侗喽�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 喽洁窔喽涏侗喽亨窔 喽溹窋喽窂喽傕稖鈥�
+pdfjs-document-properties-button-label = 喽洁窔喽涏侗喽亨窔 喽溹窋喽窂喽傕稖鈥�
+pdfjs-document-properties-file-name = 喽溹窚喽编窋喾�喾� 喽编陡:
+pdfjs-document-properties-file-size = 喽溹窚喽编窋喾�喾� 喽脆穵鈥嵿痘喽膏窂喽逗:
+pdfjs-document-properties-title = 喾冟窉喽秽窅喾冟窉喽�:
+pdfjs-document-properties-author = 喽氞董喾�:
+pdfjs-document-properties-subject = 喽膏窂喽窐喽氞窂喾�:
+pdfjs-document-properties-keywords = 喽膏窎喽� 喽脆动:
+pdfjs-document-properties-creation-date = 喾冟窇喽窎 喽窉喽编逗:
+pdfjs-document-properties-modification-date = 喾冟秱喾佮窛喽班窉喽� 喽窉喽编逗:
+pdfjs-document-properties-creator = 喽编窉喽秽穵喽膏窂喽窐:
+pdfjs-document-properties-producer = 喽脆窊喽┼窊喽戉穯喾� 喾冟陡喾娻洞喾忇动喽�:
+pdfjs-document-properties-version = 喽脆窊喽┼窊喽戉穯喾� 喽呧侗喾斷穩喾忇动喽�:
+pdfjs-document-properties-page-count = 喽脆窉喽о窋 喽溹东喽�:
+pdfjs-document-properties-page-size = 喽脆窉喽о窋喾�喾� 喽痘喽�:
+pdfjs-document-properties-page-size-unit-inches = 喽呧稛喽洁穵
+pdfjs-document-properties-page-size-unit-millimeters = 喽膏窉.喽膏窊.
+pdfjs-document-properties-page-size-orientation-portrait = 喾冟窉喽秽穬喾�
+pdfjs-document-properties-page-size-orientation-landscape = 喽窉喽秽穬喾�
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width }脳{ $height }{ $unit }{ $name }{ $orientation }
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 喾�喾氞稖喾�喽穵 喾�喾掄逗喽膏侗 喽窅喽氞穵喽�:
+pdfjs-document-properties-linearized-yes = 喽斷穩喾�
+pdfjs-document-properties-linearized-no = 喽编窅喾勦窅
+pdfjs-document-properties-close-button = 喾�喾冟侗喾娻侗
+
+## Print
+
+pdfjs-print-progress-message = 喽膏窋喽穵鈥嵿痘喽逗 喾冟冻喾勦窂 喽洁窔喽涏侗喽� 喾冟窎喽窂喽编陡喾� 喾�喾權陡喾掄侗喾娾��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 喽呧穩喽洁秱喽溹窋 喽氞痘喽编穵喽�
+pdfjs-printing-not-supported = 喽呧穩喾�喾忇动喽亨逗喾�: 喽膏窓喽� 喽呧董喾掄痘喾掄稓喾娻穬喾斷穩 喽膏窋喽穵鈥嵿痘喽逗 喾冟冻喾勦窂 喾勦窚喽赤窉喽编穵 喾冟穭喾忇逗 喽编窚喽稓喾娻穩喽亨窉.
+pdfjs-printing-not-ready = 喽呧穩喾�喾忇动喽亨逗喾�: 喽膏窋喽穵鈥嵿痘喽逗喽� 喽脆窊喽┼窊喽戉穯喾� 喽溹窚喽编窋喾� 喾冟陡喾娻洞喾栢痘喾娻东喽亨窓喽编穵 喽脆窎喽秽东喽� 喾�喾� 喽编窅喽�.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-document-outline-button-label = 喽洁窔喽涏侗喽亨窔 喾�喽о穬喽�
+pdfjs-attachments-button =
+    .title = 喽囙陡喾斷东喾斷陡喾� 喽脆窓喽编穵喾�喽编穵喽�
+pdfjs-attachments-button-label = 喽囙陡喾斷东喾斷陡喾�
+pdfjs-layers-button =
+    .title = 喾冟穵喽痘 喽脆窓喽编穵喾�喽编穵喽� (喾冟窉喽亨穮喾� 喾冟穵喽痘 喽脆窓喽秽侗喾掄陡喾� 喽董喾娾�嵿穩喽亨锭 喽亨穮喾� 喾冟窅喽氞穬喾撪陡喽� 喽窓喾�喽秽稓喾� 喽斷抖喽编穵喽�)
+pdfjs-layers-button-label = 喾冟穵喽痘
+pdfjs-thumbs-button =
+    .title = 喾冟窉喽熰窉喽窉 喽秽窎 喽脆窓喽编穵喾�喽编穵喽�
+pdfjs-thumbs-button-label = 喾冟窉喽熰窉喽窉 喽秽窎
+pdfjs-findbar-button =
+    .title = 喽洁窔喽涏侗喽亨窓喾勦窉 喾冟窚喽亨侗喾娻侗
+pdfjs-findbar-button-label = 喾冟窚喽亨侗喾娻侗
+pdfjs-additional-layers = 喽呧董喾掄痘喾氞稓 喾冟穵喽痘
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 喽脆窉喽о窋喾� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 喽脆窉喽о窋喾�喾� 喾冟窉喽熰窉喽� 喽秽窎喾� { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 喾冟窚喽亨侗喾娻侗
+    .placeholder = 喽洁窔喽涏侗喽亨窔 喾冟窚喽亨侗喾娻侗鈥�
+pdfjs-find-previous-button =
+    .title = 喽膏窓喽� 喾�喾愢稓喾掄稓喽� 喽氞督喾掄侗喾� 喽亨窓喽窋喽窋 喾冟穵喽窂喽编逗 喾冟窚喽亨侗喾娻侗
+pdfjs-find-previous-button-label = 喽氞督喾掄侗喾�
+pdfjs-find-next-button =
+    .title = 喽膏窓喽� 喾�喾愢稓喾掄稓喽� 喽娻穮喽熰锭 喽亨窓喽窓喽� 喾冟穵喽窂喽编逗 喾冟窚喽亨侗喾娻侗
+pdfjs-find-next-button-label = 喽娻穮喽�
+pdfjs-find-highlight-checkbox = 喾冟窉喽亨督喾娻督 喽嬥动喾娻动喾撪洞喽编逗
+pdfjs-find-entire-word-checkbox-label = 喾冟陡喾冟穵喽� 喾�喽犩侗
+pdfjs-find-reached-top = 喽洁窔喽涏侗喽亨窔 喽膏窋喽窋喽编锭 喾呧稛喾� 喾�喾掄逗, 喽脆穭喾� 喾冟窉喽� 喽夃穭喾呧锭
+pdfjs-find-reached-bottom = 喽洁窔喽涏侗喽亨窔 喽呧穩喾冟窂喽编逗喽� 喾呧稛喾� 喾�喾掄逗, 喽夃穭喾� 喾冟窉喽� 喽脆穭喾呧锭
+pdfjs-find-not-found = 喾�喾愢稓喾掄稓喽� 喾勦陡喾� 喽编窚喾�喾斷东喾�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 喽脆窉喽о窋喾�喾� 喽脆穮喽�
+pdfjs-page-scale-auto = 喾冟穵喾�喽亨秱喽氞穵鈥嵿痘喾撪逗 喾�喾掄穪喾忇督喽编逗
+pdfjs-page-scale-actual = 喾冟窅喽多窇 喽脆穵鈥嵿痘喽膏窂喽逗
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 喽脆窉喽о窋喾� { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 喽脆窊喽┼窊喽戉穯喾� 喽脆窎喽秽东喽� 喽氞窉喽秽窊喽膏窔喽窊 喽窛喾傕逗喽氞穵 喾冟窉喽窋 喾�喾掄逗.
+pdfjs-invalid-file-error = 喾�喽洁秱喽溹窋 喽编窚喾�喽� 喾勦窛 喾勦窂喽编窉喾�喾� 喽脆窊喽┼窊喽戉穯喾� 喽溹窚喽编窋喾�喽氞窉.
+pdfjs-missing-file-error = 喽膏稛喾勦窅喽秽窋喽窋 喽脆窊喽┼窊喽戉穯喾� 喽溹窚喽编窋喾�喽氞窉.
+pdfjs-unexpected-response-error = 喽呧侗喽脆窔喽氞穵鈥嵿穫喾掄董 喾冟窔喾�喾忇动喾忇逗喽� 喽脆穵鈥嵿痘喽窉喽犩窂喽秽逗喽氞窉.
+
+## Password
+
+pdfjs-password-label = 喽膏窓喽� 喽脆窊喽┼窊喽戉穯喾� 喽溹窚喽编窋喾� 喾�喾掄穩喾樴董 喽氞窉喽秽窊喽膏锭 喽膏窋喽秽洞喽逗 喽亨窚喽侗喾娻侗.
+pdfjs-password-invalid = 喾�喾愢痘喽窉 喽膏窋喽秽洞喽逗喽氞窉. 喽编窅喾�喽� 喽嬥董喾娻穬喾忇穭 喽氞痘喽编穵喽�.
+pdfjs-password-ok-button = 喾勦痘喾�
+pdfjs-password-cancel-button = 喽呧穩喽洁秱喽溹窋
+pdfjs-web-fonts-disabled = 喾�喾掄逗喽膏侗 喽呧稓喾斷痘喾� 喽呧抖喽洁逗喾�: 喽脆窊喽┼窊喽戉穯喾� 喾�喾權董 喽氞窂喾�喾愢动喾娻动喾� 喽秽窋喾�喽氞窋喽秽窋 喽粪窂喾�喾掄董喾� 喽氞穮 喽编窚喾勦窅喽氞窉喽�.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 喽脆窓喾�
+pdfjs-editor-free-text-button-label = 喽脆窓喾�
+pdfjs-editor-ink-button =
+    .title = 喽呧冻喾掄侗喾娻侗
+pdfjs-editor-ink-button-label = 喽呧冻喾掄侗喾娻侗
+pdfjs-editor-stamp-button =
+    .title = 喽秽窎喽� 喾冟秱喾冟穵喽氞痘喽逗 喾勦窛 喽戉稓喾� 喽氞痘喽编穵喽�
+pdfjs-editor-stamp-button-label = 喽秽窎喽� 喾冟秱喾冟穵喽氞痘喽逗 喾勦窛 喽戉稓喾� 喽氞痘喽编穵喽�
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 喾�喽秽穵喽逗
+pdfjs-editor-free-text-size-input = 喽痘喽�
+pdfjs-editor-ink-color-input = 喾�喽秽穵喽逗
+pdfjs-editor-ink-thickness-input = 喽澿东喽氞陡
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-mark-decorative-description = 喽膏窓喽� 喽窂喽� 喾勦窛 喽窉喽� 喾冟督喽氞窋喽窋 喾�喾愢侗喾� 喽呧督喽傕稓喾忇痘 喽秽窎喽� 喾冟冻喾勦窂 喽粪窂喾�喾掄董喾� 喾�喾�.
diff --git a/public/pdfjs/web/locale/sk/viewer.ftl b/public/pdfjs/web/locale/sk/viewer.ftl
new file mode 100644
index 0000000..34814b7
--- /dev/null
+++ b/public/pdfjs/web/locale/sk/viewer.ftl
@@ -0,0 +1,763 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Predch谩dzaj煤ca strana
+pdfjs-previous-button-label = Predch谩dzaj煤ca
+pdfjs-next-button =
+    .title = Nasleduj煤ca strana
+pdfjs-next-button-label = Nasleduj煤ca
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Strana
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = z { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } z { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zmen拧i钮 ve木kos钮
+pdfjs-zoom-out-button-label = Zmen拧i钮 ve木kos钮
+pdfjs-zoom-in-button =
+    .title = Zv盲膷拧i钮 ve木kos钮
+pdfjs-zoom-in-button-label = Zv盲膷拧i钮 ve木kos钮
+pdfjs-zoom-select =
+    .title = Nastavenie ve木kosti
+pdfjs-presentation-mode-button =
+    .title = Prepn煤钮 na re啪im prezent谩cie
+pdfjs-presentation-mode-button-label = Re啪im prezent谩cie
+pdfjs-open-file-button =
+    .title = Otvori钮 s煤bor
+pdfjs-open-file-button-label = Otvori钮
+pdfjs-print-button =
+    .title = Tla膷i钮
+pdfjs-print-button-label = Tla膷i钮
+pdfjs-save-button =
+    .title = Ulo啪i钮
+pdfjs-save-button-label = Ulo啪i钮
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Stiahnu钮
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Stiahnu钮
+pdfjs-bookmark-button =
+    .title = Aktu谩lna str谩nka (zobrazi钮 adresu URL z aktu谩lnej str谩nky)
+pdfjs-bookmark-button-label = Aktu谩lna str谩nka
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = N谩stroje
+pdfjs-tools-button-label = N谩stroje
+pdfjs-first-page-button =
+    .title = Prejs钮 na prv煤 stranu
+pdfjs-first-page-button-label = Prejs钮 na prv煤 stranu
+pdfjs-last-page-button =
+    .title = Prejs钮 na posledn煤 stranu
+pdfjs-last-page-button-label = Prejs钮 na posledn煤 stranu
+pdfjs-page-rotate-cw-button =
+    .title = Oto膷i钮 v smere hodinov媒ch ru膷i膷iek
+pdfjs-page-rotate-cw-button-label = Oto膷i钮 v smere hodinov媒ch ru膷i膷iek
+pdfjs-page-rotate-ccw-button =
+    .title = Oto膷i钮 proti smeru hodinov媒ch ru膷i膷iek
+pdfjs-page-rotate-ccw-button-label = Oto膷i钮 proti smeru hodinov媒ch ru膷i膷iek
+pdfjs-cursor-text-select-tool-button =
+    .title = Povoli钮 v媒ber textu
+pdfjs-cursor-text-select-tool-button-label = V媒ber textu
+pdfjs-cursor-hand-tool-button =
+    .title = Povoli钮 n谩stroj ruka
+pdfjs-cursor-hand-tool-button-label = N谩stroj ruka
+pdfjs-scroll-page-button =
+    .title = Pou啪i钮 rolovanie po str谩nkach
+pdfjs-scroll-page-button-label = Rolovanie po str谩nkach
+pdfjs-scroll-vertical-button =
+    .title = Pou啪铆va钮 zvisl茅 pos煤vanie
+pdfjs-scroll-vertical-button-label = Zvisl茅 pos煤vanie
+pdfjs-scroll-horizontal-button =
+    .title = Pou啪铆va钮 vodorovn茅 pos煤vanie
+pdfjs-scroll-horizontal-button-label = Vodorovn茅 pos煤vanie
+pdfjs-scroll-wrapped-button =
+    .title = Pou啪i钮 postupn茅 pos煤vanie
+pdfjs-scroll-wrapped-button-label = Postupn茅 pos煤vanie
+pdfjs-spread-none-button =
+    .title = Nezdru啪ova钮 str谩nky
+pdfjs-spread-none-button-label = 沤iadne zdru啪ovanie
+pdfjs-spread-odd-button =
+    .title = Zdru啪铆 str谩nky a umiestni nep谩rne str谩nky v木avo
+pdfjs-spread-odd-button-label = Zdru啪i钮 str谩nky (nep谩rne v木avo)
+pdfjs-spread-even-button =
+    .title = Zdru啪铆 str谩nky a umiestni p谩rne str谩nky v木avo
+pdfjs-spread-even-button-label = Zdru啪i钮 str谩nky (p谩rne v木avo)
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Vlastnosti dokumentu鈥�
+pdfjs-document-properties-button-label = Vlastnosti dokumentu鈥�
+pdfjs-document-properties-file-name = N谩zov s煤boru:
+pdfjs-document-properties-file-size = Ve木kos钮 s煤boru:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bajtov)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtov)
+pdfjs-document-properties-title = N谩zov:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Predmet:
+pdfjs-document-properties-keywords = K木煤膷ov茅 slov谩:
+pdfjs-document-properties-creation-date = D谩tum vytvorenia:
+pdfjs-document-properties-modification-date = D谩tum 煤pravy:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Aplik谩cia:
+pdfjs-document-properties-producer = Tvorca PDF:
+pdfjs-document-properties-version = Verzia PDF:
+pdfjs-document-properties-page-count = Po膷et str谩n:
+pdfjs-document-properties-page-size = Ve木kos钮 str谩nky:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = na v媒拧ku
+pdfjs-document-properties-page-size-orientation-landscape = na 拧铆rku
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = List
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = R媒chle聽zobrazovanie聽z聽webu:
+pdfjs-document-properties-linearized-yes = 脕no
+pdfjs-document-properties-linearized-no = Nie
+pdfjs-document-properties-close-button = Zavrie钮
+
+## Print
+
+pdfjs-print-progress-message = Pr铆prava dokumentu na tla膷鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress } %
+pdfjs-print-progress-close-button = Zru拧i钮
+pdfjs-printing-not-supported = Upozornenie: tla膷 nie je v tomto prehliada膷i plne podporovan谩.
+pdfjs-printing-not-ready = Upozornenie: s煤bor PDF nie je plne na膷铆tan媒 pre tla膷.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Prepn煤钮 bo膷n媒 panel
+pdfjs-toggle-sidebar-notification-button =
+    .title = Prepn煤钮 bo膷n媒 panel (dokument obsahuje osnovu/pr铆lohy/vrstvy)
+pdfjs-toggle-sidebar-button-label = Prepn煤钮 bo膷n媒 panel
+pdfjs-document-outline-button =
+    .title = Zobrazi钮 osnovu dokumentu (dvojit媒m kliknut铆m rozbal铆te/zbal铆te v拧etky polo啪ky)
+pdfjs-document-outline-button-label = Osnova dokumentu
+pdfjs-attachments-button =
+    .title = Zobrazi钮 pr铆lohy
+pdfjs-attachments-button-label = Pr铆lohy
+pdfjs-layers-button =
+    .title = Zobrazi钮 vrstvy (dvojit媒m kliknut铆m uvediete v拧etky vrstvy do p么vodn茅ho stavu)
+pdfjs-layers-button-label = Vrstvy
+pdfjs-thumbs-button =
+    .title = Zobrazi钮 miniat煤ry
+pdfjs-thumbs-button-label = Miniat煤ry
+pdfjs-current-outline-item-button =
+    .title = N谩js钮 aktu谩lnu polo啪ku v osnove
+pdfjs-current-outline-item-button-label = Aktu谩lna polo啪ka v osnove
+pdfjs-findbar-button =
+    .title = H木ada钮 v dokumente
+pdfjs-findbar-button-label = H木ada钮
+pdfjs-additional-layers = 膸al拧ie vrstvy
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Strana { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniat煤ra strany { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Vybra钮 stranu { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Strana { $page } z { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = H木ada钮
+    .placeholder = H木ada钮 v dokumente鈥�
+pdfjs-find-previous-button =
+    .title = Vyh木ada钮 predch谩dzaj煤ci v媒skyt re钮azca
+pdfjs-find-previous-button-label = Predch谩dzaj煤ce
+pdfjs-find-next-button =
+    .title = Vyh木ada钮 膹al拧铆 v媒skyt re钮azca
+pdfjs-find-next-button-label = 膸al拧ie
+pdfjs-find-highlight-checkbox = Zv媒razni钮 v拧etky
+pdfjs-find-match-case-checkbox-label = Rozli拧ova钮 ve木kos钮 p铆smen
+pdfjs-find-match-diacritics-checkbox-label = Rozli拧ova钮 diakritiku
+pdfjs-find-entire-word-checkbox-label = Cel茅 slov谩
+pdfjs-find-reached-top = Bol dosiahnut媒 za膷iatok str谩nky, pokra膷uje sa od konca
+pdfjs-find-reached-bottom = Bol dosiahnut媒 koniec str谩nky, pokra膷uje sa od za膷iatku
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] V媒skyt { $current } z { $total }
+        [few] V媒skyt { $current } z { $total }
+        [many] V媒skyt { $current } z { $total }
+       *[other] V媒skyt { $current } z { $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Viac ako { $limit } v媒skyt
+        [few] Viac ako { $limit } v媒skyty
+        [many] Viac ako { $limit } v媒skytov
+       *[other] Viac ako { $limit } v媒skytov
+    }
+pdfjs-find-not-found = V媒raz nebol n谩jden媒
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Na 拧铆rku strany
+pdfjs-page-scale-fit = Na ve木kos钮 strany
+pdfjs-page-scale-auto = Automatick谩 ve木kos钮
+pdfjs-page-scale-actual = Skuto膷n谩 ve木kos钮
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale } %
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Strana { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Po膷as na膷铆tavania dokumentu PDF sa vyskytla chyba.
+pdfjs-invalid-file-error = Neplatn媒 alebo po拧koden媒 s煤bor PDF.
+pdfjs-missing-file-error = Ch媒baj煤ci s煤bor PDF.
+pdfjs-unexpected-response-error = Neo膷ak谩van谩 odpove膹 zo servera.
+pdfjs-rendering-error = Pri vykres木ovan铆 str谩nky sa vyskytla chyba.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anot谩cia typu { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Ak chcete otvori钮 tento s煤bor PDF, zadajte jeho heslo.
+pdfjs-password-invalid = Heslo nie je platn茅. Sk煤ste to znova.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Zru拧i钮
+pdfjs-web-fonts-disabled = Webov茅 p铆sma s煤 vypnut茅: nie je mo啪n茅 pou啪i钮 p铆sma vlo啪en茅 do s煤boru PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = Zmeni钮 farbu textu
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Kresli钮
+pdfjs-editor-color-picker-ink-input =
+    .title = Zmeni钮 farbu kresby
+pdfjs-editor-ink-button-label = Kresli钮
+pdfjs-editor-stamp-button =
+    .title = Prida钮 alebo upravi钮 obr谩zky
+pdfjs-editor-stamp-button-label = Prida钮 alebo upravi钮 obr谩zky
+pdfjs-editor-highlight-button =
+    .title = Zv媒razni钮
+pdfjs-editor-highlight-button-label = Zv媒razni钮
+pdfjs-highlight-floating-button1 =
+    .title = Zv媒razni钮
+    .aria-label = Zv媒razni钮
+pdfjs-highlight-floating-button-label = Zv媒razni钮
+pdfjs-comment-floating-button =
+    .title = Prida钮 koment谩r
+    .aria-label = Prida钮 koment谩r
+pdfjs-comment-floating-button-label = Prida钮 koment谩r
+pdfjs-editor-comment-button =
+    .title = Prida钮 koment谩r
+    .aria-label = Prida钮 koment谩r
+pdfjs-editor-comment-button-label = Prida钮 koment谩r
+pdfjs-editor-signature-button =
+    .title = Prida钮 podpis
+pdfjs-editor-signature-button-label = Prida钮 podpis
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Editor zv媒raznenia
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Editor kreslenia
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Editor podpisu: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Editor obr谩zkov
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Odstr谩ni钮 kresbu
+pdfjs-editor-remove-freetext-button =
+    .title = Odstr谩ni钮 text
+pdfjs-editor-remove-stamp-button =
+    .title = Odstr谩ni钮 obr谩zok
+pdfjs-editor-remove-highlight-button =
+    .title = Odstr谩ni钮 zv媒raznenie
+pdfjs-editor-remove-signature-button =
+    .title = Odstr谩ni钮 podpis
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Farba
+pdfjs-editor-free-text-size-input = Ve木kos钮
+pdfjs-editor-ink-color-input = Farba
+pdfjs-editor-ink-thickness-input = Hr煤bka
+pdfjs-editor-ink-opacity-input = Prieh木adnos钮
+pdfjs-editor-stamp-add-image-button =
+    .title = Prida钮 obr谩zok
+pdfjs-editor-stamp-add-image-button-label = Prida钮 obr谩zok
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Hr煤bka
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Zme艌te hr煤bku pre zv媒raz艌ovanie in媒ch polo啪iek ako textu
+pdfjs-editor-add-signature-container =
+    .aria-label = Ovl谩dacie prvky pre podpisy a ulo啪en茅 podpisy
+pdfjs-editor-signature-add-signature-button =
+    .title = Prida钮 nov媒 podpis
+pdfjs-editor-signature-add-signature-button-label = Prida钮 nov媒 podpis
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Ulo啪en媒 podpis: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Textov媒 editor
+    .default-content = Za膷nite p铆sa钮鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Koment谩r
+        [few] Koment谩re
+        [many] Koment谩rov
+       *[other] Koment谩rov
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Zavrie钮 bo膷n媒 panel
+    .aria-label = Zavrie钮 bo膷n媒 panel
+pdfjs-editor-comments-sidebar-close-button-label = Zavrie钮 bo膷n媒 panel
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Vid铆te nie膷o pozoruhodn茅? Zv媒raznite to a zanechajte koment谩r.
+pdfjs-editor-comments-sidebar-no-comments-link = 膸al拧ie inform谩cie
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternat铆vny text
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Upravi钮 alternat铆vny text
+pdfjs-editor-alt-text-dialog-label = Vyberte mo啪nos钮
+pdfjs-editor-alt-text-dialog-description = Alternat铆vny text (alt text) pom谩ha, ke膹 木udia obr谩zok nevidia alebo sa nena膷铆tava.
+pdfjs-editor-alt-text-add-description-label = Prida钮 popis
+pdfjs-editor-alt-text-add-description-description = Zamerajte sa na 1-2 vety, ktor茅 popisuj煤 predmet, prostredie alebo akcie.
+pdfjs-editor-alt-text-mark-decorative-label = Ozna膷i钮 ako dekorat铆vny
+pdfjs-editor-alt-text-mark-decorative-description = Pou啪铆va sa na ozdobn茅 obr谩zky, ako s煤 okraje alebo vodoznaky.
+pdfjs-editor-alt-text-cancel-button = Zru拧i钮
+pdfjs-editor-alt-text-save-button = Ulo啪i钮
+pdfjs-editor-alt-text-decorative-tooltip = Ozna膷en媒 ako dekorat铆vny
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Napr铆klad: 鈥濵lad媒 mu啪 si sad谩 za st么l, aby sa najedol鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternat铆vny text
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 慕av媒 horn媒 roh 鈥� zmena ve木kosti
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Horn媒 stred 鈥� zmena ve木kosti
+pdfjs-editor-resizer-top-right =
+    .aria-label = Prav媒 horn媒 roh 鈥� zmena ve木kosti
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Vpravo uprostred 鈥� zmena ve木kosti
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Prav媒 doln媒 roh 鈥� zmena ve木kosti
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Stred dole 鈥� zmena ve木kosti
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 慕av媒 doln媒 roh 鈥� zmena ve木kosti
+pdfjs-editor-resizer-middle-left =
+    .aria-label = V木avo uprostred 鈥� zmena ve木kosti
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Farba zv媒raznenia
+pdfjs-editor-colorpicker-button =
+    .title = Zmeni钮 farbu
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = V媒ber farieb
+pdfjs-editor-colorpicker-yellow =
+    .title = 沤lt谩
+pdfjs-editor-colorpicker-green =
+    .title = Zelen谩
+pdfjs-editor-colorpicker-blue =
+    .title = Modr谩
+pdfjs-editor-colorpicker-pink =
+    .title = Ru啪ov谩
+pdfjs-editor-colorpicker-red =
+    .title = 膶erven谩
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Zobrazi钮 v拧etko
+pdfjs-editor-highlight-show-all-button =
+    .title = Zobrazi钮 v拧etko
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Upravi钮 alternat铆vny text (popis obr谩zka)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Prida钮 alternat铆vny text (popis obr谩zka)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Sem nap铆拧te svoj popis鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kr谩tky popis pre 木ud铆, ktor铆 nevidia obr谩zok alebo ak sa obr谩zok nena膷铆ta.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Tento alternat铆vny text bol vytvoren媒 automaticky a m么啪e by钮 nepresn媒.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 膸al拧ie inform谩cie
+pdfjs-editor-new-alt-text-create-automatically-button-label = Automaticky vytvori钮 alternat铆vny text
+pdfjs-editor-new-alt-text-not-now-button = Teraz nie
+pdfjs-editor-new-alt-text-error-title = Alternat铆vny text sa nepodarilo vytvori钮 automaticky
+pdfjs-editor-new-alt-text-error-description = Nap铆拧te svoj vlastn媒 alternat铆vny text alebo to sk煤ste znova nesk么r.
+pdfjs-editor-new-alt-text-error-close-button = Zavrie钮
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = S钮ahuje sa model AI pre alternat铆vne texty ({ $downloadedSize } z { $totalSize } MB)
+    .aria-valuetext = S钮ahuje sa model AI pre alternat铆vne texty ({ $downloadedSize } z { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternat铆vny text bol pridan媒
+pdfjs-editor-new-alt-text-added-button-label = Alternat铆vny text bol pridan媒
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Ch媒baj煤ci alternat铆vny text
+pdfjs-editor-new-alt-text-missing-button-label = Ch媒baj煤ci alternat铆vny text
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Skontrolova钮 alternat铆vny text
+pdfjs-editor-new-alt-text-to-review-button-label = Skontrolova钮 alternat铆vny text
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Vytvoren茅 automaticky: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Nastavenia alternat铆vneho textu obr谩zka
+pdfjs-image-alt-text-settings-button-label = Nastavenia alternat铆vneho textu obr谩zka
+pdfjs-editor-alt-text-settings-dialog-label = Nastavenia alternat铆vneho textu obr谩zka
+pdfjs-editor-alt-text-settings-automatic-title = Automatick媒 alternat铆vny text
+pdfjs-editor-alt-text-settings-create-model-button-label = Automaticky vytvori钮 alternat铆vny text
+pdfjs-editor-alt-text-settings-create-model-description = Navrhuje popisy, ktor茅 pom么啪u 木u膹om, ktor媒m sa obr谩zok nezobrazuje alebo ak sa obr谩zok nena膷铆ta.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model AI pre alternat铆vne texty ({ $totalSize }聽MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Be啪铆 lok谩lne na va拧om zariaden铆, tak啪e va拧e d谩ta zostan煤 s煤kromn茅. Vy啪aduje sa pre automatick媒 alternat铆vny text.
+pdfjs-editor-alt-text-settings-delete-model-button = Odstr谩ni钮
+pdfjs-editor-alt-text-settings-download-model-button = Stiahnu钮
+pdfjs-editor-alt-text-settings-downloading-model-button = S钮ahuje sa鈥�
+pdfjs-editor-alt-text-settings-editor-title = Editor alternat铆vneho textu
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Pri prid谩van铆 obr谩zka ihne膹 zobrazi钮 editor alternat铆vneho textu
+pdfjs-editor-alt-text-settings-show-dialog-description = Pom谩ha v谩m zabezpe膷i钮, aby v拧etky va拧e obr谩zky mali alternat铆vny text.
+pdfjs-editor-alt-text-settings-close-button = Zavrie钮
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Zv媒raznenie bolo pridan茅
+pdfjs-editor-freetext-added-alert = Text bol pridan媒
+pdfjs-editor-ink-added-alert = Kresba bola pridan谩
+pdfjs-editor-stamp-added-alert = Obr谩zok bol pridan媒
+pdfjs-editor-signature-added-alert = Podpis bol pridan媒
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Zv媒raznenie bolo odstr谩nen茅
+pdfjs-editor-undo-bar-message-freetext = Text bol odstr谩nen媒
+pdfjs-editor-undo-bar-message-ink = Kreslenie bolo odstr谩nen茅
+pdfjs-editor-undo-bar-message-stamp = Obr谩zok bol odstr谩nen媒
+pdfjs-editor-undo-bar-message-signature = Podpis bol odstr谩nen媒
+pdfjs-editor-undo-bar-message-comment = Koment谩r odstr谩nen媒
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anot谩cia odstr谩nen谩
+        [few] { $count } anot谩cie odstr谩nen茅
+        [many] { $count } anot谩ci铆 odstr谩nen媒ch
+       *[other] { $count } anot谩ci铆 odstr谩nen媒ch
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Sp盲钮
+pdfjs-editor-undo-bar-undo-button-label = Sp盲钮
+pdfjs-editor-undo-bar-close-button =
+    .title = Zavrie钮
+pdfjs-editor-undo-bar-close-button-label = Zavrie钮
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Toto okno umo啪艌uje pou啪铆vate木ovi vytvori钮 podpis, ktor媒 sa prid谩 do dokumentu PDF. Pou啪铆vate木 m么啪e upravi钮 meno (ktor茅 z谩rove艌 sl煤啪i ako alternat铆vny text) a volite木ne ulo啪i钮 podpis, ak ho pl谩nuje v bud煤cnosti znova pou啪i钮.
+pdfjs-editor-add-signature-dialog-title = Prida钮 podpis
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Typ
+    .title = Typ
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Kresli钮
+    .title = Kresli钮
+pdfjs-editor-add-signature-image-button = Obr谩zok
+    .title = Obr谩zok
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Zadajte svoj podpis
+    .placeholder = Zadajte svoj podpis
+pdfjs-editor-add-signature-draw-placeholder = Nakreslite svoj podpis
+pdfjs-editor-add-signature-draw-thickness-range-label = Hr煤bka
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Hr煤bka ceruzky: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Sem presu艌te s煤bor, ktor媒 chcete nahra钮
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Alebo vyberte s煤bor s obr谩zkom
+       *[other] Alebo vyberte s煤bor s obr谩zkom
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Popis (alternat铆vny text)
+pdfjs-editor-add-signature-description-input =
+    .title = Popis (alternat铆vny text)
+pdfjs-editor-add-signature-description-default-when-drawing = Podpis
+pdfjs-editor-add-signature-clear-button-label = Vymaza钮 podpis
+pdfjs-editor-add-signature-clear-button =
+    .title = Vymaza钮 podpis
+pdfjs-editor-add-signature-save-checkbox = Ulo啪i钮 podpis
+pdfjs-editor-add-signature-save-warning-message = Dosiahli ste limit 5 ulo啪en媒ch podpisov. Ak chcete ulo啪i钮 膹al拧铆, jeden odstr谩艌te.
+pdfjs-editor-add-signature-image-upload-error-title = Obr谩zok sa nepodarilo nahra钮
+pdfjs-editor-add-signature-image-upload-error-description = Skontrolujte sie钮ov茅 pripojenie alebo sk煤ste in媒 obr谩zok.
+pdfjs-editor-add-signature-image-no-data-error-title = Tento obr谩zok sa ned谩 previes钮 na podpis
+pdfjs-editor-add-signature-image-no-data-error-description = Sk煤ste nahra钮 in媒 obr谩zok.
+pdfjs-editor-add-signature-error-close-button = Zavrie钮
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Zru拧i钮
+pdfjs-editor-add-signature-add-button = Prida钮
+pdfjs-editor-edit-signature-update-button = Aktualizova钮
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Upravi钮 koment谩r
+pdfjs-editor-edit-comment-popup-button =
+    .title = Upravi钮 koment谩r
+pdfjs-editor-delete-comment-popup-button-label = Odstr谩ni钮 koment谩r
+pdfjs-editor-delete-comment-popup-button =
+    .title = Odstr谩ni钮 koment谩r
+pdfjs-show-comment-button =
+    .title = Zobrazi钮 koment谩r
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Upravi钮 koment谩r
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizova钮
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Prida钮 koment谩r
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Prida钮
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Za膷nite p铆sa钮鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Zru拧i钮
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Prida钮 koment谩r
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Prepn煤钮 bo膷n媒 panel (dokument obsahuje miniat煤ry/preh木ad/pr铆lohy/vrstvy)
+pdfjs-toggle-views-manager-button1-label = Spravova钮 strany
+pdfjs-views-manager-sidebar =
+    .aria-label = Bo膷n媒 panel
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Zmeni钮 ve木kos钮 bo膷n茅ho panela
+pdfjs-views-manager-view-selector-button =
+    .title = Zobrazenia
+pdfjs-views-manager-view-selector-button-label = Zobrazenia
+pdfjs-views-manager-pages-title = Strany
+pdfjs-views-manager-outlines-title1 = Preh木ad dokumentu
+    .title = Preh木ad dokumentu (dvojit媒m kliknut铆m rozbal铆te/zbal铆te v拧etky polo啪ky)
+pdfjs-views-manager-attachments-title = Pr铆lohy
+pdfjs-views-manager-layers-title1 = Vrstvy
+    .title = Vrstvy (dvojit媒m kliknut铆m obnov铆te v拧etky vrstvy do predvolen茅ho stavu)
+pdfjs-views-manager-pages-option-label = Strany
+pdfjs-views-manager-outlines-option-label = Preh木ad dokumentu
+pdfjs-views-manager-attachments-option-label = Pr铆lohy
+pdfjs-views-manager-layers-option-label = Vrstvy
+pdfjs-views-manager-add-file-button =
+    .title = Prida钮 s煤bor
+pdfjs-views-manager-add-file-button-label = Prida钮 s煤bor
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } ozna膷en谩
+        [few] { $count } ozna膷en茅
+        [many] { $count } ozna膷en媒ch
+       *[other] { $count } ozna膷en媒ch
+    }
+pdfjs-views-manager-pages-status-none-action-label = Vybra钮 strany
+pdfjs-views-manager-pages-status-action-button-label = Spravova钮
+pdfjs-views-manager-pages-status-copy-button-label = Kop铆rova钮
+pdfjs-views-manager-pages-status-cut-button-label = Vystrihn煤钮
+pdfjs-views-manager-pages-status-delete-button-label = Odstr谩ni钮
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportova钮 vybran茅鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] Vystrihnut谩 1 strana
+        [few] Vystrihnut茅 { $count } strany
+        [many] Vystrihnut媒ch { $count } str谩n
+       *[other] Vystrihnut媒ch { $count } str谩n
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] Skop铆rovan谩 1 strana
+        [few] Skop铆rovan茅 { $count } strany
+        [many] Skop铆rovan媒ch { $count } str谩n
+       *[other] Skop铆rovan媒ch { $count } str谩n
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] Odstr谩nen谩 1 strana
+        [few] Odstr谩nen茅 { $count } strany
+        [many] Odstr谩nen媒ch { $count } str谩n
+       *[other] Odstr谩nen媒ch { $count } str谩n
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = V谩拧 s煤bor sa pripravuje鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Nahr谩va sa s煤bor鈥�
+pdfjs-views-manager-status-warning-cut-label = Vystrihnutie sa nepodarilo. Obnovte str谩nku a sk煤ste to znova.
+pdfjs-views-manager-status-warning-copy-label = Skop铆rovanie sa nepodarilo. Obnovte str谩nku a sk煤ste to znova.
+pdfjs-views-manager-status-warning-delete-label = Odstr谩nenie sa nepodarilo. Obnovte str谩nku a sk煤ste to znova.
+pdfjs-views-manager-status-warning-save-label = Ulo啪enie sa nepodarilo. Obnovte str谩nku a sk煤ste to znova.
+pdfjs-views-manager-status-undo-button-label = Sp盲钮
+pdfjs-views-manager-status-done-button-label = Hotovo
+pdfjs-views-manager-status-close-button =
+    .title = Zavrie钮
+pdfjs-views-manager-status-close-button-label = Zavrie钮
+pdfjs-views-manager-paste-button-label = Prilepi钮
+pdfjs-views-manager-paste-button-before =
+    .title = Vlo啪i钮 pred prv煤 stranu
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Vlo啪i钮 za stranu { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOV脡
+pdfjs-views-manager-waiting-for-file = Nahr谩va sa s煤bor鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Spravova钮 strany
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Odstr谩ni钮 ulo啪en媒 podpis
+pdfjs-editor-delete-signature-button-label1 = Odstr谩ni钮 ulo啪en媒 podpis
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Upravi钮 popis
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Upravi钮 popis
diff --git a/public/pdfjs/web/locale/skr/viewer.ftl b/public/pdfjs/web/locale/skr/viewer.ftl
new file mode 100644
index 0000000..6136dfc
--- /dev/null
+++ b/public/pdfjs/web/locale/skr/viewer.ftl
@@ -0,0 +1,465 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 倬趩诰賱丕 賵乇賯蹃
+pdfjs-previous-button-label = 倬趩诰賱丕
+pdfjs-next-button =
+    .title = 丕诔賱丕 賵乇賯蹃
+pdfjs-next-button-label = 丕诔賱丕
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 賵乇賯蹃
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 丿丕
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 丿丕 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 夭賵賲 丌丐俟
+pdfjs-zoom-out-button-label = 夭賵賲 丌丐俟
+pdfjs-zoom-in-button =
+    .title = 夭賵賲 丕賽賳
+pdfjs-zoom-in-button-label = 夭賵賲 丕賽賳
+pdfjs-zoom-select =
+    .title = 夭賵賲
+pdfjs-presentation-mode-button =
+    .title = 倬乇蹖夭賳俟蹖卮賳 賲賵趫 鬲蹝 爻賵卅趩 讴乇賵
+pdfjs-presentation-mode-button-label = 倬乇蹖夭賳俟蹖卮賳 賲賵趫
+pdfjs-open-file-button =
+    .title = 賮丕卅賱 讴诰賵賱賵
+pdfjs-open-file-button-label = 讴诰賵賱賵
+pdfjs-print-button =
+    .title = 趩诰丕倬賵
+pdfjs-print-button-label = 趩诰丕倬賵
+pdfjs-save-button =
+    .title = 蹃鬲诰蹖讴趹丕 讴乇賵
+pdfjs-save-button-label = 蹃鬲诰蹖讴趹丕 讴乇賵
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 趫丕丐賳 賱賵趫
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 趫丕丐賳 賱賵趫
+pdfjs-bookmark-button =
+    .title = 賲賵噩賵丿蹃 賵乇賯蹃 (賲賵噩賵丿蹃 賵乇賯蹝 讴賳賵诤 蹖賵丌乇丕蹖賱 輽蹖讴诰賵)
+pdfjs-bookmark-button-label = 賲賵噩賵丿蹃 賵乇賯蹃
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 丕賵夭丕乇
+pdfjs-tools-button-label = 丕賵夭丕乇
+pdfjs-first-page-button =
+    .title = 倬蹃賱蹝 賵乇賯蹝 鬲蹝 賵賳趧賵
+pdfjs-first-page-button-label = 倬蹃賱蹝 賵乇賯蹝 鬲蹝 賵賳趧賵
+pdfjs-last-page-button =
+    .title = 趩诰蹖讴趹蹖 賵乇賯蹝 鬲蹝 賵賳趧賵
+pdfjs-last-page-button-label = 趩诰蹖讴趹蹖 賵乇賯蹝 鬲蹝 賵賳趧賵
+pdfjs-page-rotate-cw-button =
+    .title = 诏诰趹蹖 賵丕賳诏賵诤 诏诰賲丕丐
+pdfjs-page-rotate-cw-button-label = 诏诰趹蹖 賵丕賳诏賵诤 诏诰賲丕丐
+pdfjs-page-rotate-ccw-button =
+    .title = 诏诰趹蹖 鬲蹝 丕購倬俟诰 诏诰賲丕丐
+pdfjs-page-rotate-ccw-button-label = 诏诰趹蹖 鬲蹝 丕購倬俟诰 诏诰賲丕丐
+pdfjs-cursor-text-select-tool-button =
+    .title = 賲鬲賳 賲賳鬲禺亘 讴莰 賵丕賱丕 丌賱蹃 賮毓丕賱 亘莰丕丐
+pdfjs-cursor-text-select-tool-button-label = 賲鬲賳 賲賳鬲禺亘 讴乇莰 賵丕賱丕 丌賱蹃
+pdfjs-cursor-hand-tool-button =
+    .title = 蹃蹖賳趫 俟賵賱 賮毓丕賱 亘莰丕丐
+pdfjs-cursor-hand-tool-button-label = 蹃蹖賳趫 俟賵賱
+pdfjs-scroll-page-button =
+    .title = 倬蹖噩 爻讴乇賵賱賳诏 丕爻鬲毓賲丕賱 讴乇賵
+pdfjs-scroll-page-button-label = 倬蹖噩 爻讴乇賵賱賳诏
+pdfjs-scroll-vertical-button =
+    .title = 毓賲賵丿蹖 爻讴乇賵賱賳诏 丕爻鬲毓賲丕賱 讴乇賵
+pdfjs-scroll-vertical-button-label = 毓賲賵丿蹖 爻讴乇賵賱賳诏
+pdfjs-scroll-horizontal-button =
+    .title = 丕賮賯蹖 爻讴乇賵賱賳诏 丕爻鬲毓賲丕賱 讴乇賵
+pdfjs-scroll-horizontal-button-label = 丕賮賯蹖 爻讴乇賵賱賳诏
+pdfjs-scroll-wrapped-button =
+    .title = 賵蹖趹诰蹖 蹃賵卅蹖 爻讴乇賵賱賳诏 丕爻鬲毓賲丕賱 讴乇賵
+pdfjs-scroll-wrapped-button-label = 賵蹃趹诰蹖 蹃賵卅蹖 爻讴乇賵賱賳诏
+pdfjs-spread-none-button =
+    .title = 倬蹖噩 爻倬乇蹖趫夭 賵賽趩 卮丕賲賱 賳蹃 鬲诰蹖賵賵蹟
+pdfjs-spread-none-button-label = 讴賵卅蹖 倬賵賱诰 讴丕卅賳蹖
+pdfjs-spread-odd-button =
+    .title = 胤丕賯 賳賲亘乇 賵丕賱蹝 賵乇賯蹖丕诤 丿蹝 賳丕賱 卮乇賵毓 鬲诰蹖賵莰 賵丕賱蹝 倬蹖噩 爻倬乇蹖趫夭 賵賽趩 卮丕賲賱 鬲诰蹖賵賵蹟
+pdfjs-spread-odd-button-label = 鬲丕讴 倬诰蹖賱丕丐
+pdfjs-spread-even-button =
+    .title = 噩賮鬲 賳賲乇 賵丕賱蹝 賵乇賯蹖丕诤 賳丕賱 卮乇賵毓 鬲诰蹖賵莰 賵丕賱蹝 倬蹖噩 爻倬乇蹖趫夭 賵賽 卮丕賲賱 鬲诰蹖賵賵蹟
+pdfjs-spread-even-button-label = 噩賮鬲 倬诰蹖賱丕丐
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 丿爻鬲丕賵蹖夭 禺賵丕氐鈥�
+pdfjs-document-properties-button-label = 丿爻鬲丕賵蹖夭 禺賵丕氐 鈥�
+pdfjs-document-properties-file-name = 賮丕卅賱 丿丕 賳丕诤:
+pdfjs-document-properties-file-size = 賮丕卅賱 丿丕 爻丕卅夭:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 亘丕卅俟丕诤)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 亘丕卅俟丕诤)
+pdfjs-document-properties-title = 毓賳賵丕賳:
+pdfjs-document-properties-author = 鬲禺賱蹖賯 讴丕乇:
+pdfjs-document-properties-subject = 賲賵囟賵毓:
+pdfjs-document-properties-keywords = 讴賱蹖丿蹖 丕賱賮丕馗:
+pdfjs-document-properties-creation-date = 鬲禺賱蹖賯 丿蹖 鬲丕乇蹖禺:
+pdfjs-document-properties-modification-date = 鬲乇賲蹖賲 丿蹖 鬲丕乇蹖禺:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 鬲禺賱蹖賯 讴丕乇:
+pdfjs-document-properties-producer = PDF 倬蹖丿丕 讴丕乇:
+pdfjs-document-properties-version = PDF 賵乇跇賳:
+pdfjs-document-properties-page-count = 賵乇賯蹃 卮賲丕乇蹖:
+pdfjs-document-properties-page-size = 賵乇賯蹃 丿蹖 爻丕卅夭:
+pdfjs-document-properties-page-size-unit-inches = 賵賽趩
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 毓賲賵丿蹖 丕賳丿丕夭
+pdfjs-document-properties-page-size-orientation-landscape = 丕賮賯賶 丕賳丿丕夭
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 賱蹖俟乇
+pdfjs-document-properties-page-size-name-legal = 賯賳賵賳蹖
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 鬲讴诰丕 賵蹖亘 賳馗丕乇蹃:
+pdfjs-document-properties-linearized-yes = 噩蹖丕
+pdfjs-document-properties-linearized-no = 讴賵
+pdfjs-document-properties-close-button = 亘賳丿 讴乇賵
+
+## Print
+
+pdfjs-print-progress-message = 趩诰丕倬莰 讴蹖鬲蹝 丿爻鬲丕賵蹖夭 鬲蹖丕乇 鬲诰蹖賳丿蹝 倬卅蹝 蹃賳 鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 賲賳爻賵禺 讴乇賵
+pdfjs-printing-not-supported = 趩鬲丕賵莰蹖: 趩诰倬丕卅蹖 丕蹖诤 亘乇丕丐夭乇 鬲蹝 倬賵乇蹖 胤乇丕诤 賲毓丕賵賳鬲 卮丿蹃 讴丕卅賳蹖蹟
+pdfjs-printing-not-ready = 趩鬲丕賵莰蹖: PDF 趩诰倬丕卅蹖 讴蹖鬲蹝 倬賵乇蹖 胤乇丕诤 賱賵趫 賳卅蹖诤 鬲诰卅蹖蹟
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 爻丕卅蹖趫 亘丕乇 俟賵诏賱 讴乇賵
+pdfjs-toggle-sidebar-notification-button =
+    .title = 爻丕卅蹖趫 亘丕乇 俟賵诏賱 讴乇賵 (丿爻鬲丕賵蹖夭 賵賽趩 丌丐俟 賱丕卅賳/ 賲賳爻賱讴丕鬲/ 倬乇鬲丕诤 卮丕賲賱 蹃賳)
+pdfjs-toggle-sidebar-button-label = 爻丕卅蹖趫 亘丕乇 俟賵诏賱 讴乇賵
+pdfjs-document-outline-button =
+    .title = 丿爻鬲丕賵蹖夭 丿丕 禺丕讴蹃 輽讴诰丕丐 (鬲賲丕賲 丌卅俟賲夭 讴賵诤 倬诰蹖賱丕賵莰/爻賳诏賵趹莰 讴蹖鬲蹝 趫亘賱 讴賱讴 讴乇賵)
+pdfjs-document-outline-button-label = 丿爻鬲丕賵蹖夭 丌丐俟 賱丕卅賳
+pdfjs-attachments-button =
+    .title = 賳鬲诰蹖丕诤 輽讴诰丕丐
+pdfjs-attachments-button-label = 賲賳爻賱讴丕鬲
+pdfjs-layers-button =
+    .title = 倬乇鬲丕诤 輽讴诰丕丐 (鬲賲丕賲 倬乇鬲丕诤 讴賵诤 趫蹖賮丕賱俟 丨丕賱鬲 賵賽趩 丿賵亘丕乇蹃 鬲乇鬲蹖亘 輽蹖賵莰 讴蹖鬲蹝 趫亘賱 讴賱讴 讴乇賵)
+pdfjs-layers-button-label = 倬乇鬲丕诤
+pdfjs-thumbs-button =
+    .title = 鬲诰賲亘賳蹖賱 輽讴诰丕丐
+pdfjs-thumbs-button-label = 鬲诰賲亘賳蹖賱夭
+pdfjs-current-outline-item-button =
+    .title = 賲賵噩賵丿蹃 丌丐俟 賱丕卅賳 丌卅俟賲 賱亘诰賵
+pdfjs-current-outline-item-button-label = 賲賵噩賵丿蹃 丌丐俟 賱丕卅賳 丌卅俟賲
+pdfjs-findbar-button =
+    .title = 丿爻鬲丕賵蹖夭 賵賽趩 賱亘诰賵
+pdfjs-findbar-button-label = 賱亘诰賵
+pdfjs-additional-layers = 丕囟丕賮蹖 倬乇鬲丕诤
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 賵乇賯蹃 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 賵乇賯蹝 丿丕 鬲诰賲亘賳蹖賱 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 賱亘诰賵
+    .placeholder = 丿爻鬲丕賵蹖夭 賵賽趩 賱亘诰賵 鈥�
+pdfjs-find-previous-button =
+    .title = 賮賯乇蹝 丿丕 倬趩诰賱丕 賵丕賯毓蹃 賱亘诰賵
+pdfjs-find-previous-button-label = 倬趩诰賱丕
+pdfjs-find-next-button =
+    .title = 賮賯乇蹝 丿丕 丕诔賱丕 賵丕賯毓蹃 賱亘诰賵
+pdfjs-find-next-button-label = 丕诔賱丕
+pdfjs-find-highlight-checkbox = 鬲賲丕賲 賳卮丕亘乇 讴乇賵
+pdfjs-find-match-case-checkbox-label = 丨乇賵賮 賲卮丕亘蹃 讴乇賵
+pdfjs-find-match-diacritics-checkbox-label = 趫丕卅蹖讴乇俟讴爻 賲卮丕亘蹃 讴乇賵
+pdfjs-find-entire-word-checkbox-label = 鬲賲丕賲 丕賱賮丕馗
+pdfjs-find-reached-top = 賵乇賯蹝 丿蹝 卮乇賵毓 鬲蹝 倬購噩 诔蹖丕貙 鬲賱賵诤 噩丕乇蹖 讴蹖鬲丕 诔蹖丕
+pdfjs-find-reached-bottom = 賵乇賯蹝 丿蹝 倬丕賳丿 鬲蹝 倬購趧 诔蹖丕貙 丕購鬲賵诤 卮乇賵毓 讴蹖鬲丕 诔蹖丕
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $total } 賵賽趩賵诤 { $current } 賲卮丕亘蹃
+       *[other] { $total } 賵賽趩賵诤 { $current } 賲卮丕亘蹝
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] { $limit } 鬲賵诤 賵丿诰 賲賲丕孬賱鬲蹟
+       *[other] { $limit } 鬲賵诤 賵丿诰 賲賲丕孬賱鬲丕诤蹟
+    }
+pdfjs-find-not-found = 賮賯乇蹃 賳卅蹖诤 賲賱蹖丕
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 賵乇賯蹝 丿蹖 趩賵趹丕卅蹖
+pdfjs-page-scale-fit = 賵乇賯蹃 賮俟賳诏
+pdfjs-page-scale-auto = 丌倬賵诤 丌倬 夭賵賲
+pdfjs-page-scale-actual = 丕氐賱 賲蹖趩丕
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 賵乇賯蹃 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 賱賵趫 讴乇蹖賳丿蹝 賵蹖賱诰蹝 賳賯氐 丌 诔蹖丕蹟
+pdfjs-invalid-file-error = 睾賱胤 蹖丕 禺乇丕亘 卮丿蹃 PDF 賮丕卅賱蹟
+pdfjs-missing-file-error = PDF 賮丕卅賱 睾丕卅亘 蹃蹝蹟
+pdfjs-unexpected-response-error = 爻乇賵乇 丿丕 睾蹖乇 賲鬲賵賯毓 噩賵丕亘蹟
+pdfjs-rendering-error = 賵乇賯蹃 乇蹖賳趫乇 讴乇蹖賳丿蹝 賵蹖賱诰蹝 蹃讴 禺乇丕亘蹖 倬蹖卮 丌诔卅蹖蹟
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 鬲卮乇蹖丨]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 丕蹖蹃 PDF 賮丕卅賱 讴诰賵賱莰 讴蹖鬲蹝 倬丕爻 賵乇趫 丿乇噩 讴乇賵蹟
+pdfjs-password-invalid = 睾賱胤 倬丕爻 賵乇趫: 亘乇丕蹃 賲蹃乇亘丕賳蹖 賵賱丿丕 讴賵卮卮 讴乇賵蹟
+pdfjs-password-ok-button = 俟诰蹖讴 蹃蹝
+pdfjs-password-cancel-button = 賲賳爻賵禺 讴乇賵
+pdfjs-web-fonts-disabled = 賵蹖亘 賮賵賳俟爻 睾蹖乇 賮毓丕賱 蹃賳: 丕蹖賲亘蹖趫趫 PDF  賮賵賳俟爻 丕爻鬲毓賲丕賱 讴乇莰 讴賳賵诤 賯丕氐乇 蹃賳
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 賲鬲賳
+pdfjs-editor-free-text-button-label = 賲鬲賳
+pdfjs-editor-ink-button =
+    .title = 趩诰讴賵
+pdfjs-editor-ink-button-label = 趩诰讴賵
+pdfjs-editor-stamp-button =
+    .title = 鬲氐賵蹖乇丕诤 讴賵诤 卮丕賲賱 讴乇賵 蹖丕 鬲乇賲蹖賲 讴乇賵
+pdfjs-editor-stamp-button-label = 鬲氐賵蹖乇丕诤 讴賵诤 卮丕賲賱 讴乇賵 蹖丕 鬲乇賲蹖賲 讴乇賵
+pdfjs-editor-highlight-button =
+    .title = 賳賲丕蹖丕诤 讴乇賵
+pdfjs-editor-highlight-button-label = 賳賲丕蹖丕诤 讴乇賵
+pdfjs-highlight-floating-button1 =
+    .title = 賳賲丕蹖丕诤 讴乇賵
+    .aria-label = 賳賲丕蹖丕诤 讴乇賵
+pdfjs-highlight-floating-button-label = 賳賲丕蹖丕诤 讴乇賵
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 趫乇丕卅蹖賳诏 蹃俟丕丐
+pdfjs-editor-remove-freetext-button =
+    .title = 賲鬲賳 蹃俟丕丐
+pdfjs-editor-remove-stamp-button =
+    .title = 鬲氐賵蹖乇 蹃俟丕丐
+pdfjs-editor-remove-highlight-button =
+    .title = 賳賲丕蹖丕诤 蹃俟丕丐
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 乇賳诏
+pdfjs-editor-free-text-size-input = 爻丕卅夭
+pdfjs-editor-ink-color-input = 乇賳诏
+pdfjs-editor-ink-thickness-input = 俟诰賵賱诰
+pdfjs-editor-ink-opacity-input = 丿诰賳丿賱丕倬賳
+pdfjs-editor-stamp-add-image-button =
+    .title = 鬲氐賵蹖乇 卮丕賲賱 讴乇賵
+pdfjs-editor-stamp-add-image-button-label = 鬲氐賵蹖乇 卮丕賲賱 讴乇賵
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 賲購俟丕莰
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 賲鬲賳 鬲賵诤 丕賳贅噩 倩卅蹝 卮卅蹖诤 讴賵诤 賳賲丕蹖丕诤 讴乇莰 賵蹖賱蹝 賲購俟丕莰 讴賵诤 亘丿賱賵
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alt 賲鬲賳
+pdfjs-editor-alt-text-dialog-label = 蹃賽讴 丕禺鬲蹖丕乇 趩購莰賵
+pdfjs-editor-alt-text-dialog-description = Alt 賲鬲賳 (賲鬲亘丕丿賱 賲鬲賳) 丕賽蹖诤 賵蹖賱蹝 賲賻丿賻鬲 讴乇蹖賳贅丿丕 蹃賽蹝 噩蹃趹蹖賱蹝 賱賵讴 鬲氐賵蹖乇 讴賵诤 賳賽诰蹖诤 輽蹖讴诰 爻诔丿蹝 蹖丕 噩蹃趹蹖賱蹝 丕賽蹖蹃 賱賵趫 讴丕卅賳蹖 鬲賽诰蹖賳贅丿丕蹟
+pdfjs-editor-alt-text-add-description-label = 鬲賮氐蹖賱 卮丕賲賱 讴乇賵
+pdfjs-editor-alt-text-add-description-description = 1-2 噩賲賱蹖丕诤 丿丕 賲賯氐丿 噩蹃趹蹝 賲賵囟賵毓貙 鬲乇鬲蹖亘貙 蹖丕 丕毓賲丕賱 讴賵诤 亘蹖丕賳 讴乇蹖賳贅丿蹝 蹃賽賳蹟
+pdfjs-editor-alt-text-mark-decorative-label = 丌乇丕卅卮蹖 胤賵乇 鬲蹝 賳卮丕賳 夭丿 讴乇賵
+pdfjs-editor-alt-text-mark-decorative-description = 丕賽蹖蹃 丌乇丕卅卮蹖 鬲氐賵蹖乇丕诤 讴賽蹖鬲蹝 丕爻鬲毓賲丕賱 鬲賽诰蹖賳贅丿丕 蹃賽蹝貙 噩蹖賵蹖诤 亘丕乇趫乇 蹖丕 賵丕俟乇 賲丕乇讴爻蹟
+pdfjs-editor-alt-text-cancel-button = 賲賳爻賵禺
+pdfjs-editor-alt-text-save-button = 賲丨賮賵馗
+pdfjs-editor-alt-text-decorative-tooltip = 丌乇丕卅卮蹖 丿蹝 胤賵乇 鬲蹝 賳卮丕賳 夭丿 鬲賽诰蹖 诔賽蹖丕
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 賲孬丕賱 丿蹝 胤賵乇 鬲蹝貙 "蹃賽讴 噩丐丕賳 讴诰丕莰丕诤 讴诰丕賵莰 讴賽蹖鬲蹝 賲蹖夭 丕購鬲賾蹝 倩蹖俟诰丕 蹃賽蹝"
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alt 賲鬲賳
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 丕購鬲賱蹖 讴賻诰倩賾蹖 賳購讴賾趹 鈥� 爻丕卅夭 亘丿賱賵
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 丕購鬲賱丕 賵賽趩賱丕 鈥� 爻丕卅夭 亘丿賱賵
+pdfjs-editor-resizer-top-right =
+    .aria-label = 丕購鬲賱蹖 爻賻趧賾蹖 賳購讴賾賻趹 鈥� 爻丕卅夭 亘丿賱賵
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 賵賽趩賱丕 爻趧賾丕 鈥� 爻丕卅夭 亘丿賱賵
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 鬲賱賵賽蹖诤 爻賻趧賾蹖 賳購讴賾賻趹 鈥� 爻丕卅夭 亘丿賱賵
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 鬲賱賵丕诤 賵賽趩賱丕 鈥� 爻丕卅夭 亘丿賱賵
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 鬲賱賵賽蹖诤 讴賻诰倩賾蹖 賳購讴賾趹 鈥� 爻丕卅夭 亘丿賱賵
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 賵賽趩賱丕 讴賻诰倩賾丕 鈥� 爻丕卅夭 亘丿賱賵
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 賳卮丕亘乇 乇賳诏
+pdfjs-editor-colorpicker-button =
+    .title = 乇賳诏 亘丿賱賵
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 乇賳诏 丕禺鬲蹖丕乇丕鬲
+pdfjs-editor-colorpicker-yellow =
+    .title = 倬蹖賱丕
+pdfjs-editor-colorpicker-green =
+    .title = 爻丕賵丕
+pdfjs-editor-colorpicker-blue =
+    .title = 賳蹖賱丕
+pdfjs-editor-colorpicker-pink =
+    .title = 诏賱丕亘蹖
+pdfjs-editor-colorpicker-red =
+    .title = 賱丕賱
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 爻丕乇蹝 輽讴诰丕丐
+pdfjs-editor-highlight-show-all-button =
+    .title = 爻丕乇蹝 輽讴诰丕丐
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 丕贀賱俟 毓亘丕乇鬲 賵趩 鬲亘丿蹖賱蹖 讴乇賵 (鬲氐賵蹖乇 鬲賮氐蹖賱)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 丕贀賱俟 毓亘丕乇鬲 卮丕賲賱 讴乇賵 (鬲氐賵蹖乇 鬲賮氐蹖賱)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 丕鬲诰 丕贀倬莰蹖 賵囟丕丨鬲 賱讴诰賵蹟蹟蹟
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 丕購賳蹃丕诤 賱賵讴丕诤 讴蹖鬲蹝 賲禺鬲氐乇 鬲賮氐蹖賱 噩蹃趹蹝 鬲氐賵蹖乇 讴丕卅賳蹖 輽蹖讴诰 爻诔丿蹝 蹖丕 趧輽莰 鬲氐賵蹖乇 賱賵趫 讴丕卅亘蹖 鬲诰蹖賳丿蹖蹟
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 丌賱俟 毓亘丕乇鬲 禺賵丿讴丕乇 鬲禺賱蹖賯 鬲诰卅蹖 蹃蹝 鬲蹝 睾賱胤 鬲诰蹖 爻诔丿蹖 蹃蹝蹟
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 倩蹖丕 爻賽讴诰賵
+pdfjs-editor-new-alt-text-create-automatically-button-label = 丌賱俟 毓亘丕乇鬲 禺賵丿讴丕乇 亘莰丕丐
+pdfjs-editor-new-alt-text-not-now-button = 蹃莰 讴丕卅賳丕诤
+pdfjs-editor-new-alt-text-error-title = 丌賱俟 毓亘丕乇鬲 禺賵丿讴丕乇 賳蹃 亘莰丕丐
+pdfjs-editor-new-alt-text-error-description = 爻賵蹃莰丕貙 丌倬莰蹖 丌賱俟 毓亘丕乇鬲 賱讴诰賵 蹖丕 賵賱丿丕 亘毓丿 賵趩 讴賵卮卮 讴乇賵蹟
+pdfjs-editor-new-alt-text-error-close-button = 亘賳丿 讴乇賵
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 丌賱俟 毓亘丕乇鬲 丕蹝 丌卅蹖 賲丕趫賱({ $totalSize }丕蹖賲 亘蹖 丿蹝 { $downloadedSize }) 趫丕丐賳 賱賵趫 鬲诰蹖賳丿丕 倬卅蹝
+    .aria-valuetext = 丌賱俟 毓亘丕乇鬲 丕蹝 丌卅蹖 賲丕趫賱({ $totalSize }丕蹖賲 亘蹖 丿蹝 { $downloadedSize }) 趫丕丐賳 賱賵趫 鬲诰蹖賳丿丕 倬卅蹝
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 丕贀賱俟 毓亘丕乇鬲 卮丕賲賱 鬲诰蹖 诔卅蹖
+pdfjs-editor-new-alt-text-added-button-label = 丕贀賱俟 毓亘丕乇鬲 卮丕賲賱 鬲诰蹖 诔卅蹖
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 賲鬲亘丕丿賱 毓亘丕乇鬲 睾丕卅亘 蹃蹝
+pdfjs-editor-new-alt-text-missing-button-label = 賲鬲亘丕丿賱 毓亘丕乇鬲 睾丕卅亘 蹃蹝
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = alt 賲鬲賳 鬲蹝 賳馗乇孬丕賳蹖 讴乇賵
+pdfjs-editor-new-alt-text-to-review-button-label = alt 賲鬲賳 鬲蹝 賳馗乇孬丕賳蹖 讴乇賵
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 禺賵丿讴丕乇 鬲禺賱蹖賯 鬲诰卅蹖: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 鬲氐賵蹖乇 丌賱俟 毓亘丕乇鬲 鬲乇鬲蹖亘丕诤
+pdfjs-image-alt-text-settings-button-label = 鬲氐賵蹖乇 丌賱俟 毓亘丕乇鬲 鬲乇鬲蹖亘丕诤
+pdfjs-editor-alt-text-settings-dialog-label = 鬲氐賵蹖乇 丌賱俟 毓亘丕乇鬲 鬲乇鬲蹖亘丕诤
+pdfjs-editor-alt-text-settings-automatic-title = 禺賵丿讴丕乇 丌賱俟 毓亘丕乇鬲
+pdfjs-editor-alt-text-settings-create-model-button-label = 丌賱俟 毓亘丕乇鬲 禺賵丿讴丕乇 亘莰丕丐
+pdfjs-editor-alt-text-settings-create-model-description = 丕購賳蹃丕诤 賱賵讴丕诤 丿蹖 賲丿丿 讴蹖鬲蹝  鬲賮氐蹖賱 鬲噩賵蹖夭 讴乇賵 噩蹃趹蹝 鬲氐賵蹖乇 讴丕卅賳蹖 輽蹖讴诰 爻诔丿蹝 蹖丕 趧輽莰 鬲氐賵蹖乇 賱賵趫 讴丕卅亘蹖 鬲诰蹖賳丿蹖蹟
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 丌賱俟 毓亘丕乇鬲 丕蹝 丌卅蹖 賲丕趫賱 ({ $totalSize } 丕蹖賲 亘蹖)
+pdfjs-editor-alt-text-settings-ai-model-description = 鬲蹃丕輽蹖 趫蹖賵丕卅爻 鬲蹝 賲賯丕賲蹖 胤賵乇 鬲蹝 趩賱丿丕 蹃蹝 鬲丕诤 噩賵 鬲蹃丕輽丕 趫蹖俟丕 賳噩蹖 乇蹃賵蹝蹟 禺賵丿讴丕乇 丌賱俟 毓亘丕乇鬲 讴蹖鬲蹝 囟乇賵乇蹖 蹃蹝蹟
+pdfjs-editor-alt-text-settings-delete-model-button = 賲俟丕丐
+pdfjs-editor-alt-text-settings-download-model-button = 趫丕丐賳 賱賵趫
+pdfjs-editor-alt-text-settings-downloading-model-button = 趫丕丐賳 賱賵趫 鬲诰蹖賳丿丕 倬卅蹝 鈥�
+pdfjs-editor-alt-text-settings-editor-title = 賲鬲亘丕丿賱 俟蹖讴爻俟 丕蹖趫蹖俟乇
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 鬲氐賵蹖乇 卮丕賲賱 讴乇莰 賵蹖賱蹝 賮賵乇蹖 胤賵乇 鬲蹝 丌賱俟 俟蹖讴爻俟 丕蹖趫蹖俟乇 輽讴诰丕丐
+pdfjs-editor-alt-text-settings-show-dialog-description = 丕蹖蹃 鬲蹃丕讴賵诤 蹖賯蹖賳蹖 亘莰丕賵莰 賵趩 賲丿丿 讴乇蹖賳丿蹝 噩賵 鬲蹃丕輽蹖丕诤 爻丕乇蹖丕诤 鬲氐賵蹖乇丕诤 賵趩 丌賱俟 毓亘丕乇鬲 蹃蹝蹟
+pdfjs-editor-alt-text-settings-close-button = 亘賳丿 讴乇賵
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-undo-button =
+    .title = 讴蹖鬲丕 丕莰 讴蹖鬲丕
+pdfjs-editor-undo-bar-undo-button-label = 讴蹖鬲丕 丕莰 讴蹖鬲丕
+pdfjs-editor-undo-bar-close-button =
+    .title = 亘賳丿 讴乇賵
+pdfjs-editor-undo-bar-close-button-label = 亘賳丿 讴乇賵
diff --git a/public/pdfjs/web/locale/sl/viewer.ftl b/public/pdfjs/web/locale/sl/viewer.ftl
new file mode 100644
index 0000000..aed8bda
--- /dev/null
+++ b/public/pdfjs/web/locale/sl/viewer.ftl
@@ -0,0 +1,763 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Prej拧nja stran
+pdfjs-previous-button-label = Nazaj
+pdfjs-next-button =
+    .title = Naslednja stran
+pdfjs-next-button-label = Naprej
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Stran
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = od { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } od { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Pomanj拧aj
+pdfjs-zoom-out-button-label = Pomanj拧aj
+pdfjs-zoom-in-button =
+    .title = Pove膷aj
+pdfjs-zoom-in-button-label = Pove膷aj
+pdfjs-zoom-select =
+    .title = Pove膷ava
+pdfjs-presentation-mode-button =
+    .title = Preklopi v na膷in predstavitve
+pdfjs-presentation-mode-button-label = Na膷in predstavitve
+pdfjs-open-file-button =
+    .title = Odpri datoteko
+pdfjs-open-file-button-label = Odpri
+pdfjs-print-button =
+    .title = Natisni
+pdfjs-print-button-label = Natisni
+pdfjs-save-button =
+    .title = Shrani
+pdfjs-save-button-label = Shrani
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Prenesi
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Prenesi
+pdfjs-bookmark-button =
+    .title = Trenutna stran (prika啪i URL, ki vodi do trenutne strani)
+pdfjs-bookmark-button-label = Na trenutno stran
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Orodja
+pdfjs-tools-button-label = Orodja
+pdfjs-first-page-button =
+    .title = Pojdi na prvo stran
+pdfjs-first-page-button-label = Pojdi na prvo stran
+pdfjs-last-page-button =
+    .title = Pojdi na zadnjo stran
+pdfjs-last-page-button-label = Pojdi na zadnjo stran
+pdfjs-page-rotate-cw-button =
+    .title = Zavrti v smeri urnega kazalca
+pdfjs-page-rotate-cw-button-label = Zavrti v smeri urnega kazalca
+pdfjs-page-rotate-ccw-button =
+    .title = Zavrti v nasprotni smeri urnega kazalca
+pdfjs-page-rotate-ccw-button-label = Zavrti v nasprotni smeri urnega kazalca
+pdfjs-cursor-text-select-tool-button =
+    .title = Omogo膷i orodje za izbor besedila
+pdfjs-cursor-text-select-tool-button-label = Orodje za izbor besedila
+pdfjs-cursor-hand-tool-button =
+    .title = Omogo膷i roko
+pdfjs-cursor-hand-tool-button-label = Roka
+pdfjs-scroll-page-button =
+    .title = Uporabi drsenje po strani
+pdfjs-scroll-page-button-label = Drsenje po strani
+pdfjs-scroll-vertical-button =
+    .title = Uporabi navpi膷no drsenje
+pdfjs-scroll-vertical-button-label = Navpi膷no drsenje
+pdfjs-scroll-horizontal-button =
+    .title = Uporabi vodoravno drsenje
+pdfjs-scroll-horizontal-button-label = Vodoravno drsenje
+pdfjs-scroll-wrapped-button =
+    .title = Uporabi ovito drsenje
+pdfjs-scroll-wrapped-button-label = Ovito drsenje
+pdfjs-spread-none-button =
+    .title = Ne zdru啪uj razponov strani
+pdfjs-spread-none-button-label = Brez razponov
+pdfjs-spread-odd-button =
+    .title = Zdru啪uj razpone strani z za膷etkom pri lihih straneh
+pdfjs-spread-odd-button-label = Lihi razponi
+pdfjs-spread-even-button =
+    .title = Zdru啪uj razpone strani z za膷etkom pri sodih straneh
+pdfjs-spread-even-button-label = Sodi razponi
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Lastnosti dokumenta 鈥�
+pdfjs-document-properties-button-label = Lastnosti dokumenta 鈥�
+pdfjs-document-properties-file-name = Ime datoteke:
+pdfjs-document-properties-file-size = Velikost datoteke:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtov)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtov)
+pdfjs-document-properties-title = Ime:
+pdfjs-document-properties-author = Avtor:
+pdfjs-document-properties-subject = Tema:
+pdfjs-document-properties-keywords = Klju膷ne besede:
+pdfjs-document-properties-creation-date = Datum nastanka:
+pdfjs-document-properties-modification-date = Datum spremembe:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Ustvaril:
+pdfjs-document-properties-producer = Izdelovalec PDF:
+pdfjs-document-properties-version = Razli膷ica PDF:
+pdfjs-document-properties-page-count = 艩tevilo strani:
+pdfjs-document-properties-page-size = Velikost strani:
+pdfjs-document-properties-page-size-unit-inches = palcev
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = pokon膷no
+pdfjs-document-properties-page-size-orientation-landscape = le啪e膷e
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Pismo
+pdfjs-document-properties-page-size-name-legal = Pravno
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Hitri spletni ogled:
+pdfjs-document-properties-linearized-yes = Da
+pdfjs-document-properties-linearized-no = Ne
+pdfjs-document-properties-close-button = Zapri
+
+## Print
+
+pdfjs-print-progress-message = Priprava dokumenta na tiskanje 鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress } %
+pdfjs-print-progress-close-button = Prekli膷i
+pdfjs-printing-not-supported = Opozorilo: ta brskalnik ne podpira vseh mo啪nosti tiskanja.
+pdfjs-printing-not-ready = Opozorilo: PDF ni v celoti nalo啪en za tiskanje.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Preklopi stransko vrstico
+pdfjs-toggle-sidebar-notification-button =
+    .title = Preklopi stransko vrstico (dokument vsebuje oris/priponke/plasti)
+pdfjs-toggle-sidebar-button-label = Preklopi stransko vrstico
+pdfjs-document-outline-button =
+    .title = Prika啪i oris dokumenta (dvokliknite za raz拧iritev/strnitev vseh predmetov)
+pdfjs-document-outline-button-label = Oris dokumenta
+pdfjs-attachments-button =
+    .title = Prika啪i priponke
+pdfjs-attachments-button-label = Priponke
+pdfjs-layers-button =
+    .title = Prika啪i plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje)
+pdfjs-layers-button-label = Plasti
+pdfjs-thumbs-button =
+    .title = Prika啪i sli膷ice
+pdfjs-thumbs-button-label = Sli膷ice
+pdfjs-current-outline-item-button =
+    .title = Najdi trenutni predmet orisa
+pdfjs-current-outline-item-button-label = Trenutni predmet orisa
+pdfjs-findbar-button =
+    .title = Iskanje po dokumentu
+pdfjs-findbar-button-label = Najdi
+pdfjs-additional-layers = Dodatne plasti
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Stran { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Sli膷ica strani { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Izberi stran { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Stran { $page } od { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Najdi
+    .placeholder = Najdi v dokumentu 鈥�
+pdfjs-find-previous-button =
+    .title = Najdi prej拧njo ponovitev iskanega
+pdfjs-find-previous-button-label = Najdi nazaj
+pdfjs-find-next-button =
+    .title = Najdi naslednjo ponovitev iskanega
+pdfjs-find-next-button-label = Najdi naprej
+pdfjs-find-highlight-checkbox = Ozna膷i vse
+pdfjs-find-match-case-checkbox-label = Razlikuj velike/male 膷rke
+pdfjs-find-match-diacritics-checkbox-label = Razlikuj diakriti膷ne znake
+pdfjs-find-entire-word-checkbox-label = Cele besede
+pdfjs-find-reached-top = Dose啪en za膷etek dokumenta iz smeri konca
+pdfjs-find-reached-bottom = Dose啪en konec dokumenta, nadaljevanje od za膷etka
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] Zadetek { $current } od { $total }
+        [two] Zadetek { $current } od { $total }
+        [few] Zadetek { $current } od { $total }
+       *[other] Zadetek { $current } od { $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Ve膷 kot { $limit } zadetek
+        [two] Ve膷 kot { $limit } zadetka
+        [few] Ve膷 kot { $limit } zadetki
+       *[other] Ve膷 kot { $limit } zadetkov
+    }
+pdfjs-find-not-found = Iskanega ni mogo膷e najti
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 艩irina strani
+pdfjs-page-scale-fit = Prilagodi stran
+pdfjs-page-scale-auto = Samodejno
+pdfjs-page-scale-actual = Dejanska velikost
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale } %
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Stran { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Med nalaganjem datoteke PDF je pri拧lo do napake.
+pdfjs-invalid-file-error = Neveljavna ali pokvarjena datoteka PDF.
+pdfjs-missing-file-error = Ni datoteke PDF.
+pdfjs-unexpected-response-error = Nepri膷akovan odgovor stre啪nika.
+pdfjs-rendering-error = Med pripravljanjem strani je pri拧lo do napake!
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Opomba vrste { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Vnesite geslo za odpiranje te datoteke PDF.
+pdfjs-password-invalid = Neveljavno geslo. Poskusite znova.
+pdfjs-password-ok-button = V redu
+pdfjs-password-cancel-button = Prekli膷i
+pdfjs-web-fonts-disabled = Spletne pisave so onemogo膷ene: vgradnih pisav za PDF ni mogo膷e uporabiti.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Besedilo
+pdfjs-editor-color-picker-free-text-input =
+    .title = Spremeni barvo besedila
+pdfjs-editor-free-text-button-label = Besedilo
+pdfjs-editor-ink-button =
+    .title = Ri拧i
+pdfjs-editor-color-picker-ink-input =
+    .title = Spremeni barvo risbe
+pdfjs-editor-ink-button-label = Ri拧i
+pdfjs-editor-stamp-button =
+    .title = Dodajanje ali urejanje slik
+pdfjs-editor-stamp-button-label = Dodajanje ali urejanje slik
+pdfjs-editor-highlight-button =
+    .title = Ozna膷evalnik
+pdfjs-editor-highlight-button-label = Ozna膷evalnik
+pdfjs-highlight-floating-button1 =
+    .title = Ozna膷i
+    .aria-label = Ozna膷i
+pdfjs-highlight-floating-button-label = Ozna膷i
+pdfjs-comment-floating-button =
+    .title = Komentiraj
+    .aria-label = Komentiraj
+pdfjs-comment-floating-button-label = Komentiraj
+pdfjs-editor-comment-button =
+    .title = Komentiraj
+    .aria-label = Komentiraj
+pdfjs-editor-comment-button-label = Komentiraj
+pdfjs-editor-signature-button =
+    .title = Dodaj podpis
+pdfjs-editor-signature-button-label = Dodaj podpis
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Urejevalnik ozna膷b
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Urejevalnik risb
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Urejevalnik podpisov: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Urejevalnik slik
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Odstrani risbo
+pdfjs-editor-remove-freetext-button =
+    .title = Odstrani besedilo
+pdfjs-editor-remove-stamp-button =
+    .title = Odstrani sliko
+pdfjs-editor-remove-highlight-button =
+    .title = Odstrani ozna膷bo
+pdfjs-editor-remove-signature-button =
+    .title = Odstrani podpis
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Barva
+pdfjs-editor-free-text-size-input = Velikost
+pdfjs-editor-ink-color-input = Barva
+pdfjs-editor-ink-thickness-input = Debelina
+pdfjs-editor-ink-opacity-input = Neprosojnost
+pdfjs-editor-stamp-add-image-button =
+    .title = Dodaj sliko
+pdfjs-editor-stamp-add-image-button-label = Dodaj sliko
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Debelina
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Spremeni debelino pri ozna膷evanju nebesedilnih elementov
+pdfjs-editor-add-signature-container =
+    .aria-label = Kontrolniki za podpise in shranjeni podpisi
+pdfjs-editor-signature-add-signature-button =
+    .title = Dodaj nov podpis
+pdfjs-editor-signature-add-signature-button-label = Dodaj nov podpis
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Shranjen podpis: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Urejevalnik besedila
+    .default-content = Za膷nite tipkati 鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Komentar
+        [two] Komentarja
+        [few] Komentarji
+       *[other] Komentarji
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Zapri stransko vrstico
+    .aria-label = Zapri stransko vrstico
+pdfjs-editor-comments-sidebar-close-button-label = Zapri stransko vrstico
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Ste zasledili kaj omembe vrednega? Nari拧ite oznako in dopi拧ite komentar.
+pdfjs-editor-comments-sidebar-no-comments-link = Ve膷 o tem
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Nadomestno besedilo
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Uredi nadomestno besedilo
+pdfjs-editor-alt-text-dialog-label = Izberite mo啪nost
+pdfjs-editor-alt-text-dialog-description = Nadomestno besedilo se prika啪e tistim, ki ne vidijo slike, ali 膷e se ta ne nalo啪i.
+pdfjs-editor-alt-text-add-description-label = Dodaj opis
+pdfjs-editor-alt-text-add-description-description = Posku拧ajte v enem ali dveh stavkih opisati motiv, okolje ali dejanja.
+pdfjs-editor-alt-text-mark-decorative-label = Ozna膷i kot okrasno
+pdfjs-editor-alt-text-mark-decorative-description = Uporablja se za slike, ki slu啪ijo samo okrasu, na primer obrobe ali vodne 啪ige.
+pdfjs-editor-alt-text-cancel-button = Prekli膷i
+pdfjs-editor-alt-text-save-button = Shrani
+pdfjs-editor-alt-text-decorative-tooltip = Ozna膷eno kot okrasno
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Na primer: "Mladeni膷 sedi za mizo pri jedi"
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Nadomestno besedilo
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Zgornji levi kot 鈥� spremeni velikost
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Zgoraj na sredini 鈥� spremeni velikost
+pdfjs-editor-resizer-top-right =
+    .aria-label = Zgornji desni kot 鈥� spremeni velikost
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Desno na sredini 鈥� spremeni velikost
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Spodnji desni kot 鈥� spremeni velikost
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Spodaj na sredini 鈥� spremeni velikost
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Spodnji levi kot 鈥� spremeni velikost
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Levo na sredini 鈥� spremeni velikost
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Barva ozna膷be
+pdfjs-editor-colorpicker-button =
+    .title = Spremeni barvo
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Izbira barve
+pdfjs-editor-colorpicker-yellow =
+    .title = Rumena
+pdfjs-editor-colorpicker-green =
+    .title = Zelena
+pdfjs-editor-colorpicker-blue =
+    .title = Modra
+pdfjs-editor-colorpicker-pink =
+    .title = Roza
+pdfjs-editor-colorpicker-red =
+    .title = Rde膷a
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Prika啪i vse
+pdfjs-editor-highlight-show-all-button =
+    .title = Prika啪i vse
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Uredi nadomestno besedilo (opis slike)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Dodaj nadomestno besedilo (opis slike)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Tukaj napi拧ite svoj opis 鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kratek opis za ljudi, ki ne morejo videti slike, ali za primer, ko se slika ne nalo啪i.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = To nadomestno besedilo je bilo ustvarjeno samodejno in je lahko neto膷no.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ve膷 o tem
+pdfjs-editor-new-alt-text-create-automatically-button-label = Samodejno ustvari nadomestno besedilo
+pdfjs-editor-new-alt-text-not-now-button = Ne zdaj
+pdfjs-editor-new-alt-text-error-title = Nadomestnega besedila ni bilo mogo膷e samodejno ustvariti
+pdfjs-editor-new-alt-text-error-description = Sestavite svoje nadomestno besedilo ali poskusite znova pozneje.
+pdfjs-editor-new-alt-text-error-close-button = Zapri
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Prena拧anje modela UI za nadomestno besedilo ({ $downloadedSize } od { $totalSize } MB)
+    .aria-valuetext = Prena拧anje modela UI za nadomestno besedilo ({ $downloadedSize } od { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Nadomestno besedilo dodano
+pdfjs-editor-new-alt-text-added-button-label = Nadomestno besedilo dodano
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Nadomestno besedilo manjka
+pdfjs-editor-new-alt-text-missing-button-label = Nadomestno besedilo manjka
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Oceni nadomestno besedilo
+pdfjs-editor-new-alt-text-to-review-button-label = Oceni nadomestno besedilo
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Samodejno ustvarjeno: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Nastavitve nadomestnega besedila slike
+pdfjs-image-alt-text-settings-button-label = Nastavitve nadomestnega besedila slike
+pdfjs-editor-alt-text-settings-dialog-label = Nastavitve nadomestnega besedila slike
+pdfjs-editor-alt-text-settings-automatic-title = Samodejno nadomestno besedilo
+pdfjs-editor-alt-text-settings-create-model-button-label = Samodejno ustvari nadomestno besedilo
+pdfjs-editor-alt-text-settings-create-model-description = Predlaga opise za pomo膷 ljudem, ki ne morejo videti slike, ali za primer, ko se slika ne nalo啪i.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model UI za nadomestno besedilo ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Izvaja se lokalno na va拧i napravi, tako da va拧i podatki ostajajo zasebni. Zahtevano za samodejno nadomestno besedilo.
+pdfjs-editor-alt-text-settings-delete-model-button = Izbri拧i
+pdfjs-editor-alt-text-settings-download-model-button = Prenesi
+pdfjs-editor-alt-text-settings-downloading-model-button = Prena拧anje ...
+pdfjs-editor-alt-text-settings-editor-title = Urejevalnik nadomestnega besedila
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Ob dodajanju slike takoj prika啪i urejevalnik nadomestnega besedila
+pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga vam zagotoviti, da imajo vse va拧e slike nadomestno besedilo.
+pdfjs-editor-alt-text-settings-close-button = Zapri
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Ozna膷ba dodana
+pdfjs-editor-freetext-added-alert = Besedilo dodano
+pdfjs-editor-ink-added-alert = Risba dodana
+pdfjs-editor-stamp-added-alert = Slika dodana
+pdfjs-editor-signature-added-alert = Podpis dodan
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Ozna膷ba odstranjena
+pdfjs-editor-undo-bar-message-freetext = Besedilo odstranjeno
+pdfjs-editor-undo-bar-message-ink = Risba odstranjena
+pdfjs-editor-undo-bar-message-stamp = Slika odstranjena
+pdfjs-editor-undo-bar-message-signature = Podpis odstranjen
+pdfjs-editor-undo-bar-message-comment = Komentar odstranjen
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } ozna膷ba odstranjena
+        [two] { $count } ozna膷bi odstranjeni
+        [few] { $count } ozna膷be odstranjene
+       *[other] { $count } ozna膷b odstranjenih
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Razveljavi
+pdfjs-editor-undo-bar-undo-button-label = Razveljavi
+pdfjs-editor-undo-bar-close-button =
+    .title = Zapri
+pdfjs-editor-undo-bar-close-button-label = Zapri
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Ta na膷in omogo膷a uporabniku ustvariti podpis, ki ga 啪eli dodati dokumentu PDF. Uporabnik lahko uredi ime (ki se uporablja tudi kot nadomestno besedilo) in podpis po 啪elji shrani za ponovno uporabo.
+pdfjs-editor-add-signature-dialog-title = Dodaj podpis
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Natipkaj
+    .title = Natipkaj
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Nari拧i
+    .title = Nari拧i
+pdfjs-editor-add-signature-image-button = Slika
+    .title = Slika
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Natipkajte svoj podpis
+    .placeholder = Natipkajte svoj podpis
+pdfjs-editor-add-signature-draw-placeholder = Nari拧ite svoj podpis
+pdfjs-editor-add-signature-draw-thickness-range-label = Debelina
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Debelina peresa: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Povlecite datoteko sem za nalaganje
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ali prebrskajte slikovne datoteke
+       *[other] Ali prebrskajte slikovne datoteke
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Opis (nadomestno besedilo)
+pdfjs-editor-add-signature-description-input =
+    .title = Opis (nadomestno besedilo)
+pdfjs-editor-add-signature-description-default-when-drawing = Podpis
+pdfjs-editor-add-signature-clear-button-label = Pobri拧i podpis
+pdfjs-editor-add-signature-clear-button =
+    .title = Pobri拧i podpis
+pdfjs-editor-add-signature-save-checkbox = Shrani podpis
+pdfjs-editor-add-signature-save-warning-message = Dosegli ste omejitev 5 shranjenih podpisov. 膶e 啪elite shraniti novega, enega odstranite.
+pdfjs-editor-add-signature-image-upload-error-title = Slike ni bilo mogo膷e nalo啪iti
+pdfjs-editor-add-signature-image-upload-error-description = Preverite svojo povezavo z omre啪jem ali poskusite z drugo sliko.
+pdfjs-editor-add-signature-image-no-data-error-title = Te slike ni mogo膷e pretvoriti v podpis
+pdfjs-editor-add-signature-image-no-data-error-description = Poskusite nalo啪iti drugo sliko.
+pdfjs-editor-add-signature-error-close-button = Zapri
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Prekli膷i
+pdfjs-editor-add-signature-add-button = Dodaj
+pdfjs-editor-edit-signature-update-button = Spremeni
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Uredi komentar
+pdfjs-editor-edit-comment-popup-button =
+    .title = Uredi komentar
+pdfjs-editor-delete-comment-popup-button-label = Odstrani komentar
+pdfjs-editor-delete-comment-popup-button =
+    .title = Odstrani komentar
+pdfjs-show-comment-button =
+    .title = Poka啪i komentar
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Uredi komentar
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Spremeni
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentar
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Za膷nite tipkati 鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Prekli膷i
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Dodaj komentar
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Preklopi stransko vrstico (dokument vsebuje sli膷ice/oris/priponke/plasti)
+pdfjs-toggle-views-manager-button1-label = Upravljanje strani
+pdfjs-views-manager-sidebar =
+    .aria-label = Stranska vrstica
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Sprememba velikosti stranske vrstice
+pdfjs-views-manager-view-selector-button =
+    .title = Pogledi
+pdfjs-views-manager-view-selector-button-label = Pogledi
+pdfjs-views-manager-pages-title = Strani
+pdfjs-views-manager-outlines-title1 = Oris dokumenta
+    .title = Oris dokumenta (dvokliknite za raz拧iritev ali strnitev vseh elementov)
+pdfjs-views-manager-attachments-title = Priponke
+pdfjs-views-manager-layers-title1 = Plasti
+    .title = Plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje)
+pdfjs-views-manager-pages-option-label = Strani
+pdfjs-views-manager-outlines-option-label = Oris dokumenta
+pdfjs-views-manager-attachments-option-label = Priponke
+pdfjs-views-manager-layers-option-label = Plasti
+pdfjs-views-manager-add-file-button =
+    .title = Dodaj datoteko
+pdfjs-views-manager-add-file-button-label = Dodaj datoteko
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } izbrana
+        [two] { $count } izbrani
+        [few] { $count } izbrane
+       *[other] { $count } izbranih
+    }
+pdfjs-views-manager-pages-status-none-action-label = Izberite strani
+pdfjs-views-manager-pages-status-action-button-label = Upravljaj
+pdfjs-views-manager-pages-status-copy-button-label = Kopiraj
+pdfjs-views-manager-pages-status-cut-button-label = Izre啪i
+pdfjs-views-manager-pages-status-delete-button-label = Izbri拧i
+pdfjs-views-manager-pages-status-export-selected-button-label = Izvozi izbor 鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] { $count } stran izrezana
+        [two] { $count } strani izrezani
+        [few] { $count } strani izrezane
+       *[other] { $count } strani izrezanih
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] { $count } stran kopirana
+        [two] { $count } strani kopirani
+        [few] { $count } strani kopirane
+       *[other] { $count } strani kopiranih
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] { $count } stran izbrisana
+        [two] { $count } strani izbrisani
+        [few] { $count } strani izbrisane
+       *[other] { $count } strani izbrisanih
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Pripravljanje datoteke za vas 鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Nalaganje datoteke 鈥�
+pdfjs-views-manager-status-warning-cut-label = Izrezovanje ni bilo mogo膷e. Osve啪ite stran in poskusite znova.
+pdfjs-views-manager-status-warning-copy-label = Kopiranje ni bilo mogo膷e. Osve啪ite stran in poskusite znova.
+pdfjs-views-manager-status-warning-delete-label = Brisanje ni bilo mogo膷e. Osve啪ite stran in poskusite znova.
+pdfjs-views-manager-status-warning-save-label = Shranjevanje ni bilo mogo膷e. Osve啪ite stran in poskusite znova.
+pdfjs-views-manager-status-undo-button-label = Razveljavi
+pdfjs-views-manager-status-done-button-label = Kon膷ano
+pdfjs-views-manager-status-close-button =
+    .title = Zapri
+pdfjs-views-manager-status-close-button-label = Zapri
+pdfjs-views-manager-paste-button-label = Prilepi
+pdfjs-views-manager-paste-button-before =
+    .title = Prilepi pred prvo stran
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Prilepi za stranjo { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NOVO
+pdfjs-views-manager-waiting-for-file = Nalaganje datoteke 鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Upravljanje strani
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Odstrani shranjen podpis
+pdfjs-editor-delete-signature-button-label1 = Odstrani shranjen podpis
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Uredi opis
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Uredi opis
diff --git a/public/pdfjs/web/locale/son/viewer.ftl b/public/pdfjs/web/locale/son/viewer.ftl
new file mode 100644
index 0000000..ecbe86d
--- /dev/null
+++ b/public/pdfjs/web/locale/son/viewer.ftl
@@ -0,0 +1,173 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Moo bisante
+pdfjs-previous-button-label = Bisante
+pdfjs-next-button =
+    .title = Jinehere moo
+pdfjs-next-button-label = Jine
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Moo
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } ra
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } ka hun { $pagesCount }) ra
+pdfjs-zoom-out-button =
+    .title = Nakasandi
+pdfjs-zoom-out-button-label = Nakasandi
+pdfjs-zoom-in-button =
+    .title = Bebbeerandi
+pdfjs-zoom-in-button-label = Bebbeerandi
+pdfjs-zoom-select =
+    .title = Bebbeerandi
+pdfjs-presentation-mode-button =
+    .title = Bere cebeyan alhaali
+pdfjs-presentation-mode-button-label = Cebeyan alhaali
+pdfjs-open-file-button =
+    .title = Tuku feeri
+pdfjs-open-file-button-label = Feeri
+pdfjs-print-button =
+    .title = Kar
+pdfjs-print-button-label = Kar
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Goyjinawey
+pdfjs-tools-button-label = Goyjinawey
+pdfjs-first-page-button =
+    .title = Koy moo jinaa ga
+pdfjs-first-page-button-label = Koy moo jinaa ga
+pdfjs-last-page-button =
+    .title = Koy moo koraa ga
+pdfjs-last-page-button-label = Koy moo koraa ga
+pdfjs-page-rotate-cw-button =
+    .title = Kuubi kanbe guma here
+pdfjs-page-rotate-cw-button-label = Kuubi kanbe guma here
+pdfjs-page-rotate-ccw-button =
+    .title = Kuubi kanbe wowa here
+pdfjs-page-rotate-ccw-button-label = Kuubi kanbe wowa here
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Takadda mayrawey鈥�
+pdfjs-document-properties-button-label = Takadda mayrawey鈥�
+pdfjs-document-properties-file-name = Tuku maa:
+pdfjs-document-properties-file-size = Tuku adadu:
+pdfjs-document-properties-title = Tiiramaa:
+pdfjs-document-properties-author = Hantumkaw:
+pdfjs-document-properties-subject = Dalil:
+pdfjs-document-properties-keywords = Kufalkalimawey:
+pdfjs-document-properties-creation-date = Teeyan han:
+pdfjs-document-properties-modification-date = Barmayan han:
+pdfjs-document-properties-creator = Teekaw:
+pdfjs-document-properties-producer = PDF berandikaw:
+pdfjs-document-properties-version = PDF dumi:
+pdfjs-document-properties-page-count = Moo hinna:
+
+##
+
+pdfjs-document-properties-close-button = Daabu
+
+## Print
+
+pdfjs-print-progress-message = Goo ma takaddaa soolu k'a kar se鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Na艐
+pdfjs-printing-not-supported = Yaamar: Karyan 拧i tee ka timme nda ceecikaa woo.
+pdfjs-printing-not-ready = Yaamar: PDF 拧i zunbu ka timme karyan 拧e.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Kanjari ceraw zuu
+pdfjs-toggle-sidebar-button-label = Kanjari ceraw zuu
+pdfjs-document-outline-button =
+    .title = Takaddaa korfur alhaaloo cebe (naagu cee hinka ka haya-izey kul hayandi/kankamandi)
+pdfjs-document-outline-button-label = Takadda filla-bo艐
+pdfjs-attachments-button =
+    .title = Hangarey cebe
+pdfjs-attachments-button-label = Hangarey
+pdfjs-thumbs-button =
+    .title = Kabeboy biyey cebe
+pdfjs-thumbs-button-label = Kabeboy biyey
+pdfjs-findbar-button =
+    .title = Ceeci takaddaa ra
+pdfjs-findbar-button-label = Ceeci
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page } moo
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Kabeboy bii { $page } moo 拧e
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Ceeci
+    .placeholder = Ceeci takaddaa ra鈥�
+pdfjs-find-previous-button =
+    .title = Kalima刹a艐oo bangayri bisantaa ceeci
+pdfjs-find-previous-button-label = Bisante
+pdfjs-find-next-button =
+    .title = Kalima刹a艐oo hiino bangayroo ceeci
+pdfjs-find-next-button-label = Jine
+pdfjs-find-highlight-checkbox = Ikul 拧ilbay
+pdfjs-find-match-case-checkbox-label = Harfu-beeriyan hawgay
+pdfjs-find-reached-top = A too mo艐oo bo艐oo, koy jine ka 拧initin nda cewoo
+pdfjs-find-reached-bottom = A too mo刹oo cewoo, koy jine 拧intioo ga
+pdfjs-find-not-found = Kalima刹aa mana duwandi
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Mooo hayyan
+pdfjs-page-scale-fit = Moo sawayan
+pdfjs-page-scale-auto = Bo艐拧e azzaati barmayyan
+pdfjs-page-scale-actual = Adadu cimi
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Firka bangay ka艐 PDF goo ma zumandi.
+pdfjs-invalid-file-error = PDF tuku laala wala laybante.
+pdfjs-missing-file-error = PDF tuku kumante.
+pdfjs-unexpected-response-error = Manti fer拧ikaw tuuruyan maatante.
+pdfjs-rendering-error = Firka bangay ka艐 mo刹oo goo ma willandi.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = { $type } maasa-caw]
+
+## Password
+
+pdfjs-password-label = 艩ennikufal dam ka PDF tukoo woo feeri.
+pdfjs-password-invalid = 艩ennikufal laalo. Ceeci koyne taare.
+pdfjs-password-ok-button = Ayyo
+pdfjs-password-cancel-button = Na艐
+pdfjs-web-fonts-disabled = Interneti 拧igirawey kay: 拧i hin ka goy nda PDF 拧igira hurantey.
diff --git a/public/pdfjs/web/locale/sq/viewer.ftl b/public/pdfjs/web/locale/sq/viewer.ftl
new file mode 100644
index 0000000..cbf3d55
--- /dev/null
+++ b/public/pdfjs/web/locale/sq/viewer.ftl
@@ -0,0 +1,735 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Faqja e M毛parshme
+pdfjs-previous-button-label = E m毛parshmja
+pdfjs-next-button =
+    .title = Faqja Pasuese
+pdfjs-next-button-label = Pasuesja
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Faqe
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = nga { $pagesCount } gjithsej
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } nga { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zvog毛lojeni
+pdfjs-zoom-out-button-label = Zvog毛lojeni
+pdfjs-zoom-in-button =
+    .title = Zmadhojeni
+pdfjs-zoom-in-button-label = Zmadhojini
+pdfjs-zoom-select =
+    .title = Zmadhim/Zvog毛lim
+pdfjs-presentation-mode-button =
+    .title = Kalo te M毛nyra Paraqitje
+pdfjs-presentation-mode-button-label = M毛nyra Paraqitje
+pdfjs-open-file-button =
+    .title = Hapni Kartel毛
+pdfjs-open-file-button-label = Hape
+pdfjs-print-button =
+    .title = Shtypje
+pdfjs-print-button-label = Shtype
+pdfjs-save-button =
+    .title = Ruaje
+pdfjs-save-button-label = Ruaje
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = Shkarkojeni
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = Shkarkoje
+pdfjs-bookmark-button =
+    .title = Faqja e Tanishme (Shihni URL nga Faqja e Tanishme)
+pdfjs-bookmark-button-label = Faqja e Tanishme
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Mjete
+pdfjs-tools-button-label = Mjete
+pdfjs-first-page-button =
+    .title = Kaloni te Faqja e Par毛
+pdfjs-first-page-button-label = Kaloni te Faqja e Par毛
+pdfjs-last-page-button =
+    .title = Kaloni te Faqja e Fundit
+pdfjs-last-page-button-label = Kaloni te Faqja e Fundit
+pdfjs-page-rotate-cw-button =
+    .title = Rrotullojeni N毛 Kahun Orar
+pdfjs-page-rotate-cw-button-label = Rrotulloje N毛 Kahun Orar
+pdfjs-page-rotate-ccw-button =
+    .title = Rrotullojeni N毛 Kahun Kund毛rorar
+pdfjs-page-rotate-ccw-button-label = Rrotulloje N毛 Kahun Kund毛rorar
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktivizo Mjet P毛rzgjedhjeje Teksti
+pdfjs-cursor-text-select-tool-button-label = Mjet P毛rzgjedhjeje Teksti
+pdfjs-cursor-hand-tool-button =
+    .title = Aktivizo Mjetin Dor毛
+pdfjs-cursor-hand-tool-button-label = Mjeti Dor毛
+pdfjs-scroll-page-button =
+    .title = P毛rdor Rr毛shqitje N毛 Faqe
+pdfjs-scroll-page-button-label = Rr毛shqitje N毛 Faqe
+pdfjs-scroll-vertical-button =
+    .title = P毛rdor Rr毛shqitje Vertikale
+pdfjs-scroll-vertical-button-label = Rr毛shqitje Vertikale
+pdfjs-scroll-horizontal-button =
+    .title = P毛rdor Rr毛shqitje Horizontale
+pdfjs-scroll-horizontal-button-label = Rr毛shqitje Horizontale
+pdfjs-scroll-wrapped-button =
+    .title = P毛rdor Rr毛shqitje Me Mb毛shtjellje
+pdfjs-scroll-wrapped-button-label = Rr毛shqitje Me Mb毛shtjellje
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Veti Dokumenti鈥�
+pdfjs-document-properties-button-label = Veti Dokumenti鈥�
+pdfjs-document-properties-file-name = Em毛r kartele:
+pdfjs-document-properties-file-size = Madh毛si kartele:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajte)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajte)
+pdfjs-document-properties-title = Titull:
+pdfjs-document-properties-author = Autor:
+pdfjs-document-properties-subject = Subjekt:
+pdfjs-document-properties-keywords = Fjal毛ky莽e:
+pdfjs-document-properties-creation-date = Dat毛 Krijimi:
+pdfjs-document-properties-modification-date = Dat毛 Ndryshimi:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Krijues:
+pdfjs-document-properties-producer = Prodhues PDF-je:
+pdfjs-document-properties-version = Version PDF-je:
+pdfjs-document-properties-page-count = Num毛r Faqesh:
+pdfjs-document-properties-page-size = Madh毛si Faqeje:
+pdfjs-document-properties-page-size-unit-inches = in莽
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portret
+pdfjs-document-properties-page-size-orientation-landscape = s毛 gjeri
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Parje e Shpjet毛 n毛 Web:
+pdfjs-document-properties-linearized-yes = Po
+pdfjs-document-properties-linearized-no = Jo
+pdfjs-document-properties-close-button = Mbylleni
+
+## Print
+
+pdfjs-print-progress-message = Po p毛rgatitet dokumenti p毛r shtypje鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Anuloje
+pdfjs-printing-not-supported = Kujdes: Shtypja s鈥檓bulohet plot毛sisht nga ky shfletues.
+pdfjs-printing-not-ready = Kujdes: PDF-ja s鈥櫭玸ht毛 ngarkuar plot毛sisht q毛 ta shtypni.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Shfaqni/Fshihni An毛shtyll毛n
+pdfjs-toggle-sidebar-notification-button =
+    .title = Hap/Mbyll An毛shtyl毛 (dokumenti p毛rmban p毛rvijim/nashk毛ngjitje/shtresa)
+pdfjs-toggle-sidebar-button-label = Shfaq/Fshih An毛shtyll毛n
+pdfjs-document-outline-button =
+    .title = Shfaqni P毛rvijim Dokumenti (dyklikoni q毛 t毛 shfaqen/fshihen krejt element毛t)
+pdfjs-document-outline-button-label = P毛rvijim Dokumenti
+pdfjs-attachments-button =
+    .title = Shfaqni Bashk毛ngjitje
+pdfjs-attachments-button-label = Bashk毛ngjitje
+pdfjs-layers-button =
+    .title = Shfaq Shtresa (dyklikoni q毛 t毛 rikthehen krejt shtresat n毛 gjendjen e tyre parazgjedhje)
+pdfjs-layers-button-label = Shtresa
+pdfjs-thumbs-button =
+    .title = Shfaqni Miniatura
+pdfjs-thumbs-button-label = Miniatura
+pdfjs-current-outline-item-button =
+    .title = Gjej Objektin e Tanish毛m t毛 P毛rvijuar
+pdfjs-current-outline-item-button-label = Objekt i Tanish毛m i P毛rvijuar
+pdfjs-findbar-button =
+    .title = Gjeni n毛 Dokument
+pdfjs-findbar-button-label = Gjej
+pdfjs-additional-layers = Shtresa Shtes毛
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Faqja { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatur毛 e Faqes { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = P毛rzgjidhni faqen { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Faqja { $page } nga { $total } gjithsej
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Gjej
+    .placeholder = Gjeni n毛 dokument鈥�
+pdfjs-find-previous-button =
+    .title = Gjeni hasjen e m毛parshme t毛 togfjal毛shit
+pdfjs-find-previous-button-label = E m毛parshmja
+pdfjs-find-next-button =
+    .title = Gjeni hasjen pasuese t毛 togfjal毛shit
+pdfjs-find-next-button-label = Pasuesja
+pdfjs-find-highlight-checkbox = Theksoji t毛 t毛ra
+pdfjs-find-match-case-checkbox-label = Si莽 脣sht毛 Shkruar
+pdfjs-find-match-diacritics-checkbox-label = Me P毛rputhje Me Shenjat Diakritike
+pdfjs-find-entire-word-checkbox-label = Fjal毛 t毛 Plota
+pdfjs-find-reached-top = U mb毛rrit n毛 krye t毛 dokumentit, vazhduar prej fundit
+pdfjs-find-reached-bottom = U mb毛rrit n毛 fund t毛 dokumentit, vazhduar prej kreut
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } nga { $total } p毛rputhje
+       *[other] { $current } nga { $total } p毛rputhje
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] M毛 tep毛r se { $limit } p毛rputhje
+       *[other] M毛 tep毛r se { $limit } p毛rputhje
+    }
+pdfjs-find-not-found = Togfjal毛sh q毛 s鈥檊jendet
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Gjer毛si Faqeje
+pdfjs-page-scale-fit = Sa Nx毛 Faqja
+pdfjs-page-scale-auto = Zoom i Vetvetish毛m
+pdfjs-page-scale-actual = Madh毛sia Faktike
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Faqja { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ndodhi nj毛 gabim gjat毛 ngarkimit t毛 PDF-s毛.
+pdfjs-invalid-file-error = Kartel毛 PDF e pavlefshme ose e d毛mtuar.
+pdfjs-missing-file-error = Kartel毛 PDF q毛 mungon.
+pdfjs-unexpected-response-error = P毛rgjigje sh毛rbyesi e papritur.
+pdfjs-rendering-error = Ndodhi nj毛 gabim gjat毛 riprodhimit t毛 faqes.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [N毛nvizim { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Jepni fjal毛kalimin q毛 t毛 hapet kjo kartel毛 PDF.
+pdfjs-password-invalid = Fjal毛kalim i pavlefsh毛m. Ju lutemi, riprovoni.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Anuloje
+pdfjs-web-fonts-disabled = Shkronjat Web jan毛 t毛 莽aktivizuara: s鈥檃rrihet t毛 p毛rdoren shkronja t毛 trup毛zuara n毛 PDF.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Tekst
+pdfjs-editor-color-picker-free-text-input =
+    .title = Ndryshoni ngjyr毛 teksti
+pdfjs-editor-free-text-button-label = Tekst
+pdfjs-editor-ink-button =
+    .title = Vizatoni
+pdfjs-editor-color-picker-ink-input =
+    .title = Ndryshoni ngjyr毛 vizatimi
+pdfjs-editor-ink-button-label = Vizatoni
+pdfjs-editor-stamp-button =
+    .title = Shtoni ose p毛rpunoni figura
+pdfjs-editor-stamp-button-label = Shtoni ose p毛rpunoni figura
+pdfjs-editor-highlight-button =
+    .title = Theksim
+pdfjs-editor-highlight-button-label = Theksoje
+pdfjs-highlight-floating-button1 =
+    .title = Theksim
+    .aria-label = Theksim
+pdfjs-highlight-floating-button-label = Theksim
+pdfjs-comment-floating-button =
+    .title = Komentoni
+    .aria-label = Komentoni
+pdfjs-comment-floating-button-label = Komentoni
+pdfjs-editor-comment-button =
+    .title = Koment
+    .aria-label = Koment
+pdfjs-editor-comment-button-label = Komentoni
+pdfjs-editor-signature-button =
+    .title = Shtoni n毛nshkrim
+pdfjs-editor-signature-button-label = Shtoni n毛nshkrim
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = P毛rpunues theksimesh
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = P毛rpunues vizatimesh
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = P毛rpunues n毛nshkrimesh: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = P毛rpunues figurash
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Hiq vizatim
+pdfjs-editor-remove-freetext-button =
+    .title = Hiq tekst
+pdfjs-editor-remove-stamp-button =
+    .title = Hiq figur毛
+pdfjs-editor-remove-highlight-button =
+    .title = Hiqe theksimin
+pdfjs-editor-remove-signature-button =
+    .title = Hiqe n毛nshkrimin
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Ngjyr毛
+pdfjs-editor-free-text-size-input = Madh毛si
+pdfjs-editor-ink-color-input = Ngjyr毛
+pdfjs-editor-ink-thickness-input = Trash毛si
+pdfjs-editor-ink-opacity-input = Patejdukshm毛ri
+pdfjs-editor-stamp-add-image-button =
+    .title = Shtoni figur毛
+pdfjs-editor-stamp-add-image-button-label = Shtoni figur毛
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Trash毛si
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Ndryshoni trash毛sin毛 kur theksoni objekte tjet毛r nga tekst
+pdfjs-editor-add-signature-container =
+    .aria-label = Kontrolle n毛nshkrimesh dhe n毛nshkrime t毛 ruajtur
+pdfjs-editor-signature-add-signature-button =
+    .title = Shtoni n毛nshkrim t毛 ri
+pdfjs-editor-signature-add-signature-button-label = Shtoni n毛nshkrim t毛 ri
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = N毛nshkrim i ruajtur: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = P毛rpunues Tekstesh
+    .default-content = Filloni t毛 shtypni鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Koment
+       *[other] Komente
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Mbylleni an毛shtyll毛n
+    .aria-label = Mbylleni an毛shtyll毛n
+pdfjs-editor-comments-sidebar-close-button-label = Mbylleni an毛shtyll毛n
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Shihni di莽ka q毛 ia vlen. Theksojeni dhe lini nj毛 koment.
+pdfjs-editor-comments-sidebar-no-comments-link = M毛soni m毛 tep毛r
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Tekst alternativ
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = P毛rpunoni tekst alternativ
+pdfjs-editor-alt-text-dialog-label = Zgjidhni nj毛 mund毛si
+pdfjs-editor-alt-text-dialog-description = Teksti alt (tekst alternativ) vjen n毛 ndihm毛 kur njer毛zit s鈥檓und t毛 shohin figur毛n, ose kur ajo nuk ngarkohet.
+pdfjs-editor-alt-text-add-description-label = Shtoni nj毛 p毛rshkrim
+pdfjs-editor-alt-text-add-description-description = Synoni p毛r 1-2 togfjal毛sha q毛 p毛rshkruajn毛 subjektin, rrethanat apo veprimet.
+pdfjs-editor-alt-text-mark-decorative-label = V毛ri shenj毛 si dekorative
+pdfjs-editor-alt-text-mark-decorative-description = Kjo p毛rdoret p毛r figura zbukuruese, fjala vjen, an毛, ose watermark-e.
+pdfjs-editor-alt-text-cancel-button = Anuloje
+pdfjs-editor-alt-text-save-button = Ruaje
+pdfjs-editor-alt-text-decorative-tooltip = Iu vu shenj毛 si dekorative
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = P毛r shembull, 鈥淣j毛 djalosh ulet n毛 nj毛 tryez毛 t毛 haj毛鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Tekst alternativ
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Cepi i sip毛rm majtas 鈥� rip毛rmasojeni
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Mesi i pjes毛s sip毛r 鈥� rip毛rmasojeni
+pdfjs-editor-resizer-top-right =
+    .aria-label = Cepi i sip毛rm djathtas 鈥� rip毛rmasojeni
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Djathtas n毛 mes 鈥� rip毛rmasojeni
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Cepi i posht毛m djathtas 鈥� rip毛rmasojeni
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Mesi i pjes毛s posht毛 鈥� rip毛rmasojeni
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Cepi i posht毛m 鈥� rip毛rmasojeni
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Majtas n毛 mes 鈥� rip毛rmasojeni
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Ngjyr毛 theksimi
+pdfjs-editor-colorpicker-button =
+    .title = Ndryshoni ngjyr毛
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Zgjedhje ngjyre
+pdfjs-editor-colorpicker-yellow =
+    .title = E verdh毛
+pdfjs-editor-colorpicker-green =
+    .title = E gjelb毛r
+pdfjs-editor-colorpicker-blue =
+    .title = Blu
+pdfjs-editor-colorpicker-pink =
+    .title = Roz毛
+pdfjs-editor-colorpicker-red =
+    .title = E kuqe
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Shfaqi krejt
+pdfjs-editor-highlight-show-all-button =
+    .title = Shfaqi krejt
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = P毛rpunoni tekst alternativ (p毛rshkrim figure)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Shtoni tekst alternativ (p毛rshkrim figure)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Shkruani k毛tu p毛rshkrimin tuaj鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = P毛rshkrim i shkurt毛r p毛r persona q毛 s鈥檓unden t毛 shohin figur毛n, ose p毛r kur figura nuk ngarkohet dot.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Ky tekst alternativ qe krijuar automatikisht dhe mund t毛 jet毛 i pasakt毛.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = M毛soni m毛 tep毛r
+pdfjs-editor-new-alt-text-create-automatically-button-label = Krijo automatikisht tekst alternativ
+pdfjs-editor-new-alt-text-not-now-button = Jo tani
+pdfjs-editor-new-alt-text-error-title = S鈥檜 krijua dot automatikisht tekst alternativ
+pdfjs-editor-new-alt-text-error-description = Ju lutemi, shkruani tekstin tuaj alternativ, ose riprovoni m毛 von毛.
+pdfjs-editor-new-alt-text-error-close-button = Mbylle
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Po shkarkohet model IA teksti alternativ ({ $downloadedSize } nga { $totalSize } MB)
+    .aria-valuetext = Po shkarkohet model IA teksti alternativ ({ $downloadedSize } nga { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = U shtua tekst alternativ
+pdfjs-editor-new-alt-text-added-button-label = U shtua tekst alternativ
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Mungon tekst alternativ
+pdfjs-editor-new-alt-text-missing-button-label = Mungon tekst alternativ
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Shqyrtoni tekst alternativ
+pdfjs-editor-new-alt-text-to-review-button-label = Shqyrtoni tekst alternativ
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Krijuar automatikisht: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Rregullime teksti alternativ figure
+pdfjs-image-alt-text-settings-button-label = Rregullime teksti alternativ figure
+pdfjs-editor-alt-text-settings-dialog-label = Rregullime teksti alternativ figure
+pdfjs-editor-alt-text-settings-automatic-title = Tekst alternativ i automatizuar
+pdfjs-editor-alt-text-settings-create-model-button-label = Krijo automatikisht tekst alternativ
+pdfjs-editor-alt-text-settings-create-model-description = Sugjeron p毛rshkrime, p毛r t毛 ndihmuar persona q毛 s鈥檓unden t毛 shohin figur毛n, ose p毛r kur figura nuk ngarkohet dot.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Model IA teksti alternativ ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Xhiron lokalisht n毛 pajisjen tuaj, pra t毛 dh毛nat tuaja mbeten private. E domosdoshme p毛r tekst t毛 automatizuar alternativ.
+pdfjs-editor-alt-text-settings-delete-model-button = Fshije
+pdfjs-editor-alt-text-settings-download-model-button = Shkarkoje
+pdfjs-editor-alt-text-settings-downloading-model-button = Po shkarkohet鈥�
+pdfjs-editor-alt-text-settings-editor-title = P毛rpunues teksti alternativ
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Shfaq menj毛her毛 p毛rpunues teksti alternativ, kur shtohet nj毛 figur毛
+pdfjs-editor-alt-text-settings-show-dialog-description = Ju ndihmon t毛 siguroheni se krejt figurat tuaja kan毛 tekst alternativ.
+pdfjs-editor-alt-text-settings-close-button = Mbylle
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = U shtua theksim
+pdfjs-editor-freetext-added-alert = U shtua tekst
+pdfjs-editor-ink-added-alert = U shtua vizatim
+pdfjs-editor-stamp-added-alert = U shtua figur毛
+pdfjs-editor-signature-added-alert = U shtua n毛nshkrim
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = U hoq theksimi
+pdfjs-editor-undo-bar-message-freetext = U hoq tekst
+pdfjs-editor-undo-bar-message-ink = U hoq vizatim
+pdfjs-editor-undo-bar-message-stamp = U hoq figur毛
+pdfjs-editor-undo-bar-message-signature = N毛nshkrimi u hoq
+pdfjs-editor-undo-bar-message-comment = Komenti u hoq
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] U hoq { $count } sh毛nim
+       *[other] U hoq毛n { $count } sh毛nime
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Zhb毛je
+pdfjs-editor-undo-bar-undo-button-label = Zhb毛je
+pdfjs-editor-undo-bar-close-button =
+    .title = Mbylle
+pdfjs-editor-undo-bar-close-button-label = Mbylle
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Kjo dritare modale i lejon p毛rdoruesit t毛 krijoj毛 nj毛 n毛nshkrim p毛r ta shtuar te nj毛 dokument PDF. P毛rdoruesi mund t毛 p毛rpunoj毛 emrin (i cili sh毛rben edhe si tekst alternativ) dhe, n毛se do, ta ruaj毛 n毛nshkrimin, p毛r ta p毛rdorur prap毛.
+pdfjs-editor-add-signature-dialog-title = Shtoni nj毛 n毛nshkrim
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Lloj
+    .title = Lloj
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Vizatoni
+    .title = Vizatoni
+pdfjs-editor-add-signature-image-button = Figur毛
+    .title = Figur毛
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Shtypni n毛nshkrimin tuaj
+    .placeholder = Shtypni n毛nshkrimin tuaj
+pdfjs-editor-add-signature-draw-placeholder = Vizatoni n毛nshkrimin tuaj
+pdfjs-editor-add-signature-draw-thickness-range-label = Trash毛si
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Trash毛si vizatimi: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = T毛rhiqni k毛tu nj毛 kartel毛 p毛r ngarkim
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ose zgjidhni kartel毛 figure
+       *[other] Ose zgjidhni kartel毛 figure
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = P毛rshkrim (tekst alternativ)
+pdfjs-editor-add-signature-description-input =
+    .title = P毛rshkrim (tekst alternativ)
+pdfjs-editor-add-signature-description-default-when-drawing = N毛nshkrim
+pdfjs-editor-add-signature-clear-button-label = Spastroje n毛nshkrimin
+pdfjs-editor-add-signature-clear-button =
+    .title = Spastroje n毛nshkrimin
+pdfjs-editor-add-signature-save-checkbox = Ruaje n毛nshkrimin
+pdfjs-editor-add-signature-save-warning-message = Keni mb毛rritur n毛 kufirin e 5 n毛nshkrimeve t毛 ruajtura. Q毛 t毛 ruani tjet毛r, hiqni nj毛.
+pdfjs-editor-add-signature-image-upload-error-title = S鈥檜 ngarkua dot figur毛
+pdfjs-editor-add-signature-image-upload-error-description = Kontrolloni lidhjen tuaj n毛 rrjet, ose provoni figur毛 tjet毛r.
+pdfjs-editor-add-signature-image-no-data-error-title = S鈥檚hnd毛rrohet dot kjo figur毛 n毛 nj毛 n毛nshkrim
+pdfjs-editor-add-signature-image-no-data-error-description = Ju lutemi, provoni t毛 ngarkoni nj毛 figur毛 tjet毛r.
+pdfjs-editor-add-signature-error-close-button = Mbylle
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Anuloje
+pdfjs-editor-add-signature-add-button = Shtoje
+pdfjs-editor-edit-signature-update-button = P毛rdit毛soje
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = P毛rpunoni koment
+pdfjs-editor-edit-comment-popup-button =
+    .title = P毛rpunoni koment
+pdfjs-editor-delete-comment-popup-button-label = Hiqe komentin
+pdfjs-editor-delete-comment-popup-button =
+    .title = Hiqe komentin
+pdfjs-show-comment-button =
+    .title = Shfaqe komentin
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = P毛rpunoni koment
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = P毛rdit毛sojeni
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Shtoni koment
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Shtoje
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Filloni t毛 shtypni鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Anuloje
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Shtoni koment
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Shfaqni/Fshihni An毛shtyll毛r (dokumenti p毛rmban miniatura/p毛rvijim/bashk毛ngjitje/shtresa)
+pdfjs-toggle-views-manager-button1-label = Administroni faqe
+pdfjs-views-manager-sidebar =
+    .aria-label = An毛shtyll毛
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Rip毛rmasues an毛shtylle
+pdfjs-views-manager-view-selector-button =
+    .title = Pamje
+pdfjs-views-manager-view-selector-button-label = Pamje
+pdfjs-views-manager-pages-title = Faqe
+pdfjs-views-manager-attachments-title = Bashk毛ngjitje
+pdfjs-views-manager-layers-title1 = Shtresa
+    .title = Shtresa (dyklikoni q毛 t毛 rikthehen krejt shtresat te gjendja parazgjedhje)
+pdfjs-views-manager-pages-option-label = Faqe
+pdfjs-views-manager-outlines-option-label = P毛rvijim dokumenti
+pdfjs-views-manager-attachments-option-label = Bashk毛ngjitje
+pdfjs-views-manager-layers-option-label = Shtresa
+pdfjs-views-manager-add-file-button =
+    .title = Shtoni kartel毛
+pdfjs-views-manager-add-file-button-label = Shtoni kartel毛
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } e p毛rzgjedhur
+       *[other] { $count } t毛 p毛rzgjedhura
+    }
+pdfjs-views-manager-pages-status-none-action-label = P毛rzgjidhni faqe
+pdfjs-views-manager-pages-status-action-button-label = Administrojini
+pdfjs-views-manager-pages-status-copy-button-label = Kopjoje
+pdfjs-views-manager-pages-status-cut-button-label = Prije
+pdfjs-views-manager-pages-status-delete-button-label = Fshije
+pdfjs-views-manager-pages-status-export-selected-button-label = Eksportoni t毛 p毛rzgjedhurit鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] Prerje e 1 faqeje
+       *[other] Prerje e { $count } faqesh
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 faqe e kopjuar
+       *[other] { $count } faqe t毛 kopjuara
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 faqe e fshir毛
+       *[other] { $count } faqe t毛 fshira
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Po b毛het gati kartela juaj鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Po ngarkohet kartel毛鈥�
+pdfjs-views-manager-status-warning-cut-label = S鈥檜 b毛 dot prerja. Rifreskoni faqen dhe riprovoni.
+pdfjs-views-manager-status-warning-copy-label = S鈥檜 kopjua dot. Rifreskoni faqen dhe riprovoni.
+pdfjs-views-manager-status-warning-delete-label = S鈥檜 fshi dot. Rifreskoni faqen dhe riprovoni.
+pdfjs-views-manager-status-warning-save-label = S鈥檜 ruajt dot. Rifreskoni faqen dhe riprovoni.
+pdfjs-views-manager-status-undo-button-label = Zhb毛je
+pdfjs-views-manager-status-done-button-label = U b毛
+pdfjs-views-manager-status-close-button =
+    .title = Mbylle
+pdfjs-views-manager-status-close-button-label = Mbylle
+pdfjs-views-manager-paste-button-label = Ngjite
+pdfjs-views-manager-paste-button-before =
+    .title = Ngjite para faqes s毛 par毛
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Ngjite pas faqes { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = E RE
+pdfjs-toggle-views-manager-button1 =
+    .title = Administroni faqe
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Hiqe n毛nshkrimin e ruajtur
+pdfjs-editor-delete-signature-button-label1 = Hiqe n毛nshkrimin e ruajtur
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = P毛rpunoni p毛rshkrimin
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = P毛rpunoni p毛rshkrimin
diff --git a/public/pdfjs/web/locale/sr/viewer.ftl b/public/pdfjs/web/locale/sr/viewer.ftl
new file mode 100644
index 0000000..d4a65d7
--- /dev/null
+++ b/public/pdfjs/web/locale/sr/viewer.ftl
@@ -0,0 +1,755 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 袩褉械褌褏芯写薪邪 褋褌褉邪薪懈褑邪
+pdfjs-previous-button-label = 袩褉械褌褏芯写薪邪
+pdfjs-next-button =
+    .title = 小谢械写械褯邪 褋褌褉邪薪懈褑邪
+pdfjs-next-button-label = 小谢械写械褯邪
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 小褌褉邪薪懈褑邪
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 芯写 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 芯写 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 校屑邪褮懈
+pdfjs-zoom-out-button-label = 校屑邪褮懈
+pdfjs-zoom-in-button =
+    .title = 校胁械谢懈褔邪褬
+pdfjs-zoom-in-button-label = 校胁械谢懈褔邪褬
+pdfjs-zoom-select =
+    .title = 校胁械谢懈褔邪胁邪褮械
+pdfjs-presentation-mode-button =
+    .title = 袩褉芯屑械薪懈 薪邪 锌褉懈泻邪蟹 褍 褉械卸懈屑褍 锌褉械蟹械薪褌邪褑懈褬械
+pdfjs-presentation-mode-button-label = 袪械卸懈屑 锌褉械蟹械薪褌邪褑懈褬械
+pdfjs-open-file-button =
+    .title = 袨褌胁芯褉懈 写邪褌芯褌械泻褍
+pdfjs-open-file-button-label = 袨褌胁芯褉懈
+pdfjs-print-button =
+    .title = 楔褌邪屑锌邪褬
+pdfjs-print-button-label = 楔褌邪屑锌邪褬
+pdfjs-save-button =
+    .title = 小邪褔褍胁邪褬
+pdfjs-save-button-label = 小邪褔褍胁邪褬
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 袩褉械褍蟹屑懈
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 袩褉械褍蟹屑懈
+pdfjs-bookmark-button =
+    .title = 孝褉械薪褍褌薪邪 褋褌褉邪薪懈褑邪 (锌芯谐谢械写邪褬褌械 URL 褋邪 褌褉械薪褍褌薪械 褋褌褉邪薪懈褑械)
+pdfjs-bookmark-button-label = 孝褉械薪褍褌薪邪 褋褌褉邪薪懈褑邪
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 袗谢邪褌泻械
+pdfjs-tools-button-label = 袗谢邪褌泻械
+pdfjs-first-page-button =
+    .title = 袠写懈 薪邪 锌褉胁褍 褋褌褉邪薪懈褑褍
+pdfjs-first-page-button-label = 袠写懈 薪邪 锌褉胁褍 褋褌褉邪薪懈褑褍
+pdfjs-last-page-button =
+    .title = 袠写懈 薪邪 锌芯褋谢械写褮褍 褋褌褉邪薪懈褑褍
+pdfjs-last-page-button-label = 袠写懈 薪邪 锌芯褋谢械写褮褍 褋褌褉邪薪懈褑褍
+pdfjs-page-rotate-cw-button =
+    .title = 袪芯褌懈褉邪褬 褍 褋屑械褉褍 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+pdfjs-page-rotate-cw-button-label = 袪芯褌懈褉邪褬 褍 褋屑械褉褍 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+pdfjs-page-rotate-ccw-button =
+    .title = 袪芯褌懈褉邪褬 褍 褋屑械褉褍 褋褍锌褉芯褌薪芯屑 芯写 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+pdfjs-page-rotate-ccw-button-label = 袪芯褌懈褉邪褬 褍 褋屑械褉褍 褋褍锌褉芯褌薪芯屑 芯写 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+pdfjs-cursor-text-select-tool-button =
+    .title = 袨屑芯谐褍褯懈 邪谢邪褌 蟹邪 褋械谢械泻褌芯胁邪褮械 褌械泻褋褌邪
+pdfjs-cursor-text-select-tool-button-label = 袗谢邪褌 蟹邪 褋械谢械泻褌芯胁邪褮械 褌械泻褋褌邪
+pdfjs-cursor-hand-tool-button =
+    .title = 袨屑芯谐褍褯懈 邪谢邪褌 蟹邪 锌芯屑械褉邪褮械
+pdfjs-cursor-hand-tool-button-label = 袗谢邪褌 蟹邪 锌芯屑械褉邪褮械
+pdfjs-scroll-page-button =
+    .title = 袣芯褉懈褋褌懈 褋泻褉芯谢芯胁邪褮械 锌芯 芯屑芯褌褍
+pdfjs-scroll-page-button-label = 小泻褉芯谢芯胁邪褮械 褋褌褉邪薪懈褑械
+pdfjs-scroll-vertical-button =
+    .title = 袣芯褉懈褋褌懈 胁械褉褌懈泻邪谢薪芯 褋泻褉芯谢芯胁邪褮械
+pdfjs-scroll-vertical-button-label = 袙械褉褌懈泻邪谢薪芯 褋泻褉芯谢芯胁邪褮械
+pdfjs-scroll-horizontal-button =
+    .title = 袣芯褉懈褋褌懈 褏芯褉懈蟹芯薪褌邪谢薪芯 褋泻褉芯谢芯胁邪褮械
+pdfjs-scroll-horizontal-button-label = 啸芯褉懈蟹芯薪褌邪谢薪芯 褋泻褉芯谢芯胁邪褮械
+pdfjs-scroll-wrapped-button =
+    .title = 袣芯褉懈褋褌懈 褋泻褉芯谢芯胁邪褮械 锌芯 芯屑芯褌褍
+pdfjs-scroll-wrapped-button-label = 小泻褉芯谢芯胁邪褮械 锌芯 芯屑芯褌褍
+pdfjs-spread-none-button =
+    .title = 袧械屑芯褬 褋锌邪褬邪褌懈 褕懈褉械褮邪 褋褌褉邪薪懈褑邪
+pdfjs-spread-none-button-label = 袘械蟹 褉邪褋锌褉芯褋褌懈褉邪褮邪
+pdfjs-spread-odd-button =
+    .title = 小锌芯褬懈 褕懈褉械褮邪 褋褌褉邪薪懈褑邪 泻芯褬械 锌芯褔懈褮褍 薪械锌邪褉薪懈屑 斜褉芯褬械屑
+pdfjs-spread-odd-button-label = 袧械锌邪褉薪邪 褉邪褋锌褉芯褋褌懈褉邪褮邪
+pdfjs-spread-even-button =
+    .title = 小锌芯褬懈 褕懈褉械褮邪 褋褌褉邪薪懈褑邪 泻芯褬械 锌芯褔懈褮褍 锌邪褉薪懈屑 斜褉芯褬械屑
+pdfjs-spread-even-button-label = 袩邪褉薪邪 褉邪褋锌褉芯褋褌懈褉邪褮邪
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 袩邪褉邪屑械褌褉懈 写芯泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-button-label = 袩邪褉邪屑械褌褉懈 写芯泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-file-name = 袠屑械 写邪褌芯褌械泻械:
+pdfjs-document-properties-file-size = 袙械谢懈褔懈薪邪 写邪褌芯褌械泻械:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 斜邪褬褌芯胁邪)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 斜邪褬褌芯胁邪)
+pdfjs-document-properties-title = 袧邪褋谢芯胁:
+pdfjs-document-properties-author = 袗褍褌芯褉:
+pdfjs-document-properties-subject = 孝械屑邪:
+pdfjs-document-properties-keywords = 袣褭褍褔薪械 褉械褔懈:
+pdfjs-document-properties-creation-date = 袛邪褌褍屑 泻褉械懈褉邪褮邪:
+pdfjs-document-properties-modification-date = 袛邪褌褍屑 屑芯写懈褎懈泻邪褑懈褬械:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 小褌胁邪褉邪谢邪褑:
+pdfjs-document-properties-producer = PDF 锌褉芯懈蟹胁芯褣邪褔:
+pdfjs-document-properties-version = PDF 胁械褉蟹懈褬邪:
+pdfjs-document-properties-page-count = 袘褉芯褬 褋褌褉邪薪懈褑邪:
+pdfjs-document-properties-page-size = 袙械谢懈褔懈薪邪 褋褌褉邪薪懈褑械:
+pdfjs-document-properties-page-size-unit-inches = 懈薪
+pdfjs-document-properties-page-size-unit-millimeters = 屑屑
+pdfjs-document-properties-page-size-orientation-portrait = 褍褋锌褉邪胁薪芯
+pdfjs-document-properties-page-size-orientation-landscape = 胁芯写芯褉邪胁薪芯
+pdfjs-document-properties-page-size-name-a-three = 袗3
+pdfjs-document-properties-page-size-name-a-four = 袗4
+pdfjs-document-properties-page-size-name-letter = 小谢芯胁芯
+pdfjs-document-properties-page-size-name-legal = 袩褉邪胁邪
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 袘褉蟹 胁械斜 锌褉懈泻邪蟹:
+pdfjs-document-properties-linearized-yes = 袛邪
+pdfjs-document-properties-linearized-no = 袧械
+pdfjs-document-properties-close-button = 袟邪褌胁芯褉懈
+
+## Print
+
+pdfjs-print-progress-message = 袩褉懈锌褉械屑邪屑 写芯泻褍屑械薪褌 蟹邪 褕褌邪屑锌邪褮械鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 袨褌泻邪卸懈
+pdfjs-printing-not-supported = 校锌芯蟹芯褉械褮械: 楔褌邪屑锌邪褮械 薪懈褬械 褍 锌芯褌锌褍薪芯褋褌懈 锌芯写褉卸邪薪芯 褍 芯胁芯屑 锌褉械谐谢械写邪褔褍.
+pdfjs-printing-not-ready = 校锌芯蟹芯褉械褮械: PDF 薪懈褬械 褍 锌芯褌锌褍薪芯褋褌懈 褍褔懈褌邪薪 蟹邪 褕褌邪屑锌褍.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 袩褉懈泻邪卸懈/褋邪泻褉懈褬 斜芯褔薪懈 锌邪薪械谢
+pdfjs-toggle-sidebar-notification-button =
+    .title = 袩褉懈泻邪卸懈/褋邪泻褉懈褬 斜芯褔薪懈 锌邪薪械谢 (写芯泻褍屑械薪褌 褋邪写褉卸懈 泻芯薪褌褍褉褍/锌褉懈谢芯谐械/褋谢芯褬械胁械)
+pdfjs-toggle-sidebar-button-label = 袩褉懈泻邪卸懈/褋邪泻褉懈褬 斜芯褔薪懈 锌邪薪械谢
+pdfjs-document-outline-button =
+    .title = 袩褉懈泻邪卸懈 褋褌褉褍泻褌褍褉褍 写芯泻褍屑械薪褌邪 (写胁芯褋褌褉褍泻懈屑 泻谢懈泻芯屑 锌褉芯褕懈褉褍褬械褌械/褋泻褍锌褭邪褌械 褋胁械 褋褌邪胁泻械)
+pdfjs-document-outline-button-label = 袣芯薪褌褍褉邪 写芯泻褍屑械薪褌邪
+pdfjs-attachments-button =
+    .title = 袩褉懈泻邪卸懈 锌褉懈谢芯谐械
+pdfjs-attachments-button-label = 袩褉懈谢芯蟹懈
+pdfjs-layers-button =
+    .title = 袩褉懈泻邪卸懈 褋谢芯褬械胁械 (写褍锌谢懈 泻谢懈泻 蟹邪 胁褉邪褯邪褮械 褋胁懈褏 褋谢芯褬械胁邪 褍 锌芯写褉邪蟹褍屑械胁邪薪芯 褋褌邪褮械)
+pdfjs-layers-button-label = 小谢芯褬械胁懈
+pdfjs-thumbs-button =
+    .title = 袩褉懈泻邪卸懈 褋谢懈褔懈褑械
+pdfjs-thumbs-button-label = 小谢懈褔懈褑械
+pdfjs-current-outline-item-button =
+    .title = 袩褉芯薪邪褣懈褌械 褌褉械薪褍褌薪懈 械谢械屑械薪褌 褋褌褉褍泻褌褍褉械
+pdfjs-current-outline-item-button-label = 孝褉械薪褍褌薪邪 泻芯薪褌褍褉邪
+pdfjs-findbar-button =
+    .title = 袩褉芯薪邪褣懈 褍 写芯泻褍屑械薪褌褍
+pdfjs-findbar-button-label = 袩褉芯薪邪褣懈
+pdfjs-additional-layers = 袛芯写邪褌薪懈 褋谢芯褬械胁懈
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 小褌褉邪薪懈褑邪 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 小谢懈褔懈褑邪 芯写 褋褌褉邪薪懈褑械 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 袠蟹邪斜械褉懈 褋褌褉邪薪懈褑褍 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 小褌褉邪薪懈褑邪 { $page } 芯写 { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 袩褉芯薪邪褣懈
+    .placeholder = 袩褉芯薪邪褣懈 褍 写芯泻褍屑械薪褌褍鈥�
+pdfjs-find-previous-button =
+    .title = 袩褉芯薪邪褣懈 锌褉械褌褏芯写薪芯 锌芯褬邪胁褭懈胁邪褮械 褎褉邪蟹械
+pdfjs-find-previous-button-label = 袩褉械褌褏芯写薪邪
+pdfjs-find-next-button =
+    .title = 袩褉芯薪邪褣懈 褋谢械写械褯械 锌芯褬邪胁褭懈胁邪褮械 褎褉邪蟹械
+pdfjs-find-next-button-label = 小谢械写械褯邪
+pdfjs-find-highlight-checkbox = 袠褋褌邪泻薪褍褌懈 褋胁械
+pdfjs-find-match-case-checkbox-label = 袩芯写褍写邪褉邪褮邪
+pdfjs-find-match-diacritics-checkbox-label = 袛懈褬邪泻褉懈褌懈泻邪
+pdfjs-find-entire-word-checkbox-label = 笑械谢械 褉械褔懈
+pdfjs-find-reached-top = 袛芯褋褌懈谐薪褍褌 胁褉褏 写芯泻褍屑械薪褌邪, 薪邪褋褌邪胁懈芯 褋邪 写薪邪
+pdfjs-find-reached-bottom = 袛芯褋褌懈谐薪褍褌芯 写薪芯 写芯泻褍屑械薪褌邪, 薪邪褋褌邪胁懈芯 褋邪 胁褉褏邪
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 芯写 { $total } 锌芯泻谢邪锌邪褮邪
+        [few] { $current } 芯写 { $total } 锌芯泻谢邪锌邪褮邪
+       *[other] { $current } 芯写 { $total } 锌芯泻谢邪锌邪褮邪
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 袙懈褕械 芯写 { $limit } 锌芯泻谢邪锌邪褮邪
+        [few] 袙懈褕械 芯写 { $limit } 锌芯泻谢邪锌邪褮邪
+       *[other] 袙懈褕械 芯写 { $limit } 锌芯泻谢邪锌邪褮邪
+    }
+pdfjs-find-not-found = 肖褉邪蟹邪 薪懈褬械 锌褉芯薪邪褣械薪邪
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 楔懈褉懈薪邪 褋褌褉邪薪懈褑械
+pdfjs-page-scale-fit = 袩褉懈谢邪谐芯写懈 褋褌褉邪薪懈褑褍
+pdfjs-page-scale-auto = 袗褍褌芯屑邪褌褋泻芯 褍胁械谢懈褔邪胁邪褮械
+pdfjs-page-scale-actual = 小褌胁邪褉薪邪 胁械谢懈褔懈薪邪
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 小褌褉邪薪懈褑邪 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 袛芯褕谢芯 褬械 写芯 谐褉械褕泻械 锌褉懈谢懈泻芯屑 褍褔懈褌邪胁邪褮邪 PDF-邪.
+pdfjs-invalid-file-error = PDF 写邪褌芯褌械泻邪 褬械 薪械胁邪卸械褯邪 懈谢懈 褬械 芯褕褌械褯械薪邪.
+pdfjs-missing-file-error = 袧械写芯褋褌邪褬械 PDF 写邪褌芯褌械泻邪.
+pdfjs-unexpected-response-error = 袧械芯褔械泻懈胁邪薪 芯写谐芯胁芯褉 芯写 褋械褉胁械褉邪.
+pdfjs-rendering-error = 袛芯褕谢芯 褬械 写芯 谐褉械褕泻械 锌褉懈谢懈泻芯屑 褉械薪写械褉芯胁邪褮邪 芯胁械 褋褌褉邪薪懈褑械.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 泻芯屑械薪褌邪褉]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 校薪械褋懈褌械 谢芯蟹懈薪泻褍 写邪 斜懈褋褌械 芯褌胁芯褉懈谢懈 芯胁邪褬 PDF 写芯泻褍屑械薪邪褌.
+pdfjs-password-invalid = 袧械懈褋锌褉邪胁薪邪 谢芯蟹懈薪泻邪. 袩芯泻褍褕邪褬褌械 锌芯薪芯胁芯.
+pdfjs-password-ok-button = 校 褉械写褍
+pdfjs-password-cancel-button = 袨褌泻邪卸懈
+pdfjs-web-fonts-disabled = 袙械斜 褎芯薪褌芯胁懈 褋褍 芯薪械屑芯谐褍褯械薪懈: 薪械 屑芯谐褍 泻芯褉懈褋褌懈褌懈 褍谐褉邪褣械薪械 PDF 褎芯薪褌芯胁械.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 孝械泻褋褌
+pdfjs-editor-color-picker-free-text-input =
+    .title = 袩褉芯屑械薪懈 斜芯褬褍 褌械泻褋褌邪
+pdfjs-editor-free-text-button-label = 孝械泻褋褌
+pdfjs-editor-ink-button =
+    .title = 笑褉褌邪褬
+pdfjs-editor-color-picker-ink-input =
+    .title = 袩褉芯屑械薪懈 斜芯褬褍 褑褉褌械卸邪
+pdfjs-editor-ink-button-label = 笑褉褌邪褬
+pdfjs-editor-stamp-button =
+    .title = 袛芯写邪褬 懈谢懈 褍褉械写懈 褋谢懈泻械
+pdfjs-editor-stamp-button-label = 袛芯写邪褬 懈谢懈 褍褉械写懈 褋谢懈泻械
+pdfjs-editor-highlight-button =
+    .title = 袨蟹薪邪褔懈
+pdfjs-editor-highlight-button-label = 袨蟹薪邪褔懈
+pdfjs-highlight-floating-button1 =
+    .title = 袨蟹薪邪褔懈
+    .aria-label = 袨蟹薪邪褔懈
+pdfjs-highlight-floating-button-label = 袨蟹薪邪褔懈
+pdfjs-comment-floating-button =
+    .title = 袣芯屑械薪褌邪褉
+    .aria-label = 袣芯屑械薪褌邪褉
+pdfjs-comment-floating-button-label = 袧邪锌芯屑械薪邪
+pdfjs-editor-comment-button =
+    .title = 袣芯屑械薪褌邪褉
+    .aria-label = 袣芯屑械薪褌邪褉
+pdfjs-editor-comment-button-label = 袣芯屑械薪褌邪褉
+pdfjs-editor-signature-button =
+    .title = 袛芯写邪褬 锌芯褌锌懈褋
+pdfjs-editor-signature-button-label = 袛芯写邪褬 锌芯褌锌懈褋
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 校褉械褣懈胁邪褔 懈褋褌懈褑邪褮邪
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 校褉械褣懈胁邪褔 褑褉褌邪褮邪
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 校褉械褣懈胁邪褔 锌芯褌锌懈褋邪: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 校褉械褣懈胁邪褔 褋谢懈泻邪
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 校泻谢芯薪懈 褑褉褌械卸
+pdfjs-editor-remove-freetext-button =
+    .title = 校泻谢芯薪懈 褌械泻褋褌
+pdfjs-editor-remove-stamp-button =
+    .title = 校泻谢芯薪懈 褋谢懈泻褍
+pdfjs-editor-remove-highlight-button =
+    .title = 校泻谢芯薪懈 芯蟹薪邪泻褍
+pdfjs-editor-remove-signature-button =
+    .title = 校泻谢芯薪懈 锌芯褌锌懈褋
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 袘芯褬邪
+pdfjs-editor-free-text-size-input = 袙械谢懈褔懈薪邪
+pdfjs-editor-ink-color-input = 袘芯褬邪
+pdfjs-editor-ink-thickness-input = 袛械斜褭懈薪邪
+pdfjs-editor-ink-opacity-input = 袨锌邪褑懈褌械褌
+pdfjs-editor-stamp-add-image-button =
+    .title = 袛芯写邪褬 褋谢懈泻褍
+pdfjs-editor-stamp-add-image-button-label = 袛芯写邪褬 褋谢懈泻褍
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 袛械斜褭懈薪邪
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 袩褉芯屑械薪懈 写械斜褭懈薪褍 锌褉懈 芯蟹薪邪褔邪胁邪褮褍 写褉褍谐懈褏 褋褌邪胁泻懈 褋械屑 褌械泻褋褌邪
+pdfjs-editor-add-signature-container =
+    .aria-label = 袣芯薪褌褉芯谢械 锌芯褌锌懈褋邪 懈 褋邪褔褍胁邪薪懈 锌芯褌锌懈褋懈
+pdfjs-editor-signature-add-signature-button =
+    .title = 袛芯写邪褬 薪芯胁懈 锌芯褌锌懈褋
+pdfjs-editor-signature-add-signature-button-label = 袛芯写邪褬 薪芯胁懈 锌芯褌锌懈褋
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 小邪褔褍胁邪薪懈 锌芯褌锌懈褋: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 校褉械褣懈胁邪褔 褌械泻褋褌邪
+    .default-content = 袩芯褔薪懈 泻褍褑邪褌懈鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 袧邪锌芯屑械薪邪
+        [few] 袧邪锌芯屑械薪械
+       *[other] 袧邪锌芯屑械薪械
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 袟邪褌胁芯褉懈 斜芯褔薪褍 锌芯胁褉褕
+    .aria-label = 袟邪褌胁芯褉懈 斜芯褔薪褍 锌芯胁褉褕
+pdfjs-editor-comments-sidebar-close-button-label = 袟邪褌胁芯褉懈 斜芯褔薪褍 锌芯胁褉褕
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 袙懈写懈褌械 薪械褕褌芯 胁褉械写薪芯 锌邪卸褮械? 袠褋褌邪泻薪懈褌械 褌芯 懈 芯褋褌邪胁懈褌械 薪邪锌芯屑械薪褍.
+pdfjs-editor-comments-sidebar-no-comments-link = 小邪蟹薪邪褬褌械 胁懈褕械
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 袗谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 校褉械写懈 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+pdfjs-editor-alt-text-dialog-label = 袨写邪斜械褉懈 芯锌褑懈褬褍
+pdfjs-editor-alt-text-dialog-description = 袗谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 锌芯屑邪卸械 褋谢械锌懈屑 懈 褋谢邪斜芯胁懈写懈屑 芯褋芯斜邪屑邪 懈谢懈 泻邪写邪 褋械 褋谢懈泻邪 薪械 褍褔懈褌邪.
+pdfjs-editor-alt-text-add-description-label = 袛芯写邪褬 芯锌懈褋
+pdfjs-editor-alt-text-add-description-description = 小邪卸屑懈褌械 褍 1-2 褉械褔械薪懈褑械 泻芯褬械 芯锌懈褋褍褬褍 锌褉械写屑械褌, 芯泻褉褍卸械褮械 懈谢懈 褉邪写褮械.
+pdfjs-editor-alt-text-mark-decorative-label = 袨蟹薪邪褔懈 泻邪芯 褍泻褉邪褋薪芯
+pdfjs-editor-alt-text-mark-decorative-description = 袨胁芯 褬械 蟹邪 褍泻褉邪褋薪械 褋谢懈泻械, 泻邪芯 褕褌芯 褋褍 懈胁懈褑械 懈谢懈 胁芯写械薪懈 锌械褔邪褌懈.
+pdfjs-editor-alt-text-cancel-button = 袨褌泻邪卸懈
+pdfjs-editor-alt-text-save-button = 小邪褔褍胁邪褬
+pdfjs-editor-alt-text-decorative-tooltip = 袨蟹薪邪褔械薪芯 泻邪芯 褍泻褉邪褋薪芯
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 袧邪 锌褉懈屑械褉: 鈥炐溞恍靶葱秆� 褋械写邪 蟹邪 褋褌芯 写邪 褬械写械鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 袗谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 袚芯褉褮懈 谢械胁懈 褍谐邪芯 鈥� 锌褉芯屑械薪懈 胁械谢懈褔懈薪褍
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 小褉械写懈薪邪 谐芯褉械 鈥� 锌褉芯屑械薪懈 胁械谢懈褔懈薪褍
+pdfjs-editor-resizer-top-right =
+    .aria-label = 袚芯褉褮懈 写械褋薪懈 褍谐邪芯 鈥� 锌褉芯屑械薪懈 胁械谢懈褔懈薪褍
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 小褉械写懈薪邪 写械褋薪芯 鈥� 锌褉芯屑械薪懈 胁械谢懈褔懈薪褍
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 袛芯褮懈 写械褋薪懈 褍谐邪芯 鈥� 锌褉芯屑械薪懈 胁械谢懈褔懈薪褍
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 小褉械写懈薪邪 写芯谢械 鈥� 锌褉芯屑械薪懈 胁械谢懈褔懈薪褍
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 袛芯褮懈 谢械胁懈 褍谐邪芯 鈥� 锌褉芯屑械薪懈 胁械谢懈褔懈薪褍
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 小褉械写懈薪邪 谢械胁芯 鈥� 锌褉芯屑械薪懈 胁械谢懈褔懈薪褍
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 袘芯褬邪 芯蟹薪邪褔邪胁邪褮邪
+pdfjs-editor-colorpicker-button =
+    .title = 袩褉芯屑械薪懈 斜芯褬褍
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 袠蟹斜芯褉 斜芯褬邪
+pdfjs-editor-colorpicker-yellow =
+    .title = 袞褍褌邪
+pdfjs-editor-colorpicker-green =
+    .title = 袟械谢械薪邪
+pdfjs-editor-colorpicker-blue =
+    .title = 袩谢邪胁邪
+pdfjs-editor-colorpicker-pink =
+    .title = 袪芯蟹械
+pdfjs-editor-colorpicker-red =
+    .title = 笑褉胁械薪邪
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 袩褉懈泻邪卸懈 褋胁械
+pdfjs-editor-highlight-show-all-button =
+    .title = 袩褉懈泻邪卸懈 褋胁械
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 校褉械写懈 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 (芯锌懈褋 褋谢懈泻械)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 袛芯写邪褬 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 (芯锌懈褋 褋谢懈泻械)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 袧邪锌懈褕懈 芯锌懈褋 芯胁写械鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 袣褉邪褌邪泻 芯锌懈褋 蟹邪 褋谢械锌械 懈 褋谢邪斜芯胁懈写械 褭褍写械 懈谢懈 泻邪写邪 褋械 褋谢懈泻邪 薪械 褍褋锌械 褍褔懈褌邪褌懈.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 袨胁邪褬 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 褬械 薪邪锌褉邪胁褭械薪 邪褍褌芯屑邪褌褋泻懈 懈 屑芯卸械 斜懈褌懈 薪械褌邪褔邪薪.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 小邪蟹薪邪褬褌械 胁懈褕械
+pdfjs-editor-new-alt-text-create-automatically-button-label = 袩褉邪胁懈 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 邪褍褌芯屑邪褌褋泻懈
+pdfjs-editor-new-alt-text-not-now-button = 袧械 褋邪写邪
+pdfjs-editor-new-alt-text-error-title = 袧懈褬械 屑芯谐褍褯械 褋邪屑芯褋褌邪谢薪芯 薪邪锌褉邪胁懈褌懈 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+pdfjs-editor-new-alt-text-error-description = 袧邪锌懈褕懈褌械 褋芯锌褋褌胁械薪懈 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 懈谢懈 锌芯泻褍褕邪褬褌械 锌芯薪芯胁芯 泻邪褋薪懈褬械.
+pdfjs-editor-new-alt-text-error-close-button = 袟邪褌胁芯褉懈
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 袩褉械褍蟹懈屑邪褮械 袙袠 屑芯写械谢邪 蟹邪 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 ({ $downloadedSize } 芯写 { $totalSize } MB)
+    .aria-valuetext = 袩褉械褍蟹懈屑邪褮械 袙袠 屑芯写械谢邪 蟹邪 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 ({ $downloadedSize } 芯写 { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 袗谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 褬械 写芯写邪褌
+pdfjs-editor-new-alt-text-added-button-label = 袗谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 褬械 写芯写邪褌
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 袧械写芯褋褌邪褬械 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+pdfjs-editor-new-alt-text-missing-button-label = 袧械写芯褋褌邪褬械 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 袩褉械谐谢械写邪褬 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+pdfjs-editor-new-alt-text-to-review-button-label = 袩褉械谐谢械写邪褬 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 袗褍褌芯屑邪褌褋泻懈 薪邪锌褉邪胁褭械薪芯: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 袩芯写械褕邪胁邪褮邪 邪谢褌械褉薪邪褌懈胁薪芯谐 褌械泻褋褌邪 褋谢懈泻械
+pdfjs-image-alt-text-settings-button-label = 袩芯写械褕邪胁邪褮邪 邪谢褌械褉薪邪褌懈胁薪芯谐 褌械泻褋褌邪 褋谢懈泻械
+pdfjs-editor-alt-text-settings-dialog-label = 袩芯写械褕邪胁邪褮邪 邪谢褌械褉薪邪褌懈胁薪芯谐 褌械泻褋褌邪 褋谢懈泻械
+pdfjs-editor-alt-text-settings-automatic-title = 袗褍褌芯屑邪褌褋泻懈 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+pdfjs-editor-alt-text-settings-create-model-button-label = 袗褍褌芯屑邪褌褋泻懈 锌褉邪胁懈 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌
+pdfjs-editor-alt-text-settings-create-model-description = 袩褉械写谢邪卸械 芯锌懈褋械 泻邪泻芯 斜懈 褋械 锌芯屑芯谐谢芯 褭褍写懈屑邪 泻芯褬懈 薪械 胁懈写械 褋谢懈泻褍 懈谢懈 泻邪写邪 褋械 褋谢懈泻邪 薪械 褍褔懈褌邪.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 袙袠 屑芯写械谢 蟹邪 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌 ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = 袪邪写懈 谢芯泻邪谢薪芯 薪邪 胁邪褕械屑 褍褉械褣邪褬褍 褌邪泻芯 写邪 胁邪褕懈 锌芯写邪褑懈 芯褋褌邪褬褍 锌褉懈胁邪褌薪懈. 袩芯褌褉械斜薪芯 蟹邪 邪褍褌芯屑邪褌褋泻懈 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌.
+pdfjs-editor-alt-text-settings-delete-model-button = 袨斜褉懈褕懈
+pdfjs-editor-alt-text-settings-download-model-button = 袩褉械褍蟹屑懈
+pdfjs-editor-alt-text-settings-downloading-model-button = 袩褉械褍蟹懈屑邪褮械鈥�
+pdfjs-editor-alt-text-settings-editor-title = 校褉械褣懈胁邪褔 邪谢褌械褉薪邪褌懈胁薪芯谐 褌械泻褋褌邪
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 袩褉懈泻邪卸懈 褍褉械褣懈胁邪褔 邪谢褌械褉薪邪褌懈胁薪芯谐 褌械泻褋褌邪 芯写屑邪褏 锌褉懈 写芯写邪胁邪褮褍 褋谢懈泻械
+pdfjs-editor-alt-text-settings-show-dialog-description = 袩芯屑邪卸械 胁邪屑 写邪 褋胁械 胁邪褕械 褋谢懈泻械 懈屑邪褬褍 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌.
+pdfjs-editor-alt-text-settings-close-button = 袟邪褌胁芯褉懈
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 袠褋褌懈褑邪褮械 褬械 写芯写邪褌芯
+pdfjs-editor-freetext-added-alert = 孝械泻褋褌 褬械 写芯写邪褌
+pdfjs-editor-ink-added-alert = 笑褉褌械卸 褬械 写芯写邪褌
+pdfjs-editor-stamp-added-alert = 小谢懈泻邪 褬械 写芯写邪褌邪
+pdfjs-editor-signature-added-alert = 袩芯褌锌懈褋 褬械 写芯写邪褌
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 袠褋褌懈褑邪褮械 褬械 褍泻谢芯褮械薪芯
+pdfjs-editor-undo-bar-message-freetext = 孝械泻褋褌 褬械 褍泻谢芯褮械薪
+pdfjs-editor-undo-bar-message-ink = 笑褉褌械卸 褬械 褍泻谢芯褮械薪
+pdfjs-editor-undo-bar-message-stamp = 小谢懈泻邪 褬械 褍泻谢芯褮械薪邪
+pdfjs-editor-undo-bar-message-signature = 袩芯褌锌懈褋 褬械 褍泻谢芯褮械薪
+pdfjs-editor-undo-bar-message-comment = 袣芯屑械薪褌邪褉 褬械 褍泻谢芯褮械薪
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] 校泻谢芯褮械薪邪 褬械 { $count } 蟹邪斜械谢械褕泻邪
+        [few] 校泻谢芯褮械薪械 褋褍 { $count } 蟹邪斜械谢械褕泻械
+       *[other] 校泻谢芯褮械薪芯 褬械 { $count } 蟹邪斜械谢械褕泻懈
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 袨锌芯蟹芯胁懈
+pdfjs-editor-undo-bar-undo-button-label = 袨锌芯蟹芯胁懈
+pdfjs-editor-undo-bar-close-button =
+    .title = 袟邪褌胁芯褉懈
+pdfjs-editor-undo-bar-close-button-label = 袟邪褌胁芯褉懈
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 袨胁邪褬 锌褉芯蟹芯褉 芯屑芯谐褍褯邪胁邪 泻芯褉懈褋薪懈泻褍 写邪 薪邪锌褉邪胁懈 锌芯褌锌懈褋 泻芯褬懈 褯械 写芯写邪褌懈 褍 袩袛肖 写芯泻褍屑械薪褌. 袣芯褉懈褋薪懈泻 屑芯卸械 写邪 褍褉械写懈 懈屑械 (泻芯褬械 褌邪泻芯褣械 褋谢褍卸懈 泻邪芯 邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌) 懈 芯锌褑懈芯薪芯 褋邪褔褍胁邪 锌芯褌锌懈褋 蟹邪 锌芯薪芯胁薪褍 褍锌芯褌褉械斜褍.
+pdfjs-editor-add-signature-dialog-title = 袛芯写邪褬 锌芯褌锌懈褋
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 袣褍褑邪褬
+    .title = 袣褍褑邪褬
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 笑褉褌邪褬
+    .title = 笑褉褌邪褬
+pdfjs-editor-add-signature-image-button = 小谢懈泻邪
+    .title = 小谢懈泻邪
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 校泻褍褑邪褬褌械 褋胁芯褬 锌芯褌锌懈褋
+    .placeholder = 校泻褍褑邪褬褌械 褋胁芯褬 锌芯褌锌懈褋
+pdfjs-editor-add-signature-draw-placeholder = 袧邪褑褉褌邪褬褌械 褋胁芯褬 锌芯褌锌懈褋
+pdfjs-editor-add-signature-draw-thickness-range-label = 袛械斜褭懈薪邪
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 袛械斜褭懈薪邪 褑褉褌邪褮邪: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 袩褉械胁褍褑懈褌械 写邪褌芯褌械泻褍 芯胁写械 蟹邪 芯褌锌褉械屑邪褮械
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 袠谢懈 懈蟹邪斜械褉懈褌械 写邪褌芯褌械泻械 褋谢懈泻邪
+       *[other] 袠谢懈 锌芯褌褉邪卸懈褌械 写邪褌芯褌械泻械 褋谢懈泻邪
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 袨锌懈褋 (邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌)
+pdfjs-editor-add-signature-description-input =
+    .title = 袨锌懈褋 (邪谢褌械褉薪邪褌懈胁薪懈 褌械泻褋褌)
+pdfjs-editor-add-signature-description-default-when-drawing = 袩芯褌锌懈褋
+pdfjs-editor-add-signature-clear-button-label = 袨斜褉懈褕懈 锌芯褌锌懈褋
+pdfjs-editor-add-signature-clear-button =
+    .title = 袨斜褉懈褕懈 锌芯褌锌懈褋
+pdfjs-editor-add-signature-save-checkbox = 小邪褔褍胁邪褬 锌芯褌锌懈褋
+pdfjs-editor-add-signature-save-warning-message = 袛芯褋褌懈谐谢懈 褋褌械 芯谐褉邪薪懈褔械褮械 芯写 5 褋邪褔褍胁邪薪懈褏 锌芯褌锌懈褋邪. 校泻谢芯薪懈褌械 褬械写邪薪 写邪 斜懈褋褌械 褋邪褔褍胁邪谢懈 胁懈褕械.
+pdfjs-editor-add-signature-image-upload-error-title = 袧懈褬械 屑芯谐褍褯械 芯褌锌褉械屑懈褌懈 褋谢懈泻褍
+pdfjs-editor-add-signature-image-upload-error-description = 袩褉芯胁械褉懈褌械 褋胁芯褬褍 屑褉械卸薪褍 胁械蟹褍 懈谢懈 锌芯泻褍褕邪褬褌械 褋邪 写褉褍谐芯屑 褋谢懈泻芯屑.
+pdfjs-editor-add-signature-image-no-data-error-title = 袨胁邪 褋谢懈泻邪 褋械 薪械 屑芯卸械 锌褉械褌胁芯褉懈褌懈 褍 锌芯褌锌懈褋
+pdfjs-editor-add-signature-image-no-data-error-description = 袩芯泻褍褕邪褬褌械 写邪 芯褌锌褉械屑懈褌械 写褉褍谐褍 褋谢懈泻褍.
+pdfjs-editor-add-signature-error-close-button = 袟邪褌胁芯褉懈
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 袨褌泻邪卸懈
+pdfjs-editor-add-signature-add-button = 袛芯写邪褬
+pdfjs-editor-edit-signature-update-button = 袗卸褍褉懈褉邪褬
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 校褉械写懈 泻芯屑械薪褌邪褉
+pdfjs-editor-edit-comment-popup-button =
+    .title = 校褉械写懈 泻芯屑械薪褌邪褉
+pdfjs-editor-delete-comment-popup-button-label = 校泻谢芯薪懈 泻芯屑械薪褌邪褉
+pdfjs-editor-delete-comment-popup-button =
+    .title = 校泻谢芯薪懈 泻芯屑械薪褌邪褉
+pdfjs-show-comment-button =
+    .title = 袩褉懈泻邪卸懈 薪邪锌芯屑械薪褍
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 校褉械写懈 薪邪锌芯屑械薪褍
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 袗卸褍褉懈褉邪褬
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 袛芯写邪褬 薪邪锌芯屑械薪褍
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 袛芯写邪褬
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 袩芯褔薪懈褌械 写邪 泻褍褑邪褌械鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 袨褌泻邪卸懈
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 袛芯写邪褬 薪邪锌芯屑械薪褍
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 袩褉懈泻邪卸懈/褋邪泻褉懈褬 斜芯褔薪褍 锌芯胁褉褕 (写芯泻褍屑械薪褌 褋邪写褉卸懈 褍屑邪褮械薪械 褋谢懈褔懈褑械/芯泻胁懈褉/锌褉懈谢芯谐械/褋谢芯褬械胁械)
+pdfjs-toggle-views-manager-button1-label = 校锌褉邪胁褭邪褬 褋褌褉邪薪懈褑邪屑邪
+pdfjs-views-manager-sidebar =
+    .aria-label = 袘芯褔薪邪 锌芯胁褉褕
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 袩褉芯屑械薪邪 胁械谢懈褔懈薪械 斜芯褔薪械 锌芯胁褉褕懈
+pdfjs-views-manager-view-selector-button =
+    .title = 袩褉械谐谢械写懈
+pdfjs-views-manager-view-selector-button-label = 袩褉械谐谢械写懈
+pdfjs-views-manager-pages-title = 小褌褉邪薪懈褑械
+pdfjs-views-manager-outlines-title1 = 袣芯薪褌褍褉邪 写芯泻褍屑械薪褌邪
+    .title = 袣芯薪褌褍褉邪 写芯泻褍屑械薪褌邪 (写胁芯泻谢懈泻 蟹邪 褕懈褉械褮械/褋泻褍锌褭邪褮械 褋胁懈褏 褋褌邪胁泻懈)
+pdfjs-views-manager-attachments-title = 袩褉懈谢芯蟹懈
+pdfjs-views-manager-layers-title1 = 小谢芯褬械胁懈
+    .title = 小谢芯褬械胁懈 (写胁芯泻谢懈泻 蟹邪 胁褉邪褯邪褮械 褋胁懈褏 褋谢芯褬械胁邪 褍 锌芯写褉邪蟹褍屑械胁邪薪芯 褋褌邪褮械)
+pdfjs-views-manager-pages-option-label = 小褌褉邪薪懈褑械
+pdfjs-views-manager-outlines-option-label = 袣芯薪褌褍褉邪 写芯泻褍屑械薪褌邪
+pdfjs-views-manager-attachments-option-label = 袩褉懈谢芯蟹懈
+pdfjs-views-manager-layers-option-label = 小谢芯褬械胁懈
+pdfjs-views-manager-add-file-button =
+    .title = 袛芯写邪褬 写邪褌芯褌械泻褍
+pdfjs-views-manager-add-file-button-label = 袛芯写邪褬 写邪褌芯褌械泻褍
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] 袠蟹邪斜褉邪薪邪 褬械 { $count } 褋褌褉邪薪懈褑邪
+        [few] 袠蟹邪斜褉邪薪械 褋褍 { $count } 褋褌褉邪薪懈褑械
+       *[other] 袠蟹邪斜褉邪薪芯 褬械 { $count } 褋褌褉邪薪懈褑邪
+    }
+pdfjs-views-manager-pages-status-none-action-label = 袠蟹邪斜械褉懈褌械 褋褌褉邪薪懈褑械
+pdfjs-views-manager-pages-status-action-button-label = 校锌褉邪胁褭邪褬
+pdfjs-views-manager-pages-status-copy-button-label = 校屑薪芯卸懈
+pdfjs-views-manager-pages-status-cut-button-label = 袠褋械褑懈
+pdfjs-views-manager-pages-status-delete-button-label = 袨斜褉懈褕懈
+pdfjs-views-manager-pages-status-export-selected-button-label = 袠蟹胁械蟹懈 懈蟹邪斜褉邪薪芯鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 袠褋械褔械薪邪 褬械 1 褋褌褉邪薪懈褑邪
+        [few] 袠褋械褔械薪械 褋褍 { $count } 褋褌褉邪薪懈褑械
+       *[other] 袠褋械褔械薪芯 褬械 { $count } 褋褌褉邪薪懈褑邪
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 校屑薪芯卸械薪邪 褬械 1 褋褌褉邪薪懈褑邪
+        [few] 校屑薪芯卸械薪械 褋褍 { $count } 褋褌褉邪薪懈褑械
+       *[other] 校屑薪芯卸械薪芯 褬械 { $count } 褋褌褉邪薪懈褑邪
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 袨斜褉懈褋邪薪邪 褬械 1 褋褌褉邪薪懈褑邪
+        [few] 袨斜褉懈褋邪薪械 褋褍 { $count } 褋褌褉邪薪懈褑械
+       *[other] 袨斜褉懈褋邪薪芯 褬械 { $count } 褋褌褉邪薪懈褑邪
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 袩褉懈锌褉械屑邪屑 写邪褌芯褌械泻褍鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 袨褌锌褉械屑邪屑 写邪褌芯褌械泻褍鈥�
+pdfjs-views-manager-status-warning-cut-label = 袧械 屑芯谐褍 写邪 懈褋械褔械屑. 袨褋胁械卸懈褌械 褋褌褉邪薪懈褑褍 懈 锌芯泻褍褕邪褬褌械 锌芯薪芯胁芯.
+pdfjs-views-manager-status-warning-copy-label = 袧械 屑芯谐褍 写邪 褍屑薪芯卸懈屑. 袨褋胁械卸懈褌械 褋褌褉邪薪懈褑褍 懈 锌芯泻褍褕邪褬褌械 锌芯薪芯胁芯.
+pdfjs-views-manager-status-warning-delete-label = 袧械 屑芯谐褍 写邪 芯斜褉懈褕械屑. 袨褋胁械卸懈褌械 褋褌褉邪薪懈褑褍 懈 锌芯泻褍褕邪褬褌械 锌芯薪芯胁芯.
+pdfjs-views-manager-status-warning-save-label = 袧械 屑芯谐褍 写邪 褋邪褔褍胁邪屑. 袨褋胁械卸懈褌械 褋褌褉邪薪懈褑褍 懈 锌芯泻褍褕邪褬褌械 锌芯薪芯胁芯.
+pdfjs-views-manager-status-undo-button-label = 袨锌芯蟹芯胁懈
+pdfjs-views-manager-status-done-button-label = 袚芯褌芯胁芯
+pdfjs-views-manager-status-close-button =
+    .title = 袟邪褌胁芯褉懈
+pdfjs-views-manager-status-close-button-label = 袟邪褌胁芯褉懈
+pdfjs-views-manager-paste-button-label = 校斜邪褑懈
+pdfjs-views-manager-paste-button-before =
+    .title = 校斜邪褑懈 锌褉械 锌褉胁械 褋褌褉邪薪懈褑械
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 校斜邪褑懈 锌芯褋谢械 褋褌褉邪薪懈褑械 { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 袧袨袙袨
+pdfjs-views-manager-waiting-for-file = 袨褌锌褉械屑邪屑 写邪褌芯褌械泻褍鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 校锌褉邪胁褭邪褬 褋褌褉邪薪懈褑邪屑邪
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 校泻谢芯薪懈 褋邪褔褍胁邪薪懈 锌芯褌锌懈褋
+pdfjs-editor-delete-signature-button-label1 = 校泻谢芯薪懈 褋邪褔褍胁邪薪懈 锌芯褌锌懈褋
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 校褉械写懈 芯锌懈褋
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 校褉械写懈 芯锌懈褋
diff --git a/public/pdfjs/web/locale/sv-SE/viewer.ftl b/public/pdfjs/web/locale/sv-SE/viewer.ftl
new file mode 100644
index 0000000..edd9423
--- /dev/null
+++ b/public/pdfjs/web/locale/sv-SE/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = F枚reg氓ende sida
+pdfjs-previous-button-label = F枚reg氓ende
+pdfjs-next-button =
+    .title = N盲sta sida
+pdfjs-next-button-label = N盲sta
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Sida
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = av { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } av { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zooma ut
+pdfjs-zoom-out-button-label = Zooma ut
+pdfjs-zoom-in-button =
+    .title = Zooma in
+pdfjs-zoom-in-button-label = Zooma in
+pdfjs-zoom-select =
+    .title = Zoom
+pdfjs-presentation-mode-button =
+    .title = Byt till presentationsl盲ge
+pdfjs-presentation-mode-button-label = Presentationsl盲ge
+pdfjs-open-file-button =
+    .title = 脰ppna fil
+pdfjs-open-file-button-label = 脰ppna
+pdfjs-print-button =
+    .title = Skriv ut
+pdfjs-print-button-label = Skriv ut
+pdfjs-save-button =
+    .title = Spara
+pdfjs-save-button-label = Spara
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = H盲mta
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = H盲mta
+pdfjs-bookmark-button =
+    .title = Aktuell sida (Visa URL fr氓n aktuell sida)
+pdfjs-bookmark-button-label = Aktuell sida
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Verktyg
+pdfjs-tools-button-label = Verktyg
+pdfjs-first-page-button =
+    .title = G氓 till f枚rsta sidan
+pdfjs-first-page-button-label = G氓 till f枚rsta sidan
+pdfjs-last-page-button =
+    .title = G氓 till sista sidan
+pdfjs-last-page-button-label = G氓 till sista sidan
+pdfjs-page-rotate-cw-button =
+    .title = Rotera medurs
+pdfjs-page-rotate-cw-button-label = Rotera medurs
+pdfjs-page-rotate-ccw-button =
+    .title = Rotera moturs
+pdfjs-page-rotate-ccw-button-label = Rotera moturs
+pdfjs-cursor-text-select-tool-button =
+    .title = Aktivera textmarkeringsverktyg
+pdfjs-cursor-text-select-tool-button-label = Textmarkeringsverktyg
+pdfjs-cursor-hand-tool-button =
+    .title = Aktivera handverktyg
+pdfjs-cursor-hand-tool-button-label = Handverktyg
+pdfjs-scroll-page-button =
+    .title = Anv盲nd sidrullning
+pdfjs-scroll-page-button-label = Sidrullning
+pdfjs-scroll-vertical-button =
+    .title = Anv盲nd vertikal rullning
+pdfjs-scroll-vertical-button-label = Vertikal rullning
+pdfjs-scroll-horizontal-button =
+    .title = Anv盲nd horisontell rullning
+pdfjs-scroll-horizontal-button-label = Horisontell rullning
+pdfjs-scroll-wrapped-button =
+    .title = Anv盲nd 枚verlappande rullning
+pdfjs-scroll-wrapped-button-label = 脰verlappande rullning
+pdfjs-spread-none-button =
+    .title = Visa enkelsidor
+pdfjs-spread-none-button-label = Enkelsidor
+pdfjs-spread-odd-button =
+    .title = Visa uppslag med olika sidnummer till v盲nster
+pdfjs-spread-odd-button-label = Uppslag med framsida
+pdfjs-spread-even-button =
+    .title = Visa uppslag med lika sidnummer till v盲nster
+pdfjs-spread-even-button-label = Uppslag utan framsida
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Dokumentegenskaper鈥�
+pdfjs-document-properties-button-label = Dokumentegenskaper鈥�
+pdfjs-document-properties-file-name = Filnamn:
+pdfjs-document-properties-file-size = Filstorlek:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } byte)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte)
+pdfjs-document-properties-title = Titel:
+pdfjs-document-properties-author = F枚rfattare:
+pdfjs-document-properties-subject = 脛mne:
+pdfjs-document-properties-keywords = Nyckelord:
+pdfjs-document-properties-creation-date = Skapades:
+pdfjs-document-properties-modification-date = 脛ndrades:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Skapare:
+pdfjs-document-properties-producer = PDF-producent:
+pdfjs-document-properties-version = PDF-version:
+pdfjs-document-properties-page-count = Sidantal:
+pdfjs-document-properties-page-size = Pappersstorlek:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = portr盲tt
+pdfjs-document-properties-page-size-orientation-landscape = landskap
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Snabb webbvisning:
+pdfjs-document-properties-linearized-yes = Ja
+pdfjs-document-properties-linearized-no = Nej
+pdfjs-document-properties-close-button = St盲ng
+
+## Print
+
+pdfjs-print-progress-message = F枚rbereder sidor f枚r utskrift鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Avbryt
+pdfjs-printing-not-supported = Varning: Utskrifter st枚ds inte helt av den h盲r webbl盲saren.
+pdfjs-printing-not-ready = Varning: PDF:en 盲r inte klar f枚r utskrift.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Visa/d枚lj sidof盲lt
+pdfjs-toggle-sidebar-notification-button =
+    .title = V盲xla sidof盲lt (dokumentet inneh氓ller dokumentstruktur/bilagor/lager)
+pdfjs-toggle-sidebar-button-label = Visa/d枚lj sidof盲lt
+pdfjs-document-outline-button =
+    .title = Visa dokumentdisposition (dubbelklicka f枚r att expandera/komprimera alla objekt)
+pdfjs-document-outline-button-label = Dokument枚versikt
+pdfjs-attachments-button =
+    .title = Visa Bilagor
+pdfjs-attachments-button-label = Bilagor
+pdfjs-layers-button =
+    .title = Visa lager (dubbelklicka f枚r att 氓terst盲lla alla lager till standardl盲ge)
+pdfjs-layers-button-label = Lager
+pdfjs-thumbs-button =
+    .title = Visa miniatyrer
+pdfjs-thumbs-button-label = Miniatyrer
+pdfjs-current-outline-item-button =
+    .title = Hitta aktuellt dispositionsobjekt
+pdfjs-current-outline-item-button-label = Aktuellt dispositionsobjekt
+pdfjs-findbar-button =
+    .title = S枚k i dokument
+pdfjs-findbar-button-label = S枚k
+pdfjs-additional-layers = Ytterligare lager
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Sida { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatyr av sida { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = V盲lj sida { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Sida { $page } av { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = S枚k
+    .placeholder = S枚k i dokument鈥�
+pdfjs-find-previous-button =
+    .title = Hitta f枚reg氓ende f枚rekomst av frasen
+pdfjs-find-previous-button-label = F枚reg氓ende
+pdfjs-find-next-button =
+    .title = Hitta n盲sta f枚rekomst av frasen
+pdfjs-find-next-button-label = N盲sta
+pdfjs-find-highlight-checkbox = Markera alla
+pdfjs-find-match-case-checkbox-label = Matcha versal/gemen
+pdfjs-find-match-diacritics-checkbox-label = Matcha diakritiska tecken
+pdfjs-find-entire-word-checkbox-label = Hela ord
+pdfjs-find-reached-top = N氓dde b枚rjan av dokumentet, b枚rjade fr氓n slutet
+pdfjs-find-reached-bottom = N氓dde slutet p氓 dokumentet, b枚rjade fr氓n b枚rjan
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } av { $total } match
+       *[other] { $current } av { $total } matchningar
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] Mer 盲n { $limit } matchning
+       *[other] Fler 盲n { $limit } matchningar
+    }
+pdfjs-find-not-found = Frasen hittades inte
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Sidbredd
+pdfjs-page-scale-fit = Anpassa sida
+pdfjs-page-scale-auto = Automatisk zoom
+pdfjs-page-scale-actual = Verklig storlek
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Sida { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = Ett fel uppstod vid laddning av PDF-filen.
+pdfjs-invalid-file-error = Ogiltig eller korrupt PDF-fil.
+pdfjs-missing-file-error = Saknad PDF-fil.
+pdfjs-unexpected-response-error = Ov盲ntat svar fr氓n servern.
+pdfjs-rendering-error = Ett fel uppstod vid visning av sidan.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type }-annotering]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Skriv in l枚senordet f枚r att 枚ppna PDF-filen.
+pdfjs-password-invalid = Ogiltigt l枚senord. F枚rs枚k igen.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Avbryt
+pdfjs-web-fonts-disabled = Webbtypsnitt 盲r inaktiverade: kan inte anv盲nda inb盲ddade PDF-typsnitt.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Text
+pdfjs-editor-color-picker-free-text-input =
+    .title = 脛ndra textf盲rg
+pdfjs-editor-free-text-button-label = Text
+pdfjs-editor-ink-button =
+    .title = Rita
+pdfjs-editor-color-picker-ink-input =
+    .title = 脛ndra ritningsf盲rg
+pdfjs-editor-ink-button-label = Rita
+pdfjs-editor-stamp-button =
+    .title = L盲gg till eller redigera bilder
+pdfjs-editor-stamp-button-label = L盲gg till eller redigera bilder
+pdfjs-editor-highlight-button =
+    .title = Markera
+pdfjs-editor-highlight-button-label = Markera
+pdfjs-highlight-floating-button1 =
+    .title = Markera
+    .aria-label = Markera
+pdfjs-highlight-floating-button-label = Markera
+pdfjs-comment-floating-button =
+    .title = Kommentar
+    .aria-label = Kommentar
+pdfjs-comment-floating-button-label = Kommentar
+pdfjs-editor-comment-button =
+    .title = Kommentar
+    .aria-label = Kommentar
+pdfjs-editor-comment-button-label = Kommentar
+pdfjs-editor-signature-button =
+    .title = L盲gg till signatur
+pdfjs-editor-signature-button-label = L盲gg till signatur
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Markeringsredigerare
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Ritredigerare
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Signaturredigerare: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Bildredigerare
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = Ta bort ritning
+pdfjs-editor-remove-freetext-button =
+    .title = Ta bort text
+pdfjs-editor-remove-stamp-button =
+    .title = Ta bort bild
+pdfjs-editor-remove-highlight-button =
+    .title = Ta bort markering
+pdfjs-editor-remove-signature-button =
+    .title = Ta bort signatur
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = F盲rg
+pdfjs-editor-free-text-size-input = Storlek
+pdfjs-editor-ink-color-input = F盲rg
+pdfjs-editor-ink-thickness-input = Tjocklek
+pdfjs-editor-ink-opacity-input = Opacitet
+pdfjs-editor-stamp-add-image-button =
+    .title = L盲gg till bild
+pdfjs-editor-stamp-add-image-button-label = L盲gg till bild
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Tjocklek
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 脛ndra tjocklek n盲r du markerar andra objekt 盲n text
+pdfjs-editor-add-signature-container =
+    .aria-label = Signaturkontroller och sparade signaturer
+pdfjs-editor-signature-add-signature-button =
+    .title = L盲gg till ny signatur
+pdfjs-editor-signature-add-signature-button-label = L盲gg till ny signatur
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Sparad signatur: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Textredigerare
+    .default-content = B枚rja skriva鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Kommentar
+       *[other] Kommentarer
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = St盲ng sidof盲ltet
+    .aria-label = St盲ng sidof盲ltet
+pdfjs-editor-comments-sidebar-close-button-label = St盲ng sidof盲ltet
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Ser du n氓got anm盲rkningsv盲rt? Markera det och l盲mna en kommentar.
+pdfjs-editor-comments-sidebar-no-comments-link = L盲s mer
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternativ text
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Redigera alternativ text
+pdfjs-editor-alt-text-dialog-label = V盲lj ett alternativ
+pdfjs-editor-alt-text-dialog-description = Alt text (alternativ text) hj盲lper till n盲r m盲nniskor inte kan se bilden eller n盲r den inte laddas.
+pdfjs-editor-alt-text-add-description-label = L盲gg till en beskrivning
+pdfjs-editor-alt-text-add-description-description = Sikta p氓 1-2 meningar som beskriver 盲mnet, milj枚n eller handlingen.
+pdfjs-editor-alt-text-mark-decorative-label = Markera som dekorativ
+pdfjs-editor-alt-text-mark-decorative-description = Detta anv盲nds f枚r dekorativa bilder, som kanter eller vattenst盲mplar.
+pdfjs-editor-alt-text-cancel-button = Avbryt
+pdfjs-editor-alt-text-save-button = Spara
+pdfjs-editor-alt-text-decorative-tooltip = M盲rkt som dekorativ
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = Till exempel, "En ung man s盲tter sig vid ett bord f枚r att 盲ta en m氓ltid"
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternativ text
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Det 枚vre v盲nstra h枚rnet 鈥� 盲ndra storlek
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 脰verst i mitten 鈥� 盲ndra storlek
+pdfjs-editor-resizer-top-right =
+    .aria-label = Det 枚vre h枚gra h枚rnet 鈥� 盲ndra storlek
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Mitten h枚ger 鈥� 盲ndra storlek
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Nedre h枚gra h枚rnet 鈥� 盲ndra storlek
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Nedre mitten 鈥� 盲ndra storlek
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Nedre v盲nstra h枚rnet 鈥� 盲ndra storlek
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Mitten till v盲nster 鈥� 盲ndra storlek
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Markeringsf盲rg
+pdfjs-editor-colorpicker-button =
+    .title = 脛ndra f盲rg
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = F盲rgval
+pdfjs-editor-colorpicker-yellow =
+    .title = Gul
+pdfjs-editor-colorpicker-green =
+    .title = Gr枚n
+pdfjs-editor-colorpicker-blue =
+    .title = Bl氓
+pdfjs-editor-colorpicker-pink =
+    .title = Rosa
+pdfjs-editor-colorpicker-red =
+    .title = R枚d
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Visa alla
+pdfjs-editor-highlight-show-all-button =
+    .title = Visa alla
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Redigera alternativ text (bildbeskrivning)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = L盲gg till alternativ text (bildbeskrivning)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Skriv din beskrivning h盲r鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = Kort beskrivning f枚r personer som inte kan se bilden eller n盲r bilden inte laddas.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Denna alternativa text skapades automatiskt och kan vara felaktig.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = L盲s mer
+pdfjs-editor-new-alt-text-create-automatically-button-label = Skapa alternativ text automatiskt
+pdfjs-editor-new-alt-text-not-now-button = Inte nu
+pdfjs-editor-new-alt-text-error-title = Det gick inte att skapa alternativ text automatiskt
+pdfjs-editor-new-alt-text-error-description = Skriv din egna alternativa text eller f枚rs枚k igen senare.
+pdfjs-editor-new-alt-text-error-close-button = St盲ng
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = H盲mtar AI-modell med alternativ text ({ $downloadedSize } av { $totalSize } MB)
+    .aria-valuetext = H盲mtar AI-modell med alternativ text ({ $downloadedSize } av { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternativ text tillagd
+pdfjs-editor-new-alt-text-added-button-label = Alternativ text tillagd
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Saknar alternativ text
+pdfjs-editor-new-alt-text-missing-button-label = Saknar alternativ text
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Granska alternativ text
+pdfjs-editor-new-alt-text-to-review-button-label = Granska alternativ text
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Skapas automatiskt: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Alternativ textinst盲llningar f枚r bild
+pdfjs-image-alt-text-settings-button-label = Alternativ textinst盲llningar f枚r bild
+pdfjs-editor-alt-text-settings-dialog-label = Alternativ textinst盲llningar f枚r bild
+pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ text
+pdfjs-editor-alt-text-settings-create-model-button-label = Skapa alternativ text automatiskt
+pdfjs-editor-alt-text-settings-create-model-description = F枚resl氓r beskrivningar f枚r att hj盲lpa personer som inte kan se bilden eller n盲r bilden inte laddas.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = AI-modell f枚r alternativ text ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = K枚rs lokalt p氓 din enhet s氓 att din data f枚rblir privat. Kr盲vs f枚r automatisk alternativ text.
+pdfjs-editor-alt-text-settings-delete-model-button = Ta bort
+pdfjs-editor-alt-text-settings-download-model-button = H盲mta
+pdfjs-editor-alt-text-settings-downloading-model-button = H盲mtar鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alternativ textredigerare
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Visa alternativ textredigerare direkt n盲r du l盲gger till en bild
+pdfjs-editor-alt-text-settings-show-dialog-description = Hj盲lper dig att se till att alla dina bilder har alternativ text.
+pdfjs-editor-alt-text-settings-close-button = St盲ng
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Markering tillagd
+pdfjs-editor-freetext-added-alert = Text tillagd
+pdfjs-editor-ink-added-alert = Ritning tillagd
+pdfjs-editor-stamp-added-alert = Bild tillagd
+pdfjs-editor-signature-added-alert = Signatur tillagd
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Markering borttagen
+pdfjs-editor-undo-bar-message-freetext = Text borttagen
+pdfjs-editor-undo-bar-message-ink = Ritning borttagen
+pdfjs-editor-undo-bar-message-stamp = Bild borttagen
+pdfjs-editor-undo-bar-message-signature = Signatur borttagen
+pdfjs-editor-undo-bar-message-comment = Kommentar borttagen
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } anteckning har tagits bort
+       *[other] { $count } anteckningar har tagits bort
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 脜ngra
+pdfjs-editor-undo-bar-undo-button-label = 脜ngra
+pdfjs-editor-undo-bar-close-button =
+    .title = St盲ng
+pdfjs-editor-undo-bar-close-button-label = St盲ng
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Denna modal till氓ter anv盲ndaren att skapa en signatur f枚r att l盲gga till i ett PDF-dokument. Anv盲ndaren kan redigera namnet (som ocks氓 fungerar som alternativ text) och eventuellt spara signaturen f枚r upprepad anv盲ndning.
+pdfjs-editor-add-signature-dialog-title = L盲gg till en signatur
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Typ
+    .title = Typ
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = Rita
+    .title = Rita
+pdfjs-editor-add-signature-image-button = Bild
+    .title = Bild
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Skriv din signatur
+    .placeholder = Skriv din signatur
+pdfjs-editor-add-signature-draw-placeholder = Rita din signatur
+pdfjs-editor-add-signature-draw-thickness-range-label = Tjocklek
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = Ritningstjocklek: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Dra en fil hit f枚r att ladda upp
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Eller v盲lj bildfiler
+       *[other] Eller bl盲ddra bland bildfiler
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = Beskrivning (alternativ text)
+pdfjs-editor-add-signature-description-input =
+    .title = Beskrivning (alternativ text)
+pdfjs-editor-add-signature-description-default-when-drawing = Signatur
+pdfjs-editor-add-signature-clear-button-label = Rensa signatur
+pdfjs-editor-add-signature-clear-button =
+    .title = Rensa signatur
+pdfjs-editor-add-signature-save-checkbox = Spara signatur
+pdfjs-editor-add-signature-save-warning-message = Du har n氓tt gr盲nsen p氓 5 sparade signaturer. Ta bort en f枚r att spara fler.
+pdfjs-editor-add-signature-image-upload-error-title = Det gick inte att ladda upp bilden
+pdfjs-editor-add-signature-image-upload-error-description = Kontrollera din n盲tverksanslutning eller f枚rs枚k med en annan bild.
+pdfjs-editor-add-signature-image-no-data-error-title = Det g氓r inte att konvertera den h盲r bilden till en signatur
+pdfjs-editor-add-signature-image-no-data-error-description = Prova att ladda upp en annan bild.
+pdfjs-editor-add-signature-error-close-button = St盲ng
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Avbryt
+pdfjs-editor-add-signature-add-button = L盲gg till
+pdfjs-editor-edit-signature-update-button = Uppdatera
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Redigera kommentar
+pdfjs-editor-edit-comment-popup-button =
+    .title = Redigera kommentar
+pdfjs-editor-delete-comment-popup-button-label = Ta bort kommentar
+pdfjs-editor-delete-comment-popup-button =
+    .title = Ta bort kommentar
+pdfjs-show-comment-button =
+    .title = Visa kommentar
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Redigera kommentar
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = Uppdatera
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = L盲gg till kommentar
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = L盲gg till
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = B枚rja skriva鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = L盲gg till kommentar
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Visa/d枚lj sidof盲lt (dokument inneh氓ller miniatyrer/枚versikt/bilagor/lager)
+pdfjs-toggle-views-manager-button1-label = Hantera sidor
+pdfjs-views-manager-sidebar =
+    .aria-label = Sidof盲lt
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Storleks盲ndring av sidof盲lt
+pdfjs-views-manager-view-selector-button =
+    .title = Vyer
+pdfjs-views-manager-view-selector-button-label = Vyer
+pdfjs-views-manager-pages-title = Sidor
+pdfjs-views-manager-outlines-title1 = Dokument枚versikt
+    .title = Dokument枚versikt (dubbelklicka f枚r att expandera/komprimera alla objekt)
+pdfjs-views-manager-attachments-title = Bilagor
+pdfjs-views-manager-layers-title1 = Lager
+    .title = Lager (dubbelklicka f枚r att 氓terst盲lla alla lager till standardl盲ge)
+pdfjs-views-manager-pages-option-label = Sidor
+pdfjs-views-manager-outlines-option-label = Dokument枚versikt
+pdfjs-views-manager-attachments-option-label = Bilagor
+pdfjs-views-manager-layers-option-label = Lager
+pdfjs-views-manager-add-file-button =
+    .title = L盲gg till fil
+pdfjs-views-manager-add-file-button-label = L盲gg till fil
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } vald
+       *[other] { $count } valda
+    }
+pdfjs-views-manager-pages-status-none-action-label = V盲lj sidor
+pdfjs-views-manager-pages-status-action-button-label = Hantera
+pdfjs-views-manager-pages-status-copy-button-label = Kopiera
+pdfjs-views-manager-pages-status-cut-button-label = Klipp ut
+pdfjs-views-manager-pages-status-delete-button-label = Ta bort
+pdfjs-views-manager-pages-status-export-selected-button-label = Exportera markerad鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 sida klippt
+       *[other] { $count } sidor klippta
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 sida kopierad
+       *[other] { $count } sidor kopierade
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 sida borttagen
+       *[other] { $count } sidor borttagna
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = F枚rbereder din fil鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 脰verf枚r fil鈥�
+pdfjs-views-manager-status-warning-cut-label = Det gick inte att klippa. Uppdatera sidan och f枚rs枚k igen.
+pdfjs-views-manager-status-warning-copy-label = Det gick inte att kopiera. Uppdatera sidan och f枚rs枚k igen.
+pdfjs-views-manager-status-warning-delete-label = Det gick inte att ta bort. Uppdatera sidan och f枚rs枚k igen.
+pdfjs-views-manager-status-warning-save-label = Det gick inte att spara. Uppdatera sidan och f枚rs枚k igen.
+pdfjs-views-manager-status-undo-button-label = 脜ngra
+pdfjs-views-manager-status-done-button-label = Klar
+pdfjs-views-manager-status-close-button =
+    .title = St盲ng
+pdfjs-views-manager-status-close-button-label = St盲ng
+pdfjs-views-manager-paste-button-label = Klistra in
+pdfjs-views-manager-paste-button-before =
+    .title = Klistra in f枚re den f枚rsta sidan
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = Klistra in efter sida { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = NYTT
+pdfjs-views-manager-waiting-for-file = 脰verf枚r fil鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Hantera sidor
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Ta bort sparad signatur
+pdfjs-editor-delete-signature-button-label1 = Ta bort sparad signatur
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Redigera beskrivning
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Redigera beskrivning
diff --git a/public/pdfjs/web/locale/szl/viewer.ftl b/public/pdfjs/web/locale/szl/viewer.ftl
new file mode 100644
index 0000000..4ab6c8f
--- /dev/null
+++ b/public/pdfjs/web/locale/szl/viewer.ftl
@@ -0,0 +1,228 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Piyrwyjszo str艒na
+pdfjs-previous-button-label = Piyrwyjszo
+pdfjs-next-button =
+    .title = Nastympno str艒na
+pdfjs-next-button-label = Dalij
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Str艒na
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = ze聽{ $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } ze { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Zmy艅sz
+pdfjs-zoom-out-button-label = Zmy艅sz
+pdfjs-zoom-in-button =
+    .title = Zwiynksz
+pdfjs-zoom-in-button-label = Zwiynksz
+pdfjs-zoom-select =
+    .title = Srogo艣膰
+pdfjs-presentation-mode-button =
+    .title = Prze艂艒ncz na tryb prezyntacyje
+pdfjs-presentation-mode-button-label = Tryb prezyntacyje
+pdfjs-open-file-button =
+    .title = 脭dewrzij zbi艒r
+pdfjs-open-file-button-label = 脭dewrzij
+pdfjs-print-button =
+    .title = Durkuj
+pdfjs-print-button-label = Durkuj
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Noczynia
+pdfjs-tools-button-label = Noczynia
+pdfjs-first-page-button =
+    .title = Id藕 ku piyrszyj str艒nie
+pdfjs-first-page-button-label = Id藕 ku piyrszyj str艒nie
+pdfjs-last-page-button =
+    .title = Id藕 ku 么statnij str艒nie
+pdfjs-last-page-button-label = Id藕 ku 么statnij str艒nie
+pdfjs-page-rotate-cw-button =
+    .title = Zwyrtnij w prawo
+pdfjs-page-rotate-cw-button-label = Zwyrtnij w prawo
+pdfjs-page-rotate-ccw-button =
+    .title = Zwyrtnij w lewo
+pdfjs-page-rotate-ccw-button-label = Zwyrtnij w lewo
+pdfjs-cursor-text-select-tool-button =
+    .title = Za艂艒ncz noczynie 么biyranio tekstu
+pdfjs-cursor-text-select-tool-button-label = Noczynie 么biyranio tekstu
+pdfjs-cursor-hand-tool-button =
+    .title = Za艂艒ncz noczynie r艒nczka
+pdfjs-cursor-hand-tool-button-label = Noczynie r艒nczka
+pdfjs-scroll-vertical-button =
+    .title = U偶ywej pi艒nowego przewijanio
+pdfjs-scroll-vertical-button-label = Pi艒nowe przewijanie
+pdfjs-scroll-horizontal-button =
+    .title = U偶ywej pozi艒mego przewijanio
+pdfjs-scroll-horizontal-button-label = Pozi艒me przewijanie
+pdfjs-scroll-wrapped-button =
+    .title = U偶ywej szichtowego przewijanio
+pdfjs-scroll-wrapped-button-label = Szichtowe przewijanie
+pdfjs-spread-none-button =
+    .title = Niy dowej str艒n w widoku po dwie
+pdfjs-spread-none-button-label = Po jednyj str艒nie
+pdfjs-spread-odd-button =
+    .title = Poko偶 str艒ny po dwie; niyporziste po lewyj
+pdfjs-spread-odd-button-label = Niyporziste po lewyj
+pdfjs-spread-even-button =
+    .title = Poko偶 str艒ny po dwie; porziste po lewyj
+pdfjs-spread-even-button-label = Porziste po lewyj
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = W艂osno艣ci dokumyntu鈥�
+pdfjs-document-properties-button-label = W艂osno艣ci dokumyntu鈥�
+pdfjs-document-properties-file-name = Miano zbioru:
+pdfjs-document-properties-file-size = Srogo艣膰 zbioru:
+pdfjs-document-properties-title = Tytu艂:
+pdfjs-document-properties-author = Aut艒r:
+pdfjs-document-properties-subject = Tymat:
+pdfjs-document-properties-keywords = Kluczowe s艂owa:
+pdfjs-document-properties-creation-date = Data zrychtowanio:
+pdfjs-document-properties-modification-date = Data zmiany:
+pdfjs-document-properties-creator = Zrychtowane 么d:
+pdfjs-document-properties-producer = PDF 么d:
+pdfjs-document-properties-version = Wersyjo PDF:
+pdfjs-document-properties-page-count = Wielo艣膰 str艒n:
+pdfjs-document-properties-page-size = Srogo艣膰 str艒ny:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = pi艒nowo
+pdfjs-document-properties-page-size-orientation-landscape = pozi艒mo
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Gibki necowy podgl艒nd:
+pdfjs-document-properties-linearized-yes = Ja
+pdfjs-document-properties-linearized-no = Niy
+pdfjs-document-properties-close-button = Zawrzij
+
+## Print
+
+pdfjs-print-progress-message = Rychtowanie dokumyntu do durku鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Pociep
+pdfjs-printing-not-supported = Poz艒r: Ta przegl艒ndarka niy co艂kiym 么bsuguje durk.
+pdfjs-printing-not-ready = Poz艒r: Tyn PDF niy ma za tela zaladowany do durku.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Prze艂艒ncz posek na rancie
+pdfjs-toggle-sidebar-notification-button =
+    .title = Prze艂艒ncz posek na rancie (dokumynt mo struktura/przidowki/warstwy)
+pdfjs-toggle-sidebar-button-label = Prze艂艒ncz posek na rancie
+pdfjs-document-outline-button =
+    .title = Poko偶 struktura dokumyntu (tuplowane klikniyncie rozszyrzo/swijo wszyskie elymynta)
+pdfjs-document-outline-button-label = Struktura dokumyntu
+pdfjs-attachments-button =
+    .title = Poko偶 przidowki
+pdfjs-attachments-button-label = Przidowki
+pdfjs-layers-button =
+    .title = Poko偶 warstwy (tuplowane klikniyncie resetuje wszyskie warstwy do bazowego stanu)
+pdfjs-layers-button-label = Warstwy
+pdfjs-thumbs-button =
+    .title = Poko偶 miniatury
+pdfjs-thumbs-button-label = Miniatury
+pdfjs-findbar-button =
+    .title = Znojd藕 w dokumyncie
+pdfjs-findbar-button-label = Znojd藕
+pdfjs-additional-layers = Nadbytnie warstwy
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Str艒na { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Miniatura str艒ny { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Znojd藕
+    .placeholder = Znojd藕 w dokumyncie鈥�
+pdfjs-find-previous-button =
+    .title = Znojd藕 piyrwyjsze pokozanie sie tyj frazy
+pdfjs-find-previous-button-label = Piyrwyjszo
+pdfjs-find-next-button =
+    .title = Znojd藕 nastympne pokozanie sie tyj frazy
+pdfjs-find-next-button-label = Dalij
+pdfjs-find-highlight-checkbox = Zaznacz wszysko
+pdfjs-find-match-case-checkbox-label = Poznowej srogo艣膰 liter
+pdfjs-find-entire-word-checkbox-label = Co艂ke s艂owa
+pdfjs-find-reached-top = Dosz艂o do samego wiyrchu str艒ny, dalij 么d spodku
+pdfjs-find-reached-bottom = Dosz艂o do samego spodku str艒ny, dalij 么d wiyrchu
+pdfjs-find-not-found = Fraza niy znalezi艒no
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Szyrzka str艒ny
+pdfjs-page-scale-fit = Napasowanie str艒ny
+pdfjs-page-scale-auto = Aut艒matyczno srogo艣膰
+pdfjs-page-scale-actual = Aktualno srogo艣膰
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Przi ladowaniu PDFa pokozo艂 sie feler.
+pdfjs-invalid-file-error = Z艂y abo felerny zbi艒r PDF.
+pdfjs-missing-file-error = Chybio zbioru PDF.
+pdfjs-unexpected-response-error = Niy么czekowano 么dpowiyd藕 serwera.
+pdfjs-rendering-error = Przi renderowaniu str艒ny pokozo艂 sie feler.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Anotacyjo typu { $type }]
+
+## Password
+
+pdfjs-password-label = Wklud藕 has艂o, coby 么dewrzi膰 tyn zbi艒r PDF.
+pdfjs-password-invalid = Has艂o je z艂e. Spr艒buj jeszcze roz.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Pociep
+pdfjs-web-fonts-disabled = Necowe f艒nty s艒m zastawi艒ne: niy idzie u偶y膰 wkludz艒nych f艒nt艒w PDF.
diff --git a/public/pdfjs/web/locale/ta/viewer.ftl b/public/pdfjs/web/locale/ta/viewer.ftl
new file mode 100644
index 0000000..fe1c347
--- /dev/null
+++ b/public/pdfjs/web/locale/ta/viewer.ftl
@@ -0,0 +1,198 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 喈瘉喈ㄠ瘝喈む瘓喈� 喈畷喁嵿畷喈瘝
+pdfjs-previous-button-label = 喈瘉喈ㄠ瘝喈む瘓喈喁�
+pdfjs-next-button =
+    .title = 喈呧疅喁佮喁嵿 喈畷喁嵿畷喈瘝
+pdfjs-next-button-label = 喈呧疅喁佮喁嵿喁�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 喈畷喁嵿畷喈瘝
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 喈囙喁�
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = { $pagesCount }) 喈囙喁� ({ $pageNumber }
+pdfjs-zoom-out-button =
+    .title = 喈氞喈编喈む喈曕瘝喈曕瘉
+pdfjs-zoom-out-button-label = 喈氞喈编喈む喈曕瘝喈曕瘉
+pdfjs-zoom-in-button =
+    .title = 喈瘑喈班喈む喈曕瘝喈曕瘉
+pdfjs-zoom-in-button-label = 喈瘑喈班喈む喈曕瘝喈曕瘉
+pdfjs-zoom-select =
+    .title = 喈瘑喈班喈む喈曕瘝喈曕瘉
+pdfjs-presentation-mode-button =
+    .title = 喈掂喈赤畷喁嵿畷喈曕喈熰瘝喈氞 喈喈┼瘝喈瘉喈编瘓喈曕瘝喈曕瘉 喈喈编瘉
+pdfjs-presentation-mode-button-label = 喈掂喈赤畷喁嵿畷喈曕喈熰瘝喈氞 喈喈┼瘝喈瘉喈编瘓
+pdfjs-open-file-button =
+    .title = 喈曕瘚喈瘝喈喈┼瘓 喈む喈�
+pdfjs-open-file-button-label = 喈む喈�
+pdfjs-print-button =
+    .title = 喈呧畾喁嵿畾喈苦疅喁�
+pdfjs-print-button-label = 喈呧畾喁嵿畾喈苦疅喁�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 喈曕喁佮喈苦畷喈赤瘝
+pdfjs-tools-button-label = 喈曕喁佮喈苦畷喈赤瘝
+pdfjs-first-page-button =
+    .title = 喈瘉喈む喁� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+pdfjs-first-page-button-label = 喈瘉喈む喁� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+pdfjs-last-page-button =
+    .title = 喈曕疅喁堗畾喈� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+pdfjs-last-page-button-label = 喈曕疅喁堗畾喈� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+pdfjs-page-rotate-cw-button =
+    .title = 喈掂喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+pdfjs-page-rotate-cw-button-label = 喈掂喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+pdfjs-page-rotate-ccw-button =
+    .title = 喈囙疅喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+pdfjs-page-rotate-ccw-button-label = 喈囙疅喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+pdfjs-cursor-text-select-tool-button =
+    .title = 喈夃喁堗喁� 喈む瘑喈班喈掂瘉 喈曕喁佮喈苦喁堗畾喁� 喈氞瘑喈喁嵿喈熰瘉喈む瘝喈む瘉
+pdfjs-cursor-text-select-tool-button-label = 喈夃喁堗喁� 喈む瘑喈班喈掂瘉 喈曕喁佮喈�
+pdfjs-cursor-hand-tool-button =
+    .title = 喈曕瘓喈曕瘝 喈曕喁佮喈苦畷喁嵿畾喁� 喈氞瘑喈喁嵿喈熰瘉喈む瘝喈む瘉
+pdfjs-cursor-hand-tool-button-label = 喈曕瘓喈曕瘝喈曕瘉喈班瘉喈掂
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 喈嗋喈� 喈喁嵿喁佮畷喈赤瘝...
+pdfjs-document-properties-button-label = 喈嗋喈� 喈喁嵿喁佮畷喈赤瘝...
+pdfjs-document-properties-file-name = 喈曕瘚喈瘝喈瘉 喈瘑喈喁�:
+pdfjs-document-properties-file-size = 喈曕瘚喈瘝喈喈┼瘝 喈呧喈掂瘉:
+pdfjs-document-properties-title = 喈む喁堗喁嵿喁�:
+pdfjs-document-properties-author = 喈庎喁佮喈苦喈掂喁�
+pdfjs-document-properties-subject = 喈瘖喈班瘉喈赤瘝:
+pdfjs-document-properties-keywords = 喈瘉喈曕瘝喈曕喈� 喈掂喈班瘝喈む瘝喈む瘓喈曕喁�:
+pdfjs-document-properties-creation-date = 喈疅喁堗喁嵿 喈む瘒喈む :
+pdfjs-document-properties-modification-date = 喈む喈班瘉喈む瘝喈む喈� 喈む瘒喈む:
+pdfjs-document-properties-creator = 喈夃喁佮喈距畷喁嵿畷喁佮喈掂喁�:
+pdfjs-document-properties-producer = 喈喈熰喈庎畠喈瘝 喈む喈距喈苦喁嵿喈距喈班瘝:
+pdfjs-document-properties-version = PDF 喈喈苦喁嵿喁�:
+pdfjs-document-properties-page-count = 喈畷喁嵿畷 喈庎喁嵿喈苦畷喁嵿畷喁�:
+pdfjs-document-properties-page-size = 喈畷喁嵿畷 喈呧喈掂瘉:
+pdfjs-document-properties-page-size-unit-inches = 喈囙喈苦喁�
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 喈ㄠ喈侧瘓喈喈苦喁嵿喁�
+pdfjs-document-properties-page-size-orientation-landscape = 喈ㄠ喈侧瘓喈喈瘝喈瘉
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 喈曕疅喈苦喈瘝
+pdfjs-document-properties-page-size-name-legal = 喈氞疅喁嵿疅喈瘋喈班瘝喈�
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+pdfjs-document-properties-close-button = 喈瘋喈熰瘉喈�
+
+## Print
+
+pdfjs-print-progress-message = 喈呧畾喁嵿畾喈苦疅喁佮喈む喁嵿畷喈距 喈嗋喈`喁� 喈む喈距喈距畷喈苦喈む瘉...
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 喈班喁嵿喁�
+pdfjs-printing-not-supported = 喈庎畾喁嵿畾喈班喈曕瘝喈曕瘓: 喈囙喁嵿 喈夃喈距喈� 喈呧畾喁嵿畾喈苦疅喁佮喈侧瘓 喈瘉喈脆瘉喈瘓喈喈� 喈嗋喈班喈曕瘝喈曕喈苦喁嵿喁�.
+pdfjs-printing-not-ready = 喈庎畾喁嵿畾喈班喈曕瘝喈曕瘓: PDF 喈呧畾喁嵿畾喈苦疅 喈瘉喈脆瘉喈掂喁佮喈距畷 喈忇喁嵿喈瘝喈疅喈掂喈侧瘝喈侧瘓.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 喈畷喁嵿畷喈瘝 喈疅喁嵿疅喈苦喁� 喈ㄠ喈侧瘓喈喈编瘝喈编瘉
+pdfjs-toggle-sidebar-button-label = 喈畷喁嵿畷喈瘝 喈疅喁嵿疅喈苦喁� 喈ㄠ喈侧瘓喈喈编瘝喈编瘉
+pdfjs-document-outline-button =
+    .title = 喈嗋喈� 喈呧疅喈曕瘝喈曕喁嵿喁堗畷喁� 喈曕喈熰瘝喈熰瘉 (喈囙喁佮喁佮喁堗畾喁� 喈氞瘖喈熰瘉喈曕瘝喈曕 喈呧喁堗喁嵿喁� 喈夃喁佮喁嵿喈苦疅喈苦畷喈赤瘓喈瘉喈瘝 喈掂喈班/喈氞瘒喈班瘝)
+pdfjs-document-outline-button-label = 喈嗋喈� 喈掂瘑喈赤喈掂喁�
+pdfjs-attachments-button =
+    .title = 喈囙喁堗喁嵿喁佮畷喈赤瘓 喈曕喈`瘝喈
+pdfjs-attachments-button-label = 喈囙喁堗喁嵿喁佮畷喈赤瘝
+pdfjs-thumbs-button =
+    .title = 喈氞喈编瘉喈疅喈權瘝喈曕喁堗畷喁� 喈曕喈`瘝喈
+pdfjs-thumbs-button-label = 喈氞喈编瘉喈疅喈權瘝喈曕喁�
+pdfjs-findbar-button =
+    .title = 喈嗋喈`喁嵿喈苦喁� 喈曕喁嵿疅喈编
+pdfjs-findbar-button-label = 喈む瘒喈熰瘉
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 喈畷喁嵿畷喈瘝 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 喈畷喁嵿畷喈む瘝喈む喈┼瘝 喈氞喈编瘉喈疅喈瘝 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 喈曕喁嵿疅喁佮喈苦疅喈�
+    .placeholder = 喈嗋喈`喁嵿喈苦喁� 喈曕喁嵿疅喈编鈥�
+pdfjs-find-previous-button =
+    .title = 喈囙喁嵿 喈氞瘖喈编瘝喈编瘖喈熰喈苦喁� 喈瘉喈ㄠ瘝喈む瘓喈� 喈ㄠ喈曕喁嵿喁� 喈む瘒喈熰瘉
+pdfjs-find-previous-button-label = 喈瘉喈ㄠ瘝喈む瘓喈喁�
+pdfjs-find-next-button =
+    .title = 喈囙喁嵿 喈氞瘖喈编瘝喈编瘖喈熰喈苦喁� 喈呧疅喁佮喁嵿 喈ㄠ喈曕喁嵿喁� 喈む瘒喈熰瘉
+pdfjs-find-next-button-label = 喈呧疅喁佮喁嵿喁�
+pdfjs-find-highlight-checkbox = 喈呧喁堗喁嵿喁堗喁佮喁� 喈む喈苦喁嵿喈熰瘉喈む瘝喈む瘉
+pdfjs-find-match-case-checkbox-label = 喈瘒喈班瘑喈脆瘉喈む瘝喈む喈曕瘝喈曕喁嵿喁� 喈夃喈班瘝
+pdfjs-find-reached-top = 喈嗋喈`喁嵿喈苦喁� 喈瘒喈侧瘝 喈畷喁佮喈苦喁� 喈呧疅喁堗喁嵿喈む瘉, 喈呧疅喈苦喁嵿喈曕瘝喈曕喁嵿喈苦喈苦喁佮喁嵿喁� 喈む瘖喈熰喁嵿喁嵿喈む瘉
+pdfjs-find-reached-bottom = 喈嗋喈`喁嵿喈苦喁� 喈瘉喈熰喈掂瘓 喈呧疅喁堗喁嵿喈む瘉, 喈瘒喈侧喈班瘉喈ㄠ瘝喈む瘉 喈む瘖喈熰喁嵿喁嵿喈む瘉
+pdfjs-find-not-found = 喈氞瘖喈编瘝喈编瘖喈熰喁� 喈曕喈`喈苦喁嵿喁�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 喈畷喁嵿畷 喈呧畷喈侧喁�
+pdfjs-page-scale-fit = 喈畷喁嵿畷喈瘝 喈瘖喈班瘉喈む瘝喈む喁�
+pdfjs-page-scale-auto = 喈む喈┼喈畷喁嵿畷 喈瘑喈班喈む喈曕瘝喈曕喁�
+pdfjs-page-scale-actual = 喈夃喁嵿喁堗喈距 喈呧喈掂瘉
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 喈� 喈忇喁嵿喁佮喁� 喈瘚喈む瘉 喈掄喁� 喈喈脆瘓 喈忇喁嵿喈熰瘝喈熰喁�.
+pdfjs-invalid-file-error = 喈氞瘑喈侧瘝喈侧瘉喈疅喈苦喈距畷喈距 喈呧喁嵿喈む瘉 喈氞喈む瘓喈ㄠ瘝喈� PDF 喈曕瘚喈瘝喈瘉.
+pdfjs-missing-file-error = PDF 喈曕瘚喈瘝喈瘉 喈曕喈`喈苦喁嵿喁�.
+pdfjs-unexpected-response-error = 喈氞瘒喈掂畷喈┼瘝 喈喈苦喁� 喈庎喈苦喁嵿喈距喈む喁�.
+pdfjs-rendering-error = 喈囙喁嵿喈瘝 喈畷喁嵿畷喈む瘝喈む瘓 喈曕喈熰瘝喈氞喈瘝喈疅喁佮喁嵿喁佮喁� 喈瘚喈む瘉 喈掄喁� 喈喈脆瘓 喈忇喁嵿喈熰瘝喈熰喁�.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 喈掂喈赤畷喁嵿畷喈瘝]
+
+## Password
+
+pdfjs-password-label = 喈囙喁嵿 PDF 喈曕瘒喈距喁嵿喁� 喈む喈编畷喁嵿畷 喈曕疅喈掂瘉喈氞瘝喈氞瘑喈距喁嵿喁� 喈夃喁嵿喈苦疅喈掂瘉喈瘝.
+pdfjs-password-invalid = 喈氞瘑喈侧瘝喈侧瘉喈疅喈苦喈距畷喈距 喈曕疅喈掂瘉喈氞瘝喈氞瘖喈侧瘝, 喈む喁� 喈氞瘑喈瘝喈む瘉 喈瘈喈`瘝喈熰瘉喈瘝 喈瘉喈喁嵿畾喈� 喈氞瘑喈瘝喈�.
+pdfjs-password-ok-button = 喈氞喈�
+pdfjs-password-cancel-button = 喈班喁嵿喁�
+pdfjs-web-fonts-disabled = 喈掂喁� 喈庎喁佮喁嵿喁佮喁佮畷喁嵿畷喈赤瘝 喈瘉喈熰畷喁嵿畷喈瘝喈疅喁嵿疅喁佮喁嵿喈�: 喈夃疅喁嵿喁娻喈苦畷喁嵿畷喈瘝喈疅喁嵿疅 PDF 喈庎喁佮喁嵿喁佮喁佮畷喁嵿畷喈赤瘓喈瘝 喈喈┼瘝喈疅喁佮喁嵿 喈瘉喈熰喈喈苦喁嵿喁�.
diff --git a/public/pdfjs/web/locale/te/viewer.ftl b/public/pdfjs/web/locale/te/viewer.ftl
new file mode 100644
index 0000000..24838bc
--- /dev/null
+++ b/public/pdfjs/web/locale/te/viewer.ftl
@@ -0,0 +1,213 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 喟眮喟ㄠ眮喟盁喟� 喟眹喟溹眬
+pdfjs-previous-button-label = 喟曕睄喟班翱喟む皞
+pdfjs-next-button =
+    .title = 喟む鞍啾佮暗喟距挨 喟眹喟溹眬
+pdfjs-next-button-label = 喟む鞍啾佮暗喟距挨
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 喟眹喟溹眬
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 喟眾喟む睄喟む皞 { $pagesCount } 喟侧眿
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = (喟眾喟む睄喟む皞 { $pagesCount } 喟侧眿 { $pageNumber }喟掂唉喟�)
+pdfjs-zoom-out-button =
+    .title = 喟溹眰喟睄 喟む皸啾嵿皸喟苦皞喟氞眮
+pdfjs-zoom-out-button-label = 喟溹眰喟睄 喟む皸啾嵿皸喟苦皞喟氞眮
+pdfjs-zoom-in-button =
+    .title = 喟溹眰喟睄 喟氞眹喟翱
+pdfjs-zoom-in-button-label = 喟溹眰喟睄 喟氞眹喟翱
+pdfjs-zoom-select =
+    .title = 喟溹眰喟睄
+pdfjs-presentation-mode-button =
+    .title = 喟睄喟班唉喟班睄喟多皑喟� 喟班眬喟む翱喟曕翱 喟熬喟班眮
+pdfjs-presentation-mode-button-label = 喟睄喟班唉喟班睄喟多皑喟� 喟班眬喟む翱
+pdfjs-open-file-button =
+    .title = 喟眻喟侧睄 喟む眴喟班眮喟掂眮
+pdfjs-open-file-button-label = 喟む眴喟班眮喟掂眮
+pdfjs-print-button =
+    .title = 喟眮喟︵睄喟班翱喟傕皻啾�
+pdfjs-print-button-label = 喟眮喟︵睄喟班翱喟傕皻啾�
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 喟皑喟苦爱啾佮盁啾嵿安啾�
+pdfjs-tools-button-label = 喟皑喟苦爱啾佮盁啾嵿安啾�
+pdfjs-first-page-button =
+    .title = 喟眾喟︵盁喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+pdfjs-first-page-button-label = 喟眾喟︵盁喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+pdfjs-last-page-button =
+    .title = 喟氞翱喟掂鞍喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+pdfjs-last-page-button-label = 喟氞翱喟掂鞍喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+pdfjs-page-rotate-cw-button =
+    .title = 喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+pdfjs-page-rotate-cw-button-label = 喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+pdfjs-page-rotate-ccw-button =
+    .title = 喟呧蔼喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+pdfjs-page-rotate-ccw-button-label = 喟呧蔼喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+pdfjs-cursor-text-select-tool-button =
+    .title = 喟熰眴喟曕睄喟膏睄喟熰睄 喟庎皞喟翱喟� 喟膏熬喟о皑喟距皑啾嵿皑喟� 喟睄喟班熬喟班皞喟翱喟傕皻喟傕啊喟�
+pdfjs-cursor-text-select-tool-button-label = 喟熰眴喟曕睄喟膏睄喟熰睄 喟庎皞喟翱喟� 喟膏熬喟о皑喟�
+pdfjs-cursor-hand-tool-button =
+    .title = 喟氞眹喟む翱 喟膏熬喟о皑喟� 喟氞眹喟む皑喟苦皞喟氞眮
+pdfjs-cursor-hand-tool-button-label = 喟氞眹喟む翱 喟膏熬喟о皑喟�
+pdfjs-scroll-vertical-button-label = 喟ㄠ翱喟侧眮喟掂眮 喟膏睄喟曕睄喟班眿喟侧翱喟傕皸啾�
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 喟挨啾嵿鞍喟眮 喟侧皶啾嵿胺喟`熬喟侧眮...
+pdfjs-document-properties-button-label = 喟挨啾嵿鞍喟眮 喟侧皶啾嵿胺喟`熬喟侧眮...
+pdfjs-document-properties-file-name = 喟︵案啾嵿挨啾嵿鞍喟� 喟眹喟班眮:
+pdfjs-document-properties-file-size = 喟︵案啾嵿挨啾嵿鞍喟� 喟鞍喟苦爱喟距埃喟�:
+pdfjs-document-properties-title = 喟多眬喟班睄喟粪翱喟�:
+pdfjs-document-properties-author = 喟眰喟侧皶喟班睄喟�:
+pdfjs-document-properties-subject = 喟掂翱喟粪隘喟�:
+pdfjs-document-properties-keywords = 喟曕眬 喟唉喟距安啾�:
+pdfjs-document-properties-creation-date = 喟膏眱喟粪睄喟熰翱喟傕皻喟苦皑 喟む眹喟︵眬:
+pdfjs-document-properties-modification-date = 喟膏暗喟班翱喟傕皻喟苦皑 喟む眹喟︵眬:
+pdfjs-document-properties-creator = 喟膏眱喟粪睄喟熰翱喟曕鞍啾嵿挨:
+pdfjs-document-properties-producer = PDF 喟夃挨啾嵿蔼喟距唉喟曕翱:
+pdfjs-document-properties-version = PDF 喟掂鞍啾嵿胺喟ㄠ睄:
+pdfjs-document-properties-page-count = 喟眹喟溹眬喟� 喟膏皞喟栢睄喟�:
+pdfjs-document-properties-page-size = 喟曕熬喟椸翱喟む皞 喟鞍喟苦爱喟距埃喟�:
+pdfjs-document-properties-page-size-unit-inches = 喟侧眿
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 喟ㄠ翱喟侧眮喟掂眮喟氞翱喟む睄喟班皞
+pdfjs-document-properties-page-size-orientation-landscape = 喟呧啊啾嵿啊喟氞翱喟む睄喟班皞
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 喟侧眹喟�
+pdfjs-document-properties-page-size-name-legal = 喟氞盁啾嵿盁喟鞍喟眴啾栢皑
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+pdfjs-document-properties-linearized-yes = 喟呧暗啾佮皑啾�
+pdfjs-document-properties-linearized-no = 喟曕熬喟︵眮
+pdfjs-document-properties-close-button = 喟眰喟膏翱喟掂眹喟翱
+
+## Print
+
+pdfjs-print-progress-message = 喟眮喟︵睄喟班翱喟傕皻喟∴熬喟ㄠ翱喟曕翱 喟挨啾嵿鞍喟眮 喟膏翱喟︵睄喟о爱喟掂眮喟む眮喟ㄠ睄喟ㄠ唉喟库��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 喟班唉啾嵿唉啾佮皻啾囙隘喟�
+pdfjs-printing-not-supported = 喟灌眴喟氞睄喟氞鞍喟苦皶: 喟� 喟掂翱喟灌熬喟班翱喟`翱 喟氞眹喟� 喟眮喟︵睄喟班埃 喟眰喟班睄喟む翱喟椸熬 喟む眿喟∴睄喟熬喟熰眮 喟侧眹喟︵眮.
+pdfjs-printing-not-ready = 喟灌眴喟氞睄喟氞鞍喟苦皶: 喟眮喟︵睄喟班埃 喟曕眾喟班皶啾� 喟� PDF 喟眰喟班睄喟む翱喟椸熬 喟侧眿喟∴暗喟侧眹喟︵眮.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 喟皶啾嵿皶喟盁啾嵿盁啾� 喟熬喟班睄喟氞眮
+pdfjs-toggle-sidebar-button-label = 喟皶啾嵿皶喟盁啾嵿盁啾� 喟熬喟班睄喟氞眮
+pdfjs-document-outline-button =
+    .title = 喟挨啾嵿鞍喟眮 喟班眰喟爱啾� 喟氞眰喟翱喟傕皻啾� (喟∴艾啾佮安啾� 喟曕睄喟侧翱喟曕睄 喟氞眹喟膏翱 喟呧皑啾嵿皑喟� 喟呧皞喟多熬喟侧皑啾� 喟掂翱喟膏睄喟む鞍喟苦皞喟氞眮/喟曕眰喟侧睄喟氞眮)
+pdfjs-document-outline-button-label = 喟挨啾嵿鞍喟眮 喟呧暗啾佮盁啾嶁�屶安啾堗皑啾�
+pdfjs-attachments-button =
+    .title = 喟呧皑啾佮艾喟傕哀喟距安啾� 喟氞眰喟眮
+pdfjs-attachments-button-label = 喟呧皑啾佮艾喟傕哀喟距安啾�
+pdfjs-layers-button-label = 喟眾喟班安啾�
+pdfjs-thumbs-button =
+    .title = 喟ム皞喟睄鈥屶皑啾堗安啾嵿案啾� 喟氞眰喟眮
+pdfjs-thumbs-button-label = 喟ム皞喟睄鈥屶皑啾堗安啾嵿案啾�
+pdfjs-findbar-button =
+    .title = 喟挨啾嵿鞍喟眮喟侧眿 喟曕皑啾佮皸啾娻皑啾佮爱啾�
+pdfjs-findbar-button-label = 喟曕皑啾佮皸啾娻皑啾�
+pdfjs-additional-layers = 喟呧唉喟ㄠ蔼啾� 喟眾喟班安啾�
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 喟眹喟溹眬 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } 喟眹喟溹眬 喟ㄠ皷喟氞翱喟む睄喟班皞
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 喟曕皑啾佮皸啾娻皑啾�
+    .placeholder = 喟挨啾嵿鞍喟眮喟侧眿 喟曕皑啾佮皸啾娻皑啾佲��
+pdfjs-find-previous-button =
+    .title = 喟唉喟� 喟眾喟曕睄喟� 喟眮喟傕唉啾� 喟膏皞喟暗喟距皑啾嵿皑喟� 喟曕皑啾佮皸啾娻皑啾�
+pdfjs-find-previous-button-label = 喟眮喟ㄠ眮喟盁喟�
+pdfjs-find-next-button =
+    .title = 喟唉喟� 喟眾喟曕睄喟� 喟む鞍啾嵿暗喟距挨喟� 喟膏皞喟暗喟距皑啾嵿皑喟� 喟曕皑啾佮皸啾娻皑啾�
+pdfjs-find-next-button-label = 喟む鞍啾佮暗喟距挨
+pdfjs-find-highlight-checkbox = 喟呧皑啾嵿皑喟苦盁喟苦皑喟� 喟夃唉啾嵿唉啾�喟皑喟� 喟氞眹喟眮喟眮
+pdfjs-find-match-case-checkbox-label = 喟呧皶啾嵿胺喟班爱啾佮安 喟む眹喟∴熬喟む眿 喟眿喟侧睄喟氞眮
+pdfjs-find-entire-word-checkbox-label = 喟眰喟班睄喟む翱 喟唉喟距安啾�
+pdfjs-find-reached-top = 喟眹喟溹眬 喟眻喟曕翱 喟氞眹喟班眮喟曕眮喟ㄠ睄喟ㄠ唉喟�, 喟曕睄喟班翱喟傕唉喟� 喟ㄠ眮喟傕啊喟� 喟曕眾喟ㄠ案喟距皸喟苦皞喟氞皞喟∴翱
+pdfjs-find-reached-bottom = 喟眹喟溹眬 喟氞翱喟掂鞍喟曕眮 喟氞眹喟班眮喟曕眮喟ㄠ睄喟ㄠ唉喟�, 喟眻喟ㄠ眮喟傕啊喟� 喟曕眾喟ㄠ案喟距皸喟苦皞喟氞皞喟∴翱
+pdfjs-find-not-found = 喟唉喟皞喟о皞 喟曕皑喟啊喟侧眹喟︵眮
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 喟眹喟溹眬 喟掂眴喟∴安啾嵿蔼啾�
+pdfjs-page-scale-fit = 喟眹喟溹眬 喟呧爱喟班睄喟眮
+pdfjs-page-scale-auto = 喟膏睄喟掂隘喟傕皻喟距安喟� 喟溹眰喟睄
+pdfjs-page-scale-actual = 喟哎喟距鞍啾嵿哀 喟鞍喟苦爱喟距埃喟�
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 喟侧眿喟∴暗啾佮皻啾佮皑啾嵿皑喟睄喟眮喟∴眮 喟掄皶 喟︵眿喟粪皞 喟庎唉啾佮鞍啾堗皞喟︵翱.
+pdfjs-invalid-file-error = 喟氞眴喟侧睄喟侧皑喟� 喟侧眹喟︵熬 喟熬喟∴眻喟� PDF 喟眻喟侧眮.
+pdfjs-missing-file-error = 喟︵眾喟班皶喟ㄠ翱 PDF 喟眻喟侧眮.
+pdfjs-unexpected-response-error = 喟呧皑啾佮皶啾嬥皑喟� 喟膏鞍啾嵿暗喟班睄 喟膏睄喟皞喟︵皑.
+pdfjs-rendering-error = 喟眹喟溹眬喟ㄠ眮 喟班眴喟傕啊喟班睄 喟氞眹喟眮喟熰安啾� 喟掄皶 喟︵眿喟粪皞 喟庎唉啾佮鞍啾堗皞喟︵翱.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 喟熰眬喟曕熬]
+
+## Password
+
+pdfjs-password-label = 喟� PDF 喟眻喟侧睄 喟む眴喟班眮喟氞眮喟熰皶啾� 喟膏皞喟曕眹喟む蔼喟︵皞 喟睄喟班暗啾囙岸喟眴喟熰睄喟熰眮喟眮.
+pdfjs-password-invalid = 喟膏皞喟曕眹喟む蔼喟︵皞 喟氞眴喟侧睄喟侧唉啾�. 喟︵隘喟氞眹喟膏翱 喟俺啾嵿俺啾� 喟睄喟班隘喟む睄喟ㄠ翱喟傕皻喟傕啊喟�.
+pdfjs-password-ok-button = 喟膏鞍啾�
+pdfjs-password-cancel-button = 喟班唉啾嵿唉啾佮皻啾囙隘喟�
+pdfjs-web-fonts-disabled = 喟掂眴喟睄 喟熬喟傕盁啾嵿安啾� 喟呧皻啾囙挨喟ㄠ翱喟傕皻喟啊啾嗋皑啾�: 喟庎皞喟眴喟∴眴喟∴睄 PDF 喟熬喟傕盁啾嵿安啾� 喟夃蔼喟眿喟椸翱喟傕皻喟侧眹喟� 喟眿喟翱喟傕唉喟�.
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 喟班皞喟椸眮
+pdfjs-editor-free-text-size-input = 喟鞍喟苦爱喟距埃喟�
+pdfjs-editor-ink-color-input = 喟班皞喟椸眮
+pdfjs-editor-ink-thickness-input = 喟皞喟︵皞
+pdfjs-editor-ink-opacity-input = 喟呧皶喟苦鞍喟`睄喟挨
diff --git a/public/pdfjs/web/locale/tg/viewer.ftl b/public/pdfjs/web/locale/tg/viewer.ftl
new file mode 100644
index 0000000..ad09f51
--- /dev/null
+++ b/public/pdfjs/web/locale/tg/viewer.ftl
@@ -0,0 +1,741 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 小邪页懈褎邪懈 覜邪斜谢樱
+pdfjs-previous-button-label = 覛邪斜谢樱
+pdfjs-next-button =
+    .title = 小邪页懈褎邪懈 薪邪胁斜邪褌樱
+pdfjs-next-button-label = 袧邪胁斜邪褌樱
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 小邪页懈褎邪
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 邪蟹 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 邪蟹 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 啸褍褉写 泻邪褉写邪薪
+pdfjs-zoom-out-button-label = 啸褍褉写 泻邪褉写邪薪
+pdfjs-zoom-in-button =
+    .title = 袣邪谢芯薪 泻邪褉写邪薪
+pdfjs-zoom-in-button-label = 袣邪谢芯薪 泻邪褉写邪薪
+pdfjs-zoom-select =
+    .title = 孝邪薪蟹懈屑懈 邪薪写芯蟹邪
+pdfjs-presentation-mode-button =
+    .title = 袚褍蟹邪褉懈褕 斜邪 褉械曳邪懈 褌邪覜写懈屑
+pdfjs-presentation-mode-button-label = 袪械曳邪懈 褌邪覜写懈屑
+pdfjs-open-file-button =
+    .title = 袣褍褕芯写邪薪懈 褎邪泄谢
+pdfjs-open-file-button-label = 袣褍褕芯写邪薪
+pdfjs-print-button =
+    .title = 效芯锌 泻邪褉写邪薪
+pdfjs-print-button-label = 效芯锌 泻邪褉写邪薪
+pdfjs-save-button =
+    .title = 袧懈谐芯页 写芯褕褌邪薪
+pdfjs-save-button-label = 袧懈谐芯页 写芯褕褌邪薪
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 袘芯褉谐懈褉樱 泻邪褉写邪薪
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 袘芯褉谐懈褉樱 泻邪褉写邪薪
+pdfjs-bookmark-button =
+    .title = 小邪页懈褎邪懈 曳芯褉樱 (袛懈写邪薪懈 薪懈褕芯薪懈懈 URL 邪蟹 褋邪页懈褎邪懈 曳芯褉樱)
+pdfjs-bookmark-button-label = 小邪页懈褎邪懈 曳芯褉樱
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 袗斜蟹芯褉页芯
+pdfjs-tools-button-label = 袗斜蟹芯褉页芯
+pdfjs-first-page-button =
+    .title = 袘邪 褋邪页懈褎邪懈 邪胁胁邪谢 谐褍蟹邪褉械写
+pdfjs-first-page-button-label = 袘邪 褋邪页懈褎邪懈 邪胁胁邪谢 谐褍蟹邪褉械写
+pdfjs-last-page-button =
+    .title = 袘邪 褋邪页懈褎邪懈 芯褏懈褉懈薪 谐褍蟹邪褉械写
+pdfjs-last-page-button-label = 袘邪 褋邪页懈褎邪懈 芯褏懈褉懈薪 谐褍蟹邪褉械写
+pdfjs-page-rotate-cw-button =
+    .title = 袘邪 褋邪屑褌懈 页邪褉邪泻邪褌懈 邪覜褉邪斜邪泻懈 褋芯邪褌 写邪胁褉 蟹邪写邪薪
+pdfjs-page-rotate-cw-button-label = 袘邪 褋邪屑褌懈 页邪褉邪泻邪褌懈 邪覜褉邪斜邪泻懈 褋芯邪褌 写邪胁褉 蟹邪写邪薪
+pdfjs-page-rotate-ccw-button =
+    .title = 袘邪 屑褍覜芯斜懈谢懈 褋邪屑褌懈 页邪褉邪泻邪褌懈 邪覜褉邪斜邪泻懈 褋芯邪褌 写邪胁褉 蟹邪写邪薪
+pdfjs-page-rotate-ccw-button-label = 袘邪 屑褍覜芯斜懈谢懈 褋邪屑褌懈 页邪褉邪泻邪褌懈 邪覜褉邪斜邪泻懈 褋芯邪褌 写邪胁褉 蟹邪写邪薪
+pdfjs-cursor-text-select-tool-button =
+    .title = 肖邪褗芯谢 泻邪褉写邪薪懈 芦袗斜蟹芯褉懈 懈薪褌懈褏芯斜懈 屑邪褌薪禄
+pdfjs-cursor-text-select-tool-button-label = 袗斜蟹芯褉懈 懈薪褌懈褏芯斜懈 屑邪褌薪
+pdfjs-cursor-hand-tool-button =
+    .title = 肖邪褗芯谢 泻邪褉写邪薪懈 芦袗斜蟹芯褉懈 写邪褋褌禄
+pdfjs-cursor-hand-tool-button-label = 袗斜蟹芯褉懈 写邪褋褌
+pdfjs-scroll-page-button =
+    .title = 袠褋褌懈褎芯写邪懈 胁邪褉邪覜蟹邪薪樱
+pdfjs-scroll-page-button-label = 袙邪褉邪覜蟹邪薪樱
+pdfjs-scroll-vertical-button =
+    .title = 袠褋褌懈褎芯写邪懈 胁邪褉邪覜蟹邪薪懈懈 邪屑褍写樱
+pdfjs-scroll-vertical-button-label = 袙邪褉邪覜蟹邪薪懈懈 邪屑褍写樱
+pdfjs-scroll-horizontal-button =
+    .title = 袠褋褌懈褎芯写邪懈 胁邪褉邪覜蟹邪薪懈懈 褍褎褍覜樱
+pdfjs-scroll-horizontal-button-label = 袙邪褉邪覜蟹邪薪懈懈 褍褎褍覜樱
+pdfjs-scroll-wrapped-button =
+    .title = 袠褋褌懈褎芯写邪懈 胁邪褉邪覜蟹邪薪懈懈 屑懈覜褢褋斜邪薪写樱
+pdfjs-scroll-wrapped-button-label = 袙邪褉邪覜蟹邪薪懈懈 屑懈覜褢褋斜邪薪写樱
+pdfjs-spread-none-button =
+    .title = 袚褍褋褌邪褉懈褕懈 褋邪页懈褎邪页芯 懈褋褌懈褎芯写邪 斜褍褉写邪 薪邪褕邪胁邪写
+pdfjs-spread-none-button-label = 袘械 谐褍褋褌褍褉写邪薪懈 褋邪页懈褎邪页芯
+pdfjs-spread-odd-button =
+    .title = 袚褍褋褌邪褉懈褕懈 褋邪页懈褎邪页芯 邪蟹 褋邪页懈褎邪页芯 斜芯 褉邪覜邪屑页芯懈 褌芯覜 芯覔芯蟹 泻邪褉写邪 屑械褕邪胁邪写
+pdfjs-spread-odd-button-label = 小邪页懈褎邪页芯懈 褌芯覜 邪蟹 褌邪褉邪褎懈 褔邪锌
+pdfjs-spread-even-button =
+    .title = 袚褍褋褌邪褉懈褕懈 褋邪页懈褎邪页芯 邪蟹 褋邪页懈褎邪页芯 斜芯 褉邪覜邪屑页芯懈 曳褍褎褌 芯覔芯蟹 泻邪褉写邪 屑械褕邪胁邪写
+pdfjs-spread-even-button-label = 小邪页懈褎邪页芯懈 曳褍褎褌 邪蟹 褌邪褉邪褎懈 褔邪锌
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 啸褍褋褍褋懈褟褌页芯懈 页褍曳曳邪褌鈥�
+pdfjs-document-properties-button-label = 啸褍褋褍褋懈褟褌页芯懈 页褍曳曳邪褌鈥�
+pdfjs-document-properties-file-name = 袧芯屑懈 褎邪泄谢:
+pdfjs-document-properties-file-size = 袗薪写芯蟹邪懈 褎邪泄谢:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 袣袘 ({ $b } 斜邪泄褌)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 袦袘 ({ $b } 斜邪泄褌)
+pdfjs-document-properties-title = 小邪褉谢邪胁页邪:
+pdfjs-document-properties-author = 袦褍邪谢谢懈褎:
+pdfjs-document-properties-subject = 袦邪胁蟹褍褗:
+pdfjs-document-properties-keywords = 袣邪谢懈屑邪页芯懈 泻邪谢懈写樱:
+pdfjs-document-properties-creation-date = 小邪薪邪懈 褝曳芯写:
+pdfjs-document-properties-modification-date = 小邪薪邪懈 褌邪覔泄懈褉芯褌:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 协曳芯写泻褍薪邪薪写邪:
+pdfjs-document-properties-producer = 孝邪页懈褟泻褍薪邪薪写邪懈 芦PDF禄:
+pdfjs-document-properties-version = 袙械褉褋懈褟懈 芦PDF禄:
+pdfjs-document-properties-page-count = 楔褍屑芯褉邪懈 褋邪页懈褎邪页芯:
+pdfjs-document-properties-page-size = 袗薪写芯蟹邪懈 褋邪页懈褎邪:
+pdfjs-document-properties-page-size-unit-inches = 写褞泄屑
+pdfjs-document-properties-page-size-unit-millimeters = 屑屑
+pdfjs-document-properties-page-size-orientation-portrait = 邪屑褍写樱
+pdfjs-document-properties-page-size-orientation-landscape = 褍褎褍覜樱
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 袦邪泻褌褍斜
+pdfjs-document-properties-page-size-name-legal = 也褍覜褍覜樱
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 袧邪屑芯懈褕懈 褌械蟹 写邪褉 袠薪褌械褉薪械褌:
+pdfjs-document-properties-linearized-yes = 也邪
+pdfjs-document-properties-linearized-no = 袧械
+pdfjs-document-properties-close-button = 袩盈褕懈写邪薪
+
+## Print
+
+pdfjs-print-progress-message = 袨屑芯写邪褋芯蟹懈懈 页褍曳曳邪褌 斜邪褉芯懈 褔芯锌鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 袘械泻芯褉 泻邪褉写邪薪
+pdfjs-printing-not-supported = 袛懈覜覜邪褌: 效芯锌泻褍薪樱 邪蟹 褌邪褉邪褎懈 懈薪 斜褉邪褍蟹械褉 斜邪 褌邪胁褉懈 锌褍褉褉邪 写邪褋褌谐懈褉樱 薪邪屑械褕邪胁邪写.
+pdfjs-printing-not-ready = 袛懈覜覜邪褌: 肖邪泄谢懈 芦PDF禄 斜邪褉芯懈 褔芯锌泻褍薪樱 锌褍褉褉邪 斜芯褉 泻邪褉写邪 薪邪褕褍写.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 肖邪褗芯谢 泻邪褉写邪薪懈 薪邪胁芯褉懈 曳芯薪懈斜樱
+pdfjs-toggle-sidebar-notification-button =
+    .title = 肖邪褗芯谢 泻邪褉写邪薪懈 薪邪胁芯褉懈 曳芯薪懈斜樱 (页褍曳曳邪褌 写芯褉芯懈 褋芯褏褌芯褉/蟹邪屑懈屑邪页芯/覜邪斜邪褌页芯 屑械斜芯褕邪写)
+pdfjs-toggle-sidebar-button-label = 肖邪褗芯谢 泻邪褉写邪薪懈 薪邪胁芯褉懈 曳芯薪懈斜樱
+pdfjs-document-outline-button =
+    .title = 袧邪屑芯懈褕 写芯写邪薪懈 褋芯褏褌芯褉懈 页褍曳曳邪褌 (斜邪褉芯懈 斜邪褉泻褍褕芯写邪薪/锌械曳芯薪写邪薪懈 页邪屑邪懈 褍薪褋褍褉页芯 写褍斜芯褉邪 蟹械褉 泻褍薪械写)
+pdfjs-document-outline-button-label = 小芯褏褌芯褉懈 页褍曳曳邪褌
+pdfjs-attachments-button =
+    .title = 袧邪屑芯懈褕 写芯写邪薪懈 蟹邪屑懈屑邪页芯
+pdfjs-attachments-button-label = 袟邪屑懈屑邪页芯
+pdfjs-layers-button =
+    .title = 袧邪屑芯懈褕 写芯写邪薪懈 覜邪斜邪褌页芯 (斜邪褉芯懈 斜邪褉覜邪褉芯褉 泻邪褉写邪薪懈 页邪屑邪懈 覜邪斜邪褌页芯 斜邪 胁邪蟹褗懈褟褌懈 锌械褕褎邪褉蟹 写褍斜芯褉邪 蟹械褉 泻褍薪械写)
+pdfjs-layers-button-label = 覛邪斜邪褌页芯
+pdfjs-thumbs-button =
+    .title = 袧邪屑芯懈褕 写芯写邪薪懈 褌邪褋胁懈褉褔邪页芯
+pdfjs-thumbs-button-label = 孝邪褋胁懈褉褔邪页芯
+pdfjs-current-outline-item-button =
+    .title = 衼褎褌邪薪懈 褍薪褋褍褉懈 褋芯褏褌芯褉懈 曳芯褉樱
+pdfjs-current-outline-item-button-label = 校薪褋褍褉懈 褋芯褏褌芯褉懈 曳芯褉樱
+pdfjs-findbar-button =
+    .title = 衼褎褌邪薪 写邪褉 页褍曳曳邪褌
+pdfjs-findbar-button-label = 衼褎褌邪薪
+pdfjs-additional-layers = 覛邪斜邪褌页芯懈 懈谢芯胁邪谐樱
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 小邪页懈褎邪懈 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 孝邪褋胁懈褉褔邪懈 褋邪页懈褎邪懈 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 袠薪褌懈褏芯斜懈 褋邪页懈褎邪懈 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 小邪页懈褎邪懈 { $page } 邪蟹 { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 衼褎褌邪薪
+    .placeholder = 衼褎褌邪薪 写邪褉 页褍曳曳邪褌鈥�
+pdfjs-find-previous-button =
+    .title = 叶褍褋褌褍曳盈懈 屑邪胁褉懈写懈 覜邪斜谢懈懈 懈斜芯褉邪懈 锌械褕薪懈页芯写褕褍写邪
+pdfjs-find-previous-button-label = 覛邪斜谢樱
+pdfjs-find-next-button =
+    .title = 叶褍褋褌褍曳盈懈 屑邪胁褉懈写懈 薪邪胁斜邪褌懈懈 懈斜芯褉邪懈 锌械褕薪懈页芯写褕褍写邪
+pdfjs-find-next-button-label = 袧邪胁斜邪褌樱
+pdfjs-find-highlight-checkbox = 也邪屑邪邪褕褉芯 斜芯 褉邪薪谐 曳褍写芯 泻邪褉写邪薪
+pdfjs-find-match-case-checkbox-label = 袘芯 写邪褉薪邪蟹邪褉写芯褕褌懈 页邪褉褎页芯懈 褏褍褉写褍 泻邪谢芯薪
+pdfjs-find-match-diacritics-checkbox-label = 袘芯 写邪褉薪邪蟹邪褉写芯褕褌懈 邪谢芯屑邪褌页芯懈 写懈邪泻褉懈褌懈泻樱
+pdfjs-find-entire-word-checkbox-label = 袣邪谢懈屑邪页芯懈 锌褍褉褉邪
+pdfjs-find-reached-top = 袘邪 斜芯谢芯懈 页褍曳曳邪褌 褉邪褋懈写, 邪蟹 锌芯褢薪 懈写芯屑邪 褢褎褌
+pdfjs-find-reached-bottom = 袘邪 锌芯褢薪懈 页褍曳曳邪褌 褉邪褋懈写, 邪蟹 斜芯谢芯 懈写芯屑邪 褢褎褌
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 邪蟹 { $total } 屑褍胁芯褎懈覜邪褌
+       *[other] { $current } 邪蟹 { $total } 屑褍胁芯褎懈覜邪褌
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 袟懈褢写邪 邪蟹 { $limit } 屑褍胁芯褎懈覜邪褌
+       *[other] 袟懈褢写邪 邪蟹 { $limit } 屑褍胁芯褎懈覜邪褌
+    }
+pdfjs-find-not-found = 袠斜芯褉邪 褢褎褌 薪邪褕褍写
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 袗蟹 褉盈懈 锌邪页薪芯懈 褋邪页懈褎邪
+pdfjs-page-scale-fit = 袗蟹 褉盈懈 邪薪写芯蟹邪懈 褋邪页懈褎邪
+pdfjs-page-scale-auto = 袗薪写芯蟹邪懈 褏褍写泻芯褉
+pdfjs-page-scale-actual = 袗薪写芯蟹邪懈 胁芯覜械樱
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 小邪页懈褎邪懈 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 也邪薪谐芯屑懈 斜芯褉泻褍薪懈懈 芦PDF禄 褏邪褌芯 斜邪 屑懈褢薪 芯屑邪写.
+pdfjs-invalid-file-error = 肖邪泄谢懈 芦PDF禄 薪芯写褍褉褍褋褌 褢 胁邪泄褉芯薪褕褍写邪 屑械斜芯褕邪写.
+pdfjs-missing-file-error = 肖邪泄谢懈 芦PDF禄 覔芯懈斜 邪褋褌.
+pdfjs-unexpected-response-error = 叶邪胁芯斜懈 薪芯谐邪页芯薪 邪蟹 褋械褉胁械褉.
+pdfjs-rendering-error = 也邪薪谐芯屑懈 褕邪泻谢褋芯蟹懈懈 褋邪页懈褎邪 褏邪褌芯 斜邪 屑懈褢薪 芯屑邪写.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [也芯褕懈褟薪邪胁懈褋樱 - { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 袘邪褉芯懈 泻褍褕芯写邪薪懈 懈薪 褎邪泄谢懈 芦PDF禄 薪懈页芯薪胁芯卸邪褉芯 胁芯褉懈写 泻褍薪械写.
+pdfjs-password-invalid = 袧懈页芯薪胁芯卸邪懈 薪芯写褍褉褍褋褌. 袥褍褌褎邪薪, 邪蟹 薪邪胁 泻盈褕懈褕 泻褍薪械写.
+pdfjs-password-ok-button = 啸校袘
+pdfjs-password-cancel-button = 袘械泻芯褉 泻邪褉写邪薪
+pdfjs-web-fonts-disabled = 楔褉懈褎褌页芯懈 懈薪褌械褉薪械褌樱 覔邪泄褉懈褎邪褗芯谢邪薪写: 懈褋褌懈褎芯写邪懈 褕褉懈褎褌页芯懈 写邪褉褍薪褋芯褏褌懈 芦PDF禄 覔邪泄褉懈懈屑泻芯薪 邪褋褌.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 袦邪褌薪
+pdfjs-editor-color-picker-free-text-input =
+    .title = 袠胁邪蟹 泻邪褉写邪薪懈 褉邪薪谐懈 屑邪褌薪
+pdfjs-editor-free-text-button-label = 袦邪褌薪
+pdfjs-editor-ink-button =
+    .title = 袪邪褋屑泻邪褕樱
+pdfjs-editor-color-picker-ink-input =
+    .title = 袠胁邪蟹 泻邪褉写邪薪懈 褉邪薪谐懈 褉邪褋屑泻邪褕樱
+pdfjs-editor-ink-button-label = 袪邪褋屑泻邪褕樱
+pdfjs-editor-stamp-button =
+    .title = 袠谢芯胁邪 褢 褌邪页褉懈褉 泻邪褉写邪薪懈 褌邪褋胁懈褉页芯
+pdfjs-editor-stamp-button-label = 袠谢芯胁邪 褢 褌邪页褉懈褉 泻邪褉写邪薪懈 褌邪褋胁懈褉页芯
+pdfjs-editor-highlight-button =
+    .title = 叶褍写芯泻褍薪樱
+pdfjs-editor-highlight-button-label = 叶褍写芯泻褍薪樱
+pdfjs-highlight-floating-button1 =
+    .title = 叶褍写芯泻褍薪樱
+    .aria-label = 叶褍写芯泻褍薪樱
+pdfjs-highlight-floating-button-label = 叶褍写芯泻褍薪樱
+pdfjs-comment-floating-button =
+    .title = 楔邪褉页
+    .aria-label = 楔邪褉页
+pdfjs-comment-floating-button-label = 楔邪褉页
+pdfjs-editor-comment-button =
+    .title = 楔邪褉页
+    .aria-label = 楔邪褉页
+pdfjs-editor-comment-button-label = 楔邪褉页
+pdfjs-editor-signature-button =
+    .title = 袠谢芯胁邪 泻邪褉写邪薪懈 懈屑蟹芯
+pdfjs-editor-signature-button-label = 袠谢芯胁邪 泻邪褉写邪薪懈 懈屑蟹芯
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 袦褍页邪褉褉懈褉懈 曳褍写芯泻褍薪樱
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 袦褍页邪褉褉懈褉懈 褉邪褋屑泻邪褕樱
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 袦褍页邪褉褉懈褉懈 懈屑蟹芯: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 袦褍页邪褉褉懈褉懈 褌邪褋胁懈褉
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 孝芯蟹邪 泻邪褉写邪薪懈 薪邪覜褕邪
+pdfjs-editor-remove-freetext-button =
+    .title = 孝芯蟹邪 泻邪褉写邪薪懈 屑邪褌薪
+pdfjs-editor-remove-stamp-button =
+    .title = 孝芯蟹邪 泻邪褉写邪薪懈 褌邪褋胁懈褉
+pdfjs-editor-remove-highlight-button =
+    .title = 孝芯蟹邪 泻邪褉写邪薪懈 曳褍写芯泻褍薪樱
+pdfjs-editor-remove-signature-button =
+    .title = 孝芯蟹邪 泻邪褉写邪薪懈 懈屑蟹芯
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 袪邪薪谐
+pdfjs-editor-free-text-size-input = 袗薪写芯蟹邪
+pdfjs-editor-ink-color-input = 袪邪薪谐
+pdfjs-editor-ink-thickness-input = 覓邪褎褋樱
+pdfjs-editor-ink-opacity-input = 楔邪褎褎芯褎樱
+pdfjs-editor-stamp-add-image-button =
+    .title = 袠谢芯胁邪 泻邪褉写邪薪懈 褌邪褋胁懈褉
+pdfjs-editor-stamp-add-image-button-label = 袠谢芯胁邪 泻邪褉写邪薪懈 褌邪褋胁懈褉
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 覓邪褎褋樱
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 袠胁邪蟹 泻邪褉写邪薪懈 覔邪褎褋樱 页邪薪谐芯屑懈 曳褍写芯泻褍薪懈懈 褍薪褋褍褉页芯 斜邪 覔邪泄褉 邪蟹 屑邪褌薪
+pdfjs-editor-add-signature-container =
+    .aria-label = 袠写芯褉邪泻褍薪懈懈 懈屑蟹芯页芯 胁邪 懈屑蟹芯页芯懈 谐褍蟹芯褕褌邪褕褍写邪
+pdfjs-editor-signature-add-signature-button =
+    .title = 袠谢芯胁邪 泻邪褉写邪薪懈 懈屑蟹芯懈 薪邪胁
+pdfjs-editor-signature-add-signature-button-label = 袠谢芯胁邪 泻邪褉写邪薪懈 懈屑蟹芯懈 薪邪胁
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 袠屑蟹芯懈 谐褍蟹芯褕褌邪褕褍写邪: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 袦褍页邪褉褉懈褉懈 屑邪褌薪
+    .default-content = 袦邪褌薪褉芯 胁芯褉懈写 泻褍薪械写鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 楔邪褉页
+       *[other] 楔邪褉页页芯
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 袩盈褕懈写邪薪懈 薪邪胁芯褉懈 曳芯薪懈斜樱
+    .aria-label = 袩盈褕懈写邪薪懈 薪邪胁芯褉懈 曳芯薪懈斜樱
+pdfjs-editor-comments-sidebar-close-button-label = 袩盈褕懈写邪薪懈 薪邪胁芯褉懈 曳芯薪懈斜樱
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 效懈蟹懈 写懈覜覜邪褌邪薪谐械蟹褉芯 屑褍褕芯页懈写邪 泻邪褉写械写? 袨薪褉芯 覜邪泄写 泻褍薪械写 胁邪 斜邪 芯薪 褕邪褉页 谐褍蟹芯褉械写.
+pdfjs-editor-comments-sidebar-no-comments-link = 袦邪褗谢褍屑芯褌懈 斜械褕褌邪褉
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 袦邪褌薪懈 懈谢芯胁邪谐樱
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 孝邪页褉懈褉 泻邪褉写邪薪懈 屑邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪
+pdfjs-editor-alt-text-dialog-label = 袠屑泻芯薪械褉芯 懈薪褌懈褏芯斜 薪邪屑芯械写
+pdfjs-editor-alt-text-dialog-description = 袙邪覜褌械 泻懈 芯写邪屑芯薪 褌邪褋胁懈褉褉芯 写懈写邪 薪邪屑械褌邪胁芯薪邪薪写 褢 胁邪覜褌械 泻懈 褌邪褋胁懈褉 斜芯褉 泻邪褉写邪 薪邪屑械褕邪胁邪写, 屑邪褌薪懈 懈谢芯胁邪谐樱 (Alt text) 泻褍屑邪泻 屑械褉邪褋芯薪邪写.
+pdfjs-editor-alt-text-add-description-label = 袠谢芯胁邪 泻邪褉写邪薪懈 褌邪胁褋懈褎
+pdfjs-editor-alt-text-add-description-description = 袣盈褕懈褕 泻褍薪械写, 泻懈 1-2 曳褍屑谢邪械褉芯 薪邪胁懈褋械写, 泻懈 斜邪 屑邪胁蟹盈褗, 褌邪薪蟹懈屑 褢 邪屑邪谢页芯 褌邪胁蟹械页 屑械写懈页邪写.
+pdfjs-editor-alt-text-mark-decorative-label = 袚褍蟹芯褕褌邪薪 页邪屑褔褍薪 屑邪褌薪懈 芯褉芯懈褕樱
+pdfjs-editor-alt-text-mark-decorative-description = 袠薪 斜邪褉芯懈 褌邪褋胁懈褉页芯懈 芯褉芯懈褕樱, 斜邪 屑芯薪邪薪写懈 屑邪褉蟹页芯 褢 邪谢芯屑邪褌页芯懈 芯斜樱, 懈褋褌懈褎芯写邪 屑械褕邪胁邪写.
+pdfjs-editor-alt-text-cancel-button = 袘械泻芯褉 泻邪褉写邪薪
+pdfjs-editor-alt-text-save-button = 袧懈谐芯页 写芯褕褌邪薪
+pdfjs-editor-alt-text-decorative-tooltip = 也邪屑褔褍薪 屑邪褌薪懈 芯褉芯懈褕樱 谐褍蟹芯褕褌邪 褕褍写
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 袘邪褉芯懈 屑懈褋芯谢, 芦袦邪薪 蟹邪斜芯薪懈 褌芯曳懈泻懈褉芯 写盈褋褌 屑械写芯褉邪屑禄
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 袦邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 袣褍薪曳懈 褔邪锌懈 斜芯谢芯 鈥� 褌邪覔泄懈褉 写芯写邪薪懈 邪薪写芯蟹邪
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 袣邪薪芯褉懈 屑懈褢薪邪懈 斜芯谢芯 鈥� 褌邪覔泄懈褉 写芯写邪薪懈 邪薪写芯蟹邪
+pdfjs-editor-resizer-top-right =
+    .aria-label = 袣褍薪曳懈 褉芯褋褌懈 斜芯谢芯 鈥� 褌邪覔泄懈褉 写芯写邪薪懈 邪薪写芯蟹邪
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 袣邪薪芯褉懈 屑懈褢薪邪懈 褉芯褋褌 鈥� 褌邪覔泄懈褉 写芯写邪薪懈 邪薪写芯蟹邪
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 袣褍薪曳懈 褉芯褋褌懈 锌芯褢薪 鈥� 褌邪覔泄懈褉 写芯写邪薪懈 邪薪写芯蟹邪
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 袣邪薪芯褉懈 屑懈褢薪邪懈 锌芯褢薪 鈥� 褌邪覔泄懈褉 写芯写邪薪懈 邪薪写芯蟹邪
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 袣褍薪曳懈 褔邪锌懈 锌芯褢薪 鈥� 褌邪覔泄懈褉 写芯写邪薪懈 邪薪写芯蟹邪
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 袣邪薪芯褉懈 屑懈褢薪邪懈 褔邪锌 鈥� 褌邪覔泄懈褉 写芯写邪薪懈 邪薪写芯蟹邪
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 袪邪薪谐懈 曳褍写芯泻褍薪樱
+pdfjs-editor-colorpicker-button =
+    .title = 袠胁邪蟹 泻邪褉写邪薪懈 褉邪薪谐
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 袠薪褌懈褏芯斜懈 褉邪薪谐
+pdfjs-editor-colorpicker-yellow =
+    .title = 袟邪褉写
+pdfjs-editor-colorpicker-green =
+    .title = 小邪斜蟹
+pdfjs-editor-colorpicker-blue =
+    .title = 袣邪斜褍写
+pdfjs-editor-colorpicker-pink =
+    .title = 袚褍谢芯斜樱
+pdfjs-editor-colorpicker-red =
+    .title = 小褍褉褏
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 也邪屑邪褉芯 薪邪屑芯懈褕 写芯写邪薪
+pdfjs-editor-highlight-show-all-button =
+    .title = 也邪屑邪褉芯 薪邪屑芯懈褕 写芯写邪薪
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 孝邪页褉懈褉 泻邪褉写邪薪懈 屑邪褌薪懈 懈谢芯胁邪谐樱 (褌邪褎褋懈褉懈 褌邪褋胁懈褉)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 袠谢芯胁邪 泻邪褉写邪薪懈 屑邪褌薪懈 懈谢芯胁邪谐樱 (褌邪褎褋懈褉懈 褌邪褋胁懈褉)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 孝邪褎褋懈褉懈 褏褍写褉芯 写邪褉 懈薪 曳芯 薪邪胁懈褋械写鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 孝邪胁褋懈褎懈 屑褍褏褌邪褋邪褉 斜邪褉芯懈 芯写邪屑芯薪械, 泻懈 邪泻褋页芯褉芯 写懈写邪 薪邪屑械褌邪胁芯薪邪薪写 褢 胁邪覜褌械 泻懈 邪泻褋页芯 泻褍褕芯写邪 薪邪屑械褕邪胁邪薪写.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 袠薪 屑邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪 斜邪 褌邪胁褉懈 褏褍写泻芯褉 褋芯褏褌邪 褕褍写邪邪褋褌 胁邪 褕芯褟写 薪芯写褍褉褍褋褌 斜芯褕邪写.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 袦邪褗谢褍屑芯褌懈 斜械褕褌邪褉
+pdfjs-editor-new-alt-text-create-automatically-button-label = 袘邪 褌邪胁褉懈 褏褍写泻芯褉 褝曳芯写 泻邪褉写邪薪懈 屑邪褌薪懈 懈谢芯胁邪谐樱
+pdfjs-editor-new-alt-text-not-now-button = 也芯谢芯 薪械
+pdfjs-editor-new-alt-text-error-title = 袦邪褌薪懈 懈谢芯胁邪谐樱 斜邪 褌邪胁褉懈 褏褍写泻芯褉 褝曳芯写 泻邪褉写邪 薪邪褕褍写
+pdfjs-editor-new-alt-text-error-description = 袥褍褌褎邪薪, 屑邪褌薪懈 懈谢芯胁邪谐懈懈 褏褍写褉芯 胁芯褉懈写 泻褍薪械写 褢 斜邪褗写褌邪褉 邪蟹 薪邪胁 泻盈褕懈褕 泻褍薪械写.
+pdfjs-editor-new-alt-text-error-close-button = 袩盈褕懈写邪薪
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 袘芯褉谐懈褉懈懈 屑芯写械谢懈 蟹械页薪懈 褋褍薪褗樱 (AI) 斜邪褉芯懈 屑邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪 ({ $downloadedSize } 邪蟹 { $totalSize } 袦袘)
+    .aria-valuetext = 袘芯褉谐懈褉懈懈 屑芯写械谢懈 蟹械页薪懈 褋褍薪褗樱 (AI) 斜邪褉芯懈 屑邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪 ({ $downloadedSize } 邪蟹 { $totalSize } 袦袘)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 袦邪褌薪懈 懈谢芯胁邪谐樱 懈谢芯胁邪 泻邪褉写邪 褕褍写
+pdfjs-editor-new-alt-text-added-button-label = 袦邪褌薪懈 懈谢芯胁邪谐樱 懈谢芯胁邪 泻邪褉写邪 褕褍写
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 袦邪褌薪懈 懈谢芯胁邪谐樱 胁褍曳褍写 薪邪写芯褉邪写
+pdfjs-editor-new-alt-text-missing-button-label = 袦邪褌薪懈 懈谢芯胁邪谐樱 胁褍曳褍写 薪邪写芯褉邪写
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 袘芯蟹薪懈谐邪褉樱 泻邪褉写邪薪懈 屑邪褌薪懈 懈谢芯胁邪谐樱
+pdfjs-editor-new-alt-text-to-review-button-label = 袘芯蟹薪懈谐邪褉樱 泻邪褉写邪薪懈 屑邪褌薪懈 懈谢芯胁邪谐樱
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 袘邪 褌邪胁褉懈 褏褍写泻芯褉 褋芯褏褌邪 褕褍写邪邪褋褌: 芦{ $generatedAltText }禄
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 孝邪薪蟹懈屑芯褌懈 屑邪褌薪懈 懈谢芯胁邪谐懈懈 褌邪褋胁懈褉
+pdfjs-image-alt-text-settings-button-label = 孝邪薪蟹懈屑芯褌懈 屑邪褌薪懈 懈谢芯胁邪谐懈懈 褌邪褋胁懈褉
+pdfjs-editor-alt-text-settings-dialog-label = 孝邪薪蟹懈屑芯褌懈 屑邪褌薪懈 懈谢芯胁邪谐懈懈 褌邪褋胁懈褉
+pdfjs-editor-alt-text-settings-automatic-title = 袦邪褌薪懈 懈谢芯胁邪谐懈懈 褏褍写泻芯褉
+pdfjs-editor-alt-text-settings-create-model-button-label = 袘邪 褌邪胁褉懈 褏褍写泻芯褉 褝曳芯写 泻邪褉写邪薪懈 屑邪褌薪懈 懈谢芯胁邪谐樱
+pdfjs-editor-alt-text-settings-create-model-description = 袠薪 懈屑泻芯薪 斜邪褉芯懈 褉邪褋芯薪懈写邪薪懈 泻褍屑邪泻 斜邪 芯写邪屑芯薪械, 泻懈 邪泻褋页芯褉芯 写懈写邪 薪邪屑械褌邪胁芯薪邪薪写 褢 胁邪覜褌械 泻懈 邪泻褋页芯 泻褍褕芯写邪 薪邪屑械褕邪胁邪薪写, 褌邪胁褋懈褎懈 邪泻褋页芯褉芯 锌械褕薪懈页芯写 屑械泻褍薪邪写.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 袦芯写械谢懈 蟹械页薪懈 褋褍薪褗樱 芦AI禄 斜邪褉芯懈 屑邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪 ({ $totalSize } 袦袘)
+pdfjs-editor-alt-text-settings-ai-model-description = 袛邪褉 写邪褋褌谐芯页懈 褕褍屑芯 斜邪 褌邪胁褉懈 屑邪页邪谢谢樱 泻芯褉 屑械泻褍薪邪写, 斜懈薪芯斜邪褉 懈薪 屑邪褏褎懈褟褌懈 屑邪褗谢褍屑芯褌懈 褕邪褏褋懈懈 褕褍屑芯 薪懈谐芯页 写芯褕褌邪 屑械褕邪胁邪写. 袘邪褉芯懈 屑邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪懈 褏褍写泻芯褉 谢芯蟹懈屑 邪褋褌.
+pdfjs-editor-alt-text-settings-delete-model-button = 袧械褋褌 泻邪褉写邪薪
+pdfjs-editor-alt-text-settings-download-model-button = 袘芯褉谐懈褉樱 泻邪褉写邪薪
+pdfjs-editor-alt-text-settings-downloading-model-button = 袛邪褉 页芯谢懈 斜芯褉谐懈褉樱鈥�
+pdfjs-editor-alt-text-settings-editor-title = 袦褍页邪褉褉懈褉懈 屑邪褌薪懈 懈谢芯胁邪谐樱
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 袛邪褉页芯谢 薪懈褕芯薪 写芯写邪薪懈 屑褍页邪褉褉懈褉懈 屑邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪 页邪薪谐芯屑懈 懈谢芯胁邪泻褍薪懈懈 褌邪褋胁懈褉
+pdfjs-editor-alt-text-settings-show-dialog-description = 袘邪 褕褍屑芯 泻褍屑邪泻 屑械泻褍薪邪写, 泻懈 斜芯胁邪褉樱 页芯褋懈谢 泻褍薪械写, 泻懈 页邪屑邪懈 褌邪褋胁懈褉页芯懈 褕褍屑芯 写芯褉芯懈 屑邪褌薪懈 懈胁邪蟹泻褍薪邪薪写邪 屑械斜芯褕邪薪写.
+pdfjs-editor-alt-text-settings-close-button = 袩盈褕懈写邪薪
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 叶褍写芯泻褍薪樱 懈谢芯胁邪 泻邪褉写邪 褕褍写
+pdfjs-editor-freetext-added-alert = 袦邪褌薪 懈谢芯胁邪 泻邪褉写邪 褕褍写
+pdfjs-editor-ink-added-alert = 袪邪褋屑 懈谢芯胁邪 泻邪褉写邪 褕褍写
+pdfjs-editor-stamp-added-alert = 孝邪褋胁懈褉 懈谢芯胁邪 泻邪褉写邪 褕褍写
+pdfjs-editor-signature-added-alert = 袠屑蟹芯 懈谢芯胁邪 泻邪褉写邪 褕褍写
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 叶褍写芯褋芯蟹樱 褌芯蟹邪 泻邪褉写邪 褕褍写
+pdfjs-editor-undo-bar-message-freetext = 袦邪褌薪 褌芯蟹邪 泻邪褉写邪 褕褍写
+pdfjs-editor-undo-bar-message-ink = 袪邪褋屑 褌芯蟹邪 泻邪褉写邪 褕褍写
+pdfjs-editor-undo-bar-message-stamp = 孝邪褋胁懈褉 褌芯蟹邪 泻邪褉写邪 褕褍写
+pdfjs-editor-undo-bar-message-signature = 袠屑蟹芯 褌芯蟹邪 泻邪褉写邪 褕褍写
+pdfjs-editor-undo-bar-message-comment = 楔邪褉页 褌芯蟹邪 泻邪褉写邪 褕褍写
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 页芯褕懈褟薪邪胁懈褋樱 褌芯蟹邪 泻邪褉写邪 褕褍写
+       *[other] { $count } 页芯褕懈褟薪邪胁懈褋樱 褌芯蟹邪 泻邪褉写邪 褕褍写邪薪写
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 袘械泻芯褉 泻邪褉写邪薪
+pdfjs-editor-undo-bar-undo-button-label = 袘械泻芯褉 泻邪褉写邪薪
+pdfjs-editor-undo-bar-close-button =
+    .title = 袩盈褕懈写邪薪
+pdfjs-editor-undo-bar-close-button-label = 袩盈褕懈写邪薪
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 袠薪 褉邪胁蟹邪薪邪懈 蟹芯页懈褉樱 斜邪 泻芯褉斜邪褉 懈屑泻芯薪 屑械写懈页邪写, 泻懈 褌邪胁芯薪邪写 懈屑蟹芯械褉芯 褝曳芯写 泻邪褉写邪, 斜邪 页褍曳曳邪褌懈 芦PDF禄 懈谢芯胁邪 薪邪屑芯褟写. 袣芯褉斜邪褉 屑械褌邪胁芯薪邪写 薪芯屑褉芯 褌邪页褉懈褉 泻褍薪邪写 (薪芯屑, 懈薪褔褍薪懈薪, 页邪屑褔褍薪 屑邪褌薪懈 懈谢芯胁邪谐樱 褏懈蟹屑邪褌 屑械泻褍薪邪写), 胁邪 懈褏褌懈褢褉邪薪 懈屑蟹芯褉芯 斜邪褉芯懈 懈褋褌懈褎芯写邪懈 褌邪泻褉芯褉樱 薪懈谐芯页 屑械写芯褉邪写.
+pdfjs-editor-add-signature-dialog-title = 袠谢芯胁邪 泻邪褉写邪薪懈 懈屑蟹芯
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 袧邪胁懈褋械写
+    .title = 袧邪胁懈褋械写
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 袠屑蟹芯 谐褍蟹芯褉械写
+    .title = 袠屑蟹芯 谐褍蟹芯褉械写
+pdfjs-editor-add-signature-image-button = 孝邪褋胁懈褉
+    .title = 孝邪褋胁懈褉
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 袠屑蟹芯懈 褏褍写褉芯 斜芯 薪芯屑 薪邪胁懈褋械写
+    .placeholder = 袠屑蟹芯懈 褏褍写褉芯 斜芯 薪芯屑 薪邪胁懈褋械写
+pdfjs-editor-add-signature-draw-placeholder = 袠屑蟹芯懈 褏褍写褉芯 泻邪褕懈写邪, 谐褍蟹芯褉械写
+pdfjs-editor-add-signature-draw-thickness-range-label = 覓邪褎褋樱
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 覓邪褎褋懈懈 懈屑蟹芯: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 袘邪褉芯懈 斜芯褉 泻邪褉写邪薪懈 褎邪泄谢, 芯薪褉芯 写邪褉 懈薪 曳芯泄 泻邪褕懈写邪, 谐褍蟹芯褉械写
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 衼 褎邪泄谢页芯懈 褌邪褋胁懈褉懈褉芯 懈薪褌懈褏芯斜 泻褍薪械写
+       *[other] 衼 褎邪泄谢页芯懈 褌邪褋胁懈褉懈褉芯 懈薪褌懈褏芯斜 泻褍薪械写
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 孝邪胁褋懈褎 (屑邪褌薪懈 懈谢芯胁邪谐樱)
+pdfjs-editor-add-signature-description-input =
+    .title = 孝邪胁褋懈褎 (屑邪褌薪懈 懈谢芯胁邪谐樱)
+pdfjs-editor-add-signature-description-default-when-drawing = 袠屑蟹芯
+pdfjs-editor-add-signature-clear-button-label = 袩芯泻 泻邪褉写邪薪懈 懈屑蟹芯
+pdfjs-editor-add-signature-clear-button =
+    .title = 袩芯泻 泻邪褉写邪薪懈 懈屑蟹芯
+pdfjs-editor-add-signature-save-checkbox = 袧懈谐芯页 写芯褕褌邪薪懈 懈屑蟹芯
+pdfjs-editor-add-signature-save-warning-message = 楔褍屑芯 斜邪 页邪写写懈 5 懈屑蟹芯懈 薪懈谐芯页写芯褕褌邪褕褍写邪 褉邪褋懈写械写. 袘邪褉芯懈 薪懈谐芯页 写芯褕褌邪薪懈 懈屑蟹芯懈 薪邪胁, 褟泻械 邪蟹 懈屑蟹芯页芯懈 薪懈谐芯页写芯褕褌邪褕褍写邪褉芯 褌芯蟹邪 薪邪屑芯械写.
+pdfjs-editor-add-signature-image-upload-error-title = 孝邪褋胁懈褉 斜芯褉 泻邪褉写邪 薪邪褕褍写
+pdfjs-editor-add-signature-image-upload-error-description = 袩邪泄胁邪褋褌褕邪胁懈懈 褕邪斜邪泻邪懈 褏褍写褉芯 褋邪薪曳械写 褢 褌邪褋胁懈褉懈 写懈谐邪褉械褉芯 泻盈褕懈褕 泻褍薪械写.
+pdfjs-editor-add-signature-image-no-data-error-title = 袠薪 褌邪褋胁懈褉 斜邪 懈屑蟹芯 褌邪斜写懈谢 写芯写邪 薪邪褕褍写
+pdfjs-editor-add-signature-image-no-data-error-description = 袥褍褌褎邪薪, 泻盈褕懈褕 泻褍薪械写, 泻懈 褌邪褋胁懈褉懈 写懈谐邪褉械褉芯 斜芯褉 薪邪屑芯械写.
+pdfjs-editor-add-signature-error-close-button = 袩盈褕懈写邪薪
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 袘械泻芯褉 泻邪褉写邪薪
+pdfjs-editor-add-signature-add-button = 袠谢芯胁邪 泻邪褉写邪薪
+pdfjs-editor-edit-signature-update-button = 袧邪胁褋芯蟹樱 泻邪褉写邪薪
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 孝邪页褉懈褉 泻邪褉写邪薪懈 褕邪褉页
+pdfjs-editor-edit-comment-popup-button =
+    .title = 孝邪页褉懈褉 泻邪褉写邪薪懈 褕邪褉页
+pdfjs-editor-delete-comment-popup-button-label = 孝芯蟹邪 泻邪褉写邪薪懈 褕邪褉页
+pdfjs-editor-delete-comment-popup-button =
+    .title = 孝芯蟹邪 泻邪褉写邪薪懈 褕邪褉页
+pdfjs-show-comment-button =
+    .title = 袧懈褕芯薪 写芯写邪薪懈 褕邪褉页
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 孝邪页褉懈褉 泻邪褉写邪薪懈 褕邪褉页
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 袧邪胁褋芯蟹樱 泻邪褉写邪薪
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 袠谢芯胁邪 泻邪褉写邪薪懈 褕邪褉页
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 袠谢芯胁邪 泻邪褉写邪薪
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 袧邪胁懈褋械写鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 袘械泻芯褉 泻邪褉写邪薪
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 袠谢芯胁邪 泻邪褉写邪薪懈 褕邪褉页
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 肖邪褗芯谢 泻邪褉写邪薪懈 薪邪胁芯褉懈 曳芯薪懈斜樱 (页褍曳曳邪褌 写芯褉芯懈 褌邪褋胁懈褉褔邪页芯/褋芯褏褌芯褉/蟹邪屑懈屑邪页芯/覜邪斜邪褌页芯 屑械斜芯褕邪写)
+pdfjs-toggle-views-manager-button1-label = 袠写芯褉邪泻褍薪懈懈 褋邪页懈褎邪页芯
+pdfjs-views-manager-sidebar =
+    .aria-label = 袧邪胁芯褉懈 曳芯薪懈斜樱
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 孝邪覔泄懈褉懈 邪薪写芯蟹邪懈 薪邪胁芯褉懈 曳芯薪懈斜樱
+pdfjs-views-manager-view-selector-button =
+    .title = 袧邪屑褍写页芯
+pdfjs-views-manager-view-selector-button-label = 袧邪屑褍写页芯
+pdfjs-views-manager-pages-title = 小邪页懈褎邪页芯
+pdfjs-views-manager-attachments-title = 袟邪屑懈屑邪页芯
+pdfjs-views-manager-pages-option-label = 小邪页懈褎邪页芯
+pdfjs-views-manager-outlines-option-label = 小芯褏褌芯褉懈 页褍曳曳邪褌
+pdfjs-views-manager-attachments-option-label = 袟邪屑懈屑邪页芯
+pdfjs-views-manager-layers-option-label = 覛邪斜邪褌页芯
+pdfjs-views-manager-add-file-button =
+    .title = 袠谢芯胁邪 泻邪褉写邪薪懈 褎邪泄谢
+pdfjs-views-manager-add-file-button-label = 袠谢芯胁邪 泻邪褉写邪薪懈 褎邪泄谢
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } 懈薪褌懈褏芯斜 褕褍写
+       *[other] { $count } 懈薪褌懈褏芯斜 褕褍写邪薪写
+    }
+pdfjs-views-manager-pages-status-none-action-label = 小邪页懈褎邪页芯褉芯 懈薪褌懈褏芯斜 薪邪屑芯械写
+pdfjs-views-manager-pages-status-action-button-label = 袠写芯褉邪 泻邪褉写邪薪
+pdfjs-views-manager-pages-status-copy-button-label = 袧褍褋褏邪 斜邪褉写芯褕褌邪薪
+pdfjs-views-manager-pages-status-cut-button-label = 袘褍褉懈写邪薪
+pdfjs-views-manager-pages-status-delete-button-label = 袧械褋褌 泻邪褉写邪薪
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 褋邪页懈褎邪 斜褍褉懈写邪 褕褍写
+       *[other] { $count } 褋邪页懈褎邪 斜褍褉懈写邪 褕褍写邪薪写
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 褋邪页懈褎邪 薪褍褋褏邪 斜邪褉写芯褕褌邪 褕褍写
+       *[other] { $count } 褋邪页懈褎邪 薪褍褋褏邪 斜邪褉写芯褕褌邪 褕褍写邪薪写
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 褋邪页懈褎邪 薪械褋褌 泻邪褉写邪 褕褍写
+       *[other] { $count } 褋邪页懈褎邪 薪械褋褌 泻邪褉写邪 褕褍写邪薪写
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 肖邪泄谢懈 褕褍屑芯 芯屑芯写邪 屑械褕邪胁邪写鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 袛邪褉 页芯谢懈 斜芯褉泻褍薪懈懈 褎邪泄谢鈥�
+pdfjs-views-manager-status-warning-cut-label = 袘褍褉懈写邪 薪邪褕褍写. 小邪页懈褎邪褉芯 薪邪胁褋芯蟹樱 泻褍薪械写 胁邪 邪蟹 薪邪胁 泻盈褕懈褕 薪邪屑芯械写.
+pdfjs-views-manager-status-warning-copy-label = 袧褍褋褏邪 斜邪褉写芯褕褌邪 薪邪褕褍写. 小邪页懈褎邪褉芯 薪邪胁褋芯蟹樱 泻褍薪械写 胁邪 邪蟹 薪邪胁 泻盈褕懈褕 薪邪屑芯械写.
+pdfjs-views-manager-status-warning-delete-label = 袧械褋褌 泻邪褉写邪 薪邪褕褍写. 小邪页懈褎邪褉芯 薪邪胁褋芯蟹樱 泻褍薪械写 胁邪 邪蟹 薪邪胁 泻盈褕懈褕 薪邪屑芯械写.
+pdfjs-views-manager-status-warning-save-label = 袧懈谐芯页 写芯褕褌邪 薪邪褕褍写. 小邪页懈褎邪褉芯 薪邪胁褋芯蟹樱 泻褍薪械写 胁邪 邪蟹 薪邪胁 泻盈褕懈褕 薪邪屑芯械写.
+pdfjs-views-manager-status-undo-button-label = 袘械泻芯褉 泻邪褉写邪薪
+pdfjs-views-manager-status-done-button-label = 孝邪泄褢褉
+pdfjs-views-manager-status-close-button =
+    .title = 袩盈褕懈写邪薪
+pdfjs-views-manager-status-close-button-label = 袩盈褕懈写邪薪
+pdfjs-views-manager-paste-button-label = 袚褍蟹芯褕褌邪薪
+pdfjs-views-manager-paste-button-before =
+    .title = 袚褍蟹芯褕褌邪薪 锌械褕 邪蟹 褋邪页懈褎邪懈 邪胁胁邪谢懈薪
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 袚褍蟹芯褕褌邪薪 锌邪褋 邪蟹 褋邪页懈褎邪懈 { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 袧袗袙
+pdfjs-toggle-views-manager-button1 =
+    .title = 袠写芯褉邪泻褍薪懈懈 褋邪页懈褎邪页芯
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 孝芯蟹邪 泻邪褉写邪薪懈 懈屑蟹芯懈 谐褍蟹芯褕褌邪褕褍写邪
+pdfjs-editor-delete-signature-button-label1 = 孝芯蟹邪 泻邪褉写邪薪懈 懈屑蟹芯懈 谐褍蟹芯褕褌邪褕褍写邪
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 孝邪页褉懈褉 泻邪褉写邪薪懈 褌邪胁褋懈褎
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 孝邪页褉懈褉 泻邪褉写邪薪懈 褌邪胁褋懈褎
diff --git a/public/pdfjs/web/locale/th/viewer.ftl b/public/pdfjs/web/locale/th/viewer.ftl
new file mode 100644
index 0000000..ccc0034
--- /dev/null
+++ b/public/pdfjs/web/locale/th/viewer.ftl
@@ -0,0 +1,715 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 喔笝喙夃覆喔佮箞喔笝喔笝喙夃覆
+pdfjs-previous-button-label = 喔佮箞喔笝喔笝喙夃覆
+pdfjs-next-button =
+    .title = 喔笝喙夃覆喔栢副喔斷箘喔�
+pdfjs-next-button-label = 喔栢副喔斷箘喔�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 喔笝喙夃覆
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 喔堗覆喔� { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 喔堗覆喔� { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 喔嬥腹喔∴腑喔竵
+pdfjs-zoom-out-button-label = 喔嬥腹喔∴腑喔竵
+pdfjs-zoom-in-button =
+    .title = 喔嬥腹喔∴箑喔傕箟喔�
+pdfjs-zoom-in-button-label = 喔嬥腹喔∴箑喔傕箟喔�
+pdfjs-zoom-select =
+    .title = 喔嬥腹喔�
+pdfjs-presentation-mode-button =
+    .title = 喔弗喔编笟喙�喔涏箛喔權箓喔浮喔斷竵喔侧福喔權赋喙�喔笝喔�
+pdfjs-presentation-mode-button-label = 喙傕斧喔∴笖喔佮覆喔`笝喔赤箑喔笝喔�
+pdfjs-open-file-button =
+    .title = 喙�喔涏复喔斷箘喔熰弗喙�
+pdfjs-open-file-button-label = 喙�喔涏复喔�
+pdfjs-print-button =
+    .title = 喔炧复喔∴笧喙�
+pdfjs-print-button-label = 喔炧复喔∴笧喙�
+pdfjs-save-button =
+    .title = 喔氞副喔權笚喔多竵
+pdfjs-save-button-label = 喔氞副喔權笚喔多竵
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 喔斷覆喔о笝喙屶箓喔弗喔�
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 喔斷覆喔о笝喙屶箓喔弗喔�
+pdfjs-bookmark-button =
+    .title = 喔笝喙夃覆喔涏副喔堗笀喔膏笟喔编笝 (喔斷腹 URL 喔堗覆喔佮斧喔權箟喔侧笡喔编笀喔堗父喔氞副喔�)
+pdfjs-bookmark-button-label = 喔笝喙夃覆喔涏副喔堗笀喔膏笟喔编笝
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 喙�喔勦福喔粪箞喔竾喔∴阜喔�
+pdfjs-tools-button-label = 喙�喔勦福喔粪箞喔竾喔∴阜喔�
+pdfjs-first-page-button =
+    .title = 喙勦笡喔⑧副喔囙斧喔權箟喔侧箒喔`竵
+pdfjs-first-page-button-label = 喙勦笡喔⑧副喔囙斧喔權箟喔侧箒喔`竵
+pdfjs-last-page-button =
+    .title = 喙勦笡喔⑧副喔囙斧喔權箟喔侧釜喔膏笖喔椸箟喔侧涪
+pdfjs-last-page-button-label = 喙勦笡喔⑧副喔囙斧喔權箟喔侧釜喔膏笖喔椸箟喔侧涪
+pdfjs-page-rotate-cw-button =
+    .title = 喔浮喔膏笝喔曕覆喔∴箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+pdfjs-page-rotate-cw-button-label = 喔浮喔膏笝喔曕覆喔∴箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+pdfjs-page-rotate-ccw-button =
+    .title = 喔浮喔膏笝喔椸抚喔權箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+pdfjs-page-rotate-ccw-button-label = 喔浮喔膏笝喔椸抚喔權箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+pdfjs-cursor-text-select-tool-button =
+    .title = 喙�喔涏复喔斷箖喔娻箟喔囙覆喔權箑喔勦福喔粪箞喔竾喔∴阜喔竵喔侧福喙�喔ム阜喔竵喔傕箟喔竸喔о覆喔�
+pdfjs-cursor-text-select-tool-button-label = 喙�喔勦福喔粪箞喔竾喔∴阜喔竵喔侧福喙�喔ム阜喔竵喔傕箟喔竸喔о覆喔�
+pdfjs-cursor-hand-tool-button =
+    .title = 喙�喔涏复喔斷箖喔娻箟喔囙覆喔權箑喔勦福喔粪箞喔竾喔∴阜喔浮喔粪腑
+pdfjs-cursor-hand-tool-button-label = 喙�喔勦福喔粪箞喔竾喔∴阜喔浮喔粪腑
+pdfjs-scroll-page-button =
+    .title = 喙冟笂喙夃竵喔侧福喙�喔ム阜喙堗腑喔權斧喔權箟喔�
+pdfjs-scroll-page-button-label = 喔佮覆喔`箑喔ム阜喙堗腑喔權斧喔權箟喔�
+pdfjs-scroll-vertical-button =
+    .title = 喙冟笂喙夃竵喔侧福喙�喔ム阜喙堗腑喔權箒喔權抚喔曕副喙夃竾
+pdfjs-scroll-vertical-button-label = 喔佮覆喔`箑喔ム阜喙堗腑喔權箒喔權抚喔曕副喙夃竾
+pdfjs-scroll-horizontal-button =
+    .title = 喙冟笂喙夃竵喔侧福喙�喔ム阜喙堗腑喔權箒喔權抚喔權腑喔�
+pdfjs-scroll-horizontal-button-label = 喔佮覆喔`箑喔ム阜喙堗腑喔權箒喔權抚喔權腑喔�
+pdfjs-scroll-wrapped-button =
+    .title = 喙冟笂喙夃竵喔侧福喙�喔ム阜喙堗腑喔權箒喔氞笟喔勦弗喔膏浮
+pdfjs-scroll-wrapped-button-label = 喙�喔ム阜喙堗腑喔權箒喔氞笟喔勦弗喔膏浮
+pdfjs-spread-none-button =
+    .title = 喙勦浮喙堗笗喙夃腑喔囙福喔о浮喔佮覆喔`竵喔`赴喔堗覆喔⑧斧喔權箟喔�
+pdfjs-spread-none-button-label = 喙勦浮喙堗竵喔`赴喔堗覆喔�
+pdfjs-spread-odd-button =
+    .title = 喔`抚喔∴竵喔侧福喔佮福喔班笀喔侧涪喔笝喙夃覆喙�喔`复喙堗浮喔堗覆喔佮斧喔權箟喔侧竸喔掂箞
+pdfjs-spread-odd-button-label = 喔佮福喔班笀喔侧涪喔涪喙堗覆喔囙箑喔弗喔粪腑喙�喔ㄠ俯
+pdfjs-spread-even-button =
+    .title = 喔`抚喔∴竵喔侧福喔佮福喔班笀喔侧涪喔笝喙夃覆喙�喔`复喙堗浮喔堗覆喔佮斧喔權箟喔侧竸喔灌箞
+pdfjs-spread-even-button-label = 喔佮福喔班笀喔侧涪喔涪喙堗覆喔囙箑喔椸箞喔侧箑喔椸傅喔⑧浮
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 喔勦父喔撪釜喔∴笟喔编笗喔脆箑喔竵喔覆喔b��
+pdfjs-document-properties-button-label = 喔勦父喔撪釜喔∴笟喔编笗喔脆箑喔竵喔覆喔b��
+pdfjs-document-properties-file-name = 喔娻阜喙堗腑喙勦笩喔ム箤:
+pdfjs-document-properties-file-size = 喔傕笝喔侧笖喙勦笩喔ム箤:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 喙勦笟喔曕箤)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 喙勦笟喔曕箤)
+pdfjs-document-properties-title = 喔娻阜喙堗腑喙�喔`阜喙堗腑喔�:
+pdfjs-document-properties-author = 喔溹腹喙夃釜喔`箟喔侧竾:
+pdfjs-document-properties-subject = 喔娻阜喙堗腑喙�喔`阜喙堗腑喔�:
+pdfjs-document-properties-keywords = 喔勦赋喔赋喔勦副喔�:
+pdfjs-document-properties-creation-date = 喔о副喔權笚喔掂箞喔福喙夃覆喔�:
+pdfjs-document-properties-modification-date = 喔о副喔權笚喔掂箞喙佮竵喙夃箘喔�:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 喔溹腹喙夃釜喔`箟喔侧竾:
+pdfjs-document-properties-producer = 喔溹腹喙夃笢喔ム复喔� PDF:
+pdfjs-document-properties-version = 喔`父喙堗笝 PDF:
+pdfjs-document-properties-page-count = 喔堗赋喔權抚喔權斧喔權箟喔�:
+pdfjs-document-properties-page-size = 喔傕笝喔侧笖喔笝喙夃覆:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 喙佮笝喔о笗喔编箟喔�
+pdfjs-document-properties-page-size-orientation-landscape = 喙佮笝喔о笝喔笝
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 喔堗笖喔浮喔侧涪
+pdfjs-document-properties-page-size-name-legal = 喔傕箟喔竵喔庎斧喔∴覆喔�
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 喔∴父喔∴浮喔竾喙�喔о箛喔氞箒喔氞笟喔`抚喔斷箑喔`箛喔�:
+pdfjs-document-properties-linearized-yes = 喙冟笂喙�
+pdfjs-document-properties-linearized-no = 喙勦浮喙�
+pdfjs-document-properties-close-button = 喔涏复喔�
+
+## Print
+
+pdfjs-print-progress-message = 喔佮赋喔ム副喔囙箑喔曕福喔掂涪喔∴箑喔竵喔覆喔`釜喔赤斧喔`副喔氞竵喔侧福喔炧复喔∴笧喙屸��
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 喔⑧竵喙�喔ム复喔�
+pdfjs-printing-not-supported = 喔勦赋喙�喔曕阜喔笝: 喙�喔氞福喔侧抚喙屶箑喔嬥腑喔`箤喔權傅喙夃箘喔∴箞喙勦笖喙夃釜喔權副喔氞釜喔權父喔權竵喔侧福喔炧复喔∴笧喙屶腑喔⑧箞喔侧竾喙�喔曕箛喔∴笚喔掂箞
+pdfjs-printing-not-ready = 喔勦赋喙�喔曕阜喔笝: PDF 喙勦浮喙堗箘喔斷箟喔`副喔氞竵喔侧福喙傕斧喔ム笖喔涪喙堗覆喔囙箑喔曕箛喔∴笚喔掂箞喔赋喔福喔编笟喔佮覆喔`笧喔脆浮喔炧箤
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 喙�喔涏复喔�/喔涏复喔斷箒喔栢笟喔傕箟喔侧竾
+pdfjs-toggle-sidebar-notification-button =
+    .title = 喙�喔涏复喔�/喔涏复喔斷箒喔栢笟喔傕箟喔侧竾 (喙�喔竵喔覆喔`浮喔掂箑喔勦箟喔侧福喙堗覆喔�/喙勦笩喔ム箤喙佮笝喔�/喙�喔ム箑喔⑧腑喔`箤)
+pdfjs-toggle-sidebar-button-label = 喙�喔涏复喔�/喔涏复喔斷箒喔栢笟喔傕箟喔侧竾
+pdfjs-document-outline-button =
+    .title = 喙佮釜喔斷竾喙�喔勦箟喔侧福喙堗覆喔囙箑喔竵喔覆喔� (喔勦弗喔脆竵喔腑喔囙竸喔`副喙夃竾喙�喔炧阜喙堗腑喔傕涪喔侧涪/喔⑧父喔氞福喔侧涪喔佮覆喔`笚喔编箟喔囙斧喔∴笖)
+pdfjs-document-outline-button-label = 喙�喔勦箟喔侧福喙堗覆喔囙箑喔竵喔覆喔�
+pdfjs-attachments-button =
+    .title = 喙佮釜喔斷竾喙勦笩喔ム箤喙佮笝喔�
+pdfjs-attachments-button-label = 喙勦笩喔ム箤喙佮笝喔�
+pdfjs-layers-button =
+    .title = 喙佮釜喔斷竾喙�喔ム箑喔⑧腑喔`箤 (喔勦弗喔脆竵喔腑喔囙竸喔`副喙夃竾喙�喔炧阜喙堗腑喔`傅喙�喔嬥箛喔曕箑喔ム箑喔⑧腑喔`箤喔椸副喙夃竾喔浮喔斷箑喔涏箛喔權釜喔栢覆喔權赴喙�喔`复喙堗浮喔曕箟喔�)
+pdfjs-layers-button-label = 喙�喔ム箑喔⑧腑喔`箤
+pdfjs-thumbs-button =
+    .title = 喙佮釜喔斷竾喔犩覆喔炧競喔權覆喔斷涪喙堗腑
+pdfjs-thumbs-button-label = 喔犩覆喔炧競喔權覆喔斷涪喙堗腑
+pdfjs-current-outline-item-button =
+    .title = 喔勦箟喔權斧喔侧福喔侧涪喔佮覆喔`箑喔勦箟喔侧福喙堗覆喔囙笡喔编笀喔堗父喔氞副喔�
+pdfjs-current-outline-item-button-label = 喔`覆喔⑧竵喔侧福喙�喔勦箟喔侧福喙堗覆喔囙笡喔编笀喔堗父喔氞副喔�
+pdfjs-findbar-button =
+    .title = 喔勦箟喔權斧喔侧箖喔權箑喔竵喔覆喔�
+pdfjs-findbar-button-label = 喔勦箟喔權斧喔�
+pdfjs-additional-layers = 喙�喔ム箑喔⑧腑喔`箤喙�喔炧复喙堗浮喙�喔曕复喔�
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 喔笝喙夃覆 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 喔犩覆喔炧競喔權覆喔斷涪喙堗腑喔傕腑喔囙斧喔權箟喔� { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 喙�喔ム阜喔竵喔笝喙夃覆 { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 喔笝喙夃覆 { $page } 喔堗覆喔� { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 喔勦箟喔權斧喔�
+    .placeholder = 喔勦箟喔權斧喔侧箖喔權箑喔竵喔覆喔b��
+pdfjs-find-previous-button =
+    .title = 喔覆喔曕赋喙佮斧喔權箞喔囙竵喙堗腑喔權斧喔權箟喔侧競喔竾喔о弗喔�
+pdfjs-find-previous-button-label = 喔佮箞喔笝喔笝喙夃覆
+pdfjs-find-next-button =
+    .title = 喔覆喔曕赋喙佮斧喔權箞喔囙笘喔编笖喙勦笡喔傕腑喔囙抚喔ム傅
+pdfjs-find-next-button-label = 喔栢副喔斷箘喔�
+pdfjs-find-highlight-checkbox = 喙�喔權箟喔權釜喔掂笚喔编箟喔囙斧喔∴笖
+pdfjs-find-match-case-checkbox-label = 喔曕副喔о笧喔脆浮喔炧箤喙冟斧喔嵿箞喙�喔ム箛喔佮笗喔`竾喔佮副喔�
+pdfjs-find-match-diacritics-checkbox-label = 喙�喔勦福喔粪箞喔竾喔浮喔侧涪喔佮赋喔佮副喔氞竵喔侧福喔腑喔佮箑喔傅喔⑧竾喔曕福喔囙竵喔编笝
+pdfjs-find-entire-word-checkbox-label = 喔椸副喙夃竾喔勦赋
+pdfjs-find-reached-top = 喔勦箟喔權斧喔侧笘喔多竾喔堗父喔斷箑喔`复喙堗浮喔曕箟喔權競喔竾喔笝喙夃覆 喙�喔`复喙堗浮喔勦箟喔權笗喙堗腑喔堗覆喔佮笖喙夃覆喔權弗喙堗覆喔�
+pdfjs-find-reached-bottom = 喔勦箟喔權斧喔侧笘喔多竾喔堗父喔斷釜喔脆箟喔權釜喔膏笖喔笝喙夃覆 喙�喔`复喙堗浮喔勦箟喔權笗喙堗腑喔堗覆喔佮笖喙夃覆喔權笟喔�
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count = { $current } 喔堗覆喔� { $total } 喔`覆喔⑧竵喔侧福喔椸傅喙堗笗喔`竾喔佮副喔�
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit = 喔∴覆喔佮竵喔о箞喔� { $limit } 喔`覆喔⑧竵喔侧福喔椸傅喙堗笗喔`竾喔佮副喔�
+pdfjs-find-not-found = 喙勦浮喙堗笧喔氞抚喔ム傅
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 喔勦抚喔侧浮喔佮抚喙夃覆喔囙斧喔權箟喔�
+pdfjs-page-scale-fit = 喔炧腑喔斷傅喔笝喙夃覆
+pdfjs-page-scale-auto = 喔嬥腹喔∴腑喔编笗喙傕笝喔∴副喔曕复
+pdfjs-page-scale-actual = 喔傕笝喔侧笖喔堗福喔脆竾
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 喔笝喙夃覆 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 喙�喔佮复喔斷競喙夃腑喔溹复喔斷笧喔ム覆喔斷競喔撪赴喙傕斧喔ム笖 PDF
+pdfjs-invalid-file-error = 喙勦笩喔ム箤 PDF 喙勦浮喙堗笘喔灌竵喔曕箟喔竾喔福喔粪腑喙�喔傅喔⑧斧喔侧涪
+pdfjs-missing-file-error = 喙勦笩喔ム箤 PDF 喔覆喔⑧箘喔�
+pdfjs-unexpected-response-error = 喔佮覆喔`笗喔笟喔笝喔竾喔傕腑喔囙箑喔嬥复喔`箤喔熰箑喔о腑喔`箤喔椸傅喙堗箘喔∴箞喔勦覆喔斷竸喔脆笖
+pdfjs-rendering-error = 喙�喔佮复喔斷競喙夃腑喔溹复喔斷笧喔ム覆喔斷競喔撪赴喙�喔`笝喙�喔斷腑喔`箤喔笝喙夃覆
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [喔勦赋喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟 { $type }]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 喔涏箟喔笝喔`斧喔编釜喔溹箞喔侧笝喙�喔炧阜喙堗腑喙�喔涏复喔斷箘喔熰弗喙� PDF 喔權傅喙�
+pdfjs-password-invalid = 喔`斧喔编釜喔溹箞喔侧笝喙勦浮喙堗笘喔灌竵喔曕箟喔竾 喙傕笡喔`笖喔ム腑喔囙腑喔掂竵喔勦福喔编箟喔�
+pdfjs-password-ok-button = 喔曕竵喔ム竾
+pdfjs-password-cancel-button = 喔⑧竵喙�喔ム复喔�
+pdfjs-web-fonts-disabled = 喙佮笟喔氞腑喔编竵喔┼福喙�喔о箛喔氞笘喔灌竵喔涏复喔斷箖喔娻箟喔囙覆喔�: 喙勦浮喙堗釜喔侧浮喔侧福喔栢箖喔娻箟喙佮笟喔氞腑喔编竵喔┼福 PDF 喔澿副喔囙笗喔编抚
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 喔傕箟喔竸喔о覆喔�
+pdfjs-editor-color-picker-free-text-input =
+    .title = 喙�喔涏弗喔掂箞喔⑧笝喔傅喔傕箟喔竸喔о覆喔�
+pdfjs-editor-free-text-button-label = 喔傕箟喔竸喔о覆喔�
+pdfjs-editor-ink-button =
+    .title = 喔`腹喔涏抚喔侧笖
+pdfjs-editor-color-picker-ink-input =
+    .title = 喙�喔涏弗喔掂箞喔⑧笝喔傅喔`腹喔涏抚喔侧笖
+pdfjs-editor-ink-button-label = 喔`腹喔涏抚喔侧笖
+pdfjs-editor-stamp-button =
+    .title = 喙�喔炧复喙堗浮喔福喔粪腑喙佮竵喙夃箘喔傕笭喔侧笧
+pdfjs-editor-stamp-button-label = 喙�喔炧复喙堗浮喔福喔粪腑喙佮竵喙夃箘喔傕笭喔侧笧
+pdfjs-editor-highlight-button =
+    .title = 喙�喔權箟喔�
+pdfjs-editor-highlight-button-label = 喙�喔權箟喔�
+pdfjs-highlight-floating-button1 =
+    .title = 喙�喔權箟喔權釜喔�
+    .aria-label = 喙�喔權箟喔權釜喔�
+pdfjs-highlight-floating-button-label = 喙�喔權箟喔權釜喔�
+pdfjs-comment-floating-button =
+    .title = 喙佮釜喔斷竾喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+    .aria-label = 喙佮釜喔斷竾喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+pdfjs-comment-floating-button-label = 喙佮釜喔斷竾喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+pdfjs-editor-comment-button =
+    .title = 喙佮釜喔斷竾喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+    .aria-label = 喙佮釜喔斷竾喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+pdfjs-editor-comment-button-label = 喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+pdfjs-editor-signature-button =
+    .title = 喙�喔炧复喙堗浮喔ム覆喔⑧箑喔嬥箛喔�
+pdfjs-editor-signature-button-label = 喙�喔炧复喙堗浮喔ム覆喔⑧箑喔嬥箛喔�
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 喔曕副喔о箒喔佮箟喙勦競喔傅喙�喔權箟喔�
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 喔曕副喔о箒喔佮箟喙勦競喔`腹喔涏抚喔侧笖
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 喔曕副喔о箒喔佮箟喙勦競喔ム覆喔⑧箑喔嬥箛喔�: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 喔曕副喔о箒喔佮箟喙勦競喔犩覆喔�
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 喙�喔覆喔犩覆喔炧抚喔侧笖喔腑喔�
+pdfjs-editor-remove-freetext-button =
+    .title = 喙�喔覆喔傕箟喔竸喔о覆喔∴腑喔竵
+pdfjs-editor-remove-stamp-button =
+    .title = 喙�喔覆喔犩覆喔炧腑喔竵
+pdfjs-editor-remove-highlight-button =
+    .title = 喙�喔覆喔佮覆喔`箑喔權箟喔權釜喔掂腑喔竵
+pdfjs-editor-remove-signature-button =
+    .title = 喔ム笟喔ム覆喔⑧箑喔嬥箛喔�
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 喔傅
+pdfjs-editor-free-text-size-input = 喔傕笝喔侧笖
+pdfjs-editor-ink-color-input = 喔傅
+pdfjs-editor-ink-thickness-input = 喔勦抚喔侧浮喔笝喔�
+pdfjs-editor-ink-opacity-input = 喔勦抚喔侧浮喔椸付喔�
+pdfjs-editor-stamp-add-image-button =
+    .title = 喙�喔炧复喙堗浮喔犩覆喔�
+pdfjs-editor-stamp-add-image-button-label = 喙�喔炧复喙堗浮喔犩覆喔�
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 喔勦抚喔侧浮喔笝喔�
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 喙�喔涏弗喔掂箞喔⑧笝喔勦抚喔侧浮喔笝喔侧箑喔∴阜喙堗腑喙�喔權箟喔權福喔侧涪喔佮覆喔`腑喔粪箞喔權箚 喔椸傅喙堗箘喔∴箞喙冟笂喙堗競喙夃腑喔勦抚喔侧浮
+pdfjs-editor-add-signature-container =
+    .aria-label = 喔箞喔о笝喔勦抚喔氞竸喔膏浮喔ム覆喔⑧箑喔嬥箛喔權箒喔ム赴喔ム覆喔⑧箑喔嬥箛喔權笚喔掂箞喔氞副喔權笚喔多竵喙勦抚喙�
+pdfjs-editor-signature-add-signature-button =
+    .title = 喙�喔炧复喙堗浮喔ム覆喔⑧箑喔嬥箛喔權箖喔浮喙�
+pdfjs-editor-signature-add-signature-button-label = 喙�喔炧复喙堗浮喔ム覆喔⑧箑喔嬥箛喔權箖喔浮喙�
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 喔ム覆喔⑧箑喔嬥箛喔權笚喔掂箞喔氞副喔權笚喔多竵喙勦抚喙�: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 喔曕副喔о箒喔佮箟喙勦競喔傕箟喔竸喔о覆喔�
+    .default-content = 喙�喔`复喙堗浮喔炧复喔∴笧喙屶箘喔斷箟喙�喔ム涪鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title = 喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 喔涏复喔斷箒喔栢笟喔傕箟喔侧竾
+    .aria-label = 喔涏复喔斷箒喔栢笟喔傕箟喔侧竾
+pdfjs-editor-comments-sidebar-close-button-label = 喔涏复喔斷箒喔栢笟喔傕箟喔侧竾
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 喙�喔箛喔權腑喔班箘喔`笚喔掂箞喔權箞喔侧釜喔權箖喔堗箖喔娻箞喙勦斧喔�? 喙�喔權箟喔權釜喔掂箘喔о箟喙佮弗喔班箒喔笖喔囙竸喔о覆喔∴竸喔脆笖喙�喔箛喔權箘喔斷箟喙�喔ム涪
+pdfjs-editor-comments-sidebar-no-comments-link = 喙�喔`傅喔⑧笝喔`腹喙夃箑喔炧复喙堗浮喙�喔曕复喔�
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 喙佮竵喙夃箘喔傕競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔�
+pdfjs-editor-alt-text-dialog-label = 喙�喔ム阜喔竵喔曕副喔о箑喔ム阜喔竵
+pdfjs-editor-alt-text-dialog-description = 喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝喔覆喔∴覆喔`笘喔娻箞喔о涪喙�喔弗喔粪腑喙勦笖喙夃箑喔∴阜喙堗腑喔溹腹喙夃箖喔娻箟喔∴腑喔囙箘喔∴箞喙�喔箛喔權笭喔侧笧 喔福喔粪腑喔犩覆喔炧箘喔∴箞喙傕斧喔ム笖
+pdfjs-editor-alt-text-add-description-label = 喙�喔炧复喙堗浮喔勦赋喔笜喔脆笟喔侧涪
+pdfjs-editor-alt-text-add-description-description = 喙佮笝喔班笝喔赤箖喔箟喙冟笂喙� 1-2 喔涏福喔班箓喔⑧竸喔嬥付喙堗竾喔笜喔脆笟喔侧涪喔副喔о箑喔`阜喙堗腑喔� 喔夃覆喔� 喔福喔粪腑喔佮覆喔`竵喔`赴喔椸赋
+pdfjs-editor-alt-text-mark-decorative-label = 喔椸赋喙�喔勦福喔粪箞喔竾喔浮喔侧涪喙�喔涏箛喔權釜喔脆箞喔囙笗喔佮箒喔曕箞喔�
+pdfjs-editor-alt-text-mark-decorative-description = 喔复喙堗竾喔權傅喙夃箖喔娻箟喔赋喔福喔编笟喔犩覆喔炧笚喔掂箞喙�喔涏箛喔權釜喔脆箞喔囙笡喔`赴喔斷副喔� 喙�喔娻箞喔� 喔傕腑喔� 喔福喔粪腑喔ム覆喔⑧笝喙夃赋
+pdfjs-editor-alt-text-cancel-button = 喔⑧竵喙�喔ム复喔�
+pdfjs-editor-alt-text-save-button = 喔氞副喔權笚喔多竵
+pdfjs-editor-alt-text-decorative-tooltip = 喔椸赋喙�喔勦福喔粪箞喔竾喔浮喔侧涪喙�喔涏箛喔權釜喔脆箞喔囙笗喔佮箒喔曕箞喔囙箒喔ム箟喔�
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 喔曕副喔о腑喔⑧箞喔侧竾喙�喔娻箞喔� 鈥溹笂喔侧涪喔笝喔膏箞喔∴竸喔權斧喔權付喙堗竾喔權副喙堗竾喔ム竾喔椸傅喙堗箓喔曕箠喔班箑喔炧阜喙堗腑喔`副喔氞笡喔`赴喔椸覆喔權腑喔侧斧喔侧福喔∴阜喙夃腑喔笝喔多箞喔団��
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 喔∴父喔∴笅喙夃覆喔⑧笟喔� 鈥� 喔涏福喔编笟喔傕笝喔侧笖
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 喔曕福喔囙竵喔ム覆喔囙笖喙夃覆喔權笟喔� 鈥� 喔涏福喔编笟喔傕笝喔侧笖
+pdfjs-editor-resizer-top-right =
+    .aria-label = 喔∴父喔∴競喔о覆喔氞笝 鈥� 喔涏福喔编笟喔傕笝喔侧笖
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 喔曕福喔囙竵喔ム覆喔囙笖喙夃覆喔權競喔о覆 鈥� 喔涏福喔编笟喔傕笝喔侧笖
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 喔∴父喔∴競喔о覆喔ム箞喔侧竾 鈥� 喔涏福喔编笟喔傕笝喔侧笖
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 喔曕福喔囙竵喔ム覆喔囙笖喙夃覆喔權弗喙堗覆喔� 鈥� 喔涏福喔编笟喔傕笝喔侧笖
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 喔∴父喔∴笅喙夃覆喔⑧弗喙堗覆喔� 鈥� 喔涏福喔编笟喔傕笝喔侧笖
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 喔曕福喔囙竵喔ム覆喔囙笖喙夃覆喔權笅喙夃覆喔� 鈥� 喔涏福喔编笟喔傕笝喔侧笖
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 喔傅喙�喔權箟喔�
+pdfjs-editor-colorpicker-button =
+    .title = 喙�喔涏弗喔掂箞喔⑧笝喔傅
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 喔椸覆喔囙箑喔ム阜喔竵喔傅
+pdfjs-editor-colorpicker-yellow =
+    .title = 喙�喔弗喔粪腑喔�
+pdfjs-editor-colorpicker-green =
+    .title = 喙�喔傕傅喔⑧抚
+pdfjs-editor-colorpicker-blue =
+    .title = 喔權箟喔赤箑喔囙复喔�
+pdfjs-editor-colorpicker-pink =
+    .title = 喔娻浮喔炧腹
+pdfjs-editor-colorpicker-red =
+    .title = 喙佮笖喔�
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 喙佮釜喔斷竾喔椸副喙夃竾喔浮喔�
+pdfjs-editor-highlight-show-all-button =
+    .title = 喙佮釜喔斷竾喔椸副喙夃竾喔浮喔�
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 喙佮竵喙夃箘喔傕競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔� (喔勦赋喔笜喔脆笟喔侧涪喔犩覆喔�)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 喙�喔炧复喙堗浮喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝 (喔勦赋喔笜喔脆笟喔侧涪喔犩覆喔�)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 喙�喔傕傅喔⑧笝喔勦赋喔笜喔脆笟喔侧涪喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 喔勦赋喔笜喔脆笟喔侧涪喔副喙夃笝喙� 喔赋喔福喔编笟喔溹腹喙夃笚喔掂箞喙勦浮喙堗釜喔侧浮喔侧福喔栢浮喔竾喙�喔箛喔權笭喔侧笧喔福喔粪腑喙�喔∴阜喙堗腑喔犩覆喔炧箘喔∴箞喙傕斧喔ム笖
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝喔權傅喙夃笘喔灌竵喔福喙夃覆喔囙競喔多箟喔權箓喔斷涪喔副喔曕箓喔權浮喔编笗喔脆箒喔ム赴喔覆喔堗箘喔∴箞喔栢腹喔佮笗喙夃腑喔�
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 喙�喔`傅喔⑧笝喔`腹喙夃箑喔炧复喙堗浮喙�喔曕复喔�
+pdfjs-editor-new-alt-text-create-automatically-button-label = 喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔權箓喔斷涪喔副喔曕箓喔權浮喔编笗喔�
+pdfjs-editor-new-alt-text-not-now-button = 喙勦浮喙堗箖喔娻箞喔曕腑喔權笝喔掂箟
+pdfjs-editor-new-alt-text-error-title = 喙勦浮喙堗釜喔侧浮喔侧福喔栢釜喔`箟喔侧竾喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝喙傕笖喔⑧腑喔编笗喙傕笝喔∴副喔曕复喙勦笖喙�
+pdfjs-editor-new-alt-text-error-description = 喔佮福喔膏笓喔侧箑喔傕傅喔⑧笝喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝喔斷箟喔о涪喔曕副喔о箑喔竾喔福喔粪腑喔ム腑喔囙箖喔浮喙堗腑喔掂竵喔勦福喔编箟喔囙箖喔權笭喔侧涪喔弗喔编竾
+pdfjs-editor-new-alt-text-error-close-button = 喔涏复喔�
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 喔佮赋喔ム副喔囙笖喔侧抚喔權箤喙傕斧喔ム笖喙傕浮喙�喔斷弗 AI 喔赋喔福喔编笟喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝 ({ $downloadedSize } 喔堗覆喔� { $totalSize } MB)
+    .aria-valuetext = 喔佮赋喔ム副喔囙笖喔侧抚喔權箤喙傕斧喔ム笖喙傕浮喙�喔斷弗 AI 喔赋喔福喔编笟喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝 ({ $downloadedSize } 喔堗覆喔� { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 喙�喔炧复喙堗浮喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝喙佮弗喙夃抚
+pdfjs-editor-new-alt-text-added-button-label = 喙�喔炧复喙堗浮喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝喙佮弗喙夃抚
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 喔傕覆喔斷競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔�
+pdfjs-editor-new-alt-text-missing-button-label = 喔傕覆喔斷競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔�
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 喔曕福喔о笀喔腑喔氞競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔�
+pdfjs-editor-new-alt-text-to-review-button-label = 喔曕福喔о笀喔腑喔氞競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔�
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 喔福喙夃覆喔囙競喔多箟喔權箓喔斷涪喔副喔曕箓喔權浮喔编笗喔�: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 喔曕副喙夃竾喔勦箞喔侧競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔權笭喔侧笧
+pdfjs-image-alt-text-settings-button-label = 喔曕副喙夃竾喔勦箞喔侧競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔權笭喔侧笧
+pdfjs-editor-alt-text-settings-dialog-label = 喔曕副喙夃竾喔勦箞喔侧競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔權笭喔侧笧
+pdfjs-editor-alt-text-settings-automatic-title = 喔佮覆喔`笚喔斷箒喔椸笝喔斷箟喔о涪喔傕箟喔竸喔о覆喔∴腑喔编笗喙傕笝喔∴副喔曕复
+pdfjs-editor-alt-text-settings-create-model-button-label = 喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔權腑喔编笗喙傕笝喔∴副喔曕复
+pdfjs-editor-alt-text-settings-create-model-description = 喙佮笝喔班笝喔赤竸喔赤腑喔樴复喔氞覆喔⑧箑喔炧阜喙堗腑喔娻箞喔о涪喙�喔弗喔粪腑喔溹腹喙夃笚喔掂箞喙勦浮喙堗釜喔侧浮喔侧福喔栢浮喔竾喙�喔箛喔權笭喔侧笧喔福喔粪腑喙�喔∴阜喙堗腑喔犩覆喔炧箘喔∴箞喙傕斧喔ム笖
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 喙傕浮喙�喔斷弗 AI 喔赋喔福喔编笟喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝 ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = 喔椸赋喔囙覆喔權箖喔權箑喔勦福喔粪箞喔竾喔傕腑喔囙竸喔膏笓喙�喔炧阜喙堗腑喙冟斧喙夃競喙夃腑喔∴腹喔ム競喔竾喔勦父喔撪箑喔涏箛喔權釜喙堗抚喔權笗喔编抚 喔堗赋喙�喔涏箛喔權釜喔赤斧喔`副喔氞競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔權腑喔编笗喙傕笝喔∴副喔曕复
+pdfjs-editor-alt-text-settings-delete-model-button = 喔ム笟
+pdfjs-editor-alt-text-settings-download-model-button = 喔斷覆喔о笝喙屶箓喔弗喔�
+pdfjs-editor-alt-text-settings-downloading-model-button = 喔佮赋喔ム副喔囙笖喔侧抚喔權箤喙傕斧喔ム笖鈥�
+pdfjs-editor-alt-text-settings-editor-title = 喔曕副喔о箒喔佮箟喙勦競喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 喙佮釜喔斷竾喔曕副喔о箒喔佮箟喙勦競喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝喔椸副喔權笚喔掂箑喔∴阜喙堗腑喙�喔炧复喙堗浮喔犩覆喔�
+pdfjs-editor-alt-text-settings-show-dialog-description = 喔娻箞喔о涪喙冟斧喙夃竸喔膏笓喙佮笝喙堗箖喔堗抚喙堗覆喔犩覆喔炧笚喔编箟喔囙斧喔∴笖喔傕腑喔囙竸喔膏笓喔∴傅喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝
+pdfjs-editor-alt-text-settings-close-button = 喔涏复喔�
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 喙�喔炧复喙堗浮喔佮覆喔`箑喔權箟喔權釜喔掂箒喔ム箟喔�
+pdfjs-editor-freetext-added-alert = 喙�喔炧复喙堗浮喔傕箟喔竸喔о覆喔∴箒喔ム箟喔�
+pdfjs-editor-ink-added-alert = 喙�喔炧复喙堗浮喔`腹喔涏抚喔侧笖喙佮弗喙夃抚
+pdfjs-editor-stamp-added-alert = 喙�喔炧复喙堗浮喔犩覆喔炧箒喔ム箟喔�
+pdfjs-editor-signature-added-alert = 喙�喔炧复喙堗浮喔ム覆喔⑧箑喔嬥箛喔權箒喔ム箟喔�
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 喙�喔覆喔佮覆喔`箑喔權箟喔權釜喔掂腑喔竵喙佮弗喙夃抚
+pdfjs-editor-undo-bar-message-freetext = 喙�喔覆喔傕箟喔竸喔о覆喔∴腑喔竵喙佮弗喙夃抚
+pdfjs-editor-undo-bar-message-ink = 喙�喔覆喔犩覆喔炧抚喔侧笖喔腑喔佮箒喔ム箟喔�
+pdfjs-editor-undo-bar-message-stamp = 喙�喔覆喔犩覆喔炧腑喔竵喙佮弗喙夃抚
+pdfjs-editor-undo-bar-message-signature = 喔ム笟喔ム覆喔⑧箑喔嬥箛喔權箒喔ム箟喔�
+pdfjs-editor-undo-bar-message-comment = 喙�喔覆喔勦抚喔侧浮喔勦复喔斷箑喔箛喔權腑喔竵喙佮弗喙夃抚
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple = 喙�喔覆喔勦赋喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟 { $count } 喔`覆喔⑧竵喔侧福喔腑喔佮箒喔ム箟喔�
+pdfjs-editor-undo-bar-undo-button =
+    .title = 喙�喔ム复喔佮笚喔�
+pdfjs-editor-undo-bar-undo-button-label = 喙�喔ム复喔佮笚喔�
+pdfjs-editor-undo-bar-close-button =
+    .title = 喔涏复喔�
+pdfjs-editor-undo-bar-close-button-label = 喔涏复喔�
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 喙傕浮喔斷副喔ム笝喔掂箟喔娻箞喔о涪喙冟斧喙夃笢喔灌箟喙冟笂喙夃釜喔侧浮喔侧福喔栢釜喔`箟喔侧竾喔ム覆喔⑧箑喔嬥箛喔權箑喔炧阜喙堗腑喙冟笂喙夃箑喔炧复喙堗浮喔ム竾喙冟笝喙�喔竵喔覆喔� PDF 喙勦笖喙� 喔溹腹喙夃箖喔娻箟喔覆喔∴覆喔`笘喙佮竵喙夃箘喔傕笂喔粪箞喔� (喔嬥付喙堗竾喙冟笂喙夃箑喔涏箛喔權競喙夃腑喔勦抚喔侧浮喔椸笖喙佮笚喔權箘喔斷箟喔斷箟喔о涪) 喙佮弗喔班釜喔侧浮喔侧福喔栢箑喔ム阜喔竵喔氞副喔權笚喔多竵喔ム覆喔⑧箑喔嬥箛喔權箑喔炧阜喙堗腑喙冟笂喙夃竾喔侧笝喔嬥箟喔赤箘喔斷箟
+pdfjs-editor-add-signature-dialog-title = 喙�喔炧复喙堗浮喔ム覆喔⑧箑喔嬥箛喔�
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 喔炧复喔∴笧喙�
+    .title = 喔炧复喔∴笧喙�
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 喔о覆喔�
+    .title = 喔о覆喔�
+pdfjs-editor-add-signature-image-button = 喔犩覆喔�
+    .title = 喔犩覆喔�
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 喔炧复喔∴笧喙屶弗喔侧涪喙�喔嬥箛喔權競喔竾喔勦父喔�
+    .placeholder = 喔炧复喔∴笧喙屶弗喔侧涪喙�喔嬥箛喔權競喔竾喔勦父喔�
+pdfjs-editor-add-signature-draw-placeholder = 喔о覆喔斷弗喔侧涪喙�喔嬥箛喔權競喔竾喔勦父喔�
+pdfjs-editor-add-signature-draw-thickness-range-label = 喔勦抚喔侧浮喔笝喔�
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 喔勦抚喔侧浮喔笝喔侧競喔竾喔佮覆喔`抚喔侧笖: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 喔ム覆喔佮箘喔熰弗喙屶浮喔侧笚喔掂箞喔權傅喙堗箑喔炧阜喙堗腑喔副喔涏箓喔弗喔�
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 喔福喔粪腑喙�喔ム阜喔竵喙勦笩喔ム箤喔犩覆喔�
+       *[other] 喔福喔粪腑喙�喔`傅喔⑧竵喔斷腹喙勦笩喔ム箤喔犩覆喔�
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 喔勦赋喔笜喔脆笟喔侧涪 (喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝)
+pdfjs-editor-add-signature-description-input =
+    .title = 喔勦赋喔笜喔脆笟喔侧涪 (喔傕箟喔竸喔о覆喔∴笚喔斷箒喔椸笝)
+pdfjs-editor-add-signature-description-default-when-drawing = 喔ム覆喔⑧箑喔嬥箛喔�
+pdfjs-editor-add-signature-clear-button-label = 喔ム箟喔侧竾喔ム覆喔⑧箑喔嬥箛喔�
+pdfjs-editor-add-signature-clear-button =
+    .title = 喔ム箟喔侧竾喔ム覆喔⑧箑喔嬥箛喔�
+pdfjs-editor-add-signature-save-checkbox = 喔氞副喔權笚喔多竵喔ム覆喔⑧箑喔嬥箛喔�
+pdfjs-editor-add-signature-save-warning-message = 喔勦父喔撪浮喔掂弗喔侧涪喙�喔嬥箛喔權笚喔掂箞喔氞副喔權笚喔多竵喔栢付喔囙笀喔赤笝喔о笝喔腹喔囙釜喔膏笖 5 喔`覆喔⑧竵喔侧福喙佮弗喙夃抚 喙傕笡喔`笖喔ム笟喔`覆喔⑧竵喔侧福喔笝喔多箞喔囙腑喔竵喙�喔∴阜喙堗腑喔堗赴喔氞副喔權笚喔多竵喙�喔炧复喙堗浮
+pdfjs-editor-add-signature-image-upload-error-title = 喙勦浮喙堗釜喔侧浮喔侧福喔栢腑喔编笡喙傕斧喔ム笖喔犩覆喔炧箘喔斷箟
+pdfjs-editor-add-signature-image-upload-error-description = 喔曕福喔о笀喔腑喔氞竵喔侧福喙�喔娻阜喙堗腑喔∴笗喙堗腑喙�喔勦福喔粪腑喔傕箞喔侧涪喔傕腑喔囙竸喔膏笓喔福喔粪腑喔ム腑喔囙箖喔娻箟喔犩覆喔炧腑喔粪箞喔�
+pdfjs-editor-add-signature-image-no-data-error-title = 喙勦浮喙堗釜喔侧浮喔侧福喔栢箒喔涏弗喔囙笭喔侧笧喔權傅喙夃箖喔箟喙�喔涏箛喔權弗喔侧涪喙�喔嬥箛喔權箘喔斷箟
+pdfjs-editor-add-signature-image-no-data-error-description = 喙傕笡喔`笖喔ム腑喔囙腑喔编笡喙傕斧喔ム笖喔犩覆喔炧腑喔粪箞喔�
+pdfjs-editor-add-signature-error-close-button = 喔涏复喔�
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 喔⑧竵喙�喔ム复喔�
+pdfjs-editor-add-signature-add-button = 喙�喔炧复喙堗浮
+pdfjs-editor-edit-signature-update-button = 喔副喔涏箑喔斷笗
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 喙佮竵喙夃箘喔傕竸喔о覆喔∴竸喔脆笖喙�喔箛喔�
+pdfjs-editor-edit-comment-popup-button =
+    .title = 喙佮竵喙夃箘喔傕竸喔о覆喔∴竸喔脆笖喙�喔箛喔�
+pdfjs-editor-delete-comment-popup-button-label = 喙�喔覆喔勦抚喔侧浮喔勦复喔斷箑喔箛喔權腑喔竵
+pdfjs-editor-delete-comment-popup-button =
+    .title = 喙�喔覆喔勦抚喔侧浮喔勦复喔斷箑喔箛喔權腑喔竵
+pdfjs-show-comment-button =
+    .title = 喙佮釜喔斷竾喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 喙佮竵喙夃箘喔傕竸喔о覆喔∴竸喔脆笖喙�喔箛喔�
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 喔副喔涏箑喔斷笗
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 喙�喔炧复喙堗浮喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 喙�喔炧复喙堗浮
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 喙�喔`复喙堗浮喔炧复喔∴笧喙屸��
+pdfjs-editor-edit-comment-dialog-cancel-button = 喔⑧竵喙�喔ム复喔�
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 喙�喔炧复喙堗浮喔勦抚喔侧浮喔勦复喔斷箑喔箛喔�
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 喙�喔涏复喔�/喔涏复喔斷箒喔栢笟喔傕箟喔侧竾 (喙�喔竵喔覆喔`浮喔掂笭喔侧笧喔⑧箞喔�/喙�喔勦箟喔侧福喙堗覆喔�/喙勦笩喔ム箤喙佮笝喔�/喙�喔ム箑喔⑧腑喔`箤)
+pdfjs-toggle-views-manager-button1-label = 喔堗副喔斷竵喔侧福喔笝喙夃覆
+pdfjs-views-manager-sidebar =
+    .aria-label = 喙佮笘喔氞競喙夃覆喔�
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 喔曕副喔о笡喔`副喔氞競喔權覆喔斷箒喔栢笟喔傕箟喔侧竾
+pdfjs-views-manager-view-selector-button =
+    .title = 喔∴父喔∴浮喔竾
+pdfjs-views-manager-view-selector-button-label = 喔∴父喔∴浮喔竾
+pdfjs-views-manager-pages-title = 喔笝喙夃覆
+pdfjs-views-manager-outlines-title1 = 喙傕竸喔`竾喔`箞喔侧竾喙�喔竵喔覆喔�
+    .title = 喙傕竸喔`竾喔`箞喔侧竾喙�喔竵喔覆喔� (喔勦弗喔脆竵喔腑喔囙竸喔`副喙夃竾喙�喔炧阜喙堗腑喔傕涪喔侧涪/喔⑧父喔氞福喔侧涪喔佮覆喔`笚喔编箟喔囙斧喔∴笖)
+pdfjs-views-manager-attachments-title = 喙勦笩喔ム箤喙佮笝喔�
+pdfjs-views-manager-layers-title1 = 喙�喔ム箑喔⑧腑喔`箤
+    .title = 喙�喔ム箑喔⑧腑喔`箤 (喔勦弗喔脆竵喔腑喔囙竸喔`副喙夃竾喙�喔炧阜喙堗腑喔ム箟喔侧竾喔勦箞喔侧箑喔ム箑喔⑧腑喔`箤喔椸副喙夃竾喔浮喔斷竵喔ム副喔氞釜喔灌箞喔笘喔侧笝喔班箑喔`复喙堗浮喔曕箟喔�)
+pdfjs-views-manager-pages-option-label = 喔笝喙夃覆
+pdfjs-views-manager-outlines-option-label = 喙�喔勦箟喔侧福喙堗覆喔囙箑喔竵喔覆喔�
+pdfjs-views-manager-attachments-option-label = 喙勦笩喔ム箤喙佮笝喔�
+pdfjs-views-manager-layers-option-label = 喙�喔ム箑喔⑧腑喔`箤
+pdfjs-views-manager-add-file-button =
+    .title = 喙�喔炧复喙堗浮喙勦笩喔ム箤
+pdfjs-views-manager-add-file-button-label = 喙�喔炧复喙堗浮喙勦笩喔ム箤
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label = 喙�喔ム阜喔竵喔涪喔灌箞 { $count }
+pdfjs-views-manager-pages-status-none-action-label = 喙�喔ム阜喔竵喔笝喙夃覆
+pdfjs-views-manager-pages-status-action-button-label = 喔堗副喔斷竵喔侧福
+pdfjs-views-manager-pages-status-copy-button-label = 喔勦副喔斷弗喔竵
+pdfjs-views-manager-pages-status-cut-button-label = 喔曕副喔�
+pdfjs-views-manager-pages-status-delete-button-label = 喔ム笟
+pdfjs-views-manager-pages-status-export-selected-button-label = 喔箞喔囙腑喔竵喔`覆喔⑧竵喔侧福喔椸傅喙堗箑喔ム阜喔竵鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label = 喔曕副喔� { $count } 喔笝喙夃覆喙佮弗喙夃抚
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label = 喔勦副喔斷弗喔竵 { $count } 喔笝喙夃覆喙佮弗喙夃抚
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label = 喔ム笟 { $count } 喔笝喙夃覆喙佮弗喙夃抚
+pdfjs-views-manager-pages-status-waiting-ready-label = 喔佮赋喔ム副喔囙箑喔曕福喔掂涪喔∴箘喔熰弗喙屶競喔竾喔勦父喔撪箖喔箟喔炧福喙夃腑喔♀��
+pdfjs-views-manager-pages-status-waiting-uploading-label = 喔佮赋喔ム副喔囙腑喔编笡喙傕斧喔ム笖喙勦笩喔ム箤鈥�
+pdfjs-views-manager-status-warning-cut-label = 喙勦浮喙堗釜喔侧浮喔侧福喔栢笗喔编笖喙勦笖喙� 喙傕笡喔`笖喔`傅喙�喔熰福喔娻斧喔權箟喔侧箒喔ム箟喔о弗喔竾喔傅喔佮竸喔`副喙夃竾
+pdfjs-views-manager-status-warning-copy-label = 喙勦浮喙堗釜喔侧浮喔侧福喔栢竸喔编笖喔ム腑喔佮箘喔斷箟 喙傕笡喔`笖喔`傅喙�喔熰福喔娻斧喔權箟喔侧箒喔ム箟喔о弗喔竾喔傅喔佮竸喔`副喙夃竾
+pdfjs-views-manager-status-warning-delete-label = 喙勦浮喙堗釜喔侧浮喔侧福喔栢弗喔氞箘喔斷箟 喙傕笡喔`笖喔`傅喙�喔熰福喔娻斧喔權箟喔侧箒喔ム箟喔о弗喔竾喔傅喔佮竸喔`副喙夃竾
+pdfjs-views-manager-status-warning-save-label = 喙勦浮喙堗釜喔侧浮喔侧福喔栢笟喔编笝喔椸付喔佮箘喔斷箟 喙傕笡喔`笖喔`傅喙�喔熰福喔娻斧喔權箟喔侧箒喔ム箟喔о弗喔竾喔傅喔佮竸喔`副喙夃竾
+pdfjs-views-manager-status-undo-button-label = 喙�喔ム复喔佮笚喔�
+pdfjs-views-manager-status-done-button-label = 喙�喔福喙囙笀喔复喙夃笝
+pdfjs-views-manager-status-close-button =
+    .title = 喔涏复喔�
+pdfjs-views-manager-status-close-button-label = 喔涏复喔�
+pdfjs-views-manager-paste-button-label = 喔о覆喔�
+pdfjs-views-manager-paste-button-before =
+    .title = 喔о覆喔囙竵喙堗腑喔權斧喔權箟喔侧箒喔`竵
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 喔о覆喔囙斧喔ム副喔囙斧喔權箟喔� { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 喙冟斧喔∴箞
+pdfjs-views-manager-waiting-for-file = 喔佮赋喔ム副喔囙腑喔编笡喙傕斧喔ム笖喙勦笩喔ム箤鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 喔堗副喔斷竵喔侧福喔笝喙夃覆
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 喔ム笟喔ム覆喔⑧箑喔嬥箛喔權笚喔掂箞喔氞副喔權笚喔多竵喙勦抚喙�
+pdfjs-editor-delete-signature-button-label1 = 喔ム笟喔ム覆喔⑧箑喔嬥箛喔權笚喔掂箞喔氞副喔權笚喔多竵喙勦抚喙�
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 喙佮竵喙夃箘喔傕竸喔赤腑喔樴复喔氞覆喔�
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 喙佮竵喙夃箘喔傕竸喔赤腑喔樴复喔氞覆喔�
diff --git a/public/pdfjs/web/locale/tl/viewer.ftl b/public/pdfjs/web/locale/tl/viewer.ftl
new file mode 100644
index 0000000..628ef97
--- /dev/null
+++ b/public/pdfjs/web/locale/tl/viewer.ftl
@@ -0,0 +1,228 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Naunang Pahina
+pdfjs-previous-button-label = Nakaraan
+pdfjs-next-button =
+    .title = Sunod na Pahina
+pdfjs-next-button-label = Sunod
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Pahina
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = ng { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } ng { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Paliitin
+pdfjs-zoom-out-button-label = Paliitin
+pdfjs-zoom-in-button =
+    .title = Palakihin
+pdfjs-zoom-in-button-label = Palakihin
+pdfjs-zoom-select =
+    .title = Mag-zoom
+pdfjs-presentation-mode-button =
+    .title = Lumipat sa Presentation Mode
+pdfjs-presentation-mode-button-label = Presentation Mode
+pdfjs-open-file-button =
+    .title = Magbukas ng file
+pdfjs-open-file-button-label = Buksan
+pdfjs-print-button =
+    .title = i-Print
+pdfjs-print-button-label = i-Print
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Mga Kagamitan
+pdfjs-tools-button-label = Mga Kagamitan
+pdfjs-first-page-button =
+    .title = Pumunta sa Unang Pahina
+pdfjs-first-page-button-label = Pumunta sa Unang Pahina
+pdfjs-last-page-button =
+    .title = Pumunta sa Huling Pahina
+pdfjs-last-page-button-label = Pumunta sa Huling Pahina
+pdfjs-page-rotate-cw-button =
+    .title = Paikutin Pakanan
+pdfjs-page-rotate-cw-button-label = Paikutin Pakanan
+pdfjs-page-rotate-ccw-button =
+    .title = Paikutin Pakaliwa
+pdfjs-page-rotate-ccw-button-label = Paikutin Pakaliwa
+pdfjs-cursor-text-select-tool-button =
+    .title = I-enable ang Text Selection Tool
+pdfjs-cursor-text-select-tool-button-label = Text Selection Tool
+pdfjs-cursor-hand-tool-button =
+    .title = I-enable ang Hand Tool
+pdfjs-cursor-hand-tool-button-label = Hand Tool
+pdfjs-scroll-vertical-button =
+    .title = Gumamit ng Vertical Scrolling
+pdfjs-scroll-vertical-button-label = Vertical Scrolling
+pdfjs-scroll-horizontal-button =
+    .title = Gumamit ng Horizontal Scrolling
+pdfjs-scroll-horizontal-button-label = Horizontal Scrolling
+pdfjs-scroll-wrapped-button =
+    .title = Gumamit ng Wrapped Scrolling
+pdfjs-scroll-wrapped-button-label = Wrapped Scrolling
+pdfjs-spread-none-button =
+    .title = Huwag pagsamahin ang mga page spread
+pdfjs-spread-none-button-label = No Spreads
+pdfjs-spread-odd-button =
+    .title = Join page spreads starting with odd-numbered pages
+pdfjs-spread-odd-button-label = Mga Odd Spread
+pdfjs-spread-even-button =
+    .title = Pagsamahin ang mga page spread na nagsisimula sa mga even-numbered na pahina
+pdfjs-spread-even-button-label = Mga Even Spread
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Mga Katangian ng Dokumento鈥�
+pdfjs-document-properties-button-label = Mga Katangian ng Dokumento鈥�
+pdfjs-document-properties-file-name = File name:
+pdfjs-document-properties-file-size = File size:
+pdfjs-document-properties-title = Pamagat:
+pdfjs-document-properties-author = May-akda:
+pdfjs-document-properties-subject = Paksa:
+pdfjs-document-properties-keywords = Mga keyword:
+pdfjs-document-properties-creation-date = Petsa ng Pagkakagawa:
+pdfjs-document-properties-modification-date = Petsa ng Pagkakabago:
+pdfjs-document-properties-creator = Tagalikha:
+pdfjs-document-properties-producer = PDF Producer:
+pdfjs-document-properties-version = PDF Version:
+pdfjs-document-properties-page-count = Bilang ng Pahina:
+pdfjs-document-properties-page-size = Laki ng Pahina:
+pdfjs-document-properties-page-size-unit-inches = pulgada
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = patayo
+pdfjs-document-properties-page-size-orientation-landscape = pahiga
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Fast Web View:
+pdfjs-document-properties-linearized-yes = Oo
+pdfjs-document-properties-linearized-no = Hindi
+pdfjs-document-properties-close-button = Isara
+
+## Print
+
+pdfjs-print-progress-message = Inihahanda ang dokumento para sa pag-print鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Kanselahin
+pdfjs-printing-not-supported = Babala: Hindi pa ganap na suportado ang pag-print sa browser na ito.
+pdfjs-printing-not-ready = Babala: Hindi ganap na nabuksan ang PDF para sa pag-print.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Ipakita/Itago ang Sidebar
+pdfjs-toggle-sidebar-notification-button =
+    .title = Ipakita/Itago ang Sidebar (nagtataglay ang dokumento ng balangkas/mga attachment/mga layer)
+pdfjs-toggle-sidebar-button-label = Ipakita/Itago ang Sidebar
+pdfjs-document-outline-button =
+    .title = Ipakita ang Document Outline (mag-double-click para i-expand/collapse ang laman)
+pdfjs-document-outline-button-label = Balangkas ng Dokumento
+pdfjs-attachments-button =
+    .title = Ipakita ang mga Attachment
+pdfjs-attachments-button-label = Mga attachment
+pdfjs-layers-button =
+    .title = Ipakita ang mga Layer (mag-double click para mareset ang lahat ng layer sa orihinal na estado)
+pdfjs-layers-button-label = Mga layer
+pdfjs-thumbs-button =
+    .title = Ipakita ang mga Thumbnail
+pdfjs-thumbs-button-label = Mga thumbnail
+pdfjs-findbar-button =
+    .title = Hanapin sa Dokumento
+pdfjs-findbar-button-label = Hanapin
+pdfjs-additional-layers = Mga Karagdagang Layer
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Pahina { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Thumbnail ng Pahina { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Hanapin
+    .placeholder = Hanapin sa dokumento鈥�
+pdfjs-find-previous-button =
+    .title = Hanapin ang nakaraang pangyayari ng parirala
+pdfjs-find-previous-button-label = Nakaraan
+pdfjs-find-next-button =
+    .title = Hanapin ang susunod na pangyayari ng parirala
+pdfjs-find-next-button-label = Susunod
+pdfjs-find-highlight-checkbox = I-highlight lahat
+pdfjs-find-match-case-checkbox-label = Itugma ang case
+pdfjs-find-entire-word-checkbox-label = Buong salita
+pdfjs-find-reached-top = Naabot na ang tuktok ng dokumento, ipinagpatuloy mula sa ilalim
+pdfjs-find-reached-bottom = Naabot na ang dulo ng dokumento, ipinagpatuloy mula sa tuktok
+pdfjs-find-not-found = Hindi natagpuan ang parirala
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Lapad ng Pahina
+pdfjs-page-scale-fit = Pagkasyahin ang Pahina
+pdfjs-page-scale-auto = Automatic Zoom
+pdfjs-page-scale-actual = Totoong sukat
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Nagkaproblema habang niloload ang PDF.
+pdfjs-invalid-file-error = Di-wasto o sira ang PDF file.
+pdfjs-missing-file-error = Nawawalang PDF file.
+pdfjs-unexpected-response-error = Hindi inaasahang tugon ng server.
+pdfjs-rendering-error = Nagkaproblema habang nirerender ang pahina.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = Ipasok ang password upang buksan ang PDF file na ito.
+pdfjs-password-invalid = Maling password. Subukan uli.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Kanselahin
+pdfjs-web-fonts-disabled = Naka-disable ang mga Web font: hindi kayang gamitin ang mga naka-embed na PDF font.
diff --git a/public/pdfjs/web/locale/tr/viewer.ftl b/public/pdfjs/web/locale/tr/viewer.ftl
new file mode 100644
index 0000000..cb33f90
--- /dev/null
+++ b/public/pdfjs/web/locale/tr/viewer.ftl
@@ -0,0 +1,747 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 脰nceki sayfa
+pdfjs-previous-button-label = 脰nceki
+pdfjs-next-button =
+    .title = Sonraki sayfa
+pdfjs-next-button-label = Sonraki
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Sayfa
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = / { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Uzakla艧t谋r
+pdfjs-zoom-out-button-label = Uzakla艧t谋r
+pdfjs-zoom-in-button =
+    .title = Yak谋nla艧t谋r
+pdfjs-zoom-in-button-label = Yak谋nla艧t谋r
+pdfjs-zoom-select =
+    .title = Yak谋nla艧t谋rma
+pdfjs-presentation-mode-button =
+    .title = Sunum moduna ge莽
+pdfjs-presentation-mode-button-label = Sunum modu
+pdfjs-open-file-button =
+    .title = Dosya a莽
+pdfjs-open-file-button-label = A莽
+pdfjs-print-button =
+    .title = Yazd谋r
+pdfjs-print-button-label = Yazd谋r
+pdfjs-save-button =
+    .title = Kaydet
+pdfjs-save-button-label = Kaydet
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 陌ndir
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 陌ndir
+pdfjs-bookmark-button =
+    .title = Ge莽erli sayfa (ge莽erli sayfan谋n adresini g枚r眉nt眉le)
+pdfjs-bookmark-button-label = Ge莽erli sayfa
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Ara莽lar
+pdfjs-tools-button-label = Ara莽lar
+pdfjs-first-page-button =
+    .title = 陌lk sayfaya git
+pdfjs-first-page-button-label = 陌lk sayfaya git
+pdfjs-last-page-button =
+    .title = Son sayfaya git
+pdfjs-last-page-button-label = Son sayfaya git
+pdfjs-page-rotate-cw-button =
+    .title = Saat y枚n眉nde d枚nd眉r
+pdfjs-page-rotate-cw-button-label = Saat y枚n眉nde d枚nd眉r
+pdfjs-page-rotate-ccw-button =
+    .title = Saat y枚n眉n眉n tersine d枚nd眉r
+pdfjs-page-rotate-ccw-button-label = Saat y枚n眉n眉n tersine d枚nd眉r
+pdfjs-cursor-text-select-tool-button =
+    .title = Metin se莽me arac谋n谋 etkinle艧tir
+pdfjs-cursor-text-select-tool-button-label = Metin se莽me arac谋
+pdfjs-cursor-hand-tool-button =
+    .title = El arac谋n谋 etkinle艧tir
+pdfjs-cursor-hand-tool-button-label = El arac谋
+pdfjs-scroll-page-button =
+    .title = Sayfa kayd谋rmay谋 kullan
+pdfjs-scroll-page-button-label = Sayfa kayd谋rma
+pdfjs-scroll-vertical-button =
+    .title = Dikey kayd谋rmay谋 kullan
+pdfjs-scroll-vertical-button-label = Dikey kayd谋rma
+pdfjs-scroll-horizontal-button =
+    .title = Yatay kayd谋rmay谋 kullan
+pdfjs-scroll-horizontal-button-label = Yatay kayd谋rma
+pdfjs-scroll-wrapped-button =
+    .title = Yan yana kayd谋rmay谋 kullan
+pdfjs-scroll-wrapped-button-label = Yan yana kayd谋rma
+pdfjs-spread-none-button =
+    .title = Yan yana sayfalar谋 birle艧tirme
+pdfjs-spread-none-button-label = Birle艧tirme
+pdfjs-spread-odd-button =
+    .title = Yan yana sayfalar谋 tek numaral谋 sayfalardan ba艧layarak birle艧tir
+pdfjs-spread-odd-button-label = Tek numaral谋
+pdfjs-spread-even-button =
+    .title = Yan yana sayfalar谋 莽ift numaral谋 sayfalardan ba艧layarak birle艧tir
+pdfjs-spread-even-button-label = 脟ift numaral谋
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Belge 枚zellikleri鈥�
+pdfjs-document-properties-button-label = Belge 枚zellikleri鈥�
+pdfjs-document-properties-file-name = Dosya ad谋:
+pdfjs-document-properties-file-size = Dosya boyutu:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bayt)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bayt)
+pdfjs-document-properties-title = Ba艧l谋k:
+pdfjs-document-properties-author = Yazar:
+pdfjs-document-properties-subject = Konu:
+pdfjs-document-properties-keywords = Anahtar kelimeler:
+pdfjs-document-properties-creation-date = Olu艧turma tarihi:
+pdfjs-document-properties-modification-date = De臒i艧tirme tarihi:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Olu艧turan:
+pdfjs-document-properties-producer = PDF 眉reticisi:
+pdfjs-document-properties-version = PDF s眉r眉m眉:
+pdfjs-document-properties-page-count = Sayfa say谋s谋:
+pdfjs-document-properties-page-size = Sayfa boyutu:
+pdfjs-document-properties-page-size-unit-inches = in莽
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = dikey
+pdfjs-document-properties-page-size-orientation-landscape = yatay
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = H谋zl谋 web g枚r眉n眉m眉:
+pdfjs-document-properties-linearized-yes = Evet
+pdfjs-document-properties-linearized-no = Hay谋r
+pdfjs-document-properties-close-button = Kapat
+
+## Print
+
+pdfjs-print-progress-message = Belge yazd谋r谋lmaya haz谋rlan谋yor鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = %{ $progress }
+pdfjs-print-progress-close-button = Vazge莽
+pdfjs-printing-not-supported = Uyar谋: Yazd谋rma bu taray谋c谋 taraf谋ndan tam olarak desteklenmemektedir.
+pdfjs-printing-not-ready = Uyar谋: PDF tamamen y眉klenmedi ve yazd谋rmaya haz谋r de臒il.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Kenar 莽ubu臒unu a莽/kapat
+pdfjs-toggle-sidebar-notification-button =
+    .title = Kenar 莽ubu臒unu a莽/kapat (Belge ana hat/ekler/katmanlar i莽eriyor)
+pdfjs-toggle-sidebar-button-label = Kenar 莽ubu臒unu a莽/kapat
+pdfjs-document-outline-button =
+    .title = Belge ana hatlar谋n谋 g枚ster (T眉m 枚臒eleri geni艧letmek/daraltmak i莽in 莽ift t谋klay谋n)
+pdfjs-document-outline-button-label = Belge ana hatlar谋
+pdfjs-attachments-button =
+    .title = Ekleri g枚ster
+pdfjs-attachments-button-label = Ekler
+pdfjs-layers-button =
+    .title = Katmanlar谋 g枚ster (t眉m katmanlar谋 varsay谋lan duruma s谋f谋rlamak i莽in 莽ift t谋klay谋n)
+pdfjs-layers-button-label = Katmanlar
+pdfjs-thumbs-button =
+    .title = K眉莽眉k resimleri g枚ster
+pdfjs-thumbs-button-label = K眉莽眉k resimler
+pdfjs-current-outline-item-button =
+    .title = Mevcut ana hat 枚臒esini bul
+pdfjs-current-outline-item-button-label = Mevcut ana hat 枚臒esi
+pdfjs-findbar-button =
+    .title = Belgede bul
+pdfjs-findbar-button-label = Bul
+pdfjs-additional-layers = Ek katmanlar
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Sayfa { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page }. sayfan谋n k眉莽眉k h芒li
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = { $page }. sayfay谋 se莽
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Sayfa { $page }/{ $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Bul
+    .placeholder = Belgede bul鈥�
+pdfjs-find-previous-button =
+    .title = 脰nceki e艧le艧meyi bul
+pdfjs-find-previous-button-label = 脰nceki
+pdfjs-find-next-button =
+    .title = Sonraki e艧le艧meyi bul
+pdfjs-find-next-button-label = Sonraki
+pdfjs-find-highlight-checkbox = T眉m眉n眉 vurgula
+pdfjs-find-match-case-checkbox-label = B眉y眉k-k眉莽眉k harfe duyarl谋
+pdfjs-find-match-diacritics-checkbox-label = Fonetik i艧aretleri bul
+pdfjs-find-entire-word-checkbox-label = Tam s枚zc眉kler
+pdfjs-find-reached-top = Belgenin ba艧谋na ula艧谋ld谋, sonundan devam edildi
+pdfjs-find-reached-bottom = Belgenin sonuna ula艧谋ld谋, ba艧谋ndan devam edildi
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $total } e艧le艧meden { $current }. e艧le艧me
+       *[other] { $total } e艧le艧meden { $current }. e艧le艧me
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] { $limit } e艧le艧meden fazla
+       *[other] { $limit } e艧le艧meden fazla
+    }
+pdfjs-find-not-found = E艧le艧me bulunamad谋
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Sayfa geni艧li臒i
+pdfjs-page-scale-fit = Sayfay谋 s谋臒d谋r
+pdfjs-page-scale-auto = Otomatik yak谋nla艧t谋r
+pdfjs-page-scale-actual = Ger莽ek boyut
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = %{ $scale }
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Sayfa { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF y眉klenirken bir hata olu艧tu.
+pdfjs-invalid-file-error = Ge莽ersiz veya bozulmu艧 PDF dosyas谋.
+pdfjs-missing-file-error = PDF dosyas谋 eksik.
+pdfjs-unexpected-response-error = Beklenmeyen sunucu yan谋t谋.
+pdfjs-rendering-error = Sayfa yorumlan谋rken bir hata olu艧tu.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } i艧areti]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Bu PDF dosyas谋n谋 a莽mak i莽in parolas谋n谋 yaz谋n.
+pdfjs-password-invalid = Ge莽ersiz parola. L眉tfen yeniden deneyin.
+pdfjs-password-ok-button = Tamam
+pdfjs-password-cancel-button = Vazge莽
+pdfjs-web-fonts-disabled = Web fontlar谋 devre d谋艧谋: G枚m眉l眉 PDF fontlar谋 kullan谋lam谋yor.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = Metin
+pdfjs-editor-color-picker-free-text-input =
+    .title = Metin rengini de臒i艧tir
+pdfjs-editor-free-text-button-label = Metin
+pdfjs-editor-ink-button =
+    .title = 脟iz
+pdfjs-editor-color-picker-ink-input =
+    .title = 脟izim rengini de臒i艧tir
+pdfjs-editor-ink-button-label = 脟iz
+pdfjs-editor-stamp-button =
+    .title = Resim ekle veya d眉zenle
+pdfjs-editor-stamp-button-label = Resim ekle veya d眉zenle
+pdfjs-editor-highlight-button =
+    .title = Vurgula
+pdfjs-editor-highlight-button-label = Vurgula
+pdfjs-highlight-floating-button1 =
+    .title = Vurgula
+    .aria-label = Vurgula
+pdfjs-highlight-floating-button-label = Vurgula
+pdfjs-comment-floating-button =
+    .title = Yorum ekle
+    .aria-label = Yorum ekle
+pdfjs-comment-floating-button-label = Yorum ekle
+pdfjs-editor-comment-button =
+    .title = Yorum ekle
+    .aria-label = Yorum ekle
+pdfjs-editor-comment-button-label = Yorum ekle
+pdfjs-editor-signature-button =
+    .title = 陌mza ekle
+pdfjs-editor-signature-button-label = 陌mza ekle
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Vurgu d眉zenleyici
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 脟izim d眉zenleyici
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 陌mza d眉zenleyici: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Resim d眉zenleyici
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 脟izimi kald谋r
+pdfjs-editor-remove-freetext-button =
+    .title = Metni kald谋r
+pdfjs-editor-remove-stamp-button =
+    .title = Resmi kald谋r
+pdfjs-editor-remove-highlight-button =
+    .title = Vurgulamay谋 kald谋r
+pdfjs-editor-remove-signature-button =
+    .title = 陌mzay谋 kald谋r
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = Renk
+pdfjs-editor-free-text-size-input = Boyut
+pdfjs-editor-ink-color-input = Renk
+pdfjs-editor-ink-thickness-input = Kal谋nl谋k
+pdfjs-editor-ink-opacity-input = Saydaml谋k
+pdfjs-editor-stamp-add-image-button =
+    .title = Resim ekle
+pdfjs-editor-stamp-add-image-button-label = Resim ekle
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = Kal谋nl谋k
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Metin d谋艧谋ndaki 枚臒eleri vurgularken kal谋nl谋臒谋 de臒i艧tir
+pdfjs-editor-add-signature-container =
+    .aria-label = 陌mza y枚netimi ve kay谋tl谋 imzalar
+pdfjs-editor-signature-add-signature-button =
+    .title = Yeni imza ekle
+pdfjs-editor-signature-add-signature-button-label = Yeni imza ekle
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = Kay谋tl谋 imza: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Metin d眉zenleyicisi
+    .default-content = Yazmaya ba艧lay谋n鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] Yorum
+       *[other] Yorumlar
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = Kenar 莽ubu臒unu kapat
+    .aria-label = Kenar 莽ubu臒unu kapat
+pdfjs-editor-comments-sidebar-close-button-label = Kenar 莽ubu臒unu kapat
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = Not almaya de臒er bir 艧ey mi g枚rd眉n眉z? Onu i艧aretleyip yorum yazabilirsiniz.
+pdfjs-editor-comments-sidebar-no-comments-link = Daha fazla bilgi al谋n
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = Alternatif metin
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Alternatif metni d眉zenle
+pdfjs-editor-alt-text-dialog-label = Bir se莽enek se莽in
+pdfjs-editor-alt-text-dialog-description = Alternatif metin, insanlar resmi g枚remedi臒inde veya resim y眉klenmedi臒inde i艧e yarar.
+pdfjs-editor-alt-text-add-description-label = A莽谋klama ekle
+pdfjs-editor-alt-text-add-description-description = Konuyu, ortam谋 veya eylemleri tan谋mlayan bir iki c眉mle yazmaya 莽al谋艧谋n.
+pdfjs-editor-alt-text-mark-decorative-label = Dekoratif olarak i艧aretle
+pdfjs-editor-alt-text-mark-decorative-description = Kenarl谋klar veya filigranlar gibi dekoratif resimler i莽in kullan谋l谋r.
+pdfjs-editor-alt-text-cancel-button = Vazge莽
+pdfjs-editor-alt-text-save-button = Kaydet
+pdfjs-editor-alt-text-decorative-tooltip = Dekoratif olarak i艧aretlendi
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 脰rne臒in, 鈥淕en莽 bir adam yemek yemek i莽in masaya oturuyor鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = Alternatif metin
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Sol 眉st k枚艧e 鈥� yeniden boyutland谋r
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 脺st orta 鈥� yeniden boyutland谋r
+pdfjs-editor-resizer-top-right =
+    .aria-label = Sa臒 眉st k枚艧e 鈥� yeniden boyutland谋r
+pdfjs-editor-resizer-middle-right =
+    .aria-label = Orta sa臒 鈥� yeniden boyutland谋r
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = Sa臒 alt k枚艧e 鈥� yeniden boyutland谋r
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = Alt orta 鈥� yeniden boyutland谋r
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = Sol alt k枚艧e 鈥� yeniden boyutland谋r
+pdfjs-editor-resizer-middle-left =
+    .aria-label = Orta sol 鈥� yeniden boyutland谋r
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = Vurgu rengi
+pdfjs-editor-colorpicker-button =
+    .title = Rengi de臒i艧tir
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = Renk se莽enekleri
+pdfjs-editor-colorpicker-yellow =
+    .title = Sar谋
+pdfjs-editor-colorpicker-green =
+    .title = Ye艧il
+pdfjs-editor-colorpicker-blue =
+    .title = Mavi
+pdfjs-editor-colorpicker-pink =
+    .title = Pembe
+pdfjs-editor-colorpicker-red =
+    .title = K谋rm谋z谋
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = T眉m眉n眉 g枚ster
+pdfjs-editor-highlight-show-all-button =
+    .title = T眉m眉n眉 g枚ster
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Alt metni d眉zenle (resim a莽谋klamas谋)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Alt metin ekle (resim a莽谋klamas谋)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = A莽谋klaman谋z谋 buraya yaz谋n鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = G枚rme engelli ki艧ilere g枚sterilecek veya resmin y眉klenemedi臒i durumlarda g枚sterilecek k谋sa a莽谋klama.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = Bu alt metin otomatik olarak olu艧turulmu艧tur ve hatal谋 olabilir.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Daha fazla bilgi al谋n
+pdfjs-editor-new-alt-text-create-automatically-button-label = Otomatik olarak alt metin olu艧tur
+pdfjs-editor-new-alt-text-not-now-button = 艦imdi de臒il
+pdfjs-editor-new-alt-text-error-title = Alt metin otomatik olarak olu艧turulamad谋
+pdfjs-editor-new-alt-text-error-description = L眉tfen kendi alt metninizi yaz谋n veya daha sonra yeniden deneyin.
+pdfjs-editor-new-alt-text-error-close-button = Kapat
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alt metin yapay zek芒 modeli indiriliyor ({ $downloadedSize } / { $totalSize } MB)
+    .aria-valuetext = Alt metin yapay zek芒 modeli indiriliyor ({ $downloadedSize } / { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = Alternatif metin eklendi
+pdfjs-editor-new-alt-text-added-button-label = Alt metin eklendi
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Alternatif metin eksik
+pdfjs-editor-new-alt-text-missing-button-label = Alt metin eksik
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Alternatif metni incele
+pdfjs-editor-new-alt-text-to-review-button-label = Alt metni incele
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Otomatik olarak olu艧turuldu: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = Resim alt metni ayarlar谋
+pdfjs-image-alt-text-settings-button-label = Resim alt metni ayarlar谋
+pdfjs-editor-alt-text-settings-dialog-label = Resim alt metni ayarlar谋
+pdfjs-editor-alt-text-settings-automatic-title = Otomatik alt metin
+pdfjs-editor-alt-text-settings-create-model-button-label = Otomatik olarak alt metin olu艧tur
+pdfjs-editor-alt-text-settings-create-model-description = G枚rme engelli ki艧ilere g枚sterilecek veya resmin y眉klenemedi臒i durumlarda g枚sterilecek a莽谋klamalar 枚nerir.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = Alt metin yapay zek芒 modeli ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Verilerinizin gizli kalmas谋 i莽in cihaz谋n谋zda yerel olarak 莽al谋艧谋r. Otomatik alt metin i莽in gereklidir.
+pdfjs-editor-alt-text-settings-delete-model-button = Sil
+pdfjs-editor-alt-text-settings-download-model-button = 陌ndir
+pdfjs-editor-alt-text-settings-downloading-model-button = 陌ndiriliyor鈥�
+pdfjs-editor-alt-text-settings-editor-title = Alt metin d眉zenleyicisi
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Resim eklerken alt metin d眉zenleyicisini hemen g枚ster
+pdfjs-editor-alt-text-settings-show-dialog-description = T眉m resimlerinizin alt metne sahip oldu臒undan emin olman谋z谋 sa臒lar.
+pdfjs-editor-alt-text-settings-close-button = Kapat
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = Vurgu eklendi
+pdfjs-editor-freetext-added-alert = Metin eklendi
+pdfjs-editor-ink-added-alert = 脟izim eklendi
+pdfjs-editor-stamp-added-alert = Resim eklendi
+pdfjs-editor-signature-added-alert = 陌mza eklendi
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = Vurgulama silindi
+pdfjs-editor-undo-bar-message-freetext = Metin silindi
+pdfjs-editor-undo-bar-message-ink = 脟izim silindi
+pdfjs-editor-undo-bar-message-stamp = G枚rsel silindi
+pdfjs-editor-undo-bar-message-signature = 陌mza kald谋r谋ld谋
+pdfjs-editor-undo-bar-message-comment = Yorum silindi
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } ek a莽谋klama silindi
+       *[other] { $count } ek a莽谋klama silindi
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = Geri al
+pdfjs-editor-undo-bar-undo-button-label = Geri al
+pdfjs-editor-undo-bar-close-button =
+    .title = Kapat
+pdfjs-editor-undo-bar-close-button-label = Kapat
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Bu pencereden PDF belgesine eklemek 眉zere imza olu艧turabilirsiniz. Ad谋n谋z谋 d眉zenleyebilir (ad谋n谋z alt metin olarak da kullan谋l谋r) ve isterseniz ileride tekrar kullanmak 眉zere imzay谋 kaydedebilirsiniz.
+pdfjs-editor-add-signature-dialog-title = 陌mza ekle
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = Yaz
+    .title = Yaz
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 脟iz
+    .title = 脟iz
+pdfjs-editor-add-signature-image-button = Resim
+    .title = Resim
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 陌mzan谋z谋 yaz谋n
+    .placeholder = 陌mzan谋z谋 yaz谋n
+pdfjs-editor-add-signature-draw-placeholder = 陌mzan谋z谋 莽izin
+pdfjs-editor-add-signature-draw-thickness-range-label = Kal谋nl谋k
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 脟izgi kal谋nl谋臒谋: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = Y眉klenecek dosyay谋 buraya s眉r眉kleyin
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Veya resim dosyalar谋na g枚z at谋n
+       *[other] Veya resim dosyalar谋na g枚z at谋n
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = A莽谋klama (alt metin)
+pdfjs-editor-add-signature-description-input =
+    .title = A莽谋klama (alt metin)
+pdfjs-editor-add-signature-description-default-when-drawing = 陌mza
+pdfjs-editor-add-signature-clear-button-label = 陌mzay谋 temizle
+pdfjs-editor-add-signature-clear-button =
+    .title = 陌mzay谋 temizle
+pdfjs-editor-add-signature-save-checkbox = 陌mzay谋 kaydet
+pdfjs-editor-add-signature-save-warning-message = Kay谋tl谋 5 imza s谋n谋r谋na ula艧t谋n谋z. Daha fazla imza kaydetmek i莽in imzalardan birini kald谋r谋n.
+pdfjs-editor-add-signature-image-upload-error-title = Resim y眉klenemedi
+pdfjs-editor-add-signature-image-upload-error-description = A臒 ba臒lant谋n谋z谋 kontrol edin veya ba艧ka bir resim deneyin.
+pdfjs-editor-add-signature-image-no-data-error-title = Bu resim imzaya d枚n眉艧t眉r眉lemez
+pdfjs-editor-add-signature-image-no-data-error-description = L眉tfen farkl谋 bir resim y眉klemeyi deneyin.
+pdfjs-editor-add-signature-error-close-button = Kapat
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = Vazge莽
+pdfjs-editor-add-signature-add-button = Ekle
+pdfjs-editor-edit-signature-update-button = G眉ncelle
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Yorumu d眉zenle
+pdfjs-editor-edit-comment-popup-button =
+    .title = Yorumu d眉zenle
+pdfjs-editor-delete-comment-popup-button-label = Yorumu sil
+pdfjs-editor-delete-comment-popup-button =
+    .title = Yorumu sil
+pdfjs-show-comment-button =
+    .title = Yorumu g枚ster
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Yorumu d眉zenle
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = G眉ncelle
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Yorum ekle
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ekle
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = Yazmaya ba艧lay谋n鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = Vazge莽
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Yorum ekle
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = Kenar 莽ubu臒unu a莽/kapat (Belge, k眉莽眉k resimler/ana hat/ekler/katmanlar i莽eriyor)
+pdfjs-toggle-views-manager-button1-label = Sayfalar谋 y枚net
+pdfjs-views-manager-sidebar =
+    .aria-label = Kenar 莽ubu臒u
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = Kenar 莽ubu臒u boyutland谋r谋c谋
+pdfjs-views-manager-view-selector-button =
+    .title = G枚r眉n眉mler
+pdfjs-views-manager-view-selector-button-label = G枚r眉n眉mler
+pdfjs-views-manager-pages-title = Sayfalar
+pdfjs-views-manager-outlines-title1 = Belge ana hatlar谋
+    .title = Belge ana hatlar谋 (T眉m 枚臒eleri geni艧letmek/daraltmak i莽in 莽ift t谋klay谋n)
+pdfjs-views-manager-attachments-title = Ekler
+pdfjs-views-manager-layers-title1 = Katmanlar
+    .title = Katmanlar (T眉m katmanlar谋 varsay谋lan duruma s谋f谋rlamak i莽in 莽ift t谋klay谋n)
+pdfjs-views-manager-pages-option-label = Sayfalar
+pdfjs-views-manager-outlines-option-label = Belge ana hatlar谋
+pdfjs-views-manager-attachments-option-label = Ekler
+pdfjs-views-manager-layers-option-label = Katmanlar
+pdfjs-views-manager-add-file-button =
+    .title = Dosya ekle
+pdfjs-views-manager-add-file-button-label = Dosya ekle
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] { $count } se莽ili
+       *[other] { $count } se莽ili
+    }
+pdfjs-views-manager-pages-status-none-action-label = Sayfalar谋 se莽
+pdfjs-views-manager-pages-status-action-button-label = Y枚net
+pdfjs-views-manager-pages-status-copy-button-label = Kopyala
+pdfjs-views-manager-pages-status-cut-button-label = Kes
+pdfjs-views-manager-pages-status-delete-button-label = Sil
+pdfjs-views-manager-pages-status-export-selected-button-label = Se莽ilenleri d谋艧a aktar鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 sayfa kesildi
+       *[other] { $count } sayfa kesildi
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 sayfa kopyaland谋
+       *[other] { $count } sayfa kopyaland谋
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 sayfa silindi
+       *[other] { $count } sayfa silindi
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = Dosyan谋z haz谋rlan谋yor鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = Dosya y眉kleniyor鈥�
+pdfjs-views-manager-status-warning-cut-label = Kesilemedi. Sayfay谋 tazeleyip yeniden deneyin.
+pdfjs-views-manager-status-warning-copy-label = Kopyalanamad谋. Sayfay谋 tazeleyip yeniden deneyin.
+pdfjs-views-manager-status-warning-delete-label = Silinemedi. Sayfay谋 tazeleyip yeniden deneyin.
+pdfjs-views-manager-status-warning-save-label = Kaydedilemedi. Sayfay谋 tazeleyip yeniden deneyin.
+pdfjs-views-manager-status-undo-button-label = Geri al
+pdfjs-views-manager-status-done-button-label = Tamam
+pdfjs-views-manager-status-close-button =
+    .title = Kapat
+pdfjs-views-manager-status-close-button-label = Kapat
+pdfjs-views-manager-paste-button-label = Yap谋艧t谋r
+pdfjs-views-manager-paste-button-before =
+    .title = 陌lk sayfadan 枚nce yap谋艧t谋r
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = { $page }. sayfadan sonra yap谋艧t谋r
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = YEN陌
+pdfjs-views-manager-waiting-for-file = Dosya y眉kleniyor鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Sayfalar谋 y枚net
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Kay谋tl谋 imzay谋 kald谋r
+pdfjs-editor-delete-signature-button-label1 = Kay谋tl谋 imzay谋 kald谋r
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = A莽谋klamay谋 d眉zenle
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = A莽谋klamay谋 d眉zenle
diff --git a/public/pdfjs/web/locale/trs/viewer.ftl b/public/pdfjs/web/locale/trs/viewer.ftl
new file mode 100644
index 0000000..de1e8cb
--- /dev/null
+++ b/public/pdfjs/web/locale/trs/viewer.ftl
@@ -0,0 +1,163 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Pajin芒 gun芒j ruk霉u
+pdfjs-previous-button-label = Sa gachin
+pdfjs-next-button =
+    .title = Pajin芒 'na' 帽aan
+pdfjs-next-button-label = Ne' 帽aan
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 脩anj
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = si'iaj { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Nagi'iaj li'
+pdfjs-zoom-out-button-label = Nagi'iaj li'
+pdfjs-zoom-in-button =
+    .title = Nagi'iaj niko'
+pdfjs-zoom-in-button-label = Nagi'iaj niko'
+pdfjs-zoom-select =
+    .title = d脿j n矛ko ma'an
+pdfjs-presentation-mode-button =
+    .title = Naduno' daj ga ma
+pdfjs-presentation-mode-button-label = Daj g脿 ma
+pdfjs-open-file-button =
+    .title = Na'n茂n' chr没 帽anj
+pdfjs-open-file-button-label = Na'n茂n
+pdfjs-print-button =
+    .title = Nari' 帽a du'ua
+pdfjs-print-button-label = Nari' 帽adu'ua
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Rasun
+pdfjs-tools-button-label = Nej ras霉un
+pdfjs-first-page-button =
+    .title = gun' ri帽a pajina asiniin
+pdfjs-first-page-button-label = Gun' ri帽a pajina asiniin
+pdfjs-last-page-button =
+    .title = Gun' ri帽a pajina ruk霉 ni'in
+pdfjs-last-page-button-label = Gun' ri帽a pajina ruk霉 ni'inj
+pdfjs-page-rotate-cw-button =
+    .title = Tanikaj ne' huat
+pdfjs-page-rotate-cw-button-label = Tanikaj ne' huat
+pdfjs-page-rotate-ccw-button =
+    .title = Tanikaj ne' ch卯nt'
+pdfjs-page-rotate-ccw-button-label = Tanikaj ne' chint
+pdfjs-cursor-text-select-tool-button =
+    .title = Dugi'iaj sun' sa ganahui texto
+pdfjs-cursor-text-select-tool-button-label = Nej rasun arajsun' da' nahui' texto
+pdfjs-cursor-hand-tool-button =
+    .title = Nachrun' nej rasun
+pdfjs-cursor-hand-tool-button-label = Sa rajsun ro'o'
+pdfjs-scroll-vertical-button =
+    .title = Garasun' duku谩n run奴u
+pdfjs-scroll-vertical-button-label = Duku谩n run奴u
+pdfjs-scroll-horizontal-button =
+    .title = Garasun' duku谩n nikin' nahui
+pdfjs-scroll-horizontal-button-label = Duku谩n nikin' nahui
+pdfjs-scroll-wrapped-button =
+    .title = Garasun' sa nachree
+pdfjs-scroll-wrapped-button-label = Sa nachree
+pdfjs-spread-none-button =
+    .title = Si nagi'iaj nugun'un' nej pagina hua ninin
+pdfjs-spread-none-button-label = Ni'io daj hua pagina
+pdfjs-spread-odd-button =
+    .title = Nagi'iaj nugua'ant nej pajina
+pdfjs-spread-odd-button-label = Ni'io' daj hua libro gurin
+pdfjs-spread-even-button =
+    .title = Nak膩j dugui' ng脿 nej pajin芒 ayi'矛 ng脿 da' h霉i h霉i
+pdfjs-spread-even-button-label = Nahuin n矛ko nej
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Nej sa nik膩j 帽anj鈥�
+pdfjs-document-properties-button-label = Nej sa nik膩j 帽anj鈥�
+pdfjs-document-properties-file-name = Si yugui arch卯bo:
+pdfjs-document-properties-file-size = D脿j yach矛j arch卯bo:
+pdfjs-document-properties-title = Si yugui:
+pdfjs-document-properties-author = S铆 girir脿:
+pdfjs-document-properties-subject = Dugui':
+pdfjs-document-properties-keywords = Nej nuguan' hu矛i:
+pdfjs-document-properties-creation-date = Gui gurugui' man:
+pdfjs-document-properties-modification-date = Nuguan' nahuin nak脿:
+pdfjs-document-properties-creator = Guiri ro'
+pdfjs-document-properties-producer = Sa ri PDF:
+pdfjs-document-properties-version = PDF Version:
+pdfjs-document-properties-page-count = Si Guend芒 P芒jina:
+pdfjs-document-properties-page-size = D脿j yach矛j p芒jina:
+pdfjs-document-properties-page-size-unit-inches = ri帽a
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = nadu'ua
+pdfjs-document-properties-page-size-orientation-landscape = d脿j huaj
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Da'ng脿'a
+pdfjs-document-properties-page-size-name-legal = Nuguan' a'n茂'茂n
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Nan猫t chre ni'iajt ri帽a Web:
+pdfjs-document-properties-linearized-yes = Ga'ue
+pdfjs-document-properties-linearized-no = Si ga'ue
+pdfjs-document-properties-close-button = Nar谩n
+
+## Print
+
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Duyichin'
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Nadun膩 barr芒 n霉 yi'n茂n
+pdfjs-toggle-sidebar-button-label = Nadun膩 barr芒 n霉 yi'n茂n
+pdfjs-findbar-button-label = Nar矛'
+
+## Find panel button title and messages
+
+pdfjs-find-previous-button-label = Sa gach卯n
+pdfjs-find-next-button-label = Ne' 帽aan
+pdfjs-find-highlight-checkbox = Daran' sa 帽a'an
+pdfjs-find-match-case-checkbox-label = Match case
+pdfjs-find-not-found = Nu nar矛'ij nugua'anj
+
+## Predefined zoom values
+
+pdfjs-page-scale-actual = D脿j y脿chi akuan' n铆n
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Password
+
+pdfjs-password-ok-button = Ga'ue
+pdfjs-password-cancel-button = Duyichin'
diff --git a/public/pdfjs/web/locale/uk/viewer.ftl b/public/pdfjs/web/locale/uk/viewer.ftl
new file mode 100644
index 0000000..3b293e2
--- /dev/null
+++ b/public/pdfjs/web/locale/uk/viewer.ftl
@@ -0,0 +1,727 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 袩芯锌械褉械写薪褟 褋褌芯褉褨薪泻邪
+pdfjs-previous-button-label = 袩芯锌械褉械写薪褟
+pdfjs-next-button =
+    .title = 袧邪褋褌褍锌薪邪 褋褌芯褉褨薪泻邪
+pdfjs-next-button-label = 袧邪褋褌褍锌薪邪
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 小褌芯褉褨薪泻邪
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 褨蟹 { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 褨蟹 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 袟屑械薪褕懈褌懈
+pdfjs-zoom-out-button-label = 袟屑械薪褕懈褌懈
+pdfjs-zoom-in-button =
+    .title = 袟斜褨谢褜褕懈褌懈
+pdfjs-zoom-in-button-label = 袟斜褨谢褜褕懈褌懈
+pdfjs-zoom-select =
+    .title = 袦邪褋褕褌邪斜
+pdfjs-presentation-mode-button =
+    .title = 袩械褉械泄褌懈 胁 褉械卸懈屑 锌褉械蟹械薪褌邪褑褨褩
+pdfjs-presentation-mode-button-label = 袪械卸懈屑 锌褉械蟹械薪褌邪褑褨褩
+pdfjs-open-file-button =
+    .title = 袙褨写泻褉懈褌懈 褎邪泄谢
+pdfjs-open-file-button-label = 袙褨写泻褉懈褌懈
+pdfjs-print-button =
+    .title = 袛褉褍泻
+pdfjs-print-button-label = 袛褉褍泻
+pdfjs-save-button =
+    .title = 袟斜械褉械谐褌懈
+pdfjs-save-button-label = 袟斜械褉械谐褌懈
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 袟邪胁邪薪褌邪卸懈褌懈
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 袟邪胁邪薪褌邪卸懈褌懈
+pdfjs-bookmark-button =
+    .title = 袩芯褌芯褔薪邪 褋褌芯褉褨薪泻邪 (锌械褉械谐谢褟写 URL-邪写褉械褋懈 蟹 锌芯褌芯褔薪芯褩 褋褌芯褉褨薪泻懈)
+pdfjs-bookmark-button-label = 袩芯褌芯褔薪邪 褋褌芯褉褨薪泻邪
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 袉薪褋褌褉褍屑械薪褌懈
+pdfjs-tools-button-label = 袉薪褋褌褉褍屑械薪褌懈
+pdfjs-first-page-button =
+    .title = 袧邪 锌械褉褕褍 褋褌芯褉褨薪泻褍
+pdfjs-first-page-button-label = 袧邪 锌械褉褕褍 褋褌芯褉褨薪泻褍
+pdfjs-last-page-button =
+    .title = 袧邪 芯褋褌邪薪薪褞 褋褌芯褉褨薪泻褍
+pdfjs-last-page-button-label = 袧邪 芯褋褌邪薪薪褞 褋褌芯褉褨薪泻褍
+pdfjs-page-rotate-cw-button =
+    .title = 袩芯胁械褉薪褍褌懈 蟹邪 谐芯写懈薪薪懈泻芯胁芯褞 褋褌褉褨谢泻芯褞
+pdfjs-page-rotate-cw-button-label = 袩芯胁械褉薪褍褌懈 蟹邪 谐芯写懈薪薪懈泻芯胁芯褞 褋褌褉褨谢泻芯褞
+pdfjs-page-rotate-ccw-button =
+    .title = 袩芯胁械褉薪褍褌懈 锌褉芯褌懈 谐芯写懈薪薪懈泻芯胁芯褩 褋褌褉褨谢泻懈
+pdfjs-page-rotate-ccw-button-label = 袩芯胁械褉薪褍褌懈 锌褉芯褌懈 谐芯写懈薪薪懈泻芯胁芯褩 褋褌褉褨谢泻懈
+pdfjs-cursor-text-select-tool-button =
+    .title = 校胁褨屑泻薪褍褌懈 褨薪褋褌褉褍屑械薪褌 胁懈斜芯褉褍 褌械泻褋褌褍
+pdfjs-cursor-text-select-tool-button-label = 袉薪褋褌褉褍屑械薪褌 胁懈斜芯褉褍 褌械泻褋褌褍
+pdfjs-cursor-hand-tool-button =
+    .title = 校胁褨屑泻薪褍褌懈 褨薪褋褌褉褍屑械薪褌 "袪褍泻邪"
+pdfjs-cursor-hand-tool-button-label = 袉薪褋褌褉褍屑械薪褌 "袪褍泻邪"
+pdfjs-scroll-page-button =
+    .title = 袙懈泻芯褉懈褋褌芯胁褍胁邪褌懈 锌褉芯泻褉褍褔褍胁邪薪薪褟 褋褌芯褉褨薪泻懈
+pdfjs-scroll-page-button-label = 袩褉芯泻褉褍褔褍胁邪薪薪褟 褋褌芯褉褨薪泻懈
+pdfjs-scroll-vertical-button =
+    .title = 袙懈泻芯褉懈褋褌芯胁褍胁邪褌懈 胁械褉褌懈泻邪谢褜薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+pdfjs-scroll-vertical-button-label = 袙械褉褌懈泻邪谢褜薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+pdfjs-scroll-horizontal-button =
+    .title = 袙懈泻芯褉懈褋褌芯胁褍胁邪褌懈 谐芯褉懈蟹芯薪褌邪谢褜薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+pdfjs-scroll-horizontal-button-label = 袚芯褉懈蟹芯薪褌邪谢褜薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+pdfjs-scroll-wrapped-button =
+    .title = 袙懈泻芯褉懈褋褌芯胁褍胁邪褌懈 屑邪褋褕褌邪斜芯胁邪薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+pdfjs-scroll-wrapped-button-label = 袦邪褋褕褌邪斜芯胁邪薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+pdfjs-spread-none-button =
+    .title = 袧械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褉芯蟹谐芯褉薪褍褌褨 褋褌芯褉褨薪泻懈
+pdfjs-spread-none-button-label = 袘械蟹 褉芯蟹谐芯褉薪褍褌懈褏 褋褌芯褉褨薪芯泻
+pdfjs-spread-odd-button =
+    .title = 袪芯蟹谐芯褉薪褍褌褨 褋褌芯褉褨薪泻懈 锌芯褔懈薪邪褞褌褜褋褟 蟹 薪械锌邪褉薪懈褏 薪芯屑械褉褨胁
+pdfjs-spread-odd-button-label = 袧械锌邪褉薪褨 褋褌芯褉褨薪泻懈 蟹谢褨胁邪
+pdfjs-spread-even-button =
+    .title = 袪芯蟹谐芯褉薪褍褌褨 褋褌芯褉褨薪泻懈 锌芯褔懈薪邪褞褌褜褋褟 蟹 锌邪褉薪懈褏 薪芯屑械褉褨胁
+pdfjs-spread-even-button-label = 袩邪褉薪褨 褋褌芯褉褨薪泻懈 蟹谢褨胁邪
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 袙谢邪褋褌懈胁芯褋褌褨 写芯泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-button-label = 袙谢邪褋褌懈胁芯褋褌褨 写芯泻褍屑械薪褌邪鈥�
+pdfjs-document-properties-file-name = 袧邪蟹胁邪 褎邪泄谢褍:
+pdfjs-document-properties-file-size = 袪芯蟹屑褨褉 褎邪泄谢褍:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } 泻袘 ({ $b } 斜邪泄褌褨胁)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } 袦袘 ({ $b } 斜邪泄褌褨胁)
+pdfjs-document-properties-title = 袟邪谐芯谢芯胁芯泻:
+pdfjs-document-properties-author = 袗胁褌芯褉:
+pdfjs-document-properties-subject = 孝械屑邪:
+pdfjs-document-properties-keywords = 袣谢褞褔芯胁褨 褋谢芯胁邪:
+pdfjs-document-properties-creation-date = 袛邪褌邪 褋褌胁芯褉械薪薪褟:
+pdfjs-document-properties-modification-date = 袛邪褌邪 蟹屑褨薪懈:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 小褌胁芯褉械薪芯:
+pdfjs-document-properties-producer = 袙懈褉芯斜薪懈泻 PDF:
+pdfjs-document-properties-version = 袙械褉褋褨褟 PDF:
+pdfjs-document-properties-page-count = 袣褨谢褜泻褨褋褌褜 褋褌芯褉褨薪芯泻:
+pdfjs-document-properties-page-size = 袪芯蟹屑褨褉 褋褌芯褉褨薪泻懈:
+pdfjs-document-properties-page-size-unit-inches = 写褞泄屑褨胁
+pdfjs-document-properties-page-size-unit-millimeters = 屑屑
+pdfjs-document-properties-page-size-orientation-portrait = 泻薪懈卸泻芯胁邪
+pdfjs-document-properties-page-size-orientation-landscape = 邪谢褜斜芯屑薪邪
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 楔胁懈写泻懈泄 锌械褉械谐谢褟写 胁 袉薪褌械褉薪械褌褨:
+pdfjs-document-properties-linearized-yes = 孝邪泻
+pdfjs-document-properties-linearized-no = 袧褨
+pdfjs-document-properties-close-button = 袟邪泻褉懈褌懈
+
+## Print
+
+pdfjs-print-progress-message = 袩褨写谐芯褌芯胁泻邪 写芯泻褍屑械薪褌褍 写芯 写褉褍泻褍鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 小泻邪褋褍胁邪褌懈
+pdfjs-printing-not-supported = 袩芯锌械褉械写卸械薪薪褟: 笑械泄 斜褉邪褍蟹械褉 薪械 锌芯胁薪褨褋褌褞 锌褨写褌褉懈屑褍褦 写褉褍泻.
+pdfjs-printing-not-ready = 袩芯锌械褉械写卸械薪薪褟: PDF 薪械 锌芯胁薪褨褋褌褞 蟹邪胁邪薪褌邪卸械薪懈泄 写谢褟 写褉褍泻褍.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 袘褨褔薪邪 锌邪薪械谢褜
+pdfjs-toggle-sidebar-notification-button =
+    .title = 袩械褉械屑泻薪褍褌懈 斜褨褔薪褍 锌邪薪械谢褜 (写芯泻褍屑械薪褌 屑褨褋褌懈褌褜 械褋泻褨蟹/胁泻谢邪写械薪薪褟/褕邪褉懈)
+pdfjs-toggle-sidebar-button-label = 袩械褉械屑泻薪褍褌懈 斜褨褔薪褍 锌邪薪械谢褜
+pdfjs-document-outline-button =
+    .title = 袩芯泻邪蟹邪褌懈 褋褏械屑褍 写芯泻褍屑械薪褌褍 (锌芯写胁褨泄薪懈泄 泻谢褨泻 写谢褟 褉芯蟹谐芯褉褌邪薪薪褟/蟹谐芯褉褌邪薪薪褟 械谢械屑械薪褌褨胁)
+pdfjs-document-outline-button-label = 小褏械屑邪 写芯泻褍屑械薪褌邪
+pdfjs-attachments-button =
+    .title = 袩芯泻邪蟹邪褌懈 胁泻谢邪写械薪薪褟
+pdfjs-attachments-button-label = 袙泻谢邪写械薪薪褟
+pdfjs-layers-button =
+    .title = 袩芯泻邪蟹邪褌懈 褕邪褉懈 (写胁褨褔褨 泻谢邪褑薪褨褌褜, 褖芯斜 褋泻懈薪褍褌懈 胁褋褨 褕邪褉懈 写芯 褌懈锌芯胁芯谐芯 褋褌邪薪褍)
+pdfjs-layers-button-label = 楔邪褉懈
+pdfjs-thumbs-button =
+    .title = 袩芯泻邪蟹邪褌懈 屑褨薪褨邪褌褞褉懈
+pdfjs-thumbs-button-label = 袦褨薪褨邪褌褞褉懈
+pdfjs-current-outline-item-button =
+    .title = 袟薪邪泄褌懈 锌芯褌芯褔薪懈泄 械谢械屑械薪褌 蟹屑褨褋褌褍
+pdfjs-current-outline-item-button-label = 袩芯褌芯褔薪懈泄 械谢械屑械薪褌 蟹屑褨褋褌褍
+pdfjs-findbar-button =
+    .title = 袟薪邪泄褌懈 胁 写芯泻褍屑械薪褌褨
+pdfjs-findbar-button-label = 袟薪邪泄褌懈
+pdfjs-additional-layers = 袛芯写邪褌泻芯胁褨 褕邪褉懈
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 小褌芯褉褨薪泻邪 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 袝褋泻褨蟹 褋褌芯褉褨薪泻懈 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 袟薪邪泄褌懈
+    .placeholder = 袟薪邪泄褌懈 胁 写芯泻褍屑械薪褌褨鈥�
+pdfjs-find-previous-button =
+    .title = 袟薪邪泄褌懈 锌芯锌械褉械写薪褦 胁褏芯写卸械薪薪褟 褎褉邪蟹懈
+pdfjs-find-previous-button-label = 袩芯锌械褉械写薪褦
+pdfjs-find-next-button =
+    .title = 袟薪邪泄褌懈 薪邪褋褌褍锌薪械 胁褏芯写卸械薪薪褟 褎褉邪蟹懈
+pdfjs-find-next-button-label = 袧邪褋褌褍锌薪械
+pdfjs-find-highlight-checkbox = 袩褨写褋胁褨褌懈褌懈 胁褋械
+pdfjs-find-match-case-checkbox-label = 袟 褍褉邪褏褍胁邪薪薪褟屑 褉械谐褨褋褌褉褍
+pdfjs-find-match-diacritics-checkbox-label = 袙褨写锌芯胁褨写薪褨褋褌褜 写褨邪泻褉懈褌懈褔薪懈褏 蟹薪邪泻褨胁
+pdfjs-find-entire-word-checkbox-label = 笑褨谢褨 褋谢芯胁邪
+pdfjs-find-reached-top = 袛芯褋褟谐薪褍褌芯 锌芯褔邪褌泻褍 写芯泻褍屑械薪褌褍, 锌褉芯写芯胁卸械薪芯 蟹 泻褨薪褑褟
+pdfjs-find-reached-bottom = 袛芯褋褟谐薪褍褌芯 泻褨薪褑褟 写芯泻褍屑械薪褌褍, 锌褉芯写芯胁卸械薪芯 蟹 锌芯褔邪褌泻褍
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count =
+    { $total ->
+        [one] { $current } 蟹斜褨谐 蟹 { $total }
+        [few] { $current } 蟹斜褨谐懈 蟹 { $total }
+       *[many] { $current } 蟹斜褨谐褨胁 蟹 { $total }
+    }
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit =
+    { $limit ->
+        [one] 袩芯薪邪写 { $limit } 蟹斜褨谐
+        [few] 袩芯薪邪写 { $limit } 蟹斜褨谐懈
+       *[many] 袩芯薪邪写 { $limit } 蟹斜褨谐褨胁
+    }
+pdfjs-find-not-found = 肖褉邪蟹褍 薪械 蟹薪邪泄写械薪芯
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 袟邪 褕懈褉懈薪芯褞
+pdfjs-page-scale-fit = 袙屑褨褋褌懈褌懈
+pdfjs-page-scale-auto = 袗胁褌芯屑邪褋褕褌邪斜
+pdfjs-page-scale-actual = 袛褨泄褋薪懈泄 褉芯蟹屑褨褉
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 小褌芯褉褨薪泻邪 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = 袩褨写 褔邪褋 蟹邪胁邪薪褌邪卸械薪薪褟 PDF 褋褌邪谢邪褋褟 锌芯屑懈谢泻邪.
+pdfjs-invalid-file-error = 袧械写褨泄褋薪懈泄 邪斜芯 锌芯褕泻芯写卸械薪懈泄 PDF-褎邪泄谢.
+pdfjs-missing-file-error = 袙褨写褋褍褌薪褨泄 PDF-褎邪泄谢.
+pdfjs-unexpected-response-error = 袧械芯褔褨泻褍胁邪薪邪 胁褨写锌芯胁褨写褜 褋械褉胁械褉邪.
+pdfjs-rendering-error = 袩褨写 褔邪褋 胁懈胁械写械薪薪褟 褋褌芯褉褨薪泻懈 褋褌邪谢邪褋褟 锌芯屑懈谢泻邪.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type }-邪薪芯褌邪褑褨褟]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 袙胁械写褨褌褜 锌邪褉芯谢褜 写谢褟 胁褨写泻褉懈褌褌褟 褑褜芯谐芯 PDF-褎邪泄谢褍.
+pdfjs-password-invalid = 袧械锌褉邪胁懈谢褜薪懈泄 锌邪褉芯谢褜. 小锌褉芯斜褍泄褌械 褖械 褉邪蟹.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = 小泻邪褋褍胁邪褌懈
+pdfjs-web-fonts-disabled = 袙械斜褕褉懈褎褌懈 胁懈屑泻薪械薪芯: 薪械屑芯卸谢懈胁芯 胁懈泻芯褉懈褋褌邪褌懈 胁斜褍写芯胁邪薪褨 褍 PDF 褕褉懈褎褌懈.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 孝械泻褋褌
+pdfjs-editor-color-picker-free-text-input =
+    .title = 袟屑褨薪懈褌懈 泻芯谢褨褉 褌械泻褋褌褍
+pdfjs-editor-free-text-button-label = 孝械泻褋褌
+pdfjs-editor-ink-button =
+    .title = 袦邪谢褞胁邪褌懈
+pdfjs-editor-color-picker-ink-input =
+    .title = 袟屑褨薪懈褌懈 泻芯谢褨褉 屑邪谢褞薪泻邪
+pdfjs-editor-ink-button-label = 袦邪谢褞胁邪褌懈
+pdfjs-editor-stamp-button =
+    .title = 袛芯写邪褌懈 褔懈 褉械写邪谐褍胁邪褌懈 蟹芯斜褉邪卸械薪薪褟
+pdfjs-editor-stamp-button-label = 袛芯写邪褌懈 褔懈 褉械写邪谐褍胁邪褌懈 蟹芯斜褉邪卸械薪薪褟
+pdfjs-editor-highlight-button =
+    .title = 袩褨写褋胁褨褌懈褌懈
+pdfjs-editor-highlight-button-label = 袩褨写褋胁褨褌懈褌懈
+pdfjs-highlight-floating-button1 =
+    .title = 袩褨写褋胁褨褌懈褌懈
+    .aria-label = 袩褨写褋胁褨褌懈褌懈
+pdfjs-highlight-floating-button-label = 袩褨写褋胁褨褌懈褌懈
+pdfjs-comment-floating-button =
+    .title = 袣芯屑械薪褌褍胁邪褌懈
+    .aria-label = 袣芯屑械薪褌褍胁邪褌懈
+pdfjs-comment-floating-button-label = 袣芯屑械薪褌褍胁邪褌懈
+pdfjs-editor-comment-button =
+    .title = 袣芯屑械薪褌邪褉
+    .aria-label = 袣芯屑械薪褌邪褉
+pdfjs-editor-comment-button-label = 袣芯屑械薪褌邪褉
+pdfjs-editor-signature-button =
+    .title = 袛芯写邪褌懈 锌褨写锌懈褋
+pdfjs-editor-signature-button-label = 袛芯写邪褌懈 锌褨写锌懈褋
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 袪械写邪泻褌芯褉 锌褨写褋胁褨褔械薪褜
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 袪械写邪泻褌芯褉 屑邪谢褞薪泻褨胁
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 袪械写邪泻褌芯褉 锌褨写锌懈褋褍: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 袪械写邪泻褌芯褉 蟹芯斜褉邪卸械薪褜
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 袙懈谢褍褔懈褌懈 屑邪谢褞薪芯泻
+pdfjs-editor-remove-freetext-button =
+    .title = 袙懈谢褍褔懈褌懈 褌械泻褋褌
+pdfjs-editor-remove-stamp-button =
+    .title = 袙懈谢褍褔懈褌懈 蟹芯斜褉邪卸械薪薪褟
+pdfjs-editor-remove-highlight-button =
+    .title = 袙懈谢褍褔懈褌懈 锌褨写褋胁褨褔械薪薪褟
+pdfjs-editor-remove-signature-button =
+    .title = 袙懈谢褍褔懈褌懈 锌褨写锌懈褋
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 袣芯谢褨褉
+pdfjs-editor-free-text-size-input = 袪芯蟹屑褨褉
+pdfjs-editor-ink-color-input = 袣芯谢褨褉
+pdfjs-editor-ink-thickness-input = 孝芯胁褖懈薪邪
+pdfjs-editor-ink-opacity-input = 袩褉芯蟹芯褉褨褋褌褜
+pdfjs-editor-stamp-add-image-button =
+    .title = 袛芯写邪褌懈 蟹芯斜褉邪卸械薪薪褟
+pdfjs-editor-stamp-add-image-button-label = 袛芯写邪褌懈 蟹芯斜褉邪卸械薪薪褟
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 孝芯胁褖懈薪邪
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 袟屑褨薪褞泄褌械 褌芯胁褖懈薪褍 锌褨写 褔邪褋 锌褨写褋胁褨褔械薪薪褟 械谢械屑械薪褌褨胁, 泻褉褨屑 褌械泻褋褌褍
+pdfjs-editor-add-signature-container =
+    .aria-label = 袝谢械屑械薪褌懈 泻械褉褍胁邪薪薪褟 锌褨写锌懈褋邪屑懈 褌邪 蟹斜械褉械卸械薪褨 锌褨写锌懈褋懈
+pdfjs-editor-signature-add-signature-button =
+    .title = 袛芯写邪褌懈 薪芯胁懈泄 锌褨写锌懈褋
+pdfjs-editor-signature-add-signature-button-label = 袛芯写邪褌懈 薪芯胁懈泄 锌褨写锌懈褋
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 袟斜械褉械卸械薪懈泄 锌褨写锌懈褋: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 孝械泻褋褌芯胁懈泄 褉械写邪泻褌芯褉
+    .default-content = 袧邪锌懈褕褨褌褜 褖芯褋褜鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title =
+    { $count ->
+        [one] 袣芯屑械薪褌邪褉
+        [few] 袣芯屑械薪褌邪褉褨
+       *[many] 袣芯屑械薪褌邪褉褨
+    }
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 袟邪泻褉懈褌懈 斜褨褔薪褍 锌邪薪械谢褜
+    .aria-label = 袟邪泻褉懈褌懈 斜褨褔薪褍 锌邪薪械谢褜
+pdfjs-editor-comments-sidebar-close-button-label = 袟邪泻褉懈褌懈 斜褨褔薪褍 锌邪薪械谢褜
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 袘邪褔懈褌械 褖芯褋褜 胁邪褉褌械 褍胁邪谐懈? 袩褨写褋胁褨褌褨褌褜 褨 写芯写邪泄褌械 泻芯屑械薪褌邪褉.
+pdfjs-editor-comments-sidebar-no-comments-link = 袛芯泻谢邪写薪褨褕械
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 袗谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 袪械写邪谐褍胁邪褌懈 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+pdfjs-editor-alt-text-dialog-label = 袙懈斜褉邪褌懈 胁邪褉褨邪薪褌
+pdfjs-editor-alt-text-dialog-description = 袗谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌 写芯锌芯屑邪谐邪褦, 泻芯谢懈 蟹芯斜褉邪卸械薪薪褟 薪械 胁懈写薪芯 邪斜芯 泻芯谢懈 胁芯薪芯 薪械 蟹邪胁邪薪褌邪卸褍褦褌褜褋褟.
+pdfjs-editor-alt-text-add-description-label = 袛芯写邪褌懈 芯锌懈褋
+pdfjs-editor-alt-text-add-description-description = 袧邪屑邪谐邪泄褌械褋褟 褋褌胁芯褉懈褌懈 1-2 褉械褔械薪薪褟, 褟泻褨 芯锌懈褋褍褞褌褜 褌械屑褍, 芯斜褋褌邪胁懈薪懈 邪斜芯 写褨褩.
+pdfjs-editor-alt-text-mark-decorative-label = 袩芯蟹薪邪褔懈褌懈 写械泻芯褉邪褌懈胁薪懈屑
+pdfjs-editor-alt-text-mark-decorative-description = 袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 写械泻芯褉邪褌懈胁薪懈褏 蟹芯斜褉邪卸械薪褜, 薪邪锌褉懈泻谢邪写 褉邪屑芯泻 邪斜芯 胁芯写褟薪懈褏 蟹薪邪泻褨胁.
+pdfjs-editor-alt-text-cancel-button = 小泻邪褋褍胁邪褌懈
+pdfjs-editor-alt-text-save-button = 袟斜械褉械谐褌懈
+pdfjs-editor-alt-text-decorative-tooltip = 袩芯蟹薪邪褔械薪芯 写械泻芯褉邪褌懈胁薪懈屑
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 袧邪锌褉懈泻谢邪写, 鈥溞溞拘恍拘葱感� 褔芯谢芯胁褨泻 褋褨写邪褦 蟹邪 褋褌褨谢 褩褋褌懈鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 袗谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 袙械褉褏薪褨泄 谢褨胁懈泄 泻褍褌 鈥� 蟹屑褨薪邪 褉芯蟹屑褨褉褍
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 袙谐芯褉褨 锌芯褋械褉械写懈薪褨 鈥� 蟹屑褨薪邪 褉芯蟹屑褨褉褍
+pdfjs-editor-resizer-top-right =
+    .aria-label = 袙械褉褏薪褨泄 锌褉邪胁懈泄 泻褍褌 鈥� 蟹屑褨薪邪 褉芯蟹屑褨褉褍
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 袩褉邪胁芯褉褍褔 锌芯褋械褉械写懈薪褨 鈥� 蟹屑褨薪邪 褉芯蟹屑褨褉褍
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 袧懈卸薪褨泄 锌褉邪胁懈泄 泻褍褌 鈥� 蟹屑褨薪邪 褉芯蟹屑褨褉褍
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 袙薪懈蟹褍 锌芯褋械褉械写懈薪褨 鈥� 蟹屑褨薪邪 褉芯蟹屑褨褉褍
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 袧懈卸薪褨泄 谢褨胁懈泄 泻褍褌 鈥� 蟹屑褨薪邪 褉芯蟹屑褨褉褍
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 袥褨胁芯褉褍褔 锌芯褋械褉械写懈薪褨 鈥� 蟹屑褨薪邪 褉芯蟹屑褨褉褍
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 袣芯谢褨褉 锌褨写褋胁褨褔械薪薪褟
+pdfjs-editor-colorpicker-button =
+    .title = 袟屑褨薪懈褌懈 泻芯谢褨褉
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 袙懈斜褨褉 泻芯谢褜芯褉褍
+pdfjs-editor-colorpicker-yellow =
+    .title = 袞芯胁褌懈泄
+pdfjs-editor-colorpicker-green =
+    .title = 袟械谢械薪懈泄
+pdfjs-editor-colorpicker-blue =
+    .title = 袘谢邪泻懈褌薪懈泄
+pdfjs-editor-colorpicker-pink =
+    .title = 袪芯卸械胁懈泄
+pdfjs-editor-colorpicker-red =
+    .title = 效械褉胁芯薪懈泄
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 袩芯泻邪蟹邪褌懈 胁褋械
+pdfjs-editor-highlight-show-all-button =
+    .title = 袩芯泻邪蟹邪褌懈 胁褋械
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 袪械写邪谐褍胁邪褌懈 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌 (芯锌懈褋 蟹芯斜褉邪卸械薪薪褟)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 袛芯写邪褌懈 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌 (芯锌懈褋 蟹芯斜褉邪卸械薪薪褟)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 袧邪锌懈褕褨褌褜 褋胁褨泄 芯锌懈褋 褌褍褌鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 袣芯褉芯褌泻懈泄 芯锌懈褋 写谢褟 谢褞写械泄, 褟泻褨 薪械 斜邪褔邪褌褜 蟹芯斜褉邪卸械薪薪褟, 邪斜芯 褟泻褖芯 蟹芯斜褉邪卸械薪薪褟 薪械 蟹邪胁邪薪褌邪卸褍褦褌褜褋褟.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 笑械泄 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌 褋褌胁芯褉械薪芯 邪胁褌芯屑邪褌懈褔薪芯, 褌芯屑褍 胁褨薪 屑芯卸械 斜褍褌懈 薪械褌芯褔薪懈屑.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 袛芯泻谢邪写薪褨褕械
+pdfjs-editor-new-alt-text-create-automatically-button-label = 袗胁褌芯屑邪褌懈褔薪芯 褋褌胁芯褉褞胁邪褌懈 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+pdfjs-editor-new-alt-text-not-now-button = 袧械 蟹邪褉邪蟹
+pdfjs-editor-new-alt-text-error-title = 袧械 胁写邪谢芯褋褟 邪胁褌芯屑邪褌懈褔薪芯 褋褌胁芯褉懈褌懈 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+pdfjs-editor-new-alt-text-error-description = 袧邪锌懈褕褨褌褜 胁谢邪褋薪懈泄 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌 邪斜芯 锌芯胁褌芯褉褨褌褜 褋锌褉芯斜褍 锌褨蟹薪褨褕械.
+pdfjs-editor-new-alt-text-error-close-button = 袟邪泻褉懈褌懈
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 袟邪胁邪薪褌邪卸械薪薪褟 屑芯写械谢褨 楔袉 写谢褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍 ({ $downloadedSize } 蟹 { $totalSize } 袦袘)
+    .aria-valuetext = 袟邪胁邪薪褌邪卸械薪薪褟 屑芯写械谢褨 楔袉 写谢褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍 ({ $downloadedSize } 蟹 { $totalSize } 袦袘)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 袗谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌 写芯写邪薪芯
+pdfjs-editor-new-alt-text-added-button-label = 袗谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌 写芯写邪薪芯
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 袙褨写褋褍褌薪褨泄 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+pdfjs-editor-new-alt-text-missing-button-label = 袙褨写褋褍褌薪褨泄 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 袩械褉械谐谢褟薪褍褌懈 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+pdfjs-editor-new-alt-text-to-review-button-label = 袩械褉械谐谢褟薪褍褌懈 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 小褌胁芯褉械薪芯 邪胁褌芯屑邪褌懈褔薪芯: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 袧邪谢邪褕褌褍胁邪薪薪褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍 蟹芯斜褉邪卸械薪薪褟
+pdfjs-image-alt-text-settings-button-label = 袧邪谢邪褕褌褍胁邪薪薪褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍 蟹芯斜褉邪卸械薪薪褟
+pdfjs-editor-alt-text-settings-dialog-label = 袧邪谢邪褕褌褍胁邪薪薪褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍 蟹芯斜褉邪卸械薪薪褟
+pdfjs-editor-alt-text-settings-automatic-title = 袗胁褌芯屑邪褌懈褔薪懈泄 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+pdfjs-editor-alt-text-settings-create-model-button-label = 袗胁褌芯屑邪褌懈褔薪芯 褋褌胁芯褉褞胁邪褌懈 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌
+pdfjs-editor-alt-text-settings-create-model-description = 袩褉芯锌芯薪褍褦 芯锌懈褋懈, 褖芯斜 写芯锌芯屑芯谐褌懈 谢褞写褟屑, 褟泻褨 薪械 斜邪褔邪褌褜 蟹芯斜褉邪卸械薪薪褟, 邪斜芯 褟泻褖芯 蟹芯斜褉邪卸械薪薪褟 薪械 蟹邪胁邪薪褌邪卸褍褦褌褜褋褟.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 袦芯写械谢褜 楔袉 写谢褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍 ({ $totalSize } 袦袘)
+pdfjs-editor-alt-text-settings-ai-model-description = 袩褉邪褑褞褦 谢芯泻邪谢褜薪芯 薪邪 胁邪褕芯屑褍 锌褉懈褋褌褉芯褩, 褌芯屑褍 锌褉懈胁邪褌薪褨褋褌褜 胁邪褕懈褏 写邪薪懈褏 蟹邪褏懈褖械薪邪. 袩褉懈蟹薪邪褔械薪邪 写谢褟 邪胁褌芯屑邪褌懈褔薪芯谐芯 褋褌胁芯褉械薪薪褟 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍.
+pdfjs-editor-alt-text-settings-delete-model-button = 袙懈写邪谢懈褌懈
+pdfjs-editor-alt-text-settings-download-model-button = 袟邪胁邪薪褌邪卸懈褌懈
+pdfjs-editor-alt-text-settings-downloading-model-button = 袟邪胁邪薪褌邪卸械薪薪褟鈥�
+pdfjs-editor-alt-text-settings-editor-title = 袪械写邪泻褌芯褉 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 袩芯泻邪蟹褍胁邪褌懈 褉械写邪泻褌芯褉 邪谢褜褌械褉薪邪褌懈胁薪芯谐芯 褌械泻褋褌褍 锌褨写 褔邪褋 写芯写邪胁邪薪薪褟 蟹芯斜褉邪卸械薪薪褟
+pdfjs-editor-alt-text-settings-show-dialog-description = 袛芯锌芯屑邪谐邪褦 锌械褉械泻芯薪邪褌懈褋褟, 褖芯 胁褋褨 胁邪褕褨 蟹芯斜褉邪卸械薪薪褟 屑邪褞褌褜 邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌.
+pdfjs-editor-alt-text-settings-close-button = 袟邪泻褉懈褌懈
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 袩褨写褋胁褨褔械薪薪褟 写芯写邪薪芯
+pdfjs-editor-freetext-added-alert = 孝械泻褋褌 写芯写邪薪芯
+pdfjs-editor-ink-added-alert = 袦邪谢褞薪芯泻 写芯写邪薪芯
+pdfjs-editor-stamp-added-alert = 袟芯斜褉邪卸械薪薪褟 写芯写邪薪芯
+pdfjs-editor-signature-added-alert = 袩褨写锌懈褋 写芯写邪薪芯
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 袩褨写褋胁褨褔械薪薪褟 胁懈谢褍褔械薪芯
+pdfjs-editor-undo-bar-message-freetext = 孝械泻褋褌 胁懈谢褍褔械薪芯
+pdfjs-editor-undo-bar-message-ink = 袦邪谢褞薪芯泻 胁懈谢褍褔械薪芯
+pdfjs-editor-undo-bar-message-stamp = 袟芯斜褉邪卸械薪薪褟 胁懈谢褍褔械薪芯
+pdfjs-editor-undo-bar-message-signature = 袩褨写锌懈褋 胁懈谢褍褔械薪芯
+pdfjs-editor-undo-bar-message-comment = 袣芯屑械薪褌邪褉 胁懈谢褍褔械薪芯
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple =
+    { $count ->
+        [one] { $count } 邪薪芯褌邪褑褨褞 胁懈谢褍褔械薪芯
+        [few] { $count } 邪薪芯褌邪褑褨褩 胁懈谢褍褔械薪芯
+       *[many] { $count } 邪薪芯褌邪褑褨泄 胁懈谢褍褔械薪芯
+    }
+pdfjs-editor-undo-bar-undo-button =
+    .title = 袩芯胁械褉薪褍褌懈
+pdfjs-editor-undo-bar-undo-button-label = 袩芯胁械褉薪褍褌懈
+pdfjs-editor-undo-bar-close-button =
+    .title = 袟邪泻褉懈褌懈
+pdfjs-editor-undo-bar-close-button-label = 袟邪泻褉懈褌懈
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 校 褑褜芯屑褍 胁褨泻薪褨 泻芯褉懈褋褌褍胁邪褔 屑芯卸械 褋褌胁芯褉懈褌懈 锌褨写锌懈褋 写谢褟 写芯写邪胁邪薪薪褟 写芯 PDF-写芯泻褍屑械薪褌邪. 袣芯褉懈褋褌褍胁邪褔 屑芯卸械 胁褨写褉械写邪谐褍胁邪褌懈 薪邪蟹胁褍 (褟泻邪 褌邪泻芯卸 褋谢褍谐褍褦 邪谢褜褌械褉薪邪褌懈胁薪懈屑 褌械泻褋褌芯屑) 褨, 蟹邪 斜邪卸邪薪薪褟, 蟹斜械褉械谐褌懈 锌褨写锌懈褋 写谢褟 锌芯胁褌芯褉薪芯谐芯 胁懈泻芯褉懈褋褌邪薪薪褟.
+pdfjs-editor-add-signature-dialog-title = 袛芯写邪褌懈 锌褨写锌懈褋
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 袙胁械褋褌懈
+    .title = 袙胁械褋褌懈
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 袦邪谢褞胁邪褌懈
+    .title = 袦邪谢褞胁邪褌懈
+pdfjs-editor-add-signature-image-button = 袟芯斜褉邪卸械薪薪褟
+    .title = 袟芯斜褉邪卸械薪薪褟
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 袙胁械写褨褌褜 褋胁褨泄 锌褨写锌懈褋
+    .placeholder = 袙胁械写褨褌褜 褋胁褨泄 锌褨写锌懈褋
+pdfjs-editor-add-signature-draw-placeholder = 袧邪屑邪谢褞泄褌械 褋胁褨泄 锌褨写锌懈褋
+pdfjs-editor-add-signature-draw-thickness-range-label = 孝芯胁褖懈薪邪
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 孝芯胁褖懈薪邪 谢褨薪褨褩: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = 袩械褉械褌褟谐薪褨褌褜 褎邪泄谢 褋褞写懈, 褖芯斜 胁懈胁邪薪褌邪卸懈褌懈
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 袗斜芯 胁懈斜械褉褨褌褜 褎邪泄谢懈 蟹芯斜褉邪卸械薪褜
+       *[other] 袗斜芯 锌械褉械谐谢褟薪褜褌械 褎邪泄谢懈 蟹芯斜褉邪卸械薪褜
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 袨锌懈褋 (邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌)
+pdfjs-editor-add-signature-description-input =
+    .title = 袨锌懈褋 (邪谢褜褌械褉薪邪褌懈胁薪懈泄 褌械泻褋褌)
+pdfjs-editor-add-signature-description-default-when-drawing = 袩褨写锌懈褋
+pdfjs-editor-add-signature-clear-button-label = 袨褔懈褋褌懈褌懈 锌褨写锌懈褋
+pdfjs-editor-add-signature-clear-button =
+    .title = 袨褔懈褋褌懈褌懈 锌褨写锌懈褋
+pdfjs-editor-add-signature-save-checkbox = 袟斜械褉械谐褌懈 锌褨写锌懈褋
+pdfjs-editor-add-signature-save-warning-message = 袙懈 写芯褋褟谐谢懈 谢褨屑褨褌褍 胁 5 蟹斜械褉械卸械薪懈褏 锌褨写锌懈褋褨胁. 袙懈谢褍褔褨褌褜 芯写懈薪, 褖芯斜 蟹斜械褉械谐褌懈 褨薪褕懈泄.
+pdfjs-editor-add-signature-image-upload-error-title = 袧械 胁写邪谢芯褋褟 胁懈胁邪薪褌邪卸懈褌懈 蟹芯斜褉邪卸械薪薪褟
+pdfjs-editor-add-signature-image-upload-error-description = 袩械褉械胁褨褉褌械 屑械褉械卸械胁械 蟹'褦写薪邪薪薪褟 邪斜芯 褋锌褉芯斜褍泄褌械 褨薪褕械 蟹芯斜褉邪卸械薪薪褟.
+pdfjs-editor-add-signature-image-no-data-error-title = 袧械 胁写邪褦褌褜褋褟 泻芯薪胁械褉褌褍胁邪褌懈 褑械 蟹芯斜褉邪卸械薪薪褟 胁 锌褨写锌懈褋
+pdfjs-editor-add-signature-image-no-data-error-description = 小锌褉芯斜褍泄褌械 胁懈胁邪薪褌邪卸懈褌懈 褨薪褕械 蟹芯斜褉邪卸械薪薪褟.
+pdfjs-editor-add-signature-error-close-button = 袟邪泻褉懈褌懈
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 小泻邪褋褍胁邪褌懈
+pdfjs-editor-add-signature-add-button = 袛芯写邪褌懈
+pdfjs-editor-edit-signature-update-button = 袨薪芯胁懈褌懈
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 袪械写邪谐褍胁邪褌懈 泻芯屑械薪褌邪褉
+pdfjs-editor-edit-comment-popup-button =
+    .title = 袪械写邪谐褍胁邪褌懈 泻芯屑械薪褌邪褉
+pdfjs-editor-delete-comment-popup-button-label = 袙懈谢褍褔懈褌懈 泻芯屑械薪褌邪褉
+pdfjs-editor-delete-comment-popup-button =
+    .title = 袙懈谢褍褔懈褌懈 泻芯屑械薪褌邪褉
+pdfjs-show-comment-button =
+    .title = 袩芯泻邪蟹邪褌懈 泻芯屑械薪褌邪褉
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 袪械写邪谐褍胁邪褌懈 泻芯屑械薪褌邪褉
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 袨薪芯胁懈褌懈
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 袛芯写邪褌懈 泻芯屑械薪褌邪褉
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 袛芯写邪褌懈
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 袩芯褔薪褨褌褜 胁胁芯写懈褌懈鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 小泻邪褋褍胁邪褌懈
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 袛芯写邪褌懈 泻芯屑械薪褌邪褉
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 袩械褉械屑泻薪褍褌懈 斜褨褔薪褍 锌邪薪械谢褜 (写芯泻褍屑械薪褌 屑褨褋褌懈褌褜 屑褨薪褨邪褌褞褉懈/械褋泻褨蟹/胁泻谢邪写械薪薪褟/褕邪褉懈)
+pdfjs-views-manager-sidebar =
+    .aria-label = 袘褨褔薪邪 锌邪薪械谢褜
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 袟屑褨薪邪 褉芯蟹屑褨褉褍 斜褨褔薪芯褩 锌邪薪械谢褨
+pdfjs-views-manager-view-selector-button =
+    .title = 袙懈谐谢褟写
+pdfjs-views-manager-view-selector-button-label = 袙懈谐谢褟写
+pdfjs-views-manager-pages-title = 小褌芯褉褨薪泻懈
+pdfjs-views-manager-attachments-title = 袙泻谢邪写械薪薪褟
+pdfjs-views-manager-pages-option-label = 小褌芯褉褨薪泻懈
+pdfjs-views-manager-outlines-option-label = 小褏械屑邪 写芯泻褍屑械薪褌邪
+pdfjs-views-manager-attachments-option-label = 袙泻谢邪写械薪薪褟
+pdfjs-views-manager-layers-option-label = 楔邪褉懈
+pdfjs-views-manager-add-file-button =
+    .title = 袛芯写邪褌懈 褎邪泄谢
+pdfjs-views-manager-add-file-button-label = 袛芯写邪褌懈 褎邪泄谢
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label =
+    { $count ->
+        [one] 袙懈斜褉邪薪芯 { $count }
+        [few] 袙懈斜褉邪薪芯 { $count }
+       *[many] 袙懈斜褉邪薪芯 { $count }
+    }
+pdfjs-views-manager-pages-status-none-action-label = 袙懈斜褉邪褌懈 褋褌芯褉褨薪泻懈
+pdfjs-views-manager-pages-status-action-button-label = 袣械褉褍胁邪褌懈
+pdfjs-views-manager-pages-status-copy-button-label = 袣芯锌褨褞胁邪褌懈
+pdfjs-views-manager-pages-status-cut-button-label = 袙懈褉褨蟹邪褌懈
+pdfjs-views-manager-pages-status-delete-button-label = 袙懈写邪谢懈褌懈
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label =
+    { $count ->
+        [one] 1 褋褌芯褉褨薪泻褍 胁懈褉褨蟹邪薪芯
+        [few] { $count } 褋褌芯褉褨薪泻懈 胁懈褉褨蟹邪薪芯
+       *[many] { $count } 褋褌芯褉褨薪芯泻 胁懈褉褨蟹邪薪芯
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label =
+    { $count ->
+        [one] 1 褋褌芯褉褨薪泻褍 褋泻芯锌褨泄芯胁邪薪芯
+        [few] { $count } 褋褌芯褉褨薪泻懈 褋泻芯锌褨泄芯胁邪薪芯
+       *[many] { $count } 褋褌芯褉褨薪芯泻 褋泻芯锌褨泄芯胁邪薪芯
+    }
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label =
+    { $count ->
+        [one] 1 褋褌芯褉褨薪泻褍 胁懈写邪谢械薪芯
+        [few] { $count } 褋褌芯褉褨薪泻懈 胁懈写邪谢械薪芯
+       *[many] { $count } 褋褌芯褉褨薪芯泻 胁懈写邪谢械薪芯
+    }
+pdfjs-views-manager-pages-status-waiting-ready-label = 袩褨写谐芯褌芯胁泻邪 褎邪泄谢褍鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 袙懈胁邪薪褌邪卸械薪薪褟 褎邪泄谢褍鈥�
+pdfjs-views-manager-status-warning-cut-label = 袧械 胁写邪谢芯褋褟 胁懈褉褨蟹邪褌懈. 袨薪芯胁褨褌褜 褋褌芯褉褨薪泻褍 褌邪 褋锌褉芯斜褍泄褌械 褖械 褉邪蟹.
+pdfjs-views-manager-status-warning-copy-label = 袧械 胁写邪谢芯褋褟 褋泻芯锌褨褞胁邪褌懈. 袨薪芯胁褨褌褜 褋褌芯褉褨薪泻褍 褌邪 褋锌褉芯斜褍泄褌械 褖械 褉邪蟹.
+pdfjs-views-manager-status-warning-delete-label = 袧械 胁写邪谢芯褋褟 胁懈写邪谢懈褌懈. 袨薪芯胁褨褌褜 褋褌芯褉褨薪泻褍 褌邪 褋锌褉芯斜褍泄褌械 褖械 褉邪蟹.
+pdfjs-views-manager-status-warning-save-label = 袧械 胁写邪谢芯褋褟 蟹斜械褉械谐褌懈. 袨薪芯胁褨褌褜 褋褌芯褉褨薪泻褍 褌邪 褋锌褉芯斜褍泄褌械 褖械 褉邪蟹.
+pdfjs-views-manager-status-undo-button-label = 袩芯胁械褉薪褍褌懈
+pdfjs-views-manager-status-close-button =
+    .title = 袟邪泻褉懈褌懈
+pdfjs-views-manager-status-close-button-label = 袟邪泻褉懈褌懈
+pdfjs-views-manager-paste-button-label = 袙褋褌邪胁懈褌懈
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 袙懈写邪谢懈褌懈 蟹斜械褉械卸械薪懈泄 锌褨写锌懈褋
+pdfjs-editor-delete-signature-button-label1 = 袙懈写邪谢懈褌懈 蟹斜械褉械卸械薪懈泄 锌褨写锌懈褋
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 袪械写邪谐褍胁邪褌懈 芯锌懈褋
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 袪械写邪谐褍胁邪褌懈 芯锌懈褋
diff --git a/public/pdfjs/web/locale/ur/viewer.ftl b/public/pdfjs/web/locale/ur/viewer.ftl
new file mode 100644
index 0000000..1d2e92d
--- /dev/null
+++ b/public/pdfjs/web/locale/ur/viewer.ftl
@@ -0,0 +1,222 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 倬趩诰賱丕 氐賮丨蹃
+pdfjs-previous-button-label = 倬趩诰賱丕
+pdfjs-next-button =
+    .title = 丕诏賱丕 氐賮丨蹃
+pdfjs-next-button-label = 丌诏蹝
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 氐賮丨蹃
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = { $pagesCount } 讴丕
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } 讴丕 { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 亘丕蹃乇 夭賵賲 讴乇蹖诤
+pdfjs-zoom-out-button-label = 亘丕蹃乇 夭賵賲 讴乇蹖诤
+pdfjs-zoom-in-button =
+    .title = 丕賳丿乇 夭賵賲 讴乇蹖诤
+pdfjs-zoom-in-button-label = 丕賳丿乇 夭賵賲 讴乇蹖诤
+pdfjs-zoom-select =
+    .title = 夭賵賲
+pdfjs-presentation-mode-button =
+    .title = 倬蹖卮讴卮 賲賵趫 賲蹖诤 趩賱蹝 噩丕卅蹖诤
+pdfjs-presentation-mode-button-label = 倬蹖卮讴卮 賲賵趫
+pdfjs-open-file-button =
+    .title = 賲爻賱 讴诰賵賱蹖诤
+pdfjs-open-file-button-label = 讴诰賵賱蹖诤
+pdfjs-print-button =
+    .title = 趩诰丕倬蹖诤
+pdfjs-print-button-label = 趩诰丕倬蹖诤
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 丌賱丕鬲
+pdfjs-tools-button-label = 丌賱丕鬲
+pdfjs-first-page-button =
+    .title = 倬蹃賱蹝 氐賮丨蹃 倬乇 噩丕卅蹖诤
+pdfjs-first-page-button-label = 倬蹃賱蹝 氐賮丨蹃 倬乇 噩丕卅蹖诤
+pdfjs-last-page-button =
+    .title = 丌禺乇蹖 氐賮丨蹃 倬乇 噩丕卅蹖诤
+pdfjs-last-page-button-label = 丌禺乇蹖 氐賮丨蹃 倬乇 噩丕卅蹖诤
+pdfjs-page-rotate-cw-button =
+    .title = 诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+pdfjs-page-rotate-cw-button-label = 诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+pdfjs-page-rotate-ccw-button =
+    .title = 囟丿 诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+pdfjs-page-rotate-ccw-button-label = 囟丿 诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+pdfjs-cursor-text-select-tool-button =
+    .title = 賲鬲賳 讴蹝 丕賳鬲禺丕亘 讴蹝 俟賵賱 讴賵 賮毓丕賱 亘賳丕蹝
+pdfjs-cursor-text-select-tool-button-label = 賲鬲賳 讴蹝 丕賳鬲禺丕亘 讴丕 丌賱蹃
+pdfjs-cursor-hand-tool-button =
+    .title = 蹃蹖賳趫 俟賵賱 讴賵 賮毓丕賱 亘賳丕蹖蹖诤
+pdfjs-cursor-hand-tool-button-label = 蹃丕鬲诰 讴丕 丌賱蹃
+pdfjs-scroll-vertical-button =
+    .title = 毓賲賵丿蹖 丕爻讴乇賵賱賳诏 讴丕 丕爻鬲毓賲丕賱 讴乇蹖诤
+pdfjs-scroll-vertical-button-label = 毓賲賵丿蹖 丕爻讴乇賵賱賳诏
+pdfjs-scroll-horizontal-button =
+    .title = 丕賮賯蹖 爻讴乇賵賱賳诏 讴丕 丕爻鬲毓賲丕賱 讴乇蹖诤
+pdfjs-scroll-horizontal-button-label = 丕賮賯蹖 爻讴乇賵賱賳诏
+pdfjs-spread-none-button =
+    .title = 氐賮丨蹃 倬诰蹖賱丕賳蹝 賲蹖诤 卮丕賲賱 賳蹃 蹃賵诤
+pdfjs-spread-none-button-label = 讴賵卅蹖 倬诰蹖賱丕丐 賳蹃蹖诤
+pdfjs-spread-odd-button-label = 鬲丕讴 倬诰蹖賱丕丐
+pdfjs-spread-even-button-label = 噩賮鬲 倬诰蹖賱丕丐
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 丿爻鬲丕賵蹖夭 禺賵丕氐鈥�
+pdfjs-document-properties-button-label = 丿爻鬲丕賵蹖夭 禺賵丕氐鈥�
+pdfjs-document-properties-file-name = 賳丕賲 賲爻賱:
+pdfjs-document-properties-file-size = 賲爻賱 爻丕卅夭:
+pdfjs-document-properties-title = 毓賳賵丕賳:
+pdfjs-document-properties-author = 鬲禺賱蹖賯 讴丕乇:
+pdfjs-document-properties-subject = 賲賵囟賵毓:
+pdfjs-document-properties-keywords = 讴賱蹖丿蹖 丕賱賮丕馗:
+pdfjs-document-properties-creation-date = 鬲禺賱蹖賯 讴蹖 鬲丕乇蹖禺:
+pdfjs-document-properties-modification-date = 鬲乇賲蹖賲 讴蹖 鬲丕乇蹖禺:
+pdfjs-document-properties-creator = 鬲禺賱蹖賯 讴丕乇:
+pdfjs-document-properties-producer = PDF 倬蹖丿丕 讴丕乇:
+pdfjs-document-properties-version = PDF 賵乇跇賳:
+pdfjs-document-properties-page-count = 氐賮丨蹃 卮賲丕乇:
+pdfjs-document-properties-page-size = 氐賮蹃 讴蹖 賱賲亘丕卅:
+pdfjs-document-properties-page-size-unit-inches = 賲蹖诤
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 毓賲賵丿蹖 丕賳丿丕夭
+pdfjs-document-properties-page-size-orientation-landscape = 丕賮賯賶 丕賳丿丕夭
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = 禺胤
+pdfjs-document-properties-page-size-name-legal = 賯丕賳賵賳蹖
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } { $name } { $orientation }
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 鬲蹖夭 賵蹖亘 丿蹖讴诰蹖诤:
+pdfjs-document-properties-linearized-yes = 蹃丕诤
+pdfjs-document-properties-linearized-no = 賳蹃蹖诤
+pdfjs-document-properties-close-button = 亘賳丿 讴乇蹖诤
+
+## Print
+
+pdfjs-print-progress-message = 趩诰丕倬賳蹝 讴乇賳蹝 讴蹝 賱蹖蹝 丿爻鬲丕賵蹖夭 鬲蹖丕乇 讴蹖蹝 噩丕 乇诰蹝 诰蹖诤
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = *{ $progress }%*
+pdfjs-print-progress-close-button = 賲賳爻賵禺 讴乇蹖诤
+pdfjs-printing-not-supported = 鬲賳亘蹖蹃:趩诰丕倬賳丕 丕爻 亘乇丕丐夭乇 倬乇 倬賵乇蹖 胤乇丨 賲毓丕賵賳鬲 卮丿蹃 賳蹃蹖诤 蹃蹝蹟
+pdfjs-printing-not-ready = 鬲賳亘蹖蹃: PDF 趩诰倬丕卅蹖 讴蹝 賱蹖蹝 倬賵乇蹖 胤乇丨 賱賵趫 賳蹃蹖诤 蹃賵卅蹖蹟
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 爻賱丕卅蹖趫 俟賵诏賱 讴乇蹖诤
+pdfjs-toggle-sidebar-button-label = 爻賱丕卅蹖趫 俟賵诏賱 讴乇蹖诤
+pdfjs-document-outline-button =
+    .title = 丿爻鬲丕賵蹖夭 讴蹖 爻乇禺蹖丕诤 丿讴诰丕蹖诤 (鬲賲丕賲 丕卮蹖丕亍 賵爻蹖毓 / 睾丕卅亘 讴乇賳蹝 讴蹝 賱蹖蹝 趫亘賱 讴賱讴 讴乇蹖诤)
+pdfjs-document-outline-button-label = 丿爻鬲丕賵蹖夭 丌丐俟 賱丕卅賳
+pdfjs-attachments-button =
+    .title = 賲賳爻賱讴丕鬲 丿讴诰丕卅蹖诤
+pdfjs-attachments-button-label = 賲賳爻賱讴丕鬲
+pdfjs-thumbs-button =
+    .title = 鬲诰賲亘賳蹖賱 丿讴诰丕卅蹖诤
+pdfjs-thumbs-button-label = 賲噩賲賱
+pdfjs-findbar-button =
+    .title = 丿爻鬲丕賵蹖夭 賲蹖诤 趫诰賵賳趫蹖诤
+pdfjs-findbar-button-label = 趫诰賵賳趫蹖诤
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 氐賮丨蹃 { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 氐賮丨蹝 讴丕 賲噩賲賱 { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 趫诰賵賳趫蹖诤
+    .placeholder = 丿爻鬲丕賵蹖夭鈥� 賲蹖诤 趫诰賵賳趫蹖诤
+pdfjs-find-previous-button =
+    .title = 賮賯乇蹝 讴丕 倬趩诰賱丕 賵賯賵毓 趫诰賵賳趫蹖诤
+pdfjs-find-previous-button-label = 倬趩诰賱丕
+pdfjs-find-next-button =
+    .title = 賮賯乇蹝 讴丕 丕诏賱蹃 賵賯賵毓 趫诰賵賳趫蹖诤
+pdfjs-find-next-button-label = 丌诏蹝
+pdfjs-find-highlight-checkbox = 鬲賲丕賲 賳賲丕蹖丕诤 讴乇蹖诤
+pdfjs-find-match-case-checkbox-label = 丨乇賵賮 賲卮丕亘蹃 讴乇蹖诤
+pdfjs-find-entire-word-checkbox-label = 鬲賲丕賲 丕賱賮丕馗
+pdfjs-find-reached-top = 氐賮丨蹃 讴蹝 卮乇賵毓 倬乇 倬蹃賳趩 诏蹖丕貙 賳蹖趩蹝 爻蹝 噩丕乇蹖 讴蹖丕
+pdfjs-find-reached-bottom = 氐賮丨蹃 讴蹝 丕禺鬲鬲丕賲 倬乇 倬蹃賳趩 诏蹖丕貙 丕賵倬乇 爻蹝 噩丕乇蹖 讴蹖丕
+pdfjs-find-not-found = 賮賯乇丕 賳蹃蹖诤 賲賱丕
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 氐賮丨蹃 趩賵趹丕卅蹖
+pdfjs-page-scale-fit = 氐賮丨蹃 賮俟賳诏
+pdfjs-page-scale-auto = 禺賵丿讴丕乇 夭賵賲
+pdfjs-page-scale-actual = 丕氐賱 爻丕卅夭
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 氐賮丨蹃 { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF 賱賵趫 讴乇鬲蹝 賵賯鬲 賳賯氐 丌 诏蹖丕蹟
+pdfjs-invalid-file-error = 賳丕噩丕卅夭 蹖丕 禺乇丕亘 PDF 賲爻賱
+pdfjs-missing-file-error = PDF 賲爻賱 睾丕卅亘 蹃蹝蹟
+pdfjs-unexpected-response-error = 睾蹖乇賲鬲賵賯毓 倬蹖卮 讴丕乇 噩賵丕亘
+pdfjs-rendering-error = 氐賮丨蹃 亘賳丕鬲蹝 蹃賵卅蹝 賳賯氐 丌 诏蹖丕蹟
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 賳賵俟]
+
+## Password
+
+pdfjs-password-label = PDF 賲爻賱 讴诰賵賱賳蹝 讴蹝 賱蹖蹝 倬丕爻 賵乇趫 丿丕禺賱 讴乇蹖诤.
+pdfjs-password-invalid = 賳丕噩丕卅夭 倬丕爻 賵乇趫. 亘乇丕蹝貞 讴乇賲 丿賵亘丕乇蹃 讴賵卮卮 讴乇蹖诤.
+pdfjs-password-ok-button = 俟诰蹖讴 蹃蹝
+pdfjs-password-cancel-button = 賲賳爻賵禺 讴乇蹖诤
+pdfjs-web-fonts-disabled = 賵蹖亘 賮丕賳俟 賳丕 丕蹃賱 蹃蹖诤: 卮丕賲賱 PDF 賮丕賳俟 丕爻鬲毓賲丕賱 讴乇賳蹝 賲蹖诤 賳丕讴丕賲蹟
diff --git a/public/pdfjs/web/locale/uz/viewer.ftl b/public/pdfjs/web/locale/uz/viewer.ftl
new file mode 100644
index 0000000..8bc38e6
--- /dev/null
+++ b/public/pdfjs/web/locale/uz/viewer.ftl
@@ -0,0 +1,154 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Oldingi sahifa
+pdfjs-previous-button-label = Oldingi
+pdfjs-next-button =
+    .title = Keyingi sahifa
+pdfjs-next-button-label = Keyingi
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = /{ $pagesCount }
+pdfjs-zoom-out-button =
+    .title = Kichiklashtirish
+pdfjs-zoom-out-button-label = Kichiklashtirish
+pdfjs-zoom-in-button =
+    .title = Kattalashtirish
+pdfjs-zoom-in-button-label = Kattalashtirish
+pdfjs-zoom-select =
+    .title = Masshtab
+pdfjs-presentation-mode-button =
+    .title = Namoyish usuliga o驶tish
+pdfjs-presentation-mode-button-label = Namoyish usuli
+pdfjs-open-file-button =
+    .title = Faylni ochish
+pdfjs-open-file-button-label = Ochish
+pdfjs-print-button =
+    .title = Chop qilish
+pdfjs-print-button-label = Chop qilish
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Vositalar
+pdfjs-tools-button-label = Vositalar
+pdfjs-first-page-button =
+    .title = Birinchi sahifaga o驶tish
+pdfjs-first-page-button-label = Birinchi sahifaga o驶tish
+pdfjs-last-page-button =
+    .title = So驶nggi sahifaga o驶tish
+pdfjs-last-page-button-label = So驶nggi sahifaga o驶tish
+pdfjs-page-rotate-cw-button =
+    .title = Soat yo驶nalishi bo驶yicha burish
+pdfjs-page-rotate-cw-button-label = Soat yo驶nalishi bo驶yicha burish
+pdfjs-page-rotate-ccw-button =
+    .title = Soat yo驶nalishiga qarshi burish
+pdfjs-page-rotate-ccw-button-label = Soat yo驶nalishiga qarshi burish
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Hujjat xossalari
+pdfjs-document-properties-button-label = Hujjat xossalari
+pdfjs-document-properties-file-name = Fayl nomi:
+pdfjs-document-properties-file-size = Fayl hajmi:
+pdfjs-document-properties-title = Nomi:
+pdfjs-document-properties-author = Muallifi:
+pdfjs-document-properties-subject = Mavzusi:
+pdfjs-document-properties-keywords = Kalit so鈥榸lar
+pdfjs-document-properties-creation-date = Yaratilgan sanasi:
+pdfjs-document-properties-modification-date = O鈥榸gartirilgan sanasi
+pdfjs-document-properties-creator = Yaratuvchi:
+pdfjs-document-properties-producer = PDF ishlab chiqaruvchi:
+pdfjs-document-properties-version = PDF versiyasi:
+pdfjs-document-properties-page-count = Sahifa soni:
+
+##
+
+pdfjs-document-properties-close-button = Yopish
+
+## Print
+
+pdfjs-printing-not-supported = Diqqat: chop qilish bruzer tomonidan to驶liq qo驶llab-quvvatlanmaydi.
+pdfjs-printing-not-ready = Diqqat: PDF fayl chop qilish uchun to驶liq yuklanmadi.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Yon panelni yoqib/o驶chirib qo驶yish
+pdfjs-toggle-sidebar-button-label = Yon panelni yoqib/o驶chirib qo驶yish
+pdfjs-document-outline-button-label = Hujjat tuzilishi
+pdfjs-attachments-button =
+    .title = Ilovalarni ko鈥榬satish
+pdfjs-attachments-button-label = Ilovalar
+pdfjs-thumbs-button =
+    .title = Nishonchalarni ko驶rsatish
+pdfjs-thumbs-button-label = Nishoncha
+pdfjs-findbar-button =
+    .title = Hujjat ichidan topish
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = { $page } sahifa
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = { $page } sahifa nishonchasi
+
+## Find panel button title and messages
+
+pdfjs-find-previous-button =
+    .title = So驶zlardagi oldingi hodisani topish
+pdfjs-find-previous-button-label = Oldingi
+pdfjs-find-next-button =
+    .title = Iboradagi keyingi hodisani topish
+pdfjs-find-next-button-label = Keyingi
+pdfjs-find-highlight-checkbox = Barchasini ajratib ko驶rsatish
+pdfjs-find-match-case-checkbox-label = Katta-kichik harflarni farqlash
+pdfjs-find-reached-top = Hujjatning boshigacha yetib keldik, pastdan davom ettiriladi
+pdfjs-find-reached-bottom = Hujjatning oxiriga yetib kelindi, yuqoridan davom ettirladi
+pdfjs-find-not-found = So驶zlar topilmadi
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Sahifa eni
+pdfjs-page-scale-fit = Sahifani moslashtirish
+pdfjs-page-scale-auto = Avtomatik masshtab
+pdfjs-page-scale-actual = Haqiqiy hajmi
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = PDF yuklanayotganda xato yuz berdi.
+pdfjs-invalid-file-error = Xato yoki buzuq PDF fayli.
+pdfjs-missing-file-error = PDF fayl kerak.
+pdfjs-unexpected-response-error = Kutilmagan server javobi.
+pdfjs-rendering-error = Sahifa renderlanayotganda xato yuz berdi.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Annotation]
+
+## Password
+
+pdfjs-password-label = PDF faylni ochish uchun parolni kiriting.
+pdfjs-password-invalid = Parol - noto驶g驶ri. Qaytadan urinib ko驶ring.
+pdfjs-password-ok-button = OK
+pdfjs-web-fonts-disabled = Veb shriftlar o驶chirilgan: ichki PDF shriftlardan foydalanib bo驶lmmaydi.
diff --git a/public/pdfjs/web/locale/vi/viewer.ftl b/public/pdfjs/web/locale/vi/viewer.ftl
new file mode 100644
index 0000000..430850d
--- /dev/null
+++ b/public/pdfjs/web/locale/vi/viewer.ftl
@@ -0,0 +1,715 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Trang tr瓢峄沜
+pdfjs-previous-button-label = Tr瓢峄沜
+pdfjs-next-button =
+    .title = Trang Sau
+pdfjs-next-button-label = Ti岷縫
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Trang
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = tr锚n { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } tr锚n { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Thu nh峄�
+pdfjs-zoom-out-button-label = Thu nh峄�
+pdfjs-zoom-in-button =
+    .title = Ph贸ng to
+pdfjs-zoom-in-button-label = Ph贸ng to
+pdfjs-zoom-select =
+    .title = Thu ph贸ng
+pdfjs-presentation-mode-button =
+    .title = Chuy峄僴 sang ch岷� 膽峄� tr矛nh chi岷縰
+pdfjs-presentation-mode-button-label = Ch岷� 膽峄� tr矛nh chi岷縰
+pdfjs-open-file-button =
+    .title = M峄� t岷璸 tin
+pdfjs-open-file-button-label = M峄� t岷璸 tin
+pdfjs-print-button =
+    .title = In
+pdfjs-print-button-label = In
+pdfjs-save-button =
+    .title = L瓢u
+pdfjs-save-button-label = L瓢u
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = T岷 xu峄憂g
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = T岷 xu峄憂g
+pdfjs-bookmark-button =
+    .title = Trang hi峄噉 t岷 (xem URL t峄� trang hi峄噉 t岷)
+pdfjs-bookmark-button-label = Trang hi峄噉 t岷
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = C么ng c峄�
+pdfjs-tools-button-label = C么ng c峄�
+pdfjs-first-page-button =
+    .title = V峄� trang 膽岷
+pdfjs-first-page-button-label = V峄� trang 膽岷
+pdfjs-last-page-button =
+    .title = 膼岷縩 trang cu峄慽
+pdfjs-last-page-button-label = 膼岷縩 trang cu峄慽
+pdfjs-page-rotate-cw-button =
+    .title = Xoay theo chi峄乽 kim 膽峄搉g h峄�
+pdfjs-page-rotate-cw-button-label = Xoay theo chi峄乽 kim 膽峄搉g h峄�
+pdfjs-page-rotate-ccw-button =
+    .title = Xoay ng瓢峄 chi峄乽 kim 膽峄搉g h峄�
+pdfjs-page-rotate-ccw-button-label = Xoay ng瓢峄 chi峄乽 kim 膽峄搉g h峄�
+pdfjs-cursor-text-select-tool-button =
+    .title = K铆ch ho岷 c么ng c峄� ch峄峮 v霉ng v膬n b岷
+pdfjs-cursor-text-select-tool-button-label = C么ng c峄� ch峄峮 v霉ng v膬n b岷
+pdfjs-cursor-hand-tool-button =
+    .title = K铆ch ho岷 c么ng c峄� con tr峄�
+pdfjs-cursor-hand-tool-button-label = C么ng c峄� con tr峄�
+pdfjs-scroll-page-button =
+    .title = S峄� d峄g cu峄檔 trang hi峄噉 t岷
+pdfjs-scroll-page-button-label = Cu峄檔 trang hi峄噉 t岷
+pdfjs-scroll-vertical-button =
+    .title = S峄� d峄g cu峄檔 d峄峜
+pdfjs-scroll-vertical-button-label = Cu峄檔 d峄峜
+pdfjs-scroll-horizontal-button =
+    .title = S峄� d峄g cu峄檔 ngang
+pdfjs-scroll-horizontal-button-label = Cu峄檔 ngang
+pdfjs-scroll-wrapped-button =
+    .title = S峄� d峄g cu峄檔 ng岷痶 d貌ng
+pdfjs-scroll-wrapped-button-label = Cu峄檔 ng岷痶 d貌ng
+pdfjs-spread-none-button =
+    .title = Kh么ng n峄慽 r峄檔g trang
+pdfjs-spread-none-button-label = Kh么ng c贸 ph芒n c谩ch
+pdfjs-spread-odd-button =
+    .title = N峄慽 trang b脿i b岷痶 膽岷 v峄沬 c谩c trang 膽瓢峄 膽谩nh s峄� l岷�
+pdfjs-spread-odd-button-label = Ph芒n c谩ch theo s峄� l岷�
+pdfjs-spread-even-button =
+    .title = N峄慽 trang b脿i b岷痶 膽岷 v峄沬 c谩c trang 膽瓢峄 膽谩nh s峄� ch岷祅
+pdfjs-spread-even-button-label = Ph芒n c谩ch theo s峄� ch岷祅
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Thu峄檆 t铆nh c峄 t脿i li峄噓鈥�
+pdfjs-document-properties-button-label = Thu峄檆 t铆nh c峄 t脿i li峄噓鈥�
+pdfjs-document-properties-file-name = T锚n t岷璸 tin:
+pdfjs-document-properties-file-size = K铆ch th瓢峄沜:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)
+pdfjs-document-properties-title = Ti锚u 膽峄�:
+pdfjs-document-properties-author = T谩c gi岷�:
+pdfjs-document-properties-subject = Ch峄� 膽峄�:
+pdfjs-document-properties-keywords = T峄� kh贸a:
+pdfjs-document-properties-creation-date = Ng脿y t岷:
+pdfjs-document-properties-modification-date = Ng脿y s峄璦 膽峄昳:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = Ng瓢峄漣 t岷:
+pdfjs-document-properties-producer = Ph岷 m峄乵 t岷 PDF:
+pdfjs-document-properties-version = Phi锚n b岷 PDF:
+pdfjs-document-properties-page-count = T峄昻g s峄� trang:
+pdfjs-document-properties-page-size = K铆ch th瓢峄沜 trang:
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = kh峄� d峄峜
+pdfjs-document-properties-page-size-orientation-landscape = kh峄� ngang
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Th瓢
+pdfjs-document-properties-page-size-name-legal = Ph谩p l媒
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit } ({ $orientation })
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit } ({ $name }, { $orientation })
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = Xem nhanh tr锚n web:
+pdfjs-document-properties-linearized-yes = C贸
+pdfjs-document-properties-linearized-no = Kh么ng
+pdfjs-document-properties-close-button = 脨贸ng
+
+## Print
+
+pdfjs-print-progress-message = Chu岷﹏ b峄� trang 膽峄� in鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = H峄 b峄�
+pdfjs-printing-not-supported = C岷h b谩o: In 岷 kh么ng 膽瓢峄 h峄� tr峄� 膽岷 膽峄� 峄� tr矛nh duy峄噒 n脿y.
+pdfjs-printing-not-ready = C岷h b谩o: PDF ch瓢a 膽瓢峄 t岷 h岷縯 膽峄� in.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = B岷璽/T岷痶 thanh l峄�
+pdfjs-toggle-sidebar-notification-button =
+    .title = B岷璽 t岷痶 thanh l峄� (t脿i li峄噓 bao g峄搈 b岷 ph谩c th岷/t岷璸 tin 膽铆nh k猫m/l峄沺)
+pdfjs-toggle-sidebar-button-label = B岷璽/T岷痶 thanh l峄�
+pdfjs-document-outline-button =
+    .title = Hi峄僴 th峄� t脿i li峄噓 ph谩c th岷 (nh岷 膽煤p v脿o 膽峄� m峄� r峄檔g/thu g峄峮 t岷 c岷� c谩c m峄)
+pdfjs-document-outline-button-label = B岷 ph谩c t脿i li峄噓
+pdfjs-attachments-button =
+    .title = Hi峄噉 n峄檌 dung 膽铆nh k猫m
+pdfjs-attachments-button-label = N峄檌 dung 膽铆nh k猫m
+pdfjs-layers-button =
+    .title = Hi峄僴 th峄� c谩c l峄沺 (nh岷 膽煤p 膽峄� 膽岷穞 l岷 t岷 c岷� c谩c l峄沺 v峄� tr岷g th谩i m岷穋 膽峄媙h)
+pdfjs-layers-button-label = L峄沺
+pdfjs-thumbs-button =
+    .title = Hi峄僴 th峄� 岷h thu nh峄�
+pdfjs-thumbs-button-label = 岷h thu nh峄�
+pdfjs-current-outline-item-button =
+    .title = T矛m m峄 ph谩c th岷 hi峄噉 t岷
+pdfjs-current-outline-item-button-label = M峄 ph谩c th岷 hi峄噉 t岷
+pdfjs-findbar-button =
+    .title = T矛m trong t脿i li峄噓
+pdfjs-findbar-button-label = T矛m
+pdfjs-additional-layers = C谩c l峄沺 b峄� sung
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Trang { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 岷h thu nh峄� c峄 trang { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = Ch峄峮 trang { $page }
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = Trang { $page } / { $total }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = T矛m
+    .placeholder = T矛m trong t脿i li峄噓鈥�
+pdfjs-find-previous-button =
+    .title = T矛m c峄 t峄� 峄� ph岷 tr瓢峄沜
+pdfjs-find-previous-button-label = Tr瓢峄沜
+pdfjs-find-next-button =
+    .title = T矛m c峄 t峄� 峄� ph岷 sau
+pdfjs-find-next-button-label = Ti岷縫
+pdfjs-find-highlight-checkbox = 膼谩nh d岷 t岷 c岷�
+pdfjs-find-match-case-checkbox-label = Ph芒n bi峄噒 hoa, th瓢峄漬g
+pdfjs-find-match-diacritics-checkbox-label = Kh峄沺 d岷 ph峄�
+pdfjs-find-entire-word-checkbox-label = To脿n b峄� t峄�
+pdfjs-find-reached-top = 膼茫 膽岷縩 ph岷 膽岷 t脿i li峄噓, quay tr峄� l岷 t峄� cu峄慽
+pdfjs-find-reached-bottom = 膼茫 膽岷縩 ph岷 cu峄慽 c峄 t脿i li峄噓, quay tr峄� l岷 t峄� 膽岷
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count = { $current } tr锚n { $total } k岷縯 qu岷�
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit = T矛m th岷 h啤n { $limit } k岷縯 qu岷�
+pdfjs-find-not-found = Kh么ng t矛m th岷 c峄 t峄� n脿y
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = V峄玜 chi峄乽 r峄檔g
+pdfjs-page-scale-fit = V峄玜 chi峄乽 cao
+pdfjs-page-scale-auto = T峄� 膽峄檔g ch峄峮 k铆ch th瓢峄沜
+pdfjs-page-scale-actual = K铆ch th瓢峄沜 th峄眂
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = Trang { $page }
+
+## Loading indicator messages
+
+pdfjs-loading-error = L峄梚 khi t岷 t脿i li峄噓 PDF.
+pdfjs-invalid-file-error = T岷璸 tin PDF h峄弉g ho岷穋 kh么ng h峄 l峄�.
+pdfjs-missing-file-error = Thi岷縰 t岷璸 tin PDF.
+pdfjs-unexpected-response-error = M谩y ch峄� c贸 ph岷 h峄搃 l岷�.
+pdfjs-rendering-error = L峄梚 khi hi峄僴 th峄� trang.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Ch煤 th铆ch]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = Nh岷璸 m岷璽 kh岷﹗ 膽峄� m峄� t岷璸 tin PDF n脿y.
+pdfjs-password-invalid = M岷璽 kh岷﹗ kh么ng 膽煤ng. Vui l貌ng th峄� l岷.
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = H峄 b峄�
+pdfjs-web-fonts-disabled = Ph么ng ch峄� Web b峄� v么 hi峄噓 h贸a: kh么ng th峄� s峄� d峄g c谩c ph么ng ch峄� PDF 膽瓢峄 nh煤ng.
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = V膬n b岷
+pdfjs-editor-color-picker-free-text-input =
+    .title = Thay 膽峄昳 m脿u ch峄�
+pdfjs-editor-free-text-button-label = V膬n b岷
+pdfjs-editor-ink-button =
+    .title = V岷�
+pdfjs-editor-color-picker-ink-input =
+    .title = Thay 膽峄昳 m脿u v岷�
+pdfjs-editor-ink-button-label = V岷�
+pdfjs-editor-stamp-button =
+    .title = Th锚m ho岷穋 ch峄塶h s峄璦 h矛nh 岷h
+pdfjs-editor-stamp-button-label = Th锚m ho岷穋 ch峄塶h s峄璦 h矛nh 岷h
+pdfjs-editor-highlight-button =
+    .title = 膼谩nh d岷
+pdfjs-editor-highlight-button-label = 膼谩nh d岷
+pdfjs-highlight-floating-button1 =
+    .title = 膼谩nh d岷
+    .aria-label = 膼谩nh d岷
+pdfjs-highlight-floating-button-label = 膼谩nh d岷
+pdfjs-comment-floating-button =
+    .title = Ch煤 th铆ch
+    .aria-label = Ch煤 th铆ch
+pdfjs-comment-floating-button-label = Ch煤 th铆ch
+pdfjs-editor-comment-button =
+    .title = Ch煤 th铆ch
+    .aria-label = Ch煤 th铆ch
+pdfjs-editor-comment-button-label = Ch煤 th铆ch
+pdfjs-editor-signature-button =
+    .title = Th锚m ch峄� k媒
+pdfjs-editor-signature-button-label = Th锚m ch峄� k媒
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = Tr矛nh ch峄塶h s峄璦 膽谩nh d岷
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = Tr矛nh ch峄塶h s峄璦 b岷 v岷�
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = Tr矛nh ch峄塶h s峄璦 ch峄� k媒: { $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = Tr矛nh ch峄塶h s峄璦 h矛nh 岷h
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = X贸a b岷 v岷�
+pdfjs-editor-remove-freetext-button =
+    .title = X贸a v膬n b岷
+pdfjs-editor-remove-stamp-button =
+    .title = X贸a 岷h
+pdfjs-editor-remove-highlight-button =
+    .title = X贸a ph岷 膽谩nh d岷
+pdfjs-editor-remove-signature-button =
+    .title = Xo谩 ch峄� k媒
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = M脿u
+pdfjs-editor-free-text-size-input = K铆ch c峄�
+pdfjs-editor-ink-color-input = M脿u
+pdfjs-editor-ink-thickness-input = 膼峄� d脿y
+pdfjs-editor-ink-opacity-input = 膼么蹋 m啤虁
+pdfjs-editor-stamp-add-image-button =
+    .title = Th锚m h矛nh 岷h
+pdfjs-editor-stamp-add-image-button-label = Th锚m h矛nh 岷h
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 膼峄� d脿y
+pdfjs-editor-free-highlight-thickness-title =
+    .title = Thay 膽峄昳 膽峄� d脿y khi 膽谩nh d岷 c谩c m峄 kh么ng ph岷 l脿 v膬n b岷
+pdfjs-editor-add-signature-container =
+    .aria-label = Ki峄僲 so谩t ch峄� k媒 v脿 ch峄� k媒 膽茫 l瓢u
+pdfjs-editor-signature-add-signature-button =
+    .title = Th锚m ch峄� k媒 m峄沬
+pdfjs-editor-signature-add-signature-button-label = Th锚m ch峄� k媒 m峄沬
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 膼茫 l瓢u ch峄� k媒: { $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = Tr矛nh ch峄塶h s峄璦 v膬n b岷
+    .default-content = B岷痶 膽岷 nh岷璸鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title = Ch煤 th铆ch
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 膼贸ng thanh l峄�
+    .aria-label = 膼贸ng thanh l峄�
+pdfjs-editor-comments-sidebar-close-button-label = 膼贸ng thanh l峄�
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = B岷 th岷 膽i峄乽 g矛 膽谩ng ch煤 媒? H茫y 膽谩nh d岷 v脿 膽峄� l岷 ch煤 th铆ch.
+pdfjs-editor-comments-sidebar-no-comments-link = T矛m hi峄僽 th锚m
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = V膬n b岷 thay th岷�
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = Ch峄塶h s峄璦 v膬n b岷 thay th岷�
+pdfjs-editor-alt-text-dialog-label = Ch峄峮 m峄檛 l峄盿 ch峄峮
+pdfjs-editor-alt-text-dialog-description = V膬n b岷 thay th岷� s岷� h峄痷 铆ch khi m峄峣 ng瓢峄漣 kh么ng th峄� th岷 h矛nh 岷h ho岷穋 khi h矛nh 岷h kh么ng t岷.
+pdfjs-editor-alt-text-add-description-label = Th锚m m峄檛 m么 t岷�
+pdfjs-editor-alt-text-add-description-description = H茫y nh岷痬 t峄沬 1-2 c芒u m么 t岷� ch峄� 膽峄�, b峄慽 c岷h ho岷穋 h脿nh 膽峄檔g.
+pdfjs-editor-alt-text-mark-decorative-label = 膼谩nh d岷 l脿 trang tr铆
+pdfjs-editor-alt-text-mark-decorative-description = 膼i峄乽 n脿y 膽瓢峄 s峄� d峄g cho c谩c h矛nh 岷h trang tr铆, nh瓢 膽瓢峄漬g vi峄乶 ho岷穋 watermark.
+pdfjs-editor-alt-text-cancel-button = H峄 b峄�
+pdfjs-editor-alt-text-save-button = L瓢u
+pdfjs-editor-alt-text-decorative-tooltip = 膼茫 膽谩nh d岷 l脿 trang tr铆
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = V铆 d峄�: 鈥淢峄檛 thanh ni锚n ng峄搃 xu峄憂g b脿n 膽峄� th瓢峄焠g th峄ヽ m峄檛 b峄痑 膬n鈥�
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = V膬n b岷 thay th岷�
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = Tr锚n c霉ng b锚n tr谩i 鈥� thay 膽峄昳 k铆ch th瓢峄沜
+pdfjs-editor-resizer-top-middle =
+    .aria-label = Tr锚n c霉ng 峄� gi峄痑 鈥� thay 膽峄昳 k铆ch th瓢峄沜
+pdfjs-editor-resizer-top-right =
+    .aria-label = Tr锚n c霉ng b锚n ph岷 鈥� thay 膽峄昳 k铆ch th瓢峄沜
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 峄� gi峄痑 b锚n ph岷 鈥� thay 膽峄昳 k铆ch th瓢峄沜
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = D瓢峄沬 c霉ng b锚n ph岷 鈥� thay 膽峄昳 k铆ch th瓢峄沜
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 峄� gi峄痑 d瓢峄沬 c霉ng 鈥� thay 膽峄昳 k铆ch th瓢峄沜
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = G贸c d瓢峄沬 b锚n tr谩i 鈥� thay 膽峄昳 k铆ch th瓢峄沜
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 峄� gi峄痑 b锚n tr谩i 鈥� thay 膽峄昳 k铆ch th瓢峄沜
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = M脿u 膽谩nh d岷
+pdfjs-editor-colorpicker-button =
+    .title = Thay 膽峄昳 m脿u
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = L峄盿 ch峄峮 m脿u s岷痗
+pdfjs-editor-colorpicker-yellow =
+    .title = V脿ng
+pdfjs-editor-colorpicker-green =
+    .title = Xanh l峄
+pdfjs-editor-colorpicker-blue =
+    .title = Xanh d瓢啤ng
+pdfjs-editor-colorpicker-pink =
+    .title = H峄搉g
+pdfjs-editor-colorpicker-red =
+    .title = 膼峄�
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = Hi峄噉 t岷 c岷�
+pdfjs-editor-highlight-show-all-button =
+    .title = Hi峄噉 t岷 c岷�
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = Ch峄塶h s峄璦 v膬n b岷 thay th岷� (m么 t岷� h矛nh 岷h)
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = Th锚m v膬n b岷 thay th岷� (m么 t岷� h矛nh 岷h)
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = Vi岷縯 m么 t岷� c峄 b岷 峄� 膽芒y鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = M么 t岷� ng岷痭 g峄峮 d脿nh cho ng瓢峄漣 kh么ng xem 膽瓢峄 岷h ho岷穋 khi kh么ng th峄� t岷 岷h.
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = V膬n b岷 thay th岷� n脿y 膽瓢峄 t岷 t峄� 膽峄檔g v脿 c贸 th峄� kh么ng ch铆nh x谩c.
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = T矛m hi峄僽 th锚m
+pdfjs-editor-new-alt-text-create-automatically-button-label = T岷 v膬n b岷 thay th岷� t峄� 膽峄檔g
+pdfjs-editor-new-alt-text-not-now-button = Kh么ng ph岷 b芒y gi峄�
+pdfjs-editor-new-alt-text-error-title = Kh么ng th峄� t岷 t峄� 膽峄檔g v膬n b岷 thay th岷�
+pdfjs-editor-new-alt-text-error-description = Vui l貌ng vi岷縯 v膬n b岷 thay th岷� c峄 ri锚ng b岷 ho岷穋 th峄� l岷 sau.
+pdfjs-editor-new-alt-text-error-close-button = 膼贸ng
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 膼ang t岷 xu峄憂g m么 h矛nh AI v膬n b岷 thay th岷� ({ $downloadedSize } / { $totalSize } MB)
+    .aria-valuetext = 膼ang t岷 xu峄憂g m么 h矛nh AI v膬n b岷 thay th岷� ({ $downloadedSize } / { $totalSize } MB)
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 膼茫 th锚m v膬n b岷 thay th岷�
+pdfjs-editor-new-alt-text-added-button-label = 膼茫 th锚m v膬n b岷 thay th岷�
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = Thi岷縰 v膬n b岷 thay th岷�
+pdfjs-editor-new-alt-text-missing-button-label = Thi岷縰 v膬n b岷 thay th岷�
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = Xem l岷 v膬n b岷 thay th岷�
+pdfjs-editor-new-alt-text-to-review-button-label = Xem l岷 v膬n b岷 thay th岷�
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 膼瓢峄 t岷 t峄� 膽峄檔g: { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = C脿i 膽岷穞 v膬n b岷 thay th岷� c峄 h矛nh 岷h
+pdfjs-image-alt-text-settings-button-label = C脿i 膽岷穞 v膬n b岷 thay th岷� c峄 h矛nh 岷h
+pdfjs-editor-alt-text-settings-dialog-label = C脿i 膽岷穞 v膬n b岷 thay th岷� c峄 h矛nh 岷h
+pdfjs-editor-alt-text-settings-automatic-title = V膬n b岷 thay th岷� t峄� 膽峄檔g
+pdfjs-editor-alt-text-settings-create-model-button-label = T岷 v膬n b岷 thay th岷� t峄� 膽峄檔g
+pdfjs-editor-alt-text-settings-create-model-description = 膼峄� xu岷 m么 t岷� gi煤p 铆ch cho nh峄痭g ng瓢峄漣 kh么ng xem 膽瓢峄 岷h ho岷穋 khi kh么ng th峄� t岷 岷h.
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = M么 h矛nh AI v膬n b岷 kh谩c ({ $totalSize } MB)
+pdfjs-editor-alt-text-settings-ai-model-description = Ch岷 c峄 b峄� tr锚n thi岷縯 b峄� c峄 b岷 膽峄� d峄� li峄噓 c峄 b岷 lu么n 峄� ch岷� 膽峄� ri锚ng t瓢. B岷痶 bu峄檆 膽峄慽 v峄沬 v膬n b岷 thay th岷� t峄� 膽峄檔g.
+pdfjs-editor-alt-text-settings-delete-model-button = X贸a
+pdfjs-editor-alt-text-settings-download-model-button = T岷 xu峄憂g
+pdfjs-editor-alt-text-settings-downloading-model-button = 膼ang t岷 xu峄憂g鈥�
+pdfjs-editor-alt-text-settings-editor-title = Tr矛nh so岷 th岷 v膬n b岷 thay th岷�
+pdfjs-editor-alt-text-settings-show-dialog-button-label = Hi峄僴 th峄� ngay tr矛nh so岷 th岷 v膬n b岷 thay th岷� khi th锚m h矛nh 岷h
+pdfjs-editor-alt-text-settings-show-dialog-description = Gi煤p b岷 膽岷 b岷 t岷 c岷� h矛nh 岷h c峄 b岷 膽峄乽 c贸 v膬n b岷 thay th岷�.
+pdfjs-editor-alt-text-settings-close-button = 膼贸ng
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 膼茫 th锚m t么 s谩ng
+pdfjs-editor-freetext-added-alert = 膼茫 th锚m ch峄�
+pdfjs-editor-ink-added-alert = 膼茫 th锚m b岷 v岷�
+pdfjs-editor-stamp-added-alert = 膼茫 th锚m 岷h
+pdfjs-editor-signature-added-alert = 膼茫 th锚m ch峄� k媒
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 膼茫 x贸a 膽谩nh d岷
+pdfjs-editor-undo-bar-message-freetext = 膼茫 x贸a v膬n b岷
+pdfjs-editor-undo-bar-message-ink = 膼茫 x贸a b岷 v岷�
+pdfjs-editor-undo-bar-message-stamp = 膼茫 x贸a h矛nh 岷h
+pdfjs-editor-undo-bar-message-signature = Ch峄� k媒 膽茫 b峄� xo谩
+pdfjs-editor-undo-bar-message-comment = 膼茫 xo谩 ch煤 th铆ch
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple = { $count } ch煤 th铆ch 膽茫 b峄� x贸a
+pdfjs-editor-undo-bar-undo-button =
+    .title = Ho脿n t谩c
+pdfjs-editor-undo-bar-undo-button-label = Ho脿n t谩c
+pdfjs-editor-undo-bar-close-button =
+    .title = 膼贸ng
+pdfjs-editor-undo-bar-close-button-label = 膼贸ng
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = Ph瓢啤ng th峄ヽ n脿y cho ph茅p ng瓢峄漣 d霉ng t岷 m峄檛 ch峄� k媒 膽峄� th锚m v脿o t脿i li峄噓 PDF. Ng瓢峄漣 d霉ng c贸 th峄� ch峄塶h s峄璦 t锚n (c农ng 膽贸ng vai tr貌 l脿 v膬n b岷 thay th岷�) v脿 t霉y ch峄峮 l瓢u ch峄� k媒 膽峄� s峄� d峄g nhi峄乽 l岷.
+pdfjs-editor-add-signature-dialog-title = Th锚m ch峄� k媒
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 膼谩nh v膬n b岷
+    .title = 膼谩nh v膬n b岷
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = V岷�
+    .title = V岷�
+pdfjs-editor-add-signature-image-button = H矛nh 岷h
+    .title = H矛nh 岷h
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = Nh岷璸 ch峄� k媒 c峄 b岷
+    .placeholder = Nh岷璸 ch峄� k媒 c峄 b岷
+pdfjs-editor-add-signature-draw-placeholder = V岷� ch峄� k媒 c峄 b岷
+pdfjs-editor-add-signature-draw-thickness-range-label = 膼峄� d脿y
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 膼峄� d脿y b煤t v岷�: { $thickness }
+pdfjs-editor-add-signature-image-placeholder = K茅o m峄檛 t岷璸 tin t岷 膽芒y 膽峄� t岷 l锚n
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] Ho岷穋 ch峄峮 h矛nh 岷h
+       *[other] Ho岷穋 ch峄峮 h矛nh 岷h
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = M么 t岷� (v膬n b岷 thay th岷�)
+pdfjs-editor-add-signature-description-input =
+    .title = M么 t岷� (v膬n b岷 thay th岷�)
+pdfjs-editor-add-signature-description-default-when-drawing = Ch峄� k媒
+pdfjs-editor-add-signature-clear-button-label = Xo谩 ch峄� k媒
+pdfjs-editor-add-signature-clear-button =
+    .title = Xo谩 ch峄� k媒
+pdfjs-editor-add-signature-save-checkbox = L瓢u ch峄� k媒
+pdfjs-editor-add-signature-save-warning-message = B岷 膽茫 膽岷 膽岷縩 gi峄沬 h岷 5 ch峄� k媒 膽茫 l瓢u. H茫y x贸a m峄檛 c谩i 膽峄� l瓢u th锚m.
+pdfjs-editor-add-signature-image-upload-error-title = Kh么ng th峄� t岷 l锚n h矛nh 岷h
+pdfjs-editor-add-signature-image-upload-error-description = Ki峄僲 tra k岷縯 n峄慽 m岷g c峄 b岷 ho岷穋 th峄� h矛nh 岷h kh谩c.
+pdfjs-editor-add-signature-image-no-data-error-title = Kh么ng th峄� chuy峄僴 膽峄昳 h矛nh 岷h n脿y th脿nh ch峄� k媒
+pdfjs-editor-add-signature-image-no-data-error-description = Vui l貌ng th峄� t岷 l锚n m峄檛 h矛nh 岷h kh谩c.
+pdfjs-editor-add-signature-error-close-button = 膼贸ng
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = H峄 b峄�
+pdfjs-editor-add-signature-add-button = Th锚m
+pdfjs-editor-edit-signature-update-button = C岷璸 nh岷璽
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = Ch峄塶h s峄璦 ch煤 th铆ch
+pdfjs-editor-edit-comment-popup-button =
+    .title = Ch峄塶h s峄璦 ch煤 th铆ch
+pdfjs-editor-delete-comment-popup-button-label = Xo谩 ch煤 th铆ch
+pdfjs-editor-delete-comment-popup-button =
+    .title = Xo谩 ch煤 th铆ch
+pdfjs-show-comment-button =
+    .title = Hi峄僴 th峄� ch煤 th铆ch
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = Ch峄塶h s峄璦 ch煤 th铆ch
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = C岷璸 nh岷璽
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = Th锚m ch煤 th铆ch
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = Th锚m
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = B岷痶 膽岷 nh岷璸鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = H峄 b峄�
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = Th锚m ch煤 th铆ch
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = B岷璽 t岷痶 thanh l峄� (t脿i li峄噓 bao g峄搈 h矛nh thu nh峄�/ph谩c th岷/t岷璸 tin 膽铆nh k猫m/l峄沺)
+pdfjs-toggle-views-manager-button1-label = Qu岷 l媒 trang
+pdfjs-views-manager-sidebar =
+    .aria-label = Thanh l峄�
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = C么ng c峄� 膽i峄乽 ch峄塶h k铆ch th瓢峄沜 thanh l峄�
+pdfjs-views-manager-view-selector-button =
+    .title = Ch岷� 膽峄� hi峄僴 th峄�
+pdfjs-views-manager-view-selector-button-label = Ch岷� 膽峄� hi峄僴 th峄�
+pdfjs-views-manager-pages-title = Trang
+pdfjs-views-manager-outlines-title1 = B岷 ph谩c th岷 t脿i li峄噓
+    .title = B岷 ph谩c th岷 t脿i li峄噓 (nh岷 膽煤p chu峄檛 膽峄� m峄� r峄檔g/thu g峄峮 t岷 c岷� c谩c m峄)
+pdfjs-views-manager-attachments-title = 膼铆nh k猫m
+pdfjs-views-manager-layers-title1 = L峄沺
+    .title = L峄沺 (nh岷 膽煤p chu峄檛 膽峄� 膽岷穞 l岷 t岷 c岷� c谩c l峄沺 v峄� tr岷g th谩i m岷穋 膽峄媙h.)
+pdfjs-views-manager-pages-option-label = Trang
+pdfjs-views-manager-outlines-option-label = B岷 ph谩c th岷 t脿i li峄噓
+pdfjs-views-manager-attachments-option-label = 膼铆nh k猫m
+pdfjs-views-manager-layers-option-label = L峄沺
+pdfjs-views-manager-add-file-button =
+    .title = Th锚m t岷璸 tin
+pdfjs-views-manager-add-file-button-label = Th锚m t岷璸 tin
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label = { $count } 膽茫 ch峄峮
+pdfjs-views-manager-pages-status-none-action-label = Ch峄峮 trang
+pdfjs-views-manager-pages-status-action-button-label = Qu岷 l媒
+pdfjs-views-manager-pages-status-copy-button-label = Sao ch茅p
+pdfjs-views-manager-pages-status-cut-button-label = C岷痶
+pdfjs-views-manager-pages-status-delete-button-label = D谩n
+pdfjs-views-manager-pages-status-export-selected-button-label = Xu岷 c谩c m峄 膽茫 ch峄峮鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label = 膼茫 c岷痶 { $count } trang
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label = 膼茫 sao ch茅p { $count } trang
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label = 膼茫 xo谩 { $count } trang
+pdfjs-views-manager-pages-status-waiting-ready-label = 膼ang chu岷﹏ b峄� t岷璸 tin c峄 b岷鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 膼ang t岷 l锚n t岷璸 tin鈥�
+pdfjs-views-manager-status-warning-cut-label = Kh么ng th峄� c岷痶. Vui l貌ng l脿m m峄沬 trang v脿 th峄� l岷.
+pdfjs-views-manager-status-warning-copy-label = Kh么ng th峄� sao ch茅p. Vui l貌ng l脿m m峄沬 trang v脿 th峄� l岷.
+pdfjs-views-manager-status-warning-delete-label = Kh么ng th峄� xo谩. Vui l貌ng l脿m m峄沬 trang v脿 th峄� l岷.
+pdfjs-views-manager-status-warning-save-label = Kh么ng th峄� l瓢u. Vui l貌ng l脿m m峄沬 trang v脿 th峄� l岷.
+pdfjs-views-manager-status-undo-button-label = Ho脿n t谩c
+pdfjs-views-manager-status-done-button-label = Xong
+pdfjs-views-manager-status-close-button =
+    .title = 膼贸ng
+pdfjs-views-manager-status-close-button-label = 膼贸ng
+pdfjs-views-manager-paste-button-label = D谩n
+pdfjs-views-manager-paste-button-before =
+    .title = D谩n tr瓢峄沜 trang 膽岷
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = D谩n sau trang { $page }
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = M峄欼
+pdfjs-views-manager-waiting-for-file = 膼ang t岷 l锚n t岷璸 tin鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = Qu岷 l媒 trang
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = Xo谩 ch峄� k媒 膽茫 l瓢u
+pdfjs-editor-delete-signature-button-label1 = Xo谩 ch峄� k媒 膽茫 l瓢u
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = Ch峄塶h s峄璦 m么 t岷�
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = Ch峄塶h s峄璦 m么 t岷�
diff --git a/public/pdfjs/web/locale/wo/viewer.ftl b/public/pdfjs/web/locale/wo/viewer.ftl
new file mode 100644
index 0000000..22c6a3f
--- /dev/null
+++ b/public/pdfjs/web/locale/wo/viewer.ftl
@@ -0,0 +1,100 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = X毛t wi jiitu
+pdfjs-previous-button-label = Bi jiitu
+pdfjs-next-button =
+    .title = X毛t wi ci topp
+pdfjs-next-button-label = Bi ci topp
+pdfjs-zoom-out-button =
+    .title = W脿帽帽i
+pdfjs-zoom-out-button-label = W脿帽帽i
+pdfjs-zoom-in-button =
+    .title = Yaatal
+pdfjs-zoom-in-button-label = Yaatal
+pdfjs-zoom-select =
+    .title = Yambala艐
+pdfjs-presentation-mode-button =
+    .title = Wa帽ar帽il ci anamu wone
+pdfjs-presentation-mode-button-label = Anamu Wone
+pdfjs-open-file-button =
+    .title = Ubbi benn dencukaay
+pdfjs-open-file-button-label = Ubbi
+pdfjs-print-button =
+    .title = M贸ol
+pdfjs-print-button-label = M贸ol
+
+## Document properties dialog
+
+pdfjs-document-properties-title = Bopp:
+
+## Print
+
+pdfjs-printing-not-supported = Artu: Joowkat bii nanguwul lool mool.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-thumbs-button =
+    .title = Wone nataal yu ndaw yi
+pdfjs-thumbs-button-label = Nataal yu ndaw yi
+pdfjs-findbar-button =
+    .title = Gis ci biir jukki bi
+pdfjs-findbar-button-label = Wut
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = X毛t { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Wi帽et bu x毛t { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-previous-button =
+    .title = Seet beneen kaddu bu ni mel te jiitu
+pdfjs-find-previous-button-label = Bi jiitu
+pdfjs-find-next-button =
+    .title = Seet beneen kaddu bu ni mel
+pdfjs-find-next-button-label = Bi ci topp
+pdfjs-find-highlight-checkbox = Melaxal l茅pp
+pdfjs-find-match-case-checkbox-label = S脿mm j毛mmalin wi
+pdfjs-find-reached-top = Jot na帽u ndorteel x毛t wi, kontine dale ko ci suuf
+pdfjs-find-reached-bottom = Jot na帽u jeexitalu x毛t wi, kontine ci ndorte
+pdfjs-find-not-found = Gisi帽u kaddu gi
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Yaatuwaay bu m毛t
+pdfjs-page-scale-fit = X毛t l毛mm
+pdfjs-page-scale-auto = Yambala艐 ci saa si
+pdfjs-page-scale-actual = Dayo bi am
+
+## Loading indicator messages
+
+pdfjs-loading-error = Am na njumte ci yebum dencukaay PDF bi.
+pdfjs-invalid-file-error = Dencukaay PDF bi baaxul walla mu sankar.
+pdfjs-rendering-error = Am njumte bu am bi x毛t bi di wonewu.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [Karmat { $type }]
+
+## Password
+
+pdfjs-password-ok-button = OK
+pdfjs-password-cancel-button = Neenal
diff --git a/public/pdfjs/web/locale/xh/viewer.ftl b/public/pdfjs/web/locale/xh/viewer.ftl
new file mode 100644
index 0000000..a55157a
--- /dev/null
+++ b/public/pdfjs/web/locale/xh/viewer.ftl
@@ -0,0 +1,179 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = Iphepha langaphambili
+pdfjs-previous-button-label = Okwangaphambili
+pdfjs-next-button =
+    .title = Iphepha elilandelayo
+pdfjs-next-button-label = Okulandelayo
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = Iphepha
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = kwali- { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } kwali { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = Bhekelisela Kudana
+pdfjs-zoom-out-button-label = Bhekelisela Kudana
+pdfjs-zoom-in-button =
+    .title = Sondeza Kufuphi
+pdfjs-zoom-in-button-label = Sondeza Kufuphi
+pdfjs-zoom-select =
+    .title = Yandisa / Nciphisa
+pdfjs-presentation-mode-button =
+    .title = Tshintshela kwimo yonikezelo
+pdfjs-presentation-mode-button-label = Imo yonikezelo
+pdfjs-open-file-button =
+    .title = Vula Ifayile
+pdfjs-open-file-button-label = Vula
+pdfjs-print-button =
+    .title = Printa
+pdfjs-print-button-label = Printa
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = Izixhobo zemiyalelo
+pdfjs-tools-button-label = Izixhobo zemiyalelo
+pdfjs-first-page-button =
+    .title = Yiya kwiphepha lokuqala
+pdfjs-first-page-button-label = Yiya kwiphepha lokuqala
+pdfjs-last-page-button =
+    .title = Yiya kwiphepha lokugqibela
+pdfjs-last-page-button-label = Yiya kwiphepha lokugqibela
+pdfjs-page-rotate-cw-button =
+    .title = Jikelisa ngasekunene
+pdfjs-page-rotate-cw-button-label = Jikelisa ngasekunene
+pdfjs-page-rotate-ccw-button =
+    .title = Jikelisa ngasekhohlo
+pdfjs-page-rotate-ccw-button-label = Jikelisa ngasekhohlo
+pdfjs-cursor-text-select-tool-button =
+    .title = Vumela iSixhobo sokuKhetha iTeksti
+pdfjs-cursor-text-select-tool-button-label = ISixhobo sokuKhetha iTeksti
+pdfjs-cursor-hand-tool-button =
+    .title = Yenza iSixhobo seSandla siSebenze
+pdfjs-cursor-hand-tool-button-label = ISixhobo seSandla
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = Iipropati zoxwebhu鈥�
+pdfjs-document-properties-button-label = Iipropati zoxwebhu鈥�
+pdfjs-document-properties-file-name = Igama lefayile:
+pdfjs-document-properties-file-size = Isayizi yefayile:
+pdfjs-document-properties-title = Umxholo:
+pdfjs-document-properties-author = Umbhali:
+pdfjs-document-properties-subject = Umbandela:
+pdfjs-document-properties-keywords = Amagama aphambili:
+pdfjs-document-properties-creation-date = Umhla wokwenziwa kwayo:
+pdfjs-document-properties-modification-date = Umhla wokulungiswa kwayo:
+pdfjs-document-properties-creator = Umntu oyenzileyo:
+pdfjs-document-properties-producer = Umvelisi we-PDF:
+pdfjs-document-properties-version = Uhlelo lwe-PDF:
+pdfjs-document-properties-page-count = Inani lamaphepha:
+
+##
+
+pdfjs-document-properties-close-button = Vala
+
+## Print
+
+pdfjs-print-progress-message = Ilungisa uxwebhu ukuze iprinte鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = Rhoxisa
+pdfjs-printing-not-supported = Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza.
+pdfjs-printing-not-ready = Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta.
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = Togola ngebha eseCaleni
+pdfjs-toggle-sidebar-button-label = Togola ngebha eseCaleni
+pdfjs-document-outline-button =
+    .title = Bonisa uLwandlalo loXwebhu (cofa kabini ukuze wandise/diliza zonke izinto)
+pdfjs-document-outline-button-label = Isishwankathelo soxwebhu
+pdfjs-attachments-button =
+    .title = Bonisa iziqhotyoshelwa
+pdfjs-attachments-button-label = Iziqhoboshelo
+pdfjs-thumbs-button =
+    .title = Bonisa ukrobiso kumfanekiso
+pdfjs-thumbs-button-label = Ukrobiso kumfanekiso
+pdfjs-findbar-button =
+    .title = Fumana kuXwebhu
+pdfjs-findbar-button-label = Fumana
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = Iphepha { $page }
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = Ukrobiso kumfanekiso wephepha { $page }
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = Fumana
+    .placeholder = Fumana kuXwebhu鈥�
+pdfjs-find-previous-button =
+    .title = Fumanisa isenzeko sangaphambili sebinzana lamagama
+pdfjs-find-previous-button-label = Okwangaphambili
+pdfjs-find-next-button =
+    .title = Fumanisa isenzeko esilandelayo sebinzana lamagama
+pdfjs-find-next-button-label = Okulandelayo
+pdfjs-find-highlight-checkbox = Qaqambisa konke
+pdfjs-find-match-case-checkbox-label = Tshatisa ngobukhulu bukanobumba
+pdfjs-find-reached-top = Ufike ngaphezulu ephepheni, kusukwa ngezantsi
+pdfjs-find-reached-bottom = Ufike ekupheleni kwephepha, kusukwa ngaphezulu
+pdfjs-find-not-found = Ibinzana alifunyenwanga
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = Ububanzi bephepha
+pdfjs-page-scale-fit = Ukulinganiswa kwephepha
+pdfjs-page-scale-auto = Ukwandisa/Ukunciphisa Ngokwayo
+pdfjs-page-scale-actual = Ubungakanani bokwenene
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## Loading indicator messages
+
+pdfjs-loading-error = Imposiso yenzekile xa kulayishwa i-PDF.
+pdfjs-invalid-file-error = Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.
+pdfjs-missing-file-error = Ifayile ye-PDF edukileyo.
+pdfjs-unexpected-response-error = Impendulo yeseva engalindelekanga.
+pdfjs-rendering-error = Imposiso yenzekile xa bekunikezelwa iphepha.
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } Ubhalo-nqaku]
+
+## Password
+
+pdfjs-password-label = Faka ipasiwedi ukuze uvule le fayile yePDF.
+pdfjs-password-invalid = Ipasiwedi ayisebenzi. Nceda uzame kwakhona.
+pdfjs-password-ok-button = KULUNGILE
+pdfjs-password-cancel-button = Rhoxisa
+pdfjs-web-fonts-disabled = Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo.
diff --git a/public/pdfjs/web/locale/zh-CN/viewer.ftl b/public/pdfjs/web/locale/zh-CN/viewer.ftl
new file mode 100644
index 0000000..05734fd
--- /dev/null
+++ b/public/pdfjs/web/locale/zh-CN/viewer.ftl
@@ -0,0 +1,715 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 涓婁竴椤�
+pdfjs-previous-button-label = 涓婁竴椤�
+pdfjs-next-button =
+    .title = 涓嬩竴椤�
+pdfjs-next-button-label = 涓嬩竴椤�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 椤甸潰
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = / { $pagesCount }
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount })
+pdfjs-zoom-out-button =
+    .title = 缂╁皬
+pdfjs-zoom-out-button-label = 缂╁皬
+pdfjs-zoom-in-button =
+    .title = 鏀惧ぇ
+pdfjs-zoom-in-button-label = 鏀惧ぇ
+pdfjs-zoom-select =
+    .title = 缂╂斁
+pdfjs-presentation-mode-button =
+    .title = 鍒囨崲鍒版紨绀烘ā寮�
+pdfjs-presentation-mode-button-label = 婕旂ず妯″紡
+pdfjs-open-file-button =
+    .title = 鎵撳紑鏂囦欢
+pdfjs-open-file-button-label = 鎵撳紑
+pdfjs-print-button =
+    .title = 鎵撳嵃
+pdfjs-print-button-label = 鎵撳嵃
+pdfjs-save-button =
+    .title = 淇濆瓨
+pdfjs-save-button-label = 淇濆瓨
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 涓嬭浇
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 涓嬭浇
+pdfjs-bookmark-button =
+    .title = 褰撳墠椤甸潰锛堝湪褰撳墠椤甸潰鏌ョ湅 URL锛�
+pdfjs-bookmark-button-label = 褰撳墠椤甸潰
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 宸ュ叿
+pdfjs-tools-button-label = 宸ュ叿
+pdfjs-first-page-button =
+    .title = 杞埌绗竴椤�
+pdfjs-first-page-button-label = 杞埌绗竴椤�
+pdfjs-last-page-button =
+    .title = 杞埌鏈�鍚庝竴椤�
+pdfjs-last-page-button-label = 杞埌鏈�鍚庝竴椤�
+pdfjs-page-rotate-cw-button =
+    .title = 椤烘椂閽堟棆杞�
+pdfjs-page-rotate-cw-button-label = 椤烘椂閽堟棆杞�
+pdfjs-page-rotate-ccw-button =
+    .title = 閫嗘椂閽堟棆杞�
+pdfjs-page-rotate-ccw-button-label = 閫嗘椂閽堟棆杞�
+pdfjs-cursor-text-select-tool-button =
+    .title = 鍚敤鏂囨湰閫夋嫨宸ュ叿
+pdfjs-cursor-text-select-tool-button-label = 鏂囨湰閫夋嫨宸ュ叿
+pdfjs-cursor-hand-tool-button =
+    .title = 鍚敤鎵嬪舰宸ュ叿
+pdfjs-cursor-hand-tool-button-label = 鎵嬪舰宸ュ叿
+pdfjs-scroll-page-button =
+    .title = 浣跨敤椤甸潰婊氬姩
+pdfjs-scroll-page-button-label = 椤甸潰婊氬姩
+pdfjs-scroll-vertical-button =
+    .title = 浣跨敤鍨傜洿婊氬姩
+pdfjs-scroll-vertical-button-label = 鍨傜洿婊氬姩
+pdfjs-scroll-horizontal-button =
+    .title = 浣跨敤姘村钩婊氬姩
+pdfjs-scroll-horizontal-button-label = 姘村钩婊氬姩
+pdfjs-scroll-wrapped-button =
+    .title = 浣跨敤骞抽摵婊氬姩
+pdfjs-scroll-wrapped-button-label = 骞抽摵婊氬姩
+pdfjs-spread-none-button =
+    .title = 涓嶅姞鍏ヨ鎺ラ〉
+pdfjs-spread-none-button-label = 鍗曢〉瑙嗗浘
+pdfjs-spread-odd-button =
+    .title = 鍔犲叆琛旀帴椤典娇濂囨暟椤典綔涓鸿捣濮嬮〉
+pdfjs-spread-odd-button-label = 鍙岄〉瑙嗗浘
+pdfjs-spread-even-button =
+    .title = 鍔犲叆琛旀帴椤典娇鍋舵暟椤典綔涓鸿捣濮嬮〉
+pdfjs-spread-even-button-label = 涔︾睄瑙嗗浘
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 鏂囨。灞炴�р��
+pdfjs-document-properties-button-label = 鏂囨。灞炴�р��
+pdfjs-document-properties-file-name = 鏂囦欢鍚�:
+pdfjs-document-properties-file-size = 鏂囦欢澶у皬:
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB锛坽 $b } 瀛楄妭锛�
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB锛坽 $b } 瀛楄妭锛�
+pdfjs-document-properties-title = 鏍囬:
+pdfjs-document-properties-author = 浣滆��:
+pdfjs-document-properties-subject = 涓婚:
+pdfjs-document-properties-keywords = 鍏抽敭璇�:
+pdfjs-document-properties-creation-date = 鍒涘缓鏃ユ湡:
+pdfjs-document-properties-modification-date = 淇敼鏃ユ湡:
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 鍒涘缓鑰�:
+pdfjs-document-properties-producer = PDF 鐢熸垚鍣細
+pdfjs-document-properties-version = PDF 鐗堟湰:
+pdfjs-document-properties-page-count = 椤垫暟:
+pdfjs-document-properties-page-size = 椤甸潰澶у皬锛�
+pdfjs-document-properties-page-size-unit-inches = 鑻卞
+pdfjs-document-properties-page-size-unit-millimeters = 姣背
+pdfjs-document-properties-page-size-orientation-portrait = 绾靛悜
+pdfjs-document-properties-page-size-orientation-landscape = 妯悜
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit }锛坽 $orientation }锛�
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit }锛坽 $name }锛寋 $orientation }锛�
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 蹇�� Web 瑙嗗浘锛�
+pdfjs-document-properties-linearized-yes = 鏄�
+pdfjs-document-properties-linearized-no = 鍚�
+pdfjs-document-properties-close-button = 鍏抽棴
+
+## Print
+
+pdfjs-print-progress-message = 姝e湪鍑嗗鎵撳嵃鏂囨。鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 鍙栨秷
+pdfjs-printing-not-supported = 璀﹀憡锛氭娴忚鍣ㄥ皻鏈畬鏁存敮鎸佹墦鍗板姛鑳姐��
+pdfjs-printing-not-ready = 璀﹀憡锛氭 PDF 鏈畬鎴愬姞杞斤紝鏃犳硶鎵撳嵃銆�
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 鎵撳紑/鍏抽棴渚ф爮
+pdfjs-toggle-sidebar-notification-button =
+    .title = 鎵撳紑/鍏抽棴渚ф爮锛堟枃妗f墍鍚殑澶х翰/闄勪欢/鍥惧眰锛�
+pdfjs-toggle-sidebar-button-label = 鎵撳紑/鍏抽棴渚ф爮
+pdfjs-document-outline-button =
+    .title = 鏄剧ず鏂囨。澶х翰锛堝弻鍑诲睍寮�/鎶樺彔鎵�鏈夐」锛�
+pdfjs-document-outline-button-label = 鏂囨。澶х翰
+pdfjs-attachments-button =
+    .title = 鏄剧ず闄勪欢
+pdfjs-attachments-button-label = 闄勪欢
+pdfjs-layers-button =
+    .title = 鏄剧ず鍥惧眰锛堝弻鍑诲嵆鍙皢鎵�鏈夊浘灞傞噸缃负榛樿鐘舵�侊級
+pdfjs-layers-button-label = 鍥惧眰
+pdfjs-thumbs-button =
+    .title = 鏄剧ず缂╃暐鍥�
+pdfjs-thumbs-button-label = 缂╃暐鍥�
+pdfjs-current-outline-item-button =
+    .title = 鏌ユ壘褰撳墠澶х翰椤圭洰
+pdfjs-current-outline-item-button-label = 褰撳墠澶х翰椤圭洰
+pdfjs-findbar-button =
+    .title = 鍦ㄦ枃妗d腑鏌ユ壘
+pdfjs-findbar-button-label = 鏌ユ壘
+pdfjs-additional-layers = 鍏朵粬鍥惧眰
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 绗� { $page } 椤�
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 椤甸潰 { $page } 鐨勭缉鐣ュ浘
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 閫夋嫨绗� { $page } 椤�
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 绗� { $page } / { $total } 椤�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 鏌ユ壘
+    .placeholder = 鍦ㄦ枃妗d腑鏌ユ壘鈥�
+pdfjs-find-previous-button =
+    .title = 鏌ユ壘璇嶈涓婁竴娆″嚭鐜扮殑浣嶇疆
+pdfjs-find-previous-button-label = 涓婁竴椤�
+pdfjs-find-next-button =
+    .title = 鏌ユ壘璇嶈鍚庝竴娆″嚭鐜扮殑浣嶇疆
+pdfjs-find-next-button-label = 涓嬩竴椤�
+pdfjs-find-highlight-checkbox = 鍏ㄩ儴楂樹寒鏄剧ず
+pdfjs-find-match-case-checkbox-label = 鍖哄垎澶у皬鍐�
+pdfjs-find-match-diacritics-checkbox-label = 鍖归厤鍙橀煶绗﹀彿
+pdfjs-find-entire-word-checkbox-label = 鍏ㄨ瘝鍖归厤
+pdfjs-find-reached-top = 鍒拌揪鏂囨。寮�澶达紝浠庢湯灏剧户缁�
+pdfjs-find-reached-bottom = 鍒拌揪鏂囨。鏈熬锛屼粠寮�澶寸户缁�
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count = 绗� { $current } 椤癸紝鍏辨壘鍒� { $total } 涓尮閰嶉」
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit = 鍖归厤瓒呰繃 { $limit } 椤�
+pdfjs-find-not-found = 鎵句笉鍒版寚瀹氳瘝璇�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 閫傚悎椤靛
+pdfjs-page-scale-fit = 閫傚悎椤甸潰
+pdfjs-page-scale-auto = 鑷姩缂╂斁
+pdfjs-page-scale-actual = 瀹為檯澶у皬
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 绗� { $page } 椤�
+
+## Loading indicator messages
+
+pdfjs-loading-error = 鍔犺浇 PDF 鏃跺彂鐢熼敊璇��
+pdfjs-invalid-file-error = 鏃犳晥鎴栨崯鍧忕殑 PDF 鏂囦欢銆�
+pdfjs-missing-file-error = 缂哄皯 PDF 鏂囦欢銆�
+pdfjs-unexpected-response-error = 鎰忓鐨勬湇鍔″櫒鍝嶅簲銆�
+pdfjs-rendering-error = 娓叉煋椤甸潰鏃跺彂鐢熼敊璇��
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 娉ㄩ噴]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 杈撳叆瀵嗙爜浠ユ墦寮�姝� PDF 鏂囦欢銆�
+pdfjs-password-invalid = 瀵嗙爜鏃犳晥銆傝閲嶈瘯銆�
+pdfjs-password-ok-button = 纭畾
+pdfjs-password-cancel-button = 鍙栨秷
+pdfjs-web-fonts-disabled = Web 瀛椾綋宸茶绂佺敤锛氭棤娉曚娇鐢ㄥ祵鍏ョ殑 PDF 瀛椾綋銆�
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 鏂囨湰
+pdfjs-editor-color-picker-free-text-input =
+    .title = 鏇存敼鏂囨湰棰滆壊
+pdfjs-editor-free-text-button-label = 鏂囨湰
+pdfjs-editor-ink-button =
+    .title = 缁樺浘
+pdfjs-editor-color-picker-ink-input =
+    .title = 鏇存敼缁樺浘棰滆壊
+pdfjs-editor-ink-button-label = 缁樺浘
+pdfjs-editor-stamp-button =
+    .title = 娣诲姞鎴栫紪杈戝浘鍍�
+pdfjs-editor-stamp-button-label = 娣诲姞鎴栫紪杈戝浘鍍�
+pdfjs-editor-highlight-button =
+    .title = 楂樹寒
+pdfjs-editor-highlight-button-label = 楂樹寒
+pdfjs-highlight-floating-button1 =
+    .title = 楂樹寒
+    .aria-label = 楂樹寒
+pdfjs-highlight-floating-button-label = 楂樹寒
+pdfjs-comment-floating-button =
+    .title = 鎵规敞
+    .aria-label = 鎵规敞
+pdfjs-comment-floating-button-label = 鎵规敞
+pdfjs-editor-comment-button =
+    .title = 鎵规敞
+    .aria-label = 鎵规敞
+pdfjs-editor-comment-button-label = 鎵规敞
+pdfjs-editor-signature-button =
+    .title = 娣诲姞绛惧悕
+pdfjs-editor-signature-button-label = 娣诲姞绛惧悕
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 楂樹寒缂栬緫鍣�
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 缁樺浘缂栬緫鍣�
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 绛惧悕缂栬緫鍣細{ $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 鍥惧儚缂栬緫鍣�
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 绉婚櫎缁樺浘
+pdfjs-editor-remove-freetext-button =
+    .title = 绉婚櫎鏂囨湰
+pdfjs-editor-remove-stamp-button =
+    .title = 绉婚櫎鍥惧儚
+pdfjs-editor-remove-highlight-button =
+    .title = 绉婚櫎楂樹寒
+pdfjs-editor-remove-signature-button =
+    .title = 绉婚櫎绛惧悕
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 棰滆壊
+pdfjs-editor-free-text-size-input = 瀛楀彿
+pdfjs-editor-ink-color-input = 棰滆壊
+pdfjs-editor-ink-thickness-input = 绮楃粏
+pdfjs-editor-ink-opacity-input = 涓嶉�忔槑搴�
+pdfjs-editor-stamp-add-image-button =
+    .title = 娣诲姞鍥惧儚
+pdfjs-editor-stamp-add-image-button-label = 娣诲姞鍥惧儚
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 绮楃粏
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 鏇存敼楂樹寒绮楃粏锛堢敤浜庢枃鏈互澶栭」鐩級
+pdfjs-editor-add-signature-container =
+    .aria-label = 绛惧悕绠$悊鍜屼繚瀛樼殑绛惧悕
+pdfjs-editor-signature-add-signature-button =
+    .title = 娣诲姞鏂扮鍚�
+pdfjs-editor-signature-add-signature-button-label = 娣诲姞鏂扮鍚�
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 淇濆瓨鐨勭鍚嶏細{ $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 鏂囨湰缂栬緫鍣�
+    .default-content = 鍦ㄦ閿叆鈥�
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title = 鎵规敞
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 鍏抽棴渚ф爮
+    .aria-label = 鍏抽棴渚ф爮
+pdfjs-editor-comments-sidebar-close-button-label = 鍏抽棴渚ф爮
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 鍙戠幇鍊煎緱娉ㄦ剰鐨勫湴鏂癸紵鍙负鍏舵坊鍔犻珮浜苟鎵规敞銆�
+pdfjs-editor-comments-sidebar-no-comments-link = 璇︾粏浜嗚В
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 鏇挎崲鏂囧瓧
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 缂栬緫鏇挎崲鏂囧瓧
+pdfjs-editor-alt-text-dialog-label = 閫夋嫨涓�椤�
+pdfjs-editor-alt-text-dialog-description = 鏇挎崲鏂囧瓧鍙湪鐢ㄦ埛鏃犳硶鐪嬪埌鎴栧姞杞藉浘鍍忔椂锛屾弿杩板叾鍐呭銆�
+pdfjs-editor-alt-text-add-description-label = 娣诲姞鎻忚堪
+pdfjs-editor-alt-text-add-description-description = 鐢ㄤ竴涓や釜鍙ュ瓙锛屾弿杩颁富棰樸�佽儗鏅垨鍔ㄤ綔銆�
+pdfjs-editor-alt-text-mark-decorative-label = 鏍囪涓鸿楗�
+pdfjs-editor-alt-text-mark-decorative-description = 鐢ㄤ簬瑁呴グ鐨勫浘鍍忥紝渚嬪杈规鍜屾按鍗般��
+pdfjs-editor-alt-text-cancel-button = 鍙栨秷
+pdfjs-editor-alt-text-save-button = 淇濆瓨
+pdfjs-editor-alt-text-decorative-tooltip = 宸叉爣璁颁负瑁呴グ
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 渚嬪锛氫竴涓皯骞村潗鍒版鍓嶏紝鍑嗗鍚冮キ
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 鏇挎崲鏂囧瓧
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 璋冩暣灏哄 - 宸︿笂瑙�
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 璋冩暣灏哄 - 椤堕儴涓棿
+pdfjs-editor-resizer-top-right =
+    .aria-label = 璋冩暣灏哄 - 鍙充笂瑙�
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 璋冩暣灏哄 - 鍙充晶涓棿
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 璋冩暣灏哄 - 鍙充笅瑙�
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 璋冩暣澶у皬 - 搴曢儴涓棿
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 璋冩暣灏哄 - 宸︿笅瑙�
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 璋冩暣灏哄 - 宸︿晶涓棿
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 楂樹寒鑹�
+pdfjs-editor-colorpicker-button =
+    .title = 鏇存敼棰滆壊
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 棰滆壊閫夋嫨
+pdfjs-editor-colorpicker-yellow =
+    .title = 榛勮壊
+pdfjs-editor-colorpicker-green =
+    .title = 缁胯壊
+pdfjs-editor-colorpicker-blue =
+    .title = 钃濊壊
+pdfjs-editor-colorpicker-pink =
+    .title = 绮夎壊
+pdfjs-editor-colorpicker-red =
+    .title = 绾㈣壊
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 鏄剧ず鍏ㄩ儴
+pdfjs-editor-highlight-show-all-button =
+    .title = 鏄剧ず鍏ㄩ儴
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 缂栬緫鏇挎崲鏂囧瓧锛堝浘鍍忔弿杩帮級
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 娣诲姞鏇挎崲鏂囧瓧锛堝浘鍍忔弿杩帮級
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 璇峰湪姝ゅ鎾板啓鎻忚堪鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 鍚戞棤娉曠湅鍒版垨鍔犺浇鍥惧儚鐨勭敤鎴锋彁渚涚殑绠�鐭弿杩般��
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 姝ゆ鏇挎崲鏂囧瓧涓鸿嚜鍔ㄥ垱寤猴紝鏈夊彲鑳戒笉鍑嗙‘銆�
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 璇︾粏浜嗚В
+pdfjs-editor-new-alt-text-create-automatically-button-label = 鑷姩鍒涘缓鏇挎崲鏂囧瓧
+pdfjs-editor-new-alt-text-not-now-button = 鏆傛椂涓嶈
+pdfjs-editor-new-alt-text-error-title = 鏃犳硶鑷姩鍒涘缓鏇挎崲鏂囧瓧
+pdfjs-editor-new-alt-text-error-description = 璇疯嚜琛屾挵鍐欐浛鎹㈡枃瀛楋紝鎴栫◢鍚庡啀璇曘��
+pdfjs-editor-new-alt-text-error-close-button = 鍏抽棴
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 姝e湪涓嬭浇鎻愪緵鏇挎崲鏂囧瓧鐨� AI 妯″瀷锛坽 $downloadedSize }/{ $totalSize } MB锛�
+    .aria-valuetext = 姝e湪涓嬭浇鎻愪緵鏇挎崲鏂囧瓧鐨� AI 妯″瀷锛坽 $downloadedSize }/{ $totalSize } MB锛�
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 宸叉坊鍔犳浛鎹㈡枃瀛�
+pdfjs-editor-new-alt-text-added-button-label = 宸叉坊鍔犳浛鎹㈡枃瀛�
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 缂哄皯鏇挎崲鏂囧瓧
+pdfjs-editor-new-alt-text-missing-button-label = 缂哄皯鏇挎崲鏂囧瓧
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 妫�鏌ユ浛鎹㈡枃瀛�
+pdfjs-editor-new-alt-text-to-review-button-label = 妫�鏌ユ浛鎹㈡枃瀛�
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = [鑷姩鍒涘缓] { $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 鍥惧儚鏇挎崲鏂囧瓧璁剧疆
+pdfjs-image-alt-text-settings-button-label = 鍥惧儚鏇挎崲鏂囧瓧璁剧疆
+pdfjs-editor-alt-text-settings-dialog-label = 鍥惧儚鏇挎崲鏂囧瓧璁剧疆
+pdfjs-editor-alt-text-settings-automatic-title = 鑷姩鍒涘缓鏇挎崲鏂囧瓧
+pdfjs-editor-alt-text-settings-create-model-button-label = 鑷姩鍒涘缓鏇挎崲鏂囧瓧
+pdfjs-editor-alt-text-settings-create-model-description = 鍚戞棤娉曠湅鍒版垨鍔犺浇鍥惧儚鐨勭敤鎴锋彁渚涙弿杩般��
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 鎻愪緵鏇挎崲鏂囧瓧鐨� AI 妯″瀷锛坽 $totalSize } MB锛�
+pdfjs-editor-alt-text-settings-ai-model-description = 鍦ㄦ偍鐨勮澶囨湰鍦拌繍琛岋紝鍙娇鏁版嵁淇濇寔绉佸瘑銆傝嚜鍔ㄥ垱寤烘浛鎹㈡枃瀛楅渶瑕佷娇鐢ㄦ妯″瀷銆�
+pdfjs-editor-alt-text-settings-delete-model-button = 鍒犻櫎
+pdfjs-editor-alt-text-settings-download-model-button = 涓嬭浇
+pdfjs-editor-alt-text-settings-downloading-model-button = 姝e湪涓嬭浇鈥�
+pdfjs-editor-alt-text-settings-editor-title = 鏇挎崲鏂囧瓧缂栬緫鍣�
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 娣诲姞鍥惧儚鍚庣珛鍗虫樉绀烘浛鎹㈡枃瀛楃紪杈戝櫒
+pdfjs-editor-alt-text-settings-show-dialog-description = 甯姪纭繚鎵�鏈夊浘鍍忓潎鎷ユ湁鏇挎崲鏂囧瓧銆�
+pdfjs-editor-alt-text-settings-close-button = 鍏抽棴
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 宸叉坊鍔犻珮浜�
+pdfjs-editor-freetext-added-alert = 宸叉坊鍔犳枃鏈�
+pdfjs-editor-ink-added-alert = 宸叉坊鍔犵粯鍥�
+pdfjs-editor-stamp-added-alert = 宸叉坊鍔犲浘鍍�
+pdfjs-editor-signature-added-alert = 宸叉坊鍔犵鍚�
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 宸茬Щ闄ら珮浜�
+pdfjs-editor-undo-bar-message-freetext = 宸茬Щ闄ゆ枃鏈�
+pdfjs-editor-undo-bar-message-ink = 宸茬Щ闄ょ粯鍥�
+pdfjs-editor-undo-bar-message-stamp = 宸茬Щ闄ゅ浘鍍�
+pdfjs-editor-undo-bar-message-signature = 绛惧悕宸茬Щ闄�
+pdfjs-editor-undo-bar-message-comment = 宸茬Щ闄ゆ壒娉�
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple = 宸茬Щ闄� { $count } 鏉℃敞閲�
+pdfjs-editor-undo-bar-undo-button =
+    .title = 鎾ら攢
+pdfjs-editor-undo-bar-undo-button-label = 鎾ら攢
+pdfjs-editor-undo-bar-close-button =
+    .title = 鍏抽棴
+pdfjs-editor-undo-bar-close-button-label = 鍏抽棴
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 鐢ㄦ埛鍙�氳繃姝ゆā鎬佸璇濇鍒涘缓瑕佹坊鍔犲埌 PDF 鏂囨。涓殑绛惧悕銆佺紪杈戝叾鍚嶇О锛堝悓鏃剁敤浣滄浛鎹㈡枃瀛楋級锛屽苟鍙繚瀛樼鍚嶄互渚块噸澶嶄娇鐢ㄣ��
+pdfjs-editor-add-signature-dialog-title = 娣诲姞绛惧悕
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 閿叆
+    .title = 閿叆
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 缁樺埗
+    .title = 缁樺埗
+pdfjs-editor-add-signature-image-button = 鍥惧儚
+    .title = 鍥惧儚
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 閿叆绛惧悕
+    .placeholder = 閿叆绛惧悕
+pdfjs-editor-add-signature-draw-placeholder = 缁樺埗绛惧悕
+pdfjs-editor-add-signature-draw-thickness-range-label = 绮楃粏
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 绗旂敾绮楃粏锛歿 $thickness }
+pdfjs-editor-add-signature-image-placeholder = 鎷栨斁鏂囦欢鍒版澶勪互涓婁紶
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 鎴栭�夊彇鍥惧儚鏂囦欢
+       *[other] 鎴栨祻瑙堝浘鍍忔枃浠�
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 鎻忚堪锛堟浛鎹㈡枃瀛楋級
+pdfjs-editor-add-signature-description-input =
+    .title = 鎻忚堪锛堟浛鎹㈡枃瀛楋級
+pdfjs-editor-add-signature-description-default-when-drawing = 绛惧悕
+pdfjs-editor-add-signature-clear-button-label = 娓呴櫎绛惧悕
+pdfjs-editor-add-signature-clear-button =
+    .title = 娓呴櫎绛惧悕
+pdfjs-editor-add-signature-save-checkbox = 淇濆瓨绛惧悕
+pdfjs-editor-add-signature-save-warning-message = 鏈�澶氬彲淇濆瓨 5 涓鍚嶏紝璇风Щ闄や竴涓互缁х画淇濆瓨銆�
+pdfjs-editor-add-signature-image-upload-error-title = 鏃犳硶涓婁紶鍥惧儚
+pdfjs-editor-add-signature-image-upload-error-description = 璇锋鏌ョ綉缁滆繛鎺ワ紝鎴栧皾璇曚笂浼犲叾浠栧浘鍍忋��
+pdfjs-editor-add-signature-image-no-data-error-title = 鏃犳硶灏嗘鍥惧儚杞崲涓虹鍚�
+pdfjs-editor-add-signature-image-no-data-error-description = 璇峰皾璇曚笂浼犲叾浠栧浘鍍忋��
+pdfjs-editor-add-signature-error-close-button = 鍏抽棴
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 鍙栨秷
+pdfjs-editor-add-signature-add-button = 娣诲姞
+pdfjs-editor-edit-signature-update-button = 鏇存柊
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 缂栬緫鎵规敞
+pdfjs-editor-edit-comment-popup-button =
+    .title = 缂栬緫鎵规敞
+pdfjs-editor-delete-comment-popup-button-label = 绉婚櫎鎵规敞
+pdfjs-editor-delete-comment-popup-button =
+    .title = 绉婚櫎鎵规敞
+pdfjs-show-comment-button =
+    .title = 鏄剧ず鎵规敞
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 缂栬緫鎵规敞
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 鏇存柊
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 娣诲姞鎵规敞
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 娣诲姞
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 寮�濮嬮敭鍏モ��
+pdfjs-editor-edit-comment-dialog-cancel-button = 鍙栨秷
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 娣诲姞鎵规敞
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 鎵撳紑/鍏抽棴渚ф爮锛堟枃妗f墍鍚殑缂╃暐鍥�/澶х翰/闄勪欢/鍥惧眰锛�
+pdfjs-toggle-views-manager-button1-label = 绠$悊椤甸潰
+pdfjs-views-manager-sidebar =
+    .aria-label = 渚ф爮
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 璋冩暣渚ф爮澶у皬
+pdfjs-views-manager-view-selector-button =
+    .title = 瑙嗗浘
+pdfjs-views-manager-view-selector-button-label = 瑙嗗浘
+pdfjs-views-manager-pages-title = 椤甸潰
+pdfjs-views-manager-outlines-title1 = 鏂囨。澶х翰
+    .title = 鏂囨。澶х翰锛堝弻鍑诲彲灞曞紑/鎶樺彔鎵�鏈夐」鐩級
+pdfjs-views-manager-attachments-title = 闄勪欢
+pdfjs-views-manager-layers-title1 = 鍥惧眰
+    .title = 鍥惧眰锛堝弻鍑诲彲灏嗘墍鏈夊浘灞傞噸缃负榛樿鐘舵�侊級
+pdfjs-views-manager-pages-option-label = 椤甸潰
+pdfjs-views-manager-outlines-option-label = 鏂囨。澶х翰
+pdfjs-views-manager-attachments-option-label = 闄勪欢
+pdfjs-views-manager-layers-option-label = 鍥惧眰
+pdfjs-views-manager-add-file-button =
+    .title = 娣诲姞鏂囦欢
+pdfjs-views-manager-add-file-button-label = 娣诲姞鏂囦欢
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label = 宸查�夋嫨 { $count } 椤�
+pdfjs-views-manager-pages-status-none-action-label = 閫夋嫨椤甸潰
+pdfjs-views-manager-pages-status-action-button-label = 绠$悊
+pdfjs-views-manager-pages-status-copy-button-label = 澶嶅埗
+pdfjs-views-manager-pages-status-cut-button-label = 鍓垏
+pdfjs-views-manager-pages-status-delete-button-label = 鍒犻櫎
+pdfjs-views-manager-pages-status-export-selected-button-label = 瀵煎嚭閫変腑鐨勯〉闈⑩��
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label = 宸插壀鍒� { $count } 椤�
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label = 宸插鍒� { $count } 椤�
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label = 宸插垹闄� { $count } 椤�
+pdfjs-views-manager-pages-status-waiting-ready-label = 姝e湪鍑嗗鏂囦欢鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 姝e湪涓婁紶鏂囦欢鈥�
+pdfjs-views-manager-status-warning-cut-label = 鏃犳硶鍓垏锛岃鍒锋柊椤甸潰骞堕噸璇曘��
+pdfjs-views-manager-status-warning-copy-label = 鏃犳硶澶嶅埗锛岃鍒锋柊椤甸潰骞堕噸璇曘��
+pdfjs-views-manager-status-warning-delete-label = 鏃犳硶鍒犻櫎锛岃鍒锋柊椤甸潰骞堕噸璇曘��
+pdfjs-views-manager-status-warning-save-label = 鏃犳硶淇濆瓨锛岃鍒锋柊椤甸潰骞堕噸璇曘��
+pdfjs-views-manager-status-undo-button-label = 鎾ら攢
+pdfjs-views-manager-status-done-button-label = 瀹屾垚
+pdfjs-views-manager-status-close-button =
+    .title = 鍏抽棴
+pdfjs-views-manager-status-close-button-label = 鍏抽棴
+pdfjs-views-manager-paste-button-label = 绮樿创
+pdfjs-views-manager-paste-button-before =
+    .title = 绮樿创鍦ㄧ涓�椤典箣鍓�
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 绮樿创鍦ㄧ { $page } 椤典箣鍚�
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 鏂�
+pdfjs-views-manager-waiting-for-file = 姝e湪涓婁紶鏂囦欢鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 绠$悊椤甸潰
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 绉婚櫎宸蹭繚瀛樼殑绛惧悕
+pdfjs-editor-delete-signature-button-label1 = 绉婚櫎宸蹭繚瀛樼殑绛惧悕
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 缂栬緫鎻忚堪
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 缂栬緫鎻忚堪
diff --git a/public/pdfjs/web/locale/zh-TW/viewer.ftl b/public/pdfjs/web/locale/zh-TW/viewer.ftl
new file mode 100644
index 0000000..e04ba61
--- /dev/null
+++ b/public/pdfjs/web/locale/zh-TW/viewer.ftl
@@ -0,0 +1,715 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+## Main toolbar buttons (tooltips and alt text for images)
+
+pdfjs-previous-button =
+    .title = 涓婁竴闋�
+pdfjs-previous-button-label = 涓婁竴闋�
+pdfjs-next-button =
+    .title = 涓嬩竴闋�
+pdfjs-next-button-label = 涓嬩竴闋�
+# .title: Tooltip for the pageNumber input.
+pdfjs-page-input =
+    .title = 绗�
+# Variables:
+#   $pagesCount (Number) - the total number of pages in the document
+# This string follows an input field with the number of the page currently displayed.
+pdfjs-of-pages = 闋侊紝鍏� { $pagesCount } 闋�
+# Variables:
+#   $pageNumber (Number) - the currently visible page
+#   $pagesCount (Number) - the total number of pages in the document
+pdfjs-page-of-pages = 锛堢 { $pageNumber } 闋侊紝鍏� { $pagesCount } 闋侊級
+pdfjs-zoom-out-button =
+    .title = 绺皬
+pdfjs-zoom-out-button-label = 绺皬
+pdfjs-zoom-in-button =
+    .title = 鏀惧ぇ
+pdfjs-zoom-in-button-label = 鏀惧ぇ
+pdfjs-zoom-select =
+    .title = 绺斁
+pdfjs-presentation-mode-button =
+    .title = 鍒囨彌鑷崇啊鍫辨ā寮�
+pdfjs-presentation-mode-button-label = 绨″牨妯″紡
+pdfjs-open-file-button =
+    .title = 闁嬪暉妾旀
+pdfjs-open-file-button-label = 闁嬪暉
+pdfjs-print-button =
+    .title = 鍒楀嵃
+pdfjs-print-button-label = 鍒楀嵃
+pdfjs-save-button =
+    .title = 鍎插瓨
+pdfjs-save-button-label = 鍎插瓨
+# Used in Firefox for Android as a tooltip for the download button (鈥渄ownload鈥� is a verb).
+pdfjs-download-button =
+    .title = 涓嬭級
+# Used in Firefox for Android as a label for the download button (鈥渄ownload鈥� is a verb).
+# Length of the translation matters since we are in a mobile context, with limited screen estate.
+pdfjs-download-button-label = 涓嬭級
+pdfjs-bookmark-button =
+    .title = 鐩墠闋侀潰锛堝惈鐩墠妾㈣闋侀潰鐨勭恫鍧�锛�
+pdfjs-bookmark-button-label = 鐩墠闋侀潰
+
+##  Secondary toolbar and context menu
+
+pdfjs-tools-button =
+    .title = 宸ュ叿
+pdfjs-tools-button-label = 宸ュ叿
+pdfjs-first-page-button =
+    .title = 璺冲埌绗竴闋�
+pdfjs-first-page-button-label = 璺冲埌绗竴闋�
+pdfjs-last-page-button =
+    .title = 璺冲埌鏈�寰屼竴闋�
+pdfjs-last-page-button-label = 璺冲埌鏈�寰屼竴闋�
+pdfjs-page-rotate-cw-button =
+    .title = 闋嗘檪閲濇棆杞�
+pdfjs-page-rotate-cw-button-label = 闋嗘檪閲濇棆杞�
+pdfjs-page-rotate-ccw-button =
+    .title = 閫嗘檪閲濇棆杞�
+pdfjs-page-rotate-ccw-button-label = 閫嗘檪閲濇棆杞�
+pdfjs-cursor-text-select-tool-button =
+    .title = 闁嬪暉鏂囧瓧閬告搰宸ュ叿
+pdfjs-cursor-text-select-tool-button-label = 鏂囧瓧閬告搰宸ュ叿
+pdfjs-cursor-hand-tool-button =
+    .title = 闁嬪暉闋侀潰绉诲嫊宸ュ叿
+pdfjs-cursor-hand-tool-button-label = 闋侀潰绉诲嫊宸ュ叿
+pdfjs-scroll-page-button =
+    .title = 浣跨敤鍠爜鎹插嫊鐗堥潰
+pdfjs-scroll-page-button-label = 鍠爜鎹插嫊
+pdfjs-scroll-vertical-button =
+    .title = 浣跨敤鍨傜洿鎹插嫊鐗堥潰
+pdfjs-scroll-vertical-button-label = 鍨傜洿鎹插嫊
+pdfjs-scroll-horizontal-button =
+    .title = 浣跨敤姘村钩鎹插嫊鐗堥潰
+pdfjs-scroll-horizontal-button-label = 姘村钩鎹插嫊
+pdfjs-scroll-wrapped-button =
+    .title = 浣跨敤澶氶爜鎹插嫊鐗堥潰
+pdfjs-scroll-wrapped-button-label = 澶氶爜鎹插嫊
+pdfjs-spread-none-button =
+    .title = 涓嶈閫茶璺ㄩ爜椤ず
+pdfjs-spread-none-button-label = 涓嶈法闋�
+pdfjs-spread-odd-button =
+    .title = 寰炲鏁搁爜闁嬪璺ㄩ爜
+pdfjs-spread-odd-button-label = 濂囨暩璺ㄩ爜
+pdfjs-spread-even-button =
+    .title = 寰炲伓鏁搁爜闁嬪璺ㄩ爜
+pdfjs-spread-even-button-label = 鍋舵暩璺ㄩ爜
+
+## Document properties dialog
+
+pdfjs-document-properties-button =
+    .title = 鏂囦欢鍏у鈥�
+pdfjs-document-properties-button-label = 鏂囦欢鍏у鈥�
+pdfjs-document-properties-file-name = 妾旀鍚嶇ū锛�
+pdfjs-document-properties-file-size = 妾旀澶у皬锛�
+# Variables:
+#   $kb (Number) - the PDF file size in kilobytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB锛坽 $b } 浣嶅厓绲勶級
+# Variables:
+#   $mb (Number) - the PDF file size in megabytes
+#   $b (Number) - the PDF file size in bytes
+pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB锛坽 $b } 浣嶅厓绲勶級
+pdfjs-document-properties-title = 妯欓锛�
+pdfjs-document-properties-author = 浣滆�咃細
+pdfjs-document-properties-subject = 涓绘棬锛�
+pdfjs-document-properties-keywords = 闂滈嵉瀛楋細
+pdfjs-document-properties-creation-date = 寤虹珛鏃ユ湡锛�
+pdfjs-document-properties-modification-date = 淇敼鏃ユ湡锛�
+# Variables:
+#   $dateObj (Date) - the creation/modification date and time of the PDF file
+pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+pdfjs-document-properties-creator = 寤虹珛鑰咃細
+pdfjs-document-properties-producer = PDF 鐢㈢敓鍣細
+pdfjs-document-properties-version = PDF 鐗堟湰锛�
+pdfjs-document-properties-page-count = 闋佹暩锛�
+pdfjs-document-properties-page-size = 闋侀潰澶у皬锛�
+pdfjs-document-properties-page-size-unit-inches = in
+pdfjs-document-properties-page-size-unit-millimeters = mm
+pdfjs-document-properties-page-size-orientation-portrait = 鍨傜洿
+pdfjs-document-properties-page-size-orientation-landscape = 姘村钩
+pdfjs-document-properties-page-size-name-a-three = A3
+pdfjs-document-properties-page-size-name-a-four = A4
+pdfjs-document-properties-page-size-name-letter = Letter
+pdfjs-document-properties-page-size-name-legal = Legal
+
+## Variables:
+##   $width (Number) - the width of the (current) page
+##   $height (Number) - the height of the (current) page
+##   $unit (String) - the unit of measurement of the (current) page
+##   $name (String) - the name of the (current) page
+##   $orientation (String) - the orientation of the (current) page
+
+pdfjs-document-properties-page-size-dimension-string = { $width } 脳 { $height } { $unit }锛坽 $orientation }锛�
+pdfjs-document-properties-page-size-dimension-name-string = { $width } 脳 { $height } { $unit }锛坽 $name }锛寋 $orientation }锛�
+
+##
+
+# The linearization status of the document; usually called "Fast Web View" in
+# English locales of Adobe software.
+pdfjs-document-properties-linearized = 蹇�� Web 妾㈣锛�
+pdfjs-document-properties-linearized-yes = 鏄�
+pdfjs-document-properties-linearized-no = 鍚�
+pdfjs-document-properties-close-button = 闂滈枆
+
+## Print
+
+pdfjs-print-progress-message = 姝e湪婧栧倷鍒楀嵃鏂囦欢鈥�
+# Variables:
+#   $progress (Number) - percent value
+pdfjs-print-progress-percent = { $progress }%
+pdfjs-print-progress-close-button = 鍙栨秷
+pdfjs-printing-not-supported = 璀﹀憡锛氭鐎忚鍣ㄦ湭瀹屾暣鏀彺鍒楀嵃鍔熻兘銆�
+pdfjs-printing-not-ready = 璀﹀憡锛氭 PDF 鏈畬鎴愪笅杓変互渚涘垪鍗般��
+
+## Tooltips and alt text for side panel toolbar buttons
+
+pdfjs-toggle-sidebar-button =
+    .title = 鍒囨彌鍋撮倞娆�
+pdfjs-toggle-sidebar-notification-button =
+    .title = 鍒囨彌鍋撮倞娆勶紙鍖呭惈澶х侗銆侀檮浠躲�佸湒灞ょ殑鏂囦欢锛�
+pdfjs-toggle-sidebar-button-label = 鍒囨彌鍋撮倞娆�
+pdfjs-document-outline-button =
+    .title = 椤ず鏂囦欢澶х侗锛堥洐鎿婂睍闁�/鎽虹枈鎵�鏈夐爡鐩級
+pdfjs-document-outline-button-label = 鏂囦欢澶х侗
+pdfjs-attachments-button =
+    .title = 椤ず闄勪欢
+pdfjs-attachments-button-label = 闄勪欢
+pdfjs-layers-button =
+    .title = 椤ず鍦栧堡锛堟粦榧犻洐鎿婂嵆鍙皣鎵�鏈夊湒灞ら噸瑷偤闋愯ō鐙�鎱嬶級
+pdfjs-layers-button-label = 鍦栧堡
+pdfjs-thumbs-button =
+    .title = 椤ず绺湒
+pdfjs-thumbs-button-label = 绺湒
+pdfjs-current-outline-item-button =
+    .title = 灏嬫壘鐩墠鐨勫ぇ缍遍爡鐩�
+pdfjs-current-outline-item-button-label = 鐩墠鐨勫ぇ缍遍爡鐩�
+pdfjs-findbar-button =
+    .title = 鍦ㄦ枃浠朵腑灏嬫壘
+pdfjs-findbar-button-label = 灏嬫壘
+pdfjs-additional-layers = 鍏朵粬鍦栧堡
+
+## Thumbnails panel item (tooltip and alt text for images)
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-title =
+    .title = 绗� { $page } 闋�
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-canvas =
+    .aria-label = 绗� { $page } 闋佺殑绺湒
+# Variables:
+#   $page (Number) - the page number
+pdfjs-thumb-page-checkbox1 =
+    .title = 閬告搰绗� { $page } 闋�
+# Variables:
+#   $page (Number) - the page number
+#   $total (Number) - the number of pages
+pdfjs-thumb-page-title1 =
+    .title = 绗� { $page } 闋侊紝鍏� { $total } 闋�
+
+## Find panel button title and messages
+
+pdfjs-find-input =
+    .title = 灏嬫壘
+    .placeholder = 鍦ㄦ枃浠朵腑鎼滃皨鈥�
+pdfjs-find-previous-button =
+    .title = 灏嬫壘鏂囧瓧鍓嶆鍑虹従鐨勪綅缃�
+pdfjs-find-previous-button-label = 涓婁竴鍊�
+pdfjs-find-next-button =
+    .title = 灏嬫壘鏂囧瓧涓嬫鍑虹従鐨勪綅缃�
+pdfjs-find-next-button-label = 涓嬩竴鍊�
+pdfjs-find-highlight-checkbox = 寮疯鍏ㄩ儴
+pdfjs-find-match-case-checkbox-label = 鍗�鍒嗗ぇ灏忓
+pdfjs-find-match-diacritics-checkbox-label = 绗﹀悎璁婇煶绗﹁櫉
+pdfjs-find-entire-word-checkbox-label = 绗﹀悎鏁村�嬪瓧
+pdfjs-find-reached-top = 宸叉悳灏嬭嚦鏂囦欢闋傜锛岃嚜搴曠绻肩簩鎼滃皨
+pdfjs-find-reached-bottom = 宸叉悳灏嬭嚦鏂囦欢搴曠锛岃嚜闋傜绻肩簩鎼滃皨
+# Variables:
+#   $current (Number) - the index of the currently active find result
+#   $total (Number) - the total number of matches in the document
+pdfjs-find-match-count = 绗� { $current } 绛嗙鍚堬紝鍏辩鍚� { $total } 绛�
+# Variables:
+#   $limit (Number) - the maximum number of matches
+pdfjs-find-match-count-limit = 绗﹀悎瓒呴亷 { $limit } 闋�
+pdfjs-find-not-found = 鎵句笉鍒版寚瀹氭枃瀛�
+
+## Predefined zoom values
+
+pdfjs-page-scale-width = 闋侀潰瀵害
+pdfjs-page-scale-fit = 绺斁鑷抽爜闈㈠ぇ灏�
+pdfjs-page-scale-auto = 鑷嫊绺斁
+pdfjs-page-scale-actual = 瀵﹂殯澶у皬
+# Variables:
+#   $scale (Number) - percent value for page scale
+pdfjs-page-scale-percent = { $scale }%
+
+## PDF page
+
+# Variables:
+#   $page (Number) - the page number
+pdfjs-page-landmark =
+    .aria-label = 绗� { $page } 闋�
+
+## Loading indicator messages
+
+pdfjs-loading-error = 杓夊叆 PDF 鏅傜櫦鐢熼尟瑾ゃ��
+pdfjs-invalid-file-error = 鐒℃晥鎴栨瘈鎼嶇殑 PDF 妾旀銆�
+pdfjs-missing-file-error = 鎵句笉鍒� PDF 妾旀銆�
+pdfjs-unexpected-response-error = 浼烘湇鍣ㄥ洖鎳夋湭闋愭湡鐨勫収瀹广��
+pdfjs-rendering-error = 鎻忕躬闋侀潰鏅傜櫦鐢熼尟瑾ゃ��
+
+## Annotations
+
+# .alt: This is used as a tooltip.
+# Variables:
+#   $type (String) - an annotation type from a list defined in the PDF spec
+# (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+pdfjs-text-annotation-type =
+    .alt = [{ $type } 瑷昏В]
+# Variables:
+#   $dateObj (Date) - the modification date and time of the annotation
+pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
+
+## Password
+
+pdfjs-password-label = 璜嬭几鍏ョ敤渚嗛枊鍟熸 PDF 妾旀鐨勫瘑纰笺��
+pdfjs-password-invalid = 瀵嗙⒓涓嶆纰猴紝璜嬪啀瑭︿竴娆°��
+pdfjs-password-ok-button = 纰哄畾
+pdfjs-password-cancel-button = 鍙栨秷
+pdfjs-web-fonts-disabled = 宸插仠鐢ㄧ恫璺瓧鍨� (Web fonts): 鐒℃硶浣跨敤 PDF 鍏у祵瀛楀瀷銆�
+
+## Editing
+
+pdfjs-editor-free-text-button =
+    .title = 鏂囧瓧
+pdfjs-editor-color-picker-free-text-input =
+    .title = 鏇存敼鏂囧瓧鑹插僵
+pdfjs-editor-free-text-button-label = 鏂囧瓧
+pdfjs-editor-ink-button =
+    .title = 绻湒
+pdfjs-editor-color-picker-ink-input =
+    .title = 鏇存敼绻湒鑹插僵
+pdfjs-editor-ink-button-label = 绻湒
+pdfjs-editor-stamp-button =
+    .title = 鏂板鎴栫法杓湒鐗�
+pdfjs-editor-stamp-button-label = 鏂板鎴栫法杓湒鐗�
+pdfjs-editor-highlight-button =
+    .title = 寮疯
+pdfjs-editor-highlight-button-label = 寮疯
+pdfjs-highlight-floating-button1 =
+    .title = 寮疯
+    .aria-label = 寮疯
+pdfjs-highlight-floating-button-label = 寮疯
+pdfjs-comment-floating-button =
+    .title = 瑷昏В
+    .aria-label = 瑷昏В
+pdfjs-comment-floating-button-label = 瑷昏В
+pdfjs-editor-comment-button =
+    .title = 瑷昏В
+    .aria-label = 瑷昏В
+pdfjs-editor-comment-button-label = 瑷昏В
+pdfjs-editor-signature-button =
+    .title = 鍔犲叆绨界珷
+pdfjs-editor-signature-button-label = 鍔犲叆绨界珷
+
+## Default editor aria labels
+
+# 鈥淗ighlight鈥� is a noun, the string is used on the editor for highlights.
+pdfjs-editor-highlight-editor =
+    .aria-label = 寮疯妯e紡绶ㄨ集鍣�
+# 鈥淒rawing鈥� is a noun, the string is used on the editor for drawings.
+pdfjs-editor-ink-editor =
+    .aria-label = 绻湒绶ㄨ集鍣�
+# Used when a signature editor is selected/hovered.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-signature-editor1 =
+    .aria-description = 绨界珷绶ㄨ集鍣細{ $description }
+pdfjs-editor-stamp-editor =
+    .aria-label = 鍦栫墖绶ㄨ集鍣�
+
+## Remove button for the various kind of editor.
+
+pdfjs-editor-remove-ink-button =
+    .title = 绉婚櫎绻湒
+pdfjs-editor-remove-freetext-button =
+    .title = 绉婚櫎鏂囧瓧
+pdfjs-editor-remove-stamp-button =
+    .title = 绉婚櫎鍦栫墖
+pdfjs-editor-remove-highlight-button =
+    .title = 绉婚櫎閬告搰绡勫湇鐨勫挤瑾挎晥鏋�
+pdfjs-editor-remove-signature-button =
+    .title = 绉婚櫎绨界珷
+
+##
+
+# Editor Parameters
+pdfjs-editor-free-text-color-input = 鑹插僵
+pdfjs-editor-free-text-size-input = 澶у皬
+pdfjs-editor-ink-color-input = 鑹插僵
+pdfjs-editor-ink-thickness-input = 绶氭绮楃窗
+pdfjs-editor-ink-opacity-input = 閫忊�嬫槑搴�
+pdfjs-editor-stamp-add-image-button =
+    .title = 鏂板鍦栫墖
+pdfjs-editor-stamp-add-image-button-label = 鏂板鍦栫墖
+# This refers to the thickness of the line used for free highlighting (not bound to text)
+pdfjs-editor-free-highlight-thickness-input = 绶氭绮楃窗
+pdfjs-editor-free-highlight-thickness-title =
+    .title = 鏇存敼寮疯鏂囧瓧浠ュ鐨勯爡鐩檪鐨勭窔姊濈矖绱�
+pdfjs-editor-add-signature-container =
+    .aria-label = 绨界珷鎺у埗鍏冧欢鑸囧劜瀛樼殑绨界珷
+pdfjs-editor-signature-add-signature-button =
+    .title = 鏂板绨界珷
+pdfjs-editor-signature-add-signature-button-label = 鏂板绨界珷
+# Used on the button to use an already saved signature.
+# Variables:
+#   $description (String) - a string describing/labeling the signature.
+pdfjs-editor-add-saved-signature-button =
+    .title = 宸插劜瀛樼敖绔狅細{ $description }
+# .default-content is used as a placeholder in an empty text editor.
+pdfjs-free-text2 =
+    .aria-label = 鏂囧瓧绶ㄨ集鍣�
+    .default-content = 璜嬫墦瀛椻��
+# Used to show how many comments are present in the pdf file.
+# Variables:
+#   $count (Number) - the number of comments.
+pdfjs-editor-comments-sidebar-title = 瑷昏В
+pdfjs-editor-comments-sidebar-close-button =
+    .title = 闂滈枆鍋撮倞娆�
+    .aria-label = 闂滈枆鍋撮倞娆�
+pdfjs-editor-comments-sidebar-close-button-label = 闂滈枆鍋撮倞娆�
+# Instructional copy to add a comment by selecting text or an annotations.
+pdfjs-editor-comments-sidebar-no-comments1 = 鎯虫妸鍝�嬮儴鍒嗚涓嬩締锛熷彲浠ョ暙铻㈠厜寮疯锛屼甫涓旂暀涓嬭ɑ瑙c��
+pdfjs-editor-comments-sidebar-no-comments-link = 鏇村璩囪▕
+
+## Alt-text dialog
+
+pdfjs-editor-alt-text-button-label = 鏇夸唬鏂囧瓧
+pdfjs-editor-alt-text-edit-button =
+    .aria-label = 绶ㄨ集鏇夸唬鏂囧瓧
+pdfjs-editor-alt-text-dialog-label = 鎸戦伕涓�绋�
+pdfjs-editor-alt-text-dialog-description = 鏇夸唬鏂囧瓧鍙崝鍔╃洸浜猴紝鎴栨柤鍦栫墖鐒℃硶杓夊叆鏅傛彁渚涜鏄庛��
+pdfjs-editor-alt-text-add-description-label = 鏂板鎻忚堪
+pdfjs-editor-alt-text-add-description-description = 鐢� 1-2 鍙ユ枃瀛楁弿杩颁富椤屻�佽儗鏅垨鍕曚綔銆�
+pdfjs-editor-alt-text-mark-decorative-label = 妯欑ず鐐鸿椋炬�у収瀹�
+pdfjs-editor-alt-text-mark-decorative-description = 閫欐槸瑁濋>鎬у湒鐗囷紝渚嬪閭婃鎴栨诞姘村嵃銆�
+pdfjs-editor-alt-text-cancel-button = 鍙栨秷
+pdfjs-editor-alt-text-save-button = 鍎插瓨
+pdfjs-editor-alt-text-decorative-tooltip = 宸叉绀虹偤瑁濋>鎬у収瀹�
+# .placeholder: This is a placeholder for the alt text input area
+pdfjs-editor-alt-text-textarea =
+    .placeholder = 渚嬪锛氥�屾湁涓�浣嶅勾杓曠敺浜哄潗鍦ㄦ瀛愬墠闈㈠悆椋��
+# Alternative text (alt text) helps when people can't see the image.
+pdfjs-editor-alt-text-button =
+    .aria-label = 鏇夸唬鏂囧瓧
+
+## Editor resizers
+## This is used in an aria label to help to understand the role of the resizer.
+
+pdfjs-editor-resizer-top-left =
+    .aria-label = 宸︿笂瑙� 鈥� 瑾挎暣澶у皬
+pdfjs-editor-resizer-top-middle =
+    .aria-label = 闋傞儴涓枔 鈥� 瑾挎暣澶у皬
+pdfjs-editor-resizer-top-right =
+    .aria-label = 鍙充笂瑙� 鈥� 瑾挎暣澶у皬
+pdfjs-editor-resizer-middle-right =
+    .aria-label = 涓枔鍙虫柟 鈥� 瑾挎暣澶у皬
+pdfjs-editor-resizer-bottom-right =
+    .aria-label = 鍙充笅瑙� 鈥� 瑾挎暣澶у皬
+pdfjs-editor-resizer-bottom-middle =
+    .aria-label = 搴曢儴涓枔 鈥� 瑾挎暣澶у皬
+pdfjs-editor-resizer-bottom-left =
+    .aria-label = 宸︿笅瑙� 鈥� 瑾挎暣澶у皬
+pdfjs-editor-resizer-middle-left =
+    .aria-label = 涓枔宸︽柟 鈥� 瑾挎暣澶у皬
+
+## Color picker
+
+# This means "Color used to highlight text"
+pdfjs-editor-highlight-colorpicker-label = 寮疯鑹插僵
+pdfjs-editor-colorpicker-button =
+    .title = 鏇存敼鑹插僵
+pdfjs-editor-colorpicker-dropdown =
+    .aria-label = 鑹插僵閬搁爡
+pdfjs-editor-colorpicker-yellow =
+    .title = 榛冭壊
+pdfjs-editor-colorpicker-green =
+    .title = 缍犺壊
+pdfjs-editor-colorpicker-blue =
+    .title = 钘嶈壊
+pdfjs-editor-colorpicker-pink =
+    .title = 绮夌磪鑹�
+pdfjs-editor-colorpicker-red =
+    .title = 绱呰壊
+
+## Show all highlights
+## This is a toggle button to show/hide all the highlights.
+
+pdfjs-editor-highlight-show-all-button-label = 椤ず鍏ㄩ儴
+pdfjs-editor-highlight-show-all-button =
+    .title = 椤ず鍏ㄩ儴
+
+## New alt-text dialog
+## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
+
+# Modal header positioned above a text box where users can edit the alt text.
+pdfjs-editor-new-alt-text-dialog-edit-label = 绶ㄨ集鏇夸唬鏂囧瓧锛堝湒鐗囨弿杩帮級
+# Modal header positioned above a text box where users can add the alt text.
+pdfjs-editor-new-alt-text-dialog-add-label = 鏂板鏇夸唬鏂囧瓧锛堝湒鐗囨弿杩帮級
+pdfjs-editor-new-alt-text-textarea =
+    .placeholder = 鍦ㄦ瀵笅鎮ㄧ殑鎻忚堪鏂囧瓧鈥�
+# This text refers to the alt text box above this description. It offers a definition of alt text.
+pdfjs-editor-new-alt-text-description = 鐐虹湅涓嶅埌鍦栫墖鐨勮畝鑰咃紝鎴栧湒鐗囩劇娉曡級鍏ユ檪椤ず鐨勭啊鐭弿杩般��
+# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
+pdfjs-editor-new-alt-text-disclaimer1 = 姝ゆ浛浠f枃瀛楁槸鑷嫊鐢㈢敓鐨勶紝鍙兘涓嶅绮剧⒑銆�
+pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 鏇村璩囪▕
+pdfjs-editor-new-alt-text-create-automatically-button-label = 鑷嫊鐢㈢敓鏇夸唬鏂囧瓧
+pdfjs-editor-new-alt-text-not-now-button = 鏆檪涓嶈
+pdfjs-editor-new-alt-text-error-title = 鐒℃硶鑷嫊鐢㈢敓鏇夸唬鏂囧瓧
+pdfjs-editor-new-alt-text-error-description = 璜嬭嚜琛屽~瀵浛浠f枃瀛楋紝鎴栫◢寰屽啀瑭︿竴娆°��
+pdfjs-editor-new-alt-text-error-close-button = 闂滈枆
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+#   $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
+pdfjs-editor-new-alt-text-ai-model-downloading-progress = 姝e湪涓嬭級鏇夸唬鏂囧瓧 AI 妯″瀷锛坽 $downloadedSize } / { $totalSize } MB锛�
+    .aria-valuetext = 姝e湪涓嬭級鏇夸唬鏂囧瓧 AI 妯″瀷锛坽 $downloadedSize } / { $totalSize } MB锛�
+# This is a button that users can click to edit the alt text they have already added.
+pdfjs-editor-new-alt-text-added-button =
+    .aria-label = 宸叉柊澧炴浛浠f枃瀛�
+pdfjs-editor-new-alt-text-added-button-label = 宸叉柊澧炴浛浠f枃瀛�
+# This is a button that users can click to open the alt text editor and add alt text when it is not present.
+pdfjs-editor-new-alt-text-missing-button =
+    .aria-label = 缂哄皯鏇夸唬鏂囧瓧
+pdfjs-editor-new-alt-text-missing-button-label = 缂哄皯鏇夸唬鏂囧瓧
+# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
+pdfjs-editor-new-alt-text-to-review-button =
+    .aria-label = 纰鸿獚鏇夸唬鏂囧瓧
+pdfjs-editor-new-alt-text-to-review-button-label = 纰鸿獚鏇夸唬鏂囧瓧
+# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
+# Variables:
+#   $generatedAltText (String) - the generated alt-text.
+pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 鑷嫊鐢㈢敓锛歿 $generatedAltText }
+
+## Image alt-text settings
+
+pdfjs-image-alt-text-settings-button =
+    .title = 鍦栫墖鏇夸唬鏂囧瓧瑷畾
+pdfjs-image-alt-text-settings-button-label = 鍦栫墖鏇夸唬鏂囧瓧瑷畾
+pdfjs-editor-alt-text-settings-dialog-label = 鍦栫墖鏇夸唬鏂囧瓧瑷畾
+pdfjs-editor-alt-text-settings-automatic-title = 鑷嫊鍖栨浛浠f枃瀛�
+pdfjs-editor-alt-text-settings-create-model-button-label = 鑷嫊鐢㈢敓鏇夸唬鏂囧瓧
+pdfjs-editor-alt-text-settings-create-model-description = 鐐烘偍寤鸿鍦栫墖鎻忚堪锛屽公鍔╃湅涓嶅埌鍦栫墖鐨勮畝鑰咃紝鎴栨柤鍦栫墖鐒℃硶杓夊叆鏅傞’绀恒��
+# Variables:
+#   $totalSize (Number) - the total size (in MB) of the AI model.
+pdfjs-editor-alt-text-settings-download-model-label = 鏇夸唬鏂囧瓧 AI 妯″瀷锛坽 $totalSize } MB锛�
+pdfjs-editor-alt-text-settings-ai-model-description = 鍦ㄦ偍鐨勬湰姗熻缃笂閬嬩綔锛屼互纰轰繚鎮ㄧ殑璩囨枡闅辩銆傚繀闋堜笅杓夋妯″瀷鎵嶅彲浠ヨ嚜鍕曠敘鐢熸浛浠f枃瀛椼��
+pdfjs-editor-alt-text-settings-delete-model-button = 鍒櫎
+pdfjs-editor-alt-text-settings-download-model-button = 涓嬭級
+pdfjs-editor-alt-text-settings-downloading-model-button = 涓嬭級涓��
+pdfjs-editor-alt-text-settings-editor-title = 鏇夸唬鏂囧瓧绶ㄨ集鍣�
+pdfjs-editor-alt-text-settings-show-dialog-button-label = 鏂板鍦栫墖寰岀珛鍗抽’绀烘浛浠f枃瀛楃法杓櫒
+pdfjs-editor-alt-text-settings-show-dialog-description = 骞姪鎮ㄧ⒑淇濇墍鏈夊湒鐗囬兘鏈夋浛浠f枃瀛椼��
+pdfjs-editor-alt-text-settings-close-button = 闂滈枆
+
+## Accessibility labels (announced by screen readers) for objects added to the editor.
+
+pdfjs-editor-highlight-added-alert = 宸插姞鍏ュ挤瑾跨瘎鍦�
+pdfjs-editor-freetext-added-alert = 宸插姞鍏ユ枃瀛�
+pdfjs-editor-ink-added-alert = 宸叉柊澧炵躬鍦�
+pdfjs-editor-stamp-added-alert = 宸叉柊澧炲湒鐗�
+pdfjs-editor-signature-added-alert = 宸叉柊澧炵敖绔�
+
+## "Annotations removed" bar
+
+pdfjs-editor-undo-bar-message-highlight = 宸茬Щ闄ゅ挤瑾�
+pdfjs-editor-undo-bar-message-freetext = 宸茬Щ闄ゆ枃瀛�
+pdfjs-editor-undo-bar-message-ink = 宸茬Щ闄ょ躬鍦�
+pdfjs-editor-undo-bar-message-stamp = 宸茬Щ闄ゅ湒鐗�
+pdfjs-editor-undo-bar-message-signature = 宸茬Щ闄ょ敖绔�
+pdfjs-editor-undo-bar-message-comment = 宸茬Щ闄よɑ瑙�
+# Variables:
+#   $count (Number) - the number of removed annotations.
+pdfjs-editor-undo-bar-message-multiple = 宸茬Щ闄� { $count } 绛嗚ɑ瑙�
+pdfjs-editor-undo-bar-undo-button =
+    .title = 閭勫師
+pdfjs-editor-undo-bar-undo-button-label = 閭勫師
+pdfjs-editor-undo-bar-close-button =
+    .title = 闂滈枆
+pdfjs-editor-undo-bar-close-button-label = 闂滈枆
+
+## Add a signature dialog
+
+pdfjs-editor-add-signature-dialog-label = 姝ゅ皪瑭辨璁撲娇鐢ㄨ�呰兘澶犲缓绔嬬敖绔犱互鍔犲叆 PDF 鏂囦欢銆備娇鐢ㄨ�呭彲浠ョ法杓粬鍊戠殑濮撳悕锛堝悓鏅備篃鏄浛浠f枃瀛楋級锛屼甫閬告搰鎬у劜瀛樼敖绔狅紝浠ヤ緵鏈締閲嶈浣跨敤銆�
+pdfjs-editor-add-signature-dialog-title = 鍔犲叆绨界珷
+
+## Tab names
+
+# Type is a verb (you can type your name as signature)
+pdfjs-editor-add-signature-type-button = 鎵撳瓧
+    .title = 鎵撳瓧
+# Draw is a verb (you can draw your signature)
+pdfjs-editor-add-signature-draw-button = 鎵嬬躬
+    .title = 鎵嬬躬
+pdfjs-editor-add-signature-image-button = 鍦栫墖
+    .title = 鍦栫墖
+
+## Tab panels
+
+pdfjs-editor-add-signature-type-input =
+    .aria-label = 杓稿叆绨界珷
+    .placeholder = 杓稿叆绨界珷
+pdfjs-editor-add-signature-draw-placeholder = 鎵嬬躬绨界珷
+pdfjs-editor-add-signature-draw-thickness-range-label = 绶氭绮楃窗
+# Variables:
+#   $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
+pdfjs-editor-add-signature-draw-thickness-range =
+    .title = 绻=鏅傜殑绶氭绮楃窗锛歿 $thickness }
+pdfjs-editor-add-signature-image-placeholder = 灏囨獢妗堟嫋鏇冲埌姝よ檿鍗冲彲涓婂偝
+pdfjs-editor-add-signature-image-browse-link =
+    { PLATFORM() ->
+        [macos] 鎴栭伕鎿囧湒鐗囨獢妗�
+       *[other] 鎴栫�忚鍦栫墖妾旀
+    }
+
+## Controls
+
+pdfjs-editor-add-signature-description-label = 鎻忚堪锛堟浛浠f枃瀛楋級
+pdfjs-editor-add-signature-description-input =
+    .title = 鎻忚堪锛堟浛浠f枃瀛楋級
+pdfjs-editor-add-signature-description-default-when-drawing = 绨界珷
+pdfjs-editor-add-signature-clear-button-label = 娓呴櫎绨界珷
+pdfjs-editor-add-signature-clear-button =
+    .title = 娓呴櫎绨界珷
+pdfjs-editor-add-signature-save-checkbox = 鍎插瓨绨界珷
+pdfjs-editor-add-signature-save-warning-message = 鎮ㄥ凡缍撳劜瀛� 5 寮忕敖绔狅紝璜嬬Щ闄や换涓�寮忔墠鑳藉啀鏂板銆�
+pdfjs-editor-add-signature-image-upload-error-title = 鐒℃硶涓婂偝鍦栫墖
+pdfjs-editor-add-signature-image-upload-error-description = 璜嬫鏌ユ偍鐨勭恫璺�g窔锛屾垨鏀圭敤鍏朵粬鍦栫墖銆�
+pdfjs-editor-add-signature-image-no-data-error-title = 鐒℃硶灏囨鍦栫墖杞夋彌鎴愮敖绔�
+pdfjs-editor-add-signature-image-no-data-error-description = 璜嬭│钁椾笂鍌冲彟涓�寮靛湒鐗囥��
+pdfjs-editor-add-signature-error-close-button = 闂滈枆
+
+## Dialog buttons
+
+pdfjs-editor-add-signature-cancel-button = 鍙栨秷
+pdfjs-editor-add-signature-add-button = 鏂板
+pdfjs-editor-edit-signature-update-button = 鏇存柊
+
+## Comment popup
+
+pdfjs-editor-edit-comment-popup-button-label = 绶ㄨ集瑷昏В
+pdfjs-editor-edit-comment-popup-button =
+    .title = 绶ㄨ集瑷昏В
+pdfjs-editor-delete-comment-popup-button-label = 绉婚櫎瑷昏В
+pdfjs-editor-delete-comment-popup-button =
+    .title = 绉婚櫎瑷昏В
+pdfjs-show-comment-button =
+    .title = 椤ず瑷昏В
+
+##  Edit a comment dialog
+
+# An existing comment is edited
+pdfjs-editor-edit-comment-dialog-title-when-editing = 绶ㄨ集瑷昏В
+pdfjs-editor-edit-comment-dialog-save-button-when-editing = 鏇存柊
+# No existing comment
+pdfjs-editor-edit-comment-dialog-title-when-adding = 鏂板瑷昏В
+pdfjs-editor-edit-comment-dialog-save-button-when-adding = 鏂板
+pdfjs-editor-edit-comment-dialog-text-input =
+    .placeholder = 鍦ㄦ鎵撳瓧鈥�
+pdfjs-editor-edit-comment-dialog-cancel-button = 鍙栨秷
+
+## Edit a comment button in the editor toolbar
+
+pdfjs-editor-add-comment-button =
+    .title = 鏂板瑷昏В
+
+## The view manager is a sidebar displaying different views:
+##  - thumbnails;
+##  - outline;
+##  - attachments;
+##  - layers.
+## The thumbnails view is used to edit the pdf: remove/insert pages, ...
+
+pdfjs-toggle-views-manager-notification-button =
+    .title = 鍒囨彌鍋撮倞娆勶紙鍖呭惈绺湒銆佸ぇ缍便�侀檮浠躲�佸湒灞ょ殑鏂囦欢锛�
+pdfjs-toggle-views-manager-button1-label = 绠$悊闋侀潰
+pdfjs-views-manager-sidebar =
+    .aria-label = 鍋撮倞娆�
+pdfjs-views-manager-sidebar-resizer =
+    .aria-label = 瑾挎暣鍋撮倞娆勫ぇ灏�
+pdfjs-views-manager-view-selector-button =
+    .title = 鐣潰
+pdfjs-views-manager-view-selector-button-label = 鐣潰
+pdfjs-views-manager-pages-title = 闋侀潰
+pdfjs-views-manager-outlines-title1 = 鏂囦欢澶х侗
+    .title = 鏂囦欢澶х侗锛堥粸鍏╀笅鍗冲彲灞曢枊/鎽虹枈鎵�鏈夐爡鐩級
+pdfjs-views-manager-attachments-title = 闄勪欢
+pdfjs-views-manager-layers-title1 = 鍦栧堡
+    .title = 鍦栧堡锛堥粸鍏╀笅鍗冲彲灏囨墍鏈夊湒灞ら噸瑷洖闋愯ō鐙�鎱嬶級
+pdfjs-views-manager-pages-option-label = 闋侀潰
+pdfjs-views-manager-outlines-option-label = 鏂囦欢澶х侗
+pdfjs-views-manager-attachments-option-label = 闄勪欢
+pdfjs-views-manager-layers-option-label = 鍦栧堡
+pdfjs-views-manager-add-file-button =
+    .title = 鏂板妾旀
+pdfjs-views-manager-add-file-button-label = 鏂板妾旀
+# Variables:
+#   $count (Number) - the number of selected pages.
+pdfjs-views-manager-pages-status-action-label = 宸查伕鎿� { $count } 闋�
+pdfjs-views-manager-pages-status-none-action-label = 閬告搰闋侀潰
+pdfjs-views-manager-pages-status-action-button-label = 绠$悊
+pdfjs-views-manager-pages-status-copy-button-label = 瑜囪=
+pdfjs-views-manager-pages-status-cut-button-label = 鍓笅
+pdfjs-views-manager-pages-status-delete-button-label = 鍒櫎
+pdfjs-views-manager-pages-status-export-selected-button-label = 鍖嚭閬告搰闋呯洰鈥�
+# Variables:
+#   $count (Number) - the number of selected pages to be cut.
+pdfjs-views-manager-status-undo-cut-label = 宸插壀涓� { $count } 闋�
+# Variables:
+#   $count (Number) - the number of selected pages to be copied.
+pdfjs-views-manager-pages-status-undo-copy-label = 宸茶瑁� { $count } 闋�
+# Variables:
+#   $count (Number) - the number of selected pages to be deleted.
+pdfjs-views-manager-pages-status-undo-delete-label = 宸插埅闄� { $count } 闋�
+pdfjs-views-manager-pages-status-waiting-ready-label = 姝e湪婧栧倷鎮ㄧ殑妾旀鈥�
+pdfjs-views-manager-pages-status-waiting-uploading-label = 姝e湪涓婂偝妾旀鈥�
+pdfjs-views-manager-status-warning-cut-label = 鐒℃硶鍓笅闋侀潰锛岃珛閲嶆柊鏁寸悊闋侀潰寰屽啀瑭︿竴娆°��
+pdfjs-views-manager-status-warning-copy-label = 鐒℃硶瑜囪=闋侀潰锛岃珛閲嶆柊鏁寸悊闋侀潰寰屽啀瑭︿竴娆°��
+pdfjs-views-manager-status-warning-delete-label = 鐒℃硶鍒櫎闋侀潰锛岃珛閲嶆柊鏁寸悊闋侀潰寰屽啀瑭︿竴娆°��
+pdfjs-views-manager-status-warning-save-label = 鐒℃硶鍎插瓨闋侀潰锛岃珛閲嶆柊鏁寸悊闋侀潰寰屽啀瑭︿竴娆°��
+pdfjs-views-manager-status-undo-button-label = 閭勫師
+pdfjs-views-manager-status-done-button-label = 瀹屾垚
+pdfjs-views-manager-status-close-button =
+    .title = 闂滈枆
+pdfjs-views-manager-status-close-button-label = 闂滈枆
+pdfjs-views-manager-paste-button-label = 璨间笂
+pdfjs-views-manager-paste-button-before =
+    .title = 璨煎埌绗竴闋佸墠
+# Variables:
+#   $page (Number) - the page number after which the paste button is.
+pdfjs-views-manager-paste-button-after =
+    .title = 璨煎埌绗� { $page } 闋佸緦
+# Badge used to promote a new feature in the UI, keep it as short as possible.
+# It's spelled uppercase for English, but it can be translated as usual.
+pdfjs-new-badge-content = 鏂板姛鑳�
+pdfjs-views-manager-waiting-for-file = 姝e湪涓婂偝妾旀鈥�
+pdfjs-toggle-views-manager-button1 =
+    .title = 绠$悊闋侀潰
+
+## Main menu for adding/removing signatures
+
+pdfjs-editor-delete-signature-button1 =
+    .title = 绉婚櫎鍎插瓨鐨勭敖绔�
+pdfjs-editor-delete-signature-button-label1 = 绉婚櫎鍎插瓨鐨勭敖绔�
+
+## Editor toolbar
+
+pdfjs-editor-add-signature-edit-button-label = 绶ㄨ集鎻忚堪
+
+## Edit signature description dialog
+
+pdfjs-editor-edit-signature-dialog-title = 绶ㄨ集鎻忚堪
diff --git a/public/pdfjs/web/standard_fonts/FoxitDingbats.pfb b/public/pdfjs/web/standard_fonts/FoxitDingbats.pfb
new file mode 100644
index 0000000..30d5296
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitDingbats.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitFixed.pfb b/public/pdfjs/web/standard_fonts/FoxitFixed.pfb
new file mode 100644
index 0000000..f12dcbc
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitFixed.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitFixedBold.pfb b/public/pdfjs/web/standard_fonts/FoxitFixedBold.pfb
new file mode 100644
index 0000000..cf8e24a
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitFixedBold.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb b/public/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb
new file mode 100644
index 0000000..d288001
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb b/public/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb
new file mode 100644
index 0000000..d71697d
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitSerif.pfb b/public/pdfjs/web/standard_fonts/FoxitSerif.pfb
new file mode 100644
index 0000000..3fa682e
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitSerif.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitSerifBold.pfb b/public/pdfjs/web/standard_fonts/FoxitSerifBold.pfb
new file mode 100644
index 0000000..ff7c6dd
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitSerifBold.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb b/public/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb
new file mode 100644
index 0000000..460231f
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb b/public/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb
new file mode 100644
index 0000000..d03a7c7
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/FoxitSymbol.pfb b/public/pdfjs/web/standard_fonts/FoxitSymbol.pfb
new file mode 100644
index 0000000..c8f9bca
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/FoxitSymbol.pfb
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/LICENSE_FOXIT b/public/pdfjs/web/standard_fonts/LICENSE_FOXIT
new file mode 100644
index 0000000..8b4ed6d
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/standard_fonts/LICENSE_LIBERATION b/public/pdfjs/web/standard_fonts/LICENSE_LIBERATION
new file mode 100644
index 0000000..aba73e8
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf b/public/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf
new file mode 100644
index 0000000..ee23715
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf b/public/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf
new file mode 100644
index 0000000..42b5717
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf b/public/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf
new file mode 100644
index 0000000..0cf6126
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf
Binary files differ
diff --git a/public/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf b/public/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf
new file mode 100644
index 0000000..366d148
--- /dev/null
+++ b/public/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf
Binary files differ
diff --git a/public/pdfjs/web/viewer.css b/public/pdfjs/web/viewer.css
new file mode 100644
index 0000000..845ac79
--- /dev/null
+++ b/public/pdfjs/web/viewer.css
@@ -0,0 +1,7827 @@
+/* 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.
+ */
+
+.messageBar{
+  --closing-button-icon:url(images/messageBar_closingButton.svg);
+  --message-bar-close-button-color:var(--text-primary-color);
+  --message-bar-close-button-color-hover:var(--text-primary-color);
+  --message-bar-close-button-border-radius:4px;
+  --message-bar-close-button-border:none;
+  --message-bar-close-button-hover-bg-color:light-dark(
+    rgb(21 20 26 / 0.14),
+    rgb(251 251 254 / 0.14)
+  );
+  --message-bar-close-button-active-bg-color:light-dark(
+    rgb(21 20 26 / 0.21),
+    rgb(251 251 254 / 0.21)
+  );
+  --message-bar-close-button-focus-bg-color:light-dark(
+    rgb(21 20 26 / 0.07),
+    rgb(251 251 254 / 0.07)
+  );
+
+  @media screen and (forced-colors: active){
+    --message-bar-close-button-color:ButtonText;
+    --message-bar-close-button-border:1px solid ButtonText;
+    --message-bar-close-button-hover-bg-color:ButtonText;
+    --message-bar-close-button-active-bg-color:ButtonText;
+    --message-bar-close-button-focus-bg-color:ButtonText;
+    --message-bar-close-button-color-hover:HighlightText;
+  }
+
+  display:flex;
+  position:relative;
+  padding:8px 8px 8px 16px;
+  flex-direction:column;
+  justify-content:center;
+  align-items:center;
+  gap:8px;
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+
+  border-radius:4px;
+
+  border:1px solid var(--message-bar-border-color);
+  background:var(--message-bar-bg-color);
+  color:var(--message-bar-fg-color);
+
+  > div{
+    display:flex;
+    align-items:flex-start;
+    gap:8px;
+    align-self:stretch;
+
+    &::before{
+      content:"";
+      display:inline-block;
+      width:16px;
+      height:16px;
+      -webkit-mask-image:var(--message-bar-icon);
+              mask-image:var(--message-bar-icon);
+      -webkit-mask-size:cover;
+              mask-size:cover;
+      background-color:var(--message-bar-icon-color);
+      flex-shrink:0;
+    }
+  }
+
+  button{
+    cursor:pointer;
+
+    &:focus-visible{
+      outline:var(--focus-ring-outline);
+      outline-offset:2px;
+    }
+  }
+
+  .closeButton{
+    width:32px;
+    height:32px;
+    background:none;
+    border-radius:var(--message-bar-close-button-border-radius);
+    border:var(--message-bar-close-button-border);
+
+    display:flex;
+    align-items:center;
+    justify-content:center;
+
+    &::before{
+      content:"";
+      display:inline-block;
+      width:16px;
+      height:16px;
+      -webkit-mask-image:var(--closing-button-icon);
+              mask-image:var(--closing-button-icon);
+      -webkit-mask-size:cover;
+              mask-size:cover;
+      background-color:var(--message-bar-close-button-color);
+    }
+
+    &:is(:hover, :active, :focus)::before{
+      background-color:var(--message-bar-close-button-color-hover);
+    }
+
+    &:hover{
+      background-color:var(--message-bar-close-button-hover-bg-color);
+    }
+
+    &:active{
+      background-color:var(--message-bar-close-button-active-bg-color);
+    }
+
+    &:focus{
+      background-color:var(--message-bar-close-button-focus-bg-color);
+    }
+
+    > span{
+      display:inline-block;
+      width:0;
+      height:0;
+      overflow:hidden;
+    }
+  }
+}
+
+#editorUndoBar{
+  --text-primary-color:light-dark(#15141a, #fbfbfe);
+
+  --message-bar-icon:url(images/messageBar_info.svg);
+  --message-bar-icon-color:light-dark(#0060df, #73a7f3);
+  --message-bar-bg-color:light-dark(#deeafc, #003070);
+  --message-bar-fg-color:var(--text-primary-color);
+  --message-bar-border-color:light-dark(
+    rgb(0 0 0 / 0.08),
+    rgb(255 255 255 / 0.08)
+  );
+
+  --undo-button-bg-color:light-dark(
+    rgb(21 20 26 / 0.07),
+    rgb(255 255 255 / 0.08)
+  );
+  --undo-button-bg-color-hover:light-dark(
+    rgb(21 20 26 / 0.14),
+    rgb(255 255 255 / 0.14)
+  );
+  --undo-button-bg-color-active:light-dark(
+    rgb(21 20 26 / 0.21),
+    rgb(255 255 255 / 0.21)
+  );
+
+  --undo-button-border:1px solid light-dark(#0060df, #0df);
+
+  --undo-button-fg-color:var(--message-bar-fg-color);
+  --undo-button-fg-color-hover:var(--undo-button-fg-color);
+  --undo-button-fg-color-active:var(--undo-button-fg-color);
+
+  @media screen and (forced-colors: active){
+    --text-primary-color:CanvasText;
+
+    --message-bar-icon-color:CanvasText;
+    --message-bar-bg-color:Canvas;
+    --message-bar-border-color:CanvasText;
+
+    --undo-button-bg-color:ButtonText;
+    --undo-button-bg-color-hover:SelectedItem;
+    --undo-button-bg-color-active:SelectedItem;
+
+    --undo-button-fg-color:ButtonFace;
+    --undo-button-fg-color-hover:SelectedItemText;
+    --undo-button-fg-color-active:SelectedItemText;
+
+    --undo-button-border:none;
+  }
+
+  position:fixed;
+  top:50px;
+  left:50%;
+  transform:translateX(-50%);
+  z-index:10;
+
+  padding-block:8px;
+  padding-inline:16px 8px;
+
+  font:menu;
+  font-size:15px;
+
+  cursor:default;
+
+  button{
+    cursor:pointer;
+  }
+
+  #editorUndoBarUndoButton{
+    border-radius:4px;
+    font-weight:590;
+    line-height:19.5px;
+    color:var(--undo-button-fg-color);
+    border:var(--undo-button-border);
+    padding:4px 16px;
+    margin-inline-start:8px;
+    height:32px;
+
+    background-color:var(--undo-button-bg-color);
+
+    &:hover{
+      background-color:var(--undo-button-bg-color-hover);
+      color:var(--undo-button-fg-color-hover);
+    }
+
+    &:active{
+      background-color:var(--undo-button-bg-color-active);
+      color:var(--undo-button-fg-color-active);
+    }
+  }
+
+  > div{
+    align-items:center;
+  }
+}
+
+.dialog{
+  --dialog-bg-color:light-dark(white, #1c1b22);
+  --dialog-border-color:light-dark(white, #1c1b22);
+  --dialog-shadow:0 2px 14px 0 light-dark(rgb(58 57 68 / 0.2), #15141a);
+  --text-primary-color:light-dark(#15141a, #fbfbfe);
+  --text-secondary-color:light-dark(#5b5b66, #cfcfd8);
+  --hover-filter:brightness(0.9);
+  --link-fg-color:light-dark(#0060df, #0df);
+  --link-hover-fg-color:light-dark(#0250bb, #80ebff);
+  --separator-color:light-dark(#f0f0f4, #52525e);
+
+  --textarea-border-color:#8f8f9d;
+  --textarea-bg-color:light-dark(white, #42414d);
+  --textarea-fg-color:var(--text-secondary-color);
+
+  --radio-bg-color:light-dark(#f0f0f4, #2b2a33);
+  --radio-checked-bg-color:light-dark(#fbfbfe, #15141a);
+  --radio-border-color:#8f8f9d;
+  --radio-checked-border-color:light-dark(#0060df, #0df);
+
+  --button-secondary-bg-color:light-dark(
+    rgb(21 20 26 / 0.07),
+    rgb(251 251 254 / 0.07)
+  );
+  --button-secondary-fg-color:var(--text-primary-color);
+  --button-secondary-border-color:var(--button-secondary-bg-color);
+  --button-secondary-active-bg-color:light-dark(
+    rgb(21 20 26 / 0.21),
+    rgb(251 251 254 / 0.21)
+  );
+  --button-secondary-active-fg-color:var(--button-secondary-fg-color);
+  --button-secondary-active-border-color:var(--button-secondary-bg-color);
+  --button-secondary-hover-bg-color:light-dark(
+    rgb(21 20 26 / 0.14),
+    rgb(251 251 254 / 0.14)
+  );
+  --button-secondary-hover-fg-color:var(--button-secondary-fg-color);
+  --button-secondary-hover-border-color:var(--button-secondary-hover-bg-color);
+  --button-secondary-disabled-bg-color:var(--button-secondary-bg-color);
+  --button-secondary-disabled-border-color:var(
+    --button-secondary-border-color
+  );
+  --button-secondary-disabled-fg-color:var(--button-secondary-fg-color);
+
+  --button-primary-bg-color:light-dark(#0060df, #0df);
+  --button-primary-fg-color:light-dark(#fbfbfe, #15141a);
+  --button-primary-border-color:var(--button-primary-bg-color);
+  --button-primary-active-bg-color:light-dark(#054096, #aaf2ff);
+  --button-primary-active-fg-color:var(--button-primary-fg-color);
+  --button-primary-active-border-color:var(--button-primary-active-bg-color);
+  --button-primary-hover-bg-color:light-dark(#0250bb, #80ebff);
+  --button-primary-hover-fg-color:var(--button-primary-fg-color);
+  --button-primary-hover-border-color:var(--button-primary-hover-bg-color);
+  --button-primary-disabled-bg-color:var(--button-primary-bg-color);
+  --button-primary-disabled-border-color:var(--button-primary-border-color);
+  --button-primary-disabled-fg-color:var(--button-primary-fg-color);
+  --button-disabled-opacity:0.4;
+
+  --input-text-bg-color:light-dark(white, #42414d);
+  --input-text-fg-color:var(--text-primary-color);
+
+  @media (prefers-color-scheme: dark){
+    --hover-filter:brightness(1.4);
+    --button-disabled-opacity:0.6;
+  }
+
+  @media screen and (forced-colors: active){
+    --dialog-bg-color:Canvas;
+    --dialog-border-color:CanvasText;
+    --dialog-shadow:none;
+    --text-primary-color:CanvasText;
+    --text-secondary-color:CanvasText;
+    --hover-filter:none;
+    --link-fg-color:LinkText;
+    --link-hover-fg-color:LinkText;
+    --separator-color:CanvasText;
+
+    --textarea-border-color:ButtonBorder;
+    --textarea-bg-color:Field;
+    --textarea-fg-color:ButtonText;
+
+    --radio-bg-color:ButtonFace;
+    --radio-checked-bg-color:ButtonFace;
+    --radio-border-color:ButtonText;
+    --radio-checked-border-color:ButtonText;
+
+    --button-secondary-bg-color:ButtonFace;
+    --button-secondary-fg-color:ButtonText;
+    --button-secondary-border-color:ButtonText;
+    --button-secondary-active-bg-color:HighlightText;
+    --button-secondary-active-fg-color:SelectedItem;
+    --button-secondary-active-border-color:ButtonText;
+    --button-secondary-hover-bg-color:HighlightText;
+    --button-secondary-hover-fg-color:SelectedItem;
+    --button-secondary-hover-border-color:SelectedItem;
+    --button-secondary-disabled-fg-color:GrayText;
+    --button-secondary-disabled-border-color:GrayText;
+
+    --button-primary-bg-color:ButtonText;
+    --button-primary-fg-color:ButtonFace;
+    --button-primary-border-color:ButtonText;
+    --button-primary-active-bg-color:SelectedItem;
+    --button-primary-active-fg-color:HighlightText;
+    --button-primary-active-border-color:ButtonText;
+    --button-primary-hover-bg-color:SelectedItem;
+    --button-primary-hover-fg-color:HighlightText;
+    --button-primary-hover-border-color:SelectedItem;
+    --button-primary-disabled-bg-color:GrayText;
+    --button-primary-disabled-fg-color:ButtonFace;
+    --button-primary-disabled-border-color:GrayText;
+    --button-disabled-opacity:1;
+
+    --input-text-bg-color:Field;
+    --input-text-fg-color:FieldText;
+  }
+
+  font:message-box;
+  font-size:13px;
+  font-weight:400;
+  line-height:150%;
+  border-radius:4px;
+  padding:12px 16px;
+  border:1px solid var(--dialog-border-color);
+  background:var(--dialog-bg-color);
+  color:var(--text-primary-color);
+  box-shadow:var(--dialog-shadow);
+
+  .mainContainer{
+    *:focus-visible{
+      outline:var(--focus-ring-outline);
+      outline-offset:2px;
+    }
+
+    .title{
+      display:flex;
+      width:auto;
+      flex-direction:column;
+      justify-content:flex-end;
+      align-items:flex-start;
+      gap:12px;
+
+      > span{
+        font-size:13px;
+        font-style:normal;
+        font-weight:590;
+        line-height:150%;
+      }
+    }
+
+    .dialogSeparator{
+      width:100%;
+      height:0;
+      margin-block:4px;
+      border-top:1px solid var(--separator-color);
+      border-bottom:none;
+    }
+
+    .dialogButtonsGroup{
+      display:flex;
+      gap:12px;
+      align-self:flex-end;
+    }
+
+    .radio{
+      display:flex;
+      flex-direction:column;
+      align-items:flex-start;
+      gap:4px;
+
+      > .radioButton{
+        display:flex;
+        gap:8px;
+        align-self:stretch;
+        align-items:center;
+
+        input{
+          -webkit-appearance:none;
+             -moz-appearance:none;
+                  appearance:none;
+          box-sizing:border-box;
+          width:16px;
+          height:16px;
+          border-radius:50%;
+          background-color:var(--radio-bg-color);
+          border:1px solid var(--radio-border-color);
+
+          &:hover{
+            filter:var(--hover-filter);
+          }
+
+          &:checked{
+            background-color:var(--radio-checked-bg-color);
+            border:4px solid var(--radio-checked-border-color);
+          }
+        }
+      }
+
+      > .radioLabel{
+        display:flex;
+        padding-inline-start:24px;
+        align-items:flex-start;
+        gap:10px;
+        align-self:stretch;
+
+        > span{
+          flex:1 0 0;
+          font-size:11px;
+          color:var(--text-secondary-color);
+        }
+      }
+    }
+
+    button:not(:is(.toggle-button, .closeButton, .clearInputButton)){
+      border-radius:4px;
+      border:1px solid;
+      font:menu;
+      font-weight:590;
+      font-size:13px;
+      padding:4px 16px;
+      width:auto;
+      height:32px;
+
+      &:hover{
+        cursor:pointer;
+        filter:var(--hover-filter);
+      }
+
+      > span{
+        color:inherit;
+        font:inherit;
+      }
+
+      &.secondaryButton{
+        color:var(--button-secondary-fg-color);
+        background-color:var(--button-secondary-bg-color);
+        border-color:var(--button-secondary-border-color);
+
+        &:hover{
+          color:var(--button-secondary-hover-fg-color);
+          background-color:var(--button-secondary-hover-bg-color);
+          border-color:var(--button-secondary-hover-border-color);
+        }
+
+        &:active{
+          color:var(--button-secondary-active-fg-color);
+          background-color:var(--button-secondary-active-bg-color);
+          border-color:var(--button-secondary-active-border-color);
+        }
+
+        &:disabled{
+          background-color:var(--button-secondary-disabled-bg-color);
+          border-color:var(--button-secondary-disabled-border-color);
+          color:var(--button-secondary-disabled-fg-color);
+          opacity:var(--button-disabled-opacity);
+        }
+      }
+
+      &.primaryButton{
+        color:var(--button-primary-fg-color);
+        background-color:var(--button-primary-bg-color);
+        border-color:var(--button-primary-border-color);
+        opacity:1;
+
+        &:hover{
+          color:var(--button-primary-hover-fg-color);
+          background-color:var(--button-primary-hover-bg-color);
+          border-color:var(--button-primary-hover-border-color);
+        }
+
+        &:active{
+          color:var(--button-primary-active-fg-color);
+          background-color:var(--button-primary-active-bg-color);
+          border-color:var(--button-primary-active-border-color);
+        }
+
+        &:disabled{
+          background-color:var(--button-primary-disabled-bg-color);
+          border-color:var(--button-primary-disabled-border-color);
+          color:var(--button-primary-disabled-fg-color);
+          opacity:var(--button-disabled-opacity);
+        }
+      }
+
+      &:disabled{
+        pointer-events:none;
+      }
+    }
+
+    a{
+      color:var(--link-fg-color);
+
+      &:hover{
+        color:var(--link-hover-fg-color);
+      }
+    }
+
+    textarea{
+      font:inherit;
+      padding:8px;
+      resize:none;
+      margin:0;
+      box-sizing:border-box;
+      border-radius:4px;
+      border:1px solid var(--textarea-border-color);
+      background:var(--textarea-bg-color);
+      color:var(--textarea-fg-color);
+
+      &:focus{
+        outline-offset:0;
+        border-color:transparent;
+      }
+
+      &:disabled{
+        pointer-events:none;
+        opacity:0.4;
+      }
+    }
+
+    input[type="text"]{
+      background-color:var(--input-text-bg-color);
+      color:var(--input-text-fg-color);
+    }
+
+    .messageBar{
+      --message-bar-bg-color:light-dark(#ffebcd, #5a3100);
+      --message-bar-fg-color:light-dark(#15141a, #fbfbfe);
+      --message-bar-border-color:light-dark(
+        rgb(0 0 0 / 0.08),
+        rgb(255 255 255 / 0.08)
+      );
+      --message-bar-icon:url(images/messageBar_warning.svg);
+      --message-bar-icon-color:light-dark(#cd411e, #e49c49);
+
+      @media screen and (forced-colors: active){
+        --message-bar-bg-color:HighlightText;
+        --message-bar-fg-color:CanvasText;
+        --message-bar-border-color:CanvasText;
+        --message-bar-icon-color:CanvasText;
+      }
+
+      align-self:stretch;
+
+      > div{
+        &::before,
+        > div{
+          margin-block:4px;
+        }
+
+        > div{
+          display:flex;
+          flex-direction:column;
+          align-items:flex-start;
+          gap:8px;
+          flex:1 0 0;
+
+          .title{
+            font-size:13px;
+            font-weight:590;
+          }
+
+          .description{
+            font-size:13px;
+          }
+        }
+      }
+    }
+
+    .toggler{
+      display:flex;
+      align-items:center;
+      gap:8px;
+      align-self:stretch;
+
+      > .togglerLabel{
+        -webkit-user-select:none;
+           -moz-user-select:none;
+                user-select:none;
+      }
+    }
+  }
+}
+
+.textLayer{
+  color-scheme:only light;
+
+  position:absolute;
+  text-align:initial;
+  inset:0;
+  overflow:clip;
+  opacity:1;
+  line-height:1;
+  letter-spacing:normal;
+  word-spacing:normal;
+  -webkit-text-size-adjust:none;
+     -moz-text-size-adjust:none;
+          text-size-adjust:none;
+  forced-color-adjust:none;
+  transform-origin:0 0;
+  caret-color:CanvasText;
+  z-index:0;
+
+  &.highlighting{
+    touch-action:none;
+  }
+
+  :is(span, br){
+    color:transparent;
+    position:absolute;
+    white-space:pre;
+    cursor:text;
+    transform-origin:0% 0%;
+    -webkit-user-select:text;
+       -moz-user-select:text;
+            user-select:text;
+  }
+  --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;
+    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"]{
+    -webkit-user-select:none;
+       -moz-user-select:none;
+            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);
+      scroll-margin-top:50px;
+    }
+  }
+
+  ::-moz-selection{
+    background:rgba(0 0 255 / 0.25);
+    background:color-mix(in srgb, AccentColor, transparent 50%);
+    color:transparent;
+  }
+
+  ::selection{
+    background:rgba(0 0 255 / 0.25);
+    background:color-mix(in srgb, AccentColor, transparent 50%);
+    color:transparent;
+  }
+
+  &.selectionRendering{
+    ::-moz-selection{
+      background:transparent;
+      color:transparent;
+    }
+    ::selection{
+      background:transparent;
+      color:transparent;
+    }
+  }
+  br::-moz-selection{
+    background:transparent;
+  }
+  br::selection{
+    background:transparent;
+  }
+
+  .endOfContent{
+    display:block;
+    position:absolute;
+    inset:100% 0 0;
+    z-index:0;
+    cursor:default;
+    -webkit-user-select:none;
+       -moz-user-select:none;
+            user-select:none;
+  }
+
+  &.selecting .endOfContent{
+    top:0;
+  }
+}
+
+.textLayerImages{
+  position:absolute;
+  inset:0;
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+
+  canvas{
+    position:absolute;
+    transform-origin:0% 0%;
+  }
+}
+
+.annotationLayer{
+  color-scheme:only light;
+
+  --annotation-unfocused-field-background:url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>");
+  --annotation-unfocused-field-filter:url("data:image/svg+xml;charset=UTF-8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='pdfjsFillableField' x='0%' y='0%' width='100%' height='100%' color-interpolation-filters='sRGB'><feFlood flood-color='rgb(0,54,255)' flood-opacity='0.13' result='f'/><feComposite in='f' in2='SourceGraphic' operator='over'/></filter></svg>#pdfjsFillableField");
+  --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;
+    -webkit-user-select:none;
+       -moz-user-select:none;
+            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;
+    }
+  }
+  .hasOwnCanvas:not(.sandboxModified) :is(input, textarea){
+    display:none;
+  }
+
+  .hasOwnCanvas.sandboxModified canvas.annotationContent{
+    display:none;
+  }
+
+  .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;
+  }
+
+  .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:is(.checkBox, .radioButton){
+    [data-canvas-name]{
+      filter:var(--annotation-unfocused-field-filter);
+    }
+
+    &:focus-within [data-canvas-name]{
+      filter:none;
+    }
+
+    [data-canvas-name="checked"]{
+      &:has(~ input:checked){
+        display:block;
+      }
+
+      &:has(~ input:not(:checked)){
+        display:none;
+      }
+    }
+
+    [data-canvas-name="unchecked"]{
+      &:has(~ input:checked){
+        display:none;
+      }
+
+      &:has(~ input:not(:checked)){
+        display:block;
+      }
+    }
+  }
+
+  .textWidgetAnnotation input.comb{
+    --comb-width:0px;
+    --comb-letter-spacing:calc(var(--comb-width) - 1ch);
+
+    font-family:monospace;
+    letter-spacing:var(--comb-letter-spacing);
+    overflow-x:hidden;
+    padding:0;
+    text-indent:calc(
+      var(--comb-offset, 0) * var(--comb-width) + var(--comb-letter-spacing) / 2
+    );
+  }
+
+  .textWidgetAnnotation input.comb:focus{
+    background-image:repeating-linear-gradient(
+      to right,
+      transparent 0 calc(var(--comb-width) - 1px),
+      var(--input-focus-border-color) calc(var(--comb-width) - 1px)
+        var(--comb-width)
+    );
+  }
+
+  .buttonWidgetAnnotation:is(.checkBox, .radioButton) input{
+    -webkit-appearance:none;
+       -moz-appearance:none;
+            appearance:none;
+  }
+
+  .buttonWidgetAnnotation:is(.checkBox, .radioButton):has(
+      [data-canvas-name="checked"]
+    )
+    input:checked,
+  .buttonWidgetAnnotation:is(.checkBox, .radioButton):has(
+      [data-canvas-name="unchecked"]
+    )
+    input:not(:checked){
+    background-image:none;
+  }
+
+  .fileAttachmentAnnotation .popupTriggerArea{
+    height:100%;
+    width:100%;
+  }
+
+  .mediaAnnotation{
+    pointer-events:auto;
+
+    .mediaContent{
+      width:100%;
+    }
+
+    video.mediaContent{
+      height:100%;
+      -o-object-fit:contain;
+         object-fit:contain;
+    }
+
+    audio.mediaContent{
+      position:absolute;
+      bottom:0;
+    }
+
+    .mediaPlayButton{
+      height:100%;
+      width:100%;
+      margin:0;
+      padding:0;
+      border:none;
+      cursor:pointer;
+      background-color:transparent;
+      background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' fill='rgba(0,0,0,0.55)'/%3E%3Cpath d='M40 32 L70 50 L40 68 Z' fill='white'/%3E%3C/svg%3E");
+      background-position:center;
+      background-repeat:no-repeat;
+      background-size:calc(48px * var(--total-scale-factor));
+
+      &:hover{
+        background-color:rgba(255 255 255 / 0.1);
+      }
+    }
+  }
+
+  .popupAnnotation{
+    position:absolute;
+    font-size:calc(9px * var(--total-scale-factor));
+    pointer-events:none;
+    width:-moz-max-content;
+    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;
+    -webkit-user-select:text;
+       -moz-user-select:text;
+            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:-moz-fit-content;
+    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;
+    -webkit-user-select:none;
+       -moz-user-select:none;
+            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;
+  }
+}
+
+:root{
+  --xfa-unfocused-field-background:url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>");
+  --xfa-focus-outline:auto;
+}
+
+@media screen and (forced-colors: active){
+  :root{
+    --xfa-focus-outline:2px solid CanvasText;
+  }
+  .xfaLayer *:required{
+    outline:1.5px solid selectedItem;
+  }
+}
+
+.xfaLayer{
+  color-scheme:only light;
+
+  background-color:transparent;
+}
+
+.xfaLayer .highlight{
+  margin:-1px;
+  padding:1px;
+  background-color:rgb(239 203 237);
+  border-radius:4px;
+}
+
+.xfaLayer .highlight.appended{
+  position:initial;
+}
+
+.xfaLayer .highlight.begin{
+  border-radius:4px 0 0 4px;
+}
+
+.xfaLayer .highlight.end{
+  border-radius:0 4px 4px 0;
+}
+
+.xfaLayer .highlight.middle{
+  border-radius:0;
+}
+
+.xfaLayer .highlight.selected{
+  background-color:rgb(203 223 203);
+}
+
+.xfaPage{
+  overflow:hidden;
+  position:relative;
+}
+
+.xfaContentarea{
+  position:absolute;
+}
+
+.xfaPrintOnly{
+  display:none;
+}
+
+.xfaLayer{
+  position:absolute;
+  text-align:initial;
+  top:0;
+  left:0;
+  transform-origin:0 0;
+  line-height:1.2;
+}
+
+.xfaLayer *{
+  color:inherit;
+  font:inherit;
+  font-style:inherit;
+  font-weight:inherit;
+  font-kerning:inherit;
+  letter-spacing:-0.01px;
+  text-align:inherit;
+  text-decoration:inherit;
+  box-sizing:border-box;
+  background-color:transparent;
+  padding:0;
+  margin:0;
+  pointer-events:auto;
+  line-height:inherit;
+}
+
+.xfaLayer *:required{
+  outline:1.5px solid red;
+}
+
+.xfaLayer div,
+.xfaLayer svg,
+.xfaLayer svg *{
+  pointer-events:none;
+}
+
+.xfaLayer a{
+  color:blue;
+}
+
+.xfaRich li{
+  margin-left:3em;
+}
+
+.xfaFont{
+  color:black;
+  font-weight:normal;
+  font-kerning:none;
+  font-size:10px;
+  font-style:normal;
+  letter-spacing:0;
+  text-decoration:none;
+  vertical-align:0;
+}
+
+.xfaCaption{
+  overflow:hidden;
+  flex:0 0 auto;
+}
+
+.xfaCaptionForCheckButton{
+  overflow:hidden;
+  flex:1 1 auto;
+}
+
+.xfaLabel{
+  height:100%;
+  width:100%;
+}
+
+.xfaLeft{
+  display:flex;
+  flex-direction:row;
+  align-items:center;
+}
+
+.xfaRight{
+  display:flex;
+  flex-direction:row-reverse;
+  align-items:center;
+}
+
+:is(.xfaLeft, .xfaRight) > :is(.xfaCaption, .xfaCaptionForCheckButton){
+  max-height:100%;
+}
+
+.xfaTop{
+  display:flex;
+  flex-direction:column;
+  align-items:flex-start;
+}
+
+.xfaBottom{
+  display:flex;
+  flex-direction:column-reverse;
+  align-items:flex-start;
+}
+
+:is(.xfaTop, .xfaBottom) > :is(.xfaCaption, .xfaCaptionForCheckButton){
+  width:100%;
+}
+
+.xfaBorder{
+  background-color:transparent;
+  position:absolute;
+  pointer-events:none;
+}
+
+.xfaWrapped{
+  width:100%;
+  height:100%;
+}
+
+:is(.xfaTextfield, .xfaSelect):focus{
+  background-image:none;
+  background-color:transparent;
+  outline:var(--xfa-focus-outline);
+  outline-offset:-1px;
+}
+
+:is(.xfaCheckbox, .xfaRadio):focus{
+  outline:var(--xfa-focus-outline);
+}
+
+.xfaTextfield,
+.xfaSelect{
+  height:100%;
+  width:100%;
+  flex:1 1 auto;
+  border:none;
+  resize:none;
+  background-image:var(--xfa-unfocused-field-background);
+}
+
+.xfaSelect{
+  padding-inline:2px;
+}
+
+:is(.xfaTop, .xfaBottom) > :is(.xfaTextfield, .xfaSelect){
+  flex:0 1 auto;
+}
+
+.xfaButton{
+  cursor:pointer;
+  width:100%;
+  height:100%;
+  border:none;
+  text-align:center;
+}
+
+.xfaLink{
+  width:100%;
+  height:100%;
+  position:absolute;
+  top:0;
+  left:0;
+}
+
+.xfaCheckbox,
+.xfaRadio{
+  width:100%;
+  height:100%;
+  flex:0 0 auto;
+  border:none;
+}
+
+.xfaRich{
+  white-space:pre-wrap;
+  width:100%;
+  height:100%;
+}
+
+.xfaImage{
+  -o-object-position:left top;
+     object-position:left top;
+  -o-object-fit:contain;
+     object-fit:contain;
+  width:100%;
+  height:100%;
+}
+
+.xfaLrTb,
+.xfaRlTb,
+.xfaTb{
+  display:flex;
+  flex-direction:column;
+  align-items:stretch;
+}
+
+.xfaLr{
+  display:flex;
+  flex-direction:row;
+  align-items:stretch;
+}
+
+.xfaRl{
+  display:flex;
+  flex-direction:row-reverse;
+  align-items:stretch;
+}
+
+.xfaTb > div{
+  justify-content:left;
+}
+
+.xfaPosition{
+  position:relative;
+}
+
+.xfaArea{
+  position:relative;
+}
+
+.xfaValignMiddle{
+  display:flex;
+  align-items:center;
+}
+
+.xfaTable{
+  display:flex;
+  flex-direction:column;
+  align-items:stretch;
+}
+
+.xfaTable .xfaRow{
+  display:flex;
+  flex-direction:row;
+  align-items:stretch;
+}
+
+.xfaTable .xfaRlRow{
+  display:flex;
+  flex-direction:row-reverse;
+  align-items:stretch;
+  flex:1;
+}
+
+.xfaTable .xfaRlRow > div{
+  flex:1;
+}
+
+:is(.xfaNonInteractive, .xfaDisabled, .xfaReadOnly) :is(input, textarea){
+  background:initial;
+}
+
+@media print{
+  .xfaTextfield,
+  .xfaSelect{
+    background:transparent;
+  }
+
+  .xfaSelect{
+    -webkit-appearance:none;
+       -moz-appearance:none;
+            appearance:none;
+    text-indent:1px;
+    text-overflow:"";
+  }
+}
+
+.canvasWrapper{
+  svg{
+    transform:none;
+
+    &.moving{
+      z-index:100000;
+    }
+
+    &.highlight,
+    &.highlightOutline{
+      &[data-main-rotation="90"]{
+        mask,
+        use:not(.clip, .mask){
+          transform:matrix(0, 1, -1, 0, 1, 0);
+        }
+      }
+
+      &[data-main-rotation="180"]{
+        mask,
+        use:not(.clip, .mask){
+          transform:matrix(-1, 0, 0, -1, 1, 1);
+        }
+      }
+
+      &[data-main-rotation="270"]{
+        mask,
+        use:not(.clip, .mask){
+          transform:matrix(0, -1, 1, 0, 0, 1);
+        }
+      }
+    }
+
+    &.draw{
+      position:absolute;
+      mix-blend-mode:normal;
+
+      &[data-draw-rotation="90"]{
+        transform:rotate(90deg);
+      }
+
+      &[data-draw-rotation="180"]{
+        transform:rotate(180deg);
+      }
+
+      &[data-draw-rotation="270"]{
+        transform:rotate(270deg);
+      }
+    }
+
+    &.highlight{
+      --blend-mode:multiply;
+
+      @media screen and (forced-colors: active){
+        --blend-mode:difference;
+      }
+
+      position:absolute;
+      mix-blend-mode:var(--blend-mode);
+
+      &:not(.free){
+        fill-rule:evenodd;
+      }
+    }
+
+    &.highlightOutline{
+      position:absolute;
+      mix-blend-mode:normal;
+      fill-rule:evenodd;
+      fill:none;
+
+      &:not(.free){
+        &.hovered:not(.selected){
+          stroke:var(--hover-outline-color);
+          stroke-width:var(--outline-width);
+        }
+
+        &.selected{
+          .mainOutline{
+            stroke:var(--outline-around-color);
+            stroke-width:calc(
+              var(--outline-width) + 2 * var(--outline-around-width)
+            );
+          }
+
+          .secondaryOutline{
+            stroke:var(--outline-color);
+            stroke-width:var(--outline-width);
+          }
+        }
+      }
+
+      &.free{
+        &.hovered:not(.selected){
+          stroke:var(--hover-outline-color);
+          stroke-width:calc(2 * var(--outline-width));
+        }
+
+        &.selected{
+          .mainOutline{
+            stroke:var(--outline-around-color);
+            stroke-width:calc(
+              2 * (var(--outline-width) + var(--outline-around-width))
+            );
+          }
+
+          .secondaryOutline{
+            stroke:var(--outline-color);
+            stroke-width:calc(2 * var(--outline-width));
+          }
+        }
+      }
+    }
+  }
+}
+
+.toggle-button{
+  --button-background-color:color-mix(in srgb, currentColor 7%, transparent);
+  --button-background-color-hover:color-mix(
+    in srgb,
+    currentColor 14%,
+    transparent
+  );
+  --button-background-color-active:color-mix(
+    in srgb,
+    currentColor 21%,
+    transparent
+  );
+  --color-accent-primary:light-dark(#0060df, #0df);
+  --color-accent-primary-hover:light-dark(#0250bb, #80ebff);
+  --color-accent-primary-active:light-dark(#054096, #aaf2ff);
+  --border-radius-circle:9999px;
+  --border-width:1px;
+  --size-item-small:16px;
+  --size-item-large:32px;
+  --color-canvas:light-dark(white, #1c1b22);
+  --background-color-canvas:var(--color-canvas);
+  --border-color-interactive:light-dark(#8f8f9d, #f9f9fa);
+  --border-color-interactive-hover:var(--border-color-interactive);
+  --border-color-interactive-active:var(--border-color-interactive);
+  --focus-outline-offset:2px;
+
+  @media (forced-colors: active){
+    --color-accent-primary:ButtonText;
+    --color-accent-primary-hover:SelectedItem;
+    --color-accent-primary-active:SelectedItem;
+    --button-background-color:ButtonFace;
+    --border-color-interactive:ButtonText;
+    --border-color-interactive-hover:SelectedItem;
+    --border-color-interactive-active:ButtonText;
+    --color-canvas:ButtonText;
+    --background-color-canvas:Canvas;
+  }
+}
+
+.toggle-button{
+  --toggle-background-color:var(--button-background-color);
+  --toggle-background-color-hover:var(--button-background-color-hover);
+  --toggle-background-color-active:var(--button-background-color-active);
+  --toggle-background-color-pressed:var(--color-accent-primary);
+  --toggle-background-color-pressed-hover:var(--color-accent-primary-hover);
+  --toggle-background-color-pressed-active:var(--color-accent-primary-active);
+  --toggle-border-color:var(--border-color-interactive);
+  --toggle-border-color-hover:var(--toggle-border-color);
+  --toggle-border-color-active:var(--toggle-border-color);
+  --toggle-border-radius:var(--border-radius-circle);
+  --toggle-border-width:var(--border-width);
+  --toggle-height:var(--size-item-small);
+  --toggle-width:var(--size-item-large);
+  --toggle-dot-background-color:var(--toggle-border-color);
+  --toggle-dot-background-color-hover:var(--toggle-dot-background-color);
+  --toggle-dot-background-color-active:var(--toggle-dot-background-color);
+  --toggle-dot-background-color-on-pressed:var(--background-color-canvas);
+  --toggle-dot-margin:1px;
+  --toggle-dot-height:calc(
+    var(--toggle-height) - 2 * var(--toggle-dot-margin) - 2 *
+      var(--toggle-border-width)
+  );
+  --toggle-dot-width:var(--toggle-dot-height);
+  --toggle-dot-transform-x:calc(
+    var(--toggle-width) - 4 * var(--toggle-dot-margin) - var(--toggle-dot-width)
+  );
+  --input-width:var(--toggle-width);
+
+  -webkit-appearance:none;
+
+     -moz-appearance:none;
+
+          appearance:none;
+  padding:0;
+  border:var(--toggle-border-width) solid var(--toggle-border-color);
+  height:var(--toggle-height);
+  width:var(--toggle-width);
+  border-radius:var(--toggle-border-radius);
+  background-color:var(--toggle-background-color);
+  box-sizing:border-box;
+
+  &:focus-visible{
+    outline:var(--focus-outline);
+    outline-offset:var(--focus-outline-offset);
+  }
+
+  &:enabled:hover{
+    background-color:var(--toggle-background-color-hover);
+    border-color:var(--toggle-border-color);
+  }
+
+  &:enabled:hover:active{
+    background-color:var(--toggle-background-color-active);
+    border-color:var(--toggle-border-color);
+  }
+
+  &::before{
+    display:block;
+    content:"";
+    background-color:var(--toggle-dot-background-color);
+    height:var(--toggle-dot-height);
+    width:var(--toggle-dot-width);
+    margin:var(--toggle-dot-margin);
+    border-radius:var(--toggle-border-radius);
+    translate:0;
+  }
+}
+
+.toggle-button[aria-pressed="true"]{
+  background-color:var(--toggle-background-color-pressed);
+  border-color:transparent;
+
+  &:enabled:hover{
+    background-color:var(--toggle-background-color-pressed-hover);
+    border-color:transparent;
+  }
+
+  &:enabled:hover:active{
+    background-color:var(--toggle-background-color-pressed-active);
+    border-color:transparent;
+  }
+
+  &::before{
+    translate:var(--toggle-dot-transform-x);
+    background-color:var(--toggle-dot-background-color-on-pressed);
+  }
+
+  &:enabled:hover::before,
+  &:enabled:hover:active::before{
+    background-color:var(--toggle-dot-background-color-on-pressed);
+  }
+
+  &:-moz-locale-dir(rtl)::before,
+  &:dir(rtl)::before{
+    translate:calc(-1 * var(--toggle-dot-transform-x));
+  }
+}
+
+@media (prefers-reduced-motion: no-preference){
+  .toggle-button::before{
+    transition:translate 100ms;
+  }
+}
+
+@media (prefers-contrast){
+  .toggle-button:enabled:hover{
+    border-color:var(--toggle-border-color-hover);
+  }
+
+  .toggle-button:enabled:hover:active{
+    border-color:var(--toggle-border-color-active);
+  }
+
+  .toggle-button[aria-pressed="true"]:enabled{
+    border-color:var(--toggle-border-color);
+    position:relative;
+
+    &:hover{
+      border-color:var(--toggle-border-color-hover);
+
+      &:active{
+        background-color:var(--toggle-dot-background-color-active);
+        border-color:var(--toggle-dot-background-color-hover);
+      }
+    }
+  }
+
+  .toggle-button:enabled:hover::before,
+  .toggle-button:enabled:hover:active::before{
+    background-color:var(--toggle-dot-background-color-hover);
+  }
+}
+
+@media (forced-colors){
+  .toggle-button{
+    --toggle-dot-background-color:var(--color-accent-primary);
+    --toggle-dot-background-color-hover:var(--color-accent-primary-hover);
+    --toggle-dot-background-color-active:var(--color-accent-primary-active);
+    --toggle-dot-background-color-on-pressed:var(--button-background-color);
+    --toggle-border-color-hover:var(--border-color-interactive-hover);
+    --toggle-border-color-active:var(--border-color-interactive-active);
+  }
+
+  .toggle-button[aria-pressed="true"]:enabled::after{
+    border:1px solid var(--button-background-color);
+    content:"";
+    position:absolute;
+    height:var(--toggle-height);
+    width:var(--toggle-width);
+    display:block;
+    border-radius:var(--toggle-border-radius);
+    inset:-2px;
+  }
+
+  .toggle-button[aria-pressed="true"]:enabled:hover:active::after{
+    border-color:var(--toggle-border-color-active);
+  }
+}
+
+:root{
+  --clear-signature-button-icon:url(images/editor-toolbar-delete.svg);
+  --signature-bg:light-dark(#f9f9fb, #2b2a33);
+  --signature-hover-bg:light-dark(#f0f0f4, var(--signature-bg));
+  --button-signature-bg:transparent;
+  --button-signature-color:var(--main-color);
+  --button-signature-active-bg:light-dark(#cfcfd8, #5b5b66);
+  --button-signature-active-border:none;
+  --button-signature-active-color:var(--button-signature-color);
+  --button-signature-border:none;
+  --button-signature-hover-bg:light-dark(#e0e0e6, #52525e);
+  --button-signature-hover-color:var(--button-signature-color);
+
+  @media screen and (forced-colors: active){
+    --signature-bg:HighlightText;
+    --signature-hover-bg:var(--signature-bg);
+    --button-signature-bg:HighlightText;
+    --button-signature-color:ButtonText;
+    --button-signature-active-bg:ButtonText;
+    --button-signature-active-color:HighlightText;
+    --button-signature-border:1px solid ButtonText;
+    --button-signature-hover-bg:Highlight;
+    --button-signature-hover-color:HighlightText;
+  }
+}
+
+.signatureDialog{
+  --primary-color:var(--text-primary-color);
+  --border-color:#8f8f9d;
+  --open-link-fg:var(--link-fg-color);
+  --open-link-hover-fg:var(--link-hover-fg-color);
+
+  @media screen and (forced-colors: active){
+    --primary-color:ButtonText;
+    --border-color:ButtonText;
+    --open-link-fg:ButtonText;
+    --open-link-hover-fg:ButtonText;
+  }
+
+  width:570px;
+  max-width:100%;
+  min-width:300px;
+  padding:16px 0;
+
+  .mainContainer{
+    width:100%;
+    display:flex;
+    flex-direction:column;
+    align-items:flex-start;
+    gap:12px;
+
+    span:not([role="sectionhead"]){
+      font-size:13px;
+      font-style:normal;
+      font-weight:400;
+      line-height:normal;
+    }
+
+    .title{
+      margin-inline-start:16px;
+    }
+  }
+
+  .inputWithClearButton{
+    --button-dimension:24px;
+    --clear-button-icon:url(images/messageBar_closingButton.svg);
+
+    width:100%;
+    position:relative;
+    display:flex;
+    align-items:center;
+    justify-content:center;
+
+    > input{
+      width:100%;
+      height:32px;
+      padding-inline:8px calc(4px + var(--button-dimension));
+      box-sizing:border-box;
+      border-radius:4px;
+      border:1px solid var(--border-color);
+    }
+
+    .clearInputButton{
+      position:absolute;
+      inset-block-start:4px;
+      inset-inline-end:4px;
+      display:inline-block;
+      width:var(--button-dimension);
+      height:var(--button-dimension);
+      background-color:var(--input-text-fg-color);
+      -webkit-mask-size:cover;
+              mask-size:cover;
+      -webkit-mask-image:var(--clear-button-icon);
+              mask-image:var(--clear-button-icon);
+      padding:0;
+      border:0;
+    }
+  }
+}
+
+#addSignatureDialog{
+  --secondary-color:var(--text-secondary-color);
+  --bg-hover:#e0e0e6;
+  --tab-top-line-active-color:#0060df;
+  --tab-top-line-active-hover-color:var(--tab-text-hover-color);
+  --tab-top-line-hover-color:#8f8f9d;
+  --tab-top-line-inactive-color:#cfcfd8;
+  --tab-bottom-line-active-color:var(--tab-top-line-inactive-color);
+  --tab-bottom-line-hover-color:var(--tab-top-line-inactive-color);
+  --tab-bottom-line-inactive-color:var(--tab-top-line-inactive-color);
+  --tab-bg:var(--dialog-bg-color);
+  --tab-bg-active-color:var(--tab-bg);
+  --tab-bg-active-hover-color:var(--bg-hover);
+  --tab-bg-hover:var(--bg-hover);
+  --tab-panel-border:none;
+  --tab-panel-border-radius:4px;
+  --tab-text-color:var(--primary-color);
+  --tab-text-active-color:var(--tab-top-line-active-color);
+  --tab-text-active-hover-color:var(--tab-text-hover-color);
+  --tab-text-hover-color:var(--tab-text-color);
+  --signature-placeholder-color:var(--secondary-color);
+  --signature-draw-placeholder-color:var(--primary-color);
+  --signature-color:var(--primary-color);
+  --clear-signature-button-border-width:0;
+  --clear-signature-button-border-style:solid;
+  --clear-signature-button-border-color:transparent;
+  --clear-signature-button-border-disabled-color:transparent;
+  --clear-signature-button-color:var(--primary-color);
+  --clear-signature-button-hover-color:var(--clear-signature-button-color);
+  --clear-signature-button-active-color:var(--clear-signature-button-color);
+  --clear-signature-button-disabled-color:var(--clear-signature-button-color);
+  --clear-signature-button-focus-color:var(--clear-signature-button-color);
+  --clear-signature-button-bg:var(--dialog-bg-color);
+  --clear-signature-button-bg-hover:var(--bg-hover);
+  --clear-signature-button-bg-active:#cfcfd8;
+  --clear-signature-button-bg-focus:#f0f0f4;
+  --clear-signature-button-bg-disabled:color-mix(
+    in srgb,
+    #f0f0f4,
+    transparent 40%
+  );
+  --save-warning-color:var(--secondary-color);
+  --thickness-bg:var(--dialog-bg-color);
+  --thickness-label-color:var(--primary-color);
+  --thickness-slider-color:var(--primary-color);
+  --thickness-border:none;
+  --draw-cursor:url(images/cursor-editorInk.svg) 0 16, pointer;
+
+  @media (prefers-color-scheme: dark){
+    --dialog-bg-color:#42414d;
+    --bg-hover:#52525e;
+    --primary-color:#fbfbfe;
+    --secondary-color:#cfcfd8;
+    --tab-top-line-active-color:#0df;
+    --tab-top-line-inactive-color:#8f8f9d;
+    --clear-signature-button-bg-active:#5b5b66;
+    --clear-signature-button-bg-focus:#2b2a33;
+    --clear-signature-button-bg-disabled:color-mix(
+      in srgb,
+      #2b2a33,
+      transparent 40%
+    );
+  }
+
+  @media screen and (forced-colors: active){
+    --secondary-color:ButtonText;
+    --bg:HighlightText;
+    --bg-hover:var(--bg);
+    --tab-top-line-active-color:ButtonText;
+    --tab-top-line-active-hover-color:HighlightText;
+    --tab-top-line-hover-color:SelectedItem;
+    --tab-top-line-inactive-color:ButtonText;
+    --tab-bottom-line-active-color:var(--tab-top-line-active-color);
+    --tab-bottom-line-hover-color:var(--tab-top-line-hover-color);
+    --tab-bg:var(--bg);
+    --tab-bg-active-color:SelectedItem;
+    --tab-bg-active-hover-color:SelectedItem;
+    --tab-panel-border:1px solid ButtonText;
+    --tab-panel-border-radius:8px;
+    --tab-text-color:ButtonText;
+    --tab-text-active-color:HighlightText;
+    --tab-text-active-hover-color:HighlightText;
+    --tab-text-hover-color:SelectedItem;
+    --signature-color:ButtonText;
+    --clear-signature-button-border-width:1px;
+    --clear-signature-button-border-style:solid;
+    --clear-signature-button-border-color:ButtonText;
+    --clear-signature-button-border-disabled-color:GrayText;
+    --clear-signature-button-color:ButtonText;
+    --clear-signature-button-hover-color:HighlightText;
+    --clear-signature-button-active-color:SelectedItem;
+    --clear-signature-button-focus-color:CanvasText;
+    --clear-signature-button-disabled-color:GrayText;
+    --clear-signature-button-bg:var(--bg);
+    --clear-signature-button-bg-hover:SelectedItem;
+    --clear-signature-button-bg-active:var(--bg);
+    --clear-signature-button-bg-focus:var(--bg);
+    --clear-signature-button-bg-disabled:var(--bg);
+    --thickness-bg:Canvas;
+    --thickness-label-color:CanvasText;
+    --thickness-slider-color:ButtonText;
+    --thickness-border:1px solid var(--border-color);
+  }
+
+  #addSignatureDialogLabel{
+    overflow:hidden;
+    position:absolute;
+    inset:0;
+    width:0;
+    height:0;
+  }
+
+  &.waiting::after{
+    content:"";
+    cursor:wait;
+    position:absolute;
+    inset:0;
+    width:100%;
+    height:100%;
+  }
+
+  .mainContainer{
+    [role="tablist"]{
+      width:100%;
+      display:flex;
+      align-items:flex-start;
+      gap:0;
+
+      > [role="tab"]{
+        flex:1 0 0;
+        align-self:stretch;
+        background-color:var(--tab-bg);
+        padding-inline:0;
+        cursor:default;
+
+        border-inline:0;
+        border-block-width:1px;
+        border-block-style:solid;
+        border-block-start-color:var(--tab-top-line-inactive-color);
+        border-block-end-color:var(--tab-bottom-line-inactive-color);
+        border-radius:0;
+
+        font:menu;
+        font-size:13px;
+        font-style:normal;
+        line-height:normal;
+        font-weight:400;
+        color:var(--tab-text-color);
+
+        &:hover{
+          border-block-start-width:2px;
+          border-block-start-color:var(--tab-top-line-hover-color);
+          border-block-end-color:var(--tab-bottom-line-hover-color);
+          background-color:var(--tab-bg-hover);
+          color:var(--tab-text-hover-color);
+        }
+
+        &:focus-visible{
+          outline:2px solid var(--tab-top-line-active-color);
+          outline-offset:-2px;
+        }
+
+        &[aria-selected="true"]{
+          border-block-start-width:2px;
+          border-block-start-color:var(--tab-top-line-active-color);
+          border-block-end-color:var(--tab-bottom-line-active-color);
+          background-color:var(--tab-bg-active-color);
+          font-weight:590;
+          color:var(--tab-text-active-color);
+
+          &:hover{
+            border-block-start-color:var(--tab-top-line-active-hover-color);
+            background-color:var(--tab-bg-active-hover-color);
+            color:var(--tab-text-active-hover-color);
+          }
+        }
+      }
+    }
+
+    #addSignatureActionContainer{
+      width:100%;
+      height:auto;
+      display:flex;
+      flex-direction:column;
+      align-items:flex-end;
+      align-self:stretch;
+      gap:12px;
+      padding-inline:16px;
+      box-sizing:border-box;
+
+      > [role="tabpanel"]{
+        position:relative;
+        width:100%;
+        height:220px;
+        background-color:var(--signature-bg);
+        border:var(--tab-panel-border);
+        border-radius:var(--tab-panel-border-radius);
+
+        > svg{
+          position:absolute;
+          inset:0;
+          width:100%;
+          height:100%;
+          background-color:transparent;
+        }
+
+        &#addSignatureTypeContainer{
+          display:none;
+
+          #addSignatureTypeInput{
+            position:absolute;
+            inset:0;
+            width:100%;
+            height:100%;
+            border:0;
+            padding:0;
+            text-align:center;
+            color:var(--signature-color);
+            background-color:transparent;
+            border-radius:var(--tab-panel-border-radius);
+
+            font-family:"Brush script", "Apple Chancery", "Segoe script", "Freestyle Script", "Palace Script MT", "Brush Script MT", TK, cursive, serif;
+            font-size:44px;
+            font-style:italic;
+            font-weight:400;
+
+            &::-moz-placeholder{
+              color:var(--signature-placeholder-color);
+              text-align:center;
+
+              font:menu;
+              font-style:normal;
+              font-weight:274;
+              font-size:44px;
+              line-height:normal;
+            }
+
+            &::placeholder{
+              color:var(--signature-placeholder-color);
+              text-align:center;
+
+              font:menu;
+              font-style:normal;
+              font-weight:274;
+              font-size:44px;
+              line-height:normal;
+            }
+          }
+        }
+
+        &#addSignatureDrawContainer{
+          display:none;
+
+          > span{
+            position:absolute;
+            top:0;
+            left:0;
+            width:100%;
+            height:100%;
+            display:grid;
+            align-items:center;
+            justify-content:center;
+
+            background-color:transparent;
+            color:var(--signature-placeholder-color);
+            -webkit-user-select:none;
+               -moz-user-select:none;
+                    user-select:none;
+          }
+
+          > svg{
+            stroke:var(--signature-color);
+            fill:none;
+            stroke-opacity:1;
+            stroke-linecap:round;
+            stroke-linejoin:round;
+            stroke-miterlimit:10;
+
+            &:hover{
+              cursor:var(--draw-cursor);
+            }
+          }
+
+          #thickness{
+            position:absolute;
+            width:100%;
+            inset-block-end:0;
+            display:grid;
+            align-items:center;
+            justify-content:center;
+            pointer-events:none;
+
+            > span{
+              color:var(--signature-draw-placeholder-color);
+            }
+
+            > div{
+              width:auto;
+              height:auto;
+              display:flex;
+              align-items:center;
+              justify-content:center;
+              gap:8px;
+              padding:6px 8px 7px;
+              margin:0;
+              background-color:var(--thickness-bg);
+              border-radius:4px 4px 0 0;
+              border-inline:var(--thickness-border);
+              border-top:var(--thickness-border);
+              pointer-events:auto;
+              position:relative;
+              top:1px;
+
+              > label{
+                color:var(--thickness-label-color);
+              }
+
+              > input{
+                width:100px;
+                height:14px;
+                background-color:transparent;
+
+                &::-webkit-slider-runnable-track,
+                &::-moz-range-track,
+                &::-moz-range-progress{
+                  background-color:var(--thickness-slider-color);
+                }
+
+                &::-webkit-slider-thumb,
+                &::-moz-range-thumb{
+                  background-color:var(--thickness-bg);
+                }
+
+                border-radius:4.5px;
+                border:0;
+                color:var(--signature-color);
+              }
+            }
+          }
+        }
+
+        &#addSignatureImageContainer{
+          display:none;
+
+          > svg{
+            stroke:none;
+            stroke-width:0;
+            fill:var(--signature-color);
+            fill-opacity:1;
+          }
+
+          #addSignatureImagePlaceholder{
+            position:absolute;
+            top:0;
+            left:0;
+            width:100%;
+            height:100%;
+            background-color:transparent;
+            display:flex;
+            flex-direction:column;
+            align-items:center;
+            justify-content:center;
+
+            span{
+              color:var(--signature-placeholder-color);
+            }
+
+            a{
+              color:var(--open-link-fg);
+              text-decoration:underline;
+              cursor:pointer;
+
+              &:hover{
+                color:var(--open-link-hover-fg);
+              }
+            }
+          }
+
+          #addSignatureFilePicker{
+            visibility:hidden;
+            position:relative;
+            width:0;
+            height:0;
+          }
+        }
+      }
+
+      &[data-selected="type"] > #addSignatureTypeContainer,
+      &[data-selected="draw"] > #addSignatureDrawContainer,
+      &[data-selected="image"] > #addSignatureImageContainer{
+        display:block;
+      }
+
+      #addSignatureControls{
+        display:flex;
+        flex-direction:column;
+        justify-content:center;
+        align-items:flex-start;
+        gap:12px;
+        align-self:stretch;
+
+        #horizontalContainer{
+          display:flex;
+          align-items:flex-end;
+          gap:16px;
+          align-self:stretch;
+
+          #addSignatureDescriptionContainer{
+            display:flex;
+            flex-direction:column;
+            align-items:flex-start;
+            gap:4px;
+            flex:1 0 0;
+
+            &:has(input:disabled) > label{
+              opacity:0.4;
+            }
+
+            > label{
+              width:auto;
+            }
+          }
+
+          #clearSignatureButton{
+            display:flex;
+            height:32px;
+            padding:4px 8px;
+            align-items:center;
+            background-color:var(--clear-signature-button-bg);
+            border-width:var(--clear-signature-button-border-width);
+            border-style:var(--clear-signature-button-border-style);
+            border-color:var(--clear-signature-button-border-color);
+            border-radius:4px;
+
+            > span{
+              display:flex;
+              height:24px;
+              align-items:center;
+              gap:4px;
+              flex-shrink:0;
+
+              color:var(--clear-signature-button-color);
+
+              &::after{
+                content:"";
+                display:inline-block;
+                width:16px;
+                height:16px;
+                -webkit-mask-image:var(--clear-signature-button-icon);
+                        mask-image:var(--clear-signature-button-icon);
+                -webkit-mask-size:cover;
+                        mask-size:cover;
+                background-color:var(--clear-signature-button-color);
+                flex-shrink:0;
+              }
+            }
+
+            &:hover{
+              background-color:var(--clear-signature-button-bg-hover);
+
+              > span{
+                color:var(--clear-signature-button-hover-color);
+                &::after{
+                  background-color:var(--clear-signature-button-hover-color);
+                }
+              }
+            }
+
+            &:active{
+              background-color:var(--clear-signature-button-bg-active);
+
+              > span{
+                color:var(--clear-signature-button-active-color);
+                &::after{
+                  background-color:var(--clear-signature-button-active-color);
+                }
+              }
+            }
+
+            &:focus-visible{
+              background-color:var(--clear-signature-button-bg-focus);
+
+              > span{
+                color:var(--clear-signature-button-focus-color);
+                &::after{
+                  background-color:var(--clear-signature-button-focus-color);
+                }
+              }
+            }
+
+            &:disabled{
+              background-color:var(--clear-signature-button-bg-disabled);
+              border-color:var(--clear-signature-button-border-disabled-color);
+
+              > span{
+                color:var(--clear-signature-button-disabled-color);
+                &::after{
+                  background-color:var(
+                    --clear-signature-button-disabled-color
+                  );
+                }
+              }
+            }
+          }
+        }
+
+        #addSignatureSaveContainer{
+          display:grid;
+          grid-template-columns:max-content auto;
+          gap:4px;
+          width:100%;
+
+          > input{
+            margin:0;
+
+            &:disabled + label{
+              opacity:0.4;
+            }
+          }
+
+          > label{
+            -webkit-user-select:none;
+               -moz-user-select:none;
+                    user-select:none;
+          }
+
+          &:not(.fullStorage) #addSignatureSaveWarning{
+            display:none;
+          }
+
+          &.fullStorage #addSignatureSaveWarning{
+            display:block;
+            opacity:1;
+            color:var(--save-warning-color);
+            font-size:11px;
+          }
+        }
+      }
+    }
+  }
+}
+
+#editSignatureDescriptionDialog{
+  .mainContainer{
+    padding-inline:16px;
+    box-sizing:border-box;
+
+    .title{
+      margin-inline-start:0;
+    }
+
+    #editSignatureDescriptionAndView{
+      width:auto;
+      display:flex;
+      justify-content:flex-end;
+      align-items:flex-start;
+      gap:12px;
+      align-self:stretch;
+
+      #editSignatureDescriptionContainer{
+        display:flex;
+        flex-direction:column;
+        align-items:flex-start;
+        gap:4px;
+        flex:1 1 auto;
+      }
+
+      > svg{
+        width:210px;
+        height:180px;
+        padding:8px;
+        background-color:var(--signature-bg);
+
+        > path{
+          stroke:var(--button-signature-color);
+          stroke-width:1px;
+          stroke-linecap:round;
+          stroke-linejoin:round;
+          stroke-miterlimit:10;
+          vector-effect:non-scaling-stroke;
+          fill:none;
+
+          &.contours{
+            fill:var(--button-signature-color);
+            stroke-width:0.5px;
+          }
+        }
+      }
+    }
+  }
+}
+
+#editorSignatureParamsToolbar{
+  padding:8px;
+
+  #addSignatureDoorHanger{
+    gap:8px;
+    padding:2px;
+
+    .toolbarAddSignatureButtonContainer{
+      height:32px;
+      display:flex;
+      justify-content:space-between;
+      align-items:center;
+      align-self:stretch;
+      gap:8px;
+
+      button{
+        border:var(--button-signature-border);
+        border-radius:4px;
+        background-color:var(--button-signature-bg);
+        color:var(--button-signature-color);
+
+        &:hover{
+          background-color:var(--button-signature-hover-bg);
+        }
+
+        &:active{
+          border:var(--button-signature-active-border);
+          background-color:var(--button-signature-active-bg);
+          color:var(--button-signature-active-color);
+
+          &::before{
+            background-color:var(--button-signature-active-color);
+          }
+        }
+
+        &:focus-visible{
+          outline:var(--focus-ring-outline);
+
+          &::before{
+            background-color:var(--button-signature-color);
+          }
+        }
+      }
+
+      .deleteButton{
+        &::before{
+          -webkit-mask-image:var(--clear-signature-button-icon);
+                  mask-image:var(--clear-signature-button-icon);
+        }
+      }
+
+      .toolbarAddSignatureButton{
+        width:calc(0.8 * var(--editor-toolbar-min-width));
+        height:100%;
+        min-height:var(--menuitem-height);
+        aspect-ratio:unset;
+        display:flex;
+        align-items:center;
+        justify-content:flex-start;
+        outline:none;
+        border-radius:4px;
+        box-sizing:border-box;
+        font:message-box;
+        position:relative;
+        flex:1 1 auto;
+        padding:0;
+        gap:8px;
+        text-align:start;
+        white-space:normal;
+        cursor:default;
+        overflow:hidden;
+
+        > svg{
+          display:inline-block;
+          height:100%;
+          aspect-ratio:1;
+          background-color:var(--signature-bg);
+          flex:none;
+          padding:4px;
+          box-sizing:border-box;
+          border:none;
+          border-radius:4px;
+
+          > path{
+            stroke:var(--button-signature-color);
+            stroke-width:1px;
+            stroke-linecap:round;
+            stroke-linejoin:round;
+            stroke-miterlimit:10;
+            vector-effect:non-scaling-stroke;
+            fill:none;
+
+            &.contours{
+              fill:var(--button-signature-color);
+              stroke-width:0.5px;
+            }
+          }
+        }
+
+        &:is(:hover, :active) > svg{
+          border-radius:4px 0 0 4px;
+          background-color:var(--signature-hover-bg);
+        }
+
+        &:hover{
+          > span{
+            color:var(--button-signature-hover-color);
+          }
+        }
+
+        &:active{
+          background-color:var(--button-signature-active-bg);
+        }
+
+        &:is([disabled="disabled"], [disabled]){
+          opacity:0.5;
+          pointer-events:none;
+        }
+
+        > span{
+          height:auto;
+          text-overflow:ellipsis;
+          white-space:nowrap;
+          flex:1 1 auto;
+          font:menu;
+          font-size:13px;
+          font-style:normal;
+          font-weight:400;
+          line-height:normal;
+          overflow:hidden;
+        }
+      }
+    }
+  }
+}
+
+.editDescription.altText{
+  --alt-text-add-image:url(images/editor-toolbar-edit.svg) !important;
+
+  &::before{
+    width:16px !important;
+    height:16px !important;
+  }
+}
+
+.commentPopup,
+#commentManagerDialog{
+  width:360px;
+  max-width:100%;
+  min-width:200px;
+  position:absolute;
+  padding:8px 16px 16px;
+  margin-left:0;
+  margin-top:0;
+  box-sizing:border-box;
+
+  border-radius:8px;
+}
+
+#commentManagerDialog{
+  --comment-close-button-icon:url(images/comment-closeButton.svg);
+
+  .mainContainer{
+    width:100%;
+    height:auto;
+    display:flex;
+    flex-direction:column;
+    align-items:flex-start;
+    gap:4px;
+
+    #commentManagerToolbar{
+      width:100%;
+      height:32px;
+      display:flex;
+      justify-content:flex-start;
+      align-items:flex-start;
+      gap:8px;
+      align-self:stretch;
+
+      cursor:move;
+    }
+
+    #commentManagerTextInput{
+      width:100%;
+      min-height:132px;
+      margin-bottom:12px;
+    }
+  }
+}
+
+.annotationLayer.disabled :is(.annotationCommentButton){
+  display:none;
+}
+
+:is(.annotationLayer, .annotationEditorLayer){
+  .annotationCommentButton{
+    color-scheme:light dark;
+    --comment-button-bg:light-dark(white, #1c1b22);
+    --comment-button-fg:light-dark(#5b5b66, #fbfbfe);
+    --comment-button-active-bg:light-dark(#0041a4, #a6ecf4);
+    --comment-button-active-fg:light-dark(white, #15141a);
+    --comment-button-hover-bg:light-dark(#0053cb, #61dce9);
+    --comment-button-hover-fg:light-dark(white, #15141a);
+    --comment-button-selected-bg:light-dark(#0062fa, #00cadb);
+    --comment-button-border-color:light-dark(#8f8f9d, #bfbfc9);
+    --comment-button-active-border-color:var(--comment-button-active-bg);
+    --comment-button-focus-border-color:light-dark(#cfcfd8, #3a3944);
+    --comment-button-hover-border-color:var(--comment-button-hover-bg);
+    --comment-button-selected-border-color:var(--comment-button-selected-bg);
+    --comment-button-selected-fg:light-dark(white, #15141a);
+    --comment-button-dim:24px;
+    --comment-button-box-shadow:0 0.25px 0.75px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 2px 6px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
+    --comment-button-focus-outline-color:light-dark(#0062fa, #00cadb);
+
+    @media screen and (forced-colors: active){
+      --comment-button-bg:ButtonFace;
+      --comment-button-fg:ButtonText;
+      --comment-button-hover-bg:SelectedItemText;
+      --comment-button-hover-fg:SelectedItem;
+      --comment-button-active-bg:SelectedItemText;
+      --comment-button-active-fg:SelectedItem;
+      --comment-button-border-color:ButtonBorder;
+      --comment-button-active-border-color:ButtonBorder;
+      --comment-button-hover-border-color:SelectedItem;
+      --comment-button-box-shadow:none;
+      --comment-button-focus-outline-color:CanvasText;
+      --comment-button-selected-bg:ButtonBorder;
+      --comment-button-selected-fg:ButtonFace;
+    }
+
+    position:absolute;
+    width:var(--comment-button-dim);
+    height:var(--comment-button-dim);
+    background-color:var(--comment-button-bg);
+    border-radius:6px 6px 6px 0;
+    border:1px solid var(--comment-button-border-color);
+    box-shadow:var(--comment-button-box-shadow);
+    cursor:auto;
+    z-index:1;
+    padding:4px;
+    margin:0;
+    box-sizing:border-box;
+    pointer-events:auto;
+
+    &:dir(rtl){
+      border-radius:6px 6px 0;
+    }
+
+    &::before{
+      content:"";
+      display:inline-block;
+      width:100%;
+      height:100%;
+      -webkit-mask-repeat:no-repeat;
+              mask-repeat:no-repeat;
+      -webkit-mask-size:cover;
+              mask-size:cover;
+      -webkit-mask-image:var(--comment-edit-button-icon);
+              mask-image:var(--comment-edit-button-icon);
+      background-color:var(--comment-button-fg);
+      margin:0;
+      padding:0;
+      transform:scaleX(var(--dir-factor));
+    }
+
+    &:focus-visible{
+      outline:2px solid var(--comment-button-focus-outline-color);
+      outline-offset:1px;
+      border-color:var(--comment-button-focus-border-color);
+    }
+
+    &:hover{
+      background-color:var(--comment-button-hover-bg) !important;
+      border-color:var(--comment-button-hover-border-color);
+
+      &::before{
+        background-color:var(--comment-button-hover-fg);
+      }
+    }
+
+    &:active{
+      background-color:var(--comment-button-active-bg) !important;
+      border-color:var(--comment-button-active-border-color);
+
+      &::before{
+        background-color:var(--comment-button-active-fg);
+      }
+    }
+
+    &.selected{
+      background-color:var(--comment-button-selected-bg) !important;
+      border-color:var(--comment-button-selected-border-color);
+
+      &::before{
+        background-color:var(--comment-button-selected-fg);
+      }
+    }
+  }
+}
+
+#editorCommentsSidebar,
+.commentPopup{
+  --comment-close-button-icon:url(images/comment-closeButton.svg);
+  --comment-popup-edit-button-icon:url(images/comment-popup-editButton.svg);
+  --comment-popup-delete-button-icon:url(images/editor-toolbar-delete.svg);
+
+  --comment-date-fg-color:light-dark(
+    rgb(21 20 26 / 0.69),
+    rgb(251 251 254 / 0.69)
+  );
+  --comment-bg-color:light-dark(#f9f9fb, #1c1b22);
+  --comment-hover-bg-color:light-dark(#e0e0e6, #2c2b33);
+  --comment-active-bg-color:light-dark(#d1d1d9, #3a3944);
+  --comment-hover-brightness:0.89;
+  --comment-hover-filter:brightness(var(--comment-hover-brightness));
+  --comment-active-brightness:0.825;
+  --comment-active-filter:brightness(var(--comment-active-brightness));
+  --comment-border-color:light-dark(#f0f0f4, #52525e);
+  --comment-focus-outline-color:light-dark(#0062fa, #00cadb);
+  --comment-fg-color:light-dark(#15141a, #fbfbfe);
+  --comment-count-bg-color:light-dark(#e2f7ff, #00317e);
+  --comment-indicator-active-fg-color:light-dark(#0041a4, #a6ecf4);
+  --comment-indicator-active-filter:brightness(
+    calc(1 / var(--comment-active-brightness))
+  );
+  --comment-indicator-focus-fg-color:light-dark(#5b5b66, #fbfbfe);
+  --comment-indicator-hover-fg-color:light-dark(#0053cb, #61dce9);
+  --comment-indicator-hover-filter:brightness(
+    calc(1 / var(--comment-hover-brightness))
+  );
+  --comment-indicator-selected-fg-color:light-dark(#0062fa, #00cadb);
+
+  --button-comment-bg:transparent;
+  --button-comment-color:var(--main-color);
+  --button-comment-active-bg:light-dark(#cfcfd8, #5b5b66);
+  --button-comment-active-border:none;
+  --button-comment-active-color:var(--button-comment-color);
+  --button-comment-border:none;
+  --button-comment-hover-bg:light-dark(#e0e0e6, #52525e);
+  --button-comment-hover-color:var(--button-comment-color);
+
+  --link-fg-color:light-dark(#0060df, #0df);
+  --link-hover-fg-color:light-dark(#0250bb, #80ebff);
+
+  @media screen and (forced-colors: active){
+    --comment-date-fg-color:CanvasText;
+    --comment-bg-color:Canvas;
+    --comment-hover-bg-color:Canvas;
+    --comment-hover-filter:none;
+    --comment-active-bg-color:Canvas;
+    --comment-active-filter:none;
+    --comment-border-color:CanvasText;
+    --comment-fg-color:CanvasText;
+    --comment-count-bg-color:Canvas;
+    --comment-indicator-active-fg-color:SelectedItem;
+    --comment-indicator-focus-fg-color:CanvasText;
+    --comment-indicator-hover-fg-color:CanvasText;
+    --comment-indicator-selected-fg-color:SelectedItem;
+    --button-comment-bg:ButtonFace;
+    --button-comment-color:ButtonText;
+    --button-comment-active-bg:Highlight;
+    --button-comment-active-color:HighlightText;
+    --button-comment-border:1px solid ButtonText;
+    --button-comment-hover-bg:Highlight;
+    --button-comment-hover-color:HighlightText;
+    --link-fg-color:LinkText;
+    --link-hover-fg-color:LinkText;
+  }
+}
+
+#editorCommentsSidebar{
+  display:flex;
+  height:auto;
+  padding-bottom:16px;
+  flex-direction:column;
+  align-items:flex-start;
+  overflow-y:visible;
+
+  #editorCommentsSidebarHeader{
+    width:100%;
+    box-sizing:border-box;
+    padding:16px;
+    display:flex;
+    align-items:center;
+    justify-content:space-between;
+
+    .commentCount{
+      display:flex;
+      align-items:baseline;
+      gap:6px;
+      -webkit-user-select:none;
+         -moz-user-select:none;
+              user-select:none;
+
+      #editorCommentsSidebarTitle{
+        font:menu;
+        font-style:normal;
+        font-weight:590;
+        line-height:normal;
+        font-size:17px;
+        color:var(--comment-fg-color);
+      }
+
+      #editorCommentsSidebarCount{
+        padding:0 4px;
+        border-radius:4px;
+        background-color:var(--comment-count-bg-color);
+
+        color:var(--comment-fg-color);
+        text-align:center;
+
+        font:menu;
+        font-size:13px;
+        font-style:normal;
+        font-weight:400;
+        line-height:normal;
+      }
+    }
+
+    #editorCommentsSidebarCloseButton{
+      width:32px;
+      height:32px;
+      padding:8px;
+      border-radius:4px;
+      border:var(--button-comment-border);
+      background-color:var(--button-comment-bg);
+      cursor:pointer;
+
+      &::before{
+        content:"";
+        display:inline-block;
+        width:100%;
+        height:100%;
+        -webkit-mask-repeat:no-repeat;
+                mask-repeat:no-repeat;
+        -webkit-mask-position:center;
+                mask-position:center;
+        -webkit-mask-image:var(--comment-close-button-icon);
+                mask-image:var(--comment-close-button-icon);
+        background-color:var(--button-comment-color);
+      }
+
+      &:hover{
+        background-color:var(--button-comment-hover-bg);
+
+        &::before{
+          background-color:var(--button-comment-hover-color);
+        }
+      }
+
+      &:active{
+        border:var(--button-comment-active-border);
+        background-color:var(--button-comment-active-bg);
+
+        &::before{
+          background-color:var(--button-comment-active-color);
+        }
+      }
+
+      &:focus-visible{
+        outline:var(--focus-ring-outline);
+      }
+
+      > span{
+        display:inline-block;
+        width:0;
+        height:0;
+        overflow:hidden;
+      }
+    }
+  }
+
+  #editorCommentsSidebarListContainer{
+    overflow:auto;
+    width:100%;
+
+    #editorCommentsSidebarList{
+      display:flex;
+      width:auto;
+      padding:4px 16px;
+      gap:10px;
+      align-items:flex-start;
+      flex-direction:column;
+      list-style-type:none;
+
+      .sidebarComment{
+        display:flex;
+        width:auto;
+        padding:8px 16px 16px;
+        flex-direction:column;
+        align-items:flex-start;
+        align-self:stretch;
+        gap:4px;
+
+        border-radius:8px;
+        border:0.5px solid var(--comment-border-color);
+        background-color:var(--comment-bg-color);
+
+        &:not(.noComments){
+          &:hover{
+            @media screen and (forced-colors: active){
+              background-color:var(--comment-hover-bg-color);
+            }
+            filter:var(--comment-hover-filter);
+
+            time::after{
+              display:inline-block;
+              background-color:var(--comment-indicator-hover-fg-color);
+              filter:var(--comment-indicator-hover-filter);
+            }
+          }
+
+          &:active{
+            @media screen and (forced-colors: active){
+              background-color:var(--comment-active-bg-color);
+            }
+            filter:var(--comment-active-filter);
+
+            time::after{
+              display:inline-block;
+              background-color:var(--comment-indicator-active-fg-color);
+              filter:var(--comment-indicator-active-filter);
+            }
+          }
+
+          &:is(:focus, :focus-visible) time::after{
+            display:inline-block;
+            background-color:var(--comment-indicator-focus-fg-color);
+          }
+
+          &:focus-visible{
+            outline:2px solid var(--comment-focus-outline-color);
+            outline-offset:2px;
+          }
+
+          &.selected{
+            .sidebarCommentText{
+              max-height:-moz-fit-content;
+              max-height:fit-content;
+              -webkit-line-clamp:unset;
+            }
+
+            time::after{
+              display:inline-block;
+              background-color:var(--comment-indicator-selected-fg-color);
+            }
+          }
+        }
+
+        .sidebarCommentText{
+          font:menu;
+          font-style:normal;
+          font-weight:400;
+          line-height:normal;
+          font-size:15px;
+          width:100%;
+          height:-moz-fit-content;
+          height:fit-content;
+          max-height:80px;
+          display:-webkit-box;
+          -webkit-box-orient:vertical;
+          -webkit-line-clamp:2;
+          overflow:hidden;
+          overflow-wrap:break-word;
+
+          .richText{
+            --total-scale-factor:1.5;
+          }
+        }
+
+        &.noComments{
+          .sidebarCommentText{
+            max-height:-moz-fit-content;
+            max-height:fit-content;
+            -webkit-line-clamp:unset;
+            -webkit-user-select:none;
+               -moz-user-select:none;
+                    user-select:none;
+          }
+
+          a{
+            font:menu;
+            font-style:normal;
+            font-weight:400;
+            line-height:normal;
+            font-size:15px;
+            width:100%;
+            height:auto;
+            overflow-wrap:break-word;
+            margin-block-start:15px;
+            color:var(--link-fg-color);
+
+            &:focus-visible{
+              outline:var(--focus-ring-outline);
+            }
+
+            &:hover{
+              color:var(--link-hover-fg-color);
+            }
+          }
+        }
+
+        time{
+          width:100%;
+          display:inline-flex;
+          align-items:center;
+          justify-content:space-between;
+
+          font:menu;
+          font-style:normal;
+          font-weight:400;
+          line-height:normal;
+          font-size:13px;
+
+          &::after{
+            content:"";
+            display:none;
+            width:16px;
+            height:16px;
+            -webkit-mask-repeat:no-repeat;
+                    mask-repeat:no-repeat;
+            -webkit-mask-position:center;
+                    mask-position:center;
+            -webkit-mask-image:var(--comment-edit-button-icon);
+                    mask-image:var(--comment-edit-button-icon);
+            transform:scaleX(var(--dir-factor));
+          }
+        }
+      }
+    }
+  }
+}
+
+.commentPopup{
+  color-scheme:light dark;
+
+  --divider-color:light-dark(#cfcfd8, #3a3944);
+  --comment-shadow:0 0.5px 2px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 4px 16px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
+
+  @media screen and (forced-colors: active){
+    --divider-color:CanvasText;
+    --comment-shadow:none;
+  }
+
+  display:flex;
+  flex-direction:column;
+  align-items:flex-start;
+  gap:12px;
+  z-index:100001;
+  pointer-events:auto;
+  margin-top:2px;
+
+  border:0.5px solid var(--comment-border-color);
+  background:var(--comment-bg-color);
+  box-shadow:var(--comment-shadow);
+
+  &:focus-visible{
+    outline:none;
+  }
+
+  &.dragging{
+    cursor:move !important;
+
+    *{
+      cursor:move !important;
+    }
+
+    button{
+      pointer-events:none !important;
+    }
+  }
+
+  &:not(.selected) .commentPopupButtons{
+    visibility:hidden !important;
+  }
+
+  hr{
+    width:100%;
+    height:1px;
+    border:none;
+    border-top:1px solid var(--divider-color);
+    margin:0;
+    padding:0;
+  }
+
+  .commentPopupTop{
+    display:flex;
+    width:100%;
+    height:auto;
+    padding-bottom:4px;
+    justify-content:space-between;
+    align-items:center;
+    align-self:stretch;
+    cursor:move;
+    -webkit-user-select:none;
+       -moz-user-select:none;
+            user-select:none;
+
+    .commentPopupTime{
+      font:menu;
+      font-style:normal;
+      font-weight:400;
+      line-height:normal;
+      font-size:13px;
+      color:var(--comment-date-fg-color);
+    }
+
+    .commentPopupButtons{
+      display:flex;
+      align-items:center;
+      gap:2px;
+      cursor:default;
+
+      > button{
+        width:32px;
+        height:32px;
+        padding:8px;
+        border:var(--button-comment-border);
+        border-radius:4px;
+        background-color:var(--button-comment-bg);
+        color:var(--button-comment-color);
+
+        &:hover{
+          background-color:var(--button-comment-hover-bg);
+
+          &::before{
+            background-color:var(--button-comment-hover-color);
+          }
+        }
+
+        &:active{
+          border:var(--button-comment-active-border);
+          background-color:var(--button-comment-active-bg);
+          color:var(--button-comment-active-color);
+
+          &::before{
+            background-color:var(--button-comment-active-color);
+          }
+        }
+
+        &:focus-visible{
+          background-color:var(--button-comment-hover-bg);
+          outline:2px solid var(--comment-focus-outline-color);
+          outline-offset:0;
+        }
+
+        &::before{
+          content:"";
+          display:inline-block;
+          width:100%;
+          height:100%;
+          -webkit-mask-repeat:no-repeat;
+                  mask-repeat:no-repeat;
+          -webkit-mask-position:center;
+                  mask-position:center;
+        }
+
+        &.commentPopupEdit::before{
+          -webkit-mask-image:var(--comment-popup-edit-button-icon);
+                  mask-image:var(--comment-popup-edit-button-icon);
+        }
+
+        &.commentPopupDelete::before{
+          -webkit-mask-image:var(--comment-popup-delete-button-icon);
+                  mask-image:var(--comment-popup-delete-button-icon);
+        }
+      }
+    }
+  }
+
+  .commentPopupText{
+    width:100%;
+    height:auto;
+
+    font:menu;
+    font-style:normal;
+    font-weight:400;
+    line-height:normal;
+    font-size:15px;
+    color:var(--comment-fg-color);
+  }
+}
+
+.commentPopupText,
+.sidebarCommentText .richText{
+  margin-block:0;
+
+  p:first-of-type{
+    margin-block:0;
+  }
+
+  > *{
+    white-space:pre-wrap;
+    font-size:max(15px, calc(10px * var(--total-scale-factor)));
+    overflow-wrap:break-word;
+  }
+
+  span{
+    color:var(--comment-fg-color) !important;
+  }
+}
+
+:root{
+  --editor-toolbar-vert-offset:6px;
+  --outline-width:2px;
+  --outline-color:#0060df;
+  --outline-around-width:1px;
+  --outline-around-color:#f0f0f4;
+  --hover-outline-around-color:var(--outline-around-color);
+  --focus-outline:solid var(--outline-width) var(--outline-color);
+  --unfocus-outline:solid var(--outline-width) transparent;
+  --focus-outline-around:solid var(--outline-around-width) var(--outline-around-color);
+  --hover-outline-color:#8f8f9d;
+  --hover-outline:solid var(--outline-width) var(--hover-outline-color);
+  --hover-outline-around:solid var(--outline-around-width) var(--hover-outline-around-color);
+  --freetext-line-height:1.35;
+  --freetext-padding:2px;
+  --resizer-bg-color:var(--outline-color);
+  --resizer-size:6px;
+  --resizer-shift:calc(
+    0px - (var(--outline-width) + var(--resizer-size)) / 2 -
+      var(--outline-around-width)
+  );
+  --editorFreeText-editing-cursor:text;
+  --editorInk-editing-cursor:url(images/cursor-editorInk.svg) 0 16, pointer;
+  --editorHighlight-editing-cursor:url(images/cursor-editorTextHighlight.svg) 24 24, text;
+  --editorFreeHighlight-editing-cursor:url(images/cursor-editorFreeHighlight.svg) 1 18, pointer;
+
+  --new-alt-text-warning-image:url(images/altText_warning.svg);
+}
+
+.textLayer{
+  &.highlighting{
+    cursor:var(--editorFreeHighlight-editing-cursor);
+
+    &:not(.free) span{
+      cursor:var(--editorHighlight-editing-cursor);
+
+      &[role="img"]{
+        cursor:var(--editorFreeHighlight-editing-cursor);
+      }
+    }
+
+    &.free span{
+      cursor:var(--editorFreeHighlight-editing-cursor);
+    }
+  }
+}
+
+.page:has(.annotationEditorLayer.nonEditing)
+  .annotationLayer
+  .editorAnnotation{
+  position:absolute;
+  pointer-events:none;
+}
+
+#viewerContainer.pdfPresentationMode:fullscreen,
+.annotationEditorLayer.disabled{
+  .noAltTextBadge{
+    display:none !important;
+  }
+}
+
+@media (min-resolution: 1.1dppx){
+  :root{
+    --editorFreeText-editing-cursor:url(images/cursor-editorFreeText.svg) 0 16, text;
+  }
+}
+
+@media screen and (forced-colors: active){
+  :root{
+    --outline-color:CanvasText;
+    --outline-around-color:ButtonFace;
+    --resizer-bg-color:ButtonText;
+    --hover-outline-color:Highlight;
+    --hover-outline-around-color:SelectedItemText;
+  }
+}
+
+[data-editor-rotation="90"]{
+  transform:rotate(90deg);
+}
+
+[data-editor-rotation="180"]{
+  transform:rotate(180deg);
+}
+
+[data-editor-rotation="270"]{
+  transform:rotate(270deg);
+}
+
+.annotationEditorLayer{
+  background:transparent;
+  position:absolute;
+  inset:0;
+  font-size:calc(100px * var(--total-scale-factor));
+  transform-origin:0 0;
+  cursor:auto;
+
+  .selectedEditor{
+    z-index:100000 !important;
+  }
+
+  &.drawing *{
+    pointer-events:none !important;
+  }
+
+  &.getElements{
+    pointer-events:auto !important;
+    > div{
+      pointer-events:auto !important;
+    }
+  }
+}
+
+.annotationEditorLayer.waiting{
+  content:"";
+  cursor:wait;
+  position:absolute;
+  inset:0;
+  width:100%;
+  height:100%;
+}
+
+.annotationEditorLayer.disabled{
+  pointer-events:none;
+
+  &.highlightEditing
+    :is(
+      .freeTextEditor,
+      .inkEditor,
+      .stampEditor,
+      .signatureEditor,
+      .commentPopup
+    ){
+    pointer-events:auto;
+  }
+}
+
+.annotationEditorLayer.freetextEditing{
+  cursor:var(--editorFreeText-editing-cursor);
+}
+
+.annotationEditorLayer.inkEditing{
+  cursor:var(--editorInk-editing-cursor);
+}
+
+.annotationEditorLayer .draw{
+  box-sizing:border-box;
+}
+
+.annotationEditorLayer
+  :is(.freeTextEditor, .inkEditor, .stampEditor, .signatureEditor){
+  position:absolute;
+  background:transparent;
+  z-index:1;
+  transform-origin:0 0;
+  cursor:auto;
+  max-width:100%;
+  max-height:100%;
+  border:var(--unfocus-outline);
+
+  &.draggable.selectedEditor{
+    cursor:move;
+  }
+
+  &.selectedEditor{
+    border:var(--focus-outline);
+    outline:var(--focus-outline-around);
+
+    &::before{
+      content:"";
+      position:absolute;
+      inset:0;
+      border:var(--focus-outline-around);
+      pointer-events:none;
+    }
+  }
+
+  &:hover:not(.selectedEditor){
+    border:var(--hover-outline);
+    outline:var(--hover-outline-around);
+
+    &::before{
+      content:"";
+      position:absolute;
+      inset:0;
+      border:var(--focus-outline-around);
+    }
+  }
+}
+
+.annotationEditorLayer
+  :is(
+    .freeTextEditor,
+    .inkEditor,
+    .stampEditor,
+    .highlightEditor,
+    .signatureEditor
+  ),
+.textLayer{
+  .editToolbar{
+    --editor-toolbar-delete-image:url(images/editor-toolbar-delete.svg);
+    --editor-toolbar-bg-color:light-dark(#f0f0f4, #2b2a33);
+    --editor-toolbar-highlight-image:url(images/toolbarButton-editorHighlight.svg);
+    --editor-toolbar-fg-color:light-dark(#2e2e56, #fbfbfe);
+    --editor-toolbar-border-color:#8f8f9d;
+    --editor-toolbar-hover-border-color:var(--editor-toolbar-border-color);
+    --editor-toolbar-hover-bg-color:light-dark(#e0e0e6, #52525e);
+    --editor-toolbar-hover-fg-color:var(--editor-toolbar-fg-color);
+    --editor-toolbar-hover-outline:none;
+    --editor-toolbar-focus-outline-color:light-dark(#0060df, #0df);
+    --editor-toolbar-shadow:0 2px 6px 0 rgb(58 57 68 / 0.2);
+    --editor-toolbar-height:28px;
+    --editor-toolbar-padding:2px;
+    --alt-text-done-color:light-dark(#2ac3a2, #54ffbd);
+    --alt-text-warning-color:light-dark(#0090ed, #80ebff);
+    --alt-text-hover-done-color:var(--alt-text-done-color);
+    --alt-text-hover-warning-color:var(--alt-text-warning-color);
+
+    @media screen and (forced-colors: active){
+      --editor-toolbar-bg-color:ButtonFace;
+      --editor-toolbar-fg-color:ButtonText;
+      --editor-toolbar-border-color:ButtonText;
+      --editor-toolbar-hover-border-color:AccentColor;
+      --editor-toolbar-hover-bg-color:ButtonFace;
+      --editor-toolbar-hover-fg-color:AccentColor;
+      --editor-toolbar-hover-outline:2px solid var(--editor-toolbar-hover-border-color);
+      --editor-toolbar-focus-outline-color:ButtonBorder;
+      --editor-toolbar-shadow:none;
+      --alt-text-done-color:var(--editor-toolbar-fg-color);
+      --alt-text-warning-color:var(--editor-toolbar-fg-color);
+      --alt-text-hover-done-color:var(--editor-toolbar-hover-fg-color);
+      --alt-text-hover-warning-color:var(--editor-toolbar-hover-fg-color);
+    }
+
+    display:flex;
+    width:-moz-fit-content;
+    width:fit-content;
+    height:var(--editor-toolbar-height);
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    cursor:default;
+    pointer-events:auto;
+    box-sizing:content-box;
+    padding:var(--editor-toolbar-padding);
+    -webkit-user-select:none;
+       -moz-user-select:none;
+            user-select:none;
+
+    position:absolute;
+    inset-inline-end:0;
+    inset-block-start:calc(100% + var(--editor-toolbar-vert-offset));
+
+    border-radius:6px;
+    background-color:var(--editor-toolbar-bg-color);
+    border:1px solid var(--editor-toolbar-border-color);
+    box-shadow:var(--editor-toolbar-shadow);
+
+    &.hidden{
+      display:none;
+    }
+
+    &:has(:focus-visible){
+      border-color:transparent;
+    }
+
+    &:dir(ltr){
+      transform-origin:100% 0;
+    }
+
+    &:dir(rtl){
+      transform-origin:0 0;
+    }
+
+    .buttons{
+      display:flex;
+      justify-content:center;
+      align-items:center;
+      gap:0;
+      height:100%;
+
+      button{
+        padding:0;
+      }
+
+      .divider{
+        width:0;
+        height:calc(
+          2 * var(--editor-toolbar-padding) + var(--editor-toolbar-height)
+        );
+        border-left:1px solid var(--editor-toolbar-border-color);
+        border-right:none;
+        display:inline-block;
+        margin-inline:2px;
+      }
+
+      .basic{
+        width:var(--editor-toolbar-height);
+
+        &::before{
+          content:"";
+          -webkit-mask-repeat:no-repeat;
+                  mask-repeat:no-repeat;
+          -webkit-mask-position:center;
+                  mask-position:center;
+          display:inline-block;
+          background-color:var(--editor-toolbar-fg-color);
+          width:100%;
+          height:100%;
+        }
+
+        &:hover::before{
+          background-color:var(--editor-toolbar-hover-fg-color);
+        }
+
+        &.highlightButton::before{
+          -webkit-mask-image:var(--editor-toolbar-highlight-image);
+                  mask-image:var(--editor-toolbar-highlight-image);
+        }
+
+        &.commentButton::before{
+          -webkit-mask-image:var(--comment-edit-button-icon);
+                  mask-image:var(--comment-edit-button-icon);
+        }
+
+        &.deleteButton::before{
+          -webkit-mask-image:var(--editor-toolbar-delete-image);
+                  mask-image:var(--editor-toolbar-delete-image);
+        }
+      }
+
+      > *{
+        height:var(--editor-toolbar-height);
+      }
+
+      > :not(.divider){
+        border:none;
+        background-color:transparent;
+        cursor:pointer;
+
+        &:hover{
+          border-radius:2px;
+          background-color:var(--editor-toolbar-hover-bg-color);
+          color:var(--editor-toolbar-hover-fg-color);
+          outline:var(--editor-toolbar-hover-outline);
+          outline-offset:1px;
+
+          &:active{
+            outline:none;
+          }
+        }
+
+        &:focus-visible{
+          border-radius:2px;
+          outline:2px solid var(--editor-toolbar-focus-outline-color);
+        }
+      }
+
+      .altText{
+        --alt-text-add-image:url(images/altText_add.svg);
+        --alt-text-done-image:url(images/altText_done.svg);
+
+        display:flex;
+        align-items:center;
+        justify-content:center;
+        width:-moz-max-content;
+        width:max-content;
+        padding-inline:8px;
+        pointer-events:all;
+        font:menu;
+        font-weight:590;
+        font-size:12px;
+        color:var(--editor-toolbar-fg-color);
+
+        &:disabled{
+          pointer-events:none;
+        }
+
+        &::before{
+          content:"";
+          -webkit-mask-image:var(--alt-text-add-image);
+                  mask-image:var(--alt-text-add-image);
+          -webkit-mask-repeat:no-repeat;
+                  mask-repeat:no-repeat;
+          -webkit-mask-position:center;
+                  mask-position:center;
+          display:inline-block;
+          width:12px;
+          height:13px;
+          background-color:var(--editor-toolbar-fg-color);
+          margin-inline-end:4px;
+        }
+
+        &:hover::before{
+          background-color:var(--editor-toolbar-hover-fg-color);
+        }
+
+        &.done::before{
+          -webkit-mask-image:var(--alt-text-done-image);
+                  mask-image:var(--alt-text-done-image);
+        }
+
+        &.new{
+          &::before{
+            width:16px;
+            height:16px;
+            -webkit-mask-image:var(--new-alt-text-warning-image);
+                    mask-image:var(--new-alt-text-warning-image);
+            background-color:var(--alt-text-warning-color);
+            -webkit-mask-size:cover;
+                    mask-size:cover;
+          }
+
+          &:hover::before{
+            background-color:var(--alt-text-hover-warning-color);
+          }
+
+          &.done{
+            &::before{
+              -webkit-mask-image:var(--alt-text-done-image);
+                      mask-image:var(--alt-text-done-image);
+              background-color:var(--alt-text-done-color);
+            }
+
+            &:hover::before{
+              background-color:var(--alt-text-hover-done-color);
+            }
+          }
+        }
+
+        .tooltip{
+          display:none;
+          word-wrap:anywhere;
+
+          &.show{
+            --alt-text-tooltip-bg:light-dark(#f0f0f4, #1c1b22);
+            --alt-text-tooltip-fg:light-dark(#15141a, #fbfbfe);
+            --alt-text-tooltip-border:#8f8f9d;
+            --alt-text-tooltip-shadow:0 2px 6px 0 light-dark(rgb(58 57 68 / 0.2), #15141a);
+
+            @media screen and (forced-colors: active){
+              --alt-text-tooltip-bg:Canvas;
+              --alt-text-tooltip-fg:CanvasText;
+              --alt-text-tooltip-border:CanvasText;
+              --alt-text-tooltip-shadow:none;
+            }
+
+            display:inline-flex;
+            flex-direction:column;
+            align-items:center;
+            justify-content:center;
+            position:absolute;
+            top:calc(100% + 2px);
+            inset-inline-start:0;
+            padding-block:2px 3px;
+            padding-inline:3px;
+            max-width:300px;
+            width:-moz-max-content;
+            width:max-content;
+            height:auto;
+            font-size:12px;
+
+            border:0.5px solid var(--alt-text-tooltip-border);
+            background:var(--alt-text-tooltip-bg);
+            box-shadow:var(--alt-text-tooltip-shadow);
+            color:var(--alt-text-tooltip-fg);
+
+            pointer-events:none;
+          }
+        }
+      }
+
+      .comment{
+        width:var(--editor-toolbar-height);
+
+        &::before{
+          content:"";
+          -webkit-mask-image:var(--comment-edit-button-icon);
+                  mask-image:var(--comment-edit-button-icon);
+          -webkit-mask-repeat:no-repeat;
+                  mask-repeat:no-repeat;
+          -webkit-mask-position:center;
+                  mask-position:center;
+          display:inline-block;
+          background-color:var(--editor-toolbar-fg-color);
+          width:100%;
+          height:100%;
+        }
+      }
+    }
+  }
+}
+
+.annotationEditorLayer .freeTextEditor{
+  padding:calc(var(--freetext-padding) * var(--total-scale-factor));
+  width:auto;
+  height:auto;
+  touch-action:none;
+}
+
+.annotationEditorLayer .freeTextEditor .internal{
+  background:transparent;
+  border:none;
+  inset:0;
+  overflow:visible;
+  white-space:nowrap;
+  font:10px sans-serif;
+  line-height:var(--freetext-line-height);
+  text-align:start;
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+}
+
+.annotationEditorLayer .freeTextEditor .overlay{
+  position:absolute;
+  display:none;
+  background:transparent;
+  inset:0;
+  width:100%;
+  height:100%;
+}
+
+.annotationEditorLayer freeTextEditor .overlay.enabled{
+  display:block;
+}
+
+.annotationEditorLayer .freeTextEditor .internal:empty::before{
+  content:attr(default-content);
+  color:gray;
+}
+
+.annotationEditorLayer .freeTextEditor .internal:focus{
+  outline:none;
+  -webkit-user-select:auto;
+     -moz-user-select:auto;
+          user-select:auto;
+}
+
+.annotationEditorLayer .inkEditor{
+  width:100%;
+  height:100%;
+}
+
+.annotationEditorLayer .inkEditor.editing{
+  cursor:inherit;
+}
+
+.annotationEditorLayer .inkEditor .inkEditorCanvas{
+  position:absolute;
+  inset:0;
+  width:100%;
+  height:100%;
+  touch-action:none;
+}
+
+.annotationEditorLayer .stampEditor{
+  width:auto;
+  height:auto;
+
+  canvas{
+    position:absolute;
+    width:100%;
+    height:100%;
+    margin:0;
+    top:0;
+    left:0;
+  }
+
+  .noAltTextBadge{
+    --no-alt-text-badge-border-color:light-dark(#f0f0f4, #52525e);
+    --no-alt-text-badge-bg-color:light-dark(#cfcfd8, #fbfbfe);
+    --no-alt-text-badge-fg-color:light-dark(#5b5b66, #15141a);
+
+    @media screen and (forced-colors: active){
+      --no-alt-text-badge-border-color:ButtonText;
+      --no-alt-text-badge-bg-color:ButtonFace;
+      --no-alt-text-badge-fg-color:ButtonText;
+    }
+
+    position:absolute;
+    inset-inline-end:5px;
+    inset-block-end:5px;
+    display:inline-flex;
+    width:32px;
+    height:32px;
+    padding:3px;
+    justify-content:center;
+    align-items:center;
+    pointer-events:none;
+    z-index:1;
+
+    border-radius:2px;
+    border:1px solid var(--no-alt-text-badge-border-color);
+    background:var(--no-alt-text-badge-bg-color);
+
+    &::before{
+      content:"";
+      display:inline-block;
+      width:16px;
+      height:16px;
+      -webkit-mask-image:var(--new-alt-text-warning-image);
+              mask-image:var(--new-alt-text-warning-image);
+      -webkit-mask-size:cover;
+              mask-size:cover;
+      background-color:var(--no-alt-text-badge-fg-color);
+    }
+  }
+}
+
+.annotationEditorLayer{
+  :is(.freeTextEditor, .inkEditor, .stampEditor, .signatureEditor){
+    & > .resizers{
+      position:absolute;
+      inset:0;
+      z-index:1;
+
+      &.hidden{
+        display:none;
+      }
+
+      & > .resizer{
+        width:var(--resizer-size);
+        height:var(--resizer-size);
+        background:content-box var(--resizer-bg-color);
+        border:var(--focus-outline-around);
+        border-radius:2px;
+        position:absolute;
+
+        &.topLeft{
+          top:var(--resizer-shift);
+          left:var(--resizer-shift);
+        }
+
+        &.topMiddle{
+          top:var(--resizer-shift);
+          left:calc(50% + var(--resizer-shift));
+        }
+
+        &.topRight{
+          top:var(--resizer-shift);
+          right:var(--resizer-shift);
+        }
+
+        &.middleRight{
+          top:calc(50% + var(--resizer-shift));
+          right:var(--resizer-shift);
+        }
+
+        &.bottomRight{
+          bottom:var(--resizer-shift);
+          right:var(--resizer-shift);
+        }
+
+        &.bottomMiddle{
+          bottom:var(--resizer-shift);
+          left:calc(50% + var(--resizer-shift));
+        }
+
+        &.bottomLeft{
+          bottom:var(--resizer-shift);
+          left:var(--resizer-shift);
+        }
+
+        &.middleLeft{
+          top:calc(50% + var(--resizer-shift));
+          left:var(--resizer-shift);
+        }
+      }
+    }
+  }
+
+  &[data-main-rotation="0"]
+    :is([data-editor-rotation="0"], [data-editor-rotation="180"]),
+  &[data-main-rotation="90"]
+    :is([data-editor-rotation="270"], [data-editor-rotation="90"]),
+  &[data-main-rotation="180"]
+    :is([data-editor-rotation="180"], [data-editor-rotation="0"]),
+  &[data-main-rotation="270"]
+    :is([data-editor-rotation="90"], [data-editor-rotation="270"]){
+    & > .resizers > .resizer{
+      &.topLeft,
+      &.bottomRight{
+        cursor:nwse-resize;
+      }
+
+      &.topMiddle,
+      &.bottomMiddle{
+        cursor:ns-resize;
+      }
+
+      &.topRight,
+      &.bottomLeft{
+        cursor:nesw-resize;
+      }
+
+      &.middleRight,
+      &.middleLeft{
+        cursor:ew-resize;
+      }
+    }
+  }
+
+  &[data-main-rotation="0"]
+    :is([data-editor-rotation="90"], [data-editor-rotation="270"]),
+  &[data-main-rotation="90"]
+    :is([data-editor-rotation="0"], [data-editor-rotation="180"]),
+  &[data-main-rotation="180"]
+    :is([data-editor-rotation="270"], [data-editor-rotation="90"]),
+  &[data-main-rotation="270"]
+    :is([data-editor-rotation="180"], [data-editor-rotation="0"]){
+    & > .resizers > .resizer{
+      &.topLeft,
+      &.bottomRight{
+        cursor:nesw-resize;
+      }
+
+      &.topMiddle,
+      &.bottomMiddle{
+        cursor:ew-resize;
+      }
+
+      &.topRight,
+      &.bottomLeft{
+        cursor:nwse-resize;
+      }
+
+      &.middleRight,
+      &.middleLeft{
+        cursor:ns-resize;
+      }
+    }
+  }
+
+  &
+    :is(
+      [data-main-rotation="0"] [data-editor-rotation="90"],
+      [data-main-rotation="90"] [data-editor-rotation="0"],
+      [data-main-rotation="180"] [data-editor-rotation="270"],
+      [data-main-rotation="270"] [data-editor-rotation="180"]
+    ){
+    .editToolbar{
+      rotate:270deg;
+
+      &:dir(ltr){
+        inset-inline-end:calc(0px - var(--editor-toolbar-vert-offset));
+        inset-block-start:0;
+      }
+
+      &:dir(rtl){
+        inset-inline-end:calc(100% + var(--editor-toolbar-vert-offset));
+        inset-block-start:0;
+      }
+    }
+  }
+
+  &
+    :is(
+      [data-main-rotation="0"] [data-editor-rotation="180"],
+      [data-main-rotation="90"] [data-editor-rotation="90"],
+      [data-main-rotation="180"] [data-editor-rotation="0"],
+      [data-main-rotation="270"] [data-editor-rotation="270"]
+    ){
+    .editToolbar{
+      rotate:180deg;
+      inset-inline-end:100%;
+      inset-block-start:calc(0px - var(--editor-toolbar-vert-offset));
+    }
+  }
+
+  &
+    :is(
+      [data-main-rotation="0"] [data-editor-rotation="270"],
+      [data-main-rotation="90"] [data-editor-rotation="180"],
+      [data-main-rotation="180"] [data-editor-rotation="90"],
+      [data-main-rotation="270"] [data-editor-rotation="0"]
+    ){
+    .editToolbar{
+      rotate:90deg;
+
+      &:dir(ltr){
+        inset-inline-end:calc(100% + var(--editor-toolbar-vert-offset));
+        inset-block-start:100%;
+      }
+
+      &:dir(rtl){
+        inset-inline-start:calc(0px - var(--editor-toolbar-vert-offset));
+        inset-block-start:0;
+      }
+    }
+  }
+}
+
+.dialog.altText{
+  &::backdrop{
+    -webkit-mask:url(#alttext-manager-mask);
+            mask:url(#alttext-manager-mask);
+  }
+  &.positioned{
+    margin:0;
+  }
+
+  & #altTextContainer{
+    width:300px;
+    height:-moz-fit-content;
+    height:fit-content;
+    display:inline-flex;
+    flex-direction:column;
+    align-items:flex-start;
+    gap:16px;
+
+    & #overallDescription{
+      display:flex;
+      flex-direction:column;
+      align-items:flex-start;
+      gap:4px;
+      align-self:stretch;
+
+      & span{
+        align-self:stretch;
+      }
+
+      & .title{
+        font-size:13px;
+        font-style:normal;
+        font-weight:590;
+      }
+    }
+
+    & #addDescription{
+      display:flex;
+      flex-direction:column;
+      align-items:stretch;
+      gap:8px;
+
+      & .descriptionArea{
+        flex:1;
+        padding-inline:24px 10px;
+
+        textarea{
+          width:100%;
+          min-height:75px;
+        }
+      }
+    }
+
+    & #buttons{
+      display:flex;
+      justify-content:flex-end;
+      align-items:flex-start;
+      gap:8px;
+      align-self:stretch;
+    }
+  }
+}
+
+.dialog.newAltText{
+  --new-alt-text-ai-disclaimer-icon:url(images/altText_disclaimer.svg);
+  --new-alt-text-spinner-icon:url(images/altText_spinner.svg);
+  --preview-image-bg-color:light-dark(#f0f0f4, #2b2a33);
+  --preview-image-border:none;
+
+  @media screen and (forced-colors: active){
+    --preview-image-bg-color:ButtonFace;
+    --preview-image-border:1px solid ButtonText;
+  }
+
+  width:80%;
+  max-width:570px;
+  min-width:300px;
+  padding:0;
+
+  &.noAi{
+    #newAltTextDisclaimer,
+    #newAltTextCreateAutomatically{
+      display:none !important;
+    }
+  }
+
+  &.aiInstalling{
+    #newAltTextCreateAutomatically{
+      display:none !important;
+    }
+    #newAltTextDownloadModel{
+      display:flex !important;
+    }
+  }
+
+  &.error{
+    #newAltTextNotNow{
+      display:none !important;
+    }
+
+    #newAltTextCancel{
+      display:inline-block !important;
+    }
+  }
+
+  &:not(.error) #newAltTextError{
+    display:none !important;
+  }
+
+  #newAltTextContainer{
+    display:flex;
+    width:auto;
+    padding:16px;
+    flex-direction:column;
+    justify-content:flex-end;
+    align-items:flex-start;
+    gap:12px;
+    flex:0 1 auto;
+    line-height:normal;
+
+    #mainContent{
+      display:flex;
+      justify-content:flex-end;
+      align-items:flex-start;
+      gap:12px;
+      align-self:stretch;
+      flex:1 1 auto;
+
+      #descriptionAndSettings{
+        display:flex;
+        flex-direction:column;
+        align-items:flex-start;
+        gap:16px;
+        flex:1 0 0;
+        align-self:stretch;
+      }
+
+      #descriptionInstruction{
+        display:flex;
+        flex-direction:column;
+        align-items:flex-start;
+        gap:8px;
+        align-self:stretch;
+        flex:1 1 auto;
+
+        #newAltTextDescriptionContainer{
+          width:100%;
+          height:70px;
+          position:relative;
+
+          textarea{
+            width:100%;
+            height:100%;
+            padding:8px;
+
+            &::-moz-placeholder{
+              color:var(--text-secondary-color);
+            }
+
+            &::placeholder{
+              color:var(--text-secondary-color);
+            }
+          }
+
+          .altTextSpinner{
+            display:none;
+            position:absolute;
+            width:16px;
+            height:16px;
+            inset-inline-start:8px;
+            inset-block-start:8px;
+            -webkit-mask-size:cover;
+                    mask-size:cover;
+            background-color:var(--text-secondary-color);
+            pointer-events:none;
+          }
+
+          &.loading{
+            textarea::-moz-placeholder{
+              color:transparent;
+            }
+            textarea::placeholder{
+              color:transparent;
+            }
+
+            .altTextSpinner{
+              display:inline-block;
+              -webkit-mask-image:var(--new-alt-text-spinner-icon);
+                      mask-image:var(--new-alt-text-spinner-icon);
+            }
+          }
+        }
+
+        #newAltTextDescription{
+          font-size:11px;
+        }
+
+        #newAltTextDisclaimer{
+          display:flex;
+          flex-direction:row;
+          align-items:flex-start;
+          gap:4px;
+          font-size:11px;
+
+          &::before{
+            content:"";
+            display:inline-block;
+            width:17px;
+            height:16px;
+            -webkit-mask-image:var(--new-alt-text-ai-disclaimer-icon);
+                    mask-image:var(--new-alt-text-ai-disclaimer-icon);
+            -webkit-mask-size:cover;
+                    mask-size:cover;
+            background-color:var(--text-secondary-color);
+            flex:1 0 auto;
+          }
+        }
+      }
+
+      #newAltTextDownloadModel{
+        display:flex;
+        align-items:center;
+        gap:4px;
+        align-self:stretch;
+
+        &::before{
+          content:"";
+          display:inline-block;
+          width:16px;
+          height:16px;
+          -webkit-mask-image:var(--new-alt-text-spinner-icon);
+                  mask-image:var(--new-alt-text-spinner-icon);
+          -webkit-mask-size:cover;
+                  mask-size:cover;
+          background-color:var(--text-secondary-color);
+        }
+      }
+
+      #newAltTextImagePreview{
+        width:180px;
+        aspect-ratio:1;
+        display:flex;
+        justify-content:center;
+        align-items:center;
+        flex:0 0 auto;
+        background-color:var(--preview-image-bg-color);
+        border:var(--preview-image-border);
+
+        > canvas{
+          max-width:100%;
+          max-height:100%;
+        }
+      }
+    }
+  }
+}
+
+.colorPicker{
+  --hover-outline-color:light-dark(#0250bb, #80ebff);
+  --selected-outline-color:light-dark(#0060df, #aaf2ff);
+  --swatch-border-color:light-dark(#cfcfd8, #52525e);
+
+  @media screen and (forced-colors: active){
+    --hover-outline-color:Highlight;
+    --selected-outline-color:var(--hover-outline-color);
+    --swatch-border-color:ButtonText;
+  }
+
+  .swatch{
+    width:16px;
+    height:16px;
+    border:1px solid var(--swatch-border-color);
+    border-radius:100%;
+    outline-offset:2px;
+    box-sizing:border-box;
+    forced-color-adjust:none;
+  }
+
+  button:is(:hover, .selected) > .swatch{
+    border:none;
+  }
+}
+
+.basicColorPicker{
+  width:28px;
+
+  &::-moz-color-swatch{
+    border-radius:100%;
+    margin:0;
+  }
+
+  &::-webkit-color-swatch{
+    border-radius:100%;
+    margin:0;
+  }
+}
+
+.annotationEditorLayer{
+  &[data-main-rotation="0"]{
+    .highlightEditor:not(.free) > .editToolbar{
+      rotate:0deg;
+    }
+  }
+
+  &[data-main-rotation="90"]{
+    .highlightEditor:not(.free) > .editToolbar{
+      rotate:270deg;
+    }
+  }
+
+  &[data-main-rotation="180"]{
+    .highlightEditor:not(.free) > .editToolbar{
+      rotate:180deg;
+    }
+  }
+
+  &[data-main-rotation="270"]{
+    .highlightEditor:not(.free) > .editToolbar{
+      rotate:90deg;
+    }
+  }
+
+  .highlightEditor{
+    position:absolute;
+    background:transparent;
+    z-index:1;
+    cursor:auto;
+    max-width:100%;
+    max-height:100%;
+    border:none;
+    outline:none;
+    pointer-events:none;
+    transform-origin:0 0;
+
+    &:not(.free){
+      transform:none;
+    }
+
+    .internal{
+      position:absolute;
+      top:0;
+      left:0;
+      width:100%;
+      height:100%;
+      pointer-events:auto;
+    }
+
+    &.disabled .internal{
+      pointer-events:none;
+    }
+
+    &.selectedEditor{
+      .internal{
+        cursor:pointer;
+      }
+    }
+
+    .editToolbar{
+      --editor-toolbar-colorpicker-arrow-image:url(images/toolbarButton-menuArrow.svg);
+
+      transform-origin:center !important;
+
+      .buttons{
+        .colorPicker{
+          position:relative;
+          width:auto;
+          display:flex;
+          justify-content:center;
+          align-items:center;
+          gap:4px;
+          padding:4px;
+
+          &::after{
+            content:"";
+            -webkit-mask-image:var(--editor-toolbar-colorpicker-arrow-image);
+                    mask-image:var(--editor-toolbar-colorpicker-arrow-image);
+            -webkit-mask-repeat:no-repeat;
+                    mask-repeat:no-repeat;
+            -webkit-mask-position:center;
+                    mask-position:center;
+            display:inline-block;
+            background-color:var(--editor-toolbar-fg-color);
+            width:12px;
+            height:12px;
+          }
+
+          &:hover::after{
+            background-color:var(--editor-toolbar-hover-fg-color);
+          }
+
+          &:has(.dropdown:not(.hidden)){
+            background-color:var(--editor-toolbar-hover-bg-color);
+
+            &::after{
+              scale:-1;
+            }
+          }
+
+          .dropdown{
+            position:absolute;
+            display:flex;
+            justify-content:center;
+            align-items:center;
+            flex-direction:column;
+            gap:11px;
+            padding-block:8px;
+            border-radius:6px;
+            background-color:var(--editor-toolbar-bg-color);
+            border:1px solid var(--editor-toolbar-border-color);
+            box-shadow:var(--editor-toolbar-shadow);
+            inset-block-start:calc(100% + 4px);
+            width:calc(100% + 2 * var(--editor-toolbar-padding));
+
+            button{
+              width:100%;
+              height:auto;
+              border:none;
+              cursor:pointer;
+              display:flex;
+              justify-content:center;
+              align-items:center;
+              background:none;
+
+              &:is(:active, :focus-visible){
+                outline:none;
+              }
+
+              > .swatch{
+                outline-offset:2px;
+              }
+
+              &[aria-selected="true"] > .swatch{
+                outline:2px solid var(--selected-outline-color);
+              }
+
+              &:is(:hover, :active, :focus-visible) > .swatch{
+                outline:2px solid var(--hover-outline-color);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+.editorParamsToolbar:has(#highlightParamsToolbarContainer){
+  padding:unset;
+}
+
+#highlightParamsToolbarContainer{
+  gap:16px;
+  padding-inline:10px;
+  padding-block-end:12px;
+
+  .colorPicker{
+    display:flex;
+    flex-direction:column;
+    gap:8px;
+
+    .dropdown{
+      display:flex;
+      justify-content:space-between;
+      align-items:center;
+      flex-direction:row;
+      height:auto;
+
+      button{
+        width:auto;
+        height:auto;
+        border:none;
+        cursor:pointer;
+        display:flex;
+        justify-content:center;
+        align-items:center;
+        background:none;
+        flex:0 0 auto;
+        padding:0;
+
+        .swatch{
+          width:24px;
+          height:24px;
+        }
+
+        &:is(:active, :focus-visible){
+          outline:none;
+        }
+
+        &[aria-selected="true"] > .swatch{
+          outline:2px solid var(--selected-outline-color);
+        }
+
+        &:is(:hover, :active, :focus-visible) > .swatch{
+          outline:2px solid var(--hover-outline-color);
+        }
+      }
+    }
+  }
+
+  #editorHighlightThickness{
+    display:flex;
+    flex-direction:column;
+    align-items:center;
+    gap:4px;
+    align-self:stretch;
+
+    .editorParamsLabel{
+      height:auto;
+      align-self:stretch;
+    }
+
+    .thicknessPicker{
+      display:flex;
+      justify-content:space-between;
+      align-items:center;
+      align-self:stretch;
+
+      --example-color:light-dark(#bfbfc9, #80808e);
+
+      @media screen and (forced-colors: active){
+        --example-color:CanvasText;
+      }
+
+      :is(& > .editorParamsSlider[disabled]){
+        opacity:0.4;
+      }
+
+      &::before,
+      &::after{
+        content:"";
+        width:8px;
+        aspect-ratio:1;
+        display:block;
+        border-radius:100%;
+        background-color:var(--example-color);
+      }
+      &::after{
+        width:24px;
+      }
+
+      .editorParamsSlider{
+        width:unset;
+        height:14px;
+      }
+    }
+  }
+
+  #editorHighlightVisibility{
+    display:flex;
+    flex-direction:column;
+    align-items:flex-start;
+    gap:8px;
+    align-self:stretch;
+
+    .divider{
+      --divider-color:light-dark(#d7d7db, #8f8f9d);
+
+      @media screen and (forced-colors: active){
+        --divider-color:CanvasText;
+      }
+
+      margin-block:4px;
+      width:100%;
+      height:1px;
+      background-color:var(--divider-color);
+    }
+
+    .toggler{
+      display:flex;
+      justify-content:space-between;
+      align-items:center;
+      align-self:stretch;
+    }
+  }
+}
+
+#altTextSettingsDialog{
+  padding:16px;
+
+  #altTextSettingsContainer{
+    display:flex;
+    width:573px;
+    flex-direction:column;
+    gap:16px;
+
+    .mainContainer{
+      gap:16px;
+    }
+
+    .description{
+      color:var(--text-secondary-color);
+    }
+
+    #aiModelSettings{
+      display:flex;
+      flex-direction:column;
+      gap:12px;
+    }
+
+    #automaticAltText,
+    #altTextEditor{
+      display:flex;
+      flex-direction:column;
+      gap:8px;
+    }
+
+    #createModelDescription,
+    #aiModelSettings,
+    #showAltTextDialogDescription{
+      padding-inline-start:40px;
+    }
+
+    #automaticSettings{
+      display:flex;
+      flex-direction:column;
+      gap:16px;
+    }
+  }
+}
+
+button.hasPopupMenu{
+  &[aria-expanded="true"] + menu{
+    visibility:visible;
+  }
+
+  &[aria-expanded="false"] + menu{
+    visibility:hidden;
+  }
+}
+
+.popupMenu{
+  --menuitem-checkmark-icon:url(images/checkmark.svg);
+  --menu-mark-icon-size:0;
+  --menu-icon-size:16px;
+  --menuitem-gap:5px;
+  --menuitem-border-color:transparent;
+  --menuitem-active-bg:color-mix(
+    in srgb,
+    var(--menu-text-color),
+    transparent 79%
+  );
+  --menuitem-text-active-fg:var(--menu-text-color);
+  --menuitem-active-border-color:var(--menuitem-border-color);
+  --menuitem-focus-bg:color-mix(
+    in srgb,
+    var(--menu-text-color),
+    transparent 93%
+  );
+  --menuitem-focus-outline-color:light-dark(#0062fa, #00cadb);
+  --menuitem-focus-border-color:light-dark(white, black);
+
+  --menu-bg:light-dark(white, #23222b);
+  --menu-background-blend-mode:normal;
+  --menu-box-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
+  --menu-border-color:light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1));
+  --menuitem-border-radius:8px;
+  --menu-backdrop-filter:none;
+  --menu-text-color:light-dark(#15141a, #fbfbfe);
+  --menu-text-disabled-color:var(--menu-text-color);
+  --menuitem-text-hover-fg:var(--menu-text-color);
+  --menuitem-hover-bg:color-mix(
+    in srgb,
+    var(--menu-text-color),
+    transparent 86%
+  );
+  --menuitem-hover-background-blend-mode:normal;
+  --disabled-opacity:0.62;
+
+  @media screen and (forced-colors: active){
+    --menu-bg:Canvas;
+    --menu-background-blend-mode:normal;
+    --menu-box-shadow:none;
+    --menu-backdrop-filter:none;
+    --menu-text-color:ButtonText;
+    --menu-text-disabled-color:GrayText;
+    --menu-border-color:CanvasText;
+    --menuitem-border-color:none;
+    --menuitem-hover-bg:SelectedItemText;
+    --menuitem-text-hover-fg:SelectedItem;
+    --menuitem-active-bg:SelectedItemText;
+    --menuitem-active-border-color:ButtonText;
+    --menuitem-text-active-fg:SelectedItem;
+    --menuitem-focus-bg:ButtonFace;
+    --menuitem-focus-outline-color:CanvasText;
+    --menuitem-focus-border-color:none;
+    --disabled-opacity:1;
+  }
+
+  display:flex;
+  flex-direction:column;
+  width:-moz-max-content;
+  width:max-content;
+  height:auto;
+  position:relative;
+  left:0;
+  top:1px;
+  margin:0;
+  padding:5px;
+  box-sizing:border-box;
+
+  background:var(--menu-bg);
+  background-blend-mode:var(--menu-background-blend-mode);
+  box-shadow:var(--menu-box-shadow);
+  border-radius:6px;
+  border:1px solid var(--menu-border-color);
+  backdrop-filter:var(--menu-backdrop-filter);
+
+  &.withMark{
+    --menu-mark-icon-size:16px;
+  }
+
+  > button{
+    display:flex;
+    align-items:center;
+    position:relative;
+    width:100%;
+    height:26px;
+    padding-inline:calc(var(--menu-mark-icon-size) + var(--menuitem-gap)) var(--menuitem-gap);
+    gap:var(--menuitem-gap);
+    box-sizing:border-box;
+    border-radius:var(--menuitem-border-radius);
+    border:1px solid var(--menuitem-border-color);
+    background:transparent;
+
+    &.selected::after{
+      content:"";
+      display:inline-block;
+      width:11px;
+      height:11px;
+      -webkit-mask-repeat:no-repeat;
+              mask-repeat:no-repeat;
+      -webkit-mask-position:center;
+              mask-position:center;
+      -webkit-mask-image:var(--menuitem-checkmark-icon);
+              mask-image:var(--menuitem-checkmark-icon);
+      background-color:var(--menu-text-color);
+      position:absolute;
+      inset-inline-start:var(--menuitem-gap);
+      top:50%;
+      transform:translateY(-50%);
+    }
+
+    &:disabled{
+      opacity:var(--disabled-opacity);
+
+      &.selected::after{
+        background-color:var(--menu-text-disabled-color);
+      }
+
+      &:not(.noIcon)::before{
+        background-color:var(--menu-text-disabled-color);
+      }
+
+      > span{
+        color:var(--menu-text-disabled-color);
+      }
+    }
+
+    &:not(:disabled){
+      &:hover{
+        background:var(--menuitem-hover-bg);
+        background-blend-mode:var(--menuitem-hover-background-blend-mode);
+
+        &:not(.noIcon)::before{
+          background-color:var(--menuitem-text-hover-fg);
+        }
+
+        > span{
+          color:var(--menuitem-text-hover-fg);
+        }
+
+        &.selected::after{
+          background-color:var(--menuitem-text-hover-fg);
+        }
+      }
+
+      &:active{
+        background-color:var(--menuitem-active-bg);
+        border-color:var(--menuitem-active-border-color);
+
+        > span{
+          color:var(--menuitem-text-active-fg);
+        }
+      }
+
+      &:focus-visible{
+        border-color:var(--menuitem-focus-border-color);
+        background-color:var(--menuitem-focus-bg);
+        outline:2px solid var(--menuitem-focus-outline-color);
+        outline-offset:2px;
+      }
+    }
+
+    &:not(.noIcon)::before{
+      display:inline-block;
+      width:var(--menu-icon-size);
+      height:var(--menu-icon-size);
+      content:"";
+      -webkit-mask-size:cover;
+              mask-size:cover;
+      -webkit-mask-position:center;
+              mask-position:center;
+      background-color:var(--menu-text-color);
+    }
+
+    > span{
+      display:flex;
+      align-items:center;
+      align-self:stretch;
+      width:100%;
+      min-width:-moz-max-content;
+      min-width:max-content;
+      text-align:start;
+      color:var(--menu-text-color);
+      -webkit-user-select:none;
+         -moz-user-select:none;
+              user-select:none;
+      padding-inline-start:6px;
+
+      font:menu;
+      font-size:13px;
+      font-style:normal;
+      font-weight:510;
+      line-height:normal;
+    }
+  }
+}
+
+.treeView{
+  --treeitem-color:light-dark(rgb(0 0 0 / 0.8), rgb(255 255 255 / 0.8));
+  --treeitem-bg-color:light-dark(rgb(0 0 0 / 0.15), rgb(255 255 255 / 0.15));
+  --treeitem-hover-color:light-dark(rgb(0 0 0 / 0.9), rgb(255 255 255 / 0.9));
+  --treeitem-selected-color:light-dark(
+    rgb(0 0 0 / 0.9),
+    rgb(255 255 255 / 0.9)
+  );
+  --treeitem-selected-bg-color:light-dark(
+    rgb(0 0 0 / 0.25),
+    rgb(255 255 255 / 0.25)
+  );
+  --treeitem-expanded-icon:url(images/treeitem-expanded.svg);
+  --treeitem-collapsed-icon:url(images/treeitem-collapsed.svg);
+
+  &.withNesting{
+    .treeItemToggler{
+      &::before{
+        position:absolute;
+        display:inline-block;
+        width:16px;
+        height:16px;
+        inset-inline-end:4px;
+
+        content:"";
+        background-color:var(--toolbar-icon-bg-color);
+        -webkit-mask-image:var(--treeitem-expanded-icon);
+                mask-image:var(--treeitem-expanded-icon);
+        -webkit-mask-size:cover;
+                mask-size:cover;
+      }
+
+      position:relative;
+      float:inline-start;
+      height:0;
+      width:0;
+      color:rgb(255 255 255 / 0.5);
+
+      &.treeItemsHidden{
+        &::before{
+          -webkit-mask-image:var(--treeitem-collapsed-icon);
+                  mask-image:var(--treeitem-collapsed-icon);
+          transform:scaleX(var(--dir-factor));
+        }
+
+        ~ .treeItems{
+          display:none;
+        }
+      }
+
+      &:hover + a,
+      &:hover ~ .treeItems{
+        background-color:var(--treeitem-bg-color);
+        background-clip:padding-box;
+        border-radius:2px;
+        color:var(--treeitem-hover-color);
+      }
+    }
+
+    > .treeItem,
+    .treeItem > .treeItems{
+      margin-inline-start:20px;
+    }
+  }
+
+  &#layersView .treeItem > a{
+    *{
+      cursor:pointer;
+    }
+
+    > label{
+      display:flex;
+      align-items:center;
+      padding-inline-start:4px;
+      > input{
+        margin-top:1px;
+      }
+    }
+  }
+
+  .treeItem{
+    > a{
+      text-decoration:none;
+      display:inline-block;
+      min-width:calc(100% - 4px);
+      height:auto;
+      margin-bottom:1px;
+      padding:2px 0 5px;
+      padding-inline-start:4px;
+      border-radius:2px;
+      color:var(--treeitem-color);
+      font-size:13px;
+      line-height:15px;
+      -webkit-user-select:none;
+         -moz-user-select:none;
+              user-select:none;
+      white-space:normal;
+      cursor:default;
+
+      &:hover{
+        background-color:var(--treeitem-bg-color);
+        background-clip:padding-box;
+        border-radius:2px;
+        color:var(--treeitem-hover-color);
+      }
+    }
+
+    &.selected > a{
+      background-color:var(--treeitem-selected-bg-color);
+      color:var(--treeitem-selected-color);
+    }
+  }
+}
+
+#outerContainer{
+  &.viewsManagerMoving{
+    #viewsManager{
+      visibility:visible;
+    }
+  }
+
+  &.viewsManagerOpen{
+    #viewsManager{
+      visibility:visible;
+      inset-inline-start:8px;
+    }
+
+    #viewerContainer:not(.pdfPresentationMode){
+      inset-inline-start:var(--viewsManager-width, 0);
+      transition-property:inset-inline-start;
+    }
+  }
+
+  &.viewsManagerResizing :is(#sidebarContainer, #viewerContainer, #loadingBar){
+    transition-duration:0s;
+  }
+}
+
+#viewsManager{
+  --views-manager-button-icon:url(images/pages_viewButton.svg);
+  --views-manager-button-arrow-icon:url(images/pages_viewArrow.svg);
+  --views-manager-add-file-button-icon:url(images/toolbarButton-zoomIn.svg);
+  --current-outline-button-icon:url(images/toolbarButton-currentOutlineItem.svg);
+  --menuitem-thumbnailsView-icon:url(images/pages_viewButton.svg);
+  --menuitem-outlinesView-icon:url(images/toolbarButton-viewOutline.svg);
+  --menuitem-attachmentsView-icon:url(images/toolbarButton-viewAttachments.svg);
+  --menuitem-layersView-icon:url(images/toolbarButton-viewLayers.svg);
+  --manage-button-icon:url(images/toolbarButton-pageDown.svg);
+  --close-button-icon:url(images/pages_closeButton.svg);
+  --undo-label-icon:url(images/altText_done.svg);
+  --pages-selected-icon:url(images/pages_selected.svg);
+  --spinner-icon:url(images/altText_spinner.svg);
+
+  --sidebar-bg-color:light-dark(rgb(255 255 255 / 0.92), rgb(66 65 77 / 0.92));
+  --sidebar-backdrop-filter:blur(7px);
+  --sidebar-width:230px;
+  --sidebar-min-width:min-content;
+  --sidebar-max-width:50vw;
+  --sidebar-block-padding:8px;
+
+  --text-color:light-dark(#15141a, #fbfbfe);
+  --button-fg:var(--text-color);
+  --button-no-bg:transparent;
+  --button-bg:light-dark(rgb(21 20 26 / 0.07), rgb(251 251 254 / 0.07));
+  --button-border-color:transparent;
+  --button-hover-bg:light-dark(rgb(21 20 26 / 0.14), rgb(251 251 254 / 0.14));
+  --button-hover-fg:var(--text-color);
+  --button-hover-border-color:var(--button-border-color);
+  --button-active-bg:light-dark(rgb(21 20 26 / 0.21), rgb(251 251 254 / 0.21));
+  --button-active-fg:var(--text-color);
+  --button-active-border-color:var(--button-border-color);
+  --button-focus-no-bg:color-mix(in srgb, var(--text-color), transparent 93%);
+  --button-focus-outline-color:light-dark(#0062fa, #00cadb);
+  --button-focus-border-color:light-dark(white, black);
+  --status-border-color:transparent;
+  --status-actions-bg:light-dark(
+    rgb(21 20 26 / 0.03),
+    rgb(251 251 254 / 0.03)
+  );
+  --status-undo-bg:light-dark(rgb(0 98 250 / 0.08), rgb(0 202 219 / 0.08));
+  --status-waiting-bg:var(--status-undo-bg);
+  --indicator-color:light-dark(#0062fa, #00cadb);
+  --status-warning-bg:light-dark(#ffe8ea, #6e001f);
+  --indicator-warning-color:light-dark(#b20037, #ffa0aa);
+  --header-shadow:0 0.25px 0.75px -0.75px light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 2px 6px -6px light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
+  --header-bg:light-dark(rgb(255 255 255 / 0.92), #42414e);
+  --image-outline:none;
+  --image-border-width:6px;
+  --image-border-color:light-dark(#cfcfd8, #3a3944);
+  --image-hover-border-color:#bfbfc9;
+  --image-current-border-color:var(--button-focus-outline-color);
+  --image-current-focused-outline-color:var(--image-hover-border-color);
+  --image-page-number-bg:light-dark(#f0f0f4, #42414d);
+  --image-page-number-fg:var(--text-color);
+  --image-page-number-border-color:transparent;
+  --image-hover-page-number-bg:var(--image-page-number-bg);
+  --image-hover-page-number-fg:var(--image-page-number-fg);
+  --image-current-page-number-bg:var(--image-current-border-color);
+  --image-current-page-number-fg:light-dark(#fff, #15141a);
+  --image-current-hover-page-number-bg:var(--image-current-page-number-bg);
+  --image-current-hover-page-number-fg:var(--image-current-page-number-fg);
+  --image-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 0 0 1px var(--image-border-color), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
+  --image-hover-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 0 0 1px light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1)), 0 0 0 var(--image-border-width) var(--image-hover-border-color), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
+  --image-current-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 0 0 var(--image-border-width) var(--image-current-border-color), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
+  --image-dragging-placeholder-bg:light-dark(
+    rgb(0 98 250 / 0.08),
+    rgb(0 202 219 / 0.08)
+  );
+  --image-dragging-placeholder-border:var(--image-outline);
+  --multiple-dragging-bg:white;
+  --image-multiple-dragging-shadow:0 0 0 var(--image-border-width) var(--image-current-border-color), var(--image-border-width) var(--image-border-width) 0 calc(var(--image-border-width) / 2) var(--multiple-dragging-bg), var(--image-border-width) var(--image-border-width) 0 calc(3 * var(--image-border-width) / 2) var(--image-current-border-color);
+  --image-dragging-shadow:0 0 0 var(--image-border-width) var(--image-current-border-color);
+  --multiple-dragging-indicator-bg:var(--indicator-color);
+  --multiple-dragging-text-color:light-dark(#fbfbfe, #15141a);
+
+  @media screen and (forced-colors: active){
+    --text-color:CanvasText;
+    --button-fg:ButtonText;
+    --button-bg:ButtonFace;
+    --button-no-bg:ButtonFace;
+    --button-border-color:ButtonText;
+    --button-hover-bg:SelectedItemText;
+    --button-hover-fg:SelectedItem;
+    --button-hover-border-color:SelectedItem;
+    --button-active-bg:SelectedItemText;
+    --button-active-fg:SelectedItem;
+    --button-active-border-color:ButtonText;
+    --button-focus-no-bg:ButtonFace;
+    --button-focus-outline-color:CanvasText;
+    --button-focus-border-color:none;
+    --status-border-color:CanvasText;
+    --status-undo-bg:none;
+    --indicator-color:CanvasText;
+    --status-warning-bg:none;
+    --indicator-warning-color:CanvasText;
+    --header-shadow:none;
+    --image-shadow:none;
+    --image-outline:1px solid ButtonText;
+    --image-focus-outline-color:CanvasText;
+    --image-hover-border-color:SelectedItem;
+    --image-hover-page-number-bg:SelectedItemText;
+    --image-hover-page-number-fg:SelectedItem;
+    --image-current-page-number-bg:ButtonText;
+    --image-current-page-number-fg:ButtonFace;
+    --image-current-border-color:ButtonText;
+    --image-current-focused-outline-color:var(--image-hover-border-color);
+    --image-current-hover-page-number-bg:SelectedItem;
+    --image-current-hover-page-number-fg:SelectedItemText;
+    --image-page-number-bg:ButtonFace;
+    --image-page-number-fg:ButtonText;
+    --image-page-number-border-color:var(--image-page-number-fg);
+    --multiple-dragging-bg:Canvas;
+    --multiple-dragging-indicator-bg:ButtonBorder;
+    --multiple-dragging-text-color:Canvas;
+    --image-dragging-placeholder-bg:Canvas;
+    --image-dragging-placeholder-border:1px GrayText solid;
+  }
+
+  display:flex;
+  padding-bottom:16px;
+  flex-direction:column;
+  align-items:flex-start;
+  inset-block-start:calc(100% + var(--sidebar-block-padding));
+  height:calc(
+    var(--viewer-container-height) - 2 * var(--sidebar-block-padding)
+  );
+  position:absolute;
+
+  inset-inline-start:calc(
+    -1 * var(--viewsManager-width, --sidebar-width) - 1px
+  );
+  transition-property:inset-inline-start;
+  transition-duration:var(--sidebar-transition-duration);
+  transition-timing-function:var(--sidebar-transition-timing-function);
+
+  .sidebarResizer{
+    inset-inline-start:calc(100% + 4px);
+  }
+
+  .viewsManagerButton{
+    width:auto;
+    color:var(--button-fg);
+    border-radius:8px;
+    border:1px solid var(--button-border-color);
+    background:var(--button-bg);
+
+    &:hover{
+      background-color:var(--button-hover-bg) !important;
+      color:var(--button-hover-fg) !important;
+      border-color:var(--button-hover-border-color) !important;
+
+      &::before{
+        background-color:var(--button-hover-fg) !important;
+      }
+    }
+    &:active{
+      background:var(--button-active-bg) !important;
+      color:var(--button-active-fg) !important;
+      border-color:var(--button-active-border-color) !important;
+
+      &::before{
+        background-color:var(--button-active-fg) !important;
+      }
+    }
+    &:focus-visible{
+      outline:2px solid var(--button-focus-outline-color);
+      outline-offset:2px;
+      border-color:var(--button-focus-border-color);
+    }
+
+    &.viewsCloseButton{
+      width:26px;
+      height:26px;
+      padding:4px;
+      border-radius:8px;
+      background:none;
+
+      &::before{
+        -webkit-mask-image:var(--close-button-icon);
+                mask-image:var(--close-button-icon);
+      }
+    }
+  }
+
+  #viewsManagerHeader{
+    display:flex;
+    flex-direction:column;
+    align-items:flex-start;
+    align-self:stretch;
+    width:100%;
+    box-shadow:var(--header-shadow);
+    flex:0 0 auto;
+    background-color:var(--header-bg);
+
+    .viewsManagerLabel{
+      flex:1 1 auto;
+      color:var(--text-color);
+      text-align:center;
+      height:-moz-fit-content;
+      height:fit-content;
+      width:-moz-fit-content;
+      width:fit-content;
+      -webkit-user-select:none;
+         -moz-user-select:none;
+              user-select:none;
+
+      font:menu;
+      font-size:15px;
+      font-style:normal;
+      font-weight:400;
+      line-height:normal;
+    }
+
+    #viewsManagerTitle{
+      display:flex;
+      flex-direction:row;
+      align-items:center;
+      align-self:stretch;
+      justify-content:space-between;
+      width:auto;
+      padding:12px 16px 12px 8px;
+
+      &:not(:has(#viewsManagerHeaderLabel ~ button:not([hidden])))::after{
+
+        content:"";
+        flex:0 0 auto;
+        width:32px;
+        height:32px;
+        pointer-events:none;
+      }
+
+      #viewsManagerSelector{
+        width:48px;
+        height:32px;
+        display:block;
+
+        > button{
+          background:var(--button-no-bg);
+          width:100%;
+          height:100%;
+
+          &:focus-visible{
+            background-color:var(--button-focus-no-bg);
+          }
+
+          &::before{
+            -webkit-mask-repeat:no-repeat;
+                    mask-repeat:no-repeat;
+            -webkit-mask-image:var(--views-manager-button-icon);
+                    mask-image:var(--views-manager-button-icon);
+            background-color:var(--button-fg);
+          }
+
+          &::after{
+            content:"";
+            display:inline-block;
+            width:12px;
+            height:12px;
+            margin-left:8px;
+            -webkit-mask-repeat:no-repeat;
+                    mask-repeat:no-repeat;
+            -webkit-mask-position:center;
+                    mask-position:center;
+            -webkit-mask-image:var(--views-manager-button-arrow-icon);
+                    mask-image:var(--views-manager-button-arrow-icon);
+            background-color:var(--button-fg);
+          }
+
+          &:hover{
+            &::before,
+            &::after{
+              background-color:var(--button-hover-fg) !important;
+            }
+          }
+
+          &:active{
+            &::before,
+            &::after{
+              background-color:var(--button-active-fg) !important;
+            }
+          }
+        }
+
+        > .popupMenu{
+          min-width:182px;
+          z-index:1;
+
+          > button{
+            &#thumbnailsViewMenu::before{
+              -webkit-mask-image:var(--menuitem-thumbnailsView-icon);
+                      mask-image:var(--menuitem-thumbnailsView-icon);
+            }
+            &#outlinesViewMenu::before{
+              -webkit-mask-image:var(--menuitem-outlinesView-icon);
+                      mask-image:var(--menuitem-outlinesView-icon);
+            }
+            &#attachmentsViewMenu::before{
+              -webkit-mask-image:var(--menuitem-attachmentsView-icon);
+                      mask-image:var(--menuitem-attachmentsView-icon);
+            }
+            &#layersViewMenu::before{
+              -webkit-mask-image:var(--menuitem-layersView-icon);
+                      mask-image:var(--menuitem-layersView-icon);
+            }
+          }
+        }
+      }
+
+      #viewsManagerAddFileButton{
+        background:var(--button-no-bg);
+        width:32px;
+        height:32px;
+
+        &:focus-visible{
+          background-color:var(--button-focus-no-bg);
+        }
+
+        &::before{
+          -webkit-mask-repeat:no-repeat;
+                  mask-repeat:no-repeat;
+          -webkit-mask-image:var(--views-manager-add-file-button-icon);
+                  mask-image:var(--views-manager-add-file-button-icon);
+          background-color:var(--button-fg);
+        }
+
+        > input{
+          display:none;
+        }
+      }
+
+      #viewsManagerCurrentOutlineButton{
+        background:var(--button-no-bg);
+        width:32px;
+        height:32px;
+
+        &:focus-visible{
+          background-color:var(--button-focus-no-bg);
+        }
+
+        &::before{
+          -webkit-mask-repeat:no-repeat;
+                  mask-repeat:no-repeat;
+          -webkit-mask-image:var(--current-outline-button-icon);
+                  mask-image:var(--current-outline-button-icon);
+          background-color:var(--button-fg);
+        }
+      }
+    }
+
+    #viewsManagerStatus{
+      display:grid;
+      width:100%;
+      border:1px solid var(--status-border-color);
+
+      > div{
+        min-height:64px;
+        width:100%;
+        padding-inline:16px;
+        grid-area:1 / 1;
+        box-sizing:border-box;
+
+        &.hidden{
+          visibility:hidden;
+          display:unset !important;
+        }
+      }
+
+      .viewsManagerStatusLabel{
+        display:flex;
+        align-items:center;
+        gap:8px;
+
+        font:menu;
+        font-size:13px;
+      }
+
+      #viewsManagerStatusAction{
+        display:flex;
+        justify-content:space-between;
+        align-items:center;
+        align-self:stretch;
+        background-color:var(--status-actions-bg);
+
+        #viewsManagerStatusActionLabelContainer > button{
+          position:relative;
+          width:var(--icon-size);
+          height:var(--icon-size);
+          border:none;
+          padding:0;
+          flex:0 0 auto;
+
+          &::before{
+            content:"";
+            position:absolute;
+            inset:0;
+            -webkit-mask-repeat:no-repeat;
+                    mask-repeat:no-repeat;
+            -webkit-mask-position:center;
+                    mask-position:center;
+            background-color:var(--indicator-color);
+            -webkit-mask-image:var(--pages-selected-icon);
+                    mask-image:var(--pages-selected-icon);
+          }
+
+          @media screen and (forced-colors: active){
+            border-radius:2px;
+            background-color:var(--button-bg);
+
+            &::before{
+              background-color:var(--button-fg);
+            }
+            &:hover{
+              background-color:var(--button-hover-bg);
+
+              &::before{
+                background-color:var(--button-hover-fg);
+              }
+            }
+            &:active{
+              background-color:var(--button-active-bg);
+
+              &::before{
+                background-color:var(--button-active-fg);
+              }
+            }
+          }
+
+          &#viewsManagerStatusActionDeselectButton:focus-visible{
+            outline:2px solid var(--button-focus-outline-color);
+            border:1px solid var(--button-focus-border-color);
+            border-radius:2px;
+            outline-offset:1px;
+          }
+        }
+
+        #actionSelector{
+          height:32px;
+          min-width:115px;
+          width:auto;
+          display:block;
+
+          #viewsManagerStatusActionButton{
+            display:flex;
+            align-items:center;
+            justify-content:space-between;
+            gap:8px;
+            width:100%;
+            height:100%;
+            padding:4px 16px;
+
+            &::after{
+              content:"";
+              display:inline-block;
+              width:var(--icon-size);
+              height:var(--icon-size);
+              -webkit-mask-repeat:no-repeat;
+                      mask-repeat:no-repeat;
+              -webkit-mask-position:center;
+                      mask-position:center;
+              -webkit-mask-image:var(--manage-button-icon);
+                      mask-image:var(--manage-button-icon);
+              background-color:var(--button-fg);
+            }
+
+            &:hover::after{
+              background-color:var(--button-hover-fg) !important;
+            }
+
+            &:active::after{
+              background-color:var(--button-active-fg) !important;
+            }
+          }
+
+          > .popupMenu{
+            width:100%;
+            min-width:-moz-fit-content;
+            min-width:fit-content;
+            z-index:1;
+          }
+        }
+      }
+
+      #viewsManagerStatusUndo{
+        display:flex;
+        justify-content:space-between;
+        align-items:center;
+        align-self:stretch;
+        background-color:var(--status-undo-bg);
+
+        > span::before{
+          content:"";
+          display:inline-block;
+          width:var(--icon-size);
+          height:var(--icon-size);
+          -webkit-mask-repeat:no-repeat;
+                  mask-repeat:no-repeat;
+          -webkit-mask-position:center;
+                  mask-position:center;
+          -webkit-mask-image:var(--undo-label-icon);
+                  mask-image:var(--undo-label-icon);
+          background-color:var(--indicator-color);
+        }
+
+        > div{
+          display:flex;
+          align-items:center;
+          gap:8px;
+          width:auto;
+
+          #viewsManagerStatusUndoButton{
+            width:auto;
+            min-height:24px;
+            padding:4px 8px;
+          }
+        }
+      }
+
+      #viewsManagerStatusWarning{
+        display:flex;
+        align-items:center;
+        justify-content:space-between;
+        background-color:var(--status-warning-bg);
+
+        > span{
+          align-items:flex-start;
+
+          &::before{
+            content:"";
+            display:inline-block;
+            width:var(--icon-size);
+            height:var(--icon-size);
+            -webkit-mask-repeat:no-repeat;
+                    mask-repeat:no-repeat;
+            -webkit-mask-position:center;
+                    mask-position:center;
+            background-color:var(--indicator-warning-color);
+            -webkit-mask-image:var(--undo-label-icon);
+                    mask-image:var(--undo-label-icon);
+            flex:0 0 auto;
+          }
+        }
+      }
+
+      #viewsManagerStatusWaiting{
+        display:flex;
+        align-items:center;
+        justify-content:space-between;
+        background-color:var(--status-waiting-bg);
+
+        > span::before{
+          content:"";
+          display:inline-block;
+          width:var(--icon-size);
+          height:var(--icon-size);
+          -webkit-mask-repeat:no-repeat;
+                  mask-repeat:no-repeat;
+          -webkit-mask-position:center;
+                  mask-position:center;
+          background-color:var(--indicator-color);
+          -webkit-mask-image:var(--spinner-icon);
+                  mask-image:var(--spinner-icon);
+          flex:0 0 auto;
+        }
+      }
+    }
+  }
+
+  #viewsManagerContent{
+    width:100%;
+    flex:1 1 0%;
+    overflow:auto;
+
+    &:has(#thumbnailsView.isDragging){
+      overflow-x:hidden;
+    }
+
+    #thumbnailsView{
+      --thumbnail-width:126px;
+      --gap-between-input-and-thumbnail:16px;
+
+      display:flex;
+      flex-flow:row wrap;
+      align-items:center;
+      justify-content:space-evenly;
+      padding:20px 32px;
+      gap:44px;
+      width:100%;
+      box-sizing:border-box;
+      position:relative;
+
+      &.isDragging{
+        cursor:grabbing;
+
+        > .thumbnail{
+          > .thumbnailImageContainer:hover{
+            cursor:grabbing;
+
+            &:not([aria-current="page"]){
+              box-shadow:var(--image-shadow);
+            }
+          }
+
+          > input{
+            pointer-events:none;
+          }
+        }
+      }
+
+      &.isDragging > .dragMarker,
+      &.isDraggingFile > .dragMarker{
+        position:absolute;
+        top:0;
+        left:0;
+        border:2px solid var(--indicator-color);
+        contain:strict;
+      }
+
+      &.pasteMode{
+        gap:var(--gap-between-input-and-thumbnail);
+
+        > .thumbnail{
+          flex-direction:column;
+
+          > input{
+            display:none;
+          }
+
+          > .thumbnailPasteButton{
+            display:flex;
+            justify-content:center;
+            align-items:center;
+            border-radius:16px;
+            min-height:24px;
+            padding:4px 16px;
+
+            font:menu;
+            font-size:13px;
+            font-style:normal;
+            font-weight:400;
+            line-height:normal;
+          }
+        }
+      }
+
+      &:not(.pasteMode) > .thumbnail > .thumbnailPasteButton{
+        display:none;
+      }
+
+      > .thumbnail{
+        --input-dim:16px;
+
+        &:not(&:has(input)){
+          --input-dim:0px;
+          --gap-between-input-and-thumbnail:0px;
+        }
+
+        display:inline-flex;
+        justify-content:flex-end;
+        align-items:center;
+        flex-direction:row-reverse;
+        gap:var(--gap-between-input-and-thumbnail);
+        width:calc(
+          var(--thumbnail-width) + 2 *
+            (var(--input-dim) + var(--gap-between-input-and-thumbnail))
+        );
+        height:auto;
+        position:relative;
+        scroll-margin-top:20px;
+
+        .thumbnailPasteButton{
+          padding:8px 0;
+          text-align:center;
+        }
+
+        &:not(.isDragging) > .thumbnailImageContainer::after{
+          content:attr(page-number);
+          border-radius:8px;
+          border:1px solid var(--image-page-number-border-color);
+          background-color:var(--image-page-number-bg);
+          color:var(--image-page-number-fg);
+          position:absolute;
+          bottom:5px;
+          inset-inline-end:50%;
+          min-width:32px;
+          height:16px;
+          text-align:center;
+          box-sizing:content-box;
+          translate:calc(var(--dir-factor) * 50%);
+
+          font:menu;
+          font-size:12px;
+          font-style:normal;
+          font-weight:400;
+          line-height:normal;
+
+          pointer-events:none;
+          -webkit-user-select:none;
+             -moz-user-select:none;
+                  user-select:none;
+        }
+
+        &:has([aria-current="page"]):not(.isDragging)
+          > .thumbnailImageContainer::after{
+          background-color:var(--image-current-page-number-bg);
+          color:var(--image-current-page-number-fg);
+          outline:1px solid var(--image-current-border-color);
+        }
+
+        &.isDragging > input{
+          visibility:hidden;
+        }
+
+        > input{
+          margin:0;
+          width:var(--input-dim);
+          height:var(--input-dim);
+          accent-color:var(--indicator-color);
+        }
+
+        > .thumbnailImageContainer{
+          --thumbnail-dragging-scale:1.4;
+
+          width:var(--thumbnail-width);
+          border:none;
+          border-radius:8px;
+          box-shadow:var(--image-shadow);
+          box-sizing:content-box;
+          outline:var(--image-outline);
+          -webkit-user-select:none;
+             -moz-user-select:none;
+                  user-select:none;
+          position:relative;
+
+          img{
+            width:100%;
+            height:100%;
+            border:none;
+            border-radius:8px;
+            outline:none;
+            -webkit-user-select:none;
+               -moz-user-select:none;
+                    user-select:none;
+            pointer-events:none;
+          }
+
+          &.missingThumbnailImage{
+            content-visibility:hidden;
+          }
+
+          &:hover{
+            cursor:pointer;
+            box-shadow:var(--image-hover-shadow);
+
+            &::after{
+              background-color:var(--image-hover-page-number-bg);
+              color:var(--image-hover-page-number-fg);
+            }
+
+            @media screen and (forced-colors: active){
+              box-shadow:none;
+              outline:var(--image-border-width) var(--image-hover-border-color) solid;
+            }
+          }
+
+          &:focus-visible{
+            &:not([aria-current="page"]){
+              box-shadow:var(--image-hover-shadow);
+              outline:none;
+
+              @media screen and (forced-colors: active){
+                box-shadow:none;
+                outline:var(--image-border-width) var(--image-focus-outline-color) solid;
+              }
+            }
+
+            &[aria-current="page"]{
+              outline:var(--image-border-width) solid var(--image-current-focused-outline-color);
+              outline-offset:var(--image-border-width);
+
+              @media screen and (forced-colors: active){
+                box-shadow:none;
+                outline:var(--image-border-width) var(--image-current-border-color) solid;
+                outline-offset:0;
+
+                > img{
+                  outline:var(--image-border-width) var(--image-focus-outline-color) solid;
+                  outline-offset:var(--image-border-width);
+                }
+              }
+            }
+
+            @media screen and (forced-colors: active){
+              box-shadow:none;
+              outline:var(--image-border-width) var(--image-current-border-color) solid;
+
+              &:hover > img{
+                outline:var(--image-border-width) var(--image-hover-border-color) solid;
+                outline-offset:var(--image-border-width);
+              }
+            }
+          }
+
+          &[aria-current="page"]{
+            box-shadow:var(--image-current-shadow);
+
+            &:hover::after{
+              background-color:var(--image-current-hover-page-number-bg);
+              color:var(--image-current-hover-page-number-fg);
+            }
+
+            @media screen and (forced-colors: active){
+              box-shadow:none;
+              outline:var(--image-border-width) var(--image-current-border-color) solid;
+
+              &:hover > img{
+                outline:var(--image-border-width) var(--image-hover-border-color) solid;
+                outline-offset:var(--image-border-width);
+              }
+            }
+          }
+
+          &.placeholder{
+            background-color:var(--image-dragging-placeholder-bg);
+            box-shadow:none !important;
+            outline:var(--image-dragging-placeholder-border);
+          }
+
+          &.draggingThumbnail{
+            position:absolute;
+            left:0;
+            top:0;
+            z-index:1;
+            transform-origin:0 0 0;
+            scale:calc(1 / var(--thumbnail-dragging-scale));
+            pointer-events:none;
+            box-shadow:var(--image-dragging-shadow);
+
+            &.multiple{
+              box-shadow:var(--image-multiple-dragging-shadow);
+
+              @media screen and (forced-colors: active){
+                forced-color-adjust:none;
+                box-shadow:var(--image-multiple-dragging-shadow);
+              }
+
+              > .thumbnailImageContainer{
+                position:absolute;
+                top:0;
+                left:0;
+
+                width:var(--thumbnail-width);
+                border:none;
+                border-radius:8px;
+                box-sizing:content-box;
+                outline:none;
+                -webkit-user-select:none;
+                   -moz-user-select:none;
+                        user-select:none;
+              }
+
+              &::after{
+                content:attr(data-multiple-count);
+                border-radius:calc(8px * var(--thumbnail-dragging-scale));
+                background-color:var(--multiple-dragging-indicator-bg);
+                color:var(--multiple-dragging-text-color);
+                position:absolute;
+                inset-block-end:calc(4px * var(--thumbnail-dragging-scale));
+                inset-inline-start:calc(4px * var(--thumbnail-dragging-scale));
+                min-width:calc(32px * var(--thumbnail-dragging-scale));
+                height:calc(16px * var(--thumbnail-dragging-scale));
+                text-align:center;
+                font:menu;
+                font-size:calc(13px * var(--thumbnail-dragging-scale));
+                font-style:normal;
+                font-weight:400;
+                line-height:normal;
+                contain:strict;
+              }
+            }
+          }
+        }
+      }
+    }
+
+    #attachmentsView{
+      --attachment-color:light-dark(rgb(0 0 0 / 0.8), rgb(255 255 255 / 0.8));
+      --attachment-bg-color:light-dark(
+        rgb(0 0 0 / 0.15),
+        rgb(255 255 255 / 0.15)
+      );
+      --attachment-hover-color:light-dark(
+        rgb(0 0 0 / 0.9),
+        rgb(255 255 255 / 0.9)
+      );
+
+      > ul{
+        list-style-type:none;
+        padding:0;
+
+        > li > a{
+          text-decoration:none;
+          display:inline-block;
+          min-width:calc(100% - 4px);
+          height:auto;
+          margin-bottom:1px;
+          padding:2px 0 5px;
+          padding-inline-start:4px;
+          border-radius:2px;
+          color:var(--attachment-color);
+          font-size:13px;
+          line-height:15px;
+          -webkit-user-select:none;
+             -moz-user-select:none;
+                  user-select:none;
+          white-space:normal;
+          cursor:pointer;
+
+          &:hover{
+            background-color:var(--attachment-bg-color);
+            background-clip:padding-box;
+            border-radius:2px;
+            color:var(--attachment-hover-color);
+          }
+        }
+      }
+    }
+  }
+}
+
+.sidebar{
+  --sidebar-bg-color:light-dark(#fff, #23222b);
+  --sidebar-border-color:light-dark(
+    rgb(21 20 26 / 0.1),
+    rgb(251 251 254 / 0.1)
+  );
+  --sidebar-box-shadow:0 0.25px 0.75px light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 2px 6px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
+  --sidebar-backdrop-filter:none;
+  --sidebar-border-radius:8px;
+  --sidebar-padding:5px;
+  --sidebar-min-width:180px;
+  --sidebar-max-width:632px;
+  --sidebar-width:239px;
+  --resizer-width:4px;
+  --resizer-shift:calc(0px - var(--resizer-width) - 2px);
+  --resizer-hover-bg-color:light-dark(#0062fa, #00cadb);
+
+  @media screen and (forced-colors: active){
+    --sidebar-bg-color:Canvas;
+    --sidebar-border-color:CanvasText;
+    --sidebar-box-shadow:none;
+    --resizer-hover-bg-color:CanvasText;
+  }
+
+  border-radius:var(--sidebar-border-radius);
+  box-shadow:var(--sidebar-box-shadow);
+  border:1px solid var(--sidebar-border-color);
+  background-color:var(--sidebar-bg-color);
+  inset-block-start:calc(100% + var(--doorhanger-height) - 2px);
+  padding-block:var(--sidebar-padding);
+  width:var(--sidebar-width);
+  min-width:var(--sidebar-min-width);
+  max-width:var(--sidebar-max-width);
+  backdrop-filter:var(--sidebar-backdrop-filter);
+  box-sizing:border-box;
+  position:relative;
+
+  .sidebarResizer{
+    width:var(--resizer-width);
+    background-color:transparent;
+    forced-color-adjust:none;
+    cursor:ew-resize;
+    position:absolute;
+    inset-block:0;
+    inset-inline-start:var(--resizer-shift);
+    transition:background-color 0.5s ease-in-out, border-color 0.5s ease-in-out;
+    box-sizing:border-box;
+    border:1px solid transparent;
+    border-block-width:0;
+    background-clip:content-box;
+
+    &:hover{
+      background-color:var(--resizer-hover-bg-color);
+      border-color:white;
+    }
+    &:focus-visible{
+      background-color:var(--resizer-hover-bg-color);
+      outline:none;
+    }
+  }
+
+  &.resizing{
+    cursor:ew-resize;
+    -webkit-user-select:none;
+       -moz-user-select:none;
+            user-select:none;
+
+    :not(.sidebarResizer){
+      pointer-events:none;
+    }
+
+    .sidebarResizer{
+      background-color:var(--resizer-hover-bg-color);
+    }
+  }
+}
+
+:root{
+  color-scheme:light dark;
+
+  --viewer-container-height:0;
+  --pdfViewer-padding-bottom:0;
+  --page-margin:1px auto -8px;
+  --page-border:9px solid transparent;
+  --spreadHorizontalWrapped-margin-LR:-3.5px;
+  --loading-icon-delay:400ms;
+  --focus-ring-color:light-dark(#0060df, #0df);
+  --focus-ring-outline:2px solid var(--focus-ring-color);
+  --new-badge-bg:light-dark(#070, #37b847);
+  --new-badge-color:light-dark(#fff, #15141a);
+  --new-badge-border-color:light-dark(#fbfbfe / 40%, #15141a / 40%);
+
+  @media screen and (forced-colors: active){
+    --pdfViewer-padding-bottom:9px;
+    --page-margin:8px auto -1px;
+    --page-border:1px solid CanvasText;
+    --spreadHorizontalWrapped-margin-LR:3.5px;
+    --focus-ring-color:CanvasText;
+    --new-badge-bg:AccentColor;
+    --new-badge-color:ButtonFace;
+    --new-badge-border-color:CanvasText;
+  }
+}
+
+.newBadge{
+  background-color:var(--new-badge-bg);
+  color:var(--new-badge-color);
+  border-radius:4px;
+  border:1px solid var(--new-badge-border-color);
+  padding-inline:4px;
+  margin-inline:4px;
+  font:menu;
+  font-size:12px;
+  font-style:normal;
+  font-weight:400;
+  line-height:normal;
+  flex:0 0 fit-content;
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+}
+
+[data-main-rotation="90"]{
+  transform:rotate(90deg) translateY(-100%);
+}
+[data-main-rotation="180"]{
+  transform:rotate(180deg) translate(-100%, -100%);
+}
+[data-main-rotation="270"]{
+  transform:rotate(270deg) translateX(-100%);
+}
+
+.pdfViewer{
+  --scale-factor:1;
+  --page-bg-color:unset;
+
+  padding-bottom:var(--pdfViewer-padding-bottom);
+
+  --hcm-highlight-filter:none;
+  --hcm-highlight-selected-filter:none;
+
+  @media screen and (forced-colors: active){
+    --hcm-highlight-filter:invert(100%);
+  }
+
+  &.copyAll{
+    cursor:wait;
+  }
+
+  .canvasWrapper{
+    overflow:hidden;
+    width:100%;
+    height:100%;
+
+    canvas{
+      position:absolute;
+      top:0;
+      left:0;
+      margin:0;
+      display:block;
+      width:100%;
+      height:100%;
+      contain:content;
+
+      .structTree{
+        contain:strict;
+      }
+
+      &.detailView{
+        image-rendering:pixelated;
+      }
+    }
+    .selection{
+      position:absolute;
+      top:0;
+      left:0;
+      width:100%;
+      height:100%;
+      pointer-events:none;
+      background:rgb(0 90 255 / 0.22);
+    }
+  }
+}
+
+.pdfViewer .page{
+  --user-unit:1;
+  --total-scale-factor:calc(var(--scale-factor) * var(--user-unit));
+  --scale-round-x:1px;
+  --scale-round-y:1px;
+
+  direction:ltr;
+  width:816px;
+  height:1056px;
+  margin:var(--page-margin);
+  position:relative;
+  overflow:visible;
+  border:var(--page-border);
+  background-clip:content-box;
+  background-color:var(--page-bg-color, rgb(255 255 255));
+}
+
+.pdfViewer .dummyPage{
+  position:relative;
+  width:0;
+  height:var(--viewer-container-height);
+}
+
+.pdfViewer.noUserSelect{
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+}
+
+.pdfViewer.removePageBorders .page{
+  margin:0 auto 10px;
+  border:none;
+}
+
+.pdfViewer:is(.scrollHorizontal, .scrollWrapped),
+.spread{
+  margin-inline:3.5px;
+  text-align:center;
+}
+
+.pdfViewer.scrollHorizontal,
+.spread{
+  white-space:nowrap;
+}
+
+.pdfViewer.removePageBorders,
+.pdfViewer:is(.scrollHorizontal, .scrollWrapped) .spread{
+  margin-inline:0;
+}
+
+.spread :is(.page, .dummyPage),
+.pdfViewer:is(.scrollHorizontal, .scrollWrapped) :is(.page, .spread){
+  display:inline-block;
+  vertical-align:middle;
+}
+
+.spread .page,
+.pdfViewer:is(.scrollHorizontal, .scrollWrapped) .page{
+  margin-inline:var(--spreadHorizontalWrapped-margin-LR);
+}
+
+.pdfViewer.removePageBorders .spread .page,
+.pdfViewer.removePageBorders:is(.scrollHorizontal, .scrollWrapped) .page{
+  margin-inline:5px;
+}
+
+.pdfViewer .page.loadingIcon::after{
+  position:absolute;
+  top:0;
+  left:0;
+  content:"";
+  width:100%;
+  height:100%;
+  background:url("images/loading-icon.gif") center no-repeat;
+  display:none;
+  transition-property:display;
+  transition-delay:var(--loading-icon-delay);
+  z-index:5;
+  contain:strict;
+}
+
+.pdfViewer .page.loading::after{
+  display:block;
+}
+
+.pdfViewer .page:not(.loading)::after{
+  transition-property:none;
+  display:none;
+}
+
+.pdfPresentationMode .pdfViewer{
+  padding-bottom:0;
+}
+
+.pdfPresentationMode .spread{
+  margin:0;
+}
+
+.pdfPresentationMode .pdfViewer .page{
+  margin:0 auto;
+  border:2px solid transparent;
+}
+
+:root{
+  --dir-factor:1;
+
+  --sidebar-width:200px;
+  --sidebar-transition-duration:200ms;
+  --sidebar-transition-timing-function:ease;
+
+  --toolbar-height:32px;
+  --toolbar-horizontal-padding:1px;
+  --toolbar-vertical-padding:2px;
+  --icon-size:16px;
+
+  --toolbar-icon-opacity:0.7;
+  --doorhanger-icon-opacity:0.9;
+  --doorhanger-height:8px;
+
+  --main-color:light-dark(rgb(12 12 13), rgb(249 249 250));
+  --body-bg-color:light-dark(rgb(212 212 215), rgb(42 42 46));
+  --progressBar-color:light-dark(rgb(10 132 255), rgb(0 96 223));
+  --progressBar-bg-color:light-dark(rgb(221 221 222), rgb(40 40 43));
+  --progressBar-blend-color:light-dark(rgb(116 177 239), rgb(20 68 133));
+  --scrollbar-color:light-dark(auto, rgb(121 121 123));
+  --scrollbar-bg-color:light-dark(auto, rgb(35 35 39));
+  --toolbar-icon-bg-color:light-dark(rgb(0 0 0), rgb(255 255 255));
+  --toolbar-icon-hover-bg-color:light-dark(rgb(0 0 0), rgb(255 255 255));
+
+  --sidebar-narrow-bg-color:light-dark(
+    rgb(212 212 215 / 0.9),
+    rgb(42 42 46 / 0.9)
+  );
+  --sidebar-toolbar-bg-color:light-dark(rgb(245 246 247), rgb(50 50 52));
+  --toolbar-bg-color:light-dark(rgb(249 249 250), rgb(56 56 61));
+  --toolbar-border-color:light-dark(rgb(184 184 184), rgb(12 12 13));
+  --toolbar-box-shadow:0 1px 0 var(--toolbar-border-color);
+  --toolbar-border-bottom:none;
+  --toolbarSidebar-box-shadow:inset calc(-1px * var(--dir-factor)) 0 0 rgb(0 0 0 / 0.25), 0 1px 0 rgb(0 0 0 / 0.15), 0 0 1px rgb(0 0 0 / 0.1);
+  --toolbarSidebar-border-bottom:none;
+  --button-hover-color:color-mix(in srgb, currentColor 17%, transparent);
+  --toggled-btn-color:light-dark(rgb(0 0 0), rgb(255 255 255));
+  --toggled-btn-bg-color:rgb(0 0 0 / 0.3);
+  --toggled-hover-active-btn-color:rgb(0 0 0 / 0.4);
+  --toggled-hover-btn-outline:none;
+  --dropdown-btn-bg-color:light-dark(rgb(215 215 219), rgb(74 74 79));
+  --dropdown-btn-border:none;
+  --separator-color:rgb(0 0 0 / 0.3);
+  --field-color:light-dark(rgb(6 6 6), rgb(250 250 250));
+  --field-bg-color:light-dark(rgb(255 255 255), rgb(64 64 68));
+  --field-border-color:light-dark(rgb(187 187 188), rgb(115 115 115));
+  --doorhanger-bg-color:light-dark(rgb(255 255 255), #42414d);
+  --doorhanger-border-color:light-dark(rgb(12 12 13 / 0.2), rgb(39 39 43));
+  --doorhanger-hover-color:light-dark(rgb(12 12 13), rgb(249 249 250));
+  --doorhanger-separator-color:light-dark(rgb(222 222 222), rgb(92 92 97));
+  --dialog-button-border:none;
+  --dialog-button-bg-color:light-dark(rgb(12 12 13 / 0.1), rgb(92 92 97));
+  --dialog-button-hover-bg-color:light-dark(
+    rgb(12 12 13 / 0.3),
+    rgb(115 115 115)
+  );
+
+  --loading-icon:url(images/loading.svg);
+  --toolbarButton-editorComment-icon:url(images/comment-editButton.svg);
+  --toolbarButton-editorFreeText-icon:url(images/toolbarButton-editorFreeText.svg);
+  --toolbarButton-editorHighlight-icon:url(images/toolbarButton-editorHighlight.svg);
+  --toolbarButton-editorInk-icon:url(images/toolbarButton-editorInk.svg);
+  --toolbarButton-editorStamp-icon:url(images/toolbarButton-editorStamp.svg);
+  --toolbarButton-editorSignature-icon:url(images/toolbarButton-editorSignature.svg);
+  --toolbarButton-menuArrow-icon:url(images/toolbarButton-menuArrow.svg);
+  --toolbarButton-viewsManagerToggle-icon:url(images/toolbarButton-viewsManagerToggle.svg);
+  --toolbarButton-secondaryToolbarToggle-icon:url(images/toolbarButton-secondaryToolbarToggle.svg);
+  --toolbarButton-pageUp-icon:url(images/toolbarButton-pageUp.svg);
+  --toolbarButton-pageDown-icon:url(images/toolbarButton-pageDown.svg);
+  --toolbarButton-zoomOut-icon:url(images/toolbarButton-zoomOut.svg);
+  --toolbarButton-zoomIn-icon:url(images/toolbarButton-zoomIn.svg);
+  --toolbarButton-presentationMode-icon:url(images/toolbarButton-presentationMode.svg);
+  --toolbarButton-print-icon:url(images/toolbarButton-print.svg);
+  --toolbarButton-openFile-icon:url(images/toolbarButton-openFile.svg);
+  --toolbarButton-download-icon:url(images/toolbarButton-download.svg);
+  --toolbarButton-bookmark-icon:url(images/toolbarButton-bookmark.svg);
+  --toolbarButton-viewThumbnail-icon:url(images/toolbarButton-viewThumbnail.svg);
+  --toolbarButton-viewOutline-icon:url(images/toolbarButton-viewOutline.svg);
+  --toolbarButton-viewAttachments-icon:url(images/toolbarButton-viewAttachments.svg);
+  --toolbarButton-viewLayers-icon:url(images/toolbarButton-viewLayers.svg);
+  --toolbarButton-currentOutlineItem-icon:url(images/toolbarButton-currentOutlineItem.svg);
+  --toolbarButton-search-icon:url(images/toolbarButton-search.svg);
+  --findbarButton-previous-icon:url(images/findbarButton-previous.svg);
+  --findbarButton-next-icon:url(images/findbarButton-next.svg);
+  --secondaryToolbarButton-firstPage-icon:url(images/secondaryToolbarButton-firstPage.svg);
+  --secondaryToolbarButton-lastPage-icon:url(images/secondaryToolbarButton-lastPage.svg);
+  --secondaryToolbarButton-rotateCcw-icon:url(images/secondaryToolbarButton-rotateCcw.svg);
+  --secondaryToolbarButton-rotateCw-icon:url(images/secondaryToolbarButton-rotateCw.svg);
+  --secondaryToolbarButton-selectTool-icon:url(images/secondaryToolbarButton-selectTool.svg);
+  --secondaryToolbarButton-handTool-icon:url(images/secondaryToolbarButton-handTool.svg);
+  --secondaryToolbarButton-scrollPage-icon:url(images/secondaryToolbarButton-scrollPage.svg);
+  --secondaryToolbarButton-scrollVertical-icon:url(images/secondaryToolbarButton-scrollVertical.svg);
+  --secondaryToolbarButton-scrollHorizontal-icon:url(images/secondaryToolbarButton-scrollHorizontal.svg);
+  --secondaryToolbarButton-scrollWrapped-icon:url(images/secondaryToolbarButton-scrollWrapped.svg);
+  --secondaryToolbarButton-spreadNone-icon:url(images/secondaryToolbarButton-spreadNone.svg);
+  --secondaryToolbarButton-spreadOdd-icon:url(images/secondaryToolbarButton-spreadOdd.svg);
+  --secondaryToolbarButton-spreadEven-icon:url(images/secondaryToolbarButton-spreadEven.svg);
+  --secondaryToolbarButton-imageAltTextSettings-icon:var(
+    --toolbarButton-editorStamp-icon
+  );
+  --secondaryToolbarButton-documentProperties-icon:url(images/secondaryToolbarButton-documentProperties.svg);
+  --editorParams-stampAddImage-icon:url(images/toolbarButton-zoomIn.svg);
+  --comment-edit-button-icon:url(images/comment-editButton.svg);
+}
+
+:root:dir(rtl){
+  --dir-factor:-1;
+}
+
+@media screen and (forced-colors: active){
+  :root{
+    --button-hover-color:Highlight;
+    --toolbar-icon-opacity:1;
+    --toolbar-icon-bg-color:ButtonText;
+    --toolbar-icon-hover-bg-color:ButtonFace;
+    --toggled-hover-active-btn-color:ButtonText;
+    --toggled-hover-btn-outline:2px solid ButtonBorder;
+    --toolbar-border-color:CanvasText;
+    --toolbar-border-bottom:1px solid var(--toolbar-border-color);
+    --toolbar-box-shadow:none;
+    --toggled-btn-color:HighlightText;
+    --toggled-btn-bg-color:LinkText;
+    --doorhanger-hover-color:ButtonFace;
+    --doorhanger-border-color-whcm:1px solid ButtonText;
+    --doorhanger-triangle-opacity-whcm:0;
+    --dialog-button-border:1px solid Highlight;
+    --dialog-button-hover-bg-color:Highlight;
+    --dialog-button-hover-color:ButtonFace;
+    --dropdown-btn-border:1px solid ButtonText;
+    --field-border-color:ButtonText;
+    --main-color:CanvasText;
+    --separator-color:GrayText;
+    --doorhanger-separator-color:GrayText;
+    --toolbarSidebar-box-shadow:none;
+    --toolbarSidebar-border-bottom:1px solid var(--toolbar-border-color);
+  }
+}
+
+@media screen and (prefers-reduced-motion: reduce){
+  :root{
+    --sidebar-transition-duration:0;
+  }
+}
+
+@keyframes progressIndeterminate{
+  0%{
+    transform:translateX(calc(-142px * var(--dir-factor)));
+  }
+
+  100%{
+    transform:translateX(0);
+  }
+}
+
+html{
+  &[data-toolbar-density="compact"]{
+    --toolbar-height:30px;
+  }
+  &[data-toolbar-density="touch"]{
+    --toolbar-height:44px;
+  }
+}
+
+html,
+body{
+  height:100%;
+  width:100%;
+}
+
+body{
+  margin:0;
+  background-color:var(--body-bg-color);
+  scrollbar-color:var(--scrollbar-color) var(--scrollbar-bg-color);
+
+  &.wait::before{
+    content:"";
+    position:fixed;
+    width:100%;
+    height:100%;
+    z-index:100000;
+    cursor:wait;
+  }
+}
+.visuallyHidden{
+  position:absolute;
+  top:0;
+  left:0;
+  border:0;
+  margin:0;
+  padding:0;
+  width:0;
+  height:0;
+  overflow:hidden;
+  white-space:nowrap;
+  font-size:0;
+}
+
+.hidden,
+[hidden]{
+  display:none !important;
+}
+
+#viewerContainer.pdfPresentationMode:fullscreen{
+  top:0;
+  background-color:rgb(0 0 0);
+  width:100%;
+  height:100%;
+  overflow:hidden;
+  cursor:none;
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+}
+
+.pdfPresentationMode:fullscreen
+  section:not([data-internal-link], .mediaAnnotation){
+  pointer-events:none;
+}
+
+.pdfPresentationMode:fullscreen .textLayer span{
+  cursor:none;
+}
+
+.pdfPresentationMode.pdfPresentationModeControls > *,
+.pdfPresentationMode.pdfPresentationModeControls .textLayer span{
+  cursor:default;
+}
+
+#outerContainer{
+  width:100%;
+  height:100%;
+  position:relative;
+  margin:0;
+}
+
+#mainContainer{
+  position:absolute;
+  inset:0;
+  min-width:350px;
+  margin:0;
+  display:flex;
+  flex-direction:column;
+}
+
+#sidebarContent{
+  inset-block:var(--toolbar-height) 0;
+  inset-inline-start:0;
+  overflow:auto;
+  position:absolute;
+  width:100%;
+  box-shadow:inset calc(-1px * var(--dir-factor)) 0 0 rgb(0 0 0 / 0.25);
+}
+
+#viewerContainer{
+  overflow:auto;
+  position:absolute;
+  inset:var(--toolbar-height) 0 0;
+  outline:none;
+  z-index:0;
+}
+
+#viewerContainer:not(.pdfPresentationMode){
+  transition-duration:var(--sidebar-transition-duration);
+  transition-timing-function:var(--sidebar-transition-timing-function);
+}
+
+#sidebarContainer :is(input, button, select){
+  font:message-box;
+}
+
+.toolbar{
+  z-index:2;
+}
+
+#toolbarSidebar{
+  width:100%;
+  height:var(--toolbar-height);
+  background-color:var(--sidebar-toolbar-bg-color);
+  box-shadow:var(--toolbarSidebar-box-shadow);
+  border-bottom:var(--toolbarSidebar-border-bottom);
+  padding:var(--toolbar-vertical-padding) var(--toolbar-horizontal-padding);
+  justify-content:space-between;
+
+  #toolbarSidebarLeft{
+    width:auto;
+    height:100%;
+
+    #viewThumbnail::before{
+      -webkit-mask-image:var(--toolbarButton-viewThumbnail-icon);
+              mask-image:var(--toolbarButton-viewThumbnail-icon);
+    }
+
+    #viewOutline::before{
+      -webkit-mask-image:var(--toolbarButton-viewOutline-icon);
+              mask-image:var(--toolbarButton-viewOutline-icon);
+      transform:scaleX(var(--dir-factor));
+    }
+
+    #viewAttachments::before{
+      -webkit-mask-image:var(--toolbarButton-viewAttachments-icon);
+              mask-image:var(--toolbarButton-viewAttachments-icon);
+    }
+
+    #viewLayers::before{
+      -webkit-mask-image:var(--toolbarButton-viewLayers-icon);
+              mask-image:var(--toolbarButton-viewLayers-icon);
+    }
+  }
+
+  #toolbarSidebarRight{
+    width:auto;
+    height:100%;
+    padding-inline-end:2px;
+  }
+}
+
+.doorHanger,
+.doorHangerRight{
+  border-radius:2px;
+  box-shadow:0 1px 5px var(--doorhanger-border-color), 0 0 0 1px var(--doorhanger-border-color);
+  border:var(--doorhanger-border-color-whcm);
+  background-color:var(--doorhanger-bg-color);
+  inset-block-start:calc(100% + var(--doorhanger-height) - 2px);
+
+  &::after,
+  &::before{
+    bottom:100%;
+    border-style:solid;
+    border-color:transparent;
+    content:"";
+    height:0;
+    width:0;
+    position:absolute;
+    pointer-events:none;
+    opacity:var(--doorhanger-triangle-opacity-whcm);
+  }
+
+  &::before{
+    border-width:calc(var(--doorhanger-height) + 2px);
+    border-bottom-color:var(--doorhanger-border-color);
+  }
+
+  &::after{
+    border-width:var(--doorhanger-height);
+  }
+}
+
+.doorHangerRight{
+  inset-inline-end:calc(50% - var(--doorhanger-height) - 1px);
+
+  &::before{
+    inset-inline-end:-1px;
+  }
+
+  &::after{
+    border-bottom-color:var(--doorhanger-bg-color);
+    inset-inline-end:1px;
+  }
+}
+
+.doorHanger{
+  inset-inline-start:calc(50% - var(--doorhanger-height) - 1px);
+
+  &::before{
+    inset-inline-start:-1px;
+  }
+
+  &::after{
+    border-bottom-color:var(--toolbar-bg-color);
+    inset-inline-start:1px;
+  }
+}
+
+.dialogButton{
+  border:none;
+  background:none;
+  width:28px;
+  height:28px;
+  outline:none;
+}
+
+.dialogButton:is(:hover, :focus-visible){
+  background-color:var(--dialog-button-hover-bg-color);
+}
+
+.dialogButton:is(:hover, :focus-visible) > span{
+  color:var(--dialog-button-hover-color);
+}
+
+.splitToolbarButtonSeparator{
+  float:inline-start;
+  width:0;
+  height:62%;
+  border-left:1px solid var(--separator-color);
+  border-right:none;
+}
+
+.dialogButton{
+  min-width:16px;
+  margin:2px 1px;
+  padding:2px 6px 0;
+  border:none;
+  border-radius:2px;
+  color:var(--main-color);
+  font-size:12px;
+  line-height:14px;
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+  cursor:default;
+  box-sizing:border-box;
+}
+
+#viewsManagerToggleButton::before{
+  -webkit-mask-image:var(--toolbarButton-viewsManagerToggle-icon);
+          mask-image:var(--toolbarButton-viewsManagerToggle-icon);
+  transform:scaleX(var(--dir-factor));
+}
+
+#secondaryToolbarToggleButton::before{
+  -webkit-mask-image:var(--toolbarButton-secondaryToolbarToggle-icon);
+          mask-image:var(--toolbarButton-secondaryToolbarToggle-icon);
+  transform:scaleX(var(--dir-factor));
+}
+
+#previous::before{
+  -webkit-mask-image:var(--toolbarButton-pageUp-icon);
+          mask-image:var(--toolbarButton-pageUp-icon);
+}
+
+#next::before{
+  -webkit-mask-image:var(--toolbarButton-pageDown-icon);
+          mask-image:var(--toolbarButton-pageDown-icon);
+}
+
+#zoomOutButton::before{
+  -webkit-mask-image:var(--toolbarButton-zoomOut-icon);
+          mask-image:var(--toolbarButton-zoomOut-icon);
+}
+
+#zoomInButton::before{
+  -webkit-mask-image:var(--toolbarButton-zoomIn-icon);
+          mask-image:var(--toolbarButton-zoomIn-icon);
+}
+
+#editorCommentButton::before{
+  -webkit-mask-image:var(--toolbarButton-editorComment-icon);
+          mask-image:var(--toolbarButton-editorComment-icon);
+  transform:scaleX(var(--dir-factor));
+}
+
+#editorFreeTextButton::before{
+  -webkit-mask-image:var(--toolbarButton-editorFreeText-icon);
+          mask-image:var(--toolbarButton-editorFreeText-icon);
+}
+
+#editorHighlightButton::before{
+  -webkit-mask-image:var(--toolbarButton-editorHighlight-icon);
+          mask-image:var(--toolbarButton-editorHighlight-icon);
+}
+
+#editorInkButton::before{
+  -webkit-mask-image:var(--toolbarButton-editorInk-icon);
+          mask-image:var(--toolbarButton-editorInk-icon);
+}
+
+#editorStampButton::before{
+  -webkit-mask-image:var(--toolbarButton-editorStamp-icon);
+          mask-image:var(--toolbarButton-editorStamp-icon);
+}
+
+#editorSignatureButton::before{
+  -webkit-mask-image:var(--toolbarButton-editorSignature-icon);
+          mask-image:var(--toolbarButton-editorSignature-icon);
+}
+
+#printButton::before{
+  -webkit-mask-image:var(--toolbarButton-print-icon);
+          mask-image:var(--toolbarButton-print-icon);
+}
+
+#downloadButton::before{
+  -webkit-mask-image:var(--toolbarButton-download-icon);
+          mask-image:var(--toolbarButton-download-icon);
+}
+
+#currentOutlineItem::before{
+  -webkit-mask-image:var(--toolbarButton-currentOutlineItem-icon);
+          mask-image:var(--toolbarButton-currentOutlineItem-icon);
+  transform:scaleX(var(--dir-factor));
+}
+
+#viewFindButton::before{
+  -webkit-mask-image:var(--toolbarButton-search-icon);
+          mask-image:var(--toolbarButton-search-icon);
+}
+
+.pdfSidebarNotification::after{
+  position:absolute;
+  display:inline-block;
+  top:2px;
+  inset-inline-end:2px;
+  content:"";
+  background-color:rgb(112 219 85);
+  height:9px;
+  width:9px;
+  border-radius:50%;
+}
+
+.verticalToolbarSeparator{
+  display:block;
+  margin-inline:2px;
+  width:0;
+  height:80%;
+  border-left:1px solid var(--separator-color);
+  border-right:none;
+  box-sizing:border-box;
+}
+
+.horizontalToolbarSeparator{
+  display:block;
+  margin:6px 0;
+  border-top:1px solid var(--doorhanger-separator-color);
+  border-bottom:none;
+  height:0;
+  width:100%;
+}
+
+.toggleButton{
+  display:inline;
+
+  &:has(> input:checked){
+    color:var(--toggled-btn-color);
+    background-color:var(--toggled-btn-bg-color);
+  }
+
+  &:is(:hover, :has(> input:focus-visible)){
+    color:var(--toggled-btn-color);
+    background-color:var(--button-hover-color);
+  }
+
+  & > input{
+    position:absolute;
+    top:50%;
+    left:50%;
+    opacity:0;
+    width:0;
+    height:0;
+  }
+}
+
+.toolbarField{
+  padding:4px 7px;
+  margin:3px 0;
+  border-radius:2px;
+  background-color:var(--field-bg-color);
+  background-clip:padding-box;
+  border:1px solid var(--field-border-color);
+  box-shadow:none;
+  color:var(--field-color);
+  font-size:12px;
+  line-height:16px;
+  outline:none;
+
+  &:focus{
+    border-color:#0a84ff;
+  }
+}
+
+#pageNumber{
+  -moz-appearance:textfield;
+  text-align:end;
+  width:40px;
+  background-size:0 0;
+  transition-property:none;
+
+  &::-webkit-inner-spin-button{
+    -webkit-appearance:none;
+  }
+
+  .loadingInput:has(> &.loading)::after{
+    display:inline;
+    visibility:visible;
+
+    transition-property:visibility;
+    transition-delay:var(--loading-icon-delay);
+  }
+}
+
+.loadingInput{
+  position:relative;
+
+  &::after{
+    position:absolute;
+    visibility:hidden;
+    display:none;
+    width:var(--icon-size);
+    height:var(--icon-size);
+
+    content:"";
+    background-color:var(--toolbar-icon-bg-color);
+    -webkit-mask-size:cover;
+            mask-size:cover;
+    -webkit-mask-image:var(--loading-icon);
+            mask-image:var(--loading-icon);
+  }
+
+  &.start::after{
+    inset-inline-start:4px;
+  }
+
+  &.end::after{
+    inset-inline-end:4px;
+  }
+}
+#outlineOptionsContainer{
+  display:none;
+
+  #sidebarContainer:has(#outlineView:not(.hidden)) &{
+    display:inline flex;
+  }
+}
+
+.dialogButton{
+  width:auto;
+  margin:3px 4px 2px !important;
+  padding:2px 11px;
+  color:var(--main-color);
+  background-color:var(--dialog-button-bg-color);
+  border:var(--dialog-button-border) !important;
+}
+
+dialog{
+  margin:auto;
+  padding:15px;
+  border-spacing:4px;
+  color:var(--main-color);
+  font:message-box;
+  font-size:12px;
+  line-height:14px;
+  background-color:var(--doorhanger-bg-color);
+  border:1px solid rgb(0 0 0 / 0.5);
+  border-radius:4px;
+  box-shadow:0 1px 4px rgb(0 0 0 / 0.3);
+}
+
+dialog::backdrop{
+  background-color:rgb(0 0 0 / 0.2);
+}
+
+dialog > .row{
+  display:table-row;
+}
+
+dialog > .row > *{
+  display:table-cell;
+}
+
+dialog .toolbarField{
+  margin:5px 0;
+}
+
+dialog .separator{
+  display:block;
+  margin:4px 0;
+  height:0;
+  width:100%;
+  border-top:1px solid var(--separator-color);
+  border-bottom:none;
+}
+
+dialog .buttonRow{
+  text-align:center;
+  vertical-align:middle;
+}
+
+dialog :link{
+  color:rgb(255 255 255);
+}
+
+#passwordDialog{
+  text-align:center;
+}
+
+#passwordDialog .toolbarField{
+  width:200px;
+}
+
+#documentPropertiesDialog{
+  text-align:left;
+}
+
+#documentPropertiesDialog .row > *{
+  min-width:100px;
+  text-align:start;
+}
+
+#documentPropertiesDialog .row > span{
+  width:125px;
+  word-wrap:break-word;
+}
+
+#documentPropertiesDialog .row > p{
+  max-width:225px;
+  word-wrap:break-word;
+}
+
+#documentPropertiesDialog .buttonRow{
+  margin-top:10px;
+}
+
+#printServiceDialog{
+  min-width:200px;
+}
+
+.grab-to-pan-grab{
+  cursor:grab !important;
+}
+
+.grab-to-pan-grab
+  *:not(input):not(textarea):not(button):not(select):not(:link){
+  cursor:inherit !important;
+}
+
+.grab-to-pan-grab:active,
+.grab-to-pan-grabbing{
+  cursor:grabbing !important;
+}
+
+.grab-to-pan-grabbing{
+  position:fixed;
+  background:rgb(0 0 0 / 0);
+  display:block;
+  inset:0;
+  overflow:hidden;
+  z-index:50000;
+}
+
+.toolbarButton{
+  height:100%;
+  aspect-ratio:1;
+  display:flex;
+  align-items:center;
+  justify-content:center;
+  background:none;
+  border:none;
+  color:var(--main-color);
+  outline:none;
+  border-radius:2px;
+  box-sizing:border-box;
+  font:message-box;
+  flex:none;
+  position:relative;
+  padding:0;
+
+  > span{
+    display:inline-block;
+    width:0;
+    height:0;
+    overflow:hidden;
+  }
+
+  &::before{
+    opacity:var(--toolbar-icon-opacity);
+    display:inline-block;
+    width:var(--icon-size);
+    height:var(--icon-size);
+    content:"";
+    background-color:var(--toolbar-icon-bg-color);
+    -webkit-mask-size:cover;
+            mask-size:cover;
+    -webkit-mask-position:center;
+            mask-position:center;
+  }
+
+  &.toggled{
+    background-color:var(--toggled-btn-bg-color);
+    color:var(--toggled-btn-color);
+
+    &::before{
+      background-color:var(--toggled-btn-color);
+    }
+
+    &:hover{
+      outline:var(--toggled-hover-btn-outline) !important;
+
+      &:active{
+        background-color:var(--toggled-hover-active-btn-color);
+      }
+    }
+  }
+
+  &:is(:hover, :focus-visible){
+    background-color:var(--button-hover-color);
+
+    &::before{
+      background-color:var(--toolbar-icon-hover-bg-color);
+    }
+  }
+
+  &:is([disabled="disabled"], [disabled]){
+    opacity:0.5;
+    pointer-events:none;
+  }
+
+  &.labeled{
+    width:100%;
+    min-height:var(--menuitem-height);
+    justify-content:flex-start;
+    gap:8px;
+    padding-inline-start:12px;
+    aspect-ratio:unset;
+    text-align:start;
+    white-space:normal;
+    cursor:default;
+
+    &:is(a){
+      text-decoration:none;
+
+      &[href="#"]{
+        opacity:0.5;
+        pointer-events:none;
+      }
+    }
+
+    &::before{
+      opacity:var(--doorhanger-icon-opacity);
+    }
+
+    &:is(:hover, :focus-visible){
+      color:var(--doorhanger-hover-color);
+    }
+
+    > span{
+      display:inline-block;
+      width:-moz-max-content;
+      width:max-content;
+      height:auto;
+    }
+  }
+}
+
+.toolbarButtonWithContainer{
+  height:100%;
+  aspect-ratio:1;
+  display:inline-block;
+  position:relative;
+  flex:none;
+
+  > .toolbarButton{
+    width:100%;
+    height:100%;
+  }
+
+  .menu{
+    padding-block:5px;
+  }
+
+  .menuContainer{
+    height:auto;
+    max-height:calc(
+      var(--viewer-container-height) - var(--toolbar-height) -
+        var(--doorhanger-height)
+    );
+    display:flex;
+    flex-direction:column;
+    box-sizing:border-box;
+    overflow-y:auto;
+  }
+
+  .editorParamsToolbar{
+    --editor-toolbar-min-width:220px;
+
+    height:auto;
+    min-width:var(--editor-toolbar-min-width);
+    width:-moz-max-content;
+    width:max-content;
+    position:absolute;
+    z-index:30000;
+    cursor:default;
+
+    :is(#editorStampAddImage, #editorSignatureAddSignature)::before{
+      -webkit-mask-image:var(--editorParams-stampAddImage-icon);
+              mask-image:var(--editorParams-stampAddImage-icon);
+    }
+
+    .editorParamsLabel{
+      flex:none;
+      font:menu;
+      font-size:13px;
+      font-style:normal;
+      font-weight:400;
+      line-height:150%;
+      width:-moz-fit-content;
+      width:fit-content;
+      inset-inline-start:0;
+      color:var(--main-color);
+    }
+
+    button:is(:hover, :focus-visible) .editorParamsLabel{
+      color:var(--doorhanger-hover-color);
+    }
+
+    .editorParamsToolbarContainer{
+      width:100%;
+      height:auto;
+      display:flex;
+      flex-direction:column;
+      box-sizing:border-box;
+      padding-inline:10px;
+      padding-block:10px;
+
+      > .editorParamsSetter{
+        min-height:26px;
+        display:flex;
+        align-items:center;
+        justify-content:space-between;
+      }
+
+      .editorParamsColor{
+        width:32px;
+        height:32px;
+        flex:none;
+        padding:0;
+      }
+
+      .editorParamsSlider{
+        background-color:transparent;
+        width:90px;
+        flex:0 1 0;
+        font:message-box;
+
+        &::-moz-range-progress{
+          background-color:black;
+        }
+
+        &::-webkit-slider-runnable-track,
+        &::-moz-range-track{
+          background-color:black;
+        }
+
+        &::-webkit-slider-thumb,
+        &::-moz-range-thumb{
+          background-color:white;
+        }
+      }
+    }
+  }
+}
+
+#secondaryToolbar{
+  height:auto;
+  width:220px;
+  position:absolute;
+  z-index:30000;
+  cursor:default;
+  min-height:26px;
+  max-height:calc(var(--viewer-container-height) - 40px);
+
+  #secondaryToolbarButtonContainer{
+    #secondaryOpenFile::before{
+      -webkit-mask-image:var(--toolbarButton-openFile-icon);
+              mask-image:var(--toolbarButton-openFile-icon);
+    }
+
+    #secondaryPrint::before{
+      -webkit-mask-image:var(--toolbarButton-print-icon);
+              mask-image:var(--toolbarButton-print-icon);
+    }
+
+    #secondaryDownload::before{
+      -webkit-mask-image:var(--toolbarButton-download-icon);
+              mask-image:var(--toolbarButton-download-icon);
+    }
+
+    #presentationMode::before{
+      -webkit-mask-image:var(--toolbarButton-presentationMode-icon);
+              mask-image:var(--toolbarButton-presentationMode-icon);
+    }
+
+    #viewBookmark::before{
+      -webkit-mask-image:var(--toolbarButton-bookmark-icon);
+              mask-image:var(--toolbarButton-bookmark-icon);
+    }
+
+    #firstPage::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-firstPage-icon);
+              mask-image:var(--secondaryToolbarButton-firstPage-icon);
+    }
+
+    #lastPage::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-lastPage-icon);
+              mask-image:var(--secondaryToolbarButton-lastPage-icon);
+    }
+
+    #pageRotateCcw::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-rotateCcw-icon);
+              mask-image:var(--secondaryToolbarButton-rotateCcw-icon);
+    }
+
+    #pageRotateCw::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-rotateCw-icon);
+              mask-image:var(--secondaryToolbarButton-rotateCw-icon);
+    }
+
+    #cursorSelectTool::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-selectTool-icon);
+              mask-image:var(--secondaryToolbarButton-selectTool-icon);
+    }
+
+    #cursorHandTool::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-handTool-icon);
+              mask-image:var(--secondaryToolbarButton-handTool-icon);
+    }
+
+    #scrollPage::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-scrollPage-icon);
+              mask-image:var(--secondaryToolbarButton-scrollPage-icon);
+    }
+
+    #scrollVertical::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-scrollVertical-icon);
+              mask-image:var(--secondaryToolbarButton-scrollVertical-icon);
+    }
+
+    #scrollHorizontal::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-scrollHorizontal-icon);
+              mask-image:var(--secondaryToolbarButton-scrollHorizontal-icon);
+    }
+
+    #scrollWrapped::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-scrollWrapped-icon);
+              mask-image:var(--secondaryToolbarButton-scrollWrapped-icon);
+    }
+
+    #spreadNone::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-spreadNone-icon);
+              mask-image:var(--secondaryToolbarButton-spreadNone-icon);
+    }
+
+    #spreadOdd::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-spreadOdd-icon);
+              mask-image:var(--secondaryToolbarButton-spreadOdd-icon);
+    }
+
+    #spreadEven::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-spreadEven-icon);
+              mask-image:var(--secondaryToolbarButton-spreadEven-icon);
+    }
+
+    #imageAltTextSettings::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-imageAltTextSettings-icon);
+              mask-image:var(--secondaryToolbarButton-imageAltTextSettings-icon);
+    }
+
+    #documentProperties::before{
+      -webkit-mask-image:var(--secondaryToolbarButton-documentProperties-icon);
+              mask-image:var(--secondaryToolbarButton-documentProperties-icon);
+    }
+  }
+}
+
+#findbar{
+  --input-horizontal-padding:4px;
+  --findbar-padding:2px;
+
+  width:-moz-max-content;
+
+  width:max-content;
+  max-width:90vw;
+  min-height:var(--toolbar-height);
+  height:auto;
+  position:absolute;
+  z-index:30000;
+  cursor:default;
+  padding:0;
+  min-width:300px;
+  background-color:var(--toolbar-bg-color);
+  box-sizing:border-box;
+  flex-wrap:wrap;
+  justify-content:flex-start;
+
+  > *{
+    height:var(--toolbar-height);
+    padding:var(--findbar-padding);
+  }
+
+  #findInputContainer{
+    margin-inline-start:2px;
+
+    #findPreviousButton::before{
+      -webkit-mask-image:var(--findbarButton-previous-icon);
+              mask-image:var(--findbarButton-previous-icon);
+    }
+
+    #findNextButton::before{
+      -webkit-mask-image:var(--findbarButton-next-icon);
+              mask-image:var(--findbarButton-next-icon);
+    }
+
+    #findInput{
+      width:200px;
+      padding:5px var(--input-horizontal-padding);
+      &::-moz-placeholder{
+        font-style:normal;
+      }
+      &::placeholder{
+        font-style:normal;
+      }
+
+      .loadingInput:has(> &[data-status="pending"])::after{
+        display:inline;
+        visibility:visible;
+        inset-inline-end:calc(var(--input-horizontal-padding) + 1px);
+      }
+
+      &[data-status="notFound"]{
+        background-color:rgb(255 102 102);
+      }
+    }
+  }
+
+  #findbarMessageContainer{
+    display:none;
+    gap:4px;
+
+    &:has(> :is(#findResultsCount, #findMsg):not(:empty)){
+      display:inline flex;
+    }
+
+    #findResultsCount{
+      background-color:rgb(217 217 217);
+      color:rgb(82 82 82);
+      padding-block:4px;
+
+      &:empty{
+        display:none;
+      }
+    }
+
+    #findMsg{
+      &[data-status="notFound"]{
+        font-weight:bold;
+      }
+
+      &:empty{
+        display:none;
+      }
+    }
+  }
+
+  &.wrapContainers{
+    flex-direction:column;
+    align-items:flex-start;
+    height:-moz-max-content;
+    height:max-content;
+
+    .toolbarLabel{
+      margin:0 4px;
+    }
+
+    #findbarMessageContainer{
+      flex-wrap:wrap;
+      flex-flow:column nowrap;
+      align-items:flex-start;
+      height:-moz-max-content;
+      height:max-content;
+
+      #findResultsCount{
+        height:calc(var(--toolbar-height) - 2 * var(--findbar-padding));
+      }
+
+      #findMsg{
+        min-height:var(--toolbar-height);
+      }
+    }
+  }
+}
+
+@page{
+  margin:0;
+}
+
+#printContainer{
+  display:none;
+}
+
+@media print{
+  body{
+    background:rgb(0 0 0 / 0) none;
+  }
+
+  body[data-pdfjsprinting] #outerContainer{
+    display:none;
+  }
+
+  body[data-pdfjsprinting] #printContainer{
+    display:block;
+  }
+
+  #printContainer{
+    height:100%;
+  }
+  #printContainer > .printedPage{
+    page-break-after:always;
+    page-break-inside:avoid;
+    height:100%;
+    width:100%;
+
+    display:flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+  }
+
+  #printContainer > .xfaPrintedPage .xfaPage{
+    position:absolute;
+  }
+
+  #printContainer > .xfaPrintedPage{
+    page-break-after:always;
+    page-break-inside:avoid;
+    width:100%;
+    height:100%;
+    position:relative;
+  }
+
+  #printContainer > .printedPage :is(canvas, img){
+    max-width:100%;
+    max-height:100%;
+
+    direction:ltr;
+    display:block;
+  }
+}
+
+.visibleMediumView{
+  display:none !important;
+}
+
+.toolbarLabel{
+  width:-moz-max-content;
+  width:max-content;
+  min-width:16px;
+  height:100%;
+  padding-inline:4px;
+  margin:2px;
+  border-radius:2px;
+  color:var(--main-color);
+  font-size:12px;
+  line-height:14px;
+  text-align:left;
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+  cursor:default;
+  box-sizing:border-box;
+
+  display:inline flex;
+  flex-direction:column;
+  align-items:center;
+  justify-content:center;
+
+  > label{
+    width:100%;
+  }
+}
+
+.toolbarHorizontalGroup{
+  height:100%;
+  display:inline flex;
+  flex-direction:row;
+  align-items:center;
+  justify-content:space-between;
+  gap:1px;
+  box-sizing:border-box;
+}
+
+.dropdownToolbarButton{
+  display:inline flex;
+  flex-direction:row;
+  align-items:center;
+  justify-content:center;
+  position:relative;
+
+  width:-moz-fit-content;
+
+  width:fit-content;
+  min-width:140px;
+  padding:0;
+  background-color:var(--dropdown-btn-bg-color);
+  border:var(--dropdown-btn-border);
+  border-radius:2px;
+  color:var(--main-color);
+  font-size:12px;
+  line-height:14px;
+  -webkit-user-select:none;
+     -moz-user-select:none;
+          user-select:none;
+  cursor:default;
+  box-sizing:border-box;
+  outline:none;
+
+  &:hover{
+    background-color:var(--button-hover-color);
+  }
+
+  > select{
+    -webkit-appearance:none;
+       -moz-appearance:none;
+            appearance:none;
+    width:inherit;
+    min-width:inherit;
+    height:28px;
+    font:message-box;
+    font-size:12px;
+    color:var(--main-color);
+    margin:0;
+    padding-block:1px 2px;
+    padding-inline:6px 38px;
+    border:none;
+    outline:none;
+    background-color:var(--dropdown-btn-bg-color);
+
+    > option{
+      background:var(--doorhanger-bg-color);
+      color:var(--main-color);
+    }
+
+    &:is(:hover, :focus-visible){
+      background-color:var(--button-hover-color);
+      color:var(--toggled-btn-color);
+    }
+  }
+
+  &::after{
+    position:absolute;
+    display:inline;
+    width:var(--icon-size);
+    height:var(--icon-size);
+
+    content:"";
+    background-color:var(--toolbar-icon-bg-color);
+    -webkit-mask-size:cover;
+            mask-size:cover;
+
+    inset-inline-end:4px;
+    pointer-events:none;
+    -webkit-mask-image:var(--toolbarButton-menuArrow-icon);
+            mask-image:var(--toolbarButton-menuArrow-icon);
+  }
+
+  &:is(:hover, :focus-visible, :active)::after{
+    background-color:var(--toolbar-icon-hover-bg-color);
+  }
+}
+
+#toolbarContainer{
+  --menuitem-height:calc(var(--toolbar-height) - 6px);
+
+  width:100%;
+  height:var(--toolbar-height);
+  padding:var(--toolbar-vertical-padding) var(--toolbar-horizontal-padding);
+  position:relative;
+  box-sizing:border-box;
+  font:message-box;
+  background-color:var(--toolbar-bg-color);
+  box-shadow:var(--toolbar-box-shadow);
+  border-bottom:var(--toolbar-border-bottom);
+
+  #toolbarViewer{
+    width:100%;
+    height:100%;
+    justify-content:space-between;
+
+    > *{
+      flex:none;
+    }
+
+    input{
+      font:message-box;
+    }
+
+    .toolbarButtonSpacer{
+      width:30px;
+      display:block;
+      height:1px;
+    }
+
+    #toolbarViewerLeft{
+      margin-inline-start:8px;
+
+      #numPages.toolbarLabel{
+        padding-inline-start:3px;
+        flex:none;
+      }
+    }
+  }
+
+  #loadingBar{
+    --progressBar-percent:0%;
+    --progressBar-end-offset:0;
+
+    position:absolute;
+    top:var(--toolbar-height);
+    inset-inline:0 var(--progressBar-end-offset);
+    height:4px;
+    background-color:var(--progressBar-bg-color);
+    border-bottom:1px solid var(--toolbar-border-color);
+    transition-property:inset-inline-start;
+    transition-duration:var(--sidebar-transition-duration);
+    transition-timing-function:var(--sidebar-transition-timing-function);
+
+    .progress{
+      position:absolute;
+      top:0;
+      inset-inline-start:0;
+      width:100%;
+      transform:scaleX(var(--progressBar-percent));
+      transform-origin:calc(50% - 50% * var(--dir-factor)) 0;
+      height:100%;
+      background-color:var(--progressBar-color);
+      overflow:hidden;
+      transition:transform 200ms;
+    }
+
+    &.indeterminate .progress{
+      transform:none;
+      background-color:var(--progressBar-bg-color);
+      transition:none;
+
+      .glimmer{
+        position:absolute;
+        top:0;
+        inset-inline-start:0;
+        height:100%;
+        width:calc(100% + 150px);
+        background:repeating-linear-gradient(
+          135deg,
+          var(--progressBar-blend-color) 0,
+          var(--progressBar-bg-color) 5px,
+          var(--progressBar-bg-color) 45px,
+          var(--progressBar-color) 55px,
+          var(--progressBar-color) 95px,
+          var(--progressBar-blend-color) 100px
+        );
+        animation:progressIndeterminate 1s linear infinite;
+      }
+    }
+  }
+}
+
+@media all and (max-width: 840px){
+  #sidebarContainer{
+    background-color:var(--sidebar-narrow-bg-color);
+  }
+  #outerContainer.viewsManagerOpen #viewerContainer{
+    inset-inline-start:0 !important;
+  }
+}
+
+@media all and (max-width: 750px){
+  #outerContainer .hiddenMediumView{
+    display:none !important;
+  }
+  #outerContainer .visibleMediumView:not(.hidden, [hidden]){
+    display:inline-block !important;
+  }
+}
+
+@media all and (max-width: 690px){
+  .hiddenSmallView,
+  .hiddenSmallView *{
+    display:none !important;
+  }
+
+  #toolbarContainer #toolbarViewer .toolbarButtonSpacer{
+    width:0;
+  }
+}
+
+@media all and (max-width: 560px){
+  #scaleSelectContainer{
+    display:none;
+  }
+}
diff --git a/public/pdfjs/web/viewer.html b/public/pdfjs/web/viewer.html
new file mode 100644
index 0000000..14c440e
--- /dev/null
+++ b/public/pdfjs/web/viewer.html
@@ -0,0 +1,1213 @@
+锘�<!doctype html>
+<!--
+Copyright 2012 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.
+
+Adobe CMap resources are covered by their own copyright but the same license:
+
+    Copyright 1990-2015 Adobe Systems Incorporated.
+
+See https://github.com/adobe-type-tools/cmap-resources
+-->
+<html dir="ltr" mozdisallowselectionprint>
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
+    <meta name="google" content="notranslate" />
+    <title>PDF.js viewer</title>
+
+  <meta
+      http-equiv="Content-Security-Policy"
+      content="default-src 'none'; script-src 'self' 'wasm-unsafe-eval'; worker-src 'self' blob:; style-src 'self'; img-src 'self' blob: data:; media-src blob:; font-src 'self' data:; connect-src * blob: data:; base-uri 'none'; form-action 'none';"
+    />
+
+<!-- This snippet is used in production (included from viewer.html) -->
+<link rel="resource" type="application/l10n" href="locale/locale.json" />
+<script src="../build/pdf.mjs" type="module"></script>
+
+    <link rel="stylesheet" href="viewer.css" />
+
+  <script src="viewer.mjs" type="module"></script>
+  </head>
+
+  <body tabindex="0">
+    <div id="outerContainer">
+      <span id="viewer-alert" class="visuallyHidden" role="alert"></span>
+
+      <div id="mainContainer">
+        <div class="toolbar">
+          <div id="toolbarContainer">
+            <div id="toolbarViewer" class="toolbarHorizontalGroup">
+              <div id="toolbarViewerLeft" class="toolbarHorizontalGroup">
+                <button
+                  id="viewsManagerToggleButton"
+                  class="toolbarButton"
+                  type="button"
+                  tabindex="0"
+                  data-l10n-id="pdfjs-toggle-views-manager-button1"
+                  aria-expanded="false"
+                  aria-haspopup="true"
+                  aria-controls="viewsManager"
+                >
+                  <span data-l10n-id="pdfjs-toggle-views-manager-button1-label"></span>
+                </button>
+                <div
+                  id="viewsManager"
+                  class="menuContainer sidebar"
+                  hidden="true"
+                  role="dialog"
+                  aria-describedby="viewsManagerHeaderLabel"
+                  data-l10n-id="pdfjs-views-manager-sidebar"
+                >
+                  <div id="viewsManagerHeader">
+                    <div id="viewsManagerTitle">
+                      <div id="viewsManagerSelector">
+                        <button
+                          class="toolbarButton viewsManagerButton hasPopupMenu"
+                          type="button"
+                          id="viewsManagerSelectorButton"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-views-manager-view-selector-button"
+                          aria-expanded="false"
+                          aria-haspopup="listbox"
+                          aria-controls="viewsManagerSelectorOptions"
+                        >
+                          <span data-l10n-id="pdfjs-views-manager-view-selector-button-label"></span>
+                        </button>
+                        <menu id="viewsManagerSelectorOptions" role="listbox" class="popupMenu withMark">
+                          <button id="thumbnailsViewMenu" role="option" type="button" tabindex="-1">
+                            <span data-l10n-id="pdfjs-views-manager-pages-option-label"></span>
+                          </button>
+                          <button id="outlinesViewMenu" role="option" type="button" tabindex="-1">
+                            <span data-l10n-id="pdfjs-views-manager-outlines-option-label"></span>
+                          </button>
+                          <button id="attachmentsViewMenu" role="option" type="button" tabindex="-1">
+                            <span data-l10n-id="pdfjs-views-manager-attachments-option-label"></span>
+                          </button>
+                          <button id="layersViewMenu" role="option" type="button" tabindex="-1">
+                            <span data-l10n-id="pdfjs-views-manager-layers-option-label"></span>
+                          </button>
+                        </menu>
+                      </div>
+                      <span id="viewsManagerHeaderLabel" class="viewsManagerLabel" role="heading" aria-level="2"></span>
+                      <button
+                        id="viewsManagerAddFileButton"
+                        class="toolbarButton viewsManagerButton"
+                        type="button"
+                        tabindex="0"
+                        data-l10n-id="pdfjs-views-manager-add-file-button"
+                        hidden="true"
+                      >
+                        <span data-l10n-id="pdfjs-views-manager-add-file-button-label"></span>
+                        <input id="viewsManagerAddFilePicker" type="file" accept="application/pdf,image/*" multiple />
+                      </button>
+                      <button
+                        id="viewsManagerCurrentOutlineButton"
+                        class="toolbarButton viewsManagerButton"
+                        type="button"
+                        tabindex="0"
+                        data-l10n-id="pdfjs-current-outline-item-button"
+                        hidden="true"
+                      >
+                        <span data-l10n-id="pdfjs-current-outline-item-button-label"></span>
+                      </button>
+                    </div>
+                    <div id="viewsManagerStatus">
+                      <div id="viewsManagerStatusAction">
+                        <span id="viewsManagerStatusActionLabelContainer" class="viewsManagerStatusLabel">
+                          <button
+                            id="viewsManagerStatusActionDeselectButton"
+                            class="hidden"
+                            type="button"
+                            tabindex="0"
+                            role="checkbox"
+                            aria-checked="true"
+                            aria-labelledby="viewsManagerStatusActionLabel"
+                          ></button>
+                          <span
+                            id="viewsManagerStatusActionLabel"
+                            class="viewsManagerStatusLabel"
+                            data-l10n-id="pdfjs-views-manager-pages-status-none-action-label"
+                          ></span>
+                        </span>
+                        <div id="actionSelector">
+                          <button
+                            id="viewsManagerStatusActionButton"
+                            class="viewsManagerButton hasPopupMenu"
+                            type="button"
+                            tabindex="0"
+                            aria-haspopup="menu"
+                            aria-controls="viewsManagerStatusActionOptions"
+                            aria-expanded="false"
+                          >
+                            <span data-l10n-id="pdfjs-views-manager-pages-status-action-button-label"></span>
+                          </button>
+                          <menu id="viewsManagerStatusActionOptions" class="popupMenu">
+                            <button id="viewsManagerStatusActionCopy" class="noIcon" role="menuitem" type="button" tabindex="-1" disabled>
+                              <span data-l10n-id="pdfjs-views-manager-pages-status-copy-button-label"></span>
+                            </button>
+                            <button id="viewsManagerStatusActionCut" class="noIcon" role="menuitem" type="button" tabindex="-1" disabled>
+                              <span data-l10n-id="pdfjs-views-manager-pages-status-cut-button-label"></span>
+                            </button>
+                            <button id="viewsManagerStatusActionDelete" class="noIcon" role="menuitem" type="button" tabindex="-1" disabled>
+                              <span data-l10n-id="pdfjs-views-manager-pages-status-delete-button-label"></span>
+                            </button>
+                            <button id="viewsManagerStatusActionExport" class="noIcon" role="menuitem" type="button" tabindex="-1" disabled>
+                              <span data-l10n-id="pdfjs-views-manager-pages-status-export-selected-button-label"></span>
+                            </button>
+                          </menu>
+                        </div>
+                      </div>
+                      <div id="viewsManagerStatusUndo" class="hidden">
+                        <span id="viewsManagerStatusUndoLabel" class="viewsManagerStatusLabel"></span>
+                        <div>
+                          <button id="viewsManagerStatusUndoButton" class="viewsManagerButton" type="button" tabindex="0">
+                            <span data-l10n-id="pdfjs-views-manager-status-undo-button-label"></span>
+                          </button>
+                          <button
+                            id="viewsManagerStatusUndoCloseButton"
+                            class="toolbarButton viewsManagerButton viewsCloseButton"
+                            type="button"
+                            tabindex="0"
+                            data-l10n-id="pdfjs-views-manager-status-close-button"
+                          >
+                            <span data-l10n-id="pdfjs-views-manager-status-close-button-label"></span>
+                          </button>
+                        </div>
+                      </div>
+                      <div id="viewsManagerStatusWarning" class="hidden">
+                        <span id="viewsManagerStatusWarningLabel" class="viewsManagerStatusLabel"></span>
+                        <button
+                          id="viewsManagerStatusWarningCloseButton"
+                          class="toolbarButton viewsManagerButton viewsCloseButton"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-views-manager-status-close-button"
+                        >
+                          <span data-l10n-id="pdfjs-views-manager-status-close-button-label"></span>
+                        </button>
+                      </div>
+                      <div id="viewsManagerStatusWaiting" class="hidden">
+                        <span id="viewsManagerStatusWaitingLabel" class="viewsManagerStatusLabel"></span>
+                        <button
+                          id="viewsManagerStatusWaitingCloseButton"
+                          class="toolbarButton viewsManagerButton viewsCloseButton"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-views-manager-status-close-button"
+                        >
+                          <span data-l10n-id="pdfjs-views-manager-status-close-button-label"></span>
+                        </button>
+                      </div>
+                    </div>
+                  </div>
+                  <div id="viewsManagerContent" tabindex="-1">
+                    <div id="thumbnailsView" class="thumbnailsView hidden" tabindex="-1"></div>
+                    <div id="outlinesView" class="treeView hidden"></div>
+                    <div id="attachmentsView" class="hidden"></div>
+                    <div id="layersView" class="treeView hidden"></div>
+                  </div>
+                  <div
+                    id="viewsManagerResizer"
+                    class="sidebarResizer"
+                    role="separator"
+                    aria-controls="viewsManager"
+                    tabindex="0"
+                    data-l10n-id="pdfjs-views-manager-sidebar-resizer"
+                  ></div>
+                </div>
+                <!-- sidebarContainer -->
+
+                <div class="toolbarButtonSpacer"></div>
+                <div class="toolbarButtonWithContainer">
+                  <button
+                    id="viewFindButton"
+                    class="toolbarButton"
+                    type="button"
+                    tabindex="0"
+                    data-l10n-id="pdfjs-findbar-button"
+                    aria-expanded="false"
+                    aria-controls="findbar"
+                  >
+                    <span data-l10n-id="pdfjs-findbar-button-label"></span>
+                  </button>
+                  <div class="hidden doorHanger toolbarHorizontalGroup" id="findbar">
+                    <div id="findInputContainer" class="toolbarHorizontalGroup">
+                      <span class="loadingInput end toolbarHorizontalGroup">
+                        <input id="findInput" class="toolbarField" tabindex="0" data-l10n-id="pdfjs-find-input" aria-invalid="false" />
+                      </span>
+                      <div class="toolbarHorizontalGroup">
+                        <button id="findPreviousButton" class="toolbarButton" type="button" tabindex="0" data-l10n-id="pdfjs-find-previous-button">
+                          <span data-l10n-id="pdfjs-find-previous-button-label"></span>
+                        </button>
+                        <div class="splitToolbarButtonSeparator"></div>
+                        <button id="findNextButton" class="toolbarButton" type="button" tabindex="0" data-l10n-id="pdfjs-find-next-button">
+                          <span data-l10n-id="pdfjs-find-next-button-label"></span>
+                        </button>
+                      </div>
+                    </div>
+
+                    <div id="findbarOptionsOneContainer" class="toolbarHorizontalGroup">
+                      <div class="toggleButton toolbarLabel">
+                        <input type="checkbox" id="findHighlightAll" tabindex="0" />
+                        <label for="findHighlightAll" data-l10n-id="pdfjs-find-highlight-checkbox"></label>
+                      </div>
+                      <div class="toggleButton toolbarLabel">
+                        <input type="checkbox" id="findMatchCase" tabindex="0" />
+                        <label for="findMatchCase" data-l10n-id="pdfjs-find-match-case-checkbox-label"></label>
+                      </div>
+                    </div>
+                    <div id="findbarOptionsTwoContainer" class="toolbarHorizontalGroup">
+                      <div class="toggleButton toolbarLabel">
+                        <input type="checkbox" id="findMatchDiacritics" tabindex="0" />
+                        <label for="findMatchDiacritics" data-l10n-id="pdfjs-find-match-diacritics-checkbox-label"></label>
+                      </div>
+                      <div class="toggleButton toolbarLabel">
+                        <input type="checkbox" id="findEntireWord" tabindex="0" />
+                        <label for="findEntireWord" data-l10n-id="pdfjs-find-entire-word-checkbox-label"></label>
+                      </div>
+                    </div>
+
+                    <div id="findbarMessageContainer" class="toolbarHorizontalGroup" aria-live="polite">
+                      <span id="findResultsCount" class="toolbarLabel"></span>
+                      <span id="findMsg" class="toolbarLabel"></span>
+                    </div>
+                  </div>
+                  <!-- findbar -->
+                </div>
+                <div class="toolbarHorizontalGroup hiddenSmallView">
+                  <button class="toolbarButton" type="button" id="previous" tabindex="0" data-l10n-id="pdfjs-previous-button">
+                    <span data-l10n-id="pdfjs-previous-button-label"></span>
+                  </button>
+                  <div class="splitToolbarButtonSeparator"></div>
+                  <button class="toolbarButton" type="button" id="next" tabindex="0" data-l10n-id="pdfjs-next-button">
+                    <span data-l10n-id="pdfjs-next-button-label"></span>
+                  </button>
+                </div>
+                <div class="toolbarHorizontalGroup">
+                  <span class="loadingInput start toolbarHorizontalGroup">
+                    <input
+                      type="number"
+                      id="pageNumber"
+                      class="toolbarField"
+                      value="1"
+                      min="1"
+                      tabindex="0"
+                      data-l10n-id="pdfjs-page-input"
+                      autocomplete="off"
+                    />
+                  </span>
+                  <span id="numPages" class="toolbarLabel"></span>
+                </div>
+              </div>
+              <div id="toolbarViewerMiddle" class="toolbarHorizontalGroup">
+                <div class="toolbarHorizontalGroup">
+                  <button id="zoomOutButton" class="toolbarButton" type="button" tabindex="0" data-l10n-id="pdfjs-zoom-out-button">
+                    <span data-l10n-id="pdfjs-zoom-out-button-label"></span>
+                  </button>
+                  <div class="splitToolbarButtonSeparator"></div>
+                  <button id="zoomInButton" class="toolbarButton" type="button" tabindex="0" data-l10n-id="pdfjs-zoom-in-button">
+                    <span data-l10n-id="pdfjs-zoom-in-button-label"></span>
+                  </button>
+                </div>
+                <span id="scaleSelectContainer" class="dropdownToolbarButton">
+                  <select id="scaleSelect" tabindex="0" data-l10n-id="pdfjs-zoom-select">
+                    <option id="pageAutoOption" value="auto" selected="selected" data-l10n-id="pdfjs-page-scale-auto"></option>
+                    <option id="pageActualOption" value="page-actual" data-l10n-id="pdfjs-page-scale-actual"></option>
+                    <option id="pageFitOption" value="page-fit" data-l10n-id="pdfjs-page-scale-fit"></option>
+                    <option id="pageWidthOption" value="page-width" data-l10n-id="pdfjs-page-scale-width"></option>
+                    <option
+                      id="customScaleOption"
+                      value="custom"
+                      disabled="disabled"
+                      hidden="true"
+                      data-l10n-id="pdfjs-page-scale-percent"
+                      data-l10n-args='{ "scale": 0 }'
+                    ></option>
+                    <option value="0.5" data-l10n-id="pdfjs-page-scale-percent" data-l10n-args='{ "scale": 50 }'></option>
+                    <option value="0.75" data-l10n-id="pdfjs-page-scale-percent" data-l10n-args='{ "scale": 75 }'></option>
+                    <option value="1" data-l10n-id="pdfjs-page-scale-percent" data-l10n-args='{ "scale": 100 }'></option>
+                    <option value="1.25" data-l10n-id="pdfjs-page-scale-percent" data-l10n-args='{ "scale": 125 }'></option>
+                    <option value="1.5" data-l10n-id="pdfjs-page-scale-percent" data-l10n-args='{ "scale": 150 }'></option>
+                    <option value="2" data-l10n-id="pdfjs-page-scale-percent" data-l10n-args='{ "scale": 200 }'></option>
+                    <option value="3" data-l10n-id="pdfjs-page-scale-percent" data-l10n-args='{ "scale": 300 }'></option>
+                    <option value="4" data-l10n-id="pdfjs-page-scale-percent" data-l10n-args='{ "scale": 400 }'></option>
+                  </select>
+                </span>
+              </div>
+              <div id="toolbarViewerRight" class="toolbarHorizontalGroup">
+                <div id="editorModeButtons" class="toolbarHorizontalGroup">
+                  <div id="editorComment" class="toolbarButtonWithContainer" hidden="true">
+                    <button
+                      id="editorCommentButton"
+                      class="toolbarButton"
+                      type="button"
+                      tabindex="0"
+                      disabled="disabled"
+                      aria-expanded="false"
+                      aria-haspopup="true"
+                      aria-controls="editorCommentParamsToolbar"
+                      data-l10n-id="pdfjs-editor-comment-button"
+                    >
+                      <span data-l10n-id="pdfjs-editor-comment-button-label"></span>
+                    </button>
+                    <div class="editorParamsToolbar hidden menu" id="editorCommentParamsToolbar">
+                      <div id="editorCommentsSidebar" class="menuContainer comment sidebar" role="landmark" aria-labelledby="editorCommentsSidebarHeader">
+                        <div id="editorCommentsSidebarResizer" class="sidebarResizer" role="separator" aria-controls="editorCommentsSidebar" tabindex="0"></div>
+                        <div id="editorCommentsSidebarHeader" role="heading" aria-level="2">
+                          <span class="commentCount">
+                            <span id="editorCommentsSidebarTitle" data-l10n-id="pdfjs-editor-comments-sidebar-title" data-l10n-args='{ "count": 0 }'></span>
+                            <span id="editorCommentsSidebarCount"></span>
+                          </span>
+                          <button id="editorCommentsSidebarCloseButton" type="button" tabindex="0" data-l10n-id="pdfjs-editor-comments-sidebar-close-button">
+                            <span data-l10n-id="pdfjs-editor-comments-sidebar-close-button-label"></span>
+                          </button>
+                        </div>
+                        <div id="editorCommentsSidebarListContainer" tabindex="-1">
+                          <ul id="editorCommentsSidebarList"></ul>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <div id="editorSignature" class="toolbarButtonWithContainer" hidden="true">
+                    <button
+                      id="editorSignatureButton"
+                      class="toolbarButton"
+                      type="button"
+                      tabindex="0"
+                      disabled="disabled"
+                      aria-expanded="false"
+                      aria-haspopup="true"
+                      aria-controls="editorSignatureParamsToolbar"
+                      data-l10n-id="pdfjs-editor-signature-button"
+                    >
+                      <span data-l10n-id="pdfjs-editor-signature-button-label"></span>
+                    </button>
+                    <div class="editorParamsToolbar hidden doorHangerRight menu" id="editorSignatureParamsToolbar">
+                      <div id="addSignatureDoorHanger" class="menuContainer" role="region" data-l10n-id="pdfjs-editor-add-signature-container">
+                        <button
+                          id="editorSignatureAddSignature"
+                          class="toolbarButton labeled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-editor-signature-add-signature-button"
+                        >
+                          <span data-l10n-id="pdfjs-editor-signature-add-signature-button-label" class="editorParamsLabel"></span>
+                        </button>
+                      </div>
+                    </div>
+                  </div>
+                  <div id="editorHighlight" class="toolbarButtonWithContainer">
+                    <button
+                      id="editorHighlightButton"
+                      class="toolbarButton"
+                      type="button"
+                      disabled="disabled"
+                      aria-expanded="false"
+                      aria-haspopup="true"
+                      aria-controls="editorHighlightParamsToolbar"
+                      tabindex="0"
+                      data-l10n-id="pdfjs-editor-highlight-button"
+                    >
+                      <span data-l10n-id="pdfjs-editor-highlight-button-label"></span>
+                    </button>
+                    <div class="editorParamsToolbar hidden doorHangerRight" id="editorHighlightParamsToolbar">
+                      <div id="highlightParamsToolbarContainer" class="editorParamsToolbarContainer">
+                        <div id="editorHighlightColorPicker" class="colorPicker">
+                          <span id="highlightColorPickerLabel" class="editorParamsLabel" data-l10n-id="pdfjs-editor-highlight-colorpicker-label"></span>
+                        </div>
+                        <div id="editorHighlightThickness">
+                          <label
+                            for="editorFreeHighlightThickness"
+                            class="editorParamsLabel"
+                            data-l10n-id="pdfjs-editor-free-highlight-thickness-input"
+                          ></label>
+                          <div class="thicknessPicker">
+                            <input
+                              type="range"
+                              id="editorFreeHighlightThickness"
+                              class="editorParamsSlider"
+                              data-l10n-id="pdfjs-editor-free-highlight-thickness-title"
+                              value="12"
+                              min="8"
+                              max="24"
+                              step="1"
+                              tabindex="0"
+                            />
+                          </div>
+                        </div>
+                        <div id="editorHighlightVisibility">
+                          <div class="divider"></div>
+                          <div class="toggler">
+                            <label for="editorHighlightShowAll" class="editorParamsLabel" data-l10n-id="pdfjs-editor-highlight-show-all-button-label"></label>
+                            <button
+                              id="editorHighlightShowAll"
+                              class="toggle-button"
+                              type="button"
+                              data-l10n-id="pdfjs-editor-highlight-show-all-button"
+                              aria-pressed="true"
+                              tabindex="0"
+                            ></button>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <div id="editorFreeText" class="toolbarButtonWithContainer">
+                    <button
+                      id="editorFreeTextButton"
+                      class="toolbarButton"
+                      type="button"
+                      disabled="disabled"
+                      aria-expanded="false"
+                      aria-haspopup="true"
+                      aria-controls="editorFreeTextParamsToolbar"
+                      tabindex="0"
+                      data-l10n-id="pdfjs-editor-free-text-button"
+                    >
+                      <span data-l10n-id="pdfjs-editor-free-text-button-label"></span>
+                    </button>
+                    <div class="editorParamsToolbar hidden doorHangerRight" id="editorFreeTextParamsToolbar">
+                      <div class="editorParamsToolbarContainer">
+                        <div class="editorParamsSetter">
+                          <label for="editorFreeTextColor" class="editorParamsLabel" data-l10n-id="pdfjs-editor-free-text-color-input"></label>
+                          <input type="color" id="editorFreeTextColor" class="editorParamsColor" tabindex="0" />
+                        </div>
+                        <div class="editorParamsSetter">
+                          <label for="editorFreeTextFontSize" class="editorParamsLabel" data-l10n-id="pdfjs-editor-free-text-size-input"></label>
+                          <input type="range" id="editorFreeTextFontSize" class="editorParamsSlider" value="10" min="5" max="100" step="1" tabindex="0" />
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <div id="editorInk" class="toolbarButtonWithContainer">
+                    <button
+                      id="editorInkButton"
+                      class="toolbarButton"
+                      type="button"
+                      disabled="disabled"
+                      aria-expanded="false"
+                      aria-haspopup="true"
+                      aria-controls="editorInkParamsToolbar"
+                      tabindex="0"
+                      data-l10n-id="pdfjs-editor-ink-button"
+                    >
+                      <span data-l10n-id="pdfjs-editor-ink-button-label"></span>
+                    </button>
+                    <div class="editorParamsToolbar hidden doorHangerRight" id="editorInkParamsToolbar">
+                      <div class="editorParamsToolbarContainer">
+                        <div class="editorParamsSetter">
+                          <label for="editorInkColor" class="editorParamsLabel" data-l10n-id="pdfjs-editor-ink-color-input"></label>
+                          <input type="color" id="editorInkColor" class="editorParamsColor" tabindex="0" />
+                        </div>
+                        <div class="editorParamsSetter">
+                          <label for="editorInkThickness" class="editorParamsLabel" data-l10n-id="pdfjs-editor-ink-thickness-input"></label>
+                          <input type="range" id="editorInkThickness" class="editorParamsSlider" value="1" min="1" max="20" step="1" tabindex="0" />
+                        </div>
+                        <div class="editorParamsSetter">
+                          <label for="editorInkOpacity" class="editorParamsLabel" data-l10n-id="pdfjs-editor-ink-opacity-input"></label>
+                          <input type="range" id="editorInkOpacity" class="editorParamsSlider" value="1" min="0.05" max="1" step="0.05" tabindex="0" />
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <div id="editorStamp" class="toolbarButtonWithContainer">
+                    <button
+                      id="editorStampButton"
+                      class="toolbarButton"
+                      type="button"
+                      disabled="disabled"
+                      aria-expanded="false"
+                      aria-haspopup="true"
+                      aria-controls="editorStampParamsToolbar"
+                      tabindex="0"
+                      data-l10n-id="pdfjs-editor-stamp-button"
+                    >
+                      <span data-l10n-id="pdfjs-editor-stamp-button-label"></span>
+                    </button>
+                    <div class="editorParamsToolbar hidden doorHangerRight menu" id="editorStampParamsToolbar">
+                      <div class="menuContainer">
+                        <button
+                          id="editorStampAddImage"
+                          class="toolbarButton labeled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-editor-stamp-add-image-button"
+                        >
+                          <span class="editorParamsLabel" data-l10n-id="pdfjs-editor-stamp-add-image-button-label"></span>
+                        </button>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+
+                <div id="editorModeSeparator" class="verticalToolbarSeparator"></div>
+
+                <div class="toolbarHorizontalGroup hiddenMediumView">
+                  <button id="printButton" class="toolbarButton" type="button" tabindex="0" data-l10n-id="pdfjs-print-button">
+                    <span data-l10n-id="pdfjs-print-button-label"></span>
+                  </button>
+
+                  <button id="downloadButton" class="toolbarButton" type="button" tabindex="0" data-l10n-id="pdfjs-save-button">
+                    <span data-l10n-id="pdfjs-save-button-label"></span>
+                  </button>
+                </div>
+
+                <div class="verticalToolbarSeparator hiddenMediumView"></div>
+
+                <div id="secondaryToolbarToggle" class="toolbarButtonWithContainer">
+                  <button
+                    id="secondaryToolbarToggleButton"
+                    class="toolbarButton"
+                    type="button"
+                    tabindex="0"
+                    data-l10n-id="pdfjs-tools-button"
+                    aria-expanded="false"
+                    aria-haspopup="true"
+                    aria-controls="secondaryToolbar"
+                  >
+                    <span data-l10n-id="pdfjs-tools-button-label"></span>
+                  </button>
+                  <div id="secondaryToolbar" class="hidden doorHangerRight menu">
+                    <div id="secondaryToolbarButtonContainer" class="menuContainer">
+                      <button id="secondaryOpenFile" class="toolbarButton labeled" type="button" tabindex="0" data-l10n-id="pdfjs-open-file-button">
+                        <span data-l10n-id="pdfjs-open-file-button-label"></span>
+                      </button>
+
+                      <div class="visibleMediumView">
+                        <button id="secondaryPrint" class="toolbarButton labeled" type="button" tabindex="0" data-l10n-id="pdfjs-print-button">
+                          <span data-l10n-id="pdfjs-print-button-label"></span>
+                        </button>
+
+                        <button id="secondaryDownload" class="toolbarButton labeled" type="button" tabindex="0" data-l10n-id="pdfjs-save-button">
+                          <span data-l10n-id="pdfjs-save-button-label"></span>
+                        </button>
+
+                      </div>
+
+                      <div class="horizontalToolbarSeparator"></div>
+
+                      <button id="presentationMode" class="toolbarButton labeled" type="button" tabindex="0" data-l10n-id="pdfjs-presentation-mode-button">
+                        <span data-l10n-id="pdfjs-presentation-mode-button-label"></span>
+                      </button>
+
+                      <a href="#" id="viewBookmark" class="toolbarButton labeled" tabindex="0" data-l10n-id="pdfjs-bookmark-button">
+                        <span data-l10n-id="pdfjs-bookmark-button-label"></span>
+                      </a>
+
+                      <div id="viewBookmarkSeparator" class="horizontalToolbarSeparator"></div>
+
+                      <button id="firstPage" class="toolbarButton labeled" type="button" tabindex="0" data-l10n-id="pdfjs-first-page-button">
+                        <span data-l10n-id="pdfjs-first-page-button-label"></span>
+                      </button>
+                      <button id="lastPage" class="toolbarButton labeled" type="button" tabindex="0" data-l10n-id="pdfjs-last-page-button">
+                        <span data-l10n-id="pdfjs-last-page-button-label"></span>
+                      </button>
+
+                      <div class="horizontalToolbarSeparator"></div>
+
+                      <button id="pageRotateCw" class="toolbarButton labeled" type="button" tabindex="0" data-l10n-id="pdfjs-page-rotate-cw-button">
+                        <span data-l10n-id="pdfjs-page-rotate-cw-button-label"></span>
+                      </button>
+                      <button id="pageRotateCcw" class="toolbarButton labeled" type="button" tabindex="0" data-l10n-id="pdfjs-page-rotate-ccw-button">
+                        <span data-l10n-id="pdfjs-page-rotate-ccw-button-label"></span>
+                      </button>
+
+                      <div class="horizontalToolbarSeparator"></div>
+
+                      <div id="cursorToolButtons" role="radiogroup">
+                        <button
+                          id="cursorSelectTool"
+                          class="toolbarButton labeled toggled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-cursor-text-select-tool-button"
+                          role="radio"
+                          aria-checked="true"
+                        >
+                          <span data-l10n-id="pdfjs-cursor-text-select-tool-button-label"></span>
+                        </button>
+                        <button
+                          id="cursorHandTool"
+                          class="toolbarButton labeled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-cursor-hand-tool-button"
+                          role="radio"
+                          aria-checked="false"
+                        >
+                          <span data-l10n-id="pdfjs-cursor-hand-tool-button-label"></span>
+                        </button>
+                      </div>
+
+                      <div class="horizontalToolbarSeparator"></div>
+
+                      <div id="scrollModeButtons" role="radiogroup">
+                        <button
+                          id="scrollPage"
+                          class="toolbarButton labeled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-scroll-page-button"
+                          role="radio"
+                          aria-checked="false"
+                        >
+                          <span data-l10n-id="pdfjs-scroll-page-button-label"></span>
+                        </button>
+                        <button
+                          id="scrollVertical"
+                          class="toolbarButton labeled toggled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-scroll-vertical-button"
+                          role="radio"
+                          aria-checked="true"
+                        >
+                          <span data-l10n-id="pdfjs-scroll-vertical-button-label"></span>
+                        </button>
+                        <button
+                          id="scrollHorizontal"
+                          class="toolbarButton labeled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-scroll-horizontal-button"
+                          role="radio"
+                          aria-checked="false"
+                        >
+                          <span data-l10n-id="pdfjs-scroll-horizontal-button-label"></span>
+                        </button>
+                        <button
+                          id="scrollWrapped"
+                          class="toolbarButton labeled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-scroll-wrapped-button"
+                          role="radio"
+                          aria-checked="false"
+                        >
+                          <span data-l10n-id="pdfjs-scroll-wrapped-button-label"></span>
+                        </button>
+                      </div>
+
+                      <div class="horizontalToolbarSeparator"></div>
+
+                      <div id="spreadModeButtons" role="radiogroup">
+                        <button
+                          id="spreadNone"
+                          class="toolbarButton labeled toggled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-spread-none-button"
+                          role="radio"
+                          aria-checked="true"
+                        >
+                          <span data-l10n-id="pdfjs-spread-none-button-label"></span>
+                        </button>
+                        <button
+                          id="spreadOdd"
+                          class="toolbarButton labeled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-spread-odd-button"
+                          role="radio"
+                          aria-checked="false"
+                        >
+                          <span data-l10n-id="pdfjs-spread-odd-button-label"></span>
+                        </button>
+                        <button
+                          id="spreadEven"
+                          class="toolbarButton labeled"
+                          type="button"
+                          tabindex="0"
+                          data-l10n-id="pdfjs-spread-even-button"
+                          role="radio"
+                          aria-checked="false"
+                        >
+                          <span data-l10n-id="pdfjs-spread-even-button-label"></span>
+                        </button>
+                      </div>
+
+                      <div id="imageAltTextSettingsSeparator" class="horizontalToolbarSeparator hidden"></div>
+                      <button
+                        id="imageAltTextSettings"
+                        type="button"
+                        class="toolbarButton labeled hidden"
+                        tabindex="0"
+                        data-l10n-id="pdfjs-image-alt-text-settings-button"
+                        aria-controls="altTextSettingsDialog"
+                      >
+                        <span data-l10n-id="pdfjs-image-alt-text-settings-button-label"></span>
+                      </button>
+
+                      <div class="horizontalToolbarSeparator"></div>
+
+                      <button
+                        id="documentProperties"
+                        class="toolbarButton labeled"
+                        type="button"
+                        tabindex="0"
+                        data-l10n-id="pdfjs-document-properties-button"
+                        aria-controls="documentPropertiesDialog"
+                      >
+                        <span data-l10n-id="pdfjs-document-properties-button-label"></span>
+                      </button>
+                    </div>
+                  </div>
+                  <!-- secondaryToolbar -->
+                </div>
+              </div>
+            </div>
+            <div id="loadingBar">
+              <div class="progress">
+                <div class="glimmer"></div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div id="viewerContainer" tabindex="0">
+          <div id="viewer" class="pdfViewer"></div>
+        </div>
+      </div>
+      <!-- mainContainer -->
+
+      <div id="dialogContainer">
+        <dialog id="passwordDialog">
+          <div class="row">
+            <label for="password" id="passwordText" data-l10n-id="pdfjs-password-label"></label>
+          </div>
+          <div class="row">
+            <input type="password" id="password" class="toolbarField" />
+          </div>
+          <div class="buttonRow">
+            <button id="passwordCancel" class="dialogButton" type="button"><span data-l10n-id="pdfjs-password-cancel-button"></span></button>
+            <button id="passwordSubmit" class="dialogButton" type="button"><span data-l10n-id="pdfjs-password-ok-button"></span></button>
+          </div>
+        </dialog>
+        <dialog id="documentPropertiesDialog">
+          <div class="row">
+            <span id="fileNameLabel" data-l10n-id="pdfjs-document-properties-file-name"></span>
+            <p id="fileNameField" aria-labelledby="fileNameLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="fileSizeLabel" data-l10n-id="pdfjs-document-properties-file-size"></span>
+            <p id="fileSizeField" aria-labelledby="fileSizeLabel">-</p>
+          </div>
+          <div class="separator"></div>
+          <div class="row">
+            <span id="titleLabel" data-l10n-id="pdfjs-document-properties-title"></span>
+            <p id="titleField" aria-labelledby="titleLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="authorLabel" data-l10n-id="pdfjs-document-properties-author"></span>
+            <p id="authorField" aria-labelledby="authorLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="subjectLabel" data-l10n-id="pdfjs-document-properties-subject"></span>
+            <p id="subjectField" aria-labelledby="subjectLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="keywordsLabel" data-l10n-id="pdfjs-document-properties-keywords"></span>
+            <p id="keywordsField" aria-labelledby="keywordsLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="creationDateLabel" data-l10n-id="pdfjs-document-properties-creation-date"></span>
+            <p id="creationDateField" aria-labelledby="creationDateLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="modificationDateLabel" data-l10n-id="pdfjs-document-properties-modification-date"></span>
+            <p id="modificationDateField" aria-labelledby="modificationDateLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="creatorLabel" data-l10n-id="pdfjs-document-properties-creator"></span>
+            <p id="creatorField" aria-labelledby="creatorLabel">-</p>
+          </div>
+          <div class="separator"></div>
+          <div class="row">
+            <span id="producerLabel" data-l10n-id="pdfjs-document-properties-producer"></span>
+            <p id="producerField" aria-labelledby="producerLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="versionLabel" data-l10n-id="pdfjs-document-properties-version"></span>
+            <p id="versionField" aria-labelledby="versionLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="pageCountLabel" data-l10n-id="pdfjs-document-properties-page-count"></span>
+            <p id="pageCountField" aria-labelledby="pageCountLabel">-</p>
+          </div>
+          <div class="row">
+            <span id="pageSizeLabel" data-l10n-id="pdfjs-document-properties-page-size"></span>
+            <p id="pageSizeField" aria-labelledby="pageSizeLabel">-</p>
+          </div>
+          <div class="separator"></div>
+          <div class="row">
+            <span id="linearizedLabel" data-l10n-id="pdfjs-document-properties-linearized"></span>
+            <p id="linearizedField" aria-labelledby="linearizedLabel">-</p>
+          </div>
+          <div class="buttonRow">
+            <button id="documentPropertiesClose" class="dialogButton" type="button"><span data-l10n-id="pdfjs-document-properties-close-button"></span></button>
+          </div>
+        </dialog>
+        <dialog class="dialog altText" id="altTextDialog" aria-labelledby="dialogLabel" aria-describedby="dialogDescription">
+          <div id="altTextContainer" class="mainContainer">
+            <div id="overallDescription">
+              <span id="dialogLabel" data-l10n-id="pdfjs-editor-alt-text-dialog-label" class="title"></span>
+              <span id="dialogDescription" data-l10n-id="pdfjs-editor-alt-text-dialog-description"></span>
+            </div>
+            <div id="addDescription">
+              <div class="radio">
+                <div class="radioButton">
+                  <input type="radio" id="descriptionButton" name="altTextOption" tabindex="0" aria-describedby="descriptionAreaLabel" checked />
+                  <label for="descriptionButton" data-l10n-id="pdfjs-editor-alt-text-add-description-label"></label>
+                </div>
+                <div class="radioLabel">
+                  <span id="descriptionAreaLabel" data-l10n-id="pdfjs-editor-alt-text-add-description-description"></span>
+                </div>
+              </div>
+              <div class="descriptionArea">
+                <textarea id="descriptionTextarea" aria-labelledby="descriptionAreaLabel" data-l10n-id="pdfjs-editor-alt-text-textarea" tabindex="0"></textarea>
+              </div>
+            </div>
+            <div id="markAsDecorative">
+              <div class="radio">
+                <div class="radioButton">
+                  <input type="radio" id="decorativeButton" name="altTextOption" aria-describedby="decorativeLabel" />
+                  <label for="decorativeButton" data-l10n-id="pdfjs-editor-alt-text-mark-decorative-label"></label>
+                </div>
+                <div class="radioLabel">
+                  <span id="decorativeLabel" data-l10n-id="pdfjs-editor-alt-text-mark-decorative-description"></span>
+                </div>
+              </div>
+            </div>
+            <div id="buttons">
+              <button id="altTextCancel" class="secondaryButton" type="button" tabindex="0">
+                <span data-l10n-id="pdfjs-editor-alt-text-cancel-button"></span>
+              </button>
+              <button id="altTextSave" class="primaryButton" type="button" tabindex="0"><span data-l10n-id="pdfjs-editor-alt-text-save-button"></span></button>
+            </div>
+          </div>
+        </dialog>
+        <dialog class="dialog newAltText" id="newAltTextDialog" aria-labelledby="newAltTextTitle" aria-describedby="newAltTextDescription" tabindex="0">
+          <div id="newAltTextContainer" class="mainContainer">
+            <div class="title">
+              <span id="newAltTextTitle" data-l10n-id="pdfjs-editor-new-alt-text-dialog-edit-label" role="sectionhead" tabindex="0"></span>
+            </div>
+            <div id="mainContent">
+              <div id="descriptionAndSettings">
+                <div id="descriptionInstruction">
+                  <div id="newAltTextDescriptionContainer">
+                    <div class="altTextSpinner" role="status" aria-live="polite"></div>
+                    <textarea
+                      id="newAltTextDescriptionTextarea"
+                      aria-labelledby="descriptionAreaLabel"
+                      data-l10n-id="pdfjs-editor-new-alt-text-textarea"
+                      tabindex="0"
+                    ></textarea>
+                  </div>
+                  <span id="newAltTextDescription" role="note" data-l10n-id="pdfjs-editor-new-alt-text-description"></span>
+                  <div id="newAltTextDisclaimer" role="note">
+                    <div>
+                      <span data-l10n-id="pdfjs-editor-new-alt-text-disclaimer1"></span>
+                      <a
+                        href="https://support.mozilla.org/en-US/kb/pdf-alt-text"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        id="newAltTextLearnMore"
+                        data-l10n-id="pdfjs-editor-new-alt-text-disclaimer-learn-more-url"
+                        tabindex="0"
+                      ></a>
+                    </div>
+                  </div>
+                </div>
+                <div id="newAltTextCreateAutomatically" class="toggler">
+                  <button id="newAltTextCreateAutomaticallyButton" class="toggle-button" type="button" aria-pressed="true" tabindex="0"></button>
+                  <label
+                    for="newAltTextCreateAutomaticallyButton"
+                    class="togglerLabel"
+                    data-l10n-id="pdfjs-editor-new-alt-text-create-automatically-button-label"
+                  ></label>
+                </div>
+                <div id="newAltTextDownloadModel" class="hidden">
+                  <span
+                    id="newAltTextDownloadModelDescription"
+                    data-l10n-id="pdfjs-editor-new-alt-text-ai-model-downloading-progress"
+                    aria-valuemin="0"
+                    data-l10n-args='{ "totalSize": 0, "downloadedSize": 0 }'
+                  ></span>
+                </div>
+              </div>
+              <div id="newAltTextImagePreview"></div>
+            </div>
+            <div id="newAltTextError" class="messageBar">
+              <div>
+                <div>
+                  <span class="title" data-l10n-id="pdfjs-editor-new-alt-text-error-title"></span>
+                  <span class="description" data-l10n-id="pdfjs-editor-new-alt-text-error-description"></span>
+                </div>
+                <button id="newAltTextCloseButton" class="closeButton" type="button" tabindex="0">
+                  <span data-l10n-id="pdfjs-editor-new-alt-text-error-close-button"></span>
+                </button>
+              </div>
+            </div>
+            <div id="newAltTextButtons" class="dialogButtonsGroup">
+              <button id="newAltTextCancel" type="button" class="secondaryButton hidden" tabindex="0">
+                <span data-l10n-id="pdfjs-editor-alt-text-cancel-button"></span>
+              </button>
+              <button id="newAltTextNotNow" type="button" class="secondaryButton" tabindex="0">
+                <span data-l10n-id="pdfjs-editor-new-alt-text-not-now-button"></span>
+              </button>
+              <button id="newAltTextSave" type="button" class="primaryButton" tabindex="0">
+                <span data-l10n-id="pdfjs-editor-alt-text-save-button"></span>
+              </button>
+            </div>
+          </div>
+        </dialog>
+
+        <dialog class="dialog" id="altTextSettingsDialog" aria-labelledby="altTextSettingsTitle">
+          <div id="altTextSettingsContainer" class="mainContainer">
+            <div class="title">
+              <span id="altTextSettingsTitle" data-l10n-id="pdfjs-editor-alt-text-settings-dialog-label" role="sectionhead" tabindex="0" class="title"></span>
+            </div>
+            <div id="automaticAltText">
+              <span data-l10n-id="pdfjs-editor-alt-text-settings-automatic-title"></span>
+              <div id="automaticSettings">
+                <div id="createModelSetting">
+                  <div class="toggler">
+                    <button id="createModelButton" type="button" class="toggle-button" aria-pressed="true" tabindex="0"></button>
+                    <label for="createModelButton" class="togglerLabel" data-l10n-id="pdfjs-editor-alt-text-settings-create-model-button-label"></label>
+                  </div>
+                  <div id="createModelDescription" class="description">
+                    <span data-l10n-id="pdfjs-editor-alt-text-settings-create-model-description"></span>
+                    <a
+                      href="https://support.mozilla.org/en-US/kb/pdf-alt-text"
+                      target="_blank"
+                      rel="noopener noreferrer"
+                      id="altTextSettingsLearnMore"
+                      data-l10n-id="pdfjs-editor-new-alt-text-disclaimer-learn-more-url"
+                      tabindex="0"
+                    ></a>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="dialogSeparator"></div>
+            <div id="altTextEditor">
+              <span data-l10n-id="pdfjs-editor-alt-text-settings-editor-title"></span>
+              <div id="showAltTextEditor">
+                <div class="toggler">
+                  <button id="showAltTextDialogButton" type="button" class="toggle-button" aria-pressed="true" tabindex="0"></button>
+                  <label for="showAltTextDialogButton" class="togglerLabel" data-l10n-id="pdfjs-editor-alt-text-settings-show-dialog-button-label"></label>
+                </div>
+                <div id="showAltTextDialogDescription" class="description">
+                  <span data-l10n-id="pdfjs-editor-alt-text-settings-show-dialog-description"></span>
+                </div>
+              </div>
+            </div>
+            <div id="buttons" class="dialogButtonsGroup">
+              <button id="altTextSettingsCloseButton" type="button" class="primaryButton" tabindex="0">
+                <span data-l10n-id="pdfjs-editor-alt-text-settings-close-button"></span>
+              </button>
+            </div>
+          </div>
+        </dialog>
+
+        <dialog class="dialog signatureDialog" id="addSignatureDialog" aria-labelledby="addSignatureDialogLabel">
+          <span id="addSignatureDialogLabel" data-l10n-id="pdfjs-editor-add-signature-dialog-label"></span>
+          <div id="addSignatureContainer" class="mainContainer">
+            <div class="title">
+              <span role="sectionhead" data-l10n-id="pdfjs-editor-add-signature-dialog-title" tabindex="0"></span>
+            </div>
+            <div role="tablist" id="addSignatureOptions">
+              <button
+                id="addSignatureTypeButton"
+                type="button"
+                role="tab"
+                aria-selected="true"
+                aria-controls="addSignatureTypeContainer"
+                data-l10n-id="pdfjs-editor-add-signature-type-button"
+                tabindex="0"
+              ></button>
+              <button
+                id="addSignatureDrawButton"
+                type="button"
+                role="tab"
+                aria-selected="false"
+                aria-controls="addSignatureDrawContainer"
+                data-l10n-id="pdfjs-editor-add-signature-draw-button"
+                tabindex="0"
+              ></button>
+              <button
+                id="addSignatureImageButton"
+                type="button"
+                role="tab"
+                aria-selected="false"
+                aria-controls="addSignatureImageContainer"
+                data-l10n-id="pdfjs-editor-add-signature-image-button"
+                tabindex="-1"
+              ></button>
+            </div>
+            <div id="addSignatureActionContainer" data-selected="type">
+              <div id="addSignatureTypeContainer" role="tabpanel" aria-labelledby="addSignatureTypeButton">
+                <input id="addSignatureTypeInput" type="text" data-l10n-id="pdfjs-editor-add-signature-type-input" tabindex="0" />
+              </div>
+              <div id="addSignatureDrawContainer" role="tabpanel" aria-labelledby="addSignatureDrawButton" tabindex="-1">
+                <svg id="addSignatureDraw" xmlns="http://www.w3.org/2000/svg" aria-labelledby="addSignatureDrawPlaceholder"></svg>
+                <span id="addSignatureDrawPlaceholder" data-l10n-id="pdfjs-editor-add-signature-draw-placeholder"></span>
+                <div id="thickness">
+                  <div>
+                    <label for="addSignatureDrawThickness" data-l10n-id="pdfjs-editor-add-signature-draw-thickness-range-label"></label>
+                    <input
+                      type="range"
+                      id="addSignatureDrawThickness"
+                      min="1"
+                      max="5"
+                      step="1"
+                      value="1"
+                      data-l10n-id="pdfjs-editor-add-signature-draw-thickness-range"
+                      data-l10n-args='{ "thickness": 1 }'
+                      tabindex="0"
+                    />
+                  </div>
+                </div>
+              </div>
+              <div id="addSignatureImageContainer" role="tabpanel" aria-labelledby="addSignatureImageButton" tabindex="-1">
+                <svg id="addSignatureImage" xmlns="http://www.w3.org/2000/svg" aria-labelledby="addSignatureImagePlaceholder"></svg>
+                <div id="addSignatureImagePlaceholder">
+                  <span data-l10n-id="pdfjs-editor-add-signature-image-placeholder"></span>
+                  <label id="addSignatureImageBrowse" for="addSignatureFilePicker" tabindex="0">
+                    <a data-l10n-id="pdfjs-editor-add-signature-image-browse-link"></a>
+                  </label>
+                  <input id="addSignatureFilePicker" type="file" />
+                </div>
+              </div>
+              <div id="addSignatureControls">
+                <div id="horizontalContainer">
+                  <div id="addSignatureDescriptionContainer">
+                    <label for="addSignatureDescInput" data-l10n-id="pdfjs-editor-add-signature-description-label"></label>
+                    <span id="addSignatureDescription" class="inputWithClearButton">
+                      <input id="addSignatureDescInput" type="text" data-l10n-id="pdfjs-editor-add-signature-description-input" tabindex="0" />
+                      <button class="clearInputButton" type="button" tabindex="0" aria-hidden="true"></button>
+                    </span>
+                  </div>
+                  <button id="clearSignatureButton" type="button" data-l10n-id="pdfjs-editor-add-signature-clear-button" tabindex="0">
+                    <span data-l10n-id="pdfjs-editor-add-signature-clear-button-label"></span>
+                  </button>
+                </div>
+                <div id="addSignatureSaveContainer">
+                  <input type="checkbox" id="addSignatureSaveCheckbox" />
+                  <label for="addSignatureSaveCheckbox" data-l10n-id="pdfjs-editor-add-signature-save-checkbox"></label>
+                  <span></span>
+                  <span id="addSignatureSaveWarning" data-l10n-id="pdfjs-editor-add-signature-save-warning-message"></span>
+                </div>
+              </div>
+              <div id="addSignatureError" hidden="true" class="messageBar">
+                <div>
+                  <div>
+                    <span id="addSignatureErrorTitle" class="title" data-l10n-id="pdfjs-editor-add-signature-image-upload-error-title"></span>
+                    <span id="addSignatureErrorDescription" class="description" data-l10n-id="pdfjs-editor-add-signature-image-upload-error-description"></span>
+                  </div>
+                  <button id="addSignatureErrorCloseButton" class="closeButton" type="button" tabindex="0">
+                    <span data-l10n-id="pdfjs-editor-add-signature-error-close-button"></span>
+                  </button>
+                </div>
+              </div>
+              <div class="dialogButtonsGroup">
+                <button id="addSignatureCancelButton" type="button" class="secondaryButton" tabindex="0">
+                  <span data-l10n-id="pdfjs-editor-add-signature-cancel-button"></span>
+                </button>
+                <button id="addSignatureAddButton" type="button" class="primaryButton" disabled tabindex="0">
+                  <span data-l10n-id="pdfjs-editor-add-signature-add-button"></span>
+                </button>
+              </div>
+            </div>
+          </div>
+        </dialog>
+
+        <dialog class="dialog signatureDialog" id="editSignatureDescriptionDialog" aria-labelledby="editSignatureDescriptionTitle">
+          <div class="mainContainer">
+            <div class="title">
+              <span id="editSignatureDescriptionTitle" role="sectionhead" data-l10n-id="pdfjs-editor-edit-signature-dialog-title" tabindex="0"></span>
+            </div>
+            <div id="editSignatureDescriptionAndView">
+              <div id="editSignatureDescriptionContainer">
+                <label for="editSignatureDescInput" data-l10n-id="pdfjs-editor-add-signature-description-label"></label>
+                <span id="editSignatureDescription" class="inputWithClearButton">
+                  <input id="editSignatureDescInput" type="text" data-l10n-id="pdfjs-editor-add-signature-description-input" tabindex="0" />
+                  <button class="clearInputButton" type="button" tabindex="0" aria-hidden="true"></button>
+                </span>
+              </div>
+              <svg id="editSignatureView" xmlns="http://www.w3.org/2000/svg"></svg>
+            </div>
+            <div class="dialogButtonsGroup">
+              <button id="editSignatureCancelButton" type="button" class="secondaryButton" tabindex="0">
+                <span data-l10n-id="pdfjs-editor-add-signature-cancel-button"></span>
+              </button>
+              <button id="editSignatureUpdateButton" type="button" class="primaryButton" disabled tabindex="0">
+                <span data-l10n-id="pdfjs-editor-edit-signature-update-button"></span>
+              </button>
+            </div>
+          </div>
+        </dialog>
+
+        <dialog class="dialog commentManager" id="commentManagerDialog" aria-labelledby="commentManagerTitle">
+          <div class="mainContainer">
+            <div class="title" id="commentManagerToolbar">
+              <span id="commentManagerTitle" role="sectionhead" data-l10n-id="pdfjs-editor-edit-comment-dialog-title-when-adding"></span>
+            </div>
+            <textarea id="commentManagerTextInput" data-l10n-id="pdfjs-editor-edit-comment-dialog-text-input" tabindex="0"></textarea>
+            <div class="dialogButtonsGroup">
+              <button id="commentManagerCancelButton" type="button" class="secondaryButton" tabindex="0">
+                <span data-l10n-id="pdfjs-editor-edit-comment-dialog-cancel-button"></span>
+              </button>
+              <button id="commentManagerSaveButton" type="button" class="primaryButton" disabled tabindex="0">
+                <span data-l10n-id="pdfjs-editor-edit-comment-dialog-save-button-when-adding"></span>
+              </button>
+            </div>
+          </div>
+        </dialog>
+
+        <dialog id="printServiceDialog">
+          <div class="row">
+            <span data-l10n-id="pdfjs-print-progress-message"></span>
+          </div>
+          <div class="row">
+            <progress value="0" max="100"></progress>
+            <span data-l10n-id="pdfjs-print-progress-percent" data-l10n-args='{ "progress": 0 }' class="relative-progress">0%</span>
+          </div>
+          <div class="buttonRow">
+            <button id="printCancel" class="dialogButton" type="button"><span data-l10n-id="pdfjs-print-progress-close-button"></span></button>
+          </div>
+        </dialog>
+      </div>
+      <!-- dialogContainer -->
+
+      <div id="editorUndoBar" class="messageBar" role="status" aria-labelledby="editorUndoBarMessage" tabindex="-1" hidden>
+        <div>
+          <div>
+            <span id="editorUndoBarMessage" class="description"></span>
+          </div>
+          <button id="editorUndoBarUndoButton" class="undoButton" type="button" tabindex="0" data-l10n-id="pdfjs-editor-undo-bar-undo-button">
+            <span data-l10n-id="pdfjs-editor-undo-bar-undo-button-label"></span>
+          </button>
+          <button id="editorUndoBarCloseButton" class="closeButton" type="button" tabindex="0" data-l10n-id="pdfjs-editor-undo-bar-close-button">
+            <span data-l10n-id="pdfjs-editor-undo-bar-close-button-label"></span>
+          </button>
+        </div>
+      </div>
+      <!-- editorUndoBar -->
+    </div>
+    <!-- outerContainer -->
+    <div id="printContainer"></div>
+  </body>
+</html>
diff --git a/public/pdfjs/web/viewer.mjs b/public/pdfjs/web/viewer.mjs
new file mode 100644
index 0000000..5c619f1
--- /dev/null
+++ b/public/pdfjs/web/viewer.mjs
@@ -0,0 +1,20751 @@
+/**
+ * @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 = 6.1.200
+ * pdfjsBuild = 6353acefe
+ */
+
+;// ./web/ui_utils.js
+const DEFAULT_SCALE_VALUE = "auto";
+const DEFAULT_SCALE = 1.0;
+const DEFAULT_SCALE_DELTA = 1.1;
+const MIN_SCALE = 0.1;
+const MAX_SCALE = 25.0;
+const UNKNOWN_SCALE = 0;
+const MAX_AUTO_SCALE = 1.25;
+const SCROLLBAR_PADDING = 40;
+const VERTICAL_PADDING = 5;
+const PresentationModeState = {
+  UNKNOWN: 0,
+  NORMAL: 1,
+  CHANGING: 2,
+  FULLSCREEN: 3
+};
+const SidebarView = {
+  UNKNOWN: -1,
+  NONE: 0,
+  THUMBS: 1,
+  OUTLINE: 2,
+  ATTACHMENTS: 3,
+  LAYERS: 4
+};
+const TextLayerMode = {
+  DISABLE: 0,
+  ENABLE: 1,
+  ENABLE_PERMISSIONS: 2
+};
+const ScrollMode = {
+  UNKNOWN: -1,
+  VERTICAL: 0,
+  HORIZONTAL: 1,
+  WRAPPED: 2,
+  PAGE: 3
+};
+const SpreadMode = {
+  UNKNOWN: -1,
+  NONE: 0,
+  ODD: 1,
+  EVEN: 2
+};
+const CursorTool = {
+  SELECT: 0,
+  HAND: 1,
+  ZOOM: 2
+};
+const AutoPrintRegExp = /\bprint\s*\(/;
+function scrollIntoView(element, spot) {
+  let parent = element.offsetParent;
+  if (!parent) {
+    console.error("offsetParent is not set -- cannot scroll");
+    return;
+  }
+  let offsetY = element.offsetTop + element.clientTop;
+  let offsetX = element.offsetLeft + element.clientLeft;
+  while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth) {
+    offsetY += parent.offsetTop;
+    offsetX += parent.offsetLeft;
+    parent = parent.offsetParent;
+    if (!parent) {
+      return;
+    }
+  }
+  if (spot) {
+    if (spot.top !== undefined) {
+      offsetY += spot.top;
+    }
+    if (spot.left !== undefined) {
+      offsetX += spot.left;
+      parent.scrollLeft = offsetX;
+    }
+  }
+  parent.scrollTop = offsetY;
+}
+function watchScroll(viewAreaElement, callback, abortSignal = undefined) {
+  const debounceScroll = function (evt) {
+    if (rAF) {
+      return;
+    }
+    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {
+      rAF = null;
+      const currentX = viewAreaElement.scrollLeft;
+      const lastX = state.lastX;
+      if (currentX !== lastX) {
+        state.right = currentX > lastX;
+      }
+      state.lastX = currentX;
+      const currentY = viewAreaElement.scrollTop;
+      const lastY = state.lastY;
+      if (currentY !== lastY) {
+        state.down = currentY > lastY;
+      }
+      state.lastY = currentY;
+      callback(state);
+    });
+  };
+  const state = {
+    right: true,
+    down: true,
+    lastX: viewAreaElement.scrollLeft,
+    lastY: viewAreaElement.scrollTop,
+    _eventHandler: debounceScroll
+  };
+  let rAF = null;
+  viewAreaElement.addEventListener("scroll", debounceScroll, {
+    useCapture: true,
+    signal: abortSignal
+  });
+  abortSignal?.addEventListener("abort", () => window.cancelAnimationFrame(rAF), {
+    once: true
+  });
+  return state;
+}
+function parseQueryString(query) {
+  const params = new Map();
+  for (const [key, value] of new URLSearchParams(query)) {
+    params.set(key.toLowerCase(), value);
+  }
+  return params;
+}
+const InvisibleCharsRegExp = /[\x00-\x1F]/g;
+function removeNullCharacters(str, replaceInvisible = false) {
+  if (!InvisibleCharsRegExp.test(str)) {
+    return str;
+  }
+  if (replaceInvisible) {
+    return str.replaceAll(InvisibleCharsRegExp, m => m === "\x00" ? "" : " ");
+  }
+  return str.replaceAll("\x00", "");
+}
+function binarySearchFirstItem(items, condition, start = 0) {
+  let minIndex = start;
+  let maxIndex = items.length - 1;
+  if (maxIndex < 0 || !condition(items[maxIndex])) {
+    return items.length;
+  }
+  if (condition(items[minIndex])) {
+    return minIndex;
+  }
+  while (minIndex < maxIndex) {
+    const currentIndex = minIndex + maxIndex >> 1;
+    const currentItem = items[currentIndex];
+    if (condition(currentItem)) {
+      maxIndex = currentIndex;
+    } else {
+      minIndex = currentIndex + 1;
+    }
+  }
+  return minIndex;
+}
+function approximateFraction(x) {
+  if (Math.floor(x) === x) {
+    return [x, 1];
+  }
+  const xinv = 1 / x;
+  const limit = 8;
+  if (xinv > limit) {
+    return [1, limit];
+  } else if (Math.floor(xinv) === xinv) {
+    return [1, xinv];
+  }
+  const x_ = x > 1 ? xinv : x;
+  let a = 0,
+    b = 1,
+    c = 1,
+    d = 1;
+  while (true) {
+    const p = a + c,
+      q = b + d;
+    if (q > limit) {
+      break;
+    }
+    if (x_ <= p / q) {
+      c = p;
+      d = q;
+    } else {
+      a = p;
+      b = q;
+    }
+  }
+  if (x_ - a / b < c / d - x_) {
+    return x_ === x ? [a, b] : [b, a];
+  }
+  return x_ === x ? [c, d] : [d, c];
+}
+function floorToDivide(x, div) {
+  return x - x % div;
+}
+function getPageSizeInches({
+  view,
+  userUnit,
+  rotate
+}) {
+  const [x1, y1, x2, y2] = view;
+  const changeOrientation = rotate % 180 !== 0;
+  const width = (x2 - x1) / 72 * userUnit;
+  const height = (y2 - y1) / 72 * userUnit;
+  return {
+    width: changeOrientation ? height : width,
+    height: changeOrientation ? width : height
+  };
+}
+function backtrackBeforeAllVisibleElements(index, views, top) {
+  if (index < 2) {
+    return index;
+  }
+  let elt = views[index].div;
+  let pageTop = elt.offsetTop + elt.clientTop;
+  if (pageTop >= top) {
+    elt = views[index - 1].div;
+    pageTop = elt.offsetTop + elt.clientTop;
+  }
+  for (let i = index - 2; i >= 0; --i) {
+    elt = views[i].div;
+    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {
+      break;
+    }
+    index = i;
+  }
+  return index;
+}
+function getVisibleElements({
+  scrollEl,
+  views,
+  sortByVisibility = false,
+  horizontal = false,
+  rtl = false
+}) {
+  const top = scrollEl.scrollTop,
+    bottom = top + scrollEl.clientHeight;
+  const left = scrollEl.scrollLeft,
+    right = left + scrollEl.clientWidth;
+  function isElementBottomAfterViewTop(view) {
+    const element = view.div;
+    const elementBottom = element.offsetTop + element.clientTop + element.clientHeight;
+    return elementBottom > top;
+  }
+  function isElementNextAfterViewHorizontally(view) {
+    const element = view.div;
+    const elementLeft = element.offsetLeft + element.clientLeft;
+    const elementRight = elementLeft + element.clientWidth;
+    return rtl ? elementLeft < right : elementRight > left;
+  }
+  const visible = [],
+    ids = new Set(),
+    numViews = views.length;
+  let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop);
+  if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) {
+    firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);
+  }
+  let lastEdge = horizontal ? right : -1;
+  for (let i = firstVisibleElementInd; i < numViews; i++) {
+    const view = views[i],
+      element = view.div;
+    const currentWidth = element.offsetLeft + element.clientLeft;
+    const currentHeight = element.offsetTop + element.clientTop;
+    const viewWidth = element.clientWidth,
+      viewHeight = element.clientHeight;
+    const viewRight = currentWidth + viewWidth;
+    const viewBottom = currentHeight + viewHeight;
+    if (lastEdge === -1) {
+      if (viewBottom >= bottom) {
+        lastEdge = viewBottom;
+      }
+    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {
+      break;
+    }
+    if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) {
+      continue;
+    }
+    const minY = Math.max(0, top - currentHeight);
+    const minX = Math.max(0, left - currentWidth);
+    const hiddenHeight = minY + Math.max(0, viewBottom - bottom);
+    const hiddenWidth = minX + Math.max(0, viewRight - right);
+    const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,
+      fractionWidth = (viewWidth - hiddenWidth) / viewWidth;
+    const percent = fractionHeight * fractionWidth * 100 | 0;
+    visible.push({
+      id: view.id,
+      x: currentWidth,
+      y: currentHeight,
+      visibleArea: percent === 100 ? null : {
+        minX,
+        minY,
+        maxX: Math.min(viewRight, right) - currentWidth,
+        maxY: Math.min(viewBottom, bottom) - currentHeight
+      },
+      view,
+      percent,
+      widthPercent: fractionWidth * 100 | 0
+    });
+    ids.add(view.id);
+  }
+  const first = visible[0],
+    last = visible.at(-1);
+  if (sortByVisibility) {
+    visible.sort(function (a, b) {
+      const pc = a.percent - b.percent;
+      if (Math.abs(pc) > 0.001) {
+        return -pc;
+      }
+      return a.id - b.id;
+    });
+  }
+  return {
+    first,
+    last,
+    views: visible,
+    ids
+  };
+}
+function normalizeWheelEventDirection(evt) {
+  let delta = Math.hypot(evt.deltaX, evt.deltaY);
+  const angle = Math.atan2(evt.deltaY, evt.deltaX);
+  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {
+    delta = -delta;
+  }
+  return delta;
+}
+function normalizeWheelEventDelta(evt) {
+  const deltaMode = evt.deltaMode;
+  let delta = normalizeWheelEventDirection(evt);
+  const MOUSE_PIXELS_PER_LINE = 30;
+  const MOUSE_LINES_PER_PAGE = 30;
+  if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) {
+    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;
+  } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) {
+    delta /= MOUSE_LINES_PER_PAGE;
+  }
+  return delta;
+}
+function isValidRotation(angle) {
+  return Number.isInteger(angle) && angle % 90 === 0;
+}
+function isValidScrollMode(mode) {
+  return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;
+}
+function isValidSpreadMode(mode) {
+  return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;
+}
+function isPortraitOrientation(size) {
+  return size.width <= size.height;
+}
+const animationStarted = new Promise(function (resolve) {
+  window.requestAnimationFrame(resolve);
+});
+const docStyle = document.documentElement.style;
+class ProgressBar {
+  #classList = null;
+  #disableAutoFetchTimeout = null;
+  #percent = 0;
+  #style = null;
+  #visible = true;
+  constructor(bar) {
+    this.#classList = bar.classList;
+    this.#style = bar.style;
+  }
+  get percent() {
+    return this.#percent;
+  }
+  set percent(val) {
+    this.#percent = val;
+    if (isNaN(val)) {
+      this.#classList.add("indeterminate");
+      return;
+    }
+    this.#classList.remove("indeterminate");
+    this.#style.setProperty("--progressBar-percent", `${this.#percent}%`);
+  }
+  setWidth(viewer) {
+    if (!viewer) {
+      return;
+    }
+    const container = viewer.parentNode;
+    const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;
+    if (scrollbarWidth > 0) {
+      this.#style.setProperty("--progressBar-end-offset", `${scrollbarWidth}px`);
+    }
+  }
+  setDisableAutoFetch(delay = 5000) {
+    if (this.#percent === 100 || isNaN(this.#percent)) {
+      return;
+    }
+    if (this.#disableAutoFetchTimeout) {
+      clearTimeout(this.#disableAutoFetchTimeout);
+    }
+    this.show();
+    this.#disableAutoFetchTimeout = setTimeout(() => {
+      this.#disableAutoFetchTimeout = null;
+      this.hide();
+    }, delay);
+  }
+  hide() {
+    if (!this.#visible) {
+      return;
+    }
+    this.#visible = false;
+    this.#classList.add("hidden");
+  }
+  show() {
+    if (this.#visible) {
+      return;
+    }
+    this.#visible = true;
+    this.#classList.remove("hidden");
+  }
+}
+function getActiveOrFocusedElement() {
+  let curRoot = document;
+  let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus");
+  while (curActiveOrFocused?.shadowRoot) {
+    curRoot = curActiveOrFocused.shadowRoot;
+    curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus");
+  }
+  return curActiveOrFocused;
+}
+function apiPageLayoutToViewerModes(layout) {
+  let scrollMode = ScrollMode.VERTICAL,
+    spreadMode = SpreadMode.NONE;
+  switch (layout) {
+    case "SinglePage":
+      scrollMode = ScrollMode.PAGE;
+      break;
+    case "OneColumn":
+      break;
+    case "TwoPageLeft":
+      scrollMode = ScrollMode.PAGE;
+    case "TwoColumnLeft":
+      spreadMode = SpreadMode.ODD;
+      break;
+    case "TwoPageRight":
+      scrollMode = ScrollMode.PAGE;
+    case "TwoColumnRight":
+      spreadMode = SpreadMode.EVEN;
+      break;
+  }
+  return {
+    scrollMode,
+    spreadMode
+  };
+}
+function apiPageModeToSidebarView(mode) {
+  switch (mode) {
+    case "UseNone":
+      return SidebarView.NONE;
+    case "UseThumbs":
+      return SidebarView.THUMBS;
+    case "UseOutlines":
+      return SidebarView.OUTLINE;
+    case "UseAttachments":
+      return SidebarView.ATTACHMENTS;
+    case "UseOC":
+      return SidebarView.LAYERS;
+  }
+  return SidebarView.NONE;
+}
+function toggleCheckedBtn(button, toggle, view = null) {
+  button.classList.toggle("toggled", toggle);
+  button.setAttribute("aria-checked", toggle);
+  view?.classList.toggle("hidden", !toggle);
+}
+function toggleSelectedBtn(button, toggle, view = null) {
+  button.classList.toggle("selected", toggle);
+  button.setAttribute("aria-selected", toggle);
+  view?.classList.toggle("hidden", !toggle);
+}
+function toggleExpandedBtn(button, toggle, view = null) {
+  button.classList.toggle("toggled", toggle);
+  button.setAttribute("aria-expanded", toggle);
+  view?.classList.toggle("hidden", !toggle);
+}
+const calcRound = function () {
+  const e = document.createElement("div");
+  e.style.width = "round(down, calc(1.6666666666666665 * 792px), 1px)";
+  return e.style.width === "calc(1320px)" ? Math.fround : x => x;
+}();
+
+;// ./web/app_options.js
+{
+  var compatParams = new Map();
+  const {
+    maxTouchPoints,
+    platform,
+    userAgent
+  } = navigator;
+  const isAndroid = /Android/.test(userAgent);
+  const isIOS = /\b(?:iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1;
+  if (isIOS || isAndroid) {
+    compatParams.set("maxCanvasPixels", 5242880);
+  }
+  if (isAndroid) {
+    compatParams.set("useSystemFonts", false);
+  }
+}
+const OptionKind = {
+  BROWSER: 0x01,
+  VIEWER: 0x02,
+  API: 0x04,
+  WORKER: 0x08,
+  EVENT_DISPATCH: 0x10,
+  PREFERENCE: 0x80
+};
+const Type = {
+  BOOLEAN: 0x01,
+  NUMBER: 0x02,
+  OBJECT: 0x04,
+  STRING: 0x08,
+  UNDEFINED: 0x10
+};
+const defaultOptions = {
+  allowedGlobalEvents: {
+    value: null,
+    kind: OptionKind.BROWSER
+  },
+  canvasMaxAreaInBytes: {
+    value: -1,
+    kind: OptionKind.BROWSER + OptionKind.API
+  },
+  isInAutomation: {
+    value: false,
+    kind: OptionKind.BROWSER
+  },
+  localeProperties: {
+    value: {
+      lang: navigator.language || "en-US"
+    },
+    kind: OptionKind.BROWSER
+  },
+  maxCanvasDim: {
+    value: 32767,
+    kind: OptionKind.BROWSER + OptionKind.VIEWER
+  },
+  nimbusDataStr: {
+    value: "",
+    kind: OptionKind.BROWSER
+  },
+  supportsCaretBrowsingMode: {
+    value: false,
+    kind: OptionKind.BROWSER
+  },
+  supportsDocumentFonts: {
+    value: true,
+    kind: OptionKind.BROWSER
+  },
+  supportsDownloading: {
+    value: true,
+    kind: OptionKind.BROWSER
+  },
+  supportsIntegratedFind: {
+    value: false,
+    kind: OptionKind.BROWSER
+  },
+  supportsMouseWheelZoomCtrlKey: {
+    value: true,
+    kind: OptionKind.BROWSER
+  },
+  supportsMouseWheelZoomMetaKey: {
+    value: true,
+    kind: OptionKind.BROWSER
+  },
+  supportsPinchToZoom: {
+    value: true,
+    kind: OptionKind.BROWSER
+  },
+  supportsPrinting: {
+    value: true,
+    kind: OptionKind.BROWSER
+  },
+  toolbarDensity: {
+    value: 0,
+    kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH
+  },
+  altTextLearnMoreUrl: {
+    value: "",
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  annotationEditorMode: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  annotationMode: {
+    value: 2,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  capCanvasAreaFactor: {
+    value: 200,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  commentLearnMoreUrl: {
+    value: "",
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  cursorToolOnLoad: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  debuggerSrc: {
+    value: "./debugger.mjs",
+    kind: OptionKind.VIEWER
+  },
+  defaultZoomDelay: {
+    value: 400,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  defaultZoomValue: {
+    value: "",
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  disableHistory: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  disablePageLabels: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableAltText: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableAltTextModelDownload: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH
+  },
+  enableAutoLinking: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableComment: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableDetailCanvas: {
+    value: true,
+    kind: OptionKind.VIEWER
+  },
+  enableGuessAltText: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH
+  },
+  enableHighlightFloatingButton: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableMerge: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableNewAltTextWhenAddingImage: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableNewBadge: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableOptimizedPartialRendering: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enablePermissions: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enablePrintAutoRotate: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableScripting: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableSignatureEditor: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableSplitMerge: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  enableUpdatedAddImage: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  externalLinkRel: {
+    value: "noopener noreferrer nofollow",
+    kind: OptionKind.VIEWER
+  },
+  externalLinkTarget: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  highlightEditorColors: {
+    value: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F," + "yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043",
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  historyUpdateUrl: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  ignoreDestinationZoom: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  imageResourcesPath: {
+    value: "./images/",
+    kind: OptionKind.VIEWER
+  },
+  enableSelectionRendering: {
+    value: true,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  imagesRightClickMinSize: {
+    value: -1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  maxCanvasPixels: {
+    value: 2 ** 25,
+    kind: OptionKind.VIEWER
+  },
+  minDurationToUpdateCanvas: {
+    value: 500,
+    kind: OptionKind.VIEWER
+  },
+  forcePageColors: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  pageColorsBackground: {
+    value: "Canvas",
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  pageColorsForeground: {
+    value: "CanvasText",
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  pdfBugEnabled: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  postMessageAfterPrintCallback: {
+    value: false,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  printResolution: {
+    value: 150,
+    kind: OptionKind.VIEWER
+  },
+  sidebarViewOnLoad: {
+    value: -1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  scrollModeOnLoad: {
+    value: -1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  spreadModeOnLoad: {
+    value: -1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  textLayerMode: {
+    value: 1,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  viewerCssTheme: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  viewOnLoad: {
+    value: 0,
+    kind: OptionKind.VIEWER + OptionKind.PREFERENCE
+  },
+  cMapPacked: {
+    value: true,
+    kind: OptionKind.API
+  },
+  cMapUrl: {
+    value: "../web/cmaps/",
+    kind: OptionKind.API
+  },
+  disableAutoFetch: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  disableFontFace: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  disableRange: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  disableStream: {
+    value: false,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  docBaseUrl: {
+    value: "",
+    kind: OptionKind.API
+  },
+  enableHWA: {
+    value: true,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  enableWebGPU: {
+    value: true,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  enableXfa: {
+    value: true,
+    kind: OptionKind.API + OptionKind.PREFERENCE
+  },
+  fontExtraProperties: {
+    value: false,
+    kind: OptionKind.API
+  },
+  iccUrl: {
+    value: "../web/iccs/",
+    kind: OptionKind.API
+  },
+  isOffscreenCanvasSupported: {
+    value: true,
+    kind: OptionKind.API
+  },
+  maxImageSize: {
+    value: -1,
+    kind: OptionKind.API
+  },
+  pdfBug: {
+    value: false,
+    kind: OptionKind.API
+  },
+  standardFontDataUrl: {
+    value: "../web/standard_fonts/",
+    kind: OptionKind.API
+  },
+  useSystemFonts: {
+    value: undefined,
+    kind: OptionKind.API,
+    type: Type.BOOLEAN + Type.UNDEFINED
+  },
+  verbosity: {
+    value: 1,
+    kind: OptionKind.API
+  },
+  wasmUrl: {
+    value: "../web/wasm/",
+    kind: OptionKind.API
+  },
+  workerPort: {
+    value: null,
+    kind: OptionKind.WORKER
+  },
+  workerSrc: {
+    value: "../build/pdf.worker.mjs",
+    kind: OptionKind.WORKER
+  }
+};
+{
+  defaultOptions.defaultUrl = {
+    value: "compressed.tracemonkey-pldi-09.pdf",
+    kind: OptionKind.VIEWER
+  };
+  defaultOptions.sandboxBundleSrc = {
+    value: "../build/pdf.sandbox.mjs",
+    kind: OptionKind.VIEWER
+  };
+  defaultOptions.enableFakeMLManager = {
+    value: true,
+    kind: OptionKind.VIEWER
+  };
+}
+{
+  defaultOptions.disablePreferences = {
+    value: false,
+    kind: OptionKind.VIEWER
+  };
+}
+class AppOptions {
+  static eventBus;
+  static #opts = new Map();
+  static {
+    for (const name in defaultOptions) {
+      this.#opts.set(name, defaultOptions[name].value);
+    }
+    for (const [name, value] of compatParams) {
+      this.#opts.set(name, value);
+    }
+    this._hasInvokedSet = false;
+    this._checkDisablePreferences = () => {
+      if (this.get("disablePreferences")) {
+        return true;
+      }
+      if (this._hasInvokedSet) {
+        console.warn("The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option to prevent that.');
+      }
+      return false;
+    };
+  }
+  static get(name) {
+    return this.#opts.get(name);
+  }
+  static getAll(kind = null, defaultOnly = false) {
+    const options = Object.create(null);
+    for (const name in defaultOptions) {
+      const defaultOpt = defaultOptions[name];
+      if (kind && !(kind & defaultOpt.kind)) {
+        continue;
+      }
+      options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value;
+    }
+    return options;
+  }
+  static set(name, value) {
+    this.setAll({
+      [name]: value
+    });
+  }
+  static setAll(options, prefs = false) {
+    this._hasInvokedSet ||= true;
+    let events;
+    for (const name in options) {
+      const defaultOpt = defaultOptions[name],
+        userOpt = options[name];
+      if (!defaultOpt || !(typeof userOpt === typeof defaultOpt.value || Type[(typeof userOpt).toUpperCase()] & defaultOpt.type)) {
+        continue;
+      }
+      const {
+        kind
+      } = defaultOpt;
+      if (prefs && !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)) {
+        continue;
+      }
+      if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) {
+        (events ||= new Map()).set(name, userOpt);
+      }
+      this.#opts.set(name, userOpt);
+    }
+    if (events) {
+      for (const [name, value] of events) {
+        this.eventBus.dispatch(name.toLowerCase(), {
+          source: this,
+          value
+        });
+      }
+    }
+  }
+}
+
+;// ./web/pdfjs.js
+const {
+  AbortException,
+  AnnotationEditorLayer,
+  AnnotationEditorParamsType,
+  AnnotationEditorType,
+  AnnotationEditorUIManager,
+  AnnotationLayer,
+  AnnotationMode,
+  AnnotationType,
+  applyOpacity,
+  build,
+  ColorPicker,
+  createValidAbsoluteUrl,
+  CSSConstants,
+  DOMSVGFactory,
+  DrawLayer,
+  FeatureTest,
+  fetchData,
+  findContrastColor,
+  getDocument,
+  getFilenameFromUrl,
+  getPdfFilenameFromUrl,
+  getRGB,
+  getRGBA,
+  getUuid,
+  GlobalWorkerOptions,
+  ImageKind,
+  InvalidPDFException,
+  isDataScheme,
+  isPdfFile,
+  isValidExplicitDest,
+  makeArr,
+  makeMap,
+  makeObj,
+  MathClamp,
+  noContextMenu,
+  normalizeUnicode,
+  OPS,
+  OutputScale,
+  PasswordException,
+  PasswordResponses,
+  PDFDataRangeTransport,
+  PDFDateString,
+  PDFWorker,
+  PermissionFlag,
+  PixelsPerInch,
+  RenderingCancelledException,
+  renderRichText,
+  ResponseException,
+  setLayerDimensions,
+  shadow,
+  SignatureExtractor,
+  stopEvent,
+  SupportedImageMimeTypes,
+  TextLayer,
+  TextLayerImages,
+  TouchManager,
+  updateUrlHash,
+  Util,
+  VerbosityLevel,
+  version,
+  XfaLayer
+} = globalThis.pdfjsLib;
+
+;// ./web/internal_evt.js
+const INTERNAL_EVT = "d3d019bf-c73b-49f4-94f3-e62eb099fd62";
+const internalOpt = Object.freeze({
+  internal: INTERNAL_EVT
+});
+
+;// ./web/pdf_link_service.js
+
+
+
+const DEFAULT_LINK_REL = "noopener noreferrer nofollow";
+const LinkTarget = {
+  NONE: 0,
+  SELF: 1,
+  BLANK: 2,
+  PARENT: 3,
+  TOP: 4
+};
+class PDFLinkService {
+  externalLinkEnabled = true;
+  constructor({
+    eventBus,
+    externalLinkTarget = null,
+    externalLinkRel = null,
+    ignoreDestinationZoom = false
+  } = {}) {
+    this.eventBus = eventBus;
+    this.externalLinkTarget = externalLinkTarget;
+    this.externalLinkRel = externalLinkRel;
+    this._ignoreDestinationZoom = ignoreDestinationZoom;
+    this.baseUrl = null;
+    this.pdfDocument = null;
+    this.pdfViewer = null;
+    this.pdfHistory = null;
+  }
+  setDocument(pdfDocument, baseUrl = null) {
+    this.baseUrl = baseUrl;
+    this.pdfDocument = pdfDocument;
+  }
+  setViewer(pdfViewer) {
+    this.pdfViewer = pdfViewer;
+  }
+  setHistory(pdfHistory) {
+    this.pdfHistory = pdfHistory;
+  }
+  get pagesCount() {
+    return this.pdfDocument?.pagesMapper.pagesNumber || 0;
+  }
+  get page() {
+    return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1;
+  }
+  set page(value) {
+    if (this.pdfDocument) {
+      this.pdfViewer.currentPageNumber = value;
+    }
+  }
+  get rotation() {
+    return this.pdfDocument ? this.pdfViewer.pagesRotation : 0;
+  }
+  set rotation(value) {
+    if (this.pdfDocument) {
+      this.pdfViewer.pagesRotation = value;
+    }
+  }
+  get isInPresentationMode() {
+    return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false;
+  }
+  async goToDestination(dest) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    let namedDest, explicitDest, pageNumber;
+    if (typeof dest === "string") {
+      namedDest = dest;
+      explicitDest = await this.pdfDocument.getDestination(dest);
+    } else {
+      namedDest = null;
+      explicitDest = await dest;
+    }
+    if (!Array.isArray(explicitDest)) {
+      console.error(`goToDestination: "${explicitDest}" is not a valid destination array, for dest="${dest}".`);
+      return;
+    }
+    const [destRef] = explicitDest;
+    if (destRef && typeof destRef === "object") {
+      pageNumber = this.pdfDocument.cachedPageNumber(destRef);
+      if (!pageNumber) {
+        try {
+          pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1;
+        } catch {
+          console.error(`goToDestination: "${destRef}" is not a valid page reference, for dest="${dest}".`);
+          return;
+        }
+      }
+    } else if (Number.isInteger(destRef)) {
+      pageNumber = destRef + 1;
+    }
+    if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {
+      console.error(`goToDestination: "${pageNumber}" is not a valid page number, for dest="${dest}".`);
+      return;
+    }
+    if (this.pdfHistory) {
+      this.pdfHistory.pushCurrentPosition();
+      this.pdfHistory.push({
+        namedDest,
+        explicitDest,
+        pageNumber
+      });
+    }
+    this.pdfViewer.scrollPageIntoView({
+      pageNumber,
+      destArray: explicitDest,
+      ignoreDestinationZoom: this._ignoreDestinationZoom
+    });
+    const ac = new AbortController();
+    this.eventBus.on("textlayerrendered", evt => {
+      if (evt.pageNumber === pageNumber) {
+        evt.source.textLayer.div.focus();
+        ac.abort();
+      }
+    }, {
+      signal: ac.signal,
+      ...internalOpt
+    });
+  }
+  goToPage(val) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0;
+    if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) {
+      console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`);
+      return;
+    }
+    if (this.pdfHistory) {
+      this.pdfHistory.pushCurrentPosition();
+      this.pdfHistory.pushPage(pageNumber);
+    }
+    this.pdfViewer.scrollPageIntoView({
+      pageNumber
+    });
+  }
+  goToXY(pageNumber, x, y, options = {}) {
+    this.pdfViewer.scrollPageIntoView({
+      pageNumber,
+      destArray: [null, {
+        name: "XYZ"
+      }, x, y],
+      ignoreDestinationZoom: true,
+      ...options
+    });
+  }
+  async getAttachmentContent(id) {
+    try {
+      return await this.pdfDocument?.getAttachmentContent(id);
+    } catch (error) {
+      if (!(error instanceof PasswordException)) {
+        console.warn(`Unable to load attachment content: ${error}`);
+      }
+    }
+    return null;
+  }
+  addLinkAttributes(link, url, newWindow = false) {
+    if (!url || typeof url !== "string") {
+      throw new Error('A valid "url" parameter must provided.');
+    }
+    const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget,
+      rel = this.externalLinkRel;
+    let displayUrl = url;
+    const parsedUrl = URL.parse(url);
+    if (parsedUrl?.username || parsedUrl?.password) {
+      parsedUrl.username = parsedUrl.password = "";
+      displayUrl = parsedUrl.href;
+    }
+    if (this.externalLinkEnabled) {
+      link.href = url;
+      link.title = displayUrl;
+    } else {
+      link.href = "";
+      link.title = `Disabled: ${displayUrl}`;
+      link.onclick = () => false;
+    }
+    let targetStr = "";
+    switch (target) {
+      case LinkTarget.NONE:
+        break;
+      case LinkTarget.SELF:
+        targetStr = "_self";
+        break;
+      case LinkTarget.BLANK:
+        targetStr = "_blank";
+        break;
+      case LinkTarget.PARENT:
+        targetStr = "_parent";
+        break;
+      case LinkTarget.TOP:
+        targetStr = "_top";
+        break;
+    }
+    link.target = targetStr;
+    link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL;
+  }
+  getDestinationHash(dest) {
+    if (typeof dest === "string") {
+      if (dest.length > 0) {
+        return this.getAnchorUrl("#" + escape(dest));
+      }
+    } else if (Array.isArray(dest)) {
+      const str = JSON.stringify(dest);
+      if (str.length > 0) {
+        return this.getAnchorUrl("#" + escape(str));
+      }
+    }
+    return this.getAnchorUrl("");
+  }
+  getAnchorUrl(anchor) {
+    return this.baseUrl ? this.baseUrl + anchor : anchor;
+  }
+  setHash(hash) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    let pageNumber, dest;
+    if (hash.includes("=")) {
+      const params = parseQueryString(hash);
+      if (params.has("search")) {
+        const query = params.get("search").replaceAll('"', ""),
+          phrase = params.get("phrase") === "true";
+        this.eventBus.dispatch("findfromurlhash", {
+          source: this,
+          query: phrase ? query : query.match(/\S+/g)
+        });
+      }
+      if (params.has("page")) {
+        pageNumber = params.get("page") | 0 || 1;
+      }
+      if (params.has("zoom")) {
+        const zoomArgs = params.get("zoom").split(",");
+        const zoomArg = zoomArgs[0];
+        const zoomArgNumber = parseFloat(zoomArg);
+        if (!zoomArg.includes("Fit")) {
+          dest = [null, {
+            name: "XYZ"
+          }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];
+        } else if (zoomArg === "Fit" || zoomArg === "FitB") {
+          dest = [null, {
+            name: zoomArg
+          }];
+        } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") {
+          dest = [null, {
+            name: zoomArg
+          }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];
+        } else if (zoomArg === "FitR") {
+          if (zoomArgs.length !== 5) {
+            console.error('PDFLinkService.setHash: Not enough parameters for "FitR".');
+          } else {
+            dest = [null, {
+              name: zoomArg
+            }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];
+          }
+        } else {
+          console.error(`PDFLinkService.setHash: "${zoomArg}" is not a valid zoom value.`);
+        }
+      }
+      if (dest) {
+        this.pdfViewer.scrollPageIntoView({
+          pageNumber: pageNumber || this.page,
+          destArray: dest,
+          allowNegativeOffset: true
+        });
+      } else if (pageNumber) {
+        this.page = pageNumber;
+      }
+      if (params.has("pagemode")) {
+        this.eventBus.dispatch("pagemode", {
+          source: this,
+          mode: params.get("pagemode")
+        });
+      }
+      if (params.has("nameddest")) {
+        this.goToDestination(params.get("nameddest"));
+      }
+      return;
+    }
+    dest = unescape(hash);
+    try {
+      dest = JSON.parse(dest);
+      if (!Array.isArray(dest)) {
+        dest = dest.toString();
+      }
+    } catch {}
+    if (typeof dest === "string" || isValidExplicitDest(dest)) {
+      this.goToDestination(dest);
+      return;
+    }
+    console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`);
+  }
+  executeNamedAction(action) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    switch (action) {
+      case "GoBack":
+        this.pdfHistory?.back();
+        break;
+      case "GoForward":
+        this.pdfHistory?.forward();
+        break;
+      case "NextPage":
+        this.pdfViewer.nextPage();
+        break;
+      case "PrevPage":
+        this.pdfViewer.previousPage();
+        break;
+      case "LastPage":
+        this.page = this.pagesCount;
+        break;
+      case "FirstPage":
+        this.page = 1;
+        break;
+      default:
+        break;
+    }
+    this.eventBus.dispatch("namedaction", {
+      source: this,
+      action
+    });
+  }
+  async executeSetOCGState(action) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    const pdfDocument = this.pdfDocument,
+      optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise;
+    if (pdfDocument !== this.pdfDocument) {
+      return;
+    }
+    optionalContentConfig.setOCGState(action);
+    this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig);
+  }
+}
+class SimpleLinkService extends PDFLinkService {
+  setDocument(pdfDocument, baseUrl = null) {}
+}
+
+;// ./web/event_utils.js
+
+const WaitOnType = {
+  EVENT: "event",
+  TIMEOUT: "timeout"
+};
+async function waitOnEventOrTimeout({
+  target,
+  name,
+  delay = 0
+}) {
+  if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) {
+    throw new Error("waitOnEventOrTimeout - invalid parameters.");
+  }
+  const {
+    promise,
+    resolve
+  } = Promise.withResolvers();
+  const ac = new AbortController();
+  function handler(type) {
+    ac.abort();
+    clearTimeout(timeout);
+    resolve(type);
+  }
+  const evtMethod = target instanceof EventBus ? "on" : "addEventListener";
+  const evtOpts = target instanceof EventBus ? {
+    signal: ac.signal,
+    ...internalOpt
+  } : {
+    signal: ac.signal
+  };
+  target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), evtOpts);
+  const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay);
+  return promise;
+}
+class EventBus {
+  #listeners = Object.create(null);
+  constructor() {
+    Object.seal(this);
+  }
+  on(eventName, listener, options = null) {
+    let rmAbort = null;
+    if (options?.signal instanceof AbortSignal) {
+      const {
+        signal
+      } = options;
+      if (signal.aborted) {
+        console.error("Cannot use an `aborted` signal.");
+        return;
+      }
+      const onAbort = () => this.off(eventName, listener);
+      rmAbort = () => signal.removeEventListener("abort", onAbort);
+      signal.addEventListener("abort", onAbort);
+    }
+    const eventListeners = this.#listeners[eventName] ??= [];
+    eventListeners.push({
+      listener,
+      internal: options?.internal === INTERNAL_EVT,
+      once: options?.once === true,
+      rmAbort
+    });
+  }
+  off(eventName, listener, options = null) {
+    const eventListeners = this.#listeners[eventName];
+    if (!eventListeners) {
+      return;
+    }
+    for (let i = 0, ii = eventListeners.length; i < ii; i++) {
+      const evt = eventListeners[i];
+      if (evt.listener === listener) {
+        evt.rmAbort?.();
+        eventListeners.splice(i, 1);
+        return;
+      }
+    }
+  }
+  dispatch(eventName, data) {
+    const eventListeners = this.#listeners[eventName];
+    if (!eventListeners?.length) {
+      return;
+    }
+    let extListeners;
+    for (const {
+      listener,
+      internal,
+      once
+    } of eventListeners.slice(0)) {
+      if (once) {
+        this.off(eventName, listener);
+      }
+      if (!internal) {
+        (extListeners ??= []).push(listener);
+        continue;
+      }
+      listener(data);
+    }
+    if (extListeners) {
+      for (const listener of extListeners) {
+        listener(data);
+      }
+    }
+  }
+}
+class FirefoxEventBus extends EventBus {
+  #externalServices;
+  #globalEventNames;
+  #isInAutomation;
+  constructor(globalEventNames, externalServices, isInAutomation) {
+    super();
+    this.#globalEventNames = globalEventNames;
+    this.#externalServices = externalServices;
+    this.#isInAutomation = isInAutomation;
+  }
+  dispatch(eventName, data) {
+    throw new Error("Not implemented: FirefoxEventBus.dispatch");
+  }
+}
+
+;// ./web/external_services.js
+class BaseExternalServices {
+  updateFindControlState(data) {}
+  updateFindMatchesCount(data) {}
+  initPassiveLoading() {}
+  reportTelemetry(data) {}
+  reportText(data) {}
+  async createL10n() {
+    throw new Error("Not implemented: createL10n");
+  }
+  createScripting() {
+    throw new Error("Not implemented: createScripting");
+  }
+  createSignatureStorage() {
+    throw new Error("Not implemented: createSignatureStorage");
+  }
+  updateEditorStates(data) {
+    throw new Error("Not implemented: updateEditorStates");
+  }
+  dispatchGlobalEvent(_event) {}
+}
+
+;// ./web/preferences.js
+
+class BasePreferences {
+  #defaults = Object.freeze(AppOptions.getAll(OptionKind.PREFERENCE, true));
+  #initializedPromise = null;
+  constructor() {
+    this.#initializedPromise = this._readFromStorage(this.#defaults).then(({
+      browserPrefs,
+      prefs
+    }) => {
+      if (AppOptions._checkDisablePreferences()) {
+        return;
+      }
+      AppOptions.setAll({
+        ...browserPrefs,
+        ...prefs
+      }, true);
+    });
+  }
+  async _writeToStorage(prefObj) {
+    throw new Error("Not implemented: _writeToStorage");
+  }
+  async _readFromStorage(prefObj) {
+    throw new Error("Not implemented: _readFromStorage");
+  }
+  async reset() {
+    await this.#initializedPromise;
+    AppOptions.setAll(this.#defaults, true);
+    await this._writeToStorage(this.#defaults);
+  }
+  async set(name, value) {
+    await this.#initializedPromise;
+    AppOptions.setAll({
+      [name]: value
+    }, true);
+    await this._writeToStorage(AppOptions.getAll(OptionKind.PREFERENCE));
+  }
+  async get(name) {
+    await this.#initializedPromise;
+    return AppOptions.get(name);
+  }
+  get defaults() {
+    return this.#defaults;
+  }
+  get initializedPromise() {
+    return this.#initializedPromise;
+  }
+}
+
+;// ./node_modules/@fluent/bundle/esm/types.js
+class FluentType {
+  constructor(value) {
+    this.value = value;
+  }
+  valueOf() {
+    return this.value;
+  }
+}
+class FluentNone extends FluentType {
+  constructor(value = "???") {
+    super(value);
+  }
+  toString(scope) {
+    return `{${this.value}}`;
+  }
+}
+class FluentNumber extends FluentType {
+  constructor(value, opts = {}) {
+    super(value);
+    this.opts = opts;
+  }
+  toString(scope) {
+    if (scope) {
+      try {
+        const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts);
+        return nf.format(this.value);
+      } catch (err) {
+        scope.reportError(err);
+      }
+    }
+    return this.value.toString(10);
+  }
+}
+class FluentDateTime extends FluentType {
+  static supportsValue(value) {
+    if (typeof value === "number") return true;
+    if (value instanceof Date) return true;
+    if (value instanceof FluentType) return FluentDateTime.supportsValue(value.valueOf());
+    if ("Temporal" in globalThis) {
+      const _Temporal = globalThis.Temporal;
+      if (value instanceof _Temporal.Instant || value instanceof _Temporal.PlainDateTime || value instanceof _Temporal.PlainDate || value instanceof _Temporal.PlainMonthDay || value instanceof _Temporal.PlainTime || value instanceof _Temporal.PlainYearMonth) {
+        return true;
+      }
+    }
+    return false;
+  }
+  constructor(value, opts = {}) {
+    if (value instanceof FluentDateTime) {
+      opts = {
+        ...value.opts,
+        ...opts
+      };
+      value = value.value;
+    } else if (value instanceof FluentType) {
+      value = value.valueOf();
+    }
+    if (typeof value === "object" && "calendarId" in value && opts.calendar === undefined) {
+      opts = {
+        ...opts,
+        calendar: value.calendarId
+      };
+    }
+    super(value);
+    this.opts = opts;
+  }
+  [Symbol.toPrimitive](hint) {
+    return hint === "string" ? this.toString() : this.toNumber();
+  }
+  toNumber() {
+    const value = this.value;
+    if (typeof value === "number") return value;
+    if (value instanceof Date) return value.getTime();
+    if ("epochMilliseconds" in value) {
+      return value.epochMilliseconds;
+    }
+    if ("toZonedDateTime" in value) {
+      return value.toZonedDateTime("UTC").epochMilliseconds;
+    }
+    throw new TypeError("Unwrapping a non-number value as a number");
+  }
+  toString(scope) {
+    if (scope) {
+      try {
+        const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts);
+        return dtf.format(this.value);
+      } catch (err) {
+        scope.reportError(err);
+      }
+    }
+    if (typeof this.value === "number" || this.value instanceof Date) {
+      return new Date(this.value).toISOString();
+    }
+    return this.value.toString();
+  }
+}
+;// ./node_modules/@fluent/bundle/esm/resolver.js
+
+const MAX_PLACEABLES = 100;
+const FSI = "\u2068";
+const PDI = "\u2069";
+function match(scope, selector, key) {
+  if (key === selector) {
+    return true;
+  }
+  if (key instanceof FluentNumber && selector instanceof FluentNumber && key.value === selector.value) {
+    return true;
+  }
+  if (selector instanceof FluentNumber && typeof key === "string") {
+    let category = scope.memoizeIntlObject(Intl.PluralRules, selector.opts).select(selector.value);
+    if (key === category) {
+      return true;
+    }
+  }
+  return false;
+}
+function getDefault(scope, variants, star) {
+  if (variants[star]) {
+    return resolvePattern(scope, variants[star].value);
+  }
+  scope.reportError(new RangeError("No default"));
+  return new FluentNone();
+}
+function getArguments(scope, args) {
+  const positional = [];
+  const named = Object.create(null);
+  for (const arg of args) {
+    if (arg.type === "narg") {
+      named[arg.name] = resolveExpression(scope, arg.value);
+    } else {
+      positional.push(resolveExpression(scope, arg));
+    }
+  }
+  return {
+    positional,
+    named
+  };
+}
+function resolveExpression(scope, expr) {
+  switch (expr.type) {
+    case "str":
+      return expr.value;
+    case "num":
+      return new FluentNumber(expr.value, {
+        minimumFractionDigits: expr.precision
+      });
+    case "var":
+      return resolveVariableReference(scope, expr);
+    case "mesg":
+      return resolveMessageReference(scope, expr);
+    case "term":
+      return resolveTermReference(scope, expr);
+    case "func":
+      return resolveFunctionReference(scope, expr);
+    case "select":
+      return resolveSelectExpression(scope, expr);
+    default:
+      return new FluentNone();
+  }
+}
+function resolveVariableReference(scope, {
+  name
+}) {
+  let arg;
+  if (scope.params) {
+    if (Object.prototype.hasOwnProperty.call(scope.params, name)) {
+      arg = scope.params[name];
+    } else {
+      return new FluentNone(`$${name}`);
+    }
+  } else if (scope.args && Object.prototype.hasOwnProperty.call(scope.args, name)) {
+    arg = scope.args[name];
+  } else {
+    scope.reportError(new ReferenceError(`Unknown variable: $${name}`));
+    return new FluentNone(`$${name}`);
+  }
+  if (arg instanceof FluentType) {
+    return arg;
+  }
+  switch (typeof arg) {
+    case "string":
+      return arg;
+    case "number":
+      return new FluentNumber(arg);
+    case "object":
+      if (FluentDateTime.supportsValue(arg)) {
+        return new FluentDateTime(arg);
+      }
+    default:
+      scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`));
+      return new FluentNone(`$${name}`);
+  }
+}
+function resolveMessageReference(scope, {
+  name,
+  attr
+}) {
+  const message = scope.bundle._messages.get(name);
+  if (!message) {
+    scope.reportError(new ReferenceError(`Unknown message: ${name}`));
+    return new FluentNone(name);
+  }
+  if (attr) {
+    const attribute = message.attributes[attr];
+    if (attribute) {
+      return resolvePattern(scope, attribute);
+    }
+    scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));
+    return new FluentNone(`${name}.${attr}`);
+  }
+  if (message.value) {
+    return resolvePattern(scope, message.value);
+  }
+  scope.reportError(new ReferenceError(`No value: ${name}`));
+  return new FluentNone(name);
+}
+function resolveTermReference(scope, {
+  name,
+  attr,
+  args
+}) {
+  const id = `-${name}`;
+  const term = scope.bundle._terms.get(id);
+  if (!term) {
+    scope.reportError(new ReferenceError(`Unknown term: ${id}`));
+    return new FluentNone(id);
+  }
+  if (attr) {
+    const attribute = term.attributes[attr];
+    if (attribute) {
+      scope.params = getArguments(scope, args).named;
+      const resolved = resolvePattern(scope, attribute);
+      scope.params = null;
+      return resolved;
+    }
+    scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));
+    return new FluentNone(`${id}.${attr}`);
+  }
+  scope.params = getArguments(scope, args).named;
+  const resolved = resolvePattern(scope, term.value);
+  scope.params = null;
+  return resolved;
+}
+function resolveFunctionReference(scope, {
+  name,
+  args
+}) {
+  let func = scope.bundle._functions[name];
+  if (!func) {
+    scope.reportError(new ReferenceError(`Unknown function: ${name}()`));
+    return new FluentNone(`${name}()`);
+  }
+  if (typeof func !== "function") {
+    scope.reportError(new TypeError(`Function ${name}() is not callable`));
+    return new FluentNone(`${name}()`);
+  }
+  try {
+    let resolved = getArguments(scope, args);
+    return func(resolved.positional, resolved.named);
+  } catch (err) {
+    scope.reportError(err);
+    return new FluentNone(`${name}()`);
+  }
+}
+function resolveSelectExpression(scope, {
+  selector,
+  variants,
+  star
+}) {
+  let sel = resolveExpression(scope, selector);
+  if (sel instanceof FluentNone) {
+    return getDefault(scope, variants, star);
+  }
+  for (const variant of variants) {
+    const key = resolveExpression(scope, variant.key);
+    if (match(scope, sel, key)) {
+      return resolvePattern(scope, variant.value);
+    }
+  }
+  return getDefault(scope, variants, star);
+}
+function resolveComplexPattern(scope, ptn) {
+  if (scope.dirty.has(ptn)) {
+    scope.reportError(new RangeError("Cyclic reference"));
+    return new FluentNone();
+  }
+  scope.dirty.add(ptn);
+  const result = [];
+  const useIsolating = scope.bundle._useIsolating && ptn.length > 1;
+  for (const elem of ptn) {
+    if (typeof elem === "string") {
+      result.push(scope.bundle._transform(elem));
+      continue;
+    }
+    scope.placeables++;
+    if (scope.placeables > MAX_PLACEABLES) {
+      scope.dirty.delete(ptn);
+      throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` + `max allowed is ${MAX_PLACEABLES}`);
+    }
+    if (useIsolating) {
+      result.push(FSI);
+    }
+    result.push(resolveExpression(scope, elem).toString(scope));
+    if (useIsolating) {
+      result.push(PDI);
+    }
+  }
+  scope.dirty.delete(ptn);
+  return result.join("");
+}
+function resolvePattern(scope, value) {
+  if (typeof value === "string") {
+    return scope.bundle._transform(value);
+  }
+  return resolveComplexPattern(scope, value);
+}
+;// ./node_modules/@fluent/bundle/esm/scope.js
+class Scope {
+  constructor(bundle, errors, args) {
+    this.dirty = new WeakSet();
+    this.params = null;
+    this.placeables = 0;
+    this.bundle = bundle;
+    this.errors = errors;
+    this.args = args;
+  }
+  reportError(error) {
+    if (!this.errors || !(error instanceof Error)) {
+      throw error;
+    }
+    this.errors.push(error);
+  }
+  memoizeIntlObject(ctor, opts) {
+    let cache = this.bundle._intls.get(ctor);
+    if (!cache) {
+      cache = {};
+      this.bundle._intls.set(ctor, cache);
+    }
+    let id = JSON.stringify(opts);
+    if (!cache[id]) {
+      cache[id] = new ctor(this.bundle.locales, opts);
+    }
+    return cache[id];
+  }
+}
+;// ./node_modules/@fluent/bundle/esm/builtins.js
+
+function values(opts, allowed) {
+  const unwrapped = Object.create(null);
+  for (const [name, opt] of Object.entries(opts)) {
+    if (allowed.includes(name)) {
+      unwrapped[name] = opt.valueOf();
+    }
+  }
+  return unwrapped;
+}
+const NUMBER_ALLOWED = ["unitDisplay", "currencyDisplay", "useGrouping", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits"];
+function NUMBER(args, opts) {
+  let arg = args[0];
+  if (arg instanceof FluentNone) {
+    return new FluentNone(`NUMBER(${arg.valueOf()})`);
+  }
+  if (arg instanceof FluentNumber) {
+    return new FluentNumber(arg.valueOf(), {
+      ...arg.opts,
+      ...values(opts, NUMBER_ALLOWED)
+    });
+  }
+  if (arg instanceof FluentDateTime) {
+    return new FluentNumber(arg.toNumber(), {
+      ...values(opts, NUMBER_ALLOWED)
+    });
+  }
+  throw new TypeError("Invalid argument to NUMBER");
+}
+const DATETIME_ALLOWED = ["dateStyle", "timeStyle", "fractionalSecondDigits", "dayPeriod", "hour12", "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName"];
+function DATETIME(args, opts) {
+  let arg = args[0];
+  if (arg instanceof FluentNone) {
+    return new FluentNone(`DATETIME(${arg.valueOf()})`);
+  }
+  if (arg instanceof FluentDateTime || arg instanceof FluentNumber) {
+    return new FluentDateTime(arg, values(opts, DATETIME_ALLOWED));
+  }
+  throw new TypeError("Invalid argument to DATETIME");
+}
+;// ./node_modules/@fluent/bundle/esm/memoizer.js
+const cache = new Map();
+function getMemoizerForLocale(locales) {
+  const stringLocale = Array.isArray(locales) ? locales.join(" ") : locales;
+  let memoizer = cache.get(stringLocale);
+  if (memoizer === undefined) {
+    memoizer = new Map();
+    cache.set(stringLocale, memoizer);
+  }
+  return memoizer;
+}
+;// ./node_modules/@fluent/bundle/esm/bundle.js
+
+
+
+
+
+class FluentBundle {
+  constructor(locales, {
+    functions,
+    useIsolating = true,
+    transform = v => v
+  } = {}) {
+    this._terms = new Map();
+    this._messages = new Map();
+    this.locales = Array.isArray(locales) ? locales : [locales];
+    this._functions = {
+      NUMBER: NUMBER,
+      DATETIME: DATETIME,
+      ...functions
+    };
+    this._useIsolating = useIsolating;
+    this._transform = transform;
+    this._intls = getMemoizerForLocale(locales);
+  }
+  hasMessage(id) {
+    return this._messages.has(id);
+  }
+  getMessage(id) {
+    return this._messages.get(id);
+  }
+  addResource(res, {
+    allowOverrides = false
+  } = {}) {
+    const errors = [];
+    for (let i = 0; i < res.body.length; i++) {
+      let entry = res.body[i];
+      if (entry.id.startsWith("-")) {
+        if (allowOverrides === false && this._terms.has(entry.id)) {
+          errors.push(new Error(`Attempt to override an existing term: "${entry.id}"`));
+          continue;
+        }
+        this._terms.set(entry.id, entry);
+      } else {
+        if (allowOverrides === false && this._messages.has(entry.id)) {
+          errors.push(new Error(`Attempt to override an existing message: "${entry.id}"`));
+          continue;
+        }
+        this._messages.set(entry.id, entry);
+      }
+    }
+    return errors;
+  }
+  formatPattern(pattern, args = null, errors = null) {
+    if (typeof pattern === "string") {
+      return this._transform(pattern);
+    }
+    let scope = new Scope(this, errors, args);
+    try {
+      let value = resolveComplexPattern(scope, pattern);
+      return value.toString(scope);
+    } catch (err) {
+      if (scope.errors && err instanceof Error) {
+        scope.errors.push(err);
+        return new FluentNone().toString(scope);
+      }
+      throw err;
+    }
+  }
+}
+;// ./node_modules/@fluent/bundle/esm/resource.js
+const RE_MESSAGE_START = /^(-?[a-zA-Z][\w-]*) *= */gm;
+const RE_ATTRIBUTE_START = /\.([a-zA-Z][\w-]*) *= */y;
+const RE_VARIANT_START = /\*?\[/y;
+const RE_NUMBER_LITERAL = /(-?[0-9]+(?:\.([0-9]+))?)/y;
+const RE_IDENTIFIER = /([a-zA-Z][\w-]*)/y;
+const RE_REFERENCE = /([$-])?([a-zA-Z][\w-]*)(?:\.([a-zA-Z][\w-]*))?/y;
+const RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/;
+const RE_TEXT_RUN = /([^{}\n\r]+)/y;
+const RE_STRING_RUN = /([^\\"\n\r]*)/y;
+const RE_STRING_ESCAPE = /\\([\\"])/y;
+const RE_UNICODE_ESCAPE = /\\u([a-fA-F0-9]{4})|\\U([a-fA-F0-9]{6})/y;
+const RE_LEADING_NEWLINES = /^\n+/;
+const RE_TRAILING_SPACES = / +$/;
+const RE_BLANK_LINES = / *\r?\n/g;
+const RE_INDENT = /( *)$/;
+const TOKEN_BRACE_OPEN = /{\s*/y;
+const TOKEN_BRACE_CLOSE = /\s*}/y;
+const TOKEN_BRACKET_OPEN = /\[\s*/y;
+const TOKEN_BRACKET_CLOSE = /\s*] */y;
+const TOKEN_PAREN_OPEN = /\s*\(\s*/y;
+const TOKEN_ARROW = /\s*->\s*/y;
+const TOKEN_COLON = /\s*:\s*/y;
+const TOKEN_COMMA = /\s*,?\s*/y;
+const TOKEN_BLANK = /\s+/y;
+class FluentResource {
+  constructor(source) {
+    this.body = [];
+    RE_MESSAGE_START.lastIndex = 0;
+    let cursor = 0;
+    while (true) {
+      let next = RE_MESSAGE_START.exec(source);
+      if (next === null) {
+        break;
+      }
+      cursor = RE_MESSAGE_START.lastIndex;
+      try {
+        this.body.push(parseMessage(next[1]));
+      } catch (err) {
+        if (err instanceof SyntaxError) {
+          continue;
+        }
+        throw err;
+      }
+    }
+    function test(re) {
+      re.lastIndex = cursor;
+      return re.test(source);
+    }
+    function consumeChar(char, errorClass) {
+      if (source[cursor] === char) {
+        cursor++;
+        return true;
+      }
+      if (errorClass) {
+        throw new errorClass(`Expected ${char}`);
+      }
+      return false;
+    }
+    function consumeToken(re, errorClass) {
+      if (test(re)) {
+        cursor = re.lastIndex;
+        return true;
+      }
+      if (errorClass) {
+        throw new errorClass(`Expected ${re.toString()}`);
+      }
+      return false;
+    }
+    function match(re) {
+      re.lastIndex = cursor;
+      let result = re.exec(source);
+      if (result === null) {
+        throw new SyntaxError(`Expected ${re.toString()}`);
+      }
+      cursor = re.lastIndex;
+      return result;
+    }
+    function match1(re) {
+      return match(re)[1];
+    }
+    function parseMessage(id) {
+      let value = parsePattern();
+      let attributes = parseAttributes();
+      if (value === null && Object.keys(attributes).length === 0) {
+        throw new SyntaxError("Expected message value or attributes");
+      }
+      return {
+        id,
+        value,
+        attributes
+      };
+    }
+    function parseAttributes() {
+      let attrs = Object.create(null);
+      while (test(RE_ATTRIBUTE_START)) {
+        let name = match1(RE_ATTRIBUTE_START);
+        let value = parsePattern();
+        if (value === null) {
+          throw new SyntaxError("Expected attribute value");
+        }
+        attrs[name] = value;
+      }
+      return attrs;
+    }
+    function parsePattern() {
+      let first;
+      if (test(RE_TEXT_RUN)) {
+        first = match1(RE_TEXT_RUN);
+      }
+      if (source[cursor] === "{" || source[cursor] === "}") {
+        return parsePatternElements(first ? [first] : [], Infinity);
+      }
+      let indent = parseIndent();
+      if (indent) {
+        if (first) {
+          return parsePatternElements([first, indent], indent.length);
+        }
+        indent.value = trim(indent.value, RE_LEADING_NEWLINES);
+        return parsePatternElements([indent], indent.length);
+      }
+      if (first) {
+        return trim(first, RE_TRAILING_SPACES);
+      }
+      return null;
+    }
+    function parsePatternElements(elements = [], commonIndent) {
+      while (true) {
+        if (test(RE_TEXT_RUN)) {
+          elements.push(match1(RE_TEXT_RUN));
+          continue;
+        }
+        if (source[cursor] === "{") {
+          elements.push(parsePlaceable());
+          continue;
+        }
+        if (source[cursor] === "}") {
+          throw new SyntaxError("Unbalanced closing brace");
+        }
+        let indent = parseIndent();
+        if (indent) {
+          elements.push(indent);
+          commonIndent = Math.min(commonIndent, indent.length);
+          continue;
+        }
+        break;
+      }
+      let lastIndex = elements.length - 1;
+      let lastElement = elements[lastIndex];
+      if (typeof lastElement === "string") {
+        elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES);
+      }
+      let baked = [];
+      for (let element of elements) {
+        if (element instanceof Indent) {
+          element = element.value.slice(0, element.value.length - commonIndent);
+        }
+        if (element) {
+          baked.push(element);
+        }
+      }
+      return baked;
+    }
+    function parsePlaceable() {
+      consumeToken(TOKEN_BRACE_OPEN, SyntaxError);
+      let selector = parseInlineExpression();
+      if (consumeToken(TOKEN_BRACE_CLOSE)) {
+        return selector;
+      }
+      if (consumeToken(TOKEN_ARROW)) {
+        let variants = parseVariants();
+        consumeToken(TOKEN_BRACE_CLOSE, SyntaxError);
+        return {
+          type: "select",
+          selector,
+          ...variants
+        };
+      }
+      throw new SyntaxError("Unclosed placeable");
+    }
+    function parseInlineExpression() {
+      if (source[cursor] === "{") {
+        return parsePlaceable();
+      }
+      if (test(RE_REFERENCE)) {
+        let [, sigil, name, attr = null] = match(RE_REFERENCE);
+        if (sigil === "$") {
+          return {
+            type: "var",
+            name
+          };
+        }
+        if (consumeToken(TOKEN_PAREN_OPEN)) {
+          let args = parseArguments();
+          if (sigil === "-") {
+            return {
+              type: "term",
+              name,
+              attr,
+              args
+            };
+          }
+          if (RE_FUNCTION_NAME.test(name)) {
+            return {
+              type: "func",
+              name,
+              args
+            };
+          }
+          throw new SyntaxError("Function names must be all upper-case");
+        }
+        if (sigil === "-") {
+          return {
+            type: "term",
+            name,
+            attr,
+            args: []
+          };
+        }
+        return {
+          type: "mesg",
+          name,
+          attr
+        };
+      }
+      return parseLiteral();
+    }
+    function parseArguments() {
+      let args = [];
+      while (true) {
+        switch (source[cursor]) {
+          case ")":
+            cursor++;
+            return args;
+          case undefined:
+            throw new SyntaxError("Unclosed argument list");
+        }
+        args.push(parseArgument());
+        consumeToken(TOKEN_COMMA);
+      }
+    }
+    function parseArgument() {
+      let expr = parseInlineExpression();
+      if (expr.type !== "mesg") {
+        return expr;
+      }
+      if (consumeToken(TOKEN_COLON)) {
+        return {
+          type: "narg",
+          name: expr.name,
+          value: parseLiteral()
+        };
+      }
+      return expr;
+    }
+    function parseVariants() {
+      let variants = [];
+      let count = 0;
+      let star;
+      while (test(RE_VARIANT_START)) {
+        if (consumeChar("*")) {
+          star = count;
+        }
+        let key = parseVariantKey();
+        let value = parsePattern();
+        if (value === null) {
+          throw new SyntaxError("Expected variant value");
+        }
+        variants[count++] = {
+          key,
+          value
+        };
+      }
+      if (count === 0) {
+        return null;
+      }
+      if (star === undefined) {
+        throw new SyntaxError("Expected default variant");
+      }
+      return {
+        variants,
+        star
+      };
+    }
+    function parseVariantKey() {
+      consumeToken(TOKEN_BRACKET_OPEN, SyntaxError);
+      let key;
+      if (test(RE_NUMBER_LITERAL)) {
+        key = parseNumberLiteral();
+      } else {
+        key = {
+          type: "str",
+          value: match1(RE_IDENTIFIER)
+        };
+      }
+      consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError);
+      return key;
+    }
+    function parseLiteral() {
+      if (test(RE_NUMBER_LITERAL)) {
+        return parseNumberLiteral();
+      }
+      if (source[cursor] === '"') {
+        return parseStringLiteral();
+      }
+      throw new SyntaxError("Invalid expression");
+    }
+    function parseNumberLiteral() {
+      let [, value, fraction = ""] = match(RE_NUMBER_LITERAL);
+      let precision = fraction.length;
+      return {
+        type: "num",
+        value: parseFloat(value),
+        precision
+      };
+    }
+    function parseStringLiteral() {
+      consumeChar('"', SyntaxError);
+      let value = "";
+      while (true) {
+        value += match1(RE_STRING_RUN);
+        if (source[cursor] === "\\") {
+          value += parseEscapeSequence();
+          continue;
+        }
+        if (consumeChar('"')) {
+          return {
+            type: "str",
+            value
+          };
+        }
+        throw new SyntaxError("Unclosed string literal");
+      }
+    }
+    function parseEscapeSequence() {
+      if (test(RE_STRING_ESCAPE)) {
+        return match1(RE_STRING_ESCAPE);
+      }
+      if (test(RE_UNICODE_ESCAPE)) {
+        let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE);
+        let codepoint = parseInt(codepoint4 || codepoint6, 16);
+        return codepoint <= 0xd7ff || 0xe000 <= codepoint ? String.fromCodePoint(codepoint) : "锟�";
+      }
+      throw new SyntaxError("Unknown escape sequence");
+    }
+    function parseIndent() {
+      let start = cursor;
+      consumeToken(TOKEN_BLANK);
+      switch (source[cursor]) {
+        case ".":
+        case "[":
+        case "*":
+        case "}":
+        case undefined:
+          return false;
+        case "{":
+          return makeIndent(source.slice(start, cursor));
+      }
+      if (source[cursor - 1] === " ") {
+        return makeIndent(source.slice(start, cursor));
+      }
+      return false;
+    }
+    function trim(text, re) {
+      return text.replace(re, "");
+    }
+    function makeIndent(blank) {
+      let value = blank.replace(RE_BLANK_LINES, "\n");
+      let length = RE_INDENT.exec(blank)[1].length;
+      return new Indent(value, length);
+    }
+  }
+}
+class Indent {
+  constructor(value, length) {
+    this.value = value;
+    this.length = length;
+  }
+}
+;// ./node_modules/@fluent/bundle/esm/index.js
+
+
+
+;// ./node_modules/@fluent/dom/esm/overlay.js
+const reOverlay = /<|&#?\w+;/;
+const TEXT_LEVEL_ELEMENTS = {
+  "http://www.w3.org/1999/xhtml": ["em", "strong", "small", "s", "cite", "q", "dfn", "abbr", "data", "time", "code", "var", "samp", "kbd", "sub", "sup", "i", "b", "u", "mark", "bdi", "bdo", "span", "br", "wbr"]
+};
+const LOCALIZABLE_ATTRIBUTES = {
+  "http://www.w3.org/1999/xhtml": {
+    global: ["title", "aria-description", "aria-label", "aria-valuetext"],
+    a: ["download"],
+    area: ["download", "alt"],
+    input: ["alt", "placeholder"],
+    menuitem: ["label"],
+    menu: ["label"],
+    optgroup: ["label"],
+    option: ["label"],
+    track: ["label"],
+    img: ["alt"],
+    textarea: ["placeholder"],
+    th: ["abbr"]
+  },
+  "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul": {
+    global: ["accesskey", "aria-label", "aria-valuetext", "label", "title", "tooltiptext"],
+    description: ["value"],
+    key: ["key", "keycode"],
+    label: ["value"],
+    textbox: ["placeholder", "value"]
+  }
+};
+function translateElement(element, translation) {
+  const {
+    value
+  } = translation;
+  if (typeof value === "string") {
+    if (element.localName === "title" && element.namespaceURI === "http://www.w3.org/1999/xhtml") {
+      element.textContent = value;
+    } else if (!reOverlay.test(value)) {
+      element.textContent = value;
+    } else {
+      const templateElement = element.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml", "template");
+      templateElement.innerHTML = value;
+      overlayChildNodes(templateElement.content, element);
+    }
+  }
+  overlayAttributes(translation, element);
+}
+function overlayChildNodes(fromFragment, toElement) {
+  for (const childNode of fromFragment.childNodes) {
+    if (childNode.nodeType === childNode.TEXT_NODE) {
+      continue;
+    }
+    if (childNode.hasAttribute("data-l10n-name")) {
+      const sanitized = getNodeForNamedElement(toElement, childNode);
+      fromFragment.replaceChild(sanitized, childNode);
+      continue;
+    }
+    if (isElementAllowed(childNode)) {
+      const sanitized = createSanitizedElement(childNode);
+      fromFragment.replaceChild(sanitized, childNode);
+      continue;
+    }
+    console.warn(`An element of forbidden type "${childNode.localName}" was found in ` + "the translation. Only safe text-level elements and elements with " + "data-l10n-name are allowed.");
+    fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode);
+  }
+  toElement.textContent = "";
+  toElement.appendChild(fromFragment);
+}
+function hasAttribute(attributes, name) {
+  if (!attributes) {
+    return false;
+  }
+  for (let attr of attributes) {
+    if (attr.name === name) {
+      return true;
+    }
+  }
+  return false;
+}
+function overlayAttributes(fromElement, toElement) {
+  const explicitlyAllowed = toElement.hasAttribute("data-l10n-attrs") ? toElement.getAttribute("data-l10n-attrs").split(",").map(i => i.trim()) : null;
+  for (const attr of Array.from(toElement.attributes)) {
+    if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && !hasAttribute(fromElement.attributes, attr.name)) {
+      toElement.removeAttribute(attr.name);
+    }
+  }
+  if (!fromElement.attributes) {
+    return;
+  }
+  for (const attr of Array.from(fromElement.attributes)) {
+    if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && toElement.getAttribute(attr.name) !== attr.value) {
+      toElement.setAttribute(attr.name, attr.value);
+    }
+  }
+}
+function getNodeForNamedElement(sourceElement, translatedChild) {
+  const childName = translatedChild.getAttribute("data-l10n-name");
+  const sourceChild = sourceElement.querySelector(`[data-l10n-name="${childName}"]`);
+  if (!sourceChild) {
+    console.warn(`An element named "${childName}" wasn't found in the source.`);
+    return createTextNodeFromTextContent(translatedChild);
+  }
+  if (sourceChild.localName !== translatedChild.localName) {
+    console.warn(`An element named "${childName}" was found in the translation ` + `but its type ${translatedChild.localName} didn't match the ` + `element found in the source (${sourceChild.localName}).`);
+    return createTextNodeFromTextContent(translatedChild);
+  }
+  sourceElement.removeChild(sourceChild);
+  const clone = sourceChild.cloneNode(false);
+  return shallowPopulateUsing(translatedChild, clone);
+}
+function createSanitizedElement(element) {
+  const clone = element.ownerDocument.createElement(element.localName);
+  return shallowPopulateUsing(element, clone);
+}
+function createTextNodeFromTextContent(element) {
+  return element.ownerDocument.createTextNode(element.textContent);
+}
+function isElementAllowed(element) {
+  const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI];
+  return allowed && allowed.includes(element.localName);
+}
+function isAttrNameLocalizable(name, element, explicitlyAllowed = null) {
+  if (explicitlyAllowed && explicitlyAllowed.includes(name)) {
+    return true;
+  }
+  const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI];
+  if (!allowed) {
+    return false;
+  }
+  const attrName = name.toLowerCase();
+  const elemName = element.localName;
+  if (allowed.global.includes(attrName)) {
+    return true;
+  }
+  if (!allowed[elemName]) {
+    return false;
+  }
+  if (allowed[elemName].includes(attrName)) {
+    return true;
+  }
+  if (element.namespaceURI === "http://www.w3.org/1999/xhtml" && elemName === "input" && attrName === "value") {
+    const type = element.type.toLowerCase();
+    if (type === "submit" || type === "button" || type === "reset") {
+      return true;
+    }
+  }
+  return false;
+}
+function shallowPopulateUsing(fromElement, toElement) {
+  toElement.textContent = fromElement.textContent;
+  overlayAttributes(fromElement, toElement);
+  return toElement;
+}
+;// ./node_modules/cached-iterable/src/cached_iterable.mjs
+class CachedIterable extends Array {
+  static from(iterable) {
+    if (iterable instanceof this) {
+      return iterable;
+    }
+    return new this(iterable);
+  }
+}
+;// ./node_modules/cached-iterable/src/cached_sync_iterable.mjs
+
+class CachedSyncIterable extends CachedIterable {
+  constructor(iterable) {
+    super();
+    if (Symbol.iterator in Object(iterable)) {
+      this.iterator = iterable[Symbol.iterator]();
+    } else {
+      throw new TypeError("Argument must implement the iteration protocol.");
+    }
+  }
+  [Symbol.iterator]() {
+    const cached = this;
+    let cur = 0;
+    return {
+      next() {
+        if (cached.length <= cur) {
+          cached.push(cached.iterator.next());
+        }
+        return cached[cur++];
+      }
+    };
+  }
+  touchNext(count = 1) {
+    let idx = 0;
+    while (idx++ < count) {
+      const last = this[this.length - 1];
+      if (last && last.done) {
+        break;
+      }
+      this.push(this.iterator.next());
+    }
+    return this[this.length - 1];
+  }
+}
+;// ./node_modules/cached-iterable/src/cached_async_iterable.mjs
+
+class CachedAsyncIterable extends CachedIterable {
+  constructor(iterable) {
+    super();
+    if (Symbol.asyncIterator in Object(iterable)) {
+      this.iterator = iterable[Symbol.asyncIterator]();
+    } else if (Symbol.iterator in Object(iterable)) {
+      this.iterator = iterable[Symbol.iterator]();
+    } else {
+      throw new TypeError("Argument must implement the iteration protocol.");
+    }
+  }
+  [Symbol.asyncIterator]() {
+    const cached = this;
+    let cur = 0;
+    return {
+      async next() {
+        if (cached.length <= cur) {
+          cached.push(cached.iterator.next());
+        }
+        return cached[cur++];
+      }
+    };
+  }
+  async touchNext(count = 1) {
+    let idx = 0;
+    while (idx++ < count) {
+      const last = this[this.length - 1];
+      if (last && (await last).done) {
+        break;
+      }
+      this.push(this.iterator.next());
+    }
+    return this[this.length - 1];
+  }
+}
+;// ./node_modules/cached-iterable/src/index.mjs
+
+
+;// ./node_modules/@fluent/dom/esm/localization.js
+
+class Localization {
+  constructor(resourceIds = [], generateBundles) {
+    this.resourceIds = resourceIds;
+    this.generateBundles = generateBundles;
+    this.onChange(true);
+  }
+  addResourceIds(resourceIds, eager = false) {
+    this.resourceIds.push(...resourceIds);
+    this.onChange(eager);
+    return this.resourceIds.length;
+  }
+  removeResourceIds(resourceIds) {
+    this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r));
+    this.onChange();
+    return this.resourceIds.length;
+  }
+  async formatWithFallback(keys, method) {
+    const translations = [];
+    let hasAtLeastOneBundle = false;
+    for await (const bundle of this.bundles) {
+      hasAtLeastOneBundle = true;
+      const missingIds = keysFromBundle(method, bundle, keys, translations);
+      if (missingIds.size === 0) {
+        break;
+      }
+      if (typeof console !== "undefined") {
+        const locale = bundle.locales[0];
+        const ids = Array.from(missingIds).join(", ");
+        console.warn(`[fluent] Missing translations in ${locale}: ${ids}`);
+      }
+    }
+    if (!hasAtLeastOneBundle && typeof console !== "undefined") {
+      console.warn(`[fluent] Request for keys failed because no resource bundles got generated.
+  keys: ${JSON.stringify(keys)}.
+  resourceIds: ${JSON.stringify(this.resourceIds)}.`);
+    }
+    return translations;
+  }
+  formatMessages(keys) {
+    return this.formatWithFallback(keys, messageFromBundle);
+  }
+  formatValues(keys) {
+    return this.formatWithFallback(keys, valueFromBundle);
+  }
+  async formatValue(id, args) {
+    const [val] = await this.formatValues([{
+      id,
+      args
+    }]);
+    return val;
+  }
+  handleEvent() {
+    this.onChange();
+  }
+  onChange(eager = false) {
+    this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds));
+    if (eager) {
+      this.bundles.touchNext(2);
+    }
+  }
+}
+function valueFromBundle(bundle, errors, message, args) {
+  if (message.value) {
+    return bundle.formatPattern(message.value, args, errors);
+  }
+  return null;
+}
+function messageFromBundle(bundle, errors, message, args) {
+  const formatted = {
+    value: null,
+    attributes: null
+  };
+  if (message.value) {
+    formatted.value = bundle.formatPattern(message.value, args, errors);
+  }
+  let attrNames = Object.keys(message.attributes);
+  if (attrNames.length > 0) {
+    formatted.attributes = new Array(attrNames.length);
+    for (let [i, name] of attrNames.entries()) {
+      let value = bundle.formatPattern(message.attributes[name], args, errors);
+      formatted.attributes[i] = {
+        name,
+        value
+      };
+    }
+  }
+  return formatted;
+}
+function keysFromBundle(method, bundle, keys, translations) {
+  const messageErrors = [];
+  const missingIds = new Set();
+  keys.forEach(({
+    id,
+    args
+  }, i) => {
+    if (translations[i] !== undefined) {
+      return;
+    }
+    let message = bundle.getMessage(id);
+    if (message) {
+      messageErrors.length = 0;
+      translations[i] = method(bundle, messageErrors, message, args);
+      if (messageErrors.length > 0 && typeof console !== "undefined") {
+        const locale = bundle.locales[0];
+        const errors = messageErrors.join(", ");
+        console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`);
+      }
+    } else {
+      missingIds.add(id);
+    }
+  });
+  return missingIds;
+}
+;// ./node_modules/@fluent/dom/esm/dom_localization.js
+
+
+const L10NID_ATTR_NAME = "data-l10n-id";
+const L10NARGS_ATTR_NAME = "data-l10n-args";
+const L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`;
+class DOMLocalization extends Localization {
+  constructor(resourceIds, generateBundles) {
+    super(resourceIds, generateBundles);
+    this.roots = new Set();
+    this.pendingrAF = null;
+    this.pendingElements = new Set();
+    this.windowElement = null;
+    this.mutationObserver = null;
+    this.observerConfig = {
+      attributes: true,
+      characterData: false,
+      childList: true,
+      subtree: true,
+      attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME]
+    };
+  }
+  onChange(eager = false) {
+    super.onChange(eager);
+    if (this.roots) {
+      this.translateRoots();
+    }
+  }
+  setAttributes(element, id, args) {
+    element.setAttribute(L10NID_ATTR_NAME, id);
+    if (args) {
+      element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args));
+    } else {
+      element.removeAttribute(L10NARGS_ATTR_NAME);
+    }
+    return element;
+  }
+  getAttributes(element) {
+    return {
+      id: element.getAttribute(L10NID_ATTR_NAME),
+      args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null)
+    };
+  }
+  connectRoot(newRoot) {
+    for (const root of this.roots) {
+      if (root === newRoot || root.contains(newRoot) || newRoot.contains(root)) {
+        throw new Error("Cannot add a root that overlaps with existing root.");
+      }
+    }
+    if (this.windowElement) {
+      if (this.windowElement !== newRoot.ownerDocument.defaultView) {
+        throw new Error(`Cannot connect a root:
+          DOMLocalization already has a root from a different window.`);
+      }
+    } else {
+      this.windowElement = newRoot.ownerDocument.defaultView;
+      this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations));
+    }
+    this.roots.add(newRoot);
+    this.mutationObserver.observe(newRoot, this.observerConfig);
+  }
+  disconnectRoot(root) {
+    this.roots.delete(root);
+    this.pauseObserving();
+    if (this.roots.size === 0) {
+      this.mutationObserver = null;
+      if (this.windowElement && this.pendingrAF) {
+        this.windowElement.cancelAnimationFrame(this.pendingrAF);
+      }
+      this.windowElement = null;
+      this.pendingrAF = null;
+      this.pendingElements.clear();
+      return true;
+    }
+    this.resumeObserving();
+    return false;
+  }
+  translateRoots() {
+    const roots = Array.from(this.roots);
+    return Promise.all(roots.map(root => this.translateFragment(root)));
+  }
+  pauseObserving() {
+    if (!this.mutationObserver) {
+      return;
+    }
+    this.translateMutations(this.mutationObserver.takeRecords());
+    this.mutationObserver.disconnect();
+  }
+  resumeObserving() {
+    if (!this.mutationObserver) {
+      return;
+    }
+    for (const root of this.roots) {
+      this.mutationObserver.observe(root, this.observerConfig);
+    }
+  }
+  translateMutations(mutations) {
+    for (const mutation of mutations) {
+      switch (mutation.type) {
+        case "attributes":
+          if (mutation.target.hasAttribute("data-l10n-id")) {
+            this.pendingElements.add(mutation.target);
+          }
+          break;
+        case "childList":
+          for (const addedNode of mutation.addedNodes) {
+            if (addedNode.nodeType === addedNode.ELEMENT_NODE) {
+              if (addedNode.childElementCount) {
+                for (const element of this.getTranslatables(addedNode)) {
+                  this.pendingElements.add(element);
+                }
+              } else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) {
+                this.pendingElements.add(addedNode);
+              }
+            }
+          }
+          break;
+      }
+    }
+    if (this.pendingElements.size > 0) {
+      if (this.pendingrAF === null) {
+        this.pendingrAF = this.windowElement.requestAnimationFrame(() => {
+          this.translateElements(Array.from(this.pendingElements));
+          this.pendingElements.clear();
+          this.pendingrAF = null;
+        });
+      }
+    }
+  }
+  translateFragment(frag) {
+    return this.translateElements(this.getTranslatables(frag));
+  }
+  async translateElements(elements) {
+    if (!elements.length) {
+      return undefined;
+    }
+    const keys = elements.map(this.getKeysForElement);
+    const translations = await this.formatMessages(keys);
+    return this.applyTranslations(elements, translations);
+  }
+  applyTranslations(elements, translations) {
+    this.pauseObserving();
+    for (let i = 0; i < elements.length; i++) {
+      if (translations[i] !== undefined) {
+        translateElement(elements[i], translations[i]);
+      }
+    }
+    this.resumeObserving();
+  }
+  getTranslatables(element) {
+    const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY));
+    if (typeof element.hasAttribute === "function" && element.hasAttribute(L10NID_ATTR_NAME)) {
+      nodes.push(element);
+    }
+    return nodes;
+  }
+  getKeysForElement(element) {
+    return {
+      id: element.getAttribute(L10NID_ATTR_NAME),
+      args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null)
+    };
+  }
+}
+;// ./node_modules/@fluent/dom/esm/index.js
+
+
+;// ./web/l10n.js
+class L10n {
+  #dir;
+  #elements;
+  #lang;
+  #l10n;
+  constructor({
+    lang,
+    isRTL
+  }, l10n = null) {
+    this.#lang = L10n.#fixupLangCode(lang);
+    this.#l10n = l10n;
+    this.#dir = isRTL ?? L10n.#isRTL(this.#lang) ? "rtl" : "ltr";
+  }
+  _setL10n(l10n) {
+    this.#l10n = l10n;
+  }
+  getLanguage() {
+    return this.#lang;
+  }
+  getDirection() {
+    return this.#dir;
+  }
+  async get(ids, args = null, fallback) {
+    if (Array.isArray(ids)) {
+      ids = ids.map(id => ({
+        id
+      }));
+      const messages = await this.#l10n.formatMessages(ids);
+      return messages.map(message => message.value);
+    }
+    const messages = await this.#l10n.formatMessages([{
+      id: ids,
+      args
+    }]);
+    return messages[0]?.value || fallback;
+  }
+  async translate(element) {
+    (this.#elements ||= new Set()).add(element);
+    try {
+      this.#l10n.connectRoot(element);
+      await this.#l10n.translateRoots();
+    } catch {}
+  }
+  async translateOnce(element) {
+    try {
+      await this.#l10n.translateElements([element]);
+    } catch (ex) {
+      console.error("translateOnce:", ex);
+    }
+  }
+  async destroy() {
+    if (this.#elements) {
+      for (const element of this.#elements) {
+        this.#l10n.disconnectRoot(element);
+      }
+      this.#elements.clear();
+      this.#elements = null;
+    }
+    this.#l10n.pauseObserving();
+  }
+  pause() {
+    this.#l10n.pauseObserving();
+  }
+  resume() {
+    this.#l10n.resumeObserving();
+  }
+  static #fixupLangCode(langCode) {
+    langCode = langCode?.toLowerCase() || "en-us";
+    const PARTIAL_LANG_CODES = {
+      en: "en-us",
+      es: "es-es",
+      fy: "fy-nl",
+      ga: "ga-ie",
+      gu: "gu-in",
+      hi: "hi-in",
+      hy: "hy-am",
+      nb: "nb-no",
+      ne: "ne-np",
+      nn: "nn-no",
+      pa: "pa-in",
+      pt: "pt-pt",
+      sv: "sv-se",
+      zh: "zh-cn"
+    };
+    return PARTIAL_LANG_CODES[langCode] || langCode;
+  }
+  static #isRTL(lang) {
+    const shortCode = lang.split("-", 1)[0];
+    return ["ar", "he", "fa", "ps", "ur"].includes(shortCode);
+  }
+}
+const GenericL10n = null;
+
+;// ./web/genericl10n.js
+
+
+
+
+function PLATFORM() {
+  const {
+    isAndroid,
+    isLinux,
+    isMac,
+    isWindows
+  } = FeatureTest.platform;
+  if (isLinux) {
+    return "linux";
+  }
+  if (isWindows) {
+    return "windows";
+  }
+  if (isMac) {
+    return "macos";
+  }
+  if (isAndroid) {
+    return "android";
+  }
+  return "other";
+}
+function createBundle(lang, text) {
+  const resource = new FluentResource(text);
+  const bundle = new FluentBundle(lang, {
+    functions: {
+      PLATFORM
+    }
+  });
+  const errors = bundle.addResource(resource);
+  if (errors.length) {
+    console.error("L10n errors", errors);
+  }
+  return bundle;
+}
+class genericl10n_GenericL10n extends L10n {
+  constructor(lang) {
+    super({
+      lang
+    });
+    const generateBundles = !lang ? genericl10n_GenericL10n.#generateBundlesFallback.bind(genericl10n_GenericL10n, this.getLanguage()) : genericl10n_GenericL10n.#generateBundles.bind(genericl10n_GenericL10n, "en-us", this.getLanguage());
+    this._setL10n(new DOMLocalization([], generateBundles));
+  }
+  static async *#generateBundles(defaultLang, baseLang) {
+    const {
+      baseURL,
+      paths
+    } = await this.#getPaths();
+    const langs = [baseLang];
+    if (defaultLang !== baseLang) {
+      const shortLang = baseLang.split("-", 1)[0];
+      if (shortLang !== baseLang) {
+        langs.push(shortLang);
+      }
+      langs.push(defaultLang);
+    }
+    const bundles = langs.map(lang => [lang, this.#createBundle(lang, baseURL, paths)]);
+    for (const [lang, bundlePromise] of bundles) {
+      const bundle = await bundlePromise;
+      if (bundle) {
+        yield bundle;
+      } else if (lang === "en-us") {
+        yield this.#createBundleFallback(lang);
+      }
+    }
+  }
+  static async #createBundle(lang, baseURL, paths) {
+    const path = paths[lang];
+    if (!path) {
+      return null;
+    }
+    const url = new URL(path, baseURL);
+    const text = await fetchData(url, "text");
+    return createBundle(lang, text);
+  }
+  static async #getPaths() {
+    try {
+      const {
+        href
+      } = document.querySelector(`link[type="application/l10n"]`);
+      const paths = await fetchData(href, "json");
+      return {
+        baseURL: href.substring(0, href.lastIndexOf("/") + 1) || "./",
+        paths
+      };
+    } catch {}
+    return {
+      baseURL: "./",
+      paths: Object.create(null)
+    };
+  }
+  static async *#generateBundlesFallback(lang) {
+    yield this.#createBundleFallback(lang);
+  }
+  static async #createBundleFallback(lang) {
+    const text = "pdfjs-previous-button =\n    .title = Previous Page\npdfjs-previous-button-label = Previous\npdfjs-next-button =\n    .title = Next Page\npdfjs-next-button-label = Next\npdfjs-page-input =\n    .title = Page\npdfjs-of-pages = of { $pagesCount }\npdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })\npdfjs-zoom-out-button =\n    .title = Zoom Out\npdfjs-zoom-out-button-label = Zoom Out\npdfjs-zoom-in-button =\n    .title = Zoom In\npdfjs-zoom-in-button-label = Zoom In\npdfjs-zoom-select =\n    .title = Zoom\npdfjs-presentation-mode-button =\n    .title = Switch to Presentation Mode\npdfjs-presentation-mode-button-label = Presentation Mode\npdfjs-open-file-button =\n    .title = Open File\npdfjs-open-file-button-label = Open\npdfjs-print-button =\n    .title = Print\npdfjs-print-button-label = Print\npdfjs-save-button =\n    .title = Save\npdfjs-save-button-label = Save\npdfjs-download-button =\n    .title = Download\npdfjs-download-button-label = Download\npdfjs-bookmark-button =\n    .title = Current Page (View URL from Current Page)\npdfjs-bookmark-button-label = Current Page\npdfjs-tools-button =\n    .title = Tools\npdfjs-tools-button-label = Tools\npdfjs-first-page-button =\n    .title = Go to First Page\npdfjs-first-page-button-label = Go to First Page\npdfjs-last-page-button =\n    .title = Go to Last Page\npdfjs-last-page-button-label = Go to Last Page\npdfjs-page-rotate-cw-button =\n    .title = Rotate Clockwise\npdfjs-page-rotate-cw-button-label = Rotate Clockwise\npdfjs-page-rotate-ccw-button =\n    .title = Rotate Counterclockwise\npdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise\npdfjs-cursor-text-select-tool-button =\n    .title = Enable Text Selection Tool\npdfjs-cursor-text-select-tool-button-label = Text Selection Tool\npdfjs-cursor-hand-tool-button =\n    .title = Enable Hand Tool\npdfjs-cursor-hand-tool-button-label = Hand Tool\npdfjs-scroll-page-button =\n    .title = Use Page Scrolling\npdfjs-scroll-page-button-label = Page Scrolling\npdfjs-scroll-vertical-button =\n    .title = Use Vertical Scrolling\npdfjs-scroll-vertical-button-label = Vertical Scrolling\npdfjs-scroll-horizontal-button =\n    .title = Use Horizontal Scrolling\npdfjs-scroll-horizontal-button-label = Horizontal Scrolling\npdfjs-scroll-wrapped-button =\n    .title = Use Wrapped Scrolling\npdfjs-scroll-wrapped-button-label = Wrapped Scrolling\npdfjs-spread-none-button =\n    .title = Do not join page spreads\npdfjs-spread-none-button-label = No Spreads\npdfjs-spread-odd-button =\n    .title = Join page spreads starting with odd-numbered pages\npdfjs-spread-odd-button-label = Odd Spreads\npdfjs-spread-even-button =\n    .title = Join page spreads starting with even-numbered pages\npdfjs-spread-even-button-label = Even Spreads\npdfjs-document-properties-button =\n    .title = Document Properties\u2026\npdfjs-document-properties-button-label = Document Properties\u2026\npdfjs-document-properties-file-name = File name:\npdfjs-document-properties-file-size = File size:\npdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)\npdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)\npdfjs-document-properties-title = Title:\npdfjs-document-properties-author = Author:\npdfjs-document-properties-subject = Subject:\npdfjs-document-properties-keywords = Keywords:\npdfjs-document-properties-creation-date = Creation Date:\npdfjs-document-properties-modification-date = Modification Date:\npdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-document-properties-creator = Creator:\npdfjs-document-properties-producer = PDF Producer:\npdfjs-document-properties-version = PDF Version:\npdfjs-document-properties-page-count = Page Count:\npdfjs-document-properties-page-size = Page Size:\npdfjs-document-properties-page-size-unit-inches = in\npdfjs-document-properties-page-size-unit-millimeters = mm\npdfjs-document-properties-page-size-orientation-portrait = portrait\npdfjs-document-properties-page-size-orientation-landscape = landscape\npdfjs-document-properties-page-size-name-a-three = A3\npdfjs-document-properties-page-size-name-a-four = A4\npdfjs-document-properties-page-size-name-letter = Letter\npdfjs-document-properties-page-size-name-legal = Legal\npdfjs-document-properties-page-size-dimension-string = { $width } \xD7 { $height } { $unit } ({ $orientation })\npdfjs-document-properties-page-size-dimension-name-string = { $width } \xD7 { $height } { $unit } ({ $name }, { $orientation })\npdfjs-document-properties-linearized = Fast Web View:\npdfjs-document-properties-linearized-yes = Yes\npdfjs-document-properties-linearized-no = No\npdfjs-document-properties-close-button = Close\npdfjs-print-progress-message = Preparing document for printing\u2026\npdfjs-print-progress-percent = { $progress }%\npdfjs-print-progress-close-button = Cancel\npdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.\npdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.\npdfjs-current-outline-item-button =\n    .title = Find Current Outline Item\npdfjs-current-outline-item-button-label = Current Outline Item\npdfjs-findbar-button =\n    .title = Find in Document\npdfjs-findbar-button-label = Find\npdfjs-additional-layers = Additional Layers\npdfjs-thumb-page-title1 =\n    .title = Page { $page } of { $total }\npdfjs-thumb-page-canvas =\n    .aria-label = Thumbnail of Page { $page }\npdfjs-thumb-page-checkbox1 =\n    .title = Select page { $page }\npdfjs-find-input =\n    .title = Find\n    .placeholder = Find in document\u2026\npdfjs-find-previous-button =\n    .title = Find the previous occurrence of the phrase\npdfjs-find-previous-button-label = Previous\npdfjs-find-next-button =\n    .title = Find the next occurrence of the phrase\npdfjs-find-next-button-label = Next\npdfjs-find-highlight-checkbox = Highlight All\npdfjs-find-match-case-checkbox-label = Match Case\npdfjs-find-match-diacritics-checkbox-label = Match Diacritics\npdfjs-find-entire-word-checkbox-label = Whole Words\npdfjs-find-reached-top = Reached top of document, continued from bottom\npdfjs-find-reached-bottom = Reached end of document, continued from top\npdfjs-find-match-count =\n    { $total ->\n        [one] { $current } of { $total } match\n       *[other] { $current } of { $total } matches\n    }\npdfjs-find-match-count-limit =\n    { $limit ->\n        [one] More than { $limit } match\n       *[other] More than { $limit } matches\n    }\npdfjs-find-not-found = Phrase not found\npdfjs-page-scale-width = Page Width\npdfjs-page-scale-fit = Page Fit\npdfjs-page-scale-auto = Automatic Zoom\npdfjs-page-scale-actual = Actual Size\npdfjs-page-scale-percent = { $scale }%\npdfjs-page-landmark =\n    .aria-label = Page { $page }\npdfjs-loading-error = An error occurred while loading the PDF.\npdfjs-invalid-file-error = Invalid or corrupted PDF file.\npdfjs-missing-file-error = Missing PDF file.\npdfjs-unexpected-response-error = Unexpected server response.\npdfjs-rendering-error = An error occurred while rendering the page.\npdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-text-annotation-type =\n    .alt = [{ $type } Annotation]\npdfjs-password-label = Enter the password to open this PDF file.\npdfjs-password-invalid = Invalid password. Please try again.\npdfjs-password-ok-button = OK\npdfjs-password-cancel-button = Cancel\npdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.\npdfjs-editor-free-text-button =\n    .title = Text\npdfjs-editor-color-picker-free-text-input =\n    .title = Change text color\npdfjs-editor-free-text-button-label = Text\npdfjs-editor-ink-button =\n    .title = Draw\npdfjs-editor-color-picker-ink-input =\n    .title = Change drawing color\npdfjs-editor-ink-button-label = Draw\npdfjs-editor-stamp-button =\n    .title = Add or edit images\npdfjs-editor-stamp-button-label = Add or edit images\npdfjs-editor-highlight-button =\n    .title = Highlight\npdfjs-editor-highlight-button-label = Highlight\npdfjs-highlight-floating-button1 =\n    .title = Highlight\n    .aria-label = Highlight\npdfjs-highlight-floating-button-label = Highlight\npdfjs-comment-floating-button =\n    .title = Comment\n    .aria-label = Comment\npdfjs-comment-floating-button-label = Comment\npdfjs-editor-comment-button =\n    .title = Comment\n    .aria-label = Comment\npdfjs-editor-comment-button-label = Comment\npdfjs-editor-signature-button =\n    .title = Add signature\npdfjs-editor-signature-button-label = Add signature\npdfjs-editor-highlight-editor =\n    .aria-label = Highlight editor\npdfjs-editor-ink-editor =\n    .aria-label = Drawing editor\npdfjs-editor-signature-editor1 =\n    .aria-description = Signature editor: { $description }\npdfjs-editor-stamp-editor =\n    .aria-label = Image editor\npdfjs-editor-remove-ink-button =\n    .title = Remove drawing\npdfjs-editor-remove-freetext-button =\n    .title = Remove text\npdfjs-editor-remove-stamp-button =\n    .title = Remove image\npdfjs-editor-remove-highlight-button =\n    .title = Remove highlight\npdfjs-editor-remove-signature-button =\n    .title = Remove signature\npdfjs-editor-free-text-color-input = Color\npdfjs-editor-free-text-size-input = Size\npdfjs-editor-ink-color-input = Color\npdfjs-editor-ink-thickness-input = Thickness\npdfjs-editor-ink-opacity-input = Opacity\npdfjs-editor-stamp-add-image-button =\n    .title = Add image\npdfjs-editor-stamp-add-image-button-label = Add image\npdfjs-editor-free-highlight-thickness-input = Thickness\npdfjs-editor-free-highlight-thickness-title =\n    .title = Change thickness when highlighting items other than text\npdfjs-editor-add-signature-container =\n    .aria-label = Signature controls and saved signatures\npdfjs-editor-signature-add-signature-button =\n    .title = Add new signature\npdfjs-editor-signature-add-signature-button-label = Add new signature\npdfjs-editor-add-saved-signature-button =\n    .title = Saved signature: { $description }\npdfjs-free-text2 =\n    .aria-label = Text Editor\n    .default-content = Start typing\u2026\npdfjs-editor-comments-sidebar-title =\n    { $count ->\n        [one] Comment\n       *[other] Comments\n    }\npdfjs-editor-comments-sidebar-close-button =\n    .title = Close the sidebar\n    .aria-label = Close the sidebar\npdfjs-editor-comments-sidebar-close-button-label = Close the sidebar\npdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment.\npdfjs-editor-comments-sidebar-no-comments-link = Learn more\npdfjs-editor-alt-text-button =\n    .aria-label = Alt text\npdfjs-editor-alt-text-button-label = Alt text\npdfjs-editor-alt-text-edit-button =\n    .aria-label = Edit alt text\npdfjs-editor-alt-text-dialog-label = Choose an option\npdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can\u2019t see the image or when it doesn\u2019t load.\npdfjs-editor-alt-text-add-description-label = Add a description\npdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.\npdfjs-editor-alt-text-mark-decorative-label = Mark as decorative\npdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.\npdfjs-editor-alt-text-cancel-button = Cancel\npdfjs-editor-alt-text-save-button = Save\npdfjs-editor-alt-text-decorative-tooltip = Marked as decorative\npdfjs-editor-alt-text-textarea =\n    .placeholder = For example, \u201CA young man sits down at a table to eat a meal\u201D\npdfjs-editor-resizer-top-left =\n    .aria-label = Top left corner \u2014 resize\npdfjs-editor-resizer-top-middle =\n    .aria-label = Top middle \u2014 resize\npdfjs-editor-resizer-top-right =\n    .aria-label = Top right corner \u2014 resize\npdfjs-editor-resizer-middle-right =\n    .aria-label = Middle right \u2014 resize\npdfjs-editor-resizer-bottom-right =\n    .aria-label = Bottom right corner \u2014 resize\npdfjs-editor-resizer-bottom-middle =\n    .aria-label = Bottom middle \u2014 resize\npdfjs-editor-resizer-bottom-left =\n    .aria-label = Bottom left corner \u2014 resize\npdfjs-editor-resizer-middle-left =\n    .aria-label = Middle left \u2014 resize\npdfjs-editor-highlight-colorpicker-label = Highlight color\npdfjs-editor-colorpicker-button =\n    .title = Change color\npdfjs-editor-colorpicker-dropdown =\n    .aria-label = Color choices\npdfjs-editor-colorpicker-yellow =\n    .title = Yellow\npdfjs-editor-colorpicker-green =\n    .title = Green\npdfjs-editor-colorpicker-blue =\n    .title = Blue\npdfjs-editor-colorpicker-pink =\n    .title = Pink\npdfjs-editor-colorpicker-red =\n    .title = Red\npdfjs-editor-highlight-show-all-button-label = Show all\npdfjs-editor-highlight-show-all-button =\n    .title = Show all\npdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description)\npdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description)\npdfjs-editor-new-alt-text-textarea =\n    .placeholder = Write your description here\u2026\npdfjs-editor-new-alt-text-description = Short description for people who can\u2019t see the image or when the image doesn\u2019t load.\npdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate.\npdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more\npdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically\npdfjs-editor-new-alt-text-not-now-button = Not now\npdfjs-editor-new-alt-text-error-title = Couldn\u2019t create alt text automatically\npdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later.\npdfjs-editor-new-alt-text-error-close-button = Close\npdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\n    .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\npdfjs-editor-new-alt-text-added-button =\n    .aria-label = Alt text added\npdfjs-editor-new-alt-text-added-button-label = Alt text added\npdfjs-editor-new-alt-text-missing-button =\n    .aria-label = Missing alt text\npdfjs-editor-new-alt-text-missing-button-label = Missing alt text\npdfjs-editor-new-alt-text-to-review-button =\n    .aria-label = Review alt text\npdfjs-editor-new-alt-text-to-review-button-label = Review alt text\npdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText }\npdfjs-image-alt-text-settings-button =\n    .title = Image alt text settings\npdfjs-image-alt-text-settings-button-label = Image alt text settings\npdfjs-editor-alt-text-settings-dialog-label = Image alt text settings\npdfjs-editor-alt-text-settings-automatic-title = Automatic alt text\npdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically\npdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can\u2019t see the image or when the image doesn\u2019t load.\npdfjs-editor-alt-text-settings-editor-title = Alt text editor\npdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image\npdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text.\npdfjs-editor-alt-text-settings-close-button = Close\npdfjs-editor-highlight-added-alert = Highlight added\npdfjs-editor-freetext-added-alert = Text added\npdfjs-editor-ink-added-alert = Drawing added\npdfjs-editor-stamp-added-alert = Image added\npdfjs-editor-signature-added-alert = Signature added\npdfjs-editor-undo-bar-message-highlight = Highlight removed\npdfjs-editor-undo-bar-message-freetext = Text removed\npdfjs-editor-undo-bar-message-ink = Drawing removed\npdfjs-editor-undo-bar-message-stamp = Image removed\npdfjs-editor-undo-bar-message-signature = Signature removed\npdfjs-editor-undo-bar-message-comment = Comment removed\npdfjs-editor-undo-bar-message-multiple =\n    { $count ->\n        [one] { $count } annotation removed\n       *[other] { $count } annotations removed\n    }\npdfjs-editor-undo-bar-undo-button =\n    .title = Undo\npdfjs-editor-undo-bar-undo-button-label = Undo\npdfjs-editor-undo-bar-close-button =\n    .title = Close\npdfjs-editor-undo-bar-close-button-label = Close\npdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use.\npdfjs-editor-add-signature-dialog-title = Add a signature\npdfjs-editor-add-signature-type-button = Type\n    .title = Type\npdfjs-editor-add-signature-draw-button = Draw\n    .title = Draw\npdfjs-editor-add-signature-image-button = Image\n    .title = Image\npdfjs-editor-add-signature-type-input =\n    .aria-label = Type your signature\n    .placeholder = Type your signature\npdfjs-editor-add-signature-draw-placeholder = Draw your signature\npdfjs-editor-add-signature-draw-thickness-range-label = Thickness\npdfjs-editor-add-signature-draw-thickness-range =\n    .title = Drawing thickness: { $thickness }\npdfjs-editor-add-signature-image-placeholder = Drag a file here to upload\npdfjs-editor-add-signature-image-browse-link =\n    { PLATFORM() ->\n        [macos] Or choose image files\n       *[other] Or browse image files\n    }\npdfjs-editor-add-signature-description-label = Description (alt text)\npdfjs-editor-add-signature-description-input =\n    .title = Description (alt text)\npdfjs-editor-add-signature-description-default-when-drawing = Signature\npdfjs-editor-add-signature-clear-button-label = Clear signature\npdfjs-editor-add-signature-clear-button =\n    .title = Clear signature\npdfjs-editor-add-signature-save-checkbox = Save signature\npdfjs-editor-add-signature-save-warning-message = You\u2019ve reached the limit of 5 saved signatures. Remove one to save more.\npdfjs-editor-add-signature-image-upload-error-title = Couldn\u2019t upload image\npdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image.\npdfjs-editor-add-signature-image-no-data-error-title = Can\u2019t convert this image into a signature\npdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image.\npdfjs-editor-add-signature-error-close-button = Close\npdfjs-editor-add-signature-cancel-button = Cancel\npdfjs-editor-add-signature-add-button = Add\npdfjs-editor-delete-signature-button1 =\n    .title = Remove saved signature\npdfjs-editor-delete-signature-button-label1 = Remove saved signature\npdfjs-editor-add-signature-edit-button-label = Edit description\npdfjs-editor-edit-signature-dialog-title = Edit description\npdfjs-editor-edit-signature-update-button = Update\npdfjs-show-comment-button =\n    .title = Show comment\npdfjs-editor-edit-comment-popup-button-label = Edit comment\npdfjs-editor-edit-comment-popup-button =\n    .title = Edit comment\npdfjs-editor-delete-comment-popup-button-label = Remove comment\npdfjs-editor-delete-comment-popup-button =\n    .title = Remove comment\npdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment\npdfjs-editor-edit-comment-dialog-save-button-when-editing = Update\npdfjs-editor-edit-comment-dialog-title-when-adding = Add comment\npdfjs-editor-edit-comment-dialog-save-button-when-adding = Add\npdfjs-editor-edit-comment-dialog-text-input =\n    .placeholder = Start typing\u2026\npdfjs-editor-edit-comment-dialog-cancel-button = Cancel\npdfjs-editor-add-comment-button =\n    .title = Add comment\npdfjs-toggle-views-manager-button1 =\n    .title = Manage pages\npdfjs-toggle-views-manager-notification-button =\n    .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers)\npdfjs-toggle-views-manager-button1-label = Manage pages\npdfjs-views-manager-sidebar =\n    .aria-label = Sidebar\npdfjs-views-manager-sidebar-resizer =\n    .aria-label = Sidebar resizer\npdfjs-views-manager-view-selector-button =\n    .title = Views\npdfjs-views-manager-view-selector-button-label = Views\npdfjs-views-manager-pages-title = Pages\npdfjs-views-manager-outlines-title1 = Document outline\n    .title = Document outline (double-click to expand/collapse all items)\npdfjs-views-manager-attachments-title = Attachments\npdfjs-views-manager-layers-title1 = Layers\n    .title = Layers (double-click to reset all layers to the default state)\npdfjs-views-manager-pages-option-label = Pages\npdfjs-views-manager-outlines-option-label = Document outline\npdfjs-views-manager-attachments-option-label = Attachments\npdfjs-views-manager-layers-option-label = Layers\npdfjs-views-manager-add-file-button =\n    .title = Add file\npdfjs-views-manager-add-file-button-label = Add file\npdfjs-views-manager-pages-status-action-label =\n    { $count ->\n        [one] { $count } selected\n        *[other] { $count } selected\n    }\npdfjs-views-manager-pages-status-none-action-label = Select pages\npdfjs-views-manager-pages-status-action-button-label = Manage\npdfjs-views-manager-pages-status-copy-button-label = Copy\npdfjs-views-manager-pages-status-cut-button-label = Cut\npdfjs-views-manager-pages-status-delete-button-label = Delete\npdfjs-views-manager-pages-status-export-selected-button-label = Export selected\u2026\npdfjs-views-manager-status-undo-cut-label =\n    { $count ->\n        [one] 1 page cut\n        *[other] { $count } pages cut\n    }\npdfjs-views-manager-pages-status-undo-copy-label =\n    { $count ->\n        [one] 1 page copied\n        *[other] { $count } pages copied\n    }\npdfjs-views-manager-pages-status-undo-delete-label =\n    { $count ->\n        [one] 1 page deleted\n        *[other] { $count } pages deleted\n    }\npdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready\u2026\npdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file\u2026\npdfjs-views-manager-status-warning-cut-label = Couldn\u2019t cut. Refresh page and try again.\npdfjs-views-manager-status-warning-copy-label = Couldn\u2019t copy. Refresh page and try again.\npdfjs-views-manager-status-warning-delete-label = Couldn\u2019t delete. Refresh page and try again.\npdfjs-views-manager-status-warning-save-label = Couldn\u2019t save. Refresh page and try again.\npdfjs-views-manager-status-undo-button-label = Undo\npdfjs-views-manager-status-done-button-label = Done\npdfjs-views-manager-status-close-button =\n    .title = Close\npdfjs-views-manager-status-close-button-label = Close\npdfjs-views-manager-paste-button-label = Paste\npdfjs-views-manager-paste-button-before =\n    .title = Paste before the first page\npdfjs-views-manager-paste-button-after =\n    .title = Paste after page { $page }\npdfjs-new-badge-content = NEW\npdfjs-views-manager-waiting-for-file = Uploading file\u2026";
+    return createBundle(lang, text);
+  }
+}
+
+;// ./web/generic_scripting.js
+/* unused harmony import specifier */ var generic_scripting_getPdfFilenameFromUrl;
+
+async function docProperties(pdfDocument) {
+  const url = "",
+    baseUrl = "";
+  const {
+    info,
+    metadata,
+    contentDispositionFilename,
+    contentLength
+  } = await pdfDocument.getMetadata();
+  return {
+    ...info,
+    baseURL: baseUrl,
+    filesize: contentLength || (await pdfDocument.getDownloadInfo()).length,
+    filename: contentDispositionFilename || generic_scripting_getPdfFilenameFromUrl(url),
+    metadata: metadata?.getRaw(),
+    authors: metadata?.get("dc:creator"),
+    numPages: pdfDocument.numPages,
+    URL: url
+  };
+}
+class GenericScripting {
+  constructor(sandboxBundleSrc, wasmUrl) {
+    this._ready = new Promise((resolve, reject) => {
+      const sandbox = import(
+      /*webpackIgnore: true*/
+      /*@vite-ignore*/
+      sandboxBundleSrc);
+      sandbox.then(pdfjsSandbox => {
+        resolve(pdfjsSandbox.QuickJSSandbox(new URL(wasmUrl, location.href).href));
+      }).catch(reject);
+    });
+  }
+  async createSandbox(data) {
+    const sandbox = await this._ready;
+    sandbox.create(data);
+  }
+  async dispatchEventInSandbox(event) {
+    const sandbox = await this._ready;
+    setTimeout(() => sandbox.dispatchEvent(event), 0);
+  }
+  async destroySandbox() {
+    const sandbox = await this._ready;
+    sandbox.nukeSandbox();
+  }
+}
+
+;// ./web/generic_signature_storage.js
+
+const KEY_STORAGE = "pdfjs.signature";
+class SignatureStorage {
+  #eventBus;
+  #signatures = null;
+  #signal = null;
+  constructor(eventBus, signal) {
+    this.#eventBus = eventBus;
+    this.#signal = signal;
+  }
+  #save() {
+    localStorage.setItem(KEY_STORAGE, JSON.stringify(Object.fromEntries(this.#signatures)));
+  }
+  async getAll() {
+    if (this.#signal) {
+      window.addEventListener("storage", ({
+        key
+      }) => {
+        if (key === KEY_STORAGE) {
+          this.#signatures = null;
+          this.#eventBus?.dispatch("storedsignatureschanged", {
+            source: this
+          });
+        }
+      }, {
+        signal: this.#signal
+      });
+      this.#signal = null;
+    }
+    if (!this.#signatures) {
+      this.#signatures = new Map();
+      const data = localStorage.getItem(KEY_STORAGE);
+      if (data) {
+        for (const [key, value] of Object.entries(JSON.parse(data))) {
+          this.#signatures.set(key, value);
+        }
+      }
+    }
+    return this.#signatures;
+  }
+  async isFull() {
+    return (await this.size()) === 5;
+  }
+  async size() {
+    return (await this.getAll()).size;
+  }
+  async create(data) {
+    if (await this.isFull()) {
+      return null;
+    }
+    const uuid = getUuid();
+    this.#signatures.set(uuid, data);
+    this.#save();
+    return uuid;
+  }
+  async delete(uuid) {
+    const signatures = await this.getAll();
+    if (!signatures.has(uuid)) {
+      return false;
+    }
+    signatures.delete(uuid);
+    this.#save();
+    return true;
+  }
+}
+
+;// ./web/genericcom.js
+
+
+
+
+
+
+function initCom(app) {}
+class Preferences extends BasePreferences {
+  async _writeToStorage(prefObj) {
+    localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj));
+  }
+  async _readFromStorage(prefObj) {
+    return {
+      prefs: JSON.parse(localStorage.getItem("pdfjs.preferences"))
+    };
+  }
+}
+class ExternalServices extends BaseExternalServices {
+  constructor() {
+    super();
+  }
+  async createL10n() {
+    return new genericl10n_GenericL10n(AppOptions.get("localeProperties")?.lang);
+  }
+  createScripting() {
+    return new GenericScripting(AppOptions.get("sandboxBundleSrc"), AppOptions.get("wasmUrl"));
+  }
+  createSignatureStorage(eventBus, signal) {
+    return new SignatureStorage(eventBus, signal);
+  }
+}
+class MLManager {
+  async isEnabledFor(_name) {
+    return false;
+  }
+  async deleteModel(_service) {
+    return null;
+  }
+  isReady(_name) {
+    return false;
+  }
+  guess(_data) {}
+  toggleService(_name, _enabled) {}
+}
+
+;// ./web/new_alt_text_manager.js
+
+
+class NewAltTextManager {
+  #boundCancel = this.#cancel.bind(this);
+  #createAutomaticallyButton;
+  #currentEditor = null;
+  #cancelButton;
+  #descriptionContainer;
+  #dialog;
+  #disclaimer;
+  #downloadModel;
+  #downloadModelDescription;
+  #eventBus;
+  #firstTime = false;
+  #guessedAltText;
+  #hasAI = null;
+  #isEditing = null;
+  #imagePreview;
+  #imageData;
+  #isAILoading = false;
+  #wasAILoading = false;
+  #learnMore;
+  #notNowButton;
+  #overlayManager;
+  #textarea;
+  #title;
+  #uiManager;
+  #previousAltText = null;
+  constructor({
+    descriptionContainer,
+    dialog,
+    imagePreview,
+    cancelButton,
+    disclaimer,
+    notNowButton,
+    saveButton,
+    textarea,
+    learnMore,
+    errorCloseButton,
+    createAutomaticallyButton,
+    downloadModel,
+    downloadModelDescription,
+    title
+  }, overlayManager, eventBus) {
+    this.#cancelButton = cancelButton;
+    this.#createAutomaticallyButton = createAutomaticallyButton;
+    this.#descriptionContainer = descriptionContainer;
+    this.#dialog = dialog;
+    this.#disclaimer = disclaimer;
+    this.#notNowButton = notNowButton;
+    this.#imagePreview = imagePreview;
+    this.#textarea = textarea;
+    this.#learnMore = learnMore;
+    this.#title = title;
+    this.#downloadModel = downloadModel;
+    this.#downloadModelDescription = downloadModelDescription;
+    this.#overlayManager = overlayManager;
+    this.#eventBus = eventBus;
+    dialog.addEventListener("close", this.#close.bind(this));
+    dialog.addEventListener("contextmenu", event => {
+      if (event.target !== this.#textarea) {
+        event.preventDefault();
+      }
+    });
+    cancelButton.addEventListener("click", this.#boundCancel);
+    notNowButton.addEventListener("click", this.#boundCancel);
+    saveButton.addEventListener("click", this.#save.bind(this));
+    errorCloseButton.addEventListener("click", () => {
+      this.#toggleError(false);
+    });
+    createAutomaticallyButton.addEventListener("click", async () => {
+      const checked = createAutomaticallyButton.getAttribute("aria-pressed") !== "true";
+      this.#currentEditor._reportTelemetry({
+        action: "pdfjs.image.alt_text.ai_generation_check",
+        data: {
+          status: checked
+        }
+      });
+      if (this.#uiManager) {
+        const isAltTextEnabled = await this.#uiManager.mlManager.isEnabledFor("altText");
+        this.#createAutomaticallyButton.disabled = true;
+        if (checked && !isAltTextEnabled) {
+          this.#textarea.value = "";
+          this.#setProgress();
+          this.#uiManager.setPreference("enableGuessAltText", true);
+          await this.#uiManager.mlManager.downloadModel("altText");
+          this.#setPref("enableAltTextModelDownload", true);
+        } else if (!checked && isAltTextEnabled) {
+          this.#uiManager.setPreference("enableGuessAltText", false);
+          await this.#uiManager.mlManager.deleteModel("altText");
+          this.#setPref("enableAltTextModelDownload", false);
+        }
+        this.#createAutomaticallyButton.disabled = false;
+        await this.#uiManager.mlManager.toggleService("altText", checked);
+      }
+      this.#toggleGuessAltText(checked, false);
+    });
+    textarea.addEventListener("focus", () => {
+      this.#wasAILoading = this.#isAILoading;
+      this.#toggleLoading(false);
+      this.#toggleTitleAndDisclaimer();
+    });
+    textarea.addEventListener("blur", () => {
+      if (!textarea.value) {
+        this.#toggleLoading(this.#wasAILoading);
+      }
+      this.#toggleTitleAndDisclaimer();
+    });
+    textarea.addEventListener("input", () => {
+      this.#toggleTitleAndDisclaimer();
+    });
+    textarea.addEventListener("keydown", e => {
+      if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) {
+        this.#save();
+      }
+    });
+    eventBus.on("enableguessalttext", ({
+      value
+    }) => {
+      this.#toggleGuessAltText(value, false);
+    }, internalOpt);
+    this.#overlayManager.register(dialog);
+    this.#learnMore.addEventListener("click", () => {
+      this.#currentEditor._reportTelemetry({
+        action: "pdfjs.image.alt_text.info",
+        data: {
+          topic: "alt_text"
+        }
+      });
+    });
+  }
+  #setPref(name, value) {
+    this.#eventBus.dispatch("setpreference", {
+      source: this,
+      name,
+      value
+    });
+  }
+  #toggleLoading(value) {
+    if (!this.#uiManager || this.#isAILoading === value) {
+      return;
+    }
+    this.#isAILoading = value;
+    this.#descriptionContainer.classList.toggle("loading", value);
+  }
+  #toggleError(value) {
+    if (!this.#uiManager) {
+      return;
+    }
+    this.#dialog.classList.toggle("error", value);
+  }
+  async #toggleGuessAltText(value, isInitial) {
+    if (!this.#uiManager) {
+      return;
+    }
+    this.#dialog.classList.toggle("aiDisabled", !value);
+    this.#createAutomaticallyButton.setAttribute("aria-pressed", value);
+    if (value) {
+      const {
+        altTextLearnMoreUrl
+      } = this.#uiManager.mlManager;
+      if (altTextLearnMoreUrl) {
+        this.#learnMore.href = altTextLearnMoreUrl;
+      }
+      this.#mlGuessAltText(isInitial);
+    } else {
+      this.#toggleLoading(false);
+      this.#isAILoading = false;
+      this.#toggleTitleAndDisclaimer();
+    }
+  }
+  #toggleNotNow() {
+    this.#notNowButton.classList.toggle("hidden", !this.#firstTime);
+    this.#cancelButton.classList.toggle("hidden", this.#firstTime);
+  }
+  #toggleAI(value) {
+    if (!this.#uiManager || this.#hasAI === value) {
+      return;
+    }
+    this.#hasAI = value;
+    this.#dialog.classList.toggle("noAi", !value);
+    this.#toggleTitleAndDisclaimer();
+  }
+  #toggleTitleAndDisclaimer() {
+    const visible = this.#isAILoading || this.#guessedAltText && this.#guessedAltText === this.#textarea.value;
+    this.#disclaimer.hidden = !visible;
+    const isEditing = this.#isAILoading || !!this.#textarea.value;
+    if (this.#isEditing === isEditing) {
+      return;
+    }
+    this.#isEditing = isEditing;
+    this.#title.setAttribute("data-l10n-id", isEditing ? "pdfjs-editor-new-alt-text-dialog-edit-label" : "pdfjs-editor-new-alt-text-dialog-add-label");
+  }
+  async #mlGuessAltText(isInitial) {
+    if (this.#isAILoading) {
+      return;
+    }
+    if (this.#textarea.value) {
+      return;
+    }
+    if (isInitial && this.#previousAltText !== null) {
+      return;
+    }
+    this.#guessedAltText = this.#currentEditor.guessedAltText;
+    if (this.#previousAltText === null && this.#guessedAltText) {
+      this.#addAltText(this.#guessedAltText);
+      return;
+    }
+    this.#toggleLoading(true);
+    this.#toggleTitleAndDisclaimer();
+    let hasError = false;
+    try {
+      const altText = await this.#currentEditor.mlGuessAltText(this.#imageData, false);
+      if (altText) {
+        this.#guessedAltText = altText;
+        this.#wasAILoading = this.#isAILoading;
+        if (this.#isAILoading) {
+          this.#addAltText(altText);
+        }
+      }
+    } catch (e) {
+      console.error(e);
+      hasError = true;
+    }
+    this.#toggleLoading(false);
+    this.#toggleTitleAndDisclaimer();
+    if (hasError && this.#uiManager) {
+      this.#toggleError(true);
+    }
+  }
+  #addAltText(altText) {
+    if (!this.#uiManager || this.#textarea.value) {
+      return;
+    }
+    this.#textarea.value = altText;
+    this.#toggleTitleAndDisclaimer();
+  }
+  #setProgress() {
+    this.#downloadModel.classList.toggle("hidden", false);
+    const callback = async ({
+      detail: {
+        finished,
+        total,
+        totalLoaded
+      }
+    }) => {
+      const ONE_MEGA_BYTES = 1e6;
+      totalLoaded = Math.min(0.99 * total, totalLoaded);
+      const totalSize = this.#downloadModelDescription.ariaValueMax = Math.round(total / ONE_MEGA_BYTES);
+      const downloadedSize = this.#downloadModelDescription.ariaValueNow = Math.round(totalLoaded / ONE_MEGA_BYTES);
+      this.#downloadModelDescription.setAttribute("data-l10n-args", JSON.stringify({
+        totalSize,
+        downloadedSize
+      }));
+      if (!finished) {
+        return;
+      }
+      this.#eventBus.off("loadaiengineprogress", callback);
+      this.#downloadModel.classList.toggle("hidden", true);
+      this.#toggleAI(true);
+      if (!this.#uiManager) {
+        return;
+      }
+      const {
+        mlManager
+      } = this.#uiManager;
+      mlManager.toggleService("altText", true);
+      this.#toggleGuessAltText(await mlManager.isEnabledFor("altText"), true);
+    };
+    this.#eventBus.on("loadaiengineprogress", callback, internalOpt);
+  }
+  async editAltText(uiManager, editor, firstTime) {
+    if (this.#currentEditor || !editor) {
+      return;
+    }
+    if (firstTime && editor.hasAltTextData()) {
+      editor.altTextFinish();
+      return;
+    }
+    this.#firstTime = firstTime;
+    const {
+      mlManager
+    } = uiManager;
+    const hasAI = !!mlManager;
+    this.#toggleTitleAndDisclaimer();
+    if (mlManager && !mlManager.isReady("altText")) {
+      if (mlManager.hasProgress) {
+        this.#setProgress();
+      } else {
+        this.#createAutomaticallyButton.setAttribute("aria-pressed", false);
+      }
+    } else {
+      this.#downloadModel.classList.toggle("hidden", true);
+    }
+    const isAltTextEnabledPromise = mlManager?.isEnabledFor("altText");
+    this.#currentEditor = editor;
+    this.#uiManager = uiManager;
+    this.#uiManager.removeEditListeners();
+    ({
+      altText: this.#previousAltText
+    } = editor.altTextData);
+    this.#textarea.value = this.#previousAltText ?? "";
+    const AI_MAX_IMAGE_DIMENSION = 224;
+    const MAX_PREVIEW_DIMENSION = 180;
+    let canvas, width, height;
+    if (mlManager) {
+      ({
+        canvas,
+        width,
+        height,
+        imageData: this.#imageData
+      } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, true));
+      if (hasAI) {
+        this.#toggleGuessAltText(await isAltTextEnabledPromise, true);
+      }
+    } else {
+      ({
+        canvas,
+        width,
+        height
+      } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, false));
+    }
+    canvas.setAttribute("role", "presentation");
+    const {
+      style
+    } = canvas;
+    style.width = `${width}px`;
+    style.height = `${height}px`;
+    this.#imagePreview.append(canvas);
+    this.#toggleNotNow();
+    this.#toggleAI(hasAI);
+    this.#toggleError(false);
+    try {
+      await this.#overlayManager.open(this.#dialog);
+    } catch (ex) {
+      this.#close();
+      throw ex;
+    }
+  }
+  #cancel() {
+    this.#currentEditor.altTextData = {
+      cancel: true
+    };
+    const altText = this.#textarea.value.trim();
+    this.#currentEditor._reportTelemetry({
+      action: "pdfjs.image.alt_text.dismiss",
+      data: {
+        alt_text_type: altText ? "present" : "empty",
+        flow: this.#firstTime ? "image_add" : "alt_text_edit"
+      }
+    });
+    this.#currentEditor._reportTelemetry({
+      action: "pdfjs.image.image_added",
+      data: {
+        alt_text_modal: true,
+        alt_text_type: "skipped"
+      }
+    });
+    this.#finish();
+  }
+  #finish() {
+    this.#overlayManager.closeIfActive(this.#dialog);
+  }
+  #close() {
+    const canvas = this.#imagePreview.firstElementChild;
+    canvas.remove();
+    canvas.width = canvas.height = 0;
+    this.#imageData = null;
+    this.#toggleLoading(false);
+    this.#uiManager?.addEditListeners();
+    this.#currentEditor.altTextFinish();
+    this.#uiManager?.setSelected(this.#currentEditor);
+    this.#currentEditor = null;
+    this.#uiManager = null;
+  }
+  #extractWords(text) {
+    return new Set(text.toLowerCase().split(/[^\p{L}\p{N}]+/gu).filter(x => !!x));
+  }
+  #save() {
+    const altText = this.#textarea.value.trim();
+    this.#currentEditor.altTextData = {
+      altText,
+      decorative: false
+    };
+    this.#currentEditor.altTextData.guessedAltText = this.#guessedAltText;
+    if (this.#guessedAltText && this.#guessedAltText !== altText) {
+      const guessedWords = this.#extractWords(this.#guessedAltText);
+      const words = this.#extractWords(altText);
+      this.#currentEditor._reportTelemetry({
+        action: "pdfjs.image.alt_text.user_edit",
+        data: {
+          total_words: guessedWords.size,
+          words_removed: guessedWords.difference(words).size,
+          words_added: words.difference(guessedWords).size
+        }
+      });
+    }
+    this.#currentEditor._reportTelemetry({
+      action: "pdfjs.image.image_added",
+      data: {
+        alt_text_modal: true,
+        alt_text_type: altText ? "present" : "empty"
+      }
+    });
+    this.#currentEditor._reportTelemetry({
+      action: "pdfjs.image.alt_text.save",
+      data: {
+        alt_text_type: altText ? "present" : "empty",
+        flow: this.#firstTime ? "image_add" : "alt_text_edit"
+      }
+    });
+    this.#finish();
+  }
+  destroy() {
+    this.#uiManager = null;
+    this.#finish();
+  }
+}
+class ImageAltTextSettings {
+  #createModelButton;
+  #dialog;
+  #eventBus;
+  #mlManager;
+  #overlayManager;
+  #showAltTextDialogButton;
+  constructor({
+    dialog,
+    createModelButton,
+    learnMore,
+    closeButton,
+    showAltTextDialogButton
+  }, overlayManager, eventBus, mlManager) {
+    this.#dialog = dialog;
+    this.#createModelButton = createModelButton;
+    this.#showAltTextDialogButton = showAltTextDialogButton;
+    this.#overlayManager = overlayManager;
+    this.#eventBus = eventBus;
+    this.#mlManager = mlManager;
+    const {
+      altTextLearnMoreUrl
+    } = mlManager;
+    if (altTextLearnMoreUrl) {
+      learnMore.href = altTextLearnMoreUrl;
+    }
+    dialog.addEventListener("contextmenu", noContextMenu);
+    createModelButton.addEventListener("click", async e => {
+      const checked = this.#togglePref("enableGuessAltText", e);
+      await (checked ? this.#download(true) : this.#delete(true));
+      await mlManager.toggleService("altText", checked);
+      this.#reportTelemetry({
+        type: "stamp",
+        action: "pdfjs.image.alt_text.settings_ai_generation_check",
+        data: {
+          status: checked
+        }
+      });
+    });
+    showAltTextDialogButton.addEventListener("click", e => {
+      const checked = this.#togglePref("enableNewAltTextWhenAddingImage", e);
+      this.#reportTelemetry({
+        type: "stamp",
+        action: "pdfjs.image.alt_text.settings_edit_alt_text_check",
+        data: {
+          status: checked
+        }
+      });
+    });
+    closeButton.addEventListener("click", this.#finish.bind(this));
+    learnMore.addEventListener("click", () => {
+      this.#reportTelemetry({
+        type: "stamp",
+        action: "pdfjs.image.alt_text.info",
+        data: {
+          topic: "ai_generation"
+        }
+      });
+    });
+    eventBus.on("enablealttextmodeldownload", ({
+      value
+    }) => {
+      if (value) {
+        this.#download(false);
+      } else {
+        this.#delete(false);
+      }
+    }, internalOpt);
+    this.#overlayManager.register(dialog);
+  }
+  #reportTelemetry(data) {
+    this.#eventBus.dispatch("reporttelemetry", {
+      source: this,
+      details: {
+        type: "editing",
+        data
+      }
+    });
+  }
+  async #download(isFromUI = false) {
+    if (isFromUI) {
+      await this.#mlManager.downloadModel("altText");
+      this.#setPref("enableGuessAltText", true);
+      this.#mlManager.toggleService("altText", true);
+      this.#setPref("enableAltTextModelDownload", true);
+    }
+  }
+  async #delete(isFromUI = false) {
+    if (isFromUI) {
+      await this.#mlManager.deleteModel("altText");
+      this.#setPref("enableGuessAltText", false);
+      this.#setPref("enableAltTextModelDownload", false);
+    }
+    this.#createModelButton.setAttribute("aria-pressed", false);
+  }
+  async open({
+    enableGuessAltText,
+    enableNewAltTextWhenAddingImage
+  }) {
+    const {
+      enableAltTextModelDownload
+    } = this.#mlManager;
+    this.#createModelButton.setAttribute("aria-pressed", enableAltTextModelDownload && enableGuessAltText);
+    this.#showAltTextDialogButton.setAttribute("aria-pressed", enableNewAltTextWhenAddingImage);
+    await this.#overlayManager.open(this.#dialog);
+    this.#reportTelemetry({
+      type: "stamp",
+      action: "pdfjs.image.alt_text.settings_displayed"
+    });
+  }
+  #togglePref(name, {
+    target
+  }) {
+    const checked = target.getAttribute("aria-pressed") !== "true";
+    this.#setPref(name, checked);
+    target.setAttribute("aria-pressed", checked);
+    return checked;
+  }
+  #setPref(name, value) {
+    this.#eventBus.dispatch("setpreference", {
+      source: this,
+      name,
+      value
+    });
+  }
+  #finish() {
+    this.#overlayManager.closeIfActive(this.#dialog);
+  }
+}
+
+;// ./web/alt_text_manager.js
+
+
+class AltTextManager {
+  #clickAC = null;
+  #currentEditor = null;
+  #cancelButton;
+  #dialog;
+  #eventBus;
+  #hasUsedPointer = false;
+  #optionDescription;
+  #optionDecorative;
+  #overlayManager;
+  #saveButton;
+  #textarea;
+  #uiManager;
+  #previousAltText = null;
+  #resizeAC = null;
+  #svgElement = null;
+  #rectElement = null;
+  #container;
+  #telemetryData = null;
+  constructor({
+    dialog,
+    optionDescription,
+    optionDecorative,
+    textarea,
+    cancelButton,
+    saveButton
+  }, container, overlayManager, eventBus) {
+    this.#dialog = dialog;
+    this.#optionDescription = optionDescription;
+    this.#optionDecorative = optionDecorative;
+    this.#textarea = textarea;
+    this.#cancelButton = cancelButton;
+    this.#saveButton = saveButton;
+    this.#overlayManager = overlayManager;
+    this.#eventBus = eventBus;
+    this.#container = container;
+    const onUpdateUIState = this.#updateUIState.bind(this);
+    dialog.addEventListener("close", this.#close.bind(this));
+    dialog.addEventListener("contextmenu", event => {
+      if (event.target !== this.#textarea) {
+        event.preventDefault();
+      }
+    });
+    cancelButton.addEventListener("click", this.#finish.bind(this));
+    saveButton.addEventListener("click", this.#save.bind(this));
+    optionDescription.addEventListener("change", onUpdateUIState);
+    optionDecorative.addEventListener("change", onUpdateUIState);
+    textarea.addEventListener("keydown", e => {
+      if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) {
+        this.#save();
+      }
+    });
+    this.#overlayManager.register(dialog);
+  }
+  #createSVGElement() {
+    if (this.#svgElement) {
+      return;
+    }
+    const svgFactory = new DOMSVGFactory();
+    const svg = this.#svgElement = svgFactory.createElement("svg");
+    svg.setAttribute("width", "0");
+    svg.setAttribute("height", "0");
+    const defs = svgFactory.createElement("defs");
+    svg.append(defs);
+    const mask = svgFactory.createElement("mask");
+    defs.append(mask);
+    mask.setAttribute("id", "alttext-manager-mask");
+    mask.setAttribute("maskContentUnits", "objectBoundingBox");
+    let rect = svgFactory.createElement("rect");
+    mask.append(rect);
+    rect.setAttribute("fill", "white");
+    rect.setAttribute("width", "1");
+    rect.setAttribute("height", "1");
+    rect.setAttribute("x", "0");
+    rect.setAttribute("y", "0");
+    rect = this.#rectElement = svgFactory.createElement("rect");
+    mask.append(rect);
+    rect.setAttribute("fill", "black");
+    this.#dialog.append(svg);
+  }
+  async editAltText(uiManager, editor) {
+    if (this.#currentEditor || !editor) {
+      return;
+    }
+    this.#createSVGElement();
+    this.#hasUsedPointer = false;
+    this.#clickAC = new AbortController();
+    const clickOpts = {
+        signal: this.#clickAC.signal
+      },
+      onClick = this.#onClick.bind(this);
+    for (const element of [this.#optionDescription, this.#optionDecorative, this.#textarea, this.#saveButton, this.#cancelButton]) {
+      element.addEventListener("click", onClick, clickOpts);
+    }
+    const {
+      altText,
+      decorative
+    } = editor.altTextData;
+    if (decorative === true) {
+      this.#optionDecorative.checked = true;
+      this.#optionDescription.checked = false;
+    } else {
+      this.#optionDecorative.checked = false;
+      this.#optionDescription.checked = true;
+    }
+    this.#previousAltText = this.#textarea.value = altText?.trim() || "";
+    this.#updateUIState();
+    this.#currentEditor = editor;
+    this.#uiManager = uiManager;
+    this.#uiManager.removeEditListeners();
+    this.#resizeAC = new AbortController();
+    this.#eventBus.on("resize", this.#setPosition.bind(this), {
+      signal: this.#resizeAC.signal,
+      ...internalOpt
+    });
+    try {
+      await this.#overlayManager.open(this.#dialog);
+      this.#setPosition();
+    } catch (ex) {
+      this.#close();
+      throw ex;
+    }
+  }
+  #setPosition() {
+    if (!this.#currentEditor) {
+      return;
+    }
+    const dialog = this.#dialog;
+    const {
+      style
+    } = dialog;
+    const {
+      x: containerX,
+      y: containerY,
+      width: containerW,
+      height: containerH
+    } = this.#container.getBoundingClientRect();
+    const {
+      innerWidth: windowW,
+      innerHeight: windowH
+    } = window;
+    const {
+      width: dialogW,
+      height: dialogH
+    } = dialog.getBoundingClientRect();
+    const {
+      x,
+      y,
+      width,
+      height
+    } = this.#currentEditor.getClientDimensions();
+    const MARGIN = 10;
+    const isLTR = this.#uiManager.direction === "ltr";
+    const xs = Math.max(x, containerX);
+    const xe = Math.min(x + width, containerX + containerW);
+    const ys = Math.max(y, containerY);
+    const ye = Math.min(y + height, containerY + containerH);
+    this.#rectElement.setAttribute("width", `${(xe - xs) / windowW}`);
+    this.#rectElement.setAttribute("height", `${(ye - ys) / windowH}`);
+    this.#rectElement.setAttribute("x", `${xs / windowW}`);
+    this.#rectElement.setAttribute("y", `${ys / windowH}`);
+    let left = null;
+    let top = Math.max(y, 0);
+    top += Math.min(windowH - (top + dialogH), 0);
+    if (isLTR) {
+      if (x + width + MARGIN + dialogW < windowW) {
+        left = x + width + MARGIN;
+      } else if (x > dialogW + MARGIN) {
+        left = x - dialogW - MARGIN;
+      }
+    } else if (x > dialogW + MARGIN) {
+      left = x - dialogW - MARGIN;
+    } else if (x + width + MARGIN + dialogW < windowW) {
+      left = x + width + MARGIN;
+    }
+    if (left === null) {
+      top = null;
+      left = Math.max(x, 0);
+      left += Math.min(windowW - (left + dialogW), 0);
+      if (y > dialogH + MARGIN) {
+        top = y - dialogH - MARGIN;
+      } else if (y + height + MARGIN + dialogH < windowH) {
+        top = y + height + MARGIN;
+      }
+    }
+    if (top !== null) {
+      dialog.classList.add("positioned");
+      if (isLTR) {
+        style.left = `${left}px`;
+      } else {
+        style.right = `${windowW - left - dialogW}px`;
+      }
+      style.top = `${top}px`;
+    } else {
+      dialog.classList.remove("positioned");
+      style.left = "";
+      style.top = "";
+    }
+  }
+  #finish() {
+    this.#overlayManager.closeIfActive(this.#dialog);
+  }
+  #close() {
+    this.#currentEditor._reportTelemetry(this.#telemetryData || {
+      action: "alt_text_cancel",
+      alt_text_keyboard: !this.#hasUsedPointer
+    });
+    this.#telemetryData = null;
+    this.#removeOnClickListeners();
+    this.#uiManager?.addEditListeners();
+    this.#resizeAC?.abort();
+    this.#resizeAC = null;
+    this.#currentEditor.altTextFinish();
+    this.#currentEditor = null;
+    this.#uiManager = null;
+  }
+  #updateUIState() {
+    this.#textarea.disabled = this.#optionDecorative.checked;
+  }
+  #save() {
+    const altText = this.#textarea.value.trim();
+    const decorative = this.#optionDecorative.checked;
+    this.#currentEditor.altTextData = {
+      altText,
+      decorative
+    };
+    this.#telemetryData = {
+      action: "alt_text_save",
+      alt_text_description: !!altText,
+      alt_text_edit: !!this.#previousAltText && this.#previousAltText !== altText,
+      alt_text_decorative: decorative,
+      alt_text_keyboard: !this.#hasUsedPointer
+    };
+    this.#finish();
+  }
+  #onClick(evt) {
+    if (evt.detail === 0) {
+      return;
+    }
+    this.#hasUsedPointer = true;
+    this.#removeOnClickListeners();
+  }
+  #removeOnClickListeners() {
+    this.#clickAC?.abort();
+    this.#clickAC = null;
+  }
+  destroy() {
+    this.#uiManager = null;
+    this.#finish();
+    this.#svgElement?.remove();
+    this.#svgElement = this.#rectElement = null;
+  }
+}
+
+;// ./web/annotation_editor_params.js
+
+
+class AnnotationEditorParams {
+  constructor(options, eventBus) {
+    this.eventBus = eventBus;
+    this.#bindListeners(options);
+  }
+  #bindListeners({
+    editorFreeTextFontSize,
+    editorFreeTextColor,
+    editorInkColor,
+    editorInkThickness,
+    editorInkOpacity,
+    editorStampAddImage,
+    editorFreeHighlightThickness,
+    editorHighlightShowAll,
+    editorSignatureAddSignature
+  }) {
+    const {
+      eventBus
+    } = this;
+    const dispatchEvent = (typeStr, value) => {
+      eventBus.dispatch("switchannotationeditorparams", {
+        source: this,
+        type: AnnotationEditorParamsType[typeStr],
+        value
+      });
+    };
+    editorFreeTextFontSize.addEventListener("input", function () {
+      dispatchEvent("FREETEXT_SIZE", this.valueAsNumber);
+    });
+    editorFreeTextColor.addEventListener("input", function () {
+      dispatchEvent("FREETEXT_COLOR", this.value);
+    });
+    let updateInkColor, updateInkOpacity;
+    if (FeatureTest.isAlphaColorInputSupported) {
+      editorInkColor.setAttribute("alpha", "");
+      editorInkOpacity.closest(".editorParamsSetter").remove();
+      let currentInkColor = "#000000";
+      let currentInkOpacity = 1;
+      editorInkColor.addEventListener("input", function () {
+        const rgba = getRGBA(this.value);
+        if (!rgba) {
+          return;
+        }
+        const [r, g, b, opacity] = rgba;
+        const hex = Util.makeHexColor(r, g, b);
+        currentInkColor = hex;
+        currentInkOpacity = opacity;
+        dispatchEvent("INK_COLOR_AND_OPACITY", {
+          color: hex,
+          opacity
+        });
+      });
+      updateInkColor = value => {
+        currentInkColor = value;
+        const alphaHex = Util.hexNums[Math.round(currentInkOpacity * 255)];
+        editorInkColor.value = currentInkColor + alphaHex;
+      };
+      updateInkOpacity = value => {
+        currentInkOpacity = value;
+        const alphaHex = Util.hexNums[Math.round(currentInkOpacity * 255)];
+        editorInkColor.value = currentInkColor + alphaHex;
+      };
+    } else {
+      editorInkColor.addEventListener("input", function () {
+        dispatchEvent("INK_COLOR", this.value);
+      });
+      editorInkOpacity.addEventListener("input", function () {
+        dispatchEvent("INK_OPACITY", this.valueAsNumber);
+      });
+      updateInkColor = value => {
+        editorInkColor.value = value;
+      };
+      updateInkOpacity = value => {
+        editorInkOpacity.value = value;
+      };
+    }
+    editorInkThickness.addEventListener("input", function () {
+      dispatchEvent("INK_THICKNESS", this.valueAsNumber);
+    });
+    editorStampAddImage.addEventListener("click", () => {
+      eventBus.dispatch("reporttelemetry", {
+        source: this,
+        details: {
+          type: "editing",
+          data: {
+            action: "pdfjs.image.add_image_click"
+          }
+        }
+      });
+      dispatchEvent("CREATE");
+    });
+    editorFreeHighlightThickness.addEventListener("input", function () {
+      dispatchEvent("HIGHLIGHT_THICKNESS", this.valueAsNumber);
+    });
+    editorHighlightShowAll.addEventListener("click", function () {
+      const checked = this.getAttribute("aria-pressed") === "true";
+      this.setAttribute("aria-pressed", !checked);
+      dispatchEvent("HIGHLIGHT_SHOW_ALL", !checked);
+    });
+    editorSignatureAddSignature.addEventListener("click", () => {
+      dispatchEvent("CREATE");
+    });
+    eventBus.on("annotationeditorparamschanged", evt => {
+      for (const [type, value] of evt.details) {
+        switch (type) {
+          case AnnotationEditorParamsType.FREETEXT_SIZE:
+            editorFreeTextFontSize.value = value;
+            break;
+          case AnnotationEditorParamsType.FREETEXT_COLOR:
+            editorFreeTextColor.value = value;
+            break;
+          case AnnotationEditorParamsType.INK_COLOR:
+            updateInkColor(value);
+            break;
+          case AnnotationEditorParamsType.INK_THICKNESS:
+            editorInkThickness.value = value;
+            break;
+          case AnnotationEditorParamsType.INK_OPACITY:
+            updateInkOpacity(value);
+            break;
+          case AnnotationEditorParamsType.HIGHLIGHT_COLOR:
+            eventBus.dispatch("mainhighlightcolorpickerupdatecolor", {
+              source: this,
+              value
+            });
+            break;
+          case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:
+            editorFreeHighlightThickness.value = value;
+            break;
+          case AnnotationEditorParamsType.HIGHLIGHT_FREE:
+            editorFreeHighlightThickness.disabled = !value;
+            break;
+          case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:
+            editorHighlightShowAll.setAttribute("aria-pressed", value);
+            break;
+        }
+      }
+    }, internalOpt);
+  }
+}
+
+;// ./web/caret_browsing.js
+const PRECISION = 1e-1;
+class CaretBrowsingMode {
+  #mainContainer;
+  #toolBarHeight = 0;
+  #viewerContainer;
+  constructor(abortSignal, mainContainer, viewerContainer, toolbarContainer) {
+    this.#mainContainer = mainContainer;
+    this.#viewerContainer = viewerContainer;
+    if (!toolbarContainer) {
+      return;
+    }
+    this.#toolBarHeight = toolbarContainer.getBoundingClientRect().height;
+    const toolbarObserver = new ResizeObserver(entries => {
+      for (const entry of entries) {
+        if (entry.target === toolbarContainer) {
+          this.#toolBarHeight = Math.floor(entry.borderBoxSize[0].blockSize);
+          break;
+        }
+      }
+    });
+    toolbarObserver.observe(toolbarContainer);
+    abortSignal.addEventListener("abort", () => toolbarObserver.disconnect(), {
+      once: true
+    });
+  }
+  #isOnSameLine(rect1, rect2) {
+    const top1 = rect1.y;
+    const bot1 = rect1.bottom;
+    const mid1 = rect1.y + rect1.height / 2;
+    const top2 = rect2.y;
+    const bot2 = rect2.bottom;
+    const mid2 = rect2.y + rect2.height / 2;
+    return top1 <= mid2 && mid2 <= bot1 || top2 <= mid1 && mid1 <= bot2;
+  }
+  #isUnderOver(rect, x, y, isUp) {
+    const midY = rect.y + rect.height / 2;
+    return (isUp ? y >= midY : y <= midY) && rect.x - PRECISION <= x && x <= rect.right + PRECISION;
+  }
+  #isVisible(rect) {
+    return rect.top >= this.#toolBarHeight && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth);
+  }
+  #getCaretPosition(selection, isUp) {
+    const {
+      focusNode,
+      focusOffset
+    } = selection;
+    const range = document.createRange();
+    range.setStart(focusNode, focusOffset);
+    range.setEnd(focusNode, focusOffset);
+    const rect = range.getBoundingClientRect();
+    return [rect.x, isUp ? rect.top : rect.bottom];
+  }
+  static #caretPositionFromPoint(x, y) {
+    if (!document.caretPositionFromPoint) {
+      const {
+        startContainer: offsetNode,
+        startOffset: offset
+      } = document.caretRangeFromPoint(x, y);
+      return {
+        offsetNode,
+        offset
+      };
+    }
+    return document.caretPositionFromPoint(x, y);
+  }
+  #setCaretPositionHelper(selection, caretX, select, element, rect) {
+    rect ||= element.getBoundingClientRect();
+    if (caretX <= rect.x + PRECISION) {
+      if (select) {
+        selection.extend(element.firstChild, 0);
+      } else {
+        selection.setPosition(element.firstChild, 0);
+      }
+      return;
+    }
+    if (rect.right - PRECISION <= caretX) {
+      const {
+        lastChild
+      } = element;
+      if (select) {
+        selection.extend(lastChild, lastChild.length);
+      } else {
+        selection.setPosition(lastChild, lastChild.length);
+      }
+      return;
+    }
+    const midY = rect.y + rect.height / 2;
+    let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);
+    let parentElement = caretPosition.offsetNode?.parentElement;
+    if (parentElement && parentElement !== element) {
+      const elementsAtPoint = document.elementsFromPoint(caretX, midY);
+      const savedVisibilities = [];
+      for (const el of elementsAtPoint) {
+        if (el === element) {
+          break;
+        }
+        const {
+          style
+        } = el;
+        savedVisibilities.push([el, style.visibility]);
+        style.visibility = "hidden";
+      }
+      caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);
+      parentElement = caretPosition.offsetNode?.parentElement;
+      for (const [el, visibility] of savedVisibilities) {
+        el.style.visibility = visibility;
+      }
+    }
+    if (parentElement !== element) {
+      if (select) {
+        selection.extend(element.firstChild, 0);
+      } else {
+        selection.setPosition(element.firstChild, 0);
+      }
+      return;
+    }
+    if (select) {
+      selection.extend(caretPosition.offsetNode, caretPosition.offset);
+    } else {
+      selection.setPosition(caretPosition.offsetNode, caretPosition.offset);
+    }
+  }
+  #setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX) {
+    if (this.#isVisible(newLineElementRect)) {
+      this.#setCaretPositionHelper(selection, caretX, select, newLineElement, newLineElementRect);
+      return;
+    }
+    this.#mainContainer.addEventListener("scrollend", this.#setCaretPositionHelper.bind(this, selection, caretX, select, newLineElement, null), {
+      once: true
+    });
+    newLineElement.scrollIntoView();
+  }
+  #getNodeOnNextPage(textLayer, isUp) {
+    while (true) {
+      const page = textLayer.closest(".page");
+      const pageNumber = parseInt(page.getAttribute("data-page-number"), 10);
+      const nextPage = isUp ? pageNumber - 1 : pageNumber + 1;
+      textLayer = this.#viewerContainer.querySelector(`.page[data-page-number="${nextPage}"] .textLayer`);
+      if (!textLayer) {
+        return null;
+      }
+      const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT);
+      const node = isUp ? walker.lastChild() : walker.firstChild();
+      if (node) {
+        return node;
+      }
+    }
+  }
+  moveCaret(isUp, select) {
+    const selection = document.getSelection();
+    if (selection.rangeCount === 0) {
+      return;
+    }
+    const {
+      focusNode
+    } = selection;
+    const focusElement = focusNode.nodeType !== Node.ELEMENT_NODE ? focusNode.parentElement : focusNode;
+    const root = focusElement.closest(".textLayer");
+    if (!root) {
+      return;
+    }
+    const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
+    walker.currentNode = focusNode;
+    const focusRect = focusElement.getBoundingClientRect();
+    let newLineElement = null;
+    const nodeIterator = (isUp ? walker.previousSibling : walker.nextSibling).bind(walker);
+    while (nodeIterator()) {
+      const element = walker.currentNode.parentElement;
+      if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) {
+        newLineElement = element;
+        break;
+      }
+    }
+    if (!newLineElement) {
+      const node = this.#getNodeOnNextPage(root, isUp);
+      if (!node) {
+        return;
+      }
+      if (select) {
+        const lastNode = (isUp ? walker.firstChild() : walker.lastChild()) || focusNode;
+        selection.extend(lastNode, isUp ? 0 : lastNode.length);
+        const range = document.createRange();
+        range.setStart(node, isUp ? node.length : 0);
+        range.setEnd(node, isUp ? node.length : 0);
+        selection.addRange(range);
+        return;
+      }
+      const [caretX] = this.#getCaretPosition(selection, isUp);
+      const {
+        parentElement
+      } = node;
+      this.#setCaretPosition(select, selection, parentElement, parentElement.getBoundingClientRect(), caretX);
+      return;
+    }
+    const [caretX, caretY] = this.#getCaretPosition(selection, isUp);
+    const newLineElementRect = newLineElement.getBoundingClientRect();
+    if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) {
+      this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX);
+      return;
+    }
+    while (nodeIterator()) {
+      const element = walker.currentNode.parentElement;
+      const elementRect = element.getBoundingClientRect();
+      if (!this.#isOnSameLine(newLineElementRect, elementRect)) {
+        break;
+      }
+      if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) {
+        this.#setCaretPosition(select, selection, element, elementRect, caretX);
+        return;
+      }
+    }
+    this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX);
+  }
+}
+
+;// ./web/sidebar.js
+
+const RESIZE_TIMEOUT = 400;
+class Sidebar {
+  #initialWidth = 0;
+  #width = 0;
+  #coefficient;
+  #resizeTimeout = null;
+  #resizer;
+  #isResizerOnTheLeft;
+  #isKeyboardResizing = false;
+  #resizeObserver;
+  #prevX = 0;
+  constructor({
+    sidebar,
+    resizer,
+    toggleButton
+  }, ltr, isResizerOnTheLeft, globalAbortSignal) {
+    this._sidebar = sidebar;
+    this.#coefficient = ltr === isResizerOnTheLeft ? -1 : 1;
+    this.#resizer = resizer;
+    this.#isResizerOnTheLeft = isResizerOnTheLeft;
+    const style = window.getComputedStyle(sidebar);
+    this.#initialWidth = this.#width = parseFloat(style.getPropertyValue("--sidebar-width"));
+    resizer.ariaValueMin = parseFloat(style.getPropertyValue("--sidebar-min-width")) || 0;
+    resizer.ariaValueMax = parseFloat(style.getPropertyValue("--sidebar-max-width")) || Infinity;
+    resizer.ariaValueNow = this.#width;
+    this.#makeSidebarResizable();
+    toggleButton.addEventListener("click", this.toggle.bind(this));
+    this._isOpen = false;
+    sidebar.hidden = true;
+    globalAbortSignal?.addEventListener("abort", this.destroy.bind(this), {
+      once: true
+    });
+    this.#resizeObserver = new ResizeObserver(([{
+      borderBoxSize: [{
+        inlineSize
+      }]
+    }]) => {
+      if (!isNaN(this.#prevX)) {
+        this.#prevX += this.#coefficient * (inlineSize - this.#width);
+      }
+      this.#setWidth(inlineSize);
+    });
+    this.#resizeObserver.observe(sidebar);
+  }
+  #makeSidebarResizable() {
+    const sidebarStyle = this._sidebar.style;
+    let pointerMoveAC;
+    const cancelResize = () => {
+      this.#resizeTimeout = null;
+      this._sidebar.classList.remove("resizing");
+      pointerMoveAC?.abort();
+      pointerMoveAC = null;
+      this.#isKeyboardResizing = false;
+      this.onStopResizing();
+      this.#prevX = NaN;
+    };
+    this.#resizer.addEventListener("pointerdown", e => {
+      if (pointerMoveAC) {
+        cancelResize();
+        return;
+      }
+      this.onStartResizing();
+      const {
+        clientX
+      } = e;
+      stopEvent(e);
+      this.#prevX = clientX;
+      pointerMoveAC = new AbortController();
+      const {
+        signal
+      } = pointerMoveAC;
+      const sidebar = this._sidebar;
+      sidebar.classList.add("resizing");
+      const parentStyle = sidebar.parentElement.style;
+      parentStyle.minWidth = 0;
+      window.addEventListener("contextmenu", noContextMenu, {
+        signal
+      });
+      window.addEventListener("pointermove", ev => {
+        if (!pointerMoveAC || Math.abs(ev.clientX - this.#prevX) < 1) {
+          return;
+        }
+        stopEvent(ev);
+        sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - this.#prevX))}px`;
+      }, {
+        signal,
+        capture: true
+      });
+      window.addEventListener("blur", cancelResize, {
+        signal
+      });
+      window.addEventListener("pointerup", ev => {
+        if (pointerMoveAC) {
+          cancelResize();
+          stopEvent(ev);
+        }
+      }, {
+        signal
+      });
+    });
+    this.#resizer.addEventListener("keydown", e => {
+      const {
+        key
+      } = e;
+      const isArrowLeft = key === "ArrowLeft";
+      if (isArrowLeft || key === "ArrowRight") {
+        if (!this.#isKeyboardResizing) {
+          this._sidebar.classList.add("resizing");
+          this.#isKeyboardResizing = true;
+          this.onStartResizing();
+        }
+        const base = e.ctrlKey || e.metaKey ? 10 : 1;
+        const dx = base * (isArrowLeft ? -1 : 1);
+        clearTimeout(this.#resizeTimeout);
+        this.#resizeTimeout = setTimeout(cancelResize, RESIZE_TIMEOUT);
+        sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * dx)}px`;
+        stopEvent(e);
+      }
+    });
+  }
+  #setWidth(newWidth) {
+    this.#width = newWidth;
+    this.#resizer.ariaValueNow = Math.round(newWidth);
+    if (this.#isResizerOnTheLeft) {
+      this._sidebar.parentElement.style.insetInlineStart = `${(this.#initialWidth - newWidth).toFixed(3)}px`;
+    }
+    this.onResizing(newWidth);
+  }
+  get width() {
+    return this.#width;
+  }
+  set width(newWidth) {
+    this._sidebar.style.width = `${newWidth}px`;
+  }
+  onStartResizing() {}
+  onStopResizing() {}
+  onResizing(_newWidth) {}
+  toggle(visibility = !this._isOpen) {
+    this._sidebar.hidden = !(this._isOpen = visibility);
+  }
+  destroy() {
+    this.#resizeObserver?.disconnect();
+    this.#resizeObserver = null;
+  }
+}
+
+;// ./web/comment_manager.js
+
+
+
+class CommentManager {
+  #dialog;
+  #popup;
+  #sidebar;
+  static #hasForcedColors = null;
+  constructor(commentDialog, sidebar, eventBus, linkService, overlayManager, ltr, hasForcedColors, globalAbortSignal) {
+    const dateFormat = new Intl.DateTimeFormat(undefined, {
+      dateStyle: "long"
+    });
+    this.dialogElement = commentDialog.dialog;
+    this.#dialog = new CommentDialog(commentDialog, overlayManager, eventBus, ltr);
+    this.#popup = new CommentPopup(eventBus, dateFormat, ltr, this.dialogElement);
+    this.#sidebar = new CommentSidebar(sidebar, eventBus, linkService, this.#popup, dateFormat, ltr, globalAbortSignal);
+    this.#popup.sidebar = this.#sidebar;
+    CommentManager.#hasForcedColors = hasForcedColors;
+  }
+  setSidebarUiManager(uiManager) {
+    this.#sidebar.setUIManager(uiManager);
+  }
+  showSidebar(annotations) {
+    this.#sidebar.show(annotations);
+  }
+  hideSidebar() {
+    this.#sidebar.hide();
+  }
+  removeComments(ids) {
+    this.#sidebar.removeComments(ids);
+  }
+  selectComment(id) {
+    this.#sidebar.selectComment(null, id);
+  }
+  addComment(annotation) {
+    this.#sidebar.addComment(annotation);
+  }
+  updateComment(annotation) {
+    this.#sidebar.updateComment(annotation);
+  }
+  toggleCommentPopup(editor, isSelected, visibility, isEditable) {
+    if (isSelected) {
+      this.selectComment(editor.uid);
+    }
+    this.#popup.toggle(editor, isSelected, visibility, isEditable);
+  }
+  destroyPopup() {
+    this.#popup.destroy();
+  }
+  updatePopupColor(editor) {
+    this.#popup.updateColor(editor);
+  }
+  showDialog(uiManager, editor, posX, posY, options) {
+    return this.#dialog.open(uiManager, editor, posX, posY, options);
+  }
+  makeCommentColor(color, opacity) {
+    return CommentManager._makeCommentColor(color, opacity);
+  }
+  static _makeCommentColor(color, opacity) {
+    return this.#hasForcedColors ? null : findContrastColor(applyOpacity(color, opacity ?? 1), CSSConstants.commentForegroundColor);
+  }
+  destroy() {
+    this.#dialog.destroy();
+    this.#sidebar.hide();
+    this.#popup.destroy();
+  }
+}
+class CommentSidebar extends Sidebar {
+  #annotations = null;
+  #eventBus;
+  #boundCommentClick = this.#commentClick.bind(this);
+  #boundCommentKeydown = this.#commentKeydown.bind(this);
+  #closeButton;
+  #commentsList;
+  #commentCount;
+  #dateFormat;
+  #sidebarTitle;
+  #learnMoreUrl;
+  #linkService;
+  #popup;
+  #elementsToAnnotations = null;
+  #idsToElements = null;
+  #uiManager = null;
+  constructor({
+    learnMoreUrl,
+    sidebar,
+    sidebarResizer,
+    commentsList,
+    commentCount,
+    sidebarTitle,
+    closeButton,
+    commentToolbarButton
+  }, eventBus, linkService, popup, dateFormat, ltr, globalAbortSignal) {
+    super({
+      sidebar,
+      resizer: sidebarResizer,
+      toggleButton: commentToolbarButton
+    }, ltr, true, globalAbortSignal);
+    this.#sidebarTitle = sidebarTitle;
+    this.#commentsList = commentsList;
+    this.#commentCount = commentCount;
+    this.#learnMoreUrl = learnMoreUrl;
+    this.#linkService = linkService;
+    this.#closeButton = closeButton;
+    this.#popup = popup;
+    this.#dateFormat = dateFormat;
+    this.#eventBus = eventBus;
+    closeButton.addEventListener("click", () => {
+      eventBus.dispatch("switchannotationeditormode", {
+        source: this,
+        mode: AnnotationEditorType.NONE
+      });
+    });
+    const keyDownCallback = e => {
+      if (e.key === "ArrowDown" || e.key === "Home" || e.key === "F6") {
+        this.#commentsList.firstElementChild.focus();
+        stopEvent(e);
+      } else if (e.key === "ArrowUp" || e.key === "End") {
+        this.#commentsList.lastElementChild.focus();
+        stopEvent(e);
+      }
+    };
+    commentToolbarButton.addEventListener("keydown", keyDownCallback);
+    sidebar.addEventListener("keydown", keyDownCallback);
+  }
+  setUIManager(uiManager) {
+    this.#uiManager = uiManager;
+  }
+  show(annotations) {
+    this.#elementsToAnnotations = new WeakMap();
+    this.#idsToElements = new Map();
+    this.#annotations = annotations;
+    annotations.sort(this.#sortComments.bind(this));
+    if (annotations.length !== 0) {
+      const fragment = document.createDocumentFragment();
+      for (const annotation of annotations) {
+        fragment.append(this.#createCommentElement(annotation));
+      }
+      this.#setCommentsCount(fragment);
+      this.#commentsList.append(fragment);
+    } else {
+      this.#setCommentsCount();
+    }
+    this._sidebar.hidden = false;
+    this.#eventBus.dispatch("reporttelemetry", {
+      source: this,
+      details: {
+        type: "commentSidebar",
+        data: {
+          numberOfAnnotations: annotations.length
+        }
+      }
+    });
+  }
+  hide() {
+    this._sidebar.hidden = true;
+    this.#commentsList.replaceChildren();
+    this.#elementsToAnnotations = null;
+    this.#idsToElements = null;
+    this.#annotations = null;
+  }
+  removeComments(ids) {
+    if (ids.length === 0 || !this.#idsToElements) {
+      return;
+    }
+    if (new Set(this.#idsToElements.keys()).difference(new Set(ids)).size === 0) {
+      this.#removeAll();
+      return;
+    }
+    for (const id of ids) {
+      this.#removeComment(id);
+    }
+  }
+  focusComment(id) {
+    const element = this.#idsToElements.get(id);
+    if (!element) {
+      return;
+    }
+    this._sidebar.scrollTop = element.offsetTop - this._sidebar.offsetTop;
+    for (const el of this.#commentsList.children) {
+      el.classList.toggle("selected", el === element);
+    }
+  }
+  updateComment(annotation) {
+    if (!this.#idsToElements) {
+      return;
+    }
+    const {
+      id,
+      creationDate,
+      modificationDate,
+      richText,
+      contentsObj,
+      popupRef
+    } = annotation;
+    if (!popupRef || !richText && !contentsObj?.str) {
+      this.#removeComment(id);
+    }
+    const element = this.#idsToElements.get(id);
+    if (!element) {
+      return;
+    }
+    const prevAnnotation = this.#elementsToAnnotations.get(element);
+    let index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, prevAnnotation) >= 0);
+    if (index >= this.#annotations.length) {
+      return;
+    }
+    this.#setDate(element.firstElementChild, modificationDate || creationDate);
+    this.#setText(element.lastElementChild, richText, contentsObj);
+    this.#annotations.splice(index, 1);
+    index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0);
+    this.#annotations.splice(index, 0, annotation);
+    if (index >= this.#commentsList.children.length) {
+      this.#commentsList.append(element);
+    } else {
+      this.#commentsList.insertBefore(element, this.#commentsList.children[index]);
+    }
+  }
+  #removeComment(id) {
+    const element = this.#idsToElements?.get(id);
+    if (!element) {
+      return;
+    }
+    const annotation = this.#elementsToAnnotations.get(element);
+    const index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0);
+    if (index >= this.#annotations.length) {
+      return;
+    }
+    this.#annotations.splice(index, 1);
+    element.remove();
+    this.#idsToElements.delete(id);
+    this.#setCommentsCount();
+  }
+  #removeAll() {
+    this.#commentsList.replaceChildren();
+    this.#elementsToAnnotations = new WeakMap();
+    this.#idsToElements.clear();
+    this.#annotations.length = 0;
+    this.#setCommentsCount();
+  }
+  selectComment(element, id = null) {
+    if (!this.#idsToElements) {
+      return;
+    }
+    const hasNoElement = !element;
+    element ||= this.#idsToElements.get(id);
+    for (const el of this.#commentsList.children) {
+      el.classList.toggle("selected", el === element);
+    }
+    if (hasNoElement) {
+      element?.scrollIntoView({
+        behavior: "instant",
+        block: "center"
+      });
+    }
+  }
+  addComment(annotation) {
+    if (this.#idsToElements?.has(annotation.id)) {
+      return;
+    }
+    const {
+      popupRef,
+      contentsObj
+    } = annotation;
+    if (!popupRef || !contentsObj?.str) {
+      return;
+    }
+    const commentItem = this.#createCommentElement(annotation);
+    if (this.#annotations.length === 0) {
+      this.#commentsList.replaceChildren(commentItem);
+      this.#annotations.push(annotation);
+      this.#setCommentsCount();
+      return;
+    }
+    const index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0);
+    this.#annotations.splice(index, 0, annotation);
+    if (index >= this.#commentsList.children.length) {
+      this.#commentsList.append(commentItem);
+    } else {
+      this.#commentsList.insertBefore(commentItem, this.#commentsList.children[index]);
+    }
+    this.#setCommentsCount();
+  }
+  #setCommentsCount(container = this.#commentsList) {
+    const count = this.#idsToElements.size;
+    this.#sidebarTitle.setAttribute("data-l10n-args", JSON.stringify({
+      count
+    }));
+    this.#commentCount.textContent = count;
+    if (count === 0) {
+      container.append(this.#createZeroCommentElement());
+    }
+  }
+  #createZeroCommentElement() {
+    const commentItem = document.createElement("li");
+    commentItem.classList.add("sidebarComment", "noComments");
+    const textDiv = document.createElement("div");
+    textDiv.className = "sidebarCommentText";
+    textDiv.setAttribute("data-l10n-id", "pdfjs-editor-comments-sidebar-no-comments1");
+    commentItem.append(textDiv);
+    if (this.#learnMoreUrl) {
+      const a = document.createElement("a");
+      a.setAttribute("data-l10n-id", "pdfjs-editor-comments-sidebar-no-comments-link");
+      a.href = this.#learnMoreUrl;
+      a.target = "_blank";
+      a.rel = "noopener noreferrer";
+      commentItem.append(a);
+    }
+    return commentItem;
+  }
+  #setDate(element, date) {
+    date = PDFDateString.toDateObject(date);
+    element.dateTime = date.toISOString();
+    element.textContent = this.#dateFormat.format(date);
+  }
+  #setText(element, richText, contentsObj) {
+    element.replaceChildren();
+    const html = richText?.str && (!contentsObj?.str || richText.str === contentsObj.str) ? richText.html : contentsObj?.str;
+    renderRichText({
+      html,
+      dir: contentsObj?.dir || "auto",
+      className: "richText"
+    }, element);
+  }
+  #createCommentElement(annotation) {
+    const {
+      id,
+      creationDate,
+      modificationDate,
+      richText,
+      contentsObj,
+      color,
+      opacity
+    } = annotation;
+    const commentItem = document.createElement("li");
+    commentItem.role = "button";
+    commentItem.className = "sidebarComment";
+    commentItem.tabIndex = -1;
+    commentItem.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || "";
+    const dateDiv = document.createElement("time");
+    this.#setDate(dateDiv, modificationDate || creationDate);
+    const textDiv = document.createElement("div");
+    textDiv.className = "sidebarCommentText";
+    this.#setText(textDiv, richText, contentsObj);
+    commentItem.append(dateDiv, textDiv);
+    commentItem.addEventListener("click", this.#boundCommentClick);
+    commentItem.addEventListener("keydown", this.#boundCommentKeydown);
+    this.#elementsToAnnotations.set(commentItem, annotation);
+    this.#idsToElements.set(id, commentItem);
+    return commentItem;
+  }
+  async #commentClick({
+    currentTarget
+  }) {
+    if (currentTarget.classList.contains("selected")) {
+      currentTarget.classList.remove("selected");
+      this.#popup._hide();
+      return;
+    }
+    const annotation = this.#elementsToAnnotations.get(currentTarget);
+    if (!annotation) {
+      return;
+    }
+    this.#popup._hide();
+    const {
+      id,
+      pageIndex,
+      rect
+    } = annotation;
+    const pageNumber = pageIndex + 1;
+    const pageVisiblePromise = this.#uiManager?.waitForEditorsRendered(pageNumber);
+    this.#linkService?.goToXY(pageNumber, rect[0], rect[3], {
+      center: "both"
+    });
+    this.selectComment(currentTarget);
+    await pageVisiblePromise;
+    this.#uiManager?.selectComment(pageIndex, id);
+  }
+  #commentKeydown(e) {
+    const {
+      key,
+      currentTarget
+    } = e;
+    switch (key) {
+      case "ArrowDown":
+        (currentTarget.nextElementSibling || this.#commentsList.firstElementChild).focus();
+        stopEvent(e);
+        break;
+      case "ArrowUp":
+        (currentTarget.previousElementSibling || this.#commentsList.lastElementChild).focus();
+        stopEvent(e);
+        break;
+      case "Home":
+        this.#commentsList.firstElementChild.focus();
+        stopEvent(e);
+        break;
+      case "End":
+        this.#commentsList.lastElementChild.focus();
+        stopEvent(e);
+        break;
+      case "Enter":
+      case " ":
+        this.#commentClick(e);
+        stopEvent(e);
+        break;
+      case "ShiftTab":
+        this.#closeButton.focus();
+        stopEvent(e);
+        break;
+    }
+  }
+  #sortComments(a, b) {
+    const dateA = PDFDateString.toDateObject(a.modificationDate || a.creationDate);
+    const dateB = PDFDateString.toDateObject(b.modificationDate || b.creationDate);
+    if (dateA !== dateB) {
+      if (dateA !== null && dateB !== null) {
+        return dateB - dateA;
+      }
+      return dateA !== null ? -1 : 1;
+    }
+    if (a.pageIndex !== b.pageIndex) {
+      return a.pageIndex - b.pageIndex;
+    }
+    if (a.rect[3] !== b.rect[3]) {
+      return b.rect[3] - a.rect[3];
+    }
+    if (a.rect[0] !== b.rect[0]) {
+      return a.rect[0] - b.rect[0];
+    }
+    if (a.rect[1] !== b.rect[1]) {
+      return b.rect[1] - a.rect[1];
+    }
+    if (a.rect[2] !== b.rect[2]) {
+      return a.rect[2] - b.rect[2];
+    }
+    return a.id.localeCompare(b.id);
+  }
+}
+class CommentDialog {
+  #dialog;
+  #editor;
+  #overlayManager;
+  #previousText = "";
+  #commentText = "";
+  #textInput;
+  #title;
+  #saveButton;
+  #uiManager;
+  #prevDragX = 0;
+  #prevDragY = 0;
+  #dialogX = 0;
+  #dialogY = 0;
+  #isLTR;
+  #eventBus;
+  constructor({
+    dialog,
+    toolbar,
+    title,
+    textInput,
+    cancelButton,
+    saveButton
+  }, overlayManager, eventBus, ltr) {
+    this.#dialog = dialog;
+    this.#textInput = textInput;
+    this.#overlayManager = overlayManager;
+    this.#eventBus = eventBus;
+    this.#saveButton = saveButton;
+    this.#title = title;
+    this.#isLTR = ltr;
+    const finishBound = this.#finish.bind(this);
+    dialog.addEventListener("close", finishBound);
+    dialog.addEventListener("contextmenu", e => {
+      if (e.target !== this.#textInput) {
+        e.preventDefault();
+      }
+    });
+    cancelButton.addEventListener("click", finishBound);
+    saveButton.addEventListener("click", this.#save.bind(this));
+    textInput.addEventListener("input", () => {
+      saveButton.disabled = textInput.value === this.#previousText;
+    });
+    textInput.addEventListener("keydown", e => {
+      if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) {
+        this.#save();
+      }
+    });
+    let pointerMoveAC;
+    const cancelDrag = () => {
+      dialog.classList.remove("dragging");
+      pointerMoveAC?.abort();
+      pointerMoveAC = null;
+    };
+    toolbar.addEventListener("pointerdown", e => {
+      if (pointerMoveAC) {
+        cancelDrag();
+        return;
+      }
+      const {
+        clientX,
+        clientY
+      } = e;
+      stopEvent(e);
+      this.#prevDragX = clientX;
+      this.#prevDragY = clientY;
+      pointerMoveAC = new AbortController();
+      const {
+        signal
+      } = pointerMoveAC;
+      const {
+        innerHeight,
+        innerWidth
+      } = window;
+      dialog.classList.add("dragging");
+      window.addEventListener("pointermove", ev => {
+        if (!pointerMoveAC) {
+          return;
+        }
+        const {
+          clientX: x,
+          clientY: y
+        } = ev;
+        this.#setPosition(this.#dialogX + (x - this.#prevDragX) / innerWidth, this.#dialogY + (y - this.#prevDragY) / innerHeight);
+        this.#prevDragX = x;
+        this.#prevDragY = y;
+        stopEvent(ev);
+      }, {
+        signal
+      });
+      window.addEventListener("blur", cancelDrag, {
+        signal
+      });
+      window.addEventListener("pointerup", ev => {
+        if (pointerMoveAC) {
+          cancelDrag();
+          stopEvent(ev);
+        }
+      }, {
+        signal
+      });
+    });
+    overlayManager.register(dialog);
+  }
+  async open(uiManager, editor, posX, posY, options) {
+    if (editor) {
+      this.#uiManager = uiManager;
+      this.#editor = editor;
+    }
+    const {
+      contentsObj: {
+        str
+      },
+      color,
+      opacity
+    } = editor.getData();
+    const {
+      style: dialogStyle
+    } = this.#dialog;
+    if (color) {
+      dialogStyle.backgroundColor = CommentManager._makeCommentColor(color, opacity);
+      dialogStyle.borderColor = Util.makeHexColor(...color);
+    } else {
+      dialogStyle.backgroundColor = dialogStyle.borderColor = "";
+    }
+    this.#commentText = str || "";
+    const textInput = this.#textInput;
+    textInput.value = this.#previousText = this.#commentText;
+    if (str) {
+      this.#title.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-title-when-editing");
+      this.#saveButton.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-save-button-when-editing");
+    } else {
+      this.#title.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-title-when-adding");
+      this.#saveButton.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-save-button-when-adding");
+    }
+    if (options?.height) {
+      textInput.style.height = `${options.height}px`;
+    }
+    this.#uiManager?.removeEditListeners();
+    this.#saveButton.disabled = true;
+    const parentDimensions = options?.parentDimensions;
+    const {
+      innerHeight,
+      innerWidth
+    } = window;
+    if (editor.hasDefaultPopupPosition()) {
+      const {
+        dialogWidth,
+        dialogHeight
+      } = this._dialogDimensions;
+      if (parentDimensions) {
+        if (this.#isLTR && posX + dialogWidth > Math.min(parentDimensions.x + parentDimensions.width, innerWidth)) {
+          const buttonWidth = this.#editor.commentButtonWidth;
+          posX -= dialogWidth - buttonWidth * parentDimensions.width;
+        } else if (!this.#isLTR) {
+          const buttonWidth = this.#editor.commentButtonWidth * parentDimensions.width;
+          if (posX - dialogWidth < Math.max(0, parentDimensions.x)) {
+            posX = Math.max(0, posX);
+          } else {
+            posX -= dialogWidth - buttonWidth;
+          }
+        }
+      }
+      const height = Math.max(dialogHeight, options?.height || 0);
+      if (posY + height > innerHeight) {
+        posY = innerHeight - height;
+      }
+      if (posY < 0) {
+        posY = 0;
+      }
+    }
+    posX = MathClamp(posX / innerWidth, 0, 1);
+    posY = MathClamp(posY / innerHeight, 0, 1);
+    this.#setPosition(posX, posY);
+    await this.#overlayManager.open(this.#dialog);
+    textInput.focus();
+  }
+  async #save() {
+    this.#editor.comment = this.#textInput.value;
+    this.#finish();
+  }
+  get _dialogDimensions() {
+    const dialog = this.#dialog;
+    const {
+      style
+    } = dialog;
+    style.opacity = "0";
+    style.display = "block";
+    const {
+      width,
+      height
+    } = dialog.getBoundingClientRect();
+    style.opacity = style.display = "";
+    return shadow(this, "_dialogDimensions", {
+      dialogWidth: width,
+      dialogHeight: height
+    });
+  }
+  #setPosition(x, y) {
+    this.#dialogX = x;
+    this.#dialogY = y;
+    const {
+      style
+    } = this.#dialog;
+    style.left = `${100 * x}%`;
+    style.top = `${100 * y}%`;
+  }
+  #finish() {
+    if (!this.#editor) {
+      return;
+    }
+    const edited = this.#textInput.value !== this.#commentText;
+    this.#eventBus.dispatch("reporttelemetry", {
+      source: this,
+      details: {
+        type: "comment",
+        data: {
+          edited
+        }
+      }
+    });
+    this.#editor?.focusCommentButton();
+    this.#editor = null;
+    this.#textInput.value = this.#previousText = this.#commentText = "";
+    this.#overlayManager.closeIfActive(this.#dialog);
+    this.#textInput.style.height = "";
+    this.#uiManager?.addEditListeners();
+    this.#uiManager = null;
+  }
+  destroy() {
+    this.#uiManager = null;
+    this.#editor = null;
+    this.#finish();
+  }
+}
+class CommentPopup {
+  #buttonsContainer = null;
+  #eventBus;
+  #commentDialog;
+  #dateFormat;
+  #editor = null;
+  #isLTR;
+  #container = null;
+  #text = null;
+  #time = null;
+  #prevDragX = 0;
+  #prevDragY = 0;
+  #posX = 0;
+  #posY = 0;
+  #previousFocusedElement = null;
+  #selected = false;
+  #visible = false;
+  constructor(eventBus, dateFormat, ltr, commentDialog) {
+    this.#eventBus = eventBus;
+    this.#dateFormat = dateFormat;
+    this.#isLTR = ltr;
+    this.#commentDialog = commentDialog;
+    this.sidebar = null;
+  }
+  get _popupWidth() {
+    const container = this.#createPopup();
+    const {
+      style
+    } = container;
+    style.opacity = "0";
+    style.display = "block";
+    document.body.append(container);
+    const width = container.getBoundingClientRect().width;
+    container.remove();
+    style.opacity = style.display = "";
+    return shadow(this, "_popupWidth", width);
+  }
+  #createPopup() {
+    if (this.#container) {
+      return this.#container;
+    }
+    const container = this.#container = document.createElement("div");
+    container.className = "commentPopup";
+    container.id = "commentPopup";
+    container.tabIndex = -1;
+    container.role = "dialog";
+    container.ariaModal = "false";
+    container.addEventListener("contextmenu", noContextMenu);
+    container.addEventListener("keydown", e => {
+      if (e.key === "Escape") {
+        this.toggle(this.#editor, true, false);
+        this.#previousFocusedElement?.focus();
+        stopEvent(e);
+      }
+    });
+    container.addEventListener("click", () => {
+      container.focus();
+    });
+    const top = document.createElement("div");
+    top.className = "commentPopupTop";
+    const time = this.#time = document.createElement("time");
+    time.className = "commentPopupTime";
+    const buttons = this.#buttonsContainer = document.createElement("div");
+    buttons.className = "commentPopupButtons";
+    const edit = document.createElement("button");
+    edit.classList.add("commentPopupEdit", "toolbarButton");
+    edit.tabIndex = 0;
+    edit.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-popup-button");
+    edit.ariaHasPopup = "dialog";
+    edit.ariaControlsElements = [this.#commentDialog];
+    const editLabel = document.createElement("span");
+    editLabel.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-popup-button-label");
+    edit.append(editLabel);
+    edit.addEventListener("click", () => {
+      const editor = this.#editor;
+      const height = parseFloat(getComputedStyle(this.#text).height);
+      this.toggle(editor, true, false);
+      editor.editComment({
+        height
+      });
+    });
+    edit.addEventListener("contextmenu", noContextMenu);
+    const del = document.createElement("button");
+    del.classList.add("commentPopupDelete", "toolbarButton");
+    del.tabIndex = 0;
+    del.setAttribute("data-l10n-id", "pdfjs-editor-delete-comment-popup-button");
+    const delLabel = document.createElement("span");
+    delLabel.setAttribute("data-l10n-id", "pdfjs-editor-delete-comment-popup-button-label");
+    del.append(delLabel);
+    del.addEventListener("click", () => {
+      this.#eventBus.dispatch("reporttelemetry", {
+        source: this,
+        details: {
+          type: "comment",
+          data: {
+            deleted: true
+          }
+        }
+      });
+      const editor = this.#editor;
+      const savedData = editor.comment;
+      this.destroy();
+      if (savedData?.text) {
+        editor._uiManager.deleteComment(editor, savedData);
+      } else {
+        editor.comment = null;
+      }
+      editor.focus();
+    });
+    del.addEventListener("contextmenu", noContextMenu);
+    buttons.append(edit, del);
+    top.append(time, buttons);
+    const separator = document.createElement("hr");
+    const text = this.#text = document.createElement("div");
+    text.className = "commentPopupText";
+    container.append(top, separator, text);
+    let pointerMoveAC;
+    const cancelDrag = () => {
+      container.classList.remove("dragging");
+      pointerMoveAC?.abort();
+      pointerMoveAC = null;
+    };
+    top.addEventListener("pointerdown", e => {
+      if (pointerMoveAC) {
+        cancelDrag();
+        return;
+      }
+      const {
+        target,
+        clientX,
+        clientY
+      } = e;
+      if (buttons.contains(target)) {
+        return;
+      }
+      stopEvent(e);
+      const {
+        width: parentWidth,
+        height: parentHeight
+      } = this.#editor.parentBoundingClientRect;
+      this.#prevDragX = clientX;
+      this.#prevDragY = clientY;
+      pointerMoveAC = new AbortController();
+      const {
+        signal
+      } = pointerMoveAC;
+      container.classList.add("dragging");
+      window.addEventListener("pointermove", ev => {
+        if (!pointerMoveAC) {
+          return;
+        }
+        const {
+          clientX: x,
+          clientY: y
+        } = ev;
+        this.#setPosition(this.#posX + (x - this.#prevDragX) / parentWidth, this.#posY + (y - this.#prevDragY) / parentHeight, false);
+        this.#prevDragX = x;
+        this.#prevDragY = y;
+        stopEvent(ev);
+      }, {
+        signal
+      });
+      window.addEventListener("blur", cancelDrag, {
+        signal
+      });
+      window.addEventListener("pointerup", ev => {
+        if (pointerMoveAC) {
+          cancelDrag();
+          stopEvent(ev);
+        }
+      }, {
+        signal
+      });
+    });
+    return container;
+  }
+  updateColor(editor) {
+    if (this.#editor !== editor || !this.#visible) {
+      return;
+    }
+    const {
+      color,
+      opacity
+    } = editor.getData();
+    this.#container.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || "";
+  }
+  _hide(editor) {
+    const container = this.#createPopup();
+    container.classList.toggle("hidden", true);
+    container.classList.toggle("selected", false);
+    (editor || this.#editor)?.setCommentButtonStates({
+      selected: false,
+      hasPopup: false
+    });
+    this.#editor = null;
+    this.#selected = false;
+    this.#visible = false;
+    this.#text.replaceChildren();
+    this.sidebar.selectComment(null);
+  }
+  toggle(editor, isSelected, visibility = undefined, isEditable = true) {
+    if (!editor) {
+      this.destroy();
+      return;
+    }
+    if (isSelected) {
+      visibility ??= this.#editor === editor ? !this.#selected || !this.#visible : true;
+    } else {
+      if (this.#selected) {
+        return;
+      }
+      visibility ??= !this.#visible;
+    }
+    if (!visibility) {
+      this._hide(editor);
+      return;
+    }
+    this.#visible = true;
+    if (this.#editor !== editor) {
+      this.#editor?.setCommentButtonStates({
+        selected: false,
+        hasPopup: false
+      });
+    }
+    const container = this.#createPopup();
+    this.#buttonsContainer.classList.toggle("hidden", !isEditable);
+    container.classList.toggle("hidden", false);
+    container.classList.toggle("selected", isSelected);
+    this.#selected = isSelected;
+    this.#editor = editor;
+    editor.setCommentButtonStates({
+      selected: isSelected,
+      hasPopup: true
+    });
+    const {
+      contentsObj,
+      richText,
+      creationDate,
+      modificationDate,
+      color,
+      opacity
+    } = editor.getData();
+    container.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || "";
+    this.#text.replaceChildren();
+    const html = richText?.str && (!contentsObj?.str || richText.str === contentsObj.str) ? richText.html : contentsObj?.str;
+    if (html) {
+      renderRichText({
+        html,
+        dir: contentsObj?.dir || "auto",
+        className: "richText"
+      }, this.#text);
+    }
+    this.#time.textContent = this.#dateFormat.format(PDFDateString.toDateObject(modificationDate || creationDate));
+    this.#setPosition(...editor.commentPopupPosition, editor.hasDefaultPopupPosition());
+    editor.elementBeforePopup.after(container);
+    container.addEventListener("focus", ({
+      relatedTarget
+    }) => {
+      this.#previousFocusedElement = relatedTarget;
+    }, {
+      once: true
+    });
+    if (isSelected) {
+      setTimeout(() => container.focus(), 0);
+    }
+  }
+  #setPosition(x, y, correctPosition) {
+    if (!correctPosition) {
+      this.#editor.commentPopupPosition = [x, y];
+    } else {
+      const parentRect = this.#editor.parentBoundingClientRect;
+      const widthRatio = this._popupWidth / parentRect.width;
+      if (this.#isLTR && x + widthRatio > 1 || !this.#isLTR && x - widthRatio >= 0) {
+        const buttonWidth = this.#editor.commentButtonWidth;
+        x -= widthRatio - buttonWidth;
+      }
+      const margin = 0.01;
+      if (this.#isLTR) {
+        x = Math.max(x, -parentRect.x / parentRect.width + margin);
+      } else {
+        x = Math.min(x, (window.innerWidth - parentRect.x) / parentRect.width - widthRatio - margin);
+      }
+    }
+    this.#posX = x;
+    this.#posY = y;
+    const {
+      style
+    } = this.#container;
+    style.left = `${100 * x}%`;
+    style.top = `${100 * y}%`;
+  }
+  destroy() {
+    this._hide();
+    this.#container?.remove();
+    this.#container = this.#text = this.#time = null;
+    this.#prevDragX = this.#prevDragY = Infinity;
+    this.#posX = this.#posY = 0;
+    this.#previousFocusedElement = null;
+  }
+}
+
+;// ./web/base_download_manager.js
+
+class BaseDownloadManager {
+  #openBlobUrls = new WeakMap();
+  _triggerDownload(blobUrl, originalUrl, filename, isAttachment = false) {
+    throw new Error("Not implemented: _triggerDownload");
+  }
+  _getOpenDataUrl(blobUrl, filename, dest = null) {
+    throw new Error("Not implemented: _getOpenDataUrl");
+  }
+  downloadData(data, filename, contentType) {
+    const blobUrl = URL.createObjectURL(new Blob([data], {
+      type: contentType
+    }));
+    this._triggerDownload(blobUrl, blobUrl, filename, true);
+  }
+  openOrDownloadData(data, filename, dest = null) {
+    const isPdfData = isPdfFile(filename);
+    const contentType = isPdfData ? "application/pdf" : "";
+    if (isPdfData) {
+      const blobUrl = this.#openBlobUrls.getOrInsertComputed(data, () => URL.createObjectURL(new Blob([data], {
+        type: contentType
+      })));
+      try {
+        const viewerUrl = this._getOpenDataUrl(blobUrl, filename, dest);
+        window.open(viewerUrl);
+        return true;
+      } catch (ex) {
+        console.error("openOrDownloadData:", ex);
+        URL.revokeObjectURL(blobUrl);
+        this.#openBlobUrls.delete(data);
+      }
+    }
+    this.downloadData(data, filename, contentType);
+    return false;
+  }
+  download(data, url, filename) {
+    const blobUrl = data ? URL.createObjectURL(new Blob([data], {
+      type: "application/pdf"
+    })) : null;
+    this._triggerDownload(blobUrl, url, filename);
+  }
+}
+
+;// ./web/download_manager.js
+
+
+class DownloadManager extends BaseDownloadManager {
+  _triggerDownload(blobUrl, originalUrl, filename, isAttachment = false) {
+    if (!blobUrl && !isAttachment) {
+      if (!createValidAbsoluteUrl(originalUrl, "http://example.com")) {
+        throw new Error(`_triggerDownload - not a valid URL: ${originalUrl}`);
+      }
+      blobUrl = originalUrl + "#pdfjs.action=download";
+    }
+    const a = document.createElement("a");
+    a.href = blobUrl;
+    a.target = "_parent";
+    if ("download" in a) {
+      a.download = filename;
+    }
+    (document.body || document.documentElement).append(a);
+    a.click();
+    a.remove();
+  }
+  _getOpenDataUrl(blobUrl, filename, dest = null) {
+    let url = "?file=" + encodeURIComponent(blobUrl + "#" + filename);
+    if (dest) {
+      url += `#${escape(dest)}`;
+    }
+    return url;
+  }
+}
+
+;// ./web/editor_undo_bar.js
+
+
+class EditorUndoBar {
+  #closeButton = null;
+  #container;
+  #eventBus = null;
+  #focusTimeout = null;
+  #initController = null;
+  isOpen = false;
+  #message;
+  #showController = null;
+  #undoButton;
+  static #l10nMessages = Object.freeze({
+    highlight: "pdfjs-editor-undo-bar-message-highlight",
+    freetext: "pdfjs-editor-undo-bar-message-freetext",
+    stamp: "pdfjs-editor-undo-bar-message-stamp",
+    ink: "pdfjs-editor-undo-bar-message-ink",
+    signature: "pdfjs-editor-undo-bar-message-signature",
+    comment: "pdfjs-editor-undo-bar-message-comment",
+    _multiple: "pdfjs-editor-undo-bar-message-multiple"
+  });
+  constructor({
+    container,
+    message,
+    undoButton,
+    closeButton
+  }, eventBus) {
+    this.#container = container;
+    this.#message = message;
+    this.#undoButton = undoButton;
+    this.#closeButton = closeButton;
+    this.#eventBus = eventBus;
+  }
+  destroy() {
+    this.#initController?.abort();
+    this.#initController = null;
+    this.hide();
+  }
+  show(undoAction, messageData) {
+    if (!this.#initController) {
+      this.#initController = new AbortController();
+      const domOpts = {
+        signal: this.#initController.signal
+      };
+      const evtOpts = {
+        signal: this.#initController.signal,
+        ...internalOpt
+      };
+      const boundHide = this.hide.bind(this);
+      this.#container.addEventListener("contextmenu", noContextMenu, domOpts);
+      this.#closeButton.addEventListener("click", boundHide, domOpts);
+      this.#eventBus.on("beforeprint", boundHide, evtOpts);
+      this.#eventBus.on("download", boundHide, evtOpts);
+    }
+    this.hide();
+    if (typeof messageData === "string") {
+      this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages[messageData]);
+    } else {
+      this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages._multiple);
+      this.#message.setAttribute("data-l10n-args", JSON.stringify({
+        count: messageData
+      }));
+    }
+    this.isOpen = true;
+    this.#container.hidden = false;
+    this.#showController = new AbortController();
+    this.#undoButton.addEventListener("click", () => {
+      undoAction();
+      this.hide();
+    }, {
+      signal: this.#showController.signal
+    });
+    this.#focusTimeout = setTimeout(() => {
+      if (!this.#container.contains(document.activeElement)) {
+        this.#container.focus();
+      }
+      this.#focusTimeout = null;
+    }, 100);
+  }
+  hide() {
+    if (!this.isOpen) {
+      return;
+    }
+    this.isOpen = false;
+    this.#container.hidden = true;
+    this.#showController?.abort();
+    this.#showController = null;
+    if (this.#focusTimeout) {
+      clearTimeout(this.#focusTimeout);
+      this.#focusTimeout = null;
+    }
+  }
+}
+
+;// ./web/overlay_manager.js
+class OverlayManager {
+  #overlays = new WeakMap();
+  #active = null;
+  get active() {
+    return this.#active;
+  }
+  async register(dialog, canForceClose = false) {
+    if (typeof dialog !== "object") {
+      throw new Error("Not enough parameters.");
+    } else if (this.#overlays.has(dialog)) {
+      throw new Error("The overlay is already registered.");
+    }
+    this.#overlays.set(dialog, {
+      canForceClose
+    });
+    dialog.addEventListener("cancel", ({
+      target
+    }) => {
+      if (this.#active === target) {
+        this.#active = null;
+      }
+    });
+  }
+  async open(dialog) {
+    if (!this.#overlays.has(dialog)) {
+      throw new Error("The overlay does not exist.");
+    } else if (this.#active) {
+      if (this.#active === dialog) {
+        throw new Error("The overlay is already active.");
+      } else if (this.#overlays.get(dialog).canForceClose) {
+        await this.close();
+      } else {
+        throw new Error("Another overlay is currently active.");
+      }
+    }
+    this.#active = dialog;
+    dialog.showModal();
+  }
+  async close(dialog = this.#active) {
+    if (!this.#overlays.has(dialog)) {
+      throw new Error("The overlay does not exist.");
+    } else if (!this.#active) {
+      throw new Error("The overlay is currently not active.");
+    } else if (this.#active !== dialog) {
+      throw new Error("Another overlay is currently active.");
+    }
+    dialog.close();
+    this.#active = null;
+  }
+  async closeIfActive(dialog) {
+    if (this.#active === dialog) {
+      await this.close(dialog);
+    }
+  }
+}
+
+;// ./web/password_prompt.js
+
+class PasswordPrompt {
+  #activeCapability = null;
+  #updateCallback = null;
+  #reason = null;
+  constructor(options, overlayManager, isViewerEmbedded = false) {
+    this.dialog = options.dialog;
+    this.label = options.label;
+    this.input = options.input;
+    this.submitButton = options.submitButton;
+    this.cancelButton = options.cancelButton;
+    this.overlayManager = overlayManager;
+    this._isViewerEmbedded = isViewerEmbedded;
+    this.submitButton.addEventListener("click", this.#verify.bind(this));
+    this.cancelButton.addEventListener("click", this.close.bind(this));
+    this.input.addEventListener("keydown", e => {
+      if (e.keyCode === 13) {
+        this.#verify();
+        e.preventDefault();
+      }
+    });
+    this.overlayManager.register(this.dialog, true);
+    this.dialog.addEventListener("close", this.#cancel.bind(this));
+  }
+  async open() {
+    await this.#activeCapability?.promise;
+    this.#activeCapability = Promise.withResolvers();
+    try {
+      await this.overlayManager.open(this.dialog);
+    } catch (ex) {
+      this.#activeCapability.resolve();
+      throw ex;
+    }
+    const passwordIncorrect = this.#reason === PasswordResponses.INCORRECT_PASSWORD;
+    if (!this._isViewerEmbedded || passwordIncorrect) {
+      this.input.focus();
+    }
+    this.label.setAttribute("data-l10n-id", passwordIncorrect ? "pdfjs-password-invalid" : "pdfjs-password-label");
+  }
+  async close() {
+    this.overlayManager.closeIfActive(this.dialog);
+  }
+  #verify() {
+    const password = this.input.value;
+    if (password?.length > 0) {
+      this.#invokeCallback(password);
+    }
+  }
+  #cancel() {
+    this.#invokeCallback(new Error("PasswordPrompt cancelled."));
+    this.#activeCapability.resolve();
+  }
+  #invokeCallback(password) {
+    if (!this.#updateCallback) {
+      return;
+    }
+    this.close();
+    this.input.value = "";
+    this.#updateCallback(password);
+    this.#updateCallback = null;
+  }
+  async setUpdateCallback(updateCallback, reason) {
+    if (this.#activeCapability) {
+      await this.#activeCapability.promise;
+    }
+    this.#updateCallback = updateCallback;
+    this.#reason = reason;
+  }
+}
+
+;// ./web/base_tree_viewer.js
+
+
+const TREEITEM_SELECTED_CLASS = "selected";
+class BaseTreeViewer {
+  constructor(options) {
+    this.container = options.container;
+    this.eventBus = options.eventBus;
+    this._l10n = options.l10n;
+    this.reset();
+  }
+  reset() {
+    this._pdfDocument = null;
+    this._lastToggleIsShow = true;
+    this._currentTreeItem = null;
+    this.container.replaceChildren();
+    this.container.classList.remove("withNesting");
+  }
+  _dispatchEvent(count) {
+    throw new Error("Not implemented: _dispatchEvent");
+  }
+  _bindLink(element, params) {
+    throw new Error("Not implemented: _bindLink");
+  }
+  _normalizeTextContent(str) {
+    return removeNullCharacters(str, true) || "\u2013";
+  }
+  _addToggleButton(div, hidden = false) {
+    const toggler = document.createElement("div");
+    toggler.className = "treeItemToggler";
+    if (hidden) {
+      toggler.classList.add("treeItemsHidden");
+    }
+    div.prepend(toggler);
+  }
+  _toggleTreeItem(root, show = false) {
+    this._l10n.pause();
+    this._lastToggleIsShow = show;
+    for (const toggler of root.querySelectorAll(".treeItemToggler")) {
+      toggler.classList.toggle("treeItemsHidden", !show);
+    }
+    this._l10n.resume();
+  }
+  _toggleAllTreeItems() {
+    this._toggleTreeItem(this.container, !this._lastToggleIsShow);
+  }
+  _finishRendering(fragment, count, hasAnyNesting = false) {
+    if (hasAnyNesting) {
+      this.container.classList.add("withNesting");
+      this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden");
+      this.container.addEventListener("click", e => {
+        const {
+          target
+        } = e;
+        if (!target.classList.contains("treeItemToggler")) {
+          return;
+        }
+        stopEvent(e);
+        target.classList.toggle("treeItemsHidden");
+        if (e.shiftKey) {
+          const shouldShowAll = !target.classList.contains("treeItemsHidden");
+          this._toggleTreeItem(target.parentNode, shouldShowAll);
+        }
+      });
+    }
+    this._l10n.pause();
+    this.container.append(fragment);
+    this._l10n.resume();
+    this._dispatchEvent(count);
+  }
+  render(params) {
+    throw new Error("Not implemented: render");
+  }
+  _updateCurrentTreeItem(treeItem = null) {
+    if (this._currentTreeItem) {
+      this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS);
+      this._currentTreeItem = null;
+    }
+    if (treeItem) {
+      treeItem.classList.add(TREEITEM_SELECTED_CLASS);
+      this._currentTreeItem = treeItem;
+    }
+  }
+  _scrollToCurrentTreeItem(treeItem) {
+    if (!treeItem) {
+      return;
+    }
+    this._l10n.pause();
+    let currentNode = treeItem.parentNode;
+    while (currentNode && currentNode !== this.container) {
+      if (currentNode.classList.contains("treeItem")) {
+        const toggler = currentNode.firstElementChild;
+        toggler?.classList.remove("treeItemsHidden");
+      }
+      currentNode = currentNode.parentNode;
+    }
+    this._l10n.resume();
+    this._updateCurrentTreeItem(treeItem);
+    treeItem.scrollIntoView({
+      behavior: "instant",
+      block: "center",
+      inline: "center",
+      container: "nearest"
+    });
+  }
+}
+
+;// ./web/pdf_attachment_viewer.js
+
+
+
+class PDFAttachmentViewer extends BaseTreeViewer {
+  constructor(options) {
+    super(options);
+    this.downloadManager = options.downloadManager;
+    this.linkService = options.linkService;
+    this.eventBus.on("fileattachmentannotation", this.#appendAttachment.bind(this), internalOpt);
+  }
+  reset(keepRenderedCapability = false) {
+    super.reset();
+    this._attachments = null;
+    if (!keepRenderedCapability) {
+      this._renderedCapability = Promise.withResolvers();
+    }
+    this._pendingDispatchEvent = false;
+  }
+  async _dispatchEvent(attachmentsCount) {
+    this._renderedCapability.resolve();
+    if (attachmentsCount === 0 && !this._pendingDispatchEvent) {
+      this._pendingDispatchEvent = true;
+      await waitOnEventOrTimeout({
+        target: this.eventBus,
+        name: "annotationlayerrendered",
+        delay: 1000
+      });
+      if (!this._pendingDispatchEvent) {
+        return;
+      }
+    }
+    this._pendingDispatchEvent = false;
+    this.eventBus.dispatch("attachmentsloaded", {
+      source: this,
+      attachmentsCount
+    });
+  }
+  _bindLink(element, {
+    attachmentId,
+    content: fallbackContent,
+    description,
+    filename
+  }) {
+    if (description) {
+      element.title = description;
+    }
+    const openAttachment = async () => {
+      const content = attachmentId ? await this.linkService.getAttachmentContent(attachmentId) : fallbackContent;
+      if (content) {
+        this.downloadManager?.openOrDownloadData(content, filename);
+      }
+    };
+    element.onclick = () => {
+      openAttachment();
+      return false;
+    };
+  }
+  render({
+    attachments,
+    keepRenderedCapability = false
+  }) {
+    if (this._attachments) {
+      this.reset(keepRenderedCapability);
+    }
+    this._attachments = attachments || null;
+    if (!attachments) {
+      this._dispatchEvent(0);
+      return;
+    }
+    const fragment = document.createDocumentFragment();
+    const ul = document.createElement("ul");
+    fragment.append(ul);
+    let attachmentsCount = 0;
+    for (const [name, item] of attachments) {
+      const li = document.createElement("li");
+      ul.append(li);
+      const element = document.createElement("a");
+      li.append(element);
+      this._bindLink(element, {
+        ...item,
+        attachmentId: item.attachmentId ?? name
+      });
+      element.textContent = this._normalizeTextContent(item.filename);
+      attachmentsCount++;
+    }
+    this._finishRendering(fragment, attachmentsCount);
+  }
+  #appendAttachment(item) {
+    const renderedPromise = this._renderedCapability.promise;
+    renderedPromise.then(() => {
+      if (renderedPromise !== this._renderedCapability.promise) {
+        return;
+      }
+      const attachments = new Map(this._attachments);
+      if (attachments.has(item.filename)) {
+        return;
+      }
+      attachments.set(item.filename, item);
+      this.render({
+        attachments,
+        keepRenderedCapability: true
+      });
+    });
+  }
+}
+
+;// ./web/grab_to_pan.js
+
+const CSS_CLASS_GRAB = "grab-to-pan-grab";
+class GrabToPan {
+  #activateAC = null;
+  #mouseDownAC = null;
+  #scrollAC = null;
+  constructor({
+    element
+  }) {
+    this.element = element;
+    this.document = element.ownerDocument;
+    const overlay = this.overlay = document.createElement("div");
+    overlay.className = "grab-to-pan-grabbing";
+  }
+  activate() {
+    if (!this.#activateAC) {
+      this.#activateAC = new AbortController();
+      this.element.addEventListener("mousedown", this.#onMouseDown.bind(this), {
+        capture: true,
+        signal: this.#activateAC.signal
+      });
+      this.element.classList.add(CSS_CLASS_GRAB);
+    }
+  }
+  deactivate() {
+    if (this.#activateAC) {
+      this.#activateAC.abort();
+      this.#activateAC = null;
+      this.#endPan();
+      this.element.classList.remove(CSS_CLASS_GRAB);
+    }
+  }
+  ignoreTarget(node) {
+    return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option");
+  }
+  #onMouseDown(event) {
+    if (event.button !== 0 || this.ignoreTarget(event.target)) {
+      return;
+    }
+    if (event.originalTarget) {
+      try {
+        event.originalTarget.tagName;
+      } catch {
+        return;
+      }
+    }
+    this.scrollLeftStart = this.element.scrollLeft;
+    this.scrollTopStart = this.element.scrollTop;
+    this.clientXStart = event.clientX;
+    this.clientYStart = event.clientY;
+    this.#mouseDownAC = new AbortController();
+    const boundEndPan = this.#endPan.bind(this),
+      mouseOpts = {
+        capture: true,
+        signal: this.#mouseDownAC.signal
+      };
+    this.document.addEventListener("mousemove", this.#onMouseMove.bind(this), mouseOpts);
+    this.document.addEventListener("mouseup", boundEndPan, mouseOpts);
+    this.#scrollAC = new AbortController();
+    this.element.addEventListener("scroll", boundEndPan, {
+      capture: true,
+      signal: this.#scrollAC.signal
+    });
+    stopEvent(event);
+    const focusedElement = document.activeElement;
+    if (focusedElement && !focusedElement.contains(event.target)) {
+      focusedElement.blur();
+    }
+  }
+  #onMouseMove(event) {
+    this.#scrollAC?.abort();
+    this.#scrollAC = null;
+    if (!(event.buttons & 1)) {
+      this.#endPan();
+      return;
+    }
+    const xDiff = event.clientX - this.clientXStart;
+    const yDiff = event.clientY - this.clientYStart;
+    this.element.scrollTo({
+      top: this.scrollTopStart - yDiff,
+      left: this.scrollLeftStart - xDiff,
+      behavior: "instant"
+    });
+    if (!this.overlay.parentNode) {
+      document.body.append(this.overlay);
+    }
+  }
+  #endPan() {
+    this.#mouseDownAC?.abort();
+    this.#mouseDownAC = null;
+    this.#scrollAC?.abort();
+    this.#scrollAC = null;
+    this.overlay.remove();
+  }
+}
+
+;// ./web/pdf_cursor_tools.js
+
+
+
+
+class PDFCursorTools {
+  #active = CursorTool.SELECT;
+  #prevActive = null;
+  constructor({
+    container,
+    eventBus,
+    cursorToolOnLoad = CursorTool.SELECT
+  }) {
+    this.container = container;
+    this.eventBus = eventBus;
+    this.#addEventListeners();
+    Promise.resolve().then(() => {
+      this.switchTool(cursorToolOnLoad);
+    });
+  }
+  get activeTool() {
+    return this.#active;
+  }
+  switchTool(tool) {
+    if (this.#prevActive !== null) {
+      return;
+    }
+    this.#switchTool(tool);
+  }
+  #switchTool(tool, disabled = false) {
+    if (tool === this.#active) {
+      if (this.#prevActive !== null) {
+        this.eventBus.dispatch("cursortoolchanged", {
+          source: this,
+          tool,
+          disabled
+        });
+      }
+      return;
+    }
+    const disableActiveTool = () => {
+      switch (this.#active) {
+        case CursorTool.SELECT:
+          break;
+        case CursorTool.HAND:
+          this._handTool.deactivate();
+          break;
+        case CursorTool.ZOOM:
+      }
+    };
+    switch (tool) {
+      case CursorTool.SELECT:
+        disableActiveTool();
+        break;
+      case CursorTool.HAND:
+        disableActiveTool();
+        this._handTool.activate();
+        break;
+      case CursorTool.ZOOM:
+      default:
+        console.error(`switchTool: "${tool}" is an unsupported value.`);
+        return;
+    }
+    this.#active = tool;
+    this.eventBus.dispatch("cursortoolchanged", {
+      source: this,
+      tool,
+      disabled
+    });
+  }
+  #addEventListeners() {
+    const {
+      eventBus
+    } = this;
+    eventBus.on("switchcursortool", evt => {
+      if (!evt.reset) {
+        this.switchTool(evt.tool);
+      } else if (this.#prevActive !== null) {
+        annotationEditorMode = AnnotationEditorType.NONE;
+        presentationModeState = PresentationModeState.NORMAL;
+        enableActive();
+      }
+    }, internalOpt);
+    let annotationEditorMode = AnnotationEditorType.NONE,
+      presentationModeState = PresentationModeState.NORMAL;
+    const disableActive = () => {
+      this.#prevActive ??= this.#active;
+      this.#switchTool(CursorTool.SELECT, true);
+    };
+    const enableActive = () => {
+      if (this.#prevActive !== null && annotationEditorMode === AnnotationEditorType.NONE && presentationModeState === PresentationModeState.NORMAL) {
+        this.#switchTool(this.#prevActive);
+        this.#prevActive = null;
+      }
+    };
+    eventBus.on("annotationeditormodechanged", ({
+      mode
+    }) => {
+      annotationEditorMode = mode;
+      if (mode === AnnotationEditorType.NONE) {
+        enableActive();
+      } else {
+        disableActive();
+      }
+    }, internalOpt);
+    eventBus.on("presentationmodechanged", ({
+      state
+    }) => {
+      presentationModeState = state;
+      if (state === PresentationModeState.NORMAL) {
+        enableActive();
+      } else if (state === PresentationModeState.FULLSCREEN) {
+        disableActive();
+      }
+    }, internalOpt);
+  }
+  get _handTool() {
+    return shadow(this, "_handTool", new GrabToPan({
+      element: this.container
+    }));
+  }
+}
+
+;// ./web/pdf_document_properties.js
+
+
+
+const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"];
+const US_PAGE_NAMES = {
+  "8.5x11": "pdfjs-document-properties-page-size-name-letter",
+  "8.5x14": "pdfjs-document-properties-page-size-name-legal"
+};
+const METRIC_PAGE_NAMES = {
+  "297x420": "pdfjs-document-properties-page-size-name-a-three",
+  "210x297": "pdfjs-document-properties-page-size-name-a-four"
+};
+function getPageName(size, isPortrait, pageNames) {
+  const width = isPortrait ? size.width : size.height;
+  const height = isPortrait ? size.height : size.width;
+  return pageNames[`${width}x${height}`];
+}
+class PDFDocumentProperties {
+  #fieldData = null;
+  constructor({
+    dialog,
+    fields,
+    closeButton
+  }, overlayManager, eventBus, l10n, fileNameLookup, titleLookup) {
+    this.dialog = dialog;
+    this.fields = fields;
+    this.overlayManager = overlayManager;
+    this.l10n = l10n;
+    this._fileNameLookup = fileNameLookup;
+    this._titleLookup = titleLookup;
+    this.#reset();
+    closeButton.addEventListener("click", this.close.bind(this));
+    this.overlayManager.register(this.dialog);
+    eventBus.on("pagechanging", evt => {
+      this._currentPageNumber = evt.pageNumber;
+    }, internalOpt);
+    eventBus.on("rotationchanging", evt => {
+      this._pagesRotation = evt.pagesRotation;
+    }, internalOpt);
+  }
+  async open() {
+    await Promise.all([this.overlayManager.open(this.dialog), this._dataAvailableCapability.promise]);
+    const currentPageNumber = this._currentPageNumber;
+    const pagesRotation = this._pagesRotation;
+    if (this.#fieldData && currentPageNumber === this.#fieldData._currentPageNumber && pagesRotation === this.#fieldData._pagesRotation) {
+      this.#updateUI();
+      return;
+    }
+    const [{
+      info,
+      metadata,
+      contentLength
+    }, pdfPage] = await Promise.all([this.pdfDocument.getMetadata(), this.pdfDocument.getPage(currentPageNumber).catch(reason => {
+      console.error(`PDFDocumentProperties - unable to get page ${currentPageNumber}.`, reason);
+      return null;
+    })]);
+    const [fileName, fileSize, title, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([this._fileNameLookup(), this.#parseFileSize(contentLength), this._titleLookup(), this.#parseDate(metadata?.get("xmp:createdate"), info.CreationDate), this.#parseDate(metadata?.get("xmp:modifydate"), info.ModDate), this.#parsePageSize(pdfPage, pagesRotation), this.#parseLinearization(info.IsLinearized)]);
+    this.#fieldData = Object.freeze({
+      fileName,
+      fileSize,
+      title,
+      author: metadata?.get("dc:creator")?.join("\n") || info.Author,
+      subject: metadata?.get("dc:subject")?.join("\n") || info.Subject,
+      keywords: metadata?.get("pdf:keywords") || info.Keywords,
+      creationDate,
+      modificationDate,
+      creator: metadata?.get("xmp:creatortool") || info.Creator,
+      producer: metadata?.get("pdf:producer") || info.Producer,
+      version: info.PDFFormatVersion,
+      pageCount: this.pdfDocument.numPages,
+      pageSize,
+      linearized: isLinearized,
+      _currentPageNumber: currentPageNumber,
+      _pagesRotation: pagesRotation
+    });
+    this.#updateUI();
+    const {
+      length
+    } = await this.pdfDocument.getDownloadInfo();
+    if (contentLength === length) {
+      return;
+    }
+    const data = Object.assign(Object.create(null), this.#fieldData);
+    data.fileSize = await this.#parseFileSize(length);
+    this.#fieldData = Object.freeze(data);
+    this.#updateUI();
+  }
+  async close() {
+    this.overlayManager.close(this.dialog);
+  }
+  setDocument(pdfDocument) {
+    if (this.pdfDocument) {
+      this.#reset();
+      this.#updateUI();
+    }
+    if (!pdfDocument) {
+      return;
+    }
+    this.pdfDocument = pdfDocument;
+    this._dataAvailableCapability.resolve();
+  }
+  #reset() {
+    this.pdfDocument = null;
+    this.#fieldData = null;
+    this._dataAvailableCapability = Promise.withResolvers();
+    this._currentPageNumber = 1;
+    this._pagesRotation = 0;
+  }
+  #updateUI() {
+    if (this.#fieldData && this.overlayManager.active !== this.dialog) {
+      return;
+    }
+    for (const id in this.fields) {
+      const content = this.#fieldData?.[id];
+      this.fields[id].textContent = content || content === 0 ? content : "-";
+    }
+  }
+  async #parseFileSize(b = 0) {
+    const kb = b / 1024,
+      mb = kb / 1024;
+    return kb ? this.l10n.get(mb >= 1 ? "pdfjs-document-properties-size-mb" : "pdfjs-document-properties-size-kb", {
+      mb,
+      kb,
+      b
+    }) : undefined;
+  }
+  async #parsePageSize(pdfPage, pagesRotation) {
+    if (!pdfPage) {
+      return undefined;
+    }
+    let pageSizeInches = getPageSizeInches(pdfPage);
+    if (pagesRotation % 180 !== 0) {
+      pageSizeInches = {
+        width: pageSizeInches.height,
+        height: pageSizeInches.width
+      };
+    }
+    const isPortrait = isPortraitOrientation(pageSizeInches),
+      nonMetric = NON_METRIC_LOCALES.includes(this.l10n.getLanguage());
+    let sizeInches = {
+      width: Math.round(pageSizeInches.width * 100) / 100,
+      height: Math.round(pageSizeInches.height * 100) / 100
+    };
+    let sizeMillimeters = {
+      width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,
+      height: Math.round(pageSizeInches.height * 25.4 * 10) / 10
+    };
+    let nameId = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);
+    if (!nameId && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) {
+      const exactMillimeters = {
+        width: pageSizeInches.width * 25.4,
+        height: pageSizeInches.height * 25.4
+      };
+      const intMillimeters = {
+        width: Math.round(sizeMillimeters.width),
+        height: Math.round(sizeMillimeters.height)
+      };
+      if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) {
+        nameId = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);
+        if (nameId) {
+          sizeInches = {
+            width: Math.round(intMillimeters.width / 25.4 * 100) / 100,
+            height: Math.round(intMillimeters.height / 25.4 * 100) / 100
+          };
+          sizeMillimeters = intMillimeters;
+        }
+      }
+    }
+    const [{
+      width,
+      height
+    }, unit, name, orientation] = await Promise.all([nonMetric ? sizeInches : sizeMillimeters, this.l10n.get(nonMetric ? "pdfjs-document-properties-page-size-unit-inches" : "pdfjs-document-properties-page-size-unit-millimeters"), nameId && this.l10n.get(nameId), this.l10n.get(isPortrait ? "pdfjs-document-properties-page-size-orientation-portrait" : "pdfjs-document-properties-page-size-orientation-landscape")]);
+    return this.l10n.get(name ? "pdfjs-document-properties-page-size-dimension-name-string" : "pdfjs-document-properties-page-size-dimension-string", {
+      width,
+      height,
+      unit,
+      name,
+      orientation
+    });
+  }
+  async #parseDate(metadataDate, infoDate) {
+    const dateObj = Date.parse(metadataDate) || PDFDateString.toDateObject(infoDate);
+    return dateObj ? this.l10n.get("pdfjs-document-properties-date-time-string", {
+      dateObj: dateObj.valueOf()
+    }) : undefined;
+  }
+  #parseLinearization(isLinearized) {
+    return this.l10n.get(isLinearized ? "pdfjs-document-properties-linearized-yes" : "pdfjs-document-properties-linearized-no");
+  }
+}
+
+;// ./web/pdf_find_utils.js
+
+const CharacterType = {
+  SPACE: 0,
+  ALPHA_LETTER: 1,
+  PUNCT: 2,
+  HAN_LETTER: 3,
+  KATAKANA_LETTER: 4,
+  HIRAGANA_LETTER: 5,
+  HALFWIDTH_KATAKANA_LETTER: 6,
+  THAI_LETTER: 7
+};
+function isAlphabeticalScript(charCode) {
+  return charCode < 0x2e80;
+}
+function isAscii(charCode) {
+  return (charCode & 0xff80) === 0;
+}
+function isAsciiAlpha(charCode) {
+  return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a;
+}
+function isAsciiDigit(charCode) {
+  return charCode >= 0x30 && charCode <= 0x39;
+}
+function isAsciiSpace(charCode) {
+  return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a;
+}
+function isHan(charCode) {
+  return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff;
+}
+function isKatakana(charCode) {
+  return charCode >= 0x30a0 && charCode <= 0x30ff;
+}
+function isHiragana(charCode) {
+  return charCode >= 0x3040 && charCode <= 0x309f;
+}
+function isHalfwidthKatakana(charCode) {
+  return charCode >= 0xff60 && charCode <= 0xff9f;
+}
+function isThai(charCode) {
+  return (charCode & 0xff80) === 0x0e00;
+}
+function getCharacterType(charCode) {
+  if (isAlphabeticalScript(charCode)) {
+    if (isAscii(charCode)) {
+      if (isAsciiSpace(charCode)) {
+        return CharacterType.SPACE;
+      } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) {
+        return CharacterType.ALPHA_LETTER;
+      }
+      return CharacterType.PUNCT;
+    } else if (isThai(charCode)) {
+      return CharacterType.THAI_LETTER;
+    } else if (charCode === 0xa0) {
+      return CharacterType.SPACE;
+    }
+    return CharacterType.ALPHA_LETTER;
+  }
+  if (isHan(charCode)) {
+    return CharacterType.HAN_LETTER;
+  } else if (isKatakana(charCode)) {
+    return CharacterType.KATAKANA_LETTER;
+  } else if (isHiragana(charCode)) {
+    return CharacterType.HIRAGANA_LETTER;
+  } else if (isHalfwidthKatakana(charCode)) {
+    return CharacterType.HALFWIDTH_KATAKANA_LETTER;
+  }
+  return CharacterType.ALPHA_LETTER;
+}
+let NormalizeWithNFKC;
+function getNormalizeWithNFKC() {
+  if (!NormalizeWithNFKC) {
+    const ranges = [];
+    const range = [];
+    const diacriticsRegex = /^\p{M}$/u;
+    for (let i = 0; i < 65536; i++) {
+      if (i >= 0xd800 && i <= 0xdfff) {
+        continue;
+      }
+      const c = String.fromCharCode(i);
+      if (c.normalize("NFKC") !== c && !diacriticsRegex.test(c)) {
+        if (range.length !== 2) {
+          range[0] = range[1] = i;
+          continue;
+        }
+        if (range[1] + 1 !== i) {
+          if (range[0] === range[1]) {
+            ranges.push(String.fromCharCode(range[0]));
+          } else {
+            ranges.push(`${String.fromCharCode(range[0])}-${String.fromCharCode(range[1])}`);
+          }
+          range[0] = range[1] = i;
+        } else {
+          range[1] = i;
+        }
+      }
+    }
+    const rangesStr = ranges.join("");
+    if (!NormalizeWithNFKC) {
+      NormalizeWithNFKC = rangesStr;
+    } else if (rangesStr !== NormalizeWithNFKC) {
+      for (let i = 1; i < rangesStr.length; i++) {
+        if (rangesStr[i] !== NormalizeWithNFKC[i]) {
+          console.log(`Difference at index ${i}: ` + `U+${rangesStr.charCodeAt(i).toString(16).toUpperCase().padStart(4, "0")}` + `!== U+${NormalizeWithNFKC.charCodeAt(i).toString(16).toUpperCase().padStart(4, "0")}`);
+          break;
+        }
+      }
+      throw new Error("getNormalizeWithNFKC - update the `NormalizeWithNFKC` string.");
+    }
+  }
+  return NormalizeWithNFKC;
+}
+
+;// ./web/pdf_find_controller.js
+
+
+
+const FindState = {
+  FOUND: 0,
+  NOT_FOUND: 1,
+  WRAPPED: 2,
+  PENDING: 3
+};
+const CHARACTERS_TO_NORMALIZE = {
+  "\u2010": "-",
+  "\u2018": "'",
+  "\u2019": "'",
+  "\u201A": "'",
+  "\u201B": "'",
+  "\u201C": '"',
+  "\u201D": '"',
+  "\u201E": '"',
+  "\u201F": '"',
+  "\u00BC": "1/4",
+  "\u00BD": "1/2",
+  "\u00BE": "3/4"
+};
+const DIACRITICS_EXCEPTION = new Set([0x3099, 0x309a, 0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b, 0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714, 0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f, 0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed, 0x0c56, 0x0f71, 0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80, 0x0f74]);
+let DIACRITICS_EXCEPTION_STR;
+const DIACRITICS_REG_EXP = /\p{M}+/gu;
+const SPECIAL_CHARS_REG_EXP = /([+^$|])|(\p{P}+)|(\s+)|(\p{M})|(\p{L})/gu;
+const NOT_DIACRITIC_FROM_END_REG_EXP = /(\P{M})\p{M}*$/u;
+const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*(\P{M})/u;
+const SYLLABLES_REG_EXP = /[\uAC00-\uD7AF\uFA6C\uFACF-\uFAD1\uFAD5-\uFAD7]+/g;
+const SYLLABLES_LENGTHS = new Map();
+const FIRST_CHAR_SYLLABLES_REG_EXP = "[\\u1100-\\u1112\\ud7a4-\\ud7af\\ud84a\\ud84c\\ud850\\ud854\\ud857\\ud85f]";
+const NFKC_CHARS_TO_NORMALIZE = new Map();
+let noSyllablesRegExp = null;
+let withSyllablesRegExp = null;
+function normalize(text, options = {}) {
+  const syllablePositions = [];
+  let m;
+  while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) {
+    let {
+      index
+    } = m;
+    for (const char of m[0]) {
+      let len = SYLLABLES_LENGTHS.get(char);
+      if (!len) {
+        len = char.normalize("NFD").length;
+        SYLLABLES_LENGTHS.set(char, len);
+      }
+      syllablePositions.push([len, index++]);
+    }
+  }
+  const hasSyllables = syllablePositions.length > 0;
+  const ignoreDashEOL = options.ignoreDashEOL ?? false;
+  let normalizationRegex;
+  if (!hasSyllables && noSyllablesRegExp) {
+    normalizationRegex = noSyllablesRegExp;
+  } else if (hasSyllables && withSyllablesRegExp) {
+    normalizationRegex = withSyllablesRegExp;
+  } else {
+    const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join("");
+    const toNormalizeWithNFKC = getNormalizeWithNFKC();
+    const CJK = "(?:\\p{Ideographic}|[\u3040-\u30FF])";
+    const HKDiacritics = "(?:\u3099|\u309A)";
+    const BrokenWord = `\\p{Ll}-\\n(?=\\p{Ll})|\\p{Lu}-\\n(?=\\p{L})`;
+    const regexps = [`[${replace}]`, `[${toNormalizeWithNFKC}]`, `${HKDiacritics}\\n`, "\\p{M}+(?:-\\n)?", `${BrokenWord}`, "\\S-\\n", `${CJK}\\n`, "\\n", hasSyllables ? FIRST_CHAR_SYLLABLES_REG_EXP : "\\u0000"];
+    normalizationRegex = new RegExp(regexps.map(r => `(${r})`).join("|"), "gmu");
+    if (hasSyllables) {
+      withSyllablesRegExp = normalizationRegex;
+    } else {
+      noSyllablesRegExp = normalizationRegex;
+    }
+  }
+  const rawDiacriticsPositions = [];
+  while ((m = DIACRITICS_REG_EXP.exec(text)) !== null) {
+    rawDiacriticsPositions.push([m[0].length, m.index]);
+  }
+  let normalized = text.normalize("NFD");
+  const positions = [0, 0];
+  let rawDiacriticsIndex = 0;
+  let syllableIndex = 0;
+  let shift = 0;
+  let shiftOrigin = 0;
+  let eol = 0;
+  let hasDiacritics = false;
+  normalized = normalized.replace(normalizationRegex, (match, p1, p2, p3, p4, p5, p6, p7, p8, p9, i) => {
+    i -= shiftOrigin;
+    if (p1) {
+      const replacement = CHARACTERS_TO_NORMALIZE[p1];
+      const jj = replacement.length;
+      for (let j = 1; j < jj; j++) {
+        positions.push(i - shift + j, shift - j);
+      }
+      shift -= jj - 1;
+      return replacement;
+    }
+    if (p2) {
+      let replacement = NFKC_CHARS_TO_NORMALIZE.get(p2);
+      if (!replacement) {
+        replacement = p2.normalize("NFKC");
+        NFKC_CHARS_TO_NORMALIZE.set(p2, replacement);
+      }
+      const jj = replacement.length;
+      for (let j = 1; j < jj; j++) {
+        positions.push(i - shift + j, shift - j);
+      }
+      shift -= jj - 1;
+      return replacement;
+    }
+    if (p3) {
+      hasDiacritics = true;
+      if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) {
+        ++rawDiacriticsIndex;
+      } else {
+        positions.push(i - 1 - shift + 1, shift - 1);
+        shift -= 1;
+        shiftOrigin += 1;
+      }
+      positions.push(i - shift + 1, shift);
+      shiftOrigin += 1;
+      eol += 1;
+      return p3.charAt(0);
+    }
+    if (p4) {
+      const hasTrailingDashEOL = p4.endsWith("\n");
+      const len = hasTrailingDashEOL ? p4.length - 2 : p4.length;
+      hasDiacritics = true;
+      let jj = len;
+      if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) {
+        jj -= rawDiacriticsPositions[rawDiacriticsIndex][0];
+        ++rawDiacriticsIndex;
+      }
+      for (let j = 1; j <= jj; j++) {
+        positions.push(i - 1 - shift + j, shift - j);
+      }
+      shift -= jj;
+      shiftOrigin += jj;
+      if (hasTrailingDashEOL) {
+        i += len - 1;
+        positions.push(i - shift + 1, 1 + shift);
+        shift += 1;
+        shiftOrigin += 1;
+        eol += 1;
+        return p4.slice(0, len);
+      }
+      return p4;
+    }
+    if (p5) {
+      if (ignoreDashEOL) {
+        shiftOrigin += 1;
+        eol += 1;
+        return p5.slice(0, -1);
+      }
+      const len = p5.length - 2;
+      positions.push(i - shift + len, 1 + shift);
+      shift += 1;
+      shiftOrigin += 1;
+      eol += 1;
+      return p5.slice(0, -2);
+    }
+    if (p6) {
+      shiftOrigin += 1;
+      eol += 1;
+      return p6.slice(0, -1);
+    }
+    if (p7) {
+      const len = p7.length - 1;
+      positions.push(i - shift + len, shift);
+      shiftOrigin += 1;
+      eol += 1;
+      return p7.slice(0, -1);
+    }
+    if (p8) {
+      positions.push(i - shift + 1, shift - 1);
+      shift -= 1;
+      shiftOrigin += 1;
+      eol += 1;
+      return " ";
+    }
+    if (i + eol === syllablePositions[syllableIndex]?.[1]) {
+      const newCharLen = syllablePositions[syllableIndex][0] - 1;
+      ++syllableIndex;
+      for (let j = 1; j <= newCharLen; j++) {
+        positions.push(i - (shift - j), shift - j);
+      }
+      shift -= newCharLen;
+      shiftOrigin += newCharLen;
+    }
+    return p9;
+  });
+  positions.push(normalized.length, shift);
+  const starts = new Uint32Array(positions.length >> 1);
+  const shifts = new Int32Array(positions.length >> 1);
+  for (let i = 0, ii = positions.length; i < ii; i += 2) {
+    starts[i >> 1] = positions[i];
+    shifts[i >> 1] = positions[i + 1];
+  }
+  return [normalized, [starts, shifts], hasDiacritics];
+}
+function getOriginalIndex(diffs, pos, len) {
+  if (!diffs) {
+    return [pos, len];
+  }
+  const [starts, shifts] = diffs;
+  const start = pos;
+  const end = pos + len - 1;
+  let i = binarySearchFirstItem(starts, x => x >= start);
+  if (starts[i] > start) {
+    --i;
+  }
+  let j = binarySearchFirstItem(starts, x => x >= end, i);
+  if (starts[j] > end) {
+    --j;
+  }
+  const oldStart = start + shifts[i];
+  const oldEnd = end + shifts[j];
+  const oldLen = oldEnd + 1 - oldStart;
+  return [oldStart, oldLen];
+}
+class PDFFindController {
+  #state = null;
+  #updateMatchesCountOnProgress = true;
+  #delay = 0;
+  #visitedPagesCount = 0;
+  #copiedPageData = null;
+  #savedPageData = null;
+  constructor({
+    linkService,
+    eventBus,
+    delay = 250,
+    updateMatchesCountOnProgress = true
+  }) {
+    this._linkService = linkService;
+    this._eventBus = eventBus;
+    this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress;
+    this.#delay = delay;
+    this.onIsPageVisible = null;
+    this.#reset();
+    eventBus.on("find", this.#onFind.bind(this), internalOpt);
+    eventBus.on("findbarclose", this.#onFindBarClose.bind(this), internalOpt);
+    eventBus.on("pagesedited", this.#onPagesEdited.bind(this), internalOpt);
+  }
+  get highlightMatches() {
+    return this._highlightMatches;
+  }
+  get pageMatches() {
+    return this._pageMatches;
+  }
+  get pageMatchesLength() {
+    return this._pageMatchesLength;
+  }
+  get selected() {
+    return this._selected;
+  }
+  get state() {
+    return this.#state;
+  }
+  setDocument(pdfDocument) {
+    if (this._pdfDocument) {
+      this.#reset();
+    }
+    if (!pdfDocument) {
+      return;
+    }
+    this._pdfDocument = pdfDocument;
+    this._firstPageCapability.resolve();
+  }
+  #onFind(state) {
+    if (!state) {
+      return;
+    }
+    const pdfDocument = this._pdfDocument;
+    const {
+      type
+    } = state;
+    if (this.#state === null || this.#shouldDirtyMatch(state)) {
+      this._dirtyMatch = true;
+    }
+    this.#state = state;
+    if (type !== "highlightallchange") {
+      this.#updateUIState(FindState.PENDING);
+    }
+    this._firstPageCapability.promise.then(() => {
+      if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {
+        return;
+      }
+      this.#extractText();
+      const findbarClosed = !this._highlightMatches;
+      const pendingTimeout = !!this._findTimeout;
+      if (this._findTimeout) {
+        clearTimeout(this._findTimeout);
+        this._findTimeout = null;
+      }
+      if (!type) {
+        this._findTimeout = setTimeout(() => {
+          this.#nextMatch();
+          this._findTimeout = null;
+        }, this.#delay);
+      } else if (this._dirtyMatch) {
+        this.#nextMatch();
+      } else if (type === "again") {
+        this.#nextMatch();
+        if (findbarClosed && this.#state.highlightAll) {
+          this.#updateAllPages();
+        }
+      } else if (type === "highlightallchange") {
+        if (pendingTimeout) {
+          this.#nextMatch();
+        } else {
+          this._highlightMatches = true;
+        }
+        this.#updateAllPages();
+      } else {
+        this.#nextMatch();
+      }
+    });
+  }
+  scrollMatchIntoView({
+    element = null,
+    pageIndex = -1,
+    matchIndex = -1
+  }) {
+    if (!this._scrollMatches || !element) {
+      return;
+    } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {
+      return;
+    } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {
+      return;
+    }
+    this._scrollMatches = false;
+    element.scrollIntoView({
+      block: "start",
+      inline: "center"
+    });
+  }
+  #reset() {
+    this._highlightMatches = false;
+    this._scrollMatches = false;
+    this._pdfDocument = null;
+    this._pageMatches = [];
+    this._pageMatchesLength = [];
+    this.#visitedPagesCount = 0;
+    this.#state = null;
+    this._selected = {
+      pageIdx: -1,
+      matchIdx: -1
+    };
+    this._offset = {
+      pageIdx: null,
+      matchIdx: null,
+      wrapped: false
+    };
+    this._extractTextPromises = [];
+    this._pageContents = [];
+    this._pageDiffs = [];
+    this._hasDiacritics = [];
+    this._matchesCountTotal = 0;
+    this._pagesToSearch = null;
+    this._pendingFindMatches = new Set();
+    this._resumePageIdx = null;
+    this._dirtyMatch = false;
+    clearTimeout(this._findTimeout);
+    this._findTimeout = null;
+    this.#copiedPageData = null;
+    this._firstPageCapability = Promise.withResolvers();
+  }
+  get #query() {
+    const {
+      query
+    } = this.#state;
+    if (typeof query === "string") {
+      if (query !== this._rawQuery) {
+        this._rawQuery = query;
+        [this._normalizedQuery] = normalize(query);
+      }
+      return this._normalizedQuery;
+    }
+    return (query || []).filter(q => !!q).map(q => normalize(q)[0]);
+  }
+  #shouldDirtyMatch(state) {
+    const newQuery = state.query,
+      prevQuery = this.#state.query;
+    const newType = typeof newQuery,
+      prevType = typeof prevQuery;
+    if (newType !== prevType) {
+      return true;
+    }
+    if (newType === "string") {
+      if (newQuery !== prevQuery) {
+        return true;
+      }
+    } else if (JSON.stringify(newQuery) !== JSON.stringify(prevQuery)) {
+      return true;
+    }
+    switch (state.type) {
+      case "again":
+        const pageNumber = this._selected.pageIdx + 1;
+        const linkService = this._linkService;
+        return pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !(this.onIsPageVisible?.(pageNumber) ?? true);
+      case "highlightallchange":
+        return false;
+    }
+    return true;
+  }
+  #isEntireWord(content, startIdx, length) {
+    let match = content.slice(0, startIdx).match(NOT_DIACRITIC_FROM_END_REG_EXP);
+    if (match) {
+      const first = content.charCodeAt(startIdx);
+      const limit = match[1].charCodeAt(0);
+      if (getCharacterType(first) === getCharacterType(limit)) {
+        return false;
+      }
+    }
+    match = content.slice(startIdx + length).match(NOT_DIACRITIC_FROM_START_REG_EXP);
+    if (match) {
+      const last = content.charCodeAt(startIdx + length - 1);
+      const limit = match[1].charCodeAt(0);
+      if (getCharacterType(last) === getCharacterType(limit)) {
+        return false;
+      }
+    }
+    return true;
+  }
+  #convertToRegExpString(query, hasDiacritics) {
+    const {
+      matchDiacritics
+    } = this.#state;
+    let isUnicode = false;
+    const addExtraWhitespaces = (original, fixed) => {
+      if (original === query) {
+        return fixed;
+      }
+      if (query.startsWith(original)) {
+        return `${fixed}[ ]*`;
+      }
+      if (query.endsWith(original)) {
+        return `[ ]*${fixed}`;
+      }
+      return `[ ]*${fixed}[ ]*`;
+    };
+    query = query.replaceAll(SPECIAL_CHARS_REG_EXP, (match, p1, p2, p3, p4, p5) => {
+      if (p1) {
+        return addExtraWhitespaces(p1, RegExp.escape(p1));
+      }
+      if (p2) {
+        return addExtraWhitespaces(p2, RegExp.escape(p2));
+      }
+      if (p3) {
+        return "[ ]+";
+      }
+      if (matchDiacritics) {
+        return p4 || p5;
+      }
+      if (p4) {
+        return DIACRITICS_EXCEPTION.has(p4.charCodeAt(0)) ? p4 : "";
+      }
+      if (hasDiacritics) {
+        isUnicode = true;
+        return `${p5}\\p{M}*`;
+      }
+      return p5;
+    });
+    const trailingSpaces = "[ ]*";
+    if (query.endsWith(trailingSpaces)) {
+      query = query.slice(0, query.length - trailingSpaces.length);
+    }
+    if (matchDiacritics) {
+      if (hasDiacritics) {
+        DIACRITICS_EXCEPTION_STR ||= String.fromCharCode(...DIACRITICS_EXCEPTION);
+        isUnicode = true;
+        query = `${query}(?=[${DIACRITICS_EXCEPTION_STR}]|[^\\p{M}]|$)`;
+      }
+    }
+    return [isUnicode, query];
+  }
+  #calculateMatch(pageIndex) {
+    if (!this.#state) {
+      return;
+    }
+    const query = this.#query;
+    if (query.length === 0) {
+      return;
+    }
+    const pageContent = this._pageContents[pageIndex];
+    const matcherResult = this.match(query, pageContent, pageIndex);
+    const matches = this._pageMatches[pageIndex] = [];
+    const matchesLength = this._pageMatchesLength[pageIndex] = [];
+    const diffs = this._pageDiffs[pageIndex];
+    matcherResult?.forEach(({
+      index,
+      length
+    }) => {
+      const [matchPos, matchLen] = getOriginalIndex(diffs, index, length);
+      if (matchLen) {
+        matches.push(matchPos);
+        matchesLength.push(matchLen);
+      }
+    });
+    if (this.#state.highlightAll) {
+      this.#updatePage(pageIndex);
+    }
+    if (this._resumePageIdx === pageIndex) {
+      this._resumePageIdx = null;
+      this.#nextPageMatch();
+    }
+    const pageMatchesCount = matches.length;
+    this._matchesCountTotal += pageMatchesCount;
+    if (this.#updateMatchesCountOnProgress) {
+      if (pageMatchesCount > 0) {
+        this.#updateUIResultsCount();
+      }
+    } else if (++this.#visitedPagesCount === this._linkService.pagesCount) {
+      this.#updateUIResultsCount();
+    }
+  }
+  match(query, pageContent, pageIndex) {
+    const hasDiacritics = this._hasDiacritics[pageIndex];
+    let isUnicode = false;
+    if (typeof query === "string") {
+      [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics);
+    } else {
+      query = query.sort().reverse().map(q => {
+        const [isUnicodePart, queryPart] = this.#convertToRegExpString(q, hasDiacritics);
+        isUnicode ||= isUnicodePart;
+        return `(${queryPart})`;
+      }).join("|");
+    }
+    if (!query) {
+      return undefined;
+    }
+    const {
+      caseSensitive,
+      entireWord
+    } = this.#state;
+    const flags = `g${isUnicode ? "u" : ""}${caseSensitive ? "" : "i"}`;
+    query = new RegExp(query, flags);
+    const matches = [];
+    let match;
+    while ((match = query.exec(pageContent)) !== null) {
+      if (entireWord && !this.#isEntireWord(pageContent, match.index, match[0].length)) {
+        continue;
+      }
+      matches.push({
+        index: match.index,
+        length: match[0].length
+      });
+    }
+    return matches;
+  }
+  #extractText() {
+    if (this._extractTextPromises.length > 0) {
+      return;
+    }
+    let deferred = Promise.resolve();
+    const textOptions = {
+      disableNormalization: true
+    };
+    const pdfDoc = this._pdfDocument;
+    for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {
+      const {
+        promise,
+        resolve
+      } = Promise.withResolvers();
+      this._extractTextPromises[i] = promise;
+      deferred = deferred.then(async () => {
+        if (pdfDoc !== this._pdfDocument) {
+          resolve();
+          return;
+        }
+        try {
+          const pdfPage = await pdfDoc.getPage(i + 1);
+          const textContent = await pdfPage.getTextContent(textOptions);
+          if (pdfDoc !== this._pdfDocument) {
+            resolve();
+            return;
+          }
+          const strBuf = [];
+          for (const textItem of textContent.items) {
+            strBuf.push(textItem.str);
+            if (textItem.hasEOL) {
+              strBuf.push("\n");
+            }
+          }
+          [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = normalize(strBuf.join(""));
+        } catch (ex) {
+          if (pdfDoc !== this._pdfDocument) {
+            resolve();
+            return;
+          }
+          console.error(`Unable to get text content for page ${i + 1}`, ex);
+          [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = ["", null, false];
+        }
+        resolve();
+      });
+    }
+  }
+  #updatePage(index) {
+    if (this._scrollMatches && this._selected.pageIdx === index) {
+      this._linkService.page = index + 1;
+    }
+    this._eventBus.dispatch("updatetextlayermatches", {
+      source: this,
+      pageIndex: index
+    });
+  }
+  #updateAllPages() {
+    this._eventBus.dispatch("updatetextlayermatches", {
+      source: this,
+      pageIndex: -1
+    });
+  }
+  #nextMatch() {
+    const previous = this.#state.findPrevious;
+    const currentPageIndex = this._linkService.page - 1;
+    const numPages = this._linkService.pagesCount;
+    this._highlightMatches = true;
+    if (this._dirtyMatch) {
+      this._dirtyMatch = false;
+      this._selected.pageIdx = this._selected.matchIdx = -1;
+      this._offset.pageIdx = currentPageIndex;
+      this._offset.matchIdx = null;
+      this._offset.wrapped = false;
+      this._resumePageIdx = null;
+      this._pageMatches.length = 0;
+      this._pageMatchesLength.length = 0;
+      this.#visitedPagesCount = 0;
+      this._matchesCountTotal = 0;
+      this.#updateAllPages();
+      for (let i = 0; i < numPages; i++) {
+        if (this._pendingFindMatches.has(i)) {
+          continue;
+        }
+        this._pendingFindMatches.add(i);
+        this._extractTextPromises[i].then(() => {
+          this._pendingFindMatches.delete(i);
+          this.#calculateMatch(i);
+        });
+      }
+    }
+    const query = this.#query;
+    if (query.length === 0) {
+      this.#updateUIState(FindState.FOUND);
+      return;
+    }
+    if (this._resumePageIdx) {
+      return;
+    }
+    const offset = this._offset;
+    this._pagesToSearch = numPages;
+    if (offset.matchIdx !== null) {
+      const numPageMatches = this._pageMatches[offset.pageIdx].length;
+      if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {
+        offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;
+        this.#updateMatch(true);
+        return;
+      }
+      this.#advanceOffsetPage(previous);
+    }
+    this.#nextPageMatch();
+  }
+  #matchesReady(matches) {
+    const offset = this._offset;
+    const numMatches = matches.length;
+    const previous = this.#state.findPrevious;
+    if (numMatches) {
+      offset.matchIdx = previous ? numMatches - 1 : 0;
+      this.#updateMatch(true);
+      return true;
+    }
+    this.#advanceOffsetPage(previous);
+    if (offset.wrapped) {
+      offset.matchIdx = null;
+      if (this._pagesToSearch < 0) {
+        this.#updateMatch(false);
+        return true;
+      }
+    }
+    return false;
+  }
+  #nextPageMatch() {
+    if (this._resumePageIdx !== null) {
+      console.error("There can only be one pending page.");
+    }
+    let matches = null;
+    do {
+      const pageIdx = this._offset.pageIdx;
+      matches = this._pageMatches[pageIdx];
+      if (!matches) {
+        this._resumePageIdx = pageIdx;
+        break;
+      }
+    } while (!this.#matchesReady(matches));
+  }
+  #advanceOffsetPage(previous) {
+    const offset = this._offset;
+    const numPages = this._linkService.pagesCount;
+    offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;
+    offset.matchIdx = null;
+    this._pagesToSearch--;
+    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
+      offset.pageIdx = previous ? numPages - 1 : 0;
+      offset.wrapped = true;
+    }
+  }
+  #updateMatch(found = false) {
+    let state = FindState.NOT_FOUND;
+    const wrapped = this._offset.wrapped;
+    this._offset.wrapped = false;
+    if (found) {
+      const previousPage = this._selected.pageIdx;
+      this._selected.pageIdx = this._offset.pageIdx;
+      this._selected.matchIdx = this._offset.matchIdx;
+      state = wrapped ? FindState.WRAPPED : FindState.FOUND;
+      if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {
+        this.#updatePage(previousPage);
+      }
+    }
+    this.#updateUIState(state, this.#state.findPrevious);
+    if (this._selected.pageIdx !== -1) {
+      this._scrollMatches = true;
+      this.#updatePage(this._selected.pageIdx);
+    }
+  }
+  #onPagesEdited({
+    pagesMapper,
+    type,
+    pageNumbers
+  }) {
+    if (this._extractTextPromises.length === 0) {
+      return;
+    }
+    if (type === "copy") {
+      const promises = new Map();
+      const contents = new Map();
+      const diffs = new Map();
+      const diacritics = new Map();
+      for (const pageNum of pageNumbers) {
+        promises.set(pageNum, this._extractTextPromises[pageNum - 1]);
+        contents.set(pageNum, this._pageContents[pageNum - 1]);
+        diffs.set(pageNum, this._pageDiffs[pageNum - 1]);
+        diacritics.set(pageNum, this._hasDiacritics[pageNum - 1]);
+      }
+      this.#copiedPageData = {
+        promises,
+        contents,
+        diffs,
+        diacritics
+      };
+      return;
+    }
+    if (type === "cancelCopy") {
+      this.#copiedPageData = null;
+      return;
+    }
+    if (type === "delete") {
+      this.#savedPageData = {
+        promises: this._extractTextPromises,
+        contents: this._pageContents,
+        diffs: this._pageDiffs,
+        diacritics: this._hasDiacritics
+      };
+    }
+    if (type === "cancelDelete") {
+      this._extractTextPromises = this.#savedPageData.promises;
+      this._pageContents = this.#savedPageData.contents;
+      this._pageDiffs = this.#savedPageData.diffs;
+      this._hasDiacritics = this.#savedPageData.diacritics;
+      return;
+    }
+    if (type === "cleanSavedData") {
+      this.#savedPageData = null;
+      return;
+    }
+    if (this._findTimeout) {
+      clearTimeout(this._findTimeout);
+      this._findTimeout = null;
+    }
+    this._resumePageIdx = null;
+    this._dirtyMatch = true;
+    const prevPromises = this._extractTextPromises;
+    const prevContents = this._pageContents;
+    const prevDiffs = this._pageDiffs;
+    const prevDiacritics = this._hasDiacritics;
+    const extractTextPromises = this._extractTextPromises = [];
+    const pageContents = this._pageContents = [];
+    const pageDiffs = this._pageDiffs = [];
+    const hasDiacritics = this._hasDiacritics = [];
+    for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) {
+      const prevPageNumber = pagesMapper.getPrevPageNumber(i);
+      if (prevPageNumber < 0) {
+        const src = -prevPageNumber;
+        extractTextPromises.push(this.#copiedPageData?.promises.get(src) || Promise.resolve());
+        pageContents.push(this.#copiedPageData?.contents.get(src) ?? "");
+        pageDiffs.push(this.#copiedPageData?.diffs.get(src) ?? null);
+        hasDiacritics.push(this.#copiedPageData?.diacritics.get(src) ?? false);
+        continue;
+      }
+      extractTextPromises.push(prevPromises[prevPageNumber - 1] || Promise.resolve());
+      pageContents.push(prevContents[prevPageNumber - 1] ?? "");
+      pageDiffs.push(prevDiffs[prevPageNumber - 1] ?? null);
+      hasDiacritics.push(prevDiacritics[prevPageNumber - 1] ?? false);
+    }
+    if (this.#state) {
+      this.#nextMatch();
+    }
+  }
+  #onFindBarClose(evt) {
+    const pdfDocument = this._pdfDocument;
+    this._firstPageCapability.promise.then(() => {
+      if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) {
+        return;
+      }
+      if (this._findTimeout) {
+        clearTimeout(this._findTimeout);
+        this._findTimeout = null;
+      }
+      if (this._resumePageIdx) {
+        this._resumePageIdx = null;
+        this._dirtyMatch = true;
+      }
+      this.#updateUIState(FindState.FOUND);
+      this._highlightMatches = false;
+      this.#updateAllPages();
+    });
+  }
+  #requestMatchesCount() {
+    const {
+      pageIdx,
+      matchIdx
+    } = this._selected;
+    let current = 0,
+      total = this._matchesCountTotal;
+    if (matchIdx !== -1) {
+      for (let i = 0; i < pageIdx; i++) {
+        current += this._pageMatches[i]?.length || 0;
+      }
+      current += matchIdx + 1;
+    }
+    if (current < 1 || current > total) {
+      current = total = 0;
+    }
+    return {
+      current,
+      total
+    };
+  }
+  #updateUIResultsCount() {
+    this._eventBus.dispatch("updatefindmatchescount", {
+      source: this,
+      matchesCount: this.#requestMatchesCount()
+    });
+  }
+  #updateUIState(state, previous = false) {
+    if (!this.#updateMatchesCountOnProgress && (this.#visitedPagesCount !== this._linkService.pagesCount || state === FindState.PENDING)) {
+      return;
+    }
+    this._eventBus.dispatch("updatefindcontrolstate", {
+      source: this,
+      state,
+      previous,
+      entireWord: this.#state?.entireWord ?? null,
+      matchesCount: this.#requestMatchesCount(),
+      rawQuery: this.#state?.query ?? null
+    });
+  }
+}
+
+;// ./web/pdf_find_bar.js
+
+
+const MATCHES_COUNT_LIMIT = 1000;
+class PDFFindBar {
+  #mainContainer;
+  #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this));
+  opened = false;
+  constructor(options, mainContainer, eventBus) {
+    this.bar = options.bar;
+    this.toggleButton = options.toggleButton;
+    this.findField = options.findField;
+    this.highlightAll = options.highlightAllCheckbox;
+    this.caseSensitive = options.caseSensitiveCheckbox;
+    this.matchDiacritics = options.matchDiacriticsCheckbox;
+    this.entireWord = options.entireWordCheckbox;
+    this.findMsg = options.findMsg;
+    this.findResultsCount = options.findResultsCount;
+    this.findPreviousButton = options.findPreviousButton;
+    this.findNextButton = options.findNextButton;
+    this.eventBus = eventBus;
+    this.#mainContainer = mainContainer;
+    const checkedInputs = new Map([[this.highlightAll, "highlightallchange"], [this.caseSensitive, "casesensitivitychange"], [this.entireWord, "entirewordchange"], [this.matchDiacritics, "diacriticmatchingchange"]]);
+    this.toggleButton.addEventListener("click", () => {
+      this.toggle();
+    });
+    this.findField.addEventListener("input", () => {
+      this.dispatchEvent("");
+    });
+    this.bar.addEventListener("keydown", ({
+      keyCode,
+      shiftKey,
+      target
+    }) => {
+      switch (keyCode) {
+        case 13:
+          if (target === this.findField) {
+            this.dispatchEvent("again", shiftKey);
+          } else if (checkedInputs.has(target)) {
+            target.checked = !target.checked;
+            this.dispatchEvent(checkedInputs.get(target));
+          }
+          break;
+        case 27:
+          this.close();
+          break;
+      }
+    });
+    this.findPreviousButton.addEventListener("click", () => {
+      this.dispatchEvent("again", true);
+    });
+    this.findNextButton.addEventListener("click", () => {
+      this.dispatchEvent("again", false);
+    });
+    for (const [elem, evtName] of checkedInputs) {
+      elem.addEventListener("click", () => {
+        this.dispatchEvent(evtName);
+      });
+    }
+  }
+  reset() {
+    this.updateUIState();
+  }
+  dispatchEvent(type, findPrev = false) {
+    this.eventBus.dispatch("find", {
+      source: this,
+      type,
+      query: this.findField.value,
+      caseSensitive: this.caseSensitive.checked,
+      entireWord: this.entireWord.checked,
+      highlightAll: this.highlightAll.checked,
+      findPrevious: findPrev,
+      matchDiacritics: this.matchDiacritics.checked
+    });
+  }
+  updateUIState(state, previous, matchesCount) {
+    const {
+      findField,
+      findMsg
+    } = this;
+    let findMsgId = "",
+      status = "";
+    switch (state) {
+      case FindState.FOUND:
+        break;
+      case FindState.PENDING:
+        status = "pending";
+        break;
+      case FindState.NOT_FOUND:
+        findMsgId = "pdfjs-find-not-found";
+        status = "notFound";
+        break;
+      case FindState.WRAPPED:
+        findMsgId = previous ? "pdfjs-find-reached-top" : "pdfjs-find-reached-bottom";
+        break;
+    }
+    findField.setAttribute("data-status", status);
+    findField.setAttribute("aria-invalid", state === FindState.NOT_FOUND);
+    findMsg.setAttribute("data-status", status);
+    if (findMsgId) {
+      findMsg.setAttribute("data-l10n-id", findMsgId);
+    } else {
+      findMsg.removeAttribute("data-l10n-id");
+      findMsg.textContent = "";
+    }
+    this.updateResultsCount(matchesCount);
+  }
+  updateResultsCount({
+    current = 0,
+    total = 0
+  } = {}) {
+    const {
+      findResultsCount
+    } = this;
+    if (total > 0) {
+      const limit = MATCHES_COUNT_LIMIT;
+      findResultsCount.setAttribute("data-l10n-id", total > limit ? "pdfjs-find-match-count-limit" : "pdfjs-find-match-count");
+      findResultsCount.setAttribute("data-l10n-args", JSON.stringify({
+        limit,
+        current,
+        total
+      }));
+    } else {
+      findResultsCount.removeAttribute("data-l10n-id");
+      findResultsCount.textContent = "";
+    }
+  }
+  open() {
+    if (!this.opened) {
+      this.#resizeObserver.observe(this.#mainContainer);
+      this.#resizeObserver.observe(this.bar);
+      this.opened = true;
+      toggleExpandedBtn(this.toggleButton, true, this.bar);
+    }
+    this.findField.select();
+    this.findField.focus();
+  }
+  close() {
+    if (!this.opened) {
+      return;
+    }
+    this.#resizeObserver.disconnect();
+    this.opened = false;
+    toggleExpandedBtn(this.toggleButton, false, this.bar);
+    this.eventBus.dispatch("findbarclose", {
+      source: this
+    });
+  }
+  toggle() {
+    if (this.opened) {
+      this.close();
+    } else {
+      this.open();
+    }
+  }
+  #resizeObserverCallback() {
+    const {
+      bar
+    } = this;
+    bar.classList.remove("wrapContainers");
+    const findbarHeight = bar.clientHeight;
+    const inputContainerHeight = bar.firstElementChild.clientHeight;
+    if (findbarHeight > inputContainerHeight) {
+      bar.classList.add("wrapContainers");
+    }
+  }
+}
+
+;// ./web/pdf_history.js
+
+
+
+
+const HASH_CHANGE_TIMEOUT = 1000;
+const POSITION_UPDATED_THRESHOLD = 50;
+const UPDATE_VIEWAREA_TIMEOUT = 1000;
+function getCurrentHash() {
+  return document.location.hash;
+}
+class PDFHistory {
+  #eventAC = null;
+  constructor({
+    linkService,
+    eventBus
+  }) {
+    this.linkService = linkService;
+    this.eventBus = eventBus;
+    this._initialized = false;
+    this._fingerprint = "";
+    this.reset();
+    this.eventBus.on("pagesinit", () => {
+      this._isPagesLoaded = false;
+      this.eventBus.on("pagesloaded", evt => {
+        this._isPagesLoaded = !!evt.pagesCount;
+      }, {
+        once: true,
+        ...internalOpt
+      });
+    }, internalOpt);
+  }
+  initialize({
+    fingerprint,
+    resetHistory = false,
+    updateUrl = false
+  }) {
+    if (!fingerprint || typeof fingerprint !== "string") {
+      console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.');
+      return;
+    }
+    if (this._initialized) {
+      this.reset();
+    }
+    const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint;
+    this._fingerprint = fingerprint;
+    this._updateUrl = updateUrl === true;
+    this._initialized = true;
+    this.#bindEvents();
+    const state = window.history.state;
+    this._popStateInProgress = false;
+    this._blockHashChange = 0;
+    this._currentHash = getCurrentHash();
+    this._numPositionUpdates = 0;
+    this._uid = this._maxUid = 0;
+    this._destination = null;
+    this._position = null;
+    if (!this.#isValidState(state, true) || resetHistory) {
+      const {
+        hash,
+        page,
+        rotation
+      } = this.#parseCurrentHash(true);
+      if (!hash || reInitialized || resetHistory) {
+        this.#pushOrReplaceState(null, true);
+        return;
+      }
+      this.#pushOrReplaceState({
+        hash,
+        page,
+        rotation
+      }, true);
+      return;
+    }
+    const destination = state.destination;
+    this.#updateInternalState(destination, state.uid, true);
+    if (destination.rotation !== undefined) {
+      this._initialRotation = destination.rotation;
+    }
+    if (destination.dest) {
+      this._initialBookmark = JSON.stringify(destination.dest);
+      this._destination.page = null;
+    } else if (destination.hash) {
+      this._initialBookmark = destination.hash;
+    } else if (destination.page) {
+      this._initialBookmark = `page=${destination.page}`;
+    }
+  }
+  reset() {
+    if (this._initialized) {
+      this.#pageHide();
+      this._initialized = false;
+      this.#unbindEvents();
+    }
+    if (this._updateViewareaTimeout) {
+      clearTimeout(this._updateViewareaTimeout);
+      this._updateViewareaTimeout = null;
+    }
+    this._initialBookmark = null;
+    this._initialRotation = null;
+  }
+  push({
+    namedDest = null,
+    explicitDest,
+    pageNumber
+  }) {
+    if (!this._initialized) {
+      return;
+    }
+    if (namedDest && typeof namedDest !== "string") {
+      console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`);
+      return;
+    } else if (!Array.isArray(explicitDest)) {
+      console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`);
+      return;
+    } else if (!this.#isValidPage(pageNumber)) {
+      if (pageNumber !== null || this._destination) {
+        console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`);
+        return;
+      }
+    }
+    const hash = namedDest || JSON.stringify(explicitDest);
+    if (!hash) {
+      return;
+    }
+    let forceReplace = false;
+    if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) {
+      if (this._destination.page) {
+        return;
+      }
+      forceReplace = true;
+    }
+    if (this._popStateInProgress && !forceReplace) {
+      return;
+    }
+    this.#pushOrReplaceState({
+      dest: explicitDest,
+      hash,
+      page: pageNumber,
+      rotation: this.linkService.rotation
+    }, forceReplace);
+    if (!this._popStateInProgress) {
+      this._popStateInProgress = true;
+      Promise.resolve().then(() => {
+        this._popStateInProgress = false;
+      });
+    }
+  }
+  pushPage(pageNumber) {
+    if (!this._initialized) {
+      return;
+    }
+    if (!this.#isValidPage(pageNumber)) {
+      console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`);
+      return;
+    }
+    if (this._destination?.page === pageNumber) {
+      return;
+    }
+    if (this._popStateInProgress) {
+      return;
+    }
+    this.#pushOrReplaceState({
+      dest: null,
+      hash: `page=${pageNumber}`,
+      page: pageNumber,
+      rotation: this.linkService.rotation
+    });
+    if (!this._popStateInProgress) {
+      this._popStateInProgress = true;
+      Promise.resolve().then(() => {
+        this._popStateInProgress = false;
+      });
+    }
+  }
+  pushCurrentPosition() {
+    if (!this._initialized || this._popStateInProgress) {
+      return;
+    }
+    this.#tryPushCurrentPosition();
+  }
+  back() {
+    if (!this._initialized || this._popStateInProgress) {
+      return;
+    }
+    const state = window.history.state;
+    if (this.#isValidState(state) && state.uid > 0) {
+      window.history.back();
+    }
+  }
+  forward() {
+    if (!this._initialized || this._popStateInProgress) {
+      return;
+    }
+    const state = window.history.state;
+    if (this.#isValidState(state) && state.uid < this._maxUid) {
+      window.history.forward();
+    }
+  }
+  get popStateInProgress() {
+    return this._initialized && (this._popStateInProgress || this._blockHashChange > 0);
+  }
+  get initialBookmark() {
+    return this._initialized ? this._initialBookmark : null;
+  }
+  get initialRotation() {
+    return this._initialized ? this._initialRotation : null;
+  }
+  #pushOrReplaceState(destination, forceReplace = false) {
+    const shouldReplace = forceReplace || !this._destination;
+    const newState = {
+      fingerprint: this._fingerprint,
+      uid: shouldReplace ? this._uid : this._uid + 1,
+      destination
+    };
+    this.#updateInternalState(destination, newState.uid);
+    let newUrl;
+    if (this._updateUrl && destination?.hash) {
+      const {
+        href,
+        protocol
+      } = document.location;
+      if (protocol !== "file:") {
+        newUrl = updateUrlHash(href, destination.hash);
+      }
+    }
+    if (shouldReplace) {
+      window.history.replaceState(newState, "", newUrl);
+    } else {
+      window.history.pushState(newState, "", newUrl);
+    }
+  }
+  #tryPushCurrentPosition(temporary = false) {
+    if (!this._position) {
+      return;
+    }
+    let position = this._position;
+    if (temporary) {
+      position = Object.assign(Object.create(null), this._position);
+      position.temporary = true;
+    }
+    if (!this._destination) {
+      this.#pushOrReplaceState(position);
+      return;
+    }
+    if (this._destination.temporary) {
+      this.#pushOrReplaceState(position, true);
+      return;
+    }
+    if (this._destination.hash === position.hash) {
+      return;
+    }
+    if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) {
+      return;
+    }
+    let forceReplace = false;
+    if (this._destination.page >= position.first && this._destination.page <= position.page) {
+      if (this._destination.dest !== undefined || !this._destination.first) {
+        return;
+      }
+      forceReplace = true;
+    }
+    this.#pushOrReplaceState(position, forceReplace);
+  }
+  #isValidPage(val) {
+    return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount;
+  }
+  #isValidState(state, checkReload = false) {
+    if (!state) {
+      return false;
+    }
+    if (state.fingerprint !== this._fingerprint) {
+      if (checkReload) {
+        if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) {
+          return false;
+        }
+        const [perfEntry] = performance.getEntriesByType("navigation");
+        if (perfEntry?.type !== "reload") {
+          return false;
+        }
+      } else {
+        return false;
+      }
+    }
+    if (!Number.isInteger(state.uid) || state.uid < 0) {
+      return false;
+    }
+    if (state.destination === null || typeof state.destination !== "object") {
+      return false;
+    }
+    return true;
+  }
+  #updateInternalState(destination, uid, removeTemporary = false) {
+    if (this._updateViewareaTimeout) {
+      clearTimeout(this._updateViewareaTimeout);
+      this._updateViewareaTimeout = null;
+    }
+    if (removeTemporary && destination?.temporary) {
+      delete destination.temporary;
+    }
+    this._destination = destination;
+    this._uid = uid;
+    this._maxUid = Math.max(this._maxUid, uid);
+    this._numPositionUpdates = 0;
+  }
+  #parseCurrentHash(checkNameddest = false) {
+    const hash = unescape(getCurrentHash()).substring(1);
+    const params = parseQueryString(hash);
+    const nameddest = params.get("nameddest") || "";
+    let page = params.get("page") | 0;
+    if (!this.#isValidPage(page) || checkNameddest && nameddest.length > 0) {
+      page = null;
+    }
+    return {
+      hash,
+      page,
+      rotation: this.linkService.rotation
+    };
+  }
+  #updateViewarea({
+    location
+  }) {
+    if (this._updateViewareaTimeout) {
+      clearTimeout(this._updateViewareaTimeout);
+      this._updateViewareaTimeout = null;
+    }
+    this._position = {
+      hash: location.pdfOpenParams.substring(1),
+      page: this.linkService.page,
+      first: location.pageNumber,
+      rotation: location.rotation
+    };
+    if (this._popStateInProgress) {
+      return;
+    }
+    if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) {
+      this._numPositionUpdates++;
+    }
+    if (UPDATE_VIEWAREA_TIMEOUT > 0) {
+      this._updateViewareaTimeout = setTimeout(() => {
+        if (!this._popStateInProgress) {
+          this.#tryPushCurrentPosition(true);
+        }
+        this._updateViewareaTimeout = null;
+      }, UPDATE_VIEWAREA_TIMEOUT);
+    }
+  }
+  #popState({
+    state
+  }) {
+    const newHash = getCurrentHash(),
+      hashChanged = this._currentHash !== newHash;
+    this._currentHash = newHash;
+    if (!state) {
+      this._uid++;
+      const {
+        hash,
+        page,
+        rotation
+      } = this.#parseCurrentHash();
+      this.#pushOrReplaceState({
+        hash,
+        page,
+        rotation
+      }, true);
+      return;
+    }
+    if (!this.#isValidState(state)) {
+      return;
+    }
+    this._popStateInProgress = true;
+    if (hashChanged) {
+      this._blockHashChange++;
+      waitOnEventOrTimeout({
+        target: window,
+        name: "hashchange",
+        delay: HASH_CHANGE_TIMEOUT
+      }).then(() => {
+        this._blockHashChange--;
+      });
+    }
+    const destination = state.destination;
+    this.#updateInternalState(destination, state.uid, true);
+    if (isValidRotation(destination.rotation)) {
+      this.linkService.rotation = destination.rotation;
+    }
+    if (destination.dest) {
+      this.linkService.goToDestination(destination.dest);
+    } else if (destination.hash) {
+      this.linkService.setHash(destination.hash);
+    } else if (destination.page) {
+      this.linkService.page = destination.page;
+    }
+    Promise.resolve().then(() => {
+      this._popStateInProgress = false;
+    });
+  }
+  #pageHide() {
+    if (!this._destination || this._destination.temporary) {
+      this.#tryPushCurrentPosition();
+    }
+  }
+  #bindEvents() {
+    if (this.#eventAC) {
+      return;
+    }
+    this.#eventAC = new AbortController();
+    const {
+      signal
+    } = this.#eventAC;
+    this.eventBus.on("updateviewarea", this.#updateViewarea.bind(this), {
+      signal,
+      ...internalOpt
+    });
+    window.addEventListener("popstate", this.#popState.bind(this), {
+      signal
+    });
+    window.addEventListener("pagehide", this.#pageHide.bind(this), {
+      signal
+    });
+  }
+  #unbindEvents() {
+    this.#eventAC?.abort();
+    this.#eventAC = null;
+  }
+}
+function isDestHashesEqual(destHash, pushHash) {
+  if (typeof destHash !== "string" || typeof pushHash !== "string") {
+    return false;
+  }
+  if (destHash === pushHash) {
+    return true;
+  }
+  const nameddest = parseQueryString(destHash).get("nameddest");
+  if (nameddest === pushHash) {
+    return true;
+  }
+  return false;
+}
+function isDestArraysEqual(firstDest, secondDest) {
+  function isEntryEqual(first, second) {
+    if (typeof first !== typeof second) {
+      return false;
+    }
+    if (Array.isArray(first) || Array.isArray(second)) {
+      return false;
+    }
+    if (first !== null && typeof first === "object" && second !== null) {
+      if (Object.keys(first).length !== Object.keys(second).length) {
+        return false;
+      }
+      for (const key in first) {
+        if (!isEntryEqual(first[key], second[key])) {
+          return false;
+        }
+      }
+      return true;
+    }
+    return first === second || Number.isNaN(first) && Number.isNaN(second);
+  }
+  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {
+    return false;
+  }
+  if (firstDest.length !== secondDest.length) {
+    return false;
+  }
+  for (let i = 0, ii = firstDest.length; i < ii; i++) {
+    if (!isEntryEqual(firstDest[i], secondDest[i])) {
+      return false;
+    }
+  }
+  return true;
+}
+
+;// ./web/pdf_layer_viewer.js
+
+
+class PDFLayerViewer extends BaseTreeViewer {
+  constructor(options) {
+    super(options);
+    const {
+      eventBus
+    } = this;
+    eventBus.on("optionalcontentconfigchanged", evt => {
+      this.#updateLayers(evt.promise);
+    }, internalOpt);
+    eventBus.on("resetlayers", () => {
+      this.#updateLayers();
+    }, internalOpt);
+    eventBus.on("togglelayerstree", this._toggleAllTreeItems.bind(this), internalOpt);
+  }
+  reset() {
+    super.reset();
+    this._optionalContentConfig = null;
+    this._optionalContentVisibility?.clear();
+    this._optionalContentVisibility = null;
+  }
+  _dispatchEvent(layersCount) {
+    this.eventBus.dispatch("layersloaded", {
+      source: this,
+      layersCount
+    });
+  }
+  _bindLink(element, {
+    groupId,
+    input
+  }) {
+    const setVisibility = () => {
+      const visible = input.checked;
+      this._optionalContentConfig.setVisibility(groupId, visible);
+      const cached = this._optionalContentVisibility.get(groupId);
+      if (cached) {
+        cached.visible = visible;
+      }
+      this.eventBus.dispatch("optionalcontentconfig", {
+        source: this,
+        promise: Promise.resolve(this._optionalContentConfig)
+      });
+    };
+    element.onclick = evt => {
+      if (evt.target === input) {
+        setVisibility();
+        return true;
+      } else if (evt.target !== element) {
+        return true;
+      }
+      input.checked = !input.checked;
+      setVisibility();
+      return false;
+    };
+  }
+  _setNestedName(element, {
+    name = null
+  }) {
+    if (typeof name === "string") {
+      element.textContent = this._normalizeTextContent(name);
+      return;
+    }
+    element.setAttribute("data-l10n-id", "pdfjs-additional-layers");
+    element.style.fontStyle = "italic";
+    this._l10n.translateOnce(element);
+  }
+  _addToggleButton(div, {
+    name = null
+  }) {
+    super._addToggleButton(div, name === null);
+  }
+  _toggleAllTreeItems() {
+    if (!this._optionalContentConfig) {
+      return;
+    }
+    super._toggleAllTreeItems();
+  }
+  render({
+    optionalContentConfig,
+    pdfDocument
+  }) {
+    if (this._optionalContentConfig) {
+      this.reset();
+    }
+    this._optionalContentConfig = optionalContentConfig || null;
+    this._pdfDocument = pdfDocument || null;
+    const groups = optionalContentConfig?.getOrder();
+    if (!groups) {
+      this._dispatchEvent(0);
+      return;
+    }
+    this._optionalContentVisibility = new Map();
+    const fragment = document.createDocumentFragment(),
+      queue = [{
+        parent: fragment,
+        groups
+      }];
+    let layersCount = 0,
+      hasAnyNesting = false;
+    while (queue.length > 0) {
+      const levelData = queue.shift();
+      for (const groupId of levelData.groups) {
+        const div = document.createElement("div");
+        div.className = "treeItem";
+        const element = document.createElement("a");
+        div.append(element);
+        if (typeof groupId === "object") {
+          hasAnyNesting = true;
+          this._addToggleButton(div, groupId);
+          this._setNestedName(element, groupId);
+          const itemsDiv = document.createElement("div");
+          itemsDiv.className = "treeItems";
+          div.append(itemsDiv);
+          queue.push({
+            parent: itemsDiv,
+            groups: groupId.order
+          });
+        } else {
+          const group = optionalContentConfig.getGroup(groupId);
+          const label = document.createElement("label");
+          const input = document.createElement("input");
+          label.append(input, document.createTextNode(this._normalizeTextContent(group.name)));
+          this._bindLink(element, {
+            groupId,
+            input
+          });
+          input.type = "checkbox";
+          input.checked = group.visible;
+          this._optionalContentVisibility.set(groupId, {
+            input,
+            visible: input.checked
+          });
+          element.append(label);
+          layersCount++;
+        }
+        levelData.parent.append(div);
+      }
+    }
+    this._finishRendering(fragment, layersCount, hasAnyNesting);
+  }
+  async #updateLayers(promise = null) {
+    if (!this._optionalContentConfig) {
+      return;
+    }
+    const pdfDocument = this._pdfDocument;
+    const optionalContentConfig = await (promise || pdfDocument.getOptionalContentConfig({
+      intent: "display"
+    }));
+    if (pdfDocument !== this._pdfDocument) {
+      return;
+    }
+    if (promise) {
+      for (const [groupId, cached] of this._optionalContentVisibility) {
+        const group = optionalContentConfig.getGroup(groupId);
+        if (group && cached.visible !== group.visible) {
+          cached.input.checked = cached.visible = !cached.visible;
+        }
+      }
+      return;
+    }
+    this.eventBus.dispatch("optionalcontentconfig", {
+      source: this,
+      promise: Promise.resolve(optionalContentConfig)
+    });
+    this.render({
+      optionalContentConfig,
+      pdfDocument: this._pdfDocument
+    });
+  }
+}
+
+;// ./web/pdf_outline_viewer.js
+
+
+
+class PDFOutlineViewer extends BaseTreeViewer {
+  constructor(options) {
+    super(options);
+    this.linkService = options.linkService;
+    this.downloadManager = options.downloadManager;
+    const {
+      eventBus
+    } = this;
+    eventBus.on("toggleoutlinetree", this._toggleAllTreeItems.bind(this), internalOpt);
+    eventBus.on("currentoutlineitem", this._currentOutlineItem.bind(this), internalOpt);
+    eventBus.on("pagechanging", evt => {
+      this._currentPageNumber = evt.pageNumber;
+    }, internalOpt);
+    eventBus.on("pagesloaded", evt => {
+      this._isPagesLoaded = !!evt.pagesCount;
+      this._currentOutlineItemCapability?.resolve(this._isPagesLoaded);
+    }, internalOpt);
+    eventBus.on("sidebarviewchanged", evt => {
+      this._sidebarView = evt.view;
+    }, internalOpt);
+  }
+  reset() {
+    super.reset();
+    this._outline = null;
+    this._pageNumberToDestHashCapability = null;
+    this._currentPageNumber = 1;
+    this._isPagesLoaded = null;
+    this._currentOutlineItemCapability?.resolve(false);
+    this._currentOutlineItemCapability = null;
+  }
+  _dispatchEvent(outlineCount) {
+    this._currentOutlineItemCapability = Promise.withResolvers();
+    if (outlineCount === 0 || this._pdfDocument?.loadingParams.disableAutoFetch) {
+      this._currentOutlineItemCapability.resolve(false);
+    } else if (this._isPagesLoaded !== null) {
+      this._currentOutlineItemCapability.resolve(this._isPagesLoaded);
+    }
+    this.eventBus.dispatch("outlineloaded", {
+      source: this,
+      outlineCount,
+      currentOutlineItemPromise: this._currentOutlineItemCapability.promise
+    });
+  }
+  _bindLink(element, {
+    url,
+    newWindow,
+    action,
+    attachmentId,
+    attachment,
+    dest,
+    setOCGState
+  }) {
+    const {
+      linkService
+    } = this;
+    if (url) {
+      linkService.addLinkAttributes(element, url, newWindow);
+      return;
+    }
+    if (action) {
+      element.href = linkService.getAnchorUrl("");
+      element.onclick = () => {
+        linkService.executeNamedAction(action);
+        return false;
+      };
+      return;
+    }
+    if (attachmentId && attachment) {
+      element.href = linkService.getAnchorUrl("");
+      const openAttachment = async () => {
+        const content = await linkService.getAttachmentContent(attachmentId);
+        if (content) {
+          this.downloadManager?.openOrDownloadData(content, attachment.filename);
+        }
+      };
+      element.onclick = () => {
+        openAttachment();
+        return false;
+      };
+      return;
+    }
+    if (setOCGState) {
+      element.href = linkService.getAnchorUrl("");
+      element.onclick = () => {
+        linkService.executeSetOCGState(setOCGState);
+        return false;
+      };
+      return;
+    }
+    element.href = linkService.getDestinationHash(dest);
+    element.onclick = evt => {
+      this._updateCurrentTreeItem(evt.target.parentNode);
+      if (dest) {
+        linkService.goToDestination(dest);
+      }
+      return false;
+    };
+  }
+  _setStyles(element, {
+    bold,
+    italic
+  }) {
+    if (bold) {
+      element.style.fontWeight = "bold";
+    }
+    if (italic) {
+      element.style.fontStyle = "italic";
+    }
+  }
+  _addToggleButton(div, {
+    count,
+    items
+  }) {
+    let hidden = false;
+    if (count < 0) {
+      let totalCount = items.length;
+      if (totalCount > 0) {
+        const queue = [...items];
+        while (queue.length > 0) {
+          const {
+            count: nestedCount,
+            items: nestedItems
+          } = queue.shift();
+          if (nestedCount > 0 && nestedItems.length > 0) {
+            totalCount += nestedItems.length;
+            queue.push(...nestedItems);
+          }
+        }
+      }
+      if (Math.abs(count) === totalCount) {
+        hidden = true;
+      }
+    }
+    super._addToggleButton(div, hidden);
+  }
+  _toggleAllTreeItems() {
+    if (!this._outline) {
+      return;
+    }
+    super._toggleAllTreeItems();
+  }
+  render({
+    outline,
+    pdfDocument
+  }) {
+    if (this._outline) {
+      this.reset();
+    }
+    this._outline = outline || null;
+    this._pdfDocument = pdfDocument || null;
+    if (!outline) {
+      this._dispatchEvent(0);
+      return;
+    }
+    const fragment = document.createDocumentFragment();
+    const queue = [{
+      parent: fragment,
+      items: outline
+    }];
+    let outlineCount = 0,
+      hasAnyNesting = false;
+    while (queue.length > 0) {
+      const levelData = queue.shift();
+      for (const item of levelData.items) {
+        const div = document.createElement("div");
+        div.className = "treeItem";
+        const element = document.createElement("a");
+        this._bindLink(element, item);
+        this._setStyles(element, item);
+        element.textContent = this._normalizeTextContent(item.title);
+        div.append(element);
+        if (item.items.length > 0) {
+          hasAnyNesting = true;
+          this._addToggleButton(div, item);
+          const itemsDiv = document.createElement("div");
+          itemsDiv.className = "treeItems";
+          div.append(itemsDiv);
+          queue.push({
+            parent: itemsDiv,
+            items: item.items
+          });
+        }
+        levelData.parent.append(div);
+        outlineCount++;
+      }
+    }
+    this._finishRendering(fragment, outlineCount, hasAnyNesting);
+  }
+  async _currentOutlineItem() {
+    if (!this._isPagesLoaded) {
+      throw new Error("_currentOutlineItem: All pages have not been loaded.");
+    }
+    if (!this._outline || !this._pdfDocument) {
+      return;
+    }
+    const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument);
+    if (!pageNumberToDestHash) {
+      return;
+    }
+    this._updateCurrentTreeItem(null);
+    if (this._sidebarView !== SidebarView.OUTLINE) {
+      return;
+    }
+    for (let i = this._currentPageNumber; i > 0; i--) {
+      const destHash = pageNumberToDestHash.get(i);
+      if (!destHash) {
+        continue;
+      }
+      const linkElement = this.container.querySelector(`a[href="${destHash}"]`);
+      if (!linkElement) {
+        continue;
+      }
+      this._scrollToCurrentTreeItem(linkElement.parentNode);
+      break;
+    }
+  }
+  async _getPageNumberToDestHash(pdfDocument) {
+    if (this._pageNumberToDestHashCapability) {
+      return this._pageNumberToDestHashCapability.promise;
+    }
+    this._pageNumberToDestHashCapability = Promise.withResolvers();
+    const pageNumberToDestHash = new Map(),
+      pageNumberNesting = new Map();
+    const queue = [{
+      nesting: 0,
+      items: this._outline
+    }];
+    while (queue.length > 0) {
+      const levelData = queue.shift(),
+        currentNesting = levelData.nesting;
+      for (const {
+        dest,
+        items
+      } of levelData.items) {
+        let explicitDest, pageNumber;
+        if (typeof dest === "string") {
+          explicitDest = await pdfDocument.getDestination(dest);
+          if (pdfDocument !== this._pdfDocument) {
+            return null;
+          }
+        } else {
+          explicitDest = dest;
+        }
+        if (Array.isArray(explicitDest)) {
+          const [destRef] = explicitDest;
+          if (destRef && typeof destRef === "object") {
+            pageNumber = pdfDocument.cachedPageNumber(destRef);
+          } else if (Number.isInteger(destRef)) {
+            pageNumber = destRef + 1;
+          }
+          if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > pageNumberNesting.get(pageNumber))) {
+            const destHash = this.linkService.getDestinationHash(dest);
+            pageNumberToDestHash.set(pageNumber, destHash);
+            pageNumberNesting.set(pageNumber, currentNesting);
+          }
+        }
+        if (items.length > 0) {
+          queue.push({
+            nesting: currentNesting + 1,
+            items
+          });
+        }
+      }
+    }
+    this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null);
+    return this._pageNumberToDestHashCapability.promise;
+  }
+}
+
+;// ./web/pdf_presentation_mode.js
+
+
+const DELAY_BEFORE_HIDING_CONTROLS = 3000;
+const ACTIVE_SELECTOR = "pdfPresentationMode";
+const CONTROLS_SELECTOR = "pdfPresentationModeControls";
+const MOUSE_SCROLL_COOLDOWN_TIME = 50;
+const PAGE_SWITCH_THRESHOLD = 0.1;
+const SWIPE_MIN_DISTANCE_THRESHOLD = 50;
+const SWIPE_ANGLE_THRESHOLD = Math.PI / 6;
+class PDFPresentationMode {
+  #state = PresentationModeState.UNKNOWN;
+  #args = null;
+  #fullscreenChangeAC = null;
+  #windowAC = null;
+  constructor({
+    container,
+    pdfViewer,
+    eventBus
+  }) {
+    this.container = container;
+    this.pdfViewer = pdfViewer;
+    this.eventBus = eventBus;
+    this.contextMenuOpen = false;
+    this.mouseScrollTimeStamp = 0;
+    this.mouseScrollDelta = 0;
+    this.touchSwipeState = null;
+  }
+  async request() {
+    const {
+      container,
+      pdfViewer
+    } = this;
+    if (this.active || !pdfViewer.pagesCount || !container.requestFullscreen) {
+      return false;
+    }
+    this.#addFullscreenChangeListeners();
+    this.#notifyStateChange(PresentationModeState.CHANGING);
+    const promise = container.requestFullscreen();
+    this.#args = {
+      pageNumber: pdfViewer.currentPageNumber,
+      scaleValue: pdfViewer.currentScaleValue,
+      scrollMode: pdfViewer.scrollMode,
+      spreadMode: null,
+      annotationEditorMode: null
+    };
+    if (pdfViewer.spreadMode !== SpreadMode.NONE && !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)) {
+      console.warn("Ignoring Spread modes when entering PresentationMode, " + "since the document may contain varying page sizes.");
+      this.#args.spreadMode = pdfViewer.spreadMode;
+    }
+    if (pdfViewer.annotationEditorMode !== AnnotationEditorType.DISABLE) {
+      this.#args.annotationEditorMode = pdfViewer.annotationEditorMode;
+    }
+    try {
+      await promise;
+      pdfViewer.focus();
+      return true;
+    } catch {
+      this.#removeFullscreenChangeListeners();
+      this.#notifyStateChange(PresentationModeState.NORMAL);
+    }
+    return false;
+  }
+  get active() {
+    return this.#state === PresentationModeState.CHANGING || this.#state === PresentationModeState.FULLSCREEN;
+  }
+  #mouseWheel(evt) {
+    if (!this.active) {
+      return;
+    }
+    if (evt.target.closest?.(".mediaAnnotation")) {
+      return;
+    }
+    evt.preventDefault();
+    const delta = normalizeWheelEventDelta(evt);
+    const currentTime = Date.now();
+    const storedTime = this.mouseScrollTimeStamp;
+    if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
+      return;
+    }
+    if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {
+      this.#resetMouseScrollState();
+    }
+    this.mouseScrollDelta += delta;
+    if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {
+      const totalDelta = this.mouseScrollDelta;
+      this.#resetMouseScrollState();
+      const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage();
+      if (success) {
+        this.mouseScrollTimeStamp = currentTime;
+      }
+    }
+  }
+  #notifyStateChange(state) {
+    this.#state = state;
+    this.eventBus.dispatch("presentationmodechanged", {
+      source: this,
+      state
+    });
+  }
+  #enter() {
+    this.#notifyStateChange(PresentationModeState.FULLSCREEN);
+    this.container.classList.add(ACTIVE_SELECTOR);
+    setTimeout(() => {
+      this.pdfViewer.scrollMode = ScrollMode.PAGE;
+      if (this.#args.spreadMode !== null) {
+        this.pdfViewer.spreadMode = SpreadMode.NONE;
+      }
+      this.pdfViewer.currentPageNumber = this.#args.pageNumber;
+      this.pdfViewer.currentScaleValue = "page-fit";
+      if (this.#args.annotationEditorMode !== null) {
+        this.pdfViewer.annotationEditorMode = {
+          mode: AnnotationEditorType.NONE
+        };
+      }
+    }, 0);
+    this.#addWindowListeners();
+    this.#showControls();
+    this.contextMenuOpen = false;
+    document.getSelection().empty();
+  }
+  #exit() {
+    const pageNumber = this.pdfViewer.currentPageNumber;
+    this.container.classList.remove(ACTIVE_SELECTOR);
+    setTimeout(() => {
+      this.#removeFullscreenChangeListeners();
+      this.#notifyStateChange(PresentationModeState.NORMAL);
+      this.pdfViewer.scrollMode = this.#args.scrollMode;
+      if (this.#args.spreadMode !== null) {
+        this.pdfViewer.spreadMode = this.#args.spreadMode;
+      }
+      this.pdfViewer.currentScaleValue = this.#args.scaleValue;
+      this.pdfViewer.currentPageNumber = pageNumber;
+      if (this.#args.annotationEditorMode !== null) {
+        this.pdfViewer.annotationEditorMode = {
+          mode: this.#args.annotationEditorMode
+        };
+      }
+      this.#args = null;
+    }, 0);
+    this.#removeWindowListeners();
+    this.#hideControls();
+    this.#resetMouseScrollState();
+    this.contextMenuOpen = false;
+  }
+  #mouseDown(evt) {
+    if (this.contextMenuOpen) {
+      this.contextMenuOpen = false;
+      evt.preventDefault();
+      return;
+    }
+    if (evt.button !== 0) {
+      return;
+    }
+    if (evt.target.href && evt.target.parentNode?.hasAttribute("data-internal-link")) {
+      return;
+    }
+    if (evt.target.closest?.(".mediaAnnotation")) {
+      return;
+    }
+    evt.preventDefault();
+    if (evt.shiftKey) {
+      this.pdfViewer.previousPage();
+    } else {
+      this.pdfViewer.nextPage();
+    }
+  }
+  #contextMenu() {
+    this.contextMenuOpen = true;
+  }
+  #showControls() {
+    if (this.controlsTimeout) {
+      clearTimeout(this.controlsTimeout);
+    } else {
+      this.container.classList.add(CONTROLS_SELECTOR);
+    }
+    this.controlsTimeout = setTimeout(() => {
+      this.container.classList.remove(CONTROLS_SELECTOR);
+      delete this.controlsTimeout;
+    }, DELAY_BEFORE_HIDING_CONTROLS);
+  }
+  #hideControls() {
+    if (!this.controlsTimeout) {
+      return;
+    }
+    clearTimeout(this.controlsTimeout);
+    this.container.classList.remove(CONTROLS_SELECTOR);
+    delete this.controlsTimeout;
+  }
+  #resetMouseScrollState() {
+    this.mouseScrollTimeStamp = 0;
+    this.mouseScrollDelta = 0;
+  }
+  #touchSwipe(evt) {
+    if (!this.active) {
+      return;
+    }
+    if (evt.target.closest?.(".mediaAnnotation")) {
+      this.touchSwipeState = null;
+      return;
+    }
+    if (evt.touches.length > 1) {
+      this.touchSwipeState = null;
+      return;
+    }
+    switch (evt.type) {
+      case "touchstart":
+        this.touchSwipeState = {
+          startX: evt.touches[0].pageX,
+          startY: evt.touches[0].pageY,
+          endX: evt.touches[0].pageX,
+          endY: evt.touches[0].pageY
+        };
+        break;
+      case "touchmove":
+        if (this.touchSwipeState === null) {
+          return;
+        }
+        this.touchSwipeState.endX = evt.touches[0].pageX;
+        this.touchSwipeState.endY = evt.touches[0].pageY;
+        evt.preventDefault();
+        break;
+      case "touchend":
+        if (this.touchSwipeState === null) {
+          return;
+        }
+        let delta = 0;
+        const dx = this.touchSwipeState.endX - this.touchSwipeState.startX;
+        const dy = this.touchSwipeState.endY - this.touchSwipeState.startY;
+        const absAngle = Math.abs(Math.atan2(dy, dx));
+        if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) {
+          delta = dx;
+        } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) {
+          delta = dy;
+        }
+        if (delta > 0) {
+          this.pdfViewer.previousPage();
+        } else if (delta < 0) {
+          this.pdfViewer.nextPage();
+        }
+        break;
+    }
+  }
+  #addWindowListeners() {
+    if (this.#windowAC) {
+      return;
+    }
+    this.#windowAC = new AbortController();
+    const {
+      signal
+    } = this.#windowAC;
+    const touchSwipeBind = this.#touchSwipe.bind(this);
+    window.addEventListener("mousemove", this.#showControls.bind(this), {
+      signal
+    });
+    window.addEventListener("mousedown", this.#mouseDown.bind(this), {
+      signal
+    });
+    window.addEventListener("wheel", this.#mouseWheel.bind(this), {
+      passive: false,
+      signal
+    });
+    window.addEventListener("keydown", this.#resetMouseScrollState.bind(this), {
+      signal
+    });
+    window.addEventListener("contextmenu", this.#contextMenu.bind(this), {
+      signal
+    });
+    window.addEventListener("touchstart", touchSwipeBind, {
+      signal
+    });
+    window.addEventListener("touchmove", touchSwipeBind, {
+      signal
+    });
+    window.addEventListener("touchend", touchSwipeBind, {
+      signal
+    });
+  }
+  #removeWindowListeners() {
+    this.#windowAC?.abort();
+    this.#windowAC = null;
+  }
+  #addFullscreenChangeListeners() {
+    if (this.#fullscreenChangeAC) {
+      return;
+    }
+    this.#fullscreenChangeAC = new AbortController();
+    window.addEventListener("fullscreenchange", () => {
+      if (document.fullscreenElement) {
+        this.#enter();
+      } else {
+        this.#exit();
+      }
+    }, {
+      signal: this.#fullscreenChangeAC.signal
+    });
+  }
+  #removeFullscreenChangeListeners() {
+    this.#fullscreenChangeAC?.abort();
+    this.#fullscreenChangeAC = null;
+  }
+}
+
+;// ./web/xfa_layer_builder.js
+
+class XfaLayerBuilder {
+  #cancelled = false;
+  div = null;
+  constructor({
+    pdfPage,
+    annotationStorage = null,
+    linkService,
+    xfaHtml = null
+  }) {
+    this.pdfPage = pdfPage;
+    this.annotationStorage = annotationStorage;
+    this.linkService = linkService;
+    this.xfaHtml = xfaHtml;
+  }
+  async render({
+    viewport,
+    intent = "display"
+  }) {
+    let xfaHtml;
+    if (intent === "print") {
+      xfaHtml = this.xfaHtml;
+    } else {
+      xfaHtml = await this.pdfPage.getXfa();
+      if (this.#cancelled || !xfaHtml) {
+        return {
+          textDivs: []
+        };
+      }
+    }
+    const hasDiv = !!this.div;
+    const params = {
+      viewport: viewport.clone({
+        dontFlip: true
+      }),
+      div: this.div ??= document.createElement("div"),
+      xfaHtml,
+      annotationStorage: this.annotationStorage,
+      linkService: this.linkService,
+      intent
+    };
+    return hasDiv ? XfaLayer.update(params) : XfaLayer.render(params);
+  }
+  cancel() {
+    this.#cancelled = true;
+  }
+  hide() {
+    if (!this.div) {
+      return;
+    }
+    this.div.hidden = true;
+  }
+}
+
+;// ./web/print_utils.js
+
+
+
+class BasePrintServiceFactory {
+  static initGlobals(app) {}
+  static get supportsPrinting() {
+    throw new Error("Not implemented: supportsPrinting");
+  }
+  static createPrintService(params) {
+    throw new Error("Not implemented: createPrintService");
+  }
+}
+function getXfaHtmlForPrinting(printContainer, pdfDocument) {
+  const xfaHtml = pdfDocument.allXfaHtml;
+  const linkService = new SimpleLinkService();
+  const scale = Math.round(PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100;
+  for (const xfaPage of xfaHtml.children) {
+    const page = document.createElement("div");
+    page.className = "xfaPrintedPage";
+    printContainer.append(page);
+    const builder = new XfaLayerBuilder({
+      pdfPage: null,
+      annotationStorage: pdfDocument.annotationStorage,
+      linkService,
+      xfaHtml: xfaPage
+    });
+    const viewport = XfaLayer.getPageViewport(xfaPage, {
+      scale
+    });
+    builder.render({
+      viewport,
+      intent: "print"
+    });
+    page.append(builder.div);
+  }
+}
+
+;// ./web/pdf_print_service.js
+
+
+let activeService = null;
+let dialog = null;
+let overlayManager = null;
+let viewerApp = {
+  initialized: false
+};
+function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise) {
+  const scratchCanvas = activeService.scratchCanvas;
+  const PRINT_UNITS = printResolution / PixelsPerInch.PDF;
+  scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);
+  scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);
+  const ctx = scratchCanvas.getContext("2d");
+  ctx.save();
+  ctx.fillStyle = "rgb(255, 255, 255)";
+  ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);
+  ctx.restore();
+  return Promise.all([pdfDocument.getPage(pageNumber), printAnnotationStoragePromise]).then(function ([pdfPage, printAnnotationStorage]) {
+    const renderContext = {
+      canvas: scratchCanvas,
+      transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],
+      viewport: pdfPage.getViewport({
+        scale: 1,
+        rotation: size.rotation
+      }),
+      intent: "print",
+      annotationMode: AnnotationMode.ENABLE_STORAGE,
+      optionalContentConfigPromise,
+      printAnnotationStorage
+    };
+    const renderTask = pdfPage.render(renderContext);
+    return renderTask.promise.catch(reason => {
+      if (!(reason instanceof RenderingCancelledException)) {
+        console.error(reason);
+      }
+      throw reason;
+    });
+  });
+}
+class PDFPrintService {
+  constructor({
+    pdfDocument,
+    pagesOverview,
+    printContainer,
+    printResolution,
+    printAnnotationStoragePromise = null
+  }) {
+    this.pdfDocument = pdfDocument;
+    this.pagesOverview = pagesOverview;
+    this.printContainer = printContainer;
+    this._printResolution = printResolution || 150;
+    this._optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({
+      intent: "print"
+    });
+    this._printAnnotationStoragePromise = printAnnotationStoragePromise || Promise.resolve();
+    this.currentPage = -1;
+    this.scratchCanvas = document.createElement("canvas");
+  }
+  layout() {
+    this.throwIfInactive();
+    const body = document.querySelector("body");
+    body.setAttribute("data-pdfjsprinting", true);
+    const {
+      width,
+      height
+    } = this.pagesOverview[0];
+    const hasEqualPageSizes = this.pagesOverview.every(size => size.width === width && size.height === height);
+    if (!hasEqualPageSizes) {
+      console.warn("Not all pages have the same size. The printed result may be incorrect!");
+    }
+    this.pageStyleSheet = new CSSStyleSheet();
+    this.pageStyleSheet.replaceSync(`@page { size: ${width}pt ${height}pt;}`);
+    document.adoptedStyleSheets.push(this.pageStyleSheet);
+  }
+  destroy() {
+    if (activeService !== this) {
+      return;
+    }
+    this.printContainer.textContent = "";
+    const body = document.querySelector("body");
+    body.removeAttribute("data-pdfjsprinting");
+    if (this.pageStyleSheet) {
+      document.adoptedStyleSheets = document.adoptedStyleSheets.filter(styleSheet => styleSheet !== this.pageStyleSheet);
+      this.pageStyleSheet = null;
+    }
+    if (this._blobURLs) {
+      for (const url of this._blobURLs) {
+        URL.revokeObjectURL(url);
+      }
+      this._blobURLs = null;
+    }
+    this.scratchCanvas.width = this.scratchCanvas.height = 0;
+    this.scratchCanvas = null;
+    activeService = null;
+    ensureOverlay().then(function () {
+      overlayManager.closeIfActive(dialog);
+    });
+  }
+  renderPages() {
+    if (this.pdfDocument.isPureXfa) {
+      getXfaHtmlForPrinting(this.printContainer, this.pdfDocument);
+      return Promise.resolve();
+    }
+    const pageCount = this.pagesOverview.length;
+    const renderNextPage = (resolve, reject) => {
+      this.throwIfInactive();
+      if (++this.currentPage >= pageCount) {
+        renderProgress(pageCount, pageCount);
+        resolve();
+        return;
+      }
+      const index = this.currentPage;
+      renderProgress(index, pageCount);
+      renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise, this._printAnnotationStoragePromise).then(this.useRenderedPage.bind(this)).then(function () {
+        renderNextPage(resolve, reject);
+      }, reject);
+    };
+    return new Promise(renderNextPage);
+  }
+  useRenderedPage() {
+    this.throwIfInactive();
+    const img = document.createElement("img");
+    this.scratchCanvas.toBlob(blob => {
+      const blobURL = URL.createObjectURL(blob);
+      img.src = blobURL;
+      (this._blobURLs ??= []).push(blobURL);
+    });
+    const wrapper = document.createElement("div");
+    wrapper.className = "printedPage";
+    wrapper.append(img);
+    this.printContainer.append(wrapper);
+    const {
+      promise,
+      resolve,
+      reject
+    } = Promise.withResolvers();
+    img.onload = resolve;
+    img.onerror = reject;
+    promise.catch(() => {});
+    return promise;
+  }
+  performPrint() {
+    this.throwIfInactive();
+    return new Promise(resolve => {
+      setTimeout(() => {
+        if (!this.active) {
+          resolve();
+          return;
+        }
+        print.call(window);
+        setTimeout(resolve, 20);
+      }, 0);
+    });
+  }
+  get active() {
+    return this === activeService;
+  }
+  throwIfInactive() {
+    if (!this.active) {
+      throw new Error("This print request was cancelled or completed.");
+    }
+  }
+}
+const print = window.print;
+window.print = function () {
+  if (activeService) {
+    console.warn("Ignored window.print() because of a pending print job.");
+    return;
+  }
+  ensureOverlay().then(function () {
+    if (activeService) {
+      overlayManager.open(dialog);
+    }
+  });
+  try {
+    dispatchEvent("beforeprint");
+  } finally {
+    if (!activeService) {
+      console.error("Expected print service to be initialized.");
+      ensureOverlay().then(function () {
+        overlayManager.closeIfActive(dialog);
+      });
+    } else {
+      const activeServiceOnEntry = activeService;
+      activeService.renderPages().then(() => activeServiceOnEntry.performPrint()).catch(() => {}).then(() => {
+        if (activeServiceOnEntry.active) {
+          abort();
+        }
+      });
+    }
+  }
+};
+function dispatchEvent(eventType) {
+  const event = new CustomEvent(eventType, {
+    bubbles: false,
+    cancelable: false,
+    detail: "custom"
+  });
+  window.dispatchEvent(event);
+}
+function abort() {
+  if (activeService) {
+    activeService.destroy();
+    dispatchEvent("afterprint");
+  }
+}
+function renderProgress(index, total) {
+  dialog ||= document.getElementById("printServiceDialog");
+  const progress = Math.round(100 * index / total);
+  const progressBar = dialog.querySelector("progress");
+  const progressPerc = dialog.querySelector(".relative-progress");
+  progressBar.value = progress;
+  progressPerc.setAttribute("data-l10n-args", JSON.stringify({
+    progress
+  }));
+}
+window.addEventListener("keydown", function (event) {
+  if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
+    window.print();
+    event.preventDefault();
+    event.stopImmediatePropagation();
+  }
+}, true);
+if ("onbeforeprint" in window) {
+  const stopPropagationIfNeeded = function (event) {
+    if (event.detail !== "custom") {
+      event.stopImmediatePropagation();
+    }
+  };
+  window.addEventListener("beforeprint", stopPropagationIfNeeded);
+  window.addEventListener("afterprint", stopPropagationIfNeeded);
+}
+let overlayPromise;
+function ensureOverlay() {
+  if (!overlayPromise) {
+    overlayManager = viewerApp.overlayManager;
+    if (!overlayManager) {
+      throw new Error("The overlay manager has not yet been initialized.");
+    }
+    dialog ||= document.getElementById("printServiceDialog");
+    overlayPromise = overlayManager.register(dialog, true);
+    document.getElementById("printCancel").onclick = abort;
+    dialog.addEventListener("close", abort);
+  }
+  return overlayPromise;
+}
+class PDFPrintServiceFactory extends BasePrintServiceFactory {
+  static initGlobals(app) {
+    viewerApp = app;
+  }
+  static get supportsPrinting() {
+    return shadow(this, "supportsPrinting", true);
+  }
+  static createPrintService(params) {
+    if (activeService) {
+      throw new Error("The print service is created and active.");
+    }
+    return activeService = new PDFPrintService(params);
+  }
+}
+
+;// ./web/renderable_view.js
+const RenderingStates = {
+  INITIAL: 0,
+  RUNNING: 1,
+  PAUSED: 2,
+  FINISHED: 3
+};
+class RenderableView {
+  renderingId = "";
+  renderTask = null;
+  resume = null;
+  get renderingState() {
+    throw new Error("Abstract getter `renderingState` accessed");
+  }
+  set renderingState(state) {
+    throw new Error("Abstract setter `renderingState` accessed");
+  }
+  async draw() {
+    throw new Error("Not implemented: draw");
+  }
+}
+
+;// ./web/pdf_rendering_queue.js
+
+
+const CLEANUP_TIMEOUT = 30000;
+class PDFRenderingQueue {
+  #highestPriorityPage = null;
+  #idleTimeout = null;
+  #pdfThumbnailViewer = null;
+  #pdfViewer = null;
+  isThumbnailViewEnabled = false;
+  onIdle = null;
+  printing = false;
+  constructor() {
+    Object.defineProperty(this, "hasViewer", {
+      value: () => !!this.#pdfViewer
+    });
+  }
+  setViewer(pdfViewer) {
+    this.#pdfViewer = pdfViewer;
+  }
+  setThumbnailViewer(pdfThumbnailViewer) {
+    this.#pdfThumbnailViewer = pdfThumbnailViewer;
+  }
+  isHighestPriority(view) {
+    return this.#highestPriorityPage === view.renderingId;
+  }
+  renderHighestPriority(currentlyVisiblePages) {
+    if (this.#idleTimeout) {
+      clearTimeout(this.#idleTimeout);
+      this.#idleTimeout = null;
+    }
+    if (this.#pdfViewer.forceRendering(currentlyVisiblePages)) {
+      return;
+    }
+    if (this.isThumbnailViewEnabled && this.#pdfThumbnailViewer?.forceRendering()) {
+      return;
+    }
+    if (this.printing) {
+      return;
+    }
+    if (this.onIdle) {
+      this.#idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);
+    }
+  }
+  getHighestPriority(visible, views, scrolledDown, preRenderExtra = false, ignoreDetailViews = false) {
+    const visibleViews = visible.views,
+      numVisible = visibleViews.length;
+    if (numVisible === 0) {
+      return null;
+    }
+    for (let i = 0; i < numVisible; i++) {
+      const view = visibleViews[i].view;
+      if (!this.isViewFinished(view)) {
+        return view;
+      }
+    }
+    if (!ignoreDetailViews) {
+      for (let i = 0; i < numVisible; i++) {
+        const {
+          detailView
+        } = visibleViews[i].view;
+        if (detailView && !this.isViewFinished(detailView)) {
+          return detailView;
+        }
+      }
+    }
+    const firstId = visible.first.id,
+      lastId = visible.last.id;
+    if (lastId - firstId + 1 > numVisible) {
+      const visibleIds = visible.ids;
+      for (let i = 1, ii = lastId - firstId; i < ii; i++) {
+        const holeId = scrolledDown ? firstId + i : lastId - i;
+        if (visibleIds.has(holeId)) {
+          continue;
+        }
+        const holeView = views[holeId - 1];
+        if (!this.isViewFinished(holeView)) {
+          return holeView;
+        }
+      }
+    }
+    let preRenderIndex = scrolledDown ? lastId : firstId - 2;
+    let preRenderView = views[preRenderIndex];
+    if (preRenderView && !this.isViewFinished(preRenderView)) {
+      return preRenderView;
+    }
+    if (preRenderExtra) {
+      preRenderIndex += scrolledDown ? 1 : -1;
+      preRenderView = views[preRenderIndex];
+      if (preRenderView && !this.isViewFinished(preRenderView)) {
+        return preRenderView;
+      }
+    }
+    return null;
+  }
+  isViewFinished(view) {
+    return view.renderingState === RenderingStates.FINISHED;
+  }
+  renderView(view) {
+    switch (view.renderingState) {
+      case RenderingStates.FINISHED:
+        return false;
+      case RenderingStates.PAUSED:
+        this.#highestPriorityPage = view.renderingId;
+        view.resume();
+        break;
+      case RenderingStates.RUNNING:
+        this.#highestPriorityPage = view.renderingId;
+        break;
+      case RenderingStates.INITIAL:
+        this.#highestPriorityPage = view.renderingId;
+        view.draw().finally(() => {
+          this.renderHighestPriority();
+        }).catch(reason => {
+          if (reason instanceof RenderingCancelledException) {
+            return;
+          }
+          console.error("renderView:", reason);
+        });
+        break;
+    }
+    return true;
+  }
+}
+
+;// ./web/pdf_scripting_manager.js
+
+
+
+
+class PDFScriptingManager {
+  #closeCapability = null;
+  #destroyCapability = null;
+  #docProperties = null;
+  #eventAC = null;
+  #eventBus = null;
+  #externalServices = null;
+  #pdfDocument = null;
+  #pdfViewer = null;
+  #ready = false;
+  #scripting = null;
+  #willPrintCapability = null;
+  constructor({
+    eventBus,
+    externalServices = null,
+    docProperties = null
+  }) {
+    this.#eventBus = eventBus;
+    this.#externalServices = externalServices;
+    this.#docProperties = docProperties;
+  }
+  setViewer(pdfViewer) {
+    this.#pdfViewer = pdfViewer;
+  }
+  async setDocument(pdfDocument) {
+    if (this.#pdfDocument) {
+      await this.#destroyScripting();
+    }
+    this.#pdfDocument = pdfDocument;
+    if (!pdfDocument) {
+      return;
+    }
+    const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]);
+    if (!objects && !docActions) {
+      await this.#destroyScripting();
+      return;
+    }
+    if (pdfDocument !== this.#pdfDocument) {
+      return;
+    }
+    try {
+      this.#scripting = this.#initScripting();
+    } catch (error) {
+      console.error("setDocument:", error);
+      await this.#destroyScripting();
+      return;
+    }
+    const eventBus = this.#eventBus;
+    this.#eventAC = new AbortController();
+    const evtOpts = {
+      signal: this.#eventAC.signal,
+      ...internalOpt
+    };
+    eventBus.on("updatefromsandbox", event => {
+      if (event?.source === window) {
+        this.#updateFromSandbox(event.detail);
+      }
+    }, evtOpts);
+    eventBus.on("dispatcheventinsandbox", event => {
+      this.#scripting?.dispatchEventInSandbox(event.detail);
+    }, evtOpts);
+    eventBus.on("pagechanging", ({
+      pageNumber,
+      previous
+    }) => {
+      if (pageNumber === previous) {
+        return;
+      }
+      this.#dispatchPageClose(previous);
+      this.#dispatchPageOpen(pageNumber);
+    }, evtOpts);
+    eventBus.on("pagerendered", ({
+      pageNumber
+    }) => {
+      if (!this._pageOpenPending.has(pageNumber)) {
+        return;
+      }
+      if (pageNumber !== this.#pdfViewer.currentPageNumber) {
+        return;
+      }
+      this.#dispatchPageOpen(pageNumber);
+    }, evtOpts);
+    eventBus.on("pagesdestroy", async () => {
+      await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber);
+      await this.#scripting?.dispatchEventInSandbox({
+        id: "doc",
+        name: "WillClose"
+      });
+      this.#closeCapability?.resolve();
+    }, evtOpts);
+    try {
+      const docProperties = await this.#docProperties(pdfDocument);
+      if (pdfDocument !== this.#pdfDocument) {
+        return;
+      }
+      await this.#scripting.createSandbox({
+        objects,
+        calculationOrder,
+        appInfo: {
+          platform: navigator.platform,
+          language: navigator.language
+        },
+        docInfo: {
+          ...docProperties,
+          actions: docActions
+        }
+      });
+      eventBus.dispatch("sandboxcreated", {
+        source: this
+      });
+    } catch (error) {
+      console.error("setDocument:", error);
+      await this.#destroyScripting();
+      return;
+    }
+    await this.#scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "Open"
+    });
+    await this.#dispatchPageOpen(this.#pdfViewer.currentPageNumber, true);
+    Promise.resolve().then(() => {
+      if (pdfDocument === this.#pdfDocument) {
+        this.#ready = true;
+      }
+    });
+  }
+  async dispatchWillSave() {
+    return this.#scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "WillSave"
+    });
+  }
+  async dispatchDidSave() {
+    return this.#scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "DidSave"
+    });
+  }
+  async dispatchWillPrint() {
+    if (!this.#scripting) {
+      return;
+    }
+    await this.#willPrintCapability?.promise;
+    this.#willPrintCapability = Promise.withResolvers();
+    try {
+      await this.#scripting.dispatchEventInSandbox({
+        id: "doc",
+        name: "WillPrint"
+      });
+    } catch (ex) {
+      this.#willPrintCapability.resolve();
+      this.#willPrintCapability = null;
+      throw ex;
+    }
+    await this.#willPrintCapability.promise;
+  }
+  async dispatchDidPrint() {
+    return this.#scripting?.dispatchEventInSandbox({
+      id: "doc",
+      name: "DidPrint"
+    });
+  }
+  get destroyPromise() {
+    return this.#destroyCapability?.promise || null;
+  }
+  get ready() {
+    return this.#ready;
+  }
+  get _pageOpenPending() {
+    return shadow(this, "_pageOpenPending", new Set());
+  }
+  get _visitedPages() {
+    return shadow(this, "_visitedPages", new Map());
+  }
+  async #updateFromSandbox(detail) {
+    const pdfViewer = this.#pdfViewer;
+    const isInPresentationMode = pdfViewer.isInPresentationMode || pdfViewer.isChangingPresentationMode;
+    const {
+      id,
+      siblings,
+      command,
+      value
+    } = detail;
+    if (!id) {
+      switch (command) {
+        case "clear":
+          console.clear();
+          break;
+        case "error":
+          console.error(value);
+          break;
+        case "layout":
+          if (!isInPresentationMode) {
+            const modes = apiPageLayoutToViewerModes(value);
+            pdfViewer.spreadMode = modes.spreadMode;
+          }
+          break;
+        case "page-num":
+          pdfViewer.currentPageNumber = value + 1;
+          break;
+        case "print":
+          await pdfViewer.pagesPromise;
+          this.#eventBus.dispatch("print", {
+            source: this
+          });
+          break;
+        case "println":
+          console.log(value);
+          break;
+        case "zoom":
+          if (!isInPresentationMode) {
+            pdfViewer.currentScaleValue = value;
+          }
+          break;
+        case "SaveAs":
+          this.#eventBus.dispatch("download", {
+            source: this
+          });
+          break;
+        case "FirstPage":
+          pdfViewer.currentPageNumber = 1;
+          break;
+        case "LastPage":
+          pdfViewer.currentPageNumber = pdfViewer.pagesCount;
+          break;
+        case "NextPage":
+          pdfViewer.nextPage();
+          break;
+        case "PrevPage":
+          pdfViewer.previousPage();
+          break;
+        case "ZoomViewIn":
+          if (!isInPresentationMode) {
+            pdfViewer.increaseScale();
+          }
+          break;
+        case "ZoomViewOut":
+          if (!isInPresentationMode) {
+            pdfViewer.decreaseScale();
+          }
+          break;
+        case "WillPrintFinished":
+          this.#willPrintCapability?.resolve();
+          this.#willPrintCapability = null;
+          break;
+      }
+      return;
+    }
+    if (isInPresentationMode && detail.focus) {
+      return;
+    }
+    delete detail.id;
+    delete detail.siblings;
+    const ids = siblings ? [id, ...siblings] : [id];
+    for (const elementId of ids) {
+      const element = document.querySelector(`[data-element-id="${elementId}"]`);
+      if (element) {
+        element.dispatchEvent(new CustomEvent("updatefromsandbox", {
+          detail
+        }));
+      } else {
+        this.#pdfDocument?.annotationStorage.setValue(elementId, detail);
+      }
+    }
+  }
+  async #dispatchPageOpen(pageNumber, initialize = false) {
+    const pdfDocument = this.#pdfDocument,
+      visitedPages = this._visitedPages;
+    if (initialize) {
+      this.#closeCapability = Promise.withResolvers();
+    }
+    if (!this.#closeCapability) {
+      return;
+    }
+    const pageView = this.#pdfViewer.getPageView(pageNumber - 1);
+    if (pageView?.renderingState !== RenderingStates.FINISHED) {
+      this._pageOpenPending.add(pageNumber);
+      return;
+    }
+    this._pageOpenPending.delete(pageNumber);
+    const actionsPromise = (async () => {
+      const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null);
+      if (pdfDocument !== this.#pdfDocument) {
+        return;
+      }
+      await this.#scripting?.dispatchEventInSandbox({
+        id: "page",
+        name: "PageOpen",
+        pageNumber,
+        actions
+      });
+    })();
+    visitedPages.set(pageNumber, actionsPromise);
+  }
+  async #dispatchPageClose(pageNumber) {
+    const pdfDocument = this.#pdfDocument,
+      visitedPages = this._visitedPages;
+    if (!this.#closeCapability) {
+      return;
+    }
+    if (this._pageOpenPending.has(pageNumber)) {
+      return;
+    }
+    const actionsPromise = visitedPages.get(pageNumber);
+    if (!actionsPromise) {
+      return;
+    }
+    visitedPages.set(pageNumber, null);
+    await actionsPromise;
+    if (pdfDocument !== this.#pdfDocument) {
+      return;
+    }
+    await this.#scripting?.dispatchEventInSandbox({
+      id: "page",
+      name: "PageClose",
+      pageNumber
+    });
+  }
+  #initScripting() {
+    this.#destroyCapability = Promise.withResolvers();
+    if (this.#scripting) {
+      throw new Error("#initScripting: Scripting already exists.");
+    }
+    return this.#externalServices.createScripting();
+  }
+  async #destroyScripting() {
+    if (!this.#scripting) {
+      this.#pdfDocument = null;
+      this.#destroyCapability?.resolve();
+      return;
+    }
+    if (this.#closeCapability) {
+      await Promise.race([this.#closeCapability.promise, new Promise(resolve => {
+        setTimeout(resolve, 1000);
+      })]).catch(() => {});
+      this.#closeCapability = null;
+    }
+    this.#pdfDocument = null;
+    try {
+      await this.#scripting.destroySandbox();
+    } catch {}
+    this.#willPrintCapability?.reject(new Error("Scripting destroyed."));
+    this.#willPrintCapability = null;
+    this.#eventAC?.abort();
+    this.#eventAC = null;
+    this._pageOpenPending.clear();
+    this._visitedPages.clear();
+    this.#scripting = null;
+    this.#ready = false;
+    this.#destroyCapability?.resolve();
+  }
+}
+
+;// ./web/pdf_text_extractor.js
+/* unused harmony import specifier */ var pdf_text_extractor_internalOpt;
+
+class PdfTextExtractor {
+  #externalServices;
+  #textPromise;
+  #capability = Promise.withResolvers();
+  constructor(externalServices, pdfViewer, eventBus) {
+    this.#externalServices = externalServices;
+    eventBus.on("pagesinit", () => {
+      this.#capability.resolve(pdfViewer);
+    }, pdf_text_extractor_internalOpt);
+    eventBus.on("pagesdestroy", () => {
+      this.#capability.reject(new Error("pagesdestroy"));
+      this.#textPromise = null;
+      this.#capability = Promise.withResolvers();
+    }, pdf_text_extractor_internalOpt);
+    window.addEventListener("requestTextContent", ({
+      detail
+    }) => {
+      this.extractTextContent(detail.requestId);
+    });
+  }
+  async extractTextContent(requestId) {
+    if (!this.#textPromise) {
+      const textPromise = this.#textPromise = this.#capability.promise.then(pdfViewer => pdfViewer.getAllText());
+      textPromise.then(() => {
+        setTimeout(() => {
+          if (this.#textPromise === textPromise) {
+            this.#textPromise = null;
+          }
+        }, 5000);
+      });
+    }
+    this.#externalServices.reportText({
+      text: await this.#textPromise,
+      requestId
+    });
+  }
+}
+
+;// ./web/menu.js
+
+class Menu {
+  #triggeringButton;
+  #menu;
+  #menuItems;
+  #openMenuAC = null;
+  #menuAC = new AbortController();
+  #lastIndex = -1;
+  #onFocusOutBound = this.#onFocusOut.bind(this);
+  constructor(menuContainer, triggeringButton, menuItems) {
+    this.#menu = menuContainer;
+    this.#triggeringButton = triggeringButton;
+    if (Array.isArray(menuItems)) {
+      this.#menuItems = menuItems;
+    } else {
+      this.#menuItems = [];
+      for (const button of this.#menu.querySelectorAll("button")) {
+        this.#menuItems.push(button);
+      }
+    }
+    this.#setUpMenu();
+  }
+  #closeMenu() {
+    if (!this.#openMenuAC) {
+      return;
+    }
+    const menu = this.#menu;
+    this.#triggeringButton.ariaExpanded = "false";
+    this.#openMenuAC.abort();
+    this.#openMenuAC = null;
+    if (menu.contains(document.activeElement)) {
+      setTimeout(() => {
+        if (!menu.contains(document.activeElement)) {
+          this.#triggeringButton.focus();
+        }
+      }, 0);
+    }
+    this.#lastIndex = -1;
+  }
+  #openMenu() {
+    if (this.#openMenuAC) {
+      return;
+    }
+    const menu = this.#menu;
+    this.#triggeringButton.ariaExpanded = "true";
+    this.#openMenuAC = new AbortController();
+    const signal = AbortSignal.any([this.#menuAC.signal, this.#openMenuAC.signal]);
+    window.addEventListener("pointerdown", ({
+      target
+    }) => {
+      if (!this.#triggeringButton.contains(target) && !menu.contains(target)) {
+        this.#closeMenu();
+      }
+    }, {
+      signal
+    });
+    const closeMenu = this.#closeMenu.bind(this);
+    window.addEventListener("blur", closeMenu, {
+      signal
+    });
+    menu.addEventListener("focusout", this.#onFocusOutBound, {
+      signal
+    });
+  }
+  #onFocusOut({
+    relatedTarget
+  }) {
+    if (!this.#triggeringButton.contains(relatedTarget) && !this.#menu.contains(relatedTarget)) {
+      this.#closeMenu();
+    }
+  }
+  #setUpMenu() {
+    this.#triggeringButton.addEventListener("click", e => {
+      if (this.#openMenuAC) {
+        this.#closeMenu();
+        return;
+      }
+      this.#openMenu();
+    });
+    this.#triggeringButton.addEventListener("focusout", this.#onFocusOutBound);
+    const {
+      signal
+    } = this.#menuAC;
+    this.#menu.addEventListener("keydown", e => {
+      switch (e.key) {
+        case "Escape":
+          this.#closeMenu();
+          stopEvent(e);
+          break;
+        case "ArrowDown":
+          this.#goToNextItem(e.target, true);
+          stopEvent(e);
+          break;
+        case "ArrowUp":
+          this.#goToNextItem(e.target, false);
+          stopEvent(e);
+          break;
+        case "Home":
+          this.#menuItems.find(item => !item.disabled && !item.classList.contains("hidden"))?.focus();
+          stopEvent(e);
+          break;
+        case "End":
+          this.#menuItems.findLast(item => !item.disabled && !item.classList.contains("hidden"))?.focus();
+          stopEvent(e);
+          break;
+        default:
+          const {
+            key
+          } = e;
+          if (!/^\p{L}$/u.test(key)) {
+            break;
+          }
+          const char = key.toLocaleLowerCase();
+          this.#goToNextItem(e.target, true, item => item.textContent.trim().toLowerCase().startsWith(char));
+          stopEvent(e);
+          break;
+      }
+    }, {
+      signal,
+      capture: true
+    });
+    this.#menu.addEventListener("contextmenu", noContextMenu, {
+      signal
+    });
+    this.#menu.addEventListener("click", this.#closeMenu.bind(this), {
+      signal,
+      capture: true
+    });
+    this.#triggeringButton.addEventListener("keydown", e => {
+      switch (e.key) {
+        case " ":
+        case "Enter":
+        case "ArrowDown":
+        case "Home":
+          stopEvent(e);
+          if (!this.#openMenuAC) {
+            this.#openMenu();
+          }
+          this.#menuItems.find(item => !item.disabled && !item.classList.contains("hidden"))?.focus();
+          break;
+        case "ArrowUp":
+        case "End":
+          stopEvent(e);
+          if (!this.#openMenuAC) {
+            this.#openMenu();
+          }
+          this.#menuItems.findLast(item => !item.disabled && !item.classList.contains("hidden"))?.focus();
+          break;
+        case "Escape":
+          this.#closeMenu();
+          stopEvent(e);
+          break;
+      }
+    }, {
+      signal
+    });
+  }
+  #goToNextItem(element, forward, check = () => true) {
+    const index = this.#lastIndex === -1 ? this.#menuItems.indexOf(element) : this.#lastIndex;
+    const len = this.#menuItems.length;
+    const increment = forward ? 1 : len - 1;
+    for (let i = (index + increment) % len; i !== index; i = (i + increment) % len) {
+      const menuItem = this.#menuItems[i];
+      if (!menuItem.disabled && !menuItem.classList.contains("hidden") && check(menuItem)) {
+        menuItem.focus();
+        this.#lastIndex = i;
+        break;
+      }
+    }
+  }
+  destroy() {
+    this.#closeMenu();
+    this.#menuAC?.abort();
+    this.#menuAC = null;
+  }
+}
+
+;// ./web/pdf_thumbnail_view.js
+
+
+
+const DRAW_UPSCALE_FACTOR = 2;
+const MAX_NUM_SCALING_STEPS = 3;
+const THUMBNAIL_WIDTH = 126;
+function getTempCanvas(width, height) {
+  const canvas = new OffscreenCanvas(width, height);
+  const ctx = canvas.getContext("2d", {
+    alpha: false
+  });
+  ctx.save();
+  ctx.fillStyle = "rgb(255, 255, 255)";
+  ctx.fillRect(0, 0, width, height);
+  ctx.restore();
+  return [canvas, ctx];
+}
+class PDFThumbnailView extends RenderableView {
+  #renderingState = RenderingStates.INITIAL;
+  constructor({
+    container,
+    eventBus,
+    id,
+    defaultViewport,
+    optionalContentConfigPromise,
+    linkService,
+    renderingQueue,
+    maxCanvasPixels,
+    maxCanvasDim,
+    pageColors,
+    enableSplitMerge = false
+  }) {
+    super();
+    this.id = id;
+    this.renderingId = `thumbnail${id}`;
+    this.pageLabel = null;
+    this.pdfPage = null;
+    this.rotation = 0;
+    this.viewport = defaultViewport;
+    this.pdfPageRotate = defaultViewport.rotation;
+    this._optionalContentConfigPromise = optionalContentConfigPromise || null;
+    this.maxCanvasPixels = maxCanvasPixels ?? AppOptions.get("maxCanvasPixels");
+    this.maxCanvasDim = maxCanvasDim || AppOptions.get("maxCanvasDim");
+    this.pageColors = pageColors || null;
+    this.eventBus = eventBus;
+    this.linkService = linkService;
+    this.renderingQueue = renderingQueue;
+    this.placeholder = null;
+    const thumbnailContainer = this.div = document.createElement("div");
+    thumbnailContainer.className = "thumbnail";
+    thumbnailContainer.setAttribute("page-number", id);
+    const imageContainer = this.imageContainer = document.createElement("div");
+    thumbnailContainer.append(imageContainer);
+    imageContainer.classList.add("thumbnailImageContainer", "missingThumbnailImage");
+    imageContainer.role = "button";
+    imageContainer.tabIndex = -1;
+    imageContainer.draggable = false;
+    imageContainer.setAttribute("page-number", id);
+    imageContainer.setAttribute("data-l10n-id", "pdfjs-thumb-page-title1");
+    imageContainer.setAttribute("data-l10n-args", this.#getPageL10nArgs(true));
+    const image = this.image = document.createElement("img");
+    imageContainer.append(image);
+    if (enableSplitMerge) {
+      const checkbox = this.checkbox = document.createElement("input");
+      checkbox.type = "checkbox";
+      checkbox.tabIndex = -1;
+      checkbox.setAttribute("data-l10n-id", "pdfjs-thumb-page-checkbox1");
+      checkbox.setAttribute("data-l10n-args", this.#getPageL10nArgs());
+      thumbnailContainer.append(checkbox);
+      this.pasteButton = null;
+    }
+    this.#updateDims();
+    container.append(thumbnailContainer);
+  }
+  clone(container, id) {
+    const thumbnailView = new PDFThumbnailView({
+      container,
+      id,
+      eventBus: this.eventBus,
+      defaultViewport: this.viewport,
+      optionalContentConfigPromise: this._optionalContentConfigPromise,
+      linkService: this.linkService,
+      renderingQueue: this.renderingQueue,
+      maxCanvasPixels: this.maxCanvasPixels,
+      maxCanvasDim: this.maxCanvasDim,
+      pageColors: this.pageColors,
+      enableSplitMerge: !!this.checkbox
+    });
+    const {
+      imageContainer
+    } = this;
+    if (!imageContainer.classList.contains("missingThumbnailImage")) {
+      thumbnailView.image.replaceWith(this.image.cloneNode(true));
+      thumbnailView.imageContainer.classList.remove("missingThumbnailImage");
+    }
+    return thumbnailView;
+  }
+  addPasteButton(pasteCallback) {
+    if (this.pasteButton) {
+      return;
+    }
+    const pasteButton = this.pasteButton = document.createElement("button");
+    pasteButton.classList.add("thumbnailPasteButton", "viewsManagerButton");
+    pasteButton.tabIndex = 0;
+    pasteButton.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-after");
+    pasteButton.setAttribute("data-l10n-args", JSON.stringify({
+      page: this.pageLabel ?? this.id
+    }));
+    const span = document.createElement("span");
+    span.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-label");
+    pasteButton.append(span);
+    pasteButton.addEventListener("click", () => {
+      pasteCallback(this.id);
+    });
+    if (this.id === 1) {
+      const prevPasteButton = this.prevPasteButton = pasteButton.cloneNode(true);
+      prevPasteButton.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-before");
+      prevPasteButton.addEventListener("click", () => {
+        pasteCallback(0);
+      });
+      this.imageContainer.before(prevPasteButton);
+    }
+    this.imageContainer.after(pasteButton);
+  }
+  removePasteButton() {
+    this.pasteButton?.remove();
+    this.pasteButton = null;
+    this.prevPasteButton?.remove();
+    this.prevPasteButton = null;
+  }
+  toggleSelected(isSelected) {
+    if (this.checkbox) {
+      this.checkbox.checked = isSelected;
+    }
+  }
+  updateId(newId) {
+    this.id = newId;
+    this.renderingId = `thumbnail${newId}`;
+    this.div.setAttribute("page-number", newId);
+    this.imageContainer.setAttribute("page-number", newId);
+    this.setPageLabel(this.pageLabel);
+  }
+  #updateDims() {
+    const {
+      width,
+      height
+    } = this.viewport;
+    const ratio = width / height;
+    const canvasWidth = this.canvasWidth = THUMBNAIL_WIDTH;
+    const canvasHeight = this.canvasHeight = canvasWidth / ratio | 0;
+    this.scale = canvasWidth / width;
+    this.imageContainer.style.height = `${canvasHeight}px`;
+  }
+  get renderingState() {
+    return this.#renderingState;
+  }
+  set renderingState(state) {
+    this.#renderingState = state;
+  }
+  setPdfPage(pdfPage) {
+    this.pdfPage = pdfPage;
+    this.pdfPageRotate = pdfPage.rotate;
+    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+    this.viewport = pdfPage.getViewport({
+      scale: 1,
+      rotation: totalRotation
+    });
+    this.reset();
+  }
+  reset() {
+    this.cancelRendering();
+    this.renderingState = RenderingStates.INITIAL;
+    this.#updateDims();
+    const {
+      image,
+      imageContainer
+    } = this;
+    const url = image.src;
+    if (url) {
+      URL.revokeObjectURL(url);
+      image.src = "";
+      imageContainer.removeAttribute("data-l10n-id");
+      imageContainer.removeAttribute("data-l10n-args");
+      imageContainer.classList.add("missingThumbnailImage");
+    }
+  }
+  destroy() {
+    this.reset();
+    this.toggleCurrent(false);
+    this.div.remove();
+  }
+  update({
+    rotation = null
+  }) {
+    if (typeof rotation === "number") {
+      this.rotation = rotation;
+    }
+    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+    this.viewport = this.viewport.clone({
+      scale: 1,
+      rotation: totalRotation
+    });
+    this.reset();
+  }
+  toggleCurrent(isCurrent) {
+    const {
+      imageContainer
+    } = this;
+    if (isCurrent) {
+      imageContainer.ariaCurrent = "page";
+      imageContainer.tabIndex = 0;
+      if (this.checkbox) {
+        this.checkbox.tabIndex = 0;
+      }
+    } else {
+      imageContainer.ariaCurrent = false;
+      imageContainer.tabIndex = -1;
+      if (this.checkbox) {
+        this.checkbox.tabIndex = -1;
+      }
+    }
+  }
+  cancelRendering() {
+    if (this.renderTask) {
+      this.renderTask.cancel();
+      this.renderTask = null;
+    }
+    this.resume = null;
+  }
+  #getPageDrawContext(upscaleFactor = 1) {
+    const outputScale = new OutputScale();
+    const width = upscaleFactor * this.canvasWidth,
+      height = upscaleFactor * this.canvasHeight;
+    outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim);
+    const canvas = document.createElement("canvas");
+    canvas.width = width * outputScale.sx | 0;
+    canvas.height = height * outputScale.sy | 0;
+    const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null;
+    return {
+      canvas,
+      transform
+    };
+  }
+  async #convertCanvasToImage(canvas) {
+    if (this.renderingState !== RenderingStates.FINISHED) {
+      throw new Error("#convertCanvasToImage: Rendering has not finished.");
+    }
+    const reducedCanvas = this.#reduceImage(canvas);
+    const {
+      imageContainer,
+      image
+    } = this;
+    const {
+      promise,
+      resolve
+    } = Promise.withResolvers();
+    reducedCanvas.toBlob(resolve);
+    const blob = await promise;
+    image.src = URL.createObjectURL(blob);
+    image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas");
+    image.setAttribute("data-l10n-args", this.#getPageL10nArgs());
+    imageContainer.classList.remove("missingThumbnailImage");
+  }
+  async draw() {
+    if (this.renderingState !== RenderingStates.INITIAL) {
+      console.error("Must be in new state before drawing");
+      return;
+    }
+    const {
+      pageColors,
+      pdfPage
+    } = this;
+    if (!pdfPage) {
+      this.renderingState = RenderingStates.FINISHED;
+      throw new Error("pdfPage is not loaded");
+    }
+    this.renderingState = RenderingStates.RUNNING;
+    const {
+      canvas,
+      transform
+    } = this.#getPageDrawContext(DRAW_UPSCALE_FACTOR);
+    const drawViewport = this.viewport.clone({
+      scale: DRAW_UPSCALE_FACTOR * this.scale
+    });
+    const renderContinueCallback = cont => {
+      if (!this.renderingQueue.isHighestPriority(this)) {
+        this.renderingState = RenderingStates.PAUSED;
+        this.resume = () => {
+          this.renderingState = RenderingStates.RUNNING;
+          cont();
+        };
+        return;
+      }
+      cont();
+    };
+    const renderContext = {
+      canvas,
+      transform,
+      viewport: drawViewport,
+      optionalContentConfigPromise: this._optionalContentConfigPromise,
+      pageColors
+    };
+    const renderTask = this.renderTask = pdfPage.render(renderContext);
+    renderTask.onContinue = renderContinueCallback;
+    let error = null;
+    try {
+      await renderTask.promise;
+    } catch (e) {
+      if (e instanceof RenderingCancelledException) {
+        return;
+      }
+      error = e;
+    } finally {
+      if (renderTask === this.renderTask) {
+        this.renderTask = null;
+      }
+    }
+    this.renderingState = RenderingStates.FINISHED;
+    await this.#convertCanvasToImage(canvas);
+    this.eventBus.dispatch("thumbnailrendered", {
+      source: this,
+      pageNumber: this.id,
+      pdfPage
+    });
+    if (error) {
+      throw error;
+    }
+  }
+  setImage(pageView) {
+    if (this.renderingState !== RenderingStates.INITIAL) {
+      return;
+    }
+    const {
+      thumbnailCanvas: canvas,
+      pdfPage,
+      scale
+    } = pageView;
+    if (!canvas) {
+      return;
+    }
+    if (!this.pdfPage) {
+      this.setPdfPage(pdfPage);
+    }
+    if (scale < this.scale) {
+      return;
+    }
+    this.renderingState = RenderingStates.FINISHED;
+    this.#convertCanvasToImage(canvas);
+  }
+  #getReducedImageDims(canvas) {
+    const width = canvas.width << MAX_NUM_SCALING_STEPS,
+      height = canvas.height << MAX_NUM_SCALING_STEPS;
+    const outputScale = new OutputScale();
+    outputScale.sx = outputScale.sy = 1;
+    outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim);
+    return [width * outputScale.sx | 0, height * outputScale.sy | 0];
+  }
+  #reduceImage(img) {
+    const {
+      canvas
+    } = this.#getPageDrawContext(1);
+    const ctx = canvas.getContext("2d", {
+      alpha: false,
+      willReadFrequently: false
+    });
+    if (img.width <= 2 * canvas.width) {
+      ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);
+      return canvas;
+    }
+    let [reducedWidth, reducedHeight] = this.#getReducedImageDims(canvas);
+    const [reducedImage, reducedImageCtx] = getTempCanvas(reducedWidth, reducedHeight);
+    while (reducedWidth > img.width || reducedHeight > img.height) {
+      reducedWidth >>= 1;
+      reducedHeight >>= 1;
+    }
+    reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight);
+    while (reducedWidth > 2 * canvas.width) {
+      reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1);
+      reducedWidth >>= 1;
+      reducedHeight >>= 1;
+    }
+    ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);
+    return canvas;
+  }
+  #getPageL10nArgs(hasTotal = false) {
+    return JSON.stringify({
+      page: this.pageLabel ?? this.id,
+      total: hasTotal ? this.linkService.pagesCount : undefined
+    });
+  }
+  setPageLabel(label) {
+    this.pageLabel = typeof label === "string" ? label : null;
+    this.imageContainer.setAttribute("data-l10n-args", this.#getPageL10nArgs(true));
+    this.image.setAttribute("data-l10n-args", this.#getPageL10nArgs());
+    this.checkbox?.setAttribute("data-l10n-args", this.#getPageL10nArgs());
+  }
+}
+
+;// ./web/pdf_thumbnail_viewer.js
+
+
+
+
+
+
+const SCROLL_OPTIONS = {
+  behavior: "instant",
+  block: "nearest",
+  inline: "nearest",
+  container: "nearest"
+};
+const DRAG_THRESHOLD_IN_PIXELS = 5;
+const PIXELS_TO_SCROLL_WHEN_DRAGGING = 20;
+const SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT = 15;
+class PDFThumbnailViewer {
+  static #draggingScaleFactor = 0;
+  #enableMerge = false;
+  #enableSplitMerge = false;
+  #dragAC = null;
+  #abortSignal = undefined;
+  #externalDragActive = false;
+  #draggedContainer = null;
+  #thumbnailsPositions = null;
+  #lastDraggedOverIndex = NaN;
+  #selectedPages = null;
+  #draggedImageX = 0;
+  #draggedImageY = 0;
+  #draggedImageWidth = 0;
+  #draggedImageHeight = 0;
+  #draggedImageOffsetX = 0;
+  #draggedImageOffsetY = 0;
+  #dragMarker = null;
+  #pageNumberToRemove = NaN;
+  #currentScrollBottom = 0;
+  #currentScrollTop = 0;
+  #pagesMapper = null;
+  #manageExportButton = null;
+  #manageDeleteButton = null;
+  #manageCopyButton = null;
+  #manageCutButton = null;
+  #copiedThumbnails = null;
+  #savedThumbnails = null;
+  #deletedPageNumbers = null;
+  #copiedPageNumbers = null;
+  #boundPastePages = this.#pastePages.bind(this);
+  #isCut = false;
+  #isOneColumnView = false;
+  #scrollableContainerWidth = 0;
+  #scrollableContainerHeight = 0;
+  #statusLabel = null;
+  #statusBar = null;
+  #deselectButton = null;
+  #undoBar = null;
+  #undoLabel = null;
+  #undoButton = null;
+  #undoCloseButton = null;
+  #waitingBar = null;
+  #isInPasteMode = false;
+  #hasUndoBarVisible = false;
+  #newBadge = null;
+  constructor({
+    container,
+    eventBus,
+    linkService,
+    renderingQueue,
+    maxCanvasPixels,
+    maxCanvasDim,
+    pageColors,
+    abortSignal,
+    enableMerge,
+    enableSplitMerge,
+    enableNewBadge,
+    statusBar,
+    undoBar,
+    waitingBar,
+    manageMenu,
+    addFileComponent
+  }) {
+    this.scrollableContainer = container.parentElement;
+    this.container = container;
+    this.eventBus = eventBus;
+    this.linkService = linkService;
+    this.renderingQueue = renderingQueue;
+    this.maxCanvasPixels = maxCanvasPixels;
+    this.maxCanvasDim = maxCanvasDim;
+    this.pageColors = pageColors || null;
+    this.#abortSignal = abortSignal;
+    this.#enableMerge = enableMerge || false;
+    this.#enableSplitMerge = enableSplitMerge || false;
+    this.#statusLabel = statusBar?.viewsManagerStatusActionLabel || null;
+    this.#deselectButton = statusBar?.viewsManagerStatusActionDeselectButton || null;
+    this.#statusBar = statusBar?.viewsManagerStatusAction || null;
+    this.#undoBar = undoBar?.viewsManagerStatusUndo || null;
+    this.#undoLabel = undoBar?.viewsManagerStatusUndoLabel || null;
+    this.#undoButton = undoBar?.viewsManagerStatusUndoButton || null;
+    this.#undoCloseButton = undoBar?.viewsManagerStatusUndoCloseButton || null;
+    this.#waitingBar = waitingBar || null;
+    if (this.#enableSplitMerge && manageMenu) {
+      const {
+        button: menuButton,
+        menu,
+        copy,
+        cut,
+        delete: del,
+        exportSelected
+      } = manageMenu;
+      if (enableNewBadge) {
+        const newSpan = document.createElement("span");
+        newSpan.setAttribute("data-l10n-id", "pdfjs-new-badge-content");
+        newSpan.classList.add("newBadge");
+        menuButton.parentElement.before(newSpan);
+        this.#newBadge = newSpan;
+      }
+      eventBus.on("pagesloaded", () => {
+        menuButton.disabled = false;
+      }, {
+        once: true,
+        ...internalOpt
+      });
+      this._manageMenu = new Menu(menu, menuButton, [copy, cut, del, exportSelected]);
+      this.#manageExportButton = exportSelected;
+      exportSelected.addEventListener("click", this.#saveExtractedPages.bind(this));
+      this.#manageDeleteButton = del;
+      del.addEventListener("click", this.#deletePages.bind(this, "delete"));
+      this.#manageCopyButton = copy;
+      copy.addEventListener("click", this.#copyPages.bind(this));
+      this.#manageCutButton = cut;
+      cut.addEventListener("click", this.#cutPages.bind(this));
+      this.#toggleMenuEntries(false);
+      menuButton.disabled = true;
+      eventBus.on("editingaction", ({
+        name
+      }) => {
+        switch (name) {
+          case "copyPage":
+            this.#copyPages();
+            break;
+          case "cutPage":
+            this.#cutPages();
+            break;
+          case "deletePage":
+            this.#deletePages("delete");
+            break;
+          case "savePage":
+            this.#saveExtractedPages();
+            break;
+        }
+      }, internalOpt);
+      this.container.addEventListener("contextmenu", e => {
+        eventBus.dispatch("editingstateschanged", {
+          source: this,
+          details: {
+            thumbnailId: parseInt(e.target.closest(".thumbnailImageContainer")?.parentElement.getAttribute("page-number"), 10) ?? -1,
+            hasSelectedPages: !!this.#selectedPages?.size,
+            canDeletePages: this.#canDelete()
+          }
+        });
+      }, {
+        signal: abortSignal,
+        passive: true
+      });
+      this.#undoButton?.addEventListener("click", this.#undo.bind(this));
+      this.#undoCloseButton?.addEventListener("click", this.#dismissUndo.bind(this, true));
+      this.#deselectButton?.addEventListener("click", () => {
+        this.#clearSelection();
+        this.#toggleMenuEntries(false);
+        this.#updateStatus("select");
+      });
+      this.#deselectButton.classList.toggle("hidden", true);
+      if (this.#enableMerge && addFileComponent) {
+        const {
+          picker,
+          button
+        } = addFileComponent;
+        picker.addEventListener("change", () => {
+          const files = Array.from(picker.files ?? []);
+          if (files.length) {
+            this.#mergeFiles(files, this._currentPageNumber - 1);
+          }
+        });
+        button.addEventListener("click", () => {
+          picker.click();
+        });
+        this.#waitingBar.closeButton?.addEventListener("click", () => {
+          this.#toggleBar("status");
+          picker.value = "";
+        });
+      }
+    } else {
+      manageMenu.button.hidden = true;
+    }
+    this.scroll = watchScroll(this.scrollableContainer, this.#scrollUpdated.bind(this), abortSignal);
+    this.#resetView();
+    this.#addEventListeners();
+  }
+  #scrollUpdated() {
+    this.renderingQueue.renderHighestPriority();
+  }
+  async #mergeFiles(files, insertAfter) {
+    this.#toggleBar("waiting", "pdfjs-views-manager-waiting-for-file");
+    const entries = [];
+    for (const file of files) {
+      const isImage = file.type?.startsWith("image/");
+      if (!isImage && file.type !== "application/pdf") {
+        const magic = await file.slice(0, 5).text();
+        if (magic !== "%PDF-") {
+          continue;
+        }
+      }
+      if (isImage) {
+        let bitmap;
+        try {
+          bitmap = await PDFThumbnailViewer.#fileToImageBitmap(file);
+        } catch {
+          continue;
+        }
+        entries.push({
+          image: bitmap,
+          insertAfter
+        });
+      } else {
+        entries.push({
+          document: await file.bytes(),
+          insertAfter
+        });
+      }
+    }
+    if (entries.length === 0) {
+      this.#toggleBar("status");
+      return;
+    }
+    const pagesCount = this.#pagesMapper.pagesNumber;
+    const data = this.hasStructuralChanges() ? this.getStructuralChanges() : [{
+      document: null
+    }];
+    data.push(...entries);
+    this.eventBus.on("pagesloaded", () => {
+      this.#selectedPages = null;
+      this.#updateMenuEntries();
+      this.#toggleBar("status");
+      const newPagesCount = this.#pagesMapper.pagesNumber;
+      const insertedPagesCount = newPagesCount - pagesCount;
+      for (let i = insertAfter + 1, ii = insertAfter + 1 + insertedPagesCount; i < ii; i++) {
+        this._thumbnails[i].checkbox.checked = true;
+        this.#selectPage(i + 1, true);
+      }
+      if (insertedPagesCount) {
+        this.#updateCurrentPage(insertAfter + 2, true);
+      }
+    }, {
+      once: true,
+      ...internalOpt
+    });
+    this.#reportTelemetry({
+      action: "merge"
+    });
+    this.eventBus.dispatch("saveandload", {
+      source: this,
+      data
+    });
+  }
+  getThumbnail(index) {
+    return this._thumbnails[index];
+  }
+  #getVisibleThumbs() {
+    return getVisibleElements({
+      scrollEl: this.scrollableContainer,
+      views: this._thumbnails
+    });
+  }
+  #resetCurrentThumbnail(newPageNumber) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    const thumbnailView = this._thumbnails[this._currentPageNumber - 1];
+    thumbnailView?.toggleCurrent(false);
+    this._currentPageNumber = newPageNumber;
+  }
+  scrollThumbnailIntoView(pageNumber) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    const thumbnailView = this._thumbnails[pageNumber - 1];
+    if (!thumbnailView) {
+      console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.');
+      return;
+    }
+    if (pageNumber !== this._currentPageNumber) {
+      this.#resetCurrentThumbnail(pageNumber);
+      thumbnailView.toggleCurrent(true);
+    }
+    const {
+      first,
+      last,
+      views
+    } = this.#getVisibleThumbs();
+    if (views.length > 0) {
+      let shouldScroll = false;
+      if (pageNumber <= first.id || pageNumber >= last.id) {
+        shouldScroll = true;
+      } else {
+        for (const {
+          id,
+          percent
+        } of views) {
+          if (id !== pageNumber) {
+            continue;
+          }
+          shouldScroll = percent < 100;
+          break;
+        }
+      }
+      if (shouldScroll) {
+        thumbnailView.div.scrollIntoView(SCROLL_OPTIONS);
+      }
+    }
+    this._currentPageNumber = pageNumber;
+  }
+  get pagesRotation() {
+    return this._pagesRotation;
+  }
+  set pagesRotation(rotation) {
+    if (!isValidRotation(rotation)) {
+      throw new Error("Invalid thumbnails rotation angle.");
+    }
+    if (!this.pdfDocument) {
+      return;
+    }
+    if (this._pagesRotation === rotation) {
+      return;
+    }
+    this._pagesRotation = rotation;
+    const updateArgs = {
+      rotation
+    };
+    for (const thumbnail of this._thumbnails) {
+      thumbnail.update(updateArgs);
+    }
+  }
+  cleanup() {
+    for (const thumbnail of this._thumbnails) {
+      if (thumbnail.renderingState !== RenderingStates.FINISHED) {
+        thumbnail.reset();
+      }
+    }
+  }
+  #resetView() {
+    this._thumbnails = [];
+    this._currentPageNumber = 1;
+    this._pageLabels = null;
+    this._pagesRotation = 0;
+    this.container.textContent = "";
+  }
+  setDocument(pdfDocument) {
+    if (this.pdfDocument) {
+      this.#cancelRendering();
+      this.#resetView();
+    }
+    this.pdfDocument = pdfDocument;
+    if (!pdfDocument) {
+      return;
+    }
+    this.#pagesMapper = pdfDocument.pagesMapper;
+    const firstPagePromise = pdfDocument.getPage(1);
+    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({
+      intent: "display"
+    });
+    firstPagePromise.then(firstPdfPage => {
+      const pagesCount = pdfDocument.numPages;
+      const viewport = firstPdfPage.getViewport({
+        scale: 1
+      });
+      const fragment = document.createDocumentFragment();
+      for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+        const thumbnail = new PDFThumbnailView({
+          container: fragment,
+          eventBus: this.eventBus,
+          id: pageNum,
+          defaultViewport: viewport.clone(),
+          optionalContentConfigPromise,
+          linkService: this.linkService,
+          renderingQueue: this.renderingQueue,
+          maxCanvasPixels: this.maxCanvasPixels,
+          maxCanvasDim: this.maxCanvasDim,
+          pageColors: this.pageColors,
+          enableSplitMerge: this.#enableSplitMerge
+        });
+        this._thumbnails.push(thumbnail);
+      }
+      this._thumbnails[0]?.setPdfPage(firstPdfPage);
+      const thumbnailView = this._thumbnails[this._currentPageNumber - 1];
+      thumbnailView.toggleCurrent(true);
+      this.container.append(fragment);
+      this.eventBus.dispatch("thumbnailsloaded", {
+        source: this
+      });
+    }).catch(reason => {
+      console.error("Unable to initialize thumbnail viewer", reason);
+    });
+  }
+  #cancelRendering() {
+    for (const thumbnail of this._thumbnails) {
+      thumbnail.cancelRendering();
+    }
+  }
+  setPageLabels(labels) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    if (!labels) {
+      this._pageLabels = null;
+    } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {
+      this._pageLabels = null;
+      console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels.");
+    } else {
+      this._pageLabels = labels;
+    }
+    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {
+      this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null);
+    }
+  }
+  async #ensurePdfPageLoaded(thumbView) {
+    if (thumbView.pdfPage) {
+      return thumbView.pdfPage;
+    }
+    try {
+      const pdfPage = await this.pdfDocument.getPage(thumbView.id);
+      if (!thumbView.pdfPage) {
+        thumbView.setPdfPage(pdfPage);
+      }
+      return pdfPage;
+    } catch (reason) {
+      console.error("Unable to get page for thumb view", reason);
+      return null;
+    }
+  }
+  #getScrollAhead(visible) {
+    if (visible.first?.id === 1) {
+      return true;
+    } else if (visible.last?.id === this._thumbnails.length) {
+      return false;
+    }
+    return this.scroll.down;
+  }
+  forceRendering() {
+    const visibleThumbs = this.#getVisibleThumbs();
+    const scrollAhead = this.#getScrollAhead(visibleThumbs);
+    const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, scrollAhead, false, true);
+    if (thumbView) {
+      this.#ensurePdfPageLoaded(thumbView).then(() => {
+        this.renderingQueue.renderView(thumbView);
+      });
+      return true;
+    }
+    return false;
+  }
+  hasStructuralChanges() {
+    return this.#pagesMapper?.hasBeenAltered() || false;
+  }
+  getStructuralChanges() {
+    return this.#pagesMapper?.getPageMappingForSaving() || null;
+  }
+  static #getScaleFactor(image) {
+    return PDFThumbnailViewer.#draggingScaleFactor ||= parseFloat(getComputedStyle(image).getPropertyValue("--thumbnail-dragging-scale"));
+  }
+  static #fitImageDimensions(width, height, {
+    minSide = 0,
+    maxSide
+  }) {
+    const longest = Math.max(width, height);
+    let scale = 1;
+    if (minSide > 0 && longest < minSide) {
+      scale = minSide / longest;
+    } else if (longest > maxSide) {
+      scale = maxSide / longest;
+    }
+    return scale === 1 ? {
+      width,
+      height
+    } : {
+      width: Math.max(1, Math.round(width * scale)),
+      height: Math.max(1, Math.round(height * scale))
+    };
+  }
+  static async #fileToImageBitmap(file) {
+    const MIN_RASTER_SIDE = 1024;
+    const MAX_RASTER_SIDE = 4096;
+    if (file.type !== "image/svg+xml") {
+      const bitmap = await createImageBitmap(file);
+      const {
+        width,
+        height
+      } = PDFThumbnailViewer.#fitImageDimensions(bitmap.width, bitmap.height, {
+        maxSide: MAX_RASTER_SIDE
+      });
+      if (width === bitmap.width && height === bitmap.height) {
+        return bitmap;
+      }
+      const canvas = new OffscreenCanvas(width, height);
+      const ctx = canvas.getContext("2d");
+      ctx.drawImage(bitmap, 0, 0, width, height);
+      bitmap.close();
+      return canvas.transferToImageBitmap();
+    }
+    const url = URL.createObjectURL(file);
+    try {
+      const image = new Image();
+      image.src = url;
+      await image.decode();
+      const {
+        width,
+        height
+      } = PDFThumbnailViewer.#fitImageDimensions(image.naturalWidth || MIN_RASTER_SIDE, image.naturalHeight || MIN_RASTER_SIDE, {
+        minSide: MIN_RASTER_SIDE,
+        maxSide: MAX_RASTER_SIDE
+      });
+      const canvas = new OffscreenCanvas(width, height);
+      const ctx = canvas.getContext("2d");
+      ctx.drawImage(image, 0, 0, width, height);
+      return canvas.transferToImageBitmap();
+    } finally {
+      URL.revokeObjectURL(url);
+    }
+  }
+  #updateThumbnails(currentPageNumber) {
+    this.#resetCurrentThumbnail(0);
+    let newCurrentPageNumber = 0;
+    const pagesMapper = this.#pagesMapper;
+    const prevThumbnails = this.#savedThumbnails = this._thumbnails;
+    const newThumbnails = this._thumbnails = [];
+    const fragment = document.createDocumentFragment();
+    const isCut = this.#isCut;
+    for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) {
+      const prevPageNumber = pagesMapper.getPrevPageNumber(i);
+      if (prevPageNumber < 0) {
+        let thumbnail = this.#copiedThumbnails.get(-prevPageNumber);
+        thumbnail.checkbox.checked = false;
+        if (isCut) {
+          thumbnail.updateId(i);
+          fragment.append(thumbnail.div);
+        } else {
+          thumbnail = thumbnail.clone(fragment, i);
+        }
+        newThumbnails.push(thumbnail);
+        continue;
+      }
+      if (prevPageNumber === currentPageNumber) {
+        newCurrentPageNumber = i;
+      }
+      const newThumbnail = prevThumbnails[prevPageNumber - 1];
+      newThumbnails.push(newThumbnail);
+      newThumbnail.updateId(i);
+      newThumbnail.checkbox.checked = false;
+      fragment.append(newThumbnail.div);
+    }
+    this.container.replaceChildren(fragment);
+    return newCurrentPageNumber;
+  }
+  #onStartDragging(draggedThumbnail) {
+    this.#currentScrollTop = this.scrollableContainer.scrollTop;
+    this.#currentScrollBottom = this.#currentScrollTop + this.scrollableContainer.clientHeight;
+    this.#dragAC = new AbortController();
+    this.container.classList.add("isDragging");
+    this.#newBadge?.classList.add("hidden");
+    const startPageNumber = parseInt(draggedThumbnail.getAttribute("page-number"), 10);
+    this.#lastDraggedOverIndex = startPageNumber - 1;
+    if (!this.#selectedPages?.has(startPageNumber)) {
+      this.#pageNumberToRemove = startPageNumber;
+      this.#selectPage(startPageNumber, true);
+    }
+    for (const selected of this.#selectedPages) {
+      const thumbnail = this._thumbnails[selected - 1];
+      const placeholder = thumbnail.placeholder = document.createElement("div");
+      placeholder.classList.add("thumbnailImageContainer", "placeholder");
+      const {
+        div,
+        imageContainer
+      } = thumbnail;
+      div.classList.add("isDragging");
+      placeholder.style.height = getComputedStyle(imageContainer).height;
+      imageContainer.after(placeholder);
+      if (selected !== startPageNumber) {
+        imageContainer.classList.add("hidden");
+        continue;
+      }
+      if (this.#selectedPages.size === 1) {
+        imageContainer.classList.add("draggingThumbnail");
+        this.#draggedContainer = imageContainer;
+        continue;
+      }
+      const draggedContainer = this.#draggedContainer = document.createElement("div");
+      draggedContainer.classList.add("draggingThumbnail", "thumbnailImageContainer", "multiple");
+      draggedContainer.style.height = getComputedStyle(imageContainer).height;
+      imageContainer.replaceWith(draggedContainer);
+      imageContainer.classList.remove("thumbnailImageContainer");
+      draggedContainer.append(imageContainer);
+      draggedContainer.setAttribute("data-multiple-count", this.#selectedPages.size);
+    }
+  }
+  #onStopDragging(isDropping = false) {
+    const draggedContainer = this.#draggedContainer;
+    this.#draggedContainer = null;
+    const lastDraggedOverIndex = this.#lastDraggedOverIndex;
+    this.#lastDraggedOverIndex = NaN;
+    this.#dragMarker?.remove();
+    this.#dragMarker = null;
+    this.#dragAC.abort();
+    this.#dragAC = null;
+    this.#newBadge?.classList.remove("hidden");
+    this.container.classList.remove("isDragging");
+    for (const selected of this.#selectedPages) {
+      const thumbnail = this._thumbnails[selected - 1];
+      const {
+        div,
+        placeholder,
+        imageContainer
+      } = thumbnail;
+      placeholder.remove();
+      imageContainer.classList.remove("draggingThumbnail", "hidden");
+      div.classList.remove("isDragging");
+    }
+    if (draggedContainer.classList.contains("multiple")) {
+      const originalImageContainer = draggedContainer.firstElementChild;
+      draggedContainer.replaceWith(originalImageContainer);
+      originalImageContainer.classList.add("thumbnailImageContainer");
+    } else {
+      draggedContainer.style.translate = "";
+    }
+    const selectedPages = this.#selectedPages;
+    if (!isNaN(lastDraggedOverIndex) && isDropping && !(selectedPages.size === 1 && (selectedPages.has(lastDraggedOverIndex + 1) || selectedPages.has(lastDraggedOverIndex + 2)))) {
+      this._thumbnails[this._currentPageNumber - 1]?.toggleCurrent(false);
+      this._currentPageNumber = -1;
+      const newIndex = lastDraggedOverIndex + 1;
+      const pagesToMove = Array.from(selectedPages).sort((a, b) => a - b);
+      const pagesMapper = this.#pagesMapper;
+      const currentPageNumber = isNaN(this.#pageNumberToRemove) ? pagesToMove[0] : this.#pageNumberToRemove;
+      pagesMapper.movePages(selectedPages, pagesToMove, newIndex);
+      this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));
+      this.#thumbnailsPositions = null;
+      selectedPages.clear();
+      this.#pageNumberToRemove = NaN;
+      this.#toggleMenuEntries(false);
+      this.#updateStatus("select");
+      this.#reportTelemetry({
+        action: "move"
+      });
+      this.eventBus.dispatch("pagesedited", {
+        source: this,
+        pagesMapper,
+        type: "move"
+      });
+    }
+    if (!isNaN(this.#pageNumberToRemove)) {
+      this.#selectPage(this.#pageNumberToRemove, false);
+      this.#pageNumberToRemove = NaN;
+    }
+  }
+  #clearSelection() {
+    for (const pageNumber of this.#selectedPages) {
+      this._thumbnails[pageNumber - 1].toggleSelected(false);
+    }
+    this.#selectedPages.clear();
+  }
+  #updateCurrentPage(currentPageNumber, forceFocus = false) {
+    setTimeout(() => {
+      this.forceRendering();
+      const newPageNumber = currentPageNumber || 1;
+      this.linkService.goToPage(newPageNumber);
+      const thumbnailView = this._thumbnails[newPageNumber - 1];
+      if (forceFocus || !this.container.contains(document.activeElement)) {
+        thumbnailView.imageContainer.focus();
+      }
+    }, 0);
+  }
+  #undo() {
+    this.#clearSelection();
+    this.#toggleMenuEntries(false);
+    this.#updateStatus("select");
+    if (this.#copiedThumbnails) {
+      this.#copiedThumbnails = null;
+      this.#pagesMapper.cancelCopy();
+      this.#togglePasteMode(false);
+      this.eventBus.dispatch("pagesedited", {
+        source: this,
+        pagesMapper: this.#pagesMapper,
+        type: "cancelCopy"
+      });
+    }
+    this.#isCut = false;
+    if (this.#savedThumbnails) {
+      const currentThumb = this._thumbnails[this._currentPageNumber - 1];
+      currentThumb?.toggleCurrent(false);
+      const fragment = document.createDocumentFragment();
+      for (let i = 1, ii = this.#savedThumbnails.length; i <= ii; i++) {
+        const thumbnail = this.#savedThumbnails[i - 1];
+        thumbnail.updateId(i);
+        thumbnail.checkbox.checked = false;
+        fragment.append(thumbnail.div);
+      }
+      this.container.replaceChildren(fragment);
+      this._thumbnails = this.#savedThumbnails;
+      this.#savedThumbnails = null;
+      const newIdx = currentThumb ? this._thumbnails.indexOf(currentThumb) : -1;
+      this._currentPageNumber = newIdx + 1;
+      currentThumb?.toggleCurrent(newIdx !== -1);
+      this.#pagesMapper.cancelDelete();
+      this.eventBus.dispatch("pagesedited", {
+        source: this,
+        pagesMapper: this.#pagesMapper,
+        type: "cancelDelete"
+      });
+    }
+  }
+  #dismissUndo(mustUpdateStatus) {
+    this.#copiedThumbnails = null;
+    if (this.#deletedPageNumbers) {
+      if (this.#savedThumbnails) {
+        for (const pageNumber of this.#deletedPageNumbers) {
+          this.#savedThumbnails[pageNumber - 1].destroy();
+        }
+        this.#savedThumbnails = null;
+      }
+      this.#deletedPageNumbers = null;
+    }
+    this.#isCut = false;
+    if (mustUpdateStatus) {
+      this.#updateStatus("select");
+    }
+    this.#togglePasteMode(false);
+    this.#pagesMapper.cleanSavedData();
+    this.eventBus.dispatch("pagesedited", {
+      source: this,
+      pagesMapper: this.#pagesMapper,
+      type: "cleanSavedData"
+    });
+  }
+  #canDelete() {
+    const size = this.#selectedPages?.size || 0;
+    return size > 0 && size < this._thumbnails.length;
+  }
+  #toggleBar(type, message, args) {
+    this.#statusBar.classList.toggle("hidden", type !== "status");
+    this.#waitingBar.container.classList.toggle("hidden", type !== "waiting");
+    this.#undoBar.classList.toggle("hidden", type !== "undo");
+    this.#hasUndoBarVisible = type === "undo";
+    switch (type) {
+      case "waiting":
+        this.#waitingBar.label.setAttribute("data-l10n-id", message);
+        break;
+      case "undo":
+        this.#undoLabel.setAttribute("data-l10n-id", message);
+        if (args) {
+          this.#undoLabel.setAttribute("data-l10n-args", JSON.stringify(args));
+        }
+        break;
+      case "status":
+        if (args) {
+          this.#statusLabel.setAttribute("data-l10n-args", JSON.stringify(args));
+        } else {
+          this.#statusLabel.removeAttribute("data-l10n-args");
+        }
+        this.#newBadge?.classList.toggle("hidden", !!args);
+        this.#deselectButton.classList.toggle("hidden", !args);
+        break;
+    }
+  }
+  #togglePasteMode(enable) {
+    this.#isInPasteMode = enable;
+    if (enable) {
+      this.container.classList.add("pasteMode");
+      for (const thumbnail of this._thumbnails) {
+        thumbnail.addPasteButton(this.#boundPastePages);
+      }
+    } else {
+      this.container.classList.remove("pasteMode");
+      for (const thumbnail of this._thumbnails) {
+        thumbnail.removePasteButton();
+      }
+    }
+  }
+  #reportTelemetry(data) {
+    this.eventBus.dispatch("reporttelemetry", {
+      source: this,
+      details: {
+        type: "pageOrganization",
+        data
+      }
+    });
+  }
+  #saveExtractedPages() {
+    this.#reportTelemetry({
+      action: "exportSelected"
+    });
+    this.eventBus.dispatch("saveextractedpages", {
+      source: this,
+      data: this.#pagesMapper.extractPages(this.#selectedPages)
+    });
+    this.#clearSelection();
+    this.#toggleMenuEntries(false);
+    this.#updateStatus("select");
+  }
+  #copyPages(clearSelection = true) {
+    if (!this.#isCut) {
+      this.#savedThumbnails = null;
+      this.#reportTelemetry({
+        action: "copy"
+      });
+    }
+    this.#updateStatus(this.#isCut ? "cut" : "copy");
+    const pageNumbersToCopy = this.#copiedPageNumbers = Uint32Array.from(this.#selectedPages).sort((a, b) => a - b);
+    const pagesMapper = this.#pagesMapper;
+    pagesMapper.copyPages(pageNumbersToCopy);
+    this.#copiedThumbnails = new Map();
+    for (const pageNumber of pageNumbersToCopy) {
+      this.#copiedThumbnails.set(pageNumber, this._thumbnails[pageNumber - 1]);
+    }
+    this.eventBus.dispatch("pagesedited", {
+      source: this,
+      pagesMapper,
+      pageNumbers: pageNumbersToCopy,
+      type: "copy"
+    });
+    if (clearSelection) {
+      this.#clearSelection();
+    }
+    this.#togglePasteMode(true);
+    this.#toggleMenuEntries(false);
+  }
+  #cutPages() {
+    if (!this.#canDelete()) {
+      return;
+    }
+    this.#reportTelemetry({
+      action: "cut"
+    });
+    this.#isCut = true;
+    this.#copyPages(false);
+    this.#deletePages("cut");
+  }
+  #pastePages(index) {
+    this.#reportTelemetry({
+      action: "paste"
+    });
+    const pagesMapper = this.#pagesMapper;
+    const currentPageNumber = this.#copiedPageNumbers.includes(this._currentPageNumber) ? 0 : this._currentPageNumber;
+    pagesMapper.pastePages(index);
+    this.#updateThumbnails(currentPageNumber);
+    this.#updateCurrentPage(index + 1, true);
+    this.#thumbnailsPositions = null;
+    this.eventBus.dispatch("pagesedited", {
+      source: this,
+      pagesMapper,
+      hasBeenCut: this.#isCut,
+      type: "paste"
+    });
+    this.#copiedThumbnails = null;
+    this.#isCut = false;
+    this.#togglePasteMode(false);
+    this.#toggleMenuEntries(false);
+    this.#updateStatus("select");
+  }
+  #deletePages(type = "delete") {
+    if (!this.#canDelete()) {
+      return;
+    }
+    const selectedPages = this.#selectedPages;
+    if (type === "delete") {
+      this.#reportTelemetry({
+        action: "delete"
+      });
+      this.#updateStatus("delete");
+    }
+    const pagesMapper = this.#pagesMapper;
+    const currentPageNumber = selectedPages.has(this._currentPageNumber) ? 0 : this._currentPageNumber;
+    const pagesToDelete = this.#deletedPageNumbers = Uint32Array.from(selectedPages).sort((a, b) => a - b);
+    pagesMapper.deletePages(pagesToDelete);
+    this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));
+    this.#thumbnailsPositions = null;
+    selectedPages.clear();
+    this.#updateMenuEntries();
+    this.eventBus.dispatch("pagesedited", {
+      source: this,
+      pagesMapper,
+      pageNumbers: pagesToDelete,
+      type
+    });
+  }
+  #updateMenuEntries() {
+    const size = this.#selectedPages?.size || 0;
+    this.#manageExportButton.disabled = this.#manageCopyButton.disabled = !size;
+    this.#manageDeleteButton.disabled = this.#manageCutButton.disabled = !this.#canDelete();
+  }
+  #toggleMenuEntries(enable) {
+    this.#manageExportButton.disabled = this.#manageDeleteButton.disabled = this.#manageCopyButton.disabled = this.#manageCutButton.disabled = !enable;
+  }
+  #updateStatus(type) {
+    if (!this.#statusBar || !this.#undoBar) {
+      return;
+    }
+    const count = this.#selectedPages?.size || 0;
+    if (type === "select") {
+      this.#statusLabel.setAttribute("data-l10n-id", count ? "pdfjs-views-manager-pages-status-action-label" : "pdfjs-views-manager-pages-status-none-action-label");
+      this.#toggleBar("status", "", count ? {
+        count
+      } : null);
+      return;
+    }
+    let l10nId;
+    switch (type) {
+      case "copy":
+        l10nId = "pdfjs-views-manager-pages-status-undo-copy-label";
+        break;
+      case "cut":
+        l10nId = "pdfjs-views-manager-status-undo-cut-label";
+        break;
+      case "delete":
+        l10nId = "pdfjs-views-manager-pages-status-undo-delete-label";
+        break;
+    }
+    this.#toggleBar("undo", l10nId, {
+      count
+    });
+    if (type === "copy") {
+      this.#undoButton.firstElementChild.setAttribute("data-l10n-id", "pdfjs-views-manager-status-done-button-label");
+      this.#undoCloseButton.classList.toggle("hidden", true);
+    } else {
+      this.#undoButton.firstElementChild.setAttribute("data-l10n-id", "pdfjs-views-manager-status-undo-button-label");
+      this.#undoCloseButton.classList.toggle("hidden", false);
+    }
+  }
+  #moveDraggedContainer(dx, dy) {
+    if (this.#isOneColumnView) {
+      dx = 0;
+    }
+    if (this.#draggedImageX + dx < 0 || this.#draggedImageX + this.#draggedImageWidth + dx > this.#scrollableContainerWidth) {
+      dx = 0;
+    }
+    if (this.#draggedImageY + dy < 0 || this.#draggedImageY + this.#draggedImageHeight + dy > this.#scrollableContainerHeight) {
+      dy = 0;
+    }
+    this.#draggedImageX += dx;
+    this.#draggedImageY += dy;
+    this.#draggedImageOffsetX += dx;
+    this.#draggedImageOffsetY += dy;
+    this.#draggedContainer.style.translate = `${this.#draggedImageOffsetX}px ${this.#draggedImageOffsetY}px`;
+    if (this.#draggedImageY + this.#draggedImageHeight > this.#currentScrollBottom) {
+      this.scrollableContainer.scrollTop = Math.min(this.scrollableContainer.scrollTop + PIXELS_TO_SCROLL_WHEN_DRAGGING, this.#scrollableContainerHeight);
+    } else if (this.#draggedImageY < this.#currentScrollTop) {
+      this.scrollableContainer.scrollTop = Math.max(this.scrollableContainer.scrollTop - PIXELS_TO_SCROLL_WHEN_DRAGGING, 0);
+    }
+    const positionData = this.#findClosestThumbnail(this.#draggedImageX + this.#draggedImageWidth / 2, this.#draggedImageY + this.#draggedImageHeight / 2);
+    this.#positionDragMarker(positionData);
+  }
+  #positionDragMarker(positionData) {
+    if (!positionData) {
+      return;
+    }
+    let dragMarker = this.#dragMarker;
+    if (!dragMarker) {
+      dragMarker = this.#dragMarker = document.createElement("div");
+      dragMarker.className = "dragMarker";
+      this.container.firstChild.before(dragMarker);
+    }
+    const [index, space] = positionData;
+    const dragMarkerStyle = dragMarker.style;
+    const {
+      bbox,
+      x: xPos
+    } = this.#thumbnailsPositions;
+    let x, y, width, height;
+    if (index < 0) {
+      if (xPos.length === 1) {
+        y = bbox[1] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT;
+        x = bbox[0];
+        width = bbox[2];
+      } else {
+        y = bbox[1];
+        x = bbox[0] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT;
+        height = bbox[3];
+      }
+    } else if (xPos.length === 1) {
+      y = bbox[index * 4 + 1] + bbox[index * 4 + 3] + space;
+      x = bbox[index * 4];
+      width = bbox[index * 4 + 2];
+    } else {
+      y = bbox[index * 4 + 1];
+      x = bbox[index * 4] + bbox[index * 4 + 2] + space;
+      height = bbox[index * 4 + 3];
+    }
+    dragMarkerStyle.translate = `${x}px ${y}px`;
+    dragMarkerStyle.width = width ? `${width}px` : "";
+    dragMarkerStyle.height = height ? `${height}px` : "";
+  }
+  #computeThumbnailsPosition() {
+    const positionsX = [];
+    const positionsY = [];
+    const positionsLastX = [];
+    const bbox = new Float32Array(this._thumbnails.length * 4);
+    let prevX = -Infinity;
+    let prevY = -Infinity;
+    let reminder = -1;
+    let firstRightX;
+    let lastRightX;
+    let firstBottomY;
+    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {
+      const {
+        div
+      } = this._thumbnails[i];
+      const {
+        offsetTop: y,
+        offsetLeft: x,
+        offsetWidth: w,
+        offsetHeight: h
+      } = div;
+      if (w === 0) {
+        return;
+      }
+      bbox[i * 4] = x;
+      bbox[i * 4 + 1] = y;
+      bbox[i * 4 + 2] = w;
+      bbox[i * 4 + 3] = h;
+      if (x > prevX) {
+        prevX = x + w / 2;
+        firstRightX ??= prevX + w;
+        positionsX.push(prevX);
+      }
+      if (y > prevY) {
+        if (reminder === -1 && positionsX.length > 1) {
+          reminder = ii % positionsX.length;
+        }
+        prevY = y + h / 2;
+        firstBottomY ??= prevY + h;
+        positionsY.push(prevY);
+      }
+      if (reminder > 0 && i >= ii - reminder) {
+        const cx = x + w / 2;
+        positionsLastX.push(cx);
+        lastRightX ??= cx + w;
+      }
+    }
+    let space;
+    if (positionsX.length > 1) {
+      space = (positionsX[1] - firstRightX) / 2;
+    } else if (positionsY.length > 1) {
+      space = (positionsY[1] - firstBottomY) / 2;
+    } else {
+      space = SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT;
+    }
+    this.#thumbnailsPositions = {
+      x: positionsX,
+      y: positionsY,
+      lastX: positionsLastX,
+      space,
+      lastSpace: positionsLastX.length ? (positionsLastX.at(-1) - lastRightX) / 2 : space,
+      bbox
+    };
+    this.#isOneColumnView = positionsX.length === 1;
+    ({
+      clientWidth: this.#scrollableContainerWidth,
+      scrollHeight: this.#scrollableContainerHeight
+    } = this.scrollableContainer);
+  }
+  #addEventListeners() {
+    this.eventBus.on("resize", ({
+      source
+    }) => {
+      if (source.thumbnailsView === this.container) {
+        this.#computeThumbnailsPosition();
+      }
+    }, internalOpt);
+    this.container.addEventListener("keydown", e => {
+      const {
+        target
+      } = e;
+      const isCheckbox = target instanceof HTMLInputElement && target.type === "checkbox";
+      switch (e.key) {
+        case "ArrowLeft":
+          this.#goToNextItem(target, false, true, isCheckbox);
+          stopEvent(e);
+          break;
+        case "ArrowRight":
+          this.#goToNextItem(target, true, true, isCheckbox);
+          stopEvent(e);
+          break;
+        case "ArrowDown":
+          this.#goToNextItem(target, true, false, isCheckbox);
+          stopEvent(e);
+          break;
+        case "ArrowUp":
+          this.#goToNextItem(target, false, false, isCheckbox);
+          stopEvent(e);
+          break;
+        case "Home":
+          this.#focusThumbnailElement(this._thumbnails[0], isCheckbox);
+          stopEvent(e);
+          break;
+        case "End":
+          this.#focusThumbnailElement(this._thumbnails.at(-1), isCheckbox);
+          stopEvent(e);
+          break;
+        case "Enter":
+        case " ":
+          if (!isCheckbox) {
+            this.#goToPage(e);
+          }
+          break;
+        case "c":
+          if (this.#enableSplitMerge && (e.ctrlKey || e.metaKey) && this.#selectedPages?.size) {
+            this.#copyPages();
+            stopEvent(e);
+          }
+          break;
+        case "x":
+          if (this.#enableSplitMerge && (e.ctrlKey || e.metaKey) && this.#selectedPages?.size) {
+            this.#cutPages();
+            stopEvent(e);
+          }
+          break;
+        case "Delete":
+        case "Backspace":
+          if (this.#enableSplitMerge && !this.#isInPasteMode && this.#selectedPages?.size) {
+            this.#deletePages();
+            stopEvent(e);
+          }
+          break;
+      }
+    });
+    this.container.addEventListener("click", e => {
+      const {
+        target
+      } = e;
+      if (target instanceof HTMLInputElement) {
+        const pageNumber = parseInt(target.parentElement.getAttribute("page-number"), 10);
+        this.#selectPage(pageNumber, target.checked);
+        return;
+      }
+      this.#goToPage(e);
+    });
+    this.#addDragListeners();
+    this.#addExternalFileDropListeners();
+  }
+  #selectPage(pageNumber, checked) {
+    if (this.#hasUndoBarVisible) {
+      this.#dismissUndo(false);
+    }
+    const set = this.#selectedPages ??= new Set();
+    if (checked) {
+      set.add(pageNumber);
+    } else {
+      set.delete(pageNumber);
+    }
+    this.#updateMenuEntries();
+    this.#updateStatus("select");
+  }
+  #addDragListeners() {
+    if (!this.#enableSplitMerge) {
+      return;
+    }
+    this.container.addEventListener("pointerdown", e => {
+      const {
+        target: draggedImage,
+        clientX: clickX,
+        clientY: clickY,
+        pointerId: dragPointerId
+      } = e;
+      if (e.button !== 0 || this.#isInPasteMode || this._thumbnails.length === 1 || !isNaN(this.#lastDraggedOverIndex) || !draggedImage.classList.contains("thumbnailImageContainer")) {
+        return;
+      }
+      const thumbnail = draggedImage.parentElement;
+      const pointerDownAC = new AbortController();
+      const {
+        signal: pointerDownSignal
+      } = pointerDownAC;
+      let prevDragX = clickX;
+      let prevDragY = clickY;
+      let prevScrollTop = this.scrollableContainer.scrollTop;
+      const scaleFactor = PDFThumbnailViewer.#getScaleFactor(draggedImage);
+      this.#draggedImageOffsetY = ((scaleFactor - 1) * e.layerY + draggedImage.offsetTop) / scaleFactor;
+      if (this.#isOneColumnView) {
+        this.#draggedImageOffsetX = draggedImage.offsetLeft + (scaleFactor - 1) * 0.5 * draggedImage.offsetWidth / scaleFactor;
+      } else {
+        this.#draggedImageOffsetX = ((scaleFactor - 1) * e.layerX + draggedImage.offsetLeft) / scaleFactor;
+      }
+      this.#draggedImageX = thumbnail.offsetLeft + this.#draggedImageOffsetX;
+      this.#draggedImageY = thumbnail.offsetTop + this.#draggedImageOffsetY;
+      this.#draggedImageWidth = draggedImage.offsetWidth / scaleFactor;
+      this.#draggedImageHeight = draggedImage.offsetHeight / scaleFactor;
+      this.container.addEventListener("pointermove", ev => {
+        const {
+          clientX: x,
+          clientY: y,
+          pointerId
+        } = ev;
+        if (isNaN(this.#lastDraggedOverIndex)) {
+          if (pointerId !== dragPointerId || Math.abs(x - clickX) <= DRAG_THRESHOLD_IN_PIXELS && Math.abs(y - clickY) <= DRAG_THRESHOLD_IN_PIXELS) {
+            return;
+          }
+          this.#onStartDragging(thumbnail);
+          const stopDragging = (_e, isDropping = false) => {
+            this.#onStopDragging(isDropping);
+            pointerDownAC.abort();
+          };
+          const {
+            signal
+          } = this.#dragAC;
+          window.addEventListener("touchmove", stopEvent, {
+            passive: false,
+            signal
+          });
+          window.addEventListener("contextmenu", noContextMenu, {
+            signal
+          });
+          this.scrollableContainer.addEventListener("scrollend", () => {
+            const {
+              scrollableContainer: {
+                clientHeight,
+                scrollTop
+              }
+            } = this;
+            this.#currentScrollTop = scrollTop;
+            this.#currentScrollBottom = scrollTop + clientHeight;
+            const dy = scrollTop - prevScrollTop;
+            prevScrollTop = scrollTop;
+            this.#moveDraggedContainer(0, dy);
+          }, {
+            passive: true,
+            signal
+          });
+          window.addEventListener("pointerup", upEv => {
+            if (upEv.pointerId !== dragPointerId) {
+              return;
+            }
+            window.addEventListener("click", stopEvent, {
+              capture: true,
+              once: true,
+              signal
+            });
+            stopEvent(upEv);
+            stopDragging(upEv, true);
+          }, {
+            signal
+          });
+          window.addEventListener("blur", stopDragging, {
+            signal
+          });
+          window.addEventListener("pointercancel", stopDragging, {
+            signal
+          });
+          window.addEventListener("wheel", stopEvent, {
+            passive: false,
+            signal
+          });
+          window.addEventListener("keydown", kEv => {
+            if (kEv.key === "Escape" && !isNaN(this.#lastDraggedOverIndex)) {
+              stopDragging(kEv);
+            }
+          }, {
+            signal
+          });
+        }
+        const dx = x - prevDragX;
+        const dy = y - prevDragY;
+        prevDragX = x;
+        prevDragY = y;
+        this.#moveDraggedContainer(dx, dy);
+      }, {
+        passive: true,
+        signal: pointerDownSignal
+      });
+      window.addEventListener("pointerup", ({
+        pointerId
+      }) => {
+        if (pointerId !== dragPointerId) {
+          return;
+        }
+        pointerDownAC.abort();
+      }, {
+        signal: pointerDownSignal
+      });
+      window.addEventListener("dragstart", stopEvent, {
+        capture: true,
+        signal: pointerDownSignal
+      });
+    });
+  }
+  #addExternalFileDropListeners() {
+    if (!this.#enableMerge) {
+      return;
+    }
+    const container = this.container;
+    const signal = this.#abortSignal;
+    const hasMergeableItem = dataTransfer => {
+      if (!dataTransfer) {
+        return false;
+      }
+      for (const item of dataTransfer.items) {
+        if (item.kind === "file" && (item.type === "application/pdf" || item.type.startsWith("image/"))) {
+          return true;
+        }
+      }
+      return false;
+    };
+    const pointerInContainer = ({
+      clientX,
+      clientY
+    }) => {
+      const {
+        left,
+        right,
+        top,
+        bottom
+      } = container.getBoundingClientRect();
+      return clientX >= left && clientX < right && clientY >= top && clientY < bottom;
+    };
+    container.addEventListener("dragenter", e => {
+      if (this.#externalDragActive || !isNaN(this.#lastDraggedOverIndex) || !this._thumbnails.length || !hasMergeableItem(e.dataTransfer)) {
+        return;
+      }
+      e.preventDefault();
+      e.stopPropagation();
+      e.dataTransfer.dropEffect = "copy";
+      this.#externalDragActive = true;
+      this.container.classList.add("isDraggingFile");
+      this.#thumbnailsPositions = null;
+      this.#computeThumbnailsPosition();
+      this.#lastDraggedOverIndex = NaN;
+    }, {
+      signal
+    });
+    container.addEventListener("dragover", e => {
+      if (!this.#externalDragActive) {
+        return;
+      }
+      e.preventDefault();
+      e.stopPropagation();
+      e.dataTransfer.dropEffect = "copy";
+      if (!this.#thumbnailsPositions) {
+        return;
+      }
+      const rect = container.getBoundingClientRect();
+      const x = e.clientX - rect.left;
+      const y = e.clientY - rect.top;
+      const positionData = this.#findClosestThumbnail(x, y);
+      this.#positionDragMarker(positionData);
+    }, {
+      signal
+    });
+    container.addEventListener("dragleave", e => {
+      if (!this.#externalDragActive) {
+        return;
+      }
+      if (e.relatedTarget && container.contains(e.relatedTarget) || pointerInContainer(e)) {
+        return;
+      }
+      this.#endExternalFileDrag();
+    }, {
+      signal
+    });
+    container.addEventListener("drop", e => {
+      if (!this.#externalDragActive) {
+        return;
+      }
+      e.preventDefault();
+      e.stopPropagation();
+      const files = Array.from(e.dataTransfer.files ?? []);
+      if (isNaN(this.#lastDraggedOverIndex) && this.#thumbnailsPositions) {
+        const rect = container.getBoundingClientRect();
+        this.#findClosestThumbnail(e.clientX - rect.left, e.clientY - rect.top);
+      }
+      const insertAfter = isNaN(this.#lastDraggedOverIndex) ? -1 : this.#lastDraggedOverIndex;
+      this.#endExternalFileDrag();
+      if (files.length) {
+        this.#mergeFiles(files, insertAfter);
+      }
+    }, {
+      signal
+    });
+  }
+  #endExternalFileDrag() {
+    this.#externalDragActive = false;
+    this.container.classList.remove("isDraggingFile");
+    this.#dragMarker?.remove();
+    this.#dragMarker = null;
+    this.#lastDraggedOverIndex = NaN;
+  }
+  #goToPage(e) {
+    const container = e.target.closest(".thumbnailImageContainer");
+    if (container) {
+      const pageNumber = parseInt(container.getAttribute("page-number"), 10);
+      this.linkService.goToPage(pageNumber);
+      stopEvent(e);
+    }
+  }
+  #focusThumbnailElement(thumbnail, focusCheckbox) {
+    if (focusCheckbox && thumbnail.checkbox) {
+      thumbnail.checkbox.focus();
+    } else {
+      thumbnail.imageContainer.focus();
+    }
+  }
+  #goToNextItem(element, forward, horizontal, navigateCheckboxes = false) {
+    let currentPageNumber = parseInt(element.parentElement.getAttribute("page-number"), 10);
+    if (isNaN(currentPageNumber)) {
+      currentPageNumber = this._currentPageNumber;
+    }
+    const increment = forward ? 1 : -1;
+    let nextThumbnail;
+    if (horizontal) {
+      const nextPageNumber = MathClamp(currentPageNumber + increment, 1, this._thumbnails.length + 1);
+      nextThumbnail = this._thumbnails[nextPageNumber - 1];
+    } else {
+      const currentThumbnail = this._thumbnails[currentPageNumber - 1];
+      const {
+        x: currentX,
+        y: currentY
+      } = currentThumbnail.div.getBoundingClientRect();
+      let firstWithDifferentY;
+      for (let i = currentPageNumber - 1 + increment; i >= 0 && i < this._thumbnails.length; i += increment) {
+        const thumbnail = this._thumbnails[i];
+        const {
+          x,
+          y
+        } = thumbnail.div.getBoundingClientRect();
+        if (!firstWithDifferentY && y !== currentY) {
+          firstWithDifferentY = thumbnail;
+        }
+        if (x === currentX) {
+          nextThumbnail = thumbnail;
+          break;
+        }
+      }
+      if (!nextThumbnail) {
+        nextThumbnail = firstWithDifferentY;
+      }
+    }
+    if (nextThumbnail) {
+      this.#focusThumbnailElement(nextThumbnail, navigateCheckboxes);
+    }
+  }
+  #findClosestThumbnail(x, y) {
+    if (!this.#thumbnailsPositions) {
+      this.#computeThumbnailsPosition();
+    }
+    const {
+      x: positionsX,
+      y: positionsY,
+      lastX: positionsLastX,
+      space: spaceBetweenThumbnails,
+      lastSpace: lastSpaceBetweenThumbnails
+    } = this.#thumbnailsPositions;
+    const lastDraggedOverIndex = this.#lastDraggedOverIndex;
+    let xPos = lastDraggedOverIndex % positionsX.length;
+    let yPos = Math.floor(lastDraggedOverIndex / positionsX.length);
+    let xArray = yPos === positionsY.length - 1 ? positionsLastX : positionsX;
+    if (positionsY[yPos] <= y && y < (positionsY[yPos + 1] ?? Infinity) && xArray[xPos] <= x && x < (xArray[xPos + 1] ?? Infinity)) {
+      return null;
+    }
+    let index;
+    yPos = binarySearchFirstItem(positionsY, cy => y < cy);
+    if (this.#isOneColumnView) {
+      index = yPos - 1;
+    } else {
+      if (yPos === positionsY.length) {
+        yPos = positionsY.length - 1;
+      } else {
+        const dist1 = Math.abs(positionsY[yPos - 1] - y);
+        const dist2 = Math.abs(positionsY[yPos] - y);
+        yPos = dist1 < dist2 ? yPos - 1 : yPos;
+      }
+      xArray = yPos === positionsY.length - 1 && positionsLastX.length > 0 ? positionsLastX : positionsX;
+      xPos = binarySearchFirstItem(xArray, cx => x < cx) - 1;
+      if (yPos < 0) {
+        if (xPos <= 0) {
+          xPos = -1;
+        }
+        yPos = 0;
+      }
+      index = MathClamp(yPos * positionsX.length + xPos, -1, this._thumbnails.length - 1);
+    }
+    if (index === lastDraggedOverIndex) {
+      return null;
+    }
+    this.#lastDraggedOverIndex = index;
+    const space = yPos === positionsY.length - 1 && positionsLastX.length > 0 && xPos >= 0 ? lastSpaceBetweenThumbnails : spaceBetweenThumbnails;
+    return [index, space];
+  }
+}
+
+;// ./web/annotation_editor_layer_builder.js
+
+
+class AnnotationEditorLayerBuilder {
+  #annotationLayer = null;
+  #drawLayer = null;
+  #onAppend = null;
+  #structTreeLayer = null;
+  #textLayer = null;
+  #uiManager;
+  constructor(options) {
+    this.pageIndex = options.pageIndex;
+    this.accessibilityManager = options.accessibilityManager;
+    this.l10n = options.l10n;
+    this.l10n ||= new genericl10n_GenericL10n();
+    this.annotationEditorLayer = null;
+    this.div = null;
+    this._cancelled = false;
+    this.#uiManager = options.uiManager;
+    this.#annotationLayer = options.annotationLayer || null;
+    this.#textLayer = options.textLayer || null;
+    this.#drawLayer = options.drawLayer || null;
+    this.#onAppend = options.onAppend || null;
+    this.#structTreeLayer = options.structTreeLayer || null;
+  }
+  updatePageIndex(newPageIndex) {
+    this.pageIndex = newPageIndex;
+    this.annotationEditorLayer?.updatePageIndex(newPageIndex);
+  }
+  async render({
+    viewport,
+    intent = "display"
+  }) {
+    if (intent !== "display") {
+      return;
+    }
+    if (this._cancelled) {
+      return;
+    }
+    const clonedViewport = viewport.clone({
+      dontFlip: true
+    });
+    if (this.div) {
+      this.annotationEditorLayer.update({
+        viewport: clonedViewport
+      });
+      this.show();
+      return;
+    }
+    const div = this.div = document.createElement("div");
+    div.className = "annotationEditorLayer";
+    div.hidden = true;
+    div.dir = this.#uiManager.direction;
+    this.#onAppend?.(div);
+    this.annotationEditorLayer = new AnnotationEditorLayer({
+      uiManager: this.#uiManager,
+      div,
+      structTreeLayer: this.#structTreeLayer,
+      accessibilityManager: this.accessibilityManager,
+      pageIndex: this.pageIndex,
+      l10n: this.l10n,
+      viewport: clonedViewport,
+      annotationLayer: this.#annotationLayer,
+      textLayer: this.#textLayer,
+      drawLayer: this.#drawLayer
+    });
+    const parameters = {
+      viewport: clonedViewport,
+      div,
+      annotations: null,
+      intent
+    };
+    await this.annotationEditorLayer.render(parameters);
+    this.show();
+  }
+  cancel() {
+    this._cancelled = true;
+    if (!this.div) {
+      return;
+    }
+    this.annotationEditorLayer.destroy();
+  }
+  hide() {
+    if (!this.div) {
+      return;
+    }
+    this.annotationEditorLayer.pause(true);
+    this.div.hidden = true;
+  }
+  show() {
+    if (!this.div || this.annotationEditorLayer.isInvisible) {
+      return;
+    }
+    this.div.hidden = false;
+    this.annotationEditorLayer.pause(false);
+  }
+}
+
+;// ./web/annotation_layer_builder.js
+
+
+
+class AnnotationLayerBuilder {
+  #annotations = null;
+  #commentManager = null;
+  #onAppend = null;
+  #eventAC = null;
+  #linksInjected = false;
+  constructor({
+    pdfPage,
+    linkService,
+    downloadManager,
+    annotationStorage = null,
+    imageResourcesPath = "",
+    renderForms = true,
+    enableComment = false,
+    commentManager = null,
+    enableScripting = false,
+    hasJSActionsPromise = null,
+    fieldObjectsPromise = null,
+    annotationCanvasMap = null,
+    accessibilityManager = null,
+    annotationEditorUIManager = null,
+    onAppend = null
+  }) {
+    this.pdfPage = pdfPage;
+    this.linkService = linkService;
+    this.downloadManager = downloadManager;
+    this.imageResourcesPath = imageResourcesPath;
+    this.renderForms = renderForms;
+    this.annotationStorage = annotationStorage;
+    this.enableComment = enableComment;
+    this.#commentManager = commentManager;
+    this.enableScripting = enableScripting;
+    this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false);
+    this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null);
+    this._annotationCanvasMap = annotationCanvasMap;
+    this._accessibilityManager = accessibilityManager;
+    this._annotationEditorUIManager = annotationEditorUIManager;
+    this.#onAppend = onAppend;
+    this.annotationLayer = null;
+    this.div = null;
+    this._cancelled = false;
+    this._eventBus = linkService.eventBus;
+  }
+  async render({
+    viewport,
+    intent = "display",
+    structTreeLayer = null,
+    optionalContentConfigPromise = null
+  }) {
+    if (this.div) {
+      const optionalContentConfig = await optionalContentConfigPromise;
+      if (this._cancelled || !this.annotationLayer) {
+        return;
+      }
+      this.annotationLayer.update({
+        viewport: viewport.clone({
+          dontFlip: true
+        }),
+        optionalContentConfig
+      });
+      return;
+    }
+    const [annotations, hasJSActions, fieldObjects, optionalContentConfig] = await Promise.all([this.pdfPage.getAnnotations({
+      intent
+    }), this._hasJSActionsPromise, this._fieldObjectsPromise, optionalContentConfigPromise]);
+    if (this._cancelled) {
+      return;
+    }
+    const div = this.div = document.createElement("div");
+    div.className = "annotationLayer";
+    this.#onAppend?.(div);
+    this.#initAnnotationLayer(viewport, structTreeLayer);
+    if (annotations.length === 0) {
+      this.#annotations = annotations;
+      setLayerDimensions(this.div, viewport);
+      return;
+    }
+    await this.annotationLayer.render({
+      annotations,
+      imageResourcesPath: this.imageResourcesPath,
+      renderForms: this.renderForms,
+      downloadManager: this.downloadManager,
+      enableComment: this.enableComment,
+      enableScripting: this.enableScripting,
+      hasJSActions,
+      fieldObjects,
+      optionalContentConfig
+    });
+    this.#annotations = annotations;
+    if (this.linkService.isInPresentationMode) {
+      this.#updatePresentationModeState(PresentationModeState.FULLSCREEN);
+    }
+    if (!this.#eventAC) {
+      this.#eventAC = new AbortController();
+      this._eventBus?.on("presentationmodechanged", evt => {
+        this.#updatePresentationModeState(evt.state);
+      }, {
+        signal: this.#eventAC.signal,
+        ...internalOpt
+      });
+    }
+  }
+  #initAnnotationLayer(viewport, structTreeLayer) {
+    this.annotationLayer = new AnnotationLayer({
+      div: this.div,
+      accessibilityManager: this._accessibilityManager,
+      annotationCanvasMap: this._annotationCanvasMap,
+      annotationEditorUIManager: this._annotationEditorUIManager,
+      annotationStorage: this.annotationStorage,
+      page: this.pdfPage,
+      viewport: viewport.clone({
+        dontFlip: true
+      }),
+      structTreeLayer,
+      commentManager: this.#commentManager,
+      linkService: this.linkService
+    });
+  }
+  cancel() {
+    this._cancelled = true;
+    this.#eventAC?.abort();
+    this.#eventAC = null;
+    this.annotationLayer?.destroy();
+  }
+  refreshCanvases() {
+    this.annotationLayer?.refreshCanvases();
+  }
+  hide() {
+    if (!this.div) {
+      return;
+    }
+    this.div.hidden = true;
+  }
+  hasEditableAnnotations() {
+    return !!this.annotationLayer?.hasEditableAnnotations();
+  }
+  async injectLinkAnnotations(inferredLinks) {
+    if (this.#annotations === null) {
+      throw new Error("`render` method must be called before `injectLinkAnnotations`.");
+    }
+    if (this._cancelled || this.#linksInjected) {
+      return;
+    }
+    this.#linksInjected = true;
+    const newLinks = this.#annotations.length ? this.#checkInferredLinks(inferredLinks) : inferredLinks;
+    if (!newLinks.length) {
+      return;
+    }
+    await this.annotationLayer.addLinkAnnotations(newLinks);
+  }
+  #updatePresentationModeState(state) {
+    if (!this.div) {
+      return;
+    }
+    let disableFormElements = false;
+    switch (state) {
+      case PresentationModeState.FULLSCREEN:
+        disableFormElements = true;
+        break;
+      case PresentationModeState.NORMAL:
+        break;
+      default:
+        return;
+    }
+    for (const section of this.div.childNodes) {
+      if (section.hasAttribute("data-internal-link") || section.classList.contains("mediaAnnotation")) {
+        continue;
+      }
+      section.inert = disableFormElements;
+    }
+  }
+  #checkInferredLinks(inferredLinks) {
+    function annotationRects(annot) {
+      if (!annot.quadPoints) {
+        return [annot.rect];
+      }
+      const rects = [];
+      for (let i = 2, ii = annot.quadPoints.length; i < ii; i += 8) {
+        const trX = annot.quadPoints[i];
+        const trY = annot.quadPoints[i + 1];
+        const blX = annot.quadPoints[i + 2];
+        const blY = annot.quadPoints[i + 3];
+        rects.push([blX, blY, trX, trY]);
+      }
+      return rects;
+    }
+    function intersectAnnotations(annot1, annot2) {
+      const intersections = [];
+      const annot1Rects = annotationRects(annot1);
+      const annot2Rects = annotationRects(annot2);
+      for (const rect1 of annot1Rects) {
+        for (const rect2 of annot2Rects) {
+          const intersection = Util.intersect(rect1, rect2);
+          if (intersection) {
+            intersections.push(intersection);
+          }
+        }
+      }
+      return intersections;
+    }
+    function areaRects(rects) {
+      let totalArea = 0;
+      for (const rect of rects) {
+        totalArea += Math.abs((rect[2] - rect[0]) * (rect[3] - rect[1]));
+      }
+      return totalArea;
+    }
+    return inferredLinks.filter(link => {
+      let linkAreaRects;
+      for (const annotation of this.#annotations) {
+        if (annotation.annotationType !== AnnotationType.LINK) {
+          continue;
+        }
+        const intersections = intersectAnnotations(annotation, link);
+        if (intersections.length === 0) {
+          continue;
+        }
+        linkAreaRects ??= areaRects(annotationRects(link));
+        if (areaRects(intersections) / linkAreaRects > 0.5) {
+          return false;
+        }
+      }
+      return true;
+    });
+  }
+}
+
+;// ./web/autolinker.js
+
+
+function DOMRectToPDF({
+  width,
+  height,
+  left,
+  top
+}, pdfPageView) {
+  if (width === 0 || height === 0) {
+    return null;
+  }
+  const pageBox = pdfPageView.textLayer.div.getBoundingClientRect();
+  const bottomLeft = pdfPageView.getPagePoint(left - pageBox.left, top - pageBox.top);
+  const topRight = pdfPageView.getPagePoint(left - pageBox.left + width, top - pageBox.top + height);
+  return Util.normalizeRect([bottomLeft[0], bottomLeft[1], topRight[0], topRight[1]]);
+}
+function calculateLinkPosition(range, pdfPageView) {
+  const rangeRects = range.getClientRects();
+  if (rangeRects.length === 1) {
+    return {
+      rect: DOMRectToPDF(rangeRects[0], pdfPageView)
+    };
+  }
+  const rect = [Infinity, Infinity, -Infinity, -Infinity];
+  const quadPoints = [];
+  let i = 0;
+  for (const domRect of rangeRects) {
+    const normalized = DOMRectToPDF(domRect, pdfPageView);
+    if (normalized === null) {
+      continue;
+    }
+    quadPoints[i] = quadPoints[i + 4] = normalized[0];
+    quadPoints[i + 1] = quadPoints[i + 3] = normalized[3];
+    quadPoints[i + 2] = quadPoints[i + 6] = normalized[2];
+    quadPoints[i + 5] = quadPoints[i + 7] = normalized[1];
+    Util.rectBoundingBox(...normalized, rect);
+    i += 8;
+  }
+  return {
+    quadPoints,
+    rect
+  };
+}
+function textPosition(container, offset) {
+  let currentContainer = container;
+  do {
+    if (currentContainer.nodeType === Node.TEXT_NODE) {
+      const currentLength = currentContainer.textContent.length;
+      if (offset <= currentLength) {
+        return [currentContainer, offset];
+      }
+      offset -= currentLength;
+    } else if (currentContainer.firstChild) {
+      currentContainer = currentContainer.firstChild;
+      continue;
+    }
+    while (!currentContainer.nextSibling && currentContainer !== container) {
+      currentContainer = currentContainer.parentNode;
+    }
+    if (currentContainer !== container) {
+      currentContainer = currentContainer.nextSibling;
+    }
+  } while (currentContainer !== container);
+  throw new Error("Offset is bigger than container's contents length.");
+}
+function createLinkAnnotation({
+  url,
+  index,
+  length
+}, pdfPageView, id) {
+  const highlighter = pdfPageView._textHighlighter;
+  const [{
+    begin,
+    end
+  }] = highlighter._convertMatches([index], [length]);
+  const range = new Range();
+  range.setStart(...textPosition(highlighter.textDivs[begin.divIdx], begin.offset));
+  range.setEnd(...textPosition(highlighter.textDivs[end.divIdx], end.offset));
+  return {
+    id: `inferred_link_${id}`,
+    unsafeUrl: url,
+    url,
+    annotationType: AnnotationType.LINK,
+    rotation: 0,
+    ...calculateLinkPosition(range, pdfPageView),
+    borderStyle: null
+  };
+}
+class Autolinker {
+  static #index = 0;
+  static #regex;
+  static #numericTLDRegex;
+  static findLinks(text) {
+    this.#regex ??= /\b(?:https?:\/\/|mailto:|www\.)(?:[\S--[\p{P}<>]]|\/|[\S--[\[\]]]+[\S--[\p{P}<>]])+|(?=\p{L})[\S--[@\p{Ps}\p{Pe}<>]]+@([\S--[[\p{P}--\-]<>]]+(?:\.[\S--[[\p{P}--\-]<>]]+)+)/gv;
+    const [normalizedText, diffs] = normalize(text, {
+      ignoreDashEOL: true
+    });
+    const matches = normalizedText.matchAll(this.#regex);
+    const links = [];
+    for (const match of matches) {
+      const [url, emailDomain] = match;
+      let raw;
+      if (url.startsWith("www.") || url.startsWith("http://") || url.startsWith("https://")) {
+        raw = url;
+      } else if (emailDomain) {
+        const hostname = URL.parse(`http://${emailDomain}`)?.hostname;
+        if (!hostname) {
+          continue;
+        }
+        this.#numericTLDRegex ??= /\.\d+$/;
+        if (this.#numericTLDRegex.test(hostname)) {
+          continue;
+        }
+      }
+      raw ??= url.startsWith("mailto:") ? url : `mailto:${url}`;
+      const absoluteURL = createValidAbsoluteUrl(raw, null, {
+        addDefaultProtocol: true
+      });
+      if (absoluteURL) {
+        const [index, length] = getOriginalIndex(diffs, match.index, url.length);
+        links.push({
+          url: absoluteURL.href,
+          index,
+          length
+        });
+      }
+    }
+    return links;
+  }
+  static processLinks(pdfPageView) {
+    return this.findLinks(pdfPageView._textHighlighter.textContentItemsStr.join("\n")).map(link => createLinkAnnotation(link, pdfPageView, this.#index++));
+  }
+}
+
+;// ./web/base_pdf_page_view.js
+
+
+class BasePDFPageView extends RenderableView {
+  #loadingId = null;
+  #renderError = null;
+  #renderingState = RenderingStates.INITIAL;
+  #showCanvas = null;
+  #startTime = 0;
+  #tempCanvas = null;
+  canvas = null;
+  div = null;
+  enableOptimizedPartialRendering = false;
+  enableSelectionRendering = true;
+  imagesRightClickMinSize = -1;
+  eventBus = null;
+  id = null;
+  imageCoordinates = null;
+  pageColors = null;
+  recordedBBoxes = null;
+  renderingQueue = null;
+  constructor(options) {
+    super();
+    this.eventBus = options.eventBus;
+    this.id = options.id;
+    this.pageColors = options.pageColors || null;
+    this.renderingQueue = options.renderingQueue;
+    this.enableOptimizedPartialRendering = options.enableOptimizedPartialRendering ?? false;
+    this.enableSelectionRendering = options.enableSelectionRendering !== false && FeatureTest.isBackdropFilterSupported;
+    this.imagesRightClickMinSize = options.imagesRightClickMinSize ?? -1;
+    this.minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500;
+  }
+  get renderingState() {
+    return this.#renderingState;
+  }
+  set renderingState(state) {
+    if (state === this.#renderingState) {
+      return;
+    }
+    this.#renderingState = state;
+    if (this.#loadingId) {
+      clearTimeout(this.#loadingId);
+      this.#loadingId = null;
+    }
+    switch (state) {
+      case RenderingStates.PAUSED:
+        this.div.classList.remove("loading");
+        this.#startTime = 0;
+        this.#showCanvas?.(false);
+        break;
+      case RenderingStates.RUNNING:
+        this.div.classList.add("loadingIcon");
+        this.#loadingId = setTimeout(() => {
+          this.div.classList.add("loading");
+          this.#loadingId = null;
+        }, 0);
+        this.#startTime = Date.now();
+        break;
+      case RenderingStates.INITIAL:
+      case RenderingStates.FINISHED:
+        this.div.classList.remove("loadingIcon", "loading");
+        this.#startTime = 0;
+        break;
+    }
+  }
+  _createCanvas(onShow, hideUntilComplete = false) {
+    const {
+      pageColors
+    } = this;
+    const hasHCM = !!(pageColors?.background && pageColors?.foreground);
+    const prevCanvas = this.canvas;
+    const updateOnFirstShow = !prevCanvas && !hasHCM && !hideUntilComplete;
+    let canvas = this.canvas = document.createElement("canvas");
+    this.#showCanvas = isLastShow => {
+      if (updateOnFirstShow) {
+        let tempCanvas = this.#tempCanvas;
+        if (!isLastShow && this.minDurationToUpdateCanvas > 0) {
+          if (Date.now() - this.#startTime < this.minDurationToUpdateCanvas) {
+            return;
+          }
+          if (!tempCanvas) {
+            tempCanvas = this.#tempCanvas = canvas;
+            canvas = this.canvas = canvas.cloneNode(false);
+            onShow(canvas);
+          }
+        }
+        if (tempCanvas) {
+          const ctx = canvas.getContext("2d", {
+            alpha: false
+          });
+          ctx.drawImage(tempCanvas, 0, 0);
+          if (isLastShow) {
+            this.#resetTempCanvas();
+          } else {
+            this.#startTime = Date.now();
+          }
+          return;
+        }
+        onShow(canvas);
+        this.#showCanvas = null;
+        return;
+      }
+      if (!isLastShow) {
+        return;
+      }
+      if (prevCanvas) {
+        prevCanvas.replaceWith(canvas);
+        prevCanvas.width = prevCanvas.height = 0;
+      } else {
+        onShow(canvas);
+      }
+    };
+    return {
+      canvas,
+      prevCanvas
+    };
+  }
+  #renderContinueCallback = cont => {
+    this.#showCanvas?.(false);
+    if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) {
+      this.renderingState = RenderingStates.PAUSED;
+      this.resume = () => {
+        this.renderingState = RenderingStates.RUNNING;
+        cont();
+      };
+      return;
+    }
+    cont();
+  };
+  _resetCanvas() {
+    const {
+      canvas
+    } = this;
+    if (!canvas) {
+      return;
+    }
+    canvas.remove();
+    canvas.width = canvas.height = 0;
+    this.canvas = null;
+    this.#resetTempCanvas();
+  }
+  #resetTempCanvas() {
+    if (this.#tempCanvas) {
+      this.#tempCanvas.width = this.#tempCanvas.height = 0;
+      this.#tempCanvas = null;
+    }
+  }
+  async _drawCanvas(options, onCancel, onFinish) {
+    const renderTask = this.renderTask = this.pdfPage.render(options);
+    renderTask.onContinue = this.#renderContinueCallback;
+    renderTask.onError = error => {
+      if (error instanceof RenderingCancelledException) {
+        onCancel();
+        this.#renderError = null;
+      }
+    };
+    let error = null;
+    try {
+      await renderTask.promise;
+      this.#showCanvas?.(true);
+    } catch (e) {
+      if (e instanceof RenderingCancelledException) {
+        return;
+      }
+      error = e;
+      this.#showCanvas?.(true);
+    } finally {
+      this.#renderError = error;
+      if (renderTask === this.renderTask) {
+        this.renderTask = null;
+        if (this.enableOptimizedPartialRendering) {
+          this.recordedBBoxes ??= renderTask.recordedBBoxes;
+        }
+        if (this.imagesRightClickMinSize !== -1) {
+          this.imageCoordinates ??= this.pdfPage.imageCoordinates;
+        }
+      }
+    }
+    this.renderingState = RenderingStates.FINISHED;
+    onFinish(renderTask);
+    if (error) {
+      throw error;
+    }
+  }
+  cancelRendering({
+    cancelExtraDelay = 0
+  } = {}) {
+    if (this.renderTask) {
+      this.renderTask.cancel(cancelExtraDelay);
+      this.renderTask = null;
+    }
+    this.resume = null;
+  }
+  dispatchPageRender() {
+    this.eventBus.dispatch("pagerender", {
+      source: this,
+      pageNumber: this.id
+    });
+  }
+  dispatchPageRendered(cssTransform, isDetailView) {
+    this.eventBus.dispatch("pagerendered", {
+      source: this,
+      pageNumber: this.id,
+      cssTransform,
+      isDetailView,
+      timestamp: performance.now(),
+      error: this.#renderError
+    });
+  }
+}
+
+;// ./web/draw_layer_builder.js
+
+class DrawLayerBuilder {
+  #drawLayer = null;
+  constructor(options) {
+    this.pageIndex = options.pageIndex;
+    this.textLayer = options.textLayer || null;
+    this.filterFactory = options.filterFactory || null;
+    this.pageColors = options.pageColors || null;
+  }
+  async render({
+    intent = "display"
+  }) {
+    if (intent !== "display" || this.#drawLayer || this._cancelled) {
+      return;
+    }
+    this.#drawLayer = new DrawLayer({
+      pageIndex: this.pageIndex,
+      textLayer: this.textLayer,
+      filterFactory: this.filterFactory,
+      pageColors: this.pageColors
+    });
+  }
+  cancel() {
+    this._cancelled = true;
+    this.#drawLayer?.destroy();
+    this.#drawLayer = null;
+  }
+  setParent(parent) {
+    this.#drawLayer?.setParent(parent);
+  }
+  getDrawLayer() {
+    return this.#drawLayer;
+  }
+}
+
+;// ./web/pdf_page_detail_view.js
+
+
+
+class PDFPageDetailView extends BasePDFPageView {
+  #detailArea = null;
+  renderingCancelled = false;
+  constructor({
+    pageView
+  }) {
+    super(pageView);
+    this.pageView = pageView;
+    this.renderingId = "detail" + this.id;
+    this.div = pageView.div;
+  }
+  setPdfPage(pdfPage) {
+    this.pageView.setPdfPage(pdfPage);
+  }
+  get pdfPage() {
+    return this.pageView.pdfPage;
+  }
+  get renderingState() {
+    return super.renderingState;
+  }
+  set renderingState(state) {
+    this.renderingCancelled = false;
+    super.renderingState = state;
+  }
+  reset({
+    keepCanvas = false
+  } = {}) {
+    const renderingCancelled = this.renderingCancelled || this.renderingState === RenderingStates.RUNNING || this.renderingState === RenderingStates.PAUSED;
+    this.cancelRendering();
+    this.renderingState = RenderingStates.INITIAL;
+    this.renderingCancelled = renderingCancelled;
+    if (!keepCanvas) {
+      this._resetCanvas();
+    }
+  }
+  #shouldRenderDifferentArea(visibleArea) {
+    if (!this.#detailArea) {
+      return true;
+    }
+    const minDetailX = this.#detailArea.minX;
+    const minDetailY = this.#detailArea.minY;
+    const maxDetailX = this.#detailArea.width + minDetailX;
+    const maxDetailY = this.#detailArea.height + minDetailY;
+    if (visibleArea.minX < minDetailX || visibleArea.minY < minDetailY || visibleArea.maxX > maxDetailX || visibleArea.maxY > maxDetailY) {
+      return true;
+    }
+    const {
+      width: maxWidth,
+      height: maxHeight,
+      scale
+    } = this.pageView.viewport;
+    if (this.#detailArea.scale !== scale) {
+      return true;
+    }
+    const paddingLeftSize = visibleArea.minX - minDetailX;
+    const paddingRightSize = maxDetailX - visibleArea.maxX;
+    const paddingTopSize = visibleArea.minY - minDetailY;
+    const paddingBottomSize = maxDetailY - visibleArea.maxY;
+    const MOVEMENT_THRESHOLD = 0.5;
+    const ratio = (1 + MOVEMENT_THRESHOLD) / MOVEMENT_THRESHOLD;
+    if (minDetailX > 0 && paddingRightSize / paddingLeftSize > ratio || maxDetailX < maxWidth && paddingLeftSize / paddingRightSize > ratio || minDetailY > 0 && paddingBottomSize / paddingTopSize > ratio || maxDetailY < maxHeight && paddingTopSize / paddingBottomSize > ratio) {
+      return true;
+    }
+    return false;
+  }
+  update({
+    visibleArea = null,
+    underlyingViewUpdated = false
+  } = {}) {
+    if (underlyingViewUpdated) {
+      this.cancelRendering();
+      this.renderingState = RenderingStates.INITIAL;
+      return;
+    }
+    if (!this.#shouldRenderDifferentArea(visibleArea)) {
+      return;
+    }
+    const {
+      viewport,
+      maxCanvasPixels,
+      capCanvasAreaFactor
+    } = this.pageView;
+    const visibleWidth = visibleArea.maxX - visibleArea.minX;
+    const visibleHeight = visibleArea.maxY - visibleArea.minY;
+    const visiblePixels = visibleWidth * visibleHeight * OutputScale.pixelRatio ** 2;
+    const maxDetailToVisibleLinearRatio = Math.sqrt(OutputScale.capPixels(maxCanvasPixels, capCanvasAreaFactor) / visiblePixels);
+    const maxOverflowScale = (maxDetailToVisibleLinearRatio - 1) / 2;
+    let overflowScale = Math.min(1, maxOverflowScale);
+    if (overflowScale < 0) {
+      overflowScale = 0;
+    }
+    const overflowWidth = visibleWidth * overflowScale;
+    const overflowHeight = visibleHeight * overflowScale;
+    const minX = Math.max(0, visibleArea.minX - overflowWidth);
+    const maxX = Math.min(viewport.width, visibleArea.maxX + overflowWidth);
+    const minY = Math.max(0, visibleArea.minY - overflowHeight);
+    const maxY = Math.min(viewport.height, visibleArea.maxY + overflowHeight);
+    const width = maxX - minX;
+    const height = maxY - minY;
+    this.#detailArea = {
+      minX,
+      minY,
+      width,
+      height,
+      scale: viewport.scale
+    };
+    this.reset({
+      keepCanvas: true
+    });
+  }
+  _getRenderingContext(canvas, transform) {
+    const baseContext = this.pageView._getRenderingContext(canvas, transform, false);
+    const recordedBBoxes = this.pdfPage.recordedBBoxes;
+    if (!recordedBBoxes || !this.enableOptimizedPartialRendering) {
+      return baseContext;
+    }
+    const {
+      viewport: {
+        width: vWidth,
+        height: vHeight
+      }
+    } = this.pageView;
+    const {
+      width: aWidth,
+      height: aHeight,
+      minX: aMinX,
+      minY: aMinY
+    } = this.#detailArea;
+    const detailMinX = aMinX / vWidth;
+    const detailMinY = aMinY / vHeight;
+    const detailMaxX = (aMinX + aWidth) / vWidth;
+    const detailMaxY = (aMinY + aHeight) / vHeight;
+    return {
+      ...baseContext,
+      operationsFilter(index) {
+        if (recordedBBoxes.isEmpty(index)) {
+          return false;
+        }
+        return recordedBBoxes.minX(index) <= detailMaxX && recordedBBoxes.maxX(index) >= detailMinX && recordedBBoxes.minY(index) <= detailMaxY && recordedBBoxes.maxY(index) >= detailMinY;
+      }
+    };
+  }
+  async draw() {
+    if (this.pageView.detailView !== this) {
+      return undefined;
+    }
+    const hideUntilComplete = this.pageView.renderingState === RenderingStates.FINISHED || this.renderingState === RenderingStates.FINISHED;
+    if (this.renderingState !== RenderingStates.INITIAL) {
+      console.error("Must be in new state before drawing");
+      this.reset();
+    }
+    const {
+      div,
+      pdfPage,
+      viewport
+    } = this.pageView;
+    if (!pdfPage) {
+      this.renderingState = RenderingStates.FINISHED;
+      throw new Error("pdfPage is not loaded");
+    }
+    this.renderingState = RenderingStates.RUNNING;
+    const canvasWrapper = this.pageView._ensureCanvasWrapper();
+    const {
+      canvas,
+      prevCanvas
+    } = this._createCanvas(newCanvas => {
+      if (canvasWrapper.firstElementChild?.tagName === "CANVAS") {
+        canvasWrapper.firstElementChild.after(newCanvas);
+      } else {
+        canvasWrapper.prepend(newCanvas);
+      }
+    }, hideUntilComplete);
+    canvas.ariaHidden = true;
+    if (this.enableOptimizedPartialRendering) {
+      canvas.className = "detailView";
+    }
+    const {
+      width,
+      height
+    } = viewport;
+    const area = this.#detailArea;
+    const {
+      pixelRatio
+    } = OutputScale;
+    const transform = [pixelRatio, 0, 0, pixelRatio, -area.minX * pixelRatio, -area.minY * pixelRatio];
+    canvas.width = area.width * pixelRatio;
+    canvas.height = area.height * pixelRatio;
+    const {
+      style
+    } = canvas;
+    style.width = `${area.width * 100 / width}%`;
+    style.height = `${area.height * 100 / height}%`;
+    style.top = `${area.minY * 100 / height}%`;
+    style.left = `${area.minX * 100 / width}%`;
+    const renderingPromise = this._drawCanvas(this._getRenderingContext(canvas, transform), () => {
+      this.canvas?.remove();
+      this.canvas = prevCanvas;
+    }, () => {
+      this.pageView._refreshAnnotationLayer();
+      this.dispatchPageRendered(false, true);
+    });
+    div.setAttribute("data-loaded", true);
+    this.dispatchPageRender();
+    return renderingPromise;
+  }
+}
+
+;// ./web/struct_tree_layer_builder.js
+
+
+const PDF_ROLE_TO_HTML_ROLE = {
+  Document: null,
+  DocumentFragment: null,
+  Part: "group",
+  Sect: "group",
+  Div: "group",
+  Aside: "note",
+  NonStruct: "none",
+  P: null,
+  H: "heading",
+  Title: null,
+  FENote: "note",
+  Sub: "group",
+  Lbl: null,
+  Span: null,
+  Em: null,
+  Strong: null,
+  Link: "link",
+  Annot: "note",
+  Form: "form",
+  Ruby: null,
+  RB: null,
+  RT: null,
+  RP: null,
+  Warichu: null,
+  WT: null,
+  WP: null,
+  L: "list",
+  LI: "listitem",
+  LBody: null,
+  Table: "table",
+  TR: "row",
+  TH: "columnheader",
+  TD: "cell",
+  THead: "rowgroup",
+  TBody: "rowgroup",
+  TFoot: null,
+  Caption: null,
+  Figure: "figure",
+  Formula: null,
+  Artifact: null
+};
+const MathMLElements = new Set(["math", "merror", "mfrac", "mi", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mprescripts", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msubsup", "msup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "semantics"]);
+const MathMLNamespace = "http://www.w3.org/1998/Math/MathML";
+class MathMLSanitizer {
+  static get sanitizer() {
+    return shadow(this, "sanitizer", FeatureTest.isSanitizerSupported ? new Sanitizer({
+      elements: [...MathMLElements].map(name => ({
+        name,
+        namespace: MathMLNamespace
+      })),
+      replaceWithChildrenElements: [{
+        name: "maction",
+        namespace: MathMLNamespace
+      }],
+      attributes: ["dir", "displaystyle", "mathbackground", "mathcolor", "mathsize", "scriptlevel", "encoding", "display", "linethickness", "intent", "arg", "form", "fence", "separator", "lspace", "rspace", "stretchy", "symmetric", "maxsize", "minsize", "largeop", "movablelimits", "width", "height", "depth", "voffset", "accent", "accentunder", "columnspan", "rowspan"],
+      comments: false
+    }) : null);
+  }
+}
+const HEADING_PATTERN = /^H(\d+)$/;
+class StructTreeLayerBuilder {
+  #promise;
+  #treeDom = null;
+  #treePromise;
+  #elementAttributes = new Map();
+  #rawDims;
+  #elementsToAddToTextLayer = null;
+  #elementsToHideInTextLayer = null;
+  #elementsToStealFromTextLayer = null;
+  constructor(pdfPage, rawDims) {
+    this.#promise = pdfPage.getStructTree();
+    this.#rawDims = rawDims;
+  }
+  async render() {
+    if (this.#treePromise) {
+      return this.#treePromise;
+    }
+    const {
+      promise,
+      resolve,
+      reject
+    } = Promise.withResolvers();
+    this.#treePromise = promise;
+    try {
+      this.#treeDom = this.#walk(await this.#promise);
+    } catch (ex) {
+      reject(ex);
+    }
+    this.#promise = null;
+    this.#treeDom?.classList.add("structTree");
+    resolve(this.#treeDom);
+    return promise;
+  }
+  async getAriaAttributes(annotationId) {
+    try {
+      await this.render();
+      return this.#elementAttributes.get(annotationId);
+    } catch {}
+    return null;
+  }
+  hide() {
+    if (this.#treeDom && !this.#treeDom.hidden) {
+      this.#treeDom.hidden = true;
+    }
+  }
+  show() {
+    if (this.#treeDom?.hidden) {
+      this.#treeDom.hidden = false;
+    }
+  }
+  #setAttributes(structElement, htmlElement) {
+    const {
+      alt,
+      id,
+      lang
+    } = structElement;
+    if (alt !== undefined) {
+      let added = false;
+      const label = removeNullCharacters(alt);
+      for (const child of structElement.children) {
+        if (child.type === "annotation") {
+          this.#elementAttributes.getOrInsertComputed(child.id, makeMap).set("aria-label", label);
+          added = true;
+        }
+      }
+      if (!added) {
+        htmlElement.setAttribute("aria-label", label);
+      }
+    }
+    if (id !== undefined) {
+      htmlElement.setAttribute("aria-owns", id);
+    }
+    if (lang !== undefined) {
+      htmlElement.setAttribute("lang", removeNullCharacters(lang, true));
+    }
+  }
+  #addImageInTextLayer(node, element) {
+    const {
+      alt,
+      bbox,
+      children
+    } = node;
+    const child = children?.[0];
+    if (!this.#rawDims || !alt || !bbox || child?.type !== "content") {
+      return false;
+    }
+    const {
+      id
+    } = child;
+    if (!id) {
+      return false;
+    }
+    element.setAttribute("aria-owns", id);
+    const img = document.createElement("span");
+    (this.#elementsToAddToTextLayer ||= new Map()).set(id, img);
+    img.setAttribute("role", "img");
+    img.setAttribute("aria-label", removeNullCharacters(alt));
+    const {
+      pageHeight,
+      pageX,
+      pageY
+    } = this.#rawDims;
+    const calc = "calc(var(--total-scale-factor) *";
+    const {
+      style
+    } = img;
+    style.width = `${calc}${bbox[2] - bbox[0]}px)`;
+    style.height = `${calc}${bbox[3] - bbox[1]}px)`;
+    style.left = `${calc}${bbox[0] - pageX}px)`;
+    style.top = `${calc}${pageHeight - bbox[3] + pageY}px)`;
+    return true;
+  }
+  updateTextLayer() {
+    if (this.#elementsToAddToTextLayer) {
+      for (const [id, img] of this.#elementsToAddToTextLayer) {
+        document.getElementById(id)?.append(img);
+      }
+      this.#elementsToAddToTextLayer.clear();
+      this.#elementsToAddToTextLayer = null;
+    }
+    if (this.#elementsToHideInTextLayer) {
+      for (const id of this.#elementsToHideInTextLayer) {
+        const elem = document.getElementById(id);
+        if (elem) {
+          elem.ariaHidden = true;
+        }
+      }
+      this.#elementsToHideInTextLayer.length = 0;
+      this.#elementsToHideInTextLayer = null;
+    }
+    if (this.#elementsToStealFromTextLayer) {
+      for (let i = 0, ii = this.#elementsToStealFromTextLayer.length; i < ii; i += 2) {
+        const element = this.#elementsToStealFromTextLayer[i];
+        const ids = this.#elementsToStealFromTextLayer[i + 1];
+        let textContent = "";
+        for (const id of ids) {
+          const elem = document.getElementById(id);
+          if (elem) {
+            textContent += elem.textContent.trim() || "";
+            elem.ariaHidden = "true";
+          }
+        }
+        if (textContent) {
+          element.textContent = textContent;
+        }
+      }
+      this.#elementsToStealFromTextLayer.length = 0;
+      this.#elementsToStealFromTextLayer = null;
+    }
+  }
+  #collectIds(node, ids) {
+    if (!node) {
+      return;
+    }
+    if ("id" in node) {
+      ids.push(node.id);
+    }
+    for (const kid of node.children || []) {
+      this.#collectIds(kid, ids);
+    }
+  }
+  #walk(node, parentNodes = []) {
+    if (!node) {
+      return null;
+    }
+    let element;
+    let visitChildren = true;
+    if ("role" in node) {
+      const {
+        role
+      } = node;
+      if (MathMLElements.has(role)) {
+        element = document.createElementNS(MathMLNamespace, role);
+        const ids = [];
+        (this.#elementsToStealFromTextLayer ||= []).push(element, ids);
+        for (const {
+          type,
+          id
+        } of node.children || []) {
+          if (type === "content" && id) {
+            ids.push(id);
+          }
+        }
+      } else {
+        element = document.createElement("span");
+      }
+      const match = role.match(HEADING_PATTERN);
+      if (match) {
+        element.setAttribute("role", "heading");
+        element.setAttribute("aria-level", match[1]);
+      } else if (PDF_ROLE_TO_HTML_ROLE[role]) {
+        element.setAttribute("role", role === "TH" && parentNodes.at(-1)?.role === "TR" && parentNodes.at(-2)?.role === "TBody" ? "rowheader" : PDF_ROLE_TO_HTML_ROLE[role]);
+      }
+      if (role === "Figure" && this.#addImageInTextLayer(node, element)) {
+        return element;
+      }
+      if (role === "Formula") {
+        if (node.mathML && MathMLSanitizer.sanitizer) {
+          visitChildren = false;
+          element.setHTML(node.mathML, {
+            sanitizer: MathMLSanitizer.sanitizer
+          });
+          this.#collectIds(node, this.#elementsToHideInTextLayer ||= []);
+          delete node.alt;
+        }
+        if (!node.mathML && node.children.length === 1 && node.children[0].role !== "math") {
+          element = document.createElementNS(MathMLNamespace, "math");
+          delete node.alt;
+        }
+      }
+    }
+    element ||= document.createElement("span");
+    this.#setAttributes(node, element);
+    if (node.children) {
+      if (node.children.length === 1 && "id" in node.children[0]) {
+        this.#setAttributes(node.children[0], element);
+      } else if (visitChildren) {
+        parentNodes.push(node);
+        for (const kid of node.children) {
+          element.append(this.#walk(kid, parentNodes));
+        }
+        parentNodes.pop();
+      }
+    }
+    return element;
+  }
+}
+
+;// ./web/text_accessibility.js
+
+class TextAccessibilityManager {
+  #enabled = false;
+  #textChildren = null;
+  #textNodes = new Map();
+  #waitingElements = new Map();
+  setTextMapping(textDivs) {
+    this.#textChildren = textDivs;
+  }
+  static #compareElementPositions(e1, e2) {
+    const rect1 = e1.getBoundingClientRect();
+    const rect2 = e2.getBoundingClientRect();
+    if (rect1.width === 0 && rect1.height === 0) {
+      return +1;
+    }
+    if (rect2.width === 0 && rect2.height === 0) {
+      return -1;
+    }
+    const top1 = rect1.y;
+    const bot1 = rect1.y + rect1.height;
+    const mid1 = rect1.y + rect1.height / 2;
+    const top2 = rect2.y;
+    const bot2 = rect2.y + rect2.height;
+    const mid2 = rect2.y + rect2.height / 2;
+    if (mid1 <= top2 && mid2 >= bot1) {
+      return -1;
+    }
+    if (mid2 <= top1 && mid1 >= bot2) {
+      return +1;
+    }
+    const centerX1 = rect1.x + rect1.width / 2;
+    const centerX2 = rect2.x + rect2.width / 2;
+    return centerX1 - centerX2;
+  }
+  enable() {
+    if (this.#enabled) {
+      throw new Error("TextAccessibilityManager is already enabled.");
+    }
+    if (!this.#textChildren) {
+      throw new Error("Text divs and strings have not been set.");
+    }
+    this.#enabled = true;
+    this.#textChildren = this.#textChildren.slice();
+    this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions);
+    if (this.#textNodes.size > 0) {
+      const textChildren = this.#textChildren;
+      for (const [id, nodeIndex] of this.#textNodes) {
+        const element = document.getElementById(id);
+        if (!element) {
+          this.#textNodes.delete(id);
+          continue;
+        }
+        this.#addIdToAriaOwns(id, textChildren[nodeIndex]);
+      }
+    }
+    for (const [element, isRemovable] of this.#waitingElements) {
+      this.addPointerInTextLayer(element, isRemovable);
+    }
+    this.#waitingElements.clear();
+  }
+  disable() {
+    if (!this.#enabled) {
+      return;
+    }
+    this.#waitingElements.clear();
+    this.#textChildren = null;
+    this.#enabled = false;
+  }
+  removePointerInTextLayer(element) {
+    if (!this.#enabled) {
+      this.#waitingElements.delete(element);
+      return;
+    }
+    const children = this.#textChildren;
+    if (!children?.length) {
+      return;
+    }
+    const {
+      id
+    } = element;
+    const nodeIndex = this.#textNodes.get(id);
+    if (nodeIndex === undefined) {
+      return;
+    }
+    const node = children[nodeIndex];
+    this.#textNodes.delete(id);
+    let owns = node.getAttribute("aria-owns");
+    if (owns?.includes(id)) {
+      owns = owns.split(" ").filter(x => x !== id).join(" ");
+      if (owns) {
+        node.setAttribute("aria-owns", owns);
+      } else {
+        node.removeAttribute("aria-owns");
+        node.setAttribute("role", "presentation");
+      }
+    }
+  }
+  #addIdToAriaOwns(id, node) {
+    const owns = node.getAttribute("aria-owns");
+    if (!owns?.includes(id)) {
+      node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id);
+    }
+    node.removeAttribute("role");
+  }
+  addPointerInTextLayer(element, isRemovable) {
+    const {
+      id
+    } = element;
+    if (!id) {
+      return null;
+    }
+    if (!this.#enabled) {
+      this.#waitingElements.set(element, isRemovable);
+      return null;
+    }
+    if (isRemovable) {
+      this.removePointerInTextLayer(element);
+    }
+    const children = this.#textChildren;
+    if (!children?.length) {
+      return null;
+    }
+    const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0);
+    const nodeIndex = Math.max(0, index - 1);
+    const child = children[nodeIndex];
+    this.#addIdToAriaOwns(id, child);
+    this.#textNodes.set(id, nodeIndex);
+    const parent = child.parentNode;
+    return parent?.classList.contains("markedContent") ? parent.id : null;
+  }
+  moveElementInDOM(container, element, contentElement, isRemovable) {
+    const id = this.addPointerInTextLayer(contentElement, isRemovable);
+    if (!container.hasChildNodes()) {
+      container.append(element);
+      return id;
+    }
+    const children = Array.from(container.childNodes).filter(node => node !== element);
+    if (children.length === 0) {
+      return id;
+    }
+    const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0);
+    if (index === 0) {
+      children[0].before(element);
+    } else {
+      children[index - 1].after(element);
+    }
+    return id;
+  }
+}
+
+;// ./web/text_highlighter.js
+
+class TextHighlighter {
+  #eventAC = null;
+  constructor({
+    findController,
+    eventBus,
+    pageIndex
+  }) {
+    this.findController = findController;
+    this.matches = [];
+    this.eventBus = eventBus;
+    this.pageIdx = pageIndex;
+    this.textDivs = null;
+    this.textContentItemsStr = null;
+    this.enabled = false;
+  }
+  setTextMapping(divs, texts) {
+    this.textDivs = divs;
+    this.textContentItemsStr = texts;
+  }
+  enable() {
+    if (!this.textDivs || !this.textContentItemsStr) {
+      throw new Error("Text divs and strings have not been set.");
+    }
+    if (this.enabled) {
+      throw new Error("TextHighlighter is already enabled.");
+    }
+    this.enabled = true;
+    if (!this.#eventAC) {
+      this.#eventAC = new AbortController();
+      this.eventBus.on("updatetextlayermatches", evt => {
+        if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) {
+          this._updateMatches();
+        }
+      }, {
+        signal: this.#eventAC.signal,
+        ...internalOpt
+      });
+    }
+    this._updateMatches();
+  }
+  disable() {
+    if (!this.enabled) {
+      return;
+    }
+    this.enabled = false;
+    this.#eventAC?.abort();
+    this.#eventAC = null;
+    this._updateMatches(true);
+  }
+  _convertMatches(matches, matchesLength) {
+    if (!matches) {
+      return [];
+    }
+    const {
+      textContentItemsStr
+    } = this;
+    let i = 0,
+      iIndex = 0;
+    const end = textContentItemsStr.length - 1;
+    const result = [];
+    for (let m = 0, mm = matches.length; m < mm; m++) {
+      let matchIdx = matches[m];
+      while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {
+        iIndex += textContentItemsStr[i].length;
+        i++;
+      }
+      if (i === textContentItemsStr.length) {
+        console.error("Could not find a matching mapping");
+      }
+      const match = {
+        begin: {
+          divIdx: i,
+          offset: matchIdx - iIndex
+        }
+      };
+      matchIdx += matchesLength[m];
+      while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {
+        iIndex += textContentItemsStr[i].length;
+        i++;
+      }
+      match.end = {
+        divIdx: i,
+        offset: matchIdx - iIndex
+      };
+      result.push(match);
+    }
+    return result;
+  }
+  _renderMatches(matches) {
+    if (matches.length === 0) {
+      return;
+    }
+    const {
+      findController,
+      pageIdx
+    } = this;
+    const {
+      textContentItemsStr,
+      textDivs
+    } = this;
+    const isSelectedPage = pageIdx === findController.selected.pageIdx;
+    const selectedMatchIdx = findController.selected.matchIdx;
+    const highlightAll = findController.state.highlightAll;
+    let prevEnd = null;
+    const infinity = {
+      divIdx: -1,
+      offset: undefined
+    };
+    function beginText(begin, className) {
+      const divIdx = begin.divIdx;
+      textDivs[divIdx].textContent = "";
+      return appendTextToDiv(divIdx, 0, begin.offset, className);
+    }
+    function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
+      let div = textDivs[divIdx];
+      if (div.nodeType === Node.TEXT_NODE) {
+        const span = document.createElement("span");
+        div.before(span);
+        span.append(div);
+        textDivs[divIdx] = span;
+        div = span;
+      }
+      const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);
+      const node = document.createTextNode(content);
+      if (className) {
+        const span = document.createElement("span");
+        span.className = `${className} appended`;
+        span.append(node);
+        div.append(span);
+        if (className.includes("selected")) {
+          return span;
+        }
+        return null;
+      }
+      div.append(node);
+      return 0;
+    }
+    let i0 = selectedMatchIdx,
+      i1 = i0 + 1;
+    if (highlightAll) {
+      i0 = 0;
+      i1 = matches.length;
+    } else if (!isSelectedPage) {
+      return;
+    }
+    let lastDivIdx = -1;
+    let lastOffset = -1;
+    for (let i = i0; i < i1; i++) {
+      const match = matches[i];
+      const begin = match.begin;
+      if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) {
+        continue;
+      }
+      lastDivIdx = begin.divIdx;
+      lastOffset = begin.offset;
+      const end = match.end;
+      const isSelected = isSelectedPage && i === selectedMatchIdx;
+      const highlightSuffix = isSelected ? " selected" : "";
+      let selectedSpan = null;
+      if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
+        if (prevEnd !== null) {
+          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
+        }
+        beginText(begin);
+      } else {
+        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);
+      }
+      if (begin.divIdx === end.divIdx) {
+        selectedSpan = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix);
+      } else {
+        selectedSpan = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix);
+        for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {
+          textDivs[n0].className = "highlight middle" + highlightSuffix;
+        }
+        beginText(end, "highlight end" + highlightSuffix);
+      }
+      prevEnd = end;
+      if (isSelected) {
+        findController.scrollMatchIntoView({
+          element: selectedSpan,
+          pageIndex: pageIdx,
+          matchIndex: selectedMatchIdx
+        });
+      }
+    }
+    if (prevEnd) {
+      appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
+    }
+  }
+  _updateMatches(reset = false) {
+    if (!this.enabled && !reset) {
+      return;
+    }
+    const {
+      findController,
+      matches,
+      pageIdx
+    } = this;
+    const {
+      textContentItemsStr,
+      textDivs
+    } = this;
+    let clearedUntilDivIdx = -1;
+    for (const match of matches) {
+      const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);
+      for (let n = begin, end = match.end.divIdx; n <= end; n++) {
+        const div = textDivs[n];
+        div.textContent = textContentItemsStr[n];
+        div.className = "";
+      }
+      clearedUntilDivIdx = match.end.divIdx + 1;
+    }
+    if (!findController?.highlightMatches || reset) {
+      return;
+    }
+    const pageMatches = findController.pageMatches[pageIdx] || null;
+    const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;
+    this.matches = this._convertMatches(pageMatches, pageMatchesLength);
+    this._renderMatches(this.matches);
+  }
+}
+
+;// ./web/text_layer_builder.js
+
+
+class TextLayerBuilder {
+  #abortSignal = null;
+  #enablePermissions = false;
+  #onAppend = null;
+  #renderingDone = false;
+  #textLayer = null;
+  static #textLayers = new Map();
+  static #selectionChangeAC = null;
+  constructor({
+    pdfPage,
+    highlighter = null,
+    accessibilityManager = null,
+    enablePermissions = false,
+    onAppend = null,
+    abortSignal = null
+  }) {
+    this.pdfPage = pdfPage;
+    this.highlighter = highlighter;
+    this.accessibilityManager = accessibilityManager;
+    this.#enablePermissions = enablePermissions === true;
+    this.#onAppend = onAppend;
+    this.#abortSignal = abortSignal;
+    this.div = document.createElement("div");
+    this.div.tabIndex = 0;
+    this.div.className = "textLayer";
+  }
+  async render({
+    viewport,
+    images,
+    textContentParams = null
+  }) {
+    if (this.#renderingDone && this.#textLayer) {
+      this.#textLayer.update({
+        viewport,
+        onBefore: this.hide.bind(this)
+      });
+      this.show();
+      return;
+    }
+    this.cancel();
+    this.#textLayer = new TextLayer({
+      textContentSource: this.pdfPage.streamTextContent(textContentParams || {
+        includeMarkedContent: true,
+        disableNormalization: true
+      }),
+      images,
+      container: this.div,
+      viewport
+    });
+    const {
+      textDivs,
+      textContentItemsStr
+    } = this.#textLayer;
+    this.highlighter?.setTextMapping(textDivs, textContentItemsStr);
+    this.accessibilityManager?.setTextMapping(textDivs);
+    await this.#textLayer.render();
+    this.#renderingDone = true;
+    const endOfContent = document.createElement("div");
+    endOfContent.className = "endOfContent";
+    this.div.append(endOfContent);
+    this.#bindMouse(endOfContent);
+    this.#onAppend?.(this.div);
+    this.highlighter?.enable();
+    this.accessibilityManager?.enable();
+  }
+  hide() {
+    if (!this.div.hidden && this.#renderingDone) {
+      this.highlighter?.disable();
+      this.div.hidden = true;
+    }
+  }
+  show() {
+    if (this.div.hidden && this.#renderingDone) {
+      this.div.hidden = false;
+      this.highlighter?.enable();
+    }
+  }
+  cancel() {
+    this.#textLayer?.cancel();
+    this.#textLayer = null;
+    this.#renderingDone = false;
+    this.div.replaceChildren();
+    this.highlighter?.disable();
+    this.accessibilityManager?.disable();
+    TextLayerBuilder.#removeGlobalSelectionListener(this.div);
+  }
+  #bindMouse(end) {
+    const {
+      div
+    } = this;
+    const abortSignal = this.#abortSignal;
+    const opts = abortSignal ? {
+      signal: abortSignal
+    } : null;
+    div.addEventListener("mousedown", () => {
+      div.classList.add("selecting");
+    }, opts);
+    div.addEventListener("copy", event => {
+      if (!this.#enablePermissions) {
+        const selection = document.getSelection();
+        event.clipboardData.setData("text/plain", removeNullCharacters(normalizeUnicode(selection.toString())));
+      }
+      stopEvent(event);
+    }, opts);
+    TextLayerBuilder.#textLayers.set(div, end);
+    TextLayerBuilder.#enableGlobalSelectionListener(abortSignal);
+  }
+  static #removeGlobalSelectionListener(textLayerDiv) {
+    this.#textLayers.delete(textLayerDiv);
+    if (this.#textLayers.size === 0) {
+      this.#selectionChangeAC?.abort();
+      this.#selectionChangeAC = null;
+    }
+  }
+  static #enableGlobalSelectionListener(globalAbortSignal) {
+    if (this.#selectionChangeAC) {
+      return;
+    }
+    this.#selectionChangeAC = new AbortController();
+    const signal = globalAbortSignal ? AbortSignal.any([this.#selectionChangeAC.signal, globalAbortSignal]) : this.#selectionChangeAC.signal;
+    const reset = (end, textLayer) => {
+      textLayer.append(end);
+      end.style.width = "";
+      end.style.height = "";
+      textLayer.classList.remove("selecting");
+    };
+    let isPointerDown = false;
+    document.addEventListener("pointerdown", () => {
+      isPointerDown = true;
+    }, {
+      signal
+    });
+    document.addEventListener("pointerup", () => {
+      isPointerDown = false;
+      this.#textLayers.forEach(reset);
+    }, {
+      signal
+    });
+    window.addEventListener("blur", () => {
+      isPointerDown = false;
+      this.#textLayers.forEach(reset);
+    }, {
+      signal
+    });
+    document.addEventListener("keyup", () => {
+      if (!isPointerDown) {
+        this.#textLayers.forEach(reset);
+      }
+    }, {
+      signal
+    });
+    var isFirefox, prevRange;
+    document.addEventListener("selectionchange", () => {
+      const selection = document.getSelection();
+      if (selection.rangeCount === 0) {
+        this.#textLayers.forEach(reset);
+        return;
+      }
+      const activeTextLayers = new Set();
+      for (let i = 0; i < selection.rangeCount; i++) {
+        const range = selection.getRangeAt(i);
+        for (const textLayerDiv of this.#textLayers.keys()) {
+          if (!activeTextLayers.has(textLayerDiv) && range.intersectsNode(textLayerDiv)) {
+            activeTextLayers.add(textLayerDiv);
+          }
+        }
+      }
+      for (const [textLayerDiv, endDiv] of this.#textLayers) {
+        if (activeTextLayers.has(textLayerDiv)) {
+          textLayerDiv.classList.add("selecting");
+        } else {
+          reset(endDiv, textLayerDiv);
+        }
+      }
+      isFirefox ??= getComputedStyle(this.#textLayers.values().next().value).getPropertyValue("-moz-user-select") === "none";
+      if (isFirefox) {
+        return;
+      }
+      const range = selection.getRangeAt(0);
+      const modifyStart = prevRange && (range.compareBoundaryPoints(Range.END_TO_END, prevRange) === 0 || range.compareBoundaryPoints(Range.START_TO_END, prevRange) === 0);
+      let anchor = modifyStart ? range.startContainer : range.endContainer;
+      if (anchor.nodeType === Node.TEXT_NODE) {
+        anchor = anchor.parentNode;
+      }
+      if (anchor.classList?.contains("highlight")) {
+        anchor = anchor.parentNode;
+      }
+      if (!modifyStart && range.endOffset === 0) {
+        do {
+          while (!anchor.previousSibling) {
+            anchor = anchor.parentNode;
+          }
+          anchor = anchor.previousSibling;
+        } while (!anchor.childNodes.length);
+      }
+      const parentTextLayer = anchor.parentElement?.closest(".textLayer");
+      const endDiv = this.#textLayers.get(parentTextLayer);
+      if (endDiv) {
+        endDiv.style.width = parentTextLayer.style.width;
+        endDiv.style.height = parentTextLayer.style.height;
+        endDiv.style.userSelect = "text";
+        anchor.parentElement.insertBefore(endDiv, modifyStart ? anchor : anchor.nextSibling);
+      }
+      prevRange = range.cloneRange();
+    }, {
+      signal
+    });
+  }
+}
+
+;// ./web/pdf_page_view.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const DEFAULT_LAYER_PROPERTIES = null;
+const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]);
+class PDFPageView extends BasePDFPageView {
+  #abortSignal = null;
+  #annotationMode = AnnotationMode.ENABLE_FORMS;
+  #canvasWrapper = null;
+  #commentManager = null;
+  #enableAutoLinking = true;
+  #hasRestrictedScaling = false;
+  #isEditing = false;
+  #layerProperties = null;
+  #needsRestrictedScaling = false;
+  #originalViewport = null;
+  #previousRotation = null;
+  #scaleRoundX = 1;
+  #scaleRoundY = 1;
+  #textLayerMode = TextLayerMode.ENABLE;
+  #userUnit = 1;
+  #useThumbnailCanvas = {
+    directDrawing: true,
+    initialOptionalContent: true,
+    regularAnnotations: true
+  };
+  #layers = [null, null, null, null];
+  constructor(options) {
+    super(options);
+    const {
+      container,
+      defaultViewport
+    } = options;
+    this.renderingId = "page" + this.id;
+    this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES;
+    this.#abortSignal = options.abortSignal || null;
+    this.pdfPage = null;
+    this.pageLabel = null;
+    this.rotation = 0;
+    this.scale = options.scale || DEFAULT_SCALE;
+    this.viewport = defaultViewport;
+    this.pdfPageRotate = defaultViewport.rotation;
+    this._optionalContentConfigPromise = options.optionalContentConfigPromise || null;
+    this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE;
+    this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS;
+    this.imageResourcesPath = options.imageResourcesPath || "";
+    this.enableDetailCanvas = options.enableDetailCanvas ?? true;
+    this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels");
+    this.maxCanvasDim = options.maxCanvasDim || AppOptions.get("maxCanvasDim");
+    this.capCanvasAreaFactor = options.capCanvasAreaFactor ?? AppOptions.get("capCanvasAreaFactor");
+    this.#enableAutoLinking = options.enableAutoLinking !== false;
+    this.#commentManager = options.commentManager || null;
+    this.l10n = options.l10n;
+    this.l10n ||= new genericl10n_GenericL10n();
+    this._isStandalone = !this.renderingQueue?.hasViewer();
+    this._container = container;
+    this._annotationCanvasMap = null;
+    this.annotationLayer = null;
+    this.annotationEditorLayer = null;
+    this.textLayer = null;
+    this.xfaLayer = null;
+    this.structTreeLayer = null;
+    this.drawLayer = null;
+    this.detailView = null;
+    const div = document.createElement("div");
+    div.className = "page";
+    div.setAttribute("data-page-number", this.id);
+    div.setAttribute("role", "region");
+    div.setAttribute("data-l10n-id", "pdfjs-page-landmark");
+    div.setAttribute("data-l10n-args", JSON.stringify({
+      page: this.id
+    }));
+    this.div = div;
+    this.#setDimensions();
+    container?.append(div);
+    if (this._isStandalone) {
+      container?.style.setProperty("--scale-factor", this.scale * PixelsPerInch.PDF_TO_CSS_UNITS);
+      if (this.pageColors?.background) {
+        container?.style.setProperty("--page-bg-color", this.pageColors.background);
+      }
+      const {
+        optionalContentConfigPromise
+      } = options;
+      if (optionalContentConfigPromise) {
+        optionalContentConfigPromise.then(optionalContentConfig => {
+          if (optionalContentConfigPromise !== this._optionalContentConfigPromise) {
+            return;
+          }
+          this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility;
+        });
+      }
+      if (!options.l10n) {
+        this.l10n.translate(this.div);
+      }
+    }
+  }
+  clone(id) {
+    const clone = new PDFPageView({
+      container: null,
+      eventBus: this.eventBus,
+      pagesColors: this.pageColors,
+      renderingQueue: this.renderingQueue,
+      enableOptimizedPartialRendering: this.enableOptimizedPartialRendering,
+      minDurationToUpdateCanvas: this.minDurationToUpdateCanvas,
+      defaultViewport: this.viewport,
+      id,
+      layerProperties: this.#layerProperties,
+      abortSignal: this.#abortSignal,
+      scale: this.scale,
+      optionalContentConfigPromise: this._optionalContentConfigPromise,
+      textLayerMode: this.#textLayerMode,
+      annotationMode: this.#annotationMode,
+      imageResourcesPath: this.imageResourcesPath,
+      enableDetailCanvas: this.enableDetailCanvas,
+      maxCanvasPixels: this.maxCanvasPixels,
+      maxCanvasDim: this.maxCanvasDim,
+      capCanvasAreaFactor: this.capCanvasAreaFactor,
+      enableAutoLinking: this.#enableAutoLinking,
+      commentManager: this.#commentManager,
+      l10n: this.l10n
+    });
+    clone.setPdfPage(this.pdfPage.clone(id - 1));
+    return clone;
+  }
+  #addLayer(div, name) {
+    const pos = LAYERS_ORDER.get(name);
+    const oldDiv = this.#layers[pos];
+    this.#layers[pos] = div;
+    if (oldDiv) {
+      oldDiv.replaceWith(div);
+      return;
+    }
+    for (let i = pos - 1; i >= 0; i--) {
+      const layer = this.#layers[i];
+      if (layer) {
+        layer.after(div);
+        return;
+      }
+    }
+    this.div.prepend(div);
+  }
+  #setDimensions() {
+    const {
+      div,
+      viewport
+    } = this;
+    if (viewport.userUnit !== this.#userUnit) {
+      if (viewport.userUnit !== 1) {
+        div.style.setProperty("--user-unit", viewport.userUnit);
+      } else {
+        div.style.removeProperty("--user-unit");
+      }
+      this.#userUnit = viewport.userUnit;
+    }
+    if (this.pdfPage) {
+      if (this.#previousRotation === viewport.rotation) {
+        return;
+      }
+      this.#previousRotation = viewport.rotation;
+    }
+    setLayerDimensions(div, viewport, true, false);
+  }
+  updatePageNumber(newPageNumber) {
+    const oldPageNumber = this.id;
+    if (oldPageNumber !== newPageNumber) {
+      this.id = newPageNumber;
+      this.renderingId = `page${newPageNumber}`;
+      if (this.pdfPage) {
+        this.pdfPage.pageNumber = newPageNumber;
+      }
+      this.setPageLabel(this.pageLabel);
+      const {
+        div
+      } = this;
+      div.setAttribute("data-page-number", newPageNumber);
+      div.setAttribute("data-l10n-args", JSON.stringify({
+        page: newPageNumber
+      }));
+      this._textHighlighter.pageIdx = newPageNumber - 1;
+    }
+    this.#layerProperties.annotationEditorUIManager?.updatePageIndex(oldPageNumber - 1, newPageNumber - 1);
+  }
+  setPdfPage(pdfPage) {
+    if (this._isStandalone && (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas")) {
+      this._container?.style.setProperty("--hcm-highlight-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight"));
+      this._container?.style.setProperty("--hcm-highlight-selected-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "Highlight"));
+    }
+    this.pdfPage = pdfPage;
+    this.pdfPageRotate = pdfPage.rotate;
+    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+    this.viewport = pdfPage.getViewport({
+      scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS,
+      rotation: totalRotation
+    });
+    this.#setDimensions();
+    this.reset();
+  }
+  destroy() {
+    this.reset();
+    this.pdfPage?.cleanup();
+  }
+  deleteMe(isCut) {
+    if (isCut) {
+      this.div.remove();
+      return;
+    }
+    this.destroy();
+    this.#layerProperties.annotationEditorUIManager?.deletePage(this.id);
+  }
+  hasEditableAnnotations() {
+    return !!this.annotationLayer?.hasEditableAnnotations();
+  }
+  get _textHighlighter() {
+    return shadow(this, "_textHighlighter", new TextHighlighter({
+      pageIndex: this.id - 1,
+      eventBus: this.eventBus,
+      findController: this.#layerProperties.findController
+    }));
+  }
+  #dispatchLayerRendered(name, error) {
+    this.eventBus.dispatch(name, {
+      source: this,
+      pageNumber: this.id,
+      error
+    });
+  }
+  async #renderAnnotationLayer(textLayerPromise = null) {
+    const {
+      annotationLayer,
+      textLayer
+    } = this;
+    let error = null;
+    try {
+      await this.annotationLayer.render({
+        viewport: this.viewport,
+        intent: "display",
+        structTreeLayer: this.structTreeLayer,
+        optionalContentConfigPromise: this._optionalContentConfigPromise
+      });
+    } catch (ex) {
+      console.error("#renderAnnotationLayer:", ex);
+      error = ex;
+    } finally {
+      this.#dispatchLayerRendered("annotationlayerrendered", error);
+    }
+    if (this.#enableAutoLinking && textLayerPromise) {
+      this.#injectLinkAnnotations(textLayerPromise, annotationLayer, textLayer);
+    }
+  }
+  _refreshAnnotationLayer() {
+    if (this._annotationCanvasMap?.size) {
+      this.annotationLayer?.refreshCanvases();
+    }
+  }
+  async #renderAnnotationEditorLayer() {
+    let error = null;
+    try {
+      await this.annotationEditorLayer.render({
+        viewport: this.viewport,
+        intent: "display"
+      });
+    } catch (ex) {
+      console.error("#renderAnnotationEditorLayer:", ex);
+      error = ex;
+    } finally {
+      this.#dispatchLayerRendered("annotationeditorlayerrendered", error);
+    }
+  }
+  async #renderDrawLayer() {
+    try {
+      await this.drawLayer.render({
+        intent: "display"
+      });
+    } catch (ex) {
+      console.error("#renderDrawLayer:", ex);
+    }
+  }
+  async #renderXfaLayer() {
+    let error = null;
+    try {
+      const result = await this.xfaLayer.render({
+        viewport: this.viewport,
+        intent: "display"
+      });
+      if (result?.textDivs && this._textHighlighter) {
+        this.#buildXfaTextContentItems(result.textDivs);
+      }
+    } catch (ex) {
+      console.error("#renderXfaLayer:", ex);
+      error = ex;
+    } finally {
+      if (this.xfaLayer?.div) {
+        this.l10n.pause();
+        this.#addLayer(this.xfaLayer.div, "xfaLayer");
+        this.l10n.resume();
+      }
+      this.#dispatchLayerRendered("xfalayerrendered", error);
+    }
+  }
+  async #renderTextLayer() {
+    let error = null;
+    try {
+      await this.textLayer.render({
+        viewport: this.viewport,
+        images: this.imageCoordinates ? new TextLayerImages(this.imagesRightClickMinSize, this.imageCoordinates, this.viewport, () => this.canvas) : null
+      });
+    } catch (ex) {
+      if (ex instanceof AbortException) {
+        return;
+      }
+      console.error("#renderTextLayer:", ex);
+      error = ex;
+    }
+    this.#dispatchLayerRendered("textlayerrendered", error);
+    this.#renderStructTreeLayer();
+  }
+  async #renderStructTreeLayer() {
+    const treeDom = await this.structTreeLayer?.render();
+    if (treeDom) {
+      this.l10n.pause();
+      this.structTreeLayer?.updateTextLayer();
+      if (this.canvas && treeDom.parentNode !== this.canvas) {
+        this.canvas.append(treeDom);
+      }
+      this.l10n.resume();
+    }
+    this.structTreeLayer?.show();
+  }
+  async #buildXfaTextContentItems(textDivs) {
+    const text = await this.pdfPage.getTextContent();
+    const items = [];
+    for (const item of text.items) {
+      items.push(item.str);
+    }
+    this._textHighlighter.setTextMapping(textDivs, items);
+    this._textHighlighter.enable();
+  }
+  async #injectLinkAnnotations(textLayerPromise, annotationLayer, textLayer) {
+    let error = null;
+    try {
+      await textLayerPromise;
+      if (annotationLayer !== this.annotationLayer || textLayer !== this.textLayer) {
+        return;
+      }
+      await annotationLayer.injectLinkAnnotations(Autolinker.processLinks(this));
+    } catch (ex) {
+      console.error("#injectLinkAnnotations:", ex);
+      error = ex;
+    }
+    this.#dispatchLayerRendered("linkannotationsadded", error);
+  }
+  _resetCanvas() {
+    super._resetCanvas();
+    this.#originalViewport = null;
+  }
+  reset({
+    keepAnnotationLayer = false,
+    keepAnnotationEditorLayer = false,
+    keepXfaLayer = false,
+    keepTextLayer = false,
+    keepCanvasWrapper = false,
+    preserveDetailViewState = false
+  } = {}) {
+    const keepPdfBugGroups = this.pdfPage?._pdfBug ?? false;
+    this.cancelRendering({
+      keepAnnotationLayer,
+      keepAnnotationEditorLayer,
+      keepXfaLayer,
+      keepTextLayer
+    });
+    this.renderingState = RenderingStates.INITIAL;
+    const div = this.div;
+    const childNodes = div.childNodes,
+      annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null,
+      annotationEditorLayerNode = keepAnnotationEditorLayer && this.annotationEditorLayer?.div || null,
+      xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null,
+      textLayerNode = keepTextLayer && this.textLayer?.div || null,
+      canvasWrapperNode = keepCanvasWrapper && this.#canvasWrapper || null;
+    for (let i = childNodes.length - 1; i >= 0; i--) {
+      const node = childNodes[i];
+      switch (node) {
+        case annotationLayerNode:
+        case annotationEditorLayerNode:
+        case xfaLayerNode:
+        case textLayerNode:
+        case canvasWrapperNode:
+          continue;
+      }
+      if (keepPdfBugGroups && node.classList.contains("pdfBugGroupsLayer")) {
+        continue;
+      }
+      node.remove();
+      const layerIndex = this.#layers.indexOf(node);
+      if (layerIndex >= 0) {
+        this.#layers[layerIndex] = null;
+      }
+    }
+    div.removeAttribute("data-loaded");
+    if (annotationLayerNode) {
+      this.annotationLayer.hide();
+    }
+    if (annotationEditorLayerNode) {
+      this.annotationEditorLayer.hide();
+    }
+    if (xfaLayerNode) {
+      this.xfaLayer.hide();
+    }
+    if (textLayerNode) {
+      this.textLayer.hide();
+    }
+    this.structTreeLayer?.hide();
+    if (!keepCanvasWrapper && this.#canvasWrapper) {
+      this.#canvasWrapper = null;
+      this._resetCanvas();
+    }
+    if (!preserveDetailViewState) {
+      this.detailView?.reset({
+        keepCanvas: keepCanvasWrapper
+      });
+      if (!keepCanvasWrapper) {
+        this.detailView = null;
+      }
+    }
+  }
+  toggleEditingMode(isEditing) {
+    this.#isEditing = isEditing;
+    if (!this.hasEditableAnnotations()) {
+      return;
+    }
+    this.reset({
+      keepAnnotationLayer: true,
+      keepAnnotationEditorLayer: true,
+      keepXfaLayer: true,
+      keepTextLayer: true,
+      keepCanvasWrapper: true
+    });
+  }
+  updateVisibleArea(visibleArea) {
+    if (this.enableDetailCanvas) {
+      if (this.#needsRestrictedScaling && this.maxCanvasPixels > 0 && visibleArea) {
+        this.detailView ??= new PDFPageDetailView({
+          pageView: this,
+          enableOptimizedPartialRendering: this.enableOptimizedPartialRendering,
+          imagesRightClickMinSize: -1
+        });
+        this.detailView.update({
+          visibleArea
+        });
+      } else if (this.detailView) {
+        this.detailView.reset();
+        this.detailView = null;
+      }
+    }
+  }
+  update({
+    scale = 0,
+    rotation = null,
+    optionalContentConfigPromise = null,
+    drawingDelay = -1
+  }) {
+    this.scale = scale || this.scale;
+    if (typeof rotation === "number") {
+      this.rotation = rotation;
+    }
+    if (optionalContentConfigPromise instanceof Promise) {
+      this._optionalContentConfigPromise = optionalContentConfigPromise;
+      optionalContentConfigPromise.then(optionalContentConfig => {
+        if (optionalContentConfigPromise !== this._optionalContentConfigPromise) {
+          return;
+        }
+        this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility;
+      });
+    }
+    this.#useThumbnailCanvas.directDrawing = true;
+    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+    this.viewport = this.viewport.clone({
+      scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS,
+      rotation: totalRotation
+    });
+    this.#setDimensions();
+    if (this._isStandalone) {
+      this._container?.style.setProperty("--scale-factor", this.viewport.scale);
+    }
+    this.#computeScale();
+    if (this.canvas) {
+      const onlyCssZoom = this.#hasRestrictedScaling && this.#needsRestrictedScaling;
+      const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000;
+      if (postponeDrawing || onlyCssZoom) {
+        if (postponeDrawing && !onlyCssZoom && this.renderingState !== RenderingStates.FINISHED) {
+          this.cancelRendering({
+            keepAnnotationLayer: true,
+            keepAnnotationEditorLayer: true,
+            keepXfaLayer: true,
+            keepTextLayer: true,
+            cancelExtraDelay: drawingDelay
+          });
+          this.renderingState = RenderingStates.FINISHED;
+          this.#useThumbnailCanvas.directDrawing = false;
+        }
+        this.cssTransform({
+          redrawAnnotationLayer: true,
+          redrawAnnotationEditorLayer: true,
+          redrawXfaLayer: true,
+          redrawTextLayer: !postponeDrawing,
+          hideTextLayer: postponeDrawing
+        });
+        if (!postponeDrawing) {
+          this.detailView?.update({
+            underlyingViewUpdated: true
+          });
+          this.dispatchPageRendered(true, false);
+        }
+        return;
+      }
+    }
+    this.cssTransform({});
+    this.reset({
+      keepAnnotationLayer: true,
+      keepAnnotationEditorLayer: true,
+      keepXfaLayer: true,
+      keepTextLayer: true,
+      keepCanvasWrapper: true,
+      preserveDetailViewState: true
+    });
+    this.detailView?.update({
+      underlyingViewUpdated: true
+    });
+  }
+  #computeScale() {
+    const {
+      width,
+      height
+    } = this.viewport;
+    const outputScale = this.outputScale = new OutputScale();
+    if (this.maxCanvasPixels === 0) {
+      const invScale = 1 / this.scale;
+      outputScale.sx *= invScale;
+      outputScale.sy *= invScale;
+      this.#needsRestrictedScaling = true;
+    } else {
+      this.#needsRestrictedScaling = outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim, this.capCanvasAreaFactor);
+      if (this.#needsRestrictedScaling && this.enableDetailCanvas) {
+        const factor = this.enableOptimizedPartialRendering ? 4 : 2;
+        outputScale.sx /= factor;
+        outputScale.sy /= factor;
+      }
+    }
+  }
+  cancelRendering({
+    keepAnnotationLayer = false,
+    keepAnnotationEditorLayer = false,
+    keepXfaLayer = false,
+    keepTextLayer = false,
+    cancelExtraDelay = 0
+  } = {}) {
+    super.cancelRendering({
+      cancelExtraDelay
+    });
+    if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) {
+      this.textLayer.cancel();
+      this.textLayer = null;
+    }
+    if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) {
+      this.annotationLayer.cancel();
+      this.annotationLayer = null;
+      this._annotationCanvasMap = null;
+    }
+    if (this.structTreeLayer && !this.textLayer) {
+      this.structTreeLayer = null;
+    }
+    if (this.annotationEditorLayer && (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)) {
+      if (this.drawLayer) {
+        this.drawLayer.cancel();
+        this.drawLayer = null;
+      }
+      this.annotationEditorLayer.cancel();
+      this.annotationEditorLayer = null;
+    }
+    if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) {
+      this.xfaLayer.cancel();
+      this.xfaLayer = null;
+      this._textHighlighter?.disable();
+    }
+  }
+  cssTransform({
+    redrawAnnotationLayer = false,
+    redrawAnnotationEditorLayer = false,
+    redrawXfaLayer = false,
+    redrawTextLayer = false,
+    hideTextLayer = false
+  }) {
+    const {
+      canvas
+    } = this;
+    if (!canvas) {
+      return;
+    }
+    const originalViewport = this.#originalViewport;
+    if (this.viewport !== originalViewport) {
+      const relativeRotation = (360 + this.viewport.rotation - originalViewport.rotation) % 360;
+      if (relativeRotation === 90 || relativeRotation === 270) {
+        const {
+          width,
+          height
+        } = this.viewport;
+        const scaleX = height / width;
+        const scaleY = width / height;
+        canvas.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX},${scaleY})`;
+      } else {
+        canvas.style.transform = relativeRotation === 0 ? "" : `rotate(${relativeRotation}deg)`;
+      }
+    }
+    if (redrawAnnotationLayer && this.annotationLayer) {
+      this.#renderAnnotationLayer();
+    }
+    if (redrawAnnotationEditorLayer && this.annotationEditorLayer) {
+      if (this.drawLayer) {
+        this.#renderDrawLayer();
+      }
+      this.#renderAnnotationEditorLayer();
+    }
+    if (redrawXfaLayer && this.xfaLayer) {
+      this.#renderXfaLayer();
+    }
+    if (this.textLayer) {
+      if (hideTextLayer) {
+        this.textLayer.hide();
+        this.structTreeLayer?.hide();
+      } else if (redrawTextLayer) {
+        this.#renderTextLayer();
+      }
+    }
+  }
+  get width() {
+    return this.viewport.width;
+  }
+  get height() {
+    return this.viewport.height;
+  }
+  getPagePoint(x, y) {
+    return this.viewport.convertToPdfPoint(x, y);
+  }
+  _ensureCanvasWrapper() {
+    let canvasWrapper = this.#canvasWrapper;
+    if (!canvasWrapper) {
+      canvasWrapper = this.#canvasWrapper = document.createElement("div");
+      canvasWrapper.classList.add("canvasWrapper");
+      this.#addLayer(canvasWrapper, "canvasWrapper");
+    }
+    return canvasWrapper;
+  }
+  _getRenderingContext(canvas, transform, recordOperations, recordImages) {
+    return {
+      canvas,
+      transform,
+      viewport: this.viewport,
+      annotationMode: this.#annotationMode,
+      optionalContentConfigPromise: this._optionalContentConfigPromise,
+      annotationCanvasMap: this._annotationCanvasMap,
+      pageColors: this.pageColors,
+      isEditing: this.#isEditing,
+      recordOperations,
+      recordImages
+    };
+  }
+  async draw() {
+    if (this.renderingState !== RenderingStates.INITIAL) {
+      console.error("Must be in new state before drawing");
+      this.reset();
+    }
+    const {
+      div,
+      l10n,
+      pdfPage,
+      viewport
+    } = this;
+    if (!pdfPage) {
+      this.renderingState = RenderingStates.FINISHED;
+      throw new Error("pdfPage is not loaded");
+    }
+    this.renderingState = RenderingStates.RUNNING;
+    const canvasWrapper = this._ensureCanvasWrapper();
+    if (!this.textLayer && this.#textLayerMode !== TextLayerMode.DISABLE && !pdfPage.isPureXfa) {
+      this._accessibilityManager ||= new TextAccessibilityManager();
+      this.textLayer = new TextLayerBuilder({
+        pdfPage,
+        highlighter: this._textHighlighter,
+        accessibilityManager: this._accessibilityManager,
+        enablePermissions: this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS,
+        onAppend: textLayerDiv => {
+          this.l10n.pause();
+          this.#addLayer(textLayerDiv, "textLayer");
+          this.l10n.resume();
+        },
+        abortSignal: this.#abortSignal
+      });
+      if (this.enableSelectionRendering) {
+        this.textLayer.div.classList.add("selectionRendering");
+      }
+    }
+    if (!this.annotationLayer && this.#annotationMode !== AnnotationMode.DISABLE) {
+      const {
+        annotationStorage,
+        annotationEditorUIManager,
+        downloadManager,
+        enableComment,
+        enableScripting,
+        fieldObjectsPromise,
+        hasJSActionsPromise,
+        linkService
+      } = this.#layerProperties;
+      this._annotationCanvasMap ||= new Map();
+      this.annotationLayer = new AnnotationLayerBuilder({
+        pdfPage,
+        annotationStorage,
+        imageResourcesPath: this.imageResourcesPath,
+        renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS,
+        linkService,
+        downloadManager,
+        enableComment,
+        enableScripting,
+        hasJSActionsPromise,
+        fieldObjectsPromise,
+        annotationCanvasMap: this._annotationCanvasMap,
+        accessibilityManager: this._accessibilityManager,
+        annotationEditorUIManager,
+        commentManager: this.#commentManager,
+        onAppend: annotationLayerDiv => {
+          this.#addLayer(annotationLayerDiv, "annotationLayer");
+        }
+      });
+    }
+    const {
+      width,
+      height
+    } = viewport;
+    this.#originalViewport = viewport;
+    const {
+      canvas,
+      prevCanvas
+    } = this._createCanvas(newCanvas => {
+      canvasWrapper.prepend(newCanvas);
+    });
+    canvas.setAttribute("role", "presentation");
+    if (!this.outputScale) {
+      this.#computeScale();
+    }
+    const {
+      outputScale
+    } = this;
+    this.#hasRestrictedScaling = this.#needsRestrictedScaling;
+    const sfx = approximateFraction(outputScale.sx);
+    const sfy = approximateFraction(outputScale.sy);
+    const canvasWidth = canvas.width = floorToDivide(calcRound(width * outputScale.sx), sfx[0]);
+    const canvasHeight = canvas.height = floorToDivide(calcRound(height * outputScale.sy), sfy[0]);
+    const pageWidth = floorToDivide(calcRound(width), sfx[1]);
+    const pageHeight = floorToDivide(calcRound(height), sfy[1]);
+    outputScale.sx = canvasWidth / pageWidth;
+    outputScale.sy = canvasHeight / pageHeight;
+    if (this.#scaleRoundX !== sfx[1]) {
+      div.style.setProperty("--scale-round-x", `${sfx[1]}px`);
+      this.#scaleRoundX = sfx[1];
+    }
+    if (this.#scaleRoundY !== sfy[1]) {
+      div.style.setProperty("--scale-round-y", `${sfy[1]}px`);
+      this.#scaleRoundY = sfy[1];
+    }
+    const recordBBoxes = this.enableOptimizedPartialRendering && this.#hasRestrictedScaling && !this.recordedBBoxes;
+    const recordImages = this.imagesRightClickMinSize !== -1 && !this.imageCoordinates;
+    const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null;
+    const resultPromise = this._drawCanvas(this._getRenderingContext(canvas, transform, recordBBoxes, recordImages), () => {
+      prevCanvas?.remove();
+      this._resetCanvas();
+    }, renderTask => {
+      this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots;
+      this.dispatchPageRendered(false, false);
+    }).then(async () => {
+      if (this.renderingState !== RenderingStates.FINISHED) {
+        return;
+      }
+      this.structTreeLayer ||= new StructTreeLayerBuilder(pdfPage, viewport.rawDims);
+      const textLayerPromise = this.textLayer ? this.#renderTextLayer() : null;
+      if (this.annotationLayer) {
+        await this.#renderAnnotationLayer(textLayerPromise);
+      }
+      this.drawLayer ||= new DrawLayerBuilder({
+        pageIndex: this.id,
+        textLayer: this.enableSelectionRendering ? this.textLayer?.div : null,
+        filterFactory: this.pdfPage?.filterFactory,
+        pageColors: this.pageColors
+      });
+      await this.#renderDrawLayer();
+      this.drawLayer.setParent(canvasWrapper);
+      const {
+        annotationEditorUIManager
+      } = this.#layerProperties;
+      if (!annotationEditorUIManager) {
+        return;
+      }
+      if (this.annotationLayer || this.#annotationMode === AnnotationMode.DISABLE) {
+        this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({
+          uiManager: annotationEditorUIManager,
+          pageIndex: this.id - 1,
+          l10n,
+          structTreeLayer: this.structTreeLayer,
+          accessibilityManager: this._accessibilityManager,
+          annotationLayer: this.annotationLayer?.annotationLayer,
+          textLayer: this.textLayer,
+          drawLayer: this.drawLayer.getDrawLayer(),
+          onAppend: annotationEditorLayerDiv => {
+            this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer");
+          }
+        });
+        this.#renderAnnotationEditorLayer();
+      }
+    });
+    if (pdfPage.isPureXfa) {
+      if (!this.xfaLayer) {
+        const {
+          annotationStorage,
+          linkService
+        } = this.#layerProperties;
+        this.xfaLayer = new XfaLayerBuilder({
+          pdfPage,
+          annotationStorage,
+          linkService
+        });
+      }
+      this.#renderXfaLayer();
+    }
+    div.setAttribute("data-loaded", true);
+    this.dispatchPageRender();
+    return resultPromise;
+  }
+  setPageLabel(label) {
+    this.pageLabel = typeof label === "string" ? label : null;
+    this.div.setAttribute("data-l10n-args", JSON.stringify({
+      page: this.pageLabel ?? this.id
+    }));
+    if (this.pageLabel !== null) {
+      this.div.setAttribute("data-page-label", this.pageLabel);
+    } else {
+      this.div.removeAttribute("data-page-label");
+    }
+  }
+  get thumbnailCanvas() {
+    const {
+      directDrawing,
+      initialOptionalContent,
+      regularAnnotations
+    } = this.#useThumbnailCanvas;
+    return directDrawing && initialOptionalContent && regularAnnotations ? this.canvas : null;
+  }
+}
+
+;// ./web/pdf_viewer.js
+
+
+
+
+
+
+
+
+const DEFAULT_CACHE_SIZE = 10;
+const PagesCountLimit = {
+  FORCE_SCROLL_MODE_PAGE: 10000,
+  FORCE_LAZY_PAGE_INIT: 5000,
+  PAUSE_EAGER_PAGE_INIT: 250
+};
+function isValidAnnotationEditorMode(mode) {
+  return Object.values(AnnotationEditorType).includes(mode) && mode !== AnnotationEditorType.DISABLE;
+}
+class PDFPageViewBuffer {
+  #buf = new Set();
+  #size = 0;
+  constructor(size) {
+    this.#size = size;
+  }
+  push(view) {
+    const buf = this.#buf;
+    if (buf.has(view)) {
+      buf.delete(view);
+    }
+    buf.add(view);
+    if (buf.size > this.#size) {
+      this.#destroyFirstView();
+    }
+  }
+  resize(newSize, idsToKeep = null) {
+    this.#size = newSize;
+    const buf = this.#buf;
+    if (idsToKeep) {
+      const ii = buf.size;
+      let i = 1;
+      for (const view of buf) {
+        if (idsToKeep.has(view.id)) {
+          buf.delete(view);
+          buf.add(view);
+        }
+        if (++i > ii) {
+          break;
+        }
+      }
+    }
+    while (buf.size > this.#size) {
+      this.#destroyFirstView();
+    }
+  }
+  has(view) {
+    return this.#buf.has(view);
+  }
+  [Symbol.iterator]() {
+    return this.#buf.keys();
+  }
+  #destroyFirstView() {
+    const firstView = this.#buf.keys().next().value;
+    firstView?.destroy();
+    this.#buf.delete(firstView);
+  }
+}
+class PDFViewer {
+  #buffer = null;
+  #altTextManager = null;
+  #annotationEditorHighlightColors = null;
+  #annotationEditorMode = AnnotationEditorType.NONE;
+  #annotationEditorUIManager = null;
+  #annotationMode = AnnotationMode.ENABLE_FORMS;
+  #commentManager = null;
+  #containerTopLeft = null;
+  #editorUndoBar = null;
+  #enableHighlightFloatingButton = false;
+  #enablePermissions = false;
+  #enableUpdatedAddImage = false;
+  #enableNewAltTextWhenAddingImage = false;
+  #enableAutoLinking = true;
+  #abortSignal = null;
+  #eventAC = null;
+  #minDurationToUpdateCanvas = 0;
+  #mlManager = null;
+  #printingAllowed = true;
+  #scrollTimeoutId = null;
+  #switchAnnotationEditorModeAC = null;
+  #switchAnnotationEditorModeTimeoutId = null;
+  #copyAllInProgress = false;
+  #hiddenCopyElement = null;
+  #previousContainerHeight = 0;
+  #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this));
+  #scrollModePageState = null;
+  #scaleTimeoutId = null;
+  #signatureManager = null;
+  #supportsPinchToZoom = true;
+  #textLayerMode = TextLayerMode.ENABLE;
+  #viewerAlert = null;
+  #copiedPageViews = null;
+  #savedPageViews = null;
+  #deletedPageNumbers = null;
+  constructor(options) {
+    const viewerVersion = "6.1.200";
+    if (version !== viewerVersion) {
+      throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`);
+    }
+    this.container = options.container;
+    this.viewer = options.viewer || options.container.firstElementChild;
+    this.#viewerAlert = options.viewerAlert || null;
+    if (this.container?.tagName !== "DIV" || this.viewer?.tagName !== "DIV") {
+      throw new Error("Invalid `container` and/or `viewer` option.");
+    }
+    if (this.container.offsetParent && getComputedStyle(this.container).position !== "absolute") {
+      throw new Error("The `container` must be absolutely positioned.");
+    }
+    this.#resizeObserver.observe(this.container);
+    this.eventBus = options.eventBus;
+    this.linkService = options.linkService || new SimpleLinkService();
+    this.downloadManager = options.downloadManager || null;
+    this.findController = options.findController || null;
+    this.#altTextManager = options.altTextManager || null;
+    this.#commentManager = options.commentManager || null;
+    this.#signatureManager = options.signatureManager || null;
+    this.#editorUndoBar = options.editorUndoBar || null;
+    if (this.findController) {
+      this.findController.onIsPageVisible = pageNumber => this._getVisiblePages().ids.has(pageNumber);
+    }
+    this._scriptingManager = options.scriptingManager || null;
+    this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE;
+    this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS;
+    this.#annotationEditorMode = options.annotationEditorMode ?? AnnotationEditorType.NONE;
+    this.#annotationEditorHighlightColors = options.annotationEditorHighlightColors || null;
+    this.#enableHighlightFloatingButton = options.enableHighlightFloatingButton === true;
+    this.#enableUpdatedAddImage = options.enableUpdatedAddImage === true;
+    this.#enableNewAltTextWhenAddingImage = options.enableNewAltTextWhenAddingImage === true;
+    this.imageResourcesPath = options.imageResourcesPath || "";
+    this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;
+    this.removePageBorders = options.removePageBorders || false;
+    this.maxCanvasPixels = options.maxCanvasPixels;
+    this.maxCanvasDim = options.maxCanvasDim;
+    this.capCanvasAreaFactor = options.capCanvasAreaFactor;
+    this.enableDetailCanvas = options.enableDetailCanvas ?? true;
+    this.enableOptimizedPartialRendering = options.enableOptimizedPartialRendering ?? false;
+    this.enableSelectionRendering = options.enableSelectionRendering !== false;
+    this.imagesRightClickMinSize = options.imagesRightClickMinSize ?? -1;
+    this.l10n = options.l10n;
+    this.l10n ||= new genericl10n_GenericL10n();
+    this.#enablePermissions = options.enablePermissions || false;
+    this.pageColors = options.pageColors || null;
+    this.#mlManager = options.mlManager || null;
+    this.#supportsPinchToZoom = options.supportsPinchToZoom !== false;
+    this.#enableAutoLinking = options.enableAutoLinking !== false;
+    this.#minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500;
+    this.defaultRenderingQueue = !options.renderingQueue;
+    if (this.defaultRenderingQueue) {
+      this.renderingQueue = new PDFRenderingQueue();
+      this.renderingQueue.setViewer(this);
+    } else {
+      this.renderingQueue = options.renderingQueue;
+    }
+    const {
+      abortSignal
+    } = options;
+    this.#abortSignal = abortSignal || null;
+    abortSignal?.addEventListener("abort", () => {
+      this.#resizeObserver.disconnect();
+      this.#resizeObserver = null;
+    }, {
+      once: true
+    });
+    this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this), abortSignal);
+    this.presentationModeState = PresentationModeState.UNKNOWN;
+    this._resetView();
+    if (this.removePageBorders) {
+      this.viewer.classList.add("removePageBorders");
+    }
+    this.#updateContainerHeightCss();
+    this.eventBus.on("thumbnailrendered", ({
+      pageNumber,
+      pdfPage
+    }) => {
+      const pageView = this._pages[pageNumber - 1];
+      if (!this.#buffer.has(pageView)) {
+        pdfPage?.cleanup();
+      }
+    }, internalOpt);
+    if (!options.l10n) {
+      this.l10n.translate(this.container);
+    }
+  }
+  get printingAllowed() {
+    return this.#printingAllowed;
+  }
+  get pagesCount() {
+    return this._pages.length;
+  }
+  getPageView(index) {
+    return this._pages[index];
+  }
+  getCachedPageViews() {
+    return new Set(this.#buffer);
+  }
+  get pageViewsReady() {
+    return this._pages.every(pageView => pageView?.pdfPage);
+  }
+  clearSelection() {
+    const selection = document.getSelection();
+    if (!selection || selection.isCollapsed) {
+      return;
+    }
+    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {
+      if (selection.getRangeAt(i).intersectsNode(this.viewer)) {
+        selection.removeAllRanges?.();
+        selection.empty?.();
+        return;
+      }
+    }
+  }
+  get renderForms() {
+    return this.#annotationMode === AnnotationMode.ENABLE_FORMS;
+  }
+  get enableScripting() {
+    return !!this._scriptingManager;
+  }
+  get currentPageNumber() {
+    return this._currentPageNumber;
+  }
+  set currentPageNumber(val) {
+    if (!Number.isInteger(val)) {
+      throw new Error("Invalid page number.");
+    }
+    if (!this.pdfDocument) {
+      return;
+    }
+    if (this._currentPageNumber !== val) {
+      this.clearSelection();
+    }
+    if (!this._setCurrentPageNumber(val, true)) {
+      console.error(`currentPageNumber: "${val}" is not a valid page.`);
+    }
+  }
+  _setCurrentPageNumber(val, resetCurrentPageView = false) {
+    if (this._currentPageNumber === val) {
+      if (resetCurrentPageView) {
+        this.#resetCurrentPageView();
+      }
+      return true;
+    }
+    if (!(0 < val && val <= this.pagesCount)) {
+      return false;
+    }
+    const previous = this._currentPageNumber;
+    this._currentPageNumber = val;
+    this.eventBus.dispatch("pagechanging", {
+      source: this,
+      pageNumber: val,
+      pageLabel: this._pageLabels?.[val - 1] ?? null,
+      previous
+    });
+    if (resetCurrentPageView) {
+      this.#resetCurrentPageView();
+    }
+    return true;
+  }
+  get currentPageLabel() {
+    return this._pageLabels?.[this._currentPageNumber - 1] ?? null;
+  }
+  set currentPageLabel(val) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    let page = val | 0;
+    if (this._pageLabels) {
+      const i = this._pageLabels.indexOf(val);
+      if (i >= 0) {
+        page = i + 1;
+      }
+    }
+    if (this._currentPageNumber !== page) {
+      this.clearSelection();
+    }
+    if (!this._setCurrentPageNumber(page, true)) {
+      console.error(`currentPageLabel: "${val}" is not a valid page.`);
+    }
+  }
+  get currentScale() {
+    return this._currentScale !== UNKNOWN_SCALE ? this._currentScale : DEFAULT_SCALE;
+  }
+  set currentScale(val) {
+    if (isNaN(val)) {
+      throw new Error("Invalid numeric scale.");
+    }
+    if (!this.pdfDocument) {
+      return;
+    }
+    this.#setScale(val, {
+      noScroll: false
+    });
+  }
+  get currentScaleValue() {
+    return this._currentScaleValue;
+  }
+  set currentScaleValue(val) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    this.#setScale(val, {
+      noScroll: false
+    });
+  }
+  get pagesRotation() {
+    return this._pagesRotation;
+  }
+  set pagesRotation(rotation) {
+    if (!isValidRotation(rotation)) {
+      throw new Error("Invalid pages rotation angle.");
+    }
+    if (!this.pdfDocument) {
+      return;
+    }
+    rotation %= 360;
+    if (rotation < 0) {
+      rotation += 360;
+    }
+    if (this._pagesRotation === rotation) {
+      return;
+    }
+    this.clearSelection();
+    this._pagesRotation = rotation;
+    const pageNumber = this._currentPageNumber;
+    this.refresh(true, {
+      rotation
+    });
+    if (this._currentScaleValue) {
+      this.#setScale(this._currentScaleValue, {
+        noScroll: true
+      });
+    }
+    this.eventBus.dispatch("rotationchanging", {
+      source: this,
+      pagesRotation: rotation,
+      pageNumber
+    });
+    if (this.defaultRenderingQueue) {
+      this.update();
+    }
+  }
+  get firstPagePromise() {
+    return this.pdfDocument ? this._firstPageCapability.promise : null;
+  }
+  get onePageRendered() {
+    return this.pdfDocument ? this._onePageRenderedCapability.promise : null;
+  }
+  get pagesPromise() {
+    return this.pdfDocument ? this._pagesCapability.promise : null;
+  }
+  get _layerProperties() {
+    const self = this;
+    return shadow(this, "_layerProperties", {
+      get annotationEditorUIManager() {
+        return self.#annotationEditorUIManager;
+      },
+      get annotationStorage() {
+        return self.pdfDocument?.annotationStorage;
+      },
+      get downloadManager() {
+        return self.downloadManager;
+      },
+      get enableComment() {
+        return !!self.#commentManager;
+      },
+      get enableScripting() {
+        return !!self._scriptingManager;
+      },
+      get fieldObjectsPromise() {
+        return self.pdfDocument?.getFieldObjects();
+      },
+      get findController() {
+        return self.findController;
+      },
+      get hasJSActionsPromise() {
+        return self.pdfDocument?.hasJSActions();
+      },
+      get linkService() {
+        return self.linkService;
+      }
+    });
+  }
+  #setPrintingAllowed(isAllowed) {
+    this.#printingAllowed = isAllowed;
+    this.eventBus.dispatch("printingallowed", {
+      source: this,
+      isAllowed
+    });
+  }
+  #initializePermissions(permissions) {
+    const params = {
+      annotationEditorMode: this.#annotationEditorMode,
+      annotationMode: this.#annotationMode,
+      textLayerMode: this.#textLayerMode
+    };
+    if (!permissions) {
+      this.#setPrintingAllowed(true);
+      return params;
+    }
+    this.#setPrintingAllowed(permissions.includes(PermissionFlag.PRINT_HIGH_QUALITY) || permissions.includes(PermissionFlag.PRINT));
+    if (!permissions.includes(PermissionFlag.COPY) && this.#textLayerMode === TextLayerMode.ENABLE) {
+      params.textLayerMode = TextLayerMode.ENABLE_PERMISSIONS;
+    }
+    if (!permissions.includes(PermissionFlag.MODIFY_CONTENTS)) {
+      params.annotationEditorMode = AnnotationEditorType.DISABLE;
+    }
+    if (!permissions.includes(PermissionFlag.MODIFY_ANNOTATIONS) && !permissions.includes(PermissionFlag.FILL_INTERACTIVE_FORMS) && this.#annotationMode === AnnotationMode.ENABLE_FORMS) {
+      params.annotationMode = AnnotationMode.ENABLE;
+    }
+    return params;
+  }
+  async #onePageRenderedOrForceFetch(signal) {
+    if (document.visibilityState === "hidden" || !this.container.offsetParent || this._getVisiblePages().views.length === 0) {
+      return;
+    }
+    const hiddenCapability = Promise.withResolvers(),
+      ac = new AbortController();
+    document.addEventListener("visibilitychange", () => {
+      if (document.visibilityState === "hidden") {
+        hiddenCapability.resolve();
+      }
+    }, {
+      signal: AbortSignal.any([signal, ac.signal])
+    });
+    await Promise.race([this._onePageRenderedCapability.promise, hiddenCapability.promise]);
+    ac.abort();
+  }
+  async getAllText(interruptSignal = null) {
+    const texts = [];
+    const buffer = [];
+    for (let pageNum = 1, pagesCount = this.pdfDocument.numPages; pageNum <= pagesCount; ++pageNum) {
+      if (interruptSignal?.aborted) {
+        return null;
+      }
+      buffer.length = 0;
+      const page = await this.pdfDocument.getPage(pageNum);
+      const {
+        items
+      } = await page.getTextContent();
+      for (const item of items) {
+        if (item.str) {
+          buffer.push(item.str);
+        }
+        if (item.hasEOL) {
+          buffer.push("\n");
+        }
+      }
+      texts.push(removeNullCharacters(buffer.join("")));
+    }
+    return texts.join("\n");
+  }
+  #copyCallback(textLayerMode, event) {
+    const selection = document.getSelection();
+    const {
+      focusNode,
+      anchorNode
+    } = selection;
+    if (anchorNode && focusNode && selection.containsNode(this.#hiddenCopyElement)) {
+      if (this.#copyAllInProgress || textLayerMode === TextLayerMode.ENABLE_PERMISSIONS) {
+        stopEvent(event);
+        return;
+      }
+      this.#copyAllInProgress = true;
+      const {
+        classList
+      } = this.viewer;
+      classList.add("copyAll");
+      const keydownAC = new AbortController(),
+        interruptAC = new AbortController();
+      window.addEventListener("keydown", ev => {
+        if (ev.key === "Escape") {
+          interruptAC.abort();
+        }
+      }, {
+        signal: keydownAC.signal
+      });
+      this.getAllText(interruptAC.signal).then(async text => {
+        if (text !== null) {
+          await navigator.clipboard.writeText(text);
+        }
+      }).catch(reason => {
+        console.warn(`Something goes wrong when extracting the text: ${reason.message}`);
+      }).finally(() => {
+        this.#copyAllInProgress = false;
+        keydownAC.abort();
+        classList.remove("copyAll");
+      });
+      stopEvent(event);
+    }
+  }
+  setDocument(pdfDocument) {
+    if (this.pdfDocument) {
+      this.eventBus.dispatch("pagesdestroy", {
+        source: this
+      });
+      this._cancelRendering();
+      this._resetView();
+      this.findController?.setDocument(null);
+      this._scriptingManager?.setDocument(null);
+      this.#annotationEditorUIManager?.destroy();
+      this.#annotationEditorUIManager = null;
+      this.#annotationEditorMode = AnnotationEditorType.NONE;
+      this.#printingAllowed = true;
+    }
+    this.pdfDocument = pdfDocument;
+    if (!pdfDocument) {
+      return;
+    }
+    const pagesCount = pdfDocument.numPages;
+    const firstPagePromise = pdfDocument.getPage(1);
+    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({
+      intent: "display"
+    });
+    const permissionsPromise = this.#enablePermissions ? pdfDocument.getPermissions() : Promise.resolve();
+    const {
+      eventBus,
+      pageColors,
+      viewer
+    } = this;
+    this.#eventAC = new AbortController();
+    const {
+      signal
+    } = this.#eventAC;
+    const evtOpts = {
+      signal,
+      ...internalOpt
+    };
+    if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) {
+      console.warn("Forcing PAGE-scrolling for performance reasons, given the length of the document.");
+      const mode = this._scrollMode = ScrollMode.PAGE;
+      eventBus.dispatch("scrollmodechanged", {
+        source: this,
+        mode
+      });
+    }
+    this._pagesCapability.promise.then(() => {
+      eventBus.dispatch("pagesloaded", {
+        source: this,
+        pagesCount
+      });
+    }, () => {});
+    const onBeforeDraw = evt => {
+      const pageView = this._pages[evt.pageNumber - 1];
+      if (!pageView) {
+        return;
+      }
+      this.#buffer.push(pageView);
+    };
+    eventBus.on("pagerender", onBeforeDraw, evtOpts);
+    const onAfterDraw = evt => {
+      if (evt.cssTransform || evt.isDetailView) {
+        return;
+      }
+      this._onePageRenderedCapability.resolve({
+        timestamp: evt.timestamp
+      });
+      eventBus.off("pagerendered", onAfterDraw);
+    };
+    eventBus.on("pagerendered", onAfterDraw, evtOpts);
+    Promise.all([firstPagePromise, permissionsPromise]).then(([firstPdfPage, permissions]) => {
+      if (pdfDocument !== this.pdfDocument) {
+        return;
+      }
+      this._firstPageCapability.resolve(firstPdfPage);
+      this._optionalContentConfigPromise = optionalContentConfigPromise;
+      const {
+        annotationEditorMode,
+        annotationMode,
+        textLayerMode
+      } = this.#initializePermissions(permissions);
+      if (textLayerMode !== TextLayerMode.DISABLE) {
+        const element = this.#hiddenCopyElement = document.createElement("div");
+        element.id = "hiddenCopyElement";
+        element.style.cssText = "position:absolute;top:0;left:0;width:0;height:0;display:none";
+        viewer.before(element);
+      }
+      if (annotationEditorMode !== AnnotationEditorType.DISABLE) {
+        const mode = annotationEditorMode;
+        if (pdfDocument.isPureXfa) {
+          console.warn("Warning: XFA-editing is not implemented.");
+        } else if (isValidAnnotationEditorMode(mode)) {
+          this.#annotationEditorUIManager = new AnnotationEditorUIManager(this.container, viewer, this.#viewerAlert, this.#altTextManager, this.#commentManager, this.#signatureManager, eventBus, pdfDocument, pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#enableUpdatedAddImage, this.#enableNewAltTextWhenAddingImage, this.#mlManager, this.#editorUndoBar, this.#supportsPinchToZoom);
+          eventBus.dispatch("annotationeditoruimanager", {
+            source: this,
+            uiManager: this.#annotationEditorUIManager
+          });
+          if (mode !== AnnotationEditorType.NONE) {
+            this.#preloadEditingData(mode);
+            this.#annotationEditorUIManager.updateMode(mode);
+          }
+        } else {
+          console.error(`Invalid AnnotationEditor mode: ${mode}`);
+        }
+      }
+      const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : viewer;
+      const scale = this.currentScale;
+      const viewport = firstPdfPage.getViewport({
+        scale: scale * PixelsPerInch.PDF_TO_CSS_UNITS
+      });
+      viewer.style.setProperty("--scale-factor", viewport.scale);
+      if (pageColors?.background) {
+        viewer.style.setProperty("--page-bg-color", pageColors.background);
+      }
+      if (pageColors?.foreground === "CanvasText" || pageColors?.background === "Canvas") {
+        viewer.style.setProperty("--hcm-highlight-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight"));
+        viewer.style.setProperty("--hcm-highlight-selected-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "ButtonText"));
+      }
+      for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+        const pageView = new PDFPageView({
+          container: viewerElement,
+          eventBus,
+          id: pageNum,
+          scale,
+          defaultViewport: viewport.clone(),
+          optionalContentConfigPromise,
+          renderingQueue: this.renderingQueue,
+          textLayerMode,
+          annotationMode,
+          imageResourcesPath: this.imageResourcesPath,
+          maxCanvasPixels: this.maxCanvasPixels,
+          maxCanvasDim: this.maxCanvasDim,
+          capCanvasAreaFactor: this.capCanvasAreaFactor,
+          enableDetailCanvas: this.enableDetailCanvas,
+          enableOptimizedPartialRendering: this.enableOptimizedPartialRendering,
+          enableSelectionRendering: this.enableSelectionRendering,
+          imagesRightClickMinSize: this.imagesRightClickMinSize,
+          pageColors,
+          l10n: this.l10n,
+          layerProperties: this._layerProperties,
+          enableAutoLinking: this.#enableAutoLinking,
+          minDurationToUpdateCanvas: this.#minDurationToUpdateCanvas,
+          commentManager: this.#commentManager,
+          abortSignal: this.#abortSignal
+        });
+        this._pages.push(pageView);
+      }
+      this._pages[0]?.setPdfPage(firstPdfPage);
+      if (this._scrollMode === ScrollMode.PAGE) {
+        this.#ensurePageViewVisible();
+      } else if (this._spreadMode !== SpreadMode.NONE) {
+        this._updateSpreadMode();
+      }
+      eventBus.on("annotationeditorlayerrendered", evt => {
+        if (this.#annotationEditorUIManager) {
+          eventBus.dispatch("annotationeditormodechanged", {
+            source: this,
+            mode: this.#annotationEditorMode
+          });
+        }
+      }, {
+        once: true,
+        signal,
+        ...internalOpt
+      });
+      this.#onePageRenderedOrForceFetch(signal).then(async () => {
+        if (pdfDocument !== this.pdfDocument) {
+          return;
+        }
+        this.findController?.setDocument(pdfDocument);
+        this._scriptingManager?.setDocument(pdfDocument);
+        if (this.#hiddenCopyElement) {
+          document.addEventListener("copy", this.#copyCallback.bind(this, textLayerMode), {
+            signal
+          });
+        }
+        if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT) {
+          this._pagesCapability.resolve();
+          return;
+        }
+        let getPagesLeft = pagesCount - 1;
+        if (getPagesLeft <= 0) {
+          this._pagesCapability.resolve();
+          return;
+        }
+        for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) {
+          const promise = pdfDocument.getPage(pageNum).then(pdfPage => {
+            const pageView = this._pages[pageNum - 1];
+            if (!pageView.pdfPage) {
+              pageView.setPdfPage(pdfPage);
+            }
+            if (--getPagesLeft === 0) {
+              this._pagesCapability.resolve();
+            }
+          }, reason => {
+            console.error(`Unable to get page ${pageNum} to initialize viewer`, reason);
+            if (--getPagesLeft === 0) {
+              this._pagesCapability.resolve();
+            }
+          });
+          if (pageNum % PagesCountLimit.PAUSE_EAGER_PAGE_INIT === 0) {
+            await promise;
+          }
+        }
+      });
+      eventBus.dispatch("pagesinit", {
+        source: this
+      });
+      pdfDocument.getMetadata().then(({
+        info
+      }) => {
+        if (pdfDocument !== this.pdfDocument) {
+          return;
+        }
+        if (info.Language) {
+          viewer.lang = info.Language;
+        }
+      });
+      if (this.defaultRenderingQueue) {
+        this.update();
+      }
+    }).catch(reason => {
+      console.error("Unable to initialize viewer", reason);
+      this._pagesCapability.reject(reason);
+    });
+  }
+  onPagesEdited({
+    pagesMapper,
+    type,
+    hasBeenCut,
+    pageNumbers
+  }) {
+    if (type === "copy") {
+      this.#copiedPageViews = new Map();
+      for (const pageNum of pageNumbers) {
+        this.#copiedPageViews.set(pageNum, this._pages[pageNum - 1]);
+      }
+      return;
+    }
+    if (type === "cancelCopy") {
+      this.#copiedPageViews = null;
+      return;
+    }
+    const isCut = type === "cut";
+    if (isCut || type === "delete") {
+      this.#savedPageViews = this._pages;
+      this.#deletedPageNumbers = pageNumbers;
+    }
+    if (type === "cancelDelete") {
+      this.#deletedPageNumbers = null;
+      if (!this.#savedPageViews) {
+        return;
+      }
+      const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : this.viewer;
+      if (viewerElement) {
+        this.#annotationEditorUIManager?.startUpdatePages();
+        const fragment = document.createDocumentFragment();
+        for (let i = 0, ii = this.#savedPageViews.length; i < ii; i++) {
+          const page = this.#savedPageViews[i];
+          page.updatePageNumber(i + 1);
+          fragment.append(page.div);
+        }
+        viewerElement.replaceChildren(fragment);
+        this.#annotationEditorUIManager?.endUpdatePages();
+      }
+      this._pages = this.#savedPageViews;
+      this.#savedPageViews = null;
+      return;
+    }
+    if (type === "cleanSavedData") {
+      if (this.#deletedPageNumbers) {
+        if (this.#savedPageViews) {
+          for (const pageNum of this.#deletedPageNumbers) {
+            this.#savedPageViews[pageNum - 1].deleteMe();
+          }
+          this.#savedPageViews = null;
+        }
+        this.#deletedPageNumbers = null;
+      }
+      return;
+    }
+    this._currentPageNumber = 0;
+    const prevPages = this._pages;
+    const newPages = this._pages = [];
+    this.#annotationEditorUIManager?.startUpdatePages();
+    for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) {
+      const prevPageNumber = pagesMapper.getPrevPageNumber(i);
+      if (prevPageNumber < 0) {
+        let page = this.#copiedPageViews.get(-prevPageNumber);
+        if (hasBeenCut) {
+          page.updatePageNumber(i);
+        } else {
+          this.#annotationEditorUIManager?.clonePage(-prevPageNumber - 1, i - 1);
+          page = page.clone(i);
+        }
+        newPages.push(page);
+        continue;
+      }
+      const page = prevPages[prevPageNumber - 1];
+      newPages.push(page);
+      page.updatePageNumber(i);
+    }
+    this.#annotationEditorUIManager?.endUpdatePages();
+    if (type === "paste") {
+      this.#copiedPageViews = null;
+    }
+    const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : this.viewer;
+    if (viewerElement) {
+      const fragment = document.createDocumentFragment();
+      for (const {
+        div
+      } of newPages) {
+        fragment.append(div);
+      }
+      viewerElement.replaceChildren(fragment);
+    }
+    setTimeout(() => {
+      this.forceRendering();
+    });
+  }
+  setPageLabels(labels) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    if (!labels) {
+      this._pageLabels = null;
+    } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {
+      this._pageLabels = null;
+      console.error(`setPageLabels: Invalid page labels.`);
+    } else {
+      this._pageLabels = labels;
+    }
+    for (let i = 0, ii = this._pages.length; i < ii; i++) {
+      this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null);
+    }
+  }
+  _resetView() {
+    this._pages = [];
+    this._currentPageNumber = 1;
+    this._currentScale = UNKNOWN_SCALE;
+    this._currentScaleValue = null;
+    this._pageLabels = null;
+    this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);
+    this._location = null;
+    this._pagesRotation = 0;
+    this._optionalContentConfigPromise = null;
+    this._firstPageCapability = Promise.withResolvers();
+    this._onePageRenderedCapability = Promise.withResolvers();
+    this._pagesCapability = Promise.withResolvers();
+    this._scrollMode = ScrollMode.VERTICAL;
+    this._previousScrollMode = ScrollMode.UNKNOWN;
+    this._spreadMode = SpreadMode.NONE;
+    this.#scrollModePageState = {
+      previousPageNumber: 1,
+      scrollDown: true,
+      pages: []
+    };
+    this.#eventAC?.abort();
+    this.#eventAC = null;
+    this.viewer.textContent = "";
+    this._updateScrollMode();
+    this.viewer.removeAttribute("lang");
+    this.#hiddenCopyElement?.remove();
+    this.#hiddenCopyElement = null;
+    this.#cleanupTimeouts();
+    this.#cleanupSwitchAnnotationEditorMode();
+  }
+  #ensurePageViewVisible() {
+    if (this._scrollMode !== ScrollMode.PAGE) {
+      throw new Error("#ensurePageViewVisible: Invalid scrollMode value.");
+    }
+    const pageNumber = this._currentPageNumber,
+      state = this.#scrollModePageState,
+      viewer = this.viewer;
+    viewer.textContent = "";
+    state.pages.length = 0;
+    if (this._spreadMode === SpreadMode.NONE && !this.isInPresentationMode) {
+      const pageView = this._pages[pageNumber - 1];
+      viewer.append(pageView.div);
+      state.pages.push(pageView);
+    } else {
+      const pageIndexSet = new Set(),
+        parity = this._spreadMode - 1;
+      if (parity === -1) {
+        pageIndexSet.add(pageNumber - 1);
+      } else if (pageNumber % 2 !== parity) {
+        pageIndexSet.add(pageNumber - 1);
+        pageIndexSet.add(pageNumber);
+      } else {
+        pageIndexSet.add(pageNumber - 2);
+        pageIndexSet.add(pageNumber - 1);
+      }
+      const spread = document.createElement("div");
+      spread.className = "spread";
+      if (this.isInPresentationMode) {
+        const dummyPage = document.createElement("div");
+        dummyPage.className = "dummyPage";
+        spread.append(dummyPage);
+      }
+      for (const i of pageIndexSet) {
+        const pageView = this._pages[i];
+        if (!pageView) {
+          continue;
+        }
+        spread.append(pageView.div);
+        state.pages.push(pageView);
+      }
+      viewer.append(spread);
+    }
+    state.scrollDown = pageNumber >= state.previousPageNumber;
+    state.previousPageNumber = pageNumber;
+  }
+  _scrollUpdate() {
+    if (this.pagesCount === 0) {
+      return;
+    }
+    if (this.#scrollTimeoutId) {
+      clearTimeout(this.#scrollTimeoutId);
+    }
+    this.#scrollTimeoutId = setTimeout(() => {
+      this.#scrollTimeoutId = null;
+      this.update();
+    }, 100);
+    this.update();
+  }
+  #scrollIntoView(pageView, pageSpot = null) {
+    const {
+      div,
+      id
+    } = pageView;
+    if (this._currentPageNumber !== id) {
+      this._setCurrentPageNumber(id);
+    }
+    if (this._scrollMode === ScrollMode.PAGE) {
+      this.#ensurePageViewVisible();
+      this.update();
+    }
+    if (!pageSpot && !this.isInPresentationMode) {
+      const left = div.offsetLeft + div.clientLeft,
+        right = left + div.clientWidth;
+      const {
+        scrollLeft,
+        clientWidth
+      } = this.container;
+      if (this._scrollMode === ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) {
+        pageSpot = {
+          left: 0,
+          top: 0
+        };
+      }
+    }
+    scrollIntoView(div, pageSpot);
+    if (!this._currentScaleValue && this._location) {
+      this._location = null;
+    }
+  }
+  #isSameScale(newScale) {
+    return newScale === this._currentScale || Math.abs(newScale - this._currentScale) < 1e-15;
+  }
+  #setScaleUpdatePages(newScale, newValue, {
+    noScroll = false,
+    preset = false,
+    drawingDelay = -1,
+    origin = null
+  }) {
+    this.clearSelection();
+    this._currentScaleValue = newValue.toString();
+    if (this.#isSameScale(newScale)) {
+      if (preset) {
+        this.eventBus.dispatch("scalechanging", {
+          source: this,
+          scale: newScale,
+          presetValue: newValue
+        });
+      }
+      return;
+    }
+    this.viewer.style.setProperty("--scale-factor", newScale * PixelsPerInch.PDF_TO_CSS_UNITS);
+    const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000;
+    this.refresh(true, {
+      scale: newScale,
+      drawingDelay: postponeDrawing ? drawingDelay : -1
+    });
+    if (postponeDrawing) {
+      this.#scaleTimeoutId = setTimeout(() => {
+        this.#scaleTimeoutId = null;
+        this.refresh();
+      }, drawingDelay);
+    }
+    const previousScale = this._currentScale;
+    this._currentScale = newScale;
+    if (!noScroll) {
+      let page = this._currentPageNumber,
+        dest;
+      if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) {
+        page = this._location.pageNumber;
+        dest = [null, {
+          name: "XYZ"
+        }, this._location.left, this._location.top, null];
+      }
+      this.scrollPageIntoView({
+        pageNumber: page,
+        destArray: dest,
+        allowNegativeOffset: true
+      });
+      if (Array.isArray(origin)) {
+        const scaleDiff = newScale / previousScale - 1;
+        const [top, left] = this.containerTopLeft;
+        this.container.scrollLeft += (origin[0] - left) * scaleDiff;
+        this.container.scrollTop += (origin[1] - top) * scaleDiff;
+      }
+    }
+    this.eventBus.dispatch("scalechanging", {
+      source: this,
+      scale: newScale,
+      presetValue: preset ? newValue : undefined
+    });
+    if (this.defaultRenderingQueue) {
+      this.update();
+    }
+  }
+  get #pageWidthScaleFactor() {
+    if (this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL) {
+      return 2;
+    }
+    return 1;
+  }
+  #setScale(value, options) {
+    let scale = parseFloat(value);
+    if (scale > 0) {
+      options.preset = false;
+      this.#setScaleUpdatePages(scale, value, options);
+    } else {
+      const currentPage = this._pages[this._currentPageNumber - 1];
+      if (!currentPage) {
+        return;
+      }
+      let hPadding = SCROLLBAR_PADDING,
+        vPadding = VERTICAL_PADDING;
+      if (this.isInPresentationMode) {
+        hPadding = vPadding = 4;
+        if (this._spreadMode !== SpreadMode.NONE) {
+          hPadding *= 2;
+        }
+      } else if (this.removePageBorders) {
+        hPadding = vPadding = 0;
+      } else if (this._scrollMode === ScrollMode.HORIZONTAL) {
+        [hPadding, vPadding] = [vPadding, hPadding];
+      }
+      const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this.#pageWidthScaleFactor;
+      const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;
+      switch (value) {
+        case "page-actual":
+          scale = 1;
+          break;
+        case "page-width":
+          scale = pageWidthScale;
+          break;
+        case "page-height":
+          scale = pageHeightScale;
+          break;
+        case "page-fit":
+          scale = Math.min(pageWidthScale, pageHeightScale);
+          break;
+        case "auto":
+          const horizontalScale = isPortraitOrientation(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale);
+          scale = Math.min(MAX_AUTO_SCALE, horizontalScale);
+          break;
+        default:
+          console.error(`#setScale: "${value}" is an unknown zoom value.`);
+          return;
+      }
+      options.preset = true;
+      this.#setScaleUpdatePages(scale, value, options);
+    }
+  }
+  #resetCurrentPageView() {
+    const pageView = this._pages[this._currentPageNumber - 1];
+    if (this.isInPresentationMode) {
+      this.#setScale(this._currentScaleValue, {
+        noScroll: true
+      });
+    }
+    this.#scrollIntoView(pageView);
+  }
+  pageLabelToPageNumber(label) {
+    if (!this._pageLabels) {
+      return null;
+    }
+    const i = this._pageLabels.indexOf(label);
+    if (i < 0) {
+      return null;
+    }
+    return i + 1;
+  }
+  scrollPageIntoView({
+    pageNumber,
+    destArray = null,
+    allowNegativeOffset = false,
+    ignoreDestinationZoom = false,
+    center = null
+  }) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1];
+    if (!pageView) {
+      console.error(`scrollPageIntoView: "${pageNumber}" is not a valid pageNumber parameter.`);
+      return;
+    }
+    if (this.isInPresentationMode || !destArray) {
+      this._setCurrentPageNumber(pageNumber, true);
+      return;
+    }
+    let x = 0,
+      y = 0;
+    let width = 0,
+      height = 0,
+      widthScale,
+      heightScale;
+    const changeOrientation = pageView.rotation % 180 !== 0;
+    const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS;
+    const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS;
+    let scale = 0;
+    switch (destArray[1].name) {
+      case "XYZ":
+        x = destArray[2];
+        y = destArray[3];
+        scale = destArray[4];
+        x = x !== null ? x : 0;
+        y = y !== null ? y : pageHeight;
+        break;
+      case "Fit":
+      case "FitB":
+        scale = "page-fit";
+        break;
+      case "FitH":
+      case "FitBH":
+        y = destArray[2];
+        scale = "page-width";
+        if (y === null && this._location) {
+          x = this._location.left;
+          y = this._location.top;
+        } else if (typeof y !== "number" || y < 0) {
+          y = pageHeight;
+        }
+        break;
+      case "FitV":
+      case "FitBV":
+        x = destArray[2];
+        width = pageWidth;
+        height = pageHeight;
+        scale = "page-height";
+        break;
+      case "FitR":
+        x = destArray[2];
+        y = destArray[3];
+        width = destArray[4] - x;
+        height = destArray[5] - y;
+        let hPadding = SCROLLBAR_PADDING,
+          vPadding = VERTICAL_PADDING;
+        if (this.removePageBorders) {
+          hPadding = vPadding = 0;
+        }
+        widthScale = (this.container.clientWidth - hPadding) / width / PixelsPerInch.PDF_TO_CSS_UNITS;
+        heightScale = (this.container.clientHeight - vPadding) / height / PixelsPerInch.PDF_TO_CSS_UNITS;
+        scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
+        break;
+      default:
+        console.error(`scrollPageIntoView: "${destArray[1].name}" is not a valid destination type.`);
+        return;
+    }
+    if (!ignoreDestinationZoom) {
+      if (scale && scale !== this._currentScale) {
+        this.currentScaleValue = scale;
+      } else if (this._currentScale === UNKNOWN_SCALE) {
+        this.currentScaleValue = DEFAULT_SCALE_VALUE;
+      }
+    }
+    if (scale === "page-fit" && !destArray[4]) {
+      this.#scrollIntoView(pageView);
+      return;
+    }
+    const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];
+    let left = Math.min(boundingRect[0][0], boundingRect[1][0]);
+    let top = Math.min(boundingRect[0][1], boundingRect[1][1]);
+    if (center) {
+      if (center === "both" || center === "vertical") {
+        top -= (this.container.clientHeight - Math.abs(boundingRect[1][1] - boundingRect[0][1])) / 2;
+      }
+      if (center === "both" || center === "horizontal") {
+        left -= (this.container.clientWidth - Math.abs(boundingRect[1][0] - boundingRect[0][0])) / 2;
+      }
+    } else if (!allowNegativeOffset) {
+      left = Math.max(left, 0);
+      top = Math.max(top, 0);
+    }
+    this.#scrollIntoView(pageView, {
+      left,
+      top
+    });
+  }
+  _updateLocation(firstPage) {
+    const currentScale = this._currentScale;
+    const currentScaleValue = this._currentScaleValue;
+    const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;
+    const pageNumber = firstPage.id;
+    const currentPageView = this._pages[pageNumber - 1];
+    const container = this.container;
+    const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);
+    const intLeft = Math.round(topLeft[0]);
+    const intTop = Math.round(topLeft[1]);
+    let pdfOpenParams = `#page=${pageNumber}`;
+    if (!this.isInPresentationMode) {
+      pdfOpenParams += `&zoom=${normalizedScaleValue},${intLeft},${intTop}`;
+    }
+    this._location = {
+      pageNumber,
+      scale: normalizedScaleValue,
+      top: intTop,
+      left: intLeft,
+      rotation: this._pagesRotation,
+      pdfOpenParams
+    };
+  }
+  update() {
+    const visible = this._getVisiblePages();
+    const visiblePages = visible.views,
+      numVisiblePages = visiblePages.length;
+    if (numVisiblePages === 0) {
+      return;
+    }
+    const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);
+    this.#buffer.resize(newCacheSize, visible.ids);
+    for (const {
+      view,
+      visibleArea
+    } of visiblePages) {
+      view.updateVisibleArea(visibleArea);
+    }
+    for (const view of this.#buffer) {
+      if (!visible.ids.has(view.id)) {
+        view.updateVisibleArea(null);
+      }
+    }
+    this.renderingQueue.renderHighestPriority(visible);
+    const isSimpleLayout = this._spreadMode === SpreadMode.NONE && (this._scrollMode === ScrollMode.PAGE || this._scrollMode === ScrollMode.VERTICAL);
+    const currentPageNumber = this._currentPageNumber;
+    let stillFullyVisible = false;
+    for (const page of visiblePages) {
+      if (page.percent < 100) {
+        break;
+      }
+      if (page.id === currentPageNumber && isSimpleLayout) {
+        stillFullyVisible = true;
+        break;
+      }
+    }
+    this._setCurrentPageNumber(stillFullyVisible ? this._currentPageNumber : visiblePages[0].id);
+    this._updateLocation(visible.first);
+    this.eventBus.dispatch("updateviewarea", {
+      source: this,
+      location: this._location
+    });
+  }
+  #switchToEditAnnotationMode() {
+    const visible = this._getVisiblePages();
+    const pagesToRefresh = [];
+    const {
+      ids,
+      views
+    } = visible;
+    for (const page of views) {
+      const {
+        view
+      } = page;
+      if (!view.hasEditableAnnotations()) {
+        ids.delete(view.id);
+        continue;
+      }
+      pagesToRefresh.push(page);
+    }
+    if (pagesToRefresh.length === 0) {
+      return null;
+    }
+    this.renderingQueue.renderHighestPriority({
+      first: pagesToRefresh[0],
+      last: pagesToRefresh.at(-1),
+      views: pagesToRefresh,
+      ids
+    });
+    return ids;
+  }
+  containsElement(element) {
+    return this.container.contains(element);
+  }
+  focus() {
+    this.container.focus();
+  }
+  get _isContainerRtl() {
+    return getComputedStyle(this.container).direction === "rtl";
+  }
+  get isInPresentationMode() {
+    return this.presentationModeState === PresentationModeState.FULLSCREEN;
+  }
+  get isChangingPresentationMode() {
+    return this.presentationModeState === PresentationModeState.CHANGING;
+  }
+  get isHorizontalScrollbarEnabled() {
+    return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;
+  }
+  get isVerticalScrollbarEnabled() {
+    return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight;
+  }
+  _getVisiblePages() {
+    const views = this._scrollMode === ScrollMode.PAGE ? this.#scrollModePageState.pages : this._pages,
+      horizontal = this._scrollMode === ScrollMode.HORIZONTAL,
+      rtl = horizontal && this._isContainerRtl;
+    return getVisibleElements({
+      scrollEl: this.container,
+      views,
+      sortByVisibility: true,
+      horizontal,
+      rtl
+    });
+  }
+  cleanup() {
+    for (const pageView of this._pages) {
+      if (pageView.renderingState !== RenderingStates.FINISHED) {
+        pageView.reset();
+      }
+    }
+  }
+  _cancelRendering() {
+    for (const pageView of this._pages) {
+      pageView.cancelRendering();
+    }
+  }
+  async #ensurePdfPageLoaded(pageView) {
+    if (pageView.pdfPage) {
+      return pageView.pdfPage;
+    }
+    try {
+      const pdfPage = await this.pdfDocument.getPage(pageView.id);
+      if (!pageView.pdfPage) {
+        pageView.setPdfPage(pdfPage);
+      }
+      return pdfPage;
+    } catch (reason) {
+      console.error("Unable to get page for page view", reason);
+      return null;
+    }
+  }
+  #getScrollAhead(visible) {
+    if (visible.first?.id === 1) {
+      return true;
+    } else if (visible.last?.id === this.pagesCount) {
+      return false;
+    }
+    switch (this._scrollMode) {
+      case ScrollMode.PAGE:
+        return this.#scrollModePageState.scrollDown;
+      case ScrollMode.HORIZONTAL:
+        return this.scroll.right;
+    }
+    return this.scroll.down;
+  }
+  forceRendering(currentlyVisiblePages) {
+    const visiblePages = currentlyVisiblePages || this._getVisiblePages();
+    const scrollAhead = this.#getScrollAhead(visiblePages);
+    const preRenderExtra = this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL;
+    const ignoreDetailViews = this.#scaleTimeoutId !== null || this.#scrollTimeoutId !== null && visiblePages.views.some(page => page.detailView?.renderingCancelled);
+    const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead, preRenderExtra, ignoreDetailViews);
+    if (pageView) {
+      this.#ensurePdfPageLoaded(pageView).then(() => {
+        this.renderingQueue.renderView(pageView);
+      });
+      return true;
+    }
+    return false;
+  }
+  get hasEqualPageSizes() {
+    const firstPageView = this._pages[0];
+    for (let i = 1, ii = this._pages.length; i < ii; ++i) {
+      const pageView = this._pages[i];
+      if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {
+        return false;
+      }
+    }
+    return true;
+  }
+  getPagesOverview() {
+    let initialOrientation;
+    return this._pages.map(pageView => {
+      const viewport = pageView.pdfPage.getViewport({
+        scale: 1
+      });
+      const orientation = isPortraitOrientation(viewport);
+      if (initialOrientation === undefined) {
+        initialOrientation = orientation;
+      } else if (this.enablePrintAutoRotate && orientation !== initialOrientation) {
+        return {
+          width: viewport.height,
+          height: viewport.width,
+          rotation: (viewport.rotation - 90) % 360
+        };
+      }
+      return {
+        width: viewport.width,
+        height: viewport.height,
+        rotation: viewport.rotation
+      };
+    });
+  }
+  get optionalContentConfigPromise() {
+    if (!this.pdfDocument) {
+      return Promise.resolve(null);
+    }
+    if (!this._optionalContentConfigPromise) {
+      console.error("optionalContentConfigPromise: Not initialized yet.");
+      return this.pdfDocument.getOptionalContentConfig({
+        intent: "display"
+      });
+    }
+    return this._optionalContentConfigPromise;
+  }
+  set optionalContentConfigPromise(promise) {
+    if (!(promise instanceof Promise)) {
+      throw new Error(`Invalid optionalContentConfigPromise: ${promise}`);
+    }
+    if (!this.pdfDocument) {
+      return;
+    }
+    if (!this._optionalContentConfigPromise) {
+      return;
+    }
+    this._optionalContentConfigPromise = promise;
+    this.refresh(false, {
+      optionalContentConfigPromise: promise
+    });
+    this.eventBus.dispatch("optionalcontentconfigchanged", {
+      source: this,
+      promise
+    });
+  }
+  get scrollMode() {
+    return this._scrollMode;
+  }
+  set scrollMode(mode) {
+    if (this._scrollMode === mode) {
+      return;
+    }
+    if (!isValidScrollMode(mode)) {
+      throw new Error(`Invalid scroll mode: ${mode}`);
+    }
+    if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) {
+      return;
+    }
+    this._previousScrollMode = this._scrollMode;
+    this.clearSelection();
+    this._scrollMode = mode;
+    this.eventBus.dispatch("scrollmodechanged", {
+      source: this,
+      mode
+    });
+    this._updateScrollMode(this._currentPageNumber);
+  }
+  _updateScrollMode(pageNumber = null) {
+    const scrollMode = this._scrollMode,
+      viewer = this.viewer;
+    viewer.classList.toggle("scrollHorizontal", scrollMode === ScrollMode.HORIZONTAL);
+    viewer.classList.toggle("scrollWrapped", scrollMode === ScrollMode.WRAPPED);
+    if (!this.pdfDocument || !pageNumber) {
+      return;
+    }
+    if (scrollMode === ScrollMode.PAGE) {
+      this.#ensurePageViewVisible();
+    } else if (this._previousScrollMode === ScrollMode.PAGE) {
+      this._updateSpreadMode();
+    }
+    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {
+      this.#setScale(this._currentScaleValue, {
+        noScroll: true
+      });
+    }
+    this._setCurrentPageNumber(pageNumber, true);
+    this.update();
+  }
+  get spreadMode() {
+    return this._spreadMode;
+  }
+  set spreadMode(mode) {
+    if (this._spreadMode === mode) {
+      return;
+    }
+    if (!isValidSpreadMode(mode)) {
+      throw new Error(`Invalid spread mode: ${mode}`);
+    }
+    this.clearSelection();
+    this._spreadMode = mode;
+    this.eventBus.dispatch("spreadmodechanged", {
+      source: this,
+      mode
+    });
+    this._updateSpreadMode(this._currentPageNumber);
+  }
+  _updateSpreadMode(pageNumber = null) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    const viewer = this.viewer,
+      pages = this._pages;
+    if (this._scrollMode === ScrollMode.PAGE) {
+      this.#ensurePageViewVisible();
+    } else {
+      viewer.textContent = "";
+      if (this._spreadMode === SpreadMode.NONE) {
+        for (const pageView of this._pages) {
+          viewer.append(pageView.div);
+        }
+      } else {
+        const parity = this._spreadMode - 1;
+        let spread = null;
+        for (let i = 0, ii = pages.length; i < ii; ++i) {
+          if (spread === null) {
+            spread = document.createElement("div");
+            spread.className = "spread";
+            viewer.append(spread);
+          } else if (i % 2 === parity) {
+            spread = spread.cloneNode(false);
+            viewer.append(spread);
+          }
+          spread.append(pages[i].div);
+        }
+      }
+    }
+    if (!pageNumber) {
+      return;
+    }
+    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {
+      this.#setScale(this._currentScaleValue, {
+        noScroll: true
+      });
+    }
+    this._setCurrentPageNumber(pageNumber, true);
+    this.update();
+  }
+  #getPageAdvance(currentPageNumber, previous = false) {
+    switch (this._scrollMode) {
+      case ScrollMode.WRAPPED:
+        {
+          const {
+              views
+            } = this._getVisiblePages(),
+            pageLayout = new Map();
+          for (const {
+            id,
+            y,
+            percent,
+            widthPercent
+          } of views) {
+            if (percent === 0 || widthPercent < 100) {
+              continue;
+            }
+            pageLayout.getOrInsertComputed(y, makeArr).push(id);
+          }
+          for (const yArray of pageLayout.values()) {
+            const currentIndex = yArray.indexOf(currentPageNumber);
+            if (currentIndex === -1) {
+              continue;
+            }
+            const numPages = yArray.length;
+            if (numPages === 1) {
+              break;
+            }
+            if (previous) {
+              for (let i = currentIndex - 1, ii = 0; i >= ii; i--) {
+                const currentId = yArray[i],
+                  expectedId = yArray[i + 1] - 1;
+                if (currentId < expectedId) {
+                  return currentPageNumber - expectedId;
+                }
+              }
+            } else {
+              for (let i = currentIndex + 1, ii = numPages; i < ii; i++) {
+                const currentId = yArray[i],
+                  expectedId = yArray[i - 1] + 1;
+                if (currentId > expectedId) {
+                  return expectedId - currentPageNumber;
+                }
+              }
+            }
+            if (previous) {
+              const firstId = yArray[0];
+              if (firstId < currentPageNumber) {
+                return currentPageNumber - firstId + 1;
+              }
+            } else {
+              const lastId = yArray[numPages - 1];
+              if (lastId > currentPageNumber) {
+                return lastId - currentPageNumber + 1;
+              }
+            }
+            break;
+          }
+          break;
+        }
+      case ScrollMode.HORIZONTAL:
+        {
+          break;
+        }
+      case ScrollMode.PAGE:
+      case ScrollMode.VERTICAL:
+        {
+          if (this._spreadMode === SpreadMode.NONE) {
+            break;
+          }
+          const parity = this._spreadMode - 1;
+          if (previous && currentPageNumber % 2 !== parity) {
+            break;
+          } else if (!previous && currentPageNumber % 2 === parity) {
+            break;
+          }
+          const {
+              views
+            } = this._getVisiblePages(),
+            expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1;
+          for (const {
+            id,
+            percent,
+            widthPercent
+          } of views) {
+            if (id !== expectedId) {
+              continue;
+            }
+            if (percent > 0 && widthPercent === 100) {
+              return 2;
+            }
+            break;
+          }
+          break;
+        }
+    }
+    return 1;
+  }
+  nextPage() {
+    const currentPageNumber = this._currentPageNumber,
+      pagesCount = this.pagesCount;
+    if (currentPageNumber >= pagesCount) {
+      return false;
+    }
+    const advance = this.#getPageAdvance(currentPageNumber, false) || 1;
+    this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount);
+    return true;
+  }
+  previousPage() {
+    const currentPageNumber = this._currentPageNumber;
+    if (currentPageNumber <= 1) {
+      return false;
+    }
+    const advance = this.#getPageAdvance(currentPageNumber, true) || 1;
+    this.currentPageNumber = Math.max(currentPageNumber - advance, 1);
+    return true;
+  }
+  updateScale({
+    drawingDelay,
+    scaleFactor = null,
+    steps = null,
+    origin
+  }) {
+    if (steps === null && scaleFactor === null) {
+      throw new Error("Invalid updateScale options: either `steps` or `scaleFactor` must be provided.");
+    }
+    if (!this.pdfDocument) {
+      return;
+    }
+    let newScale = this._currentScale;
+    if (scaleFactor > 0 && scaleFactor !== 1) {
+      newScale = Math.round(newScale * scaleFactor * 100) / 100;
+    } else if (steps) {
+      const delta = steps > 0 ? DEFAULT_SCALE_DELTA : 1 / DEFAULT_SCALE_DELTA;
+      const round = steps > 0 ? Math.ceil : Math.floor;
+      steps = Math.abs(steps);
+      do {
+        newScale = round((newScale * delta).toFixed(2) * 10) / 10;
+      } while (--steps > 0);
+    }
+    newScale = MathClamp(newScale, MIN_SCALE, MAX_SCALE);
+    this.#setScale(newScale, {
+      noScroll: false,
+      drawingDelay,
+      origin
+    });
+  }
+  increaseScale(options = {}) {
+    this.updateScale({
+      ...options,
+      steps: options.steps ?? 1
+    });
+  }
+  decreaseScale(options = {}) {
+    this.updateScale({
+      ...options,
+      steps: -(options.steps ?? 1)
+    });
+  }
+  #updateContainerHeightCss(height = this.container.clientHeight) {
+    if (height !== this.#previousContainerHeight) {
+      this.#previousContainerHeight = height;
+      docStyle.setProperty("--viewer-container-height", `${height}px`);
+    }
+  }
+  #resizeObserverCallback(entries) {
+    for (const entry of entries) {
+      if (entry.target === this.container) {
+        this.#updateContainerHeightCss(Math.floor(entry.borderBoxSize[0].blockSize));
+        this.#containerTopLeft = null;
+        break;
+      }
+    }
+  }
+  get containerTopLeft() {
+    return this.#containerTopLeft ||= [this.container.offsetTop, this.container.offsetLeft];
+  }
+  #cleanupTimeouts() {
+    if (this.#scaleTimeoutId !== null) {
+      clearTimeout(this.#scaleTimeoutId);
+      this.#scaleTimeoutId = null;
+    }
+    if (this.#scrollTimeoutId !== null) {
+      clearTimeout(this.#scrollTimeoutId);
+      this.#scrollTimeoutId = null;
+    }
+  }
+  #cleanupSwitchAnnotationEditorMode() {
+    this.#switchAnnotationEditorModeAC?.abort();
+    this.#switchAnnotationEditorModeAC = null;
+    if (this.#switchAnnotationEditorModeTimeoutId !== null) {
+      clearTimeout(this.#switchAnnotationEditorModeTimeoutId);
+      this.#switchAnnotationEditorModeTimeoutId = null;
+    }
+  }
+  #preloadEditingData(mode) {
+    switch (mode) {
+      case AnnotationEditorType.STAMP:
+        this.#mlManager?.loadModel("altText");
+        break;
+      case AnnotationEditorType.SIGNATURE:
+        this.#signatureManager?.loadSignatures();
+        break;
+    }
+  }
+  get annotationEditorMode() {
+    return this.#annotationEditorUIManager ? this.#annotationEditorMode : AnnotationEditorType.DISABLE;
+  }
+  set annotationEditorMode({
+    mode,
+    editId = null,
+    isFromKeyboard = false,
+    mustEnterInEditMode = false,
+    editComment = false
+  }) {
+    if (!this.#annotationEditorUIManager) {
+      throw new Error(`The AnnotationEditor is not enabled.`);
+    }
+    if (this.#annotationEditorMode === mode) {
+      return;
+    }
+    if (!isValidAnnotationEditorMode(mode)) {
+      throw new Error(`Invalid AnnotationEditor mode: ${mode}`);
+    }
+    if (!this.pdfDocument) {
+      return;
+    }
+    this.#preloadEditingData(mode);
+    const {
+      eventBus,
+      pdfDocument
+    } = this;
+    const updater = async () => {
+      this.#cleanupSwitchAnnotationEditorMode();
+      this.#annotationEditorMode = mode;
+      await this.#annotationEditorUIManager.updateMode(mode, editId, true, isFromKeyboard, mustEnterInEditMode, editComment);
+      if (mode !== this.#annotationEditorMode || pdfDocument !== this.pdfDocument) {
+        return;
+      }
+      eventBus.dispatch("annotationeditormodechanged", {
+        source: this,
+        mode
+      });
+    };
+    if (mode === AnnotationEditorType.NONE || this.#annotationEditorMode === AnnotationEditorType.NONE) {
+      const isEditing = mode !== AnnotationEditorType.NONE;
+      if (!isEditing) {
+        this.pdfDocument.annotationStorage.resetModifiedIds();
+      }
+      this.cleanup();
+      for (const pageView of this._pages) {
+        pageView.toggleEditingMode(isEditing);
+      }
+      const idsToRefresh = this.#switchToEditAnnotationMode();
+      if (isEditing && idsToRefresh) {
+        this.#cleanupSwitchAnnotationEditorMode();
+        this.#switchAnnotationEditorModeAC = new AbortController();
+        const signal = AbortSignal.any([this.#eventAC.signal, this.#switchAnnotationEditorModeAC.signal]);
+        eventBus.on("pagerendered", ({
+          pageNumber
+        }) => {
+          idsToRefresh.delete(pageNumber);
+          if (idsToRefresh.size === 0) {
+            this.#switchAnnotationEditorModeTimeoutId = setTimeout(updater, 0);
+          }
+        }, {
+          signal,
+          ...internalOpt
+        });
+        return;
+      }
+    }
+    updater();
+  }
+  refresh(noUpdate = false, updateArgs = Object.create(null)) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    for (const pageView of this._pages) {
+      pageView.update(updateArgs);
+    }
+    this.#cleanupTimeouts();
+    if (!noUpdate) {
+      this.update();
+    }
+  }
+}
+
+;// ./web/secondary_toolbar.js
+
+
+
+class SecondaryToolbar {
+  #opts;
+  constructor(options, eventBus) {
+    this.#opts = options;
+    const buttons = [{
+      element: options.presentationModeButton,
+      eventName: "presentationmode",
+      close: true
+    }, {
+      element: options.printButton,
+      eventName: "print",
+      close: true
+    }, {
+      element: options.downloadButton,
+      eventName: "download",
+      close: true
+    }, {
+      element: options.viewBookmarkButton,
+      eventName: null,
+      close: true
+    }, {
+      element: options.firstPageButton,
+      eventName: "firstpage",
+      close: true
+    }, {
+      element: options.lastPageButton,
+      eventName: "lastpage",
+      close: true
+    }, {
+      element: options.pageRotateCwButton,
+      eventName: "rotatecw",
+      close: false
+    }, {
+      element: options.pageRotateCcwButton,
+      eventName: "rotateccw",
+      close: false
+    }, {
+      element: options.cursorSelectToolButton,
+      eventName: "switchcursortool",
+      eventDetails: {
+        tool: CursorTool.SELECT
+      },
+      close: true
+    }, {
+      element: options.cursorHandToolButton,
+      eventName: "switchcursortool",
+      eventDetails: {
+        tool: CursorTool.HAND
+      },
+      close: true
+    }, {
+      element: options.scrollPageButton,
+      eventName: "switchscrollmode",
+      eventDetails: {
+        mode: ScrollMode.PAGE
+      },
+      close: true
+    }, {
+      element: options.scrollVerticalButton,
+      eventName: "switchscrollmode",
+      eventDetails: {
+        mode: ScrollMode.VERTICAL
+      },
+      close: true
+    }, {
+      element: options.scrollHorizontalButton,
+      eventName: "switchscrollmode",
+      eventDetails: {
+        mode: ScrollMode.HORIZONTAL
+      },
+      close: true
+    }, {
+      element: options.scrollWrappedButton,
+      eventName: "switchscrollmode",
+      eventDetails: {
+        mode: ScrollMode.WRAPPED
+      },
+      close: true
+    }, {
+      element: options.spreadNoneButton,
+      eventName: "switchspreadmode",
+      eventDetails: {
+        mode: SpreadMode.NONE
+      },
+      close: true
+    }, {
+      element: options.spreadOddButton,
+      eventName: "switchspreadmode",
+      eventDetails: {
+        mode: SpreadMode.ODD
+      },
+      close: true
+    }, {
+      element: options.spreadEvenButton,
+      eventName: "switchspreadmode",
+      eventDetails: {
+        mode: SpreadMode.EVEN
+      },
+      close: true
+    }, {
+      element: options.imageAltTextSettingsButton,
+      eventName: "imagealttextsettings",
+      close: true
+    }, {
+      element: options.documentPropertiesButton,
+      eventName: "documentproperties",
+      close: true
+    }];
+    buttons.push({
+      element: options.openFileButton,
+      eventName: "openfile",
+      close: true
+    });
+    this.eventBus = eventBus;
+    this.opened = false;
+    this.#bindListeners(buttons);
+    this.reset();
+  }
+  get isOpen() {
+    return this.opened;
+  }
+  setPageNumber(pageNumber) {
+    this.pageNumber = pageNumber;
+    this.#updateUIState();
+  }
+  setPagesCount(pagesCount) {
+    this.pagesCount = pagesCount;
+    this.#updateUIState();
+  }
+  reset() {
+    this.pageNumber = 0;
+    this.pagesCount = 0;
+    this.#updateUIState();
+    this.eventBus.dispatch("switchcursortool", {
+      source: this,
+      reset: true
+    });
+    this.#scrollModeChanged({
+      mode: ScrollMode.VERTICAL
+    });
+    this.#spreadModeChanged({
+      mode: SpreadMode.NONE
+    });
+  }
+  #updateUIState() {
+    const {
+      firstPageButton,
+      lastPageButton,
+      pageRotateCwButton,
+      pageRotateCcwButton
+    } = this.#opts;
+    firstPageButton.disabled = this.pageNumber <= 1;
+    lastPageButton.disabled = this.pageNumber >= this.pagesCount;
+    pageRotateCwButton.disabled = this.pagesCount === 0;
+    pageRotateCcwButton.disabled = this.pagesCount === 0;
+  }
+  #bindListeners(buttons) {
+    const {
+      eventBus
+    } = this;
+    const {
+      toggleButton
+    } = this.#opts;
+    toggleButton.addEventListener("click", this.toggle.bind(this));
+    for (const {
+      element,
+      eventName,
+      close,
+      eventDetails
+    } of buttons) {
+      element.addEventListener("click", evt => {
+        if (eventName !== null) {
+          eventBus.dispatch(eventName, {
+            source: this,
+            ...eventDetails
+          });
+        }
+        if (close) {
+          this.close();
+        }
+        eventBus.dispatch("reporttelemetry", {
+          source: this,
+          details: {
+            type: "buttons",
+            data: {
+              id: element.id
+            }
+          }
+        });
+      });
+    }
+    eventBus.on("cursortoolchanged", this.#cursorToolChanged.bind(this), internalOpt);
+    eventBus.on("scrollmodechanged", this.#scrollModeChanged.bind(this), internalOpt);
+    eventBus.on("spreadmodechanged", this.#spreadModeChanged.bind(this), internalOpt);
+  }
+  #cursorToolChanged({
+    tool,
+    disabled
+  }) {
+    const {
+      cursorSelectToolButton,
+      cursorHandToolButton
+    } = this.#opts;
+    toggleCheckedBtn(cursorSelectToolButton, tool === CursorTool.SELECT);
+    toggleCheckedBtn(cursorHandToolButton, tool === CursorTool.HAND);
+    cursorSelectToolButton.disabled = disabled;
+    cursorHandToolButton.disabled = disabled;
+  }
+  #scrollModeChanged({
+    mode
+  }) {
+    const {
+      scrollPageButton,
+      scrollVerticalButton,
+      scrollHorizontalButton,
+      scrollWrappedButton,
+      spreadNoneButton,
+      spreadOddButton,
+      spreadEvenButton
+    } = this.#opts;
+    toggleCheckedBtn(scrollPageButton, mode === ScrollMode.PAGE);
+    toggleCheckedBtn(scrollVerticalButton, mode === ScrollMode.VERTICAL);
+    toggleCheckedBtn(scrollHorizontalButton, mode === ScrollMode.HORIZONTAL);
+    toggleCheckedBtn(scrollWrappedButton, mode === ScrollMode.WRAPPED);
+    const forceScrollModePage = this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE;
+    scrollPageButton.disabled = forceScrollModePage;
+    scrollVerticalButton.disabled = forceScrollModePage;
+    scrollHorizontalButton.disabled = forceScrollModePage;
+    scrollWrappedButton.disabled = forceScrollModePage;
+    const isHorizontal = mode === ScrollMode.HORIZONTAL;
+    spreadNoneButton.disabled = isHorizontal;
+    spreadOddButton.disabled = isHorizontal;
+    spreadEvenButton.disabled = isHorizontal;
+  }
+  #spreadModeChanged({
+    mode
+  }) {
+    const {
+      spreadNoneButton,
+      spreadOddButton,
+      spreadEvenButton
+    } = this.#opts;
+    toggleCheckedBtn(spreadNoneButton, mode === SpreadMode.NONE);
+    toggleCheckedBtn(spreadOddButton, mode === SpreadMode.ODD);
+    toggleCheckedBtn(spreadEvenButton, mode === SpreadMode.EVEN);
+  }
+  open() {
+    if (this.opened) {
+      return;
+    }
+    this.opened = true;
+    const {
+      toggleButton,
+      toolbar
+    } = this.#opts;
+    toggleExpandedBtn(toggleButton, true, toolbar);
+  }
+  close() {
+    if (!this.opened) {
+      return;
+    }
+    this.opened = false;
+    const {
+      toggleButton,
+      toolbar
+    } = this.#opts;
+    toggleExpandedBtn(toggleButton, false, toolbar);
+  }
+  toggle() {
+    if (this.opened) {
+      this.close();
+    } else {
+      this.open();
+    }
+  }
+}
+
+;// ./web/signature_manager.js
+
+
+const DEFAULT_HEIGHT_IN_PAGE = 40;
+class SignatureManager {
+  #addButton;
+  #tabsToAltText = null;
+  #clearButton;
+  #clearDescription;
+  #currentEditor;
+  #description;
+  #dialog;
+  #drawCurves = null;
+  #drawPlaceholder;
+  #drawPath = null;
+  #drawPathString = "";
+  #drawPoints = null;
+  #drawSVG;
+  #drawThickness;
+  #errorBar;
+  #errorDescription;
+  #errorTitle;
+  #extractedSignatureData = null;
+  #imagePath = null;
+  #imagePicker;
+  #imagePickerLink;
+  #imagePlaceholder;
+  #imageSVG;
+  #saveCheckbox;
+  #saveContainer;
+  #tabButtons;
+  #addSignatureToolbarButton;
+  #loadSignaturesPromise = null;
+  #typeInput;
+  #currentTab = null;
+  #currentTabAC = null;
+  #hasDescriptionChanged = false;
+  #eventBus;
+  #isStorageFull = false;
+  #l10n;
+  #overlayManager;
+  #editDescriptionDialog;
+  #signatureStorage;
+  #uiManager = null;
+  static #l10nDescription = null;
+  constructor({
+    dialog,
+    panels,
+    typeButton,
+    typeInput,
+    drawButton,
+    drawPlaceholder,
+    drawSVG,
+    drawThickness,
+    imageButton,
+    imageSVG,
+    imagePlaceholder,
+    imagePicker,
+    imagePickerLink,
+    description,
+    clearButton,
+    cancelButton,
+    addButton,
+    errorCloseButton,
+    errorBar,
+    errorTitle,
+    errorDescription,
+    saveCheckbox,
+    saveContainer
+  }, editSignatureElements, addSignatureToolbarButton, overlayManager, l10n, signatureStorage, eventBus) {
+    this.#addButton = addButton;
+    this.#clearButton = clearButton;
+    this.#clearDescription = description.lastElementChild;
+    this.#description = description.firstElementChild;
+    this.#dialog = dialog;
+    this.#drawSVG = drawSVG;
+    this.#drawPlaceholder = drawPlaceholder;
+    this.#drawThickness = drawThickness;
+    this.#errorBar = errorBar;
+    this.#errorTitle = errorTitle;
+    this.#errorDescription = errorDescription;
+    this.#imageSVG = imageSVG;
+    this.#imagePlaceholder = imagePlaceholder;
+    this.#imagePicker = imagePicker;
+    this.#imagePickerLink = imagePickerLink;
+    this.#overlayManager = overlayManager;
+    this.#saveCheckbox = saveCheckbox;
+    this.#saveContainer = saveContainer;
+    this.#addSignatureToolbarButton = addSignatureToolbarButton;
+    this.#typeInput = typeInput;
+    this.#l10n = l10n;
+    this.#signatureStorage = signatureStorage;
+    this.#eventBus = eventBus;
+    this.#editDescriptionDialog = new EditDescriptionDialog(editSignatureElements, overlayManager);
+    SignatureManager.#l10nDescription ||= Object.freeze({
+      signature: "pdfjs-editor-add-signature-description-default-when-drawing",
+      errorUploadTitle: "pdfjs-editor-add-signature-image-upload-error-title",
+      errorUploadDescription: "pdfjs-editor-add-signature-image-upload-error-description",
+      errorNoDataTitle: "pdfjs-editor-add-signature-image-no-data-error-title",
+      errorNoDataDescription: "pdfjs-editor-add-signature-image-no-data-error-description"
+    });
+    dialog.addEventListener("close", this.#close.bind(this));
+    dialog.addEventListener("contextmenu", e => {
+      const {
+        target
+      } = e;
+      if (target !== this.#typeInput && target !== this.#description) {
+        e.preventDefault();
+      }
+    });
+    dialog.addEventListener("drop", e => {
+      stopEvent(e);
+    });
+    cancelButton.addEventListener("click", this.#cancel.bind(this));
+    addButton.addEventListener("click", this.#add.bind(this));
+    clearButton.addEventListener("click", () => {
+      this.#reportTelemetry({
+        type: "signature",
+        action: "pdfjs.signature.clear",
+        data: {
+          type: this.#currentTab
+        }
+      });
+      this.#initTab(null);
+    }, {
+      passive: true
+    });
+    this.#description.addEventListener("input", () => {
+      this.#clearDescription.disabled = this.#description.value === "";
+    }, {
+      passive: true
+    });
+    this.#clearDescription.addEventListener("click", () => {
+      this.#description.value = "";
+      this.#clearDescription.disabled = true;
+    }, {
+      passive: true
+    });
+    errorCloseButton.addEventListener("click", () => {
+      errorBar.hidden = true;
+    }, {
+      passive: true
+    });
+    this.#initTabButtons(typeButton, drawButton, imageButton, panels);
+    imagePicker.accept = SupportedImageMimeTypes.join(",");
+    eventBus.on("storedsignatureschanged", this.#signaturesChanged.bind(this), internalOpt);
+    overlayManager.register(dialog);
+  }
+  #initTabButtons(typeButton, drawButton, imageButton, panels) {
+    const buttons = this.#tabButtons = new Map([["type", typeButton], ["draw", drawButton], ["image", imageButton]]);
+    const tabCallback = e => {
+      for (const [name, button] of buttons) {
+        if (button === e.target) {
+          button.setAttribute("aria-selected", true);
+          button.setAttribute("tabindex", 0);
+          panels.setAttribute("data-selected", name);
+          this.#initTab(name);
+        } else {
+          button.setAttribute("aria-selected", false);
+          button.setAttribute("tabindex", -1);
+        }
+      }
+    };
+    const buttonsArray = Array.from(buttons.values());
+    for (let i = 0, ii = buttonsArray.length; i < ii; i++) {
+      const button = buttonsArray[i];
+      button.addEventListener("click", tabCallback, {
+        passive: true
+      });
+      button.addEventListener("keydown", ({
+        key
+      }) => {
+        if (key !== "ArrowLeft" && key !== "ArrowRight") {
+          return;
+        }
+        buttonsArray[i + (key === "ArrowLeft" ? -1 : 1)]?.focus();
+      }, {
+        passive: true
+      });
+    }
+  }
+  #resetCommon() {
+    this.#hasDescriptionChanged = false;
+    this.#description.value = "";
+    if (this.#currentTab) {
+      this.#tabsToAltText.get(this.#currentTab).value = "";
+    }
+  }
+  #resetTab(name) {
+    switch (name) {
+      case "type":
+        this.#typeInput.value = "";
+        break;
+      case "draw":
+        this.#drawCurves = null;
+        this.#drawPoints = null;
+        this.#drawPathString = "";
+        this.#drawPath?.remove();
+        this.#drawPath = null;
+        this.#drawPlaceholder.hidden = false;
+        this.#drawThickness.value = 1;
+        break;
+      case "image":
+        this.#imagePlaceholder.hidden = false;
+        this.#imagePath?.remove();
+        this.#imagePath = null;
+        break;
+    }
+  }
+  #initTab(name) {
+    if (name && this.#currentTab === name) {
+      return;
+    }
+    if (this.#currentTab) {
+      this.#tabsToAltText.get(this.#currentTab).value = this.#description.value;
+    }
+    if (name) {
+      this.#currentTab = name;
+    }
+    this.#errorBar.hidden = true;
+    const reset = !name;
+    if (reset) {
+      this.#resetCommon();
+    } else {
+      this.#description.value = this.#tabsToAltText.get(this.#currentTab).value;
+    }
+    this.#clearDescription.disabled = this.#description.value === "";
+    this.#currentTabAC?.abort();
+    this.#currentTabAC = new AbortController();
+    switch (this.#currentTab) {
+      case "type":
+        this.#initTypeTab(reset);
+        break;
+      case "draw":
+        this.#initDrawTab(reset);
+        break;
+      case "image":
+        this.#initImageTab(reset);
+        break;
+    }
+  }
+  #disableButtons(value) {
+    if (!value || !this.#isStorageFull) {
+      this.#saveCheckbox.disabled = !value;
+    }
+    this.#clearButton.disabled = this.#addButton.disabled = this.#description.disabled = !value;
+  }
+  #initTypeTab(reset) {
+    if (reset) {
+      this.#resetTab("type");
+    }
+    this.#disableButtons(this.#typeInput.value);
+    const {
+      signal
+    } = this.#currentTabAC;
+    const options = {
+      passive: true,
+      signal
+    };
+    this.#typeInput.addEventListener("input", () => {
+      const {
+        value
+      } = this.#typeInput;
+      if (!this.#hasDescriptionChanged) {
+        this.#tabsToAltText.get("type").default = this.#description.value = value;
+        this.#clearDescription.disabled = value === "";
+      }
+      this.#disableButtons(value);
+    }, options);
+    this.#description.addEventListener("input", () => {
+      this.#hasDescriptionChanged = this.#typeInput.value !== this.#description.value;
+    }, options);
+  }
+  #initDrawTab(reset) {
+    if (reset) {
+      this.#resetTab("draw");
+    }
+    this.#disableButtons(this.#drawPath);
+    const {
+      signal
+    } = this.#currentTabAC;
+    const options = {
+      signal
+    };
+    let currentPointerId = NaN;
+    const drawCallback = e => {
+      const {
+        pointerId
+      } = e;
+      if (!isNaN(currentPointerId) && currentPointerId !== pointerId) {
+        return;
+      }
+      currentPointerId = pointerId;
+      e.preventDefault();
+      this.#drawSVG.setPointerCapture(pointerId);
+      const {
+        width: drawWidth,
+        height: drawHeight
+      } = this.#drawSVG.getBoundingClientRect();
+      let {
+        offsetX,
+        offsetY
+      } = e;
+      offsetX = Math.round(offsetX);
+      offsetY = Math.round(offsetY);
+      if (e.target === this.#drawPlaceholder) {
+        this.#drawPlaceholder.hidden = true;
+      }
+      if (!this.#drawCurves) {
+        this.#drawCurves = {
+          width: drawWidth,
+          height: drawHeight,
+          thickness: parseInt(this.#drawThickness.value, 10),
+          curves: []
+        };
+        this.#disableButtons(true);
+        const svgFactory = new DOMSVGFactory();
+        const path = this.#drawPath = svgFactory.createElement("path");
+        path.setAttribute("stroke-width", this.#drawThickness.value);
+        this.#drawSVG.append(path);
+        this.#drawSVG.addEventListener("pointerdown", drawCallback, options);
+        this.#drawPlaceholder.removeEventListener("pointerdown", drawCallback);
+        if (this.#description.value === "") {
+          this.#l10n.get(SignatureManager.#l10nDescription.signature).then(description => {
+            this.#tabsToAltText.get("draw").default = description;
+            this.#description.value ||= description;
+            this.#clearDescription.disabled = this.#description.value === "";
+          });
+        }
+      }
+      this.#drawPoints = [offsetX, offsetY];
+      this.#drawCurves.curves.push({
+        points: this.#drawPoints
+      });
+      this.#drawPathString += `M ${offsetX} ${offsetY}`;
+      this.#drawPath.setAttribute("d", this.#drawPathString);
+      const finishDrawAC = new AbortController();
+      const listenerDrawOptions = {
+        signal: AbortSignal.any([signal, finishDrawAC.signal])
+      };
+      this.#drawSVG.addEventListener("contextmenu", noContextMenu, listenerDrawOptions);
+      this.#drawSVG.addEventListener("pointermove", evt => {
+        evt.preventDefault();
+        let {
+          offsetX: x,
+          offsetY: y
+        } = evt;
+        x = Math.round(x);
+        y = Math.round(y);
+        const drawPoints = this.#drawPoints;
+        if (x < 0 || y < 0 || x > drawWidth || y > drawHeight || x === drawPoints.at(-2) && y === drawPoints.at(-1)) {
+          return;
+        }
+        if (drawPoints.length >= 4) {
+          const [x1, y1, x2, y2] = drawPoints.slice(-4);
+          this.#drawPathString += `C${(x1 + 5 * x2) / 6} ${(y1 + 5 * y2) / 6} ${(5 * x2 + x) / 6} ${(5 * y2 + y) / 6} ${(x2 + x) / 2} ${(y2 + y) / 2}`;
+        } else {
+          this.#drawPathString += `L${x} ${y}`;
+        }
+        drawPoints.push(x, y);
+        this.#drawPath.setAttribute("d", this.#drawPathString);
+      }, listenerDrawOptions);
+      this.#drawSVG.addEventListener("pointerup", evt => {
+        const {
+          pointerId: pId
+        } = evt;
+        if (!isNaN(currentPointerId) && currentPointerId !== pId) {
+          return;
+        }
+        currentPointerId = NaN;
+        evt.preventDefault();
+        this.#drawSVG.releasePointerCapture(pId);
+        finishDrawAC.abort();
+        if (this.#drawPoints.length === 2) {
+          this.#drawPathString += `L${this.#drawPoints[0]} ${this.#drawPoints[1]}`;
+          this.#drawPath.setAttribute("d", this.#drawPathString);
+        }
+      }, listenerDrawOptions);
+    };
+    if (this.#drawCurves) {
+      this.#drawSVG.addEventListener("pointerdown", drawCallback, options);
+    } else {
+      this.#drawPlaceholder.addEventListener("pointerdown", drawCallback, options);
+    }
+    this.#drawThickness.addEventListener("input", () => {
+      const {
+        value: thickness
+      } = this.#drawThickness;
+      this.#drawThickness.setAttribute("data-l10n-args", JSON.stringify({
+        thickness
+      }));
+      if (!this.#drawCurves) {
+        return;
+      }
+      this.#drawPath.setAttribute("stroke-width", thickness);
+      this.#drawCurves.thickness = thickness;
+    }, options);
+  }
+  #showError(type) {
+    this.#errorTitle.setAttribute("data-l10n-id", SignatureManager.#l10nDescription[`error${type}Title`]);
+    this.#errorDescription.setAttribute("data-l10n-id", SignatureManager.#l10nDescription[`error${type}Description`]);
+    this.#errorBar.hidden = false;
+  }
+  #initImageTab(reset) {
+    if (reset) {
+      this.#resetTab("image");
+    }
+    this.#disableButtons(this.#imagePath);
+    const {
+      signal
+    } = this.#currentTabAC;
+    const options = {
+      signal
+    };
+    const passiveOptions = {
+      passive: true,
+      signal
+    };
+    this.#imagePickerLink.addEventListener("keydown", e => {
+      const {
+        key
+      } = e;
+      if (key === "Enter" || key === " ") {
+        stopEvent(e);
+        this.#imagePicker.click();
+      }
+    }, options);
+    this.#imagePicker.addEventListener("click", () => {
+      this.#dialog.classList.toggle("waiting", true);
+    }, passiveOptions);
+    this.#imagePicker.addEventListener("change", async () => {
+      const file = this.#imagePicker.files?.[0];
+      if (!file || !SupportedImageMimeTypes.includes(file.type)) {
+        this.#showError("Upload");
+        this.#dialog.classList.toggle("waiting", false);
+        return;
+      }
+      await this.#extractSignature(file);
+    }, passiveOptions);
+    this.#imagePicker.addEventListener("cancel", () => {
+      this.#dialog.classList.toggle("waiting", false);
+    }, passiveOptions);
+    this.#imagePlaceholder.addEventListener("dragover", e => {
+      const {
+        dataTransfer
+      } = e;
+      for (const {
+        type
+      } of dataTransfer.items) {
+        if (!SupportedImageMimeTypes.includes(type)) {
+          continue;
+        }
+        dataTransfer.dropEffect = dataTransfer.effectAllowed === "copy" ? "copy" : "move";
+        stopEvent(e);
+        return;
+      }
+      dataTransfer.dropEffect = "none";
+    }, options);
+    this.#imagePlaceholder.addEventListener("drop", e => {
+      const {
+        dataTransfer: {
+          files
+        }
+      } = e;
+      if (!files?.length) {
+        return;
+      }
+      for (const file of files) {
+        if (SupportedImageMimeTypes.includes(file.type)) {
+          this.#extractSignature(file);
+          break;
+        }
+      }
+      stopEvent(e);
+      this.#dialog.classList.toggle("waiting", true);
+    }, options);
+  }
+  async #extractSignature(file) {
+    let data;
+    try {
+      data = await this.#uiManager.imageManager.getFromFile(file);
+    } catch (e) {
+      console.error("SignatureManager.#extractSignature.", e);
+    }
+    if (!data) {
+      this.#showError("Upload");
+      this.#dialog.classList.toggle("waiting", false);
+      return;
+    }
+    const lineData = this.#extractedSignatureData = this.#currentEditor.getFromImage(data.bitmap);
+    if (!lineData) {
+      this.#showError("NoData");
+      this.#dialog.classList.toggle("waiting", false);
+      return;
+    }
+    const {
+      outline
+    } = lineData;
+    this.#imagePlaceholder.hidden = true;
+    this.#disableButtons(true);
+    const svgFactory = new DOMSVGFactory();
+    const path = this.#imagePath = svgFactory.createElement("path");
+    this.#imageSVG.setAttribute("viewBox", outline.viewBox);
+    this.#imageSVG.setAttribute("preserveAspectRatio", "xMidYMid meet");
+    this.#imageSVG.append(path);
+    path.setAttribute("d", outline.toSVGPath());
+    this.#tabsToAltText.get("image").default = file.name;
+    if (this.#description.value === "") {
+      this.#description.value = file.name || "";
+      this.#clearDescription.disabled = this.#description.value === "";
+    }
+    this.#dialog.classList.toggle("waiting", false);
+  }
+  #getOutlineForType() {
+    return this.#currentEditor.getFromText(this.#typeInput.value, window.getComputedStyle(this.#typeInput));
+  }
+  #getOutlineForDraw() {
+    const {
+      width,
+      height
+    } = this.#drawSVG.getBoundingClientRect();
+    return this.#currentEditor.getDrawnSignature(this.#drawCurves, width, height);
+  }
+  #reportTelemetry(data) {
+    this.#eventBus.dispatch("reporttelemetry", {
+      source: this,
+      details: {
+        type: "editing",
+        data
+      }
+    });
+  }
+  #addToolbarButton(signatureData, uuid, description) {
+    const {
+      curves,
+      areContours,
+      thickness,
+      width,
+      height
+    } = signatureData;
+    const maxDim = Math.max(width, height);
+    const outlineData = SignatureExtractor.processDrawnLines({
+      lines: {
+        curves,
+        thickness,
+        width,
+        height
+      },
+      pageWidth: maxDim,
+      pageHeight: maxDim,
+      rotation: 0,
+      innerMargin: 0,
+      mustSmooth: false,
+      areContours
+    });
+    if (!outlineData) {
+      return;
+    }
+    const {
+      outline
+    } = outlineData;
+    const svgFactory = new DOMSVGFactory();
+    const div = document.createElement("div");
+    const button = document.createElement("button");
+    button.addEventListener("click", () => {
+      this.#eventBus.dispatch("switchannotationeditorparams", {
+        source: this,
+        type: AnnotationEditorParamsType.CREATE,
+        value: {
+          signatureData: {
+            lines: {
+              curves,
+              thickness,
+              width,
+              height
+            },
+            mustSmooth: false,
+            areContours,
+            description,
+            uuid,
+            heightInPage: DEFAULT_HEIGHT_IN_PAGE
+          }
+        }
+      });
+    });
+    div.append(button);
+    div.classList.add("toolbarAddSignatureButtonContainer");
+    const svg = svgFactory.create(1, 1, true);
+    button.append(svg);
+    const span = document.createElement("span");
+    span.ariaHidden = true;
+    button.append(span);
+    button.classList.add("toolbarAddSignatureButton");
+    button.type = "button";
+    span.textContent = description;
+    button.setAttribute("data-l10n-id", "pdfjs-editor-add-saved-signature-button");
+    button.setAttribute("data-l10n-args", JSON.stringify({
+      description
+    }));
+    button.tabIndex = 0;
+    const path = svgFactory.createElement("path");
+    svg.append(path);
+    svg.setAttribute("viewBox", outline.viewBox);
+    svg.setAttribute("preserveAspectRatio", "xMidYMid meet");
+    if (areContours) {
+      path.classList.add("contours");
+    }
+    path.setAttribute("d", outline.toSVGPath());
+    const deleteButton = document.createElement("button");
+    div.append(deleteButton);
+    deleteButton.classList.add("toolbarButton", "deleteButton");
+    deleteButton.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button1");
+    deleteButton.type = "button";
+    deleteButton.tabIndex = 0;
+    deleteButton.addEventListener("click", async () => {
+      if (await this.#signatureStorage.delete(uuid)) {
+        div.remove();
+        this.#reportTelemetry({
+          type: "signature",
+          action: "pdfjs.signature.delete_saved",
+          data: {
+            savedCount: await this.#signatureStorage.size()
+          }
+        });
+      }
+    });
+    const deleteSpan = document.createElement("span");
+    deleteButton.append(deleteSpan);
+    deleteSpan.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button-label1");
+    this.#addSignatureToolbarButton.before(div);
+  }
+  async #signaturesChanged() {
+    const parent = this.#addSignatureToolbarButton.parentElement;
+    while (parent.firstElementChild !== this.#addSignatureToolbarButton) {
+      parent.firstElementChild.remove();
+    }
+    this.#loadSignaturesPromise = null;
+    await this.loadSignatures(true);
+  }
+  getSignature(params) {
+    return this.open(params);
+  }
+  async loadSignatures(reload = false) {
+    if (!this.#addSignatureToolbarButton || !reload && this.#addSignatureToolbarButton.previousElementSibling || !this.#signatureStorage) {
+      return;
+    }
+    if (!this.#loadSignaturesPromise) {
+      this.#loadSignaturesPromise = this.#signatureStorage.getAll().then(async signatures => [signatures, await Promise.all(Array.from(signatures.values(), ({
+        signatureData
+      }) => SignatureExtractor.decompressSignature(signatureData)))]);
+      if (!reload) {
+        return;
+      }
+    }
+    const [signatures, signaturesData] = await this.#loadSignaturesPromise;
+    this.#loadSignaturesPromise = null;
+    let i = 0;
+    for (const [uuid, {
+      description
+    }] of signatures) {
+      const data = signaturesData[i++];
+      if (!data) {
+        continue;
+      }
+      data.curves = data.outlines.map(points => ({
+        points
+      }));
+      delete data.outlines;
+      this.#addToolbarButton(data, uuid, description);
+    }
+  }
+  async renderEditButton(editor) {
+    const button = document.createElement("button");
+    button.classList.add("altText", "editDescription");
+    button.tabIndex = 0;
+    if (editor.description) {
+      button.title = editor.description;
+    }
+    const span = document.createElement("span");
+    button.append(span);
+    span.setAttribute("data-l10n-id", "pdfjs-editor-add-signature-edit-button-label");
+    button.addEventListener("click", () => {
+      this.#editDescriptionDialog.open(editor);
+    }, {
+      passive: true
+    });
+    return button;
+  }
+  async open({
+    uiManager,
+    editor
+  }) {
+    this.#tabsToAltText ||= new Map(this.#tabButtons.keys().map(name => [name, {
+      value: "",
+      default: ""
+    }]));
+    this.#uiManager = uiManager;
+    this.#currentEditor = editor;
+    this.#uiManager.removeEditListeners();
+    const isStorageFull = this.#isStorageFull = await this.#signatureStorage.isFull();
+    this.#saveContainer.classList.toggle("fullStorage", isStorageFull);
+    this.#saveCheckbox.checked = !isStorageFull;
+    await this.#overlayManager.open(this.#dialog);
+    const tabType = this.#tabButtons.get("type");
+    tabType.focus();
+    tabType.click();
+  }
+  #cancel() {
+    this.#finish();
+  }
+  #finish() {
+    this.#overlayManager.closeIfActive(this.#dialog);
+  }
+  #close() {
+    if (this.#currentEditor._drawId === null) {
+      this.#currentEditor.remove();
+    }
+    this.#uiManager?.addEditListeners();
+    this.#currentTabAC?.abort();
+    this.#currentTabAC = null;
+    this.#uiManager = null;
+    this.#currentEditor = null;
+    this.#resetCommon();
+    for (const [name] of this.#tabButtons) {
+      this.#resetTab(name);
+    }
+    this.#disableButtons(false);
+    this.#currentTab = null;
+    this.#tabsToAltText = null;
+  }
+  async #add() {
+    let data;
+    const type = this.#currentTab;
+    switch (type) {
+      case "type":
+        data = this.#getOutlineForType();
+        break;
+      case "draw":
+        data = this.#getOutlineForDraw();
+        break;
+      case "image":
+        data = this.#extractedSignatureData;
+        break;
+    }
+    let uuid = null;
+    const description = this.#description.value;
+    if (this.#saveCheckbox.checked) {
+      const {
+        newCurves,
+        areContours,
+        thickness,
+        width,
+        height
+      } = data;
+      const signatureData = await SignatureExtractor.compressSignature({
+        outlines: newCurves,
+        areContours,
+        thickness,
+        width,
+        height
+      });
+      uuid = await this.#signatureStorage.create({
+        description,
+        signatureData
+      });
+      if (uuid) {
+        this.#addToolbarButton({
+          curves: newCurves.map(points => ({
+            points
+          })),
+          areContours,
+          thickness,
+          width,
+          height
+        }, uuid, description);
+      } else {
+        console.warn("SignatureManager.add: cannot save the signature.");
+      }
+    }
+    const altText = this.#tabsToAltText.get(type);
+    this.#reportTelemetry({
+      type: "signature",
+      action: "pdfjs.signature.created",
+      data: {
+        type,
+        saved: !!uuid,
+        savedCount: await this.#signatureStorage.size(),
+        descriptionChanged: description !== altText.default
+      }
+    });
+    this.#currentEditor.addSignature(data, DEFAULT_HEIGHT_IN_PAGE, this.#description.value, uuid);
+    this.#finish();
+  }
+  destroy() {
+    this.#uiManager = null;
+    this.#finish();
+  }
+}
+class EditDescriptionDialog {
+  #currentEditor;
+  #previousDescription;
+  #description;
+  #dialog;
+  #overlayManager;
+  #signatureSVG;
+  #uiManager;
+  constructor({
+    dialog,
+    description,
+    cancelButton,
+    updateButton,
+    editSignatureView
+  }, overlayManager) {
+    const descriptionInput = this.#description = description.firstElementChild;
+    this.#signatureSVG = editSignatureView;
+    this.#dialog = dialog;
+    this.#overlayManager = overlayManager;
+    dialog.addEventListener("close", this.#close.bind(this));
+    dialog.addEventListener("contextmenu", e => {
+      if (e.target !== this.#description) {
+        e.preventDefault();
+      }
+    });
+    cancelButton.addEventListener("click", this.#cancel.bind(this));
+    updateButton.addEventListener("click", this.#update.bind(this));
+    const clearDescription = description.lastElementChild;
+    clearDescription.addEventListener("click", () => {
+      descriptionInput.value = "";
+      clearDescription.disabled = true;
+      updateButton.disabled = this.#previousDescription === "";
+    });
+    descriptionInput.addEventListener("input", () => {
+      const {
+        value
+      } = descriptionInput;
+      clearDescription.disabled = value === "";
+      updateButton.disabled = value === this.#previousDescription;
+      editSignatureView.setAttribute("aria-label", value);
+    }, {
+      passive: true
+    });
+    overlayManager.register(dialog);
+  }
+  async open(editor) {
+    this.#uiManager = editor._uiManager;
+    this.#currentEditor = editor;
+    this.#previousDescription = this.#description.value = editor.description;
+    this.#description.dispatchEvent(new Event("input"));
+    this.#uiManager.removeEditListeners();
+    const {
+      areContours,
+      outline
+    } = editor.getSignaturePreview();
+    const svgFactory = new DOMSVGFactory();
+    const path = svgFactory.createElement("path");
+    this.#signatureSVG.append(path);
+    this.#signatureSVG.setAttribute("viewBox", outline.viewBox);
+    path.setAttribute("d", outline.toSVGPath());
+    if (areContours) {
+      path.classList.add("contours");
+    }
+    await this.#overlayManager.open(this.#dialog);
+  }
+  async #update() {
+    this.#currentEditor._reportTelemetry({
+      action: "pdfjs.signature.edit_description",
+      data: {
+        hasBeenChanged: true
+      }
+    });
+    this.#currentEditor.description = this.#description.value;
+    this.#finish();
+  }
+  #cancel() {
+    this.#currentEditor._reportTelemetry({
+      action: "pdfjs.signature.edit_description",
+      data: {
+        hasBeenChanged: false
+      }
+    });
+    this.#finish();
+  }
+  #finish() {
+    this.#overlayManager.closeIfActive(this.#dialog);
+  }
+  #close() {
+    this.#uiManager?.addEditListeners();
+    this.#uiManager = null;
+    this.#currentEditor = null;
+    this.#signatureSVG.firstElementChild.remove();
+  }
+}
+
+;// ./web/toolbar.js
+
+
+
+class Toolbar {
+  #colorPicker = null;
+  #opts;
+  constructor(options, eventBus, toolbarDensity = 0) {
+    this.#opts = options;
+    this.eventBus = eventBus;
+    const buttons = [{
+      element: options.previous,
+      eventName: "previouspage"
+    }, {
+      element: options.next,
+      eventName: "nextpage"
+    }, {
+      element: options.zoomIn,
+      eventName: "zoomin"
+    }, {
+      element: options.zoomOut,
+      eventName: "zoomout"
+    }, {
+      element: options.print,
+      eventName: "print"
+    }, {
+      element: options.download,
+      eventName: "download"
+    }, {
+      element: options.editorCommentButton,
+      eventName: "switchannotationeditormode",
+      eventDetails: {
+        get mode() {
+          const {
+            classList
+          } = options.editorCommentButton;
+          return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.POPUP;
+        }
+      }
+    }, {
+      element: options.editorFreeTextButton,
+      eventName: "switchannotationeditormode",
+      eventDetails: {
+        get mode() {
+          const {
+            classList
+          } = options.editorFreeTextButton;
+          return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.FREETEXT;
+        }
+      }
+    }, {
+      element: options.editorHighlightButton,
+      eventName: "switchannotationeditormode",
+      eventDetails: {
+        get mode() {
+          const {
+            classList
+          } = options.editorHighlightButton;
+          return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.HIGHLIGHT;
+        }
+      }
+    }, {
+      element: options.editorInkButton,
+      eventName: "switchannotationeditormode",
+      eventDetails: {
+        get mode() {
+          const {
+            classList
+          } = options.editorInkButton;
+          return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.INK;
+        }
+      }
+    }, {
+      element: options.editorStampButton,
+      eventName: "switchannotationeditormode",
+      eventDetails: {
+        get mode() {
+          const {
+            classList
+          } = options.editorStampButton;
+          return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.STAMP;
+        }
+      },
+      telemetry: {
+        type: "editing",
+        data: {
+          action: "pdfjs.image.icon_click"
+        }
+      }
+    }, {
+      element: options.editorSignatureButton,
+      eventName: "switchannotationeditormode",
+      eventDetails: {
+        get mode() {
+          const {
+            classList
+          } = options.editorSignatureButton;
+          return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.SIGNATURE;
+        }
+      }
+    }];
+    this.#bindListeners(buttons);
+    this.#updateToolbarDensity({
+      value: toolbarDensity
+    });
+    this.reset();
+  }
+  #updateToolbarDensity({
+    value
+  }) {
+    let name = "normal";
+    switch (value) {
+      case 1:
+        name = "compact";
+        break;
+      case 2:
+        name = "touch";
+        break;
+    }
+    document.documentElement.setAttribute("data-toolbar-density", name);
+  }
+  setPageNumber(pageNumber, pageLabel) {
+    this.pageNumber = pageNumber;
+    this.pageLabel = pageLabel;
+    this.#updateUIState(false);
+  }
+  setPagesCount(pagesCount, hasPageLabels) {
+    this.pagesCount = pagesCount;
+    this.hasPageLabels = hasPageLabels;
+    this.#updateUIState(true);
+  }
+  setPageScale(pageScaleValue, pageScale) {
+    this.pageScaleValue = (pageScaleValue || pageScale).toString();
+    this.pageScale = pageScale;
+    this.#updateUIState(false);
+  }
+  reset() {
+    this.#colorPicker = null;
+    this.pageNumber = 0;
+    this.pageLabel = null;
+    this.hasPageLabels = false;
+    this.pagesCount = 0;
+    this.pageScaleValue = DEFAULT_SCALE_VALUE;
+    this.pageScale = DEFAULT_SCALE;
+    this.#updateUIState(true);
+    this.updateLoadingIndicatorState();
+    this.#editorModeChanged({
+      mode: AnnotationEditorType.DISABLE
+    });
+  }
+  #bindListeners(buttons) {
+    const {
+      eventBus
+    } = this;
+    const {
+      editorHighlightColorPicker,
+      editorHighlightButton,
+      pageNumber,
+      scaleSelect
+    } = this.#opts;
+    const self = this;
+    for (const {
+      element,
+      eventName,
+      eventDetails,
+      telemetry
+    } of buttons) {
+      element.addEventListener("click", evt => {
+        if (eventName !== null) {
+          eventBus.dispatch(eventName, {
+            source: this,
+            ...eventDetails,
+            isFromKeyboard: evt.detail === 0
+          });
+        }
+        if (telemetry) {
+          eventBus.dispatch("reporttelemetry", {
+            source: this,
+            details: telemetry
+          });
+        }
+      });
+    }
+    pageNumber.addEventListener("click", function () {
+      this.select();
+    });
+    pageNumber.addEventListener("change", function () {
+      eventBus.dispatch("pagenumberchanged", {
+        source: self,
+        value: this.value
+      });
+    });
+    eventBus.on("pagesedited", ({
+      pagesMapper
+    }) => {
+      const pagesCount = pagesMapper.pagesNumber;
+      if (pagesCount !== this.pagesCount) {
+        this.setPagesCount(pagesCount, this.hasPageLabels);
+      }
+    }, internalOpt);
+    scaleSelect.addEventListener("change", function () {
+      if (this.value === "custom") {
+        return;
+      }
+      eventBus.dispatch("scalechanged", {
+        source: self,
+        value: this.value
+      });
+    });
+    scaleSelect.addEventListener("click", function ({
+      target
+    }) {
+      if (this.value === self.pageScaleValue && target.tagName.toUpperCase() === "OPTION") {
+        this.blur();
+      }
+    });
+    scaleSelect.oncontextmenu = noContextMenu;
+    eventBus.on("annotationeditormodechanged", this.#editorModeChanged.bind(this), internalOpt);
+    eventBus.on("showannotationeditorui", ({
+      mode
+    }) => {
+      switch (mode) {
+        case AnnotationEditorType.HIGHLIGHT:
+          editorHighlightButton.click();
+          break;
+      }
+    }, internalOpt);
+    eventBus.on("toolbardensity", this.#updateToolbarDensity.bind(this), internalOpt);
+    if (editorHighlightColorPicker) {
+      eventBus.on("annotationeditoruimanager", ({
+        uiManager
+      }) => {
+        const cp = this.#colorPicker = new ColorPicker({
+          uiManager
+        });
+        uiManager.setMainHighlightColorPicker(cp);
+        editorHighlightColorPicker.append(cp.renderMainDropdown());
+      }, internalOpt);
+      eventBus.on("mainhighlightcolorpickerupdatecolor", ({
+        value
+      }) => {
+        this.#colorPicker?.updateColor(value);
+      }, internalOpt);
+    }
+  }
+  #editorModeChanged({
+    mode
+  }) {
+    const {
+      editorCommentButton,
+      editorCommentParamsToolbar,
+      editorFreeTextButton,
+      editorFreeTextParamsToolbar,
+      editorHighlightButton,
+      editorHighlightParamsToolbar,
+      editorInkButton,
+      editorInkParamsToolbar,
+      editorStampButton,
+      editorStampParamsToolbar,
+      editorSignatureButton,
+      editorSignatureParamsToolbar
+    } = this.#opts;
+    toggleExpandedBtn(editorCommentButton, mode === AnnotationEditorType.POPUP, editorCommentParamsToolbar);
+    toggleExpandedBtn(editorFreeTextButton, mode === AnnotationEditorType.FREETEXT, editorFreeTextParamsToolbar);
+    toggleExpandedBtn(editorHighlightButton, mode === AnnotationEditorType.HIGHLIGHT, editorHighlightParamsToolbar);
+    toggleExpandedBtn(editorInkButton, mode === AnnotationEditorType.INK, editorInkParamsToolbar);
+    toggleExpandedBtn(editorStampButton, mode === AnnotationEditorType.STAMP, editorStampParamsToolbar);
+    toggleExpandedBtn(editorSignatureButton, mode === AnnotationEditorType.SIGNATURE, editorSignatureParamsToolbar);
+    editorCommentButton.disabled = editorFreeTextButton.disabled = editorHighlightButton.disabled = editorInkButton.disabled = editorStampButton.disabled = editorSignatureButton.disabled = mode === AnnotationEditorType.DISABLE;
+  }
+  #updateUIState(resetNumPages = false) {
+    const {
+      pageNumber,
+      pagesCount,
+      pageScaleValue,
+      pageScale
+    } = this;
+    const opts = this.#opts;
+    if (resetNumPages) {
+      if (this.hasPageLabels) {
+        opts.pageNumber.type = "text";
+        opts.numPages.setAttribute("data-l10n-id", "pdfjs-page-of-pages");
+      } else {
+        opts.pageNumber.type = "number";
+        opts.numPages.setAttribute("data-l10n-id", "pdfjs-of-pages");
+        opts.numPages.setAttribute("data-l10n-args", JSON.stringify({
+          pagesCount
+        }));
+      }
+      opts.pageNumber.max = pagesCount;
+    }
+    if (this.hasPageLabels) {
+      opts.pageNumber.value = this.pageLabel;
+      opts.numPages.setAttribute("data-l10n-args", JSON.stringify({
+        pageNumber,
+        pagesCount
+      }));
+    } else {
+      opts.pageNumber.value = pageNumber;
+    }
+    opts.previous.disabled = pageNumber <= 1;
+    opts.next.disabled = pageNumber >= pagesCount;
+    opts.zoomOut.disabled = pageScale <= MIN_SCALE;
+    opts.zoomIn.disabled = pageScale >= MAX_SCALE;
+    let predefinedValueFound = false;
+    for (const option of opts.scaleSelect.options) {
+      if (option.value !== pageScaleValue) {
+        option.selected = false;
+        continue;
+      }
+      option.selected = true;
+      predefinedValueFound = true;
+    }
+    if (!predefinedValueFound) {
+      opts.customScaleOption.selected = true;
+      opts.customScaleOption.setAttribute("data-l10n-args", JSON.stringify({
+        scale: Math.round(pageScale * 10000) / 100
+      }));
+    }
+  }
+  updateLoadingIndicatorState(loading = false) {
+    const {
+      pageNumber
+    } = this.#opts;
+    pageNumber.classList.toggle("loading", loading);
+  }
+}
+
+;// ./web/view_history.js
+const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;
+class ViewHistory {
+  constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) {
+    this.fingerprint = fingerprint;
+    this.cacheSize = cacheSize;
+    this._initializedPromise = this._readFromStorage().then(databaseStr => {
+      const database = JSON.parse(databaseStr || "{}");
+      let index = -1;
+      if (!Array.isArray(database.files)) {
+        database.files = [];
+      } else {
+        while (database.files.length >= this.cacheSize) {
+          database.files.shift();
+        }
+        for (let i = 0, ii = database.files.length; i < ii; i++) {
+          const branch = database.files[i];
+          if (branch.fingerprint === this.fingerprint) {
+            index = i;
+            break;
+          }
+        }
+      }
+      if (index === -1) {
+        index = database.files.push({
+          fingerprint: this.fingerprint
+        }) - 1;
+      }
+      this.file = database.files[index];
+      this.database = database;
+    });
+  }
+  async _writeToStorage() {
+    const databaseStr = JSON.stringify(this.database);
+    localStorage.setItem("pdfjs.history", databaseStr);
+  }
+  async _readFromStorage() {
+    return localStorage.getItem("pdfjs.history");
+  }
+  async set(name, val) {
+    await this._initializedPromise;
+    this.file[name] = val;
+    return this._writeToStorage();
+  }
+  async setMultiple(properties) {
+    await this._initializedPromise;
+    for (const name in properties) {
+      this.file[name] = properties[name];
+    }
+    return this._writeToStorage();
+  }
+  async get(name, defaultValue) {
+    await this._initializedPromise;
+    const val = this.file[name];
+    return val !== undefined ? val : defaultValue;
+  }
+  async getMultiple(properties) {
+    await this._initializedPromise;
+    const values = Object.create(null);
+    for (const name in properties) {
+      const val = this.file[name];
+      values[name] = val !== undefined ? val : properties[name];
+    }
+    return values;
+  }
+}
+
+;// ./web/views_manager.js
+
+
+
+
+const SIDEBAR_WIDTH_VAR = "--viewsManager-width";
+const SIDEBAR_RESIZING_CLASS = "viewsManagerResizing";
+const UI_NOTIFICATION_CLASS = "pdfSidebarNotification";
+class ViewsManager extends Sidebar {
+  static #l10nDescription = null;
+  #hasAnimations = !window.matchMedia("(prefers-reduced-motion: reduce)").matches;
+  constructor({
+    elements: {
+      outerContainer,
+      sidebarContainer,
+      toggleButton,
+      resizer,
+      thumbnailButton,
+      outlineButton,
+      attachmentsButton,
+      layersButton,
+      thumbnailsView,
+      outlinesView,
+      attachmentsView,
+      layersView,
+      viewsManagerAddFile: {
+        button: viewsManagerAddFileButton
+      },
+      viewsManagerCurrentOutlineButton,
+      viewsManagerSelectorButton,
+      viewsManagerSelectorOptions,
+      viewsManagerHeaderLabel,
+      viewsManagerStatus
+    },
+    eventBus,
+    l10n,
+    enableMerge = false,
+    enableSplitMerge = false,
+    globalAbortSignal
+  }) {
+    super({
+      sidebar: sidebarContainer,
+      resizer,
+      toggleButton
+    }, l10n.getDirection() === "ltr", false, globalAbortSignal);
+    this.isOpen = false;
+    this.active = SidebarView.THUMBS;
+    this.isInitialViewSet = false;
+    this.isInitialEventDispatched = false;
+    this.onToggled = null;
+    this.onUpdateThumbnails = null;
+    this.outerContainer = outerContainer;
+    this.sidebarContainer = sidebarContainer;
+    this.toggleButton = toggleButton;
+    this.resizer = resizer;
+    this.thumbnailButton = thumbnailButton;
+    this.outlineButton = outlineButton;
+    this.attachmentsButton = attachmentsButton;
+    this.layersButton = layersButton;
+    this.thumbnailsView = thumbnailsView;
+    this.outlinesView = outlinesView;
+    this.attachmentsView = attachmentsView;
+    this.layersView = layersView;
+    this.viewsManagerAddFileButton = viewsManagerAddFileButton;
+    this.viewsManagerCurrentOutlineButton = viewsManagerCurrentOutlineButton;
+    this.viewsManagerHeaderLabel = viewsManagerHeaderLabel;
+    this.viewsManagerStatus = viewsManagerStatus;
+    this.eventBus = eventBus;
+    if (!enableSplitMerge) {
+      viewsManagerStatus.hidden = true;
+    }
+    this._enableSplitMerge = enableSplitMerge;
+    this._enableMerge = enableMerge;
+    if (!enableMerge) {
+      viewsManagerAddFileButton.hidden = true;
+    }
+    this.menu = new Menu(viewsManagerSelectorOptions, viewsManagerSelectorButton, [thumbnailButton, outlineButton, attachmentsButton, layersButton]);
+    ViewsManager.#l10nDescription ||= Object.freeze({
+      pagesTitle: "pdfjs-views-manager-pages-title",
+      outlinesTitle: "pdfjs-views-manager-outlines-title1",
+      attachmentsTitle: "pdfjs-views-manager-attachments-title",
+      layersTitle: "pdfjs-views-manager-layers-title1",
+      notificationButton: "pdfjs-toggle-views-manager-notification-button",
+      toggleButton: "pdfjs-toggle-views-manager-button1"
+    });
+    this.#addEventListeners();
+  }
+  reset() {
+    this.isInitialViewSet = false;
+    this.isInitialEventDispatched = false;
+    this.#hideUINotification(true);
+    this.switchView(SidebarView.THUMBS);
+    this.outlineButton.disabled = this.attachmentsButton.disabled = this.layersButton.disabled = false;
+    this.viewsManagerCurrentOutlineButton.disabled = true;
+  }
+  get visibleView() {
+    return this.isOpen ? this.active : SidebarView.NONE;
+  }
+  setInitialView(view = SidebarView.NONE) {
+    if (this.isInitialViewSet) {
+      return;
+    }
+    this.isInitialViewSet = true;
+    if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) {
+      this.#dispatchEvent();
+      return;
+    }
+    this.switchView(view, true);
+    if (!this.isInitialEventDispatched) {
+      this.#dispatchEvent();
+    }
+  }
+  switchView(view, forceOpen = false) {
+    const isViewChanged = view !== this.active;
+    let forceRendering = false;
+    let titleL10nId = null;
+    switch (view) {
+      case SidebarView.NONE:
+        if (this.isOpen) {
+          this.close();
+        }
+        return;
+      case SidebarView.THUMBS:
+        titleL10nId = "pagesTitle";
+        if (this.isOpen && isViewChanged) {
+          forceRendering = true;
+        }
+        break;
+      case SidebarView.OUTLINE:
+        titleL10nId = "outlinesTitle";
+        if (this.outlineButton.disabled) {
+          return;
+        }
+        break;
+      case SidebarView.ATTACHMENTS:
+        titleL10nId = "attachmentsTitle";
+        if (this.attachmentsButton.disabled) {
+          return;
+        }
+        break;
+      case SidebarView.LAYERS:
+        titleL10nId = "layersTitle";
+        if (this.layersButton.disabled) {
+          return;
+        }
+        break;
+      default:
+        console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`);
+        return;
+    }
+    this.viewsManagerStatus.hidden = !this._enableSplitMerge || view !== SidebarView.THUMBS;
+    this.viewsManagerAddFileButton.hidden = !this._enableMerge || view !== SidebarView.THUMBS;
+    this.viewsManagerCurrentOutlineButton.hidden = view !== SidebarView.OUTLINE;
+    this.viewsManagerHeaderLabel.setAttribute("data-l10n-id", ViewsManager.#l10nDescription[titleL10nId] || "");
+    this.active = view;
+    toggleSelectedBtn(this.thumbnailButton, view === SidebarView.THUMBS, this.thumbnailsView);
+    toggleSelectedBtn(this.outlineButton, view === SidebarView.OUTLINE, this.outlinesView);
+    toggleSelectedBtn(this.attachmentsButton, view === SidebarView.ATTACHMENTS, this.attachmentsView);
+    toggleSelectedBtn(this.layersButton, view === SidebarView.LAYERS, this.layersView);
+    if (forceOpen && !this.isOpen) {
+      this.open();
+      return;
+    }
+    if (forceRendering) {
+      this.onUpdateThumbnails();
+      this.onToggled();
+    }
+    if (isViewChanged) {
+      this.#dispatchEvent();
+    }
+  }
+  open() {
+    if (this.isOpen) {
+      return;
+    }
+    this.isOpen = true;
+    this.onResizing(this.width);
+    this._sidebar.hidden = false;
+    toggleExpandedBtn(this.toggleButton, true);
+    this.switchView(this.active);
+    if (this.#hasAnimations) {
+      queueMicrotask(() => {
+        this.outerContainer.classList.add("viewsManagerMoving", "viewsManagerOpen");
+      });
+    } else {
+      this.outerContainer.classList.add("viewsManagerOpen");
+      this.eventBus.dispatch("resize", {
+        source: this
+      });
+    }
+    if (this.active === SidebarView.THUMBS) {
+      this.onUpdateThumbnails();
+    }
+    this.onToggled();
+    this.#dispatchEvent();
+    this.#hideUINotification();
+  }
+  close(evt = null) {
+    if (!this.isOpen) {
+      return;
+    }
+    this.isOpen = false;
+    this._sidebar.hidden = true;
+    toggleExpandedBtn(this.toggleButton, false);
+    this.outerContainer.classList.add("viewsManagerMoving");
+    this.outerContainer.classList.remove("viewsManagerOpen");
+    this.onToggled();
+    this.#dispatchEvent();
+    if (evt?.detail > 0) {
+      this.toggleButton.blur();
+    }
+  }
+  toggle(evt = null) {
+    super.toggle();
+    if (this.isOpen) {
+      this.close(evt);
+    } else {
+      this.open();
+    }
+  }
+  #dispatchEvent() {
+    if (this.isInitialViewSet) {
+      this.isInitialEventDispatched ||= true;
+    }
+    this.eventBus.dispatch("sidebarviewchanged", {
+      source: this,
+      view: this.visibleView
+    });
+  }
+  #showUINotification() {
+    this.toggleButton.setAttribute("data-l10n-id", ViewsManager.#l10nDescription.notificationButton);
+    if (!this.isOpen) {
+      this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);
+    }
+  }
+  #hideUINotification(reset = false) {
+    if (this.isOpen || reset) {
+      this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);
+    }
+    if (reset) {
+      this.toggleButton.setAttribute("data-l10n-id", ViewsManager.#l10nDescription.toggleButton);
+    }
+  }
+  #addEventListeners() {
+    const {
+      eventBus,
+      outerContainer
+    } = this;
+    if (this.#hasAnimations) {
+      this.sidebarContainer.addEventListener("transitionend", evt => {
+        if (evt.target === this.sidebarContainer) {
+          outerContainer.classList.remove("viewsManagerMoving");
+          eventBus.dispatch("resize", {
+            source: this
+          });
+        }
+      });
+    }
+    this.viewsManagerHeaderLabel.addEventListener("dblclick", e => {
+      if (this.active === SidebarView.OUTLINE) {
+        eventBus.dispatch("toggleoutlinetree", {
+          source: this
+        });
+        return;
+      }
+      if (this.active === SidebarView.LAYERS) {
+        eventBus.dispatch("resetlayers", {
+          source: this
+        });
+      }
+    });
+    this.thumbnailButton.addEventListener("click", () => {
+      this.switchView(SidebarView.THUMBS);
+    });
+    this.outlineButton.addEventListener("click", () => {
+      this.switchView(SidebarView.OUTLINE);
+    });
+    this.attachmentsButton.addEventListener("click", () => {
+      this.switchView(SidebarView.ATTACHMENTS);
+    });
+    this.layersButton.addEventListener("click", () => {
+      this.switchView(SidebarView.LAYERS);
+    });
+    this.viewsManagerCurrentOutlineButton.addEventListener("click", () => {
+      eventBus.dispatch("currentoutlineitem", {
+        source: this
+      });
+    });
+    const onTreeLoaded = (count, button, view) => {
+      button.disabled = !count;
+      if (count) {
+        this.#showUINotification();
+      } else if (this.active === view) {
+        this.switchView(SidebarView.THUMBS);
+      }
+    };
+    eventBus.on("outlineloaded", evt => {
+      onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE);
+      evt.currentOutlineItemPromise.then(enabled => {
+        if (!this.isInitialViewSet) {
+          return;
+        }
+        this.viewsManagerCurrentOutlineButton.disabled = !enabled;
+      });
+    }, internalOpt);
+    eventBus.on("attachmentsloaded", evt => {
+      onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, SidebarView.ATTACHMENTS);
+    }, internalOpt);
+    eventBus.on("layersloaded", evt => {
+      onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS);
+    }, internalOpt);
+    eventBus.on("presentationmodechanged", evt => {
+      if (evt.state === PresentationModeState.NORMAL && this.visibleView === SidebarView.THUMBS) {
+        this.onUpdateThumbnails();
+      }
+    }, internalOpt);
+  }
+  onStartResizing() {
+    this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);
+  }
+  onStopResizing() {
+    this.eventBus.dispatch("resize", {
+      source: this
+    });
+    this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);
+  }
+  onResizing(newWidth) {
+    docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${newWidth}px`);
+  }
+}
+
+;// ./web/app.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const FORCE_PAGES_LOADED_TIMEOUT = 10000;
+const ViewOnLoad = {
+  UNKNOWN: -1,
+  PREVIOUS: 0,
+  INITIAL: 1
+};
+const PDFViewerApplication = {
+  initialBookmark: document.location.hash.substring(1),
+  _initializedCapability: {
+    ...Promise.withResolvers(),
+    settled: false
+  },
+  appConfig: null,
+  pdfDocument: null,
+  pdfLoadingTask: null,
+  printService: null,
+  pdfViewer: null,
+  pdfThumbnailViewer: null,
+  pdfRenderingQueue: null,
+  pdfPresentationMode: null,
+  pdfDocumentProperties: null,
+  pdfLinkService: null,
+  pdfTextExtractor: null,
+  pdfHistory: null,
+  viewsManager: null,
+  pdfOutlineViewer: null,
+  pdfAttachmentViewer: null,
+  pdfLayerViewer: null,
+  pdfCursorTools: null,
+  pdfScriptingManager: null,
+  store: null,
+  downloadManager: null,
+  overlayManager: null,
+  preferences: new Preferences(),
+  toolbar: null,
+  secondaryToolbar: null,
+  eventBus: null,
+  l10n: null,
+  annotationEditorParams: null,
+  imageAltTextSettings: null,
+  isInitialViewSet: false,
+  isViewerEmbedded: window.parent !== window,
+  url: "",
+  baseUrl: "",
+  mlManager: null,
+  _downloadUrl: "",
+  _eventBusAC: null,
+  _windowAC: null,
+  _globalAbortController: new AbortController(),
+  documentInfo: null,
+  metadata: null,
+  _contentDispositionFilename: null,
+  _contentLength: null,
+  _saveInProgress: false,
+  _wheelUnusedTicks: 0,
+  _wheelUnusedFactor: 1,
+  _touchManager: null,
+  _touchUnusedTicks: 0,
+  _touchUnusedFactor: 1,
+  _PDFBug: null,
+  _hasAnnotationEditors: false,
+  _title: document.title,
+  _printAnnotationStoragePromise: null,
+  _isCtrlKeyDown: false,
+  _caretBrowsing: null,
+  _isScrolling: false,
+  editorUndoBar: null,
+  _printPermissionPromise: null,
+  async initialize(appConfig) {
+    this.appConfig = appConfig;
+    try {
+      await this.preferences.initializedPromise;
+    } catch (ex) {
+      console.error("initialize:", ex);
+    }
+    if (AppOptions.get("pdfBugEnabled")) {
+      await this._parseHashParams();
+    }
+    let mode;
+    switch (AppOptions.get("viewerCssTheme")) {
+      case 1:
+        mode = "light";
+        break;
+      case 2:
+        mode = "dark";
+        break;
+    }
+    if (mode) {
+      docStyle.setProperty("color-scheme", mode);
+    }
+    this.l10n = await this.externalServices.createL10n();
+    document.getElementsByTagName("html")[0].dir = this.l10n.getDirection();
+    this.l10n.translate(appConfig.appContainer || document.documentElement);
+    if (this.isViewerEmbedded && AppOptions.get("externalLinkTarget") === LinkTarget.NONE) {
+      AppOptions.set("externalLinkTarget", LinkTarget.TOP);
+    }
+    await this._initializeViewerComponents();
+    this.bindEvents();
+    this.bindWindowEvents();
+    this._initializedCapability.settled = true;
+    this._initializedCapability.resolve();
+  },
+  async _parseHashParams() {
+    const hash = document.location.hash.substring(1);
+    if (!hash) {
+      return;
+    }
+    const {
+        mainContainer,
+        viewerContainer
+      } = this.appConfig,
+      params = parseQueryString(hash);
+    const loadPDFBug = async () => {
+      if (this._PDFBug) {
+        return;
+      }
+      const {
+        PDFBug
+      } = await import(
+      /*webpackIgnore: true*/
+      /*@vite-ignore*/
+      AppOptions.get("debuggerSrc"));
+      this._PDFBug = PDFBug;
+    };
+    if (params.get("disableworker") === "true") {
+      try {
+        GlobalWorkerOptions.workerSrc ||= AppOptions.get("workerSrc");
+        await import(
+        /*webpackIgnore: true*/
+        /*@vite-ignore*/
+        PDFWorker.workerSrc);
+        AppOptions.set("workerPort", null);
+      } catch (ex) {
+        console.error("_parseHashParams:", ex);
+      }
+    }
+    if (params.has("textlayer")) {
+      switch (params.get("textlayer")) {
+        case "off":
+          AppOptions.set("textLayerMode", TextLayerMode.DISABLE);
+          break;
+        case "visible":
+        case "shadow":
+        case "hover":
+          viewerContainer.classList.add(`textLayer-${params.get("textlayer")}`);
+          try {
+            await loadPDFBug();
+            this._PDFBug.loadCSS();
+          } catch (ex) {
+            console.error("_parseHashParams:", ex);
+          }
+          break;
+      }
+    }
+    if (params.has("pdfbug")) {
+      const enabled = params.get("pdfbug").split(",");
+      try {
+        await loadPDFBug();
+        this._PDFBug.init(mainContainer, enabled);
+      } catch (ex) {
+        console.error("_parseHashParams:", ex);
+      }
+      const debugOpts = {
+        pdfBug: true,
+        fontExtraProperties: true
+      };
+      if (globalThis.StepperManager?.enabled) {
+        debugOpts.minDurationToUpdateCanvas = 0;
+      }
+      AppOptions.setAll(debugOpts);
+    }
+    if (params.has("locale")) {
+      AppOptions.set("localeProperties", {
+        lang: params.get("locale")
+      });
+    }
+    const opts = {
+      disableAutoFetch: x => x === "true",
+      disableFontFace: x => x === "true",
+      disableHistory: x => x === "true",
+      disableRange: x => x === "true",
+      disableStream: x => x === "true",
+      verbosity: x => x | 0
+    };
+    for (const name in opts) {
+      const check = opts[name],
+        key = name.toLowerCase();
+      if (params.has(key)) {
+        AppOptions.set(name, check(params.get(key)));
+      }
+    }
+  },
+  async _initializeViewerComponents() {
+    const {
+      appConfig,
+      externalServices,
+      l10n,
+      mlManager
+    } = this;
+    const abortSignal = this._globalAbortController.signal;
+    const eventBus = new EventBus();
+    this.eventBus = AppOptions.eventBus = eventBus;
+    mlManager?.setEventBus(eventBus, abortSignal);
+    const overlayManager = this.overlayManager = new OverlayManager();
+    const renderingQueue = this.pdfRenderingQueue = new PDFRenderingQueue();
+    renderingQueue.onIdle = this._cleanup.bind(this);
+    const linkService = this.pdfLinkService = new PDFLinkService({
+      eventBus,
+      externalLinkTarget: AppOptions.get("externalLinkTarget"),
+      externalLinkRel: AppOptions.get("externalLinkRel"),
+      ignoreDestinationZoom: AppOptions.get("ignoreDestinationZoom")
+    });
+    const supportsDownloading = AppOptions.get("supportsDownloading");
+    const downloadManager = this.downloadManager = supportsDownloading ? new DownloadManager() : null;
+    if (appConfig.secondaryToolbar?.downloadButton) {
+      appConfig.secondaryToolbar.downloadButton.hidden = !supportsDownloading;
+    }
+    if (appConfig.toolbar?.download) {
+      appConfig.toolbar.download.hidden = !supportsDownloading;
+    }
+    const findController = this.findController = new PDFFindController({
+      linkService,
+      eventBus,
+      updateMatchesCountOnProgress: true
+    });
+    const pdfScriptingManager = this.pdfScriptingManager = new PDFScriptingManager({
+      eventBus,
+      externalServices,
+      docProperties: this._scriptingDocProperties.bind(this)
+    });
+    const container = appConfig.mainContainer,
+      viewer = appConfig.viewerContainer;
+    const annotationEditorMode = AppOptions.get("annotationEditorMode");
+    const hasForcedColors = AppOptions.get("forcePageColors") || window.matchMedia("(forced-colors: active)").matches;
+    const pageColors = hasForcedColors ? {
+      background: AppOptions.get("pageColorsBackground"),
+      foreground: AppOptions.get("pageColorsForeground")
+    } : null;
+    const enableMerge = AppOptions.get("enableMerge");
+    const enableSplitMerge = AppOptions.get("enableSplitMerge");
+    let altTextManager;
+    if (AppOptions.get("enableUpdatedAddImage")) {
+      altTextManager = appConfig.newAltTextDialog ? new NewAltTextManager(appConfig.newAltTextDialog, overlayManager, eventBus) : null;
+    } else {
+      altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, overlayManager, eventBus) : null;
+    }
+    if (appConfig.editorUndoBar) {
+      this.editorUndoBar = new EditorUndoBar(appConfig.editorUndoBar, eventBus);
+    }
+    const signatureManager = AppOptions.get("enableSignatureEditor") && appConfig.addSignatureDialog ? new SignatureManager(appConfig.addSignatureDialog, appConfig.editSignatureDialog, appConfig.annotationEditorParams?.editorSignatureAddSignature || null, overlayManager, l10n, externalServices.createSignatureStorage(eventBus, abortSignal), eventBus) : null;
+    const commentManager = AppOptions.get("enableComment") && appConfig.editCommentDialog ? new CommentManager(appConfig.editCommentDialog, {
+      learnMoreUrl: AppOptions.get("commentLearnMoreUrl"),
+      sidebar: appConfig.annotationEditorParams?.editorCommentsSidebar || null,
+      sidebarResizer: appConfig.annotationEditorParams?.editorCommentsSidebarResizer || null,
+      commentsList: appConfig.annotationEditorParams?.editorCommentsSidebarList || null,
+      commentCount: appConfig.annotationEditorParams?.editorCommentsSidebarCount || null,
+      sidebarTitle: appConfig.annotationEditorParams?.editorCommentsSidebarTitle || null,
+      closeButton: appConfig.annotationEditorParams?.editorCommentsSidebarCloseButton || null,
+      commentToolbarButton: appConfig.toolbar?.editorCommentButton || null
+    }, eventBus, linkService, overlayManager, l10n.getDirection() === "ltr", hasForcedColors, abortSignal) : null;
+    const maxCanvasPixels = AppOptions.get("maxCanvasPixels"),
+      maxCanvasDim = AppOptions.get("maxCanvasDim"),
+      capCanvasAreaFactor = AppOptions.get("capCanvasAreaFactor");
+    const pdfViewer = this.pdfViewer = new PDFViewer({
+      container,
+      viewer,
+      viewerAlert: appConfig.viewerAlert,
+      eventBus,
+      renderingQueue,
+      linkService,
+      downloadManager,
+      altTextManager,
+      commentManager,
+      signatureManager,
+      editorUndoBar: this.editorUndoBar,
+      findController,
+      scriptingManager: AppOptions.get("enableScripting") && pdfScriptingManager,
+      l10n,
+      textLayerMode: AppOptions.get("textLayerMode"),
+      annotationMode: AppOptions.get("annotationMode"),
+      annotationEditorMode,
+      annotationEditorHighlightColors: AppOptions.get("highlightEditorColors"),
+      enableHighlightFloatingButton: AppOptions.get("enableHighlightFloatingButton"),
+      enableUpdatedAddImage: AppOptions.get("enableUpdatedAddImage"),
+      enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage"),
+      imageResourcesPath: AppOptions.get("imageResourcesPath"),
+      enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"),
+      maxCanvasPixels,
+      maxCanvasDim,
+      capCanvasAreaFactor,
+      enableDetailCanvas: AppOptions.get("enableDetailCanvas"),
+      enablePermissions: AppOptions.get("enablePermissions"),
+      enableOptimizedPartialRendering: AppOptions.get("enableOptimizedPartialRendering"),
+      enableSelectionRendering: AppOptions.get("enableSelectionRendering"),
+      imagesRightClickMinSize: AppOptions.get("imagesRightClickMinSize"),
+      pageColors,
+      mlManager,
+      abortSignal,
+      supportsPinchToZoom: this.supportsPinchToZoom,
+      enableAutoLinking: AppOptions.get("enableAutoLinking"),
+      minDurationToUpdateCanvas: AppOptions.get("minDurationToUpdateCanvas")
+    });
+    renderingQueue.setViewer(pdfViewer);
+    linkService.setViewer(pdfViewer);
+    pdfScriptingManager.setViewer(pdfViewer);
+    if (appConfig.viewsManager?.thumbnailsView) {
+      const {
+        viewsManager
+      } = appConfig;
+      this.pdfThumbnailViewer = new PDFThumbnailViewer({
+        container: viewsManager.thumbnailsView,
+        eventBus,
+        renderingQueue,
+        linkService,
+        maxCanvasPixels,
+        maxCanvasDim,
+        pageColors,
+        abortSignal,
+        enableSplitMerge,
+        enableMerge,
+        enableNewBadge: AppOptions.get("enableNewBadge"),
+        statusBar: viewsManager.viewsManagerStatusBar,
+        undoBar: viewsManager.viewsManagerUndoBar,
+        manageMenu: viewsManager.manageMenu,
+        waitingBar: viewsManager.viewsManagerWaitingBar,
+        addFileComponent: viewsManager.viewsManagerAddFile
+      });
+      renderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
+    }
+    if (!this.isViewerEmbedded && !AppOptions.get("disableHistory")) {
+      this.pdfHistory = new PDFHistory({
+        linkService,
+        eventBus
+      });
+      linkService.setHistory(this.pdfHistory);
+    }
+    if (!this.supportsIntegratedFind && appConfig.findBar) {
+      this.findBar = new PDFFindBar(appConfig.findBar, appConfig.principalContainer, eventBus);
+    }
+    if (appConfig.annotationEditorParams) {
+      if (annotationEditorMode !== AnnotationEditorType.DISABLE) {
+        const editorSignatureButton = appConfig.toolbar?.editorSignatureButton;
+        if (editorSignatureButton && AppOptions.get("enableSignatureEditor")) {
+          editorSignatureButton.parentElement.hidden = false;
+        }
+        const editorCommentButton = appConfig.toolbar?.editorCommentButton;
+        if (editorCommentButton && AppOptions.get("enableComment")) {
+          editorCommentButton.parentElement.hidden = false;
+        }
+        this.annotationEditorParams = new AnnotationEditorParams(appConfig.annotationEditorParams, eventBus);
+      } else {
+        for (const id of ["editorModeButtons", "editorModeSeparator"]) {
+          document.getElementById(id)?.classList.add("hidden");
+        }
+      }
+    }
+    if (mlManager && appConfig.secondaryToolbar?.imageAltTextSettingsButton) {
+      this.imageAltTextSettings = new ImageAltTextSettings(appConfig.altTextSettingsDialog, overlayManager, eventBus, mlManager);
+    }
+    if (appConfig.documentProperties) {
+      this.pdfDocumentProperties = new PDFDocumentProperties(appConfig.documentProperties, overlayManager, eventBus, l10n, () => this._docFilename, () => this._docTitle);
+    }
+    if (appConfig.secondaryToolbar?.cursorHandToolButton) {
+      this.pdfCursorTools = new PDFCursorTools({
+        container,
+        eventBus,
+        cursorToolOnLoad: AppOptions.get("cursorToolOnLoad")
+      });
+    }
+    if (appConfig.toolbar) {
+      this.toolbar = new Toolbar(appConfig.toolbar, eventBus, AppOptions.get("toolbarDensity"));
+    }
+    if (appConfig.secondaryToolbar) {
+      if (AppOptions.get("enableAltText")) {
+        appConfig.secondaryToolbar.imageAltTextSettingsButton?.classList.remove("hidden");
+        appConfig.secondaryToolbar.imageAltTextSettingsSeparator?.classList.remove("hidden");
+      }
+      this.secondaryToolbar = new SecondaryToolbar(appConfig.secondaryToolbar, eventBus);
+    }
+    if (this.supportsFullscreen && appConfig.secondaryToolbar?.presentationModeButton) {
+      this.pdfPresentationMode = new PDFPresentationMode({
+        container,
+        pdfViewer,
+        eventBus
+      });
+    }
+    if (appConfig.passwordOverlay) {
+      this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay, overlayManager, this.isViewerEmbedded);
+    }
+    if (appConfig.viewsManager?.outlinesView) {
+      this.pdfOutlineViewer = new PDFOutlineViewer({
+        container: appConfig.viewsManager.outlinesView,
+        eventBus,
+        l10n,
+        linkService,
+        downloadManager
+      });
+    }
+    if (appConfig.viewsManager?.attachmentsView) {
+      this.pdfAttachmentViewer = new PDFAttachmentViewer({
+        container: appConfig.viewsManager.attachmentsView,
+        eventBus,
+        l10n,
+        downloadManager,
+        linkService
+      });
+    }
+    if (appConfig.viewsManager?.layersView) {
+      this.pdfLayerViewer = new PDFLayerViewer({
+        container: appConfig.viewsManager.layersView,
+        eventBus,
+        l10n
+      });
+    }
+    if (appConfig.viewsManager) {
+      this.viewsManager = new ViewsManager({
+        elements: appConfig.viewsManager,
+        eventBus,
+        l10n,
+        enableMerge,
+        enableSplitMerge,
+        globalAbortSignal: abortSignal
+      });
+      this.viewsManager.onToggled = this.forceRendering.bind(this);
+      this.viewsManager.onUpdateThumbnails = () => {
+        for (const pageView of pdfViewer.getCachedPageViews()) {
+          if (pageView.renderingState === RenderingStates.FINISHED) {
+            this.pdfThumbnailViewer.getThumbnail(pageView.id - 1)?.setImage(pageView);
+          }
+        }
+        this.pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);
+      };
+    }
+  },
+  async run(config) {
+    await this.initialize(config);
+    const {
+      appConfig,
+      eventBus
+    } = this;
+    let file;
+    const queryString = document.location.search.substring(1);
+    const params = parseQueryString(queryString);
+    file = params.get("file") ?? AppOptions.get("defaultUrl");
+    try {
+      file = new URL(file).href;
+    } catch {
+      file = encodeURIComponent(file).replaceAll("%2F", "/");
+    }
+    validateFileURL(file);
+    const fileInput = this._openFileInput = document.createElement("input");
+    fileInput.id = "fileInput";
+    fileInput.hidden = true;
+    fileInput.type = "file";
+    fileInput.value = null;
+    document.body.append(fileInput);
+    fileInput.addEventListener("change", function (evt) {
+      const {
+        files
+      } = evt.target;
+      if (!files?.length) {
+        return;
+      }
+      eventBus.dispatch("fileinputchange", {
+        source: this,
+        fileInput: evt.target
+      });
+    });
+    appConfig.mainContainer.addEventListener("dragover", function (evt) {
+      for (const item of evt.dataTransfer.items) {
+        if (item.type === "application/pdf") {
+          evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move";
+          stopEvent(evt);
+          return;
+        }
+      }
+    });
+    appConfig.mainContainer.addEventListener("drop", function (evt) {
+      if (evt.dataTransfer.files?.[0].type !== "application/pdf") {
+        return;
+      }
+      stopEvent(evt);
+      eventBus.dispatch("fileinputchange", {
+        source: this,
+        fileInput: evt.dataTransfer
+      });
+    });
+    if (!AppOptions.get("supportsDocumentFonts")) {
+      AppOptions.set("disableFontFace", true);
+      this.l10n.get("pdfjs-web-fonts-disabled").then(msg => {
+        console.warn(msg);
+      });
+    }
+    const togglePrintingButtons = visible => {
+      appConfig.toolbar?.print?.classList.toggle("hidden", !visible);
+      appConfig.secondaryToolbar?.printButton.classList.toggle("hidden", !visible);
+    };
+    if (!this.supportsPrinting) {
+      togglePrintingButtons(false);
+    } else {
+      eventBus.on("printingallowed", ({
+        isAllowed
+      }) => togglePrintingButtons(isAllowed), internalOpt);
+    }
+    if (!this.supportsFullscreen) {
+      appConfig.secondaryToolbar?.presentationModeButton.classList.add("hidden");
+    }
+    if (this.supportsIntegratedFind) {
+      appConfig.findBar?.toggleButton?.classList.add("hidden");
+    }
+    if (file) {
+      this.open({
+        url: file
+      });
+    } else {
+      this._hideViewBookmark();
+    }
+  },
+  get externalServices() {
+    return shadow(this, "externalServices", new ExternalServices());
+  },
+  get initialized() {
+    return this._initializedCapability.settled;
+  },
+  get initializedPromise() {
+    return this._initializedCapability.promise;
+  },
+  updateZoom(steps, scaleFactor, origin) {
+    if (this.pdfViewer.isInPresentationMode) {
+      return;
+    }
+    this.pdfViewer.updateScale({
+      drawingDelay: AppOptions.get("defaultZoomDelay"),
+      steps,
+      scaleFactor,
+      origin
+    });
+  },
+  zoomIn() {
+    this.updateZoom(1);
+  },
+  zoomOut() {
+    this.updateZoom(-1);
+  },
+  zoomReset() {
+    if (this.pdfViewer.isInPresentationMode) {
+      return;
+    }
+    this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;
+  },
+  touchPinchCallback(origin, prevDistance, distance) {
+    if (this.supportsPinchToZoom) {
+      const newScaleFactor = this._accumulateFactor(this.pdfViewer.currentScale, distance / prevDistance, "_touchUnusedFactor");
+      this.updateZoom(null, newScaleFactor, origin);
+    } else {
+      const PIXELS_PER_LINE_SCALE = 30;
+      const ticks = this._accumulateTicks((distance - prevDistance) / PIXELS_PER_LINE_SCALE, "_touchUnusedTicks");
+      this.updateZoom(ticks, null, origin);
+    }
+  },
+  touchPinchEndCallback() {
+    this._touchUnusedTicks = 0;
+    this._touchUnusedFactor = 1;
+  },
+  get pagesCount() {
+    return this.pdfDocument ? this.pdfDocument.numPages : 0;
+  },
+  get page() {
+    return this.pdfViewer.currentPageNumber;
+  },
+  set page(val) {
+    this.pdfViewer.currentPageNumber = val;
+  },
+  get supportsPrinting() {
+    return shadow(this, "supportsPrinting", AppOptions.get("supportsPrinting") && PDFPrintServiceFactory.supportsPrinting);
+  },
+  get supportsFullscreen() {
+    return shadow(this, "supportsFullscreen", document.fullscreenEnabled);
+  },
+  get supportsPinchToZoom() {
+    return shadow(this, "supportsPinchToZoom", AppOptions.get("supportsPinchToZoom"));
+  },
+  get supportsIntegratedFind() {
+    return shadow(this, "supportsIntegratedFind", AppOptions.get("supportsIntegratedFind"));
+  },
+  get loadingBar() {
+    const barElement = document.getElementById("loadingBar");
+    const bar = barElement ? new ProgressBar(barElement) : null;
+    return shadow(this, "loadingBar", bar);
+  },
+  get supportsMouseWheelZoomCtrlKey() {
+    return shadow(this, "supportsMouseWheelZoomCtrlKey", AppOptions.get("supportsMouseWheelZoomCtrlKey"));
+  },
+  get supportsMouseWheelZoomMetaKey() {
+    return shadow(this, "supportsMouseWheelZoomMetaKey", AppOptions.get("supportsMouseWheelZoomMetaKey"));
+  },
+  get supportsCaretBrowsingMode() {
+    return AppOptions.get("supportsCaretBrowsingMode");
+  },
+  moveCaret(isUp, select) {
+    this._caretBrowsing ||= new CaretBrowsingMode(this._globalAbortController.signal, this.appConfig.mainContainer, this.appConfig.viewerContainer, this.appConfig.toolbar?.container);
+    this._caretBrowsing.moveCaret(isUp, select);
+  },
+  setTitleUsingUrl(url = "", downloadUrl = null) {
+    this.url = url;
+    this.baseUrl = updateUrlHash(url, "", true);
+    if (downloadUrl) {
+      this._downloadUrl = downloadUrl === url ? this.baseUrl : updateUrlHash(downloadUrl, "", true);
+    }
+    if (isDataScheme(url)) {
+      this._hideViewBookmark();
+    }
+    let title = getPdfFilenameFromUrl(url, "");
+    if (!title) {
+      try {
+        title = decodeURIComponent(getFilenameFromUrl(url));
+      } catch {}
+    }
+    this.setTitle(title || url);
+  },
+  setTitle(title = this._title) {
+    this._title = title;
+    if (this.isViewerEmbedded) {
+      return;
+    }
+    const hasChangesIndicator = this._hasChanges() && !this.pdfRenderingQueue.printing;
+    document.title = `${hasChangesIndicator ? "* " : ""}${title}`;
+  },
+  get _docFilename() {
+    return this._contentDispositionFilename || getPdfFilenameFromUrl(this.url);
+  },
+  get _docTitle() {
+    const {
+      documentInfo,
+      metadata
+    } = this;
+    const title = metadata?.get("dc:title");
+    if (title) {
+      if (title !== "Untitled" && !/[\uFFF0-\uFFFF]/.test(title)) {
+        return title;
+      }
+    }
+    return documentInfo.Title;
+  },
+  _hideViewBookmark() {
+    const {
+      secondaryToolbar
+    } = this.appConfig;
+    secondaryToolbar?.viewBookmarkButton.classList.add("hidden");
+    if (secondaryToolbar?.presentationModeButton.classList.contains("hidden")) {
+      document.getElementById("viewBookmarkSeparator")?.classList.add("hidden");
+    }
+  },
+  async close() {
+    this._unblockDocumentLoadEvent();
+    this._hideViewBookmark();
+    if (!this.pdfLoadingTask) {
+      return;
+    }
+    if (this._hasChanges() && this._annotationStorageModified) {
+      try {
+        await this.downloadOrSave();
+      } catch {}
+    }
+    const promises = [];
+    promises.push(this.pdfLoadingTask.destroy());
+    this.pdfLoadingTask = null;
+    if (this.pdfDocument) {
+      this.pdfDocument = null;
+      this.pdfThumbnailViewer?.setDocument(null);
+      this.pdfViewer.setDocument(null);
+      this.pdfLinkService.setDocument(null);
+      this.pdfDocumentProperties?.setDocument(null);
+    }
+    this.pdfLinkService.externalLinkEnabled = true;
+    this.store = null;
+    this.isInitialViewSet = false;
+    this.url = "";
+    this.baseUrl = "";
+    this._downloadUrl = "";
+    this.documentInfo = null;
+    this.metadata = null;
+    this._contentDispositionFilename = null;
+    this._contentLength = null;
+    this._saveInProgress = false;
+    this._hasAnnotationEditors = false;
+    promises.push(this.pdfScriptingManager.destroyPromise, this.passwordPrompt.close());
+    this.setTitle();
+    this.viewsManager?.reset();
+    this.pdfOutlineViewer?.reset();
+    this.pdfAttachmentViewer?.reset();
+    this.pdfLayerViewer?.reset();
+    this.pdfHistory?.reset();
+    this.findBar?.reset();
+    this.toolbar?.reset();
+    this.secondaryToolbar?.reset();
+    this._PDFBug?.cleanup();
+    await Promise.all(promises);
+  },
+  async open(args) {
+    if (this.pdfLoadingTask) {
+      await this.close();
+    }
+    const workerParams = AppOptions.getAll(OptionKind.WORKER);
+    Object.assign(GlobalWorkerOptions, workerParams);
+    if (args.data && isPdfFile(args.filename)) {
+      this._contentDispositionFilename = args.filename;
+    } else if (args.url) {
+      this.setTitleUsingUrl(args.originalUrl || args.url, args.url);
+    }
+    const apiParams = AppOptions.getAll(OptionKind.API);
+    const loadingTask = getDocument({
+      ...apiParams,
+      ...args
+    });
+    this.pdfLoadingTask = loadingTask;
+    loadingTask.onPassword = (updateCallback, reason) => {
+      if (this.isViewerEmbedded) {
+        this._unblockDocumentLoadEvent();
+      }
+      this.pdfLinkService.externalLinkEnabled = false;
+      this.passwordPrompt.setUpdateCallback(updateCallback, reason);
+      this.passwordPrompt.open();
+    };
+    loadingTask.onProgress = evt => this.progress(evt.percent);
+    return loadingTask.promise.then(pdfDocument => {
+      this.load(pdfDocument);
+    }, reason => {
+      if (loadingTask !== this.pdfLoadingTask) {
+        return undefined;
+      }
+      if (this.loadingBar) {
+        this.loadingBar.percent ||= 0;
+      }
+      let key = "pdfjs-loading-error";
+      if (reason instanceof InvalidPDFException) {
+        key = "pdfjs-invalid-file-error";
+      } else if (reason instanceof ResponseException) {
+        key = reason.missing ? "pdfjs-missing-file-error" : "pdfjs-unexpected-response-error";
+      }
+      return this._documentError(key, {
+        message: reason.message
+      }).then(() => {
+        throw reason;
+      });
+    });
+  },
+  async download() {
+    if (!this.downloadManager) {
+      return;
+    }
+    let data;
+    try {
+      data = await (this.pdfDocument ? this.pdfDocument.getData() : this.pdfLoadingTask.getData());
+    } catch {}
+    this.downloadManager.download(data, this._downloadUrl, this._docFilename);
+  },
+  async save() {
+    if (!this.downloadManager) {
+      return;
+    }
+    if (this._saveInProgress) {
+      return;
+    }
+    this._saveInProgress = true;
+    await this.pdfScriptingManager.dispatchWillSave();
+    try {
+      const data = await this.pdfDocument.saveDocument();
+      this.downloadManager.download(data, this._downloadUrl, this._docFilename);
+    } catch (reason) {
+      console.error(`Error when saving the document:`, reason);
+      await this.download();
+    } finally {
+      await this.pdfScriptingManager.dispatchDidSave();
+      this._saveInProgress = false;
+    }
+    const editorStats = this.pdfDocument?.annotationStorage.editorStats;
+    if (editorStats) {
+      this.externalServices.reportTelemetry({
+        type: "editing",
+        data: {
+          type: "save",
+          stats: editorStats
+        }
+      });
+    }
+  },
+  async downloadOrSave() {
+    if (!this.downloadManager) {
+      return;
+    }
+    const {
+      classList
+    } = this.appConfig.appContainer;
+    classList.add("wait");
+    if (this.pdfThumbnailViewer?.hasStructuralChanges()) {
+      this.externalServices.reportTelemetry({
+        type: "pageOrganization",
+        data: {
+          action: "save"
+        }
+      });
+      await this.onSavePages({
+        data: this.pdfThumbnailViewer.getStructuralChanges()
+      });
+    } else {
+      await (this.pdfDocument?.annotationStorage.size > 0 ? this.save() : this.download());
+    }
+    delete this._mergedDocumentNeedsSaving;
+    this.setTitle();
+    classList.remove("wait");
+  },
+  async _documentError(key, moreInfo = null) {
+    this._unblockDocumentLoadEvent();
+    const message = await this._otherError(key || "pdfjs-loading-error", moreInfo);
+    this.eventBus.dispatch("documenterror", {
+      source: this,
+      message,
+      reason: moreInfo?.message ?? null
+    });
+  },
+  async _otherError(key, moreInfo = null) {
+    const message = await this.l10n.get(key);
+    const moreInfoText = [`PDF.js v${version || "?"} (build: ${build || "?"})`];
+    if (moreInfo) {
+      moreInfoText.push(`Message: ${moreInfo.message}`);
+      if (moreInfo.stack) {
+        moreInfoText.push(`Stack: ${moreInfo.stack}`);
+      } else {
+        if (moreInfo.filename) {
+          moreInfoText.push(`File: ${moreInfo.filename}`);
+        }
+        if (moreInfo.lineNumber) {
+          moreInfoText.push(`Line: ${moreInfo.lineNumber}`);
+        }
+      }
+    }
+    console.error(`${message}\n\n${moreInfoText.join("\n")}`);
+    return message;
+  },
+  progress(percent) {
+    if (!this.loadingBar || percent <= this.loadingBar.percent) {
+      return;
+    }
+    this.loadingBar.percent = percent;
+    if (this.pdfDocument?.loadingParams.disableAutoFetch ?? AppOptions.get("disableAutoFetch")) {
+      this.loadingBar.setDisableAutoFetch();
+    }
+  },
+  load(pdfDocument) {
+    this.pdfDocument = pdfDocument;
+    this._printPermissionPromise = new Promise(resolve => {
+      this.eventBus.on("printingallowed", ({
+        isAllowed
+      }) => {
+        resolve(isAllowed);
+      }, {
+        once: true,
+        ...internalOpt
+      });
+    });
+    pdfDocument.getDownloadInfo().then(({
+      length
+    }) => {
+      this._contentLength = length;
+      this.loadingBar?.hide();
+      firstPagePromise.then(() => {
+        this.eventBus.dispatch("documentloaded", {
+          source: this
+        });
+      });
+    });
+    const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => {});
+    const pageModePromise = pdfDocument.getPageMode().catch(() => {});
+    const openActionPromise = pdfDocument.getOpenAction().catch(() => {});
+    this.toolbar?.setPagesCount(pdfDocument.numPages, false);
+    this.secondaryToolbar?.setPagesCount(pdfDocument.numPages);
+    this.pdfLinkService.setDocument(pdfDocument);
+    this.pdfDocumentProperties?.setDocument(pdfDocument);
+    const pdfViewer = this.pdfViewer;
+    pdfViewer.setDocument(pdfDocument);
+    const {
+      firstPagePromise,
+      onePageRendered,
+      pagesPromise
+    } = pdfViewer;
+    this.pdfThumbnailViewer?.setDocument(pdfDocument);
+    const storedPromise = (this.store = new ViewHistory(pdfDocument.fingerprints[0])).getMultiple({
+      page: null,
+      zoom: DEFAULT_SCALE_VALUE,
+      scrollLeft: "0",
+      scrollTop: "0",
+      rotation: null,
+      sidebarView: SidebarView.UNKNOWN,
+      scrollMode: ScrollMode.UNKNOWN,
+      spreadMode: SpreadMode.UNKNOWN
+    }).catch(() => {});
+    firstPagePromise.then(pdfPage => {
+      this.loadingBar?.setWidth(this.appConfig.viewerContainer);
+      this._initializeAnnotationStorageCallbacks(pdfDocument);
+      Promise.all([animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => {
+        const viewOnLoad = AppOptions.get("viewOnLoad");
+        this._initializePdfHistory({
+          fingerprint: pdfDocument.fingerprints[0],
+          viewOnLoad,
+          initialDest: openAction?.dest
+        });
+        const initialBookmark = this.initialBookmark;
+        const zoom = AppOptions.get("defaultZoomValue");
+        let hash = zoom ? `zoom=${zoom}` : null;
+        let rotation = null;
+        let sidebarView = AppOptions.get("sidebarViewOnLoad");
+        let scrollMode = AppOptions.get("scrollModeOnLoad");
+        let spreadMode = AppOptions.get("spreadModeOnLoad");
+        if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) {
+          hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`;
+          rotation = parseInt(stored.rotation, 10);
+          if (sidebarView === SidebarView.UNKNOWN) {
+            sidebarView = stored.sidebarView | 0;
+          }
+          if (scrollMode === ScrollMode.UNKNOWN) {
+            scrollMode = stored.scrollMode | 0;
+          }
+          if (spreadMode === SpreadMode.UNKNOWN) {
+            spreadMode = stored.spreadMode | 0;
+          }
+        }
+        if (pageMode && sidebarView === SidebarView.UNKNOWN) {
+          sidebarView = apiPageModeToSidebarView(pageMode);
+        }
+        if (pageLayout && scrollMode === ScrollMode.UNKNOWN && spreadMode === SpreadMode.UNKNOWN) {
+          const modes = apiPageLayoutToViewerModes(pageLayout);
+          spreadMode = modes.spreadMode;
+        }
+        this.setInitialView(hash, {
+          rotation,
+          sidebarView,
+          scrollMode,
+          spreadMode
+        });
+        this.eventBus.dispatch("documentinit", {
+          source: this
+        });
+        await Promise.race([pagesPromise, new Promise(resolve => {
+          setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT);
+        })]);
+        if (!initialBookmark && !hash) {
+          return;
+        }
+        if (pdfViewer.hasEqualPageSizes) {
+          return;
+        }
+        this.initialBookmark = initialBookmark;
+        pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;
+        this.setInitialView(hash);
+      }).catch(() => {
+        this.setInitialView();
+      }).then(function () {
+        pdfViewer.update();
+      });
+    });
+    pagesPromise.then(() => {
+      this._unblockDocumentLoadEvent();
+      this._initializeAutoPrint(pdfDocument, openActionPromise);
+    }, reason => {
+      this._documentError("pdfjs-loading-error", {
+        message: reason.message
+      });
+    });
+    onePageRendered.then(data => {
+      this.externalServices.reportTelemetry({
+        type: "pageInfo",
+        timestamp: data.timestamp
+      });
+      if (this.pdfOutlineViewer) {
+        pdfDocument.getOutline().then(outline => {
+          if (pdfDocument !== this.pdfDocument) {
+            return;
+          }
+          this.pdfOutlineViewer.render({
+            outline,
+            pdfDocument
+          });
+        });
+      }
+      if (this.pdfAttachmentViewer) {
+        pdfDocument.getAttachments().then(attachments => {
+          if (pdfDocument !== this.pdfDocument) {
+            return;
+          }
+          this.pdfAttachmentViewer.render({
+            attachments
+          });
+        });
+      }
+      if (this.pdfLayerViewer) {
+        pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => {
+          if (pdfDocument !== this.pdfDocument) {
+            return;
+          }
+          this.pdfLayerViewer.render({
+            optionalContentConfig,
+            pdfDocument
+          });
+        });
+      }
+    });
+    this._initializePageLabels(pdfDocument);
+    this._initializeMetadata(pdfDocument);
+  },
+  async _scriptingDocProperties(pdfDocument) {
+    if (!this.documentInfo) {
+      await new Promise(resolve => {
+        this.eventBus.on("metadataloaded", resolve, {
+          once: true,
+          ...internalOpt
+        });
+      });
+      if (pdfDocument !== this.pdfDocument) {
+        return null;
+      }
+    }
+    if (!this._contentLength) {
+      await new Promise(resolve => {
+        this.eventBus.on("documentloaded", resolve, {
+          once: true,
+          ...internalOpt
+        });
+      });
+      if (pdfDocument !== this.pdfDocument) {
+        return null;
+      }
+    }
+    return {
+      ...this.documentInfo,
+      baseURL: this.baseUrl,
+      filesize: this._contentLength,
+      filename: this._docFilename,
+      metadata: this.metadata?.getRaw(),
+      authors: this.metadata?.get("dc:creator"),
+      numPages: this.pagesCount,
+      URL: this.url
+    };
+  },
+  async _initializeAutoPrint(pdfDocument, openActionPromise) {
+    const [openAction, jsActions] = await Promise.all([openActionPromise, this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions()]);
+    if (pdfDocument !== this.pdfDocument) {
+      return;
+    }
+    let triggerAutoPrint = openAction?.action === "Print";
+    if (jsActions) {
+      console.warn("Warning: JavaScript support is not enabled");
+      for (const name in jsActions) {
+        if (triggerAutoPrint) {
+          break;
+        }
+        switch (name) {
+          case "WillClose":
+          case "WillSave":
+          case "DidSave":
+          case "WillPrint":
+          case "DidPrint":
+            continue;
+        }
+        triggerAutoPrint = jsActions[name].some(js => AutoPrintRegExp.test(js));
+      }
+    }
+    if (triggerAutoPrint) {
+      this.triggerPrinting();
+    }
+  },
+  async _initializeMetadata(pdfDocument) {
+    const {
+      info,
+      metadata,
+      contentDispositionFilename,
+      contentLength,
+      hasStructTree
+    } = await pdfDocument.getMetadata();
+    if (pdfDocument !== this.pdfDocument) {
+      return;
+    }
+    this.externalServices.reportTelemetry({
+      type: "taggedPDF",
+      data: hasStructTree
+    });
+    this.documentInfo = info;
+    this.metadata = metadata;
+    this._contentDispositionFilename ??= contentDispositionFilename;
+    this._contentLength ??= contentLength;
+    console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(metadata?.get("pdf:producer") || info.Producer || "-").trim()} / ` + `${(metadata?.get("xmp:creatortool") || info.Creator || "-").trim()}` + `] (PDF.js: ${version || "?"} [${build || "?"}])`);
+    const pdfTitle = this._docTitle;
+    if (pdfTitle) {
+      this.setTitle(`${pdfTitle} - ${this._contentDispositionFilename || this._title}`);
+    } else if (this._contentDispositionFilename) {
+      this.setTitle(this._contentDispositionFilename);
+    }
+    if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) {
+      if (pdfDocument.loadingParams.enableXfa) {
+        console.warn("Warning: XFA Foreground documents are not supported");
+      } else {
+        console.warn("Warning: XFA support is not enabled");
+      }
+    } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderForms) {
+      console.warn("Warning: Interactive form support is not enabled");
+    }
+    if (info.IsSignaturesPresent) {
+      console.warn("Warning: Digital signatures validation is not supported");
+    }
+    this.eventBus.dispatch("metadataloaded", {
+      source: this
+    });
+  },
+  async _initializePageLabels(pdfDocument) {
+    const labels = await pdfDocument.getPageLabels();
+    if (pdfDocument !== this.pdfDocument) {
+      return;
+    }
+    if (!labels || AppOptions.get("disablePageLabels")) {
+      return;
+    }
+    const numLabels = labels.length;
+    let standardLabels = 0,
+      emptyLabels = 0;
+    for (let i = 0; i < numLabels; i++) {
+      const label = labels[i];
+      if (label === (i + 1).toString()) {
+        standardLabels++;
+      } else if (label === "") {
+        emptyLabels++;
+      } else {
+        break;
+      }
+    }
+    if (standardLabels >= numLabels || emptyLabels >= numLabels) {
+      return;
+    }
+    const {
+      pdfViewer,
+      pdfThumbnailViewer,
+      toolbar
+    } = this;
+    pdfViewer.setPageLabels(labels);
+    pdfThumbnailViewer?.setPageLabels(labels);
+    toolbar?.setPagesCount(numLabels, true);
+    toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
+  },
+  _initializePdfHistory({
+    fingerprint,
+    viewOnLoad,
+    initialDest = null
+  }) {
+    if (!this.pdfHistory) {
+      return;
+    }
+    this.pdfHistory.initialize({
+      fingerprint,
+      resetHistory: viewOnLoad === ViewOnLoad.INITIAL || !!this._mergedDocumentNeedsSaving,
+      updateUrl: AppOptions.get("historyUpdateUrl")
+    });
+    if (this.pdfHistory.initialBookmark) {
+      this.initialBookmark = this.pdfHistory.initialBookmark;
+      this.initialRotation = this.pdfHistory.initialRotation;
+    }
+    if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) {
+      this.initialBookmark = JSON.stringify(initialDest);
+      this.pdfHistory.push({
+        explicitDest: initialDest,
+        pageNumber: null
+      });
+    }
+  },
+  _hasChanges() {
+    return this.pdfDocument?.annotationStorage.size > 0 || this.pdfThumbnailViewer?.hasStructuralChanges() || this._mergedDocumentNeedsSaving === true;
+  },
+  _initializeAnnotationStorageCallbacks(pdfDocument) {
+    if (pdfDocument !== this.pdfDocument) {
+      return;
+    }
+    const {
+      annotationStorage
+    } = pdfDocument;
+    annotationStorage.onSetModified = () => {
+      this._annotationStorageModified = true;
+    };
+    annotationStorage.onResetModified = () => {
+      delete this._annotationStorageModified;
+    };
+    annotationStorage.onAnnotationEditor = typeStr => {
+      this._hasAnnotationEditors = !!typeStr;
+      this.setTitle();
+    };
+  },
+  setInitialView(storedHash, {
+    rotation,
+    sidebarView,
+    scrollMode,
+    spreadMode
+  } = {}) {
+    const setRotation = angle => {
+      if (isValidRotation(angle)) {
+        this.pdfViewer.pagesRotation = angle;
+      }
+    };
+    const setViewerModes = (scroll, spread) => {
+      if (isValidScrollMode(scroll)) {
+        this.pdfViewer.scrollMode = scroll;
+      }
+      if (isValidSpreadMode(spread)) {
+        this.pdfViewer.spreadMode = spread;
+      }
+    };
+    this.isInitialViewSet = true;
+    this.viewsManager?.setInitialView(sidebarView);
+    setViewerModes(scrollMode, spreadMode);
+    if (this.initialBookmark) {
+      setRotation(this.initialRotation);
+      delete this.initialRotation;
+      this.pdfLinkService.setHash(this.initialBookmark);
+      this.initialBookmark = null;
+    } else if (storedHash) {
+      setRotation(rotation);
+      this.pdfLinkService.setHash(storedHash);
+    }
+    this.toolbar?.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel);
+    this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber);
+    if (!this.pdfViewer.currentScaleValue) {
+      this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;
+    }
+  },
+  _cleanup() {
+    if (!this.pdfDocument) {
+      return;
+    }
+    this.pdfViewer.cleanup();
+    this.pdfThumbnailViewer?.cleanup();
+    this.pdfDocument.cleanup(AppOptions.get("fontExtraProperties"));
+  },
+  forceRendering() {
+    this.pdfRenderingQueue.printing = !!this.printService;
+    this.pdfRenderingQueue.isThumbnailViewEnabled = this.viewsManager?.visibleView === SidebarView.THUMBS;
+    this.pdfRenderingQueue.renderHighestPriority();
+  },
+  beforePrint() {
+    this._printAnnotationStoragePromise = this.pdfScriptingManager.dispatchWillPrint().catch(() => {}).then(() => this.pdfDocument?.annotationStorage.print);
+    if (this.printService) {
+      return;
+    }
+    if (!this.supportsPrinting || !this.pdfViewer.printingAllowed) {
+      this._otherError("pdfjs-printing-not-supported");
+      return;
+    }
+    if (!this.pdfViewer.pageViewsReady) {
+      this.l10n.get("pdfjs-printing-not-ready").then(msg => {
+        window.alert(msg);
+      });
+      return;
+    }
+    this.printService = PDFPrintServiceFactory.createPrintService({
+      pdfDocument: this.pdfDocument,
+      pagesOverview: this.pdfViewer.getPagesOverview(),
+      printContainer: this.appConfig.printContainer,
+      printResolution: AppOptions.get("printResolution"),
+      printAnnotationStoragePromise: this._printAnnotationStoragePromise
+    });
+    this.forceRendering();
+    this.setTitle();
+    this.printService.layout();
+    if (this._hasAnnotationEditors) {
+      this.externalServices.reportTelemetry({
+        type: "editing",
+        data: {
+          type: "print",
+          stats: this.pdfDocument?.annotationStorage.editorStats
+        }
+      });
+    }
+  },
+  afterPrint() {
+    if (this._printAnnotationStoragePromise) {
+      this._printAnnotationStoragePromise.then(() => {
+        this.pdfScriptingManager.dispatchDidPrint();
+      });
+      this._printAnnotationStoragePromise = null;
+    }
+    if (this.printService) {
+      this.printService.destroy();
+      this.printService = null;
+      this.pdfDocument?.annotationStorage.resetModified();
+    }
+    this.forceRendering();
+    this.setTitle();
+  },
+  rotatePages(delta) {
+    this.pdfViewer.pagesRotation += delta;
+  },
+  requestPresentationMode() {
+    this.pdfPresentationMode?.request();
+  },
+  async triggerPrinting() {
+    if (this.supportsPrinting && (await this._printPermissionPromise)) {
+      window.print();
+    }
+  },
+  bindEvents() {
+    if (this._eventBusAC) {
+      return;
+    }
+    const ac = this._eventBusAC = new AbortController();
+    const opts = {
+      signal: ac.signal,
+      ...internalOpt
+    };
+    const {
+      eventBus,
+      externalServices,
+      pdfDocumentProperties,
+      pdfViewer,
+      preferences
+    } = this;
+    eventBus.on("resize", onResize.bind(this), opts);
+    eventBus.on("hashchange", onHashchange.bind(this), opts);
+    eventBus.on("beforeprint", this.beforePrint.bind(this), opts);
+    eventBus.on("afterprint", this.afterPrint.bind(this), opts);
+    eventBus.on("pagerender", onPageRender.bind(this), opts);
+    eventBus.on("pagerendered", onPageRendered.bind(this), opts);
+    eventBus.on("updateviewarea", onUpdateViewarea.bind(this), opts);
+    eventBus.on("pagechanging", onPageChanging.bind(this), opts);
+    eventBus.on("scalechanging", onScaleChanging.bind(this), opts);
+    eventBus.on("rotationchanging", onRotationChanging.bind(this), opts);
+    eventBus.on("sidebarviewchanged", onSidebarViewChanged.bind(this), opts);
+    eventBus.on("pagemode", onPageMode.bind(this), opts);
+    eventBus.on("namedaction", onNamedAction.bind(this), opts);
+    eventBus.on("presentationmodechanged", evt => pdfViewer.presentationModeState = evt.state, opts);
+    eventBus.on("presentationmode", this.requestPresentationMode.bind(this), opts);
+    eventBus.on("switchannotationeditormode", evt => pdfViewer.annotationEditorMode = evt, opts);
+    eventBus.on("print", this.triggerPrinting.bind(this), opts);
+    eventBus.on("download", this.downloadOrSave.bind(this), opts);
+    eventBus.on("firstpage", () => this.page = 1, opts);
+    eventBus.on("lastpage", () => this.page = this.pagesCount, opts);
+    eventBus.on("nextpage", () => pdfViewer.nextPage(), opts);
+    eventBus.on("previouspage", () => pdfViewer.previousPage(), opts);
+    eventBus.on("zoomin", this.zoomIn.bind(this), opts);
+    eventBus.on("zoomout", this.zoomOut.bind(this), opts);
+    eventBus.on("zoomreset", this.zoomReset.bind(this), opts);
+    eventBus.on("pagenumberchanged", onPageNumberChanged.bind(this), opts);
+    eventBus.on("scalechanged", evt => pdfViewer.currentScaleValue = evt.value, opts);
+    eventBus.on("rotatecw", this.rotatePages.bind(this, 90), opts);
+    eventBus.on("rotateccw", this.rotatePages.bind(this, -90), opts);
+    eventBus.on("optionalcontentconfig", evt => pdfViewer.optionalContentConfigPromise = evt.promise, opts);
+    eventBus.on("switchscrollmode", evt => pdfViewer.scrollMode = evt.mode, opts);
+    eventBus.on("scrollmodechanged", onViewerModesChanged.bind(this, "scrollMode"), opts);
+    eventBus.on("switchspreadmode", evt => pdfViewer.spreadMode = evt.mode, opts);
+    eventBus.on("spreadmodechanged", onViewerModesChanged.bind(this, "spreadMode"), opts);
+    eventBus.on("imagealttextsettings", onImageAltTextSettings.bind(this), opts);
+    eventBus.on("documentproperties", () => pdfDocumentProperties?.open(), opts);
+    eventBus.on("findfromurlhash", onFindFromUrlHash.bind(this), opts);
+    eventBus.on("updatefindmatchescount", onUpdateFindMatchesCount.bind(this), opts);
+    eventBus.on("updatefindcontrolstate", onUpdateFindControlState.bind(this), opts);
+    eventBus.on("fileinputchange", onFileInputChange.bind(this), opts);
+    eventBus.on("openfile", onOpenFile.bind(this), opts);
+    eventBus.on("pagesedited", this.onPagesEdited.bind(this), opts);
+    eventBus.on("saveextractedpages", this.onSavePages.bind(this), opts);
+    eventBus.on("saveandload", this.onSaveAndLoad.bind(this), opts);
+  },
+  bindWindowEvents() {
+    if (this._windowAC) {
+      return;
+    }
+    this._windowAC = new AbortController();
+    const {
+      eventBus,
+      appConfig: {
+        mainContainer
+      },
+      pdfViewer,
+      _windowAC: {
+        signal
+      }
+    } = this;
+    this._touchManager = new TouchManager({
+      container: window,
+      isPinchingDisabled: () => pdfViewer.isInPresentationMode,
+      isPinchingStopped: () => this.overlayManager?.active,
+      onPinching: this.touchPinchCallback.bind(this),
+      onPinchEnd: this.touchPinchEndCallback.bind(this),
+      signal
+    });
+    function addWindowResolutionChange(evt = null) {
+      if (evt) {
+        pdfViewer.refresh();
+      }
+      const mediaQueryList = window.matchMedia(`(resolution: ${OutputScale.pixelRatio}dppx)`);
+      mediaQueryList.addEventListener("change", addWindowResolutionChange, {
+        once: true,
+        signal
+      });
+    }
+    addWindowResolutionChange();
+    window.addEventListener("wheel", onWheel.bind(this), {
+      passive: false,
+      signal
+    });
+    window.addEventListener("click", onClick.bind(this), {
+      signal
+    });
+    window.addEventListener("keydown", onKeyDown.bind(this), {
+      signal
+    });
+    window.addEventListener("keyup", onKeyUp.bind(this), {
+      signal
+    });
+    window.addEventListener("resize", () => eventBus.dispatch("resize", {
+      source: window
+    }), {
+      signal
+    });
+    window.addEventListener("hashchange", () => {
+      eventBus.dispatch("hashchange", {
+        source: window,
+        hash: document.location.hash.substring(1)
+      });
+    }, {
+      signal
+    });
+    window.addEventListener("beforeprint", () => eventBus.dispatch("beforeprint", {
+      source: window
+    }), {
+      signal
+    });
+    window.addEventListener("afterprint", () => eventBus.dispatch("afterprint", {
+      source: window
+    }), {
+      signal
+    });
+    window.addEventListener("updatefromsandbox", evt => {
+      eventBus.dispatch("updatefromsandbox", {
+        source: window,
+        detail: evt.detail
+      });
+    }, {
+      signal
+    });
+    window.addEventListener("beforeunload", onBeforeUnload.bind(this), {
+      signal
+    });
+    if (!("onscrollend" in document.documentElement)) {
+      return;
+    }
+    ({
+      scrollTop: this._lastScrollTop,
+      scrollLeft: this._lastScrollLeft
+    } = mainContainer);
+    let scrollendTimeoutID, scrollAbortController;
+    const scrollend = () => {
+      ({
+        scrollTop: this._lastScrollTop,
+        scrollLeft: this._lastScrollLeft
+      } = mainContainer);
+      clearTimeout(scrollendTimeoutID);
+      if (this._isScrolling) {
+        scrollAbortController.abort();
+        scrollAbortController = null;
+        this._isScrolling = false;
+      }
+    };
+    const scroll = () => {
+      if (this._isCtrlKeyDown) {
+        return;
+      }
+      if (this._lastScrollTop === mainContainer.scrollTop && this._lastScrollLeft === mainContainer.scrollLeft) {
+        return;
+      }
+      if (!this._isScrolling) {
+        scrollAbortController = new AbortController();
+        const abortSignal = AbortSignal.any([scrollAbortController.signal, signal]);
+        mainContainer.addEventListener("scrollend", scrollend, {
+          signal: abortSignal
+        });
+        mainContainer.addEventListener("blur", scrollend, {
+          signal: abortSignal
+        });
+        this._isScrolling = true;
+      }
+      clearTimeout(scrollendTimeoutID);
+      scrollendTimeoutID = setTimeout(scrollend, 100);
+    };
+    mainContainer.addEventListener("scroll", scroll, {
+      passive: true,
+      signal
+    });
+  },
+  unbindEvents() {
+    this._eventBusAC?.abort();
+    this._eventBusAC = null;
+  },
+  unbindWindowEvents() {
+    this._windowAC?.abort();
+    this._windowAC = null;
+    this._touchManager = null;
+  },
+  async testingClose() {
+    this.unbindEvents();
+    this.unbindWindowEvents();
+    this._globalAbortController?.abort();
+    this._globalAbortController = null;
+    this.findBar?.close();
+    await Promise.all([this.l10n?.destroy(), this.close()]);
+  },
+  onPagesEdited(data) {
+    this.pdfViewer.onPagesEdited(data);
+  },
+  async onSavePages({
+    data: extractParams
+  }) {
+    if (!this.downloadManager) {
+      return;
+    }
+    if (!this.pdfDocument) {
+      return;
+    }
+    const modifiedPdfBytes = await this.pdfDocument.extractPages(extractParams);
+    if (!modifiedPdfBytes) {
+      console.error("Something wrong happened when saving the edited PDF.\nPlease file a bug.");
+      return;
+    }
+    this.downloadManager.download(modifiedPdfBytes, this._downloadUrl, this._docFilename);
+  },
+  async onSaveAndLoad({
+    data: extractParams
+  }) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    const modifiedPdfBytes = await this.pdfDocument.extractPages(extractParams);
+    if (!modifiedPdfBytes) {
+      console.error("Something wrong happened when saving the edited PDF.\nPlease file a bug.");
+      return;
+    }
+    this._mergedDocumentNeedsSaving = true;
+    this.open({
+      data: modifiedPdfBytes,
+      filename: this._docFilename
+    });
+  },
+  _accumulateTicks(ticks, prop) {
+    if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) {
+      this[prop] = 0;
+    }
+    this[prop] += ticks;
+    const wholeTicks = Math.trunc(this[prop]);
+    this[prop] -= wholeTicks;
+    return wholeTicks;
+  },
+  _accumulateFactor(previousScale, factor, prop) {
+    if (factor === 1) {
+      return 1;
+    }
+    if (this[prop] > 1 && factor < 1 || this[prop] < 1 && factor > 1) {
+      this[prop] = 1;
+    }
+    const newFactor = Math.floor(previousScale * factor * this[prop] * 100) / (100 * previousScale);
+    this[prop] = factor / newFactor;
+    return newFactor;
+  },
+  _unblockDocumentLoadEvent() {
+    document.blockUnblockOnload?.(false);
+    this._unblockDocumentLoadEvent = () => {};
+  },
+  get scriptingReady() {
+    return this.pdfScriptingManager.ready;
+  }
+};
+initCom(PDFViewerApplication);
+PDFPrintServiceFactory.initGlobals(PDFViewerApplication);
+{
+  const HOSTED_VIEWER_ORIGINS = new Set(["null", "http://mozilla.github.io", "https://mozilla.github.io"]);
+  var validateFileURL = function (file) {
+    if (!file) {
+      return;
+    }
+    const viewerOrigin = URL.parse(window.location)?.origin || "null";
+    if (HOSTED_VIEWER_ORIGINS.has(viewerOrigin)) {
+      return;
+    }
+    const fileOrigin = URL.parse(file, window.location)?.origin;
+    if (fileOrigin === viewerOrigin) {
+      return;
+    }
+    const ex = new Error("file origin does not match viewer's");
+    PDFViewerApplication._documentError("pdfjs-loading-error", {
+      message: ex.message
+    });
+    throw ex;
+  };
+  var onFileInputChange = function (evt) {
+    if (this.pdfViewer?.isInPresentationMode) {
+      return;
+    }
+    const file = evt.fileInput.files[0];
+    this.open({
+      url: URL.createObjectURL(file),
+      originalUrl: encodeURIComponent(file.name)
+    });
+  };
+  var onOpenFile = function (evt) {
+    this._openFileInput?.click();
+  };
+}
+function onPageRender({
+  pageNumber
+}) {
+  if (pageNumber === this.page) {
+    this.toolbar?.updateLoadingIndicatorState(true);
+  }
+}
+function onPageRendered({
+  pageNumber,
+  isDetailView,
+  error
+}) {
+  if (pageNumber === this.page) {
+    this.toolbar?.updateLoadingIndicatorState(false);
+  }
+  if (!isDetailView && this.viewsManager?.visibleView === SidebarView.THUMBS) {
+    const pageView = this.pdfViewer.getPageView(pageNumber - 1);
+    const thumbnailView = this.pdfThumbnailViewer?.getThumbnail(pageNumber - 1);
+    if (pageView) {
+      thumbnailView?.setImage(pageView);
+    }
+  }
+  if (error) {
+    this._otherError("pdfjs-rendering-error", error);
+  }
+}
+function onPageMode({
+  mode
+}) {
+  let view;
+  switch (mode) {
+    case "thumbs":
+      view = SidebarView.THUMBS;
+      break;
+    case "bookmarks":
+    case "outline":
+      view = SidebarView.OUTLINE;
+      break;
+    case "attachments":
+      view = SidebarView.ATTACHMENTS;
+      break;
+    case "layers":
+      view = SidebarView.LAYERS;
+      break;
+    case "none":
+      view = SidebarView.NONE;
+      break;
+    default:
+      console.error('Invalid "pagemode" hash parameter: ' + mode);
+      return;
+  }
+  this.viewsManager?.switchView(view, true);
+}
+function onNamedAction(evt) {
+  switch (evt.action) {
+    case "GoToPage":
+      this.appConfig.toolbar?.pageNumber.select();
+      break;
+    case "Find":
+      if (!this.supportsIntegratedFind) {
+        this.findBar?.toggle();
+      }
+      break;
+    case "Print":
+      this.triggerPrinting();
+      break;
+    case "SaveAs":
+      this.downloadOrSave();
+      break;
+  }
+}
+function onSidebarViewChanged({
+  view
+}) {
+  this.pdfRenderingQueue.isThumbnailViewEnabled = view === SidebarView.THUMBS;
+  if (this.isInitialViewSet) {
+    this.store?.set("sidebarView", view).catch(() => {});
+  }
+}
+function onUpdateViewarea({
+  location
+}) {
+  if (this.isInitialViewSet) {
+    this.store?.setMultiple({
+      page: location.pageNumber,
+      zoom: location.scale,
+      scrollLeft: location.left,
+      scrollTop: location.top,
+      rotation: location.rotation
+    }).catch(() => {});
+  }
+  if (this.appConfig.secondaryToolbar) {
+    this.appConfig.secondaryToolbar.viewBookmarkButton.href = this.pdfLinkService.getAnchorUrl(location.pdfOpenParams);
+  }
+}
+function onViewerModesChanged(name, evt) {
+  if (this.isInitialViewSet && !this.pdfViewer.isInPresentationMode) {
+    this.store?.set(name, evt.mode).catch(() => {});
+  }
+}
+function onResize() {
+  const {
+    pdfDocument,
+    pdfViewer,
+    pdfRenderingQueue
+  } = this;
+  if (pdfRenderingQueue.printing && window.matchMedia("print").matches) {
+    return;
+  }
+  if (!pdfDocument) {
+    return;
+  }
+  const currentScaleValue = pdfViewer.currentScaleValue;
+  if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") {
+    pdfViewer.currentScaleValue = currentScaleValue;
+  }
+  pdfViewer.update();
+}
+function onHashchange(evt) {
+  const hash = evt.hash;
+  if (!hash) {
+    return;
+  }
+  if (!this.isInitialViewSet) {
+    this.initialBookmark = hash;
+  } else if (!this.pdfHistory?.popStateInProgress) {
+    this.pdfLinkService.setHash(hash);
+  }
+}
+function onPageNumberChanged(evt) {
+  const {
+    pdfViewer
+  } = this;
+  if (evt.value !== "") {
+    this.pdfLinkService.goToPage(evt.value);
+  }
+  if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {
+    this.toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
+  }
+}
+function onImageAltTextSettings() {
+  this.imageAltTextSettings?.open({
+    enableGuessAltText: AppOptions.get("enableGuessAltText"),
+    enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage")
+  });
+}
+function onFindFromUrlHash(evt) {
+  this.eventBus.dispatch("find", {
+    source: evt.source,
+    type: "",
+    query: evt.query,
+    caseSensitive: false,
+    entireWord: false,
+    highlightAll: true,
+    findPrevious: false,
+    matchDiacritics: true
+  });
+}
+function onUpdateFindMatchesCount({
+  matchesCount
+}) {
+  if (this.supportsIntegratedFind) {
+    this.externalServices.updateFindMatchesCount(matchesCount);
+  } else {
+    this.findBar?.updateResultsCount(matchesCount);
+  }
+}
+function onUpdateFindControlState({
+  state,
+  previous,
+  entireWord,
+  matchesCount,
+  rawQuery
+}) {
+  if (this.supportsIntegratedFind) {
+    this.externalServices.updateFindControlState({
+      result: state,
+      findPrevious: previous,
+      entireWord,
+      matchesCount,
+      rawQuery
+    });
+  } else {
+    this.findBar?.updateUIState(state, previous, matchesCount);
+  }
+}
+function onScaleChanging(evt) {
+  this.toolbar?.setPageScale(evt.presetValue, evt.scale);
+  this.pdfViewer.update();
+}
+function onRotationChanging(evt) {
+  if (this.pdfThumbnailViewer) {
+    this.pdfThumbnailViewer.pagesRotation = evt.pagesRotation;
+  }
+  this.forceRendering();
+  this.pdfViewer.currentPageNumber = evt.pageNumber;
+}
+function onPageChanging({
+  pageNumber,
+  pageLabel
+}) {
+  this.toolbar?.setPageNumber(pageNumber, pageLabel);
+  this.secondaryToolbar?.setPageNumber(pageNumber);
+  if (this.viewsManager?.visibleView === SidebarView.THUMBS) {
+    this.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber);
+  }
+  const currentPage = this.pdfViewer.getPageView(pageNumber - 1);
+  this.toolbar?.updateLoadingIndicatorState(currentPage?.renderingState === RenderingStates.RUNNING);
+}
+function onWheel(evt) {
+  const {
+    pdfViewer,
+    supportsMouseWheelZoomCtrlKey,
+    supportsMouseWheelZoomMetaKey,
+    supportsPinchToZoom
+  } = this;
+  if (pdfViewer.isInPresentationMode) {
+    return;
+  }
+  const deltaMode = evt.deltaMode;
+  let scaleFactor = Math.exp(-evt.deltaY / 100);
+  const isBuiltInMac = false;
+  const isPinchToZoom = evt.ctrlKey && !this._isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && evt.deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) && evt.deltaZ === 0;
+  const origin = [evt.clientX, evt.clientY];
+  if (isPinchToZoom || evt.ctrlKey && supportsMouseWheelZoomCtrlKey || evt.metaKey && supportsMouseWheelZoomMetaKey) {
+    evt.preventDefault();
+    if (this._isScrolling || document.visibilityState === "hidden" || this.overlayManager.active) {
+      return;
+    }
+    if (isPinchToZoom && supportsPinchToZoom) {
+      scaleFactor = this._accumulateFactor(pdfViewer.currentScale, scaleFactor, "_wheelUnusedFactor");
+      this.updateZoom(null, scaleFactor, origin);
+    } else {
+      const delta = normalizeWheelEventDirection(evt);
+      let ticks = 0;
+      if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) {
+        ticks = Math.abs(delta) >= 1 ? Math.sign(delta) : this._accumulateTicks(delta, "_wheelUnusedTicks");
+      } else {
+        const PIXELS_PER_LINE_SCALE = 30;
+        ticks = this._accumulateTicks(delta / PIXELS_PER_LINE_SCALE, "_wheelUnusedTicks");
+      }
+      this.updateZoom(ticks, null, origin);
+    }
+  }
+}
+function closeSecondaryToolbar({
+  target
+}) {
+  if (!this.secondaryToolbar?.isOpen) {
+    return;
+  }
+  const {
+    toolbar,
+    secondaryToolbar
+  } = this.appConfig;
+  if (this.pdfViewer.containsElement(target) || toolbar?.container.contains(target) && !secondaryToolbar?.toolbar.contains(target) && !secondaryToolbar?.toggleButton.contains(target)) {
+    this.secondaryToolbar.close();
+  }
+}
+function closeEditorUndoBar(evt) {
+  if (!this.editorUndoBar?.isOpen) {
+    return;
+  }
+  if (this.appConfig.secondaryToolbar?.toolbar.contains(evt.target)) {
+    this.editorUndoBar.hide();
+  }
+}
+function onBeforeUnload(evt) {
+  if (this._hasChanges()) {
+    evt.preventDefault();
+    evt.returnValue = "";
+    return false;
+  }
+  return true;
+}
+function onClick(evt) {
+  closeSecondaryToolbar.call(this, evt);
+  closeEditorUndoBar.call(this, evt);
+}
+function onKeyUp(evt) {
+  if (evt.key === "Control") {
+    this._isCtrlKeyDown = false;
+  }
+}
+function onKeyDown(evt) {
+  this._isCtrlKeyDown = evt.key === "Control";
+  if (this.editorUndoBar?.isOpen && evt.keyCode !== 9 && evt.keyCode !== 16 && !((evt.keyCode === 13 || evt.keyCode === 32) && getActiveOrFocusedElement() === this.appConfig.editorUndoBar.undoButton)) {
+    this.editorUndoBar.hide();
+  }
+  if (this.overlayManager.active) {
+    return;
+  }
+  const {
+    eventBus,
+    pdfViewer
+  } = this;
+  const isViewerInPresentationMode = pdfViewer.isInPresentationMode;
+  let handled = false,
+    ensureViewerFocused = false;
+  const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);
+  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
+    switch (evt.keyCode) {
+      case 70:
+        if (!this.supportsIntegratedFind && !evt.shiftKey) {
+          this.findBar?.open();
+          handled = true;
+        }
+        break;
+      case 71:
+        if (!this.supportsIntegratedFind) {
+          const {
+            state
+          } = this.findController;
+          if (state) {
+            const newState = {
+              source: window,
+              type: "again",
+              findPrevious: cmd === 5 || cmd === 12
+            };
+            eventBus.dispatch("find", {
+              ...state,
+              ...newState
+            });
+          }
+          handled = true;
+        }
+        break;
+      case 61:
+      case 107:
+      case 187:
+      case 171:
+        this.zoomIn();
+        handled = true;
+        break;
+      case 173:
+      case 109:
+      case 189:
+        this.zoomOut();
+        handled = true;
+        break;
+      case 48:
+      case 96:
+        if (!isViewerInPresentationMode) {
+          setTimeout(() => {
+            this.zoomReset();
+          });
+          handled = false;
+        }
+        break;
+      case 38:
+        if (isViewerInPresentationMode || this.page > 1) {
+          this.page = 1;
+          handled = true;
+          ensureViewerFocused = true;
+        }
+        break;
+      case 40:
+        if (isViewerInPresentationMode || this.page < this.pagesCount) {
+          this.page = this.pagesCount;
+          handled = true;
+          ensureViewerFocused = true;
+        }
+        break;
+    }
+  }
+  if (cmd === 1 || cmd === 8) {
+    switch (evt.keyCode) {
+      case 83:
+        eventBus.dispatch("download", {
+          source: window
+        });
+        handled = true;
+        break;
+      case 79:
+        {
+          eventBus.dispatch("openfile", {
+            source: window
+          });
+          handled = true;
+        }
+        break;
+    }
+  }
+  if (cmd === 3 || cmd === 10) {
+    switch (evt.keyCode) {
+      case 80:
+        this.requestPresentationMode();
+        handled = true;
+        this.externalServices.reportTelemetry({
+          type: "buttons",
+          data: {
+            id: "presentationModeKeyboard"
+          }
+        });
+        break;
+      case 71:
+        if (this.appConfig.toolbar) {
+          this.appConfig.toolbar.pageNumber.select();
+          handled = true;
+        }
+        break;
+    }
+  }
+  if (handled) {
+    if (ensureViewerFocused && !isViewerInPresentationMode) {
+      pdfViewer.focus();
+    }
+    evt.preventDefault();
+    return;
+  }
+  const curElement = getActiveOrFocusedElement();
+  const curElementTagName = curElement?.tagName.toUpperCase();
+  if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElementTagName === "BUTTON" && evt.keyCode === 32 || curElement?.isContentEditable) {
+    if (evt.keyCode !== 27) {
+      return;
+    }
+  }
+  if (cmd === 0) {
+    let turnPage = 0,
+      turnOnlyIfPageFit = false;
+    switch (evt.keyCode) {
+      case 38:
+        if (this.supportsCaretBrowsingMode) {
+          this.moveCaret(true, false);
+          handled = true;
+          break;
+        }
+      case 33:
+        if (pdfViewer.isVerticalScrollbarEnabled) {
+          turnOnlyIfPageFit = true;
+        }
+        turnPage = -1;
+        break;
+      case 8:
+        if (!isViewerInPresentationMode) {
+          turnOnlyIfPageFit = true;
+        }
+        turnPage = -1;
+        break;
+      case 37:
+        if (this.supportsCaretBrowsingMode) {
+          return;
+        }
+        if (pdfViewer.isHorizontalScrollbarEnabled) {
+          turnOnlyIfPageFit = true;
+        }
+      case 75:
+      case 80:
+        turnPage = -1;
+        break;
+      case 27:
+        if (this.secondaryToolbar?.isOpen) {
+          this.secondaryToolbar.close();
+          handled = true;
+        }
+        if (!this.supportsIntegratedFind && this.findBar?.opened) {
+          this.findBar.close();
+          handled = true;
+        }
+        break;
+      case 40:
+        if (this.supportsCaretBrowsingMode) {
+          this.moveCaret(false, false);
+          handled = true;
+          break;
+        }
+      case 34:
+        if (pdfViewer.isVerticalScrollbarEnabled) {
+          turnOnlyIfPageFit = true;
+        }
+        turnPage = 1;
+        break;
+      case 32:
+        if (!isViewerInPresentationMode) {
+          turnOnlyIfPageFit = true;
+        }
+        turnPage = 1;
+        break;
+      case 39:
+        if (this.supportsCaretBrowsingMode) {
+          return;
+        }
+        if (pdfViewer.isHorizontalScrollbarEnabled) {
+          turnOnlyIfPageFit = true;
+        }
+      case 74:
+      case 78:
+        turnPage = 1;
+        break;
+      case 36:
+        if (isViewerInPresentationMode || this.page > 1) {
+          this.page = 1;
+          handled = true;
+          ensureViewerFocused = true;
+        }
+        break;
+      case 35:
+        if (isViewerInPresentationMode || this.page < this.pagesCount) {
+          this.page = this.pagesCount;
+          handled = true;
+          ensureViewerFocused = true;
+        }
+        break;
+      case 83:
+        this.pdfCursorTools?.switchTool(CursorTool.SELECT);
+        break;
+      case 72:
+        this.pdfCursorTools?.switchTool(CursorTool.HAND);
+        break;
+      case 82:
+        this.rotatePages(90);
+        break;
+      case 115:
+        this.viewsManager?.toggle();
+        break;
+    }
+    if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) {
+      if (turnPage > 0) {
+        pdfViewer.nextPage();
+      } else {
+        pdfViewer.previousPage();
+      }
+      handled = true;
+    }
+  }
+  if (cmd === 4) {
+    switch (evt.keyCode) {
+      case 32:
+        if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") {
+          break;
+        }
+        pdfViewer.previousPage();
+        handled = true;
+        break;
+      case 38:
+        this.moveCaret(true, true);
+        handled = true;
+        break;
+      case 40:
+        this.moveCaret(false, true);
+        handled = true;
+        break;
+      case 82:
+        this.rotatePages(-90);
+        break;
+    }
+  }
+  if (!handled && !isViewerInPresentationMode) {
+    if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") {
+      ensureViewerFocused = true;
+    }
+  }
+  if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {
+    pdfViewer.focus();
+  }
+  if (handled) {
+    evt.preventDefault();
+  }
+}
+
+;// ./web/viewer.js
+
+
+
+
+
+const AppConstants = {
+  LinkTarget: LinkTarget,
+  RenderingStates: RenderingStates,
+  ScrollMode: ScrollMode,
+  SpreadMode: SpreadMode
+};
+window.PDFViewerApplication = PDFViewerApplication;
+window.PDFViewerApplicationConstants = AppConstants;
+window.PDFViewerApplicationOptions = AppOptions;
+function getViewerConfiguration() {
+  return {
+    appContainer: document.body,
+    principalContainer: document.getElementById("mainContainer"),
+    mainContainer: document.getElementById("viewerContainer"),
+    viewerContainer: document.getElementById("viewer"),
+    viewerAlert: document.getElementById("viewer-alert"),
+    toolbar: {
+      container: document.getElementById("toolbarContainer"),
+      numPages: document.getElementById("numPages"),
+      pageNumber: document.getElementById("pageNumber"),
+      scaleSelect: document.getElementById("scaleSelect"),
+      customScaleOption: document.getElementById("customScaleOption"),
+      previous: document.getElementById("previous"),
+      next: document.getElementById("next"),
+      zoomIn: document.getElementById("zoomInButton"),
+      zoomOut: document.getElementById("zoomOutButton"),
+      print: document.getElementById("printButton"),
+      editorCommentButton: document.getElementById("editorCommentButton"),
+      editorCommentParamsToolbar: document.getElementById("editorCommentParamsToolbar"),
+      editorFreeTextButton: document.getElementById("editorFreeTextButton"),
+      editorFreeTextParamsToolbar: document.getElementById("editorFreeTextParamsToolbar"),
+      editorHighlightButton: document.getElementById("editorHighlightButton"),
+      editorHighlightParamsToolbar: document.getElementById("editorHighlightParamsToolbar"),
+      editorHighlightColorPicker: document.getElementById("editorHighlightColorPicker"),
+      editorInkButton: document.getElementById("editorInkButton"),
+      editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"),
+      editorStampButton: document.getElementById("editorStampButton"),
+      editorStampParamsToolbar: document.getElementById("editorStampParamsToolbar"),
+      editorSignatureButton: document.getElementById("editorSignatureButton"),
+      editorSignatureParamsToolbar: document.getElementById("editorSignatureParamsToolbar"),
+      download: document.getElementById("downloadButton")
+    },
+    secondaryToolbar: {
+      toolbar: document.getElementById("secondaryToolbar"),
+      toggleButton: document.getElementById("secondaryToolbarToggleButton"),
+      presentationModeButton: document.getElementById("presentationMode"),
+      openFileButton: document.getElementById("secondaryOpenFile"),
+      printButton: document.getElementById("secondaryPrint"),
+      downloadButton: document.getElementById("secondaryDownload"),
+      viewBookmarkButton: document.getElementById("viewBookmark"),
+      firstPageButton: document.getElementById("firstPage"),
+      lastPageButton: document.getElementById("lastPage"),
+      pageRotateCwButton: document.getElementById("pageRotateCw"),
+      pageRotateCcwButton: document.getElementById("pageRotateCcw"),
+      cursorSelectToolButton: document.getElementById("cursorSelectTool"),
+      cursorHandToolButton: document.getElementById("cursorHandTool"),
+      scrollPageButton: document.getElementById("scrollPage"),
+      scrollVerticalButton: document.getElementById("scrollVertical"),
+      scrollHorizontalButton: document.getElementById("scrollHorizontal"),
+      scrollWrappedButton: document.getElementById("scrollWrapped"),
+      spreadNoneButton: document.getElementById("spreadNone"),
+      spreadOddButton: document.getElementById("spreadOdd"),
+      spreadEvenButton: document.getElementById("spreadEven"),
+      imageAltTextSettingsButton: document.getElementById("imageAltTextSettings"),
+      imageAltTextSettingsSeparator: document.getElementById("imageAltTextSettingsSeparator"),
+      documentPropertiesButton: document.getElementById("documentProperties")
+    },
+    viewsManager: {
+      outerContainer: document.getElementById("outerContainer"),
+      toggleButton: document.getElementById("viewsManagerToggleButton"),
+      sidebarContainer: document.getElementById("viewsManager"),
+      resizer: document.getElementById("viewsManagerResizer"),
+      thumbnailButton: document.getElementById("thumbnailsViewMenu"),
+      outlineButton: document.getElementById("outlinesViewMenu"),
+      attachmentsButton: document.getElementById("attachmentsViewMenu"),
+      layersButton: document.getElementById("layersViewMenu"),
+      viewsManagerSelectorButton: document.getElementById("viewsManagerSelectorButton"),
+      viewsManagerSelectorOptions: document.getElementById("viewsManagerSelectorOptions"),
+      thumbnailsView: document.getElementById("thumbnailsView"),
+      outlinesView: document.getElementById("outlinesView"),
+      attachmentsView: document.getElementById("attachmentsView"),
+      layersView: document.getElementById("layersView"),
+      viewsManagerAddFile: {
+        button: document.getElementById("viewsManagerAddFileButton"),
+        picker: document.getElementById("viewsManagerAddFilePicker")
+      },
+      viewsManagerCurrentOutlineButton: document.getElementById("viewsManagerCurrentOutlineButton"),
+      viewsManagerHeaderLabel: document.getElementById("viewsManagerHeaderLabel"),
+      viewsManagerStatus: document.getElementById("viewsManagerStatus"),
+      viewsManagerStatusBar: {
+        viewsManagerStatusAction: document.getElementById("viewsManagerStatusAction"),
+        viewsManagerStatusActionDeselectButton: document.getElementById("viewsManagerStatusActionDeselectButton"),
+        viewsManagerStatusActionLabel: document.getElementById("viewsManagerStatusActionLabel")
+      },
+      viewsManagerUndoBar: {
+        viewsManagerStatusUndo: document.getElementById("viewsManagerStatusUndo"),
+        viewsManagerStatusUndoLabel: document.getElementById("viewsManagerStatusUndoLabel"),
+        viewsManagerStatusUndoButton: document.getElementById("viewsManagerStatusUndoButton"),
+        viewsManagerStatusUndoCloseButton: document.getElementById("viewsManagerStatusUndoCloseButton")
+      },
+      viewsManagerWaitingBar: {
+        container: document.getElementById("viewsManagerStatusWaiting"),
+        closeButton: document.getElementById("viewsManagerStatusWaitingCloseButton"),
+        label: document.getElementById("viewsManagerStatusWaitingLabel")
+      },
+      manageMenu: {
+        button: document.getElementById("viewsManagerStatusActionButton"),
+        menu: document.getElementById("viewsManagerStatusActionOptions"),
+        copy: document.getElementById("viewsManagerStatusActionCopy"),
+        cut: document.getElementById("viewsManagerStatusActionCut"),
+        delete: document.getElementById("viewsManagerStatusActionDelete"),
+        exportSelected: document.getElementById("viewsManagerStatusActionExport")
+      }
+    },
+    findBar: {
+      bar: document.getElementById("findbar"),
+      toggleButton: document.getElementById("viewFindButton"),
+      findField: document.getElementById("findInput"),
+      highlightAllCheckbox: document.getElementById("findHighlightAll"),
+      caseSensitiveCheckbox: document.getElementById("findMatchCase"),
+      matchDiacriticsCheckbox: document.getElementById("findMatchDiacritics"),
+      entireWordCheckbox: document.getElementById("findEntireWord"),
+      findMsg: document.getElementById("findMsg"),
+      findResultsCount: document.getElementById("findResultsCount"),
+      findPreviousButton: document.getElementById("findPreviousButton"),
+      findNextButton: document.getElementById("findNextButton")
+    },
+    passwordOverlay: {
+      dialog: document.getElementById("passwordDialog"),
+      label: document.getElementById("passwordText"),
+      input: document.getElementById("password"),
+      submitButton: document.getElementById("passwordSubmit"),
+      cancelButton: document.getElementById("passwordCancel")
+    },
+    documentProperties: {
+      dialog: document.getElementById("documentPropertiesDialog"),
+      closeButton: document.getElementById("documentPropertiesClose"),
+      fields: {
+        fileName: document.getElementById("fileNameField"),
+        fileSize: document.getElementById("fileSizeField"),
+        title: document.getElementById("titleField"),
+        author: document.getElementById("authorField"),
+        subject: document.getElementById("subjectField"),
+        keywords: document.getElementById("keywordsField"),
+        creationDate: document.getElementById("creationDateField"),
+        modificationDate: document.getElementById("modificationDateField"),
+        creator: document.getElementById("creatorField"),
+        producer: document.getElementById("producerField"),
+        version: document.getElementById("versionField"),
+        pageCount: document.getElementById("pageCountField"),
+        pageSize: document.getElementById("pageSizeField"),
+        linearized: document.getElementById("linearizedField")
+      }
+    },
+    altTextDialog: {
+      dialog: document.getElementById("altTextDialog"),
+      optionDescription: document.getElementById("descriptionButton"),
+      optionDecorative: document.getElementById("decorativeButton"),
+      textarea: document.getElementById("descriptionTextarea"),
+      cancelButton: document.getElementById("altTextCancel"),
+      saveButton: document.getElementById("altTextSave")
+    },
+    newAltTextDialog: {
+      dialog: document.getElementById("newAltTextDialog"),
+      title: document.getElementById("newAltTextTitle"),
+      descriptionContainer: document.getElementById("newAltTextDescriptionContainer"),
+      textarea: document.getElementById("newAltTextDescriptionTextarea"),
+      disclaimer: document.getElementById("newAltTextDisclaimer"),
+      learnMore: document.getElementById("newAltTextLearnMore"),
+      imagePreview: document.getElementById("newAltTextImagePreview"),
+      createAutomatically: document.getElementById("newAltTextCreateAutomatically"),
+      createAutomaticallyButton: document.getElementById("newAltTextCreateAutomaticallyButton"),
+      downloadModel: document.getElementById("newAltTextDownloadModel"),
+      downloadModelDescription: document.getElementById("newAltTextDownloadModelDescription"),
+      error: document.getElementById("newAltTextError"),
+      errorCloseButton: document.getElementById("newAltTextCloseButton"),
+      cancelButton: document.getElementById("newAltTextCancel"),
+      notNowButton: document.getElementById("newAltTextNotNow"),
+      saveButton: document.getElementById("newAltTextSave")
+    },
+    altTextSettingsDialog: {
+      dialog: document.getElementById("altTextSettingsDialog"),
+      createModelButton: document.getElementById("createModelButton"),
+      learnMore: document.getElementById("altTextSettingsLearnMore"),
+      showAltTextDialogButton: document.getElementById("showAltTextDialogButton"),
+      altTextSettingsCloseButton: document.getElementById("altTextSettingsCloseButton"),
+      closeButton: document.getElementById("altTextSettingsCloseButton")
+    },
+    addSignatureDialog: {
+      dialog: document.getElementById("addSignatureDialog"),
+      panels: document.getElementById("addSignatureActionContainer"),
+      typeButton: document.getElementById("addSignatureTypeButton"),
+      typeInput: document.getElementById("addSignatureTypeInput"),
+      drawButton: document.getElementById("addSignatureDrawButton"),
+      drawSVG: document.getElementById("addSignatureDraw"),
+      drawPlaceholder: document.getElementById("addSignatureDrawPlaceholder"),
+      drawThickness: document.getElementById("addSignatureDrawThickness"),
+      imageButton: document.getElementById("addSignatureImageButton"),
+      imageSVG: document.getElementById("addSignatureImage"),
+      imagePlaceholder: document.getElementById("addSignatureImagePlaceholder"),
+      imagePicker: document.getElementById("addSignatureFilePicker"),
+      imagePickerLink: document.getElementById("addSignatureImageBrowse"),
+      description: document.getElementById("addSignatureDescription"),
+      clearButton: document.getElementById("clearSignatureButton"),
+      saveContainer: document.getElementById("addSignatureSaveContainer"),
+      saveCheckbox: document.getElementById("addSignatureSaveCheckbox"),
+      errorBar: document.getElementById("addSignatureError"),
+      errorTitle: document.getElementById("addSignatureErrorTitle"),
+      errorDescription: document.getElementById("addSignatureErrorDescription"),
+      errorCloseButton: document.getElementById("addSignatureErrorCloseButton"),
+      cancelButton: document.getElementById("addSignatureCancelButton"),
+      addButton: document.getElementById("addSignatureAddButton")
+    },
+    editSignatureDialog: {
+      dialog: document.getElementById("editSignatureDescriptionDialog"),
+      description: document.getElementById("editSignatureDescription"),
+      editSignatureView: document.getElementById("editSignatureView"),
+      cancelButton: document.getElementById("editSignatureCancelButton"),
+      updateButton: document.getElementById("editSignatureUpdateButton")
+    },
+    annotationEditorParams: {
+      editorCommentsSidebar: document.getElementById("editorCommentsSidebar"),
+      editorCommentsSidebarCount: document.getElementById("editorCommentsSidebarCount"),
+      editorCommentsSidebarTitle: document.getElementById("editorCommentsSidebarTitle"),
+      editorCommentsSidebarCloseButton: document.getElementById("editorCommentsSidebarCloseButton"),
+      editorCommentsSidebarList: document.getElementById("editorCommentsSidebarList"),
+      editorCommentsSidebarResizer: document.getElementById("editorCommentsSidebarResizer"),
+      editorFreeTextFontSize: document.getElementById("editorFreeTextFontSize"),
+      editorFreeTextColor: document.getElementById("editorFreeTextColor"),
+      editorInkColor: document.getElementById("editorInkColor"),
+      editorInkThickness: document.getElementById("editorInkThickness"),
+      editorInkOpacity: document.getElementById("editorInkOpacity"),
+      editorStampAddImage: document.getElementById("editorStampAddImage"),
+      editorSignatureAddSignature: document.getElementById("editorSignatureAddSignature"),
+      editorFreeHighlightThickness: document.getElementById("editorFreeHighlightThickness"),
+      editorHighlightShowAll: document.getElementById("editorHighlightShowAll")
+    },
+    printContainer: document.getElementById("printContainer"),
+    editorUndoBar: {
+      container: document.getElementById("editorUndoBar"),
+      message: document.getElementById("editorUndoBarMessage"),
+      undoButton: document.getElementById("editorUndoBarUndoButton"),
+      closeButton: document.getElementById("editorUndoBarCloseButton")
+    },
+    editCommentDialog: {
+      dialog: document.getElementById("commentManagerDialog"),
+      toolbar: document.getElementById("commentManagerToolbar"),
+      title: document.getElementById("commentManagerTitle"),
+      textInput: document.getElementById("commentManagerTextInput"),
+      cancelButton: document.getElementById("commentManagerCancelButton"),
+      saveButton: document.getElementById("commentManagerSaveButton")
+    }
+  };
+}
+function webViewerLoad() {
+  const config = getViewerConfiguration();
+  const event = new CustomEvent("webviewerloaded", {
+    bubbles: true,
+    cancelable: true,
+    detail: {
+      source: window
+    }
+  });
+  try {
+    parent.document.dispatchEvent(event);
+  } catch (ex) {
+    console.error("webviewerloaded:", ex);
+    document.dispatchEvent(event);
+  }
+  PDFViewerApplication.run(config);
+}
+document.blockUnblockOnload?.(true);
+if (document.readyState === "interactive" || document.readyState === "complete") {
+  webViewerLoad();
+} else {
+  document.addEventListener("DOMContentLoaded", webViewerLoad, true);
+}
+
+export { PDFViewerApplication, AppConstants as PDFViewerApplicationConstants, AppOptions as PDFViewerApplicationOptions };
+
+//# sourceMappingURL=viewer.mjs.map
\ No newline at end of file
diff --git a/public/pdfjs/web/viewer.mjs.map b/public/pdfjs/web/viewer.mjs.map
new file mode 100644
index 0000000..376c30f
--- /dev/null
+++ b/public/pdfjs/web/viewer.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"viewer.mjs","mappings":"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","sources":["webpack://pdf.js/./web/ui_utils.js","webpack://pdf.js/./web/app_options.js","webpack://pdf.js/./web/pdfjs.js","webpack://pdf.js/./web/internal_evt.js","webpack://pdf.js/./web/pdf_link_service.js","webpack://pdf.js/./web/event_utils.js","webpack://pdf.js/./web/external_services.js","webpack://pdf.js/./web/preferences.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/types.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/resolver.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/scope.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/builtins.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/memoizer.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/bundle.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/resource.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/index.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/overlay.js","webpack://pdf.js/./node_modules/cached-iterable/src/cached_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/cached_sync_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/cached_async_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/index.mjs","webpack://pdf.js/./node_modules/@fluent/dom/esm/localization.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/dom_localization.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/index.js","webpack://pdf.js/./web/l10n.js","webpack://pdf.js/./web/genericl10n.js","webpack://pdf.js/./web/generic_scripting.js","webpack://pdf.js/./web/generic_signature_storage.js","webpack://pdf.js/./web/genericcom.js","webpack://pdf.js/./web/new_alt_text_manager.js","webpack://pdf.js/./web/alt_text_manager.js","webpack://pdf.js/./web/annotation_editor_params.js","webpack://pdf.js/./web/caret_browsing.js","webpack://pdf.js/./web/sidebar.js","webpack://pdf.js/./web/comment_manager.js","webpack://pdf.js/./web/base_download_manager.js","webpack://pdf.js/./web/download_manager.js","webpack://pdf.js/./web/editor_undo_bar.js","webpack://pdf.js/./web/overlay_manager.js","webpack://pdf.js/./web/password_prompt.js","webpack://pdf.js/./web/base_tree_viewer.js","webpack://pdf.js/./web/pdf_attachment_viewer.js","webpack://pdf.js/./web/grab_to_pan.js","webpack://pdf.js/./web/pdf_cursor_tools.js","webpack://pdf.js/./web/pdf_document_properties.js","webpack://pdf.js/./web/pdf_find_utils.js","webpack://pdf.js/./web/pdf_find_controller.js","webpack://pdf.js/./web/pdf_find_bar.js","webpack://pdf.js/./web/pdf_history.js","webpack://pdf.js/./web/pdf_layer_viewer.js","webpack://pdf.js/./web/pdf_outline_viewer.js","webpack://pdf.js/./web/pdf_presentation_mode.js","webpack://pdf.js/./web/xfa_layer_builder.js","webpack://pdf.js/./web/print_utils.js","webpack://pdf.js/./web/pdf_print_service.js","webpack://pdf.js/./web/renderable_view.js","webpack://pdf.js/./web/pdf_rendering_queue.js","webpack://pdf.js/./web/pdf_scripting_manager.js","webpack://pdf.js/./web/pdf_text_extractor.js","webpack://pdf.js/./web/menu.js","webpack://pdf.js/./web/pdf_thumbnail_view.js","webpack://pdf.js/./web/pdf_thumbnail_viewer.js","webpack://pdf.js/./web/annotation_editor_layer_builder.js","webpack://pdf.js/./web/annotation_layer_builder.js","webpack://pdf.js/./web/autolinker.js","webpack://pdf.js/./web/base_pdf_page_view.js","webpack://pdf.js/./web/draw_layer_builder.js","webpack://pdf.js/./web/pdf_page_detail_view.js","webpack://pdf.js/./web/struct_tree_layer_builder.js","webpack://pdf.js/./web/text_accessibility.js","webpack://pdf.js/./web/text_highlighter.js","webpack://pdf.js/./web/text_layer_builder.js","webpack://pdf.js/./web/pdf_page_view.js","webpack://pdf.js/./web/pdf_viewer.js","webpack://pdf.js/./web/secondary_toolbar.js","webpack://pdf.js/./web/signature_manager.js","webpack://pdf.js/./web/toolbar.js","webpack://pdf.js/./web/view_history.js","webpack://pdf.js/./web/views_manager.js","webpack://pdf.js/./web/app.js","webpack://pdf.js/./web/viewer.js"],"sourcesContent":["/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DEFAULT_SCALE_VALUE = \"auto\";\nconst DEFAULT_SCALE = 1.0;\nconst DEFAULT_SCALE_DELTA = 1.1;\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 25.0;\nconst UNKNOWN_SCALE = 0;\nconst MAX_AUTO_SCALE = 1.25;\nconst SCROLLBAR_PADDING = 40;\nconst VERTICAL_PADDING = 5;\n\nconst PresentationModeState = {\n  UNKNOWN: 0,\n  NORMAL: 1,\n  CHANGING: 2,\n  FULLSCREEN: 3,\n};\n\nconst SidebarView = {\n  UNKNOWN: -1,\n  NONE: 0,\n  THUMBS: 1, // Default value.\n  OUTLINE: 2,\n  ATTACHMENTS: 3,\n  LAYERS: 4,\n};\n\nconst TextLayerMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_PERMISSIONS: 2,\n};\n\nconst ScrollMode = {\n  UNKNOWN: -1,\n  VERTICAL: 0, // Default value.\n  HORIZONTAL: 1,\n  WRAPPED: 2,\n  PAGE: 3,\n};\n\nconst SpreadMode = {\n  UNKNOWN: -1,\n  NONE: 0, // Default value.\n  ODD: 1,\n  EVEN: 2,\n};\n\nconst CursorTool = {\n  SELECT: 0, // The default value.\n  HAND: 1,\n  ZOOM: 2,\n};\n\n// Used by `PDFViewerApplication`, and by the API unit-tests.\nconst AutoPrintRegExp = /\\bprint\\s*\\(/;\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {HTMLElement} element - The element to be visible.\n * @param {Object} [spot] - An object with optional top and left properties,\n *   specifying the offset from the top left edge.\n * @param {number} [spot.left]\n * @param {number} [spot.top]\n */\nfunction scrollIntoView(element, spot) {\n  // Assuming offsetParent is available (it's not available when viewer is in\n  // hidden iframe or object). We have to scroll: if the offsetParent is not set\n  // producing the error. See also animationStarted.\n  let parent = element.offsetParent;\n  if (!parent) {\n    console.error(\"offsetParent is not set -- cannot scroll\");\n    return;\n  }\n  let offsetY = element.offsetTop + element.clientTop;\n  let offsetX = element.offsetLeft + element.clientLeft;\n  while (\n    parent.clientHeight === parent.scrollHeight &&\n    parent.clientWidth === parent.scrollWidth\n  ) {\n    offsetY += parent.offsetTop;\n    offsetX += parent.offsetLeft;\n\n    parent = parent.offsetParent;\n    if (!parent) {\n      return; // no need to scroll\n    }\n  }\n  if (spot) {\n    if (spot.top !== undefined) {\n      offsetY += spot.top;\n    }\n    if (spot.left !== undefined) {\n      offsetX += spot.left;\n      parent.scrollLeft = offsetX;\n    }\n  }\n  parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback, abortSignal = undefined) {\n  const debounceScroll = function (evt) {\n    if (rAF) {\n      return;\n    }\n    // schedule an invocation of scroll for next animation frame.\n    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n      rAF = null;\n\n      const currentX = viewAreaElement.scrollLeft;\n      const lastX = state.lastX;\n      if (currentX !== lastX) {\n        state.right = currentX > lastX;\n      }\n      state.lastX = currentX;\n      const currentY = viewAreaElement.scrollTop;\n      const lastY = state.lastY;\n      if (currentY !== lastY) {\n        state.down = currentY > lastY;\n      }\n      state.lastY = currentY;\n      callback(state);\n    });\n  };\n\n  const state = {\n    right: true,\n    down: true,\n    lastX: viewAreaElement.scrollLeft,\n    lastY: viewAreaElement.scrollTop,\n    _eventHandler: debounceScroll,\n  };\n\n  let rAF = null;\n  viewAreaElement.addEventListener(\"scroll\", debounceScroll, {\n    useCapture: true,\n    signal: abortSignal,\n  });\n  abortSignal?.addEventListener(\n    \"abort\",\n    () => window.cancelAnimationFrame(rAF),\n    { once: true }\n  );\n  return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value&param2=...).\n * @param {string} query\n * @returns {Map}\n */\nfunction parseQueryString(query) {\n  const params = new Map();\n  for (const [key, value] of new URLSearchParams(query)) {\n    params.set(key.toLowerCase(), value);\n  }\n  return params;\n}\n\n// eslint-disable-next-line no-control-regex\nconst InvisibleCharsRegExp = /[\\x00-\\x1F]/g;\n\n/**\n * @param {string} str\n * @param {boolean} [replaceInvisible]\n */\nfunction removeNullCharacters(str, replaceInvisible = false) {\n  if (!InvisibleCharsRegExp.test(str)) {\n    return str;\n  }\n  if (replaceInvisible) {\n    return str.replaceAll(InvisibleCharsRegExp, m => (m === \"\\x00\" ? \"\" : \" \"));\n  }\n  return str.replaceAll(\"\\x00\", \"\");\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {number} Index of the first array element to pass the test,\n *                   or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition, start = 0) {\n  let minIndex = start;\n  let maxIndex = items.length - 1;\n\n  if (maxIndex < 0 || !condition(items[maxIndex])) {\n    return items.length;\n  }\n  if (condition(items[minIndex])) {\n    return minIndex;\n  }\n\n  while (minIndex < maxIndex) {\n    const currentIndex = (minIndex + maxIndex) >> 1;\n    const currentItem = items[currentIndex];\n    if (condition(currentItem)) {\n      maxIndex = currentIndex;\n    } else {\n      minIndex = currentIndex + 1;\n    }\n  }\n  return minIndex; /* === maxIndex */\n}\n\n/**\n *  Approximates float number as a fraction using Farey sequence (max order\n *  of 8).\n *  @param {number} x - Positive float number.\n *  @returns {Array} Estimated fraction: the first array item is a numerator,\n *                   the second one is a denominator.\n *                   They are both natural numbers.\n */\nfunction approximateFraction(x) {\n  // Fast paths for int numbers or their inversions.\n  if (Math.floor(x) === x) {\n    return [x, 1];\n  }\n  const xinv = 1 / x;\n  const limit = 8;\n  if (xinv > limit) {\n    return [1, limit];\n  } else if (Math.floor(xinv) === xinv) {\n    return [1, xinv];\n  }\n\n  const x_ = x > 1 ? xinv : x;\n  // a/b and c/d are neighbours in Farey sequence.\n  let a = 0,\n    b = 1,\n    c = 1,\n    d = 1;\n  // Limiting search to order 8.\n  while (true) {\n    // Generating next term in sequence (order of q).\n    const p = a + c,\n      q = b + d;\n    if (q > limit) {\n      break;\n    }\n    if (x_ <= p / q) {\n      c = p;\n      d = q;\n    } else {\n      a = p;\n      b = q;\n    }\n  }\n  // Select closest of the neighbours to x.\n  if (x_ - a / b < c / d - x_) {\n    return x_ === x ? [a, b] : [b, a];\n  }\n  return x_ === x ? [c, d] : [d, c];\n}\n\n/**\n * @param {number} x - A positive number to round to a multiple of `div`.\n * @param {number} div - A natural number.\n */\nfunction floorToDivide(x, div) {\n  return x - (x % div);\n}\n\n/**\n * @typedef {Object} GetPageSizeInchesParameters\n * @property {number[]} view\n * @property {number} userUnit\n * @property {number} rotate\n */\n\n/**\n * @typedef {Object} PageSize\n * @property {number} width - In inches.\n * @property {number} height - In inches.\n */\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {GetPageSizeInchesParameters} params\n * @returns {PageSize}\n */\nfunction getPageSizeInches({ view, userUnit, rotate }) {\n  const [x1, y1, x2, y2] = view;\n  // We need to take the page rotation into account as well.\n  const changeOrientation = rotate % 180 !== 0;\n\n  const width = ((x2 - x1) / 72) * userUnit;\n  const height = ((y2 - y1) / 72) * userUnit;\n\n  return {\n    width: changeOrientation ? height : width,\n    height: changeOrientation ? width : height,\n  };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n *   before the first visible element in `views`, but not by too much. (Usually,\n *   this will be the first element in the first partially visible row in\n *   `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n  // binarySearchFirstItem's assumption is that the input is ordered, with only\n  // one index where the conditions flips from false to true: [false ...,\n  // true...]. With vertical scrolling and spreads, it is possible to have\n  // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n  // similar sequence, with many more mixed true and false in the middle.\n  //\n  // So there is no guarantee that the binary search yields the index of the\n  // first visible element. It could have been any of the other visible elements\n  // that were preceded by a hidden element.\n\n  // Of course, if either this element or the previous (hidden) element is also\n  // the first element, there's nothing to worry about.\n  if (index < 2) {\n    return index;\n  }\n\n  // That aside, the possible cases are represented below.\n  //\n  //     ****  = fully hidden\n  //     A*B*  = mix of partially visible and/or hidden pages\n  //     CDEF  = fully visible\n  //\n  // (1) Binary search could have returned A, in which case we can stop.\n  // (2) Binary search could also have returned B, in which case we need to\n  // check the whole row.\n  // (3) Binary search could also have returned C, in which case we need to\n  // check the whole previous row.\n  //\n  // There's one other possibility:\n  //\n  //     ****  = fully hidden\n  //     ABCD  = mix of fully and/or partially visible pages\n  //\n  // (4) Binary search could only have returned A.\n\n  // Initially assume that we need to find the beginning of the current row\n  // (case 1, 2, or 4), which means finding a page that is above the current\n  // page's top. If the found page is partially visible, we're definitely not in\n  // case 3, and this assumption is correct.\n  let elt = views[index].div;\n  let pageTop = elt.offsetTop + elt.clientTop;\n\n  if (pageTop >= top) {\n    // The found page is fully visible, so we're actually either in case 3 or 4,\n    // and unfortunately we can't tell the difference between them without\n    // scanning the entire previous row, so we just conservatively assume that\n    // we do need to backtrack to that row. In both cases, the previous page is\n    // in the previous row, so use its top instead.\n    elt = views[index - 1].div;\n    pageTop = elt.offsetTop + elt.clientTop;\n  }\n\n  // Now we backtrack to the first page that still has its bottom below\n  // `pageTop`, which is the top of a page in the first visible row (unless\n  // we're in case 4, in which case it's the row before that).\n  // `index` is found by binary search, so the page at `index - 1` is\n  // invisible and we can start looking for potentially visible pages from\n  // `index - 2`. (However, if this loop terminates on its first iteration,\n  // which is the case when pages are stacked vertically, `index` should remain\n  // unchanged, so we use a distinct loop variable.)\n  for (let i = index - 2; i >= 0; --i) {\n    elt = views[i].div;\n    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n      // We have reached the previous row, so stop now.\n      // This loop is expected to terminate relatively quickly because the\n      // number of pages per row is expected to be small.\n      break;\n    }\n    index = i;\n  }\n  return index;\n}\n\n/**\n * @typedef {Object} GetVisibleElementsParameters\n * @property {HTMLElement} scrollEl - A container that can possibly scroll.\n * @property {Array} views - Objects with a `div` property that contains an\n *   HTMLElement, which should all be descendants of `scrollEl` satisfying the\n *   relevant layout assumptions.\n * @property {boolean} sortByVisibility - If `true`, the returned elements are\n *   sorted in descending order of the percent of their padding box that is\n *   visible. The default value is `false`.\n * @property {boolean} horizontal - If `true`, the elements are assumed to be\n *   laid out horizontally instead of vertically. The default value is `false`.\n * @property {boolean} rtl - If `true`, the `scrollEl` container is assumed to\n *   be in right-to-left mode. The default value is `false`.\n */\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n *   - If `horizontal`, no left of any earlier element is to the right of the\n *     left of any later element.\n *   - Otherwise, `views` can be split into contiguous rows where, within a row,\n *     no top of any element is below the bottom of any other element, and\n *     between rows, no bottom of any element in an earlier row is below the\n *     top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param {GetVisibleElementsParameters} params\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements({\n  scrollEl,\n  views,\n  sortByVisibility = false,\n  horizontal = false,\n  rtl = false,\n}) {\n  const top = scrollEl.scrollTop,\n    bottom = top + scrollEl.clientHeight;\n  const left = scrollEl.scrollLeft,\n    right = left + scrollEl.clientWidth;\n\n  // Throughout this \"generic\" function, comments will assume we're working with\n  // PDF document pages, which is the most important and complex case. In this\n  // case, the visible elements we're actually interested is the page canvas,\n  // which is contained in a wrapper which adds no padding/border/margin, which\n  // is itself contained in `view.div` which adds no padding (but does add a\n  // border). So, as specified in this function's doc comment, this function\n  // does all of its work on the padding edge of the provided views, starting at\n  // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n  // the border). Adding clientWidth/Height gets us the bottom-right corner of\n  // the padding edge.\n  function isElementBottomAfterViewTop(view) {\n    const element = view.div;\n    const elementBottom =\n      element.offsetTop + element.clientTop + element.clientHeight;\n    return elementBottom > top;\n  }\n  function isElementNextAfterViewHorizontally(view) {\n    const element = view.div;\n    const elementLeft = element.offsetLeft + element.clientLeft;\n    const elementRight = elementLeft + element.clientWidth;\n    return rtl ? elementLeft < right : elementRight > left;\n  }\n\n  const visible = [],\n    ids = new Set(),\n    numViews = views.length;\n  let firstVisibleElementInd = binarySearchFirstItem(\n    views,\n    horizontal\n      ? isElementNextAfterViewHorizontally\n      : isElementBottomAfterViewTop\n  );\n\n  // Please note the return value of the `binarySearchFirstItem` function when\n  // no valid element is found (hence the `firstVisibleElementInd` check below).\n  if (\n    firstVisibleElementInd > 0 &&\n    firstVisibleElementInd < numViews &&\n    !horizontal\n  ) {\n    // In wrapped scrolling (or vertical scrolling with spreads), with some page\n    // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n    // condition: there can be pages with bottoms above the view top between\n    // pages with bottoms below. This function detects and corrects that error;\n    // see it for more comments.\n    firstVisibleElementInd = backtrackBeforeAllVisibleElements(\n      firstVisibleElementInd,\n      views,\n      top\n    );\n  }\n\n  // lastEdge acts as a cutoff for us to stop looping, because we know all\n  // subsequent pages will be hidden.\n  //\n  // When using wrapped scrolling or vertical scrolling with spreads, we can't\n  // simply stop the first time we reach a page below the bottom of the view;\n  // the tops of subsequent pages on the same row could still be visible. In\n  // horizontal scrolling, we don't have that issue, so we can stop as soon as\n  // we pass `right`, without needing the code below that handles the -1 case.\n  let lastEdge = horizontal ? right : -1;\n\n  for (let i = firstVisibleElementInd; i < numViews; i++) {\n    const view = views[i],\n      element = view.div;\n    const currentWidth = element.offsetLeft + element.clientLeft;\n    const currentHeight = element.offsetTop + element.clientTop;\n    const viewWidth = element.clientWidth,\n      viewHeight = element.clientHeight;\n    const viewRight = currentWidth + viewWidth;\n    const viewBottom = currentHeight + viewHeight;\n\n    if (lastEdge === -1) {\n      // As commented above, this is only needed in non-horizontal cases.\n      // Setting lastEdge to the bottom of the first page that is partially\n      // visible ensures that the next page fully below lastEdge is on the\n      // next row, which has to be fully hidden along with all subsequent rows.\n      if (viewBottom >= bottom) {\n        lastEdge = viewBottom;\n      }\n    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n      break;\n    }\n\n    if (\n      viewBottom <= top ||\n      currentHeight >= bottom ||\n      viewRight <= left ||\n      currentWidth >= right\n    ) {\n      continue;\n    }\n\n    const minY = Math.max(0, top - currentHeight);\n    const minX = Math.max(0, left - currentWidth);\n\n    const hiddenHeight = minY + Math.max(0, viewBottom - bottom);\n    const hiddenWidth = minX + Math.max(0, viewRight - right);\n\n    const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,\n      fractionWidth = (viewWidth - hiddenWidth) / viewWidth;\n    const percent = (fractionHeight * fractionWidth * 100) | 0;\n\n    visible.push({\n      id: view.id,\n      x: currentWidth,\n      y: currentHeight,\n      visibleArea:\n        // We only specify which part of the page is visible when it's not\n        // the full page, as there is no point in handling a partial page\n        // rendering otherwise.\n        percent === 100\n          ? null\n          : {\n              minX,\n              minY,\n              maxX: Math.min(viewRight, right) - currentWidth,\n              maxY: Math.min(viewBottom, bottom) - currentHeight,\n            },\n      view,\n      percent,\n      widthPercent: (fractionWidth * 100) | 0,\n    });\n    ids.add(view.id);\n  }\n\n  const first = visible[0],\n    last = visible.at(-1);\n\n  if (sortByVisibility) {\n    visible.sort(function (a, b) {\n      const pc = a.percent - b.percent;\n      if (Math.abs(pc) > 0.001) {\n        return -pc;\n      }\n      return a.id - b.id; // ensure stability\n    });\n  }\n  return { first, last, views: visible, ids };\n}\n\nfunction normalizeWheelEventDirection(evt) {\n  let delta = Math.hypot(evt.deltaX, evt.deltaY);\n  const angle = Math.atan2(evt.deltaY, evt.deltaX);\n  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n    // All that is left-up oriented has to change the sign.\n    delta = -delta;\n  }\n  return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n  const deltaMode = evt.deltaMode; // Avoid being affected by bug 1392460.\n  let delta = normalizeWheelEventDirection(evt);\n\n  const MOUSE_PIXELS_PER_LINE = 30;\n  const MOUSE_LINES_PER_PAGE = 30;\n\n  // Converts delta to per-page units\n  if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n  } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) {\n    delta /= MOUSE_LINES_PER_PAGE;\n  }\n  return delta;\n}\n\nfunction isValidRotation(angle) {\n  return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n  return (\n    Number.isInteger(mode) &&\n    Object.values(ScrollMode).includes(mode) &&\n    mode !== ScrollMode.UNKNOWN\n  );\n}\n\nfunction isValidSpreadMode(mode) {\n  return (\n    Number.isInteger(mode) &&\n    Object.values(SpreadMode).includes(mode) &&\n    mode !== SpreadMode.UNKNOWN\n  );\n}\n\nfunction isPortraitOrientation(size) {\n  return size.width <= size.height;\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nconst animationStarted = new Promise(function (resolve) {\n  if (\n    typeof PDFJSDev !== \"undefined\" &&\n    PDFJSDev.test(\"LIB\") &&\n    typeof window === \"undefined\"\n  ) {\n    // Prevent \"ReferenceError: window is not defined\" errors when running the\n    // unit-tests in Node.js environments.\n    setTimeout(resolve, 20);\n    return;\n  }\n  window.requestAnimationFrame(resolve);\n});\n\nconst docStyle =\n  typeof PDFJSDev !== \"undefined\" &&\n  PDFJSDev.test(\"LIB\") &&\n  typeof document === \"undefined\"\n    ? null\n    : document.documentElement.style;\n\nclass ProgressBar {\n  #classList = null;\n\n  #disableAutoFetchTimeout = null;\n\n  #percent = 0;\n\n  #style = null;\n\n  #visible = true;\n\n  constructor(bar) {\n    this.#classList = bar.classList;\n    this.#style = bar.style;\n  }\n\n  get percent() {\n    return this.#percent;\n  }\n\n  set percent(val) {\n    this.#percent = val;\n\n    if (isNaN(val)) {\n      this.#classList.add(\"indeterminate\");\n      return;\n    }\n    this.#classList.remove(\"indeterminate\");\n\n    this.#style.setProperty(\"--progressBar-percent\", `${this.#percent}%`);\n  }\n\n  setWidth(viewer) {\n    if (!viewer) {\n      return;\n    }\n    const container = viewer.parentNode;\n    const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n    if (scrollbarWidth > 0) {\n      this.#style.setProperty(\n        \"--progressBar-end-offset\",\n        `${scrollbarWidth}px`\n      );\n    }\n  }\n\n  setDisableAutoFetch(delay = /* ms = */ 5000) {\n    if (this.#percent === 100 || isNaN(this.#percent)) {\n      return;\n    }\n    if (this.#disableAutoFetchTimeout) {\n      clearTimeout(this.#disableAutoFetchTimeout);\n    }\n    this.show();\n\n    this.#disableAutoFetchTimeout = setTimeout(() => {\n      this.#disableAutoFetchTimeout = null;\n      this.hide();\n    }, delay);\n  }\n\n  hide() {\n    if (!this.#visible) {\n      return;\n    }\n    this.#visible = false;\n    this.#classList.add(\"hidden\");\n  }\n\n  show() {\n    if (this.#visible) {\n      return;\n    }\n    this.#visible = true;\n    this.#classList.remove(\"hidden\");\n  }\n}\n\n/**\n * Get the active or focused element in current DOM.\n *\n * Recursively search for the truly active or focused element in case there are\n * shadow DOMs.\n *\n * @returns {Element} the truly active or focused element.\n */\nfunction getActiveOrFocusedElement() {\n  let curRoot = document;\n  let curActiveOrFocused =\n    curRoot.activeElement || curRoot.querySelector(\":focus\");\n\n  while (curActiveOrFocused?.shadowRoot) {\n    curRoot = curActiveOrFocused.shadowRoot;\n    curActiveOrFocused =\n      curRoot.activeElement || curRoot.querySelector(\":focus\");\n  }\n\n  return curActiveOrFocused;\n}\n\n/**\n * Converts API PageLayout values to the format used by `BaseViewer`.\n * @param {string} layout - The API PageLayout value.\n * @returns {Object}\n */\nfunction apiPageLayoutToViewerModes(layout) {\n  let scrollMode = ScrollMode.VERTICAL,\n    spreadMode = SpreadMode.NONE;\n\n  switch (layout) {\n    case \"SinglePage\":\n      scrollMode = ScrollMode.PAGE;\n      break;\n    case \"OneColumn\":\n      break;\n    case \"TwoPageLeft\":\n      scrollMode = ScrollMode.PAGE;\n    /* falls through */\n    case \"TwoColumnLeft\":\n      spreadMode = SpreadMode.ODD;\n      break;\n    case \"TwoPageRight\":\n      scrollMode = ScrollMode.PAGE;\n    /* falls through */\n    case \"TwoColumnRight\":\n      spreadMode = SpreadMode.EVEN;\n      break;\n  }\n  return { scrollMode, spreadMode };\n}\n\n/**\n * Converts API PageMode values to the format used by `PDFSidebar`.\n * NOTE: There's also a \"FullScreen\" parameter which is not possible to support,\n *       since the Fullscreen API used in browsers requires that entering\n *       fullscreen mode only occurs as a result of a user-initiated event.\n * @param {string} mode - The API PageMode value.\n * @returns {number} A value from {SidebarView}.\n */\nfunction apiPageModeToSidebarView(mode) {\n  switch (mode) {\n    case \"UseNone\":\n      return SidebarView.NONE;\n    case \"UseThumbs\":\n      return SidebarView.THUMBS;\n    case \"UseOutlines\":\n      return SidebarView.OUTLINE;\n    case \"UseAttachments\":\n      return SidebarView.ATTACHMENTS;\n    case \"UseOC\":\n      return SidebarView.LAYERS;\n  }\n  return SidebarView.NONE; // Default value.\n}\n\nfunction toggleCheckedBtn(button, toggle, view = null) {\n  button.classList.toggle(\"toggled\", toggle);\n  button.setAttribute(\"aria-checked\", toggle);\n\n  view?.classList.toggle(\"hidden\", !toggle);\n}\n\nfunction toggleSelectedBtn(button, toggle, view = null) {\n  button.classList.toggle(\"selected\", toggle);\n  button.setAttribute(\"aria-selected\", toggle);\n\n  view?.classList.toggle(\"hidden\", !toggle);\n}\n\nfunction toggleExpandedBtn(button, toggle, view = null) {\n  button.classList.toggle(\"toggled\", toggle);\n  button.setAttribute(\"aria-expanded\", toggle);\n\n  view?.classList.toggle(\"hidden\", !toggle);\n}\n\n// In Firefox, the css calc function uses f32 precision but the Chrome or Safari\n// are using f64 one. So in order to have the same rendering in all browsers, we\n// need to use the right precision in order to have correct dimensions.\nconst calcRound =\n  typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n    ? Math.fround\n    : (function () {\n        if (\n          typeof PDFJSDev !== \"undefined\" &&\n          PDFJSDev.test(\"LIB\") &&\n          typeof document === \"undefined\"\n        ) {\n          return x => x;\n        }\n        const e = document.createElement(\"div\");\n        e.style.width = \"round(down, calc(1.6666666666666665 * 792px), 1px)\";\n        return e.style.width === \"calc(1320px)\" ? Math.fround : x => x;\n      })();\n\nexport {\n  animationStarted,\n  apiPageLayoutToViewerModes,\n  apiPageModeToSidebarView,\n  approximateFraction,\n  AutoPrintRegExp,\n  backtrackBeforeAllVisibleElements, // only exported for testing\n  binarySearchFirstItem,\n  calcRound,\n  CursorTool,\n  DEFAULT_SCALE,\n  DEFAULT_SCALE_DELTA,\n  DEFAULT_SCALE_VALUE,\n  docStyle,\n  floorToDivide,\n  getActiveOrFocusedElement,\n  getPageSizeInches,\n  getVisibleElements,\n  isPortraitOrientation,\n  isValidRotation,\n  isValidScrollMode,\n  isValidSpreadMode,\n  MAX_AUTO_SCALE,\n  MAX_SCALE,\n  MIN_SCALE,\n  normalizeWheelEventDelta,\n  normalizeWheelEventDirection,\n  parseQueryString,\n  PresentationModeState,\n  ProgressBar,\n  removeNullCharacters,\n  SCROLLBAR_PADDING,\n  scrollIntoView,\n  ScrollMode,\n  SidebarView,\n  SpreadMode,\n  TextLayerMode,\n  toggleCheckedBtn,\n  toggleExpandedBtn,\n  toggleSelectedBtn,\n  UNKNOWN_SCALE,\n  VERTICAL_PADDING,\n  watchScroll,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n  var compatParams = new Map(); // eslint-disable-line no-var\n  const { maxTouchPoints, platform, userAgent } = navigator;\n\n  const isAndroid = /Android/.test(userAgent);\n  const isIOS =\n    /\\b(?:iPad|iPhone|iPod)(?=;)/.test(userAgent) ||\n    (platform === \"MacIntel\" && maxTouchPoints > 1);\n\n  // Limit canvas size to 5 mega-pixels on mobile.\n  // Support: Android, iOS\n  if (isIOS || isAndroid) {\n    compatParams.set(\"maxCanvasPixels\", 5242880);\n  }\n\n  // Don't use system fonts on Android (issue 18210).\n  // Support: Android\n  if (isAndroid) {\n    compatParams.set(\"useSystemFonts\", false);\n  }\n}\n\nconst OptionKind = {\n  BROWSER: 0x01,\n  VIEWER: 0x02,\n  API: 0x04,\n  WORKER: 0x08,\n  EVENT_DISPATCH: 0x10,\n  PREFERENCE: 0x80,\n};\n\n// Should only be used with options that allow multiple types.\nconst Type = {\n  BOOLEAN: 0x01,\n  NUMBER: 0x02,\n  OBJECT: 0x04,\n  STRING: 0x08,\n  UNDEFINED: 0x10,\n};\n\n/**\n * NOTE: These options are used to generate the `default_preferences.json` file,\n *       see `OptionKind.PREFERENCE`, hence the values below must use only\n *       primitive types and cannot rely on any imported types.\n */\nconst defaultOptions = {\n  allowedGlobalEvents: {\n    /** @type {Object} */\n    value: null,\n    kind: OptionKind.BROWSER,\n  },\n  canvasMaxAreaInBytes: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.BROWSER + OptionKind.API,\n  },\n  isInAutomation: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.BROWSER,\n  },\n  localeProperties: {\n    /** @type {Object} */\n    value:\n      typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n        ? { lang: navigator.language || \"en-US\" }\n        : null,\n    kind: OptionKind.BROWSER,\n  },\n  maxCanvasDim: {\n    /** @type {number} */\n    value: 32767,\n    kind: OptionKind.BROWSER + OptionKind.VIEWER,\n  },\n  nimbusDataStr: {\n    /** @type {string} */\n    value: \"\",\n    kind: OptionKind.BROWSER,\n  },\n  supportsCaretBrowsingMode: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.BROWSER,\n  },\n  supportsDocumentFonts: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  supportsDownloading: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  supportsIntegratedFind: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.BROWSER,\n  },\n  supportsMouseWheelZoomCtrlKey: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  supportsMouseWheelZoomMetaKey: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  supportsPinchToZoom: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  supportsPrinting: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.BROWSER,\n  },\n  toolbarDensity: {\n    /** @type {number} */\n    value: 0, // 0 = \"normal\", 1 = \"compact\", 2 = \"touch\"\n    kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH,\n  },\n\n  altTextLearnMoreUrl: {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? \"https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/pdf-alt-text\"\n        : \"\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  annotationEditorMode: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  annotationMode: {\n    /** @type {number} */\n    value: 2,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  capCanvasAreaFactor: {\n    /** @type {number} */\n    value: 200,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  commentLearnMoreUrl: {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\")\n        ? \"https://support.mozilla.org/%LOCALE%/kb/view-pdf-files-firefox-or-choose-another-viewer#w_add-a-comment-to-a-pdf\"\n        : \"\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  cursorToolOnLoad: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  debuggerSrc: {\n    /** @type {string} */\n    value: \"./debugger.mjs\",\n    kind: OptionKind.VIEWER,\n  },\n  defaultZoomDelay: {\n    /** @type {number} */\n    value: 400,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  defaultZoomValue: {\n    /** @type {string} */\n    value: \"\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  disableHistory: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  disablePageLabels: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableAltText: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableAltTextModelDownload: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,\n  },\n  enableAutoLinking: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableComment: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableDetailCanvas: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER,\n  },\n  enableGuessAltText: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,\n  },\n  enableHighlightFloatingButton: {\n    // We'll probably want to make some experiments before enabling this\n    // in Firefox release, but it has to be temporary.\n    // TODO: remove it when unnecessary.\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableMerge: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableNewAltTextWhenAddingImage: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableNewBadge: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableOptimizedPartialRendering: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enablePermissions: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enablePrintAutoRotate: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableScripting: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableSignatureEditor: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableSplitMerge: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  enableUpdatedAddImage: {\n    // We'll probably want to make some experiments before enabling this\n    // in Firefox release, but it has to be temporary.\n    // TODO: remove it when unnecessary.\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  externalLinkRel: {\n    /** @type {string} */\n    value: \"noopener noreferrer nofollow\",\n    kind: OptionKind.VIEWER,\n  },\n  externalLinkTarget: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  highlightEditorColors: {\n    /** @type {string} */\n    value:\n      \"yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F,\" +\n      \"yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  historyUpdateUrl: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  ignoreDestinationZoom: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  imageResourcesPath: {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? \"resource://pdf.js/web/images/\"\n        : \"./images/\",\n    kind: OptionKind.VIEWER,\n  },\n  enableSelectionRendering: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  imagesRightClickMinSize: {\n    /** @type {number} */\n    value:\n      typeof PDFJSDev === \"undefined\" ||\n      // Firefox mobile does not support right-clicking on images,\n      // see https://bugzilla.mozilla.org/show_bug.cgi?id=2014081.\n      // This option is disabled by default outside of MOZCENTRAL\n      // because it degrades the text selection experience in Chrome\n      // and Safari.\n      PDFJSDev.test(\"MOZCENTRAL && !GECKOVIEW\")\n        ? 16\n        : -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  maxCanvasPixels: {\n    /** @type {number} */\n    value: 2 ** 25,\n    kind: OptionKind.VIEWER,\n  },\n  minDurationToUpdateCanvas: {\n    /** @type {number} */\n    value: 500, // ms\n    kind: OptionKind.VIEWER,\n  },\n  forcePageColors: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  pageColorsBackground: {\n    /** @type {string} */\n    value: \"Canvas\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  pageColorsForeground: {\n    /** @type {string} */\n    value: \"CanvasText\",\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  pdfBugEnabled: {\n    /** @type {boolean} */\n    value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  postMessageAfterPrintCallback: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  printResolution: {\n    /** @type {number} */\n    value: 150,\n    kind: OptionKind.VIEWER,\n  },\n  sidebarViewOnLoad: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  scrollModeOnLoad: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  spreadModeOnLoad: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  textLayerMode: {\n    /** @type {number} */\n    value: 1,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  viewerCssTheme: {\n    /** @type {number} */\n    value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\") ? 2 : 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n  viewOnLoad: {\n    /** @type {boolean} */\n    value: 0,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  },\n\n  cMapPacked: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API,\n  },\n  cMapUrl: {\n    /** @type {string} */\n    value:\n      // eslint-disable-next-line no-nested-ternary\n      typeof PDFJSDev === \"undefined\"\n        ? \"../external/bcmaps/\"\n        : PDFJSDev.test(\"MOZCENTRAL\")\n          ? \"resource://pdf.js/web/cmaps/\"\n          : \"../web/cmaps/\",\n    kind: OptionKind.API,\n  },\n  disableAutoFetch: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  disableFontFace: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  disableRange: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  disableStream: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  docBaseUrl: {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev === \"undefined\"\n        ? // NOTE: We cannot use the `updateUrlHash` function here, because of\n          // the default preferences generation (see `gulpfile.mjs`).\n          // However, the following line is *only* used in development mode.\n          document.URL.split(\"#\", 1)[0]\n        : \"\",\n    kind: OptionKind.API,\n  },\n  enableHWA: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  enableWebGPU: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  enableXfa: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API + OptionKind.PREFERENCE,\n  },\n  fontExtraProperties: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  iccUrl: {\n    /** @type {string} */\n    value:\n      // eslint-disable-next-line no-nested-ternary\n      typeof PDFJSDev === \"undefined\"\n        ? \"../external/iccs/\"\n        : PDFJSDev.test(\"MOZCENTRAL\")\n          ? \"resource://pdf.js/web/iccs/\"\n          : \"../web/iccs/\",\n    kind: OptionKind.API,\n  },\n  isOffscreenCanvasSupported: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API,\n  },\n  maxImageSize: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.API,\n  },\n  pdfBug: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  standardFontDataUrl: {\n    /** @type {string} */\n    value:\n      // eslint-disable-next-line no-nested-ternary\n      typeof PDFJSDev === \"undefined\"\n        ? \"../external/standard_fonts/\"\n        : PDFJSDev.test(\"MOZCENTRAL\")\n          ? \"resource://pdf.js/web/standard_fonts/\"\n          : \"../web/standard_fonts/\",\n    kind: OptionKind.API,\n  },\n  useSystemFonts: {\n    // On Android, there is almost no chance to have the font we want so we\n    // don't use the system fonts in this case (bug 1882613).\n    /** @type {boolean|undefined} */\n    value: (\n      typeof PDFJSDev === \"undefined\"\n        ? window.isGECKOVIEW\n        : PDFJSDev.test(\"GECKOVIEW\")\n    )\n      ? false\n      : undefined,\n    kind: OptionKind.API,\n    type: Type.BOOLEAN + Type.UNDEFINED,\n  },\n  verbosity: {\n    /** @type {number} */\n    value: 1,\n    kind: OptionKind.API,\n  },\n  wasmUrl: {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? \"resource://pdf.js/web/wasm/\"\n        : \"../web/wasm/\",\n    kind: OptionKind.API,\n  },\n\n  workerPort: {\n    /** @type {Object} */\n    value:\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? globalThis.pdfjsPreloadedWorker || null\n        : null,\n    kind: OptionKind.WORKER,\n  },\n  workerSrc: {\n    /** @type {string} */\n    value:\n      // eslint-disable-next-line no-nested-ternary\n      typeof PDFJSDev === \"undefined\"\n        ? \"../src/pdf.worker.js\"\n        : PDFJSDev.test(\"MOZCENTRAL\")\n          ? \"resource://pdf.js/build/pdf.worker.mjs\"\n          : \"../build/pdf.worker.mjs\",\n    kind: OptionKind.WORKER,\n  },\n};\nif (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n  defaultOptions.defaultUrl = {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")\n        ? \"\"\n        : \"compressed.tracemonkey-pldi-09.pdf\",\n    kind: OptionKind.VIEWER,\n  };\n  defaultOptions.sandboxBundleSrc = {\n    /** @type {string} */\n    value:\n      typeof PDFJSDev === \"undefined\"\n        ? \"../build/dev-sandbox/pdf.sandbox.mjs\"\n        : \"../build/pdf.sandbox.mjs\",\n    kind: OptionKind.VIEWER,\n  };\n  defaultOptions.enableFakeMLManager = {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER,\n  };\n}\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n  defaultOptions.disablePreferences = {\n    /** @type {boolean} */\n    value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\"),\n    kind: OptionKind.VIEWER,\n  };\n} else if (PDFJSDev.test(\"CHROME\")) {\n  defaultOptions.disableTelemetry = {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n  };\n}\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n  // Ensure that the `defaultOptions` are correctly specified.\n  for (const name in defaultOptions) {\n    const { value, kind, type } = defaultOptions[name];\n\n    if (kind & OptionKind.PREFERENCE) {\n      if (kind === OptionKind.PREFERENCE) {\n        throw new Error(`Cannot use only \"PREFERENCE\" kind: ${name}`);\n      }\n      if (kind & OptionKind.BROWSER) {\n        throw new Error(`Cannot mix \"PREFERENCE\" and \"BROWSER\" kind: ${name}`);\n      }\n      if (type !== undefined) {\n        throw new Error(\n          `Cannot have \\`type\\`-field for \"PREFERENCE\" kind: ${name}`\n        );\n      }\n      if (typeof compatParams === \"object\" && compatParams.has(name)) {\n        throw new Error(\n          `Should not have compatibility-value for \"PREFERENCE\" kind: ${name}`\n        );\n      }\n      // Only \"simple\" preference-values are allowed.\n      if (\n        typeof value !== \"boolean\" &&\n        typeof value !== \"string\" &&\n        !Number.isInteger(value)\n      ) {\n        throw new Error(`Invalid value for \"PREFERENCE\" kind: ${name}`);\n      }\n    } else if (kind & OptionKind.BROWSER) {\n      if (type !== undefined) {\n        throw new Error(\n          `Cannot have \\`type\\`-field for \"BROWSER\" kind: ${name}`\n        );\n      }\n      if (typeof compatParams === \"object\" && compatParams.has(name)) {\n        throw new Error(\n          `Should not have compatibility-value for \"BROWSER\" kind: ${name}`\n        );\n      }\n      if (value === undefined) {\n        throw new Error(`Invalid value for \"BROWSER\" kind: ${name}`);\n      }\n    }\n  }\n}\n\nclass AppOptions {\n  static eventBus;\n\n  static #opts = new Map();\n\n  static {\n    // Initialize all the user-options.\n    for (const name in defaultOptions) {\n      this.#opts.set(name, defaultOptions[name].value);\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      // Apply any compatibility-values to the user-options.\n      for (const [name, value] of compatParams) {\n        this.#opts.set(name, value);\n      }\n      this._hasInvokedSet = false;\n\n      this._checkDisablePreferences = () => {\n        if (this.get(\"disablePreferences\")) {\n          // Give custom implementations of the default viewer a simpler way to\n          // opt-out of having the `Preferences` override existing `AppOptions`.\n          return true;\n        }\n        if (this._hasInvokedSet) {\n          console.warn(\n            \"The Preferences may override manually set AppOptions; \" +\n              'please use the \"disablePreferences\"-option to prevent that.'\n          );\n        }\n        return false;\n      };\n    }\n  }\n\n  constructor() {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      throw new Error(\"Cannot initialize AppOptions.\");\n    }\n  }\n\n  static get(name) {\n    return this.#opts.get(name);\n  }\n\n  static getAll(kind = null, defaultOnly = false) {\n    const options = Object.create(null);\n    for (const name in defaultOptions) {\n      const defaultOpt = defaultOptions[name];\n\n      if (kind && !(kind & defaultOpt.kind)) {\n        continue;\n      }\n      options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value;\n    }\n    return options;\n  }\n\n  static set(name, value) {\n    this.setAll({ [name]: value });\n  }\n\n  static setAll(options, prefs = false) {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this._hasInvokedSet ||= true;\n    }\n    let events;\n\n    for (const name in options) {\n      const defaultOpt = defaultOptions[name],\n        userOpt = options[name];\n\n      if (\n        !defaultOpt ||\n        !(\n          typeof userOpt === typeof defaultOpt.value ||\n          Type[(typeof userOpt).toUpperCase()] & defaultOpt.type\n        )\n      ) {\n        continue;\n      }\n      const { kind } = defaultOpt;\n\n      if (\n        prefs &&\n        !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)\n      ) {\n        continue;\n      }\n      if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) {\n        (events ||= new Map()).set(name, userOpt);\n      }\n      this.#opts.set(name, userOpt);\n    }\n\n    if (events) {\n      for (const [name, value] of events) {\n        this.eventBus.dispatch(name.toLowerCase(), { source: this, value });\n      }\n    }\n  }\n}\n\nexport { AppOptions, OptionKind };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst {\n  AbortException,\n  AnnotationEditorLayer,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationLayer,\n  AnnotationMode,\n  AnnotationType,\n  applyOpacity,\n  build,\n  ColorPicker,\n  createValidAbsoluteUrl,\n  CSSConstants,\n  DOMSVGFactory,\n  DrawLayer,\n  FeatureTest,\n  fetchData,\n  findContrastColor,\n  getDocument,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getRGB,\n  getRGBA,\n  getUuid,\n  GlobalWorkerOptions,\n  ImageKind,\n  InvalidPDFException,\n  isDataScheme,\n  isPdfFile,\n  isValidExplicitDest,\n  makeArr,\n  makeMap,\n  makeObj,\n  MathClamp,\n  noContextMenu,\n  normalizeUnicode,\n  OPS,\n  OutputScale,\n  PasswordException,\n  PasswordResponses,\n  PDFDataRangeTransport,\n  PDFDateString,\n  PDFWorker,\n  PermissionFlag,\n  PixelsPerInch,\n  RenderingCancelledException,\n  renderRichText,\n  ResponseException,\n  setLayerDimensions,\n  shadow,\n  SignatureExtractor,\n  stopEvent,\n  SupportedImageMimeTypes,\n  TextLayer,\n  TextLayerImages,\n  TouchManager,\n  updateUrlHash,\n  Util,\n  VerbosityLevel,\n  version,\n  XfaLayer,\n} = globalThis.pdfjsLib;\n\nexport {\n  AbortException,\n  AnnotationEditorLayer,\n  AnnotationEditorParamsType,\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationLayer,\n  AnnotationMode,\n  AnnotationType,\n  applyOpacity,\n  build,\n  ColorPicker,\n  createValidAbsoluteUrl,\n  CSSConstants,\n  DOMSVGFactory,\n  DrawLayer,\n  FeatureTest,\n  fetchData,\n  findContrastColor,\n  getDocument,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  getRGB,\n  getRGBA,\n  getUuid,\n  GlobalWorkerOptions,\n  ImageKind,\n  InvalidPDFException,\n  isDataScheme,\n  isPdfFile,\n  isValidExplicitDest,\n  makeArr,\n  makeMap,\n  makeObj,\n  MathClamp,\n  noContextMenu,\n  normalizeUnicode,\n  OPS,\n  OutputScale,\n  PasswordException,\n  PasswordResponses,\n  PDFDataRangeTransport,\n  PDFDateString,\n  PDFWorker,\n  PermissionFlag,\n  PixelsPerInch,\n  RenderingCancelledException,\n  renderRichText,\n  ResponseException,\n  setLayerDimensions,\n  shadow,\n  SignatureExtractor,\n  stopEvent,\n  SupportedImageMimeTypes,\n  TextLayer,\n  TextLayerImages,\n  TouchManager,\n  updateUrlHash,\n  Util,\n  VerbosityLevel,\n  version,\n  XfaLayer,\n};\n","/* Copyright 2026 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Keep this file in sync with `src/shared/internal_evt.js`.\n */\n\nconst INTERNAL_EVT =\n  typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n    ? PDFJSDev.eval(\"INTERNAL_EVT\")\n    : \"internalEvent\";\n\nconst internalOpt = Object.freeze({ internal: INTERNAL_EVT });\n\nexport { INTERNAL_EVT, internalOpt };\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n\n/**\n * @import { CatalogAttachmentContent } from \"../src/core/catalog.js\";\n */\n\nimport { isValidExplicitDest, PasswordException } from \"pdfjs-lib\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { parseQueryString } from \"./ui_utils.js\";\n\nconst DEFAULT_LINK_REL = \"noopener noreferrer nofollow\";\n\nconst LinkTarget = {\n  NONE: 0, // Default value.\n  SELF: 1,\n  BLANK: 2,\n  PARENT: 3,\n  TOP: 4,\n};\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [externalLinkTarget] - Specifies the `target` attribute\n *   for external links. Must use one of the values from {LinkTarget}.\n *   Defaults to using no target.\n * @property {string} [externalLinkRel] - Specifies the `rel` attribute for\n *   external links. Defaults to stripping the referrer.\n * @property {boolean} [ignoreDestinationZoom] - Ignores the zoom argument,\n *   thus preserving the current zoom level in the viewer, when navigating\n *   to internal destinations. The default value is `false`.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n */\nclass PDFLinkService {\n  externalLinkEnabled = true;\n\n  /**\n   * @param {PDFLinkServiceOptions} options\n   */\n  constructor({\n    eventBus,\n    externalLinkTarget = null,\n    externalLinkRel = null,\n    ignoreDestinationZoom = false,\n  } = {}) {\n    this.eventBus = eventBus;\n    this.externalLinkTarget = externalLinkTarget;\n    this.externalLinkRel = externalLinkRel;\n    this._ignoreDestinationZoom = ignoreDestinationZoom;\n\n    this.baseUrl = null;\n    this.pdfDocument = null;\n    this.pdfViewer = null;\n    this.pdfHistory = null;\n  }\n\n  setDocument(pdfDocument, baseUrl = null) {\n    this.baseUrl = baseUrl;\n    this.pdfDocument = pdfDocument;\n  }\n\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  setHistory(pdfHistory) {\n    this.pdfHistory = pdfHistory;\n  }\n\n  /**\n   * @type {number}\n   */\n  get pagesCount() {\n    return this.pdfDocument?.pagesMapper.pagesNumber || 0;\n  }\n\n  /**\n   * @type {number}\n   */\n  get page() {\n    return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set page(value) {\n    if (this.pdfDocument) {\n      this.pdfViewer.currentPageNumber = value;\n    }\n  }\n\n  /**\n   * @type {number}\n   */\n  get rotation() {\n    return this.pdfDocument ? this.pdfViewer.pagesRotation : 0;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set rotation(value) {\n    if (this.pdfDocument) {\n      this.pdfViewer.pagesRotation = value;\n    }\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get isInPresentationMode() {\n    return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false;\n  }\n\n  /**\n   * This method will, when available, also update the browser history.\n   *\n   * @param {string|Array} dest - The named, or explicit, PDF destination.\n   */\n  async goToDestination(dest) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let namedDest, explicitDest, pageNumber;\n    if (typeof dest === \"string\") {\n      namedDest = dest;\n      explicitDest = await this.pdfDocument.getDestination(dest);\n    } else {\n      namedDest = null;\n      explicitDest = await dest;\n    }\n    if (!Array.isArray(explicitDest)) {\n      console.error(\n        `goToDestination: \"${explicitDest}\" is not a valid destination array, for dest=\"${dest}\".`\n      );\n      return;\n    }\n    // Dest array looks like that: <page-ref> </XYZ|/FitXXX> <args..>\n    const [destRef] = explicitDest;\n\n    if (destRef && typeof destRef === \"object\") {\n      pageNumber = this.pdfDocument.cachedPageNumber(destRef);\n\n      if (!pageNumber) {\n        // Fetch the page reference if it's not yet available. This could\n        // only occur during loading, before all pages have been resolved.\n        try {\n          pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1;\n        } catch {\n          console.error(\n            `goToDestination: \"${destRef}\" is not a valid page reference, for dest=\"${dest}\".`\n          );\n          return;\n        }\n      }\n    } else if (Number.isInteger(destRef)) {\n      pageNumber = destRef + 1;\n    }\n    if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n      console.error(\n        `goToDestination: \"${pageNumber}\" is not a valid page number, for dest=\"${dest}\".`\n      );\n      return;\n    }\n\n    if (this.pdfHistory) {\n      // Update the browser history before scrolling the new destination into\n      // view, to be able to accurately capture the current document position.\n      this.pdfHistory.pushCurrentPosition();\n      this.pdfHistory.push({ namedDest, explicitDest, pageNumber });\n    }\n\n    this.pdfViewer.scrollPageIntoView({\n      pageNumber,\n      destArray: explicitDest,\n      ignoreDestinationZoom: this._ignoreDestinationZoom,\n    });\n\n    const ac = new AbortController();\n    this.eventBus.on(\n      \"textlayerrendered\",\n      evt => {\n        if (evt.pageNumber === pageNumber) {\n          evt.source.textLayer.div.focus();\n          ac.abort();\n        }\n      },\n      { signal: ac.signal, ...internalOpt }\n    );\n  }\n\n  /**\n   * This method will, when available, also update the browser history.\n   *\n   * @param {number|string} val - The page number, or page label.\n   */\n  goToPage(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const pageNumber =\n      (typeof val === \"string\" && this.pdfViewer.pageLabelToPageNumber(val)) ||\n      val | 0;\n    if (\n      !(\n        Number.isInteger(pageNumber) &&\n        pageNumber > 0 &&\n        pageNumber <= this.pagesCount\n      )\n    ) {\n      console.error(`PDFLinkService.goToPage: \"${val}\" is not a valid page.`);\n      return;\n    }\n\n    if (this.pdfHistory) {\n      // Update the browser history before scrolling the new page into view,\n      // to be able to accurately capture the current document position.\n      this.pdfHistory.pushCurrentPosition();\n      this.pdfHistory.pushPage(pageNumber);\n    }\n\n    this.pdfViewer.scrollPageIntoView({ pageNumber });\n  }\n\n  /**\n   * Scrolls to a specific location in the PDF document.\n   * @param {number} pageNumber - The page number to scroll to.\n   * @param {number} x - The x-coordinate to scroll to in page coordinates.\n   * @param {number} y - The y-coordinate to scroll to in page coordinates.\n   * @param {Object} [options]\n   */\n  goToXY(pageNumber, x, y, options = {}) {\n    this.pdfViewer.scrollPageIntoView({\n      pageNumber,\n      destArray: [null, { name: \"XYZ\" }, x, y],\n      ignoreDestinationZoom: true,\n      ...options,\n    });\n  }\n\n  /**\n   * @param {string} id\n   *   Unique attachment identifier (required).\n   * @returns {Promise<CatalogAttachmentContent>}\n   *   Content.\n   */\n  async getAttachmentContent(id) {\n    try {\n      return await this.pdfDocument?.getAttachmentContent(id);\n    } catch (error) {\n      if (!(error instanceof PasswordException)) {\n        console.warn(`Unable to load attachment content: ${error}`);\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Adds various attributes (href, title, target, rel) to hyperlinks.\n   * @param {HTMLAnchorElement} link\n   * @param {string} url\n   * @param {boolean} [newWindow]\n   */\n  addLinkAttributes(link, url, newWindow = false) {\n    if (!url || typeof url !== \"string\") {\n      throw new Error('A valid \"url\" parameter must provided.');\n    }\n    const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget,\n      rel = this.externalLinkRel;\n\n    // Strip userinfo (user:password@) from URLs used for display, to prevent\n    // phishing via hostname-spoofing (e.g. https://trusted.example@attacker.example/).\n    let displayUrl = url;\n    const parsedUrl = URL.parse(url);\n    if (parsedUrl?.username || parsedUrl?.password) {\n      parsedUrl.username = parsedUrl.password = \"\";\n      displayUrl = parsedUrl.href;\n    }\n\n    if (this.externalLinkEnabled) {\n      link.href = url;\n      link.title = displayUrl;\n    } else {\n      link.href = \"\";\n      link.title = `Disabled: ${displayUrl}`;\n      link.onclick = () => false;\n    }\n\n    let targetStr = \"\"; // LinkTarget.NONE\n    switch (target) {\n      case LinkTarget.NONE:\n        break;\n      case LinkTarget.SELF:\n        targetStr = \"_self\";\n        break;\n      case LinkTarget.BLANK:\n        targetStr = \"_blank\";\n        break;\n      case LinkTarget.PARENT:\n        targetStr = \"_parent\";\n        break;\n      case LinkTarget.TOP:\n        targetStr = \"_top\";\n        break;\n    }\n    link.target = targetStr;\n\n    link.rel = typeof rel === \"string\" ? rel : DEFAULT_LINK_REL;\n  }\n\n  /**\n   * @param {string|Array} dest - The PDF destination object.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getDestinationHash(dest) {\n    if (typeof dest === \"string\") {\n      if (dest.length > 0) {\n        return this.getAnchorUrl(\"#\" + escape(dest));\n      }\n    } else if (Array.isArray(dest)) {\n      const str = JSON.stringify(dest);\n      if (str.length > 0) {\n        return this.getAnchorUrl(\"#\" + escape(str));\n      }\n    }\n    return this.getAnchorUrl(\"\");\n  }\n\n  /**\n   * Prefix the full url on anchor links to make sure that links are resolved\n   * relative to the current URL instead of the one defined in <base href>.\n   * @param {string} anchor - The anchor hash, including the #.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getAnchorUrl(anchor) {\n    return this.baseUrl ? this.baseUrl + anchor : anchor;\n  }\n\n  /**\n   * @param {string} hash\n   */\n  setHash(hash) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let pageNumber, dest;\n    if (hash.includes(\"=\")) {\n      const params = parseQueryString(hash);\n      if (params.has(\"search\")) {\n        const query = params.get(\"search\").replaceAll('\"', \"\"),\n          phrase = params.get(\"phrase\") === \"true\";\n\n        this.eventBus.dispatch(\"findfromurlhash\", {\n          source: this,\n          query: phrase ? query : query.match(/\\S+/g),\n        });\n      }\n      // borrowing syntax from \"Parameters for Opening PDF Files\"\n      if (params.has(\"page\")) {\n        pageNumber = params.get(\"page\") | 0 || 1;\n      }\n      if (params.has(\"zoom\")) {\n        // Build the destination array.\n        const zoomArgs = params.get(\"zoom\").split(\",\"); // scale,left,top\n        const zoomArg = zoomArgs[0];\n        const zoomArgNumber = parseFloat(zoomArg);\n\n        if (!zoomArg.includes(\"Fit\")) {\n          // If the zoomArg is a number, it has to get divided by 100. If it's\n          // a string, it should stay as it is.\n          dest = [\n            null,\n            { name: \"XYZ\" },\n            zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n            zoomArgs.length > 2 ? zoomArgs[2] | 0 : null,\n            zoomArgNumber ? zoomArgNumber / 100 : zoomArg,\n          ];\n        } else if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n          dest = [null, { name: zoomArg }];\n        } else if (\n          zoomArg === \"FitH\" ||\n          zoomArg === \"FitBH\" ||\n          zoomArg === \"FitV\" ||\n          zoomArg === \"FitBV\"\n        ) {\n          dest = [\n            null,\n            { name: zoomArg },\n            zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n          ];\n        } else if (zoomArg === \"FitR\") {\n          if (zoomArgs.length !== 5) {\n            console.error(\n              'PDFLinkService.setHash: Not enough parameters for \"FitR\".'\n            );\n          } else {\n            dest = [\n              null,\n              { name: zoomArg },\n              zoomArgs[1] | 0,\n              zoomArgs[2] | 0,\n              zoomArgs[3] | 0,\n              zoomArgs[4] | 0,\n            ];\n          }\n        } else {\n          console.error(\n            `PDFLinkService.setHash: \"${zoomArg}\" is not a valid zoom value.`\n          );\n        }\n      }\n      if (dest) {\n        this.pdfViewer.scrollPageIntoView({\n          pageNumber: pageNumber || this.page,\n          destArray: dest,\n          allowNegativeOffset: true,\n        });\n      } else if (pageNumber) {\n        this.page = pageNumber; // simple page\n      }\n      if (params.has(\"pagemode\")) {\n        this.eventBus.dispatch(\"pagemode\", {\n          source: this,\n          mode: params.get(\"pagemode\"),\n        });\n      }\n      // Ensure that this parameter is *always* handled last, in order to\n      // guarantee that it won't be overridden (e.g. by the \"page\" parameter).\n      if (params.has(\"nameddest\")) {\n        this.goToDestination(params.get(\"nameddest\"));\n      }\n\n      if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n        return;\n      }\n      // Support opening of PDF attachments in the Firefox PDF Viewer,\n      // which uses a couple of non-standard hash parameters; refer to\n      // `DownloadManager._getOpenDataUrl` in the firefoxcom.js file.\n      if (!params.has(\"filename\") || !params.has(\"filedest\")) {\n        return;\n      }\n      hash = params.get(\"filedest\");\n    }\n\n    // Named (or explicit) destination.\n    dest = unescape(hash);\n    try {\n      dest = JSON.parse(dest);\n\n      if (!Array.isArray(dest)) {\n        // Avoid incorrectly rejecting a valid named destination, such as\n        // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n        dest = dest.toString();\n      }\n    } catch {}\n\n    if (typeof dest === \"string\" || isValidExplicitDest(dest)) {\n      this.goToDestination(dest);\n      return;\n    }\n    console.error(\n      `PDFLinkService.setHash: \"${unescape(hash)}\" is not a valid destination.`\n    );\n  }\n\n  /**\n   * @param {string} action\n   */\n  executeNamedAction(action) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    // See PDF reference, table 8.45 - Named action\n    switch (action) {\n      case \"GoBack\":\n        this.pdfHistory?.back();\n        break;\n\n      case \"GoForward\":\n        this.pdfHistory?.forward();\n        break;\n\n      case \"NextPage\":\n        this.pdfViewer.nextPage();\n        break;\n\n      case \"PrevPage\":\n        this.pdfViewer.previousPage();\n        break;\n\n      case \"LastPage\":\n        this.page = this.pagesCount;\n        break;\n\n      case \"FirstPage\":\n        this.page = 1;\n        break;\n\n      default:\n        break; // No action according to spec\n    }\n\n    this.eventBus.dispatch(\"namedaction\", {\n      source: this,\n      action,\n    });\n  }\n\n  /**\n   * @param {Object} action\n   */\n  async executeSetOCGState(action) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const pdfDocument = this.pdfDocument,\n      optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise;\n\n    if (pdfDocument !== this.pdfDocument) {\n      return; // The document was closed while the optional content resolved.\n    }\n    optionalContentConfig.setOCGState(action);\n\n    this.pdfViewer.optionalContentConfigPromise = Promise.resolve(\n      optionalContentConfig\n    );\n  }\n}\n\nclass SimpleLinkService extends PDFLinkService {\n  setDocument(pdfDocument, baseUrl = null) {}\n}\n\nexport { LinkTarget, PDFLinkService, SimpleLinkService };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { INTERNAL_EVT, internalOpt } from \"./internal_evt.js\";\n\nconst WaitOnType = {\n  EVENT: \"event\",\n  TIMEOUT: \"timeout\",\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n *   `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n *   timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nasync function waitOnEventOrTimeout({ target, name, delay = 0 }) {\n  if (\n    typeof target !== \"object\" ||\n    !(name && typeof name === \"string\") ||\n    !(Number.isInteger(delay) && delay >= 0)\n  ) {\n    throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n  }\n  const { promise, resolve } = Promise.withResolvers();\n  const ac = new AbortController();\n\n  function handler(type) {\n    ac.abort(); // Remove event listener.\n    clearTimeout(timeout);\n\n    resolve(type);\n  }\n\n  const evtMethod = target instanceof EventBus ? \"on\" : \"addEventListener\";\n  const evtOpts =\n    target instanceof EventBus\n      ? { signal: ac.signal, ...internalOpt }\n      : { signal: ac.signal };\n  target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), evtOpts);\n\n  const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay);\n\n  return promise;\n}\n\n/**\n * Simple event bus for an application. Listeners are attached using the `on`\n * and `off` methods. To raise an event, the `dispatch` method shall be used.\n */\nclass EventBus {\n  #listeners = Object.create(null);\n\n  constructor() {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      // Prevent the class methods from being overridden by third-party users,\n      // to ensure that `INTERNAL_EVT` cannot be accessed from the outside.\n      Object.seal(this);\n    }\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} listener\n   * @param {Object} [options]\n   */\n  on(eventName, listener, options = null) {\n    let rmAbort = null;\n    if (options?.signal instanceof AbortSignal) {\n      const { signal } = options;\n      if (signal.aborted) {\n        console.error(\"Cannot use an `aborted` signal.\");\n        return;\n      }\n      const onAbort = () => this.off(eventName, listener);\n      rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n      signal.addEventListener(\"abort\", onAbort);\n    }\n\n    const eventListeners = (this.#listeners[eventName] ??= []);\n    eventListeners.push({\n      listener,\n      internal: options?.internal === INTERNAL_EVT,\n      once: options?.once === true,\n      rmAbort,\n    });\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} listener\n   * @param {Object} [options]\n   */\n  off(eventName, listener, options = null) {\n    const eventListeners = this.#listeners[eventName];\n    if (!eventListeners) {\n      return;\n    }\n    for (let i = 0, ii = eventListeners.length; i < ii; i++) {\n      const evt = eventListeners[i];\n      if (evt.listener === listener) {\n        evt.rmAbort?.(); // Ensure that the `AbortSignal` listener is removed.\n        eventListeners.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {Object} data\n   */\n  dispatch(eventName, data) {\n    const eventListeners = this.#listeners[eventName];\n    if (!eventListeners?.length) {\n      return;\n    }\n    let extListeners;\n    // Making copy of the listeners array in case if it will be modified\n    // during dispatch.\n    for (const { listener, internal, once } of eventListeners.slice(0)) {\n      if (once) {\n        this.off(eventName, listener);\n      }\n      if (!internal) {\n        (extListeners ??= []).push(listener);\n        continue;\n      }\n      listener(data);\n    }\n    // Dispatch any \"external\" listeners *after* the internal ones, to give the\n    // viewer components time to handle events and update their state first.\n    if (extListeners) {\n      for (const listener of extListeners) {\n        listener(data);\n      }\n    }\n  }\n}\n\n/**\n * NOTE: Only used in the Firefox built-in pdf viewer.\n */\nclass FirefoxEventBus extends EventBus {\n  #externalServices;\n\n  #globalEventNames;\n\n  #isInAutomation;\n\n  constructor(globalEventNames, externalServices, isInAutomation) {\n    super();\n    this.#globalEventNames = globalEventNames;\n    this.#externalServices = externalServices;\n    this.#isInAutomation = isInAutomation;\n  }\n\n  dispatch(eventName, data) {\n    if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: FirefoxEventBus.dispatch\");\n    }\n    super.dispatch(eventName, data);\n\n    if (this.#isInAutomation) {\n      const detail = Object.create(null);\n      if (data) {\n        for (const key in data) {\n          const value = data[key];\n          if (key === \"source\") {\n            if (value === window || value === document) {\n              return; // No need to re-dispatch (already) global events.\n            }\n            continue; // Ignore the `source` property.\n          }\n          detail[key] = value;\n        }\n      }\n      const event = new CustomEvent(eventName, {\n        bubbles: true,\n        cancelable: true,\n        detail,\n      });\n      document.dispatchEvent(event);\n    }\n\n    if (this.#globalEventNames?.has(eventName)) {\n      this.#externalServices.dispatchGlobalEvent({\n        eventName,\n        detail: data,\n      });\n    }\n  }\n}\n\nexport { EventBus, FirefoxEventBus, waitOnEventOrTimeout, WaitOnType };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass BaseExternalServices {\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseExternalServices\n    ) {\n      throw new Error(\"Cannot initialize BaseExternalServices.\");\n    }\n  }\n\n  updateFindControlState(data) {}\n\n  updateFindMatchesCount(data) {}\n\n  initPassiveLoading() {}\n\n  reportTelemetry(data) {}\n\n  reportText(data) {}\n\n  /**\n   * @returns {Promise<L10n>}\n   */\n  async createL10n() {\n    throw new Error(\"Not implemented: createL10n\");\n  }\n\n  createScripting() {\n    throw new Error(\"Not implemented: createScripting\");\n  }\n\n  createSignatureStorage() {\n    throw new Error(\"Not implemented: createSignatureStorage\");\n  }\n\n  updateEditorStates(data) {\n    throw new Error(\"Not implemented: updateEditorStates\");\n  }\n\n  dispatchGlobalEvent(_event) {}\n}\n\nexport { BaseExternalServices };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppOptions, OptionKind } from \"./app_options.js\";\n\n/**\n * BasePreferences - Abstract base class for storing persistent settings.\n *   Used for settings that should be applied to all opened documents,\n *   or every time the viewer is loaded.\n */\nclass BasePreferences {\n  #defaults = Object.freeze(\n    AppOptions.getAll(OptionKind.PREFERENCE, /* defaultOnly = */ true)\n  );\n\n  #initializedPromise = null;\n\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BasePreferences\n    ) {\n      throw new Error(\"Cannot initialize BasePreferences.\");\n    }\n\n    this.#initializedPromise = this._readFromStorage(this.#defaults).then(\n      ({ browserPrefs, prefs }) => {\n        if (\n          (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n          AppOptions._checkDisablePreferences()\n        ) {\n          return;\n        }\n        AppOptions.setAll({ ...browserPrefs, ...prefs }, /* prefs = */ true);\n      }\n    );\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      window.addEventListener(\n        \"updatedPreference\",\n        async ({ detail: { name, value } }) => {\n          await this.#initializedPromise;\n          AppOptions.setAll({ [name]: value }, /* prefs = */ true);\n        }\n      );\n    }\n  }\n\n  /**\n   * Stub function for writing preferences to storage.\n   * @param {Object} prefObj The preferences that should be written to storage.\n   * @returns {Promise} A promise that is resolved when the preference values\n   *                    have been written.\n   */\n  async _writeToStorage(prefObj) {\n    throw new Error(\"Not implemented: _writeToStorage\");\n  }\n\n  /**\n   * Stub function for reading preferences from storage.\n   * @param {Object} prefObj The preferences that should be read from storage.\n   * @returns {Promise} A promise that is resolved with an {Object} containing\n   *                    the preferences that have been read.\n   */\n  async _readFromStorage(prefObj) {\n    throw new Error(\"Not implemented: _readFromStorage\");\n  }\n\n  /**\n   * Reset the preferences to their default values and update storage.\n   * @returns {Promise} A promise that is resolved when the preference values\n   *                    have been reset.\n   */\n  async reset() {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Please use `about:config` to change preferences.\");\n    }\n    await this.#initializedPromise;\n    AppOptions.setAll(this.#defaults, /* prefs = */ true);\n\n    await this._writeToStorage(this.#defaults);\n  }\n\n  /**\n   * Set the value of a preference.\n   * @param {string} name The name of the preference that should be changed.\n   * @param {boolean|number|string} value The new value of the preference.\n   * @returns {Promise} A promise that is resolved when the value has been set,\n   *                    provided that the preference exists and the types match.\n   */\n  async set(name, value) {\n    await this.#initializedPromise;\n    AppOptions.setAll({ [name]: value }, /* prefs = */ true);\n\n    await this._writeToStorage(\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? { [name]: AppOptions.get(name) }\n        : AppOptions.getAll(OptionKind.PREFERENCE)\n    );\n  }\n\n  /**\n   * Get the value of a preference.\n   * @param {string} name The name of the preference whose value is requested.\n   * @returns {Promise} A promise resolved with a {boolean|number|string}\n   *                    containing the value of the preference.\n   */\n  async get(name) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      throw new Error(\"Not implemented: get\");\n    }\n    await this.#initializedPromise;\n    return AppOptions.get(name);\n  }\n\n  get defaults() {\n    return this.#defaults;\n  }\n\n  get initializedPromise() {\n    return this.#initializedPromise;\n  }\n}\n\nexport { BasePreferences };\n","/**\n * The `FluentType` class is the base of Fluent's type system.\n *\n * Fluent types wrap JavaScript values and store additional configuration for\n * them, which can then be used in the `toString` method together with a proper\n * `Intl` formatter.\n */\nexport class FluentType {\n    /**\n     * Create a `FluentType` instance.\n     *\n     * @param value The JavaScript value to wrap.\n     */\n    constructor(value) {\n        this.value = value;\n    }\n    /**\n     * Unwrap the raw value stored by this `FluentType`.\n     */\n    valueOf() {\n        return this.value;\n    }\n}\n/**\n * A {@link FluentType} representing no correct value.\n */\nexport class FluentNone extends FluentType {\n    /**\n     * Create an instance of `FluentNone` with an optional fallback value.\n     * @param value The fallback value of this `FluentNone`.\n     */\n    constructor(value = \"???\") {\n        super(value);\n    }\n    /**\n     * Format this `FluentNone` to the fallback string.\n     */\n    toString(scope) {\n        return `{${this.value}}`;\n    }\n}\n/**\n * A {@link FluentType} representing a number.\n *\n * A `FluentNumber` instance stores the number value of the number it\n * represents. It may also store an option bag of options which will be passed\n * to `Intl.NumerFormat` when the `FluentNumber` is formatted to a string.\n */\nexport class FluentNumber extends FluentType {\n    /**\n     * Create an instance of `FluentNumber` with options to the\n     * `Intl.NumberFormat` constructor.\n     *\n     * @param value The number value of this `FluentNumber`.\n     * @param opts Options which will be passed to `Intl.NumberFormat`.\n     */\n    constructor(value, opts = {}) {\n        super(value);\n        this.opts = opts;\n    }\n    /**\n     * Format this `FluentNumber` to a string.\n     */\n    toString(scope) {\n        if (scope) {\n            try {\n                const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts);\n                return nf.format(this.value);\n            }\n            catch (err) {\n                scope.reportError(err);\n            }\n        }\n        return this.value.toString(10);\n    }\n}\n/**\n * A {@link FluentType} representing a date and time.\n *\n * A `FluentDateTime` instance stores a Date object, Temporal object, or a number\n * as a numerical timestamp in milliseconds. It may also store an\n * option bag of options which will be passed to `Intl.DateTimeFormat` when the\n * `FluentDateTime` is formatted to a string.\n */\nexport class FluentDateTime extends FluentType {\n    static supportsValue(value) {\n        if (typeof value === \"number\")\n            return true;\n        if (value instanceof Date)\n            return true;\n        if (value instanceof FluentType)\n            return FluentDateTime.supportsValue(value.valueOf());\n        // Temporary workaround to support environments without Temporal\n        if (\"Temporal\" in globalThis) {\n            // for TypeScript, which doesn't know about Temporal yet\n            const _Temporal = globalThis.Temporal;\n            if (value instanceof _Temporal.Instant ||\n                value instanceof _Temporal.PlainDateTime ||\n                value instanceof _Temporal.PlainDate ||\n                value instanceof _Temporal.PlainMonthDay ||\n                value instanceof _Temporal.PlainTime ||\n                value instanceof _Temporal.PlainYearMonth) {\n                return true;\n            }\n        }\n        return false;\n    }\n    /**\n     * Create an instance of `FluentDateTime` with options to the\n     * `Intl.DateTimeFormat` constructor.\n     *\n     * @param value The number value of this `FluentDateTime`, in milliseconds.\n     * @param opts Options which will be passed to `Intl.DateTimeFormat`.\n     */\n    constructor(value, opts = {}) {\n        // unwrap any FluentType value, but only retain the opts from FluentDateTime\n        if (value instanceof FluentDateTime) {\n            opts = { ...value.opts, ...opts };\n            value = value.value;\n        }\n        else if (value instanceof FluentType) {\n            value = value.valueOf();\n        }\n        // Intl.DateTimeFormat defaults to gregorian calendar, but Temporal defaults to iso8601\n        if (typeof value === \"object\" &&\n            \"calendarId\" in value &&\n            opts.calendar === undefined) {\n            opts = { ...opts, calendar: value.calendarId };\n        }\n        super(value);\n        this.opts = opts;\n    }\n    [Symbol.toPrimitive](hint) {\n        return hint === \"string\" ? this.toString() : this.toNumber();\n    }\n    /**\n     * Convert this `FluentDateTime` to a number.\n     * Note that this isn't always possible due to the nature of Temporal objects.\n     * In such cases, a TypeError will be thrown.\n     */\n    toNumber() {\n        const value = this.value;\n        if (typeof value === \"number\")\n            return value;\n        if (value instanceof Date)\n            return value.getTime();\n        if (\"epochMilliseconds\" in value) {\n            return value.epochMilliseconds;\n        }\n        if (\"toZonedDateTime\" in value) {\n            return value.toZonedDateTime(\"UTC\").epochMilliseconds;\n        }\n        throw new TypeError(\"Unwrapping a non-number value as a number\");\n    }\n    /**\n     * Format this `FluentDateTime` to a string.\n     */\n    toString(scope) {\n        if (scope) {\n            try {\n                const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts);\n                return dtf.format(this.value);\n            }\n            catch (err) {\n                scope.reportError(err);\n            }\n        }\n        if (typeof this.value === \"number\" || this.value instanceof Date) {\n            return new Date(this.value).toISOString();\n        }\n        return this.value.toString();\n    }\n}\n","/**\n * The role of the Fluent resolver is to format a `Pattern` to an instance of\n * `FluentValue`. For performance reasons, primitive strings are considered\n * such instances, too.\n *\n * Translations can contain references to other messages or variables,\n * conditional logic in form of select expressions, traits which describe their\n * grammatical features, and can use Fluent builtins which make use of the\n * `Intl` formatters to format numbers and dates into the bundle's languages.\n * See the documentation of the Fluent syntax for more information.\n *\n * In case of errors the resolver will try to salvage as much of the\n * translation as possible. In rare situations where the resolver didn't know\n * how to recover from an error it will return an instance of `FluentNone`.\n *\n * All expressions resolve to an instance of `FluentValue`. The caller should\n * use the `toString` method to convert the instance to a native value.\n *\n * Functions in this file pass around an instance of the `Scope` class, which\n * stores the data required for successful resolution and error recovery.\n */\nimport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n/**\n * The maximum number of placeables which can be expanded in a single call to\n * `formatPattern`. The limit protects against the Billion Laughs and Quadratic\n * Blowup attacks. See https://msdn.microsoft.com/en-us/magazine/ee335713.aspx.\n */\nconst MAX_PLACEABLES = 100;\n/** Unicode bidi isolation characters. */\nconst FSI = \"\\u2068\";\nconst PDI = \"\\u2069\";\n/** Helper: match a variant key to the given selector. */\nfunction match(scope, selector, key) {\n    if (key === selector) {\n        // Both are strings.\n        return true;\n    }\n    // XXX Consider comparing options too, e.g. minimumFractionDigits.\n    if (key instanceof FluentNumber &&\n        selector instanceof FluentNumber &&\n        key.value === selector.value) {\n        return true;\n    }\n    if (selector instanceof FluentNumber && typeof key === \"string\") {\n        let category = scope\n            .memoizeIntlObject(Intl.PluralRules, selector.opts)\n            .select(selector.value);\n        if (key === category) {\n            return true;\n        }\n    }\n    return false;\n}\n/** Helper: resolve the default variant from a list of variants. */\nfunction getDefault(scope, variants, star) {\n    if (variants[star]) {\n        return resolvePattern(scope, variants[star].value);\n    }\n    scope.reportError(new RangeError(\"No default\"));\n    return new FluentNone();\n}\n/** Helper: resolve arguments to a call expression. */\nfunction getArguments(scope, args) {\n    const positional = [];\n    const named = Object.create(null);\n    for (const arg of args) {\n        if (arg.type === \"narg\") {\n            named[arg.name] = resolveExpression(scope, arg.value);\n        }\n        else {\n            positional.push(resolveExpression(scope, arg));\n        }\n    }\n    return { positional, named };\n}\n/** Resolve an expression to a Fluent type. */\nfunction resolveExpression(scope, expr) {\n    switch (expr.type) {\n        case \"str\":\n            return expr.value;\n        case \"num\":\n            return new FluentNumber(expr.value, {\n                minimumFractionDigits: expr.precision,\n            });\n        case \"var\":\n            return resolveVariableReference(scope, expr);\n        case \"mesg\":\n            return resolveMessageReference(scope, expr);\n        case \"term\":\n            return resolveTermReference(scope, expr);\n        case \"func\":\n            return resolveFunctionReference(scope, expr);\n        case \"select\":\n            return resolveSelectExpression(scope, expr);\n        default:\n            return new FluentNone();\n    }\n}\n/** Resolve a reference to a variable. */\nfunction resolveVariableReference(scope, { name }) {\n    let arg;\n    if (scope.params) {\n        // We're inside a TermReference. It's OK to reference undefined parameters.\n        if (Object.prototype.hasOwnProperty.call(scope.params, name)) {\n            arg = scope.params[name];\n        }\n        else {\n            return new FluentNone(`$${name}`);\n        }\n    }\n    else if (scope.args &&\n        Object.prototype.hasOwnProperty.call(scope.args, name)) {\n        // We're in the top-level Pattern or inside a MessageReference. Missing\n        // variables references produce ReferenceErrors.\n        arg = scope.args[name];\n    }\n    else {\n        scope.reportError(new ReferenceError(`Unknown variable: $${name}`));\n        return new FluentNone(`$${name}`);\n    }\n    // Return early if the argument already is an instance of FluentType.\n    if (arg instanceof FluentType) {\n        return arg;\n    }\n    // Convert the argument to a Fluent type.\n    switch (typeof arg) {\n        case \"string\":\n            return arg;\n        case \"number\":\n            return new FluentNumber(arg);\n        case \"object\":\n            if (FluentDateTime.supportsValue(arg)) {\n                return new FluentDateTime(arg);\n            }\n        // eslint-disable-next-line no-fallthrough\n        default:\n            scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`));\n            return new FluentNone(`$${name}`);\n    }\n}\n/** Resolve a reference to another message. */\nfunction resolveMessageReference(scope, { name, attr }) {\n    const message = scope.bundle._messages.get(name);\n    if (!message) {\n        scope.reportError(new ReferenceError(`Unknown message: ${name}`));\n        return new FluentNone(name);\n    }\n    if (attr) {\n        const attribute = message.attributes[attr];\n        if (attribute) {\n            return resolvePattern(scope, attribute);\n        }\n        scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n        return new FluentNone(`${name}.${attr}`);\n    }\n    if (message.value) {\n        return resolvePattern(scope, message.value);\n    }\n    scope.reportError(new ReferenceError(`No value: ${name}`));\n    return new FluentNone(name);\n}\n/** Resolve a call to a Term with key-value arguments. */\nfunction resolveTermReference(scope, { name, attr, args }) {\n    const id = `-${name}`;\n    const term = scope.bundle._terms.get(id);\n    if (!term) {\n        scope.reportError(new ReferenceError(`Unknown term: ${id}`));\n        return new FluentNone(id);\n    }\n    if (attr) {\n        const attribute = term.attributes[attr];\n        if (attribute) {\n            // Every TermReference has its own variables.\n            scope.params = getArguments(scope, args).named;\n            const resolved = resolvePattern(scope, attribute);\n            scope.params = null;\n            return resolved;\n        }\n        scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n        return new FluentNone(`${id}.${attr}`);\n    }\n    scope.params = getArguments(scope, args).named;\n    const resolved = resolvePattern(scope, term.value);\n    scope.params = null;\n    return resolved;\n}\n/** Resolve a call to a Function with positional and key-value arguments. */\nfunction resolveFunctionReference(scope, { name, args }) {\n    // Some functions are built-in. Others may be provided by the runtime via\n    // the `FluentBundle` constructor.\n    let func = scope.bundle._functions[name];\n    if (!func) {\n        scope.reportError(new ReferenceError(`Unknown function: ${name}()`));\n        return new FluentNone(`${name}()`);\n    }\n    if (typeof func !== \"function\") {\n        scope.reportError(new TypeError(`Function ${name}() is not callable`));\n        return new FluentNone(`${name}()`);\n    }\n    try {\n        let resolved = getArguments(scope, args);\n        return func(resolved.positional, resolved.named);\n    }\n    catch (err) {\n        scope.reportError(err);\n        return new FluentNone(`${name}()`);\n    }\n}\n/** Resolve a select expression to the member object. */\nfunction resolveSelectExpression(scope, { selector, variants, star }) {\n    let sel = resolveExpression(scope, selector);\n    if (sel instanceof FluentNone) {\n        return getDefault(scope, variants, star);\n    }\n    // Match the selector against keys of each variant, in order.\n    for (const variant of variants) {\n        const key = resolveExpression(scope, variant.key);\n        if (match(scope, sel, key)) {\n            return resolvePattern(scope, variant.value);\n        }\n    }\n    return getDefault(scope, variants, star);\n}\n/** Resolve a pattern (a complex string with placeables). */\nexport function resolveComplexPattern(scope, ptn) {\n    if (scope.dirty.has(ptn)) {\n        scope.reportError(new RangeError(\"Cyclic reference\"));\n        return new FluentNone();\n    }\n    // Tag the pattern as dirty for the purpose of the current resolution.\n    scope.dirty.add(ptn);\n    const result = [];\n    // Wrap interpolations with Directional Isolate Formatting characters\n    // only when the pattern has more than one element.\n    const useIsolating = scope.bundle._useIsolating && ptn.length > 1;\n    for (const elem of ptn) {\n        if (typeof elem === \"string\") {\n            result.push(scope.bundle._transform(elem));\n            continue;\n        }\n        scope.placeables++;\n        if (scope.placeables > MAX_PLACEABLES) {\n            scope.dirty.delete(ptn);\n            // This is a fatal error which causes the resolver to instantly bail out\n            // on this pattern. The length check protects against excessive memory\n            // usage, and throwing protects against eating up the CPU when long\n            // placeables are deeply nested.\n            throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` +\n                `max allowed is ${MAX_PLACEABLES}`);\n        }\n        if (useIsolating) {\n            result.push(FSI);\n        }\n        result.push(resolveExpression(scope, elem).toString(scope));\n        if (useIsolating) {\n            result.push(PDI);\n        }\n    }\n    scope.dirty.delete(ptn);\n    return result.join(\"\");\n}\n/**\n * Resolve a simple or a complex Pattern to a FluentString\n * (which is really the string primitive).\n */\nfunction resolvePattern(scope, value) {\n    // Resolve a simple pattern.\n    if (typeof value === \"string\") {\n        return scope.bundle._transform(value);\n    }\n    return resolveComplexPattern(scope, value);\n}\n","export class Scope {\n    constructor(bundle, errors, args) {\n        /**\n         * The Set of patterns already encountered during this resolution.\n         * Used to detect and prevent cyclic resolutions.\n         * @ignore\n         */\n        this.dirty = new WeakSet();\n        /** A dict of parameters passed to a TermReference. */\n        this.params = null;\n        /**\n         * The running count of placeables resolved so far.\n         * Used to detect the Billion Laughs and Quadratic Blowup attacks.\n         * @ignore\n         */\n        this.placeables = 0;\n        this.bundle = bundle;\n        this.errors = errors;\n        this.args = args;\n    }\n    reportError(error) {\n        if (!this.errors || !(error instanceof Error)) {\n            throw error;\n        }\n        this.errors.push(error);\n    }\n    memoizeIntlObject(ctor, opts) {\n        let cache = this.bundle._intls.get(ctor);\n        if (!cache) {\n            cache = {};\n            this.bundle._intls.set(ctor, cache);\n        }\n        let id = JSON.stringify(opts);\n        if (!cache[id]) {\n            // @ts-expect-error This is fine.\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n            cache[id] = new ctor(this.bundle.locales, opts);\n        }\n        return cache[id];\n    }\n}\n","/**\n * @overview\n *\n * The FTL resolver ships with a number of functions built-in.\n *\n * Each function take two arguments:\n *   - args - an array of positional args\n *   - opts - an object of key-value args\n *\n * Arguments to functions are guaranteed to already be instances of\n * `FluentValue`.  Functions must return `FluentValues` as well.\n */\nimport { FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\nfunction values(opts, allowed) {\n    const unwrapped = Object.create(null);\n    for (const [name, opt] of Object.entries(opts)) {\n        if (allowed.includes(name)) {\n            unwrapped[name] = opt.valueOf();\n        }\n    }\n    return unwrapped;\n}\nconst NUMBER_ALLOWED = [\n    \"unitDisplay\",\n    \"currencyDisplay\",\n    \"useGrouping\",\n    \"minimumIntegerDigits\",\n    \"minimumFractionDigits\",\n    \"maximumFractionDigits\",\n    \"minimumSignificantDigits\",\n    \"maximumSignificantDigits\",\n];\n/**\n * The implementation of the `NUMBER()` builtin available to translations.\n *\n * Translations may call the `NUMBER()` builtin in order to specify formatting\n * options of a number. For example:\n *\n *     pi = The value of 蟺 is {NUMBER($pi, maximumFractionDigits: 2)}.\n *\n * The implementation expects an array of {@link FluentValue | FluentValues} representing the\n * positional arguments, and an object of named {@link FluentValue | FluentValues} representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n *     unitDisplay\n *     currencyDisplay\n *     useGrouping\n *     minimumIntegerDigits\n *     minimumFractionDigits\n *     maximumFractionDigits\n *     minimumSignificantDigits\n *     maximumSignificantDigits\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `NUMBER()`.\n * @param opts The named argments passed to this `NUMBER()`.\n */\nexport function NUMBER(args, opts) {\n    let arg = args[0];\n    if (arg instanceof FluentNone) {\n        return new FluentNone(`NUMBER(${arg.valueOf()})`);\n    }\n    if (arg instanceof FluentNumber) {\n        return new FluentNumber(arg.valueOf(), {\n            ...arg.opts,\n            ...values(opts, NUMBER_ALLOWED),\n        });\n    }\n    if (arg instanceof FluentDateTime) {\n        return new FluentNumber(arg.toNumber(), {\n            ...values(opts, NUMBER_ALLOWED),\n        });\n    }\n    throw new TypeError(\"Invalid argument to NUMBER\");\n}\nconst DATETIME_ALLOWED = [\n    \"dateStyle\",\n    \"timeStyle\",\n    \"fractionalSecondDigits\",\n    \"dayPeriod\",\n    \"hour12\",\n    \"weekday\",\n    \"era\",\n    \"year\",\n    \"month\",\n    \"day\",\n    \"hour\",\n    \"minute\",\n    \"second\",\n    \"timeZoneName\",\n];\n/**\n * The implementation of the `DATETIME()` builtin available to translations.\n *\n * Translations may call the `DATETIME()` builtin in order to specify\n * formatting options of a number. For example:\n *\n *     now = It's {DATETIME($today, month: \"long\")}.\n *\n * The implementation expects an array of {@link FluentValue | FluentValues} representing the\n * positional arguments, and an object of named {@link FluentValue | FluentValues} representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n *     dateStyle\n *     timeStyle\n *     fractionalSecondDigits\n *     dayPeriod\n *     hour12\n *     weekday\n *     era\n *     year\n *     month\n *     day\n *     hour\n *     minute\n *     second\n *     timeZoneName\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `DATETIME()`.\n * @param opts The named argments passed to this `DATETIME()`.\n */\nexport function DATETIME(args, opts) {\n    let arg = args[0];\n    if (arg instanceof FluentNone) {\n        return new FluentNone(`DATETIME(${arg.valueOf()})`);\n    }\n    if (arg instanceof FluentDateTime || arg instanceof FluentNumber) {\n        return new FluentDateTime(arg, values(opts, DATETIME_ALLOWED));\n    }\n    throw new TypeError(\"Invalid argument to DATETIME\");\n}\n","const cache = new Map();\nexport function getMemoizerForLocale(locales) {\n    const stringLocale = Array.isArray(locales) ? locales.join(\" \") : locales;\n    let memoizer = cache.get(stringLocale);\n    if (memoizer === undefined) {\n        memoizer = new Map();\n        cache.set(stringLocale, memoizer);\n    }\n    return memoizer;\n}\n","import { resolveComplexPattern } from \"./resolver.js\";\nimport { Scope } from \"./scope.js\";\nimport { FluentNone } from \"./types.js\";\nimport { NUMBER, DATETIME } from \"./builtins.js\";\nimport { getMemoizerForLocale } from \"./memoizer.js\";\n/**\n * Message bundles are single-language stores of translation resources. They are\n * responsible for formatting message values and attributes to strings.\n */\nexport class FluentBundle {\n    /**\n     * Create an instance of `FluentBundle`.\n     *\n     * @example\n     * ```js\n     * let bundle = new FluentBundle([\"en-US\", \"en\"]);\n     *\n     * let bundle = new FluentBundle(locales, {useIsolating: false});\n     *\n     * let bundle = new FluentBundle(locales, {\n     *   useIsolating: true,\n     *   functions: {\n     *     NODE_ENV: () => process.env.NODE_ENV\n     *   }\n     * });\n     * ```\n     *\n     * @param locales - Used to instantiate `Intl` formatters used by translations.\n     * @param options - Optional configuration for the bundle.\n     */\n    constructor(locales, { functions, useIsolating = true, transform = (v) => v, } = {}) {\n        /** @ignore */\n        this._terms = new Map();\n        /** @ignore */\n        this._messages = new Map();\n        this.locales = Array.isArray(locales) ? locales : [locales];\n        this._functions = {\n            NUMBER,\n            DATETIME,\n            ...functions,\n        };\n        this._useIsolating = useIsolating;\n        this._transform = transform;\n        this._intls = getMemoizerForLocale(locales);\n    }\n    /**\n     * Check if a message is present in the bundle.\n     *\n     * @param id - The identifier of the message to check.\n     */\n    hasMessage(id) {\n        return this._messages.has(id);\n    }\n    /**\n     * Return a raw unformatted message object from the bundle.\n     *\n     * Raw messages are `{value, attributes}` shapes containing translation units\n     * called `Patterns`. `Patterns` are implementation-specific; they should be\n     * treated as black boxes and formatted with `FluentBundle.formatPattern`.\n     *\n     * @param id - The identifier of the message to check.\n     */\n    getMessage(id) {\n        return this._messages.get(id);\n    }\n    /**\n     * Add a translation resource to the bundle.\n     *\n     * @example\n     * ```js\n     * let res = new FluentResource(\"foo = Foo\");\n     * bundle.addResource(res);\n     * bundle.getMessage(\"foo\");\n     * // 鈫� {value: .., attributes: {..}}\n     * ```\n     *\n     * @param res\n     * @param options\n     */\n    addResource(res, { allowOverrides = false, } = {}) {\n        const errors = [];\n        for (let i = 0; i < res.body.length; i++) {\n            let entry = res.body[i];\n            if (entry.id.startsWith(\"-\")) {\n                // Identifiers starting with a dash (-) define terms. Terms are private\n                // and cannot be retrieved from FluentBundle.\n                if (allowOverrides === false && this._terms.has(entry.id)) {\n                    errors.push(new Error(`Attempt to override an existing term: \"${entry.id}\"`));\n                    continue;\n                }\n                this._terms.set(entry.id, entry);\n            }\n            else {\n                if (allowOverrides === false && this._messages.has(entry.id)) {\n                    errors.push(new Error(`Attempt to override an existing message: \"${entry.id}\"`));\n                    continue;\n                }\n                this._messages.set(entry.id, entry);\n            }\n        }\n        return errors;\n    }\n    /**\n     * Format a `Pattern` to a string.\n     *\n     * Format a raw `Pattern` into a string. `args` will be used to resolve\n     * references to variables passed as arguments to the translation.\n     *\n     * In case of errors `formatPattern` will try to salvage as much of the\n     * translation as possible and will still return a string. For performance\n     * reasons, the encountered errors are not returned but instead are appended\n     * to the `errors` array passed as the third argument.\n     *\n     * If `errors` is omitted, the first encountered error will be thrown.\n     *\n     * @example\n     * ```js\n     * let errors = [];\n     * bundle.addResource(\n     *     new FluentResource(\"hello = Hello, {$name}!\"));\n     *\n     * let hello = bundle.getMessage(\"hello\");\n     * if (hello.value) {\n     *     bundle.formatPattern(hello.value, {name: \"Jane\"}, errors);\n     *     // Returns \"Hello, Jane!\" and `errors` is empty.\n     *\n     *     bundle.formatPattern(hello.value, undefined, errors);\n     *     // Returns \"Hello, {$name}!\" and `errors` is now:\n     *     // [<ReferenceError: Unknown variable: name>]\n     * }\n     * ```\n     */\n    formatPattern(pattern, args = null, errors = null) {\n        // Resolve a simple pattern without creating a scope. No error handling is\n        // required; by definition simple patterns don't have placeables.\n        if (typeof pattern === \"string\") {\n            return this._transform(pattern);\n        }\n        // Resolve a complex pattern.\n        let scope = new Scope(this, errors, args);\n        try {\n            let value = resolveComplexPattern(scope, pattern);\n            return value.toString(scope);\n        }\n        catch (err) {\n            if (scope.errors && err instanceof Error) {\n                scope.errors.push(err);\n                return new FluentNone().toString(scope);\n            }\n            throw err;\n        }\n    }\n}\n","// This regex is used to iterate through the beginnings of messages and terms.\n// With the /m flag, the ^ matches at the beginning of every line.\nconst RE_MESSAGE_START = /^(-?[a-zA-Z][\\w-]*) *= */gm;\n// Both Attributes and Variants are parsed in while loops. These regexes are\n// used to break out of them.\nconst RE_ATTRIBUTE_START = /\\.([a-zA-Z][\\w-]*) *= */y;\nconst RE_VARIANT_START = /\\*?\\[/y;\nconst RE_NUMBER_LITERAL = /(-?[0-9]+(?:\\.([0-9]+))?)/y;\nconst RE_IDENTIFIER = /([a-zA-Z][\\w-]*)/y;\nconst RE_REFERENCE = /([$-])?([a-zA-Z][\\w-]*)(?:\\.([a-zA-Z][\\w-]*))?/y;\nconst RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/;\n// A \"run\" is a sequence of text or string literal characters which don't\n// require any special handling. For TextElements such special characters are: {\n// (starts a placeable), and line breaks which require additional logic to check\n// if the next line is indented. For StringLiterals they are: \\ (starts an\n// escape sequence), \" (ends the literal), and line breaks which are not allowed\n// in StringLiterals. Note that string runs may be empty; text runs may not.\nconst RE_TEXT_RUN = /([^{}\\n\\r]+)/y;\nconst RE_STRING_RUN = /([^\\\\\"\\n\\r]*)/y;\n// Escape sequences.\nconst RE_STRING_ESCAPE = /\\\\([\\\\\"])/y;\nconst RE_UNICODE_ESCAPE = /\\\\u([a-fA-F0-9]{4})|\\\\U([a-fA-F0-9]{6})/y;\n// Used for trimming TextElements and indents.\nconst RE_LEADING_NEWLINES = /^\\n+/;\nconst RE_TRAILING_SPACES = / +$/;\n// Used in makeIndent to strip spaces from blank lines and normalize CRLF to LF.\nconst RE_BLANK_LINES = / *\\r?\\n/g;\n// Used in makeIndent to measure the indentation.\nconst RE_INDENT = /( *)$/;\n// Common tokens.\nconst TOKEN_BRACE_OPEN = /{\\s*/y;\nconst TOKEN_BRACE_CLOSE = /\\s*}/y;\nconst TOKEN_BRACKET_OPEN = /\\[\\s*/y;\nconst TOKEN_BRACKET_CLOSE = /\\s*] */y;\nconst TOKEN_PAREN_OPEN = /\\s*\\(\\s*/y;\nconst TOKEN_ARROW = /\\s*->\\s*/y;\nconst TOKEN_COLON = /\\s*:\\s*/y;\n// Note the optional comma. As a deviation from the Fluent EBNF, the parser\n// doesn't enforce commas between call arguments.\nconst TOKEN_COMMA = /\\s*,?\\s*/y;\nconst TOKEN_BLANK = /\\s+/y;\n/**\n * Fluent Resource is a structure storing parsed localization entries.\n */\nexport class FluentResource {\n    constructor(source) {\n        this.body = [];\n        RE_MESSAGE_START.lastIndex = 0;\n        let cursor = 0;\n        // Iterate over the beginnings of messages and terms to efficiently skip\n        // comments and recover from errors.\n        while (true) {\n            let next = RE_MESSAGE_START.exec(source);\n            if (next === null) {\n                break;\n            }\n            cursor = RE_MESSAGE_START.lastIndex;\n            try {\n                this.body.push(parseMessage(next[1]));\n            }\n            catch (err) {\n                if (err instanceof SyntaxError) {\n                    // Don't report any Fluent syntax errors. Skip directly to the\n                    // beginning of the next message or term.\n                    continue;\n                }\n                throw err;\n            }\n        }\n        // The parser implementation is inlined below for performance reasons,\n        // as well as for convenience of accessing `source` and `cursor`.\n        // The parser focuses on minimizing the number of false negatives at the\n        // expense of increasing the risk of false positives. In other words, it\n        // aims at parsing valid Fluent messages with a success rate of 100%, but it\n        // may also parse a few invalid messages which the reference parser would\n        // reject. The parser doesn't perform any validation and may produce entries\n        // which wouldn't make sense in the real world. For best results users are\n        // advised to validate translations with the fluent-syntax parser\n        // pre-runtime.\n        // The parser makes an extensive use of sticky regexes which can be anchored\n        // to any offset of the source string without slicing it. Errors are thrown\n        // to bail out of parsing of ill-formed messages.\n        function test(re) {\n            re.lastIndex = cursor;\n            return re.test(source);\n        }\n        // Advance the cursor by the char if it matches. May be used as a predicate\n        // (was the match found?) or, if errorClass is passed, as an assertion.\n        function consumeChar(char, errorClass) {\n            if (source[cursor] === char) {\n                cursor++;\n                return true;\n            }\n            if (errorClass) {\n                throw new errorClass(`Expected ${char}`);\n            }\n            return false;\n        }\n        // Advance the cursor by the token if it matches. May be used as a predicate\n        // (was the match found?) or, if errorClass is passed, as an assertion.\n        function consumeToken(re, errorClass) {\n            if (test(re)) {\n                cursor = re.lastIndex;\n                return true;\n            }\n            if (errorClass) {\n                throw new errorClass(`Expected ${re.toString()}`);\n            }\n            return false;\n        }\n        // Execute a regex, advance the cursor, and return all capture groups.\n        function match(re) {\n            re.lastIndex = cursor;\n            let result = re.exec(source);\n            if (result === null) {\n                throw new SyntaxError(`Expected ${re.toString()}`);\n            }\n            cursor = re.lastIndex;\n            return result;\n        }\n        // Execute a regex, advance the cursor, and return the capture group.\n        function match1(re) {\n            return match(re)[1];\n        }\n        function parseMessage(id) {\n            let value = parsePattern();\n            let attributes = parseAttributes();\n            if (value === null && Object.keys(attributes).length === 0) {\n                throw new SyntaxError(\"Expected message value or attributes\");\n            }\n            return { id, value, attributes };\n        }\n        function parseAttributes() {\n            let attrs = Object.create(null);\n            while (test(RE_ATTRIBUTE_START)) {\n                let name = match1(RE_ATTRIBUTE_START);\n                let value = parsePattern();\n                if (value === null) {\n                    throw new SyntaxError(\"Expected attribute value\");\n                }\n                attrs[name] = value;\n            }\n            return attrs;\n        }\n        function parsePattern() {\n            let first;\n            // First try to parse any simple text on the same line as the id.\n            if (test(RE_TEXT_RUN)) {\n                first = match1(RE_TEXT_RUN);\n            }\n            // If there's a placeable on the first line, parse a complex pattern.\n            if (source[cursor] === \"{\" || source[cursor] === \"}\") {\n                // Re-use the text parsed above, if possible.\n                return parsePatternElements(first ? [first] : [], Infinity);\n            }\n            // RE_TEXT_VALUE stops at newlines. Only continue parsing the pattern if\n            // what comes after the newline is indented.\n            let indent = parseIndent();\n            if (indent) {\n                if (first) {\n                    // If there's text on the first line, the blank block is part of the\n                    // translation content in its entirety.\n                    return parsePatternElements([first, indent], indent.length);\n                }\n                // Otherwise, we're dealing with a block pattern, i.e. a pattern which\n                // starts on a new line. Discrad the leading newlines but keep the\n                // inline indent; it will be used by the dedentation logic.\n                indent.value = trim(indent.value, RE_LEADING_NEWLINES);\n                return parsePatternElements([indent], indent.length);\n            }\n            if (first) {\n                // It was just a simple inline text after all.\n                return trim(first, RE_TRAILING_SPACES);\n            }\n            return null;\n        }\n        // Parse a complex pattern as an array of elements.\n        function parsePatternElements(elements = [], commonIndent) {\n            while (true) {\n                if (test(RE_TEXT_RUN)) {\n                    elements.push(match1(RE_TEXT_RUN));\n                    continue;\n                }\n                if (source[cursor] === \"{\") {\n                    elements.push(parsePlaceable());\n                    continue;\n                }\n                if (source[cursor] === \"}\") {\n                    throw new SyntaxError(\"Unbalanced closing brace\");\n                }\n                let indent = parseIndent();\n                if (indent) {\n                    elements.push(indent);\n                    commonIndent = Math.min(commonIndent, indent.length);\n                    continue;\n                }\n                break;\n            }\n            let lastIndex = elements.length - 1;\n            let lastElement = elements[lastIndex];\n            // Trim the trailing spaces in the last element if it's a TextElement.\n            if (typeof lastElement === \"string\") {\n                elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES);\n            }\n            let baked = [];\n            for (let element of elements) {\n                if (element instanceof Indent) {\n                    // Dedent indented lines by the maximum common indent.\n                    element = element.value.slice(0, element.value.length - commonIndent);\n                }\n                if (element) {\n                    baked.push(element);\n                }\n            }\n            return baked;\n        }\n        function parsePlaceable() {\n            consumeToken(TOKEN_BRACE_OPEN, SyntaxError);\n            let selector = parseInlineExpression();\n            if (consumeToken(TOKEN_BRACE_CLOSE)) {\n                return selector;\n            }\n            if (consumeToken(TOKEN_ARROW)) {\n                let variants = parseVariants();\n                consumeToken(TOKEN_BRACE_CLOSE, SyntaxError);\n                return {\n                    type: \"select\",\n                    selector,\n                    ...variants,\n                };\n            }\n            throw new SyntaxError(\"Unclosed placeable\");\n        }\n        function parseInlineExpression() {\n            if (source[cursor] === \"{\") {\n                // It's a nested placeable.\n                return parsePlaceable();\n            }\n            if (test(RE_REFERENCE)) {\n                let [, sigil, name, attr = null] = match(RE_REFERENCE);\n                if (sigil === \"$\") {\n                    return { type: \"var\", name };\n                }\n                if (consumeToken(TOKEN_PAREN_OPEN)) {\n                    let args = parseArguments();\n                    if (sigil === \"-\") {\n                        // A parameterized term: -term(...).\n                        return { type: \"term\", name, attr, args };\n                    }\n                    if (RE_FUNCTION_NAME.test(name)) {\n                        return { type: \"func\", name, args };\n                    }\n                    throw new SyntaxError(\"Function names must be all upper-case\");\n                }\n                if (sigil === \"-\") {\n                    // A non-parameterized term: -term.\n                    return {\n                        type: \"term\",\n                        name,\n                        attr,\n                        args: [],\n                    };\n                }\n                return { type: \"mesg\", name, attr };\n            }\n            return parseLiteral();\n        }\n        function parseArguments() {\n            let args = [];\n            while (true) {\n                switch (source[cursor]) {\n                    case \")\": // End of the argument list.\n                        cursor++;\n                        return args;\n                    case undefined: // EOF\n                        throw new SyntaxError(\"Unclosed argument list\");\n                }\n                args.push(parseArgument());\n                // Commas between arguments are treated as whitespace.\n                consumeToken(TOKEN_COMMA);\n            }\n        }\n        function parseArgument() {\n            let expr = parseInlineExpression();\n            if (expr.type !== \"mesg\") {\n                return expr;\n            }\n            if (consumeToken(TOKEN_COLON)) {\n                // The reference is the beginning of a named argument.\n                return {\n                    type: \"narg\",\n                    name: expr.name,\n                    value: parseLiteral(),\n                };\n            }\n            // It's a regular message reference.\n            return expr;\n        }\n        function parseVariants() {\n            let variants = [];\n            let count = 0;\n            let star;\n            while (test(RE_VARIANT_START)) {\n                if (consumeChar(\"*\")) {\n                    star = count;\n                }\n                let key = parseVariantKey();\n                let value = parsePattern();\n                if (value === null) {\n                    throw new SyntaxError(\"Expected variant value\");\n                }\n                variants[count++] = { key, value };\n            }\n            if (count === 0) {\n                return null;\n            }\n            if (star === undefined) {\n                throw new SyntaxError(\"Expected default variant\");\n            }\n            return { variants, star };\n        }\n        function parseVariantKey() {\n            consumeToken(TOKEN_BRACKET_OPEN, SyntaxError);\n            let key;\n            if (test(RE_NUMBER_LITERAL)) {\n                key = parseNumberLiteral();\n            }\n            else {\n                key = {\n                    type: \"str\",\n                    value: match1(RE_IDENTIFIER),\n                };\n            }\n            consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError);\n            return key;\n        }\n        function parseLiteral() {\n            if (test(RE_NUMBER_LITERAL)) {\n                return parseNumberLiteral();\n            }\n            if (source[cursor] === '\"') {\n                return parseStringLiteral();\n            }\n            throw new SyntaxError(\"Invalid expression\");\n        }\n        function parseNumberLiteral() {\n            let [, value, fraction = \"\"] = match(RE_NUMBER_LITERAL);\n            let precision = fraction.length;\n            return {\n                type: \"num\",\n                value: parseFloat(value),\n                precision,\n            };\n        }\n        function parseStringLiteral() {\n            consumeChar('\"', SyntaxError);\n            let value = \"\";\n            while (true) {\n                value += match1(RE_STRING_RUN);\n                if (source[cursor] === \"\\\\\") {\n                    value += parseEscapeSequence();\n                    continue;\n                }\n                if (consumeChar('\"')) {\n                    return { type: \"str\", value };\n                }\n                // We've reached an EOL of EOF.\n                throw new SyntaxError(\"Unclosed string literal\");\n            }\n        }\n        // Unescape known escape sequences.\n        function parseEscapeSequence() {\n            if (test(RE_STRING_ESCAPE)) {\n                return match1(RE_STRING_ESCAPE);\n            }\n            if (test(RE_UNICODE_ESCAPE)) {\n                let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE);\n                let codepoint = parseInt(codepoint4 || codepoint6, 16);\n                return codepoint <= 0xd7ff || 0xe000 <= codepoint\n                    ? // It's a Unicode scalar value.\n                        String.fromCodePoint(codepoint)\n                    : // Lonely surrogates can cause trouble when the parsing result is\n                        // saved using UTF-8. Use U+FFFD REPLACEMENT CHARACTER instead.\n                        \"锟絓";\n            }\n            throw new SyntaxError(\"Unknown escape sequence\");\n        }\n        // Parse blank space. Return it if it looks like indent before a pattern\n        // line. Skip it othwerwise.\n        function parseIndent() {\n            let start = cursor;\n            consumeToken(TOKEN_BLANK);\n            // Check the first non-blank character after the indent.\n            switch (source[cursor]) {\n                case \".\":\n                case \"[\":\n                case \"*\":\n                case \"}\":\n                case undefined: // EOF\n                    // A special character. End the Pattern.\n                    return false;\n                case \"{\":\n                    // Placeables don't require indentation (in EBNF: block-placeable).\n                    // Continue the Pattern.\n                    return makeIndent(source.slice(start, cursor));\n            }\n            // If the first character on the line is not one of the special characters\n            // listed above, it's a regular text character. Check if there's at least\n            // one space of indent before it.\n            if (source[cursor - 1] === \" \") {\n                // It's an indented text character (in EBNF: indented-char). Continue\n                // the Pattern.\n                return makeIndent(source.slice(start, cursor));\n            }\n            // A not-indented text character is likely the identifier of the next\n            // message. End the Pattern.\n            return false;\n        }\n        // Trim blanks in text according to the given regex.\n        function trim(text, re) {\n            return text.replace(re, \"\");\n        }\n        // Normalize a blank block and extract the indent details.\n        function makeIndent(blank) {\n            let value = blank.replace(RE_BLANK_LINES, \"\\n\");\n            let length = RE_INDENT.exec(blank)[1].length;\n            return new Indent(value, length);\n        }\n    }\n}\nclass Indent {\n    constructor(value, length) {\n        this.value = value;\n        this.length = length;\n    }\n}\n","/**\n * A JavaScript implementation of Project Fluent, a localization\n * framework designed to unleash the expressive power of the natural language.\n *\n * @module\n */\nexport { FluentBundle } from \"./bundle.js\";\nexport { FluentResource } from \"./resource.js\";\nexport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n","/* eslint no-console: [\"error\", {allow: [\"warn\"]}] */\n/* global console */\n// Match the opening angle bracket (<) in HTML tags, and HTML entities like\n// &amp;, &#0038;, &#x0026;.\nconst reOverlay = /<|&#?\\w+;/;\n/**\n * Elements allowed in translations even if they are not present in the source\n * HTML. They are text-level elements as defined by the HTML5 spec:\n * https://www.w3.org/TR/html5/text-level-semantics.html with the exception of:\n *\n *   - a - because we don't allow href on it anyways,\n *   - ruby, rt, rp - because we don't allow nested elements to be inserted.\n */\nconst TEXT_LEVEL_ELEMENTS = {\n    \"http://www.w3.org/1999/xhtml\": [\n        \"em\",\n        \"strong\",\n        \"small\",\n        \"s\",\n        \"cite\",\n        \"q\",\n        \"dfn\",\n        \"abbr\",\n        \"data\",\n        \"time\",\n        \"code\",\n        \"var\",\n        \"samp\",\n        \"kbd\",\n        \"sub\",\n        \"sup\",\n        \"i\",\n        \"b\",\n        \"u\",\n        \"mark\",\n        \"bdi\",\n        \"bdo\",\n        \"span\",\n        \"br\",\n        \"wbr\",\n    ],\n};\nconst LOCALIZABLE_ATTRIBUTES = {\n    \"http://www.w3.org/1999/xhtml\": {\n        global: [\"title\", \"aria-description\", \"aria-label\", \"aria-valuetext\"],\n        a: [\"download\"],\n        area: [\"download\", \"alt\"],\n        // value is special-cased in isAttrNameLocalizable\n        input: [\"alt\", \"placeholder\"],\n        menuitem: [\"label\"],\n        menu: [\"label\"],\n        optgroup: [\"label\"],\n        option: [\"label\"],\n        track: [\"label\"],\n        img: [\"alt\"],\n        textarea: [\"placeholder\"],\n        th: [\"abbr\"],\n    },\n    \"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\": {\n        global: [\n            \"accesskey\",\n            \"aria-label\",\n            \"aria-valuetext\",\n            \"label\",\n            \"title\",\n            \"tooltiptext\",\n        ],\n        description: [\"value\"],\n        key: [\"key\", \"keycode\"],\n        label: [\"value\"],\n        textbox: [\"placeholder\", \"value\"],\n    },\n};\n/**\n * Translate an element.\n *\n * Translate the element's text content and attributes. Some HTML markup is\n * allowed in the translation. The element's children with the data-l10n-name\n * attribute will be treated as arguments to the translation. If the\n * translation defines the same children, their attributes and text contents\n * will be used for translating the matching source child.\n *\n * @param   {Element} element\n * @param   {Object} translation\n * @private\n */\nexport default function translateElement(element, translation) {\n    const { value } = translation;\n    if (typeof value === \"string\") {\n        if (element.localName === \"title\" &&\n            element.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\n            // A special case for the HTML title element whose content must be text.\n            element.textContent = value;\n        }\n        else if (!reOverlay.test(value)) {\n            // If the translation doesn't contain any markup skip the overlay logic.\n            element.textContent = value;\n        }\n        else {\n            // Else parse the translation's HTML using an inert template element,\n            // sanitize it and replace the element's content.\n            const templateElement = element.ownerDocument.createElementNS(\"http://www.w3.org/1999/xhtml\", \"template\");\n            templateElement.innerHTML = value;\n            overlayChildNodes(templateElement.content, element);\n        }\n    }\n    // Even if the translation doesn't define any localizable attributes, run\n    // overlayAttributes to remove any localizable attributes set by previous\n    // translations.\n    overlayAttributes(translation, element);\n}\n/**\n * Replace child nodes of an element with child nodes of another element.\n *\n * The contents of the target element will be cleared and fully replaced with\n * sanitized contents of the source element.\n *\n * @param {DocumentFragment} fromFragment - The source of children to overlay.\n * @param {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayChildNodes(fromFragment, toElement) {\n    for (const childNode of fromFragment.childNodes) {\n        if (childNode.nodeType === childNode.TEXT_NODE) {\n            // Keep the translated text node.\n            continue;\n        }\n        if (childNode.hasAttribute(\"data-l10n-name\")) {\n            const sanitized = getNodeForNamedElement(toElement, childNode);\n            fromFragment.replaceChild(sanitized, childNode);\n            continue;\n        }\n        if (isElementAllowed(childNode)) {\n            const sanitized = createSanitizedElement(childNode);\n            fromFragment.replaceChild(sanitized, childNode);\n            continue;\n        }\n        console.warn(`An element of forbidden type \"${childNode.localName}\" was found in ` +\n            \"the translation. Only safe text-level elements and elements with \" +\n            \"data-l10n-name are allowed.\");\n        // If all else fails, replace the element with its text content.\n        fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode);\n    }\n    toElement.textContent = \"\";\n    toElement.appendChild(fromFragment);\n}\nfunction hasAttribute(attributes, name) {\n    if (!attributes) {\n        return false;\n    }\n    for (let attr of attributes) {\n        if (attr.name === name) {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Transplant localizable attributes of an element to another element.\n *\n * Any localizable attributes already set on the target element will be\n * cleared.\n *\n * @param   {Element|Object} fromElement - The source of child nodes to overlay.\n * @param   {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayAttributes(fromElement, toElement) {\n    const explicitlyAllowed = toElement.hasAttribute(\"data-l10n-attrs\")\n        ? toElement\n            .getAttribute(\"data-l10n-attrs\")\n            .split(\",\")\n            .map(i => i.trim())\n        : null;\n    // Remove existing localizable attributes if they\n    // will not be used in the new translation.\n    for (const attr of Array.from(toElement.attributes)) {\n        if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n            !hasAttribute(fromElement.attributes, attr.name)) {\n            toElement.removeAttribute(attr.name);\n        }\n    }\n    // fromElement might be a {value, attributes} object as returned by\n    // Localization.messageFromBundle. In which case attributes may be null to\n    // save GC cycles.\n    if (!fromElement.attributes) {\n        return;\n    }\n    // Set localizable attributes.\n    for (const attr of Array.from(fromElement.attributes)) {\n        if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n            toElement.getAttribute(attr.name) !== attr.value) {\n            toElement.setAttribute(attr.name, attr.value);\n        }\n    }\n}\n/**\n * Sanitize a child element created by the translation.\n *\n * Try to find a corresponding child in sourceElement and use it as the base\n * for the sanitization. This will preserve functional attribtues defined on\n * the child element in the source HTML.\n *\n * @param   {Element} sourceElement - The source for data-l10n-name lookups.\n * @param   {Element} translatedChild - The translated child to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction getNodeForNamedElement(sourceElement, translatedChild) {\n    const childName = translatedChild.getAttribute(\"data-l10n-name\");\n    const sourceChild = sourceElement.querySelector(`[data-l10n-name=\"${childName}\"]`);\n    if (!sourceChild) {\n        console.warn(`An element named \"${childName}\" wasn't found in the source.`);\n        return createTextNodeFromTextContent(translatedChild);\n    }\n    if (sourceChild.localName !== translatedChild.localName) {\n        console.warn(`An element named \"${childName}\" was found in the translation ` +\n            `but its type ${translatedChild.localName} didn't match the ` +\n            `element found in the source (${sourceChild.localName}).`);\n        return createTextNodeFromTextContent(translatedChild);\n    }\n    // Remove it from sourceElement so that the translation cannot use\n    // the same reference name again.\n    sourceElement.removeChild(sourceChild);\n    // We can't currently guarantee that a translation won't remove\n    // sourceChild from the element completely, which could break the app if\n    // it relies on an event handler attached to the sourceChild. Let's make\n    // this limitation explicit for now by breaking the identitiy of the\n    // sourceChild by cloning it. This will destroy all event handlers\n    // attached to sourceChild via addEventListener and via on<name>\n    // properties.\n    const clone = sourceChild.cloneNode(false);\n    return shallowPopulateUsing(translatedChild, clone);\n}\n/**\n * Sanitize an allowed element.\n *\n * Text-level elements allowed in translations may only use safe attributes\n * and will have any nested markup stripped to text content.\n *\n * @param   {Element} element - The element to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction createSanitizedElement(element) {\n    // Start with an empty element of the same type to remove nested children\n    // and non-localizable attributes defined by the translation.\n    const clone = element.ownerDocument.createElement(element.localName);\n    return shallowPopulateUsing(element, clone);\n}\n/**\n * Convert an element to a text node.\n *\n * @param   {Element} element - The element to be sanitized.\n * @returns {Node}\n * @private\n */\nfunction createTextNodeFromTextContent(element) {\n    return element.ownerDocument.createTextNode(element.textContent);\n}\n/**\n * Check if element is allowed in the translation.\n *\n * This method is used by the sanitizer when the translation markup contains\n * an element which is not present in the source code.\n *\n * @param   {Element} element\n * @returns {boolean}\n * @private\n */\nfunction isElementAllowed(element) {\n    const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI];\n    return allowed && allowed.includes(element.localName);\n}\n/**\n * Check if attribute is allowed for the given element.\n *\n * This method is used by the sanitizer when the translation markup contains\n * DOM attributes, or when the translation has traits which map to DOM\n * attributes.\n *\n * `explicitlyAllowed` can be passed as a list of attributes explicitly\n * allowed on this element.\n *\n * @param   {string}         name\n * @param   {Element}        element\n * @param   {Array}          explicitlyAllowed\n * @returns {boolean}\n * @private\n */\nfunction isAttrNameLocalizable(name, element, explicitlyAllowed = null) {\n    if (explicitlyAllowed && explicitlyAllowed.includes(name)) {\n        return true;\n    }\n    const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI];\n    if (!allowed) {\n        return false;\n    }\n    const attrName = name.toLowerCase();\n    const elemName = element.localName;\n    // Is it a globally safe attribute?\n    if (allowed.global.includes(attrName)) {\n        return true;\n    }\n    // Are there no allowed attributes for this element?\n    if (!allowed[elemName]) {\n        return false;\n    }\n    // Is it allowed on this element?\n    if (allowed[elemName].includes(attrName)) {\n        return true;\n    }\n    // Special case for value on HTML inputs with type button, reset, submit\n    if (element.namespaceURI === \"http://www.w3.org/1999/xhtml\" &&\n        elemName === \"input\" &&\n        attrName === \"value\") {\n        const type = element.type.toLowerCase();\n        if (type === \"submit\" || type === \"button\" || type === \"reset\") {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Helper to set textContent and localizable attributes on an element.\n *\n * @param   {Element} fromElement\n * @param   {Element} toElement\n * @returns {Element}\n * @private\n */\nfunction shallowPopulateUsing(fromElement, toElement) {\n    toElement.textContent = fromElement.textContent;\n    overlayAttributes(fromElement, toElement);\n    return toElement;\n}\n","/*\n * Base CachedIterable class.\n */\nexport default class CachedIterable extends Array {\n    /**\n     * Create a `CachedIterable` instance from an iterable or, if another\n     * instance of `CachedIterable` is passed, return it without any\n     * modifications.\n     *\n     * @param {Iterable} iterable\n     * @returns {CachedIterable}\n     */\n    static from(iterable) {\n        if (iterable instanceof this) {\n            return iterable;\n        }\n\n        return new this(iterable);\n    }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedSyncIterable caches the elements yielded by an iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedSyncIterable extends CachedIterable {\n    /**\n     * Create an `CachedSyncIterable` instance.\n     *\n     * @param {Iterable} iterable\n     * @returns {CachedSyncIterable}\n     */\n    constructor(iterable) {\n        super();\n\n        if (Symbol.iterator in Object(iterable)) {\n            this.iterator = iterable[Symbol.iterator]();\n        } else {\n            throw new TypeError(\"Argument must implement the iteration protocol.\");\n        }\n    }\n\n    [Symbol.iterator]() {\n        const cached = this;\n        let cur = 0;\n\n        return {\n            next() {\n                if (cached.length <= cur) {\n                    cached.push(cached.iterator.next());\n                }\n                return cached[cur++];\n            }\n        };\n    }\n\n    /**\n     * This method allows user to consume the next element from the iterator\n     * into the cache.\n     *\n     * @param {number} count - number of elements to consume\n     */\n    touchNext(count = 1) {\n        let idx = 0;\n        while (idx++ < count) {\n            const last = this[this.length - 1];\n            if (last && last.done) {\n                break;\n            }\n            this.push(this.iterator.next());\n        }\n        // Return the last cached {value, done} object to allow the calling\n        // code to decide if it needs to call touchNext again.\n        return this[this.length - 1];\n    }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedAsyncIterable caches the elements yielded by an async iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedAsyncIterable extends CachedIterable {\n    /**\n     * Create an `CachedAsyncIterable` instance.\n     *\n     * @param {Iterable} iterable\n     * @returns {CachedAsyncIterable}\n     */\n    constructor(iterable) {\n        super();\n\n        if (Symbol.asyncIterator in Object(iterable)) {\n            this.iterator = iterable[Symbol.asyncIterator]();\n        } else if (Symbol.iterator in Object(iterable)) {\n            this.iterator = iterable[Symbol.iterator]();\n        } else {\n            throw new TypeError(\"Argument must implement the iteration protocol.\");\n        }\n    }\n\n    /**\n     * Asynchronous iterator caching the yielded elements.\n     *\n     * Elements yielded by the original iterable will be cached and available\n     * synchronously. Returns an async generator object implementing the\n     * iterator protocol over the elements of the original (async or sync)\n     * iterable.\n     */\n    [Symbol.asyncIterator]() {\n        const cached = this;\n        let cur = 0;\n\n        return {\n            async next() {\n                if (cached.length <= cur) {\n                    cached.push(cached.iterator.next());\n                }\n                return cached[cur++];\n            }\n        };\n    }\n\n    /**\n     * This method allows user to consume the next element from the iterator\n     * into the cache.\n     *\n     * @param {number} count - number of elements to consume\n     */\n    async touchNext(count = 1) {\n        let idx = 0;\n        while (idx++ < count) {\n            const last = this[this.length - 1];\n            if (last && (await last).done) {\n                break;\n            }\n            this.push(this.iterator.next());\n        }\n        // Return the last cached {value, done} object to allow the calling\n        // code to decide if it needs to call touchNext again.\n        return this[this.length - 1];\n    }\n}\n","export {default as CachedSyncIterable} from \"./cached_sync_iterable.mjs\";\nexport {default as CachedAsyncIterable} from \"./cached_async_iterable.mjs\";\n","/* eslint no-console: [\"error\", { allow: [\"warn\", \"error\"] }] */\n/* global console */\nimport { CachedAsyncIterable } from \"cached-iterable\";\n/**\n * The `Localization` class is a central high-level API for vanilla\n * JavaScript use of Fluent.\n * It combines language negotiation, FluentBundle and I/O to\n * provide a scriptable API to format translations.\n */\nexport default class Localization {\n    /**\n     * @param {Array<String>} resourceIds     - List of resource IDs\n     * @param {Function}      generateBundles - Function that returns a\n     *                                          generator over FluentBundles\n     *\n     * @returns {Localization}\n     */\n    constructor(resourceIds = [], generateBundles) {\n        this.resourceIds = resourceIds;\n        this.generateBundles = generateBundles;\n        this.onChange(true);\n    }\n    addResourceIds(resourceIds, eager = false) {\n        this.resourceIds.push(...resourceIds);\n        this.onChange(eager);\n        return this.resourceIds.length;\n    }\n    removeResourceIds(resourceIds) {\n        this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r));\n        this.onChange();\n        return this.resourceIds.length;\n    }\n    /**\n     * Format translations and handle fallback if needed.\n     *\n     * Format translations for `keys` from `FluentBundle` instances on this\n     * DOMLocalization. In case of errors, fetch the next context in the\n     * fallback chain.\n     *\n     * @param   {Array<Object>}         keys    - Translation keys to format.\n     * @param   {Function}              method  - Formatting function.\n     * @returns {Promise<Array<string|Object>>}\n     * @private\n     */\n    async formatWithFallback(keys, method) {\n        const translations = [];\n        let hasAtLeastOneBundle = false;\n        for await (const bundle of this.bundles) {\n            hasAtLeastOneBundle = true;\n            const missingIds = keysFromBundle(method, bundle, keys, translations);\n            if (missingIds.size === 0) {\n                break;\n            }\n            if (typeof console !== \"undefined\") {\n                const locale = bundle.locales[0];\n                const ids = Array.from(missingIds).join(\", \");\n                console.warn(`[fluent] Missing translations in ${locale}: ${ids}`);\n            }\n        }\n        if (!hasAtLeastOneBundle && typeof console !== \"undefined\") {\n            console.warn(`[fluent] Request for keys failed because no resource bundles got generated.\n  keys: ${JSON.stringify(keys)}.\n  resourceIds: ${JSON.stringify(this.resourceIds)}.`);\n        }\n        return translations;\n    }\n    /**\n     * Format translations into `{value, attributes}` objects.\n     *\n     * The fallback logic is the same as in `formatValues`\n     * but it returns `{value, attributes}` objects\n     * which are suitable for the translation of DOM elements.\n     *\n     * Returns a Promise resolving to an array of the translation strings.\n     *\n     * @example\n     * ```js\n     * docL10n.formatMessages([\n     *   {id: 'hello', args: { who: 'Mary' }},\n     *   {id: 'welcome'}\n     * ]).then(console.log);\n     *\n     * // [\n     * //   { value: 'Hello, Mary!', attributes: null },\n     * //   {\n     * //     value: 'Welcome!',\n     * //     attributes: [ { name: \"title\", value: 'Hello' } ]\n     * //   }\n     * // ]\n     * ```\n     *\n     * @param   {Array<Object>} keys\n     * @returns {Promise<Array<{value: string, attributes: Object}>>}\n     * @private\n     */\n    formatMessages(keys) {\n        return this.formatWithFallback(keys, messageFromBundle);\n    }\n    /**\n     * Retrieve translations corresponding to the passed keys.\n     *\n     * A generalized version of `DOMLocalization.formatValue`. Keys must\n     * be `{id, args}` objects.\n     *\n     * Returns a Promise resolving to an array of the translation strings.\n     *\n     * @example\n     * ```js\n     * docL10n.formatValues([\n     *   {id: 'hello', args: { who: 'Mary' }},\n     *   {id: 'hello', args: { who: 'John' }},\n     *   {id: 'welcome'}\n     * ]).then(console.log);\n     *\n     * // ['Hello, Mary!', 'Hello, John!', 'Welcome!']\n     * ```\n     *\n     * @param   {Array<Object>} keys\n     * @returns {Promise<Array<string>>}\n     */\n    formatValues(keys) {\n        return this.formatWithFallback(keys, valueFromBundle);\n    }\n    /**\n     * Retrieve the translation corresponding to the `id` identifier.\n     *\n     * If passed, `args` is a simple hash object with a list of variables that\n     * will be interpolated in the value of the translation.\n     *\n     * Returns a Promise resolving to the translation string.\n     *\n     * Use this sparingly for one-off messages which don't need to be\n     * retranslated when the user changes their language preferences, e.g. in\n     * notifications.\n     *\n     * @example\n     * ```js\n     * docL10n.formatValue(\n     *   'hello', { who: 'world' }\n     * ).then(console.log);\n     *\n     * // 'Hello, world!'\n     * ```\n     *\n     * @param   {string}  id     - Identifier of the translation to format\n     * @param   {Object}  [args] - Optional external arguments\n     * @returns {Promise<string>}\n     */\n    async formatValue(id, args) {\n        const [val] = await this.formatValues([{ id, args }]);\n        return val;\n    }\n    handleEvent() {\n        this.onChange();\n    }\n    /**\n     * This method should be called when there's a reason to believe\n     * that language negotiation or available resources changed.\n     */\n    onChange(eager = false) {\n        this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds));\n        if (eager) {\n            this.bundles.touchNext(2);\n        }\n    }\n}\n/**\n * Format the value of a message into a string or `null`.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a value of a single L10n Entity using provided `FluentBundle`.\n *\n * If the message doesn't have a value, return `null`.\n *\n * @param   {FluentBundle} bundle\n * @param   {Array<Error>} errors\n * @param   {Object} message\n * @param   {Object} args\n * @returns {string|null}\n * @private\n */\nfunction valueFromBundle(bundle, errors, message, args) {\n    if (message.value) {\n        return bundle.formatPattern(message.value, args, errors);\n    }\n    return null;\n}\n/**\n * Format all public values of a message into a {value, attributes} object.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a single L10n Entity using provided `FluentBundle`.\n *\n * The function will return an object with a value and attributes of the\n * entity.\n *\n * @param   {FluentBundle} bundle\n * @param   {Array<Error>} errors\n * @param   {Object} message\n * @param   {Object} args\n * @returns {Object}\n * @private\n */\nfunction messageFromBundle(bundle, errors, message, args) {\n    const formatted = {\n        value: null,\n        attributes: null,\n    };\n    if (message.value) {\n        formatted.value = bundle.formatPattern(message.value, args, errors);\n    }\n    let attrNames = Object.keys(message.attributes);\n    if (attrNames.length > 0) {\n        formatted.attributes = new Array(attrNames.length);\n        for (let [i, name] of attrNames.entries()) {\n            let value = bundle.formatPattern(message.attributes[name], args, errors);\n            formatted.attributes[i] = { name, value };\n        }\n    }\n    return formatted;\n}\n/**\n * This function is an inner function for `Localization.formatWithFallback`.\n *\n * It takes a `FluentBundle`, list of l10n-ids and a method to be used for\n * key resolution (either `valueFromBundle` or `messageFromBundle`) and\n * optionally a value returned from `keysFromBundle` executed against\n * another `FluentBundle`.\n *\n * The idea here is that if the previous `FluentBundle` did not resolve\n * all keys, we're calling this function with the next context to resolve\n * the remaining ones.\n *\n * In the function, we loop over `keys` and check if we have the `prev`\n * passed and if it has an error entry for the position we're in.\n *\n * If it doesn't, it means that we have a good translation for this key and\n * we return it. If it does, we'll try to resolve the key using the passed\n * `FluentBundle`.\n *\n * In the end, we fill the translations array, and return the Set with\n * missing ids.\n *\n * See `Localization.formatWithFallback` for more info on how this is used.\n *\n * @param {Function}       method\n * @param {FluentBundle} bundle\n * @param {Array<string>}  keys\n * @param {{Array<{value: string, attributes: Object}>}} translations\n *\n * @returns {Set<string>}\n * @private\n */\nfunction keysFromBundle(method, bundle, keys, translations) {\n    const messageErrors = [];\n    const missingIds = new Set();\n    keys.forEach(({ id, args }, i) => {\n        if (translations[i] !== undefined) {\n            return;\n        }\n        let message = bundle.getMessage(id);\n        if (message) {\n            messageErrors.length = 0;\n            translations[i] = method(bundle, messageErrors, message, args);\n            if (messageErrors.length > 0 && typeof console !== \"undefined\") {\n                const locale = bundle.locales[0];\n                const errors = messageErrors.join(\", \");\n                console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`);\n            }\n        }\n        else {\n            missingIds.add(id);\n        }\n    });\n    return missingIds;\n}\n","import translateElement from \"./overlay.js\";\nimport Localization from \"./localization.js\";\nconst L10NID_ATTR_NAME = \"data-l10n-id\";\nconst L10NARGS_ATTR_NAME = \"data-l10n-args\";\nconst L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`;\n/**\n * The `DOMLocalization` class is responsible for fetching resources and\n * formatting translations.\n *\n * It implements the fallback strategy in case of errors encountered during the\n * formatting of translations and methods for observing DOM\n * trees with a `MutationObserver`.\n */\nexport default class DOMLocalization extends Localization {\n    /**\n     * @param {Array<String>}    resourceIds     - List of resource IDs\n     * @param {Function}         generateBundles - Function that returns a\n     *                                             generator over FluentBundles\n     * @returns {DOMLocalization}\n     */\n    constructor(resourceIds, generateBundles) {\n        super(resourceIds, generateBundles);\n        // A Set of DOM trees observed by the `MutationObserver`.\n        this.roots = new Set();\n        // requestAnimationFrame handler.\n        this.pendingrAF = null;\n        // list of elements pending for translation.\n        this.pendingElements = new Set();\n        this.windowElement = null;\n        this.mutationObserver = null;\n        this.observerConfig = {\n            attributes: true,\n            characterData: false,\n            childList: true,\n            subtree: true,\n            attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME],\n        };\n    }\n    onChange(eager = false) {\n        super.onChange(eager);\n        if (this.roots) {\n            this.translateRoots();\n        }\n    }\n    /**\n     * Set the `data-l10n-id` and `data-l10n-args` attributes on DOM elements.\n     * FluentDOM makes use of mutation observers to detect changes\n     * to `data-l10n-*` attributes and translate elements asynchronously.\n     * `setAttributes` is a convenience method which allows to translate\n     * DOM elements declaratively.\n     *\n     * You should always prefer to use `data-l10n-id` on elements (statically in\n     * HTML or dynamically via `setAttributes`) over manually retrieving\n     * translations with `format`.  The use of attributes ensures that the\n     * elements can be retranslated when the user changes their language\n     * preferences.\n     *\n     * ```javascript\n     * localization.setAttributes(\n     *   document.querySelector('#welcome'), 'hello', { who: 'world' }\n     * );\n     * ```\n     *\n     * This will set the following attributes on the `#welcome` element.\n     * The MutationObserver will pick up this change and will localize the element\n     * asynchronously.\n     *\n     * ```html\n     * <p id='welcome'\n     *   data-l10n-id='hello'\n     *   data-l10n-args='{\"who\": \"world\"}'>\n     * </p>\n     * ```\n     *\n     * @param {Element}                element - Element to set attributes on\n     * @param {string}                 id      - l10n-id string\n     * @param {Object<string, string>} args    - KVP list of l10n arguments\n     * @returns {Element}\n     */\n    setAttributes(element, id, args) {\n        element.setAttribute(L10NID_ATTR_NAME, id);\n        if (args) {\n            element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args));\n        }\n        else {\n            element.removeAttribute(L10NARGS_ATTR_NAME);\n        }\n        return element;\n    }\n    /**\n     * Get the `data-l10n-*` attributes from DOM elements.\n     *\n     * ```javascript\n     * localization.getAttributes(\n     *   document.querySelector('#welcome')\n     * );\n     * // -> { id: 'hello', args: { who: 'world' } }\n     * ```\n     *\n     * @param   {Element}  element - HTML element\n     * @returns {{id: string, args: Object}}\n     */\n    getAttributes(element) {\n        return {\n            id: element.getAttribute(L10NID_ATTR_NAME),\n            args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n        };\n    }\n    /**\n     * Add `newRoot` to the list of roots managed by this `DOMLocalization`.\n     *\n     * Additionally, if this `DOMLocalization` has an observer, start observing\n     * `newRoot` in order to translate mutations in it.\n     *\n     * @param {Element | DocumentFragment}      newRoot - Root to observe.\n     */\n    connectRoot(newRoot) {\n        for (const root of this.roots) {\n            if (root === newRoot ||\n                root.contains(newRoot) ||\n                newRoot.contains(root)) {\n                throw new Error(\"Cannot add a root that overlaps with existing root.\");\n            }\n        }\n        if (this.windowElement) {\n            if (this.windowElement !== newRoot.ownerDocument.defaultView) {\n                throw new Error(`Cannot connect a root:\n          DOMLocalization already has a root from a different window.`);\n            }\n        }\n        else {\n            this.windowElement = newRoot.ownerDocument.defaultView;\n            this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations));\n        }\n        this.roots.add(newRoot);\n        this.mutationObserver.observe(newRoot, this.observerConfig);\n    }\n    /**\n     * Remove `root` from the list of roots managed by this `DOMLocalization`.\n     *\n     * Additionally, if this `DOMLocalization` has an observer, stop observing\n     * `root`.\n     *\n     * Returns `true` if the root was the last one managed by this\n     * `DOMLocalization`.\n     *\n     * @param   {Element | DocumentFragment} root - Root to disconnect.\n     * @returns {boolean}\n     */\n    disconnectRoot(root) {\n        this.roots.delete(root);\n        // Pause the mutation observer to stop observing `root`.\n        this.pauseObserving();\n        if (this.roots.size === 0) {\n            this.mutationObserver = null;\n            if (this.windowElement && this.pendingrAF) {\n                this.windowElement.cancelAnimationFrame(this.pendingrAF);\n            }\n            this.windowElement = null;\n            this.pendingrAF = null;\n            this.pendingElements.clear();\n            return true;\n        }\n        // Resume observing all other roots.\n        this.resumeObserving();\n        return false;\n    }\n    /**\n     * Translate all roots associated with this `DOMLocalization`.\n     *\n     * @returns {Promise}\n     */\n    translateRoots() {\n        const roots = Array.from(this.roots);\n        return Promise.all(roots.map(root => this.translateFragment(root)));\n    }\n    /**\n     * Pauses the `MutationObserver`.\n     */\n    pauseObserving() {\n        if (!this.mutationObserver) {\n            return;\n        }\n        this.translateMutations(this.mutationObserver.takeRecords());\n        this.mutationObserver.disconnect();\n    }\n    /**\n     * Resumes the `MutationObserver`.\n     */\n    resumeObserving() {\n        if (!this.mutationObserver) {\n            return;\n        }\n        for (const root of this.roots) {\n            this.mutationObserver.observe(root, this.observerConfig);\n        }\n    }\n    /**\n     * Translate mutations detected by the `MutationObserver`.\n     *\n     * @private\n     */\n    translateMutations(mutations) {\n        for (const mutation of mutations) {\n            switch (mutation.type) {\n                case \"attributes\":\n                    if (mutation.target.hasAttribute(\"data-l10n-id\")) {\n                        this.pendingElements.add(mutation.target);\n                    }\n                    break;\n                case \"childList\":\n                    for (const addedNode of mutation.addedNodes) {\n                        if (addedNode.nodeType === addedNode.ELEMENT_NODE) {\n                            if (addedNode.childElementCount) {\n                                for (const element of this.getTranslatables(addedNode)) {\n                                    this.pendingElements.add(element);\n                                }\n                            }\n                            else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) {\n                                this.pendingElements.add(addedNode);\n                            }\n                        }\n                    }\n                    break;\n            }\n        }\n        // This fragment allows us to coalesce all pending translations\n        // into a single requestAnimationFrame.\n        if (this.pendingElements.size > 0) {\n            if (this.pendingrAF === null) {\n                this.pendingrAF = this.windowElement.requestAnimationFrame(() => {\n                    this.translateElements(Array.from(this.pendingElements));\n                    this.pendingElements.clear();\n                    this.pendingrAF = null;\n                });\n            }\n        }\n    }\n    /**\n     * Translate a DOM element or fragment asynchronously using this\n     * `DOMLocalization` object.\n     *\n     * Manually trigger the translation (or re-translation) of a DOM fragment.\n     * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n     * with information about which translations to use.\n     *\n     * Returns a `Promise` that gets resolved once the translation is complete.\n     *\n     * @param   {Element | DocumentFragment} frag - Element or DocumentFragment to be translated\n     * @returns {Promise}\n     */\n    translateFragment(frag) {\n        return this.translateElements(this.getTranslatables(frag));\n    }\n    /**\n     * Translate a list of DOM elements asynchronously using this\n     * `DOMLocalization` object.\n     *\n     * Manually trigger the translation (or re-translation) of a list of elements.\n     * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n     * with information about which translations to use.\n     *\n     * Returns a `Promise` that gets resolved once the translation is complete.\n     *\n     * @param   {Array<Element>} elements - List of elements to be translated\n     * @returns {Promise}\n     */\n    async translateElements(elements) {\n        if (!elements.length) {\n            return undefined;\n        }\n        const keys = elements.map(this.getKeysForElement);\n        const translations = await this.formatMessages(keys);\n        return this.applyTranslations(elements, translations);\n    }\n    /**\n     * Applies translations onto elements.\n     *\n     * @param {Array<Element>} elements\n     * @param {Array<Object>}  translations\n     * @private\n     */\n    applyTranslations(elements, translations) {\n        this.pauseObserving();\n        for (let i = 0; i < elements.length; i++) {\n            if (translations[i] !== undefined) {\n                translateElement(elements[i], translations[i]);\n            }\n        }\n        this.resumeObserving();\n    }\n    /**\n     * Collects all translatable child elements of the element.\n     *\n     * @param {Element | DocumentFragment} element\n     * @returns {Array<Element>}\n     * @private\n     */\n    getTranslatables(element) {\n        const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY));\n        if (typeof element.hasAttribute === \"function\" &&\n            element.hasAttribute(L10NID_ATTR_NAME)) {\n            nodes.push(element);\n        }\n        return nodes;\n    }\n    /**\n     * Get the `data-l10n-*` attributes from DOM elements as a two-element\n     * array.\n     *\n     * @param {Element} element\n     * @returns {Object}\n     * @private\n     */\n    getKeysForElement(element) {\n        return {\n            id: element.getAttribute(L10NID_ATTR_NAME),\n            args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n        };\n    }\n}\n","export { default as DOMLocalization } from \"./dom_localization.js\";\nexport { default as Localization } from \"./localization.js\";\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * NOTE: The L10n-implementations should use lowercase language-codes\n *       internally.\n */\nclass L10n {\n  #dir;\n\n  #elements;\n\n  #lang;\n\n  #l10n;\n\n  constructor({ lang, isRTL }, l10n = null) {\n    this.#lang = L10n.#fixupLangCode(lang);\n    this.#l10n = l10n;\n    this.#dir = (isRTL ?? L10n.#isRTL(this.#lang)) ? \"rtl\" : \"ltr\";\n  }\n\n  _setL10n(l10n) {\n    this.#l10n = l10n;\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      document.l10n = l10n;\n    }\n  }\n\n  /** @inheritdoc */\n  getLanguage() {\n    return this.#lang;\n  }\n\n  /** @inheritdoc */\n  getDirection() {\n    return this.#dir;\n  }\n\n  /** @inheritdoc */\n  async get(ids, args = null, fallback) {\n    if (Array.isArray(ids)) {\n      ids = ids.map(id => ({ id }));\n      const messages = await this.#l10n.formatMessages(ids);\n      return messages.map(message => message.value);\n    }\n\n    const messages = await this.#l10n.formatMessages([\n      {\n        id: ids,\n        args,\n      },\n    ]);\n    return messages[0]?.value || fallback;\n  }\n\n  /** @inheritdoc */\n  async translate(element) {\n    (this.#elements ||= new Set()).add(element);\n    try {\n      this.#l10n.connectRoot(element);\n      await this.#l10n.translateRoots();\n    } catch {\n      // Element is under an existing root, so there is no need to add it again.\n    }\n  }\n\n  /** @inheritdoc */\n  async translateOnce(element) {\n    try {\n      await this.#l10n.translateElements([element]);\n    } catch (ex) {\n      console.error(\"translateOnce:\", ex);\n    }\n  }\n\n  /** @inheritdoc */\n  async destroy() {\n    if (this.#elements) {\n      for (const element of this.#elements) {\n        this.#l10n.disconnectRoot(element);\n      }\n      this.#elements.clear();\n      this.#elements = null;\n    }\n    this.#l10n.pauseObserving();\n  }\n\n  /** @inheritdoc */\n  pause() {\n    this.#l10n.pauseObserving();\n  }\n\n  /** @inheritdoc */\n  resume() {\n    this.#l10n.resumeObserving();\n  }\n\n  static #fixupLangCode(langCode) {\n    // Use only lowercase language-codes internally, and fallback to English.\n    langCode = langCode?.toLowerCase() || \"en-us\";\n\n    // Try to support \"incompletely\" specified language codes (see issue 13689).\n    const PARTIAL_LANG_CODES = {\n      en: \"en-us\",\n      es: \"es-es\",\n      fy: \"fy-nl\",\n      ga: \"ga-ie\",\n      gu: \"gu-in\",\n      hi: \"hi-in\",\n      hy: \"hy-am\",\n      nb: \"nb-no\",\n      ne: \"ne-np\",\n      nn: \"nn-no\",\n      pa: \"pa-in\",\n      pt: \"pt-pt\",\n      sv: \"sv-se\",\n      zh: \"zh-cn\",\n    };\n    return PARTIAL_LANG_CODES[langCode] || langCode;\n  }\n\n  static #isRTL(lang) {\n    const shortCode = lang.split(\"-\", 1)[0];\n    return [\"ar\", \"he\", \"fa\", \"ps\", \"ur\"].includes(shortCode);\n  }\n}\n\nconst GenericL10n = null;\n\nexport { GenericL10n, L10n };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, fetchData } from \"pdfjs-lib\";\nimport { FluentBundle, FluentResource } from \"fluent-bundle\";\nimport { DOMLocalization } from \"fluent-dom\";\nimport { L10n } from \"./l10n.js\";\n\nfunction PLATFORM() {\n  const { isAndroid, isLinux, isMac, isWindows } = FeatureTest.platform;\n  if (isLinux) {\n    return \"linux\";\n  }\n  if (isWindows) {\n    return \"windows\";\n  }\n  if (isMac) {\n    return \"macos\";\n  }\n  if (isAndroid) {\n    return \"android\";\n  }\n  return \"other\";\n}\n\nfunction createBundle(lang, text) {\n  const resource = new FluentResource(text);\n  const bundle = new FluentBundle(lang, {\n    functions: { PLATFORM },\n  });\n  const errors = bundle.addResource(resource);\n  if (errors.length) {\n    console.error(\"L10n errors\", errors);\n  }\n  return bundle;\n}\n\nclass GenericL10n extends L10n {\n  constructor(lang) {\n    super({ lang });\n\n    const generateBundles = !lang\n      ? GenericL10n.#generateBundlesFallback.bind(\n          GenericL10n,\n          this.getLanguage()\n        )\n      : GenericL10n.#generateBundles.bind(\n          GenericL10n,\n          \"en-us\",\n          this.getLanguage()\n        );\n    this._setL10n(new DOMLocalization([], generateBundles));\n  }\n\n  /**\n   * Generate the bundles for Fluent.\n   * @param {String} defaultLang - The fallback language to use for\n   *   translations.\n   * @param {String} baseLang - The base language to use for translations.\n   */\n  static async *#generateBundles(defaultLang, baseLang) {\n    const { baseURL, paths } = await this.#getPaths();\n\n    const langs = [baseLang];\n    if (defaultLang !== baseLang) {\n      // Also fallback to the short-format of the base language\n      // (see issue 17269).\n      const shortLang = baseLang.split(\"-\", 1)[0];\n\n      if (shortLang !== baseLang) {\n        langs.push(shortLang);\n      }\n      langs.push(defaultLang);\n    }\n    // Trigger fetching of bundles in parallel, to reduce overall load time.\n    const bundles = langs.map(lang => [\n      lang,\n      this.#createBundle(lang, baseURL, paths),\n    ]);\n\n    for (const [lang, bundlePromise] of bundles) {\n      const bundle = await bundlePromise;\n      if (bundle) {\n        yield bundle;\n      } else if (lang === \"en-us\") {\n        yield this.#createBundleFallback(lang);\n      }\n    }\n  }\n\n  static async #createBundle(lang, baseURL, paths) {\n    const path = paths[lang];\n    if (!path) {\n      return null;\n    }\n    const url = new URL(path, baseURL);\n    const text = await fetchData(url, /* type = */ \"text\");\n\n    return createBundle(lang, text);\n  }\n\n  static async #getPaths() {\n    try {\n      const { href } = document.querySelector(`link[type=\"application/l10n\"]`);\n      const paths = await fetchData(href, /* type = */ \"json\");\n\n      return {\n        baseURL: href.substring(0, href.lastIndexOf(\"/\") + 1) || \"./\",\n        paths,\n      };\n    } catch {}\n    return { baseURL: \"./\", paths: Object.create(null) };\n  }\n\n  static async *#generateBundlesFallback(lang) {\n    yield this.#createBundleFallback(lang);\n  }\n\n  static async #createBundleFallback(lang) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      throw new Error(\"Not implemented: #createBundleFallback\");\n    }\n    const text =\n      typeof PDFJSDev === \"undefined\"\n        ? await fetchData(\n            new URL(\"../l10n/en-US/viewer.ftl\", window.location.href),\n            /* type = */ \"text\"\n          )\n        : PDFJSDev.eval(\"DEFAULT_FTL\");\n\n    return createBundle(lang, text);\n  }\n}\n\nexport { GenericL10n };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getPdfFilenameFromUrl } from \"pdfjs-lib\";\n\nasync function docProperties(pdfDocument) {\n  const url = \"\",\n    baseUrl = \"\";\n  const { info, metadata, contentDispositionFilename, contentLength } =\n    await pdfDocument.getMetadata();\n\n  return {\n    ...info,\n    baseURL: baseUrl,\n    filesize: contentLength || (await pdfDocument.getDownloadInfo()).length,\n    filename: contentDispositionFilename || getPdfFilenameFromUrl(url),\n    metadata: metadata?.getRaw(),\n    authors: metadata?.get(\"dc:creator\"),\n    numPages: pdfDocument.numPages,\n    URL: url,\n  };\n}\n\nclass GenericScripting {\n  constructor(sandboxBundleSrc, wasmUrl) {\n    this._ready = new Promise((resolve, reject) => {\n      const sandbox =\n        typeof PDFJSDev === \"undefined\"\n          ? import(sandboxBundleSrc) // eslint-disable-line no-unsanitized/method\n          : __raw_import__(sandboxBundleSrc);\n      sandbox\n        .then(pdfjsSandbox => {\n          resolve(\n            pdfjsSandbox.QuickJSSandbox(new URL(wasmUrl, location.href).href)\n          );\n        })\n        .catch(reject);\n    });\n  }\n\n  async createSandbox(data) {\n    const sandbox = await this._ready;\n    sandbox.create(data);\n  }\n\n  async dispatchEventInSandbox(event) {\n    const sandbox = await this._ready;\n    setTimeout(() => sandbox.dispatchEvent(event), 0);\n  }\n\n  async destroySandbox() {\n    const sandbox = await this._ready;\n    sandbox.nukeSandbox();\n  }\n}\n\nexport { docProperties, GenericScripting };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getUuid } from \"pdfjs-lib\";\n\nconst KEY_STORAGE = \"pdfjs.signature\";\n\nclass SignatureStorage {\n  // TODO: Encrypt the data in using a password and add a UI for entering it.\n  // We could use the Web Crypto API for this (see https://bradyjoslin.com/blog/encryption-webcrypto/\n  // for an example).\n\n  #eventBus;\n\n  #signatures = null;\n\n  #signal = null;\n\n  constructor(eventBus, signal) {\n    this.#eventBus = eventBus;\n    this.#signal = signal;\n  }\n\n  #save() {\n    localStorage.setItem(\n      KEY_STORAGE,\n      JSON.stringify(Object.fromEntries(this.#signatures))\n    );\n  }\n\n  async getAll() {\n    if (this.#signal) {\n      window.addEventListener(\n        \"storage\",\n        ({ key }) => {\n          if (key === KEY_STORAGE) {\n            this.#signatures = null;\n            this.#eventBus?.dispatch(\"storedsignatureschanged\", {\n              source: this,\n            });\n          }\n        },\n        { signal: this.#signal }\n      );\n      this.#signal = null;\n    }\n    if (!this.#signatures) {\n      this.#signatures = new Map();\n      const data = localStorage.getItem(KEY_STORAGE);\n      if (data) {\n        for (const [key, value] of Object.entries(JSON.parse(data))) {\n          this.#signatures.set(key, value);\n        }\n      }\n    }\n    return this.#signatures;\n  }\n\n  async isFull() {\n    // Only allow 5 signatures to be saved.\n    return (await this.size()) === 5;\n  }\n\n  async size() {\n    return (await this.getAll()).size;\n  }\n\n  async create(data) {\n    if (await this.isFull()) {\n      return null;\n    }\n    const uuid = getUuid();\n    this.#signatures.set(uuid, data);\n    this.#save();\n\n    return uuid;\n  }\n\n  async delete(uuid) {\n    const signatures = await this.getAll();\n    if (!signatures.has(uuid)) {\n      return false;\n    }\n    signatures.delete(uuid);\n    this.#save();\n\n    return true;\n  }\n}\n\nexport { SignatureStorage };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AppOptions } from \"./app_options.js\";\nimport { BaseExternalServices } from \"./external_services.js\";\nimport { BasePreferences } from \"./preferences.js\";\nimport { GenericL10n } from \"./genericl10n.js\";\nimport { GenericScripting } from \"./generic_scripting.js\";\nimport { SignatureStorage } from \"./generic_signature_storage.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n  throw new Error(\n    'Module \"pdfjs-web/genericcom\" shall not be used outside GENERIC build.'\n  );\n}\n\nfunction initCom(app) {}\n\nclass Preferences extends BasePreferences {\n  async _writeToStorage(prefObj) {\n    localStorage.setItem(\"pdfjs.preferences\", JSON.stringify(prefObj));\n  }\n\n  async _readFromStorage(prefObj) {\n    return { prefs: JSON.parse(localStorage.getItem(\"pdfjs.preferences\")) };\n  }\n}\n\nclass ExternalServices extends BaseExternalServices {\n  constructor() {\n    super();\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      // For testing purposes.\n      Object.defineProperty(this, \"reportText\", {\n        value: data => {\n          window._reportTextData = data;\n        },\n      });\n    }\n  }\n\n  async createL10n() {\n    return new GenericL10n(AppOptions.get(\"localeProperties\")?.lang);\n  }\n\n  createScripting() {\n    return new GenericScripting(\n      AppOptions.get(\"sandboxBundleSrc\"),\n      AppOptions.get(\"wasmUrl\")\n    );\n  }\n\n  createSignatureStorage(eventBus, signal) {\n    return new SignatureStorage(eventBus, signal);\n  }\n}\n\nclass MLManager {\n  static {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      this.getFakeMLManager = options => new FakeMLManager(options);\n    }\n  }\n\n  async isEnabledFor(_name) {\n    return false;\n  }\n\n  async deleteModel(_service) {\n    return null;\n  }\n\n  isReady(_name) {\n    return false;\n  }\n\n  guess(_data) {}\n\n  toggleService(_name, _enabled) {}\n}\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n  // eslint-disable-next-line no-var\n  var FakeMLManager = class {\n    eventBus = null;\n\n    hasProgress = false;\n\n    constructor({ enableGuessAltText, enableAltTextModelDownload }) {\n      this.enableGuessAltText = enableGuessAltText;\n      this.enableAltTextModelDownload = enableAltTextModelDownload;\n    }\n\n    setEventBus(eventBus, abortSignal) {\n      this.eventBus = eventBus;\n    }\n\n    async isEnabledFor(_name) {\n      return this.enableGuessAltText;\n    }\n\n    async deleteModel(_name) {\n      this.enableAltTextModelDownload = false;\n      return null;\n    }\n\n    async loadModel(_name) {}\n\n    async downloadModel(_name) {\n      // Simulate downloading the model but with progress.\n      // The progress can be seen in the new alt-text dialog.\n      this.hasProgress = true;\n\n      const { promise, resolve } = Promise.withResolvers();\n      const total = 1e8;\n      const end = 1.5 * total;\n      const increment = 5e6;\n      let loaded = 0;\n      const id = setInterval(() => {\n        loaded += increment;\n        if (loaded <= end) {\n          this.eventBus.dispatch(\"loadaiengineprogress\", {\n            source: this,\n            detail: {\n              total,\n              totalLoaded: loaded,\n              finished: loaded + increment >= end,\n            },\n          });\n          return;\n        }\n        clearInterval(id);\n        this.hasProgress = false;\n        this.enableAltTextModelDownload = true;\n        resolve(true);\n      }, 900);\n      return promise;\n    }\n\n    isReady(_name) {\n      return this.enableAltTextModelDownload;\n    }\n\n    guess({ request: { data } }) {\n      return new Promise(resolve => {\n        setTimeout(() => {\n          resolve(data ? { output: \"Fake alt text.\" } : { error: true });\n        }, 3000);\n      });\n    }\n\n    toggleService(_name, enabled) {\n      this.enableGuessAltText = enabled;\n    }\n  };\n}\n\nexport { ExternalServices, initCom, MLManager, Preferences };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { internalOpt } from \"./internal_evt.js\";\nimport { noContextMenu } from \"pdfjs-lib\";\n\nclass NewAltTextManager {\n  #boundCancel = this.#cancel.bind(this);\n\n  #createAutomaticallyButton;\n\n  #currentEditor = null;\n\n  #cancelButton;\n\n  #descriptionContainer;\n\n  #dialog;\n\n  #disclaimer;\n\n  #downloadModel;\n\n  #downloadModelDescription;\n\n  #eventBus;\n\n  #firstTime = false;\n\n  #guessedAltText;\n\n  #hasAI = null;\n\n  #isEditing = null;\n\n  #imagePreview;\n\n  #imageData;\n\n  #isAILoading = false;\n\n  #wasAILoading = false;\n\n  #learnMore;\n\n  #notNowButton;\n\n  #overlayManager;\n\n  #textarea;\n\n  #title;\n\n  #uiManager;\n\n  #previousAltText = null;\n\n  constructor(\n    {\n      descriptionContainer,\n      dialog,\n      imagePreview,\n      cancelButton,\n      disclaimer,\n      notNowButton,\n      saveButton,\n      textarea,\n      learnMore,\n      errorCloseButton,\n      createAutomaticallyButton,\n      downloadModel,\n      downloadModelDescription,\n      title,\n    },\n    overlayManager,\n    eventBus\n  ) {\n    this.#cancelButton = cancelButton;\n    this.#createAutomaticallyButton = createAutomaticallyButton;\n    this.#descriptionContainer = descriptionContainer;\n    this.#dialog = dialog;\n    this.#disclaimer = disclaimer;\n    this.#notNowButton = notNowButton;\n    this.#imagePreview = imagePreview;\n    this.#textarea = textarea;\n    this.#learnMore = learnMore;\n    this.#title = title;\n    this.#downloadModel = downloadModel;\n    this.#downloadModelDescription = downloadModelDescription;\n    this.#overlayManager = overlayManager;\n    this.#eventBus = eventBus;\n\n    dialog.addEventListener(\"close\", this.#close.bind(this));\n    dialog.addEventListener(\"contextmenu\", event => {\n      if (event.target !== this.#textarea) {\n        event.preventDefault();\n      }\n    });\n    cancelButton.addEventListener(\"click\", this.#boundCancel);\n    notNowButton.addEventListener(\"click\", this.#boundCancel);\n    saveButton.addEventListener(\"click\", this.#save.bind(this));\n    errorCloseButton.addEventListener(\"click\", () => {\n      this.#toggleError(false);\n    });\n    createAutomaticallyButton.addEventListener(\"click\", async () => {\n      const checked =\n        createAutomaticallyButton.getAttribute(\"aria-pressed\") !== \"true\";\n      this.#currentEditor._reportTelemetry({\n        action: \"pdfjs.image.alt_text.ai_generation_check\",\n        data: { status: checked },\n      });\n\n      if (this.#uiManager) {\n        const isAltTextEnabled =\n          await this.#uiManager.mlManager.isEnabledFor(\"altText\");\n        this.#createAutomaticallyButton.disabled = true;\n        if (checked && !isAltTextEnabled) {\n          this.#textarea.value = \"\";\n          this.#setProgress();\n          this.#uiManager.setPreference(\"enableGuessAltText\", true);\n          await this.#uiManager.mlManager.downloadModel(\"altText\");\n          this.#setPref(\"enableAltTextModelDownload\", true);\n        } else if (!checked && isAltTextEnabled) {\n          this.#uiManager.setPreference(\"enableGuessAltText\", false);\n          await this.#uiManager.mlManager.deleteModel(\"altText\");\n          this.#setPref(\"enableAltTextModelDownload\", false);\n        }\n        this.#createAutomaticallyButton.disabled = false;\n        await this.#uiManager.mlManager.toggleService(\"altText\", checked);\n      }\n      this.#toggleGuessAltText(checked, /* isInitial = */ false);\n    });\n    textarea.addEventListener(\"focus\", () => {\n      this.#wasAILoading = this.#isAILoading;\n      this.#toggleLoading(false);\n      this.#toggleTitleAndDisclaimer();\n    });\n    textarea.addEventListener(\"blur\", () => {\n      if (!textarea.value) {\n        this.#toggleLoading(this.#wasAILoading);\n      }\n      this.#toggleTitleAndDisclaimer();\n    });\n    textarea.addEventListener(\"input\", () => {\n      this.#toggleTitleAndDisclaimer();\n    });\n    textarea.addEventListener(\"keydown\", e => {\n      if (\n        (e.ctrlKey || e.metaKey) &&\n        e.key === \"Enter\" &&\n        !saveButton.disabled\n      ) {\n        this.#save();\n      }\n    });\n\n    eventBus.on(\n      \"enableguessalttext\",\n      ({ value }) => {\n        this.#toggleGuessAltText(value, /* isInitial = */ false);\n      },\n      internalOpt\n    );\n\n    this.#overlayManager.register(dialog);\n\n    this.#learnMore.addEventListener(\"click\", () => {\n      this.#currentEditor._reportTelemetry({\n        action: \"pdfjs.image.alt_text.info\",\n        data: { topic: \"alt_text\" },\n      });\n    });\n  }\n\n  #setPref(name, value) {\n    this.#eventBus.dispatch(\"setpreference\", {\n      source: this,\n      name,\n      value,\n    });\n  }\n\n  #toggleLoading(value) {\n    if (!this.#uiManager || this.#isAILoading === value) {\n      return;\n    }\n    this.#isAILoading = value;\n    this.#descriptionContainer.classList.toggle(\"loading\", value);\n  }\n\n  #toggleError(value) {\n    if (!this.#uiManager) {\n      return;\n    }\n    this.#dialog.classList.toggle(\"error\", value);\n  }\n\n  async #toggleGuessAltText(value, isInitial) {\n    if (!this.#uiManager) {\n      return;\n    }\n    this.#dialog.classList.toggle(\"aiDisabled\", !value);\n    this.#createAutomaticallyButton.setAttribute(\"aria-pressed\", value);\n\n    if (value) {\n      const { altTextLearnMoreUrl } = this.#uiManager.mlManager;\n      if (altTextLearnMoreUrl) {\n        this.#learnMore.href = altTextLearnMoreUrl;\n      }\n      this.#mlGuessAltText(isInitial);\n    } else {\n      this.#toggleLoading(false);\n      this.#isAILoading = false;\n      this.#toggleTitleAndDisclaimer();\n    }\n  }\n\n  #toggleNotNow() {\n    this.#notNowButton.classList.toggle(\"hidden\", !this.#firstTime);\n    this.#cancelButton.classList.toggle(\"hidden\", this.#firstTime);\n  }\n\n  #toggleAI(value) {\n    if (!this.#uiManager || this.#hasAI === value) {\n      return;\n    }\n    this.#hasAI = value;\n    this.#dialog.classList.toggle(\"noAi\", !value);\n    this.#toggleTitleAndDisclaimer();\n  }\n\n  #toggleTitleAndDisclaimer() {\n    // Disclaimer is visible when the AI is loading or the user didn't change\n    // the guessed alt text.\n    const visible =\n      this.#isAILoading ||\n      (this.#guessedAltText && this.#guessedAltText === this.#textarea.value);\n    this.#disclaimer.hidden = !visible;\n\n    // The title changes depending if the text area is empty or not.\n    const isEditing = this.#isAILoading || !!this.#textarea.value;\n    if (this.#isEditing === isEditing) {\n      return;\n    }\n    this.#isEditing = isEditing;\n    this.#title.setAttribute(\n      \"data-l10n-id\",\n      isEditing\n        ? \"pdfjs-editor-new-alt-text-dialog-edit-label\"\n        : \"pdfjs-editor-new-alt-text-dialog-add-label\"\n    );\n  }\n\n  async #mlGuessAltText(isInitial) {\n    if (this.#isAILoading) {\n      // We're still loading the previous guess.\n      return;\n    }\n\n    if (this.#textarea.value) {\n      // The user has already set an alt text.\n      return;\n    }\n\n    if (isInitial && this.#previousAltText !== null) {\n      // The user has already set an alt text (empty or not).\n      return;\n    }\n\n    this.#guessedAltText = this.#currentEditor.guessedAltText;\n    if (this.#previousAltText === null && this.#guessedAltText) {\n      // We have a guessed alt text and the user didn't change it.\n      this.#addAltText(this.#guessedAltText);\n      return;\n    }\n\n    this.#toggleLoading(true);\n    this.#toggleTitleAndDisclaimer();\n\n    let hasError = false;\n    try {\n      // When calling #mlGuessAltText we don't wait for it, so we must take care\n      // that the alt text dialog can have been closed before the response is.\n\n      const altText = await this.#currentEditor.mlGuessAltText(\n        this.#imageData,\n        /* updateAltTextData = */ false\n      );\n      if (altText) {\n        this.#guessedAltText = altText;\n        this.#wasAILoading = this.#isAILoading;\n        if (this.#isAILoading) {\n          this.#addAltText(altText);\n        }\n      }\n    } catch (e) {\n      console.error(e);\n      hasError = true;\n    }\n\n    this.#toggleLoading(false);\n    this.#toggleTitleAndDisclaimer();\n\n    if (hasError && this.#uiManager) {\n      this.#toggleError(true);\n    }\n  }\n\n  #addAltText(altText) {\n    if (!this.#uiManager || this.#textarea.value) {\n      return;\n    }\n    this.#textarea.value = altText;\n    this.#toggleTitleAndDisclaimer();\n  }\n\n  #setProgress() {\n    // Show the download model progress.\n    this.#downloadModel.classList.toggle(\"hidden\", false);\n\n    const callback = async ({ detail: { finished, total, totalLoaded } }) => {\n      const ONE_MEGA_BYTES = 1e6;\n      // totalLoaded can be greater than total if the download is compressed.\n      // So we cheat to avoid any confusion.\n      totalLoaded = Math.min(0.99 * total, totalLoaded);\n\n      // Update the progress.\n      const totalSize = (this.#downloadModelDescription.ariaValueMax =\n        Math.round(total / ONE_MEGA_BYTES));\n      const downloadedSize = (this.#downloadModelDescription.ariaValueNow =\n        Math.round(totalLoaded / ONE_MEGA_BYTES));\n      this.#downloadModelDescription.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({ totalSize, downloadedSize })\n      );\n      if (!finished) {\n        return;\n      }\n\n      // We're done, remove the listener and hide the download model progress.\n      this.#eventBus.off(\"loadaiengineprogress\", callback);\n      this.#downloadModel.classList.toggle(\"hidden\", true);\n\n      this.#toggleAI(true);\n      if (!this.#uiManager) {\n        return;\n      }\n      const { mlManager } = this.#uiManager;\n\n      // The model has been downloaded, we can now enable the AI service.\n      mlManager.toggleService(\"altText\", true);\n      this.#toggleGuessAltText(\n        await mlManager.isEnabledFor(\"altText\"),\n        /* isInitial = */ true\n      );\n    };\n    this.#eventBus.on(\"loadaiengineprogress\", callback, internalOpt);\n  }\n\n  async editAltText(uiManager, editor, firstTime) {\n    if (this.#currentEditor || !editor) {\n      return;\n    }\n\n    if (firstTime && editor.hasAltTextData()) {\n      editor.altTextFinish();\n      return;\n    }\n\n    this.#firstTime = firstTime;\n    const { mlManager } = uiManager;\n    const hasAI = !!mlManager;\n    this.#toggleTitleAndDisclaimer();\n\n    if (mlManager && !mlManager.isReady(\"altText\")) {\n      if (mlManager.hasProgress) {\n        this.#setProgress();\n      } else {\n        this.#createAutomaticallyButton.setAttribute(\"aria-pressed\", false);\n      }\n    } else {\n      this.#downloadModel.classList.toggle(\"hidden\", true);\n    }\n\n    const isAltTextEnabledPromise = mlManager?.isEnabledFor(\"altText\");\n\n    this.#currentEditor = editor;\n    this.#uiManager = uiManager;\n    this.#uiManager.removeEditListeners();\n\n    ({ altText: this.#previousAltText } = editor.altTextData);\n    this.#textarea.value = this.#previousAltText ?? \"\";\n\n    // TODO: get this value from Firefox\n    //   (https://bugzilla.mozilla.org/show_bug.cgi?id=1908184)\n    const AI_MAX_IMAGE_DIMENSION = 224;\n    const MAX_PREVIEW_DIMENSION = 180;\n\n    // The max dimension of the preview in the dialog is 180px, so we keep 224px\n    // and rescale it thanks to css.\n\n    let canvas, width, height;\n    if (mlManager) {\n      ({\n        canvas,\n        width,\n        height,\n        imageData: this.#imageData,\n      } = editor.copyCanvas(\n        AI_MAX_IMAGE_DIMENSION,\n        MAX_PREVIEW_DIMENSION,\n        /* createImageData = */ true\n      ));\n      if (hasAI) {\n        this.#toggleGuessAltText(\n          await isAltTextEnabledPromise,\n          /* isInitial = */ true\n        );\n      }\n    } else {\n      ({ canvas, width, height } = editor.copyCanvas(\n        AI_MAX_IMAGE_DIMENSION,\n        MAX_PREVIEW_DIMENSION,\n        /* createImageData = */ false\n      ));\n    }\n\n    canvas.setAttribute(\"role\", \"presentation\");\n    const { style } = canvas;\n    style.width = `${width}px`;\n    style.height = `${height}px`;\n    this.#imagePreview.append(canvas);\n\n    this.#toggleNotNow();\n    this.#toggleAI(hasAI);\n    this.#toggleError(false);\n\n    try {\n      await this.#overlayManager.open(this.#dialog);\n    } catch (ex) {\n      this.#close();\n      throw ex;\n    }\n  }\n\n  #cancel() {\n    this.#currentEditor.altTextData = {\n      cancel: true,\n    };\n    const altText = this.#textarea.value.trim();\n    this.#currentEditor._reportTelemetry({\n      action: \"pdfjs.image.alt_text.dismiss\",\n      data: {\n        alt_text_type: altText ? \"present\" : \"empty\",\n        flow: this.#firstTime ? \"image_add\" : \"alt_text_edit\",\n      },\n    });\n    this.#currentEditor._reportTelemetry({\n      action: \"pdfjs.image.image_added\",\n      data: { alt_text_modal: true, alt_text_type: \"skipped\" },\n    });\n    this.#finish();\n  }\n\n  #finish() {\n    this.#overlayManager.closeIfActive(this.#dialog);\n  }\n\n  #close() {\n    const canvas = this.#imagePreview.firstElementChild;\n    canvas.remove();\n    canvas.width = canvas.height = 0;\n    this.#imageData = null;\n\n    this.#toggleLoading(false);\n\n    this.#uiManager?.addEditListeners();\n    this.#currentEditor.altTextFinish();\n    this.#uiManager?.setSelected(this.#currentEditor);\n    this.#currentEditor = null;\n    this.#uiManager = null;\n  }\n\n  #extractWords(text) {\n    return new Set(\n      text\n        .toLowerCase()\n        .split(/[^\\p{L}\\p{N}]+/gu)\n        .filter(x => !!x)\n    );\n  }\n\n  #save() {\n    const altText = this.#textarea.value.trim();\n    this.#currentEditor.altTextData = {\n      altText,\n      decorative: false,\n    };\n    this.#currentEditor.altTextData.guessedAltText = this.#guessedAltText;\n\n    if (this.#guessedAltText && this.#guessedAltText !== altText) {\n      const guessedWords = this.#extractWords(this.#guessedAltText);\n      const words = this.#extractWords(altText);\n      this.#currentEditor._reportTelemetry({\n        action: \"pdfjs.image.alt_text.user_edit\",\n        data: {\n          total_words: guessedWords.size,\n          words_removed: guessedWords.difference(words).size,\n          words_added: words.difference(guessedWords).size,\n        },\n      });\n    }\n    this.#currentEditor._reportTelemetry({\n      action: \"pdfjs.image.image_added\",\n      data: {\n        alt_text_modal: true,\n        alt_text_type: altText ? \"present\" : \"empty\",\n      },\n    });\n\n    this.#currentEditor._reportTelemetry({\n      action: \"pdfjs.image.alt_text.save\",\n      data: {\n        alt_text_type: altText ? \"present\" : \"empty\",\n        flow: this.#firstTime ? \"image_add\" : \"alt_text_edit\",\n      },\n    });\n\n    this.#finish();\n  }\n\n  destroy() {\n    this.#uiManager = null; // Avoid re-adding the edit listeners.\n    this.#finish();\n  }\n}\n\nclass ImageAltTextSettings {\n  #createModelButton;\n\n  #dialog;\n\n  #eventBus;\n\n  #mlManager;\n\n  #overlayManager;\n\n  #showAltTextDialogButton;\n\n  constructor(\n    {\n      dialog,\n      createModelButton,\n      learnMore,\n      closeButton,\n      showAltTextDialogButton,\n    },\n    overlayManager,\n    eventBus,\n    mlManager\n  ) {\n    this.#dialog = dialog;\n    this.#createModelButton = createModelButton;\n    this.#showAltTextDialogButton = showAltTextDialogButton;\n    this.#overlayManager = overlayManager;\n    this.#eventBus = eventBus;\n    this.#mlManager = mlManager;\n\n    const { altTextLearnMoreUrl } = mlManager;\n    if (altTextLearnMoreUrl) {\n      learnMore.href = altTextLearnMoreUrl;\n    }\n\n    dialog.addEventListener(\"contextmenu\", noContextMenu);\n\n    createModelButton.addEventListener(\"click\", async e => {\n      const checked = this.#togglePref(\"enableGuessAltText\", e);\n      await (checked ? this.#download(true) : this.#delete(true));\n      await mlManager.toggleService(\"altText\", checked);\n      this.#reportTelemetry({\n        type: \"stamp\",\n        action: \"pdfjs.image.alt_text.settings_ai_generation_check\",\n        data: { status: checked },\n      });\n    });\n\n    showAltTextDialogButton.addEventListener(\"click\", e => {\n      const checked = this.#togglePref(\"enableNewAltTextWhenAddingImage\", e);\n      this.#reportTelemetry({\n        type: \"stamp\",\n        action: \"pdfjs.image.alt_text.settings_edit_alt_text_check\",\n        data: { status: checked },\n      });\n    });\n\n    closeButton.addEventListener(\"click\", this.#finish.bind(this));\n\n    learnMore.addEventListener(\"click\", () => {\n      this.#reportTelemetry({\n        type: \"stamp\",\n        action: \"pdfjs.image.alt_text.info\",\n        data: { topic: \"ai_generation\" },\n      });\n    });\n\n    eventBus.on(\n      \"enablealttextmodeldownload\",\n      ({ value }) => {\n        if (value) {\n          this.#download(false);\n        } else {\n          this.#delete(false);\n        }\n      },\n      internalOpt\n    );\n\n    this.#overlayManager.register(dialog);\n  }\n\n  #reportTelemetry(data) {\n    this.#eventBus.dispatch(\"reporttelemetry\", {\n      source: this,\n      details: {\n        type: \"editing\",\n        data,\n      },\n    });\n  }\n\n  async #download(isFromUI = false) {\n    if (isFromUI) {\n      await this.#mlManager.downloadModel(\"altText\");\n\n      this.#setPref(\"enableGuessAltText\", true);\n      this.#mlManager.toggleService(\"altText\", true);\n      this.#setPref(\"enableAltTextModelDownload\", true);\n    }\n  }\n\n  async #delete(isFromUI = false) {\n    if (isFromUI) {\n      await this.#mlManager.deleteModel(\"altText\");\n      this.#setPref(\"enableGuessAltText\", false);\n      this.#setPref(\"enableAltTextModelDownload\", false);\n    }\n\n    this.#createModelButton.setAttribute(\"aria-pressed\", false);\n  }\n\n  async open({ enableGuessAltText, enableNewAltTextWhenAddingImage }) {\n    const { enableAltTextModelDownload } = this.#mlManager;\n    this.#createModelButton.setAttribute(\n      \"aria-pressed\",\n      enableAltTextModelDownload && enableGuessAltText\n    );\n    this.#showAltTextDialogButton.setAttribute(\n      \"aria-pressed\",\n      enableNewAltTextWhenAddingImage\n    );\n\n    await this.#overlayManager.open(this.#dialog);\n    this.#reportTelemetry({\n      type: \"stamp\",\n      action: \"pdfjs.image.alt_text.settings_displayed\",\n    });\n  }\n\n  #togglePref(name, { target }) {\n    const checked = target.getAttribute(\"aria-pressed\") !== \"true\";\n    this.#setPref(name, checked);\n    target.setAttribute(\"aria-pressed\", checked);\n    return checked;\n  }\n\n  #setPref(name, value) {\n    this.#eventBus.dispatch(\"setpreference\", {\n      source: this,\n      name,\n      value,\n    });\n  }\n\n  #finish() {\n    this.#overlayManager.closeIfActive(this.#dialog);\n  }\n}\n\nexport { ImageAltTextSettings, NewAltTextManager };\n","/* Copyright 2023 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DOMSVGFactory } from \"pdfjs-lib\";\nimport { internalOpt } from \"./internal_evt.js\";\n\nclass AltTextManager {\n  #clickAC = null;\n\n  #currentEditor = null;\n\n  #cancelButton;\n\n  #dialog;\n\n  #eventBus;\n\n  #hasUsedPointer = false;\n\n  #optionDescription;\n\n  #optionDecorative;\n\n  #overlayManager;\n\n  #saveButton;\n\n  #textarea;\n\n  #uiManager;\n\n  #previousAltText = null;\n\n  #resizeAC = null;\n\n  #svgElement = null;\n\n  #rectElement = null;\n\n  #container;\n\n  #telemetryData = null;\n\n  constructor(\n    {\n      dialog,\n      optionDescription,\n      optionDecorative,\n      textarea,\n      cancelButton,\n      saveButton,\n    },\n    container,\n    overlayManager,\n    eventBus\n  ) {\n    this.#dialog = dialog;\n    this.#optionDescription = optionDescription;\n    this.#optionDecorative = optionDecorative;\n    this.#textarea = textarea;\n    this.#cancelButton = cancelButton;\n    this.#saveButton = saveButton;\n    this.#overlayManager = overlayManager;\n    this.#eventBus = eventBus;\n    this.#container = container;\n\n    const onUpdateUIState = this.#updateUIState.bind(this);\n\n    dialog.addEventListener(\"close\", this.#close.bind(this));\n    dialog.addEventListener(\"contextmenu\", event => {\n      if (event.target !== this.#textarea) {\n        event.preventDefault();\n      }\n    });\n    cancelButton.addEventListener(\"click\", this.#finish.bind(this));\n    saveButton.addEventListener(\"click\", this.#save.bind(this));\n    optionDescription.addEventListener(\"change\", onUpdateUIState);\n    optionDecorative.addEventListener(\"change\", onUpdateUIState);\n    textarea.addEventListener(\"keydown\", e => {\n      if (\n        (e.ctrlKey || e.metaKey) &&\n        e.key === \"Enter\" &&\n        !saveButton.disabled\n      ) {\n        this.#save();\n      }\n    });\n\n    this.#overlayManager.register(dialog);\n  }\n\n  #createSVGElement() {\n    if (this.#svgElement) {\n      return;\n    }\n\n    // We create a mask to add to the dialog backdrop: the idea is to have a\n    // darken background everywhere except on the editor to clearly see the\n    // picture to describe.\n\n    const svgFactory = new DOMSVGFactory();\n    const svg = (this.#svgElement = svgFactory.createElement(\"svg\"));\n    svg.setAttribute(\"width\", \"0\");\n    svg.setAttribute(\"height\", \"0\");\n    const defs = svgFactory.createElement(\"defs\");\n    svg.append(defs);\n    const mask = svgFactory.createElement(\"mask\");\n    defs.append(mask);\n    mask.setAttribute(\"id\", \"alttext-manager-mask\");\n    mask.setAttribute(\"maskContentUnits\", \"objectBoundingBox\");\n    let rect = svgFactory.createElement(\"rect\");\n    mask.append(rect);\n    rect.setAttribute(\"fill\", \"white\");\n    rect.setAttribute(\"width\", \"1\");\n    rect.setAttribute(\"height\", \"1\");\n    rect.setAttribute(\"x\", \"0\");\n    rect.setAttribute(\"y\", \"0\");\n\n    rect = this.#rectElement = svgFactory.createElement(\"rect\");\n    mask.append(rect);\n    rect.setAttribute(\"fill\", \"black\");\n    this.#dialog.append(svg);\n  }\n\n  async editAltText(uiManager, editor) {\n    if (this.#currentEditor || !editor) {\n      return;\n    }\n    this.#createSVGElement();\n\n    this.#hasUsedPointer = false;\n\n    this.#clickAC = new AbortController();\n    const clickOpts = { signal: this.#clickAC.signal },\n      onClick = this.#onClick.bind(this);\n    for (const element of [\n      this.#optionDescription,\n      this.#optionDecorative,\n      this.#textarea,\n      this.#saveButton,\n      this.#cancelButton,\n    ]) {\n      element.addEventListener(\"click\", onClick, clickOpts);\n    }\n\n    const { altText, decorative } = editor.altTextData;\n    if (decorative === true) {\n      this.#optionDecorative.checked = true;\n      this.#optionDescription.checked = false;\n    } else {\n      this.#optionDecorative.checked = false;\n      this.#optionDescription.checked = true;\n    }\n    this.#previousAltText = this.#textarea.value = altText?.trim() || \"\";\n    this.#updateUIState();\n\n    this.#currentEditor = editor;\n    this.#uiManager = uiManager;\n    this.#uiManager.removeEditListeners();\n\n    this.#resizeAC = new AbortController();\n    this.#eventBus.on(\"resize\", this.#setPosition.bind(this), {\n      signal: this.#resizeAC.signal,\n      ...internalOpt,\n    });\n\n    try {\n      await this.#overlayManager.open(this.#dialog);\n      this.#setPosition();\n    } catch (ex) {\n      this.#close();\n      throw ex;\n    }\n  }\n\n  #setPosition() {\n    if (!this.#currentEditor) {\n      return;\n    }\n    const dialog = this.#dialog;\n    const { style } = dialog;\n    const {\n      x: containerX,\n      y: containerY,\n      width: containerW,\n      height: containerH,\n    } = this.#container.getBoundingClientRect();\n    const { innerWidth: windowW, innerHeight: windowH } = window;\n    const { width: dialogW, height: dialogH } = dialog.getBoundingClientRect();\n    const { x, y, width, height } = this.#currentEditor.getClientDimensions();\n    const MARGIN = 10;\n    const isLTR = this.#uiManager.direction === \"ltr\";\n\n    const xs = Math.max(x, containerX);\n    const xe = Math.min(x + width, containerX + containerW);\n    const ys = Math.max(y, containerY);\n    const ye = Math.min(y + height, containerY + containerH);\n    this.#rectElement.setAttribute(\"width\", `${(xe - xs) / windowW}`);\n    this.#rectElement.setAttribute(\"height\", `${(ye - ys) / windowH}`);\n    this.#rectElement.setAttribute(\"x\", `${xs / windowW}`);\n    this.#rectElement.setAttribute(\"y\", `${ys / windowH}`);\n\n    let left = null;\n    let top = Math.max(y, 0);\n    top += Math.min(windowH - (top + dialogH), 0);\n\n    if (isLTR) {\n      // Prefer to position the dialog \"after\" (so on the right) the editor.\n      if (x + width + MARGIN + dialogW < windowW) {\n        left = x + width + MARGIN;\n      } else if (x > dialogW + MARGIN) {\n        left = x - dialogW - MARGIN;\n      }\n    } else if (x > dialogW + MARGIN) {\n      left = x - dialogW - MARGIN;\n    } else if (x + width + MARGIN + dialogW < windowW) {\n      left = x + width + MARGIN;\n    }\n\n    if (left === null) {\n      top = null;\n      left = Math.max(x, 0);\n      left += Math.min(windowW - (left + dialogW), 0);\n      if (y > dialogH + MARGIN) {\n        top = y - dialogH - MARGIN;\n      } else if (y + height + MARGIN + dialogH < windowH) {\n        top = y + height + MARGIN;\n      }\n    }\n\n    if (top !== null) {\n      dialog.classList.add(\"positioned\");\n      if (isLTR) {\n        style.left = `${left}px`;\n      } else {\n        style.right = `${windowW - left - dialogW}px`;\n      }\n      style.top = `${top}px`;\n    } else {\n      dialog.classList.remove(\"positioned\");\n      style.left = \"\";\n      style.top = \"\";\n    }\n  }\n\n  #finish() {\n    this.#overlayManager.closeIfActive(this.#dialog);\n  }\n\n  #close() {\n    this.#currentEditor._reportTelemetry(\n      this.#telemetryData || {\n        action: \"alt_text_cancel\",\n        alt_text_keyboard: !this.#hasUsedPointer,\n      }\n    );\n    this.#telemetryData = null;\n\n    this.#removeOnClickListeners();\n    this.#uiManager?.addEditListeners();\n    this.#resizeAC?.abort();\n    this.#resizeAC = null;\n    this.#currentEditor.altTextFinish();\n    this.#currentEditor = null;\n    this.#uiManager = null;\n  }\n\n  #updateUIState() {\n    this.#textarea.disabled = this.#optionDecorative.checked;\n  }\n\n  #save() {\n    const altText = this.#textarea.value.trim();\n    const decorative = this.#optionDecorative.checked;\n    this.#currentEditor.altTextData = {\n      altText,\n      decorative,\n    };\n    this.#telemetryData = {\n      action: \"alt_text_save\",\n      alt_text_description: !!altText,\n      alt_text_edit:\n        !!this.#previousAltText && this.#previousAltText !== altText,\n      alt_text_decorative: decorative,\n      alt_text_keyboard: !this.#hasUsedPointer,\n    };\n    this.#finish();\n  }\n\n  #onClick(evt) {\n    if (evt.detail === 0) {\n      return; // The keyboard was used.\n    }\n    this.#hasUsedPointer = true;\n    this.#removeOnClickListeners();\n  }\n\n  #removeOnClickListeners() {\n    this.#clickAC?.abort();\n    this.#clickAC = null;\n  }\n\n  destroy() {\n    this.#uiManager = null; // Avoid re-adding the edit listeners.\n    this.#finish();\n    this.#svgElement?.remove();\n    this.#svgElement = this.#rectElement = null;\n  }\n}\n\nexport { AltTextManager };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n\nimport {\n  AnnotationEditorParamsType,\n  FeatureTest,\n  getRGBA,\n  Util,\n} from \"pdfjs-lib\";\nimport { internalOpt } from \"./internal_evt.js\";\n\n/**\n * @typedef {Object} AnnotationEditorParamsOptions\n * @property {HTMLInputElement} editorFreeTextFontSize\n * @property {HTMLInputElement} editorFreeTextColor\n * @property {HTMLInputElement} editorInkColor\n * @property {HTMLInputElement} editorInkThickness\n * @property {HTMLInputElement} editorInkOpacity\n * @property {HTMLButtonElement} editorStampAddImage\n * @property {HTMLInputElement} editorFreeHighlightThickness\n * @property {HTMLButtonElement} editorHighlightShowAll\n * @property {HTMLButtonElement} editorSignatureAddSignature\n */\n\nclass AnnotationEditorParams {\n  /**\n   * @param {AnnotationEditorParamsOptions} options\n   * @param {EventBus} eventBus\n   */\n  constructor(options, eventBus) {\n    this.eventBus = eventBus;\n    this.#bindListeners(options);\n  }\n\n  /**\n   * @param {AnnotationEditorParamsOptions} options\n   */\n  #bindListeners({\n    editorFreeTextFontSize,\n    editorFreeTextColor,\n    editorInkColor,\n    editorInkThickness,\n    editorInkOpacity,\n    editorStampAddImage,\n    editorFreeHighlightThickness,\n    editorHighlightShowAll,\n    editorSignatureAddSignature,\n  }) {\n    const { eventBus } = this;\n\n    const dispatchEvent = (typeStr, value) => {\n      eventBus.dispatch(\"switchannotationeditorparams\", {\n        source: this,\n        type: AnnotationEditorParamsType[typeStr],\n        value,\n      });\n    };\n    editorFreeTextFontSize.addEventListener(\"input\", function () {\n      dispatchEvent(\"FREETEXT_SIZE\", this.valueAsNumber);\n    });\n    editorFreeTextColor.addEventListener(\"input\", function () {\n      dispatchEvent(\"FREETEXT_COLOR\", this.value);\n    });\n\n    // Handlers for INK_COLOR and INK_OPACITY sync-back, set up differently\n    // depending on whether alpha is supported.\n    let updateInkColor, updateInkOpacity;\n\n    if (FeatureTest.isAlphaColorInputSupported) {\n      // Enable alpha on the color input and remove the now-redundant opacity\n      // slider from the DOM.\n      editorInkColor.setAttribute(\"alpha\", \"\");\n      editorInkOpacity.closest(\".editorParamsSetter\").remove();\n\n      // Track last-known color/opacity so that sync-back events for either\n      // property can reconstruct the full #RRGGBBAA without re-parsing the\n      // input's current (format-varying) value.\n      let currentInkColor = \"#000000\";\n      let currentInkOpacity = 1;\n\n      editorInkColor.addEventListener(\"input\", function () {\n        // The returned value format varies by browser; normalize it.\n        const rgba = getRGBA(this.value);\n        if (!rgba) {\n          return;\n        }\n        const [r, g, b, opacity] = rgba;\n        const hex = Util.makeHexColor(r, g, b);\n        currentInkColor = hex;\n        currentInkOpacity = opacity;\n        dispatchEvent(\"INK_COLOR_AND_OPACITY\", { color: hex, opacity });\n      });\n\n      updateInkColor = value => {\n        currentInkColor = value;\n        const alphaHex = Util.hexNums[Math.round(currentInkOpacity * 255)];\n        editorInkColor.value = currentInkColor + alphaHex;\n      };\n      updateInkOpacity = value => {\n        currentInkOpacity = value;\n        const alphaHex = Util.hexNums[Math.round(currentInkOpacity * 255)];\n        editorInkColor.value = currentInkColor + alphaHex;\n      };\n    } else {\n      editorInkColor.addEventListener(\"input\", function () {\n        dispatchEvent(\"INK_COLOR\", this.value);\n      });\n      editorInkOpacity.addEventListener(\"input\", function () {\n        dispatchEvent(\"INK_OPACITY\", this.valueAsNumber);\n      });\n\n      updateInkColor = value => {\n        editorInkColor.value = value;\n      };\n      updateInkOpacity = value => {\n        editorInkOpacity.value = value;\n      };\n    }\n\n    editorInkThickness.addEventListener(\"input\", function () {\n      dispatchEvent(\"INK_THICKNESS\", this.valueAsNumber);\n    });\n    editorStampAddImage.addEventListener(\"click\", () => {\n      eventBus.dispatch(\"reporttelemetry\", {\n        source: this,\n        details: {\n          type: \"editing\",\n          data: { action: \"pdfjs.image.add_image_click\" },\n        },\n      });\n      dispatchEvent(\"CREATE\");\n    });\n    editorFreeHighlightThickness.addEventListener(\"input\", function () {\n      dispatchEvent(\"HIGHLIGHT_THICKNESS\", this.valueAsNumber);\n    });\n    editorHighlightShowAll.addEventListener(\"click\", function () {\n      const checked = this.getAttribute(\"aria-pressed\") === \"true\";\n      this.setAttribute(\"aria-pressed\", !checked);\n      dispatchEvent(\"HIGHLIGHT_SHOW_ALL\", !checked);\n    });\n    editorSignatureAddSignature.addEventListener(\"click\", () => {\n      dispatchEvent(\"CREATE\");\n    });\n\n    eventBus.on(\n      \"annotationeditorparamschanged\",\n      evt => {\n        for (const [type, value] of evt.details) {\n          switch (type) {\n            case AnnotationEditorParamsType.FREETEXT_SIZE:\n              editorFreeTextFontSize.value = value;\n              break;\n            case AnnotationEditorParamsType.FREETEXT_COLOR:\n              editorFreeTextColor.value = value;\n              break;\n            case AnnotationEditorParamsType.INK_COLOR:\n              updateInkColor(value);\n              break;\n            case AnnotationEditorParamsType.INK_THICKNESS:\n              editorInkThickness.value = value;\n              break;\n            case AnnotationEditorParamsType.INK_OPACITY:\n              updateInkOpacity(value);\n              break;\n            case AnnotationEditorParamsType.HIGHLIGHT_COLOR:\n              eventBus.dispatch(\"mainhighlightcolorpickerupdatecolor\", {\n                source: this,\n                value,\n              });\n              break;\n            case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n              editorFreeHighlightThickness.value = value;\n              break;\n            case AnnotationEditorParamsType.HIGHLIGHT_FREE:\n              editorFreeHighlightThickness.disabled = !value;\n              break;\n            case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n              editorHighlightShowAll.setAttribute(\"aria-pressed\", value);\n              break;\n          }\n        }\n      },\n      internalOpt\n    );\n  }\n}\n\nexport { AnnotationEditorParams };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Used to compare floats: there is no exact equality due to rounding errors.\nconst PRECISION = 1e-1;\n\nclass CaretBrowsingMode {\n  #mainContainer;\n\n  #toolBarHeight = 0;\n\n  #viewerContainer;\n\n  constructor(abortSignal, mainContainer, viewerContainer, toolbarContainer) {\n    this.#mainContainer = mainContainer;\n    this.#viewerContainer = viewerContainer;\n\n    if (!toolbarContainer) {\n      return;\n    }\n    this.#toolBarHeight = toolbarContainer.getBoundingClientRect().height;\n\n    const toolbarObserver = new ResizeObserver(entries => {\n      for (const entry of entries) {\n        if (entry.target === toolbarContainer) {\n          this.#toolBarHeight = Math.floor(entry.borderBoxSize[0].blockSize);\n          break;\n        }\n      }\n    });\n    toolbarObserver.observe(toolbarContainer);\n\n    abortSignal.addEventListener(\"abort\", () => toolbarObserver.disconnect(), {\n      once: true,\n    });\n  }\n\n  /**\n   * Return true if the two rectangles are on the same line.\n   * @param {DOMRect} rect1\n   * @param {DOMRect} rect2\n   * @returns {boolean}\n   */\n  #isOnSameLine(rect1, rect2) {\n    const top1 = rect1.y;\n    const bot1 = rect1.bottom;\n    const mid1 = rect1.y + rect1.height / 2;\n\n    const top2 = rect2.y;\n    const bot2 = rect2.bottom;\n    const mid2 = rect2.y + rect2.height / 2;\n\n    return (top1 <= mid2 && mid2 <= bot1) || (top2 <= mid1 && mid1 <= bot2);\n  }\n\n  /**\n   * Return `true` if the rectangle is:\n   *  - under the caret when `isUp === false`.\n   *  - over the caret when `isUp === true`.\n   * @param {DOMRect} rect\n   * @param {number} x\n   * @param {number} y\n   * @param {boolean} isUp\n   * @returns {boolean}\n   */\n  #isUnderOver(rect, x, y, isUp) {\n    const midY = rect.y + rect.height / 2;\n    return (\n      (isUp ? y >= midY : y <= midY) &&\n      rect.x - PRECISION <= x &&\n      x <= rect.right + PRECISION\n    );\n  }\n\n  /**\n   * Check if the rectangle is visible.\n   * @param {DOMRect} rect\n   * @returns {boolean}\n   */\n  #isVisible(rect) {\n    return (\n      rect.top >= this.#toolBarHeight &&\n      rect.left >= 0 &&\n      rect.bottom <=\n        (window.innerHeight || document.documentElement.clientHeight) &&\n      rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n    );\n  }\n\n  /**\n   * Get the position of the caret.\n   * @param {Selection} selection\n   * @param {boolean} isUp\n   * @returns {Array<number>}\n   */\n  #getCaretPosition(selection, isUp) {\n    const { focusNode, focusOffset } = selection;\n    const range = document.createRange();\n    range.setStart(focusNode, focusOffset);\n    range.setEnd(focusNode, focusOffset);\n    const rect = range.getBoundingClientRect();\n\n    return [rect.x, isUp ? rect.top : rect.bottom];\n  }\n\n  static #caretPositionFromPoint(x, y) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n      !document.caretPositionFromPoint\n    ) {\n      const { startContainer: offsetNode, startOffset: offset } =\n        document.caretRangeFromPoint(x, y);\n      return { offsetNode, offset };\n    }\n    return document.caretPositionFromPoint(x, y);\n  }\n\n  #setCaretPositionHelper(selection, caretX, select, element, rect) {\n    rect ||= element.getBoundingClientRect();\n    if (caretX <= rect.x + PRECISION) {\n      if (select) {\n        selection.extend(element.firstChild, 0);\n      } else {\n        selection.setPosition(element.firstChild, 0);\n      }\n      return;\n    }\n    if (rect.right - PRECISION <= caretX) {\n      const { lastChild } = element;\n      if (select) {\n        selection.extend(lastChild, lastChild.length);\n      } else {\n        selection.setPosition(lastChild, lastChild.length);\n      }\n      return;\n    }\n\n    const midY = rect.y + rect.height / 2;\n    let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);\n    let parentElement = caretPosition.offsetNode?.parentElement;\n    if (parentElement && parentElement !== element) {\n      // There is an element on top of the one in the text layer, so we\n      // need to hide all the elements (except the one in the text layer)\n      // at this position in order to get the correct caret position.\n      const elementsAtPoint = document.elementsFromPoint(caretX, midY);\n      const savedVisibilities = [];\n      for (const el of elementsAtPoint) {\n        if (el === element) {\n          break;\n        }\n        const { style } = el;\n        savedVisibilities.push([el, style.visibility]);\n        style.visibility = \"hidden\";\n      }\n      caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);\n      parentElement = caretPosition.offsetNode?.parentElement;\n      for (const [el, visibility] of savedVisibilities) {\n        el.style.visibility = visibility;\n      }\n    }\n    if (parentElement !== element) {\n      // The element targeted by caretPositionFromPoint isn't in the text\n      // layer.\n      if (select) {\n        selection.extend(element.firstChild, 0);\n      } else {\n        selection.setPosition(element.firstChild, 0);\n      }\n      return;\n    }\n    if (select) {\n      selection.extend(caretPosition.offsetNode, caretPosition.offset);\n    } else {\n      selection.setPosition(caretPosition.offsetNode, caretPosition.offset);\n    }\n  }\n\n  /**\n   * Set the caret position or extend the selection (it depends on the select\n   * parameter).\n   * @param {boolean} select\n   * @param {Selection} selection\n   * @param {Element} newLineElement\n   * @param {DOMRect} newLineElementRect\n   * @param {number} caretX\n   */\n  #setCaretPosition(\n    select,\n    selection,\n    newLineElement,\n    newLineElementRect,\n    caretX\n  ) {\n    if (this.#isVisible(newLineElementRect)) {\n      this.#setCaretPositionHelper(\n        selection,\n        caretX,\n        select,\n        newLineElement,\n        newLineElementRect\n      );\n      return;\n    }\n    this.#mainContainer.addEventListener(\n      \"scrollend\",\n      this.#setCaretPositionHelper.bind(\n        this,\n        selection,\n        caretX,\n        select,\n        newLineElement,\n        null\n      ),\n      { once: true }\n    );\n    newLineElement.scrollIntoView();\n  }\n\n  /**\n   * Get the node on the next page.\n   * @param {Element} textLayer\n   * @param {boolean} isUp\n   * @returns {Node}\n   */\n  #getNodeOnNextPage(textLayer, isUp) {\n    while (true) {\n      const page = textLayer.closest(\".page\");\n      const pageNumber = parseInt(page.getAttribute(\"data-page-number\"), 10);\n      const nextPage = isUp ? pageNumber - 1 : pageNumber + 1;\n      textLayer = this.#viewerContainer.querySelector(\n        `.page[data-page-number=\"${nextPage}\"] .textLayer`\n      );\n      if (!textLayer) {\n        return null;\n      }\n      const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT);\n      const node = isUp ? walker.lastChild() : walker.firstChild();\n      if (node) {\n        return node;\n      }\n    }\n  }\n\n  /**\n   * Move the caret in the given direction.\n   * @param {boolean} isUp\n   * @param {boolean} select\n   */\n  moveCaret(isUp, select) {\n    const selection = document.getSelection();\n    if (selection.rangeCount === 0) {\n      return;\n    }\n    const { focusNode } = selection;\n    const focusElement =\n      focusNode.nodeType !== Node.ELEMENT_NODE\n        ? focusNode.parentElement\n        : focusNode;\n    const root = focusElement.closest(\".textLayer\");\n    if (!root) {\n      return;\n    }\n    const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n    walker.currentNode = focusNode;\n\n    // Move to the next element which is not on the same line as the focus\n    // element.\n    const focusRect = focusElement.getBoundingClientRect();\n    let newLineElement = null;\n    const nodeIterator = (\n      isUp ? walker.previousSibling : walker.nextSibling\n    ).bind(walker);\n    while (nodeIterator()) {\n      const element = walker.currentNode.parentElement;\n      if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) {\n        newLineElement = element;\n        break;\n      }\n    }\n\n    if (!newLineElement) {\n      // Need to find the next line on the next page.\n      const node = this.#getNodeOnNextPage(root, isUp);\n      if (!node) {\n        return;\n      }\n      if (select) {\n        const lastNode =\n          (isUp ? walker.firstChild() : walker.lastChild()) || focusNode;\n        selection.extend(lastNode, isUp ? 0 : lastNode.length);\n        const range = document.createRange();\n        range.setStart(node, isUp ? node.length : 0);\n        range.setEnd(node, isUp ? node.length : 0);\n        selection.addRange(range);\n        return;\n      }\n      const [caretX] = this.#getCaretPosition(selection, isUp);\n      const { parentElement } = node;\n      this.#setCaretPosition(\n        select,\n        selection,\n        parentElement,\n        parentElement.getBoundingClientRect(),\n        caretX\n      );\n      return;\n    }\n\n    // We've a candidate for the next line now we want to find the first element\n    // which is under/over the caret.\n    const [caretX, caretY] = this.#getCaretPosition(selection, isUp);\n    const newLineElementRect = newLineElement.getBoundingClientRect();\n\n    // Maybe the element on the new line is a valid candidate.\n    if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) {\n      this.#setCaretPosition(\n        select,\n        selection,\n        newLineElement,\n        newLineElementRect,\n        caretX\n      );\n      return;\n    }\n\n    while (nodeIterator()) {\n      // Search an element on the same line as newLineElement\n      // which could be under/over the caret.\n      const element = walker.currentNode.parentElement;\n      const elementRect = element.getBoundingClientRect();\n      if (!this.#isOnSameLine(newLineElementRect, elementRect)) {\n        break;\n      }\n      if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) {\n        // We found the element.\n        this.#setCaretPosition(select, selection, element, elementRect, caretX);\n        return;\n      }\n    }\n\n    // No element has been found so just put the caret on the element on the new\n    // line.\n    this.#setCaretPosition(\n      select,\n      selection,\n      newLineElement,\n      newLineElementRect,\n      caretX\n    );\n  }\n}\n\nexport { CaretBrowsingMode };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu, stopEvent } from \"pdfjs-lib\";\n\n// Timeout before ending resize operation.\nconst RESIZE_TIMEOUT = 400; // ms\n\n/**\n * Viewer control to display a sidebar with resizer functionality.\n */\nclass Sidebar {\n  #initialWidth = 0;\n\n  #width = 0;\n\n  #coefficient;\n\n  #resizeTimeout = null;\n\n  #resizer;\n\n  #isResizerOnTheLeft;\n\n  #isKeyboardResizing = false;\n\n  #resizeObserver;\n\n  #prevX = 0;\n\n  /**\n   * @typedef {Object} SidebarElements\n   * @property {HTMLElement} sidebar - The sidebar element.\n   * @property {HTMLElement} resizer - The sidebar resizer element.\n   * @property {HTMLElement} toggleButton - The button used to toggle the\n   *   sidebar.\n   */\n\n  /**\n   * Create a sidebar with resizer functionality.\n   * @param {SidebarElements} sidebarElements\n   * @param {boolean} ltr\n   * @param {boolean} isResizerOnTheLeft\n   */\n  constructor(\n    { sidebar, resizer, toggleButton },\n    ltr,\n    isResizerOnTheLeft,\n    globalAbortSignal\n  ) {\n    this._sidebar = sidebar;\n    this.#coefficient = ltr === isResizerOnTheLeft ? -1 : 1;\n    this.#resizer = resizer;\n    this.#isResizerOnTheLeft = isResizerOnTheLeft;\n\n    const style = window.getComputedStyle(sidebar);\n    this.#initialWidth = this.#width = parseFloat(\n      style.getPropertyValue(\"--sidebar-width\")\n    );\n    resizer.ariaValueMin =\n      parseFloat(style.getPropertyValue(\"--sidebar-min-width\")) || 0;\n    resizer.ariaValueMax =\n      parseFloat(style.getPropertyValue(\"--sidebar-max-width\")) || Infinity;\n    resizer.ariaValueNow = this.#width;\n\n    this.#makeSidebarResizable();\n    toggleButton.addEventListener(\"click\", this.toggle.bind(this));\n    this._isOpen = false;\n    sidebar.hidden = true;\n    globalAbortSignal?.addEventListener(\"abort\", this.destroy.bind(this), {\n      once: true,\n    });\n\n    this.#resizeObserver = new ResizeObserver(\n      ([\n        {\n          borderBoxSize: [{ inlineSize }],\n        },\n      ]) => {\n        if (!isNaN(this.#prevX)) {\n          this.#prevX += this.#coefficient * (inlineSize - this.#width);\n        }\n        this.#setWidth(inlineSize);\n      }\n    );\n    this.#resizeObserver.observe(sidebar);\n  }\n\n  #makeSidebarResizable() {\n    const sidebarStyle = this._sidebar.style;\n    let pointerMoveAC;\n    const cancelResize = () => {\n      this.#resizeTimeout = null;\n      this._sidebar.classList.remove(\"resizing\");\n      pointerMoveAC?.abort();\n      pointerMoveAC = null;\n      this.#isKeyboardResizing = false;\n      this.onStopResizing();\n      this.#prevX = NaN;\n    };\n    this.#resizer.addEventListener(\"pointerdown\", e => {\n      if (pointerMoveAC) {\n        cancelResize();\n        return;\n      }\n      this.onStartResizing();\n      const { clientX } = e;\n      stopEvent(e);\n      this.#prevX = clientX;\n      pointerMoveAC = new AbortController();\n      const { signal } = pointerMoveAC;\n      const sidebar = this._sidebar;\n      sidebar.classList.add(\"resizing\");\n      const parentStyle = sidebar.parentElement.style;\n      parentStyle.minWidth = 0;\n      window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n      window.addEventListener(\n        \"pointermove\",\n        ev => {\n          if (!pointerMoveAC || Math.abs(ev.clientX - this.#prevX) < 1) {\n            return;\n          }\n          stopEvent(ev);\n          sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - this.#prevX))}px`;\n        },\n        { signal, capture: true }\n      );\n      window.addEventListener(\"blur\", cancelResize, { signal });\n      window.addEventListener(\n        \"pointerup\",\n        ev => {\n          if (pointerMoveAC) {\n            cancelResize();\n            stopEvent(ev);\n          }\n        },\n        { signal }\n      );\n    });\n    this.#resizer.addEventListener(\"keydown\", e => {\n      const { key } = e;\n      const isArrowLeft = key === \"ArrowLeft\";\n      if (isArrowLeft || key === \"ArrowRight\") {\n        if (!this.#isKeyboardResizing) {\n          this._sidebar.classList.add(\"resizing\");\n          this.#isKeyboardResizing = true;\n          this.onStartResizing();\n        }\n\n        const base = e.ctrlKey || e.metaKey ? 10 : 1;\n        const dx = base * (isArrowLeft ? -1 : 1);\n        clearTimeout(this.#resizeTimeout);\n        this.#resizeTimeout = setTimeout(cancelResize, RESIZE_TIMEOUT);\n        sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * dx)}px`;\n        stopEvent(e);\n      }\n    });\n  }\n\n  #setWidth(newWidth) {\n    this.#width = newWidth;\n    this.#resizer.ariaValueNow = Math.round(newWidth);\n    if (this.#isResizerOnTheLeft) {\n      this._sidebar.parentElement.style.insetInlineStart = `${(this.#initialWidth - newWidth).toFixed(3)}px`;\n    }\n    this.onResizing(newWidth);\n  }\n\n  /**\n   * Get the current width of the sidebar in pixels.\n   * @returns {number}\n   */\n  get width() {\n    return this.#width;\n  }\n\n  /**\n   * Set the width of the sidebar in pixels.\n   * @param {number} newWidth\n   */\n  set width(newWidth) {\n    this._sidebar.style.width = `${newWidth}px`;\n  }\n\n  /**\n   * Callback to be executed when the user starts resizing the sidebar.\n   */\n  onStartResizing() {}\n\n  /**\n   * Callback to be executed when the user stops resizing the sidebar.\n   */\n  onStopResizing() {}\n\n  /**\n   * Callback to be executed when the sidebar is being resized.\n   * @param {number} newWidth - The new width of the sidebar in pixels.\n   */\n  onResizing(_newWidth) {}\n\n  /**\n   * Toggle the sidebar's visibility.\n   * @param {boolean} [visibility] - The visibility state to set.\n   */\n  toggle(visibility = !this._isOpen) {\n    this._sidebar.hidden = !(this._isOpen = visibility);\n  }\n\n  destroy() {\n    this.#resizeObserver?.disconnect();\n    this.#resizeObserver = null;\n  }\n}\n\nexport { Sidebar };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorType,\n  applyOpacity,\n  CSSConstants,\n  findContrastColor,\n  MathClamp,\n  noContextMenu,\n  PDFDateString,\n  renderRichText,\n  shadow,\n  stopEvent,\n  Util,\n} from \"pdfjs-lib\";\nimport { binarySearchFirstItem } from \"./ui_utils.js\";\nimport { Sidebar } from \"./sidebar.js\";\n\nclass CommentManager {\n  #dialog;\n\n  #popup;\n\n  #sidebar;\n\n  static #hasForcedColors = null;\n\n  constructor(\n    commentDialog,\n    sidebar,\n    eventBus,\n    linkService,\n    overlayManager,\n    ltr,\n    hasForcedColors,\n    globalAbortSignal\n  ) {\n    const dateFormat = new Intl.DateTimeFormat(undefined, {\n      dateStyle: \"long\",\n    });\n    this.dialogElement = commentDialog.dialog;\n    this.#dialog = new CommentDialog(\n      commentDialog,\n      overlayManager,\n      eventBus,\n      ltr\n    );\n    this.#popup = new CommentPopup(\n      eventBus,\n      dateFormat,\n      ltr,\n      this.dialogElement\n    );\n    this.#sidebar = new CommentSidebar(\n      sidebar,\n      eventBus,\n      linkService,\n      this.#popup,\n      dateFormat,\n      ltr,\n      globalAbortSignal\n    );\n    this.#popup.sidebar = this.#sidebar;\n    CommentManager.#hasForcedColors = hasForcedColors;\n  }\n\n  setSidebarUiManager(uiManager) {\n    this.#sidebar.setUIManager(uiManager);\n  }\n\n  showSidebar(annotations) {\n    this.#sidebar.show(annotations);\n  }\n\n  hideSidebar() {\n    this.#sidebar.hide();\n  }\n\n  removeComments(ids) {\n    this.#sidebar.removeComments(ids);\n  }\n\n  selectComment(id) {\n    this.#sidebar.selectComment(null, id);\n  }\n\n  addComment(annotation) {\n    this.#sidebar.addComment(annotation);\n  }\n\n  updateComment(annotation) {\n    this.#sidebar.updateComment(annotation);\n  }\n\n  toggleCommentPopup(editor, isSelected, visibility, isEditable) {\n    if (isSelected) {\n      this.selectComment(editor.uid);\n    }\n    this.#popup.toggle(editor, isSelected, visibility, isEditable);\n  }\n\n  destroyPopup() {\n    this.#popup.destroy();\n  }\n\n  updatePopupColor(editor) {\n    this.#popup.updateColor(editor);\n  }\n\n  showDialog(uiManager, editor, posX, posY, options) {\n    return this.#dialog.open(uiManager, editor, posX, posY, options);\n  }\n\n  makeCommentColor(color, opacity) {\n    return CommentManager._makeCommentColor(color, opacity);\n  }\n\n  static _makeCommentColor(color, opacity) {\n    return this.#hasForcedColors\n      ? null\n      : findContrastColor(\n          applyOpacity(color, opacity ?? 1),\n          CSSConstants.commentForegroundColor\n        );\n  }\n\n  destroy() {\n    this.#dialog.destroy();\n    this.#sidebar.hide();\n    this.#popup.destroy();\n  }\n}\n\nclass CommentSidebar extends Sidebar {\n  #annotations = null;\n\n  #eventBus;\n\n  #boundCommentClick = this.#commentClick.bind(this);\n\n  #boundCommentKeydown = this.#commentKeydown.bind(this);\n\n  #closeButton;\n\n  #commentsList;\n\n  #commentCount;\n\n  #dateFormat;\n\n  #sidebarTitle;\n\n  #learnMoreUrl;\n\n  #linkService;\n\n  #popup;\n\n  #elementsToAnnotations = null;\n\n  #idsToElements = null;\n\n  #uiManager = null;\n\n  constructor(\n    {\n      learnMoreUrl,\n      sidebar,\n      sidebarResizer,\n      commentsList,\n      commentCount,\n      sidebarTitle,\n      closeButton,\n      commentToolbarButton,\n    },\n    eventBus,\n    linkService,\n    popup,\n    dateFormat,\n    ltr,\n    globalAbortSignal\n  ) {\n    super(\n      { sidebar, resizer: sidebarResizer, toggleButton: commentToolbarButton },\n      ltr,\n      /* isResizerOnTheLeft = */ true,\n      globalAbortSignal\n    );\n    this.#sidebarTitle = sidebarTitle;\n    this.#commentsList = commentsList;\n    this.#commentCount = commentCount;\n    this.#learnMoreUrl = learnMoreUrl;\n    this.#linkService = linkService;\n    this.#closeButton = closeButton;\n    this.#popup = popup;\n    this.#dateFormat = dateFormat;\n    this.#eventBus = eventBus;\n\n    closeButton.addEventListener(\"click\", () => {\n      eventBus.dispatch(\"switchannotationeditormode\", {\n        source: this,\n        mode: AnnotationEditorType.NONE,\n      });\n    });\n    const keyDownCallback = e => {\n      if (e.key === \"ArrowDown\" || e.key === \"Home\" || e.key === \"F6\") {\n        this.#commentsList.firstElementChild.focus();\n        stopEvent(e);\n      } else if (e.key === \"ArrowUp\" || e.key === \"End\") {\n        this.#commentsList.lastElementChild.focus();\n        stopEvent(e);\n      }\n    };\n    commentToolbarButton.addEventListener(\"keydown\", keyDownCallback);\n    sidebar.addEventListener(\"keydown\", keyDownCallback);\n  }\n\n  setUIManager(uiManager) {\n    this.#uiManager = uiManager;\n  }\n\n  show(annotations) {\n    this.#elementsToAnnotations = new WeakMap();\n    this.#idsToElements = new Map();\n    this.#annotations = annotations;\n    annotations.sort(this.#sortComments.bind(this));\n    if (annotations.length !== 0) {\n      const fragment = document.createDocumentFragment();\n      for (const annotation of annotations) {\n        fragment.append(this.#createCommentElement(annotation));\n      }\n\n      this.#setCommentsCount(fragment);\n      this.#commentsList.append(fragment);\n    } else {\n      this.#setCommentsCount();\n    }\n    this._sidebar.hidden = false;\n    this.#eventBus.dispatch(\"reporttelemetry\", {\n      source: this,\n      details: {\n        type: \"commentSidebar\",\n        data: { numberOfAnnotations: annotations.length },\n      },\n    });\n  }\n\n  hide() {\n    this._sidebar.hidden = true;\n    this.#commentsList.replaceChildren();\n    this.#elementsToAnnotations = null;\n    this.#idsToElements = null;\n    this.#annotations = null;\n  }\n\n  removeComments(ids) {\n    if (ids.length === 0 || !this.#idsToElements) {\n      return;\n    }\n    if (\n      new Set(this.#idsToElements.keys()).difference(new Set(ids)).size === 0\n    ) {\n      this.#removeAll();\n      return;\n    }\n    for (const id of ids) {\n      this.#removeComment(id);\n    }\n  }\n\n  focusComment(id) {\n    const element = this.#idsToElements.get(id);\n    if (!element) {\n      return;\n    }\n    this._sidebar.scrollTop = element.offsetTop - this._sidebar.offsetTop;\n    for (const el of this.#commentsList.children) {\n      el.classList.toggle(\"selected\", el === element);\n    }\n  }\n\n  updateComment(annotation) {\n    if (!this.#idsToElements) {\n      return;\n    }\n    const {\n      id,\n      creationDate,\n      modificationDate,\n      richText,\n      contentsObj,\n      popupRef,\n    } = annotation;\n\n    if (!popupRef || (!richText && !contentsObj?.str)) {\n      this.#removeComment(id);\n    }\n\n    const element = this.#idsToElements.get(id);\n    if (!element) {\n      return;\n    }\n    const prevAnnotation = this.#elementsToAnnotations.get(element);\n    let index = binarySearchFirstItem(\n      this.#annotations,\n      a => this.#sortComments(a, prevAnnotation) >= 0\n    );\n    if (index >= this.#annotations.length) {\n      return;\n    }\n\n    this.#setDate(element.firstElementChild, modificationDate || creationDate);\n    this.#setText(element.lastElementChild, richText, contentsObj);\n\n    this.#annotations.splice(index, 1);\n    index = binarySearchFirstItem(\n      this.#annotations,\n      a => this.#sortComments(a, annotation) >= 0\n    );\n    this.#annotations.splice(index, 0, annotation);\n    if (index >= this.#commentsList.children.length) {\n      this.#commentsList.append(element);\n    } else {\n      this.#commentsList.insertBefore(\n        element,\n        this.#commentsList.children[index]\n      );\n    }\n  }\n\n  #removeComment(id) {\n    const element = this.#idsToElements?.get(id);\n    if (!element) {\n      return;\n    }\n    const annotation = this.#elementsToAnnotations.get(element);\n    const index = binarySearchFirstItem(\n      this.#annotations,\n      a => this.#sortComments(a, annotation) >= 0\n    );\n    if (index >= this.#annotations.length) {\n      return;\n    }\n    this.#annotations.splice(index, 1);\n    element.remove();\n    this.#idsToElements.delete(id);\n    this.#setCommentsCount();\n  }\n\n  #removeAll() {\n    this.#commentsList.replaceChildren();\n    this.#elementsToAnnotations = new WeakMap();\n    this.#idsToElements.clear();\n    this.#annotations.length = 0;\n    this.#setCommentsCount();\n  }\n\n  selectComment(element, id = null) {\n    if (!this.#idsToElements) {\n      return;\n    }\n    const hasNoElement = !element;\n    element ||= this.#idsToElements.get(id);\n    for (const el of this.#commentsList.children) {\n      el.classList.toggle(\"selected\", el === element);\n    }\n    if (hasNoElement) {\n      element?.scrollIntoView({ behavior: \"instant\", block: \"center\" });\n    }\n  }\n\n  addComment(annotation) {\n    if (this.#idsToElements?.has(annotation.id)) {\n      return;\n    }\n    const { popupRef, contentsObj } = annotation;\n    if (!popupRef || !contentsObj?.str) {\n      return;\n    }\n    const commentItem = this.#createCommentElement(annotation);\n    if (this.#annotations.length === 0) {\n      this.#commentsList.replaceChildren(commentItem);\n      this.#annotations.push(annotation);\n      this.#setCommentsCount();\n      return;\n    }\n    const index = binarySearchFirstItem(\n      this.#annotations,\n      a => this.#sortComments(a, annotation) >= 0\n    );\n    this.#annotations.splice(index, 0, annotation);\n    if (index >= this.#commentsList.children.length) {\n      this.#commentsList.append(commentItem);\n    } else {\n      this.#commentsList.insertBefore(\n        commentItem,\n        this.#commentsList.children[index]\n      );\n    }\n    this.#setCommentsCount();\n  }\n\n  #setCommentsCount(container = this.#commentsList) {\n    const count = this.#idsToElements.size;\n    this.#sidebarTitle.setAttribute(\n      \"data-l10n-args\",\n      JSON.stringify({ count })\n    );\n    this.#commentCount.textContent = count;\n    if (count === 0) {\n      container.append(this.#createZeroCommentElement());\n    }\n  }\n\n  #createZeroCommentElement() {\n    const commentItem = document.createElement(\"li\");\n    commentItem.classList.add(\"sidebarComment\", \"noComments\");\n    const textDiv = document.createElement(\"div\");\n    textDiv.className = \"sidebarCommentText\";\n    textDiv.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-editor-comments-sidebar-no-comments1\"\n    );\n    commentItem.append(textDiv);\n    if (this.#learnMoreUrl) {\n      const a = document.createElement(\"a\");\n      a.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-editor-comments-sidebar-no-comments-link\"\n      );\n      a.href = this.#learnMoreUrl;\n      a.target = \"_blank\";\n      a.rel = \"noopener noreferrer\";\n      commentItem.append(a);\n    }\n    return commentItem;\n  }\n\n  #setDate(element, date) {\n    date = PDFDateString.toDateObject(date);\n    element.dateTime = date.toISOString();\n    element.textContent = this.#dateFormat.format(date);\n  }\n\n  #setText(element, richText, contentsObj) {\n    element.replaceChildren();\n    const html =\n      richText?.str && (!contentsObj?.str || richText.str === contentsObj.str)\n        ? richText.html\n        : contentsObj?.str;\n    renderRichText(\n      {\n        html,\n        dir: contentsObj?.dir || \"auto\",\n        className: \"richText\",\n      },\n      element\n    );\n  }\n\n  #createCommentElement(annotation) {\n    const {\n      id,\n      creationDate,\n      modificationDate,\n      richText,\n      contentsObj,\n      color,\n      opacity,\n    } = annotation;\n    const commentItem = document.createElement(\"li\");\n    commentItem.role = \"button\";\n    commentItem.className = \"sidebarComment\";\n    commentItem.tabIndex = -1;\n    commentItem.style.backgroundColor =\n      (color && CommentManager._makeCommentColor(color, opacity)) || \"\";\n    const dateDiv = document.createElement(\"time\");\n    this.#setDate(dateDiv, modificationDate || creationDate);\n\n    const textDiv = document.createElement(\"div\");\n    textDiv.className = \"sidebarCommentText\";\n    this.#setText(textDiv, richText, contentsObj);\n\n    commentItem.append(dateDiv, textDiv);\n    commentItem.addEventListener(\"click\", this.#boundCommentClick);\n    commentItem.addEventListener(\"keydown\", this.#boundCommentKeydown);\n\n    this.#elementsToAnnotations.set(commentItem, annotation);\n    this.#idsToElements.set(id, commentItem);\n    return commentItem;\n  }\n\n  async #commentClick({ currentTarget }) {\n    if (currentTarget.classList.contains(\"selected\")) {\n      currentTarget.classList.remove(\"selected\");\n      this.#popup._hide();\n      return;\n    }\n    const annotation = this.#elementsToAnnotations.get(currentTarget);\n    if (!annotation) {\n      return;\n    }\n    this.#popup._hide();\n    const { id, pageIndex, rect } = annotation;\n    const pageNumber = pageIndex + 1;\n    const pageVisiblePromise =\n      this.#uiManager?.waitForEditorsRendered(pageNumber);\n    this.#linkService?.goToXY(pageNumber, rect[0], rect[3], {\n      center: \"both\",\n    });\n    this.selectComment(currentTarget);\n    await pageVisiblePromise;\n    this.#uiManager?.selectComment(pageIndex, id);\n  }\n\n  #commentKeydown(e) {\n    const { key, currentTarget } = e;\n    switch (key) {\n      case \"ArrowDown\":\n        (\n          currentTarget.nextElementSibling ||\n          this.#commentsList.firstElementChild\n        ).focus();\n        stopEvent(e);\n        break;\n      case \"ArrowUp\":\n        (\n          currentTarget.previousElementSibling ||\n          this.#commentsList.lastElementChild\n        ).focus();\n        stopEvent(e);\n        break;\n      case \"Home\":\n        this.#commentsList.firstElementChild.focus();\n        stopEvent(e);\n        break;\n      case \"End\":\n        this.#commentsList.lastElementChild.focus();\n        stopEvent(e);\n        break;\n      case \"Enter\":\n      case \" \":\n        this.#commentClick(e);\n        stopEvent(e);\n        break;\n      case \"ShiftTab\":\n        this.#closeButton.focus();\n        stopEvent(e);\n        break;\n    }\n  }\n\n  #sortComments(a, b) {\n    const dateA = PDFDateString.toDateObject(\n      a.modificationDate || a.creationDate\n    );\n    const dateB = PDFDateString.toDateObject(\n      b.modificationDate || b.creationDate\n    );\n    if (dateA !== dateB) {\n      if (dateA !== null && dateB !== null) {\n        return dateB - dateA;\n      }\n      return dateA !== null ? -1 : 1;\n    }\n    if (a.pageIndex !== b.pageIndex) {\n      return a.pageIndex - b.pageIndex;\n    }\n    if (a.rect[3] !== b.rect[3]) {\n      return b.rect[3] - a.rect[3];\n    }\n    if (a.rect[0] !== b.rect[0]) {\n      return a.rect[0] - b.rect[0];\n    }\n    if (a.rect[1] !== b.rect[1]) {\n      return b.rect[1] - a.rect[1];\n    }\n    if (a.rect[2] !== b.rect[2]) {\n      return a.rect[2] - b.rect[2];\n    }\n    return a.id.localeCompare(b.id);\n  }\n}\n\nclass CommentDialog {\n  #dialog;\n\n  #editor;\n\n  #overlayManager;\n\n  #previousText = \"\";\n\n  #commentText = \"\";\n\n  #textInput;\n\n  #title;\n\n  #saveButton;\n\n  #uiManager;\n\n  #prevDragX = 0;\n\n  #prevDragY = 0;\n\n  #dialogX = 0;\n\n  #dialogY = 0;\n\n  #isLTR;\n\n  #eventBus;\n\n  constructor(\n    { dialog, toolbar, title, textInput, cancelButton, saveButton },\n    overlayManager,\n    eventBus,\n    ltr\n  ) {\n    this.#dialog = dialog;\n    this.#textInput = textInput;\n    this.#overlayManager = overlayManager;\n    this.#eventBus = eventBus;\n    this.#saveButton = saveButton;\n    this.#title = title;\n    this.#isLTR = ltr;\n\n    const finishBound = this.#finish.bind(this);\n    dialog.addEventListener(\"close\", finishBound);\n    dialog.addEventListener(\"contextmenu\", e => {\n      if (e.target !== this.#textInput) {\n        e.preventDefault();\n      }\n    });\n    cancelButton.addEventListener(\"click\", finishBound);\n    saveButton.addEventListener(\"click\", this.#save.bind(this));\n\n    textInput.addEventListener(\"input\", () => {\n      saveButton.disabled = textInput.value === this.#previousText;\n    });\n    textInput.addEventListener(\"keydown\", e => {\n      if (\n        (e.ctrlKey || e.metaKey) &&\n        e.key === \"Enter\" &&\n        !saveButton.disabled\n      ) {\n        this.#save();\n      }\n    });\n\n    // Make the dialog draggable.\n    let pointerMoveAC;\n    const cancelDrag = () => {\n      dialog.classList.remove(\"dragging\");\n      pointerMoveAC?.abort();\n      pointerMoveAC = null;\n    };\n    toolbar.addEventListener(\"pointerdown\", e => {\n      if (pointerMoveAC) {\n        cancelDrag();\n        return;\n      }\n      const { clientX, clientY } = e;\n      stopEvent(e);\n      this.#prevDragX = clientX;\n      this.#prevDragY = clientY;\n      pointerMoveAC = new AbortController();\n      const { signal } = pointerMoveAC;\n      const { innerHeight, innerWidth } = window;\n      dialog.classList.add(\"dragging\");\n      window.addEventListener(\n        \"pointermove\",\n        ev => {\n          if (!pointerMoveAC) {\n            return;\n          }\n          const { clientX: x, clientY: y } = ev;\n          this.#setPosition(\n            this.#dialogX + (x - this.#prevDragX) / innerWidth,\n            this.#dialogY + (y - this.#prevDragY) / innerHeight\n          );\n          this.#prevDragX = x;\n          this.#prevDragY = y;\n          stopEvent(ev);\n        },\n        { signal }\n      );\n      window.addEventListener(\"blur\", cancelDrag, { signal });\n      window.addEventListener(\n        \"pointerup\",\n        ev => {\n          if (pointerMoveAC) {\n            cancelDrag();\n            stopEvent(ev);\n          }\n        },\n        { signal }\n      );\n    });\n\n    overlayManager.register(dialog);\n  }\n\n  async open(uiManager, editor, posX, posY, options) {\n    if (editor) {\n      this.#uiManager = uiManager;\n      this.#editor = editor;\n    }\n    const {\n      contentsObj: { str },\n      color,\n      opacity,\n    } = editor.getData();\n    const { style: dialogStyle } = this.#dialog;\n    if (color) {\n      dialogStyle.backgroundColor = CommentManager._makeCommentColor(\n        color,\n        opacity\n      );\n      dialogStyle.borderColor = Util.makeHexColor(...color);\n    } else {\n      dialogStyle.backgroundColor = dialogStyle.borderColor = \"\";\n    }\n    this.#commentText = str || \"\";\n    const textInput = this.#textInput;\n    textInput.value = this.#previousText = this.#commentText;\n    if (str) {\n      this.#title.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-editor-edit-comment-dialog-title-when-editing\"\n      );\n      this.#saveButton.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-editor-edit-comment-dialog-save-button-when-editing\"\n      );\n    } else {\n      this.#title.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-editor-edit-comment-dialog-title-when-adding\"\n      );\n      this.#saveButton.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-editor-edit-comment-dialog-save-button-when-adding\"\n      );\n    }\n    if (options?.height) {\n      textInput.style.height = `${options.height}px`;\n    }\n    this.#uiManager?.removeEditListeners();\n    this.#saveButton.disabled = true;\n    const parentDimensions = options?.parentDimensions;\n    const { innerHeight, innerWidth } = window;\n    if (editor.hasDefaultPopupPosition()) {\n      const { dialogWidth, dialogHeight } = this._dialogDimensions;\n      if (parentDimensions) {\n        if (\n          this.#isLTR &&\n          posX + dialogWidth >\n            Math.min(parentDimensions.x + parentDimensions.width, innerWidth)\n        ) {\n          const buttonWidth = this.#editor.commentButtonWidth;\n          posX -= dialogWidth - buttonWidth * parentDimensions.width;\n        } else if (!this.#isLTR) {\n          const buttonWidth =\n            this.#editor.commentButtonWidth * parentDimensions.width;\n          if (posX - dialogWidth < Math.max(0, parentDimensions.x)) {\n            posX = Math.max(0, posX);\n          } else {\n            posX -= dialogWidth - buttonWidth;\n          }\n        }\n      }\n      const height = Math.max(dialogHeight, options?.height || 0);\n      if (posY + height > innerHeight) {\n        posY = innerHeight - height;\n      }\n      if (posY < 0) {\n        posY = 0;\n      }\n    }\n\n    posX = MathClamp(posX / innerWidth, 0, 1);\n    posY = MathClamp(posY / innerHeight, 0, 1);\n    this.#setPosition(posX, posY);\n\n    await this.#overlayManager.open(this.#dialog);\n    textInput.focus();\n  }\n\n  async #save() {\n    this.#editor.comment = this.#textInput.value;\n    this.#finish();\n  }\n\n  get _dialogDimensions() {\n    const dialog = this.#dialog;\n    const { style } = dialog;\n    style.opacity = \"0\";\n    style.display = \"block\";\n    const { width, height } = dialog.getBoundingClientRect();\n    style.opacity = style.display = \"\";\n    return shadow(this, \"_dialogDimensions\", {\n      dialogWidth: width,\n      dialogHeight: height,\n    });\n  }\n\n  #setPosition(x, y) {\n    this.#dialogX = x;\n    this.#dialogY = y;\n    const { style } = this.#dialog;\n    style.left = `${100 * x}%`;\n    style.top = `${100 * y}%`;\n  }\n\n  #finish() {\n    if (!this.#editor) {\n      return;\n    }\n    const edited = this.#textInput.value !== this.#commentText;\n    this.#eventBus.dispatch(\"reporttelemetry\", {\n      source: this,\n      details: {\n        type: \"comment\",\n        data: {\n          edited,\n        },\n      },\n    });\n\n    this.#editor?.focusCommentButton();\n    this.#editor = null;\n    this.#textInput.value = this.#previousText = this.#commentText = \"\";\n    this.#overlayManager.closeIfActive(this.#dialog);\n    this.#textInput.style.height = \"\";\n    this.#uiManager?.addEditListeners();\n    this.#uiManager = null;\n  }\n\n  destroy() {\n    this.#uiManager = null;\n    this.#editor = null;\n    this.#finish();\n  }\n}\n\nclass CommentPopup {\n  #buttonsContainer = null;\n\n  #eventBus;\n\n  #commentDialog;\n\n  #dateFormat;\n\n  #editor = null;\n\n  #isLTR;\n\n  #container = null;\n\n  #text = null;\n\n  #time = null;\n\n  #prevDragX = 0;\n\n  #prevDragY = 0;\n\n  #posX = 0;\n\n  #posY = 0;\n\n  #previousFocusedElement = null;\n\n  #selected = false;\n\n  #visible = false;\n\n  constructor(eventBus, dateFormat, ltr, commentDialog) {\n    this.#eventBus = eventBus;\n    this.#dateFormat = dateFormat;\n    this.#isLTR = ltr;\n    this.#commentDialog = commentDialog;\n    this.sidebar = null;\n  }\n\n  get _popupWidth() {\n    const container = this.#createPopup();\n    const { style } = container;\n    style.opacity = \"0\";\n    style.display = \"block\";\n    document.body.append(container);\n    const width = container.getBoundingClientRect().width;\n    container.remove();\n    style.opacity = style.display = \"\";\n    return shadow(this, \"_popupWidth\", width);\n  }\n\n  #createPopup() {\n    if (this.#container) {\n      return this.#container;\n    }\n    const container = (this.#container = document.createElement(\"div\"));\n    container.className = \"commentPopup\";\n    container.id = \"commentPopup\";\n    container.tabIndex = -1;\n    container.role = \"dialog\";\n    container.ariaModal = \"false\";\n    container.addEventListener(\"contextmenu\", noContextMenu);\n    container.addEventListener(\"keydown\", e => {\n      if (e.key === \"Escape\") {\n        this.toggle(this.#editor, true, false);\n        this.#previousFocusedElement?.focus();\n        stopEvent(e);\n      }\n    });\n    container.addEventListener(\"click\", () => {\n      container.focus();\n    });\n\n    const top = document.createElement(\"div\");\n    top.className = \"commentPopupTop\";\n    const time = (this.#time = document.createElement(\"time\"));\n    time.className = \"commentPopupTime\";\n\n    const buttons = (this.#buttonsContainer = document.createElement(\"div\"));\n    buttons.className = \"commentPopupButtons\";\n    const edit = document.createElement(\"button\");\n    edit.classList.add(\"commentPopupEdit\", \"toolbarButton\");\n    edit.tabIndex = 0;\n    edit.setAttribute(\"data-l10n-id\", \"pdfjs-editor-edit-comment-popup-button\");\n    edit.ariaHasPopup = \"dialog\";\n    edit.ariaControlsElements = [this.#commentDialog];\n    const editLabel = document.createElement(\"span\");\n    editLabel.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-editor-edit-comment-popup-button-label\"\n    );\n    edit.append(editLabel);\n    edit.addEventListener(\"click\", () => {\n      const editor = this.#editor;\n      const height = parseFloat(getComputedStyle(this.#text).height);\n      this.toggle(editor, /* isSelected */ true, /* visibility */ false);\n      editor.editComment({\n        height,\n      });\n    });\n    edit.addEventListener(\"contextmenu\", noContextMenu);\n\n    const del = document.createElement(\"button\");\n    del.classList.add(\"commentPopupDelete\", \"toolbarButton\");\n    del.tabIndex = 0;\n    del.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-editor-delete-comment-popup-button\"\n    );\n    const delLabel = document.createElement(\"span\");\n    delLabel.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-editor-delete-comment-popup-button-label\"\n    );\n    del.append(delLabel);\n    del.addEventListener(\"click\", () => {\n      this.#eventBus.dispatch(\"reporttelemetry\", {\n        source: this,\n        details: {\n          type: \"comment\",\n          data: {\n            deleted: true,\n          },\n        },\n      });\n      const editor = this.#editor;\n      const savedData = editor.comment;\n      this.destroy();\n      if (savedData?.text) {\n        editor._uiManager.deleteComment(editor, savedData);\n      } else {\n        editor.comment = null;\n      }\n      editor.focus();\n    });\n    del.addEventListener(\"contextmenu\", noContextMenu);\n    buttons.append(edit, del);\n\n    top.append(time, buttons);\n\n    const separator = document.createElement(\"hr\");\n\n    const text = (this.#text = document.createElement(\"div\"));\n    text.className = \"commentPopupText\";\n    container.append(top, separator, text);\n\n    // Make the dialog draggable.\n    let pointerMoveAC;\n    const cancelDrag = () => {\n      container.classList.remove(\"dragging\");\n      pointerMoveAC?.abort();\n      pointerMoveAC = null;\n    };\n    top.addEventListener(\"pointerdown\", e => {\n      if (pointerMoveAC) {\n        cancelDrag();\n        return;\n      }\n      const { target, clientX, clientY } = e;\n      if (buttons.contains(target)) {\n        return;\n      }\n      stopEvent(e);\n      const { width: parentWidth, height: parentHeight } =\n        this.#editor.parentBoundingClientRect;\n      this.#prevDragX = clientX;\n      this.#prevDragY = clientY;\n      pointerMoveAC = new AbortController();\n      const { signal } = pointerMoveAC;\n      container.classList.add(\"dragging\");\n      window.addEventListener(\n        \"pointermove\",\n        ev => {\n          if (!pointerMoveAC) {\n            return; // Not dragging.\n          }\n          const { clientX: x, clientY: y } = ev;\n          this.#setPosition(\n            this.#posX + (x - this.#prevDragX) / parentWidth,\n            this.#posY + (y - this.#prevDragY) / parentHeight,\n            /* correctPosition = */ false\n          );\n          this.#prevDragX = x;\n          this.#prevDragY = y;\n          stopEvent(ev);\n        },\n        { signal }\n      );\n      window.addEventListener(\"blur\", cancelDrag, { signal });\n      window.addEventListener(\n        \"pointerup\",\n        ev => {\n          if (pointerMoveAC) {\n            cancelDrag();\n            stopEvent(ev);\n          }\n        },\n        { signal }\n      );\n    });\n\n    return container;\n  }\n\n  updateColor(editor) {\n    if (this.#editor !== editor || !this.#visible) {\n      return;\n    }\n    const { color, opacity } = editor.getData();\n    this.#container.style.backgroundColor =\n      (color && CommentManager._makeCommentColor(color, opacity)) || \"\";\n  }\n\n  _hide(editor) {\n    const container = this.#createPopup();\n\n    container.classList.toggle(\"hidden\", true);\n    container.classList.toggle(\"selected\", false);\n    (editor || this.#editor)?.setCommentButtonStates({\n      selected: false,\n      hasPopup: false,\n    });\n    this.#editor = null;\n    this.#selected = false;\n    this.#visible = false;\n    this.#text.replaceChildren();\n    this.sidebar.selectComment(null);\n  }\n\n  toggle(editor, isSelected, visibility = undefined, isEditable = true) {\n    if (!editor) {\n      this.destroy();\n      return;\n    }\n\n    if (isSelected) {\n      visibility ??=\n        this.#editor === editor ? !this.#selected || !this.#visible : true;\n    } else {\n      if (this.#selected) {\n        return;\n      }\n      visibility ??= !this.#visible;\n    }\n\n    if (!visibility) {\n      this._hide(editor);\n      return;\n    }\n\n    this.#visible = true;\n    if (this.#editor !== editor) {\n      this.#editor?.setCommentButtonStates({\n        selected: false,\n        hasPopup: false,\n      });\n    }\n\n    const container = this.#createPopup();\n    this.#buttonsContainer.classList.toggle(\"hidden\", !isEditable);\n    container.classList.toggle(\"hidden\", false);\n    container.classList.toggle(\"selected\", isSelected);\n    this.#selected = isSelected;\n    this.#editor = editor;\n    editor.setCommentButtonStates({\n      selected: isSelected,\n      hasPopup: true,\n    });\n\n    const {\n      contentsObj,\n      richText,\n      creationDate,\n      modificationDate,\n      color,\n      opacity,\n    } = editor.getData();\n    container.style.backgroundColor =\n      (color && CommentManager._makeCommentColor(color, opacity)) || \"\";\n    this.#text.replaceChildren();\n    const html =\n      richText?.str && (!contentsObj?.str || richText.str === contentsObj.str)\n        ? richText.html\n        : contentsObj?.str;\n    if (html) {\n      renderRichText(\n        {\n          html,\n          dir: contentsObj?.dir || \"auto\",\n          className: \"richText\",\n        },\n        this.#text\n      );\n    }\n    this.#time.textContent = this.#dateFormat.format(\n      PDFDateString.toDateObject(modificationDate || creationDate)\n    );\n    this.#setPosition(\n      ...editor.commentPopupPosition,\n      /* correctPosition = */ editor.hasDefaultPopupPosition()\n    );\n    editor.elementBeforePopup.after(container);\n    container.addEventListener(\n      \"focus\",\n      ({ relatedTarget }) => {\n        this.#previousFocusedElement = relatedTarget;\n      },\n      { once: true }\n    );\n    if (isSelected) {\n      setTimeout(() => container.focus(), 0);\n    }\n  }\n\n  #setPosition(x, y, correctPosition) {\n    if (!correctPosition) {\n      this.#editor.commentPopupPosition = [x, y];\n    } else {\n      const parentRect = this.#editor.parentBoundingClientRect;\n      const widthRatio = this._popupWidth / parentRect.width;\n      if (\n        (this.#isLTR && x + widthRatio > 1) ||\n        (!this.#isLTR && x - widthRatio >= 0)\n      ) {\n        const buttonWidth = this.#editor.commentButtonWidth;\n        x -= widthRatio - buttonWidth;\n      }\n      const margin = 0.01;\n      if (this.#isLTR) {\n        x = Math.max(x, -parentRect.x / parentRect.width + margin);\n      } else {\n        x = Math.min(\n          x,\n          (window.innerWidth - parentRect.x) / parentRect.width -\n            widthRatio -\n            margin\n        );\n      }\n    }\n    this.#posX = x;\n    this.#posY = y;\n    const { style } = this.#container;\n    style.left = `${100 * x}%`;\n    style.top = `${100 * y}%`;\n  }\n\n  destroy() {\n    this._hide();\n    this.#container?.remove();\n    this.#container = this.#text = this.#time = null;\n    this.#prevDragX = this.#prevDragY = Infinity;\n    this.#posX = this.#posY = 0;\n    this.#previousFocusedElement = null;\n  }\n}\n\nexport { CommentManager };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isPdfFile } from \"pdfjs-lib\";\n\nclass BaseDownloadManager {\n  #openBlobUrls = new WeakMap();\n\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseDownloadManager\n    ) {\n      throw new Error(\"Cannot initialize BaseDownloadManager.\");\n    }\n  }\n\n  _triggerDownload(blobUrl, originalUrl, filename, isAttachment = false) {\n    throw new Error(\"Not implemented: _triggerDownload\");\n  }\n\n  _getOpenDataUrl(blobUrl, filename, dest = null) {\n    throw new Error(\"Not implemented: _getOpenDataUrl\");\n  }\n\n  /**\n   * @param {Uint8Array} data\n   * @param {string} filename\n   * @param {string} [contentType]\n   */\n  downloadData(data, filename, contentType) {\n    const blobUrl = URL.createObjectURL(\n      new Blob([data], { type: contentType })\n    );\n\n    this._triggerDownload(\n      blobUrl,\n      /* originalUrl = */ blobUrl,\n      filename,\n      /* isAttachment = */ true\n    );\n  }\n\n  /**\n   * @param {Uint8Array} data\n   * @param {string} filename\n   * @param {string | null} [dest]\n   * @returns {boolean} Indicating if the data was opened.\n   */\n  openOrDownloadData(data, filename, dest = null) {\n    const isPdfData = isPdfFile(filename);\n    const contentType = isPdfData ? \"application/pdf\" : \"\";\n\n    if (isPdfData) {\n      const blobUrl = this.#openBlobUrls.getOrInsertComputed(data, () =>\n        URL.createObjectURL(new Blob([data], { type: contentType }))\n      );\n      try {\n        const viewerUrl = this._getOpenDataUrl(blobUrl, filename, dest);\n\n        window.open(viewerUrl);\n        return true;\n      } catch (ex) {\n        console.error(\"openOrDownloadData:\", ex);\n        // Release the `blobUrl`, since opening it failed, and fallback to\n        // downloading the PDF file.\n        URL.revokeObjectURL(blobUrl);\n        this.#openBlobUrls.delete(data);\n      }\n    }\n\n    this.downloadData(data, filename, contentType);\n    return false;\n  }\n\n  /**\n   * @param {Uint8Array} data\n   * @param {string} url\n   * @param {string} filename\n   */\n  download(data, url, filename) {\n    const blobUrl = data\n      ? URL.createObjectURL(new Blob([data], { type: \"application/pdf\" }))\n      : null;\n\n    this._triggerDownload(blobUrl, /* originalUrl = */ url, filename);\n  }\n}\n\nexport { BaseDownloadManager };\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseDownloadManager } from \"./base_download_manager.js\";\nimport { createValidAbsoluteUrl } from \"pdfjs-lib\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"CHROME || GENERIC\")) {\n  throw new Error(\n    'Module \"pdfjs-web/download_manager\" shall not be used ' +\n      \"outside CHROME and GENERIC builds.\"\n  );\n}\n\nclass DownloadManager extends BaseDownloadManager {\n  _triggerDownload(blobUrl, originalUrl, filename, isAttachment = false) {\n    if (!blobUrl && !isAttachment) {\n      // Fallback to downloading non-attachments by their URL.\n      if (!createValidAbsoluteUrl(originalUrl, \"http://example.com\")) {\n        throw new Error(`_triggerDownload - not a valid URL: ${originalUrl}`);\n      }\n      blobUrl = originalUrl + \"#pdfjs.action=download\";\n    }\n\n    const a = document.createElement(\"a\");\n    a.href = blobUrl;\n    a.target = \"_parent\";\n    // Use a.download if available. This increases the likelihood that\n    // the file is downloaded instead of opened by another PDF plugin.\n    if (\"download\" in a) {\n      a.download = filename;\n    }\n    // <a> must be in the document for recent Firefox versions,\n    // otherwise .click() is ignored.\n    (document.body || document.documentElement).append(a);\n    a.click();\n    a.remove();\n  }\n\n  _getOpenDataUrl(blobUrl, filename, dest = null) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"COMPONENTS\")) {\n      throw new Error(\"Opening data is not supported in `COMPONENTS` builds.\");\n    }\n    // The current URL is the viewer, let's use it and append the file.\n    let url = \"?file=\" + encodeURIComponent(blobUrl + \"#\" + filename);\n    if (dest) {\n      url += `#${escape(dest)}`;\n    }\n    return url;\n  }\n}\n\nexport { DownloadManager };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { internalOpt } from \"./internal_evt.js\";\nimport { noContextMenu } from \"pdfjs-lib\";\n\nclass EditorUndoBar {\n  #closeButton = null;\n\n  #container;\n\n  #eventBus = null;\n\n  #focusTimeout = null;\n\n  #initController = null;\n\n  isOpen = false;\n\n  #message;\n\n  #showController = null;\n\n  #undoButton;\n\n  static #l10nMessages = Object.freeze({\n    highlight: \"pdfjs-editor-undo-bar-message-highlight\",\n    freetext: \"pdfjs-editor-undo-bar-message-freetext\",\n    stamp: \"pdfjs-editor-undo-bar-message-stamp\",\n    ink: \"pdfjs-editor-undo-bar-message-ink\",\n    signature: \"pdfjs-editor-undo-bar-message-signature\",\n    comment: \"pdfjs-editor-undo-bar-message-comment\",\n    _multiple: \"pdfjs-editor-undo-bar-message-multiple\",\n  });\n\n  constructor({ container, message, undoButton, closeButton }, eventBus) {\n    this.#container = container;\n    this.#message = message;\n    this.#undoButton = undoButton;\n    this.#closeButton = closeButton;\n    this.#eventBus = eventBus;\n  }\n\n  destroy() {\n    this.#initController?.abort();\n    this.#initController = null;\n\n    this.hide();\n  }\n\n  show(undoAction, messageData) {\n    if (!this.#initController) {\n      this.#initController = new AbortController();\n      const domOpts = { signal: this.#initController.signal };\n      const evtOpts = { signal: this.#initController.signal, ...internalOpt };\n      const boundHide = this.hide.bind(this);\n\n      this.#container.addEventListener(\"contextmenu\", noContextMenu, domOpts);\n      this.#closeButton.addEventListener(\"click\", boundHide, domOpts);\n      this.#eventBus.on(\"beforeprint\", boundHide, evtOpts);\n      this.#eventBus.on(\"download\", boundHide, evtOpts);\n    }\n\n    this.hide();\n\n    if (typeof messageData === \"string\") {\n      this.#message.setAttribute(\n        \"data-l10n-id\",\n        EditorUndoBar.#l10nMessages[messageData]\n      );\n    } else {\n      this.#message.setAttribute(\n        \"data-l10n-id\",\n        EditorUndoBar.#l10nMessages._multiple\n      );\n      this.#message.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({ count: messageData })\n      );\n    }\n    this.isOpen = true;\n    this.#container.hidden = false;\n\n    this.#showController = new AbortController();\n\n    this.#undoButton.addEventListener(\n      \"click\",\n      () => {\n        undoAction();\n        this.hide();\n      },\n      { signal: this.#showController.signal }\n    );\n\n    // Without the setTimeout, VoiceOver will read out the document title\n    // instead of the popup label.\n    this.#focusTimeout = setTimeout(() => {\n      if (!this.#container.contains(document.activeElement)) {\n        this.#container.focus();\n      }\n      this.#focusTimeout = null;\n    }, 100);\n  }\n\n  hide() {\n    if (!this.isOpen) {\n      return;\n    }\n    this.isOpen = false;\n    this.#container.hidden = true;\n\n    this.#showController?.abort();\n    this.#showController = null;\n\n    if (this.#focusTimeout) {\n      clearTimeout(this.#focusTimeout);\n      this.#focusTimeout = null;\n    }\n  }\n}\n\nexport { EditorUndoBar };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass OverlayManager {\n  #overlays = new WeakMap();\n\n  #active = null;\n\n  get active() {\n    return this.#active;\n  }\n\n  /**\n   * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n   * @param {boolean} [canForceClose] - Indicates if opening the overlay closes\n   *                  an active overlay. The default is `false`.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    registered.\n   */\n  async register(dialog, canForceClose = false) {\n    if (typeof dialog !== \"object\") {\n      throw new Error(\"Not enough parameters.\");\n    } else if (this.#overlays.has(dialog)) {\n      throw new Error(\"The overlay is already registered.\");\n    }\n    this.#overlays.set(dialog, { canForceClose });\n\n    dialog.addEventListener(\"cancel\", ({ target }) => {\n      if (this.#active === target) {\n        this.#active = null;\n      }\n    });\n  }\n\n  /**\n   * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    opened.\n   */\n  async open(dialog) {\n    if (!this.#overlays.has(dialog)) {\n      throw new Error(\"The overlay does not exist.\");\n    } else if (this.#active) {\n      if (this.#active === dialog) {\n        throw new Error(\"The overlay is already active.\");\n      } else if (this.#overlays.get(dialog).canForceClose) {\n        await this.close();\n      } else {\n        throw new Error(\"Another overlay is currently active.\");\n      }\n    }\n    this.#active = dialog;\n    dialog.showModal();\n  }\n\n  /**\n   * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    closed.\n   */\n  async close(dialog = this.#active) {\n    if (!this.#overlays.has(dialog)) {\n      throw new Error(\"The overlay does not exist.\");\n    } else if (!this.#active) {\n      throw new Error(\"The overlay is currently not active.\");\n    } else if (this.#active !== dialog) {\n      throw new Error(\"Another overlay is currently active.\");\n    }\n    dialog.close();\n    this.#active = null;\n  }\n\n  /**\n   * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    closed.\n   */\n  async closeIfActive(dialog) {\n    if (this.#active === dialog) {\n      await this.close(dialog);\n    }\n  }\n}\n\nexport { OverlayManager };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./overlay_manager.js\").OverlayManager} OverlayManager */\n\nimport { PasswordResponses } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} PasswordPromptOptions\n * @property {HTMLDialogElement} dialog - The overlay's DOM element.\n * @property {HTMLParagraphElement} label - Label containing instructions for\n *                                          entering the password.\n * @property {HTMLInputElement} input - Input field for entering the password.\n * @property {HTMLButtonElement} submitButton - Button for submitting the\n *                                              password.\n * @property {HTMLButtonElement} cancelButton - Button for cancelling password\n *                                              entry.\n */\n\nclass PasswordPrompt {\n  #activeCapability = null;\n\n  #updateCallback = null;\n\n  #reason = null;\n\n  /**\n   * @param {PasswordPromptOptions} options\n   * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n   * @param {boolean} [isViewerEmbedded] - If the viewer is embedded, in e.g.\n   *   an <iframe> or an <object>. The default value is `false`.\n   */\n  constructor(options, overlayManager, isViewerEmbedded = false) {\n    this.dialog = options.dialog;\n    this.label = options.label;\n    this.input = options.input;\n    this.submitButton = options.submitButton;\n    this.cancelButton = options.cancelButton;\n    this.overlayManager = overlayManager;\n    this._isViewerEmbedded = isViewerEmbedded;\n\n    // Attach the event listeners.\n    this.submitButton.addEventListener(\"click\", this.#verify.bind(this));\n    this.cancelButton.addEventListener(\"click\", this.close.bind(this));\n    this.input.addEventListener(\"keydown\", e => {\n      if (e.keyCode === /* Enter = */ 13) {\n        this.#verify();\n        e.preventDefault();\n      }\n    });\n\n    this.overlayManager.register(this.dialog, /* canForceClose = */ true);\n\n    this.dialog.addEventListener(\"close\", this.#cancel.bind(this));\n  }\n\n  async open() {\n    await this.#activeCapability?.promise;\n    this.#activeCapability = Promise.withResolvers();\n\n    try {\n      await this.overlayManager.open(this.dialog);\n    } catch (ex) {\n      this.#activeCapability.resolve();\n      throw ex;\n    }\n\n    const passwordIncorrect =\n      this.#reason === PasswordResponses.INCORRECT_PASSWORD;\n\n    if (!this._isViewerEmbedded || passwordIncorrect) {\n      this.input.focus();\n    }\n    this.label.setAttribute(\n      \"data-l10n-id\",\n      passwordIncorrect ? \"pdfjs-password-invalid\" : \"pdfjs-password-label\"\n    );\n  }\n\n  async close() {\n    this.overlayManager.closeIfActive(this.dialog);\n  }\n\n  #verify() {\n    const password = this.input.value;\n    if (password?.length > 0) {\n      this.#invokeCallback(password);\n    }\n  }\n\n  #cancel() {\n    this.#invokeCallback(new Error(\"PasswordPrompt cancelled.\"));\n    this.#activeCapability.resolve();\n  }\n\n  #invokeCallback(password) {\n    if (!this.#updateCallback) {\n      return; // Ensure that the callback is only invoked once.\n    }\n    this.close();\n    this.input.value = \"\";\n\n    this.#updateCallback(password);\n    this.#updateCallback = null;\n  }\n\n  async setUpdateCallback(updateCallback, reason) {\n    if (this.#activeCapability) {\n      await this.#activeCapability.promise;\n    }\n    this.#updateCallback = updateCallback;\n    this.#reason = reason;\n  }\n}\n\nexport { PasswordPrompt };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { removeNullCharacters } from \"./ui_utils.js\";\nimport { stopEvent } from \"pdfjs-lib\";\n\nconst TREEITEM_SELECTED_CLASS = \"selected\";\n\nclass BaseTreeViewer {\n  constructor(options) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === BaseTreeViewer\n    ) {\n      throw new Error(\"Cannot initialize BaseTreeViewer.\");\n    }\n    this.container = options.container;\n    this.eventBus = options.eventBus;\n    this._l10n = options.l10n;\n\n    this.reset();\n  }\n\n  reset() {\n    this._pdfDocument = null;\n    this._lastToggleIsShow = true;\n    this._currentTreeItem = null;\n\n    // Remove the tree from the DOM.\n    this.container.replaceChildren();\n    // Ensure that the left (right in RTL locales) margin is always reset,\n    // to prevent incorrect tree alignment if a new document is opened.\n    this.container.classList.remove(\"withNesting\");\n  }\n\n  /**\n   * @protected\n   */\n  _dispatchEvent(count) {\n    throw new Error(\"Not implemented: _dispatchEvent\");\n  }\n\n  /**\n   * @protected\n   */\n  _bindLink(element, params) {\n    throw new Error(\"Not implemented: _bindLink\");\n  }\n\n  /**\n   * @private\n   */\n  _normalizeTextContent(str) {\n    // Chars in range [0x01-0x1F] will be replaced with a white space\n    // and 0x00 by \"\".\n    return (\n      removeNullCharacters(str, /* replaceInvisible */ true) ||\n      /* en dash = */ \"\\u2013\"\n    );\n  }\n\n  /**\n   * Prepend a button before a tree item which allows the user to collapse or\n   * expand all tree items at that level; see `_toggleTreeItem`.\n   * @param {HTMLDivElement} div\n   * @param {boolean|object} [hidden]\n   * @protected\n   */\n  _addToggleButton(div, hidden = false) {\n    const toggler = document.createElement(\"div\");\n    toggler.className = \"treeItemToggler\";\n    if (hidden) {\n      toggler.classList.add(\"treeItemsHidden\");\n    }\n    div.prepend(toggler);\n  }\n\n  /**\n   * Collapse or expand the subtree of a tree item.\n   *\n   * @param {Element} root - the root of the item (sub)tree.\n   * @param {boolean} show - whether to show the item (sub)tree. If false,\n   *   the item subtree rooted at `root` will be collapsed.\n   * @private\n   */\n  _toggleTreeItem(root, show = false) {\n    // Pause translation when collapsing/expanding the subtree.\n    this._l10n.pause();\n\n    this._lastToggleIsShow = show;\n    for (const toggler of root.querySelectorAll(\".treeItemToggler\")) {\n      toggler.classList.toggle(\"treeItemsHidden\", !show);\n    }\n    this._l10n.resume();\n  }\n\n  /**\n   * Collapse or expand all subtrees of the `container`.\n   * @private\n   */\n  _toggleAllTreeItems() {\n    this._toggleTreeItem(this.container, !this._lastToggleIsShow);\n  }\n\n  /**\n   * @private\n   */\n  _finishRendering(fragment, count, hasAnyNesting = false) {\n    if (hasAnyNesting) {\n      this.container.classList.add(\"withNesting\");\n      this._lastToggleIsShow = !fragment.querySelector(\".treeItemsHidden\");\n      this.container.addEventListener(\"click\", e => {\n        const { target } = e;\n        if (!target.classList.contains(\"treeItemToggler\")) {\n          return;\n        }\n        stopEvent(e);\n        target.classList.toggle(\"treeItemsHidden\");\n        if (e.shiftKey) {\n          const shouldShowAll = !target.classList.contains(\"treeItemsHidden\");\n          this._toggleTreeItem(target.parentNode, shouldShowAll);\n        }\n      });\n    }\n    // Pause translation when inserting the tree into the DOM.\n    this._l10n.pause();\n    this.container.append(fragment);\n    this._l10n.resume();\n\n    this._dispatchEvent(count);\n  }\n\n  render(params) {\n    throw new Error(\"Not implemented: render\");\n  }\n\n  /**\n   * @private\n   */\n  _updateCurrentTreeItem(treeItem = null) {\n    if (this._currentTreeItem) {\n      // Ensure that the current treeItem-selection is always removed.\n      this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS);\n      this._currentTreeItem = null;\n    }\n    if (treeItem) {\n      treeItem.classList.add(TREEITEM_SELECTED_CLASS);\n      this._currentTreeItem = treeItem;\n    }\n  }\n\n  /**\n   * @private\n   */\n  _scrollToCurrentTreeItem(treeItem) {\n    if (!treeItem) {\n      return;\n    }\n    // Pause translation when expanding the treeItem.\n    this._l10n.pause();\n    // Ensure that the treeItem is *fully* expanded, such that it will first of\n    // all be visible and secondly that scrolling it into view works correctly.\n    let currentNode = treeItem.parentNode;\n    while (currentNode && currentNode !== this.container) {\n      if (currentNode.classList.contains(\"treeItem\")) {\n        const toggler = currentNode.firstElementChild;\n        toggler?.classList.remove(\"treeItemsHidden\");\n      }\n      currentNode = currentNode.parentNode;\n    }\n    this._l10n.resume();\n\n    this._updateCurrentTreeItem(treeItem);\n\n    treeItem.scrollIntoView({\n      behavior: \"instant\",\n      block: \"center\",\n      inline: \"center\",\n      container: \"nearest\",\n    });\n  }\n}\n\nexport { BaseTreeViewer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./download_manager.js\").DownloadManager} DownloadManager */\n\n/**\n * @import {\n *   CatalogAttachmentContent,\n *   CatalogAttachment,\n * } from \"../src/core/catalog.js\";\n * @import { PDFLinkService } from \"./pdf_link_service.js\";\n */\n\nimport { BaseTreeViewer } from \"./base_tree_viewer.js\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { waitOnEventOrTimeout } from \"./event_utils.js\";\n\n/**\n * @typedef {Object} PDFAttachmentViewerOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {DownloadManager} downloadManager - The download manager.\n * @property {PDFLinkService} linkService - Link service.\n */\n\n/**\n * @typedef PDFAttachmentViewerRenderParameters\n * @property {Map<string, CatalogAttachment> | null} attachments - A lookup\n *   table of attachment objects.\n * @property {boolean} [keepRenderedCapability]\n */\n\nclass PDFAttachmentViewer extends BaseTreeViewer {\n  /**\n   * @param {PDFAttachmentViewerOptions} options\n   */\n  constructor(options) {\n    super(options);\n    this.downloadManager = options.downloadManager;\n    this.linkService = options.linkService;\n\n    this.eventBus.on(\n      \"fileattachmentannotation\",\n      this.#appendAttachment.bind(this),\n      internalOpt\n    );\n  }\n\n  reset(keepRenderedCapability = false) {\n    super.reset();\n    this._attachments = null;\n\n    if (!keepRenderedCapability) {\n      // The only situation in which the `_renderedCapability` should *not* be\n      // replaced is when appending FileAttachment annotations.\n      this._renderedCapability = Promise.withResolvers();\n    }\n    this._pendingDispatchEvent = false;\n  }\n\n  /**\n   * @protected\n   */\n  async _dispatchEvent(attachmentsCount) {\n    this._renderedCapability.resolve();\n\n    if (attachmentsCount === 0 && !this._pendingDispatchEvent) {\n      // Delay the event when no \"regular\" attachments exist, to allow time for\n      // parsing of any FileAttachment annotations that may be present on the\n      // *initially* rendered page; this reduces the likelihood of temporarily\n      // disabling the attachmentsView when the `PDFSidebar` handles the event.\n      this._pendingDispatchEvent = true;\n\n      await waitOnEventOrTimeout({\n        target: this.eventBus,\n        name: \"annotationlayerrendered\",\n        delay: 1000,\n      });\n\n      if (!this._pendingDispatchEvent) {\n        return; // There was already another `_dispatchEvent`-call`.\n      }\n    }\n    this._pendingDispatchEvent = false;\n\n    this.eventBus.dispatch(\"attachmentsloaded\", {\n      source: this,\n      attachmentsCount,\n    });\n  }\n\n  /**\n   * @param {HTMLAnchorElement} element\n   * @param {CatalogAttachment & { attachmentId?: string }} item\n   * @returns {undefined}\n   * @protected\n   */\n  _bindLink(\n    element,\n    { attachmentId, content: fallbackContent, description, filename }\n  ) {\n    if (description) {\n      element.title = description;\n    }\n\n    const openAttachment = async () => {\n      /** @type {CatalogAttachmentContent | undefined} */\n      // Prefer lazy loading when we have an attachment id; fallbackContent is\n      // only for the annotation-append path where bytes may already be present.\n      const content = attachmentId\n        ? await this.linkService.getAttachmentContent(attachmentId)\n        : fallbackContent;\n\n      if (content) {\n        this.downloadManager?.openOrDownloadData(content, filename);\n      }\n    };\n\n    element.onclick = () => {\n      openAttachment();\n      return false;\n    };\n  }\n\n  /**\n   * @param {PDFAttachmentViewerRenderParameters} params\n   */\n  render({ attachments, keepRenderedCapability = false }) {\n    if (this._attachments) {\n      this.reset(keepRenderedCapability);\n    }\n    this._attachments = attachments || null;\n\n    if (!attachments) {\n      this._dispatchEvent(/* attachmentsCount = */ 0);\n      return;\n    }\n\n    const fragment = document.createDocumentFragment();\n    const ul = document.createElement(\"ul\");\n    fragment.append(ul);\n    let attachmentsCount = 0;\n    for (const [name, item] of attachments) {\n      const li = document.createElement(\"li\");\n      ul.append(li);\n      const element = document.createElement(\"a\");\n      li.append(element);\n      this._bindLink(element, {\n        ...item,\n        attachmentId: item.attachmentId ?? name,\n      });\n      element.textContent = this._normalizeTextContent(item.filename);\n\n      attachmentsCount++;\n    }\n\n    this._finishRendering(fragment, attachmentsCount);\n  }\n\n  /**\n   * Used to append FileAttachment annotations to the sidebar.\n   */\n  #appendAttachment(item) {\n    const renderedPromise = this._renderedCapability.promise;\n\n    renderedPromise.then(() => {\n      if (renderedPromise !== this._renderedCapability.promise) {\n        return; // The FileAttachment annotation belongs to a previous document.\n      }\n      const attachments = new Map(this._attachments);\n\n      if (attachments.has(item.filename)) {\n        return; // Ignore the new attachment if it already exists.\n      }\n      attachments.set(item.filename, item);\n\n      this.render({\n        attachments,\n        keepRenderedCapability: true,\n      });\n    });\n  }\n}\n\nexport { PDFAttachmentViewer };\n","/* Copyright 2013 Rob Wu <rob@robwu.nl>\n * https://github.com/Rob--W/grab-to-pan.js\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stopEvent } from \"pdfjs-lib\";\n\n// Class name of element which can be grabbed.\nconst CSS_CLASS_GRAB = \"grab-to-pan-grab\";\n\n/**\n * @typedef {Object} GrabToPanOptions\n * @property {HTMLElement} element\n */\n\nclass GrabToPan {\n  #activateAC = null;\n\n  #mouseDownAC = null;\n\n  #scrollAC = null;\n\n  /**\n   * Construct a GrabToPan instance for a given HTML element.\n   * @param {GrabToPanOptions} options\n   */\n  constructor({ element }) {\n    this.element = element;\n    this.document = element.ownerDocument;\n\n    // This overlay will be inserted in the document when the mouse moves during\n    // a grab operation, to ensure that the cursor has the desired appearance.\n    const overlay = (this.overlay = document.createElement(\"div\"));\n    overlay.className = \"grab-to-pan-grabbing\";\n  }\n\n  /**\n   * Bind a mousedown event to the element to enable grab-detection.\n   */\n  activate() {\n    if (!this.#activateAC) {\n      this.#activateAC = new AbortController();\n\n      this.element.addEventListener(\"mousedown\", this.#onMouseDown.bind(this), {\n        capture: true,\n        signal: this.#activateAC.signal,\n      });\n      this.element.classList.add(CSS_CLASS_GRAB);\n    }\n  }\n\n  /**\n   * Removes all events. Any pending pan session is immediately stopped.\n   */\n  deactivate() {\n    if (this.#activateAC) {\n      this.#activateAC.abort();\n      this.#activateAC = null;\n\n      this.#endPan();\n      this.element.classList.remove(CSS_CLASS_GRAB);\n    }\n  }\n\n  /**\n   * Whether to not pan if the target element is clicked.\n   * Override this method to change the default behaviour.\n   *\n   * @param {Element} node - The target of the event.\n   * @returns {boolean} Whether to not react to the click event.\n   */\n  ignoreTarget(node) {\n    // Check whether the clicked element is, a child of, an input element/link.\n    return node.matches(\n      \"a[href], a[href] *, input, textarea, button, button *, select, option\"\n    );\n  }\n\n  #onMouseDown(event) {\n    if (event.button !== 0 || this.ignoreTarget(event.target)) {\n      return;\n    }\n    if (event.originalTarget) {\n      try {\n        // eslint-disable-next-line no-unused-expressions\n        event.originalTarget.tagName;\n      } catch {\n        // Mozilla-specific: element is a scrollbar (XUL element)\n        return;\n      }\n    }\n\n    this.scrollLeftStart = this.element.scrollLeft;\n    this.scrollTopStart = this.element.scrollTop;\n    this.clientXStart = event.clientX;\n    this.clientYStart = event.clientY;\n\n    this.#mouseDownAC = new AbortController();\n    const boundEndPan = this.#endPan.bind(this),\n      mouseOpts = { capture: true, signal: this.#mouseDownAC.signal };\n\n    this.document.addEventListener(\n      \"mousemove\",\n      this.#onMouseMove.bind(this),\n      mouseOpts\n    );\n    this.document.addEventListener(\"mouseup\", boundEndPan, mouseOpts);\n    // When a scroll event occurs before a mousemove, assume that the user\n    // dragged a scrollbar (necessary for Opera Presto, Safari and IE)\n    // (not needed for Chrome/Firefox)\n    this.#scrollAC = new AbortController();\n\n    this.element.addEventListener(\"scroll\", boundEndPan, {\n      capture: true,\n      signal: this.#scrollAC.signal,\n    });\n    stopEvent(event);\n\n    const focusedElement = document.activeElement;\n    if (focusedElement && !focusedElement.contains(event.target)) {\n      focusedElement.blur();\n    }\n  }\n\n  #onMouseMove(event) {\n    this.#scrollAC?.abort();\n    this.#scrollAC = null;\n\n    if (!(event.buttons & 1)) {\n      // The left mouse button is released.\n      this.#endPan();\n      return;\n    }\n    const xDiff = event.clientX - this.clientXStart;\n    const yDiff = event.clientY - this.clientYStart;\n    this.element.scrollTo({\n      top: this.scrollTopStart - yDiff,\n      left: this.scrollLeftStart - xDiff,\n      behavior: \"instant\",\n    });\n\n    if (!this.overlay.parentNode) {\n      document.body.append(this.overlay);\n    }\n  }\n\n  #endPan() {\n    this.#mouseDownAC?.abort();\n    this.#mouseDownAC = null;\n    this.#scrollAC?.abort();\n    this.#scrollAC = null;\n    // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n    this.overlay.remove();\n  }\n}\n\nexport { GrabToPan };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n\nimport { AnnotationEditorType, shadow } from \"pdfjs-lib\";\nimport { CursorTool, PresentationModeState } from \"./ui_utils.js\";\nimport { GrabToPan } from \"./grab_to_pan.js\";\nimport { internalOpt } from \"./internal_evt.js\";\n\n/**\n * @typedef {Object} PDFCursorToolsOptions\n * @property {HTMLDivElement} container - The document container.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [cursorToolOnLoad] - The cursor tool that will be enabled\n *   on load; the constants from {CursorTool} should be used. The default value\n *   is `CursorTool.SELECT`.\n */\n\nclass PDFCursorTools {\n  #active = CursorTool.SELECT;\n\n  #prevActive = null;\n\n  /**\n   * @param {PDFCursorToolsOptions} options\n   */\n  constructor({ container, eventBus, cursorToolOnLoad = CursorTool.SELECT }) {\n    this.container = container;\n    this.eventBus = eventBus;\n\n    this.#addEventListeners();\n\n    // Defer the initial `switchTool` call, to give other viewer components\n    // time to initialize *and* register 'cursortoolchanged' event listeners.\n    Promise.resolve().then(() => {\n      this.switchTool(cursorToolOnLoad);\n    });\n  }\n\n  /**\n   * @type {number} One of the values in {CursorTool}.\n   */\n  get activeTool() {\n    return this.#active;\n  }\n\n  /**\n   * @param {number} tool - The cursor mode that should be switched to,\n   *                        must be one of the values in {CursorTool}.\n   */\n  switchTool(tool) {\n    if (this.#prevActive !== null) {\n      // Cursor tools cannot be used in PresentationMode/AnnotationEditor.\n      return;\n    }\n    this.#switchTool(tool);\n  }\n\n  #switchTool(tool, disabled = false) {\n    if (tool === this.#active) {\n      if (this.#prevActive !== null) {\n        // Ensure that the `disabled`-attribute of the buttons will be updated.\n        this.eventBus.dispatch(\"cursortoolchanged\", {\n          source: this,\n          tool,\n          disabled,\n        });\n      }\n      return; // The requested tool is already active.\n    }\n\n    const disableActiveTool = () => {\n      switch (this.#active) {\n        case CursorTool.SELECT:\n          break;\n        case CursorTool.HAND:\n          this._handTool.deactivate();\n          break;\n        case CursorTool.ZOOM:\n        /* falls through */\n      }\n    };\n\n    // Enable the new cursor tool.\n    switch (tool) {\n      case CursorTool.SELECT:\n        disableActiveTool();\n        break;\n      case CursorTool.HAND:\n        disableActiveTool();\n        this._handTool.activate();\n        break;\n      case CursorTool.ZOOM:\n      /* falls through */\n      default:\n        console.error(`switchTool: \"${tool}\" is an unsupported value.`);\n        return;\n    }\n    // Update the active tool *after* it has been validated above,\n    // in order to prevent setting it to an invalid state.\n    this.#active = tool;\n\n    this.eventBus.dispatch(\"cursortoolchanged\", {\n      source: this,\n      tool,\n      disabled,\n    });\n  }\n\n  #addEventListeners() {\n    const { eventBus } = this;\n\n    eventBus.on(\n      \"switchcursortool\",\n      evt => {\n        if (!evt.reset) {\n          this.switchTool(evt.tool);\n        } else if (this.#prevActive !== null) {\n          annotationEditorMode = AnnotationEditorType.NONE;\n          presentationModeState = PresentationModeState.NORMAL;\n\n          enableActive();\n        }\n      },\n      internalOpt\n    );\n\n    let annotationEditorMode = AnnotationEditorType.NONE,\n      presentationModeState = PresentationModeState.NORMAL;\n\n    const disableActive = () => {\n      this.#prevActive ??= this.#active; // Keep track of the first one.\n      this.#switchTool(CursorTool.SELECT, /* disabled = */ true);\n    };\n    const enableActive = () => {\n      if (\n        this.#prevActive !== null &&\n        annotationEditorMode === AnnotationEditorType.NONE &&\n        presentationModeState === PresentationModeState.NORMAL\n      ) {\n        this.#switchTool(this.#prevActive);\n        this.#prevActive = null;\n      }\n    };\n\n    eventBus.on(\n      \"annotationeditormodechanged\",\n      ({ mode }) => {\n        annotationEditorMode = mode;\n\n        if (mode === AnnotationEditorType.NONE) {\n          enableActive();\n        } else {\n          disableActive();\n        }\n      },\n      internalOpt\n    );\n\n    eventBus.on(\n      \"presentationmodechanged\",\n      ({ state }) => {\n        presentationModeState = state;\n\n        if (state === PresentationModeState.NORMAL) {\n          enableActive();\n        } else if (state === PresentationModeState.FULLSCREEN) {\n          disableActive();\n        }\n      },\n      internalOpt\n    );\n  }\n\n  /**\n   * @private\n   */\n  get _handTool() {\n    return shadow(\n      this,\n      \"_handTool\",\n      new GrabToPan({\n        element: this.container,\n      })\n    );\n  }\n}\n\nexport { PDFCursorTools };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n/** @typedef {import(\"./overlay_manager.js\").OverlayManager} OverlayManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/api.js\").PDFDocumentProxy} PDFDocumentProxy */\n\nimport { getPageSizeInches, isPortraitOrientation } from \"./ui_utils.js\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { PDFDateString } from \"pdfjs-lib\";\n\n// See https://en.wikibooks.org/wiki/Lentis/Conversion_to_the_Metric_Standard_in_the_United_States\nconst NON_METRIC_LOCALES = [\"en-us\", \"en-lr\", \"my\"];\n\n// Should use the format: `width x height`, in portrait orientation. The names,\n// which are l10n-ids, should be lowercase.\n// See https://en.wikipedia.org/wiki/Paper_size\nconst US_PAGE_NAMES = {\n  \"8.5x11\": \"pdfjs-document-properties-page-size-name-letter\",\n  \"8.5x14\": \"pdfjs-document-properties-page-size-name-legal\",\n};\nconst METRIC_PAGE_NAMES = {\n  \"297x420\": \"pdfjs-document-properties-page-size-name-a-three\",\n  \"210x297\": \"pdfjs-document-properties-page-size-name-a-four\",\n};\n\nfunction getPageName(size, isPortrait, pageNames) {\n  const width = isPortrait ? size.width : size.height;\n  const height = isPortrait ? size.height : size.width;\n\n  return pageNames[`${width}x${height}`];\n}\n\n/**\n * @typedef {Object} PDFDocumentPropertiesOptions\n * @property {HTMLDialogElement} dialog - The overlay's DOM element.\n * @property {Object} fields - Names and elements of the overlay's fields.\n * @property {HTMLButtonElement} closeButton - Button for closing the overlay.\n */\n\nclass PDFDocumentProperties {\n  #fieldData = null;\n\n  /**\n   * @param {PDFDocumentPropertiesOptions} options\n   * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n   * @param {EventBus} eventBus - The application event bus.\n   * @param {L10n} l10n - Localization service.\n   * @param {function} fileNameLookup - The function that is used to lookup\n   *   the document fileName.\n   */\n  constructor(\n    { dialog, fields, closeButton },\n    overlayManager,\n    eventBus,\n    l10n,\n    fileNameLookup,\n    titleLookup\n  ) {\n    this.dialog = dialog;\n    this.fields = fields;\n    this.overlayManager = overlayManager;\n    this.l10n = l10n;\n    this._fileNameLookup = fileNameLookup;\n    this._titleLookup = titleLookup;\n\n    this.#reset();\n    // Bind the event listener for the Close button.\n    closeButton.addEventListener(\"click\", this.close.bind(this));\n\n    this.overlayManager.register(this.dialog);\n\n    eventBus.on(\n      \"pagechanging\",\n      evt => {\n        this._currentPageNumber = evt.pageNumber;\n      },\n      internalOpt\n    );\n    eventBus.on(\n      \"rotationchanging\",\n      evt => {\n        this._pagesRotation = evt.pagesRotation;\n      },\n      internalOpt\n    );\n  }\n\n  /**\n   * Open the document properties overlay.\n   */\n  async open() {\n    await Promise.all([\n      this.overlayManager.open(this.dialog),\n      this._dataAvailableCapability.promise,\n    ]);\n    const currentPageNumber = this._currentPageNumber;\n    const pagesRotation = this._pagesRotation;\n\n    // If the document properties were previously fetched (for this PDF file),\n    // just update the dialog immediately to avoid redundant lookups.\n    if (\n      this.#fieldData &&\n      currentPageNumber === this.#fieldData._currentPageNumber &&\n      pagesRotation === this.#fieldData._pagesRotation\n    ) {\n      this.#updateUI();\n      return;\n    }\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      this._fieldDataLastUpdated = Date.now();\n    }\n\n    // Get the document properties.\n    const [\n      { info, metadata, /* contentDispositionFilename, */ contentLength },\n      pdfPage,\n    ] = await Promise.all([\n      this.pdfDocument.getMetadata(),\n      this.pdfDocument.getPage(currentPageNumber).catch(reason => {\n        console.error(\n          `PDFDocumentProperties - unable to get page ${currentPageNumber}.`,\n          reason\n        );\n        return null;\n      }),\n    ]);\n\n    const [\n      fileName,\n      fileSize,\n      title,\n      creationDate,\n      modificationDate,\n      pageSize,\n      isLinearized,\n    ] = await Promise.all([\n      this._fileNameLookup(),\n      this.#parseFileSize(contentLength),\n      this._titleLookup(),\n      this.#parseDate(metadata?.get(\"xmp:createdate\"), info.CreationDate),\n      this.#parseDate(metadata?.get(\"xmp:modifydate\"), info.ModDate),\n      this.#parsePageSize(pdfPage, pagesRotation),\n      this.#parseLinearization(info.IsLinearized),\n    ]);\n\n    this.#fieldData = Object.freeze({\n      fileName,\n      fileSize,\n      title,\n      author: metadata?.get(\"dc:creator\")?.join(\"\\n\") || info.Author,\n      subject: metadata?.get(\"dc:subject\")?.join(\"\\n\") || info.Subject,\n      keywords: metadata?.get(\"pdf:keywords\") || info.Keywords,\n      creationDate,\n      modificationDate,\n      creator: metadata?.get(\"xmp:creatortool\") || info.Creator,\n      producer: metadata?.get(\"pdf:producer\") || info.Producer,\n      version: info.PDFFormatVersion,\n      pageCount: this.pdfDocument.numPages,\n      pageSize,\n      linearized: isLinearized,\n      _currentPageNumber: currentPageNumber,\n      _pagesRotation: pagesRotation,\n    });\n    this.#updateUI();\n\n    // Get the correct fileSize, since it may not have been available\n    // or could potentially be wrong.\n    const { length } = await this.pdfDocument.getDownloadInfo();\n    if (contentLength === length) {\n      return; // The fileSize has already been correctly set.\n    }\n    const data = Object.assign(Object.create(null), this.#fieldData);\n    data.fileSize = await this.#parseFileSize(length);\n\n    this.#fieldData = Object.freeze(data);\n    this.#updateUI();\n  }\n\n  /**\n   * Close the document properties overlay.\n   */\n  async close() {\n    this.overlayManager.close(this.dialog);\n  }\n\n  /**\n   * Set a reference to the PDF document in order to populate the dialog fields\n   * with the document properties. Note that the dialog will contain no\n   * information if this method is not called.\n   *\n   * @param {PDFDocumentProxy} pdfDocument - A reference to the PDF document.\n   */\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this.#reset();\n      this.#updateUI();\n    }\n    if (!pdfDocument) {\n      return;\n    }\n    this.pdfDocument = pdfDocument;\n\n    this._dataAvailableCapability.resolve();\n  }\n\n  #reset() {\n    this.pdfDocument = null;\n\n    this.#fieldData = null;\n    this._dataAvailableCapability = Promise.withResolvers();\n    this._currentPageNumber = 1;\n    this._pagesRotation = 0;\n  }\n\n  /**\n   * Always updates all of the dialog fields, to prevent inconsistent UI state.\n   * NOTE: If the contents of a particular field is neither a non-empty string,\n   *       nor a number, it will fall back to \"-\".\n   */\n  #updateUI() {\n    if (this.#fieldData && this.overlayManager.active !== this.dialog) {\n      // Don't bother updating the dialog if it's already been closed,\n      // unless it's being reset (i.e. `this.#fieldData === null`),\n      // since it will be updated the next time `this.open` is called.\n      return;\n    }\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      this.dialog.dataset.fieldDataLastUpdated = this._fieldDataLastUpdated;\n    }\n    for (const id in this.fields) {\n      const content = this.#fieldData?.[id];\n      this.fields[id].textContent = content || content === 0 ? content : \"-\";\n    }\n  }\n\n  async #parseFileSize(b = 0) {\n    const kb = b / 1024,\n      mb = kb / 1024;\n    return kb\n      ? this.l10n.get(\n          mb >= 1\n            ? \"pdfjs-document-properties-size-mb\"\n            : \"pdfjs-document-properties-size-kb\",\n          { mb, kb, b }\n        )\n      : undefined;\n  }\n\n  async #parsePageSize(pdfPage, pagesRotation) {\n    if (!pdfPage) {\n      return undefined;\n    }\n    let pageSizeInches = getPageSizeInches(pdfPage);\n    // Take the viewer rotation into account as well; compare with Adobe Reader.\n    if (pagesRotation % 180 !== 0) {\n      pageSizeInches = {\n        width: pageSizeInches.height,\n        height: pageSizeInches.width,\n      };\n    }\n    const isPortrait = isPortraitOrientation(pageSizeInches),\n      nonMetric = NON_METRIC_LOCALES.includes(this.l10n.getLanguage());\n\n    let sizeInches = {\n      width: Math.round(pageSizeInches.width * 100) / 100,\n      height: Math.round(pageSizeInches.height * 100) / 100,\n    };\n    // 1in == 25.4mm; no need to round to 2 decimals for millimeters.\n    let sizeMillimeters = {\n      width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,\n      height: Math.round(pageSizeInches.height * 25.4 * 10) / 10,\n    };\n\n    let nameId =\n      getPageName(sizeInches, isPortrait, US_PAGE_NAMES) ||\n      getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);\n\n    if (\n      !nameId &&\n      !(\n        Number.isInteger(sizeMillimeters.width) &&\n        Number.isInteger(sizeMillimeters.height)\n      )\n    ) {\n      // Attempt to improve the page name detection by falling back to fuzzy\n      // matching of the metric dimensions, to account for e.g. rounding errors\n      // and/or PDF files that define the page sizes in an imprecise manner.\n      const exactMillimeters = {\n        width: pageSizeInches.width * 25.4,\n        height: pageSizeInches.height * 25.4,\n      };\n      const intMillimeters = {\n        width: Math.round(sizeMillimeters.width),\n        height: Math.round(sizeMillimeters.height),\n      };\n\n      // Try to avoid false positives, by only considering \"small\" differences.\n      if (\n        Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 &&\n        Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1\n      ) {\n        nameId = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);\n        if (nameId) {\n          // Update *both* sizes, computed above, to ensure that the displayed\n          // dimensions always correspond to the detected page name.\n          sizeInches = {\n            width: Math.round((intMillimeters.width / 25.4) * 100) / 100,\n            height: Math.round((intMillimeters.height / 25.4) * 100) / 100,\n          };\n          sizeMillimeters = intMillimeters;\n        }\n      }\n    }\n\n    const [{ width, height }, unit, name, orientation] = await Promise.all([\n      nonMetric ? sizeInches : sizeMillimeters,\n      this.l10n.get(\n        nonMetric\n          ? \"pdfjs-document-properties-page-size-unit-inches\"\n          : \"pdfjs-document-properties-page-size-unit-millimeters\"\n      ),\n      nameId && this.l10n.get(nameId),\n      this.l10n.get(\n        isPortrait\n          ? \"pdfjs-document-properties-page-size-orientation-portrait\"\n          : \"pdfjs-document-properties-page-size-orientation-landscape\"\n      ),\n    ]);\n\n    return this.l10n.get(\n      name\n        ? \"pdfjs-document-properties-page-size-dimension-name-string\"\n        : \"pdfjs-document-properties-page-size-dimension-string\",\n      { width, height, unit, name, orientation }\n    );\n  }\n\n  async #parseDate(metadataDate, infoDate) {\n    const dateObj =\n      Date.parse(metadataDate) || PDFDateString.toDateObject(infoDate);\n    return dateObj\n      ? this.l10n.get(\"pdfjs-document-properties-date-time-string\", {\n          dateObj: dateObj.valueOf(),\n        })\n      : undefined;\n  }\n\n  #parseLinearization(isLinearized) {\n    return this.l10n.get(\n      isLinearized\n        ? \"pdfjs-document-properties-linearized-yes\"\n        : \"pdfjs-document-properties-linearized-no\"\n    );\n  }\n}\n\nexport { PDFDocumentProperties };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest } from \"pdfjs-lib\";\n\nconst CharacterType = {\n  SPACE: 0,\n  ALPHA_LETTER: 1,\n  PUNCT: 2,\n  HAN_LETTER: 3,\n  KATAKANA_LETTER: 4,\n  HIRAGANA_LETTER: 5,\n  HALFWIDTH_KATAKANA_LETTER: 6,\n  THAI_LETTER: 7,\n};\n\nfunction isAlphabeticalScript(charCode) {\n  return charCode < 0x2e80;\n}\n\nfunction isAscii(charCode) {\n  return (charCode & 0xff80) === 0;\n}\n\nfunction isAsciiAlpha(charCode) {\n  return (\n    (charCode >= /* a = */ 0x61 && charCode <= /* z = */ 0x7a) ||\n    (charCode >= /* A = */ 0x41 && charCode <= /* Z = */ 0x5a)\n  );\n}\n\nfunction isAsciiDigit(charCode) {\n  return charCode >= /* 0 = */ 0x30 && charCode <= /* 9 = */ 0x39;\n}\n\nfunction isAsciiSpace(charCode) {\n  return (\n    charCode === /* SPACE = */ 0x20 ||\n    charCode === /* TAB = */ 0x09 ||\n    charCode === /* CR = */ 0x0d ||\n    charCode === /* LF = */ 0x0a\n  );\n}\n\nfunction isHan(charCode) {\n  return (\n    (charCode >= 0x3400 && charCode <= 0x9fff) ||\n    (charCode >= 0xf900 && charCode <= 0xfaff)\n  );\n}\n\nfunction isKatakana(charCode) {\n  return charCode >= 0x30a0 && charCode <= 0x30ff;\n}\n\nfunction isHiragana(charCode) {\n  return charCode >= 0x3040 && charCode <= 0x309f;\n}\n\nfunction isHalfwidthKatakana(charCode) {\n  return charCode >= 0xff60 && charCode <= 0xff9f;\n}\n\nfunction isThai(charCode) {\n  return (charCode & 0xff80) === 0x0e00;\n}\n\n/**\n * This function is based on the word-break detection implemented in:\n * https://hg.mozilla.org/mozilla-central/file/tip/intl/lwbrk/WordBreaker.cpp\n */\nfunction getCharacterType(charCode) {\n  if (isAlphabeticalScript(charCode)) {\n    if (isAscii(charCode)) {\n      if (isAsciiSpace(charCode)) {\n        return CharacterType.SPACE;\n      } else if (\n        isAsciiAlpha(charCode) ||\n        isAsciiDigit(charCode) ||\n        charCode === /* UNDERSCORE = */ 0x5f\n      ) {\n        return CharacterType.ALPHA_LETTER;\n      }\n      return CharacterType.PUNCT;\n    } else if (isThai(charCode)) {\n      return CharacterType.THAI_LETTER;\n    } else if (charCode === /* NBSP = */ 0xa0) {\n      return CharacterType.SPACE;\n    }\n    return CharacterType.ALPHA_LETTER;\n  }\n\n  if (isHan(charCode)) {\n    return CharacterType.HAN_LETTER;\n  } else if (isKatakana(charCode)) {\n    return CharacterType.KATAKANA_LETTER;\n  } else if (isHiragana(charCode)) {\n    return CharacterType.HIRAGANA_LETTER;\n  } else if (isHalfwidthKatakana(charCode)) {\n    return CharacterType.HALFWIDTH_KATAKANA_LETTER;\n  }\n  return CharacterType.ALPHA_LETTER;\n}\n\nlet NormalizeWithNFKC;\nfunction getNormalizeWithNFKC() {\n  if (\n    (typeof PDFJSDev === \"undefined\" && FeatureTest.platform.isFirefox) ||\n    (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\"))\n  ) {\n    // The `NormalizeWithNFKC` string is generated with the for loop below.\n    // Because of a small difference between Chrome and Firefox, the string is\n    // only hardcoded for Firefox, and Chrome (or others) will generate it at\n    // runtime.\n    // In order to detect if the string is up to date, a check is performed in\n    // the loop below, and if a difference is detected, an error is thrown.\n    /* eslint-disable no-irregular-whitespace */\n    NormalizeWithNFKC ||= `\\xA0篓陋炉虏-碌赂-潞录-戮牟-某目-艀艍趴莿-菍潜-浅拾-矢藰-藵藸-摔痛秃途蝿-螀螄蠍-蠔习-喜洗-系瞎謬俚-俑啷�-啷熰-唰澿啜赤ǘ喋�-喋涏喹�-喹澿赋嗪赤粶-嗷澿紝嘟冟綅嘟掄綏嘟溹僵醿坚船-岽窗-岽横醇-岬嶀祻-岬蹈岫�-岫酷簹-岷涐奖峤翅降峤丰焦峤会浇峋会窘-峥佱繅峥嬦繊-峥忈繐峥涐繚-峥熱浚峥凯-峥抗峥会拷-峥锯��-鈥娾�戔�椻��-鈥︹���-鈥粹��-鈥封�尖�锯亣-鈦夆仐鈦熲伆-鈦扁伌-鈧庘倫-鈧溾偍鈩�-鈩冣剠-鈩団剦-鈩撯剷-鈩栤剻-鈩濃劆-鈩⑩劋鈩︹劏鈩�-鈩劘-鈩扁劤-鈩光劵-鈪�鈪�-鈪夆厫-鈪库唹鈭�-鈭埊-鈭扳尒-鈱憼-鈸▽猢�-猢垛珳獗�-獗解弹夂熲怀饧�-饪曘��銆躲��-銆恒倹-銈溿偀銉裤劚-銌庛啋-銌熴垁-銏炪垹-銐囥墣-銐俱妧-銖筷殰-隁濌澃隉�-隉搓煾-隉龟瓬-戥熽铯�-铷嶏◥铷掞〞-铷烇铷ē-铷︼í-铹┌-铽欙瑎-铿嗭瑩-铿楋瑵铿�-铿讹-铿硷锃�-锃侊瓋-锃勶瓎-锂憋瘬-锎斤祼-锒忥稈-锓囷钒-锓硷笎-锔欙赴-锕勶箛-锕掞箶-锕︼龚-锕拱-锕诧勾锕�-锘硷紒-锞撅總-锟囷繆-锟忥繏-锟楋繗-锟滐繝-锟;\n  }\n\n  if (\n    typeof PDFJSDev === \"undefined\" ||\n    PDFJSDev.test(\"TESTING\") ||\n    (!PDFJSDev.test(\"MOZCENTRAL\") && !NormalizeWithNFKC)\n  ) {\n    const ranges = [];\n    const range = [];\n    const diacriticsRegex = /^\\p{M}$/u;\n    // Some chars must be replaced by their NFKC counterpart during a search.\n    for (let i = 0; i < 65536; i++) {\n      if (i >= 0xd800 && i <= 0xdfff) {\n        continue; // Skip surrogates since they're not valid Unicode scalar values.\n      }\n      const c = String.fromCharCode(i);\n      if (c.normalize(\"NFKC\") !== c && !diacriticsRegex.test(c)) {\n        if (range.length !== 2) {\n          range[0] = range[1] = i;\n          continue;\n        }\n        if (range[1] + 1 !== i) {\n          if (range[0] === range[1]) {\n            ranges.push(String.fromCharCode(range[0]));\n          } else {\n            ranges.push(\n              `${String.fromCharCode(range[0])}-${String.fromCharCode(\n                range[1]\n              )}`\n            );\n          }\n          range[0] = range[1] = i;\n        } else {\n          range[1] = i;\n        }\n      }\n    }\n\n    const rangesStr = ranges.join(\"\");\n    if (!NormalizeWithNFKC) {\n      NormalizeWithNFKC = rangesStr;\n    } else if (rangesStr !== NormalizeWithNFKC) {\n      for (let i = 1; i < rangesStr.length; i++) {\n        if (rangesStr[i] !== NormalizeWithNFKC[i]) {\n          console.log(\n            `Difference at index ${i}: ` +\n              `U+${rangesStr.charCodeAt(i).toString(16).toUpperCase().padStart(4, \"0\")}` +\n              `!== U+${NormalizeWithNFKC.charCodeAt(i)\n                .toString(16)\n                .toUpperCase()\n                .padStart(4, \"0\")}`\n          );\n          break;\n        }\n      }\n      throw new Error(\n        \"getNormalizeWithNFKC - update the `NormalizeWithNFKC` string.\"\n      );\n    }\n  }\n  return NormalizeWithNFKC;\n}\n\nexport { CharacterType, getCharacterType, getNormalizeWithNFKC };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFDocumentProxy} PDFDocumentProxy */\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./pdf_link_service.js\").PDFLinkService} PDFLinkService */\n\nimport { getCharacterType, getNormalizeWithNFKC } from \"./pdf_find_utils.js\";\nimport { binarySearchFirstItem } from \"./ui_utils.js\";\nimport { internalOpt } from \"./internal_evt.js\";\n\nconst FindState = {\n  FOUND: 0,\n  NOT_FOUND: 1,\n  WRAPPED: 2,\n  PENDING: 3,\n};\n\nconst CHARACTERS_TO_NORMALIZE = {\n  \"\\u2010\": \"-\", // Hyphen\n  \"\\u2018\": \"'\", // Left single quotation mark\n  \"\\u2019\": \"'\", // Right single quotation mark\n  \"\\u201A\": \"'\", // Single low-9 quotation mark\n  \"\\u201B\": \"'\", // Single high-reversed-9 quotation mark\n  \"\\u201C\": '\"', // Left double quotation mark\n  \"\\u201D\": '\"', // Right double quotation mark\n  \"\\u201E\": '\"', // Double low-9 quotation mark\n  \"\\u201F\": '\"', // Double high-reversed-9 quotation mark\n  \"\\u00BC\": \"1/4\", // Vulgar fraction one quarter\n  \"\\u00BD\": \"1/2\", // Vulgar fraction one half\n  \"\\u00BE\": \"3/4\", // Vulgar fraction three quarters\n};\n\n// These diacritics aren't considered as combining diacritics\n// when searching in a document:\n//   https://searchfox.org/mozilla-central/source/intl/unicharutil/util/is_combining_diacritic.py.\n// The combining class definitions can be found:\n//   https://www.unicode.org/reports/tr44/#Canonical_Combining_Class_Values\n// Category 0 corresponds to [^\\p{Mn}].\nconst DIACRITICS_EXCEPTION = new Set([\n  // UNICODE_COMBINING_CLASS_KANA_VOICING\n  // https://www.compart.com/fr/unicode/combining/8\n  0x3099, 0x309a,\n  // UNICODE_COMBINING_CLASS_VIRAMA (under 0xFFFF)\n  // https://www.compart.com/fr/unicode/combining/9\n  0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b,\n  0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714,\n  0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f,\n  0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed,\n  // 91\n  // https://www.compart.com/fr/unicode/combining/91\n  0x0c56,\n  // 129\n  // https://www.compart.com/fr/unicode/combining/129\n  0x0f71,\n  // 130\n  // https://www.compart.com/fr/unicode/combining/130\n  0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80,\n  // 132\n  // https://www.compart.com/fr/unicode/combining/132\n  0x0f74,\n]);\nlet DIACRITICS_EXCEPTION_STR; // Lazily initialized, see below.\n\nconst DIACRITICS_REG_EXP = /\\p{M}+/gu;\nconst SPECIAL_CHARS_REG_EXP = /([+^$|])|(\\p{P}+)|(\\s+)|(\\p{M})|(\\p{L})/gu;\nconst NOT_DIACRITIC_FROM_END_REG_EXP = /(\\P{M})\\p{M}*$/u;\nconst NOT_DIACRITIC_FROM_START_REG_EXP = /^\\p{M}*(\\P{M})/u;\n\n// The range [AC00-D7AF] corresponds to the Hangul syllables.\n// The few other chars are some CJK Compatibility Ideographs.\nconst SYLLABLES_REG_EXP = /[\\uAC00-\\uD7AF\\uFA6C\\uFACF-\\uFAD1\\uFAD5-\\uFAD7]+/g;\nconst SYLLABLES_LENGTHS = new Map();\n// When decomposed (in using NFD) the above syllables will start\n// with one of the chars in this regexp.\nconst FIRST_CHAR_SYLLABLES_REG_EXP =\n  \"[\\\\u1100-\\\\u1112\\\\ud7a4-\\\\ud7af\\\\ud84a\\\\ud84c\\\\ud850\\\\ud854\\\\ud857\\\\ud85f]\";\n\nconst NFKC_CHARS_TO_NORMALIZE = new Map();\n\nlet noSyllablesRegExp = null;\nlet withSyllablesRegExp = null;\n\nfunction normalize(text, options = {}) {\n  // The diacritics in the text or in the query can be composed or not.\n  // So we use a decomposed text using NFD (and the same for the query)\n  // in order to be sure that diacritics are in the same order.\n\n  // Collect syllables length and positions.\n  const syllablePositions = [];\n  let m;\n  while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) {\n    let { index } = m;\n    for (const char of m[0]) {\n      let len = SYLLABLES_LENGTHS.get(char);\n      if (!len) {\n        len = char.normalize(\"NFD\").length;\n        SYLLABLES_LENGTHS.set(char, len);\n      }\n      syllablePositions.push([len, index++]);\n    }\n  }\n\n  const hasSyllables = syllablePositions.length > 0;\n  const ignoreDashEOL = options.ignoreDashEOL ?? false;\n\n  let normalizationRegex;\n  if (!hasSyllables && noSyllablesRegExp) {\n    normalizationRegex = noSyllablesRegExp;\n  } else if (hasSyllables && withSyllablesRegExp) {\n    normalizationRegex = withSyllablesRegExp;\n  } else {\n    // Compile the regular expression for text normalization once.\n    const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(\"\");\n    const toNormalizeWithNFKC = getNormalizeWithNFKC();\n\n    // 3040-309F: Hiragana\n    // 30A0-30FF: Katakana\n    const CJK = \"(?:\\\\p{Ideographic}|[\\u3040-\\u30FF])\";\n    const HKDiacritics = \"(?:\\u3099|\\u309A)\";\n    const BrokenWord = `\\\\p{Ll}-\\\\n(?=\\\\p{Ll})|\\\\p{Lu}-\\\\n(?=\\\\p{L})`;\n\n    const regexps = [\n      /* p1 */ `[${replace}]`,\n      /* p2 */ `[${toNormalizeWithNFKC}]`,\n      /* p3 */ `${HKDiacritics}\\\\n`,\n      /* p4 */ \"\\\\p{M}+(?:-\\\\n)?\",\n      /* p5 */ `${BrokenWord}`,\n      /* p6 */ \"\\\\S-\\\\n\",\n      /* p7 */ `${CJK}\\\\n`,\n      /* p8 */ \"\\\\n\",\n      /* p9 */ hasSyllables\n        ? FIRST_CHAR_SYLLABLES_REG_EXP\n        : // Most of the syllables belong to Hangul so there are no need\n          // to search for them in a non-Hangul document.\n          // We use the \\0 in order to have the same number of groups.\n          \"\\\\u0000\",\n    ];\n    normalizationRegex = new RegExp(\n      regexps.map(r => `(${r})`).join(\"|\"),\n      \"gmu\"\n    );\n\n    if (hasSyllables) {\n      withSyllablesRegExp = normalizationRegex;\n    } else {\n      noSyllablesRegExp = normalizationRegex;\n    }\n  }\n\n  // The goal of this function is to normalize the string and\n  // be able to get from an index in the new string the\n  // corresponding index in the old string.\n  // For example if we have: abCd12ef456gh where C is replaced by ccc\n  // and numbers replaced by nothing (it's the case for diacritics), then\n  // we'll obtain the normalized string: abcccdefgh.\n  // So here the reverse map is: [0,1,2,2,2,3,6,7,11,12].\n\n  // The goal is to obtain the array: [[0, 0], [3, -1], [4, -2],\n  // [6, 0], [8, 3]].\n  // which can be used like this:\n  //  - let say that i is the index in new string and j the index\n  //    the old string.\n  //  - if i is in [0; 3[ then j = i + 0\n  //  - if i is in [3; 4[ then j = i - 1\n  //  - if i is in [4; 6[ then j = i - 2\n  //  ...\n  // Thanks to a binary search it's easy to know where is i and what's the\n  // shift.\n  // Let say that the last entry in the array is [x, s] and we have a\n  // substitution at index y (old string) which will replace o chars by n chars.\n  // Firstly, if o === n, then no need to add a new entry: the shift is\n  // the same.\n  // Secondly, if o < n, then we push the n - o elements:\n  // [y - (s - 1), s - 1], [y - (s - 2), s - 2], ...\n  // Thirdly, if o > n, then we push the element: [y - (s - n), o + s - n]\n\n  // Collect diacritics length and positions.\n  const rawDiacriticsPositions = [];\n  while ((m = DIACRITICS_REG_EXP.exec(text)) !== null) {\n    rawDiacriticsPositions.push([m[0].length, m.index]);\n  }\n\n  let normalized = text.normalize(\"NFD\");\n  const positions = [0, 0];\n  let rawDiacriticsIndex = 0;\n  let syllableIndex = 0;\n  let shift = 0;\n  let shiftOrigin = 0;\n  let eol = 0;\n  let hasDiacritics = false;\n\n  normalized = normalized.replace(\n    normalizationRegex,\n    (match, p1, p2, p3, p4, p5, p6, p7, p8, p9, i) => {\n      i -= shiftOrigin;\n      if (p1) {\n        // Maybe fractions or quotations mark...\n        const replacement = CHARACTERS_TO_NORMALIZE[p1];\n        const jj = replacement.length;\n        for (let j = 1; j < jj; j++) {\n          positions.push(i - shift + j, shift - j);\n        }\n        shift -= jj - 1;\n        return replacement;\n      }\n\n      if (p2) {\n        // Use the NFKC representation to normalize the char.\n        let replacement = NFKC_CHARS_TO_NORMALIZE.get(p2);\n        if (!replacement) {\n          replacement = p2.normalize(\"NFKC\");\n          NFKC_CHARS_TO_NORMALIZE.set(p2, replacement);\n        }\n        const jj = replacement.length;\n        for (let j = 1; j < jj; j++) {\n          positions.push(i - shift + j, shift - j);\n        }\n        shift -= jj - 1;\n        return replacement;\n      }\n\n      if (p3) {\n        // We've a Katakana-Hiragana diacritic followed by a \\n so don't replace\n        // the \\n by a whitespace.\n        hasDiacritics = true;\n\n        // Diacritic.\n        if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) {\n          ++rawDiacriticsIndex;\n        } else {\n          // i is the position of the first diacritic\n          // so (i - 1) is the position for the letter before.\n          positions.push(i - 1 - shift + 1, shift - 1);\n          shift -= 1;\n          shiftOrigin += 1;\n        }\n\n        // End-of-line.\n        positions.push(i - shift + 1, shift);\n        shiftOrigin += 1;\n        eol += 1;\n\n        return p3.charAt(0);\n      }\n\n      if (p4) {\n        const hasTrailingDashEOL = p4.endsWith(\"\\n\");\n        const len = hasTrailingDashEOL ? p4.length - 2 : p4.length;\n\n        // Diacritics.\n        hasDiacritics = true;\n        let jj = len;\n        if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) {\n          jj -= rawDiacriticsPositions[rawDiacriticsIndex][0];\n          ++rawDiacriticsIndex;\n        }\n\n        for (let j = 1; j <= jj; j++) {\n          // i is the position of the first diacritic\n          // so (i - 1) is the position for the letter before.\n          positions.push(i - 1 - shift + j, shift - j);\n        }\n        shift -= jj;\n        shiftOrigin += jj;\n\n        if (hasTrailingDashEOL) {\n          // Diacritics are followed by a -\\n.\n          // See comments in `if (p6)` block.\n          i += len - 1;\n          positions.push(i - shift + 1, 1 + shift);\n          shift += 1;\n          shiftOrigin += 1;\n          eol += 1;\n          return p4.slice(0, len);\n        }\n\n        return p4;\n      }\n\n      if (p5) {\n        if (ignoreDashEOL) {\n          // Keep the - but remove the EOL.\n          shiftOrigin += 1;\n          eol += 1;\n          return p5.slice(0, -1);\n        }\n        // In \"X-\\ny\", \"-\\n\" is removed because an hyphen at the end of a line\n        // between two letters is likely here to mark a break in a word.\n        // If X is encoded with UTF-32 then it can have a length greater than 1.\n        // The \\n isn't in the original text so here y = i, n = X.len - 2 and\n        // o = X.len - 1.\n        const len = p5.length - 2;\n        positions.push(i - shift + len, 1 + shift);\n        shift += 1;\n        shiftOrigin += 1;\n        eol += 1;\n        return p5.slice(0, -2);\n      }\n\n      if (p6) {\n        // A - following a non-space character that is not detected as the\n        // hyphen breaking a word in two lines needs to be preserved. It could\n        // be, for example, in a compound word or in a date.\n        // Only remove the newline.\n        shiftOrigin += 1;\n        eol += 1;\n        return p6.slice(0, -1);\n      }\n\n      if (p7) {\n        // An ideographic at the end of a line doesn't imply adding an extra\n        // white space.\n        // A CJK can be encoded in UTF-32, hence their length isn't always 1.\n        const len = p7.length - 1;\n        positions.push(i - shift + len, shift);\n        shiftOrigin += 1;\n        eol += 1;\n        return p7.slice(0, -1);\n      }\n\n      if (p8) {\n        // eol is replaced by space: \"foo\\nbar\" is likely equivalent to\n        // \"foo bar\".\n        positions.push(i - shift + 1, shift - 1);\n        shift -= 1;\n        shiftOrigin += 1;\n        eol += 1;\n        return \" \";\n      }\n\n      // p9\n      if (i + eol === syllablePositions[syllableIndex]?.[1]) {\n        // A syllable (1 char) is replaced with several chars (n) so\n        // newCharsLen = n - 1.\n        const newCharLen = syllablePositions[syllableIndex][0] - 1;\n        ++syllableIndex;\n        for (let j = 1; j <= newCharLen; j++) {\n          positions.push(i - (shift - j), shift - j);\n        }\n        shift -= newCharLen;\n        shiftOrigin += newCharLen;\n      }\n      return p9;\n    }\n  );\n\n  positions.push(normalized.length, shift);\n  const starts = new Uint32Array(positions.length >> 1);\n  const shifts = new Int32Array(positions.length >> 1);\n  for (let i = 0, ii = positions.length; i < ii; i += 2) {\n    starts[i >> 1] = positions[i];\n    shifts[i >> 1] = positions[i + 1];\n  }\n\n  return [normalized, [starts, shifts], hasDiacritics];\n}\n\n// Determine the original, non-normalized, match index such that highlighting of\n// search results is correct in the `textLayer` for strings containing e.g. \"陆\"\n// characters; essentially \"inverting\" the result of the `normalize` function.\nfunction getOriginalIndex(diffs, pos, len) {\n  if (!diffs) {\n    return [pos, len];\n  }\n\n  const [starts, shifts] = diffs;\n  // First char in the new string.\n  const start = pos;\n  // Last char in the new string.\n  const end = pos + len - 1;\n  let i = binarySearchFirstItem(starts, x => x >= start);\n  if (starts[i] > start) {\n    --i;\n  }\n\n  let j = binarySearchFirstItem(starts, x => x >= end, i);\n  if (starts[j] > end) {\n    --j;\n  }\n\n  // First char in the old string.\n  const oldStart = start + shifts[i];\n\n  // Last char in the old string.\n  const oldEnd = end + shifts[j];\n  const oldLen = oldEnd + 1 - oldStart;\n\n  return [oldStart, oldLen];\n}\n\n/**\n * @typedef {Object} PDFFindControllerOptions\n * @property {PDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [delay] - The number of milliseconds to delay execution of\n *   find commands. In the viewer each keystroke in the find bar triggers a\n *   `find` event, so this delay avoids triggering a search prematurely when the\n *   user is still typing the query. The default value is 250.\n * @property {boolean} [updateMatchesCountOnProgress] - True if the matches\n *   count must be updated on progress or only when the last page is reached.\n *   The default value is `true`.\n */\n\n/**\n * Provides search functionality to find a given string in a PDF document.\n */\nclass PDFFindController {\n  #state = null;\n\n  #updateMatchesCountOnProgress = true;\n\n  #delay = 0;\n\n  #visitedPagesCount = 0;\n\n  #copiedPageData = null;\n\n  #savedPageData = null;\n\n  /**\n   * @param {PDFFindControllerOptions} options\n   */\n  constructor({\n    linkService,\n    eventBus,\n    delay = 250,\n    updateMatchesCountOnProgress = true,\n  }) {\n    this._linkService = linkService;\n    this._eventBus = eventBus;\n    this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress;\n    this.#delay = delay;\n\n    /**\n     * Callback used to check if a `pageNumber` is currently visible.\n     * @type {function}\n     */\n    this.onIsPageVisible = null;\n\n    this.#reset();\n    eventBus.on(\"find\", this.#onFind.bind(this), internalOpt);\n    eventBus.on(\"findbarclose\", this.#onFindBarClose.bind(this), internalOpt);\n    eventBus.on(\"pagesedited\", this.#onPagesEdited.bind(this), internalOpt);\n  }\n\n  get highlightMatches() {\n    return this._highlightMatches;\n  }\n\n  get pageMatches() {\n    return this._pageMatches;\n  }\n\n  get pageMatchesLength() {\n    return this._pageMatchesLength;\n  }\n\n  get selected() {\n    return this._selected;\n  }\n\n  get state() {\n    return this.#state;\n  }\n\n  /**\n   * Set a reference to the PDF document in order to search it.\n   * Note that searching is not possible if this method is not called.\n   *\n   * @param {PDFDocumentProxy} pdfDocument - The PDF document to search.\n   */\n  setDocument(pdfDocument) {\n    if (this._pdfDocument) {\n      this.#reset();\n    }\n    if (!pdfDocument) {\n      return;\n    }\n    this._pdfDocument = pdfDocument;\n    this._firstPageCapability.resolve();\n  }\n\n  #onFind(state) {\n    if (!state) {\n      return;\n    }\n    const pdfDocument = this._pdfDocument;\n    const { type } = state;\n\n    if (this.#state === null || this.#shouldDirtyMatch(state)) {\n      this._dirtyMatch = true;\n    }\n    this.#state = state;\n    if (type !== \"highlightallchange\") {\n      this.#updateUIState(FindState.PENDING);\n    }\n\n    this._firstPageCapability.promise.then(() => {\n      // If the document was closed before searching began, or if the search\n      // operation was relevant for a previously opened document, do nothing.\n      if (\n        !this._pdfDocument ||\n        (pdfDocument && this._pdfDocument !== pdfDocument)\n      ) {\n        return;\n      }\n      this.#extractText();\n\n      const findbarClosed = !this._highlightMatches;\n      const pendingTimeout = !!this._findTimeout;\n\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n      if (!type) {\n        // Trigger the find action with a small delay to avoid starting the\n        // search when the user is still typing (saving resources).\n        this._findTimeout = setTimeout(() => {\n          this.#nextMatch();\n          this._findTimeout = null;\n        }, this.#delay);\n      } else if (this._dirtyMatch) {\n        // Immediately trigger searching for non-'find' operations, when the\n        // current state needs to be reset and matches re-calculated.\n        this.#nextMatch();\n      } else if (type === \"again\") {\n        this.#nextMatch();\n\n        // When the findbar was previously closed, and `highlightAll` is set,\n        // ensure that the matches on all active pages are highlighted again.\n        if (findbarClosed && this.#state.highlightAll) {\n          this.#updateAllPages();\n        }\n      } else if (type === \"highlightallchange\") {\n        // If there was a pending search operation, synchronously trigger a new\n        // search *first* to ensure that the correct matches are highlighted.\n        if (pendingTimeout) {\n          this.#nextMatch();\n        } else {\n          this._highlightMatches = true;\n        }\n        this.#updateAllPages(); // Update the highlighting on all active pages.\n      } else {\n        this.#nextMatch();\n      }\n    });\n  }\n\n  /**\n   * @typedef {Object} PDFFindControllerScrollMatchIntoViewParams\n   * @property {HTMLElement} element\n   * @property {number} pageIndex\n   * @property {number} matchIndex\n   */\n\n  /**\n   * Scroll the current match into view.\n   * @param {PDFFindControllerScrollMatchIntoViewParams}\n   */\n  scrollMatchIntoView({ element = null, pageIndex = -1, matchIndex = -1 }) {\n    if (!this._scrollMatches || !element) {\n      return;\n    } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {\n      return;\n    } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {\n      return;\n    }\n    this._scrollMatches = false; // Ensure that scrolling only happens once.\n    element.scrollIntoView({ block: \"start\", inline: \"center\" });\n  }\n\n  #reset() {\n    this._highlightMatches = false;\n    this._scrollMatches = false;\n    this._pdfDocument = null;\n    this._pageMatches = [];\n    this._pageMatchesLength = [];\n    this.#visitedPagesCount = 0;\n    this.#state = null;\n    // Currently selected match.\n    this._selected = {\n      pageIdx: -1,\n      matchIdx: -1,\n    };\n    // Where the find algorithm currently is in the document.\n    this._offset = {\n      pageIdx: null,\n      matchIdx: null,\n      wrapped: false,\n    };\n    this._extractTextPromises = [];\n    this._pageContents = []; // Stores the normalized text for each page.\n    this._pageDiffs = [];\n    this._hasDiacritics = [];\n    this._matchesCountTotal = 0;\n    this._pagesToSearch = null;\n    this._pendingFindMatches = new Set();\n    this._resumePageIdx = null;\n    this._dirtyMatch = false;\n    clearTimeout(this._findTimeout);\n    this._findTimeout = null;\n    this.#copiedPageData = null;\n\n    this._firstPageCapability = Promise.withResolvers();\n  }\n\n  /**\n   * @type {string|Array} The (current) normalized search query.\n   */\n  get #query() {\n    const { query } = this.#state;\n    if (typeof query === \"string\") {\n      if (query !== this._rawQuery) {\n        this._rawQuery = query;\n        [this._normalizedQuery] = normalize(query);\n      }\n      return this._normalizedQuery;\n    }\n    // We don't bother caching the normalized search query in the Array-case,\n    // since this code-path is *essentially* unused in the default viewer.\n    return (query || []).filter(q => !!q).map(q => normalize(q)[0]);\n  }\n\n  #shouldDirtyMatch(state) {\n    // When the search query changes, regardless of the actual search command\n    // used, always re-calculate matches to avoid errors (fixes bug 1030622).\n    const newQuery = state.query,\n      prevQuery = this.#state.query;\n    const newType = typeof newQuery,\n      prevType = typeof prevQuery;\n\n    if (newType !== prevType) {\n      return true;\n    }\n    if (newType === \"string\") {\n      if (newQuery !== prevQuery) {\n        return true;\n      }\n    } else if (\n      /* isArray && */ JSON.stringify(newQuery) !== JSON.stringify(prevQuery)\n    ) {\n      return true;\n    }\n\n    switch (state.type) {\n      case \"again\":\n        const pageNumber = this._selected.pageIdx + 1;\n        const linkService = this._linkService;\n        // Only treat a 'findagain' event as a new search operation when it's\n        // *absolutely* certain that the currently selected match is no longer\n        // visible, e.g. as a result of the user scrolling in the document.\n        //\n        // NOTE: If only a simple `this._linkService.page` check was used here,\n        // there's a risk that consecutive 'findagain' operations could \"skip\"\n        // over matches at the top/bottom of pages thus making them completely\n        // inaccessible when there's multiple pages visible in the viewer.\n        return (\n          pageNumber >= 1 &&\n          pageNumber <= linkService.pagesCount &&\n          pageNumber !== linkService.page &&\n          !(this.onIsPageVisible?.(pageNumber) ?? true)\n        );\n      case \"highlightallchange\":\n        return false;\n    }\n    return true;\n  }\n\n  /**\n   * Determine if the search query constitutes a \"whole word\", by comparing the\n   * first/last character type with the preceding/following character type.\n   */\n  #isEntireWord(content, startIdx, length) {\n    let match = content\n      .slice(0, startIdx)\n      .match(NOT_DIACRITIC_FROM_END_REG_EXP);\n    if (match) {\n      const first = content.charCodeAt(startIdx);\n      const limit = match[1].charCodeAt(0);\n      if (getCharacterType(first) === getCharacterType(limit)) {\n        return false;\n      }\n    }\n\n    match = content\n      .slice(startIdx + length)\n      .match(NOT_DIACRITIC_FROM_START_REG_EXP);\n    if (match) {\n      const last = content.charCodeAt(startIdx + length - 1);\n      const limit = match[1].charCodeAt(0);\n      if (getCharacterType(last) === getCharacterType(limit)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  #convertToRegExpString(query, hasDiacritics) {\n    const { matchDiacritics } = this.#state;\n    let isUnicode = false;\n    const addExtraWhitespaces = (original, fixed) => {\n      if (original === query) {\n        return fixed;\n      }\n      if (query.startsWith(original)) {\n        return `${fixed}[ ]*`;\n      }\n      if (query.endsWith(original)) {\n        return `[ ]*${fixed}`;\n      }\n      return `[ ]*${fixed}[ ]*`;\n    };\n    query = query.replaceAll(\n      SPECIAL_CHARS_REG_EXP,\n      (\n        match,\n        p1 /* to escape */,\n        p2 /* punctuation */,\n        p3 /* whitespaces */,\n        p4 /* diacritics */,\n        p5 /* letters */\n      ) => {\n        // We don't need to use a \\s for whitespaces since all the different\n        // kind of whitespaces are replaced by a single \" \".\n\n        if (p1) {\n          // Escape characters like *+?... to not interfere with regexp syntax.\n          return addExtraWhitespaces(p1, RegExp.escape(p1));\n        }\n        if (p2) {\n          // Allow whitespaces around group of punctuation signs.\n          return addExtraWhitespaces(p2, RegExp.escape(p2));\n        }\n        if (p3) {\n          // Replace spaces by \\s+ to be sure to match any spaces.\n          return \"[ ]+\";\n        }\n        if (matchDiacritics) {\n          return p4 || p5;\n        }\n\n        if (p4) {\n          // Diacritics are removed with few exceptions.\n          return DIACRITICS_EXCEPTION.has(p4.charCodeAt(0)) ? p4 : \"\";\n        }\n\n        // A letter has been matched and it can be followed by any diacritics\n        // in normalized text.\n        if (hasDiacritics) {\n          isUnicode = true;\n          return `${p5}\\\\p{M}*`;\n        }\n        return p5;\n      }\n    );\n\n    const trailingSpaces = \"[ ]*\";\n    if (query.endsWith(trailingSpaces)) {\n      // The [ ]* has been added in order to help to match \"foo . bar\" but\n      // it doesn't make sense to match some whitespaces after the dot\n      // when it's the last character.\n      query = query.slice(0, query.length - trailingSpaces.length);\n    }\n\n    if (matchDiacritics) {\n      // aX must not match aXY.\n      if (hasDiacritics) {\n        DIACRITICS_EXCEPTION_STR ||= String.fromCharCode(\n          ...DIACRITICS_EXCEPTION\n        );\n\n        isUnicode = true;\n        query = `${query}(?=[${DIACRITICS_EXCEPTION_STR}]|[^\\\\p{M}]|$)`;\n      }\n    }\n\n    return [isUnicode, query];\n  }\n\n  #calculateMatch(pageIndex) {\n    if (!this.#state) {\n      return;\n    }\n    const query = this.#query;\n    if (query.length === 0) {\n      return; // Do nothing: the matches should be wiped out already.\n    }\n    const pageContent = this._pageContents[pageIndex];\n    const matcherResult = this.match(query, pageContent, pageIndex);\n\n    const matches = (this._pageMatches[pageIndex] = []);\n    const matchesLength = (this._pageMatchesLength[pageIndex] = []);\n    const diffs = this._pageDiffs[pageIndex];\n\n    matcherResult?.forEach(({ index, length }) => {\n      const [matchPos, matchLen] = getOriginalIndex(diffs, index, length);\n      if (matchLen) {\n        matches.push(matchPos);\n        matchesLength.push(matchLen);\n      }\n    });\n\n    // When `highlightAll` is set, ensure that the matches on previously\n    // rendered (and still active) pages are correctly highlighted.\n    if (this.#state.highlightAll) {\n      this.#updatePage(pageIndex);\n    }\n    if (this._resumePageIdx === pageIndex) {\n      this._resumePageIdx = null;\n      this.#nextPageMatch();\n    }\n\n    // Update the match count.\n    const pageMatchesCount = matches.length;\n    this._matchesCountTotal += pageMatchesCount;\n    if (this.#updateMatchesCountOnProgress) {\n      if (pageMatchesCount > 0) {\n        this.#updateUIResultsCount();\n      }\n    } else if (++this.#visitedPagesCount === this._linkService.pagesCount) {\n      // For example, in GeckoView we want to have only the final update because\n      // the Java side provides only one object to update the counts.\n      this.#updateUIResultsCount();\n    }\n  }\n\n  /**\n   * @typedef {Object} FindMatch\n   * @property {number} index - The start of the matched text in the page's\n   *   string contents.\n   * @property {number} length - The length of the matched text.\n   */\n\n  /**\n   * @param {string | string[]} query - The search query.\n   * @param {string} pageContent - The text content of the page to search in.\n   * @param {number} pageIndex - The index of the page that is being processed.\n   * @returns {FindMatch[] | undefined} An array of matches in the provided\n   *   page.\n   */\n  match(query, pageContent, pageIndex) {\n    const hasDiacritics = this._hasDiacritics[pageIndex];\n\n    let isUnicode = false;\n    if (typeof query === \"string\") {\n      [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics);\n    } else {\n      // Words are sorted in reverse order to be sure that \"foobar\" is matched\n      // before \"foo\" in case the query is \"foobar foo\".\n      query = query\n        .sort()\n        .reverse()\n        .map(q => {\n          const [isUnicodePart, queryPart] = this.#convertToRegExpString(\n            q,\n            hasDiacritics\n          );\n          isUnicode ||= isUnicodePart;\n          return `(${queryPart})`;\n        })\n        .join(\"|\");\n    }\n    if (!query) {\n      // The query can be empty because some chars like diacritics could have\n      // been stripped out.\n      return undefined;\n    }\n\n    const { caseSensitive, entireWord } = this.#state;\n    const flags = `g${isUnicode ? \"u\" : \"\"}${caseSensitive ? \"\" : \"i\"}`;\n    query = new RegExp(query, flags);\n\n    const matches = [];\n    let match;\n    while ((match = query.exec(pageContent)) !== null) {\n      if (\n        entireWord &&\n        !this.#isEntireWord(pageContent, match.index, match[0].length)\n      ) {\n        continue;\n      }\n      matches.push({ index: match.index, length: match[0].length });\n    }\n    return matches;\n  }\n\n  #extractText() {\n    // Perform text extraction once if this method is called multiple times.\n    if (this._extractTextPromises.length > 0) {\n      return;\n    }\n\n    let deferred = Promise.resolve();\n    const textOptions = { disableNormalization: true };\n    const pdfDoc = this._pdfDocument;\n    for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {\n      const { promise, resolve } = Promise.withResolvers();\n      this._extractTextPromises[i] = promise;\n\n      deferred = deferred.then(async () => {\n        if (pdfDoc !== this._pdfDocument) {\n          resolve();\n          return;\n        }\n        try {\n          const pdfPage = await pdfDoc.getPage(i + 1);\n          const textContent = await pdfPage.getTextContent(textOptions);\n\n          if (pdfDoc !== this._pdfDocument) {\n            resolve();\n            return;\n          }\n          const strBuf = [];\n\n          for (const textItem of textContent.items) {\n            strBuf.push(textItem.str);\n            if (textItem.hasEOL) {\n              strBuf.push(\"\\n\");\n            }\n          }\n          // Store the normalized page content (text items) as one string.\n          [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] =\n            normalize(strBuf.join(\"\"));\n        } catch (ex) {\n          if (pdfDoc !== this._pdfDocument) {\n            resolve();\n            return;\n          }\n          console.error(`Unable to get text content for page ${i + 1}`, ex);\n          // Page error -- assuming no text content.\n          [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] =\n            [\"\", null, false];\n        }\n        resolve();\n      });\n    }\n  }\n\n  #updatePage(index) {\n    if (this._scrollMatches && this._selected.pageIdx === index) {\n      // If the page is selected, scroll the page into view, which triggers\n      // rendering the page, which adds the text layer. Once the text layer\n      // is built, it will attempt to scroll the selected match into view.\n      this._linkService.page = index + 1;\n    }\n\n    this._eventBus.dispatch(\"updatetextlayermatches\", {\n      source: this,\n      pageIndex: index,\n    });\n  }\n\n  #updateAllPages() {\n    this._eventBus.dispatch(\"updatetextlayermatches\", {\n      source: this,\n      pageIndex: -1,\n    });\n  }\n\n  #nextMatch() {\n    const previous = this.#state.findPrevious;\n    const currentPageIndex = this._linkService.page - 1;\n    const numPages = this._linkService.pagesCount;\n\n    this._highlightMatches = true;\n\n    if (this._dirtyMatch) {\n      // Need to recalculate the matches, reset everything.\n      this._dirtyMatch = false;\n      this._selected.pageIdx = this._selected.matchIdx = -1;\n      this._offset.pageIdx = currentPageIndex;\n      this._offset.matchIdx = null;\n      this._offset.wrapped = false;\n      this._resumePageIdx = null;\n      this._pageMatches.length = 0;\n      this._pageMatchesLength.length = 0;\n      this.#visitedPagesCount = 0;\n      this._matchesCountTotal = 0;\n\n      this.#updateAllPages(); // Wipe out any previously highlighted matches.\n\n      for (let i = 0; i < numPages; i++) {\n        // Start finding the matches as soon as the text is extracted.\n        if (this._pendingFindMatches.has(i)) {\n          continue;\n        }\n        this._pendingFindMatches.add(i);\n        this._extractTextPromises[i].then(() => {\n          this._pendingFindMatches.delete(i);\n          this.#calculateMatch(i);\n        });\n      }\n    }\n\n    // If there's no query there's no point in searching.\n    const query = this.#query;\n    if (query.length === 0) {\n      this.#updateUIState(FindState.FOUND);\n      return;\n    }\n    // If we're waiting on a page, we return since we can't do anything else.\n    if (this._resumePageIdx) {\n      return;\n    }\n\n    const offset = this._offset;\n    // Keep track of how many pages we should maximally iterate through.\n    this._pagesToSearch = numPages;\n    // If there's already a `matchIdx` that means we are iterating through a\n    // page's matches.\n    if (offset.matchIdx !== null) {\n      const numPageMatches = this._pageMatches[offset.pageIdx].length;\n      if (\n        (!previous && offset.matchIdx + 1 < numPageMatches) ||\n        (previous && offset.matchIdx > 0)\n      ) {\n        // The simple case; we just have advance the matchIdx to select\n        // the next match on the page.\n        offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\n        this.#updateMatch(/* found = */ true);\n        return;\n      }\n      // We went beyond the current page's matches, so we advance to\n      // the next page.\n      this.#advanceOffsetPage(previous);\n    }\n    // Start searching through the page.\n    this.#nextPageMatch();\n  }\n\n  #matchesReady(matches) {\n    const offset = this._offset;\n    const numMatches = matches.length;\n    const previous = this.#state.findPrevious;\n\n    if (numMatches) {\n      // There were matches for the page, so initialize `matchIdx`.\n      offset.matchIdx = previous ? numMatches - 1 : 0;\n      this.#updateMatch(/* found = */ true);\n      return true;\n    }\n    // No matches, so attempt to search the next page.\n    this.#advanceOffsetPage(previous);\n    if (offset.wrapped) {\n      offset.matchIdx = null;\n      if (this._pagesToSearch < 0) {\n        // No point in wrapping again, there were no matches.\n        this.#updateMatch(/* found = */ false);\n        // While matches were not found, searching for a page\n        // with matches should nevertheless halt.\n        return true;\n      }\n    }\n    // Matches were not found (and searching is not done).\n    return false;\n  }\n\n  #nextPageMatch() {\n    if (this._resumePageIdx !== null) {\n      console.error(\"There can only be one pending page.\");\n    }\n\n    let matches = null;\n    do {\n      const pageIdx = this._offset.pageIdx;\n      matches = this._pageMatches[pageIdx];\n      if (!matches) {\n        // The matches don't exist yet for processing by `_matchesReady`,\n        // so set a resume point for when they do exist.\n        this._resumePageIdx = pageIdx;\n        break;\n      }\n    } while (!this.#matchesReady(matches));\n  }\n\n  #advanceOffsetPage(previous) {\n    const offset = this._offset;\n    const numPages = this._linkService.pagesCount;\n    offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\n    offset.matchIdx = null;\n\n    this._pagesToSearch--;\n\n    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n      offset.pageIdx = previous ? numPages - 1 : 0;\n      offset.wrapped = true;\n    }\n  }\n\n  #updateMatch(found = false) {\n    let state = FindState.NOT_FOUND;\n    const wrapped = this._offset.wrapped;\n    this._offset.wrapped = false;\n\n    if (found) {\n      const previousPage = this._selected.pageIdx;\n      this._selected.pageIdx = this._offset.pageIdx;\n      this._selected.matchIdx = this._offset.matchIdx;\n      state = wrapped ? FindState.WRAPPED : FindState.FOUND;\n\n      // Update the currently selected page to wipe out any selected matches.\n      if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {\n        this.#updatePage(previousPage);\n      }\n    }\n\n    this.#updateUIState(state, this.#state.findPrevious);\n    if (this._selected.pageIdx !== -1) {\n      // Ensure that the match will be scrolled into view.\n      this._scrollMatches = true;\n\n      this.#updatePage(this._selected.pageIdx);\n    }\n  }\n\n  #onPagesEdited({ pagesMapper, type, pageNumbers }) {\n    if (this._extractTextPromises.length === 0) {\n      return;\n    }\n\n    if (type === \"copy\") {\n      const promises = new Map();\n      const contents = new Map();\n      const diffs = new Map();\n      const diacritics = new Map();\n      for (const pageNum of pageNumbers) {\n        promises.set(pageNum, this._extractTextPromises[pageNum - 1]);\n        contents.set(pageNum, this._pageContents[pageNum - 1]);\n        diffs.set(pageNum, this._pageDiffs[pageNum - 1]);\n        diacritics.set(pageNum, this._hasDiacritics[pageNum - 1]);\n      }\n      this.#copiedPageData = { promises, contents, diffs, diacritics };\n      return;\n    }\n\n    if (type === \"cancelCopy\") {\n      this.#copiedPageData = null;\n      return;\n    }\n\n    if (type === \"delete\") {\n      this.#savedPageData = {\n        promises: this._extractTextPromises,\n        contents: this._pageContents,\n        diffs: this._pageDiffs,\n        diacritics: this._hasDiacritics,\n      };\n    }\n\n    if (type === \"cancelDelete\") {\n      this._extractTextPromises = this.#savedPageData.promises;\n      this._pageContents = this.#savedPageData.contents;\n      this._pageDiffs = this.#savedPageData.diffs;\n      this._hasDiacritics = this.#savedPageData.diacritics;\n      return;\n    }\n\n    if (type === \"cleanSavedData\") {\n      this.#savedPageData = null;\n      return;\n    }\n\n    // Cancel any pending find timeout and clear a pending resume page index\n    // synchronously. Calling #onFindBarClose() here would schedule its cleanup\n    // asynchronously.\n    if (this._findTimeout) {\n      clearTimeout(this._findTimeout);\n      this._findTimeout = null;\n    }\n    this._resumePageIdx = null;\n    this._dirtyMatch = true;\n    const prevPromises = this._extractTextPromises;\n    const prevContents = this._pageContents;\n    const prevDiffs = this._pageDiffs;\n    const prevDiacritics = this._hasDiacritics;\n    const extractTextPromises = (this._extractTextPromises = []);\n    const pageContents = (this._pageContents = []);\n    const pageDiffs = (this._pageDiffs = []);\n    const hasDiacritics = (this._hasDiacritics = []);\n    for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) {\n      const prevPageNumber = pagesMapper.getPrevPageNumber(i);\n      if (prevPageNumber < 0) {\n        const src = -prevPageNumber;\n        extractTextPromises.push(\n          this.#copiedPageData?.promises.get(src) || Promise.resolve()\n        );\n        pageContents.push(this.#copiedPageData?.contents.get(src) ?? \"\");\n        pageDiffs.push(this.#copiedPageData?.diffs.get(src) ?? null);\n        hasDiacritics.push(this.#copiedPageData?.diacritics.get(src) ?? false);\n        continue;\n      }\n      extractTextPromises.push(\n        prevPromises[prevPageNumber - 1] || Promise.resolve()\n      );\n      pageContents.push(prevContents[prevPageNumber - 1] ?? \"\");\n      pageDiffs.push(prevDiffs[prevPageNumber - 1] ?? null);\n      hasDiacritics.push(prevDiacritics[prevPageNumber - 1] ?? false);\n    }\n    if (this.#state) {\n      this.#nextMatch();\n    }\n  }\n\n  #onFindBarClose(evt) {\n    const pdfDocument = this._pdfDocument;\n    // Since searching is asynchronous, ensure that the removal of highlighted\n    // matches (from the UI) is async too such that the 'updatetextlayermatches'\n    // events will always be dispatched in the expected order.\n    this._firstPageCapability.promise.then(() => {\n      // Only update the UI if the document is open, and is the current one.\n      if (\n        !this._pdfDocument ||\n        (pdfDocument && this._pdfDocument !== pdfDocument)\n      ) {\n        return;\n      }\n      // Ensure that a pending, not yet started, search operation is aborted.\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n      // Abort any long running searches, to avoid a match being scrolled into\n      // view *after* the findbar has been closed. In this case `this._offset`\n      // will most likely differ from `this._selected`, hence we also ensure\n      // that any new search operation will always start with a clean slate.\n      if (this._resumePageIdx) {\n        this._resumePageIdx = null;\n        this._dirtyMatch = true;\n      }\n      // Avoid the UI being in a pending state when the findbar is re-opened.\n      this.#updateUIState(FindState.FOUND);\n\n      this._highlightMatches = false;\n      this.#updateAllPages(); // Wipe out any previously highlighted matches.\n    });\n  }\n\n  #requestMatchesCount() {\n    const { pageIdx, matchIdx } = this._selected;\n    let current = 0,\n      total = this._matchesCountTotal;\n    if (matchIdx !== -1) {\n      for (let i = 0; i < pageIdx; i++) {\n        current += this._pageMatches[i]?.length || 0;\n      }\n      current += matchIdx + 1;\n    }\n    // When searching starts, this method may be called before the `pageMatches`\n    // have been counted (in `#calculateMatch`). Ensure that the UI won't show\n    // temporarily broken state when the active find result doesn't make sense.\n    if (current < 1 || current > total) {\n      current = total = 0;\n    }\n    return { current, total };\n  }\n\n  #updateUIResultsCount() {\n    this._eventBus.dispatch(\"updatefindmatchescount\", {\n      source: this,\n      matchesCount: this.#requestMatchesCount(),\n    });\n  }\n\n  #updateUIState(state, previous = false) {\n    if (\n      !this.#updateMatchesCountOnProgress &&\n      (this.#visitedPagesCount !== this._linkService.pagesCount ||\n        state === FindState.PENDING)\n    ) {\n      // When this.#updateMatchesCountOnProgress is false we only send an update\n      // when everything is ready.\n      return;\n    }\n\n    this._eventBus.dispatch(\"updatefindcontrolstate\", {\n      source: this,\n      state,\n      previous,\n      entireWord: this.#state?.entireWord ?? null,\n      matchesCount: this.#requestMatchesCount(),\n      rawQuery: this.#state?.query ?? null,\n    });\n  }\n}\n\nexport { FindState, getOriginalIndex, normalize, PDFFindController };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FindState } from \"./pdf_find_controller.js\";\nimport { toggleExpandedBtn } from \"./ui_utils.js\";\n\nconst MATCHES_COUNT_LIMIT = 1000;\n\n/**\n * Creates a \"search bar\" given a set of DOM elements that act as controls\n * for searching or for setting search preferences in the UI. This object\n * also sets up the appropriate events for the controls. Actual searching\n * is done by PDFFindController.\n */\nclass PDFFindBar {\n  #mainContainer;\n\n  #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this));\n\n  opened = false;\n\n  constructor(options, mainContainer, eventBus) {\n    this.bar = options.bar;\n    this.toggleButton = options.toggleButton;\n    this.findField = options.findField;\n    this.highlightAll = options.highlightAllCheckbox;\n    this.caseSensitive = options.caseSensitiveCheckbox;\n    this.matchDiacritics = options.matchDiacriticsCheckbox;\n    this.entireWord = options.entireWordCheckbox;\n    this.findMsg = options.findMsg;\n    this.findResultsCount = options.findResultsCount;\n    this.findPreviousButton = options.findPreviousButton;\n    this.findNextButton = options.findNextButton;\n    this.eventBus = eventBus;\n    this.#mainContainer = mainContainer;\n\n    const checkedInputs = new Map([\n      [this.highlightAll, \"highlightallchange\"],\n      [this.caseSensitive, \"casesensitivitychange\"],\n      [this.entireWord, \"entirewordchange\"],\n      [this.matchDiacritics, \"diacriticmatchingchange\"],\n    ]);\n\n    // Add event listeners to the DOM elements.\n    this.toggleButton.addEventListener(\"click\", () => {\n      this.toggle();\n    });\n\n    this.findField.addEventListener(\"input\", () => {\n      this.dispatchEvent(\"\");\n    });\n\n    this.bar.addEventListener(\"keydown\", ({ keyCode, shiftKey, target }) => {\n      switch (keyCode) {\n        case 13: // Enter\n          if (target === this.findField) {\n            this.dispatchEvent(\"again\", shiftKey);\n          } else if (checkedInputs.has(target)) {\n            target.checked = !target.checked;\n            this.dispatchEvent(/* evtName = */ checkedInputs.get(target));\n          }\n          break;\n        case 27: // Escape\n          this.close();\n          break;\n      }\n    });\n\n    this.findPreviousButton.addEventListener(\"click\", () => {\n      this.dispatchEvent(\"again\", true);\n    });\n    this.findNextButton.addEventListener(\"click\", () => {\n      this.dispatchEvent(\"again\", false);\n    });\n\n    for (const [elem, evtName] of checkedInputs) {\n      elem.addEventListener(\"click\", () => {\n        this.dispatchEvent(evtName);\n      });\n    }\n  }\n\n  reset() {\n    this.updateUIState();\n  }\n\n  dispatchEvent(type, findPrev = false) {\n    this.eventBus.dispatch(\"find\", {\n      source: this,\n      type,\n      query: this.findField.value,\n      caseSensitive: this.caseSensitive.checked,\n      entireWord: this.entireWord.checked,\n      highlightAll: this.highlightAll.checked,\n      findPrevious: findPrev,\n      matchDiacritics: this.matchDiacritics.checked,\n    });\n  }\n\n  updateUIState(state, previous, matchesCount) {\n    const { findField, findMsg } = this;\n    let findMsgId = \"\",\n      status = \"\";\n\n    switch (state) {\n      case FindState.FOUND:\n        break;\n      case FindState.PENDING:\n        status = \"pending\";\n        break;\n      case FindState.NOT_FOUND:\n        findMsgId = \"pdfjs-find-not-found\";\n        status = \"notFound\";\n        break;\n      case FindState.WRAPPED:\n        findMsgId = previous\n          ? \"pdfjs-find-reached-top\"\n          : \"pdfjs-find-reached-bottom\";\n        break;\n    }\n    findField.setAttribute(\"data-status\", status);\n    findField.setAttribute(\"aria-invalid\", state === FindState.NOT_FOUND);\n\n    findMsg.setAttribute(\"data-status\", status);\n    if (findMsgId) {\n      findMsg.setAttribute(\"data-l10n-id\", findMsgId);\n    } else {\n      findMsg.removeAttribute(\"data-l10n-id\");\n      findMsg.textContent = \"\";\n    }\n\n    this.updateResultsCount(matchesCount);\n  }\n\n  updateResultsCount({ current = 0, total = 0 } = {}) {\n    const { findResultsCount } = this;\n\n    if (total > 0) {\n      const limit = MATCHES_COUNT_LIMIT;\n\n      findResultsCount.setAttribute(\n        \"data-l10n-id\",\n        total > limit\n          ? \"pdfjs-find-match-count-limit\"\n          : \"pdfjs-find-match-count\"\n      );\n      findResultsCount.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({ limit, current, total })\n      );\n    } else {\n      findResultsCount.removeAttribute(\"data-l10n-id\");\n      findResultsCount.textContent = \"\";\n    }\n  }\n\n  open() {\n    if (!this.opened) {\n      // Potentially update the findbar layout, row vs column, when:\n      //  - The width of the viewer itself changes.\n      //  - The width of the findbar changes, by toggling the visibility\n      //    (or localization) of find count/status messages.\n      this.#resizeObserver.observe(this.#mainContainer);\n      this.#resizeObserver.observe(this.bar);\n\n      this.opened = true;\n      toggleExpandedBtn(this.toggleButton, true, this.bar);\n    }\n    this.findField.select();\n    this.findField.focus();\n  }\n\n  close() {\n    if (!this.opened) {\n      return;\n    }\n    this.#resizeObserver.disconnect();\n\n    this.opened = false;\n    toggleExpandedBtn(this.toggleButton, false, this.bar);\n\n    this.eventBus.dispatch(\"findbarclose\", { source: this });\n  }\n\n  toggle() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  #resizeObserverCallback() {\n    const { bar } = this;\n    // The find bar has an absolute position and thus the browser extends\n    // its width to the maximum possible width once the find bar does not fit\n    // entirely within the window anymore (and its elements are automatically\n    // wrapped). Here we detect and fix that.\n    bar.classList.remove(\"wrapContainers\");\n\n    const findbarHeight = bar.clientHeight;\n    const inputContainerHeight = bar.firstElementChild.clientHeight;\n\n    if (findbarHeight > inputContainerHeight) {\n      // The findbar is taller than the input container, which means that\n      // the browser wrapped some of the elements. For a consistent look,\n      // wrap all of them to adjust the width of the find bar.\n      bar.classList.add(\"wrapContainers\");\n    }\n  }\n}\n\nexport { PDFFindBar };\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./pdf_link_service.js\").PDFLinkService} PDFLinkService */\n\nimport { isValidRotation, parseQueryString } from \"./ui_utils.js\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { updateUrlHash } from \"pdfjs-lib\";\nimport { waitOnEventOrTimeout } from \"./event_utils.js\";\n\n// Heuristic value used when force-resetting `this._blockHashChange`.\nconst HASH_CHANGE_TIMEOUT = 1000; // milliseconds\n// Heuristic value used when adding the current position to the browser history.\nconst POSITION_UPDATED_THRESHOLD = 50;\n// Heuristic value used when adding a temporary position to the browser history.\nconst UPDATE_VIEWAREA_TIMEOUT = 1000; // milliseconds\n\n/**\n * @typedef {Object} PDFHistoryOptions\n * @property {PDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * @typedef {Object} InitializeParameters\n * @property {string} fingerprint - The PDF document's unique fingerprint.\n * @property {boolean} [resetHistory] - Reset the browsing history.\n * @property {boolean} [updateUrl] - Attempt to update the document URL, with\n *   the current hash, when pushing/replacing browser history entries.\n */\n\n/**\n * @typedef {Object} PushParameters\n * @property {string} [namedDest] - The named destination. If absent, a\n *   stringified version of `explicitDest` is used.\n * @property {Array} explicitDest - The explicit destination array.\n * @property {number} pageNumber - The page to which the destination points.\n */\n\nfunction getCurrentHash() {\n  return document.location.hash;\n}\n\nclass PDFHistory {\n  #eventAC = null;\n\n  /**\n   * @param {PDFHistoryOptions} options\n   */\n  constructor({ linkService, eventBus }) {\n    this.linkService = linkService;\n    this.eventBus = eventBus;\n\n    this._initialized = false;\n    this._fingerprint = \"\";\n    this.reset();\n\n    // Ensure that we don't miss a \"pagesinit\" event,\n    // by registering the listener immediately.\n    this.eventBus.on(\n      \"pagesinit\",\n      () => {\n        this._isPagesLoaded = false;\n\n        this.eventBus.on(\n          \"pagesloaded\",\n          evt => {\n            this._isPagesLoaded = !!evt.pagesCount;\n          },\n          { once: true, ...internalOpt }\n        );\n      },\n      internalOpt\n    );\n  }\n\n  /**\n   * Initialize the history for the PDF document, using either the current\n   * browser history entry or the document hash, whichever is present.\n   * @param {InitializeParameters} params\n   */\n  initialize({ fingerprint, resetHistory = false, updateUrl = false }) {\n    if (!fingerprint || typeof fingerprint !== \"string\") {\n      console.error(\n        'PDFHistory.initialize: The \"fingerprint\" must be a non-empty string.'\n      );\n      return;\n    }\n    // Ensure that any old state is always reset upon initialization.\n    if (this._initialized) {\n      this.reset();\n    }\n    const reInitialized =\n      this._fingerprint !== \"\" && this._fingerprint !== fingerprint;\n    this._fingerprint = fingerprint;\n    this._updateUrl = updateUrl === true;\n\n    this._initialized = true;\n    this.#bindEvents();\n    const state = window.history.state;\n\n    this._popStateInProgress = false;\n    this._blockHashChange = 0;\n    this._currentHash = getCurrentHash();\n    this._numPositionUpdates = 0;\n\n    this._uid = this._maxUid = 0;\n    this._destination = null;\n    this._position = null;\n\n    if (!this.#isValidState(state, /* checkReload = */ true) || resetHistory) {\n      const { hash, page, rotation } = this.#parseCurrentHash(\n        /* checkNameddest = */ true\n      );\n\n      if (!hash || reInitialized || resetHistory) {\n        // Ensure that the browser history is reset on PDF document load.\n        this.#pushOrReplaceState(null, /* forceReplace = */ true);\n        return;\n      }\n      // Ensure that the browser history is initialized correctly when\n      // the document hash is present on PDF document load.\n      this.#pushOrReplaceState(\n        { hash, page, rotation },\n        /* forceReplace = */ true\n      );\n      return;\n    }\n\n    // The browser history contains a valid entry, ensure that the history is\n    // initialized correctly on PDF document load.\n    const destination = state.destination;\n    this.#updateInternalState(\n      destination,\n      state.uid,\n      /* removeTemporary = */ true\n    );\n\n    if (destination.rotation !== undefined) {\n      this._initialRotation = destination.rotation;\n    }\n    if (destination.dest) {\n      this._initialBookmark = JSON.stringify(destination.dest);\n\n      // If the history is updated, e.g. through the user changing the hash,\n      // before the initial destination has become visible, then we do *not*\n      // want to potentially add `this._position` to the browser history.\n      this._destination.page = null;\n    } else if (destination.hash) {\n      this._initialBookmark = destination.hash;\n    } else if (destination.page) {\n      // Fallback case; shouldn't be necessary, but better safe than sorry.\n      this._initialBookmark = `page=${destination.page}`;\n    }\n  }\n\n  /**\n   * Reset the current `PDFHistory` instance, and consequently prevent any\n   * further updates and/or navigation of the browser history.\n   */\n  reset() {\n    if (this._initialized) {\n      this.#pageHide(); // Simulate a 'pagehide' event when resetting.\n\n      this._initialized = false;\n      this.#unbindEvents();\n    }\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n    this._initialBookmark = null;\n    this._initialRotation = null;\n  }\n\n  /**\n   * Push an internal destination to the browser history.\n   * @param {PushParameters}\n   */\n  push({ namedDest = null, explicitDest, pageNumber }) {\n    if (!this._initialized) {\n      return;\n    }\n    if (namedDest && typeof namedDest !== \"string\") {\n      console.error(\n        \"PDFHistory.push: \" +\n          `\"${namedDest}\" is not a valid namedDest parameter.`\n      );\n      return;\n    } else if (!Array.isArray(explicitDest)) {\n      console.error(\n        \"PDFHistory.push: \" +\n          `\"${explicitDest}\" is not a valid explicitDest parameter.`\n      );\n      return;\n    } else if (!this.#isValidPage(pageNumber)) {\n      // Allow an unset `pageNumber` if and only if the history is still empty;\n      // please refer to the `this._destination.page = null;` comment above.\n      if (pageNumber !== null || this._destination) {\n        console.error(\n          \"PDFHistory.push: \" +\n            `\"${pageNumber}\" is not a valid pageNumber parameter.`\n        );\n        return;\n      }\n    }\n\n    const hash = namedDest || JSON.stringify(explicitDest);\n    if (!hash) {\n      // The hash *should* never be undefined, but if that were to occur,\n      // avoid any possible issues by not updating the browser history.\n      return;\n    }\n\n    let forceReplace = false;\n    if (\n      this._destination &&\n      (isDestHashesEqual(this._destination.hash, hash) ||\n        isDestArraysEqual(this._destination.dest, explicitDest))\n    ) {\n      // When the new destination is identical to `this._destination`, and\n      // its `page` is undefined, replace the current browser history entry.\n      // NOTE: This can only occur if `this._destination` was set either:\n      //  - through the document hash being specified on load.\n      //  - through the user changing the hash of the document.\n      if (this._destination.page) {\n        return;\n      }\n      forceReplace = true;\n    }\n    if (this._popStateInProgress && !forceReplace) {\n      return;\n    }\n\n    this.#pushOrReplaceState(\n      {\n        dest: explicitDest,\n        hash,\n        page: pageNumber,\n        rotation: this.linkService.rotation,\n      },\n      forceReplace\n    );\n\n    if (!this._popStateInProgress) {\n      // Prevent the browser history from updating while the new destination is\n      // being scrolled into view, to avoid potentially inconsistent state.\n      this._popStateInProgress = true;\n      // We defer the resetting of `this._popStateInProgress`, to account for\n      // e.g. zooming occurring when the new destination is being navigated to.\n      Promise.resolve().then(() => {\n        this._popStateInProgress = false;\n      });\n    }\n  }\n\n  /**\n   * Push a page to the browser history; generally the `push` method should be\n   * used instead.\n   * @param {number} pageNumber\n   */\n  pushPage(pageNumber) {\n    if (!this._initialized) {\n      return;\n    }\n    if (!this.#isValidPage(pageNumber)) {\n      console.error(\n        `PDFHistory.pushPage: \"${pageNumber}\" is not a valid page number.`\n      );\n      return;\n    }\n\n    if (this._destination?.page === pageNumber) {\n      // When the new page is identical to the one in `this._destination`, we\n      // don't want to add a potential duplicate entry in the browser history.\n      return;\n    }\n    if (this._popStateInProgress) {\n      return;\n    }\n\n    this.#pushOrReplaceState({\n      // Simulate an internal destination, for `this.#tryPushCurrentPosition`:\n      dest: null,\n      hash: `page=${pageNumber}`,\n      page: pageNumber,\n      rotation: this.linkService.rotation,\n    });\n\n    if (!this._popStateInProgress) {\n      // Prevent the browser history from updating while the new page is\n      // being scrolled into view, to avoid potentially inconsistent state.\n      this._popStateInProgress = true;\n      // We defer the resetting of `this._popStateInProgress`, to account for\n      // e.g. zooming occurring when the new page is being navigated to.\n      Promise.resolve().then(() => {\n        this._popStateInProgress = false;\n      });\n    }\n  }\n\n  /**\n   * Push the current position to the browser history.\n   */\n  pushCurrentPosition() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    this.#tryPushCurrentPosition();\n  }\n\n  /**\n   * Go back one step in the browser history.\n   * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n   */\n  back() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    const state = window.history.state;\n    if (this.#isValidState(state) && state.uid > 0) {\n      window.history.back();\n    }\n  }\n\n  /**\n   * Go forward one step in the browser history.\n   * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n   */\n  forward() {\n    if (!this._initialized || this._popStateInProgress) {\n      return;\n    }\n    const state = window.history.state;\n    if (this.#isValidState(state) && state.uid < this._maxUid) {\n      window.history.forward();\n    }\n  }\n\n  /**\n   * @type {boolean} Indicating if the user is currently moving through the\n   *   browser history, useful e.g. for skipping the next 'hashchange' event.\n   */\n  get popStateInProgress() {\n    return (\n      this._initialized &&\n      (this._popStateInProgress || this._blockHashChange > 0)\n    );\n  }\n\n  get initialBookmark() {\n    return this._initialized ? this._initialBookmark : null;\n  }\n\n  get initialRotation() {\n    return this._initialized ? this._initialRotation : null;\n  }\n\n  #pushOrReplaceState(destination, forceReplace = false) {\n    const shouldReplace = forceReplace || !this._destination;\n    const newState = {\n      fingerprint: this._fingerprint,\n      uid: shouldReplace ? this._uid : this._uid + 1,\n      destination,\n    };\n\n    if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"CHROME\") &&\n      window.history.state?.chromecomState\n    ) {\n      // history.state.chromecomState is managed by chromecom.js.\n      newState.chromecomState = window.history.state.chromecomState;\n    }\n    this.#updateInternalState(destination, newState.uid);\n\n    let newUrl;\n    if (this._updateUrl && destination?.hash) {\n      const { href, protocol } = document.location;\n      if (protocol !== \"file:\") {\n        newUrl = updateUrlHash(href, destination.hash);\n      }\n    }\n    if (shouldReplace) {\n      window.history.replaceState(newState, \"\", newUrl);\n    } else {\n      window.history.pushState(newState, \"\", newUrl);\n    }\n  }\n\n  #tryPushCurrentPosition(temporary = false) {\n    if (!this._position) {\n      return;\n    }\n    let position = this._position;\n    if (temporary) {\n      position = Object.assign(Object.create(null), this._position);\n      position.temporary = true;\n    }\n\n    if (!this._destination) {\n      this.#pushOrReplaceState(position);\n      return;\n    }\n    if (this._destination.temporary) {\n      // Always replace a previous *temporary* position.\n      this.#pushOrReplaceState(position, /* forceReplace = */ true);\n      return;\n    }\n    if (this._destination.hash === position.hash) {\n      return; // The current document position has not changed.\n    }\n    if (\n      !this._destination.page &&\n      (POSITION_UPDATED_THRESHOLD <= 0 ||\n        this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)\n    ) {\n      // `this._destination` was set through the user changing the hash of\n      // the document. Do not add `this._position` to the browser history,\n      // to avoid \"flooding\" it with lots of (nearly) identical entries,\n      // since we cannot ensure that the document position has changed.\n      return;\n    }\n\n    let forceReplace = false;\n    if (\n      this._destination.page >= position.first &&\n      this._destination.page <= position.page\n    ) {\n      // When the `page` of `this._destination` is still visible, do not\n      // update the browsing history when `this._destination` either:\n      //  - contains an internal destination, since in this case we\n      //    cannot ensure that the document position has actually changed.\n      //  - was set through the user changing the hash of the document.\n      if (this._destination.dest !== undefined || !this._destination.first) {\n        return;\n      }\n      // To avoid \"flooding\" the browser history, replace the current entry.\n      forceReplace = true;\n    }\n    this.#pushOrReplaceState(position, forceReplace);\n  }\n\n  #isValidPage(val) {\n    return (\n      Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount\n    );\n  }\n\n  #isValidState(state, checkReload = false) {\n    if (!state) {\n      return false;\n    }\n    if (state.fingerprint !== this._fingerprint) {\n      if (checkReload) {\n        // Potentially accept the history entry, even if the fingerprints don't\n        // match, when the viewer was reloaded (see issue 6847).\n        if (\n          typeof state.fingerprint !== \"string\" ||\n          state.fingerprint.length !== this._fingerprint.length\n        ) {\n          return false;\n        }\n        const [perfEntry] = performance.getEntriesByType(\"navigation\");\n        if (perfEntry?.type !== \"reload\") {\n          return false;\n        }\n      } else {\n        // This should only occur in viewers with support for opening more than\n        // one PDF document, e.g. the GENERIC viewer.\n        return false;\n      }\n    }\n    if (!Number.isInteger(state.uid) || state.uid < 0) {\n      return false;\n    }\n    if (state.destination === null || typeof state.destination !== \"object\") {\n      return false;\n    }\n    return true;\n  }\n\n  #updateInternalState(destination, uid, removeTemporary = false) {\n    if (this._updateViewareaTimeout) {\n      // When updating `this._destination`, make sure that we always wait for\n      // the next 'updateviewarea' event before (potentially) attempting to\n      // push the current position to the browser history.\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n    if (removeTemporary && destination?.temporary) {\n      // When the `destination` comes from the browser history,\n      // we no longer treat it as a *temporary* position.\n      delete destination.temporary;\n    }\n    this._destination = destination;\n    this._uid = uid;\n    this._maxUid = Math.max(this._maxUid, uid);\n    // This should always be reset when `this._destination` is updated.\n    this._numPositionUpdates = 0;\n  }\n\n  #parseCurrentHash(checkNameddest = false) {\n    const hash = unescape(getCurrentHash()).substring(1);\n    const params = parseQueryString(hash);\n\n    const nameddest = params.get(\"nameddest\") || \"\";\n    let page = params.get(\"page\") | 0;\n\n    if (!this.#isValidPage(page) || (checkNameddest && nameddest.length > 0)) {\n      page = null;\n    }\n    return { hash, page, rotation: this.linkService.rotation };\n  }\n\n  #updateViewarea({ location }) {\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n\n    this._position = {\n      hash: location.pdfOpenParams.substring(1),\n      page: this.linkService.page,\n      first: location.pageNumber,\n      rotation: location.rotation,\n    };\n\n    if (this._popStateInProgress) {\n      return;\n    }\n\n    if (\n      POSITION_UPDATED_THRESHOLD > 0 &&\n      this._isPagesLoaded &&\n      this._destination &&\n      !this._destination.page\n    ) {\n      // If the current destination was set through the user changing the hash\n      // of the document, we will usually not try to push the current position\n      // to the browser history; see `this.#tryPushCurrentPosition()`.\n      //\n      // To prevent `this.#tryPushCurrentPosition()` from effectively being\n      // reduced to a no-op in this case, we will assume that the position\n      // *did* in fact change if the 'updateviewarea' event was dispatched\n      // more than `POSITION_UPDATED_THRESHOLD` times.\n      this._numPositionUpdates++;\n    }\n\n    if (UPDATE_VIEWAREA_TIMEOUT > 0) {\n      // When closing the browser, a 'pagehide' event will be dispatched which\n      // *should* allow us to push the current position to the browser history.\n      // In practice, it seems that the event is arriving too late in order for\n      // the session history to be successfully updated.\n      // (For additional details, please refer to the discussion in\n      //  https://bugzilla.mozilla.org/show_bug.cgi?id=1153393.)\n      //\n      // To workaround this we attempt to *temporarily* add the current position\n      // to the browser history only when the viewer is *idle*,\n      // i.e. when scrolling and/or zooming does not occur.\n      //\n      // PLEASE NOTE: It's absolutely imperative that the browser history is\n      // *not* updated too often, since that would render the viewer more or\n      // less unusable. Hence the use of a timeout to delay the update until\n      // the viewer has been idle for `UPDATE_VIEWAREA_TIMEOUT` milliseconds.\n      this._updateViewareaTimeout = setTimeout(() => {\n        if (!this._popStateInProgress) {\n          this.#tryPushCurrentPosition(/* temporary = */ true);\n        }\n        this._updateViewareaTimeout = null;\n      }, UPDATE_VIEWAREA_TIMEOUT);\n    }\n  }\n\n  #popState({ state }) {\n    const newHash = getCurrentHash(),\n      hashChanged = this._currentHash !== newHash;\n    this._currentHash = newHash;\n\n    if (\n      (typeof PDFJSDev !== \"undefined\" &&\n        PDFJSDev.test(\"CHROME\") &&\n        state?.chromecomState &&\n        !this.#isValidState(state)) ||\n      !state\n    ) {\n      // This case corresponds to the user changing the hash of the document.\n      this._uid++;\n\n      const { hash, page, rotation } = this.#parseCurrentHash();\n      this.#pushOrReplaceState(\n        { hash, page, rotation },\n        /* forceReplace = */ true\n      );\n      return;\n    }\n    if (!this.#isValidState(state)) {\n      // This should only occur in viewers with support for opening more than\n      // one PDF document, e.g. the GENERIC viewer.\n      return;\n    }\n\n    // Prevent the browser history from updating until the new destination,\n    // as stored in the browser history, has been scrolled into view.\n    this._popStateInProgress = true;\n\n    if (hashChanged) {\n      // When the hash changed, implying that the 'popstate' event will be\n      // followed by a 'hashchange' event, then we do *not* want to update the\n      // browser history when handling the 'hashchange' event (in web/app.js)\n      // since that would *overwrite* the new destination navigated to below.\n      //\n      // To avoid accidentally disabling all future user-initiated hash changes,\n      // if there's e.g. another 'hashchange' listener that stops the event\n      // propagation, we make sure to always force-reset `this._blockHashChange`\n      // after `HASH_CHANGE_TIMEOUT` milliseconds have passed.\n      this._blockHashChange++;\n      waitOnEventOrTimeout({\n        target: window,\n        name: \"hashchange\",\n        delay: HASH_CHANGE_TIMEOUT,\n      }).then(() => {\n        this._blockHashChange--;\n      });\n    }\n\n    // Navigate to the new destination.\n    const destination = state.destination;\n    this.#updateInternalState(\n      destination,\n      state.uid,\n      /* removeTemporary = */ true\n    );\n\n    if (isValidRotation(destination.rotation)) {\n      this.linkService.rotation = destination.rotation;\n    }\n    if (destination.dest) {\n      this.linkService.goToDestination(destination.dest);\n    } else if (destination.hash) {\n      this.linkService.setHash(destination.hash);\n    } else if (destination.page) {\n      // Fallback case; shouldn't be necessary, but better safe than sorry.\n      this.linkService.page = destination.page;\n    }\n\n    // Since `PDFLinkService.goToDestination` is asynchronous, we thus defer the\n    // resetting of `this._popStateInProgress` slightly.\n    Promise.resolve().then(() => {\n      this._popStateInProgress = false;\n    });\n  }\n\n  #pageHide() {\n    // Attempt to push the `this._position` into the browser history when\n    // navigating away from the document. This is *only* done if the history\n    // is empty/temporary, since otherwise an existing browser history entry\n    // will end up being overwritten (given that new entries cannot be pushed\n    // into the browser history when the 'unload' event has already fired).\n    if (!this._destination || this._destination.temporary) {\n      this.#tryPushCurrentPosition();\n    }\n  }\n\n  #bindEvents() {\n    if (this.#eventAC) {\n      return; // The event listeners were already added.\n    }\n    this.#eventAC = new AbortController();\n    const { signal } = this.#eventAC;\n\n    this.eventBus.on(\"updateviewarea\", this.#updateViewarea.bind(this), {\n      signal,\n      ...internalOpt,\n    });\n    window.addEventListener(\"popstate\", this.#popState.bind(this), { signal });\n    window.addEventListener(\"pagehide\", this.#pageHide.bind(this), { signal });\n  }\n\n  #unbindEvents() {\n    this.#eventAC?.abort();\n    this.#eventAC = null;\n  }\n}\n\nfunction isDestHashesEqual(destHash, pushHash) {\n  if (typeof destHash !== \"string\" || typeof pushHash !== \"string\") {\n    return false;\n  }\n  if (destHash === pushHash) {\n    return true;\n  }\n  const nameddest = parseQueryString(destHash).get(\"nameddest\");\n  if (nameddest === pushHash) {\n    return true;\n  }\n  return false;\n}\n\nfunction isDestArraysEqual(firstDest, secondDest) {\n  function isEntryEqual(first, second) {\n    if (typeof first !== typeof second) {\n      return false;\n    }\n    if (Array.isArray(first) || Array.isArray(second)) {\n      return false;\n    }\n    if (first !== null && typeof first === \"object\" && second !== null) {\n      if (Object.keys(first).length !== Object.keys(second).length) {\n        return false;\n      }\n      for (const key in first) {\n        if (!isEntryEqual(first[key], second[key])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    return first === second || (Number.isNaN(first) && Number.isNaN(second));\n  }\n\n  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {\n    return false;\n  }\n  if (firstDest.length !== secondDest.length) {\n    return false;\n  }\n  for (let i = 0, ii = firstDest.length; i < ii; i++) {\n    if (!isEntryEqual(firstDest[i], secondDest[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport { isDestArraysEqual, isDestHashesEqual, PDFHistory };\n","/* Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/optional_content_config.js\").OptionalContentConfig} OptionalContentConfig */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/api.js\").PDFDocumentProxy} PDFDocumentProxy */\n\nimport { BaseTreeViewer } from \"./base_tree_viewer.js\";\nimport { internalOpt } from \"./internal_evt.js\";\n\n/**\n * @typedef {Object} PDFLayerViewerOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * @typedef {Object} PDFLayerViewerRenderParameters\n * @property {OptionalContentConfig|null} optionalContentConfig - An\n *   {OptionalContentConfig} instance.\n * @property {PDFDocumentProxy} pdfDocument - A {PDFDocument} instance.\n */\n\nclass PDFLayerViewer extends BaseTreeViewer {\n  constructor(options) {\n    super(options);\n\n    const { eventBus } = this;\n    eventBus.on(\n      \"optionalcontentconfigchanged\",\n      evt => {\n        this.#updateLayers(evt.promise);\n      },\n      internalOpt\n    );\n    eventBus.on(\n      \"resetlayers\",\n      () => {\n        this.#updateLayers();\n      },\n      internalOpt\n    );\n    eventBus.on(\n      \"togglelayerstree\",\n      this._toggleAllTreeItems.bind(this),\n      internalOpt\n    );\n  }\n\n  reset() {\n    super.reset();\n    this._optionalContentConfig = null;\n\n    this._optionalContentVisibility?.clear();\n    this._optionalContentVisibility = null;\n  }\n\n  /**\n   * @protected\n   */\n  _dispatchEvent(layersCount) {\n    this.eventBus.dispatch(\"layersloaded\", {\n      source: this,\n      layersCount,\n    });\n  }\n\n  /**\n   * @protected\n   */\n  _bindLink(element, { groupId, input }) {\n    const setVisibility = () => {\n      const visible = input.checked;\n      this._optionalContentConfig.setVisibility(groupId, visible);\n\n      const cached = this._optionalContentVisibility.get(groupId);\n      if (cached) {\n        cached.visible = visible;\n      }\n\n      this.eventBus.dispatch(\"optionalcontentconfig\", {\n        source: this,\n        promise: Promise.resolve(this._optionalContentConfig),\n      });\n    };\n\n    element.onclick = evt => {\n      if (evt.target === input) {\n        setVisibility();\n        return true;\n      } else if (evt.target !== element) {\n        return true; // The target is the \"label\", which is handled above.\n      }\n      input.checked = !input.checked;\n      setVisibility();\n      return false;\n    };\n  }\n\n  /**\n   * @private\n   */\n  _setNestedName(element, { name = null }) {\n    if (typeof name === \"string\") {\n      element.textContent = this._normalizeTextContent(name);\n      return;\n    }\n    element.setAttribute(\"data-l10n-id\", \"pdfjs-additional-layers\");\n    element.style.fontStyle = \"italic\";\n    // Trigger translation manually, since translation is paused when\n    // the final layer-tree is appended to the DOM.\n    this._l10n.translateOnce(element);\n  }\n\n  /**\n   * @protected\n   */\n  _addToggleButton(div, { name = null }) {\n    super._addToggleButton(div, /* hidden = */ name === null);\n  }\n\n  /**\n   * @private\n   */\n  _toggleAllTreeItems() {\n    if (!this._optionalContentConfig) {\n      return;\n    }\n    super._toggleAllTreeItems();\n  }\n\n  /**\n   * @param {PDFLayerViewerRenderParameters} params\n   */\n  render({ optionalContentConfig, pdfDocument }) {\n    if (this._optionalContentConfig) {\n      this.reset();\n    }\n    this._optionalContentConfig = optionalContentConfig || null;\n    this._pdfDocument = pdfDocument || null;\n\n    const groups = optionalContentConfig?.getOrder();\n    if (!groups) {\n      this._dispatchEvent(/* layersCount = */ 0);\n      return;\n    }\n    this._optionalContentVisibility = new Map();\n\n    const fragment = document.createDocumentFragment(),\n      queue = [{ parent: fragment, groups }];\n    let layersCount = 0,\n      hasAnyNesting = false;\n    while (queue.length > 0) {\n      const levelData = queue.shift();\n      for (const groupId of levelData.groups) {\n        const div = document.createElement(\"div\");\n        div.className = \"treeItem\";\n\n        const element = document.createElement(\"a\");\n        div.append(element);\n\n        if (typeof groupId === \"object\") {\n          hasAnyNesting = true;\n          this._addToggleButton(div, groupId);\n          this._setNestedName(element, groupId);\n\n          const itemsDiv = document.createElement(\"div\");\n          itemsDiv.className = \"treeItems\";\n          div.append(itemsDiv);\n\n          queue.push({ parent: itemsDiv, groups: groupId.order });\n        } else {\n          const group = optionalContentConfig.getGroup(groupId);\n          const label = document.createElement(\"label\");\n          const input = document.createElement(\"input\");\n          label.append(\n            input,\n            document.createTextNode(this._normalizeTextContent(group.name))\n          );\n          this._bindLink(element, { groupId, input });\n          input.type = \"checkbox\";\n          input.checked = group.visible;\n\n          this._optionalContentVisibility.set(groupId, {\n            input,\n            visible: input.checked,\n          });\n\n          element.append(label);\n          layersCount++;\n        }\n\n        levelData.parent.append(div);\n      }\n    }\n\n    this._finishRendering(fragment, layersCount, hasAnyNesting);\n  }\n\n  async #updateLayers(promise = null) {\n    if (!this._optionalContentConfig) {\n      return;\n    }\n    const pdfDocument = this._pdfDocument;\n    const optionalContentConfig = await (promise ||\n      pdfDocument.getOptionalContentConfig({ intent: \"display\" }));\n\n    if (pdfDocument !== this._pdfDocument) {\n      return; // The document was closed while the optional content resolved.\n    }\n    if (promise) {\n      // Ensure that the UI displays the correct state (e.g. with RBGroups).\n      for (const [groupId, cached] of this._optionalContentVisibility) {\n        const group = optionalContentConfig.getGroup(groupId);\n\n        if (group && cached.visible !== group.visible) {\n          cached.input.checked = cached.visible = !cached.visible;\n        }\n      }\n      return;\n    }\n    this.eventBus.dispatch(\"optionalcontentconfig\", {\n      source: this,\n      promise: Promise.resolve(optionalContentConfig),\n    });\n\n    // Reset the sidebarView to the new state.\n    this.render({\n      optionalContentConfig,\n      pdfDocument: this._pdfDocument,\n    });\n  }\n}\n\nexport { PDFLayerViewer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./download_manager.js\").DownloadManager} DownloadManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/api.js\").PDFDocumentProxy} PDFDocumentProxy */\n\n/**\n * @import { CatalogAttachmentContent } from \"../src/core/catalog.js\";\n */\n\nimport { BaseTreeViewer } from \"./base_tree_viewer.js\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { SidebarView } from \"./ui_utils.js\";\n\n/**\n * @typedef {Object} PDFOutlineViewerOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {PDFLinkService} linkService - The navigation/linking service.\n * @property {DownloadManager} downloadManager - The download manager.\n */\n\n/**\n * @typedef {Object} PDFOutlineViewerRenderParameters\n * @property {Array|null} outline - An array of outline objects.\n * @property {PDFDocumentProxy} pdfDocument - A {PDFDocument} instance.\n */\n\nclass PDFOutlineViewer extends BaseTreeViewer {\n  /**\n   * @param {PDFOutlineViewerOptions} options\n   */\n  constructor(options) {\n    super(options);\n    this.linkService = options.linkService;\n    this.downloadManager = options.downloadManager;\n\n    const { eventBus } = this;\n    eventBus.on(\n      \"toggleoutlinetree\",\n      this._toggleAllTreeItems.bind(this),\n      internalOpt\n    );\n    eventBus.on(\n      \"currentoutlineitem\",\n      this._currentOutlineItem.bind(this),\n      internalOpt\n    );\n\n    eventBus.on(\n      \"pagechanging\",\n      evt => {\n        this._currentPageNumber = evt.pageNumber;\n      },\n      internalOpt\n    );\n    eventBus.on(\n      \"pagesloaded\",\n      evt => {\n        this._isPagesLoaded = !!evt.pagesCount;\n\n        // If the capability is still pending, see the `_dispatchEvent`-method,\n        // we know that the `currentOutlineItem`-button can be enabled here.\n        this._currentOutlineItemCapability?.resolve(\n          /* enabled = */ this._isPagesLoaded\n        );\n      },\n      internalOpt\n    );\n    eventBus.on(\n      \"sidebarviewchanged\",\n      evt => {\n        this._sidebarView = evt.view;\n      },\n      internalOpt\n    );\n  }\n\n  reset() {\n    super.reset();\n    this._outline = null;\n\n    this._pageNumberToDestHashCapability = null;\n    this._currentPageNumber = 1;\n    this._isPagesLoaded = null;\n\n    this._currentOutlineItemCapability?.resolve(/* enabled = */ false);\n    this._currentOutlineItemCapability = null;\n  }\n\n  /**\n   * @protected\n   */\n  _dispatchEvent(outlineCount) {\n    this._currentOutlineItemCapability = Promise.withResolvers();\n    if (\n      outlineCount === 0 ||\n      this._pdfDocument?.loadingParams.disableAutoFetch\n    ) {\n      this._currentOutlineItemCapability.resolve(/* enabled = */ false);\n    } else if (this._isPagesLoaded !== null) {\n      this._currentOutlineItemCapability.resolve(\n        /* enabled = */ this._isPagesLoaded\n      );\n    }\n\n    this.eventBus.dispatch(\"outlineloaded\", {\n      source: this,\n      outlineCount,\n      currentOutlineItemPromise: this._currentOutlineItemCapability.promise,\n    });\n  }\n\n  /**\n   * @protected\n   */\n  _bindLink(\n    element,\n    { url, newWindow, action, attachmentId, attachment, dest, setOCGState }\n  ) {\n    const { linkService } = this;\n\n    if (url) {\n      linkService.addLinkAttributes(element, url, newWindow);\n      return;\n    }\n    if (action) {\n      element.href = linkService.getAnchorUrl(\"\");\n      element.onclick = () => {\n        linkService.executeNamedAction(action);\n        return false;\n      };\n      return;\n    }\n    if (attachmentId && attachment) {\n      element.href = linkService.getAnchorUrl(\"\");\n\n      const openAttachment = async () => {\n        /** @type {CatalogAttachmentContent} */\n        const content = await linkService.getAttachmentContent(attachmentId);\n\n        if (content) {\n          this.downloadManager?.openOrDownloadData(\n            content,\n            attachment.filename\n          );\n        }\n      };\n\n      element.onclick = () => {\n        openAttachment();\n        return false;\n      };\n      return;\n    }\n    if (setOCGState) {\n      element.href = linkService.getAnchorUrl(\"\");\n      element.onclick = () => {\n        linkService.executeSetOCGState(setOCGState);\n        return false;\n      };\n      return;\n    }\n\n    element.href = linkService.getDestinationHash(dest);\n    element.onclick = evt => {\n      this._updateCurrentTreeItem(evt.target.parentNode);\n\n      if (dest) {\n        linkService.goToDestination(dest);\n      }\n      return false;\n    };\n  }\n\n  /**\n   * @private\n   */\n  _setStyles(element, { bold, italic }) {\n    if (bold) {\n      element.style.fontWeight = \"bold\";\n    }\n    if (italic) {\n      element.style.fontStyle = \"italic\";\n    }\n  }\n\n  /**\n   * @protected\n   */\n  _addToggleButton(div, { count, items }) {\n    let hidden = false;\n    if (count < 0) {\n      let totalCount = items.length;\n      if (totalCount > 0) {\n        const queue = [...items];\n        while (queue.length > 0) {\n          const { count: nestedCount, items: nestedItems } = queue.shift();\n          if (nestedCount > 0 && nestedItems.length > 0) {\n            totalCount += nestedItems.length;\n            queue.push(...nestedItems);\n          }\n        }\n      }\n      if (Math.abs(count) === totalCount) {\n        hidden = true;\n      }\n    }\n    super._addToggleButton(div, hidden);\n  }\n\n  /**\n   * @private\n   */\n  _toggleAllTreeItems() {\n    if (!this._outline) {\n      return;\n    }\n    super._toggleAllTreeItems();\n  }\n\n  /**\n   * @param {PDFOutlineViewerRenderParameters} params\n   */\n  render({ outline, pdfDocument }) {\n    if (this._outline) {\n      this.reset();\n    }\n    this._outline = outline || null;\n    this._pdfDocument = pdfDocument || null;\n\n    if (!outline) {\n      this._dispatchEvent(/* outlineCount = */ 0);\n      return;\n    }\n\n    const fragment = document.createDocumentFragment();\n    const queue = [{ parent: fragment, items: outline }];\n    let outlineCount = 0,\n      hasAnyNesting = false;\n    while (queue.length > 0) {\n      const levelData = queue.shift();\n      for (const item of levelData.items) {\n        const div = document.createElement(\"div\");\n        div.className = \"treeItem\";\n\n        const element = document.createElement(\"a\");\n        this._bindLink(element, item);\n        this._setStyles(element, item);\n        element.textContent = this._normalizeTextContent(item.title);\n\n        div.append(element);\n\n        if (item.items.length > 0) {\n          hasAnyNesting = true;\n          this._addToggleButton(div, item);\n\n          const itemsDiv = document.createElement(\"div\");\n          itemsDiv.className = \"treeItems\";\n          div.append(itemsDiv);\n\n          queue.push({ parent: itemsDiv, items: item.items });\n        }\n\n        levelData.parent.append(div);\n        outlineCount++;\n      }\n    }\n\n    this._finishRendering(fragment, outlineCount, hasAnyNesting);\n  }\n\n  /**\n   * Find/highlight the current outline item, corresponding to the active page.\n   * @private\n   */\n  async _currentOutlineItem() {\n    if (!this._isPagesLoaded) {\n      throw new Error(\"_currentOutlineItem: All pages have not been loaded.\");\n    }\n    if (!this._outline || !this._pdfDocument) {\n      return;\n    }\n\n    const pageNumberToDestHash = await this._getPageNumberToDestHash(\n      this._pdfDocument\n    );\n    if (!pageNumberToDestHash) {\n      return;\n    }\n    this._updateCurrentTreeItem(/* treeItem = */ null);\n\n    if (this._sidebarView !== SidebarView.OUTLINE) {\n      return; // The outline view is no longer visible, hence do nothing.\n    }\n    // When there is no destination on the current page, always check the\n    // previous ones in (reverse) order.\n    for (let i = this._currentPageNumber; i > 0; i--) {\n      const destHash = pageNumberToDestHash.get(i);\n      if (!destHash) {\n        continue;\n      }\n      const linkElement = this.container.querySelector(`a[href=\"${destHash}\"]`);\n      if (!linkElement) {\n        continue;\n      }\n      this._scrollToCurrentTreeItem(linkElement.parentNode);\n      break;\n    }\n  }\n\n  /**\n   * To (significantly) simplify the overall implementation, we will only\n   * consider *one* destination per page when finding/highlighting the current\n   * outline item (similar to e.g. Adobe Reader); more specifically, we choose\n   * the *first* outline item at the *lowest* level of the outline tree.\n   * @private\n   */\n  async _getPageNumberToDestHash(pdfDocument) {\n    if (this._pageNumberToDestHashCapability) {\n      return this._pageNumberToDestHashCapability.promise;\n    }\n    this._pageNumberToDestHashCapability = Promise.withResolvers();\n\n    const pageNumberToDestHash = new Map(),\n      pageNumberNesting = new Map();\n    const queue = [{ nesting: 0, items: this._outline }];\n    while (queue.length > 0) {\n      const levelData = queue.shift(),\n        currentNesting = levelData.nesting;\n      for (const { dest, items } of levelData.items) {\n        let explicitDest, pageNumber;\n        if (typeof dest === \"string\") {\n          explicitDest = await pdfDocument.getDestination(dest);\n\n          if (pdfDocument !== this._pdfDocument) {\n            return null; // The document was closed while the data resolved.\n          }\n        } else {\n          explicitDest = dest;\n        }\n        if (Array.isArray(explicitDest)) {\n          const [destRef] = explicitDest;\n\n          if (destRef && typeof destRef === \"object\") {\n            // The page reference must be available, since the current method\n            // won't be invoked until all pages have been loaded.\n            pageNumber = pdfDocument.cachedPageNumber(destRef);\n          } else if (Number.isInteger(destRef)) {\n            pageNumber = destRef + 1;\n          }\n\n          if (\n            Number.isInteger(pageNumber) &&\n            (!pageNumberToDestHash.has(pageNumber) ||\n              currentNesting > pageNumberNesting.get(pageNumber))\n          ) {\n            const destHash = this.linkService.getDestinationHash(dest);\n            pageNumberToDestHash.set(pageNumber, destHash);\n            pageNumberNesting.set(pageNumber, currentNesting);\n          }\n        }\n\n        if (items.length > 0) {\n          queue.push({ nesting: currentNesting + 1, items });\n        }\n      }\n    }\n\n    this._pageNumberToDestHashCapability.resolve(\n      pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null\n    );\n    return this._pageNumberToDestHashCapability.promise;\n  }\n}\n\nexport { PDFOutlineViewer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n/** @typedef {import(\"./pdf_viewer.js\").PDFViewer} PDFViewer */\n\nimport {\n  normalizeWheelEventDelta,\n  PresentationModeState,\n  ScrollMode,\n  SpreadMode,\n} from \"./ui_utils.js\";\nimport { AnnotationEditorType } from \"pdfjs-lib\";\n\nconst DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms\nconst ACTIVE_SELECTOR = \"pdfPresentationMode\";\nconst CONTROLS_SELECTOR = \"pdfPresentationModeControls\";\nconst MOUSE_SCROLL_COOLDOWN_TIME = 50; // in ms\nconst PAGE_SWITCH_THRESHOLD = 0.1;\n\n// Number of CSS pixels for a movement to count as a swipe.\nconst SWIPE_MIN_DISTANCE_THRESHOLD = 50;\n\n// Swipe angle deviation from the x or y axis before it is not\n// considered a swipe in that direction any more.\nconst SWIPE_ANGLE_THRESHOLD = Math.PI / 6;\n\n/**\n * @typedef {Object} PDFPresentationModeOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {PDFViewer} pdfViewer - The document viewer.\n * @property {EventBus} eventBus - The application event bus.\n */\n\nclass PDFPresentationMode {\n  #state = PresentationModeState.UNKNOWN;\n\n  #args = null;\n\n  #fullscreenChangeAC = null;\n\n  #windowAC = null;\n\n  /**\n   * @param {PDFPresentationModeOptions} options\n   */\n  constructor({ container, pdfViewer, eventBus }) {\n    this.container = container;\n    this.pdfViewer = pdfViewer;\n    this.eventBus = eventBus;\n\n    this.contextMenuOpen = false;\n    this.mouseScrollTimeStamp = 0;\n    this.mouseScrollDelta = 0;\n    this.touchSwipeState = null;\n  }\n\n  /**\n   * Request the browser to enter fullscreen mode.\n   * @returns {Promise<boolean>} Indicating if the request was successful.\n   */\n  async request() {\n    const { container, pdfViewer } = this;\n\n    if (this.active || !pdfViewer.pagesCount || !container.requestFullscreen) {\n      return false;\n    }\n    this.#addFullscreenChangeListeners();\n    this.#notifyStateChange(PresentationModeState.CHANGING);\n\n    const promise = container.requestFullscreen();\n\n    this.#args = {\n      pageNumber: pdfViewer.currentPageNumber,\n      scaleValue: pdfViewer.currentScaleValue,\n      scrollMode: pdfViewer.scrollMode,\n      spreadMode: null,\n      annotationEditorMode: null,\n    };\n\n    if (\n      pdfViewer.spreadMode !== SpreadMode.NONE &&\n      !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)\n    ) {\n      console.warn(\n        \"Ignoring Spread modes when entering PresentationMode, \" +\n          \"since the document may contain varying page sizes.\"\n      );\n      this.#args.spreadMode = pdfViewer.spreadMode;\n    }\n    if (pdfViewer.annotationEditorMode !== AnnotationEditorType.DISABLE) {\n      this.#args.annotationEditorMode = pdfViewer.annotationEditorMode;\n    }\n\n    try {\n      await promise;\n      pdfViewer.focus(); // Fixes bug 1787456.\n      return true;\n    } catch {\n      this.#removeFullscreenChangeListeners();\n      this.#notifyStateChange(PresentationModeState.NORMAL);\n    }\n    return false;\n  }\n\n  get active() {\n    return (\n      this.#state === PresentationModeState.CHANGING ||\n      this.#state === PresentationModeState.FULLSCREEN\n    );\n  }\n\n  #mouseWheel(evt) {\n    if (!this.active) {\n      return;\n    }\n    if (evt.target.closest?.(\".mediaAnnotation\")) {\n      return;\n    }\n    evt.preventDefault();\n\n    const delta = normalizeWheelEventDelta(evt);\n    const currentTime = Date.now();\n    const storedTime = this.mouseScrollTimeStamp;\n\n    // If we've already switched page, avoid accidentally switching again.\n    if (\n      currentTime > storedTime &&\n      currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME\n    ) {\n      return;\n    }\n    // If the scroll direction changed, reset the accumulated scroll delta.\n    if (\n      (this.mouseScrollDelta > 0 && delta < 0) ||\n      (this.mouseScrollDelta < 0 && delta > 0)\n    ) {\n      this.#resetMouseScrollState();\n    }\n    this.mouseScrollDelta += delta;\n\n    if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {\n      const totalDelta = this.mouseScrollDelta;\n      this.#resetMouseScrollState();\n      const success =\n        totalDelta > 0\n          ? this.pdfViewer.previousPage()\n          : this.pdfViewer.nextPage();\n      if (success) {\n        this.mouseScrollTimeStamp = currentTime;\n      }\n    }\n  }\n\n  #notifyStateChange(state) {\n    this.#state = state;\n\n    this.eventBus.dispatch(\"presentationmodechanged\", { source: this, state });\n  }\n\n  #enter() {\n    this.#notifyStateChange(PresentationModeState.FULLSCREEN);\n    this.container.classList.add(ACTIVE_SELECTOR);\n\n    // Ensure that the correct page is scrolled into view when entering\n    // Presentation Mode, by waiting until fullscreen mode in enabled.\n    setTimeout(() => {\n      this.pdfViewer.scrollMode = ScrollMode.PAGE;\n      if (this.#args.spreadMode !== null) {\n        this.pdfViewer.spreadMode = SpreadMode.NONE;\n      }\n      this.pdfViewer.currentPageNumber = this.#args.pageNumber;\n      this.pdfViewer.currentScaleValue = \"page-fit\";\n\n      if (this.#args.annotationEditorMode !== null) {\n        this.pdfViewer.annotationEditorMode = {\n          mode: AnnotationEditorType.NONE,\n        };\n      }\n    }, 0);\n\n    this.#addWindowListeners();\n    this.#showControls();\n    this.contextMenuOpen = false;\n\n    // Text selection is disabled in Presentation Mode, thus it's not possible\n    // for the user to deselect text that is selected (e.g. with \"Select all\")\n    // when entering Presentation Mode, hence we remove any active selection.\n    document.getSelection().empty();\n  }\n\n  #exit() {\n    const pageNumber = this.pdfViewer.currentPageNumber;\n    this.container.classList.remove(ACTIVE_SELECTOR);\n\n    // Ensure that the correct page is scrolled into view when exiting\n    // Presentation Mode, by waiting until fullscreen mode is disabled.\n    setTimeout(() => {\n      this.#removeFullscreenChangeListeners();\n      this.#notifyStateChange(PresentationModeState.NORMAL);\n\n      this.pdfViewer.scrollMode = this.#args.scrollMode;\n      if (this.#args.spreadMode !== null) {\n        this.pdfViewer.spreadMode = this.#args.spreadMode;\n      }\n      this.pdfViewer.currentScaleValue = this.#args.scaleValue;\n      this.pdfViewer.currentPageNumber = pageNumber;\n\n      if (this.#args.annotationEditorMode !== null) {\n        this.pdfViewer.annotationEditorMode = {\n          mode: this.#args.annotationEditorMode,\n        };\n      }\n      this.#args = null;\n    }, 0);\n\n    this.#removeWindowListeners();\n    this.#hideControls();\n    this.#resetMouseScrollState();\n    this.contextMenuOpen = false;\n  }\n\n  #mouseDown(evt) {\n    if (this.contextMenuOpen) {\n      this.contextMenuOpen = false;\n      evt.preventDefault();\n      return;\n    }\n    if (evt.button !== 0) {\n      return;\n    }\n    // Enable clicking of links in presentation mode. Note: only links\n    // pointing to destinations in the current PDF document work.\n    if (\n      evt.target.href &&\n      evt.target.parentNode?.hasAttribute(\"data-internal-link\")\n    ) {\n      return;\n    }\n    // Allow interacting with embedded media controls rather than advancing.\n    if (evt.target.closest?.(\".mediaAnnotation\")) {\n      return;\n    }\n    // Unless an internal link was clicked, advance one page.\n    evt.preventDefault();\n\n    if (evt.shiftKey) {\n      this.pdfViewer.previousPage();\n    } else {\n      this.pdfViewer.nextPage();\n    }\n  }\n\n  #contextMenu() {\n    this.contextMenuOpen = true;\n  }\n\n  #showControls() {\n    if (this.controlsTimeout) {\n      clearTimeout(this.controlsTimeout);\n    } else {\n      this.container.classList.add(CONTROLS_SELECTOR);\n    }\n    this.controlsTimeout = setTimeout(() => {\n      this.container.classList.remove(CONTROLS_SELECTOR);\n      delete this.controlsTimeout;\n    }, DELAY_BEFORE_HIDING_CONTROLS);\n  }\n\n  #hideControls() {\n    if (!this.controlsTimeout) {\n      return;\n    }\n    clearTimeout(this.controlsTimeout);\n    this.container.classList.remove(CONTROLS_SELECTOR);\n    delete this.controlsTimeout;\n  }\n\n  /**\n   * Resets the properties used for tracking mouse scrolling events.\n   */\n  #resetMouseScrollState() {\n    this.mouseScrollTimeStamp = 0;\n    this.mouseScrollDelta = 0;\n  }\n\n  #touchSwipe(evt) {\n    if (!this.active) {\n      return;\n    }\n    if (evt.target.closest?.(\".mediaAnnotation\")) {\n      this.touchSwipeState = null;\n      return;\n    }\n    if (evt.touches.length > 1) {\n      // Multiple touch points detected; cancel the swipe.\n      this.touchSwipeState = null;\n      return;\n    }\n\n    switch (evt.type) {\n      case \"touchstart\":\n        this.touchSwipeState = {\n          startX: evt.touches[0].pageX,\n          startY: evt.touches[0].pageY,\n          endX: evt.touches[0].pageX,\n          endY: evt.touches[0].pageY,\n        };\n        break;\n      case \"touchmove\":\n        if (this.touchSwipeState === null) {\n          return;\n        }\n        this.touchSwipeState.endX = evt.touches[0].pageX;\n        this.touchSwipeState.endY = evt.touches[0].pageY;\n        // Avoid the swipe from triggering browser gestures (Chrome in\n        // particular has some sort of swipe gesture in fullscreen mode).\n        evt.preventDefault();\n        break;\n      case \"touchend\":\n        if (this.touchSwipeState === null) {\n          return;\n        }\n        let delta = 0;\n        const dx = this.touchSwipeState.endX - this.touchSwipeState.startX;\n        const dy = this.touchSwipeState.endY - this.touchSwipeState.startY;\n        const absAngle = Math.abs(Math.atan2(dy, dx));\n        if (\n          Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD &&\n          (absAngle <= SWIPE_ANGLE_THRESHOLD ||\n            absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)\n        ) {\n          // Horizontal swipe.\n          delta = dx;\n        } else if (\n          Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD &&\n          Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD\n        ) {\n          // Vertical swipe.\n          delta = dy;\n        }\n        if (delta > 0) {\n          this.pdfViewer.previousPage();\n        } else if (delta < 0) {\n          this.pdfViewer.nextPage();\n        }\n        break;\n    }\n  }\n\n  #addWindowListeners() {\n    if (this.#windowAC) {\n      return;\n    }\n    this.#windowAC = new AbortController();\n    const { signal } = this.#windowAC;\n\n    const touchSwipeBind = this.#touchSwipe.bind(this);\n\n    window.addEventListener(\"mousemove\", this.#showControls.bind(this), {\n      signal,\n    });\n    window.addEventListener(\"mousedown\", this.#mouseDown.bind(this), {\n      signal,\n    });\n    window.addEventListener(\"wheel\", this.#mouseWheel.bind(this), {\n      passive: false,\n      signal,\n    });\n    window.addEventListener(\"keydown\", this.#resetMouseScrollState.bind(this), {\n      signal,\n    });\n    window.addEventListener(\"contextmenu\", this.#contextMenu.bind(this), {\n      signal,\n    });\n    window.addEventListener(\"touchstart\", touchSwipeBind, { signal });\n    window.addEventListener(\"touchmove\", touchSwipeBind, { signal });\n    window.addEventListener(\"touchend\", touchSwipeBind, { signal });\n  }\n\n  #removeWindowListeners() {\n    this.#windowAC?.abort();\n    this.#windowAC = null;\n  }\n\n  #addFullscreenChangeListeners() {\n    if (this.#fullscreenChangeAC) {\n      return;\n    }\n    this.#fullscreenChangeAC = new AbortController();\n\n    window.addEventListener(\n      \"fullscreenchange\",\n      () => {\n        if (/* isFullscreen = */ document.fullscreenElement) {\n          this.#enter();\n        } else {\n          this.#exit();\n        }\n      },\n      { signal: this.#fullscreenChangeAC.signal }\n    );\n  }\n\n  #removeFullscreenChangeListeners() {\n    this.#fullscreenChangeAC?.abort();\n    this.#fullscreenChangeAC = null;\n  }\n}\n\nexport { PDFPresentationMode };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/annotation_storage\").AnnotationStorage} AnnotationStorage */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/page_viewport\").PageViewport} PageViewport */\n/** @typedef {import(\"./pdf_link_service.js\").PDFLinkService} PDFLinkService */\n\nimport { XfaLayer } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} XfaLayerBuilderOptions\n * @property {PDFPageProxy} pdfPage\n * @property {AnnotationStorage} [annotationStorage]\n * @property {PDFLinkService} linkService\n * @property {Object} [xfaHtml]\n */\n\n/**\n * @typedef {Object} XfaLayerBuilderRenderOptions\n * @property {PageViewport} viewport\n * @property {string} [intent] - The default value is \"display\".\n */\n\nclass XfaLayerBuilder {\n  #cancelled = false;\n\n  div = null;\n\n  /**\n   * @param {XfaLayerBuilderOptions} options\n   */\n  constructor({\n    pdfPage,\n    annotationStorage = null,\n    linkService,\n    xfaHtml = null,\n  }) {\n    this.pdfPage = pdfPage;\n    this.annotationStorage = annotationStorage;\n    this.linkService = linkService;\n    this.xfaHtml = xfaHtml;\n  }\n\n  /**\n   * @param {XfaLayerBuilderRenderOptions} viewport\n   * @returns {Promise<Object | void>} A promise that is resolved when rendering\n   *   of the XFA layer is complete. The first rendering will return an object\n   *   with a `textDivs` property that can be used with the TextHighlighter.\n   */\n  async render({ viewport, intent = \"display\" }) {\n    let xfaHtml;\n    if (intent === \"print\") {\n      xfaHtml = this.xfaHtml;\n    } else {\n      xfaHtml = await this.pdfPage.getXfa();\n\n      if (this.#cancelled || !xfaHtml) {\n        return { textDivs: [] };\n      }\n    }\n\n    // Create an xfa layer div and render the form\n    const hasDiv = !!this.div;\n    const params = {\n      viewport: viewport.clone({ dontFlip: true }),\n      div: (this.div ??= document.createElement(\"div\")),\n      xfaHtml,\n      annotationStorage: this.annotationStorage,\n      linkService: this.linkService,\n      intent,\n    };\n\n    return hasDiv ? XfaLayer.update(params) : XfaLayer.render(params);\n  }\n\n  cancel() {\n    this.#cancelled = true;\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n    this.div.hidden = true;\n  }\n}\n\nexport { XfaLayerBuilder };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PixelsPerInch, XfaLayer } from \"pdfjs-lib\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\nimport { XfaLayerBuilder } from \"./xfa_layer_builder.js\";\n\nclass BasePrintServiceFactory {\n  constructor() {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      throw new Error(\"Cannot initialize BasePrintServiceFactory.\");\n    }\n  }\n\n  static initGlobals(app) {}\n\n  static get supportsPrinting() {\n    throw new Error(\"Not implemented: supportsPrinting\");\n  }\n\n  static createPrintService(params) {\n    throw new Error(\"Not implemented: createPrintService\");\n  }\n}\n\nfunction getXfaHtmlForPrinting(printContainer, pdfDocument) {\n  const xfaHtml = pdfDocument.allXfaHtml;\n  const linkService = new SimpleLinkService();\n  const scale = Math.round(PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100;\n\n  for (const xfaPage of xfaHtml.children) {\n    const page = document.createElement(\"div\");\n    page.className = \"xfaPrintedPage\";\n    printContainer.append(page);\n\n    const builder = new XfaLayerBuilder({\n      pdfPage: null,\n      annotationStorage: pdfDocument.annotationStorage,\n      linkService,\n      xfaHtml: xfaPage,\n    });\n    const viewport = XfaLayer.getPageViewport(xfaPage, { scale });\n\n    builder.render({ viewport, intent: \"print\" });\n    page.append(builder.div);\n  }\n}\n\nexport { BasePrintServiceFactory, getXfaHtmlForPrinting };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationMode,\n  PixelsPerInch,\n  RenderingCancelledException,\n  shadow,\n} from \"pdfjs-lib\";\nimport {\n  BasePrintServiceFactory,\n  getXfaHtmlForPrinting,\n} from \"./print_utils.js\";\n\nlet activeService = null;\nlet dialog = null;\nlet overlayManager = null;\nlet viewerApp = { initialized: false };\n\n// Renders the page to the canvas of the given print service, and returns\n// the suggested dimensions of the output page.\nfunction renderPage(\n  activeServiceOnEntry,\n  pdfDocument,\n  pageNumber,\n  size,\n  printResolution,\n  optionalContentConfigPromise,\n  printAnnotationStoragePromise\n) {\n  const scratchCanvas = activeService.scratchCanvas;\n\n  // The size of the canvas in pixels for printing.\n  const PRINT_UNITS = printResolution / PixelsPerInch.PDF;\n  scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);\n  scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);\n\n  const ctx = scratchCanvas.getContext(\"2d\");\n  ctx.save();\n  ctx.fillStyle = \"rgb(255, 255, 255)\";\n  ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);\n  ctx.restore();\n\n  return Promise.all([\n    pdfDocument.getPage(pageNumber),\n    printAnnotationStoragePromise,\n  ]).then(function ([pdfPage, printAnnotationStorage]) {\n    const renderContext = {\n      canvas: scratchCanvas,\n      transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],\n      viewport: pdfPage.getViewport({ scale: 1, rotation: size.rotation }),\n      intent: \"print\",\n      annotationMode: AnnotationMode.ENABLE_STORAGE,\n      optionalContentConfigPromise,\n      printAnnotationStorage,\n    };\n    const renderTask = pdfPage.render(renderContext);\n\n    return renderTask.promise.catch(reason => {\n      if (!(reason instanceof RenderingCancelledException)) {\n        console.error(reason);\n      }\n      throw reason;\n    });\n  });\n}\n\nclass PDFPrintService {\n  constructor({\n    pdfDocument,\n    pagesOverview,\n    printContainer,\n    printResolution,\n    printAnnotationStoragePromise = null,\n  }) {\n    this.pdfDocument = pdfDocument;\n    this.pagesOverview = pagesOverview;\n    this.printContainer = printContainer;\n    this._printResolution = printResolution || 150;\n    this._optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({\n      intent: \"print\",\n    });\n    this._printAnnotationStoragePromise =\n      printAnnotationStoragePromise || Promise.resolve();\n    this.currentPage = -1;\n    // The temporary canvas where renderPage paints one page at a time.\n    this.scratchCanvas = document.createElement(\"canvas\");\n  }\n\n  layout() {\n    this.throwIfInactive();\n\n    const body = document.querySelector(\"body\");\n    body.setAttribute(\"data-pdfjsprinting\", true);\n\n    const { width, height } = this.pagesOverview[0];\n    const hasEqualPageSizes = this.pagesOverview.every(\n      size => size.width === width && size.height === height\n    );\n    if (!hasEqualPageSizes) {\n      console.warn(\n        \"Not all pages have the same size. The printed result may be incorrect!\"\n      );\n    }\n\n    // Insert a @page + size rule to make sure that the page size is correctly\n    // set. Note that we assume that all pages have the same size, because\n    // variable-size pages are not supported yet (e.g. in Chrome & Firefox).\n    // TODO(robwu): Use named pages when size calculation bugs get resolved\n    // (e.g. https://crbug.com/355116) AND when support for named pages is\n    // added (http://www.w3.org/TR/css3-page/#using-named-pages).\n    // In browsers where @page + size is not supported, the next stylesheet\n    // will be ignored and the user has to select the correct paper size in\n    // the UI if wanted.\n    this.pageStyleSheet = new CSSStyleSheet();\n    this.pageStyleSheet.replaceSync(`@page { size: ${width}pt ${height}pt;}`);\n    document.adoptedStyleSheets.push(this.pageStyleSheet);\n  }\n\n  destroy() {\n    if (activeService !== this) {\n      // |activeService| cannot be replaced without calling destroy() first,\n      // so if it differs then an external consumer has a stale reference to us.\n      return;\n    }\n    this.printContainer.textContent = \"\";\n\n    const body = document.querySelector(\"body\");\n    body.removeAttribute(\"data-pdfjsprinting\");\n\n    if (this.pageStyleSheet) {\n      document.adoptedStyleSheets = document.adoptedStyleSheets.filter(\n        styleSheet => styleSheet !== this.pageStyleSheet\n      );\n      this.pageStyleSheet = null;\n    }\n    if (this._blobURLs) {\n      for (const url of this._blobURLs) {\n        URL.revokeObjectURL(url);\n      }\n      this._blobURLs = null;\n    }\n    this.scratchCanvas.width = this.scratchCanvas.height = 0;\n    this.scratchCanvas = null;\n    activeService = null;\n    ensureOverlay().then(function () {\n      overlayManager.closeIfActive(dialog);\n    });\n  }\n\n  renderPages() {\n    if (this.pdfDocument.isPureXfa) {\n      getXfaHtmlForPrinting(this.printContainer, this.pdfDocument);\n      return Promise.resolve();\n    }\n\n    const pageCount = this.pagesOverview.length;\n    const renderNextPage = (resolve, reject) => {\n      this.throwIfInactive();\n      if (++this.currentPage >= pageCount) {\n        renderProgress(pageCount, pageCount);\n        resolve();\n        return;\n      }\n      const index = this.currentPage;\n      renderProgress(index, pageCount);\n      renderPage(\n        this,\n        this.pdfDocument,\n        /* pageNumber = */ index + 1,\n        this.pagesOverview[index],\n        this._printResolution,\n        this._optionalContentConfigPromise,\n        this._printAnnotationStoragePromise\n      )\n        .then(this.useRenderedPage.bind(this))\n        .then(function () {\n          renderNextPage(resolve, reject);\n        }, reject);\n    };\n    return new Promise(renderNextPage);\n  }\n\n  useRenderedPage() {\n    this.throwIfInactive();\n    const img = document.createElement(\"img\");\n    this.scratchCanvas.toBlob(blob => {\n      const blobURL = URL.createObjectURL(blob);\n      img.src = blobURL;\n      // Defer revocation until after printing completes (in destroy()) to avoid\n      // broken print images in Firefox when a service worker is registered,\n      // since Firefox re-fetches blob URLs when rendering the print dialog.\n      // See https://github.com/mozilla/pdf.js/issues/19988\n      (this._blobURLs ??= []).push(blobURL);\n    });\n\n    const wrapper = document.createElement(\"div\");\n    wrapper.className = \"printedPage\";\n    wrapper.append(img);\n    this.printContainer.append(wrapper);\n\n    const { promise, resolve, reject } = Promise.withResolvers();\n    img.onload = resolve;\n    img.onerror = reject;\n\n    promise.catch(() => {\n      // Avoid \"Uncaught promise\" messages in the console.\n    });\n    return promise;\n  }\n\n  performPrint() {\n    this.throwIfInactive();\n    return new Promise(resolve => {\n      // Push window.print in the macrotask queue to avoid being affected by\n      // the deprecation of running print() code in a microtask, see\n      // https://github.com/mozilla/pdf.js/issues/7547.\n      setTimeout(() => {\n        if (!this.active) {\n          resolve();\n          return;\n        }\n        print.call(window);\n        // Delay promise resolution in case print() was not synchronous.\n        setTimeout(resolve, 20); // Tidy-up.\n      }, 0);\n    });\n  }\n\n  get active() {\n    return this === activeService;\n  }\n\n  throwIfInactive() {\n    if (!this.active) {\n      throw new Error(\"This print request was cancelled or completed.\");\n    }\n  }\n}\n\nconst print = window.print;\nwindow.print = function () {\n  if (activeService) {\n    console.warn(\"Ignored window.print() because of a pending print job.\");\n    return;\n  }\n  ensureOverlay().then(function () {\n    if (activeService) {\n      overlayManager.open(dialog);\n    }\n  });\n\n  try {\n    dispatchEvent(\"beforeprint\");\n  } finally {\n    if (!activeService) {\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n        // eslint-disable-next-line no-unsafe-finally\n        throw new Error(\"window.print() is not supported\");\n      }\n      console.error(\"Expected print service to be initialized.\");\n      ensureOverlay().then(function () {\n        overlayManager.closeIfActive(dialog);\n      });\n    } else {\n      const activeServiceOnEntry = activeService;\n      activeService\n        .renderPages()\n        .then(() => activeServiceOnEntry.performPrint())\n        .catch(() => {\n          // Ignore any error messages.\n        })\n        .then(() => {\n          // aborts acts on the \"active\" print request, so we need to check\n          // whether the print request (activeServiceOnEntry) is still active.\n          // Without the check, an unrelated print request (created after\n          // aborting this print request while the pages were being generated)\n          // would be aborted.\n          if (activeServiceOnEntry.active) {\n            abort();\n          }\n        });\n    }\n  }\n};\n\nfunction dispatchEvent(eventType) {\n  const event = new CustomEvent(eventType, {\n    bubbles: false,\n    cancelable: false,\n    detail: \"custom\",\n  });\n  window.dispatchEvent(event);\n}\n\nfunction abort() {\n  if (activeService) {\n    activeService.destroy();\n    dispatchEvent(\"afterprint\");\n  }\n}\n\nfunction renderProgress(index, total) {\n  if (typeof PDFJSDev === \"undefined\" && window.isGECKOVIEW) {\n    return;\n  }\n  dialog ||= document.getElementById(\"printServiceDialog\");\n  const progress = Math.round((100 * index) / total);\n  const progressBar = dialog.querySelector(\"progress\");\n  const progressPerc = dialog.querySelector(\".relative-progress\");\n  progressBar.value = progress;\n  progressPerc.setAttribute(\"data-l10n-args\", JSON.stringify({ progress }));\n}\n\nwindow.addEventListener(\n  \"keydown\",\n  function (event) {\n    // Intercept Cmd/Ctrl + P in all browsers.\n    // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera\n    if (\n      event.keyCode === /* P= */ 80 &&\n      (event.ctrlKey || event.metaKey) &&\n      !event.altKey &&\n      (!event.shiftKey || window.chrome || window.opera)\n    ) {\n      window.print();\n\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    }\n  },\n  true\n);\n\nif (\"onbeforeprint\" in window) {\n  // Do not propagate before/afterprint events when they are not triggered\n  // from within this polyfill. (FF / Chrome 63+).\n  const stopPropagationIfNeeded = function (event) {\n    if (event.detail !== \"custom\") {\n      event.stopImmediatePropagation();\n    }\n  };\n  window.addEventListener(\"beforeprint\", stopPropagationIfNeeded);\n  window.addEventListener(\"afterprint\", stopPropagationIfNeeded);\n}\n\nlet overlayPromise;\nfunction ensureOverlay() {\n  if (typeof PDFJSDev === \"undefined\" && window.isGECKOVIEW) {\n    return Promise.reject(\n      new Error(\"ensureOverlay not implemented in GECKOVIEW development mode.\")\n    );\n  }\n  if (!overlayPromise) {\n    overlayManager = viewerApp.overlayManager;\n    if (!overlayManager) {\n      throw new Error(\"The overlay manager has not yet been initialized.\");\n    }\n    dialog ||= document.getElementById(\"printServiceDialog\");\n\n    overlayPromise = overlayManager.register(\n      dialog,\n      /* canForceClose = */ true\n    );\n\n    document.getElementById(\"printCancel\").onclick = abort;\n    dialog.addEventListener(\"close\", abort);\n  }\n  return overlayPromise;\n}\n\nclass PDFPrintServiceFactory extends BasePrintServiceFactory {\n  static initGlobals(app) {\n    viewerApp = app;\n  }\n\n  static get supportsPrinting() {\n    return shadow(this, \"supportsPrinting\", true);\n  }\n\n  static createPrintService(params) {\n    if (activeService) {\n      throw new Error(\"The print service is created and active.\");\n    }\n    return (activeService = new PDFPrintService(params));\n  }\n}\n\nexport { PDFPrintServiceFactory };\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst RenderingStates = {\n  INITIAL: 0,\n  RUNNING: 1,\n  PAUSED: 2,\n  FINISHED: 3,\n};\n\nclass RenderableView {\n  /**\n   * Unique ID for rendering queue.\n   * @type {string}\n   */\n  renderingId = \"\";\n\n  /**\n   * @type {import(\"../src/display/api\").RenderTask | null}\n   */\n  renderTask = null;\n\n  /**\n   * @type {function | null}\n   */\n  resume = null;\n\n  constructor() {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n      this.constructor === RenderableView\n    ) {\n      throw new Error(\"Cannot initialize RenderableView.\");\n    }\n  }\n\n  /**\n   * @type {number}\n   */\n  get renderingState() {\n    throw new Error(\"Abstract getter `renderingState` accessed\");\n  }\n\n  /**\n   * @param {number} state\n   */\n  set renderingState(state) {\n    throw new Error(\"Abstract setter `renderingState` accessed\");\n  }\n\n  /**\n   * @returns {Promise} Resolved on draw completion.\n   */\n  async draw() {\n    throw new Error(\"Not implemented: draw\");\n  }\n}\n\nexport { RenderableView, RenderingStates };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./pdf_viewer\").PDFViewer} PDFViewer */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_thumbnail_viewer\").PDFThumbnailViewer} PDFThumbnailViewer */\n/** @typedef {import(\"./renderable_view\").RenderableView} RenderableView */\n\nimport { RenderingCancelledException } from \"pdfjs-lib\";\nimport { RenderingStates } from \"./renderable_view.js\";\n\nconst CLEANUP_TIMEOUT = 30000;\n\n/**\n * Controls rendering of the views for pages and thumbnails.\n */\nclass PDFRenderingQueue {\n  #highestPriorityPage = null;\n\n  #idleTimeout = null;\n\n  #pdfThumbnailViewer = null;\n\n  #pdfViewer = null;\n\n  isThumbnailViewEnabled = false;\n\n  onIdle = null;\n\n  printing = false;\n\n  constructor() {\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      Object.defineProperty(this, \"hasViewer\", {\n        value: () => !!this.#pdfViewer,\n      });\n    }\n  }\n\n  /**\n   * @param {PDFViewer} pdfViewer\n   */\n  setViewer(pdfViewer) {\n    this.#pdfViewer = pdfViewer;\n  }\n\n  /**\n   * @param {PDFThumbnailViewer} pdfThumbnailViewer\n   */\n  setThumbnailViewer(pdfThumbnailViewer) {\n    this.#pdfThumbnailViewer = pdfThumbnailViewer;\n  }\n\n  /**\n   * @param {RenderableView} view\n   * @returns {boolean}\n   */\n  isHighestPriority(view) {\n    return this.#highestPriorityPage === view.renderingId;\n  }\n\n  /**\n   * @param {Object} currentlyVisiblePages\n   */\n  renderHighestPriority(currentlyVisiblePages) {\n    if (this.#idleTimeout) {\n      clearTimeout(this.#idleTimeout);\n      this.#idleTimeout = null;\n    }\n\n    // Pages have a higher priority than thumbnails, so check them first.\n    if (this.#pdfViewer.forceRendering(currentlyVisiblePages)) {\n      return;\n    }\n    // No pages needed rendering, so check thumbnails.\n    if (\n      this.isThumbnailViewEnabled &&\n      this.#pdfThumbnailViewer?.forceRendering()\n    ) {\n      return;\n    }\n\n    if (this.printing) {\n      // If printing is currently ongoing do not reschedule cleanup.\n      return;\n    }\n\n    if (this.onIdle) {\n      this.#idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n    }\n  }\n\n  /**\n   * @param {Object} visible\n   * @param {Array} views\n   * @param {boolean} scrolledDown\n   * @param {boolean} [preRenderExtra]\n   * @param {boolean} [ignoreDetailViews]\n   */\n  getHighestPriority(\n    visible,\n    views,\n    scrolledDown,\n    preRenderExtra = false,\n    ignoreDetailViews = false\n  ) {\n    /**\n     * The state has changed. Figure out which page has the highest priority to\n     * render next (if any).\n     *\n     * Priority:\n     * 1. visible pages\n     * 2. zoomed-in partial views of visible pages, unless `ignoreDetailViews`\n     * 3. if last scrolled down, the page after the visible pages, or\n     *    if last scrolled up, the page before the visible pages\n     */\n    const visibleViews = visible.views,\n      numVisible = visibleViews.length;\n\n    if (numVisible === 0) {\n      return null;\n    }\n    for (let i = 0; i < numVisible; i++) {\n      const view = visibleViews[i].view;\n      if (!this.isViewFinished(view)) {\n        return view;\n      }\n    }\n\n    if (!ignoreDetailViews) {\n      for (let i = 0; i < numVisible; i++) {\n        const { detailView } = visibleViews[i].view;\n        if (detailView && !this.isViewFinished(detailView)) {\n          return detailView;\n        }\n      }\n    }\n\n    const firstId = visible.first.id,\n      lastId = visible.last.id;\n\n    // All the visible views have rendered; try to handle any \"holes\" in the\n    // page layout (can happen e.g. with spreadModes at higher zoom levels).\n    if (lastId - firstId + 1 > numVisible) {\n      const visibleIds = visible.ids;\n      for (let i = 1, ii = lastId - firstId; i < ii; i++) {\n        const holeId = scrolledDown ? firstId + i : lastId - i;\n        if (visibleIds.has(holeId)) {\n          continue;\n        }\n        const holeView = views[holeId - 1];\n        if (!this.isViewFinished(holeView)) {\n          return holeView;\n        }\n      }\n    }\n\n    // All the visible views have rendered; try to render next/previous page.\n    // (IDs start at 1, so no need to add 1 when `scrolledDown === true`.)\n    let preRenderIndex = scrolledDown ? lastId : firstId - 2;\n    let preRenderView = views[preRenderIndex];\n\n    if (preRenderView && !this.isViewFinished(preRenderView)) {\n      return preRenderView;\n    }\n    if (preRenderExtra) {\n      preRenderIndex += scrolledDown ? 1 : -1;\n      preRenderView = views[preRenderIndex];\n\n      if (preRenderView && !this.isViewFinished(preRenderView)) {\n        return preRenderView;\n      }\n    }\n    // Everything that needs to be rendered has been.\n    return null;\n  }\n\n  /**\n   * @param {RenderableView} view\n   * @returns {boolean}\n   */\n  isViewFinished(view) {\n    return view.renderingState === RenderingStates.FINISHED;\n  }\n\n  /**\n   * Render a page or thumbnail view. This calls the appropriate function\n   * based on the views state. If the view is already rendered it will return\n   * `false`.\n   *\n   * @param {RenderableView} view\n   */\n  renderView(view) {\n    switch (view.renderingState) {\n      case RenderingStates.FINISHED:\n        return false;\n      case RenderingStates.PAUSED:\n        this.#highestPriorityPage = view.renderingId;\n        view.resume();\n        break;\n      case RenderingStates.RUNNING:\n        this.#highestPriorityPage = view.renderingId;\n        break;\n      case RenderingStates.INITIAL:\n        this.#highestPriorityPage = view.renderingId;\n        view\n          .draw()\n          .finally(() => {\n            this.renderHighestPriority();\n          })\n          .catch(reason => {\n            if (reason instanceof RenderingCancelledException) {\n              return;\n            }\n            console.error(\"renderView:\", reason);\n          });\n        break;\n    }\n    return true;\n  }\n}\n\nexport { PDFRenderingQueue };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n\nimport { apiPageLayoutToViewerModes } from \"./ui_utils.js\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { RenderingStates } from \"./renderable_view.js\";\nimport { shadow } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} PDFScriptingManagerOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {string} [sandboxBundleSrc] - The path and filename of the\n *   scripting bundle.\n * @property {Object} [externalServices] - The factory that is used when\n *   initializing scripting; must contain a `createScripting` method.\n *   PLEASE NOTE: Primarily intended for the default viewer use-case.\n * @property {function} [docProperties] - The function that is used to lookup\n *   the necessary document properties.\n */\n\nclass PDFScriptingManager {\n  #closeCapability = null;\n\n  #destroyCapability = null;\n\n  #docProperties = null;\n\n  #eventAC = null;\n\n  #eventBus = null;\n\n  #externalServices = null;\n\n  #pdfDocument = null;\n\n  #pdfViewer = null;\n\n  #ready = false;\n\n  #scripting = null;\n\n  #willPrintCapability = null;\n\n  /**\n   * @param {PDFScriptingManagerOptions} options\n   */\n  constructor({ eventBus, externalServices = null, docProperties = null }) {\n    this.#eventBus = eventBus;\n    this.#externalServices = externalServices;\n    this.#docProperties = docProperties;\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      Object.defineProperty(this, \"sandboxTrip\", {\n        value: () =>\n          setTimeout(\n            () =>\n              this.#scripting?.dispatchEventInSandbox({\n                name: \"sandboxtripbegin\",\n              }),\n            0\n          ),\n      });\n    }\n  }\n\n  setViewer(pdfViewer) {\n    this.#pdfViewer = pdfViewer;\n  }\n\n  async setDocument(pdfDocument) {\n    if (this.#pdfDocument) {\n      await this.#destroyScripting();\n    }\n    this.#pdfDocument = pdfDocument;\n\n    if (!pdfDocument) {\n      return;\n    }\n    const [objects, calculationOrder, docActions] = await Promise.all([\n      pdfDocument.getFieldObjects(),\n      pdfDocument.getCalculationOrderIds(),\n      pdfDocument.getJSActions(),\n    ]);\n\n    if (!objects && !docActions) {\n      // No FieldObjects or JavaScript actions were found in the document.\n      await this.#destroyScripting();\n      return;\n    }\n    if (pdfDocument !== this.#pdfDocument) {\n      return; // The document was closed while the data resolved.\n    }\n    try {\n      this.#scripting = this.#initScripting();\n    } catch (error) {\n      console.error(\"setDocument:\", error);\n\n      await this.#destroyScripting();\n      return;\n    }\n    const eventBus = this.#eventBus;\n\n    this.#eventAC = new AbortController();\n    const evtOpts = { signal: this.#eventAC.signal, ...internalOpt };\n\n    eventBus.on(\n      \"updatefromsandbox\",\n      event => {\n        if (event?.source === window) {\n          this.#updateFromSandbox(event.detail);\n        }\n      },\n      evtOpts\n    );\n    eventBus.on(\n      \"dispatcheventinsandbox\",\n      event => {\n        this.#scripting?.dispatchEventInSandbox(event.detail);\n      },\n      evtOpts\n    );\n\n    eventBus.on(\n      \"pagechanging\",\n      ({ pageNumber, previous }) => {\n        if (pageNumber === previous) {\n          return; // The current page didn't change.\n        }\n        this.#dispatchPageClose(previous);\n        this.#dispatchPageOpen(pageNumber);\n      },\n      evtOpts\n    );\n    eventBus.on(\n      \"pagerendered\",\n      ({ pageNumber }) => {\n        if (!this._pageOpenPending.has(pageNumber)) {\n          return; // No pending \"PageOpen\" event for the newly rendered page.\n        }\n        if (pageNumber !== this.#pdfViewer.currentPageNumber) {\n          return; // The newly rendered page is no longer the current one.\n        }\n        this.#dispatchPageOpen(pageNumber);\n      },\n      evtOpts\n    );\n    eventBus.on(\n      \"pagesdestroy\",\n      async () => {\n        await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber);\n\n        await this.#scripting?.dispatchEventInSandbox({\n          id: \"doc\",\n          name: \"WillClose\",\n        });\n\n        this.#closeCapability?.resolve();\n      },\n      evtOpts\n    );\n\n    try {\n      const docProperties = await this.#docProperties(pdfDocument);\n      if (pdfDocument !== this.#pdfDocument) {\n        return; // The document was closed while the properties resolved.\n      }\n\n      await this.#scripting.createSandbox({\n        objects,\n        calculationOrder,\n        appInfo: {\n          platform: navigator.platform,\n          language: navigator.language,\n        },\n        docInfo: {\n          ...docProperties,\n          actions: docActions,\n        },\n      });\n\n      eventBus.dispatch(\"sandboxcreated\", { source: this });\n    } catch (error) {\n      console.error(\"setDocument:\", error);\n\n      await this.#destroyScripting();\n      return;\n    }\n\n    await this.#scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"Open\",\n    });\n    await this.#dispatchPageOpen(\n      this.#pdfViewer.currentPageNumber,\n      /* initialize = */ true\n    );\n\n    // Defer this slightly, to ensure that scripting is *fully* initialized.\n    Promise.resolve().then(() => {\n      if (pdfDocument === this.#pdfDocument) {\n        this.#ready = true;\n      }\n    });\n  }\n\n  async dispatchWillSave() {\n    return this.#scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"WillSave\",\n    });\n  }\n\n  async dispatchDidSave() {\n    return this.#scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"DidSave\",\n    });\n  }\n\n  async dispatchWillPrint() {\n    if (!this.#scripting) {\n      return;\n    }\n    await this.#willPrintCapability?.promise;\n    this.#willPrintCapability = Promise.withResolvers();\n    try {\n      await this.#scripting.dispatchEventInSandbox({\n        id: \"doc\",\n        name: \"WillPrint\",\n      });\n    } catch (ex) {\n      this.#willPrintCapability.resolve();\n      this.#willPrintCapability = null;\n      throw ex;\n    }\n\n    await this.#willPrintCapability.promise;\n  }\n\n  async dispatchDidPrint() {\n    return this.#scripting?.dispatchEventInSandbox({\n      id: \"doc\",\n      name: \"DidPrint\",\n    });\n  }\n\n  get destroyPromise() {\n    return this.#destroyCapability?.promise || null;\n  }\n\n  get ready() {\n    return this.#ready;\n  }\n\n  /**\n   * @private\n   */\n  get _pageOpenPending() {\n    return shadow(this, \"_pageOpenPending\", new Set());\n  }\n\n  /**\n   * @private\n   */\n  get _visitedPages() {\n    return shadow(this, \"_visitedPages\", new Map());\n  }\n\n  async #updateFromSandbox(detail) {\n    const pdfViewer = this.#pdfViewer;\n    // Ignore some events, see below, that don't make sense in PresentationMode.\n    const isInPresentationMode =\n      pdfViewer.isInPresentationMode || pdfViewer.isChangingPresentationMode;\n\n    const { id, siblings, command, value } = detail;\n    if (!id) {\n      if (\n        typeof PDFJSDev !== \"undefined\" &&\n        PDFJSDev.test(\"TESTING\") &&\n        command === \"sandboxTripEnd\"\n      ) {\n        window.setTimeout(() => {\n          window.dispatchEvent(new CustomEvent(\"sandboxtripend\"));\n        }, 0);\n        return;\n      }\n\n      switch (command) {\n        case \"clear\":\n          console.clear();\n          break;\n        case \"error\":\n          console.error(value);\n          break;\n        case \"layout\":\n          if (!isInPresentationMode) {\n            const modes = apiPageLayoutToViewerModes(value);\n            pdfViewer.spreadMode = modes.spreadMode;\n          }\n          break;\n        case \"page-num\":\n          pdfViewer.currentPageNumber = value + 1;\n          break;\n        case \"print\":\n          await pdfViewer.pagesPromise;\n          this.#eventBus.dispatch(\"print\", { source: this });\n          break;\n        case \"println\":\n          console.log(value);\n          break;\n        case \"zoom\":\n          if (!isInPresentationMode) {\n            pdfViewer.currentScaleValue = value;\n          }\n          break;\n        case \"SaveAs\":\n          this.#eventBus.dispatch(\"download\", { source: this });\n          break;\n        case \"FirstPage\":\n          pdfViewer.currentPageNumber = 1;\n          break;\n        case \"LastPage\":\n          pdfViewer.currentPageNumber = pdfViewer.pagesCount;\n          break;\n        case \"NextPage\":\n          pdfViewer.nextPage();\n          break;\n        case \"PrevPage\":\n          pdfViewer.previousPage();\n          break;\n        case \"ZoomViewIn\":\n          if (!isInPresentationMode) {\n            pdfViewer.increaseScale();\n          }\n          break;\n        case \"ZoomViewOut\":\n          if (!isInPresentationMode) {\n            pdfViewer.decreaseScale();\n          }\n          break;\n        case \"WillPrintFinished\":\n          this.#willPrintCapability?.resolve();\n          this.#willPrintCapability = null;\n          break;\n      }\n      return;\n    }\n\n    if (isInPresentationMode && detail.focus) {\n      return;\n    }\n    delete detail.id;\n    delete detail.siblings;\n\n    const ids = siblings ? [id, ...siblings] : [id];\n    for (const elementId of ids) {\n      const element = document.querySelector(\n        `[data-element-id=\"${elementId}\"]`\n      );\n      if (element) {\n        element.dispatchEvent(new CustomEvent(\"updatefromsandbox\", { detail }));\n      } else {\n        // The element hasn't been rendered yet, use the AnnotationStorage.\n        this.#pdfDocument?.annotationStorage.setValue(elementId, detail);\n      }\n    }\n  }\n\n  async #dispatchPageOpen(pageNumber, initialize = false) {\n    const pdfDocument = this.#pdfDocument,\n      visitedPages = this._visitedPages;\n\n    if (initialize) {\n      this.#closeCapability = Promise.withResolvers();\n    }\n    if (!this.#closeCapability) {\n      return; // Scripting isn't fully initialized yet.\n    }\n    const pageView = this.#pdfViewer.getPageView(/* index = */ pageNumber - 1);\n\n    if (pageView?.renderingState !== RenderingStates.FINISHED) {\n      this._pageOpenPending.add(pageNumber);\n      return; // Wait for the page to finish rendering.\n    }\n    this._pageOpenPending.delete(pageNumber);\n\n    const actionsPromise = (async () => {\n      // Avoid sending, and thus serializing, the `actions` data more than once.\n      const actions = await (!visitedPages.has(pageNumber)\n        ? pageView.pdfPage?.getJSActions()\n        : null);\n      if (pdfDocument !== this.#pdfDocument) {\n        return; // The document was closed while the actions resolved.\n      }\n\n      await this.#scripting?.dispatchEventInSandbox({\n        id: \"page\",\n        name: \"PageOpen\",\n        pageNumber,\n        actions,\n      });\n    })();\n    visitedPages.set(pageNumber, actionsPromise);\n  }\n\n  async #dispatchPageClose(pageNumber) {\n    const pdfDocument = this.#pdfDocument,\n      visitedPages = this._visitedPages;\n\n    if (!this.#closeCapability) {\n      return; // Scripting isn't fully initialized yet.\n    }\n    if (this._pageOpenPending.has(pageNumber)) {\n      return; // The page is still rendering; no \"PageOpen\" event dispatched.\n    }\n    const actionsPromise = visitedPages.get(pageNumber);\n    if (!actionsPromise) {\n      return; // The \"PageClose\" event must be preceded by a \"PageOpen\" event.\n    }\n    visitedPages.set(pageNumber, null);\n\n    // Ensure that the \"PageOpen\" event is dispatched first.\n    await actionsPromise;\n    if (pdfDocument !== this.#pdfDocument) {\n      return; // The document was closed while the actions resolved.\n    }\n\n    await this.#scripting?.dispatchEventInSandbox({\n      id: \"page\",\n      name: \"PageClose\",\n      pageNumber,\n    });\n  }\n\n  #initScripting() {\n    this.#destroyCapability = Promise.withResolvers();\n\n    if (this.#scripting) {\n      throw new Error(\"#initScripting: Scripting already exists.\");\n    }\n    return this.#externalServices.createScripting();\n  }\n\n  async #destroyScripting() {\n    if (!this.#scripting) {\n      this.#pdfDocument = null;\n\n      this.#destroyCapability?.resolve();\n      return;\n    }\n    if (this.#closeCapability) {\n      await Promise.race([\n        this.#closeCapability.promise,\n        new Promise(resolve => {\n          // Avoid the scripting/sandbox-destruction hanging indefinitely.\n          setTimeout(resolve, 1000);\n        }),\n      ]).catch(() => {\n        // Ignore any errors, to ensure that the sandbox is always destroyed.\n      });\n      this.#closeCapability = null;\n    }\n    this.#pdfDocument = null;\n\n    try {\n      await this.#scripting.destroySandbox();\n    } catch {}\n\n    this.#willPrintCapability?.reject(new Error(\"Scripting destroyed.\"));\n    this.#willPrintCapability = null;\n\n    this.#eventAC?.abort();\n    this.#eventAC = null;\n\n    this._pageOpenPending.clear();\n    this._visitedPages.clear();\n\n    this.#scripting = null;\n    this.#ready = false;\n\n    this.#destroyCapability?.resolve();\n  }\n}\n\nexport { PDFScriptingManager };\n","/* Copyright 2024 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { internalOpt } from \"./internal_evt.js\";\n\n/**\n * This class manages the interaction of extracting the text content of the page\n * and passing it back to the external service.\n */\nclass PdfTextExtractor {\n  /** @type {BaseExternalServices} */\n  #externalServices;\n\n  /** @type {?Promise<string>} */\n  #textPromise;\n\n  #capability = Promise.withResolvers();\n\n  constructor(externalServices, pdfViewer, eventBus) {\n    this.#externalServices = externalServices;\n\n    eventBus.on(\n      \"pagesinit\",\n      () => {\n        this.#capability.resolve(pdfViewer);\n      },\n      internalOpt\n    );\n    eventBus.on(\n      \"pagesdestroy\",\n      () => {\n        this.#capability.reject(new Error(\"pagesdestroy\"));\n        this.#textPromise = null;\n\n        this.#capability = Promise.withResolvers();\n      },\n      internalOpt\n    );\n\n    window.addEventListener(\"requestTextContent\", ({ detail }) => {\n      this.extractTextContent(detail.requestId);\n    });\n  }\n\n  /**\n   * Builds up all of the text from a PDF.\n   *\n   * @param {number} requestId\n   */\n  async extractTextContent(requestId) {\n    if (!this.#textPromise) {\n      const textPromise = (this.#textPromise = this.#capability.promise.then(\n        pdfViewer => pdfViewer.getAllText()\n      ));\n\n      // After the text resolves, cache the text for a little bit in case\n      // multiple consumers call it.\n      textPromise.then(() => {\n        setTimeout(() => {\n          if (this.#textPromise === textPromise) {\n            this.#textPromise = null;\n          }\n        }, 5000);\n      });\n    }\n\n    this.#externalServices.reportText({\n      text: await this.#textPromise,\n      requestId,\n    });\n  }\n}\n\nexport { PdfTextExtractor };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { noContextMenu, stopEvent } from \"pdfjs-lib\";\n\nclass Menu {\n  #triggeringButton;\n\n  #menu;\n\n  #menuItems;\n\n  #openMenuAC = null;\n\n  #menuAC = new AbortController();\n\n  #lastIndex = -1;\n\n  #onFocusOutBound = this.#onFocusOut.bind(this);\n\n  /**\n   * Create a menu for the given button.\n   * @param {HTMLElement} menuContainer\n   * @param {HTMLElement} triggeringButton\n   * @param {Array<HTMLElement>|null} menuItems\n   */\n  constructor(menuContainer, triggeringButton, menuItems) {\n    this.#menu = menuContainer;\n    this.#triggeringButton = triggeringButton;\n    if (Array.isArray(menuItems)) {\n      this.#menuItems = menuItems;\n    } else {\n      this.#menuItems = [];\n      for (const button of this.#menu.querySelectorAll(\"button\")) {\n        this.#menuItems.push(button);\n      }\n    }\n    this.#setUpMenu();\n  }\n\n  /**\n   * Close the menu.\n   */\n  #closeMenu() {\n    if (!this.#openMenuAC) {\n      return;\n    }\n    const menu = this.#menu;\n    this.#triggeringButton.ariaExpanded = \"false\";\n    this.#openMenuAC.abort();\n    this.#openMenuAC = null;\n    if (menu.contains(document.activeElement)) {\n      // If the menu is closed while focused, focus the actions button.\n      setTimeout(() => {\n        if (!menu.contains(document.activeElement)) {\n          this.#triggeringButton.focus();\n        }\n      }, 0);\n    }\n    this.#lastIndex = -1;\n  }\n\n  /**\n   * Open the menu.\n   */\n  #openMenu() {\n    if (this.#openMenuAC) {\n      return;\n    }\n\n    const menu = this.#menu;\n    this.#triggeringButton.ariaExpanded = \"true\";\n    this.#openMenuAC = new AbortController();\n    const signal = AbortSignal.any([\n      this.#menuAC.signal,\n      this.#openMenuAC.signal,\n    ]);\n    window.addEventListener(\n      \"pointerdown\",\n      ({ target }) => {\n        if (\n          !this.#triggeringButton.contains(target) &&\n          !menu.contains(target)\n        ) {\n          this.#closeMenu();\n        }\n      },\n      { signal }\n    );\n    const closeMenu = this.#closeMenu.bind(this);\n    window.addEventListener(\"blur\", closeMenu, { signal });\n    menu.addEventListener(\"focusout\", this.#onFocusOutBound, { signal });\n  }\n\n  #onFocusOut({ relatedTarget }) {\n    if (\n      !this.#triggeringButton.contains(relatedTarget) &&\n      !this.#menu.contains(relatedTarget)\n    ) {\n      this.#closeMenu();\n    }\n  }\n\n  /**\n   * Set up the menu.\n   */\n  #setUpMenu() {\n    this.#triggeringButton.addEventListener(\"click\", e => {\n      if (this.#openMenuAC) {\n        this.#closeMenu();\n        return;\n      }\n\n      this.#openMenu();\n    });\n    this.#triggeringButton.addEventListener(\"focusout\", this.#onFocusOutBound);\n\n    const { signal } = this.#menuAC;\n\n    this.#menu.addEventListener(\n      \"keydown\",\n      e => {\n        switch (e.key) {\n          case \"Escape\":\n            this.#closeMenu();\n            stopEvent(e);\n            break;\n          case \"ArrowDown\":\n            this.#goToNextItem(e.target, true);\n            stopEvent(e);\n            break;\n          case \"ArrowUp\":\n            this.#goToNextItem(e.target, false);\n            stopEvent(e);\n            break;\n          case \"Home\":\n            this.#menuItems\n              .find(\n                item => !item.disabled && !item.classList.contains(\"hidden\")\n              )\n              ?.focus();\n            stopEvent(e);\n            break;\n          case \"End\":\n            this.#menuItems\n              .findLast(\n                item => !item.disabled && !item.classList.contains(\"hidden\")\n              )\n              ?.focus();\n            stopEvent(e);\n            break;\n          default:\n            const { key } = e;\n            if (!/^\\p{L}$/u.test(key)) {\n              // It isn't a single letter, so ignore it.\n              break;\n            }\n            const char = key.toLocaleLowerCase();\n            this.#goToNextItem(e.target, true, item =>\n              item.textContent.trim().toLowerCase().startsWith(char)\n            );\n            stopEvent(e);\n            break;\n        }\n      },\n      { signal, capture: true }\n    );\n    this.#menu.addEventListener(\"contextmenu\", noContextMenu, { signal });\n    this.#menu.addEventListener(\"click\", this.#closeMenu.bind(this), {\n      signal,\n      capture: true,\n    });\n    this.#triggeringButton.addEventListener(\n      \"keydown\",\n      e => {\n        switch (e.key) {\n          case \" \":\n          case \"Enter\":\n          case \"ArrowDown\":\n          case \"Home\":\n            stopEvent(e);\n            if (!this.#openMenuAC) {\n              this.#openMenu();\n            }\n            this.#menuItems\n              .find(\n                item => !item.disabled && !item.classList.contains(\"hidden\")\n              )\n              ?.focus();\n            break;\n          case \"ArrowUp\":\n          case \"End\":\n            stopEvent(e);\n            if (!this.#openMenuAC) {\n              this.#openMenu();\n            }\n            this.#menuItems\n              .findLast(\n                item => !item.disabled && !item.classList.contains(\"hidden\")\n              )\n              ?.focus();\n            break;\n          case \"Escape\":\n            this.#closeMenu();\n            stopEvent(e);\n            break;\n        }\n      },\n      { signal }\n    );\n  }\n\n  /**\n   * Go to the next/previous menu item.\n   * @param {HTMLElement} element\n   * @param {boolean} forward\n   */\n  #goToNextItem(element, forward, check = () => true) {\n    const index =\n      this.#lastIndex === -1\n        ? this.#menuItems.indexOf(element)\n        : this.#lastIndex;\n    const len = this.#menuItems.length;\n    const increment = forward ? 1 : len - 1;\n    for (\n      let i = (index + increment) % len;\n      i !== index;\n      i = (i + increment) % len\n    ) {\n      const menuItem = this.#menuItems[i];\n      if (\n        !menuItem.disabled &&\n        !menuItem.classList.contains(\"hidden\") &&\n        check(menuItem)\n      ) {\n        menuItem.focus();\n        this.#lastIndex = i;\n        break;\n      }\n    }\n  }\n\n  destroy() {\n    this.#closeMenu();\n    this.#menuAC?.abort();\n    this.#menuAC = null;\n  }\n}\n\nexport { Menu };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/optional_content_config\").OptionalContentConfig} OptionalContentConfig */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/page_viewport\").PageViewport} PageViewport */\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_rendering_queue\").PDFRenderingQueue} PDFRenderingQueue */\n\nimport { OutputScale, RenderingCancelledException } from \"pdfjs-lib\";\nimport { RenderableView, RenderingStates } from \"./renderable_view.js\";\nimport { AppOptions } from \"./app_options.js\";\n\nconst DRAW_UPSCALE_FACTOR = 2; // See comment in `PDFThumbnailView.draw` below.\nconst MAX_NUM_SCALING_STEPS = 3;\nconst THUMBNAIL_WIDTH = 126; // px\n\n/**\n * @typedef {Object} PDFThumbnailViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} id - The thumbnail's unique ID (normally its number).\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -\n *   A promise that is resolved with an {@link OptionalContentConfig} instance.\n *   The default value is `null`.\n * @property {PDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n *   total pixels, i.e. width * height. Use `-1` for no limit, or `0` for\n *   CSS-only zooming. The default value is 4096 * 8192 (32 mega-pixels).\n * @property {number} [maxCanvasDim] - The maximum supported canvas dimension,\n *   in either width or height. Use `-1` for no limit.\n *   The default value is 32767.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n *   with user defined ones in order to improve readability in high contrast\n *   mode.\n */\n\nfunction getTempCanvas(width, height) {\n  const canvas = new OffscreenCanvas(width, height);\n  // Since this is a temporary canvas, we need to fill it with a white\n  // background ourselves. `#getPageDrawContext` uses CSS rules for this.\n  const ctx = canvas.getContext(\"2d\", { alpha: false });\n  ctx.save();\n  ctx.fillStyle = \"rgb(255, 255, 255)\";\n  ctx.fillRect(0, 0, width, height);\n  ctx.restore();\n  return [canvas, ctx];\n}\n\nclass PDFThumbnailView extends RenderableView {\n  #renderingState = RenderingStates.INITIAL;\n\n  /**\n   * @param {PDFThumbnailViewOptions} options\n   */\n  constructor({\n    container,\n    eventBus,\n    id,\n    defaultViewport,\n    optionalContentConfigPromise,\n    linkService,\n    renderingQueue,\n    maxCanvasPixels,\n    maxCanvasDim,\n    pageColors,\n    enableSplitMerge = false,\n  }) {\n    super();\n    this.id = id;\n    this.renderingId = `thumbnail${id}`;\n    this.pageLabel = null;\n\n    this.pdfPage = null;\n    this.rotation = 0;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n    this._optionalContentConfigPromise = optionalContentConfigPromise || null;\n    this.maxCanvasPixels = maxCanvasPixels ?? AppOptions.get(\"maxCanvasPixels\");\n    this.maxCanvasDim = maxCanvasDim || AppOptions.get(\"maxCanvasDim\");\n    this.pageColors = pageColors || null;\n\n    this.eventBus = eventBus;\n    this.linkService = linkService;\n    this.renderingQueue = renderingQueue;\n\n    this.placeholder = null;\n\n    const thumbnailContainer = (this.div = document.createElement(\"div\"));\n    thumbnailContainer.className = \"thumbnail\";\n    thumbnailContainer.setAttribute(\"page-number\", id);\n\n    const imageContainer = (this.imageContainer =\n      document.createElement(\"div\"));\n    thumbnailContainer.append(imageContainer);\n    imageContainer.classList.add(\n      \"thumbnailImageContainer\",\n      \"missingThumbnailImage\"\n    );\n    imageContainer.role = \"button\";\n    imageContainer.tabIndex = -1;\n    imageContainer.draggable = false;\n    imageContainer.setAttribute(\"page-number\", id);\n    imageContainer.setAttribute(\"data-l10n-id\", \"pdfjs-thumb-page-title1\");\n    imageContainer.setAttribute(\"data-l10n-args\", this.#getPageL10nArgs(true));\n\n    const image = (this.image = document.createElement(\"img\"));\n    imageContainer.append(image);\n\n    if (enableSplitMerge) {\n      const checkbox = (this.checkbox = document.createElement(\"input\"));\n      checkbox.type = \"checkbox\";\n      checkbox.tabIndex = -1;\n      checkbox.setAttribute(\"data-l10n-id\", \"pdfjs-thumb-page-checkbox1\");\n      checkbox.setAttribute(\"data-l10n-args\", this.#getPageL10nArgs());\n      thumbnailContainer.append(checkbox);\n      this.pasteButton = null;\n    }\n\n    this.#updateDims();\n\n    container.append(thumbnailContainer);\n  }\n\n  clone(container, id) {\n    const thumbnailView = new PDFThumbnailView({\n      container,\n      id,\n      eventBus: this.eventBus,\n      defaultViewport: this.viewport,\n      optionalContentConfigPromise: this._optionalContentConfigPromise,\n      linkService: this.linkService,\n      renderingQueue: this.renderingQueue,\n      maxCanvasPixels: this.maxCanvasPixels,\n      maxCanvasDim: this.maxCanvasDim,\n      pageColors: this.pageColors,\n      enableSplitMerge: !!this.checkbox,\n    });\n    const { imageContainer } = this;\n    if (!imageContainer.classList.contains(\"missingThumbnailImage\")) {\n      thumbnailView.image.replaceWith(this.image.cloneNode(true));\n      thumbnailView.imageContainer.classList.remove(\"missingThumbnailImage\");\n    }\n    return thumbnailView;\n  }\n\n  addPasteButton(pasteCallback) {\n    if (this.pasteButton) {\n      return;\n    }\n    const pasteButton = (this.pasteButton = document.createElement(\"button\"));\n    pasteButton.classList.add(\"thumbnailPasteButton\", \"viewsManagerButton\");\n    pasteButton.tabIndex = 0;\n    pasteButton.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-views-manager-paste-button-after\"\n    );\n    pasteButton.setAttribute(\n      \"data-l10n-args\",\n      JSON.stringify({\n        page: this.pageLabel ?? this.id,\n      })\n    );\n    const span = document.createElement(\"span\");\n    span.setAttribute(\"data-l10n-id\", \"pdfjs-views-manager-paste-button-label\");\n    pasteButton.append(span);\n    pasteButton.addEventListener(\"click\", () => {\n      pasteCallback(this.id);\n    });\n    if (this.id === 1) {\n      const prevPasteButton = (this.prevPasteButton =\n        pasteButton.cloneNode(true));\n      prevPasteButton.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-views-manager-paste-button-before\"\n      );\n      prevPasteButton.addEventListener(\"click\", () => {\n        pasteCallback(0);\n      });\n      this.imageContainer.before(prevPasteButton);\n    }\n\n    this.imageContainer.after(pasteButton);\n  }\n\n  removePasteButton() {\n    this.pasteButton?.remove();\n    this.pasteButton = null;\n    this.prevPasteButton?.remove();\n    this.prevPasteButton = null;\n  }\n\n  toggleSelected(isSelected) {\n    if (this.checkbox) {\n      this.checkbox.checked = isSelected;\n    }\n  }\n\n  updateId(newId) {\n    this.id = newId;\n    this.renderingId = `thumbnail${newId}`;\n    this.div.setAttribute(\"page-number\", newId);\n    this.imageContainer.setAttribute(\"page-number\", newId);\n    // TODO: do we set the page label ?\n    this.setPageLabel(this.pageLabel);\n  }\n\n  #updateDims() {\n    const { width, height } = this.viewport;\n    const ratio = width / height;\n\n    const canvasWidth = (this.canvasWidth = THUMBNAIL_WIDTH);\n    const canvasHeight = (this.canvasHeight = (canvasWidth / ratio) | 0);\n    this.scale = canvasWidth / width;\n\n    this.imageContainer.style.height = `${canvasHeight}px`;\n  }\n\n  get renderingState() {\n    return this.#renderingState;\n  }\n\n  set renderingState(state) {\n    this.#renderingState = state;\n  }\n\n  setPdfPage(pdfPage) {\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport({ scale: 1, rotation: totalRotation });\n    this.reset();\n  }\n\n  reset() {\n    this.cancelRendering();\n    this.renderingState = RenderingStates.INITIAL;\n    this.#updateDims();\n\n    const { image, imageContainer } = this;\n    const url = image.src;\n    if (url) {\n      URL.revokeObjectURL(url);\n      image.src = \"\";\n      imageContainer.removeAttribute(\"data-l10n-id\");\n      imageContainer.removeAttribute(\"data-l10n-args\");\n      imageContainer.classList.add(\"missingThumbnailImage\");\n    }\n  }\n\n  destroy() {\n    this.reset();\n    this.toggleCurrent(false);\n    this.div.remove();\n  }\n\n  update({ rotation = null }) {\n    if (typeof rotation === \"number\") {\n      this.rotation = rotation; // The rotation may be zero.\n    }\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: 1,\n      rotation: totalRotation,\n    });\n    this.reset();\n  }\n\n  toggleCurrent(isCurrent) {\n    const { imageContainer } = this;\n    if (isCurrent) {\n      imageContainer.ariaCurrent = \"page\";\n      imageContainer.tabIndex = 0;\n      if (this.checkbox) {\n        this.checkbox.tabIndex = 0;\n      }\n    } else {\n      imageContainer.ariaCurrent = false;\n      imageContainer.tabIndex = -1;\n      if (this.checkbox) {\n        this.checkbox.tabIndex = -1;\n      }\n    }\n  }\n\n  /**\n   * PLEASE NOTE: Most likely you want to use the `this.reset()` method,\n   *              rather than calling this one directly.\n   */\n  cancelRendering() {\n    if (this.renderTask) {\n      this.renderTask.cancel();\n      this.renderTask = null;\n    }\n    this.resume = null;\n  }\n\n  #getPageDrawContext(upscaleFactor = 1) {\n    // Keep the no-thumbnail outline visible, i.e. `data-loaded === false`,\n    // until rendering/image conversion is complete, to avoid display issues.\n    const outputScale = new OutputScale();\n    const width = upscaleFactor * this.canvasWidth,\n      height = upscaleFactor * this.canvasHeight;\n\n    outputScale.limitCanvas(\n      width,\n      height,\n      this.maxCanvasPixels,\n      this.maxCanvasDim\n    );\n    // Because of: https://bugzilla.mozilla.org/show_bug.cgi?id=2003060\n    // we need use a HTMLCanvasElement here.\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = (width * outputScale.sx) | 0;\n    canvas.height = (height * outputScale.sy) | 0;\n\n    const transform = outputScale.scaled\n      ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0]\n      : null;\n\n    return { canvas, transform };\n  }\n\n  async #convertCanvasToImage(canvas) {\n    if (this.renderingState !== RenderingStates.FINISHED) {\n      throw new Error(\"#convertCanvasToImage: Rendering has not finished.\");\n    }\n    const reducedCanvas = this.#reduceImage(canvas);\n    const { imageContainer, image } = this;\n    const { promise, resolve } = Promise.withResolvers();\n    reducedCanvas.toBlob(resolve);\n    const blob = await promise;\n    image.src = URL.createObjectURL(blob);\n    image.setAttribute(\"data-l10n-id\", \"pdfjs-thumb-page-canvas\");\n    image.setAttribute(\"data-l10n-args\", this.#getPageL10nArgs());\n    imageContainer.classList.remove(\"missingThumbnailImage\");\n  }\n\n  async draw() {\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error(\"Must be in new state before drawing\");\n      return;\n    }\n    const { pageColors, pdfPage } = this;\n\n    if (!pdfPage) {\n      this.renderingState = RenderingStates.FINISHED;\n      throw new Error(\"pdfPage is not loaded\");\n    }\n\n    this.renderingState = RenderingStates.RUNNING;\n\n    // Render the thumbnail at a larger size and downsize the canvas (similar\n    // to `setImage`), to improve consistency between thumbnails created by\n    // the `draw` and `setImage` methods (fixes issue 8233).\n    // NOTE: To primarily avoid increasing memory usage too much, but also to\n    //   reduce downsizing overhead, we purposely limit the up-scaling factor.\n    const { canvas, transform } = this.#getPageDrawContext(DRAW_UPSCALE_FACTOR);\n    const drawViewport = this.viewport.clone({\n      scale: DRAW_UPSCALE_FACTOR * this.scale,\n    });\n    const renderContinueCallback = cont => {\n      if (!this.renderingQueue.isHighestPriority(this)) {\n        this.renderingState = RenderingStates.PAUSED;\n        this.resume = () => {\n          this.renderingState = RenderingStates.RUNNING;\n          cont();\n        };\n        return;\n      }\n      cont();\n    };\n\n    const renderContext = {\n      canvas,\n      transform,\n      viewport: drawViewport,\n      optionalContentConfigPromise: this._optionalContentConfigPromise,\n      pageColors,\n    };\n    const renderTask = (this.renderTask = pdfPage.render(renderContext));\n    renderTask.onContinue = renderContinueCallback;\n\n    let error = null;\n    try {\n      await renderTask.promise;\n    } catch (e) {\n      if (e instanceof RenderingCancelledException) {\n        return;\n      }\n      error = e;\n    } finally {\n      // The renderTask may have been replaced by a new one, so only remove\n      // the reference to the renderTask if it matches the one that is\n      // triggering this callback.\n      if (renderTask === this.renderTask) {\n        this.renderTask = null;\n      }\n    }\n    this.renderingState = RenderingStates.FINISHED;\n\n    await this.#convertCanvasToImage(canvas);\n\n    this.eventBus.dispatch(\"thumbnailrendered\", {\n      source: this,\n      pageNumber: this.id,\n      pdfPage,\n    });\n\n    if (error) {\n      throw error;\n    }\n  }\n\n  setImage(pageView) {\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      return;\n    }\n    const { thumbnailCanvas: canvas, pdfPage, scale } = pageView;\n    if (!canvas) {\n      return;\n    }\n    if (!this.pdfPage) {\n      this.setPdfPage(pdfPage);\n    }\n    if (scale < this.scale) {\n      // Avoid upscaling the image, since that makes the thumbnail look blurry.\n      return;\n    }\n    this.renderingState = RenderingStates.FINISHED;\n    this.#convertCanvasToImage(canvas);\n  }\n\n  #getReducedImageDims(canvas) {\n    const width = canvas.width << MAX_NUM_SCALING_STEPS,\n      height = canvas.height << MAX_NUM_SCALING_STEPS;\n\n    const outputScale = new OutputScale();\n    // Here we're not actually \"rendering\" to the canvas and the `OutputScale`\n    // is thus only used to limit the canvas size, hence the identity scale.\n    outputScale.sx = outputScale.sy = 1;\n\n    outputScale.limitCanvas(\n      width,\n      height,\n      this.maxCanvasPixels,\n      this.maxCanvasDim\n    );\n    return [(width * outputScale.sx) | 0, (height * outputScale.sy) | 0];\n  }\n\n  #reduceImage(img) {\n    const { canvas } = this.#getPageDrawContext(1);\n    const ctx = canvas.getContext(\"2d\", {\n      alpha: false,\n      willReadFrequently: false,\n    });\n\n    if (img.width <= 2 * canvas.width) {\n      ctx.drawImage(\n        img,\n        0,\n        0,\n        img.width,\n        img.height,\n        0,\n        0,\n        canvas.width,\n        canvas.height\n      );\n      return canvas;\n    }\n    // drawImage does an awful job of rescaling the image, doing it gradually.\n    let [reducedWidth, reducedHeight] = this.#getReducedImageDims(canvas);\n    const [reducedImage, reducedImageCtx] = getTempCanvas(\n      reducedWidth,\n      reducedHeight\n    );\n\n    while (reducedWidth > img.width || reducedHeight > img.height) {\n      reducedWidth >>= 1;\n      reducedHeight >>= 1;\n    }\n    reducedImageCtx.drawImage(\n      img,\n      0,\n      0,\n      img.width,\n      img.height,\n      0,\n      0,\n      reducedWidth,\n      reducedHeight\n    );\n    while (reducedWidth > 2 * canvas.width) {\n      reducedImageCtx.drawImage(\n        reducedImage,\n        0,\n        0,\n        reducedWidth,\n        reducedHeight,\n        0,\n        0,\n        reducedWidth >> 1,\n        reducedHeight >> 1\n      );\n      reducedWidth >>= 1;\n      reducedHeight >>= 1;\n    }\n    ctx.drawImage(\n      reducedImage,\n      0,\n      0,\n      reducedWidth,\n      reducedHeight,\n      0,\n      0,\n      canvas.width,\n      canvas.height\n    );\n    return canvas;\n  }\n\n  #getPageL10nArgs(hasTotal = false) {\n    return JSON.stringify({\n      page: this.pageLabel ?? this.id,\n      total: hasTotal ? this.linkService.pagesCount : undefined,\n    });\n  }\n\n  /**\n   * @param {string|null} label\n   */\n  setPageLabel(label) {\n    this.pageLabel = typeof label === \"string\" ? label : null;\n    this.imageContainer.setAttribute(\n      \"data-l10n-args\",\n      this.#getPageL10nArgs(true)\n    );\n    this.image.setAttribute(\"data-l10n-args\", this.#getPageL10nArgs());\n    this.checkbox?.setAttribute(\"data-l10n-args\", this.#getPageL10nArgs());\n  }\n}\n\nexport { PDFThumbnailView };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFDocumentProxy} PDFDocumentProxy */\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_rendering_queue\").PDFRenderingQueue} PDFRenderingQueue */\n/** @typedef {import(\"./pdf_link_service.js\").PDFLinkService} PDFLinkService */\n\nimport {\n  binarySearchFirstItem,\n  getVisibleElements,\n  isValidRotation,\n  watchScroll,\n} from \"./ui_utils.js\";\nimport { MathClamp, noContextMenu, stopEvent } from \"pdfjs-lib\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { Menu } from \"./menu.js\";\nimport { PDFThumbnailView } from \"./pdf_thumbnail_view.js\";\nimport { RenderingStates } from \"./renderable_view.js\";\n\nconst SCROLL_OPTIONS = {\n  behavior: \"instant\",\n  block: \"nearest\",\n  inline: \"nearest\",\n  container: \"nearest\",\n};\n\n// This value is based on the one used in Firefox.\n// See\n// https://searchfox.org/firefox-main/rev/04cf27582307a9c351e991c740828d54cf786b76/dom/events/EventStateManager.cpp#2675-2698\n// This threshold is used to distinguish between a click and a drag.\nconst DRAG_THRESHOLD_IN_PIXELS = 5;\nconst PIXELS_TO_SCROLL_WHEN_DRAGGING = 20;\nconst SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT = 15;\n\n/**\n * @typedef {Object} PDFThumbnailViewerOptions\n * @property {HTMLDivElement} container - The container for the thumbnail\n *   elements.\n * @property {EventBus} eventBus - The application event bus.\n * @property {PDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n *   total pixels, i.e. width * height. Use `-1` for no limit, or `0` for\n *   CSS-only zooming. The default value is 4096 * 8192 (32 mega-pixels).\n * @property {number} [maxCanvasDim] - The maximum supported canvas dimension,\n *   in either width or height. Use `-1` for no limit.\n *   The default value is 32767.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n *   with user defined ones in order to improve readability in high contrast\n *   mode.\n * @property {AbortSignal} [abortSignal] - The AbortSignal for the window\n *   events.\n * @property {boolean} [enableNewBadge] - Enables the \"new\" badge for the split\n *   and merge features.\n * @property {boolean} [enableMerge] - Enables the merge feature.\n *   The default value is `false`.\n * @property {boolean} [enableSplitMerge] - Enables split and merge features.\n *   The default value is `false`.\n * @property {Object} [statusBar] - The status bar elements to manage the status\n *   label and action when editing pages.\n * @property {Object} [undoBar] - The undo bar elements to manage the undo\n *   action.\n * @property {Object} [manageMenu] - The menu elements to manage saving edited\n *   PDF.\n * @property {Object} [waitingBar] - The waiting bar elements shown during\n *   long-running operations.\n * @property {Object} [addFileComponent] - The file picker and button used to\n *   add one or more PDF files to merge with the current one.\n */\n\n/**\n * Viewer control to display thumbnails for pages in a PDF document.\n */\nclass PDFThumbnailViewer {\n  static #draggingScaleFactor = 0;\n\n  #enableMerge = false;\n\n  #enableSplitMerge = false;\n\n  #dragAC = null;\n\n  #abortSignal = undefined;\n\n  #externalDragActive = false;\n\n  #draggedContainer = null;\n\n  #thumbnailsPositions = null;\n\n  #lastDraggedOverIndex = NaN;\n\n  #selectedPages = null;\n\n  #draggedImageX = 0;\n\n  #draggedImageY = 0;\n\n  #draggedImageWidth = 0;\n\n  #draggedImageHeight = 0;\n\n  #draggedImageOffsetX = 0;\n\n  #draggedImageOffsetY = 0;\n\n  #dragMarker = null;\n\n  #pageNumberToRemove = NaN;\n\n  #currentScrollBottom = 0;\n\n  #currentScrollTop = 0;\n\n  #pagesMapper = null;\n\n  #manageExportButton = null;\n\n  #manageDeleteButton = null;\n\n  #manageCopyButton = null;\n\n  #manageCutButton = null;\n\n  #copiedThumbnails = null;\n\n  #savedThumbnails = null;\n\n  #deletedPageNumbers = null;\n\n  #copiedPageNumbers = null;\n\n  #boundPastePages = this.#pastePages.bind(this);\n\n  #isCut = false;\n\n  #isOneColumnView = false;\n\n  #scrollableContainerWidth = 0;\n\n  #scrollableContainerHeight = 0;\n\n  #statusLabel = null;\n\n  #statusBar = null;\n\n  #deselectButton = null;\n\n  #undoBar = null;\n\n  #undoLabel = null;\n\n  #undoButton = null;\n\n  #undoCloseButton = null;\n\n  #waitingBar = null;\n\n  #isInPasteMode = false;\n\n  #hasUndoBarVisible = false;\n\n  #newBadge = null;\n\n  /**\n   * @param {PDFThumbnailViewerOptions} options\n   */\n  constructor({\n    container,\n    eventBus,\n    linkService,\n    renderingQueue,\n    maxCanvasPixels,\n    maxCanvasDim,\n    pageColors,\n    abortSignal,\n    enableMerge,\n    enableSplitMerge,\n    enableNewBadge,\n    statusBar,\n    undoBar,\n    waitingBar,\n    manageMenu,\n    addFileComponent,\n  }) {\n    this.scrollableContainer = container.parentElement;\n    this.container = container;\n    this.eventBus = eventBus;\n    this.linkService = linkService;\n    this.renderingQueue = renderingQueue;\n    this.maxCanvasPixels = maxCanvasPixels;\n    this.maxCanvasDim = maxCanvasDim;\n    this.pageColors = pageColors || null;\n    this.#abortSignal = abortSignal;\n    this.#enableMerge = enableMerge || false;\n    this.#enableSplitMerge = enableSplitMerge || false;\n    this.#statusLabel = statusBar?.viewsManagerStatusActionLabel || null;\n    this.#deselectButton =\n      statusBar?.viewsManagerStatusActionDeselectButton || null;\n    this.#statusBar = statusBar?.viewsManagerStatusAction || null;\n    this.#undoBar = undoBar?.viewsManagerStatusUndo || null;\n    this.#undoLabel = undoBar?.viewsManagerStatusUndoLabel || null;\n    this.#undoButton = undoBar?.viewsManagerStatusUndoButton || null;\n    this.#undoCloseButton = undoBar?.viewsManagerStatusUndoCloseButton || null;\n    this.#waitingBar = waitingBar || null;\n\n    if (this.#enableSplitMerge && manageMenu) {\n      const {\n        button: menuButton,\n        menu,\n        copy,\n        cut,\n        delete: del,\n        exportSelected,\n      } = manageMenu;\n\n      if (enableNewBadge) {\n        const newSpan = document.createElement(\"span\");\n        newSpan.setAttribute(\"data-l10n-id\", \"pdfjs-new-badge-content\");\n        newSpan.classList.add(\"newBadge\");\n        menuButton.parentElement.before(newSpan);\n        this.#newBadge = newSpan;\n      }\n\n      eventBus.on(\n        \"pagesloaded\",\n        () => {\n          menuButton.disabled = false;\n        },\n        { once: true, ...internalOpt }\n      );\n\n      this._manageMenu = new Menu(menu, menuButton, [\n        copy,\n        cut,\n        del,\n        exportSelected,\n      ]);\n      this.#manageExportButton = exportSelected;\n      exportSelected.addEventListener(\n        \"click\",\n        this.#saveExtractedPages.bind(this)\n      );\n      this.#manageDeleteButton = del;\n      del.addEventListener(\"click\", this.#deletePages.bind(this, \"delete\"));\n      this.#manageCopyButton = copy;\n      copy.addEventListener(\"click\", this.#copyPages.bind(this));\n      this.#manageCutButton = cut;\n      cut.addEventListener(\"click\", this.#cutPages.bind(this));\n\n      this.#toggleMenuEntries(false);\n      menuButton.disabled = true;\n\n      eventBus.on(\n        \"editingaction\",\n        ({ name }) => {\n          switch (name) {\n            case \"copyPage\":\n              this.#copyPages();\n              break;\n            case \"cutPage\":\n              this.#cutPages();\n              break;\n            case \"deletePage\":\n              this.#deletePages(\"delete\");\n              break;\n            case \"savePage\":\n              this.#saveExtractedPages();\n              break;\n          }\n        },\n        internalOpt\n      );\n\n      this.container.addEventListener(\n        \"contextmenu\",\n        e => {\n          eventBus.dispatch(\"editingstateschanged\", {\n            source: this,\n            details: {\n              thumbnailId:\n                parseInt(\n                  e.target\n                    .closest(\".thumbnailImageContainer\")\n                    ?.parentElement.getAttribute(\"page-number\"),\n                  10\n                ) ?? -1,\n              hasSelectedPages: !!this.#selectedPages?.size,\n              canDeletePages: this.#canDelete(),\n            },\n          });\n        },\n        {\n          signal: abortSignal,\n          passive: true,\n        }\n      );\n\n      this.#undoButton?.addEventListener(\"click\", this.#undo.bind(this));\n      this.#undoCloseButton?.addEventListener(\n        \"click\",\n        this.#dismissUndo.bind(this, /* mustUpdateStatus = */ true)\n      );\n      this.#deselectButton?.addEventListener(\"click\", () => {\n        this.#clearSelection();\n        this.#toggleMenuEntries(false);\n        this.#updateStatus(\"select\");\n      });\n      this.#deselectButton.classList.toggle(\"hidden\", true);\n\n      if (this.#enableMerge && addFileComponent) {\n        const { picker, button } = addFileComponent;\n        picker.addEventListener(\"change\", () => {\n          const files = Array.from(picker.files ?? []);\n          if (files.length) {\n            this.#mergeFiles(files, this._currentPageNumber - 1);\n          }\n        });\n        button.addEventListener(\"click\", () => {\n          picker.click();\n        });\n        this.#waitingBar.closeButton?.addEventListener(\"click\", () => {\n          this.#toggleBar(\"status\");\n          picker.value = \"\";\n        });\n      }\n    } else {\n      manageMenu.button.hidden = true;\n    }\n\n    this.scroll = watchScroll(\n      this.scrollableContainer,\n      this.#scrollUpdated.bind(this),\n      abortSignal\n    );\n    this.#resetView();\n    this.#addEventListeners();\n  }\n\n  #scrollUpdated() {\n    this.renderingQueue.renderHighestPriority();\n  }\n\n  async #mergeFiles(files, insertAfter) {\n    this.#toggleBar(\"waiting\", \"pdfjs-views-manager-waiting-for-file\");\n    const entries = [];\n    for (const file of files) {\n      const isImage = file.type?.startsWith(\"image/\");\n      if (!isImage && file.type !== \"application/pdf\") {\n        const magic = await file.slice(0, 5).text();\n        if (magic !== \"%PDF-\") {\n          continue;\n        }\n      }\n      if (isImage) {\n        let bitmap;\n        try {\n          bitmap = await PDFThumbnailViewer.#fileToImageBitmap(file);\n        } catch {\n          continue;\n        }\n        entries.push({ image: bitmap, insertAfter });\n      } else {\n        entries.push({ document: await file.bytes(), insertAfter });\n      }\n    }\n    if (entries.length === 0) {\n      this.#toggleBar(\"status\");\n      return;\n    }\n    const pagesCount = this.#pagesMapper.pagesNumber;\n    const data = this.hasStructuralChanges()\n      ? this.getStructuralChanges()\n      : [{ document: null }];\n    data.push(...entries);\n    this.eventBus.on(\n      \"pagesloaded\",\n      () => {\n        // Clear any pre-merge selection: thumbnails are rebuilt fresh\n        // (all unchecked), so the old set would cause a label/visual\n        // mismatch.\n        this.#selectedPages = null;\n        this.#updateMenuEntries();\n        this.#toggleBar(\"status\");\n        const newPagesCount = this.#pagesMapper.pagesNumber;\n        const insertedPagesCount = newPagesCount - pagesCount;\n        for (\n          let i = insertAfter + 1, ii = insertAfter + 1 + insertedPagesCount;\n          i < ii;\n          i++\n        ) {\n          this._thumbnails[i].checkbox.checked = true;\n          this.#selectPage(i + 1, true);\n        }\n        if (insertedPagesCount) {\n          this.#updateCurrentPage(insertAfter + 2, /* force = */ true);\n        }\n      },\n      { once: true, ...internalOpt }\n    );\n    this.#reportTelemetry({ action: \"merge\" });\n    this.eventBus.dispatch(\"saveandload\", {\n      source: this,\n      data,\n    });\n  }\n\n  getThumbnail(index) {\n    return this._thumbnails[index];\n  }\n\n  #getVisibleThumbs() {\n    return getVisibleElements({\n      scrollEl: this.scrollableContainer,\n      views: this._thumbnails,\n    });\n  }\n\n  #resetCurrentThumbnail(newPageNumber) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const thumbnailView = this._thumbnails[this._currentPageNumber - 1];\n    thumbnailView?.toggleCurrent(/* isCurrent = */ false);\n    this._currentPageNumber = newPageNumber;\n  }\n\n  scrollThumbnailIntoView(pageNumber) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const thumbnailView = this._thumbnails[pageNumber - 1];\n\n    if (!thumbnailView) {\n      console.error('scrollThumbnailIntoView: Invalid \"pageNumber\" parameter.');\n      return;\n    }\n    if (pageNumber !== this._currentPageNumber) {\n      this.#resetCurrentThumbnail(pageNumber);\n      thumbnailView.toggleCurrent(/* isCurrent = */ true);\n    }\n    const { first, last, views } = this.#getVisibleThumbs();\n\n    // If the thumbnail isn't currently visible, scroll it into view.\n    if (views.length > 0) {\n      let shouldScroll = false;\n      if (pageNumber <= first.id || pageNumber >= last.id) {\n        shouldScroll = true;\n      } else {\n        for (const { id, percent } of views) {\n          if (id !== pageNumber) {\n            continue;\n          }\n          shouldScroll = percent < 100;\n          break;\n        }\n      }\n      if (shouldScroll) {\n        thumbnailView.div.scrollIntoView(SCROLL_OPTIONS);\n      }\n    }\n\n    this._currentPageNumber = pageNumber;\n  }\n\n  get pagesRotation() {\n    return this._pagesRotation;\n  }\n\n  set pagesRotation(rotation) {\n    if (!isValidRotation(rotation)) {\n      throw new Error(\"Invalid thumbnails rotation angle.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (this._pagesRotation === rotation) {\n      return; // The rotation didn't change.\n    }\n    this._pagesRotation = rotation;\n\n    const updateArgs = { rotation };\n    for (const thumbnail of this._thumbnails) {\n      thumbnail.update(updateArgs);\n    }\n  }\n\n  cleanup() {\n    for (const thumbnail of this._thumbnails) {\n      if (thumbnail.renderingState !== RenderingStates.FINISHED) {\n        thumbnail.reset();\n      }\n    }\n  }\n\n  #resetView() {\n    this._thumbnails = [];\n    this._currentPageNumber = 1;\n    this._pageLabels = null;\n    this._pagesRotation = 0;\n\n    // Remove the thumbnails from the DOM.\n    this.container.textContent = \"\";\n  }\n\n  /**\n   * @param {PDFDocumentProxy} pdfDocument\n   */\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this.#cancelRendering();\n      this.#resetView();\n    }\n\n    this.pdfDocument = pdfDocument;\n    if (!pdfDocument) {\n      return;\n    }\n    this.#pagesMapper = pdfDocument.pagesMapper;\n    const firstPagePromise = pdfDocument.getPage(1);\n    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({\n      intent: \"display\",\n    });\n\n    firstPagePromise\n      .then(firstPdfPage => {\n        const pagesCount = pdfDocument.numPages;\n        const viewport = firstPdfPage.getViewport({ scale: 1 });\n        const fragment = document.createDocumentFragment();\n\n        for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n          const thumbnail = new PDFThumbnailView({\n            container: fragment,\n            eventBus: this.eventBus,\n            id: pageNum,\n            defaultViewport: viewport.clone(),\n            optionalContentConfigPromise,\n            linkService: this.linkService,\n            renderingQueue: this.renderingQueue,\n            maxCanvasPixels: this.maxCanvasPixels,\n            maxCanvasDim: this.maxCanvasDim,\n            pageColors: this.pageColors,\n            enableSplitMerge: this.#enableSplitMerge,\n          });\n          this._thumbnails.push(thumbnail);\n        }\n        // Set the first `pdfPage` immediately, since it's already loaded,\n        // rather than having to repeat the `PDFDocumentProxy.getPage` call in\n        // the `this.#ensurePdfPageLoaded` method before rendering can start.\n        this._thumbnails[0]?.setPdfPage(firstPdfPage);\n\n        // Ensure that the current thumbnail is always highlighted on load.\n        const thumbnailView = this._thumbnails[this._currentPageNumber - 1];\n        thumbnailView.toggleCurrent(/* isCurrent = */ true);\n        this.container.append(fragment);\n        this.eventBus.dispatch(\"thumbnailsloaded\", {\n          source: this,\n        });\n      })\n      .catch(reason => {\n        console.error(\"Unable to initialize thumbnail viewer\", reason);\n      });\n  }\n\n  #cancelRendering() {\n    for (const thumbnail of this._thumbnails) {\n      thumbnail.cancelRendering();\n    }\n  }\n\n  /**\n   * @param {Array|null} labels\n   */\n  setPageLabels(labels) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!labels) {\n      this._pageLabels = null;\n    } else if (\n      !(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)\n    ) {\n      this._pageLabels = null;\n      console.error(\"PDFThumbnailViewer_setPageLabels: Invalid page labels.\");\n    } else {\n      this._pageLabels = labels;\n    }\n    // Update all the `PDFThumbnailView` instances.\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null);\n    }\n  }\n\n  /**\n   * @param {PDFThumbnailView} thumbView\n   * @returns {Promise<PDFPageProxy | null>}\n   */\n  async #ensurePdfPageLoaded(thumbView) {\n    if (thumbView.pdfPage) {\n      return thumbView.pdfPage;\n    }\n    try {\n      const pdfPage = await this.pdfDocument.getPage(thumbView.id);\n      if (!thumbView.pdfPage) {\n        thumbView.setPdfPage(pdfPage);\n      }\n      return pdfPage;\n    } catch (reason) {\n      console.error(\"Unable to get page for thumb view\", reason);\n      return null; // Page error -- there is nothing that can be done.\n    }\n  }\n\n  #getScrollAhead(visible) {\n    if (visible.first?.id === 1) {\n      return true;\n    } else if (visible.last?.id === this._thumbnails.length) {\n      return false;\n    }\n    return this.scroll.down;\n  }\n\n  forceRendering() {\n    const visibleThumbs = this.#getVisibleThumbs();\n    const scrollAhead = this.#getScrollAhead(visibleThumbs);\n    const thumbView = this.renderingQueue.getHighestPriority(\n      visibleThumbs,\n      this._thumbnails,\n      scrollAhead,\n      /* preRenderExtra */ false,\n      /* ignoreDetailViews */ true\n    );\n    if (thumbView) {\n      this.#ensurePdfPageLoaded(thumbView).then(() => {\n        this.renderingQueue.renderView(thumbView);\n      });\n      return true;\n    }\n    return false;\n  }\n\n  hasStructuralChanges() {\n    return this.#pagesMapper?.hasBeenAltered() || false;\n  }\n\n  getStructuralChanges() {\n    return this.#pagesMapper?.getPageMappingForSaving() || null;\n  }\n\n  static #getScaleFactor(image) {\n    return (PDFThumbnailViewer.#draggingScaleFactor ||= parseFloat(\n      getComputedStyle(image).getPropertyValue(\"--thumbnail-dragging-scale\")\n    ));\n  }\n\n  static #fitImageDimensions(width, height, { minSide = 0, maxSide }) {\n    const longest = Math.max(width, height);\n    let scale = 1;\n    if (minSide > 0 && longest < minSide) {\n      scale = minSide / longest;\n    } else if (longest > maxSide) {\n      scale = maxSide / longest;\n    }\n    return scale === 1\n      ? { width, height }\n      : {\n          width: Math.max(1, Math.round(width * scale)),\n          height: Math.max(1, Math.round(height * scale)),\n        };\n  }\n\n  static async #fileToImageBitmap(file) {\n    // Keep image pages large enough to look good when fitted to a PDF page, but\n    // bounded so saving does not allocate worker-side buffers at camera-photo\n    // dimensions.\n    const MIN_RASTER_SIDE = 1024;\n    const MAX_RASTER_SIDE = 4096;\n\n    if (file.type !== \"image/svg+xml\") {\n      const bitmap = await createImageBitmap(file);\n      const { width, height } = PDFThumbnailViewer.#fitImageDimensions(\n        bitmap.width,\n        bitmap.height,\n        { maxSide: MAX_RASTER_SIDE }\n      );\n      if (width === bitmap.width && height === bitmap.height) {\n        return bitmap;\n      }\n      const canvas = new OffscreenCanvas(width, height);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.drawImage(bitmap, 0, 0, width, height);\n      bitmap.close();\n      return canvas.transferToImageBitmap();\n    }\n    // createImageBitmap doesn't work with SVG (mirroring the workaround in\n    // src/display/editor/tools.js ImageManager): load the file via an Image\n    // element and rasterize it through an OffscreenCanvas. The target raster\n    // size uses the SVG's intrinsic dimensions, clamped so the longest side\n    // falls in [1024, 4096]: large enough to avoid pixelation when fitted to\n    // a page, but capped to prevent a runaway SVG (e.g. a huge viewBox) from\n    // allocating a multi-gigabyte bitmap.\n    const url = URL.createObjectURL(file);\n    try {\n      const image = new Image();\n      image.src = url;\n      await image.decode();\n      const { width, height } = PDFThumbnailViewer.#fitImageDimensions(\n        image.naturalWidth || MIN_RASTER_SIDE,\n        image.naturalHeight || MIN_RASTER_SIDE,\n        { minSide: MIN_RASTER_SIDE, maxSide: MAX_RASTER_SIDE }\n      );\n      const canvas = new OffscreenCanvas(width, height);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.drawImage(image, 0, 0, width, height);\n      return canvas.transferToImageBitmap();\n    } finally {\n      URL.revokeObjectURL(url);\n    }\n  }\n\n  #updateThumbnails(currentPageNumber) {\n    this.#resetCurrentThumbnail(0);\n    let newCurrentPageNumber = 0;\n    const pagesMapper = this.#pagesMapper;\n    const prevThumbnails = (this.#savedThumbnails = this._thumbnails);\n    const newThumbnails = (this._thumbnails = []);\n    const fragment = document.createDocumentFragment();\n    const isCut = this.#isCut;\n    for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) {\n      const prevPageNumber = pagesMapper.getPrevPageNumber(i);\n      if (prevPageNumber < 0) {\n        let thumbnail = this.#copiedThumbnails.get(-prevPageNumber);\n        thumbnail.checkbox.checked = false;\n        if (isCut) {\n          thumbnail.updateId(i);\n          fragment.append(thumbnail.div);\n        } else {\n          thumbnail = thumbnail.clone(fragment, i);\n        }\n        newThumbnails.push(thumbnail);\n        continue;\n      }\n      if (prevPageNumber === currentPageNumber) {\n        newCurrentPageNumber = i;\n      }\n      const newThumbnail = prevThumbnails[prevPageNumber - 1];\n      newThumbnails.push(newThumbnail);\n      newThumbnail.updateId(i);\n      newThumbnail.checkbox.checked = false;\n      fragment.append(newThumbnail.div);\n    }\n    this.container.replaceChildren(fragment);\n    return newCurrentPageNumber;\n  }\n\n  #onStartDragging(draggedThumbnail) {\n    this.#currentScrollTop = this.scrollableContainer.scrollTop;\n    this.#currentScrollBottom =\n      this.#currentScrollTop + this.scrollableContainer.clientHeight;\n    this.#dragAC = new AbortController();\n    this.container.classList.add(\"isDragging\");\n    this.#newBadge?.classList.add(\"hidden\");\n    const startPageNumber = parseInt(\n      draggedThumbnail.getAttribute(\"page-number\"),\n      10\n    );\n    this.#lastDraggedOverIndex = startPageNumber - 1;\n    if (!this.#selectedPages?.has(startPageNumber)) {\n      this.#pageNumberToRemove = startPageNumber;\n      this.#selectPage(startPageNumber, true);\n    }\n\n    for (const selected of this.#selectedPages) {\n      const thumbnail = this._thumbnails[selected - 1];\n      const placeholder = (thumbnail.placeholder =\n        document.createElement(\"div\"));\n      placeholder.classList.add(\"thumbnailImageContainer\", \"placeholder\");\n      const { div, imageContainer } = thumbnail;\n      div.classList.add(\"isDragging\");\n      placeholder.style.height = getComputedStyle(imageContainer).height;\n      imageContainer.after(placeholder);\n      if (selected !== startPageNumber) {\n        imageContainer.classList.add(\"hidden\");\n        continue;\n      }\n      if (this.#selectedPages.size === 1) {\n        imageContainer.classList.add(\"draggingThumbnail\");\n        this.#draggedContainer = imageContainer;\n        continue;\n      }\n      // For multiple selected thumbnails, only the one being dragged is shown\n      // (with the dragging style), while the others are hidden.\n      const draggedContainer = (this.#draggedContainer =\n        document.createElement(\"div\"));\n      draggedContainer.classList.add(\n        \"draggingThumbnail\",\n        \"thumbnailImageContainer\",\n        \"multiple\"\n      );\n      draggedContainer.style.height = getComputedStyle(imageContainer).height;\n      imageContainer.replaceWith(draggedContainer);\n      imageContainer.classList.remove(\"thumbnailImageContainer\");\n      draggedContainer.append(imageContainer);\n      draggedContainer.setAttribute(\n        \"data-multiple-count\",\n        this.#selectedPages.size\n      );\n    }\n  }\n\n  #onStopDragging(isDropping = false) {\n    const draggedContainer = this.#draggedContainer;\n    this.#draggedContainer = null;\n    const lastDraggedOverIndex = this.#lastDraggedOverIndex;\n    this.#lastDraggedOverIndex = NaN;\n    this.#dragMarker?.remove();\n    this.#dragMarker = null;\n    this.#dragAC.abort();\n    this.#dragAC = null;\n    this.#newBadge?.classList.remove(\"hidden\");\n\n    this.container.classList.remove(\"isDragging\");\n    for (const selected of this.#selectedPages) {\n      const thumbnail = this._thumbnails[selected - 1];\n      const { div, placeholder, imageContainer } = thumbnail;\n      placeholder.remove();\n      imageContainer.classList.remove(\"draggingThumbnail\", \"hidden\");\n      div.classList.remove(\"isDragging\");\n    }\n\n    if (draggedContainer.classList.contains(\"multiple\")) {\n      // Restore the dragged image to its thumbnail.\n      const originalImageContainer = draggedContainer.firstElementChild;\n      draggedContainer.replaceWith(originalImageContainer);\n      originalImageContainer.classList.add(\"thumbnailImageContainer\");\n    } else {\n      draggedContainer.style.translate = \"\";\n    }\n\n    const selectedPages = this.#selectedPages;\n    if (\n      !isNaN(lastDraggedOverIndex) &&\n      isDropping &&\n      !(\n        selectedPages.size === 1 &&\n        (selectedPages.has(lastDraggedOverIndex + 1) ||\n          selectedPages.has(lastDraggedOverIndex + 2))\n      )\n    ) {\n      this._thumbnails[this._currentPageNumber - 1]?.toggleCurrent(\n        /* isCurrent = */ false\n      );\n      this._currentPageNumber = -1;\n\n      const newIndex = lastDraggedOverIndex + 1;\n      const pagesToMove = Array.from(selectedPages).sort((a, b) => a - b);\n      const pagesMapper = this.#pagesMapper;\n      const currentPageNumber = isNaN(this.#pageNumberToRemove)\n        ? pagesToMove[0]\n        : this.#pageNumberToRemove;\n\n      pagesMapper.movePages(selectedPages, pagesToMove, newIndex);\n\n      this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));\n      this.#thumbnailsPositions = null;\n\n      selectedPages.clear();\n      this.#pageNumberToRemove = NaN;\n      this.#toggleMenuEntries(false);\n      this.#updateStatus(\"select\");\n\n      this.#reportTelemetry({ action: \"move\" });\n      this.eventBus.dispatch(\"pagesedited\", {\n        source: this,\n        pagesMapper,\n        type: \"move\",\n      });\n    }\n\n    if (!isNaN(this.#pageNumberToRemove)) {\n      this.#selectPage(this.#pageNumberToRemove, false);\n      this.#pageNumberToRemove = NaN;\n    }\n  }\n\n  #clearSelection() {\n    for (const pageNumber of this.#selectedPages) {\n      this._thumbnails[pageNumber - 1].toggleSelected(false);\n    }\n    this.#selectedPages.clear();\n  }\n\n  #updateCurrentPage(currentPageNumber, forceFocus = false) {\n    setTimeout(() => {\n      this.forceRendering();\n      const newPageNumber = currentPageNumber || 1;\n      this.linkService.goToPage(newPageNumber);\n      const thumbnailView = this._thumbnails[newPageNumber - 1];\n      if (forceFocus || !this.container.contains(document.activeElement)) {\n        thumbnailView.imageContainer.focus();\n      }\n    }, 0);\n  }\n\n  #undo() {\n    this.#clearSelection();\n    this.#toggleMenuEntries(false);\n    this.#updateStatus(\"select\");\n    if (this.#copiedThumbnails) {\n      // We undo a copy or a cut.\n      this.#copiedThumbnails = null;\n      this.#pagesMapper.cancelCopy();\n      this.#togglePasteMode(false);\n\n      this.eventBus.dispatch(\"pagesedited\", {\n        source: this,\n        pagesMapper: this.#pagesMapper,\n        type: \"cancelCopy\",\n      });\n    }\n\n    this.#isCut = false;\n    if (this.#savedThumbnails) {\n      // The thumbnail objects are shared between the post-operation list and\n      // the saved (pre-operation) list. The object marked current in the\n      // post-operation list may reappear at a different index in the restored\n      // list.\n      const currentThumb = this._thumbnails[this._currentPageNumber - 1];\n      currentThumb?.toggleCurrent(false);\n\n      const fragment = document.createDocumentFragment();\n      for (let i = 1, ii = this.#savedThumbnails.length; i <= ii; i++) {\n        const thumbnail = this.#savedThumbnails[i - 1];\n        thumbnail.updateId(i);\n        thumbnail.checkbox.checked = false;\n        fragment.append(thumbnail.div);\n      }\n      this.container.replaceChildren(fragment);\n      this._thumbnails = this.#savedThumbnails;\n      this.#savedThumbnails = null;\n\n      // Re-establish the current-page indicator at the position the current\n      // thumbnail now occupies in the restored list.\n      const newIdx = currentThumb ? this._thumbnails.indexOf(currentThumb) : -1;\n      this._currentPageNumber = newIdx + 1;\n      currentThumb?.toggleCurrent(newIdx !== -1);\n\n      this.#pagesMapper.cancelDelete();\n\n      this.eventBus.dispatch(\"pagesedited\", {\n        source: this,\n        pagesMapper: this.#pagesMapper,\n        type: \"cancelDelete\",\n      });\n    }\n  }\n\n  #dismissUndo(mustUpdateStatus) {\n    this.#copiedThumbnails = null;\n    if (this.#deletedPageNumbers) {\n      if (this.#savedThumbnails) {\n        for (const pageNumber of this.#deletedPageNumbers) {\n          this.#savedThumbnails[pageNumber - 1].destroy();\n        }\n        this.#savedThumbnails = null;\n      }\n      this.#deletedPageNumbers = null;\n    }\n    this.#isCut = false;\n    if (mustUpdateStatus) {\n      this.#updateStatus(\"select\");\n    }\n    this.#togglePasteMode(false);\n    this.#pagesMapper.cleanSavedData();\n\n    this.eventBus.dispatch(\"pagesedited\", {\n      source: this,\n      pagesMapper: this.#pagesMapper,\n      type: \"cleanSavedData\",\n    });\n  }\n\n  #canDelete() {\n    const size = this.#selectedPages?.size || 0;\n    return size > 0 && size < this._thumbnails.length;\n  }\n\n  #toggleBar(type, message, args) {\n    this.#statusBar.classList.toggle(\"hidden\", type !== \"status\");\n    this.#waitingBar.container.classList.toggle(\"hidden\", type !== \"waiting\");\n    this.#undoBar.classList.toggle(\"hidden\", type !== \"undo\");\n    this.#hasUndoBarVisible = type === \"undo\";\n\n    switch (type) {\n      case \"waiting\":\n        this.#waitingBar.label.setAttribute(\"data-l10n-id\", message);\n        break;\n      case \"undo\":\n        this.#undoLabel.setAttribute(\"data-l10n-id\", message);\n        if (args) {\n          this.#undoLabel.setAttribute(\"data-l10n-args\", JSON.stringify(args));\n        }\n        break;\n      case \"status\":\n        if (args) {\n          this.#statusLabel.setAttribute(\n            \"data-l10n-args\",\n            JSON.stringify(args)\n          );\n        } else {\n          this.#statusLabel.removeAttribute(\"data-l10n-args\");\n        }\n        this.#newBadge?.classList.toggle(\"hidden\", !!args);\n        this.#deselectButton.classList.toggle(\"hidden\", !args);\n        break;\n    }\n  }\n\n  #togglePasteMode(enable) {\n    this.#isInPasteMode = enable;\n    if (enable) {\n      this.container.classList.add(\"pasteMode\");\n      for (const thumbnail of this._thumbnails) {\n        thumbnail.addPasteButton(this.#boundPastePages);\n      }\n    } else {\n      this.container.classList.remove(\"pasteMode\");\n      for (const thumbnail of this._thumbnails) {\n        thumbnail.removePasteButton();\n      }\n    }\n  }\n\n  #reportTelemetry(data) {\n    this.eventBus.dispatch(\"reporttelemetry\", {\n      source: this,\n      details: {\n        type: \"pageOrganization\",\n        data,\n      },\n    });\n  }\n\n  #saveExtractedPages() {\n    this.#reportTelemetry({ action: \"exportSelected\" });\n    this.eventBus.dispatch(\"saveextractedpages\", {\n      source: this,\n      data: this.#pagesMapper.extractPages(this.#selectedPages),\n    });\n    this.#clearSelection();\n    this.#toggleMenuEntries(false);\n    this.#updateStatus(\"select\");\n  }\n\n  #copyPages(clearSelection = true) {\n    if (!this.#isCut) {\n      // Entering pure copy mode \"commits\" any pending paste/delete state so\n      // that clicking the \"Done\" button later only cancels the copy and does\n      // not accidentally restore a previous paste or delete.\n      this.#savedThumbnails = null;\n      this.#reportTelemetry({ action: \"copy\" });\n    }\n    this.#updateStatus(this.#isCut ? \"cut\" : \"copy\");\n    const pageNumbersToCopy = (this.#copiedPageNumbers = Uint32Array.from(\n      this.#selectedPages\n    ).sort((a, b) => a - b));\n    const pagesMapper = this.#pagesMapper;\n    pagesMapper.copyPages(pageNumbersToCopy);\n    this.#copiedThumbnails = new Map();\n    for (const pageNumber of pageNumbersToCopy) {\n      this.#copiedThumbnails.set(pageNumber, this._thumbnails[pageNumber - 1]);\n    }\n    this.eventBus.dispatch(\"pagesedited\", {\n      source: this,\n      pagesMapper,\n      pageNumbers: pageNumbersToCopy,\n      type: \"copy\",\n    });\n    if (clearSelection) {\n      this.#clearSelection();\n    }\n    this.#togglePasteMode(true);\n    this.#toggleMenuEntries(false);\n  }\n\n  #cutPages() {\n    if (!this.#canDelete()) {\n      return;\n    }\n\n    this.#reportTelemetry({ action: \"cut\" });\n    this.#isCut = true;\n    this.#copyPages(false);\n    this.#deletePages(/* type = */ \"cut\");\n  }\n\n  #pastePages(index) {\n    this.#reportTelemetry({ action: \"paste\" });\n    const pagesMapper = this.#pagesMapper;\n    const currentPageNumber = this.#copiedPageNumbers.includes(\n      this._currentPageNumber\n    )\n      ? 0\n      : this._currentPageNumber;\n\n    pagesMapper.pastePages(index);\n    this.#updateThumbnails(currentPageNumber);\n    this.#updateCurrentPage(index + 1, /* forceFocus = */ true);\n    this.#thumbnailsPositions = null;\n\n    this.eventBus.dispatch(\"pagesedited\", {\n      source: this,\n      pagesMapper,\n      hasBeenCut: this.#isCut,\n      type: \"paste\",\n    });\n\n    this.#copiedThumbnails = null;\n    this.#isCut = false;\n    this.#togglePasteMode(false);\n    this.#toggleMenuEntries(false);\n    this.#updateStatus(\"select\");\n  }\n\n  #deletePages(type = \"delete\") {\n    if (!this.#canDelete()) {\n      return;\n    }\n\n    const selectedPages = this.#selectedPages;\n    if (type === \"delete\") {\n      this.#reportTelemetry({ action: \"delete\" });\n      this.#updateStatus(\"delete\");\n    }\n    const pagesMapper = this.#pagesMapper;\n    const currentPageNumber = selectedPages.has(this._currentPageNumber)\n      ? 0\n      : this._currentPageNumber;\n    const pagesToDelete = (this.#deletedPageNumbers = Uint32Array.from(\n      selectedPages\n    ).sort((a, b) => a - b));\n\n    pagesMapper.deletePages(pagesToDelete);\n    this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber));\n    this.#thumbnailsPositions = null;\n\n    selectedPages.clear();\n    this.#updateMenuEntries();\n\n    this.eventBus.dispatch(\"pagesedited\", {\n      source: this,\n      pagesMapper,\n      pageNumbers: pagesToDelete,\n      type,\n    });\n  }\n\n  #updateMenuEntries() {\n    const size = this.#selectedPages?.size || 0;\n    this.#manageExportButton.disabled = this.#manageCopyButton.disabled = !size;\n    this.#manageDeleteButton.disabled = this.#manageCutButton.disabled =\n      !this.#canDelete();\n  }\n\n  #toggleMenuEntries(enable) {\n    this.#manageExportButton.disabled =\n      this.#manageDeleteButton.disabled =\n      this.#manageCopyButton.disabled =\n      this.#manageCutButton.disabled =\n        !enable;\n  }\n\n  #updateStatus(type) {\n    if (!this.#statusBar || !this.#undoBar) {\n      return;\n    }\n    const count = this.#selectedPages?.size || 0;\n    if (type === \"select\") {\n      this.#statusLabel.setAttribute(\n        \"data-l10n-id\",\n        count\n          ? \"pdfjs-views-manager-pages-status-action-label\"\n          : \"pdfjs-views-manager-pages-status-none-action-label\"\n      );\n      this.#toggleBar(\"status\", \"\", count ? { count } : null);\n      return;\n    }\n\n    let l10nId;\n    switch (type) {\n      case \"copy\":\n        l10nId = \"pdfjs-views-manager-pages-status-undo-copy-label\";\n        break;\n      case \"cut\":\n        l10nId = \"pdfjs-views-manager-status-undo-cut-label\";\n        break;\n      case \"delete\":\n        l10nId = \"pdfjs-views-manager-pages-status-undo-delete-label\";\n        break;\n    }\n    this.#toggleBar(\"undo\", l10nId, { count });\n\n    if (type === \"copy\") {\n      this.#undoButton.firstElementChild.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-views-manager-status-done-button-label\"\n      );\n      this.#undoCloseButton.classList.toggle(\"hidden\", true);\n    } else {\n      this.#undoButton.firstElementChild.setAttribute(\n        \"data-l10n-id\",\n        \"pdfjs-views-manager-status-undo-button-label\"\n      );\n      this.#undoCloseButton.classList.toggle(\"hidden\", false);\n    }\n  }\n\n  #moveDraggedContainer(dx, dy) {\n    if (this.#isOneColumnView) {\n      dx = 0;\n    }\n    if (\n      this.#draggedImageX + dx < 0 ||\n      this.#draggedImageX + this.#draggedImageWidth + dx >\n        this.#scrollableContainerWidth\n    ) {\n      dx = 0;\n    }\n    if (\n      this.#draggedImageY + dy < 0 ||\n      this.#draggedImageY + this.#draggedImageHeight + dy >\n        this.#scrollableContainerHeight\n    ) {\n      dy = 0;\n    }\n\n    this.#draggedImageX += dx;\n    this.#draggedImageY += dy;\n    this.#draggedImageOffsetX += dx;\n    this.#draggedImageOffsetY += dy;\n    this.#draggedContainer.style.translate = `${this.#draggedImageOffsetX}px ${this.#draggedImageOffsetY}px`;\n    if (\n      this.#draggedImageY + this.#draggedImageHeight >\n      this.#currentScrollBottom\n    ) {\n      this.scrollableContainer.scrollTop = Math.min(\n        this.scrollableContainer.scrollTop + PIXELS_TO_SCROLL_WHEN_DRAGGING,\n        this.#scrollableContainerHeight\n      );\n    } else if (this.#draggedImageY < this.#currentScrollTop) {\n      this.scrollableContainer.scrollTop = Math.max(\n        this.scrollableContainer.scrollTop - PIXELS_TO_SCROLL_WHEN_DRAGGING,\n        0\n      );\n    }\n\n    const positionData = this.#findClosestThumbnail(\n      this.#draggedImageX + this.#draggedImageWidth / 2,\n      this.#draggedImageY + this.#draggedImageHeight / 2\n    );\n    this.#positionDragMarker(positionData);\n  }\n\n  #positionDragMarker(positionData) {\n    if (!positionData) {\n      return;\n    }\n    let dragMarker = this.#dragMarker;\n    if (!dragMarker) {\n      dragMarker = this.#dragMarker = document.createElement(\"div\");\n      dragMarker.className = \"dragMarker\";\n      this.container.firstChild.before(dragMarker);\n    }\n\n    const [index, space] = positionData;\n    const dragMarkerStyle = dragMarker.style;\n    const { bbox, x: xPos } = this.#thumbnailsPositions;\n    let x, y, width, height;\n    if (index < 0) {\n      if (xPos.length === 1) {\n        y = bbox[1] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT;\n        x = bbox[0];\n        width = bbox[2];\n      } else {\n        y = bbox[1];\n        x = bbox[0] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT;\n        height = bbox[3];\n      }\n    } else if (xPos.length === 1) {\n      y = bbox[index * 4 + 1] + bbox[index * 4 + 3] + space;\n      x = bbox[index * 4];\n      width = bbox[index * 4 + 2];\n    } else {\n      y = bbox[index * 4 + 1];\n      x = bbox[index * 4] + bbox[index * 4 + 2] + space;\n      height = bbox[index * 4 + 3];\n    }\n    dragMarkerStyle.translate = `${x}px ${y}px`;\n    dragMarkerStyle.width = width ? `${width}px` : \"\";\n    dragMarkerStyle.height = height ? `${height}px` : \"\";\n  }\n\n  #computeThumbnailsPosition() {\n    // Collect the center of each thumbnail.\n    // This is used to determine the closest thumbnail when dragging.\n    // TODO: handle the RTL case.\n    const positionsX = [];\n    const positionsY = [];\n    const positionsLastX = [];\n    const bbox = new Float32Array(this._thumbnails.length * 4);\n    let prevX = -Infinity;\n    let prevY = -Infinity;\n    let reminder = -1;\n    let firstRightX;\n    let lastRightX;\n    let firstBottomY;\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      const { div } = this._thumbnails[i];\n      const {\n        offsetTop: y,\n        offsetLeft: x,\n        offsetWidth: w,\n        offsetHeight: h,\n      } = div;\n      if (w === 0) {\n        // The thumbnail view isn't visible.\n        return;\n      }\n      bbox[i * 4] = x;\n      bbox[i * 4 + 1] = y;\n      bbox[i * 4 + 2] = w;\n      bbox[i * 4 + 3] = h;\n      if (x > prevX) {\n        prevX = x + w / 2;\n        firstRightX ??= prevX + w;\n        positionsX.push(prevX);\n      }\n      if (y > prevY) {\n        if (reminder === -1 && positionsX.length > 1) {\n          reminder = ii % positionsX.length;\n        }\n        prevY = y + h / 2;\n        firstBottomY ??= prevY + h;\n        positionsY.push(prevY);\n      }\n      if (reminder > 0 && i >= ii - reminder) {\n        const cx = x + w / 2;\n        positionsLastX.push(cx);\n        lastRightX ??= cx + w;\n      }\n    }\n    let space;\n    if (positionsX.length > 1) {\n      space = (positionsX[1] - firstRightX) / 2;\n    } else if (positionsY.length > 1) {\n      space = (positionsY[1] - firstBottomY) / 2;\n    } else {\n      space = SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT;\n    }\n    this.#thumbnailsPositions = {\n      x: positionsX,\n      y: positionsY,\n      lastX: positionsLastX,\n      space,\n      lastSpace: positionsLastX.length\n        ? (positionsLastX.at(-1) - lastRightX) / 2\n        : space,\n      bbox,\n    };\n    this.#isOneColumnView = positionsX.length === 1;\n    ({\n      clientWidth: this.#scrollableContainerWidth,\n      scrollHeight: this.#scrollableContainerHeight,\n    } = this.scrollableContainer);\n  }\n\n  #addEventListeners() {\n    this.eventBus.on(\n      \"resize\",\n      ({ source }) => {\n        if (source.thumbnailsView === this.container) {\n          this.#computeThumbnailsPosition();\n        }\n      },\n      internalOpt\n    );\n    this.container.addEventListener(\"keydown\", e => {\n      const { target } = e;\n      const isCheckbox =\n        target instanceof HTMLInputElement && target.type === \"checkbox\";\n\n      switch (e.key) {\n        case \"ArrowLeft\":\n          this.#goToNextItem(target, false, true, isCheckbox);\n          stopEvent(e);\n          break;\n        case \"ArrowRight\":\n          this.#goToNextItem(target, true, true, isCheckbox);\n          stopEvent(e);\n          break;\n        case \"ArrowDown\":\n          this.#goToNextItem(target, true, false, isCheckbox);\n          stopEvent(e);\n          break;\n        case \"ArrowUp\":\n          this.#goToNextItem(target, false, false, isCheckbox);\n          stopEvent(e);\n          break;\n        case \"Home\":\n          this.#focusThumbnailElement(this._thumbnails[0], isCheckbox);\n          stopEvent(e);\n          break;\n        case \"End\":\n          this.#focusThumbnailElement(this._thumbnails.at(-1), isCheckbox);\n          stopEvent(e);\n          break;\n        case \"Enter\":\n        case \" \":\n          if (!isCheckbox) {\n            this.#goToPage(e);\n          }\n          // For checkboxes, let the default behavior handle toggling\n          break;\n        case \"c\":\n          if (\n            this.#enableSplitMerge &&\n            (e.ctrlKey || e.metaKey) &&\n            this.#selectedPages?.size\n          ) {\n            this.#copyPages();\n            stopEvent(e);\n          }\n          break;\n        case \"x\":\n          if (\n            this.#enableSplitMerge &&\n            (e.ctrlKey || e.metaKey) &&\n            this.#selectedPages?.size\n          ) {\n            this.#cutPages();\n            stopEvent(e);\n          }\n          break;\n        case \"Delete\":\n        case \"Backspace\":\n          if (\n            this.#enableSplitMerge &&\n            !this.#isInPasteMode &&\n            this.#selectedPages?.size\n          ) {\n            this.#deletePages();\n            stopEvent(e);\n          }\n          break;\n      }\n    });\n    this.container.addEventListener(\"click\", e => {\n      const { target } = e;\n      if (target instanceof HTMLInputElement) {\n        const pageNumber = parseInt(\n          target.parentElement.getAttribute(\"page-number\"),\n          10\n        );\n        this.#selectPage(pageNumber, target.checked);\n        return;\n      }\n      this.#goToPage(e);\n    });\n    this.#addDragListeners();\n    this.#addExternalFileDropListeners();\n  }\n\n  #selectPage(pageNumber, checked) {\n    if (this.#hasUndoBarVisible) {\n      this.#dismissUndo(/* mustUpdateStatus = */ false);\n    }\n    const set = (this.#selectedPages ??= new Set());\n    if (checked) {\n      set.add(pageNumber);\n    } else {\n      set.delete(pageNumber);\n    }\n\n    this.#updateMenuEntries();\n    this.#updateStatus(\"select\");\n  }\n\n  #addDragListeners() {\n    if (!this.#enableSplitMerge) {\n      return;\n    }\n    this.container.addEventListener(\"pointerdown\", e => {\n      const {\n        target: draggedImage,\n        clientX: clickX,\n        clientY: clickY,\n        pointerId: dragPointerId,\n      } = e;\n      if (\n        e.button !== 0 || // Skip right click.\n        this.#isInPasteMode ||\n        this._thumbnails.length === 1 ||\n        !isNaN(this.#lastDraggedOverIndex) ||\n        !draggedImage.classList.contains(\"thumbnailImageContainer\")\n      ) {\n        // We're already handling a drag, or the target is not draggable.\n        return;\n      }\n\n      const thumbnail = draggedImage.parentElement;\n      const pointerDownAC = new AbortController();\n      const { signal: pointerDownSignal } = pointerDownAC;\n      let prevDragX = clickX;\n      let prevDragY = clickY;\n      let prevScrollTop = this.scrollableContainer.scrollTop;\n\n      // When dragging, the thumbnail is scaled down. To keep the cursor at the\n      // same position on the thumbnail, we need to adjust the offset\n      // accordingly.\n      const scaleFactor = PDFThumbnailViewer.#getScaleFactor(draggedImage);\n      this.#draggedImageOffsetY =\n        ((scaleFactor - 1) * e.layerY + draggedImage.offsetTop) / scaleFactor;\n\n      if (this.#isOneColumnView) {\n        this.#draggedImageOffsetX =\n          draggedImage.offsetLeft +\n          ((scaleFactor - 1) * 0.5 * draggedImage.offsetWidth) / scaleFactor;\n      } else {\n        this.#draggedImageOffsetX =\n          ((scaleFactor - 1) * e.layerX + draggedImage.offsetLeft) /\n          scaleFactor;\n      }\n      this.#draggedImageX = thumbnail.offsetLeft + this.#draggedImageOffsetX;\n      this.#draggedImageY = thumbnail.offsetTop + this.#draggedImageOffsetY;\n      this.#draggedImageWidth = draggedImage.offsetWidth / scaleFactor;\n      this.#draggedImageHeight = draggedImage.offsetHeight / scaleFactor;\n\n      this.container.addEventListener(\n        \"pointermove\",\n        ev => {\n          const { clientX: x, clientY: y, pointerId } = ev;\n          if (isNaN(this.#lastDraggedOverIndex)) {\n            if (\n              pointerId !== dragPointerId ||\n              (Math.abs(x - clickX) <= DRAG_THRESHOLD_IN_PIXELS &&\n                Math.abs(y - clickY) <= DRAG_THRESHOLD_IN_PIXELS)\n            ) {\n              // Not enough movement to be considered a drag.\n              return;\n            }\n\n            // First movement while dragging.\n            this.#onStartDragging(thumbnail);\n            const stopDragging = (_e, isDropping = false) => {\n              this.#onStopDragging(isDropping);\n              pointerDownAC.abort();\n            };\n            const { signal } = this.#dragAC;\n            window.addEventListener(\n              \"touchmove\",\n              stopEvent /* Prevent the container from scrolling */,\n              { passive: false, signal }\n            );\n            window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n            this.scrollableContainer.addEventListener(\n              \"scrollend\",\n              () => {\n                const {\n                  scrollableContainer: { clientHeight, scrollTop },\n                } = this;\n                this.#currentScrollTop = scrollTop;\n                this.#currentScrollBottom = scrollTop + clientHeight;\n                const dy = scrollTop - prevScrollTop;\n                prevScrollTop = scrollTop;\n                this.#moveDraggedContainer(0, dy);\n              },\n              { passive: true, signal }\n            );\n            window.addEventListener(\n              \"pointerup\",\n              upEv => {\n                if (upEv.pointerId !== dragPointerId) {\n                  return;\n                }\n                // Prevent the subsequent click event after pointerup.\n                window.addEventListener(\"click\", stopEvent, {\n                  capture: true,\n                  once: true,\n                  signal,\n                });\n                stopEvent(upEv);\n                stopDragging(upEv, /* isDropping = */ true);\n              },\n              { signal }\n            );\n            window.addEventListener(\"blur\", stopDragging, { signal });\n            window.addEventListener(\"pointercancel\", stopDragging, { signal });\n            window.addEventListener(\"wheel\", stopEvent, {\n              passive: false,\n              signal,\n            });\n            window.addEventListener(\n              \"keydown\",\n              kEv => {\n                if (\n                  kEv.key === \"Escape\" &&\n                  !isNaN(this.#lastDraggedOverIndex)\n                ) {\n                  stopDragging(kEv);\n                }\n              },\n              { signal }\n            );\n          }\n\n          const dx = x - prevDragX;\n          const dy = y - prevDragY;\n          prevDragX = x;\n          prevDragY = y;\n          this.#moveDraggedContainer(dx, dy);\n        },\n        { passive: true, signal: pointerDownSignal }\n      );\n      window.addEventListener(\n        \"pointerup\",\n        ({ pointerId }) => {\n          if (pointerId !== dragPointerId) {\n            return;\n          }\n          pointerDownAC.abort();\n        },\n        { signal: pointerDownSignal }\n      );\n      window.addEventListener(\"dragstart\", stopEvent, {\n        capture: true,\n        signal: pointerDownSignal,\n      });\n    });\n  }\n\n  #addExternalFileDropListeners() {\n    if (!this.#enableMerge) {\n      return;\n    }\n    const container = this.container;\n    const signal = this.#abortSignal;\n\n    const hasMergeableItem = dataTransfer => {\n      if (!dataTransfer) {\n        return false;\n      }\n      // The file's bytes aren't readable during dragover, so the MIME type is\n      // the only available signal. Matches the existing global drop handler\n      // in app.js. Files with no MIME (e.g. some macOS sources) are rejected\n      // here to keep the \"copy\" cursor honest; if needed, drop-time magic-byte\n      // validation in #mergeFiles would still catch a permissive variant.\n      for (const item of dataTransfer.items) {\n        if (\n          item.kind === \"file\" &&\n          (item.type === \"application/pdf\" || item.type.startsWith(\"image/\"))\n        ) {\n          return true;\n        }\n      }\n      return false;\n    };\n    const pointerInContainer = ({ clientX, clientY }) => {\n      const { left, right, top, bottom } = container.getBoundingClientRect();\n      return (\n        clientX >= left && clientX < right && clientY >= top && clientY < bottom\n      );\n    };\n\n    container.addEventListener(\n      \"dragenter\",\n      e => {\n        if (\n          this.#externalDragActive ||\n          // A page-move drag is already in progress.\n          !isNaN(this.#lastDraggedOverIndex) ||\n          !this._thumbnails.length ||\n          !hasMergeableItem(e.dataTransfer)\n        ) {\n          return;\n        }\n        e.preventDefault();\n        e.stopPropagation();\n        e.dataTransfer.dropEffect = \"copy\";\n        this.#externalDragActive = true;\n        this.container.classList.add(\"isDraggingFile\");\n        // Recompute positions in case the layout changed since last time.\n        this.#thumbnailsPositions = null;\n        this.#computeThumbnailsPosition();\n        // Marker hasn't been positioned yet 鈥� first dragover will do it.\n        this.#lastDraggedOverIndex = NaN;\n      },\n      { signal }\n    );\n\n    container.addEventListener(\n      \"dragover\",\n      e => {\n        if (!this.#externalDragActive) {\n          return;\n        }\n        e.preventDefault();\n        e.stopPropagation();\n        e.dataTransfer.dropEffect = \"copy\";\n        if (!this.#thumbnailsPositions) {\n          return;\n        }\n        const rect = container.getBoundingClientRect();\n        const x = e.clientX - rect.left;\n        const y = e.clientY - rect.top;\n        const positionData = this.#findClosestThumbnail(x, y);\n        this.#positionDragMarker(positionData);\n      },\n      { signal }\n    );\n\n    container.addEventListener(\n      \"dragleave\",\n      e => {\n        if (!this.#externalDragActive) {\n          return;\n        }\n        // dragleave fires when crossing into a child element too; only treat\n        // it as a true leave when the cursor has actually left the container.\n        if (\n          (e.relatedTarget && container.contains(e.relatedTarget)) ||\n          pointerInContainer(e)\n        ) {\n          return;\n        }\n        this.#endExternalFileDrag();\n      },\n      { signal }\n    );\n\n    container.addEventListener(\n      \"drop\",\n      e => {\n        if (!this.#externalDragActive) {\n          return;\n        }\n        e.preventDefault();\n        e.stopPropagation();\n        const files = Array.from(e.dataTransfer.files ?? []);\n        // If no dragover ever ran (e.g. instant drop), compute the index from\n        // the drop event itself so we don't fall through to a stale fallback.\n        if (isNaN(this.#lastDraggedOverIndex) && this.#thumbnailsPositions) {\n          const rect = container.getBoundingClientRect();\n          this.#findClosestThumbnail(\n            e.clientX - rect.left,\n            e.clientY - rect.top\n          );\n        }\n        const insertAfter = isNaN(this.#lastDraggedOverIndex)\n          ? -1\n          : this.#lastDraggedOverIndex;\n        this.#endExternalFileDrag();\n        if (files.length) {\n          this.#mergeFiles(files, insertAfter);\n        }\n      },\n      { signal }\n    );\n  }\n\n  #endExternalFileDrag() {\n    this.#externalDragActive = false;\n    this.container.classList.remove(\"isDraggingFile\");\n    this.#dragMarker?.remove();\n    this.#dragMarker = null;\n    this.#lastDraggedOverIndex = NaN;\n  }\n\n  #goToPage(e) {\n    const container = e.target.closest(\".thumbnailImageContainer\");\n    if (container) {\n      const pageNumber = parseInt(container.getAttribute(\"page-number\"), 10);\n      this.linkService.goToPage(pageNumber);\n      stopEvent(e);\n    }\n  }\n\n  /**\n   * Focus either the checkbox or image of a thumbnail.\n   * @param {PDFThumbnailView} thumbnail\n   * @param {boolean} focusCheckbox - If true, focus checkbox; otherwise focus\n   *   image\n   */\n  #focusThumbnailElement(thumbnail, focusCheckbox) {\n    if (focusCheckbox && thumbnail.checkbox) {\n      thumbnail.checkbox.focus();\n    } else {\n      thumbnail.imageContainer.focus();\n    }\n  }\n\n  /**\n   * Go to the next/previous menu item.\n   * @param {HTMLElement} element\n   * @param {boolean} forward\n   * @param {boolean} horizontal\n   * @param {boolean} navigateCheckboxes - If true, focus checkboxes;\n   *   otherwise focus images\n   */\n  #goToNextItem(element, forward, horizontal, navigateCheckboxes = false) {\n    let currentPageNumber = parseInt(\n      element.parentElement.getAttribute(\"page-number\"),\n      10\n    );\n    if (isNaN(currentPageNumber)) {\n      currentPageNumber = this._currentPageNumber;\n    }\n\n    const increment = forward ? 1 : -1;\n    let nextThumbnail;\n    if (horizontal) {\n      const nextPageNumber = MathClamp(\n        currentPageNumber + increment,\n        1,\n        this._thumbnails.length + 1\n      );\n      nextThumbnail = this._thumbnails[nextPageNumber - 1];\n    } else {\n      const currentThumbnail = this._thumbnails[currentPageNumber - 1];\n      const { x: currentX, y: currentY } =\n        currentThumbnail.div.getBoundingClientRect();\n      let firstWithDifferentY;\n      for (\n        let i = currentPageNumber - 1 + increment;\n        i >= 0 && i < this._thumbnails.length;\n        i += increment\n      ) {\n        const thumbnail = this._thumbnails[i];\n        const { x, y } = thumbnail.div.getBoundingClientRect();\n        if (!firstWithDifferentY && y !== currentY) {\n          firstWithDifferentY = thumbnail;\n        }\n        if (x === currentX) {\n          nextThumbnail = thumbnail;\n          break;\n        }\n      }\n      if (!nextThumbnail) {\n        nextThumbnail = firstWithDifferentY;\n      }\n    }\n    if (nextThumbnail) {\n      this.#focusThumbnailElement(nextThumbnail, navigateCheckboxes);\n    }\n  }\n\n  // Given the drag center (x, y), find the drop slot index: the drag marker\n  // will be placed after thumbnail[index], or before all thumbnails if index\n  // is -1. Returns null when the drop slot hasn't changed (no marker update\n  // needed), or [index, space] where space is the gap (in px) between\n  // thumbnails at that slot, used to position the marker.\n  //\n  // positionsX holds the x-center of each column, positionsY the y-center of\n  // each row. positionsLastX holds the x-centers for an incomplete last row\n  // (when the total number of thumbnails is not a multiple of the column\n  // count).\n  #findClosestThumbnail(x, y) {\n    if (!this.#thumbnailsPositions) {\n      this.#computeThumbnailsPosition();\n    }\n    const {\n      x: positionsX,\n      y: positionsY,\n      lastX: positionsLastX,\n      space: spaceBetweenThumbnails,\n      lastSpace: lastSpaceBetweenThumbnails,\n    } = this.#thumbnailsPositions;\n    const lastDraggedOverIndex = this.#lastDraggedOverIndex;\n\n    // Fast-path: reconstruct the row/col of the previous drop slot and check\n    // whether (x, y) still falls inside the same cell's bounds.\n    let xPos = lastDraggedOverIndex % positionsX.length;\n    let yPos = Math.floor(lastDraggedOverIndex / positionsX.length);\n    let xArray = yPos === positionsY.length - 1 ? positionsLastX : positionsX;\n    if (\n      positionsY[yPos] <= y &&\n      y < (positionsY[yPos + 1] ?? Infinity) &&\n      xArray[xPos] <= x &&\n      x < (xArray[xPos + 1] ?? Infinity)\n    ) {\n      // Fast-path: we're still in the same thumbnail.\n      return null;\n    }\n\n    let index;\n    // binarySearchFirstItem returns the first row index whose center is below\n    // y, i.e. the first i such that positionsY[i] > y.\n    yPos = binarySearchFirstItem(positionsY, cy => y < cy);\n    if (this.#isOneColumnView) {\n      // In a single column the drop slot is simply the row boundary: the marker\n      // goes after row (yPos - 1), meaning before row yPos. index = -1 when y\n      // is above the first thumbnail's center (drop before thumbnail 0).\n      index = yPos - 1;\n    } else {\n      // Grid layout: first pick the nearest row, then the nearest column.\n\n      if (yPos === positionsY.length) {\n        // y is below the last row's center 鈥� clamp to the last row.\n        yPos = positionsY.length - 1;\n      } else {\n        // Choose between the row just above (yPos - 1) and the row at yPos by\n        // comparing distances, so the marker snaps to whichever row center is\n        // closer to y.\n        const dist1 = Math.abs(positionsY[yPos - 1] - y);\n        const dist2 = Math.abs(positionsY[yPos] - y);\n        yPos = dist1 < dist2 ? yPos - 1 : yPos;\n      }\n      // The last row may be incomplete, so use its own x-center array.\n      xArray =\n        yPos === positionsY.length - 1 && positionsLastX.length > 0\n          ? positionsLastX\n          : positionsX;\n      // Find the column: the first column whose center is to the right of x,\n      // minus 1, gives the column the cursor is in (or -1 if before column 0).\n      xPos = binarySearchFirstItem(xArray, cx => x < cx) - 1;\n      if (yPos < 0) {\n        // y is above the first row: force drop before the very first thumbnail.\n        if (xPos <= 0) {\n          xPos = -1;\n        }\n        yPos = 0;\n      }\n      // Convert (row, col) to a flat thumbnail index, clamped to\n      // [-1, length-1].\n      index = MathClamp(\n        yPos * positionsX.length + xPos,\n        -1,\n        this._thumbnails.length - 1\n      );\n    }\n    if (index === lastDraggedOverIndex) {\n      // No change.\n      return null;\n    }\n    this.#lastDraggedOverIndex = index;\n    // Use the last-row gap when the drop slot is in the incomplete last row.\n    const space =\n      yPos === positionsY.length - 1 && positionsLastX.length > 0 && xPos >= 0\n        ? lastSpaceBetweenThumbnails\n        : spaceBetweenThumbnails;\n\n    return [index, space];\n  }\n}\n\nexport { PDFThumbnailViewer };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/page_viewport\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/editor/tools.js\").AnnotationEditorUIManager} AnnotationEditorUIManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/annotation_layer.js\").AnnotationLayer} AnnotationLayer */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/struct_tree_layer_builder.js\").StructTreeLayerBuilder} StructTreeLayerBuilder */\n\nimport { AnnotationEditorLayer } from \"pdfjs-lib\";\nimport { GenericL10n } from \"web-null_l10n\";\n\n/**\n * @typedef {Object} AnnotationEditorLayerBuilderOptions\n * @property {AnnotationEditorUIManager} [uiManager]\n * @property {number} pageIndex\n * @property {L10n} [l10n]\n * @property {StructTreeLayerBuilder} [structTreeLayer]\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {AnnotationLayer} [annotationLayer]\n * @property {TextLayer} [textLayer]\n * @property {DrawLayer} [drawLayer]\n * @property {function} [onAppend]\n */\n\n/**\n * @typedef {Object} AnnotationEditorLayerBuilderRenderOptions\n * @property {PageViewport} viewport\n * @property {string} [intent] - The default value is \"display\".\n */\n\nclass AnnotationEditorLayerBuilder {\n  #annotationLayer = null;\n\n  #drawLayer = null;\n\n  #onAppend = null;\n\n  #structTreeLayer = null;\n\n  #textLayer = null;\n\n  #uiManager;\n\n  /**\n   * @param {AnnotationEditorLayerBuilderOptions} options\n   */\n  constructor(options) {\n    this.pageIndex = options.pageIndex;\n    this.accessibilityManager = options.accessibilityManager;\n    this.l10n = options.l10n;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this.l10n ||= new GenericL10n();\n    }\n    this.annotationEditorLayer = null;\n    this.div = null;\n    this._cancelled = false;\n    this.#uiManager = options.uiManager;\n    this.#annotationLayer = options.annotationLayer || null;\n    this.#textLayer = options.textLayer || null;\n    this.#drawLayer = options.drawLayer || null;\n    this.#onAppend = options.onAppend || null;\n    this.#structTreeLayer = options.structTreeLayer || null;\n  }\n\n  updatePageIndex(newPageIndex) {\n    this.pageIndex = newPageIndex;\n    this.annotationEditorLayer?.updatePageIndex(newPageIndex);\n  }\n\n  /**\n   * @param {AnnotationEditorLayerBuilderRenderOptions} options\n   * @returns {Promise<void>}\n   */\n  async render({ viewport, intent = \"display\" }) {\n    if (intent !== \"display\") {\n      return;\n    }\n\n    if (this._cancelled) {\n      return;\n    }\n\n    const clonedViewport = viewport.clone({ dontFlip: true });\n    if (this.div) {\n      this.annotationEditorLayer.update({ viewport: clonedViewport });\n      this.show();\n      return;\n    }\n\n    // Create an AnnotationEditor layer div\n    const div = (this.div = document.createElement(\"div\"));\n    div.className = \"annotationEditorLayer\";\n    div.hidden = true;\n    div.dir = this.#uiManager.direction;\n    this.#onAppend?.(div);\n\n    this.annotationEditorLayer = new AnnotationEditorLayer({\n      uiManager: this.#uiManager,\n      div,\n      structTreeLayer: this.#structTreeLayer,\n      accessibilityManager: this.accessibilityManager,\n      pageIndex: this.pageIndex,\n      l10n: this.l10n,\n      viewport: clonedViewport,\n      annotationLayer: this.#annotationLayer,\n      textLayer: this.#textLayer,\n      drawLayer: this.#drawLayer,\n    });\n\n    const parameters = {\n      viewport: clonedViewport,\n      div,\n      annotations: null,\n      intent,\n    };\n\n    await this.annotationEditorLayer.render(parameters);\n    this.show();\n  }\n\n  cancel() {\n    this._cancelled = true;\n\n    if (!this.div) {\n      return;\n    }\n    this.annotationEditorLayer.destroy();\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n    this.annotationEditorLayer.pause(/* on */ true);\n    this.div.hidden = true;\n  }\n\n  show() {\n    if (!this.div || this.annotationEditorLayer.isInvisible) {\n      return;\n    }\n    this.div.hidden = false;\n    this.annotationEditorLayer.pause(/* on */ false);\n  }\n}\n\nexport { AnnotationEditorLayerBuilder };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/page_viewport\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/annotation_storage\").AnnotationStorage} AnnotationStorage */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./struct_tree_layer_builder.js\").StructTreeLayerBuilder} StructTreeLayerBuilder */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/editor/tools.js\").AnnotationEditorUIManager} AnnotationEditorUIManager */\n/** @typedef {import(\"./comment_manager.js\").CommentManager} CommentManager */\n/** @typedef {import(\"./pdf_link_service.js\").PDFLinkService} PDFLinkService */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./base_download_manager.js\").BaseDownloadManager} BaseDownloadManager */\n\nimport {\n  AnnotationLayer,\n  AnnotationType,\n  setLayerDimensions,\n  Util,\n} from \"pdfjs-lib\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { PresentationModeState } from \"./ui_utils.js\";\n\n/**\n * @typedef {Object} AnnotationLayerBuilderOptions\n * @property {PDFPageProxy} pdfPage\n * @property {AnnotationStorage} [annotationStorage]\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {boolean} renderForms\n * @property {PDFLinkService} linkService\n * @property {BaseDownloadManager} [downloadManager]\n * @property {boolean} [enableComment]\n * @property {boolean} [enableScripting]\n * @property {Promise<boolean>} [hasJSActionsPromise]\n * @property {Promise<Object<string, Array<Object>> | null>}\n *   [fieldObjectsPromise]\n * @property {Map<string, HTMLCanvasElement>} [annotationCanvasMap]\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {AnnotationEditorUIManager} [annotationEditorUIManager]\n * @property {function} [onAppend]\n * @property {CommentManager} [commentManager]\n */\n\n/**\n * @typedef {Object} AnnotationLayerBuilderRenderOptions\n * @property {PageViewport} viewport\n * @property {string} [intent] - The default value is \"display\".\n * @property {StructTreeLayerBuilder} [structTreeLayer]\n * @property {Promise} [optionalContentConfigPromise]\n */\n\nclass AnnotationLayerBuilder {\n  #annotations = null;\n\n  #commentManager = null;\n\n  #onAppend = null;\n\n  #eventAC = null;\n\n  #linksInjected = false;\n\n  /**\n   * @param {AnnotationLayerBuilderOptions} options\n   */\n  constructor({\n    pdfPage,\n    linkService,\n    downloadManager,\n    annotationStorage = null,\n    imageResourcesPath = \"\",\n    renderForms = true,\n    enableComment = false,\n    commentManager = null,\n    enableScripting = false,\n    hasJSActionsPromise = null,\n    fieldObjectsPromise = null,\n    annotationCanvasMap = null,\n    accessibilityManager = null,\n    annotationEditorUIManager = null,\n    onAppend = null,\n  }) {\n    this.pdfPage = pdfPage;\n    this.linkService = linkService;\n    this.downloadManager = downloadManager;\n    this.imageResourcesPath = imageResourcesPath;\n    this.renderForms = renderForms;\n    this.annotationStorage = annotationStorage;\n    this.enableComment = enableComment;\n    this.#commentManager = commentManager;\n    this.enableScripting = enableScripting;\n    this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false);\n    this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null);\n    this._annotationCanvasMap = annotationCanvasMap;\n    this._accessibilityManager = accessibilityManager;\n    this._annotationEditorUIManager = annotationEditorUIManager;\n    this.#onAppend = onAppend;\n\n    this.annotationLayer = null;\n    this.div = null;\n    this._cancelled = false;\n    this._eventBus = linkService.eventBus;\n  }\n\n  /**\n   * @param {AnnotationLayerBuilderRenderOptions} options\n   * @returns {Promise<void>} A promise that is resolved when rendering of the\n   *   annotations is complete.\n   */\n  async render({\n    viewport,\n    intent = \"display\",\n    structTreeLayer = null,\n    optionalContentConfigPromise = null,\n  }) {\n    if (this.div) {\n      const optionalContentConfig = await optionalContentConfigPromise;\n\n      if (this._cancelled || !this.annotationLayer) {\n        return;\n      }\n      // If an annotationLayer already exists, refresh its children's\n      // transformation matrices.\n      this.annotationLayer.update({\n        viewport: viewport.clone({ dontFlip: true }),\n        optionalContentConfig,\n      });\n      return;\n    }\n\n    const [annotations, hasJSActions, fieldObjects, optionalContentConfig] =\n      await Promise.all([\n        this.pdfPage.getAnnotations({ intent }),\n        this._hasJSActionsPromise,\n        this._fieldObjectsPromise,\n        optionalContentConfigPromise,\n      ]);\n    if (this._cancelled) {\n      return;\n    }\n\n    // Create an annotation layer div and render the annotations\n    // if there is at least one annotation.\n    const div = (this.div = document.createElement(\"div\"));\n    div.className = \"annotationLayer\";\n    this.#onAppend?.(div);\n    this.#initAnnotationLayer(viewport, structTreeLayer);\n\n    if (annotations.length === 0) {\n      this.#annotations = annotations;\n      setLayerDimensions(this.div, viewport);\n      return;\n    }\n\n    await this.annotationLayer.render({\n      annotations,\n      imageResourcesPath: this.imageResourcesPath,\n      renderForms: this.renderForms,\n      downloadManager: this.downloadManager,\n      enableComment: this.enableComment,\n      enableScripting: this.enableScripting,\n      hasJSActions,\n      fieldObjects,\n      optionalContentConfig,\n    });\n\n    this.#annotations = annotations;\n\n    // Ensure that interactive form elements in the annotationLayer are\n    // disabled while PresentationMode is active (see issue 12232).\n    if (this.linkService.isInPresentationMode) {\n      this.#updatePresentationModeState(PresentationModeState.FULLSCREEN);\n    }\n    if (!this.#eventAC) {\n      this.#eventAC = new AbortController();\n\n      this._eventBus?.on(\n        \"presentationmodechanged\",\n        evt => {\n          this.#updatePresentationModeState(evt.state);\n        },\n        { signal: this.#eventAC.signal, ...internalOpt }\n      );\n    }\n  }\n\n  #initAnnotationLayer(viewport, structTreeLayer) {\n    this.annotationLayer = new AnnotationLayer({\n      div: this.div,\n      accessibilityManager: this._accessibilityManager,\n      annotationCanvasMap: this._annotationCanvasMap,\n      annotationEditorUIManager: this._annotationEditorUIManager,\n      annotationStorage: this.annotationStorage,\n      page: this.pdfPage,\n      viewport: viewport.clone({ dontFlip: true }),\n      structTreeLayer,\n      commentManager: this.#commentManager,\n      linkService: this.linkService,\n    });\n  }\n\n  cancel() {\n    this._cancelled = true;\n\n    this.#eventAC?.abort();\n    this.#eventAC = null;\n    this.annotationLayer?.destroy();\n  }\n\n  refreshCanvases() {\n    this.annotationLayer?.refreshCanvases();\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n    this.div.hidden = true;\n  }\n\n  hasEditableAnnotations() {\n    return !!this.annotationLayer?.hasEditableAnnotations();\n  }\n\n  /**\n   * @param {Array<Object>} inferredLinks\n   * @returns {Promise<void>} A promise that is resolved when the inferred links\n   *   are added to the annotation layer.\n   */\n  async injectLinkAnnotations(inferredLinks) {\n    if (this.#annotations === null) {\n      throw new Error(\n        \"`render` method must be called before `injectLinkAnnotations`.\"\n      );\n    }\n    if (this._cancelled || this.#linksInjected) {\n      return;\n    }\n    this.#linksInjected = true;\n\n    const newLinks = this.#annotations.length\n      ? this.#checkInferredLinks(inferredLinks)\n      : inferredLinks;\n\n    if (!newLinks.length) {\n      return;\n    }\n\n    await this.annotationLayer.addLinkAnnotations(newLinks);\n  }\n\n  #updatePresentationModeState(state) {\n    if (!this.div) {\n      return;\n    }\n    let disableFormElements = false;\n\n    switch (state) {\n      case PresentationModeState.FULLSCREEN:\n        disableFormElements = true;\n        break;\n      case PresentationModeState.NORMAL:\n        break;\n      default:\n        return;\n    }\n    for (const section of this.div.childNodes) {\n      if (\n        section.hasAttribute(\"data-internal-link\") ||\n        section.classList.contains(\"mediaAnnotation\")\n      ) {\n        continue;\n      }\n      section.inert = disableFormElements;\n    }\n  }\n\n  #checkInferredLinks(inferredLinks) {\n    function annotationRects(annot) {\n      if (!annot.quadPoints) {\n        return [annot.rect];\n      }\n      const rects = [];\n      for (let i = 2, ii = annot.quadPoints.length; i < ii; i += 8) {\n        const trX = annot.quadPoints[i];\n        const trY = annot.quadPoints[i + 1];\n        const blX = annot.quadPoints[i + 2];\n        const blY = annot.quadPoints[i + 3];\n        rects.push([blX, blY, trX, trY]);\n      }\n      return rects;\n    }\n\n    function intersectAnnotations(annot1, annot2) {\n      const intersections = [];\n      const annot1Rects = annotationRects(annot1);\n      const annot2Rects = annotationRects(annot2);\n      for (const rect1 of annot1Rects) {\n        for (const rect2 of annot2Rects) {\n          const intersection = Util.intersect(rect1, rect2);\n          if (intersection) {\n            intersections.push(intersection);\n          }\n        }\n      }\n      return intersections;\n    }\n\n    function areaRects(rects) {\n      let totalArea = 0;\n      for (const rect of rects) {\n        totalArea += Math.abs((rect[2] - rect[0]) * (rect[3] - rect[1]));\n      }\n      return totalArea;\n    }\n\n    return inferredLinks.filter(link => {\n      let linkAreaRects;\n\n      for (const annotation of this.#annotations) {\n        if (annotation.annotationType !== AnnotationType.LINK) {\n          continue;\n        }\n        // TODO: Add a test case to verify that we can find the intersection\n        //       between two annotations with quadPoints properly.\n        const intersections = intersectAnnotations(annotation, link);\n\n        if (intersections.length === 0) {\n          continue;\n        }\n        linkAreaRects ??= areaRects(annotationRects(link));\n\n        if (\n          areaRects(intersections) / linkAreaRects >\n          0.5 /* If the overlap is more than 50%. */\n        ) {\n          return false;\n        }\n      }\n      return true;\n    });\n  }\n}\n\nexport { AnnotationLayerBuilder };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationType, createValidAbsoluteUrl, Util } from \"pdfjs-lib\";\nimport { getOriginalIndex, normalize } from \"./pdf_find_controller.js\";\n\nfunction DOMRectToPDF({ width, height, left, top }, pdfPageView) {\n  if (width === 0 || height === 0) {\n    return null;\n  }\n\n  const pageBox = pdfPageView.textLayer.div.getBoundingClientRect();\n  const bottomLeft = pdfPageView.getPagePoint(\n    left - pageBox.left,\n    top - pageBox.top\n  );\n  const topRight = pdfPageView.getPagePoint(\n    left - pageBox.left + width,\n    top - pageBox.top + height\n  );\n\n  return Util.normalizeRect([\n    bottomLeft[0],\n    bottomLeft[1],\n    topRight[0],\n    topRight[1],\n  ]);\n}\n\nfunction calculateLinkPosition(range, pdfPageView) {\n  const rangeRects = range.getClientRects();\n  if (rangeRects.length === 1) {\n    return { rect: DOMRectToPDF(rangeRects[0], pdfPageView) };\n  }\n\n  const rect = [Infinity, Infinity, -Infinity, -Infinity];\n  const quadPoints = [];\n  let i = 0;\n  for (const domRect of rangeRects) {\n    const normalized = DOMRectToPDF(domRect, pdfPageView);\n    if (normalized === null) {\n      continue;\n    }\n\n    quadPoints[i] = quadPoints[i + 4] = normalized[0];\n    quadPoints[i + 1] = quadPoints[i + 3] = normalized[3];\n    quadPoints[i + 2] = quadPoints[i + 6] = normalized[2];\n    quadPoints[i + 5] = quadPoints[i + 7] = normalized[1];\n\n    Util.rectBoundingBox(...normalized, rect);\n    i += 8;\n  }\n  return { quadPoints, rect };\n}\n\n/**\n * Given a DOM node `container` and an index into its text contents `offset`,\n * returns a pair consisting of text node that the `offset` actually points\n * to, together with the offset relative to that text node.\n * When the offset points at the boundary between two node, the result will\n * point to the first text node in depth-first traversal order.\n *\n * For example, given this DOM:\n * <p>abc<span>def</span>ghi</p>\n *\n * textPosition(p, 0) -> [#text \"abc\", 0] (before `a`)\n * textPosition(p, 2) -> [#text \"abc\", 2] (between `b` and `c`)\n * textPosition(p, 3) -> [#text \"abc\", 3] (after `c`)\n * textPosition(p, 5) -> [#text \"def\", 2] (between `e` and `f`)\n * textPosition(p, 6) -> [#text \"def\", 3] (after `f`)\n */\nfunction textPosition(container, offset) {\n  let currentContainer = container;\n  do {\n    if (currentContainer.nodeType === Node.TEXT_NODE) {\n      const currentLength = currentContainer.textContent.length;\n      if (offset <= currentLength) {\n        return [currentContainer, offset];\n      }\n      offset -= currentLength;\n    } else if (currentContainer.firstChild) {\n      currentContainer = currentContainer.firstChild;\n      continue;\n    }\n\n    while (!currentContainer.nextSibling && currentContainer !== container) {\n      currentContainer = currentContainer.parentNode;\n    }\n    if (currentContainer !== container) {\n      currentContainer = currentContainer.nextSibling;\n    }\n  } while (currentContainer !== container);\n  throw new Error(\"Offset is bigger than container's contents length.\");\n}\n\nfunction createLinkAnnotation({ url, index, length }, pdfPageView, id) {\n  const highlighter = pdfPageView._textHighlighter;\n  const [{ begin, end }] = highlighter._convertMatches([index], [length]);\n\n  const range = new Range();\n  range.setStart(\n    ...textPosition(highlighter.textDivs[begin.divIdx], begin.offset)\n  );\n  range.setEnd(...textPosition(highlighter.textDivs[end.divIdx], end.offset));\n\n  return {\n    id: `inferred_link_${id}`,\n    unsafeUrl: url,\n    url,\n    annotationType: AnnotationType.LINK,\n    rotation: 0,\n    ...calculateLinkPosition(range, pdfPageView),\n    // Populated in the annotationLayer to avoid unnecessary object creation,\n    // since most inferred links overlap existing LinkAnnotations:\n    borderStyle: null,\n  };\n}\n\nclass Autolinker {\n  static #index = 0;\n\n  static #regex;\n\n  static #numericTLDRegex;\n\n  static findLinks(text) {\n    // Regex can be tested and verified at https://regex101.com/r/rXoLiT/2.\n    this.#regex ??=\n      // eslint-disable-next-line regexp/no-super-linear-backtracking\n      /\\b(?:https?:\\/\\/|mailto:|www\\.)(?:[\\S--[\\p{P}<>]]|\\/|[\\S--[\\[\\]]]+[\\S--[\\p{P}<>]])+|(?=\\p{L})[\\S--[@\\p{Ps}\\p{Pe}<>]]+@([\\S--[[\\p{P}--\\-]<>]]+(?:\\.[\\S--[[\\p{P}--\\-]<>]]+)+)/gv;\n\n    const [normalizedText, diffs] = normalize(text, { ignoreDashEOL: true });\n    const matches = normalizedText.matchAll(this.#regex);\n    const links = [];\n    for (const match of matches) {\n      const [url, emailDomain] = match;\n      let raw;\n      if (\n        url.startsWith(\"www.\") ||\n        url.startsWith(\"http://\") ||\n        url.startsWith(\"https://\")\n      ) {\n        raw = url;\n      } else if (emailDomain) {\n        const hostname = URL.parse(`http://${emailDomain}`)?.hostname;\n        if (!hostname) {\n          continue;\n        }\n        this.#numericTLDRegex ??= /\\.\\d+$/;\n        if (this.#numericTLDRegex.test(hostname)) {\n          // Skip emails with a numeric TLD as domain.\n          continue;\n        }\n      }\n      raw ??= url.startsWith(\"mailto:\") ? url : `mailto:${url}`;\n\n      const absoluteURL = createValidAbsoluteUrl(raw, null, {\n        addDefaultProtocol: true,\n      });\n      if (absoluteURL) {\n        const [index, length] = getOriginalIndex(\n          diffs,\n          match.index,\n          url.length\n        );\n        links.push({ url: absoluteURL.href, index, length });\n      }\n    }\n    return links;\n  }\n\n  static processLinks(pdfPageView) {\n    return this.findLinks(\n      pdfPageView._textHighlighter.textContentItemsStr.join(\"\\n\")\n    ).map(link => createLinkAnnotation(link, pdfPageView, this.#index++));\n  }\n}\n\nexport { Autolinker };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FeatureTest, RenderingCancelledException } from \"pdfjs-lib\";\nimport { RenderableView, RenderingStates } from \"./renderable_view.js\";\n\nclass BasePDFPageView extends RenderableView {\n  #loadingId = null;\n\n  #renderError = null;\n\n  #renderingState = RenderingStates.INITIAL;\n\n  #showCanvas = null;\n\n  #startTime = 0;\n\n  #tempCanvas = null;\n\n  canvas = null;\n\n  /** @type {null | HTMLDivElement} */\n  div = null;\n\n  enableOptimizedPartialRendering = false;\n\n  enableSelectionRendering = true;\n\n  imagesRightClickMinSize = -1;\n\n  eventBus = null;\n\n  id = null;\n\n  imageCoordinates = null;\n\n  pageColors = null;\n\n  recordedBBoxes = null;\n\n  renderingQueue = null;\n\n  constructor(options) {\n    super();\n    this.eventBus = options.eventBus;\n    this.id = options.id;\n    this.pageColors = options.pageColors || null;\n    this.renderingQueue = options.renderingQueue;\n    this.enableOptimizedPartialRendering =\n      options.enableOptimizedPartialRendering ?? false;\n    this.enableSelectionRendering =\n      options.enableSelectionRendering !== false &&\n      FeatureTest.isBackdropFilterSupported;\n    this.imagesRightClickMinSize = options.imagesRightClickMinSize ?? -1;\n    this.minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500;\n  }\n\n  get renderingState() {\n    return this.#renderingState;\n  }\n\n  set renderingState(state) {\n    if (state === this.#renderingState) {\n      return;\n    }\n    this.#renderingState = state;\n\n    if (this.#loadingId) {\n      clearTimeout(this.#loadingId);\n      this.#loadingId = null;\n    }\n\n    switch (state) {\n      case RenderingStates.PAUSED:\n        this.div.classList.remove(\"loading\");\n        // Display the canvas as it has been drawn.\n        this.#startTime = 0;\n        this.#showCanvas?.(false);\n        break;\n      case RenderingStates.RUNNING:\n        this.div.classList.add(\"loadingIcon\");\n        this.#loadingId = setTimeout(() => {\n          // Adding the loading class is slightly postponed in order to not have\n          // it with loadingIcon.\n          // If we don't do that the visibility of the background is changed but\n          // the transition isn't triggered.\n          this.div.classList.add(\"loading\");\n          this.#loadingId = null;\n        }, 0);\n        this.#startTime = Date.now();\n        break;\n      case RenderingStates.INITIAL:\n      case RenderingStates.FINISHED:\n        this.div.classList.remove(\"loadingIcon\", \"loading\");\n        this.#startTime = 0;\n        break;\n    }\n  }\n\n  _createCanvas(onShow, hideUntilComplete = false) {\n    const { pageColors } = this;\n    const hasHCM = !!(pageColors?.background && pageColors?.foreground);\n    const prevCanvas = this.canvas;\n\n    // In HCM, a final filter is applied on the canvas which means that\n    // before it's applied we've normal colors. Consequently, to avoid to\n    // have a final flash we just display it once all the drawing is done.\n    const updateOnFirstShow = !prevCanvas && !hasHCM && !hideUntilComplete;\n\n    let canvas = (this.canvas = document.createElement(\"canvas\"));\n\n    this.#showCanvas = isLastShow => {\n      if (updateOnFirstShow) {\n        let tempCanvas = this.#tempCanvas;\n        if (!isLastShow && this.minDurationToUpdateCanvas > 0) {\n          // We draw on the canvas at 60fps (in using `requestAnimationFrame`),\n          // so if the canvas is large, updating it at 60fps can be a way too\n          // much and can cause some serious performance issues.\n          // To avoid that we only update the canvas every\n          // `this.#minDurationToUpdateCanvas` ms.\n\n          if (Date.now() - this.#startTime < this.minDurationToUpdateCanvas) {\n            return;\n          }\n          if (!tempCanvas) {\n            tempCanvas = this.#tempCanvas = canvas;\n            canvas = this.canvas = canvas.cloneNode(false);\n            onShow(canvas);\n          }\n        }\n\n        if (tempCanvas) {\n          const ctx = canvas.getContext(\"2d\", {\n            alpha: false,\n          });\n          ctx.drawImage(tempCanvas, 0, 0);\n          if (isLastShow) {\n            this.#resetTempCanvas();\n          } else {\n            this.#startTime = Date.now();\n          }\n          return;\n        }\n\n        // Don't add the canvas until the first draw callback, or until\n        // drawing is complete when `!this.renderingQueue`, to prevent black\n        // flickering.\n        onShow(canvas);\n        this.#showCanvas = null;\n        return;\n      }\n      if (!isLastShow) {\n        return;\n      }\n\n      if (prevCanvas) {\n        prevCanvas.replaceWith(canvas);\n        prevCanvas.width = prevCanvas.height = 0;\n      } else {\n        onShow(canvas);\n      }\n    };\n\n    return { canvas, prevCanvas };\n  }\n\n  #renderContinueCallback = cont => {\n    this.#showCanvas?.(false);\n    if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) {\n      this.renderingState = RenderingStates.PAUSED;\n      this.resume = () => {\n        this.renderingState = RenderingStates.RUNNING;\n        cont();\n      };\n      return;\n    }\n    cont();\n  };\n\n  _resetCanvas() {\n    const { canvas } = this;\n    if (!canvas) {\n      return;\n    }\n    canvas.remove();\n    canvas.width = canvas.height = 0;\n    this.canvas = null;\n    this.#resetTempCanvas();\n  }\n\n  #resetTempCanvas() {\n    if (this.#tempCanvas) {\n      this.#tempCanvas.width = this.#tempCanvas.height = 0;\n      this.#tempCanvas = null;\n    }\n  }\n\n  async _drawCanvas(options, onCancel, onFinish) {\n    const renderTask = (this.renderTask = this.pdfPage.render(options));\n    renderTask.onContinue = this.#renderContinueCallback;\n    renderTask.onError = error => {\n      if (error instanceof RenderingCancelledException) {\n        onCancel();\n        this.#renderError = null;\n      }\n    };\n\n    let error = null;\n    try {\n      await renderTask.promise;\n      this.#showCanvas?.(true);\n    } catch (e) {\n      // When zooming with a `drawingDelay` set, avoid temporarily showing\n      // a black canvas if rendering was cancelled before the `onContinue`-\n      // callback had been invoked at least once.\n      if (e instanceof RenderingCancelledException) {\n        return;\n      }\n      error = e;\n\n      this.#showCanvas?.(true);\n    } finally {\n      this.#renderError = error;\n\n      // The renderTask may have been replaced by a new one, so only remove\n      // the reference to the renderTask if it matches the one that is\n      // triggering this callback.\n      if (renderTask === this.renderTask) {\n        this.renderTask = null;\n        if (this.enableOptimizedPartialRendering) {\n          this.recordedBBoxes ??= renderTask.recordedBBoxes;\n        }\n        if (this.imagesRightClickMinSize !== -1) {\n          this.imageCoordinates ??= this.pdfPage.imageCoordinates;\n        }\n      }\n    }\n    this.renderingState = RenderingStates.FINISHED;\n\n    onFinish(renderTask);\n\n    if (error) {\n      throw error;\n    }\n  }\n\n  cancelRendering({ cancelExtraDelay = 0 } = {}) {\n    if (this.renderTask) {\n      this.renderTask.cancel(cancelExtraDelay);\n      this.renderTask = null;\n    }\n    this.resume = null;\n  }\n\n  dispatchPageRender() {\n    this.eventBus.dispatch(\"pagerender\", {\n      source: this,\n      pageNumber: this.id,\n    });\n  }\n\n  dispatchPageRendered(cssTransform, isDetailView) {\n    this.eventBus.dispatch(\"pagerendered\", {\n      source: this,\n      pageNumber: this.id,\n      cssTransform,\n      isDetailView,\n      timestamp: performance.now(),\n      error: this.#renderError,\n    });\n  }\n}\n\nexport { BasePDFPageView };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DrawLayer } from \"pdfjs-lib\";\n\n/**\n * @typedef DrawLayerBuilderOptions\n *   Configuration for {@linkcode DrawLayerBuilder}.\n * @property {number} pageIndex\n *   Zero-based page index.\n * @property {Element | null} [textLayer]\n *   Text layer element (optional).\n * @property {Object | null} [filterFactory]\n *   Filter factory used to style selections (optional).\n * @property {Object | null} [pageColors]\n *   Page foreground/background colors for HCM (optional).\n */\n\n/**\n * @typedef {Object} DrawLayerBuilderRenderOptions\n * @property {string} [intent] - The default value is \"display\".\n */\n\nclass DrawLayerBuilder {\n  #drawLayer = null;\n\n  /**\n   * @param {DrawLayerBuilderOptions} options\n   *   Configuration.\n   * @returns\n   *   Instance.\n   */\n  constructor(options) {\n    this.pageIndex = options.pageIndex;\n    this.textLayer = options.textLayer || null;\n    this.filterFactory = options.filterFactory || null;\n    this.pageColors = options.pageColors || null;\n  }\n\n  /**\n   * @param {DrawLayerBuilderRenderOptions} options\n   * @returns {Promise<void>}\n   */\n  async render({ intent = \"display\" }) {\n    if (intent !== \"display\" || this.#drawLayer || this._cancelled) {\n      return;\n    }\n    this.#drawLayer = new DrawLayer({\n      pageIndex: this.pageIndex,\n      textLayer: this.textLayer,\n      filterFactory: this.filterFactory,\n      pageColors: this.pageColors,\n    });\n  }\n\n  cancel() {\n    this._cancelled = true;\n\n    this.#drawLayer?.destroy();\n    this.#drawLayer = null;\n  }\n\n  setParent(parent) {\n    this.#drawLayer?.setParent(parent);\n  }\n\n  getDrawLayer() {\n    return this.#drawLayer;\n  }\n}\n\nexport { DrawLayerBuilder };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BasePDFPageView } from \"./base_pdf_page_view.js\";\nimport { OutputScale } from \"pdfjs-lib\";\nimport { RenderingStates } from \"./renderable_view.js\";\n\nclass PDFPageDetailView extends BasePDFPageView {\n  #detailArea = null;\n\n  /**\n   * @type {boolean} True when the last rendering attempt of the view was\n   *                 cancelled due to a `.reset()` call. This will happen when\n   *                 the visible area changes so much during the rendering that\n   *                 we need to cancel the rendering and start over.\n   */\n  renderingCancelled = false;\n\n  constructor({ pageView }) {\n    super(pageView);\n\n    this.pageView = pageView;\n    this.renderingId = \"detail\" + this.id;\n\n    this.div = pageView.div;\n  }\n\n  setPdfPage(pdfPage) {\n    this.pageView.setPdfPage(pdfPage);\n  }\n\n  get pdfPage() {\n    return this.pageView.pdfPage;\n  }\n\n  get renderingState() {\n    return super.renderingState;\n  }\n\n  set renderingState(state) {\n    this.renderingCancelled = false;\n    super.renderingState = state;\n  }\n\n  reset({ keepCanvas = false } = {}) {\n    const renderingCancelled =\n      this.renderingCancelled ||\n      this.renderingState === RenderingStates.RUNNING ||\n      this.renderingState === RenderingStates.PAUSED;\n    this.cancelRendering();\n    this.renderingState = RenderingStates.INITIAL;\n    this.renderingCancelled = renderingCancelled;\n\n    if (!keepCanvas) {\n      this._resetCanvas();\n    }\n  }\n\n  #shouldRenderDifferentArea(visibleArea) {\n    if (!this.#detailArea) {\n      return true;\n    }\n\n    const minDetailX = this.#detailArea.minX;\n    const minDetailY = this.#detailArea.minY;\n    const maxDetailX = this.#detailArea.width + minDetailX;\n    const maxDetailY = this.#detailArea.height + minDetailY;\n\n    if (\n      visibleArea.minX < minDetailX ||\n      visibleArea.minY < minDetailY ||\n      visibleArea.maxX > maxDetailX ||\n      visibleArea.maxY > maxDetailY\n    ) {\n      return true;\n    }\n\n    const {\n      width: maxWidth,\n      height: maxHeight,\n      scale,\n    } = this.pageView.viewport;\n\n    if (this.#detailArea.scale !== scale) {\n      return true;\n    }\n\n    const paddingLeftSize = visibleArea.minX - minDetailX;\n    const paddingRightSize = maxDetailX - visibleArea.maxX;\n    const paddingTopSize = visibleArea.minY - minDetailY;\n    const paddingBottomSize = maxDetailY - visibleArea.maxY;\n\n    // If the user is moving in any direction such that the remaining area\n    // rendered outside of the screen is less than MOVEMENT_THRESHOLD of the\n    // padding we render on each side, trigger a re-render. This is so that if\n    // the user then keeps scrolling in that direction, we have a chance of\n    // finishing rendering the new detail before they get past the rendered\n    // area.\n\n    const MOVEMENT_THRESHOLD = 0.5;\n    const ratio = (1 + MOVEMENT_THRESHOLD) / MOVEMENT_THRESHOLD;\n\n    if (\n      (minDetailX > 0 && paddingRightSize / paddingLeftSize > ratio) ||\n      (maxDetailX < maxWidth && paddingLeftSize / paddingRightSize > ratio) ||\n      (minDetailY > 0 && paddingBottomSize / paddingTopSize > ratio) ||\n      (maxDetailY < maxHeight && paddingTopSize / paddingBottomSize > ratio)\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  update({ visibleArea = null, underlyingViewUpdated = false } = {}) {\n    if (underlyingViewUpdated) {\n      this.cancelRendering();\n      this.renderingState = RenderingStates.INITIAL;\n      return;\n    }\n\n    if (!this.#shouldRenderDifferentArea(visibleArea)) {\n      return;\n    }\n\n    const { viewport, maxCanvasPixels, capCanvasAreaFactor } = this.pageView;\n\n    const visibleWidth = visibleArea.maxX - visibleArea.minX;\n    const visibleHeight = visibleArea.maxY - visibleArea.minY;\n\n    // \"overflowScale\" represents which percentage of the width and of the\n    // height the detail area extends outside of the visible area. We want to\n    // draw a larger area so that we don't have to constantly re-draw while\n    // scrolling. The detail area's dimensions thus become\n    // visibleLength * (2 * overflowScale + 1).\n    // We default to adding a whole height/length of detail area on each side,\n    // but we can reduce it to make sure that we stay within the maxCanvasPixels\n    // limit.\n    const visiblePixels =\n      visibleWidth * visibleHeight * OutputScale.pixelRatio ** 2;\n    const maxDetailToVisibleLinearRatio = Math.sqrt(\n      OutputScale.capPixels(maxCanvasPixels, capCanvasAreaFactor) /\n        visiblePixels\n    );\n    const maxOverflowScale = (maxDetailToVisibleLinearRatio - 1) / 2;\n    let overflowScale = Math.min(1, maxOverflowScale);\n    if (overflowScale < 0) {\n      overflowScale = 0;\n      // In this case, we render a detail view that is exactly as big as the\n      // visible area, but we ignore the .maxCanvasPixels limit.\n      // TODO: We should probably instead give up and not render the detail view\n      // in this case. It's quite rare to hit it though, because usually\n      // .maxCanvasPixels will at least have enough pixels to cover the visible\n      // screen.\n    }\n\n    const overflowWidth = visibleWidth * overflowScale;\n    const overflowHeight = visibleHeight * overflowScale;\n\n    const minX = Math.max(0, visibleArea.minX - overflowWidth);\n    const maxX = Math.min(viewport.width, visibleArea.maxX + overflowWidth);\n    const minY = Math.max(0, visibleArea.minY - overflowHeight);\n    const maxY = Math.min(viewport.height, visibleArea.maxY + overflowHeight);\n    const width = maxX - minX;\n    const height = maxY - minY;\n\n    this.#detailArea = { minX, minY, width, height, scale: viewport.scale };\n\n    this.reset({ keepCanvas: true });\n  }\n\n  _getRenderingContext(canvas, transform) {\n    const baseContext = this.pageView._getRenderingContext(\n      canvas,\n      transform,\n      false\n    );\n    const recordedBBoxes = this.pdfPage.recordedBBoxes;\n\n    if (!recordedBBoxes || !this.enableOptimizedPartialRendering) {\n      return baseContext;\n    }\n\n    const {\n      viewport: { width: vWidth, height: vHeight },\n    } = this.pageView;\n    const {\n      width: aWidth,\n      height: aHeight,\n      minX: aMinX,\n      minY: aMinY,\n    } = this.#detailArea;\n\n    const detailMinX = aMinX / vWidth;\n    const detailMinY = aMinY / vHeight;\n    const detailMaxX = (aMinX + aWidth) / vWidth;\n    const detailMaxY = (aMinY + aHeight) / vHeight;\n\n    return {\n      ...baseContext,\n      operationsFilter(index) {\n        if (recordedBBoxes.isEmpty(index)) {\n          return false;\n        }\n        return (\n          recordedBBoxes.minX(index) <= detailMaxX &&\n          recordedBBoxes.maxX(index) >= detailMinX &&\n          recordedBBoxes.minY(index) <= detailMaxY &&\n          recordedBBoxes.maxY(index) >= detailMinY\n        );\n      },\n    };\n  }\n\n  async draw() {\n    // The PDFPageView might have already dropped this PDFPageDetailView. In\n    // that case, simply do nothing.\n    if (this.pageView.detailView !== this) {\n      return undefined;\n    }\n\n    // If there is already the lower resolution canvas behind,\n    // we don't show the new one until when it's fully ready.\n    const hideUntilComplete =\n      this.pageView.renderingState === RenderingStates.FINISHED ||\n      this.renderingState === RenderingStates.FINISHED;\n\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error(\"Must be in new state before drawing\");\n      this.reset(); // Ensure that we reset all state to prevent issues.\n    }\n    const { div, pdfPage, viewport } = this.pageView;\n\n    if (!pdfPage) {\n      this.renderingState = RenderingStates.FINISHED;\n      throw new Error(\"pdfPage is not loaded\");\n    }\n\n    this.renderingState = RenderingStates.RUNNING;\n\n    const canvasWrapper = this.pageView._ensureCanvasWrapper();\n\n    const { canvas, prevCanvas } = this._createCanvas(newCanvas => {\n      // If there is already the background canvas, inject this new canvas\n      // after it. We cannot simply use .append because all canvases must\n      // be before the SVG elements used for drawings.\n      if (canvasWrapper.firstElementChild?.tagName === \"CANVAS\") {\n        canvasWrapper.firstElementChild.after(newCanvas);\n      } else {\n        canvasWrapper.prepend(newCanvas);\n      }\n    }, hideUntilComplete);\n    canvas.ariaHidden = true;\n    if (this.enableOptimizedPartialRendering) {\n      canvas.className = \"detailView\";\n    }\n\n    const { width, height } = viewport;\n\n    const area = this.#detailArea;\n\n    const { pixelRatio } = OutputScale;\n    const transform = [\n      pixelRatio,\n      0,\n      0,\n      pixelRatio,\n      -area.minX * pixelRatio,\n      -area.minY * pixelRatio,\n    ];\n\n    canvas.width = area.width * pixelRatio;\n    canvas.height = area.height * pixelRatio;\n    const { style } = canvas;\n    style.width = `${(area.width * 100) / width}%`;\n    style.height = `${(area.height * 100) / height}%`;\n    style.top = `${(area.minY * 100) / height}%`;\n    style.left = `${(area.minX * 100) / width}%`;\n\n    const renderingPromise = this._drawCanvas(\n      this._getRenderingContext(canvas, transform),\n      () => {\n        // If the rendering is cancelled, keep the old canvas visible.\n        this.canvas?.remove();\n        this.canvas = prevCanvas;\n      },\n      () => {\n        this.pageView._refreshAnnotationLayer();\n        this.dispatchPageRendered(\n          /* cssTransform */ false,\n          /* isDetailView */ true\n        );\n      }\n    );\n\n    div.setAttribute(\"data-loaded\", true);\n\n    this.dispatchPageRender();\n\n    return renderingPromise;\n  }\n}\n\nexport { PDFPageDetailView };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n\nimport { FeatureTest, makeMap, shadow } from \"pdfjs-lib\";\nimport { removeNullCharacters } from \"./ui_utils.js\";\n\nconst PDF_ROLE_TO_HTML_ROLE = {\n  // Document level structure types\n  Document: null, // There's a \"document\" role, but it doesn't make sense here.\n  DocumentFragment: null,\n  // Grouping level structure types\n  Part: \"group\",\n  Sect: \"group\", // XXX: There's a \"section\" role, but it's abstract.\n  Div: \"group\",\n  Aside: \"note\",\n  NonStruct: \"none\",\n  // Block level structure types\n  P: null,\n  // H<n>,\n  H: \"heading\",\n  Title: null,\n  FENote: \"note\",\n  // Sub-block level structure type\n  Sub: \"group\",\n  // General inline level structure types\n  Lbl: null,\n  Span: null,\n  Em: null,\n  Strong: null,\n  Link: \"link\",\n  Annot: \"note\",\n  Form: \"form\",\n  // Ruby and Warichu structure types\n  Ruby: null,\n  RB: null,\n  RT: null,\n  RP: null,\n  Warichu: null,\n  WT: null,\n  WP: null,\n  // List standard structure types\n  L: \"list\",\n  LI: \"listitem\",\n  LBody: null,\n  // Table standard structure types\n  Table: \"table\",\n  TR: \"row\",\n  TH: \"columnheader\",\n  TD: \"cell\",\n  THead: \"rowgroup\",\n  TBody: \"rowgroup\",\n  TFoot: null,\n  // Standard structure type Caption\n  Caption: null,\n  // Standard structure type Figure\n  Figure: \"figure\",\n  // Standard structure type Formula\n  Formula: null,\n  // standard structure type Artifact\n  Artifact: null,\n};\n\nconst MathMLElements = new Set([\n  \"math\",\n  \"merror\",\n  \"mfrac\",\n  \"mi\",\n  \"mmultiscripts\",\n  \"mn\",\n  \"mo\",\n  \"mover\",\n  \"mpadded\",\n  \"mprescripts\",\n  \"mroot\",\n  \"mrow\",\n  \"ms\",\n  \"mspace\",\n  \"msqrt\",\n  \"mstyle\",\n  \"msub\",\n  \"msubsup\",\n  \"msup\",\n  \"mtable\",\n  \"mtd\",\n  \"mtext\",\n  \"mtr\",\n  \"munder\",\n  \"munderover\",\n  \"semantics\",\n]);\nconst MathMLNamespace = \"http://www.w3.org/1998/Math/MathML\";\n\nclass MathMLSanitizer {\n  static get sanitizer() {\n    // From https://w3c.github.io/mathml-docs/mathml-safe-list.\n\n    return shadow(\n      this,\n      \"sanitizer\",\n      FeatureTest.isSanitizerSupported\n        ? new Sanitizer({\n            elements: [...MathMLElements].map(name => ({\n              name,\n              namespace: MathMLNamespace,\n            })),\n            replaceWithChildrenElements: [\n              {\n                name: \"maction\",\n                namespace: MathMLNamespace,\n              },\n            ],\n            attributes: [\n              \"dir\",\n              \"displaystyle\",\n              \"mathbackground\",\n              \"mathcolor\",\n              \"mathsize\",\n              \"scriptlevel\",\n              \"encoding\",\n              \"display\",\n              \"linethickness\",\n              \"intent\",\n              \"arg\",\n              \"form\",\n              \"fence\",\n              \"separator\",\n              \"lspace\",\n              \"rspace\",\n              \"stretchy\",\n              \"symmetric\",\n              \"maxsize\",\n              \"minsize\",\n              \"largeop\",\n              \"movablelimits\",\n              \"width\",\n              \"height\",\n              \"depth\",\n              \"voffset\",\n              \"accent\",\n              \"accentunder\",\n              \"columnspan\",\n              \"rowspan\",\n            ],\n            comments: false,\n          })\n        : null\n    );\n  }\n}\n\nconst HEADING_PATTERN = /^H(\\d+)$/;\n\n/**\n * @typedef {Object} StructTreeLayerBuilderOptions\n * @property {PDFPageProxy} pdfPage\n * @property {Object} rawDims\n */\n\nclass StructTreeLayerBuilder {\n  #promise;\n\n  #treeDom = null;\n\n  #treePromise;\n\n  #elementAttributes = new Map();\n\n  #rawDims;\n\n  #elementsToAddToTextLayer = null;\n\n  #elementsToHideInTextLayer = null;\n\n  #elementsToStealFromTextLayer = null;\n\n  /**\n   * @param {StructTreeLayerBuilderOptions} options\n   */\n  constructor(pdfPage, rawDims) {\n    this.#promise = pdfPage.getStructTree();\n    this.#rawDims = rawDims;\n  }\n\n  /**\n   * @returns {Promise<void>}\n   */\n  async render() {\n    if (this.#treePromise) {\n      return this.#treePromise;\n    }\n    const { promise, resolve, reject } = Promise.withResolvers();\n    this.#treePromise = promise;\n\n    try {\n      this.#treeDom = this.#walk(await this.#promise);\n    } catch (ex) {\n      reject(ex);\n    }\n    this.#promise = null;\n\n    this.#treeDom?.classList.add(\"structTree\");\n    resolve(this.#treeDom);\n\n    return promise;\n  }\n\n  async getAriaAttributes(annotationId) {\n    try {\n      await this.render();\n      return this.#elementAttributes.get(annotationId);\n    } catch {\n      // If the structTree cannot be fetched, parsed, and/or rendered,\n      // ensure that e.g. the AnnotationLayer won't break completely.\n    }\n    return null;\n  }\n\n  hide() {\n    if (this.#treeDom && !this.#treeDom.hidden) {\n      this.#treeDom.hidden = true;\n    }\n  }\n\n  show() {\n    if (this.#treeDom?.hidden) {\n      this.#treeDom.hidden = false;\n    }\n  }\n\n  #setAttributes(structElement, htmlElement) {\n    const { alt, id, lang } = structElement;\n    if (alt !== undefined) {\n      // Don't add the label in the struct tree layer but on the annotation\n      // in the annotation layer.\n      let added = false;\n      const label = removeNullCharacters(alt);\n      for (const child of structElement.children) {\n        if (child.type === \"annotation\") {\n          this.#elementAttributes\n            .getOrInsertComputed(child.id, makeMap)\n            .set(\"aria-label\", label);\n          added = true;\n        }\n      }\n      if (!added) {\n        htmlElement.setAttribute(\"aria-label\", label);\n      }\n    }\n    if (id !== undefined) {\n      htmlElement.setAttribute(\"aria-owns\", id);\n    }\n    if (lang !== undefined) {\n      htmlElement.setAttribute(\n        \"lang\",\n        removeNullCharacters(lang, /* replaceInvisible = */ true)\n      );\n    }\n  }\n\n  #addImageInTextLayer(node, element) {\n    const { alt, bbox, children } = node;\n    const child = children?.[0];\n    if (!this.#rawDims || !alt || !bbox || child?.type !== \"content\") {\n      return false;\n    }\n\n    const { id } = child;\n    if (!id) {\n      return false;\n    }\n\n    // We cannot add the created element to the text layer immediately, as the\n    // text layer might not be ready yet. Instead, we store the element and add\n    // it later in `addElementsToTextLayer`.\n\n    element.setAttribute(\"aria-owns\", id);\n    const img = document.createElement(\"span\");\n    (this.#elementsToAddToTextLayer ||= new Map()).set(id, img);\n    img.setAttribute(\"role\", \"img\");\n    img.setAttribute(\"aria-label\", removeNullCharacters(alt));\n\n    const { pageHeight, pageX, pageY } = this.#rawDims;\n    const calc = \"calc(var(--total-scale-factor) *\";\n    const { style } = img;\n    style.width = `${calc}${bbox[2] - bbox[0]}px)`;\n    style.height = `${calc}${bbox[3] - bbox[1]}px)`;\n    style.left = `${calc}${bbox[0] - pageX}px)`;\n    style.top = `${calc}${pageHeight - bbox[3] + pageY}px)`;\n\n    return true;\n  }\n\n  updateTextLayer() {\n    if (this.#elementsToAddToTextLayer) {\n      for (const [id, img] of this.#elementsToAddToTextLayer) {\n        document.getElementById(id)?.append(img);\n      }\n      this.#elementsToAddToTextLayer.clear();\n      this.#elementsToAddToTextLayer = null;\n    }\n    if (this.#elementsToHideInTextLayer) {\n      for (const id of this.#elementsToHideInTextLayer) {\n        const elem = document.getElementById(id);\n        if (elem) {\n          elem.ariaHidden = true;\n        }\n      }\n      this.#elementsToHideInTextLayer.length = 0;\n      this.#elementsToHideInTextLayer = null;\n    }\n    if (this.#elementsToStealFromTextLayer) {\n      for (\n        let i = 0, ii = this.#elementsToStealFromTextLayer.length;\n        i < ii;\n        i += 2\n      ) {\n        const element = this.#elementsToStealFromTextLayer[i];\n        const ids = this.#elementsToStealFromTextLayer[i + 1];\n        let textContent = \"\";\n        for (const id of ids) {\n          const elem = document.getElementById(id);\n          if (elem) {\n            textContent += elem.textContent.trim() || \"\";\n            // Aria-hide the element in order to avoid duplicate reading of the\n            // math content by screen readers.\n            elem.ariaHidden = \"true\";\n          }\n        }\n        if (textContent) {\n          element.textContent = textContent;\n        }\n      }\n      this.#elementsToStealFromTextLayer.length = 0;\n      this.#elementsToStealFromTextLayer = null;\n    }\n  }\n\n  #collectIds(node, ids) {\n    if (!node) {\n      return;\n    }\n    if (\"id\" in node) {\n      ids.push(node.id);\n    }\n    for (const kid of node.children || []) {\n      this.#collectIds(kid, ids);\n    }\n  }\n\n  #walk(node, parentNodes = []) {\n    if (!node) {\n      return null;\n    }\n\n    let element;\n    let visitChildren = true;\n    if (\"role\" in node) {\n      const { role } = node;\n      if (MathMLElements.has(role)) {\n        element = document.createElementNS(MathMLNamespace, role);\n        const ids = [];\n        (this.#elementsToStealFromTextLayer ||= []).push(element, ids);\n        for (const { type, id } of node.children || []) {\n          if (type === \"content\" && id) {\n            ids.push(id);\n          }\n        }\n      } else {\n        element = document.createElement(\"span\");\n      }\n      const match = role.match(HEADING_PATTERN);\n      if (match) {\n        element.setAttribute(\"role\", \"heading\");\n        element.setAttribute(\"aria-level\", match[1]);\n      } else if (PDF_ROLE_TO_HTML_ROLE[role]) {\n        element.setAttribute(\n          \"role\",\n          role === \"TH\" &&\n            parentNodes.at(-1)?.role === \"TR\" &&\n            parentNodes.at(-2)?.role === \"TBody\"\n            ? \"rowheader\" // TH inside TR itself in TBody is a rowheader.\n            : PDF_ROLE_TO_HTML_ROLE[role]\n        );\n      }\n      if (role === \"Figure\" && this.#addImageInTextLayer(node, element)) {\n        return element;\n      }\n      if (role === \"Formula\") {\n        if (node.mathML && MathMLSanitizer.sanitizer) {\n          visitChildren = false;\n          element.setHTML(node.mathML, {\n            sanitizer: MathMLSanitizer.sanitizer,\n          });\n          // Hide all the corresponding content elements in the text layer in\n          // order to avoid screen readers reading both the MathML and the\n          // text content.\n          this.#collectIds(node, (this.#elementsToHideInTextLayer ||= []));\n          // For now, we don't want to keep the alt text if there's valid\n          // MathML (see https://github.com/w3c/mathml-aam/issues/37).\n          // TODO: Revisit this decision in the future.\n          delete node.alt;\n        }\n        if (\n          !node.mathML &&\n          node.children.length === 1 &&\n          node.children[0].role !== \"math\"\n        ) {\n          element = document.createElementNS(MathMLNamespace, \"math\");\n          delete node.alt;\n        }\n      }\n    }\n\n    element ||= document.createElement(\"span\");\n\n    this.#setAttributes(node, element);\n\n    if (node.children) {\n      if (node.children.length === 1 && \"id\" in node.children[0]) {\n        // Often there is only one content node so just set the values on the\n        // parent node to avoid creating an extra span.\n        this.#setAttributes(node.children[0], element);\n      } else if (visitChildren) {\n        parentNodes.push(node);\n        for (const kid of node.children) {\n          element.append(this.#walk(kid, parentNodes));\n        }\n        parentNodes.pop();\n      }\n    }\n    return element;\n  }\n}\n\nexport { StructTreeLayerBuilder };\n","/* Copyright 2022 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { binarySearchFirstItem } from \"./ui_utils.js\";\n\n/**\n * This class aims to provide some methods:\n *  - to reorder elements in the DOM with respect to the visual order;\n *  - to create a link, using aria-owns, between spans in the textLayer and\n *    annotations in the annotationLayer. The goal is to help to know\n *    where the annotations are in the text flow.\n */\nclass TextAccessibilityManager {\n  #enabled = false;\n\n  #textChildren = null;\n\n  #textNodes = new Map();\n\n  #waitingElements = new Map();\n\n  setTextMapping(textDivs) {\n    this.#textChildren = textDivs;\n  }\n\n  /**\n   * Compare the positions of two elements, it must correspond to\n   * the visual ordering.\n   *\n   * @param {HTMLElement} e1\n   * @param {HTMLElement} e2\n   * @returns {number}\n   */\n  static #compareElementPositions(e1, e2) {\n    const rect1 = e1.getBoundingClientRect();\n    const rect2 = e2.getBoundingClientRect();\n\n    if (rect1.width === 0 && rect1.height === 0) {\n      return +1;\n    }\n\n    if (rect2.width === 0 && rect2.height === 0) {\n      return -1;\n    }\n\n    const top1 = rect1.y;\n    const bot1 = rect1.y + rect1.height;\n    const mid1 = rect1.y + rect1.height / 2;\n\n    const top2 = rect2.y;\n    const bot2 = rect2.y + rect2.height;\n    const mid2 = rect2.y + rect2.height / 2;\n\n    if (mid1 <= top2 && mid2 >= bot1) {\n      return -1;\n    }\n\n    if (mid2 <= top1 && mid1 >= bot2) {\n      return +1;\n    }\n\n    const centerX1 = rect1.x + rect1.width / 2;\n    const centerX2 = rect2.x + rect2.width / 2;\n\n    return centerX1 - centerX2;\n  }\n\n  /**\n   * Function called when the text layer has finished rendering.\n   */\n  enable() {\n    if (this.#enabled) {\n      throw new Error(\"TextAccessibilityManager is already enabled.\");\n    }\n    if (!this.#textChildren) {\n      throw new Error(\"Text divs and strings have not been set.\");\n    }\n\n    this.#enabled = true;\n    this.#textChildren = this.#textChildren.slice();\n    this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions);\n\n    if (this.#textNodes.size > 0) {\n      // Some links have been made before this manager has been disabled, hence\n      // we restore them.\n      const textChildren = this.#textChildren;\n      for (const [id, nodeIndex] of this.#textNodes) {\n        const element = document.getElementById(id);\n        if (!element) {\n          // If the page was *fully* reset the element no longer exists, and it\n          // will be re-inserted later (i.e. when the annotationLayer renders).\n          this.#textNodes.delete(id);\n          continue;\n        }\n        this.#addIdToAriaOwns(id, textChildren[nodeIndex]);\n      }\n    }\n\n    for (const [element, isRemovable] of this.#waitingElements) {\n      this.addPointerInTextLayer(element, isRemovable);\n    }\n    this.#waitingElements.clear();\n  }\n\n  disable() {\n    if (!this.#enabled) {\n      return;\n    }\n\n    // Don't clear this.#textNodes which is used to rebuild the aria-owns\n    // in case it's re-enabled at some point.\n\n    this.#waitingElements.clear();\n    this.#textChildren = null;\n    this.#enabled = false;\n  }\n\n  /**\n   * Remove an aria-owns id from a node in the text layer.\n   * @param {HTMLElement} element\n   */\n  removePointerInTextLayer(element) {\n    if (!this.#enabled) {\n      this.#waitingElements.delete(element);\n      return;\n    }\n\n    const children = this.#textChildren;\n    if (!children?.length) {\n      return;\n    }\n\n    const { id } = element;\n    const nodeIndex = this.#textNodes.get(id);\n    if (nodeIndex === undefined) {\n      return;\n    }\n\n    const node = children[nodeIndex];\n\n    this.#textNodes.delete(id);\n    let owns = node.getAttribute(\"aria-owns\");\n    if (owns?.includes(id)) {\n      owns = owns\n        .split(\" \")\n        .filter(x => x !== id)\n        .join(\" \");\n      if (owns) {\n        node.setAttribute(\"aria-owns\", owns);\n      } else {\n        node.removeAttribute(\"aria-owns\");\n        node.setAttribute(\"role\", \"presentation\");\n      }\n    }\n  }\n\n  #addIdToAriaOwns(id, node) {\n    const owns = node.getAttribute(\"aria-owns\");\n    if (!owns?.includes(id)) {\n      node.setAttribute(\"aria-owns\", owns ? `${owns} ${id}` : id);\n    }\n    node.removeAttribute(\"role\");\n  }\n\n  /**\n   * Find the text node which is the nearest and add an aria-owns attribute\n   * in order to correctly position this editor in the text flow.\n   * @param {HTMLElement} element\n   * @param {boolean} isRemovable\n   * @returns {string|null} The id in the struct tree if any.\n   */\n  addPointerInTextLayer(element, isRemovable) {\n    const { id } = element;\n    if (!id) {\n      return null;\n    }\n\n    if (!this.#enabled) {\n      // The text layer needs to be there, so we postpone the association.\n      this.#waitingElements.set(element, isRemovable);\n      return null;\n    }\n\n    if (isRemovable) {\n      this.removePointerInTextLayer(element);\n    }\n\n    const children = this.#textChildren;\n    if (!children?.length) {\n      return null;\n    }\n\n    const index = binarySearchFirstItem(\n      children,\n      node =>\n        TextAccessibilityManager.#compareElementPositions(element, node) < 0\n    );\n\n    const nodeIndex = Math.max(0, index - 1);\n    const child = children[nodeIndex];\n    this.#addIdToAriaOwns(id, child);\n    this.#textNodes.set(id, nodeIndex);\n\n    const parent = child.parentNode;\n    return parent?.classList.contains(\"markedContent\") ? parent.id : null;\n  }\n\n  /**\n   * Move a div in the DOM in order to respect the visual order.\n   * @param {HTMLDivElement} element\n   * @returns {string|null} The id in the struct tree if any.\n   */\n  moveElementInDOM(container, element, contentElement, isRemovable) {\n    const id = this.addPointerInTextLayer(contentElement, isRemovable);\n\n    if (!container.hasChildNodes()) {\n      container.append(element);\n      return id;\n    }\n\n    const children = Array.from(container.childNodes).filter(\n      node => node !== element\n    );\n\n    if (children.length === 0) {\n      return id;\n    }\n\n    const index = binarySearchFirstItem(\n      children,\n      node =>\n        TextAccessibilityManager.#compareElementPositions(element, node) < 0\n    );\n\n    if (index === 0) {\n      children[0].before(element);\n    } else {\n      children[index - 1].after(element);\n    }\n\n    return id;\n  }\n}\n\nexport { TextAccessibilityManager };\n","/* Copyright 2021 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { internalOpt } from \"./internal_evt.js\";\n\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_find_controller\").PDFFindController} PDFFindController */\n\n/**\n * @typedef {Object} TextHighlighterOptions\n * @property {PDFFindController} findController\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} pageIndex - The page index.\n */\n\n/**\n * TextHighlighter handles highlighting matches from the FindController in\n * either the text layer or XFA layer depending on the type of document.\n */\nclass TextHighlighter {\n  #eventAC = null;\n\n  /**\n   * @param {TextHighlighterOptions} options\n   */\n  constructor({ findController, eventBus, pageIndex }) {\n    this.findController = findController;\n    this.matches = [];\n    this.eventBus = eventBus;\n    this.pageIdx = pageIndex;\n    this.textDivs = null;\n    this.textContentItemsStr = null;\n    this.enabled = false;\n  }\n\n  /**\n   * Store two arrays that will map DOM nodes to text they should contain.\n   * The arrays should be of equal length and the array element at each index\n   * should correspond to the other. e.g.\n   * `items[0] = \"<span>Item 0</span>\" and texts[0] = \"Item 0\";\n   *\n   * @param {Array<Node>} divs\n   * @param {Array<string>} texts\n   */\n  setTextMapping(divs, texts) {\n    this.textDivs = divs;\n    this.textContentItemsStr = texts;\n  }\n\n  /**\n   * Start listening for events to update the highlighter and check if there are\n   * any current matches that need be highlighted.\n   */\n  enable() {\n    if (!this.textDivs || !this.textContentItemsStr) {\n      throw new Error(\"Text divs and strings have not been set.\");\n    }\n    if (this.enabled) {\n      throw new Error(\"TextHighlighter is already enabled.\");\n    }\n    this.enabled = true;\n\n    if (!this.#eventAC) {\n      this.#eventAC = new AbortController();\n\n      this.eventBus.on(\n        \"updatetextlayermatches\",\n        evt => {\n          if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) {\n            this._updateMatches();\n          }\n        },\n        { signal: this.#eventAC.signal, ...internalOpt }\n      );\n    }\n    this._updateMatches();\n  }\n\n  disable() {\n    if (!this.enabled) {\n      return;\n    }\n    this.enabled = false;\n\n    this.#eventAC?.abort();\n    this.#eventAC = null;\n\n    this._updateMatches(/* reset = */ true);\n  }\n\n  _convertMatches(matches, matchesLength) {\n    // Early exit if there is nothing to convert.\n    if (!matches) {\n      return [];\n    }\n    const { textContentItemsStr } = this;\n\n    let i = 0,\n      iIndex = 0;\n    const end = textContentItemsStr.length - 1;\n    const result = [];\n\n    for (let m = 0, mm = matches.length; m < mm; m++) {\n      // Calculate the start position.\n      let matchIdx = matches[m];\n\n      // Loop over the divIdxs.\n      while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      if (i === textContentItemsStr.length) {\n        console.error(\"Could not find a matching mapping\");\n      }\n\n      const match = {\n        begin: {\n          divIdx: i,\n          offset: matchIdx - iIndex,\n        },\n      };\n\n      // Calculate the end position.\n      matchIdx += matchesLength[m];\n\n      // Somewhat the same array as above, but use > instead of >= to get\n      // the end position right.\n      while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      match.end = {\n        divIdx: i,\n        offset: matchIdx - iIndex,\n      };\n      result.push(match);\n    }\n    return result;\n  }\n\n  _renderMatches(matches) {\n    // Early exit if there is nothing to render.\n    if (matches.length === 0) {\n      return;\n    }\n    const { findController, pageIdx } = this;\n    const { textContentItemsStr, textDivs } = this;\n\n    const isSelectedPage = pageIdx === findController.selected.pageIdx;\n    const selectedMatchIdx = findController.selected.matchIdx;\n    const highlightAll = findController.state.highlightAll;\n    let prevEnd = null;\n    const infinity = {\n      divIdx: -1,\n      offset: undefined,\n    };\n\n    function beginText(begin, className) {\n      const divIdx = begin.divIdx;\n      textDivs[divIdx].textContent = \"\";\n      return appendTextToDiv(divIdx, 0, begin.offset, className);\n    }\n\n    function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n      let div = textDivs[divIdx];\n      if (div.nodeType === Node.TEXT_NODE) {\n        const span = document.createElement(\"span\");\n        div.before(span);\n        span.append(div);\n        textDivs[divIdx] = span;\n        div = span;\n      }\n      const content = textContentItemsStr[divIdx].substring(\n        fromOffset,\n        toOffset\n      );\n      const node = document.createTextNode(content);\n      if (className) {\n        const span = document.createElement(\"span\");\n        span.className = `${className} appended`;\n        span.append(node);\n        div.append(span);\n\n        if (className.includes(\"selected\")) {\n          return span;\n        }\n        return null;\n      }\n\n      div.append(node);\n      return 0;\n    }\n\n    let i0 = selectedMatchIdx,\n      i1 = i0 + 1;\n    if (highlightAll) {\n      i0 = 0;\n      i1 = matches.length;\n    } else if (!isSelectedPage) {\n      // Not highlighting all and this isn't the selected page, so do nothing.\n      return;\n    }\n\n    let lastDivIdx = -1;\n    let lastOffset = -1;\n    for (let i = i0; i < i1; i++) {\n      const match = matches[i];\n      const begin = match.begin;\n      if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) {\n        // It's possible to be in this situation if we searched for a 'f' and we\n        // have a ligature 'ff' in the text. The 'ff' has to be highlighted two\n        // times.\n        continue;\n      }\n      lastDivIdx = begin.divIdx;\n      lastOffset = begin.offset;\n\n      const end = match.end;\n      const isSelected = isSelectedPage && i === selectedMatchIdx;\n      const highlightSuffix = isSelected ? \" selected\" : \"\";\n      let selectedSpan = null;\n\n      // Match inside new div.\n      if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n        // If there was a previous div, then add the text at the end.\n        if (prevEnd !== null) {\n          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n        }\n        // Clear the divs and set the content until the starting point.\n        beginText(begin);\n      } else {\n        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n      }\n\n      if (begin.divIdx === end.divIdx) {\n        selectedSpan = appendTextToDiv(\n          begin.divIdx,\n          begin.offset,\n          end.offset,\n          \"highlight\" + highlightSuffix\n        );\n      } else {\n        selectedSpan = appendTextToDiv(\n          begin.divIdx,\n          begin.offset,\n          infinity.offset,\n          \"highlight begin\" + highlightSuffix\n        );\n        for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n          textDivs[n0].className = \"highlight middle\" + highlightSuffix;\n        }\n        beginText(end, \"highlight end\" + highlightSuffix);\n      }\n      prevEnd = end;\n\n      if (isSelected) {\n        // Attempt to scroll the selected match into view.\n        findController.scrollMatchIntoView({\n          element: selectedSpan,\n          pageIndex: pageIdx,\n          matchIndex: selectedMatchIdx,\n        });\n      }\n    }\n\n    if (prevEnd) {\n      appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n    }\n  }\n\n  _updateMatches(reset = false) {\n    if (!this.enabled && !reset) {\n      return;\n    }\n    const { findController, matches, pageIdx } = this;\n    const { textContentItemsStr, textDivs } = this;\n    let clearedUntilDivIdx = -1;\n\n    // Clear all current matches.\n    for (const match of matches) {\n      const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n      for (let n = begin, end = match.end.divIdx; n <= end; n++) {\n        const div = textDivs[n];\n        div.textContent = textContentItemsStr[n];\n        div.className = \"\";\n      }\n      clearedUntilDivIdx = match.end.divIdx + 1;\n    }\n\n    if (!findController?.highlightMatches || reset) {\n      return;\n    }\n    // Convert the matches on the `findController` into the match format\n    // used for the textLayer.\n    const pageMatches = findController.pageMatches[pageIdx] || null;\n    const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;\n\n    this.matches = this._convertMatches(pageMatches, pageMatchesLength);\n    this._renderMatches(this.matches);\n  }\n}\n\nexport { TextHighlighter };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/page_viewport\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/text_layer_images.js\").TextLayerImages} TextLayerImages */\n/** @typedef {import(\"./text_highlighter\").TextHighlighter} TextHighlighter */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./text_accessibility.js\").TextAccessibilityManager} TextAccessibilityManager */\n\nimport { normalizeUnicode, stopEvent, TextLayer } from \"pdfjs-lib\";\nimport { removeNullCharacters } from \"./ui_utils.js\";\n\n/**\n * @typedef {Object} TextLayerBuilderOptions\n * @property {PDFPageProxy} pdfPage\n * @property {TextHighlighter} [highlighter] - Optional object that will handle\n *   highlighting text from the find controller.\n * @property {TextAccessibilityManager} [accessibilityManager]\n * @property {boolean} [enablePermissions]\n * @property {function} [onAppend]\n * @property {AbortSignal} [abortSignal]\n */\n\n/**\n * @typedef {Object} TextLayerBuilderRenderOptions\n * @property {PageViewport} viewport\n * @property {TextLayerImages} images\n * @property {Object} [textContentParams]\n */\n\n/**\n * The text layer builder provides text selection functionality for the PDF.\n * It does this by creating overlay divs over the PDF's text. These divs\n * contain text that matches the PDF text they are overlaying.\n */\nclass TextLayerBuilder {\n  #abortSignal = null;\n\n  #enablePermissions = false;\n\n  #onAppend = null;\n\n  #renderingDone = false;\n\n  #textLayer = null;\n\n  static #textLayers = new Map();\n\n  static #selectionChangeAC = null;\n\n  /**\n   * @param {TextLayerBuilderOptions} options\n   */\n  constructor({\n    pdfPage,\n    highlighter = null,\n    accessibilityManager = null,\n    enablePermissions = false,\n    onAppend = null,\n    abortSignal = null,\n  }) {\n    this.pdfPage = pdfPage;\n    this.highlighter = highlighter;\n    this.accessibilityManager = accessibilityManager;\n    this.#enablePermissions = enablePermissions === true;\n    this.#onAppend = onAppend;\n    this.#abortSignal = abortSignal;\n\n    this.div = document.createElement(\"div\");\n    this.div.tabIndex = 0;\n    this.div.className = \"textLayer\";\n  }\n\n  /**\n   * Renders the text layer.\n   * @param {TextLayerBuilderRenderOptions} options\n   * @returns {Promise<void>}\n   */\n  async render({ viewport, images, textContentParams = null }) {\n    if (this.#renderingDone && this.#textLayer) {\n      this.#textLayer.update({\n        viewport,\n        onBefore: this.hide.bind(this),\n      });\n      this.show();\n      return;\n    }\n\n    this.cancel();\n    this.#textLayer = new TextLayer({\n      textContentSource: this.pdfPage.streamTextContent(\n        textContentParams || {\n          includeMarkedContent: true,\n          disableNormalization: true,\n        }\n      ),\n      images,\n      container: this.div,\n      viewport,\n    });\n\n    const { textDivs, textContentItemsStr } = this.#textLayer;\n    this.highlighter?.setTextMapping(textDivs, textContentItemsStr);\n    this.accessibilityManager?.setTextMapping(textDivs);\n\n    await this.#textLayer.render();\n    this.#renderingDone = true;\n\n    const endOfContent = document.createElement(\"div\");\n    endOfContent.className = \"endOfContent\";\n    this.div.append(endOfContent);\n\n    this.#bindMouse(endOfContent);\n    // Ensure that the textLayer is appended to the DOM *before* handling\n    // e.g. a pending search operation.\n    this.#onAppend?.(this.div);\n    this.highlighter?.enable();\n    this.accessibilityManager?.enable();\n  }\n\n  hide() {\n    if (!this.div.hidden && this.#renderingDone) {\n      // We turn off the highlighter in order to avoid to scroll into view an\n      // element of the text layer which could be hidden.\n      this.highlighter?.disable();\n      this.div.hidden = true;\n    }\n  }\n\n  show() {\n    if (this.div.hidden && this.#renderingDone) {\n      this.div.hidden = false;\n      this.highlighter?.enable();\n    }\n  }\n\n  /**\n   * Cancel rendering of the text layer.\n   */\n  cancel() {\n    this.#textLayer?.cancel();\n    this.#textLayer = null;\n    this.#renderingDone = false;\n    this.div.replaceChildren();\n\n    this.highlighter?.disable();\n    this.accessibilityManager?.disable();\n    TextLayerBuilder.#removeGlobalSelectionListener(this.div);\n  }\n\n  /**\n   * Improves text selection by adding an additional div where the mouse was\n   * clicked. This reduces flickering of the content if the mouse is slowly\n   * dragged up or down.\n   */\n  #bindMouse(end) {\n    const { div } = this;\n    const abortSignal = this.#abortSignal;\n    const opts = abortSignal ? { signal: abortSignal } : null;\n\n    div.addEventListener(\n      \"mousedown\",\n      () => {\n        div.classList.add(\"selecting\");\n      },\n      opts\n    );\n\n    div.addEventListener(\n      \"copy\",\n      event => {\n        if (!this.#enablePermissions) {\n          const selection = document.getSelection();\n          event.clipboardData.setData(\n            \"text/plain\",\n            removeNullCharacters(normalizeUnicode(selection.toString()))\n          );\n        }\n        stopEvent(event);\n      },\n      opts\n    );\n\n    TextLayerBuilder.#textLayers.set(div, end);\n    TextLayerBuilder.#enableGlobalSelectionListener(abortSignal);\n  }\n\n  static #removeGlobalSelectionListener(textLayerDiv) {\n    this.#textLayers.delete(textLayerDiv);\n\n    if (this.#textLayers.size === 0) {\n      this.#selectionChangeAC?.abort();\n      this.#selectionChangeAC = null;\n    }\n  }\n\n  static #enableGlobalSelectionListener(globalAbortSignal) {\n    if (this.#selectionChangeAC) {\n      // document-level event listeners already installed\n      return;\n    }\n    this.#selectionChangeAC = new AbortController();\n    const signal = globalAbortSignal\n      ? AbortSignal.any([this.#selectionChangeAC.signal, globalAbortSignal])\n      : this.#selectionChangeAC.signal;\n\n    const reset = (end, textLayer) => {\n      if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n        textLayer.append(end);\n        end.style.width = \"\";\n        end.style.height = \"\";\n      }\n      textLayer.classList.remove(\"selecting\");\n    };\n\n    let isPointerDown = false;\n    document.addEventListener(\n      \"pointerdown\",\n      () => {\n        isPointerDown = true;\n      },\n      { signal }\n    );\n    document.addEventListener(\n      \"pointerup\",\n      () => {\n        isPointerDown = false;\n        this.#textLayers.forEach(reset);\n      },\n      { signal }\n    );\n    window.addEventListener(\n      \"blur\",\n      () => {\n        isPointerDown = false;\n        this.#textLayers.forEach(reset);\n      },\n      { signal }\n    );\n    document.addEventListener(\n      \"keyup\",\n      () => {\n        if (!isPointerDown) {\n          this.#textLayers.forEach(reset);\n        }\n      },\n      { signal }\n    );\n\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      // eslint-disable-next-line no-var\n      var isFirefox, prevRange;\n    }\n\n    document.addEventListener(\n      \"selectionchange\",\n      () => {\n        const selection = document.getSelection();\n        if (selection.rangeCount === 0) {\n          this.#textLayers.forEach(reset);\n          return;\n        }\n\n        // Even though the spec says that .rangeCount should be 0 or 1, Firefox\n        // creates multiple ranges when selecting across multiple pages.\n        // Make sure to collect all the .textLayer elements where the selection\n        // is happening.\n        const activeTextLayers = new Set();\n        for (let i = 0; i < selection.rangeCount; i++) {\n          const range = selection.getRangeAt(i);\n          for (const textLayerDiv of this.#textLayers.keys()) {\n            if (\n              !activeTextLayers.has(textLayerDiv) &&\n              range.intersectsNode(textLayerDiv)\n            ) {\n              activeTextLayers.add(textLayerDiv);\n            }\n          }\n        }\n\n        for (const [textLayerDiv, endDiv] of this.#textLayers) {\n          if (activeTextLayers.has(textLayerDiv)) {\n            textLayerDiv.classList.add(\"selecting\");\n          } else {\n            reset(endDiv, textLayerDiv);\n          }\n        }\n\n        if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n          return;\n        }\n        if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\")) {\n          isFirefox ??=\n            getComputedStyle(\n              this.#textLayers.values().next().value\n            ).getPropertyValue(\"-moz-user-select\") === \"none\";\n\n          if (isFirefox) {\n            return;\n          }\n        }\n        // In non-Firefox browsers, when hovering over an empty space (thus,\n        // on .endOfContent), the selection will expand to cover all the\n        // text between the current selection and .endOfContent. By moving\n        // .endOfContent to right after (or before, depending on which side\n        // of the selection the user is moving), we limit the selection jump\n        // to at most cover the enteirety of the <span> where the selection\n        // is being modified.\n        const range = selection.getRangeAt(0);\n        const modifyStart =\n          prevRange &&\n          (range.compareBoundaryPoints(Range.END_TO_END, prevRange) === 0 ||\n            range.compareBoundaryPoints(Range.START_TO_END, prevRange) === 0);\n        let anchor = modifyStart ? range.startContainer : range.endContainer;\n        if (anchor.nodeType === Node.TEXT_NODE) {\n          anchor = anchor.parentNode;\n        }\n        if (anchor.classList?.contains(\"highlight\")) {\n          anchor = anchor.parentNode;\n        }\n        if (!modifyStart && range.endOffset === 0) {\n          do {\n            while (!anchor.previousSibling) {\n              anchor = anchor.parentNode;\n            }\n            anchor = anchor.previousSibling;\n          } while (!anchor.childNodes.length);\n        }\n\n        const parentTextLayer = anchor.parentElement?.closest(\".textLayer\");\n        const endDiv = this.#textLayers.get(parentTextLayer);\n        if (endDiv) {\n          endDiv.style.width = parentTextLayer.style.width;\n          endDiv.style.height = parentTextLayer.style.height;\n          endDiv.style.userSelect = \"text\";\n          anchor.parentElement.insertBefore(\n            endDiv,\n            modifyStart ? anchor : anchor.nextSibling\n          );\n        }\n\n        prevRange = range.cloneRange();\n      },\n      { signal }\n    );\n  }\n}\n\nexport { TextLayerBuilder };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/page_viewport\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/optional_content_config\").OptionalContentConfig} OptionalContentConfig */\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_rendering_queue\").PDFRenderingQueue} PDFRenderingQueue */\n/** @typedef {import(\"./comment_manager.js\").CommentManager} CommentManager */\n/** @typedef {import(\"./l10n.js\").L10n} L10n */\n\nimport {\n  AbortException,\n  AnnotationMode,\n  OutputScale,\n  PixelsPerInch,\n  setLayerDimensions,\n  shadow,\n  TextLayerImages,\n} from \"pdfjs-lib\";\nimport {\n  approximateFraction,\n  calcRound,\n  DEFAULT_SCALE,\n  floorToDivide,\n  TextLayerMode,\n} from \"./ui_utils.js\";\nimport { AnnotationEditorLayerBuilder } from \"./annotation_editor_layer_builder.js\";\nimport { AnnotationLayerBuilder } from \"./annotation_layer_builder.js\";\nimport { AppOptions } from \"./app_options.js\";\nimport { Autolinker } from \"./autolinker.js\";\nimport { BasePDFPageView } from \"./base_pdf_page_view.js\";\nimport { DrawLayerBuilder } from \"./draw_layer_builder.js\";\nimport { GenericL10n } from \"web-null_l10n\";\nimport { PDFPageDetailView } from \"./pdf_page_detail_view.js\";\nimport { RenderingStates } from \"./renderable_view.js\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\nimport { StructTreeLayerBuilder } from \"./struct_tree_layer_builder.js\";\nimport { TextAccessibilityManager } from \"./text_accessibility.js\";\nimport { TextHighlighter } from \"./text_highlighter.js\";\nimport { TextLayerBuilder } from \"./text_layer_builder.js\";\nimport { XfaLayerBuilder } from \"./xfa_layer_builder.js\";\n\n/**\n * @typedef {Object} PDFPageViewOptions\n * @property {HTMLDivElement} [container] - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} id - The page unique ID (normally its number).\n * @property {number} [scale] - The page scale display.\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -\n *   A promise that is resolved with an {@link OptionalContentConfig} instance.\n *   The default value is `null`.\n * @property {PDFRenderingQueue} [renderingQueue] - The rendering queue object.\n * @property {number} [textLayerMode] - Controls if the text layer used for\n *   selection and searching is created. The constants from {TextLayerMode}\n *   should be used. The default value is `TextLayerMode.ENABLE`.\n * @property {number} [annotationMode] - Controls if the annotation layer is\n *   created, and if interactive form elements or `AnnotationStorage`-data are\n *   being rendered. The constants from {@link AnnotationMode} should be used;\n *   see also {@link RenderParameters} and {@link GetOperatorListParameters}.\n *   The default value is `AnnotationMode.ENABLE_FORMS`.\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   for annotation icons. Include trailing slash.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n *   total pixels, i.e. width * height. Use `-1` for no limit, or `0` for\n *   CSS-only zooming. The default value is 4096 * 8192 (32 mega-pixels).\n * @property {number} [maxCanvasDim] - The maximum supported canvas dimension,\n *   in either width or height. Use `-1` for no limit.\n *   The default value is 32767.\n * @property {number} [capCanvasAreaFactor] - Cap the canvas area to the\n *   viewport increased by the value in percent. Use `-1` for no limit.\n *   The default value is 200%.\n * @property {boolean} [enableDetailCanvas] - When enabled, if the rendered\n *   pages would need a canvas that is larger than `maxCanvasPixels` or\n *   `maxCanvasDim`, it will draw a second canvas on top of the CSS-zoomed one,\n *   that only renders the part of the page that is close to the viewport.\n *   The default value is `true`.\n * @property {number} [imagesRightClickMinSize] - All images whose width and\n *  height are at least this value (in pixels) will be lazily inserted in the\n *  dom to allow right-clicking and saving them. Use `-1` to disable this.\n * @property {boolean} [enableSelectionRendering] - When enabled, renders text\n *   selections in the draw layer.\n *   The default value is `true`.\n * @property {boolean} [enableOptimizedPartialRendering] - When enabled, PDF\n *   rendering will keep track of which areas of the page each PDF operation\n *   affects. Then, when rendering a partial page (if `enableDetailCanvas` is\n *   enabled), it will only run through the operations that affect that portion.\n *   The default value is `false`.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n *   with user defined ones in order to improve readability in high contrast\n *   mode.\n * @property {L10n} [l10n] - Localization service.\n * @property {Object} [layerProperties] - The object that is used to lookup\n *   the necessary layer-properties.\n * @property {boolean} [enableAutoLinking] - Enable creation of hyperlinks from\n *   text that look like URLs. The default value is `true`.\n * @property {CommentManager} [commentManager] - The comment manager instance.\n *   to.\n * @property {AbortSignal} [abortSignal]\n */\n\nconst DEFAULT_LAYER_PROPERTIES =\n  typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"COMPONENTS\")\n    ? null\n    : {\n        annotationEditorUIManager: null,\n        annotationStorage: null,\n        downloadManager: null,\n        enableScripting: false,\n        fieldObjectsPromise: null,\n        findController: null,\n        hasJSActionsPromise: null,\n        get linkService() {\n          return new SimpleLinkService();\n        },\n      };\n\nconst LAYERS_ORDER = new Map([\n  [\"canvasWrapper\", 0],\n  [\"textLayer\", 1],\n  [\"annotationLayer\", 2],\n  [\"annotationEditorLayer\", 3],\n  [\"xfaLayer\", 3],\n]);\n\nclass PDFPageView extends BasePDFPageView {\n  #abortSignal = null;\n\n  #annotationMode = AnnotationMode.ENABLE_FORMS;\n\n  #canvasWrapper = null;\n\n  #commentManager = null;\n\n  #enableAutoLinking = true;\n\n  #hasRestrictedScaling = false;\n\n  #isEditing = false;\n\n  #layerProperties = null;\n\n  #needsRestrictedScaling = false;\n\n  #originalViewport = null;\n\n  #previousRotation = null;\n\n  #scaleRoundX = 1;\n\n  #scaleRoundY = 1;\n\n  #textLayerMode = TextLayerMode.ENABLE;\n\n  #userUnit = 1;\n\n  #useThumbnailCanvas = {\n    directDrawing: true,\n    initialOptionalContent: true,\n    regularAnnotations: true,\n  };\n\n  #layers = [null, null, null, null];\n\n  /**\n   * @param {PDFPageViewOptions} options\n   */\n  constructor(options) {\n    super(options);\n\n    const { container, defaultViewport } = options;\n\n    this.renderingId = \"page\" + this.id;\n    this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES;\n    this.#abortSignal = options.abortSignal || null;\n\n    this.pdfPage = null;\n    this.pageLabel = null;\n    this.rotation = 0;\n    this.scale = options.scale || DEFAULT_SCALE;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n    this._optionalContentConfigPromise =\n      options.optionalContentConfigPromise || null;\n    this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE;\n    this.#annotationMode =\n      options.annotationMode ?? AnnotationMode.ENABLE_FORMS;\n    this.imageResourcesPath = options.imageResourcesPath || \"\";\n    this.enableDetailCanvas = options.enableDetailCanvas ?? true;\n    this.maxCanvasPixels =\n      options.maxCanvasPixels ?? AppOptions.get(\"maxCanvasPixels\");\n    this.maxCanvasDim = options.maxCanvasDim || AppOptions.get(\"maxCanvasDim\");\n    this.capCanvasAreaFactor =\n      options.capCanvasAreaFactor ?? AppOptions.get(\"capCanvasAreaFactor\");\n    this.#enableAutoLinking = options.enableAutoLinking !== false;\n    this.#commentManager = options.commentManager || null;\n\n    this.l10n = options.l10n;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this.l10n ||= new GenericL10n();\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this._isStandalone = !this.renderingQueue?.hasViewer();\n      this._container = container;\n    }\n\n    this._annotationCanvasMap = null;\n\n    this.annotationLayer = null;\n    this.annotationEditorLayer = null;\n    this.textLayer = null;\n    this.xfaLayer = null;\n    this.structTreeLayer = null;\n    this.drawLayer = null;\n\n    this.detailView = null;\n\n    const div = document.createElement(\"div\");\n    div.className = \"page\";\n    div.setAttribute(\"data-page-number\", this.id);\n    div.setAttribute(\"role\", \"region\");\n    div.setAttribute(\"data-l10n-id\", \"pdfjs-page-landmark\");\n    div.setAttribute(\"data-l10n-args\", JSON.stringify({ page: this.id }));\n    this.div = div;\n    this.#setDimensions();\n    container?.append(div);\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this._isStandalone\n    ) {\n      // Ensure that the various layers always get the correct initial size,\n      // see issue 15795.\n      container?.style.setProperty(\n        \"--scale-factor\",\n        this.scale * PixelsPerInch.PDF_TO_CSS_UNITS\n      );\n\n      if (this.pageColors?.background) {\n        container?.style.setProperty(\n          \"--page-bg-color\",\n          this.pageColors.background\n        );\n      }\n\n      const { optionalContentConfigPromise } = options;\n      if (optionalContentConfigPromise) {\n        // Ensure that the thumbnails always display the *initial* document\n        // state, for documents with optional content.\n        optionalContentConfigPromise.then(optionalContentConfig => {\n          if (\n            optionalContentConfigPromise !== this._optionalContentConfigPromise\n          ) {\n            return;\n          }\n          this.#useThumbnailCanvas.initialOptionalContent =\n            optionalContentConfig.hasInitialVisibility;\n        });\n      }\n\n      // Ensure that Fluent is connected in e.g. the COMPONENTS build.\n      if (!options.l10n) {\n        this.l10n.translate(this.div);\n      }\n    }\n  }\n\n  clone(id) {\n    const clone = new PDFPageView({\n      container: null,\n      eventBus: this.eventBus,\n      pagesColors: this.pageColors,\n      renderingQueue: this.renderingQueue,\n      enableOptimizedPartialRendering: this.enableOptimizedPartialRendering,\n      minDurationToUpdateCanvas: this.minDurationToUpdateCanvas,\n      defaultViewport: this.viewport,\n      id,\n      layerProperties: this.#layerProperties,\n      abortSignal: this.#abortSignal,\n      scale: this.scale,\n      optionalContentConfigPromise: this._optionalContentConfigPromise,\n      textLayerMode: this.#textLayerMode,\n      annotationMode: this.#annotationMode,\n      imageResourcesPath: this.imageResourcesPath,\n      enableDetailCanvas: this.enableDetailCanvas,\n      maxCanvasPixels: this.maxCanvasPixels,\n      maxCanvasDim: this.maxCanvasDim,\n      capCanvasAreaFactor: this.capCanvasAreaFactor,\n      enableAutoLinking: this.#enableAutoLinking,\n      commentManager: this.#commentManager,\n      l10n: this.l10n,\n    });\n    clone.setPdfPage(this.pdfPage.clone(id - 1));\n    return clone;\n  }\n\n  #addLayer(div, name) {\n    const pos = LAYERS_ORDER.get(name);\n    const oldDiv = this.#layers[pos];\n    this.#layers[pos] = div;\n    if (oldDiv) {\n      oldDiv.replaceWith(div);\n      return;\n    }\n    for (let i = pos - 1; i >= 0; i--) {\n      const layer = this.#layers[i];\n      if (layer) {\n        layer.after(div);\n        return;\n      }\n    }\n    this.div.prepend(div);\n  }\n\n  #setDimensions() {\n    const { div, viewport } = this;\n\n    if (viewport.userUnit !== this.#userUnit) {\n      if (viewport.userUnit !== 1) {\n        div.style.setProperty(\"--user-unit\", viewport.userUnit);\n      } else {\n        div.style.removeProperty(\"--user-unit\");\n      }\n      this.#userUnit = viewport.userUnit;\n    }\n    if (this.pdfPage) {\n      if (this.#previousRotation === viewport.rotation) {\n        return;\n      }\n      this.#previousRotation = viewport.rotation;\n    }\n\n    setLayerDimensions(\n      div,\n      viewport,\n      /* mustFlip = */ true,\n      /* mustRotate = */ false\n    );\n  }\n\n  updatePageNumber(newPageNumber) {\n    const oldPageNumber = this.id;\n\n    if (oldPageNumber !== newPageNumber) {\n      this.id = newPageNumber;\n      this.renderingId = `page${newPageNumber}`;\n      if (this.pdfPage) {\n        this.pdfPage.pageNumber = newPageNumber;\n      }\n      // TODO: do we set the page label ?\n      this.setPageLabel(this.pageLabel);\n      const { div } = this;\n      div.setAttribute(\"data-page-number\", newPageNumber);\n      div.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({ page: newPageNumber })\n      );\n      this._textHighlighter.pageIdx = newPageNumber - 1;\n    }\n    // Don't update the page index for the draw layer, since it's just used as\n    // an identifier.\n\n    // Page mutations clear the editor layer map; restore unchanged pages too.\n    this.#layerProperties.annotationEditorUIManager?.updatePageIndex(\n      oldPageNumber - 1,\n      newPageNumber - 1\n    );\n  }\n\n  setPdfPage(pdfPage) {\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this._isStandalone &&\n      (this.pageColors?.foreground === \"CanvasText\" ||\n        this.pageColors?.background === \"Canvas\")\n    ) {\n      this._container?.style.setProperty(\n        \"--hcm-highlight-filter\",\n        pdfPage.filterFactory.addHighlightHCMFilter(\n          \"highlight\",\n          \"CanvasText\",\n          \"Canvas\",\n          \"HighlightText\",\n          \"Highlight\"\n        )\n      );\n      this._container?.style.setProperty(\n        \"--hcm-highlight-selected-filter\",\n        pdfPage.filterFactory.addHighlightHCMFilter(\n          \"highlight_selected\",\n          \"CanvasText\",\n          \"Canvas\",\n          \"HighlightText\",\n          \"Highlight\"\n        )\n      );\n    }\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport({\n      scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS,\n      rotation: totalRotation,\n    });\n    this.#setDimensions();\n    this.reset();\n  }\n\n  destroy() {\n    this.reset();\n    this.pdfPage?.cleanup();\n  }\n\n  deleteMe(isCut) {\n    if (isCut) {\n      this.div.remove();\n      return;\n    }\n    this.destroy();\n    this.#layerProperties.annotationEditorUIManager?.deletePage(this.id);\n  }\n\n  hasEditableAnnotations() {\n    return !!this.annotationLayer?.hasEditableAnnotations();\n  }\n\n  get _textHighlighter() {\n    return shadow(\n      this,\n      \"_textHighlighter\",\n      new TextHighlighter({\n        pageIndex: this.id - 1,\n        eventBus: this.eventBus,\n        findController: this.#layerProperties.findController,\n      })\n    );\n  }\n\n  #dispatchLayerRendered(name, error) {\n    this.eventBus.dispatch(name, {\n      source: this,\n      pageNumber: this.id,\n      error,\n    });\n  }\n\n  async #renderAnnotationLayer(textLayerPromise = null) {\n    const { annotationLayer, textLayer } = this;\n\n    let error = null;\n    try {\n      await this.annotationLayer.render({\n        viewport: this.viewport,\n        intent: \"display\",\n        structTreeLayer: this.structTreeLayer,\n        optionalContentConfigPromise: this._optionalContentConfigPromise,\n      });\n    } catch (ex) {\n      console.error(\"#renderAnnotationLayer:\", ex);\n      error = ex;\n    } finally {\n      this.#dispatchLayerRendered(\"annotationlayerrendered\", error);\n    }\n\n    if (this.#enableAutoLinking && textLayerPromise) {\n      this.#injectLinkAnnotations(textLayerPromise, annotationLayer, textLayer);\n    }\n  }\n\n  // The detail view re-renders checkbox/radio appearances at a higher\n  // resolution into the shared `annotationCanvasMap`; move them into the\n  // annotation layer so they replace the lower-resolution ones. This only\n  // consumes pending canvases (no re-render), and is a no-op until their\n  // elements exist, so it's safe to call while the layer is still rendering.\n  _refreshAnnotationLayer() {\n    if (this._annotationCanvasMap?.size) {\n      this.annotationLayer?.refreshCanvases();\n    }\n  }\n\n  async #renderAnnotationEditorLayer() {\n    let error = null;\n    try {\n      await this.annotationEditorLayer.render({\n        viewport: this.viewport,\n        intent: \"display\",\n      });\n    } catch (ex) {\n      console.error(\"#renderAnnotationEditorLayer:\", ex);\n      error = ex;\n    } finally {\n      this.#dispatchLayerRendered(\"annotationeditorlayerrendered\", error);\n    }\n  }\n\n  async #renderDrawLayer() {\n    try {\n      await this.drawLayer.render({\n        intent: \"display\",\n      });\n    } catch (ex) {\n      console.error(\"#renderDrawLayer:\", ex);\n    }\n  }\n\n  async #renderXfaLayer() {\n    let error = null;\n    try {\n      const result = await this.xfaLayer.render({\n        viewport: this.viewport,\n        intent: \"display\",\n      });\n      if (result?.textDivs && this._textHighlighter) {\n        // Given that the following method fetches the text asynchronously we\n        // can invoke it *before* appending the xfaLayer to the DOM (below),\n        // since a pending search-highlight/scroll operation thus won't run\n        // until after the xfaLayer is available in the viewer.\n        this.#buildXfaTextContentItems(result.textDivs);\n      }\n    } catch (ex) {\n      console.error(\"#renderXfaLayer:\", ex);\n      error = ex;\n    } finally {\n      if (this.xfaLayer?.div) {\n        // Pause translation when inserting the xfaLayer in the DOM.\n        this.l10n.pause();\n        this.#addLayer(this.xfaLayer.div, \"xfaLayer\");\n        this.l10n.resume();\n      }\n      this.#dispatchLayerRendered(\"xfalayerrendered\", error);\n    }\n  }\n\n  async #renderTextLayer() {\n    let error = null;\n    try {\n      await this.textLayer.render({\n        viewport: this.viewport,\n        images: this.imageCoordinates\n          ? new TextLayerImages(\n              this.imagesRightClickMinSize,\n              this.imageCoordinates,\n              this.viewport,\n              () => this.canvas\n            )\n          : null,\n      });\n    } catch (ex) {\n      if (ex instanceof AbortException) {\n        return;\n      }\n      console.error(\"#renderTextLayer:\", ex);\n      error = ex;\n    }\n    this.#dispatchLayerRendered(\"textlayerrendered\", error);\n\n    this.#renderStructTreeLayer();\n  }\n\n  /**\n   * The structure tree is currently only supported when the text layer is\n   * enabled and a canvas is used for rendering.\n   *\n   * The structure tree must be generated after the text layer for the\n   * aria-owns to work.\n   */\n  async #renderStructTreeLayer() {\n    const treeDom = await this.structTreeLayer?.render();\n    if (treeDom) {\n      this.l10n.pause();\n      this.structTreeLayer?.updateTextLayer();\n      if (this.canvas && treeDom.parentNode !== this.canvas) {\n        // Pause translation when inserting the structTree in the DOM.\n        this.canvas.append(treeDom);\n      }\n      this.l10n.resume();\n    }\n    this.structTreeLayer?.show();\n  }\n\n  async #buildXfaTextContentItems(textDivs) {\n    const text = await this.pdfPage.getTextContent();\n    const items = [];\n    for (const item of text.items) {\n      items.push(item.str);\n    }\n    this._textHighlighter.setTextMapping(textDivs, items);\n    this._textHighlighter.enable();\n  }\n\n  async #injectLinkAnnotations(textLayerPromise, annotationLayer, textLayer) {\n    let error = null;\n    try {\n      await textLayerPromise;\n\n      if (\n        annotationLayer !== this.annotationLayer ||\n        textLayer !== this.textLayer\n      ) {\n        return; // Rendering was cancelled while the textLayerPromise resolved.\n      }\n      await annotationLayer.injectLinkAnnotations(\n        Autolinker.processLinks(this)\n      );\n    } catch (ex) {\n      console.error(\"#injectLinkAnnotations:\", ex);\n      error = ex;\n    }\n    this.#dispatchLayerRendered(\"linkannotationsadded\", error);\n  }\n\n  _resetCanvas() {\n    super._resetCanvas();\n    this.#originalViewport = null;\n  }\n\n  reset({\n    keepAnnotationLayer = false,\n    keepAnnotationEditorLayer = false,\n    keepXfaLayer = false,\n    keepTextLayer = false,\n    keepCanvasWrapper = false,\n    preserveDetailViewState = false,\n  } = {}) {\n    const keepPdfBugGroups = this.pdfPage?._pdfBug ?? false;\n\n    this.cancelRendering({\n      keepAnnotationLayer,\n      keepAnnotationEditorLayer,\n      keepXfaLayer,\n      keepTextLayer,\n    });\n    this.renderingState = RenderingStates.INITIAL;\n\n    const div = this.div;\n\n    const childNodes = div.childNodes,\n      annotationLayerNode =\n        (keepAnnotationLayer && this.annotationLayer?.div) || null,\n      annotationEditorLayerNode =\n        (keepAnnotationEditorLayer && this.annotationEditorLayer?.div) || null,\n      xfaLayerNode = (keepXfaLayer && this.xfaLayer?.div) || null,\n      textLayerNode = (keepTextLayer && this.textLayer?.div) || null,\n      canvasWrapperNode = (keepCanvasWrapper && this.#canvasWrapper) || null;\n    for (let i = childNodes.length - 1; i >= 0; i--) {\n      const node = childNodes[i];\n      switch (node) {\n        case annotationLayerNode:\n        case annotationEditorLayerNode:\n        case xfaLayerNode:\n        case textLayerNode:\n        case canvasWrapperNode:\n          continue;\n      }\n      if (keepPdfBugGroups && node.classList.contains(\"pdfBugGroupsLayer\")) {\n        continue;\n      }\n      node.remove();\n      const layerIndex = this.#layers.indexOf(node);\n      if (layerIndex >= 0) {\n        this.#layers[layerIndex] = null;\n      }\n    }\n    div.removeAttribute(\"data-loaded\");\n\n    if (annotationLayerNode) {\n      // Hide the annotation layer until all elements are resized\n      // so they are not displayed on the already resized page.\n      this.annotationLayer.hide();\n    }\n    if (annotationEditorLayerNode) {\n      this.annotationEditorLayer.hide();\n    }\n    if (xfaLayerNode) {\n      // Hide the XFA layer until all elements are resized\n      // so they are not displayed on the already resized page.\n      this.xfaLayer.hide();\n    }\n    if (textLayerNode) {\n      this.textLayer.hide();\n    }\n    this.structTreeLayer?.hide();\n\n    if (!keepCanvasWrapper && this.#canvasWrapper) {\n      this.#canvasWrapper = null;\n      this._resetCanvas();\n    }\n\n    if (!preserveDetailViewState) {\n      this.detailView?.reset({ keepCanvas: keepCanvasWrapper });\n\n      // If we are keeping the canvas around we must also keep the `detailView`\n      // object, so that next time we need a detail view we'll update the\n      // existing canvas rather than creating a new one.\n      if (!keepCanvasWrapper) {\n        this.detailView = null;\n      }\n    }\n  }\n\n  toggleEditingMode(isEditing) {\n    // The page can be invisible, consequently there's no annotation layer and\n    // we can't know if there are editable annotations.\n    // So to avoid any issue when the page is rendered the #isEditing flag must\n    // be set.\n    this.#isEditing = isEditing;\n    if (!this.hasEditableAnnotations()) {\n      return;\n    }\n    this.reset({\n      keepAnnotationLayer: true,\n      keepAnnotationEditorLayer: true,\n      keepXfaLayer: true,\n      keepTextLayer: true,\n      keepCanvasWrapper: true,\n    });\n  }\n\n  updateVisibleArea(visibleArea) {\n    if (this.enableDetailCanvas) {\n      if (\n        this.#needsRestrictedScaling &&\n        this.maxCanvasPixels > 0 &&\n        visibleArea\n      ) {\n        this.detailView ??= new PDFPageDetailView({\n          pageView: this,\n          enableOptimizedPartialRendering: this.enableOptimizedPartialRendering,\n          imagesRightClickMinSize: -1,\n        });\n        this.detailView.update({ visibleArea });\n      } else if (this.detailView) {\n        this.detailView.reset();\n        this.detailView = null;\n      }\n    }\n  }\n\n  /**\n   * @typedef {Object} PDFPageViewUpdateParameters\n   * @property {number} [scale] The new scale, if specified.\n   * @property {number} [rotation] The new rotation, if specified.\n   * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise]\n   *   A promise that is resolved with an {@link OptionalContentConfig}\n   *   instance. The default value is `null`.\n   * @property {number} [drawingDelay]\n   */\n\n  /**\n   * Update e.g. the scale and/or rotation of the page.\n   * @param {PDFPageViewUpdateParameters} params\n   */\n  update({\n    scale = 0,\n    rotation = null,\n    optionalContentConfigPromise = null,\n    drawingDelay = -1,\n  }) {\n    this.scale = scale || this.scale;\n    if (typeof rotation === \"number\") {\n      this.rotation = rotation; // The rotation may be zero.\n    }\n    if (optionalContentConfigPromise instanceof Promise) {\n      this._optionalContentConfigPromise = optionalContentConfigPromise;\n\n      // Ensure that the thumbnails always display the *initial* document state,\n      // for documents with optional content.\n      optionalContentConfigPromise.then(optionalContentConfig => {\n        if (\n          optionalContentConfigPromise !== this._optionalContentConfigPromise\n        ) {\n          return;\n        }\n        this.#useThumbnailCanvas.initialOptionalContent =\n          optionalContentConfig.hasInitialVisibility;\n      });\n    }\n    this.#useThumbnailCanvas.directDrawing = true;\n\n    const totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS,\n      rotation: totalRotation,\n    });\n    this.#setDimensions();\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this._isStandalone\n    ) {\n      this._container?.style.setProperty(\"--scale-factor\", this.viewport.scale);\n    }\n\n    this.#computeScale();\n\n    if (this.canvas) {\n      const onlyCssZoom =\n        this.#hasRestrictedScaling && this.#needsRestrictedScaling;\n      const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000;\n\n      if (postponeDrawing || onlyCssZoom) {\n        if (\n          postponeDrawing &&\n          !onlyCssZoom &&\n          this.renderingState !== RenderingStates.FINISHED\n        ) {\n          this.cancelRendering({\n            keepAnnotationLayer: true,\n            keepAnnotationEditorLayer: true,\n            keepXfaLayer: true,\n            keepTextLayer: true,\n            cancelExtraDelay: drawingDelay,\n          });\n          // It isn't really finished, but once we have finished\n          // to postpone, we'll call this.reset(...) which will set\n          // the rendering state to INITIAL, hence the next call to\n          // PDFViewer.update() will trigger a redraw (if it's mandatory).\n          this.renderingState = RenderingStates.FINISHED;\n          // Ensure that the thumbnails won't become partially (or fully) blank,\n          // if the sidebar is opened before the actual rendering is done.\n          this.#useThumbnailCanvas.directDrawing = false;\n        }\n\n        this.cssTransform({\n          redrawAnnotationLayer: true,\n          redrawAnnotationEditorLayer: true,\n          redrawXfaLayer: true,\n          redrawTextLayer: !postponeDrawing,\n          hideTextLayer: postponeDrawing,\n        });\n\n        // The \"pagerendered\"-event will be dispatched once the actual\n        // rendering is done, hence don't dispatch it here as well.\n        if (!postponeDrawing) {\n          this.detailView?.update({ underlyingViewUpdated: true });\n\n          this.dispatchPageRendered(\n            /* cssTransform */ true,\n            /* isDetailView */ false\n          );\n        }\n        return;\n      }\n    }\n    this.cssTransform({});\n    this.reset({\n      keepAnnotationLayer: true,\n      keepAnnotationEditorLayer: true,\n      keepXfaLayer: true,\n      keepTextLayer: true,\n      keepCanvasWrapper: true,\n      // It will be reset by the .update call below\n      preserveDetailViewState: true,\n    });\n\n    this.detailView?.update({ underlyingViewUpdated: true });\n  }\n\n  #computeScale() {\n    const { width, height } = this.viewport;\n    const outputScale = (this.outputScale = new OutputScale());\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this.maxCanvasPixels === 0\n    ) {\n      const invScale = 1 / this.scale;\n      // Use a scale that makes the canvas have the originally intended size\n      // of the page.\n      outputScale.sx *= invScale;\n      outputScale.sy *= invScale;\n      this.#needsRestrictedScaling = true;\n    } else {\n      this.#needsRestrictedScaling = outputScale.limitCanvas(\n        width,\n        height,\n        this.maxCanvasPixels,\n        this.maxCanvasDim,\n        this.capCanvasAreaFactor\n      );\n      if (this.#needsRestrictedScaling && this.enableDetailCanvas) {\n        // If we are going to have a high-res detail view, further reduce\n        // the canvas resolution to improve rendering performance.\n        // When enableOptimizedPartialRendering is enabled the factor can be\n        // higher since less data will be rendered and it's more acceptable to\n        // have a lower quality (the canvas is exposed less time to the user).\n        const factor = this.enableOptimizedPartialRendering ? 4 : 2;\n        outputScale.sx /= factor;\n        outputScale.sy /= factor;\n      }\n    }\n  }\n\n  /**\n   * PLEASE NOTE: Most likely you want to use the `this.reset()` method,\n   *              rather than calling this one directly.\n   */\n  cancelRendering({\n    keepAnnotationLayer = false,\n    keepAnnotationEditorLayer = false,\n    keepXfaLayer = false,\n    keepTextLayer = false,\n    cancelExtraDelay = 0,\n  } = {}) {\n    super.cancelRendering({ cancelExtraDelay });\n\n    if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) {\n      this.textLayer.cancel();\n      this.textLayer = null;\n    }\n    if (\n      this.annotationLayer &&\n      (!keepAnnotationLayer || !this.annotationLayer.div)\n    ) {\n      this.annotationLayer.cancel();\n      this.annotationLayer = null;\n      this._annotationCanvasMap = null;\n    }\n    if (this.structTreeLayer && !this.textLayer) {\n      this.structTreeLayer = null;\n    }\n    if (\n      this.annotationEditorLayer &&\n      (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)\n    ) {\n      if (this.drawLayer) {\n        this.drawLayer.cancel();\n        this.drawLayer = null;\n      }\n      this.annotationEditorLayer.cancel();\n      this.annotationEditorLayer = null;\n    }\n    if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) {\n      this.xfaLayer.cancel();\n      this.xfaLayer = null;\n      this._textHighlighter?.disable();\n    }\n  }\n\n  cssTransform({\n    redrawAnnotationLayer = false,\n    redrawAnnotationEditorLayer = false,\n    redrawXfaLayer = false,\n    redrawTextLayer = false,\n    hideTextLayer = false,\n  }) {\n    const { canvas } = this;\n    if (!canvas) {\n      return;\n    }\n\n    const originalViewport = this.#originalViewport;\n    if (this.viewport !== originalViewport) {\n      // The canvas may have been originally rotated; rotate relative to that.\n      const relativeRotation =\n        (360 + this.viewport.rotation - originalViewport.rotation) % 360;\n      if (relativeRotation === 90 || relativeRotation === 270) {\n        const { width, height } = this.viewport;\n        // Scale x and y because of the rotation.\n        const scaleX = height / width;\n        const scaleY = width / height;\n        canvas.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX},${scaleY})`;\n      } else {\n        canvas.style.transform =\n          relativeRotation === 0 ? \"\" : `rotate(${relativeRotation}deg)`;\n      }\n    }\n\n    if (redrawAnnotationLayer && this.annotationLayer) {\n      this.#renderAnnotationLayer();\n    }\n    if (redrawAnnotationEditorLayer && this.annotationEditorLayer) {\n      if (this.drawLayer) {\n        this.#renderDrawLayer();\n      }\n      this.#renderAnnotationEditorLayer();\n    }\n    if (redrawXfaLayer && this.xfaLayer) {\n      this.#renderXfaLayer();\n    }\n\n    if (this.textLayer) {\n      if (hideTextLayer) {\n        this.textLayer.hide();\n        this.structTreeLayer?.hide();\n      } else if (redrawTextLayer) {\n        this.#renderTextLayer();\n      }\n    }\n  }\n\n  get width() {\n    return this.viewport.width;\n  }\n\n  get height() {\n    return this.viewport.height;\n  }\n\n  getPagePoint(x, y) {\n    return this.viewport.convertToPdfPoint(x, y);\n  }\n\n  // Wrap the canvas so that if it has a CSS transform for high DPI the\n  // overflow will be hidden in Firefox.\n  _ensureCanvasWrapper() {\n    let canvasWrapper = this.#canvasWrapper;\n    if (!canvasWrapper) {\n      canvasWrapper = this.#canvasWrapper = document.createElement(\"div\");\n      canvasWrapper.classList.add(\"canvasWrapper\");\n      this.#addLayer(canvasWrapper, \"canvasWrapper\");\n    }\n    return canvasWrapper;\n  }\n\n  _getRenderingContext(canvas, transform, recordOperations, recordImages) {\n    return {\n      canvas,\n      transform,\n      viewport: this.viewport,\n      annotationMode: this.#annotationMode,\n      optionalContentConfigPromise: this._optionalContentConfigPromise,\n      annotationCanvasMap: this._annotationCanvasMap,\n      pageColors: this.pageColors,\n      isEditing: this.#isEditing,\n      recordOperations,\n      recordImages,\n    };\n  }\n\n  async draw() {\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error(\"Must be in new state before drawing\");\n      this.reset(); // Ensure that we reset all state to prevent issues.\n    }\n    const { div, l10n, pdfPage, viewport } = this;\n\n    if (!pdfPage) {\n      this.renderingState = RenderingStates.FINISHED;\n      throw new Error(\"pdfPage is not loaded\");\n    }\n\n    this.renderingState = RenderingStates.RUNNING;\n\n    const canvasWrapper = this._ensureCanvasWrapper();\n\n    if (\n      !this.textLayer &&\n      this.#textLayerMode !== TextLayerMode.DISABLE &&\n      !pdfPage.isPureXfa\n    ) {\n      this._accessibilityManager ||= new TextAccessibilityManager();\n\n      this.textLayer = new TextLayerBuilder({\n        pdfPage,\n        highlighter: this._textHighlighter,\n        accessibilityManager: this._accessibilityManager,\n        enablePermissions:\n          this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS,\n        onAppend: textLayerDiv => {\n          // Pause translation when inserting the textLayer in the DOM.\n          this.l10n.pause();\n          this.#addLayer(textLayerDiv, \"textLayer\");\n          this.l10n.resume();\n        },\n        abortSignal: this.#abortSignal,\n      });\n      if (this.enableSelectionRendering) {\n        this.textLayer.div.classList.add(\"selectionRendering\");\n      }\n    }\n\n    if (\n      !this.annotationLayer &&\n      this.#annotationMode !== AnnotationMode.DISABLE\n    ) {\n      const {\n        annotationStorage,\n        annotationEditorUIManager,\n        downloadManager,\n        enableComment,\n        enableScripting,\n        fieldObjectsPromise,\n        hasJSActionsPromise,\n        linkService,\n      } = this.#layerProperties;\n\n      this._annotationCanvasMap ||= new Map();\n      this.annotationLayer = new AnnotationLayerBuilder({\n        pdfPage,\n        annotationStorage,\n        imageResourcesPath: this.imageResourcesPath,\n        renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS,\n        linkService,\n        downloadManager,\n        enableComment,\n        enableScripting,\n        hasJSActionsPromise,\n        fieldObjectsPromise,\n        annotationCanvasMap: this._annotationCanvasMap,\n        accessibilityManager: this._accessibilityManager,\n        annotationEditorUIManager,\n        commentManager: this.#commentManager,\n        onAppend: annotationLayerDiv => {\n          this.#addLayer(annotationLayerDiv, \"annotationLayer\");\n        },\n      });\n    }\n\n    const { width, height } = viewport;\n    this.#originalViewport = viewport;\n\n    const { canvas, prevCanvas } = this._createCanvas(newCanvas => {\n      // Always inject the canvas as the first element in the wrapper.\n      canvasWrapper.prepend(newCanvas);\n    });\n    canvas.setAttribute(\"role\", \"presentation\");\n\n    if (!this.outputScale) {\n      this.#computeScale();\n    }\n    const { outputScale } = this;\n    this.#hasRestrictedScaling = this.#needsRestrictedScaling;\n\n    const sfx = approximateFraction(outputScale.sx);\n    const sfy = approximateFraction(outputScale.sy);\n\n    const canvasWidth = (canvas.width = floorToDivide(\n      calcRound(width * outputScale.sx),\n      sfx[0]\n    ));\n    const canvasHeight = (canvas.height = floorToDivide(\n      calcRound(height * outputScale.sy),\n      sfy[0]\n    ));\n    const pageWidth = floorToDivide(calcRound(width), sfx[1]);\n    const pageHeight = floorToDivide(calcRound(height), sfy[1]);\n    outputScale.sx = canvasWidth / pageWidth;\n    outputScale.sy = canvasHeight / pageHeight;\n\n    if (this.#scaleRoundX !== sfx[1]) {\n      div.style.setProperty(\"--scale-round-x\", `${sfx[1]}px`);\n      this.#scaleRoundX = sfx[1];\n    }\n    if (this.#scaleRoundY !== sfy[1]) {\n      div.style.setProperty(\"--scale-round-y\", `${sfy[1]}px`);\n      this.#scaleRoundY = sfy[1];\n    }\n\n    const recordBBoxes =\n      this.enableOptimizedPartialRendering &&\n      this.#hasRestrictedScaling &&\n      !this.recordedBBoxes;\n\n    const recordImages =\n      this.imagesRightClickMinSize !== -1 && !this.imageCoordinates;\n\n    // Rendering area\n    const transform = outputScale.scaled\n      ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0]\n      : null;\n    const resultPromise = this._drawCanvas(\n      this._getRenderingContext(canvas, transform, recordBBoxes, recordImages),\n      () => {\n        prevCanvas?.remove();\n        this._resetCanvas();\n      },\n      renderTask => {\n        // Ensure that the thumbnails won't become partially (or fully) blank,\n        // for documents that contain interactive form elements.\n        this.#useThumbnailCanvas.regularAnnotations =\n          !renderTask.separateAnnots;\n\n        this.dispatchPageRendered(\n          /* cssTransform */ false,\n          /* isDetailView */ false\n        );\n      }\n    ).then(async () => {\n      if (this.renderingState !== RenderingStates.FINISHED) {\n        // The rendering has been cancelled.\n        return;\n      }\n      this.structTreeLayer ||= new StructTreeLayerBuilder(\n        pdfPage,\n        viewport.rawDims\n      );\n\n      const textLayerPromise = this.textLayer ? this.#renderTextLayer() : null;\n\n      if (this.annotationLayer) {\n        await this.#renderAnnotationLayer(textLayerPromise);\n      }\n\n      this.drawLayer ||= new DrawLayerBuilder({\n        pageIndex: this.id,\n        textLayer: this.enableSelectionRendering ? this.textLayer?.div : null,\n        filterFactory: this.pdfPage?.filterFactory,\n        pageColors: this.pageColors,\n      });\n      await this.#renderDrawLayer();\n      this.drawLayer.setParent(canvasWrapper);\n\n      const { annotationEditorUIManager } = this.#layerProperties;\n\n      if (!annotationEditorUIManager) {\n        return;\n      }\n      if (\n        this.annotationLayer ||\n        this.#annotationMode === AnnotationMode.DISABLE\n      ) {\n        this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({\n          uiManager: annotationEditorUIManager,\n          pageIndex: this.id - 1,\n          l10n,\n          structTreeLayer: this.structTreeLayer,\n          accessibilityManager: this._accessibilityManager,\n          annotationLayer: this.annotationLayer?.annotationLayer,\n          textLayer: this.textLayer,\n          drawLayer: this.drawLayer.getDrawLayer(),\n          onAppend: annotationEditorLayerDiv => {\n            this.#addLayer(annotationEditorLayerDiv, \"annotationEditorLayer\");\n          },\n        });\n        this.#renderAnnotationEditorLayer();\n      }\n    });\n\n    if (pdfPage.isPureXfa) {\n      if (!this.xfaLayer) {\n        const { annotationStorage, linkService } = this.#layerProperties;\n\n        this.xfaLayer = new XfaLayerBuilder({\n          pdfPage,\n          annotationStorage,\n          linkService,\n        });\n      }\n      this.#renderXfaLayer();\n    }\n\n    div.setAttribute(\"data-loaded\", true);\n\n    this.dispatchPageRender();\n\n    return resultPromise;\n  }\n\n  /**\n   * @param {string|null} label\n   */\n  setPageLabel(label) {\n    this.pageLabel = typeof label === \"string\" ? label : null;\n\n    this.div.setAttribute(\n      \"data-l10n-args\",\n      JSON.stringify({ page: this.pageLabel ?? this.id })\n    );\n\n    if (this.pageLabel !== null) {\n      this.div.setAttribute(\"data-page-label\", this.pageLabel);\n    } else {\n      this.div.removeAttribute(\"data-page-label\");\n    }\n  }\n\n  /**\n   * For use by the `PDFThumbnailView.setImage`-method.\n   * @ignore\n   */\n  get thumbnailCanvas() {\n    const { directDrawing, initialOptionalContent, regularAnnotations } =\n      this.#useThumbnailCanvas;\n    return directDrawing && initialOptionalContent && regularAnnotations\n      ? this.canvas\n      : null;\n  }\n}\n\nexport { PDFPageView };\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"../src/display/api\").PDFDocumentProxy} PDFDocumentProxy */\n/** @typedef {import(\"../src/display/api\").PDFPageProxy} PDFPageProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/page_viewport\").PageViewport} PageViewport */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/optional_content_config\").OptionalContentConfig} OptionalContentConfig */\n/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_find_controller\").PDFFindController} PDFFindController */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./pdf_scripting_manager\").PDFScriptingManager} PDFScriptingManager */\n/** @typedef {import(\"./pdf_link_service.js\").PDFLinkService} PDFLinkService */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./base_download_manager.js\").BaseDownloadManager} BaseDownloadManager */\n/** @typedef {import(\"./l10n.js\").L10n} L10n */\n\nimport {\n  AnnotationEditorType,\n  AnnotationEditorUIManager,\n  AnnotationMode,\n  makeArr,\n  MathClamp,\n  PermissionFlag,\n  PixelsPerInch,\n  shadow,\n  stopEvent,\n  version,\n} from \"pdfjs-lib\";\nimport {\n  DEFAULT_SCALE,\n  DEFAULT_SCALE_DELTA,\n  DEFAULT_SCALE_VALUE,\n  docStyle,\n  getVisibleElements,\n  isPortraitOrientation,\n  isValidRotation,\n  isValidScrollMode,\n  isValidSpreadMode,\n  MAX_AUTO_SCALE,\n  MAX_SCALE,\n  MIN_SCALE,\n  PresentationModeState,\n  removeNullCharacters,\n  SCROLLBAR_PADDING,\n  scrollIntoView,\n  ScrollMode,\n  SpreadMode,\n  TextLayerMode,\n  UNKNOWN_SCALE,\n  VERTICAL_PADDING,\n  watchScroll,\n} from \"./ui_utils.js\";\nimport { GenericL10n } from \"web-null_l10n\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { PDFPageView } from \"./pdf_page_view.js\";\nimport { PDFRenderingQueue } from \"./pdf_rendering_queue.js\";\nimport { RenderingStates } from \"./renderable_view.js\";\nimport { SimpleLinkService } from \"./pdf_link_service.js\";\n\nconst DEFAULT_CACHE_SIZE = 10;\n\nconst PagesCountLimit = {\n  FORCE_SCROLL_MODE_PAGE: 10000,\n  FORCE_LAZY_PAGE_INIT: 5000,\n  PAUSE_EAGER_PAGE_INIT: 250,\n};\n\nfunction isValidAnnotationEditorMode(mode) {\n  return (\n    Object.values(AnnotationEditorType).includes(mode) &&\n    mode !== AnnotationEditorType.DISABLE\n  );\n}\n\n/**\n * @typedef {Object} PDFViewerOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {HTMLDivElement} [viewer] - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {PDFLinkService} [linkService] - The navigation/linking service.\n * @property {BaseDownloadManager} [downloadManager] - The download manager\n *   component.\n * @property {PDFFindController} [findController] - The find controller\n *   component.\n * @property {PDFScriptingManager} [scriptingManager] - The scripting manager\n *   component.\n * @property {PDFRenderingQueue} [renderingQueue] - The rendering queue object.\n * @property {boolean} [removePageBorders] - Removes the border shadow around\n *   the pages. The default value is `false`.\n * @property {number} [textLayerMode] - Controls if the text layer used for\n *   selection and searching is created. The constants from {TextLayerMode}\n *   should be used. The default value is `TextLayerMode.ENABLE`.\n * @property {number} [annotationMode] - Controls if the annotation layer is\n *   created, and if interactive form elements or `AnnotationStorage`-data are\n *   being rendered. The constants from {@link AnnotationMode} should be used;\n *   see also {@link RenderParameters} and {@link GetOperatorListParameters}.\n *   The default value is `AnnotationMode.ENABLE_FORMS`.\n * @property {number} [annotationEditorMode] - Enables the creation and editing\n *   of new Annotations. The constants from {@link AnnotationEditorType} should\n *   be used. The default value is `AnnotationEditorType.NONE`.\n * @property {string} [annotationEditorHighlightColors] - A comma separated list\n *   of colors to propose to highlight some text in the pdf.\n * @property {string} [imageResourcesPath] - Path for image resources, mainly\n *   mainly for annotation icons. Include trailing slash.\n * @property {boolean} [enablePrintAutoRotate] - Enables automatic rotation of\n *   landscape pages upon printing. The default is `false`.\n * @property {number} [maxCanvasPixels] - The maximum supported canvas size in\n *   total pixels, i.e. width * height. Use `-1` for no limit, or `0` for\n *   CSS-only zooming. The default value is 4096 * 8192 (32 mega-pixels).\n * @property {number} [maxCanvasDim] - The maximum supported canvas dimension,\n *   in either width or height. Use `-1` for no limit.\n *   The default value is 32767.\n * @property {number} [capCanvasAreaFactor] - Cap the canvas area to the\n *   viewport increased by the value in percent. Use `-1` for no limit.\n *   The default value is 200%.\n * @property {boolean} [enableDetailCanvas] - When enabled, if the rendered\n *   pages would need a canvas that is larger than `maxCanvasPixels` or\n *   `maxCanvasDim`, it will draw a second canvas on top of the CSS-zoomed one,\n *   that only renders the part of the page that is close to the viewport.\n *   The default value is `true`.\n * @property {boolean} [enableSelectionRendering] - Enables rendering of text\n *   selections in the draw layer.\n *   The default value is `true`.\n * @property {number} [imagesRightClickMinSize] - All images whose width and\n *  height are at least this value (in pixels) will be lazily inserted in the\n *  dom to allow right-clicking and saving them. Use `-1` to disable this.\n * @property {boolean} [enableOptimizedPartialRendering] - When enabled, PDF\n *   rendering will keep track of which areas of the page each PDF operation\n *   affects. Then, when rendering a partial page (if `enableDetailCanvas` is\n *   enabled), it will only run through the operations that affect that portion.\n * @property {L10n} [l10n] - Localization service.\n * @property {boolean} [enablePermissions] - Enables PDF document permissions,\n *   when they exist. The default value is `false`.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n *   with user defined ones in order to improve readability in high contrast\n *   mode.\n * @property {boolean} [supportsPinchToZoom] - Enable zooming on pinch gesture.\n *   The default value is `true`.\n * @property {boolean} [enableAutoLinking] - Enable creation of hyperlinks from\n *   text that look like URLs. The default value is `true`.\n * @property {number} [minDurationToUpdateCanvas] - Minimum duration to wait\n *   before updating the canvas. The default value is `500`.\n */\n\nclass PDFPageViewBuffer {\n  // Here we rely on the fact that `Set`s preserve the insertion order.\n  #buf = new Set();\n\n  #size = 0;\n\n  constructor(size) {\n    this.#size = size;\n  }\n\n  push(view) {\n    const buf = this.#buf;\n    if (buf.has(view)) {\n      buf.delete(view); // Move the view to the \"end\" of the buffer.\n    }\n    buf.add(view);\n\n    if (buf.size > this.#size) {\n      this.#destroyFirstView();\n    }\n  }\n\n  /**\n   * After calling resize, the size of the buffer will be `newSize`.\n   * The optional parameter `idsToKeep` is, if present, a Set of page-ids to\n   * push to the back of the buffer, delaying their destruction. The size of\n   * `idsToKeep` has no impact on the final size of the buffer; if `idsToKeep`\n   * is larger than `newSize`, some of those pages will be destroyed anyway.\n   */\n  resize(newSize, idsToKeep = null) {\n    this.#size = newSize;\n\n    const buf = this.#buf;\n    if (idsToKeep) {\n      const ii = buf.size;\n      let i = 1;\n      for (const view of buf) {\n        if (idsToKeep.has(view.id)) {\n          buf.delete(view); // Move the view to the \"end\" of the buffer.\n          buf.add(view);\n        }\n        if (++i > ii) {\n          break;\n        }\n      }\n    }\n\n    while (buf.size > this.#size) {\n      this.#destroyFirstView();\n    }\n  }\n\n  has(view) {\n    return this.#buf.has(view);\n  }\n\n  [Symbol.iterator]() {\n    return this.#buf.keys();\n  }\n\n  #destroyFirstView() {\n    const firstView = this.#buf.keys().next().value;\n\n    firstView?.destroy();\n    this.#buf.delete(firstView);\n  }\n}\n\n/**\n * Simple viewer control to display PDF content/pages.\n */\nclass PDFViewer {\n  #buffer = null;\n\n  #altTextManager = null;\n\n  #annotationEditorHighlightColors = null;\n\n  #annotationEditorMode = AnnotationEditorType.NONE;\n\n  #annotationEditorUIManager = null;\n\n  #annotationMode = AnnotationMode.ENABLE_FORMS;\n\n  #commentManager = null;\n\n  #containerTopLeft = null;\n\n  #editorUndoBar = null;\n\n  #enableHighlightFloatingButton = false;\n\n  #enablePermissions = false;\n\n  #enableUpdatedAddImage = false;\n\n  #enableNewAltTextWhenAddingImage = false;\n\n  #enableAutoLinking = true;\n\n  #abortSignal = null;\n\n  #eventAC = null;\n\n  #minDurationToUpdateCanvas = 0;\n\n  #mlManager = null;\n\n  #printingAllowed = true;\n\n  #scrollTimeoutId = null;\n\n  #switchAnnotationEditorModeAC = null;\n\n  #switchAnnotationEditorModeTimeoutId = null;\n\n  #copyAllInProgress = false;\n\n  #hiddenCopyElement = null;\n\n  #previousContainerHeight = 0;\n\n  #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this));\n\n  #scrollModePageState = null;\n\n  #scaleTimeoutId = null;\n\n  #signatureManager = null;\n\n  #supportsPinchToZoom = true;\n\n  #textLayerMode = TextLayerMode.ENABLE;\n\n  #viewerAlert = null;\n\n  #copiedPageViews = null;\n\n  #savedPageViews = null;\n\n  #deletedPageNumbers = null;\n\n  /**\n   * @param {PDFViewerOptions} options\n   */\n  constructor(options) {\n    const viewerVersion =\n      typeof PDFJSDev !== \"undefined\" ? PDFJSDev.eval(\"BUNDLE_VERSION\") : null;\n    if (version !== viewerVersion) {\n      throw new Error(\n        `The API version \"${version}\" does not match the Viewer version \"${viewerVersion}\".`\n      );\n    }\n\n    this.container = options.container;\n    this.viewer = options.viewer || options.container.firstElementChild;\n    this.#viewerAlert = options.viewerAlert || null;\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      if (this.container?.tagName !== \"DIV\" || this.viewer?.tagName !== \"DIV\") {\n        throw new Error(\"Invalid `container` and/or `viewer` option.\");\n      }\n\n      if (\n        this.container.offsetParent &&\n        getComputedStyle(this.container).position !== \"absolute\"\n      ) {\n        throw new Error(\"The `container` must be absolutely positioned.\");\n      }\n    }\n    this.#resizeObserver.observe(this.container);\n\n    this.eventBus = options.eventBus;\n    this.linkService = options.linkService || new SimpleLinkService();\n    this.downloadManager = options.downloadManager || null;\n    this.findController = options.findController || null;\n    this.#altTextManager = options.altTextManager || null;\n    this.#commentManager = options.commentManager || null;\n    this.#signatureManager = options.signatureManager || null;\n    this.#editorUndoBar = options.editorUndoBar || null;\n\n    if (this.findController) {\n      this.findController.onIsPageVisible = pageNumber =>\n        this._getVisiblePages().ids.has(pageNumber);\n    }\n    this._scriptingManager = options.scriptingManager || null;\n    this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE;\n    this.#annotationMode =\n      options.annotationMode ?? AnnotationMode.ENABLE_FORMS;\n    this.#annotationEditorMode =\n      options.annotationEditorMode ?? AnnotationEditorType.NONE;\n    this.#annotationEditorHighlightColors =\n      options.annotationEditorHighlightColors || null;\n    this.#enableHighlightFloatingButton =\n      options.enableHighlightFloatingButton === true;\n    this.#enableUpdatedAddImage = options.enableUpdatedAddImage === true;\n    this.#enableNewAltTextWhenAddingImage =\n      options.enableNewAltTextWhenAddingImage === true;\n    this.imageResourcesPath = options.imageResourcesPath || \"\";\n    this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this.removePageBorders = options.removePageBorders || false;\n    }\n    this.maxCanvasPixels = options.maxCanvasPixels;\n    this.maxCanvasDim = options.maxCanvasDim;\n    this.capCanvasAreaFactor = options.capCanvasAreaFactor;\n    this.enableDetailCanvas = options.enableDetailCanvas ?? true;\n    this.enableOptimizedPartialRendering =\n      options.enableOptimizedPartialRendering ?? false;\n    this.enableSelectionRendering = options.enableSelectionRendering !== false;\n    this.imagesRightClickMinSize = options.imagesRightClickMinSize ?? -1;\n    this.l10n = options.l10n;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      this.l10n ||= new GenericL10n();\n    }\n    this.#enablePermissions = options.enablePermissions || false;\n    this.pageColors = options.pageColors || null;\n    this.#mlManager = options.mlManager || null;\n    this.#supportsPinchToZoom = options.supportsPinchToZoom !== false;\n    this.#enableAutoLinking = options.enableAutoLinking !== false;\n    this.#minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500;\n\n    this.defaultRenderingQueue = !options.renderingQueue;\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this.defaultRenderingQueue\n    ) {\n      // Custom rendering queue is not specified, using default one\n      this.renderingQueue = new PDFRenderingQueue();\n      this.renderingQueue.setViewer(this);\n    } else {\n      this.renderingQueue = options.renderingQueue;\n    }\n\n    const { abortSignal } = options;\n    this.#abortSignal = abortSignal || null;\n    abortSignal?.addEventListener(\n      \"abort\",\n      () => {\n        this.#resizeObserver.disconnect();\n        this.#resizeObserver = null;\n      },\n      { once: true }\n    );\n\n    this.scroll = watchScroll(\n      this.container,\n      this._scrollUpdate.bind(this),\n      abortSignal\n    );\n    this.presentationModeState = PresentationModeState.UNKNOWN;\n    this._resetView();\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      this.removePageBorders\n    ) {\n      this.viewer.classList.add(\"removePageBorders\");\n    }\n\n    this.#updateContainerHeightCss();\n\n    // Trigger API-cleanup, once thumbnail rendering has finished,\n    // if the relevant pageView is *not* cached in the buffer.\n    this.eventBus.on(\n      \"thumbnailrendered\",\n      ({ pageNumber, pdfPage }) => {\n        const pageView = this._pages[pageNumber - 1];\n        if (!this.#buffer.has(pageView)) {\n          pdfPage?.cleanup();\n        }\n      },\n      internalOpt\n    );\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      !options.l10n\n    ) {\n      // Ensure that Fluent is connected in e.g. the COMPONENTS build.\n      this.l10n.translate(this.container);\n    }\n  }\n\n  get printingAllowed() {\n    return this.#printingAllowed;\n  }\n\n  get pagesCount() {\n    return this._pages.length;\n  }\n\n  getPageView(index) {\n    return this._pages[index];\n  }\n\n  getCachedPageViews() {\n    return new Set(this.#buffer);\n  }\n\n  /**\n   * @type {boolean} - True if all {PDFPageView} objects are initialized.\n   */\n  get pageViewsReady() {\n    // Prevent printing errors when 'disableAutoFetch' is set, by ensuring\n    // that *all* pages have in fact been completely loaded.\n    return this._pages.every(pageView => pageView?.pdfPage);\n  }\n\n  /**\n   * Clear text selections within the viewer.\n   */\n  clearSelection() {\n    const selection = document.getSelection();\n    if (!selection || selection.isCollapsed) {\n      return;\n    }\n\n    for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n      if (selection.getRangeAt(i).intersectsNode(this.viewer)) {\n        // `empty()` is non-standard; `removeAllRanges()` is the standard API.\n        selection.removeAllRanges?.();\n        selection.empty?.();\n        return;\n      }\n    }\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get renderForms() {\n    return this.#annotationMode === AnnotationMode.ENABLE_FORMS;\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get enableScripting() {\n    return !!this._scriptingManager;\n  }\n\n  /**\n   * @type {number}\n   */\n  get currentPageNumber() {\n    return this._currentPageNumber;\n  }\n\n  /**\n   * @param {number} val - The page number.\n   */\n  set currentPageNumber(val) {\n    if (!Number.isInteger(val)) {\n      throw new Error(\"Invalid page number.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (this._currentPageNumber !== val) {\n      this.clearSelection();\n    }\n    // The intent can be to just reset a scroll position and/or scale.\n    if (!this._setCurrentPageNumber(val, /* resetCurrentPageView = */ true)) {\n      console.error(`currentPageNumber: \"${val}\" is not a valid page.`);\n    }\n  }\n\n  /**\n   * @returns {boolean} Whether the pageNumber is valid (within bounds).\n   * @private\n   */\n  _setCurrentPageNumber(val, resetCurrentPageView = false) {\n    if (this._currentPageNumber === val) {\n      if (resetCurrentPageView) {\n        this.#resetCurrentPageView();\n      }\n      return true;\n    }\n\n    if (!(0 < val && val <= this.pagesCount)) {\n      return false;\n    }\n    const previous = this._currentPageNumber;\n    this._currentPageNumber = val;\n\n    this.eventBus.dispatch(\"pagechanging\", {\n      source: this,\n      pageNumber: val,\n      pageLabel: this._pageLabels?.[val - 1] ?? null,\n      previous,\n    });\n\n    if (resetCurrentPageView) {\n      this.#resetCurrentPageView();\n    }\n    return true;\n  }\n\n  /**\n   * @type {string|null} Returns the current page label, or `null` if no page\n   *   labels exist.\n   */\n  get currentPageLabel() {\n    return this._pageLabels?.[this._currentPageNumber - 1] ?? null;\n  }\n\n  /**\n   * @param {string} val - The page label.\n   */\n  set currentPageLabel(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let page = val | 0; // Fallback page number.\n    if (this._pageLabels) {\n      const i = this._pageLabels.indexOf(val);\n      if (i >= 0) {\n        page = i + 1;\n      }\n    }\n    if (this._currentPageNumber !== page) {\n      this.clearSelection();\n    }\n    // The intent can be to just reset a scroll position and/or scale.\n    if (!this._setCurrentPageNumber(page, /* resetCurrentPageView = */ true)) {\n      console.error(`currentPageLabel: \"${val}\" is not a valid page.`);\n    }\n  }\n\n  /**\n   * @type {number}\n   */\n  get currentScale() {\n    return this._currentScale !== UNKNOWN_SCALE\n      ? this._currentScale\n      : DEFAULT_SCALE;\n  }\n\n  /**\n   * @param {number} val - Scale of the pages in percents.\n   */\n  set currentScale(val) {\n    if (isNaN(val)) {\n      throw new Error(\"Invalid numeric scale.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    this.#setScale(val, { noScroll: false });\n  }\n\n  /**\n   * @type {string}\n   */\n  get currentScaleValue() {\n    return this._currentScaleValue;\n  }\n\n  /**\n   * @param val - The scale of the pages (in percent or predefined value).\n   */\n  set currentScaleValue(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    this.#setScale(val, { noScroll: false });\n  }\n\n  /**\n   * @type {number}\n   */\n  get pagesRotation() {\n    return this._pagesRotation;\n  }\n\n  /**\n   * @param {number} rotation - The rotation of the pages (0, 90, 180, 270).\n   */\n  set pagesRotation(rotation) {\n    if (!isValidRotation(rotation)) {\n      throw new Error(\"Invalid pages rotation angle.\");\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    // Normalize the rotation, by clamping it to the [0, 360) range.\n    rotation %= 360;\n    if (rotation < 0) {\n      rotation += 360;\n    }\n    if (this._pagesRotation === rotation) {\n      return; // The rotation didn't change.\n    }\n    this.clearSelection();\n    this._pagesRotation = rotation;\n\n    const pageNumber = this._currentPageNumber;\n\n    this.refresh(true, { rotation });\n\n    // Prevent errors in case the rotation changes *before* the scale has been\n    // set to a non-default value.\n    if (this._currentScaleValue) {\n      this.#setScale(this._currentScaleValue, { noScroll: true });\n    }\n\n    this.eventBus.dispatch(\"rotationchanging\", {\n      source: this,\n      pagesRotation: rotation,\n      pageNumber,\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  get firstPagePromise() {\n    return this.pdfDocument ? this._firstPageCapability.promise : null;\n  }\n\n  get onePageRendered() {\n    return this.pdfDocument ? this._onePageRenderedCapability.promise : null;\n  }\n\n  get pagesPromise() {\n    return this.pdfDocument ? this._pagesCapability.promise : null;\n  }\n\n  get _layerProperties() {\n    const self = this;\n    return shadow(this, \"_layerProperties\", {\n      get annotationEditorUIManager() {\n        return self.#annotationEditorUIManager;\n      },\n      get annotationStorage() {\n        return self.pdfDocument?.annotationStorage;\n      },\n      get downloadManager() {\n        return self.downloadManager;\n      },\n      get enableComment() {\n        return !!self.#commentManager;\n      },\n      get enableScripting() {\n        return !!self._scriptingManager;\n      },\n      get fieldObjectsPromise() {\n        return self.pdfDocument?.getFieldObjects();\n      },\n      get findController() {\n        return self.findController;\n      },\n      get hasJSActionsPromise() {\n        return self.pdfDocument?.hasJSActions();\n      },\n      get linkService() {\n        return self.linkService;\n      },\n    });\n  }\n\n  #setPrintingAllowed(isAllowed) {\n    this.#printingAllowed = isAllowed;\n    this.eventBus.dispatch(\"printingallowed\", { source: this, isAllowed });\n  }\n\n  /**\n   * Currently only *some* permissions are supported.\n   * @returns {Object}\n   */\n  #initializePermissions(permissions) {\n    const params = {\n      annotationEditorMode: this.#annotationEditorMode,\n      annotationMode: this.#annotationMode,\n      textLayerMode: this.#textLayerMode,\n    };\n    if (!permissions) {\n      this.#setPrintingAllowed(true);\n      return params;\n    }\n\n    this.#setPrintingAllowed(\n      permissions.includes(PermissionFlag.PRINT_HIGH_QUALITY) ||\n        permissions.includes(PermissionFlag.PRINT)\n    );\n\n    if (\n      !permissions.includes(PermissionFlag.COPY) &&\n      this.#textLayerMode === TextLayerMode.ENABLE\n    ) {\n      params.textLayerMode = TextLayerMode.ENABLE_PERMISSIONS;\n    }\n\n    if (!permissions.includes(PermissionFlag.MODIFY_CONTENTS)) {\n      params.annotationEditorMode = AnnotationEditorType.DISABLE;\n    }\n\n    if (\n      !permissions.includes(PermissionFlag.MODIFY_ANNOTATIONS) &&\n      !permissions.includes(PermissionFlag.FILL_INTERACTIVE_FORMS) &&\n      this.#annotationMode === AnnotationMode.ENABLE_FORMS\n    ) {\n      params.annotationMode = AnnotationMode.ENABLE;\n    }\n\n    return params;\n  }\n\n  async #onePageRenderedOrForceFetch(signal) {\n    // Unless the viewer *and* its pages are visible, rendering won't start and\n    // `this._onePageRenderedCapability` thus won't be resolved.\n    // To ensure that automatic printing, on document load, still works even in\n    // those cases we force-allow fetching of all pages when:\n    //  - The current window/tab is inactive, which will prevent rendering since\n    //    `requestAnimationFrame` is being used; fixes bug 1746213.\n    //  - The viewer is hidden in the DOM, e.g. in a `display: none` <iframe>\n    //    element; fixes bug 1618621.\n    //  - The viewer is visible, but none of the pages are (e.g. if the\n    //    viewer is very small); fixes bug 1618955.\n    if (\n      document.visibilityState === \"hidden\" ||\n      !this.container.offsetParent ||\n      this._getVisiblePages().views.length === 0\n    ) {\n      return;\n    }\n\n    // Handle the window/tab becoming inactive *after* rendering has started;\n    // fixes (another part of) bug 1746213.\n    const hiddenCapability = Promise.withResolvers(),\n      ac = new AbortController();\n    document.addEventListener(\n      \"visibilitychange\",\n      () => {\n        if (document.visibilityState === \"hidden\") {\n          hiddenCapability.resolve();\n        }\n      },\n      { signal: AbortSignal.any([signal, ac.signal]) }\n    );\n\n    await Promise.race([\n      this._onePageRenderedCapability.promise,\n      hiddenCapability.promise,\n    ]);\n    ac.abort(); // Remove the \"visibilitychange\" listener immediately.\n  }\n\n  async getAllText(interruptSignal = null) {\n    const texts = [];\n    const buffer = [];\n    for (\n      let pageNum = 1, pagesCount = this.pdfDocument.numPages;\n      pageNum <= pagesCount;\n      ++pageNum\n    ) {\n      if (interruptSignal?.aborted) {\n        return null;\n      }\n      buffer.length = 0;\n      const page = await this.pdfDocument.getPage(pageNum);\n      // By default getTextContent pass disableNormalization equals to false\n      // which is fine because we want a normalized string.\n      const { items } = await page.getTextContent();\n      for (const item of items) {\n        if (item.str) {\n          buffer.push(item.str);\n        }\n        if (item.hasEOL) {\n          buffer.push(\"\\n\");\n        }\n      }\n      texts.push(removeNullCharacters(buffer.join(\"\")));\n    }\n\n    return texts.join(\"\\n\");\n  }\n\n  #copyCallback(textLayerMode, event) {\n    const selection = document.getSelection();\n    const { focusNode, anchorNode } = selection;\n    if (\n      anchorNode &&\n      focusNode &&\n      selection.containsNode(this.#hiddenCopyElement)\n    ) {\n      // About the condition above:\n      //  - having non-null anchorNode and focusNode are here to guaranty that\n      //    we have at least a kind of selection.\n      //  - this.#hiddenCopyElement is an invisible element which is impossible\n      //    to select manually (its display is none) but ctrl+A will select all\n      //    including this element so having it in the selection means that all\n      //    has been selected.\n\n      if (\n        this.#copyAllInProgress ||\n        textLayerMode === TextLayerMode.ENABLE_PERMISSIONS\n      ) {\n        stopEvent(event);\n        return;\n      }\n      this.#copyAllInProgress = true;\n\n      // TODO: if all the pages are rendered we don't need to wait for\n      // getAllText and we could just get text from the Selection object.\n\n      // Select all the document.\n      const { classList } = this.viewer;\n      classList.add(\"copyAll\");\n\n      const keydownAC = new AbortController(),\n        interruptAC = new AbortController();\n      window.addEventListener(\n        \"keydown\",\n        ev => {\n          if (ev.key === \"Escape\") {\n            interruptAC.abort();\n          }\n        },\n        { signal: keydownAC.signal }\n      );\n\n      this.getAllText(interruptAC.signal)\n        .then(async text => {\n          if (text !== null) {\n            await navigator.clipboard.writeText(text);\n          }\n        })\n        .catch(reason => {\n          console.warn(\n            `Something goes wrong when extracting the text: ${reason.message}`\n          );\n        })\n        .finally(() => {\n          this.#copyAllInProgress = false;\n          keydownAC.abort();\n          classList.remove(\"copyAll\");\n        });\n\n      stopEvent(event);\n    }\n  }\n\n  /**\n   * @param {PDFDocumentProxy} pdfDocument\n   */\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this.eventBus.dispatch(\"pagesdestroy\", { source: this });\n\n      this._cancelRendering();\n      this._resetView();\n\n      this.findController?.setDocument(null);\n      this._scriptingManager?.setDocument(null);\n\n      this.#annotationEditorUIManager?.destroy();\n      this.#annotationEditorUIManager = null;\n\n      this.#annotationEditorMode = AnnotationEditorType.NONE;\n      this.#printingAllowed = true;\n    }\n\n    this.pdfDocument = pdfDocument;\n    if (!pdfDocument) {\n      return;\n    }\n    const pagesCount = pdfDocument.numPages;\n    const firstPagePromise = pdfDocument.getPage(1);\n    // Rendering (potentially) depends on this, hence fetching it immediately.\n    const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({\n      intent: \"display\",\n    });\n    const permissionsPromise = this.#enablePermissions\n      ? pdfDocument.getPermissions()\n      : Promise.resolve();\n\n    const { eventBus, pageColors, viewer } = this;\n\n    this.#eventAC = new AbortController();\n    const { signal } = this.#eventAC;\n    const evtOpts = { signal, ...internalOpt };\n\n    // Given that browsers don't handle huge amounts of DOM-elements very well,\n    // enforce usage of PAGE-scrolling when loading *very* long/large documents.\n    if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) {\n      console.warn(\n        \"Forcing PAGE-scrolling for performance reasons, given the length of the document.\"\n      );\n      const mode = (this._scrollMode = ScrollMode.PAGE);\n      eventBus.dispatch(\"scrollmodechanged\", { source: this, mode });\n    }\n\n    this._pagesCapability.promise.then(\n      () => {\n        eventBus.dispatch(\"pagesloaded\", { source: this, pagesCount });\n      },\n      () => {\n        /* Prevent \"Uncaught (in promise)\"-messages in the console. */\n      }\n    );\n\n    const onBeforeDraw = evt => {\n      const pageView = this._pages[evt.pageNumber - 1];\n      if (!pageView) {\n        return;\n      }\n      // Add the page to the buffer at the start of drawing. That way it can be\n      // evicted from the buffer and destroyed even if we pause its rendering.\n      this.#buffer.push(pageView);\n    };\n    eventBus.on(\"pagerender\", onBeforeDraw, evtOpts);\n\n    const onAfterDraw = evt => {\n      if (evt.cssTransform || evt.isDetailView) {\n        return;\n      }\n      this._onePageRenderedCapability.resolve({ timestamp: evt.timestamp });\n\n      eventBus.off(\"pagerendered\", onAfterDraw); // Remove immediately.\n    };\n    eventBus.on(\"pagerendered\", onAfterDraw, evtOpts);\n\n    // Fetch a single page so we can get a viewport that will be the default\n    // viewport for all pages\n    Promise.all([firstPagePromise, permissionsPromise])\n      .then(([firstPdfPage, permissions]) => {\n        if (pdfDocument !== this.pdfDocument) {\n          return; // The document was closed while the first page resolved.\n        }\n        this._firstPageCapability.resolve(firstPdfPage);\n        this._optionalContentConfigPromise = optionalContentConfigPromise;\n\n        const { annotationEditorMode, annotationMode, textLayerMode } =\n          this.#initializePermissions(permissions);\n\n        if (textLayerMode !== TextLayerMode.DISABLE) {\n          const element = (this.#hiddenCopyElement =\n            document.createElement(\"div\"));\n          element.id = \"hiddenCopyElement\";\n          element.style.cssText =\n            \"position:absolute;top:0;left:0;width:0;height:0;display:none\";\n          viewer.before(element);\n        }\n\n        if (annotationEditorMode !== AnnotationEditorType.DISABLE) {\n          const mode = annotationEditorMode;\n\n          if (pdfDocument.isPureXfa) {\n            console.warn(\"Warning: XFA-editing is not implemented.\");\n          } else if (isValidAnnotationEditorMode(mode)) {\n            this.#annotationEditorUIManager = new AnnotationEditorUIManager(\n              this.container,\n              viewer,\n              this.#viewerAlert,\n              this.#altTextManager,\n              this.#commentManager,\n              this.#signatureManager,\n              eventBus,\n              pdfDocument,\n              pageColors,\n              this.#annotationEditorHighlightColors,\n              this.#enableHighlightFloatingButton,\n              this.#enableUpdatedAddImage,\n              this.#enableNewAltTextWhenAddingImage,\n              this.#mlManager,\n              this.#editorUndoBar,\n              this.#supportsPinchToZoom\n            );\n            eventBus.dispatch(\"annotationeditoruimanager\", {\n              source: this,\n              uiManager: this.#annotationEditorUIManager,\n            });\n            if (mode !== AnnotationEditorType.NONE) {\n              this.#preloadEditingData(mode);\n              this.#annotationEditorUIManager.updateMode(mode);\n            }\n          } else {\n            console.error(`Invalid AnnotationEditor mode: ${mode}`);\n          }\n        }\n\n        const viewerElement =\n          this._scrollMode === ScrollMode.PAGE ? null : viewer;\n        const scale = this.currentScale;\n        const viewport = firstPdfPage.getViewport({\n          scale: scale * PixelsPerInch.PDF_TO_CSS_UNITS,\n        });\n        // Ensure that the various layers always get the correct initial size,\n        // see issue 15795.\n        viewer.style.setProperty(\"--scale-factor\", viewport.scale);\n\n        if (pageColors?.background) {\n          viewer.style.setProperty(\"--page-bg-color\", pageColors.background);\n        }\n        if (\n          pageColors?.foreground === \"CanvasText\" ||\n          pageColors?.background === \"Canvas\"\n        ) {\n          viewer.style.setProperty(\n            \"--hcm-highlight-filter\",\n            pdfDocument.filterFactory.addHighlightHCMFilter(\n              \"highlight\",\n              \"CanvasText\",\n              \"Canvas\",\n              \"HighlightText\",\n              \"Highlight\"\n            )\n          );\n          viewer.style.setProperty(\n            \"--hcm-highlight-selected-filter\",\n            pdfDocument.filterFactory.addHighlightHCMFilter(\n              \"highlight_selected\",\n              \"CanvasText\",\n              \"Canvas\",\n              \"HighlightText\",\n              \"ButtonText\"\n            )\n          );\n        }\n\n        for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n          const pageView = new PDFPageView({\n            container: viewerElement,\n            eventBus,\n            id: pageNum,\n            scale,\n            defaultViewport: viewport.clone(),\n            optionalContentConfigPromise,\n            renderingQueue: this.renderingQueue,\n            textLayerMode,\n            annotationMode,\n            imageResourcesPath: this.imageResourcesPath,\n            maxCanvasPixels: this.maxCanvasPixels,\n            maxCanvasDim: this.maxCanvasDim,\n            capCanvasAreaFactor: this.capCanvasAreaFactor,\n            enableDetailCanvas: this.enableDetailCanvas,\n            enableOptimizedPartialRendering:\n              this.enableOptimizedPartialRendering,\n            enableSelectionRendering: this.enableSelectionRendering,\n            imagesRightClickMinSize: this.imagesRightClickMinSize,\n            pageColors,\n            l10n: this.l10n,\n            layerProperties: this._layerProperties,\n            enableAutoLinking: this.#enableAutoLinking,\n            minDurationToUpdateCanvas: this.#minDurationToUpdateCanvas,\n            commentManager: this.#commentManager,\n            abortSignal: this.#abortSignal,\n          });\n          this._pages.push(pageView);\n        }\n        // Set the first `pdfPage` immediately, since it's already loaded,\n        // rather than having to repeat the `PDFDocumentProxy.getPage` call in\n        // the `this.#ensurePdfPageLoaded` method before rendering can start.\n        this._pages[0]?.setPdfPage(firstPdfPage);\n\n        if (this._scrollMode === ScrollMode.PAGE) {\n          // Ensure that the current page becomes visible on document load.\n          this.#ensurePageViewVisible();\n        } else if (this._spreadMode !== SpreadMode.NONE) {\n          this._updateSpreadMode();\n        }\n\n        eventBus.on(\n          \"annotationeditorlayerrendered\",\n          evt => {\n            if (this.#annotationEditorUIManager) {\n              // Ensure that the Editor buttons, in the toolbar, are updated.\n              eventBus.dispatch(\"annotationeditormodechanged\", {\n                source: this,\n                mode: this.#annotationEditorMode,\n              });\n            }\n          },\n          { once: true, signal, ...internalOpt }\n        );\n\n        // Fetch all the pages since the viewport is needed before printing\n        // starts to create the correct size canvas. Wait until one page is\n        // rendered so we don't tie up too many resources early on.\n        this.#onePageRenderedOrForceFetch(signal).then(async () => {\n          if (pdfDocument !== this.pdfDocument) {\n            return; // The document was closed while the first page rendered.\n          }\n          this.findController?.setDocument(pdfDocument); // Enable searching.\n          this._scriptingManager?.setDocument(pdfDocument); // Enable scripting.\n\n          if (this.#hiddenCopyElement) {\n            document.addEventListener(\n              \"copy\",\n              this.#copyCallback.bind(this, textLayerMode),\n              { signal }\n            );\n          }\n\n          // In addition to 'disableAutoFetch' being set, also attempt to reduce\n          // resource usage when loading *very* long/large documents.\n          if (\n            pdfDocument.loadingParams.disableAutoFetch ||\n            pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT\n          ) {\n            // XXX: Printing is semi-broken with auto fetch disabled.\n            this._pagesCapability.resolve();\n            return;\n          }\n          let getPagesLeft = pagesCount - 1; // The first page was already loaded.\n\n          if (getPagesLeft <= 0) {\n            this._pagesCapability.resolve();\n            return;\n          }\n          for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) {\n            const promise = pdfDocument.getPage(pageNum).then(\n              pdfPage => {\n                const pageView = this._pages[pageNum - 1];\n                if (!pageView.pdfPage) {\n                  pageView.setPdfPage(pdfPage);\n                }\n                if (--getPagesLeft === 0) {\n                  this._pagesCapability.resolve();\n                }\n              },\n              reason => {\n                console.error(\n                  `Unable to get page ${pageNum} to initialize viewer`,\n                  reason\n                );\n                if (--getPagesLeft === 0) {\n                  this._pagesCapability.resolve();\n                }\n              }\n            );\n\n            if (pageNum % PagesCountLimit.PAUSE_EAGER_PAGE_INIT === 0) {\n              await promise;\n            }\n          }\n        });\n\n        eventBus.dispatch(\"pagesinit\", { source: this });\n\n        pdfDocument.getMetadata().then(({ info }) => {\n          if (pdfDocument !== this.pdfDocument) {\n            return; // The document was closed while the metadata resolved.\n          }\n          if (info.Language) {\n            viewer.lang = info.Language;\n          }\n        });\n\n        if (this.defaultRenderingQueue) {\n          this.update();\n        }\n      })\n      .catch(reason => {\n        console.error(\"Unable to initialize viewer\", reason);\n\n        this._pagesCapability.reject(reason);\n      });\n  }\n\n  onPagesEdited({ pagesMapper, type, hasBeenCut, pageNumbers }) {\n    if (type === \"copy\") {\n      this.#copiedPageViews = new Map();\n      for (const pageNum of pageNumbers) {\n        this.#copiedPageViews.set(pageNum, this._pages[pageNum - 1]);\n      }\n      return;\n    }\n\n    if (type === \"cancelCopy\") {\n      this.#copiedPageViews = null;\n      return;\n    }\n\n    const isCut = type === \"cut\";\n    if (isCut || type === \"delete\") {\n      this.#savedPageViews = this._pages;\n      this.#deletedPageNumbers = pageNumbers;\n    }\n\n    if (type === \"cancelDelete\") {\n      this.#deletedPageNumbers = null;\n      if (!this.#savedPageViews) {\n        return;\n      }\n      const viewerElement =\n        this._scrollMode === ScrollMode.PAGE ? null : this.viewer;\n      if (viewerElement) {\n        this.#annotationEditorUIManager?.startUpdatePages();\n        const fragment = document.createDocumentFragment();\n        for (let i = 0, ii = this.#savedPageViews.length; i < ii; i++) {\n          const page = this.#savedPageViews[i];\n          page.updatePageNumber(i + 1);\n          fragment.append(page.div);\n        }\n        viewerElement.replaceChildren(fragment);\n        this.#annotationEditorUIManager?.endUpdatePages();\n      }\n      this._pages = this.#savedPageViews;\n      this.#savedPageViews = null;\n      return;\n    }\n\n    if (type === \"cleanSavedData\") {\n      if (this.#deletedPageNumbers) {\n        if (this.#savedPageViews) {\n          for (const pageNum of this.#deletedPageNumbers) {\n            this.#savedPageViews[pageNum - 1].deleteMe();\n          }\n          this.#savedPageViews = null;\n        }\n        this.#deletedPageNumbers = null;\n      }\n      return;\n    }\n\n    this._currentPageNumber = 0;\n    const prevPages = this._pages;\n    const newPages = (this._pages = []);\n\n    this.#annotationEditorUIManager?.startUpdatePages();\n\n    for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) {\n      const prevPageNumber = pagesMapper.getPrevPageNumber(i);\n      if (prevPageNumber < 0) {\n        let page = this.#copiedPageViews.get(-prevPageNumber);\n        if (hasBeenCut) {\n          page.updatePageNumber(i);\n        } else {\n          this.#annotationEditorUIManager?.clonePage(\n            -prevPageNumber - 1,\n            i - 1\n          );\n          page = page.clone(i);\n        }\n        newPages.push(page);\n        continue;\n      }\n      const page = prevPages[prevPageNumber - 1];\n      newPages.push(page);\n      page.updatePageNumber(i);\n    }\n\n    this.#annotationEditorUIManager?.endUpdatePages();\n\n    if (type === \"paste\") {\n      this.#copiedPageViews = null;\n    }\n\n    const viewerElement =\n      this._scrollMode === ScrollMode.PAGE ? null : this.viewer;\n    if (viewerElement) {\n      const fragment = document.createDocumentFragment();\n      for (const { div } of newPages) {\n        fragment.append(div);\n      }\n      viewerElement.replaceChildren(fragment);\n    }\n\n    setTimeout(() => {\n      this.forceRendering();\n    });\n  }\n\n  /**\n   * @param {Array|null} labels\n   */\n  setPageLabels(labels) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!labels) {\n      this._pageLabels = null;\n    } else if (\n      !(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)\n    ) {\n      this._pageLabels = null;\n      console.error(`setPageLabels: Invalid page labels.`);\n    } else {\n      this._pageLabels = labels;\n    }\n    // Update all the `PDFPageView` instances.\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null);\n    }\n  }\n\n  _resetView() {\n    this._pages = [];\n    this._currentPageNumber = 1;\n    this._currentScale = UNKNOWN_SCALE;\n    this._currentScaleValue = null;\n    this._pageLabels = null;\n    this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n    this._location = null;\n    this._pagesRotation = 0;\n    this._optionalContentConfigPromise = null;\n    this._firstPageCapability = Promise.withResolvers();\n    this._onePageRenderedCapability = Promise.withResolvers();\n    this._pagesCapability = Promise.withResolvers();\n    this._scrollMode = ScrollMode.VERTICAL;\n    this._previousScrollMode = ScrollMode.UNKNOWN;\n    this._spreadMode = SpreadMode.NONE;\n\n    this.#scrollModePageState = {\n      previousPageNumber: 1,\n      scrollDown: true,\n      pages: [],\n    };\n\n    this.#eventAC?.abort();\n    this.#eventAC = null;\n\n    // Remove the pages from the DOM...\n    this.viewer.textContent = \"\";\n    // ... and reset the Scroll mode CSS class(es) afterwards.\n    this._updateScrollMode();\n\n    this.viewer.removeAttribute(\"lang\");\n\n    this.#hiddenCopyElement?.remove();\n    this.#hiddenCopyElement = null;\n\n    this.#cleanupTimeouts();\n    this.#cleanupSwitchAnnotationEditorMode();\n  }\n\n  #ensurePageViewVisible() {\n    if (this._scrollMode !== ScrollMode.PAGE) {\n      throw new Error(\"#ensurePageViewVisible: Invalid scrollMode value.\");\n    }\n    const pageNumber = this._currentPageNumber,\n      state = this.#scrollModePageState,\n      viewer = this.viewer;\n\n    // Temporarily remove all the pages from the DOM...\n    viewer.textContent = \"\";\n    // ... and clear out the active ones.\n    state.pages.length = 0;\n\n    if (this._spreadMode === SpreadMode.NONE && !this.isInPresentationMode) {\n      // Finally, append the new page to the viewer.\n      const pageView = this._pages[pageNumber - 1];\n      viewer.append(pageView.div);\n\n      state.pages.push(pageView);\n    } else {\n      const pageIndexSet = new Set(),\n        parity = this._spreadMode - 1;\n\n      // Determine the pageIndices in the new spread.\n      if (parity === -1) {\n        // PresentationMode is active, with `SpreadMode.NONE` set.\n        pageIndexSet.add(pageNumber - 1);\n      } else if (pageNumber % 2 !== parity) {\n        // Left-hand side page.\n        pageIndexSet.add(pageNumber - 1);\n        pageIndexSet.add(pageNumber);\n      } else {\n        // Right-hand side page.\n        pageIndexSet.add(pageNumber - 2);\n        pageIndexSet.add(pageNumber - 1);\n      }\n\n      // Finally, append the new pages to the viewer and apply the spreadMode.\n      const spread = document.createElement(\"div\");\n      spread.className = \"spread\";\n\n      if (this.isInPresentationMode) {\n        const dummyPage = document.createElement(\"div\");\n        dummyPage.className = \"dummyPage\";\n        spread.append(dummyPage);\n      }\n\n      for (const i of pageIndexSet) {\n        const pageView = this._pages[i];\n        if (!pageView) {\n          continue;\n        }\n        spread.append(pageView.div);\n\n        state.pages.push(pageView);\n      }\n      viewer.append(spread);\n    }\n\n    state.scrollDown = pageNumber >= state.previousPageNumber;\n    state.previousPageNumber = pageNumber;\n  }\n\n  _scrollUpdate() {\n    if (this.pagesCount === 0) {\n      return;\n    }\n\n    if (this.#scrollTimeoutId) {\n      clearTimeout(this.#scrollTimeoutId);\n    }\n    this.#scrollTimeoutId = setTimeout(() => {\n      this.#scrollTimeoutId = null;\n      this.update();\n    }, 100);\n\n    this.update();\n  }\n\n  #scrollIntoView(pageView, pageSpot = null) {\n    const { div, id } = pageView;\n\n    // Ensure that `this._currentPageNumber` is correct, when `#scrollIntoView`\n    // is called directly (and not from `#resetCurrentPageView`).\n    if (this._currentPageNumber !== id) {\n      this._setCurrentPageNumber(id);\n    }\n    if (this._scrollMode === ScrollMode.PAGE) {\n      this.#ensurePageViewVisible();\n      // Ensure that rendering always occurs, to avoid showing a blank page,\n      // even if the current position doesn't change when the page is scrolled.\n      this.update();\n    }\n\n    if (!pageSpot && !this.isInPresentationMode) {\n      const left = div.offsetLeft + div.clientLeft,\n        right = left + div.clientWidth;\n      const { scrollLeft, clientWidth } = this.container;\n      if (\n        this._scrollMode === ScrollMode.HORIZONTAL ||\n        left < scrollLeft ||\n        right > scrollLeft + clientWidth\n      ) {\n        pageSpot = { left: 0, top: 0 };\n      }\n    }\n    scrollIntoView(div, pageSpot);\n\n    // Ensure that the correct *initial* document position is set, when any\n    // OpenParameters are used, for documents with non-default Scroll/Spread\n    // modes (fixes issue 15695). This is necessary since the scroll-handler\n    // invokes the `update`-method asynchronously, and `this._location` could\n    // thus be wrong when the initial zooming occurs in the default viewer.\n    if (!this._currentScaleValue && this._location) {\n      this._location = null;\n    }\n  }\n\n  /**\n   * Prevent unnecessary re-rendering of all pages when the scale changes\n   * only because of limited numerical precision.\n   */\n  #isSameScale(newScale) {\n    return (\n      newScale === this._currentScale ||\n      Math.abs(newScale - this._currentScale) < 1e-15\n    );\n  }\n\n  #setScaleUpdatePages(\n    newScale,\n    newValue,\n    { noScroll = false, preset = false, drawingDelay = -1, origin = null }\n  ) {\n    this.clearSelection();\n    this._currentScaleValue = newValue.toString();\n\n    if (this.#isSameScale(newScale)) {\n      if (preset) {\n        this.eventBus.dispatch(\"scalechanging\", {\n          source: this,\n          scale: newScale,\n          presetValue: newValue,\n        });\n      }\n      return;\n    }\n\n    this.viewer.style.setProperty(\n      \"--scale-factor\",\n      newScale * PixelsPerInch.PDF_TO_CSS_UNITS\n    );\n\n    const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000;\n    this.refresh(true, {\n      scale: newScale,\n      drawingDelay: postponeDrawing ? drawingDelay : -1,\n    });\n\n    if (postponeDrawing) {\n      this.#scaleTimeoutId = setTimeout(() => {\n        this.#scaleTimeoutId = null;\n        this.refresh();\n      }, drawingDelay);\n    }\n\n    const previousScale = this._currentScale;\n    this._currentScale = newScale;\n\n    if (!noScroll) {\n      let page = this._currentPageNumber,\n        dest;\n      if (\n        this._location &&\n        !(this.isInPresentationMode || this.isChangingPresentationMode)\n      ) {\n        page = this._location.pageNumber;\n        dest = [\n          null,\n          { name: \"XYZ\" },\n          this._location.left,\n          this._location.top,\n          null,\n        ];\n      }\n      this.scrollPageIntoView({\n        pageNumber: page,\n        destArray: dest,\n        allowNegativeOffset: true,\n      });\n      if (Array.isArray(origin)) {\n        // If the origin of the scaling transform is specified, preserve its\n        // location on screen. If not specified, scaling will fix the top-left\n        // corner of the visible PDF area.\n        const scaleDiff = newScale / previousScale - 1;\n        const [top, left] = this.containerTopLeft;\n        this.container.scrollLeft += (origin[0] - left) * scaleDiff;\n        this.container.scrollTop += (origin[1] - top) * scaleDiff;\n      }\n    }\n\n    this.eventBus.dispatch(\"scalechanging\", {\n      source: this,\n      scale: newScale,\n      presetValue: preset ? newValue : undefined,\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  get #pageWidthScaleFactor() {\n    if (\n      this._spreadMode !== SpreadMode.NONE &&\n      this._scrollMode !== ScrollMode.HORIZONTAL\n    ) {\n      return 2;\n    }\n    return 1;\n  }\n\n  #setScale(value, options) {\n    let scale = parseFloat(value);\n\n    if (scale > 0) {\n      options.preset = false;\n      this.#setScaleUpdatePages(scale, value, options);\n    } else {\n      const currentPage = this._pages[this._currentPageNumber - 1];\n      if (!currentPage) {\n        return;\n      }\n      let hPadding = SCROLLBAR_PADDING,\n        vPadding = VERTICAL_PADDING;\n\n      if (this.isInPresentationMode) {\n        // Pages have a 2px (transparent) border in PresentationMode, see\n        // the `web/pdf_viewer.css` file.\n        hPadding = vPadding = 4; // 2 * 2px\n        if (this._spreadMode !== SpreadMode.NONE) {\n          // Account for two pages being visible in PresentationMode, thus\n          // \"doubling\" the total border width.\n          hPadding *= 2;\n        }\n      } else if (\n        (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n        this.removePageBorders\n      ) {\n        hPadding = vPadding = 0;\n      } else if (this._scrollMode === ScrollMode.HORIZONTAL) {\n        [hPadding, vPadding] = [vPadding, hPadding]; // Swap the padding values.\n      }\n      const pageWidthScale =\n        (((this.container.clientWidth - hPadding) / currentPage.width) *\n          currentPage.scale) /\n        this.#pageWidthScaleFactor;\n      const pageHeightScale =\n        ((this.container.clientHeight - vPadding) / currentPage.height) *\n        currentPage.scale;\n      switch (value) {\n        case \"page-actual\":\n          scale = 1;\n          break;\n        case \"page-width\":\n          scale = pageWidthScale;\n          break;\n        case \"page-height\":\n          scale = pageHeightScale;\n          break;\n        case \"page-fit\":\n          scale = Math.min(pageWidthScale, pageHeightScale);\n          break;\n        case \"auto\":\n          // For pages in landscape mode, fit the page height to the viewer\n          // *unless* the page would thus become too wide to fit horizontally.\n          const horizontalScale = isPortraitOrientation(currentPage)\n            ? pageWidthScale\n            : Math.min(pageHeightScale, pageWidthScale);\n          scale = Math.min(MAX_AUTO_SCALE, horizontalScale);\n          break;\n        default:\n          console.error(`#setScale: \"${value}\" is an unknown zoom value.`);\n          return;\n      }\n      options.preset = true;\n      this.#setScaleUpdatePages(scale, value, options);\n    }\n  }\n\n  /**\n   * Refreshes page view: scrolls to the current page and updates the scale.\n   */\n  #resetCurrentPageView() {\n    const pageView = this._pages[this._currentPageNumber - 1];\n\n    if (this.isInPresentationMode) {\n      // Fixes the case when PDF has different page sizes.\n      this.#setScale(this._currentScaleValue, { noScroll: true });\n    }\n    this.#scrollIntoView(pageView);\n  }\n\n  /**\n   * @param {string} label - The page label.\n   * @returns {number|null} The page number corresponding to the page label,\n   *   or `null` when no page labels exist and/or the input is invalid.\n   */\n  pageLabelToPageNumber(label) {\n    if (!this._pageLabels) {\n      return null;\n    }\n    const i = this._pageLabels.indexOf(label);\n    if (i < 0) {\n      return null;\n    }\n    return i + 1;\n  }\n\n  /**\n   * @typedef {Object} ScrollPageIntoViewParameters\n   * @property {number} pageNumber - The page number.\n   * @property {Array} [destArray] - The original PDF destination array, in the\n   *   format: <page-ref> </XYZ|/FitXXX> <args..>\n   * @property {boolean} [allowNegativeOffset] - Allow negative page offsets.\n   *   The default value is `false`.\n   * @property {boolean} [ignoreDestinationZoom] - Ignore the zoom argument in\n   *   the destination array. The default value is `false`.\n   * @property {string} [center] - Center the view on the specified coordinates.\n   *   The default value is `null`. Possible values are: `null` (don't center),\n   *  `horizontal`, `vertical` and `both`.\n   */\n\n  /**\n   * Scrolls page into view.\n   * @param {ScrollPageIntoViewParameters} params\n   */\n  scrollPageIntoView({\n    pageNumber,\n    destArray = null,\n    allowNegativeOffset = false,\n    ignoreDestinationZoom = false,\n    center = null,\n  }) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const pageView =\n      Number.isInteger(pageNumber) && this._pages[pageNumber - 1];\n    if (!pageView) {\n      console.error(\n        `scrollPageIntoView: \"${pageNumber}\" is not a valid pageNumber parameter.`\n      );\n      return;\n    }\n\n    if (this.isInPresentationMode || !destArray) {\n      this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n      return;\n    }\n    let x = 0,\n      y = 0;\n    let width = 0,\n      height = 0,\n      widthScale,\n      heightScale;\n    const changeOrientation = pageView.rotation % 180 !== 0;\n    const pageWidth =\n      (changeOrientation ? pageView.height : pageView.width) /\n      pageView.scale /\n      PixelsPerInch.PDF_TO_CSS_UNITS;\n    const pageHeight =\n      (changeOrientation ? pageView.width : pageView.height) /\n      pageView.scale /\n      PixelsPerInch.PDF_TO_CSS_UNITS;\n    let scale = 0;\n    switch (destArray[1].name) {\n      case \"XYZ\":\n        x = destArray[2];\n        y = destArray[3];\n        scale = destArray[4];\n        // If x and/or y coordinates are not supplied, default to\n        // _top_ left of the page (not the obvious bottom left,\n        // since aligning the bottom of the intended page with the\n        // top of the window is rarely helpful).\n        x = x !== null ? x : 0;\n        y = y !== null ? y : pageHeight;\n        break;\n      case \"Fit\":\n      case \"FitB\":\n        scale = \"page-fit\";\n        break;\n      case \"FitH\":\n      case \"FitBH\":\n        y = destArray[2];\n        scale = \"page-width\";\n        // According to the PDF spec, section 12.3.2.2, a `null` value in the\n        // parameter should maintain the position relative to the new page.\n        if (y === null && this._location) {\n          x = this._location.left;\n          y = this._location.top;\n        } else if (typeof y !== \"number\" || y < 0) {\n          // The \"top\" value isn't optional, according to the spec, however some\n          // bad PDF generators will pretend that it is (fixes bug 1663390).\n          y = pageHeight;\n        }\n        break;\n      case \"FitV\":\n      case \"FitBV\":\n        x = destArray[2];\n        width = pageWidth;\n        height = pageHeight;\n        scale = \"page-height\";\n        break;\n      case \"FitR\":\n        x = destArray[2];\n        y = destArray[3];\n        width = destArray[4] - x;\n        height = destArray[5] - y;\n        let hPadding = SCROLLBAR_PADDING,\n          vPadding = VERTICAL_PADDING;\n\n        if (\n          (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n          this.removePageBorders\n        ) {\n          hPadding = vPadding = 0;\n        }\n        widthScale =\n          (this.container.clientWidth - hPadding) /\n          width /\n          PixelsPerInch.PDF_TO_CSS_UNITS;\n        heightScale =\n          (this.container.clientHeight - vPadding) /\n          height /\n          PixelsPerInch.PDF_TO_CSS_UNITS;\n        scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n        break;\n      default:\n        console.error(\n          `scrollPageIntoView: \"${destArray[1].name}\" is not a valid destination type.`\n        );\n        return;\n    }\n\n    if (!ignoreDestinationZoom) {\n      if (scale && scale !== this._currentScale) {\n        this.currentScaleValue = scale;\n      } else if (this._currentScale === UNKNOWN_SCALE) {\n        this.currentScaleValue = DEFAULT_SCALE_VALUE;\n      }\n    }\n\n    if (scale === \"page-fit\" && !destArray[4]) {\n      this.#scrollIntoView(pageView);\n      return;\n    }\n\n    const boundingRect = [\n      pageView.viewport.convertToViewportPoint(x, y),\n      pageView.viewport.convertToViewportPoint(x + width, y + height),\n    ];\n    let left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n    let top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n    if (center) {\n      if (center === \"both\" || center === \"vertical\") {\n        top -=\n          (this.container.clientHeight -\n            Math.abs(boundingRect[1][1] - boundingRect[0][1])) /\n          2;\n      }\n      if (center === \"both\" || center === \"horizontal\") {\n        left -=\n          (this.container.clientWidth -\n            Math.abs(boundingRect[1][0] - boundingRect[0][0])) /\n          2;\n      }\n    } else if (!allowNegativeOffset) {\n      // Some bad PDF generators will create destinations with e.g. top values\n      // that exceeds the page height. Ensure that offsets are not negative,\n      // to prevent a previous page from becoming visible (fixes bug 874482).\n      left = Math.max(left, 0);\n      top = Math.max(top, 0);\n    }\n    this.#scrollIntoView(pageView, /* pageSpot = */ { left, top });\n  }\n\n  _updateLocation(firstPage) {\n    const currentScale = this._currentScale;\n    const currentScaleValue = this._currentScaleValue;\n    const normalizedScaleValue =\n      parseFloat(currentScaleValue) === currentScale\n        ? Math.round(currentScale * 10000) / 100\n        : currentScaleValue;\n\n    const pageNumber = firstPage.id;\n    const currentPageView = this._pages[pageNumber - 1];\n    const container = this.container;\n    const topLeft = currentPageView.getPagePoint(\n      container.scrollLeft - firstPage.x,\n      container.scrollTop - firstPage.y\n    );\n    const intLeft = Math.round(topLeft[0]);\n    const intTop = Math.round(topLeft[1]);\n\n    let pdfOpenParams = `#page=${pageNumber}`;\n    if (!this.isInPresentationMode) {\n      pdfOpenParams += `&zoom=${normalizedScaleValue},${intLeft},${intTop}`;\n    }\n\n    this._location = {\n      pageNumber,\n      scale: normalizedScaleValue,\n      top: intTop,\n      left: intLeft,\n      rotation: this._pagesRotation,\n      pdfOpenParams,\n    };\n  }\n\n  update() {\n    const visible = this._getVisiblePages();\n    const visiblePages = visible.views,\n      numVisiblePages = visiblePages.length;\n\n    if (numVisiblePages === 0) {\n      return;\n    }\n    const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);\n    this.#buffer.resize(newCacheSize, visible.ids);\n\n    for (const { view, visibleArea } of visiblePages) {\n      view.updateVisibleArea(visibleArea);\n    }\n    for (const view of this.#buffer) {\n      if (!visible.ids.has(view.id)) {\n        view.updateVisibleArea(null);\n      }\n    }\n\n    this.renderingQueue.renderHighestPriority(visible);\n\n    const isSimpleLayout =\n      this._spreadMode === SpreadMode.NONE &&\n      (this._scrollMode === ScrollMode.PAGE ||\n        this._scrollMode === ScrollMode.VERTICAL);\n    const currentPageNumber = this._currentPageNumber;\n    let stillFullyVisible = false;\n\n    for (const page of visiblePages) {\n      if (page.percent < 100) {\n        break;\n      }\n      if (page.id === currentPageNumber && isSimpleLayout) {\n        stillFullyVisible = true;\n        break;\n      }\n    }\n    this._setCurrentPageNumber(\n      stillFullyVisible ? this._currentPageNumber : visiblePages[0].id\n    );\n\n    this._updateLocation(visible.first);\n    this.eventBus.dispatch(\"updateviewarea\", {\n      source: this,\n      location: this._location,\n    });\n  }\n\n  #switchToEditAnnotationMode() {\n    const visible = this._getVisiblePages();\n    const pagesToRefresh = [];\n    const { ids, views } = visible;\n    for (const page of views) {\n      const { view } = page;\n      if (!view.hasEditableAnnotations()) {\n        ids.delete(view.id);\n        continue;\n      }\n      pagesToRefresh.push(page);\n    }\n\n    if (pagesToRefresh.length === 0) {\n      return null;\n    }\n    this.renderingQueue.renderHighestPriority({\n      first: pagesToRefresh[0],\n      last: pagesToRefresh.at(-1),\n      views: pagesToRefresh,\n      ids,\n    });\n\n    return ids;\n  }\n\n  containsElement(element) {\n    return this.container.contains(element);\n  }\n\n  focus() {\n    this.container.focus();\n  }\n\n  get _isContainerRtl() {\n    return getComputedStyle(this.container).direction === \"rtl\";\n  }\n\n  get isInPresentationMode() {\n    return this.presentationModeState === PresentationModeState.FULLSCREEN;\n  }\n\n  get isChangingPresentationMode() {\n    return this.presentationModeState === PresentationModeState.CHANGING;\n  }\n\n  get isHorizontalScrollbarEnabled() {\n    return this.isInPresentationMode\n      ? false\n      : this.container.scrollWidth > this.container.clientWidth;\n  }\n\n  get isVerticalScrollbarEnabled() {\n    return this.isInPresentationMode\n      ? false\n      : this.container.scrollHeight > this.container.clientHeight;\n  }\n\n  _getVisiblePages() {\n    const views =\n        this._scrollMode === ScrollMode.PAGE\n          ? this.#scrollModePageState.pages\n          : this._pages,\n      horizontal = this._scrollMode === ScrollMode.HORIZONTAL,\n      rtl = horizontal && this._isContainerRtl;\n\n    return getVisibleElements({\n      scrollEl: this.container,\n      views,\n      sortByVisibility: true,\n      horizontal,\n      rtl,\n    });\n  }\n\n  cleanup() {\n    for (const pageView of this._pages) {\n      if (pageView.renderingState !== RenderingStates.FINISHED) {\n        pageView.reset();\n      }\n    }\n  }\n\n  /**\n   * @private\n   */\n  _cancelRendering() {\n    for (const pageView of this._pages) {\n      pageView.cancelRendering();\n    }\n  }\n\n  /**\n   * @param {PDFPageView} pageView\n   * @returns {Promise<PDFPageProxy | null>}\n   */\n  async #ensurePdfPageLoaded(pageView) {\n    if (pageView.pdfPage) {\n      return pageView.pdfPage;\n    }\n    try {\n      const pdfPage = await this.pdfDocument.getPage(pageView.id);\n      if (!pageView.pdfPage) {\n        pageView.setPdfPage(pdfPage);\n      }\n      return pdfPage;\n    } catch (reason) {\n      console.error(\"Unable to get page for page view\", reason);\n      return null; // Page error -- there is nothing that can be done.\n    }\n  }\n\n  #getScrollAhead(visible) {\n    if (visible.first?.id === 1) {\n      return true;\n    } else if (visible.last?.id === this.pagesCount) {\n      return false;\n    }\n    switch (this._scrollMode) {\n      case ScrollMode.PAGE:\n        return this.#scrollModePageState.scrollDown;\n      case ScrollMode.HORIZONTAL:\n        return this.scroll.right;\n    }\n    return this.scroll.down;\n  }\n\n  forceRendering(currentlyVisiblePages) {\n    const visiblePages = currentlyVisiblePages || this._getVisiblePages();\n    const scrollAhead = this.#getScrollAhead(visiblePages);\n    const preRenderExtra =\n      this._spreadMode !== SpreadMode.NONE &&\n      this._scrollMode !== ScrollMode.HORIZONTAL;\n\n    const ignoreDetailViews =\n      // If we are zooming, do not re-render the detail views. Re-renders on\n      // zoom happen with a delay, and once the rendering happens it will also\n      // trigger rendering of the detail views.\n      this.#scaleTimeoutId !== null ||\n      // If we are scrolling and the rendering of a detail view was just\n      // cancelled, it's because the user is scrolling too quickly and so\n      // we constantly need to re-render a different area.\n      // Don't attempt to re-render it: this will be done once the user\n      // stops scrolling.\n      (this.#scrollTimeoutId !== null &&\n        visiblePages.views.some(page => page.detailView?.renderingCancelled));\n\n    const pageView = this.renderingQueue.getHighestPriority(\n      visiblePages,\n      this._pages,\n      scrollAhead,\n      preRenderExtra,\n      ignoreDetailViews\n    );\n\n    if (pageView) {\n      this.#ensurePdfPageLoaded(pageView).then(() => {\n        this.renderingQueue.renderView(pageView);\n      });\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * @type {boolean} Whether all pages of the PDF document have identical\n   *   widths and heights.\n   */\n  get hasEqualPageSizes() {\n    const firstPageView = this._pages[0];\n    for (let i = 1, ii = this._pages.length; i < ii; ++i) {\n      const pageView = this._pages[i];\n      if (\n        pageView.width !== firstPageView.width ||\n        pageView.height !== firstPageView.height\n      ) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Returns sizes of the pages.\n   * @returns {Array} Array of objects with width/height/rotation fields.\n   */\n  getPagesOverview() {\n    let initialOrientation;\n    return this._pages.map(pageView => {\n      const viewport = pageView.pdfPage.getViewport({ scale: 1 });\n      const orientation = isPortraitOrientation(viewport);\n      if (initialOrientation === undefined) {\n        initialOrientation = orientation;\n      } else if (\n        this.enablePrintAutoRotate &&\n        orientation !== initialOrientation\n      ) {\n        // Rotate to fit the initial orientation.\n        return {\n          width: viewport.height,\n          height: viewport.width,\n          rotation: (viewport.rotation - 90) % 360,\n        };\n      }\n      return {\n        width: viewport.width,\n        height: viewport.height,\n        rotation: viewport.rotation,\n      };\n    });\n  }\n\n  /**\n   * @type {Promise<OptionalContentConfig | null>}\n   */\n  get optionalContentConfigPromise() {\n    if (!this.pdfDocument) {\n      return Promise.resolve(null);\n    }\n    if (!this._optionalContentConfigPromise) {\n      console.error(\"optionalContentConfigPromise: Not initialized yet.\");\n      // Prevent issues if the getter is accessed *before* the `onePageRendered`\n      // promise has resolved; won't (normally) happen in the default viewer.\n      return this.pdfDocument.getOptionalContentConfig({ intent: \"display\" });\n    }\n    return this._optionalContentConfigPromise;\n  }\n\n  /**\n   * @param {Promise<OptionalContentConfig>} promise - A promise that is\n   *   resolved with an {@link OptionalContentConfig} instance.\n   */\n  set optionalContentConfigPromise(promise) {\n    if (!(promise instanceof Promise)) {\n      throw new Error(`Invalid optionalContentConfigPromise: ${promise}`);\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!this._optionalContentConfigPromise) {\n      // Ignore the setter *before* the `onePageRendered` promise has resolved,\n      // since it'll be overwritten anyway; won't happen in the default viewer.\n      return;\n    }\n    this._optionalContentConfigPromise = promise;\n\n    this.refresh(false, { optionalContentConfigPromise: promise });\n\n    this.eventBus.dispatch(\"optionalcontentconfigchanged\", {\n      source: this,\n      promise,\n    });\n  }\n\n  /**\n   * @type {number} One of the values in {ScrollMode}.\n   */\n  get scrollMode() {\n    return this._scrollMode;\n  }\n\n  /**\n   * @param {number} mode - The direction in which the document pages should be\n   *   laid out within the scrolling container.\n   *   The constants from {ScrollMode} should be used.\n   */\n  set scrollMode(mode) {\n    if (\n      typeof PDFJSDev === \"undefined\"\n        ? window.isGECKOVIEW\n        : PDFJSDev.test(\"GECKOVIEW\")\n    ) {\n      // NOTE: Always ignore the pageLayout in GeckoView since there's\n      // no UI available to change Scroll/Spread modes for the user.\n      return;\n    }\n    if (this._scrollMode === mode) {\n      return; // The Scroll mode didn't change.\n    }\n    if (!isValidScrollMode(mode)) {\n      throw new Error(`Invalid scroll mode: ${mode}`);\n    }\n    if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) {\n      return; // Disabled for performance reasons.\n    }\n    this._previousScrollMode = this._scrollMode;\n\n    this.clearSelection();\n    this._scrollMode = mode;\n    this.eventBus.dispatch(\"scrollmodechanged\", { source: this, mode });\n\n    this._updateScrollMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateScrollMode(pageNumber = null) {\n    const scrollMode = this._scrollMode,\n      viewer = this.viewer;\n\n    viewer.classList.toggle(\n      \"scrollHorizontal\",\n      scrollMode === ScrollMode.HORIZONTAL\n    );\n    viewer.classList.toggle(\"scrollWrapped\", scrollMode === ScrollMode.WRAPPED);\n\n    if (!this.pdfDocument || !pageNumber) {\n      return;\n    }\n\n    if (scrollMode === ScrollMode.PAGE) {\n      this.#ensurePageViewVisible();\n    } else if (this._previousScrollMode === ScrollMode.PAGE) {\n      // Ensure that the current spreadMode is still applied correctly when\n      // the *previous* scrollMode was `ScrollMode.PAGE`.\n      this._updateSpreadMode();\n    }\n    // Non-numeric scale values can be sensitive to the scroll orientation.\n    // Call this before re-scrolling to the current page, to ensure that any\n    // changes in scale don't move the current page.\n    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n      this.#setScale(this._currentScaleValue, { noScroll: true });\n    }\n    this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n    this.update();\n  }\n\n  /**\n   * @type {number} One of the values in {SpreadMode}.\n   */\n  get spreadMode() {\n    return this._spreadMode;\n  }\n\n  /**\n   * @param {number} mode - Group the pages in spreads, starting with odd- or\n   *   even-number pages (unless `SpreadMode.NONE` is used).\n   *   The constants from {SpreadMode} should be used.\n   */\n  set spreadMode(mode) {\n    if (\n      typeof PDFJSDev === \"undefined\"\n        ? window.isGECKOVIEW\n        : PDFJSDev.test(\"GECKOVIEW\")\n    ) {\n      // NOTE: Always ignore the pageLayout in GeckoView since there's\n      // no UI available to change Scroll/Spread modes for the user.\n      return;\n    }\n    if (this._spreadMode === mode) {\n      return; // The Spread mode didn't change.\n    }\n    if (!isValidSpreadMode(mode)) {\n      throw new Error(`Invalid spread mode: ${mode}`);\n    }\n    this.clearSelection();\n    this._spreadMode = mode;\n    this.eventBus.dispatch(\"spreadmodechanged\", { source: this, mode });\n\n    this._updateSpreadMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateSpreadMode(pageNumber = null) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const viewer = this.viewer,\n      pages = this._pages;\n\n    if (this._scrollMode === ScrollMode.PAGE) {\n      this.#ensurePageViewVisible();\n    } else {\n      // Temporarily remove all the pages from the DOM.\n      viewer.textContent = \"\";\n\n      if (this._spreadMode === SpreadMode.NONE) {\n        for (const pageView of this._pages) {\n          viewer.append(pageView.div);\n        }\n      } else {\n        const parity = this._spreadMode - 1;\n        let spread = null;\n        for (let i = 0, ii = pages.length; i < ii; ++i) {\n          if (spread === null) {\n            spread = document.createElement(\"div\");\n            spread.className = \"spread\";\n            viewer.append(spread);\n          } else if (i % 2 === parity) {\n            spread = spread.cloneNode(false);\n            viewer.append(spread);\n          }\n          spread.append(pages[i].div);\n        }\n      }\n    }\n\n    if (!pageNumber) {\n      return;\n    }\n    // Non-numeric scale values can be sensitive to the scroll orientation.\n    // Call this before re-scrolling to the current page, to ensure that any\n    // changes in scale don't move the current page.\n    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n      this.#setScale(this._currentScaleValue, { noScroll: true });\n    }\n    this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n    this.update();\n  }\n\n  #getPageAdvance(currentPageNumber, previous = false) {\n    switch (this._scrollMode) {\n      case ScrollMode.WRAPPED: {\n        const { views } = this._getVisiblePages(),\n          pageLayout = new Map();\n\n        // Determine the current (visible) page layout.\n        for (const { id, y, percent, widthPercent } of views) {\n          if (percent === 0 || widthPercent < 100) {\n            continue;\n          }\n          pageLayout.getOrInsertComputed(y, makeArr).push(id);\n        }\n        // Find the row of the current page.\n        for (const yArray of pageLayout.values()) {\n          const currentIndex = yArray.indexOf(currentPageNumber);\n          if (currentIndex === -1) {\n            continue;\n          }\n          const numPages = yArray.length;\n          if (numPages === 1) {\n            break;\n          }\n          // Handle documents with varying page sizes.\n          if (previous) {\n            for (let i = currentIndex - 1, ii = 0; i >= ii; i--) {\n              const currentId = yArray[i],\n                expectedId = yArray[i + 1] - 1;\n              if (currentId < expectedId) {\n                return currentPageNumber - expectedId;\n              }\n            }\n          } else {\n            for (let i = currentIndex + 1, ii = numPages; i < ii; i++) {\n              const currentId = yArray[i],\n                expectedId = yArray[i - 1] + 1;\n              if (currentId > expectedId) {\n                return expectedId - currentPageNumber;\n              }\n            }\n          }\n          // The current row is \"complete\", advance to the previous/next one.\n          if (previous) {\n            const firstId = yArray[0];\n            if (firstId < currentPageNumber) {\n              return currentPageNumber - firstId + 1;\n            }\n          } else {\n            const lastId = yArray[numPages - 1];\n            if (lastId > currentPageNumber) {\n              return lastId - currentPageNumber + 1;\n            }\n          }\n          break;\n        }\n        break;\n      }\n      case ScrollMode.HORIZONTAL: {\n        break;\n      }\n      case ScrollMode.PAGE:\n      case ScrollMode.VERTICAL: {\n        if (this._spreadMode === SpreadMode.NONE) {\n          break; // Normal vertical scrolling.\n        }\n        const parity = this._spreadMode - 1;\n\n        if (previous && currentPageNumber % 2 !== parity) {\n          break; // Left-hand side page.\n        } else if (!previous && currentPageNumber % 2 === parity) {\n          break; // Right-hand side page.\n        }\n        const { views } = this._getVisiblePages(),\n          expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1;\n\n        for (const { id, percent, widthPercent } of views) {\n          if (id !== expectedId) {\n            continue;\n          }\n          if (percent > 0 && widthPercent === 100) {\n            return 2;\n          }\n          break;\n        }\n        break;\n      }\n    }\n    return 1;\n  }\n\n  /**\n   * Go to the next page, taking scroll/spread-modes into account.\n   * @returns {boolean} Whether navigation occurred.\n   */\n  nextPage() {\n    const currentPageNumber = this._currentPageNumber,\n      pagesCount = this.pagesCount;\n\n    if (currentPageNumber >= pagesCount) {\n      return false;\n    }\n    const advance =\n      this.#getPageAdvance(currentPageNumber, /* previous = */ false) || 1;\n\n    this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount);\n    return true;\n  }\n\n  /**\n   * Go to the previous page, taking scroll/spread-modes into account.\n   * @returns {boolean} Whether navigation occurred.\n   */\n  previousPage() {\n    const currentPageNumber = this._currentPageNumber;\n\n    if (currentPageNumber <= 1) {\n      return false;\n    }\n    const advance =\n      this.#getPageAdvance(currentPageNumber, /* previous = */ true) || 1;\n\n    this.currentPageNumber = Math.max(currentPageNumber - advance, 1);\n    return true;\n  }\n\n  /**\n   * @typedef {Object} ChangeScaleOptions\n   * @property {number} [drawingDelay]\n   * @property {number} [scaleFactor]\n   * @property {number} [steps]\n   * @property {Array} [origin] x and y coordinates of the scale\n   *                            transformation origin.\n   */\n\n  /**\n   * Changes the current zoom level by the specified amount.\n   * @param {ChangeScaleOptions} [options]\n   */\n  updateScale({ drawingDelay, scaleFactor = null, steps = null, origin }) {\n    if (steps === null && scaleFactor === null) {\n      throw new Error(\n        \"Invalid updateScale options: either `steps` or `scaleFactor` must be provided.\"\n      );\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    let newScale = this._currentScale;\n    if (scaleFactor > 0 && scaleFactor !== 1) {\n      newScale = Math.round(newScale * scaleFactor * 100) / 100;\n    } else if (steps) {\n      const delta = steps > 0 ? DEFAULT_SCALE_DELTA : 1 / DEFAULT_SCALE_DELTA;\n      const round = steps > 0 ? Math.ceil : Math.floor;\n      steps = Math.abs(steps);\n      do {\n        newScale = round((newScale * delta).toFixed(2) * 10) / 10;\n      } while (--steps > 0);\n    }\n    newScale = MathClamp(newScale, MIN_SCALE, MAX_SCALE);\n    this.#setScale(newScale, { noScroll: false, drawingDelay, origin });\n  }\n\n  /**\n   * Increase the current zoom level one, or more, times.\n   * @param {ChangeScaleOptions} [options]\n   */\n  increaseScale(options = {}) {\n    this.updateScale({ ...options, steps: options.steps ?? 1 });\n  }\n\n  /**\n   * Decrease the current zoom level one, or more, times.\n   * @param {ChangeScaleOptions} [options]\n   */\n  decreaseScale(options = {}) {\n    this.updateScale({ ...options, steps: -(options.steps ?? 1) });\n  }\n\n  #updateContainerHeightCss(height = this.container.clientHeight) {\n    if (height !== this.#previousContainerHeight) {\n      this.#previousContainerHeight = height;\n      docStyle.setProperty(\"--viewer-container-height\", `${height}px`);\n    }\n  }\n\n  #resizeObserverCallback(entries) {\n    for (const entry of entries) {\n      if (entry.target === this.container) {\n        this.#updateContainerHeightCss(\n          Math.floor(entry.borderBoxSize[0].blockSize)\n        );\n        this.#containerTopLeft = null;\n        break;\n      }\n    }\n  }\n\n  get containerTopLeft() {\n    return (this.#containerTopLeft ||= [\n      this.container.offsetTop,\n      this.container.offsetLeft,\n    ]);\n  }\n\n  #cleanupTimeouts() {\n    if (this.#scaleTimeoutId !== null) {\n      clearTimeout(this.#scaleTimeoutId);\n      this.#scaleTimeoutId = null;\n    }\n    if (this.#scrollTimeoutId !== null) {\n      clearTimeout(this.#scrollTimeoutId);\n      this.#scrollTimeoutId = null;\n    }\n  }\n\n  #cleanupSwitchAnnotationEditorMode() {\n    this.#switchAnnotationEditorModeAC?.abort();\n    this.#switchAnnotationEditorModeAC = null;\n\n    if (this.#switchAnnotationEditorModeTimeoutId !== null) {\n      clearTimeout(this.#switchAnnotationEditorModeTimeoutId);\n      this.#switchAnnotationEditorModeTimeoutId = null;\n    }\n  }\n\n  #preloadEditingData(mode) {\n    switch (mode) {\n      case AnnotationEditorType.STAMP:\n        this.#mlManager?.loadModel(\"altText\");\n        break;\n      case AnnotationEditorType.SIGNATURE:\n        // Start to load the signature data.\n        this.#signatureManager?.loadSignatures();\n        break;\n    }\n  }\n\n  get annotationEditorMode() {\n    return this.#annotationEditorUIManager\n      ? this.#annotationEditorMode\n      : AnnotationEditorType.DISABLE;\n  }\n\n  /**\n   * @typedef {Object} AnnotationEditorModeOptions\n   * @property {number} mode - The editor mode (none, FreeText, ink, ...).\n   * @property {string|null} [editId] - ID of the existing annotation to edit.\n   * @property {boolean} [isFromKeyboard] - True if the mode change is due to a\n   *   keyboard action.\n   * @property {boolean} [mustEnterInEditMode] - True if the editor must enter\n   *   edit mode.\n   * @property {boolean} [editComment] - True if the editor must enter\n   *   comment edit mode.\n   */\n\n  /**\n   * @param {AnnotationEditorModeOptions} options\n   */\n  set annotationEditorMode({\n    mode,\n    editId = null,\n    isFromKeyboard = false,\n    mustEnterInEditMode = false,\n    editComment = false,\n  }) {\n    if (!this.#annotationEditorUIManager) {\n      throw new Error(`The AnnotationEditor is not enabled.`);\n    }\n    if (this.#annotationEditorMode === mode) {\n      return; // The AnnotationEditor mode didn't change.\n    }\n    if (!isValidAnnotationEditorMode(mode)) {\n      throw new Error(`Invalid AnnotationEditor mode: ${mode}`);\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    this.#preloadEditingData(mode);\n\n    const { eventBus, pdfDocument } = this;\n    const updater = async () => {\n      this.#cleanupSwitchAnnotationEditorMode();\n      this.#annotationEditorMode = mode;\n      await this.#annotationEditorUIManager.updateMode(\n        mode,\n        editId,\n        /* isFromUser = */ true,\n        isFromKeyboard,\n        mustEnterInEditMode,\n        editComment\n      );\n      if (\n        mode !== this.#annotationEditorMode ||\n        pdfDocument !== this.pdfDocument\n      ) {\n        // Since `updateMode` is async, the active mode could have changed.\n        return;\n      }\n      eventBus.dispatch(\"annotationeditormodechanged\", {\n        source: this,\n        mode,\n      });\n    };\n\n    if (\n      mode === AnnotationEditorType.NONE ||\n      this.#annotationEditorMode === AnnotationEditorType.NONE\n    ) {\n      const isEditing = mode !== AnnotationEditorType.NONE;\n      if (!isEditing) {\n        this.pdfDocument.annotationStorage.resetModifiedIds();\n      }\n      // We need to cleanup whatever pages being rendered.\n      this.cleanup();\n      for (const pageView of this._pages) {\n        pageView.toggleEditingMode(isEditing);\n      }\n      // We must call #switchToEditAnnotationMode unconditionally to ensure that\n      // page is rendered if it's useful or not.\n      const idsToRefresh = this.#switchToEditAnnotationMode();\n      if (isEditing && idsToRefresh) {\n        // We're editing so we must switch to editing mode when the rendering is\n        // done.\n        this.#cleanupSwitchAnnotationEditorMode();\n        this.#switchAnnotationEditorModeAC = new AbortController();\n        const signal = AbortSignal.any([\n          this.#eventAC.signal,\n          this.#switchAnnotationEditorModeAC.signal,\n        ]);\n\n        eventBus.on(\n          \"pagerendered\",\n          ({ pageNumber }) => {\n            idsToRefresh.delete(pageNumber);\n            if (idsToRefresh.size === 0) {\n              this.#switchAnnotationEditorModeTimeoutId = setTimeout(\n                updater,\n                0\n              );\n            }\n          },\n          { signal, ...internalOpt }\n        );\n        return;\n      }\n    }\n    updater();\n  }\n\n  refresh(noUpdate = false, updateArgs = Object.create(null)) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    for (const pageView of this._pages) {\n      pageView.update(updateArgs);\n    }\n    this.#cleanupTimeouts();\n\n    if (!noUpdate) {\n      this.update();\n    }\n  }\n}\n\nexport { PagesCountLimit, PDFPageViewBuffer, PDFViewer };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n\nimport {\n  CursorTool,\n  ScrollMode,\n  SpreadMode,\n  toggleCheckedBtn,\n  toggleExpandedBtn,\n} from \"./ui_utils.js\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { PagesCountLimit } from \"./pdf_viewer.js\";\n\n/**\n * @typedef {Object} SecondaryToolbarOptions\n * @property {HTMLDivElement} toolbar - Container for the secondary toolbar.\n * @property {HTMLButtonElement} toggleButton - Button to toggle the visibility\n *   of the secondary toolbar.\n * @property {HTMLButtonElement} presentationModeButton - Button for entering\n *   presentation mode.\n * @property {HTMLButtonElement} openFileButton - Button to open a file.\n * @property {HTMLButtonElement} printButton - Button to print the document.\n * @property {HTMLButtonElement} downloadButton - Button to download the\n *   document.\n * @property {HTMLAnchorElement} viewBookmarkButton - Button to obtain a\n *   bookmark link to the current location in the document.\n * @property {HTMLButtonElement} firstPageButton - Button to go to the first\n *   page in the document.\n * @property {HTMLButtonElement} lastPageButton - Button to go to the last page\n *   in the document.\n * @property {HTMLButtonElement} pageRotateCwButton - Button to rotate the pages\n *   clockwise.\n * @property {HTMLButtonElement} pageRotateCcwButton - Button to rotate the\n *   pages counterclockwise.\n * @property {HTMLButtonElement} cursorSelectToolButton - Button to enable the\n *   select tool.\n * @property {HTMLButtonElement} cursorHandToolButton - Button to enable the\n *   hand tool.\n * @property {HTMLButtonElement} imageAltTextSettingsButton - Button for opening\n *   the image alt-text settings dialog.\n * @property {HTMLButtonElement} documentPropertiesButton - Button for opening\n *   the document properties dialog.\n */\n\nclass SecondaryToolbar {\n  #opts;\n\n  /**\n   * @param {SecondaryToolbarOptions} options\n   * @param {EventBus} eventBus\n   */\n  constructor(options, eventBus) {\n    this.#opts = options;\n    const buttons = [\n      {\n        element: options.presentationModeButton,\n        eventName: \"presentationmode\",\n        close: true,\n      },\n      { element: options.printButton, eventName: \"print\", close: true },\n      { element: options.downloadButton, eventName: \"download\", close: true },\n      { element: options.viewBookmarkButton, eventName: null, close: true },\n      { element: options.firstPageButton, eventName: \"firstpage\", close: true },\n      { element: options.lastPageButton, eventName: \"lastpage\", close: true },\n      {\n        element: options.pageRotateCwButton,\n        eventName: \"rotatecw\",\n        close: false,\n      },\n      {\n        element: options.pageRotateCcwButton,\n        eventName: \"rotateccw\",\n        close: false,\n      },\n      {\n        element: options.cursorSelectToolButton,\n        eventName: \"switchcursortool\",\n        eventDetails: { tool: CursorTool.SELECT },\n        close: true,\n      },\n      {\n        element: options.cursorHandToolButton,\n        eventName: \"switchcursortool\",\n        eventDetails: { tool: CursorTool.HAND },\n        close: true,\n      },\n      {\n        element: options.scrollPageButton,\n        eventName: \"switchscrollmode\",\n        eventDetails: { mode: ScrollMode.PAGE },\n        close: true,\n      },\n      {\n        element: options.scrollVerticalButton,\n        eventName: \"switchscrollmode\",\n        eventDetails: { mode: ScrollMode.VERTICAL },\n        close: true,\n      },\n      {\n        element: options.scrollHorizontalButton,\n        eventName: \"switchscrollmode\",\n        eventDetails: { mode: ScrollMode.HORIZONTAL },\n        close: true,\n      },\n      {\n        element: options.scrollWrappedButton,\n        eventName: \"switchscrollmode\",\n        eventDetails: { mode: ScrollMode.WRAPPED },\n        close: true,\n      },\n      {\n        element: options.spreadNoneButton,\n        eventName: \"switchspreadmode\",\n        eventDetails: { mode: SpreadMode.NONE },\n        close: true,\n      },\n      {\n        element: options.spreadOddButton,\n        eventName: \"switchspreadmode\",\n        eventDetails: { mode: SpreadMode.ODD },\n        close: true,\n      },\n      {\n        element: options.spreadEvenButton,\n        eventName: \"switchspreadmode\",\n        eventDetails: { mode: SpreadMode.EVEN },\n        close: true,\n      },\n      {\n        element: options.imageAltTextSettingsButton,\n        eventName: \"imagealttextsettings\",\n        close: true,\n      },\n      {\n        element: options.documentPropertiesButton,\n        eventName: \"documentproperties\",\n        close: true,\n      },\n    ];\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      buttons.push({\n        element: options.openFileButton,\n        eventName: \"openfile\",\n        close: true,\n      });\n    }\n\n    this.eventBus = eventBus;\n    this.opened = false;\n\n    // Bind the event listeners for click, cursor tool, and scroll/spread mode\n    // actions.\n    this.#bindListeners(buttons);\n\n    this.reset();\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get isOpen() {\n    return this.opened;\n  }\n\n  setPageNumber(pageNumber) {\n    this.pageNumber = pageNumber;\n    this.#updateUIState();\n  }\n\n  setPagesCount(pagesCount) {\n    this.pagesCount = pagesCount;\n    this.#updateUIState();\n  }\n\n  reset() {\n    this.pageNumber = 0;\n    this.pagesCount = 0;\n    this.#updateUIState();\n\n    // Reset the Scroll/Spread buttons too, since they're document specific.\n    this.eventBus.dispatch(\"switchcursortool\", { source: this, reset: true });\n    this.#scrollModeChanged({ mode: ScrollMode.VERTICAL });\n    this.#spreadModeChanged({ mode: SpreadMode.NONE });\n  }\n\n  #updateUIState() {\n    const {\n      firstPageButton,\n      lastPageButton,\n      pageRotateCwButton,\n      pageRotateCcwButton,\n    } = this.#opts;\n\n    firstPageButton.disabled = this.pageNumber <= 1;\n    lastPageButton.disabled = this.pageNumber >= this.pagesCount;\n    pageRotateCwButton.disabled = this.pagesCount === 0;\n    pageRotateCcwButton.disabled = this.pagesCount === 0;\n  }\n\n  #bindListeners(buttons) {\n    const { eventBus } = this;\n    const { toggleButton } = this.#opts;\n    // Button to toggle the visibility of the secondary toolbar.\n    toggleButton.addEventListener(\"click\", this.toggle.bind(this));\n\n    // All items within the secondary toolbar.\n    for (const { element, eventName, close, eventDetails } of buttons) {\n      element.addEventListener(\"click\", evt => {\n        if (eventName !== null) {\n          eventBus.dispatch(eventName, { source: this, ...eventDetails });\n        }\n        if (close) {\n          this.close();\n        }\n        eventBus.dispatch(\"reporttelemetry\", {\n          source: this,\n          details: {\n            type: \"buttons\",\n            data: { id: element.id },\n          },\n        });\n      });\n    }\n\n    eventBus.on(\n      \"cursortoolchanged\",\n      this.#cursorToolChanged.bind(this),\n      internalOpt\n    );\n    eventBus.on(\n      \"scrollmodechanged\",\n      this.#scrollModeChanged.bind(this),\n      internalOpt\n    );\n    eventBus.on(\n      \"spreadmodechanged\",\n      this.#spreadModeChanged.bind(this),\n      internalOpt\n    );\n  }\n\n  #cursorToolChanged({ tool, disabled }) {\n    const { cursorSelectToolButton, cursorHandToolButton } = this.#opts;\n\n    toggleCheckedBtn(cursorSelectToolButton, tool === CursorTool.SELECT);\n    toggleCheckedBtn(cursorHandToolButton, tool === CursorTool.HAND);\n\n    cursorSelectToolButton.disabled = disabled;\n    cursorHandToolButton.disabled = disabled;\n  }\n\n  #scrollModeChanged({ mode }) {\n    const {\n      scrollPageButton,\n      scrollVerticalButton,\n      scrollHorizontalButton,\n      scrollWrappedButton,\n      spreadNoneButton,\n      spreadOddButton,\n      spreadEvenButton,\n    } = this.#opts;\n\n    toggleCheckedBtn(scrollPageButton, mode === ScrollMode.PAGE);\n    toggleCheckedBtn(scrollVerticalButton, mode === ScrollMode.VERTICAL);\n    toggleCheckedBtn(scrollHorizontalButton, mode === ScrollMode.HORIZONTAL);\n    toggleCheckedBtn(scrollWrappedButton, mode === ScrollMode.WRAPPED);\n\n    // Permanently *disable* the Scroll buttons when PAGE-scrolling is being\n    // enforced for *very* long/large documents; please see the `BaseViewer`.\n    const forceScrollModePage =\n      this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE;\n    scrollPageButton.disabled = forceScrollModePage;\n    scrollVerticalButton.disabled = forceScrollModePage;\n    scrollHorizontalButton.disabled = forceScrollModePage;\n    scrollWrappedButton.disabled = forceScrollModePage;\n\n    // Temporarily *disable* the Spread buttons when horizontal scrolling is\n    // enabled, since the non-default Spread modes doesn't affect the layout.\n    const isHorizontal = mode === ScrollMode.HORIZONTAL;\n    spreadNoneButton.disabled = isHorizontal;\n    spreadOddButton.disabled = isHorizontal;\n    spreadEvenButton.disabled = isHorizontal;\n  }\n\n  #spreadModeChanged({ mode }) {\n    const { spreadNoneButton, spreadOddButton, spreadEvenButton } = this.#opts;\n\n    toggleCheckedBtn(spreadNoneButton, mode === SpreadMode.NONE);\n    toggleCheckedBtn(spreadOddButton, mode === SpreadMode.ODD);\n    toggleCheckedBtn(spreadEvenButton, mode === SpreadMode.EVEN);\n  }\n\n  open() {\n    if (this.opened) {\n      return;\n    }\n    this.opened = true;\n\n    const { toggleButton, toolbar } = this.#opts;\n    toggleExpandedBtn(toggleButton, true, toolbar);\n  }\n\n  close() {\n    if (!this.opened) {\n      return;\n    }\n    this.opened = false;\n\n    const { toggleButton, toolbar } = this.#opts;\n    toggleExpandedBtn(toggleButton, false, toolbar);\n  }\n\n  toggle() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n}\n\nexport { SecondaryToolbar };\n","/* Copyright 2025 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationEditorParamsType,\n  DOMSVGFactory,\n  noContextMenu,\n  SignatureExtractor,\n  stopEvent,\n  SupportedImageMimeTypes,\n} from \"pdfjs-lib\";\nimport { internalOpt } from \"./internal_evt.js\";\n\n// Default height of the added signature in page coordinates.\nconst DEFAULT_HEIGHT_IN_PAGE = 40;\n\nclass SignatureManager {\n  #addButton;\n\n  #tabsToAltText = null;\n\n  #clearButton;\n\n  #clearDescription;\n\n  #currentEditor;\n\n  #description;\n\n  #dialog;\n\n  #drawCurves = null;\n\n  #drawPlaceholder;\n\n  #drawPath = null;\n\n  #drawPathString = \"\";\n\n  #drawPoints = null;\n\n  #drawSVG;\n\n  #drawThickness;\n\n  #errorBar;\n\n  #errorDescription;\n\n  #errorTitle;\n\n  #extractedSignatureData = null;\n\n  #imagePath = null;\n\n  #imagePicker;\n\n  #imagePickerLink;\n\n  #imagePlaceholder;\n\n  #imageSVG;\n\n  #saveCheckbox;\n\n  #saveContainer;\n\n  #tabButtons;\n\n  #addSignatureToolbarButton;\n\n  #loadSignaturesPromise = null;\n\n  #typeInput;\n\n  #currentTab = null;\n\n  #currentTabAC = null;\n\n  #hasDescriptionChanged = false;\n\n  #eventBus;\n\n  #isStorageFull = false;\n\n  #l10n;\n\n  #overlayManager;\n\n  #editDescriptionDialog;\n\n  #signatureStorage;\n\n  #uiManager = null;\n\n  static #l10nDescription = null;\n\n  constructor(\n    {\n      dialog,\n      panels,\n      typeButton,\n      typeInput,\n      drawButton,\n      drawPlaceholder,\n      drawSVG,\n      drawThickness,\n      imageButton,\n      imageSVG,\n      imagePlaceholder,\n      imagePicker,\n      imagePickerLink,\n      description,\n      clearButton,\n      cancelButton,\n      addButton,\n      errorCloseButton,\n      errorBar,\n      errorTitle,\n      errorDescription,\n      saveCheckbox,\n      saveContainer,\n    },\n    editSignatureElements,\n    addSignatureToolbarButton,\n    overlayManager,\n    l10n,\n    signatureStorage,\n    eventBus\n  ) {\n    this.#addButton = addButton;\n    this.#clearButton = clearButton;\n    this.#clearDescription = description.lastElementChild;\n    this.#description = description.firstElementChild;\n    this.#dialog = dialog;\n    this.#drawSVG = drawSVG;\n    this.#drawPlaceholder = drawPlaceholder;\n    this.#drawThickness = drawThickness;\n    this.#errorBar = errorBar;\n    this.#errorTitle = errorTitle;\n    this.#errorDescription = errorDescription;\n    this.#imageSVG = imageSVG;\n    this.#imagePlaceholder = imagePlaceholder;\n    this.#imagePicker = imagePicker;\n    this.#imagePickerLink = imagePickerLink;\n    this.#overlayManager = overlayManager;\n    this.#saveCheckbox = saveCheckbox;\n    this.#saveContainer = saveContainer;\n    this.#addSignatureToolbarButton = addSignatureToolbarButton;\n    this.#typeInput = typeInput;\n    this.#l10n = l10n;\n    this.#signatureStorage = signatureStorage;\n    this.#eventBus = eventBus;\n    this.#editDescriptionDialog = new EditDescriptionDialog(\n      editSignatureElements,\n      overlayManager\n    );\n\n    SignatureManager.#l10nDescription ||= Object.freeze({\n      signature: \"pdfjs-editor-add-signature-description-default-when-drawing\",\n      errorUploadTitle: \"pdfjs-editor-add-signature-image-upload-error-title\",\n      errorUploadDescription:\n        \"pdfjs-editor-add-signature-image-upload-error-description\",\n      errorNoDataTitle: \"pdfjs-editor-add-signature-image-no-data-error-title\",\n      errorNoDataDescription:\n        \"pdfjs-editor-add-signature-image-no-data-error-description\",\n    });\n\n    dialog.addEventListener(\"close\", this.#close.bind(this));\n    dialog.addEventListener(\"contextmenu\", e => {\n      const { target } = e;\n      if (target !== this.#typeInput && target !== this.#description) {\n        e.preventDefault();\n      }\n    });\n    dialog.addEventListener(\"drop\", e => {\n      stopEvent(e);\n    });\n    cancelButton.addEventListener(\"click\", this.#cancel.bind(this));\n    addButton.addEventListener(\"click\", this.#add.bind(this));\n    clearButton.addEventListener(\n      \"click\",\n      () => {\n        this.#reportTelemetry({\n          type: \"signature\",\n          action: \"pdfjs.signature.clear\",\n          data: {\n            type: this.#currentTab,\n          },\n        });\n        this.#initTab(null);\n      },\n      { passive: true }\n    );\n    this.#description.addEventListener(\n      \"input\",\n      () => {\n        this.#clearDescription.disabled = this.#description.value === \"\";\n      },\n      { passive: true }\n    );\n    this.#clearDescription.addEventListener(\n      \"click\",\n      () => {\n        this.#description.value = \"\";\n        this.#clearDescription.disabled = true;\n      },\n      { passive: true }\n    );\n    errorCloseButton.addEventListener(\n      \"click\",\n      () => {\n        errorBar.hidden = true;\n      },\n      { passive: true }\n    );\n\n    this.#initTabButtons(typeButton, drawButton, imageButton, panels);\n    imagePicker.accept = SupportedImageMimeTypes.join(\",\");\n\n    eventBus.on(\n      \"storedsignatureschanged\",\n      this.#signaturesChanged.bind(this),\n      internalOpt\n    );\n\n    overlayManager.register(dialog);\n  }\n\n  #initTabButtons(typeButton, drawButton, imageButton, panels) {\n    const buttons = (this.#tabButtons = new Map([\n      [\"type\", typeButton],\n      [\"draw\", drawButton],\n      [\"image\", imageButton],\n    ]));\n    const tabCallback = e => {\n      for (const [name, button] of buttons) {\n        if (button === e.target) {\n          button.setAttribute(\"aria-selected\", true);\n          button.setAttribute(\"tabindex\", 0);\n          panels.setAttribute(\"data-selected\", name);\n          this.#initTab(name);\n        } else {\n          button.setAttribute(\"aria-selected\", false);\n          // Only the active tab is focusable: the others can be\n          // reached by keyboard navigation (left/right arrows).\n          button.setAttribute(\"tabindex\", -1);\n        }\n      }\n    };\n\n    const buttonsArray = Array.from(buttons.values());\n    for (let i = 0, ii = buttonsArray.length; i < ii; i++) {\n      const button = buttonsArray[i];\n      button.addEventListener(\"click\", tabCallback, { passive: true });\n      button.addEventListener(\n        \"keydown\",\n        ({ key }) => {\n          if (key !== \"ArrowLeft\" && key !== \"ArrowRight\") {\n            return;\n          }\n          buttonsArray[i + (key === \"ArrowLeft\" ? -1 : 1)]?.focus();\n        },\n        { passive: true }\n      );\n    }\n  }\n\n  #resetCommon() {\n    this.#hasDescriptionChanged = false;\n    this.#description.value = \"\";\n    if (this.#currentTab) {\n      this.#tabsToAltText.get(this.#currentTab).value = \"\";\n    }\n  }\n\n  #resetTab(name) {\n    switch (name) {\n      case \"type\":\n        this.#typeInput.value = \"\";\n        break;\n      case \"draw\":\n        this.#drawCurves = null;\n        this.#drawPoints = null;\n        this.#drawPathString = \"\";\n        this.#drawPath?.remove();\n        this.#drawPath = null;\n        this.#drawPlaceholder.hidden = false;\n        this.#drawThickness.value = 1;\n        break;\n      case \"image\":\n        this.#imagePlaceholder.hidden = false;\n        this.#imagePath?.remove();\n        this.#imagePath = null;\n        break;\n    }\n  }\n\n  #initTab(name) {\n    if (name && this.#currentTab === name) {\n      return;\n    }\n    if (this.#currentTab) {\n      this.#tabsToAltText.get(this.#currentTab).value = this.#description.value;\n    }\n    if (name) {\n      this.#currentTab = name;\n    }\n\n    this.#errorBar.hidden = true;\n    const reset = !name;\n    if (reset) {\n      this.#resetCommon();\n    } else {\n      this.#description.value = this.#tabsToAltText.get(this.#currentTab).value;\n    }\n    this.#clearDescription.disabled = this.#description.value === \"\";\n    this.#currentTabAC?.abort();\n    this.#currentTabAC = new AbortController();\n    switch (this.#currentTab) {\n      case \"type\":\n        this.#initTypeTab(reset);\n        break;\n      case \"draw\":\n        this.#initDrawTab(reset);\n        break;\n      case \"image\":\n        this.#initImageTab(reset);\n        break;\n    }\n  }\n\n  #disableButtons(value) {\n    if (!value || !this.#isStorageFull) {\n      this.#saveCheckbox.disabled = !value;\n    }\n    this.#clearButton.disabled =\n      this.#addButton.disabled =\n      this.#description.disabled =\n        !value;\n  }\n\n  #initTypeTab(reset) {\n    if (reset) {\n      this.#resetTab(\"type\");\n    }\n\n    this.#disableButtons(this.#typeInput.value);\n\n    const { signal } = this.#currentTabAC;\n    const options = { passive: true, signal };\n    this.#typeInput.addEventListener(\n      \"input\",\n      () => {\n        const { value } = this.#typeInput;\n        if (!this.#hasDescriptionChanged) {\n          this.#tabsToAltText.get(\"type\").default = this.#description.value =\n            value;\n          this.#clearDescription.disabled = value === \"\";\n        }\n        this.#disableButtons(value);\n      },\n      options\n    );\n    this.#description.addEventListener(\n      \"input\",\n      () => {\n        this.#hasDescriptionChanged =\n          this.#typeInput.value !== this.#description.value;\n      },\n      options\n    );\n  }\n\n  #initDrawTab(reset) {\n    if (reset) {\n      this.#resetTab(\"draw\");\n    }\n\n    this.#disableButtons(this.#drawPath);\n\n    const { signal } = this.#currentTabAC;\n    const options = { signal };\n    let currentPointerId = NaN;\n    const drawCallback = e => {\n      const { pointerId } = e;\n      if (!isNaN(currentPointerId) && currentPointerId !== pointerId) {\n        return;\n      }\n      currentPointerId = pointerId;\n      e.preventDefault();\n      this.#drawSVG.setPointerCapture(pointerId);\n\n      const { width: drawWidth, height: drawHeight } =\n        this.#drawSVG.getBoundingClientRect();\n      let { offsetX, offsetY } = e;\n      offsetX = Math.round(offsetX);\n      offsetY = Math.round(offsetY);\n      if (e.target === this.#drawPlaceholder) {\n        this.#drawPlaceholder.hidden = true;\n      }\n      if (!this.#drawCurves) {\n        this.#drawCurves = {\n          width: drawWidth,\n          height: drawHeight,\n          thickness: parseInt(this.#drawThickness.value, 10),\n          curves: [],\n        };\n        this.#disableButtons(true);\n\n        const svgFactory = new DOMSVGFactory();\n        const path = (this.#drawPath = svgFactory.createElement(\"path\"));\n        path.setAttribute(\"stroke-width\", this.#drawThickness.value);\n        this.#drawSVG.append(path);\n        this.#drawSVG.addEventListener(\"pointerdown\", drawCallback, options);\n        this.#drawPlaceholder.removeEventListener(\"pointerdown\", drawCallback);\n        if (this.#description.value === \"\") {\n          this.#l10n\n            .get(SignatureManager.#l10nDescription.signature)\n            .then(description => {\n              this.#tabsToAltText.get(\"draw\").default = description;\n              this.#description.value ||= description;\n              this.#clearDescription.disabled = this.#description.value === \"\";\n            });\n        }\n      }\n\n      this.#drawPoints = [offsetX, offsetY];\n      this.#drawCurves.curves.push({ points: this.#drawPoints });\n      this.#drawPathString += `M ${offsetX} ${offsetY}`;\n      this.#drawPath.setAttribute(\"d\", this.#drawPathString);\n\n      const finishDrawAC = new AbortController();\n      const listenerDrawOptions = {\n        signal: AbortSignal.any([signal, finishDrawAC.signal]),\n      };\n      this.#drawSVG.addEventListener(\n        \"contextmenu\",\n        noContextMenu,\n        listenerDrawOptions\n      );\n      this.#drawSVG.addEventListener(\n        \"pointermove\",\n        evt => {\n          evt.preventDefault();\n          let { offsetX: x, offsetY: y } = evt;\n          x = Math.round(x);\n          y = Math.round(y);\n          const drawPoints = this.#drawPoints;\n          if (\n            x < 0 ||\n            y < 0 ||\n            x > drawWidth ||\n            y > drawHeight ||\n            (x === drawPoints.at(-2) && y === drawPoints.at(-1))\n          ) {\n            return;\n          }\n          if (drawPoints.length >= 4) {\n            const [x1, y1, x2, y2] = drawPoints.slice(-4);\n            this.#drawPathString += `C${(x1 + 5 * x2) / 6} ${(y1 + 5 * y2) / 6} ${(5 * x2 + x) / 6} ${(5 * y2 + y) / 6} ${(x2 + x) / 2} ${(y2 + y) / 2}`;\n          } else {\n            this.#drawPathString += `L${x} ${y}`;\n          }\n          drawPoints.push(x, y);\n          this.#drawPath.setAttribute(\"d\", this.#drawPathString);\n        },\n        listenerDrawOptions\n      );\n      this.#drawSVG.addEventListener(\n        \"pointerup\",\n        evt => {\n          const { pointerId: pId } = evt;\n          if (!isNaN(currentPointerId) && currentPointerId !== pId) {\n            return;\n          }\n          currentPointerId = NaN;\n          evt.preventDefault();\n          this.#drawSVG.releasePointerCapture(pId);\n          finishDrawAC.abort();\n          if (this.#drawPoints.length === 2) {\n            this.#drawPathString += `L${this.#drawPoints[0]} ${this.#drawPoints[1]}`;\n            this.#drawPath.setAttribute(\"d\", this.#drawPathString);\n          }\n        },\n        listenerDrawOptions\n      );\n    };\n    if (this.#drawCurves) {\n      this.#drawSVG.addEventListener(\"pointerdown\", drawCallback, options);\n    } else {\n      this.#drawPlaceholder.addEventListener(\n        \"pointerdown\",\n        drawCallback,\n        options\n      );\n    }\n    this.#drawThickness.addEventListener(\n      \"input\",\n      () => {\n        const { value: thickness } = this.#drawThickness;\n        this.#drawThickness.setAttribute(\n          \"data-l10n-args\",\n          JSON.stringify({ thickness })\n        );\n        if (!this.#drawCurves) {\n          return;\n        }\n        this.#drawPath.setAttribute(\"stroke-width\", thickness);\n        this.#drawCurves.thickness = thickness;\n      },\n      options\n    );\n  }\n\n  #showError(type) {\n    this.#errorTitle.setAttribute(\n      \"data-l10n-id\",\n      SignatureManager.#l10nDescription[`error${type}Title`]\n    );\n    this.#errorDescription.setAttribute(\n      \"data-l10n-id\",\n      SignatureManager.#l10nDescription[`error${type}Description`]\n    );\n    this.#errorBar.hidden = false;\n  }\n\n  #initImageTab(reset) {\n    if (reset) {\n      this.#resetTab(\"image\");\n    }\n\n    this.#disableButtons(this.#imagePath);\n\n    const { signal } = this.#currentTabAC;\n    const options = { signal };\n    const passiveOptions = { passive: true, signal };\n    this.#imagePickerLink.addEventListener(\n      \"keydown\",\n      e => {\n        const { key } = e;\n        if (key === \"Enter\" || key === \" \") {\n          stopEvent(e);\n          this.#imagePicker.click();\n        }\n      },\n      options\n    );\n    this.#imagePicker.addEventListener(\n      \"click\",\n      () => {\n        this.#dialog.classList.toggle(\"waiting\", true);\n      },\n      passiveOptions\n    );\n    this.#imagePicker.addEventListener(\n      \"change\",\n      async () => {\n        const file = this.#imagePicker.files?.[0];\n        if (!file || !SupportedImageMimeTypes.includes(file.type)) {\n          this.#showError(\"Upload\");\n          this.#dialog.classList.toggle(\"waiting\", false);\n          return;\n        }\n        await this.#extractSignature(file);\n      },\n      passiveOptions\n    );\n    this.#imagePicker.addEventListener(\n      \"cancel\",\n      () => {\n        this.#dialog.classList.toggle(\"waiting\", false);\n      },\n      passiveOptions\n    );\n    this.#imagePlaceholder.addEventListener(\n      \"dragover\",\n      e => {\n        const { dataTransfer } = e;\n        for (const { type } of dataTransfer.items) {\n          if (!SupportedImageMimeTypes.includes(type)) {\n            continue;\n          }\n          dataTransfer.dropEffect =\n            dataTransfer.effectAllowed === \"copy\" ? \"copy\" : \"move\";\n          stopEvent(e);\n          return;\n        }\n        dataTransfer.dropEffect = \"none\";\n      },\n      options\n    );\n    this.#imagePlaceholder.addEventListener(\n      \"drop\",\n      e => {\n        const {\n          dataTransfer: { files },\n        } = e;\n        if (!files?.length) {\n          return;\n        }\n        for (const file of files) {\n          if (SupportedImageMimeTypes.includes(file.type)) {\n            this.#extractSignature(file);\n            break;\n          }\n        }\n        stopEvent(e);\n        this.#dialog.classList.toggle(\"waiting\", true);\n      },\n      options\n    );\n  }\n\n  async #extractSignature(file) {\n    let data;\n    try {\n      data = await this.#uiManager.imageManager.getFromFile(file);\n    } catch (e) {\n      console.error(\"SignatureManager.#extractSignature.\", e);\n    }\n    if (!data) {\n      this.#showError(\"Upload\");\n      this.#dialog.classList.toggle(\"waiting\", false);\n      return;\n    }\n\n    const lineData = (this.#extractedSignatureData =\n      this.#currentEditor.getFromImage(data.bitmap));\n    if (!lineData) {\n      this.#showError(\"NoData\");\n      this.#dialog.classList.toggle(\"waiting\", false);\n      return;\n    }\n    const { outline } = lineData;\n\n    this.#imagePlaceholder.hidden = true;\n    this.#disableButtons(true);\n\n    const svgFactory = new DOMSVGFactory();\n    const path = (this.#imagePath = svgFactory.createElement(\"path\"));\n    this.#imageSVG.setAttribute(\"viewBox\", outline.viewBox);\n    this.#imageSVG.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n    this.#imageSVG.append(path);\n    path.setAttribute(\"d\", outline.toSVGPath());\n    this.#tabsToAltText.get(\"image\").default = file.name;\n    if (this.#description.value === \"\") {\n      this.#description.value = file.name || \"\";\n      this.#clearDescription.disabled = this.#description.value === \"\";\n    }\n\n    this.#dialog.classList.toggle(\"waiting\", false);\n  }\n\n  #getOutlineForType() {\n    return this.#currentEditor.getFromText(\n      this.#typeInput.value,\n      window.getComputedStyle(this.#typeInput)\n    );\n  }\n\n  #getOutlineForDraw() {\n    const { width, height } = this.#drawSVG.getBoundingClientRect();\n    return this.#currentEditor.getDrawnSignature(\n      this.#drawCurves,\n      width,\n      height\n    );\n  }\n\n  #reportTelemetry(data) {\n    this.#eventBus.dispatch(\"reporttelemetry\", {\n      source: this,\n      details: {\n        type: \"editing\",\n        data,\n      },\n    });\n  }\n\n  #addToolbarButton(signatureData, uuid, description) {\n    const { curves, areContours, thickness, width, height } = signatureData;\n    const maxDim = Math.max(width, height);\n    const outlineData = SignatureExtractor.processDrawnLines({\n      lines: {\n        curves,\n        thickness,\n        width,\n        height,\n      },\n      pageWidth: maxDim,\n      pageHeight: maxDim,\n      rotation: 0,\n      innerMargin: 0,\n      mustSmooth: false,\n      areContours,\n    });\n    if (!outlineData) {\n      return;\n    }\n\n    const { outline } = outlineData;\n    const svgFactory = new DOMSVGFactory();\n\n    const div = document.createElement(\"div\");\n    const button = document.createElement(\"button\");\n\n    button.addEventListener(\"click\", () => {\n      this.#eventBus.dispatch(\"switchannotationeditorparams\", {\n        source: this,\n        type: AnnotationEditorParamsType.CREATE,\n        value: {\n          signatureData: {\n            lines: {\n              curves,\n              thickness,\n              width,\n              height,\n            },\n            mustSmooth: false,\n            areContours,\n            description,\n            uuid,\n            heightInPage: DEFAULT_HEIGHT_IN_PAGE,\n          },\n        },\n      });\n    });\n    div.append(button);\n    div.classList.add(\"toolbarAddSignatureButtonContainer\");\n\n    const svg = svgFactory.create(1, 1, true);\n    button.append(svg);\n\n    const span = document.createElement(\"span\");\n    span.ariaHidden = true;\n    button.append(span);\n\n    button.classList.add(\"toolbarAddSignatureButton\");\n    button.type = \"button\";\n    span.textContent = description;\n    button.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-editor-add-saved-signature-button\"\n    );\n    button.setAttribute(\"data-l10n-args\", JSON.stringify({ description }));\n    button.tabIndex = 0;\n\n    const path = svgFactory.createElement(\"path\");\n    svg.append(path);\n    svg.setAttribute(\"viewBox\", outline.viewBox);\n    svg.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n    if (areContours) {\n      path.classList.add(\"contours\");\n    }\n    path.setAttribute(\"d\", outline.toSVGPath());\n\n    const deleteButton = document.createElement(\"button\");\n    div.append(deleteButton);\n    deleteButton.classList.add(\"toolbarButton\", \"deleteButton\");\n    deleteButton.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-editor-delete-signature-button1\"\n    );\n    deleteButton.type = \"button\";\n    deleteButton.tabIndex = 0;\n    deleteButton.addEventListener(\"click\", async () => {\n      if (await this.#signatureStorage.delete(uuid)) {\n        div.remove();\n        this.#reportTelemetry({\n          type: \"signature\",\n          action: \"pdfjs.signature.delete_saved\",\n          data: {\n            savedCount: await this.#signatureStorage.size(),\n          },\n        });\n      }\n    });\n    const deleteSpan = document.createElement(\"span\");\n    deleteButton.append(deleteSpan);\n    deleteSpan.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-editor-delete-signature-button-label1\"\n    );\n\n    this.#addSignatureToolbarButton.before(div);\n  }\n\n  async #signaturesChanged() {\n    const parent = this.#addSignatureToolbarButton.parentElement;\n    while (parent.firstElementChild !== this.#addSignatureToolbarButton) {\n      parent.firstElementChild.remove();\n    }\n    this.#loadSignaturesPromise = null;\n    await this.loadSignatures(/* reload = */ true);\n  }\n\n  getSignature(params) {\n    return this.open(params);\n  }\n\n  async loadSignatures(reload = false) {\n    if (\n      !this.#addSignatureToolbarButton ||\n      (!reload && this.#addSignatureToolbarButton.previousElementSibling) ||\n      !this.#signatureStorage\n    ) {\n      return;\n    }\n\n    if (!this.#loadSignaturesPromise) {\n      // The first call of loadSignatures() starts loading the signatures.\n      // The second one will wait until the signatures are loaded in the DOM.\n      this.#loadSignaturesPromise = this.#signatureStorage\n        .getAll()\n        .then(async signatures => [\n          signatures,\n          await Promise.all(\n            Array.from(signatures.values(), ({ signatureData }) =>\n              SignatureExtractor.decompressSignature(signatureData)\n            )\n          ),\n        ]);\n      if (!reload) {\n        return;\n      }\n    }\n    const [signatures, signaturesData] = await this.#loadSignaturesPromise;\n    this.#loadSignaturesPromise = null;\n\n    let i = 0;\n    for (const [uuid, { description }] of signatures) {\n      const data = signaturesData[i++];\n      if (!data) {\n        continue;\n      }\n      data.curves = data.outlines.map(points => ({ points }));\n      delete data.outlines;\n      this.#addToolbarButton(data, uuid, description);\n    }\n  }\n\n  async renderEditButton(editor) {\n    const button = document.createElement(\"button\");\n    button.classList.add(\"altText\", \"editDescription\");\n    button.tabIndex = 0;\n    if (editor.description) {\n      button.title = editor.description;\n    }\n    const span = document.createElement(\"span\");\n    button.append(span);\n    span.setAttribute(\n      \"data-l10n-id\",\n      \"pdfjs-editor-add-signature-edit-button-label\"\n    );\n    button.addEventListener(\n      \"click\",\n      () => {\n        this.#editDescriptionDialog.open(editor);\n      },\n      { passive: true }\n    );\n    return button;\n  }\n\n  async open({ uiManager, editor }) {\n    this.#tabsToAltText ||= new Map(\n      this.#tabButtons.keys().map(name => [name, { value: \"\", default: \"\" }])\n    );\n    this.#uiManager = uiManager;\n    this.#currentEditor = editor;\n    this.#uiManager.removeEditListeners();\n\n    const isStorageFull = (this.#isStorageFull =\n      await this.#signatureStorage.isFull());\n    this.#saveContainer.classList.toggle(\"fullStorage\", isStorageFull);\n    this.#saveCheckbox.checked = !isStorageFull;\n\n    await this.#overlayManager.open(this.#dialog);\n\n    const tabType = this.#tabButtons.get(\"type\");\n    tabType.focus();\n    tabType.click();\n  }\n\n  #cancel() {\n    this.#finish();\n  }\n\n  #finish() {\n    this.#overlayManager.closeIfActive(this.#dialog);\n  }\n\n  #close() {\n    if (this.#currentEditor._drawId === null) {\n      this.#currentEditor.remove();\n    }\n    this.#uiManager?.addEditListeners();\n    this.#currentTabAC?.abort();\n    this.#currentTabAC = null;\n    this.#uiManager = null;\n    this.#currentEditor = null;\n\n    this.#resetCommon();\n    for (const [name] of this.#tabButtons) {\n      this.#resetTab(name);\n    }\n    this.#disableButtons(false);\n    this.#currentTab = null;\n    this.#tabsToAltText = null;\n  }\n\n  async #add() {\n    let data;\n    const type = this.#currentTab;\n    switch (type) {\n      case \"type\":\n        data = this.#getOutlineForType();\n        break;\n      case \"draw\":\n        data = this.#getOutlineForDraw();\n        break;\n      case \"image\":\n        data = this.#extractedSignatureData;\n        break;\n    }\n    let uuid = null;\n    const description = this.#description.value;\n    if (this.#saveCheckbox.checked) {\n      const { newCurves, areContours, thickness, width, height } = data;\n      const signatureData = await SignatureExtractor.compressSignature({\n        outlines: newCurves,\n        areContours,\n        thickness,\n        width,\n        height,\n      });\n      uuid = await this.#signatureStorage.create({\n        description,\n        signatureData,\n      });\n      if (uuid) {\n        this.#addToolbarButton(\n          {\n            curves: newCurves.map(points => ({ points })),\n            areContours,\n            thickness,\n            width,\n            height,\n          },\n          uuid,\n          description\n        );\n      } else {\n        console.warn(\"SignatureManager.add: cannot save the signature.\");\n      }\n    }\n\n    const altText = this.#tabsToAltText.get(type);\n    this.#reportTelemetry({\n      type: \"signature\",\n      action: \"pdfjs.signature.created\",\n      data: {\n        type,\n        saved: !!uuid,\n        savedCount: await this.#signatureStorage.size(),\n        descriptionChanged: description !== altText.default,\n      },\n    });\n\n    this.#currentEditor.addSignature(\n      data,\n      DEFAULT_HEIGHT_IN_PAGE,\n      this.#description.value,\n      uuid\n    );\n\n    this.#finish();\n  }\n\n  destroy() {\n    this.#uiManager = null;\n    this.#finish();\n  }\n}\n\nclass EditDescriptionDialog {\n  #currentEditor;\n\n  #previousDescription;\n\n  #description;\n\n  #dialog;\n\n  #overlayManager;\n\n  #signatureSVG;\n\n  #uiManager;\n\n  constructor(\n    { dialog, description, cancelButton, updateButton, editSignatureView },\n    overlayManager\n  ) {\n    const descriptionInput = (this.#description =\n      description.firstElementChild);\n    this.#signatureSVG = editSignatureView;\n    this.#dialog = dialog;\n    this.#overlayManager = overlayManager;\n\n    dialog.addEventListener(\"close\", this.#close.bind(this));\n    dialog.addEventListener(\"contextmenu\", e => {\n      if (e.target !== this.#description) {\n        e.preventDefault();\n      }\n    });\n    cancelButton.addEventListener(\"click\", this.#cancel.bind(this));\n    updateButton.addEventListener(\"click\", this.#update.bind(this));\n\n    const clearDescription = description.lastElementChild;\n    clearDescription.addEventListener(\"click\", () => {\n      descriptionInput.value = \"\";\n      clearDescription.disabled = true;\n      updateButton.disabled = this.#previousDescription === \"\";\n    });\n    descriptionInput.addEventListener(\n      \"input\",\n      () => {\n        const { value } = descriptionInput;\n        clearDescription.disabled = value === \"\";\n        updateButton.disabled = value === this.#previousDescription;\n        editSignatureView.setAttribute(\"aria-label\", value);\n      },\n      { passive: true }\n    );\n\n    overlayManager.register(dialog);\n  }\n\n  async open(editor) {\n    this.#uiManager = editor._uiManager;\n    this.#currentEditor = editor;\n    this.#previousDescription = this.#description.value = editor.description;\n    this.#description.dispatchEvent(new Event(\"input\"));\n    this.#uiManager.removeEditListeners();\n    const { areContours, outline } = editor.getSignaturePreview();\n    const svgFactory = new DOMSVGFactory();\n    const path = svgFactory.createElement(\"path\");\n    this.#signatureSVG.append(path);\n    this.#signatureSVG.setAttribute(\"viewBox\", outline.viewBox);\n    path.setAttribute(\"d\", outline.toSVGPath());\n    if (areContours) {\n      path.classList.add(\"contours\");\n    }\n\n    await this.#overlayManager.open(this.#dialog);\n  }\n\n  async #update() {\n    // The description has been changed because the button isn't disabled.\n    this.#currentEditor._reportTelemetry({\n      action: \"pdfjs.signature.edit_description\",\n      data: {\n        hasBeenChanged: true,\n      },\n    });\n    this.#currentEditor.description = this.#description.value;\n    this.#finish();\n  }\n\n  #cancel() {\n    this.#currentEditor._reportTelemetry({\n      action: \"pdfjs.signature.edit_description\",\n      data: {\n        hasBeenChanged: false,\n      },\n    });\n    this.#finish();\n  }\n\n  #finish() {\n    this.#overlayManager.closeIfActive(this.#dialog);\n  }\n\n  #close() {\n    this.#uiManager?.addEditListeners();\n    this.#uiManager = null;\n    this.#currentEditor = null;\n    this.#signatureSVG.firstElementChild.remove();\n  }\n}\n\nexport { SignatureManager };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n\nimport { AnnotationEditorType, ColorPicker, noContextMenu } from \"pdfjs-lib\";\nimport {\n  DEFAULT_SCALE,\n  DEFAULT_SCALE_VALUE,\n  MAX_SCALE,\n  MIN_SCALE,\n  toggleExpandedBtn,\n} from \"./ui_utils.js\";\nimport { internalOpt } from \"./internal_evt.js\";\n\n/**\n * @typedef {Object} ToolbarOptions\n * @property {HTMLDivElement} container - Container for the secondary toolbar.\n * @property {HTMLSpanElement} numPages - Label that contains number of pages.\n * @property {HTMLInputElement} pageNumber - Control for display and user input\n *   of the current page number.\n * @property {HTMLSelectElement} scaleSelect - Scale selection control.\n *   Its width is adjusted, when necessary, on UI localization.\n * @property {HTMLOptionElement} customScaleOption - The item used to display\n *   a non-predefined scale.\n * @property {HTMLButtonElement} previous - Button to go to the previous page.\n * @property {HTMLButtonElement} next - Button to go to the next page.\n * @property {HTMLButtonElement} zoomIn - Button to zoom in the pages.\n * @property {HTMLButtonElement} zoomOut - Button to zoom out the pages.\n * @property {HTMLButtonElement} editorFreeTextButton - Button to switch to\n *   FreeText editing.\n * @property {HTMLButtonElement} download - Button to download the document.\n */\n\nclass Toolbar {\n  #colorPicker = null;\n\n  #opts;\n\n  /**\n   * @param {ToolbarOptions} options\n   * @param {EventBus} eventBus\n   * @param {number} toolbarDensity - The toolbar density value.\n   *   The possible values are:\n   *    - 0 (default) - The regular toolbar size.\n   *    - 1 (compact) - The small toolbar size.\n   *    - 2 (touch) - The large toolbar size.\n   */\n  constructor(options, eventBus, toolbarDensity = 0) {\n    this.#opts = options;\n    this.eventBus = eventBus;\n    const buttons = [\n      { element: options.previous, eventName: \"previouspage\" },\n      { element: options.next, eventName: \"nextpage\" },\n      { element: options.zoomIn, eventName: \"zoomin\" },\n      { element: options.zoomOut, eventName: \"zoomout\" },\n      { element: options.print, eventName: \"print\" },\n      { element: options.download, eventName: \"download\" },\n      {\n        element: options.editorCommentButton,\n        eventName: \"switchannotationeditormode\",\n        eventDetails: {\n          get mode() {\n            const { classList } = options.editorCommentButton;\n            return classList.contains(\"toggled\")\n              ? AnnotationEditorType.NONE\n              : AnnotationEditorType.POPUP;\n          },\n        },\n      },\n      {\n        element: options.editorFreeTextButton,\n        eventName: \"switchannotationeditormode\",\n        eventDetails: {\n          get mode() {\n            const { classList } = options.editorFreeTextButton;\n            return classList.contains(\"toggled\")\n              ? AnnotationEditorType.NONE\n              : AnnotationEditorType.FREETEXT;\n          },\n        },\n      },\n      {\n        element: options.editorHighlightButton,\n        eventName: \"switchannotationeditormode\",\n        eventDetails: {\n          get mode() {\n            const { classList } = options.editorHighlightButton;\n            return classList.contains(\"toggled\")\n              ? AnnotationEditorType.NONE\n              : AnnotationEditorType.HIGHLIGHT;\n          },\n        },\n      },\n      {\n        element: options.editorInkButton,\n        eventName: \"switchannotationeditormode\",\n        eventDetails: {\n          get mode() {\n            const { classList } = options.editorInkButton;\n            return classList.contains(\"toggled\")\n              ? AnnotationEditorType.NONE\n              : AnnotationEditorType.INK;\n          },\n        },\n      },\n      {\n        element: options.editorStampButton,\n        eventName: \"switchannotationeditormode\",\n        eventDetails: {\n          get mode() {\n            const { classList } = options.editorStampButton;\n            return classList.contains(\"toggled\")\n              ? AnnotationEditorType.NONE\n              : AnnotationEditorType.STAMP;\n          },\n        },\n        telemetry: {\n          type: \"editing\",\n          data: { action: \"pdfjs.image.icon_click\" },\n        },\n      },\n      {\n        element: options.editorSignatureButton,\n        eventName: \"switchannotationeditormode\",\n        eventDetails: {\n          get mode() {\n            const { classList } = options.editorSignatureButton;\n            return classList.contains(\"toggled\")\n              ? AnnotationEditorType.NONE\n              : AnnotationEditorType.SIGNATURE;\n          },\n        },\n      },\n    ];\n\n    // Bind the event listeners for click and various other actions.\n    this.#bindListeners(buttons);\n\n    this.#updateToolbarDensity({ value: toolbarDensity });\n    this.reset();\n  }\n\n  #updateToolbarDensity({ value }) {\n    let name = \"normal\";\n    switch (value) {\n      case 1:\n        name = \"compact\";\n        break;\n      case 2:\n        name = \"touch\";\n        break;\n    }\n    document.documentElement.setAttribute(\"data-toolbar-density\", name);\n  }\n\n  setPageNumber(pageNumber, pageLabel) {\n    this.pageNumber = pageNumber;\n    this.pageLabel = pageLabel;\n    this.#updateUIState(false);\n  }\n\n  setPagesCount(pagesCount, hasPageLabels) {\n    this.pagesCount = pagesCount;\n    this.hasPageLabels = hasPageLabels;\n    this.#updateUIState(true);\n  }\n\n  setPageScale(pageScaleValue, pageScale) {\n    this.pageScaleValue = (pageScaleValue || pageScale).toString();\n    this.pageScale = pageScale;\n    this.#updateUIState(false);\n  }\n\n  reset() {\n    this.#colorPicker = null;\n    this.pageNumber = 0;\n    this.pageLabel = null;\n    this.hasPageLabels = false;\n    this.pagesCount = 0;\n    this.pageScaleValue = DEFAULT_SCALE_VALUE;\n    this.pageScale = DEFAULT_SCALE;\n    this.#updateUIState(true);\n    this.updateLoadingIndicatorState();\n\n    // Reset the Editor buttons too, since they're document specific.\n    this.#editorModeChanged({ mode: AnnotationEditorType.DISABLE });\n  }\n\n  #bindListeners(buttons) {\n    const { eventBus } = this;\n    const {\n      editorHighlightColorPicker,\n      editorHighlightButton,\n      pageNumber,\n      scaleSelect,\n    } = this.#opts;\n    const self = this;\n\n    // The buttons within the toolbar.\n    for (const { element, eventName, eventDetails, telemetry } of buttons) {\n      element.addEventListener(\"click\", evt => {\n        if (eventName !== null) {\n          eventBus.dispatch(eventName, {\n            source: this,\n            ...eventDetails,\n            // evt.detail is the number of clicks.\n            isFromKeyboard: evt.detail === 0,\n          });\n        }\n        if (telemetry) {\n          eventBus.dispatch(\"reporttelemetry\", {\n            source: this,\n            details: telemetry,\n          });\n        }\n      });\n    }\n    // The non-button elements within the toolbar.\n    pageNumber.addEventListener(\"click\", function () {\n      this.select();\n    });\n    pageNumber.addEventListener(\"change\", function () {\n      eventBus.dispatch(\"pagenumberchanged\", {\n        source: self,\n        value: this.value,\n      });\n    });\n    eventBus.on(\n      \"pagesedited\",\n      ({ pagesMapper }) => {\n        const pagesCount = pagesMapper.pagesNumber;\n        if (pagesCount !== this.pagesCount) {\n          this.setPagesCount(pagesCount, this.hasPageLabels);\n        }\n      },\n      internalOpt\n    );\n\n    scaleSelect.addEventListener(\"change\", function () {\n      if (this.value === \"custom\") {\n        return;\n      }\n      eventBus.dispatch(\"scalechanged\", {\n        source: self,\n        value: this.value,\n      });\n    });\n    // Here we depend on browsers dispatching the \"click\" event *after* the\n    // \"change\" event, when the <select>-element changes.\n    scaleSelect.addEventListener(\"click\", function ({ target }) {\n      // Remove focus when an <option>-element was *clicked*, to improve the UX\n      // for mouse users (fixes bug 1300525 and issue 4923).\n      if (\n        this.value === self.pageScaleValue &&\n        target.tagName.toUpperCase() === \"OPTION\"\n      ) {\n        this.blur();\n      }\n    });\n    // Suppress context menus for some controls.\n    scaleSelect.oncontextmenu = noContextMenu;\n\n    eventBus.on(\n      \"annotationeditormodechanged\",\n      this.#editorModeChanged.bind(this),\n      internalOpt\n    );\n    eventBus.on(\n      \"showannotationeditorui\",\n      ({ mode }) => {\n        switch (mode) {\n          case AnnotationEditorType.HIGHLIGHT:\n            editorHighlightButton.click();\n            break;\n        }\n      },\n      internalOpt\n    );\n    eventBus.on(\n      \"toolbardensity\",\n      this.#updateToolbarDensity.bind(this),\n      internalOpt\n    );\n\n    if (editorHighlightColorPicker) {\n      eventBus.on(\n        \"annotationeditoruimanager\",\n        ({ uiManager }) => {\n          const cp = (this.#colorPicker = new ColorPicker({ uiManager }));\n          uiManager.setMainHighlightColorPicker(cp);\n          editorHighlightColorPicker.append(cp.renderMainDropdown());\n        },\n        internalOpt\n      );\n\n      eventBus.on(\n        \"mainhighlightcolorpickerupdatecolor\",\n        ({ value }) => {\n          this.#colorPicker?.updateColor(value);\n        },\n        internalOpt\n      );\n    }\n  }\n\n  #editorModeChanged({ mode }) {\n    const {\n      editorCommentButton,\n      editorCommentParamsToolbar,\n      editorFreeTextButton,\n      editorFreeTextParamsToolbar,\n      editorHighlightButton,\n      editorHighlightParamsToolbar,\n      editorInkButton,\n      editorInkParamsToolbar,\n      editorStampButton,\n      editorStampParamsToolbar,\n      editorSignatureButton,\n      editorSignatureParamsToolbar,\n    } = this.#opts;\n\n    toggleExpandedBtn(\n      editorCommentButton,\n      mode === AnnotationEditorType.POPUP,\n      editorCommentParamsToolbar\n    );\n    toggleExpandedBtn(\n      editorFreeTextButton,\n      mode === AnnotationEditorType.FREETEXT,\n      editorFreeTextParamsToolbar\n    );\n    toggleExpandedBtn(\n      editorHighlightButton,\n      mode === AnnotationEditorType.HIGHLIGHT,\n      editorHighlightParamsToolbar\n    );\n    toggleExpandedBtn(\n      editorInkButton,\n      mode === AnnotationEditorType.INK,\n      editorInkParamsToolbar\n    );\n    toggleExpandedBtn(\n      editorStampButton,\n      mode === AnnotationEditorType.STAMP,\n      editorStampParamsToolbar\n    );\n    toggleExpandedBtn(\n      editorSignatureButton,\n      mode === AnnotationEditorType.SIGNATURE,\n      editorSignatureParamsToolbar\n    );\n\n    editorCommentButton.disabled =\n      editorFreeTextButton.disabled =\n      editorHighlightButton.disabled =\n      editorInkButton.disabled =\n      editorStampButton.disabled =\n      editorSignatureButton.disabled =\n        mode === AnnotationEditorType.DISABLE;\n  }\n\n  #updateUIState(resetNumPages = false) {\n    const { pageNumber, pagesCount, pageScaleValue, pageScale } = this;\n    const opts = this.#opts;\n\n    if (resetNumPages) {\n      if (this.hasPageLabels) {\n        opts.pageNumber.type = \"text\";\n\n        opts.numPages.setAttribute(\"data-l10n-id\", \"pdfjs-page-of-pages\");\n      } else {\n        opts.pageNumber.type = \"number\";\n\n        opts.numPages.setAttribute(\"data-l10n-id\", \"pdfjs-of-pages\");\n        opts.numPages.setAttribute(\n          \"data-l10n-args\",\n          JSON.stringify({ pagesCount })\n        );\n      }\n      opts.pageNumber.max = pagesCount;\n    }\n\n    if (this.hasPageLabels) {\n      opts.pageNumber.value = this.pageLabel;\n\n      opts.numPages.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({ pageNumber, pagesCount })\n      );\n    } else {\n      opts.pageNumber.value = pageNumber;\n    }\n\n    opts.previous.disabled = pageNumber <= 1;\n    opts.next.disabled = pageNumber >= pagesCount;\n\n    opts.zoomOut.disabled = pageScale <= MIN_SCALE;\n    opts.zoomIn.disabled = pageScale >= MAX_SCALE;\n\n    let predefinedValueFound = false;\n    for (const option of opts.scaleSelect.options) {\n      if (option.value !== pageScaleValue) {\n        option.selected = false;\n        continue;\n      }\n      option.selected = true;\n      predefinedValueFound = true;\n    }\n    if (!predefinedValueFound) {\n      opts.customScaleOption.selected = true;\n      opts.customScaleOption.setAttribute(\n        \"data-l10n-args\",\n        JSON.stringify({\n          scale: Math.round(pageScale * 10000) / 100,\n        })\n      );\n    }\n  }\n\n  updateLoadingIndicatorState(loading = false) {\n    const { pageNumber } = this.#opts;\n    pageNumber.classList.toggle(\"loading\", loading);\n  }\n}\n\nexport { Toolbar };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;\n\n/**\n * View History - This is a utility for saving various view parameters for\n *                recently opened files.\n *\n * The way that the view parameters are stored depends on how PDF.js is built,\n * for 'gulp <flag>' the following cases exist:\n *  - MOZCENTRAL        - uses sessionStorage.\n *  - GENERIC or CHROME - uses localStorage, if it is available.\n */\nclass ViewHistory {\n  constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) {\n    this.fingerprint = fingerprint;\n    this.cacheSize = cacheSize;\n\n    this._initializedPromise = this._readFromStorage().then(databaseStr => {\n      const database = JSON.parse(databaseStr || \"{}\");\n      let index = -1;\n      if (!Array.isArray(database.files)) {\n        database.files = [];\n      } else {\n        while (database.files.length >= this.cacheSize) {\n          database.files.shift();\n        }\n\n        for (let i = 0, ii = database.files.length; i < ii; i++) {\n          const branch = database.files[i];\n          if (branch.fingerprint === this.fingerprint) {\n            index = i;\n            break;\n          }\n        }\n      }\n      if (index === -1) {\n        index = database.files.push({ fingerprint: this.fingerprint }) - 1;\n      }\n      this.file = database.files[index];\n      this.database = database;\n    });\n  }\n\n  async _writeToStorage() {\n    const databaseStr = JSON.stringify(this.database);\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      sessionStorage.setItem(\"pdfjs.history\", databaseStr);\n      return;\n    }\n    localStorage.setItem(\"pdfjs.history\", databaseStr);\n  }\n\n  async _readFromStorage() {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      return sessionStorage.getItem(\"pdfjs.history\");\n    }\n    return localStorage.getItem(\"pdfjs.history\");\n  }\n\n  async set(name, val) {\n    await this._initializedPromise;\n    this.file[name] = val;\n    return this._writeToStorage();\n  }\n\n  async setMultiple(properties) {\n    await this._initializedPromise;\n    for (const name in properties) {\n      this.file[name] = properties[name];\n    }\n    return this._writeToStorage();\n  }\n\n  async get(name, defaultValue) {\n    await this._initializedPromise;\n    const val = this.file[name];\n    return val !== undefined ? val : defaultValue;\n  }\n\n  async getMultiple(properties) {\n    await this._initializedPromise;\n    const values = Object.create(null);\n\n    for (const name in properties) {\n      const val = this.file[name];\n      values[name] = val !== undefined ? val : properties[name];\n    }\n    return values;\n  }\n}\n\nexport { ViewHistory };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n\nimport {\n  docStyle,\n  PresentationModeState,\n  SidebarView,\n  toggleExpandedBtn,\n  toggleSelectedBtn,\n} from \"./ui_utils.js\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { Menu } from \"./menu.js\";\nimport { Sidebar } from \"./sidebar.js\";\n\nconst SIDEBAR_WIDTH_VAR = \"--viewsManager-width\";\nconst SIDEBAR_RESIZING_CLASS = \"viewsManagerResizing\";\nconst UI_NOTIFICATION_CLASS = \"pdfSidebarNotification\";\n\n/**\n * @typedef {Object} PDFSidebarOptions\n * @property {PDFSidebarElements} elements - The DOM elements.\n * @property {EventBus} eventBus - The application event bus.\n * @property {L10n} l10n - The localization service.\n */\n\n/**\n * @typedef {Object} PDFSidebarElements\n * @property {HTMLDivElement} outerContainer - The outer container\n *   (encasing both the viewer and sidebar elements).\n * @property {HTMLDivElement} sidebarContainer - The sidebar container\n *   (in which the views are placed).\n * @property {HTMLButtonElement} toggleButton - The button used for\n *   opening/closing the sidebar.\n * @property {HTMLDivElement} resizer - The DOM element that can be dragged in\n *   order to adjust the width of the sidebar.\n * @property {HTMLButtonElement} thumbnailButton - The button used to show\n *   the thumbnail view.\n * @property {HTMLButtonElement} outlineButton - The button used to show\n *   the outline view.\n * @property {HTMLButtonElement} attachmentsButton - The button used to show\n *   the attachments view.\n * @property {HTMLButtonElement} layersButton - The button used to show\n *   the layers view.\n * @property {HTMLDivElement} thumbnailView - The container in which\n *   the thumbnails are placed.\n * @property {HTMLDivElement} outlineView - The container in which\n *   the outline is placed.\n * @property {HTMLDivElement} attachmentsView - The container in which\n *   the attachments are placed.\n * @property {HTMLDivElement} layersView - The container in which\n *   the layers are placed.\n * @property {HTMLButtonElement} currentOutlineItemButton - The button used to\n *   find the current outline item.\n */\n\nclass ViewsManager extends Sidebar {\n  static #l10nDescription = null;\n\n  #hasAnimations = !window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n    .matches;\n\n  /**\n   * @param {PDFSidebarOptions} options\n   */\n  constructor({\n    elements: {\n      outerContainer,\n      sidebarContainer,\n      toggleButton,\n      resizer,\n      thumbnailButton,\n      outlineButton,\n      attachmentsButton,\n      layersButton,\n      thumbnailsView,\n      outlinesView,\n      attachmentsView,\n      layersView,\n      viewsManagerAddFile: { button: viewsManagerAddFileButton },\n      viewsManagerCurrentOutlineButton,\n      viewsManagerSelectorButton,\n      viewsManagerSelectorOptions,\n      viewsManagerHeaderLabel,\n      viewsManagerStatus,\n    },\n    eventBus,\n    l10n,\n    enableMerge = false,\n    enableSplitMerge = false,\n    globalAbortSignal,\n  }) {\n    super(\n      {\n        sidebar: sidebarContainer,\n        resizer,\n        toggleButton,\n      },\n      l10n.getDirection() === \"ltr\",\n      /* isResizerOnTheLeft = */ false,\n      globalAbortSignal\n    );\n    this.isOpen = false;\n    this.active = SidebarView.THUMBS;\n    this.isInitialViewSet = false;\n    this.isInitialEventDispatched = false;\n\n    /**\n     * Callback used when the sidebar has been opened/closed, to ensure that\n     * the viewers (PDFViewer/PDFThumbnailViewer) are updated correctly.\n     */\n    this.onToggled = null;\n    this.onUpdateThumbnails = null;\n\n    this.outerContainer = outerContainer;\n    this.sidebarContainer = sidebarContainer;\n    this.toggleButton = toggleButton;\n    this.resizer = resizer;\n\n    this.thumbnailButton = thumbnailButton;\n    this.outlineButton = outlineButton;\n    this.attachmentsButton = attachmentsButton;\n    this.layersButton = layersButton;\n\n    this.thumbnailsView = thumbnailsView;\n    this.outlinesView = outlinesView;\n    this.attachmentsView = attachmentsView;\n    this.layersView = layersView;\n\n    this.viewsManagerAddFileButton = viewsManagerAddFileButton;\n    this.viewsManagerCurrentOutlineButton = viewsManagerCurrentOutlineButton;\n    this.viewsManagerHeaderLabel = viewsManagerHeaderLabel;\n    this.viewsManagerStatus = viewsManagerStatus;\n\n    this.eventBus = eventBus;\n\n    if (!enableSplitMerge) {\n      viewsManagerStatus.hidden = true;\n    }\n    this._enableSplitMerge = enableSplitMerge;\n    this._enableMerge = enableMerge;\n    if (!enableMerge) {\n      viewsManagerAddFileButton.hidden = true;\n    }\n\n    this.menu = new Menu(\n      viewsManagerSelectorOptions,\n      viewsManagerSelectorButton,\n      [thumbnailButton, outlineButton, attachmentsButton, layersButton]\n    );\n\n    ViewsManager.#l10nDescription ||= Object.freeze({\n      pagesTitle: \"pdfjs-views-manager-pages-title\",\n      outlinesTitle: \"pdfjs-views-manager-outlines-title1\",\n      attachmentsTitle: \"pdfjs-views-manager-attachments-title\",\n      layersTitle: \"pdfjs-views-manager-layers-title1\",\n      notificationButton: \"pdfjs-toggle-views-manager-notification-button\",\n      toggleButton: \"pdfjs-toggle-views-manager-button1\",\n    });\n\n    this.#addEventListeners();\n  }\n\n  reset() {\n    this.isInitialViewSet = false;\n    this.isInitialEventDispatched = false;\n\n    this.#hideUINotification(/* reset = */ true);\n    this.switchView(SidebarView.THUMBS);\n\n    this.outlineButton.disabled =\n      this.attachmentsButton.disabled =\n      this.layersButton.disabled =\n        false;\n    this.viewsManagerCurrentOutlineButton.disabled = true;\n  }\n\n  /**\n   * @type {number} One of the values in {SidebarView}.\n   */\n  get visibleView() {\n    return this.isOpen ? this.active : SidebarView.NONE;\n  }\n\n  /**\n   * @param {number} view - The sidebar view that should become visible,\n   *                        must be one of the values in {SidebarView}.\n   */\n  setInitialView(view = SidebarView.NONE) {\n    if (this.isInitialViewSet) {\n      return;\n    }\n    this.isInitialViewSet = true;\n\n    // If the user has already manually opened the sidebar, immediately closing\n    // it would be bad UX; also ignore the \"unknown\" sidebar view value.\n    if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) {\n      this.#dispatchEvent();\n      return;\n    }\n    this.switchView(view, /* forceOpen = */ true);\n\n    // Prevent dispatching two back-to-back \"sidebarviewchanged\" events,\n    // since `this.switchView` dispatched the event if the view changed.\n    if (!this.isInitialEventDispatched) {\n      this.#dispatchEvent();\n    }\n  }\n\n  /**\n   * @param {number} view - The sidebar view that should be switched to,\n   *                        must be one of the values in {SidebarView}.\n   * @param {boolean} [forceOpen] - Ensure that the sidebar is open.\n   *                                The default value is `false`.\n   */\n  switchView(view, forceOpen = false) {\n    const isViewChanged = view !== this.active;\n    let forceRendering = false;\n    let titleL10nId = null;\n\n    switch (view) {\n      case SidebarView.NONE:\n        if (this.isOpen) {\n          this.close();\n        }\n        return; // Closing will trigger rendering and dispatch the event.\n      case SidebarView.THUMBS:\n        titleL10nId = \"pagesTitle\";\n        if (this.isOpen && isViewChanged) {\n          forceRendering = true;\n        }\n        break;\n      case SidebarView.OUTLINE:\n        titleL10nId = \"outlinesTitle\";\n        if (this.outlineButton.disabled) {\n          return;\n        }\n        break;\n      case SidebarView.ATTACHMENTS:\n        titleL10nId = \"attachmentsTitle\";\n        if (this.attachmentsButton.disabled) {\n          return;\n        }\n        break;\n      case SidebarView.LAYERS:\n        titleL10nId = \"layersTitle\";\n        if (this.layersButton.disabled) {\n          return;\n        }\n        break;\n      default:\n        console.error(`PDFSidebar.switchView: \"${view}\" is not a valid view.`);\n        return;\n    }\n\n    this.viewsManagerStatus.hidden =\n      !this._enableSplitMerge || view !== SidebarView.THUMBS;\n    this.viewsManagerAddFileButton.hidden =\n      !this._enableMerge || view !== SidebarView.THUMBS;\n    this.viewsManagerCurrentOutlineButton.hidden = view !== SidebarView.OUTLINE;\n    this.viewsManagerHeaderLabel.setAttribute(\n      \"data-l10n-id\",\n      ViewsManager.#l10nDescription[titleL10nId] || \"\"\n    );\n\n    // Update the active view *after* it has been validated above,\n    // in order to prevent setting it to an invalid state.\n    this.active = view;\n\n    // Update the CSS classes (and aria attributes), for all buttons and views.\n    toggleSelectedBtn(\n      this.thumbnailButton,\n      view === SidebarView.THUMBS,\n      this.thumbnailsView\n    );\n    toggleSelectedBtn(\n      this.outlineButton,\n      view === SidebarView.OUTLINE,\n      this.outlinesView\n    );\n    toggleSelectedBtn(\n      this.attachmentsButton,\n      view === SidebarView.ATTACHMENTS,\n      this.attachmentsView\n    );\n    toggleSelectedBtn(\n      this.layersButton,\n      view === SidebarView.LAYERS,\n      this.layersView\n    );\n\n    if (forceOpen && !this.isOpen) {\n      this.open();\n      return; // Opening will trigger rendering and dispatch the event.\n    }\n    if (forceRendering) {\n      this.onUpdateThumbnails();\n      this.onToggled();\n    }\n    if (isViewChanged) {\n      this.#dispatchEvent();\n    }\n  }\n\n  open() {\n    if (this.isOpen) {\n      return;\n    }\n    this.isOpen = true;\n    this.onResizing(this.width);\n    this._sidebar.hidden = false;\n    toggleExpandedBtn(this.toggleButton, true);\n    this.switchView(this.active);\n\n    if (this.#hasAnimations) {\n      // Changing `hidden` above may cause a reflow which would prevent the\n      // CSS transition from being applied correctly, so we need to delay\n      // adding the relevant CSS classes.\n      queueMicrotask(() => {\n        this.outerContainer.classList.add(\n          \"viewsManagerMoving\",\n          \"viewsManagerOpen\"\n        );\n      });\n    } else {\n      this.outerContainer.classList.add(\"viewsManagerOpen\");\n      this.eventBus.dispatch(\"resize\", { source: this });\n    }\n    if (this.active === SidebarView.THUMBS) {\n      this.onUpdateThumbnails();\n    }\n    this.onToggled();\n    this.#dispatchEvent();\n\n    this.#hideUINotification();\n  }\n\n  close(evt = null) {\n    if (!this.isOpen) {\n      return;\n    }\n    this.isOpen = false;\n    this._sidebar.hidden = true;\n    toggleExpandedBtn(this.toggleButton, false);\n\n    this.outerContainer.classList.add(\"viewsManagerMoving\");\n    this.outerContainer.classList.remove(\"viewsManagerOpen\");\n\n    this.onToggled();\n    this.#dispatchEvent();\n\n    if (evt?.detail > 0) {\n      // Remove focus from the toggleButton if it's clicked (see issue 17361).\n      this.toggleButton.blur();\n    }\n  }\n\n  toggle(evt = null) {\n    super.toggle();\n    if (this.isOpen) {\n      this.close(evt);\n    } else {\n      this.open();\n    }\n  }\n\n  #dispatchEvent() {\n    if (this.isInitialViewSet) {\n      this.isInitialEventDispatched ||= true;\n    }\n\n    this.eventBus.dispatch(\"sidebarviewchanged\", {\n      source: this,\n      view: this.visibleView,\n    });\n  }\n\n  #showUINotification() {\n    this.toggleButton.setAttribute(\n      \"data-l10n-id\",\n      ViewsManager.#l10nDescription.notificationButton\n    );\n\n    if (!this.isOpen) {\n      // Only show the notification on the `toggleButton` if the sidebar is\n      // currently closed, to avoid unnecessarily bothering the user.\n      this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);\n    }\n  }\n\n  #hideUINotification(reset = false) {\n    if (this.isOpen || reset) {\n      // Only hide the notification on the `toggleButton` if the sidebar is\n      // currently open, or when the current PDF document is being closed.\n      this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);\n    }\n\n    if (reset) {\n      this.toggleButton.setAttribute(\n        \"data-l10n-id\",\n        ViewsManager.#l10nDescription.toggleButton\n      );\n    }\n  }\n\n  #addEventListeners() {\n    const { eventBus, outerContainer } = this;\n\n    if (this.#hasAnimations) {\n      this.sidebarContainer.addEventListener(\"transitionend\", evt => {\n        if (evt.target === this.sidebarContainer) {\n          outerContainer.classList.remove(\"viewsManagerMoving\");\n          // Ensure that rendering is triggered after opening/closing the\n          // sidebar.\n          eventBus.dispatch(\"resize\", { source: this });\n        }\n      });\n    }\n\n    this.viewsManagerHeaderLabel.addEventListener(\"dblclick\", e => {\n      if (this.active === SidebarView.OUTLINE) {\n        eventBus.dispatch(\"toggleoutlinetree\", { source: this });\n        return;\n      }\n      if (this.active === SidebarView.LAYERS) {\n        eventBus.dispatch(\"resetlayers\", { source: this });\n      }\n    });\n\n    // Buttons for switching views.\n    this.thumbnailButton.addEventListener(\"click\", () => {\n      this.switchView(SidebarView.THUMBS);\n    });\n\n    this.outlineButton.addEventListener(\"click\", () => {\n      this.switchView(SidebarView.OUTLINE);\n    });\n\n    this.attachmentsButton.addEventListener(\"click\", () => {\n      this.switchView(SidebarView.ATTACHMENTS);\n    });\n\n    this.layersButton.addEventListener(\"click\", () => {\n      this.switchView(SidebarView.LAYERS);\n    });\n\n    // Buttons for view-specific options.\n    this.viewsManagerCurrentOutlineButton.addEventListener(\"click\", () => {\n      eventBus.dispatch(\"currentoutlineitem\", { source: this });\n    });\n\n    // Disable/enable views.\n    const onTreeLoaded = (count, button, view) => {\n      button.disabled = !count;\n\n      if (count) {\n        this.#showUINotification();\n      } else if (this.active === view) {\n        // If the `view` was opened by the user during document load,\n        // switch away from it if it turns out to be empty.\n        this.switchView(SidebarView.THUMBS);\n      }\n    };\n\n    eventBus.on(\n      \"outlineloaded\",\n      evt => {\n        onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE);\n\n        evt.currentOutlineItemPromise.then(enabled => {\n          if (!this.isInitialViewSet) {\n            return;\n          }\n          this.viewsManagerCurrentOutlineButton.disabled = !enabled;\n        });\n      },\n      internalOpt\n    );\n\n    eventBus.on(\n      \"attachmentsloaded\",\n      evt => {\n        onTreeLoaded(\n          evt.attachmentsCount,\n          this.attachmentsButton,\n          SidebarView.ATTACHMENTS\n        );\n      },\n      internalOpt\n    );\n\n    eventBus.on(\n      \"layersloaded\",\n      evt => {\n        onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS);\n      },\n      internalOpt\n    );\n\n    // Update the thumbnailViewer, if visible, when exiting presentation mode.\n    eventBus.on(\n      \"presentationmodechanged\",\n      evt => {\n        if (\n          evt.state === PresentationModeState.NORMAL &&\n          this.visibleView === SidebarView.THUMBS\n        ) {\n          this.onUpdateThumbnails();\n        }\n      },\n      internalOpt\n    );\n  }\n\n  onStartResizing() {\n    this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);\n  }\n\n  onStopResizing() {\n    this.eventBus.dispatch(\"resize\", { source: this });\n    this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);\n  }\n\n  onResizing(newWidth) {\n    docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${newWidth}px`);\n  }\n}\n\nexport { ViewsManager };\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/api.js\").PDFDocumentProxy} PDFDocumentProxy */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../src/display/api.js\").PDFDocumentLoadingTask} PDFDocumentLoadingTask */\n\nimport {\n  animationStarted,\n  apiPageLayoutToViewerModes,\n  apiPageModeToSidebarView,\n  AutoPrintRegExp,\n  CursorTool,\n  DEFAULT_SCALE_VALUE,\n  docStyle,\n  getActiveOrFocusedElement,\n  isValidRotation,\n  isValidScrollMode,\n  isValidSpreadMode,\n  normalizeWheelEventDirection,\n  parseQueryString,\n  ProgressBar,\n  ScrollMode,\n  SidebarView,\n  SpreadMode,\n  TextLayerMode,\n} from \"./ui_utils.js\";\nimport {\n  AnnotationEditorType,\n  build,\n  FeatureTest,\n  getDocument,\n  getFilenameFromUrl,\n  getPdfFilenameFromUrl,\n  GlobalWorkerOptions,\n  InvalidPDFException,\n  isDataScheme,\n  isPdfFile,\n  OutputScale,\n  PDFWorker,\n  ResponseException,\n  shadow,\n  stopEvent,\n  TouchManager,\n  updateUrlHash,\n  version,\n} from \"pdfjs-lib\";\nimport { AppOptions, OptionKind } from \"./app_options.js\";\nimport { EventBus, FirefoxEventBus } from \"./event_utils.js\";\nimport { ExternalServices, initCom, MLManager } from \"web-external_services\";\nimport {\n  ImageAltTextSettings,\n  NewAltTextManager,\n} from \"web-new_alt_text_manager\";\nimport { LinkTarget, PDFLinkService } from \"./pdf_link_service.js\";\nimport { AltTextManager } from \"web-alt_text_manager\";\nimport { AnnotationEditorParams } from \"web-annotation_editor_params\";\nimport { CaretBrowsingMode } from \"./caret_browsing.js\";\nimport { CommentManager } from \"./comment_manager.js\";\nimport { DownloadManager } from \"web-download_manager\";\nimport { EditorUndoBar } from \"./editor_undo_bar.js\";\nimport { internalOpt } from \"./internal_evt.js\";\nimport { OverlayManager } from \"./overlay_manager.js\";\nimport { PasswordPrompt } from \"./password_prompt.js\";\nimport { PDFAttachmentViewer } from \"web-pdf_attachment_viewer\";\nimport { PDFCursorTools } from \"web-pdf_cursor_tools\";\nimport { PDFDocumentProperties } from \"web-pdf_document_properties\";\nimport { PDFFindBar } from \"web-pdf_find_bar\";\nimport { PDFFindController } from \"./pdf_find_controller.js\";\nimport { PDFHistory } from \"./pdf_history.js\";\nimport { PDFLayerViewer } from \"web-pdf_layer_viewer\";\nimport { PDFOutlineViewer } from \"web-pdf_outline_viewer\";\nimport { PDFPresentationMode } from \"web-pdf_presentation_mode\";\nimport { PDFPrintServiceFactory } from \"web-print_service\";\nimport { PDFRenderingQueue } from \"./pdf_rendering_queue.js\";\nimport { PDFScriptingManager } from \"./pdf_scripting_manager.js\";\nimport { PdfTextExtractor } from \"./pdf_text_extractor.js\";\nimport { PDFThumbnailViewer } from \"web-pdf_thumbnail_viewer\";\nimport { PDFViewer } from \"./pdf_viewer.js\";\nimport { Preferences } from \"web-preferences\";\nimport { RenderingStates } from \"./renderable_view.js\";\nimport { SecondaryToolbar } from \"web-secondary_toolbar\";\nimport { SignatureManager } from \"web-signature_manager\";\nimport { Toolbar } from \"web-toolbar\";\nimport { ViewHistory } from \"./view_history.js\";\nimport { ViewsManager } from \"web-views_manager\";\n\nconst FORCE_PAGES_LOADED_TIMEOUT = 10000; // ms\n\nconst ViewOnLoad = {\n  UNKNOWN: -1,\n  PREVIOUS: 0, // Default value.\n  INITIAL: 1,\n};\n\nconst PDFViewerApplication = {\n  initialBookmark: document.location.hash.substring(1),\n  _initializedCapability: {\n    ...Promise.withResolvers(),\n    settled: false,\n  },\n  appConfig: null,\n  /** @type {PDFDocumentProxy} */\n  pdfDocument: null,\n  /** @type {PDFDocumentLoadingTask} */\n  pdfLoadingTask: null,\n  printService: null,\n  /** @type {PDFViewer} */\n  pdfViewer: null,\n  /** @type {PDFThumbnailViewer} */\n  pdfThumbnailViewer: null,\n  /** @type {PDFRenderingQueue} */\n  pdfRenderingQueue: null,\n  /** @type {PDFPresentationMode} */\n  pdfPresentationMode: null,\n  /** @type {PDFDocumentProperties} */\n  pdfDocumentProperties: null,\n  /** @type {PDFLinkService} */\n  pdfLinkService: null,\n  /** @type {PdfTextExtractor|null} */\n  pdfTextExtractor: null,\n  /** @type {PDFHistory} */\n  pdfHistory: null,\n  /** @type {ViewsManager} */\n  viewsManager: null,\n  /** @type {PDFOutlineViewer} */\n  pdfOutlineViewer: null,\n  /** @type {PDFAttachmentViewer} */\n  pdfAttachmentViewer: null,\n  /** @type {PDFLayerViewer} */\n  pdfLayerViewer: null,\n  /** @type {PDFCursorTools} */\n  pdfCursorTools: null,\n  /** @type {PDFScriptingManager} */\n  pdfScriptingManager: null,\n  /** @type {ViewHistory} */\n  store: null,\n  /** @type {DownloadManager} */\n  downloadManager: null,\n  /** @type {OverlayManager} */\n  overlayManager: null,\n  /** @type {Preferences} */\n  preferences: new Preferences(),\n  /** @type {Toolbar} */\n  toolbar: null,\n  /** @type {SecondaryToolbar} */\n  secondaryToolbar: null,\n  /** @type {EventBus} */\n  eventBus: null,\n  /** @type {L10n} */\n  l10n: null,\n  /** @type {AnnotationEditorParams} */\n  annotationEditorParams: null,\n  /** @type {ImageAltTextSettings} */\n  imageAltTextSettings: null,\n  isInitialViewSet: false,\n  isViewerEmbedded: window.parent !== window,\n  url: \"\",\n  baseUrl: \"\",\n  mlManager: null,\n  _downloadUrl: \"\",\n  _eventBusAC: null,\n  _windowAC: null,\n  _globalAbortController: new AbortController(),\n  documentInfo: null,\n  metadata: null,\n  _contentDispositionFilename: null,\n  _contentLength: null,\n  _saveInProgress: false,\n  _wheelUnusedTicks: 0,\n  _wheelUnusedFactor: 1,\n  _touchManager: null,\n  _touchUnusedTicks: 0,\n  _touchUnusedFactor: 1,\n  _PDFBug: null,\n  _hasAnnotationEditors: false,\n  _title: document.title,\n  _printAnnotationStoragePromise: null,\n  _isCtrlKeyDown: false,\n  _caretBrowsing: null,\n  _isScrolling: false,\n  editorUndoBar: null,\n  _printPermissionPromise: null,\n\n  // Called once when the document is loaded.\n  async initialize(appConfig) {\n    this.appConfig = appConfig;\n\n    // Ensure that `Preferences`, and indirectly `AppOptions`, have initialized\n    // before creating e.g. the various viewer components.\n    try {\n      await this.preferences.initializedPromise;\n    } catch (ex) {\n      console.error(\"initialize:\", ex);\n    }\n    if (AppOptions.get(\"pdfBugEnabled\")) {\n      await this._parseHashParams();\n    }\n\n    let mode;\n    switch (AppOptions.get(\"viewerCssTheme\")) {\n      case 1:\n        mode = \"light\";\n        break;\n      case 2:\n        mode = \"dark\";\n        break;\n    }\n    if (mode) {\n      docStyle.setProperty(\"color-scheme\", mode);\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n      if (AppOptions.get(\"enableFakeMLManager\")) {\n        this.mlManager =\n          MLManager.getFakeMLManager?.({\n            enableGuessAltText: AppOptions.get(\"enableGuessAltText\"),\n            enableAltTextModelDownload: AppOptions.get(\n              \"enableAltTextModelDownload\"\n            ),\n          }) || null;\n      }\n    } else if (PDFJSDev.test(\"MOZCENTRAL\")) {\n      if (AppOptions.get(\"enableAltText\")) {\n        // We want to load the image-to-text AI engine as soon as possible.\n        this.mlManager = new MLManager({\n          enableGuessAltText: AppOptions.get(\"enableGuessAltText\"),\n          enableAltTextModelDownload: AppOptions.get(\n            \"enableAltTextModelDownload\"\n          ),\n          altTextLearnMoreUrl: AppOptions.get(\"altTextLearnMoreUrl\"),\n        });\n      }\n    }\n\n    // Ensure that the `L10n`-instance has been initialized before creating\n    // e.g. the various viewer components.\n    this.l10n = await this.externalServices.createL10n();\n    document.getElementsByTagName(\"html\")[0].dir = this.l10n.getDirection();\n    // Connect Fluent, when necessary, and translate what we already have.\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      this.l10n.translate(appConfig.appContainer || document.documentElement);\n    }\n\n    if (\n      this.isViewerEmbedded &&\n      AppOptions.get(\"externalLinkTarget\") === LinkTarget.NONE\n    ) {\n      // Prevent external links from \"replacing\" the viewer,\n      // when it's embedded in e.g. an <iframe> or an <object>.\n      AppOptions.set(\"externalLinkTarget\", LinkTarget.TOP);\n    }\n    await this._initializeViewerComponents();\n\n    // Bind the various event handlers *after* the viewer has been\n    // initialized, to prevent errors if an event arrives too soon.\n    this.bindEvents();\n    this.bindWindowEvents();\n\n    this._initializedCapability.settled = true;\n    this._initializedCapability.resolve();\n  },\n\n  /**\n   * Potentially parse special debugging flags in the hash section of the URL.\n   * @private\n   */\n  async _parseHashParams() {\n    const hash = document.location.hash.substring(1);\n    if (!hash) {\n      return;\n    }\n    const { mainContainer, viewerContainer } = this.appConfig,\n      params = parseQueryString(hash);\n\n    const loadPDFBug = async () => {\n      if (this._PDFBug) {\n        return;\n      }\n      const { PDFBug } =\n        typeof PDFJSDev === \"undefined\"\n          ? await import(AppOptions.get(\"debuggerSrc\")) // eslint-disable-line no-unsanitized/method\n          : await __raw_import__(AppOptions.get(\"debuggerSrc\"));\n\n      this._PDFBug = PDFBug;\n    };\n\n    // Parameters that need to be handled manually.\n    if (params.get(\"disableworker\") === \"true\") {\n      try {\n        GlobalWorkerOptions.workerSrc ||= AppOptions.get(\"workerSrc\");\n\n        typeof PDFJSDev === \"undefined\" // eslint-disable-line no-unused-expressions\n          ? await import(\"pdfjs/pdf.worker.js\")\n          : await __raw_import__(PDFWorker.workerSrc);\n\n        // Ensure that the \"fake\" worker won't be ignored.\n        AppOptions.set(\"workerPort\", null);\n      } catch (ex) {\n        console.error(\"_parseHashParams:\", ex);\n      }\n    }\n    if (params.has(\"textlayer\")) {\n      switch (params.get(\"textlayer\")) {\n        case \"off\":\n          AppOptions.set(\"textLayerMode\", TextLayerMode.DISABLE);\n          break;\n        case \"visible\":\n        case \"shadow\":\n        case \"hover\":\n          viewerContainer.classList.add(`textLayer-${params.get(\"textlayer\")}`);\n          try {\n            await loadPDFBug();\n            this._PDFBug.loadCSS();\n          } catch (ex) {\n            console.error(\"_parseHashParams:\", ex);\n          }\n          break;\n      }\n    }\n    if (params.has(\"pdfbug\")) {\n      const enabled = params.get(\"pdfbug\").split(\",\");\n      try {\n        await loadPDFBug();\n        this._PDFBug.init(mainContainer, enabled);\n      } catch (ex) {\n        console.error(\"_parseHashParams:\", ex);\n      }\n\n      const debugOpts = { pdfBug: true, fontExtraProperties: true };\n      if (globalThis.StepperManager?.enabled) {\n        debugOpts.minDurationToUpdateCanvas = 0;\n      }\n      AppOptions.setAll(debugOpts);\n    }\n    // It is not possible to change locale for the (various) extension builds.\n    if (\n      (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n      params.has(\"locale\")\n    ) {\n      AppOptions.set(\"localeProperties\", { lang: params.get(\"locale\") });\n    }\n\n    // Parameters that can be handled automatically.\n    const opts = {\n      disableAutoFetch: x => x === \"true\",\n      disableFontFace: x => x === \"true\",\n      disableHistory: x => x === \"true\",\n      disableRange: x => x === \"true\",\n      disableStream: x => x === \"true\",\n      verbosity: x => x | 0,\n    };\n\n    // Set some specific preferences for tests.\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      Object.assign(opts, {\n        capCanvasAreaFactor: x => parseInt(x, 10),\n        docBaseUrl: x => x,\n        enableAltText: x => x === \"true\",\n        enableAutoLinking: x => x === \"true\",\n        enableComment: x => x === \"true\",\n        enableFakeMLManager: x => x === \"true\",\n        enableGuessAltText: x => x === \"true\",\n        enableNewBadge: x => x === \"true\",\n        enablePermissions: x => x === \"true\",\n        enableMerge: x => x === \"true\",\n        enableSelectionRendering: x => x === \"true\",\n        enableSplitMerge: x => x === \"true\",\n        enableUpdatedAddImage: x => x === \"true\",\n        highlightEditorColors: x => x,\n        imagesRightClickMinSize: x => parseInt(x, 10),\n        maxCanvasPixels: x => parseInt(x, 10),\n        spreadModeOnLoad: x => parseInt(x, 10),\n        supportsCaretBrowsingMode: x => x === \"true\",\n        supportsDownloading: x => x === \"true\",\n        viewerCssTheme: x => parseInt(x, 10),\n        forcePageColors: x => x === \"true\",\n        pageColorsBackground: x => x,\n        pageColorsForeground: x => x,\n        sidebarViewOnLoad: x => parseInt(x, 10),\n      });\n    }\n\n    for (const name in opts) {\n      const check = opts[name],\n        key = name.toLowerCase();\n\n      if (params.has(key)) {\n        AppOptions.set(name, check(params.get(key)));\n      }\n    }\n  },\n\n  /**\n   * @private\n   */\n  async _initializeViewerComponents() {\n    const { appConfig, externalServices, l10n, mlManager } = this;\n    const abortSignal = this._globalAbortController.signal;\n\n    const eventBus =\n      typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n        ? new FirefoxEventBus(\n            AppOptions.get(\"allowedGlobalEvents\"),\n            externalServices,\n            AppOptions.get(\"isInAutomation\")\n          )\n        : new EventBus();\n    this.eventBus = AppOptions.eventBus = eventBus;\n\n    mlManager?.setEventBus(eventBus, abortSignal);\n\n    const overlayManager = (this.overlayManager = new OverlayManager());\n\n    const renderingQueue = (this.pdfRenderingQueue = new PDFRenderingQueue());\n    renderingQueue.onIdle = this._cleanup.bind(this);\n\n    const linkService = (this.pdfLinkService = new PDFLinkService({\n      eventBus,\n      externalLinkTarget: AppOptions.get(\"externalLinkTarget\"),\n      externalLinkRel: AppOptions.get(\"externalLinkRel\"),\n      ignoreDestinationZoom: AppOptions.get(\"ignoreDestinationZoom\"),\n    }));\n\n    const supportsDownloading = AppOptions.get(\"supportsDownloading\");\n    const downloadManager = (this.downloadManager = supportsDownloading\n      ? new DownloadManager()\n      : null);\n    if (appConfig.secondaryToolbar?.downloadButton) {\n      appConfig.secondaryToolbar.downloadButton.hidden = !supportsDownloading;\n    }\n    if (appConfig.toolbar?.download) {\n      appConfig.toolbar.download.hidden = !supportsDownloading;\n    }\n\n    const findController = (this.findController = new PDFFindController({\n      linkService,\n      eventBus,\n      updateMatchesCountOnProgress:\n        typeof PDFJSDev === \"undefined\"\n          ? !window.isGECKOVIEW\n          : !PDFJSDev.test(\"GECKOVIEW\"),\n    }));\n\n    const pdfScriptingManager = (this.pdfScriptingManager =\n      new PDFScriptingManager({\n        eventBus,\n        externalServices,\n        docProperties: this._scriptingDocProperties.bind(this),\n      }));\n\n    const container = appConfig.mainContainer,\n      viewer = appConfig.viewerContainer;\n    const annotationEditorMode = AppOptions.get(\"annotationEditorMode\");\n    const hasForcedColors =\n      AppOptions.get(\"forcePageColors\") ||\n      window.matchMedia(\"(forced-colors: active)\").matches;\n    const pageColors = hasForcedColors\n      ? {\n          background: AppOptions.get(\"pageColorsBackground\"),\n          foreground: AppOptions.get(\"pageColorsForeground\"),\n        }\n      : null;\n    const enableMerge = AppOptions.get(\"enableMerge\");\n    const enableSplitMerge = AppOptions.get(\"enableSplitMerge\");\n\n    let altTextManager;\n    if (AppOptions.get(\"enableUpdatedAddImage\")) {\n      altTextManager = appConfig.newAltTextDialog\n        ? new NewAltTextManager(\n            appConfig.newAltTextDialog,\n            overlayManager,\n            eventBus\n          )\n        : null;\n    } else {\n      altTextManager = appConfig.altTextDialog\n        ? new AltTextManager(\n            appConfig.altTextDialog,\n            container,\n            overlayManager,\n            eventBus\n          )\n        : null;\n    }\n\n    if (appConfig.editorUndoBar) {\n      this.editorUndoBar = new EditorUndoBar(appConfig.editorUndoBar, eventBus);\n    }\n\n    const signatureManager =\n      AppOptions.get(\"enableSignatureEditor\") && appConfig.addSignatureDialog\n        ? new SignatureManager(\n            appConfig.addSignatureDialog,\n            appConfig.editSignatureDialog,\n            appConfig.annotationEditorParams?.editorSignatureAddSignature ||\n              null,\n            overlayManager,\n            l10n,\n            externalServices.createSignatureStorage(eventBus, abortSignal),\n            eventBus\n          )\n        : null;\n\n    const commentManager =\n      AppOptions.get(\"enableComment\") && appConfig.editCommentDialog\n        ? new CommentManager(\n            appConfig.editCommentDialog,\n            {\n              learnMoreUrl: AppOptions.get(\"commentLearnMoreUrl\"),\n              sidebar:\n                appConfig.annotationEditorParams?.editorCommentsSidebar || null,\n              sidebarResizer:\n                appConfig.annotationEditorParams\n                  ?.editorCommentsSidebarResizer || null,\n              commentsList:\n                appConfig.annotationEditorParams?.editorCommentsSidebarList ||\n                null,\n              commentCount:\n                appConfig.annotationEditorParams?.editorCommentsSidebarCount ||\n                null,\n              sidebarTitle:\n                appConfig.annotationEditorParams?.editorCommentsSidebarTitle ||\n                null,\n              closeButton:\n                appConfig.annotationEditorParams\n                  ?.editorCommentsSidebarCloseButton || null,\n              commentToolbarButton:\n                appConfig.toolbar?.editorCommentButton || null,\n            },\n            eventBus,\n            linkService,\n            overlayManager,\n            /* ltr = */ l10n.getDirection() === \"ltr\",\n            hasForcedColors,\n            abortSignal\n          )\n        : null;\n\n    const maxCanvasPixels = AppOptions.get(\"maxCanvasPixels\"),\n      maxCanvasDim = AppOptions.get(\"maxCanvasDim\"),\n      capCanvasAreaFactor = AppOptions.get(\"capCanvasAreaFactor\");\n    const pdfViewer = (this.pdfViewer = new PDFViewer({\n      container,\n      viewer,\n      viewerAlert: appConfig.viewerAlert,\n      eventBus,\n      renderingQueue,\n      linkService,\n      downloadManager,\n      altTextManager,\n      commentManager,\n      signatureManager,\n      editorUndoBar: this.editorUndoBar,\n      findController,\n      scriptingManager:\n        AppOptions.get(\"enableScripting\") && pdfScriptingManager,\n      l10n,\n      textLayerMode: AppOptions.get(\"textLayerMode\"),\n      annotationMode: AppOptions.get(\"annotationMode\"),\n      annotationEditorMode,\n      annotationEditorHighlightColors: AppOptions.get(\"highlightEditorColors\"),\n      enableHighlightFloatingButton: AppOptions.get(\n        \"enableHighlightFloatingButton\"\n      ),\n      enableUpdatedAddImage: AppOptions.get(\"enableUpdatedAddImage\"),\n      enableNewAltTextWhenAddingImage: AppOptions.get(\n        \"enableNewAltTextWhenAddingImage\"\n      ),\n      imageResourcesPath: AppOptions.get(\"imageResourcesPath\"),\n      enablePrintAutoRotate: AppOptions.get(\"enablePrintAutoRotate\"),\n      maxCanvasPixels,\n      maxCanvasDim,\n      capCanvasAreaFactor,\n      enableDetailCanvas: AppOptions.get(\"enableDetailCanvas\"),\n      enablePermissions: AppOptions.get(\"enablePermissions\"),\n      enableOptimizedPartialRendering: AppOptions.get(\n        \"enableOptimizedPartialRendering\"\n      ),\n      enableSelectionRendering: AppOptions.get(\"enableSelectionRendering\"),\n      imagesRightClickMinSize: AppOptions.get(\"imagesRightClickMinSize\"),\n      pageColors,\n      mlManager,\n      abortSignal,\n      supportsPinchToZoom: this.supportsPinchToZoom,\n      enableAutoLinking: AppOptions.get(\"enableAutoLinking\"),\n      minDurationToUpdateCanvas: AppOptions.get(\"minDurationToUpdateCanvas\"),\n    }));\n\n    renderingQueue.setViewer(pdfViewer);\n    linkService.setViewer(pdfViewer);\n    pdfScriptingManager.setViewer(pdfViewer);\n\n    if (appConfig.viewsManager?.thumbnailsView) {\n      const { viewsManager } = appConfig;\n      this.pdfThumbnailViewer = new PDFThumbnailViewer({\n        container: viewsManager.thumbnailsView,\n        eventBus,\n        renderingQueue,\n        linkService,\n        maxCanvasPixels,\n        maxCanvasDim,\n        pageColors,\n        abortSignal,\n        enableSplitMerge,\n        enableMerge,\n        enableNewBadge: AppOptions.get(\"enableNewBadge\"),\n        statusBar: viewsManager.viewsManagerStatusBar,\n        undoBar: viewsManager.viewsManagerUndoBar,\n        manageMenu: viewsManager.manageMenu,\n        waitingBar: viewsManager.viewsManagerWaitingBar,\n        addFileComponent: viewsManager.viewsManagerAddFile,\n      });\n      renderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);\n    }\n\n    // The browsing history is only enabled when the viewer is standalone,\n    // i.e. not when it is embedded in a web page.\n    if (!this.isViewerEmbedded && !AppOptions.get(\"disableHistory\")) {\n      this.pdfHistory = new PDFHistory({\n        linkService,\n        eventBus,\n      });\n      linkService.setHistory(this.pdfHistory);\n    }\n\n    if (!this.supportsIntegratedFind && appConfig.findBar) {\n      this.findBar = new PDFFindBar(\n        appConfig.findBar,\n        appConfig.principalContainer,\n        eventBus\n      );\n    }\n\n    if (appConfig.annotationEditorParams) {\n      if (annotationEditorMode !== AnnotationEditorType.DISABLE) {\n        const editorSignatureButton = appConfig.toolbar?.editorSignatureButton;\n        if (editorSignatureButton && AppOptions.get(\"enableSignatureEditor\")) {\n          editorSignatureButton.parentElement.hidden = false;\n        }\n        const editorCommentButton = appConfig.toolbar?.editorCommentButton;\n        if (editorCommentButton && AppOptions.get(\"enableComment\")) {\n          editorCommentButton.parentElement.hidden = false;\n        }\n        this.annotationEditorParams = new AnnotationEditorParams(\n          appConfig.annotationEditorParams,\n          eventBus\n        );\n      } else {\n        for (const id of [\"editorModeButtons\", \"editorModeSeparator\"]) {\n          document.getElementById(id)?.classList.add(\"hidden\");\n        }\n      }\n    }\n\n    if (mlManager && appConfig.secondaryToolbar?.imageAltTextSettingsButton) {\n      this.imageAltTextSettings = new ImageAltTextSettings(\n        appConfig.altTextSettingsDialog,\n        overlayManager,\n        eventBus,\n        mlManager\n      );\n    }\n\n    if (appConfig.documentProperties) {\n      this.pdfDocumentProperties = new PDFDocumentProperties(\n        appConfig.documentProperties,\n        overlayManager,\n        eventBus,\n        l10n,\n        /* fileNameLookup = */ () => this._docFilename,\n        /* titleLookup = */ () => this._docTitle\n      );\n    }\n\n    // NOTE: The cursor-tools are unlikely to be helpful/useful in GeckoView,\n    // in particular the `HandTool` which basically simulates touch scrolling.\n    if (appConfig.secondaryToolbar?.cursorHandToolButton) {\n      this.pdfCursorTools = new PDFCursorTools({\n        container,\n        eventBus,\n        cursorToolOnLoad: AppOptions.get(\"cursorToolOnLoad\"),\n      });\n    }\n\n    if (appConfig.toolbar) {\n      if (\n        typeof PDFJSDev === \"undefined\"\n          ? window.isGECKOVIEW\n          : PDFJSDev.test(\"GECKOVIEW\")\n      ) {\n        const nimbusData = JSON.parse(\n          AppOptions.get(\"nimbusDataStr\") || \"null\"\n        );\n        this.toolbar = new Toolbar(appConfig.toolbar, eventBus, nimbusData);\n      } else {\n        this.toolbar = new Toolbar(\n          appConfig.toolbar,\n          eventBus,\n          AppOptions.get(\"toolbarDensity\")\n        );\n      }\n    }\n\n    if (appConfig.secondaryToolbar) {\n      if (AppOptions.get(\"enableAltText\")) {\n        appConfig.secondaryToolbar.imageAltTextSettingsButton?.classList.remove(\n          \"hidden\"\n        );\n        appConfig.secondaryToolbar.imageAltTextSettingsSeparator?.classList.remove(\n          \"hidden\"\n        );\n      }\n\n      this.secondaryToolbar = new SecondaryToolbar(\n        appConfig.secondaryToolbar,\n        eventBus\n      );\n    }\n\n    if (\n      this.supportsFullscreen &&\n      appConfig.secondaryToolbar?.presentationModeButton\n    ) {\n      this.pdfPresentationMode = new PDFPresentationMode({\n        container,\n        pdfViewer,\n        eventBus,\n      });\n    }\n\n    if (appConfig.passwordOverlay) {\n      this.passwordPrompt = new PasswordPrompt(\n        appConfig.passwordOverlay,\n        overlayManager,\n        this.isViewerEmbedded\n      );\n    }\n\n    if (appConfig.viewsManager?.outlinesView) {\n      this.pdfOutlineViewer = new PDFOutlineViewer({\n        container: appConfig.viewsManager.outlinesView,\n        eventBus,\n        l10n,\n        linkService,\n        downloadManager,\n      });\n    }\n\n    if (appConfig.viewsManager?.attachmentsView) {\n      this.pdfAttachmentViewer = new PDFAttachmentViewer({\n        container: appConfig.viewsManager.attachmentsView,\n        eventBus,\n        l10n,\n        downloadManager,\n        linkService,\n      });\n    }\n\n    if (appConfig.viewsManager?.layersView) {\n      this.pdfLayerViewer = new PDFLayerViewer({\n        container: appConfig.viewsManager.layersView,\n        eventBus,\n        l10n,\n      });\n    }\n\n    if (appConfig.viewsManager) {\n      this.viewsManager = new ViewsManager({\n        elements: appConfig.viewsManager,\n        eventBus,\n        l10n,\n        enableMerge,\n        enableSplitMerge,\n        globalAbortSignal: abortSignal,\n      });\n      this.viewsManager.onToggled = this.forceRendering.bind(this);\n      this.viewsManager.onUpdateThumbnails = () => {\n        // Use the rendered pages to set the corresponding thumbnail images.\n        for (const pageView of pdfViewer.getCachedPageViews()) {\n          if (pageView.renderingState === RenderingStates.FINISHED) {\n            this.pdfThumbnailViewer\n              .getThumbnail(pageView.id - 1)\n              ?.setImage(pageView);\n          }\n        }\n        this.pdfThumbnailViewer.scrollThumbnailIntoView(\n          pdfViewer.currentPageNumber\n        );\n      };\n    }\n\n    if (\n      typeof PDFJSDev === \"undefined\" ||\n      PDFJSDev.test(\"TESTING || MOZCENTRAL\")\n    ) {\n      this.pdfTextExtractor = new PdfTextExtractor(\n        externalServices,\n        pdfViewer,\n        eventBus\n      );\n    }\n  },\n\n  async run(config) {\n    await this.initialize(config);\n\n    const { appConfig, eventBus } = this;\n    let file;\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      const queryString = document.location.search.substring(1);\n      const params = parseQueryString(queryString);\n      file = params.get(\"file\") ?? AppOptions.get(\"defaultUrl\");\n      try {\n        file = new URL(file).href;\n      } catch {\n        file = encodeURIComponent(file).replaceAll(\"%2F\", \"/\");\n      }\n      validateFileURL(file);\n    } else if (PDFJSDev.test(\"MOZCENTRAL\")) {\n      file = window.location.href;\n    } else if (PDFJSDev.test(\"CHROME\")) {\n      file = AppOptions.get(\"defaultUrl\");\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      const fileInput = (this._openFileInput = document.createElement(\"input\"));\n      fileInput.id = \"fileInput\";\n      fileInput.hidden = true;\n      fileInput.type = \"file\";\n      fileInput.value = null;\n      document.body.append(fileInput);\n\n      fileInput.addEventListener(\"change\", function (evt) {\n        const { files } = evt.target;\n        if (!files?.length) {\n          return;\n        }\n        eventBus.dispatch(\"fileinputchange\", {\n          source: this,\n          fileInput: evt.target,\n        });\n      });\n\n      // Enable dragging-and-dropping a new PDF file onto the viewerContainer.\n      appConfig.mainContainer.addEventListener(\"dragover\", function (evt) {\n        for (const item of evt.dataTransfer.items) {\n          if (item.type === \"application/pdf\") {\n            evt.dataTransfer.dropEffect =\n              evt.dataTransfer.effectAllowed === \"copy\" ? \"copy\" : \"move\";\n            stopEvent(evt);\n            return;\n          }\n        }\n      });\n      appConfig.mainContainer.addEventListener(\"drop\", function (evt) {\n        if (evt.dataTransfer.files?.[0].type !== \"application/pdf\") {\n          return;\n        }\n        stopEvent(evt);\n        eventBus.dispatch(\"fileinputchange\", {\n          source: this,\n          fileInput: evt.dataTransfer,\n        });\n      });\n    }\n\n    if (!AppOptions.get(\"supportsDocumentFonts\")) {\n      AppOptions.set(\"disableFontFace\", true);\n      this.l10n.get(\"pdfjs-web-fonts-disabled\").then(msg => {\n        console.warn(msg);\n      });\n    }\n\n    const togglePrintingButtons = visible => {\n      appConfig.toolbar?.print?.classList.toggle(\"hidden\", !visible);\n      appConfig.secondaryToolbar?.printButton.classList.toggle(\n        \"hidden\",\n        !visible\n      );\n    };\n    if (!this.supportsPrinting) {\n      togglePrintingButtons(false);\n    } else {\n      eventBus.on(\n        \"printingallowed\",\n        ({ isAllowed }) => togglePrintingButtons(isAllowed),\n        internalOpt\n      );\n    }\n\n    if (!this.supportsFullscreen) {\n      appConfig.secondaryToolbar?.presentationModeButton.classList.add(\n        \"hidden\"\n      );\n    }\n\n    if (this.supportsIntegratedFind) {\n      appConfig.findBar?.toggleButton?.classList.add(\"hidden\");\n    }\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      if (file) {\n        this.open({ url: file });\n      } else {\n        this._hideViewBookmark();\n      }\n    } else if (PDFJSDev.test(\"MOZCENTRAL || CHROME\")) {\n      this.setTitleUsingUrl(file, /* downloadUrl = */ file);\n\n      this.externalServices.initPassiveLoading();\n    } else {\n      throw new Error(\"Not implemented: run\");\n    }\n  },\n\n  get externalServices() {\n    return shadow(this, \"externalServices\", new ExternalServices());\n  },\n\n  get initialized() {\n    return this._initializedCapability.settled;\n  },\n\n  get initializedPromise() {\n    return this._initializedCapability.promise;\n  },\n\n  updateZoom(steps, scaleFactor, origin) {\n    if (this.pdfViewer.isInPresentationMode) {\n      return;\n    }\n    this.pdfViewer.updateScale({\n      drawingDelay: AppOptions.get(\"defaultZoomDelay\"),\n      steps,\n      scaleFactor,\n      origin,\n    });\n  },\n\n  zoomIn() {\n    this.updateZoom(1);\n  },\n\n  zoomOut() {\n    this.updateZoom(-1);\n  },\n\n  zoomReset() {\n    if (this.pdfViewer.isInPresentationMode) {\n      return;\n    }\n    this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;\n  },\n\n  touchPinchCallback(origin, prevDistance, distance) {\n    if (this.supportsPinchToZoom) {\n      const newScaleFactor = this._accumulateFactor(\n        this.pdfViewer.currentScale,\n        distance / prevDistance,\n        \"_touchUnusedFactor\"\n      );\n      this.updateZoom(null, newScaleFactor, origin);\n    } else {\n      const PIXELS_PER_LINE_SCALE = 30;\n      const ticks = this._accumulateTicks(\n        (distance - prevDistance) / PIXELS_PER_LINE_SCALE,\n        \"_touchUnusedTicks\"\n      );\n      this.updateZoom(ticks, null, origin);\n    }\n  },\n\n  touchPinchEndCallback() {\n    this._touchUnusedTicks = 0;\n    this._touchUnusedFactor = 1;\n  },\n\n  get pagesCount() {\n    return this.pdfDocument ? this.pdfDocument.numPages : 0;\n  },\n\n  get page() {\n    return this.pdfViewer.currentPageNumber;\n  },\n\n  set page(val) {\n    this.pdfViewer.currentPageNumber = val;\n  },\n\n  get supportsPrinting() {\n    return shadow(\n      this,\n      \"supportsPrinting\",\n      AppOptions.get(\"supportsPrinting\") &&\n        PDFPrintServiceFactory.supportsPrinting\n    );\n  },\n\n  get supportsFullscreen() {\n    return shadow(this, \"supportsFullscreen\", document.fullscreenEnabled);\n  },\n\n  get supportsPinchToZoom() {\n    return shadow(\n      this,\n      \"supportsPinchToZoom\",\n      AppOptions.get(\"supportsPinchToZoom\")\n    );\n  },\n\n  get supportsIntegratedFind() {\n    return shadow(\n      this,\n      \"supportsIntegratedFind\",\n      AppOptions.get(\"supportsIntegratedFind\")\n    );\n  },\n\n  get loadingBar() {\n    const barElement = document.getElementById(\"loadingBar\");\n    const bar = barElement ? new ProgressBar(barElement) : null;\n    return shadow(this, \"loadingBar\", bar);\n  },\n\n  get supportsMouseWheelZoomCtrlKey() {\n    return shadow(\n      this,\n      \"supportsMouseWheelZoomCtrlKey\",\n      AppOptions.get(\"supportsMouseWheelZoomCtrlKey\")\n    );\n  },\n\n  get supportsMouseWheelZoomMetaKey() {\n    return shadow(\n      this,\n      \"supportsMouseWheelZoomMetaKey\",\n      AppOptions.get(\"supportsMouseWheelZoomMetaKey\")\n    );\n  },\n\n  get supportsCaretBrowsingMode() {\n    return AppOptions.get(\"supportsCaretBrowsingMode\");\n  },\n\n  moveCaret(isUp, select) {\n    this._caretBrowsing ||= new CaretBrowsingMode(\n      this._globalAbortController.signal,\n      this.appConfig.mainContainer,\n      this.appConfig.viewerContainer,\n      this.appConfig.toolbar?.container\n    );\n    this._caretBrowsing.moveCaret(isUp, select);\n  },\n\n  setTitleUsingUrl(url = \"\", downloadUrl = null) {\n    this.url = url;\n    this.baseUrl =\n      typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n        ? updateUrlHash(url, \"\", /* allowRel = */ true)\n        : updateUrlHash(url, \"\");\n    if (downloadUrl) {\n      this._downloadUrl =\n        // eslint-disable-next-line no-nested-ternary\n        downloadUrl === url\n          ? this.baseUrl\n          : typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n            ? updateUrlHash(downloadUrl, \"\", /* allowRel = */ true)\n            : updateUrlHash(downloadUrl, \"\");\n    }\n    if (isDataScheme(url)) {\n      this._hideViewBookmark();\n    } else if (\n      typeof PDFJSDev !== \"undefined\" &&\n      PDFJSDev.test(\"MOZCENTRAL || CHROME\")\n    ) {\n      AppOptions.set(\"docBaseUrl\", this.baseUrl);\n    }\n\n    let title = getPdfFilenameFromUrl(url, \"\");\n    if (!title) {\n      try {\n        title = decodeURIComponent(getFilenameFromUrl(url));\n      } catch {\n        // decodeURIComponent may throw URIError.\n      }\n    }\n    this.setTitle(title || url); // Always fallback to the raw URL.\n  },\n\n  setTitle(title = this._title) {\n    this._title = title;\n\n    if (this.isViewerEmbedded) {\n      // Embedded PDF viewers should not be changing their parent page's title.\n      return;\n    }\n    const hasChangesIndicator =\n      this._hasChanges() && !this.pdfRenderingQueue.printing;\n    document.title = `${hasChangesIndicator ? \"* \" : \"\"}${title}`;\n  },\n\n  get _docFilename() {\n    // Use `this.url` instead of `this.baseUrl` to perform filename detection\n    // based on the reference fragment as ultimate fallback if needed.\n    return this._contentDispositionFilename || getPdfFilenameFromUrl(this.url);\n  },\n\n  get _docTitle() {\n    const { documentInfo, metadata } = this;\n\n    const title = metadata?.get(\"dc:title\");\n    if (title) {\n      // Ghostscript can produce invalid 'dc:title' Metadata entries:\n      //  - The title may be \"Untitled\" (fixes bug 1031612).\n      //  - The title may contain incorrectly encoded characters, which thus\n      //    looks broken, hence we ignore the Metadata entry when it contains\n      //    characters from the Specials Unicode block (fixes bug 1605526).\n      if (title !== \"Untitled\" && !/[\\uFFF0-\\uFFFF]/.test(title)) {\n        return title;\n      }\n    }\n    return documentInfo.Title;\n  },\n\n  /**\n   * @private\n   */\n  _hideViewBookmark() {\n    const { secondaryToolbar } = this.appConfig;\n    // URL does not reflect proper document location - hiding some buttons.\n    secondaryToolbar?.viewBookmarkButton.classList.add(\"hidden\");\n\n    // Avoid displaying multiple consecutive separators in the secondaryToolbar.\n    if (secondaryToolbar?.presentationModeButton.classList.contains(\"hidden\")) {\n      document.getElementById(\"viewBookmarkSeparator\")?.classList.add(\"hidden\");\n    }\n  },\n\n  /**\n   * Closes opened PDF document.\n   * @returns {Promise} - Returns the promise, which is resolved when all\n   *                      destruction is completed.\n   */\n  async close() {\n    this._unblockDocumentLoadEvent();\n    this._hideViewBookmark();\n\n    if (!this.pdfLoadingTask) {\n      return;\n    }\n    if (\n      (typeof PDFJSDev === \"undefined\" ||\n        PDFJSDev.test(\"GENERIC && !TESTING\")) &&\n      this._hasChanges() &&\n      this._annotationStorageModified\n    ) {\n      try {\n        // Trigger saving, to prevent data loss in forms; see issue 12257.\n        await this.downloadOrSave();\n      } catch {\n        // Ignoring errors, to ensure that document closing won't break.\n      }\n    }\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"COVERAGE\")) {\n      // Collect coverage data from the worker before the document is closed.\n      //\n      // Note that `PDFViewerApplication.open` may be invoked multiple times\n      // during an integration-test (see e.g. the \"Merge PDF\" tests).\n      const handler = this.pdfDocument?._transport?.messageHandler;\n      if (handler) {\n        try {\n          const workerCoverage = await handler.sendWithPromise(\n            \"GetWorkerCoverage\",\n            null\n          );\n          (window.__worker_coverage__ ??= []).push(workerCoverage);\n        } catch {}\n      }\n    }\n    const promises = [];\n\n    promises.push(this.pdfLoadingTask.destroy());\n    this.pdfLoadingTask = null;\n\n    if (this.pdfDocument) {\n      this.pdfDocument = null;\n\n      this.pdfThumbnailViewer?.setDocument(null);\n      this.pdfViewer.setDocument(null);\n      this.pdfLinkService.setDocument(null);\n      this.pdfDocumentProperties?.setDocument(null);\n    }\n    this.pdfLinkService.externalLinkEnabled = true;\n    this.store = null;\n    this.isInitialViewSet = false;\n    this.url = \"\";\n    this.baseUrl = \"\";\n    this._downloadUrl = \"\";\n    this.documentInfo = null;\n    this.metadata = null;\n    this._contentDispositionFilename = null;\n    this._contentLength = null;\n    this._saveInProgress = false;\n    this._hasAnnotationEditors = false;\n\n    promises.push(\n      this.pdfScriptingManager.destroyPromise,\n      this.passwordPrompt.close()\n    );\n\n    this.setTitle();\n    this.viewsManager?.reset();\n    this.pdfOutlineViewer?.reset();\n    this.pdfAttachmentViewer?.reset();\n    this.pdfLayerViewer?.reset();\n\n    this.pdfHistory?.reset();\n    this.findBar?.reset();\n    this.toolbar?.reset();\n    this.secondaryToolbar?.reset();\n    this._PDFBug?.cleanup();\n\n    await Promise.all(promises);\n  },\n\n  /**\n   * Opens a new PDF document.\n   * @param {Object} args - Accepts any/all of the properties from\n   *   {@link DocumentInitParameters}, and also a `originalUrl` string.\n   * @returns {Promise} - Promise that is resolved when the document is opened.\n   */\n  async open(args) {\n    if (this.pdfLoadingTask) {\n      // We need to destroy already opened document.\n      await this.close();\n    }\n    // Set the necessary global worker parameters, using the available options.\n    const workerParams = AppOptions.getAll(OptionKind.WORKER);\n    Object.assign(GlobalWorkerOptions, workerParams);\n\n    if (args.data && isPdfFile(args.filename)) {\n      this._contentDispositionFilename = args.filename;\n    } else if (\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n      args.url\n    ) {\n      // The Firefox built-in viewer always calls `setTitleUsingUrl`, before\n      // `initPassiveLoading`, and it never provides an `originalUrl` here.\n      this.setTitleUsingUrl(\n        args.originalUrl || args.url,\n        /* downloadUrl = */ args.url\n      );\n    }\n\n    // Set the necessary API parameters, using all the available options.\n    const apiParams = AppOptions.getAll(OptionKind.API);\n    const loadingTask = getDocument({\n      ...apiParams,\n      ...args,\n    });\n    this.pdfLoadingTask = loadingTask;\n\n    loadingTask.onPassword = (updateCallback, reason) => {\n      if (this.isViewerEmbedded) {\n        // The load event can't be triggered until the password is entered, so\n        // if the viewer is in an iframe and its visibility depends on the\n        // onload callback then the viewer never shows (bug 1801341).\n        this._unblockDocumentLoadEvent();\n      }\n\n      this.pdfLinkService.externalLinkEnabled = false;\n      this.passwordPrompt.setUpdateCallback(updateCallback, reason);\n      this.passwordPrompt.open();\n    };\n\n    loadingTask.onProgress = evt => this.progress(evt.percent);\n\n    return loadingTask.promise.then(\n      pdfDocument => {\n        this.load(pdfDocument);\n      },\n      reason => {\n        if (loadingTask !== this.pdfLoadingTask) {\n          return undefined; // Ignore errors for previously opened PDF files.\n        }\n        if (this.loadingBar) {\n          // Avoid the \"indeterminate\" loadingBar being displayed on error.\n          this.loadingBar.percent ||= 0;\n        }\n\n        let key = \"pdfjs-loading-error\";\n        if (reason instanceof InvalidPDFException) {\n          key = \"pdfjs-invalid-file-error\";\n        } else if (reason instanceof ResponseException) {\n          key = reason.missing\n            ? \"pdfjs-missing-file-error\"\n            : \"pdfjs-unexpected-response-error\";\n        }\n        return this._documentError(key, { message: reason.message }).then(\n          () => {\n            throw reason;\n          }\n        );\n      }\n    );\n  },\n\n  async download() {\n    if (!this.downloadManager) {\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n        this.eventBus.dispatch(\"downloadskipped\", { source: this });\n      }\n      return;\n    }\n\n    let data;\n    try {\n      data = await (this.pdfDocument\n        ? this.pdfDocument.getData()\n        : this.pdfLoadingTask.getData());\n    } catch {\n      // When the PDF document isn't ready, simply download using the URL.\n    }\n    this.downloadManager.download(data, this._downloadUrl, this._docFilename);\n  },\n\n  async save() {\n    if (!this.downloadManager) {\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n        this.eventBus.dispatch(\"downloadskipped\", { source: this });\n      }\n      return;\n    }\n\n    if (this._saveInProgress) {\n      return;\n    }\n    this._saveInProgress = true;\n    await this.pdfScriptingManager.dispatchWillSave();\n\n    try {\n      const data = await this.pdfDocument.saveDocument();\n      this.downloadManager.download(data, this._downloadUrl, this._docFilename);\n    } catch (reason) {\n      // When the PDF document isn't ready, fallback to a \"regular\" download.\n      console.error(`Error when saving the document:`, reason);\n      await this.download();\n    } finally {\n      await this.pdfScriptingManager.dispatchDidSave();\n      this._saveInProgress = false;\n    }\n\n    const editorStats = this.pdfDocument?.annotationStorage.editorStats;\n    if (editorStats) {\n      this.externalServices.reportTelemetry({\n        type: \"editing\",\n        data: {\n          type: \"save\",\n          stats: editorStats,\n        },\n      });\n    }\n  },\n\n  async downloadOrSave() {\n    if (!this.downloadManager) {\n      if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n        this.eventBus.dispatch(\"downloadskipped\", { source: this });\n      }\n      return;\n    }\n\n    // In the Firefox case, this method MUST always trigger a download.\n    // When the user is closing a modified and unsaved document, we display a\n    // prompt asking for saving or not. In case they save, we must wait for\n    // saving to complete before closing the tab.\n    // So in case this function does not trigger a download, we must trigger a\n    // a message and change PdfjsChild.sys.mjs to take it into account.\n    const { classList } = this.appConfig.appContainer;\n    classList.add(\"wait\");\n\n    if (this.pdfThumbnailViewer?.hasStructuralChanges()) {\n      this.externalServices.reportTelemetry({\n        type: \"pageOrganization\",\n        data: { action: \"save\" },\n      });\n      await this.onSavePages({\n        data: this.pdfThumbnailViewer.getStructuralChanges(),\n      });\n    } else {\n      await (this.pdfDocument?.annotationStorage.size > 0\n        ? this.save()\n        : this.download());\n    }\n    delete this._mergedDocumentNeedsSaving;\n    this.setTitle();\n    classList.remove(\"wait\");\n  },\n\n  /**\n   * Report the error; used for errors affecting loading and/or parsing of\n   * the entire PDF document.\n   */\n  async _documentError(key, moreInfo = null) {\n    this._unblockDocumentLoadEvent();\n\n    const message = await this._otherError(\n      key || \"pdfjs-loading-error\",\n      moreInfo\n    );\n\n    this.eventBus.dispatch(\"documenterror\", {\n      source: this,\n      message,\n      reason: moreInfo?.message ?? null,\n    });\n  },\n\n  /**\n   * Report the error; used for errors affecting e.g. only a single page.\n   * @param {string} key - The localization key for the error.\n   * @param {Object} [moreInfo] - Further information about the error that is\n   *                              more technical. Should have a 'message' and\n   *                              optionally a 'stack' property.\n   * @returns {string} A (localized) error message that is human readable.\n   */\n  async _otherError(key, moreInfo = null) {\n    const message = await this.l10n.get(key);\n\n    const moreInfoText = [`PDF.js v${version || \"?\"} (build: ${build || \"?\"})`];\n    if (moreInfo) {\n      moreInfoText.push(`Message: ${moreInfo.message}`);\n\n      if (moreInfo.stack) {\n        moreInfoText.push(`Stack: ${moreInfo.stack}`);\n      } else {\n        if (moreInfo.filename) {\n          moreInfoText.push(`File: ${moreInfo.filename}`);\n        }\n        if (moreInfo.lineNumber) {\n          moreInfoText.push(`Line: ${moreInfo.lineNumber}`);\n        }\n      }\n    }\n\n    console.error(`${message}\\n\\n${moreInfoText.join(\"\\n\")}`);\n    return message;\n  },\n\n  progress(percent) {\n    // When we transition from full request to range requests, it's possible\n    // that we discard some of the loaded data. This can cause the loading\n    // bar to move backwards. So prevent this by only updating the bar if it\n    // increases.\n    if (!this.loadingBar || percent <= this.loadingBar.percent) {\n      return;\n    }\n    this.loadingBar.percent = percent;\n\n    // When disableAutoFetch is enabled, it's not uncommon for the entire file\n    // to never be fetched (depends on e.g. the file structure). In this case\n    // the loading bar will not be completely filled, nor will it be hidden.\n    // To prevent displaying a partially filled loading bar permanently, we\n    // hide it when no data has been loaded during a certain amount of time.\n    if (\n      this.pdfDocument?.loadingParams.disableAutoFetch ??\n      AppOptions.get(\"disableAutoFetch\")\n    ) {\n      this.loadingBar.setDisableAutoFetch();\n    }\n  },\n\n  load(pdfDocument) {\n    this.pdfDocument = pdfDocument;\n\n    this._printPermissionPromise = new Promise(resolve => {\n      this.eventBus.on(\n        \"printingallowed\",\n        ({ isAllowed }) => {\n          if (\n            typeof PDFJSDev !== \"undefined\" &&\n            PDFJSDev.test(\"MOZCENTRAL\") &&\n            !isAllowed\n          ) {\n            window.print = () => {\n              console.warn(\"Printing is not allowed.\");\n            };\n          }\n          resolve(isAllowed);\n        },\n        { once: true, ...internalOpt }\n      );\n    });\n\n    pdfDocument.getDownloadInfo().then(({ length }) => {\n      this._contentLength = length; // Ensure that the correct length is used.\n      this.loadingBar?.hide();\n\n      firstPagePromise.then(() => {\n        this.eventBus.dispatch(\"documentloaded\", { source: this });\n      });\n    });\n\n    // Since the `setInitialView` call below depends on this being resolved,\n    // fetch it early to avoid delaying initial rendering of the PDF document.\n    const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => {\n      /* Avoid breaking initial rendering; ignoring errors. */\n    });\n    const pageModePromise = pdfDocument.getPageMode().catch(() => {\n      /* Avoid breaking initial rendering; ignoring errors. */\n    });\n    const openActionPromise = pdfDocument.getOpenAction().catch(() => {\n      /* Avoid breaking initial rendering; ignoring errors. */\n    });\n\n    this.toolbar?.setPagesCount(pdfDocument.numPages, false);\n    this.secondaryToolbar?.setPagesCount(pdfDocument.numPages);\n\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")) {\n      const baseUrl = updateUrlHash(location, \"\");\n      // Ignore \"data:\"-URLs for performance reasons, even though it may cause\n      // internal links to not work perfectly in all cases (see bug 1803050).\n      this.pdfLinkService.setDocument(\n        pdfDocument,\n        isDataScheme(baseUrl) ? null : baseUrl\n      );\n    } else {\n      this.pdfLinkService.setDocument(pdfDocument);\n    }\n    this.pdfDocumentProperties?.setDocument(pdfDocument);\n\n    const pdfViewer = this.pdfViewer;\n    pdfViewer.setDocument(pdfDocument);\n    const { firstPagePromise, onePageRendered, pagesPromise } = pdfViewer;\n\n    this.pdfThumbnailViewer?.setDocument(pdfDocument);\n\n    const storedPromise = (this.store = new ViewHistory(\n      pdfDocument.fingerprints[0]\n    ))\n      .getMultiple({\n        page: null,\n        zoom: DEFAULT_SCALE_VALUE,\n        scrollLeft: \"0\",\n        scrollTop: \"0\",\n        rotation: null,\n        sidebarView: SidebarView.UNKNOWN,\n        scrollMode: ScrollMode.UNKNOWN,\n        spreadMode: SpreadMode.UNKNOWN,\n      })\n      .catch(() => {\n        /* Unable to read from storage; ignoring errors. */\n      });\n\n    firstPagePromise.then(pdfPage => {\n      this.loadingBar?.setWidth(this.appConfig.viewerContainer);\n      this._initializeAnnotationStorageCallbacks(pdfDocument);\n\n      Promise.all([\n        animationStarted,\n        storedPromise,\n        pageLayoutPromise,\n        pageModePromise,\n        openActionPromise,\n      ])\n        .then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => {\n          const viewOnLoad = AppOptions.get(\"viewOnLoad\");\n\n          this._initializePdfHistory({\n            fingerprint: pdfDocument.fingerprints[0],\n            viewOnLoad,\n            initialDest: openAction?.dest,\n          });\n          const initialBookmark = this.initialBookmark;\n\n          // Initialize the default values, from user preferences.\n          const zoom = AppOptions.get(\"defaultZoomValue\");\n          let hash = zoom ? `zoom=${zoom}` : null;\n\n          let rotation = null;\n          let sidebarView = AppOptions.get(\"sidebarViewOnLoad\");\n          let scrollMode = AppOptions.get(\"scrollModeOnLoad\");\n          let spreadMode = AppOptions.get(\"spreadModeOnLoad\");\n\n          if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) {\n            hash =\n              `page=${stored.page}&zoom=${zoom || stored.zoom},` +\n              `${stored.scrollLeft},${stored.scrollTop}`;\n\n            rotation = parseInt(stored.rotation, 10);\n            // Always let user preference take precedence over the view history.\n            if (sidebarView === SidebarView.UNKNOWN) {\n              sidebarView = stored.sidebarView | 0;\n            }\n            if (scrollMode === ScrollMode.UNKNOWN) {\n              scrollMode = stored.scrollMode | 0;\n            }\n            if (spreadMode === SpreadMode.UNKNOWN) {\n              spreadMode = stored.spreadMode | 0;\n            }\n          }\n          // Always let the user preference/view history take precedence.\n          if (pageMode && sidebarView === SidebarView.UNKNOWN) {\n            sidebarView = apiPageModeToSidebarView(pageMode);\n          }\n          if (\n            pageLayout &&\n            scrollMode === ScrollMode.UNKNOWN &&\n            spreadMode === SpreadMode.UNKNOWN\n          ) {\n            const modes = apiPageLayoutToViewerModes(pageLayout);\n            // TODO: Try to improve page-switching when using the mouse-wheel\n            // and/or arrow-keys before allowing the document to control this.\n            // scrollMode = modes.scrollMode;\n            spreadMode = modes.spreadMode;\n          }\n\n          this.setInitialView(hash, {\n            rotation,\n            sidebarView,\n            scrollMode,\n            spreadMode,\n          });\n          this.eventBus.dispatch(\"documentinit\", { source: this });\n\n          // For documents with different page sizes, once all pages are\n          // resolved, ensure that the correct location becomes visible on load.\n          // (To reduce the risk, in very large and/or slow loading documents,\n          //  that the location changes *after* the user has started interacting\n          //  with the viewer, wait for either `pagesPromise` or a timeout.)\n          await Promise.race([\n            pagesPromise,\n            new Promise(resolve => {\n              setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT);\n            }),\n          ]);\n          if (!initialBookmark && !hash) {\n            return;\n          }\n          if (pdfViewer.hasEqualPageSizes) {\n            return;\n          }\n          this.initialBookmark = initialBookmark;\n\n          // eslint-disable-next-line no-self-assign\n          pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;\n          // Re-apply the initial document location.\n          this.setInitialView(hash);\n        })\n        .catch(() => {\n          // Ensure that the document is always completely initialized,\n          // even if there are any errors thrown above.\n          this.setInitialView();\n        })\n        .then(function () {\n          // At this point, rendering of the initial page(s) should always have\n          // started (and may even have completed).\n          // To prevent any future issues, e.g. the document being completely\n          // blank on load, always trigger rendering here.\n          pdfViewer.update();\n        });\n    });\n\n    pagesPromise.then(\n      () => {\n        this._unblockDocumentLoadEvent();\n\n        this._initializeAutoPrint(pdfDocument, openActionPromise);\n      },\n      reason => {\n        this._documentError(\"pdfjs-loading-error\", { message: reason.message });\n      }\n    );\n\n    onePageRendered.then(data => {\n      this.externalServices.reportTelemetry({\n        type: \"pageInfo\",\n        timestamp: data.timestamp,\n      });\n\n      if (this.pdfOutlineViewer) {\n        pdfDocument.getOutline().then(outline => {\n          if (pdfDocument !== this.pdfDocument) {\n            return; // The document was closed while the outline resolved.\n          }\n          this.pdfOutlineViewer.render({ outline, pdfDocument });\n        });\n      }\n      if (this.pdfAttachmentViewer) {\n        pdfDocument.getAttachments().then(attachments => {\n          if (pdfDocument !== this.pdfDocument) {\n            return; // The document was closed while the attachments resolved.\n          }\n          this.pdfAttachmentViewer.render({ attachments });\n        });\n      }\n      if (this.pdfLayerViewer) {\n        // Ensure that the layers accurately reflects the current state in the\n        // viewer itself, rather than the default state provided by the API.\n        pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => {\n          if (pdfDocument !== this.pdfDocument) {\n            return; // The document was closed while the layers resolved.\n          }\n          this.pdfLayerViewer.render({ optionalContentConfig, pdfDocument });\n        });\n      }\n    });\n\n    this._initializePageLabels(pdfDocument);\n    this._initializeMetadata(pdfDocument);\n  },\n\n  /**\n   * @private\n   */\n  async _scriptingDocProperties(pdfDocument) {\n    if (!this.documentInfo) {\n      // It should be *extremely* rare for metadata to not have been resolved\n      // when this code runs, but ensure that we handle that case here.\n      await new Promise(resolve => {\n        this.eventBus.on(\"metadataloaded\", resolve, {\n          once: true,\n          ...internalOpt,\n        });\n      });\n      if (pdfDocument !== this.pdfDocument) {\n        return null; // The document was closed while the metadata resolved.\n      }\n    }\n    if (!this._contentLength) {\n      // Always waiting for the entire PDF document to be loaded will, most\n      // likely, delay sandbox-creation too much in the general case for all\n      // PDF documents which are not provided as binary data to the API.\n      // Hence we'll simply have to trust that the `contentLength` (as provided\n      // by the server), when it exists, is accurate enough here.\n      await new Promise(resolve => {\n        this.eventBus.on(\"documentloaded\", resolve, {\n          once: true,\n          ...internalOpt,\n        });\n      });\n      if (pdfDocument !== this.pdfDocument) {\n        return null; // The document was closed while the downloadInfo resolved.\n      }\n    }\n\n    return {\n      ...this.documentInfo,\n      baseURL: this.baseUrl,\n      filesize: this._contentLength,\n      filename: this._docFilename,\n      metadata: this.metadata?.getRaw(),\n      authors: this.metadata?.get(\"dc:creator\"),\n      numPages: this.pagesCount,\n      URL: this.url,\n    };\n  },\n\n  /**\n   * @private\n   */\n  async _initializeAutoPrint(pdfDocument, openActionPromise) {\n    const [openAction, jsActions] = await Promise.all([\n      openActionPromise,\n      this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions(),\n    ]);\n\n    if (pdfDocument !== this.pdfDocument) {\n      return; // The document was closed while the auto print data resolved.\n    }\n    let triggerAutoPrint = openAction?.action === \"Print\";\n\n    if (jsActions) {\n      console.warn(\"Warning: JavaScript support is not enabled\");\n\n      // Hack to support auto printing.\n      for (const name in jsActions) {\n        if (triggerAutoPrint) {\n          break;\n        }\n        switch (name) {\n          case \"WillClose\":\n          case \"WillSave\":\n          case \"DidSave\":\n          case \"WillPrint\":\n          case \"DidPrint\":\n            continue;\n        }\n        triggerAutoPrint = jsActions[name].some(js => AutoPrintRegExp.test(js));\n      }\n    }\n\n    if (triggerAutoPrint) {\n      this.triggerPrinting();\n    }\n  },\n\n  /**\n   * @private\n   */\n  async _initializeMetadata(pdfDocument) {\n    const {\n      info,\n      metadata,\n      contentDispositionFilename,\n      contentLength,\n      hasStructTree,\n    } = await pdfDocument.getMetadata();\n\n    if (pdfDocument !== this.pdfDocument) {\n      return; // The document was closed while the metadata resolved.\n    }\n    this.externalServices.reportTelemetry({\n      type: \"taggedPDF\",\n      data: hasStructTree,\n    });\n    this.documentInfo = info;\n    this.metadata = metadata;\n    this._contentDispositionFilename ??= contentDispositionFilename;\n    this._contentLength ??= contentLength; // See `getDownloadInfo`-call above.\n\n    // Provides some basic debug information\n    console.log(\n      `PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` +\n        `${(metadata?.get(\"pdf:producer\") || info.Producer || \"-\").trim()} / ` +\n        `${(metadata?.get(\"xmp:creatortool\") || info.Creator || \"-\").trim()}` +\n        `] (PDF.js: ${version || \"?\"} [${build || \"?\"}])`\n    );\n    const pdfTitle = this._docTitle;\n\n    if (pdfTitle) {\n      this.setTitle(\n        `${pdfTitle} - ${this._contentDispositionFilename || this._title}`\n      );\n    } else if (this._contentDispositionFilename) {\n      this.setTitle(this._contentDispositionFilename);\n    }\n\n    if (\n      info.IsXFAPresent &&\n      !info.IsAcroFormPresent &&\n      !pdfDocument.isPureXfa\n    ) {\n      if (pdfDocument.loadingParams.enableXfa) {\n        console.warn(\"Warning: XFA Foreground documents are not supported\");\n      } else {\n        console.warn(\"Warning: XFA support is not enabled\");\n      }\n    } else if (\n      (info.IsAcroFormPresent || info.IsXFAPresent) &&\n      !this.pdfViewer.renderForms\n    ) {\n      console.warn(\"Warning: Interactive form support is not enabled\");\n    }\n\n    if (info.IsSignaturesPresent) {\n      console.warn(\"Warning: Digital signatures validation is not supported\");\n    }\n\n    this.eventBus.dispatch(\"metadataloaded\", { source: this });\n  },\n\n  /**\n   * @private\n   */\n  async _initializePageLabels(pdfDocument) {\n    if (\n      typeof PDFJSDev === \"undefined\"\n        ? window.isGECKOVIEW\n        : PDFJSDev.test(\"GECKOVIEW\")\n    ) {\n      return;\n    }\n    const labels = await pdfDocument.getPageLabels();\n\n    if (pdfDocument !== this.pdfDocument) {\n      return; // The document was closed while the page labels resolved.\n    }\n    if (!labels || AppOptions.get(\"disablePageLabels\")) {\n      return;\n    }\n    const numLabels = labels.length;\n    // Ignore page labels that correspond to standard page numbering,\n    // or page labels that are all empty.\n    let standardLabels = 0,\n      emptyLabels = 0;\n    for (let i = 0; i < numLabels; i++) {\n      const label = labels[i];\n      if (label === (i + 1).toString()) {\n        standardLabels++;\n      } else if (label === \"\") {\n        emptyLabels++;\n      } else {\n        break;\n      }\n    }\n    if (standardLabels >= numLabels || emptyLabels >= numLabels) {\n      return;\n    }\n    const { pdfViewer, pdfThumbnailViewer, toolbar } = this;\n\n    pdfViewer.setPageLabels(labels);\n    pdfThumbnailViewer?.setPageLabels(labels);\n\n    // Changing toolbar page display to use labels and we need to set\n    // the label of the current page.\n    toolbar?.setPagesCount(numLabels, true);\n    toolbar?.setPageNumber(\n      pdfViewer.currentPageNumber,\n      pdfViewer.currentPageLabel\n    );\n  },\n\n  /**\n   * @private\n   */\n  _initializePdfHistory({ fingerprint, viewOnLoad, initialDest = null }) {\n    if (!this.pdfHistory) {\n      return;\n    }\n    this.pdfHistory.initialize({\n      fingerprint,\n      resetHistory:\n        viewOnLoad === ViewOnLoad.INITIAL || !!this._mergedDocumentNeedsSaving,\n      updateUrl: AppOptions.get(\"historyUpdateUrl\"),\n    });\n\n    if (this.pdfHistory.initialBookmark) {\n      this.initialBookmark = this.pdfHistory.initialBookmark;\n\n      this.initialRotation = this.pdfHistory.initialRotation;\n    }\n\n    // Always let the browser history/document hash take precedence.\n    if (\n      initialDest &&\n      !this.initialBookmark &&\n      viewOnLoad === ViewOnLoad.UNKNOWN\n    ) {\n      this.initialBookmark = JSON.stringify(initialDest);\n      // TODO: Re-factor the `PDFHistory` initialization to remove this hack\n      // that's currently necessary to prevent weird initial history state.\n      this.pdfHistory.push({ explicitDest: initialDest, pageNumber: null });\n    }\n  },\n\n  _hasChanges() {\n    return (\n      this.pdfDocument?.annotationStorage.size > 0 ||\n      this.pdfThumbnailViewer?.hasStructuralChanges() ||\n      this._mergedDocumentNeedsSaving === true\n    );\n  },\n\n  /**\n   * @private\n   */\n  _initializeAnnotationStorageCallbacks(pdfDocument) {\n    if (pdfDocument !== this.pdfDocument) {\n      return;\n    }\n    const { annotationStorage } = pdfDocument;\n\n    annotationStorage.onSetModified = () => {\n      if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n        this._annotationStorageModified = true;\n      }\n    };\n    annotationStorage.onResetModified = () => {\n      if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n        delete this._annotationStorageModified;\n      }\n    };\n    annotationStorage.onAnnotationEditor = typeStr => {\n      this._hasAnnotationEditors = !!typeStr;\n      this.setTitle();\n    };\n  },\n\n  setInitialView(\n    storedHash,\n    { rotation, sidebarView, scrollMode, spreadMode } = {}\n  ) {\n    const setRotation = angle => {\n      if (isValidRotation(angle)) {\n        this.pdfViewer.pagesRotation = angle;\n      }\n    };\n    const setViewerModes = (scroll, spread) => {\n      if (isValidScrollMode(scroll)) {\n        this.pdfViewer.scrollMode = scroll;\n      }\n      if (isValidSpreadMode(spread)) {\n        this.pdfViewer.spreadMode = spread;\n      }\n    };\n    this.isInitialViewSet = true;\n    this.viewsManager?.setInitialView(sidebarView);\n\n    setViewerModes(scrollMode, spreadMode);\n\n    if (this.initialBookmark) {\n      setRotation(this.initialRotation);\n      delete this.initialRotation;\n\n      this.pdfLinkService.setHash(this.initialBookmark);\n      this.initialBookmark = null;\n    } else if (storedHash) {\n      setRotation(rotation);\n\n      this.pdfLinkService.setHash(storedHash);\n    }\n\n    // Ensure that the correct page number is displayed in the UI,\n    // even if the active page didn't change during document load.\n    this.toolbar?.setPageNumber(\n      this.pdfViewer.currentPageNumber,\n      this.pdfViewer.currentPageLabel\n    );\n    this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber);\n\n    if (!this.pdfViewer.currentScaleValue) {\n      // Scale was not initialized: invalid bookmark or scale was not specified.\n      // Setting the default one.\n      this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;\n    }\n  },\n\n  /**\n   * @private\n   */\n  _cleanup() {\n    if (!this.pdfDocument) {\n      return; // run cleanup when document is loaded\n    }\n    this.pdfViewer.cleanup();\n    this.pdfThumbnailViewer?.cleanup();\n\n    this.pdfDocument.cleanup(\n      /* keepLoadedFonts = */ AppOptions.get(\"fontExtraProperties\")\n    );\n  },\n\n  forceRendering() {\n    this.pdfRenderingQueue.printing = !!this.printService;\n    this.pdfRenderingQueue.isThumbnailViewEnabled =\n      this.viewsManager?.visibleView === SidebarView.THUMBS;\n    this.pdfRenderingQueue.renderHighestPriority();\n  },\n\n  beforePrint() {\n    this._printAnnotationStoragePromise = this.pdfScriptingManager\n      .dispatchWillPrint()\n      .catch(() => {\n        /* Avoid breaking printing; ignoring errors. */\n      })\n      .then(() => this.pdfDocument?.annotationStorage.print);\n\n    if (this.printService) {\n      // There is no way to suppress beforePrint/afterPrint events,\n      // but PDFPrintService may generate double events -- this will ignore\n      // the second event that will be coming from native window.print().\n      return;\n    }\n\n    if (!this.supportsPrinting || !this.pdfViewer.printingAllowed) {\n      this._otherError(\"pdfjs-printing-not-supported\");\n      return;\n    }\n\n    // The beforePrint is a sync method and we need to know layout before\n    // returning from this method. Ensure that we can get sizes of the pages.\n    if (!this.pdfViewer.pageViewsReady) {\n      this.l10n.get(\"pdfjs-printing-not-ready\").then(msg => {\n        // eslint-disable-next-line no-alert\n        window.alert(msg);\n      });\n      return;\n    }\n\n    this.printService = PDFPrintServiceFactory.createPrintService({\n      pdfDocument: this.pdfDocument,\n      pagesOverview: this.pdfViewer.getPagesOverview(),\n      printContainer: this.appConfig.printContainer,\n      printResolution: AppOptions.get(\"printResolution\"),\n      printAnnotationStoragePromise: this._printAnnotationStoragePromise,\n    });\n    this.forceRendering();\n    // Disable the editor-indicator during printing (fixes bug 1790552).\n    this.setTitle();\n\n    this.printService.layout();\n\n    if (this._hasAnnotationEditors) {\n      this.externalServices.reportTelemetry({\n        type: \"editing\",\n        data: {\n          type: \"print\",\n          stats: this.pdfDocument?.annotationStorage.editorStats,\n        },\n      });\n    }\n  },\n\n  afterPrint() {\n    if (this._printAnnotationStoragePromise) {\n      this._printAnnotationStoragePromise.then(() => {\n        this.pdfScriptingManager.dispatchDidPrint();\n      });\n      this._printAnnotationStoragePromise = null;\n    }\n\n    if (this.printService) {\n      this.printService.destroy();\n      this.printService = null;\n\n      this.pdfDocument?.annotationStorage.resetModified();\n    }\n    this.forceRendering();\n    // Re-enable the editor-indicator after printing (fixes bug 1790552).\n    this.setTitle();\n  },\n\n  rotatePages(delta) {\n    this.pdfViewer.pagesRotation += delta;\n    // Note that the thumbnail viewer is updated, and rendering is triggered,\n    // in the 'rotationchanging' event handler.\n  },\n\n  requestPresentationMode() {\n    this.pdfPresentationMode?.request();\n  },\n\n  async triggerPrinting() {\n    if (this.supportsPrinting && (await this._printPermissionPromise)) {\n      window.print();\n    }\n  },\n\n  bindEvents() {\n    if (this._eventBusAC) {\n      return;\n    }\n    const ac = (this._eventBusAC = new AbortController());\n    const opts = { signal: ac.signal, ...internalOpt };\n\n    const {\n      eventBus,\n      externalServices,\n      pdfDocumentProperties,\n      pdfViewer,\n      preferences,\n    } = this;\n\n    eventBus.on(\"resize\", onResize.bind(this), opts);\n    eventBus.on(\"hashchange\", onHashchange.bind(this), opts);\n    eventBus.on(\"beforeprint\", this.beforePrint.bind(this), opts);\n    eventBus.on(\"afterprint\", this.afterPrint.bind(this), opts);\n    eventBus.on(\"pagerender\", onPageRender.bind(this), opts);\n    eventBus.on(\"pagerendered\", onPageRendered.bind(this), opts);\n    eventBus.on(\"updateviewarea\", onUpdateViewarea.bind(this), opts);\n    eventBus.on(\"pagechanging\", onPageChanging.bind(this), opts);\n    eventBus.on(\"scalechanging\", onScaleChanging.bind(this), opts);\n    eventBus.on(\"rotationchanging\", onRotationChanging.bind(this), opts);\n    eventBus.on(\"sidebarviewchanged\", onSidebarViewChanged.bind(this), opts);\n    eventBus.on(\"pagemode\", onPageMode.bind(this), opts);\n    eventBus.on(\"namedaction\", onNamedAction.bind(this), opts);\n    eventBus.on(\n      \"presentationmodechanged\",\n      evt => (pdfViewer.presentationModeState = evt.state),\n      opts\n    );\n    eventBus.on(\n      \"presentationmode\",\n      this.requestPresentationMode.bind(this),\n      opts\n    );\n    eventBus.on(\n      \"switchannotationeditormode\",\n      evt => (pdfViewer.annotationEditorMode = evt),\n      opts\n    );\n    eventBus.on(\"print\", this.triggerPrinting.bind(this), opts);\n    eventBus.on(\"download\", this.downloadOrSave.bind(this), opts);\n    eventBus.on(\"firstpage\", () => (this.page = 1), opts);\n    eventBus.on(\"lastpage\", () => (this.page = this.pagesCount), opts);\n    eventBus.on(\"nextpage\", () => pdfViewer.nextPage(), opts);\n    eventBus.on(\"previouspage\", () => pdfViewer.previousPage(), opts);\n    eventBus.on(\"zoomin\", this.zoomIn.bind(this), opts);\n    eventBus.on(\"zoomout\", this.zoomOut.bind(this), opts);\n    eventBus.on(\"zoomreset\", this.zoomReset.bind(this), opts);\n    eventBus.on(\"pagenumberchanged\", onPageNumberChanged.bind(this), opts);\n    eventBus.on(\n      \"scalechanged\",\n      evt => (pdfViewer.currentScaleValue = evt.value),\n      opts\n    );\n    eventBus.on(\"rotatecw\", this.rotatePages.bind(this, 90), opts);\n    eventBus.on(\"rotateccw\", this.rotatePages.bind(this, -90), opts);\n    eventBus.on(\n      \"optionalcontentconfig\",\n      evt => (pdfViewer.optionalContentConfigPromise = evt.promise),\n      opts\n    );\n    eventBus.on(\n      \"switchscrollmode\",\n      evt => (pdfViewer.scrollMode = evt.mode),\n      opts\n    );\n    eventBus.on(\n      \"scrollmodechanged\",\n      onViewerModesChanged.bind(this, \"scrollMode\"),\n      opts\n    );\n    eventBus.on(\n      \"switchspreadmode\",\n      evt => (pdfViewer.spreadMode = evt.mode),\n      opts\n    );\n    eventBus.on(\n      \"spreadmodechanged\",\n      onViewerModesChanged.bind(this, \"spreadMode\"),\n      opts\n    );\n    eventBus.on(\n      \"imagealttextsettings\",\n      onImageAltTextSettings.bind(this),\n      opts\n    );\n    eventBus.on(\n      \"documentproperties\",\n      () => pdfDocumentProperties?.open(),\n      opts\n    );\n    eventBus.on(\"findfromurlhash\", onFindFromUrlHash.bind(this), opts);\n    eventBus.on(\n      \"updatefindmatchescount\",\n      onUpdateFindMatchesCount.bind(this),\n      opts\n    );\n    eventBus.on(\n      \"updatefindcontrolstate\",\n      onUpdateFindControlState.bind(this),\n      opts\n    );\n\n    if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n      eventBus.on(\"fileinputchange\", onFileInputChange.bind(this), opts);\n      eventBus.on(\"openfile\", onOpenFile.bind(this), opts);\n    }\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n      eventBus.on(\n        \"editingstateschanged\",\n        evt => externalServices.updateEditorStates(evt),\n        opts\n      );\n      eventBus.on(\n        \"reporttelemetry\",\n        evt => externalServices.reportTelemetry(evt.details),\n        opts\n      );\n    }\n    if (\n      typeof PDFJSDev === \"undefined\" ||\n      PDFJSDev.test(\"TESTING || MOZCENTRAL\")\n    ) {\n      eventBus.on(\n        \"setpreference\",\n        evt => preferences.set(evt.name, evt.value),\n        opts\n      );\n    }\n    eventBus.on(\"pagesedited\", this.onPagesEdited.bind(this), opts);\n    eventBus.on(\"saveextractedpages\", this.onSavePages.bind(this), opts);\n    eventBus.on(\"saveandload\", this.onSaveAndLoad.bind(this), opts);\n  },\n\n  bindWindowEvents() {\n    if (this._windowAC) {\n      return;\n    }\n    this._windowAC = new AbortController();\n\n    const {\n      eventBus,\n      appConfig: { mainContainer },\n      pdfViewer,\n      _windowAC: { signal },\n    } = this;\n\n    this._touchManager = new TouchManager({\n      container: window,\n      isPinchingDisabled: () => pdfViewer.isInPresentationMode,\n      isPinchingStopped: () => this.overlayManager?.active,\n      onPinching: this.touchPinchCallback.bind(this),\n      onPinchEnd: this.touchPinchEndCallback.bind(this),\n      signal,\n    });\n\n    function addWindowResolutionChange(evt = null) {\n      if (evt) {\n        pdfViewer.refresh();\n      }\n      const mediaQueryList = window.matchMedia(\n        `(resolution: ${OutputScale.pixelRatio}dppx)`\n      );\n      mediaQueryList.addEventListener(\"change\", addWindowResolutionChange, {\n        once: true,\n        signal,\n      });\n    }\n    addWindowResolutionChange();\n\n    window.addEventListener(\"wheel\", onWheel.bind(this), {\n      passive: false,\n      signal,\n    });\n    window.addEventListener(\"click\", onClick.bind(this), { signal });\n    window.addEventListener(\"keydown\", onKeyDown.bind(this), { signal });\n    window.addEventListener(\"keyup\", onKeyUp.bind(this), { signal });\n    window.addEventListener(\n      \"resize\",\n      () => eventBus.dispatch(\"resize\", { source: window }),\n      { signal }\n    );\n    window.addEventListener(\n      \"hashchange\",\n      () => {\n        eventBus.dispatch(\"hashchange\", {\n          source: window,\n          hash: document.location.hash.substring(1),\n        });\n      },\n      { signal }\n    );\n    window.addEventListener(\n      \"beforeprint\",\n      () => eventBus.dispatch(\"beforeprint\", { source: window }),\n      { signal }\n    );\n    window.addEventListener(\n      \"afterprint\",\n      () => eventBus.dispatch(\"afterprint\", { source: window }),\n      { signal }\n    );\n    window.addEventListener(\n      \"updatefromsandbox\",\n      evt => {\n        eventBus.dispatch(\"updatefromsandbox\", {\n          source: window,\n          detail: evt.detail,\n        });\n      },\n      { signal }\n    );\n    window.addEventListener(\"beforeunload\", onBeforeUnload.bind(this), {\n      signal,\n    });\n\n    if (\n      (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n      !(\"onscrollend\" in document.documentElement)\n    ) {\n      return;\n    }\n    if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n      // Using the values lastScrollTop and lastScrollLeft is a workaround to\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=1881974.\n      // TODO: remove them once the bug is fixed.\n      ({ scrollTop: this._lastScrollTop, scrollLeft: this._lastScrollLeft } =\n        mainContainer);\n    }\n\n    let scrollendTimeoutID, scrollAbortController;\n    const scrollend = () => {\n      if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n        ({ scrollTop: this._lastScrollTop, scrollLeft: this._lastScrollLeft } =\n          mainContainer);\n      }\n      clearTimeout(scrollendTimeoutID);\n      if (this._isScrolling) {\n        scrollAbortController.abort();\n        scrollAbortController = null;\n        this._isScrolling = false;\n      }\n    };\n    const scroll = () => {\n      if (this._isCtrlKeyDown) {\n        return;\n      }\n      if (\n        (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n        this._lastScrollTop === mainContainer.scrollTop &&\n        this._lastScrollLeft === mainContainer.scrollLeft\n      ) {\n        return;\n      }\n\n      if (!this._isScrolling) {\n        scrollAbortController = new AbortController();\n        const abortSignal = AbortSignal.any([\n          scrollAbortController.signal,\n          signal,\n        ]);\n\n        mainContainer.addEventListener(\"scrollend\", scrollend, {\n          signal: abortSignal,\n        });\n        mainContainer.addEventListener(\"blur\", scrollend, {\n          signal: abortSignal,\n        });\n        this._isScrolling = true;\n      }\n      clearTimeout(scrollendTimeoutID);\n      // Why 100 ? Because of:\n      // https://developer.chrome.com/blog/scrollend-a-new-javascript-event\n      // Maybe we could find a better value... ideally the `scrollend` event\n      // should be correctly fired.\n      scrollendTimeoutID = setTimeout(scrollend, 100);\n    };\n    mainContainer.addEventListener(\"scroll\", scroll, {\n      passive: true,\n      signal,\n    });\n  },\n\n  unbindEvents() {\n    this._eventBusAC?.abort();\n    this._eventBusAC = null;\n  },\n\n  unbindWindowEvents() {\n    this._windowAC?.abort();\n    this._windowAC = null;\n    this._touchManager = null;\n  },\n\n  /**\n   * @ignore\n   */\n  async testingClose() {\n    this.unbindEvents();\n    this.unbindWindowEvents();\n\n    this._globalAbortController?.abort();\n    this._globalAbortController = null;\n\n    this.findBar?.close();\n\n    await Promise.all([this.l10n?.destroy(), this.close()]);\n  },\n\n  onPagesEdited(data) {\n    this.pdfViewer.onPagesEdited(data);\n  },\n\n  async onSavePages({ data: extractParams }) {\n    if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n      return;\n    }\n    if (!this.downloadManager) {\n      return;\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    const modifiedPdfBytes = await this.pdfDocument.extractPages(extractParams);\n    if (!modifiedPdfBytes) {\n      console.error(\n        \"Something wrong happened when saving the edited PDF.\\nPlease file a bug.\"\n      );\n      return;\n    }\n    this.downloadManager.download(\n      modifiedPdfBytes,\n      this._downloadUrl,\n      this._docFilename\n    );\n  },\n\n  async onSaveAndLoad({ data: extractParams }) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const modifiedPdfBytes = await this.pdfDocument.extractPages(extractParams);\n    if (!modifiedPdfBytes) {\n      console.error(\n        \"Something wrong happened when saving the edited PDF.\\nPlease file a bug.\"\n      );\n      return;\n    }\n    this._mergedDocumentNeedsSaving = true;\n\n    this.open({\n      data: modifiedPdfBytes,\n      filename: this._docFilename,\n    });\n  },\n\n  _accumulateTicks(ticks, prop) {\n    // If the direction changed, reset the accumulated ticks.\n    if ((this[prop] > 0 && ticks < 0) || (this[prop] < 0 && ticks > 0)) {\n      this[prop] = 0;\n    }\n    this[prop] += ticks;\n    const wholeTicks = Math.trunc(this[prop]);\n    this[prop] -= wholeTicks;\n    return wholeTicks;\n  },\n\n  _accumulateFactor(previousScale, factor, prop) {\n    if (factor === 1) {\n      return 1;\n    }\n    // If the direction changed, reset the accumulated factor.\n    if ((this[prop] > 1 && factor < 1) || (this[prop] < 1 && factor > 1)) {\n      this[prop] = 1;\n    }\n\n    const newFactor =\n      Math.floor(previousScale * factor * this[prop] * 100) /\n      (100 * previousScale);\n    this[prop] = factor / newFactor;\n\n    return newFactor;\n  },\n\n  /**\n   * Should be called *after* all pages have loaded, or if an error occurred,\n   * to unblock the \"load\" event; see https://bugzilla.mozilla.org/show_bug.cgi?id=1618553\n   * @private\n   */\n  _unblockDocumentLoadEvent() {\n    document.blockUnblockOnload?.(false);\n\n    // Ensure that this method is only ever run once.\n    this._unblockDocumentLoadEvent = () => {};\n  },\n\n  /**\n   * Used together with the integration-tests, to enable awaiting full\n   * initialization of the scripting/sandbox.\n   */\n  get scriptingReady() {\n    return this.pdfScriptingManager.ready;\n  },\n};\n\ninitCom(PDFViewerApplication);\nPDFPrintServiceFactory.initGlobals(PDFViewerApplication);\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n  const HOSTED_VIEWER_ORIGINS = new Set([\n    \"null\",\n    \"http://mozilla.github.io\",\n    \"https://mozilla.github.io\",\n  ]);\n  // eslint-disable-next-line no-var\n  var validateFileURL = function (file) {\n    if (!file) {\n      return;\n    }\n    const viewerOrigin = URL.parse(window.location)?.origin || \"null\";\n    if (HOSTED_VIEWER_ORIGINS.has(viewerOrigin)) {\n      // Hosted or local viewer, allow for any file locations\n      return;\n    }\n    const fileOrigin = URL.parse(file, window.location)?.origin;\n    if (fileOrigin === viewerOrigin) {\n      return;\n    }\n    const ex = new Error(\"file origin does not match viewer's\");\n\n    PDFViewerApplication._documentError(\"pdfjs-loading-error\", {\n      message: ex.message,\n    });\n    // Removing of the following line will not guarantee that the viewer will\n    // start accepting URLs from foreign origin -- CORS headers on the remote\n    // server must be properly configured.\n    throw ex;\n  };\n\n  // eslint-disable-next-line no-var\n  var onFileInputChange = function (evt) {\n    if (this.pdfViewer?.isInPresentationMode) {\n      return; // Opening a new PDF file isn't supported in Presentation Mode.\n    }\n    const file = evt.fileInput.files[0];\n\n    this.open({\n      url: URL.createObjectURL(file),\n      originalUrl: encodeURIComponent(file.name),\n    });\n  };\n\n  // eslint-disable-next-line no-var\n  var onOpenFile = function (evt) {\n    this._openFileInput?.click();\n  };\n}\n\nfunction onPageRender({ pageNumber }) {\n  // If the page is (the most) visible when it starts rendering,\n  // ensure that the page number input loading indicator is displayed.\n  if (pageNumber === this.page) {\n    this.toolbar?.updateLoadingIndicatorState(true);\n  }\n}\n\nfunction onPageRendered({ pageNumber, isDetailView, error }) {\n  // If the page is still visible when it has finished rendering,\n  // ensure that the page number input loading indicator is hidden.\n  if (pageNumber === this.page) {\n    this.toolbar?.updateLoadingIndicatorState(false);\n  }\n\n  // Use the rendered page to set the corresponding thumbnail image.\n  if (!isDetailView && this.viewsManager?.visibleView === SidebarView.THUMBS) {\n    const pageView = this.pdfViewer.getPageView(/* index = */ pageNumber - 1);\n    const thumbnailView = this.pdfThumbnailViewer?.getThumbnail(\n      /* index = */ pageNumber - 1\n    );\n    if (pageView) {\n      thumbnailView?.setImage(pageView);\n    }\n  }\n\n  if (error) {\n    this._otherError(\"pdfjs-rendering-error\", error);\n  }\n}\n\nfunction onPageMode({ mode }) {\n  // Handle the 'pagemode' hash parameter, see also `PDFLinkService_setHash`.\n  let view;\n  switch (mode) {\n    case \"thumbs\":\n      view = SidebarView.THUMBS;\n      break;\n    case \"bookmarks\":\n    case \"outline\": // non-standard\n      view = SidebarView.OUTLINE;\n      break;\n    case \"attachments\": // non-standard\n      view = SidebarView.ATTACHMENTS;\n      break;\n    case \"layers\": // non-standard\n      view = SidebarView.LAYERS;\n      break;\n    case \"none\":\n      view = SidebarView.NONE;\n      break;\n    default:\n      console.error('Invalid \"pagemode\" hash parameter: ' + mode);\n      return;\n  }\n  this.viewsManager?.switchView(view, /* forceOpen = */ true);\n}\n\nfunction onNamedAction(evt) {\n  // Processing a couple of named actions that might be useful, see also\n  // `PDFLinkService.executeNamedAction`.\n  switch (evt.action) {\n    case \"GoToPage\":\n      this.appConfig.toolbar?.pageNumber.select();\n      break;\n\n    case \"Find\":\n      if (!this.supportsIntegratedFind) {\n        this.findBar?.toggle();\n      }\n      break;\n\n    case \"Print\":\n      this.triggerPrinting();\n      break;\n\n    case \"SaveAs\":\n      this.downloadOrSave();\n      break;\n  }\n}\n\nfunction onSidebarViewChanged({ view }) {\n  this.pdfRenderingQueue.isThumbnailViewEnabled = view === SidebarView.THUMBS;\n\n  if (this.isInitialViewSet) {\n    // Only update the storage when the document has been loaded *and* rendered.\n    this.store?.set(\"sidebarView\", view).catch(() => {\n      // Unable to write to storage.\n    });\n  }\n}\n\nfunction onUpdateViewarea({ location }) {\n  if (this.isInitialViewSet) {\n    // Only update the storage when the document has been loaded *and* rendered.\n    this.store\n      ?.setMultiple({\n        page: location.pageNumber,\n        zoom: location.scale,\n        scrollLeft: location.left,\n        scrollTop: location.top,\n        rotation: location.rotation,\n      })\n      .catch(() => {\n        // Unable to write to storage.\n      });\n  }\n  if (this.appConfig.secondaryToolbar) {\n    this.appConfig.secondaryToolbar.viewBookmarkButton.href =\n      this.pdfLinkService.getAnchorUrl(location.pdfOpenParams);\n  }\n}\n\nfunction onViewerModesChanged(name, evt) {\n  if (this.isInitialViewSet && !this.pdfViewer.isInPresentationMode) {\n    // Only update the storage when the document has been loaded *and* rendered.\n    this.store?.set(name, evt.mode).catch(() => {\n      // Unable to write to storage.\n    });\n  }\n}\n\nfunction onResize() {\n  const { pdfDocument, pdfViewer, pdfRenderingQueue } = this;\n\n  if (pdfRenderingQueue.printing && window.matchMedia(\"print\").matches) {\n    // Work-around issue 15324 by ignoring \"resize\" events during printing.\n    return;\n  }\n\n  if (!pdfDocument) {\n    return;\n  }\n  const currentScaleValue = pdfViewer.currentScaleValue;\n  if (\n    currentScaleValue === \"auto\" ||\n    currentScaleValue === \"page-fit\" ||\n    currentScaleValue === \"page-width\"\n  ) {\n    // Note: the scale is constant for 'page-actual'.\n    pdfViewer.currentScaleValue = currentScaleValue;\n  }\n  pdfViewer.update();\n}\n\nfunction onHashchange(evt) {\n  const hash = evt.hash;\n  if (!hash) {\n    return;\n  }\n  if (!this.isInitialViewSet) {\n    this.initialBookmark = hash;\n  } else if (!this.pdfHistory?.popStateInProgress) {\n    this.pdfLinkService.setHash(hash);\n  }\n}\n\nfunction onPageNumberChanged(evt) {\n  const { pdfViewer } = this;\n  // Note that for `<input type=\"number\">` HTML elements, an empty string will\n  // be returned for non-number inputs; hence we simply do nothing in that case.\n  if (evt.value !== \"\") {\n    this.pdfLinkService.goToPage(evt.value);\n  }\n\n  // Ensure that the page number input displays the correct value, even if the\n  // value entered by the user was invalid (e.g. a floating point number).\n  if (\n    evt.value !== pdfViewer.currentPageNumber.toString() &&\n    evt.value !== pdfViewer.currentPageLabel\n  ) {\n    this.toolbar?.setPageNumber(\n      pdfViewer.currentPageNumber,\n      pdfViewer.currentPageLabel\n    );\n  }\n}\n\nfunction onImageAltTextSettings() {\n  this.imageAltTextSettings?.open({\n    enableGuessAltText: AppOptions.get(\"enableGuessAltText\"),\n    enableNewAltTextWhenAddingImage: AppOptions.get(\n      \"enableNewAltTextWhenAddingImage\"\n    ),\n  });\n}\n\nfunction onFindFromUrlHash(evt) {\n  this.eventBus.dispatch(\"find\", {\n    source: evt.source,\n    type: \"\",\n    query: evt.query,\n    caseSensitive: false,\n    entireWord: false,\n    highlightAll: true,\n    findPrevious: false,\n    matchDiacritics: true,\n  });\n}\n\nfunction onUpdateFindMatchesCount({ matchesCount }) {\n  if (this.supportsIntegratedFind) {\n    this.externalServices.updateFindMatchesCount(matchesCount);\n  } else {\n    this.findBar?.updateResultsCount(matchesCount);\n  }\n}\n\nfunction onUpdateFindControlState({\n  state,\n  previous,\n  entireWord,\n  matchesCount,\n  rawQuery,\n}) {\n  if (this.supportsIntegratedFind) {\n    this.externalServices.updateFindControlState({\n      result: state,\n      findPrevious: previous,\n      entireWord,\n      matchesCount,\n      rawQuery,\n    });\n  } else {\n    this.findBar?.updateUIState(state, previous, matchesCount);\n  }\n}\n\nfunction onScaleChanging(evt) {\n  this.toolbar?.setPageScale(evt.presetValue, evt.scale);\n\n  this.pdfViewer.update();\n}\n\nfunction onRotationChanging(evt) {\n  if (this.pdfThumbnailViewer) {\n    this.pdfThumbnailViewer.pagesRotation = evt.pagesRotation;\n  }\n\n  this.forceRendering();\n  // Ensure that the active page doesn't change during rotation.\n  this.pdfViewer.currentPageNumber = evt.pageNumber;\n}\n\nfunction onPageChanging({ pageNumber, pageLabel }) {\n  this.toolbar?.setPageNumber(pageNumber, pageLabel);\n  this.secondaryToolbar?.setPageNumber(pageNumber);\n\n  if (this.viewsManager?.visibleView === SidebarView.THUMBS) {\n    this.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber);\n  }\n\n  // Show/hide the loading indicator in the page number input element.\n  const currentPage = this.pdfViewer.getPageView(/* index = */ pageNumber - 1);\n  this.toolbar?.updateLoadingIndicatorState(\n    currentPage?.renderingState === RenderingStates.RUNNING\n  );\n}\n\nfunction onWheel(evt) {\n  const {\n    pdfViewer,\n    supportsMouseWheelZoomCtrlKey,\n    supportsMouseWheelZoomMetaKey,\n    supportsPinchToZoom,\n  } = this;\n\n  if (pdfViewer.isInPresentationMode) {\n    return;\n  }\n\n  // Pinch-to-zoom on a trackpad maps to a wheel event with ctrlKey set to true\n  // https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent#browser_compatibility\n  // Hence if ctrlKey is true but ctrl key hasn't been pressed then we can\n  // infer that we have a pinch-to-zoom.\n  // But the ctrlKey could have been pressed outside of the browser window,\n  // hence we try to do some magic to guess if the scaleFactor is likely coming\n  // from a pinch-to-zoom or not.\n\n  // It is important that we query deltaMode before delta{X,Y}, so that\n  // Firefox doesn't switch to DOM_DELTA_PIXEL mode for compat with other\n  // browsers, see https://bugzilla.mozilla.org/show_bug.cgi?id=1392460.\n  const deltaMode = evt.deltaMode;\n\n  // The following formula is a bit strange but it comes from:\n  // https://searchfox.org/mozilla-central/rev/d62c4c4d5547064487006a1506287da394b64724/widget/InputData.cpp#618-626\n  let scaleFactor = Math.exp(-evt.deltaY / 100);\n\n  const isBuiltInMac =\n    typeof PDFJSDev !== \"undefined\" &&\n    PDFJSDev.test(\"MOZCENTRAL\") &&\n    FeatureTest.platform.isMac;\n  const isPinchToZoom =\n    evt.ctrlKey &&\n    !this._isCtrlKeyDown &&\n    deltaMode === WheelEvent.DOM_DELTA_PIXEL &&\n    evt.deltaX === 0 &&\n    (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) &&\n    evt.deltaZ === 0;\n  const origin = [evt.clientX, evt.clientY];\n\n  if (\n    isPinchToZoom ||\n    (evt.ctrlKey && supportsMouseWheelZoomCtrlKey) ||\n    (evt.metaKey && supportsMouseWheelZoomMetaKey)\n  ) {\n    // Only zoom the pages, not the entire viewer.\n    evt.preventDefault();\n    // NOTE: this check must be placed *after* preventDefault.\n    if (\n      this._isScrolling ||\n      document.visibilityState === \"hidden\" ||\n      this.overlayManager.active\n    ) {\n      return;\n    }\n\n    if (isPinchToZoom && supportsPinchToZoom) {\n      scaleFactor = this._accumulateFactor(\n        pdfViewer.currentScale,\n        scaleFactor,\n        \"_wheelUnusedFactor\"\n      );\n      this.updateZoom(null, scaleFactor, origin);\n    } else {\n      const delta = normalizeWheelEventDirection(evt);\n\n      let ticks = 0;\n      if (\n        deltaMode === WheelEvent.DOM_DELTA_LINE ||\n        deltaMode === WheelEvent.DOM_DELTA_PAGE\n      ) {\n        // For line-based devices, use one tick per event, because different\n        // OSs have different defaults for the number lines. But we generally\n        // want one \"clicky\" roll of the wheel (which produces one event) to\n        // adjust the zoom by one step.\n        //\n        // If we're getting fractional lines (I can't think of a scenario\n        // this might actually happen), be safe and use the accumulator.\n        ticks =\n          Math.abs(delta) >= 1\n            ? Math.sign(delta)\n            : this._accumulateTicks(delta, \"_wheelUnusedTicks\");\n      } else {\n        // pixel-based devices\n        const PIXELS_PER_LINE_SCALE = 30;\n        ticks = this._accumulateTicks(\n          delta / PIXELS_PER_LINE_SCALE,\n          \"_wheelUnusedTicks\"\n        );\n      }\n\n      this.updateZoom(ticks, null, origin);\n    }\n  }\n}\n\nfunction closeSecondaryToolbar({ target }) {\n  if (!this.secondaryToolbar?.isOpen) {\n    return;\n  }\n  const { toolbar, secondaryToolbar } = this.appConfig;\n  if (\n    this.pdfViewer.containsElement(target) ||\n    (toolbar?.container.contains(target) &&\n      !secondaryToolbar?.toolbar.contains(target) &&\n      // TODO: change the `contains` for an equality check when the bug:\n      //  https://bugzilla.mozilla.org/show_bug.cgi?id=1921984\n      // is fixed.\n      !secondaryToolbar?.toggleButton.contains(target))\n  ) {\n    this.secondaryToolbar.close();\n  }\n}\n\nfunction closeEditorUndoBar(evt) {\n  if (!this.editorUndoBar?.isOpen) {\n    return;\n  }\n  if (this.appConfig.secondaryToolbar?.toolbar.contains(evt.target)) {\n    this.editorUndoBar.hide();\n  }\n}\n\nfunction onBeforeUnload(evt) {\n  if (this._hasChanges()) {\n    evt.preventDefault();\n    evt.returnValue = \"\";\n    return false;\n  }\n  return true;\n}\n\nfunction onClick(evt) {\n  closeSecondaryToolbar.call(this, evt);\n  closeEditorUndoBar.call(this, evt);\n}\n\nfunction onKeyUp(evt) {\n  // evt.ctrlKey is false hence we use evt.key.\n  if (evt.key === \"Control\") {\n    this._isCtrlKeyDown = false;\n  }\n}\n\nfunction onKeyDown(evt) {\n  this._isCtrlKeyDown = evt.key === \"Control\";\n\n  if (\n    this.editorUndoBar?.isOpen &&\n    evt.keyCode !== 9 &&\n    evt.keyCode !== 16 &&\n    !(\n      (evt.keyCode === 13 || evt.keyCode === 32) &&\n      getActiveOrFocusedElement() === this.appConfig.editorUndoBar.undoButton\n    )\n  ) {\n    // Hide undo bar on keypress except for Shift, Tab, Shift+Tab.\n    // Also avoid hiding if the undo button is triggered.\n    this.editorUndoBar.hide();\n  }\n\n  if (this.overlayManager.active) {\n    return;\n  }\n  const { eventBus, pdfViewer } = this;\n  const isViewerInPresentationMode = pdfViewer.isInPresentationMode;\n\n  let handled = false,\n    ensureViewerFocused = false;\n  const cmd =\n    (evt.ctrlKey ? 1 : 0) |\n    (evt.altKey ? 2 : 0) |\n    (evt.shiftKey ? 4 : 0) |\n    (evt.metaKey ? 8 : 0);\n\n  // First, handle the key bindings that are independent whether an input\n  // control is selected or not.\n  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\n    // either CTRL or META key with optional SHIFT.\n    switch (evt.keyCode) {\n      case 70: // f\n        if (!this.supportsIntegratedFind && !evt.shiftKey) {\n          this.findBar?.open();\n          handled = true;\n        }\n        break;\n      case 71: // g\n        if (!this.supportsIntegratedFind) {\n          const { state } = this.findController;\n          if (state) {\n            const newState = {\n              source: window,\n              type: \"again\",\n              findPrevious: cmd === 5 || cmd === 12,\n            };\n            eventBus.dispatch(\"find\", { ...state, ...newState });\n          }\n          handled = true;\n        }\n        break;\n      case 61: // FF/Mac '='\n      case 107: // FF '+' and '='\n      case 187: // Chrome '+'\n      case 171: // FF with German keyboard\n        this.zoomIn();\n        handled = true;\n        break;\n      case 173: // FF/Mac '-'\n      case 109: // FF '-'\n      case 189: // Chrome '-'\n        this.zoomOut();\n        handled = true;\n        break;\n      case 48: // '0'\n      case 96: // '0' on Numpad of Swedish keyboard\n        if (!isViewerInPresentationMode) {\n          // keeping it unhandled (to restore page zoom to 100%)\n          setTimeout(() => {\n            // ... and resetting the scale after browser adjusts its scale\n            this.zoomReset();\n          });\n          handled = false;\n        }\n        break;\n\n      case 38: // up arrow\n        if (isViewerInPresentationMode || this.page > 1) {\n          this.page = 1;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n        break;\n      case 40: // down arrow\n        if (isViewerInPresentationMode || this.page < this.pagesCount) {\n          this.page = this.pagesCount;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n        break;\n    }\n  }\n\n  if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC || CHROME\")) {\n    // CTRL or META without shift\n    if (cmd === 1 || cmd === 8) {\n      switch (evt.keyCode) {\n        case 83: // s\n          eventBus.dispatch(\"download\", { source: window });\n          handled = true;\n          break;\n\n        case 79: // o\n          if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n            eventBus.dispatch(\"openfile\", { source: window });\n            handled = true;\n          }\n          break;\n      }\n    }\n  }\n\n  // CTRL+ALT or Option+Command\n  if (cmd === 3 || cmd === 10) {\n    switch (evt.keyCode) {\n      case 80: // p\n        this.requestPresentationMode();\n        handled = true;\n        this.externalServices.reportTelemetry({\n          type: \"buttons\",\n          data: { id: \"presentationModeKeyboard\" },\n        });\n        break;\n      case 71: // g\n        // focuses input#pageNumber field\n        if (this.appConfig.toolbar) {\n          this.appConfig.toolbar.pageNumber.select();\n          handled = true;\n        }\n        break;\n    }\n  }\n\n  if (handled) {\n    if (ensureViewerFocused && !isViewerInPresentationMode) {\n      pdfViewer.focus();\n    }\n    evt.preventDefault();\n    return;\n  }\n\n  // Some shortcuts should not get handled if a control/input element\n  // is selected.\n  const curElement = getActiveOrFocusedElement();\n  const curElementTagName = curElement?.tagName.toUpperCase();\n  if (\n    curElementTagName === \"INPUT\" ||\n    curElementTagName === \"TEXTAREA\" ||\n    curElementTagName === \"SELECT\" ||\n    (curElementTagName === \"BUTTON\" && evt.keyCode === /* Space = */ 32) ||\n    curElement?.isContentEditable\n  ) {\n    // Make sure that the secondary toolbar is closed when Escape is pressed.\n    if (evt.keyCode !== /* Esc = */ 27) {\n      return;\n    }\n  }\n\n  // No control key pressed at all.\n  if (cmd === 0) {\n    let turnPage = 0,\n      turnOnlyIfPageFit = false;\n    switch (evt.keyCode) {\n      case 38: // up arrow\n        if (this.supportsCaretBrowsingMode) {\n          this.moveCaret(/* isUp = */ true, /* select = */ false);\n          handled = true;\n          break;\n        }\n      /* falls through */\n      case 33: // pg up\n        // vertical scrolling using arrow/pg keys\n        if (pdfViewer.isVerticalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n        turnPage = -1;\n        break;\n      case 8: // backspace\n        if (!isViewerInPresentationMode) {\n          turnOnlyIfPageFit = true;\n        }\n        turnPage = -1;\n        break;\n      case 37: // left arrow\n        if (this.supportsCaretBrowsingMode) {\n          return;\n        }\n        // horizontal scrolling using arrow keys\n        if (pdfViewer.isHorizontalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n      /* falls through */\n      case 75: // 'k'\n      case 80: // 'p'\n        turnPage = -1;\n        break;\n      case 27: // esc key\n        if (this.secondaryToolbar?.isOpen) {\n          this.secondaryToolbar.close();\n          handled = true;\n        }\n        if (!this.supportsIntegratedFind && this.findBar?.opened) {\n          this.findBar.close();\n          handled = true;\n        }\n        break;\n      case 40: // down arrow\n        if (this.supportsCaretBrowsingMode) {\n          this.moveCaret(/* isUp = */ false, /* select = */ false);\n          handled = true;\n          break;\n        }\n      /* falls through */\n      case 34: // pg down\n        // vertical scrolling using arrow/pg keys\n        if (pdfViewer.isVerticalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n        turnPage = 1;\n        break;\n      case 32: // spacebar\n        if (!isViewerInPresentationMode) {\n          turnOnlyIfPageFit = true;\n        }\n        turnPage = 1;\n        break;\n      case 39: // right arrow\n        if (this.supportsCaretBrowsingMode) {\n          return;\n        }\n        // horizontal scrolling using arrow keys\n        if (pdfViewer.isHorizontalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n      /* falls through */\n      case 74: // 'j'\n      case 78: // 'n'\n        turnPage = 1;\n        break;\n\n      case 36: // home\n        if (isViewerInPresentationMode || this.page > 1) {\n          this.page = 1;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n        break;\n      case 35: // end\n        if (isViewerInPresentationMode || this.page < this.pagesCount) {\n          this.page = this.pagesCount;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n        break;\n\n      case 83: // 's'\n        this.pdfCursorTools?.switchTool(CursorTool.SELECT);\n        break;\n      case 72: // 'h'\n        this.pdfCursorTools?.switchTool(CursorTool.HAND);\n        break;\n\n      case 82: // 'r'\n        this.rotatePages(90);\n        break;\n\n      case 115: // F4\n        this.viewsManager?.toggle();\n        break;\n    }\n\n    if (\n      turnPage !== 0 &&\n      (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === \"page-fit\")\n    ) {\n      if (turnPage > 0) {\n        pdfViewer.nextPage();\n      } else {\n        pdfViewer.previousPage();\n      }\n      handled = true;\n    }\n  }\n\n  // shift-key\n  if (cmd === 4) {\n    switch (evt.keyCode) {\n      case 32: // spacebar\n        if (\n          !isViewerInPresentationMode &&\n          pdfViewer.currentScaleValue !== \"page-fit\"\n        ) {\n          break;\n        }\n        pdfViewer.previousPage();\n\n        handled = true;\n        break;\n\n      case 38: // up arrow\n        this.moveCaret(/* isUp = */ true, /* select = */ true);\n        handled = true;\n        break;\n      case 40: // down arrow\n        this.moveCaret(/* isUp = */ false, /* select = */ true);\n        handled = true;\n        break;\n      case 82: // 'r'\n        this.rotatePages(-90);\n        break;\n    }\n  }\n\n  if (!handled && !isViewerInPresentationMode) {\n    // 33=Page Up  34=Page Down  35=End    36=Home\n    // 37=Left     38=Up         39=Right  40=Down\n    // 32=Spacebar\n    if (\n      (evt.keyCode >= 33 && evt.keyCode <= 40) ||\n      (evt.keyCode === 32 && curElementTagName !== \"BUTTON\")\n    ) {\n      ensureViewerFocused = true;\n    }\n  }\n\n  if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {\n    // The page container is not focused, but a page navigation key has been\n    // pressed. Change the focus to the viewer container to make sure that\n    // navigation by keyboard works as expected.\n    pdfViewer.focus();\n  }\n\n  if (handled) {\n    evt.preventDefault();\n  }\n}\n\nexport { PDFViewerApplication };\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScrollMode, SpreadMode } from \"./ui_utils.js\";\nimport { AppOptions } from \"./app_options.js\";\nimport { LinkTarget } from \"./pdf_link_service.js\";\nimport { PDFViewerApplication } from \"./app.js\";\nimport { RenderingStates } from \"./renderable_view.js\";\n\nconst AppConstants =\n  typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n    ? { LinkTarget, RenderingStates, ScrollMode, SpreadMode }\n    : null;\n\nwindow.PDFViewerApplication = PDFViewerApplication;\nwindow.PDFViewerApplicationConstants = AppConstants;\nwindow.PDFViewerApplicationOptions = AppOptions;\n\nfunction getViewerConfiguration() {\n  return {\n    appContainer: document.body,\n    principalContainer: document.getElementById(\"mainContainer\"),\n    mainContainer: document.getElementById(\"viewerContainer\"),\n    viewerContainer: document.getElementById(\"viewer\"),\n    viewerAlert: document.getElementById(\"viewer-alert\"),\n    toolbar: {\n      container: document.getElementById(\"toolbarContainer\"),\n      numPages: document.getElementById(\"numPages\"),\n      pageNumber: document.getElementById(\"pageNumber\"),\n      scaleSelect: document.getElementById(\"scaleSelect\"),\n      customScaleOption: document.getElementById(\"customScaleOption\"),\n      previous: document.getElementById(\"previous\"),\n      next: document.getElementById(\"next\"),\n      zoomIn: document.getElementById(\"zoomInButton\"),\n      zoomOut: document.getElementById(\"zoomOutButton\"),\n      print: document.getElementById(\"printButton\"),\n      editorCommentButton: document.getElementById(\"editorCommentButton\"),\n      editorCommentParamsToolbar: document.getElementById(\n        \"editorCommentParamsToolbar\"\n      ),\n      editorFreeTextButton: document.getElementById(\"editorFreeTextButton\"),\n      editorFreeTextParamsToolbar: document.getElementById(\n        \"editorFreeTextParamsToolbar\"\n      ),\n      editorHighlightButton: document.getElementById(\"editorHighlightButton\"),\n      editorHighlightParamsToolbar: document.getElementById(\n        \"editorHighlightParamsToolbar\"\n      ),\n      editorHighlightColorPicker: document.getElementById(\n        \"editorHighlightColorPicker\"\n      ),\n      editorInkButton: document.getElementById(\"editorInkButton\"),\n      editorInkParamsToolbar: document.getElementById(\"editorInkParamsToolbar\"),\n      editorStampButton: document.getElementById(\"editorStampButton\"),\n      editorStampParamsToolbar: document.getElementById(\n        \"editorStampParamsToolbar\"\n      ),\n      editorSignatureButton: document.getElementById(\"editorSignatureButton\"),\n      editorSignatureParamsToolbar: document.getElementById(\n        \"editorSignatureParamsToolbar\"\n      ),\n      download: document.getElementById(\"downloadButton\"),\n    },\n    secondaryToolbar: {\n      toolbar: document.getElementById(\"secondaryToolbar\"),\n      toggleButton: document.getElementById(\"secondaryToolbarToggleButton\"),\n      presentationModeButton: document.getElementById(\"presentationMode\"),\n      openFileButton:\n        typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n          ? document.getElementById(\"secondaryOpenFile\")\n          : null,\n      printButton: document.getElementById(\"secondaryPrint\"),\n      downloadButton: document.getElementById(\"secondaryDownload\"),\n      viewBookmarkButton: document.getElementById(\"viewBookmark\"),\n      firstPageButton: document.getElementById(\"firstPage\"),\n      lastPageButton: document.getElementById(\"lastPage\"),\n      pageRotateCwButton: document.getElementById(\"pageRotateCw\"),\n      pageRotateCcwButton: document.getElementById(\"pageRotateCcw\"),\n      cursorSelectToolButton: document.getElementById(\"cursorSelectTool\"),\n      cursorHandToolButton: document.getElementById(\"cursorHandTool\"),\n      scrollPageButton: document.getElementById(\"scrollPage\"),\n      scrollVerticalButton: document.getElementById(\"scrollVertical\"),\n      scrollHorizontalButton: document.getElementById(\"scrollHorizontal\"),\n      scrollWrappedButton: document.getElementById(\"scrollWrapped\"),\n      spreadNoneButton: document.getElementById(\"spreadNone\"),\n      spreadOddButton: document.getElementById(\"spreadOdd\"),\n      spreadEvenButton: document.getElementById(\"spreadEven\"),\n      imageAltTextSettingsButton: document.getElementById(\n        \"imageAltTextSettings\"\n      ),\n      imageAltTextSettingsSeparator: document.getElementById(\n        \"imageAltTextSettingsSeparator\"\n      ),\n      documentPropertiesButton: document.getElementById(\"documentProperties\"),\n    },\n    viewsManager: {\n      outerContainer: document.getElementById(\"outerContainer\"),\n      toggleButton: document.getElementById(\"viewsManagerToggleButton\"),\n      sidebarContainer: document.getElementById(\"viewsManager\"),\n      resizer: document.getElementById(\"viewsManagerResizer\"),\n      thumbnailButton: document.getElementById(\"thumbnailsViewMenu\"),\n      outlineButton: document.getElementById(\"outlinesViewMenu\"),\n      attachmentsButton: document.getElementById(\"attachmentsViewMenu\"),\n      layersButton: document.getElementById(\"layersViewMenu\"),\n      viewsManagerSelectorButton: document.getElementById(\n        \"viewsManagerSelectorButton\"\n      ),\n      viewsManagerSelectorOptions: document.getElementById(\n        \"viewsManagerSelectorOptions\"\n      ),\n      thumbnailsView: document.getElementById(\"thumbnailsView\"),\n      outlinesView: document.getElementById(\"outlinesView\"),\n      attachmentsView: document.getElementById(\"attachmentsView\"),\n      layersView: document.getElementById(\"layersView\"),\n      viewsManagerAddFile: {\n        button: document.getElementById(\"viewsManagerAddFileButton\"),\n        picker: document.getElementById(\"viewsManagerAddFilePicker\"),\n      },\n      viewsManagerCurrentOutlineButton: document.getElementById(\n        \"viewsManagerCurrentOutlineButton\"\n      ),\n      viewsManagerHeaderLabel: document.getElementById(\n        \"viewsManagerHeaderLabel\"\n      ),\n      viewsManagerStatus: document.getElementById(\"viewsManagerStatus\"),\n      viewsManagerStatusBar: {\n        viewsManagerStatusAction: document.getElementById(\n          \"viewsManagerStatusAction\"\n        ),\n        viewsManagerStatusActionDeselectButton: document.getElementById(\n          \"viewsManagerStatusActionDeselectButton\"\n        ),\n        viewsManagerStatusActionLabel: document.getElementById(\n          \"viewsManagerStatusActionLabel\"\n        ),\n      },\n      viewsManagerUndoBar: {\n        viewsManagerStatusUndo: document.getElementById(\n          \"viewsManagerStatusUndo\"\n        ),\n        viewsManagerStatusUndoLabel: document.getElementById(\n          \"viewsManagerStatusUndoLabel\"\n        ),\n        viewsManagerStatusUndoButton: document.getElementById(\n          \"viewsManagerStatusUndoButton\"\n        ),\n        viewsManagerStatusUndoCloseButton: document.getElementById(\n          \"viewsManagerStatusUndoCloseButton\"\n        ),\n      },\n      viewsManagerWaitingBar: {\n        container: document.getElementById(\"viewsManagerStatusWaiting\"),\n        closeButton: document.getElementById(\n          \"viewsManagerStatusWaitingCloseButton\"\n        ),\n        label: document.getElementById(\"viewsManagerStatusWaitingLabel\"),\n      },\n      manageMenu: {\n        button: document.getElementById(\"viewsManagerStatusActionButton\"),\n        menu: document.getElementById(\"viewsManagerStatusActionOptions\"),\n        copy: document.getElementById(\"viewsManagerStatusActionCopy\"),\n        cut: document.getElementById(\"viewsManagerStatusActionCut\"),\n        delete: document.getElementById(\"viewsManagerStatusActionDelete\"),\n        exportSelected: document.getElementById(\n          \"viewsManagerStatusActionExport\"\n        ),\n      },\n    },\n    findBar: {\n      bar: document.getElementById(\"findbar\"),\n      toggleButton: document.getElementById(\"viewFindButton\"),\n      findField: document.getElementById(\"findInput\"),\n      highlightAllCheckbox: document.getElementById(\"findHighlightAll\"),\n      caseSensitiveCheckbox: document.getElementById(\"findMatchCase\"),\n      matchDiacriticsCheckbox: document.getElementById(\"findMatchDiacritics\"),\n      entireWordCheckbox: document.getElementById(\"findEntireWord\"),\n      findMsg: document.getElementById(\"findMsg\"),\n      findResultsCount: document.getElementById(\"findResultsCount\"),\n      findPreviousButton: document.getElementById(\"findPreviousButton\"),\n      findNextButton: document.getElementById(\"findNextButton\"),\n    },\n    passwordOverlay: {\n      dialog: document.getElementById(\"passwordDialog\"),\n      label: document.getElementById(\"passwordText\"),\n      input: document.getElementById(\"password\"),\n      submitButton: document.getElementById(\"passwordSubmit\"),\n      cancelButton: document.getElementById(\"passwordCancel\"),\n    },\n    documentProperties: {\n      dialog: document.getElementById(\"documentPropertiesDialog\"),\n      closeButton: document.getElementById(\"documentPropertiesClose\"),\n      fields: {\n        fileName: document.getElementById(\"fileNameField\"),\n        fileSize: document.getElementById(\"fileSizeField\"),\n        title: document.getElementById(\"titleField\"),\n        author: document.getElementById(\"authorField\"),\n        subject: document.getElementById(\"subjectField\"),\n        keywords: document.getElementById(\"keywordsField\"),\n        creationDate: document.getElementById(\"creationDateField\"),\n        modificationDate: document.getElementById(\"modificationDateField\"),\n        creator: document.getElementById(\"creatorField\"),\n        producer: document.getElementById(\"producerField\"),\n        version: document.getElementById(\"versionField\"),\n        pageCount: document.getElementById(\"pageCountField\"),\n        pageSize: document.getElementById(\"pageSizeField\"),\n        linearized: document.getElementById(\"linearizedField\"),\n      },\n    },\n    altTextDialog: {\n      dialog: document.getElementById(\"altTextDialog\"),\n      optionDescription: document.getElementById(\"descriptionButton\"),\n      optionDecorative: document.getElementById(\"decorativeButton\"),\n      textarea: document.getElementById(\"descriptionTextarea\"),\n      cancelButton: document.getElementById(\"altTextCancel\"),\n      saveButton: document.getElementById(\"altTextSave\"),\n    },\n    newAltTextDialog: {\n      dialog: document.getElementById(\"newAltTextDialog\"),\n      title: document.getElementById(\"newAltTextTitle\"),\n      descriptionContainer: document.getElementById(\n        \"newAltTextDescriptionContainer\"\n      ),\n      textarea: document.getElementById(\"newAltTextDescriptionTextarea\"),\n      disclaimer: document.getElementById(\"newAltTextDisclaimer\"),\n      learnMore: document.getElementById(\"newAltTextLearnMore\"),\n      imagePreview: document.getElementById(\"newAltTextImagePreview\"),\n      createAutomatically: document.getElementById(\n        \"newAltTextCreateAutomatically\"\n      ),\n      createAutomaticallyButton: document.getElementById(\n        \"newAltTextCreateAutomaticallyButton\"\n      ),\n      downloadModel: document.getElementById(\"newAltTextDownloadModel\"),\n      downloadModelDescription: document.getElementById(\n        \"newAltTextDownloadModelDescription\"\n      ),\n      error: document.getElementById(\"newAltTextError\"),\n      errorCloseButton: document.getElementById(\"newAltTextCloseButton\"),\n      cancelButton: document.getElementById(\"newAltTextCancel\"),\n      notNowButton: document.getElementById(\"newAltTextNotNow\"),\n      saveButton: document.getElementById(\"newAltTextSave\"),\n    },\n    altTextSettingsDialog: {\n      dialog: document.getElementById(\"altTextSettingsDialog\"),\n      createModelButton: document.getElementById(\"createModelButton\"),\n      learnMore: document.getElementById(\"altTextSettingsLearnMore\"),\n      showAltTextDialogButton: document.getElementById(\n        \"showAltTextDialogButton\"\n      ),\n      altTextSettingsCloseButton: document.getElementById(\n        \"altTextSettingsCloseButton\"\n      ),\n      closeButton: document.getElementById(\"altTextSettingsCloseButton\"),\n    },\n    addSignatureDialog: {\n      dialog: document.getElementById(\"addSignatureDialog\"),\n      panels: document.getElementById(\"addSignatureActionContainer\"),\n      typeButton: document.getElementById(\"addSignatureTypeButton\"),\n      typeInput: document.getElementById(\"addSignatureTypeInput\"),\n      drawButton: document.getElementById(\"addSignatureDrawButton\"),\n      drawSVG: document.getElementById(\"addSignatureDraw\"),\n      drawPlaceholder: document.getElementById(\"addSignatureDrawPlaceholder\"),\n      drawThickness: document.getElementById(\"addSignatureDrawThickness\"),\n      imageButton: document.getElementById(\"addSignatureImageButton\"),\n      imageSVG: document.getElementById(\"addSignatureImage\"),\n      imagePlaceholder: document.getElementById(\"addSignatureImagePlaceholder\"),\n      imagePicker: document.getElementById(\"addSignatureFilePicker\"),\n      imagePickerLink: document.getElementById(\"addSignatureImageBrowse\"),\n      description: document.getElementById(\"addSignatureDescription\"),\n      clearButton: document.getElementById(\"clearSignatureButton\"),\n      saveContainer: document.getElementById(\"addSignatureSaveContainer\"),\n      saveCheckbox: document.getElementById(\"addSignatureSaveCheckbox\"),\n      errorBar: document.getElementById(\"addSignatureError\"),\n      errorTitle: document.getElementById(\"addSignatureErrorTitle\"),\n      errorDescription: document.getElementById(\"addSignatureErrorDescription\"),\n      errorCloseButton: document.getElementById(\"addSignatureErrorCloseButton\"),\n      cancelButton: document.getElementById(\"addSignatureCancelButton\"),\n      addButton: document.getElementById(\"addSignatureAddButton\"),\n    },\n    editSignatureDialog: {\n      dialog: document.getElementById(\"editSignatureDescriptionDialog\"),\n      description: document.getElementById(\"editSignatureDescription\"),\n      editSignatureView: document.getElementById(\"editSignatureView\"),\n      cancelButton: document.getElementById(\"editSignatureCancelButton\"),\n      updateButton: document.getElementById(\"editSignatureUpdateButton\"),\n    },\n    annotationEditorParams: {\n      editorCommentsSidebar: document.getElementById(\"editorCommentsSidebar\"),\n      editorCommentsSidebarCount: document.getElementById(\n        \"editorCommentsSidebarCount\"\n      ),\n      editorCommentsSidebarTitle: document.getElementById(\n        \"editorCommentsSidebarTitle\"\n      ),\n      editorCommentsSidebarCloseButton: document.getElementById(\n        \"editorCommentsSidebarCloseButton\"\n      ),\n      editorCommentsSidebarList: document.getElementById(\n        \"editorCommentsSidebarList\"\n      ),\n      editorCommentsSidebarResizer: document.getElementById(\n        \"editorCommentsSidebarResizer\"\n      ),\n      editorFreeTextFontSize: document.getElementById(\"editorFreeTextFontSize\"),\n      editorFreeTextColor: document.getElementById(\"editorFreeTextColor\"),\n      editorInkColor: document.getElementById(\"editorInkColor\"),\n      editorInkThickness: document.getElementById(\"editorInkThickness\"),\n      editorInkOpacity: document.getElementById(\"editorInkOpacity\"),\n      editorStampAddImage: document.getElementById(\"editorStampAddImage\"),\n      editorSignatureAddSignature: document.getElementById(\n        \"editorSignatureAddSignature\"\n      ),\n      editorFreeHighlightThickness: document.getElementById(\n        \"editorFreeHighlightThickness\"\n      ),\n      editorHighlightShowAll: document.getElementById(\"editorHighlightShowAll\"),\n    },\n    printContainer: document.getElementById(\"printContainer\"),\n    editorUndoBar: {\n      container: document.getElementById(\"editorUndoBar\"),\n      message: document.getElementById(\"editorUndoBarMessage\"),\n      undoButton: document.getElementById(\"editorUndoBarUndoButton\"),\n      closeButton: document.getElementById(\"editorUndoBarCloseButton\"),\n    },\n    editCommentDialog: {\n      dialog: document.getElementById(\"commentManagerDialog\"),\n      toolbar: document.getElementById(\"commentManagerToolbar\"),\n      title: document.getElementById(\"commentManagerTitle\"),\n      textInput: document.getElementById(\"commentManagerTextInput\"),\n      cancelButton: document.getElementById(\"commentManagerCancelButton\"),\n      saveButton: document.getElementById(\"commentManagerSaveButton\"),\n    },\n  };\n}\n\nfunction webViewerLoad() {\n  const config = getViewerConfiguration();\n\n  if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\")) {\n    // Give custom implementations of the default viewer a simpler way to\n    // set various `AppOptions`, by dispatching an event once all viewer\n    // files are loaded but *before* the viewer initialization has run.\n    const event = new CustomEvent(\"webviewerloaded\", {\n      bubbles: true,\n      cancelable: true,\n      detail: {\n        source: window,\n      },\n    });\n    try {\n      // Attempt to dispatch the event at the embedding `document`,\n      // in order to support cases where the viewer is embedded in\n      // a *dynamically* created <iframe> element.\n      parent.document.dispatchEvent(event);\n    } catch (ex) {\n      // The viewer could be in e.g. a cross-origin <iframe> element,\n      // fallback to dispatching the event at the current `document`.\n      console.error(\"webviewerloaded:\", ex);\n      document.dispatchEvent(event);\n    }\n  }\n  PDFViewerApplication.run(config);\n}\n\n// Block the \"load\" event until all pages are loaded, to ensure that printing\n// works in Firefox; see https://bugzilla.mozilla.org/show_bug.cgi?id=1618553\ndocument.blockUnblockOnload?.(true);\n\nif (\n  document.readyState === \"interactive\" ||\n  document.readyState === \"complete\"\n) {\n  webViewerLoad();\n} else {\n  document.addEventListener(\"DOMContentLoaded\", webViewerLoad, true);\n}\n\nexport {\n  PDFViewerApplication,\n  AppConstants as PDFViewerApplicationConstants,\n  AppOptions as PDFViewerApplicationOptions,\n};\n"],"names":["DEFAULT_SCALE_VALUE","DEFAULT_SCALE","DEFAULT_SCALE_DELTA","MIN_SCALE","MAX_SCALE","UNKNOWN_SCALE","MAX_AUTO_SCALE","SCROLLBAR_PADDING","VERTICAL_PADDING","PresentationModeState","UNKNOWN","NORMAL","CHANGING","FULLSCREEN","SidebarView","NONE","THUMBS","OUTLINE","ATTACHMENTS","LAYERS","TextLayerMode","DISABLE","ENABLE","ENABLE_PERMISSIONS","ScrollMode","VERTICAL","HORIZONTAL","WRAPPED","PAGE","SpreadMode","ODD","EVEN","CursorTool","SELECT","HAND","ZOOM","AutoPrintRegExp","scrollIntoView","element","spot","parent","offsetParent","console","error","offsetY","offsetTop","clientTop","offsetX","offsetLeft","clientLeft","clientHeight","scrollHeight","clientWidth","scrollWidth","top","undefined","left","scrollLeft","scrollTop","watchScroll","viewAreaElement","callback","abortSignal","debounceScroll","evt","rAF","window","requestAnimationFrame","viewAreaElementScrolled","currentX","lastX","state","right","currentY","lastY","down","_eventHandler","addEventListener","useCapture","signal","cancelAnimationFrame","once","parseQueryString","query","params","Map","key","value","URLSearchParams","set","toLowerCase","InvisibleCharsRegExp","removeNullCharacters","str","replaceInvisible","test","replaceAll","m","binarySearchFirstItem","items","condition","start","minIndex","maxIndex","length","currentIndex","currentItem","approximateFraction","x","Math","floor","xinv","limit","x_","a","b","c","d","p","q","floorToDivide","div","getPageSizeInches","view","userUnit","rotate","x1","y1","x2","y2","changeOrientation","width","height","backtrackBeforeAllVisibleElements","index","views","elt","pageTop","i","getVisibleElements","scrollEl","sortByVisibility","horizontal","rtl","bottom","isElementBottomAfterViewTop","elementBottom","isElementNextAfterViewHorizontally","elementLeft","elementRight","visible","ids","Set","numViews","firstVisibleElementInd","lastEdge","currentWidth","currentHeight","viewWidth","viewHeight","viewRight","viewBottom","minY","max","minX","hiddenHeight","hiddenWidth","fractionHeight","fractionWidth","percent","push","id","y","visibleArea","maxX","min","maxY","widthPercent","add","first","last","at","sort","pc","abs","normalizeWheelEventDirection","delta","hypot","deltaX","deltaY","angle","atan2","PI","normalizeWheelEventDelta","deltaMode","MOUSE_PIXELS_PER_LINE","MOUSE_LINES_PER_PAGE","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_LINE","isValidRotation","Number","isInteger","isValidScrollMode","mode","Object","values","includes","isValidSpreadMode","isPortraitOrientation","size","animationStarted","Promise","resolve","docStyle","document","documentElement","style","ProgressBar","classList","disableAutoFetchTimeout","constructor","bar","val","isNaN","remove","setProperty","setWidth","viewer","container","parentNode","scrollbarWidth","offsetWidth","setDisableAutoFetch","delay","clearTimeout","show","setTimeout","hide","getActiveOrFocusedElement","curRoot","curActiveOrFocused","activeElement","querySelector","shadowRoot","apiPageLayoutToViewerModes","layout","scrollMode","spreadMode","apiPageModeToSidebarView","toggleCheckedBtn","button","toggle","setAttribute","toggleSelectedBtn","toggleExpandedBtn","calcRound","e","createElement","fround","compatParams","maxTouchPoints","platform","userAgent","navigator","isAndroid","isIOS","OptionKind","BROWSER","VIEWER","API","WORKER","EVENT_DISPATCH","PREFERENCE","Type","BOOLEAN","NUMBER","OBJECT","STRING","UNDEFINED","defaultOptions","allowedGlobalEvents","kind","canvasMaxAreaInBytes","isInAutomation","localeProperties","lang","language","maxCanvasDim","nimbusDataStr","supportsCaretBrowsingMode","supportsDocumentFonts","supportsDownloading","supportsIntegratedFind","supportsMouseWheelZoomCtrlKey","supportsMouseWheelZoomMetaKey","supportsPinchToZoom","supportsPrinting","toolbarDensity","altTextLearnMoreUrl","annotationEditorMode","annotationMode","capCanvasAreaFactor","commentLearnMoreUrl","cursorToolOnLoad","debuggerSrc","defaultZoomDelay","defaultZoomValue","disableHistory","disablePageLabels","enableAltText","enableAltTextModelDownload","enableAutoLinking","enableComment","enableDetailCanvas","enableGuessAltText","enableHighlightFloatingButton","enableMerge","enableNewAltTextWhenAddingImage","enableNewBadge","enableOptimizedPartialRendering","enablePermissions","enablePrintAutoRotate","enableScripting","enableSignatureEditor","enableSplitMerge","enableUpdatedAddImage","externalLinkRel","externalLinkTarget","highlightEditorColors","historyUpdateUrl","ignoreDestinationZoom","imageResourcesPath","enableSelectionRendering","imagesRightClickMinSize","maxCanvasPixels","minDurationToUpdateCanvas","forcePageColors","pageColorsBackground","pageColorsForeground","pdfBugEnabled","postMessageAfterPrintCallback","printResolution","sidebarViewOnLoad","scrollModeOnLoad","spreadModeOnLoad","textLayerMode","viewerCssTheme","viewOnLoad","cMapPacked","cMapUrl","disableAutoFetch","disableFontFace","disableRange","disableStream","docBaseUrl","enableHWA","enableWebGPU","enableXfa","fontExtraProperties","iccUrl","isOffscreenCanvasSupported","maxImageSize","pdfBug","standardFontDataUrl","useSystemFonts","type","verbosity","wasmUrl","workerPort","workerSrc","defaultUrl","sandboxBundleSrc","enableFakeMLManager","disablePreferences","AppOptions","eventBus","opts","name","_hasInvokedSet","_checkDisablePreferences","get","warn","getAll","defaultOnly","options","create","defaultOpt","setAll","prefs","events","userOpt","toUpperCase","dispatch","source","AbortException","AnnotationEditorLayer","AnnotationEditorParamsType","AnnotationEditorType","AnnotationEditorUIManager","AnnotationLayer","AnnotationMode","AnnotationType","applyOpacity","build","ColorPicker","createValidAbsoluteUrl","CSSConstants","DOMSVGFactory","DrawLayer","FeatureTest","fetchData","findContrastColor","getDocument","getFilenameFromUrl","getPdfFilenameFromUrl","getRGB","getRGBA","getUuid","GlobalWorkerOptions","ImageKind","InvalidPDFException","isDataScheme","isPdfFile","isValidExplicitDest","makeArr","makeMap","makeObj","MathClamp","noContextMenu","normalizeUnicode","OPS","OutputScale","PasswordException","PasswordResponses","PDFDataRangeTransport","PDFDateString","PDFWorker","PermissionFlag","PixelsPerInch","RenderingCancelledException","renderRichText","ResponseException","setLayerDimensions","shadow","SignatureExtractor","stopEvent","SupportedImageMimeTypes","TextLayer","TextLayerImages","TouchManager","updateUrlHash","Util","VerbosityLevel","version","XfaLayer","globalThis","pdfjsLib","INTERNAL_EVT","internalOpt","freeze","internal","DEFAULT_LINK_REL","LinkTarget","SELF","BLANK","PARENT","TOP","PDFLinkService","externalLinkEnabled","_ignoreDestinationZoom","baseUrl","pdfDocument","pdfViewer","pdfHistory","setDocument","setViewer","setHistory","pagesCount","pagesMapper","pagesNumber","page","currentPageNumber","rotation","pagesRotation","isInPresentationMode","goToDestination","dest","namedDest","explicitDest","pageNumber","getDestination","Array","isArray","destRef","cachedPageNumber","getPageIndex","pushCurrentPosition","scrollPageIntoView","destArray","ac","AbortController","on","textLayer","focus","abort","goToPage","pageLabelToPageNumber","pushPage","goToXY","getAttachmentContent","addLinkAttributes","link","url","newWindow","Error","target","rel","displayUrl","parsedUrl","URL","parse","username","password","href","title","onclick","targetStr","getDestinationHash","getAnchorUrl","escape","JSON","stringify","anchor","setHash","hash","has","phrase","match","zoomArgs","split","zoomArg","zoomArgNumber","parseFloat","allowNegativeOffset","unescape","toString","executeNamedAction","action","back","forward","nextPage","previousPage","executeSetOCGState","optionalContentConfig","optionalContentConfigPromise","setOCGState","SimpleLinkService","WaitOnType","EVENT","TIMEOUT","waitOnEventOrTimeout","promise","withResolvers","handler","timeout","evtMethod","EventBus","evtOpts","bind","listeners","seal","eventName","listener","rmAbort","AbortSignal","aborted","onAbort","off","removeEventListener","eventListeners","ii","splice","data","extListeners","slice","FirefoxEventBus","externalServices","globalEventNames","BaseExternalServices","updateFindControlState","updateFindMatchesCount","initPassiveLoading","reportTelemetry","reportText","createL10n","createScripting","createSignatureStorage","updateEditorStates","dispatchGlobalEvent","_event","BasePreferences","defaults","initializedPromise","_readFromStorage","then","browserPrefs","_writeToStorage","prefObj","reset","FluentType","valueOf","FluentNone","scope","FluentNumber","nf","memoizeIntlObject","Intl","NumberFormat","format","err","reportError","FluentDateTime","supportsValue","Date","_Temporal","Temporal","Instant","PlainDateTime","PlainDate","PlainMonthDay","PlainTime","PlainYearMonth","calendar","calendarId","Symbol","toPrimitive","hint","toNumber","getTime","epochMilliseconds","toZonedDateTime","TypeError","dtf","DateTimeFormat","toISOString","MAX_PLACEABLES","FSI","PDI","selector","category","PluralRules","select","getDefault","variants","star","resolvePattern","RangeError","getArguments","args","positional","named","arg","resolveExpression","expr","minimumFractionDigits","precision","resolveVariableReference","resolveMessageReference","resolveTermReference","resolveFunctionReference","resolveSelectExpression","prototype","hasOwnProperty","call","ReferenceError","attr","message","bundle","_messages","attribute","attributes","term","_terms","resolved","func","_functions","sel","variant","resolveComplexPattern","ptn","dirty","result","useIsolating","_useIsolating","elem","_transform","placeables","delete","join","Scope","errors","WeakSet","ctor","cache","_intls","locales","allowed","unwrapped","opt","entries","NUMBER_ALLOWED","DATETIME_ALLOWED","DATETIME","getMemoizerForLocale","stringLocale","memoizer","FluentBundle","functions","transform","v","hasMessage","getMessage","addResource","res","allowOverrides","body","entry","startsWith","formatPattern","pattern","RE_MESSAGE_START","RE_ATTRIBUTE_START","RE_VARIANT_START","RE_NUMBER_LITERAL","RE_IDENTIFIER","RE_REFERENCE","RE_FUNCTION_NAME","RE_TEXT_RUN","RE_STRING_RUN","RE_STRING_ESCAPE","RE_UNICODE_ESCAPE","RE_LEADING_NEWLINES","RE_TRAILING_SPACES","RE_BLANK_LINES","RE_INDENT","TOKEN_BRACE_OPEN","TOKEN_BRACE_CLOSE","TOKEN_BRACKET_OPEN","TOKEN_BRACKET_CLOSE","TOKEN_PAREN_OPEN","TOKEN_ARROW","TOKEN_COLON","TOKEN_COMMA","TOKEN_BLANK","FluentResource","lastIndex","cursor","next","exec","parseMessage","SyntaxError","re","consumeChar","char","errorClass","consumeToken","match1","parsePattern","parseAttributes","keys","attrs","parsePatternElements","Infinity","indent","parseIndent","trim","elements","commonIndent","parsePlaceable","lastElement","baked","Indent","parseInlineExpression","parseVariants","sigil","parseArguments","parseLiteral","parseArgument","count","parseVariantKey","parseNumberLiteral","parseStringLiteral","fraction","parseEscapeSequence","codepoint4","codepoint6","codepoint","parseInt","String","fromCodePoint","makeIndent","text","replace","blank","reOverlay","TEXT_LEVEL_ELEMENTS","LOCALIZABLE_ATTRIBUTES","global","area","input","menuitem","menu","optgroup","option","track","img","textarea","th","description","label","textbox","translateElement","translation","localName","namespaceURI","textContent","templateElement","ownerDocument","createElementNS","innerHTML","overlayChildNodes","content","overlayAttributes","fromFragment","toElement","childNode","childNodes","nodeType","TEXT_NODE","hasAttribute","sanitized","getNodeForNamedElement","replaceChild","isElementAllowed","createSanitizedElement","createTextNodeFromTextContent","appendChild","fromElement","explicitlyAllowed","getAttribute","map","from","isAttrNameLocalizable","removeAttribute","sourceElement","translatedChild","childName","sourceChild","removeChild","clone","cloneNode","shallowPopulateUsing","createTextNode","attrName","elemName","CachedIterable","iterable","CachedSyncIterable","iterator","cached","cur","touchNext","idx","done","CachedAsyncIterable","asyncIterator","default","Localization","resourceIds","generateBundles","onChange","addResourceIds","eager","removeResourceIds","filter","r","formatWithFallback","method","translations","hasAtLeastOneBundle","bundles","missingIds","keysFromBundle","locale","formatMessages","messageFromBundle","formatValues","valueFromBundle","formatValue","handleEvent","formatted","attrNames","messageErrors","forEach","L10NID_ATTR_NAME","L10NARGS_ATTR_NAME","L10N_ELEMENT_QUERY","DOMLocalization","roots","pendingrAF","pendingElements","windowElement","mutationObserver","observerConfig","characterData","childList","subtree","attributeFilter","translateRoots","setAttributes","getAttributes","connectRoot","newRoot","root","contains","defaultView","MutationObserver","mutations","translateMutations","observe","disconnectRoot","pauseObserving","clear","resumeObserving","all","translateFragment","takeRecords","disconnect","mutation","addedNode","addedNodes","ELEMENT_NODE","childElementCount","getTranslatables","translateElements","frag","getKeysForElement","applyTranslations","nodes","querySelectorAll","L10n","dir","l10n","isRTL","fixupLangCode","_setL10n","getLanguage","getDirection","fallback","messages","translate","translateOnce","ex","destroy","pause","resume","#fixupLangCode","langCode","PARTIAL_LANG_CODES","en","es","fy","ga","gu","hi","hy","nb","ne","nn","pa","pt","sv","zh","#isRTL","shortCode","GenericL10n","PLATFORM","isLinux","isMac","isWindows","createBundle","resource","generateBundlesFallback","#generateBundles","defaultLang","baseLang","baseURL","paths","getPaths","langs","shortLang","bundlePromise","createBundleFallback","#createBundle","path","#getPaths","substring","lastIndexOf","#generateBundlesFallback","#createBundleFallback","docProperties","info","metadata","contentDispositionFilename","contentLength","getMetadata","filesize","getDownloadInfo","filename","getRaw","authors","numPages","GenericScripting","_ready","reject","sandbox","pdfjsSandbox","QuickJSSandbox","location","catch","createSandbox","dispatchEventInSandbox","event","dispatchEvent","destroySandbox","nukeSandbox","KEY_STORAGE","SignatureStorage","signatures","save","#save","localStorage","setItem","fromEntries","getItem","isFull","uuid","initCom","app","Preferences","ExternalServices","MLManager","isEnabledFor","_name","deleteModel","_service","isReady","guess","_data","toggleService","_enabled","NewAltTextManager","boundCancel","cancel","createAutomaticallyButton","currentEditor","cancelButton","descriptionContainer","dialog","disclaimer","downloadModel","downloadModelDescription","firstTime","guessedAltText","hasAI","isEditing","imagePreview","imageData","isAILoading","wasAILoading","learnMore","notNowButton","overlayManager","uiManager","previousAltText","saveButton","errorCloseButton","close","preventDefault","toggleError","checked","_reportTelemetry","status","isAltTextEnabled","mlManager","disabled","setProgress","setPreference","setPref","toggleGuessAltText","toggleLoading","toggleTitleAndDisclaimer","ctrlKey","metaKey","register","topic","#setPref","#toggleLoading","#toggleError","#toggleGuessAltText","isInitial","mlGuessAltText","toggleNotNow","#toggleNotNow","toggleAI","#toggleAI","#toggleTitleAndDisclaimer","hidden","#mlGuessAltText","addAltText","hasError","altText","#addAltText","#setProgress","detail","finished","total","totalLoaded","ONE_MEGA_BYTES","totalSize","ariaValueMax","round","downloadedSize","ariaValueNow","editAltText","editor","hasAltTextData","altTextFinish","hasProgress","isAltTextEnabledPromise","removeEditListeners","altTextData","AI_MAX_IMAGE_DIMENSION","MAX_PREVIEW_DIMENSION","canvas","copyCanvas","append","open","#cancel","alt_text_type","flow","alt_text_modal","finish","#finish","closeIfActive","#close","firstElementChild","addEditListeners","setSelected","extractWords","#extractWords","decorative","guessedWords","words","total_words","words_removed","difference","words_added","ImageAltTextSettings","createModelButton","showAltTextDialogButton","closeButton","togglePref","download","#reportTelemetry","details","#download","isFromUI","#delete","#togglePref","AltTextManager","clickAC","hasUsedPointer","optionDescription","optionDecorative","resizeAC","svgElement","rectElement","telemetryData","onUpdateUIState","updateUIState","createSVGElement","#createSVGElement","svgFactory","svg","defs","mask","rect","clickOpts","onClick","setPosition","#setPosition","containerX","containerY","containerW","containerH","getBoundingClientRect","innerWidth","windowW","innerHeight","windowH","dialogW","dialogH","getClientDimensions","MARGIN","isLTR","direction","xs","xe","ys","ye","alt_text_keyboard","removeOnClickListeners","#updateUIState","alt_text_description","alt_text_edit","alt_text_decorative","#onClick","#removeOnClickListeners","AnnotationEditorParams","bindListeners","#bindListeners","editorFreeTextFontSize","editorFreeTextColor","editorInkColor","editorInkThickness","editorInkOpacity","editorStampAddImage","editorFreeHighlightThickness","editorHighlightShowAll","editorSignatureAddSignature","typeStr","valueAsNumber","updateInkColor","updateInkOpacity","isAlphaColorInputSupported","closest","currentInkColor","currentInkOpacity","rgba","g","opacity","hex","makeHexColor","color","alphaHex","hexNums","FREETEXT_SIZE","FREETEXT_COLOR","INK_COLOR","INK_THICKNESS","INK_OPACITY","HIGHLIGHT_COLOR","HIGHLIGHT_THICKNESS","HIGHLIGHT_FREE","HIGHLIGHT_SHOW_ALL","PRECISION","CaretBrowsingMode","mainContainer","toolBarHeight","viewerContainer","toolbarContainer","toolbarObserver","ResizeObserver","borderBoxSize","blockSize","isOnSameLine","#isOnSameLine","rect1","rect2","top1","bot1","mid1","top2","bot2","mid2","isUnderOver","#isUnderOver","isUp","midY","isVisible","#isVisible","getCaretPosition","#getCaretPosition","selection","focusNode","focusOffset","range","createRange","setStart","setEnd","caretPositionFromPoint","#caretPositionFromPoint","startContainer","offsetNode","startOffset","offset","caretRangeFromPoint","setCaretPositionHelper","#setCaretPositionHelper","caretX","extend","firstChild","lastChild","caretPosition","parentElement","elementsAtPoint","elementsFromPoint","savedVisibilities","el","visibility","setCaretPosition","#setCaretPosition","newLineElement","newLineElementRect","getNodeOnNextPage","#getNodeOnNextPage","walker","createTreeWalker","NodeFilter","SHOW_TEXT","node","moveCaret","getSelection","rangeCount","focusElement","Node","currentNode","focusRect","nodeIterator","previousSibling","nextSibling","lastNode","addRange","caretY","elementRect","RESIZE_TIMEOUT","Sidebar","initialWidth","coefficient","resizeTimeout","resizer","isResizerOnTheLeft","isKeyboardResizing","resizeObserver","prevX","sidebar","toggleButton","ltr","globalAbortSignal","_sidebar","getComputedStyle","getPropertyValue","ariaValueMin","makeSidebarResizable","_isOpen","inlineSize","#makeSidebarResizable","sidebarStyle","pointerMoveAC","cancelResize","onStopResizing","NaN","onStartResizing","clientX","parentStyle","minWidth","ev","capture","isArrowLeft","base","dx","#setWidth","newWidth","insetInlineStart","toFixed","onResizing","_newWidth","CommentManager","popup","hasForcedColors","commentDialog","linkService","dateFormat","dateStyle","dialogElement","CommentDialog","CommentPopup","CommentSidebar","setSidebarUiManager","setUIManager","showSidebar","annotations","hideSidebar","removeComments","selectComment","addComment","annotation","updateComment","toggleCommentPopup","isSelected","isEditable","uid","destroyPopup","updatePopupColor","updateColor","showDialog","posX","posY","makeCommentColor","_makeCommentColor","commentForegroundColor","boundCommentClick","commentClick","boundCommentKeydown","commentKeydown","commentsList","commentCount","sidebarTitle","learnMoreUrl","elementsToAnnotations","idsToElements","sidebarResizer","commentToolbarButton","keyDownCallback","lastElementChild","WeakMap","sortComments","fragment","createDocumentFragment","createCommentElement","setCommentsCount","numberOfAnnotations","replaceChildren","removeAll","removeComment","focusComment","children","creationDate","modificationDate","richText","contentsObj","popupRef","prevAnnotation","setDate","setText","insertBefore","#removeComment","#removeAll","hasNoElement","behavior","block","commentItem","#setCommentsCount","createZeroCommentElement","#createZeroCommentElement","textDiv","className","#setDate","date","toDateObject","dateTime","#setText","html","#createCommentElement","role","tabIndex","backgroundColor","dateDiv","#commentClick","currentTarget","_hide","pageIndex","pageVisiblePromise","waitForEditorsRendered","center","#commentKeydown","nextElementSibling","previousElementSibling","#sortComments","dateA","dateB","localeCompare","previousText","commentText","textInput","prevDragX","prevDragY","dialogX","dialogY","toolbar","finishBound","cancelDrag","clientY","getData","dialogStyle","borderColor","parentDimensions","hasDefaultPopupPosition","dialogWidth","dialogHeight","_dialogDimensions","buttonWidth","commentButtonWidth","comment","display","edited","focusCommentButton","buttonsContainer","time","previousFocusedElement","selected","_popupWidth","createPopup","#createPopup","ariaModal","buttons","edit","ariaHasPopup","ariaControlsElements","editLabel","editComment","del","delLabel","deleted","savedData","_uiManager","deleteComment","separator","parentWidth","parentHeight","parentBoundingClientRect","setCommentButtonStates","hasPopup","commentPopupPosition","elementBeforePopup","after","relatedTarget","correctPosition","parentRect","widthRatio","margin","BaseDownloadManager","openBlobUrls","_triggerDownload","blobUrl","originalUrl","isAttachment","_getOpenDataUrl","downloadData","contentType","createObjectURL","Blob","openOrDownloadData","isPdfData","getOrInsertComputed","viewerUrl","revokeObjectURL","DownloadManager","click","encodeURIComponent","EditorUndoBar","focusTimeout","initController","isOpen","showController","undoButton","l10nMessages","highlight","freetext","stamp","ink","signature","_multiple","undoAction","messageData","domOpts","boundHide","OverlayManager","overlays","active","canForceClose","showModal","PasswordPrompt","activeCapability","updateCallback","reason","isViewerEmbedded","submitButton","_isViewerEmbedded","verify","keyCode","passwordIncorrect","INCORRECT_PASSWORD","#verify","invokeCallback","#invokeCallback","setUpdateCallback","TREEITEM_SELECTED_CLASS","BaseTreeViewer","_l10n","_pdfDocument","_lastToggleIsShow","_currentTreeItem","_dispatchEvent","_bindLink","_normalizeTextContent","_addToggleButton","toggler","prepend","_toggleTreeItem","_toggleAllTreeItems","_finishRendering","hasAnyNesting","shiftKey","shouldShowAll","render","_updateCurrentTreeItem","treeItem","_scrollToCurrentTreeItem","inline","PDFAttachmentViewer","downloadManager","appendAttachment","keepRenderedCapability","_attachments","_renderedCapability","_pendingDispatchEvent","attachmentsCount","attachmentId","fallbackContent","openAttachment","attachments","ul","item","li","#appendAttachment","renderedPromise","CSS_CLASS_GRAB","GrabToPan","activateAC","mouseDownAC","scrollAC","overlay","activate","onMouseDown","deactivate","endPan","ignoreTarget","matches","#onMouseDown","originalTarget","tagName","scrollLeftStart","scrollTopStart","clientXStart","clientYStart","boundEndPan","mouseOpts","onMouseMove","focusedElement","blur","#onMouseMove","xDiff","yDiff","scrollTo","#endPan","PDFCursorTools","prevActive","addEventListeners","switchTool","activeTool","tool","#switchTool","disableActiveTool","_handTool","#addEventListeners","presentationModeState","enableActive","disableActive","NON_METRIC_LOCALES","US_PAGE_NAMES","METRIC_PAGE_NAMES","getPageName","isPortrait","pageNames","PDFDocumentProperties","fieldData","fields","fileNameLookup","titleLookup","_fileNameLookup","_titleLookup","_currentPageNumber","_pagesRotation","_dataAvailableCapability","updateUI","pdfPage","getPage","fileName","fileSize","pageSize","isLinearized","parseFileSize","parseDate","CreationDate","ModDate","parsePageSize","parseLinearization","IsLinearized","author","Author","subject","Subject","keywords","Keywords","creator","Creator","producer","Producer","PDFFormatVersion","pageCount","linearized","assign","#reset","#updateUI","#parseFileSize","kb","mb","#parsePageSize","pageSizeInches","nonMetric","sizeInches","sizeMillimeters","nameId","exactMillimeters","intMillimeters","unit","orientation","#parseDate","metadataDate","infoDate","dateObj","#parseLinearization","CharacterType","SPACE","ALPHA_LETTER","PUNCT","HAN_LETTER","KATAKANA_LETTER","HIRAGANA_LETTER","HALFWIDTH_KATAKANA_LETTER","THAI_LETTER","isAlphabeticalScript","charCode","isAscii","isAsciiAlpha","isAsciiDigit","isAsciiSpace","isHan","isKatakana","isHiragana","isHalfwidthKatakana","isThai","getCharacterType","NormalizeWithNFKC","getNormalizeWithNFKC","ranges","diacriticsRegex","fromCharCode","normalize","rangesStr","log","charCodeAt","padStart","FindState","FOUND","NOT_FOUND","PENDING","CHARACTERS_TO_NORMALIZE","DIACRITICS_EXCEPTION","DIACRITICS_EXCEPTION_STR","DIACRITICS_REG_EXP","SPECIAL_CHARS_REG_EXP","NOT_DIACRITIC_FROM_END_REG_EXP","NOT_DIACRITIC_FROM_START_REG_EXP","SYLLABLES_REG_EXP","SYLLABLES_LENGTHS","FIRST_CHAR_SYLLABLES_REG_EXP","NFKC_CHARS_TO_NORMALIZE","noSyllablesRegExp","withSyllablesRegExp","syllablePositions","len","hasSyllables","ignoreDashEOL","normalizationRegex","toNormalizeWithNFKC","CJK","HKDiacritics","BrokenWord","regexps","RegExp","rawDiacriticsPositions","normalized","positions","rawDiacriticsIndex","syllableIndex","shift","shiftOrigin","eol","hasDiacritics","p1","p2","p3","p4","p5","p6","p7","p8","p9","replacement","jj","j","charAt","hasTrailingDashEOL","endsWith","newCharLen","starts","Uint32Array","shifts","Int32Array","getOriginalIndex","diffs","pos","end","oldStart","oldEnd","oldLen","PDFFindController","updateMatchesCountOnProgress","visitedPagesCount","copiedPageData","savedPageData","_linkService","_eventBus","onIsPageVisible","onFind","onFindBarClose","onPagesEdited","highlightMatches","_highlightMatches","pageMatches","_pageMatches","pageMatchesLength","_pageMatchesLength","_selected","_firstPageCapability","#onFind","shouldDirtyMatch","_dirtyMatch","extractText","findbarClosed","pendingTimeout","_findTimeout","nextMatch","highlightAll","updateAllPages","scrollMatchIntoView","matchIndex","_scrollMatches","matchIdx","pageIdx","_offset","wrapped","_extractTextPromises","_pageContents","_pageDiffs","_hasDiacritics","_matchesCountTotal","_pagesToSearch","_pendingFindMatches","_resumePageIdx","#query","_rawQuery","_normalizedQuery","#shouldDirtyMatch","newQuery","prevQuery","newType","prevType","isEntireWord","#isEntireWord","startIdx","convertToRegExpString","#convertToRegExpString","matchDiacritics","isUnicode","addExtraWhitespaces","original","fixed","trailingSpaces","calculateMatch","#calculateMatch","pageContent","matcherResult","matchesLength","matchPos","matchLen","updatePage","nextPageMatch","pageMatchesCount","updateUIResultsCount","reverse","isUnicodePart","queryPart","caseSensitive","entireWord","flags","#extractText","deferred","textOptions","disableNormalization","pdfDoc","getTextContent","strBuf","textItem","hasEOL","#updatePage","#updateAllPages","#nextMatch","previous","findPrevious","currentPageIndex","numPageMatches","updateMatch","advanceOffsetPage","matchesReady","#matchesReady","numMatches","#nextPageMatch","#advanceOffsetPage","#updateMatch","found","#onPagesEdited","pageNumbers","promises","contents","diacritics","pageNum","prevPromises","prevContents","prevDiffs","prevDiacritics","extractTextPromises","pageContents","pageDiffs","prevPageNumber","getPrevPageNumber","src","#onFindBarClose","requestMatchesCount","#requestMatchesCount","current","#updateUIResultsCount","matchesCount","rawQuery","MATCHES_COUNT_LIMIT","PDFFindBar","resizeObserverCallback","opened","findField","highlightAllCheckbox","caseSensitiveCheckbox","matchDiacriticsCheckbox","entireWordCheckbox","findMsg","findResultsCount","findPreviousButton","findNextButton","checkedInputs","evtName","findPrev","findMsgId","updateResultsCount","#resizeObserverCallback","findbarHeight","inputContainerHeight","HASH_CHANGE_TIMEOUT","POSITION_UPDATED_THRESHOLD","UPDATE_VIEWAREA_TIMEOUT","getCurrentHash","PDFHistory","eventAC","_initialized","_fingerprint","_isPagesLoaded","initialize","fingerprint","resetHistory","updateUrl","reInitialized","_updateUrl","bindEvents","history","_popStateInProgress","_blockHashChange","_currentHash","_numPositionUpdates","_uid","_maxUid","_destination","_position","isValidState","parseCurrentHash","pushOrReplaceState","destination","updateInternalState","_initialRotation","_initialBookmark","pageHide","unbindEvents","_updateViewareaTimeout","isValidPage","forceReplace","isDestHashesEqual","isDestArraysEqual","tryPushCurrentPosition","popStateInProgress","initialBookmark","initialRotation","#pushOrReplaceState","shouldReplace","newState","newUrl","protocol","replaceState","pushState","#tryPushCurrentPosition","temporary","position","#isValidPage","#isValidState","checkReload","perfEntry","performance","getEntriesByType","#updateInternalState","removeTemporary","#parseCurrentHash","checkNameddest","nameddest","updateViewarea","#updateViewarea","pdfOpenParams","popState","#popState","newHash","hashChanged","#pageHide","#bindEvents","#unbindEvents","destHash","pushHash","firstDest","secondDest","isEntryEqual","second","PDFLayerViewer","updateLayers","_optionalContentConfig","_optionalContentVisibility","layersCount","groupId","setVisibility","_setNestedName","fontStyle","groups","getOrder","queue","levelData","itemsDiv","order","group","getGroup","#updateLayers","getOptionalContentConfig","intent","PDFOutlineViewer","_currentOutlineItem","_currentOutlineItemCapability","_sidebarView","_outline","_pageNumberToDestHashCapability","outlineCount","loadingParams","currentOutlineItemPromise","attachment","_setStyles","bold","italic","fontWeight","totalCount","nestedCount","nestedItems","outline","pageNumberToDestHash","_getPageNumberToDestHash","linkElement","pageNumberNesting","nesting","currentNesting","DELAY_BEFORE_HIDING_CONTROLS","ACTIVE_SELECTOR","CONTROLS_SELECTOR","MOUSE_SCROLL_COOLDOWN_TIME","PAGE_SWITCH_THRESHOLD","SWIPE_MIN_DISTANCE_THRESHOLD","SWIPE_ANGLE_THRESHOLD","PDFPresentationMode","fullscreenChangeAC","windowAC","contextMenuOpen","mouseScrollTimeStamp","mouseScrollDelta","touchSwipeState","request","requestFullscreen","addFullscreenChangeListeners","notifyStateChange","scaleValue","currentScaleValue","pageViewsReady","hasEqualPageSizes","removeFullscreenChangeListeners","mouseWheel","#mouseWheel","currentTime","now","storedTime","resetMouseScrollState","totalDelta","success","#notifyStateChange","enter","#enter","addWindowListeners","showControls","empty","exit","#exit","removeWindowListeners","hideControls","mouseDown","#mouseDown","contextMenu","#contextMenu","#showControls","controlsTimeout","#hideControls","#resetMouseScrollState","touchSwipe","#touchSwipe","touches","startX","pageX","startY","pageY","endX","endY","dy","absAngle","#addWindowListeners","touchSwipeBind","passive","#removeWindowListeners","#addFullscreenChangeListeners","fullscreenElement","#removeFullscreenChangeListeners","XfaLayerBuilder","cancelled","annotationStorage","xfaHtml","viewport","getXfa","textDivs","hasDiv","dontFlip","update","BasePrintServiceFactory","initGlobals","createPrintService","getXfaHtmlForPrinting","printContainer","allXfaHtml","scale","PDF_TO_CSS_UNITS","xfaPage","builder","getPageViewport","activeService","viewerApp","initialized","renderPage","activeServiceOnEntry","printAnnotationStoragePromise","scratchCanvas","PRINT_UNITS","PDF","ctx","getContext","fillStyle","fillRect","restore","printAnnotationStorage","renderContext","getViewport","ENABLE_STORAGE","renderTask","PDFPrintService","pagesOverview","_printResolution","_optionalContentConfigPromise","_printAnnotationStoragePromise","currentPage","throwIfInactive","every","pageStyleSheet","CSSStyleSheet","replaceSync","adoptedStyleSheets","styleSheet","_blobURLs","ensureOverlay","renderPages","isPureXfa","renderNextPage","renderProgress","useRenderedPage","toBlob","blob","blobURL","wrapper","onload","onerror","performPrint","print","eventType","CustomEvent","bubbles","cancelable","getElementById","progress","progressBar","progressPerc","altKey","chrome","opera","stopImmediatePropagation","stopPropagationIfNeeded","overlayPromise","PDFPrintServiceFactory","RenderingStates","INITIAL","RUNNING","PAUSED","FINISHED","RenderableView","renderingId","renderingState","draw","CLEANUP_TIMEOUT","PDFRenderingQueue","highestPriorityPage","idleTimeout","pdfThumbnailViewer","isThumbnailViewEnabled","onIdle","printing","defineProperty","setThumbnailViewer","isHighestPriority","renderHighestPriority","currentlyVisiblePages","forceRendering","getHighestPriority","scrolledDown","preRenderExtra","ignoreDetailViews","visibleViews","numVisible","isViewFinished","detailView","firstId","lastId","visibleIds","holeId","holeView","preRenderIndex","preRenderView","renderView","finally","PDFScriptingManager","closeCapability","destroyCapability","ready","scripting","willPrintCapability","destroyScripting","objects","calculationOrder","docActions","getFieldObjects","getCalculationOrderIds","getJSActions","initScripting","updateFromSandbox","dispatchPageClose","dispatchPageOpen","_pageOpenPending","appInfo","docInfo","actions","dispatchWillSave","dispatchDidSave","dispatchWillPrint","dispatchDidPrint","destroyPromise","_visitedPages","#updateFromSandbox","isChangingPresentationMode","siblings","command","modes","pagesPromise","increaseScale","decreaseScale","elementId","setValue","#dispatchPageOpen","visitedPages","pageView","getPageView","actionsPromise","#dispatchPageClose","#initScripting","#destroyScripting","race","PdfTextExtractor","textPromise","capability","extractTextContent","requestId","getAllText","Menu","triggeringButton","menuItems","openMenuAC","menuAC","onFocusOutBound","onFocusOut","menuContainer","setUpMenu","closeMenu","#closeMenu","ariaExpanded","openMenu","#openMenu","any","#onFocusOut","#setUpMenu","goToNextItem","find","findLast","toLocaleLowerCase","#goToNextItem","check","indexOf","increment","menuItem","DRAW_UPSCALE_FACTOR","MAX_NUM_SCALING_STEPS","THUMBNAIL_WIDTH","getTempCanvas","OffscreenCanvas","alpha","PDFThumbnailView","defaultViewport","renderingQueue","pageColors","pageLabel","pdfPageRotate","placeholder","thumbnailContainer","imageContainer","draggable","getPageL10nArgs","image","checkbox","pasteButton","updateDims","thumbnailView","replaceWith","addPasteButton","pasteCallback","span","prevPasteButton","before","removePasteButton","toggleSelected","updateId","newId","setPageLabel","#updateDims","ratio","canvasWidth","canvasHeight","setPdfPage","totalRotation","cancelRendering","toggleCurrent","isCurrent","ariaCurrent","getPageDrawContext","#getPageDrawContext","upscaleFactor","outputScale","limitCanvas","sx","sy","scaled","convertCanvasToImage","#convertCanvasToImage","reducedCanvas","reduceImage","drawViewport","renderContinueCallback","cont","onContinue","setImage","thumbnailCanvas","getReducedImageDims","#getReducedImageDims","#reduceImage","willReadFrequently","drawImage","reducedWidth","reducedHeight","reducedImage","reducedImageCtx","#getPageL10nArgs","hasTotal","SCROLL_OPTIONS","DRAG_THRESHOLD_IN_PIXELS","PIXELS_TO_SCROLL_WHEN_DRAGGING","SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT","PDFThumbnailViewer","draggingScaleFactor","dragAC","externalDragActive","draggedContainer","thumbnailsPositions","lastDraggedOverIndex","selectedPages","draggedImageX","draggedImageY","draggedImageWidth","draggedImageHeight","draggedImageOffsetX","draggedImageOffsetY","dragMarker","pageNumberToRemove","currentScrollBottom","currentScrollTop","manageExportButton","manageDeleteButton","manageCopyButton","manageCutButton","copiedThumbnails","savedThumbnails","deletedPageNumbers","copiedPageNumbers","boundPastePages","pastePages","isCut","isOneColumnView","scrollableContainerWidth","scrollableContainerHeight","statusLabel","statusBar","deselectButton","undoBar","undoLabel","undoCloseButton","waitingBar","isInPasteMode","hasUndoBarVisible","newBadge","manageMenu","addFileComponent","scrollableContainer","viewsManagerStatusActionLabel","viewsManagerStatusActionDeselectButton","viewsManagerStatusAction","viewsManagerStatusUndo","viewsManagerStatusUndoLabel","viewsManagerStatusUndoButton","viewsManagerStatusUndoCloseButton","menuButton","copy","cut","exportSelected","newSpan","_manageMenu","saveExtractedPages","deletePages","copyPages","cutPages","toggleMenuEntries","thumbnailId","hasSelectedPages","canDeletePages","canDelete","undo","dismissUndo","clearSelection","updateStatus","picker","files","mergeFiles","toggleBar","scroll","scrollUpdated","resetView","#scrollUpdated","#mergeFiles","insertAfter","file","isImage","magic","bitmap","fileToImageBitmap","bytes","hasStructuralChanges","getStructuralChanges","updateMenuEntries","newPagesCount","insertedPagesCount","_thumbnails","selectPage","updateCurrentPage","getThumbnail","getVisibleThumbs","#getVisibleThumbs","resetCurrentThumbnail","#resetCurrentThumbnail","newPageNumber","scrollThumbnailIntoView","shouldScroll","updateArgs","thumbnail","cleanup","#resetView","_pageLabels","firstPagePromise","firstPdfPage","#cancelRendering","setPageLabels","labels","ensurePdfPageLoaded","#ensurePdfPageLoaded","thumbView","getScrollAhead","#getScrollAhead","visibleThumbs","scrollAhead","hasBeenAltered","getPageMappingForSaving","getScaleFactor","#getScaleFactor","fitImageDimensions","#fitImageDimensions","minSide","maxSide","longest","#fileToImageBitmap","MIN_RASTER_SIDE","MAX_RASTER_SIDE","createImageBitmap","transferToImageBitmap","Image","decode","naturalWidth","naturalHeight","updateThumbnails","#updateThumbnails","newCurrentPageNumber","prevThumbnails","newThumbnails","newThumbnail","onStartDragging","#onStartDragging","draggedThumbnail","startPageNumber","onStopDragging","#onStopDragging","isDropping","originalImageContainer","newIndex","pagesToMove","movePages","#clearSelection","#updateCurrentPage","forceFocus","#undo","cancelCopy","togglePasteMode","currentThumb","newIdx","cancelDelete","#dismissUndo","mustUpdateStatus","cleanSavedData","#canDelete","#toggleBar","#togglePasteMode","enable","#saveExtractedPages","extractPages","#copyPages","pageNumbersToCopy","#cutPages","#pastePages","hasBeenCut","#deletePages","pagesToDelete","#updateMenuEntries","#toggleMenuEntries","#updateStatus","l10nId","moveDraggedContainer","#moveDraggedContainer","positionData","findClosestThumbnail","positionDragMarker","#positionDragMarker","space","dragMarkerStyle","bbox","xPos","computeThumbnailsPosition","#computeThumbnailsPosition","positionsX","positionsY","positionsLastX","Float32Array","prevY","reminder","firstRightX","lastRightX","firstBottomY","w","offsetHeight","h","cx","lastSpace","thumbnailsView","isCheckbox","HTMLInputElement","focusThumbnailElement","addDragListeners","addExternalFileDropListeners","#selectPage","#addDragListeners","draggedImage","clickX","clickY","pointerId","dragPointerId","pointerDownAC","pointerDownSignal","prevScrollTop","scaleFactor","layerY","layerX","stopDragging","_e","upEv","kEv","#addExternalFileDropListeners","hasMergeableItem","dataTransfer","pointerInContainer","stopPropagation","dropEffect","endExternalFileDrag","#endExternalFileDrag","#goToPage","#focusThumbnailElement","focusCheckbox","navigateCheckboxes","nextThumbnail","nextPageNumber","currentThumbnail","firstWithDifferentY","#findClosestThumbnail","spaceBetweenThumbnails","lastSpaceBetweenThumbnails","yPos","xArray","cy","dist1","dist2","AnnotationEditorLayerBuilder","annotationLayer","drawLayer","onAppend","structTreeLayer","accessibilityManager","annotationEditorLayer","_cancelled","updatePageIndex","newPageIndex","clonedViewport","parameters","isInvisible","AnnotationLayerBuilder","commentManager","linksInjected","renderForms","hasJSActionsPromise","fieldObjectsPromise","annotationCanvasMap","annotationEditorUIManager","_hasJSActionsPromise","_fieldObjectsPromise","_annotationCanvasMap","_accessibilityManager","_annotationEditorUIManager","hasJSActions","fieldObjects","getAnnotations","initAnnotationLayer","updatePresentationModeState","#initAnnotationLayer","refreshCanvases","hasEditableAnnotations","injectLinkAnnotations","inferredLinks","newLinks","checkInferredLinks","addLinkAnnotations","#updatePresentationModeState","disableFormElements","section","inert","#checkInferredLinks","annotationRects","annot","quadPoints","rects","trX","trY","blX","blY","intersectAnnotations","annot1","annot2","intersections","annot1Rects","annot2Rects","intersection","intersect","areaRects","totalArea","linkAreaRects","annotationType","LINK","DOMRectToPDF","pdfPageView","pageBox","bottomLeft","getPagePoint","topRight","normalizeRect","calculateLinkPosition","rangeRects","getClientRects","domRect","rectBoundingBox","textPosition","currentContainer","currentLength","createLinkAnnotation","highlighter","_textHighlighter","begin","_convertMatches","Range","divIdx","unsafeUrl","borderStyle","Autolinker","regex","numericTLDRegex","findLinks","normalizedText","matchAll","links","emailDomain","raw","hostname","absoluteURL","addDefaultProtocol","processLinks","textContentItemsStr","BasePDFPageView","loadingId","renderError","showCanvas","startTime","tempCanvas","imageCoordinates","recordedBBoxes","isBackdropFilterSupported","_createCanvas","onShow","hideUntilComplete","hasHCM","background","foreground","prevCanvas","updateOnFirstShow","isLastShow","resetTempCanvas","_resetCanvas","#resetTempCanvas","_drawCanvas","onCancel","onFinish","onError","cancelExtraDelay","dispatchPageRender","dispatchPageRendered","cssTransform","isDetailView","timestamp","DrawLayerBuilder","filterFactory","setParent","getDrawLayer","PDFPageDetailView","detailArea","renderingCancelled","keepCanvas","shouldRenderDifferentArea","#shouldRenderDifferentArea","minDetailX","minDetailY","maxDetailX","maxDetailY","maxWidth","maxHeight","paddingLeftSize","paddingRightSize","paddingTopSize","paddingBottomSize","MOVEMENT_THRESHOLD","underlyingViewUpdated","visibleWidth","visibleHeight","visiblePixels","pixelRatio","maxDetailToVisibleLinearRatio","sqrt","capPixels","maxOverflowScale","overflowScale","overflowWidth","overflowHeight","_getRenderingContext","baseContext","vWidth","vHeight","aWidth","aHeight","aMinX","aMinY","detailMinX","detailMinY","detailMaxX","detailMaxY","operationsFilter","isEmpty","canvasWrapper","_ensureCanvasWrapper","newCanvas","ariaHidden","renderingPromise","_refreshAnnotationLayer","PDF_ROLE_TO_HTML_ROLE","Document","DocumentFragment","Part","Sect","Div","Aside","NonStruct","P","H","Title","FENote","Sub","Lbl","Span","Em","Strong","Link","Annot","Form","Ruby","RB","RT","RP","Warichu","WT","WP","L","LI","LBody","Table","TR","TH","TD","THead","TBody","TFoot","Caption","Figure","Formula","Artifact","MathMLElements","MathMLNamespace","MathMLSanitizer","sanitizer","isSanitizerSupported","Sanitizer","namespace","replaceWithChildrenElements","comments","HEADING_PATTERN","StructTreeLayerBuilder","treeDom","treePromise","elementAttributes","rawDims","elementsToAddToTextLayer","elementsToHideInTextLayer","elementsToStealFromTextLayer","getStructTree","walk","getAriaAttributes","annotationId","#setAttributes","structElement","htmlElement","alt","added","child","addImageInTextLayer","#addImageInTextLayer","pageHeight","calc","updateTextLayer","collectIds","#collectIds","kid","#walk","parentNodes","visitChildren","mathML","setHTML","pop","TextAccessibilityManager","enabled","textChildren","textNodes","waitingElements","setTextMapping","compareElementPositions","#compareElementPositions","e1","e2","centerX1","centerX2","nodeIndex","addIdToAriaOwns","isRemovable","addPointerInTextLayer","disable","removePointerInTextLayer","owns","#addIdToAriaOwns","moveElementInDOM","contentElement","hasChildNodes","TextHighlighter","findController","divs","texts","_updateMatches","iIndex","mm","_renderMatches","isSelectedPage","selectedMatchIdx","prevEnd","infinity","beginText","appendTextToDiv","fromOffset","toOffset","i0","i1","lastDivIdx","lastOffset","highlightSuffix","selectedSpan","n0","n1","clearedUntilDivIdx","n","TextLayerBuilder","renderingDone","textLayers","selectionChangeAC","images","textContentParams","onBefore","textContentSource","streamTextContent","includeMarkedContent","endOfContent","bindMouse","removeGlobalSelectionListener","#bindMouse","clipboardData","setData","enableGlobalSelectionListener","#removeGlobalSelectionListener","textLayerDiv","#enableGlobalSelectionListener","isPointerDown","isFirefox","prevRange","activeTextLayers","getRangeAt","intersectsNode","endDiv","modifyStart","compareBoundaryPoints","END_TO_END","START_TO_END","endContainer","endOffset","parentTextLayer","userSelect","cloneRange","DEFAULT_LAYER_PROPERTIES","LAYERS_ORDER","PDFPageView","ENABLE_FORMS","hasRestrictedScaling","layerProperties","needsRestrictedScaling","originalViewport","previousRotation","scaleRoundX","scaleRoundY","useThumbnailCanvas","directDrawing","initialOptionalContent","regularAnnotations","layers","_isStandalone","hasViewer","_container","xfaLayer","setDimensions","hasInitialVisibility","pagesColors","addLayer","#addLayer","oldDiv","layer","#setDimensions","removeProperty","updatePageNumber","oldPageNumber","addHighlightHCMFilter","deleteMe","deletePage","dispatchLayerRendered","#dispatchLayerRendered","renderAnnotationLayer","#renderAnnotationLayer","textLayerPromise","renderAnnotationEditorLayer","#renderAnnotationEditorLayer","renderDrawLayer","#renderDrawLayer","renderXfaLayer","#renderXfaLayer","buildXfaTextContentItems","renderTextLayer","#renderTextLayer","renderStructTreeLayer","#renderStructTreeLayer","#buildXfaTextContentItems","#injectLinkAnnotations","keepAnnotationLayer","keepAnnotationEditorLayer","keepXfaLayer","keepTextLayer","keepCanvasWrapper","preserveDetailViewState","keepPdfBugGroups","_pdfBug","annotationLayerNode","annotationEditorLayerNode","xfaLayerNode","textLayerNode","canvasWrapperNode","layerIndex","toggleEditingMode","updateVisibleArea","drawingDelay","computeScale","onlyCssZoom","postponeDrawing","redrawAnnotationLayer","redrawAnnotationEditorLayer","redrawXfaLayer","redrawTextLayer","hideTextLayer","#computeScale","invScale","factor","relativeRotation","scaleX","scaleY","convertToPdfPoint","recordOperations","recordImages","annotationLayerDiv","sfx","sfy","pageWidth","recordBBoxes","resultPromise","separateAnnots","annotationEditorLayerDiv","DEFAULT_CACHE_SIZE","PagesCountLimit","FORCE_SCROLL_MODE_PAGE","FORCE_LAZY_PAGE_INIT","PAUSE_EAGER_PAGE_INIT","isValidAnnotationEditorMode","PDFPageViewBuffer","buf","destroyFirstView","resize","newSize","idsToKeep","#destroyFirstView","firstView","PDFViewer","buffer","altTextManager","annotationEditorHighlightColors","containerTopLeft","editorUndoBar","printingAllowed","scrollTimeoutId","switchAnnotationEditorModeAC","switchAnnotationEditorModeTimeoutId","copyAllInProgress","hiddenCopyElement","previousContainerHeight","scrollModePageState","scaleTimeoutId","signatureManager","viewerAlert","copiedPageViews","savedPageViews","viewerVersion","_getVisiblePages","_scriptingManager","scriptingManager","removePageBorders","defaultRenderingQueue","_scrollUpdate","_resetView","updateContainerHeightCss","_pages","getCachedPageViews","isCollapsed","removeAllRanges","_setCurrentPageNumber","resetCurrentPageView","currentPageLabel","currentScale","_currentScale","setScale","noScroll","_currentScaleValue","refresh","onePageRendered","_onePageRenderedCapability","_pagesCapability","_layerProperties","self","setPrintingAllowed","#setPrintingAllowed","isAllowed","initializePermissions","#initializePermissions","permissions","PRINT_HIGH_QUALITY","PRINT","COPY","MODIFY_CONTENTS","MODIFY_ANNOTATIONS","FILL_INTERACTIVE_FORMS","onePageRenderedOrForceFetch","#onePageRenderedOrForceFetch","visibilityState","hiddenCapability","interruptSignal","copyCallback","#copyCallback","anchorNode","containsNode","keydownAC","interruptAC","clipboard","writeText","_cancelRendering","permissionsPromise","getPermissions","_scrollMode","onBeforeDraw","onAfterDraw","cssText","preloadEditingData","updateMode","viewerElement","ensurePageViewVisible","_spreadMode","_updateSpreadMode","getPagesLeft","Language","startUpdatePages","endUpdatePages","prevPages","newPages","clonePage","_location","_previousScrollMode","previousPageNumber","scrollDown","pages","_updateScrollMode","cleanupTimeouts","cleanupSwitchAnnotationEditorMode","#ensurePageViewVisible","pageIndexSet","parity","spread","dummyPage","#scrollIntoView","pageSpot","isSameScale","#isSameScale","newScale","setScaleUpdatePages","#setScaleUpdatePages","newValue","preset","origin","presetValue","previousScale","scaleDiff","pageWidthScaleFactor","#pageWidthScaleFactor","#setScale","hPadding","vPadding","pageWidthScale","pageHeightScale","horizontalScale","#resetCurrentPageView","widthScale","heightScale","boundingRect","convertToViewportPoint","_updateLocation","firstPage","normalizedScaleValue","currentPageView","topLeft","intLeft","intTop","visiblePages","numVisiblePages","newCacheSize","isSimpleLayout","stillFullyVisible","switchToEditAnnotationMode","#switchToEditAnnotationMode","pagesToRefresh","containsElement","_isContainerRtl","isHorizontalScrollbarEnabled","isVerticalScrollbarEnabled","some","firstPageView","getPagesOverview","initialOrientation","getPageAdvance","#getPageAdvance","pageLayout","yArray","currentId","expectedId","advance","updateScale","steps","ceil","#updateContainerHeightCss","#cleanupTimeouts","#cleanupSwitchAnnotationEditorMode","#preloadEditingData","STAMP","loadModel","SIGNATURE","loadSignatures","editId","isFromKeyboard","mustEnterInEditMode","updater","resetModifiedIds","idsToRefresh","noUpdate","SecondaryToolbar","presentationModeButton","printButton","downloadButton","viewBookmarkButton","firstPageButton","lastPageButton","pageRotateCwButton","pageRotateCcwButton","cursorSelectToolButton","eventDetails","cursorHandToolButton","scrollPageButton","scrollVerticalButton","scrollHorizontalButton","scrollWrappedButton","spreadNoneButton","spreadOddButton","spreadEvenButton","imageAltTextSettingsButton","documentPropertiesButton","openFileButton","setPageNumber","setPagesCount","scrollModeChanged","spreadModeChanged","cursorToolChanged","#cursorToolChanged","#scrollModeChanged","forceScrollModePage","isHorizontal","#spreadModeChanged","DEFAULT_HEIGHT_IN_PAGE","SignatureManager","addButton","tabsToAltText","clearButton","clearDescription","drawCurves","drawPlaceholder","drawPath","drawPathString","drawPoints","drawSVG","drawThickness","errorBar","errorDescription","errorTitle","extractedSignatureData","imagePath","imagePicker","imagePickerLink","imagePlaceholder","imageSVG","saveCheckbox","saveContainer","tabButtons","addSignatureToolbarButton","loadSignaturesPromise","typeInput","currentTab","currentTabAC","hasDescriptionChanged","isStorageFull","editDescriptionDialog","signatureStorage","l10nDescription","panels","typeButton","drawButton","imageButton","editSignatureElements","EditDescriptionDialog","errorUploadTitle","errorUploadDescription","errorNoDataTitle","errorNoDataDescription","initTab","initTabButtons","accept","signaturesChanged","#initTabButtons","tabCallback","buttonsArray","resetCommon","#resetCommon","resetTab","#resetTab","#initTab","initTypeTab","initDrawTab","initImageTab","disableButtons","#disableButtons","#initTypeTab","#initDrawTab","currentPointerId","drawCallback","setPointerCapture","drawWidth","drawHeight","thickness","curves","points","finishDrawAC","listenerDrawOptions","pId","releasePointerCapture","showError","#showError","#initImageTab","passiveOptions","extractSignature","effectAllowed","#extractSignature","imageManager","getFromFile","lineData","getFromImage","viewBox","toSVGPath","getOutlineForType","#getOutlineForType","getFromText","getOutlineForDraw","#getOutlineForDraw","getDrawnSignature","addToolbarButton","#addToolbarButton","signatureData","areContours","maxDim","outlineData","processDrawnLines","lines","innerMargin","mustSmooth","CREATE","heightInPage","deleteButton","savedCount","deleteSpan","#signaturesChanged","getSignature","reload","decompressSignature","signaturesData","outlines","renderEditButton","tabType","_drawId","#add","newCurves","compressSignature","saved","descriptionChanged","addSignature","previousDescription","signatureSVG","updateButton","editSignatureView","descriptionInput","Event","getSignaturePreview","#update","hasBeenChanged","Toolbar","colorPicker","zoomIn","zoomOut","editorCommentButton","POPUP","editorFreeTextButton","FREETEXT","editorHighlightButton","HIGHLIGHT","editorInkButton","INK","editorStampButton","telemetry","editorSignatureButton","updateToolbarDensity","#updateToolbarDensity","hasPageLabels","setPageScale","pageScaleValue","pageScale","updateLoadingIndicatorState","editorModeChanged","editorHighlightColorPicker","scaleSelect","oncontextmenu","cp","setMainHighlightColorPicker","renderMainDropdown","#editorModeChanged","editorCommentParamsToolbar","editorFreeTextParamsToolbar","editorHighlightParamsToolbar","editorInkParamsToolbar","editorStampParamsToolbar","editorSignatureParamsToolbar","resetNumPages","predefinedValueFound","customScaleOption","loading","DEFAULT_VIEW_HISTORY_CACHE_SIZE","ViewHistory","cacheSize","_initializedPromise","databaseStr","database","branch","setMultiple","properties","defaultValue","getMultiple","SIDEBAR_WIDTH_VAR","SIDEBAR_RESIZING_CLASS","UI_NOTIFICATION_CLASS","ViewsManager","hasAnimations","matchMedia","outerContainer","sidebarContainer","thumbnailButton","outlineButton","attachmentsButton","layersButton","outlinesView","attachmentsView","layersView","viewsManagerAddFile","viewsManagerAddFileButton","viewsManagerCurrentOutlineButton","viewsManagerSelectorButton","viewsManagerSelectorOptions","viewsManagerHeaderLabel","viewsManagerStatus","isInitialViewSet","isInitialEventDispatched","onToggled","onUpdateThumbnails","_enableSplitMerge","_enableMerge","pagesTitle","outlinesTitle","attachmentsTitle","layersTitle","notificationButton","hideUINotification","switchView","visibleView","setInitialView","forceOpen","isViewChanged","titleL10nId","queueMicrotask","#dispatchEvent","showUINotification","#showUINotification","#hideUINotification","onTreeLoaded","FORCE_PAGES_LOADED_TIMEOUT","ViewOnLoad","PREVIOUS","PDFViewerApplication","_initializedCapability","settled","appConfig","pdfLoadingTask","printService","pdfRenderingQueue","pdfPresentationMode","pdfDocumentProperties","pdfLinkService","pdfTextExtractor","viewsManager","pdfOutlineViewer","pdfAttachmentViewer","pdfLayerViewer","pdfCursorTools","pdfScriptingManager","store","preferences","secondaryToolbar","annotationEditorParams","imageAltTextSettings","_downloadUrl","_eventBusAC","_windowAC","_globalAbortController","documentInfo","_contentDispositionFilename","_contentLength","_saveInProgress","_wheelUnusedTicks","_wheelUnusedFactor","_touchManager","_touchUnusedTicks","_touchUnusedFactor","_PDFBug","_hasAnnotationEditors","_title","_isCtrlKeyDown","_caretBrowsing","_isScrolling","_printPermissionPromise","_parseHashParams","getElementsByTagName","appContainer","_initializeViewerComponents","bindWindowEvents","loadPDFBug","PDFBug","loadCSS","init","debugOpts","StepperManager","setEventBus","_cleanup","_scriptingDocProperties","newAltTextDialog","altTextDialog","addSignatureDialog","editSignatureDialog","editCommentDialog","editorCommentsSidebar","editorCommentsSidebarResizer","editorCommentsSidebarList","editorCommentsSidebarCount","editorCommentsSidebarTitle","editorCommentsSidebarCloseButton","viewsManagerStatusBar","viewsManagerUndoBar","viewsManagerWaitingBar","findBar","principalContainer","altTextSettingsDialog","documentProperties","_docFilename","_docTitle","imageAltTextSettingsSeparator","supportsFullscreen","passwordOverlay","passwordPrompt","run","config","queryString","search","validateFileURL","fileInput","_openFileInput","msg","togglePrintingButtons","_hideViewBookmark","updateZoom","zoomReset","touchPinchCallback","prevDistance","distance","newScaleFactor","_accumulateFactor","PIXELS_PER_LINE_SCALE","ticks","_accumulateTicks","touchPinchEndCallback","fullscreenEnabled","loadingBar","barElement","setTitleUsingUrl","downloadUrl","decodeURIComponent","setTitle","hasChangesIndicator","_hasChanges","_unblockDocumentLoadEvent","_annotationStorageModified","downloadOrSave","workerParams","apiParams","loadingTask","onPassword","onProgress","load","missing","_documentError","saveDocument","editorStats","stats","onSavePages","_mergedDocumentNeedsSaving","moreInfo","_otherError","moreInfoText","stack","lineNumber","pageLayoutPromise","getPageLayout","pageModePromise","getPageMode","openActionPromise","getOpenAction","storedPromise","fingerprints","zoom","sidebarView","_initializeAnnotationStorageCallbacks","timeStamp","stored","pageMode","openAction","_initializePdfHistory","initialDest","_initializeAutoPrint","getOutline","getAttachments","_initializePageLabels","_initializeMetadata","jsActions","triggerAutoPrint","js","triggerPrinting","hasStructTree","pdfTitle","IsXFAPresent","IsAcroFormPresent","IsSignaturesPresent","getPageLabels","numLabels","standardLabels","emptyLabels","onSetModified","onResetModified","onAnnotationEditor","storedHash","setRotation","setViewerModes","beforePrint","alert","afterPrint","resetModified","rotatePages","requestPresentationMode","onResize","onHashchange","onPageRender","onPageRendered","onUpdateViewarea","onPageChanging","onScaleChanging","onRotationChanging","onSidebarViewChanged","onPageMode","onNamedAction","onPageNumberChanged","onViewerModesChanged","onImageAltTextSettings","onFindFromUrlHash","onUpdateFindMatchesCount","onUpdateFindControlState","onFileInputChange","onOpenFile","onSaveAndLoad","isPinchingDisabled","isPinchingStopped","onPinching","onPinchEnd","addWindowResolutionChange","mediaQueryList","onWheel","onKeyDown","onKeyUp","onBeforeUnload","_lastScrollTop","_lastScrollLeft","scrollendTimeoutID","scrollAbortController","scrollend","unbindWindowEvents","testingClose","extractParams","modifiedPdfBytes","prop","wholeTicks","trunc","newFactor","blockUnblockOnload","scriptingReady","HOSTED_VIEWER_ORIGINS","viewerOrigin","fileOrigin","exp","isBuiltInMac","isPinchToZoom","deltaZ","DOM_DELTA_PAGE","sign","closeSecondaryToolbar","closeEditorUndoBar","returnValue","isViewerInPresentationMode","handled","ensureViewerFocused","cmd","curElement","curElementTagName","isContentEditable","turnPage","turnOnlyIfPageFit","AppConstants","PDFViewerApplicationConstants","PDFViewerApplicationOptions","getViewerConfiguration","createAutomatically","altTextSettingsCloseButton","webViewerLoad","readyState"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/pdfjs/web/wasm/LICENSE_JBIG2 b/public/pdfjs/web/wasm/LICENSE_JBIG2
new file mode 100644
index 0000000..37a329c
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/wasm/LICENSE_OPENJPEG b/public/pdfjs/web/wasm/LICENSE_OPENJPEG
new file mode 100644
index 0000000..e8fa410
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 b/public/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2
new file mode 100644
index 0000000..f1845ba
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG b/public/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG
new file mode 100644
index 0000000..623929b
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/wasm/LICENSE_PDFJS_QCMS b/public/pdfjs/web/wasm/LICENSE_PDFJS_QCMS
new file mode 100644
index 0000000..7e1aeb3
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/wasm/LICENSE_QCMS b/public/pdfjs/web/wasm/LICENSE_QCMS
new file mode 100644
index 0000000..eec8246
--- /dev/null
+++ b/public/pdfjs/web/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/public/pdfjs/web/wasm/jbig2.wasm b/public/pdfjs/web/wasm/jbig2.wasm
new file mode 100644
index 0000000..254e1e4
--- /dev/null
+++ b/public/pdfjs/web/wasm/jbig2.wasm
Binary files differ
diff --git a/public/pdfjs/web/wasm/jbig2_nowasm_fallback.js b/public/pdfjs/web/wasm/jbig2_nowasm_fallback.js
new file mode 100644
index 0000000..c86528f
--- /dev/null
+++ b/public/pdfjs/web/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<g;c+=4){d=b[l.charCodeAt(c+1)];e=b[l.charCodeAt(c+2)];j[f++]=b[l.charCodeAt(c)]<<2|d>>4;if(f<h)j[f++]=d<<4|e>>2;if(f<h)j[f++]=e<<6|b[l.charCodeAt(c+3)]}return j}function m(n){i(a,1024,"TjdmeGNvZGVjMTVTY2FubGluZURlY29kZXJFAAAAAAAAAAAGBwIACAMACwQADAUADgYADwcABgcKAAgLABKAABMIABQJABtAAAkDDQAHAQAIDAAXwAAYgAYqEAArEQA0DgA1DwAMAxYABBcACBQADBMAExoAFxUAGBwAJBsAJxIAKBgAKxkANwABKgIdAAMeAAQtAAUuAAovAAswABIhABMiABQjABUkABYlABcmABofABsgACQ1ACU2ACgnACkoACopACsqACwrAC0sADI9ADM+ADQ/ADUAADZAATeAAUo7AEs8AFIxAFMyAFQzAFU0AFg3AFk4AFo5AFs6AGTAAWUAAmeAAmhAAhCYwAWZAAaaQAabwAbMwALNAAPSQAPTgAPUwAPVAATWQATXgATYwATZAAXaQAXbgAUAAwgABwxABw2ABwoSwAcTAAgUQAgVgAgWwAgXAAkcQAkdgAkewAkfAAr/");i(a,1393,"AgIDAAMCAAICAQADBAACAgYAAwUAAQMHAAIECQAFCAADBAoABQsABwwAAgQNAAcOAAEYDwAFCBIAD0AAFxAAGBEANwAACggABwxABw2ABxcYABgZACgXADcWAGcTAGgUAGwVADYSwAcTAAgUQAgVgAgWwAgXAAkcQAkdgAkewAkfAAokNAAnNwAoOAArOwAsPAAzQAE0gAE1wAE3NQA4NgBSMgBTMwBULABVLQBWLgBXLwBYOQBZOgBaPQBbAAFkMABlMQBmPgBnPwBoHgBpHwBqIABrIQBsKABtKQDIgADJwADKGgDLGwDMHADNHQDSIgDTIwDUJADVJQDWJgDXJwDaKgDbKwAUSoACS8ACTAADTUADUgAFU0AFVIAFVcAFWgAGW0AGZIAGZcAGbAACbUACcoADc8ADdAAEdUAEdoAEd8AE/wAAAAAAAAAA//////////8IBwYGBQUFBQQEBAQEBAQEAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ==");i(a,1996,"5AcAAAwAAAANAAAADgAAAA8AAAAQAAAAaBcAAPAHAAAYCAAATjdmeGNvZGVjMTJfR0xPQkFMX19OXzExMEZheERlY29kZXJFAAAAADAXAAAABAAAAVYBAQEAATQCBgAAARgDCQAAwQoEDAAAIQUFHQAAIQImIQAAAVYHBgEAAVQIDgAAAUgJDgAAATgKDgAAATALEQAAASQMEgAAARwNFAAAARYdFQAAAVYPDgEAAVQQDgAAAVERDwAAAUgSEAAAATgTEQAAATQUEgAAATAVEwAAASgWEwAAASQXFAAAASIYFQAAARwZFgAAARgaFwAAARYbGAAAARQcGQAAARIdGgAAAREeGwAAwQofHAAAwQkgHQAAoQghHgAAIQUiHwAAQQQjIAAAoQIkIQAAIQIlIgAAQQEmIwAAEQEnJAAAhQAoJQAASQApJgAAJQAqJwAAFQArKAAACQAsKQAABQAtKgAAAQAtKwAAAVYuLgAAAAACAAAAAAAAAAQAAAAEAAAABgAAABQAAAAIAAAAVAAAAAwAAABUAQAAIAAAAFQRAAAAAAAAEQAAABIAAAAlm5UH5QAAAAEAAwDwB/gBfAD3e/sOvQEQAAgABAAGAAQAAQAA+AAegAMACAACgAAMAAkABwAHAA8ABwAfAB8ADwAPAAcAAwAlmwAA93sAAAAAAADwBwAAEAAAAAYAAAAA+AAAAAgAAJUHAAD7DgAAAQAAAPgBAAAIAAAABAAAAAAeAAAAAgAA5QAAAL0BAAADAAAAfAAAAAQAAAABAAAAgAMAAIAAAAAAAAAATAoAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAAGgXAABYCgAAyAoAAE5TdDNfXzIxMF9fZnVuY3Rpb242X19mdW5jSU0xNENKQmlnMl9HUkRQcm9jRjE0RlhDT0RFQ19TVEFUVVNQTlMyXzI3UHJvZ3Jlc3NpdmVBcml0aERlY29kZVN0YXRlRUVGUzNfUlMyX1M1X0VFRQAwFwAA0AoAAE5TdDNfXzIxMF9fZnVuY3Rpb242X19iYXNlSUYxNEZYQ09ERUNfU1RBVFVTUjE0Q0pCaWcyX0dSRFByb2NQTlMzXzI3UHJvZ3Jlc3NpdmVBcml0aERlY29kZVN0YXRlRUVFRQBAFgAASAsAAAAAAACQCwAA3AsAAE0xNENKQmlnMl9HUkRQcm9jRjE0RlhDT0RFQ19TVEFUVVNQTlNfMjdQcm9ncmVzc2l2ZUFyaXRoRGVjb2RlU3RhdGVFRQAAAPAVAACYCwAARjE0RlhDT0RFQ19TVEFUVVNQTjE0Q0pCaWcyX0dSRFByb2MyN1Byb2dyZXNzaXZlQXJpdGhEZWNvZGVTdGF0ZUVFAAAwFwAA5AsAADE0Q0pCaWcyX0dSRFByb2M=");i(a,3080,"wAwAAAUAAAABAAAA8AwAAAgAAAABAAAAMA0AAAkAAAAAAAAAgA0AAAcAAAAAAAAAwA0AAAgAAAAAAAAAAA4AAA4AAAAAAAAAcA4AAA8AAAABAAAA8A4AABUAAAABAAAAoA8AABYAAAABAAAAUBAAABUAAAAAAAAAABEAAA4AAAAAAAAAcBEAAA4AAAAAAAAA4BEAAA4AAAAAAAAAUBIAAAcAAAAAAAAAkBIAAA0=");i(a,3264,"AQQAAAAAAAACCAAAEAAAAAMQAAAQAQAAACAAAP////8DIAAAEAEB");i(a,3312,"AQAAAAAAAAACAAAAAQAAAAMAAAACAAAABAMAAAMAAAAFBgAACwAAAAAgAAD/////BiAAAEsAAAAGAAAAAAAAAAgIAAAA////AQAAAAAAAAACAAAAAQAAAAMAAAACAAAABAMAAAMAAAAFBgAACwAAAAggAAD//v//ByAAAEsAAAAG");i(a,3456,"AQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAMAAAQAAAAFBgAADAAAAAAgAAD/////BSAAAEw=");i(a,3520,"BwgAAAH///8BAAAAAQAAAAIAAAACAAAAAwAAAAMAAAAEAwAABAAAAAUGAAAMAAAAByAAAAD///8GIAAATAAAAAUKAAAA+P//BAkAAAD8//8ECAAAAP7//wQHAAAA////BQYAAID///8FBQAAwP///wQFAADg////AgcAAAAAAAADBwAAgAAAAAMIAAAAAQAABAkAAAACAAAECgAAAAQAAAYgAAD/9///BiAAAAAIAAAECQAAAPz//wMIAAAA/v//BAcAAAD///8FBgAAgP///wUFAADA////BAUAAOD///8EBQAAAAAAAAUFAAAgAAAABQYAAEAAAAAEBwAAgAAAAAMIAAAAAQAAAwkAAAACAAADCgAAAAQAAAUgAAD/+///BSAAAAAI");i(a,3824,"CAMAAPH///8JAQAA+f///wgBAAD7////CQAAAP3///8HAAAA/v///wQAAAD/////AgEAAAAAAAAFAAAAAgAAAAYAAAADAAAAAwQAAAQAAAAGAQAAFAAAAAQEAAAWAAAABAUAACYAAAAFBgAARgAAAAUHAACGAAAABgcAAAYBAAAHCAAAhgEAAAYKAACGAgAACSAAAPD///8JIAAAhgYAAAI=");i(a,4e3,"CAQAAOH///8JAgAA8f///wgCAAD1////CQEAAPn///8HAQAA+////wQBAAD9////AwEAAP////8DAQAAAQAAAAUBAAADAAAABgEAAAUAAAADBQAABwAAAAYCAAAnAAAABAUAACsAAAAEBgAASwAAAAUHAACLAAAABQgAAAsBAAAGCAAACwIAAAcJAAALAwAABgsAAAsFAAAJIAAA4P///wkgAAALDQAAAgAAAAAAAAAHBAAA6////wgAAAD7////BwAAAPz///8FAAAA/f///wICAAD+////BQAAAAIAAAAGAAAAAwAAAAcAAAAEAAAACAAAAAUAAAACBgAABgAAAAUFAABGAAAABgUAAGYAAAAGBgAAhgAAAAYHAADGAAAABggAAEYBAAAGCQAARgIAAAYKAABGBAAABwsAAEYIAAAIIAAA6v///wggAABGEAAAAg==");i(a,4352,"AQAAAAEAAAACAQAAAgAAAAQAAAAEAAAABAEAAAUAAAAFAQAABwAAAAUCAAAJAAAABgIAAA0AAAAHAgAAEQAAAAcDAAAVAAAABwQAAB0AAAAHBQAALQAAAAcGAABNAAAAACAAAAAAAAAHIAAAjQAAAAEAAAABAAAAAgAAAAIAAAADAQAAAwAAAAUAAAAFAAAABQEAAAYAAAAGAQAACAAAAAcAAAAKAAAABwEAAAsAAAAHAgAADQAAAAcDAAARAAAABwQAABkAAAAIBQAAKQAAAAAgAAAAAAAACCAAAEkAAAABAAAAAQAAAAMAAAACAAAABAAAAAMAAAAFAAAABAAAAAQBAAAFAAAAAwMAAAcAAAAGAQAADwAAAAYCAAARAAAABgMAABUAAAAGBAAAHQAAAAYFAAAtAAAABwYAAE0AAAAAIAAAAAAAAAcgAACNAAAAAwAAAP7///8DAAAA/////wEAAAAAAAAAAwAAAAEAAAADAAAAAgAAAAAgAAD9////ACAAAAM=");i(a,4752,"BwQAAOj///8GAgAA+P///wUBAAD8////BAAAAP7///8DAAAA/////wEAAAAAAAAAAwAAAAEAAAAEAAAAAgAAAAUBAAADAAAABgIAAAUAAAAHBAAACQAAAAcgAADn////ByAAABkAAAAcAAAAHQAAAGJhZF92YXJpYW50X2FjY2VzcwB2ZWN0b3IAc3RkOjpiYWRfZnVuY3Rpb25fY2FsbABiYWRfYXJyYXlfbmV3X2xlbmd0aAAAAB4AAAAfAAAAIAAAACE=");i(a,4964,"IgAAACIAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAiAAAAIgAAACMAAAAiAAAAIgAAACIAAAAi");i(a,5056,"IwAAACMAAAAiAAAAIgAAAAAAAAAiAAAAAAAAACM=");i(a,5224,"eBQAAAsAAAAkAAAAJQAAAGgXAACEFAAAiBcAAE5TdDNfXzIxN2JhZF9mdW5jdGlvbl9jYWxsRQAAAAAAtBQAAAIAAAAmAAAAJwAAAGgXAADAFAAAiBcAAFN0MThiYWRfdmFyaWFudF9hY2Nlc3MAAGgXAADkFAAAIBcAAE4xMF9fY3h4YWJpdjExNl9fc2hpbV90eXBlX2luZm9FAAAAAGgXAAAUFQAA2BQAAE4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRQAAAGgXAABEFQAA2BQAAE4xMF9fY3h4YWJpdjExN19fcGJhc2VfdHlwZV9pbmZvRQAAAGgXAAB0FQAA2BQAAE4xMF9fY3h4YWJpdjEyMF9fZnVuY3Rpb25fdHlwZV9pbmZvRQAAAABoFwAAqBUAADgVAABOMTBfX2N4eGFiaXYxMjlfX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mb0U=");i(a,5600,"/////0RuAAAAAAAAaBUAACgAAAApAAAAKgAAACsAAAAsAAAAaBcAABAWAAAIFQAATjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FAAAAAAAAAACcFQAAKAAAAC0AAAAqAAAAKwAAAC4AAAAAAAAAlBYAAAIAAAAvAAAAMAAAAFN0OWV4Y2VwdGlvbgAAAABoFwAAhBYAAIgXAABTdDliYWRfYWxsb2MAAAAAaBcAAKAWAAB4FgAAU3QyMGJhZF9hcnJheV9uZXdfbGVuZ3RoAAAAAAAAAADQFgAAAQAAADEAAAAyAAAAaBcAANwWAACIFwAAU3QxMWxvZ2ljX2Vycm9yAAAAAAAAFwAAAQAAADMAAAAyAAAAaBcAAAwXAADQFgAAU3QxMmxlbmd0aF9lcnJvcgAAAAAwFwAAUBcAAAAAAAAIFQAAKAAAADQAAAAqAAAAKwAAADUAAAA2AAAANwAAADgAAABTdDl0eXBlX2luZm8AAAAAAAAAAAQWAAAoAAAAOQAAACoAAAArAAAANQAAADoAAAA7AAAAPAAAADAXAABoFg==");i(a,6032,"IBwBAL0=")}function o(){throw new Error("abort")}function p(q,r,s){a.copyWithin(q,r,r+s)}function t(q,u,s){q=q>>>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<i>>>0){break l}h=g;g=y[g+4>>2];y[h+8>>2]=d>>>0<g>>>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<<c>>>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<<k|v;k=k-1|0;continue}break}if((h|0)==(H|0)){break fa}w[q+H|0]=v;H=H+1|0;continue}break}if(H>>>0<L>>>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<<c|v;c=c-1|0;continue}}d=H<<8;c=0;v=0;while(1){if((c|0)!=(T|0)){if(z[u|0]){break ya}if(k>>>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]<k>>>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<c>>>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<<h>>>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<k>>>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<k>>>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<<h>>>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<l>>>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<d>>>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]<k>>>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<<c>>>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<h>>>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<l>>>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<T>>>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<<c>>>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<<k&785?k>>>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<d>>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0<c>>>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<d>>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0<c>>>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<<b)|0]!=1){break Ab}pb(d,1);b=y[f+28>>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<b>>>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<d>>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0<c>>>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<h>>>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<l>>>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<<d>>>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<c>>>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<c>>>0?b:c}b=y[a+12>>2];i=y[a+16>>2];jc:{if(b>>>0<i>>>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<h>>>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<<t|j;h=c>>>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<<t|m;continue}}t=(e+72|0)+f|0;J=y[t+4>>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<<F|i;h=H>>>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<<M|j;continue}}D=(e+72|0)+f|0;F=y[D+4>>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<p>>>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<l>>>0|(f|0)==(l|0)){break c}f=y[i+8>>2]+(l<<2)|0;n=(te(e,24)&16711935|te(e&16711935,8))<<k;e=y[y[i+16>>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<p>>>0|((j|0)==(l|0)|j>>>0<l>>>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;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}}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<p>>>0|((j|0)==(l|0)|j>>>0<l>>>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<p>>>0){break c}y[i+20>>2]=c-p;y[i+16>>2]=j+t;if(h>>>0<l>>>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]<e>>>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<p>>>0){break c}c=c-p|0;y[i+20>>2]=c;y[i+16>>2]=h+G;if(x){if(c>>>0<A>>>0){break c}y[i+20>>2]=A}if(f>>>0<l>>>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]<e>>>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<<u;if((e|0)!=(r|0)){c=y[f+C>>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<<u;j=y[c>>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<p>>>0){break c}c=c-p|0;y[i+20>>2]=c;y[i+16>>2]=h+G;if(x){if(c>>>0<A>>>0){break c}y[i+20>>2]=A}if(f>>>0<l>>>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<<n;j=te(c,24)&16711935|te(c&16711935,8);c=y[f>>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]<e>>>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<<n;if((e|0)!=(r|0)){c=y[f+C>>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<<n;j=y[c>>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<<h>>>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<l>>>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<i>>>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<i>>>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<j>>>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<h>>>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<<f;e=0}else{e=1<<f;f=e-1&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<<d;e=0}else{e=1<<d;f=e-1&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<<e|j;e=e-1|0;continue}break}if((i|0)==(r|0)){break c}w[i+s|0]=j;i=i+1|0;continue}break}l=q+7|0;h=k<<8;e=0;j=0;while(1){if((e|0)==(J|0)){break h}if(z[b|0]){break b}if(d>>>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<p>>>0|p>>>0>r>>>0)|g-1>>>0<p>>>0){break c}k=z[n|0];F=A[I>>1];K=A[N>>1];D=z[i|0]<<K;g=A[H>>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]<<K;e=7;j=0;while(1){if((e|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<<e|j;e=e-1|0;continue}break}w[l|0]=j;l=l+1|0;continue}break}q=F+7|0;l=k<<8;j=0;e=0;while(1){if((j|0)==(J|0)){break g}if(z[b|0]){break b}if(d>>>0<=g>>>0){break c}h=ka(b,(g<<3)+c|0);i=7-j|0;e=h<<i|e;g=h|(A[B>>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<<g|l;g=g-1|0;continue}break}if(B[a+48>>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<<j|l;i=h|(y[c+16>>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]]<<y[c+20>>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]<<y[c+20>>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<<g|l;g=g-1|0;continue}}l=j<<8;j=k<<8;g=0;f=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}k=ka(h,y[b+8>>2]+(i<<3)|0);h=7-g|0;f=k<<h|f;i=k|(y[c+16>>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<<L|ia(h,w[a+16|0]+g|0,X,W)<<M|p<<A[R>>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<<e|f;e=e-1|0;continue}break}if(B[a+48>>2]<=g>>>0){break c}w[y[a+44>>2]+g|0]=f;g=g+1|0;continue}break}if(g>>>0<i>>>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<<c|f;c=c-1|0;continue}}d=g<<8;c=0;f=0;while(1){if((c|0)!=(p|0)){if(z[h|0]){break b}if(e>>>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)-1&b)<<32-d|f>>>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)-1&d)<<32-c|b>>>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<<d)-1<<32-d}c=c&-2;d=f&31;if(f>>>0>=32){b=c<<d;i=0}else{b=(1<<d)-1&c>>>32-d|b<<d;i=c<<d}d=b;f=0-g&63;c=f;b=c&31;if(c>>>0>=32){b=-1<<b;c=0}else{c=-1<<b;b=c|(1<<b)-1&-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)-1&b)<<32-c|k>>>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)-1&c)<<32-e|d>>>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)-1&c)<<32-g|d>>>g}j=j&63;g=j&31;if(j>>>0>=32){c=d<<g;d=0}else{c=(1<<g)-1&d>>>32-g|c<<g;d=d<<g}if(k){g=e-1|0;j=h-1|0;s=(j|0)!=-1?g+1|0:g;while(1){p=f<<1|n>>>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<q>>>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<<c;break l}c=y[(a<<2)+4960>>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<d>>>0?c:d)<<2)>>2];d=se(g,e,A[a+48>>1]);c=d+s|0;i=Z+t|0;d=c>>>0<d>>>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])<<h;c=c+1|0;continue}}}}}else{ja(f+8|0,y[d>>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<e>>>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<b>>>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<h>>>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]<i>>>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<<q;t=k,u=te(d&16711935,8)|te(d,24)&16711935,y[t>>2]=u}l=l+1|0;continue c}else{m=g<<b;g=y[d>>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<g>>>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<f>>>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<e>>>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<<a;e=0}else{e=1<<a;b=e-1&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<b>>>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<e>>>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<f>>>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<f>>>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<<e;g=0}else{g=1<<e;c=g-1&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<<d;e=0}else{e=1<<d;a=e-1&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<e>>>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<e>>>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<e>>>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<b>>>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<d>>>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<b>>>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<b>>>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<d>>>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<b>>>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<d>>>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<b+f>>>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<d>>>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<g>>>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<d>>>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<c>>>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<<b);y[a+36>>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<e>>>0?d:e;y[b>>2]=y[b>>2]|-1<<c&-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<c>>>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<b>>>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]<d>>>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<d>>>0?c:d;y[a>>2]=y[a>>2]&(-1<<b&-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<d>>>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<b>>>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<<e)+d}else{d=ka(b,y[a>>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<B[a+4>>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<B[a+4>>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<c>>>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&a)>>>c|0;c=a;a=0-b&31;return d|(c&-1>>>a)<<a}function Rd(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)}}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<ba&&ba<65536&&ba<=32768){var ca=new ArrayBuffer(ba<<16);var da=new Int8Array(ca);da.set(w);w=new Int8Array(ca);x=new Int16Array(ca);y=new Int32Array(ca);z=new Uint8Array(ca);A=new Uint16Array(ca);B=new Uint32Array(ca);C=new Float32Array(ca);D=new Float64Array(ca);v=ca;a=z}return aa}return{j:Object.create(Object.prototype,{grow:{value:ea},buffer:{get:function(){return v}}}),k:re,l:Gd,m:ma,n:$d,o:ae,p:Ld}}return ga(ha)}
+// EMSCRIPTEN_END_ASM
+
+
+)(info)},instantiate:function(binary,info){return{then:function(ok){var module=new WebAssembly.Module(binary);ok({instance:new WebAssembly.Instance(module,info)})}}},RuntimeError:Error,isWasm2js:true};if(WebAssembly.isWasm2js){wasmBinary=[]}var ABORT=false;var EXITSTATUS;class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}var readyPromiseResolve,readyPromiseReject;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["k"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(file){}function getBinarySync(file){}function instantiateSync(file,info){var module;var binary=getBinarySync(file);module=new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return[instance,module]}function getWasmImports(){var imports={a:wasmImports};return imports}function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{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<destSize;srcStart+=pitch32,destStart+=pitch8){imageData.set(HEAPU8.subarray(srcStart,srcStart+pitch8),destStart)}}function _setLineData(line_ptr,pitch8,offset){Module.imageData.set(HEAPU8.subarray(line_ptr,line_ptr+pitch8),offset)}var writeArrayToMemory=(array,buffer)=>{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/public/pdfjs/web/wasm/openjpeg.wasm b/public/pdfjs/web/wasm/openjpeg.wasm
new file mode 100644
index 0000000..5acce73
--- /dev/null
+++ b/public/pdfjs/web/wasm/openjpeg.wasm
Binary files differ
diff --git a/public/pdfjs/web/wasm/openjpeg_nowasm_fallback.js b/public/pdfjs/web/wasm/openjpeg_nowasm_fallback.js
new file mode 100644
index 0000000..0df96ae
--- /dev/null
+++ b/public/pdfjs/web/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<g;c+=4){d=b[l.charCodeAt(c+1)];e=b[l.charCodeAt(c+2)];j[f++]=b[l.charCodeAt(c)]<<2|d>>4;if(f<h)j[f++]=d<<4|e>>2;if(f<h)j[f++]=e<<6|b[l.charCodeAt(c+3)]}return j}function m(n){i(a,1024,"Y2Fubm90IGFsbG9jYXRlIG9wal90Y2Rfc2VnX2RhdGFfY2h1bmtfdCogYXJyYXkALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABVbmtub3duIGZvcm1hdABGYWlsZWQgdG8gc2V0dXAgdGhlIHJlZHVjdGlvbiBmYWN0b3IARmFpbGVkIHRvIHNldHVwIHRoZSBkZWNvZGVyAEZhaWxlZCB0byByZWFkIHRoZSBoZWFkZXIAbmFuACpsX3RpbGVfbGVuID4gVUlOVF9NQVggLSBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSAtIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgAaW5mAEZhaWxlZCB0byBkZWNvZGUgdGhlIGltYWdlAEludmFsaWQgYWNjZXNzIHRvIHBpLT5pbmNsdWRlAC90bXAvb3BlbmpwZWcvc3JjL2Jpbi9jb21tb24vY29sb3IuYwBBTExfQ1BVUwBPUEpfTlVNX1RIUkVBRFMATkFOAE9KUF9ET19OT1RfRElTUExBWV9USUxFX0lOREVYX0lGX1RMTQBJTkYAcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA+IFVJTlRfTUFYIC0gT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEACQkJIHByZWNjaW50c2l6ZSAodyxoKT0ACQkJIHN0ZXBzaXplcyAobSxlKT0AU09UIG1hcmtlciBmb3IgdGlsZSAldSBkZWNsYXJlcyBtb3JlIHRpbGUtcGFydHMgdGhhbiBmb3VuZCBpbiBUTE0gbWFya2VyLgAobnVsbCkAKCVkLCVkKSAAJXN9CgAJCSB9CgBbREVWXSBEdW1wIGFuIGltYWdlX2NvbXBfaGVhZGVyIHN0cnVjdCB7CgBbREVWXSBEdW1wIGFuIGltYWdlX2hlYWRlciBzdHJ1Y3QgewoASW1hZ2UgaW5mbyB7CgAJIGRlZmF1bHQgdGlsZSB7CgAlcwkgY29tcG9uZW50ICVkIHsKAAkJIGNvbXAgJWQgewoACSBUaWxlIGluZGV4OiB7CgAJIE1hcmtlciBsaXN0OiB7CgBDb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXI6IHsKAENvZGVzdHJlYW0gaW5mbyBmcm9tIG1haW4gaGVhZGVyOiB7CgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveAoARm91bmQgYSBtaXNwbGFjZWQgJyVjJWMlYyVjJyBib3ggb3V0c2lkZSBqcDJoIGJveAoATWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogZmlyc3QgYm94IG11c3QgYmUgSlBFRyAyMDAwIHNpZ25hdHVyZSBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IHNlY29uZCBib3ggbXVzdCBiZSBmaWxlIHR5cGUgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB3aXRoIEZUWVAgQm94CgBBIG1hcmtlciBJRCB3YXMgZXhwZWN0ZWQgKDB4ZmYtLSkgaW5zdGVhZCBvZiAlLjh4CgAJCSBtY3Q9JXgKAAkJCSBjYmxrc3R5PSUjeAoACQkJIGNzdHk9JSN4CgAJCSBwcmc9JSN4CgBJbnRlZ2VyIG92ZXJmbG93CgAJIHRkeD0ldSwgdGR5PSV1CgAJIHR3PSV1LCB0aD0ldQoACSB0eDA9JXUsIHR5MD0ldQoASW52YWxpZCBjb21wb25lbnQgaW5kZXg6ICV1CgBTdHJlYW0gdG9vIHNob3J0CgBNYXJrZXIgaGFuZGxlciBmdW5jdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgbWFya2VyIHNlZ21lbnQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjdXJyZW50IHByZWNpbmN0IGNvZGVibG9jayBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQKAEVycm9yIHJlYWRpbmcgU1FjZCBvciBTUWNjIGVsZW1lbnQKAEEgQlBDQyBoZWFkZXIgYm94IGlzIGF2YWlsYWJsZSBhbHRob3VnaCBCUEMgZ2l2ZW4gYnkgdGhlIElIRFIgYm94ICglZCkgaW5kaWNhdGUgY29tcG9uZW50cyBiaXQgZGVwdGggaXMgY29uc3RhbnQKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaWxsZWdhbCB0aWxlIG9mZnNldAoASW52YWxpZCBwcmVjaW5jdAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHMKAEZhaWxlZCB0byBkZWNvZGUgYWxsIHVzZWQgY29tcG9uZW50cwoAU2l6ZSBvZiBjb2RlIGJsb2NrIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBTaXplIG9mIHRpbGUgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBNQ1QgbWFya2VycwoAQ29ycnVwdGVkIFBQTSBtYXJrZXJzCgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSByZXNvbHV0aW9ucwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGNvbGxlY3Rpb25zCgBJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zCgBXZSBkbyBub3Qgc3VwcG9ydCBST0kgaW4gZGVjb2RpbmcgSFQgY29kZWJsb2NrcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aG91dCBzYW1lIG51bWJlciBvZiBpbmRpeGVzCgBJbnZhbGlkIHRpbGVjLT53aW5feHh4IHZhbHVlcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgbGVzcyB0aGFuIDggYnl0ZXMKAENhbm5vdCBoYW5kbGUgWEwgYm94IG9mIGxlc3MgdGhhbiAxNiBieXRlcwoAQ29tcG9uZW50IGluZGV4ICV1IHVzZWQgc2V2ZXJhbCB0aW1lcwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAlZCBlbnRyaWVzCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUgbm9kZXMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtY3QgZGF0YSB3aXRoaW4gbXVsdGlwbGUgTUNUIHJlY29yZHMKAENhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yCgBvcGpfajJrX2FwcGx5X25iX3RpbGVfcGFydHNfY29ycmVjdGlvbiBlcnJvcgoAUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yCgBQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAVW5rbm93biBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyCgBFcnJvciByZWFkaW5nIFNPVCBtYXJrZXIKAERpZCBub3QgZ2V0IGV4cGVjdGVkIFNPVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DVCBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIFNPUCBtYXJrZXIKAEV4cGVjdGVkIFNPUCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNPIG1hcmtlcgoARXJyb3IgcmVhZGluZyBSR04gbWFya2VyCgBFcnJvciByZWFkaW5nIFBQTSBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQTE0gbWFya2VyCgBFeHBlY3RlZCBFUEggbWFya2VyCgBOb3QgZW5vdWdoIHNwYWNlIGZvciByZXF1aXJlZCBFUEggbWFya2VyCgBFcnJvciByZWFkaW5nIENSRyBtYXJrZXIKAFVua25vd24gcHJvZ3Jlc3Npb24gb3JkZXIgaW4gQ09EIG1hcmtlcgoAVW5rbm93biBTY29kIHZhbHVlIGluIENPRCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ09EIG1hcmtlcgoARXJyb3IgcmVhZGluZyBRQ0QgbWFya2VyCgBDcnJvciByZWFkaW5nIENCRCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUE9DIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDT0MgbWFya2VyCgBFcnJvciByZWFkaW5nIFFDQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNDIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBNQ0MgbWFya2VyCgByZXF1aXJlZCBTSVogbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoAcmVxdWlyZWQgQ09EIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAHJlcXVpcmVkIFFDRCBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgZmlsZSBoZWFkZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgaGVhZGVyCgBFcnJvciB3aXRoIEpQIFNpZ25hdHVyZSA6IGJhZCBtYWdpYyBudW1iZXIKAEluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRpbGUtcGFydCAoJWQpLCBnaXZpbmcgdXAKAEluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIHByZXZpb3VzIG51bWJlciBvZiB0aWxlLXBhcnQgKCVkKSwgZ2l2aW5nIHVwCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBjdXJyZW50IG51bWJlciBvZiB0aWxlLXBhcnQgKGhlYWRlcikgKCVkKSwgZ2l2aW5nIHVwCgB0aWxlcyByZXF1aXJlIGF0IGxlYXN0IG9uZSByZXNvbHV0aW9uCgBNYXJrZXIgaXMgbm90IGNvbXBsaWFudCB3aXRoIGl0cyBwb3NpdGlvbgoAUHJvYmxlbSB3aXRoIHNlZWsgZnVuY3Rpb24KAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudCwgSW52YWxpZCBjYmxrdy9jYmxraCBjb21iaW5hdGlvbgoASW52YWxpZCBtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtYXRpb24KAENhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyBvdGhlciB0aGFuIGFycmF5IGRlY29ycmVsYXRpb24KAFRvbyBsYXJnZSB2YWx1ZSBmb3IgTnBwbQoATm90IGVub3VnaCBieXRlcyB0byByZWFkIE5wcG0KAGJhZCBwbGFjZWQganBlZyBjb2Rlc3RyZWFtCgAJIE1haW4gaGVhZGVyIHN0YXJ0IHBvc2l0aW9uPSVsbGkKCSBNYWluIGhlYWRlciBlbmQgcG9zaXRpb249JWxsaQoATWFya2VyIHNpemUgaW5jb25zaXN0ZW50IHdpdGggc3RyZWFtIGxlbmd0aAoAVGlsZSBwYXJ0IGxlbmd0aCBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGgKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBkYXRhIHNwYW5uaW5nCgBXcm9uZyBmbGFnCgBFcnJvciB3aXRoIEZUWVAgc2lnbmF0dXJlIEJveCBzaXplCgBFcnJvciB3aXRoIEpQIHNpZ25hdHVyZSBCb3ggc2l6ZQoASW52YWxpZCBwcmVjaW5jdCBzaXplCgBJbmNvbnNpc3RlbnQgbWFya2VyIHNpemUKAEludmFsaWQgbWFya2VyIHNpemUKAEVycm9yIHdpdGggU0laIG1hcmtlciBzaXplCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgYSBuZXcgdmFsaWRhdGlvbiBwcm9jZWR1cmUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGRlY29kZSB0aWxlCgBGYWlsZWQgdG8gZGVjb2RlIHRoZSBjb2Rlc3RyZWFtIGluIHRoZSBKUDIgZmlsZQoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGggaW5kaXggc2h1ZmZsZQoAQ2Fubm90IGFsbG9jYXRlIFRpZXIgMSBoYW5kbGUKAE5vIGRlY29kZWQgYXJlYSBwYXJhbWV0ZXJzLCBzZXQgdGhlIGRlY29kZWQgYXJlYSB0byB0aGUgd2hvbGUgaW1hZ2UKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBUYWctdHJlZQoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVpbml0aWFsaXplIHRoZSB0YWcgdHJlZQoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LCBJbnZhbGlkIHRyYW5zZm9ybWF0aW9uIGZvdW5kCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQuIFVuc3VwcG9ydGVkIE1peGVkIEhUIGNvZGUtYmxvY2sgc3R5bGUgZm91bmQKAFRpbGUgWSBjb29yZGluYXRlcyBhcmUgbm90IHN1cHBvcnRlZAoAVGlsZSBYIGNvb3JkaW5hdGVzIGFyZSBub3Qgc3VwcG9ydGVkCgBJbWFnZSBjb29yZGluYXRlcyBhYm92ZSBJTlRfTUFYIGFyZSBub3Qgc3VwcG9ydGVkCgBKUEVHMjAwMCBIZWFkZXIgYm94IG5vdCByZWFkIHlldCwgJyVjJWMlYyVjJyBib3ggd2lsbCBiZSBpZ25vcmVkCgBvcGpfajJrX21lcmdlX3BwdCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkCgBvcGpfajJrX2J1aWxkX3RwX2luZGV4X2Zyb21fdGxtKCk6IHRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWQKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZAoASWdub3JpbmcgaWhkciBib3guIEZpcnN0IGloZHIgYm94IGFscmVhZHkgcmVhZAoAWnBwdCAldSBhbHJlYWR5IHJlYWQKAFpwcG0gJXUgYWxyZWFkeSByZWFkCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCBzeW50aGVzaXplZCAweEZGIG1hcmtlcnMgcmVhZAoACQkJIGNibGt3PTJeJWQKAAkJCSBjYmxraD0yXiVkCgAJCQkgcW50c3R5PSVkCgAlcyBkeD0lZCwgZHk9JWQKAAkJCSByb2lzaGlmdD0lZAoACQkJIG51bWdiaXRzPSVkCgAJCSBudW1sYXllcnM9JWQKACVzIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGFjbj0lZCwgbnVtY29tcHM9JWQKAG9wal9qcDJfYXBwbHlfY2RlZjogY249JWQsIG51bWNvbXBzPSVkCgAJCQkgbnVtcmVzb2x1dGlvbnM9JWQKAAkJIHR5cGU9JSN4LCBwb3M9JWxsaSwgbGVuPSVkCgAlcyBzZ25kPSVkCgAJCQkgcW1mYmlkPSVkCgAlcyBwcmVjPSVkCgAJCSBuYiBvZiB0aWxlLXBhcnQgaW4gdGlsZSBbJWRdPSVkCgAlcyB4MT0lZCwgeTE9JWQKACVzIHgwPSVkLCB5MD0lZAoARmFpbGVkIHRvIGRlY29kZSB0aWxlICVkLyVkCgBTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWQKAEZhaWxlZCB0byBkZWNvZGUgY29tcG9uZW50ICVkCgBJbnZhbGlkIHZhbHVlIGZvciBudW1yZXNvbHV0aW9ucyA6ICVkLCBtYXggdmFsdWUgaXMgc2V0IGluIG9wZW5qcGVnLmggYXQgJWQKAEludmFsaWQgY29tcG9uZW50IG51bWJlcjogJWQsIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgJWQKAFRvbyBtYW55IFBPQ3MgJWQKAG9wal9qMmtfcmVhZF90bG0oKTogaW52YWxpZCB0aWxlIG51bWJlciAlZAoASW52YWxpZCB0aWxlIG51bWJlciAlZAoASW52YWxpZCB0aWxlIHBhcnQgaW5kZXggZm9yIHRpbGUgbnVtYmVyICVkLiBHb3QgJWQsIGV4cGVjdGVkICVkCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgaWxsZWdhbCAtPiAlZAoATm90IGVub3VnaCBtZW1vcnkgZm9yIGNpZWxhYgoAQ2Fubm90IGFsbG9jYXRlIGNibGstPmRlY29kZWRfZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQVCBkYXRhCgBGYWlsZWQgdG8gbWVyZ2UgUFBNIGRhdGEKAEludmFsaWQgbnVtYmVyIG9mIGxheWVycyBpbiBDT0QgbWFya2VyIDogJWQgbm90IGluIHJhbmdlIFsxLTY1NTM1XQoAJXM6JWQ6Y29sb3JfY215a190b19yZ2IKCUNBTiBOT1QgQ09OVkVSVAoAJXM6JWQ6Y29sb3JfZXN5Y2NfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX3N5Y2NfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKAFN0cmVhbSB0b28gc2hvcnQsIGV4cGVjdGVkIFNPVAoAVW5hYmxlIHRvIHNldCB0MSBoYW5kbGUgYXMgVExTCgBTb3QgbGVuZ3RoIGlzIGxlc3MgdGhhbiBtYXJrZXIgc2l6ZSArIG1hcmtlciBJRAoAU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQwoAQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMgoAb3BqX3BpX25leHRfbHJjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcmxjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfY3BybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcGNybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcnBjbCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3QxX2RlY29kZV9jYmxrKCk6IHVuc3VwcG9ydGVkIGJwbm9fcGx1c19vbmUgPSAlZCA+PSAzMQoARmFpbGVkIHRvIGRlY29kZSB0aWxlIDEvMQoASW5zdWZmaWNpZW50IGRhdGEgZm9yIENNQVAgYm94LgoATmVlZCB0byByZWFkIGEgUENMUiBib3ggYmVmb3JlIHRoZSBDTUFQIGJveC4KAEluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC4KAE51bWJlciBvZiBjaGFubmVsIGRlc2NyaXB0aW9uIGlzIGVxdWFsIHRvIHplcm8gaW4gQ0RFRiBib3guCgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveDogbm8gJ2loZHInIGJveC4KAE5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IGJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAQm94IGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQuCgBSZXNvbHV0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmVzb2x1dGlvbiBpbiB0aGUgY29tcG9uZW50LgoAQ29tcG9uZW50IG1hcHBpbmcgc2VlbXMgd3JvbmcuIFRyeWluZyB0byBjb3JyZWN0LgoAb3BqX2oya19idWlsZF90cF9pbmRleF9mcm9tX3RsbSgpOiB0aWxlICVkIGhhcyBubyByZWdpc3RlcmVkIHRpbGUtcGFydCBpbiBUTE0gbWFya2VyIHNlZ21lbnRzLgoAb3BqX2oya19yZWFkX3RsbSgpOiB0b28gbWFueSBUTE0gbWFya2Vycy4KAG9wal9qMmtfcmVhZF90bG0oKTogY2Fubm90IGFsbG9jYXRlIG1fdGlsZV9wYXJ0X2luZm9zLgoASW5jb21wbGV0ZSBjaGFubmVsIGRlZmluaXRpb25zLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW52YWxpZCBjb2RlYmxvY2sgbGVuZ3RoIHZhbHVlcy4KAFdlIGRvIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAzIGNvZGluZyBwYXNzZXMgaW4gYW4gSFQgY29kZWJsb2NrOyBUaGlzIGNvZGVibG9ja3MgaGFzICVkIHBhc3Nlcy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFRoZXJlIGFyZSAlZCB6ZXJvIGJpdHBsYW5lcyBpbiAlZCBiaXRwbGFuZXMuCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb24gc3RhZ2VzLgoAVW5rbm93biBtYXJrZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGdlbmVyYXRlZCBlcnJvci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfc2V0dXBfZGVjb2RlciBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfcmVhZF9oZWFkZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBFcnJvciByZWFkaW5nIFRMTSBtYXJrZXIuCgBUaWxlcyBkb24ndCBhbGwgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24uIFNraXAgdGhlIE1DVCBzdGVwLgoATnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuCgBKUDIgYm94IHdoaWNoIGFyZSBhZnRlciB0aGUgY29kZXN0cmVhbSB3aWxsIG5vdCBiZSByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBXaGVuIHRoZSBudW1iZXIgb2YgemVybyBwbGFuZXMgYml0cGxhbmVzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYml0cGxhbmVzLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3MgbWFrZXMgc2Vuc2UsIGJ1dCB3ZSBoYXZlICVkIHBhc3NlcyBpbiB0aGlzIGNvZGVibG9jay4gVGhlcmVmb3JlLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3Mgd2lsbCBiZSBkZWNvZGVkLiBUaGlzIG1lc3NhZ2Ugd2lsbCBub3QgYmUgZGlzcGxheWVkIGFnYWluLgoASW1hZ2UgaGFzIGxlc3MgY29tcG9uZW50cyB0aGFuIGNvZGVzdHJlYW0uCgBOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0uCgBQc290IHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbGUtcGFydCBpcyBlcXVhbCB0byB6ZXJvLCB3ZSBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uCgBBIG1hbGZvcm1lZCBjb2RlYmxvY2sgdGhhdCBoYXMgbW9yZSB0aGFuIG9uZSBjb2RpbmcgcGFzcywgYnV0IHplcm8gbGVuZ3RoIGZvciAybmQgYW5kIHBvdGVudGlhbGx5IHRoZSAzcmQgcGFzcyBpbiBhbiBIVCBjb2RlYmxvY2suCgAJCQkgdGlsZS1wYXJ0WyVkXTogc3Rhcl9wb3M9JWxsaSwgZW5kX2hlYWRlcj0lbGxpLCBlbmRfcG9zPSVsbGkuCgBUaWxlICV1IGhhcyBUUHNvdCA9PSAwIGFuZCBUTnNvdCA9PSAwLCBidXQgbm8gb3RoZXIgdGlsZS1wYXJ0cyB3ZXJlIGZvdW5kLiBFT0MgaXMgYWxzbyBtaXNzaW5nLgoAQ29tcG9uZW50ICVkIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuCgBvcGpfajJrX3JlYWRfdGxtKCk6IFRMTSBtYXJrZXIgbm90IG9mIGV4cGVjdGVkIHNpemUuCgBBIGNvbmZvcm1pbmcgSlAyIHJlYWRlciBzaGFsbCBpZ25vcmUgYWxsIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveGVzIGFmdGVyIHRoZSBmaXJzdCwgc28gd2UgaWdub3JlIHRoaXMgb25lLgoAVGhlIHNpZ25hdHVyZSBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlICBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlIGZ0eXAgYm94IG11c3QgYmUgdGhlIHNlY29uZCBib3ggaW4gdGhlIGZpbGUuCgBGYWlsZWQgdG8gZGVjb2RlLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW5jb3JyZWN0IE1FTCBzZWdtZW50IHNlcXVlbmNlLgoAQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS4KAG9wal9qMmtfcmVhZF90bG0oKTogU1QgPSAzIGlzIGludmFsaWQuCgBPbmx5IG9uZSBDTUFQIGJveCBpcyBhbGxvd2VkLgoAV2UgbmVlZCBhbiBpbWFnZSBwcmV2aW91c2x5IGNyZWF0ZWQuCgBJSERSIGJveF9taXNzaW5nLiBSZXF1aXJlZC4KAEpQMkggYm94IG1pc3NpbmcuIFJlcXVpcmVkLgoATm90IHN1cmUgaG93IHRoYXQgaGFwcGVuZWQuCgBNYWluIGhlYWRlciBoYXMgYmVlbiBjb3JyZWN0bHkgZGVjb2RlZC4KAFRpbGUgJWQvJWQgaGFzIGJlZW4gZGVjb2RlZC4KAEhlYWRlciBvZiB0aWxlICVkIC8gJWQgaGFzIGJlZW4gcmVhZC4KAEVtcHR5IFNPVCBtYXJrZXIgZGV0ZWN0ZWQ6IFBzb3Q9JWQuCgBEaXJlY3QgdXNlIGF0ICMlZCBob3dldmVyIHBjb2w9JWQuCgBJbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uOiBmb3IgcGFsZXR0ZSBtYXBwaW5nLCBwY29sWyVkXSBzaG91bGQgYmUgZXF1YWwgdG8gJWQsIGJ1dCBpcyBlcXVhbCB0byAlZC4KAEludmFsaWQgY29tcG9uZW50L3BhbGV0dGUgaW5kZXggZm9yIGRpcmVjdCBtYXBwaW5nICVkLgoASW52YWxpZCB2YWx1ZSBmb3IgY21hcFslZF0ubXR5cCA9ICVkLgoAUHNvdCB2YWx1ZSBpcyBub3QgY29ycmVjdCByZWdhcmRzIHRvIHRoZSBKUEVHMjAwMCBub3JtOiAlZC4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIFZMQyBjb2RlIHByb2R1Y2VzIHNpZ25pZmljYW50IHNhbXBsZXMgb3V0c2lkZSB0aGUgY29kZWJsb2NrIGFyZWEuCgBVbmV4cGVjdGVkIE9PTS4KADMyIGJpdHMgYXJlIG5vdCBlbm91Z2ggdG8gZGVjb2RlIHRoaXMgY29kZWJsb2NrLCBzaW5jZSB0aGUgbnVtYmVyIG9mIGJpdHBsYW5lLCAlZCwgaXMgbGFyZ2VyIHRoYW4gMzAuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBzaG91bGQgYmUgPiAwLgoAUmlnaHQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gxPSVkKSBzaG91bGQgYmUgPiAwLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBzaG91bGQgYmUgPj0gMC4KAExlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBzaG91bGQgYmUgPj0gMC4KAEVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcjogcGFja2V0IGhlYWRlciBoYXZlIGJlZW4gcHJldmlvdXNseSBmb3VuZCBpbiB0aGUgbWFpbiBoZWFkZXIgKFBQTSBtYXJrZXIpLgoAU3RhcnQgdG8gcmVhZCBqMmsgbWFpbiBoZWFkZXIgKCVsbGQpLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWXNpej0lZCkuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlzaXo9JWQpLgoAUmlnaHQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYc2l6PSVkKS4KAExlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYc2l6PSVkKS4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlPc2l6PSVkKS4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLgoAUmlnaHQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuCgBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWE9zaXo9JWQpLgoAU2l6ZSB4IG9mIHRoZSBkZWNvZGVkIGNvbXBvbmVudCBpbWFnZSBpcyBpbmNvcnJlY3QgKGNvbXBbJWRdLnc9JWQpLgoAU2l6ZSB5IG9mIHRoZSBkZWNvZGVkIGNvbXBvbmVudCBpbWFnZSBpcyBpbmNvcnJlY3QgKGNvbXBbJWRdLmg9JWQpLgoAVGlsZSByZWFkLCBkZWNvZGVkIGFuZCB1cGRhdGVkIGlzIG5vdCB0aGUgZGVzaXJlZCBvbmUgKCVkIHZzICVkKS4KAEludmFsaWQgY29tcG9uZW50IGluZGV4ICVkICg+PSAlZCkuCgBvcGpfcmVhZF9oZWFkZXIoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBvcGpfc2V0X2RlY29kZWRfY29tcG9uZW50cygpLgoATWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBpbiBvcGpfanAyX2FwcGx5X3BjbHIoKS4KAGltYWdlLT5jb21wc1slZF0uZGF0YSA9PSBOVUxMIGluIG9wal9qcDJfYXBwbHlfcGNscigpLgoAaW52YWxpZCBib3ggc2l6ZSAlZCAoJXgpCgBGYWlsIHRvIHJlYWQgdGhlIGN1cnJlbnQgbWFya2VyIHNlZ21lbnQgKCUjeCkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogSUhEUiB3KCV1KSBoKCV1KSB2cy4gU0laIHcoJXUpIGgoJXUpCgBFcnJvciByZWFkaW5nIENPQyBtYXJrZXIgKGJhZCBudW1iZXIgb2YgY29tcG9uZW50cykKAEludmFsaWQgbnVtYmVyIG9mIHRpbGVzIDogJXUgeCAldSAobWF4aW11bSBmaXhlZCBieSBqcGVnMjAwMCBub3JtIGlzIDY1NTM1IHRpbGVzKQoASW52YWxpZCBudW1iZXIgb2YgY29tcG9uZW50cyAoaWhkcikKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBpbWFnZSBoZWFkZXIgKGloZHIpCgBXcm9uZyB2YWx1ZXMgZm9yOiB3KCVkKSBoKCVkKSBudW1jb21wcyglZCkgKGloZHIpCgBJbnZhbGlkIHZhbHVlcyBmb3IgY29tcCA9ICVkIDogZHg9JXUgZHk9JXUgKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0pCgBCYWQgaW1hZ2UgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBCYWQgQ09MUiBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEJhZCBCUENDIGhlYWRlciBib3ggKGJhZCBzaXplKQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBuZWdhdGl2ZSBvciB6ZXJvIGltYWdlIHNpemUgKCVsbGQgeCAlbGxkKQoAc2tpcDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZCkKAHJlYWQ6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSB3aXRoIG1heCAoJWQpIGZvciBjb2RlYmxvY2sgJWQgKHA9JWQsIGI9JWQsIHI9JWQsIGM9JWQpCgBEZXNwaXRlIEpQMiBCUEMhPTI1NSwgcHJlY2lzaW9uIGFuZC9vciBzZ25kIHZhbHVlcyBmb3IgY29tcFslZF0gaXMgZGlmZmVyZW50IHRoYW4gY29tcFswXToKICAgICAgICBbMF0gcHJlYyglZCkgc2duZCglZCkgWyVkXSBwcmVjKCVkKSBzZ25kKCVkKQoAYmFkIGNvbXBvbmVudCBudW1iZXIgaW4gUkdOICglZCB3aGVuIHRoZXJlIGFyZSBvbmx5ICVkKQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHJlbWFpbmluZyBudW1iZXIgb2YgcGFyYW1ldGVycyAoICVkIHZzICVkKQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBpbnZhbGlkIHRpbGUgc2l6ZSAodGR4OiAlZCwgdGR5OiAlZCkKAEJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplOiAlZCkKAEJhZCBDT0xSIGhlYWRlciBib3ggKENJRUxhYiwgYmFkIHNpemU6ICVkKQoAUFRFUk0gY2hlY2sgZmFpbHVyZTogJWQgcmVtYWluaW5nIGJ5dGVzIGluIGNvZGUgYmxvY2sgKCVkIHVzZWQgLyAlZCkKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIE9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBpcyBub3QgbWV0OiAyIDw9IFNjdXAgPD0gbWluKExjdXAsIDQwNzkpCgBJbnZhbGlkIHZhbHVlcyBmb3IgY29tcCA9ICVkIDogcHJlYz0ldSAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMzggYWNjb3JkaW5nIHRvIHRoZSBKUEVHMjAwMCBub3JtLiBPcGVuSnBlZyBvbmx5IHN1cHBvcnRzIHVwIHRvIDMxKQoASW52YWxpZCBiaXQgbnVtYmVyICVkIGluIG9wal90Ml9yZWFkX3BhY2tldF9oZWFkZXIoKQoAU3RyZWFtIGVycm9yIQoARXJyb3Igb24gd3JpdGluZyBzdHJlYW0hCgBTdHJlYW0gcmVhY2hlZCBpdHMgZW5kICEKAEV4cGVjdGVkIGEgU09DIG1hcmtlciAKAEludmFsaWQgYm94IHNpemUgJWQgZm9yIGJveCAnJWMlYyVjJWMnLiBOZWVkICVkIGJ5dGVzLCAlZCBieXRlcyByZW1haW5pbmcgCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBVX3EgaXMgbGFyZ2VyIHRoYW4gemVybyBiaXRwbGFuZXMgKyAxIAoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gRGVjb2RpbmcgdGhpcyBjb2RlYmxvY2sgaXMgc3RvcHBlZC4gVV9xIGlzbGFyZ2VyIHRoYW4gYml0cGxhbmVzICsgMSAKAENPTFIgQk9YIG1ldGggdmFsdWUgaXMgbm90IGEgcmVndWxhciB2YWx1ZSAoJWQpLCBzbyB3ZSB3aWxsIGlnbm9yZSB0aGUgZW50aXJlIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveC4gCgBXaGlsZSByZWFkaW5nIENDUF9RTlRTVFkgZWxlbWVudCBpbnNpZGUgUUNEIG9yIFFDQyBtYXJrZXIgc2VnbWVudCwgbnVtYmVyIG9mIHN1YmJhbmRzICglZCkgaXMgZ3JlYXRlciB0byBPUEpfSjJLX01BWEJBTkRTICglZCkuIFNvIHdlIGxpbWl0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkIHRvIE9QSl9KMktfTUFYQkFORFMgKCVkKSBhbmQgc2tpcCB0aGUgcmVzdC4gCgBKUDIgSUhEUiBib3g6IGNvbXByZXNzaW9uIHR5cGUgaW5kaWNhdGUgdGhhdCB0aGUgZmlsZSBpcyBub3QgYSBjb25mb3JtaW5nIEpQMiBmaWxlICglZCkgCgBUaWxlIGluZGV4IHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGlzIGluY29ycmVjdCAlZCAobWF4ID0gJWQpIAoARXJyb3IgZGVjb2RpbmcgY29tcG9uZW50ICVkLgpUaGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIHRvIHJlbW92ZSAoJWQpIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIG9mIHRoaXMgY29tcG9uZW50ICglZCkKTW9kaWZ5IHRoZSBjcF9yZWR1Y2UgcGFyYW1ldGVyLgoKAEltYWdlIGRhdGEgaGFzIGJlZW4gdXBkYXRlZCB3aXRoIHRpbGUgJWQuCgo=");i(a,16656,"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");i(a,20764,"AQAAAAEAAAABAAAAAgAAAAIAAAACAAAAAwAAAAMAAAAEAAAABQAAALchQiFnIUIhERERETMzMzN3d3d3AAAAAAAAAAABVgAAAAAAAIBRAACQUQAAAVYAAAEAAACQUQAAgFEAAAE0AAAAAAAAoFEAACBSAAABNAAAAQAAALBRAAAwUgAAARgAAAAAAADAUQAAgFIAAAEYAAABAAAA0FEAAJBSAADBCgAAAAAAAOBRAADgUgAAwQoAAAEAAADwUQAA8FIAACEFAAAAAAAAAFIAAABVAAAhBQAAAQAAABBSAAAQVQAAIQIAAAAAAAAgVgAAgFUAACECAAABAAAAMFYAAJBVAAABVgAAAAAAAEBSAAAwUgAAAVYAAAEAAABQUgAAIFIAAAFUAAAAAAAAYFIAACBTAAABVAAAAQAAAHBSAAAwUwAAAUgAAAAAAACAUgAAIFMAAAFIAAABAAAAkFIAADBTAAABOAAAAAAAAKBSAAAgUwAAATgAAAEAAACwUgAAMFMAAAEwAAAAAAAAwFIAAIBTAAABMAAAAQAAANBSAACQUwAAASQAAAAAAADgUgAAoFMAAAEkAAABAAAA8FIAALBTAAABHAAAAAAAAABTAADgUwAAARwAAAEAAAAQUwAA8FMAAAEWAAAAAAAAAFUAAABUAAABFgAAAQAAABBVAAAQVAAAAVYAAAAAAABAUwAAMFMAAAFWAAABAAAAUFMAACBTAAABVAAAAAAAAGBTAAAgUwAAAVQAAAEAAABwUwAAMFMAAAFRAAAAAAAAgFMAAEBTAAABUQAAAQAAAJBTAABQUwAAAUgAAAAAAACgUwAAYFMAAAFIAAABAAAAsFMAAHBTAAABOAAAAAAAAMBTAACAUwAAATgAAAEAAADQUwAAkFMAAAE0AAAAAAAA4FMAAKBTAAABNAAAAQAAAPBTAACwUwAAATAAAAAAAAAAVAAAwFMAAAEwAAABAAAAEFQAANBTAAABKAAAAAAAACBUAADAUwAAASgAAAEAAAAwVAAA0FMAAAEkAAAAAAAAQFQAAOBTAAABJAAAAQAAAFBUAADwUwAAASIAAAAAAABgVAAAAFQAAAEiAAABAAAAcFQAABBUAAABHAAAAAAAAIBUAAAgVAAAARwAAAEAAACQVAAAMFQAAAEYAAAAAAAAoFQAAEBUAAABGAAAAQAAALBUAABQVAAAARYAAAAAAADAVAAAYFQAAAEWAAABAAAA0FQAAHBUAAABFAAAAAAAAOBUAACAVAAAARQAAAEAAADwVAAAkFQAAAESAAAAAAAAAFUAAKBUAAABEgAAAQAAABBVAACwVAAAAREAAAAAAAAgVQAAwFQAAAERAAABAAAAMFUAANBUAADBCgAAAAAAAEBVAADgVAAAwQoAAAEAAABQVQAA8FQAAMEJAAAAAAAAYFUAAABVAADBCQAAAQAAAHBVAAAQVQAAoQgAAAAAAACAVQAAIFUAAKEIAAABAAAAkFUAADBVAAAhBQAAAAAAAKBVAABAVQAAIQUAAAEAAACwVQAAUFUAAEEEAAAAAAAAwFUAAGBVAABBBAAAAQAAANBVAABwVQAAoQIAAAAAAADgVQAAgFUAAKECAAABAAAA8FUAAJBVAAAhAgAAAAAAAABWAACgVQAAIQIAAAEAAAAQVgAAsFUAAEEBAAAAAAAAIFYAAMBVAABBAQAAAQAAADBWAADQVQAAEQEAAAAAAABAVgAA4FUAABEBAAABAAAAUFYAAPBVAACFAAAAAAAAAGBWAAAAVgAAhQAAAAEAAABwVgAAEFYAAEkAAAAAAAAAgFYAACBWAABJAAAAAQAAAJBWAAAwVgAAJQAAAAAAAACgVgAAQFYAACUAAAABAAAAsFYAAFBWAAAVAAAAAAAAAMBWAABgVgAAFQAAAAEAAADQVgAAcFYAAAkAAAAAAAAA4FYAAIBWAAAJAAAAAQAAAPBWAACQVgAABQAAAAAAAAAAVwAAoFYAAAUAAAABAAAAEFcAALBWAAABAAAAAAAAAABXAADAVgAAAQAAAAEAAAAQVwAA0FYAAAFWAAAAAAAAIFcAACBXAAABVgAAAQAAADBXAAAwVwAAAAEDAwECAwMFBgcHBgYHBwABAwMBAgMDBQYHBwYGBwcFBgcHBgYHBwgICAgICAgIBQYHBwYGBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgCAgMDAgIDAwYGBwcGBgcHAgIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgAAQUGAQIGBgMDBwcDAwcHAAEFBgECBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwUGCAgGBggIBwcICAcHCAgFBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwICBgYCAgYGAwMHBwMDBwcCAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAMBBAMGBAcBBAIFBAcFBwADAQQDBgQHAQQCBQQHBQcBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgGCAcICAgICAcIBwgICAgIBggHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgJCQoKCQkKCgwMDQsMDA0LCQkKCgkJCgoMDAsNDAwLDQwMDQ0MDAsLDAkNCgkMCgsMDAsLDAwNDQwJCwoJDAoNCQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQoKCgoKCgoKDQsNCw0LDQsKCgkJCgoJCQ0LDAwNCwwMDQ0NDQsLCwsNCg0KCgsKCw0NDAwLCwwMDQoMCQoLCQwKCgkJCgoJCQsNDAwLDQwMCgoKCgoKCgoLDQsNCw0LDQsLDAwNDQwMCwoMCQoNCQwLCwsLDQ0NDQsKCwoKDQoN");i(a,24649,"AQABAAEAAQAAAQEAAAEBAAEAAQABAAEAAAAAAQEBAQAAAAAAAQABAAAAAAEBAQEAAAABAAEBAQ==");i(a,24713,"AQABAAEAAQAAAQEAAAEBAAEAAQABAAEAAAAAAQEBAQAAAAAAAQABAAAAAAEBAQEAAAABAAEBAQ==");i(a,24777,"AQABAAEAAQ==");i(a,24793,"AQABAAEAAQAAAAABAQEBAAAAAAABAAEAAAAAAQEBAQAAAAAAAQABAQEAAAEBAAAAAQABAAEAAQEBAQEBAQEBAAEAAQABAAEAAAAAAQEBAQABAAABAQABAAAAAAEBAQEAAQABAQEBAQIAAAAEAAAABAAAAAgAAACQ/wAADAAAABkAAABS/wAAFAAAABoAAABT/wAAFAAAABsAAABe/wAAFAAAABwAAABc/wAAFAAAAB0AAABd/wAAFAAAAB4AAABf/wAAFAAAAB8AAABR/wAAAgAAACAAAABV/wAABAAAACEAAABX/wAABAAAACIAAABY/wAAEAAAACMAAABg/wAABAAAACQAAABh/wAAEAAAACUAAACR/w==");i(a,25080,"Y/8AAAQAAAAmAAAAZP8AABQAAAAnAAAAdP8AABQAAAAoAAAAeP8AAAQAAAApAAAAUP8AAAQAAAAqAAAAWf8AAAQAAAArAAAAdf8AABQAAAAsAAAAd/8AABQAAAAtAAAAAAAAABQ=");i(a,25200,"LgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAAgIFBqNwAAAHB5dGY4AAAAaDJwajk=");i(a,25264,"cmRoaToAAABybG9jOwAAAGNjcGI8AAAAcmxjcD0AAABwYW1jPgAAAGZlZGM/AAAAAAAAAGoAAABqAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAAagAAAGoAAABrAAAAagAAAGoAAABqAAAAag==");i(a,25408,"awAAAGsAAABqAAAAagAAAAAAAABqAAAAAAAAAGs=");i(a,25572,"aGY=");i(a,25584,"GQALABkZGQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAAZAAoKGRkZAwoHAAEACQsYAAAJBgsAAAsABhkAAAAZGRk=");i(a,25665,"DgAAAAAAAAAAGQALDRkZGQANAAACAAkOAAAACQAOAAAO");i(a,25723,"DA==");i(a,25735,"EwAAAAATAAAAAAkMAAAAAAAMAAAM");i(a,25781,"EA==");i(a,25793,"DwAAAAQPAAAAAAkQAAAAAAAQAAAQ");i(a,25839,"Eg==");i(a,25851,"EQAAAAARAAAAAAkSAAAAAAASAAASAAAaAAAAGhoa");i(a,25906,"GgAAABoaGgAAAAAAAAk=");i(a,25955,"FA==");i(a,25967,"FwAAAAAXAAAAAAkUAAAAAAAUAAAU");i(a,26013,"Fg==");i(a,26025,"FQAAAAAVAAAAAAkWAAAAAAAWAAAWAAAwMTIzNDU2Nzg5QUJDREVG");i(a,26064,"IHABAAAAAAAF");i(a,26084,"bA==");i(a,26108,"bQAAAG4AAADIaw==");i(a,26132,"Ag==");i(a,26148,"//////////8=");i(a,26216,"BQ==");i(a,26228,"bw==");i(a,26252,"bQAAAHAAAADYawAAAAQ=");i(a,26276,"AQ==");i(a,26292,"/////wo=")}var o=new ArrayBuffer(16);var p=new Int32Array(o);var q=new Float32Array(o);var r=new Float64Array(o);function s(t){return p[t]}function u(t,v){p[t]=v}function w(){return r[0]}function x(v){r[0]=v}function y(z,v,A){z=z>>>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<K[C+52>>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<P>>>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<p>>>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<<o;b=0}else{m=(1<<o)-1&j>>>32-o|q<<o;b=j<<o}n=b|g;b=m|r;q=b;H[k+264>>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<<r;b=0}else{o=(1<<r)-1&h>>>32-r|q<<r;b=h<<r}n=b|g;b=m|o;q=b;H[k+264>>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<<h;g=0}else{E=(1<<h)-1&j>>>32-h|q<<h;g=j<<h}n=g|b;b=o|E;q=b;H[k+264>>2]=n;H[k+268>>2]=b}b=n;c=64-c|0;g=c&31;if((c&63)>>>0>=32){w=b<<g;b=0}else{w=(1<<g)-1&b>>>32-g|q<<g;b=b<<g}H[k+264>>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<r>>>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<<j;j=0}else{E=(1<<j)-1&g>>>32-j;j=g<<j}n=j|n;H[k+232>>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<<i|o|u<<i-8;i=i-16|0;g=g+2|0;if((r|0)!=(g|0)){continue}break}if(!E){break G}}H[k+224>>2]=b-1;b=I[b|0];H[k+244>>2]=j-1;o=b<<i|o;break G}H[k+244>>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<<g|o>>>24|j<<c|u<<b;c=h&31;if((h&63)>>>0>=32){o=b<<c;b=0}else{o=(1<<c)-1&b>>>32-c;b=b<<c}H[k+232>>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<<b;b=0}else{m=(1<<b)-1&o>>>32-b;b=o<<b}q=b|n;H[k+136>>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<<b;b=0}else{E=(1<<b)-1&aa>>>32-b;b=aa<<b}n=b|q;b=m|E;q=b;H[k+136>>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<<c;c=0}else{w=(1<<c)-1&o>>>32-c;c=o<<c}n=c|n;c=q|w;q=c;H[k+136>>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<<c|g;h=i>>>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<<i|g>>>24|j<<c|h<<b;c=l&31;if((l&63)>>>0>=32){m=b<<c;b=0}else{m=(1<<c)-1&b>>>32-c;b=b<<c}H[k+136>>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)<<Z;H[l>>2]=p;E=h&16;b=h>>>5&7|E>>>4;o=i;i=h&7;z=o-i|0;n=((1<<i)-1&q)<<32-i|n>>>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)-1&q)<<32-b|n>>>b;q=q>>>b|0;o=n;b=i>>>4&1|i>>>5&7}H[l>>2]=p|(i<<2&768|i&48)<<Z+4;p=i>>>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<<w^-1)&o>>>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<<o^-1)&m>>>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<<w^-1));o=r>>>2&7;H[k+124>>2]=(((-1<<o^-1)&m>>>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<<w^-1))+(o>>>5|0)|0)+3;o=r>>>2&7;H[k+124>>2]=(((-1<<o^-1)&m>>>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)-1&q)<<32-m|n>>>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)-1&m)<<32-r|q>>>r}H[k+200>>2]=q;H[k+204>>2]=o;T=(n&(-1<<p^-1)|(h>>>8&1)<<p|1)+2<<P|n<<31;break V}T=0;if(!(x&1)){break U}}H[c>>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)-1&m)<<32-r|q>>>r}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<<p^-1)|(h>>>9&1)<<p|1;H[(A<<2)+c>>2]=q+2<<P|n<<31;n=32-Q(q)|0;q=I[j|0]&127;F[j|0]=(n>>>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)-1&m)<<32-E|q>>>E}H[k+200>>2]=q;H[k+204>>2]=o;q=(n&(-1<<r^-1)|(h>>>10&1)<<r|1)+2<<P|n<<31;break Y}q=0;if(!(x&4)){break X}}H[p>>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)-1&m)<<32-E|q>>>E}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<<r^-1)|(h>>>11&1)<<r|1;H[p+(A<<2)>>2]=q+2<<P|n<<31;F[j+1|0]=-96-Q(q);break Z}if(!(x&8)){break Z}H[p+(A<<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)-1&h)<<32-r|q>>>r}H[k+200>>2]=q;H[k+204>>2]=o;p=(n&(-1<<p^-1)|(i>>>8&1)<<p|1)+2<<P|n<<31;break $}p=0;if(!(x&16)){break _}}H[m>>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)-1&h)<<32-r|q>>>r}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<<p^-1)|(i>>>9&1)<<p|1;H[m+(A<<2)>>2]=q+2<<P|n<<31;n=32-Q(q)|0;q=I[j+1|0]&127;F[j+1|0]=(n>>>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)-1&h)<<32-r|q>>>r}H[k+200>>2]=q;H[k+204>>2]=o;p=(n&(-1<<p^-1)|(i>>>10&1)<<p|1)+2<<P|n<<31;break ca}p=0;if(!(x&64)){break ba}}H[m>>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)-1&h)<<32-r|q>>>r}H[k+200>>2]=q;H[k+204>>2]=o;i=n&(-1<<p^-1)|(i>>>11&1)<<p|1;H[m+(A<<2)>>2]=i+2<<P|n<<31;F[j|0]=-96-Q(i);break da}if(x>>>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<<b;W=1<<b;ea=(A+7>>>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)<<Z;H[b>>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)-1&q)<<32-i|n>>>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)-1&q)<<32-o|n>>>o;p=n;q=q>>>o|0}H[b>>2]=l|(i<<2&768|i&48)<<Z+4;o=1;l=1;ha:{ia:{ja:{z=i>>>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<<w^-1)&v>>>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<<p^-1))+(v>>>5|0)|0)+1|0;o=(((-1<<m^-1)&o>>>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)-1&q)<<32-m|n>>>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)-1&m)<<32-z|q>>>z}H[k+200>>2]=q;H[k+204>>2]=w;x=(n&(-1<<x^-1)|(h>>>8&1)<<x|1)+2<<da|n<<31;break la}x=0;if(!(P&1)){break ka}}H[j>>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)-1&m)<<32-z|q>>>z}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<<x^-1)|(h>>>9&1)<<x|1;H[(A<<2)+j>>2]=q+2<<da|n<<31;n=32-Q(q)|0;q=I[c|0]&127;F[c|0]=(n>>>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)-1&m)<<32-U|q>>>U}H[k+200>>2]=q;H[k+204>>2]=w;m=(n&(-1<<z^-1)|(h>>>10&1)<<z|1)+2<<da|n<<31;break oa}m=0;if(!(P&4)){break na}}H[x>>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)-1&m)<<32-z|q>>>z}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<<l^-1)|(h>>>11&1)<<l|1;H[x+(A<<2)>>2]=q+2<<da|n<<31;F[c+1|0]=-96-Q(q);break pa}if(!(P&8)){break pa}H[x+(A<<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)-1&h)<<32-x|q>>>x}H[k+200>>2]=q;H[k+204>>2]=w;l=(n&(-1<<l^-1)|(i>>>8&1)<<l|1)+2<<da|n<<31;break ra}l=0;if(!(P&16)){break qa}}H[m>>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)-1&h)<<32-x|q>>>x}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<<l^-1)|(i>>>9&1)<<l|1;H[m+(A<<2)>>2]=q+2<<da|n<<31;n=32-Q(q)|0;q=I[c+1|0]&127;F[c+1|0]=(n>>>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)-1&h)<<32-x|q>>>x}H[k+200>>2]=q;H[k+204>>2]=w;l=(n&(-1<<l^-1)|(i>>>10&1)<<l|1)+2<<da|n<<31;break ua}l=0;if(!(P&64)){break ta}}H[m>>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)-1&o)<<32-l|q>>>l}H[k+200>>2]=o;H[k+204>>2]=w;i=n&(-1<<h^-1)|(i>>>11&1)<<h|1;H[m+(A<<2)>>2]=i+2<<da|n<<31;F[c|0]=-96-Q(i);break va}if(P>>>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)<<da;i=i>>>1|0}if(j&n<<1){b=(A<<2)+h|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<<da;i=i>>>1|0}if(j&n<<2){b=h+ma|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<<da;i=i>>>1|0}if(!(j&n<<3)){break Ca}b=h+la|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<<da;i=i>>>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)-1&c)<<32-i|b>>>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<<w;l=p;while(1){Ea:{if(!(c&l)){break Ea}v=l&286331153;if(v&c){if(i&1){j=j|v;c=M&50<<(o<<2)|c}h=h+1|0;i=i>>>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)-1&o)<<32-l|i>>>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<<sa-2;j=ha+(N(A,$&16777212)<<2)|0;q=$&4?fa:s;n=N(A,12);g=A<<3;l=sa-1|0;E=0;while(1){i=lb(k+128|0);h=0;u=H[q>>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)<<l;i=i>>>1|0}if(u&m<<1){b=(A<<2)+h|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<<l;i=i>>>1|0}if(u&m<<2){b=h+g|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<<l;i=i>>>1|0}if(!(u&m<<3)){break Ia}b=h+n|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<<l;i=i>>>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)-1&c)<<32-i|b>>>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<<sa-2;X=(A|0)<=0;while(1){g=$-b|0;c=g-1|0;Ja:{Ka:{La:{if(c>>>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<<E;l=P;while(1){Na:{if(!(c&l)){break Na}U=l&286331153;if(U&c){if(i&1){j=j|U;c=v&50<<(o<<2)|c}h=h+1|0;i=i>>>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)-1&o)<<32-e|i>>>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<K[C+52>>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<<z;m=b>>>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<<o;H[b>>2]=H[b>>2]|(i<<19|16)<<o;H[b+4>>2]=H[b+4>>2]|8<<o;if(!(t|P)){c=(-2-k<<2)+b|0;H[c+4>>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<<o;H[b>>2]=j;c=H[f+128>>2]}i=c;t=t+1|0;if(t>>>0<c-l>>>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<<z;s=b>>>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<g>>>0){n=H[i+4>>2];c=b>>>0<g>>>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<g>>>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<g>>>0){h=H[c+4>>2];i=b>>>0<g>>>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<g>>>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<g>>>0){h=H[c+4>>2];i=c;c=b>>>0<g>>>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<g>>>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<g>>>0){h=H[n+4>>2];v=c;c=b>>>0<g>>>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<g>>>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<g>>>0){h=H[n+4>>2];v=c;c=b>>>0<g>>>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<g>>>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<c>>>0){h=H[l+4>>2];v=i;i=b>>>0<c>>>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<c>>>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<c>>>0){h=H[n+4>>2];v=i;i=b>>>0<c>>>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<c>>>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<c>>>0){h=H[l+4>>2];v=i;i=b>>>0<c>>>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<c>>>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<c>>>0){h=H[m+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){h=H[m+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[p+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[l+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[p+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[l+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[p+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[l+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){h=H[t+4>>2];n=b>>>0<c>>>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<c>>>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<<z;M=b>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<H[f+128>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<c>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<g>>>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<H[f+128>>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<g>>>0){n=H[i+4>>2];c=b>>>0<g>>>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<g>>>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<g>>>0){h=H[c+4>>2];i=b>>>0<g>>>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<g>>>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<g>>>0){h=H[c+4>>2];i=c;c=b>>>0<g>>>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<g>>>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<g>>>0){h=H[n+4>>2];v=c;c=b>>>0<g>>>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<g>>>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<g>>>0){h=H[n+4>>2];v=c;c=b>>>0<g>>>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<g>>>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<c>>>0){h=H[l+4>>2];v=i;i=b>>>0<c>>>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<c>>>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<c>>>0){h=H[n+4>>2];v=i;i=b>>>0<c>>>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<c>>>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<c>>>0){h=H[l+4>>2];v=i;i=b>>>0<c>>>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<c>>>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<c>>>0){h=H[m+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){h=H[m+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[p+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[l+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[p+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[l+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[p+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){m=H[l+4>>2];n=b>>>0<c>>>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<c>>>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<c>>>0){h=H[t+4>>2];n=b>>>0<c>>>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<c>>>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<b>>>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<b>>>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<b>>>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<b>>>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<<z>>>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<<d&e)==16<<d){n=(N(t,u)<<2)+g|0;c=H[f>>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<<d;H[b>>2]=e;c=H[f+128>>2]}t=t+1|0;d=c;if(t>>>0<c-j>>>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<<z>>>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<c>>>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<c>>>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<c>>>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<c>>>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<<z>>>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&t)==16<<l){j=(N(e,w)<<2)+d|0;b=t>>>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<b>>>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<<l;H[h>>2]=t;c=H[f+128>>2]}e=e+1|0;b=c;if(e>>>0<b-o>>>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<<z;i=b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<<z;k=b>>>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<b-i>>>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<b-i>>>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<b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<b>>>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<K[C+44>>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<v>>>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<K[A+16>>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<v>>>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<q>>>0|k>>>0<v>>>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<<g;s=0}else{s=1<<g;l=s-1&1>>>32-g}g=t+s|0;j=l+J|0;w=g>>>0<t>>>0?j+1|0:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<<j)-1&w)<<32-j|g>>>j}H[v+148>>2]=g;g=l+R|0;V=g+1|0;j=g;g=s+Z|0;w=g>>>0<s>>>0?V:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<<j)-1&w)<<32-j|g>>>j}H[v+144>>2]=g;g=l+S|0;V=g+1|0;j=g;g=s+x|0;w=g>>>0<x>>>0?V:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<<j)-1&w)<<32-j|g>>>j}H[v+140>>2]=g;g=l+z|0;j=s+Y|0;s=j>>>0<Y>>>0?g+1|0:g;g=q&31;if((q&63)>>>0>=32){g=s>>>g|0}else{g=((1<<g)-1&s)<<32-g|j>>>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<r>>>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<o>>>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<n>>>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<h>>>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<M>>>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<<h;H[t+4>>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<<h;H[t>>2]=h>>>0>j>>>0?j:h}h=0;k=b&31;if((b&63)>>>0>=32){l=1<<k;j=0}else{j=1<<k;l=j-1&1>>>32-k}ea=j;j=ba+ea|0;k=l;l=oa+k|0;A=j>>>0<ba>>>0?l+1|0:l;z=b&31;l=M&31;if((M&63)>>>0>=32){l=1<<l;V=0}else{V=1<<l;l=V-1&1>>>32-l}if((b&63)>>>0>=32){A=A>>>z|0}else{A=((1<<z)-1&A)<<32-z|j>>>z}j=V+A|0;ma=j-1|0;l=(j>>>0<V>>>0?l+1|0:l)-!j|0;j=M&31;z=k+ia|0;V=ga+ea|0;z=V>>>0<ga>>>0?z+1|0:z;if((M&63)>>>0>=32){j=l>>>j|0}else{j=((1<<j)-1&l)<<32-j|ma>>>j}l=j;j=b&31;if((b&63)>>>0>=32){j=z>>>j|0}else{j=((1<<j)-1&z)<<32-j|V>>>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<aa>>>0?l:V;M=b&31;l=W&31;if((W&63)>>>0>=32){l=1<<l;V=0}else{V=1<<l;l=V-1&1>>>32-l}if((b&63)>>>0>=32){A=A>>>M|0}else{A=((1<<M)-1&A)<<32-M|j>>>M}j=V+A|0;ma=j-1|0;l=(j>>>0<V>>>0?l+1|0:l)-!j|0;j=W&31;k=k+ha|0;ea=C+ea|0;M=ea>>>0<C>>>0?k+1|0:k;k=b&31;if((W&63)>>>0>=32){j=l>>>j|0}else{j=((1<<j)-1&l)<<32-j|ma>>>j}if((b&63)>>>0>=32){k=M>>>k|0}else{k=((1<<k)-1&M)<<32-k|ea>>>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<K[s+4>>2]){continue}break}}p=p+52|0;s=s+1080|0;r=r+1|0;if(r>>>0<K[m+16>>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<K[h+24>>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<b+u>>>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<k>>>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<j>>>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<u>>>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<u>>>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<N(H[g+20>>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<N(h,p)>>>0){continue}break}}k=k+1|0;b=H[q+20>>2];v=H[q+16>>2];if(k>>>0<N(b,v)>>>0){continue}break}p=H[q+24>>2]}r=r+1|0;if(r>>>0<p>>>0){continue}break}b=H[C+24>>2]}A=A+1|0;if(A>>>0<b>>>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<K[s+16>>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<l>>>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<<b;g=0}else{g=-1<<b;l=g|(1<<b)-1&-1>>>32-b}b=i+(g^-1)|0;g=l^-1;i=b>>>0<J>>>0?g+1|0:g;g=r&31;if((r&63)>>>0>=32){g=i>>>g|0}else{g=((1<<g)-1&i)<<32-g|b>>>g}}if(W){b=r&31;if((r&63)>>>0>=32){l=-1<<b;i=0}else{i=-1<<b;l=i|(1<<b)-1&-1>>>32-b}b=W+(i^-1)|0;i=l^-1;h=b>>>0<W>>>0?i+1|0:i;i=r&31;if((r&63)>>>0>=32){q=h>>>i|0}else{q=((1<<i)-1&h)<<32-i|b>>>i}}h=0;b=0;if(M){b=r&31;if((r&63)>>>0>=32){l=-1<<b;i=0}else{i=-1<<b;l=i|(1<<b)-1&-1>>>32-b}b=M+(i^-1)|0;i=l^-1;n=b>>>0<M>>>0?i+1|0:i;i=r&31;if((r&63)>>>0>=32){b=n>>>i|0}else{b=((1<<i)-1&n)<<32-i|b>>>i}}if(w){i=r&31;if((r&63)>>>0>=32){l=-1<<i;h=0}else{h=-1<<i;l=h|(1<<i)-1&-1>>>32-i}i=w+(h^-1)|0;h=l^-1;n=i>>>0<w>>>0?h+1|0:h;h=r&31;if((r&63)>>>0>=32){h=n>>>h|0}else{h=((1<<h)-1&n)<<32-h|i>>>h}}fa=0;i=0;E=1<<r-1;if(E>>>0<J>>>0){i=r&31;if((r&63)>>>0>=32){l=-1<<i;n=0}else{n=-1<<i;l=n|(1<<i)-1&-1>>>32-i}n=n^-1;i=n+(J-E|0)|0;j=l^-1;j=i>>>0<n>>>0?j+1|0:j;n=r&31;if((r&63)>>>0>=32){i=j>>>n|0}else{i=((1<<n)-1&j)<<32-n|i>>>n}}if(E>>>0<M>>>0){n=r&31;if((r&63)>>>0>=32){l=-1<<n;j=0}else{j=-1<<n;l=j|(1<<n)-1&-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)-1&l)<<32-j|n>>>j}}n=0;t=0;if(E>>>0<W>>>0){j=r&31;if((r&63)>>>0>=32){l=-1<<j;t=0}else{t=-1<<j;l=t|(1<<j)-1&-1>>>32-j}t=t^-1;j=t+(W-E|0)|0;l=l^-1;t=j>>>0<t>>>0?l+1|0:l;l=r&31;if((r&63)>>>0>=32){t=t>>>l|0}else{t=((1<<l)-1&t)<<32-l|j>>>l}}if(w>>>0<=E>>>0){break fa}n=r&31;if((r&63)>>>0>=32){l=-1<<n;j=0}else{j=-1<<n;l=j|(1<<n)-1&-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)-1&l)<<32-j|n>>>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<da>>>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<m>>>0?b:m;b=(pa?la:ia)<<1;r=(pa?ia:la)<<1|1;va=b>>>0>r>>>0?b:r;b=va>>>0<R>>>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<l>>>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<u>>>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<ka>>>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<E>>>0&q>>>0<=x>>>0|x>>>0<kb>>>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<Z>>>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<h>>>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<wa>>>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<h>>>0?h:g;b=H[b+164>>2]-H[b+156>>2]|0;h=b>>>0<g>>>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<q>>>0){continue}break}break Ka}g=q>>>3|0;m=g>>>0<M>>>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<ea>>>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<h>>>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<<i;h=0}else{h=-1<<i;l=h|(1<<i)-1&-1>>>32-i}i=Y+(h^-1)|0;h=l^-1;n=i>>>0<Y>>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){o=n>>>h|0}else{o=((1<<h)-1&n)<<32-h|i>>>h}}if(x){g=w&31;if((w&63)>>>0>=32){l=-1<<g;i=0}else{i=-1<<g;l=i|(1<<g)-1&-1>>>32-g}g=x+(i^-1)|0;i=l^-1;h=g>>>0<x>>>0?i+1|0:i;i=w&31;if((w&63)>>>0>=32){g=h>>>i|0}else{g=((1<<i)-1&h)<<32-i|g>>>i}}n=0;j=0;if(E){i=w&31;if((w&63)>>>0>=32){l=-1<<i;h=0}else{h=-1<<i;l=h|(1<<i)-1&-1>>>32-i}i=E+(h^-1)|0;h=l^-1;j=i>>>0<E>>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){j=j>>>h|0}else{j=((1<<h)-1&j)<<32-h|i>>>h}}if(t){i=w&31;if((w&63)>>>0>=32){l=-1<<i;h=0}else{h=-1<<i;l=h|(1<<i)-1&-1>>>32-i}i=t+(h^-1)|0;h=l^-1;n=i>>>0<t>>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){n=n>>>h|0}else{n=((1<<h)-1&n)<<32-h|i>>>h}}m=0;i=0;S=1<<w-1;if(S>>>0<Y>>>0){i=w&31;if((w&63)>>>0>=32){l=-1<<i;h=0}else{h=-1<<i;l=h|(1<<i)-1&-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)-1&l)<<32-h|i>>>h}}if(E>>>0>S>>>0){h=w&31;if((w&63)>>>0>=32){l=-1<<h;m=0}else{m=-1<<h;l=m|(1<<h)-1&-1>>>32-h}m=m^-1;h=m+(E-S|0)|0;l=l^-1;l=h>>>0<m>>>0?l+1|0:l;m=w&31;if((w&63)>>>0>=32){m=l>>>m|0}else{m=((1<<m)-1&l)<<32-m|h>>>m}}u=0;h=0;if(x>>>0>S>>>0){h=w&31;if((w&63)>>>0>=32){l=-1<<h;aa=0}else{aa=-1<<h;l=aa|(1<<h)-1&-1>>>32-h}aa=aa^-1;h=aa+(x-S|0)|0;l=l^-1;aa=h>>>0<aa>>>0?l+1|0:l;l=w&31;if((w&63)>>>0>=32){h=aa>>>l|0}else{h=((1<<l)-1&aa)<<32-l|h>>>l}}if(t>>>0<=S>>>0){break Za}l=w&31;if((w&63)>>>0>=32){l=-1<<l;u=0}else{u=-1<<l;l=u|(1<<l)-1&-1>>>32-l}aa=u^-1;u=aa+(t-S|0)|0;l=l^-1;S=u>>>0<aa>>>0?l+1|0:l;l=w&31;if((w&63)>>>0>=32){u=S>>>l|0}else{u=((1<<l)-1&S)<<32-l|u>>>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<ba>>>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<M>>>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<ma>>>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<n>>>0?-1:m;n=n>>>0<r>>>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<ha>>>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<n>>>0&b>>>0>=i>>>0|g>>>0<fa>>>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<n>>>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<S>>>0){b=m<<1;g=u<<1|1;b=b>>>0>g>>>0?b:g;g=b>>>0<k>>>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<l>>>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<K[v+16>>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<<g-1;C=g-1|0;s=0-g|0;break ob}C=-1<<g^-1;s=0}if(!v|!h){break mb}X=H[k+p>>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<O(-2147483648)){break qb}n=H[b+1076>>2];j=n;za=ca;ca=O(T(ca));Pa=O(za-ca);if(!(Pa<O(.5))){za=O(U(za));rb:{if(Pa>O(.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))<O(2147483648)){n=~~ca}else{n=-2147483648}o=t+(n>>31)|0;j=j+n|0;n=n>>>0>j>>>0?o+1|0:o;j=j>>>0<s>>>0&(n|0)<=(u|0)|(n|0)<(u|0)?s:j>>>0<C>>>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<K[m+16>>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<g>>>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<K[H[q+24>>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<p>>>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(4294967296)&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<q>>>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(4294967296)&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<j>>>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<v>>>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<A>>>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<v>>>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<l>>>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<<l;p=0}else{p=-1<<l;l=p|(1<<l)-1&-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)-1&m)<<32-l|o>>>l}H[z>>2]=r;o=H[q+4>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0<o>>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){x=m>>o}else{x=((1<<o)-1&m)<<32-o|l>>>o}H[z+4>>2]=x;o=H[q+8>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0<o>>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){m=m>>o}else{m=((1<<o)-1&m)<<32-o|l>>>o}H[z+8>>2]=m;o=H[q+12>>2];l=o+p|0;A=(o>>31)+v|0;A=l>>>0<o>>>0?A+1|0:A;o=n&31;if((n&63)>>>0>=32){A=A>>o}else{A=((1<<o)-1&A)<<32-o|l>>>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<<l;o=0}else{o=1<<l;l=o-1&1>>>32-l}R=o;o=R+m|0;U=o-1|0;l=l+Q|0;o=(o>>>0<R>>>0?l+1|0:l)-!o|0;l=J&31;if((J&63)>>>0>=32){l=o>>l}else{l=((1<<l)-1&o)<<32-l|U>>>l}R=l<<J;if((R|0)<0){break N}U=A>>31;Q=H[D+ha>>2];l=Q&31;if((Q&63)>>>0>=32){l=-1<<l;o=0}else{o=-1<<l;l=o|(1<<l)-1&-1>>>32-l}D=o^-1;o=D+A|0;l=(l^-1)+U|0;D=o>>>0<D>>>0?l+1|0:l;l=Q&31;if((Q&63)>>>0>=32){l=D>>l}else{l=((1<<l)-1&D)<<32-l|o>>>l}l=l<<Q;if((l|0)<0){break N}$=x&-1<<Q;o=(x|0)!=(A|0)?l-$>>Q:0;H[z+20>>2]=o;aa=r&-1<<J;l=(m|0)!=(r|0)?R-aa>>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<<l;j=0}else{j=1<<l;l=j-1&1>>>32-l}ga=j;A=l;j=H[E+12>>2];R=j>>>0<Q>>>0?j:Q;j=R&31;if((R&63)>>>0>=32){l=-1<<j;m=0}else{m=-1<<j;l=m|(1<<j)-1&-1>>>32-j}ja=m^-1;ka=l^-1;j=H[E+8>>2];U=j>>>0<J>>>0?j:J;j=U&31;if((U&63)>>>0>=32){l=-1<<j;m=0}else{m=-1<<j;l=m|(1<<j)-1&-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<l>>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){S=m>>l}else{S=((1<<l)-1&m)<<32-l|j>>>l}l=H[q>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0<l>>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){C=m>>l}else{C=((1<<l)-1&m)<<32-l|j>>>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<<m;m=0}else{l=(1<<m)-1&r>>>32-m;m=r<<m}s=m^-1;M=s+ga|0;r=H[q+4>>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<r>>>0?l+1|0:l;l=o&31;if((o&63)>>>0>=32){S=r>>l}else{S=((1<<l)-1&r)<<32-l|m>>>l}r=j&1;m=n&31;if((n&63)>>>0>=32){l=r<<m;m=0}else{l=(1<<m)-1&r>>>32-m;m=r<<m}C=m^-1;m=C+ga|0;s=H[q>>2];r=m+s|0;l=(l^-1)+A|0;l=m>>>0<C>>>0?l+1|0:l;C=l+(s>>31)|0;C=r>>>0<s>>>0?C+1|0:C;s=o&31;if((o&63)>>>0>=32){C=C>>s}else{C=((1<<s)-1&C)<<32-s|r>>>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)-1&S)<<32-M|r>>>M}H[x+12>>2]=r;l=l+W|0;C=l+1|0;r=l;l=m+P|0;r=l>>>0<P>>>0?C:r;m=s&31;if((s&63)>>>0>=32){l=r>>m}else{l=((1<<m)-1&r)<<32-m|l>>>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<<J)+aa|0;s=H[x>>2];S=(r|0)>(s|0)?r:s;H[j>>2]=S;r=(l<<Q)+$|0;s=H[x+4>>2];C=(r|0)>(s|0)?r:s;H[j+4>>2]=C;m=(m+1<<J)+aa|0;r=H[x+8>>2];m=(m|0)<(r|0)?m:r;H[j+8>>2]=m;l=(l+1<<Q)+$|0;r=H[x+12>>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)-1&s)<<32-m|l>>>m}s=l-S<<U>>U;H[j+16>>2]=s;l=(r>>31)+ka|0;T=l+1|0;m=l;l=r+ja|0;r=l>>>0<r>>>0?T:m;C=C>>R;m=R&31;if((R&63)>>>0>=32){l=r>>m}else{l=((1<<m)-1&r)<<32-m|l>>>m}l=l-C<<R>>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<<U;W=H[j>>2];H[m+8>>2]=(P|0)>(W|0)?P:W;T=C+T|0;P=T<<R;W=H[j+4>>2];H[m+12>>2]=(P|0)>(W|0)?P:W;s=s+1<<U;P=H[j+8>>2];H[m+16>>2]=(s|0)<(P|0)?s:P;P=m;m=T+1<<R;s=H[j+12>>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<K[z+24>>2]){continue}break}z=z+152|0;j=n;_=_+1|0;if(_>>>0<K[q+20>>2]){continue}break}}Z=Z+52|0;q=q+76|0;E=E+1080|0;fa=fa+1|0;if(fa>>>0<K[V+16>>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<b>>>0){q=H[a+64>>2];if(q>>>0<b+1>>>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<b>>>0){q=H[a+64>>2];if(q>>>0<b+1>>>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<x>>>0){r=H[a+64>>2];if(r>>>0<x+1>>>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<<s;k=k?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<<g;i=i?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<l>>>0){P=H[a+64>>2];if(P>>>0<l+1>>>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<<j;k=k?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<<g;i=i?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<b>>>0){r=H[a+64>>2];if(r>>>0<b+1>>>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<<j;e=e?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<<g;k=k?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<d>>>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<<d;v=0}else{b=(1<<d)-1&g>>>32-d;v=g<<d}q=c;f=b;c=v;d=m&31;if((m&63)>>>0>=32){b=b>>>d|0}else{b=((1<<d)-1&b)<<32-d|c>>>d}if((q|0)!=(b|0)){break Q}b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<<b)-1<<32-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<<d;w=0}else{b=(1<<d)-1&c>>>32-d;w=c<<d}C=b;q=b-!w|0;h=q;F=w-1|0;d=H[a+216>>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<j>>>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)-1<<32-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<<e;e=0}else{b=(1<<e)-1&c>>>32-e;e=c<<e}c=e;l=n&31;if((n&63)>>>0>=32){c=b>>>l|0}else{c=((1<<l)-1&b)<<32-l|c>>>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<<b;b=0}else{c=(1<<b)-1&-1>>>32-b;b=-1<<b;h=c|b}b=b^-1;c=h^-1;Q=e;R=b;b=0;n=s;e=m&31;if((m&63)>>>0>=32){h=n<<e;b=0}else{h=(1<<e)-1&n>>>32-e|b<<e;b=n<<e}if(Q&(!(R&b|c&h)|(l|0)!=(L|0))){break Q}n=t&31;c=H[a+220>>2];if((t&63)>>>0>=32){b=g<<n;e=0}else{b=(1<<n)-1&g>>>32-n;e=g<<n}n=!!(we(c,e,b)|qa);b=t&31;if((t&63)>>>0>=32){h=-1<<b;b=0}else{e=(1<<b)-1&-1>>>32-b;b=-1<<b;h=e|b}b=b^-1;g=h^-1;e=n;Q=b;b=0;n=j;t=m&31;if((m&63)>>>0>=32){h=j<<t;b=0}else{h=(1<<t)-1&n>>>32-t|b<<t;b=n<<t}if(e&(!(Q&b|g&h)|(c|0)!=(D|0))){break Q}n=H[z+8>>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<A>>>0?b+1|0:b;g=(ve(c,b,v,f)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0<l>>>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<d>>>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<<d;k=0}else{b=(1<<d)-1&g>>>32-d;k=g<<d}q=c;t=b;c=k;d=i&31;if((i&63)>>>0>=32){b=b>>>d|0}else{b=((1<<d)-1&b)<<32-d|c>>>d}if((q|0)!=(b|0)){break aa}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<<b)-1<<32-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<<d;o=0}else{b=(1<<d)-1&c>>>32-d;o=c<<d}n=b;q=b-!o|0;h=q;F=o-1|0;d=H[a+216>>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<j>>>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)-1<<32-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<<r;r=0}else{b=(1<<r)-1&c>>>32-r;r=c<<r}c=r;l=f&31;if((f&63)>>>0>=32){c=b>>>l|0}else{c=((1<<l)-1&b)<<32-l|c>>>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<<b;b=0}else{c=(1<<b)-1&-1>>>32-b;b=-1<<b;h=c|b}b=b^-1;c=h^-1;Q=r;R=b;b=0;f=s;r=i&31;if((i&63)>>>0>=32){h=f<<r;b=0}else{h=(1<<r)-1&f>>>32-r|b<<r;b=f<<r}if(Q&(!(R&b|c&h)|(l|0)!=(w|0))){break aa}f=m&31;c=H[a+220>>2];if((m&63)>>>0>=32){b=g<<f;f=0}else{b=(1<<f)-1&g>>>32-f;f=g<<f}f=!!(we(c,f,b)|qa);b=m&31;if((m&63)>>>0>=32){h=-1<<b;b=0}else{g=(1<<b)-1&-1>>>32-b;b=-1<<b;h=g|b}b=b^-1;g=h^-1;r=f;w=b;b=0;f=j;m=i&31;if((i&63)>>>0>=32){h=f<<m;b=0}else{h=(1<<m)-1&f>>>32-m|b<<m;b=f<<m}if(r&(!(w&b|g&h)|(c|0)!=(L|0))){break aa}f=H[D+8>>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<C>>>0?b+1|0:b;g=(ve(c,b,k,t)>>>z)-(j>>>z)|0;b=q;c=l+F|0;b=c>>>0<l>>>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<r>>>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<<d;v=0}else{b=(1<<d)-1&g>>>32-d;v=g<<d}q=c;t=b;c=v;d=i&31;if((i&63)>>>0>=32){b=b>>>d|0}else{b=((1<<d)-1&b)<<32-d|c>>>d}if((q|0)!=(b|0)){break ma}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<<b)-1<<32-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<<d;w=0}else{b=(1<<d)-1&c>>>32-d;w=c<<d}n=b;q=b-!w|0;h=q;F=w-1|0;d=H[a+216>>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<j>>>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)-1<<32-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<<e;e=0}else{b=(1<<e)-1&c>>>32-e;e=c<<e}c=e;l=f&31;if((f&63)>>>0>=32){c=b>>>l|0}else{c=((1<<l)-1&b)<<32-l|c>>>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<<b;b=0}else{c=(1<<b)-1&-1>>>32-b;b=-1<<b;h=c|b}b=b^-1;c=h^-1;k=e;Q=b;b=0;f=s;e=i&31;if((i&63)>>>0>=32){h=f<<e;b=0}else{h=(1<<e)-1&f>>>32-e|b<<e;b=f<<e}if(k&(!(Q&b|c&h)|(l|0)!=(L|0))){break ma}f=m&31;c=H[a+220>>2];if((m&63)>>>0>=32){b=g<<f;f=0}else{b=(1<<f)-1&g>>>32-f;f=g<<f}f=!!(we(c,f,b)|qa);b=m&31;if((m&63)>>>0>=32){h=-1<<b;b=0}else{e=(1<<b)-1&-1>>>32-b;b=-1<<b;h=e|b}b=b^-1;g=h^-1;e=f;k=b;b=0;f=j;m=i&31;if((i&63)>>>0>=32){h=f<<m;b=0}else{h=(1<<m)-1&f>>>32-m|b<<m;b=f<<m}if(e&(!(k&b|g&h)|(c|0)!=(D|0))){break ma}f=H[z+8>>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<C>>>0?b+1|0:b;g=(ve(c,b,v,t)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0<l>>>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<<H[b+180>>2]^-1)>>>0));D=O(O(1)/O((-1<<H[b+128>>2]^-1)>>>0));w=O(O(1)/O((-1<<H[b+76>>2]^-1)>>>0));Q=O(O(1)/O((-1<<H[b+24>>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))<O(2147483648)){c=~~E}else{c=-2147483648}H[m>>2]=c;E=O(O(O(O(1)-O(w*O(j|0)))*O(255))*s);if(O(P(E))<O(2147483648)){c=~~E}else{c=-2147483648}H[k>>2]=c;s=O(O(O(O(1)-O(D*O(i|0)))*O(255))*s);if(O(P(s))<O(2147483648)){c=~~s}else{c=-2147483648}H[g>>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<<a^-1;a=1<<a-1;g=H[b+136>>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))<O(2147483648)){f=~~w}else{f=-2147483648}H[j>>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))<O(2147483648)){f=~~w}else{f=-2147483648}H[h>>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))<O(2147483648)){f=~~s}else{f=-2147483648}H[m>>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<<b^-1;o=1<<b-1;b=H[l+4>>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<<a^-1;r=1<<a-1;z=H[l>>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<J>>>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<<b^-1;r=1<<b-1;c=0;f=m;b=k;g=i;while(1){if((c|0)!=(o|0)){Ka(r,q,H[j>>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<R>>>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<z>>>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<<d-1;h=0;while(1){if((f|0)==(h|0)){break F}d=g+(h<<2)|0;m=d;d=H[d>>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<<d^-1;h=0;while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;k=ve(re(H[i>>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<d>>>0|b>>>0>=d>>>0|b>>>0>=j>>>0){break a}j=H[a+4>>2];if(j>>>0<e>>>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<t>>>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<k>>>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<q>>>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<q>>>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<d>>>0){continue}break}E=E+1|0;z=r+z|0;if(z>>>0<e>>>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<b>>>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(4294967296)&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(4294967296)&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]<e>>>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(4294967296)&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<i>>>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<e>>>0){d=5645;break m}i=f-4|0;n=i>>>0<d>>>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<i>>>0){continue}break}f=H[a+136>>2]}d=g}h=h+1|0;if(h>>>0<f>>>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<h>>>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<f>>>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<l>>>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<K[a+68>>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<g>>>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<n>>>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<K[j+16>>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<<H[i+24>>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<<H[k+24>>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<<H[e+24>>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<K[l+36>>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<d>>>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<d>>>0?a:d;i=a-1|0;n=0-!a|0;a=H[j+4>>2];b=a>>>0<b>>>0?b:a;o=b-1|0;p=0-!b|0;a=H[j>>2];b=a>>>0<c>>>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<d>>>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<h>>>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<<g;m=0}else{m=-1<<g;e=m|(1<<g)-1&-1>>>32-g}g=m^-1;e=e^-1;m=e;e=k;t=d+l|0;e=t>>>0<l>>>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)-1&d)<<32-e|j>>>e}H[a+12>>2]=d;e=n;d=h+i|0;e=d>>>0<i>>>0?e+1|0:e;d=ve(d,e,h,0)-s|0;e=m;d=d+g|0;e=d>>>0<g>>>0?e+1|0:e;h=d;d=c&31;if((c&63)>>>0>=32){c=e>>>d|0}else{c=((1<<d)-1&e)<<32-d|h>>>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<<o;w=0}else{l=(1<<o)-1&w>>>32-o;w=w<<o}o=w+d|0;i=i+l|0;l=d>>>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<g>>>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<<d^-1;i=0;h=j;while(1){w=i;i=H[h>>2];H[h>>2]=w+(i>>>d|0);i=N(o,i&z);h=h+4|0;if(h>>>0<g>>>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<o>>>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<j>>>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<g>>>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<g>>>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<g>>>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<g>>>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<<b;if(!(b&75913)){break m}while(1){n=h+1|0;H[j+60>>2]=n;l=b|l;i=F[h+1|0];b=i-32|0;if(b>>>0>=32){break m}h=n;b=1<<b;if(b&75913){continue}break}}n:{if((i|0)==42){b=F[n+1|0]-48|0;o:{if(!(I[n+2|0]!=36|b>>>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<h>>>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<K[c+16>>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<d>>>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<<d^-1)&e|l<<d)&(65280<<d^-1)|f<<(d|8);d=d+16|0;m=m+2|0;if((j|0)!=(m|0)){continue}break}if(!k){break f}}f=c+1|0;H[a>>2]=f;c=I[c|0];H[a+20>>2]=i-1;e=(255<<d^-1)&e|c<<d;c=f}b=(b<<3)-8|0}H[a>>2]=c+1;d=(255<<b^-1)&e|(I[c|0]|15)<<b}H[a+20>>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<<c;g=0}else{i=(1<<c)-1&b>>>32-c;g=b<<c}b=g|H[a+8>>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<<i^-1)<<1;i=1;e=((e|0)>=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)-1&f)<<32-c|g>>>c}c=(g&(-1<<i^-1))<<1|1;i=i+1|0;d=d-i|0;e=((e|0)<=1?1:e)-1|0}H[a+16>>2]=d;H[a+28>>2]=e;g=b;h=i&31;if((i&63)>>>0>=32){b=b<<h;g=0}else{b=(1<<h)-1&g>>>32-h|f<<h;g=g<<h}f=b;H[a+8>>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<<b^-1)<<1;b=1;e=((e|0)>=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)-1&f)<<32-c|k>>>c}c=(k&(-1<<b^-1))<<1|1;b=b+1|0;d=d-b|0;e=((e|0)<=1?1:e)-1|0}H[a+16>>2]=d;H[a+28>>2]=e;k=g;h=b&31;if((b&63)>>>0>=32){b=g<<h;k=0}else{b=(1<<h)-1&k>>>32-h|f<<h;k=k<<h}f=b;H[a+8>>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<<b^-1)<<1;b=1;e=((e|0)>=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)-1&f)<<32-c|g>>>c}c=(g&(-1<<b^-1))<<1|1;b=b+1|0;d=d-b|0;e=((e|0)<=1?1:e)-1|0}H[a+16>>2]=d;H[a+28>>2]=e;l=k;g=b&31;if((b&63)>>>0>=32){i=k<<g;g=0}else{i=(1<<g)-1&l>>>32-g|f<<g;g=l<<g}H[a+8>>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<<b^-1)<<1;b=1;e=((e|0)>=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)-1&f)<<32-c|j>>>c}c=(j&(-1<<b^-1))<<1|1;b=b+1|0;d=d-b|0;e=((e|0)<=1?1:e)-1|0}H[a+16>>2]=d;H[a+28>>2]=e;j=g;h=b&31;if((b&63)>>>0>=32){b=g<<h;g=0}else{b=(1<<h)-1&j>>>32-h|f<<h;g=j<<h}f=b;H[a+8>>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<<b^-1)<<1;b=1;h=((e|0)>=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)-1&f)<<32-c|h>>>c}c=(i&(-1<<b^-1))<<1|1;h=((e|0)<=1?1:e)-1|0;b=b+1|0;d=d-b|0}H[a+16>>2]=d;H[a+28>>2]=h;i=g;e=b&31;if((b&63)>>>0>=32){b=g<<e;g=0}else{b=(1<<e)-1&i>>>32-e|f<<e;g=i<<e}H[a+8>>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<<b^-1)<<1;b=1;h=((h|0)>=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)-1&f)<<32-c|i>>>c}e=(i&(-1<<b^-1))<<1|1;h=((h|0)<=1?1:h)-1|0;b=b+1|0;i=d-b|0}H[a+16>>2]=i;H[a+28>>2]=h;d=g;c=b&31;if((b&63)>>>0>=32){b=d<<c;g=0}else{b=(1<<c)-1&d>>>32-c|f<<c;g=d<<c}c=b;H[a+8>>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<<b^-1)<<1;b=1;h=((h|0)>=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)-1&c)<<32-f|d>>>f}e=(f&(-1<<b^-1))<<1|1;h=((h|0)<=1?1:h)-1|0;b=b+1|0;d=i-b|0}H[a+16>>2]=d;H[a+28>>2]=h;j=g;f=b&31;if((b&63)>>>0>=32){i=g<<f;g=0}else{i=(1<<f)-1&j>>>32-f|c<<f;g=j<<f}H[a+8>>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<<b^-1)<<1;b=1;e=((h|0)>=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)-1&f)<<32-c|j>>>c}c=(j&(-1<<b^-1))<<1|1;b=b+1|0;d=d-b|0;e=((h|0)<=1?1:h)-1|0}H[a+16>>2]=d;H[a+28>>2]=e;d=g;e=b&31;if((b&63)>>>0>=32){b=d<<e;g=0}else{b=(1<<e)-1&d>>>32-e|f<<e;g=d<<e}H[a+8>>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<K[r+24>>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<a+1>>>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<n+2>>>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<n+2>>>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<K[r+24>>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<<g;m=0}else{m=1<<g;q=m-1&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<e>>>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)-1&t)<<32-g|e>>>g}e=h&31;if((h&63)>>>0>=32){e=j>>e}else{e=((1<<e)-1&j)<<32-e|l>>>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<i>>>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<m>>>0?o:l;m=j-1|0;if((h&63)>>>0>=32){l=g>>i}else{l=((1<<i)-1&g)<<32-i|e>>>i}i=q-!j|0;e=h&31;if((h&63)>>>0>=32){m=i>>e}else{m=((1<<e)-1&i)<<32-e|m>>>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<e>>>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<f>>>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<K[c+16>>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<K[c+16>>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<K[g+16>>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<K[a+24>>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<K[(b+h|0)+20>>2]){continue}break}}g=g+1|0;if(g>>>0<K[a+36>>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<b>>>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<K[a+28>>2]|b>>>0>=K[a+36>>2]|h>>>0<K[a+32>>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<i>>>0){m=H[k+4>>2];H[a+4>>2]=i;h=h>>>0<i>>>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<i>>>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<i>>>0){k=H[l+4>>2];H[a+4>>2]=i;h=h>>>0<i>>>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<i>>>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<<n;c=l^o;H[b>>2]=H[b>>2]|(c<<19|16)<<n;H[b+4>>2]=H[b+4>>2]|8<<n;if(!(e|g)){a=b-(f<<2)|0;H[a+4>>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<<n}}function Wb(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{m=N(e,3);g=H[b>>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<h>>>0){l=H[j+4>>2];H[a+4>>2]=h;g=g>>>0<h>>>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<h>>>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<h>>>0){j=H[k+4>>2];H[a+4>>2]=h;g=g>>>0<h>>>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<h>>>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<<m;d=c^k;H[b>>2]=H[b>>2]|(d<<19|16)<<m;H[b+4>>2]=H[b+4>>2]|8<<m;if(!(e|f)){c=(-2-H[a+124>>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<k>>>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<K[a+4>>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<K[a+4>>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<K[f+4>>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<K[a+32>>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<e>>>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<<c;i=0}else{e=(1<<c)-1&g>>>32-c|a<<c;i=g<<c}m=0;c=0;break c}if(!l){break c}n=i;j=l&31;if((l&63)>>>0>=32){g=i<<j;n=0}else{g=(1<<j)-1&n>>>32-j|e<<j;n=n<<j}j=m;e=64-l|0;i=e&31;if((e&63)>>>0>=32){e=0;i=c>>>i|0}else{e=c>>>i|0;i=((1<<i)-1&c)<<32-i|j>>>i}i=n|i;e=e|g;n=m;j=l&31;if((l&63)>>>0>=32){g=m<<j;m=0}else{g=(1<<j)-1&n>>>32-j|c<<j;m=n<<j}c=g}H[h+16>>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)-1&b)<<32-a|c>>>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<<e;i=0}else{c=(1<<e)-1&g>>>32-e|b<<e;i=g<<e}e=f;f=k&31;if((k&63)>>>0>=32){g=0;a=a>>>f|0}else{g=a>>>f|0;a=((1<<f)-1&a)<<32-f|e>>>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)-1&b)<<32-d|e>>>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<<c;h=0}else{h=-1<<c;c=h|(1<<c)-1&-1>>>32-c}m=h^-1;j=H[b+20>>2];h=m+j|0;i=c^-1;c=i;j=h>>>0<j>>>0?c+1|0:c;c=e&31;if((e&63)>>>0>=32){h=j>>>c|0}else{h=((1<<c)-1&j)<<32-c|h>>>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)-1&m)<<32-i|j>>>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<k>>>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<K[q+16>>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<K[d+36>>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<K[g+8>>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<o>>>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<s>>>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<s>>>0?i+1|0:i,l,0);k=i>>>0<t>>>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<m>>>0?i+1|0:i,j,0);i=i>>>0<p>>>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)<<m;if(j>>>0<i>>>0){a=c&31;l=i-j|0;if((c&63)>>>0>=32){i=-1<<a;a=0}else{b=(1<<a)-1&-1>>>32-a;a=-1<<a;i=b|a}b=a^-1;a=l+b|0;i=i^-1;i=a>>>0<b>>>0?i+1|0:i;b=a;a=c&31;if((c&63)>>>0>=32){l=i>>>a|0}else{l=((1<<a)-1&i)<<32-a|b>>>a}}a=0;b=0;d=d>>>1<<m;if(d>>>0<k>>>0){b=c&31;o=k-d|0;if((c&63)>>>0>=32){i=-1<<b;b=0}else{i=(1<<b)-1&-1>>>32-b;b=-1<<b;i=i|b}k=b^-1;b=o+k|0;i=i^-1;i=b>>>0<k>>>0?i+1|0:i;k=b;b=c&31;if((c&63)>>>0>=32){b=i>>>b|0}else{b=((1<<b)-1&i)<<32-b|k>>>b}}if(j>>>0<n>>>0){a=c&31;k=n-j|0;if((c&63)>>>0>=32){i=-1<<a;a=0}else{i=(1<<a)-1&-1>>>32-a;a=-1<<a;i=i|a}j=a^-1;a=k+j|0;i=i^-1;i=a>>>0<j>>>0?i+1|0:i;j=a;a=c&31;if((c&63)>>>0>=32){a=i>>>a|0}else{a=((1<<a)-1&i)<<32-a|j>>>a}}if(d>>>0>=q>>>0){q=0;break a}k=q-d|0;d=c&31;if((c&63)>>>0>=32){i=-1<<d;d=0}else{i=(1<<d)-1&-1>>>32-d;d=-1<<d;i=i|d}j=d^-1;d=k+j|0;i=i^-1;i=d>>>0<j>>>0?i+1|0:i;j=d;d=c&31;if((c&63)>>>0>=32){q=i>>>d|0}else{q=((1<<d)-1&i)<<32-d|j>>>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<q>>>0?-1:a)>>>0>f>>>0;a=l-c|0;d=d&(a>>>0<=l>>>0?a:0)>>>0<g>>>0;a=b-c|0;return d&(a>>>0<=b>>>0?a:0)>>>0<h>>>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<<d|c|h<<d-8;d=d-16|0;j=j+2|0;if((k|0)!=(j|0)){continue}break}if(l){break b}break a}H[a>>2]=f-1;f=I[f|0];H[a+20>>2]=b-1;c=f<<d|c}b=H[a+24>>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<<b|c>>>24|d<<h|k<<i;c=g&31;if((g&63)>>>0>=32){d=b<<c;b=0}else{d=(1<<c)-1&b>>>32-c;b=b<<c}g=b|H[a+8>>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<<d|c|m<<d-8;d=d-16|0;f=f+2|0;if((j|0)!=(f|0)){continue}break}if(!i){break c}}H[a>>2]=b-1;b=I[b|0];H[a+20>>2]=e-1;c=b<<d|c}e=c&255;H[a+24>>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<<k|c>>>24|d<<i|e<<j;e=l&31;if((l&63)>>>0>=32){c=a<<e;a=0}else{c=(1<<e)-1&a>>>32-e;a=a<<e}g=a|g;H[b+8>>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<g>>>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<<f^-1)&d|k<<f)&(65280<<f^-1)|e<<(f|8);f=f+16|0;g=g+2|0;if((i|0)!=(g|0)){continue}break}e=0;if(!j){break a}}H[a>>2]=b+1;b=I[b|0];H[a+24>>2]=c-1;d=(255<<f^-1)&d|b<<f}b=H[a+20>>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<<b|c<<g|i<<k);c=h&31;if((h&63)>>>0>=32){d=b<<c;b=0}else{d=(1<<c)-1&b>>>32-c;b=b<<c}h=b|H[a+8>>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<<f^-1)&d|n<<f)&(65280<<f^-1)|c<<(f|8);f=f+16|0;g=g+2|0;if((m|0)!=(g|0)){continue}break}if(!l){break b}}H[a>>2]=b+1;b=I[b|0];H[a+24>>2]=e-1;d=(255<<f^-1)&d|b<<f}e=d>>>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<<g|c<<i|e<<l);e=j&31;if((j&63)>>>0>=32){c=a<<e;a=0}else{c=(1<<e)-1&a>>>32-e;a=a<<e}h=a|h;H[b+8>>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<g>>>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<<e;e=0}else{m=(1<<e)-1&b>>>32-e;e=b<<e}g=e|g;H[a+8>>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<<b;b=0}else{f=(1<<b)-1&c>>>32-b;b=c<<b}g=b|g;b=f|m;m=b;H[a+8>>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<<b^-1)&d|e<<b;b=b+8|0;k=h>>>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<<h|c<<f|b<<k);c=a;c=a;a=b;b=i&31;if((i&63)>>>0>=32){d=a<<b;a=0}else{d=(1<<b)-1&a>>>32-b;a=a<<b}H[c+8>>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<<b;g=0}else{g=1<<b;c=g-1&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<d>>>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<<b;b=0}else{e=1<<b;c=e-1&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<i>>>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<K[H[a+96>>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)-1&c)<<32-f|h>>>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)-1&f)<<32-e|c>>>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<b>>>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<c>>>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<f>>>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<f>>>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<f>>>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<e>>>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<f>>>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<c>>>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<e>>>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<c>>>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<e>>>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<e>>>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<h>>>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<N(c,h)>>>0){continue}break}f=H[g+16>>2];d=H[g+20>>2]}o=o+1|0;if(o>>>0<N(d,f)>>>0){continue}break}c=H[g+24>>2]}n=n+1|0;if(n>>>0<c>>>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<K[g+16>>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<K[e+4>>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)-1&b)<<32-d|a>>>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)-1&b)<<32-h|f>>>h}h=g&63;g=a;i=h&31;if((h&63)>>>0>=32){j=a<<i;a=0}else{j=(1<<i)-1&g>>>32-i|b<<i;a=g<<i}b=j;if(k){g=d-1|0;l=c-1|0;g=(l|0)!=-1?g+1|0:g;h=l;while(1){e=e<<1|f>>>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<i>>>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<f>>>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<h>>>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<f>>>0){Ba(d,1,9148,0);break b}if(c>>>0<e>>>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<e>>>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<<a;e=0}else{e=1<<a;b=e-1&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<K[b+16>>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<e>>>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<k>>>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<f>>>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<g>>>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<f>>>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<K[a+5160>>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<<e;g=0}else{g=1<<e;b=g-1&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<f>>>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<j>>>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<i>>>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<K[a+136>>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<<a;break a}a=H[(c<<2)+25312>>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<g>>>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<<d;e=0}else{e=1<<d;a=e-1&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<J[H[a+116>>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<K[c+16>>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<K[a+64>>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<K[H[a+96>>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<<e)-1<<32-e}f=f&a;d=b&d;e=g&31;if(g>>>0>=32){d=f<<e;g=0}else{d=(1<<e)-1&f>>>32-e|d<<e;g=f<<e}f=d;e=0-c&63;d=e&31;if(e>>>0>=32){d=-1<<d;c=0}else{c=-1<<d;d=c|(1<<d)-1&-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)-1&b)<<32-d|a>>>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)<H[a+24>>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<b>>>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<d>>>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<f>>>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<g>>>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<b>>>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)<<b|f;if(e>>>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<K[a+20>>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<c>>>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<b>>>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))<O(2147483648)){f=~~e}else{f=-2147483648}H[b>>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<c>>>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<e>>>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<f>>>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<N(b,c)>>>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<K[a+32>>2]){while(1){$b(a,H[a+24>>2]+(N(H[a+20>>2],b)<<2)|0);b=b+1|0;if(b>>>0<K[a+32>>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<d>>>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<d>>>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<<b;H[a+4>>2]=c<<b|d>>>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<ua&&ua<65536&&ua<=32768){var va=new ArrayBuffer(ua<<16);var wa=new Int8Array(va);wa.set(F);F=new Int8Array(va);G=new Int16Array(va);H=new Int32Array(va);I=new Uint8Array(va);J=new Uint16Array(va);K=new Uint32Array(va);L=new Float32Array(va);M=new Float64Array(va);E=va;a=I}return ta}return{r:Object.create(Object.prototype,{grow:{value:xa},buffer:{get:function(){return E}}}),s:qe,t:vb,u:Ca,v:nd,w:cd}}return za(Aa)}
+// EMSCRIPTEN_END_ASM
+
+
+)(info)},instantiate:function(binary,info){return{then:function(ok){var module=new WebAssembly.Module(binary);ok({instance:new WebAssembly.Instance(module,info)})}}},RuntimeError:Error,isWasm2js:true};if(WebAssembly.isWasm2js){wasmBinary=[]}var ABORT=false;var EXITSTATUS;class EmscriptenEH{}class EmscriptenSjLj extends EmscriptenEH{}var readyPromiseResolve,readyPromiseReject;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;wasmExports["s"]()}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(file){}function getBinarySync(file){}function instantiateSync(file,info){var module;var binary=getBinarySync(file);module=new WebAssembly.Module(binary);var instance=new WebAssembly.Instance(module,info);return[instance,module]}function getWasmImports(){var imports={a:wasmImports};return imports}function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{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<nb_pixels;i++){imageData[3*i]=compR[i];imageData[3*i+1]=compG[i];imageData[3*i+2]=compB[i]}}function _copy_pixels_4(compR_ptr,compG_ptr,compB_ptr,compA_ptr,nb_pixels){compR_ptr>>=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;i<nb_pixels;i++){imageData[4*i]=compR[i];imageData[4*i+1]=compG[i];imageData[4*i+2]=compB[i];imageData[4*i+3]=compA[i]}}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};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<str.length;++i){var u=str.codePointAt(i);if(u<=127){if(outIdx>=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<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=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<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j<len;j++){printChar(fd,HEAPU8[ptr+j])}num+=len}HEAPU32[pnum>>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<nb_pixels;i++){imageData[4*i]=imageData[4*i+1]=imageData[4*i+2]=compG[i];imageData[4*i+3]=255}}function _graya_to_rgba(compG_ptr,compA_ptr,nb_pixels){compG_ptr>>=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<nb_pixels;i++){imageData[4*i]=imageData[4*i+1]=imageData[4*i+2]=compG[i];imageData[4*i+3]=compA[i]}}function _jsPrintWarning(message_ptr){const message=UTF8ToString(message_ptr);(Module.warn||console.warn)(`OpenJPEG: ${message}`)}function _rgb_to_rgba(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*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<nb_pixels;i++){imageData[4*i]=compR[i];imageData[4*i+1]=compG[i];imageData[4*i+2]=compB[i];imageData[4*i+3]=255}}function _storeErrorMessage(message_ptr){const message=UTF8ToString(message_ptr);if(!Module.errorMessages){Module.errorMessages=message}else{Module.errorMessages+="\n"+message}}var writeArrayToMemory=(array,buffer)=>{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/public/pdfjs/web/wasm/qcms_bg.wasm b/public/pdfjs/web/wasm/qcms_bg.wasm
new file mode 100644
index 0000000..fccd641
--- /dev/null
+++ b/public/pdfjs/web/wasm/qcms_bg.wasm
Binary files differ
diff --git a/public/pdfjs/web/wasm/quickjs-eval.js b/public/pdfjs/web/wasm/quickjs-eval.js
new file mode 100644
index 0000000..f087fb2
--- /dev/null
+++ b/public/pdfjs/web/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(;a.length>0;)a.shift()(e)},I=[],J=[],ea=()=>{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||a=="unwind"))throw a;},O=a=>{u=a;K||L>0||(e.onExit?.(a),t=!0);throw new G(a);},ia=a=>{if(!t)try{a()}catch(b){N(b)}finally{if(!(K||L>0))try{u=a=u,O(a)}catch(b){N(b)}}},P=(a,b,c)=>{var d=B;if(c>0){c=b+c-1;for(var g=0;g<a.length;++g){var f=a.codePointAt(g);if(f<=127){if(b>=
+c)break;d[b++]=f}else if(f<=2047){if(b+1>=c)break;d[b++]=192|f>>6;d[b++]=128|f&63}else if(f<=65535){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<a.length;++c){var d=a.charCodeAt(c);d<=127?b++:d<=2047?b+=2:d>=55296&&d<=57343?
+(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(k!==null&&k!==void 0&&k!==0){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<d.length;l++){var Y=g[c[l]];Y?(p===0&&(p=W()),f[l]=Y(d[l])):f[l]=d[l]}c=a(...f);return c=function(k){p!==0&&ka(p);return b==="string"?Q(k):b==="boolean"?!!k:k}(c)};
+U=(a,b,c)=>{a=Q(a);b=b!==null?JSON.parse(Q(b)):[];try{let 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(typeof e.preInit=="function"&&(e.preInit=[e.preInit]);e.preInit.length>0;)e.preInit.shift()();e.ccall=la;e.cwrap=(a,b,c,d)=>{var g=!c||c.every(f=>f==="number"||f==="boolean");return b!=="string"&&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=a<-9007199254740992||a>9007199254740992?NaN:Number(a);a=new Date(a*1E3);C[b>>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]=(c%4!==0||c%100===0&&c%400!==0?ha:fa)[a.getMonth()]+a.getDate()-1|0;C[b+36>>2]=-(a.getTimezoneOffset()*60);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]=Math.max(f,g)*60;C[b>>2]=Number(f!=g);b=p=>{var l=Math.abs(p);return`UTC${p>=0?"-":"+"}${String(Math.floor(l/
+60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};a=b(f);b=b(g);g<f?(P(a,c,17),P(b,d,17)):(P(a,d,17),P(b,c,17))},g:U,f:function(a,b){a=Q(a);try{var c=window.JSON.parse(a)}catch(d){c=a}b!==0?window.alert(a):window.console.log("DUMP",c)},d:()=>Date.now(),j:a=>{var b=B.length;a>>>=0;if(a>2147483648)return!1;for(var c=1;c<=4;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,Math.ceil(Math.max(a,d)/65536)*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}`;d!==0?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 function(c){return a(c.instance)}(await da(b))}());
+(function(){function a(){e.calledRun=!0;if(!t){x=!0;Z.o();v?.(e);e.onRuntimeInitialized?.();if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();I.push(b)}H(I)}}if(e.preRun)for(typeof e.preRun=="function"&&(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/public/pdfjs/web/wasm/quickjs-eval.wasm b/public/pdfjs/web/wasm/quickjs-eval.wasm
new file mode 100644
index 0000000..42980e9
--- /dev/null
+++ b/public/pdfjs/web/wasm/quickjs-eval.wasm
Binary files differ
diff --git a/src/modules/operation/locales/en.json b/src/modules/operation/locales/en.json
index a085c36..ed49d34 100644
--- a/src/modules/operation/locales/en.json
+++ b/src/modules/operation/locales/en.json
@@ -51,5 +51,21 @@
 "鏀惰喘鏂�":"鏀惰喘鏂�",
 "鏀堕泦鐐�":"鏀堕泦鐐�",
 "鏃ユ湡鏃堕棿":"鏃ユ湡鏃堕棿",
-"鎬讳环":"鎬讳环"
+"鎬讳环":"鎬讳环",
+"浜ゆ槗鏃堕棿":"浜ゆ槗鏃堕棿",
+"浜ゆ槗绫诲瀷":"浜ゆ槗绫诲瀷",
+"浜ゆ槗瀵规柟":"浜ゆ槗瀵规柟",
+"鍟嗗搧鍚嶇О":"鍟嗗搧鍚嶇О",
+"鏀舵敮绫诲瀷":"鏀舵敮绫诲瀷",
+"閲戦":"閲戦",
+"鏀粯鏂瑰紡":"鏀粯鏂瑰紡",
+"褰撳墠鐘舵��":"褰撳墠鐘舵��",
+"澶囨敞":"澶囨敞",
+"鏂囦欢璺緞":"鏂囦欢璺緞",
+"鏂囦欢鍚�":"鏂囦欢鍚�",
+"浜ゆ槗鍗曞彿":"浜ゆ槗鍗曞彿",
+"鍟嗘埛鍗曞彿":"鍟嗘埛鍗曞彿",
+"鏀跺叆":"鏀跺叆",
+"鏀嚭":"鏀嚭",
+"鍏朵粬":"鍏朵粬"
 }
\ No newline at end of file
diff --git a/src/modules/operation/locales/zh-cn.json b/src/modules/operation/locales/zh-cn.json
index a085c36..ed49d34 100644
--- a/src/modules/operation/locales/zh-cn.json
+++ b/src/modules/operation/locales/zh-cn.json
@@ -51,5 +51,21 @@
 "鏀惰喘鏂�":"鏀惰喘鏂�",
 "鏀堕泦鐐�":"鏀堕泦鐐�",
 "鏃ユ湡鏃堕棿":"鏃ユ湡鏃堕棿",
-"鎬讳环":"鎬讳环"
+"鎬讳环":"鎬讳环",
+"浜ゆ槗鏃堕棿":"浜ゆ槗鏃堕棿",
+"浜ゆ槗绫诲瀷":"浜ゆ槗绫诲瀷",
+"浜ゆ槗瀵规柟":"浜ゆ槗瀵规柟",
+"鍟嗗搧鍚嶇О":"鍟嗗搧鍚嶇О",
+"鏀舵敮绫诲瀷":"鏀舵敮绫诲瀷",
+"閲戦":"閲戦",
+"鏀粯鏂瑰紡":"鏀粯鏂瑰紡",
+"褰撳墠鐘舵��":"褰撳墠鐘舵��",
+"澶囨敞":"澶囨敞",
+"鏂囦欢璺緞":"鏂囦欢璺緞",
+"鏂囦欢鍚�":"鏂囦欢鍚�",
+"浜ゆ槗鍗曞彿":"浜ゆ槗鍗曞彿",
+"鍟嗘埛鍗曞彿":"鍟嗘埛鍗曞彿",
+"鏀跺叆":"鏀跺叆",
+"鏀嚭":"鏀嚭",
+"鍏朵粬":"鍏朵粬"
 }
\ No newline at end of file
diff --git a/src/modules/operation/locales/zh-tw.json b/src/modules/operation/locales/zh-tw.json
index a085c36..ed49d34 100644
--- a/src/modules/operation/locales/zh-tw.json
+++ b/src/modules/operation/locales/zh-tw.json
@@ -51,5 +51,21 @@
 "鏀惰喘鏂�":"鏀惰喘鏂�",
 "鏀堕泦鐐�":"鏀堕泦鐐�",
 "鏃ユ湡鏃堕棿":"鏃ユ湡鏃堕棿",
-"鎬讳环":"鎬讳环"
+"鎬讳环":"鎬讳环",
+"浜ゆ槗鏃堕棿":"浜ゆ槗鏃堕棿",
+"浜ゆ槗绫诲瀷":"浜ゆ槗绫诲瀷",
+"浜ゆ槗瀵规柟":"浜ゆ槗瀵规柟",
+"鍟嗗搧鍚嶇О":"鍟嗗搧鍚嶇О",
+"鏀舵敮绫诲瀷":"鏀舵敮绫诲瀷",
+"閲戦":"閲戦",
+"鏀粯鏂瑰紡":"鏀粯鏂瑰紡",
+"褰撳墠鐘舵��":"褰撳墠鐘舵��",
+"澶囨敞":"澶囨敞",
+"鏂囦欢璺緞":"鏂囦欢璺緞",
+"鏂囦欢鍚�":"鏂囦欢鍚�",
+"浜ゆ槗鍗曞彿":"浜ゆ槗鍗曞彿",
+"鍟嗘埛鍗曞彿":"鍟嗘埛鍗曞彿",
+"鏀跺叆":"鏀跺叆",
+"鏀嚭":"鏀嚭",
+"鍏朵粬":"鍏朵粬"
 }
\ No newline at end of file
diff --git a/src/modules/operation/views/traderecord.vue b/src/modules/operation/views/traderecord.vue
new file mode 100644
index 0000000..a22605f
--- /dev/null
+++ b/src/modules/operation/views/traderecord.vue
@@ -0,0 +1,334 @@
+<template>
+    <cl-crud ref="Crud">
+        <cl-row>
+            <!-- 鍒锋柊鎸夐挳 -->
+            <cl-refresh-btn />
+            <!-- 鏂板鎸夐挳 -->
+            <cl-add-btn />
+            <!-- 鍒犻櫎鎸夐挳 -->
+            <cl-multi-delete-btn />
+            <cl-flex1 />
+            <cl-import-btn tips="瀵煎叆寰俊浜ゆ槗璁板綍" :on-config="onConfig" :on-submit="onSubmit" />
+            <!-- 鏉′欢鎼滅储 -->
+            <cl-search ref="Search" />
+        </cl-row>
+
+        <cl-row>
+            <!-- 鏁版嵁琛ㄦ牸 -->
+            <cl-table ref="Table">
+                <template #column-filepath="{ scope }">
+                    <el-link :href="scope.row.filepath" target="_blank" type="primary">
+                        {{ scope.row.filepath?.split('/').pop() }}
+                    </el-link>
+
+                </template>
+            </cl-table>
+        </cl-row>
+
+        <cl-row>
+            <cl-flex1 />
+            <!-- 鍒嗛〉鎺т欢 -->
+            <cl-pagination />
+        </cl-row>
+
+        <!-- 鏂板銆佺紪杈� -->
+        <cl-upsert ref="Upsert" />
+    </cl-crud>
+</template>
+
+<script lang="ts" setup>
+defineOptions({
+    name: "trade-record"
+});
+import { ElMessage } from 'element-plus';
+import { useCrud, useTable, useUpsert, useSearch } from "@cool-vue/crud";
+import { useCool } from "/@/cool";
+import { useI18n } from "vue-i18n";
+import { reactive, ref, watch, nextTick } from "vue";
+
+const { service } = useCool();
+const { t } = useI18n();
+
+// 閫夐」
+const options = reactive({
+    incomeType: [
+        { label: t('鏀跺叆'), value: '鏀跺叆' },
+        { label: t('鏀嚭'), value: '鏀嚭' },
+        { label: t('鍏朵粬'), value: '鍏朵粬' }
+    ]
+});
+
+// cl-upsert
+
+const Upsert = useUpsert({
+    items: [
+        {
+            label: t('浜ゆ槗鏃堕棿'),
+            prop: "transactionTime",
+            component: {
+                name: "el-date-picker",
+                props: { type: "datetime", valueFormat: "YYYY-MM-DD HH:mm:ss" }
+            },
+            span: 12
+        },
+        {
+            label: t('浜ゆ槗绫诲瀷'),
+            prop: "transactionType",
+            component: { name: "el-input", props: { clearable: true } },
+            span: 12
+        },
+        {
+            label: t('浜ゆ槗瀵规柟'),
+            prop: "opponent",
+            component: { name: "el-input", props: { clearable: true } },
+            span: 12
+        },
+        {
+            label: t('鍟嗗搧鍚嶇О'),
+            prop: "goodsName",
+            component: { name: "el-input", props: { clearable: true } },
+            span: 12
+        },
+        {
+            label: t('鏀舵敮绫诲瀷'),
+            prop: "incomeType",
+            component: { name: "el-radio-group", options: options.incomeType },
+            value: 2,
+            required: true
+        },
+        {
+            label: t('閲戦'),
+            prop: "amount",
+            hook: "number",
+            component: { name: "el-input-number", props: { min: 0 } },
+            span: 12,
+            required: true
+        },
+        {
+            label: t('鏀粯鏂瑰紡'),
+            prop: "payMethod",
+            component: { name: "el-input", props: { clearable: true } },
+            span: 12
+        },
+        {
+            label: t('褰撳墠鐘舵��'),
+            prop: "status",
+            component: { name: "el-input", props: { clearable: true } },
+            span: 12
+        },
+        {
+            label: t('浜ゆ槗鍗曞彿'),
+            prop: "transactionNo",
+            component: { name: "el-input", props: { clearable: true } },
+            span: 12
+        },
+        {
+            label: t('鍟嗘埛鍗曞彿'),
+            prop: "merchantNo",
+            component: { name: "el-input", props: { clearable: true } },
+            span: 12
+        },
+        {
+            label: t('澶囨敞'),
+            prop: "remark",
+            component: { name: "el-input", props: { type: "textarea", rows: 4 } }
+        }
+        /*{
+            label: t('閫夋嫨鍏宠仈鏂囦欢'),
+            prop: "fileId",
+            component: { name: "cl-upload", props: { type: "file", limit: 1 } }
+        }
+        */
+    ]
+});
+
+// cl-table
+const Table = useTable({
+    columns: [
+        { type: "selection" },
+        { label: t('鎵�灞炲崟浣�'), prop: "departmentName", minWidth: 120 },
+        {
+            label: t('浜ゆ槗鏃堕棿'),
+            prop: "transactionTime",
+            minWidth: 170,
+            sortable: "custom",
+            component: { name: "cl-date-text" }
+        },
+        { label: t('浜ゆ槗绫诲瀷'), prop: "transactionType", minWidth: 120 },
+        { label: t('浜ゆ槗瀵规柟'), prop: "opponent", minWidth: 140 },
+        { label: t('鍟嗗搧鍚嶇О'), prop: "goodsName", minWidth: 140 },
+        {
+            label: t('鏀舵敮绫诲瀷'),
+            prop: "incomeType",
+            minWidth: 120,
+            dict: options.incomeType
+        },
+        { label: t('閲戦'), prop: "amount", minWidth: 140, sortable: "custom" },
+        { label: t('鏀粯鏂瑰紡'), prop: "payMethod", minWidth: 120 },
+        /*{ label: t('褰撳墠鐘舵��'), prop: "status", minWidth: 120 },
+        { label: t('浜ゆ槗鍗曞彿'), prop: "transactionNo", minWidth: 140 },
+        { label: t('鍟嗘埛鍗曞彿'), prop: "merchantNo", minWidth: 140 },
+        { label: t('澶囨敞'), prop: "remark", showOverflowTooltip: true, minWidth: 200 },*/
+        { label: t('鏂囦欢璺緞'), prop: "filepath", minWidth: 140 },
+
+        {
+            label: t('鍒涘缓鏃堕棿'),
+            prop: "createTime",
+            minWidth: 170,
+            sortable: "desc",
+            component: { name: "cl-date-text" }
+        },
+        /*
+        {
+            label: t('鏇存柊鏃堕棿'),
+            prop: "updateTime",
+            minWidth: 170,
+            sortable: "custom",
+            component: { name: "cl-date-text" }
+        },
+        { type: "op", buttons: ["edit", "delete"] }
+        */
+    ]
+});
+
+// cl-search
+const Search = useSearch();
+
+// cl-crud
+const Crud = useCrud(
+    {
+        service: service.operation.traderecord
+    },
+    (app) => {
+        app.refresh();
+    }
+);
+
+// 鍒锋柊
+function refresh(params?: any) {
+    Crud.value?.refresh(params);
+}
+
+/**
+ * 1. 鎵╁睍瀵煎叆寮圭獥涓殑閰嶇疆椤癸紙娣诲姞閮ㄩ棬閫夋嫨鍣� + 鐩戝惉鏂囦欢閫夋嫨锛�
+ */
+function onConfig(Form: ClForm.Ref) {
+    return [
+        {
+            label: "閫夋嫨閮ㄩ棬",
+            prop: "departmentId",
+            component: {
+                name: "cl-dept-select",
+                props: {
+                    multiple: false,
+                    placeholder: "璇烽�夋嫨閮ㄩ棬",
+                    checkStrictly: true,
+                    immediate: true
+                }
+            },
+            required: true
+        }
+    ];
+}
+
+/**
+ * 瀹氫箟 Excel 涓枃琛ㄥご涓� Entity 瀛楁鍚嶇殑瀵瑰簲鍏崇郴瀛楀吀
+ */
+const fieldMap: Record<string, string> = {
+    浜ゆ槗鏃堕棿: "transactionTime",
+    浜ゆ槗绫诲瀷: "transactionType",
+    浜ゆ槗瀵规柟: "opponent",
+    鍟嗗搧: "goodsName",
+    "鏀�/鏀�": "incomeType",
+    "閲戦(鍏�)": "amount",
+    鏀粯鏂瑰紡: "payMethod",
+    褰撳墠鐘舵��: "status",
+    浜ゆ槗鍗曞彿: "transactionNo",
+    鍟嗘埛鍗曞彿: "merchantNo",
+    澶囨敞: "remark"
+};
+function cleanAmount(val: any): number {
+    if (val === null || val === undefined || val === '') return 0;
+
+    // 杞负瀛楃涓诧紝骞剁Щ闄ゆ墍鏈夐潪鏁板瓧銆侀潪灏忔暟鐐广�侀潪璐熷彿鐨勫瓧绗︼紙鍗崇Щ闄� 楼銆侊骏銆侀�楀彿銆佺┖鏍肩瓑锛�
+    const cleanStr = String(val).replace(/[^\d.-]/g, '');
+
+    const num = parseFloat(cleanStr);
+    return isNaN(num) ? 0 : num;
+}
+
+/**
+ * 2. 鎻愪氦鏁版嵁澶勭悊閫昏緫
+ * @param data  Excel瑙f瀽鍚庣殑琛屾暟鎹暟缁� (5鍒楁暟鎹�)
+ * @param extra 棰濆琛ㄥ崟鏁版嵁锛坉epartmentId 绛夛級
+ * @param helper 鐘舵�佹帶鍒舵柟娉�
+ */
+async function onSubmit(data: any, { done, close }: any) {
+    try {
+
+        if (!data.file) {
+            ElMessage.warning("鏈兘璇嗗埆鍒颁笂浼犵殑 Excel 鏂囦欢");
+            return done?.();
+        }
+
+        console.log(data.file);
+        console.log(data.file instanceof File);
+
+        const formData = new FormData();
+        formData.append("file", data.file); // 鏀惧叆鏂囦欢瀵硅薄
+        formData.append("key", "");        // 猸愶笍 浼犲叆 key锛岄槻姝㈠悗绔� ctx.fields 涓� undefined
+
+        // 2. 鍙戦�佷笂浼犺姹傦紙cool-admin 鐨� request 妯″潡锛�
+        // 娉ㄦ剰锛氶�氬父鍩虹涓婁紶鎺ュ彛鍦板潃鏄� /admin/base/comm/upload
+        const fileUrl = await service.base.comm.request({
+            url: "/upload",
+            method: "POST",
+            headers: {
+                "Content-Type": "multipart/form-data"
+            },
+            data: formData
+        });
+
+        // 绗簩姝ワ細灏� departmentId 鍜� file 缁勮鍒� Excel 瑙f瀽鐨勬瘡鏉℃暟鎹腑锛�5鍒� -> 7鍒楋級
+        const list = data.list.map((row) => {
+            const formattedItem: Record<string, any> = {
+                // 闄勫姞鐨勭 6 鍒楀拰绗� 7 鍒�
+                departmentId: data.departmentId,
+                filepath: fileUrl
+            };
+
+            // 閬嶅巻 Excel 瑙f瀽鍑烘潵鐨勫崟琛屾暟鎹� (渚嬪: { "濮撳悕": "寮犱笁", "骞撮緞": 25 })
+            Object.keys(row).forEach((excelHeader) => {
+                const cleanHeader = excelHeader
+                    .replace(/锛�/g, "(")
+                    .replace(/锛�/g, ")")
+                    .trim();
+                const englishKey = fieldMap[cleanHeader];
+                if (englishKey) {
+                    let value = row[excelHeader];
+                    // 猸愶笍 閽堝閲戦瀛楁锛坅mount锛夎繘琛屽己鍒舵竻娲楃被鍨嬭浆鎹�
+                    if (englishKey === "amount") {
+                        value = cleanAmount(value); // '楼300.00' 浼氬彉鎴愭暟瀛� 300
+                    }
+                    formattedItem[englishKey] = value;
+                }
+            });
+
+            return formattedItem;
+        });
+
+        // 绗笁姝ワ細鎻愪氦缁欏悗绔壒閲忎繚瀛樻帴鍙o紙璇锋浛鎹� service.yourModule.yourService 涓轰綘鐨勫疄闄� service锛�
+        await service.operation.traderecord.import({ list });
+
+        ElMessage.success("瀵煎叆鎴愬姛");
+
+        close();
+        refresh();
+
+    } catch (err: any) {
+        ElMessage.error(err?.message || "瀵煎叆澶辫触锛岃妫�鏌ユ枃浠舵垨缃戠粶");
+        done();
+    }
+}
+
+</script>
diff --git a/src/modules/report/locales/en.json b/src/modules/report/locales/en.json
index 01b1c13..5c22de2 100644
--- a/src/modules/report/locales/en.json
+++ b/src/modules/report/locales/en.json
@@ -41,5 +41,19 @@
 "FAILED":"FAILED",
 "鏁版嵁鐩爣鏃ユ湡":"鏁版嵁鐩爣鏃ユ湡",
 "鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触":"鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触",
-"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)"
+"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)",
+"杞︾墝鍙�":"杞︾墝鍙�",
+"褰撴棩琛岄┒閲岀▼":"褰撴棩琛岄┒閲岀▼(KM)",
+"鏈惎鍔ㄦ椂闂�":"鏈惎鍔ㄦ椂闂�(鍒�)",
+"琛岄┒鏃堕暱":"琛岄┒鏃堕棿(鍒�)",
+"鍋滆溅鏃堕暱":"鍋滆溅鏃堕棿(鍒�)",
+"寮傚父鎬犻�熸椂闀�":"寮傚父鎬犻�熸椂闂�(鍒�)",
+"骞冲潎琛岄┒杞﹂��":"骞冲潎琛岄┒杞﹂��",
+"瓒呴�熺疮璁℃椂闀�":"瓒呴�熺疮璁℃椂闀�(鍒�)",
+"鎬ュ埞杞︽鏁�":"鎬ュ埞杞︽鏁�",
+"鎬ュ姞閫熸鏁�":"鎬ュ姞閫熸鏁�",
+"鎬ヨ浆寮鏁�":"鎬ヨ浆寮鏁�",
+"闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�":"闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�",
+"鍒涘缓鏃堕棿":"鍒涘缓鏃堕棿"
+
 }
\ No newline at end of file
diff --git a/src/modules/report/locales/zh-cn.json b/src/modules/report/locales/zh-cn.json
index 01b1c13..5c22de2 100644
--- a/src/modules/report/locales/zh-cn.json
+++ b/src/modules/report/locales/zh-cn.json
@@ -41,5 +41,19 @@
 "FAILED":"FAILED",
 "鏁版嵁鐩爣鏃ユ湡":"鏁版嵁鐩爣鏃ユ湡",
 "鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触":"鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触",
-"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)"
+"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)",
+"杞︾墝鍙�":"杞︾墝鍙�",
+"褰撴棩琛岄┒閲岀▼":"褰撴棩琛岄┒閲岀▼(KM)",
+"鏈惎鍔ㄦ椂闂�":"鏈惎鍔ㄦ椂闂�(鍒�)",
+"琛岄┒鏃堕暱":"琛岄┒鏃堕棿(鍒�)",
+"鍋滆溅鏃堕暱":"鍋滆溅鏃堕棿(鍒�)",
+"寮傚父鎬犻�熸椂闀�":"寮傚父鎬犻�熸椂闂�(鍒�)",
+"骞冲潎琛岄┒杞﹂��":"骞冲潎琛岄┒杞﹂��",
+"瓒呴�熺疮璁℃椂闀�":"瓒呴�熺疮璁℃椂闀�(鍒�)",
+"鎬ュ埞杞︽鏁�":"鎬ュ埞杞︽鏁�",
+"鎬ュ姞閫熸鏁�":"鎬ュ姞閫熸鏁�",
+"鎬ヨ浆寮鏁�":"鎬ヨ浆寮鏁�",
+"闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�":"闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�",
+"鍒涘缓鏃堕棿":"鍒涘缓鏃堕棿"
+
 }
\ No newline at end of file
diff --git a/src/modules/report/locales/zh-tw.json b/src/modules/report/locales/zh-tw.json
index 01b1c13..5c22de2 100644
--- a/src/modules/report/locales/zh-tw.json
+++ b/src/modules/report/locales/zh-tw.json
@@ -41,5 +41,19 @@
 "FAILED":"FAILED",
 "鏁版嵁鐩爣鏃ユ湡":"鏁版嵁鐩爣鏃ユ湡",
 "鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触":"鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触",
-"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)"
+"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)",
+"杞︾墝鍙�":"杞︾墝鍙�",
+"褰撴棩琛岄┒閲岀▼":"褰撴棩琛岄┒閲岀▼(KM)",
+"鏈惎鍔ㄦ椂闂�":"鏈惎鍔ㄦ椂闂�(鍒�)",
+"琛岄┒鏃堕暱":"琛岄┒鏃堕棿(鍒�)",
+"鍋滆溅鏃堕暱":"鍋滆溅鏃堕棿(鍒�)",
+"寮傚父鎬犻�熸椂闀�":"寮傚父鎬犻�熸椂闂�(鍒�)",
+"骞冲潎琛岄┒杞﹂��":"骞冲潎琛岄┒杞﹂��",
+"瓒呴�熺疮璁℃椂闀�":"瓒呴�熺疮璁℃椂闀�(鍒�)",
+"鎬ュ埞杞︽鏁�":"鎬ュ埞杞︽鏁�",
+"鎬ュ姞閫熸鏁�":"鎬ュ姞閫熸鏁�",
+"鎬ヨ浆寮鏁�":"鎬ヨ浆寮鏁�",
+"闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�":"闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�",
+"鍒涘缓鏃堕棿":"鍒涘缓鏃堕棿"
+
 }
\ No newline at end of file
diff --git a/src/modules/report/views/dailyvehicle.vue b/src/modules/report/views/dailyvehicle.vue
new file mode 100644
index 0000000..063aefd
--- /dev/null
+++ b/src/modules/report/views/dailyvehicle.vue
@@ -0,0 +1,281 @@
+<template>
+	<cl-crud ref="Crud">
+		<cl-row>
+			<!-- 鍒锋柊鎸夐挳 -->
+			<cl-refresh-btn />
+			<!-- 鏂板鎸夐挳 -->
+			<!--cl-add-btn /-->
+			<!-- 鍒犻櫎鎸夐挳 -->
+			<!--cl-multi-delete-btn /-->
+			<cl-flex1 />
+			<!-- 鏉′欢鎼滅储 -->
+			<cl-search ref="Search" />
+		</cl-row>
+
+		<cl-row>
+			<!-- 鏁版嵁琛ㄦ牸 -->
+			<cl-table ref="Table" />
+		</cl-row>
+
+		<cl-row>
+			<cl-flex1 />
+			<!-- 鍒嗛〉鎺т欢 -->
+			<cl-pagination />
+		</cl-row>
+
+		<!-- 鏂板銆佺紪杈� -->
+		<cl-upsert ref="Upsert" />
+	</cl-crud>
+</template>
+
+<script lang="ts" setup>
+defineOptions({
+	name: "report-daily"
+});
+
+import { useCrud, useTable, useUpsert, useSearch } from "@cool-vue/crud";
+import { useCool } from "/@/cool";
+import { useI18n } from "vue-i18n";
+
+const { service } = useCool();
+const { t } = useI18n();
+
+// cl-upsert
+/*
+const Upsert = useUpsert({
+	items: [
+		{
+			label: t('鏃ユ湡'),
+			prop: "date",
+			component: {
+				name: "el-date-picker",
+				props: { type: "date", valueFormat: "YYYY-MM-DD" }
+			},
+			span: 12,
+			required: true
+		},
+		{
+			label: t('杞︾墝鍙�'),
+			prop: "vehicleNo",
+			component: { name: "el-input", props: { clearable: true } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('閫夋嫨閮ㄩ棬'),
+			prop: "departmentId",
+			component: { name: "el-input", props: { clearable: true } },
+			span: 12
+		},
+		{
+			label: t('褰撴棩琛岄┒閲岀▼'),
+			prop: "totalKm",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('鏈惎鍔ㄦ椂闂�'),
+			prop: "minutesOffline",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('绾椹舵椂闀�'),
+			prop: "minutesMoving",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('鍋滆溅鏃堕暱'),
+			prop: "minutesParked",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('閫夋嫨寮傚父鎬犻�熸椂闀�'),
+			prop: "minutesAbnormalIdle",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('骞冲潎琛岄┒杞﹂��'),
+			prop: "avgSpeed",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('瓒呴�熷憡璀︽鏁�'),
+			prop: "overspeedCount",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('瓒呴�熺疮璁℃椂闀�'),
+			prop: "overspeedDurationSec",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('鎬ュ埞杞︽鏁�'),
+			prop: "harshBrakeCount",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('鎬ュ姞閫熸鏁�'),
+			prop: "harshAccelCount",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('鎬ヨ浆寮鏁�'),
+			prop: "harshTurnCount",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		},
+		{
+			label: t('闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�'),
+			prop: "offHoursMoveCount",
+			hook: "number",
+			component: { name: "el-input-number", props: { min: 0 } },
+			span: 12,
+			required: true
+		}
+	]
+});
+*/
+// cl-table
+const Table = useTable({
+	columns: [
+		{ type: "selection" },
+		{
+			label: t('鏃ユ湡'),
+			prop: "date",
+			minWidth: 140,
+			sortable: "custom",
+			component: { name: "cl-date-text", props: { format: "YYYY-MM-DD" } }
+		},
+		{ label: t('杞︾墝鍙�'), prop: "vehicleNo", minWidth: 140 },
+		{ label: t('鎵�灞為儴闂�'), prop: "departmentName", minWidth: 120 },
+		{ label: t('褰撴棩琛岄┒閲岀▼'), prop: "totalKm", minWidth: 140, sortable: "custom" },
+		{
+			label: t('鏈惎鍔ㄦ椂闂�'),
+			prop: "minutesOffline",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('琛岄┒鏃堕暱'),
+			prop: "minutesMoving",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('鍋滆溅鏃堕暱'),
+			prop: "minutesParked",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('寮傚父鎬犻�熸椂闀�'),
+			prop: "minutesAbnormalIdle",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{ label: t('骞冲潎琛岄┒杞﹂��'), prop: "avgSpeed", minWidth: 140, sortable: "custom" },
+		{
+			label: t('瓒呴�熷憡璀︽鏁�'),
+			prop: "overspeedCount",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('瓒呴�熺疮璁℃椂闀�'),
+			prop: "overspeedDurationSec",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('鎬ュ埞杞︽鏁�'),
+			prop: "harshBrakeCount",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('鎬ュ姞閫熸鏁�'),
+			prop: "harshAccelCount",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('鎬ヨ浆寮鏁�'),
+			prop: "harshTurnCount",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('闈炲伐浣滄椂娈靛紓鍔ㄥ憡璀︽鏁�'),
+			prop: "offHoursMoveCount",
+			minWidth: 140,
+			sortable: "custom"
+		},
+		{
+			label: t('鍒涘缓鏃堕棿'),
+			prop: "createTime",
+			minWidth: 170,
+			sortable: "desc",
+			component: { name: "cl-date-text" }
+		},
+		/*
+		{
+			label: t('鏇存柊鏃堕棿'),
+			prop: "updateTime",
+			minWidth: 170,
+			sortable: "custom",
+			component: { name: "cl-date-text" }
+		},
+		{ type: "op", buttons: ["edit", "delete"] }
+		 */
+	]
+});
+
+// cl-search
+const Search = useSearch();
+
+// cl-crud
+const Crud = useCrud(
+	{
+		service: service.report.dailyvehicle
+	},
+	(app) => {
+		app.refresh();
+	}
+);
+
+// 鍒锋柊
+function refresh(params?: any) {
+	Crud.value?.refresh(params);
+}
+</script>
diff --git a/src/plugins/excel/components/import-btn.vue b/src/plugins/excel/components/import-btn.vue
index 99d0bae..8216ecf 100644
--- a/src/plugins/excel/components/import-btn.vue
+++ b/src/plugins/excel/components/import-btn.vue
@@ -14,15 +14,8 @@
 				</div>
 
 				<div class="inner">
-					<cl-upload
-						drag
-						:limit-size="limitSize"
-						:accept="accept"
-						:disabled="disabled"
-						:auto-upload="false"
-						:before-upload="onUpload"
-						:size="[220, '100%']"
-					/>
+					<cl-upload drag :limit-size="limitSize" :accept="accept" :disabled="disabled" :auto-upload="false"
+						:before-upload="onUpload" :size="[220, '100%']" />
 				</div>
 			</div>
 		</template>
@@ -31,78 +24,37 @@
 			<div v-if="list.length" class="data-table">
 				<div class="head">
 					<el-button type="success" @click="clear">{{ $t('閲嶆柊涓婁紶') }}</el-button>
-					<el-button
-						type="danger"
-						:disabled="table.selection.length == 0"
-						@click="table.del()"
-					>
+					<el-button type="danger" :disabled="table.selection.length == 0" @click="table.del()">
 						{{ $t('鎵归噺鍒犻櫎') }}
 					</el-button>
 				</div>
 
 				<div class="cl-table">
-					<el-table
-						border
-						:data="list"
-						max-height="600px"
-						@selection-change="table.onSelectionChange"
+					<el-table border :data="list" max-height="600px" @selection-change="table.onSelectionChange"
 						@row-click="
 							row => {
 								row._edit = true;
 							}
-						"
-					>
-						<el-table-column
-							type="selection"
-							width="60px"
-							align="center"
-							fixed="left"
-						/>
+						">
+						<el-table-column type="selection" width="60px" align="center" fixed="left" />
 
-						<el-table-column
-							:label="$t('搴忓彿')"
-							type="index"
-							width="80px"
-							align="center"
-							fixed="left"
-							:index="table.onIndex"
-						/>
+						<el-table-column :label="$t('搴忓彿')" type="index" width="80px" align="center" fixed="left"
+							:index="table.onIndex" />
 
-						<el-table-column
-							v-for="item in table.header"
-							:key="item"
-							:prop="item"
-							:label="item"
-							min-width="160px"
-							align="center"
-						>
+						<el-table-column v-for="item in table.header" :key="item" :prop="item" :label="item"
+							min-width="160px" align="center">
 							<template #default="scope">
 								<span v-if="!scope.row._edit">{{ scope.row[item] }}</span>
 
 								<template v-else>
-									<el-input
-										v-model="scope.row[item]"
-										type="textarea"
-										clearable
-										:placeholder="item"
-									/>
+									<el-input v-model="scope.row[item]" type="textarea" clearable :placeholder="item" />
 								</template>
 							</template>
 						</el-table-column>
 
-						<el-table-column
-							:label="$t('鎿嶄綔')"
-							width="100px"
-							align="center"
-							fixed="right"
-						>
+						<el-table-column :label="$t('鎿嶄綔')" width="100px" align="center" fixed="right">
 							<template #default="scope">
-								<el-button
-									text
-									bg
-									type="danger"
-									@click.stop="table.del(scope.$index)"
-								>
+								<el-button text bg type="danger" @click.stop="table.del(scope.$index)">
 									{{ $t('鍒犻櫎') }}
 								</el-button>
 							</template>
@@ -111,14 +63,9 @@
 				</div>
 
 				<div class="pagination">
-					<el-pagination
-						v-model:current-page="pagination.page"
-						background
-						layout="total, prev, pager, next"
-						:total="upload.list.length"
-						:page-size="pagination.size"
-						@current-change="pagination.onCurrentChange"
-					/>
+					<el-pagination v-model:current-page="pagination.page" background layout="total, prev, pager, next"
+						:total="upload.list.length" :page-size="pagination.size"
+						@current-change="pagination.onCurrentChange" />
 				</div>
 			</div>
 		</template>
@@ -276,8 +223,8 @@
 
 				if (props.onSubmit) {
 					props.onSubmit({
-						...upload,
-						..._
+						..._,
+						...upload
 					}, { done, close });
 				} else {
 					ElMessage.error(t('[cl-import-btn] onSubmit is required'));
@@ -378,6 +325,7 @@
 		width: 100%;
 
 		:deep(.cl-upload) {
+
 			.cl-upload__footer,
 			.cl-upload__list,
 			.el-upload,
@@ -394,7 +342,7 @@
 	align-items: center;
 	margin-bottom: 20px;
 
-	& > span {
+	&>span {
 		color: var(--el-color-warning);
 	}
 }
diff --git a/src/plugins/upload/components/upload-item/viewer.vue b/src/plugins/upload/components/upload-item/viewer.vue
index 1e1f0dc..05ab1d3 100644
--- a/src/plugins/upload/components/upload-item/viewer.vue
+++ b/src/plugins/upload/components/upload-item/viewer.vue
@@ -1,23 +1,11 @@
 <template>
 	<div class="viewer-image">
 		<!-- 鍥剧墖 -->
-		<el-image-viewer
-			v-if="img.visible"
-			:url-list="[img.url]"
-			infinite
-			teleported
-			@close="close"
-		/>
+		<el-image-viewer v-if="img.visible" :url-list="[img.url]" infinite teleported @close="close" />
 	</div>
 
 	<!-- 鏂囨。 -->
-	<cl-dialog
-		v-model="doc.visible"
-		:title="$t('鏂囨。棰勮')"
-		height="70vh"
-		width="80%"
-		:scrollbar="false"
-	>
+	<cl-dialog v-model="doc.visible" :title="$t('鏂囨。棰勮')" height="70vh" width="80%" :scrollbar="false">
 		<div v-loading="doc.loading" class="viewer-doc">
 			<iframe :ref="setRefs('docIframe')" :src="doc.url" />
 		</div>
@@ -65,11 +53,26 @@
 			return true;
 		}
 
-		// 鏂囨。棰勮
-		if (['word', 'excel', 'ppt', 'pdf'].includes(type)) {
+		if (type === 'pdf') {
 			doc.visible = true;
 			doc.loading = true;
-			doc.url = `https://view.officeapps.live.com/op/view.aspx?src=${decodeURIComponent(url)}`;
+			// pdf.js viewer 璺緞锛堟斁鍦� public/pdfjs/锛�
+			doc.url = `/pdfjs/web/viewer.html?file=${encodeURIComponent(url)}`;
+
+			nextTick(() => {
+				refs.docIframe.onload = () => {
+					doc.loading = false;
+				};
+			});
+
+			return true;
+		}
+
+		// 鏂囨。棰勮
+		if (['word', 'excel', 'ppt'].includes(type)) {
+			doc.visible = true;
+			doc.loading = true;
+			doc.url = `https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(url)}`;
 
 			nextTick(() => {
 				refs.docIframe.onload = () => {

--
Gitblit v1.9.1